ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2xkIENoYW5nZWxvZwoKQ2hhbmdlcyBkb25lIHRvIGN1cmwgYW5kIGxpYmN1cmwgZnJvbSAxOTk3IHRvIDIwMTAsIGVkaXRlZCBtYW51YWxseS4gVGhlIG1vc3QKcmVjZW50IGNoYW5nZXMgYXJlIGFsd2F5cyBnZW5lcmF0ZWQgaW50byB0aGUgQ0hBTkdFUyBmaWxlIHN0cmFpZ2h0IGZyb20gZ2l0LgoKS2FtaWwgRHVka2EgKDE3IEp1bmUgMjAxMCkKLSBJbXByb3ZlIHRlc3Q1NzUgaW4gb3JkZXIgdG8gbm90IGZhaWwgd2l0aCB0aHJlYWRlZCBETlMgcmVzb2x2ZXIuCgpWZXJzaW9uIDcuMjEuMCAoMTYgSnVuZSAyMDEwKQoKRGFuaWVsIFN0ZW5iZXJnICg1IEp1bmUgMjAxMCkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBmaXhlZCBhIGNhc2Ugb2Ygc3B1cmlvdXMgU1NMIGNvbm5lY3Rpb24gYWJvcnRzIHVzaW5nCiAgbGliY3VybCBhbmQgT3BlblNTTC4gIkkgdHJhY2tlZCBpdCBkb3duIHRvIHVuY2xlYXJlZCBlcnJvciBzdGF0ZSBvbiB0aGUKICBPcGVuU1NMIGVycm9yIHN0YWNrIC0gcGF0Y2ggYXR0YWNoZWQgZGVhbHMgd2l0aCB0aGF0LiIKCkRhbmllbCBTdGVuYmVyZyAoNSBKdW5lIDIwMTApCi0gRnJhbmsgTWVpZXIgYWRkZWQgQ1VSTElORk9fUFJJTUFSWV9QT1JULCBDVVJMSU5GT19MT0NBTF9JUCBhbmQKICBDVVJMSU5GT19MT0NBTF9QT1JUIHRvIGN1cmxfZWFzeV9nZXRpbmZvKCkuCgpZYW5nIFRzZSAoNCBKdW5lIDIwMTApCi0gRW5hYmxlZCBPcGVuTERBUCBzdXBwb3J0IGZvciBjeWd3aW4gYnVpbGRzLiBUaGlzIHN1cHBvcnQgd2FzIGRpc2FibGVkIGJhY2sKICBpbiAyMDA4IGR1ZSB0byBpbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIE9wZW5TU0wgYW5kIE9wZW5MREFQIGhlYWRlcnMuCiAgY3lnd2luJ3MgT3BlblNTTCAwLjkuOGwgYW5kIE9wZW5MREFQIDIuMy40MyB2ZXJzaW9ucyBvbiBjeWd3aW4gMS41LjI1CiAgYWxsb3cgYnVpbGRpbmcgYW4gT3BlbkxEQVAgZW5hYmxlZCBsaWJjdXJsIHN1cHBvcnRpbmcgYmFjayB0byBXaW5kb3dzIDk1LgoKICBSZW1vdmVkIHRoZSBub24tZnVuY3Rpb25hbCBDVVJMX0xEQVBfSFlCUklEIGNvZGUgYW5kIHJlZmVyZW5jZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDIgSnVuZSAyMDEwKQotIEphc29uIE1jRG9uYWxkIHBvc3RlZCBidWcgcmVwb3J0ICMzMDA2Nzg2IHdoZW4gaGUgZm91bmQgdGhhdCB0aGUgU0ZUUCBjb2RlCiAgZGlkbid0IHRpbWVvdXQgcHJvcGVybHkgaW4gc2V2ZXJhbCBwbGFjZXMgaW4gdGhlIGNvZGUgZXZlbiBpZiBhIHRpbWVvdXQgd2FzCiAgc2V0IHByb3Blcmx5LgoKICBCYXNlZCBvbiBoaXMgc3VnZ2VzdGVkIHBhdGNoLCBJIHdyb3RlIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIHRoYXQgSQogIHRoaW5rIGFkZHJlc3NlZCB0aGUgaXNzdWUgYmV0dGVyIGFuZCBhbHNvIHVzZXMgdGhlIGNvbm5lY3QgdGltZW91dCBmb3IgdGhlCiAgaW5pdGlhbCBwYXJ0IG9mIHRoZSBTU0gvU0ZUUCBkb25lIGR1cmluZyB0aGUgInByb3RvY29sIGNvbm5lY3QiIHBoYXNlLgoKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTMwMDY3ODYpCgpZYW5nIFRzZSAoMiBKdW5lIDIwMTApCi0gQWRkZWQgbWlzc2luZyBuZXcgbGliY3VybCBmaWxlcyB0byBub24tY29uZmlndXJlIHRhcmdldHMuIEFkanVzdGVkCiAgbGliY3VybCBzdGFuZGFyZCBpbnRlcm5hbCBoZWFkZXIgaW5jbHVzaW9ucyBpbiBuZXcgZmlsZXMuIEZpeGVkIGFuCiAgU1BORUdPIHJlbGF0ZWQgbWVtb3J5IGxlYWsuIEZpeGVkIHNldmVyYWwgTERBUCByZWxhdGVkIGNvbXBpbGF0aW9uCiAgaXNzdWVzLCBhbmQgZml4ZWQgc29tZSBjb21waWxlciB3YXJuaW5ncy4KCkRhbmllbCBTdGVuYmVyZyAoMSBKdW5lIDIwMTApCi0gSWdvciBOb3Zvc2VsdHNldiByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCB0aGUgbXVsdGkgc29ja2V0IEFQSSBhbmQgdXNpbmcKICB0aW1lb3V0cyBhbmQgdGltZXJzLiBJdCBib2lsZWQgZG93biB0byBhIHByb2JsZW0gd2l0aCBsaWJjdXJsJ3MgdXNlIG9mCiAgR2V0VGlja0NvdW50KCkgaW50ZXJhbGx5IHRvIGZpZ3VyZSBvdXQgdGhlIGN1cnJlbnQgdGltZSwgd2hpbGUgSWdvcidzIG93bgogIGFwcGxpY2F0aW9uIGNvZGUgdXNlZCBhbm90aGVyIGZ1bmN0aW9uIGNhbGwuCgogIEl0IG1hZGUgaGlzIGFwcCBjYWxsIHRoZSBzb2NrZXQgQVBJIHRpbWVvdXQgZnVuY3Rpb24gYSBiaXQgX2JlZm9yZV8gbGliY3VybAogIHdvdWxkIGNvbnNpZGVyIHRoZSB0aW1lb3V0IHRvIHRyaWdnZXIsIGFuZCB0aGF0IGNvdWxkIGVhc2lseSBsZWFkIHRvCiAgdGltZW91dHMgb3Igc3RhbGxzIGluIHRoZSBhcHAuIEl0IHNlZW1zIEdldFRpY2tDb3VudCgpIGluIGdlbmVyYWwgb2Z0ZW4gaGFzCiAgbm8gYmV0dGVyIHJlc29sdXRpb24gdGhhbiAxNm1zIGFuZCBzd2l0Y2hpbmcgdG8gdGhlIGFsdGVybmF0aXZlIGZ1bmN0aW9uCiAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIgaGFzIGl0cyBzaGFyZSBvZiBwcm9ibGVtczoKICAgICAgaHR0cDovL3d3dy52aXJ0dWFsZHViLm9yZy9ibG9nL3Bpdm90L2VudHJ5LnBocD9pZD0xMDYKCiAgV2UgYWRkcmVzcyB0aGlzIHByb2JsZW0gYnkgc2ltcGx5IGhhdmluZyBsaWJjdXJsIHRyZWF0IHRpbWVycyB0aGF0IGFscmVhZHkKICBoYXMgb2NjdXJlZCBvciB3aWxsIG9jY3VyIHdpdGhpbiA0MG1zIHN1YmplY3QgZm9yIHRyZWF0bWVudC4gSSdtIGNvbmZpZGVudAogIHRoYXQgdGhlcmUgYXJlIG90aGVyIGltcGxlbWVudGF0aW9ucyBhbmQgb3BlcmF0aW5nIHN5c3RlbXMgd2l0aCBzaW1pbGFybHkgaW4KICBhY2N1cmF0ZSB0aW1lciBmdW5jdGlvbnMgc28gaXQgbWFrZXMgc2Vuc2UgdG8gaGF2ZSBhcHBsaWVkIGdlbmVyaWNhbGx5IGFuZCBJCiAgZG9uJ3QgYmVsaWV2ZSB3ZSBzYWNyaWZpY2UgbXVjaCBieSBhZGRpbmcgYSA0MG1zIGluYWNjdXJhY3kgb24gdGhlc2UKICB0aW1lb3V0cy4KCkthbWlsIER1ZGthICgyNyBNYXkgMjAxMCkKLSBhZGRlZCBhIG5ldyB0ZXN0IGZvciBDUkwgc3VwcG9ydCAodGVzdDMxMykKCi0gVG9yIEFybnRzZW4gY2hhbmdlZCB0aGUgYWx0ZXJuYXRpdmUgZGVmaW5pdGlvbiBvZiBib29sIHRvIHVzZSBlbnVtIGluc3RlYWQKICBvZiB1bnNpZ25lZCBjaGFyLgoKRGFuaWVsIFN0ZW5iZXJnICgyNSBNYXkgMjAxMCkKLSBKdWxpZW4gQ2hhZmZyYWl4IGZpeGVkIHRoZSB3YXJuaW5nIHNlZW4gd2hlbiBjb21waWxpbmcgbGliL3J0bXAuYzogb25lCiAgdW51c2VkIHZhcmlhYmxlcywgc2V2ZXJhbCB1bnVzZWQgYXJndW1lbnRzIGFuZCBzb21lIG1pc3NpbmcgI2luY2x1ZGUuCgotIEp1bGllbiBDaGFmZnJhaXggZml4ZWQgMiBPT00gZXJyb3JzOiBhIG1pc3NpbmcgTlVMTC1jaGVjayBpbgogIGxpYi9odHRwX25lZ29jaWF0ZS5jIGFuZCBhIHBvdGVudGlhbCBOVUxMIGRlcmVmZXJlbmNpbmcgaW4gbGliL3NwbGF5LmMKCi0gSG93YXJkIENodSBicm91Z2h0IGEgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgTERBUCBjb2RlIG11Y2ggY2xlYW5lciwgbmljZXIgYW5kCiAgaW4gZ2VuZXJhbCBiZWluZyBhIGJldHRlciBsaWJjdXJsIGNpdGl6ZW4uIElmIGEgbmV3IGVub3VnaCBPcGVuTERBUCB2ZXJzaW9uCiAgaXMgZGV0ZWN0LCB0aGUgbmV3IGFuZCBzaGlueSBsaWIvb3BlbmxkYXAuYyBjb2RlIGlzIHRoZW4gdXNlZCBpbnN0ZWFkIG9mIHRoZQogIG9sZCBjcnVmdC4KCkRhbmllbCBTdGVuYmVyZyAoMjEgTWF5IDIwMTApCi0gRXJpYyBNZXJ0ZW5zIHBvc3RlZCBidWcgIzMwMDM3MDU6IHdoZW4gd2UgbWFkZSBURlRQIHVzZSB0aGUgY29ycmVjdCB0aW1lb3V0CiAgb3B0aW9uIHdoZW4gc2VudCB0byB0aGUgc2VydmVyIChmaXhlZCBNYXkgMTh0aCAyMDEwKSBpdCBiZWNhbWUgb2J2aW91cyB0aGF0CiAgbGliY3VybCB1c2VkIGludmFsaWQgdGltZW91dCB2YWx1ZXMgKDMwMCBieSBkZWZhdWx0IHdoaWxlIHRoZSBSRkMgYWxsb3dzCiAgbm90aGluZyBhYm92ZSAyNTUpLiBXaGlsZSBvZiBjb3Vyc2UgaXQgaXMgb2J2aW91cyB0aGF0IGFzIFRGVFAgaGFzIHdvcmtlZAogIHRodXMgZmFyIHdpdGhvdXQgYmVpbmcgYWJsZSB0byBzZXQgdGltZW91dCBhdCBhbGwsIGp1c3QgcmVtb3ZpbmcgdGhlIHNldHRpbmcKICB3b3VsZG4ndCBtYWtlIGFueSBkaWZmZXJlbmNlIGluIGJlaGF2aW9yLiBJIGRlY2lkZWQgdG8gc3RpbGwga2VlcCBpdCAoYnV0CiAgZml4IHRoZSBwcm9ibGVtKSBhcyBpdCBub3cgYWN0dWFsbHkgYWxsb3dzIGZvciBlYXNpZXIgKGZ1dHVyZSkgY3VzdG9taXphdGlvbgogIG9mIHRoZSB0aW1lb3V0LgoKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTMwMDM3MDUpCgotIERvdWdsYXMgS2lscGF0cmljayBmaWxlZCBidWcgcmVwb3J0ICMzMDA0Nzg3IGFuZCBwb2ludGVkIG91dCB0aGF0IHRoZSBURlRQCiAgY29kZSBkaWRuJ3QgaGFuZGxlIGJsb2NrIGlkIHdyYXBzIGNvcnJlY3RseS4gSGlzIHN1Z2dlc3RlZCBmaXggaW5zcGlyZWQgdGhlCiAgZml4IEkgY29tbWl0dGVkLgoKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTMwMDQ3ODcpCgpEYW5pZWwgU3RlbmJlcmcgKDIwIE1heSAyMDEwKQotIFRhbmd1eSBGYXV0cmUgYnJvdWdodCBhIGZpeCB0byBhbGxvdyBjdXJsIHRvIGJ1aWxkIHdpdGggTWljcm9zb2Z0IFZDMTAuCgpEYW5pZWwgU3RlbmJlcmcgKDE4IE1heSAyMDEwKQotIEVyaWMgTWVydGVucyBwb3N0ZWQgYnVnIHJlcG9ydCAjMzAwMzAwNSBwb2ludGluZyBvdXQgdGhhdCB0aGUgbGliY3VybCBURlRQCiAgY29kZSB3YXMgbm90IHNlbmRpbmcgdGhlIHRpbWVvdXQgb3B0aW9uIHByb3Blcmx5IHRvIHRoZSBzZXJ2ZXIsIGFuZAogIHN1Z2dlc3RlZCBhIGZpeC4KCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0zMDAzMDA1KQoKS2FtaWwgRHVka2EgKDE2IE1heSAyMDEwKQotIFBhdmVsIFJhaXNrdXAgaW50cm9kdWNlZCBhIG5ldyBvcHRpb24gQ1VSTE9QVF9GTk1BVENIX0RBVEEgaW4gb3JkZXIgdG8gcGFzcwogIGEgY3VzdG9tIGRhdGEgcG9pbnRlciB0byB0aGUgY2FsbGJhY2sgc3BlY2lmaWVkIGJ5IENVUkxPUFRfRk5NQVRDSF9GVU5DVElPTi4KCkRhbmllbCBTdGVuYmVyZyAoMTQgTWF5IDIwMTApCi0gSm9obi1NYXJrIEJlbGwgZmlsZWQgYnVnICMzMDAwMDUyIHRoYXQgaWRlbnRpZmllZCBhIHByb2JsZW0gKHdpdGggYW4KICBhc3NvY2lhdGVkIHBhdGNoKSB3aXRoIHRoZSBPcGVuU1NMIGhhbmRzaGFrZSBzdGF0ZSBtYWNoaW5lIHdoZW4gdGhlIG11bHRpCiAgaW50ZXJmYWNlIGlzIHVzZWQ6CgogIFBlcmZvcm1pbmcgYW4gaHR0cHMgcmVxdWVzdCB1c2luZyBhIGN1cmwgbXVsdGkgaGFuZGxlIGFuZCB1c2luZyBzZWxlY3Qgb3IKICBlcG9sbCB0byB3YWl0IGZvciBldmVudHMgcmVzdWx0cyBpbiBhIGhhbmcuIEl0IGFwcGVhcnMgdGhhdCB0aGUgY2F1c2UgaXMgdGhlCiAgZml4IGZvciBidWcgIzI5NTgxNzksIHdoaWNoIG1ha2VzIG9zc2xfY29ubmVjdF9jb21tb24gdW5jb25kaXRpb25hbGx5IHJldHVybgogIGZyb20gdGhlIHN0ZXAgMiBsb29wIHdoZW4gZmV0Y2hpbmcgZnJvbSBhIG11bHRpIGhhbmRsZS4KCiAgV2hlbiBvc3NsX2Nvbm5lY3Rfc3RlcDIgaGFzIGNvbXBsZXRlZCwgaXQgdXBkYXRlcyBjb25uc3NsLT5jb25uZWN0aW5nX3N0YXRlCiAgdG8gc3NsX2Nvbm5lY3RfMy4gb3NzbF9jb25uZWN0X2NvbW1vbiB3aWxsIHRoZW4gcmV0dXJuIHRvIHRoZSBjYWxsZXIsIGFzIGEKICBtdWx0aSBoYW5kbGUgaXMgaW4gdXNlLiBFdmVudHVhbGx5LCB0aGUgY2xpZW50IGNvZGUgd2lsbCBjYWxsCiAgY3VybF9tdWx0aV9mZHNldCB0byBvYnRhaW4gYW4gdXBkYXRlZCBmZHNldCB0byBzZWxlY3Qgb3IgZXBvbGwgb24uIEZvciBodHRwcwogIHJlcXVlc3RzLCBjdXJsX211bHRpX2Zkc2V0IHdpbGwgY2F1c2UgaHR0cHNfZ2V0c29jayB0byBiZSBjYWxsZWQuCiAgaHR0cHNfZ2V0c29jayB3aWxsIG9ubHkgcmV0dXJuIGEgc29ja2V0IGhhbmRsZSBpZiB0aGUgY29ubmVjdGluZ19zdGF0ZSBpcwogIHNzbF9jb25uZWN0XzJfcmVhZGluZyBvciBzc2xfY29ubmVjdF8yX3dyaXRpbmcuICBUaGVyZWZvcmUsIHRoZSBjbGllbnQgd2lsbAogIG5ldmVyIG9idGFpbiBhIHZhbGlkIGZkc2V0LCBhbmQgdGh1cyBub3QgZHJpdmUgdGhlIG11bHRpIGhhbmRsZSwgcmVzdWx0aW5nCiAgaW4gYSBoYW5nLgoKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTMwMDAwNTIpCgotIFNlYmFzdGlhbiBWIHJlcG9ydGVkIGJ1ZyAjMzAwMDA1NiBpZGVudGlmeWluZyBhIHByb2JsZW0gd2l0aCByZWRpcmVjdAogIGZvbGxvd2luZy4gSXQgc2hvd2VkIHRoYXQgd2hlbiBjdXJsIGZvbGxvd2VkIHJlZGlyZWN0cyBpdCBkaWRuJ3QgcHJvcGVybHkKICBpZ25vcmUgdGhlIHJlc3BvbnNlIGJvZHkgb2YgdGhlIDMwWCByZXNwb25zZSBpZiB0aGF0IHJlc3BvbnNlIHdhcyB1c2luZwogIGNvbXByZXNzZWQgQ29udGVudC1FbmNvZGluZyEKCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0zMDAwMDU2KQoKRGFuaWVsIFN0ZW5iZXJnICgxMiBNYXkgMjAxMCkKLSBIb3dhcmQgQ2h1IGJyb3VnaHQgc3VwcG9ydCBmb3IgUlRNUC4gVGhpcyBpcyBwb3dlcmVkIGJ5IHRoZSB1bmRlcmx5aW5nCiAgbGlicnRtcCBsaWJyYXJ5LiBJdCBzdXBwb3J0cyBhIHJhbmdlIG9mIHZhcmlhdGlvbnMgYW5kICJzdWItcHJvdG9jb2xzIgogIHdpdGhpbiB0aGUgUlRNUCBmYW1pbHkuCgotIFBhdmVsIFJhaXNrdXAgYnJvdWdodCBzdXBwb3J0IGZvciBGVFAgZGlyZWN0b3J5IHdpbGRjYXJkIG1hdGNoaW5nIHRvIGFsbG93CiAgc2VsZWN0aXZlIGRvd25sb2FkaW5nLiBUbyBwcm92aWRlIHRoYXQsIGEgc2V0IG9mIG5ldyBvcHRpb25zIHdlcmUgYWRkZWQ6CgogICBDVVJMT1BUX1dJTERDQVJETUFUQ0gKICAgQ1VSTE9QVF9DSFVOS19CR05fRlVOQ1RJT04KICAgQ1VSTE9QVF9DSFVOS19FTkRfRlVOQ1RJT04KICAgQ1VSTE9QVF9DSFVOS19EQVRBCiAgIENVUkxPUFRfRk5NQVRDSF9GVU5DVElPTgoKICBUaGVyZSB3ZXJlIGFsc28gYSBzZXQgb2YgbmV3IHRlc3RzIGFkZGVkICg1NzQgLSA1NzcpIHRvIHZlcmlmeSB0aGlzLgoKS2FtaWwgRHVka2EgKDExIE1heSAyMDEwKQotIENSTCBzdXBwb3J0IGluIGxpYmN1cmwtTlNTIGhhcyBiZWVuIGNvbXBsZXRlbHkgYnJva2VuLiBOb3cgaXQgd29ya3MuIE9yaWdpbmFsCiAgYnVnIHJlcG9ydDogaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tLzU4MTkyNgoKRGFuaWVsIFN0ZW5iZXJnICg3IE1heSAyMDEwKQotIERpcmsgTWFuc2tlIHJlcG9ydGVkIGEgcmVncmVzc2lvbi4gV2hlbiBjb25uZWN0aW5nIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSwKICB0aGVyZSB3ZXJlIHNpdHVhdGlvbnMgd2hlcmUgbGliY3VybCB3b3VsZG4ndCBzdG9yZSBjb25uZWN0IHRpbWUgY29ycmVjdGx5IGFzCiAgaXQgdXNlZCB0byAoYW5kIGlzIGRvY3VtZW50ZWQgdG8pIGRvLgoKICBVc2luZyBoaXMgZmluZSBzYW1wbGUgcHJvZ3JhbSB3ZSBjb3VsZCByZXBlYXQgaXQsIGFuZCBJIHdyb3RlIHVwIHRlc3QgY2FzZQogIDU3MyB1c2luZyB0aGF0IGNvZGUuIFRoZSBwcm9ibGVtIGRvZXMgbm90IGVhc2lseSBzaG93IGl0c2VsZiB1c2luZyB0aGUgbG9jYWwKICB0ZXN0IHN1aXRlIHRob3VnaC4KCiAgVGhlIGZpeCwgYWxzbyBhcyBzdWdnZXN0ZWQgYnkgRGlyaywgaXMgYSBiaXQgb24gdGhlIHVnbHkgc2lkZSBhcyBpdCBhZGRzIHlldAogIGFub3RoZXIgY2FsbCB0byBDdXJsX3ZlcmJvc2Vjb25uZWN0KCkgYW5kIHNldHRpbmcgdGhlIFRJTUVSX0NPTk5FQ1QgdGltZS4KICBUaGF0IHNpdHVhdGlvbiBpcyBzdWJqZWN0IGZvciBzb21lIGNsb3NlciBpbnNwZWN0aW9uIGluIHRoZSBmdXR1cmUuCgotIEhvd2FyZCBDaHUgc3BsaXQgdGhlIEkvTyBoYW5kbGluZyBmdW5jdGlvbnMgaW50byBwcml2YXRlIGhhbmRsZXJzLgoKICBIb3dhcmQgQ2h1IGJyb3VnaHQgdGhlIGJ1bGsgd29yayBvZiB0aGlzIHBhdGNoIHRoYXQgcHJvcGVybHkgbW92ZXMgb3V0IHRoZQogIHNlbmRpbmcgYW5kIHJlY3Zpbmcgb2YgZGF0YSB0byB0aGUgcGFydHMgb2YgdGhlIGNvZGUgdGhhdCBhcmUgcHJvcGVybHkKICByZXNwb25zaWJsZSBmb3IgdGhlIHZhcmlvdXMgd2F5cyBvZiBkb2luZyBzby4KCiAgRGFuaWVsIFN0ZW5iZXJnIGFzc2lzdGVkIHdpdGggcG9saXNoaW5nIGEgZmV3IGJpdHMgYW5kIGZpeGVkIHNvbWUgbWlub3IKICBmbGF3cyBpbiB0aGUgb3JpZ2luYWwgcGF0Y2guCgogIEFub3RoZXIgdXBzaWRlIG9mIHRoaXMgcGF0Y2ggaXMgdGhhdCB3ZSBub3cgYWJ1c2UgQ1VSTGNvZGVzIGxlc3Mgd2l0aCB0aGUKICAibWFnaWMiIC0xIHJldHVybiBjb2RlcyBhbmQgaW5zdGVhZCB1c2UgQ1VSTEVfQUdBSU4gbW9yZSBjb25zaXN0ZW50bHkuCgpEYW5pZWwgU3RlbmJlcmcgKDUgTWF5IDIwMTApCi0gSG9pLUhvIENoYW4gaW50cm9kdWNlZCBzdXBwb3J0IGZvciB1c2luZyB0aGUgUG9sYXJTU0wgbGlicmFyeS4gWW91IGNvbnRyb2wKICB0aGlzIHdpdGggdGhlIG5ldyBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1wb2xhcnNzbC4KCkRhbmllbCBTdGVuYmVyZyAoMjkgQXByIDIwMTApCi0gQmVuIEdyZWVhciBtYWRlIHRlbG5ldCBhIGxvdCBiZXR0ZXIvZWFzaWVyIHRvIHVzZSBieSBhbiBhcHBsaWNhdGlvbjoKCiAgVGhlIG1haW4gY2hhbmdlIGlzIHRvIGFsbG93IGlucHV0IGZyb20gdXNlci1zcGVjaWZpZWQgbWV0aG9kcywgd2hlbiB0aGV5IGFyZQogIHNwZWNpZmllZCB3aXRoIENVUkxPUFRfUkVBREZVTkNUSU9OLiAgQWxsIGNhbGxzIHRvIGZmbHVzaChzdGRvdXQpIGluCiAgdGVsbmV0LmMgd2VyZSByZW1vdmVkLCB3aGljaCBtYWtlcyB1c2luZyAnY3VybCB0ZWxuZXQ6Ly9mb28uY29tJyBwYWluZnVsCiAgc2luY2UgcHJvbXB0cyBhbmQgb3RoZXIgZGF0YSBhcmUgbm90IGFsd2F5cyByZXR1cm5lZCB0byB0aGUgdXNlciBwcm9tcHRseS4KICBVc2UgJ2N1cmwgLS1uby1idWZmZXIgdGVsbmV0Oi8vZm9vLmNvbScgaW5zdGVhZC4gIEluIGdlbmVyYWwsIHRoZSB1c2VyCiAgc2hvdWxkIGhhdmUgdGhlaXIgQ1VSTE9QVF9XUklURUZVTkNUSU9OIGRvIGEgZmZsdXNoIGZvciBpbnRlcmFjdGl2ZSB1c2UuCgogIEFsc28gZml4IGFzc3VtcHRpb24gdGhhdCByZWFkaW5nIGZyb20gc3RkaW4gbmV2ZXIgcmV0dXJucyA8IDAuCiAgT2xkIGNvZGUgY291bGQgY3Jhc2ggaW4gdGhhdCBjYXNlLgoKICBDYWxsIHByb2dyZXNzIGZ1bmN0aW9ucyBpbiB0ZWxuZXQgbWFpbiBsb29wLgoKRGFuaWVsIFN0ZW5iZXJnICgyNiBBcHIgMjAxMCkKLSBNYWtlIHVzZSBvZiB0aGUgbGlic3NoMl9pbml0L2V4aXQgZnVuY3Rpb25zIHRoYXQgbGlic3NoMiBhZGRlZCBpbiB2ZXJzaW9uCiAgMS4yLjUuIFVzaW5nIHRoZW0gd2lsbCBpbXByb3ZlIGhvdyBsaWJjdXJsIHdvcmtzIGluIHRocmVhZGVkIHNpdHVhdGlvbnMgd2hlbgogIFNDUCBhbmQgU0ZUUCBhcmUgdHJhbnNmZXJlZC4KCkRhbmllbCBTdGVuYmVyZyAoMjUgQXByIDIwMTApCi0gQmFzZWQgb24gd29yayBieSBLYW1pbCBEdWRrYSwgSSd2ZSBpbnRyb2R1Y2VkIHRoZSBuZXcgY29uZmlndXJlIG9wdGlvbgogIC0tZW5hYmxlLXRocmVhZGVkLXJlc29sdmVyLiBXaGVuIHVzZWQsIHRoZSBjb25maWd1cmUgc2NyaXB0IHdpbGwgY2hlY2sgZm9yCiAgcHRocmVhZHMgYW5kIGlmIGFyb3VuZCwgaXQgd2lsbCBidWlsZCBsaWJjdXJsIHRvIHVzZSBwdGhyZWFkcyB0byBkbyBuYW1lCiAgcmVzb2x2aW5nIGluIGEgdGhyZWFkZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhpcyBpcyBqdXN0IGEgZml4IHRvIG9mZmVyIGFuCiAgb3B0aW9uIHRoYXQgY2FuIGVuYWJsZSB0aGUgY29kZSB0aGF0IGFscmVhZHkgaW5jbHVkZWQuIFRoZSB0aHJlYWRlciByZXNvbHZlcgogIGNvZGUgd2FzIG1vc3RseSBhZGRlZCBvbiBKYW4gMjYgMjAxMC4KCkRhbmllbCBTdGVuYmVyZyAoMjQgQXByIDIwMTApCi0gQWxleCBCbGlnaCBpbnRyb2R1Y2VkIHRoZSAtLXByb3RvIGFuZCAtcHJvdG8tcmVkaXIgb3B0aW9ucyB0aGF0IGxpbWl0IHdoYXQKICBwcm90b2NvbHMgY3VybCBhY2NlcHRzIGZvciB0aGUgcmVxdWVzdHMgYW5kIHdoZW4gZm9sbG93aW5nIHJlZGlyZWN0cy4KCkthbWlsIER1ZGthICgyNCBBcHIgMjAxMCkKLSBGaXhlZCB0ZXN0NTM2IGluIG9yZGVyIHRvIG5vdCBmYWlsIHdpdGggdGhyZWFkZWQgRE5TIHJlc29sdmVyIGFuZCB0d2Vha2VkCiAgY29tbWVudHMgaW4gY2VydGFpbiBleGFtcGxlcyB1c2luZyBjdXJsX211bHRpX2Zkc2V0KCkuCgotIEZpeGVkIFNTTCBoYW5kc2hha2UgdGltZW91dCB1bmRlcmZsb3cgaW4gbGliY3VybC1OU1MsIHdoaWNoIGNhdXNlZCB0ZXN0NDA1CiAgdG8gaGFuZyBvbiBhIHNsb3cgbWFjaGluZS4KCkRhbmllbCBTdGVuYmVyZyAoMjEgQXByIDIwMTApCi0gVGhlIC1PIG9wdGlvbiBjYXVzZWQgY3VybCB0byBjcmFzaCBvbiB3aW5kb3dzIGFuZCBET1MgZHVlIHRvIHRoZSB0b29sCiAgd3JpdGluZyBvdXQgb2YgYm91bmRhcnkgbWVtb3J5LgoKWWFuZyBUc2UgKDIwIEFwciAyMDEwKQotIFJ1c2xhbiBHYXppem92IGRldGVjdGVkIHRoYXQgTVNWQyBtYWtlZmlsZXMgd2VyZSB1c2luZyB3c29jazMyLmxpYiBpbnN0ZWFkCiAgb2Ygd3MyXzMyLmxpYiwgdGhpcyBnZW5lcmF0ZWQgbGlua2luZyBpc3N1ZXMgb24gTVNWQyBJUHY2IGVuYWJsZWQgYnVpbGRzCiAgdGhhdCB3ZXJlIGRvbmUgdXNpbmcgdGhvc2UgbWFrZWZpbGVzLgoKRGFuaWVsIFN0ZW5iZXJnICgxOSBBcHIgMjAxMCkKLSAtSi8tLXJlbW90ZS1oZWFkZXItbmFtZSBkaWRuJ3Qgc3RyaXAgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJucyBvciBsaW5lZmVlZHMKICBwcm9wZXJseSwgc28gdGhleSBjb3VsZCBiZSB1c2VkIGluIHRoZSBmaWxlIG5hbWUuCgpEYW5pZWwgU3RlbmJlcmcgKDE2IEFwciAyMDEwKQotIEplcm9tZSBWb3VpbGxvbiBtYWRlIHRoZSBHbnVUTFMgU1NMIGhhbmRzaGFrZSBwaGFzZSBub24tYmxvY2tpbmcuCgotIFRoZSByZWNlbnQgb3ZlcmhhdWwgb2YgdGhlIFNTTCByZWN2IGZ1bmN0aW9uIG1hZGUgdGhlIEdudVRMUyBzcGVjaWZpYyBjb2RlCiAgdHJlYXQgYSB6ZXJvIHJldHVybmVkIGZyb20gZ251dGxzX3JlY29yZF9yZWN2KCkgYXMgYW4gZXJyb3IsIGFuZCB0aGlzIGNhdXNlZAogIG91ciBIVFRQUyB0ZXN0IGNhc2VzIHRvIGZhaWwuIFdlIGxlYXZlIGl0IHRvIHVwcGVyIGxheWVyIGNvZGUgdG8gZGV0ZWN0IGlmCiAgYW4gRU9GIGlzIGEgcHJvYmxlbSBvciBub3QuCgotIEkgcmV2ZXJ0ZWQgdGhlIHJlc29sdmVyIGZpeCBmcm9tIHllc3RlcmRheSBhbmQgaW5zdGVhZCByZW1vdmVkIGFsbCB1c2VzIG9mCiAgQUlfQ0FOT05OQU1FIGFsbCBvdmVyIGxpYmN1cmwgYW5kIG1hZGUgdGhlIG9ubHkgdXNlciBvZiB0aGF0IGluZm8gKGtyYjUuYykKICB1c2UgdGhlIGhvc3QgbmFtZSBmcm9tIHRoZSBVUkwgaW5zdGVhZC4gTm8gcmV2ZXJzZSByZXNvbHZpbmcgaXMgYSBnb29kCiAgdGhpbmcuCgotIFBhdWwgSG93YXJ0aCBtYWRlIGNvbmZpZ3VyZSBwcm9wZXJseSBkZXRlY3QgR1NTICJvbiBhbmNpZW50IExpbnV4IGRpc3Ryb3MiCiAgYnkgZWRpdGluZyBpbiB3aGljaCBvcmRlciB3ZSB1c2UgaGVhZGVycyB0byBkZXRlY3QgR1NTLgoKRGFuaWVsIFN0ZW5iZXJnICgxNSBBcHIgMjAxMCkKLSBSYWluZXIgQ2FuYXZhbiBmaWxlZCBidWcgcmVwb3J0ICMyOTg3MTk2IHRoYXQgaWRlbnRpZmllZCBsaWJjdXJsIGRvaW5nCiAgdW5uZWNlc2FyeSByZXZlcnNlIG5hbWUgbG9va3VwcyBpbiBtYW55IGNhc2VzIHdoZW4gYnVpbHQgdG8gdXNlIElQdjQgYW5kCiAgZ2V0YWRkcmluZm8oKS4gVGhlIGxvZ2ljIGZvciBJUHY2IGlzIG5vdyB1c2VkIGZvciBJUHY0IHRvby4KCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTYzNjc5KQoKVmVyc2lvbiA3LjIwLjEgKDE0IEFwcmlsIDIwMTApCgpEYW5pZWwgU3RlbmJlcmcgKDkgQXByIDIwMTApCi0gUHJlZml4aW5nIHRoZSBGVFAgcXVvdGUgY29tbWFuZHMgd2l0aCBhbiBhc3RlcmlzayByZWFsbHkgb25seSB3b3JrZWQgZm9yIHRoZQogIHBvc3RxdW90ZSBhY3Rpb25zLiBUaGlzIGlzIG5vdyBmaXhlZCBhbmQgdGVzdCBjYXNlIDIyNyBoYXMgYmVlbiBleHRlbmRlZCB0bwogIHZlcmlmeS4KCkthbWlsIER1ZGthICg0IEFwciAyMDEwKQotIEVsaW1pbmF0ZWQgYSByYWNlIGNvbmRpdGlvbiBpbiBDdXJsX3Jlc29sdl90aW1lb3V0KCkuCgotIFJlZmFjdG9yaXplZCBpbnRlcmZhY2Ugb2YgQ3VybF9zc2xfcmVjdigpL0N1cmxfc3NsX3NlbmQoKS4KCi0gbGliY3VybC1OU1Mgbm93IHByb3ZpZGVzIG1vcmUgYWNjdXJhdGUgbWVzc2FnZXMgYW5kIGVycm9yIGNvZGVzIGluIGNhc2Ugb2YKICBjbGllbnQgY2VydGlmaWNhdGUgcHJvYmxlbS4gIEVpdGhlciBkdXJpbmcgY29ubmVjdGlvbiwgb3IgdHJhbnNmZXIgcGhhc2UuCgpEYW5pZWwgU3RlbmJlcmcgKDEgQXByIDIwMTApCi0gTWF0dCBXaXhzb24gZm91bmQgYW5kIGZpeGVkIGEgYnVnIGluIHRoZSBTQ1AvU0ZUUCBhcmVhIHdoZXJlIHRoZSBjb2RlCiAgdHJlYXRlZCBhIDAgcmV0dXJuIGNvZGUgZnJvbSBsaWJzc2gyIHRvIGJlIHRoZSBzYW1lIGFzIEVBR0FJTiB3aGlsZSBpbgogIHJlYWxpdHkgaXQgaXNuJ3QuIFRoZSBwcm9ibGVtIGNhdXNlZCBhIGhhbmcgaW4gU0ZUUCB0cmFuc2ZlcnMgZnJvbSBhCiAgTWVzc2FnZVdheSBzZXJ2ZXIuCgpEYW5pZWwgU3RlbmJlcmcgKDI4IE1hciAyMDEwKQotIEJlbiBHcmVlYXI6IElmIHlvdSBwYXNzIGEgVVJMIHRvIHBvcDMgdGhhdCBkb2VzIG5vdCBjb250YWluIGEgbWVzc2FnZSBJRCBhcwogIHBhcnQgb2YgdGhlIFVSTCwgaXQgd291bGQgcHJldmlvdXNseSBhc2sgZm9yICdJTkJPWCcgd2hpY2gganVzdCBjYXVzZXMgdGhlCiAgcG9wMyBzZXJ2ZXIgdG8gcmV0dXJuIGFuIGVycm9yLgoKICBOb3cgbGliY3VybCB0cmVhdHMgZW4gZW1wdHkgbWVzc2FnZSBJRCBhcyBhIHJlcXVlc3QgZm9yIExJU1QgKGxpc3Qgb2YgcG9wMwogIG1lc3NhZ2UgSURzKS4gIFVzZXIncyBjb2RlIGNvdWxkIHRoZW4gcGFyc2UgdGhpcyBhbmQgZG93bmxvYWQgaW5kaXZpZHVhbAogIG1lc3NhZ2VzIGFzIGRlc2lyZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDI3IE1hciAyMDEwKQotIEJlbiBHcmVlYXIgYnJvdWdodCBhIHBhdGNoIHRoYXQgZnJvbSBub3cgb24gYWxsb3dzIGFsbCBwcm90b2NvbHMgdG8gc3BlY2lmeQogIG5hbWUgYW5kIHVzZXIgd2l0aGluIHRoZSBVUkwsIGluIHRoZSBzYW1lIG1hbm5lciBIVFRQIGFuZCBGVFAgaGF2ZSBiZWVuCiAgYWxsb3dlZCB0byBpbiB0aGUgcGFzdCAtIGFsdGhvdWdoIGZhciBmcm9tIGFsbCBvZiB0aGUgbGliY3VybCBzdXBwb3J0ZWQKICBwcm90b2NscyBhY3R1YWxseSBoYXZlIHRoYXQgZmVhdHVyZSBpbiB0aGVpciBVUkwgZGVmaW5pdGlvbiBzcGVjLgoKRGFuaWVsIFN0ZW5iZXJnICgyNiBNYXIgMjAxMCkKLSBCZW4gR3JlZWFyIGJyb3VnaHQgY29kZSB0aGF0IG1ha2VzIHRoZSByYXRlIGxpbWl0aW5nIGNvZGUgZm9yIHRoZSBlYXN5CiAgaW50ZXJmYWNlIGEgYml0IHNtb290aGVyIGFzIGl0IGludHJvZHVjZXMgc3ViLXNlY29uZCBzbGVlcHMgZHVyaW5nIGl0IGFuZCBpdAogIGFsc28gdGFrZXMgdGhlIGJ1ZmZlciBzaXplcyBpbnRvIGFjY291bnQuCgpEYW5pZWwgU3RlbmJlcmcgKDI0IE1hciAyMDEwKQotIEJvYiBSaWNobW9uZDogVGhlcmUncyBhbiBhbm5veWluZyBzaXR1YXRpb24gd2hlcmUgbGliY3VybCB3aWxsIHJlYWQgbmV3IEhUVFAKICByZXNwb25zZSBkYXRhIGZyb20gYSBzb2NrZXQsIHRoZW4gY2hlY2sgaWYgaXQncyBhIHRpbWVvdXQgaWYgb25lIGlzIHNldC4gSWYKICB0aGUgbGFzdCBwYWNrZXQgcmVjZWl2ZWQgY29uc3RpdHV0ZXMgdGhlIGVuZCBvZiB0aGUgcmVzcG9uc2UgYm9keSwgbGliY3VybAogIHN0aWxsIHRyZWF0cyBpdCBhcyBhIHRpbWVvdXQgY29uZGl0aW9uIGFuZCByZXBvcnRzIGEgbWVzc2FnZSBsaWtlOgoKICAiT3BlcmF0aW9uIHRpbWVkIG91dCBhZnRlciAzMDAwIG1pbGxpc2Vjb25kcyB3aXRoIDg3NiBvdXQgb2YgODc2IGJ5dGVzCiAgcmVjZWl2ZWQiCgogIEl0IHNob3VsZCBvbmx5IGEgdGltZW91dCBpZiB0aGUgdGltZXIgbGFwc2VkIGFuZCB3ZSBESUROJ1QgcmVjZWl2ZSB0aGUgZW5kCiAgb2YgdGhlIHJlc3BvbnNlIGJvZHkgeWV0LgoKLSBDaHJpc3RvcGhlciBDb25yb3kgZml4ZWQgYSBwcm9ibGVtIHdpdGggUlRTUCBhbmQgR0VUX1BBUkFNRVRFUiByZXBvcnRlZAogIHRvIHVzIGJ5IE1hc3NpbW8gQ2FsbGVnYXJpLiBUaGVyZSdzIGEgbmV3IHRlc3QgY2FzZSA1NzIgdGhhdCB2ZXJpZmllcyB0aGlzCiAgbm93LgoKLSBUaGUgJ2FyZXMnIHN1YnRyZWUgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzb3VyY2UgcmVwb3NpdG9yeS4gSXQgd2FzCiAgYWx3YXlzIGEgc2VwYXJhdGUgcHJvamVjdCB0aGF0IHNvcnQgb2YgcGlnZ3liYWNrZWQgb24gdGhlIGN1cmwgcHJvamVjdCBzaW5jZQogIHRoZSBkYXduIG9mIHRpbWVzIGFuZCBub3cgdGhlIHRpbWUgaGFzIGNvbWUgZm9yIGl0IHRvIGdvIHN0YW5kIG9uIGl0cyBvd24KICBsZWdzIGFuZCBjb250aW51ZSBsaXZpbmcgaXRzIG93biBsaWZlLiBBbGwgZGV0YWlscyBvbiBjLWFyZXMgYW5kIGl0cyBuZXcKICBzb3VyY2UgY29kZSByZXBvc2l0b3J5IGlzIGZvdW5kIGF0IGh0dHA6Ly9jLWFyZXMuaGF4eC5zZS8KCkRhbmllbCBTdGVuYmVyZyAoMjMgTWFyIDIwMTApCi0gS2VubnkgVG8gZmlsZWQgdGhlIGJ1ZyByZXBvcnQgIzI5NjM2Nzkgd2l0aCBwYXRjaCB0byBmaXggYSBwcm9ibGVtIGhlCiAgZXhwZXJpZW5jZWQgd2l0aCBkb2luZyBtdWx0aSBpbnRlcmZhY2UgSFRUUCBQT1NUIG92ZXIgYSBwcm94eSB1c2luZwogIFBST1hZVFVOTkVMLiBIZSBmb3VuZCBhIGNhc2Ugd2hlcmUgaXQgd291bGQgY29ubmVjdCBmaW5lIGJ1dCBiaXRzLnRjcGNvbm5lY3QKICB3YXMgbm90IHNldCBjb3JyZWN0IHNvIGxpYmN1cmwgZGlkbid0IHdvcmsgcHJvcGVybHkuCgogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjk2MzY3OSkKCi0gQWtvcyBQYXN6dG9yeSBmaWxlZCBkZWJpYW4gYnVnIHJlcG9ydCAjNTcyMjc2CiAgaHR0cHM6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz01NzIyNzYgbWVudGlvbmluZyBhIHByb2JsZW0KICB3aXRoIGEgcmVzb3VyY2UgdGhhdCByZXR1cm5zIGNodW5rZWQtZW5jb2RlZCBfYW5kXyB3aXRoIGEgQ29udGVudC1MZW5ndGgKICBhbmQgbGliY3VybCBmYWlsZWQgdG8gcHJvcGVybHkgaWdub3JlIHRoZSBsYXR0ZXIgaW5mb3JtYXRpb24uCgotIEhhdWtlIER1ZGVuIHByb3ZpZGVkIGFuIGV4YW1wbGUgcHJvZ3JhbSB0aGF0IG1hZGUgdGhlIG11bHRpIGludGVyZmFjZSBjcmFzaC4KICBIaXMgZXhhbXBsZSBzaW1wbHkgdXNlZCB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBkaWQgZmlyc3Qgb25lIEZUUCB0cmFuc2ZlcgogIGFuZCBhZnRlciBjb21wbGV0aW9uIGl0IHVzZWQgYSBzZWNvbmQgZWFzeSBoYW5kbGUgYW5kIGRpZCBhbm90aGVyIEZUUAogIHRyYW5zZmVyIG9uIHRoZSBzYW1lIEZUUCBzZXJ2ZXIuCgogIFRoaXMgdHJpZ2dlcmVkIGEgYnVnIGluIHRoZSAiZGVsYXllZCBlYXN5IGhhbmRsZSBraWxsIiBzeXN0ZW0gdGhhdCBjdXJsCiAgdXNlczogd2hlbiBhbiBGVFAgY29ubmVjdGlvbiBpcyBsZWZ0IGFsaXZlIGl0IG11c3Qga2VlcCBhbiBlYXN5IGhhbmRsZQogIGFyb3VuZCBpbnRlcm5hbGx5IC0gb25seSBmb3IgdGhlIHB1cnBvc2Ugb2YgaGF2aW5nIGFuIGVhc3kgaGFuZGxlIHdoZW4gaXQKICBsYXRlciBkaXNjb25uZWN0cyBpdC4gVGhlIGNvZGUgYXNzdW1lZCB0aGF0IHdoZW4gdGhlIGVhc3kgaGFuZGxlIHdhcyByZW1vdmVkCiAgYW5kIGFuIGludGVybmFsIHJlZmVyZW5jZSB3YXMgbWFkZSwgdGhhdCB2ZXJzaW9uIGNvdWxkIGJlIGtpbGxlZCBsYXRlciBvbgogIHdoZW4gYSBuZXcgZWFzeSBoYW5kbGUgY2FtZSB1c2luZyB0aGUgc2FtZSBjb25uZWN0aW9uLiBUaGlzIHdhcyB3cm9uZyBhcwogIEhhdWtlJ3MgZXhhbXBsZSBzaG93ZWQgdGhhdCB0aGUgcmVtb3ZlZCBoYW5kbGUgd2Fzbid0IGtpbGxlZCBmb3IgcmVhbCB1bnRpbAogIGxhdGVyLiBUaGlzIGNhdXNlZCBhIGRvdWJsZSBjbG9zZSBhdHRlbXB0ID0+IHNlZ2ZhdWx0LgoKRGFuaWVsIFN0ZW5iZXJnICgyMiBNYXIgMjAxMCkKLSBUaG9tYXMgTG9wYXRpYyBmaXhlZCB0aGUgYWxhcm0oKS1iYXNlZCBETlMgdGltZW91dDoKCiAgTG9va2luZyBhdCB0aGUgY29kZSBvZiBDdXJsX3Jlc29sdl90aW1lb3V0KCkgaW4gaG9zdGlwLmMsIEkgdGhpbmsgdGhhdCBpbgogIGNhc2Ugb2YgYSB0aW1lb3V0LCB0aGUgc2lnbmFsIGhhbmRsZXIgZm9yIFNJR0FMUk0gbmV2ZXIgZ2V0cyByZW1vdmVkLiBJCiAgdGhpbmsgdGhhdCBpbiBteSBjYXNlIGl0IGdldHMgZXhlY3V0ZWQgYXQgc29tZSBwb2ludCBsYXRlciBvbiB3aGVuIGV4ZWN1dGlvbgogIGhhcyBsb25nIGxlZnQgQ3VybF9yZXNvbHZfdGltZW91dCgpIG9yIGV2ZW4gdGhlIGNVUkwgbGlicmFyeS4KCiAgVGhlIGNvZGUgdGhhdCBpcyBqdW1wZWQgdG8gd2l0aCBzaWdsb25nam1wKCkgc2ltcGx5IHNldHMgdGhlIGVycm9yIG1lc3NhZ2UKICB0byAibmFtZSBsb29rdXAgdGltZWQgb3V0IiBhbmQgdGhlbiByZXR1cm5zIHdpdGggQ1VSTFJFU09MVl9FUlJPUi4gSSBndWVzcwogIHRoYXQgaW5zdGVhZCBvZiBzaW1wbHkgcmV0dXJuaW5nIHdpdGhvdXQgY2xlYW5pbmcgdXAsIHRoZSBjb2RlIHNob3VsZCBoYXZlIGEKICBnb3RvIHRoYXQganVtcHMgdG8gdGhlIHNwb3QgcmlnaHQgYWZ0ZXIgdGhlIGNhbGwgdG8gQ3VybF9yZXNvbHYoKS4KCkthbWlsIER1ZGthICgyMiBNYXIgMjAxMCkKLSBEb3VnbGFzIFN0ZWlud2FuZCBjb250cmlidXRlZCBhIHBhdGNoIGZpeGluZyBpbnN1ZmZpY2llbnQgaW5pdGlhbGl6YXRpb24gaW4KICBDdXJsX2Nsb25lX3NzbF9jb25maWcoKQoKRGFuaWVsIFN0ZW5iZXJnICgyMSBNYXIgMjAxMCkKLSBCZW4gR3JlZWFyIGltcHJvdmVkIFRGVFA6IHRoZSBlcnJvciBjb2RlIHJldHVybmluZyBhbmQgdGhlIHRyZWF0bWVudAogIG9mIFRTSVpFID09IDAgd2hlbiB1cGxvYWRpbmcuCgotIFdlJ3ZlIHN3aXRjaGVkIGZyb20gQ1ZTIHRvIGdpdC4gU2VlIGh0dHBzOi8vY3VybC5oYXh4LnNlL3NvdXJjZS5odG1sCgpLYW1pbCBEdWRrYSAoMTkgTWFyIDIwMTApCi0gSW1wcm92ZWQgQ3VybF9yZWFkKCkgdG8gbm90IGlnbm9yZSB0aGUgZXJyb3IgcmV0dXJuZWQgZnJvbSBDdXJsX3NzbF9yZWN2KCkuCgpEYW5pZWwgU3RlbmJlcmcgKDE1IE1hciAyMDEwKQotIENvbnN0YW50aW5lIFNhcHVudHpha2lzIGJyb3VnaHQgYSBwYXRjaDoKCiAgVGhlIHByb2JsZW0gbWVudGlvbmVkIG9uIERlYyAxMCAyMDA5CiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTA1MjIwKSB3YXMgb25seSBwYXJ0aWFsbHkgZml4ZWQuCiAgUGFydGlhbGx5IGJlY2F1c2UgYW4gZWFzeSBoYW5kbGUgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBtYW55IGNvbm5lY3Rpb25zIGluCiAgdGhlIGNhY2hlIChlLmcuIGlmIHRoZXJlIGlzIGEgcmVkaXJlY3QgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGUgZWFzeQogIGhhbmRsZSkuICBUaGUgcHJldmlvdXMgcGF0Y2ggb25seSBjbGVhbmVkIHVwIHRoZSBmaXJzdCBvbmUuIFRoZSBuZXcgZml4IG5vdwogIHJlbW92ZXMgdGhlIGVhc3kgaGFuZGxlIGZyb20gYWxsIGNvbm5lY3Rpb25zLCBub3QganVzdCB0aGUgZmlyc3Qgb25lLgoKRGFuaWVsIFN0ZW5iZXJnICg2IE1hciAyMDEwKQotIEJlbiBHcmVlYXIgYnJvdWdodCBhIHBhdGNoIHRoYXQgZml4ZWQgdGhlIHJhdGUgbGltaXRpbmcgbG9naWMgZm9yIFRGVFAgd2hlbgogIHRoZSBlYXN5IGludGVyZmFjZSB3YXMgdXNlZC4KCkRhbmllbCBTdGVuYmVyZyAoNSBNYXIgMjAxMCkKLSBEYW5pZWwgSm9obnNvbiBwcm92aWRlZCBmaXhlcyBmb3IgYnVpbGRpbmcgY3VybCB3aXRoIHRoZSBjbGFuZyBjb21waWxlci4KCllhbmcgVHNlICg1IE1hciAyMDEwKQotIENvbnN0YW50aW5lIFNhcHVudHpha2lzIGRldGVjdGVkIGFuZCBmaXhlZCBhIGRvdWJsZSBmcmVlIGluIGJ1aWxkcyBkb25lCiAgd2l0aCB0aHJlYWRlZCByZXNvbHZlciBlbmFibGVkIChXaW5kb3dzIGRlZmF1bHQgY29uZmlndXJhdGlvbikgdGhhdCB3b3VsZAogIGdldCB0cmlnZ2VyZWQgd2hlbiBhIGN1cmwgaGFuZGxlIGlzIGNsb3NlZCB3aGlsZSBkb2luZyBETlMgcmVzb2x1dGlvbi4KCkRhbmllbCBTdGVuYmVyZyAoMiBNYXIgMjAxMCkKLSBbRGFuaWVsIEpvaG5zb25dIEkndmUgYmVlbiB0cnlpbmcgdG8gYnVpbGQgbGliY3VybCB3aXRoIGNsYW5nIG9uIERhcndpbiBhbmQKICByYW4gaW50byBzb21lIGlzc3VlcyB3aXRoIHRoZSBHU1NBUEkgdGVzdHMgaW4gY29uZmlndXJlLmFjLiBUaGUgdGVzdHMgZmlyc3QKICB0cnkgdG8gZGV0ZXJtaW5lIHRoZSBpbmNsdWRlIGRpcnMgYW5kIGxpYnMgYW5kIHNldCBDUFBGTEFHUyBhbmQgTElCUwogIGFjY29yZGluZ2x5LiBJdCB0aGVuIGNoZWNrcyBmb3IgdGhlIGhlYWRlcnMgYW5kIGZpbmFsbHkgc2V0cyBMSUJTIGEgc2Vjb25kCiAgdGltZSwgY2F1c2luZyB0aGUgbGlicyB0byBiZSBpbmNsdWRlZCB0d2ljZS4gVGhlIGZpcnN0IHNldHRpbmcgb2YgTElCUyBzZWVtcwogIHJlZHVuZGFudCBhbmQgc2hvdWxkIGJlIGxlZnQgb3V0LCBzaW5jZSB0aGUgZmlyc3QgcGFydCBpcyBvdGhlcndpc2UganVzdAogIGFib3V0IGZpbmRpbmcgaGVhZGVycy4KCiAgTXkgc2Vjb25kIGlzc3VlIGlzIHRoYXQgJ2tyYjUtY29uZmlnIC0tbGlicyBnc3NhcGknIG9uIERhcndpbiBpcyBsZXNzIHRoYW4KICB1c2VsZXNzIGFuZCByZXR1cm5zIGp1bmsgdGhhdCwgd2hpbGUgaXQgaGFwcGVucyB0byB3b3JrIHdpdGggZ2NjLCBjYXVzZXMKICBjbGFuZyB0byBjaG9rZS4gRm9yIGV4YW1wbGUsIC0tbGlicyByZXR1cm5zICRDRkxBR1MgYWxvbmcgd2l0aCB0aGUgbGlicywKICB3aGljaCBpcyByZWFsbHkgcmV0YXJkZWQuIFNpbXBseSBzZXR0aW5nICdMSUJTPSIkTElCUyAtbGdzc2FwaV9rcmI1CiAgLWxyZXNvbHYiJyBvbiBEYXJ3aW4gaXMgc3VmZmljaWVudC4KCi0gQmFzZWQgb24gcGF0Y2ggcHJvdmlkZWQgYnkgSmFjb2IgTW9zaGVua28sIHRoZSB0cmFuc2ZlciBsb2dpYyBub3cgcHJvcGVybHkKICBtYWtlcyBzdXJlIHRoYXQgd2hlbiB1c2luZyBzdWItc2Vjb25kIHRpbWVvdXRzLCB0aGVyZSdzIG5vIGZpbmFsIGJhZCAxMDAwbXMKICB3YWl0LiBQcmV2aW91c2x5LCBhIHN1Yi1zZWNvbmQgdGltZW91dCB3b3VsZCBvZnRlbiBtYWtlIHRoZSBlbGFwc2VkIHRpbWUgZW5kCiAgdXAgdGhlIHRpbWUgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBzZWNvbmQgKGUuZy4gMXMgZm9yIDIwMG1zIHRpbWVvdXQpCgotIEFuZHJlaSBCZW5lYSBmaWxlZCBidWcgcmVwb3J0ICMyOTU2Njk4IGFuZCBwb2ludGVkIG91dCB0aGF0IHRoZQogIENVUkxPUFRfQ0VSVElORk8gZmVhdHVyZSBsZWFrZWQgbWVtb3J5IGR1ZSB0byBhIG1pc3NpbmcgT3BlblNTTCBmdW5jdGlvbgogIGNhbGwuIEhlIHByb3ZpZGVkIHRoZSBwYXRjaCB0byBmaXggaXQgdG9vLgoKICBodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjk1NjY5OAoKLSBNYXJrdXMgRHVmdCBwb2ludGVkIG91dCBpbiBidWcgIzI5NjE3OTYgdGhhdCBldmVuIHRob3VnaCBJbnRlcml4IGhhcyBhCiAgcG9sbCgpIGZ1bmN0aW9uIGl0IGRvZXNuJ3QgcXVpdGUgd29yayB0aGUgd2F5IHdlIHdhbnQgaXQgc28gd2UgbXVzdCBkaXNhYmxlCiAgaXQsIGFuZCBoZSBhbHNvIHByb3ZpZGVkIGEgcGF0Y2ggZm9yIGl0LgoKICBodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjk2MTc5NgoKLSBNYWRlIHRoZSBwaW5ncG9uZyB0aW1lb3V0IGNvZGUgcHJvcGVybHkgZGVhbCB3aXRoIHRoZSByZXNwb25zZSB0aW1lb3V0IEFORAogIHRoZSBnbG9iYWwgdGltZW91dCBpZiBzZXQuIEFsc28sIGFzIHdhcyByZXBvcnRlZCBpbiB0aGUgYnVnIHJlcG9ydCAjMjk1NjQzNwogIGJ5IFJ5YW4gQ2hhbiwgdGhlIHRpbWUgc3RhbXAgdG8gdXNlIGFzIGJhc2lzIGZvciB0aGUgcGVyIGNvbW1hbmQgdGltZW91dCB3YXMKICBub3Qgc2V0IHByb3Blcmx5IGluIHRoZSBET05FIHBoYXNlIGZvciBGVFAgKGFuZCBub3QgZm9yIFNNVFApIHNvIEkgZml4ZWQKICB0aGF0IGp1c3Qgbm93LiBUaGlzIHdhcyBhIHJlZ3Jlc3Npb24gY29tcGFyZWQgdG8gNy4xOS43IGR1ZSB0byB0aGUKICBjb252ZXJzaW9uIG9mIEZUUCBjb2RlIG92ZXIgdG8gdGhlIGdlbmVyaWMgcGluZ3BvbmcgY29uY2VwdHMuCgogIGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTU2NDM3CgpEYW5pZWwgU3RlbmJlcmcgKDEgTWFyIDIwMTApCi0gQmVuIEdyZWVhciBwcm92aWRlZCBhbiB1cGRhdGUgZm9yIFRGVFAgdGhhdCBmaXhlcyB1cGxvYWQuCgotIFdlc2xleSBNaWF3IHJlcG9ydGVkIGJ1ZyAjMjk1ODE3OSB3aGljaCBpZGVudGlmaWVkIGEgY2FzZSBvZiBsb29waW5nIGR1cmluZwogIE9wZW5TU0wgYmFzZWQgU1NMIGhhbmRzaGFraW5nIGV2ZW4gdGhvdWdoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2FzIHVzZWQgYW5kCiAgdGhlcmUgd2FzIG5vIGdvb2QgcmVhc29uIGZvciBpdC4KCiAgaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5NTgxNzkKCkRhbmllbCBTdGVuYmVyZyAoMjYgRmViIDIwMTApCi0gUGF0IFJheSBpbiBidWcgIzI5NTg0NzQgcG9pbnRlZCBvdXQgYW4gb2ZmLWJ5LW9uZSBjYXNlIHdoZW4gcmVjZWl2aW5nIGEKICBjaHVua2VkLWVuY29kaW5nIHRyYWlsZXIuCgogIGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTU4NDc0CgpEYW5pZWwgRmFuZHJpY2ggKDI1IEZlYiAyMDEwKQotIEZpeGVkIGEgY291cGxlIG9mIG91dCBvZiBtZW1vcnkgbGVha3MgYW5kIGEgc2VnZmF1bHQgaW4gdGhlIFNNVFAgJiBJTUFQIGNvZGUuCgpZYW5nIFRzZSAoMjUgRmViIDIwMTApCi0gSSBmaXhlZCBidWcgcmVwb3J0ICMyOTU4MDc0IGluZGljYXRpbmcKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5NTgwNzQpIHRoYXQgY3VybCBvbiBXaW5kb3dzIHdpdGgKICBvcHRpb24gLS10cmFjZS10aW1lIGRpZCBub3QgdXNlIGxvY2FsIHRpbWUgd2hlbiB0aW1lc3RhbXBpbmcgdHJhY2UgbGluZXMuCiAgVGhpcyBjb3VsZCBhbHNvIGhhcHBlbiBvbiBvdGhlciBzeXN0ZW1zIGRlcGVuZGluZyBvbiB0aW1lIHNvdXVyY2UuCgpQYXRyaWNrIE1vbm5lcmF0ICgyMiBGZWIgMjAxMCkKLSBQcm9wZXIgaGFuZGxpbmcgb2YgU1RBUlRUTFMgb24gU01UUCwgdGFraW5nIENVUkxVU0VTU0xfVFJZIGludG8gYWNjb3VudC4KLSBTTVRQIGZhbGxzIGJhY2sgdG8gUkZDODIxIEhFTE8gd2hlbiBFSExPIGZhaWxzIChhbmQgU1NMIGlzIG5vdCByZXF1aXJlZCkuCi0gVXNlIG9mIHRydWUgbG9jYWwgaG9zdCBuYW1lIChpLmUuOiB2aWEgZ2V0aG9zdG5hbWUoKSkgd2hlbiBhdmFpbGFibGUsIGFzCiAgZGVmYXVsdCBhcmd1bWVudCB0byBTTVRQIEhFTE8vRUhMTy4KLSBUZXN0IGNhc2UgODA0IGZvciBIRUxPIGZhbGxiYWNrLgoKRGFuaWVsIFN0ZW5iZXJnICgyMCBGZWIgMjAxMCkKLSBGaXhlZCB0aGUgU01UUCBjb21wbGlhbmNlIGJ5IG1ha2luZyBzdXJlIFJDUFQgVE8gYWRkcmVzc2VzIGFyZSBzcGVjaWZpZWQKICBwcm9wZXJseSBpbiBhbmdsZSBicmFja2V0cy4gUmVjaXBpZW50cyBwcm92aWRlZCB3aXRoIENVUkxPUFRfTUFJTF9SQ1BUIG5vdwogIGdldCBhbmdsZSBicmFja2V0IHdyYXBwaW5nIGF1dG9tYXRpY2FsbHkgYnkgbGliY3VybCB1bmxlc3MgdGhlIHJlY2lwaWVudAogIHN0YXJ0cyB3aXRoIGFuIGFuZ2xlIGJyYWNrZXQgYXMgdGhlbiB0aGUgYXBwIGlzIGFzc3VtZWQgdG8gZGVhbCB3aXRoIHRoYXQKICBwcm9wZXJseSBvbiBpdHMgb3duLgoKLSBJIG1hZGUgdGhlIFNNVFAgY29kZSBleHBlY3QgYSAyNTAgcmVzcG9uc2UgYmFjayBmcm9tIHRoZSBzZXJ2ZXIgYWZ0ZXIgdGhlCiAgZnVsbCBEQVRBIGhhcyBiZWVuIHNlbnQsIGFuZCBJIG1vZGlmaWVkIHRoZSB0ZXN0IFNNVFAgc2VydmVyIHRvIGFsc28gc2VuZAogIHRoYXQgcmVzcG9uc2UuIEFzIHVzdWFsLCB0aGUgRE9ORSBvcGVyYXRpb24gdGhhdCBpcyBtYWRlIGFmdGVyIGEgY29tcGxldGVkCiAgdHJhbnNmZXIgaXMgc3RpbGwgbm90IGRvYWJsZSBpbiBhIG5vbi1ibG9ja2luZyB3YXkgc28gdGhpcyB3YWl0aW5nIGZvciAyNTAKICBpcyB1bmZvcnR1bmF0ZWx5IG1hZGUgYmxvY2tpbmdseS4KCllhbmcgVHNlICgxNCBGZWIgMjAxMCkKLSBPdmVyaGF1bGVkIHRlc3Qgc3VpdGUgZ2V0cGFydCgpIGZ1bmN0aW9uLiBGaXhpbmcgcG90ZW50aWFsIG91dCBvZiBib3VuZHMKICBzdGFjayBhbmQgbWVtb3J5IG92ZXJ3cml0ZXMgdHJpZ2dlcmVkIHdpdGggaHVnZSB0ZXN0IGNhc2UgZGVmaW5pdGlvbnMuCgpEYW5pZWwgU3RlbmJlcmcgKDEzIEZlYiAyMDEwKQotIE1hcnRpbiBIYWdlciByZXBvcnRlZCBhbmQgZml4ZWQgYSBwcm9ibGVtIHdpdGggYSBtaXNzaW5nIHF1b3RlIGluIGxpYmN1cmwubTQKCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTUxMzE5KQoKLSBUb20gRG9ub3ZhbiBmaXhlZCB0aGUgQ1VSTF9GT1JNQVRfKiBkZWZpbmVzIHdoZW4gYnVpbGRpbmcgd2l0aCBjbWFrZS4KCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTUxMjY5KQoKRGFuaWVsIFN0ZW5iZXJnICgxMiBGZWIgMjAxMCkKLSBKYWNrIFpoYW5nIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIFNNVFA6IHdlIHdyb25nbHkgdXNlZCBtdWx0aXBsZSBhZGRyZXNzZXMKICBpbiB0aGUgc2FtZSBSQ1BUIFRPIGxpbmUsIHdoZW4gdGhleSBzaG91bGQgYmUgc2VudCBpbiBzZXBhcmF0ZSBzaW5nbGUKICBjb21tYW5kcy4gSSB1cGRhdGVkIHRlc3QgY2FzZSA4MDIgdG8gdmVyaWZ5IHRoaXMuCgotIEkgYWxzbyBmaXhlZCBhIGJhZCB1c2Ugb2YgbXlfc2V0b3B0X3N0cigpIG9mIENVUkxPUFRfTUFJTF9SQ1BUIGluIHRoZSBjdXJsCiAgdG9vbCB3aGljaCBtYWRlIGl0IHRyeSB0byBvdXRwdXQgaXQgYXMgc3RyaW5nIGZvciB0aGUgLS1saWJjdXJsIGZlYXR1cmUKICB3aGljaCBjb3VsZCBsZWFkIHRvIGNyYXNoZXMuCgpZYW5nIFRzZSAoMTEgRmViIDIwMTApCi0gU3RldmVuIE0uIFNjaHdlZGEgZml4ZWQgVk1TIGJ1aWxkZXIgYmFkIGJlaGF2aW9yIHdoZW4gdXNlZCBpbiBhIGJhdGNoIGpvYiwKICByZW1vdmVkIG9ic29sZXRlIGJhdGNoX2NvbXBpbGUuY29tIGFuZCBkZWZpbmVzLmNvbSBhbmQgdXBkYXRlZCBWTVMgcmVhZG1lLgoKVmVyc2lvbiA3LjIwLjAgKDkgRmVicnVhcnkgMjAxMCkKCkRhbmllbCBTdGVuYmVyZyAoOSBGZWIgMjAxMCkKLSBXaGVuIGRvd25sb2FkaW5nIGNvbXByZXNzZWQgY29udGVudCBvdmVyIEhUVFAgYW5kIHRoZSBhcHAgYXNrZWQgbGliY3VybCB0bwogIGF1dG9tYXRpY2FsbHkgdW5jb21wcmVzcyBpdCB3aXRoIHRoZSBDVVJMT1BUX0VOQ09ESU5HIG9wdGlvbiwgbGliY3VybCBjb3VsZAogIHdyb25nbHkgcHJvdmlkZSB0aGUgY2FsbGJhY2sgd2l0aCBtb3JlIGRhdGEgdGhhbiB0aGUgbWF4aW11bSBkb2N1bWVudGVkCiAgYW1vdW50LiBBbiBhcHBsaWNhdGlvbiBjb3VsZCB0aHVzIGdldCB0cmlja2VkIGludG8gYmFkbmVzcyBpZiB0aGUgbWF4aW11bQogIGxpbWl0IHdhcyB0cnVzdGVkIHRvIGJlIGVuZm9yY2VkIGJ5IGxpYmN1cmwgaXRzZWxmIChhcyBpdCBpcyBkb2N1bWVudGVkKS4KCiAgVGhpcyBpcyBmdXJ0aGVyIGRldGFpbGVkIGFuZCBleHBsYWluZWQgaW4gdGhlIGxpYmN1cmwgc2VjdXJpdHkgYWR2aXNvcnkKICAyMDEwMDIwOSBhdAoKICAgIGh0dHBzOi8vY3VybC5oYXh4LnNlL2RvY3MvYWR2XzIwMTAwMjA5Lmh0bWwKCkRhbmllbCBGYW5kcmljaCAoMyBGZWIgMjAxMCkKLSBDaGFuZ2VkIHRoZSBXYXRjb20gbWFrZWZpbGVzIHRvIG1ha2UgdGhlbSBlYXNpZXIgdG8ga2VlcCBpbiBzeW5jIHdpdGgKICBNYWtlZmlsZS5pbmMgc2luY2UgdGhhdCBjYW4ndCBiZSBpbmNsdWRlZCBkaXJlY3RseS4KCllhbmcgVHNlICgyIEZlYiAyMDEwKQotIFN5bWJvbCBDVVJMX0ZPUk1BVF9PRkZfVCBub3cgb2Jzb2xldGVkLCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZSwKICBzeW1ib2wgd2lsbCBub3QgYmUgYXZhaWxhYmxlIHdoZW4gYnVpbGRpbmcgd2l0aCBDVVJMX05PX09MRElFUyBkZWZpbmVkLiBVc2UKICBvZiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UIGlzIHByZWZlcnJlZCBzaW5jZSA3LjE5LjAKCkRhbmllbCBTdGVuYmVyZyAoMSBGZWIgMjAxMCkKLSBVc2luZyB0aGUgbXVsdGlfc29ja2V0IEFQSSwgaXQgdHVybnMgb3V0IGF0IHRpbWVzIGl0IHNlZW1lZCB0byAiZm9yZ2V0IgogIGNvbm5lY3Rpb25zICh3aGljaCBjYXVzZWQgYSBoYW5nKS4gSXQgdHVybmVkIG91dCB0byBiZSBhbiBleGlzdGluZyAoNy4xOS43KQogIGJ1ZyBpbiBsaWJjdXJsICh0aGF0J3MgYmVlbiBhcm91bmQgZm9yIGEgbG9uZyB0aW1lKSBhbmQgaXQgaGFwcGVuZWQgbGlrZQogIHRoaXM6CgogIFRoZSBhcHAgY2FsbHMgY3VybF9tdWx0aV9hZGRfaGFuZGxlKCkgdG8gYWRkIGEgbmV3IGVhc3kgaGFuZGxlLCBsaWJjdXJsIHdpbGwKICB0aGVuIHNldCBpdCB0byB0aW1lb3V0IGluIDEgbWlsbGlzZWNvbmQgc28gbGliY3VybCB3aWxsIHRlbGwgdGhlIGFwcCBhYm91dAogIGl0LgoKICBUaGUgYXBwJ3MgdGltZW91dCBmaXJlcyBvZmYgdGhhdCB0aGVyZSdzIGEgdGltZW91dCwgdGhlIGFwcCBjYWxscyBsaWJjdXJsIGFzCiAgd2Ugc28gb2Z0ZW4gZG9jdW1lbnQgaXQ6CgogIGRvIHsKICAgcmVzID0gY3VybF9tdWx0aV9zb2NrZXRfYWN0aW9uKC4uLiBUSU1FT1VUIC4uLik7CiAgfSB3aGlsZShDVVJMTV9DQUxMX01VTFRJX1BFUkZPUk0gPT0gcmVzKTsKCiAgQW5kIHRoaXMgaXMgdGhlIHByb2JsZW0gbnVtYmVyIG9uZToKCiAgV2hlbiBjdXJsX211bHRpX3NvY2tldF9hY3Rpb24oKSBpcyBjYWxsZWQgd2l0aCBubyBzcGVjaWZpYyBoYW5kbGUsIGJ1dCBvbmx5CiAgYSB0aW1lb3V0LWFjdGlvbiwgaXQgd2lsbCAqb25seSogcGVyZm9ybSBhY3Rpb25zIHdpdGhpbiBsaWJjdXJsIHRoYXQgYXJlCiAgbWFya2VkIHRvIHJ1biBhdCB0aGlzIHRpbWUuIEluIHRoaXMgY2FzZSwgdGhlIHJlcXVlc3Qgd291bGQgZ28gZnJvbSBJTklUIHRvCiAgQ09OTkVDVCBhbmQgcmV0dXJuIENVUkxNX0NBTExfTVVMVElfUEVSRk9STS4gV2hlbiB0aGUgYXBwIHRoZW4gY2FsbHMgbGliY3VybAogIGFnYWluLCB0aGVyZSdzIG5vIHRpbWVyIHNldCBmb3IgdGhpcyBoYW5kbGUgc28gaXQgcmVtYWlucyBpbiB0aGUgQ09OTkVDVAogIHN0YXRlLiBUaGUgQ09OTkVDVCBzdGF0ZSBpcyBhIHRyYW5zaXRpb25hbCBzdGF0ZSBpbiBsaWJjdXJsIHNvIGl0IHJlcG9ydHMgbm8KICBzb2NrZXRzIHRoZXJlLCBhbmQgdGh1cyBsaWJjdXJsIG5ldmVyIHRlbGxzIHRoZSBhcHAgYW55dGhpbmcgbW9yZSBhYm91dCB0aGF0CiAgZWFzeSBoYW5kbGUvY29ubmVjdGlvbi4KCiAgbGliY3VybCBfZG9lc18gc2V0IGEgMW1zIHRpbWVvdXQgZm9yIHRoZSBoYW5kbGUgYXQgdGhlIGVuZCBvZgogIG11bHRpX3J1bnNpbmdsZSgpIGlmIGl0IHJldHVybnMgQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNLCBidXQgc2luY2UgdGhlIGxvb3AKICBpcyBpbnN0YW50IHRoZSBuZXcgam9iIGlzIG5vdCByZWFkeSB0byBydW4gYXQgdGhhdCBwb2ludCAoYW5kIHRoZXJlJ3Mgbm8KICBjb2RlIHRoYXQgbWFrZXMgbGliY3VybCBjYWxsIHRoZSBhcHAgdG8gdXBkYXRlIHRoZSB0aW1vdXQgZm9yIHRoaXMgbmV3CiAgdGltZW91dCkuIEl0IHdpbGwgc2ltcGx5IHJlbHkgb24gdGhhdCBzb21lIG90aGVyIHRpbWVvdXQgd2lsbCB0cmlnZ2VyIGxhdGVyCiAgb24gb3IgdGhhdCBzb21ldGhpbmcgZWxzZSB3aWxsIHVwZGF0ZSB0aGUgdGltZW91dCBjYWxsYmFjay4gVGhpcyBtYWtlcyB0aGUKICBidWcgZmFpcmx5IGhhcmQgdG8gcmVwZWF0LgoKICBUaGUgZml4IG1hZGUgdG8gYWRyZXNzIHRoaXMgaXNzdWU6CgogIFdlIGludHJvZHVjZSBhIGxvb3AgaW4gbGliL211bHRpLmMgYXJvdW5kIGFsbCBjYWxscyB0byBtdWx0aV9ydW5zaW5nbGUoKSBhbmQKICBzaW1wbHkgY2hlY2sgZm9yIENVUkxNX0NBTExfTVVMVElfUEVSRk9STSBpbnRlcm5hbGx5LiBUaGlzIGhhcyB0aGUgYWRkZWQKICBiZW5lZml0IHRoYXQgdGhpcyBnb2VzIGluIGxpbmUgd2l0aCBteSBsb25nLXRlcm0gd2lzaGVzIHRvIGdldCByaWQgb2YgdGhlCiAgQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNIGFsbCB0b2dldGhlciBmcm9tIHRoZSBwdWJsaWMgQVBJLgoKICBUaGUgZG93bnNpZGUgb2YgdGhpcyBmaXgsIGlzIHRoYXQgdGhlIGNvdW50ZXIgd2UgcmV0dXJuIGluICdydW5uaW5nX2hhbmRsZXMnCiAgaW4gc2V2ZXJhbCBvZiBvdXIgcHVibGljIGZ1bmN0aW9ucyB0aGVuIGdldHMgYSBzbGlnaHRseSBuZXcgYW5kIHBvc3NpYmx5CiAgY29uZnVzaW5nIGJlaGF2aW9yIGR1cmluZyB0aW1lczoKCiAgSWYgYW4gYXBwIGFkZHMgYSBoYW5kbGUgdGhhdCBmYWlscyB0byBjb25uZWN0ICh2ZXJ5IHF1aWNrbHkpIGl0IG1heSBqdXN0CiAgYXMgd2VsbCBuZXZlciBhcHBlYXIgYXMgYSAncnVubmluZ19oYW5kbGUnIHdpdGggdGhpcyBmaXguIFByZXZpb3VzbHkgaXQKICB3b3VsZCBmaXJzdCBidW1wIHRoZSBjb3VudGVyIG9ubHkgdG8gZ2V0IGl0IGRlY3JlYXNlZCBhZ2FpbiBhdCBuZXh0IGNhbGwuCiAgRXZlbiBJIGhhdmUgdXNlZCB0aGF0IGNoYW5nZSBpbiBoYW5kbGUgY291bnRlciB0byBzaWduYWwgImVuZCBvZiBhCiAgdHJhbnNmZXIiLiBUaGUgb25seSAqZ29vZCogd2F5IHRvIGZpbmQgdGhlIGVuZCBvZiBhIGluZGl2aWR1YWwgdHJhbnNmZXIKICBpcyBjYWxsaW5nIGN1cmxfbXVsdGlfaW5mb19yZWFkKCkgdG8gc2VlIGlmIGl0IHJldHVybnMgb25lLgoKICBPZiBjb3Vyc2UsIGlmIHRoZSBhcHAgcHJldmlvdXNseSBkaWQgdGhlIGxvb3BpbmcgYmVmb3JlIGl0IGNoZWNrZWQgdGhlCiAgY291bnRlciwgaXQgcmVhbGx5IHNob3VsZG4ndCBiZSBhbnkgbmV3IGVmZmVjdC4KCllhbmcgVHNlICgyNiBKYW4gMjAxMCkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcycgYW5kIEpvc2h1YSBLd2FuJ3Mgd29yayBkb25lIGluIHRoZSBsYXN0IGZvdXIgbW9udGhzCiAgcmVsYXRpdmUgdG8gdGhlIGFzeW5jaHJvbm91cyBETlMgbG9va3VwcywgYWxvbmcgd2l0aCB3aXRoIHNvbWUgaW50ZWdyYXRpb24KICBhZGp1c3RtZW50cyBJIGhhdmUgZG9uZSBhcmUgZmluYWxseSBjb21taXR0ZWQgdG8gQ1ZTLgoKICBDdXJyZW50bHkgdGhlc2UgZW5oYW5jZW1lbnRzIHdpbGwgYmVuZWZpdCBidWlsZHMgZG9uZSB1c2luZyBjLWFyZXMgb24gYW55CiAgcGxhdGZvcm0gYXMgd2VsbCBhcyBXaW5kb3dzIGJ1aWxkcyB1c2luZyB0aGUgZGVmYXVsdCB0aHJlYWRlZCByZXNvbHZlci4KCiAgVGhpcyByZWxlYXNlIGRvZXMgbm90IG1ha2UgZ2VuZXJhbGx5IGF2YWlsYWJsZSBQT1NJWCB0aHJlYWRlZCBETlMgbG9va3VwcwogIHlldC4gVGhlcmUgaXMgbm8gY29uZmlndXJlIG9wdGlvbiB0byBlbmFibGUgdGhpcyBmZWF0dXJlIHlldC4gSXQgaXMgcG9zc2libGUKICB0byBleHBlcmltYW50YWxseSB0cnkgdGhpcyBmZWF0dXJlIHJ1bm5pbmcgY29uZmlndXJlIHdpdGggY29tcGlsZXIgZmxhZ3MgdGhhdAogIG1ha2Ugc2ltdWx0YW5lb3VzIGRlZmluaXRpb24gb2YgcHJlcHJvY2Vzc29yIHN5bWJvbHMgVVNFX1RIUkVBRFNfUE9TSVggYW5kCiAgSEFWRV9QVEhSRUFEX0gsIGFzIHdlbGwgYXMgd2hhdGV2ZXIgcmVlbnRyYW5jeSBjb21waWxlciBmbGFncyBhbmQgbGlua2VyIG9uZXMKICBhcmUgcmVxdWlyZWQgdG8gbGluayBhbmQgcHJvcGVybHkgdXNlIHB0aHJlYWRfKiBmdW5jdGlvbnMgb24gZWFjaCBwbGF0Zm9ybS4KCkRhbmllbCBTdGVuYmVyZyAoMjYgSmFuIDIwMTApCi0gTWlrZSBDcm93ZSBtYWRlIGxpYmN1cmwgcmV0dXJuIENVUkxFX0NPVUxETlRfUkVTT0xWRV9QUk9YWSB3aGVuIGl0IGlzIHRoZQogIHByb3h5IHRoYXQgY2Fubm90IGJlIHJlc29sdmVkIHdoZW4gdXNpbmcgYy1hcmVzLiBUaGlzIG1hdGNoZXMgdGhlIGJlaGF2aW91cgogIHdoZW4gbm90IHVzaW5nIGMtYXJlcy4KCkJq9nJuIFN0ZW5iZXJnICgyMyBKYW4gMjAxMCkKLSBBZGRlZCBhIG5ldyBmbGFnOiAtSi8tLXJlbW90ZS1oZWFkZXItbmFtZS4gVGhpcyBvcHRpb24gdGVsbHMgdGhlCiAgLU8vLS1yZW1vdGUtbmFtZSBvcHRpb24gdG8gdXNlIHRoZSBzZXJ2ZXItc3BlY2lmaWVkIENvbnRlbnQtRGlzcG9zaXRpb24KICBmaWxlbmFtZSBpbnN0ZWFkIG9mIGV4dHJhY3RpbmcgYSBmaWxlbmFtZSBmcm9tIHRoZSBVUkwuCgpEYW5pZWwgU3RlbmJlcmcgKDIxIEphbiAyMDEwKQotIENocmlzIENvbnJveSBicm91Z2h0IHN1cHBvcnQgZm9yIFJUU1AgdHJhbnNmZXJzLCBhbmQgd2l0aCBpdCBjb21lcyA4KCEpIG5ldwogIGxpYmN1cmwgb3B0aW9ucyBmb3IgY29udHJvbGxpbmcgd2hhdCB0byBnZXQgYW5kIGhvdyB0byByZWNlaXZlIHBvc3NzaWJseQogIGludGVybGVhdmVkIFJUUCBkYXRhLgoKRGFuaWVsIFN0ZW5iZXJnICgyMCBKYW4gMjAxMCkKLSBBcyB3YXMgcG9pbnRlZCBvdXQgb24gdGhlIGh0dHAtc3RhdGUgbWFpbGluZyBsaXN0LCB0aGUgb3JkZXIgb2YgY29va2llcyBpbiBhCiAgSFRUUCBDb29raWU6IGhlYWRlciBfbmVlZHNfIHRvIGJlIHNvcnRlZCBvbiB0aGUgcGF0aCBsZW5ndGggaW4gdGhlIGNhc2VzCiAgd2hlcmUgdHdvIGNvb2tpZXMgdXNpbmcgdGhlIHNhbWUgbmFtZSBhcmUgc2V0IG1vcmUgdGhhbiBvbmNlIHVzaW5nCiAgKG92ZXJsYXBwaW5nKSBwYXRocy4gUmVhbGl6aW5nIHRoaXMsIGlkZW50aWNhbGx5IG5hbWVkIGNvb2tpZXMgbXVzdCBiZQogIHNvcnRlZCBjb3JyZWN0bHkuIEJ1dCBkZXRlY3Rpbmcgb25seSBpZGVudGljYWxseSBuYW1lZCBjb29raWVzIGFuZCB0YWtlIGNhcmUKICBvZiB0aGVtIGluZGl2aWR1YWxseSBpcyBoYXJkZXIgdGhhbiBqdXN0IHRvIGJsaW5kbHkgYW5kIHVuY29uZGl0aW9uYWxseSBzb3J0CiAgYWxsIGNvb2tpZXMgYmFzZWQgb24gdGhlaXIgcGF0aCBsZW5ndGhzLiBBbGwgbWFqb3IgYnJvd3NlcnMgYWxzbyBhbHJlYWR5IGRvCiAgdGhpcywgc28gdGhpcyBtYWtlcyBvdXIgYmVoYXZpb3Igb25lIHN0ZXAgY2xvc2VyIHRvIHRoZW0gaW4gdGhlIGNvb2tpZSBhcmVhLgoKICBUZXN0IGNhc2UgOCB3YXMgdGhlIG9ubHkgb25lIHRoYXQgYnJva2UgZHVlIHRvIHRoaXMgY2hhbmdlIGFuZCBJIHVwZGF0ZWQgaXQKICBhY2NvcmRpbmdseS4KCkRhbmllbCBTdGVuYmVyZyAoMTkgSmFuIDIwMTApCi0gRGF2aWQgTWNDcmVlZHkgYnJvdWdodCBhIGZpeCBhbmQgYSBuZXcgdGVzdCBjYXNlICgxMjkpIHRvIG1ha2UgbGliY3VybCB3b3JrCiAgYWdhaW4gd2hlbiBkb3dubG9hZGluZyBmaWxlcyBvdmVyIEZUUCB1c2luZyBBU0NJSSBhbmQgaXQgdHVybnMgb3V0IHRoYXQgdGhlCiAgZmluYWwgc2l6ZSBvZiB0aGUgZmlsZSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGluaXRpYWwgc2l6ZSB0aGUgc2VydmVyCiAgcmVwb3J0ZWQuIFRoaXMgaXMgdmVyeSBjb21tb24gc2luY2Ugc2VydmVycyBkb24ndCB0YWtlIHRoZSBuZXdsaW5lCiAgY29udmVyc2lvbnMgaW50byBhY2NvdW50LgoKS2FtaWwgRHVka2EgKDE0IEphbiAyMDEwKQotIFN1cHByZXNzZWQgc2lkZSBlZmZlY3Qgb2YgT3BlblNTTCBjb25maWd1cmUgY2hlY2tzLCB3aGljaCBwcmV2ZW50ZWQgTlNTIGZyb20KICBiZWluZyBwcm9wZXJseSBkZXRlY3RlZCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMuIEl0IGhhZCBiZWVuIGNhdXNlZCBieQogIHN0cmFuZ2UgYmVoYXZpb3Igb2YgcGtnLWNvbmZpZyB3aGVuIGhhbmRsaW5nIFBLR19DT05GSUdfTElCRElSLiBwa2ctY29uZmlnCiAgZGlzdGluZ3Vpc2hlcyBhbW9uZyBlbXB0eSBhbmQgbm9uLWV4aXN0ZW50IGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoYXQgY2FzZS4KCkRhbmllbCBTdGVuYmVyZyAoMTIgSmFuIDIwMTApCi0gR2lsIFdlYmVyIHJlcG9ydGVkIGEgcGVjdWxpYXIgZmxhdyB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2hlbiBkb2luZyBTRlRQCiAgdHJhbnNmZXJzOiBjdXJsX211bHRpX2Zkc2V0KCkgd291bGQgcmV0dXJuIC0xIGFuZCBub3Qgc2V0IGFuZCBmaWxlCiAgZGVzY3JpcHRvcnMgc2V2ZXJhbCB0aW1lcyBkdXJpbmcgYSB0cmFuc2ZlciBvZiBhIHNpbmdsZSBmaWxlLiBJdCB0dXJuZWQgb3V0CiAgdG8gYmUgZHVlIHRvIHR3byBkaWZmZXJlbnQgZmxhd3Mgbm93IGZpeGVkLiBHaWwncyBleGNlbGxlbnQgcmVjaXBlIGhlbHBlZCBtZQogIG5haWwgdGhpcy4KCkRhbmllbCBTdGVuYmVyZyAoMTEgSmFuIDIwMTApCi0gTWFkZSBzdXJlIHRoYXQgdGhlIHByb2dyZXNzIGNhbGxiYWNrIGlzIHJlcGVhdGVkbHkgY2FsbGVkIGF0IGEgcmVndWxhcgogIGludGVydmFsIGV2ZW4gZHVyaW5nIHZlcnkgc2xvdyBjb25uZWN0cy4KCi0gVGhlIHRlc3RzL3J1bnRlc3RzLnBsIHNjcmlwdCBub3cgY2hlY2tzIHRvIHNlZSBpZiB0aGUgdGVzdCBjYXNlIHRoYXQgcnVucyBpcwogIHByZXNlbnQgaW4gdGhlIHRlc3RzL2RhdGEvTWFrZWZpbGUuYW0gYW5kIG91dHB1dHMgYSBub3RpY2UgbWVzc2FnZSBvbiB0aGUKICBzY3JlZW4gaWYgbm90LiBFYWNoIHRlc3QgZmlsZSBoYXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhhdCBNYWtlZmlsZS5hbSB0byBnZXQKICBpbmNsdWRlZCBpbiByZWxlYXNlIGFyY2hpdmVzIGFuZCBmb3JnZXR0aW5nIHRvIGFkZCBmaWxlcyB0aGVyZSBpcyBhIGNvbW1vbgogIG1pc3Rha2UuIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBtYWtlIGl0IGhhcmRlciB0byBmb3JnZXQuCgpEYW5pZWwgU3RlbmJlcmcgKDkgSmFuIDIwMTApCi0gSm9oYW4gdmFuIFNlbHN0IGZvdW5kIGFuZCBmaXhlZCBhIE9wZW5TU0wgc2Vzc2lvbiByZWYgY291bnQgbGVhazoKCiAgb3NzbF9jb25uZWN0X3N0ZXAzKCkgaW5jcmVtZW50cyBhbiBTU0wgc2Vzc2lvbiBoYW5kbGUgcmVmZXJlbmNlIGNvdW50ZXIgb24KICBlYWNoIGNhbGwuIFdoZW4gc2Vzc2lvbnMgYXJlIHJlLXVzZWQgdGhpcyByZWZlcmVuY2UgY291bnRlciBtYXkgYmUKICBpbmNyZW1lbnRlZCBtYW55IHRpbWVzLCBidXQgaXQgd2lsbCBiZSBkZWNyZW1lbnRlZCBvbmx5IG9uY2Ugd2hlbiBkb25lIChieQogIEN1cmxfb3NzbF9zZXNzaW9uX2ZyZWUoKSk7IGFuZCB0aGUgaW50ZXJuYWwgT3BlblNTTCBkYXRhIHdpbGwgbm90IGJlIGZyZWVkCiAgaWYgdGhpcyByZWZlcmVuY2UgY291bnQgcmVtYWlucyBwb3NpdGl2ZS4gV2hlbiBhIHNlc3Npb24gaXMgcmUtdXNlZCB0aGUKICByZWZlcmVuY2UgY291bnRlciBzaG91bGQgYmUgY29ycmVjdGVkIGJ5IGV4cGxpY2l0bHkgY2FsbGluZwogIFNTTF9TRVNTSU9OX2ZyZWUoKSBhZnRlciBlYWNoIGNvbnNlY3V0aXZlIFNTTF9nZXQxX3Nlc3Npb24oKSB0byBhdm9pZAogIGludHJvZHVjaW5nIGEgbWVtb3J5IGxlYWsuCgogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjkyNjI4NCkKCkRhbmllbCBTdGVuYmVyZyAoNyBKYW4gMjAxMCkKLSBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGNhbGxiYWNrIGlzIGNhbGxlZCByZXBlYXRlZGx5IGV2ZW4gZHVyaW5nIHZlcnkgc2xvdwogIG5hbWUgcmVzb2x2ZXMgd2hlbiBjLWFyZXMgaXMgdXNlZCBmb3IgcmVzb2x2aW5nLgoKQ2xhZXMgSmFrb2Jzc29uICg2IEphbiAyMDEwKQotIEp1bGllbiBDaGFmZnJhaXggZml4ZWQgc28gdGhhdCB0aGUgZnJhZ21lbnQgcGFydCBpbiBhbiBVUkwgaXMgbm90IHNlbnQKICB0byB0aGUgc2VydmVyIGFueW1vcmUuCgpLYW1pbCBEdWRrYSAoMyBKYW4gMjAxMCkKLSBKdWxpZW4gQ2hhZmZyYWl4IGVsaW1pbmF0ZWQgYSBkdXBsaWNhdGVkIGluaXRpYWxpemF0aW9uIGluIHNpbmdsZXNvY2tldCgpLgoKRGFuaWVsIFN0ZW5iZXJnICgyIEphbiAyMDEwKQotIE1ha2UgY3VybCBzdXBwb3J0IC0tc3NsIGFuZCAtLXNzbC1yZXFkIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIEZUUC1zcGVjaWZpYwogIHZlcnNpb25zIC0tZnRwLXNzbCBhbmQgLS1mdHAtc3NsLXJlcWQgYXMgdGhlc2Ugb3B0aW9ucyBhcmUgbm93IHVzZWQgdG8KICBjb250cm9sIFNTTC9UTFMgZm9yIElNQVAsIFBPUDMgYW5kIFNNVFAgYXMgd2VsbCBpbiBhZGRpdGlvbiB0byBGVFAuIFRoZSBvbGQKICBvcHRpb24gbmFtZXMgYXJlIHN0aWxsIHdvcmtpbmcgYnV0IHRoZSBuZXcgb25lcyBhcmUgdGhlIG9uZXMgbGlzdGVkIGFuZAogIGRvY3VtZW50ZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDEgSmFuIDIwMTApCi0gSW5nbWFyIFJ1bmdlIGVuaGFuY2VkIGxpYmN1cmwncyBGVFAgZW5naW5lIHRvIHN1cHBvcnQgdGhlIFBSRVQgY29tbWFuZC4gVGhpcwogIGNvbW1hbmQgaXMgYSBzcGVjaWFsICJoYWNrIiB1c2VkIGJ5IHRoZSBkcmZ0cGQgc2VydmVyLCBidXQgZXZlbiB0aG91Z2ggaXQgaXMKICBhIGN1c3RvbSBleHRlbnNpb24gSSd2ZSBkZWVtZWQgaXQgZmluZSB0byBhZGQgdG8gbGliY3VybCBzaW5jZSB0aGlzIHNlcnZlcgogIHNlZW1zIHRvIHN1cnZpdmUgYW5kIHBlb3BsZSBrZWVwIHVzaW5nIGl0IGFuZCB3YW50IGxpYmN1cmwgdG8gc3VwcG9ydAogIGl0LiBUaGUgbmV3IGxpYmN1cmwgb3B0aW9uIGlzIG5hbWVkIENVUkxPUFRfRlRQX1VTRV9QUkVULCBhbmQgaXQgaXMgYWxzbwogIHVzYWJsZSBmcm9tIHRoZSBjdXJsIHRvb2wgd2l0aCAtLWZ0cC1wcmV0LiBVc2luZyB0aGlzIG9wdGlvbiBvbiBhIHNlcnZlcgogIHRoYXQgZG9lc24ndCBzdXBwb3J0IHRoaXMgY29tbWFuZCB3aWxsIG1ha2UgbGliY3VybCBmYWlsLgoKICBJIGFkZGVkIHRlc3QgY2FzZXMgMTEwNyBhbmQgMTEwOCB0byB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgogIFRoZSBQUkVUIGNvbW1hbmQgaXMgZG9jdW1lbnRlZCBhdAogIGh0dHA6Ly93d3cuZHJmdHBkLm9yZy9pbmRleC5waHAvRGlzdHJpYnV0ZWRfUEFTVgoKWWFuZyBUc2UgKDMwIERlYyAyMDA5KQotIFN0ZXZlbiBNLiBTY2h3ZWRhIGltcHJvdmVkIFZNUyBidWlsZCBzeXN0ZW0sIGFuZCBDcmFpZyBBLiBCZXJyeSBoZWxwZWQKICB3aXRoIHRoZSBwYXRjaCBhbmQgdGVzdGluZy4KCkRhbmllbCBTdGVuYmVyZyAoMjYgRGVjIDIwMDkpCi0gUmVuYXRvIEJvdGVsaG8gYW5kIFBldGVyIFBlbnRjaGV2IGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2VzIHRoZSBsaWJjdXJsCiAgaGVhZGVycyB3b3JrIGNvcnJlY3RseSBldmVuIG9uIEZyZWVCU0Qgc3lzdGVtcyBiZWZvcmUgdjguCgogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjkxNjkxNSkKCkRhbmllbCBTdGVuYmVyZyAoMTcgRGVjIDIwMDkpCi0gRGF2aWQgQnlyb24gZml4ZWQgQ3VybF9vc3NsX2NsZWFudXAgdG8gYWN0dWFsbHkgY2FsbCBFTkdJTkVfY2xlYW51cCB3aGVuCiAgYXZhaWxhYmxlLgoKLSBGb2xsb3ctdXAgZml4IGZvciB0aGUgcHJveHkgZml4IEkgZGlkIGZvciBKb24gTmVsc29uJ3MgYnVnLiBJdCB0dXJuZWQgb3V0IEkKICB3YXMgYSBiaXQgdG9vIHF1aWNrIGFuZCBicm9rZSB0ZXN0IGNhc2UgMTEwMSB3aXRoIHRoYXQgY2hhbmdlLiBUaGUgb3JkZXIgb2YKICBzb21lIG9mIHRoZSBzZXR1cHMgaXMgc2Vuc2l0aXZlLiBJIG5vdyBjaGFuZ2VkIGl0IHNsaWdodGx5IGFnYWluIHRvIG1ha2UKICBzdXJlIHdlIGRvIHRoZW0gaW4gdGhpcyBvcmRlcjoKCiAgMSAtIHBhcnNlIFVSTCBhbmQgZmlndXJlIG91dCB3aGF0IHByb3RvY29sIGlzIHVzZWQgaW4gdGhlIFVSTAogIDIgLSBwcmVwZW5kIHByb3RvY29sOi8vIHRvIFVSTCBpZiBtaXNzaW5nCiAgMyAtIHBhcnNlIG5hbWUrcGFzc3dvcmQgb2ZmIFVSTCwgd2hpY2ggbmVlZHMgdG8ga25vdyB3aGF0IHByb3RvY29sIGlzIHVzZWQKICAgICAgKHNpbmNlIG9ubHkgc29tZSBhbGxvd3MgZm9yIG5hbWUrcGFzc3dvcmQgaW4gdGhlIFVSTCkKICA0IC0gZmlndXJlIG91dCBpZiBhIHByb3h5IHNob3VsZCBiZSB1c2VkIHNldCBieSBhbiBvcHRpb24KICA1IC0gaWYgbm8gcHJveHkgb3B0aW9uLCBjaGVjayBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKICA2IC0gcnVuIHRoZSBwcm90b2NvbC1zcGVjaWZpYyBzZXR1cCBmdW5jdGlvbiwgd2hpY2ggbmVlZHMgdG8gaGF2ZSB0aGUgcHJveHkKICAgICAgYWxyZWFkeSBzZXQKCkRhbmllbCBTdGVuYmVyZyAoMTUgRGVjIDIwMDkpCi0gSm9uIE5lbHNvbiBmb3VuZCBhIHJlZ3Jlc3Npb24gdGhhdCB0dXJuZWQgb3V0IHRvIGJlIGEgZmxhdyBpbiBob3cgbGliY3VybAogIGRldGVjdHMgYW5kIHVzZXMgcHJveGllcyBiYXNlZCBvbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBJZiB0aGUgcHJveHkKICB3YXMgZ2l2ZW4gYXMgYW4gZXhwbGljaXQgb3B0aW9uIGl0IHdvcmtlZCwgYnV0IGR1ZSB0byB0aGUgc2V0dXAgb3JkZXIKICBtaXN0YWtlIHByb3hpZXMgd291bGQgbm90IGJlIHVzZWQgZmluZSBmb3IgYSBmZXcgcHJvdG9jb2xzIHdoZW4gcGlja2VkIHVwCiAgZnJvbSAnW3Byb3RvY29sXV9wcm94eScuIE9idmlvdXNseSB0aGlzIGJyb2tlIGFmdGVyIDcuMTkuNC4gSSBub3cgYWxzbyBhZGRlZAogIHRlc3QgY2FzZSAxMTA2IHRoYXQgdmVyaWZpZXMgdGhpcyBmdW5jdGlvbmFsaXR5LgoKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5MTM4ODYpCgpEYW5pZWwgU3RlbmJlcmcgKDEyIERlYyAyMDA5KQotIElNQVAsIFBPUDMgYW5kIFNNVFAgc3VwcG9ydCBhbmQgdGhlaXIgVExTIHZlcnNpb25zIChpbmNsdWRpbmcgSU1BUFMsIFBPUDNTCiAgYW5kIFNNVFBTKSBhcmUgbm93IHN1cHBvcnRlZC4gVGhlIGN1cnJlbnQgc3RhdGUgbWF5IG5vdCB5ZXQgYmUgc29saWQsIGJ1dAogIHRoZSBmb3VuZGF0aW9uIGlzIGluIHBsYWNlIGFuZCB0aGUgdGVzdCBzdWl0ZSBoYXMgc29tZSBpbml0aWFsIHN1cHBvcnQgZm9yCiAgdGhlc2UgcHJvdG9jb2xzLiBXb3JrIHdpbGwgbm93IHBlcnN1ZSB0byBtYWtlIHRoZW0gbmljZSBsaWJjdXJsIGNpdGl6ZW5zCiAgdW50aWwgcmVsZWFzZS4KCiAgVGhlIHdvcmsgd2l0aCBzdXBwb3J0aW5nIHRoZXNlIG5ldyBwcm90b2NvbHMgd2FzIHNwb25zb3JlZCBieQogIG5ldHdvcmtpbmc0YWxsLmNvbSAtIHRoYW5rcyEKCkRhbmllbCBTdGVuYmVyZyAoMTAgRGVjIDIwMDkpCi0gU2llZ2ZyaWVkIEd5dXJpY3NrbyBmb3VuZCBvdXQgdGhhdCB0aGUgY3VybCBtYW51YWwgc2FpZCAtLXJldHJ5IHdvdWxkIHJldHJ5CiAgb24gRlRQIGVycm9ycyBpbiB0aGUgdHJhbnNpZW50IDV4eCByYW5nZS4gVHJhbnNpZW50IEZUUCBlcnJvcnMgYXJlIGluIHRoZQogIDR4eCByYW5nZS4gVGhlIGNvZGUgaXRzZWxmIG9ubHkgdHJpZWQgb24gNXh4IGVycm9ycyB0aGF0IG9jY3VyZWQgX2F0IGxvZ2luXy4KICBOb3cgdGhlIHJldHJ5IGNvZGUgcmV0cmllcyBvbiBhbGwgRlRQIHRyYW5zZmVyIGZhaWx1cmVzIHRoYXQgZW5kZWQgd2l0aCBhCiAgNHh4IHJlc3BvbnNlLgoKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5MTEyNzkpCgotIENvbnN0YW50aW5lIFNhcHVudHpha2lzIGZpZ3VyZWQgb3V0IGEgY2FzZSB3aGljaCB3b3VsZCBsZWFkIHRvIGxpYmN1cmwKICBhY2Nlc3NpbmcgYWxyZWR5IGZyZWVkIG1lbW9yeSBhbmQgdGh1cyBjcmFzaCB3aGVuIHVzaW5nIEhUVFBTICh3aXRoCiAgT3BlblNTTCksIG11bHRpIGludGVyZmFjZSBhbmQgdGhlIENVUkxPUFRfREVCVUdGVU5DVElPTiBhbmQgYSBjZXJ0YWluIG9yZGVyCiAgb2YgY2xlYW5pbmcgdGhpbmdzIHVwLiBJIGZpeGVkIGl0LgoKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5MDUyMjApCgpEYW5pZWwgU3RlbmJlcmcgKDcgRGVjIDIwMDkpCi0gTWFydGluIFN0b3Jzam8gbWFkZSBsaWJjdXJsIHVzZSB0aGUgRXhwZWN0OiAxMDAtY29udGludWUgaGVhZGVyIGZvciBwb3N0cwogIHdpdGggdW5rbm93biBzaXplLiBQcmV2aW91c2x5IGl0IHdhcyBvbmx5IHVzZWQgZm9yIHBvc3RzIHdpdGggYSBrbm93biBzaXplCiAgbGFyZ2VyIHRoYW4gMTAyNCBieXRlcy4KCkRhbmllbCBTdGVuYmVyZyAoMSBEZWMgMjAwOSkKLSBJZiB0aGUgRXhwZWN0OiAxMDAtY29udGludWUgaGVhZGVyIGhhcyBiZWVuIHNldCBieSB0aGUgYXBwbGljYXRpb24gdGhyb3VnaAogIGN1cmxfZWFzeV9zZXRvcHQgd2l0aCBDVVJMT1BUX0hUVFBIRUFERVIsIHRoZSBsaWJyYXJ5IHNob3VsZCBzZXQKICBkYXRhLT5zdGF0ZS5leHBlY3QxMDBoZWFkZXIgYWNjb3JkaW5nbHkgLSB0aGUgY3VycmVudCBjb2RlIChpbiA3LjE5LjcgYXQKICBsZWFzdCkgZG9lc24ndCBoYW5kbGUgdGhpcyBwcm9wZXJseS4gTWFydGluIFN0b3Jzam8gcHJvdmlkZWQgdGhlIGZpeCEKCllhbmcgVHNlICgyOCBOb3YgMjAwOSkKLSBBZGRlZCBEaWZmaWUtSGVsbG1hbiBwYXJhbWV0ZXJzIHRvIHNldmVyYWwgdGVzdCBoYXJuZXNzIGNlcnRpZmljYXRlIGZpbGVzIGluCiAgUEVNIGZvcm1hdC4gUmVxdWlyZWQgYnkgc2V2ZXJhbCBzdHVubmVsIHZlcnNpb25zIHVzZWQgYnkgb3VyIHRlc3QgaGFybmVzcy4KCkRhbmllbCBTdGVuYmVyZyAoMjggTm92IDIwMDkpCi0gTWFya3VzIEtvZXR0ZXIgcHJvdmlkZWQgYSBwb2xpc2hlZCBhbmQgdXBkYXRlZCB2ZXJzaW9uIG9mIENoYWQgTW9ucm9lJ3MgVEZUUAogIHJld29yayBwYXRjaCB0aGF0IG5vdyBpbnRlZ3JhdGVzIFRGVFAgcHJvcGVybHkgaW50byBsaWJjdXJsIHNvIHRoYXQgaXQgY2FuCiAgYmUgdXNlZCBub24tYmxvY2tpbmcgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBtb3JlLiBCTEtTSVpFIGFsc28gd29ya3MuCgogIFRoZSAtLXRmdHAtYmxrc2l6ZSBvcHRpb24gd2FzIGFkZGVkIHRvIGFsbG93IHNldHRpbmcgdGhlIFRGVFAgQkxLU0laRSBmcm9tCiAgdGhlIGNvbW1hbmQgbGluZS4KCkRhbmllbCBTdGVuYmVyZyAoMjYgTm92IDIwMDkpCi0gRXh0ZW5kZWQgYW5kIGZpeGVkIHRoZSBjaGFuZ2UgSSBkaWQgb24gRGVjIDExIGZvciB0aGUgdGhlIHByb2dyZXNzCiAgbWV0ZXIvY2FsbGJhY2sgZHVyaW5nIEZUUCBjb21tYW5kL3Jlc3BvbnNlIHNlcXVlbmNlcy4gSXQgdHVybmVkIG91dCBpdCB3YXMKICByZWFsbHkgbGFtZSBiZWZvcmUgYW5kIG5vdyB0aGUgcHJvZ3Jlc3MgbWV0ZXIgU0hPVUxEIGdldCBjYWxsZWQgYXQgbGVhc3QKICBvbmNlIHBlciBzZWNvbmQuCgpEYW5pZWwgU3RlbmJlcmcgKDIzIE5vdiAyMDA5KQotIEJqb3JuIEF1Z3VzdHNzb24gcmVwb3J0ZWQgYSBidWcgd2hpY2ggbWFkZSBjdXJsIG5vdCByZXBvcnQgYW55IHByb2JsZW1zIGV2ZW4KICB0aG91Z2ggaXQgZmFpbGVkIHRvIHdyaXRlIGEgdmVyeSBzbWFsbCBkb3dubG9hZCB0byBkaXNrIChkb25lIGluIGEgc2luZ2xlCiAgZndyaXRlIGNhbGwpLiBJdCB0dXJuZWQgb3V0IHRvIGJlIGJlY2F1c2UgZndyaXRlKCkgcmV0dXJuZWQgc3VjY2VzcywgYnV0CiAgdGhlcmUgd2FzIGluc3VmZmljaWVudCBlcnJvci1jaGVja2luZyBmb3IgdGhlIGZjbG9zZSgpIGNhbGwgd2hpY2ggdHJpY2tlZAogIGN1cmwgdG8gYmVsaWV2ZSB0aGluZ3Mgd2VyZSBmaW5lLgoKWWFuZyBUc2UgKDIzIE5vdiAyMDA5KQotIERhdmlkIEJ5cm9uIG1vZGlmaWVkIE1ha2VmaWxlLmRpc3QgdmM4IGFuZCB2YzkgdGFyZ2V0cyBpbiBvcmRlciB0byBhbGxvdwogIGZpbmVyIGdyYW51bGFyaXR5IGNvbnRyb2wgd2hlbiBnZW5lcmF0aW5nIHNyYyBhbmQgbGliIG1ha2VmaWxlcy4KCllhbmcgVHNlICgyMiBOb3YgMjAwOSkKLSBJIG1vZGlmaWVkIGNvbmZpZ3VyZSB0byBmb3JjZSByZW1vdmFsIG9mIHRoZSBjdXJsYnVpbGQuaCBmaWxlIGluY2x1ZGVkIGluCiAgZGlzdHJpYnV0aW9uIHRhcmJhbGxzIGZvciB1c2UgYnkgbm9uLWNvbmZpZ3VyZSBzeXN0ZW1zLiBBcyBpbnRlbmRlZCwgdGhpcwogIHdvdWxkIGdldCBvdmVyd3JpdGVuIHdoZW4gZG9pbmcgaW4tdHJlZSBidWlsZHMuIEJ1dCBWUEFUSCBidWlsZHMgd291bGQgZW5kCiAgaGF2aW5nIHR3byBjdXJsYnVpbGQuaCBmaWxlcywgb25lIGluIHRoZSBzb3VyY2UgdHJlZSBhbmQgYW5vdGhlciBpbiB0aGUKICBidWlsZCB0cmVlLiBXaXRoIHRoZSBtb2RpZmljYXRpb24gSSBpbnRyb2R1Y2VkIDUgTm92IDIwMDkgdGhpcyBjb3VsZCBiZWNvbWUKICBhbiBpc3N1ZSB3aGVuIHJ1bm5pbmcgbGliY3VybCdzIHRlc3Qgc3VpdGUuCgpEYW5pZWwgU3RlbmJlcmcgKDIwIE5vdiAyMDA5KQotIENvbnN0YW50aW5lIFNhcHVudHpha2lzIGlkZW50aWZpZWQgYSB3cml0ZSBhZnRlciBjbG9zZSwgYXMgdGhlIHNvY2tldHMgd2VyZQogIGNsb3NlZCBieSBsaWJjdXJsIGJlZm9yZSB0aGUgU1NMIGxpYiB3ZXJlIHNodXRkb3duIGFuZCB0aGV5IG1heSB3cml0ZSB0byBpdHMKICBzb2NrZXQuIERldGVjdGVkIHRvIGF0IGxlYXN0IGhhcHBlbiB3aXRoIE9wZW5TU0wgYnVpbGRzLgoKLSBKYWQgQ2hhbWNoYW0gcG9pbnRlZCBvdXQgYSBidWcgd2l0aCBjb25uZWN0aW9uIHJlLXVzZS4gSWYgYSBjb25uZWN0aW9uIGhhZAogIENVUkxPUFRfSFRUUFBST1hZVFVOTkVMIGVuYWJsZWQgb3ZlciBhIHByb3h5LCBhIHN1YnNlcXVlbnQgcmVxdWVzdCB1c2luZyB0aGUKICBzYW1lIHByb3h5IHdpdGggdGhlIHR1bm5lbCBvcHRpb24gZGlzYWJsZWQgd291bGQgc3RpbGwgd3JvbmdseSByZS11c2UgdGhhdAogIHByZXZpb3VzIGNvbm5lY3Rpb24gYW5kIHRoZSBvdXRjb21lIHdvdWxkIG9ubHkgYmUgYmFkbmVzcy4KCllhbmcgVHNlICgxOCBOb3YgMjAwOSkKLSBJIG1vZGlmaWVkIHRoZSBtZW1vcnkgdHJhY2tpbmcgc3lzdGVtIHRvIG1ha2UgaXQgaW50b2xlcmFudCB3aXRoIHplcm8gc2l6ZWQKICBtYWxsb2MoKSwgY2FsbG9jKCkgYW5kIHJlYWxsb2MoKSBmdW5jdGlvbiBjYWxscy4KCkRhbmllbCBTdGVuYmVyZyAoMTcgTm92IDIwMDkpCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgcHJvdmlkZWQgYW5vdGhlciBmaXggZm9yIHRoZSBETlMgY2FjaGUgdGhhdCBjb3VsZAogIGVuZCB1cCB3aXRoIGVudHJpZXMgdGhhdCB3b3VsZG4ndCB0aW1lLW91dDoKCiAgMS4gU2V0IHVwIGEgZmlyc3Qgd2ViIHNlcnZlciB0aGF0IHJlZGlyZWN0cyAoMzA3KSB0byBhIGh0dHA6Ly9zZXJ2ZXI6cG9ydAogICAgIHRoYXQncyBkb3duCiAgMi4gSGF2ZSBjdXJsIGNvbm5lY3QgdG8gdGhlIGZpcnN0IHdlYiBzZXJ2ZXIgdXNpbmcgY3VybCBtdWx0aQoKICBBZnRlciB0aGUgY3VybF9lYXN5X2NsZWFudXAgY2FsbCwgdGhlcmUgd2lsbCBiZSBjdXJsIGRucyBlbnRyaWVzIGhhbmdpbmcKICBhcm91bmQgd2l0aCBpbl91c2UgIT0gMC4KCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODkxNTkxKQoKLSBNYXJjIEtsZWluZS1CdWRkZSBmaXhlZDogY3VybCBzYXZlZCB0aGUgTERGTEFHUyBzZXQgZHVyaW5nIGNvbmZpZ3VyZSBpbnRvCiAgaXRzIHBrZy1jb25maWcgZmlsZS4gIFNvIC1XbCBzdHVmZiBlbmRlZCB1cCBpbiB0aGUgLnBjIGZpbGUsIHdoaWNoIGlzIHJlYWxseQogIGJhZCwgYW5kIGJyZWFrcyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgLVdsIGluIG91ciBMREZMQUdTICh3aGljaCBhcmUgaW4KICBQVFhkaXN0KS4gYnVnICMyODkzNTkyIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjg5MzU5MikKCkthbWlsIER1ZGthICgxNSBOb3YgMjAwOSkKLSBEYXZpZCBCeXJvbiBpbXByb3ZlZCB0aGUgY29uZmlndXJlIHNjcmlwdCB0byB1c2UgcGtnLWNvbmZpZyB0byBmaW5kIE9wZW5TU0wKICAoYW5kIGluIHBhcnRpY3VsYXIgdGhlIGxpc3Qgb2YgcmVxdWlyZWQgbGlicmFyaWVzKSBldmVuIGlmIGEgcGF0aCBpcyBnaXZlbgogIGFzIGFyZ3VtZW50IHRvIC0td2l0aC1zc2wKCllhbmcgVHNlICgxNSBOb3YgMjAwOSkKLSBJIHJlbW92ZWQgZW5hYmxlLXRocmVhZCAvIGRpc2FibGUtdGhyZWFkIGNvbmZpZ3VyZSBvcHRpb24uIFRoZXNlIHdlcmUgb25seQogIHBsYWNlYm8gb3B0aW9ucy4gVGhlIGxpYnJhcnkgaXMgYWx3YXlzIGJ1aWx0IGFzIHRocmVhZCBzYWZlIGFzIHBvc3NpYmxlIG9uCiAgZXZlcnkgc3lzdGVtLgoKQ2xhZXMgSmFrb2Jzc29uICgxNCBOb3YgMjAwOSkKLSBjdXJsLWNvbmZpZyBub3cgYWNjZXB0cyAnLS1jb25maWd1cmUnIHRvIHNlZSB3aGF0IGFyZ3VtZW50cyB3YXMKICBwYXNzZWQgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hlbiBidWlsZGluZyBjdXJsLgoKRGFuaWVsIFN0ZW5iZXJnICgxNCBOb3YgMjAwOSkKLSBDbGFlcyBKYWtvYnNzb24gcmVzdG9yZWQgdGhlIGNvbmZpZ3VyZSBmdW5jdGlvbmFsaXR5IHRvIGRldGVjdCBOU1Mgd2hlbgogIC0td2l0aC1uc3MgaXMgc2V0IGJ1dCBub3QgInllcyIuCgogIEkgdGhpbmsgd2UgY2FuIHN0aWxsIGltcHJvdmUgdGhhdCB0byBjaGVjayBmb3IgcGtnLWNvbmZpZyBpbiB0aGF0IHBhdGggZXRjLAogIGJ1dCBhdCBsZWFzdCB0aGlzIHBhdGNoIGJyaW5ncyBiYWNrIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgd2UgaGFkIGJlZm9yZS4KCi0gQ2FtaWxsZSBNb25jZWxpZXIgYWRkZWQgc3VwcG9ydCBmb3IgdGhlIGZpbGUgdHlwZSBTU0xfRklMRVRZUEVfRU5HSU5FIGZvcgogIHRoZSBjbGllbnQgY2VydGlmaWNhdGUuIEl0IGFsc28gZGlzYWJsZSB0aGUga2V5IG5hbWUgdGVzdCBhcyBzb21lIGVuZ2luZXMKICBjYW4gc2VsZWN0IGEgcHJpdmF0ZSBrZXkvY2VydCBhdXRvbWF0aWNhbGx5IChXaGVuIHRoZXJlIGlzIG9ubHkgb25lIGtleQogIGFuZC9vciBjZXJ0aWZpY2F0ZSBvbiB0aGUgaGFyZHdhcmUgZGV2aWNlIHVzZWQgYnkgdGhlIGVuZ2luZSkKCllhbmcgVHNlICgxNCBOb3YgMjAwOSkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBwcm92aWRlZCB0aGUgZml4IHRoYXQgZW5zdXJlcyB0aGF0IGFuIFNTTCBjb25uZWN0aW9uCiAgd29uJ3QgYmUgcmV1c2VkIHVubGVzcyBwcm90ZWN0aW9uIGxldmVsIGZvciBwZWVyIGFuZCBob3N0IHZlcmlmaWNhdGlvbiBtYXRjaC4KCiAgSSByZWZhY3RvcmVkIGhvdyBwcmVwcm9jZXNzb3Igc3ltYm9sIF9USFJFQURfU0FGRSBkZWZpbml0aW9uIGlzIGRvbmUuCgpLYW1pbCBEdWRrYSAoMTIgTm92IDIwMDkpCi0gS2V2aW4gQmF1Z2htYW4gcHJvdmlkZWQgYSBmaXggcHJldmVudGluZyBsaWJjdXJsLU5TUyBmcm9tIGNyYXNoIG9uIGRvdWJseQogIGNsb3NlZCBOU1BSIGRlc2NyaXB0b3IuIFRoZSBpc3N1ZSB3YXMgaGFyZCB0byBmaW5kLCByZXBvcnRlZCBzZXZlcmFsIHRpbWVzCiAgYmVmb3JlIGFuZCBhbHdheXMgY2xvc2VkIHVucmVzb2x2ZWQuIE1vcmUgaW5mbyBhdCB0aGUgUkggYnVnOgogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS81MzQxNzYKCi0gbGliY3VybC1OU1Mgbm93IHRyaWVzIHRvIHJlY29ubmVjdCB3aXRoIFRMUyBkaXNhYmxlZCBpbiBjYXNlIGl0IGRldGVjdHMKICBhIGJyb2tlbiBUTFMgc2VydmVyLiBIb3dldmVyIGl0IGRvZXMgbm90IGhhcHBlbiBpZiBTU0wgdmVyc2lvbiBpcyBzZWxlY3RlZAogIG1hbnVhbGx5LiBUaGUgYXBwcm9hY2ggd2FzIG9yaWdpbmFsbHkgdGFrZW4gZnJvbSBQU00uIEthc3BhciBCcmFuZCBoZWxwZWQgbWUKICB0byBjb21wbGV0ZSB0aGUgcGF0Y2guIE9yaWdpbmFsIGJ1ZyByZXBvcnRzOgogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS81MjU0OTYKICBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vNTI3NzcxCgpZYW5nIFRzZSAoMTIgTm92IDIwMDkpCi0gSSBtb2RpZmllZCBjb25maWd1cmUgc2NyaXB0IHRvIG1ha2UgdGhlIGdldGFkZHJpbmZvIGZ1bmN0aW9uIGNoZWNrIGFsc28KICB2ZXJpZnkgaWYgdGhlIGZ1bmN0aW9uIGlzIHRocmVhZCBzYWZlLgoKWWFuZyBUc2UgKDExIE5vdiAyMDA5KQotIE1hcmNvIE1hZ2dpIHJlcG9ydGVkIHRoYXQgY29tcGlsYXRpb24gZmFpbGVkIHdoZW4gY29uZmlndXJlZCAtLXdpdGgtZ3NzYXBpCiAgYW5kIEdOVSBHU1MgaW5zdGFsbGVkIGR1ZSB0byBhIG1pc3NpbmcgbXV0dWFsIGV4Y2x1c2lvbiBvZiBoZWFkZXIgZmlsZXMgaW4KICB0aGUgS2VyYmVyb3MgNSBjb2RlIHBhdGguIEhlIGFsc28gdmVyaWZpZWQgdGhhdCBteSBwYXRjaCB3b3JrZWQgZm9yIGhpbS4KCkRhbmllbCBTdGVuYmVyZyAoMTEgTm92IDIwMDkpCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgcG9zdGVkIGJ1ZyAjMjg5MTU5NQogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjg5MTU5NSkgd2hpY2ggaWRlbnRpZmllZCBob3cgYW4gZW50cnkKICBpbiB0aGUgRE5TIGNhY2hlIHdvdWxkIGxpbmdlciB0b28gbG9uZyBpZiB0aGUgcmVxdWVzdCB0aGF0IGFkZGVkIGl0IHdhcyBpbgogIHVzZSB0aGF0IGxvbmcuIEhlIGFsc28gcHJvdmlkZWQgdGhlIHBhdGNoIHRoYXQgbm93IG1ha2VzIGxpYmN1cmwgY2FwYWJsZSBvZgogIHN0aWxsIGRvaW5nIGEgcmVxdWVzdCB3aGlsZSB0aGUgRE5TIGhhc2ggZW50cnkgbWF5IGdldCB0aW1lZCBvdXQuCgotIENocmlzdGlhbiBTY2htaXR6IG5vdGljZWQgdGhhdCB0aGUgcHJvZ3Jlc3MgbWV0ZXIvY2FsbGJhY2sgd2FzIG5vdCBwcm9wZXJseQogIHVzZWQgZHVyaW5nIHRoZSBGVFAgY29ubmVjdGlvbiBwaGFzZSAoYWZ0ZXIgdGhlIGFjdHVhbCBUQ1AgY29ubmVjdCksIHdoaWxlCiAgaXQgb2YgY291cnNlIHNob3VsZCBiZS4gSSBhbHNvIG1hZGUgdGhlIHNwZWVkIGNoZWNrIGdldCBjYWxsZWQgY29ycmVjdGx5IHNvCiAgdGhhdCByZWFsbHkgc2xvdyBzZXJ2ZXJzIHdpbGwgdHJpZ2dlciB0aGF0IHByb3Blcmx5IHRvby4KCkthbWlsIER1ZGthICg1IE5vdiAyMDA5KQotIERyb3BwZWQgbWlzbGVhZGluZyB0aW1lb3V0cyBpbiBsaWJjdXJsLU5TUyBhbmQgbWFkZSBzdXJlIHRoZSBTU0wgc29ja2V0IHdvcmtzCiAgaW4gbm9uLWJsb2NraW5nIG1vZGUuCgpZYW5nIFRzZSAoNSBOb3YgMjAwOSkKLSBJIHJlbW92ZWQgbGVhZGluZyAnY3VybCcgcGF0aCBvbiB0aGUgJ2N1cmxidWlsZC5oJyBpbmNsdWRlIHN0YXRlbWVudCBpbgogIGN1cmwuaCwgYWRqdXN0aW5nIGF1dG8tbWFrZWZpbGVzIGluY2x1ZGUgcGF0aCwgdG8gZW5oYW5jZSBwb3J0YWJpbGl0eSB0bwogIE9TJ3Mgd2l0aG91dCBhbiBvcnRob2dvbmFsIGRpcmVjdG9yeSB0cmVlIHN0cnVjdHVyZSBzdWNoIGFzIE9TLzQwMC4KCkRhbmllbCBTdGVuYmVyZyAoNCBOb3YgMjAwOSkKLSBJIGZpeGVkIHNldmVyYWwgcHJvYmxlbXMgd2l0aCB0aGUgdHJhbnNmZXIgcHJvZ3Jlc3MgbWV0ZXIuIEl0IHNob3dlZCB0aGUKICB3cm9uZyBwZXJjZW50YWdlIGZvciBzbWFsbCBmaWxlcywgbW9zdCBub3RhYmxlIGZvciA8MTAwMCBieXRlcyBhbmQgY291bGQKICBlYXNpbHkgZW5kIHVwIHNob3dpbmcgbW9yZSB0aGFuIDEwMCUgYXQgdGhlIGVuZC4gSXQgYWxzbyBkaWRuJ3Qgc2hvdyBhbnkKICBwZXJjZW50YWdlLCB0cmFuc2ZlciBzaXplIG9yIGVzdGltYXRlZCB0cmFuc2ZlciB0aW1lcyB3aGVuIHRyYW5zZmVycmluZwogIGxlc3MgdGhhbiAxMDAgYnl0ZXMuCgpWZXJzaW9uIDcuMTkuNyAoNCBOb3ZlbWJlciAyMDA5KQoKRGFuaWVsIFN0ZW5iZXJnICgyIE5vdiAyMDA5KQotIEFzIHJlcG9ydGVkIGluZGVwZW5kZW50IGJ5IGJvdGggU3RhbiB2YW4gZGUgQnVyZ3QgYW5kIERpZGllciBCcmlzZWJvdXJnLAogIENVUkxJTkZPX1NJWkVfRE9XTkxPQUQgKHRoZSAtdyB2YXJpYWJsZSBzaXplX2Rvd25sb2FkKSBkaWRuJ3Qgd29yayB3aGVuCiAgZ2V0dGluZyBkYXRhIGZyb20gbGRhcCEKCkRhbmllbCBTdGVuYmVyZyAoMzEgT2N0IDIwMDkpCi0gR2FicmllbCBLdXJpIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIGlmIHRoZQogIGRvd25sb2FkIHdhcyAwIGJ5dGVzLCBhcyBsaWJjdXJsIHdvdWxkIHRoZW4gcmV0dXJuIHRoZSBzaXplIGFzIHVua25vd24gKC0xKQogIGFuZCBub3QgMC4gSSB3cm90ZSBhIGZpeCBhbmQgdGVzdCBjYXNlIDU2NiB0byB2ZXJpZnkgaXQuCgpEYW5pZWwgU3RlbmJlcmcgKDMwIE9jdCAyMDA5KQotIExpemEgQWxlbmNoZXJ5IG1lbnRpb25lZCBhIHByb2JsZW0gd2l0aCByZS11c2VkIFNDUCBjb25uZWN0aW9uIHdoZW4gYSBiYWQKICBhdXRoIGlzIHVzZWQsIGFzIGl0IGNhdXNlZCBhIGNyYXNoLiBJIGZhaWxlZCB0byByZXBlYXQgdGhlIGlzc3VlLCBidXQgc3RpbGwKICBtYWRlIGEgY2hhbmdlIHRoYXQgbm93IGZvcmNlcyB0aGUgVENQIGNvbm5lY3Rpb24gdXNlZCBmb3IgYSBmcmVlZCBTQ1AKICBzZXNzaW9uIHRvIGdldCBjbG9zZWQgYW5kIG5vdCBiZSByZS11c2VkLgoKLSAiVG9tIiBwb3N0ZWQgYSBidWcgcmVwb3J0IHRoYXQgbWVudGlvbmVkIGhvdyBsaWJjdXJsIGRpZCB3cm9uZyB3aGVuIGRvaW5nIGEKICBQT1NUIHVzaW5nIGEgcmVhZCBjYWxsYmFjaywgd2l0aCBEaWdlc3QgYXV0aGVudGljYXRpb24gYW5kCiAgIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIiBlbmZvcmNlZC4gIEkgd291bGQgdGhlbiBjYXVzZSB0aGUgZmlyc3QgcmVxdWVzdAogIHRvIGJlIHdyb25nbHkgc2VudCBhbmQgdGhlbiBiYXNpY2FsbHkgaGFuZyB1bnRpbCB0aGUgc2VydmVyIGNsb3NlZCB0aGUKICBjb25uZWN0aW9uLiBJIGZpeGVkIHRoZSBwcm9ibGVtIGFuZCBhZGRlZCB0ZXN0IGNhc2UgNTY1IHRvIHZlcmlmeSBpdC4KCkRhbmllbCBTdGVuYmVyZyAoMjUgT2N0IDIwMDkpCi0gRGltYSBCYXJza3kgbWFkZSB0aGUgY3VybCBjb29raWUgcGFyc2VyIGFjY2VwdCBjb29raWVzIGV2ZW4gd2l0aCBibGFuayBvcgogIHVucGFyc2FibGUgZXhwaXJ5IGRhdGVzIGFuZCB0aGVuIHRyZWF0IHRoZW0gYXMgc2Vzc2lvbiBjb29raWVzIC0gcHJldmlvdXNseQogIGxpYmN1cmwgd291bGQgcmVqZWN0IGNvb2tpZXMgd2l0aCBhIGRhdGUgZm9ybWF0IGl0IGNvdWxkbid0IHBhcnNlLiBSZXNlYXJjaAogIHNob3dzIHRoYXQgdGhlIG1ham9yIGJyb3dzZXIgdHJlYXQgc3VjaCBjb29raWVzIGFzIHNlc3Npb24gY29va2llcy4gSQogIG1vZGlmaWVkIHRlc3QgOCBhbmQgMzEgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgU3RlbmJlcmcgKDIxIE9jdCAyMDA5KQotIEF0dGVtcHQgdG8gdXNlIHBrZy1jb25maWcgZm9yIGZpbmRpbmcgb3V0IGxpYnNzaDIgaW5zdGFsbGF0aW9uIGRldGFpbHMKICBkdXJpbmcgY29uZmlndXJlLgoKLSBBIHBhdGNoIGluIGJ1ZyByZXBvcnQgIzI4ODMxNzcgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODgzMTc3KQogIGJ5IEpvaGFuIHZhbiBTZWxzdCBpbnRyb2R1Y2VkIHRoZSAtLWNybGZpbGUgb3B0aW9uIHRvIGN1cmwsIHdoaWNoIG1ha2VzIGN1cmwKICB0ZWxsIGxpYmN1cmwgYWJvdXQgYSBmaWxlIHdpdGggQ1JMIChjZXJ0aWZpY2F0ZSByZXZvY2F0aW9uIGxpc3QpIGRhdGEgdG8KICByZWFkLgoKRGFuaWVsIFN0ZW5iZXJnICgxOCBPY3QgMjAwOSkKLSBSYXkgRGFzc2VuIHByb3ZpZGVkIGEgcGF0Y2ggaW4gRGViaWFuJ3MgYnVnIHRyYWNrZXIgKGJ1ZyBudW1iZXIgIzU1MTQ2MSkKICB0aGF0IG5vdyBtYWtlcyBjdXJsX2dldGRhdGUoMykgYWN0dWFsbHkgaGFuZGxlcyBSRkMgODIyIGZvcm1hdHRlZCBkYXRlcyB0aGF0CiAgdXNlIHRoZSAic2luZ2xlIGxldHRlciBtaWxpdGFyeSB0aW1lem9uZXMiLgogIGh0dHA6Ly93d3cucmZjLXJlZi5vcmcvUkZDLVRFWFRTLzgyMi9jaGFwdGVyNS5odG1sIGhhcyB0aGUgZGV0YWlscy4KCi0gRml4ZWQgbWVtb3J5IGxlYWsgaW4gdGhlIFNDUC9TRlRQIGNvZGUgYXMgaXQgbmV2ZXIgZnJlZWQgdGhlIGtub3duaG9zdHMKICBkYXRhIQoKLSBKb2huIERlbm5pcyBmaWxlZCBidWcgcmVwb3J0ICMyODczNjY2CiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODczNjY2KSB3aGljaCBpZGVudGlmaWVkIGEgcHJvYmxlbQogIHdoaWNoIG1hZGUgbGliY3VybCBsb29wIGluZmluaXRlbHkgd2hlbiBnaXZlbiBpbmNvcnJlY3QgY3JlZGVudGlhbHMgd2hlbgogIHVzaW5nIEhUVFAgR1NTIG5lZ290aWF0ZSBhdXRoZW50aWNhdGlvbi4gSGUgYWxzbyBwcm92aWRlZCBhIHNtYWxsIGFuZCBzaW1wbGUKICBwYXRjaCBmb3IgaXQuCgotIEtldmluIEJhdWdobWFuIGZvdW5kIGEgZG91YmxlIGNsb3NlKCkgcHJvYmxlbSB3aXRoIGxpYmN1cmwtTlNTLCBhcyB3aGVuCiAgbGliY3VybCBjYWxsZWQgTlNTIHRvIGNsb3NlIHRoZSBTU0wgInNlc3Npb24iIGl0IGFsc28gY2xvc2VkIHRoZSBhY3R1YWwKICBzb2NrZXQuCgpZYW5nIFRzZSAoMTcgT2N0IDIwMDkpCi0gQnVnIHJlcG9ydCAjMjg2NjcyNCBpbmRpY2F0ZWQKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4NjY3MjQpIHRoYXQgY3VybCBvbiBXaW5kb3dzIGZhaWxlZAogIHdoZW4gd3JpdGluZyBmaWxlcyB3aG9zZSBmaWxlIG5hbWVzIG9yaWdpbmFsbHkgY29udGFpbmVkIGNoYXJhY3RlcnMgd2hpY2gKICBhcmUgbm90IHZhbGlkIGZvciBmaWxlIG5hbWVzIG9uIFdpbmRvd3MuIERhbiBGYW5kcmljaCBwcm92aWRlZCBhbiBpbml0aWFsCiAgcGF0Y2ggYW5kIGFub3RoZXIgcmV2aXNlZCBvbmUgdG8gZml4IHRoaXMgaXNzdWUuCgpEYW5pZWwgU3RlbmJlcmcgKDEgT2N0IDIwMDkpCi0gVG9tIE11ZWxsZXIgY29ycmVjdGx5IHJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzI4NzAyMjEKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4NzAyMjEpIHRoYXQgbGliY3VybCByZXR1cm5lZCBhbgogIGluY29ycmVjdCByZXR1cm4gY29kZSBmcm9tIHRoZSBpbnRlcm5hbCB0cnluZXh0aXAoKSBmdW5jdGlvbiB3aGljaCBjYXVzZWQKICBoaW0gZ3JpZWYuIFRoaXMgaXMgYSByZWdyZXNzaW9uIHRoYXQgd2FzIGludHJvZHVjZWQgaW4gNy4xOS4xIGFuZCBJIGZpbmQgaXQKICBzdHJhbmdlIGl0IGhhc24ndCBoaXQgdXMgaGFyZGVyLCBidXQgSSB3b24ndCBwZXJzdWUgaW50byBmaWd1cmluZyBvdXQKICBleGFjdGx5IHdoeS4KCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXM6IFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdpbGwgYWx3YXlzIHNldAogIFNPX1NOREJVRiB0byBDVVJMX1dSSVRFX1NJWkUgZXZlbiBpZiB0aGUgU09fU05EQlVGIHN0YXJ0cyBvdXQgbGFyZ2VyLiAgVGhlCiAgcGF0Y2ggZG9lc24ndCBkbyBhIHNldHNvY2tvcHQgaWYgU09fU05EQlVGIGlzIGFscmVhZHkgZ3JlYXRlciB0aGFuCiAgQ1VSTF9XUklURV9TSVpFLiBUaGlzIHNob3VsZCBoZWxwIGZvbGtzIHdobyBoYXZlIHNldCB1cCB0aGVpciBjb21wdXRlciB3aXRoCiAgbGFyZ2Ugc2VuZCBidWZmZXJzLgoKRGFuaWVsIFN0ZW5iZXJnICgyNyBTZXAgMjAwOSkKLSBJIGludHJvZHVjZWQgYSBtYXhpbXVtIGxpbWl0IGZvciByZWNlaXZlZCBIVFRQIGhlYWRlcnMuIEl0IGlzIGNvbnRyb2xsZWQgYnkKICB0aGUgZGVmaW5lIENVUkxfTUFYX0hUVFBfSEVBREVSIHdoaWNoIGlzIGV2ZW4gZXhwb3NlZCBpbiB0aGUgcHVibGljIGhlYWRlcgogIGZpbGUgdG8gYWxsb3cgZm9yIHVzZXJzIHRvIGZhaXJseSBlYXN5IHJlYnVpbGQgbGliY3VybCB3aXRoIGEgbW9kaWZpZWQKICBsaW1pdC4gVGhlIHJhdGlvbmFsZSBmb3IgYSBmaXhlZCBsaW1pdCBpcyB0aGF0IGxpYmN1cmwgaXMgcmVhbGxvYygpaW5nIGEKICBidWZmZXIgdG8gYmUgYWJsZSB0byBwdXQgYSBmdWxsIGhlYWRlciBpbnRvIGl0LCBzbyB0aGF0IGl0IGNhbiBjYWxsIHRoZQogIGhlYWRlciBjYWxsYmFjayB3aXRoIHRoZSBlbnRpcmUgaGVhZGVyLCBidXQgdGhhdCBhbHNvIHJpc2sgZ2V0dGluZyBpdCBpbnRvCiAgdHJvdWJsZSBpZiBhIHNlcnZlciBieSBtaXN0YWtlIG9yIHdpbGxpbmdseSBzZW5kcyBhIGhlYWRlciB0aGF0IGlzIG1vcmUgb3IKICBsZXNzIHdpdGhvdXQgYW4gZW5kLiBUaGUgbGltaXQgaXMgc2V0IHRvIDEwMEsuCgpEYW5pZWwgU3RlbmJlcmcgKDI2IFNlcCAyMDA5KQotIEpvaG4gUC4gTWNDYXNrZXkgcG9zdGVkIGEgYnVnIHJlcG9ydCB0aGF0IHNob3dlZCBob3cgbGliY3VybCBkaWQgd3Jvbmcgd2hlbgogIHNhdmluZyByZWNlaXZlZCBjb29raWVzIHdpdGggbm8gZ2l2ZW4gcGF0aCwgaWYgdGhlIHBhdGggaW4gdGhlIHJlcXVlc3QgaGFkIGEKICBxdWVyeSBwYXJ0LiBUaGF0IGlzIG1lYW5zIGEgcXVlc3Rpb24gbWFyayAoPykgYW5kIGNoYXJhY3RlcnMgb24gdGhlIHJpZ2h0CiAgc2lkZSBvZiB0aGF0LiBJIHdyb3RlIHRlc3QgY2FzZSAxMTA1IGFuZCBmaXhlZCB0aGlzIHByb2JsZW0uCgpLYW1pbCBEdWRrYSAoMjYgU2VwIDIwMDkpCi0gSW1wbGVtZW50ZWQgYSBwcm90b2NvbCBpbmRlcGVuZGVudCB3YXkgdG8gc3BlY2lmeSBibG9ja2luZyBkaXJlY3Rpb24sIHVzZWQgYnkKICB0cmFuc2Zlci5jIGZvciBibG9ja2luZy4gSXQgaXMgY3VycmVudGx5IHVzZWQgb25seSBieSBTQ1AgYW5kIFNGVFAgcHJvdG9jb2xzLgogIFRoaXMgZW5oYW5jZW1lbnQgcmVzb2x2ZXMgYW4gaXNzdWUgd2l0aCAxMDAlIENQVSB1c2FnZSBkdXJpbmcgU0ZUUCB1cGxvYWQsCiAgcmVwb3J0ZWQgYnkgVm91cmhleS4KCkRhbmllbCBTdGVuYmVyZyAoMjUgU2VwIDIwMDkpCi0gQ2hyaXMgTXVtZm9yZCBmaWxlZCBidWcgcmVwb3J0ICMyODYxNTg3CiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODYxNTg3KSBpZGVudGlmeWluZyB0aGF0IGxpYmN1cmwgdXNlZAogIHRoZSBPcGVuU1NMIGZ1bmN0aW9uIFg1MDlfbG9hZF9jcmxfZmlsZSgpIHdyb25nbHkgYW5kIGZhaWxlZCBpZiBpdCB3b3VsZAogIGxvYWQgYSBDUkwgZmlsZSB3aXRoIG1vcmUgdGhhbiBvbmUgY2VydGlmaWNhdGUgd2l0aGluLiBUaGlzIGlzIG5vdyBmaXhlZC4KCkRhbmllbCBTdGVuYmVyZyAoMTYgU2VwIDIwMDkpCi0gU3ZlbiBBbmRlcnMgcmVwb3J0ZWQgdGhhdCB3ZSBpbnRyb2R1Y2VkIGEgY2VydCB2ZXJmaWNhdGlvbiBmbGF3IGZvciBPcGVuU1NMLQogIHBvd2VyZWQgbGliY3VybCBpbiA3LjE5LjYuIElmIHRoZXJlIHdhcyBhIFg1MDl2MyBTdWJqZWN0IEFsdGVybmF0aXZlIE5hbWUKICBmaWVsZCBpbiB0aGUgY2VydGZpY2F0ZSBpdCBoYWQgdG8gbWF0Y2ggYW5kIHNvIGV2ZW4gaWYgbm9uLUROUyBhbmQgbm9uLUlQCiAgZW50cnkgd2FzIHByZXNlbnQgaXQgY2F1c2VkIHRoZSB2ZXJpZmljYXRpb24gdG8gZmFpbC4KCkRhbmllbCBGYW5kcmljaCAoMTUgU2VwIDIwMDkpCi0gTW92ZWQgdGhlIGxpYnNzaDIgY2hlY2tzIGFmdGVyIHRoZSBTU0wgbGlicmFyeSBjaGVja3MuIFRoaXMgaGVscHMgd2hlbgogIHN0YXRpY2FsbHkgbGlua2luZyBzaW5jZSBsaWJzc2gyIG5lZWRzIHRoZSBTU0wgbGlicmFyeSBsaW5rIGZsYWdzIHRvIGJlCiAgc2V0IHVwIGFscmVhZHkgdG8gc2F0aXNmeSBpdHMgZGVwZW5kZW5jaWVzLiBUaGlzIHdvdWxkbid0IGJlIG5lY2Vzc2FyeSBpZgogIHRoZSBsaWJzc2gyIGNvbmZpZ3VyZSBjaGVjayB3YXMgY2hhbmdlZCB0byB1c2UgcGtnLWNvbmZpZyBzaW5jZSB0aGUKICAtLXN0YXRpYyBmbGFnIHdvdWxkIGFkZCB0aGUgZGVwZW5kZW5jaWVzIGF1dG9tYXRpY2FsbHkuCgpZYW5nIFRzZSAoMTQgU2VwIDIwMDkpCi0gUmV2ZXJ0IEpvc2h1YSBLd2FuJ3MgcGF0Y2ggY29tbWl0dGVkIDExIFNlcCAyMDA5LgoKICBTb21lIHN5c3RlbXMgcG9sbCBmdW5jdGlvbiBzZXRzIFBPTExIVVAgaW4gcmV2ZW50cyB3aXRob3V0IHNldHRpbmcKICBQT0xMSU4sIGFuZCBzZXRzIFBPTExFUlIgd2l0aG91dCBzZXR0aW5nIFBPTExJTiBhbmQgUE9MTE9VVC4gSW4gc29tZQogIGxpYmN1cmwgY29kZSBleGVjdXRpb24gcGF0aHMgdGhpcyBjb3VsZCB0cmlnZ2VyIGJ1c3kgd2FpdCBsb29wcyB3aXRoCiAgaGlnaCBDUFUgdXNhZ2UgdW50aWwgYSB0aW1lb3V0IGNvbmRpdGlvbiBhYm9ydGVkIHRoZSBsb29wLgoKICBUaGUgcmV2ZXJ0ZWQgcGF0Y2ggYWRkcmVzc2VkIHRoZSBhYm92ZSBpc3N1ZSBmb3IgYSB2ZXJ5IHNwZWNpZmljIGNhc2UsCiAgd2hlbiBhd2FpdGluZyBjLWFyZXMgdG8gcmVzb2x2ZS4gQSBsaWJjdXJsLXdpZGUgZml4IGZvciBDdXJsX3BvbGwgbm93CiAgc3VwZXJjZWVkcyB0aGlzIG9uZS4KCkd1ZW50ZXIgS25hdWYgKDExIFNlcCAyMDA5KQotIEpvc2h1YSBLd2FuIHByb3ZpZGVkIGEgcGF0Y2ggdG8gcGFzcyBQT0xMRVJSIC8gUE9MTEhVUCBiYWNrIHRvIGMtYXJlcy4KICBUaGlzIGZpeGVzIGEgbG9vcCBwcm9ibGVtIHdpdGggaGlnaCBDUFUgdXNhZ2UuCgpEYW5pZWwgU3RlbmJlcmcgKDEwIFNlcCAyMDA5KQotIENsYWVzIEpha29ic3NvbiBmaXhlZCBhIHByb2JsZW0gd2l0aCBjb29raWUgZXhwaXJ5IGRhdGVzIGF0IGV4Y3RseSB0aGUgZXBvY2gKICBzdGFydCBzZWNvbmQgIlRodSBKYW4gMSAwMDowMDowMCBHTVQgMTk3MCIgYXMgdGhlIGRhdGUgcGFyc2VyIHRoZW4gcmV0dXJucyAwCiAgd2hpY2ggaW50ZXJuYWxseSB0aGVuIGlzIHRyZWF0ZWQgYXMgYSBzZXNzaW9uIGNvb2tpZS4gVGhhdCBwYXJ0aWN1bGFyIGRhdGUKICBpcyBub3cgbWFkZSB0byBnZXQgdGhlIHZhbHVlIG9mIDEuCgpEYW5pZWwgU3RlbmJlcmcgKDIgU2VwIDIwMDkpCi0gRGFuaWVsIEpvaG5zb24gZm91bmQgYSBmbGF3IGluIHRoZSBjb2RlIGNvbnZlcnRpbmcgc2Z0cC1lcnJvcnMgdG8gbGliY3VybAogIGVycm9ycy4KCkRhbmllbCBTdGVuYmVyZyAoMSBTZXAgMjAwOSkKLSBQZXRlciBTeWx2ZXN0ZXIgbWFkZSBhIGRlYnVnIGZlYXR1cmUgZm9yIEN1cmxfcmVzb2x2KCkgdGhhdCBub3cgd2lsbCBmb3JjZQogIGxpYmN1cmwgdG8gcmVzb2x2ZSAnbG9jYWxob3N0JyB3aGF0ZXZlciBuYW1lIHlvdSB1c2UgaW4gdGhlIFVSTCAqaWYqIHlvdSBzZXQKICB0aGUgLS1pbnRlcmZhY2Ugb3B0aW9uIHRvIChleGFjdGx5KSAiTG9jYWxIb3N0Ii4gVGhpcyB3aWxsIGVuYWJsZSB1cyB0bwogIHdyaXRlIHRlc3RzIGZvciBjdXN0b20gaG9zdHMgbmFtZXMgYnV0IHN0aWxsIHVzZSBhIGxvY2FsIGhvc3Qgc2VydmVyLgoKLSBjb25maWd1cmUgbm93IHRyaWVzIHRvIHVzZSBwa2ctY29uZmlnIGZvciBhIG51bWJlciBvZiBzdWItZGVwZW5kZW5jaWVzIGV2ZW4KICB3aGVuIGNyb3NzLWNvbXBpbGluZy4gVGhlIGtleSB0byBzdWNjZXNzIGlzIHRoZW4geW91IHByb3Blcmx5IHNldHVwCiAgUEtHX0NPTkZJR19QQVRIIGJlZm9yZSBpbnZva2luZyBjb25maWd1cmUuCgogIEkgYWxzbyBpbXByb3ZlZCBob3cgTlNTIGlzIGRldGVjdGVkIGJ5IHRyeWluZyBuc3MtY29uZmlnIGlmIHBrZy1jb25maWcgaXNuJ3QKICBwcmVzZW50LCBhbmQgYXMgYSBsYXN0IHJlc29ydCBqdXN0IHVzZSB0aGUgbGliIG5hbWUgYW5kIGZvcmNlIHRoZSB1c2VyIHRvCiAgc2V0dXAgdGhlIExJQlMvTERGTEFHUy9DRkxBR1MgZXRjIHByb3Blcmx5LiBUaGUgcHJldmlvdXMgbGFzdCByZXNvcnQgd291bGQKICBhZGQgYSByYW5nZSBvZiB2YXJpb3VzIGxpYnMgdGhhdCB3b3VsZCBhbG1vc3QgbmV2ZXIgYmUgcXVpdGUgY29ycmVjdC4KCkRhbmllbCBTdGVuYmVyZyAoMzEgQXVnIDIwMDkpCi0gV2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlIHdpdGggRlRQIGFuZCB5b3UgYXNrZWQgZm9yIE5PQk9EWSwgeW91IGRpZCBubwogIFFVT1RFIGNvbW1hbmRzIGFuZCB0aGUgcmVxdWVzdCB1c2VkIHRoZSBzYW1lIHBhdGggYXMgdGhlIGNvbm5lY3Rpb24gaGFkCiAgYWxyZWFkeSBjaGFuZ2VkIHRvLCBpdCB3b3VsZCBkZWNpZGUgdGhhdCBubyBjb21tYW5kcyB3b3VsZCBiZSBuZWNlc3NhcnkgZm9yCiAgdGhlICJETyIgYWN0aW9uIGFuZCB0aGF0IHdhcyBub3QgaGFuZGxlZCBwcm9wZXJseSBidXQgbGliY3VybCB3b3VsZCBpbnN0ZWFkCiAgaGFuZy4KCkthbWlsIER1ZGthICgyOCBBdWcgMjAwOSkKLSBJbXByb3ZlZCBlcnJvciBtZXNzYWdlIGZvciBub3QgbWF0Y2hpbmcgY2VydGlmaWNhdGUgc3ViamVjdCBuYW1lIGluCiAgbGliY3VybC1OU1MuIE9yaWdpbmFsbHkgcmVwb3J0ZWQgYXQ6CiAgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD01MTYwNTYjYzkKClBhdHJpY2sgTW9ubmVyYXQgKDI0IEF1ZyAyMDA5KQotIEludHJvZHVjZWQgYSBTWVNULWJhc2VkIHRlc3QgdG8gcHJvcGVybHkgc2V0LXVwIG5hbWUgZm9ybWF0IHdoZW4gZGVhbGluZwogIHdpdGggdGhlIE9TLzQwMCBGVFAgc2VydmVyLgoKLSBGaXhlZCBhbiBmdHBfcmVhZHJlc3AoKSBidWcgcHJldmVudGluZyBkZXRlY3Rpb24gb2YgZmFpbGluZyBjb250cm9sIHNvY2tldAogIGFuZCBjYXVzaW5nIEZUUCBjbGllbnQgdG8gbG9vcCBmb3JldmVyLgoKRGFuaWVsIFN0ZW5iZXJnICgyNCBBdWcgMjAwOSkKLSBNYXJjIGRlIEJydWluIHBvaW50ZWQgb3V0IHRoYXQgY29uZmlndXJlIC0td2l0aC1nbnV0bHM9UEFUSCBkaWRuJ3Qgd29yawogIHByb3Blcmx5IGFuZCBwcm92aWRlZCBhIGZpeC4gaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4NDMwMDgKCi0gRXJpYyBXb25nIGludHJvZHVjZWQgc3VwcG9ydCBmb3IgdGhlIG5ldyBvcHRpb24gLVQuIChkb3QpIHRoYXQgbWFrZXMgY3VybAogIHJlYWQgc3RkaW4gaW4gYSBub24tYmxvY2tpbmcgZmFzaGlvbi4gVGhpcyBhbHNvIGJyaW5ncyBiYWNrIC1ULSAobWludXMpIHRvCiAgdGhlIHByZXZpb3VzIGJsb2NraW5nIGJlaGF2aW9yIHNpbmNlIGl0IGNvdWxkIGJyZWFrIHN0dWZmIGZvciBwZW9wbGUgYXQKICB0aW1lcy4KCk1pY2hhbCBNYXJlayAoMjEgQXVnIDIwMDkpCi0gV2l0aCBDVVJMT1BUX1BST1hZX1RSQU5TRkVSX01PREUsIGF2b2lkIHNlbmRpbmcgaW52YWxpZCBVUkxzIGxpa2UKICBmdHA6Ly9leGFtcGxlLmNvbTt0eXBlPWkgaWYgdGhlIHVzZXIgc3BlY2lmaWVkIGZ0cDovL2V4YW1wbGUuY29tIHdpdGhvdXQgdGhlCiAgc2xhc2guCgpEYW5pZWwgU3RlbmJlcmcgKDIxIEF1ZyAyMDA5KQotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgcG9pbnRlZCBvdXQgYSBtaXNzaW5nIHJldHVybiBjb2RlIGNoZWNrIGZvciBhCiAgc3RyZHVwKCkgdGhhdCBjb3VsZCBsZWFkIHRvIHNlZ2ZhdWx0IGlmIGl0IHJldHVybmVkIE5VTEwuIEkgZXh0ZW5kZWQgaGlzCiAgc3VnZ2VzdCBwYXRjaCB0byBub3cgaGF2ZSBDdXJsX3JldHJ5X3JlcXVlc3QoKSByZXR1cm4gYSByZWd1bGFyIHJldHVybiBjb2RlCiAgYW5kIGJldHRlciBjaGVjayB0aGF0LgoKLSBMb3RzIG9mIGdvb2Qgd29yayBieSBLcmlzdGVyIEpvaGFuc2VuLCBtb3N0bHkgcmVsYXRlZCB0byBwaXBlbGluaW5nOgoKICBGaXggU0lHU0VHViBvbiBmcmVlJ2QgZWFzeV9jb25uIHdoZW4gcGlwZSB1bmV4cGVjdGVkbHkgYnJlYWtzCiAgRml4IGRhdGEgY29ycnVwdGlvbiBpc3N1ZSB3aXRoIHJlLWNvbm5lY3RlZCB0cmFuc2ZlcnMKICBGaXggdXNlIGFmdGVyIGZyZWUgaWYgd2UncmUgY29tcGxldGVkIGJ1dCBlYXN5X2Nvbm4gbm90IE5VTEwKCkthbWlsIER1ZGthICgxMyBBdWcgMjAwOSkKLSBDaGFuZ2VkIE5TUyBjb2RlIHRvIG5vdCBpZ25vcmUgdGhlIHZhbHVlIG9mIHNzbC52ZXJpZnlob3N0IGFuZCBwcm9kdWNlIG1vcmUKICB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzLiBPcmlnaW5hbGx5IHJlcG9ydGVkIGF0OgogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NTE2MDU2CgpEYW5pZWwgU3RlbmJlcmcgKDEyIEF1ZyAyMDA5KQotIEthcmwgTW9lcmRlciBmaXhlZCB0aGUgTWFrZWZpbGUudmMqIG1ha2VmaWxlcyB0byBpbmNsdWRlIHRoZSBuZXcgZmlsZQogIG5vbmJsb2NrLmMgc28gdGhhdCB0aGV5IHdvcmsgZmluZSBhZ2FpbgoKLSBJIGV4cGFuZGVkIHRlc3QgNTE3IHdpdGggYSBidW5jaCBvZiBtb3JlIGRhdGVzIHRoYXQgb3JpZ2luYXRlIGZyb20gdGhlCiAgQ2hyb21lIGJyb3dzZXIgdGVzdCBzdWl0ZS4gSXQgdHVybnMgb3V0IG1vc3Qgb2YgdGhlbSBnZXQgcGFyc2VkIHRoZSBzYW1lCiAgd2F5LgoKVmVyc2lvbiA3LjE5LjYgKDEyIEF1Z3VzdCAyMDA5KQoKRGFuaWVsIFN0ZW5iZXJnICgxMiBBdWcgMjAwOSkKLSBDYXJzdGVuIExhbmdlIHJlcG9ydGVkIGEgYnVnIGFuZCBwcm92aWRlZCBhIHBhdGNoIGZvciBURlRQIHVwbG9hZCBhbmQgdGhlCiAgc2VuZGluZyBvZiB0aGUgVFNJWkUgb3B0aW9uLiBJIGRvbid0IGxpa2UgZml4aW5nIGJ1Z3MganVzdCBob3VycyBiZWZvcmUKICBhIHJlbGVhc2UsIGJ1dCBzaW5jZSBpdCB3YXMgYnJva2VuIGFuZCB0aGUgcGF0Y2ggZml4ZXMgdGhpcyBmb3IgaGltIEkgZGVjaWRlZAogIHRvIGdldCBpdCBpbiBhbnl3YXkuCgpEYW5pZWwgU3RlbmJlcmcgKDExIEF1ZyAyMDA5KQotIFBldGVyIFN5bHZlc3RlciBtYWRlIHRoZSBIVFRQUyB0ZXN0IHNlcnZlciB1c2Ugc3BlY2lmaWMgY2VydGlmaWNhdGVzIGZvcgogIGVhY2ggdGVzdCwgc28gdGhhdCB0aGUgdGVzdCBzdWl0ZSBjYW4gbm93IGJlIHVzZWQgdG8gYWN0dWFsbHkgdGVzdCB0aGUKICB2ZXJpZmljYXRpb24gb2YgY2VydCBuYW1lcyBldGMuIFRoaXMgbWFkZSBhbiBlcnJvciBzaG93IHVwIGluIHRoZSBPcGVuU1NMLQogIHNwZWNpZmljIGNvZGUgd2hlcmUgaXQgd291bGQgYXR0ZW1wdCB0byBtYXRjaCB0aGUgQ04gZmllbGQgZXZlbiBpZiBhCiAgc3ViamVjdEFsdE5hbWUgZXhpc3RzIHRoYXQgZG9lc24ndCBtYXRjaC4gVGhpcyBpcyBub3cgZml4ZWQgYW5kIHZlcmlmaWVkCiAgaW4gdGVzdCAzMTEuCgotIEJlbmJ1Y2sgTmFzb24gcG9zdGVkIHRoZSBidWcgcmVwb3J0ICMyODM1MTk2CiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODM1MTk2KSwgZml4aW5nIGEgZmV3IGNvbXBpbGVyCiAgd2FybmluZ3Mgd2hlbiBtaXhpbmcgaW50cyBhbmQgYm9vbHMuCgpEYW5pZWwgRmFuZHJpY2ggKDEwIEF1ZyAyMDA5KQotIEZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIEZUUCBjb2RlIGFuZCBhbiBvZmYtYnktb25lIGhlYXAgYnVmZmVyIG92ZXJmbG93LgoKRGFuaWVsIEZhbmRyaWNoICg5IEF1ZyAyMDA5KQotIEZpeGVkIHNvbWUgbWVtb3J5IGxlYWtzIGluIHRoZSBjb21tYW5kLWxpbmUgdG9vbCB0aGF0IGNhdXNlZCBtb3N0IG9mIHRoZQogIHRvcnR1cmUgdGVzdHMgdG8gZmFpbC4KCkRhbmllbCBTdGVuYmVyZyAoMiBBdWcgMjAwOSkKLSBDdXJ0IEJvZ21pbmUgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggU05JIGVuYWJsZWQgb24gYSBwYXJ0aWN1bGFyIHNlcnZlci4gV2UKICBzaG91bGQgaW50cm9kdWNlIGFuIG9wdGlvbiB0byBkaXNhYmxlIFNOSSwgYnV0IGFzIHdlJ3JlIGluIGZlYXR1cmUgZnJlZXplCiAgbm93IEkndmUgYWRkcmVzc2VkIHRoZSBvYnZpb3VzIGJ1ZyBoZXJlIChwb2ludGVkIG91dCBieSBQZXRlciBTeWx2ZXN0ZXIpOiB3ZQogIHNob3VsZG4ndCB0cnkgdG8gZW5hYmxlIFNOSSB3aGVuIFNTTHYyIG9yIFNTTHYzIGlzIGV4cGxpY2l0bHkgc2VsZWN0ZWQuCiAgQ29kZSBmb3IgT3BlblNTTCBhbmQgR251VExTIHdhcyBmaXhlZC4gTlNTIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIGEgcGFydGljdWxhcgogIG9wdGlvbiBmb3IgU05JLCBvciBhcmUgd2Ugc2ltcGx5IG5vdCB1c2luZyBpdD8KCkRhbmllbCBTdGVuYmVyZyAoMSBBdWcgMjAwOSkKLSBTY290dCBDYW50b3IgcG9zdGVkIHRoZSBidWcgcmVwb3J0ICMyODI5OTU1CiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODI5OTU1KSBtZW50aW9uaW5nIHRoZSByZWNlbnQgU1NMIGNlcnQKICB2ZXJpZmljYXRpb24gZmxhdyBmb3VuZCBhbmQgZXhwbG9pdGVkIGJ5IE1veGllIE1hcmxpbnNwaWtlLiBUaGUgcHJlc2VudGF0aW9uCiAgaGUgZGlkIGF0IEJsYWNrIEhhdCBpcyBhdmFpbGFibGUgaGVyZToKICBodHRwczovL3d3dy5ibGFja2hhdC5jb20vaHRtbC9iaC11c2EtMDkvYmgtdXNhLTA5LWFyY2hpdmVzLmh0bWwjTWFybGluc3Bpa2UKCiAgQXBwYXJlbnRseSBhdCBsZWFzdCBvbmUgQ0EgYWxsb3dlZCBhIHN1YmplY3RBbHROYW1lIG9yIENOIHRoYXQgY29udGFpbiBhCiAgemVybyBieXRlLCBhbmQgdGh1cyBjbGllbnRzIHRoYXQgYXNzdW1lZCB0aGV5IHdvdWxkIG5ldmVyIGhhdmUgemVybyBieXRlcwogIHdlcmUgZXhwbG9pdGVkIHRvIE9LIGEgY2VydGlmaWNhdGUgdGhhdCBkaWRuJ3QgYWN0dWFsbHkgbWF0Y2ggdGhlIHNpdGUuIExpa2UKICBpZiB0aGUgbmFtZSBpbiB0aGUgY2VydCB3YXMgImV4YW1wbGUuY29tXDB0aGVhdHVhbHNpdGUuY29tIiwgbGliY3VybCB3b3VsZAogIGhhcHBpbHkgdmVyaWZ5IHRoYXQgY2VydCBmb3IgZXhhbXBsZS5jb20uCgogIGxpYmN1cmwgbm93IGJldHRlciB1c2VzIHRoZSBsZW5ndGggb2YgdGhlIGV4dHJhY3RlZCBuYW1lLCBub3QgdXNpbmcgdGhlIHplcm8KICB0ZXJtaW5hdGlvbiBmb3IgZ2V0dGluZyB0aGUgc3RyaW5nIGxlbmd0aC4KCiAgVGhpcyBmaXhpbmcgb25seSBtYWRlIGFuZCBuZWVkZWQgaW4gT3BlblNTTCBpbnRlcmZhY2luZyBjb2RlLgoKLSBUYW5ndXkgRmF1dHJlIHBvaW50ZWQgb3V0IHRoYXQgT3BlblNTTCdzIGZ1bmN0aW9uIFJBTkRfc2NyZWVuKCkgKHByZXNlbnQKICBvbmx5IGluIHNvbWUgT3BlblNTTCBpbnN0YWxscyAtIGxpa2Ugb24gV2luZG93cykgaXNuJ3QgdGhyZWFkLXNhZmUgYW5kIHdlCiAgYWdyZWVkIHRoYXQgbW92aW5nIGl0IHRvIHRoZSBnbG9iYWxfaW5pdCgpIGZ1bmN0aW9uIGlzIGEgZGVjZW50IHdheSB0byBkZWFsCiAgd2l0aCB0aGlzIHNpdHVhdGlvbi4KCi0gQWxleGFuZGVyIEJlZWRpZSBwcm92aWRlZCB0aGUgcGF0Y2ggZm9yIGEgbm9wcm94eSBwcm9ibGVtOiBJZiBJIGhhdmUgc2V0CiAgQ1VSTE9QVF9OT1BST1hZIHRvICIqIiwgb3IgdG8gYSBob3N0IHRoYXQgc2hvdWxkIG5vdCB1c2UgYSBwcm94eSwgSSBhY3R1YWxseQogIGNvdWxkIHN0aWxsIGVuZCB1cCB1c2luZyBhIHByb3h5IGlmIGEgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGUgd2FzIHNldC4KCkRhbmllbCBTdGVuYmVyZyAoMjcgSnVsIDIwMDkpCi0gQWxsIHRoZSBxdW90ZSBvcHRpb25zIChDVVJMT1BUX1FVT1RFLCBDVVJMT1BUX1BPU1RRVU9URSBhbmQKICBDVVJMT1BUX1BSRVFVT1RFKSBub3cgYWNjZXB0IGEgcHJlY2VlZGluZyBhc3RlcmlzayBiZWZvcmUgdGhlIGNvbW1hbmQgdG8KICBzZW5kIHdoZW4gdXNpbmcgRlRQLCBhcyBhIHNpZ24gdGhhdCBsaWJjdXJsIHNoYWxsIHNpbXBseSBpZ25vcmUgdGhlIHJlc3BvbnNlCiAgZnJvbSB0aGUgc2VydmVyIGluc3RlYWQgb2YgdHJlYXRpbmcgaXQgYXMgYW4gZXJyb3IuIE5vdCB0cmVhdGluZyBhIDQwMCsgRlRQCiAgcmVzcG9uc2UgY29kZSBhcyBhbiBlcnJvciBtZWFucyB0aGF0IGZhaWxlZCBjb21tYW5kcyB3aWxsIG5vdCBhYm9ydCB0aGUKICBjaGFpbiBvZiBjb21tYW5kcywgbm9yIHdpbGwgdGhleSBjYXVzZSB0aGUgY29ubmVjdGlvbiB0byBnZXQgZGlzY29ubmVjdGVkLgoKRGFuaWVsIFN0ZW5iZXJnICgyNiBKdWwgMjAwOSkKLSBKb2hhbiB2YW4gU2Vsc3QgcG9zdGVkIGJ1ZyByZXBvcnQgIzI4MjU5ODkKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4MjU5ODkpIHBvaW50aW5nIG91dCB0aGF0CiAgT3BlblNTTC1wb3dlcmVkIGxpYmN1cmwgZGlkbid0IHN1cHBvcnQgdGhlIFNIQS0yIGRpZ2VzdCBhbGdvcml0aG0sIGFuZAogIHByb3ZpZGVkIHRoZSBzb2x1dGlvbiB0b286IHRvIHVzZSBPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpIGluIGFkZGl0aW9uCiAgdG8gdGhlIG9sZGVyIFNTTGVheV8qIGFsdGVybmF0aXZlLiBPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcyB3YXMgYWRkZWQgaW4KICBPcGVuU1NMIDAuOS41CgpEYW5pZWwgU3RlbmJlcmcgKDIzIEp1bCAyMDA5KQotIEFkZGVkIENVUkxPUFRfU1NIX0tOT1dOSE9TVFMsIENVUkxPUFRfU1NIX0tFWUZVTkNUSU9OLCBDVVJMT1BUX1NTSF9LRVlEQVRBLgogIFRoZXkgaW50cm9kdWNlIGtub3duX2hvc3Qgc3VwcG9ydCBmb3IgU1NIIGtleXMgdG8gbGliY3VybC4gU2VlIGRvY3MgZm9yCiAgZGV0YWlscy4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBkZXBlbmRzIG9uIGEgbmV3IGVub3VnaCBsaWJzc2gyIHZlcnNpb24sIHRvCiAgYmUgc3VwcG9ydGVkIGluIGxpYnNzaDIgMS4yIGFuZCBsYXRlciAob3IgY3VycmVudCBnaXQgcmVwbyBhdCB0aGlzIHRpbWUpLgoKTWljaGFsIE1hcmVrICgyMiBKdWwgMjAwOSkKLSBEYXZpZCBCaW5kZXJtYW4gZm91bmQgYSBtZW1vcnkgYW5kIGZkIGxlYWsgaW4gbGliL2d0bHMuYzpsb2FkX2ZpbGUoKQogIChodHRwczovL2J1Z3ppbGxhLm5vdmVsbC5jb20vNTIzOTE5KS4gV2hlbiBsb29raW5nIGF0IHRoZSBjb2RlLCBJIGZvdW5kIHRoYXQKICBhbHNvIHRoZSBwdHIgcG9pbnRlciBjYW4gbGVhay4KCkthbWlsIER1ZGthICgyMCBKdWwgMjAwOSkKLSBDbGFlcyBKYWtvYnNzb24gaW1wcm92ZWQgdGhlIHN1cHBvcnQgZm9yIGNsaWVudCBjZXJ0aWZpY2F0ZXMgaGFuZGxpbmcgaW4KICBOU1MtcG93ZXJlZCBsaWJjdXJsLiBOb3cgdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZXMgY2FuIGJlIHNlbGVjdGVkCiAgYXV0b21hdGljYWxseSBieSBhIE5TUyBidWlsdC1pbiBob29rLiBBZGRpdGlvbmFsbHkgcHJlLWxvZ2luIHRvIGFsbCBQS0NTMTEKICBzbG90cyBpcyBubyBtb3JlIHBlcmZvcm1lZC4gSXQgdXNlZCB0byBjYXVzZSBwcm9ibGVtcyB3aXRoIEhXIHRva2Vucy4KCi0gRml4ZWQgcmVmZXJlbmNlIGNvdW50aW5nIGZvciBOU1MgY2xpZW50IGNlcnRpZmljYXRlcy4gTm93IHRoZSBQRU0gcmVhZGVyCiAgbW9kdWxlIHNob3VsZCBiZSBhbHdheXMgcHJvcGVybHkgdW5sb2FkZWQgb24gQ3VybF9uc3NfY2xlYW51cCgpLiBJZiB0aGUKICB1bmxvYWQgZmFpbHMgdGhvdWdoLCBsaWJjdXJsIHdpbGwgdHJ5IHRvIHJldXNlIHRoZSBhbHJlYWR5IGxvYWRlZCBpbnN0YW5jZS4KCkRhbmllbCBGYW5kcmljaCAoMTUgSnVsIDIwMDkpCi0gQWRkZWQgbm9uYmxvY2suYyB0byB0aGUgbm9uLWF1dG9tYWtlIG1ha2VmaWxlcyAobm90ZSB0aGF0IHRoZSBkZXBlbmRlbmNpZXMKICBpbiB0aGUgV2F0Y29tIG1ha2VmaWxlcyBhcmVuJ3QgcXVpdGUgY29ycmVjdCkuCgpNaWNoYWwgTWFyZWsgKDE1IEp1bCAyMDA5KQotIENoYW5nZWQgdGhlIGRlc2NyaXB0aW9uIG9mIENVUkxJTkZPX09TX0VSUk5PIHRvIG1ha2UgaXQgY2xlYXIgdGhhdCB0aGUKICBlcnJubyBpcyBub3QgcmVzZXQgb24gc3VjY2Vzcy4KCkd1ZW50ZXIgS25hdWYgKDE0IEp1bCAyMDA5KQotIHJlbmFtZWQgZ2VuZXJhdGVkIGNvbmZpZy5oIHRvIGN1cmxfY29uZmlnLmggdG8gYXZvaWQgYW55IGZ1dHVyZSBjbGFzaGVzCiAgd2l0aCBjb25maWcuaCBmcm9tIG90aGVyIHByb2plY3RzLgoKRGFuaWVsIFN0ZW5iZXJnICg5IEp1bCAyMDA5KQotIEVyaWMgV29uZyBpbnRyb2R1Y2VkIGN1cmx4X25vbmJsb2NrKCkgdGhhdCB0aGUgY3VybCB0b29sIG5vdyAocmUtKXVzZXMgZm9yCiAgc2V0dGluZyBhIGZpbGUgZGVzY3JpcHRvciBub24tYmxvY2tpbmcuIFVzZWQgYnkgdGhlIGZ1bmN0aW9uYWxpdHkgRXJpYwogIGhpbXNlbGYgYnJvdWdoIG9uIEp1bmUgMTV0aC4KCkRhbmllbCBTdGVuYmVyZyAoOCBKdWwgMjAwOSkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBwb3N0ZWQgYnVnIHJlcG9ydCAjMjgxMzEyMwogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjgxMzEyMykgYW5kIGFuIGEgcGF0Y2ggdGhhdCBmaXhlcyB0aGUKICBwcm9ibGVtOgoKICBVcmwgQSBpcyBhY2Nlc3NlZCB1c2luZyBhdXRoLiBVcmwgQSByZWRpcmVjdHMgdG8gVXJsIEIgKG9uIGEgZGlmZmVyZW50CiAgc2VydmVyMC4gVXJsIEIgcmV1c2VzIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLiBVcmwgQiBoYXMgYXV0aCwgZXZlbiB0aG91Z2gKICBpdCdzIG9uIGEgZGlmZmVyZW50IHNlcnZlci4KCiAgTm90ZTogaWYgVXJsIEIgZG9lcyBub3QgcmV1c2UgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24sIGF1dGggaXMgbm90IHNlbnQuCgogIHJlYXNvbjoKCiAgZGF0YS0+c3RhdGUuZmlyc3RfaG9zdCBpcyBub3QgaW5pdGlhbGl6ZWQgYmVjdWFzZSBDdXJsX2h0dHBfY29ubmVjdCBpcyBub3QKICBjYWxsZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgcmV1c2VkLgoKICBTb2x1dGlvbjoKCiAgbW92ZSBpbml0aWFsaXphdGlvbiBvZiBkYXRhLT5zdGF0ZS5maXJzdF9ob3N0IHRvIEN1cmxfaHR0cC4gTm8gY29kZSBiZWZvcmUKICBDdXJsX2h0dHAgdXNlcyBkYXRhLT5zdGF0ZS5maXJzdF9ob3N0IGFueXdheS4KCkd1ZW50ZXIgS25hdWYgKDQgSnVsIDIwMDkpCi0gTWFya3VzIEtvZXR0ZXIgcHJvdmlkZWQgYSBwYXRjaCB0byBhdm9pZCBnZXRuYW1laW5mbygpIHVzYWdlIHdoaWNoIGJyb2tlIGEKICBjb3VwbGUgb2YgYm90aCBJUHY0IGFuZCBJUHY2IGF1dG9idWlsZHMuCgpEYW5pZWwgU3RlbmJlcmcgKDI5IEp1biAyMDA5KQotIE1hcmt1cyBLb2V0dGVyIG1hZGUgQ1VSTE9QVF9GVFBQT1JUIChhbmQgY3VybCdzIC1QLy0tZnRwcG9ydCkgc3VwcG9ydCBhIHBvcnQKICByYW5nZSBpZiBnaXZlbiBjb2xvbi1zZXBhcmF0ZWQgYWZ0ZXIgdGhlIGhvc3QgbmFtZS9hZGRyZXNzIHBhcnQuIExpa2UKICAiMTkyLjE2OC4wLjE6MjAwMC0xMDAwMCIKCi0gTW9kaWZpZWQgdGhlIHNlcGFyYXRvcnMgdXNlZCBmb3IgQ1VSTE9QVF9DRVJUSU5GTyBpbiBtdWx0aS1wYXJ0IG91dHB1dHMuIEkKICBkb24ndCBrbm93IGhvdyB0aGV5IGdvdCB3cm9uZyBpbiB0aGUgZmlyc3QgcGxhY2UsIGJ1dCB1c2luZyB0aGlzIG91dHB1dAogIGZvcm1hdCBtYWtlcyBpdCBwb3NzaWJsZSB0byBxdWl0ZSBlYXNpbHkgc2VwYXJhdGUgdGhlIHN0cmluZyBpbnRvIGFuIGFycmF5CiAgb2YgbXVsdGlwbGUgaXRlbXMuCgpEYW5pZWwgRmFuZHJpY2ggKDE2IEp1bmUgMjAwOSkKLSBBZGRlZCBhIGZldyBtb3JlIGNvbXBpbGVyIHdhcm5pbmcgb3B0aW9ucyBmb3IgZ2NjLgoKRGFuaWVsIFN0ZW5iZXJnICgxNiBKdW4gMjAwOSkKLSBSZXV2ZW4gV2FjaHRmb2dlbCBtYWRlIGN1cmwgLW8gLSBwcm9wZXJseSBwcm9kdWNlIGEgYmluYXJ5IG91dHB1dCBvbiB3aW5kb3dzCiAgKG5vIG5ld2xpbmUgdHJhbnNsYXRpb25zKS4gVXNlIC1CLy0tdXNlLWFzY2lpIGlmIHlvdSByYXRoZXIgZ2V0IHRoZSBhc2NpaQogIGFwcHJvYWNoLgoKTWljaGFsIE1hcmVrICgxNiBKdW4gMjAwOSkKLSBXaGVuIGRvaW5nIG5vbi1hbm9ueW1vdXMgZnRwIHZpYSBodHRwIHByb3hpZXMgYW5kIHRoZSBwYXNzd29yZCBpcyBub3QKICBwcm92aWRlZCBpbiB0aGUgdXJsLCBhZGQgaXQgdGhlcmUgKHNxdWlkIG5lZWRzIHRoaXMpLgoKRGFuaWVsIFN0ZW5iZXJnICgxNSBKdW4gMjAwOSkKLSBFcmljIFdvbmcncyBwYXRjaDoKCiAgVGhpcyBhbGxvd3MgY3VybCgxKSB0byBiZSB1c2VkIGFzIGEgY2xpZW50LXNpZGUgdHVubmVsIGZvciBhcmJpdHJhcnkgc3RyZWFtCiAgcHJvdG9jb2xzIGJ5IGFidXNpbmcgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZyBpbiBib3RoIHRoZSBIVFRQIHJlcXVlc3QgYW5kCiAgSFRUUCByZXNwb25zZS4gIFRoaXMgcmVxdWlyZXMgc2VydmVyIHN1cHBvcnQgZm9yIHNlbmRpbmcgYSByZXNwb25zZSB3aGlsZSBhCiAgcmVxdWVzdCBpcyBzdGlsbCBiZWluZyByZWFkLCBvZiBjb3Vyc2UuCgogIElmIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHN0ZGluIHJldHVybnMgRUFHQUlOLCB0aGVuIHdlIHBhdXNlIG91ciBzZW5kZXIuCiAgVGhpcyBsZWF2ZXMgY3VybCB0byBhdHRlbXB0IHRvIHJlYWQgZnJvbSB0aGUgc29ja2V0IHdoaWxlIHJlYWRpbmcgZnJvbSBzdGRpbgogIChhbmQgdGh1cyBzZW5kaW5nKSBpcyBwYXVzZWQuCgogIFRoaXMgY2hhbmdlIHdhcyBuZWVkZWQgdG8gYWxsb3cgc3VjY2Vzc2Z1bGx5IHR1bm5lbGluZyB0aGUgZ2l0IHByb3RvY29sIG92ZXIKICBIVFRQICgtLW5vLWJ1ZmZlciBpcyBuZWVkZWQsIGFzIHdlbGwpLgoKUGF0cmljayBNb25uZXJhdCAoMTUgSnVuIDIwMDkpCi0gUmVwbGFjZWQgdXNlIG9mIHN0YW5kYXJkIEMgbGlicmFyeSByYW5kKCkvc3JhbmQoKSBieSBvdXIgb3duIHBzZXVkby1yYW5kb20KICBudW1iZXIgZ2VuZXJhdG9yLgoKWWFuZyBUc2UgKDExIEp1biAyMDA5KQotIEkgYWRhcHRlZCB0ZXN0Y3VybCBzY3JpcHQgdG8gYWxsb3cgYnVpbGRpbmcgdGVzdCBoYXJuZXNzIHByb2dyYW1zIHdoZW4KICBjcm9zcy1jb21waWxpbmcgZm9yIGEgKi0qLW1pbmd3KiBob3N0LgoKRGFuaWVsIFN0ZW5iZXJnICgxMCBKdW4gMjAwOSkKLSBGYWJpYW4gS2VpbCByYW4gY2xhbmcgb24gdGhlIChsaWIpY3VybCBjb2RlLCBmb3VuZCBhIGJ1bmNoIG9mIHdhcm5pbmdzIGFuZAogIGNvbnRyaWJ1dGVkIGEgcmFuZ2Ugb2YgcGF0Y2hlcyB0byBmaXggdGhlbS4KCllhbmcgVHNlICgxMCBKdW4gMjAwOSkKLSBJIGludHJvZHVjZWQgY29uZmlndXJlIHNjcmlwdCBvcHRpb24gLS1lbmFibGUtY3VybGRlYnVnIHdoaWNoIG5vdyBhbGxvd3MKICB0aGUgZGVjb3VwbGVkIGVuYWJsaW5nIG9yIGRpc2FibGluZyBvZiB0aGUgY3VybCBkZWJ1ZyBtZW1vcnkgdHJhY2tpbmcKICBmZWF0dXJlIGZyb20gdGhlIC0tZW5hYmxlLWRlYnVnIG9wdGlvbiB3aGljaCBubyBsb25nZXIgY29udHJvbHMgdGhpcy4KCiAgY3VybCAtLXZlcnNpb24gd2lsbCBsaXN0ICdEZWJ1ZycgZmVhdHVyZSBmb3IgZGVidWcgZW5hYmxlZCBidWlsZHMsIGFuZAogIHdpbGwgbGlzdCAnVHJhY2tNZW1vcnknIGZlYXR1cmUgZm9yIGN1cmwgZGVidWcgbWVtb3J5IHRyYWNraW5nIGNhcGFibGUKICBidWlsZHMuIFRoZXNlIGZlYXR1cmVzIGFyZSBpbmRlcGVuZGVudCBhbmQgY2FuIGJlIGNvbnRyb2xsZWQgd2hlbiBydW5uaW5nCiAgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuIFdoZW4gLS1lbmFibGUtZGVidWcgaXMgZ2l2ZW4gYm90aCBmZWF0dXJlcyB3aWxsIGJlCiAgZW5hYmxlZCwgdW5sZXNzIHNvbWUgcmVzdHJpY3Rpb24gcHJldmVudHMgbWVtb3J5IHRyYWNraW5nIGZyb20gYmVpbmcgdXNlZC4KCiAgSW50ZXJuYWxseSwgZGVmaW5pdGlvbiBvZiBwcmVwcm9jZXNzb3Igc3ltYm9sIERFQlVHQlVJTEQgcmVzdHJpY3RzIGNvZGUKICB3aGljaCBpcyBvbmx5IGNvbXBpbGVkIGZvciBkZWJ1ZyBlbmFibGVkIGJ1aWxkcy4gQW5kIHN5bWJvbCBDVVJMREVCVUcgaXMKICB1c2VkIHRvIGRpZmZlcmVudGlhdGUgY29kZSB3aGljaCBpcyBfb25seV8gdXNlZCBmb3IgbWVtb3J5IHRyYWNraW5nLgoKWWFuZyBUc2UgKDkgSnVuIDIwMDkpCi0gRGFuaWVsIFN0ZWluYmVyZyBwb2ludGVkIG91dCB0aGF0IEN1cmxfRm9ybUluaXQoKSBpbiBmb3JtZGF0YS5jIHdhcyBub3QKICBpbml0aWFsaXppbmcgdGhlIGZyZWFkIGNhbGxiYWNrIHBvaW50ZXIgYW5kIHRoaXMgdHJpZ2dlcmVkIGEgY29tcGlsZXIKICB3YXJuaW5nLCBhbHNvIHByb3ZpZGVkIGEgZnJpZW5kbHkgc3VnZ2VzdGlvbiBvbiBob3cgdG8gZml4IGl0LgoKRGFuaWVsIFN0ZW5iZXJnICg4IEp1biAyMDA5KQotIENsYWVzIEpha29ic3NvbiBwcm92aWRlZCBhIHBhdGNoIGZvciBsaWJjdXJsLU5TUyB0aGF0IGZpeGVkIGEgYmFkIHJlZmNvdW50CiAgaXNzdWUgd2l0aCBjbGllbnQgY2VydHMgdGhhdCBjYXVzZWQgaXNzdWVzIGxpa2Ugc2VnZmF1bHRzLgogIGh0dHBzOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDktMDUvMDMxNi5odG1sCgotIFRyaWdnZXJlZCBieSBidWcgcmVwb3J0ICMyNzk4ODUyIGFuZCB0aGUgcGF0Y2ggaW4gdGhlcmUsIEkgZml4ZWQgY29uZmlndXJlCiAgdG8gZGV0ZWN0IGdudXRscyBidWlsZCBvcHRpb25zIHdpdGggcGtnLWNvbmZpZyBvbmx5IGFuZCBub3QgbGliZ251dGxzLWNvbmZpZwogIGFueW1vcmUgc2luY2UgR251VExTIGhhcyBzdG9wcGVkIGRpc3RyaWJ1dGluZyB0aGF0IHRvb2wuIElmIGFuIGV4cGxpY2l0IHBhdGgKICBpcyBnaXZlbiB0byBjb25maWd1cmUsIHdlIHdpbGwgaW5zdGVhZCBndWVzcyBvbiBob3cgdG8gbGluayBhbmQgdXNlIHRoYXQKICBsaWIuIEkgZGlkIG5vdCB1c2UgdGhlIHBhdGNoIGZyb20gdGhlIGJ1ZyByZXBvcnQuCgpZYW5nIFRzZSAoOCBKdW4gMjAwOSkKLSBJZ29yIE5vdm9zZWx0c2V2IGFkanVzdGVkIE1ha2VmaWxlLnZ4d29ya3MgdG8gZ2V0IHNvdXJjZXMgYW5kIGhlYWRlcnMKICBpbmNsdWRlZCBmcm9tIE1ha2VmaWxlLmluYywgYW5kIHByb3ZpZGVkIGRvY3NcSU5TVEFMTCBWeFdvcmtzIHNlY3Rpb24uCgotIEkgcmVtb3ZlZCBidWlsZGNvbmYuYmF0IGZyb20gcmVsZWFzZSBhbmQgZGFpbHkgc25hcHNob3QgYXJjaGl2ZXMuIFRoaXMKICBmaWxlIGlzIG9ubHkgZm9yIENWUyB0cmVlIGNoZWNrb3V0IGJ1aWxkcy4KCkRhbmllbCBTdGVuYmVyZyAoOCBKdW4gMjAwOSkKLSBFcmljIFdvbmcgZml4ZWQgLS1uby1idWZmZXIgdG8gYWN0dWFsbHkgc3dpdGNoIG9mZiBvdXRwdXQgYnVmZmVyaW5nLiBCZWVuCiAgYnJva2VuIHNpbmNlIDcuMTkuMAoKQmlsbCBIb2ZmbWFuICg2IEp1biAyMDA5KQotIEFkZGVkIHNvbWUgY21ha2UgZG9jcyBhbmQgZml4ZWQgc29ja2xlbl90IGluIHRoZSBidWlsZC4KCllhbmcgVHNlICg1IEp1biAyMDA5KQotIEpvaG4gRS4gTWFsbWJlcmcgcHJvdmlkZWQgVk1TIHNwZWNpZmljIHBhdGNoOiAiVGhpcyBmaXhlcyBhbiBleGlzdGluZyBidWcKICBpbiB1cmxnbG9iLmMgd2hlcmUgaXQgd2FzIG5vdCBjb252ZXJ0aW5nIHRoZSBDdXJsIFVuaXggZXhpdCBjb2RlIHRvIGEgVk1TCiAgRENMIGNvbXBhdGlibGUgZXhpdCBjb2RlLiAgVGhpcyBmaXggcmVxdWlyZWQgdGhlIGVuaGFuY2VtZW50IGRlc2NyaWJlZCBuZXh0LgogIFRoaXMgYWxzbyBhZGRzIGFuIGVuaGFuY2VtZW50IHRvIG1haW4uYyBzbyB0aGF0IHdoZW4gY3VybCBpcyBydW4gdW5kZXIgYQogIFVuaXggc2hlbGwgbGlrZSBCYXNoIG9uIFZNUywgaXQgd2lsbCByZXR1cm4gdGhlIHN0YW5kYXJkIFVuaXggZXhpdCBjb2RlcwogIGFuZCBtZXNzYWdlcy4iIEFuZCBhbm90aGVyIHBhdGNoIGZvciBkb2NzL2V4YW1wbGVzLgoKICBJIGludHJvZHVjZWQgb3Mtc3BlY2lmaWMuYyBhbmQgb3Mtc3BlY2lmaWMuaCBmb3IgdXNlIGluIGN1cmwgdG9vbCBjb2RlCiAgYW5kIGFkanVzdGVkIEpvaG4gRS4gTWFsbWJlcmcncyBwYXRjaCBwbGFjZW1lbnQgdG8gdXNlIHRoZXNlIG5ldyBmaWxlcwogIGFzIGFuIGVmZm9ydCB0byBwcmV2ZW50IG1haW4uYyBmcm9tIGdyb3dpbmcgYWQgaW5maW5pdHVtLiBDb2RlIGFscmVhZHkKICBleGlzdGluZyBpbiBtYWluLmMgd2hpY2ggaXMgT1Mgc3BlY2lmaWMgc2hvdWxkIGJlIG1vdmVkIGludG8gdGhlc2UgZmlsZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDQgSnVuZSAyMDA5KQotIFNldHRpbmcgdGhlIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXIgZnJvbSB5b3VyIGFwcCB3aGVuIHlvdSBkbyBhIFBPU1Qgb3IgUFVUCiAgaXMgYWxtb3N0IGFsd2F5cyBhIFZFUlkgQkFEIElERUEuIFlldCB0aGVyZSBhcmUgc3RpbGwgYXBwcyBvdXQgdGhlcmUgZG9pbmcKICB0aGlzLCBhbmQgbm93IHJlY2VudGx5IGl0IHRyaWdnZXJlZCBhIGJ1Zy9zaWRlLWVmZmVjdCBpbiBsaWJjdXJsIGFzIHdoZW4KICBsaWJjdXJsIHNlbmRzIGEgUE9TVCBvciBQVVQgd2l0aCBOVExNLCBpdCBzZW5kcyBhbiBlbXB0eSBwb3N0IGZpcnN0IHdoZW4gaXQKICBrbm93cyBpdCB3aWxsIGp1c3QgZ2V0IGEgNDAxLzQwNyBiYWNrLiBJZiB0aGUgYXBwIHRoZW4gcmVwbGFjZWQgdGhlCiAgQ29udGVudC1MZW5ndGggaGVhZGVyLCBpdCBjYXVzZWQgdGhlIHNlcnZlciB0byB3YWl0IGZvciBpbnB1dCB0aGF0IGxpYmN1cmwKICB3b3VsZG4ndCBzZW5kLiBBYXJvbiBPbmVhbCByZXBvcnRlZCB0aGlzIHByb2JsZW0gaW4gYnVnIHJlcG9ydCAjMjc5OTAwOAogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjc5OTAwOCkgYW5kIGhlbHBlZCB1cyB2ZXJpZnkgdGhlIGZpeC4KCllhbmcgVHNlICg0IEp1biAyMDA5KQotIElnb3IgTm92b3NlbHRzZXYgcHJvdmlkZWQgcGF0Y2hlcyBhbmQgaW5mb3JtYXRpb24sIHRoYXQgYWZ0ZXIgc29tZQogIGFkanVzdG1lbnRzIHRvIGJldHRlciBmaXQgY3VybCdzIHdheSBvZiBkb2luZyB0aGluZ3MsIGhhdmUgcmVzdWx0ZWQKICBpbiB0aGUgcG9zaWJpbGl0eSBvZiBidWlsZGluZyBsaWJjdXJsIGZvciBWeFdvcmtzLgoKRGFuaWVsIEZhbmRyaWNoICgyIEp1bmUgMjAwOSkKLSBDaGVja2VkIGluIGEgR29vZ2xlIEFuZHJvaWQgbWFrZSBmaWxlLiBUbyB1c2UgaXQsIHlvdSBtdXN0IGZpcnN0CiAgY3JlYXRlIGEgY29uZmlnLmggZmlsZSBieSBydW5uaW5nIGNvbmZpZ3VyZSBpbiB0aGUgQW5kcm9pZCBlbnZpcm9ubWVudCwKICB3aGljaCBkb2Vzbid0IHNlZW0gdG8gYmUgZWFzeSB0byBkby4gSWYgbm8gZWFzeSB3YXkgY2FuIGJlIGZvdW5kLCBhCiAgc3RhdGljIGNvbmZpZy1hbmRyb2lkLmggbWF5IG5lZWQgdG8gYmUgY3JlYXRlZCBhbmQgY2hlY2tlZCBpbiB0byB0aGUKICBsaWJjdXJsIHNvdXJjZSB0cmVlLgoKRGFuaWVsIFN0ZW5iZXJnICgxIEp1bmUgMjAwOSkKLSBDbGFlcyBKYWtvYnNzb24gZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYmV0dGVyIGZpbmQgYW5kIHVzZSBOU1MKICB3aXRob3V0IHBrZy1jb25maWcuCgpZYW5nIFRzZSAoMSBKdW4gMjAwOSkKLSBKb2huIEUuIE1hbG1iZXJnIHByb3ZpZGVkIGEgVk1TIHNwZWNpZmljIGNsZWFuLXVwIGZvciBjdXJsLmgsIGFuZCBwb2ludGVkCiAgb3V0IHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2FzIGZhaWxpbmcgdG8gZGV0ZWN0IHRoZSB0aW1ldmFsIHN0cnVjdCBvbgogIFZNUyB3aGVuIGJ1aWxkaW5nIHdpdGggX1hPUEVOX1NPVVJDRV9FWFRFTkRFRCB1bmRlZmluZWQgZHVlIHRvIGRlZmluaXRpb24KICB0YWtpbmcgcGxhY2UgaW4gc29ja2V0LmggaW5zdGVhZCBvZiB0aW1lLmguICBJIGhhdmUgYWRqdXN0ZWQgY29uZmlndXJlCiAgc2NyaXB0IHRvIGFsc28gaW5jbHVkZSB0aGlzIGhlYWRlciB3aGVuIGNoZWNraW5nIHN0cnVjdCB0aW1ldmFsLgoKRGFuaWVsIFN0ZW5iZXJnICgyNyBNYXkgMjAwOSkKLSBGcmFuayBNY0dlb3VnaCBwcm92aWRlZCBhIHNtYWxsIE9wZW5TU0wgI2luY2x1ZGUgZml4IHRvIG1ha2UgbGliY3VybCBjb21waWxlCiAgZmluZSB3aXRoIE5va2lhIDV0aCBlZGl0aW9uIDEuMCBTREsgZm9yIFN5bWJpYW4uCgotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZm91bmQgYSBjYWxsIHRvIGEgT3BlblNTTCBmdW5jdGlvbiB0aGF0IGRpZG4ndCBjaGVjawogIGZvciBhIGZhaWx1cmUgcHJvcGVybHkuCgotIE1pa2UgQ3Jvd2UgcG9pbnRlZCBvdXQgdGhhdCBzZXR0aW5nIENVUkxPUFRfVVNFUlBXRCB0byBOVUxMIHVzZWQgdG8gY2xlYXIKICB0aGUgYXV0aCBjcmVkZW50aWFscyBiYWNrIGluIDcuMTkuMCBhbmQgZWFybGllciB3aGlsZSBub3cgeW91IGhhdmUgdG8gc2V0ICIiCiAgdG8gZ2V0IHRoZSBzYW1lIGVmZmVjdC4gSGlzIHBhdGNoIGJyaW5ncyBiYWNrIHRoZSBhYmlsaXR5IHRvIHVzZSBOVUxMLgoKLSBDbGFlcyBKYWtvYnNzb24gZml4ZWQgbGliY3VybC1OU1MgdG8gYnVpbGQgZmluZSBldmVuIHdpdGhvdXQgdGhlCiAgUEsxMV9DcmVhdGVHZW5lcmljT2JqZWN0KCkgZnVuY3Rpb24uCgpEYW5pZWwgU3RlbmJlcmcgKDI1IE1heSAyMDA5KQotIGJ1ZyByZXBvcnQgIzI3OTYzNTggKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzk2MzU4KSBwb2ludGVkCiAgb3V0IHRoYXQgdGhlIGNvb2tpZSBwYXJzZXIgd291bGQgbGVhayBtZW1vcnkgd2hlbiBpdCBwYXJzZXMgY29va2llcyB0aGF0IGFyZQogIHJlY2VpdmVkIHdpdGggZG9tYWluLCBwYXRoIGV0YyBzZXQgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHNhbWUgaGVhZGVyLiBXaGlsZQogIHN1Y2ggYSBjb29raWUgaXMgcXVlc3Rpb25hYmxlLCB0aGV5IG9jY3VyIGluIHRoZSB3aWxkIGFuZCBsaWJjdXJsIG5vIGxvbmdlcgogIGxlYWtzIG1lbW9yeSBmb3IgdGhlbS4gSSBhZGRlZCBzdWNoIGEgaGVhZGVyIHRvIHRlc3QgY2FzZSA4LgoKRGFuaWVsIEZhbmRyaWNoICgyMiBNYXkgMjAwOSkKLSBSZW1vdmVkIHNvbWUgb2Jzb2xldGUgZGlnZXN0IGNvZGUgdGhhdCBjYXVzZWQgYSB2YWxncmluZCBlcnJvciBpbiB0ZXN0IDU1MS4KCkRhbmllbCBGYW5kcmljaCAoMjAgTWF5IDIwMDkpCi0gQWRkZWQgIm5vbi1leGlzdGluZyBob3N0IiB0ZXN0IGtleXdvcmRzIHRvIG1ha2UgaXQgZWFzeSB0byBza2lwIHRob3NlCiAgdGVzdHMgb24gbWFjaGluZXMgdGhhdCBoYXZlIGJyb2tlbiBETlMgY29uZmlndXJhdGlvbnMgKHN1Y2ggYXMKICB0aG9zZSBjb25maWd1cmVkIHRvIHVzZSBPcGVuRE5TKS4KCkRhbmllbCBTdGVuYmVyZyAoMTkgTWF5IDIwMDkpCi0gS2FtaWwgRHVka2EgYnJvdWdodCB0aGUgcGF0Y2ggZnJvbSB0aGUgUmVkaGF0IGJ1ZyBlbnRyeQogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NDI3OTY2IHdoaWNoIHdhcyBsaWJjdXJsIGNsb3NpbmcKICBhIGJhZCBmaWxlIGRlc2NyaXB0b3Igd2hlbiBjbG9zaW5nIGRvd24gdGhlIEZUUCBkYXRhIGNvbm5lY3Rpb24uICBDYW9sYW4KICBNY05hbWFyYSBzZWVtcyB0byBiZSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9mIGl0LgoKVmVyc2lvbiA3LjE5LjUgKDE4IE1heSAyMDA5KQoKRGFuaWVsIFN0ZW5iZXJnICgxNyBNYXkgMjAwOSkKLSBKYW1lcyBCdXJzYSBwb3N0ZWQgYSBwYXRjaCB0byB0aGUgbWFpbGluZyBsaXN0IHRoYXQgZml4ZWQgYSBwcm9ibGVtIHdpdGgKICBub19wcm94eSB3aGljaCBtYWRlIGl0IG5vdCBza2lwIHRoZSBwcm94eSBpZiB0aGUgVVJMIGVudGVyZWQgY29udGFpbmVkIGEKICB1c2VyIG5hbWUuIEkgYWRkZWQgdGVzdCBjYXNlIDExMDEgdG8gdmVyaWZ5LgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBNYXkgMjAwOSkKLSBCYWxpbnQgU3ppbGFrc3ppIHJlcG9ydGVkIGEgbWVtb3J5IGxlYWsgd2hlbiBsaWJjdXJsIGRpZCBnemlwIGRlY29tcHJlc3Npb24KICBvZiBzdHJlYW1zIHRoYXQgaGFkIHNvbWUgcGFydHMgKGxlZ2l0aW1hdGVseSkgbWlzc2luZy4gV2Ugbm93IHByb3ZpZGUgYW5kIHVzZQogIGEgcHJvcGVyIGNsZWFudXAgZnVuY3Rpb24gZm9yIHRoZSBjb250ZW50IGVuY29kaW5nIHN1Ym1vZHVsZS4KICBodHRwczovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA5LTA1LzAwOTIuaHRtbAoKLSBLYW1pbCBEdWRrYSBwcm92aWRlZCBhIGZpeCBmb3IgbGliY3VybC1OU1MgcmVwb3J0ZWQgYnkgTWljaGFlbCBDcm9uZW53b3J0aAogIGF0IGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NDUzNjEyI2MxMgoKICBJZiBhbiBpbmNvcnJlY3QgcGFzc3dvcmQgaXMgZ2l2ZW4gd2hpbGUgbG9hZGluZyBhIHByaXZhdGUga2V5LCBsaWJjdXJsIGVuZHMKICB1cCBpbiBhbiBpbmZpbml0ZSBsb29wIGNvbnN1bWluZyBtZW1vcnkuIFRoZSBidWcgaXMgY3JpdGljYWwuCgotIEkgZml4ZWQgdGhlIHByb2JsZW0gd2l0aCBkb2luZyBOVExNLCBQT1NUIGFuZCB0aGVuIGZvbGxvd2luZyBhIDMwMiByZWRpcmVjdCwKICBhcyByZXBvcnRlZCBieSBFYmVuZXplciBJa29ubmUgKG9uIGN1cmwtdXNlcnMpIGFuZCBMYXVyZW50IFJhYnJldCAob24KICBjdXJsLWxpYnJhcnkpLiBUaGUgdHJhbnNmZXIgd2FzIG1pc3Rha2VubHkgbWFya2VkIHRvIGdldCBtb3JlIGRhdGEgdG8gc2VuZAogIGJ1dCBzaW5jZSBpdCBkaWRuJ3QgYWN0dWFsbHkgaGF2ZSB0aGF0LCBpdCBqdXN0IGh1bmcgdGhlcmUuLi4KCkRhbmllbCBTdGVuYmVyZyAoMTAgTWF5IDIwMDkpCi0gQW5kcmUgR3VpYmVydCBkZSBCcnVldCBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgYW4gb3Zlci1hbGxvYyB3aXRoIG9uZSB3YXN0ZWQKICBieXRlIGluIHRoZSBkaWdlc3QgY29kZS4KCllhbmcgVHNlICg5IE1heSAyMDA5KQotIFJlbW92ZWQgRE9TIGFuZCBUUEYgcGFja2FnZSdzIHN1YmRpcmVjdG9yeSBNYWtlZmlsZS5hbSwgaXQgd2FzIG9ubHkgdXNlZAogIHRvIGluY2x1ZGUgc29tZSBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uIHRhcmJhbGwgc2VydmluZyBubyBvdGhlciBwdXJwb3NlLgogIEZpbGVzIGZyb20gdGhlIERPUyBhbmQgVFBGIHN1YmRpcmVjdG9yaWVzIGFyZSBub3cgaW5jbHVkZWQgaW4gdGhlIEVYVFJBX0RJU1QKICBvZiB0aGUgTWFrZWZpbGUgaW4gdGhlIHBhcmVudCBzdWJkaXJlY3RvcnkuCgpZYW5nIFRzZSAoOCBNYXkgMjAwOSkKLSBDaGFuZ2VkIGhvc3QgbmFtZSBsaXRlcmFsIGluIHNldmVyYWwgdGVzdHMgdG8gb25lIHVuZGVyIHRoZSBoYXh4LnNlIGRvbWFpbi4KCi0gUmVuYW1lZCB2YzYgd29ya3NwYWNlIGFuZCBwcm9qZWN0IGZpbGVzIHRvIGF2b2lkIGZpbGVuYW1lIGNsYXNoIHdoZW4gdXNlZAogIGZvciBjb252ZXJzaW9uIHRvIGxhdGVyIFZTIHZlcnNpb25zLgoKRGFuaWVsIFN0ZW5iZXJnICg4IE1heSAyMDA5KQotIENvbnN0YW50aW5lIFNhcHVudHpha2lzIGZpeGVkIGJ1ZyByZXBvcnQgIzI3ODQwNTUKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3ODQwNTUpIGlkZW50aWZ5aW5nIGEgcHJvYmxlbSB0bwogIGNvbm5lY3QgdG8gU09DS1MgcHJveGllcyB3aGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UuIEl0IHR1cm5lZCBvdXQgdG8KICBhbG1vc3Qgbm90IHdvcmsgYXQgYWxsIHByZXZpb3VzbHkuIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIFRDUCBjb25uZWN0IHRvCiAgYmUgcHJvcGVybHkgdmVyaWZpZWQgYmVmb3JlIGRvaW5nIHRoZSBTT0NLUyBtYWdpYy4KCiAgVGhlcmUncyBzdGlsbCBhIGZsYXcgaW4gdGhlIEZUUCBjb2RlIGZvciB0aGlzLgoKRGFuaWVsIFN0ZW5iZXJnICg3IE1heSAyMDA5KQotIE1hZGUgdGhlIFNPX1NOREJVRiBzZXR0aW5nIGZvciB0aGUgZGF0YSBjb25uZWN0aW9uIHNvY2tldCBmb3IgZnRwIHVwbG9hZHMgYXMKICB3ZWxsLiBTZWUgY2hhbmdlIDI4IEFwciAyMDA5LgoKWWFuZyBUc2UgKDcgTWF5IDIwMDkpCi0gRml4ZWQgYW4gaXNzdWUgYWZmZWN0aW5nIEZUUCB0cmFuc2ZlcnMsIGludHJvZHVjZWQgd2l0aCB0aGUgdHJhbnNmZXIuYwogIHBhdGNoIGNvbW1pdHRlZCBNYXkgNC4KCkRhbmllbCBTdGVuYmVyZyAoNyBNYXkgMjAwOSkKLSBNYW4gcGFnZSAqcm9mZiBwcm9ibGVtcyBmaXhlZCB0aGFua3MgdG8gaW5wdXQgZnJvbSBDb2xpbiBXYXRzb24uIFByb2JsZW1zCiAgcmVwb3J0ZWQgaW4gdGhlIERlYmlhbiBwYWNrYWdlLgoKLSBWaWpheSBHIGZpbGVkIGJ1ZyByZXBvcnQgIzI3MjMyMzYKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3MjMyMzYpIGlkZW50aWZ5aW5nIGEgcHJvYmxlbSB3aXRoCiAgbGliY3VybCdzIFRGVFAgY29kZSBhbmQgaXRzIGxhY2sgb2YgZGVhbGluZyB3aXRoIHRoZSBPQUNLIHBhY2tldC4KCllhbmcgVHNlICg1IE1heSAyMDA5KQotIEZpeGVkIHRoZSAtLWZ0cC1wb3J0IGFkZHJlc3Mgb2YgdGVzdCAjMjUxIHRvIHRoZSBDTElFTlRJUCBhZGRyZXNzLCBhbmQKICByZXZlcnRlZCB0aGUgY2hhbmdlIGFmZmVjdGluZyB0ZXN0IHN1aXRlIGhhcm5lc3MgY29tbWl0dGVkIDQgTWF5LgoKRGFuaWVsIFN0ZW5iZXJnICg1IE1heSAyMDA5KQotIEluc3BpcmVkIGJ5IE1pY2hhZWwgU21pdGgncyBzZXNzaW9uIGlkIGZpeCBmb3IgT3BlblNTTCwgSSBkaWQgdGhlCiAgY29ycmVzcG9uZGluZyBmaXggaW4gdGhlIEdudVRMUyBjb2RlOiBtYWtlIHN1cmUgdG8gc3RvcmUgdGhlIG5ldyBzZXNzaW9uIGlkCiAgaW4gY2FzZSB0aGUgcHJldmlvdXMgcmUtdXNlZCBvbmUgaXMgcmVqZWN0ZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDQgTWF5IDIwMDkpCi0gTWljaGFlbCBTbWl0aCBwb3N0ZWQgYnVnIHJlcG9ydCAjMjc4NjI1NQogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjc4NjI1NSkgd2l0aCBhIHBhdGNoLCBpZGVudGlmeWluZyBob3cKICBsaWJjdXJsIGRpZCBub3QgZGVhbCB3aXRoIFNTTCBzZXNzaW9uIGlkcyBwcm9wZXJseSBpZiB0aGUgc2VydmVyIHJlamVjdGVkIGEKICByZS11c2Ugb2Ygb25lLiBTdGFydGluZyBub3csIGl0IHdpbGwgZm9yZ2V0IHRoZSByZWplY3RlZCBvbmUgYW5kIHJlbWVtYmVyCiAgdGhlIG5ldy4gVGhpcyBjaGFuZ2Ugd2FzIGZvciBPcGVuU1NMIG9ubHksIGl0IGlzIGxpa2VseSB0aGF0IG90aGVyIFNTTCBsaWIKICBjb2RlIG5lZWRzIHNpbWlsYXIgZml4ZXMuCgpZYW5nIFRzZSAoNCBNYXkgMjAwOSkKLSBBcHBsaWVkIERhdmlkIE1jQ3JlZWR5J3MgInRyYW5zZmVyLmMgZml4ZXMgZm9yIENVUkxfRE9fTElORUVORF9DT05WIGFuZAogIG5vbi1BU0NJSSBwbGF0Zm9ybSBIVFRQIHJlcXVlc3RzIiBwYXRjaCBhZGRyZXNzaW5nIHR3byBIVFRQIFBVVCBwcm9ibGVtczoKICAxKSBPbiBub24tQVNDSUkgcGxhdGZvcm1zIG5vdCBhbGwgb2YgdGhlIHByb3RvY29sIHBvcnRpb25zIG9mIHRoZSBQVVQgYXJlCiAgYmVpbmcgdHJhbnNsYXRlZCB0byBBU0NJSS4gIDIpIE9uIGFsbCBwbGF0Zm9ybXMgdGhlIGxpbmUgZW5kaW5ncyBvZiBwYXJ0IG9mCiAgdGhlIHByb3RvY29sIHBvcnRpb25zIGFyZSBtYW5nbGVkIGZyb20gQ1JMRiB0byBDUkNSTEYgaWYgZGF0YS0+c2V0LmNybGYgb3IKICBkYXRhLT5zZXQucHJlZmVyX2FzY2lpIGFyZSBzZXQgKGRlcGVuZGluZyBvbiBDVVJMX0RPX0xJTkVFTkRfQ09OVikuCgotIEFwcGxpZWQgRGF2aWQgTWNDcmVlZHkncyBwYXRjaCB0byBmaXggdGVzdCBzdWl0ZSBoYXJuZXNzIHRvIGFsbG93IHRlc3QgRlRQCiAgc2VydmVyIGFuZCBjbGllbnQgb24gZGlmZmVyZW50IG1hY2hpbmVzLCBwcm92aWRpbmcgRlRQIGNsaWVudCBhZGRyZXNzIHdoZW4KICBydW5uaW5nIHRoZSBGVFAgdGVzdCBzZXJ2ZXIuCgpEYW5pZWwgRmFuZHJpY2ggKDMgTWF5IDIwMDkpCi0gQWRkZWQgYW5kIGRpc2FibGVkIHRlc3QgY2FzZSA1NjMgd2hpY2ggc2hvd3MgS05PV05fQlVHUyAjNTkuICBUaGUgYnVnCiAgcmVwb3J0IGZhaWxlZCB0byBtZW50aW9uIHRoYXQgYSBwcm94eSBtdXN0IGJlIHVzZWQgdG8gcmVwcm9kdWNlIGl0LgoKWWFuZyBUc2UgKDIgTWF5IDIwMDkpCi0gVXNlIGEgYnVpbGQtdGltZSBjb25maWd1cmVkIGN1cmxfc29ja2xlbl90IGRhdGEgdHlwZSBpbnN0ZWFkIG9mIHNvY2tsZW5fdC4KCllhbmcgVHNlICgxIE1heSAyMDA5KQotIEFwcGxpZWQgRGF2aWQgTWNDcmVlZHkncyBwYXRjaGVzICJUUEYtcGxhdGZvcm0gc3BlY2lmaWMgY2hhbmdlcyB0byB2YXJpb3VzCiAgZmlsZXMiIGFuZCAiaHR0cC5jIGZpeCB0byBDdXJsX3Byb3h5Q09OTkVDVCBmb3Igbm9uLUFTQ0lJIHBsYXRmb3JtcyIsIHRoZQogIGZvcm1lciB3aXRoIG1pbm9yIGVkaXRzLgoKRGFuaWVsIFN0ZW5iZXJnICgzMCBBcHIgMjAwOSkKLSBJIHdhcyBnb2luZyB0byBmaXggaXNzdWUgIzU5IGluIEtOT1dOX0JVR1MKCiAgSWYgdGhlIENVUkxPUFRfUE9SVCBvcHRpb24gaXMgdXNlZCBvbiBhbiBGVFAgVVJMIGxpa2UKICAiZnRwOi8vZXhhbXBsZS5jb20vZmlsZTt0eXBlPUEiIHRoZSAiO3R5cGU9QSIgaXMgc3RyaXBwZWQgb2ZmLgoKICBJIGFkZGVkIHRlc3QgY2FzZSA1NjIgdG8gdmVyaWZ5LCBvbmx5IHRvIGZpbmQgb3V0IHRoYXQgSSBjb3VsZG4ndCByZXBlYXQKICB0aGlzIGJ1ZyBzbyBJIGhlcmVieSBjb25zaWRlciBpdCBub3QgYSBidWcgYW55bW9yZSEKCkRhbmllbCBTdGVuYmVyZyAoMjkgQXByIDIwMDkpCi0gQmFzZWQgb24gYnVnIHJlcG9ydCAjMjcyMzIxOSAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3MjMyMTkpCiAgSSd2ZSBub3cgbWFkZSBURlRQICJjb25uZWN0aW9ucyIgbm90IGJlaW5nIGtlcHQgZm9yIHJlLXVzZSB3aXRoaW4gbGliY3VybC4KICBURlRQIGlzIFVEUC1iYXNlZCBzbyB0aGUgYmVuZWZpdCB3YXMgcmVhbGx5IGxvdyAoaWYgZXZlbiBleGlzdGluZykgdG8gYmVnaW4KICB3aXRoIHNvIGluc3RlYWQgb2YgdHJhY2tpbmcgZG93biB0byBmaXggdGhpcyBwcm9ibGVtIHdlIGluc3RlYWQgcmVtb3ZlZCB0aGUKICByZS11c2UuIEkgYWxzbyBlbmFibGVkIHRlc3QgY2FzZSAxMDk5IHRoYXQgSSB3cm90ZSBhIGZldyBkYXlzIGFnbyB0byB2ZXJpZnkKICB0aGF0IHRoaXMgY2hhbmdlIGZpeGVzIHRoZSByZXBvcnRlZCBwcm9ibGVtLgoKRGFuaWVsIFN0ZW5iZXJnICgyOCBBcHIgMjAwOSkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBmaWxlZCBidWcgcmVwb3J0ICMyNzgzMDkwCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzgzMDkwKSBwb2ludGluZyBvdXQgdGhhdCBvbiB3aW5kb3dzCiAgd2UgbmVlZCB0byBncm93IHRoZSBTT19TTkRCVUYgYnVmZmVyIHNvbWV3aGF0IHRvIGdldCByZWFsbHkgZ29vZCB1cGxvYWQKICBzcGVlZHMuIGh0dHBzOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzgyMzc2NCBoYXMgdGhlIGRldGFpbHMuIEZyaWVuZHMKICBjb25maXJtZWQgdGhhdCBzaW1wbHkgYWRkaW5nIDMyIHRvIENVUkxfTUFYX1dSSVRFX1NJWkUgaXMgZW5vdWdoLgoKLSBCdWcgcmVwb3J0ICMyNzA5MDA0IChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjcwOTAwNCkgYnkgVGltCiAgQ2hlbiBwb2ludGVkIG91dCBob3cgY3VybCBjb3VsZG4ndCB1cGxvYWQgd2l0aCByZXN1bWUgd2hlbiByZWFkaW5nIGZyb20gYQogIHBpcGUuCgogIFRoaXMgZW5kZWQgdXAgd2l0aCB0aGUgaW50cm9kdWN0aW9uIG9mIGEgbmV3IHJldHVybiBjb2RlIGZvciB0aGUKICBDVVJMT1BUX1NFRUtGVU5DVElPTiBjYWxsYmFjayB0aGF0IGJhc2ljYWxseSBzYXlzIHRoYXQgdGhlIHNlZWsgZmFpbGVkIGJ1dAogIHRoYXQgbGliY3VybCBtYXkgdHJ5IHRvIHJlc29sdmUgdGhlIHNpdHVhdGlvbiBhbnl3YXkuIEluIG91ciBjYXNlIHRoaXMgbWVhbnMKICBsaWJjdXJsIHdpbGwgYXR0ZW1wdCB0byBpbnN0ZWFkIHJlYWQgdGhhdCBtdWNoIGRhdGEgZnJvbSB0aGUgc3RyZWFtIGluc3RlYWQKICBvZiBzZWVraW5nIGFuZCB0aGF0IHdheSBjdXJsIGNhbiBub3cgdXBsb2FkIHdpdGggcmVzdW1lIHdoZW4gZGF0YSBpcyByZWFkCiAgZnJvbSBhIHN0cmVhbSEKCkRhbmllbCBTdGVuYmVyZyAoMjYgQXByIDIwMDkpCi0gQnVnIHJlcG9ydCAjMjc3OTczMyAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3Nzk3MzMpIGJ5IFN2ZW4KICBXZWdlbmVyIHBvaW50ZWQgb3V0IHRoYXQgQ1VSTElORk9fQVBQQ09OTkVDVF9USU1FIGRpZG4ndCB3b3JrIHdpdGggdGhlIG11bHRpCiAgaW50ZXJmYWNlIGFuZCBwcm92aWRlZCBhIHBhdGNoIHRoYXQgZml4ZWQgdGhlIHByb2JsZW0hCgpEYW5pZWwgU3RlbmJlcmcgKDI0IEFwciAyMDA5KQotIEthbWlsIER1ZGthIGZpeGVkIGFub3RoZXIgTlNTLXJlbGF0ZWQgbGVhayB3aGVuIGNsaWVudCBjZXJ0cyB3ZXJlIHVzZWQuCgotIEJ1ZyByZXBvcnQgIzI3NzkyNDUgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzc5MjQ1KSBieSBSYWluZXIKICBLb2VuaWcgcG9pbnRlZCBvdXQgdGhhdCB0aGUgbWFuIHBhZ2UgZGlkbid0IHRlbGwgdGhhdCB0aGUgKl9wcm94eQogIGVudmlyb25tZW50IHZhcmlhYmxlcyBjYW4gYmUgc3BlY2lmaWVkIGxvd2VyIGNhc2Ugb3IgVVBQRVIgQ0FTRSBhbmQgdGhlCiAgbG93ZXIgY2FzZSB0YWtlcyBwcmVjZWRlbmNlLAoKRGFuaWVsIEZhbmRyaWNoICgyMSBBcHIgMjAwOSkKLSBBZGRlZCBuZXcgbGliY3VybCBzb3VyY2UgZmlsZXMgdG8gQW1pZ2EsIFJpc2NPUyBhbmQgVkM2IGJ1aWxkIGZpbGVzLgoKWWFuZyBUc2UgKDIxIEFwciAyMDA5KQotIE1vdmVkIHBvdGVudGlhbCBpbmNsdXNpb24gb2Ygc3lzdGVtJ3MgbWFsbG9jLmggYW5kIG1lbW9yeS5oIGhlYWRlciBmaWxlcyB0bwogIHNldHVwX29uY2UuaC4gIEluY2x1c2lvbiBvZiBlYWNoIGhlYWRlciBmaWxlIGlzIGJhc2VkIG9uIHRoZSBkZWZpbml0aW9uIG9mCiAgTkVFRF9NQUxMT0NfSCBhbmQgTkVFRF9NRU1PUllfSCByZXNwZWN0aXZlbHkuCgogIFJlbmFtZWQgbGliY3VybCdzIG1lbW9yeS5oIHRvIGN1cmxfbWVtb3J5LmgKCkRhbmllbCBTdGVuYmVyZyAoMjAgQXByIDIwMDkpCi0gTGVhbmljIExlZmV2ZXIgcmVwb3J0ZWQgYSBjcmFzaCBhbmQgZGlkIHNvbWUgZGV0YWlsZWQgcmVzZWFyY2ggb24gd2h5IGFuZAogIGhvdyBpdCBvY2N1cnMgKGh0dHBzOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDktMDQvMDI4OS5odG1sKS4gVGhlCiAgY29uY2x1c2lvbiB3YXMgdGhhdCBpZiBhbiBlcnJvciBpcyBkZXRlY3RlZCBhbmQgQ3VybF9kb25lKCkgaXMgY2FsbGVkIGZvcgogIHRoZSBjb25uZWN0aW9uLCBmdHBfZG9uZSgpIGNvdWxkIGF0IHRpbWVzIHJldHVybiBhbm90aGVyIGVycm9yIGNvZGUgdGhhdAogIHRoZW4gd291bGQgdGFrZSBwcmVjZWRlbmNlIGFuZCB0aGF0IG5ldyBjb2RlIGNvbmZ1c2VkIGV4aXN0aW5nIGxvZ2ljIHRoYXQKICB3b3JrcyBmb3IgdGhlIGZpcnN0IGVycm9yIGNvZGUgKENVUkxFX1NFTkRfRVJST1IpIG9ubHkuCgotIEdpc2xlIFZhbmVtIG5vdGljZWQgdGhhdCAtLWxpYnRvb2wgd291bGQgcHJvZHVjZSBib2d1cyBzdHJpbmdzIGF0IHRpbWVzIGZvcgogIE9CSkVDVFBPSU5UIG9wdGlvbnMuIE5vdyB3ZSd2ZSBpbnRyb2R1Y2VkIGEgbmV3IGZ1bmN0aW9uIC0gbXlfc2V0b3B0X3N0ciAtCiAgd2l0aGluIHRoZSBhcHAgZm9yIHNldHRpbmcgcGxhaW4gc3RyaW5nIG9wdGlvbnMgdG8gYXZvaWQgdGhlIHJpc2sgb2YgdGhpcwogIG1pc3Rha2UgaGFwcGVuaW5nLgoKRGFuaWVsIFN0ZW5iZXJnICgxNyBBcHIgMjAwOSkKLSBQcmFtb2QgU2hhcm1hIHJlcG9ydGVkIGFuZCB0cmFja2VkIGRvd24gYSBidWcgd2hlbiBkb2luZyBGVFAgb3ZlciBhIEhUVFAKICBwcm94eS4gbGliY3VybCB3b3VsZCB0aGVuIHdyb25nbHkgY2xvc2UgdGhlIGNvbm5lY3Rpb24gYWZ0ZXIgZWFjaAogIHJlcXVlc3QuIEluIGhpcyBjYXNlIGl0IGhhZCB0aGUgd2VpcmQgc2lkZS1lZmZlY3QgdGhhdCBpdCBraWxsZWQgTlRMTSBhdXRoCiAgZm9yIHRoZSBwcm94eSBjYXVzaW5nIGFuIGluaWZpbml0ZSBsb29wIQoKICBJIGFkZGVkIHRlc3QgY2FzZSAxMDk4IHRvIHZlcmlmeSB0aGlzIGZpeC4gVGhlIHRlc3QgY2FzZSBkb2VzIGhvd2V2ZXIgbm90CiAgcHJvcGVybHkgdmVyaWZ5IHRoYXQgdGhlIHRyYW5zZmVycyBhcmUgZG9uZSBwZXJzaXN0ZW50bHkgLSBhcyBJIGNvdWxkbid0CiAgdGhpbmsgb2YgYSBjbGV2ZXIgd2F5IHRvIGFjaGlldmUgaXQgcmlnaHQgbm93IC0gYnV0IHlvdSBuZWVkIHRvIHJlYWQgdGhlCiAgc3RkZXJyIG91dHB1dCBhZnRlciBhIHRlc3QgcnVuIHRvIHNlZSB0aGF0IGl0IHRydWx5IGRpZCB0aGUgcmlnaHQgdGhpbmcuCgpEYW5pZWwgU3RlbmJlcmcgKDEzIEFwciAyMDA5KQotIGJ1ZyByZXBvcnQgIzI3Mjc5ODEgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzI3OTgxKSBieSBNYXJ0aW4KICBTdG9yc2r2IHBvaW50ZWQgb3V0IGhvdyBzZXR0aW5nIENVUkxPUFRfTk9CT0RZIHRvIDAgY291bGQgYmUgZG93bnJpZ2h0CiAgY29uZnVzaW5nIGFzIGl0IHNldCB0aGUgbWV0aG9kIHRvIGVpdGhlciBHRVQgb3IgSEVBRC4gVGhlIGV4YW1wbGUgaGUgc2hvd2VkCiAgbG9va2VkIGxpa2U6CgogICBjdXJsX2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfUFVULCAxKTsKICAgY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BUX05PQk9EWSwgMCk7CgogIFRoZSBuZXcgd2F5IGRvZXNuJ3QgYWx0ZXIgdGhlIG1ldGhvZCB1bnRpbCB0aGUgcmVxdWVzdCBpcyBhYm91dCB0byBzdGFydC4gSWYKICBDVVJMT1BUX05PQk9EWSBpcyB0aGVuIDEgdGhlIEhUVFAgcmVxdWVzdCB3aWxsIGJlIEhFQUQuIElmIENVUkxPUFRfTk9CT0RZIGlzCiAgMCBhbmQgdGhlIHJlcXVlc3QgaGFwcGVucyB0byBoYXZlIGJlZW4gc2V0IHRvIEhFQUQsIGl0IHdpbGwgdGhlbiBpbnN0ZWFkIGJlCiAgc2V0IHRvIEdFVC4gSSBiZWxpZXZlIHRoaXMgd2lsbCBiZSBsZXNzIHN1cnByaXNpbmcgdG8gdXNlcnMsIGFuZCBob3BlZnVsbHkKICBub3QgaGl0IGFueSBleGlzdGluZyB1c2VycyBiYWRseS4KCi0gVG9zaGlvIEt1cmF0b21pIHJlcG9ydGVkIGEgbWVtb3J5IGxlYWsgcHJvYmxlbSB3aXRoIGxpYmN1cmwrTlNTIHRoYXQgdHVybmVkCiAgb3V0IHRvIGJlIGxlYWtpbmcgY2FjZXJ0cy4gS2FtaWwgRHVka2EgaGVscGVkIG1lIGNvbXBsZXRlIHRoZSBmaXguIFRoZSBpc3N1ZQogIGlzIGZvdW5kIGluIFJlZGhhdCdzIGJ1ZyB0cmFja2VyOgogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NDUzNjEyCgogIFRoZXJlIGFyZSBzdGlsbCBtZW1vcnkgbGVha3MgcHJlc2VudCwgYnV0IHRoZXkgc2VlbSB0byBoYXZlIG90aGVyIHJlYXNvbnMuCgpEYW5pZWwgRmFuZHJpY2ggKDExIEFwciAyMDA5KQotIEFkZGVkIG5ldyBsaWJjdXJsIHNvdXJjZSBmaWxlcyB0byBTeW1iaWFuIE9TIGJ1aWxkIGZpbGVzLgotIEltcHJvdmVkIFN5bWJpYW4gc3VwcG9ydCBmb3IgU1NMLgoKWWFuZyBUc2UgKDEwIEFwciAyMDA5KQotIERhbmllbCBKb2huc29uIGltcHJvdmVkIHRoZSBNYWNPU1gtRnJhbWV3b3JrIHNoZWxsIHNjcmlwdCB0byBub3cgcGVyZm9ybSBhbGwKICB0aGUgc3RlcHMgcmVxdWlyZWQgdG8gYnVpbGQgYSBNYWMgT1MgWCBmb3VyIHdheSBmYXQgcHBjL2kzODYvcHBjNjQveDg2XzY0CiAgbGliY3VybC5mcmFtZXdvcmsuICBGb3VyIHdheSBmYXQgZnJhbWV3b3JrIHJlcXVpcmVzIE9TIFggMTAuNSBTREsgb3IgbGF0ZXIuCgpZYW5nIFRzZSAoOCBBcHIgMjAwOSkKLSBSZW1vdmVkIFN1biBjb21waWxlcnMgcHJlcHJvY2Vzc29yIGJsb2NrIGZyb20gY3VybGJ1aWxkLmguZGlzdCwgdGhpcyBhbHNvCiAgcmVtb3ZlcyBpdCBmcm9tIHRoZSBjdXJsYnVpbGQuaCBmaWxlIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgdGhlIGNVUkwKICBwcm9qZWN0IGFzIHRoaXMgZmlsZSBpcyBpbnRlbmRlZCBmb3Igc3lzdGVtcyBub3QgY2FwYWJsZSBvZiBydW5uaW5nIHRoZQogIGNvbmZpZ3VyZSBzY3JpcHQuICBGb3IgdGhvc2Ugd2hvIGhhdmUgYmVlbiBidWlsZGluZyBjdXJsIG91dCBvZiB0aGUgc291cmNlCiAgY29kZSBjdXJsIGRpc3RyaWJ1dGlvbiB0YXJiYWxsIHByb3ZpZGVkIGJ5IGN1cmwuaGF4eC5zZSB0aGUgY2hhbmdlIGltcGxpZXMKICBub3RoaW5nLiAgUHJldmlvdXMgY2hhbmdlIGluIHRoaXMgYXJlYSBjb21taXR0ZWQgMiBBcHIgYmVjb21lcyBpcnJlbGV2YW50LgoKRGFuaWVsIFN0ZW5iZXJnICg2IEFwciAyMDA5KQotIEkgY2xhcmlmaWVkIGluIHRoZSBkb2NzIHRoYXQgQ1VSTE9QVF9TRUVLRlVOQ1RJT04gc2hvdWxkIHJldHVybiAwIG9uIHN1Y2Nlc3MKICBhbmQgMSBvbiBmYXRhbCBlcnJvcnMuIFByZXZpb3VzbHkgaXQgb25seSBtZW50aW9uZWQgbm9uLXplcm8gb24gZmF0YWwKICBlcnJvcnMuIFRoaXMgaXMgYSBzbGlnaHQgY2hhbmdlIGluIG1lYW5pbmcsIGJ1dCBpdCBmb2xsb3dzIHdoYXQgd2UndmUgZG9uZQogIGVsc2V3aGVyZSBiZWZvcmUgYW5kIGl0IG9wZW5zIHVwIGZvciBMT1RTIG9mIG1vcmUgdXNlZnVsIHJldHVybiBjb2RlcwogIHdoZW5ldmVyIHdlIGNhbiB0aGluayBvZiB0aGVtLi4uCgpZYW5nIFRzZSAoMiBBcHIgMjAwOSkKLSBGaXggY3VybF9vZmZfdCBkZWZpbml0aW9uIGZvciBidWlsZHMgZG9uZSB1c2luZyBTdW4gY29tcGlsZXJzIGFuZCBhCiAgbm9uLWNvbmZpZ3VyZWQgbGliY3VybC4gSW4gdGhpcyBjYXNlIGN1cmxfb2ZmX3QgZGF0YSB0eXBlIHdhcyBnYXRlZAogIHRvIHRoZSBvZmZfdCBkYXRhIHR5cGUgd2hpY2ggZGVwZW5kcyBvbiB0aGUgX0ZJTEVfT0ZGU0VUX0JJVFMuIFRoaXMKICBjb25maWd1cmF0aW9uIGlzIGV4YWN0bHkgdGhlIHVud2FudGVkIGNvbmZpZ3VyYXRpb24gZm9yIG91ciBjdXJsX29mZl90CiAgZGF0YSB0eXBlIHdoaWNoIG11c3Qgbm90IGRlcGVuZCBvbiBzdWNoIHNldHRpbmcuIFRoaXMgYnJlYWtzIEFCSSBmb3IKICBsaWJjdXJsIGxpYnJhcmllcyBidWlsdCB3aXRoIFN1biBjb21waWxlcnMgd2hpY2ggd2VyZSBidWlsdCB3aXRob3V0CiAgaGF2aW5nIHJ1biB0aGUgY29uZmlndXJlIHNjcmlwdCB3aXRoIF9GSUxFX09GRlNFVF9CSVRTIGRpZmZlcmVudCB0aGFuCiAgNjQgYW5kIHVzaW5nIHRoZSBJTFAzMiBkYXRhIG1vZGVsLgoKRGFuaWVsIFN0ZW5iZXJnICgxIEFwciAyMDA5KQotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZml4ZWQgYSBOVUxMIHBvaW50ZXIgdXNlIGluIGFuIGluZm9mKCkgY2FsbCBpZiBhCiAgc3RyZHVwKCkgY2FsbCBmYWlsZWQuCgpEYW5pZWwgRmFuZHJpY2ggKDMxIE1hciAyMDA5KQotIFByb3Blcmx5IHJldHVybiBhbiBlcnJvciBjb2RlIGluIGN1cmxfZWFzeV9yZWN2IChyZXBvcnRlZCBieSBKaW0gRnJlZW1hbikuCgpEYW5pZWwgU3RlbmJlcmcgKDE4IE1hciAyMDA5KQotIEthbWlsIER1ZGthIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGVuYWJsZXMgNiBhZGRpdGlvbmFsIGNyeXB0byBhbGdvcml0aG1zIHdoZW4KICBOU1MgaXMgdXNlZC4gVGhlc2UgY2lwaGVycyB3ZXJlIGFkZGVkIGluIE5TUyAzLjQgYW5kIHJlcXVpcmUgdG8gYmUgZW5hYmxlZAogIGV4cGxpY2l0bHkuCgpEYW5pZWwgU3RlbmJlcmcgKDEzIE1hciAyMDA5KQotIFVzZSBsaWJzc2gyX3ZlcnNpb24oKSB0byBwcmVzZW50IHRoZSBsaWJzc2gyIHZlcnNpb24gaW4gY2FzZSB0aGUgbGlic3NoMgogIGxpYnJhcnkgaXMgZm91bmQgdG8gc3VwcG9ydCBpdC4KCllhbmcgVHNlICgxMiBNYXIgMjAwOSkKLSBBZGRlZCBtaXNzaW5nIEN1cmxfcmVhZCgpIHJldHVybiBjb2RlIGNoZWNraW5nIGluIFRFTE5FVCB0cmFuc2ZlcnMuCgotIFBpZXJyZSBCcmljbyBmb3VuZCBhbmQgZml4ZWQgVEVMTkVUIHRyYW5zZmVycyBub3QgYmVpbmcgYWJvcnRlZCB1cG9uCiAgYSB3cml0ZSBjYWxsYmFjayBmYWlsdXJlLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBNYXIgMjAwOSkKLSBLYW1pbCBEdWRrYSBtYWRlIHRoZSBjdXJsIHRvb2wgcHJvcGVybHkgY2FsbCBjdXJsX2dsb2JhbF9pbml0KCkgYmVmb3JlIGFueQogIG90aGVyIGxpYmN1cmwgZnVuY3Rpb24uCgpZYW5nIFRzZSAoMTEgTWFyIDIwMDkpCi0gQWRkZWQgbWlzc2luZyBURUxORVQgdGltZW91dCBzdXBwb3J0IGZvciBXaW5kb3dzIGJ1aWxkcy4gVGhpcyBpc3N1ZSB3YXMKICByZXBvcnRlZCBieSBQaWVycmUgQnJpY28uCgpEYW5pZWwgU3RlbmJlcmcgKDkgTWFyIDIwMDkpCi0gRnJhbmsgSGVtcGVsIGZvdW5kIG91dCBhIGJ1ZyBhbmQgcHJvdmlkZWQgdGhlIGZpeDoKCiAgY3VybF9lYXN5X2R1cGhhbmRsZSBkaWQgbm90IG5lY2Vzc2FyaWx5IGR1cGxpY2F0ZSB0aGUgQ1VSTE9QVF9DT09LSUVGSUxFCiAgb3B0aW9uLiBJdCBvbmx5IGVuYWJsZWQgdGhlIGNvb2tpZSBlbmdpbmUgaW4gdGhlIGRlc3RpbmF0aW9uIGhhbmRsZSBpZgogIGRhdGEtPmNvb2tpZXMgaXMgbm90IE5VTEwgKHdoZXJlIGRhdGEgaXMgdGhlIHNvdXJjZSBoYW5kbGUpLiBJbiBjYXNlIG9mIGEKICBuZXdseSBpbml0aWFsaXplZCBoYW5kbGUgd2hpY2gganVzdCBoYWQgdGhlIGNvb2tpZSBzdXBwb3J0IGVuYWJsZWQgYnkgYQogIGN1cmxfZWFzeV9zZXRvcHQoaGFuZGxlLCBDVVJMX0NPT0tJRUZJTEUsICIiKS1jYWxsLCBoYW5kbGUtPmNvb2tpZXMgd2FzCiAgc3RpbGwgTlVMTCBiZWNhdXNlIHRoZSBzZXRvcHQtY2FsbCBvbmx5IGFwcGVuZHMgdGhlIHZhbHVlIHRvCiAgZGF0YS0+Y2hhbmdlLmNvb2tpZWxpc3QsIGhlbmNlIGR1cGxpY2F0aW5nIHRoaXMgaGFuZGxlIHdvdWxkIG5vdCBoYXZlIHRoZQogIGNvb2tpZSBlbmdpbmUgc3dpdGNoZWQgb24uCgogIFdlIGFsc28gY29uY2x1ZGVkIHRoYXQgdGhlIHNsaXN0LWZ1bmN0aW9uYWxpdHkgd291bGQgYmUgc3VpdGFibGUgZm9yIGJlaW5nCiAgcHV0IGluIGl0cyBvd24gbW9kdWxlIHJhdGhlciB0aGFuIHNpbXBseSBoYW5naW5nIG91dCBpbiBsaWIvc2VuZGYuYyBzbyBJCiAgY3JlYXRlZCBsaWIvc2xpc3QuW2NoXSBmb3IgdGhlbS4KCi0gQW5kcmVhcyBGYXJiZXIgbWFkZSB0aGUgJ2J1aWxkY29uZicgc2NyaXB0IGNoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgbTQKICBzY3JpcHRzIHRvIG1ha2UgaXQgZGV0ZWN0IGEgYmFkIGNoZWNrb3V0IGVhcmxpZXIuIFBlb3BsZSB3aXRoIG9sZGVyCiAgY2hlY2tvdXRzIHdobyBkb24ndCBkbyBjdnMgdXBkYXRlIHdpdGggdGhlIC1kIG9wdGlvbiB3b24ndCBnZXQgdGhlIG5ldyBkaXJzCiAgYW5kIHRoZW4gd2lsbCBnZXQgZnVubnkgb3V0cHV0cyB0aGF0IGNhbiBiZSBhIGJpdCBoYXJkIHRvIHVuZGVyc3RhbmQgYW5kCiAgZml4LgoKRGFuaWVsIFN0ZW5iZXJnICg4IE1hciAyMDA5KQotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZm91bmQgYW5kIGZpeGVkIGEgY29kZSBzZWdtZW50IGluIHNzbHVzZS5jIHdoZXJlIHRoZQogIGFsbG9jYXRpb24gb2YgdGhlIG1lbW9yeSBCSU8gd2FzIG5vdCBiZWluZyBwcm9wZXJseSBjaGVja2VkLgoKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZpeGVkIHRoZSBnbnV0bHMtdXNpbmcgY29kZTogVGhlcmUgYXJlIGEgZmV3IHBsYWNlcwogIGluIHRoZSBnbnV0bHMgY29kZSB3aGVyZSB3ZSB3ZXJlIGNoZWNraW5nIGZvciBuZWdhdGl2ZSB2YWx1ZXMgZm9yIGVycm9ycywKICB3aGVuIHRoZSBtYW4gcGFnZXMgc3RhdGUgdGhhdCBHTlVUTFNfRV9TVUNDRVNTIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MgYW5kCiAgb3RoZXIgdmFsdWVzIGluZGljYXRlIGVycm9yIGNvbmRpdGlvbnMuCgotIEJpbGwgRWdlcnQgcG9pbnRlZCBvdXQgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNjcxNjAyKSB0aGF0CiAgY3VybCBkaWRuJ3QgdXNlIHNwcmludGYoKSBpbiBhIHdheSB0aGF0IGlzIGRvY3VtZW50ZWQgdG8gd29yayBpbiBQT1NJWCBidXQKICBzaW5jZSB3ZSB1c2Ugb3VyIG93biBwcmludGYoKSBjb2RlIChmcm9tIGxpYmN1cmwpIHRoYXQgc2hvdWxkbid0IGJlIGEKICBwcm9ibGVtLiBOb25ldGhlbGVzcyBJIG1vZGlmaWVkIHRoZSBjb2RlIHRvIG5vdCByZWx5IG9uIHN1Y2ggcGFydGljdWxhcgogIGZlYXR1cmVzIGFuZCB0byBub3QgY2F1c2UgZnVydGhlciByYWlzZWQgZXllYnJvd3NlIHdpdGggbm8gZ29vZCByZWFzb24uCgpEYW5pZWwgRmFuZHJpY2ggKDUgTWFyIDIwMDkpCi0gRXhwYW5kZWQgdGhlIHNlY3VyaXR5IHNlY3Rpb24gb2YgdGhlIGxpYmN1cmwtdHV0b3JpYWwgbWFuIHBhZ2UgdG8gY292ZXIKICBtb3JlIGlzc3VlcyBmb3IgYXV0aG9ycyB0byBjb25zaWRlciB3aGVuIHdyaXRpbmcgcm9idXN0IGxpYmN1cmwtdXNpbmcKICBhcHBsaWNhdGlvbnMuCgpZYW5nIFRzZSAoNSBNYXIgMjAwOSkKLSBGaXhlZCBOVExNIGF1dGhlbnRpY2F0aW9uIG1lbW9yeSBsZWFrIG9uIFNTUEkgZW5hYmxlZCBXaW5kb3dzIGJ1aWxkcy4gVGhpcwogIGlzc3VlIHdhcyBub3RpY2VkIGJ5IENocmlzIERlaWR1bi4KCkRhbmllbCBGYW5kcmljaCAoNCBNYXIgMjAwOSkKLSBGaXhlZCBhIHByb2JsZW0gd2l0aCBtNCBxdW90aW5nIGluIHRoZSBPcGVuU1NMIGNvbmZpZ3VyZSBjaGVjayByZXBvcnRlZAogIGJ5IERhbmllbCBKb2huc29uLgoKRGFuaWVsIFN0ZW5iZXJnICgzIE1hciAyMDA5KQotIERhdmlkIEphbWVzIGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2UgbGliY3VybCBjbG9zZSAoYWxsKSBkZWFkIGNvbm5lY3Rpb25zCiAgd2hlbmV2ZXIgeW91IGF0dGVtcHQgdG8gb3BlbiBhIG5ldyBjb25uZWN0aW9uLgoKICAxLiBBZnRlciBjbGVhbmluZyB1cCBhIGRlYWQgY29ubmVjdGlvbiwgImNvbnRpbnVlIiBpbnN0ZWFkIG9mCiAgICAgcmV0dXJuaW5nIEZBTFNFLiBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBjbGVhbiB1cCBhbGwgZGVhZCBjb25uZWN0aW9ucywKICAgICByYXRoZXIgdGhhbiBqdXN0IGNsZWFuaW5nIHVwIHRoZSBmaXJzdCBkZWFkIGNvbm5lY3Rpb24uCiAgMi4gTW92ZSB1cCB0aGUgY2xlYW51cCBmb3IgZGVhZCBjb25uZWN0aW9ucyBzbyB0aGF0IGl0IG9jY3VycyBmb3IKICAgICBhbGwgY29ubmVjdGlvbnMsIHJhdGhlciB0aGFuIGp1c3QgdGhlIGNvbm5lY3Rpb25zIHdoaWNoIGhhdmUgdGhlIHNhbWUKICAgICBwcmVmZXJlbmNlcyBhcyBvdXIgY3VycmVudCBuZXcgY29ubmVjdGlvbi4KClZlcnNpb24gNy4xOS40ICgzIE1hcmNoIDIwMDkpCgpEYW5pZWwgU3RlbmJlcmcgKDMgTWFyIDIwMDkpCi0gRGF2aWQgS2llcnpub3dza2kgbm90aWZpZWQgdXMgYWJvdXQgYSBzZWN1cml0eSBmbGF3CiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2RvY3MvYWR2XzIwMDkwMzAzLmh0bWwgYWxzbyBrbm93biBhcyBDVkUtMjAwOS0wMDM3KSBpbgogIHdoaWNoIHByZXZpb3VzIGxpYmN1cmwgdmVyc2lvbnMgKGJ5IGRlc2lnbikgY2FuIGJlIHRyaWNrZWQgdG8gYWNjZXNzIGFuCiAgYXJiaXRyYXJ5IGxvY2FsL2RpZmZlcmVudCBmaWxlIGluc3RlYWQgb2YgYSByZW1vdGUgb25lIHdoZW4KICBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OIGlzIGVuYWJsZWQuIFRoaXMgZmxhdyBpcyBub3cgZml4ZWQgaW4gdGhpcyByZWxlYXNlCiAgdG9nZXRoZXIgdGhpcyB0aGUgYWRkaXRpb24gb2YgdHdvIG5ldyBzZXRvcHQgb3B0aW9ucyBmb3IgY29udHJvbGxpbmcgdGhpcwogIG5ldyBiZWhhdmlvcjoKCiAgbyBDVVJMT1BUX1JFRElSX1BST1RPQ09MUyBjb250cm9scyB3aGF0IHByb3RvY29scyBsaWJjdXJsIGlzIGFsbG93ZWQgdG8KICBmb2xsb3cgdG8gd2hlbiBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OIGlzIGVuYWJsZWQuIEJ5IGRlZmF1bHQsIHRoaXMgb3B0aW9uCiAgZXhjbHVkZXMgdGhlIEZJTEUgYW5kIFNDUCBwcm90b2NvbHMgYW5kIHRodXMgeW91IG5lZSB0byBleHBsaWNpdGx5IGFsbG93CiAgdGhlbSBpbiB5b3VyIGFwcCBpZiB5b3UgcmVhbGx5IHdhbnQgdGhhdCBiZWhhdmlvci4KCiAgbyBDVVJMT1BUX1BST1RPQ09MUyBjb250cm9scyB3aGF0IHByb3RvY29sKHMpIGxpYmN1cmwgaXMgYWxsb3dlZCB0byBmZXRjaAogIHVzaW5nIHRoZSBwcmltYXJ5IFVSTCBvcHRpb24uIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGFsbG93IGEgdXNlciBvcgogIG90aGVyIG91dHNpZGVycyBjb250cm9sIHdoYXQgVVJMIHRvIHBhc3MgdG8gbGliY3VybCBhbmQgeWV0IG5vdCBhbGxvdyBhbGwKICBwcm90b2NvbHMgbGliY3VybCBtYXkgaGF2ZSBiZWVuIGJ1aWx0IHRvIHN1cHBvcnQuCgpEYW5pZWwgU3RlbmJlcmcgKDI3IEZlYiAyMDA5KQotIFNlbnRoaWwgUmFqYSBWZWx1IHJlcG9ydGVkIGEgcHJvYmxlbSB3aGVuIENVUkxPUFRfSU5URVJGQUNFIGFuZAogIENVUkxPUFRfTE9DQUxQT1JUIHdlcmUgdXNlZCB0b2dldGhlciAodGhlIGxvY2FsIHBvcnQgYmluZCBmYWlsZWQpLCBhbmQKICBNYXJrdXMgS29ldHRlciBwcm92aWRlZCB0aGUgZml4IQoKRGFuaWVsIFN0ZW5iZXJnICgyNSBGZWIgMjAwOSkKLSBBcyBEYW5pZWwgRmFuZHJpY2ggZmlndXJlZCBvdXQsIHdlIG11c3QgZG8gdGhlIEdudVRMUyBpbml0aW5nIGluIHRoZQogIGN1cmxfZ2xvYmFsX2luaXQoKSBmdW5jdGlvbiB0byBwcm9wZXJseSBtYWludGFpbiB0aGUgcGVyZm9ybWluZyBmdW5jdGlvbnMKICB0aHJlYWQtc2FmZS4gV2UndmUgcHJldmlvdXNseSAoMjggQXByaWwgMjAwNykgbW92ZWQgdGhlIGluaXQgdG8gYSBsYXRlciB0aW1lCiAganVzdCB0byBhdm9pZCBpdCB0byBmYWlsIHZlcnkgZWFybHkgd2hlbiBsaWJnY3J5cHQgZGlzbGlrZXMgdGhlIHNpdHVhdGlvbiwKICBidXQgdGhhdCBtb3ZlIHdhcyBiYWQgYW5kIHRoZSBmaXggc2hvdWxkIHJhdGhlciBiZSBpbiBsaWJnY3J5cHQgb3IKICBlbHNld2hlcmUuCgpEYW5pZWwgU3RlbmJlcmcgKDI0IEZlYiAyMDA5KQotIEJyaWFuIEouIE11cnJlbGwgZm91bmQgb3V0IHRoYXQgTmVnb3RpYXRlIHByb3h5IGF1dGhlbnRpY2F0aW9uIGRpZG4ndCB3b3JrLgogIEl0IGhhcHBlbmVkIGJlY2F1c2UgdGhlIGNvZGUgdXNlZCB0aGUgc3RydWN0IGZvciBzZXJ2ZXItYmFzZWQgYXV0aCBhbGwgdGhlCiAgdGltZSBmb3IgYm90aCBwcm94eSBhbmQgc2VydmVyIGF1dGggd2hpY2ggb2YgY291cnNlIHdhcyB3cm9uZy4KCkRhbmllbCBTdGVuYmVyZyAoMjMgRmViIDIwMDkpCi0gQWZ0ZXIgYSBidWcgcmVwb3J0ZWQgYnkgSmFtZXMgQ2hlbmcgSSd2ZSBtYWRlIGN1cmxfZWFzeV9nZXRpbmZvKCkgZm9yCiAgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgYW5kIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX1VQTE9BRCByZXR1cm4KICAtMSBpZiB0aGUgc2l6ZXMgYXJlbid0IGtub3cuIFByZXZpb3VzbHkgdGhlc2UgcmV0dXJuZWQgMCwgbWFrZSBpdCBpbXBvc3NpYmxlCiAgdG8gZGV0ZWN0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYWN0dWFsbHkgemVybyBhbmQgdW5rbm93bi4KCllhbmcgVHNlICgyMyBGZWIgMjAwOSkKLSBEYW5pZWwgSm9obnNvbiBwcm92aWRlZCBhIHNoZWxsIHNjcmlwdCB0aGF0IHdpbGwgcGVyZm9ybSBhbGwgdGhlIHN0ZXBzIG5lZWRlZAogIHRvIGJ1aWxkIGEgTWFjIE9TIFggZmF0IHBwYy9pMzg2IG9yIHBwYzY0L3g4Nl82NCBsaWJjdXJsLmZyYW1ld29yawoKRGFuaWVsIFN0ZW5iZXJnICgyMyBGZWIgMjAwOSkKLSBJIHJlbmFtZWQgZXZlcnl0aGluZyBpbiB0aGUgd2luZG93cyBidWlsZHMgZmlsZXMgdGhhdCB1c2VkIHRoZSBuYW1lICdjdXJsbGliJwogIHRvIHRoZSBwcm9wZXIgJ2xpYmN1cmwnIGFzIGNsZWFybHkgdGhpcyBjYXVzZWQgY29uZnVzaW9uLgoKWWFuZyBUc2UgKDIwIEZlYiAyMDA5KQotIERvIG5vdCBoYWx0IGNvbXBpbGF0aW9uIHdoZW4gdXNpbmcgVlMyMDA4IHRvIGJ1aWxkIGEgV2luZG93cyAyMDAwIHRhcmdldC4KCkRhbmllbCBTdGVuYmVyZyAoMjAgRmViIDIwMDkpCi0gTGludXMgTmllbHNlbiBGZWx0emluZyByZXBvcnRlZCBhbmQgaGVscGVkIG1lIHJlcGVhdCBhbmQgZml4IGEgcHJvYmxlbSB3aXRoCiAgRlRQIHdpdGggdGhlIG11bHRpIGludGVyZmFjZTogd2hlbiBhIHRyYW5zZmVyIGZhaWxzLCBsaWtlIHdoZW4gYWJvcnRlZCBieSBhCiAgd3JpdGUgY2FsbGJhY2ssIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gd2FzIHdyb25nbHkgY2xvc2VkIGFuZCB0aHVzIG5vdAogIHJlLXVzZWQgcHJvcGVybHkuCgogIFRoaXMgY2hhbmdlIGlzIGFsc28gYW4gYXR0ZW1wdCB0byBjbGVhbnVwIHRoZSBjb2RlIHNvbWV3aGF0IGluIHRoaXMgYXJlYSwgYXMKICBub3cgdGhlIEZUUCBjb2RlIGF0dGVtcHRzIHRvIGtlZXAgKGJldHRlcikgdHJhY2sgb24gcGVuZGluZyByZXNwb25zZXMKICBuZWNlc3NhcnkgdG8gZ2V0IHJlYWQgaW4gZnRwX2RvbmUoKS4KCkRhbmllbCBTdGVuYmVyZyAoMTkgRmViIDIwMDkpCi0gUGF0cmlrIFRodW5zdHJvbSByZXBvcnRlZCBhIHByb2JsZW0gYW5kIGhlbHBlZCBtZSByZXBlYXQgaXQuIEl0IHR1cm5lZCBvdXQKICBsaWJjdXJsIGRpZCBhIHN1cGVyZmx1b3VzIDEwMDBtcyB3YWl0IHdoZW4gZG9pbmcgU0ZUUCBkb3dubG9hZHMhCgogIFdlIHJlYWQgZGF0YSB3aXRoIGxpYnNzaDIgd2hpbGUgZG9pbmcgdGhlICJETyIgb3BlcmF0aW9uIGZvciBTRlRQIGFuZCB0aGVuCiAgd2hlbiB3ZSB3ZXJlIGFib3V0IHRvIHN0YXJ0IGdldHRpbmcgZGF0YSBmb3IgdGhlIGFjdHVhbCBmaWxlIHBhcnQsIHRoZQogICJUUkFOU0ZFUiIgcGFydCwgd2Ugd2FpdGVkIGZvciBzb2NrZXQgYWN0aW9uIChpbiAxMDAwbXMpIGJlZm9yZSBkb2luZyBhCiAgbGlic3NoMi1yZWFkLiBCdXQgaW4gdGhpcyBjYXNlIGxpYnNzaDIgaGFkIGFscmVhZHkgcmVhZCBhbmQgYnVmZmVyZWQgdGhlCiAgZGF0YSBzbyB3ZSBlbmRlZCB1cCBhbHdheXMganVzdCB3YWl0aW5nIDEwMDBtcyBiZWZvcmUgd2UgZ2V0IHdvcmtpbmcgb24gdGhlCiAgZGF0YSEKClBhdHJpY2sgTW9ubmVyYXQgKDE4IEZlYiAyMDA5KQotIEZUUCBkb3dubG9hZHMgKGkuZS46IFJFVFIpIGVuZGluZyB3aXRoIGNvZGUgNTUwIG5vdyByZXR1cm4gZXJyb3IKICBDVVJMRV9SRU1PVEVfRklMRV9OT1RfRk9VTkQgaW5zdGVhZCBvZiBDVVJMRV9GVFBfQ09VTEROVF9SRVRSX0ZJTEUuCgpEYW5pZWwgU3RlbmJlcmcgKDE3IEZlYiAyMDA5KQotIEthbWlsIER1ZGthIG1hZGUgTlNTLXBvd2VyZWQgYnVpbGRzIGNvbXBpbGUgYW5kIHJ1biBhZ2FpbiEKCi0gQSBzZWNvbmQgZm9sbG93LXVwIGNoYW5nZSBieSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IHRvIGZpeCBhIHJlbGF0ZWQgbWVtb3J5CiAgbGVhayBsaWtlIHRoYXQgZml4ZWQgb24gdGhlIDE0dGguIFdoZW4gemxpYiByZXR1cm5zIGZhaWx1cmUsIHdlIG5lZWQgdG8KICBjbGVhbnVwIHByb3Blcmx5IGJlZm9yZSByZXR1cm5pbmcgZXJyb3IuCgotIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMgY2FuIG5vdyBiZSBzZXQgdG8gMiBpbiBhZGRpdGlvbiB0byAxIGZvcgogIHBsYWluIEZUUCBjb25uZWN0aW9ucywgYW5kIGl0IHdpbGwgdGhlbiBhbGxvdyBNS0QgdG8gZmFpbCBvbmNlIGFuZCByZXRyeSB0aGUKICBDV0QgYWZ0ZXJ3YXJkcy4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpZiB5b3UncmUgZG9pbmcgbWFueSBzaW11bHRhbm9lcwogIGNvbm5lY3Rpb25zIGFnYWluc3QgdGhlIHNhbWUgc2VydmVyIGFuZCB0aGV5IGFsbCBoYXZlIHRoaXMgb3B0aW9uIGVuYWJsZWQsCiAgYXMgdGhlbiBDV0QgbWF5IGZpcnN0IGZhaWwgYnV0IHRoZW4gYW5vdGhlciBjb25uZWN0aW9uIGRvZXMgTUtEIGJlZm9yZSB0aGlzCiAgY29ubmVjdGlvbiBhbmQgdGh1cyBNS0QgZmFpbHMgYnV0IHRyeWluZyBDV0Qgd29ya3MhIFRoZSBudW1iZXJzIGNhbgogIChzaG91bGQ/KSBub3cgYmUgc2V0IHdpdGggdGhlIGNvbnZlbmllbmNlIGVudW1zIG5vdyBjYWxsZWQKICBDVVJMRlRQX0NSRUFURV9ESVIgYW5kIENVUkxGVFBfQ1JFQVRFX0RJUl9SRVRSWS4KCiAgVGVzdHMgaGFzIHByb3ZlbiB0aGF0IGlmIHlvdSdyZSBtYWtpbmcgYW4gYXBwbGljYXRpb24gdGhhdCB1cGxvYWRzIGEgc2V0IG9mCiAgZmlsZXMgdG8gYW4gZnRwIHNlcnZlciwgeW91IHdpbGwgZ2V0IGEgbm90aWNhYmxlIGdhaW4gaW4gc3BlZWQgaWYgeW91J3JlCiAgdXNpbmcgbXVsdGlwbGUgY29ubmVjdGlvbnMgYW5kIHRoaXMgb3B0aW9uIHdpbGwgYmUgdGhlbiBiZSB2ZXJ5IHVzZWZ1bC4KCkRhbmllbCBTdGVuYmVyZyAoMTQgRmViIDIwMDkpCi0gQW5kcmUgR3VpYmVydCBkZSBCcnVldCBmb3VuZCBhbmQgZml4ZWQgYSBtZW1vcnkgbGVhayBpbiB0aGUgY29udGVudCBlbmNvZGluZwogIGNvZGUsIHdoaWNoIGNvdWxkIGhhcHBlbiBvbiBsaWJ6IGVycm9ycy4KCkRhbmllbCBGYW5kcmljaCAoMTIgRmViIDIwMDkpCi0gQWRkZWQgc3VwcG9ydCBmb3IgRGlnZXN0IGFuZCBOVExNIGF1dGhlbnRpY2F0aW9uIHVzaW5nIEdudVRMUy4KCkRhbmllbCBTdGVuYmVyZyAoMTEgRmViIDIwMDkpCi0gQ1VSTElORk9fQ09ORElUSU9OX1VOTUVUIHdhcyBhZGRlZCB0byBhbGxvdyBhbiBhcHBsaWNhdGlvbiB0byBnZXQgdG8ga25vdyBpZgogIHRoZSBjb25kaXRpb24gaW4gdGhlIHByZXZpb3VzIHJlcXVlc3Qgd2FzIHVubWV0LiBUaGlzIGlzIHR5cGljYWxseSBhIHRpbWUKICBjb25kaXRpb24gc2V0IHdpdGggQ1VSTE9QVF9USU1FQ09ORElUSU9OIGFuZCB3YXMgcHJldmlvdXNseSBub3QgcG9zc2libGUgdG8KICByZWxpYWJseSBmaWd1cmUgb3V0LiBGcm9tIGJ1ZyByZXBvcnQgIzI1NjUxMjgKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI1NjUxMjgpIGZpbGVkIGJ5IEpvY2VseW4gSmF1YmVydC4KCkRhbmllbCBGYW5kcmljaCAoNCBGZWIgMjAwOSkKLSBEb24ndCBhZGQgdGhlIHN0YW5kYXJkIC91c3IvbGliIG9yIC91c3IvaW5jbHVkZSBwYXRocyB0byBMREZMQUdTIGFuZCBDUFBGTEFHUwogIChyZXNwZWN0aXZlbHkpIHdoZW4gLS13aXRoLXNzbD0vdXNyIGlzIHVzZWQgKHBhdGNoIGJhc2VkIG9uIEZyZWVCU0QpLgoKLSBBZGRlZCBhbiBleHBsaWNpdCBidWZmZXIgbGltaXQgY2hlY2sgaW4gbXNkb3NpZnkoKSAocGF0Y2ggYmFzZWQgb24gRnJlZUJTRCkuCiAgVGhpcyBjb3VsZG4ndCBldmVyIG92ZXJmbG93IGluIGN1cmwsIGJ1dCBtaWdodCBpZiB0aGUgY29kZSB3ZXJlIHVzZWQKICBlbHNld2hlcmUgb3IgdW5kZXIgZGlmZmVyZW50IGNvbmRpdGlvbnMuCgpEYW5pZWwgU3RlbmJlcmcgKDMgRmViIDIwMDkpCi0gSGlkZW1vdG8gTmFrYWRhIHByb3ZpZGVkIGEgc21hbGwgZml4IHRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG8gZ2V0IHRoZQogIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIHNpemUgZnJvbSBmaWxlOi8vICJ0cmFuc2ZlcnMiIHdpdGgKICBDVVJMT1BUX05PQk9EWSBzZXQgdHJ1ZS4KCkRhbmllbCBTdGVuYmVyZyAoMiBGZWIgMjAwOSkKLSBQYXRyaWNrIFNjb3R0IGZvdW5kIGEgcmF0aGVyIGxhcmdlIG1lbW9yeSBsZWFrIHdoZW4gdXNpbmcgdGhlIG11bHRpCiAgaW50ZXJmYWNlIGFuZCBzZXR0aW5nIENVUkxNT1BUX01BWENPTk5FQ1RTIHRvIHNvbWV0aGluZyBsZXNzIHRoYW4gdGhlIG51bWJlcgogIG9mIGhhbmRsZXMgeW91IGFkZCB0byB0aGUgbXVsdGkgaGFuZGxlLiBBbGwgdGhlIGNvbm5lY3Rpb25zIHRoYXQgZGlkbid0IGZpdAogIGluIHRoZSBjYWNoZSB3b3VsZCBub3QgYmUgcHJvcGVybHkgZGlzY29ubmVjdGVkIG5vciBmcmVlZCEKCi0gQ3JhaWcgQSBXZXN0IGJyb3VnaHQgdXM6IGxpYmN1cmwgbm93IGRlZmF1bHRzIHRvIGRvIENPTk5FQ1Qgd2l0aCBIVFRQCiAgdmVyc2lvbiAxLjEgaW5zdGVhZCBvZiAxLjAgbGlrZSBiZWZvcmUuIFRoaXMgY2hhbmdlIGFsc28gaW50cm9kdWNlcyB0aGUgbmV3CiAgcHJveHkgdHlwZSBmb3IgbGliY3VybCBjYWxsZWQgJ0NVUkxQUk9YWV9IVFRQXzFfMCcgdGhhdCB0aGVuIGFsbG93cyBhcHBzIHRvCiAgc3dpdGNoIChiYWNrKSB0byBDT05ORUNUIDEuMCByZXF1ZXN0cy4gVGhlIGN1cmwgdG9vbCBhbHNvIGdvdCBhIC0tcHJveHkxLjAKICBvcHRpb24gdGhhdCB3b3JrcyBleGFjdGx5IGxpa2UgLS1wcm94eSBidXQgc2V0cyBDVVJMUFJPWFlfSFRUUF8xXzAuCgogIEkgdXBkYXRlZCBhbGwgdGVzdCBjYXNlcyBjYXNlcyB0aGF0IHVzZSBDT05ORUNUIGFuZCBJIHRyaWVkIHRvIGRvIHNvbWUgdXNpbmcKICAtLXByb3h5MS4wIGFuZCBzb21lIHVwZGF0ZWQgdG8gZG8gQ09OTkVDVCAxLjEgdG8gZ2V0IGJvdGggdmVyc2lvbnMgcnVuLgoKRGFuaWVsIFN0ZW5iZXJnICgzMSBKYW4gMjAwOSkKLSBXaGVuIGJ1aWxkaW5nIHdpdGggYy1hcmVzIDEuNi4xIChub3QgeWV0IHJlbGVhc2VkKSBvciBsYXRlciBhbmQgSVB2NiBzdXBwb3J0CiAgZW5hYmxlZCwgd2UgY2FuIG5vdyB0YWtlIGFkdmFudGFnZSBvZiBpdHMgYnJhbmQgbmV3IEFGX1VOU1BFQyBzdXBwb3J0IGluCiAgYXJlc19nZXRob3N0YnluYW1lKCkuIFRoaXMgbWFrZXMgdGVzdCBjYXNlIDI0MSBmaW5hbGx5IHJ1biBmaW5lIGZvciBtZSB3aXRoCiAgdGhpcyBzZXR1cCBzaW5jZSBpdCBub3cgcGFyc2VzIHRoZSAiOjoxIGlwNi1sb2NhbGhvc3QiIGxpbmUgZmluZSBpbiBteQogIC9ldGMvaG9zdHMgZmlsZSEKCkRhbmllbCBTdGVuYmVyZyAoMzAgSmFuIDIwMDkpCi0gU2NvdHQgQ2FudG9yIGZpbGVkIGJ1ZyByZXBvcnQgIzI1NTAwNjEKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI1NTAwNjEpIG1lbnRpb25pbmcgdGhhdCBJIGZhaWxlZCB0bwogIHByb3Blcmx5IG1ha2Ugc3VyZSB0aGF0IHRoZSBWQzkgbWFrZWZpbGVzIGdvdCBpbmNsdWRlZCBpbiB0aGUgbGF0ZXN0CiAgcmVsZWFzZS4gSSd2ZSBub3cgZml4ZWQgdGhlIHJlbGVhc2Ugc2NyaXB0IGFuZCB2ZXJpZmllZCBpdCBzbyBuZXh0IHJlbGVhc2UKICB3aWxsIGhvcGVmdWxseSBpbmNsdWRlIHRoZW0gcHJvcGVybHkhCgpEYW5pZWwgRmFuZHJpY2ggKDMwIEphbiAyMDA5KQotIEZpeGVkIC0tZGlzYWJsZS1wcm94eSBmb3IgRlRQIGFuZCBTT0NLUy4gVGhhbmtzIHRvIERhbmllbCBFZ2dlciBmb3IKICByZXBvcnRpbmcuCgpZYW5nIFRzZSAoMjkgSmFuIDIwMDkpCi0gSW50cm9kdWNlZCBjdXJsX3NzcGkuYyBhbmQgY3VybF9zc3BpLmggZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMKICBDdXJsX3NzcGlfZ2xvYmFsX2luaXQoKSBhbmQgQ3VybF9zc3BpX2dsb2JhbF9jbGVhbnVwKCkgd2hpY2ggcHJldmlvdXNseSB3ZXJlCiAgbmFtZWQgQ3VybF9udGxtX2dsb2JhbF9pbml0KCkgYW5kIEN1cmxfbnRsbV9nbG9iYWxfY2xlYW51cCgpIGluIGh0dHBfbnRsbS5jCiAgQWxzbyBhZGp1c3RlZCBzb2Nrc19zc3BpLmMgdG8gcmVtb3ZlIHRoZSBsaW5rLXRpbWUgZGVwZW5kZW5jeSBvbiB0aGUgV2luZG93cwogIFNTUEkgbGlicmFyeSB1c2luZyBpdCBub3cgaW4gdGhlIHNhbWUgd2F5IGFzIGl0IHdhcyBkb25lIGluIGh0dHBfbnRsbS5jLgoKRGFuaWVsIFN0ZW5iZXJnICgyOCBKYW4gMjAwOSkKLSBNYXJrdXMgTW9lbGxlciBpbnRyb2R1Y2VkIHR3byBuZXcgb3B0aW9ucyB0byBsaWJjdXJsOgogIENVUkxPUFRfU09DS1M1X0dTU0FQSV9TRVJWSUNFIGFuZCBDVVJMT1BUX1NPQ0tTNV9HU1NBUElfTkVDIHRvIGFsbG93IGxpYmN1cmwKICB0byBkbyBHU1Mtc3R5bGUgYXV0aGVudGljYXRpb24gd2l0aCBTT0NLUzUgcHJveGllcy4gVGhlIGN1cmwgdG9vbCBnb3QgdGhlCiAgb3B0aW9ucyBjYWxsZWQgLS1zb2NrczUtZ3NzYXBpLXNlcnZpY2UgYW5kIC0tc29ja3M1LWdzc2FwaS1uZWMgdG8gZW5hYmxlCiAgdGhlc2UuCgpEYW5pZWwgU3RlbmJlcmcgKDI2IEphbiAyMDA5KQotIENoYWQgTW9ucm9lIHByb3ZpZGVkIHRoZSBuZXcgQ1VSTE9QVF9URlRQX0JMS1NJWkUgb3B0aW9uIHRoYXQgYWxsb3dzIGFuIGFwcAogIHRvIHNldCBkZXNpcmVkIGJsb2NrIHNpemUgdG8gdXNlIGZvciBURlRQIHRyYW5zZmVycyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0CiAgNTEyIGJ5dGVzLgoKLSBUaGUgIi1ub190aWNrZXQiIG9wdGlvbiB3YXMgaW50cm9kdWNlZCBpbiBPcGVuc3NsMC45LjhqLiBJdCdzIGEgZmxhZyB0bwogIGRpc2FibGUgInJmYzQ1MDdiaXMgc2Vzc2lvbiB0aWNrZXQgc3VwcG9ydCIuICByZmM0NTA3YmlzIHdhcyBsYXRlciB0dXJuZWQKICBpbnRvIHRoZSBwcm9wZXIgUkZDNTA3NyBpdCBzZWVtczogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTA3NwoKICBUaGUgZW5hYmxlZCBleHRlbnNpb24gY29uY2VybnMgdGhlIHNlc3Npb24gbWFuYWdlbWVudC4gSSB3b25kZXIgaG93IG9mdGVuCiAgbGliY3VybCBzdG9wcyBhIGNvbm5lY3Rpb24gYW5kIHRoZW4gcmVzdW1lcyBhIFRMUyBzZXNzaW9uLiBhbHNvLCBzZW5kaW5nIHRoZQogIHNlc3Npb24gZGF0YSBpcyBzb21lIG92ZXJoZWFkLiAuSSBzdWdnZXN0IHRoYXQgeW91IGp1c3QgdXNlIHlvdXIgcHJvcG9zZWQKICBwYXRjaCAod2hpY2ggZXhwbGljaXRseSBkaXNhYmxlcyBUSUNLRVQpLgoKICBJZiBzb21lb25lIHdyaXRlcyBhbiBhcHBsaWNhdGlvbiB3aXRoIGxpYmN1cmwgYW5kIG9wZW5zc2wgd2hvIHdhbnRzIHRvCiAgZW5hYmxlIHRoZSBmZWF0dXJlLCBvbmUgY2FuIGRvIHRoaXMgaW4gdGhlIFNTTCBjYWxsYmFjay4KCiAgU2hhcmFkIEd1cHRhIGJyb3VnaHQgdGhpcyB0byBteSBhdHRlbnRpb24uIFBldGVyIFN5bHZlc3RlciBoZWxwZWQgbWUgZGVjaWRlCiAgb24gdGhlIHByb3BlciBhY3Rpb24uCgotIEFsZXhleSBCb3J6b3YgZmlsZWQgYnVnIHJlcG9ydCAjMjUzNTUwNAogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjUzNTUwNCkgcG9pbnRpbmcgb3V0IHRoYXQgcmVhbG1zIHdpdGgKICBxdW90ZWQgcXVvdGF0aW9uIG1hcmtzIGluIEhUVFAgRGlnZXN0IGhlYWRlcnMgZGlkbid0IHdvcmsuIEkndmUgbm93IGFkZGVkCiAgdGVzdCBjYXNlIDEwOTUgdGhhdCB2ZXJpZmllcyBteSBmaXguCgotIENyYWlnIEEgV2VzdCBicm91Z2h0IENVUkxPUFRfTk9QUk9YWSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgLS1ub3Byb3h5IG9wdGlvbi4KICBUaGV5IGJhc2ljYWxseSBvZmZlciB0aGUgc2FtZSB0aGluZyB0aGUgTk9fUFJPWFkgZW52aXJvbm1lbnQgdmFyaWFibGUgb25seQogIG9mZmVyZWQgcHJldmlvdXNseTogbGlzdCBhIHNldCBvZiBob3N0IG5hbWVzIHRoYXQgc2hhbGwgbm90IHVzZSB0aGUgcHJveHkKICBldmVuIGlmIG9uZSBpcyBzcGVjaWZpZWQuCgpEYW5pZWwgRmFuZHJpY2ggKDIwIEphbiAyMDA5KQotIENhbGwgc2V0bG9jYWxlKCkgZm9yIGxpYnRlc3QgdGVzdHMgdG8gdGVzdCB0aGUgZWZmZWN0cyBvZiBsb2NhbGUtaW5kdWNlZAogIGxpYmMgY2hhbmdlcyBvbiBsaWJjdXJsLgoKLSBGaXhlZCBhIGNvdXBsZSBtb3JlIGxvY2FsZS1kZXBlbmRlbnQgdG91cHBlciBjb252ZXJzaW9ucywgbWFpbmx5IGZvcgogIGNsYXJpdHkuICBUaGlzIGRvZXMgZml4IG9uZSBwcm9ibGVtIHRoYXQgY2F1c2VzIDt0eXBlPWkgRlRQIFVSTHMKICB0byBmYWlsIGluIHRoZSBUdXJraXNoIGxvY2FsZSB3aGVuIENVUkxPUFRfUFJPWFlfVFJBTlNGRVJfTU9ERSBpcwogIHVzZWQgKHRlc3QgY2FzZSA1NjEpCgotIEFkZGVkIHRlc3RzIDU2MSBhbmQgMTA5MSB0aHJvdWdoIDEwOTQgdG8gdGVzdCB2YXJpb3VzIGNvbWJpbmF0aW9ucwogIG9mIDt0eXBlPSBhbmQgO21vZGU9IFVSTHMgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBmYWlsIGluIHRoZSBUdXJraXNoCiAgbG9jYWxlLgoKRGFuaWVsIFN0ZW5iZXJnICgyMCBKYW4gMjAwOSkKLSBMaXNhIFh1IHBvaW50ZWQgb3V0IHRoYXQgdGhlIHNzaC5vYmogZmlsZSB3YXMgbWlzc2luZyBmcm9tIHRoZQogIGxpYi9NYWtlZmlsZS52YzYgZmlsZSAoYW5kIHRodXMgZnJvbSB0aGUgdmM4IGFuZCB2Yzkgb25lcyB0b28pLgoKVmVyc2lvbiA3LjE5LjMgKDE5IEphbnVhcnkgMjAwOSkKCkRhbmllbCBTdGVuYmVyZyAoMTYgSmFuIDIwMDkpCi0gQW5kcmV3IGRlIGxvcyBSZXllcyBmaXhlZCBjdXJsYnVpbGQuaCBmb3IgImdlbmVyaWMiIGdjYyBidWlsZHMgb24gUFBDLCBib3RoCiAgMzIgYml0IGFuZCA2NCBiaXQuCgpEYW5pZWwgU3RlbmJlcmcgKDE1IEphbiAyMDA5KQotIFRpbSBBbnNlbGwgZml4ZWQgYSBjb21waWxlciB3YXJuaW5nIGluIGxpYi9jb29raWUuYwoKRGFuaWVsIFN0ZW5iZXJnICgxNCBKYW4gMjAwOSkKLSBHcmFudCBFcmlja3NvbiBmaXhlZCB0aW1lb3V0cyBmb3IgVEZUUCBzdWNoIHRoYXQgc3BlY2lmeWluZyBhCiAgY29ubmVjdC10aW1lb3V0LCBhIG1heC10aW1lIG9yIGJvdGggb3B0aW9ucyB3b3JrIGNvcnJlY3RseSBhbmQgYXMgZXhwZWN0ZWQKICBieSBwYXNzaW5nIHRoZSBjb3JyZWN0IGJvb2xlYW4gdmFsdWUgdG8gQ3VybF90aW1lbGVmdCB2aWEgdGhlCiAgJ2R1cmluZ2Nvbm5lY3QnIHBhcmFtZXRlci4KCiAgV2l0aCB0aGlzIHNtYWxsIGNoYW5nZSwgY3VybCBURlRQIG5vdyBiZWhhdmVzIGFzIGV4cGVjdGVkIChhbmQgbGlrZWx5IGFzCiAgb3JpZ2luYWxseS1kZXNpZ25lZCk6CgogIDEpIEZvciBub24tZXhpc3RlbnQgb3IgdW5yZWFjaGFibGUgZG90dGVkIElQIGFkZHJlc3NlczoKCiAgIGEpIFdpdGggbm8gb3B0aW9ucywgZm9sbG93cyB0aGUgZGVmYXVsdCBjdXJsIDMwMHMgdGltZW91dC4uLgogICBiKSBXaXRoIC0tY29ubmVjdC10aW1lb3V0IG9ubHksIGZvbGxvd3MgdGhhdCB2YWx1ZS4uLgogICBjKSBXaXRoIC0tbWF4LXRpbWUgb25seSwgZm9sbG93cyB0aGF0IHZhbHVlLi4uCiAgIGQpIFdpdGggYm90aCAtLWNvbm5lY3QtdGltZW91dCBhbmQgLS1tYXgtdGltZSwgZm9sbG93cyB0aGUgc21hbGxlciB2YWx1ZS4uLgoKICAgYW5kIHRpbWVzIG91dCB3aXRoIGEgImN1cmw6ICg3KSBDb3VsZG4ndCBjb25uZWN0IHRvIHNlcnZlciIgZXJyb3IuCgogIDIpIEZvciB0cmFuc2ZlcnMgdG8vZnJvbSBhIHZhbGlkIGhvc3Q6CgogICBhKSBXaXRoIG5vIG9wdGlvbnMsIGZvbGxvd3MgZGVmYXVsdCBjdXJsIDMwMHMgdGltZW91dCBmb3IgdGhlCiAgICAgIGZpcnN0IFhSUS9EQVRBL0FDSyB0cmFuc2FjdGlvbiBhbmQgdGhlIGRlZmF1bHQgVEZUUCAzNjAwcwogICAgICB0aW1lb3V0IGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSB0cmFuc2Zlci4uLgoKICAgYikgV2l0aCAtLWNvbm5lY3QtdGltZSBvbmx5LCBmb2xsb3dzIHRoYXQgdmFsdWUgZm9yIHRoZQogICAgICBmaXJzdCBYUlEvREFUQS9BQ0sgdHJhbnNhY3Rpb24gYW5kIHRoZSBkZWZhdWx0IFRGVFAgMzYwMHMKICAgICAgdGltZW91dCBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgdHJhbnNmZXIuLi4KCiAgIGMpIFdpdGggLS1tYXgtdGltZSBvbmx5LCBmb2xsb3dzIHRoYXQgdmFsdWUgZm9yIHRoZSBmaXJzdAogICAgICBYUlEvREFUQS9BQ0sgdHJhbnNhY3Rpb24gYW5kIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZQogICAgICB0cmFuc2Zlci4uLgoKICAgZCkgV2l0aCBib3RoIC0tY29ubmVjdC10aW1lb3V0IGFuZCAtLW1heC10aW1lLCBmb2xsb3dzIHRoZSBmb3JtZXIKICAgICAgZm9yIHRoZSBmaXJzdCBYUlEvREFUQS9BQ0sgdHJhbnNhY3Rpb24gYW5kIHRoZSBsYXR0ZXIgZm9yIHRoZQogICAgICByZW1haW5kZXIgb2YgdGhlIHRyYW5zZmVyLi4uCgogICBhbmQgdGltZXMgb3V0IHdpdGggYSAiY3VybDogKDI4KSBUaW1lb3V0IHdhcyByZWFjaGVkIiBlcnJvciBhcwogICBhcHByb3ByaWF0ZS4KCkRhbmllbCBTdGVuYmVyZyAoMTMgSmFuIDIwMDkpCi0gTWljaGFlbCBXYWxsbmVyIGZpeGVkIGEgTlVMTCBwb2ludGVyIGRlcmVmIHdoZW4gY2FsbGluZwogIGN1cmxfZWFzeV9zZXR1cChjdXJsLCBDVVJMT1BUX0NPT0tJRUxJU1QsICJTRVNTIikgb24gYSBDVVJMIGhhbmRsZSB3aXRoIG5vCiAgY29va2llcyBkYXRhLgoKLSBTdGVmYW4gVGVsZW1hbiBicm91Z2h0IGEgcGF0Y2ggdG8gZml4IHRoZSBkZWZhdWx0IGN1cmxidWlsZC5oIGZpbGUgZm9yIHRoZQogIFN1blBybyBjb21waWxlcnMuCgpEYW5pZWwgU3RlbmJlcmcgKDEyIEphbiAyMDA5KQotIEJhc2VkIG9uIGJ1ZyByZXBvcnQgIzI0OTg2NjUgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNDk4NjY1KQogIGJ5IERhbmllbCBCbGFjaywgSSd2ZSBub3cgYWRkZWQgbWFnaWMgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdGhhdCBtYWtlcyBpdAogIHVzZSBwa2ctY29uZmlnIHRvIGRldGVjdCBnbnV0bHMgZGV0YWlscyBhcyB3ZWxsIGlmIHRoZSBleGlzdGluZyBtZXRob2QKICAodXNpbmcgbGliZ251dGxzLWNvbmZpZykgZmFpbHMuIFdoaWxlIGRvaW5nIHRoaXMsIEkgY2xlYW5lZCB1cCBhbmQgdW5pZmllZAogIHRoZSBwa2ctY29uZmlnIHVzYWdlIHdoZW4gZGV0ZWN0aW5nIG9wZW5zc2wgYW5kIG5zcyBhcyB3ZWxsLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBKYW4gMjAwOSkKLSBLYXJsIE1vZXJkZXIgYnJvdWdodCB0aGUgcGF0Y2ggdGhhdCBjcmVhdGVzIHZjOSBNYWtlZmlsZXMsIGFuZCBJIG1hZGUKICAnbWFrZXRneicgbm93IHVzZSB0aGUgYWN0dWFsIG1ha2VmaWxlIHRhcmdldHMgdG8gZG8gdGhlIFZDOCBhbmQgVkM5CiAgbWFrZWZpbGVzLgoKRGFuaWVsIFN0ZW5iZXJnICgxMCBKYW4gMjAwOSkKLSBFbWlsIFJvbWFudXMgZml4ZWQ6CgogIFdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSBvdmVyIEhUVFAgYW5kIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIExvY2F0aW9uCiAgaGVhZGVyLCB0aGUgcnVubmluZyBlYXN5IGhhbmRsZSB3aWxsIGdldCBzdHVjayBpbiB0aGUgQ1VSTE1fU1RBVEVfUEVSRk9STQogIHN0YXRlLCBsZWF2aW5nIHRoZSBleHRlcm5hbCBldmVudCBsb29wIHN0dWNrIHdhaXRpbmcgZm9yIGRhdGEgZnJvbSB0aGUKICBpbmdvaW5nIHNvY2tldCAod2hlbiB1c2luZyB0aGUgY3VybF9tdWx0aV9zb2NrZXRfYWN0aW9uIHN0dWZmKS4gV2hpbGUgdGhpcwogIGJ1ZyB3YXMgcHJldHR5IGhhcmQgdG8gZmluZCwgaXQgc2VlbXMgdG8gcmVxdWlyZSBvbmx5IGEgb25lLWxpbmUgZml4LiBUaGUKICBicmVhayBzdGF0ZW1lbnQgb24gbGluZSAxMzc0IGluIG11bHRpLmMgY2F1c2VkIHRoZSBmdW5jdGlvbiB0byBza2lwIHRoZSBjYWxsCiAgdG8gbXVsdGlzdGF0ZSgpLgoKICBIb3cgdG8gcmVwcm9kdWNlIHRoaXMgYnVnPyBXZWxsLCB0aGF0J3MgYW5vdGhlciBxdWVzdGlvbi4gIGV2aGlwZXJmaWZvLmMgaW4KICB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5IGNob2tlcyBvbiB0aGlzIGJ1ZyBvbmx5IF9zb21ldGltZXNfLCBwcm9iYWJseQogIGRlcGVuZGluZyBvbiBob3cgZmFzdCB0aGUgVVJMcyBhcmUgYWRkZWQuIE9uZSB3YXkgb2YgdGVzdGluZyB0aGUgYnVnIG91dCBpcwogIHdyaXRpbmcgdG8gaGlwZXIuZmlmbyBmcm9tIG1vcmUgdGhhbiBvbmUgc291cmNlIGF0IHRoZSBzYW1lIHRpbWUuCgpEYW5pZWwgRmFuZHJpY2ggKDcgSmFuIDIwMDkpCi0gVW5pZmllZCBtdWNoIG9mIHRoZSBTZXNzaW9uSGFuZGxlIGluaXRpYWxpemF0aW9uIGRvbmUgaW4gQ3VybF9vcGVuKCkgYW5kCiAgY3VybF9lYXN5X3Jlc2V0KCkgYnkgY3JlYXRpbmcgQ3VybF9pbml0X3VzZXJkZWZpbmVkKCkuIFRoaXMgaGFkIHRoZSBzaWRlCiAgZWZmZWN0IG9mIGZpeGluZyBjdXJsX2Vhc3lfcmVzZXQoKSBzbyBpdCBub3cgYWxzbyByZXNldHMKICBDVVJMT1BUX0ZUUF9GSUxFTUVUSE9EIGFuZCBDVVJMT1BUX1NTTF9TRVNTSU9OSURfQ0FDSEUKCkRhbmllbCBTdGVuYmVyZyAoNyBKYW4gMjAwOSkKLSBSb2IgQ3JpdHRlbmRlbiBkaWQgb25jZSBhZ2FpbiBwcm92aWRlIGFuIE5TUyB1cGRhdGU6CgogIEkgaGF2ZSB0byBqdW1wIHRocm91Z2ggYSBmZXcgaG9vcHMgbm93IHdpdGggdGhlIE5TUyBsaWJyYXJ5IGluaXRpYWxpemF0aW9uCiAgc2luY2UgYW5vdGhlciBwYXJ0IG9mIGFuIGFwcGxpY2F0aW9uIG1heSBoYXZlIGFscmVhZHkgaW5pdGlhbGl6ZWQgTlNTIGJ5IHRoZQogIHRpbWUgQ3VybCBnZXRzIGludm9rZWQuIFRoaXMgcGF0Y2ggaXMgbW9yZSBjYXJlZnVsIHRvIG9ubHkgc2h1dGRvd24gdGhlIE5TUwogIGxpYnJhcnkgaWYgQ3VybCBkaWQgdGhlIGluaXRpYWxpemF0aW9uLgoKICBJdCBhbHNvIGFkZHMgaW4gYSBiaXQgb2YgY29kZSB0byBzZXQgdGhlIGRlZmF1bHQgY2lwaGVycyBpZiB0aGUgYXBwIHRoYXQKICBjYWxsIE5TU19Jbml0KiBkaWQgbm90IGNhbGwgTlNTX1NldERvbWVzdGljUG9saWN5KCkgb3Igc2V0IHNwZWNpZmljCiAgY2lwaGVycy4gT25lIG1pZ2h0IGFyZ3VlIHRoYXQgdGhpcyBsZXRzIG90aGVyIGFwcGxpY2F0aW9uIGRldmVsb3BlcnMgZ2V0CiAgbGF6eSBhbmQvb3IgdGhleSBhcmVuJ3QgdXNpbmcgdGhlIE5TUyBBUEkgY29ycmVjdGx5LCBhbmQgeW91J2QgYmUgcmlnaHQuCiAgQnV0IHN0aWxsLCB0aGlzIHdpbGwgYXZvaWQgdGVycmlibHkgZGlmZmljdWx0LXRvLXRyYWNlIGNyYXNoZXMgYW5kIGlzCiAgZ2VuZXJhbGx5IGhlbHBmdWwuCgpEYW5pZWwgU3RlbmJlcmcgKDEgSmFuIDIwMDkpCi0gJ3JlY29uZicgaXMgcmVtb3ZlZCBzaW5jZSB3ZSByYXRoZXIgaGF2ZSB1c2VycyB1c2UgJ2J1aWxkY29uZicKCkRhbmllbCBTdGVuYmVyZyAoMzEgRGVjIDIwMDgpCi0gQmFzIE1ldmlzc2VuIHJlcG9ydGVkIGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNDc5MDMwIHBvaW50aW5nCiAgb3V0IHRoYXQgJ3JlY29uZicgZGlkbid0IHByb3Blcmx5IHBvaW50IG91dCB0aGUgbTQgc3ViZGlyZWN0b3J5IHdoZW4gcnVubmluZwogIGFjbG9jYWwuCgpEYW5pZWwgU3RlbmJlcmcgKDI5IERlYyAyMDA4KQogLSBQaGlsIExpc2llY2tpIGZpbGVkIGJ1ZyByZXBvcnQgIzI0MTMwNjcKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI0MTMwNjcpIHRoYXQgaWRlbnRpZmllZCBhIHByb2JsZW0gdGhhdAogIHdvdWxkIGNhdXNlIGxpYmN1cmwgdG8gbWFyayBhIEROUyBjYWNoZSBlbnRyeSAiaW4gdXNlIiBldGVybmFsbHkgaWYgdGhlCiAgc3Vic2VxdWVuY2UgVENQIGNvbm5lY3QgZmFpbGVkLiBJdCB3b3VsZCB0aHVzIG5ldmVyIGdldCBwcnVuZWQgYW5kIHJlZnJlc2hlZAogIGFzIGl0IHNob3VsZCd2ZSBiZWVuLgoKICBQaGlsIHByb3ZpZGVkIGhpcyBvd24gcGF0Y2ggdG8gdGhpcyBwcm9ibGVtIHRoYXQgd2hpbGUgaXQgc2VlbWVkIHRvIHdvcmsKICB3YXNuJ3QgY29tcGxldGUgYW5kIHRodXMgSSB3cm90ZSBteSBvd24gZml4IHRvIHRoZSBwcm9ibGVtLgoKRGFuaWVsIFN0ZW5iZXJnICgyOCBEZWMgMjAwOCkKLSBQZXRlciBLb3JzZ2FhcmQgZml4ZWQgYnVpbGRpbmcgbGliY3VybCB3aXRoICJjb25maWd1cmUgLS13aXRoLXNzbAogIC0tZGlzYWJsZS12ZXJib3NlIi4KCi0gQW50aG9ueSBCcnlhbiBmaXhlZCBtb3JlIGxhbmd1YWdlIGFuZCBzcGVsbGluZyBmbGF3cyBpbiBtYW4gcGFnZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDIyIERlYyAyMDA4KQotIEdpdmVuIGEgcmVjZW50IGVub3VnaCBsaWJzc2gyLCBsaWJjdXJsIGNhbiBub3cgc2Vlay9yZXN1bWUgd2l0aCBTRlRQIGV2ZW4KICBvbiBmaWxlIGluZGV4ZXMgYmV5b25kIDIgb3IgNEdCLgoKLSBBbnRob255IEJyeWFuIHByb3ZpZGVkIGEgc2V0IG9mIHBhdGNoZXMgdGhhdCBjbGVhbmVkIHVwIG1hbnVhbCBsYW5ndWFnZSwKICBjb3JyZWN0ZWQgc3BlbGxpbmdzIGFuZCBtb3JlLgoKRGFuaWVsIFN0ZW5iZXJnICgyMCBEZWMgMjAwOCkKLSBJZ29yIE5vdm9zZWx0c2V2IGZpeGVkIGEgYmFkIHNpdHVhdGlvbiBmb3IgdGhlIG11bHRpX3NvY2tldCgpIEFQSSB3aGVuIGRvaW5nCiAgcGlwZWxpbmluZywgYXMgbGliY3VybCBjb3VsZCB0aGVuIGVhc2lseSBnZXQgY29uZnVzZWQgYW5kIEEpIHdvcmsgb24gdGhlCiAgaGFuZGxlIHRoYXQgd2FzIG5vdCAiZmlyc3QgaW4gcXVldWUiIG9uIGEgcGlwZWxpbmUsIG9yIGV2ZW4gQikgdGVsbCB0aGUgYXBwCiAgdG8gUkVNT1ZFIGEgc29ja2V0IHdoaWxlIGl0IHdhcyBpbiB1c2UgYnkgYSBzZWNvbmQgaGFuZGxlIGluIGEgcGlwZWxpbmUuIEJvdGgKICBlcnJvcnMgY2F1c2VkIGhhbmdpbmcgb3Igc3RhbGxpbmcgYXBwbGljYXRpb25zLgoKRGFuaWVsIFN0ZW5iZXJnICgxOSBEZWMgMjAwOCkKLSBjdXJsX211bHRpX3RpbWVvdXQoKSBjb3VsZCByZXR1cm4gYSB0aW1lb3V0IHZhbHVlIG9mIDAgZXZlbiB0aG91Z2ggbm90aGluZwogIHdhcyBhY3R1YWxseSByZWFkeSB0byBnZXQgZG9uZSwgYXMgdGhlIGludGVybmFsIHRpbWUgcmVzb2x1dGlvbiBpcyBoaWdoZXIKICB0aGFuIHRoZSByZXR1cm5lZCBtaWxsaXNlY29uZCB0aW1lci4gVGhlcmVmb3JlIGl0IGNvdWxkIGNhdXNlIGFwcGxpY2F0aW9ucwogIHJ1bm5pbmcgb24gZmFzdCBwcm9jZXNzb3JzIHRvIGRvIHNob3J0IGJ1cnN0cyBvZiBidXN5LWxvb3BzLgogIGN1cmxfbXVsdGlfdGltZW91dCgpIHdpbGwgbm93IG9ubHkgcmV0dXJuIDAgaWYgdGhlIHRpbWVvdXQgaXMgYWN0dWFsbHkKICBhbHJlYXkgdHJpZ2dlcmVkLgoKLSBVc2luZyB0aGUgbGlic3NoMiAwLjE5IGZ1bmN0aW9uIGxpYnNzaDJfc2Vzc2lvbl9ibG9ja19kaXJlY3Rpb25zKCksIGxpYmN1cmwKICBub3cgaGFzIGFuIGltcHJvdmVkIGFiaWxpdHkgdG8gZG8gcmlnaHQgd2hlbiB0aGUgbXVsdGkgaW50ZXJmYWNlIChib3RoCiAgInJlZ3VsYXIiIGFuZCBtdWx0aV9zb2NrZXQpIGlzIHVzZWQgZm9yIFNDUCBhbmQgU0ZUUCB0cmFuc2ZlcnMuIFRoaXMgc2hvdWxkCiAgcmVzdWx0IGluIChtdWNoKSBsZXNzIGJ1c3ktbG9vcCBzaXR1YXRpb25zIGFuZCB0aHVzIGxlc3MgQ1BVIHVzYWdlIHdpdGggbm8KICBzcGVlZCBsb3NzLgoKRGFuaWVsIFN0ZW5iZXJnICgxNyBEZWMgMjAwOCkKLSBTQ1AgYW5kIFNGVFAgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIGhhZCB0aGUgc2FtZSBmbGF3OiB0aGUgJ0RPTkUnCiAgb3BlcmF0aW9uIGRpZG4ndCBjb21wbGV0ZSBwcm9wZXJseSBpZiB0aGUgRUFHQUlOIGVxdWl2YWxlbnQgd2FzIHJldHVybmVkIGJ1dAogIGxpYmN1cmwgd291bGQgc2ltcGx5IGNvbnRpbnVlIHdpdGggYSBoYWxmLWNvbXBsZXRlZCBjbG9zZSBvcGVyYXRpb24KICBwZXJmb3JtZWQuIFRoaXMgcnVpbmVkIHBlcnNpc3RlbnQgY29ubmVjdGlvbiByZS11c2UgYW5kIGNhdXNlIHNvbWUKICBTU0gtcHJvdG9jb2wgZXJyb3JzIGluIGdlbmVyYWwuIFRoZSBjb3JyZWN0aW9uIGlzIHVuZm9ydHVuYXRlbHkgYWRkaW5nIGEKICBibG9ja2luZyBmdW5jdGlvbiAtIGRvaW5nIGl0IGVudGlyZWx5IG5vbi1ibG9ja2luZyBzaG91bGQgYmUgY29uc2lkZXJlZCBmb3IKICBhIGJldHRlciBmaXguCgpHaXNsZSBWYW5lbSAoMTYgRGVjIDIwMDgpCi0gQWRkZWQgdGhlIHBvc3NpYmlsaXR5IHRvIHVzZSB0aGUgV2F0dC0zMiB0Y3AvaXAgc3RhY2sgdW5kZXIgV2luZG93cy4KICBUaGUgY2hhbmdlIHNpbXBseSBpbnZvbHZlZCBhZGRpbmcgYSBVU0VfV0FUVDMyIHNlY3Rpb24gaW4gdGhlCiAgY29uZmlnLXdpbjMyLmggZmlsZXMgKHVuZGVyIC4vbGliIGFuZCAuL3NyYykuIFRoaXMgc2VjdGlvbiBkaXNhYmxlcwogIHRoZSB1c2Ugb2YgYW55IFdpbnNvY2sgaGVhZGVycy4KCkRhbmllbCBTdGVuYmVyZyAoMTYgRGVjIDIwMDgpCi0gbGlic3NoMl9zZnRwX2xhc3RfZXJyb3IoKSB3YXMgd3JvbmdseSB1c2VkIGF0IHNvbWUgcGxhY2VzIGluIGxpYmN1cmwgd2hpY2gKICBtYWRlIGxpYmN1cmwgc29tZXRpbWVzIG5vdCBwcm9wZXJseSBhYm9ydCBwcm9ibGVtYXRpYyBTRlRQIHRyYW5zZmVycy4KCkRhbmllbCBTdGVuYmVyZyAoMTIgRGVjIDIwMDgpCi0gTW9yZSB3b3JrIHdpdGggSWdvciBOb3Zvc2VsdHNldiB0byBmaXJzdCBmaXggdGhlIHJlbWFpbmluZyBzdHVmZiBmb3IKICByZW1vdmluZyBlYXN5IGhhbmRsZXMgZnJvbSBtdWx0aSBoYW5kbGVzIHdoZW4gdGhlIGVhc3kgaGFuZGxlIGlzL3dhcyB3aXRoaW4KICBhIEhUVFAgcGlwZWxpbmUuIEhpcyBidWcgcmVwb3J0ICMyMzUxNjUzCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMzUxNjUzKSB3YXMgYWxzbyByZWxhdGVkIGFuZCB3YXMKICBldmVudHVhbGx5IGZpeGVkIGJ5IGEgcGF0Y2ggYnkgSWdvciBoaW1zZWxmLgoKWWFuZyBUc2UgKDEyIERlYyAyMDA4KQotIFBhdHJpY2sgTW9ubmVyYXQgZml4ZWQgYSBidWlsZCByZWdyZXNzaW9uLCBpbnRyb2R1Y2VkIGluIDcuMTkuMiwgYWZmZWN0aW5nCiAgT1MvNDAwIGNvbXBpbGF0aW9ucyB3aXRoIElQdjYgZW5hYmxlZC4KCkRhbmllbCBTdGVuYmVyZyAoMTIgRGVjIDIwMDgpCi0gTWFyayBLYXJwZWxlcyBmaWxlZCBidWcgcmVwb3J0ICMyNDE2MTgyIHRpdGxlZCAiY3Jhc2ggaW4gQ29ubmVjdGlvbkV4aXN0cwogIHdoZW4gdXNpbmcgZHVwaGFuZGxlK2N1cmxfbXV0bGkiCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNDE2MTgyKSB3aGljaCBzaG93ZWQgdGhhdAogIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSB3cm9uZ2x5IGFsc28gY29waWVkIHRoZSBwb2ludGVyIHRvIHRoZSBjb25uZWN0aW9uCiAgY2FjaGUsIHdoaWNoIHdhcyBwbGFpbiB3cm9uZyBhbmQgY2F1c2VkIGEgc2VnZmF1bHQgaWYgdGhlIGhhbmRsZSB3b3VsZCBiZQogIHVzZWQgaW4gYSBkaWZmZXJlbnQgbXVsdGkgaGFuZGxlIHRoYW4gdGhlIGhhbmRsZSBpdCB3YXMgZHVwbGljYXRlZCBmcm9tLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBEZWMgMjAwOCkKLSBLZXNoYXYgS3JpdHkgZm91bmQgb3V0IHRoYXQgbGliY3VybCBmYWlsZWQgdG8gZGVhbCB3aXRoIGRvdHRlZCBJUHY2CiAgYWRkcmVzc2VzIGlmIHRoZXkgd2VyZSB2ZXJ5IGxvbmcgKD4zOSBsZXR0ZXJzKSBkdWUgdG8gYSB0b28gc3RyaWN0IGFkZHJlc3MKICB2YWxpZGl0eSBwYXJzZXIuIEl0IG5vdyBhY2NlcHRzIGFkZHJlc3NlcyB1cCB0byA0NSBieXRlcyBsb25nLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBEZWMgMjAwOCkKLSBJbnRlcm5ldCBFeHBsb3JlciBoYWQgYSBicm9rZW4gSFRUUCBkaWdlc3QgYXV0aGVudGljYXRpb24gYmVmb3JlIHY3IGFuZAogIHRoZXJlIGFyZSBzZXJ2ZXJzICJvdXQgdGhlcmUiIHRoYXQgcmVsaWVzIG9uIHRoZSBjbGllbnQgZG9pbmcgdGhpcyBicm9rZW4KICBEaWdlc3QgYXV0aGVudGljYXRpb24uIEFwYWNoZSBldmVuIGNvbWVzIHdpdGggYW4gb3B0aW9uIHRvIHdvcmsgd2l0aCBzdWNoCiAgYnJva2VuIGNsaWVudHMuCgogIFRoZSBkaWZmZXJlbmNlIGlzIG9ubHkgZm9yIFVSTHMgdGhhdCBjb250YWluIGEgcXVlcnktcGFydCAoYSAnPyctbGV0dGVyIGFuZAogIHRleHQgdG8gdGhlIHJpZ2h0IG9mIGl0KS4KCiAgbGliY3VybCBub3cgc3VwcG9ydHMgdGhpcyBxdWlyaywgYW5kIHlvdSBlbmFibGUgaXQgYnkgc2V0dGluZyB0aGUKICBDVVJMQVVUSF9ESUdFU1RfSUUgYml0IGluIHRoZSBiaXRtYXNrIHlvdSBwYXNzIHRvIHRoZSBDVVJMT1BUX0hUVFBBVVRIIG9yCiAgQ1VSTE9QVF9QUk9YWUFVVEggb3B0aW9ucy4gVGhleSBhcmUgdGh1cyBpbmRpdmlkdWFsbHkgY29udHJvbGxlZCB0byBzZXJ2ZXIKICBhbmQgcHJveHkuCgogIChub3RlIHRoYXQgdGhlcmUncyBubyB3YXkgdG8gYWN0aXZhdGUgdGhpcyB3aXRoIHRoZSBjdXJsIHRvb2wgeWV0KQoKRGFuaWVsIEZhbmRyaWNoICg5IERlYyAyMDA4KQotIEFkZGVkIHRlc3QgY2FzZXMgMTA4OSBhbmQgMTA5MCB0byB0ZXN0IC0td3JpdGUtb3V0IGFmdGVyIGEgcmVkaXJlY3QgdG8KICB0ZXN0IGEgcmVwb3J0IHRoYXQgdGhlIHNpemUgZGlkbid0IHdvcmssIGJ1dCB0aGVzZSB0ZXN0IGNhc2VzIHBhc3MuCgotIERvY3VtZW50ZWQgQ1VSTE9QVF9DT05ORUNUX09OTFkgYXMgYmVpbmcgdXNlZnVsIG9ubHkgb24gSFRUUCBVUkxzLgoKRGFuaWVsIFN0ZW5iZXJnICg5IERlYyAyMDA4KQotIEtlbiBIaXJzY2ggc2ltcGxpZmllZCBob3cgbGliY3VybCBkb2VzIEZUUFM6IG5vdyBpdCBkb2Vzbid0IGFzc3VtZSBhbnkKICBwYXJ0aWN1bGFyIHN0YXRlIGZvciB0aGUgY29udHJvbCBjb25uZWN0aW9uIGxpa2UgaXQgZGlkIGJlZm9yZSBmb3IgaW1wbGljaXQKICBGVFBTIChsaWJjdXJsIGFzc3VtZWQgc3VjaCBjb250cm9sIGNvbm5lY3Rpb25zIHRvIGJlIGVuY3J5cHRlZCB3aGlsZSBzb21lCiAgRlRQUyBzZXJ2ZXJzIHN1Y2ggYXMgRmlsZVppbGxhIGFzc3VtZXMgc3VjaCBjb25uZWN0aW9ucyB0byBiZSBjbGVhcgogIG1vZGUpLiBVc2UgdGhlIENVUkxPUFRfVVNFX1NTTCBvcHRpb24gdG8gc2V0IHlvdXIgZGVzaXJlZCBsZXZlbC4KCkRhbmllbCBTdGVuYmVyZyAoOCBEZWMgMjAwOCkKLSBGcmVkIE1hY2hhZG8gcG9zdGVkIGFib3V0IGEgd2VpcmQgRlRQIHByb2JsZW0gb24gdGhlIGN1cmwtdXNlcnMgbGlzdCBhbmQgd2hlbgogIHJlc2VhcmNoaW5nIGl0LCBpdCB0dXJuZWQgb3V0IGhlIGdvdCBhIDU1MCByZXNwb25zZSBiYWNrIGZyb20gYSBTSVpFIGNvbW1hbmQKICBhbmQgdGhlbiBJIGZlbGwgb3ZlciB0aGUgdGV4dCBpbiBSRkMzNjU5IHRoYXQgc2F5czoKCiAgIFRoZSBwcmVzZW5jZSBvZiB0aGUgNTUwIGVycm9yIHJlc3BvbnNlIHRvIGEgU0laRSBjb21tYW5kIE1VU1QgTk9UIGJlIHRha2VuCiAgIGJ5IHRoZSBjbGllbnQgYXMgYW4gaW5kaWNhdGlvbiB0aGF0IHRoZSBmaWxlIGNhbm5vdCBiZSB0cmFuc2ZlcnJlZCBpbiB0aGUKICAgY3VycmVudCBNT0RFIGFuZCBUWVBFLgoKICBJbiBvdGhlciB3b3JkczogdGhlIGNoYW5nZSBJIGRpZCBvbiBTZXB0ZW1iZXIgMzB0aCAyMDA4IGFuZCB0aGF0IGhhcyBiZWVuCiAgaW5jbHVkZWQgaW4gdGhlIGxhc3QgdHdvIHJlbGVhc2VzIHdlcmUgYSByZWdyZXNzaW9uIGFuZCBhIGJhZCBpZGVhLiBXZSBNVVNUCiAgTk9UIHRha2UgYSA1NTAgcmVzcG9uc2UgZnJvbSBTSVpFIGFzIGEgaGludCB0aGF0IHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QuCgotIENocmlzdGlhbiBLcmF1c2UgZmlsZWQgYnVnICMyMjIxMjM3CiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMjIxMjM3KSB0aGF0IGlkZW50aWZpZWQgYW4gaW5maW5pdGUKICBsb29wIGR1cmluZyBHU1MgYXV0aGVudGljYXRpb24gZ2l2ZW4gc29tZSBzcGVjaWZpYyBjb25kaXRpb25zLiBXaXRoIGhpcwogIHBhdGllbmNlIGFuZCBncmVhdCBmZWVkYmFjayBJIG1hbmFnZWQgdG8gbmFycm93IGRvd24gdGhlIHByb2JsZW0gYW5kCiAgZXZlbnR1YWxseSBmaXggaXQgYWx0aG91Z2ggSSBjYW4ndCB0ZXN0IGFueSBvZiB0aGlzIG15c2VsZiEKCkRhbmllbCBGYW5kcmljaCAoMyBEZWMgMjAwOCkKLSBGaXhlZCB0aGUgZ2V0aWZhZGRycyB2ZXJzaW9uIG9mIEN1cmxfaWYyaXAgdG8gd29yayBvbiBzeXN0ZW1zIHdpdGhvdXQgSVB2NgogIHN1cHBvcnQgKGUuZy4gTWluaXgpCgpEYW5pZWwgU3RlbmJlcmcgKDMgRGVjIDIwMDgpCi0gSWdvciBOb3Zvc2VsdHNldiBmaWxlZCBidWcgIzIzNTE2NDUKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIzNTE2NDUpIHRoYXQgaWRlbnRpZmllZCBhIHByb2JsZW0gd2l0aAogIHRoZSBtdWx0aSBpbnRlcmZhY2UgdGhhdCBvY2N1cmVkIGlmIHlvdSByZW1vdmVkIGFuIGVhc3kgaGFuZGxlIHdoaWxlIGluCiAgcHJvZ3Jlc3MgYW5kIHRoZSBoYW5kbGUgd2FzIHVzZWQgaW4gYSBIVFRQIHBpcGVsaW5lLgoKLSBQYXdlbCBLaWVyc2tpIHBvaW50ZWQgb3V0IGEgbWlzdGFrZSBpbiB0aGUgY29va2llIGNvZGUgdGhhdCBjb3VsZCBsZWFkIHRvIGEKICBiYWQgZmNsb3NlKCkgYWZ0ZXIgYSBmYXRhbCBlcnJvciBoYWQgb2NjdXJlZC4KICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIzODIyMTkpCgpEYW5pZWwgRmFuZHJpY2ggKDI1IE5vdiAyMDA4KQotIElmIGEgSFRUUCByZXF1ZXN0IGlzIEJhc2ljIGFuZCBudW0gaXMgYWxyZWFkeSA+PTEwMDAsIHRoZSBIVFRQIHRlc3QKICBzZXJ2ZXIgYWRkcyAxIHRvIG51bSB0byBnZXQgdGhlIGRhdGEgc2VjdGlvbiB0byByZXR1cm4uIFRoaXMgYWxsb3dzCiAgdGVzdGluZyBhdXRoZW50aWNhdGlvbiBuZWdvdGlhdGlvbnMgdXNpbmcgdGhlIEJhc2ljIGF1dGhlbnRpY2F0aW9uCiAgbWV0aG9kLgoKLSBBZGRlZCB0ZXN0cyAxMDg3IGFuZCAxMDg4IHRvIHRlc3QgQmFzaWMgYXV0aGVudGljYXRpb24gb24gYSByZWRpcmVjdAogIHdpdGggYW5kIHdpdGhvdXQgLS1sb2NhdGlvbi10cnVzdGVkCgpEYW5pZWwgU3RlbmJlcmcgKDI0IE5vdiAyMDA4KQotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgVmxhZCBHcmFjaG92LCBsaWJjdXJsIG5vdyB1c2VzIGEgbmV3IGxpYnNzaDIgMC4xOQogIGZ1bmN0aW9uIHdoZW4gYnVpbHQgdG8gc3VwcG9ydCBTQ1AgYW5kIFNGVFAgdGhhdCBoZWxwcyB0aGUgbGlicmFyeSB0byBrbm93CiAgaW4gd2hpY2ggZGlyZWN0aW9uIGEgcGFydGljdWxhciBsaWJzc2gyIG9wZXJhdGlvbiB3b3VsZCByZXR1cm4gRUFHQUlOIHNvCiAgdGhhdCBsaWJjdXJsIGtub3dzIHdoYXQgc29ja2V0IGNvbmRpdGlvbnMgdG8gd2FpdCBmb3IgYmVmb3JlIHRyeWluZyB0aGUKICBmdW5jdGlvbiBjYWxsIGFnYWluLiBQcmV2aW91c2x5IChhbmQgc3RpbGwgd2hlbiB1c2luZyBsaWJzc2gyIDAuMTggb3IKICBlYXJsaWVyKSwgbGliY3VybCB3aWxsIGJ1c3ktbG9vcCBpbiB0aGlzIHNpdHVhdGlvbiB3aGVuIHRoZSBlYXN5IGludGVyZmFjZQogIGlzIHVzZWQhCgpEYW5pZWwgRmFuZHJpY2ggKDIwIE5vdiAyMDA4KQotIEF1dG9tYXRpY2FsbHkgZGV0ZWN0IE9wZW5CU0QncyBDQSBjZXJ0IGJ1bmRsZS4KCkRhbmllbCBTdGVuYmVyZyAoMTkgTm92IDIwMDgpCi0gSSByZW1vdmVkIHRoZSBkZWZhdWx0IHVzZSBvZiAiUHJhZ21hOiBuby1jYWNoZSIgZnJvbSBsaWJjdXJsIHdoZW4gYSBwcm94eSBpcwogIHVzZWQuIEl0IGhhcyBiZWVuIHVzZWQgc2luY2UgZm9yZXZlciBidXQgaXQgd2FzIG5ldmVyIGEgZ29vZCBpZGVhIHRvIHVzZQogIHVubGVzcyBleHBsaWNpdGx5IGFza2VkIGZvci4KCi0gSm9zZWYgV29sZidzIGV4dGVuc2lvbiB0aGF0IGFsbG93cyBhICRURVNURElSL2dkYmluaXQkdGVzdG51bSBmaWxlIHRoYXQgd2hlbgogIHlvdSB1c2UgcnVudGVzdHMucGwgLWcsIHdpbGwgYmUgc291cmNlZCBieSBnZGIgdG8gYWxsb3cgYWRkaXRpb25hbCBmYW5jeSBvcgogIHdoYXRldmVyIHlvdSBzZWUgZml0CgotIENocmlzdGlhbiBLcmF1c2UgcmVwb3J0ZWQgYW5kIGZpeGVkIGEgbWVtb3J5IGxlYWsgdGhhdCB3b3VsZCBvY2N1ciB3aXRoIEhUVFAKICBHU1Mva2VyYmVyb3MgYXV0aGVudGljYXRpb24gKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMjg0Mzg2KQoKLSBBbmRyZWFzIFd1cmYgYW5kIE1hcmt1cyBLb2V0dGVyIGhlbHBlZCBtZSBhbmFseXplIGEgcHJvYmxlbSB0aGF0IEFuZHJlYXMgZ290CiAgd2hlbiB1cGxvYWRpbmcgZmlsZXMgdG8gYSBzaW5nbGUgRlRQIHNlcnZlciB1c2luZyBtdWx0aXBsZSBlYXN5IGhhbmRsZQogIGhhbmRsZXMgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlLiBPY2Nhc2lvbmFsbHkgYSBoYW5kbGUgd291bGQgc3RhbGwgaW4KICBteXN0ZXJpb3VzIHdheXMuCgogIFRoZSBwcm9ibGVtIHR1cm5lZCBvdXQgdG8gYmUgYSBzaWRlLWVmZmVjdCBvZiB0aGUgQ29ubmVjdGlvbkV4aXN0cygpCiAgZnVuY3Rpb24ncyBlYWdlcm5lc3MgdG8gcmUtdXNlIGEgaGFuZGxlIGZvciBIVFRQIHBpcGVsaW5pbmcgc28gaXQgd291bGQKICBzZWxlY3QgaXQgZXZlbiBpZiBhbHJlYWR5IGJlaW5nIGluIHVzZSwgZHVlIHRvIGFuIGluYWRlcXVhdGUgY2hlY2sgZm9yIGl0cwogIGNoYW5jZXMgb2YgYmVpbmcgdXNlZCBmb3IgcGlwZWxuaW5pbmcuCgpEYW5pZWwgRmFuZHJpY2ggKDE3IE5vdiAyMDA4KQotIEFkZGVkIG1vcmUgY29tcGlsZXIgd2FybmluZyBvcHRpb25zIGZvciBnY2MgNC4zCgpZYW5nIFRzZSAoMTcgTm92IDIwMDgpCi0gRml4IGEgcmVtYWluaW5nIHByb2JsZW0gaW4gdGhlIGluZXRfcHRvbigpIHJ1bnRpbWUgY29uZmlndXJlIGNoZWNrLiBBbmQKICBmaXggaW50ZXJuYWwgQ3VybF9pbmV0X3B0b24oKSBmYWlsdXJlcyB0byByZWplY3QgY2VydGFpbiBtYWxmb3JtZWQgbGl0ZXJhbHMuCgotIE1ha2UgY29uZmlndXJlIHNjcmlwdCBjaGVjayBpZiBpb2N0bCB3aXRoIHRoZSBTSU9DR0lGQUREUiBjb21tYW5kIGNhbiBiZQogIHVzZWQsIGFuZCBkZWZpbmUgSEFWRV9JT0NUTF9TSU9DR0lGQUREUiBpZiBhcHByb3ByaWF0ZS4KCkRhbmllbCBTdGVuYmVyZyAoMTYgTm92IDIwMDgpCi0gQ2hyaXN0aWFuIEtyYXVzZSBmaXhlZCBhIGJ1aWxkIGZhaWx1cmUgd2hlbiBidWlsZGluZyB3aXRoIGdzcyBzdXBwb3J0CiAgZW5hYmxlZCBhbmQgRlRQIGRpc2FibGVkLgoKLSBBZGRlZCBjaGVjayBmb3IgTlVMTCByZXR1cm5zIGZyb20gc3RyZHVwKCkgaW4gc3JjL21haW4uYyBhbmQgbGliL2Zvcm1kYXRhLmMKICAtIHJlcG9ydGVkIGJ5IEppbSBNZXllcmluZyBhbHNvIHByZXZlbnQgYnVmZmVyIG92ZXJmbG93IG9uIE1TRE9TIHdoZW4geW91IGRvCiAgZm9yIGV4YW1wbGUgLU8gb24gYSB1cmwgd2l0aCBhIGZpbGUgbmFtZSBwYXJ0IGxvbmdlciB0aGFuIFBBVEhfTUFYIGxldHRlcnMKCi0gbGliL25zcy5jIGZpeGVzIGJhc2VkIG9uIHRoZSByZXBvcnQgYnkgSmltIE1leWVyaW5nOiBJIHdlbnQgb3ZlciBhbmQgYWRkZWQKICBjaGVja3MgZm9yIHJldHVybiBjb2RlcyBmb3IgYWxsIGNhbGxzIHRvIG1hbGxvYyBhbmQgc3RyZHVwIHRoYXQgd2VyZQogIG1pc3NpbmcuIEkgYWxzbyBjaGFuZ2VkIGEgZmV3IG1hbGxvYygxMykgdG8gdXNlIGFycmF5cyBvbiB0aGUgc3RhY2sgYW5kIGEKICBmZXcgbWFsbG9jKFBBVEhfTUFYKSB0byBpbnN0ZWFkIHVzZSBhcHJpbnRmKCkgdG8gbG93ZXIgbWVtb3J5IHVzZS4KCi0gSSBmaXhlZCBhIG1lbW9yeSBsZWFrIGluIEN1cmxfbnNzX2Nvbm5lY3QoKSB3aGVuIENVUkxPUFRfSVNTVUVSQ0VSVCBpcwogIGluIHVzZS4KCkRhbmllbCBGYW5kcmljaCAoMTQgTm92IDIwMDgpCi0gQWRkZWQgLnhtbCBhcyBvbmUgb2YgdGhlIGZldyBjb21tb24gZmlsZSBleHRlbnNpb25zIGtub3duIGJ5IHRoZSBtdWx0aXBhcnQKICBmb3JtIGdlbmVyYXRvci4KCi0gQWRkZWQgc29tZSAjaWZkZWZzIGFyb3VuZCBoZWFkZXIgZmlsZXMgYW5kIGNoYW5nZSB0aGUgRUFHQUlOIHRlc3QgdG8KICBmaXggY29tcGlsYXRpb24gb24gQ2VsbCAocmVwb3J0ZWQgYnkgSmVmZiBDdXJsZXkpLgoKWWFuZyBUc2UgKDE0IE5vdiAyMDA4KQotIEZpeGVkIHNldmVyYWwgY29uZmlndXJlIHNjcmlwdCBpc3N1ZXMgYWZmZWN0aW5nIGNoZWNrcyBmb3IgaW5ldF9udG9hX3IoKSwKICBpbmV0X250b3AoKSwgaW5ldF9wdG9uKCksIGdldGlmYWRkcnMoKSwgZmNudGwoKSBhbmQgZ2V0YWRkcmluZm8oKS4KCllhbmcgVHNlICgxMyBOb3YgMjAwOCkKLSBSZWZhY3RvcmVkIGNvbmZpZ3VyZSBzY3JpcHQgZGV0ZWN0aW9uIG9mIGZ1bmN0aW9ucyB1c2VkIHRvIHNldCBzb2NrZXRzIGludG8KICBub24tYmxvY2tpbmcgbW9kZSwgYW5kIGRlY291cGxlIGZ1bmN0aW9uIGRldGVjdGlvbiBmcm9tIGZ1bmN0aW9uIGNhcGFiaWxpdHkuCgpWZXJzaW9uIDcuMTkuMiAoMTMgTm92ZW1iZXIgMjAwOCkKCk1pY2hhbCBNYXJlayAoMTMgTm92IDIwMDgpCi0gRml4ZWQgYSBwb3RlbnRpYWwgZGF0YSBsb3NzIGluIEN1cmxfY2xpZW50X3dyaXRlKCkgd2hlbiB0aGUgdHJhbnNmZXIgaXMKICBwYXVzZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDExIE5vdiAyMDA4KQotIFJhaW5lciBDYW5hdmFuIGZpbGVkIGJ1ZyAjMjI1NTYyNwogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjI1NTYyNykgd2hpY2ggcG9pbnRlZCBvdXQgdGhhdCBhCiAgcHJvZ3JhbSB1c2luZyBsaWJjdXJsJ3MgbXVsdGkgaW50ZXJmYWNlIHRvIGRvd25sb2FkIGEgSFRUUFMgcGFnZSB3aXRoIGEKICBsaWJjdXJsIGJ1aWx0IHBvd2VyZWQgYnkgT3BlblNTTCwgd291bGQgZWFzaWx5IGdldCBzaWxseSBhbmQgaW5zdGVhZCBoYW5kCiAgb3ZlciBTU0wgZGV0YWlscyBhcyBkYXRhIGluc3RlYWQgb2YgdGhlIGFjdHVhbCBIVFRQIGhlYWRlcnMgYW5kIGJvZHkuIFRoaXMKICBoYXBwZW5lZCBiZWNhdXNlIGxpYmN1cmwgd291bGQgY29uc2lkZXIgdGhlIGNvbm5lY3Rpb24gaGFuZHNoYWtlIGRvbmUgdG9vCiAgZWFybHkuIFRoaXMgcHJvYmxlbSB3YXMgaW50cm9kdWNlZCBhdCBTZXB0ZW1iZXIgMjJuZCAyMDA4IHdpdGggbXkgZml4IG9mIHRoZQogIGJ1ZyAjMjEwNzM3NwoKICBUaGUgY29ycmVjdCBmaXggaXMgbm93IGluc3RlYWQgZG9uZSB3aXRoaW4gdGhlIEdudVRMUy1oYW5kbGluZyBjb2RlLCBhcyBib3RoCiAgdGhlIE9wZW5TU0wgYW5kIHRoZSBOU1MgY29kZSBhbHJlYWR5IGRlYWwgd2l0aCB0aGlzIHNpdHVhdGlvbiBpbiBzaW1pbGFyCiAgZmFzaGlvbi4gSSBhZGRlZCB0ZXN0IGNhc2UgNTYwIGluIGFuIGF0dGVtcHQgdG8gdmVyaWZ5IHRoaXMgZml4LCBidXQKICB1bmZvcnR1bmF0ZWx5IGl0IGRpZG4ndCB0cmlnZ2VyIGl0IGV2ZW4gYmVmb3JlIHRoaXMgZml4IQoKWWFuZyBUc2UgKDExIE5vdiAyMDA4KQotIFJlbGF0ZWQgd2l0aCBidWcgIzIyMzA1MzUgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMjMwNTM1KQogIERhbmllbCBGYW5kcmljaCBub3RpY2VkIHRoYXQgY3VybF9hZGRyaW5mbyB3YXMgYWxzbyBtaXNzaW5nIGluIHRoZSBidWlsZAogIHByb2Nlc3Mgb2Ygb3RoZXIgZm91ciBub24tY29uZmlndXJlIHBsYXRmb3Jtcy4gQWRkZWQgbm93LgoKRGFuaWVsIEZhbmRyaWNoICg3IE5vdiAyMDA4KQotIFRoZSBnZXRpZmFkZHJzKCkgdmVyc2lvbiBvZiBDdXJsX2lmMmlwKCkgY3Jhc2hlZCB3aGVuIHVzZWQgb24gYSBMaW51eAogIHN5c3RlbSB3aXRoIGEgVEVRTCBsb2FkLWJhbGFuY2luZyBkZXZpY2UgY29uZmlndXJlZCwgd2hpY2ggZG9lc24ndAogIGhhdmUgYW4gYWRkcmVzcy4gIFRoYW5rcyB0byBBZGFtIFNhbXBzb24gZm9yIHNwb3R0aW5nIHRoaXMgKGJ1ZyAjMjIzNDkyMykuCgpZYW5nIFRzZSAoNiBOb3YgMjAwOCkKLSBNZXJnZWQgZXhpc3RpbmcgSVB2NCBhbmQgSVB2NiBDdXJsX2lwMmFkZHIgZnVuY3Rpb25zIGludG8gYSBzaW5nbGUgb25lCiAgd2hpY2ggbm93IGFsc28gdGFrZXMgYSBwcm90b2NvbCBhZGRyZXNzIGZhbWlseSBhcmd1bWVudC4KCi0gQnVnICMyMjMwNTM1IChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjIzMDUzNSkgcG9pbnRlZCBvdXQgYQogIHByb2JsZW0gd2l0aCBNU1ZDIDYgbWFrZWZpbGUgdGhhdCBjYXVzZWQgYSBidWlsZCBmYWlsdXJlLiBJdCB3YXMgbm90ZWQgdGhhdAogIHRoZSBjdXJsX2FkZHJpbmZvLm9iaiByZWZlcmVuY2Ugd2FzIG1pc3NpbmcuIEkgdG9vayB0aGUgb3Bwb3J0dW5pdHkgdG8gc29ydAogIHRoZSBsaXN0IGluIHdoaWNoIHRoaXMgd2FzIG1pc3NpbmcuIElzc3VlIHN1Ym1pdHRlZCBieSBKb2huIFdpbGtpbnNvbi4KClZlcnNpb24gNy4xOS4xICg1IE5vdmVtYmVyIDIwMDgpCgpEYW5pZWwgU3RlbmJlcmcgKDQgTm92IDIwMDgpCi0gQ1VSTElORk9fRklMRVRJTUUgbm93IHdvcmtzIGZvciBmaWxlOi8vIHRyYW5zZmVycyBhcyB3ZWxsCgpEYW5pZWwgU3RlbmJlcmcgKDMgTm92IDIwMDgpCi0gQnVnICMyMjE4NDgwIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjIxODQ4MCkgcG9pbnRlZCBvdXQgYQogIHByb2JsZW0gd2l0aCBteSBDVVJMSU5GT19QUklNQVJZX0lQIGZpeCBmcm9tIE9jdG9iZXIgN3RoIHRoYXQgY2F1c2VkIGEgTlVMTAogIHBvaW50ZXIgcmVhZC4gSSBhbHNvIHRvb2sgdGhlIG9wcG9ydHVuaXR5IHRvIGNsZWFuIHVwIHRoaXMgbG9naWMgKHN0b3Jpbmcgb2YKICB0aGUgY29ubmVjdGlvbidzIElQIGFkZHJlc3MpIHNvbWV3aGF0IGFzIHdlIGhhZCBpdCBzdG9yZWQgaW4gdHdvIGRpZmZlcmVudAogIHBsYWNlcyBhbmQgd2F5cyBwcmV2aW91c2x5IGFuZCB0aGV5IGFyZSBub3cgdW5pZmllZC4KCllhbmcgVHNlICgzIE5vdiAyMDA4KQotIEZpeCB1bmRlcnNpemVkIElQdjYgYWRkcmVzcyBpbnRlcm5hbCBidWZmZXIuIElQdjYgYWRkcmVzcyBzdHJpbmdzIGxvbmdlcgogIHRoYW4gMzUgY2hhcmFjdGVycyB3b3VsZCBiZSB0cnVuY2F0ZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDIgTm92IDIwMDgpCi0gRGFuaWVsIEpvaG5zb24gcmVwb3J0ZWQgYW5kIGZpeGVkOgoKICBXaGVuIGMtYXJlcyBpc24ndCBlbmFibGVkLCBsaWJjdXJsIGJ5IGRlZmF1bHQgY2FsbHMgZ2V0YWRkcmluZm8gd2l0aCBmYW1pbHkKICBzZXQgdG8gUEZfVU5TUEVDIHdoaWNoIGNhdXNlcyBnZXRhZGRyaW5mbyB0byByZXR1cm4gYWxsIGF2YWlsYWJsZSBhZGRyZXNzZXMsCiAgYm90aCBJUHY0IGFuZCBJUHY2LiBMaWJjdXJsIHRoZW4gdHJpZXMgZWFjaCBvbmUgdW50aWwgaXQgY2FuIGNvbm5lY3QuIElmIHRoZQogIG5ldCBjb25uZWN0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBJUHY2LCBsaWJjdXJsIGNhbiBzdGlsbCBmYWxsIGJhY2sgdG8gSVB2NC4KCiAgSG93ZXZlciwgc2luY2UgYy1hcmVzIGRvZXNuJ3Qgc3VwcG9ydCBQRl9VTlNQRUMsIHdoZW4gaXQncyB1c2VkIGl0IGRlZmF1bHRzCiAgdG8gdXNpbmcgZmFtaWx5PVBGX0lORVQ2IGFuZCB0aGVyZWZvcmUgb25seSByZXR1cm5zIElQdjYgYWRkcmVzc2VzIHdoZW4gQUFBQQogIHJlY29yZHMgYXJlIGF2YWlsYWJsZSwgZXZlbiBpZiBJUHY0IGFkZHJlc3NlcyBhcmUgYWxzbyBhdmFpbGFibGUuIFRoZSBlZmZlY3QKICBpcyB0aGF0IHNpbmNlIG15IElTUCBkb2Vzbid0IGRvIElQdjYsIGxpYmN1cmwgY2FuJ3QgY29ubmVjdCBhdCBhbGwgdG8gYSBzaXRlCiAgdGhhdCBoYXMgQUFBQSByZWNvcmRzLiBJdCB3aWxsIHdvcmsgaWYgSSBleHBsaWNpdGx5IHVzZSBDVVJMX0lQUkVTT0xWRV9WNCBvcgogIC0taXB2NCB3aXRoIHRoZSBjdXJsIHRvb2wuIEkgZGlzY292ZXJlZCB0aGlzIHdoZW4gY3VybCB3b3VsZCBmYWlsIHRvIGNvbm5lY3QKICB0byBzZWVtaW5nbHkgcmFuZG9tIHNpdGVzLiBJdCB0dXJucyBvdXQgdGhleSB3ZXJlbid0IHJhbmRvbSwgdGhleSB3ZXJlIHNpdGVzCiAgd2l0aCBBQUFBIHJlY29yZHMuCgogIFNvIG5vdyBsaWJjdXJsIGRlZmF1bHRzIHRvIFBGX0lORVQuLi4gdW50aWwgYy1hcmVzIGhhcyBiZWVuIHRvdWdodCB0byBvZmZlcgogIGJvdGguCgpZYW5nIFRzZSAoMzEgT2N0IDIwMDgpCi0gVGVzdHMgNTU4IGFuZCA1NTkgYXJlIHN0YWJpbGl6ZWQuIFRoZXNlIHR3byB0ZXN0cyB3ZXJlIGluaXRpYWxseSBpbnRyb2R1Y2VkCiAgdG8gYWlkIGluIHRoZSBsb2NhdGlvbiBvZiBhIHNlZy1mYXVsdCB3aGljaCB3YXMgb25seSB0cmlnZ2VyZWQgb24gbm9uLWRlYnVnCiAgYnVpbGRzIGRvbmUgd2l0aCB0aGUgaWNjIDkuMSBJbnRlbCBjb21waWxlci4gVGVzdCA1NTggZG9lcyBub3QgdHJpZ2dlciB0aGUKICBwcm9ibGVtLCBidXQgdGVzdCA1NTkgZG9lcyB0cmlnZ2VyIGl0LiBBcyBvZiB0b2RheSwgaXQgaXNuJ3QgeWV0IGFic29sdXRlbHkKICBjbGVhciBpZiBpdCBpcyBhIGNvbXBpbGVyIG9wdGltaXplciBpc3N1ZSBvciBhIG1lbW9yeSBjb3JydXB0aW9uIG9uZS4KCllhbmcgVHNlICgzMCBPY3QgMjAwOCkKLSBVc2Ugb3VyIEN1cmxfYWRkcmluZm8gc3RydWN0dXJlIGRlZmluaXRpb24gdG8gaGFuZGxlIGFkZHJlc3MgaW5mbyBkYXRhIGV2ZW4KICB3aGVuIGEgc3lzdGVtIGFkZHJpbmZvIHN0cnVjdCBpcyBhdmFpbGFibGUuIFByb3ZpZGUgYW5kIHVzZSBhIHdyYXBwZXIgYXJvdW5kCiAgc3lzdGVtcyBnZXRhZGRyaW5mbyBmdW5jdGlvbiwgQ3VybF9nZXRhZGRyaW5mb19leCB3aGljaCByZXR1cm5zIGEgcG9pbnRlciB0bwogIGEgbGlzdCBvZiBkeW5hbWljYWxseSBhbGxvY2F0ZWQgQ3VybF9hZGRyaW5mbyBzdHJ1Y3RzLgoKICBDb25maWd1cmUgd2lsbCBjaGVjayBmcmVlYWRkcmluZm8gYW5kIGdldGFkZHJpbmZvIGZ1bmN0aW9ucyBhbmQgZGVmaW5lCiAgcHJlcHJvY2Vzc29yIHN5bWJvbHMgSEFWRV9GUkVFQUREUklORk8gYW5kIEhBVkVfR0VUQUREUklORk8gd2hlbiBhcHByb3ByaWF0ZS4KCkRhbmllbCBGYW5kcmljaCAoMjkgT2N0IDIwMDgpCi0gRml4ZWQgYSBidWcgdGhhdCBjYXVzZWQgYSBmZXcgYnl0ZXMgb2YgZ2FyYmFnZSB0byBiZSBzZW50IGFmdGVyIGEKICBjdXJsX2Vhc3lfcGF1c2UoKSBkdXJpbmcgYSBjaHVua3kgdXBsb2FkLiBSZXBvcnRlZCBieSBTdGV2ZSBSb3Nrb3dza2kuCgpEYW5pZWwgRmFuZHJpY2ggKDI4IE9jdCAyMDA4KQotIENoYW5nZWQgdGhlICJyZXNvbHZlIiB0ZXN0IHByZWNoZWNrIHByb2dyYW0gdG8gdmVyaWZ5IHRoYXQgYW4gSVB2NiBzb2NrZXQKICBjYW4gYmUgY3JlYXRlZCBiZWZvcmUgcmVzb2x2aW5nIHRoZSBJUHY2IG5hbWUuICBJbiB0aGUgY29udGV4dCBvZiBydW5uaW5nCiAgYSB0ZXN0LCBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcnVuIGFuIElQdjYgdGVzdCB3aGVuIGEgaG9zdCBpcyByZXNvbHZhYmxlCiAgYnV0IElQdjYgaXNuJ3QgdXNhYmxlLiAgVGhpcyBzaG91bGQgZml4IGZhaWx1cmVzIG9mIHRlc3QgMTA4NSBvbiBob3N0cyB3aXRoCiAgbGlicmFyeSBhbmQgRE5TIHN1cHBvcnQgZm9yIElQdjYgYnV0IHdoZXJlIGFjdHVhbCB1c2Ugb2YgSVB2NiBoYXMgYmVlbgogIGFkbWluaXN0cmF0aXZlbHkgZGlzYWJsZWQuCgpEYW5pZWwgRmFuZHJpY2ggKDI0IE9jdCAyMDA4KQotIEFkZGVkIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciB6bGliIGFuZCBPcGVuU1NMIG9uIFN5bWJpYW4gT1MuCgpEYW5pZWwgRmFuZHJpY2ggKDIxIE9jdCAyMDA4KQotIEZpeGVkIHNvbWUgcHJvYmxlbXMgd2l0aCBTRlRQIHJhbmdlIHN1cHBvcnQgdG8gZml4IHRlc3QgY2FzZXMgNjM0IHRocm91Z2gKICA2MzcuCgpEYW5pZWwgRmFuZHJpY2ggKDE3IE9jdCAyMDA4KQotIEZpeGVkIGEgY29tcGlsZSBlcnJvciByZXBvcnRlZCBieSBBbGJlcnQgQ2hpbiBvbiBBSVggYW5kIElSSVggd2hlbiB1c2luZwogIEdUTFMuCgpEYW5pZWwgU3RlbmJlcmcgKDE2IE9jdCAyMDA4KQotIElnb3IgTm92b3NlbHRzZXYgYWRkZWQgQ1VSTE9QVF9QUk9YWVVTRVIgYW5kIENVUkxPUFRfUFJPWFlQQVNTV09SRCB0aGF0IHRoZW4KICBtYWtlIENVUkxPUFRfUFJPWFlVU0VSUFdEIHNvcnQgb2YgZGVwcmVjYXRlZC4gVGhlIHByaW1hcnkgbW90aXZlIGZvciBhZGRpbmcKICB0aGVzZSBuZXcgb3B0aW9ucyBpcyB0aGF0IHRoZXkgaGF2ZSBubyBwcm9ibGVtcyB3aXRoIHRoZSBjb2xvbiBzZXBhcmF0b3IKICB0aGF0IHRoZSBDVVJMT1BUX1BST1hZVVNFUlBXRCBvcHRpb24gZG9lcy4KCkRhbmllbCBTdGVuYmVyZyAoMTUgT2N0IDIwMDgpCi0gUGFzY2FsIFRlcmphbiBmaWxlZCBidWcgIzIxNTQ2MjcKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIxNTQ2MjcpIHdoaWNoIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybAogIHVzZXMgc3RyY2FzZWNtcCgpIGluIG11bHRpcGxlIHBsYWNlcyB3aGVyZSBpdCBjYXVzZXMgZmFpbHVyZXMgd2hlbiB0aGUKICBUdXJraXNoIGxvY2FsZSBpcyB1c2VkLiBUaGlzIGlzIGJlY2F1c2UgJ2knIGFuZCAnSScgaXNuJ3QgdGhlIHNhbWUgbGV0dGVyIHNvCiAgc3RyY2FzZWNtcCgpIG9uIHRob3NlIGxldHRlcnMgYXJlIGRpZmZlcmVudCBpbiBUdXJraXNoIHRoYW4gaW4gRW5nbGlzaCAob3IKICBqdXN0IGFib3V0IGFsbCBvdGhlciBsYW5ndWFnZXMpLiBJIHRodXMgaW50cm9kdWNlZCBhIHRvdGFsbHkgbmV3IGludGVybmFsCiAgZnVuY3Rpb24gaW4gbGliY3VybCAoY2FsbGVkIEN1cmxfcmF3X2VxdWFsKSBmb3IgZG9pbmcgY2FzZSBpbnNlbnRpdmUKICBjb21wYXJpc29ucyBmb3IgZW5nbGlzaC0oYXNjaWk/KSBzdHlsZSBzdHJpbmdzIHRoYXQgdGh1cyB3aWxsIG1ha2UgImZpbGUiCiAgYW5kICJGSUxFIiBtYXRjaCBldmVuIGlmIHRoZSBUdXJraXNoIGxvY2FsZSBpcyBzZWxlY3RlZC4KCkRhbmllbCBGYW5kcmljaCAoMTUgT2N0IDIwMDgpCi0gQSA8cHJlY2hlY2s+IGNvbW1hbmQgaXMgY29uc2lkZXJlZCB0byBoYXZlIGZhaWxlZCBpZiBpdCByZXR1cm5zIGEgbm9uLXplcm8KICByZXR1cm4gY29kZS4gIFRoaXMgd2F5LCBpZiB0aGUgcHJlY2hlY2sgY29tbWFuZCBjYW4ndCBiZSBydW4gYXQgYWxsIGZvcgogIHdoYXRldmVyIHJlYXNvbiwgaXQncyB0cmVhdGVkIGFzIGEgcHJlY2hlY2sgZmFpbHVyZSB3aGljaCBjYXVzZXMgdGhlCiAgdGVzdCB0byBiZSBza2lwcGVkLgoKRGFuaWVsIFN0ZW5iZXJnICgxNSBPY3QgMjAwOCkKLSBKb2huIFdpbGtpbnNvbiBmaWxlZCBidWcgIzIxNTU0OTYKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIxNTU0OTYpIHBvaW50aW5nIG91dCBhbiBlcnJvciBjYXNlCiAgd2l0aG91dCBhIHByb3BlciBodW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLiBXaGVuIGEgcmVhZCBjYWxsYmFjayByZXR1cm5zCiAgYSB0b28gbGFyZ2UgdmFsdWUgKGxpa2Ugd2hlbiB0cnlpbmcgdG8gcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyKSBpdCB3b3VsZAogIHRyaWdnZXIgYW5kIHRoZSBnZW5lcmljIGVycm9yIG1lc3NhZ2UgdGhlbiBtYWtlcyB0aGUgcHJvcGxlbSBzbGlnaHRseQogIGRpZmZlcmVudCB0byB0cmFjayBkb3duLiBJJ3ZlIGFkZGVkIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgbm93LgoKRGFuaWVsIEZhbmRyaWNoICg5IE9jdCAyMDA4KQotIEZpeGVkIHRoZSAtLWludGVyZmFjZSBvcHRpb24gdG8gd29yayB3aXRoIElQdjYgY29ubmVjdGlvbnMgb24gZ2xpYmMKICBzeXN0ZW1zIHN1cHBvcnRpbmcgZ2V0aWZhZGRycygpLiBBbHNvIGZpeGVkIGEgcHJvYmxlbSB3aGVyZSBhbiBJUHY2CiAgYWRkcmVzcyBjb3VsZCBiZSBjaG9zZW4gaW5zdGVhZCBvZiBhbiBJUHY0IG9uZSBmb3IgLS1pbnRlcmZhY2Ugd2hlbiBpdAogIGludm9sdmVkIGEgbmFtZSBsb29rdXAuCgpEYW5pZWwgRmFuZHJpY2ggKDggT2N0IDIwMDgpCi0gQWRkZWQgdGVzdHMgMTA4MiB0aHJvdWdoIDEwODUgdG8gdGVzdCBzeW1ib2xpYyAtLWludGVyZmFjZSBwYXJhbWV0ZXJzCgotIEFkZGVkIHRlc3RzIDYzMyB0aHJvdWdoIDYzNyB0byB0ZXN0IHRoZSBuZXcgZmlsZSByYW5nZSBzdXBwb3J0IGZvciBTRlRQLgogIEFsbCBidXQgdGhlIGZpcnN0IHRlc3QgY2F1c2UgYW4gaW5maW5pdGUgbG9vcCBvciBvdGhlciBmYWlsdXJlIGFuZCBzbwogIGFyZSBhZGRlZCB0byBESVNBQkxFRC4KCkRhbmllbCBTdGVuYmVyZyAoOCBPY3QgMjAwOCkKLSBKb2huIFdpbGtpbnNvbiBmaWxlZCBidWcgIzIxNTIyNzAKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIxNTIyNzApIHdoaWNoIGlkZW50aWZpZWQgYW5kIGZpeGVkIGEKICBDVVJMSU5GT19SRURJUkVDVF9VUkwgbWVtb3J5IGxlYWsgYW5kIGFuIGFkZGl0aW9uYWwgd3JvbmctZG9pbmc6CgogIEFueSBzdWJzZXF1ZW50IHRyYW5zZmVyIHdpdGggYSByZWRpcmVjdCBsZWFrcyBtZW1vcnksIGV2ZW50dWFsbHkgY3Jhc2hpbmcKICB0aGUgcHJvY2VzcyBwb3RlbnRpYWxseS4KCiAgQW55IHN1YnNlcXVlbnQgdHJhbnNmZXIgV0lUSE9VVCBhIHJlZGlyZWN0IGNhdXNlcyB0aGUgbW9zdCByZWNlbnQgcmVkaXJlY3QKICB0aGF0IERJRCBvY2N1ciBvbiBzb21lIHByZXZpb3VzIHRyYW5zZmVyIHRvIHN0aWxsIGJlIHJlcG9ydGVkLgoKLSBJZ29yIE5vdm9zZWx0c2V2IGZpbGVkIGJ1ZyAjMjExMTYxMwogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjExMTYxMykgdGhhdCBldmVudHVhbGx5IGlkZW50aWZpZWQgYQogIGZsYXcgaW4gaG93IHRoZSBtdWx0aV9zb2NrZXQgaW50ZXJmYWNlIGluIHNvbWUgY2FzZXMgbWlzc2VkIHRvIGNhbGwgdGhlCiAgdGltZW91dCBjYWxsYmFjayB3aGVuIGVhc3kgaW50ZXJmYWNlcyBhcmUgcmVtb3ZlZCBhbmQgYWRkZWQgd2l0aGluIHRoZSBzYW1lCiAgbWlsbGlzZWNvbmQuCgotIElnb3IgTm92b3NlbHRzZXYgYnJvdWdodCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlZCB0d28gbmV3IG9wdGlvbnMgdG8KICBjdXJsX2Vhc3lfc2V0b3B0OiBDVVJMT1BUX1VTRVJOQU1FIGFuZCBDVVJMT1BUX1BBU1NXT1JEIHRoYXQgc29ydCBvZgogIGRlcHJlY2F0ZXMgdGhlIGdvb2Qgb2xkIENVUkxPUFRfVVNFUlBXRCBzaW5jZSB0aGV5IGFsbG93IGFwcGxpY2F0aW9ucyB0byBzZXQKICB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCBpbmRlcGVuZGVudGx5IGFuZCBwZXJoYXBzIG1vcmUgaW1wb3J0YW50bHkgYWxsb3cKICBib3RoIHRvIGNvbnRhaW4gY29sb24ocykgd2hpY2ggQ1VSTE9QVF9VU0VSUFdEIGRvZXNuJ3QgZnVsbHkgc3VwcG9ydC4KCkRhbmllbCBGYW5kcmljaCAoNyBPY3QgMjAwOCkKLSBDaGFuZ2VkIHRoZSBoYW5kbGluZyBvZiByZWFkL3dyaXRlIGVycm9ycyBpbiBDdXJsX3BlcmZvcm0oKSB0byBhbGxvdyBhCiAgYSBmcmVzaCBjb25uZWN0aW9uIHRvIGJlIG1hZGUgaW4gc3VjaCBjYXNlcyBhbmQgdGhlIHJlcXVlc3QgcmV0cmFuc21pdHRlZC4KICBUaGlzIHNob3VsZCBmaXggdGVzdCBjYXNlIDE2MC4gIEFkZGVkIHRlc3QgY2FzZSAxMDc5IGluIGFuIGF0dGVtcHQgdG8KICB0ZXN0IGEgc2ltaWxhciBjb25uZWN0aW9uIGRyb3BwaW5nIHNjZW5hcmlvLCBidXQgYXMgYSByYWNlIGNvbmRpdGlvbiwgaXQncwogIGhhcmQgdG8gdGVzdCByZWxpYWJseS4KCi0gQ3JlYXRlZCB0ZXN0IGNhc2VzIDEwODAgYW5kIDEwODEgdG8gcmVwcm9kdWNlIGEgcHJvYmxlbSBvZgogIENVUkxJTkZPX1JFRElSRUNUX1VSTCBsZWFraW5nIG1lbW9yeSBhbmQgcmV0dXJuaW5nIGluY29ycmVjdCByZXN1bHRzIHdoZW4KICB0d28gVVJMcyBhcmUgcmVxdWVzdGVkLiBSZXBvcnRlZCBieSB2bXBkZW1vIGluIGJ1ZyAjMjE1MjI3MAoKRGFuaWVsIFN0ZW5iZXJnICg3IE9jdCAyMDA4KQotIEZpeGVkIENVUkxJTkZPX1BSSU1BUllfSVA6IFdoZW4gbGliY3VybCBjcmVhdGVkIGEgY29ubmVjdGlvbiB0byBob3N0IEEgdGhlbgogIHRoZSBhcHAgcmUtdXNlZCB0aGUgaGFuZGxlIHRvIGRvIGEgY29ubmVjdGlvbiB0byBob3N0IEIgYW5kIHRoZW4gYWdhaW4KICByZS11c2VkIHRoZSBoYW5kbGUgdG8gaG9zdCBBLCBpdCB3b3VsZCBub3QgdXBkYXRlIHRoZSBpbmZvIHdpdGggaG9zdCBBJ3MgSVAKICBhZGRyZXNzIChkdWUgdG8gdGhlIGNvbm5lY3Rpb24gYmVpbmcgcmUtdXNlZCkgYnV0IGl0IHdvdWxkIGluc3RlYWQgcmVwb3J0CiAgdGhlIGluZm8gZnJvbSBob3N0IEIuCgpZYW5nIFRzZSAoNyBPY3QgMjAwOCkKLSBBZGRlZCAtLWVuYWJsZS1vcHRpbWl6ZSBjb25maWd1cmUgb3B0aW9uIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBjb21waWxlcgogIG9wdGltaXphdGlvbnMgdG8gYWxsb3cgZGVjb3VwbGVkIHNldHRpbmcgZnJvbSAtLWVuYWJsZS1kZWJ1Zy4KCllhbmcgVHNlICgyIE9jdCAyMDA4KQotIEFkZGVkIC0tZW5hYmxlLXdhcm5pbmdzIGNvbmZpZ3VyZSBvcHRpb24gdG8gZW5hYmxlIGFuZCBkaXNhYmxlIHN0cmljdAogIGNvbXBpbGVyIHdhcm5pbmdzIHRvIGFsbG93IGRlY291cGxlZCBzZXR0aW5nIGZyb20gLS1lbmFibGUtZGVidWcuCgogIHJ1bnRlc3RzLnBsIHdpbGwgbm93IHJ1biB3aXRoIHBpY2t5IGNvbXBpbGVyIHdhcm5pbmdzIGVuYWJsZWQgdW5sZXNzCiAgZXhwbGljaXRseSBkaXNhYmxlZC4KCkRhbmllbCBGYW5kcmljaCAoMSBPY3QgMjAwOCkKLSAibWFrZSBjbGVhbiIgbm93IGNsZWFucyBvdXQgdGhlIGRvY3MgYW5kIHRlc3RzIGRpcmVjdG9yaWVzLCB0b28uCgpEYW5pZWwgU3RlbmJlcmcgKDMwIFNlcCAyMDA4KQotIFRoZSBsaWJjdXJsIEZUUCBjb2RlIG5vdyByZXR1cm5zIENVUkxFX1JFTU9URV9GSUxFX05PVF9GT1VORCBlcnJvciB3aGVuIFNJWkUKICBnZXRzIGEgNTUwIHJlc3BvbnNlIGJhY2sgZm9yIHRoZSBjYXNlcyB3aGVyZSBhIGRvd25sb2FkIChvciBOT0JPRFkpIGlzCiAgd2FudGVkLiBJdCBzdGlsbCBhbGxvd3MgYSA1NTAgYXMgcmVzcG9uc2UgaWYgdGhlIFNJWkUgaXMgdXNlZCBhcyBwYXJ0IG9mIGFuCiAgdXBsb2FkIHByb2Nlc3MgKGxpa2UgaWYgcmVzdW1pbmcgYW4gdXBsb2FkIGlzIHJlcXVlc3RlZCBhbmQgdGhlIGZpbGUgaXNuJ3QKICB0aGVyZSBiZWZvcmUgdGhlIHVwbG9hZCkuIEkgYWxzbyBtb2RpZmllZCB0aGUgRlRQIHRlc3Qgc2VydmVyIGFuZCBhIGZldyB0ZXN0CiAgY2FzZXMgYWNjb3JkaW5nbHkgdG8gbWF0Y2ggdGhpcyBtb2RpZmllZCBiZWhhdmlvci4KCkRhbmllbCBTdGVuYmVyZyAoMjkgU2VwIDIwMDgpCi0gRGFuaWVsIEVnZ2VyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBhbGxvd3MgeW91IHRvIGRpc2FibGUgcHJveHkgc3VwcG9ydCBpbgogIGxpYmN1cmwgdG8gc29tZXdoYXQgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBiaW5hcnkuIFJ1biBjb25maWd1cmUKICAtLWRpc2FibGUtcHJveHkuCgpEYW5pZWwgRmFuZHJpY2ggKDI5IFNlcCAyMDA4KQotIE1vdmVkIGFsbCBzaWduYWwtYmFzZWQgbmFtZSByZXNvbHV0aW9uIHRpbWVvdXQgaGFuZGxpbmcgaW50byBhIHNpbmdsZSBuZXcKICBDdXJsX3Jlc29sdl90aW1lb3V0IGZ1bmN0aW9uIHRvIHJlZHVjZSBjb3VwbGluZy4KCkRhbmllbCBTdGVuYmVyZyAoMjkgU2VwIDIwMDgpCi0gSWFuIEx5bmFnaCBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbm93IG1ha2VzIENVUkxPUFRfUkFOR0Ugd29yayBmaW5lIGZvciBTRlRQCiAgZG93bmxvYWRzIQoKLSBNYXhpbSBJdmFub3YgZmlsZWQgYnVnIHJlcG9ydCAjMjEwNzgwMwogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjEwNzgwMykgIm5vIENVUkxJTkZPX1JFRElSRUNUX1VSTCBpbgogIG11bHRpIG1vZGUiIHRvZ2V0aGVyIHdpdGggYSBwYXRjaCB0aGF0IGZpeGVkIHRoZSBwcm9ibGVtLgoKRGFuaWVsIFN0ZW5iZXJnICgyNSBTZXAgMjAwOCkKLSBFbWFudWVsZSBCb3Zpc2lvIHN1Ym1pdHRlZCBidWcgcmVwb3J0ICMyMTI2NDM1LiBXZSBmaXhlZCB0aGUgSFRUUCBEaWdlc3QKICBhdXRoIGNvZGUgdG8gbm90IGJlaGF2ZSBiYWRseSB3aGVuIGdldHRpbmcgYSBibGFuayByZWFsbSB3aXRoCiAgcmVhbG09IiIuIGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMTI2NDM1CgpEYW5pZWwgRmFuZHJpY2ggKDIzIFNlcCAyMDA4KQotIE1ha2Ugc3VyZSBub3QgdG8gZGVyZWZlcmVuY2UgdGhlIHdyb25nIFVybFN0YXRlIHByb3RvIHVuaW9uIG1lbWJlciB3aGVuCiAgc3dpdGNoaW5nIGZyb20gb25lIHByb3RvY29sIHRvIGFub3RoZXIgaW4gYSBzaW5nbGUgcmVxdWVzdCAoZS5nLgogIHJlZGlyZWN0aW5nIGZyb20gSFRUUCB0byBGVFAgYXMgaW4gdGVzdCAxMDU1KSBieSByZXNldHRpbmcKICBzdGF0ZS5leHBlY3QxMDBoZWFkZXIgYmVmb3JlIGV2ZXJ5IHJlcXVlc3QuCgpEYW5pZWwgU3RlbmJlcmcgKDIzIFNlcCAyMDA4KQotIEludHJvZHVjaW5nIEphbWllIExva2llcidzIGZ1bmN0aW9uIGZvciBkYXRlIHRvIGVwb2NoIGNvbnZlcnNpb24gdXNlZCBpbiB0aGUKICBkYXRlIHBhcnNlciBmdW5jdGlvbi4gVGhpcyBtYWtlcyBvdXIgZnVuY3Rpb24gbGVzcyBkZXBlbmRlbnQgb24gc3lzdGVtLQogIHByb3ZpZGVkIGZ1bmN0aW9ucyBhbmQgaW5zdGVhZCB3ZSBkbyBhbGwgdGhlIG1hZ2ljIG91cnNlbHZlcy4gV2UgYWxzbyBubwogIGxvbmdlciBkZXBlbmQgb24gdGhlIFRaIGVudmlyb25tZW50IHZhcmlhYmxlLiBTd2l0Y2hpbmcgdG8gb3VyIG93biBjb252ZXJ0ZXIKICBoYXMgc29tZSBzaWRlLWVmZmVjdCBhbmQgdGhleSBhcmUgbm90ZWQgaGVyZSBmb3IgZnV0dXJlIHJlZmVyZW5jZSAodGFrZW4KICBmcm9tIGEgbWFpbCBieSBtciBMb2tpZXIpOgoKICB0aW1lX3QgaXMgbm90IG1lYXN1cmVkIGluIHNlY29uZHMgaW4gdGhlIEFOU0kgQyBzdGFuZGFyZCAtIG9yIGV2ZW4gY291bnRlZAogIHVuaWZvcm1seSAtIHdlaXJkIHBsYXRmb3JtcyBjYW4gdXNlIG90aGVyIG51bWVyaWMgcmVwcmVzZW50YXRpb25zIG9mIGRhdGVzCiAgaW4gdGltZV90IC0gaGVuY2UgdGhlIGRpZmZ0aW1lKCkgZnVuY3Rpb24uCgogIE9uIFBPU0lYIHRpbWVfdCBpcyBtZWFzdXJlZCBpbiBVVEMgc2Vjb25kcywgd2hpY2ggbWVhbnMgbm90IGluY2x1ZGluZyBsZWFwCiAgc2Vjb25kcy4gIEJ1dCBpdCdzIG1lbnRpb25lZCBpbiBhIGZldyBwbGFjZXMgdGhhdCBzb21lIG9sZCBQT1NJWC1pc2gKICBlbnZpcm9ubWVudHMgaW5jbHVkZSBsZWFwIHNlY29uZHMgaW4gdGhlaXIgdGltZV90IGNvdW50cy4uLgoKICBJJ20gcHJldHR5IHN1cmUgW3RoZSBuZXcgaW1wbGVtZW50YXRpb24gaXNdIGNvcnJlY3Qgb24gYW55dGhpbmcgdHJ1bHkgUE9TSVguCiAgQW5kIGl0J3Mgb2J2aW91c2x5IGEgbG90IGxlc3MgZGVwZW5kZW50IG9uIHBsYXRmb3JtIHF1aXJrcyBhbmQgY29ybmVyIGNhc2VzCiAgaW4gbWFueSB3YXlzIHRoYW4gdGhlIG1rdGltZSgpIHZlcnNpb24uCgotIFJvYiBDcml0dGVuZGVuIGJyb3VnaHQgYSBwYXRjaCB0byAiYWRkIHNvbWUgbG9ja2luZyBmb3IgdGhyZWFkLXNhZmV0eSB0byBOU1MKICBpbXBsZW1lbnRhdGlvbiIuCgpEYW5pZWwgU3RlbmJlcmcgKDIyIFNlcCAyMDA4KQotIE1hZGUgdGhlIFNPQ0tTIGNvZGUgdXNlIHRoZSBuZXcgQ3VybF9yZWFkX3BsYWluKCkgZnVuY3Rpb24gdG8gZml4IHRoZSBidWcKICBNYXJrdXMgTW9lbGxlciByZXBvcnRlZDogaHR0cHM6Ly9jdXJsLmhheHguc2UvbWFpbC9hcmNoaXZlLTIwMDgtMDkvMDAxNi5odG1sCgotIHJlY3YoKSBlcnJvcnMgb3RoZXIgdGhhbiB0aG9zZSBlcXVhbCB0byBFQUdBSU4gbm93IGNhdXNlIHByb3BlcgogIENVUkxFX1JFQ1ZfRVJST1IgdG8gZ2V0IHJldHVybmVkLiBUaGlzIG1hZGUgdGVzdCBjYXNlIDE2MCBmYWlsIHNvIEkndmUgbm93CiAgZGlzYWJsZWQgaXQgdW50aWwgd2UgY2FuIGZpZ3VyZSBvdXQgYW5vdGhlciB3YXkgdG8gZXhlcmNpc2UgdGhhdCBsb2dpYy4KCi0gTWljaGFlbCBHb2ZmaW91bCBmaWxlZCBidWcgcmVwb3J0ICMyMTA3Mzc3ICJQcm9ibGVtIHdpdGggbXVsdGkgKyBHbnVUTFMgKwogIHByb3h5IiAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIxMDczNzcpIHRoYXQgc2hvd2VkIGhvdyBhIG11bHRpCiAgaW50ZXJmYWNlIHVzaW5nIHByb2dyYW0gZGlkbid0IHdvcmsgd2hlbiBidWlsdCB3aXRoIEdudVRMUyBhbmQgYSBDT05ORUNUCiAgcmVxdWVzdCB3YXMgZG9uZSBvdmVyIGEgcHJveHkgKGJhc2ljYWxseSB0ZXN0IDUwMiBvdmVyIGEgcHJveHkgdG8gYSBIVFRQUwogIHNpdGUpLiBJdCB0dXJuZWQgb3V0IHRoZSBzc2wgY29ubmVjdCBmdW5jdGlvbiB3b3VsZCBnZXQgY2FsbGVkIHR3aWNlIHdoaWNoCiAgY2F1c2VkIHRoZSBzZWNvbmQgY2FsbCB0byBmYWlsLgoKRGFuaWVsIEZhbmRyaWNoICgyMiBTZXAgMjAwOCkKLSBGaXhlZCB0ZXN0IDUzOSB0byBoYW5kbGUgYW4gb3V0IG9mIG1lbW9yeSBjb25kaXRpb24gdGhhdCBzaG93cyB1cCBub3cKICB0aGF0IG1lbWRlYnVnLmggaXMgaW5jbHVkZWQgaW4gdGhlIHRlc3QgcHJvZ3JhbXMuCgpZYW5nIFRzZSAoMjAgU2VwIDIwMDgpCi0gRml4IHJlZ3Jlc3Npb24gaW4gY29uZmlndXJlIHNjcmlwdCB3aGljaCBhZmZlY3RlZCBPcGVuU1NMIGJ1aWxkcyBvbiBNU1lTLgoKWWFuZyBUc2UgKDE5IFNlcCAyMDA4KQotIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGNoZWNrcyBhdmFpbGFiaWxpdHkgb2YgdGhlIGFsYXJtKCkgZnVuY3Rpb24uCgpEYW5pZWwgRmFuZHJpY2ggKDE4IFNlcCAyMDA4KQotIERvbid0IGJvdGhlciB0byBpbnN0YWxsIGEgU0lHQUxSTSBoYW5kbGVyIHVubGVzcyBhbGFybSgpIGlzIGF2YWlsYWJsZS4KICBBbHNvLCBsZWF2ZSB0aGUgZXhpc3RpbmcgU0lHQUxSTSBoYW5kbGVyIGFsb25lIGlmIHRoZSB0aW1lb3V0IGlzIHRvbyBzbWFsbAogIHRvIGhhbmRsZS4KCkRhbmllbCBGYW5kcmljaCAoMTcgU2VwIDIwMDgpCi0gUmVtb3ZlZCByZWZlcmVuY2UgdG8gY3VybC1jYS1idW5kbGUuY3J0IGluIHRoZSBob3N0IHZlcmlmaWNhdGlvbiBmYWlsdXJlCiAgZXJyb3IgbWVzc2FnZS4KCllhbmcgVHNlICgxNyBTZXAgMjAwOCkKLSBJbXByb3ZlIGNvbmZpZ3VyZSBkZXRlY3Rpb24gb2YgZ2V0aG9zdG5hbWUoKSwgbG9jYWx0aW1lX3IoKSwgc3Ryc3RyKCksCiAgZ2V0c2VydmJ5cG9ydF9yKCksIGdldGhvc3RieWFkZHJfcigpIGFuZCBnZXRob3N0YnluYW1lX3IoKS4KCllhbmcgVHNlICgxNCBTZXAgMjAwOCkKLSBJbXByb3ZlIGNvbmZpZ3VyZSBkZXRlY3Rpb24gb2Ygc3RyY2FzZWNtcCgpLCBzdHJjYXNlc3RyKCksIHN0cmNtcGkoKSwKICBzdHJpY21wKCksIHN0cmxjYXQoKSwgc3RybmNhc2VjbXAoKSwgc3RybmNtcGkoKSBhbmQgc3RybmljbXAoKS4KCllhbmcgVHNlICgxMyBTZXAgMjAwOCkKLSBEaXNhYmxlIHRyYWNraW5nIG9mIGZkb3BlbigpIGNhbGxzIGluIHRoZSBsb3ctbGV2ZWwgbWVtb3J5IGxlYWsgdHJhY2tpbmcKICBjb2RlIHdoZW4gZmRvcGVuKCkgaXMgbm90IGF2YWlsYWJsZSwgdG8gYXZvaWQgY29tcGlsZXIgZXJyb3IuCgpZYW5nIFRzZSAoMTIgU2VwIDIwMDgpCi0gRnVydGhlciBhZGp1c3QgZGV0ZWN0aW9uIG9mIHN0cmVycm9yX3IoKSBpbiB0aGUgY29uZmlndXJlIHByb2Nlc3MsIGFuZAogIGVuc3VyZSB0aGF0IGVycm5vIGlzIG5vdCBtb2RpZmllZCBpbnNpZGUgQ3VybF9zdHJlcnJvcigpLgoKWWFuZyBUc2UgKDEwIFNlcCAyMDA4KQotIEltcHJvdmUgZGV0ZWN0aW9uIG9mIGdtdGltZV9yKCksIHN0cnRvbGwoKSwgc2lnYWN0aW9uKCksIHN0cnRva19yKCksCiAgc3RyZHVwKCkgYW5kIGZ0cnVuY2F0ZSgpIGluIHRoZSBjb25maWd1cmUgcHJvY2Vzcy4KCkRhbmllbCBGYW5kcmljaCAoOSBTZXAgMjAwOCkKLSBNaWtlIFJldmkgZGlzY292ZXJlZCBzb21lIHN3YXBwZWQgc3BlZWQgc3dpdGNoZXMgZG9jdW1lbnRlZCBpbiB0aGUgY3VybCBtYW4KICBwYWdlLgoKLSBDaGVja2VkIGluIHNvbWUgZG9jdW1lbnRhdGlvbiBhbmQgY29kZSBpbXByb3ZlbWVudHMgYW5kIGZpeGVzIHRoYXQgSQogIGRpc2NvdmVyZWQgaW4gdGhlIEZyZWVCU0QgcG9ydHMgc3lzdGVtLgoKRGFuaWVsIFN0ZW5iZXJnICg4IFNlcCAyMDA4KQotIERtaXRyeSBLdXJvY2hraW4gcGF0Y2hlZCBhIHByb2JsZW06IEkgaGF2ZSBmb3VuZCBidWcgaW4gcGlwZWxpbmluZyB0aHJvdWdoCiAgcHJveHkuIEkgaGF2ZSBhIHRyYW5zcGFyZW50IHByb3h5LiBXaGVuIHJ1bm5pbmcgd2l0aCBodHRwX3Byb3h5IGVudmlyb25tZW50CiAgdmFyaWFibGUgbm90IHNldCBteSB0ZXN0IGNvbXBsZXRlcyBmaW5lIChpdCBnb2VzIHRocm91Z2ggdHJhbnNwYXJlbnQKICBwcm94eSkuIFdoZW4gSSBzZXQgaHR0cF9wcm94eSB2YXJpYWJsZSBteSB0ZXN0IGhhbmdzIGFmdGVyIHRoZSBmaXJzdAogIGRvd25sb2FkZWQgaXMgY29tcGxldGUuIExvb2tzIGxpa2UgdGhlIHNlY29uZCBoYW5kbGUgbmV2ZXIgZ2V0cyBvdXQgZnJvbQogIFdBSVRETyBzdGF0ZS4KCiAgVGhlIGZpeDogSXQgbWFrZXMgY2hlY2tQZW5kUGlwZWxpbmUgbW92ZSAxIGhhbmRsZXIgZnJvbSBwZW5kIHBpcGUgdG8gc2VuZAogIHBpcGUgaWYgcGlwZWxpbmluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHNlcnZlciBidXQgdGhlcmUgYXJlIG5vIGhhbmRsZXMgaW4KICBzZW5kIGFuZCByZWN2IHBpcGVzLgoKLSBTdGVmYW4gS3JhdXNlIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCB3b3VsZCB3cm9uZ2x5IHNlbmQgYXdheSBjb29raWVzIHRvCiAgc2l0ZXMgaW4gY2FzZXMgd2hlcmUgdGhlIGNvb2tpZSBjbGVhcmx5IGhhcyBhIHZlcnkgb2xkIGV4cGlyeSBkYXRlLiBUaGUKICBjb25kaXRpb24gd2FzIHNpbXBseSB0aGF0IGxpYmN1cmwncyBkYXRlIHBhcnNlciB3b3VsZCBmYWlsIHRvIGNvbnZlcnQgdGhlCiAgZGF0ZSBhbmQgaXQgd291bGQgdGhlbiBjb3VudCBhcyBhICh0aW1lZC1iYXNlZCkgbWF0Y2guIFN0YXJ0aW5nIG5vdywgYQogIG1pc3NlZCBkYXRlIGR1ZSB0byBhbiB1bnN1cHBvcnRlZCBkYXRlIGZvcm1hdCBvciBkYXRlIHJhbmdlIHdpbGwgbm93IGNhdXNlCiAgdGhlIGNvb2tpZSB0byBub3QgbWF0Y2guCgpEYW5pZWwgRmFuZHJpY2ggKDUgU2VwIDIwMDgpCi0gSW1wcm92ZWQgdGhlIGxvZ2ljIHRoYXQgZGVjaWRlcyB3aGV0aGVyIHRvIHVzZSBIVFRQIDEuMSBmZWF0dXJlcyBvciBub3QgaW4gYQogIHJlcXVlc3QuICBTZXR0aW5nIGEgc3BlY2lmaWMgdmVyc2lvbiB3aXRoIENVUkxPUFRfSFRUUF9WRVJTSU9OIG92ZXJyaWRlcwogIGFsbCBvdGhlciBjaGVja3MsIGJ1dCBvdGhlcndpc2UsIGEgMS4wIHJlcXVlc3Qgd2lsbCBiZSBtYWRlIGlmIHRoZSBzZXJ2ZXIKICBpcyBrbm93biB0byBzdXBwb3J0IG9ubHkgMS4wIGJlY2F1c2UgaXQgcHJldmlvdXNseSByZXNwb25kZWQgc28gYW5kIHRoZQogIGNvbm5lY3Rpb24gd2FzIGtlcHQgYWxpdmUsIG9yIGEgcmVzcG9uc2UgdG8gYSBwcmV2aW91cyByZXF1ZXN0IG9uIHRoaXMgaGFuZGxlCiAgY2FtZSBiYWNrIGFzIDEuMC4gVGhlIGxhdHRlciBjb3VsZCB0YWtlIHBsYWNlIGluIGNhc2VzIGxpa2UgcmVkaXJlY3Rpb24gb3IKICBhdXRoZW50aWNhdGlvbiB3aGVyZSBzZXZlcmFsIHJlcXVlc3RzIGhhdmUgdG8gYmUgbWFkZSBiZWZvcmUgdGhlIG9wZXJhdGlvbgogIGlzIGNvbXBsZXRlLiAgSWYgYW55IG9uZSBvZiB0aGUgc2VydmVycyBpbiBhIHJlZGlyZWN0aW9uIGNoYWluIHN1cHBvcnRzIG9ubHkKICAxLjAsIHRoZW4gcmVtYWluaW5nIHJlcXVlc3RzIHdpbGwgYmUgc2VudCBpbiAxLjAgbW9kZS4KCi0gRGV0ZWN0IGNhc2VzIHdoZXJlIGFuIHVwbG9hZCBtdXN0IGJlIHNlbnQgY2h1bmtlZCBhbmQgdGhlIHNlcnZlciBzdXBwb3J0cwogIG9ubHkgSFRUUCAxLjAgYW5kIHJldHVybiBDVVJMRV9VUExPQURfRkFJTEVELgoKRGFuaWVsIFN0ZW5iZXJnICg1IFNlcCAyMDA4KQotIE1hcnRpbiBEcmFzYXIgcHJvdmlkZWQgdGhlIENVUkxPUFRfUE9TVFJFRElSIHBhdGNoLiBJdCByZW5hbWVzCiAgQ1VSTE9QVF9QT1NUMzAxIChidXQgYWRkcyBhIGRlZmluZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHlvdSB3aG8KICBkb24ndCBkZWZpbmUgQ1VSTF9OT19PTERJRVMpLiBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIG5vdyBhbHNvIGNoYW5nZSB0aGUKICBsaWJjdXJsIGJlaGF2aW9yIGZvciBhIEhUVFAgcmVzcG9uc2UgMzAyIGFmdGVyIGEgUE9TVCB0byBub3QgdXNlIEdFVCBpbiB0aGUKICBzdWJzZXF1ZW50IHJlcXVlc3QgKHdoZW4gQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiBpcyBlbmFibGVkKS4gSSBlZGl0ZWQgdGhlCiAgcGF0Y2ggc29tZXdoYXQgYmVmb3JlIGNvbW1pdC4gVGhlIGN1cmwgdG9vbCBnb3QgYSBtYXRjaGluZyAtLXBvc3QzMDIKICBvcHRpb24uIFRlc3QgY2FzZSAxMDc2IHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhpcy4KCi0gSW50cm9kdWNpbmcgQ1VSTE9QVF9DRVJUSU5GTyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgQ1VSTElORk9fQ0VSVElORk8uIEJ5CiAgZW5hYmxpbmcgdGhpcyBmZWF0dXJlIHdpdGggQ1VSTE9QVF9DRVJUSU5GTyBmb3IgYSByZXF1ZXN0IHVzaW5nIFNTTCAoSFRUUFMKICBvciBGVFBTKSwgbGliY3VybCB3aWxsIGdhdGhlciBsb3RzIG9mIHNlcnZlciBjZXJ0aWZpY2F0ZSBpbmZvIGFuZCB0aGF0IGluZm8KICBjYW4gdGhlbiBnZXQgZXh0cmFjdGVkIGJ5IGEgY2xpZW50IGFmdGVyIHRoZSByZXF1ZXN0IGhhcyBjb21wbGV0ZWQgd2l0aAogIGN1cmxfZWFzeV9nZXRpbmZvKCkncyBDVVJMSU5GT19DRVJUSU5GTyBvcHRpb24uIExpbnVzIE5pZWxzZW4gRmVsdHppbmcKICBoZWxwZWQgbWUgdGVzdCBhbmQgc21vb3RoZW4gb3V0IHRoaXMgZmVhdHVyZS4KCiAgVW5mb3J0dW5hdGVseSwgdGhpcyBmZWF0dXJlIGN1cnJlbnRseSBvbmx5IHdvcmtzIHdpdGggbGliY3VybCBidWlsdCB0byB1c2UKICBPcGVuU1NMLgoKICBUaGlzIGZlYXR1cmUgd2FzIHNwb25zb3JlZCBieSBuZXR3b3JraW5nNGFsbC5jb20gLSB0aGFua3MhCgotIERtaXRyaXkgU2VyZ2V5ZXYgcG9pbnRlZCBvdXQgdGhhdCBjdXJsX2Vhc3lfcGF1c2UoKSBkaWRuJ3QgdW5wYXVzZSBwcm9wZXJseQogIGR1cmluZyBjZXJ0YWluIGNvbmRpdGlvbnMuIEkgYWxzbyBjaGFuZ2VkIHRoaXMgY29kZSB0byB1c2UgcmVhbGxvYygpIGJhc2VkCiAgb24gRGFuaWVsIEZhbmRyaWNoJ3Mgc3VnZ2VzdGlvbi4KCkd1ZW50ZXIgS25hdWYgKDQgU2VwIDIwMDgpCi0gTWluZ1czMiBub24tY29uZmlndXJlIGJ1aWxkcyBhcmUgbm93IGxhcmdlZmlsZSBmZWF0dXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KICBOZXRXYXJlIExJQkMgYnVpbGRzIGFyZSBhbHNvIG5vdyBsYXJnZWZpbGUgZmVhdHVyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCgpZYW5nIFRzZSAoNCBTZXAgMjAwOCkKLSBTZXZlcmFsIGZpeGVzIHJlbGF0ZWQgd2l0aCBwcmludCBmb3JtYXR0aW5nIHN0cmluZyBkaXJlY3RpdmVzLgoKRGFuaWVsIEZhbmRyaWNoICgzIFNlcCAyMDA4KQotIFNlYXJjaCBmb3IgdGhlIEZyZWVCU0QgQ0EgY2VydCBmaWxlIC91c3IvbG9jYWwvc2hhcmUvY2VydHMvY2Etcm9vdC5jcnQKCkRhbmllbCBGYW5kcmljaCAoMiBTZXAgMjAwOCkKLSBGaXhlZCBhbiBvdXQgb2YgbWVtb3J5IHByb2JsZW0gdGhhdCBjYXVzZWQgdG9ydHVyZSB0ZXN0IGZhaWx1cmVzIGluIHRlc3RzCiAgNzA2IGFuZCA3MDcuCgpEYW5pZWwgU3RlbmJlcmcgKDIgU2VwIDIwMDgpCi0gS2VpdGggTW9rIGFkZGVkIHN1cHBvcnRlZF9wcm90b2NvbHMgYW5kIHN1cHBvcnRlZF9mZWF0dXJlcyB0byB0aGUgcGtnLWNvbmZpZwogIGZpbGUgZm9yIGxpYmN1cmwsIGFuZCB3aGlsZSBkb2luZyB0aGF0IGZpeCBoZSB1bmlmaWVkIHdpdGggY3VybC1jb25maWcuaW4KICBob3cgdGhlIHN1cHBvcnRlZCBwcm90b2NvbHMgYW5kIGZlYXR1cmVzIGFyZSBleHRyYWN0ZWQgYW5kIHVzZWQsIHNvIGJvdGggdGhvc2UKICB0b29scyBzaG91bGQgbm93IGFsd2F5cyBiZSBzeW5jZWQuCgpWZXJzaW9uIDcuMTkuMCAoMSBTZXB0ZW1iZXIgMjAwOCkKCkRhbmllbCBGYW5kcmljaCAoMjkgQXVnIDIwMDgpCi0gQWRkZWQgdGVzdHMgMTA3MSB0aHJvdWdoIDEwNzQgdG8gdGVzdCBhdXRvbWF0aWMgZG93bmdyYWRpbmcgZnJvbSBIVFRQIDEuMQogIHRvIEhUVFAgMS4wIHVwb24gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgSFRUUCBzZXJ2ZXIuICBUZXN0cyAxMDcyCiAgYW5kIDEwNzMgYXJlIHNpbWlsYXIgdG8gdGVzdCAxMDY5IGluIHRoYXQgdGhleSBpbnZvbHZlIHRoZSBpbXBvc3NpYmxlCiAgc2NlbmFyaW8gb2Ygc2VuZGluZyBjaHVua2VkIGRhdGEgdG8gYSBIVFRQIDEuMCBzZXJ2ZXIuICBBbGwgdGhlc2UgZmFpbAogIGFuZCBhcmUgYWRkZWQgdG8gRElTQUJMRUQuCgotIEFkZGVkIHRlc3QgMTA3NSB0byB0ZXN0IC0tYW55YXV0aCB3aXRoIEJhc2ljIGF1dGhlbnRpY2F0aW9uLgoKRGFuaWVsIFN0ZW5iZXJnICgyOSBBdWcgMjAwOCkKLSBXaGVuIGxpYmN1cmwgd2FzIGRvaW5nIGEgSFRUUCBQT1NUIGFuZCB0aGUgc2VydmVyIHdvdWxkIHJlc3BvbmQgd2l0aAogICJDb25uZWN0aW9uOiBjbG9zZSIgYW5kIGFjdHVhbGx5IGNsb3NlIHRoZSBjb25uZWN0aW9uIGFmdGVyIHRoZQogIHJlc3BvbnNlLWJvZHksIGxpYmN1cmwgY291bGQgc3RpbGwgaGF2ZSBvdXRzdGFuZGluZyBkYXRhIHRvIHNlbmQgYW5kIGl0CiAgd291bGQgbm90IHByb3Blcmx5IG5vdGljZSB0aGlzIGFuZCBzdG9wIHNlbmRpbmcuIFRoaXMgY2F1c2VkIHdlaXJkbmVzcyBhbmQKICBzYWQgZmFjZXMuIGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMDgwMjIyCgogIE5vdGUgdGhhdCB0aGVyZSBhcmUgc3RpbGwgcmVhc29ucyB0byBjb25zaWRlciBsaWJjdXJsJ3MgYmVoYXZpb3Igd2hlbgogIGdldHRpbmcgYSA+PSA0MDAgcmVzcG9uc2UgY29kZSB3aGlsZSBzZW5kaW5nIGRhdGEsIGFzIENyYWlnIFBlcnJhcycgbm90ZQogICJodHRwIHVwbG9hZDogaG93IHRvIHN0b3Agb24gZXJyb3IiIHNwZWNpZmllczoKICBodHRwczovL2N1cmwuaGF4eC5zZS9tYWlsL2FyY2hpdmUtMjAwOC0wOC8wMTM4Lmh0bWwKCkRhbmllbCBTdGVuYmVyZyAoMjggQXVnIDIwMDgpCi0gRGVuZ21pbndlbiByZXBvcnRlZCB0aGF0IGxpYmN1cmwgd291bGQgbG9jayBhIChjb29raWUpIHNoYXJlIHR3aWNlICh3aXRob3V0CiAgYW4gdW5sb2NrIGluIGJldHdlZW4pIGZvciBhIGNlcnRhaW4gY2FzZSBhbmQgdGhhdCBpbiBmYWN0IHdvcmtzIHdoZW4gdXNpbmcKICByZWd1bGFyIHdpbmRvd3MgbXV0ZXhlcyBidXQgbm90IHdpdGggcHRocmVhZHMnISBMb2NrcyBzaG91bGQgb2YgY291cnNlIG5vdAogIGdldCBsb2NrZWQgYWdhaW4gc28gdGhpcyBpcyBub3cgZml4ZWQuCiAgaHR0cHM6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwOC0wOC8wNDIyLmh0bWwKCi0gSSdtIGFiYW5kb25pbmcgdGhlIHN5c3RlbSB3aXRoIHRoZSB3ZWIgc2l0ZSBtaXJyb3JzIChidXQga2VlcGluZyBkb3dubG9hZAogIGZpbGVzIGJpbmcgbWlycm9yZWQpIGFuZCB0aHVzIEkndmUgY2hhbmdlZCB0aGUgVVJMIGluIHRoZSBjb29raWVqYXIgaGVhZGVyCiAgdG8gbm8gbG9uZ2VyIHVzZSBjdXJsbS5oYXh4LnNlIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgbWFpbiBzaXRlIGN1cmwuaGF4eC5zZQoKRGFuaWVsIEZhbmRyaWNoICgyNyBBdWcgMjAwOCkKLSBGaXhlZCB0ZXN0IGNhc2UgMTA2NSBieSBjaGFuZ2luZyB0aGUgaGFuZGxpbmcgb2YgQ1VSTE9QVF9VUExPQUQgdG8gc2V0CiAgdGhlIEhUVFAgbWV0aG9kIHRvIEdFVCAob3IgSEVBRCkgd2hlbiBnaXZlbiBhIHZhbHVlIG9mIDAuCgotIEFkZGVkIHRlc3QgY2FzZXMgMTA2OCBhbmQgMTA2OSB0byB0ZXN0IGEgc2ltcGxlIEhUVFAgUFVUIGZyb20gc3RkaW4uICBUZXN0CiAgY2FzZSAxMDY5IGZhaWxzIGluIGEgc2ltaWxhciBtYW5uZXIgdG8gdGVzdCAxMDY1IHNvIGlzIGFkZGVkIHRvIERJU0FCTEVELgoKWWFuZyBUc2UgKDI3IEF1ZyAyMDA4KQotIEZpeCBnZW5lcmF0aW9uIG9mIE1TIFZDNiAuZHNwIGZpbGUgdG8gbWFrZSBpdCBzdXBwb3J0IGNvbXBpbGF0aW9uIG9mIGVpdGhlcgogIGR5bmFtaWMgKERMTCkgb3Igc3RhdGljIChMSUIpIGxpYmN1cmwgbGlicmFyaWVzIGluIGRlYnVnIGFuZCByZWxlYXNlIG1vZGVzLgoKRGFuaWVsIEZhbmRyaWNoICgyNiBBdWcgMjAwOCkKLSBGaXhlZCBvdXQgb2YgbWVtb3J5IHByb2JsZW1zIHRoYXQgY2F1c2VkIHRvcnR1cmUgdGVzdCBmYWlsdXJlcyBpbiB0ZXN0cwogIDEwMjEgYW5kIDEwNjcuCgpZYW5nIFRzZSAoMjYgQXVnIDIwMDgpCi0gQWRkZWQgY2hlY2sgYW5kIHN5bWJvbCBkZWZpbml0aW9uIGZvciBXSU4zMiBmaWxlIEFQSSB1c2FnZSBpbiBjb25maWd1cmUsCiAgc3VwcG9ydGluZyBjb25maWd1cmUncyAtLWRpc2FibGUtbGFyZ2VmaWxlIG9wdGlvbiBmb3IgV0lOMzIgdGFyZ2V0cyBhbHNvLgoKLSBOb24tY29uZmlndXJlIHN5c3RlbXMgd2hpY2ggZG8gbm90IHVzZSBjb25maWctd2luMzIuaCBjb25maWd1cmF0aW9uIGZpbGUsCiAgYW5kIHdhbnQgdG8gdXNlIHRoZSBXSU4zMiBmaWxlIEFQSSwgbXVzdCBkZWZpbmUgVVNFX1dJTjMyX0xBUkdFX0ZJTEVTIG9yCiAgVVNFX1dJTjMyX1NNQUxMX0ZJTEVTIGFzIGFwcHJvcHJpYXRlIGluIHRoZWlyIG93biBjb25maWd1cmF0aW9uIGZpbGVzLgoKRGFuaWVsIFN0ZW5iZXJnICgyMyBBdWcgMjAwOCkKLSBSdW5uaW5nICdtYWtlIGNhLWZpcmVmb3gnIGluIHRoZSByb290IGJ1aWxkIGRpciB3aWxsIG5vdyBydW4gdGhlIG5ldwogIGZpcmVmb3gtZGIycGVtLnNoIGNvbnZlcnNpb24gc2NyaXB0IHRoYXQgY29udmVydHMgYSBsb2NhbCBGaXJlZm94IGRiIG9mIGNhCiAgY2VydHMgaW50byBQRU0gZm9ybWF0LCBzdWl0YWJsZSBmb3IgdXNlIHdpdGggYSBPcGVuU1NMIG9yIEdudVRMUyBidWlsdAogIGxpYmN1cmwuCgotIENvbnN0YW50aW5lIFNhcHVudHpha2lzIGZpeGVkIGEgYnVnIHdoZW4gZG9pbmcgcHJveHkgQ09OTkVDVCB3aXRoIHRoZSBtdWx0aQogIGludGVyZmFjZSwgYW5kIHRoZSBwcm94eSB3b3VsZCBzZW5kIENvbm5lY3Rpb246IGNsb3NlIGR1cmluZyB0aGUKICBhdXRoZW50aWNhdGlvbiBwaGFzZS4gIGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMDY5MDQ3CgpEYW5pZWwgRmFuZHJpY2ggKDIyIEF1ZyAyMDA4KQotIEZpeGVkIGEgcHJvYmxlbSB3aGVuIC0tZHVtcC1oZWFkZXIgLSB3YXMgZ2l2ZW4gd2l0aCBtb3JlIHRoYW4gb25lIFVSTCwKICB3aGljaCBjYXVzZWQgYW4gZXJyb3Igd2hlbiB0aGUgc2Vjb25kIGhlYWRlciB3YXMgZHVtcGVkIGR1ZSB0byBzdGRvdXQKICBiZWluZyBjbG9zZWQuICBBZGRlZCB0ZXN0IGNhc2UgMTA2NiB0byB2ZXJpZnkuICBBbHNvIGZpeGVkIGEgcG90ZW50aWFsCiAgcHJvYmxlbSB3aGVyZSBhIGNsb3NlZCBmaWxlIGRlc2NyaXB0b3IgbWlnaHQgYmUgdXNlZCBmb3IgYW4gdXBsb2FkCiAgd2hlbiBtb3JlIHRoYW4gb25lIFVSTCBpcyBnaXZlbi4KCllhbmcgVHNlICgyMiBBdWcgMjAwOCkKLSBJbXByb3ZlZCBsaWJjdXJsJ3MgaW50ZXJuYWwgY3VybF9tKnByaW50ZigpIGZ1bmN0aW9ucyBpbnRlZ3JhbCBkYXRhIHR5cGUKICBzaXplIGFuZCBzaWduZWRuZXNzIGhhbmRsaW5nLgoKLSBJbnRlcm5hbCBhZGp1c3RtZW50cyB0byBiZXR0ZXIgc2VsZWN0L2RpZmZlcmVudGlhdGUgd2hlbiBsYXJnZS9zbWFsbCBmaWxlCiAgc3VwcG9ydCBpcyBwcm92aWRlZCB1c2luZyBXSU4zMiBmdW5jdGlvbnMgZGlyZWN0bHkuCgpEYW5pZWwgRmFuZHJpY2ggKDIwIEF1ZyAyMDA4KQotIEFkZGVkIGFuIGVkaXRlZCB2ZXJzaW9uIG9mIFZpbmNlbnQgTGUgTm9ybWFuZCdzIGRvY3VtZW50YXRpb24gb2YgU0ZUUCBxdW90ZQogIGNvbW1hbmRzIHRvIHRoZSBtYW4gcGFnZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDIwIEF1ZyAyMDA4KQotIFBoaWwgUGVsbG91Y2hvdWQgcG9pbnRlZCBvdXQgdGhhdCB0aGUgd2luZG93cyB2ZXJzaW9uIG9mIGxpYmN1cmwgaGFkIGEKICBtZW1vcnkgbGVhayBiZWNhdXNlIGl0IG5ldmVyIGNhbGxlZCB0aGUgT3BlblNTTCBmdW5jdGlvbgogIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCkgYXMgaXQgd2FzIHN1cHBvc2VkIHRvLiBUaGlzIHdhcyBiZWNhdXNlIG9mIGEKICBtaXNzaW5nIGRlZmluZSBpbiBjb25maWctd2luMzIuaCEKCkdpc2xlIFZhbmVtICgxOCBBdWcgMjAwOCkKLSBVcGRhdGVkIGxpYi9NYWtlZmlsZS5XYXRjb20gd2l0aCB0aGUgb3B0aW9uIHRvIHVzZSBjLWFyZXMgKFVTRV9BUkVTPTEpLgoKWWFuZyBUc2UgKDE4IEF1ZyAyMDA4KQotIEFkZGVkIHRlc3QgY2FzZSA1NTcgdG8gdmVyaWZ5IGxpYmN1cmwncyBpbnRlcm5hbCBjdXJsX20qcHJpbnRmKCkgZnVuY3Rpb25zCiAgZm9ybWF0dGluZyBmdW5jdGlvbmFsaXR5IHdoZW4gaGFuZGxpbmcgc2lnbmVkIGFuZCB1bnNpZ25lZCBsb25ncywgYXMgd2VsbCBhcwogIG91ciBjdXJsX29mZl90IGRhdGEgdHlwZS4KCllhbmcgVHNlICgxNyBBdWcgMjAwOCkKLSBPcGVuU1NsIGVuYWJsZWQgTmV0V2FyZSBidWlsZHMgYXJlIGNoYW5nZWQgdG8gdXNlIHRoZSAnb3BlbnNzbCcgc3ViZGlyZWN0b3J5CiAgd2hlbiBpbmNsdWRpbmcgdGhlIE9wZW5TU0wgaGVhZGVyIGZpbGVzLiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBzZXR0aW5nLCB0aGlzCiAgcHJldmVudHMgdGhlIHVuZGVzaXJlZCBpbmNsdXNpb24gb2YgaGVhZGVyIGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aG9zZQogIG9mIE9wZW5TU0wgYnV0IHdoaWNoIGRvIG5vdCBiZWxvbmcgdG8gdGhlIE9wZW5TU0wgcGFja2FnZS4gVGhlIHZpc2libGUgY2hhbmdlCiAgZnJvbSBwcmV2aW91c2x5IHJlbGVhc2VkIGxpYmN1cmwgdmVyc2lvbnMgaXMgdGhhdCBub3cgT3BlblNTbCBlbmFibGVkIE5ldFdhcmUKICBidWlsZHMgYWxzbyBkZWZpbmUgVVNFX09QRU5TU0wgaW4gY29uZmlnIGZpbGVzLCBhbmQgdGhhdCBPcGVuU1NMIGhlYWRlciBmaWxlcwogIG11c3QgYmUgbG9jYXRlZCBpbiBhIHN1YmRpcmVjdG9yeSBuYW1lZCAnb3BlbnNzbCcuCgpZYW5nIFRzZSAoMTYgQXVnIDIwMDgpCi0gTGlicmFyeSBpbnRlcm5hbCBvbmx5IEMgcHJlcHJvY2Vzc29yIG1hY3JvcyBGT1JNQVRfT0ZGX1QgYW5kIEZPUk1BVF9PRkZfVFUKICByZW1haW4gaW4gdXNlIGFzIGludGVybmFsIGN1cmxfb2ZmX3QgcHJpbnQgZm9ybWF0dGluZyBzdHJpbmdzIGZvciB0aGUgaW50ZXJuYWwKICAqcHJpbnRmIGZ1bmN0aW9ucyB3aGljaCBzdGlsbCBjYW5ub3QgaGFuZGxlIHByaW50IGZvcm1hdHRpbmcgc3RyaW5nIGRpcmVjdGl2ZXMKICBzdWNoIGFzICJJNjRkIiwgIkk2NHUiLCBhbmQgb3RoZXJzIGF2YWlsYWJsZSBvbiBNU1ZDLCBNaW5HVywgSW50ZWwncyBJQ0MsIGFuZAogIG90aGVyIERPUy9XaW5kb3dzIGNvbXBpbGVycy4KCkRhbmllbCBGYW5kcmljaCAoMTUgQXVnIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlIDEwNjMgdG8gdGVzdCBpbnZhbGlkIGxvbmcgZmlsZSByYW5nZXMgd2l0aCBmaWxlOiBVUkxzIGFuZAogIDEwNjQgdG8gdGVzdCBtdWx0aXBsZSBodHRwIFBVVHMuCgotIEFkZGVkIHRlc3QgY2FzZSAxMDY1IHRvIHRlc3QgYSBQVVQgd2l0aCBhIHNpbmdsZSBmaWxlIGJ1dCB0d28gVVJMcy4gVGhpcwogIHdhcyBkaXNjb3ZlcmVkIHRvIGJlIHByb2JsZW1hdGljIHdoaWxlIGludmVzdGlnYXRpbmcgYW4gaW5jaWRlbnQgcmVwb3J0ZWQgYnkKICBWb24gYmFjayBpbiBNYXkuICBjdXJsIGluIHRoaXMgY2FzZSBkb2Vzbid0IGluY2x1ZGUgYSBDb250ZW50LUxlbmd0aDogb3IKICBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCBoZWFkZXIgd2hpY2ggaXMgaWxsZWdhbC4gVGhpcyB0ZXN0IGNhc2UgaXMKICBhZGRlZCB0byBESVNBQkxFRCB1bnRpbCBhIHNvbHV0aW9uIGlzIGZvdW5kLgoKWWFuZyBUc2UgKDE1IEF1ZyAyMDA4KQotIEMgcHJlcHJvY2Vzc29yIG1hY3JvcyB1c2VkIGludGVybmFsbHkgYW5kIGVxdWFsbHkgYXZhaWxhYmxlIGV4dGVybmFsbHkgd2hpY2gKICBhaWQgaW4gdGhlIHVzZSBvZiB0aGUgY3VybF9vZmZfdCBkYXRhIHR5cGUgYXJlIG5hbWVkOiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9ULAogIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVLCBDVVJMX1NJWkVPRl9DVVJMX09GRl9ULCBDVVJMX1NVRkZJWF9DVVJMX09GRl9ULAogIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVLCBDVVJMX09GRl9UX0MgYW5kIENVUkxfT0ZGX1RVX0MuCgpZYW5nIFRzZSAoMTMgQXVnIDIwMDgpCi0gVGhlIHNpemUgb2YgbG9uZyBpcyBhIGJ1aWxkIHRpbWUgY2hhcmFjdGVyaXN0aWMgYW5kIGFzIHN1Y2ggaXQgaXMgbm93IHJlY29yZGVkCiAgaW4gY3VybGJ1aWxkLmggYXMgQ1VSTF9TSVpFT0ZfTE9ORy4gRGVmaW5pdGlvbiBub3cgZG9uZSBmcm9tIGNvbmZpZ3VyZSBwcm9jZXNzCiAgYW5kIGluIENWUyBjdXJsYnVpbGQuaC5kaXN0IGZvciBub24tY29uZmlndXJlIHN5c3RlbXMuCgpEYW5pZWwgRmFuZHJpY2ggKDEyIEF1ZyAyMDA4KQotIEZpeGVkIGEgYnVmZmVyIG92ZXJmbG93IHByb2JsZW0gaW4gQ3VybF9wcm94eUNPTk5FQ1QgdGhhdCBjb3VsZCBvY2N1cgogIHdoZW4gYSBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGggbG9uZyBoZWFkZXJzIGFuZCBkYXRhLiAgTHVja2lseSwgdGhlIGJ1ZmZlcgogIG92ZXJmbG93ZWQgaW50byBhbm90aGVyIHVudXNlZCBidWZmZXIsIHNvIG5vIGFjdHVhbCBoYXJtIHdhcyBkb25lLgogIEFkZGVkIHRlc3QgY2FzZXMgMTA2MCBhbmQgMTA2MSB0byB2ZXJpZnkuCgpEYW5pZWwgU3RlbmJlcmcgKDEyIEF1ZyAyMDA4KQotIEFuZHkgVHNvdWxhZHplIGZpeGVkIHJ1bnRlc3RzLnBsIHRvIG5vdCBhdHRlbXB0IHRvIGV4ZWN1dGUgdGhlIHN0dW5uZWwKICBfZGlyZWN0b3J5XyBpZiB0aGF0IGhhcHBlbmVkIHRvIGFwcGVhciBpbiB0aGUgcGF0aCEKCllhbmcgVHNlICgxMiBBdWcgMjAwOCkKLSBBZGRlZCBtYWNyb3MgZm9yIG1pbmltdW0td2lkdGggc2lnbmVkIGFuZCB1bnNpZ25lZCBjdXJsX29mZl90IGludGVnZXIKICBjb25zdGFudHMgQ1VSTF9PRkZfVF9DIGFuZCBDVVJMX09GRl9UVV9DLiBUaGUgY2xldmVyIGRvdWJsZSBoZWxwZXIgbWFjcm8KICB1c2VkIGludGVybmFsbHkgdG8gcHJvdmlkZSBpdHMgZnVuY3Rpb25hbGl0eSBpcyB0aGFua3MgdG8gTGFycyBOaWxzc29uLgoKRGFuaWVsIEZhbmRyaWNoICgxMSBBdWcgMjAwOCkKLSBGaXhlZCBhIGJvdW5kYXJ5IGNvbmRpdGlvbiBlcnJvciBpbiBmdHBfcmVhZHJlc3AoKSB3aGVyZWJ5IGEgbm9uLXRlcm1pbmFsCiAgbGluZSBvZiBhIG11bHRpbGluZSBGVFAgcmVzcG9uc2Ugd2hvc2UgbGFzdCBieXRlIGxhbmRlZCBleGFjdGx5IGF0IHRoZSBlbmQKICBvZiB0aGUgQlVGU0laRS1sZW5ndGggYnVmZmVyIHdvdWxkIGJlIHRyZWF0ZWQgYXMgdGhlIHRlcm1pbmFsIHJlc3BvbnNlCiAgbGluZS4gIFRoZSBmb2xsb3dpbmcgcmVzcG9uc2UgY29kZSByZWFkIGluIHdvdWxkIHRoZW4gYWN0dWFsbHkgYmUgdGhlCiAgZW5kIG9mIHRoZSBwcmV2aW91cyByZXNwb25zZSBsaW5lLCBhbmQgYWxsIHJlc3BvbnNlcyBmcm9tIHRoZW4gb24gd291bGQKICBjb3JyZXNwb25kIHRvIHRoZSB3cm9uZyBjb21tYW5kLiBUZXN0IGNhc2UgMTA2MiB2ZXJpZmllcyB0aGlzLgoKLSBTdG9wIGNsb3NpbmcgYSBuZXZlci1vcGVuZWQgZnRwIHNvY2tldC4KCkRhbmllbCBTdGVuYmVyZyAoMTEgQXVnIDIwMDgpCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgZmlsZWQgYnVnIHJlcG9ydCAjMjA0MjQzMAogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjA0MjQzMCkgd2l0aCBhIHBhdGNoLiAiTlRMTSBXaW5kb3dzCiAgU1NQSSBjb2RlIGlzIG5vdCB0aHJlYWQgc2FmZSIuIFRoaXMgd2FzIGR1ZSB0byBsaWJjdXJsIHVzaW5nIHN0YXRpYwogIHZhcmlhYmxlcyB0byB0ZWxsIHdldGhlciB0byBsb2FkIHRoZSBuZWNlc3NhcnkgU1NQSSBETEwsIGJ1dCBub3cgdGhlIGxvYWRpbmcKICBoYXMgYmVlbiBtb3ZlZCB0byB0aGUgbW9yZSBzdWl0YWJsZSBjdXJsX2dsb2JhbF9pbml0KCkgY2FsbC4KCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgZmlsZWQgYnVnIHJlcG9ydCAjMjA0MjQ0MAogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjA0MjQ0MCkgd2l0aCBhIHBhdGNoLiBIZSBpZGVudGlmaWVkIGEKICBwcm9ibGVtIHdoZW4gdXNpbmcgTlRMTSBvdmVyIGEgcHJveHkgYnV0IHRoZSBlbmQtcG9pbnQgZG9lcyBCYXNpYywgYW5kIHRoZW4KICBsaWJjdXJsIHdvdWxkIGRvIHdyb25nIHdoZW4gdGhlIGhvc3Qgc2VudCAiQ29ubmVjdGlvbjogY2xvc2UiIGFzIHRoZSBwcm94eSdzCiAgTlRMTSBzdGF0ZSB3YXMgZXJyb25lb3VzbHkgY2xlYXJlZC4KCllhbmcgVHNlICgxMSBBdWcgMjAwOCkKLSBBZGRlZCBtaXNzaW5nIHNpZ25lZCBhbmQgdW5zaWduZWQgY3VybF9vZmZfdCBpbnRlZ2VyIGNvbnN0YW50IHN1ZmZpeGVzIGZvcgogIGludGVybmFsIGFuZCBleHRlcm5hbCB1c2UuIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QsIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVLgoKRGFuaWVsIEZhbmRyaWNoICg3IEF1ZyAyMDA4KQotIEZpeGVkIGFuIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgaW4gbXVsdGlfcnVuc2luZ2xlKCkgdGhhdCBjb3VsZCBjYXVzZSBhCiAgcmVxdWVzdCB0byBwcmVtYXR1cmVseSBlbmQuCgotIEFkZGVkIHRlc3QxMDU5IHRvIHRlc3QgdGhlIEZUUCBwcm94eSB0dW5uZWwgcHJvYmxlbSBmaXhlZCBKdWx5IDExLgoKWWFuZyBUc2UgKDcgQXVnIDIwMDgpCi0gQWRkZWQgY3VybGJ1aWxkLmggYW5kIGN1cmxydWxlcy5oIGhlYWRlciBmaWxlcyB0byBsaWJjdXJsJ3MgcHVibGljIGhlYWRlcnMuCiAgRmlsZSBjdXJsYnVpbGQuaCBpcyBhIGdlbmVyYXRlZCBmaWxlIG9uIGNvbmZpZ3VyZS1jYXBhYmxlIHN5c3RlbXMuIFRoaXMgaXMKICBhIGZpcnN0IHN0ZXAgdG93YXJkcyBjb25maWd1cmUtYmFzZWQgaW5mbyBpbiBwdWJsaWMgaGVhZGVycy4gQ3VycmVudGx5IG9ubHkKICB1c2VkIHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgYSBjdXJsX29mZl90IGRhdGEgdHlwZSB3aGljaCBpcyBub3QgZ2F0ZWQgdG8KICBvZmZfdC4gRnVydGhlciBkZXRhaWxzIGFyZSBkb2N1bWVudGVkIGluc2lkZSB0aGVzZSBtZW50aW9uZWQgaGVhZGVyIGZpbGVzLgoKLSBGaXggQ1VSTF9DSEVDS19ERUYgc28gdGhhdCB3aGVuIHRoZSBleHBhbnNpb24gb2YgdGhlIHByZXByb2Nlc3NvciBzeW1ib2wKICByZXN1bHRzIGluIGEgc2V0IG9mIGRvdWJsZS1xdW90ZWQgc3RyaW5ncywgdGhpcyBtYWNybyB3aWxsIG5vdyByZXR1cm4gYW4KICBleHBhbnNpb24gd2hpY2ggY29uc2lzdHMgb2YgYSBzaW5nbGUgZG91YmxlLXF1b3RlZCBzdHJpbmcgYXMgdGhlIHJlc3VsdCBvZgogIGNvbmNhdGVuYXRpbmcgYWxsIG9mIHRoZW0uCgotIFNraXAgZGF0YSB0eXBlIGNoZWNrIGluIERPX0NVUkxfT0ZGX1RfQ0hFQ0sgbWFjcm8gd2hlbiBhcmd1bWVudCBpcyBlbXB0eS4KCi0gQWRqdXN0ZWQgdGVzdGN1cmwucGwgdG8gY29weSBjaGVja2VkIG91dCBjdXJsYnVpbGQuaC5kaXN0IGFzIGN1cmxidWlsZC5oCiAgZm9yIG5vbi1jb25maWd1cmUgdGFyZ2V0cyB3aGVuIHRoZSBob3N0IHN5c3RlbSBkb2Vzbid0IHJ1biBidWlsZGNvbmYuYmF0LgoKLSBQcmV2ZW50IGJ1aWxkY29uZiBmcm9tIHJlbW92aW5nICdNYWtlZmlsZScgYW5kICdtaXNzaW5nJyBmaWxlcy4gVGhpcyB3b3VsZAogIGJsb3cgYXdheSBvdXIgQ1ZTIGNoZWNrZWQgZmlsZXMgJ21pc3NpbmcnIGFuZCAnaGlwZXIvTWFrZWZpbGUnLgoKLSBSZW1vdmUgYWRqdXN0bWVudCBkb25lIHRvIHRlc3RjdXJsLnBsIHRvIHZlcmlmeSBpZiBjaGFuZ2UgaW50cm9kdWNlZCBieQogIEd1ZW50ZXIgS25hdWYgaW4gbGliL01ha2VmaWxlLm5ldHdhcmUgaXMgZW5vdWdoIHRvIGdldCB0aGUgbmV0d2FyZSBhdXRvYnVpbGRzCiAgZ29pbmcgYWdhaW4uCgpZYW5nIFRzZSAoNSBBdWcgMjAwOCkKLSBDaGFuZ2VzIGRvbmUgdG8gYnVpbGRjb25mIHNjcmlwdC4gVmFsaWRhdGUgdGhhdCBhdXRvbTR0ZSBhbmQgYXV0b2NvbmYsIGFzCiAgd2VsbCBhcyBhY2xvY2FsIGFuZCBhdXRvbWFrZSwgdmVyc2lvbnMgbWF0Y2guIEltcHJvdmUgcmVtb3ZhbCBvZiBwcmV2aW91cwogIHJ1biBnZW5lcmF0ZWQgZmlsZXMuIFJlbW92ZSB2ZXJib3NlIGRlYnVnIGxvZ2dpbmcgb2YgYWNsb2NhbCBvbiBTb2xhcmlzLgoKRGFuaWVsIFN0ZW5iZXJnICg1IEF1ZyAyMDA4KQotIFllaG9zaHVhIEhlcnNoYmVyZyBmb3VuZCBhIHByb2JsZW0gdGhhdCB3b3VsZCBtYWtlIGxpYmN1cmwgcmUtdXNlIGEKICBjb25uZWN0aW9uIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBldmVuIGlmIGEgcHJldmlvdXMgdXNlIG9mIGl0IGNhdXNlZCBhCiAgQ1VSTEVfUEVFUl9GQUlMRURfVkVSSUZJQ0FUSU9OIHRvIGdldCByZXR1cm5lZC4gSSBub3cgbWFrZSBzdXJlIHRoYXQgZmFpbGVkCiAgU1NMIGNvbm5lY3Rpb25zIHByb3Blcmx5IGNsb3NlIHRoZSBjb25uZWN0aW9ucy4KCkRhbmllbCBTdGVuYmVyZyAoNCBBdWcgMjAwOCkKLSBUZXN0IGNhc2VzIDEwNTEsIDEwNTIgYW5kIDEwNTUgd2VyZSBhZGRlZCBieSBEYW5pZWwgRmFuZHJpY2ggb24gSnVseSAzMCBhbmQKICBwcm92ZWQgaG93IFBVVCBhbmQgUE9TVCB3aXRoIGEgcmVkaXJlY3QgY291bGQgbGVhZCB0byBhICJoYW5nIiBkdWUgdG8gdGhlCiAgZGF0YSBzdHJlYW0gbm90IGJlaW5nIHJld291bmQgcHJvcGVybHkgd2hlbiBpdCBoYWQgdG8gaW4gb3JkZXIgdG8gZ2V0IHNlbnQKICBwcm9wZXJseSAoYWdhaW4pIHRvIHRoZSBzdWJzZXF1ZW50IFVSTC4gVGhpcyBpcyBub3cgZml4ZWQgYW5kIHRoZXNlIHRlc3QKICBjYXNlcyBhcmUgbm8gbG9uZ2VyIGRpc2FibGVkLgoKWWFuZyBUc2UgKDQgQXVnIDIwMDgpCi0gQXV0b2NvbmYgMi42MiBoYXMgY2hhbmdlZCB0aGUgYmVoYXZpb3VyIG9mIHRoZSBBQ19BSVggbWFjcm8gd2hpY2ggd2UgdXNlLgogIFByaW9yIHZlcnNpb25zIG9mIGF1dG9jb25mIGRlZmluZWQgX0FMTF9TT1VSQ0UgaWYgX0FJWCB3YXMgZGVmaW5lZC4gMi42MgogIHZlcnNpb24gb2YgQUNfQUlYIGRlZmluZXMgX0FMTF9TT1VSQ0UgYW5kIG90aGVyIGZvdXIgcHJlcHJvY2Vzc29yIHN5bWJvbHMKICBubyBtYXR0ZXIgaWYgdGhlIHN5c3RlbSBpcyBBSVggb3Igbm90LiBUbyBrZWVwIHRoZSB0cmFkaXRpb25hbCBiZWhhdmlvdXIsCiAgYW5kIGFuIHVuaWZvcm0gb25lIGFjcm9zcyBhdXRvY29uZiB2ZXJzaW9ucyBBQ19BSVggaXMgcmVwbGFjZWQgd2l0aCBvdXIKICBvd24gaW50ZXJuYWwgbWFjcm8gQ1VSTF9DSEVDS19BSVhfQUxMX1NPVVJDRS4KCkRhbmllbCBTdGVuYmVyZyAoNCBBdWcgMjAwOCkKLSBUZXN0IGNhc2UgMTA0MSAoYWRkZWQgYnkgRGFuaWVsIEZhbmRyaWNoIEp1bHkgMTR0aCkgcHJvdmVkIGEgYnVnIHdoZXJlIFBVVAogIHdpdGggLUMgLSBzZW50IGdhcmJhZ2UgaW4gdGhlIENvbnRlbnQtUmFuZ2U6IGhlYWRlci4gSSBmaXhlZCB0aGlzIHByb2JsZW0gYnkKICBtYWtpbmcgc3VyZSBsaWJjdXJsIGFsd2F5cyBzZXRzIHRoZSBzaXplIG9mIHRoZSBfZW50aXJlXyB1cGxvYWQgaWYgYW4gYXBwCiAgYXR0ZW1wcyB0byBkbyByZXN1bWVkIHVwbG9hZHMgc2luY2UgbGliY3VybCBzaW1wbHkgY2Fubm90IGtub3cgdGhlIHNpemUgb2YKICB3aGF0IGlzIGN1cnJlbnRseSBhdCB0aGUgc2VydmVyIGVuZC4gVGVzdCAxMDQxIGlzIG5vIGxvbmdlciBkaXNhYmxlZC4KCllhbmcgVHNlICgyIEF1ZyAyMDA4KQotIE5vIGxvbmdlciB0ZXN0IGF2YWlsYWJpbGl0eSBvZiB0aGUgZ2RpMzIgbGlicmFyeSwgbm9yIHVzZSBpdCBmb3IgbGlua2luZywgZXZlbgogIHdoZW4gd2UgaGF2ZSBiZWVuIGRvaW5nIHRoaXMgc2luY2UgcmV2aXNpb24gMS40NyBvZiBjb25maWd1cmUuYWMgNCB5ZWFycyBhbmQKICA1IG1vbnRocyBhZ28gd2hlbiBjcm9zcy1jb21waWxpbmcgYSBXaW5kb3dzIHRhcmdldC4gV2UgYWN0dWFsbHkgZG9uJ3QgdXNlIGFueQogIGZ1bmN0aW9uIGZyb20gdGhlIFdpbmRvd3MgR0RJIChHcmFwaGljcyBEZXZpY2UgSW50ZXJmYWNlKSByZWxhdGVkIHdpdGggZHJhd2luZwogIG9yIGdyYXBoaWNzLXJlbGF0ZWQgb3BlcmF0aW9ucy4KCkRhbmllbCBGYW5kcmljaCAoMSBBdWcgMjAwOCkKLSBBZGRlZCBzdXBwb3J0IGZvciAtLWFwcGVuZCBvbiBTRlRQIHVwbG9hZHMuIFVuZm9ydHVuYXRlbHksIE9wZW5TU0ggZG9lc24ndAogIHN1cHBvcnQgdGhpcyBzbyBpdCBnb2VzIHVudGVzdGVkLgoKWWFuZyBUc2UgKDEgQXVnIDIwMDgpCi0gQ29uZmlndXJlIHByb2Nlc3Mgbm93IGNoZWNrcyBpZiB0aGUgcHJlcHJvY2Vzc29yIF9SRUVOVFJBTlQgc3ltYm9sIGlzIGFscmVhZHkKICBkZWZpbmVkLiBJZiBpdCBpc24ndCBjdXJyZW50bHkgZGVmaW5lZCBhIHNldCBvZiBjaGVja3MgYXJlIHBlcmZvcm1lZCB0byB0ZXN0CiAgaWYgaXRzIGRlZmluaXRpb24gaXMgcmVxdWlyZWQgdG8gbWFrZSB2aXNpYmxlIHRvIHRoZSBjb21waWxlciBhIHNldCBvZiAqX3IKICBmdW5jdGlvbnMuIEZpbmFsbHksIGlmIF9SRUVOVFJBTlQgaXMgYWxyZWFkeSBkZWZpbmVkIG9yIG5lZWRlZCBpdCB0YWtlcyBjYXJlCiAgb2YgbWFraW5nIGFkanVzdG1lbnRzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCBpdCBpcyBkZWZpbmVkIGVxdWFsbHkgZm9yIHRoZQogIGNvbmZpZ3VyZSBwcm9jZXNzIHRlc3RzIGFuZCBnZW5lcmF0ZWQgY29uZmlnIGZpbGUuCgotIFJlbW92ZWQgZGVmaW5pdGlvbiBvZiBDVVJMX0NIRUNLX1dPUktJTkdfUkVTT0xWRVIgZnJvbSBhY2luY2x1ZGUubTQgaXQgaGFzCiAgbm90IGJlZW4gaW4gdXNlIHNpbmNlIHJldmlzaW9uIDEuODEgb2YgY29uZmlndXJlLmluIDYgeWVhcnMsIDkgbW9udGhzIGFnby4KCkRhbmllbCBGYW5kcmljaCAoMzEgSnVsIDIwMDgpCi0gRml4ZWQgcGFyc2luZyBvZiBhbiBJUHY2IHByb3h5IGFkZHJlc3MgdG8gc3VwcG9ydCBhIHNjb3BlIGlkZW50aWZpZXIsCiAgYXMgd2VsbCBhcyBJUHY0IGFkZHJlc3NlcyBpbiBJUHY2IGZvcm1hdC4gQWxzbywgYmV0dGVyIGhhbmRsZSB0aGUgY2FzZQogIG9mIGEgbWFsZm9ybWF0dGVkIElQdjYgYWRkcmVzcyAoYXZvaWQgZW1wdHkgYW5kIE5VTEwgc3RyaW5ncykuCgotIEZpeGVkIGEgcHJvYmxlbSB3aXRoIGFueSBGVFAgVVJMIG9yIGFueSBVUkxzIGNvbnRhaW5pbmcgYW4gSVB2NiBhZGRyZXNzCiAgYmVpbmcgbWFuZ2xlZCB3aGVuIHBhc3NlZCB0byBwcm94aWVzIHdoZW4gQ1VSTE9QVF9QT1JUIGlzIGFsc28gc2V0CiAgKHJlcG9ydGVkIGJ5IFByYW1vZCBTaGFybWEpLgoKLSBVc2VyIG5hbWVzIGVtYmVkZGVkIGluIHByb3h5IFVSTHMgd2l0aG91dCBhIHBhc3N3b3JkIHdlcmUgcGFyc2VkCiAgaW5jb3JyZWN0bHktLXRoZSBob3N0IG5hbWUgaXMgdHJlYXRlZCBhcyBwYXJ0IG9mIHRoZSB1c2VyIG5hbWUgYW5kIHRoZQogIHBvcnQgbnVtYmVyIGJlY29tZXMgdGhlIHBhc3N3b3JkLiAgVGhpcyBjYW4gYmUgb2JzZXJ2ZWQgaW4gdGVzdCAyNzkKICAod2FzIEtOT1dOX0lTU1VFICM1NCkuCgpEYW5pZWwgU3RlbmJlcmcgKDMwIEp1bCAyMDA4KQotIFBoaWwgQmx1bmRlbGwgYWRkZWQgdGhlIENVUkxPUFRfQUREUkVTU19TQ09QRSBvcHRpb24sIGFzIHdlbGwgYXMgYWRqdXN0ZWQKICB0aGUgVVJMIHBhcnNlciB0byBhbGxvdyBudW1lcmljYWwgSVB2Ni1hZGRyZXNzZXMgdG8gYmUgc3BlY2lmaWVkIHdpdGggdGhlCiAgc2NvcGUgZ2l2ZW4sIGFzIHBlciBSRkM0MDA3IC0gd2l0aCBhIHBlcmNlbnQgbGV0dGVyIHRoYXQgaXRzZWxmIG5lZWRzIHRvIGJlCiAgVVJMIGVzY2FwZWQuIEZvciBleGFtcGxlLCBmb3IgYW4gYWRkcmVzcyBvZiBmZTgwOjoxMjM0JTEgdGhlIEhUVFAgVVJMIGlzOgogICJodHRwOi8vW2ZlODA6OjEyMzQlMjUxXS8iCgotIFBIUCdzIGJ1ZyByZXBvcnQgIzQzMTU4IChodHRwOi8vYnVncy5waHAubmV0L2J1Zy5waHA/aWQ9NDMxNTgpIGlkZW50aWZpZXMgYQogIHRydWUgYnVnIGluIGxpYmN1cmwgYnVpbHQgd2l0aCBPcGVuU1NMLiBJdCBtYWRlIGN1cmxfZWFzeV9nZXRpbmZvKCkgbW9yZSBvcgogIGxlc3MgYWx3YXlzIHJldHVybiAwIGZvciBDVVJMSU5GT19TU0xfVkVSSUZZUkVTVUxUIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIHRoYXQKICB3b3VsZCBzZXQgaXQgdG8gc29tZXRoaW5nIG5vbi16ZXJvIHdvdWxkIHJldHVybiBiZWZvcmUgdGhlIGFzc2lnbiBpbiBhbG1vc3QKICBhbGwgZXJyb3IgY2FzZXMuIFRoZSBpbnRlcm5hbCB2YXJpYWJsZSBpcyBub3cgc2V0IHRvIG5vbi16ZXJvIGZyb20gdGhlIHN0YXJ0CiAgb2YgdGhlIGZ1bmN0aW9uIG9ubHkgdG8gZ2V0IGNsZWFyZWQgbGF0ZXIgb24gaWYgdGhpbmdzIHdvcmsgb3V0IGZpbmUuCgotIE1hZGUgdGhlIGN1cmwgdG9vbCdzIC13IG9wdGlvbiBzdXBwb3J0IHRoZSAle3NzbF92ZXJpZnlfcmVzdWx0fSB2YXJpYWJsZQoKRGFuaWVsIEZhbmRyaWNoICgzMCBKdWwgMjAwOCkKLSBBZGRlZCB0ZXN0IGNhc2VzIDEwNTIgdGhyb3VnaCAxMDU1IHRvIHRlc3QgdXBsb2FkaW5nIGRhdGEgZnJvbSBmaWxlcwogIGR1cmluZyByZWRpcmVjdHMuICBUZXN0IGNhc2VzIDEwNTIgYW5kIDEwNTUgc2hvdyBwcm9ibGVtcyAobWF5YmUgdGhlIHNhbWUKICByb290IGNhdXNlIGFzIDEwNTEpIGFuZCBhcmUgZGlzYWJsZWQuCgotIEZpeGVkIGEgY291cGxlIG9mIGJ1ZmZlciBvdmVyZmxvd3MgaW4gdGhlIE1TLURPUyBwb3J0IG9mIHRoZSBjdXJsIHRvb2wuCgpEYW5pZWwgRmFuZHJpY2ggKDI5IEp1bCAyMDA4KQotIEZpeGVkIC0tdXNlLWFzY2lpIHRvIHByb3Blcmx5IGNvbnZlcnQgdGV4dCBmaWxlcyBvbiBTeW1iaWFuIE9TLCBNUy1ET1MKICBhbmQgT1MvMi4KCi0gQWRkZWQgdGVzdCBjYXNlIDEwNTEgdG8gdGVzdCBMb2NhdGlvbjogZm9sbG93aW5nIHdpdGggUFVULCBhcyByZXBvcnRlZAogIGJ5IEJlbiBTdXRjbGlmZmUuICBUaGUgdGVzdCB3aGVuIHJ1biBtYW51YWxseSBzaG93cyBhIHByb2JsZW0gaW4gY3VybAogIHNvIGl0J3MgZGlzYWJsZWQuCgpEYW5pZWwgRmFuZHJpY2ggKDI4IEp1bCAyMDA4KQotIEZpeGVkIGRpc3BsYXkgb2YgdGhlIGludGVyZmFjZSBiaW5kIGFkZHJlc3MgaW4gdGhlIHRyYWNlIG91dHB1dCB3aGVuIGl0J3MKICBhbiBJUHY2IGFkZHJlc3MuCgotIEFkZGVkIHRlc3QgY2FzZXMgMTA0NSB0aHJvdWdoIDEwNDkgYXMgc2ltcGxlIHRlc3RzIG9mIC0taW50ZXJmYWNlIHVzaW5nIHRoZQogIGxvY2FsaG9zdCBpbnRlcmZhY2UuCgotIEFkZGVkIHRlc3QgY2FzZSAxMDUwIHRvIHRlc3QgLS1mdHAtcG9ydCB3aXRoIGFuIElQdjYgYWRkcmVzcwoKRGFuaWVsIFN0ZW5iZXJnICgyNiBKdWwgMjAwOCkKLSBEYXZpZCBCYXUgZmlsZWQgYnVnIHJlcG9ydCAjMjAyNjI0MCAiQ1VSTF9SRUFERlVOQ19QQVVTRSBsZWFkcyB0byBidWZmZXIKICBvdmVycnVuIiAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIwMjYyNDApIGlkZW50aWZ5aW5nIHR3bwogIHByb2JsZW1zLCBhbmQgcHJvdmlkaW5nIHRoZSBmaXggZm9yIHRoZW06CgogIC0gQ1VSTF9SRUFERlVOQ19QQVVTRSBkaWQgaW4gZmFjdCBub3QgcGF1c2UgdGhlIF9zZW5kaW5nXyBvZiBkYXRhIHRoYXQgaXQgaXMKICAgIGRlc2lnbmVkIGZvciBidXQgcGF1c2VkIF9yZWNlaXZpbmdfIG9mIGRhdGEhCgogIC0gbGliY3VybCBkaWRuJ3QgaW50ZXJuYWxseSBzZXQgdGhlIHJlYWQgY291bnRlciB0byB6ZXJvIHdoZW4gdGhpcyByZXR1cm4KICAgIGNvZGUgd2FzIGRldGVjdGVkLCB3aGljaCB3b3VsZCBwb3RlbnRpYWxseSBsZWFkIHRvIGp1bmsgZ2V0dGluZyBzZW50IHRvCiAgICB0aGUgc2VydmVyLgoKRGFuaWVsIEZhbmRyaWNoICgyNiBKdWwgMjAwOCkKLSBBZGRlZCB0ZXN0IDEwNDQgdG8gdGVzdCBsYXJnZSBmaWxlIHN1cHBvcnQgaW4gZnRwIHdpdGggLUkuCgotIEVsaW1pbmF0ZSBhIHVubmVjZXNzYXJ5IHNvY2tldCBjcmVhdGlvbiBpbiBDdXJsX2dldGFkZHJpbmZvIGZvciBhbiBJUHY0CiAgYWRkcmVzcyBpbiBhbiBJUHY2IGNhcGFibGUgbGliY3VybC4KCi0gQWRkZWQgZmVhdHVyZSBpbiBydW50ZXN0cy5wbCB0byBzZWxlY3QgdGVzdHMgYmFzZWQgb24ga2V5IHdvcmQuCgpEYW5pZWwgRmFuZHJpY2ggKDIzIEp1bCAyMDA4KQotIENoYW5nZWQgdGhlIGxvbmcgbG9nZmlsZSBlbGlzaW9uIGNvZGUgaW4gcnVudGVzdHMucGwgdG8gcHJvcGVybHkgaGFuZGxlCiAgbGluZXMgZW5kaW5nIGluIFxyLgoKLSBDaGFuZ2VkIHJlZmVyZW5jZXMgdG8gVFJVRSBhbmQgRkFMU0UgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuIHBhZ2UgdG8KICAxIGFuZCB6ZXJvLCByZXNwZWN0aXZlbHksIHNpbmNlIFRSVUUgYW5kIEZBTFNFIGFyZW4ndCBwYXJ0IG9mIHRoZQogIGxpYmN1cmwgQVBJLgoKRGFuaWVsIFN0ZW5iZXJnICgyMyBKdWwgMjAwOCkKLSBJIHdlbnQgb3ZlciB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZSBhbmQgcmVwbGFjZWQgbW9zdCByZWZlcmVuY2VzIHRvCiAgbm9uLXplcm8gd2l0aCB0aGUgZml4ZWQgdmFsdWUgb2YgMS4gV2Ugc2hvdWxkIHN0cml2ZSBhdCBtYWtpbmcgb3B0aW9ucwogIHN1cHBvcnQgJzEnIGZvciBlbmFibGluZyB0aGVtIG1lbnRpb25lZCBleHBsaWNpdGx5LCBhcyB0aGF0IHRoZW4gd2lsbCBhbGxvdwogIHVzIGZvciB0byBleHRlbmQgdGhlbSBpbiB0aGUgZnV0dXJlIHdpdGhvdXQgYnJlYWtpbmcgb2xkZXIgcHJvZ3JhbXMuCgogIFBvc3NpYmx5IHdlIHNob3VsZCBldmVuIGludHJvZHVjZSBhIGZhbmN5IGRlZmluZSB0byB1c2UgaW5zdGVhZCBvZiAnMScgYWxsCiAgb3Zlci4uLgoKWWFuZyBUc2UgKDIxIEp1bCAyMDA4KQotIFVzZSB0aGUgc3JlYWRmcm9tKCkgd3JhcHBlciB0byByZXBsYWNlIHJlY3Zmcm9tKCkgaW4gb3VyIGNvZGUuCgpZYW5nIFRzZSAoMjAgSnVsIDIwMDgpCi0gd2hlbiByZWN2ZnJvbSBwcm90b3R5cGUgdXNlcyBhIHZvaWQgcG9pbnRlciBmb3IgYXJndW1lbnRzIDIsIDUgb3IgNiB0aGlzIHdpbGwKICBub3cgY2F1c2UgdGhlIGRlZmluaXRpb24sIGFzIGFwcHJvcHJpYXRlLCBvZiBSRUNWRlJPTV9UWVBFX0FSRzJfSVNfVk9JRCwKICBSRUNWRlJPTV9UWVBFX0FSRzVfSVNfVk9JRCBvciBSRUNWRlJPTV9UWVBFX0FSRzZfSVNfVk9JRC4KCllhbmcgVHNlICgxNyBKdWwgMjAwOCkKLSBSRUNWRlJPTV9UWVBFX0FSRzIsIFJFQ1ZGUk9NX1RZUEVfQVJHNSBhbmQgUkVDVkZST01fVFlQRV9BUkc2IGFyZSBub3cgZGVmaW5lZAogIHRvIHRoZSBkYXRhIHR5cGUgcG9pbnRlZCBieSBpdHMgcmVzcGVjdGl2ZSBhcmd1bWVudCBhbmQgbm90IHRoZSBwb2ludGVyIHR5cGUuCgpZYW5nIFRzZSAoMTYgSnVsIDIwMDgpCi0gQ29uZmlndXJlIHByb2Nlc3Mgbm93IGNoZWNrcyBhdmFpbGFiaWxpdHkgb2YgcmVjdmZyb20oKSBzb2NrZXQgZnVuY3Rpb24gYW5kCiAgZmluZHMgb3V0IGl0cyByZXR1cm4gdHlwZSBhbmQgdGhlIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIEFkZGVkIGRlZmluaXRpb25zCiAgZm9yIG5vbi1jb25maWd1cmUgc3lzdGVtcyBjb25maWcgZmlsZXMsIGFuZCBpbnRyb2R1Y2VkIG1hY3JvIHNyZWFkZnJvbSB3aGljaAogIHdpbGwgYmUgdXNlZCBvbiB1ZHAgc29ja2V0cyBhcyBhIHJlY3Zmcm9tKCkgd3JhcHBlci4KCllhbmcgVHNlICgxNSBKdWwgMjAwOCkKLSBBZGRlZCBkZXNjcmlwdGlvbi9jb21tZW50IHRvIGluY2x1ZGUgcGF0aHMgdXNlZCBpbiBzZXZlcmFsIE1ha2VmaWxlLmFtIGZpbGVzLgogIEFkZGVkIGF1dG9tYWtlIG9wdGlvbiBub3N0ZGluYyB0byB0ZXN0IHNlcnZlcnMgbWFrZWZpbGUgYW5kIG1vZGlmaWVkIGxpYmN1cmwKICBleHRlcm5hbCBoZWFkZXJzIGluY2x1ZGUgcGF0aCBmb3IgbGlidGVzdCBwcm9ncmFtcy4KCkRhbmllbCBGYW5kcmljaCAoMTQgSnVsIDIwMDgpCi0gQWRkZWQgdGVzdDEwNDAgdGhyb3VnaCB0ZXN0MTA0MyB0byB0ZXN0IC1DIC0gb24gSFRUUC4gVGVzdCAxMDQxIGZhaWxlZCBzbwogIGl0J3MgYWRkZWQgdG8gRElTQUJMRUQuCgpZYW5nIFRzZSAoMTQgSnVsIDIwMDgpCi0gSFRUUF9PTkxZIGRlZmluaXRpb24gY2hlY2sgaW4gbGliL3NldHVwLmggaXMgbm93IGRvbmUgb25jZSB0aGF0IGNvbmZpZ3VyYXRpb24KICBmaWxlIGhhcyBiZWVuIGluY2x1ZGVkLiBJbiB0aGlzIHdheSBpZiBzeW1ib2wgaXMgZGVmaW5lZCBpbiB0aGUgY29uZmlnIGZpbGUKICBpdCB3aWxsIG5vIGxvbmdlciBiZSBpZ25vcmVkLiAgUmVtb3ZlZCBpbmNsdXNpb24gb2YgcmVtYWluaW5nIHN5c3RlbSBoZWFkZXIKICBmaWxlcyBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZXMuIE1vdmVkIF9SRUVOVFJBTlQgZGVmaW5pdGlvbiB1cC9lYXJsaWVyIGluCiAgbGliL3NldHVwLmgKCllhbmcgVHNlICgxMSBKdWwgMjAwOCkKLSBBZGRlZCBtaXNzaW5nIG11bHRpcGxlIGhlYWRlciBpbmNsdXNpb24gcHJldmVudGlvbiBkZWZpbml0aW9uIGZvciBoZWFkZXIKICBmaWxlIGNvbnRlbnRfZW5jb2RpbmcuaAoKRGFuaWVsIEZhbmRyaWNoICgxMSBKdWwgMjAwOCkKLSBGaXhlZCB0ZXN0IDU1MyB0byBwYXNzIHRoZSB0b3J0dXJlIHRlc3QuCgpEYW5pZWwgU3RlbmJlcmcgKDExIEp1bCAyMDA4KQotIERhbmllbCBGYW5kcmljaCBmb3VuZCBvdXQgd2UgZGlkbid0IHBhc3Mgb24gdGhlIHVzZXItYWdlbnQgcHJvcGVybHkgd2hlbgogIGRvaW5nICJwcm94eS10dW5uZWxzIiB3aXRoIG5vbi1IVFRQIHByb3RvdG9scyBhbmQgdGhhdCB3YXMgc2ltcGx5IGJlY2F1c2UKICB0aGUgY29kZSBhc3N1bWVkIHRoZSB1c2VyLWFnZW50IHdhcyBvbmx5IG5lZWRlZCBmb3IgSFRUUC4KCkRhbmllbCBGYW5kcmljaCAoMTAgSnVsIDIwMDgpCi0gQ2hhbmdlZCBzbGlnaHRseSB0aGUgU0ZUUCBxdW90ZSBjb21tYW5kcyBjaG1vZCwgY2hvd24gYW5kIGNoZ3JwIHRvIG9ubHkKICBzZXQgdGhlIGF0dHJpYnV0ZSB0aGF0IGhhcyBjaGFuZ2VkIGluc3RlYWQgb2YgYWxsIHBvc3NpYmxlIG9uZXMuIEhvcGVmdWxseSwKICB0aGlzIHdpbGwgc29sdmUgdGhlICJQZXJtaXNzaW9uIGRlbmllZCIgcHJvYmxlbSB0aGF0IE5hZ2FyYWphbiBTcmVlbml2YXNhbgogIHJlcG9ydGVkIHdoZW4gc2V0dGluZyBzb21lIG1vZGVzLCBidXQgcmVnYXJkbGVzcywgaXQgc2F2ZXMgYSBwcm90b2NvbAogIHJvdW5kIHRyaXAgaW4gdGhlIGNobW9kIGNhc2UuCgotIEFkZGVkIHRlc3QgY2FzZXMgMTAzOCBhbmQgMTAzOSB0byB0ZXN0IEFkcmlhbiBLcmVoZXIncyByZXBvcnQgdGhhdCBmdHAKICB1cGxvYWRzIHdpdGggLUMgLSBkaWRuJ3QgcmVzdW1lIHByb3Blcmx5LCBidXQgdGhlIHRlc3RzIHBhc3MuCgpZYW5nIFRzZSAoMTAgSnVsIDIwMDgpCi0gUGV0ZXIgTGFtYmVyZyBmaWxlZCBidWcgcmVwb3J0ICMyMDE1MTI2OiAicG9sbCBnaXZlcyBXU0FFSU5WQUwgd2hlbiBQT0xMUFJJCiAgaXMgc2V0IGluIGZkc2V0LmV2ZW50cyIgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMDE1MTI2KSB3aGljaAogIGV4YWN0bHkgcGlucG9pbnRlZCB0aGUgcHJvYmxlbSBvbmx5IHRyaWdnZXJlZCBvbiBXaW5kb3dzIFZpc3RhLCBwcm92aWRlZAogIHJlZmVyZW5jZSB0byBkb2NzIGFuZCBhbHNvIGEgZml4LiBUaGVyZSBpcyBtdWNoIHdvcmsgYmVoaW5kIFBldGVyIExhbWJlcmcncwogIGV4Y2VsbGVudCBidWcgcmVwb3J0LiBUaGFuayBZb3UhCgpEYW5pZWwgRmFuZHJpY2ggKDkgSnVsIDIwMDgpCi0gQWRkZWQgdGVzdHMgMTAzNiBhbmQgMTAzNyB0byB2ZXJpZnkgcmVzdW1lZCBmdHAgZG93bmxvYWRzIHdpdGggLUMgLQoKRGFuaWVsIFN0ZW5iZXJnICg5IEp1bCAyMDA4KQotIEFuZHJlYXMgU2NodWxkZWkgaW1wcm92ZWQgUGhpbCBCbHVuZGVsbCdzIHBhdGNoIGZvciBJUHY2IHVzaW5nIGMtYXJlcywgYW5kIEkKICBlZGl0ZWQgaXQgc2xpZ2h0bHkuIE5vdyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIElQdjYgYWRkcmVzc2VzIGZpbmUgZXZlbgogIHdpdGggbGliY3VybCBidWlsdCB0byB1c2UgYy1hcmVzLgoKRGFuaWVsIEZhbmRyaWNoICg5IEp1bCAyMDA4KQotIEZpeGVkIGFuIE9PTSBoYW5kbGluZyBwcm9ibGVtIHRoYXQgY2F1c2UgdGVzdCAxMSB0byBmYWlsIHRoZSB0b3J0dXJlIHRlc3QuCgpEYW5pZWwgRmFuZHJpY2ggKDggSnVsIDIwMDgpCi0gRml4ZWQgdGVzdCA1NTQgdG8gcGFzcyB0aGUgdG9ydHVyZSB0ZXN0LgoKRGFuaWVsIEZhbmRyaWNoICg3IEp1bCAyMDA4KQotIEFkZGVkIHRlc3QgY2FzZXMgMTAzNCAmIDEwMzUgdG8gdGVzdCBJRE4gbmFtZSBjb252ZXJzaW9uIGZhaWx1cmVzLgoKRGFuaWVsIFN0ZW5iZXJnICg3IEp1bCAyMDA4KQotIFNjb3R0IEJhcnJldHQgcHJvdmlkZWQgYSB0ZXN0IGNhc2UgZm9yIGEgc2VnZmF1bHQgaW4gdGhlIEZUUCBjb2RlIGFuZCB0aGUKICBmaXggZm9yIGl0LiBJdCBvY2N1cmVkIHdoZW4geW91IGRpZCBhIEZUUCB0cmFuc2ZlciB1c2luZwogIENVUkxGVFBNRVRIT0RfU0lOR0xFQ1dEIGFuZCB0aGVuIGRpZCBhbm90aGVyIG9uZSBvbiB0aGUgc2FtZSBlYXN5IGhhbmRsZSBidXQKICBzd2l0Y2hlZCB0byBDVVJMRlRQTUVUSE9EX05PQ1dELiBEdWUgdG8gdGhlICJkaXIgZGVwdGgiIHZhcmlhYmxlIG5vdCBiZWluZwogIGNsZWFyZWQgcHJvcGVybHkuICBTY290dCdzIHRlc3QgY2FzZSBpcyBub3cga25vd24gYXMgdGVzdCA1MzkgYW5kIGl0CiAgdmVyaWZpZXMgdGhlIGZpeC4KCkRhbmllbCBTdGVuYmVyZyAoMyBKdWwgMjAwOCkKLSBQaGlsIEJsdW5kZWxsIHByb3ZpZGVkIGEgZml4IGZvciBsaWJjdXJsJ3MgdHJlYXRtZW50IG9mIHVuZXhwZWN0ZWQgMXh4CiAgcmVzcG9uc2UgY29kZXMuIFByZXZpb3VzbHkgbGliY3VybCB3b3VsZCBoYW5nIG9uIHN1Y2ggb2NjdXJhbmNlcy4gSSBhZGRlZAogIHRlc3QgY2FzZSAxMDMzIHRvIHZlcmlmeS4KCi0gSW50cm9jdWRpbmcgYSBuZXcgdGltZXN0YW1wIGZvciBjdXJsX2Vhc3lfZ2V0aW5mbygpOgogIENVUkxJTkZPX0FQUENPTk5FQ1RfVElNRS4gVGhpcyBpcyBzZXQgd2l0aCB0aGUgImFwcGxpY2F0aW9uIGxheWVyIgogIGhhbmRzaGFrZS9jb25uZWN0aW9uIGlzIGNvbXBsZXRlZC4gV2hpY2ggdHlwaWNhbGx5IGlzIFNTTCwgVExTIG9yIFNTSCBhbmQgYnkKICB1c2luZyB0aGlzIHlvdSBjYW4gZmlndXJlIG91dCB0aGUgYXBwbGljYXRpb24gbGF5ZXIncyBvd24gY29ubmVjdCB0aW1lLiBZb3UKICBjYW4gZXh0cmFjdCB0aGUgdGltZSBzdGFtcCB1c2luZyBjdXJsJ3MgLXcgb3B0aW9uIGFuZCB0aGUgbmV3IHZhcmlhYmxlIG5hbWVkCiAgJ3RpbWVfYXBwY29ubmVjdCcuIFRoaXMgZmVhdHVyZSB3YXMgc3BvbnNvcmVkIGJ5IExlbm55IFJhY2hpdHNreSBhdCBOZXVTdGFyLgoKRGFuaWVsIEZhbmRyaWNoICgyIEp1bCAyMDA4KQotIFN1cHBvcnQgT3BlbiBXYXRjb20gQyBvbiBMaW51eCAoYXMgd2VsbCBhcyBXaW5kb3dzKS4KCllhbmcgVHNlICgyIEp1bCAyMDA4KQotIFRoZSBwcmV2aW91c2x5IGNvbW1pdHRlZCBmaXggZm9yIGJ1ZyByZXBvcnQgIzE5OTkxODEgcHJldmVudGVkIHVzaW5nIHRoZQogIG1vbm90b25pYyBjbG9jayBvbiBhbnkgc3lzdGVtIHdpdGhvdXQgYW4gYWx3YXlzIHN1cHBvcnRlZCBQT1NJWCBjb21wbGlhbnQKICBpbXBsZW1lbnRhdGlvbi4gTm93IHRoZSBQT1NJWCBjb21wbGlhbnQgY29uZmlndXJhdGlvbiBjaGVjayBpcyByZW1vdmVkIGFuZAogIHdpbGwgZmFsbGJhY2sgdG8gZ2V0dGltZW9mZGF5IHdoZW4gdGhlIG1vbm90b25pYyBjbG9jayBpcyB1bmF2YWlsYWJsZSBhdAogIHJ1bi10aW1lLgoKLSBUaGUgY29uZmlndXJlIHByb2Nlc3Mgd2lsbCBub3cgaGFsdCB3aGVuIHNlZCwgZ3JlcCwgZWdyZXAgb3IgYXIgcHJvZ3JhbXMKICBjYW4gbm90IGJlIGZvdW5kIGFtb25nIHRoZSBkaXJlY3RvcmllcyBpbiBQQVRIIHZhcmlhYmxlLgoKRGFuaWVsIFN0ZW5iZXJnICgxIEp1bCAyMDA4KQotIFJvbGxhbmQgRHVkZW1haW5lIHByb3ZpZGVkIGZpeGVzIHRvIGdldCBsaWJjdXJsIHRvIGJ1aWxkIGZvciB0aGUgSU5URUdSSVRZCiAgb3BlcmF0aW5nIHN5c3RlbS4KCkRhbmllbCBTdGVuYmVyZyAoMzAgSnVuIDIwMDgpCi0gTWFkZSB0aGUgaW50ZXJuYWwgcHJpbnRmKCkgc3VwcG9ydCAlbGx1IHByb3Blcmx5IHRvIHByaW50IHVuc2lnbmVkIGxvbmcgbG9uZ3MuCgotIFN0ZXBoZW4gQ29sbHllciBhbmQgVG9yIEFybnRzZW4gaGVscGVkIGlkZW50aWZ5IGEgZmxhdyBpbiB0aGUgcmFuZ2UgY29kZQogIHdoaWNoIG91dHB1dCB0aGUgcmFuZ2UgdXNpbmcgYSBzaWduZWQgdmFyaWFibGUgd2hlcmUgaXQgc2hvdWxkIHJhdGhlciB1c2UKICB1bnNpZ25lZC4KCllhbmcgVHNlICgyOSBKdW4gMjAwOCkKLSBKb2huIExpZ2h0c2V5IGZpbGVkIGJ1ZyByZXBvcnQgIzE5OTkxODE6ICJDTE9DS19NT05PVE9OSUMgYWx3YXlzIGZhaWxzIG9uCiAgc29tZSBzeXN0ZW1zIiAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE5OTkxODEpLiBUaGUgcHJvYmxlbSB3YXMKICB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGRpZCBub3QgdXNlIHRoZSBfUE9TSVhfTU9OT1RPTklDX0NMT0NLIGZlYXR1cmUgdGVzdAogIG1hY3JvIHdoZW4gY2hlY2tpbmcgbW9ub3RvbmljIGNsb2NrIGF2YWlsYWJpbGl0eS4gVGhpcyBpcyBub3cgZml4ZWQgYW5kIHRoZQogIG1vbm90b25pYyBjbG9jayB3aWxsIG5vdCBiZSB1c2VkIHVubGVzcyB0aGUgZmVhdHVyZSB0ZXN0IG1hY3JvIGlzIGRlZmluZWQKICB3aXRoIGEgdmFsdWUgZ3JlYXRlciB0aGFuIHplcm8gaW5kaWNhdGluZyBhbHdheXMgc3VwcG9ydGVkLgoKRGFuaWVsIEZhbmRyaWNoICgyNSBKdW4gMjAwOCkKLSBIb25vdXIgLS1zdGRlcnIgd2l0aCB0aGUgLXYgb3B0aW9uLgoKLSBGaXhlZCBhIGZpbGUgaGFuZGxlIGxlYWsgaW4gdGhlIGNvbW1hbmQgbGluZSBjbGllbnQgaWYgbW9yZSB0aGFuIG9uZQogIC0tc3RkZXJyIG9wdGlvbiB3YXMgZ2l2ZW4uCgpEYW5pZWwgU3RlbmJlcmcgKDIyIEp1biAyMDA4KQotIEVkdWFyZCBCbG9jaCBmaWxlZCB0aGUgZGViaWFuIGJ1ZyByZXBvcnQgIzQ4NzU2NwogIChodHRwczovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTQ4NzU2NykgcG9pbnRpbmcgb3V0IHRoYXQKICBsaWJjdXJsIHVzZWQgQ29udGVudC1SYW5nZTogaW5zdGVhZCBvZiBSYW5nZSB3aGVuIGRvaW5nIGEgcmFuZ2UgcmVxdWVzdCB3aXRoCiAgLS1oZWFkIChDVVJMT1BUX05PQk9EWSkuIFRoaXMgaXMgbm93IGZpeGVkIGFuZCB0ZXN0IGNhc2UgMTAzMiB3YXMgYWRkZWQgdG8KICB2ZXJpZnkuCgpEYW5pZWwgRmFuZHJpY2ggKDIxIEp1biAyMDA4KQotIFN0b3BwZWQgdXNpbmcgcmFuZ2VzIGluIHNjYW5mIGNoYXJhY3RlciBzZXF1ZW5jZXMgKGUuZy4gJVthLXpdKSBzaW5jZSB0aGF0CiAgaXMgbm90IEFOU0kgQywganVzdCBhIGNvbW1vbiBleHRlbnNpb24uICBUaGlzIGNhdXNlZCBwcm9ibGVtcyBvbgogIGF0IGxlYXN0IE9wZW4gV2F0Y29tIEMuCgpZYW5nIFRzZSAoMjAgSnVuIDIwMDgpCi0gTW9kaWZpZWQgY29uZmlndXJhdGlvbiBzY3JpcHQgdG8gYWN0dWFsbHkgdmVyaWZ5IGlmIHRoZSBjb21waWxlciBpcyBnb29kCiAgZW5vdWdoIGF0IGRldGVjdGluZyBjb21waWxhdGlvbiBlcnJvcnMgb3IgYXQgbGVhc3QgaXQgaGFzIGJlZW4gcHJvcGVybHkKICBjb25maWd1cmVkIHRvIGRvIHNvLiBDb25maWd1cmF0aW9uIGhlYXZpbHkgZGVwZW5kcyBvbiB0aGlzIGNhcGFiaWxpdHksIHNvCiAgaWYgdGhpcyBjb21waWxlciBzYW5pdHkgY2hlY2sgZmFpbHMgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VzcyB3aWxsIG5vdyBmYWlsLgoKRGFuaWVsIFN0ZW5iZXJnICgyMCBKdW4gMjAwOCkKLSBQaGlsIFBlbGxvdWNob3VkIGZvdW5kIGEgY2FzZSB3aGVyZSBsaWJjdXJsIGJ1aWx0IHdpdGggTlNTIGZhaWxlZCB0bwogIGhhbmRzaGFrZSB3aXRoIGEgU1NMdjIgc2VydmVyLCBhbmQgaXQgdHVybmVkIG91dCB0byBiZSBiZWNhdXNlIGl0IGRpZG4ndAogIHJlY29nbml6ZSB0aGUgY2lwaGVyIG5hbWVkICJyYzQtbWQ1Ii4gSW4gb3VyIGxpc3QgdGhhdCBjaXBoZXIgd2FzIG5hbWVkCiAgcGxhaW5seSAicmM0Ii4gSSd2ZSBub3cgYWRkZWQgcmM0LW1kNSB0byB3b3JrIGFzIGFuIGFsaWFzIGFzIFBoaWwgcmVwb3J0ZWQKICB0aGF0IGl0IG1hZGUgdGhpbmdzIHdvcmsgZm9yIGhpbSBhZ2Fpbi4KCi0gSGFucy1KdXJnZW4gTWF5IHBvaW50ZWQgb3V0IHRoYXQgdHJ5aW5nIFNDUCBvciBTRlRQIG92ZXIgYSBTT0NLUyBwcm94eQogIGNyYXNoZWQgbGliY3VybC4gVGhpcyBpcyBub3cgYWRkcmVzc2VkIGJ5IG1ha2luZyBzdXJlIHdlIHVzZSAicGxhaW4gc2VuZCIKICBpbnRlcm5hbGx5IHdoZW4gZG9pbmcgdGhlIHNvY2tzIGhhbmRzaGFrZSBpbnN0ZWFkIG9mIHRoZSBDdXJsX3dyaXRlKCkKICBmdW5jdGlvbiB3aGljaCBpcyBkZXNpZ25lZCB0byB1c2UgdGhlICJ0YXJnZXQiIHByb3RvY29sLiBUaGF0J3MgdGhlbiBTQ1Agb3IKICBTRlRQIGluIHRoaXMgY2FzZS4gSSBhbHNvIHRvb2sgdGhlIG9wcG9ydHVuaXR5IGFuZCBjbGVhbmVkIHVwIHNvbWUgc3NoLQogIHJlbGF0ZWQgI2lmZGVmcyBpbiB0aGUgY29kZSBmb3IgcmVhZGFiaWxpdHkuCgpEYW5pZWwgU3RlbmJlcmcgKDE5IEp1biAyMDA4KQotIENocmlzdG9waGVyIFBhbG93IGZpeGVkIGEgY3VybF9tdWx0aV9zb2NrZXQoKSBpc3N1ZSB3aGljaCBwcmV2aW91c2x5IGNhdXNlZAogIGxpYmN1cmwgdG8gbm90IHRlbGwgdGhlIGFwcCBwcm9wZXJseSB3aGVuIGEgc29ja2V0IHdhcyBjbG9zZWQgKHdoZW4gdGhlIG5hbWUKICByZXNvbHZlIGRvbmUgYnkgYy1hcmVzIGlzIGNvbXBsZXRlZCkgYW5kIHRoZW4gaW1tZWRpYXRlbHkgcmUtY3JlYXRlZCBhbmQgcHV0CiAgdG8gdXNlIGFnYWluIChmb3IgdGhlIGFjdHVhbCBjb25uZWN0aW9uKS4gU2luY2UgdGhlIGNsb3N1cmUgd2lsbCBtYWtlIHRoZQogICJ3YXRjaCBzdGF0dXMiIGdldCBsb3N0IGluIHNldmVyYWwgZXZlbnQtYmFzZWQgc3lzdGVtcyBsaWJjdXJsIHdpbGwgbmVlZCB0bwogIHRlbGwgdGhlIGFwcCBhYm91dCB0aGlzIGNsb3NlL3JlLWNyZWF0ZSBjYXNlLgoKLSBEZW5nbWlud2VuIGZvdW5kIGEgYnVnIGluIHRoZSBjb25uZWN0aW9uIHJlLXVzZSBmdW5jdGlvbiB3aGVuIHVzaW5nIHRoZQogIG11bHRpIGludGVyZmFjZSB3aXRoIHBpcGVsaW5pbmcgZW5hYmxlZCBhcyBpdCB3b3VsZCB3cm9uZ2x5IGNoZWNrIGZvciwKICBkZXRlY3QgYW5kIGNsb3NlICJkZWFkIGNvbm5lY3Rpb25zIiBldmVuIHRob3VnaCB0aGF0IGNvbm5lY3Rpb24gd2FzIGFscmVhZHkKICBpbiB1c2UhCgpEYW5pZWwgRmFuZHJpY2ggKDE4IEp1biAyMDA4KQotIEFkZGVkIFNTSCBmYWlsdXJlIHRlc3QgY2FzZXMgNjI4LTYzMgoKLSBGaXhlZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBjb21tYW5kLWxpbmUgdG9vbCB0aGF0IGNhdXNlZCBhIHZhbGdyaW5kIGVycm9yLgoKRGFuaWVsIFN0ZW5iZXJnICgxOCBKdW4gMjAwOCkKLSBSb2IgQ3JpdHRlbmRlbiBicm91Z2h0IGEgZml4IGZvciB0aGUgTlNTIGxheWVyIHRoYXQgbWFrZXMgbGliY3VybCBubyBsb25nZXIKICBhbHdheXMgZmlyZSB1cCBhIG5ldyBjb25uZWN0aW9uIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBleGlzdGluZyBvbmUgd2hlbiB0aGUKICBtdWx0aSBpbnRlcmZhY2UgaXMgdXNlZC4gT3JpZ2luYWwgYnVnIHJlcG9ydDoKICBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTQ1MDE0MAoKWWFuZyBUc2UgKDE4IEp1biAyMDA4KQotIEludGVybmFsIGNvbmZpZ3VyZSBzY3JpcHQgaW1wcm92ZW1lbnQuIE5vIGxvbmdlciBicmVhayBvdXQgb2Ygc2hlbGwgImZvciIKICBzdGF0ZW1lbnRzIGZyb20gaW5zaWRlIEFDX0ZPT19JRkVMU0UgbWFjcm9zLCBvdGhlcndpc2UgdGVtcG9yYXJ5IG1hY3JvIGZpbGVzCiAgYXJlIG5vdCBwcm9wZXJseSByZW1vdmVkLgoKRGFuaWVsIEZhbmRyaWNoICgxMiBKdW4gMjAwOCkKLSBGaXhlZCBjdXJsLWNvbmZpZyAtLWNhIHdoaWNoIHdhc24ndCBiZWluZyBleHBvcnRlZCBieSBjb25maWd1cmUuCgpEYW5pZWwgU3RlbmJlcmcgKDExIEp1biAyMDA4KQotIEkgZGlkIGEgY2xlYW51cCBvZiB0aGUgaW50ZXJuYWwgZ2VuZXJpYyBTU0wgbGF5ZXIgYW5kIGhvdyB0aGUgdmFyaW91cyBTU0wKICBsaWJyYXJpZXMgYXJlIHN1cHBvcnRlZC4gU3RhcnRpbmcgbm93LCBlYWNoIHVuZGVybHlpbmcgU1NMIGxpYnJhcnkgc3VwcG9ydAogIGNvZGUgZG9lcyBhIHNldCBvZiBkZWZpbmVzIGZvciB0aGUgMTYgZnVuY3Rpb25zIHRoZSBnZW5lcmljIGxheWVyIChzc2xnZW4uYykKICB1c2VzIChhbGwgdGhlc2UgbmV3IGZ1bmN0aW9uIGRlZmluZXMgdXNlIHRoZSBwcmVmaXggImN1cmxzc2xfIikuIFRoaXMKICBncmVhdGx5IHNpbXBsaWZpZWQgdGhlIGdlbmVyaWMgbGF5ZXIgaW4gcmVhZGFiaWxpdHkgYnkgaW52b2x2aW5nIG11Y2ggbGVzcwogICNpZmRlZnMgYW5kIG90aGVyIHByZXByb2Nlc3NvciBzdHVmZiBhbmQgc2hvdWxkIG1ha2UgaXQgZWFzaWVyIGZvciBwZW9wbGUgdG8KICBtYWtlIGxpYmN1cmwgd29yayB3aXRoIG5ldyBTU0wgbGlicmFyaWVzLgoKICBIb3BlZnVsbHkgSSBjYW4gbGF0ZXIgb24gZG9jdW1lbnQgdGhlc2UgMTYgZnVuY3Rpb25zIHNvbWV3aGF0IGFzIHdlbGwuCgogIEkgYWxzbyBtYWRlIG1vc3Qgb2YgdGhlIGludGVybmFsIFNTTC1kZXBlbmRlbnQgZnVuY3Rpb25zICh1c2luZyBDdXJsX3NzbF8KICBwcmVmaXgpICNkZWZpbmVkIHRvIG5vdGhpbmcgd2hlbiBubyBTU0wgc3VwcG9ydCBpcyByZXF1ZXN0ZWQgLSBwcmV2aW91c2x5CiAgdGhleSB3b3VsZCB1bm5lY2Vzc2FyaWx5IGNhbGwgbW9zdGx5IGVtcHR5IGZ1bmN0aW9ucy4KCiAgSSd2ZSBidWlsdCBsaWJjdXJsIHdpdGggT3BlblNTTCBhbmQgR251VExTIGFuZCB3aXRob3V0IFNTTCB0byB0ZXN0IHRoaXMgYW5kCiAgSSd2ZSBhbHNvIHRyaWVkIGJ1aWxkaW5nIHdpdGggTlNTIGJ1dCB0aGUgTlNTIHN1cHBvcnQgaXMgYSBteXN0ZXJ5IHRvIG1lIGFuZAogIEkgZmFpbGVkIHRvIGJ1aWxkIGxpYmN1cmwgd2l0aCB0aGUgTlNTIGxpYnJhcmllcyBJIGhhdmUgaW5zdGFsbGVkLiBXZSByZWFsbHkKICBzaG91bGQgQSkgaW1wcm92ZSBvdXIgY29uZmlndXJlIHNjcmlwdCB0byBkZXRlY3QgdW5zdWl0YWJsZSBOU1MgdmVyc2lvbnMKICBhbHJlYWR5IGF0IGNvbmZpZ3VyZSB0aW1lIGFuZCBCKSBkb2N1bWVudCBvdXIgcmVxdWlyZW1lbnRzIGJldHRlciBmb3IgdGhlCiAgU1NMIGxpYnJhcmllcy4KCkRhbmllbCBTdGVuYmVyZyAoMTAgSnVuIDIwMDgpCi0gSSBtYWRlIHRoZSBPcGVuU1NMIGNvZGUgYnVpbGQgYWdhaW4gd2l0aCBPcGVuU1NMIDAuOS42LiBUaGUgQ1JMRklMRQogIGZ1bmN0aW9uYWxpdHkga2lsbGVkIGl0IGR1ZSB0byBpdHMgdW5jb25kaXRpb25hbCB1c2Ugb2YKICBYNTA5X1NUT1JFX3NldF9mbGFncy4uLgoKRGFuaWVsIFN0ZW5iZXJnICg4IEp1biAyMDA4KQotIER1ZSB0byB0aGUgdGhyZWUgbmV3IGxpYmN1cmwgY2hhbmdlcyBhbmQgdGhlIG1hc3NpdmUgY29tbWFuZCBsaW5lIG9wdGlvbgogIGNoYW5nZSBJIGRlY2lkZWQgd2UnbGwgbWFyayBpdCBieSBidW1waW5nIHRoZSBuZXh0IHJlbGVhc2UgbnVtYmVyIHRvIDcuMTkuMCEKCi0gY3VybCB0aGUgdG9vbCBub3cgZGVhbHMgd2l0aCBpdHMgY29tbWFuZCBsaW5lIG9wdGlvbnMgc29tZXdoYXQgZGlmZmVyZW50bHkhCiAgQWxsIGJvb2xlYW4gb3B0aW9ucyAoc3VjaCBhcyAtTywgLUksIC12IGV0YyksIGJvdGggc2hvcnQgYW5kIGxvbmcgdmVyc2lvbnMsCiAgbm93IGFsd2F5cyBzd2l0Y2ggb24vZW5hYmxlIHRoZSBvcHRpb24gbmFtZWQuIFVzaW5nIHRoZSBzYW1lIG9wdGlvbiBtdWx0aXBsZQogIHRpbWVzIHRodXMgbWFrZSBubyBkaWZmZXJlbmNlLiBUbyBzd2l0Y2ggb2ZmIG9uZSBvZiB0aG9zZSBvcHRpb25zLCB5b3UgbmVlZAogIHRvIHVzZSB0aGUgbG9uZyB2ZXJzaW9uIG9mIHRoZSBvcHRpb24gYW5kIHR5cGUgLS1uby1PUFRJT04uIExpa2UgdG8gZGlzYWJsZQogIHZlcmJvc2UgbW9kZSB5b3UgdXNlIC0tbm8tdmVyYm9zZSEKCi0gQWRkZWQgLS1yZW1vdGUtbmFtZS1hbGwgdG8gY3VybCwgd2hpY2ggaWYgdXNlZCBjaGFuZ2VzIHRoZSBkZWZhdWx0IGZvciBhbGwKICBnaXZlbiBVUkxzIHRvIGJlIGRlYWx0IHdpdGggYXMgaWYgLU8gaXMgdXNlZC4gU28gaWYgeW91IHdhbnQgdG8gZGlzYWJsZSB0aGF0CiAgZm9yIGEgc3BlY2lmaWMgVVJMIGFmdGVyIC0tcmVtb3RlLW5hbWUtYWxsIGhhcyBiZWVuIHVzZWQsIHlvdSBtdXNlIHVzZSAtbyAtCiAgb3IgLS1uby1yZW1vdGUtbmFtZS4KCkRhbmllbCBTdGVuYmVyZyAoNiBKdW4gMjAwOCkKLSBBeGVsIFRpbGxlcXVpbiBhbmQgQXJuYXVkIEViYWxhcmQgYWRkZWQgc3VwcG9ydCBmb3IgQ1VSTE9QVF9JU1NVRVJDRVJULCBmb3IKICBPcGVuU1NMLCBOU1MgYW5kIEdudVRMUy1idWlsdCBsaWJjdXJscy4KCi0gQXhlbCBUaWxsZXF1aW4gYW5kIEFybmF1ZCBFYmFsYXJkIGFkZGVkIHN1cHBvcnQgZm9yIENVUkxPUFRfQ1JMRklMRSwgZm9yCiAgT3BlblNTTCwgTlNTIGFuZCBHbnVUTFMtYnVpbHQgbGliY3VybHMuCgotIEFkZGVkIENVUkxJTkZPX1BSSU1BUllfSVAgYXMgYSBuZXcgaW5mb3JtYXRpb24gcmV0cmlldmFibGUgd2l0aAogIGN1cmxfZWFzeV9nZXRpbmZvLiBJdCByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZyB3aXRoIHRoZSBtb3N0IHJlY2VudGx5CiAgdXNlZCBJUCBhZGRyZXNzLiBNb2RpZmllZCB0ZXN0IGNhc2UgNTAwIHRvIGFsc28gdmVyaWZ5IHRoaXMgZmVhdHVyZS4gVGhlCiAgaW1wbGVtZW50aW5nIG9mIHRoaXMgZmVhdHVyZSB3YXMgc3BvbnNvcmVkIGJ5IExlbm55IFJhY2hpdHNreSBhdCBOZXVTdGFyLgoKVmVyc2lvbiA3LjE4LjIgKDQgSnVuZSAyMDA4KQoKRGFuaWVsIEZhbmRyaWNoICgzIEp1biAyMDA4KQotIEZpeGVkIGEgcHJvYmxlbSB3aGVyZSB0ZWxuZXQgZGF0YSB3b3VsZCBiZSBsb3N0IGlmIGFuIEVXT1VMREJMT0NLCiAgY29uZGl0aW9uIHdlcmUgZW5jb3VudGVyZWQuCgpNYXJ0eSBLdWhydCAoMSBKdW4gMjAwOCkKLSBVcGRhdGVkIG1haW4uYyB0byByZXR1cm4gQ1VSTEVfT0sgaWYgUEFSQU1fSEVMUF9SRVFVRVNURUQgd2FzIHJldHVybmVkCiAgZnJvbSBnZXRwYXJhbWV0ZXIgaW5zdGVhZCBvZiBDVVJMRV9GQUlMRURfSU5JVC4gIE5vIHBvaW50IGluIHJldHVybmluZwogIGFuIGVycm9yIGlmIC0taGVscCBvciAtLXZlcnNpb24gd2VyZSByZXF1ZXN0ZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDI4IE1heSAyMDA4KQotIEVtaWwgUm9tYW51cyBmb3VuZCBhIHByb2JsZW0gYW5kIGhlbHBlZCBtZSByZXBlYXQgaXQuIEl0IG9jY3VyZWQgd2hlbiB1c2luZwogIHRoZSBjdXJsX211bHRpX3NvY2tldCgpIEFQSSB3aXRoIEhUVFAgcGlwZWxpbmluZyBlbmFibGVkIGFuZCBjb3VsZCBsZWFkIHRvCiAgdGhlIHBpcGVsaW5lIGJhc2ljYWxseSBzdGFsbGluZyBmb3IgYSB2ZXJ5IGxvbmcgcGVyaW9kIG9mIHRpbWUgdW50aWwgaXQgdG9vawogIG9mZiBhZ2Fpbi4KCi0gSmVmZiBXZWJlciByZXBvcnRlZCBtZW1vcnkgbGVha3Mgd2l0aCBhYm9ydGVkIFNDUCBhbmQgU0ZUUCB0cmFuc2ZlcnMgYW5kCiAgcHJvdmlkZWQgZXhjZWxsZW50IHJlcGVhdCByZWNpcGVzLiBJIGZpeGVkIHRoZSBjYXNlcyBJIG1hbmFnZWQgdG8gcmVwcm9kdWNlCiAgYnV0IEplZmYgc3RpbGwgZ290IHNvbWUgKFNDUCkgcHJvYmxlbXMgZXZlbiBhZnRlciB0aGVzZSBmaXhlczoKICBodHRwczovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA4LTA1LzAzNDIuaHRtbAoKRGFuaWVsIFN0ZW5iZXJnICgyNiBNYXkgMjAwOCkKLSBCdWcgcmVwb3J0ICMxOTczMzUyIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTk3MzM1MikgaWRlbnRpZmllZAogIGhvdyB0aGUgSFRUUCByZWRpcmVjdCBmb2xsb3dpbmcgY29kZSBkaWRuJ3QgcHJvcGVybHkgZm9sbG93IHRvIGEgbmV3IFVSTCBpZgogIHRoZSBuZXcgdXJsIHdhcyBidXQgYSBxdWVyeSBzdHJpbmcgc3VjaCBhcyAiTG9jYXRpb246ID9tb289Zm9vIi4gVGVzdCBjYXNlCiAgMTAzMSB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoaXMgZml4LgoKLSBBbmRyZWFzIEZhZXJiZXIgYW5kIFNjb3R0IE1jQ3JlYXJ5IG1hZGUgKGxpYiljdXJsIGJ1aWxkIGZvciB0aGUgSGFpa3UgT1MuCgpZYW5nIFRzZSAoMjYgTWF5IDIwMDgpCi0gRGF2aWQgUm9zZW5zdHJhdWNoIHJlcG9ydGVkIHRoYXQgaGVhZGVyIGZpbGVzIHNwbmVnb2hlbHAuaCBhbmQKICBvcGVuc3NsL29iamVjdHMuaCB3ZXJlIG5lZWRlZCB0byBjb21waWxlIFNQTkVHTyBzdXBwb3J0LgoKRGFuaWVsIEZhbmRyaWNoICgyMiBNYXkgMjAwOCkKLSBNYWRlIHN1cmUgdG8gcGFzcyBsb25ncyBpbiB0byBjdXJsX2Vhc3lfc2V0b3B0IHdoZXJlIG5lY2Vzc2FyeSBpbiB0aGUKICBleGFtcGxlIHByb2dyYW1zIGFuZCBsaWJ0ZXN0IGNvZGUuCgpEYW5pZWwgU3RlbmJlcmcgKDE5IE1heSAyMDA4KQotIFdoZW4gdHJ5aW5nIHRvIHJlcGVhdCBhIG11bHRpIGludGVyZmFjZSBwcm9ibGVtIEkgZmVsbCBvdmVyIGEgZmV3IG11bHRpCiAgaW50ZXJmYWNlIHByb2JsZW1zOgoKICBvIHdpdGggcGlwZWxpbmluZyBkaXNhYmxlZCwgdGhlIHN0YXRlIHNob3VsZCBuZXZlciBiZSBzZXQgdG8gV0FJVERPIGJ1dAogICAgcmF0aGVyIGdvIHN0cmFpZ2h0IHRvIERPCgogIG8gd2UgaGFkIG11bHRpcGxlIHN0YXRlcyBmb3Igd2hpY2ggdGhlIGludGVybmFsIGZ1bmN0aW9uIHJldHVybmVkIG5vIHNvY2tldAogICAgYXQgYWxsIHRvIHdhaXQgZm9yLCB3aXRoIHRoZSBlZmZlY3QgdGhhdCBsaWJjdXJsIGNhbGxzIHRoZSBzb2NrZXQgY2FsbGJhY2sKICAgICh3aGVuIGN1cmxfbXVsdGlfc29ja2V0KCkgaXMgdXNlZCkgd2l0aCBSRU1PVkUgcHJlbWF0dXJlbHkgKGFzIGl0IHdvdWxkIGJlCiAgICBhZGRlZCBhZ2FpbiB3aXRoaW4gdmVyeSBzaG9ydGx5KQoKICBvIHdoZW4gaW4gRE8gYW5kIERPSU5HIHN0YXRlcywgdGhlIEhUVFAgYW5kIEhUVFBTIHByb3RvY29sIGhhbmRsZXIgZnVuY3Rpb25zCiAgICBkaWRuJ3QgcmV0dXJuIHRoYXQgdGhlIHNvY2tldCBzaG91bGQgYmUgd2FpdGVkIGZvciB3cml0aW5nLCBidXQgaW5zdGVhZCBpdAogICAgd2FzIHRyZWF0ZWQgYXMgaWYgbm8gc29ja2V0IHdhcyBuZWVkaW5nIG1vbml0b3Jpbmcgc28gYWdhaW4gUkVNT1ZFIHdhcwogICAgY2FsbGVkIHByZW1hdHVyZWx5LgoKRGFuaWVsIFN0ZW5iZXJnICgxMyBNYXkgMjAwOCkKLSBBZGRlZCB0ZXN0IGNhc2UgNTU2IHRoYXQgdXNlcyBjdXJsX2Vhc3lfc2VuZCgpIGFuZCBjdXJsX2Vhc3lfcmVjdigpCgpEYW5pZWwgU3RlbmJlcmcgKDkgTWF5IDIwMDgpCi0gSW50cm9kdWNpbmcgY3VybF9lYXN5X3NlbmQoKSBhbmQgY3VybF9lYXN5X3JlY3YoKS4gVGhleSBjYW4gYmUgdXNlZCB0byBzZW5kCiAgYW5kIHJlY2VpdmUgZGF0YSBvdmVyIGEgY29ubmVjdGlvbiBwcmV2aW91c2x5IHNldHVwIHdpdGggY3VybF9lYXN5X3BlcmZvcm0oKQogIGFuZCBpdHMgQ1VSTE9QVF9DT05ORUNUX09OTFkgb3B0aW9uLiBUaGUgc2VuZHJlY3YuYyBleGFtcGxlIHdhcyBhZGRlZCB0bwogIHNob3cgaG93IHRoZXkgY2FuIGJlIHVzZWQuCgpZYW5nIFRzZSAoOSBNYXkgMjAwOCkKLSBJbnRlcm5hbCB0aW1lIGRpZmZlcmVuY2VzIG5vdyB1c2UgbW9ub3RvbmljIHRpbWUgc291cmNlIGlmIGF2YWlsYWJsZS4KICBUaGlzIGFsc28gaW1wbGllcyB0aGUgcmVtb3ZhbCBvZiB0aGUgd2lubW0ubGliIGRlcGVuZGVuY3kgZm9yIFdJTjMyLgoKRGFuaWVsIFN0ZW5iZXJnICg5IE1heSAyMDA4KQotIFN0ZWZhbiBLcmF1c2UgcmVwb3J0ZWQgYSBidXN5LWxvb3BpbmcgY2FzZSB3aGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UKICBhbmQgZG9pbmcgQ09OTkVDVCB0byBhIHByb3h5LiBUaGUgYXBwIHdvdWxkIHRoZW4gYnVzeS1sb29wIHVudGlsIHRoZSBwcm94eQogIGNvbXBsZXRlZCBpdHMgcmVzcG9uc2UuCgpNaWNoYWwgTWFyZWsgKDkgTWF5IDIwMDgpCi0gTWFrZSBDdXJsX3dyaXRlIGFuZCBpdCdzIGNhbGxlZXMgYWNjZXB0IGEgY29uc3QgcG9pbnRlciwgaW4gcHJlcGFyYXRpb24KICBvZiB0ZXRldGVzdCdzIHBhdGNoIGZvciBjdXJsX2Vhc3lfc2VuZCgpCgpEYW5pZWwgU3RlbmJlcmcgKDcgTWF5IDIwMDgpCi0gTGlhbSBIZWFseSBmaWxlZCB0aGUgZGViaWFuIGJ1ZyByZXBvcnQgIzQ4MDA0NAogIChodHRwczovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTQ4MDA0NCkgaWRlbnRpZnlpbmcgYQogIHNlZ2ZhdWx0IHdoZW4gdXNpbmcga3JiNSBmdHAsIGJ1dCB0aGUga3JiNCBjb2RlIGhhZCB0aGUgc2FtZSBwcm9ibGVtLgoKWWFuZyBUc2UgKDcgTWF5IDIwMDgpCi0gQ2hyaXN0b3BoZXIgUGFsb3cgcHJvdmlkZWQgdGhlIHBhdGNoIChlZGl0ZWQgYnkgbWUpIHRoYXQgaW50cm9kdWNlcyB0aGUKICB1c2Ugb2YgbWljcm9zZWNvbmQgcmVzb2x1dGlvbiBrZXlzIGZvciBpbnRlcm5hbCBzcGxheSB0cmVlcy4KCkRhbmllbCBTdGVuYmVyZyAoNCBNYXkgMjAwOCkKLSBZdXJpeSBTb3NvdiBwb2ludGVkIG91dCBhIGNvbmZpZ3VyZSBmaXggZm9yIGRldGVjdGluZyBjLWFyZXMgd2hlbiB0aGF0IGlzCiAgYnVpbHQgZGVidWctZW5hYmxlZC4KCkRhbmllbCBTdGVuYmVyZyAoMyBNYXkgMjAwOCkKLSBCZW4gVmFuIEhvZiBmaWxlZCBidWcgcmVwb3J0ICMxOTQ1MjQwOiAibGliY3VybCBzb21ldGltZXMgc2VuZHMgYm9keSB0d2ljZQogIHdoZW4gdXNpbmcgQ1VSTF9BVVRIX0FOWSIgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xOTQ1MjQwKS4KICBUaGUgcHJvYmxlbSB3YXMgdGhhdCB3aGVuIGxpYmN1cmwgcmV3b3VuZCBhIHN0cmVhbSBtZWFudCBmb3IgdXBsb2FkIHdoZW4gaXQKICB3b3VsZCBwcmVwYXJlIGZvciBhIHNlY29uZCByZXF1ZXN0LCBpdCBjb3VsZCBhY2NpZGVudGFsbHkgY29udGludWUgdGhlCiAgc2VuZGluZyBvZiB0aGUgcmV3b3VuZCBkYXRhIG9uIHRoZSBmaXJzdCByZXF1ZXN0IGluc3RlYWQgb2Ygb24gdGhlIHNlY29uZC4KICBCZW4gYWxzbyBwcm92aWRlZCB0ZXN0IGNhc2UgMTAzMCB0aGF0IHZlcmlmaWVzIHRoaXMgZml4LgoKRGFuaWVsIFN0ZW5iZXJnICgzIE1heSAyMDA4KQotIEplYW4tRnJhbmNvaXMgQmVydHJhbmQgcmVwb3J0ZWQgYSBsaWJjdXJsIGNyYXNoIHdpdGggQ1VSTE9QVF9UQ1BfTk9ERUxBWQogIHNpbmNlIGxpYmN1cmwgdXNlZCBnZXRwcm90b2J5bmFtZSgpIGFuZCB0aGF0IGlzbid0IHRocmVhZC1zYWZlLiBXZSBub3cKICBzd2l0Y2hlZCB0byB1c2UgSVBQUk9UT19UQ1AgdW5jb25kaXRpb25hbGx5LCBidXQgcGVyaGFwcyB0aGUgcHJvcGVyIGZpeCBpcwogIHRvIGRldGVjdCB0aGUgdGhyZWFkLXNhZmUgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gYW5kIHVzZSB0aGF0LgogIGh0dHBzOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDgtMDUvMDAxMS5odG1sCgpEYW5pZWwgU3RlbmJlcmcgKDEgTWF5IDIwMDgpCi0gQmFydCBXaGl0ZWxleSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFkZSBsaWJjdXJsIHdvcmsgcHJvcGVybHkgd2hlbiBhbiBhcHAKICB1c2VzIHRoZSBDVVJMT1BUX09QRU5TT0NLRVRGVU5DVElPTiBjYWxsYmFjayB0byBjcmVhdGUgYSB1bml4IGRvbWFpbiBzb2NrZXQKICB0byBhIGh0dHAgc2VydmVyLgoKRGFuaWVsIFN0ZW5iZXJnICgyOSBBcHIgMjAwOCkKLSBUbyBtYWtlIGl0IGVhc2llciBmb3IgYXBwbGljYXRpb25zIHRoYXQgd2FudCBsb3RzIG9mIG1hZ2ljIHN0dWZmIGRvbmUgb24KICByZWRpcmVjdGlvbnMgYW5kIHRodXMgY2Fubm90IHVzZSBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OIGVhc2lseSwgd2Ugbm93CiAgaW50cm9kdWNlIHRoZSBuZXcgQ1VSTElORk9fUkVESVJFQ1RfVVJMIG9wdGlvbiB0aGF0IGxldHMgYXBwbGljYXRpb25zCiAgZXh0cmFjdCB0aGUgVVJMIGxpYmN1cmwgd291bGQndmUgcmVkaXJlY3RlZCB0byBpZiBpdCBoYWQgYmVlbiB0b2xkIHRvLiBUaGlzCiAgdGhlbiBlbmFibGVzIHRoZSBhcHBsaWNhdGlvbiB0byBjb250aW51ZSB0byB0aGF0IFVSTCBhcyBpdCB0aGlua3MgaXMKICBzdWl0YWJsZSwgd2l0aG91dCBoYXZpbmcgdG8gcmUtaW1wbGVtZW50IHRoZSBtYWdpYyBvZiBjcmVhdGluZyB0aGUgbmV3IFVSTAogIGZyb20gdGhlIExvY2F0aW9uOiBoZWFkZXIgZXRjLiBUZXN0IDEwMjkgdmVyaWZpZXMgaXQuCgpZYW5nIFRzZSAoMjkgQXByIDIwMDgpCi0gSW1wcm92ZWQgZWFzeSBpbnRlcmZhY2UgcmVzb2x2aW5nIHRpbWVvdXQgaGFuZGxpbmcgaW4gYy1hcmVzIGVuYWJsZWQgYnVpbGRzCgpEYW5pZWwgRmFuZHJpY2ggKDI4IEFwciAyMDA4KQotIEFkZGVkIHRlc3QgMTAyOCB0byB0ZXN0IGFuIEhUVFAgcmVkaXJlY3QgdG8gYSBGVFAgVVJMLgoKRGFuaWVsIFN0ZW5iZXJnICgyOCBBcHIgMjAwOCkKLSBOb3JiZXJ0IEZyZXNlIGZpbGVkIGJ1ZyByZXBvcnQgIzE5NTE1ODg6ICJQcm9ibGVtIHdpdGggY3VybGZ0cGZzIGFuZAogIGxpYmN1cmwiIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTk1MTU4OCkgd2hpY2ggc2VlbXMgdG8gYmUgYW4KICBpZGVudGljYWwgcmVwb3J0IHRvIHdoYXQgRGVuaXMgR29sb3ZhbiByZXBvcnRlZCBpbgogIGh0dHBzOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDgtMDIvMDEwOC5odG1sIFRoZSBGVFAgY29kZSBkaWRuJ3QgcmVzZXQgdGhlCiAgdXNlci9wYXNzd29yZCBwb2ludGVycyBwcm9wZXJseSBldmVuIHRob3VnaCB0aGVyZSBtaWdodCd2ZSBiZWVuIGEgbmV3CiAgc3RydWN0L2Njb25uZWN0aW9uIGdldHRpbmcgdXNlZC4KCkRhbmllbCBTdGVuYmVyZyAoMjYgQXByIDIwMDgpCi0gUmV2ZXJ0ZWQgYmFjayB0byB1c2UgYXV0b21ha2UgMS45LjYgaW4gdGhlIG5leHQgcmVsZWFzZSAoZnJvbSBhdXRvbWFrZQogIDEuMTAuMSkgc2luY2UgaXQgKnN0aWxsKiBzdWZmZXJzIGZyb20gU29sYXJpcy1yZWxhdGVkIGJ1Z3MuIE91ciBwcmV2aW91cwogIGF1dG9tYWtlIDEuMTAgcHJvYmxlbSB3YXMgcmVwb3J0ZWQgaW4gYnVnICMxNzAxMzYwCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzAxMzYwKSBhbmQgdGhpcyByZWNlbnQgcHJvYmxlbSB3YXMKICBidWcgIzE5NDQ4MjUgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xOTQ0ODI1KS4gSSBoYXZlIG5vdAogIHBlcnNvbmFsbHkgYXBwcm9hY2hlZCB0aGUgYXV0b21ha2UgdGVhbSBhYm91dCBlaXRoZXIgb25lIG9mIHRoZXNlIGJ1dCBJCiAgZmlndXJlIHdlIG5lZWQgYSBTb2xhcmlzIDEwIGd1eSB0byBkbyBpdCEKCllhbmcgVHNlICgyNSBBcHIgMjAwOCkKLSBBZGRlZCAndGltZW91dCcgYW5kICdkZWxheScgYXR0cmlidXRlcyBzdXBwb3J0IGZvciB0aGUgdGVzdCBoYXJuZXNzCiAgPGNvbW1hbmQ+IHN1YnNlY3Rpb24uCgpEYW5pZWwgRmFuZHJpY2ggKDI0IEFwciAyMDA4KQotIE1hZGUgLS1zdGRlcnIgYWJsZSB0byByZWRpcmVjdCBhbGwgc3RkZXJyIG1lc3NhZ2VzLgoKWWFuZyBUc2UgKDIzIEFwciAyMDA4KQotIEltcHJvdmUgc3luY2hyb25pemF0aW9uIGJldHdlZW4gdGVzdCBoYXJuZXNzIHJ1bnRlc3RzLnBsIHNjcmlwdAogIGFuZCB0ZXN0IGhhcm5lc3Mgc2VydmVycyB0byBtaW5pbWl6ZSByaXNrIG9mIGZhbHNlIHRlc3QgZmFpbHVyZXMuCgpEYW5pZWwgRmFuZHJpY2ggKDIyIEFwciAyMDA4KQotIEFkZGVkIHN1cHBvcnQgZm9yIHJ1bm5pbmcgb24gU3ltYmlhbiBPUy4KCkRhbmllbCBGYW5kcmljaCAoMTggQXByIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDI2IGFuZCAxMDI3IHRvIGRvIHNvbWUgcnVkaW1lbnRhcnkgdGVzdHMgb24gdGhlIC0tbWFudWFsCiAgYW5kIC0taGVscCBvcHRpb25zLgoKTWljaGFsIE1hcmVrICgxNCBBcHIgMjAwOCkKLSBhbGxvdyBkaXNhYmxpbmcgdGhlIHR5cGVjaGVja2VyIGJ5IGRlZmluaW5nIENVUkxfRElTQUJMRV9UWVBFQ0hFQ0ssIGFzCiAgZGlzY3Vzc2VkIGluIGh0dHBzOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDgtMDQvMDI5MS5odG1sCgpEYW5pZWwgU3RlbmJlcmcgKDE0IEFwciAyMDA4KQotIFN0ZWZhbiBLcmF1c2UgcmVwb3J0ZWQgYSBjYXNlIHdoZXJlIHRoZSBPcGVuU1NMIGhhbmRzaGFrZSBwaGFzZSB3YXNuJ3QKICBwcm9wZXJseSBhY2tub3dsZWRnaW5nIHRoZSB0aW1lb3V0IHZhbHVlcywgbGlrZSBpZiB5b3UgcHVsbGVkIHRoZSBuZXR3b3JrCiAgcGx1ZyBpbiB0aGUgbWlkc3Qgb2YgaXQuCgotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZml4ZWQgYSBzZWNvbmQgY2FzZSBvZiBub3QgY2hlY2tpbmcgdGhlIG1hbGxvYygpCiAgcmV0dXJuIGNvZGUgaW4gdGhlIE5lZ290aWF0ZSBjb2RlLgoKLSBTYW5kb3IgRmVsZGkgcmVwb3J0ZWQgYnVnICMxOTQyMDIyCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xOTQyMDIyKSBwb2ludGluZyBvdXQgYSBtaXN0YWtlIGluIHRoZQogIGxpYi9NYWtlZmlsZS52Y1s2OF0gbWFrZWZpbGVzJyByZWxlYXNlLXNzbC1kbGwgdGFyZ2V0LgoKLSBCcm9jayBOb2xhbmQgcmVwb3J0ZWQgdGhhdCBjdXJsIGJlaGF2ZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHdoaWNoIG9yZGVyCiAgeW91IHVzZWQgLWkgYW5kIC1JLgoKRGFuaWVsIFN0ZW5iZXJnICgxMiBBcHIgMjAwOCkKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZvdW5kIGFuZCBmaXhlZCBhIGNhc2Ugd2hlcmUgbWFsbG9jKCkgd2FzIGNhbGxlZCBidXQKICB3YXMgbm90IGNoZWNrZWQgZm9yIGEgTlVMTCByZXR1cm4sIGluIHRoZSBOZWdvdGlhdGUgY29kZS4KCkRhbmllbCBGYW5kcmljaCAoOSBBcHIgMjAwOCkKLSBBZGRlZCB0ZXN0IGNhc2VzIDEwMjQgJiAxMDI1IHRvIHRlc3QgYSBzY2VuYXJpbyBzaW1pbGFyIHRvIHRoZSBvbmUgcmVwb3J0ZWQKICBieSBCZW4gQ29tYmVlIHdoZXJlIGxpYmN1cmwgd291bGQgc2VuZCB0aGUgd3JvbmcgY29va2llIHRvIGEgcmVkaXJlY3RlZAogIHNlcnZlci4gIGxpYmN1cmwgd2FzIGRvaW5nIHRoZSByaWdodCB0aGluZyBpbiB0aGVzZSB0ZXN0IGNhc2VzLgoKTWljaGFsIE1hcmVrICg3IEFwciAyMDA4KQotIEZpeCB0aGUgTUlUIC8gSGVpbWRhbCBjaGVjayBmb3IgZ29vZDoKICBEZWZpbmUgSEFWRV9HU1NNSVQgaWYgPGdzc2FwaS97Z3NzYXBpLmgsZ3NzYXBpX2dlbmVyaWMuaCxnc3NhcGlfa3JiNS5ofT4gYXJlCiAgYXZhaWxhYmxlLCBvdGhlcndpc2UgZGVmaW5lIEhBVkVfR1NTSEVJTURBTCBpZiA8Z3NzYXBpLmg+IGlzIGF2YWlsYWJsZS4KCiAgT25seSBkZWZpbmUgR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UgdG8gZ3NzX250X3NlcnZpY2VfbmFtZSBpZgogIEdTU19DX05UX0hPU1RCQVNFRF9TRVJWSUNFIGlzbid0IGRlY2xhcmVkIGJ5IHRoZSBnc3NhcGkgaGVhZGVycy4gVGhpcyBzaG91bGQKICBhdm9pZCBicmVha2FnZSBpbiBjYXNlIHdlIHdyb25nbHkgcmVjb2duaXplIEhlaW1kYWwgYXMgTUlUIGFnYWluLgoKRGFuaWVsIFN0ZW5iZXJnICg1IEFwciAyMDA4KQotIEFsZXhleSBTaW1hayBmaXhlZCBjdXJsX2Vhc3lfcmVzZXQoKSB0byByZXNldCB0aGUgbWF4IHJlZGlyZWN0IGxpbWl0IHByb3Blcmx5CgotIEJhc2VkIG9uIHRoZSBEZWJpYW4gYnVnIHJlcG9ydCAjNDc0MjI0IHRoYXQgY29tcGxhaW5lZCBhYm91dCB0aGUgRlRQIGVycm9yCiAgbWVzc2FnZSB3aGVuIGxpYmN1cmwgZG9lc24ndCBnZXQgYSAyMjAgYmFjayBpbW1lZGlhdGVseSBvbiBjb25uZWN0LCBJIG5vdwogIGNoYW5nZWQgaXQgdG8gYmUgbW9yZSBzcGVjaWZpYyBvbiB3aGF0IHRoZSBwcm9ibGVtIGlzLiBBbHNvIHdvcnRoIG5vdGljaW5nOgogIHdoaWxlIHRoZSBidWcgcmVwb3J0IGNvbnRhaW5zIGFuIGV4YW1wbGUgd2hlcmUgdGhlIHJlc3BvbnNlIGlzOgoKICAgIDQyMSBUaGVyZSBhcmUgdG9vIG1hbnkgY29ubmVjdGVkIHVzZXJzLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyCgogIHdlIGNhbm5vdCBhc3N1bWUgdGhhdCB0aGUgZXJyb3IgbWVzc2FnZSB3aWxsIGFsd2F5cyBiZSB0aGlzIHJlYWRhYmxlIG5vcgogIHRoYXQgaXQgZml0cyB3aXRoaW4gYSBwYXJ0aWN1bGFyIGJvdW5kYXJ5IGV0Yy4KCkRhbmllbCBGYW5kcmljaCAoMyBBcHIgMjAwOCkKLSBBZGRlZCB0ZXN0NjI3IHRvIHRlc3QgU0ZUUCB3aXRoIENVUkxPUFRfTk9CT0RZCgpEYW5pZWwgU3RlbmJlcmcgKDMgQXByIDIwMDgpCi0gU2V0dGluZyBDVVJMT1BUX05PQk9EWSB0byBGQUxTRSB3aWxsIG5vdyBzd2l0Y2ggdGhlIEhUVFAgcmVxdWVzdCBtZXRob2QgdG8KICBHRVQgc2ltcGx5IGJlY2F1c2UgcHJldmlvdXNseSB3aGVuIHlvdSBzZXQgQ1VSTE9QVF9OT0JPRFkgdG8gVFJVRSBmaXJzdCBhbmQKICB0aGVuIEZBTFNFIHlvdSdkIGVuZCB1cCBpbiBhIGJyb2tlbiBzdGF0ZSB3aGVyZSBhIEhUVFAgcmVxdWVzdCB3b3VsZCBkbyBhCiAgSEVBRCBieSBzdGlsbCBhY3QgYSBsb3QgbGlrZSBmb3IgYSBHRVQgYW5kIGhhbmcgd2FpdGluZyBmb3IgdGhlIGNvbnRlbnQgZXRjLgoKLSBTY290dCBCYXJyZXR0IGFkZGVkIHN1cHBvcnQgZm9yIENVUkxPUFRfTk9CT0RZIG92ZXIgU0ZUUAoKRGFuaWVsIEZhbmRyaWNoICgzIEFwciAyMDA4KQotIE1hZGUgc3VyZSB0aGF0IGN1cmxfZ2xvYmFsX2luaXQgaXMgY2FsbGVkIGluIGFsbCB0aGUgbXVsdGl0aHJlYWRlZAogIGV4YW1wbGUgcHJvZ3JhbXMuCgpNaWNoYWwgTWFyZWsgKDMxIE1hciAyMDA4KQotIFJlbW92ZWQgdGhlIGdlbmVyYXRlZCBjYS1idW5kbGUuaCBmaWxlLiBUaGUgdmVyYmF0aW0gdmFsdWUgb2YgJGNhIGFuZAogICRjYXBhdGggaXMga25vd24gdG8gY29uZmlndXJlLCBzbyBpdCBjYW4gYmUgZGVmaW5lZCBpbiBjb25maWcuaCBpbnN0ZWFkLgoKRGFuaWVsIFN0ZW5iZXJnICgzMSBNYXIgMjAwOCkKLSBBZGRlZCBDVVJMRk9STV9TVFJFQU0gYXMgYSBzdXBwb3J0ZWQgb3B0aW9uIHRvIGN1cmxfZm9ybWFkZCgpIHRvIGFsbG93IGFuCiAgYXBwbGljYXRpb24gdG8gcHJvdmlkZSBkYXRhIGZvciBhIG11bHRpcGFydCB3aXRoIHRoZSByZWFkIGNhbGxiYWNrLiBOb3RlCiAgdGhhdCB0aGUgc2l6ZSBuZWVkcyB0byBiZSBwcm92aWRlZCB3aXRoIENVUkxGT1JNX0NPTlRFTlRTTEVOR1RIIHdoZW4gdGhlCiAgc3RyZWFtIG9wdGlvbiBpcyB1c2VkLiBUaGlzIGZlYXR1cmUgaXMgdmVyaWZpZWQgYnkgdGhlIG5ldyB0ZXN0IGNhc2UKICA1NTQuIFRoaXMgZmVhdHVyZSB3YXMgc3BvbnNvcmVkIGJ5IFhwb25hdXQuCgpEYW5pZWwgRmFuZHJpY2ggKDMwIE1hciAyMDA4KQotIENoYW5nZWQgdGhlIG1ha2VmaWxlIHNvIHRoZSBkb2MvZXhhbXBsZXMvIHByb2dyYW1zIGFyZSBuZXZlciBidWlsdCBpbiBhCiAgbm9ybWFsIGJ1aWxkL2luc3RhbGwgKG9ubHkgd2l0aCB0aGUgJ21ha2UgY2hlY2snIHRhcmdldCksIHNvIHRoYXQgYQogIGJ1aWxkIGZhaWx1cmUgaW4gdGhlIGV4YW1wbGVzIGlzbid0IGZhdGFsLgoKVmVyc2lvbiA3LjE4LjEgKDMwIE1hcmNoIDIwMDgpCgpEYW5pZWwgU3RlbmJlcmcgKDI4IE1hciAyMDA4KQotIFN0ZXBoZW4gQ29sbHllciBwb2ludGVkIG91dCB0aGF0IGNvbmZpZ3VyZSAtLXdpdGgtbGlic3NoMiB3aXRob3V0IGEgZ2l2ZW4KICBwYXRoIGRpZG4ndCB3b3JrIHByb3Blcmx5LgoKRGFuaWVsIFN0ZW5iZXJnICgyNyBNYXIgMjAwOCkKLSBBcyBmb3VuZCBvdXQgYW5kIHJlcG9ydGVkIGJ5IERhbiBQZXRpdHQsIGxpYmN1cmwgZGlkbid0IHNob3cgcHJvZ3Jlc3MvY2FsbAogIHRoZSBwcm9ncmVzcyBjYWxsYmFjayBmb3IgdGhlIGZpcnN0IChwb3RlbnRpYWxseSBodWdlKSBwaWVjZSBvZiBib2R5IGRhdGEKICBzZW50IHRvZ2V0aGVyIHdpdGggdGhlIFBPU1QgcmVxdWVzdCBoZWFkZXJzIGluIHRoZSBpbml0aWFsIHNlbmQoKS4KCkRhbmllbCBTdGVuYmVyZyAoMjUgTWFyIDIwMDgpCi0gTWFkZSBzZXR0aW5nIHRoZSBDVVJMT1BUX1NTTF9DVFhfRlVOQ1RJT04gb3B0aW9uIHJldHVybiBhIGZhaWx1cmUgaW4gY2FzZQogIGxpYmN1cmwgd2Fzbid0IGJ1aWx0IHRvIHVzZSBPcGVuU1NMIGFzIHRoYXQgaXMgYSBwcmVyZXF1aXNpdGUgZm9yIHRoaXMKICBvcHRpb24gdG8gZnVuY3Rpb24hCgpEYW5pZWwgU3RlbmJlcmcgKDIyIE1hciAyMDA4KQotIEZpeGVkIHRoZSBwcm9ibGVtIHdpdGggZG9pbmcgYSB6ZXJvIGJ5dGUgU0NQIHRyYW5zZmVyLCB2ZXJpZmllZCB3aXRoIHRlc3QKICBjYXNlIDYxNyAod2hpY2ggd2FzIGFkZGVkIGJ5IERhbmllbCBGYW5kcmljaCA1IE1hciAyMDA4KS4KCkRhbmllbCBGYW5kcmljaCAoMjAgTWFyIDIwMDgpCi0gRml4ZWQgYSBwcm9ibGVtIHdoZXJlIGN1cmwtY29uZmlnIC0tcHJvdG9jb2xzIGNvdWxkIGVycm9uZW91c2x5IHNob3cgTERBUFMKICBzdXBwb3J0IHdoZW4gY3VybCBkaWRuJ3QgZXZlbiBoYXZlIHJlZ3VsYXIgTERBUCBzdXBwb3J0LiAgSXQgbG9va3MgbGlrZQogIHRoaXMgY291bGQgaGFwcGVuIHdoZW4gdGhlIC0tZW5hYmxlLWxkYXBzIGNvbmZpZ3VyZSBzd2l0Y2ggaXMgZ2l2ZW4gYnV0CiAgY29uZmlndXJlIGNvdWxkbid0IGZpbmQgdGhlIExEQVAgaGVhZGVycyBvciBsaWJyYXJpZXMuCgpNaWNoYWwgTWFyZWsgKDIwIE1hciAyMDA4KQotIEFkZGVkIC0td2l0aC1jYS1wYXRoPURJUkVDVE9SWSBjb25maWd1cmUgb3B0aW9uIHRvIHVzZSBhbiBvcGVuU1NMIENBcGF0aCBieQogIGRlZmF1bHQgaW5zdGVhZCBvZiBhIGNhIGJ1bmRsZS4gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2lsbCBhbHNvIGxvb2sgZm9yIGEKICBjYSBwYXRoIGlmIG5vIGNhIGJ1bmRsZSBpcyBmb3VuZCBhbmQgbm8gb3B0aW9uIGdpdmVuLgoKLSBGaXhlZCBkZXRlY3Rpb24gb2YgcHJldmlvdXNseSBpbnN0YWxsZWQgY3VybC1jYS1idW5kbGUuY3J0CgpEYW5pZWwgRmFuZHJpY2ggKDE4IE1hciAyMDA4KQotIEFkZGVkIHRlc3QgNjI2IHRvIHJlcHJvZHVjZSBhbiBpbmZpbml0ZSBsb29wIHdoZW4gZ2l2ZW4gYW4gaW52YWxpZAogIFNGVFAgcXVvdGUgY29tbWFuZCByZXBvcnRlZCBieSBWaW5jZW50IExlIE5vcm1hbmQsIGFuZCBmaXhlZCBpdC4KCk1pY2hhbCBNYXJlayAoMTggTWFyIDIwMDgpCi0gQWRkZWQgY3VybF9lYXN5X2dldGluZm8gdHlwZWNoZWNrZXIuCgotIEFkZGVkIG1hY3JvcyBmb3IgY3VybF9zaGFyZV9zZXRvcHQgYW5kIGN1cmxfbXVsdGlfc2V0b3B0IHRvIGNoZWNrIGF0IGxlYXN0CiAgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cy4KCkRhbmllbCBGYW5kcmljaCAoMTMgTWFyIDIwMDgpCi0gQWRkZWQgdGVzdHMgNjIyLTYyNSB0byB0ZXN0IFNGVFAvU0NQIHVwbG9hZHMuIFRlc3QgNjI1IHdhcyBhbiBhdHRlbXB0IHRvCiAgcmVwcm9kdWNlIHRoZSAtLWZ0cC1jcmVhdGUtZGlycyBwcm9ibGVtIHJlcG9ydGVkIGJ5IEJyaWFuIFVsbSwgYnV0IHRoYXQKICBzZWVtcyB0byBuZWVkIGEgY2FsbCBjdXJsX2Vhc3lfcmVzZXQoKSB3aGljaCB0aGlzIHRlc3QgY2FzZSBkb2Vzbid0IGRvLgoKRGFuaWVsIFN0ZW5iZXJnICgxMyBNYXIgMjAwOCkKLSBCcmlhbiBVbG0gZmlndXJlZCBvdXQgdGhhdCBpZiB5b3UgZGlkIGFuIFNGVFAgdXBsb2FkIHdpdGgKICBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeSwgYW5kIHRoZW4gcmUtdXNlZCB0aGUKICBoYW5kbGUgYW5kIHVwbG9hZGVkIGFub3RoZXIgZmlsZSB0byBhbm90aGVyIGRpcmVjdG9yeSB0aGF0IG5lZWRlZCB0byBiZQogIGNyZWF0ZWQsIHRoZSBzZWNvbmQgdXBsb2FkIHdvdWxkIGZhaWwuIEFub3RoZXIgY2FzZSBvZiBhIHN0YXRlIHZhcmlhYmxlIHRoYXQKICB3YXNuJ3QgcHJvcGVybHkgcmVzZXQgYmV0d2VlbiByZXF1ZXN0cy4KCi0gSSByZXdyb3RlIHRoZSAxMDAtY29udGludWUgY29kZSB0byB1c2UgYSBzaW5nbGUgc3RhdGUgdmFyaWFibGUgaW5zdGVhZCBvZgogIHRoZSBwcmV2aW91cyB0d28gb25lcy4gSSB0aGluayBpdCBtYWRlIHRoZSBsb2dpYyBzb21ld2hhdCBjbGVhcmVyLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBNYXIgMjAwOCkKLSBEbWl0cnkgUG9wb3YgZmlsZWQgYnVnIHJlcG9ydCAjMTkxMTA2OQogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTkxMTA2OSkgdGhhdCBpZGVudGlmaWVkIGEgcmFjZQogIGNvbmRpdGlvbiBpbiB0aGUgbmFtZSByZXNvbHZlciBjb2RlIHdoZW4gdGhlIEROUyBjYWNoZSBpcyBzaGFyZWQgYmV0d2VlbgogIG11bHRpcGxlIGVhc3kgaGFuZGxlcywgZWFjaCBydW5uaW5nIGluIHNpbXVsdGFuZW91cyB0aHJlYWRzIHRoYXQgY291bGQgY2F1c2UKICBjcmFzaGVzLgoKLSBBZGRlZCBhIG1hY3JvIGZvciBjdXJsX2Vhc3lfc2V0b3B0KCkgdGhhdCBhY2NlcHRzIHRocmVlIGFyZ3VtZW50cyBhbmQgc2ltcGx5CiAgZG9lcyBub3RoaW5nIHdpdGggdGhlbSwganVzdCB0byBtYWtlIHN1cmUgbGliY3VybCB1c2VycyBhbHdheXMgdXNlIHRocmVlCiAgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb24uIER1ZSB0byBpdHMgdXNlIG9mIC4uLiBmb3IgdGhlIHRoaXJkIGFyZ3VtZW50LCBpdAogIGlzIG90aGVyd2lzZSBoYXJkIHRvIGRldGVjdCBhYnVzZS4KCk1pY2hhbCBNYXJlayAoMTEgTWFyIDIwMDgpCi0gQWRkZWQgYSB0eXBlIGNoZWNraW5nIG1hY3JvIGZvciBjdXJsX2Vhc3lfc2V0b3B0KCksIG5lZWRzIGdjYy00LjMgYW5kIG9ubHkKICB3b3JrcyBpbiBDIG1vZGUgYXRtIChodHRwczovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA4LTAyLzAyNjcuaHRtbCAsCiAgaHR0cHM6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwOC0wMi8wMjkyLmh0bWwgKQoKRGFuaWVsIEZhbmRyaWNoICgxMCBNYXIgMjAwOCkKLSBBZGRlZCB0ZXN0cyA2MTgtNjIxIHRvIHRlc3QgU0ZUUC9TQ1AgdHJhbnNmZXJzIG9mIG1vcmUgdGhhbiBvbmUgZmlsZQogICh0ZXN0IDYyMCB0ZXN0cyB0aGUganVzdC1maXhlZCBwcm9ibGVtIHJlcG9ydGVkIGJ5IEJyaWFuIFVsbSkuCgpEYW5pZWwgU3RlbmJlcmcgKDkgTWFyIDIwMDgpCi0gQnJpYW4gVWxtIHJlcG9ydGVkIGEgY3Jhc2ggd2hlbiBkb2luZyBhIHNlY29uZCBTRlRQIHRyYW5zZmVyIG9uIGEgcmUtdXNlZAogIGVhc3kgaGFuZGxlIGlmIGN1cmxfZWFzeV9yZXNldCgpIHdhcyB1c2VkIGJldHdlZW4gdGhlbS4gSSBmaXhlZCBpdCBhbmQgQnJpYW4KICB2ZXJpZmllZCB0aGF0IGl0IGN1cmVkIGhpcyBwcm9ibGVtLgoKLSBCcmlhbiBVbG0gcmVwb3J0ZWQgdGhhdCBpZiB5b3UgZmlyc3QgdHJpZWQgdG8gZG93bmxvYWQgYSBub24tZXhpc3RpbmcgU0ZUUAogIGZpbGUgYW5kIHRoZW4gZmV0Y2hlZCBhbiBleGlzdGluZyBvbmUgYW5kIHJlLXVzZWQgdGhlIGhhbmRsZSwgbGliY3VybCB3b3VsZAogIHN0aWxsIHJlcG9ydCB0aGUgc2Vjb25kIG9uZSBhcyBub24tZXhpc3RpbmcgYXMgd2VsbCEgSSBmaXhlZCBpdCBhbmQgQnJpYW4KICB2ZXJpZmllZCB0aGF0IGl0IGN1cmVkIGhpcyBwcm9ibGVtLgoKTWljaGFsIE1hcmVrICg2IE1hciAyMDA4KQotIEZpeCB0aGUgZ3NzYXBpIGNvbmZpZ3VyZSBjaGVjayB0byBkZXRlY3QgbmV3ZXIgTUlUIEtlcmJlcm9zIChwYXRjaCBieQogIE1pY2hhZWwgQ2FsbWVyKQoKWWFuZyBUc2UgKDYgTWFyIDIwMDgpCi0gRml4IHJlZ3Jlc3Npb24gb24gQ3VybF9zb2NrZXRfcmVhZHkoKSBhbmQgQ3VybF9wb2xsKCkgc28gdGhhdCB0aGVzZSB3aWxsCiAgYWdhaW4gZmFpbCBvbiBzZWxlY3QvcG9sbCBlcnJvcnMgZGlmZmVyZW50IHRoYW4gRUlOVFIuCgpEYW5pZWwgRmFuZHJpY2ggKDUgTWFyIDIwMDgpCi0gRml4ZWQgdGhlIHRlc3QgaGFybmVzcyBzbyBpdCB3aWxsIHdyaXRlIG91dCB6ZXJvLWxlbmd0aCBkYXRhIGZpbGVzLgoKLSBBZGRlZCB0ZXN0cyA2MTYgYW5kIDYxNyB0byBzZWUgaG93IFNGVFAgYW5kIFNDUCBjb3BlIHdpdGggemVyby1sZW5ndGgKICBmaWxlcywgYXMgcXVlc3Rpb25lZCBieSBNaWtlIFByb3R0cy4gU0ZUUCBkb2VzIGZvciBtZSBidXQgU0NQIGRvZXNuJ3QKICBzbyB0ZXN0IDYxNyBpcyBkaXNhYmxlZCBmb3Igbm93LgoKRGFuaWVsIFMgKDQgTWFyIDIwMDgpCi0gTWlrZSBQcm90dHMgYnJvdWdodCBhIHBhdGNoIHRoYXQgbWFrZXMgcmVzdW1lZCB0cmFuc2ZlcnMgd29yayB3aXRoIFNGVFAuCgpEYW5pZWwgUyAoMSBNYXIgMjAwOCkKLSBBbmF0b2xpIFR1Ym1hbiBmb3VuZCBhbmQgZml4ZWQgYSBjcmFzaCB3aXRoIE5lZ290aWF0ZSBhdXRoZW50aWNhdGlvbiB1c2VkIG9uCiAgYSByZS11c2VkIGNvbm5lY3Rpb24gd2hlcmUgYm90aCByZXF1ZXN0cyB1c2VkIE5lZ290aWF0ZS4KCkd1ZW50ZXIgS25hdWYgKDI2IEZlYiAyMDA4KQotIEthc3BhciBCcmFuZCBwcm92aWRlZCBhIHBhdGNoIHRvIHN1cHBvcnQgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiAoUkZDIDQzNjYpLgoKRGFuaWVsIFMgKDI1IEZlYiAyMDA4KQotIEthc3BhciBCcmFuZCBtYWRlIEdudVRMUy1idWlsdCBsaWJjdXJsIHByb3Blcmx5IGFja25vd2xlZGdlIHRoZSBvcHRpb24gdGhhdAogIGZvcmNlcyBpdCB0byBwcmVmZXIgU1NMdjMuCgpEYW5pZWwgUyAoMjMgRmViIDIwMDgpCi0gU2FtIExpc3RvcGFkIHByb3ZpZGVkIGEgcGF0Y2ggaW4gZmVhdHVyZS1yZXF1ZXN0ICMxOTAwMDE0CiAgaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL2ZlYXR1cmUuY2dpP2lkPTE5MDAwMTQgdGhhdCBtYWtlcyBsaWJjdXJsIChidWlsdCB0bwogIHVzZSBPcGVuU1NMKSBzdXBwb3J0IGEgZnVsbCBjaGFpbiBvZiBjZXJ0aWZpY2F0ZXMgaW4gYSBnaXZlbiBQS0NTMTIKICBjZXJ0aWZpY2F0ZS4KCkRhbmllbCBTICgyMiBGZWIgMjAwOCkKLSBHZW9yZyBMaXBwaXRzY2ggbWFkZSB0aGUgc3JjL01ha2VmaWxlLnZjNiBtYWtlZmlsZSB1c2UgdGhlIHNhbWUgbWVtb3J5IG1vZGVsCiAgb3B0aW9ucyBhcyB0aGUgbGliL01ha2VmaWxlLnZjNiBhbHJlYWR5IGRpZC4KCkRhbmllbCBTICgyMSBGZWIgMjAwOCkKLSBabWV5IFBldHJvZmYgZm91bmQgYSBjcmFzaCB3aGVuIGxpYmN1cmwgYWNjZXNzZWQgYSBOVUxMIHBvaW50ZXIsIHdoaWNoCiAgaGFwcGVuZWQgaWYgeW91IHNldCB0aGUgY29ubmVjdGlvbiBjYWNoZSBzaXplIHRvIDEgYW5kIGZvciBleGFtcGxlIGZhaWxlZCB0bwogIGxvZ2luIHRvIGFuIEZUUCBzaXRlLiBCdWcgcmVwb3J0ICMxODk2Njk4CiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODk2Njk4KQoKRGFuaWVsIFMgKDIwIEZlYiAyMDA4KQotIEZpeGVkIHRlc3QgY2FzZSA0MDUgdG8gbm90IGZhaWwgd2hlbiBsaWJjdXJsIGlzIGJ1aWx0IHdpdGggR251VExTCgotIEJhc2VkIG9uIGluaXRpYWwgd29yayBkb25lIGJ5IEdhdXRhbSBLYWNocm9vIHRvIGFkZHJlc3MgYSBidWcsIHdlIG5vdyBrZWVwCiAgYmV0dGVyIGNvbnRyb2wgYXQgdGhlIGV4YWN0IHN0YXRlIG9mIHRoZSBjb25uZWN0aW9uJ3MgU1NMIHN0YXR1cyBzbyB0aGF0IHdlCiAga25vdyBleGFjdGx5IHdoZW4gaXQgaGFzIGNvbXBsZXRlZCB0aGUgU1NMIG5lZ290aWF0aW9uIG9yIG5vdCBzbyB0aGF0IHRoZXJlCiAgd29uJ3QgYmUgYWNjaWRlbnRhbCByZS11c2VzIG9mIGNvbm5lY3Rpb25zIHRoYXQgYXJlIHdyb25nbHkgYmVsaWV2ZWQgdG8gYmUKICBpbiBTU0wtY29tcGxldGVkLW5lZ290aWF0ZSBzdGF0ZS4KCi0gV2Ugbm8gbG9uZ2VyIHN1cHBvcnQgc2V0dGluZyB0aGUgQ1VSTE9QVF9VUkwgb3B0aW9uIGZyb20gaW5zaWRlIGEgY2FsbGJhY2sKICBzdWNoIGFzIHRoZSBDVVJMT1BUX1NTTF9DVFhfRlVOQ1RJT04gb25lIHRyZWF0IHRoYXQgYXMgaWYgaXQgd2FzIGEgTG9jYXRpb246CiAgZm9sbG93aW5nLiBUaGUgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VkIHRoaXMgZmVhdHVyZSB3YXMgZG9uZSBmb3IgNy4xMS4wLCBidXQKICB0aGlzIGNvZGUgYW5kIGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gYnJva2VuIHNpbmNlIGFib3V0IDcuMTUuNCAoTWFyY2ggMjAwNikKICB3aXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2Ygbm9uLWJsb2NraW5nIE9wZW5TU0wgImNvbm5lY3RzIi4KCiAgSXQgd2FzIGEgaGFjayB0byBiZWdpbiB3aXRoIGFuZCBzaW5jZSBpdCBkb2Vzbid0IHdvcmsgYW5kIGhhc24ndCB3b3JrZWQKICBjb3JyZWN0bHkgZm9yIGEgbG9uZyB0aW1lIGFuZCBub2JvZHkgaGFzIGV2ZW4gbm90aWNlZCwgSSBjb25zaWRlciBpdCBhIHZlcnkKICBzdWl0YWJsZSBzdWJqZWN0IGZvciBwbGFpbiByZW1vdmFsLiBBbmQgc28gaXQgd2FzIGRvbmUuCgpHdWVudGVyIEtuYXVmICgxOSBGZWIgMjAwOCkKLSBXZSBkbyBubyBsb25nZXIgc3VwcG9ydCBTU0x2MiBieSBkZWZhdWx0IHNpbmNlIGl0IGhhcyBrbm93biBmbGF3cy4KICBLYXNwYXIgQnJhbmQgcHJvdmlkZWQgYSBwYXRjaCBmb3IgYWxsIHN1cHBvcnRlZCBTU0wgdG9vbGtpdHMuCgpEYW5pZWwgRmFuZHJpY2ggKDE5IEZlYiAyMDA4KQotIEFkZGVkIHRlc3QzMDkgdG8gdGVzdCBIVFRQIHJlZGlyZWN0IHRvIEhUVFBTIFVSTAoKRGFuaWVsIFMgKDE4IEZlYiAyMDA4KQotIFdlJ3JlIG5vIGxvbmdlciBwcm92aWRpbmcgYSB2ZXJ5IG9sZCBjYS1idW5kbGUgaW4gdGhlIGN1cmwgdGFyYmFsbC4gWW91IGNhbgogIGdldCBhIGZyZXNoIG9uZSBkb3dubG9hZGVkIGFuZCBjcmVhdGVkIHdpdGggJ21ha2UgY2EtYnVuZGxlJyBvciB5b3UgY2FuIGdldAogIG9uZSBmcm9tIGhlcmUgPT4gaHR0cHM6Ly9jdXJsLmhheHguc2UvZG9jcy9jYWV4dHJhY3QuaHRtbCBpZiB5b3Ugd2FudCBhIGZyZXNoCiAgbmV3IG9uZSBleHRyYWN0ZWQgZnJvbSBNb3ppbGxhJ3MgcmVjZW50IGxpc3Qgb2YgY2EgY2VydHMuCgogIFRoZSBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1jYS1idW5kbGUgbm93IGxldHMgeW91IHNwZWNpZnkgd2hhdCBmaWxlIHRvIHVzZQogIGFzIGRlZmF1bHQgY2EgYnVuZGxlIGZvciB5b3VyIGJ1aWxkLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgY29uZmlndXJlIHNjcmlwdAogIHdpbGwgY2hlY2sgYSBmZXcga25vd24gc3RhbmRhcmQgcGxhY2VzIGZvciBhIGdsb2JhbCBjYSBjZXJ0IHRvIHVzZS4KCkRhbmllbCBTICgxNyBGZWIgMjAwOCkKLSBKZXJvbWUgTXVmZmF0LU1lcmlkb2wgaGVscGVkIG1lIGZpeCBDdXJsX2RvbmUoKSB0byBjbG9zZSB0aGUgY3VycmVudAogIGNvbm5lY3Rpb24gYnkgZm9yY2Ugd2hlbiBpdCB3YXMgY2FsbGVkIGJlZm9yZSB0aGUgZW50aXJlIHJlcXVlc3QgaXMKICBjb21wbGV0ZWQsIHNpbXBseSBiZWNhdXNlIHdlIGNhbid0IGtub3cgaWYgdGhlIGNvbm5lY3Rpb24gcmVhbGx5IGNhbiBiZQogIHJlLXVzZWQgc2FmZWx5IGF0IHRoYXQgcG9pbnQuCgotIEJhc2VkIG9uIHRoZSBzYW1lIGRlYnVnZ2luZyBsb2dpYywgSSd2ZSBhbHNvIG1hZGUgQ3VybF9odHRwX2RvbmUoKSBub3QKICByZXR1cm4gQ1VSTEVfR09UX05PVEhJTkcgaWYgY2FsbGVkICJwcmVtYXR1cmVseSIuIFRoaXMgc2hvdWxkIGhhdmUgbm8gcmVhbAogIGVmZmVjdCB0byBhbnl0aGluZyBidXQgdGhlIGNvZGUgbWFrZXMgbW9yZSBzZW5zZSBsaWtlIHRoaXMuCgpEYW5pZWwgUyAoMTUgRmViIDIwMDgpCi0gTWFkZSB0aGUgZ251dGxzIGNvZGUgcGF0aCBub3QgZXZlbiB0cnkgdG8gZ2V0IHRoZSBzZXJ2ZXIgY2VydCBpZiBubyBwZWVyCiAgdmVyaWZpY2F0aW9uIGlzIHJlcXVlc3RlZC4gUHJldmlvdXNseSBpdCB3b3VsZCBldmVuIHJldHVybiBmYWlsdXJlIGlmIGdudXRscwogIGZhaWxlZCB0byBnZXQgdGhlIHNlcnZlciBjZXJ0IGV2ZW4gdGhvdWdoIG5vIHZlcmlmaWNhdGlvbiB3YXMgYXNrZWQgZm9yLgogIFB1YmxpYyBzZXJ2ZXIgc2hvd2luZyB0aGUgcHJvYmxlbTogaHR0cHM6Ly93d3cubmV0MjIyLmNhaXNzZS1lcGFyZ25lLmZyCgotIEZpeCBteSBDdXJsX3RpbWVsZWZ0KCkgbGVmdG92ZXIgbWlzdGFrZSBpbiB0aGUgZ251dGxzIGNvZGUKCi0gUG9veWFuIE1jU3BvcnJhbiBmb3VuZCBhbmQgZml4ZWQgYSBmbGF3IHdoZXJlIHlvdSBmaXJzdCB3b3VsZCBkbyBhIG5vcm1hbAogIGh0dHAgcmVxdWVzdCBhbmQgdGhlbiB5b3UnZCByZXVzZSB0aGUgaGFuZGxlIGFuZCByZXBsYWNlIHRoZSBBY2NlcHQ6IGhlYWRlciwKICBhcyB0aGVuIGxpYmN1cmwgd291bGQgc2VuZCB0d28gQWNjZXB0OiBoZWFkZXJzIQoKRGFuaWVsIFMgKDExIEZlYiAyMDA4KQotIFlhbmcgVHNlIHBvaW50ZWQgb3V0IGEgZmV3IHJlbWFpbmluZyBxdWlya3MgZnJvbSBteSB0aW1lb3V0IHJlZmFjdG9yaW5nIGZyb20KICBGZWIgNyB0aGF0IGRpZG4ndCBhYm9ydCBwcm9wZXJseSBvbiB0aW1lb3V0cy4gVGhlc2UgYXJlIGFjdHVhbGx5IG9sZAogIHByb2JsZW1zIGJ1dCBub3cgdGhleSBzaG91bGQgYmUgZml4ZWQuCgpZYW5nIFRzZSAoMTAgRmViIDIwMDgpCi0gQnVnIHJlcG9ydCAjMTg4ODkzMiAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4ODg5MzIpIHBvaW50cyBvdXQKICBhbmQgcHJvdmlkZXMgdGVzdCBwcm9ncmFtIHRoYXQgZGVtb25zdHJhdGVzIHRoYXQgbGliY3VybCBtaWdodCBub3Qgc2V0IGVycm9yCiAgZGVzY3JpcHRpb24gbWVzc2FnZSBmb3IgZXJyb3IgQ1VSTEVfQ09VTEROVF9SRVNPTFZFX0hPU1QgZm9yIFdpbmRvd3MgdGhyZWFkZWQKICBuYW1lIHJlc29sdmVyIGJ1aWxkcy4gRml4ZWQgbm93LgoKRGFuaWVsIEZhbmRyaWNoICg4IEZlYiAyMDA4KQotIEFkZGVkIGtleSB3b3JkcyB0byBhbGwgU1NMLXVzaW5nIHRlc3RzIHNvIHRoZXkgY2FuIGJlIHNraXBwZWQgaWYgbmVjZXNzYXJ5LgogIFJlbW92ZWQgYSBmZXcgdW5uZWNlc3NhcnkgcmVxdWlyZXMgU1NMIHN0YXRlbWVudHMuCgpEYW5pZWwgUyAoOCBGZWIgMjAwOCkKLSBNaWtlIEhvbW1leSBmaWxlZCBhbmQgZml4ZWQgYnVnIHJlcG9ydCAjMTg4OTg1NgogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTg4OTg1Nik6IFdoZW4gdXNpbmcgdGhlIGdudXRscyBzc2wKICBsYXllciwgY2xlYW5pbmctdXAgYW5kIHJlaW5pdGlhbGl6aW5nIGN1cmwgZW5kcyB1cCB3aXRoIGh0dHBzIHJlcXVlc3RzCiAgZmFpbGluZyB3aXRoICJBU04xIHBhcnNlcjogRWxlbWVudCB3YXMgbm90IGZvdW5kIiBlcnJvcnMuIE9idmlvdXNseSBhCiAgcmVncmVzc2lvbiBhZGRlZCBpbiA3LjE2LjMuCgpZYW5nIFRzZSAoOCBGZWIgMjAwOCkKLSBJbXByb3ZlZCB0ZXN0IGhhcm5lc3MgU0NQL1NGVFAgc3RhcnQgdXAgc2VydmVyIHZlcmlmaWNhdGlvbiwgZG9pbmcgYSByZWFsCiAgY29ubmVjdGlvbiB0byB0aGUgc2Z0cCBzZXJ2ZXIsIGF1dGhlbnRpY2F0aW5nIGFuZCBydW5uaW5nIGEgc2ltcGxlIHNmdHAKICBwd2QgY29tbWFuZCB1c2luZyB0aGUgdGVzdCBoYXJuZXNzIGdlbmVyYXRlZCBjb25maWd1cmF0aW9uIGFuZCBrZXkgZmlsZXMuCgpEYW5pZWwgUyAoOCBGZWIgMjAwOCkKLSBH/G50ZXIgS25hdWYgYWRkZWQgbGliL21rLWNhLWJ1bmRsZS5wbCB3aGljaCBnZXRzIHRoZSBGaXJlZm94IGNhIGJ1bmRsZSBhbmQKICBjcmVhdGVzIGEgc3VpdGFibGUgY2EtYnVuZGxlLmNydCBmaWxlIGluIFBFTSBmb3JtYXQgZm9yIHVzZSB3aXRoIGN1cmwuIFRoZQogIHJlY29tbWVuZGVkIHdheSB0byBydW4gaXQgaXMgdG8gdXNlICdtYWtlIGNhLWJ1bmRsZScgaW4gdGhlIGJ1aWxkIHRyZWUgcm9vdC4KCkRhbmllbCBGYW5kcmljaCAoNyBGZWIgMjAwOCkKLSBBZGRlZCB0ZXN0cyAxMDIyIGFuZCAxMDIzIHRvIHZhbGlkYXRlIG91dHB1dCBvZiBjdXJsLWNvbmZpZyAtLXZlcnNpb24gYW5kCiAgLS12ZXJudW0KCkRhbmllbCBTICg3IEZlYiAyMDA4KQotIFJlZmFjdG9yZWQgYSBsb3Qgb2YgdGltZW91dCBjb2RlIGludG8gYSBmZXcgZnVuY3Rpb25zIGluIGFuIGF0dGVtcHQgdG8gbWFrZQogIHRoZW0gYWxsIHVzZSB0aGUgc2FtZSAoaG9wZWZ1bGx5IGNvcnJlY3QpIGxvZ2ljIHRvIG1ha2UgaXQgbGVzcyBlcnJvci1wcm9uZQogIGFuZCBlYXNpZXIgdG8gaW50cm9kdWNlIGxpYnJhcnktd2lkZSB3aGVyZSBpdCBzaG91bGQgYmUgdXNlZC4KCllhbmcgVHNlICg2IEZlYiAyMDA4KQotIEZpeCBhbiBpc3N1ZSBpbiBzdHJkdXAgcmVwbGFjZW1lbnQgZnVuY3Rpb24gd2hlbiBkZWFsaW5nIHdpdGggYWJzb2x1dGVseQogIGh1Z2Ugc3RyaW5ncy4gT25seSBzeXN0ZW1zIHdpdGhvdXQgYSBzdGFuZGFyZCBzdHJkdXAgd291bGQgYmUgYWZmZWN0ZWQuCgpEYW5pZWwgUyAoMyBGZWIgMjAwOCkKLSBEbWl0cnkgS3Vyb2Noa2luIGNsZWFuZWQgdXAgdGhlIHBpcGVsaW5pbmcgY29kZSBhbmQgcmVtb3ZlZCB0aGUgbmVlZCBmb3IgYW5kCiAgdXNlIG9mIHRoZSAiaXNfaW5fcGlwZWxpbmUiIHN0cnVjdCBmaWVsZC4KCi0gSSB3cm90ZSB1cCBhbmQgYWRkZWQgdGhlIHRocmVhZGVkLXNzbC5jIGV4YW1wbGUgc291cmNlIGNvZGUgdGhhdCBzaG93cyBob3cKICB0byBkbyBtdWx0aS10aHJlYWRlZCBkb3dubG9hZHMgb2YgSFRUUFMgZmlsZXMgd2l0aCBhIGxpYmN1cmwgdGhhdCBpcyBidWlsdAogIHdpdGggT3BlblNTTC4gSXQgdXNlcyBwdGhyZWFkcyBmb3IgdGhlIHRocmVhZGluZy4KCkRhbmllbCBTICgzMSBKYW4gMjAwOCkKLSBOaWtsYXMgQW5nZWJyYW5kIG1hZGUgdGhlIGNvb2tpZSBzdXBwb3J0IGluIGxpYmN1cmwgcHJvcGVybHkgZGVhbCB3aXRoIHRoZQogICJIdHRwT25seSIgZmVhdHVyZSBpbnRyb2R1Y2VkIGJ5IE1pY3Jvc29mdCBhbmQgYXBwYXJlbnRseSBhbHNvIHN1cHBvcnRlZCBieQogIEZpcmVmb3g6IGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzMwNDYuYXNweCAuIEh0dHBPbmx5CiAgaXMgbm93IHN1cHBvcnRlZCB3aGVuIHJlY2VpdmVkIGZyb20gc2VydmVycyBpbiBIVFRQIGhlYWRlcnMsIHdoZW4gd3JpdHRlbiB0bwogIGNvb2tpZSBqYXJzIGFuZCB3aGVuIHJlYWQgZnJvbSBleGlzdGluZyBjb29raWUgamFycy4KCiAgSSBtb2RpZmllZCB0ZXN0IGNhc2UgMzEgYW5kIDQ2IHRvIGFsc28gZG8gc29tZSBiYXNpYyBIdHRwT25seSB0ZXN0aW5nLgoKLSBEbWl0cnkgS3Vyb2Noa2luIG1vdmVkIHNldmVyYWwgc3RydWN0IGZpZWxkcyBmcm9tIHRoZSBjb25uZWN0ZGF0YSBzdHJ1Y3QgdG8KICB0aGUgU2luZ2xlUmVxdWVzdCBvbmUgdG8gbWFrZSBwaXBlbGluaW5nIGJldHRlci4gSXQgaXMgYSBiaXQgdHJpY2t5IHRvIGtlZXAKICB0aGVtIGluIHRoZSByaWdodCBwbGFjZSwgdG8ga2VlcCB0aGluZ3MgcmVsYXRlZCB0byB0aGUgYWN0dWFsIHJlcXVlc3Qgb3IgdG8KICB0aGUgYWN0dWFsIGNvbm5lY3Rpb24gaW4gdGhlIHJpZ2h0IHBsYWNlLgoKRGFuaWVsIFMgKDI5IEphbiAyMDA4KQotIERtaXRyeSBLdXJvY2hraW4gZml4ZWQgQ3VybF9kb25lKCkgZm9yIHBpcGVsaW5pbmcsIGFzIGl0IGNvdWxkIHByZXZpb3VzbHkKICBjcmFzaCEKCi0gTWljaGFsIE1hcmVrIGZpeGVkIG1pbm9yIG1pc3Rha2UgaW4gdGVzdCBjYXNlIDU1MyB0aGF0IHByZXZlbnRlZCBpdCBmcm9tCiAgd29ya2luZyBvbiBvdGhlciBJUC1hZGRyZXNzZXMgb3IgcG9ydCBudW1iZXJzLgoKVmVyc2lvbiA3LjE4LjAgKDI4IEphbnVhcnkgMjAwOCkKCkRhbmllbCBTICgyNyBKYW4gMjAwOCkKLSBEbWl0cnkgS3Vyb2Noa2luOiBJbiAicmVhbCB3b3JsZCIgdGVzdGluZyBJIGZvdW5kIG1vcmUgYnVncyBpbgogIHBpcGVsaW5pbmcuIEJyb2tlbiBjb25uZWN0aW9uIGlzIG5vdCByZXN0b3JlZCBhbmQgd2UgZ2V0IGludG8gaW5maW5pdGUKICBsb29wLiBJdCBoYXBwZW5zIGJlY2F1c2Ugb2Ygd3JvbmcgaXNfaW5fcGlwZWxpbmUgdmFsdWVzLgoKRGFuaWVsIFMgKDI2IEphbiAyMDA4KQotIEtldmluIFJlZWQgZmlsZWQgYnVnIHJlcG9ydCAjMTg3OTM3NQogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTg3OTM3NSkgd2hpY2ggZGVzY3JpYmVzIGhvdyBsaWJjdXJsCiAgZ290IGxvc3QgaW4gdGhpcyBzY2VuYXJpbzogcHJveHkgdHVubmVsIChvciBIVFRQUyBvdmVyIHByb3h5KSwgYXNrIHRvIGRvIGFueQogIHByb3h5IGF1dGhlbnRpY2F0aW9uIGFuZCB0aGUgcHJveHkgcmVwbGllcyB3aXRoIGFuIGF1dGggKGxpa2UgTlRMTSkgYW5kIHRoZW4KICBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gYWZ0ZXIgdGhhdCBpbml0aWFsIGluZm9ybWF0aW9uYWwgcmVzcG9uc2UuCgogIGxpYmN1cmwgd291bGQgbm90IHByb3Blcmx5IHJlLWluaXRpYWxpemUgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHByb3h5IGFuZAogIGNvbnRpbnVlIHRoZSBhdXRoIG5lZ290aWF0aW9uIGxpa2Ugc3VwcG9zZWQuIEl0IGRvZXMgbm93IGhvd2V2ZXIsIGFzIGl0IHdpbGwKICBub3cgZGV0ZWN0IGlmIG9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgd2VyZSBhdmFpbGFibGUgYW5kIGFza2VkCiAgZm9yLCBhbmQgd2lsbCB0aHVzIHJldHJ5IHRoZSBjb25uZWN0aW9uIGFuZCBjb250aW51ZSBmcm9tIHRoZXJlLgoKLSBJIG1hZGUgdGhlIHByb2dyZXNzIGNhbGxiYWNrIGdldCBjYWxsZWQgcHJvcGVybHkgZHVyaW5nIHByb3h5IENPTk5FQ1QuCgpEYW5pZWwgUyAoMjMgSmFuIDIwMDgpCi0gSWdvciBGcmFuY2h1ayBwb2ludGVkIG91dCB0aGF0IENVUkxPUFRfQ09PS0lFTElTVCBzZXQgdG8gIkFMTCIgbGVha2VkCiAgbWVtb3J5LCBhbmQgc28gZGlkICJTRVNTIi4gRml4ZWQgbm93LgoKWWFuZyBUc2UgKDIyIEphbiAyMDA4KQotIENoZWNrIHBvbGwuaCBhdCBjb25maWd1cmF0aW9uIHRpbWUsIGFuZCB1c2UgaXQgd2hlbiBzeXMvcG9sbC5oIHVuYXZhaWxhYmxlCgpEYW5pZWwgUyAoMjIgSmFuIDIwMDgpCi0gRG1pdHJ5IEt1cm9jaGtpbiByZW1vdmVkIHRoZSBjYW5jZWxsZWQgc3RhdGUgZm9yIHBpcGVsaW5pbmcsIGFzIHdlIGFncmVlZAogIHRoYXQgaXQgaXMgYmFkIGFueXdheS4gU3RhcnRpbmcgbm93LCByZW1vdmluZyBhIGhhbmRsZSB0aGF0IGlzIGluIHVzZWQgaW4gYQogIHBpcGVsaW5lIHdpbGwgYnJlYWsgdGhlIHBpcGVsaW5lIC0gaXQnbGwgYmUgc2V0IGJhY2sgdXAgYWdhaW4gYnV0IHN0aWxsLi4uCgpZYW5nIFRzZSAoMjEgSmFuIDIwMDgpCi0gRGlzYWJsZSBsZGFwIHN1cHBvcnQgZm9yIGN5Z3dpbiBidWlsZHMsIHNpbmNlIGl0IGJyZWFrcyB3aG9sZSBidWlsZCBwcm9jZXNzLgogIEZpeGluZyBpdCB3aWxsIGFmZmVjdCBvdGhlciBwbGF0Zm9ybXMsIHNvIGl0IGlzIHBvc3Rwb25lZCBmb3IgYW5vdGhlciByZWxlYXNlLgoKRGFuaWVsIFMgKDE4IEphbiAyMDA4KQotIExhdSBIYW5nIEtpbiBmb3VuZCBhbmQgZml4ZWQgYSBwcm9ibGVtIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSB3aGVuIGRvaW5nCiAgQ09OTkVDVCBvdmVyIGEgcHJveHkuIGN1cmxfbXVsdGlfZmRzZXQoKSBkaWRuJ3QgcmVwb3J0IGJhY2sgdGhlIHNvY2tldAogIHByb3Blcmx5IGR1cmluZyB0aGF0IHN0YXRlLCBkdWUgdG8gYSBtaXNzaW5nIGNhc2UgaW4gdGhlIHN3aXRjaCBpbiB0aGUKICBtdWx0aV9nZXRzb2NrKCkgZnVuY3Rpb24uCgpZYW5nIFRzZSAoMTcgSmFuIDIwMDgpCi0gRG9uJ3QgYWJvcnQgdGVzdHMgNTE4IGFuZCA1Mzcgd2hlbiB1bmFibGUgdG8gcmFpc2UgdGhlIG9wZW4tZmlsZSBzb2Z0IGxpbWl0LgoKRGFuaWVsIFMgKDE2IEphbiAyMDA4KQotIE5hdGhhbiBDb3VsdGVyJ3MgcGF0Y2ggdGhhdCBtYWtlcyBydW50ZXN0cy5wbCByZXNwZWN0IHRoZSBQQVRIIHdoZW4gZmlndXJpbmcKICBvdXQgd2hhdCB2YWxncmluZCB0byBydW4uCgpZYW5nIFRzZSAoMTYgSmFuIDIwMDgpCi0gSW1wcm92ZWQgaGFuZGxpbmcgb2Ygb3V0IG9mIG1lbW9yeSBpbiB0aGUgY29tbWFuZCBsaW5lIHRvb2wgdGhhdCBhZmVjdGVkCiAgZGF0YSB1cmwgZW5jb2RlZCBIVFRQIFBPU1RzIHdoZW4gcmVhZGluZyBpdCBmcm9tIGEgZmlsZS4KCkRhbmllbCBTICgxNiBKYW4gMjAwOCkKLSBEbWl0cnkgS3Vyb2Noa2luIHdvcmtlZCBhIGxvdCBvbiBpbXByb3ZpbmcgdGhlIEhUVFAgUGlwZWxpbmluZyBzdXBwb3J0IHRoYXQKICBwcmV2aW91c2x5IGhhZCBhIG51bWJlciBvZiBmbGF3cywgcGVyaGFwcyBtb3N0IG5vdGFibHkgd2hlbiBhbiBhcHBsaWNhdGlvbgogIGZpcmVkIHVwIE4gdHJhbnNmZXJzIGF0IG9uY2UgYXMgdGhlbiB0aGV5IHdvdWxkbid0IHBpcGVsaW5lIGF0IGFsbCB0aGF0CiAgbmljZWx5IGFzIGFueW9uZSB3b3VsZCB0aGluay4uLiBUZXN0IGNhc2UgNTMwIHdhcyBhbHNvIHVwZGF0ZWQgdG8gdGFrZSB0aGUKICBpbXByb3ZlZCBmdW5jdGlvbmFsaXR5IGludG8gYWNjb3VudC4KCi0gQ2FsbHMgdG8gQ3VybF9mYWlsZigpIGFyZSBub3Qgc3VwcG9zZWQgdG8gcHJvdmlkZSBhIHRyYWlsaW5nIG5ld2xpbmUgYXMgdGhlCiAgZnVuY3Rpb24gaXRzZWxmIGFkZHMgdGhhdC4gRml4ZWQgb24gNTAgb3Igc29tZXRoaW5nIHN0cmluZ3MhCgpEYW5pZWwgUyAoMTUgSmFuIDIwMDgpCi0gSSBtYWRlIHRoZSB0b3J0dXJlIHRlc3Qgb24gdGVzdCA1MzAgZ28gdGhyb3VnaC4gVGhpcyB3YXMgYWN0dWFsbHkgZHVlIHRvCiAgc2lsbHkgY29kZSBsZWZ0IGZyb20gd2hlbiB3ZSBzd2l0Y2hlZCB0byBsZXQgdGhlIG11bHRpIGhhbmRsZSAiaG9sZCIgdGhlIGRucwogIGNhY2hlIHdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZS4uLiBPZiBjb3Vyc2UgdGhpcyBvbmx5IHRyaWdnZXJlZCB3aGVuIGEKICBjZXJ0YWluIGZ1bmN0aW9uIGNhbGwgcmV0dXJuZWQgZXJyb3IgYXQgdGhlIGNvcnJlY3QgbW9tZW50LgoKRGFuaWVsIFMgKDE0IEphbiAyMDA4KQotIEpvZSBNYWxpY2tpIGZpbGVkIGJ1ZyByZXBvcnQgIzE4NzEyNjkKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NzEyNjkpIGFuZCB3ZSBjb3VsZCBmaXggaGlzIGhhbmctCiAgcHJvYmxlbSB0aGF0IG9jY3VycmVkIHdoZW4gZG9pbmcgYSBsYXJnZSBIVFRQIFBPU1QgcmVxdWVzdCB3aXRoIHRoZQogIHJlc3BvbnNlLWJvZHkgcmVhZCBmcm9tIGEgY2FsbGJhY2suCgpEYW5pZWwgUyAoMTIgSmFuIDIwMDgpCi0gSSByZS1hcnJhbmdlZCB0aGUgY3VybCAtLWhlbHAgb3V0cHV0LiBBbGwgdGhlIG9wdGlvbnMgYXJlIG5vdyBzb3J0ZWQgb24KICB0aGVpciBsb25nIG9wdGlvbiBuYW1lcyBhbmQgYWxsIGRlc2NyaXB0aW9ucyBhcmUgb25lLWxpbmVycy4KCi0gRXJpYyBMYW5kZXMgcHJvdmlkZWQgdGhlIHBhdGNoIChlZGl0ZWQgYnkgbWUpIHRoYXQgaW50cm9kdWNlcyB0aGUKICAtLWtlZXBhbGl2ZS10aW1lIHRvIGN1cmwgdG8gc2V0IHRoZSBrZWVwYWxpdmUgcHJvYmUgaW50ZXJ2YWwuIEkgYWxzbyB0b29rCiAgdGhlIG9wcG9ydHVuaXR5IHRvIHJlbmFtZSB0aGUgcmVjZW50bHkgYWRkZWQgbm8ta2VlcC1hbGl2ZSBvcHRpb24gdG8KICBuby1rZWVwYWxpdmUgdG8ga2VlcCBhIGNvbnNpc3RlbnQgbmFtaW5nIGFuZCB0byBhdm9pZCBnZXR0aW5nIHR3byBkYXNoZXMgaW4KICB0aGVzZSBvcHRpb24gbmFtZXMuIEVyaWMgYWxzbyBwcm92aWRlZCBhbiB1cGRhdGUgdG8gdGhlIG1hbiBwYWdlIGZvciB0aGUgbmV3CiAgb3B0aW9uLgoKRGFuaWVsIFMgKDExIEphbiAyMDA4KQotIERhbmllbCBFZ2dlciBtYWRlIENVUkxPUFRfUkFOR0Ugd29yayBvbiBmaWxlOi8vIFVSTHMgdGhlIHZlcnkgc2FtZSB3YXkgaXQKICBhbHJlYWR5IHdvcmtlZCBmb3IgRlRQOi8vIFVSTHMuCgotIEkgbWFkZSB0aGUgY3VybCB0b29sIHN3aXRjaCBmcm9tIHVzaW5nIENVUkxPUFRfSU9DVExGVU5DVElPTiB0byBub3cgdXNlIHRoZQogIHNwYW5raW5nIG5ldyBDVVJMT1BUX1NFRUtGVU5DVElPTiBzaW1wbHkgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGltcHJvdmVkCiAgcGVyZm9ybWFuY2UgZm9yIHRoZSB1cGxvYWQgcmVzdW1lIGNhc2VzIHdoZXJlIHlvdSB3YW50IHRvIHVwbG9hZCB0aGUgbGFzdAogIGZldyBieXRlcyBvZiBhIHZlcnkgbGFyZ2UgZmlsZS4gVG8gaW1wbGVtZW50IHRoaXMgZGVjZW50bHksIEkgaGFkIHRvIHN3aXRjaAogIHRoZSBjbGllbnQgY29kZSBmb3IgdXBsb2FkaW5nIGZyb20gZm9wZW4oKS9mcmVhZCgpIHRvIHBsYWluIG9wZW4oKS9yZWFkKCkgc28KICB0aGF0IHdlIGNhbiB1c2UgbHNlZWsoKSB0byBkbyA+MzJiaXQgc2Vla3MgKGFzIGZzZWVrKCkgZG9lc24ndCBhbGxvdyB0aGF0KQogIG9uIHN5c3RlbXMgdGhhdCBvZmZlciBzdXBwb3J0IGZvciB0aGF0LgoKRGFuaWVsIFMgKDEwIEphbiAyMDA4KQotIE1pY2hhbCBNYXJlayBtYWRlIGN1cmwtY29uZmlnIC0tbGlicyBub3QgaW5jbHVkZSAvdXNyL2xpYjY0IGluIHRoZSBvdXRwdXQKICAoaXQgYWxyZWFkeSBiZWZvcmUgc2tpcHBlZCAvdXNyL2xpYikuICAvdXNyL2xpYjY0IGlzIHRoZSBkZWZhdWx0IGxpYnJhcnkKICBkaXJlY3Rvcnkgb24gbWFueSA2NGJpdCBzeXN0ZW1zIGFuZCBpdCdzIHVubGlrZWx5IHRoYXQgYW55b25lIHdvdWxkIHVzZSB0aGUKICBwYXRoIHByaXZhdGVseSBvbiBzeXN0ZW1zIHdoZXJlIGl0J3Mgbm90LgoKLSBHZW9yZyBMaXBwaXRzY2ggYnJvdWdodCBDVVJMT1BUX1NFRUtGVU5DVElPTiBhbmQgQ1VSTE9QVF9TRUVLREFUQSB0byBhbGxvdwogIGxpYmN1cmwgdG8gc2VlayBpbiBhIGdpdmVuIGlucHV0IHN0cmVhbS4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IHdoZW4KICBkb2luZyB1cGxvYWQgcmVzdW1lcyB3aGVuIHRoZXJlJ3MgYWxyZWFkeSBhIGh1Z2UgcGFydCBvZiB0aGUgZmlsZSBwcmVzZW50CiAgcmVtb3RlbHkuIEJlZm9yZSwgYW5kIHN0aWxsIGlmIHRoaXMgY2FsbGJhY2sgaXNuJ3QgdXNlZCwgbGliY3VybCB3aWxsIHJlYWQKICBhbmQgdGhyb3VnaCBhd2F5IHRoZSBlbnRpcmUgZmlsZSB1cCB0byB0aGUgcG9pbnQgdG8gd2hlcmUgdGhlIHJlc3VtaW5nCiAgYmVnaW5zICh3aGljaCBvZiBjb3Vyc2UgY2FuIGJlIGEgc2xvdyBvcGVyZXJhdGlvbiBkZXBlbmRpbmcgb24gZmlsZSBzaXplLAogIEkvTyBiYW5kd2lkdGggYW5kIG1vcmUpLiBUaGlzIG5ldyBmdW5jdGlvbiB3aWxsIGFsc28gYmUgcHJlZmVycmVkIHRvIGdldAogIHVzZWQgaW5zdGVhZCBvZiB0aGUgQ1VSTE9QVF9JT0NUTEZVTkNUSU9OIGZvciBzZWVraW5nIGJhY2sgaW4gYSBzdHJlYW0gd2hlbgogIGRvaW5nIG11bHRpLXN0YWdlIEhUVFAgYXV0aCB3aXRoIFBPU1QvUFVULgoKLSBOaWtpdGluc2tpdCBEbWl0cml5IGZpbGVkIGJ1ZyByZXBvcnQgIzE4NjgyNTUKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NjgyNTUpIHdpdGggYSBwYXRjaC4gSXQgaWRlbnRpZmllcwogIGFuZCBmaXhlcyBhIHByb2JsZW0gd2l0aCBwYXJzaW5nIFdXVy1BdXRoZW50aWNhdGU6IGhlYWRlcnMgd2l0aCBhZGRpdGlvbmFsCiAgc3BhY2VzIGluIHRoZSBsaW5lIHRoYXQgdGhlIHBhcnNlciB3YXNuJ3Qgd3JpdHRlbiB0byBkZWFsIHdpdGguCgpEYW5pZWwgUyAoOCBKYW4gMjAwOCkKLSBJbnRyb2R1Y2luZyBjdXJsX2Vhc3lfcGF1c2UoKSBhbmQgbmV3IG1hZ2ljIHJldHVybiBjb2RlcyBmb3IgYm90aCB0aGUgcmVhZAogIGFuZCB0aGUgd3JpdGUgY2FsbGJhY2tzIHRoYXQgbm93IGNhbiBtYWtlIGEgY29ubmVjdGlvbidzIHJlYWRpbmcgYW5kL29yCiAgd3JpdGluZyBnZXQgcGF1c2VkLgoKRGFuaWVsIFMgKDYgSmFuIDIwMDgpCi0gSmVmZiBKb2huc29uIGZpbGVkIGJ1ZyByZXBvcnQgIzE4NjMxNzEKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NjMxNzEpIHdoZXJlIGhlIHBvaW50ZWQgb3V0IHRoYXQKICBsaWJjdXJsJ3MgZGF0ZSBwYXJzZXIgZGlkbid0IGFjY2VwdCBhICsxMzAwIHRpbWUgem9uZSB3aGljaCBhY3R1YWxseSBpcyB1c2VkCiAgZmFpcmx5IG9mdGVuIChsaWtlIE5ldyBaZWFsYW5kJ3MgRGFpbGlnaHQgU2F2aW5ncyBUaW1lKSwgc28gSSBtb2RpZmllZCB0aGUKICBwYXJzZXIgdG8gbm93IGFjY2VwdCB1cCB0byBhbmQgaW5jbHVkaW5nIC0xNDAwIHRvICsxNDAwLgoKRGFuaWVsIFMgKDUgSmFuIDIwMDgpCi0gQmFzZWQgb24gZnVydGhlciBkaXNjdXNzaW9uIG9uIGN1cmwtbGlicmFyeSwgSSByZXZlcnRlZCB5ZXN0ZXJkYXkncyBTT0NLUzUKICBjb2RlIHRvIGluc3RlYWQgaW50cm9kdWNlIHN1cHBvcnQgZm9yIGEgbmV3IHByb3h5IHR5cGUgY2FsbGVkCiAgQ1VSTFBST1hZX1NPQ0tTNV9IT1NUTkFNRSB0aGF0IGlzIHVzZWQgdG8gc2VuZCB0aGUgaG9zdCBuYW1lIHRvIHRoZSBwcm94eQogIGluc3RlYWQgb2YgSVAgYWRkcmVzcyBhbmQgdGhlcmUncyB0aHVzIG5vIGxvbmdlciBhbnkgbmVlZCBmb3IgYSBuZXcKICBjdXJsX2Vhc3lfc2V0b3B0KCkgb3B0aW9uLgoKICBUaGUgZGVmYXVsdCBTT0NLUzUgcHJveHkgaXMgYWdhaW4gYmFjayB0byBzZW5kaW5nIHRoZSBJUCBhZGRyZXNzIHRvIHRoZQogIHByb3h5LiAgVGhlIG5ldyBjdXJsIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIGVuYWJsaW5nIHNlbmRpbmcgaG9zdCBuYW1lIHRvIGEKICBTT0NLUzUgcHJveHkgaXMgbm93IC0tc29ja3M1LWhvc3RuYW1lLgoKRGFuaWVsIFMgKDQgSmFuIDIwMDgpCi0gQmFzZWQgb24gTWF4aW0gUGVyZW5lc2Vua28ncyBwYXRjaCwgd2Ugbm93IGRvIFNPQ0tTNSBvcGVyYXRpb25zIGFuZCBsZXQgdGhlCiAgcHJveHkgZG8gdGhlIGhvc3QgbmFtZSByZXNvbHZpbmcgYW5kIG9ubHkgaWYgLS1zb2NrczVpcCAob3IKICBDVVJMT1BUX1NPQ0tTNV9SRVNPTFZFX0xPQ0FMKSBpcyB1c2VkIHdlIHJlc29sdmUgdGhlIGhvc3QgbmFtZSBsb2NhbGx5IGFuZAogIHBhc3Mgb24gdGhlIElQIGFkZHJlc3Mgb25seSB0byB0aGUgcHJveHkuCgpZYW5nIFRzZSAoMyBKYW4gMjAwOCkKLSBNb2RpZmllZCB0ZXN0IGhhcm5lc3MgdG8gYWxsb3cgU0NQLCBTRlRQIGFuZCBTT0NLUzQgdGVzdHMgdG8gcnVuIHdpdGgKICBPcGVuU1NIIDIuOS45LCBTdW5TU0ggMS4wIG9yIGxhdGVyIHZlcnNpb25zLiBTT0NLUzUgdGVzdHMgbmVlZCBPcGVuU1NICiAgMy43LCBTdW5TU0ggMS4wIG9yIGxhdGVyLgoKRGFuaWVsIFMgKDIgSmFuIDIwMDgpCi0gSSBmaXhlZCB0d28gY2FzZXMgb2YgbWlzc2luZyByZXR1cm4gY29kZSBjaGVja3Mgd2hlbiBoYW5kbGluZyBjaHVua2VkCiAgZGVjb2Rpbmcgd2hlcmUgYSB3cml0ZSBlcnJvciAob3IgYWJvcnQgcmV0dXJuIGZyb20gYSBjYWxsYmFjaykgZGlkbid0IHN0b3AKICBsaWJjdXJsJ3MgcHJvY2Vzc2luZy4KCi0gSSByZW1vdmVkIHRoZSBzb2NrbGVuX3QgdXNlIGZyb20gdGhlIHB1YmxpYyBjdXJsL2N1cmwuaCBoZWFkZXIgYW5kIGluc3RlYWQKICBtYWRlIGl0IGFuIHVuc2lnbmVkIGludC4gVGhlIHR5cGUgd2FzIG9ubHkgdXNlZCBpbiB0aGUgY3VybF9zb2NrYWRkciBzdHJ1Y3QKICBkZWZpbml0aW9uIChvbmx5IHVzZWQgYnkgdGhlIGN1cmxfb3BlbnNvY2tldF9jYWxsYmFjaykuIE9uIGFsbCBwbGF0Zm9ybXMgSQogIGNvdWxkIGZpbmQgaW5mb3JtYXRpb24gYWJvdXQsIHNvY2tsZW5fdCBpcyAzMiB1bnNpZ25lZCBiaXRzIGxhcmdlIHNvIEkgZG9uJ3QKICB0aGluayB0aGlzIHdpbGwgYnJlYWsgdGhlIEFQSSBvciBBQkkuIFRoZSBtYWluIHJlYXNvbiBmb3IgdGhpcyBjaGFuZ2UgaXMgb2YKICBjb3Vyc2UgZm9yIGFsbCB0aGUgcGxhdGZvcm1zIHRoYXQgZG9uJ3QgaGF2ZSBhIHNvY2tsZW5fdCBkZWZpbml0aW9uIGluIHRoZWlyCiAgaGVhZGVycyB0byBidWlsZCBmaW5lIGFnYWluLiBQcm92aWRpbmcgb3VyIG93biBjb25maWd1cmUgbWFnaWMgYW5kIGN1c3RvbQogIGRlZmluaXRpb24gb2Ygc29ja2xlbl90IG9uIHRob3NlIHN5c3RlbXMgcHJvdmVkIHRvIHdvcmsgYnV0IHdhcyBhIGxvdCBvZgogIGNydWZ0LCBjb2RlIGFuZCBleHRyYSBtYWdpYyBuZWVkZWQgLSB3aGVuIHRoaXMgdmVyeSBzbWFsbCBjaGFuZ2Ugb2YgdHlwZQogIHNlZW1zIGhhcm1sZXNzIGFuZCBzdGlsbCBzb2x2ZXMgdGhlIG1pc3Npbmcgc29ja2xlbl90IHByb2JsZW0uCgotIFJpY2hhcmQgQXR0ZXJlciBicm91Z2h0IGEgcGF0Y2ggdGhhdCBhZGRlZCBzdXBwb3J0IGZvciBTT0NLUzRhIHByb3hpZXMsCiAgd2hpY2ggaXMgYW4gaW5vZmZpY2lhbCBQUk9YWTQgdmFyaWFudCB0aGF0IHNlbmRzIHRoZSBob3N0bmFtZSB0byB0aGUgcHJveHkKICBpbnN0ZWFkIG9mIHRoZSByZXNvbHZlZCBhZGRyZXNzICh3aGljaCBpcyBhbHJlYWR5IHN1cHBvcnRlZCBieSBTT0NLUzUpLgogIC0tc29ja3M0YSBpcyB0aGUgY3VybCBjb21tYW5kIGxpbmUgb3B0aW9uIGZvciBpdCBhbmQgQ1VSTE9QVF9QUk9YWVRZUEUgY2FuCiAgbm93IGJlIHNldCB0byBDVVJMUFJPWFlfU09DS1M0QSBhcyB3ZWxsLgoKRGFuaWVsIFMgKDEgSmFuIDIwMDgpCi0gTW9odW4gQmlzd2FzIHBvaW50ZWQgb3V0IHRoYXQgLS1saWJjdXJsIGdlbmVyYXRlZCBhIHNvdXJjZSBjb2RlIHdpdGggYW4gaW50CiAgZnVuY3Rpb24gYnV0IHdpdGhvdXQgYSByZXR1cm4gc3RhdGVtZW50LiBXaGlsZSBmaXhpbmcgdGhhdCwgSSBhbHNvIHRvb2sgY2FyZQogIGFib3V0IGFkZGluZyBzb21lIGJldHRlciBjb21tZW50cyBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlLgoKRGFuaWVsIFMgKDI3IERlYyAyMDA3KQotIERtaXRyeSBLdXJvY2hraW4gbWVudGlvbmVkIGEgZmxhdwogIChodHRwczovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA3LTEyLzAyNTIuaHRtbCkgaW4gZGV0ZWN0X3Byb3h5KCkgd2hpY2gKICBmYWlsZWQgdG8gc2V0IHRoZSBiaXRzLnByb3h5IHZhcmlhYmxlIHByb3Blcmx5IHdoZW4gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUKICB0b2xkIGxpYmN1cmwgdG8gdXNlIGEgaHR0cCBwcm94eS4KCkRhbmllbCBTICgyNiBEZWMgMjAwNykKLSBJbiBhbiBhdHRlbXB0IHRvIHJlcGVhdCB0aGUgcHJvYmxlbSBpbiBidWcgcmVwb3J0ICMxODUwNzMwCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODUwNzMwKSBJIHdyb3RlIHVwIHRlc3QgY2FzZSA1NTIuIFRoZQogIHRlc3QgaXMgZG9pbmcgYSA3MEsgUE9TVCB3aXRoIGEgcmVhZCBjYWxsYmFjayBhbmQgYW4gaW9jdGwgY2FsbGJhY2sgb3ZlciBhCiAgcHJveHkgcmVxdWlyaW5nIERpZ2VzdCBhdXRoLiBUaGUgdGVzdCBjYXNlIGNvZGUgaXMgbW9yZSBvciBsZXNzIGlkZW50aWNhbCB0bwogIHRoZSB0ZXN0IHJlY2lwZSBjb2RlIHByb3ZpZGVkIGJ5IFNwYWNlbiBKYXNzZXQgKHdobyBzdWJtaXR0ZWQgdGhlIGJ1ZwogIHJlcG9ydCkuCgpEYW5pZWwgUyAoMjUgRGVjIDIwMDcpCi0gR2FyeSBNYXh3ZWxsIGZpbGVkIGJ1ZyByZXBvcnQgIzE4NTY2MjgKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NTY2MjgpIGFuZCBwcm92aWRlZCBhIGZpeCBmb3IgdGhlCiAgKHNtYWxsKSBtZW1vcnkgbGVhayBpbiB0aGUgU1NMIHNlc3Npb24gSUQgY2FjaGluZyBjb2RlLiBJdCBoYXBwZW5lZCB3aGVuIGEKICBwcmV2aW91cyBlbnRyeSBpbiB0aGUgY2FjaGUgd2FzIHJlLXVzZWQuCgpEYW5pZWwgRmFuZHJpY2ggKDE5IERlYyAyMDA3KQotIEVuc3VyZSB0aGF0IG5yb2ZmIGRvZXNuJ3QgcHV0IGFueXRoaW5nIGJ1dCBBU0NJSSBjaGFyYWN0ZXJzIGludG8gdGhlCiAgLS1tYW51YWwgdGV4dC4KCllhbmcgVHNlICgxOCBEZWMgMjAwNykKLSBNU1ZDIDkuMCAoVlMyMDA4KSBkb2VzIG5vdCBzdXBwb3J0IFdpbmRvd3MgYnVpbGQgdGFyZ2V0cyBwcmlvciB0byBXaW5YUCwKICBhbmQgbWFrZXMgd3JvbmcgYXN1bXB0aW9ucyBvZiBidWlsZCB0YXJnZXQgd2hlbiBpdCBpc24ndCBzcGVjaWZpZWQuIFNvLAogIGlmIG5vIGJ1aWxkIHRhcmdldCBoYXMgYmVlbiBkZWZpbmVkIHdlIHdpbGwgdGFyZ2V0IFdpblhQIHdoZW4gYnVpbGRpbmcKICBjdXJsL2xpYmN1cmwgd2l0aCBNU1ZDIDkuMCAoVlMyMDA4KS4KCi0gKGh0dHBzOi8vY3VybC5oYXh4LnNlL21haWwvYXJjaGl2ZS0yMDA3LTEyLzAwMzkuaHRtbCkgcmVwb3J0ZWQgYW5kIGZpeGVkCiAgYSBmaWxlIHRydW5jYXRpb24gcHJvYmxlbSBvbiBXaW5kb3dzIGJ1aWxkIHRhcmdldHMgdHJpZ2dlcmVkIHdoZW4gcmV0cnlpbmcKICBhIGRvd25sb2FkIHdpdGggY3VybC4KCkRhbmllbCBTICgxNyBEZWMgMjAwNykKLSBNYXRldXN6IExvc2tvdCBwb2ludGVkIG91dCB0aGF0IE1TVkMgOS4wIChWUzIwMDgpIGhhcyB0aGUgcG9sbGZkIHN0cnVjdCBhbmQKICBkZWZpbmVzIGluIHdpbnNvY2syLmggc29tZWhvdyBkaWZmZXJlbnRseSB0aGFuIHByZXZpb3VzIHZlcnNpb25zIGFuZCB0aGF0CiAgY3VybCA3LjE3LjEgd291bGQgZmFpbCB0byBjb21waWxlIG91dCBvZiB0aGUgYm94LgoKRGFuaWVsIFMgKDEzIERlYyAyMDA3KQotIERhdmlkIFdyaWdodCBmaWxlZCBidWcgcmVwb3J0ICMxODQ5NzY0CiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODQ5NzY0KSB3aXRoIGFuIGluY2x1ZGVkIGZpeC4gSGUKICBpZGVudGlmaWVkIGEgcHJvYmxlbSBmb3IgcmUtdXNlZCBjb25uZWN0aW9ucyB0aGF0IHByZXZpb3VzbHkgaGFkIHNlbnQKICBFeHBlY3Q6IDEwMC1jb250aW51ZSBhbmQgaW4gc29tZSBzaXR1YXRpb25zIHRoZSBzdWJzZXF1ZW50IFBPU1QgKHRoYXQgZGlkbid0CiAgdXNlIEV4cGVjdDopIHN0aWxsIGhhZCB0aGUgaW50ZXJuYWwgZmxhZyBzZXQgZm9yIGl0cyB1c2UuIERhdmlkJ3MgZml4ICh0aGF0CiAgbWFrZXMgdGhlIHNldHRpbmcgb2YgdGhlIGZsYWcgaW4gZXZlcnkgc2luZ2xlIHJlcXVlc3QgdW5jb25kaXRpb25hbGx5KSBpcwogIGZpbmUgYW5kIGlzIG5vdyB1c2VkIQoKRGFuaWVsIFMgKDEyIERlYyAyMDA3KQotIEdpbGxlcyBCbGFuYyBtYWRlIHRoZSBjdXJsIHRvb2wgZW5hYmxlIFNPX0tFRVBBTElWRSBmb3IgdGhlIGNvbm5lY3Rpb25zIGFuZAogIGFkZGVkIHRoZSAtLW5vLWtlZXAtYWxpdmUgb3B0aW9uIHRoYXQgY2FuIGRpc2FibGUgdGhhdCBvbiBkZW1hbmQuCgpEYW5pZWwgUyAoOSBEZWMgMjAwNykKLSBBbmRyZXcgTW9pc2UgZmlsZWQgYnVnIHJlcG9ydCAjMTg0NzUwMQogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTg0NzUwMSkgYW5kIHBvaW50ZWQgb3V0IGEgbWVtY3B5KCkKICB0aGF0IHNob3VsZCBiZSBtZW1tb3ZlKCkgaW4gdGhlIGNvbnZlcnRfbGluZWVuZHMoKSBmdW5jdGlvbi4KCkRhbmllbCBTICg4IERlYyAyMDA3KQotIFJlbmFtZWQgYWxsIGludGVybmFsIHN0YXRpYyBmdW5jdGlvbnMgdGhhdCBoYWQgQ3VybF8gcHJlZml4ZXMgdG8gbm8gbG9uZ2VyCiAgaGF2ZSB0aGVtLiBUaGUgQ3VybF8gcHJlZml4IGlzIGV4Y2x1c2l2ZWx5IHVzZWQgZm9yIGxpYnJhcnkgaW50ZXJuYWwgZ2xvYmFsCiAgc3ltYm9scy4gU3RhdGljIGZ1bmN0aW9ucyBjYW4gYmUgbmFtZWQgYW55dGhpbmcsIGV4Y2VwdCBmb3IgdXNpbmcgQ3VybF8gb3IKICBjdXJsXyBwcmVmaXhlcy4gVGhpcyBpcyBmb3IgY29uc2lzdGVuY3kgYW5kIGZvciBlYXNpZXIgbWFpbnRhaW5hbmNlIGFuZAogIG92ZXJ2aWV3LgoKLSBDbGVhbmVkIHVwIGFuZCByZWZvcm1hdHRlZCB0aGUgVE9ETyBkb2N1bWVudCB0byBsb29rIGxpa2UgdGhlIEZBUSBhbmQKICBDT05UUklCVVRFLCB3aGljaCBtYWtlcyBuaWNlciB3ZWIgcGFnZXMKCi0gQWRkZWQgdGVzdCBjYXNlcyA1NDkgYW5kIDU1MCB0aGF0IHRlc3QgQ1VSTE9QVF9QUk9YWV9UUkFOU0ZFUl9NT0RFLgoKLSBBZGRlZCBrZXl3b3JkcyBvbiBhIGJ1bmNoIG9mIHRlc3QgY2FzZXMKCi0gRml4ZWQgYW4gT09NIHByb2JsZW0gaW4gdGhlIGN1cmwgY29kZSB0aGF0IHdvdWxkIGxlYWQgdG8gZmNsb3NlIG9uIGEgYmFkCiAgaGFuZGxlIGFuZCBjcmFzaAoKRGFuaWVsIFMgKDUgRGVjIDIwMDcpCi0gU3BhY2VuIEphc3NldCByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBkb2luZyBQT1NUICh3aXRoIGRhdGEgcmVhZCB3aXRoIGEKICBjYWxsYmFjaykgb3ZlciBhIHByb3h5IHdoZW4gTlRMTSBpcyB1c2VkIGFzIGF1dGggd2l0aCB0aGUgcHJveHkuIFRoZSBidWcKICBhbHNvIGNvbmNlcm5lZCBEaWdlc3QgYW5kIHdhcyBsaW1pdGVkIHRvIHVzaW5nIGNhbGxiYWNrIG9ubHkuIFNwYWNlbiB3b3JrZWQKICB3aXRoIHVzIHRvIHByb3ZpZGUgYSB1c2VmdWwgcGF0Y2guIEkgYWRkZWQgdGhlIHRlc3QgY2FzZSA1NDcgYW5kIDU0OCB0bwogIHZlcmlmeSB0d28gdmFyaWF0aW9ucyBvZiBQT1NUIG92ZXIgcHJveHkgd2l0aCBOVExNLgoKRGFuaWVsIFMgKDMgRGVjIDIwMDcpCi0gUmF5IFBla293c2tpIGZpbGVkIGJ1ZyByZXBvcnQgIzE4NDIwMjkKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NDIwMjkpIGluIHdoaWNoIGhlIGlkZW50aWZpZWQgYQogIHByb2JsZW0gd2l0aCBTU0wgc2Vzc2lvbiBjYWNoaW5nIHRoYXQgcHJldmVudCBpdCBmcm9tIHdvcmtpbmcsIGFuZCBwcm92aWRlZAogIHRoZSBhc3NvY2lhdGVkIGZpeCEKCi0gTm93IGxpYmN1cmwgKGJ1aWx0IHdpdGggT3BlblNTTCkgZG9lc24ndCByZXR1cm4gZXJyb3IgYW55bW9yZSBpZiB0aGUgcmVtb3RlCiAgU1NMLWJhc2VkIHNlcnZlciBkb2Vzbid0IHByZXNlbnQgYSBjZXJ0aWZpY2F0ZSB3aGVuIHRoZSByZXF1ZXN0IGlzIHRvbGQgdG8KICBpZ25vcmUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGFueXdheS4KCi0gTWljaGFsIE1hcmVrIGludHJvZHVjZWQgQ1VSTE9QVF9QUk9YWV9UUkFOU0ZFUl9NT0RFIHdoaWNoIGlzIHVzZWQgdG8gY29udHJvbAogIHRoZSBhcHBlbmRpbmcgb2YgdGhlICJ0eXBlPSIgdGhpbmcgb24gRlRQIFVSTHMgd2hlbiB0aGV5IGFyZSBwYXNzZWQgdG8gYQogIEhUVFAgcHJveHkuIFNvbWUgcHJveGllcyBqdXN0IGRvbid0IGxpa2UgdGhhdCBhcHBlbmRpbmcgKHdoaWNoIGlzIGRvbmUKICB1bmNvbmRpdGlvbmFsbHkgaW4gNy4xNy4xKSwgYW5kIHNvbWUgcHJveGllcyB0cmVhdCBiaW5hcnkvYXNjaWkgdHJhbnNmZXJzCiAgYmV0dGVyIHdpdGggdGhlIGFwcGVuZGluZyBkb25lIQoKRGFuaWVsIFMgKDI5IE5vdiAyMDA3KQotIEEgYnVnIHJlcG9ydCBvbiB0aGUgY3VybC1saWJyYXJ5IGxpc3Qgc2hvd2VkIGEgSFRUUCBEaWdlc3Qgc2Vzc2lvbiBnb2luZyBvbgogIHdpdGggYSA3MDArIGxldHRlciBub25jZS4gUHJldmlvdXNseSBsaWJjdXJsIG9ubHkgc3VwcG9ydCAxMjcgbGV0dGVyIG9uZXMKICBhbmQgbm93IEkgYnVtcGVkIGl0IHRvIDEwMjMuCgotIEZpeGVkIHRoZSByZXN1bWVkIEZUUCB1cGxvYWQgbG9vcCB0byBub3QgcmVxdWlyZSB0aGF0IHRoZSByZWFkIGNhbGxiYWNrCiAgcmV0dXJucyBhIGZ1bGwgYnVmZmVyIG9uIGVhY2ggaW52b2tlLgoKRGFuaWVsIFMgKDI1IE5vdiAyMDA3KQotIEFkZGVkIHRlc3QgY2FzZSAxMDE1IHRoYXQgdGVzdHMgLS1kYXRhLXVybGVuY29kZSBpbiBtdWx0aXBsZSB3YXlzCgotIEZpeGVkIC0tZGF0YS11cmxlbmNvZGUgZm9yIHdoZW4gbm8gQCBvciA9IGFyZSB1c2VkCgotIEV4dGVuZGVkIHRoZSB1c2VyLWFnZW50IGJ1ZmZlciBjdXJsIHVzZXMsIHNpbmNlIHdlIGNhbiBoaXQgdGhlIDEyOCBieXRlCiAgYm9yZGVyIHdpdGggcGxlbnR5IGRldmVsb3BtZW50IGxpYnJhcmllcyB1c2VkLiBMaWtlIG15IGN1cnJlbnQgc2V0OiAiY3VybAogIDcuMTcuMi1DVlMgKGk2ODYtcGMtbGludXgtZ251KSBsaWJjdXJsLzcuMTcuMi1DVlMgT3BlblNTTC8wLjkuOGcKICB6bGliLzEuMi4zLjMgYy1hcmVzLzEuNS4yLUNWUyBsaWJpZG4vMS4xIGxpYnNzaDIvMC4xOS4wLUNWUyIKCkRhbmllbCBTICgyNCBOb3YgMjAwNykKLSBJbnRlcm5hbCByZWFycmFuZ2VtZW50cywgc28gdGhhdCB0aGUgcHJldmlvdXMgc3RydWN0IEhhbmRsZURhdGEgaXMgbm8gbW9yZS4KICBJdCBpcyBub3cga25vd24gYXMgU2luZ2xlUmVxdWVzdCBhbmQgdGhlIEN1cmxfdHJhbnNmZXJfa2VlcGVyIHN0cnVjdCB3aXRoaW4KICB0aGF0IHdhcyByZW1vdmUgZW50aXJlbHkuIFRoaXMgaGFzIHRoZSB1cHNpZGUgdGhhdCB0aGVyZSBhcmUgbGVzcyBkdXBsaWNhdGUKICBzdHJ1Y3QgbWVtYmVycyB0aGF0IG1hZGUgaXQgaGFyZCB0byBzZWUgYW5kIHJlbWVtYmVyIHdoYXQgc3RydWN0IHRoYXQgd2FzCiAgdXNlZCB0byBzdG9yZSB3aGF0IGRhdGEuIFRoZSB0cmFuc2Zlcl9rZWVwZXIgdGhpbmcgd2FzIG9uY2Ugc3RvcmVkIG9uIGEKICBwZXItY29ubmVjdGlvbiBiYXNpcyBhbmQgdGhlbiBpdCBtYWRlIHNlbnNlIHRvIGhhdmUgdGhlIGR1cGxpY2F0ZSBpbmZvIGJ1dAogIHNpbmNlIGl0IHdhcyBtb3ZlZCB0byB0aGUgU2Vzc2lvbkhhbmRsZSAoaW4gNy4xNi4wKSBpdCBqdXN0IGFkZGVkIHdlaXJkbmVzcy4KICBUaGUgU2luZ2xlUmVxdWVzdCBzdHJ1Y3QgaXMgdXNlZCBieSBkYXRhIHRoYXQgb25seSBpcyB2YWxpZCBmb3IgdGhpcyBzaW5nbGUKICByZXF1ZXN0LgoKWWFuZyBUc2UgKDIyIE5vdiAyMDA3KQotIFByb3ZpZGUgYSBzb2NrbGVuX3QgZGVmaW5pdGlvbiBpbiBjdXJsLmggZm9yIFdpbjMyIEFQSSBidWlsZCB0YXJnZXRzCiAgd2hpY2ggZG9uJ3QgaGF2ZSBvbmUuCgpEYW5pZWwgUyAoMjIgTm92IDIwMDcpCi0gQWxlc3NhbmRybyBWZXNlbHkgaGVscGVkIG1lIGltcHJvdmUgdGhlIC0tZGF0YS11cmxlbmNvZGUncyBzeW50YXgsIHBhcnNlcgogIGFuZCBkb2N1bWVudGF0aW9uLgoKRGFuaWVsIFMgKDIxIE5vdiAyMDA3KQotIFdoaWxlIGluc3BlY3RpbmcgdGhlIE5lZ290aWF0ZSBjb2RlLCBJIG5vdGljZWQgaG93IHRoZSBwcm94eSBhdXRoIHdhcyB1c2luZwogIHRoZSBzYW1lIHN0YXRlIHN0cnVjdCBhcyB0aGUgaG9zdCBhdXRoLCBzbyBib3RoIGNvdWxkIG5ldmVyIGJlIHVzZWQgYXQgdGhlCiAgc2FtZSB0aW1lISBJIGZpeGVkIGl0ICh3aXRob3V0IGJlaW5nIGFibGUgdG8gY2hlY2spIHRvIHVzZSB0d28gc2VwYXJhdGUKICBzdHJ1Y3RzIHRvIGFsbG93IGF1dGhlbnRpY2F0aW9uIHVzaW5nIE5lZ290aWF0ZSBvbiBob3N0IGFuZCBwcm94eQogIHNpbXVsdGFuZW91c2x5LgoKRGFuaWVsIFMgKDIwIE5vdiAyMDA3KQotIEVtaWwgUm9tYW51cyBwb2ludGVkIG91dCBhIGJ1ZyB0aGF0IG1hZGUgYW4gZWFzeSBoYW5kbGUgZ2V0IHRoZSBjb29raWUKICBlbmdpbmUgYWN0aXZhdGVkIHdoZW4gc2V0IHRvIHVzZSBhIHNoYXJlIChldmVuIGlmIHRoZSBzaGFyZSBkb2Vzbid0IHNoYXJlCiAgY29va2llcykuIEkgZml4ZWQgaXQuCgotIEZpeGVkIGEgdmVyeSBsb25nLWxhc3RpbmcgbXByaW50ZigpIGJ1ZyB0aGF0IG9jY3VycmVkIHdoZW4gd2UgZGlkICIlLipzJXMiLAogIHNpbmNlIHRoZSBzZWNvbmQgJXMgd291bGQgdGhlbiB3cm9uZ2x5IHVzZWQgdGhlIG51bWVyaWNhbCBwcmVjaXNpb24gYXJndW1lbnQKICBpbnN0ZWFkIGFuZCBjcmFzaC4KCi0gSW50cm9kdWNlZCAtLWRhdGEtdXJsZW5jb2RlIHRvIHRoZSBjdXJsIHRvb2wgZm9yIGVhc2llciB1cmwgZW5jb2Rpbmcgb2YgdGhlCiAgZGF0YSBzZW50IGluIGEgcG9zdC4KCkRhbmllbCBTICgxOCBOb3YgMjAwNykKLSBSb2IgQ3JpdHRlbmRlbiBmaXhlZCBTU0wgY29ubmVjdGlvbnMgd2l0aCBOU1MgZG9uZSB3aXRoIHRoZSBtdWx0aS1pbnRlcmZhY2UKCkRhbmllbCBTICgxNyBOb3YgMjAwNykKLSBNaWNoYWwgTWFyZWsgbWFkZSB0aGUgdGVzdCBzdWl0ZSByZW1lbWJlciB3aGF0IHRlc3Qgc2VydmVycyB0aGF0IGZhaWwgdG8KICBzdGFydCBzbyB0aGF0IHN1YnNlcXVlbnQgdHJpZXMgYXJlIHNpbXBseSBza2lwcGVkLgoKLSBBbmRyZXMgR2FyY2lhIG1hZGUgdGhlIGV4YW1wbGVzIGJ1aWxkIGZpbmUgb24gV2luZG93cyAobWluZ3cgKyBtc3lzKSB3aGVuCiAgdGhlIGxpYiB3YXMgYnVpbHQgc3RhdGljbHkuCgpEYW5pZWwgUyAoMTYgTm92IDIwMDcpCi0gQXRlcyBHb3JhbCBpZGVudGlmaWVkIGEgcHJvYmxlbSBpbiBodHRwLmM6YWRkX2J1ZmZlcl9zZW5kKCkgd2hlbiBhIGRlYnVnCiAgY2FsbGJhY2sgd2FzIHVzZWQsIGFzIGl0IGNvdWxkIHdyb25nbHkgcGFzcyBvbiBhIGJhZCBzaXplIGZvciB0aGUgb3V0Z29pbmcKICBIVFRQIGhlYWRlci4gVGhlIGJhZCBzaXplIHdvdWxkIGJlIGEgdmVyeSBsYXJnZSB2YWx1ZSBhcyBpdCB3YXMgYSB3cmFwcGVkCiAgc2l6ZV90IGNvbnRlbnQuIFRoaXMgaGFwcGVuZWQgd2hlbiB0aGUgd2hvbGUgSFRUUCByZXF1ZXN0IGZhaWxlZCB0byBnZXQgc2VudAogIGluIG9uZSBzaW5nbGUgc2VuZC4gIGh0dHBzOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDctMTEvMDE2NS5odG1sCgpEYW5pZWwgUyAoMTUgTm92IDIwMDcpCi0gRml4ZWQgeWV0IGFub3RoZXIgcmVtYWluaW5nIHByb2JsZW0gd2l0aCBkb2luZyBTRlRQIGRpcmVjdG9yeSBsaXN0aW5ncyBvbiBhCiAgcmUtdXNlZCBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uIE1lbnRpb25lZCBieSBJbW1hbnVlbCBHcmVnb2lyZSBvbiB0aGUgbWFpbGluZwogIGxpc3QuCgotIE1pY2hhbCBNYXJlayBmaXhlZCB0aGUgdGVzdCBzdWl0ZSB0byBiZXR0ZXIgZGVhbCB3aXRoIHRoZSBjYXNlIHdoZW4gdGhlIEhUVFAKICBJUHY2IHNlcnZlciBjYW4ndCBydW4uCgpZYW5nIFRzZSAoMTQgTm92IDIwMDcpCi0gRml4IGEgdmFyaWFibGUgcG90ZW50aWFsIHdyYXBwaW5nIGluIGFkZF9idWZmZXIoKSB3aGVuIHVzaW5nIGFic29sdXRlbHkKICBodWdlIHNlbmQgYnVmZmVyIHNpemVzLgoKRGFuaWVsIFMgKDEzIE5vdiAyMDA3KQotIEZpeGVkIGEgcmVtYWluaW5nIHByb2JsZW0gd2l0aCBkb2luZyBTRlRQIGRpcmVjdG9yeSBsaXN0aW5ncyBvbiBhIHJlLXVzZWQKICBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uIE1lbnRpb25lZCBieSBJbW1hbnVlbCBHcmVnb2lyZSBvbiB0aGUgbWFpbGluZyBsaXN0LgoKRGFuaWVsIFMgKDEyIE5vdiAyMDA3KQotIEJ1ZyByZXBvcnQgIzE4MzA2MzcgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODMwNjM3KSwgd2hpY2ggd2FzCiAgZm9yd2FyZGVkIGZyb20gdGhlIEdlbnRvbyBidWcgdHJhY2tlciBieSBEYW5pZWwgQmxhY2sgYW5kIHdhcyBvcmlnaW5hbGx5CiAgc3VibWl0dGVkIGJ5IFJvYmluIEpvaG5zb24sIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCB3b3VsZCBkbyBiYWQgbWVtb3J5CiAgcmVmZXJlbmNlcyB3aGVuIGl0IGZhaWxlZCBhbmQgYmFpbGVkIG91dCBiZWZvcmUgdGhlIGhhbmRsZXIgdGhpbmcgd2FzCiAgc2V0dXAuIE15IGZpeCBpcyBub3QgZG9uZSBsaWtlIHRoZSBwcm92aWRlZCBwYXRjaCBkb2VzIGl0LCBidXQgaW5zdGVhZCBJCiAgbWFrZSBzdXJlIHRoYXQgdGhlcmUncyBuZXZlciBhbnkgY2hhbmNlIGZvciBhIE5VTEwgcG9pbnRlciBpbiB0aGF0IHN0cnVjdAogIG1lbWJlci4KCllhbmcgVHNlICgxMCBOb3YgMjAwNykKLSBWaWtyYW0gU2F4ZW5hIChodHRwczovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA3LTExLzAwOTYuaHRtbCkgcG9pbnRlZCBvdXQKICB0aGF0IHRoZSBwb2xsZmQgc3RydWN0IHdhcyBiZWluZyBtdWx0aSBkZWZpbmVkIHdoZW4gdXNpbmcgVlMyMDA4LiBUaGlzIGlzCiAgbm93IGZpeGVkIGluIC9jdXJsL2xpYi9zZWxlY3QuaAoKRGFuaWVsIFMgKDggTm92IDIwMDcpCi0gQnVnIHJlcG9ydCAjMTgyMzQ4NyAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4MjM0ODcpIHBvaW50ZWQKICBvdXQgdGhhdCBTRlRQIHJlcXVlc3RzIGRpZG4ndCB1c2UgcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gTmVpdGhlciBkaWQgU0NQCiAgb25lcy4gIEkgZ2F2ZSB0aGUgU1NIIGNvZGUgYSBnb29kIGJlYXRpbmcgYW5kIG5vdyBib3RoIFNDUCBhbmQgU0ZUUCBzaG91bGQKICB1c2UgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBmaW5lLiBJIGFsc28gZGlkIGEgYnVuY2ggb2YgaW5kZW50IGNoYW5nZXMgYXMKICB3ZWxsIGFzIGEgYnVnIGZpeCBmb3IgdGhlICJrZXlib2FyZCBpbnRlcmFjdGl2ZSIgYXV0aC4KCkRhbiBGICg2IE5vdiAyMDA3KQotIEltcHJvdmVkIHRlbG5ldCBzdXBwb3J0IGJ5IGRyYXN0aWNhbGx5IHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygd3JpdGUKICBjYWxsYmFja3MgbmVlZGVkIHRvIHBhc3MgYSBidWZmZXIgdG8gdGhlIHVzZXIuICBJbnN0ZWFkIG9uZSBwZXIgYnl0ZSBpdAogIGlzIG5vdyBhcyBsaXR0bGUgYXMgb25lIHBlciBzZWdtZW50LgoKWWFuZyBUc2UgKDYgTm92IDIwMDcpCi0gQnVnIHJlcG9ydCAjMTgyNDg5NCAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4MjQ4OTQpIHBvaW50ZWQKICBvdXQgYSBwcm9ibGVtIGluIGN1cmwuaCB3aGVuIGJ1aWxkaW5nIEMrKyBhcHBzIHdpdGggTVNWQy4gVG8gZml4IGl0LCB0aGUKICBpbmNsdXNpb24gb2YgaGVhZGVyIGZpbGVzIGluIGN1cmwuaCBpcyBtb3ZlZCBvdXRzaWRlIG9mIHRoZSBDKysgZXh0ZXJuICJDIgogIGxpbmthZ2UgYmxvY2suCgpEYW5pZWwgUyAoMSBOb3YgMjAwNykKLSBUb2J5IFBldGVyc29uIHBhdGNoZWQgYSBtZW1vcnkgcHJvYmxlbSBpbiB0aGUgY29tbWFuZCBsaW5lIHRvb2wgdGhhdAogIGhhcHBlbmVkIHdoZW4gYSB1c2VyIGhhZCBhIGhvbWUgZGlyIGFzIGFuIGVtcHR5IHN0cmluZy4gY3VybCB3b3VsZCB0aGVuIGRvCiAgZnJlZSgpIG9uIGEgd3JvbmcgYXJlYS4KCkRhbiBGICgxIE5vdiAyMDA3KQotIEZpeGVkIGN1cmwtY29uZmlnIC0tZmVhdHVyZXMgdG8gbm90IGRpc3BsYXkgbGlieiB3aGVuIGl0IHdhc24ndCB1c2VkCiAgZHVlIHRvIGEgbWlzc2luZyBoZWFkZXIgZmlsZS4KCkRhbiBGICgzMSBPY3RvYmVyIDIwMDcpCi0gRml4ZWQgdGhlIG91dHB1dCBvZiBjdXJsLWNvbmZpZyAtLXByb3RvY29scyB3aGljaCBzaG93ZWQgU0NQIGFuZCBTRlRQCiAgYWx3YXlzLCBleGNlcHQgd2hlbiAtLXdpdGhvdXQtbGlic3NoMiB3YXMgZ2l2ZW4KCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDEzIGFuZCAxMDE0IHRvIGNoZWNrIHRoYXQgY3VybC1jb25maWcgLS1wcm90b2NvbHMgYW5kCiAgY3VybC1jb25maWcgLS1mZWF0dXJlcyBtYXRjaGVzIHRoZSBvdXRwdXQgb2YgY3VybCAtLXZlcnNpb24KCkRhbiBGICgzMCBPY3RvYmVyIDIwMDcpCi0gRml4ZWQgYW4gT09NIHByb2JsZW0gd2l0aCBmaWxlOiBVUkxzCgotIE1vdmVkIEN1cmxfZmlsZV9jb25uZWN0IGludG8gdGhlIHByb3RvY29sIGhhbmRsZXIgc3RydWN0CgpEYW4gRiAoMjkgT2N0b2JlciAyMDA3KQotIEFkZGVkIHRlc3QgY2FzZSA1NDYgdG8gY2hlY2sgdGhhdCBzdWJzZXF1ZW50IEZUUCB0cmFuc2ZlcnMgd29yayBhZnRlciBhCiAgZmFpbGVkIG9uZSB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlCgpEYW5pZWwgUyAoMjkgT2N0b2JlciAyMDA3KQotIEJhc2VkIG9uIG9uZSBvZiB0aG9zZSBidWcgcmVwb3J0cyB0aGF0IGFyZSBpbnRlcmNlcHRlZCBieSBhIGRpc3RybydzIGJ1ZwogIHRyYWNrZXIgKGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MzE2MTkxKSwgSSBub3cgbWFkZQogIGN1cmwtY29uZmlnIC0tZmVhdHVyZXMgYW5kIC0tcHJvdG9jb2xzIHNob3cgdGhlIGNvcnJlY3Qgb3V0cHV0IHdoZW4gYnVpbHQKICB3aXRoIE5TUy4KClZlcnNpb24gNy4xNy4xICgyOSBPY3RvYmVyIDIwMDcpCgpEYW4gRiAoMjUgT2N0b2JlciAyMDA3KQotIEFkZGVkIHRoZSAtLXN0YXRpYy1saWJzIG9wdGlvbiB0byBjdXJsLWNvbmZpZwoKRGFuaWVsIFMgKDI1IE9jdG9iZXIgMjAwNykKLSBNYWRlIGxpYmN1cmwgYnVpbHQgd2l0aCBOU1MgcG9zc2libGUgdG8gaWdub3JlIHRoZSBwZWVyIHZlcmlmaWNhdGlvbi4KICBQcmV2aW91c2x5IGl0IHdvdWxkIGZhaWwgaWYgdGhlIGNhIGJ1bmRsZSB3YXNuJ3QgcHJlc2VudCwgZXZlbiBpZiB0aGUgY29kZQogIGlnbm9yZWQgdGhlIHZlcmlmaWNhdGlvbiByZXN1bHRzLgoKUGF0cmljayBNICgyNSBPY3RvYmVyIDIwMDcpCi0gRml4ZWQgdGVzdCBzZXJ2ZXIgdG8gYWxsb3cgbnVsbCBieXRlcyBpbiBiaW5hcnkgcG9zdHMuCl8gQWRkZWQgdGVzdHMgMzUsIDU0NCAmIDU0NSB0byBjaGVjayBiaW5hcnkgZGF0YSBwb3N0cywgYm90aCBzdGF0aWMgKGluIHBsYWNlKQogIGFuZCBkeW5hbWljIChjb3BpZWQpLgoKRGFuaWVsIFMgKDI1IE9jdG9iZXIgMjAwNykKLSBNaWNoYWwgTWFyZWsgZml4ZWQgdGhlIHRlc3Qgc2NyaXB0IHRvIGJlIGFibGUgdG8gdXNlIHZhbGdyaW5kIGV2ZW4gd2hlbiB0aGUKICBsaWIgaXMgYnVpbHQgc2hhcmVkIHdpdGggbGlidG9vbC4KCi0gRml4ZWQgYSBmZXcgbWVtb3J5IGxlYWtzIHdoZW4gdGhlIHNhbWUgZWFzeSBoYW5kbGUgaXMgcmUtdXNlZCB0byByZXF1ZXN0CiAgVVJMcyB3aXRoIGRpZmZlcmVudCBwcm90b2NvbHMuIEZUUCBhbmQgVEZUUCByZWxhdGVkIGxlYWtzLiBDYXVnaHQgdGhhbmtzIHRvCiAgRGFuIEYncyBuZXcgdGVzdCBjYXNlcy4KCkRhbiBGICgyNCBPY3RvYmVyIDIwMDcpCi0gRml4ZWQgdGhlIHRlc3QgRlRQIGFuZCBURlRQIHNlcnZlcnMgdG8gc3VwcG9ydCB0aGUgPjEwMDAwIHRlc3QgbnVtYmVyCiAgbm90YXRpb24KCi0gQWRkZWQgdGVzdCBjYXNlcyAyMDAwIHRocm91Z2ggMjAwMyB3aGljaCB0ZXN0IG11bHRpcGxlIHByb3RvY29scyB1c2luZyB0aGUKICBzYW1lIGVhc3kgaGFuZGxlCgotIEZpeGVkIHRoZSBmaWxlY2hlY2s6IG1ha2UgdGFyZ2V0IHRvIHdvcmsgb3V0c2lkZSB0aGUgc291cmNlIHRyZWUKCkRhbmllbCBTICgyNCBPY3RvYmVyIDIwMDcpCi0gVmxhZGltaXIgTGF6YXJlbmtvIHBvaW50ZWQgb3V0IHRoYXQgd2Ugc2hvdWxkIGRvIHNvbWUgJ210JyBtYWdpYyB3aGVuCiAgYnVpbGRpbmcgd2l0aCBWQzggdG8gZ2V0IHRoZSAibWFuaWZlc3QiIGVtYmVkZGVkIHRvIG1ha2UgZmluZSBzdGFuZC1hbG9uZQogIGJpbmFyaWVzLiBUaGUgbWFrZXRneiBhbmQgdGhlIHNyYy9NYWtlZmlsZS52YzYgZmlsZXMgd2VyZSBhZGp1c3RlZAogIGFjY29yZGluZ2x5LgoKRGFuaWVsIFMgKDIzIE9jdG9iZXIgMjAwNykKLSBCdWcgcmVwb3J0ICMxODEyMTkwIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTgxMjE5MCkgcG9pbnRzIG91dAogIHRoYXQgbGliY3VybCB0cmllZCB0byByZS11c2UgY29ubmVjdGlvbnMgYSBiaXQgdG9vIG11Y2ggd2hlbiB1c2luZyBub24tU1NMCiAgcHJvdG9jb2xzIHR1bm5lbGVkIG92ZXIgYSBIVFRQIHByb3h5LgoKRGFuaWVsIFMgKDIyIE9jdG9iZXIgMjAwNykKLSBNaWNoYWwgTWFyZWsgZm9yd2FyZGVkIHRoZSBidWcgcmVwb3J0CiAgaHR0cHM6Ly9idWd6aWxsYS5ub3ZlbGwuY29tL3Nob3dfYnVnLmNnaT9pZD0zMzI5MTcgYWJvdXQgYSBIVFRQIHJlZGlyZWN0IHRvCiAgRlRQIHRoYXQgY2F1c2VkIG1lbW9yeSBoYXZvYy4gSGlzIHdvcmsgdG9nZXRoZXIgd2l0aCBteSBlZmZvcnRzIGNyZWF0ZWQgdHdvCiAgZml4ZXM6CgogICMxIC0gRlRQOjpmaWxlIHdhcyBtb3ZlZCB0byBzdHJ1Y3QgZnRwX2Nvbm4sIGJlY2F1c2UgaXMgaGFzIHRvIGJlIGRlYWx0IHdpdGgKICAgICAgIGF0IGNvbm5lY3Rpb24gY2xlYW51cCwgYXQgd2hpY2ggdGltZSB0aGUgc3RydWN0IEhhbmRsZURhdGEgY291bGQgYmUKICAgICAgIHVzZWQgYnkgYW5vdGhlciBjb25uZWN0aW9uLgogICAgICAgQWxzbywgdGhlIHVudXNlZCBjaGFyICp1cmxwYXRoIG1lbWJlciBpcyByZW1vdmVkIGZyb20gc3RydWN0IEZUUC4KCiAgIzIgLSBwcm92aWRlIGEgQ3VybF9yZXNldF9yZXFwcm90bygpIGZ1bmN0aW9uIHRoYXQgZnJlZXMKICAgICAgIGRhdGEtPnJlcWRhdGEucHJvdG8uKiBvbiBjb25uZWN0aW9uIHNldHVwIGlmIG5lZWRlZCAodGhhdCBpcyBpZiB0aGUKICAgICAgIFNlc3Npb25IYW5kbGUgd2FzIHVzZWQgYnkgYSBkaWZmZXJlbnQgY29ubmVjdGlvbikuCgogIEEgbG9uZy10ZXJtIGdvYWwgaXMgb2YgY291cnNlIHRvIHNvbWVob3cgZ2V0IHJpZCBvZiBob3cgdGhlIHJlcWRhdGEgc3RydWN0CiAgaXMgdXNlZCwgYXMgaXQgaXMgdG9vIGVycm9yLXByb25lLgoKLSBCdWcgcmVwb3J0ICMxODE1NTMwIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTgxNTUzMCkgcG9pbnRzIG91dAogIHRoYXQgc3BlY2lmeWluZyBhIHByb3h5IHdpdGggYSB0cmFpbGluZyBzbGFzaCBkaWRuJ3Qgd29yayAodW5sZXNzIGl0IGFsc28KICBjb250YWluZWQgYSBwb3J0IG51bWJlcikuCgpQYXRyaWNrIE0gKDE1IE9jdG9iZXIgMjAwNykKLSBGaXhlZCB0aGUgZHluYW1pYyBDVVJMT1BUX1BPU1RGSUVMRFMgcHJvYmxlbTogdGhpcyBvcHRpb24gaXMgbm93IHN0YXRpYyBhZ2FpbgogIGFuZCBvcHRpb24gQ1VSTE9QVF9DT1BZUE9TVEZJRUxEUyBoYXMgYmVlbiBhZGRlZCB0byBzdXBwb3J0IGR5bmFtaWMgbW9kZS4KClBhdHJpY2sgTSAoMTIgT2N0b2JlciAyMDA3KQotIEFkZGVkIHBlci1wcm90b2NvbCBjYWxsYmFjayBzdGF0aWMgdGFibGVzLCByZXBsYWNpbmcgY2FsbGJhY2sgcHRyIHN0b3JhZ2UKICBpbiB0aGUgY29ubmVjdGRhdGEgc3RydWN0dXJlIGJ5IGEgc2luZ2xlIGhhbmRsZXIgdGFibGUgcHRyLgoKRGFuIEYgKDExIE9jdG9iZXIgMjAwNykKLSBGaXhlZCB0aGUgLWwgb3B0aW9uIG9mIHJ1bnRlc3RzLnBsCgotIEFkZGVkIHN1cHBvcnQgZm9yIHNraXBwaW5nIHRlc3RzIGJhc2VkIG9uIGtleSB3b3Jkcy4KCkRhbmllbCBTICg5IE9jdG9iZXIgMjAwNykKLSBNaWNoYWwgTWFyZWsgcmVtb3ZlZCB0aGUgbm8gbG9uZ2VyIGV4aXN0aW5nIHJldHVybiBjb2RlcyBmcm9tIHRoZSBjdXJsLjEKICBtYW4gcGFnZS4KCkRhbmllbCBTICg3IE9jdG9iZXIgMjAwNykKLSBLbm93biBidWcgIzQ3LCB3aGljaCBjb25mdXNlZCBsaWJjdXJsIGlmIGRvaW5nIE5UTE0gYXV0aCBvdmVyIGEgcHJveHkgd2l0aAogIGEgcmVzcG9uc2UgdGhhdCB3YXMgbGFyZ2VyIHRoYW4gMTZLQiBpcyBub3cgaW1wcm92ZWQgc2xpZ2h0bHkgc28gdGhhdCBub3cKICB0aGUgcmVzdHJpY3Rpb24gYXQgMTZLQiBpcyBmb3IgdGhlIGhlYWRlcnMgb25seSBhbmQgaXQgc2hvdWxkIGJlIGEgcmFyZQogIHNpdHVhdGlvbiB3aGVyZSB0aGUgcmVzcG9uc2UtaGVhZGVycyBleGNlZWQgMTZLQi4gVGh1cywgSSBjb25zaWRlciAjNDcgZml4ZWQKICBhbmQgdGhlIGhlYWRlciBsaW1pdGF0aW9uIGlzIG5vdyBrbm93biBhcyBrbm93biBidWcgIzQ4LgoKRGFuaWVsIFMgKDUgT2N0b2JlciAyMDA3KQotIE1pY2hhZWwgV2FsbG5lciBtYWRlIHRoZSBDVUxST1BUX0NPT0tJRUxJU1Qgb3B0aW9uIHN1cHBvcnQgYSBuZXcgbWFnaWMKICBzdHJpbmc6ICJGTFVTSCIuIFVzaW5nIHRoYXQgd2lsbCBjYXVzZSBsaWJjdXJsIHRvIGZsdXNoIGl0cyBjb29raWVzIHRvIHRoZQogIENVUkxPUFRfQ09PS0lFSkFSIGZpbGUuCgotIFRoZSBuZXcgZmlsZSBkb2NzL2xpYmN1cmwvQUJJIGRlc2NyaWJlcyBob3cgd2UgdmlldyBBQkkgYnJlYWthZ2VzLCBzb25hbWUKICBidW1wcyBhbmQgd2hhdCB0aGUgdmVyc2lvbiBudW1iZXIncyBzaWduaWZpY2FuY2UgdG8gYWxsIHRoYXQgaXMuCgpEYW5pZWwgUyAoNCBPY3RvYmVyIDIwMDcpCi0gSSBlbmFibGVkIHRlc3QgMTAwOSBhbmQgbWFkZSB0aGUgLS1sb2NhbC1wb3J0IHVzZSBhIHdpZGUgcmFuZ2UgdG8gcmVkdWNlIHRoZQogIHJpc2sgb2YgZmFpbHVyZXMuCgotIEtpbSBSaW5uZXdpdHogcmVwb3J0ZWQgdGhhdCAtLWxvY2FsLXBvcnQgZGlkbid0IHdvcmsgd2l0aCBURlRQIHRyYW5zZmVycy4KICBUaGlzIGhhcHBlbmVkIGJlY2F1c2UgdGhlIHRmdHAgY29kZSBhbHdheXMgdW5jb25kaW9uYWxseSBkaWQgYSBiaW5kKCkKICB3aXRob3V0IGNhcmluZyBpZiBvbmUgYWxyZWFkeSBoYWQgYmVlbiBkb25lIGFuZCB0aGVuIGl0IGZhaWxlZC4gSSB3cm90ZSBhCiAgdGVzdCBjYXNlICgxMDA5KSB0byB2ZXJpZnkgdGhpcywgYnV0IGl0IGlzIGEgYml0IGVycm9yLXByb25lIHNpbmNlIGl0IHdpbGwKICBoYXZlIHRvIHBpY2sgYSBmaXhlZCBsb2NhbCBwb3J0IG51bWJlciBhbmQgc2luY2UgdGhlIHRlc3RzIGFyZSBydW4gb24gc28KICBtYW55IGRpZmZlcmVudCBob3N0cyBpbiBkaWZmZXJlbnQgc2l0dWF0aW9ucyBJJ2xsIGFkZCBpdCBpbiBkaXNhYmxlZCBzdGF0ZS4KCllhbmcgVHNlICgzIE9jdG9iZXIgMjAwNykKLSBGaXhlZCBpc3N1ZSByZWxhdGVkIHdpdGggdGhlIHVzZSBvZiBhcmVzX3RpbWVvdXQoKSByZXN1bHQuCgpEYW5pZWwgUyAoMyBPY3RvYmVyIDIwMDcpCi0gQWxleGV5IFBlc3Rlcm5pa292IGludHJvZHVjZWQgQ1VSTE9QVF9PUEVOU09DS0VURlVOQ1RJT04gYW5kCiAgQ1VSTE9QVF9PUEVOU09DS0VUREFUQSB0byBzZXQgYSBjYWxsYmFjayB0aGF0IGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0bwogIHJlcGxhY2UgdGhlIHNvY2tldCgpIGNhbGwgdXNlZCBieSBsaWJjdXJsLiBJdCBiYXNpY2FsbHkgYWxsb3dzIHRoZSBhcHAgdG8KICBjaGFuZ2UgYWRkcmVzcywgcHJvdG9jb2wgb3Igd2hhdGV2ZXIgb2YgdGhlIHNvY2tldC4KCi0gSSByZW5hbWVkIHRoZSBDVVJMRV9TU0xfUEVFUl9DRVJUSUZJQ0FURSBlcnJvciBjb2RlIHRvCiAgQ1VSTEVfUEVFUl9GQUlMRURfVkVSSUZJQ0FUSU9OIChzdGFuZGFyZCBDVVJMX05PX09MRElFUyBzdHlsZSksIGFuZCBtYWRlCiAgdGhpcyByZXR1cm4gY29kZSBnZXQgdXNlZCBieSB0aGUgcHJldmlvdXMgU1NIIE1ENSBmaW5nZXJwcmludCBjaGVjayBpbiBjYXNlCiAgaXQgZmFpbHMuCgotIEJhc2VkIG9uIGEgcGF0Y2ggYnJvdWdodCBieSBKb2hubnkgTHVvbmcsIGxpYmN1cmwgbm93IG9mZmVycwogIENVUkxPUFRfU1NIX0hPU1RfUFVCTElDX0tFWV9NRDUgYW5kIHRoZSBjdXJsIHRvb2wgLS1ob3N0cHVibWQ1LiBUaGV5IGJvdGgKICBtYWtlIHRoZSBTQ1Agb3IgU0ZUUCBjb25uZWN0aW9uIHZlcmlmeSB0aGUgcmVtb3RlIGhvc3QncyBtZDUgY2hlY2tzdW0gb2YgdGhlCiAgcHVibGljIGtleSBiZWZvcmUgZG9pbmcgYSBjb25uZWN0LCB0byByZWR1Y2UgdGhlIHJpc2sgb2YgYSBtYW4taW4tdGhlLW1pZGRsZQogIGF0dGFjay4KCkRhbmllbCBTICgyIE9jdG9iZXIgMjAwNykKLSBsaWJjdXJsIG5vdyBoYW5kbGVzIGNodW5rZWQtZW5jb2RlZCBDT05ORUNUIHJlc3BvbnNlcwoKRGFuaWVsIFMgKDEgT2N0b2JlciAyMDA3KQotIEFsZXggRmlzaG1hbiByZXBvcnRlZCBhIGN1cmxfZWFzeV9lc2NhcGUoKSBwcm9ibGVtIHRoYXQgd2FzIG1hZGUgdGhlCiAgZnVuY3Rpb24gZG8gd3Jvbmcgb24gYWxsIGlucHV0IGJ5dGVzIHRoYXQgYXJlID49IDB4ODAgKGRlY2ltYWwgMTI4KSBkdWUgdG8gYQogIHNpZ25lZCAvIHVuc2lnbmVkIG1pc3Rha2UgaW4gdGhlIGNvZGUuIEkgZml4ZWQgaXQgYW5kIGFkZGVkIHRlc3QgY2FzZSA1NDMgdG8KICB2ZXJpZnkuCgpEYW5pZWwgUyAoMjkgU2VwdGVtYmVyIDIwMDcpCi0gSW1tYW51ZWwgR3JlZ29pcmUgZml4ZWQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGVudCB0cmFuc2ZlcnMgb3ZlciBTRlRQLgoKRGFuaWVsIFMgKDI4IFNlcHRlbWJlciAyMDA3KQotIEFkYXB0ZWQgdGhlIGMtYXJlcyBjb2RlIHRvIHRoZSBBUEkgY2hhbmdlIGMtYXJlcyAxLjUuMCBicmluZ3MgaW4gdGhlCiAgbm90aWZpZXIgY2FsbGJhY2socykuCgpEYW4gRiAoMjYgU2VwdGVtYmVyIDIwMDcpCi0gRW5hYmxlZCBhIGZldyBtb3JlIGdjYyB3YXJuaW5ncyB3aXRoIC0tZW5hYmxlLWRlYnVnLiAgUmVuYW1lZCBhIGZldwogIHZhcmlhYmxlcyB0byBhdm9pZCBzaGFkb3dpbmcgZ2xvYmFsIGRlY2xhcmF0aW9ucy4KCkRhbmllbCBTICgyNiBTZXB0ZW1iZXIgMjAwNykKLSBQaGlsaXAgTGFuZ2RhbGUgcHJvdmlkZWQgdGhlIG5ldyBDVVJMT1BUX1BPU1QzMDEgb3B0aW9uIGZvcgogIGN1cmxfZWFzeV9zZXRvcHQoKSB0aGF0IGFsdGVycyBob3cgbGliY3VybCBmdW5jdGlvbnMgd2hlbiBmb2xsb3dpbmcKICByZWRpcmVjdHMuIEl0IG1ha2VzIGxpYmN1cmwgb2JleSB0aGUgUkZDMjYxNiB3aGVuIGEgMzAxIHJlc3BvbnNlIGlzIHJlY2VpdmVkCiAgYWZ0ZXIgYSBub24tR0VUIHJlcXVlc3QgaXMgbWFkZS4gRGVmYXVsdCBsaWJjdXJsIGJlaGF2aW91ciBpcyB0byBjaGFuZ2UKICBtZXRob2QgdG8gR0VUIGluIHRoZSBzdWJzZXF1ZW50IHJlcXVlc3QgKGxpa2UgaXQgZG9lcyBmb3IgcmVzcG9uc2UgY29kZSAzMDIKICAtIGJlY2F1c2UgdGhhdCdzIHdoYXQgbWFueS9tb3N0IGJyb3dzZXJzIGRvKSwgYnV0IHdpdGggdGhpcyBDVVJMT1BUX1BPU1QzMDEKICBvcHRpb24gZW5hYmxlZCBpdCB3aWxsIGRvIHdoYXQgdGhlIHNwZWMgc2F5cyBhbmQgZG8gdGhlIG5leHQgcmVxdWVzdCB1c2luZwogIHRoZSBzYW1lIG1ldGhvZCBhZ2Fpbi4gSS5lIGtlZXAgUE9TVCBhZnRlciAzMDEuCgogIFRoZSBjdXJsIHRvb2wgZ290IHRoaXMgb3B0aW9uIGFzIC0tcG9zdDMwMQoKICBUZXN0IGNhc2UgMTAxMSBhbmQgMTAxMiB3ZXJlIGFkZGVkIHRvIHZlcmlmeS4KCi0gTWF4IEthdHNldiByZXBvcnRlZCB0aGF0IHdoZW4gZG9pbmcgYSBsaWJjdXJsIEZUUCByZXF1ZXN0IHdpdGgKICBDVVJMT1BUX05PQk9EWSBlbmFibGVkIGJ1dCBub3QgQ1VSTE9QVF9IRUFERVIsIGxpYmN1cmwgd291bGRuJ3QgZG8gVFlQRQogIGJlZm9yZSBpdCBkb2VzIFNJWkUgd2hpY2ggbWFrZXMgaXQgbGVzcyB1c2VmdWwuIEkgd2Fsa2VkIG92ZXIgdGhlIGNvZGUgYW5kCiAgbWFkZSBpdCBkbyB0aGlzIHByb3Blcmx5LCBhbmQgYWRkZWQgdGVzdCBjYXNlIDU0MiB0byB2ZXJpZnkgaXQuCgpEYW5pZWwgUyAoMjQgU2VwdGVtYmVyIDIwMDcpCi0gSW1tYW51ZWwgR3JlZ29pcmUgZml4ZWQgS05PV05fQlVHUyAjNDQ6IC0tZnRwLW1ldGhvZCBub2N3ZCBkaWQgbm90IGhhbmRsZQogIFVSTHMgZW5kaW5nIHdpdGggYSBzbGFzaCBwcm9wZXJseSAoaXQgc2hvdWxkIGxpc3QgdGhlIGNvbnRlbnRzIG9mIHRoYXQKICBkaXJlY3RvcnkpLiBUZXN0IGNhc2UgMzUxIGJyb3VnaHQgYmFjayBhbmQgYWxzbyB0ZXN0IDEwMTAgd2FzIGFkZGVkLgoKRGFuaWVsIFMgKDIxIFNlcHRlbWJlciAyMDA3KQotIE1hcmsgRGF2aWVzIGZpeGVkIE5lZ290aWF0ZSBhdXRoZW50aWNhdGlvbiBvdmVyIHByb3h5LCBhbmQgYWxzbyBpbnRyb2R1Y2VkCiAgdGhlIC0tcHJveHktbmVnb3RpYXRlIGNvbW1hbmQgbGluZSBvcHRpb24gdG8gYWxsb3cgYSB1c2VyIHRvIGV4cGxpY2l0bHkKICBzZWxlY3QgaXQuCgpEYW5pZWwgUyAoMTkgU2VwdGVtYmVyIDIwMDcpCi0gUm9iIENyaXR0ZW5kZW4gcHJvdmlkZWQgYW4gTlNTIHVwZGF0ZSB3aXRoIHRoZSBmb2xsb3dpbmcgaGlnaGxpZ2h0czoKCiAgbyBJdCBsb29rcyBmb3IgdGhlIE5TUyBkYXRhYmFzZSBmaXJzdCBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgU1NMX0RJUiwKICAgIHRoZW4gaW4gL2V0Yy9wa2kvbnNzZGIsIHRoZW4gaXQgaW5pdGlhbGl6ZXMgd2l0aCBubyBkYXRhYmFzZSBpZiBuZWl0aGVyIG9mCiAgICB0aG9zZSBleGlzdC4KCiAgbyBJZiB0aGUgTlNTIFBLQ1MjMTEgbGlibnNwc2VtLnNvIGRyaXZlciBpcyBhdmFpbGFibGUgdGhlbiBQRU0gZmlsZXMgbWF5IGJlCiAgICBsb2FkZWQsIGluY2x1ZGluZyB0aGUgY2EtYnVuZGxlLiBJZiBpdCBpcyBub3QgYXZhaWxhYmxlIHRoZW4gb25seQogICAgY2VydGlmaWNhdGVzIGFscmVhZHkgaW4gdGhlIE5TUyBkYXRhYmFzZSBhcmUgdXNlZC4KCiAgbyBUcmllcyB0byBkZXRlY3Qgd2hldGhlciBhIGZpbGUgb3Igbmlja25hbWUgaXMgYmVpbmcgcGFzc2VkIGluIHNvIHRoZSByaWdodAogICAgdGhpbmcgaXMgZG9uZQoKICBvIEFkZGVkIGEgYml0IG9mIGNvZGUgdG8gbWFrZSB0aGUgb3V0cHV0IG1vcmUgbGlrZSB0aGUgT3BlblNTTCBtb2R1bGUsCiAgICBpbmNsdWRpbmcgZGlzcGxheWluZyB0aGUgY2VydGlmaWNhdGUgaW5mb3JtYXRpb24gd2hlbiBjb25uZWN0aW5nIGluCiAgICB2ZXJib3NlIG1vZGUKCiAgbyBJbXByb3ZlZCBoYW5kbGluZyBvZiBjZXJ0aWZpY2F0ZSBlcnJvcnMgKGV4cGlyZWQsIHVudHJ1c3RlZCwgZXRjKQoKICBUaGUgbGlibnNzcGVtLnNvIFBLQ1MjMTEgbW9kdWxlIGlzIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBpbiBGZWRvcmEKICA4L3Jhd2hpZGUuIFdvcmsgd2lsbCBiZSBkb25lIHNvb24gdG8gdXBzdHJlYW0gaXQuIFRoZSBOU1MgbW9kdWxlIHdpbGwgd29yawogIHdpdGggb3Igd2l0aG91dCBpdCwgYWxsIHRoYXQgY2hhbmdlcyBpcyB0aGUgc291cmNlIG9mIHRoZSBjZXJ0aWZpY2F0ZXMgYW5kCiAga2V5cy4KCkRhbmllbCBTICgxOCBTZXB0ZW1iZXIgMjAwNykKLSBJbW1hbnVlbCBHcmVnb2lyZSBwb2ludGVkIG91dCB0aGF0IHB1YmxpYyBrZXkgU1NIIGF1dGggZmFpbGVkIGlmIG5vCiAgcHVibGljL3ByaXZhdGUga2V5IHdhcyBzcGVjaWZpZWQgYW5kIHRoZXJlIHdhcyBubyBIT01FIGVudmlyb25tZW50IHZhcmlhYmxlLAogIGFuZCB0aGVuIGl0IGRpZG4ndCBjb250aW51ZSB0byB0cnkgdGhlIG90aGVyIGF1dGggbWV0aG9kcy4gTm93IGl0IHdpbGwKICBpbnN0ZWFkIHRyeSB0byBnZXQgdGhlIGZpbGVzIGlkX2RzYS5wdWIgYW5kIGlkX2RzYSBmcm9tIHRoZSBjdXJyZW50CiAgZGlyZWN0b3J5IGlmIG5vbmUgb2YgdGhlIHR3byBjb25kaXRpb25zIHdlcmUgbWV0LgoKRGFuIEYgKDE3IFNlcHRlbWJlciAyMDA3KQotIEFkZGVkIGhvb2tzIHRvIHRoZSB0ZXN0IHN1aXRlIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gdGVzdCBhIGN1cmwgcnVubmluZwogIG9uIGEgcmVtb3RlIGhvc3QuCgotIENoYW5nZWQgc29tZSBGVFAgdGVzdHMgdG8gdmFsaWRhdGUgdGhlIGZvcm1hdCBvZiB0aGUgUE9SVCBhbmQgRVBSVCBjb21tYW5kcwogIHNlbnQgYnkgY3VybCwgaWYgbm90IHRoZSBhZGRyZXNzZXMgdGhlbXNlbHZlcy4KCkRhbmllbCBTICgxNSBTZXB0ZW1iZXIgMjAwNykKLSBNaWNoYWwgTWFyZWsgbWFkZSBsaWJjdXJsIGF1dG9tYXRpY2FsbHkgYXBwZW5kICI7dHlwZT08YXxpPiIgd2hlbiB1c2luZyBIVFRQCiAgcHJveGllcyBmb3IgRlRQIHVybHMuCgotIEf8bnRlciBLbmF1ZiBmaXhlZCBMREFQIGJ1aWxkcyBpbiB0aGUgV2luZG93cyBtYWtlZmlsZXMgYW5kIGZpeGVkIExEQVB2MwogIHN1cHBvcnQgb24gV2luZG93cy4KCkRhbiBGICgxMyBTZXB0ZW1iZXIgMjAwNykKLSBBZGRlZCBMREFQUywgU0NQIGFuZCBTRlRQIHRvIGN1cmwtY29uZmlnIC0tcHJvdG9jb2xzLiBSZW1vdmVkIGFuZAogIGZpeGVkIHNvbWUgQUNfU1VCU1QgY29uZmlndXJlIGVudHJpZXMuCgpWZXJzaW9uIDcuMTcuMCAoMTMgU2VwdGVtYmVyIDIwMDcpCgpEYW5pZWwgUyAoMTIgU2VwdGVtYmVyIDIwMDcpCi0gQnVnIHJlcG9ydCAjMTc5MjY0OSAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3OTI2NDkpIHBvaW50ZWQKICBvdXQgYSBwcm9ibGVtIHdpdGggZG9pbmcgYW4gZW1wdHkgdXBsb2FkIG92ZXIgRlRQIG9uIGEgcmUtdXNlZCBjb25uZWN0aW9uLgogIEkgYWRkZWQgdGVzdCBjYXNlIDU0MSB0byByZXByb2R1Y2UgaXQgYW5kIHRvIHZlcmlmeSB0aGUgZml4LgoKLSBJIG5vdGljZWQgd2hpbGUgd3JpdGluZyB0ZXN0IDU0MSB0aGF0IHRoZSBGVFAgY29kZSB3cm9uZ2x5IGRpZCBhIENXRCBvbiB0aGUKICBzZWNvbmQgdHJhbnNmZXIgYXMgaXQgZGlkbid0IHN0b3JlIGFuZCByZW1lbWJlciB0aGUgIiIgcGF0aCBmcm9tIHRoZQogIHByZXZpb3VzIHRyYW5zZmVyIHNvIGl0IHdvdWxkIGluc3RlYWQgQ1dEIHRvIHRoZSBlbnRyeSBwYXRoIGFzIHN0b3JlZC4gVGhpcwogIHdvcmtlZCwgYnV0IGRpZCBhIHN1cGVyZmx1b3VzIGNvbW1hbmQuIFRodXMsIHRlc3QgY2FzZSA1NDEgbm93IGFsc28gdmVyaWZpZXMKICB0aGlzIGZpeC4KCkRhbiBGICg1IFNlcHRlbWJlciAyMDA3KQotIEFkZGVkIHRlc3QgY2FzZSAxMDA3IHRvIHRlc3QgcGVybWlzc2lvbiBwcm9ibGVtIHdoZW4gdXBsb2FkaW5nIHdpdGggVEZUUAogICh0byB2YWxpZGF0ZSBidWcgIzE3OTA0MDMpLgoKLSBURlRQIG5vdyByZXBvcnRzIHRoZSAibm90IGRlZmluZWQiIFRGVFAgZXJyb3IgY29kZSAwIGFzIGFuIGVycm9yLAogIG5vdCBzdWNjZXNzLgoKRGFuaWVsIFMgKDUgU2VwdGVtYmVyIDIwMDcpCi0gQ29udGludWVkIHRoZSB3b3JrIG9uIGEgZml4IGZvciAjMTc3OTA1NAogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc3OTA1NCkuIE15IHByZXZpb3VzIGZpeCBmcm9tIEF1Z3VzdAogIDI0IHdhcyBub3QgY29tcGxldGUgKGVpdGhlcikgYnV0IGNvdWxkIGFjY2lkZW50YWxseSAiZm9yZ2V0IiBwYXJ0cyBvZiBhCiAgc2VydmVyIHJlc3BvbnNlIHdoaWNoIGxlZCB0byBmYXVsdHkgc2VydmVyIHJlc3BvbnNlIHRpbWUtb3V0IGVycm9ycy4KCkRhbiBGICg1IFNlcHRlbWJlciAyMDA3KQotIE1pbml4IGRvZXNuJ3Qgc3VwcG9ydCBnZXRzb2Nrb3B0IG9uIFVEUCBzb2NrZXRzIG9yIHNlbmQvcmVjdiBvbiBUQ1AKICBzb2NrZXRzLgoKRGFuIEYgKDMxIEF1Z3VzdCAyMDA3KQotIE1hZGUgc29tZSBvZiB0aGUgZXJyb3Igc3RyaW5ncyByZXR1cm5lZCBieSB0aGUgKnN0cmVycm9yIGZ1bmN0aW9ucyBtb3JlCiAgZ2VuZXJpYywgYW5kIG1vcmUgY29uc2lzdGVudCB3aXRoIGVhY2ggb3RoZXIuCgotIFJlbmFtZWQgdGhlIGN1cmxfZnRwc3NsIGVudW0gdG8gY3VybF91c2Vzc2wgYW5kIGl0cyBlbnVtZXJhdGVkIGNvbnN0YW50cywKICBjcmVhdGluZyBtYWNyb3MgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CgogICAgQ1VSTEZUUFNTTF9OT05FID0+IENVUkxVU0VTU0xfTk9ORQogICAgQ1VSTEZUUFNTTF9UUlkgPT4gQ1VSTFVTRVNTTF9UUlkKICAgIENVUkxGVFBTU0xfQ09OVFJPTCA9PiBDVVJMVVNFU1NMX0NPTlRST0wKICAgIENVUkxGVFBTU0xfQUxMID0+IENVUkxVU0VTU0xfQUxMCiAgICBDVVJMRlRQU1NMX0xBU1QgPT4gQ1VSTFVTRVNTTF9MQVNUCgpEYW4gRiAoMzAgQXVndXN0IDIwMDcpCi0gUmVuYW1lZCBzZXZlcmFsIGxpYmN1cmwgZXJyb3IgY29kZXMgYW5kIG9wdGlvbnMgdG8gbWFrZSB0aGVtIG1vcmUgZ2VuZXJhbAogIGFuZCBhbGxvdyByZXVzZSBieSBtdWx0aXBsZSBwcm90b2NvbHMuIFNldmVyYWwgdW51c2VkIGVycm9yIGNvZGVzIHdlcmUKICByZW1vdmVkLiAgSW4gYWxsIGNhc2VzLCBtYWNyb3Mgd2VyZSBhZGRlZCB0byBwcmVzZXJ2ZSBzb3VyY2UgKGFuZCBiaW5hcnkpCiAgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvbGQgbmFtZXMuICBUaGVzZSBtYWNyb3MgYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCBhdAogIGEgZnV0dXJlIGRhdGUsIGJ1dCBwcm9iYWJseSBub3QgYmVmb3JlIDIwMDkuICBBbiBhcHBsaWNhdGlvbiBjYW4gYmUKICB0ZXN0ZWQgdG8gc2VlIGlmIGl0IGlzIHVzaW5nIGFueSBvYnNvbGV0ZSBjb2RlIGJ5IGNvbXBpbGluZyBpdCB3aXRoIHRoZQogIENVUkxfTk9fT0xESUVTIG1hY3JvIGRlZmluZWQuCgogIFRoZSBmb2xsb3dpbmcgdW51c2VkIGVycm9yIGNvZGVzIHdlcmUgcmVtb3ZlZDoKCiAgICBDVVJMRV9CQURfQ0FMTElOR19PUkRFUgogICAgQ1VSTEVfQkFEX1BBU1NXT1JEX0VOVEVSRUQKICAgIENVUkxFX0ZUUF9DQU5UX1JFQ09OTkVDVAogICAgQ1VSTEVfRlRQX0NPVUxETlRfR0VUX1NJWkUKICAgIENVUkxFX0ZUUF9DT1VMRE5UX1NFVF9BU0NJSQogICAgQ1VSTEVfRlRQX1VTRVJfUEFTU1dPUkRfSU5DT1JSRUNUCiAgICBDVVJMRV9GVFBfV0VJUkRfVVNFUl9SRVBMWQogICAgQ1VSTEVfRlRQX1dSSVRFX0VSUk9SCiAgICBDVVJMRV9MSUJSQVJZX05PVF9GT1VORAogICAgQ1VSTEVfTUFMRk9STUFUX1VTRVIKICAgIENVUkxFX09CU09MRVRFCiAgICBDVVJMRV9TSEFSRV9JTl9VU0UKICAgIENVUkxFX1VSTF9NQUxGT1JNQVRfVVNFUgoKICBUaGUgZm9sbG93aW5nIGVycm9yIGNvZGVzIHdlcmUgcmVuYW1lZDoKCiAgICBDVVJMRV9GVFBfQUNDRVNTX0RFTklFRCA9PiAgICAgIENVUkxFX1JFTU9URV9BQ0NFU1NfREVOSUVECiAgICBDVVJMRV9GVFBfQ09VTEROVF9TRVRfQklOQVJZID0+IENVUkxFX0ZUUF9DT1VMRE5UX1NFVF9UWVBFCiAgICBDVVJMRV9GVFBfU1NMX0ZBSUxFRCA9PiAgICAgICAgIENVUkxFX1VTRV9TU0xfRkFJTEVECiAgICBDVVJMRV9GVFBfUVVPVEVfRVJST1IgPT4gICAgICAgIENVUkxFX1FVT1RFX0VSUk9SCiAgICBDVVJMRV9URlRQX0RJU0tGVUxMID0+ICAgICAgICAgIENVUkxFX1JFTU9URV9ESVNLX0ZVTEwKICAgIENVUkxFX1RGVFBfRVhJU1RTID0+ICAgICAgICAgICAgQ1VSTEVfUkVNT1RFX0ZJTEVfRVhJU1RTCiAgICBDVVJMRV9IVFRQX1JBTkdFX0VSUk9SID0+ICAgICAgIENVUkxFX1JBTkdFX0VSUk9SCgogIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyB3ZXJlIHJlbmFtZWQ6CgogICAgQ1VSTE9QVF9TU0xLRVlQQVNTV0QgPT4gQ1VSTE9QVF9LRVlQQVNTV0QKICAgIENVUkxPUFRfRlRQQVBQRU5EID0+ICAgIENVUkxPUFRfQVBQRU5ECiAgICBDVVJMT1BUX0ZUUExJU1RPTkxZID0+ICBDVVJMT1BUX0RJUkxJU1RPTkxZCiAgICBDVVJMT1BUX0ZUUF9TU0wgPT4gICAgICBDVVJMT1BUX1VTRV9TU0wKCiAgQSBmZXcgbW9yZSBjaGFuZ2VzIHdpbGwgdGFrZSBwbGFjZSB3aXRoIHRoZSBuZXh0IFNPTkFNRSBidW1wIG9mIHRoZQogIGxpYnJhcnkuICBUaGVzZSBhcmUgZG9jdW1lbnRlZCBpbiBkb2NzL1RPRE8KCi0gRG9jdW1lbnRlZCBzb21lIG5ld2VyIGVycm9yIGNvZGVzIGluIGxpYmN1cmwtZXJyb3IoMykKCi0gQWRkZWQgbW9yZSBhY2N1cmF0ZSBlcnJvciBjb2RlIHJldHVybnMgZnJvbSBTRlRQIG9wZXJhdGlvbnMuICBBZGRlZCB0ZXN0CiAgY2FzZSA2MTUgdG8gdGVzdCBhbiBTRlRQIHVwbG9hZCBmYWlsdXJlLgoKRGFuIEYgKDI4IEF1Z3VzdCAyMDA3KQotIFNvbWUgbWlub3IgaW50ZXJuYWwgdHlwZSBhbmQgY29uc3QgY2hhbmdlcyBiYXNlZCBvbiBhIHNwbGludCBzY2FuLgoKRGFuaWVsIFMgKDI0IEF1Z3VzdCAyMDA3KQotIEJ1ZyByZXBvcnQgIzE3NzkwNTQgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzc5MDU0KSBwb2ludGVkCiAgb3V0IHRoYXQgbGliY3VybCBkaWRuJ3QgZGVhbCB3aXRoIGxhcmdlIHJlc3BvbnNlcyBmcm9tIHNlcnZlciBjb21tYW5kcywgd2hlbgogIHRoZSBzaW5nbGUgcmVzcG9uc2Ugd2FzIGNvbnNpc3Rpbmcgb2YgbXVsdGlwbGUgbGluZXMgYnV0IG9mIGEgdG90YWwgc2l6ZSBvZgogIDE2S0Igb3IgbW9yZS4gRGFuIEZhbmRyaWNoIGltcHJvdmVkIHRoZSBmdHAgdGVzdCBzY3JpcHQgYW5kIHByb3ZpZGVkIHRlc3QKICBjYXNlIDEwMDYgdG8gcmVwZWF0IHRoZSBwcm9ibGVtLCBhbmQgSSBmaXhlZCB0aGUgY29kZSB0byBtYWtlIHN1cmUgdGhpcyBuZXcKICB0ZXN0IGNhc2UgcnVucyBmaW5lLgoKUGF0cmljayBNICgyMyBBdWd1c3QgMjAwNykKLSBPUy80MDAgcG9ydDogbmV3IGZpbGVzIGxpYi9jb25maWctb3M0MDAuaCBsaWIvc2V0dXAtb3M0MDAuaCBwYWNrYWdlcy9PUzQwMC8qLgogIFNlZSBwYWNrYWdlcy9PUzQwMC9SRUFETUUuT1M0MDAuCgpEYW5pZWwgUyAoMjMgQXVndXN0IDIwMDcpCi0gQnVnIHJlcG9ydCAjMTc3OTc1MSAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3Nzk3NTEpIHBvaW50ZWQKICBvdXQgdGhhdCBkb2luZyBmaXJzdCBhIGZpbGU6Ly8gdXBsb2FkIGFuZCB0aGVuIGFuIEZUUCB1cGxvYWQgY3Jhc2hlZCBsaWJjdXJsCiAgb3IgYXQgYmVzdCBjYXVzZWQgZnVyaW91cyB2YWxncmluZCBjb21wbGFpbnRzLiBGaXhlZCBub3chCgpEYW5pZWwgUyAoMjIgQXVndXN0IDIwMDcpCi0gQnVnIHJlcG9ydCAjMTc3OTA1NCAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NzkwNTQpIHBvaW50ZWQKICBvdXQgdGhhdCBsaWJjdXJsIGRpZG4ndCBkZWFsIHdpdGggdmVyeSBsb25nICg+MTZLKSBGVFAgc2VydmVyIHJlc3BvbnNlIGxpbmVzCiAgcHJvcGVybHkuIFN0YXJ0aW5nIG5vdywgbGliY3VybCB3aWxsIGNob3AgdGhlbSBvZmYgKHRodXMgdGhlIGNsaWVudCBhcHAgd2lsbAogIG5vdCBnZXQgdGhlIGZ1bGwgbGluZSkgYnV0IHN1cnZpdmUgYW5kIGRlYWwgd2l0aCB0aGVtIGZpbmUgb3RoZXJ3aXNlLiBUZXN0CiAgY2FzZSAxMDAzIHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCBTICgyMCBBdWd1c3QgMjAwNykKLSBCYXNlZCBvbiBhIHBhdGNoIGJ5IENocmlzdGlhbiBWb2d0LCB0aGUgRlRQIGNvZGUgbm93IHNldHMgdGhlIHVwY29taW5nCiAgZG93bmxvYWQgdHJhbnNmZXIgc2l6ZSBtdWNoIGVhcmxpZXIgdG8gYmUgcG9zc2libGUgdG8gZ2V0IHJlYWQgd2l0aAogIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIGFzIHNvb24gYXMgcG9zc2libGUuIFRoaXMgaXMgdmVyeSBtdWNoIGluIGEKICBzaW1pbGFyIHNwaXJpdCB0byB0aGUgSFRUUCBzaXplIGNoYW5nZSBmcm9tIEF1Z3VzdCAxMSAyMDA3LgoKRGFuaWVsIFMgKDE4IEF1Z3VzdCAyMDA3KQotIFJvYnNvbiBCcmFnYSBBcmF1am8gZmlsZWQgYnVnIHJlcG9ydCAjMTc3NjIzMgogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc3NjIzMikgYWJvdXQgbGliY3VybCBjYWxsaW5nCiAgQ3VybF9jbGllbnRfd3JpdGUoKSwgcGFzc2luZyBvbiBhIGNvbnN0IHN0cmluZyB0aGF0IHRoZSBjYWxsZXIgbWF5IG5vdAogIG1vZGlmeSBhbmQgeWV0IGl0IGRvZXMgKG9uIHNvbWUgcGxhdGZvcm1zKS4KCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBmaWxlZCBidWcgcmVwb3J0ICMxNzc2MjM1CiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzc2MjM1KSBhYm91dCBmdHAgcmVxdWVzdHMgd2l0aCBOT0JPRFkKICBvbiBhIGRpcmVjdG9yeSB3b3VsZCBkbyBhICJTSVpFIChudWxsKSIgcmVxdWVzdC4gVGhpcyBpcyBub3cgZml4ZWQgYW5kIHRlc3QKICBjYXNlIDEwMDAgd2FzIGFkZGVkIHRvIHZlcmlmeS4KCkRhbmllbCBTICgxNyBBdWd1c3QgMjAwNykKLSBTb25nIE1hIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBjdXJlcyBhIHByb2JsZW0gbGliY3VybCBoYXMgd2hlbiBkb2luZyByZXN1bWUKICBIVFRQIFBVVCB1c2luZyBEaWdlc3QgYXV0aGVudGljYXRpb24uIFRlc3QgY2FzZSA1MzIwIGFuZCA1MzIyIHdlcmUgYWxzbwogIGFkZGVkIHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCkRhbmllbCBTICgxNCBBdWd1c3QgMjAwNykKLSBBbmRyZXcgV2Fuc2luayBwcm92aWRlZCBhbiBOVExNIGJ1Z2ZpeDogaW4gdGhlIGNhc2UgdGhlIHNlcnZlciBzZXRzIHRoZSBmbGFnCiAgTlRMTUZMQUdfTkVHT1RJQVRFX1VOSUNPREUsIHdlIG5lZWQgdG8gZmlsdGVyIGl0IG9mZiBiZWNhdXNlIGxpYmN1cmwgZG9lc24ndAogIFVOSUNPREUgZW5jb2RlIHRoZSBzdHJpbmdzIGl0IHBhY2tzIGludG8gdGhlIE5UTE0gYXV0aGVudGljYXRlIHBhY2tldC4KCkRhbmllbCBTICgxMSBBdWd1c3QgMjAwNykKLSBBbGxlbiBQdWxzaWZlciBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgbGliY3VybCBzZXQgdGhlIGV4cGVjdGVkIGRvd25sb2FkCiAgc2l6ZSBlYXJsaWVyIHdoZW4gZG9pbmcgSFRUUCBkb3dubG9hZHMsIHNvIHRoYXQgYXBwbGljYXRpb25zIGFuZCB0aGUKICBwcm9ncmVzcyBtZXRlciBldGMga25vdyBnZXQgdGhlIGluZm8gZWFybGllciBpbiB0aGUgZmxvdyB0aGFuIGJlZm9yZS4KCi0gUGF0cmljayBNb25uZXJhdCBtb2RpZmllZCB0aGUgTERBUCBjb2RlIGFuZCBhcHByb2FjaCBpbiBjdXJsLiBTdGFydGluZyBub3csCiAgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY2hlY2tzIGZvciBvcGVubGRhcCBhbmQgZnJpZW5kcyBhbmQgd2UgbGluayB3aXRoIHRob3NlCiAgbGlicyBqdXN0IGxpa2Ugd2UgbGluayBhbGwgb3RoZXIgdGhpcmQgcGFydHkgbGlicmFyaWVzLCBhbmQgd2Ugbm8gbG9uZ2VyCiAgZGxvcGVuKCkgdGhvc2UgbGlicmFyaWVzLiBPdXIgcHJpdmF0ZSBoZWFkZXIgZmlsZSBsaWIvbGRhcC5oIHdhcyByZW5hbWVkIHRvCiAgbGliL2N1cmxfbGRhcC5oIGR1ZSB0byB0aGlzLiBJIHNldCBhIHRhZyBpbiBDVlMgKGN1cmwtN18xN18wLXByZWxkYXBmaXgpCiAganVzdCBiZWZvcmUgdGhpcyBjb21taXQsIGp1c3QgaW4gY2FzZS4KCkRhbiBGICg4IEF1Z3VzdCAyMDA3KQotIFNvbmcgTWEgbm90ZWQgYSB6bGliIG1lbW9yeSBsZWFrIGluIHRoZSBpbGxlZ2FsIGNvbXByZXNzZWQgaGVhZGVyCiAgY291bnRlcm1lYXN1cmVzIGNvZGUgcGF0aC4KCkRhbmllbCBTICg0IEF1Z3VzdCAyMDA3KQotIFBhdHJpY2sgTW9ubmVyYXQgZml4ZWQgY3VybF9lYXN5X2VzY2FwZSgpIGFuZCBjdXJseF9zdHJ0b2xsKCkgdG8gd29yayBvbgogIG5vbi1BU0NJSSBzeXN0ZW1zLgoKRGFuaWVsIFMgKDMgQXVndXN0IDIwMDcpCi0gSSBjdXQgb3V0IHN1cHBvcnQgZm9yIGxpYnNzaDIgdmVyc2lvbnMgb2xkZXIgdGhhbiAwLjE2IHRvIG1ha2Ugb3VyIGNvZGUgYQogIGxvdCBzaW1wbGVyLCBhbmQgdG8gYXZvaWQgZ2V0dGluZyB0cm91YmxlIHdpdGggdGhlIExJQlNTSDJfQVBJTk8gZGVmaW5lCiAgdGhhdCAxKSBkaWRuJ3Qgd29yayBwcm9wZXJseSBzaW5jZSBpdCB3YXMgPjMyIGJpdHMgYW5kIDIpIGlzIHJlbW92ZWQgaW4KICBsaWJzc2gyIDAuMTYuLi4KCkRhbmllbCBTICgyIEF1Z3VzdCAyMDA3KQotIFNjb3R0IENhbnRvciBmaWxlZCBidWcgcmVwb3J0ICMxNzY2MzIwCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzY2MzIwKSBwb2ludGluZyBvdXQgdGhhdCB0aGUgbGliY3VybAogIGNvZGUgYWNjZXNzZWQgdHdvIGN1cmxfZWFzeV9zZXRvcHQoKSBvcHRpb25zIChDVVJMT1BUX0ROU19DQUNIRV9USU1FT1VUIGFuZAogIENVUkxPUFRfRE5TX1VTRV9HTE9CQUxfQ0FDSEUpIGFzIGludHMgZXZlbiB0aG91Z2ggdGhleSdyZSBkb2N1bWVudGVkIHRvIGJlCiAgcGFzc2VkIGluIGFzIGxvbmdzLCBhbmQgdGhhdCBtYWtlcyBhIGRpZmZlcmVuY2Ugb24gNjQgYml0IGFyY2hpdGVjdHVyZXMuCgotIERtaXRyaXkgU2VyZ2V5ZXYgcmVwb3J0ZWQgYSByZWdyZXNzaW9uOiByZXN1bWVkIGZpbGU6Ly8gdHJhbnNmZXJzIGJyb2tlCiAgYWZ0ZXIgNy4xNi4yLiBUaGlzIGlzIG11Y2ggZHVlIHRvIHRoZSBkaWZmZXJlbnQgdHJlYXRtZW50IGZpbGU6Ly8gZ2V0cwogIGludGVybmFsbHksIGJ1dCBub3cgSSBhZGRlZCB0ZXN0IDIzMSB0byBtYWtlIGl0IGxlc3MgbGlrZWx5IHRvIGhhcHBlbiBhZ2FpbgogIHdpdGhvdXQgdXMgbm90aWNpbmchCgpEYW5pZWwgUyAoMSBBdWd1c3QgMjAwNykKLSBQYXRyaWNrIE1vbm5lcmF0IGFuZCBJIG1vZGlmaWVkIGxpYmN1cmwgc28gdGhhdCBub3cgaXQgKmNvcGllcyogYWxsIHN0cmluZ3MKICBwYXNzZWQgdG8gaXQgd2l0aCBjdXJsX2Vhc3lfc2V0b3B0KCkhIFByZXZpb3VzbHkgaXQgaGFzIGFsd2F5cyBqdXN0IHJlZmVyZWQKICB0byB0aGUgZGF0YSwgZm9yY2luZyB0aGUgdXNlciB0byBrZWVwIHRoZSBkYXRhIGFyb3VuZCB1bnRpbCBsaWJjdXJsIGlzIGRvbmUKICB3aXRoIGl0LiBUaGF0IGlzIG5vdyBoaXN0b3J5IGFuZCBsaWJjdXJsIHdpbGwgaW5zdGVhZCBjbG9uZSB0aGUgZ2l2ZW4KICBzdHJpbmdzIGFuZCBrZWVwIHByaXZhdGUgY29waWVzLiBUaGlzIGlzIGFsc28gcGFydCBvZiBQYXRyaWNrIE1vbm5lcmF0J3MKICBPUy80MDAgcG9ydC4KCiAgRHVlIHRvIHRoaXMgYmVpbmcgYSBzb21ld2hhdCBpbnRlcmVzdGluZyBjaGFuZ2UgQVBJIHdpc2UsIEkndmUgZGVjaWRlZCB0bwogIGJ1bXAgdGhlIHZlcnNpb24gb2YgdGhlIHVwY29taW5nIHJlbGVhc2UgdG8gNy4xNy4wLiBPbGRlciBhcHBsaWNhdGlvbnMgd2lsbAogIG9mIGNvdXJzZSBub3Qgbm90aWNlIHRoaXMgY2hhbmdlIG5vciBkbyB0aGV5IGhhdmUgdG8gY2FyZSwgYnV0IG5ldwogIGFwcGxpY2F0aW9ucyBjYW4gYmUgd3JpdHRlbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGlzLgoKLSBHcmVnIE1vcnNlIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIFBPU1RpbmcgdXNpbmcgQU5ZQVVUSCB0byBhIHNlcnZlcgogIHJlcXVpcmluZyBOVExNLCBhbmQgaGUgcHJvdmlkZWQgdGVzdCBjb2RlIGFuZCBhIHRlc3Qgc2VydmVyIGFuZCB3ZSB3b3JrZWQKICBvdXQgYSBidWcgZml4LiBXZSBmYWlsZWQgdG8gY291bnQgc2VudCBib2R5IGRhdGEgYXQgdGltZXMsIHdoaWNoIHRoZW4gY2F1c2VkCiAgaW50ZXJuYWwgY29uZnVzaW9ucyB3aGVuIGxpYmN1cmwgdHJpZWQgdG8gc2VuZCB0aGUgcmVzdCBvZiB0aGUgZGF0YSBpbiBvcmRlcgogIHRvIG1haW50YWluIHRoZSBzYW1lIGNvbm5lY3Rpb24gYWxpdmUuCgpEYW5pZWwgUyAoMzEgSnVseSAyMDA3KQotIFBldGVyIE8nR29ybWFuIHBvaW50ZWQgb3V0IChhbmQgZml4ZWQpIHRoYXQgdGhlIG5vbi1ibG9ja2luZyBjaGVjayBpbgogIGNvbmZpZ3VyZSBtYWRlIGxpYmN1cmwgdXNlIGJsb2NraW5nIHNvY2tldHMgb24gQUlYIDQgYW5kIDUsIHdoaWxlIHRoYXQKICB3YXNuJ3QgdGhlIGludGVudGlvbi4KCkRhbmllbCBTICgyOSBKdWx5IDIwMDcpCi0gSmF5ZXNoIEEgU2hhaCBmaWxlZCBidWcgcmVwb3J0ICMxNzU5NTQyCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzU5NTQyKSBpZGVudGlmeWluZyBhIHJhdGhlciBzZXJpb3VzCiAgcHJvYmxlbSB3aXRoIEZUUFM6IGxpYmN1cmwgY2xvc2VkIHRoZSBkYXRhIGNvbm5lY3Rpb24gc29ja2V0IGFuZCB0aGVuIGxhdGVyCiAgaW4gdGhlIGZsb3cgaXQgd291bGQgY2FsbCB0aGUgU1NMIGxheWVyIHRvIGRvIFNTTCBzaHV0ZG93biB3aGljaCB0aGVuIHdvdWxkCiAgdXNlIGEgc29ja2V0IHRoYXQgaGFkIGFscmVhZHkgYmVlbiBjbG9zZWQgLSBzbyBpZiB0aGUgYXBwbGljYXRpb24gaGFkIG9wZW5lZAogIGEgbmV3IG9uZSBpbiB0aGUgbWVhbiB0aW1lLCBsaWJjdXJsIGNvdWxkIHNlbmQgZ2liYmVyaXNoIHRoYXQgd2F5ISBJIHdvcmtlZAogIHdpdGggR3JlZyBaYXZlcnRuaWsgdG8gcHJvcGVybHkgZGlhZ25vc2UgYW5kIGZpeCB0aGlzLiBUaGUgZml4IGFmZmVjdHMgY29kZQogIGZvciBhbGwgU1NMIGxpYnJhcmllcyB3ZSBzdXBwb3J0LCBidXQgaXQgaGFzIG9ubHkgYmVlbiB0cnVseSB2ZXJpZmllZCB0bwogIHdvcmsgZmluZSBmb3IgdGhlIE9wZW5TU0wgdmVyc2lvbi4gVGhlIG90aGVycyBoYXZlIG9ubHkgYmVlbiBjb2RlIHJldmlld2VkLgoKRGFuaWVsIFMgKDIzIEp1bHkgMjAwNykKLSBJbXBsZW1lbnRlZCB0aGUgcGFydHMgb2YgUGF0cmljayBNb25uZXJhdCdzIE9TLzQwMCBwYXRjaCB0aGF0IGludHJvZHVjZXMKICBzdXBwb3J0IGZvciB0aGUgT1MvNDAwIFNlY3VyZSBTb2NrZXRzIExheWVyIGxpYnJhcnkuCgpEYW4gRiAoMjMgSnVseSAyMDA3KQotIEltcGxlbWVudGVkIG9ubHkgdGhlIHBhcnRzIG9mIFBhdHJpY2sgTW9ubmVyYXQncyBPUy80MDAgcGF0Y2ggdGhhdCByZW5hbWVkCiAgc29tZSBmZXcgaW50ZXJuYWwgaWRlbnRpZmllcnMgdG8gYXZvaWQgY29uZmxpY3RzLCB3aGljaCBjb3VsZCBiZSB1c2VmdWwgb24KICBvdGhlciBwbGF0Zm9ybXMuCgpEYW5pZWwgUyAoMjIgSnVseSAyMDA3KQotIEhUVFAgRGlnZXN0IGJ1ZyBmaXggYnkgQ2hyaXMgRmxlcmFja2VyczoKCiAgU2NlbmFyaW8KCiAgLSBQZXJmb21pbmcgYSBQT1NUIHJlcXVlc3Qgd2l0aCBib2R5CiAgLSBXaXRoIGF1dGhlbnRpY2F0aW9uIChvbmx5IERpZ2VzdCkKICAtIFJlLXVzaW5nIGEgY29ubmVjdGlvbgoKICBsaWJjdXJsIHdvdWxkIHNlbmQgYSBIVFRQIFBPU1Qgd2l0aCBhbiBBdXRob3JpemF0aW9uIGhlYWRlciBidXQgd2l0aG91dAogIGJvZHkuIE91ciBzZXJ2ZXIgd291bGQgcmV0dXJuIDQwMCBCYWQgUmVxdWVzdCBpbiB0aGF0IGNhc2UgKGJlY2F1c2UKICBhdXRoZW50aWNhdGlvbiBwYXNzZWQsIGJ1dCB0aGUgYm9keSB3YXMgZW1wdHkpLgoKICBDYXVzZQoKICAxKSBodHRwX2RpZ2VzdC5jIC0+IEN1cmxfb3V0cHV0X2RpZ2VzdAogIC0gVXBkYXRlcyBhbGxvY3B0ci51c2VycHdkL2FsbG9jcHRyLnByb3h5dXNlcnB3ZCAqb25seSogaWYgZC0+bm9uY2UgaXMKICBmaWxsZWQgaW4gKGFuZCBubyBlcnJvcnMpCiAgLSBhdXRocC0+ZG9uZSA9IFRSVUUgaWYgZC0+bm9uY2UgaXMgZmlsbGVkIGluCiAgMikgaHR0cC5jIC0+IEN1cmxfaHR0cAogIC0gKkFsd2F5cyogdXNlcyBhbGxvY3B0ci51c2VycHdkL2FsbG9jcHRyLnByb3h5dXNlcnB3ZCBpZiBub3QgTlVMTAogIDMpIGh0dHAuYyAtPiBDdXJsX2h0dHAsIEN1cmxfaHR0cF9vdXRwdXRfYXV0aAoKICBTbyB3aGF0IGhhcHBlbnMgaXMgdGhhdCBDdXJsX291dHB1dF9kaWdlc3QgY2Fubm90IHlldCB1cGRhdGUgdGhlCiAgQXV0aG9yaXphdGlvbiBoZWFkZXIgKGFsbG9jcHRyLnVzZXJwd2QpIHdoaWNoIHJlc3VsdHMgaW4gYXV0aGhvc3QtPmRvbmU9MCAtPgogIGF1dGhob3N0LT5tdWx0aT0xIC0+IGNvbm4tPmJpdHMuYXV0aG5lZyA9IFRSVUUuICBUaGUgYm9keSBpcyBub3QKICBhZGRlZC4gKkhvd2V2ZXIqLCBhbGxvY3B0ci51c2VycHdkIGlzIHN0aWxsIHVzZWQgd2hlbiBidWlsZGluZyB0aGUgcmVxdWVzdAoKLSBBZGRlZCB0ZXN0IGNhc2UgMzU0IHRoYXQgbWFrZXMgYSBzaW1wbGUgRlRQIHJldHJpZXZhbCB3aXRob3V0IHBhc3N3b3JkLCB3aGljaAogIHZlcmlmaWVzIHRoZSBidWcgZml4IGluICMxNzU3MzI4LgoKRGFuaWVsIFMgKDIxIEp1bHkgMjAwNykKLSBUbyBhbGxvdyBtb3JlIGZsZXhpYmlsaXR5IGluIEZUUCB0ZXN0IGNhc2VzLCBJJ3ZlIHJlbW92ZWQgdGhlIGVuZm9yY2VkIHN0YXRlcwogIGZyb20gdGhlIHRlc3Qgc2VydmVyIGNvZGUgYXMgdGhleSBzZXJ2ZWQgbm8gcmVhbCBwdXJwb3NlLiBUaGUgdGVzdCBzZXJ2ZXIKICBpcyBoZXJlIHRvIHNlcnZlIGZvciB0aGUgdGVzdCBjYXNlcywgbm90IHRvIGF0dGVtcHQgdG8gZnVuY3Rpb24gYXMgYSByZWFsCiAgc2VydmVyISBXaGlsZSBhdCBpdCwgSSBtb2RpZmllZCB0ZXN0IGNhc2UgMTQxIHRvIGJldHRlciB0ZXN0IGFuZCB2ZXJpZnkKICBjdXJsIC1JIG9uIGEgc2luZ2xlIEZUUCBmaWxlLgoKRGFuaWVsIFMgKDIwIEp1bHkgMjAwNykKLSBKYW1lcyBIb3VzbGV5IGZpeGVkIHRoZSBTRlRQIFBXRCBjb21tYW5kIHRvIHdvcmsuCgotIFJhbGYgUy4gRW5nZWxzY2hhbGwgZmlsZWQgYnVnIHJlcG9ydCAjMTc1NzMyOAogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc1NzMyOCkgYW5kIHN1Ym1pdHRlZCBhIHBhdGNoLiBJdAogIHR1cm5zIG91dCB3ZSBicm9rZSBsb2dpbiB0byBGVFAgc2VydmVycyB0aGF0IGRvbid0IHJlcXVpcmUgKG5vciB1bmRlcnN0YW5kKQogIFBBU1MgYWZ0ZXIgdGhlIFVTRVIgY29tbWFuZC4gVGhlIGJyZWFrYWdlIHdhcyBkb25lIGFzIHBhcnQgb2YgdGhlIGtyYjUKICBjb21taXQgc28gYSBrcmItdXNpbmcgcGVyc29uIG5lZWRzIHRvIHZlcmlmeSB0aGF0IHRoZSBjdXJyZW50IHZlcnNpb24gbm93CiAgd29ya3Mgb3IgaWYgd2UgbmVlZCB0byBmaXggaXQgKGluIGEgZGlmZmVyZW50IHdheSBvZiBjb3Vyc2UpLgoKRGFuIEYgKDE3IEp1bHkgMjAwNykKLSBGaXhlZCB0ZXN0IGNhc2VzIDYxMyBhbmQgNjE0IGJ5IGltcHJvdmluZyB0aGUgbG9nIHBvc3Rwcm9jZXNzb3IgdG8gaGFuZGxlCiAgYSBuZXcgZGlyZWN0b3J5IGxpc3RpbmcgZm9ybWF0IHRoYXQgbmV3ZXIgbGlic3NoMidzIGNhbiBwcm92aWRlLiAgVGhpcwogIGlzIHByb2JhYmx5IE5PVCBzdWZmaWNpZW50IHRvIGhhbmRsZSBhbGwgZGlyZWN0b3J5IGxpc3RpbmcgZm9ybWF0cyB0aGF0CiAgc2VydmVyJ3MgY2FuIHByb3ZpZGUsIGFuZCBzaG91bGQgYmUgcmV2aXNpdGVkLgoKRGFuaWVsIFMgKDE3IEp1bHkgMjAwNykKLSBEYW5pZWwgSm9obnNvbiBmaXhlZCBhIGJ1ZyBpbiBob3cgbGlic3NoMl9zZXNzaW9uX2xhc3RfZXJyb3IoKSB3YXMgdXNlZCwgaW4KICB0d28gcGxhY2VzLgoKLSBKb2ZlbGwgR2FsbGFyZG8gcG9zdGVkIGEgbGliY3VybCBsb2cgdXNpbmcgRlRQIHRoYXQgZXhwb3NlZCBhIGJ1ZyB3aGljaCBtYWRlCiAgYSBjb250cm9sIGNvbm5lY3Rpb24gdGhhdCB3YXMgZGVlbWVkICJkZWFkIiB0byB5ZXQgYmUgcmUtdXNlZCBpbiBhIGZvbGxvd2luZwogIHJlcXVlc3QuCgpEYW5pZWwgUyAoMTMgSnVseSAyMDA3KQotIENvbGluIEhvZ2JlbiBmaWxlZCBidWcgcmVwb3J0ICMxNzUwMjc0CiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzUwMjc0KSBhbmQgc3VibWl0dGVkIGEgcGF0Y2ggZm9yIHRoZQogIGNhc2Ugd2hlcmUgbGliY3VybCBkaWQgYSBjb25uZWN0IGF0dGVtcHQgdG8gYSBub24tbGlzdGVuaW5nIHBvcnQgYW5kIGRpZG4ndAogIHByb3ZpZGUgYSBodW1hbiByZWFkYWJsZSBlcnJvciBzdHJpbmcgYmFjay4KCi0gRGFuaWVsIENhdGVyIGZpeGVzOgogIDEgLSBtYWRlICdtYWtlIHZjOCcgd29yayBvbiB3aW5kb3dzLgogIDIgLSBtYWRlIGxpYmN1cmwgaXRzZWxmIGJ1aWx0IHdpdGggQ1VSTF9OT19PTERJRVMgZGVmaW5lZCAod2hpY2ggZG9lc24ndAogICAgICBkZWZpbmUgdGhlIHN5bWJvbHMgZm9yIGJhY2t3YXJkcyBzb3VyY2UgY29tcGF0aWJpbGl0eSkKICAzIC0gdXBkYXRlZCBsaWJjdXJsLWVycm9ycy4zCiAgNCAtIGFkZGVkIENVUkxfRElTQUJMRV9URlRQIHRvIGRvY3MvSU5TVEFMTAoKRGFuaWVsIFMgKDEyIEp1bHkgMjAwNykKLSBNYWRlIHRoZSBrcmI1IGNvZGUgYnVpbGQgd2l0aCBIZWltZGFsJ3MgR1NTQVBJIGxpYi4KCkRhbiBGICgxMiBKdWx5IDIwMDcpCi0gQ29tcGlsZSBtb3N0IG9mIHRoZSBleGFtcGxlIGFwcHMgaW4gZG9jcy9leGFtcGxlcyB3aGVuIGRvaW5nIGEgJ21ha2UgY2hlY2snLgogIEZpeGVkIHNvbWUgY29tcGlsZSB3YXJuaW5ncyBhbmQgZXJyb3JzIGluIHRob3NlIGV4YW1wbGVzLgoKLSBSZW1vdmVkIHRoZSBleGFtcGxlIHByb2dyYW0gZnRwM3JkcGFydHkuYyBzaW5jZSBsaWJjdXJsIGRvZXNuJ3Qgc3VwcG9ydAogIDNyZCBwYXJ0eSBGVFAgdHJhbnNmZXJzIGFueSBsb25nZXIuCgpEYW5pZWwgUyAoMTIgSnVseSAyMDA3KQotIFNobXVsaWsgUmVnZXYgZm91bmQgYW4gKGFsYmVpdCByYXJlKSBjYXNlIHdoZXJlIHRoZSBwcm94eSBDT05ORUNUIG9wZXJhdGlvbgogIGNvdWxkIGluIGZhY3QgZ2V0IHN0dWNrIGluIGFuIGVuZGxlc3MgbG9vcC4KCi0gTWFkZSBDVVJMT1BUX1NTTF9WRVJJRllIT1NUIHNldCB0byAxIGFjdHMgYXMgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uOgogIGZhaWwgdG8gY29ubmVjdCBpZiB0aGVyZSBpcyBubyBDb21tb24gTmFtZSBmaWVsZCBmb3VuZCBpbiB0aGUgcmVtb3RlIGNlcnQuCiAgV2Ugc2hvdWxkIGRlcHJlY2F0ZSB0aGUgc3VwcG9ydCBmb3IgdGhpcyBzZXQgdG8gMSBhbnl3YXkgc29vbiwgc2luY2UgdGhlCiAgZmVhdHVyZSBpcyBwb2ludGxlc3MgYW5kIG1vc3QgbGlrZWx5IG5ldmVyIHJlYWxseSB1c2VkIGJ5IGFueW9uZS4KCkRhbmllbCBTICgxMSBKdWx5IDIwMDcpCi0gU2htdWxpayBSZWdldiBmaXhlZCBhIGJ1ZyB3aXRoIHRyYW5zZmVyLWVuY29kaW5nIHNraXBwaW5nIGR1cmluZyB0aGUgNDA3CiAgZXJyb3IgcGFnZXMgZm9yIHByb3h5IGF1dGhlbnRpY2F0aW9uLgoKLSBHaWFuY2FybG8gRm9ybWljdWNjaWEgcmVwb3J0ZWQgYW5kIGZpeGVkIGEgcHJvYmxlbSB3aXRoIGEgY2xvc2VkIGNvbm5lY3Rpb24KICB0byBhIHByb3h5IGR1cmluZyBDT05ORUNUIGF1dGggbmVnb3RpYXRpb24uCgpEYW4gRiAoMTAgSnVseSAyMDA3KQotIEZpeGVkIGEgY3VybCBtZW1vcnkgbGVhayByZXBvcnRlZCBieSBTb25nIE1hIHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uCiAgb2YgdGhlIHBhdGNoIGhlIHN1Z2dlc3RlZC4gIEFkZGVkIGhpcyB0ZXN0IGNhc2UgYXMgdGVzdDI4OSB0byB2ZXJpZnkuCgotIEZvcmNlIHRoZSB0aW1lIHpvbmUgdG8gR01UIGluIHRoZSBjb29raWUgdGVzdHMgaW4gY2FzZSB0aGUgdXNlciBpcwogIHVzaW5nIG9uZSBvZiB0aGUgc28tY2FsbGVkICdyaWdodCcgdGltZSB6b25lcyB0aGF0IHRha2UgaW50byBhY2NvdW50CiAgbGVhcCBzZWNvbmRzLCB3aGljaCBjYXVzZXMgdGhlIHRlc3RzIHRvIGZhaWwgKGFzIHJlcG9ydGVkIGJ5CiAgRGFuaWVsIEJsYWNrIGluIGJ1ZyByZXBvcnQgIzE3NDU5NjQpLgoKVmVyc2lvbiA3LjE2LjQgKDEwIEp1bHkgMjAwNykKCkRhbmllbCBTICgxMCBKdWx5IDIwMDcpCi0gS2VlcyBDb29rIG5vdGlmaWVkIHVzIGFib3V0IGEgc2VjdXJpdHkgZmxhdwogIChodHRwczovL2N1cmwuaGF4eC5zZS9kb2NzL2Fkdl8yMDA3MDcxMC5odG1sKSBpbiB3aGljaCBsaWJjdXJsIGZhaWxlZCB0bwogIHByb3Blcmx5IHJlamVjdCBzb21lIG91dGRhdGVkIG9yIG5vdCB5ZXQgdmFsaWQgc2VydmVyIGNlcnRpZmljYXRlcyB3aGVuCiAgYnVpbHQgd2l0aCBHbnVUTFMuIEtlZXMgYWxzbyBwcm92aWRlZCB0aGUgcGF0Y2guCgpKYW1lcyBIICg1IEp1bHkgMjAwNykKLSBHYXZyaWUgUGhpbGlwc29uIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCB3aWxsIHVzZSBhIG1vcmUgc3BlY2lmaWMgZXJyb3IKICBtZXNzYWdlIGZvciBhbiBzY3A6Ly8gdXBsb2FkIGZhaWx1cmUuICBJZiBsaWJzc2gyIGhhcyBoaXMgbWF0Y2hpbmcKICBwYXRjaCwgdGhlbiB0aGUgZXJyb3IgbWVzc2FnZSByZXR1cm4gYnkgdGhlIHNlcnZlciB3aWxsIGJlIHVzZWQgaW5zdGVhZAogIG9mIGEgbW9yZSBnZW5lcmljIGVycm9yLgoKRGFuaWVsIFMgKDEgSnVseSAyMDA3KQotIFRob21hcyBKLiBNb29yZSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBLZXJiZXJvczUgc3VwcG9ydCBpbgogIGxpYmN1cmwuIFRoaXMgYWxzbyBtYWtlcyB0aGUgb3B0aW9ucyBjaGFuZ2UgbmFtZSB0byAtLWtyYiAoZnJvbSAtLWtyYjQpIGFuZAogIENVUkxPUFRfS1JCTEVWRUwgKGZyb20gQ1VSTE9QVF9LUkI0TEVWRUwpIGJ1dCB0aGUgb2xkIG5hbWVzIGFyZSBzdGlsbAoKLSBTb25nIE1hIGhlbHBlZCBtZSB2ZXJpZnkgYW5kIGV4dGVuZCBhIGZpeCBmb3IgZG9pbmcgRlRQIG92ZXIgYSBTT0NLUzQvNQogIHByb3h5LgoKRGFuaWVsIFMgKDI3IEp1bmUgMjAwNykKLSBKYW1lcyBIb3VzbGV5OiBBZGQgdHdvIG5ldyBvcHRpb25zIGZvciB0aGUgU0ZUUC9TQ1AvRklMRSBwcm90b2NvbHM6CiAgQ1VSTE9QVF9ORVdfRklMRV9QRVJNUyBhbmQgQ1VSTE9QVF9ORVdfRElSRUNUT1JZX1BFUk1TLiBUaGVzZSBjb250cm9sIHRoZQogIHByZW1pc3Npb25zIGZvciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgY3JlYXRlZCBvbiB0aGUgcmVtb3RlCiAgc2VydmVyLiBDVVJMT1BUX05FV19GSUxFX1BFUk1TIGRlZmF1bHRzIHRvIDA2NDQgYW5kCiAgQ1VSTE9QVF9ORVdfRElSRUNUT1JZX1BFUk1TIGRlZmF1bHRzIHRvIDA3NTUKCi0gSSBjb3JyZWN0ZWQgdGhlIDEwLWF0LWEtdGltZS5jIGV4YW1wbGUgYW5kIGFwcGxpZWQgYSBwYXRjaCBmb3IgaXQgYnkgSmFtZXMKICBCdXJzYS4KCkRhbmllbCBTICgyNiBKdW5lIDIwMDcpCi0gUm9iZXJ0IElha29iYXNodmlsaSByZS1hcnJhbmdlZCB0aGUgaW50ZXJuYWwgaGFzaCBjb2RlIHRvIHdvcmsgd2l0aCBhIGN1c3RvbQogIGhhc2ggZnVuY3Rpb24gZm9yIGRpZmZlcmVudCBoYXNoZXMsIGFuZCBhbHNvIGV4cGFuZGVkIHRoZSBkZWZhdWx0IHNpemUgZm9yCiAgdGhlIHNvY2tldCBoYXNoIHRhYmxlIHVzZWQgaW4gbXVsdGkgaGFuZGxlcyB0byBncmVhdGx5IGVuaGFuY2Ugc3BlZWQgd2hlbgogIHZlcnkgbWFueSBjb25uZWN0aW9ucyBhcmUgYWRkZWQgYW5kIHRoZSBzb2NrZXQgQVBJIGlzIHVzZWQuCgotIEphbWVzIEhvdXNsZXkgbWFkZSB0aGUgQ1VSTE9QVF9GVFBMSVNUT05MWSBtb2RlIHdvcmsgZm9yIFNGVFAgZGlyZWN0b3J5CiAgbGlzdGluZ3MgYXMgd2VsbAoKRGFuaWVsIFMgKDI1IEp1bmUgMjAwNykKLSBBZGp1c3RlZCBob3cgbGliY3VybCB0cmVhdHMgSFRUUCAxLjEgcmVzcG9uc2VzIHdpdGhvdXQgY29udGVudC1sZW50aCBvcgogIGNodW5rZWQgZW5jb2RpbmcgKHRoYXQgYWxzbyBsYWNrcyAiQ29ubmVjdGlvbjogY2xvc2UiKS4gSXQgbm93IHNpbXBseQogIGFzc3VtZXMgdGhhdCB0aGUgY29ubmVjdGlvbiBXSUxMIGJlIGNsb3NlZCB0byBzaWduYWwgdGhlIGVuZCwgYXMgdGhhdCBpcyBob3cKICBSRkMyNjE2IHNlY3Rpb24gNC40IHBvaW50ICM1IHNheXMgd2Ugc2hvdWxkIGJlaGF2ZS4KClZlcnNpb24gNy4xNi4zICgyNSBKdW5lIDIwMDcpCgpEYW5pZWwgUyAoMjMgSnVuZSAyMDA3KQotIEFzIHJlcG9ydGVkIGJ5ICJUcm8iIGluIGh0dHBzOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDctMDYvMDE2MS5odG1sIGFuZAogIGh0dHBzOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDctMDYvMDIzOC5odG1sLCBsaWJjdXJsIGRpZG4ndCBwcm9wZXJseSBkbwogIG5vLWJvZHkgcmVxdWVzdHMgb24gRlRQIGZpbGVzIG9uIHJlLXVzZWQgY29ubmVjdGlvbnMgcHJvcGVybHksIG9yIGF0IGxlYXN0CiAgaXQgZGlkbid0IHByb3ZpZGUgdGhlIGluZm8gYmFjayBpbiB0aGUgaGVhZGVyIGNhbGxiYWNrIHByb3Blcmx5IGluIHRoZQogIHN1YnNlcXVlbnQgcmVxdWVzdHMuCgpEYW5pZWwgUyAoMjEgSnVuZSAyMDA3KQotIEdlcnJpdCBCcnVjaGjkdXNlciBwb2ludGVkIG91dCBhIHdhcm5pbmcgdGhhdCB0aGUgSW50ZWwoUikgVGhyZWFkIENoZWNrZXIKICB0b29sIHJlcG9ydHMgYW5kIGl0IHdhcyBpbmRlZWQgYSBsZWdpdGltYXRlIG9uZSBhbmQgaXQgaXMgb25lIGZpeGVkLiBJdCB3YXMKICBhIHVzZSBvZiBhIHNoYXJlIHdpdGhvdXQgZG9pbmcgdGhlIHByb3BlciBsb2NraW5nIGZpcnN0LgoKRGFuaWVsIFMgKDIwIEp1bmUgMjAwNykKLSBBZGFtIFBpZ2dvdHQgZmlsZWQgYnVnIHJlcG9ydCAjMTc0MDI2MwogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc0MDI2MykuIEFkYW0gZGlzY292ZXJlZCB0aGF0IHdoZW4KICBnZXR0aW5nIGEgbGFyZ2UgYW1vdW50IG9mIFVSTHMgd2l0aCBjdXJsLCB0aGV5IHdlcmUgZmV0Y2hlZCBzbG93ZXIgYW5kCiAgc2xvd2VyLi4uIHdoaWNoIHR1cm5lZCBvdXQgdG8gYmUgYmVjYXVzZSB0aGUgLS1saWJjdXJsIGRhdGEgY29sbGVjdGluZyB3aGljaAogIHdyb25nbHkgYWx3YXlzIHdhcyBlbmFibGVkLCBidXQgbm8gbG9uZ2VyIGlzLi4uCgpEYW5pZWwgUyAoMTggSnVuZSAyMDA3KQotIFJvYnNvbiBCcmFnYSBBcmF1am8gZmlsZWQgYnVnIHJlcG9ydCAjMTczOTEwMAogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTczOTEwMCkgdGhhdCBtZW50aW9uZWQgdGhhdCBsaWJjdXJsCiAgY291bGQgbm90IGFjdHVhbGx5IGxpc3QgdGhlIGNvbnRlbnRzIG9mIHRoZSByb290IGRpcmVjdG9yeSBvZiBhIGdpdmVuIEZUUAogIHNlcnZlciBpZiB0aGUgbG9naW4gZGlyZWN0b3J5IGlzbid0IHJvb3QuIEkgZml4ZWQgdGhlIHByb2JsZW0gYW5kIGFkZGVkCiAgdGhyZWUgdGVzdCBjYXNlcyAob25lIGlzIGRpc2FibGVkIGZvciBub3cgc2luY2UgSSBpZGVudGlmaWVkIEtOT1dOX0JVR1MgIzQ0LAogIHdlIGNhbm5vdCB1c2UgLS1mdHAtbWV0aG9kIG5vY3dkIGFuZCBsaXN0IGZ0cCBkaXJlY3RvcmllcykuCgpEYW5pZWwgUyAoMTQgSnVuZSAyMDA3KQotIFNobXVsaWsgUmVnZXY6CgogIEkndmUgZW5jb3VudGVyZWQgKGFuZCBob3BlZnVsbHkgZml4ZWQpIGEgcHJvYmxlbSBpbnZvbHZpbmcgcHJveHkgQ09OTkVDVAogIHJlcXVlc3RzIGFuZCBlYXN5IGhhbmRsZXMgc3RhdGUgbWFuYWdlbWVudC4gVGhlIHByb2JsZW0gaXNuJ3Qgc2ltcGxlIHRvCiAgcmVwcm9kdWNlIHNpbmNlIGl0IGRlcGVuZHMgb24gc29ja2V0IHN0YXRlLiBJdCBvbmx5IG1hbmlmZXN0cyBpdHNlbGYgd2hlbgogIHdvcmtpbmcgd2l0aCBub24tYmxvY2tpbmcgc29ja2V0cy4KCiAgSGVyZSBpcyB0aGUgc2NlbmFyaW86CgogIDEuIGluIG11bHRpX3J1bnNpbmdsZSB0aGUgZWFzeSBoYW5kbGUgaXMgaW4gdGhlIENVUkxNX1NUQVRFX1dBSVRDT05ORUNUIGFuZAogIGNhbGxzIEN1cmxfcHJvdG9jb2xfY29ubmVjdAoKICAyLiBpbiBDdXJsX3Byb3h5Q09OTkVDVCwgbGluZSAxMjQ3LCBpZiB0aGUgc29ja2V0IGlzbid0IHJlYWR5IHRoZSBmdW5jdGlvbgogIHJldHVybnMgYW5kIGNvbm4tPmJpdHMudHVubmVsX2Nvbm5lY3RpbmcgaXMgVFJVRQoKICAzLiB3aGVuIHRoZSBjYWxsIHRvIEN1cmxfcHJvdG9jb2xfY29ubmVjdCByZXR1cm5zIHRoZSBwcm90b2NvbF9jb25uZWN0IGZsYWcKICBpcyBmYWxzZSBhbmQgdGhlIGVhc3kgc3RhdGUgaXMgY2hhbmdlZCB0byBDVVJMTV9TVEFURV9QUk9UT0NPTk5FQ1Qgd2hpY2gKICBpc24ndCBjb3JyZWN0IGlmIGEgcHJveHkgaXMgdXNlZC4gIFJhdGhlciBDVVJMTV9TVEFURV9XQUlUUFJPWFlDT05ORUNUCiAgc2hvdWxkIGJlIHVzZWQuCgogIEkgZGlzY292ZXJlZCB0aGlzIHdoaWxlIHBlcmZvcm1pbmcgYW4gSFRUUFMgcmVxdWVzdCB0aHJvdWdoIGEgcHJveHkgKHNxdWlkKQogIG9uIG15IGxvY2FsIG5ldHdvcmsuIFRoZSBwcm9ibGVtIGNhdXNlZCBvcGVuc3NsIHRvIGZhaWwgYXMgaXQgcmVhZCB0aGUgcHJveHkKICByZXNwb25zZSB0byB0aGUgQ09OTkVDVCBjYWxsICgnSFRUUC8xLjAgRXN0YWJsaXNoZWQnKSByYXRoZXIgdGhhbiB0aGUgU1NMCiAgaGFuZHNoYWtlICh0aGUgZXhhY3Qgb3BlbnNzbCBlcnJvciB3YXMgJ3dyb25nIHNzbCB2ZXJzaW9uJyBidXQgdGhpcyBpc24ndAogIHZlcnkgaW1wb3J0YW50KQoKLSBEYXZlIFZhc2lsZXZza3kgZmlsZWQgYnVnIHJlcG9ydCAjMTczNjg3NQogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTczNjg3NSkgYWxtb3N0IHNpbXVsdGFub3Vlc2x5IGFzIERhbgogIEZhbmRyaWNoIG1lbnRpb25lZCBhIHJlbGF0ZWQgYnVpbGQgcHJvYmxlbSBvbiB0aGUgbGliY3VybCBtYWlsaW5nIGxpc3Q6CiAgaHR0cHM6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNy0wNi8wMTMxLmh0bWwuIEJvdGggcHJvYmxlbXMgaGFkIHRoZSBzYW1lCiAgcmVhc29uOiB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIFBPTEwqIGRlZmluZXMgYW5kIHRoZSBwb2xsZmQgc3RydWN0IGluIHRoZQogIGxpYmN1cmwgY29kZSB3YXMgZGVwZW5kaW5nIG9uIEhBVkVfUE9MTCBpbnN0ZWFkIG9mIEhBVkVfU1lTX1BPTExfSC4KCkRhbmllbCBTICgxMyBKdW5lIDIwMDcpCi0gVG9tIFJlZ25lciBwcm92aWRlZCBhIHBhdGNoIGFuZCB3b3JrZWQgdG9nZXRoZXIgd2l0aCBKYW1lcyBIb3VzbGV5LCBzbyBub3cKICBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTIHdvcmtzIGZvciBTRlRQIGNvbm5lY3Rpb25zIGFzIHdlbGwgYXMgRlRQCiAgb25lcy4KCi0gUmljaCBSYXVlbnphaG4gZmlsZWQgYnVnIHJlcG9ydCAjMTczMzExOQogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTczMzExOSkgYW5kIHdlIGNvbGxhYm9yYXRlZCBvbiB0aGUKICBmaXguICBUaGUgcHJvYmxlbSBpcyB0aGF0IGZvciA2NGJpdCBIUFVYIGJ1aWxkcywgc2V2ZXJhbCBzb2NrZXQtcmVsYXRlZAogIGZ1bmN0aW9ucyB3b3VsZCBzdGlsbCBhc3N1bWUgaW50ICgzMiBiaXQpIGFyZ3VtZW50cyBhbmQgbm90IHNvY2tsZW5fdCAoNjQKICBiaXQpIG9uZXMuCgpEYW5pZWwgUyAoMTIgSnVuZSAyMDA3KQotIEphbWVzIEhvdXNsZXkgYnJvdWdodCBoaXMgcmV2YW1wZWQgU1NIIGNvZGUgdGhhdCBpcyBzdGF0ZS1tYWNoaW5lIGRyaXZlbiB0bwogIHJlYWxseSB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbm93IHRvdGFsbHkgbm9uLWJsb2NraW5nIGxpYnNzaDIgKGluIENWUykuCgpEYW4gRiAoOCBKdW5lIDIwMDcpCi0gSW5jb3Jwb3JhdGVkIERhbmllbCBCbGFjaydzIHRlc3Q3MDYgYW5kIHRlc3Q3MDcgU09DS1MgdGVzdCBjYXNlcy4KCi0gRml4ZWQgYSBmZXcgcHJvYmxlbXMgd2hlbiBzdGFydGluZyB0aGUgU09DS1Mgc2VydmVyLgoKLSBSZXZlcnRlZCBzb21lIHJlY2VudCBjaGFuZ2VzIHRvIHJ1bnRlc3RzLnBsIHRoYXQgd2VyZW4ndCBjb21wYXRpYmxlIHdpdGgKICBwZXJsIDUuMC4KCi0gRml4ZWQgdGhlIHRlc3QgaGFybmVzcyBzbyB0aGF0IGl0IGFjdHVhbGx5IGtpbGxzIHRoZSBzc2ggYmVpbmcgdXNlZCBhcwogIHRoZSBTT0NLUyBzZXJ2ZXIuCgpEYW5pZWwgUyAoNiBKdW5lIDIwMDcpCi0gLXMvLS1zaWxlbnQgY2FuIG5vdyBiZSB1c2VkIHRvIHRvZ2dsZSBvZmYgdGhlIHNpbGVuY2UgYWdhaW4gaWYgdXNlZCBhIHNlY29uZAogIHRpbWUuCgpEYW5pZWwgUyAoNSBKdW5lIDIwMDcpCi0gQWRkZWQgRGFuaWVsIEJsYWNrJ3Mgd29yayB0aGF0IGFkZHMgdGhlIGZpcnN0IGZldyBTT0NLUyB0ZXN0IGNhc2VzLiBJIGFsc28KICBmaXhlZCB0d28gbWlub3IgU09DS1MgcHJvYmxlbXMgdG8gbWFrZSB0aGUgdGVzdCBjYXNlcyBydW4gZmluZS4KCkRhbmllbCBTICgzMSBNYXkgMjAwNykKLSBGZW5nIFR1IG1hZGUgKGxpYiljdXJsIHN1cHBvcnQgInVwbG9hZCIgcmVzdW1pbmcgd29yayBmb3IgZmlsZTovLyBVUkxzLgoKRGFuaWVsIFMgKDMwIE1heSAyMDA3KQotIEkgbW9kaWZpZWQgdGhlIDEwLWF0LWEtdGltZS5jIGV4YW1wbGUgdG8gdHJhbnNmZXIgNTAwIGRvd25sb2FkcyBpbiBwYXJhbGxlbAogIHdpdGggYSBjLWFyZXMgZW5hYmxlZCBidWlsZCBvbmx5IHRvIGZpbmQgdGhhdCBpdCBjcmFzaGVkIG1pc2VyYWJseSwgYW5kIHRoaXMKICB3YXMgZHVlIHRvIHNvbWUgc2VsZWN0KClpc21zIGxlZnQgaW4gdGhlIGNvZGUuIFRoaXMgd2FzIGR1ZSB0byBBUEkKICByZXN0cmljdGlvbnMgaW4gYy1hcmVzIDEuMy54LCBidXQgd2l0aCB0aGUgdXBjb21pbmcgYy1hcmVzIDEuNC4wIHRoaXMgaXMgbm8KICBsb25nZXIgdGhlIGNhc2Ugc28gbm93IGxpYmN1cmwgcnVucyBtdWNoIGJldHRlciB3aXRoIGMtYXJlcyBhbmQgdGhlIG11bHRpCiAgaW50ZXJmYWNlIHdpdGggPiAxMDI0IGZpbGUgZGVzY3JpcHRvcnMgaW4gdXNlLgoKICBFeHRyYSBub3RlOiBzdGFydGluZyBub3cgd2UgcmVxdWlyZSBjLWFyZXMgMS40LjAgZm9yIGFzeW5jaHJvbm91cyBuYW1lCiAgcmVzb2x2ZXMuCgotIEFkZGVkIENVUkxNT1BUX01BWENPTk5FQ1RTIHdoaWNoIGlzIGEgY3VybF9tdWx0aV9zZXRvcHQoKSBvcHRpb24gZm9yIHNldHRpbmcKICB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjb25uZWN0aW9uIGNhY2hlIG1heGltdW0gc2l6ZSBvZiB0aGUgbXVsdGkgaGFuZGxlLgoKRGFuaWVsIFMgKDI3IE1heSAyMDA3KQotIFdoZW4gd29ya2luZyB3aXRoIGEgcHJvYmxlbSBTdGVmYW4gQmVja2VyIGhhZCwgSSBmb3VuZCBhbiBvZmYtYnktb25lIGJ1ZmZlcgogIG92ZXJ3cml0ZSBpbiBDdXJsX3NlbGVjdCgpLiBXaGlsZSBmaXhpbmcgaXQsIEkgYWxzbyBpbXByb3ZlZCBpdHMgcGVyZm9ybWFuY2UKICBzb21ld2hhdCBieSBjaGFuZ2luZyBjYWxsb2MgdG8gbWFsbG9jIGFuZCBicmVha2luZyBvdXQgb2YgYSBsb29wIGVhcmxpZXIKICAod2hlbiBwb3NzaWJsZSkuCgpEYW5pZWwgUyAoMjUgTWF5IDIwMDcpCi0gUm9iIENyaXR0ZW5kZW4gZml4ZWQgYnVnICMxNzA1ODAyCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzA1ODAyKSwgd2hpY2ggd2FzIGZpbGVkIGJ5IERhbmllbAogIEJsYWNrIGlkZW50aWZ5aW5nIHNldmVyYWwgRlRQLVNTTCB0ZXN0IGNhc2VzIGZhaWwgd2hlbiB3ZSBidWlsZCBsaWJjdXJsIHdpdGgKICBOU1MgZm9yIFRMUy9TU0wuIExpc3RlZCBhcyAjNDIgaW4gS05PV05fQlVHUy4KCkRhbmllbCBTICgyNCBNYXkgMjAwNykKLSBTb25nIE1hIGZpbGVkIGJ1ZyByZXBvcnQgIzE3MjQwMTYKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MjQwMTYpIG5vdGljaW5nIHRoYXQgZG93bmxvYWRpbmcKICBnbG9iLXJhbmdlcyBmb3IgVEZUUCB3YXMgYnJva2VuIGluIENWUy4gRml4ZWQgbm93LgoKLSAnbXl0eCcgaW4gYnVnIHJlcG9ydCAjMTcyMzE5NCAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MjMxOTQpCiAgcG9pbnRlZCBvdXQgdGhhdCB0aGUgd2FybmYoKSBmdW5jdGlvbiBpbiB0aGUgY3VybCB0b29sIGRpZG4ndCBwcm9wZXJseSBkZWFsCiAgd2l0aCB0aGUgY2FzZXMgd2hlbiBleGNlc3NpdmVseSBsb25nIHdvcmRzIHdlcmUgdXNlZCBpbiB0aGUgc3RyaW5nIHRvIGNob3AKICB1cC4KCkRhbmllbCBTICgyMiBNYXkgMjAwNykKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGZ1bmN0aW9uIHRoYXQgdmVyaWZpZXMgdGhlCiAgcGVlcidzIG5hbWUgaW4gdGhlIFNTTCBjZXJ0aWZpY2F0ZSB3aGVuIGJ1aWx0IGZvciBPcGVuU1NMLiBUaGUgbGVhayBoYXBwZW5zCiAgZm9yIGxpYmN1cmxzIHdpdGggQ1VSTF9ET0VTX0NPTlZFUlNJT05TIGVuYWJsZWQgdGhhdCBmYWlsIHRvIGNvbnZlcnQgdGhlIENOCiAgbmFtZSBmcm9tIFVURjguIEhlIGFsc28gZml4ZWQgYSBsZWFrIHdoZW4gUEtDUyAjMTIgcGFyc2luZyBmYWlsZWQuCgpEYW5pZWwgUyAoMTggTWF5IDIwMDcpCi0gRmVuZyBUdSByZXBvcnRlZCB0aGF0IGN1cmwgLXcgZGlkIHdyb25nIG9uIFRGVFAgdHJhbnNmZXJzIGluIGJ1ZyByZXBvcnQKICAjMTcxNTM5NCAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MTUzOTQpLCBhbmQgdGhlCiAgdHJhbnNmZXItcmVsYXRlZCBpbmZvICJ2YXJpYWJsZXMiIHdlcmUgaW5kZWVkIG92ZXJ3cml0dGVuIHdpdGggemVyb2VzCiAgd3JvbmdseSBhbmQgaGF2ZSBub3cgYmVlbiBhZGp1c3RlZC4gVGhlIHVwbG9hZCBzaXplIHN0aWxsIGlzbid0IGFjY3VyYXRlLgoKRGFuaWVsIFMgKDE3IE1heSAyMDA3KQotIEZlbmcgVHUgcG9pbnRlZCBvdXQgYSBkaXZpc2lvbiBieSB6ZXJvIGVycm9yIGluIHRoZSBURlRQIGNvbm5lY3QgdGltZW91dAogIGNvZGUgZm9yIHRpbWVvdXRzIGxlc3MgdGhhbiBmaXZlIHNlY29uZHMsIGFuZCBhbHNvIHByb3ZpZGVkIGEgZml4IGZvciBpdC4KICBCdWcgcmVwb3J0ICMxNzE1MzkyIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcxNTM5MikKCkRhbiBGICgxNiBNYXkgMjAwNykKLSBBZGRlZCBzdXBwb3J0IGZvciBjb21waWxpbmcgdW5kZXIgTWluaXggMy4xLjMgdXNpbmcgQUNLLgoKRGFuIEYgKDE0IE1heSAyMDA3KQotIEFkZGVkIFNGVFAgZGlyZWN0b3J5IGxpc3RpbmcgdGVzdCBjYXNlIDYxMy4KCi0gQWRkZWQgc3VwcG9ydCBmb3IgcXVvdGUgY29tbWFuZHMgYmVmb3JlIGEgdHJhbnNmZXIgdXNpbmcgU0ZUUCBhbmQgdGVzdAogIGNhc2UgNjE0LgoKLSBDaGFuZ2VkIHRoZSBwb3N0LXF1b3RlIGNvbW1hbmRzIHRvIG9jY3VyIGFmdGVyIHRoZSB0cmFuc2ZlcnJlZCBmaWxlIGlzCiAgY2xvc2VkLgoKLSBBbGxvdyBTRlRQIHF1b3RlIGNvbW1hbmRzIGNobW9kLCBjaG93biwgY2hncnAgdG8gc2V0IGEgdmFsdWUgb2YgMC4KCkRhbiBGICg5IE1heSAyMDA3KQotIEtyaXN0aWFuIEd1bnN0b25lIGZpeGVkIGEgcHJvYmxlbSB3aGVyZSBvdmVyd3JpdGluZyBhbiB1cGxvYWRlZCBmaWxlIHdpdGgKICBzZnRwIGRpZG4ndCB0cnVuY2F0ZSBpdCBmaXJzdCwgd2hpY2ggd291bGQgY29ycnVwdCB0aGUgZmlsZSBpZiB0aGUgbmV3CiAgZmlsZSB3YXMgc2hvcnRlciB0aGFuIHRoZSBvbGQuCgpEYW4gRiAoOCBNYXkgMjAwNykKLSBBZGRlZCBGVFBTIHRlc3QgY2FzZXMgNDA2IGFuZCA0MDcKCkRhbmllbCBTICg4IE1heSAyMDA3KQotIENVUkxFX0ZUUF9DT1VMRE5UX1NUT1JfRklMRSBpcyBub3cga25vd24gYXMgQ1VSTEVfVVBMT0FEX0ZBSUxFRC4gVGhpcyBpcwogIGJlY2F1c2UgSSBqdXN0IG1hZGUgU0NQIHVwbG9hZHMgcmV0dXJuIHRoaXMgdmFsdWUgaWYgdGhlIGZpbGUgc2l6ZSBvZgogIHRoZSB1cGxvYWQgZmlsZSBpc24ndCBnaXZlbiB3aXRoIENVUkxPUFRfSU5GSUxFU0laRSouIERvY3MgdXBkYXRlZCB0bwogIHJlZmxlY3QgdGhpcyBuZXdzLCBhbmQgYSBkZWZpbmUgZm9yIHRoZSBvbGQgbmFtZSB3YXMgYWRkZWQgdG8gdGhlIHB1YmxpYwogIGhlYWRlciBmaWxlLgoKRGFuaWVsIFMgKDcgTWF5IDIwMDcpCi0gSmFtZXMgQnVyc2EgZml4ZWQgYSBidWcgaW4gdGhlIG11bHRpIGhhbmRsZSBjb2RlIHRoYXQgbWFkZSB0aGUgY29ubmVjdGlvbgogIGNhY2hlIGdyb3cgYSBiaXQgdG9vIG11Y2gsIGJleW9uZCB0aGUgbm9ybWFsIDQgKiBlYXN5X2hhbmRsZXMuCgpEYW5pZWwgUyAoMiBNYXkgMjAwNykKLSBBbmRlcnMgR3VzdGFmc3NvbiByZW1hcmtlZCB0aGF0IHJlcXVpcmluZyBDVVJMT1BUX0hUVFBfVkVSU0lPTiBzZXQgdG8gMS4wCiAgd2hlbiBDVVJMT1BUX0hUVFAyMDBBTElBU0VTIGlzIHVzZWQgdG8gYXZvaWQgdGhlIHByb2JsZW0gbWVudGlvbmVkIGJlbG93IGlzCiAgbm90IHZlcnkgbmljZSBpZiB0aGUgY2xpZW50IHdhbnRzIHRvIGJlIGFibGUgdG8gdXNlIF9laXRoZXJfIGEgSFRUUCAxLjEKICBzZXJ2ZXIgb3Igb25lIHdpdGhpbiB0aGUgYWxpYXNlcyBsaXN0Li4uIHNvIHN0YXJ0aW5nIG5vdywgbGliY3VybCB3aWxsCiAgc2ltcGx5IGNvbnNpZGVyIDIwMC1hbGlhcyBtYXRjaGVzIHRoZSB0byBiZSBIVFRQIDEuMCBjb21wbGlhbnQuCgotIFRvYmlhcyBSdW5kc3Ry9m0gcmVwb3J0ZWQgYSBwcm9ibGVtIHRoZXkgZXhwZXJpZW5jZWQgd2l0aCB4bW1zMiBhbmQgcmVjZW50CiAgbGliY3VybHMsIHdoaWNoIHR1cm5lZCBvdXQgdG8gYmUgdGhlIDI1LW5vdi0yMDA2IGNoYW5nZSB3aGljaCB0cmVhdHMgSFRUUAogIHJlc3BvbnNlcyB3aXRob3V0IENvbnRlbnQtTGVuZ3RoIG9yIGNodW5rZWQgZW5jb2RpbmcgYXMgd2l0aG91dCBib2RpZXMuIFdlCiAgbm93IGFkZGVkIHRoZSBjb25kaXRpb25hbCB0aGF0IHRoZSBhYm92ZSBtZW50aW9uZWQgcmVzcG9uc2UgaXMgb25seSB3aXRob3V0CiAgYm9keSBpZiB0aGUgcmVzcG9uc2UgaXMgSFRUUCAxLjEuCgotIEplZmYgUG9obG1leWVyIGltcHJvdmVkIHRoZSBoaXBlcmZpZm8uYyBleGFtcGxlIHRvIHVzZSB0aGUKICBDVVJMTU9QVF9USU1FUkZVTkNUSU9OIGNhbGxiYWNrIG9wdGlvbi4KCi0gU2V0IHRoZSB0aW1lb3V0IGZvciBlYXN5IGhhbmRsZXMgdG8gZXhwaXJlIHJlYWxseSBzb29uIGFmdGVyIGFkZGl0aW9uIG9yCiAgd2hlbiBDVVJMTV9DQUxMX01VTFRJX1BFUkZPUk0gaXMgcmV0dXJuZWQgZnJvbSBjdXJsX211bHRpX3NvY2tldCovcGVyZm9ybSwKICB0byBtYWtlIGFwcGxpY2F0aW9ucyB1c2luZyBvbmx5IGN1cmxfbXVsdGlfc29ja2V0KCkgdG8gcHJvcGVybHkgZnVuY3Rpb24KICB3aGVuIGFkZGluZyBlYXN5IGhhbmRsZXMgIm9uIHRoZSBmbHkiLiBCdWcgcmVwb3J0IGFuZCB0ZXN0IGFwcCBwcm92aWRlZCBieQogIE1pY2hhZWwgV2FsbG5lci4KCkRhbiBGICgzMCBBcHJpbCAyMDA3KQotIEltcHJvdmVkIHRoZSB0ZXN0IGhhcm5lc3MgdG8gYWxsb3cgcnVubmluZyB0ZXN0IHNlcnZlcnMgb24gb3RoZXIgdGhhbgogIHRoZSBkZWZhdWx0IHBvcnQgbnVtYmVycywgYWxsb3dpbmcgbW9yZSB0aGFuIG9uZSB0ZXN0IHN1aXRlIHRvIHJ1bgogIHNpbXVsdGFuZW91c2x5IG9uIHRoZSBzYW1lIGhvc3QuCgpEYW5pZWwgUyAoMjggQXByaWwgMjAwNykKLSBQZXRlciBPJ0dvcm1hbiBmaXhlZCBsaWJjdXJsIHRvIG5vdCBpbml0IEdudVRMUyBhcyBlYXJseSBhcyB3ZSBkaWQgYmVmb3JlLAogIHNpbmNlIGl0IHRoZW4gaW5pdHMgbGliZ2NyeXB0IGFuZCBsaWJnY3J5cHQgaXMgYmVpbmcgZXZpbCBhbmQgRVhJVFMgdGhlCiAgYXBwbGljYXRpb24gaWYgaXQgZmFpbHMgdG8gZ2V0IGEgZmluZSByYW5kb20gc2VlZC4gVGhhdCdzIHJlYWxseSBub3QgYSBuaWNlCiAgdGhpbmcgdG8gZG8gYnkgYSBsaWJyYXJ5LgoKLSBGcmFuayBIZW1wZWwgZml4ZWQgYSBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgY3Jhc2ggb24gYSBoYW5kbGUgdGhhdCBoYWQKICBiZWVuIHJlbW92ZWQgZnJvbSBhIG11bHRpIGhhbmRsZSwgYW5kIHRoZW4gZml4ZWQgYW5vdGhlciBmbGF3IHRoYXQgcHJldmVudGVkCiAgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHRvIHdvcmsgZXZlbiBhZnRlciB0aGUgZmlyc3QgZml4IC0gdGhlIGhhbmRsZSB3YXMKICBzdGlsbCBtYXJrZWQgYXMgdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZS4KCkRhbmllbCBTICgyNiBBcHJpbCAyMDA3KQotIFBldGVyIE8nR29ybWFuIGZvdW5kIGEgcHJvYmxlbSB3aXRoIFNDUCBkb3dubG9hZHMgd2hlbiB0aGUgZG93bmxvYWRlZCBmaWxlCiAgd2FzIDE2Mzg1IGJ5dGVzICgxNksrMSkgYW5kIGl0IHR1cm5lZCBvdXQgd2UgZGlkbid0IHByb3Blcmx5IGFsd2F5cyAic3VjawogIG91dCIgYWxsIGRhdGEgZnJvbSBsaWJzc2gyLiBUaGUgZWZmZWN0IGJlaW5nIHRoYXQgbGliY3VybCB3b3VsZCBoYW5nIG9uIHRoZQogIHNvY2tldCB3YWl0aW5nIGZvciBkYXRhIHdoZW4gbGlic3NoMiBoYWQgaW4gZmFjdCBhbHJlYWR5IHJlYWQgaXQgYWxsLi4uCgpEYW4gRiAoMjUgQXByaWwgMjAwNykKLSBBZGRlZCBzdXBwb3J0IGluIHJ1bnRlc3RzLnBsIGZvciAiIW4iIHRlc3QgbnVtYmVycyB0byBkaXNhYmxlIGluZGl2aWR1YWwKICB0ZXN0cy4gIENoYW5nZWQgLXQgdG8gb25seSBrZWVwIGxvZyBmaWxlcyBhcm91bmQgd2hlbiAtayBpcyBzcGVjaWZpZWQsCiAgdG8gaGF2ZSB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgd2l0aG91dCAtdC4KCkRhbmllbCBTICgyNSBBcHJpbCAyMDA3KQotIFNvbmlhIFN1YnJhbWFuaWFuIGJyb3VnaHQgb3VyIGF0dGVudGlvbiB0byBhIHByb2JsZW0gdGhhdCBoYXBwZW5zIGlmIHlvdSBzZXQKICB0aGUgQ1VSTE9QVF9SRVNVTUVfRlJPTSBvciBDVVJMT1BUX1JBTkdFIG9wdGlvbnMgYW5kIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24KICBpbiB0aGUgY29ubmVjdGlvbiBjYWNoZSBpcyBjbG9zZWQgdG8gbWFrZSByb29tIGZvciB0aGUgbmV3IG9uZSB3aGVuIHlvdSBjYWxsCiAgY3VybF9lYXN5X3BlcmZvcm0oKS4gSXQgd291bGQgdGhlbiB3cm9uZ2x5IGZyZWUgcmFuZ2UtcmVsYXRlZCBkYXRhIGluIHRoZQogIGNvbm5lY3Rpb24gY2xvc2UgZnVudGlvbi4KCllhbmcgVHNlICgyNSBBcHJpbCAyMDA3KQotIFN0ZXZlIExpdHRsZSBmaXhlZCBjb21waWxhdGlvbiBvbiBWTVMgNjQtYml0IG1vZGUKCkRhbmllbCBTICgyNCBBcHJpbCAyMDA3KQotIFJvYmVydCBJYWtvYmFzaHZpbGkgbWFkZSB0aGUgJ21hc3Rlcl9idWZmZXInIGdldCBhbGxvY2F0ZWQgZmlyc3Qgb25jZSBpdCBpcwogIGNhbi93aWxsIGJlIHVzZWQgYXMgaXQgdGhlbiBtYWtlcyB0aGUgY29tbW9uIGNhc2VzIHNhdmUgMTZLQiBvZiBkYXRhIGZvciBlYWNoCiAgZWFzeSBoYW5kbGUgdGhhdCBpc24ndCB1c2VkIGZvciBwaXBlbGluaW5nLgoKRGFuIEYgKDIzIEFwcmlsIDIwMDcpCi0gQWRkZWQgPHBvc3RjaGVjaz4gc3VwcG9ydCB0byB0aGUgdGVzdCBoYXJuZXNzLgoKLSBBZGRlZCB0ZXN0cyA2MTAtNjEyIHRvIHRlc3QgbW9yZSBTRlRQIHBvc3QtcXVvdGUgY29tbWFuZHMuCgpEYW5pZWwgUyAoMjIgQXByaWwgMjAwNykKLSBTb25nIE1hJ3Mgd2FybmluZyBpZiAtci8tLXJhbmdlIGlzIGdpdmVuIHdpdGggYSAiYmFkIiByYW5nZSwgYWxzbyBub3RlZCBpbgogIHRoZSBtYW4gcGFnZSBub3cuCgotIERhbmllbCBCbGFjayBmaWxlZCBidWcgIzE3MDUxNzcKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MDUxNzcpIHdoZXJlIC0td2l0aG91dC1zc2wKICAtLXdpdGgtZ251dGwgb3V0cHV0cyBhIHdhcm5pbmcgYWJvdXQgU1NMIG5vdCBiZWluZyBlbmFibGVkIGV2ZW4gdGhvdWdoIEdudVRMUwogIHdhcyBmb3VuZCBhbmQgdXNlZC4KCkRhbmllbCBTICgyMSBBcHJpbCAyMDA3KQotIERhbmllbCBCbGFjayBmaWxlZCBidWcgIzE3MDQ2NzUKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MDQ2NzUpIGlkZW50aWZ5aW5nIGEgZG91YmxlLWZyZWUKICBwcm9ibGVtIGluIHRoZSBTU0wtZGVhbGluZyBsYXllciwgdGVsbGluZyBHbnVUTFMgdG8gZnJlZSBOVUxMIGNyZWRlbnRpYWxzIG9uCiAgY2xvc2Vkb3duIGFmdGVyIGEgZmFpbHVyZSBhbmQgYSBiYWQgI2lmZGVmIGZvciBOU1Mgd2hlbiBjbG9zaW5nIGRvd24gU1NMLgoKWWFuZyBUc2UgKDIwIEFwcmlsIDIwMDcpCi0gU2F2ZSBvbmUgY2FsbCB0byBjdXJseF90dm5vdygpLCB3aGljaCBjYWxscyBnZXR0aW1lb2ZkYXkoKSwgaW4gZWFjaCBvZgogIEN1cmxfc29ja2V0X3JlYWR5KCksIEN1cmxfcG9sbCgpIGFuZCBDdXJsX3NlbGVjdCgpIHdoZW4gdGhlc2UgYXJlIGNhbGxlZAogIHdpdGggYSB6ZXJvIHRpbWVvdXQgb3IgYSB0aW1lb3V0IHZhbHVlIGluZGljYXRpbmcgYSBibG9ja2luZyBjYWxsIHNob3VsZAogIGJlIHBlcmZvcm1lZC4KCkRhbmllbCBTICgxOCBBcHJpbCAyMDA3KQotIEphbWVzIEhvdXNsZXkgbWFkZSBTRlRQIHVwbG9hZHMgdXNlIGxpYnNzaDIncyBub24tYmxvY2tpbmcgQVBJCgotIFByZXZlbnQgdGhlIGludGVybmFsIHByb2dyZXNzIG1ldGVyIGZyb20gdXBkYXRpbmcgbW9yZSBmcmVxdWVudGx5IHRoYW4gb25jZQogIHBlciBzZWNvbmQuCgpEYW4gRiAoMTcgQXByaWwgMjAwNykKLSBBZGRlZCB0ZXN0IGNhc2VzIDI5NiwgMjk3IGFuZCAyOTggdG8gdGVzdCAtLWZ0cC1tZXRob2QgaGFuZGxpbmcKCkRhbmllbCBTICgxNiBBcHJpbCAyMDA3KQotIFJvYmVydCBJYWtvYmFzaHZpbCBhZGRlZCBjdXJsX211bHRpX3NvY2tldF9hY3Rpb24oKSB0byBsaWJjdXJsLCB3aGljaCBpcyBhCiAgZnVuY3Rpb24gdGhhdCBkZXByZWNhdGVzIHRoZSBjdXJsX211bHRpX3NvY2tldCgpIGZ1bmN0aW9uLiBVc2luZyB0aGUgbmV3CiAgZnVuY3Rpb24gdGhlIGFwcGxpY2F0aW9uIHRlbGwgbGliY3VybCB3aGF0IGFjdGlvbiB0aGF0IHdhcyBmb3VuZCBpbiB0aGUKICBzb2NrZXQgdGhhdCBpdCBwYXNzZXMgaW4uIFRoaXMgZ2l2ZXMgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBib29zdCBhcyBpdAogIGFsbG93cyBsaWJjdXJsIHRvIGF2b2lkIGEgY2FsbCB0byBwb2xsKCkvc2VsZWN0KCkgZm9yIGV2ZXJ5IGNhbGwgdG8KICBjdXJsX211bHRpX3NvY2tldCooKS4KCiAgSSBhZGRlZCBhIGRlZmluZSBpbiB0aGUgcHVibGljIGN1cmwvbXVsdGkuaCBoZWFkZXIgZmlsZSB0aGF0IHdpbGwgbWFrZSB5b3VyCiAgZXhpc3RpbmcgYXBwbGljYXRpb24gYXV0b21hdGljYWxseSB1c2UgY3VybF9tdWx0aV9zb2NrZXRfYWN0aW9uKCkgaW5zdGVhZCBvZgogIGN1cmxfbXVsdGlfc29ja2V0KCkgd2hlbiB5b3UgcmVjb21waWxlLiBCdXQgb2YgY291cnNlIHlvdSdsbCBnZXQgYmV0dGVyCiAgcGVyZm9ybWFuY2UgaWYgeW91IGFkanVzdCB5b3VyIGNvZGUgbWFudWFsbHkgYW5kIGFjdHVhbGx5IHBhc3MgaW4gdGhlCiAgY29ycmVjdCBhY3Rpb24gYml0bWFzayB0byB0aGlzIGZ1bmN0aW9uLgoKRGFuaWVsIFMgKDE0IEFwcmlsIDIwMDcpCi0gSmF5IEF1c3RpbiBhZGRlZCAiREggUEFSQU1FVEVSUyIgdG8gdGhlIHN0dW5uZWwucGVtIGNlcnRpZmljYXRlIGZvciB0aGUgdGVzdAogIHN1aXRlIHRvIG1ha2Ugc3R1bm5lbCBydW4gYmV0dGVyIGluIHNvbWUgKG1vc3Q/KSBlbnZpcm9ubWVudHMuCgpEYW4gRiAoMTMgQXByaWwgMjAwNykKLSBBZGRlZCB0ZXN0IGNhc2VzIDI5NCBhbmQgMjk1IHRvIHRlc3QgLS1mdHAtYWNjb3VudCBoYW5kbGluZwoKLSBJbXByb3ZlZCBoYW5kbGluZyBvZiBvdXQgb2YgbWVtb3J5IGluIGZ0cC4KCllhbmcgVHNlICgxMyBBcHJpbCAyMDA3KQotIEZpeCB0ZXN0IGNhc2UgNTM0IHdoaWNoIHN0YXJ0ZWQgdG8gZmFpbCAyMDA3LTA0LTEzIGR1ZSB0byB0aGUgZXhpc3RhbmNlCiAgb2YgYSBuZXcgaG9zdCBvbiB0aGUgbmV0IHdpdGggdGhlIHNhbWUgc2lsbHkgZG9tYWluIHRoZSB0ZXN0IHdhcyB1c2luZwogIGZvciBhIGhvc3Qgd2hpY2ggd2FzIHN1cHBvc2VkIG5vdCB0byBleGlzdC4KCkRhbmllbCBTICgxMiBBcHJpbCAyMDA3KQotIFNvbmcgTWEgZm91bmQgYSBtZW1vcnkgbGVhayBpbiB0aGUgaWYyaXAgY29kZSBpZiB5b3UgcGFzcyBpbiBhbiBpbnRlcmZhY2UKICBuYW1lIGxvbmdlciB0aGFuIHRoZSBuYW1lIGZpZWxkIG9mIHRoZSBpZnJlcSBzdHJ1Y3QgKHR5cGljYWxseSA2IGJ5dGVzKSwgYXMKICB0aGVuIGl0IHdvdWxkbid0IGNsb3NlIHRoZSB1c2VkIGR1bW15IHNvY2tldC4gQnVnICMxNjk4OTc0CiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNjk4OTc0KQoKVmVyc2lvbiA3LjE2LjIgKDExIEFwcmlsIDIwMDcpCgpZYW5nIFRzZSAoMTAgQXByaWwgMjAwNykKLSBSYXZpIFByYXRhcCBwcm92aWRlZCBzb21lIGZpeGVzIGZvciBIVFRQIHBpcGVsaW5pbmcKCi0gY29uZmlndXJlIHNjcmlwdCB3aWxsIGlnbm9yZSAtLWVuYWJsZS1zc3BpIG9wdGlvbiBmb3Igbm9uLW5hdGl2ZSBXaW5kb3dzLgoKRGFuaWVsIFMgKDkgQXByaWwgMjAwNykKLSBOaWNrIFppdHptYW5uIGRpZCBzc2guYyBjbGVhbnVwcwoKRGFuaWVsIFMgKDMgQXByaWwgMjAwNykKLSBSb2IgSm9uZXMgZml4ZWQgYmV0dGVyICNpZmRlZidpbmcgZm9yIGEgYnVuY2ggb2YgI2luY2x1ZGUgbGluZXMuCgpEYW5pZWwgUyAoMiBBcHJpbCAyMDA3KQotIE5pY2sgWml0em1hbm4gbWFkZSB0aGUgQ1VSTE9QVF9QT1NUUVVPVEUgb3B0aW9uIHdvcmsgZm9yIFNGVFAgYXMgd2VsbC4gVGhlCiAgYWNjZXB0ZWQgY29tbWFuZHMgYXJlIGFzIGZvbGxvd3M6CgogIGNoZ3JwIChnaWQpIChwYXRoKQogICAgQ2hhbmdlcyB0aGUgZ3JvdXAgSUQgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGF0IChwYXRoKSB0byAoZ2lkKS4gKGdpZCkKICAgIG11c3QgYmUgYSBudW1iZXIuCgogIGNobW9kIChwZXJtcykgKHBhdGgpCiAgICBDaGFuZ2VzIHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgYXQgKHBhdGgpIHRvCiAgICAocGVybXMpLiAocGVybXMpIG11c3QgYmUgYSBudW1iZXIgaW4gdGhlIGZvcm1hdCB1c2VkIGJ5IHRoZSBjaG1vZCBVbml4CiAgICBjb21tYW5kLgoKICBjaG93biAodWlkKSAocGF0aCkKICAgIENoYW5nZXMgdGhlIHVzZXIgSUQgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGF0IChwYXRoKSB0byAodWlkKS4gKHVpZCkKICAgIG11c3QgYmUgYSBudW1iZXIuCgogIGxuIChzb3VyY2UpIChkZXN0KQogICAgQ3JlYXRlcyBhIHN5bWJvbGljIGxpbmsgYXQgKGRlc3QpIHRoYXQgcG9pbnRzIHRvIHRoZSBmaWxlIGxvY2F0ZWQgYXQKICAgIChzb3VyY2UpLgoKICBta2RpciAocGF0aCkKICAgIENyZWF0ZXMgYSBuZXcgZGlyZWN0b3J5IGF0IChwYXRoKS4KCiAgcmVuYW1lIChzb3VyY2UpIChkZXN0KQogICAgTW92ZXMgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGF0IChzb3VyY2UpIHRvIChkZXN0KS4KCiAgcm0gKHBhdGgpCiAgICBEZWxldGVzIHRoZSBmaWxlIGxvY2F0ZWQgYXQgKHBhdGgpLgoKICBybWRpciAocGF0aCkKICAgIERlbGV0ZXMgdGhlIGRpcmVjdG9yeSBsb2NhdGVkIGF0IChwYXRoKS4gVGhpcyBjb21tYW5kIHdpbGwgcmFpc2UgYW4gZXJyb3IKICAgIGlmIHRoZSBkaXJlY3RvcnkgaXMgbm90IGVtcHR5LgoKICBzeW1saW5rIChzb3VyY2UpIChkZXN0KQogICAgU2FtZSBhcyBsbi4KCkRhbmllbCBTICgxIEFwcmlsIDIwMDcpCi0gUm9iZXJ0IElha29iYXNodmlsaSBtYWRlIGN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgpIGEgbG90IGZhc3RlciB3aGVuIG1hbnkKICBlYXN5IGhhbmRsZXMgYXJlIGFkZGVkIHRvIGEgbXVsdGkgaGFuZGxlLCBieSBhdm9pZGluZyB0aGUgbG9vcGluZyBvdmVyIGFsbAogIHRoZSBoYW5kbGVzIHRvIGZpbmQgd2hpY2ggb25lIHRvIHJlbW92ZS4KCi0gTWF0dCBLcmFhaSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgY3VybCBidWlsZCBvbiBRTlggNiBmaW5lIGFnYWluLgoKRGFuaWVsIFMgKDMxIE1hcmNoIDIwMDcpCi0gRml4ZWQgc2V2ZXJhbCBtaW5vciBpc3N1ZXMgZGV0ZWN0ZWQgYnkgdGhlIGNvdmVyaXR5LmNvbSBzY2FubmVyLgoKLSAiUGl4ZWwiIGZpeGVkIGEgcHJvYmxlbSB0aGF0IGFwcGVhcmVkIHdoZW4geW91IHVzZWQgLWYgd2l0aCB1c2VyK3Bhc3N3b3JkCiAgZW1iZWRkZWQgaW4gdGhlIFVSTC4KCkRhbiBGICgyOSBNYXJjaCAyMDA3KQotIERvbid0IHRlYXIgZG93biB0aGUgZnRwIGNvbm5lY3Rpb24gaWYgdGhlIG1heGltdW0gZmlsZXNpemUgd2FzIGV4Y2VlZGVkCiAgYW5kIGFkZGVkIHRlc3RzIDI5MCBhbmQgMjkxIHRvIGNoZWNrLgoKLSBBZGRlZCBmdHBzIHVwbG9hZCBhbmQgU1NMIHJlcXVpcmVkIHRlc3RzIDQwMSBhbmQgNDAyLgoKLSBTZW5kIGFuIEVPRiBtZXNzYWdlIGJlZm9yZSBjbG9zaW5nIGFuIFNDUCBjaGFubmVsLCBhcyByZWNvbW1lbmRlZCBieQogIFJGQzQyNTQuIEVuYWJsZSBsaWJzc2gyIHRyYWNpbmcgd2hlbiBzc2ggZGVidWdnaW5nIGlzIHR1cm5lZCBvbi4KCllhbmcgVHNlICgyNyBNYXJjaCAyMDA3KQotIEludGVybmFsIGZ1bmN0aW9uIEN1cmxfc2VsZWN0KCkgcmVuYW1lZCB0byBDdXJsX3NvY2tldF9yZWFkeSgpCgogIE5ldyBJbnRlcm5hbCB3cmFwcGVyIGZ1bmN0aW9uIEN1cmxfc2VsZWN0KCkgYXJvdW5kIHNlbGVjdCAoMiksIGl0CiAgdXNlcyBwb2xsKCkgd2hlbiBhIGZpbmUgcG9sbCgpIGlzIGF2YWlsYWJsZSwgc28gbm93IGxpYmN1cmwgY2FuIGJlCiAgYnVpbHQgd2l0aG91dCBzZWxlY3QoKSBzdXBwb3J0IGF0IGFsbCBpZiBhIGZpbmUgcG9sbCgpIGlzIGF2YWlsYWJsZS4KCkRhbmllbCBTICgyNSBNYXJjaCAyMDA3KQotIERhbmllbCBKb2huc29uIGZpeGVkIG11bHRpIGNvZGUgdG8gdHJhdmVyc2UgdGhlIGVhc3kgaGFuZGxlIGxpc3QgcHJvcGVybHkuCiAgQSBsZWZ0LW92ZXIgYnVnIGZyb20gdGhlIEZlYnJ1YXJ5IDIxIGZpeC4KCkRhbiBGICgyMyBNYXJjaCAyMDA3KQotIEFkZGVkIC0tcHVia2V5IG9wdGlvbiB0byBjdXJsIGFuZCBtYWRlIC0ta2V5IGFsc28gd29yayBmb3IgU0NQL1NGVFAsCiAgcGx1cyBtYWRlIC0tcGFzcyB3b3JrIG9uIGFuIFNTSCBwcml2YXRlIGtleSBhcyB3ZWxsLgoKLSBDaGFuZ2VkIHRoZSB0ZXN0IGhhcm5lc3MgdG8gYXR0ZW1wdCB0byBncmFjZWZ1bGx5IHNodXQgZG93biBzZXJ2ZXJzCiAgYmVmb3JlIHJlc29ydGluZyB0byB0aGUga2lsbCAtOSBoYW1tZXIuCgotIEFkZGVkIHRlc3QgaGFybmVzcyBpbmZyYXN0cnVjdHVyZSB0byBzdXBwb3J0IHNjcC9zZnRwIHRlc3RzLCB1c2luZwogIE9wZW5TU0ggYXMgdGhlIHNlcnZlci4KCi0gRml4ZWQgYSBtZW1vcnkgbGVhayB3aGVuIHNwZWNpZnlpbmcgYSBwcm94eSB3aXRoIGEgZmlsZTogVVJMLgoKWWFuZyBUc2UgKDIwIE1hcmNoIDIwMDcpCi0gRml4ZWQ6IFdoZW4gYSBzaWduYWwgd2FzIGNhdWdodCBhd2FpdGluZyBmb3IgYW4gZXZlbnQgdXNpbmcgQ3VybF9zZWxlY3QoKQogIG9yIEN1cmxfcG9sbCgpIHdpdGggYSBub24temVybyB0aW1lb3V0IGJvdGggZnVuY3Rpb25zIHdvdWxkIHJlc3RhcnQgdGhlCiAgc3BlY2lmaWVkIHRpbWVvdXQuIFRoaXMgY291bGQgZXZlbiBsZWFkIHRvIHRoZSBleHRyZW1lIGNhc2UgdGhhdCBpZiBhCiAgc2lnbmFsIGFycml2ZWQgd2l0aCBhIGZyZWN1ZW5jeSBsb3dlciB0byB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgbmVpdGhlcgogIGZ1bmN0aW9uIHdvdWxkIGV2ZXIgZXhpdC4KCiAgQWRkZWQgZXhwZXJpbWVudGFsIHN5bWJvbCBkZWZpbml0aW9uIGNoZWNrIENVUkxfQUNLTk9XTEVER0VfRUlOVFIgaW4KICBDdXJsX3NlbGVjdCgpIGFuZCBDdXJsX3BvbGwoKS4gV2hlbiBjb21waWxlZCB3aXRoIENVUkxfQUNLTk9XTEVER0VfRUlOVFIKICBkZWZpbmVkIGJvdGggZnVuY3Rpb25zIHdpbGwgcmV0dXJuIGFzIHNvb24gYXMgYSBzaWduYWwgaXMgY2F1Z2h0LiBVc2UgaXQKICBhdCB5b3VyIG93biByaXNrLCBhbGwgY2FsbHMgdG8gdGhlc2UgZnVuY3Rpb25zIGluIHRoZSBsaWJyYXJ5IHNob3VsZCBiZQogIHJldmlzaXRlZCBhbmQgY2hlY2tlZCBiZWZvcmUgZnVsbHkgc3VwcG9ydGluZyB0aGlzIGZlYXR1cmUuCgpZYW5nIFRzZSAoMTkgTWFyY2ggMjAwNykKLSBCcnlhbiBIZW5kZXJzb24gZml4ZWQgdGhlIHByb2dyZXNzIGZ1bmN0aW9uIHNvIHRoYXQgaXQgY2FuIGdldCBjYWxsZWQgbW9yZQogIGZyZXF1ZW50bHkgYWxsb3dpbmcgc2FtZSBjYWxsaW5nIGZyZWN1ZW5jeSBmb3IgdGhlIGNsaWVudCBwcm9ncmVzcyBjYWxsYmFjay4KCkRhbiBGICgxNSBNYXJjaCAyMDA3KQotIFZhcmlvdXMgbWVtb3J5IGxlYWtzIHBsdWdnZWQgYW5kIE5VTEwgcG9pbnRlciBmaXhlcyBtYWRlIGluIHRoZSBzc2ggY29kZS4KCkRhbmllbCAoMTUgTWFyY2ggMjAwNykKLSBOaWNrIG1hZGUgdGhlIGN1cmwgdG9vbCBhY2NlcHQgZ2xvYmJpbmcgcmFuZ2VzIHRoYXQgb25seSBpcyBvbmUgbnVtYmVyLCBpLmUKICB5b3UgY2FuIG5vdyB1c2UgWzEtMV0gd2l0aG91dCBjdXJsIGNvbXBsYWluaW5nLgoKRGFuaWVsICgxMCBNYXJjaCAyMDA3KQotIEV5Z2VuZSBSeWFiaW5raW46CgogIFRoZSBwcm9ibGVtIGlzIHRoZSBmb2xsb3dpbmc6IHdoZW4gd2UncmUgY2FsbGluZyBDdXJsX2RvbmUgYW5kIGl0IGRlY2lkZXMgdG8KICBrZWVwIHRoZSBjb25uZWN0aW9uIG9wZW5lZCAoJ2xlZnQgaW50YWN0JyksIHRoZW4gdGhlIGNhbGxlciBpcyBub3Qgbm90aWZpZWQKICB0aGF0IHRoZSBjb25uZWN0aW9uIHdhcyBkb25lIHZpYSB0aGUgTlVMTGlmeWluZyBvZiB0aGUgcG9pbnRlciwgc28gc29tZSBlYXN5CiAgaGFuZGxlIGlzIGtlZXBpbmcgdGhlIHBvaW50ZXIgdG8gdGhpcyBjb25uZWN0aW9uLgoKICBMYXRlciBDb25uZWN0aW9uRXhpc3RzIGNhbiBzZWxlY3Qgc3VjaCBjb25uZWN0aW9uIGZvciByZXVzZSBldmVuIGlmIHdlJ3JlCiAgbm90IHBpcGVsaW5pbmc6IHBpcGVMZW4gaXMgemVybywgc28gdGhlIChwaXBlTGVuID4gMCAmJiAhY2FuUGlwZWxpbmUpIGlzCiAgZmFsc2UgYW5kIHdlIGNhbiByZXVzZSB0aGlzIGNvbm5lY3Rpb24gZm9yIGFub3RoZXIgZWFzeSBoYW5kbGUuIEJ1dCB0aHVzIHRoZQogIGNvbm5lY3Rpb24gd2lsbCBiZSBzaGFyZWQgYmV0d2VlbiB0d28gZWFzeSBoYW5kbGVzIGlmIHRoZSBoYW5kbGUgdGhhdCB3YW50cwogIHRvIHRha2UgdGhlIG93bmVyc2hpcCBpcyBub3QgdGhlIHNhbWUgYXMgd2FzIG5vdCBub3RpZmllZCBvZiB0aGUgY29ubmVjdGlvbgogIHdhcyBkb25lIGluIEN1cmxfZG9uZS4gQW5kIHdoZW4gc29tZSBvZiB0aGVzZSBlYXN5IGhhbmRsZXMgd2lsbCBnZXQgdGhlaXIKICBjb25uZWN0aW9uIHJlYWxseSBmcmVlZCB0aGUgYW5vdGhlciBvbmUgd2lsbCBzdGlsbCBrZWVwIHRoZSBwb2ludGVyLgoKICBNeSBmaXggd2FzIHJhdGhlciB0cml2aWFsOiBJIGp1c3QgYWRkZWQgdGhlIE5VTExpZmljYXRpb24gdG8gdGhlICdlbHNlJwogIGJyYW5jaCBpbiB0aGUgQ3VybF9kb25lLiBNeSB0ZXN0cyB3aXRoIEdpdCBhbmQgRWxlY3RyaWNGZW5jZSBzaG93ZWQgbm8KICBwcm9ibGVtcyBib3RoIGZvciBIVFRQIHB1bGxpbmcgYW5kIGNsb25pbmcuIFJlcG9zaXRvcnkgc2l6ZSBpcyBhYm91dCAyNTAgTWIsCiAgc28gaXQgd2FzIGEgY29uc2lkZXJhYmxlIGFtb3VudCBvZiBDdXJsJ3Mgd29yay4KCkRhbiBGICg5IE1hcmNoIDIwMDcpCi0gVXBkYXRlZCB0aGUgdGVzdCBoYXJuZXNzIHRvIGFkZCBhIG5ldyAiY3J5cHRvIiBmZWF0dXJlIGNoZWNrIGFuZCB1cGRhdGVkIHRoZQogIGFwcHJvcHJpYXRlIHRlc3QgY2FzZSB0byB1c2UgaXQuICBGb3Igbm93LCB0aGlzIGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgdGhlCiAgIlNTTCIgZmVhdHVyZSBiZWNhdXNlIGN1cmwgZG9lc24ndCBsaXN0IGl0IHNlcGFyYXRlbHkuCgpEYW5pZWwgKDkgTWFyY2ggMjAwNykKLSBSb2JlcnQgSWFrb2Jhc2h2aWxpIGZpeGVkIENVUkxPUFRfSU5URVJGQUNFIGZvciBJUHY2LgoKLSBSb2JlcnQgQS4gTW9uYXQgaW1wcm92ZWQgdGhlIG1ha2V0Z3ogYW5kIFZDNi84IGdlbmVyYXRpbmcgdG8gc2V0IHRoZSBjb3JyZWN0CiAgbWFjaGluZSB0eXBlIHRvby4KCi0gSnVzdGluIEZsZXRjaGVyIGZpeGVkIGEgZmlsZSBkZXNjcmlwdG9yIGxlYWsgaW4gdGhlIGN1cmwgdG9vbCB3aGVuIHRyeWluZyB0bwogIHVwbG9hZCBhIGZpbGUgaXQgY291bGRuJ3Qgb3Blbi4gQnVnICMxNjc2NTgxCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNjc2NTgxKQoKRGFuIEYgKDkgTWFyY2ggMjAwNykKLSBVcGRhdGVkIHRoZSB0ZXN0IGhhcm5lc3MgdG8gY2hlY2sgZm9yIHByb3RvY29sIHN1cHBvcnQgYmVmb3JlIHJ1bm5pbmcgZWFjaAogIHRlc3QsIGZpeGluZyBLTk9XTl9CVUdTICMxMS4KCkRhbiBGICg3IE1hcmNoIDIwMDcpCi0gUmVpbnRyb2R1Y2VkIChhZnRlciBhIDMgeWVhciBoaWF0dXMpIGFuIEZUUFMgdGVzdCBjYXNlICg0MDApIGludG8gdGhlIHRlc3QKICBoYXJuZXNzLiAgSXQgaXMgdmVyeSBsaW1pdGVkIGFzIGl0IHN1cHBvcnRzIG9ubHkgZnRwczovLyBVUkxzIHdpdGgKICAtLWZ0cC1zc2wtY29udHJvbCBzcGVjaWZpZWQsIHdoaWNoIGltcGxpY2l0bHkgZW5jcnlwdHMgdGhlIGNvbnRyb2wKICBjaGFubmVsIGJ1dCBub3QgdGhlIGRhdGEgY2hhbm5lbHMuICBUaGF0IGFsbG93cyBzdHVubmVsIHRvIGJlIHVzZWQgd2l0aAogIGFuIHVubW9kaWZpZWQgZnRwIHNlcnZlciBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSB0aGF0IHRoZSB0ZXN0IGh0dHBzCiAgc2VydmVyIGlzIHNldCB1cC4KCkRhbiBGICg3IE1hcmNoIDIwMDcpCi0gSG9ub3VyIC0tZnRwLXNzbC1jb250cm9sIG9uIGZ0cHM6Ly8gVVJMcyB0byBhbGxvdyBlbmNyeXB0ZWQgY29udHJvbCBhbmQKICB1bmVuY3J5cHRlZCBkYXRhIGNvbm5lY3Rpb25zLgoKRGFuIEYgKDYgTWFyY2ggMjAwNykKLSBGaXhlZCBhIGNvdXBsZSBvZiBpbXByb3BlciBwb2ludGVyIHVzZXMgZGV0ZWN0ZWQgYnkgdmFsZ3JpbmQgaW4gdGVzdAogIGNhc2VzIDE4MSAmIDIxNi4KCkRhbmllbCAoMiBNYXJjaCAyMDA3KQotIFJvYmVydCBBLiBNb25hdCBhbmQgU2htdWxpayBSZWdldiBoZWxwZWQgb3V0IHRvIGZpeCB0aGUgbmV3ICovTWFrZWZpbGUudmM4CiAgbWFrZWZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBzb3VyY2UgcmVsZWFzZSBhcmNoaXZlcywgZ2VuZXJhdGVkIGZyb20KICB0aGUgTWFrZWZpbGUudmM2IGZpbGVzIGJ5IHRoZSBtYWtldGd6IHNjcmlwdC4gSSBhbHNvIG1vZGlmaWVkIHRoZSByb290CiAgTWFrZWZpbGUgdG8gaGF2ZSBhIFZDIHZhcmlhYmxlIHRoYXQgZGVmYXVsdHMgdG8gdmM2IGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiB0bwogIGFsbG93IGl0IHRvIGJlIHVzZWQgZm9yIHZjOCBhcyB3ZWxsLiBMaWtlIHRoaXM6CgogICAgbm1ha2UgVkM9dmM4IHZjCgpEYW5pZWwgKDI3IEZlYnJ1YXJ5IDIwMDcpCi0gSGFuZyBLaW4gTGF1IGZvdW5kIGFuZCBmaXhlZDogV2hlbiBJIHVzZSBsaWJjdXJsIHRvIGNvbm5lY3QgdG8gYW4gaHR0cHMKICBzZXJ2ZXIgdGhyb3VnaCBhIHByb3h5IGFuZCBoYXZlIHRoZSByZW1vdGUgaHR0cHMgc2VydmVyIHBvcnQgc2V0IHVzaW5nIHRoZQogIENVUkxPUFRfUE9SVCBvcHRpb24sIHByb3RvY29sIGdldHMgcmVzZXQgdG8gaHR0cCBmcm9tIGh0dHBzIGFmdGVyIHRoZSBmaXJzdAogIHJlcXVlc3QuCgogIFVzZXIgZGVmaW5lZCBVUkwgd2FzIG1vZGlmaWVkIGludGVybmFsbHkgYnkgbGliY3VybCBhbmQgc3Vic2VxdWVudCByZXVzZSBvZgogIHRoZSBlYXN5IGhhbmRsZSBtYXkgbGVhZCB0byBjb25uZWN0aW9uIHVzaW5nIGEgZGlmZmVyZW50IHByb3RvY29sIChpZiBub3QKICBvcmlnaW5hbGx5IGh0dHApLgoKICBJIGZvdW5kIHRoYXQgbGliY3VybCBoYXJkY29kZWQgdGhlIHByb3RvY29sIHRvICJodHRwIiB3aGVuIGl0IHRyaWVzIHRvCiAgcmVnZW5lcmF0ZSB0aGUgVVJMIGlmIENVUkxPUFRfUE9SVCBpcyBzZXQuIEkgdHJpZWQgdG8gZml4IHRoZSBwcm9ibGVtIGFzCiAgZm9sbG93cyBhbmQgaXQncyB3b3JraW5nIGZpbmUgc28gZmFyCgpEYW5pZWwgKDI1IEZlYnJ1YXJ5IDIwMDcpCi0gQWRhbSBELiBNb3NzIG1hZGUgdGhlIEhUVFAgQ09OTkVDVCBwcm9jZWR1cmUgbGVzcyBibG9ja2luZyB3aGVuIHVzZWQgZnJvbQogIHRoZSBtdWx0aSBpbnRlcmZhY2UuIE5vdGUgdGhhdCBpdCBzdGlsbCBkb2VzIGEgcGFydCBvZiB0aGUgY29ubmVjdGlvbiBpbiBhCiAgYmxvY2tpbmcgbWFubmVyLgoKRGFuaWVsICgyMyBGZWJydWFyeSAyMDA3KQotIEFkZGVkIHdhcm5pbmcgb3V0cHV0cyBpZiB0aGUgY29tbWFuZCBsaW5lIHVzZXMgbW9yZSB0aGFuIG9uZSBvZiB0aGUgb3B0aW9ucwogIC12LCAtLXRyYWNlIGFuZCAtLXRyYWNlLWFzY2lpLCBzaW5jZSBpdCBjb3VsZCByZWFsbHkgY29uZnVzZSB0aGUgdXNlci4KICBDbGFyaWZpZWQgdGhpcyBmYWN0IGluIHRoZSBtYW4gcGFnZS4KCkRhbmllbCAoMjEgRmVicnVhcnkgMjAwNykKLSBSYXZpIFByYXRhcCBwcm92aWRlZCB3b3JrIG9uIGxpYmN1cmwgbWFraW5nIHBpcGVsaW5pbmcgbW9yZSByb2J1c3QgYW5kCiAgZml4aW5nIHNvbWUgYnVnczoKICBvIERvbid0IG1peCBHRVQgYW5kIFBPU1QgcmVxdWVzdHMgaW4gYSBwaXBlbGluZQogIG8gRml4IHRoZSBvcmRlciBpbiB3aGljaCByZXF1ZXN0cyBhcmUgZGlzcGF0Y2hlZCBmcm9tIHRoZSBwaXBlbGluZQogIG8gRml4ZWQgc2V2ZXJhbCBjdXJsIGJ1Z3Mgd2l0aCBwaXBlbGluaW5nIHdoZW4gdGhlIHNlcnZlciBpcyByZXR1cm5pbmcKICAgIGNodW5rZWQgZW5jb2Rpbmc6CiAgICAqIEFkZGVkIHN0YXRlcyB0byBjaHVua2VkIHBhcnNpbmcgZm9yIGZpbmFsIENSTEYKICAgICogUmV3aW5kIGJ1ZmZlciBhZnRlciBwYXJzaW5nIGNodW5rIHdpdGggZGF0YSByZW1haW5pbmcKICAgICogTW92ZWQgY2h1bmtlZCBoZWFkZXIgaW5pdGlhbGl6aW5nIHRvIGEgc3BvdCBqdXN0IGJlZm9yZSByZWNlaXZpbmcKICAgICAgaGVhZGVycwoKRGFuaWVsICgyMCBGZWJydWFyeSAyMDA3KQotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgY2hhbmdlZCB0aGUgQ1VSTE9QVF9GVFBfU1NMX0NDQyBvcHRpb24gdG8gaGFuZGxlCiAgYWN0aXZlIGFuZCBwYXNzaXZlIENDQyBzaHV0ZG93biBhbmQgYWRkZWQgdGhlIC0tZnRwLXNzbC1jY2MtbW9kZSBjb21tYW5kCiAgbGluZSBvcHRpb24uCgpEYW5pZWwgKDE5IEZlYnJ1YXJ5IDIwMDcpCi0gSWFuIFR1cm5lciBmaXhlZCB0aGUgbGliY3VybC5tNCBtYWNybydzIHN1cHBvcnQgZm9yIC0td2l0aC1saWJjdXJsLgoKLSBTaG11bGlrIFJlZ2V2IGZvdW5kIGEgbWVtb3J5IGxlYWsgaW4gcmUtdXNlZCBIVFRQUyBjb25uZWN0aW9ucywgYXQgbGVhc3QKICB3aGVuIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2FzIHVzZWQuCgotIFJvYnNvbiBCcmFnYSBBcmF1am8gbWFkZSBwYXNzaXZlIEZUUCB0cmFuc2ZlcnMgd29yayB3aXRoIFNPQ0tTIChib3RoIDQgYW5kCiAgNSkuCgpEYW5pZWwgKDE4IEZlYnJ1YXJ5IDIwMDcpCi0gSmVmZiBQb2hsbWV5ZXIgaWRlbnRpZmllZCB0d28gcHJvYmxlbXM6IGZpcnN0IGEgcmF0aGVyIG9ic2N1cmUgcHJvYmxlbSB3aXRoCiAgdGhlIG11bHRpIGludGVyZmFjZSBhbmQgY29ubmVjdGlvbiByZS11c2UgdGhhdCBjb3VsZCBtYWtlIGEKICBjdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoKSBydWluIGEgcG9pbnRlciBpbiBhbm90aGVyIGhhbmRsZS4KCiAgVGhlIHNlY29uZCBwcm9ibGVtIHdhcyBsZXNzIG9mIGFuIGFjdHVhbCBwcm9ibGVtIGJ1dCBtb3JlIG9mIG1pbm9yIHF1aXJrOgogIHRoZSByZS11c2luZyBvZiBjb25uZWN0aW9ucyB3YXNuJ3QgcHJvcGVybHkgY2hlY2tpbmcgaWYgdGhlIGNvbm5lY3Rpb24gd2FzCiAgbWFya2VkIGZvciBjbG9zdXJlLgoKRGFuaWVsICgxNiBGZWJydWFyeSAyMDA3KQotIER1bmNhbiBNYWMtVmljYXIgUHJldHQgYW5kIE1pY2hhbCBNYXJlayByZXBvcnRlZCBwcm9ibGVtcyB3aXRoIHJlc2V0dGluZwogIENVUkxPUFRfUkFOR0UgYmFjayB0byBubyByYW5nZSBvbiBhbiBlYXN5IGhhbmRsZSB3aGVuIHVzaW5nIEZUUC4KCkRhbiBGICgxNCBGZWJydWFyeSAyMDA3KQotIEZpeGVkIGN1cmwtY29uZmlnIC0tbGlicyBzbyBpdCBkb2Vzbid0IGxpc3QgdW5uZWNlc3NhcnkgbGlicmFyaWVzIChhbmQKICB0aGVyZWZvcmUgaW50cm9kdWNlIHVubmVjZXNzYXJ5IGRlcGVuZGVuY2llcykgd2hlbiBpdCdzIG5vdCBuZWVkZWQuCiAgQWxzbywgZG9uJ3QgYm90aGVyIGFkZGluZyBhIGxpYnJhcnkgcGF0aCBvZiAvdXNyL2xpYgoKRGFuaWVsICgxMyBGZWJydWFyeSAyMDA3KQotIFRoZSBkZWZhdWx0IHBhc3N3b3JkIGZvciBhbm9ueW1vdXMgRlRQIGNvbm5lY3Rpb25zIGlzIG5vdyBjaGFuZ2VkIHRvIGJlCiAgImZ0cEBleGFtcGxlLmNvbSIuCgotIFJvYmVydCBBLiBNb25hdCBtYWRlIGxpYmN1cmwgYnVpbGQgZmluZSB3aXRoIFZDMjAwNSAtIGl0IGRvZXNuJ3QgaGF2ZQogIGdtdGltZV9yKCkgbGlrZSB0aGUgb2xkZXIgVkMgdmVyc2lvbnMuIEhlIGFsc28gbWFkZSB1c2Ugb2Ygc29tZSBtYWNoaW5lLQogIHNwZWNpZmljIGRlZmluZXMgdG8gZGlmZmVyZW50aWF0ZSB0aGUgIk9TIiBkZWZpbmUuCgpEYW5pZWwgKDEyIEZlYnJ1YXJ5IDIwMDcpCi0gUm9iIENyaXR0ZW5kZW4gYWRkZWQgc3VwcG9ydCBmb3IgTlNTIChOZXR3b3JrIFNlY3VyaXR5IFNlcnZpY2UpIGZvciB0aGUKICBTU0wvVExTIGxheWVyLiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL01vemlsbGEvUHJvamVjdHMvTlNTCgogIFRoaXMgaXMgdGhlIGZvdXJ0aCBzdXBwb3J0ZWQgbGlicmFyeSBmb3IgVExTL1NTTCB0aGF0IGxpYmN1cmwgc3VwcG9ydHMhCgotIFNobXVsaWsgUmVnZXYgZml4ZWQgc28gdGhhdCB0aGUgZmluYWwgQ1JMRiBvZiBIVFRQIHJlc3BvbnNlIGhlYWRlcnMgYXJlIHNlbnQKICB0byB0aGUgZGVidWcgY2FsbGJhY2suCgotIFNobXVsaWsgUmVnZXYgYWRkZWQgQ1VSTE9QVF9IVFRQX0NPTlRFTlRfREVDT0RJTkcgYW5kCiAgQ1VSTE9QVF9IVFRQX1RSQU5TRkVSX0RFQ09ESU5HIHRoYXQgaWYgc2V0IHRvIHplcm8gd2lsbCBkaXNhYmxlIGxpYmN1cmwncwogIGludGVybmFsIGRlY29kaW5nIG9mIGNvbnRlbnQgb3IgdHJhbnNmZXIgZW5jb2RlZCBjb250ZW50LiBUaGlzIG1heSBiZQogIHByZWZlcmFibGUgaW4gY2FzZXMgd2hlcmUgeW91IHVzZSBsaWJjdXJsIGZvciBwcm94eSBwdXJwb3NlcyBvciBzaW1pbGFyLiBUaGUKICBjb21tYW5kIGxpbmUgdG9vbCBnb3QgYSAtLXJhdyBvcHRpb24gdG8gZGlzYWJsZSBib3RoIGF0IG9uY2UuCgotIHJlbGVhc2UgdGFyYmFsbHMgbWFkZSB3aXRoIG1ha2V0Z3ogd2lsbCBmcm9tIG5vdyBvbiBoYXZlIGEgTElCQ1VSTF9USU1FU1RBTVAKICBkZWZpbmUgc2V0IHRvIGhvbGQgdGhlIGV4YWN0IGRhdGUgYW5kIHRpbWUgb2Ygd2hlbiB0aGUgdGFyYmFsbCB3YXMgYnVpbHQsIGFzCiAgYSBodW1hbiByZWFkYWJsZSBzdHJpbmcgdXNpbmcgdGhlIFVUQyB0aW1lIHpvbmUuCgotIEplZmYgUG9obG1leWVyIGZpeGVkIGEgZmxhdyBpbiBjdXJsX211bHRpX2FkZF9oYW5kbGUoKSB3aGVuIGFkZGluZyBhIGhhbmRsZQogIHRoYXQgaGFzIGFuIGVhc3kgaGFuZGxlIHByZXNlbnQgaW4gdGhlICJjbG9zdXJlIiBsaXN0IHBlbmRpbmcgY2xvc3VyZS4KCkRhbmllbCAoNiBGZWJydWFyeSAyMDA3KQotIFJlZ3VsYXIgZmlsZSBkb3dubG9hZHMgd2lodCBTRlRQIGFuZCBTQ1AgYXJlIG5vdyBkb25lIHVzaW5nIHRoZSBub24tYmxvY2tpbmcKICBBUEkgb2YgbGlic3NoMiwgaWYgdGhlIGxpYnNzaDIgaGVhZGVycyBzZWVtIHRvIHN1cHBvcnQgdGhlbS4gVGhpcyB3aWxsIG1ha2UKICBTQ1AgYW5kIFNGVFAgbXVjaCBtb3JlIHJlc3BvbnNpdmUgYW5kIGJldHRlciBsaWJjdXJsIGNpdGl6ZW5zIHdoZW4gdXNlZCB3aXRoCiAgdGhlIG11bHRpIGludGVyZmFjZSBldGMuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwNykKLSBNaWNoYWVsIFdhbGxuZXIgYWRkZWQgc3VwcG9ydCBmb3IgQ1VSTE9QVF9USU1FT1VUX01TIGFuZAogIENVUkxPUFRfQ09OTkVDVFRJTUVPVVRfTVMgdGhhdCwgYXMgdGhlaXIgbmFtZXMgc3VnZ2VzdCwgZG8gdGhlIHRpbWVvdXRzIHdpdGgKICBtaWxsaXNlY29uZCByZXNvbHV0aW9uLiBUaGUgb25seSByZXN0cmljdGlvbiB0byB0aGF0IGlzIHRoZSBhbGFybSgpCiAgKHNvbWV0aW1lcykgdXNlZCB0byBhYm9ydCBuYW1lIHJlc29sdmVzIGFzIHRoYXQgdXNlcyBmdWxsIHNlY29uZHMuIEkgZml4ZWQKICB0aGUgRlRQIHJlc3BvbnNlIHRpbWVvdXQgcGFydCBvZiB0aGUgcGF0Y2guCgogIEludGVybmFsbHkgd2Ugbm93IGNvdW50IGFuZCBrZWVwIHRoZSB0aW1lb3V0cyBpbiBtaWxsaXNlY29uZHMgYnV0IGl0IGFsc28KICBtZWFucyB3ZSBtdWx0aXBseSBzZXQgdGltZW91dHMgd2l0aCAxMDAwLiBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCBubwogIHRpbWVvdXQgY2FuIGJlIHNldCB0byBtb3JlIHRoYW4gMl4zMSBtaWxsaXNlY29uZHMgKG9uIDMyIGJpdCBzeXN0ZW1zKSwgd2hpY2gKICBlcXVhbHMgMjQuODYgZGF5cy4gIFdlIHByb2JhYmx5IGNvdWxkbid0IGJlZm9yZSBlaXRoZXIgc2luY2UgdGhlIGNvZGUgZGlkCiAgKjEwMDAgb24gdGhlIHRpbWVvdXQgdmFsdWVzIG9uIHNldmVyYWwgcGxhY2VzIGFscmVhZHkuCgpEYW5pZWwgKDMgRmVicnVhcnkgMjAwNykKLSBZYW5nIFRzZSBmaXhlZCB0aGUgY29va2llIGV4cGlyeSBkYXRlIGluIHNldmVyYWwgdGVzdCBjYXNlcyB0aGF0IHN0YXJ0ZWQgdG8KICBmYWlsIHNpbmNlIHRoZXkgdXNlZCAiMSBmZWIgMjAwNyIuLi4KCi0gTWFuZnJlZCBTY2h3YXJiIHJlcG9ydGVkIHRoYXQgc29ja3M1IHN1cHBvcnQgd2FzIGJyb2tlbiBhbmQgaGVscCB1cyBwaW5wb2ludAogIHRoZSBwcm9ibGVtLiBUaGUgY29kZSBub3cgdHJpZXMgaGFyZGVyIHRvIHVzZSBodHRwcm94eSBhbmQgcHJveHkgd2hlcmUKICBhcHBwcm9wcmlhdGUsIGFzIG5vdCBhbGwgcHJveGllcyBhcmUgSFRUUC4uLgoKVmVyc2lvbiA3LjE2LjEgKDI5IEphbnVhcnkgMjAwNykKCkRhbmllbCAoMjkgSmFudWFyeSAyMDA3KQotIE1pY2hhZWwgV2FsbG5lciByZXBvcnRlZCB0aGF0IHdoZW4gZG9pbmcgYSBDT05ORUNUIHdpdGggYSBjdXN0b20gVXNlci1BZ2VudAogIGhlYWRlciwgeW91IGdvdCBfdHdvXyBVc2VyLUFnZW50IGhlYWRlcnMgaW4gdGhlIENPTk5FQ1QgcmVxdWVzdC4uLiEgQWRkZWQKICB0ZXN0IGNhc2UgMjg3IHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICgyOCBKYW51YXJ5IDIwMDcpCi0gY3VybF9lYXN5X3Jlc2V0KCkgbm93IHJlc2V0cyB0aGUgQ0EgYnVuZGxlIHBhdGggY29ycmVjdGx5LgoKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCB0aGUgQ3VybCBjb21tYW5kIGxpbmUgdG9vbCBmb3IgSFRUUCBvbiBub24tQVNDSUkKICBwbGF0Zm9ybXMuCgpEYW5pZWwgKDI1IEphbnVhcnkgMjAwNykKLSBBZGRlZCB0aGUgLS1saWJjdXJsIFtmaWxlXSBvcHRpb24gdG8gY3VybC4gQXBwZW5kIHRoaXMgb3B0aW9uIHRvIGFueQogIG9yZGluYXJ5IGN1cmwgY29tbWFuZCBsaW5lLCBhbmQgeW91IHdpbGwgZ2V0IGEgbGliY3VybC11c2luZyBzb3VyY2UgY29kZQogIHdyaXR0ZW4gdG8gdGhlIGZpbGUgdGhhdCBkb2VzIHRoZSBlcXVpdmFsZW50IG9wZXJhdGlvbiBvZiB3aGF0IHlvdXIgY29tbWFuZAogIGxpbmUgb3BlcmF0aW9uIGRvZXMhCgpEYW4gRiAoMjQgSmFudWFyeSAyMDA3KQotIEZpeGVkIGEgZGFuZ2xpbmcgcG9pbnRlciBwcm9ibGVtIHRoYXQgcHJldmVudGVkIHRoZSBodHRwX3Byb3h5IGVudmlyb25tZW50CiAgdmFyaWFibGUgZnJvbSBiZWluZyBwcm9wZXJseSB1c2VkIGluIG1hbnkgY2FzZXMgKGFuZCBjYXVzZWQgdGVzdCBjYXNlIDYzCiAgdG8gZmFpbCkuCgpEYW5pZWwgKDIzIEphbnVhcnkgMjAwNykKLSBEYXZpZCBNY0NyZWVkeSBkaWQgTlRMTSBjaGFuZ2VzIG1haW5seSBmb3Igbm9uLUFTQ0lJIHBsYXRmb3JtczoKCiAgIzEKICBUaGVyZSdzIGEgY29tcGlsYXRpb24gZXJyb3IgaW4gaHR0cF9udGxtLmMgaWYgVVNFX05UTE0yU0VTU0lPTiBpcyBOT1QKICBkZWZpbmVkLiAgSSBub3RpY2VkIHRoaXMgd2hpbGUgdGVzdGluZyB2YXJpb3VzIGNvbmZpZ3VyYXRpb25zLiAgTGluZSA4Njcgb2YKICB0aGUgY3VycmVudCBodHRwX250bG0uYyBpcyBhIGNsb3NpbmcgYnJhY2tldCBmb3IgYW4gaWYvZWxzZSBwYWlyIHRoYXQgb25seQogIGdldHMgY29tcGlsZWQgaW4gaWYgVVNFX05UTE0yU0VTU0lPTiBpcyBkZWZpbmVkLiAgQnV0IHRoaXMgY2xvc2luZyBicmFja2V0CiAgd2Fzbid0IGluIGFuICNpZmRlZiBzbyB0aGUgY29kZSBmYWlscyB0byBjb21waWxlIHVubGVzcyBVU0VfTlRMTTJTRVNTSU9OIHdhcwogIGRlZmluZWQuICBMaW5lcyAxOTggYW5kIDE0MCBvZiBteSBwYXRjaCB3cmFwcyB0aGF0IGNsb3NpbmcgYnJhY2tldCBpbiBhbgogICNpZmRlZiBVU0VfTlRMTTJTRVNTSU9OLgoKICAjMgogIEkgbm90aWNlZCBzZXZlcmFsIHBpY2t5IGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gREVCVUdfTUUgaXMgZGVmaW5lZC4gIEkndmUKICBmaXhlZCB0aGVtIHdpdGggY2FzdGluZy4gIEJ5IHRoZSB3YXksIERFQlVHX01FIHdhcyBhIGh1Z2UgaGVscCBpbgogIHVuZGVyc3RhbmRpbmcgdGhpcyBjb2RlLgoKICAjMwogIEhvcGVmdWxseSB0aGUgbGFzdCBub24tQVNDSUkgY29udmVyc2lvbiBwYXRjaCBmb3IgbGliY3VybCBpbiBhIHdoaWxlLiAgSQogIGNoYW5nZWQgdGhlICJOVExNU1NQIiBsaXRlcmFsIHRvIGhleCBzaW5jZSB0aGlzIHNpZ25hdHVyZSBtdXN0IGFsd2F5cyBiZSBpbgogIEFTQ0lJLgoKICBDb252ZXJzaW9uIGNvZGUgd2FzIHN0cmF0ZWdpY2FsbHkgYWRkZWQgd2hlcmUgbmVjZXNzYXJ5LiAgQW5kIHRoZQogIEN1cmxfYmFzZTY0X2VuY29kZSBjYWxscyB3ZXJlIGNoYW5nZWQgc28gdGhlIGJpbmFyeSAiYmxvYnMiIGh0dHBfbnRsbS5jCiAgY3JlYXRlcyBhcmUgTk9UIHRyYW5zbGF0ZWQgb24gbm9uLUFTQ0lJIHBsYXRmb3Jtcy4KCkRhbiBGICgyMiBKYW51YXJ5IDIwMDcpCi0gQ29udmVydGVkIChtb3N0IG9mKSB0aGUgdGVzdCBkYXRhIGZpbGVzIGludG8gZ2VudWluZSBYTUwuICBBIGhhbmRmdWwgc3RpbGwKICBhcmUgbm90LCBkdWUgbWFpbmx5IHRvIHRoZSBsYWNrIG9mIHN1cHBvcnQgZm9yIFhNTCBjaGFyYWN0ZXIgZW50aXRpZXMKICAoZS5nLiAmID0+ICZhbXA7ICkuICBUaGlzIHdpbGwgbWFrZSBpdCBlYXNpZXIgdG8gdmFsaWRhdGUgdGVzdCBmaWxlcyB1c2luZwogIHRvb2xzIGxpa2UgeG1sbGludCwgYXMgd2VsbCBhcyB0byBlZGl0IGFuZCB2aWV3IHRoZW0gdXNpbmcgWE1MIHRvb2xzLgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDcpCi0gQXJtZWwgQXNzZWxpbiBpbXByb3ZlZCBsaWJjdXJsIHRvIGJlaGF2ZSBhIGxvdCBiZXR0ZXIgd2hlbiBhbiBlYXN5IGhhbmRsZQogIGRvaW5nIGFuIEZUUCB0cmFuc2ZlciBpcyByZW1vdmVkIGZyb20gYSBtdWx0aSBoYW5kbGUgYmVmb3JlIGNvbXBsZXRpb24uIFRoZQogIGZpeCBhbHNvIGZpeGVkIHRoZSAiYWxpdmUgY291bnRlciIgdG8gYmUgY29ycmVjdCBvbiAicHJlbWF0dXJlIHJlbW92YWwiIGZvcgogIGFsbCBwcm90b2NvbHMuCgpEYW4gRiAoMTYgSmFudWFyeSAyMDA3KQotIEZpeGVkIGEgc21hbGwgbWVtb3J5IGxlYWsgaW4gdGZ0cCB1cGxvYWRzIGRpc2NvdmVyZWQgYnkgY3VybCdzIG1lbW9yeSBsZWFrCiAgZGV0ZWN0b3IuICBBbHNvIGNoYW5nZWQgdGZ0cCBkb3dubG9hZHMgdG8gVVJMLXVuZXNjYXBlIHRoZSBkb3dubG9hZGVkCiAgZmlsZSBuYW1lLgoKRGFuaWVsICgxNCBKYW51YXJ5IDIwMDcpCi0gRGF2aWQgTWNDcmVlZHkgcHJvdmlkZWQgbGliY3VybCBjaGFuZ2VzIGZvciBkb2luZyBIVFRQIGNvbW11bmljYXRpb24gb24KICBub24tQVNDSUkgcGxhdGZvcm1zLiBJdCBkb2VzIGFkZCBzb21lIGNvbXBsZXhpdHksIG1vc3Qgbm90YWJseSB3aXRoIG1vcmUKICAjaWZkZWZzLCBidXQgSSB3YW50IHRvIHNlZSB0aGlzIHN1cHBvcnRlZCBhZGRlZCBhbmQgSSBjYW4ndCBzZWUgaG93IHdlIGNhbgogIGFkZCBpdCB3aXRob3V0IHRoZSBleHRyYSBzdHVmZiBhZGRlZC4KCi0gU2V0dGluZyBDVVJMT1BUX0NPT0tJRUxJU1QgdG8gIkFMTCIgd2hlbiBubyBjb29raWVzIGF0IGFsbCB3YXMgcHJlc2VudCwKICBsaWJjdXJsIHdvdWxkIGNyYXNoIHdoZW4gdHJ5aW5nIHRvIHJlYWQgYSBOVUxMIHBvaW50ZXIuCgpEYW5pZWwgKDEyIEphbnVhcnkgMjAwNykKLSBUb2J5IFBldGVyc29uIGZvdW5kIGEgbmFzdHkgYnVnIHRoYXQgcHJldmVudGVkIChsaWIpY3VybCBmcm9tIHByb3Blcmx5CiAgZG93bmxvYWRpbmcgKG1vc3QpIHRoaW5ncyB0aGF0IHdlcmUgbGFyZ2VyIHRoYW4gNEdCIG9uIDMyIGJpdCBzeXN0ZW1zLiAgTWF0dAogIFdpdGhlcnNwb29uIGhlbHBlZCBhcyBuYXJyb3cgZG93biB0aGUgcHJvYmxlbS4KCkRhbmllbCAoNSBKYW51YXJ5IDIwMDcpCi0gTGludXMgTmllbHNlbiBGZWx0emluZyBpbnRyb2R1Y2VkIHRoZSAtLWZ0cC1zc2wtY2NjIGNvbW1hbmQgbGluZSBvcHRpb24gdG8KICBjdXJsIHRoYXQgdXNlcyB0aGUgbmV3IENVUkxPUFRfRlRQX1NTTF9DQ0Mgb3B0aW9uIGluIGxpYmN1cmwuIElmIGVuYWJsZWQsIGl0CiAgd2lsbCBtYWtlIGxpYmN1cmwgc2h1dGRvd24gU1NML1RMUyBhZnRlciB0aGUgYXV0aGVudGljYXRpb24gaXMgZG9uZSBvbiBhCiAgRlRQLVNTTCBvcGVyYXRpb24uCgpEYW5pZWwgKDQgSmFudWFyeSAyMDA3KQotIERhdmlkIE1jQ3JlZWR5IG1hZGUgY2hhbmdlcyB0byBhbGxvdyBiYXNlNjQgZW5jb2RpbmcvZGVjb2RpbmcgdG8gd29yayBvbgogIG5vbi1BU0NJSSBwbGF0Zm9ybXMuCgpEYW5pZWwgKDMgSmFudWFyeSAyMDA3KQotIE1hdHQgV2l0aGVyc3Bvb24gZml4ZWQgdGhlIGZsYXcgd2hpY2ggbWFkZSBsaWJjdXJsIDcuMTYuMCBhbHdheXMgc3RvcmUKICBkb3dubG9hZGVkIGRhdGEgaW4gdHdvIGJ1ZmZlcnMsIGp1c3QgdG8gYmUgYWJsZSB0byBkZWFsIHdpdGggYSBzcGVjaWFsIEhUVFAKICBwaXBlbGluaW5nIGNhc2UuIFRoYXQgaXMgbm93IG9ubHkgYWN0aXZhdGVkIGZvciBwaXBlbGluZWQgdHJhbnNmZXJzLiBJbgogIE1hdHQncyBjYXNlLCBpdCBzaG93ZWQgYXMgYSBjb25zaWRlcmFibGUgcGVyZm9ybWFuY2UgZGlmZmVyZW5jZSwKCkRhbmllbCAoMiBKYW51YXJ5IDIwMDcpCi0gVmljdG9yIFNuZXpoa28gaGVscGVkIHVzIGZpeCBidWcgcmVwb3J0ICMxNjAzNzEyCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNjAzNzEyKSAoa25vd24gYnVnICMzNikgLS1saW1pdC1yYXRlCiAgKENVUkxPUFRfTUFYX1NFTkRfU1BFRURfTEFSR0UgYW5kIENVUkxPUFRfTUFYX1JFQ1ZfU1BFRURfTEFSR0UpIGFyZSBicm9rZW4KICBvbiBXaW5kb3dzIChzaW5jZSA3LjE2LjAsIGJ1dCB0aGF0J3Mgd2hlbiB0aGV5IHdlcmUgaW50cm9kdWNlZCBhcyBwcmV2aW91cwogIHRvIHRoYXQgdGhlIGxpbWl0aW5nIGxvZ2ljIHdhcyBtYWRlIGluIHRoZSBhcHBsaWNhdGlvbiBvbmx5IGFuZCBub3QgaW4gdGhlCiAgbGlicmFyeSkuIEl0IHdhcyBhY3R1YWxseSBhbHNvIGJyb2tlbiBvbiBzZWxlY3QoKS1iYXNlZCBzeXN0ZW1zIChhcyBhcHBvc2VkCiAgdG8gcG9sbCgpKSBidXQgd2UgaGF2ZW4ndCBoYWQgYW55IHN1Y2ggcmVwb3J0cy4gV2Ugbm93IHVzZSBzZWxlY3QoKSwgU2xlZXAoKQogIG9yIGRlbGF5KCkgcHJvcGVybHkgdG8gc2xlZXAgYSB3aGlsZSB3aXRob3V0IHdhaXRpbmcgZm9yIGFueXRoaW5nIGlucHV0IG9yCiAgb3V0cHV0IHdoZW4gdGhlIHJhdGUgbGltaXRpbmcgaXMgYWN0aXZhdGVkIHdpdGggdGhlIGVhc3kgaW50ZXJmYWNlLgoKLSBNb2RpZmllZCBsaWJjdXJsLnBjLmluIHRvIHVzZSBMaWJzLnByaXZhdGUgZm9yIHRoZSBsaWJzIGxpYmN1cmwgaXRzZWxmIG5lZWRzCiAgdG8gZ2V0IGJ1aWx0IHN0YXRpYy4gSXQgaGFzIGJlZW4gbWVudGlvbmVkIGJlZm9yZSBhbmQgd2FzIGFnYWluIGJyb3VnaHQgdG8KICBvdXIgYXR0ZW50aW9uIGJ5IE5hdGhhbmFlbCBOZXJvZGUgd2hvIGZpbGVkIGRlYmlhbiBidWcgcmVwb3J0ICM0MDUyMjYKICAoaHR0cHM6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz00MDUyMjYpLgoKRGFuaWVsICgyOSBEZWNlbWJlciAyMDA2KQotIE1ha2UgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHNldCB0aGUgbWFnaWMgbnVtYmVyIGluIHRoZSBuZXcgaGFuZGxlLgoKRGFuaWVsICgyMiBEZWNlbWJlciAyMDA2KQotIFJvYmVydCBGb3JlbWFuIHByb3ZpZGVkIGEgcHJpbWUgZXhhbXBsZSBzbmlwcGV0IHNob3dpbmcgaG93IGxpYmN1cmwgd291bGQKICBnZXQgY29uZnVzZWQgYW5kIG5vdCBhY2tub3dsZWRnZSB0aGUgJ25vX3Byb3h5JyB2YXJpYWJsZSBwcm9wZXJseSBvbmNlIGl0CiAgaGFkIHVzZWQgdGhlIHByb3h5IGFuZCB5b3UgcmUtdXNlZCB0aGUgc2FtZSBlYXN5IGhhbmRsZS4gSSBtYWRlIHN1cmUgdGhlCiAgcHJveHkgbmFtZSBpcyBwcm9wZXJseSBzdG9yZWQgaW4gdGhlIGNvbm5lY3Qgc3RydWN0IHJhdGhlciB0aGFuIHRoZQogIHNlc3Npb25oYW5kbGUvZWFzeSBzdHJ1Y3QuCgotIERhdmlkIE1jQ3JlZWR5IGZpeGVkIGEgYmFkIGNhbGwgdG8gZ2V0c29ja25hbWUoKSB0aGF0IHdyb25nbHkgdXNlZCBhIHNpemVfdAogIHZhcmlhYmxlIHRvIHBvaW50IHRvIHdoZW4gaXQgc2hvdWxkIGJlIGEgc29ja2xlbl90LgoKLSBXaGVuIHNldHRpbmcgYSBwcm94eSB3aXRoIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgKGZvciBleGFtcGxlKSBydW5uaW5nCiAgJ2N1cmwgW1VSTF0nIHdpdGggYSBVUkwgd2l0aG91dCBhIHByb3RvY29sIHByZWZpeCwgY3VybCB3b3VsZCBub3Qgc2VuZCBhCiAgY29ycmVjdCByZXF1ZXN0IGFzIGl0IGZhaWxlZCB0byBhZGQgdGhlIHByb3RvY29sIHByZWZpeC4KCkRhbmllbCAoMjEgRGVjZW1iZXIgMjAwNikKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIHJlcG9ydGVkIGJ1ZyAjMTYxODM1OQogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTYxODM1OSkgYW5kIHN1YnNlcXVlbnRseSBwcm92aWRlZCBhCiAgcGF0Y2ggZm9yIGl0OiB3aGVuIGRvd25sb2FkaW5nIDIgemVybyBieXRlIGZpbGVzIGluIGEgcm93LCBjdXJsIDcuMTYuMAogIGVudGVycyBhbiBpbmZpbml0ZSBsb29wLCB3aGlsZSBjdXJsIDcuMTYuMS0yMDA2MTIxOCBkb2VzIG9uZSBhZGRpdGlvbmFsCiAgdW5uZWNlc3NhcnkgcmVxdWVzdC4KCiAgRml4OiBEdXJpbmcgdGhlICJNYWpvciBvdmVyaGF1bCBpbnRyb2R1Y2luZyBodHRwIHBpcGVsaW5pbmcgc3VwcG9ydCBhbmQKICBzaGFyZWQgY29ubmVjdGlvbiBjYWNoZSB3aXRoaW4gdGhlIG11bHRpIGhhbmRsZS4iIGNoYW5nZSwgaGVhZGVyYnl0ZWNvdW50CiAgd2FzIG1vdmVkIHRvIGxpdmUgaW4gdGhlIEN1cmxfdHJhbnNmZXJfa2VlcGVyIHN0cnVjdHVyZS4gQnV0IHRoYXQgc3RydWN0dXJlCiAgaXMgcmVzZXQgaW4gdGhlIFRyYW5zZmVyIG1ldGhvZCwgbG9zaW5nIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdlIGhhZCBhYm91dAogIHRoZSBoZWFkZXIgc2l6ZS4gVGhpcyBwYXRjaCBtb3ZlcyBpdCBiYWNrIHRvIHRoZSBjb25uZWN0ZGF0YSBzdHJ1Y3QuCgpEYW5pZWwgKDE2IERlY2VtYmVyIDIwMDYpCi0gQnJlbmRhbiBKdXJkIHByb3ZpZGVkIGEgZml4IHRoYXQgbm93IHByZXZlbnRzIGxpYmN1cmwgZnJvbSBnZXR0aW5nIGEgU0lHUElQRQogIGR1cmluZyBjZXJ0YWluIGNvbmRpdGlvbnMgd2hlbiBHbnVUTFMgaXMgdXNlZC4KCkRhbmllbCAoMTEgRGVjZW1iZXIgMjAwNikKLSBBbGV4ZXkgU2ltYWsgZm91bmQgb3V0IHRoYXQgd2hlbiBkb2luZyBGVFAgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZAogIHNvbWV0aGluZyB3ZW50IHdyb25nIGxpa2UgaXQgZ290IGEgYmFkIHJlc3BvbnNlIGNvZGUgYmFjayBmcm9tIHRoZSBzZXJ2ZXIsCiAgbGliY3VybCB3b3VsZCBsZWFrIG1lbW9yeS4gQWRkZWQgdGVzdCBjYXNlIDUzOCB0byB2ZXJpZnkgdGhlIGZpeC4KCiAgSSBhbHNvIG5vdGVkIHRoYXQgdGhlIGNvbm5lY3Rpb24gd291bGQgZ2V0IGNhY2hlZCBpbiB0aGF0IGNhc2UsIHdoaWNoCiAgZG9lc24ndCBtYWtlIHNlbnNlIHNpbmNlIGl0IGNhbm5vdCBiZSByZS11c2Ugd2hlbiB0aGUgYXV0aGVudGljYXRpb24gaGFzCiAgZmFpbGVkLiBJIGZpeGVkIHRoYXQgaXNzdWUgdG9vIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCBhbHNvIHRoYXQgdGhlIHBhdGgKICB3b3VsZCBiZSAicmVtZW1iZXJlZCIgaW4gdmFpbiBmb3IgY2FzZXMgd2hlcmUgdGhlIGNvbm5lY3Rpb24gd2FzIGFib3V0IHRvCiAgZ2V0IGNsb3NlZC4KCkRhbmllbCAoNiBEZWNlbWJlciAyMDA2KQotIFNlYmFzdGllbiBXaWxsZW1pam5zIHJlcG9ydGVkIGJ1ZyAjMTYwMzcxMgogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTYwMzcxMikgd2hpY2ggaXMgYWJvdXQgY29ubmVjdGlvbnMKICBnZXR0aW5nIGN1dCBvZmYgcHJlbWF0dXJlbHkgd2hlbiAtLWxpbWl0LXJhdGUgaXMgdXNlZC4gV2hpbGUgSSBmb3VuZCBubyBzdWNoCiAgcHJvYmxlbXMgaW4gbXkgdGVzdHMgbm9yIGluIG15IHJlYWRpbmcgb2YgdGhlIGNvZGUsIEkgZm91bmQgdGhhdCB0aGUKICAtLWxpbWl0LXJhdGUgY29kZSB3YXMgc2V2ZXJseSBmbGF3ZWQgKHNpbmNlIGl0IHdhcyBtb3ZlZCBpbnRvIHRoZSBsaWIsIHNpbmNlCiAgNy4xNS41KSB3aGVuIHVzZWQgd2l0aCB0aGUgZWFzeSBpbnRlcmZhY2UgYW5kIGl0IGRpZG4ndCB3b3JrIGFzIGRvY3VtZW50ZWQKICBzbyBJIHJld29ya2VkIGl0IHNvbWV3aGF0IGFuZCBub3cgaXQgd29ya3MgZm9yIG15IHRlc3RzLgoKRGFuaWVsICg1IERlY2VtYmVyIDIwMDYpCi0gU3RlZmFuIEtyYXVzZSBwb2ludGVkIG91dCBhIGNvbXBpbGVyIHdhcm5pbmcgd2l0aCBhIHBpY2t5IE1TQ1YgY29tcGlsZXIgd2hlbgogIHBhc3NpbmcgYSBjdXJsX29mZl90IGFyZ3VtZW50IHRvIHRoZSBDdXJsX3JlYWRfcmV3aW5kKCkgZnVuY3Rpb24gd2hpY2ggdGFrZXMKICBhbiBzaXplX3QgYXJndW1lbnQuIEN1cmxfcmVhZF9yZXdpbmQoKSBhbHNvIGhhZCBkZWJ1ZyBjb2RlIGxlZnQgaW4gaXQgYW5kIGl0CiAgd2FzIHB1dCBpbiBhIGRpZmZlcmVudCBzb3VyY2UgZmlsZSB3aXRoIG5vIGdvb2QgcmVhc29uIHdoZW4gb25seSB1c2VkIGZyb20KICBvbmUgc2luZ2xlIHNwb3QuCgotIFNoIERpYW8gcmVwb3J0ZWQgdGhhdCBDVVJMT1BUX0NMT1NFUE9MSUNZIGRvZXNuJ3Qgd29yaywgYW5kIGluZGVlZCwgdGhlcmUgaXMKICBubyBjb2RlIHByZXNlbnQgaW4gdGhlIGxpYnJhcnkgdGhhdCByZWNlaXZlcyB0aGUgb3B0aW9uLiBTaW5jZSBpdCB3YXMgbm90CiAgcG9zc2libGUgdG8gdXNlLCB3ZSBrbm93IHRoYXQgbm8gY3VycmVudCB1c2VycyBleGlzdCBhbmQgdGh1cyB3ZSBzaW1wbHkKICByZW1vdmVkIGl0IGZyb20gdGhlIGRvY3MgYW5kIG1hZGUgdGhlIGNvZGUgYWx3YXlzIHVzZSB0aGUgZGVmYXVsdCBwYXRoIG9mCiAgdGhlIGNvZGUuCgotIEphcmVkIEx1bmRlbGwgZmlsZWQgYnVnIHJlcG9ydCAjMTYwNDk1NgogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTYwNDk1Nikgd2hpY2ggaWRlbnRpZmllZCBzZXR0aW5nCiAgQ1VSTE9QVF9NQVhDT05ORUNUUyB0byB6ZXJvIGNhdXNlZCBsaWJjdXJsIHRvIFNJR1NFR1YuIFN0YXJ0aW5nIG5vdywgbGliY3VybAogIHdpbGwgYWx3YXlzIGludGVybmFsbHkgdXNlIG5vIGxlc3MgdGhhbiAxIGVudHJ5IGluIHRoZSBjb25uZWN0aW9uIGNhY2hlLgoKLSBTaCBEaWFvIHJlcG9ydGVkIHRoYXQgQ1VSTE9QVF9GT1JCSURfUkVVU0Ugbm8gd29ya3MsIGFuZCBpbmRlZWQgaXQgYnJva2UgaW4KICB0aGUgNy4xNi4wIHJlbGVhc2UuCgotIE1hcnRpbiBTa2lubmVyIGJyb3VnaHQgYmFjayBidWcgcmVwb3J0ICMxMjMwMTE4IHRvIGhhdW50IHVzIG9uY2UgYWdhaW4uCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjMwMTE4KSBjdXJsX2dldGRhdGUoKSBkaWQgbm90IHdvcmsKICBwcm9wZXJseSBmb3IgYWxsIGlucHV0IGRhdGVzIG9uIFdpbmRvd3MuIEl0IHdhcyBtb3N0bHkgc2VlbiBvbiBzb21lIFRaIHRpbWUKICB6b25lcyB1c2luZyBEU1QuIEx1Y2tpbHksIE1hcnRpbiBhbHNvIHByb3ZpZGVkIGEgZml4LgoKLSBBbGV4ZXkgU2ltYWsgZmlsZWQgYnVnIHJlcG9ydCAjMTYwMDQ0NwogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTYwMDQ0NykgaW4gd2hpY2ggaGUgbm90ZWQgdGhhdCBhY3RpdmUKICBGVFAgY29ubmVjdGlvbnMgZG9uJ3Qgd29yayB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UuIFRoZSBwcm9ibGVtIGlzIGhlcmUKICB0aGF0IHRoZSBtdWx0aSBpbnRlcmZhY2Ugc3RhdGUgbWFjaGluZSBoYXMgYSBzdGF0ZSBkdXJpbmcgd2hpY2ggaXQgY2FuIHdhaXQKICBmb3IgdGhlIGRhdGEgY29ubmVjdGlvbiB0byBjb25uZWN0LCBidXQgdGhlIGFjdGl2ZSBjb25uZWN0aW9uIGlzIG5vdCBkb25lIGluCiAgdGhlIHNhbWUgc3RlcCBpbiB0aGUgc2VxdWVuY2UgYXMgdGhlIHBhc3NpdmUgb25lIGlzIHNvIGl0IGRvZXNuJ3QgcXVpdGUgd29yawogIGZvciBhY3RpdmUuIFRoZSBhY3RpdmUgRlRQIGNvZGUgc3RpbGwgdXNlIGEgYmxvY2tpbmcgZnVuY3Rpb24gdG8gYWxsb3cgdGhlCiAgcmVtb3RlIHNlcnZlciB0byBjb25uZWN0LgoKICBUaGUgZml4ICh3b3JrLWFyb3VuZCBpcyBhIGJldHRlciB3b3JkKSBmb3IgdGhpcyBwcm9ibGVtIGlzIHRvIHNldCB0aGUKICBib29sZWFuIHByZW1hdHVyZWx5IHRoYXQgdGhlIGRhdGEgY29ubmVjdGlvbiBpcyBjb21wbGV0ZWQsIHNvIHRoYXQgdGhlICJ3YWl0CiAgZm9yIGNvbm5lY3QiIHBoYXNlIGVuZHMgYXQgb25jZS4KCiAgVGhlIHByb3BlciBmaXgsIGxlZnQgZm9yIHRoZSBmdXR1cmUsIGlzIG9mIGNvdXJzZSB0byBtYWtlIHRoZSBhY3RpdmUgRlRQCiAgY2FzZSB0byBhY3QgaW4gYSBub24tYmxvY2tpbmcgd2F5IHRvby4KCi0gTWF0dCBXaXRoZXJzcG9vbiBmaXhlZCBhIHByb2JsZW0gY2FzZSB3aGVuIHRoZSBDUFUgbG9hZCB3ZW50IHRvIDEwMCUgd2hlbiBhCiAgSFRUUCB1cGxvYWQgd2FzIGRpc2Nvbm5lY3RlZDoKCiAgIldoYXQgYXBwZWFycyB0byBiZSBoYXBwZW5pbmcgaXMgdGhhdCBteSBzeXN0ZW0gKExpbnV4IDIuNi4xNyBhbmQgMi42LjEzKSBpcwogIHNldHRpbmcgKm9ubHkqIFBPTExIVVAgb24gcG9sbCgpIHdoZW4gdGhlIGNvbmRpdGlvbnMgaW4gbXkgcHJldmlvdXMgbWFpbAogIG9jY3VyLiBBcyB5b3UgY2FuIHNlZSwgc2VsZWN0LmM6Q3VybF9zZWxlY3QoKSBkb2VzIG5vdCBjaGVjayBmb3IgUE9MTEhVUC4gU28KICBiYXNpY2FsbHkgd2hhdCB3YXMgaGFwcGVuaW5nLCBpcyBwb2xsKCkgd2FzIHJldHVybmluZyBpbW1lZGlhdGVseSAod2l0aAogIFBPTExIVVAgc2V0KSwgYnV0IHdoZW4gQ3VybF9zZWxlY3QoKSBsb29rZWQgYXQgdGhlIGJpdHMsIG5laXRoZXIgUE9MTEVSUiBvcgogIFBPTExPVVQgd2FzIHNldC4gVGhpcyBzdGlsbCBjYXVzZWQgQ3VybF9yZWFkd3JpdGUoKSB0byBiZSBjYWxsZWQsIHdoaWNoCiAgcXVpY2tseSByZXR1cm5lZC4gVGhlbiB0aGUgdHJhbnNmZXIoKSBsb29wIGtlcHQgY29udGludWluZyBhdCBmdWxsIHNwZWVkCiAgZm9yZXZlci4iCgpEYW5pZWwgKDEgRGVjZW1iZXIgMjAwNikKLSBUb29uIFZlcndhZXN0IHJlcG9ydGVkIHRoYXQgdGhlcmUgYXJlIHNlcnZlcnMgdGhhdCBzZW5kIHRoZSBDb250ZW50LVJhbmdlOgogIGhlYWRlciBpbiBhIHRoaXJkLCBub3Qgc3VwcHBvcnRlZCBieSBsaWJjdXJsLCBmb3JtYXQgYW5kIHdlIGFncmVlZCB0aGF0IHdlCiAgY291bGQgbWFrZSB0aGUgcGFyc2VyIG1vcmUgZm9yZ2l2aW5nIHRvIGFjY2VwdCBhbGwgdGhlIHRocmVlIGZvdW5kCiAgdmFyaWF0aW9ucy4KCkRhbmllbCAoMjUgTm92ZW1iZXIgMjAwNikKLSBWZW5rYXQgQWtlbGxhIGZvdW5kIG91dCB0aGF0IGxpYmN1cmwgZGlkIG5vdCBsaWtlIEhUVFAgcmVzcG9uc2VzIHRoYXQgc2ltcGx5CiAgcmVzcG9uZGVkIHdpdGggYSBzaW5nbGUgc3RhdHVzIGxpbmUgYW5kIG5vIGhlYWRlcnMgbm9yIGJvZHkuIFN0YXJ0aW5nIG5vdywgYQogIEhUVFAgcmVzcG9uc2Ugb24gYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gKGkuZSBub3Qgc2V0IHRvIGJlIGNsb3NlZCBhZnRlciB0aGUKICByZXNwb25zZSBoYXMgYmVlbiB0YWtlbiBjYXJlIG9mKSBtdXN0IGhhdmUgQ29udGVudC1MZW5ndGggb3IgY2h1bmtlZAogIGVuY29kaW5nIHNldCwgb3IgbGliY3VybCB3aWxsIHNpbXBseSBhc3N1bWUgdGhhdCB0aGVyZSBpcyBubyBib2R5LgoKICBUbyBteSBob3Jyb3IgSSBsZWFybmVkIHRoYXQgd2UgaGFkIG5vIGxlc3MgdGhhbiA1NyghKSB0ZXN0IGNhc2VzIHRoYXQgZGlkIGJhZAogIEhUVFAgcmVzcG9uc2VzIGxpa2UgdGhpcywgYW5kIGV2ZW4gdGhlIHRlc3QgaHR0cCBzZXJ2ZXIgKHN3cykgcmVzcG9uZGVkIGJhZGx5CiAgd2hlbiBxdWVyaWVkIGJ5IHRoZSB0ZXN0IHN5c3RlbSBpZiBpdCBpcyB0aGUgdGVzdCBzeXN0ZW0uIFNvIGFsdGhvdWdoIHRoZQogIGFjdHVhbCBmaXggZm9yIHRoZSBwcm9ibGVtIHdhcyB0aW55LCBnb2luZyB0aHJvdWdoIGFsbCB0aGUgbmV3bHkgZmFpbGluZyB0ZXN0CiAgY2FzZXMgZ290IHJlYWxseSBwYWluZnVsIGFuZCBib3JpbmcuCgpEYW5pZWwgKDI0IE5vdmVtYmVyIDIwMDYpCi0gSmFtZXMgSG91c2xleSBkaWQgbG90cyBvZiB3b3JrIGFuZCBpbnRyb2R1Y2VkIFNGVFAgZG93bmxvYWRzLgoKRGFuaWVsICgxMyBOb3ZlbWJlciAyMDA2KQotIFJvbiBpbiBidWcgIzE1OTUzNDggKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNTk1MzQ4KSBwb2ludGVkCiAgb3V0IGEgc3RhY2sgb3ZlcndyaXRlIChhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZml4KSBvbiA2NGJpdCBXaW5kb3dzIHdoZW4KICBkZWFsaW5nIHdpdGggSFRUUCBjaHVua2VkIGVuY29kaW5nLgoKRGFuaWVsICg5IE5vdmVtYmVyIDIwMDYpCi0gTmlyIFNvZmZlciB1cGRhdGVkIGxpYmN1cmwuZnJhbWV3b3JrLm1ha2U6CiAgbyBmaXggc3ltbGlua3MsIHNob3VsZCBsaW5rIHRvIFZlcnNpb25zLCBub3QgdG8gLi9WZXJzaW9ucwogIG8gaW5kZW50YXRpb24gaW1wcm92bWVudHMKCi0gRG1pdHJpeSBTZXJnZXlldiBmb3VuZCBhIFNJR1NFR1Ygd2l0aCBoaXMgdGVzdDA0LmMgZXhhbXBsZSBwb3N0ZWQgb24gNyBOb3YKICAyMDA2LiBJdCB0dXJuZWQgb3V0IHdlIHdyb25nbHkgYXNzdW1lZCB0aGF0IHRoZSBjb25uZWN0aW9uIGNhY2hlIHdhcyBwcmVzZW50CiAgd2hlbiB0ZWFyaW5nIGRvd24gYSBjb25uZWN0aW9uLgoKLSBDaXByaWFuIEJhZGVzY3UgZm91bmQgYSBTSUdTRUdWIHdoZW4gZG9pbmcgbXVsdGlwbGUgVEZUUCB0cmFuc2ZlcnMgdXNpbmcgdGhlCiAgbXVsdGkgaW50ZXJmYWNlLCBidXQgSSBjb3VsZCBhbHNvIHJlcGVhdCBpdCBkb2luZyBtdWx0aXBsZSBzZXF1ZW50aWFsIG9uZXMKICB3aXRoIHRoZSBlYXN5IGludGVyZmFjZS4gVXNpbmcgQ2lwcmlhbidzIHRlc3QgY2FzZSwgSSBjb3VsZCBmaXggaXQuCgpEYW5pZWwgKDggTm92ZW1iZXIgMjAwNikKLSBCcmFkZm9yZCBCcnVjZSByZXBvcnRlZCB0aGF0IHdoZW4gc2V0dGluZyBDVVJMT1BUX0RFQlVHRlVOQ1RJT04gd2l0aG91dAogIENVUkxPUFRfVkVSQk9TRSBzZXQgdG8gbm9uLXplcm8sIHlvdSBzdGlsbCBnb3QgYSBmZXcgZGVidWcgbWVzc2FnZXMgZnJvbSB0aGUKICBTU0wgaGFuZHNoYWtlLiBUaGlzIGlzIG5vdyBzdG9wcGVkLgoKRGFuaWVsICg3IE5vdmVtYmVyIDIwMDYpCi0gT2xhZiBmaXhlZCBhIGxlZnRvdmVyIHByb2JsZW0gd2l0aCB0aGUgQ09OTkVDVCBmaXggb2YgaGlzIHRoYXQgd291bGQgbGVhdmUgYQogIHdyb25nIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGVycm9yIG1lc3NhZ2UgYnVmZmVyLgoKRGFuaWVsICgzIE5vdmVtYmVyIDIwMDYpCi0gT2xhZiBTdHVlYmVuIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBJIGVkaXRlZCBzbGlnaHRseS4gSXQgZml4ZXMgdGhlIG5vdG9yaW91cwogIEtOT1dOX0JVR1MgIzI1LCB3aGljaCBoYXBwZW5zIHdoZW4gYSBwcm94eSBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gd2hlbgogIGxpYmN1cmwgaGFzIHNlbnQgQ09OTkVDVCwgYXMgcGFydCBvZiBhbiBhdXRoZW50aWNhdGlvbiBuZWdvdGlhdGlvbi4gU3RhcnRpbmcKICBub3csIGxpYmN1cmwgd2lsbCByZS1jb25uZWN0IGFjY29yZGluZ2x5IGFuZCBjb250aW51ZSB0aGUgYXV0aGVudGljYXRpb24gYXMKICBpdCBzaG91bGQuCgpEYW5pZWwgKDIgTm92ZW1iZXIgMjAwNikKLSBKYW1lcyBIb3VzbGV5IGJyb3VnaHQgc3VwcG9ydCBmb3IgU0NQIHRyYW5zZmVycywgYmFzZWQgb24gdGhlIGxpYnNzaDIgbGlicmFyeQogIGZvciB0aGUgYWN0dWFsIG5ldHdvcmsgcHJvdG9jb2wgc3R1ZmYuCgogIEFkZGVkIHRoZXNlIG5ldyBjdXJsX2Vhc3lfc2V0b3B0KCkgb3B0aW9uczoKCiAgICBDVVJMT1BUX1NTSF9BVVRIX1RZUEVTCiAgICBDVVJMT1BUX1NTSF9QVUJMSUNfS0VZRklMRQogICAgQ1VSTE9QVF9TU0hfUFJJVkFURV9LRVlGSUxFCgpWZXJzaW9uIDcuMTYuMCAoMzAgT2N0b2JlciAyMDA2KQoKRGFuaWVsICgyNSBPY3RvYmVyIDIwMDYpCi0gRml4ZWQgQ1VSTE9QVF9GQUlMT05FUlJPUiB0byByZXR1cm4gQ1VSTEVfSFRUUF9SRVRVUk5FRF9FUlJPUiBldmVuIGZvciB0aGUKICBjYXNlIHdoZW4gNDAxIG9yIDQwNyBhcmUgcmV0dXJuZWQsICpJRiogbm8gYXV0aCBjcmVkZW50aWFscyBoYXZlIGJlZW4gZ2l2ZW4uCiAgVGhlIENVUkxPUFRfRkFJTE9ORVJST1Igb3B0aW9uIGlzIG5vdCBwb3NzaWJsZSB0byBtYWtlIGZvb2wtcHJvb2YgZm9yIDQwMQogIGFuZCA0MDcgY2FzZXMgd2hlbiBhdXRoIGNyZWRlbnRpYWxzIGlzIGdpdmVuLCBidXQgd2UndmUgbm93IGNvdmVyZWQgdGhpcwogIHNvbWV3aGF0IG1vcmUuCgogIFlvdSBtaWdodCBnZXQgc29tZSBhbW91bnRzIG9mIGhlYWRlcnMgdHJhbnNmZXJyZWQgYmVmb3JlIHRoaXMgc2l0dWF0aW9uIGlzCiAgZGV0ZWN0ZWQsIGxpa2UgZm9yIHdoZW4gYSAiMTAwLWNvbnRpbnVlIiBpcyByZWNlaXZlZCBhcyBhIHJlc3BvbnNlIHRvIGEKICBQT1NUL1BVVCBhbmQgYSA0MDEgb3IgNDA3IGlzIHJlY2VpdmVkIGltbWVkaWF0ZWx5IGFmdGVyd2FyZHMuCgogIEFkZGVkIHRlc3QgMjgxIHRvIHZlcmlmeSB0aGlzIGNoYW5nZS4KCkRhbmllbCAoMjMgT2N0b2JlciAyMDA2KQotIFJhdmkgUHJhdGFwIHByb3ZpZGVkIGEgbWFqb3IgdXBkYXRlIHdpdGggcGlwZWxpbmluZyBmaXhlcy4gV2UgYWxzbyBubyBsb25nZXIKICByZS11c2UgY29ubmVjdGlvbnMgKGZvciBwaXBlbGluaW5nKSBiZWZvcmUgdGhlIG5hbWUgcmVzb2x2aW5nIGlzIGRvbmUuCgpEYW5pZWwgKDIxIE9jdG9iZXIgMjAwNikKLSBOaXIgU29mZmVyIG1hZGUgdGhlIHRlc3RzL2xpYnRlc3QvTWFrZWZpbGUuYW0gdXNlIGEgcHJvcGVyIHZhcmlhYmxlIGZvciBhbGwKICB0aGUgc2luZ2xlIHRlc3QgYXBwbGljYXRpb25zJyBsaW5rIGFuZCBkZXBlbmRlbmNlcywgc28gdGhhdCB5b3UgZWFzaWVyIGNhbgogIG92ZXJyaWRlIHRob3NlIGZyb20gdGhlIGNvbW1hbmQgbGluZSB3aGVuIHVzaW5nIG1ha2UuCgotIEFybWVsIEFzc2VsaW4gc2VwYXJhdGVkIENBIGNlcnQgdmVyaWZpY2F0aW9uIHByb2JsZW1zIGZyb20gcHJvYmxlbXMgd2l0aAogIHJlYWRpbmcgdGhlIChsb2NhbCkgQ0EgY2VydCBmaWxlIHRvIGxldCB1c2VycyBlYXNpZXIgcGlucG9pbnQgdGhlIGFjdHVhbAogIHByb2JsZW0uIENVUkxFX1NTTF9DQUNFUlRfQkFERklMRSAoNzcpIGlzIHRoZSBuZXcgbGliY3VybCBlcnJvciBjb2RlLgoKRGFuaWVsICgxOCBPY3RvYmVyIDIwMDYpCi0gUmVtb3ZlZCB0aGUgInByb3RvY29sLWd1ZXNzaW5nIiBmb3IgVVJMcyB3aXRoIGhvc3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBGVFBTCiAgb3IgVEVMTkVUIHNpbmNlIHRoZXkgYXJlIHByYWN0aWNhbGx5IG5vbi1leGlzdGFudC4gVGhpcyBsZWF2ZXMgdXMgd2l0aCBvbmx5CiAgdGhyZWUgZGlmZmVyZW50IHByZWZpeGVzIHRoYXQgd291bGQgYXNzdW1lIHRoZSBwcm90b2NvbCBpcyBhbnl0aGluZyBidXQKICBIVFRQLCBhbmQgdGhleSBhcmUgaG9zdCBuYW1lcyBzdGFydGluZyB3aXRoICJmdHAuIiwgImRpY3QuIiBvciAibGRhcC4iLgoKRGFuaWVsICgxNyBPY3RvYmVyIDIwMDYpCi0gQnVnIHJlcG9ydCAjMTU3OTE3MSBwb2ludGVkIG91dCBjb2RlIGZsYXdzIGRldGVjdGVkIHdpdGggInByZWZhc3QiLCBhbmQgdGhleQogIHdlcmUgMSAtIGEgdG9vIHNtYWxsIG1lbW9yeSBjbGVhciB3aXRoIG1lbXNldCgpIGluIHRoZSB0aHJlYWRlZCByZXNvbHZlciBhbmQKICAyIC0gYSByYW5nZSBvZiBwb3RlbnRpYWxseSBiYWQgdXNlcyBvZiB0aGUgY3R5cGUgZmFtaWx5IG9mIGlzKigpIGZ1bmN0aW9ucwogIHN1Y2ggYXMgaXNkaWdpdCgpLCBpc2FsbnVtKCksIGlzcHJpbnQoKSBhbmQgbW9yZS4gVGhlIGxhdHRlciBtYWRlIG1lIHN3aXRjaAogIHRvIHVzaW5nIG91ciBvd24gc2V0IG9mIHRoZXNlIGZ1bmN0aW9ucy9tYWNyb3MgdXNpbmcgdXBwZXJjYXNlIGxldHRlcnMsIGFuZAogIHdpdGggc29tZSBleHRyYSBzZXQgb2YgY3JhenkgdHlwZWNhc3RzIHRvIGF2b2lkIG1pc3Rha2luZ2x5IHBhc3NpbmcgaW4KICBuZWdhdGl2ZSBudW1iZXJzIHRvIHRoZSB1bmRlcmx5aW5nIGlzKigpIGZ1bmN0aW9ucy4KCi0gV2l0aCBKZWZmIFBvaGxtZXllcidzIGhlbHAsIEkgZml4ZWQgdGhlIGV4cGlyZSB0aW1lciB3aGVuIHVzaW5nCiAgY3VybF9tdWx0aV9zb2NrZXQoKSBkdXJpbmcgbmFtZSByZXNvbHZlcyB3aXRoIGMtYXJlcyBhbmQgdGhlIExPV19TUEVFRAogIG9wdGlvbnMgbm93IHdvcmsgZmluZSB3aXRoIGN1cmxfbXVsdGlfc29ja2V0KCkgYXMgd2VsbC4KCkRhbmllbCAoMTYgT2N0b2JlciAyMDA2KQotIEFkZGVkIGEgY2hlY2sgaW4gY29uZmlndXJlIHRoYXQgc2ltcGx5IHRyaWVzIHRvIHJ1biBhIHByb2dyYW0gKG5vdCB3aGVuCiAgY3Jvc3MtY29tcGlsaW5nKSBpbiBvcmRlciB0byBkZXRlY3QgcHJvYmxlbXMgd2l0aCBydW4tdGltZSBsaWJyYXJpZXMgdGhhdAogIG90aGVyd2lzZSB3b3VsZCBvY2N1ciB3aGVuIHRoZSBzaXplb2YgdGVzdHMgZm9yIGN1cmxfb2ZmX3Qgd291bGQgcnVuIGFuZAogIHRodXMgYmUgbXVjaCBtb3JlIGNvbmZ1c2luZyB0byB1c2Vycy4gVGhlIGNoZWNrIG9mIGNvdXJzZSBzaG91bGQgcnVuIGFmdGVyCiAgYWxsIGxpYi1jaGVja3MgYXJlIGRvbmUgYW5kIGJlZm9yZSBhbnkgb3RoZXIgdGVzdCBpcyB1c2VkIHRoYXQgd291bGQgcnVuIGFuCiAgZXhlY3V0YWJsZSBidWlsdCBmb3IgdGVzdGluZy1wdXJwb3Nlcy4KCkRhbiBGICgxMyBPY3RvYmVyIDIwMDYpCi0gVGhlIHRhZ2dpbmcgb2YgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIFBPU1QgYm9keSBkYXRhIHNlbnQKICB0byB0aGUgQ1VSTE9QVF9ERUJVR0ZVTkNUSU9OIGNhbGxiYWNrIGhhcyBiZWVuIGZpeGVkIChpdCB3YXMgZXJyb25lb3VzbHkKICBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoZSBoZWFkZXIpLiAgQSBtZXNzYWdlIHdhcyBhbHNvIGFkZGVkIHRvIHRoZQogIGNvbW1hbmQgbGluZSB0b29sIHRvIHNob3cgd2hlbiBkYXRhIGlzIGJlaW5nIHNlbnQsIGVuYWJsZWQgd2hlbgogIC0tdmVyYm9zZSBpcyB1c2VkLgoKRGFuaWVsICgxMiBPY3RvYmVyIDIwMDYpCi0gU3RhcnRpbmcgbm93LCBhZGRpbmcgYW4gZWFzeSBoYW5kbGUgdG8gYSBtdWx0aSBzdGFjayB0aGF0IHdhcyBhbHJlYWR5IGFkZGVkCiAgdG8gYSBtdWx0aSBzdGFjayB3aWxsIGNhdXNlIENVUkxNX0JBRF9FQVNZX0hBTkRMRSB0byBnZXQgcmV0dXJuZWQuCgotIEplZmYgUG9obG1leWVyIGhhcyBiZWVuIHdvcmtpbmcgd2l0aCB0aGUgaGlwZXJmaWZvLmMgZXhhbXBsZSBzb3VyY2UgY29kZSwKICBhbmQgd2hpbGUgZG9pbmcgc28gaXQgYmVjYW1lIGFwcGFyZW50IHRoYXQgdGhlIGN1cnJlbnQgdGltZW91dCBzeXN0ZW0gZm9yCiAgdGhlIHNvY2tldCBBUEkgcmVhbGx5IHdhcyBhIGJpdCBhd2t3YXJkIHNpbmNlIGl0IGJlY29tZSBxdWl0ZSBzb21lIHdvcmsgdG8KICBiZSBzdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3QgdGltZW91dCBzZXQuCgogIEplZmYgdGhlbiBwcm92aWRlZCB0aGUgbmV3IENVUkxNT1BUX1RJTUVSRlVOQ1RJT04gdGhhdCBpcyB5ZXQgYW5vdGhlcgogIGNhbGxiYWNrIHRoZSBhcHAgY2FuIHNldCB0byBnZXQgdG8ga25vdyB3aGVuIHRoZSBnZW5lcmFsIHRpbWVvdXQgdGltZQogIGNoYW5nZXMgYW5kIHRodXMgZm9yIGFuIGFwcGxpY2F0aW9uIGxpa2UgaGlwZXJmaWZvLmMgaXQgbWFrZXMgZXZlcnl0aGluZyBhCiAgbG90IGVhc2llciBhbmQgbmljZXIuIFRoZXJlJ3MgYSBDVVJMTU9QVF9USU1FUkRBVEEgb3B0aW9uIHRvbyBvZiBjb3Vyc2UgaW4KICBnb29kIG9sZCBsaWJjdXJsIHRyYWRpdGlvbi4KCiAgSmVmZiBoYXMgYWxzbyB1cGRhdGVkIHRoZSBoaXBlcmZpZm8uYyBleGFtcGxlIGNvZGUgdG8gdXNlIHRoaXMgbmV3cy4KCkRhbmllbCAoOSBPY3RvYmVyIDIwMDYpCi0gQm9nZGFuIE5pY3VsYSdzIHNlY29uZCB0ZXN0IGNhc2UgKHBvc3RlZCBTdW4sIDA4IE9jdCAyMDA2KSBjb252ZXJ0ZWQgdG8gdGVzdAogIGNhc2UgNTM1IGFuZCBpdCBub3cgcnVucyBmaW5lLiBBZ2FpbiBhIHByb2JsZW0gd2l0aCB0aGUgcGlwZWxpbmluZyBjb2RlIG5vdAogIHRha2luZyBhbGwgcG9zc2libGUgKGVycm9yKSBjb25kaXRpb25zIGludG8gYWNjb3VudC4KCkRhbmllbCAoNiBPY3RvYmVyIDIwMDYpCi0gQm9nZGFuIE5pY3VsYSdzIGhhbmdpbmcgdGVzdCBjYXNlIChwb3N0ZWQgV2VkLCAwNCBPY3QgMjAwNikgd2FzIGNvbnZlcnRlZCB0bwogIHRlc3QgY2FzZSA1MzMgYW5kIHRoZSB0ZXN0IG5vdyBydW5zIGZpbmUuCgpEYW5pZWwgKDQgT2N0b2JlciAyMDA2KQotIERtaXRyaXkgU2VyZ2V5ZXYgcHJvdmlkZWQgYW4gZXhhbXBsZSBzb3VyY2UgY29kZSB0aGF0IGNyYXNoZWQgQ1ZTIGxpYmN1cmwKICBidXQgdGhhdCB3b3JrZWQgbmljZWx5IGluIDcuMTUuNS4gSSBjb252ZXJ0ZWQgaXQgaW50byB0ZXN0IGNhc2UgNTMyIGFuZAogIGZpeGVkIHRoZSBwcm9ibGVtLgoKRGFuaWVsICgyOSBTZXB0ZW1iZXIgMjAwNikKLSBSZW1vdmVkIGEgZmV3IG90aGVyIG5vLWxvbmdlciBwcmVzZW50IG9wdGlvbnMgZnJvbSB0aGUgaGVhZGVyIGZpbGUuCgotIFN1cHBvcnQgZm9yIEZUUCB0aGlyZCBwYXJ0eSB0cmFuc2ZlcnMgd2FzIHJlbW92ZWQuIEhlcmUncyB3aHk6CgogIG8gVGhlIHJlY2VudCBtdWx0aSBpbnRlcmZhY2UgY2hhbmdlcyBicm9rZSBpdCBhbmQgdGhlIGRlc2lnbiBvZiB0aGUgM3JkIHBhcnR5CiAgICB0cmFuc2ZlcnMgbWFkZSBpdCB2ZXJ5IGhhcmQgdG8gZml4IHRoZSBwcm9ibGVtcwogIG8gSXQgd2FzIHN0aWxsIGJsb2NraW5nIGFuZCB0aHVzIG5hc3R5IGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgbyBJdCB3YXMgYSBsb3Qgb2YgZXh0cmEgY29kZSBmb3IgYSB2ZXJ5IHJhcmVseSB1c2VkIGZlYXR1cmUKICBvIEl0IGRpZG4ndCB1c2UgdGhlIHNhbWUgY29kZSBhcyBmb3IgInBsYWluIiBGVFAgdHJhbnNmZXJzLCBzbyBpdCBkaWRuJ3Qgd29yawogICAgZmluZSBmb3IgSVB2NiBhbmQgaXQgZGlkbid0IHByb3Blcmx5IHJlLXVzZSBjb25uZWN0aW9ucyBhbmQgbW9yZQogIG8gVGhlcmUncyBub2JvZHkgYXJvdW5kIHdobydzIHdpbGxpbmcgdG8gd29yayBvbiBhbmQgaW1wcm92ZSB0aGUgZXhpc3RpbmcKICAgIGNvZGUKCiAgVGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgdGhpcmQgcGFydHkgdHJhbnNmZXJzIGFyZSBiYW5uZWQgZm9yZXZlciwgb25seSB0aGF0CiAgdGhleSBuZWVkIHRvIGJlIGRvbmUgYmV0dGVyIGlmIHRoZXkgYXJlIHRvIGJlIHJlLWFkZGVkIGluIHRoZSBmdXR1cmUuCgogIFRoZSBDVVJMT1BUX1NPVVJDRV8qIG9wdGlvbnMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgbGliIGFuZCBzbyBhcmUgdGhlIC0tM3AqCiAgb3B0aW9ucyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgdG9vbC4gRm9yIHRoaXMgcmVhc29uLCBJIGFsc28gYnVtcGVkIHRoZQogIHZlcnNpb24gaW5mbyBmb3IgdGhlIGxpYi4KCkRhbmllbCAoMjggU2VwdGVtYmVyIDIwMDYpCi0gUmVwb3J0ZWQgaW4gIzE1NjE0NzAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNTYxNDcwKSwgbGliY3VybAogIHdvdWxkIGNyYXNoIGlmIGEgYmFkIGZ1bmN0aW9uIHNlcXVlbmNlIHdhcyB1c2VkIHdoZW4gc2h1dHRpbmcgZG93biBhZnRlcgogIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UgKGkuZSB1c2luZyBlYXN5X2NsZWFudXAgYWZ0ZXIgbXVsdGlfY2xlYW51cCkgc28KICBwcmVjYXV0aW9ucyBoYXZlIGJlZW4gYWRkZWQgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYW55IG1vcmUgLSB0ZXN0IGNhc2UgNTI5CiAgd2FzIGFkZGVkIHRvIHZlcmlmeS4KCkRhbmllbCAoMjcgU2VwdGVtYmVyIDIwMDYpCi0gVGhlIFVSTCBpbiB0aGUgY29va2llIGphciBmaWxlIGlzIG5vdyBjaGFuZ2VkIHNpbmNlIGl0IHdhcyBnaXZpbmcgYSA0MDQuCiAgUmVwb3J0ZWQgYnkgVGltb3RoeSBTdG9uZS4gVGhlIG5ldyBVUkwgd2lsbCB0YWtlIHRoZSB2aXNpdG9yIHRvIGEgY3VybCB3ZWIKICBzaXRlIG1pcnJvciB3aXRoIHRoZSBkb2N1bWVudC4KCkRhbmllbCAoMjQgU2VwdGVtYmVyIDIwMDYpCi0gQmVybmFyZCBMZWFrIGZpeGVkIGNvbmZpZ3VyZSAtLXdpdGgtZ3NzYXBpLWxpYnMuCgotIENvcnkgTmVsc29uIG1hZGUgbGliY3VybCB1c2UgdGhlIFdTQVBvbGwoKSBmdW5jdGlvbiBpZiBidWlsdCBmb3IgV2luZG93cwogIFZpc3RhIChfV0lOMzJfV0lOTlQgPj0gMHgwNjAwKQoKRGFuaWVsICgyMyBTZXB0ZW1iZXIgMjAwNikKLSBNaWtlIFByb3R0cyBhZGRlZCAtLWZ0cC1zc2wtY29udHJvbCB0byBtYWtlIGN1cmwgdXNlIEZUUC1TU0wsIGJ1dCBvbmx5CiAgZW5jcnlwdCB0aGUgY29udHJvbCBjb25uZWN0aW9uIGFuZCB1c2UgdGhlIGRhdGEgY29ubmVjdGlvbiAicGxhaW4iLgoKLSBEbWl0cml5IFNlcmdleWV2IHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWRlIHRoZSBTT0NLU1s0NV0gY29kZSB3b3JrIGJldHRlcgogIGFzIGl0IG5vdyB3aWxsIHJlYWQgdGhlIGZ1bGwgZGF0YSBzZW50IGZyb20gc2VydmVycy4gVGhlIFNPQ0tTLXJlbGF0ZWQgY29kZQogIHdhcyBhbHNvIG1vdmVkIHRvIHRoZSBuZXcgbGliL3NvY2tzLmMgc291cmNlIGZpbGUuCgpEYW5pZWwgKDIxIFNlcHRlbWJlciAyMDA2KQotIEFkZGVkIHRlc3QgY2FzZSA1MzEgaW4gYW4gYXR0ZW1wdCB0byByZXBlYXQgYnVnIHJlcG9ydCAjMTU2MTQ3MAogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTU2MTQ3MCkgdGhhdCBpcyBzYWlkIHRvIGNyYXNoIHdoZW4gYW4KICBGVFAgdXBsb2FkIGZhaWxzIHdpdGggdGhlIG11bHRpIGludGVyZmFjZS4gSXQgZGlkIG5vdCwgYnV0IEkgbWFkZSBhIGZhaWxlZAogIHVwbG9hZCBzdGlsbCBhc3N1bWUgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiB0byBiZSBmaW5lLgoKRGFuaWVsICgyMCBTZXB0ZW1iZXIgMjAwNikKLSBBcm1lbCBBc3NlbGluIGZpeGVkIHByb2JsZW1zIHdoZW4geW91IGdhdmUgYSBwcm94eSBVUkwgd2l0aCB1c2VyIG5hbWUgYW5kCiAgZW1wdHkgcGFzc3dvcmQgb3Igbm8gcGFzc3dvcmQgYXQgYWxsLiBUZXN0IGNhc2UgMjc4IGFuZCAyNzkgd2VyZSBhZGRlZCB0bwogIHZlcmlmeS4KCkRhbmllbCAoMTIgU2VwdGVtYmVyIDIwMDYpCi0gQWRkZWQgZG9jcy9leGFtcGxlcy8xMC1hdC1hLXRpbWUuYyBieSBNaWNoYWVsIFdhbGxuZXIKCi0gQWRkZWQgZG9jcy9leGFtcGxlcy9oaXBlcmZpZm8uYyBieSBKZWZmIFBvaGxtZXllcgoKRGFuaWVsICgxMSBTZXB0ZW1iZXIgMjAwNikKLSBGaXhlZCBteSBicmVha2FnZSBmcm9tIGVhcmxpZXIgdG9kYXkgc28gdGhhdCBkb2luZyBjdXJsX2Vhc3lfY2xlYW51cCgpIG9uIGEKICBoYW5kbGUgdGhhdCBpcyBwYXJ0IG9mIGEgbXVsdGkgaGFuZGxlIGZpcnN0IHJlbW92ZXMgdGhlIGhhbmRsZSBmcm9tIHRoZQogIHN0YWNrLgoKLSBBZGRlZCBDVVJMT1BUX1NTTF9TRVNTSU9OSURfQ0FDSEUgYW5kIC0tbm8tc2Vzc2lvbmlkIHRvIGRpc2FibGUgU1NMCiAgc2Vzc2lvbi1JRCByZS11c2Ugb24gZGVtYW5kIHNpbmNlIHRoZXJlIG9idmlvdXNseSBhcmUgYnJva2VuIHNlcnZlcnMgb3V0CiAgdGhlcmUgdGhhdCBtaXNiZWhhdmUgd2l0aCBzZXNzaW9uLUlEcyB1c2VkLgoKLSBKZWZmIFBvaGxtZXllciBwcmVzZW50ZWQgYSAqbXVsdGlfc29ja2V0KCktdXNpbmcgcHJvZ3JhbSB0aGF0IGV4cG9zZWQgYQogIHByb2JsZW0gd2l0aCBpdCAoU0lHU0VHVi1zdHlsZSkuIEl0IGNsZWFybHkgc2hvd2VkIHRoYXQgdGhlIGV4aXN0aW5nCiAgc29ja2V0LXN0YXRlIGFuZCBzdGF0ZS1kaWZmZXJlbmNlIGZ1bmN0aW9uIHdhc24ndCBnb29kIGVub3VnaCBzbyBJIHJld3JvdGUKICBpdCBhbmQgY291bGQgdGhlbiByZS1ydW4gSmVmZidzIHByb2dyYW0gd2l0aG91dCBhbnkgY3Jhc2guIFRoZSBwcmV2aW91cwogIHZlcnNpb24gY2xlYXJseSBjb3VsZCBtaXNzIHRvIHRlbGwgdGhlIGFwcGxpY2F0aW9uIHdoZW4gYSBoYW5kbGUgY2hhbmdlZAogIGZyb20gdXNpbmcgb25lIHNvY2tldCB0byB1c2luZyBhbm90aGVyLgoKICBXaGlsZSBJIHdhcyBhdCBpdCAoYXMgSSBjb3VsZCB1c2UgdGhpcyBhcyBhIG1lYW5zIHRvIHRyYWNrIHRoaXMgcHJvYmxlbQogIGRvd24pLCBJJ3ZlIG5vdyBhZGRlZCBhICdtYWdpYycgbnVtYmVyIHRvIHRoZSBlYXN5IGhhbmRsZSBzdHJ1Y3QgdGhhdCBpcwogIGluaXRlZCBhdCBjdXJsX2Vhc3lfaW5pdCgpIHRpbWUgYW5kIGNsZWFyZWQgYXQgY3VybF9lYXN5X2NsZWFudXAoKSB0aW1lIHRoYXQKICB3ZSBjYW4gdXNlIGludGVybmFsbHkgdG8gZGV0ZWN0IHRoYXQgYW4gZWFzeSBoYW5kbGUgc2VlbXMgdG8gYmUgZmluZSwgb3IgYXQKICBsZWFzdCBub3QgY2xvc2VkIG9yIGZyZWVkIChmcmVlaW5nIGluIGRlYnVnIGJ1aWxkcyBmaWxsIHRoZSBhcmVhIHdpdGggMHgxMwogIGJ5dGVzIGJ1dCBpbiBub3JtYWwgYnVpbGRzIHdlIGNhbiBvZiBjb3Vyc2Ugbm90IGFzc3VtZSBhbnkgcGFydGljdWxhciBkYXRhCiAgaW4gdGhlIGZyZWVkIGFyZWFzKS4KCkRhbmllbCAoOSBTZXB0ZW1iZXIgMjAwNikKLSBNaWNoZWxlIEJpbmkgZml4ZWQgaG93IHRoZSBob3N0bmFtZSBpcyBwdXQgaW4gTlRMTSBwYWNrYWdlcy4gQXMgc2VydmVycwogIGRvbid0IGV4cGVjdCBmdWxseSBxdWFsaWZpZWQgbmFtZXMgd2UgbmVlZCB0byBjdXQgdGhlbSBvZmYgYXQgdGhlIGZpcnN0IGRvdC4KCi0gUGV0ZXIgU3lsdmVzdGVyIGNsZWFuZWQgdXAgYW5kIGZpeGVkIHRoZSBnZXRzb2NrbmFtZSgpIHVzZXMgaW4gZnRwLmMuIFNvbWUKICBvZiB0aGVtIGNhbiBiZSBjb21wbGV0ZXRseSByZW1vdmVkIHRob3VnaC4uLgoKRGFuaWVsICg2IFNlcHRlbWJlciAyMDA2KQotIFJhdmkgUHJhdGFwIGFuZCBJIGhhdmUgaW1wbGVtZW50ZWQgSFRUUCBQaXBlbGluaW5nIHN1cHBvcnQuIEVuYWJsZSBpdCBmb3IgYQogIG11bHRpIGhhbmRsZSB1c2luZyBDVVJMTU9QVF9QSVBFTElOSU5HIGFuZCBhbGwgSFRUUCBjb25uZWN0aW9ucyBkb25lIG9uIHRoYXQKICBoYW5kbGUgd2lsbCBiZSBhdHRlbXB0ZWQgdG8gZ2V0IHBpcGVsaW5lZCBpbnN0ZWFkIG9mIGRvbmUgaW4gcGFyYWxsZWxsIGFzCiAgdGhleSBhcmUgcGVyZm9ybWVkIG90aGVyd2lzZS4KCiAgQXMgYSBzaWRlLWVmZmVjdCBmcm9tIHRoaXMgd29yaywgY29ubmVjdGlvbnMgYXJlIG5vdyBzaGFyZWQgYmV0d2VlbiBhbGwgZWFzeQogIGhhbmRsZXMgd2l0aGluIGEgbXVsdGkgaGFuZGxlLCBzbyBpZiB5b3UgdXNlIE4gZWFzeSBoYW5kbGVzIGZvciB0cmFuc2ZlcnMsCiAgZWFjaCBvZiB0aGVtIGNhbiBwaWNrIHVwIGFuZCByZS11c2UgYSBjb25uZWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgdXNlZCBieQogIGFueSBvZiB0aGUgaGFuZGxlcywgYmUgaXQgdGhlIHNhbWUgb3Igb25lIG9mIHRoZSBvdGhlcnMuCgogIFRoaXMgc2VwYXJhdGlvbiBvZiB0aGUgdGlnaHQgcmVsYXRpb25zaGlwIGJldHdlZW4gY29ubmVjdGlvbnMgYW5kIGVhc3kKICBoYW5kbGVzIGlzIG1vc3Qgbm90aWNhYmxlIHdoZW4geW91IGNsb3NlIGVhc3kgaGFuZGxlcyB0aGF0IGhhdmUgYmVlbiB1c2VkIGluCiAgYSBtdWx0aSBoYW5kbGUgYW5kIGNoZWNrIGFtb3VudCBvZiB1c2VkIG1lbW9yeSBvciB3YXRjaCB0aGUgZGVidWcgb3V0cHV0LCBhcwogIHRoZXJlIGFyZSB0aW1lcyB3aGVuIGxpYmN1cmwgd2lsbCBrZWVwIHRoZSBlYXN5IGhhbmRsZSBhcm91bmQgZm9yIGEgd2hpbGUKICBsb25nZXIgdG8gYmUgYWJsZSB0byBjbG9zZSBpdCBwcm9wZXJseS4gTGlrZSBmb3Igc2VuZGluZyBRVUlUIHRvIGNsb3NlIGRvd24KICBhbiBGVFAgY29ubmVjdGlvbi4KCiAgVGhpcyBpcyBhIG1ham9yIGNoYW5nZS4KCkRhbmllbCAoNCBTZXB0ZW1iZXIgMjAwNikKLSBEbWl0cnkgUmVjaGtpbiAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1NTE0MTIpIHByb3ZpZGVkIGEKICBwYXRjaCB0aGF0IHdoaWxlIG5vdCBmaXhpbmcgdGhpbmdzIHZlcnkgbmljZWx5LCBpdCBkb2VzIG1ha2UgdGhlIFNPQ0tTNQogIHByb3h5IGNvbm5lY3Rpb24gc2xpZ2h0bHkgYmV0dGVyIGFzIGl0IG5vdyBhY2tub3dsZWRnZXMgdGhlIHRpbWVvdXQgZm9yCiAgY29ubmVjdGlvbiBhbmQgaXQgbm8gbG9uZ2VyIHNlZ2ZhdWx0cyBpbiB0aGUgY2FzZSB3aGVuIFNPQ0tTIHJlcXVpcmVzCiAgYXV0aGVudGljYXRpb24gYW5kIHlvdSBkaWQgbm90IHNwZWNpZnkgdXNlcm5hbWU6cGFzc3dvcmQuCgpEYW5pZWwgKDMxIEF1Z3VzdCAyMDA2KQotIERtaXRyaXkgU2VyZ2V5ZXYgZm91bmQgYW5kIGZpeGVkIGEgbXVsdGkgaW50ZXJmYWNlIGZsYXcgd2hlbiB1c2luZyBhc3luY2gKICBuYW1lIHJlc29sdmVzLiBJdCBjb3VsZCBnZXQgc3R1Y2sgaW4gdGhlIHdyb25nIHN0YXRlLgoKR2lzbGUgKDI5IEF1Z3VzdCAyMDA2KQotIEFkZGVkIHN1cHBvcnQgZm9yIG90aGVyIE1TLURPUyBjb21waWxlcnMgKGRlc2lkZXMgZGpncHApLiBBbGwgTVMtRE9TCiAgY29tcGlsZXIgbm93IHVzZXMgdGhlIHNhbWUgY29uZmlnLmRvcyBmaWxlIChyZW5hbWVkIHRvIGNvbmZpZy5oIGJ5CiAgbWFrZSkuIGxpYmN1cmwgbm93IGJ1aWxkcyBmaW5lIHVzaW5nIFdhdGNvbSBhbmQgTWV0YXdhcmUncyBIaWdoLUMKICB1c2luZyB0aGUgV2F0dC0zMiB0Y3AvaXAtc3RhY2suCgpEYW5pZWwgKDI5IEF1Z3VzdCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGFkZGVkIENVUkxPUFRfU09DS09QVEZVTkNUSU9OIGFuZCBDVVJMT1BUX1NPQ0tPUFREQVRBIHRvCiAgYWxsb3cgYXBwbGljYXRpb25zIHRvIHNldCB0aGVpciBvd24gc29ja2V0IG9wdGlvbnMuCgpEYW5pZWwgKDI1IEF1Z3VzdCAyMDA2KQotIEFybWVsIEFzc2VsaW4gcmVwb3J0ZWQgdGhhdCB0aGUgJ3J1bm5pbmdfaGFuZGxlcycgY291bnRlciB3YXNuJ3QgdXBkYXRlZAogIHByb3Blcmx5IGlmIHlvdSByZW1vdmVkIGEgImxpdmUiIGhhbmRsZSBmcm9tIGEgbXVsdGkgaGFuZGxlIHdpdGgKICBjdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoKS4KCkRhbmllbCAoMjIgQXVndXN0IDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQgYSByZW1haW5pbmcgbWlzdGFrZSBmcm9tIHRoZSBBdWd1c3QgMTkgVFlQRSBjaGFuZ2UuCgotIFBldGVyIFN5bHZlc3RlciBwb2ludGVkIG91dCBhIGZsYXcgaW4gdGhlIEFsbG93U2VydmVyQ29ubmVjdCgpIGluIHRoZSBGVFAKICBjb2RlIHdoZW4gZG9pbmcgcHVyZSBJUHY2IEVQUlQgY29ubmVjdGlvbnMuCgpEYW5pZWwgKDE5IEF1Z3VzdCAyMDA2KQotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgQXJtZWwgQXNzZWxpbiwgdGhlIEZUUCBjb2RlIG5vIGxvbmdlciByZS1pc3N1ZXMgdGhlIFRZUEUKICBjb21tYW5kIG9uIHN1YnNlcXVlbnQgcmVxdWVzdHMgb24gYSByZS11c2VkIGNvbm5lY3Rpb24gdW5sZXNzIGl0IGhhcyB0by4KCi0gQXJtZWwgQXNzZWxpbiBmaXhlZCBhIGNyYXNoIGluIHRoZSBGVFAgY29kZSB3aGVuIHVzaW5nIFNJTkdMRUNXRCBtb2RlIGFuZAogIGZpbGVzIGluIHRoZSByb290IGRpcmVjdG9yeS4KCi0gQW5kcmV3IEJpZ2dzIHBvaW50ZWQgb3V0IGEgIkV4cGVjdDogMTAwLWNvbnRpbnVlIiBmbGF3IHdoZXJlIGxpYmN1cmwgZGlkbid0CiAgc2VuZCB0aGUgd2hvbGUgcmVxdWVzdCBhdCBvbmNlLCBldmVuIHRob3VnaCB0aGUgRXhwZWN0OiBoZWFkZXIgd2FzIGRpc2FibGVkCiAgYnkgdGhlIGFwcGxpY2F0aW9uLiBBbiBlZmZlY3Qgb2YgdGhpcyBjaGFuZ2UgaXMgYWxzbyB0aGF0IHNtYWxsICg8IDEwMjQKICBieXRlcykgUE9TVHMgYXJlIG5vdyBhbHdheXMgc2VudCB3aXRob3V0IEV4cGVjdDogaGVhZGVyIHNpbmNlIHdlIGRlZW0gaXQKICBtb3JlIGNvc3RseSB0byBib3RoZXIgYWJvdXQgdGhhdCB0aGFuIHRoZSByaXNrIHRoYXQgd2Ugc2VuZCB0aGUgZGF0YSBpbgogIHZhaW4uCgpEYW5pZWwgKDkgQXVndXN0IDIwMDYpCi0gQXJtZWwgQXNzZWxpbiBtYWRlIHRoZSBDVVJMT1BUX1BSRVFVT1RFIG9wdGlvbiB3b3JrIGZpbmUgZXZlbiB3aGVuCiAgQ1VSTE9QVF9OT0JPRFkgaXMgc2V0IHRydWUuIFBSRVFVT1RFIGlzIHRoZW4gcnVuIHJvdWdobHkgYXQgdGhlIHNhbWUgcGxhY2UKICBpbiB0aGUgY29tbWFuZCBzZXF1ZW5jZSBhcyBpdCB3b3VsZCBoYXZlIHJ1biBpZiB0aGVyZSB3b3VsZCd2ZSBiZWVuIGEKICB0cmFuc2Zlci4KCkRhbmllbCAoOCBBdWd1c3QgMjAwNikKLSBGaXhlZCBhIGZsYXcgaW4gdGhlICJFeHBlY3Q6IDEwMC1jb250aW51ZSIgdHJlYXRtZW50LiBJZiB5b3UgZGlkIHR3byBQT1NUcwogIG9uIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uIGFuZCBhbGxvd2VkIHRoZSBmaXJzdCB0byB1c2UgdGhhdCBoZWFkZXIsIHlvdQogIGNvdWxkIG5vdCBkaXNhYmxlIGl0IGZvciB0aGUgc2Vjb25kIHJlcXVlc3QuCgpEYW5pZWwgKDcgQXVndXN0IDIwMDYpCi0gRG9tZW5pY28gQW5kcmVvbGZvdW5kIGEgcXVpY2sgYnVpbGQgZXJyb3Igd2hpY2ggaGFwcGVuZWQgYmVjYXVzZQogIHNyYy9jb25maWcuaC5pbiB3YXMgbm90IGEgcHJvcGVyIGR1cGxjYXRlIG9mIGxpYi9jb25maWcuaC5pbiB3aGljaCBpdAogIHNob3VsZCd2ZSBiZWVuIGFuZCB0aGlzIHdhcyBkdWUgdG8gdGhlIG1ha2V0Z3ogc2NyaXB0IG5vdCBkb2luZyB0aGUgY3AKICBwcm9wZXJseS4KClZlcnNpb24gNy4xNS41ICg3IEF1Z3VzdCAyMDA2KQoKRGFuaWVsICgyIEF1Z3VzdCAyMDA2KQotIE1hcmsgTGVudGN6bmVyIGZpeGVkIGhvdyBsaWJjdXJsIHdhcyBub3QgcHJvcGVybHkgZG9pbmcgY2h1bmtlZCBlbmNvZGluZwogIGlmIHRoZSBoZWFkZXIgIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIiB3YXMgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbi4KICBodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTUzMTgzOAoKRGFuaWVsICgxIEF1Z3VzdCAyMDA2KQotIE1hY2llaiBLYXJwaXVrIGZpeGVkIGEgY3Jhc2ggdGhhdCB3b3VsZCBvY2N1ciBpZiB3ZSBwYXNzZWQgQ3VybF9zdHJlcnJvcigpCiAgYW4gdW5rbm93biBlcnJvciBudW1iZXIgb24gZ2xpYmMgc3lzdGVtcy4KICBodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTUzMjI4OQoKRGFuaWVsICgzMSBKdWx5IDIwMDYpCi0gKkFMRVJUKiBjdXJsX211bHRpX3NvY2tldCgpIGFuZCBjdXJsX211bHRpX3NvY2tldF9hbGwoKSBnb3QgbW9kaWZpZWQKICBwcm90b3R5cGVzOiB0aGV5IGJvdGggbm93IHByb3ZpZGUgdGhlIG51bWJlciBvZiBydW5uaW5nIGhhbmRsZXMgYmFjayB0byB0aGUKICBjYWxsaW5nIGZ1bmN0aW9uLiBJdCBtYWtlcyB0aGUgZnVuY3Rpb25zIHJlc2VtYmxlIHRoZSBnb29kIG9sZAogIGN1cmxfbXVsdGlfcGVyZm9ybSgpIG1vcmUgYW5kIHByb3ZpZGVzIGEgbmljZSB3YXkgdG8ga25vdyB3aGVuIHRoZSBtdWx0aQogIGhhbmRsZSBnb2VzIGVtcHR5LgoKICBBTEVSVDI6IGRvbid0IHVzZSB0aGUgY3VybF9tdWx0aV9zb2NrZXQqKCkgZnVuY3Rpb25hbGl0eSBpbiBhbnl0aGluZwogIHByb2R1Y3Rpb24tbGlrZSB1bnRpbCBJIHNheSBpdCdzIHNvbWV3aGF0IHNldHRsZWQsIGFzIEkgc3VzcGVjdCB0aGVyZSBtaWdodAogIGJlIHNvbWUgZnVydGhlciBBUEkgY2hhbmdlcyBiZWZvcmUgSSdtIGRvbmUuLi4KCkRhbmllbCAoMjggSnVseSAyMDA2KQotIFl2ZXMgTGVqZXVuZSBmaXhlZCBzbyB0aGF0IHJlcGxhY2luZyBDb250ZW50LVR5cGU6IHdoZW4gZG9pbmcgbXVsdGlwYXJ0CiAgZm9ybXBvc3RzIHdvcmsgZXhhY3RseSB0aGUgd2F5IHlvdSB3YW50IGl0IChhbmQgdGhlIHdheSB5b3UnZCBhc3N1bWUgaXQKICB3b3JrcykuCgpEYW5pZWwgKDI3IEp1bHkgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBhZGRlZCAtLWZ0cC1zc2wtcmVxZCB3aGljaCBtYWtlcyBjdXJsICpyZXF1aXJlKiBTU0wgZm9yIGJvdGgKICBjb250cm9sIGFuZCBkYXRhIGNvbm5lY3Rpb24sIGFzIHRoZSBleGlzdGluZyAtLWZ0cC1zc2wgb3B0aW9uIG9ubHkgcmVxdWVzdHMKICBpdC4KCi0gW0hpcGVyLXJlbGF0ZWQgd29ya10gQWRkZWQgYSBmdW5jdGlvbiBjYWxsZWQgY3VybF9tdWx0aV9hc3NpZ24oKSB0aGF0IHdpbGwKICBzZXQgYSBwcml2YXRlIHBvaW50ZXIgYWRkZWQgdG8gdGhlIGludGVybmFsIGxpYmN1cmwgaGFzaCB0YWJsZSBmb3IgdGhlCiAgcGFydGljdWxhciBzb2NrZXQgcGFzc2VkIGluIHRvIHRoaXMgZnVuY3Rpb246CgogIENVUkxNY29kZSBjdXJsX211bHRpX2Fzc2lnbihDVVJMTSAqbXVsdGlfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX3NvY2tldF90IHNvY2tmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqc29ja3ApOwoKICAnc29ja3AnIGJlaW5nIGEgY3VzdG9tIHBvaW50ZXIgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBiZSBhc3NvY2lhdGVkIHdpdGgKICB0aGlzIHNvY2tldC4gVGhlIHNvY2tldCBoYXMgdG8gYmUgYWxyZWFkeSBleGlzdGluZyBhbmQgaW4tdXNlIGJ5IGxpYmN1cmwsCiAgbGlrZSBoYXZpbmcgYWxyZWFkeSBjYWxsZWQgdGhlIGNhbGxiYWNrIHRlbGxpbmcgYWJvdXQgaXRzIGV4aXN0YW5jZS4KCiAgVGhlIHNldCBoYXNocCBwb2ludGVyIHdpbGwgdGhlbiBiZSBwYXNzZWQgb24gdG8gdGhlIGNhbGxiYWNrIGluIHVwY29taW5nCiAgY2FsbHMgd2hlbiB0aGlzIHNhbWUgc29ja2V0IGlzIHVzZWQgKGluIHRoZSBicmFuZCBuZXcgJ3NvY2tldHAnIGFyZ3VtZW50KS4KCkRhbmllbCAoMjYgSnVseSAyMDA2KQotIERhbiBOZWxzb24gYWRkZWQgdGhlIENVUkxPUFRfRlRQX0FMVEVSTkFUSVZFX1RPX1VTRVIgbGliY3VybCBvcHRpb24gYW5kIGN1cmwKICB0b29sIG9wdGlvbiBuYW1lZCAtLWZ0cC1hbHRlcm5hdGl2ZS10by11c2VyLiBJdCBwcm92aWRlcyBhIG1lYW4gdG8gc2VuZCBhCiAgcGFydGljdWxhciBjb21tYW5kIGlmIHRoZSBub3JtYWwgVVNFUi9QQVNTIGFwcHJvYWNoIGZhaWxzLgoKLSBNaWNoYWVsIEplcnJpcyBhZGRlZCBtYWdpYyB0aGF0IGJ1aWxkcyBsaWIvY3VybGxpYi52Y3Byb2ogYXV0b21hdGljYWxseSBmb3IKICBuZXdlciBNU1ZDLgoKRGFuaWVsICgyNSBKdWx5IDIwMDYpCi0gR2VvcmcgSG9ybiBtYWRlIHRoZSB0cmFuc2ZlciB0aW1lb3V0IGVycm9yIG1lc3NhZ2UgaW5jbHVkZSBtb3JlIGRldGFpbHMuCgpEYW5pZWwgKDIwIEp1bHkgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCBhIGJ1aWxkIGVycm9yIHdoZW4gYnVpbGRpbmcgbGliY3VybCB3aXRoIEhUVFAgZGlzYWJsZWQsCiAgcHJvYmxlbSBhZGRlZCB3aXRoIHRoZSBjdXJsX2Zvcm1nZXQoKSBwYXRjaC4KCkRhbmllbCAoMTcgSnVseSAyMDA2KQotIEphcmkgU3VuZGVsbCBkaWQgc29tZSBleGNlbGxlbnQgcmVzZWFyY2ggYW5kIGJ1ZyB0cmFja2luZywgZmlndXJlZCBvdXQgdGhhdAogIHdlIGRpZCB3cm9uZyBhbmQgcGF0Y2hlZCBpdDogV2hlbiBub2RlcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgc3BsYXkgdHJlZSwKICBhbmQgd2UgZGlkbid0IHByb3Blcmx5IHJlbW92ZSBpdCBmcm9tIHRoZSBzcGxheSB0cmVlIHdoZW4gYW4gZWFzeSBoYW5kbGUgd2FzCiAgcmVtb3ZlZCBmcm9tIGEgbXVsdGkgc3RhY2sgYW5kIHRodXMgd2UgY291bGQgd3JvbmdseSBsZWF2ZSBhIG5vZGUgaW4gdGhlCiAgc3BsYXkgdHJlZSBwb2ludGluZyB0byAoYmFkKSBtZW1vcnkuCgpEYW5pZWwgKDE0IEp1bHkgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCBhIGZsYXcgd2hlcmUgdGhlIENSTEYgY291bnRlciB3YXNuJ3QgcHJvcGVybHkgY2xlYXJlZAogIGZvciBGVFAgQVNDSUkgdHJhbnNmZXJzLgoKRGFuaWVsICg4IEp1bHkgMjAwNikKLSBBdGVzIEdvcmFsIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCdzIGNvb2tpZSBwYXJzZXIgZGlkIGNhc2UgaW5zZW5zaXRpdmUKICBzdHJpbmcgY29tcGFyaXNvbnMgb24gdGhlIHBhdGggd2hpY2ggaXMgaW5jb3JyZWN0IGFuZCBwcm92aWRlZCBhIHBhdGNoIHRoYXQKICBmaXhlcyB0aGlzLiBJIGVkaXRlZCB0ZXN0IGNhc2UgOCB0byBpbmNsdWRlIGRldGFpbHMgdGhhdCB0ZXN0IGZvciB0aGlzLgoKLSBJbmdtYXIgUnVuZ2UgcHJvdmlkZWQgYSBzb3VyY2Ugc25pcHBldCB0aGF0IGNhdXNlZCBhIGNyYXNoLiBUaGUgcmVhc29uIGZvcgogIHRoZSBjcmFzaCB3YXMgdGhhdCBsaWJjdXJsIGludGVybmFsbHkgd2FzIGEgYml0IGNvbmZ1c2VkIGFib3V0IHdobyBvd25lZCB0aGUKICBETlMgY2FjaGUgYXQgYWxsIHRpbWVzIHNvIGlmIHlvdSBjcmVhdGVkIGFuIGVhc3kgaGFuZGxlIHRoYXQgdXNlcyBhIHNoYXJlZAogIEROUyBjYWNoZSBhbmQgYWRkZWQgdGhhdCB0byBhIG11bHRpIGhhbmRsZSBpdCB3b3VsZCBjcmFzaC4gTm93IHdlIGtlZXAgbW9yZQogIGNhcmVmdWwgaW50ZXJuYWwgdHJhY2sgb2YgZXhhY3RseSB3aGF0IGtpbmQgb2YgRE5TIGNhY2hlIGVhY2ggZWFzeSBoYW5kbGUKICB1c2VzOiBOb25lLCBQcml2YXRlIChhbGxvY2F0ZWQgZm9yIGFuZCB1c2VkIG9ubHkgYnkgdGhpcyBzaW5nbGUgaGFuZGxlKSwKICBTaGFyZWQgKHBvaW50cyB0byBhIGNhY2hlIGhlbGQgYnkgYSBzaGFyZWQgb2JqZWN0KSwgR2xvYmFsIChwb2ludHMgdG8gdGhlCiAgZ2xvYmFsIGNhY2hlKSBvciBNdWx0aSAocG9pbnRzIHRvIHRoZSBjYWNoZSB3aXRoaW4gdGhlIG11bHRpIGhhbmRsZSB0aGF0IGlzCiAgYXV0b21hdGljYWxseSBzaGFyZWQgYmV0d2VlbiBhbGwgZWFzeSBoYW5kbGVzIHRoYXQgYXJlIGFkZGVkIHdpdGggcHJpdmF0ZQogIGNhY2hlcykuCgpEYW5pZWwgKDQgSnVseSAyMDA2KQotIFRvc2hpeXVraSBNYWV6YXdhIGZpeGVkIGEgcHJvYmxlbSB3aGVyZSB5b3UgY291bGRuJ3Qgb3ZlcnJpZGUgdGhlCiAgUHJveHktQ29ubmVjdGlvbjogaGVhZGVyIHdoZW4gdXNpbmcgYSBwcm94eSBhbmQgbm90IGRvaW5nIENPTk5FQ1QuCgpEYW5pZWwgKDI0IEp1bmUgMjAwNikKLSBNaWNoYWVsIFdhbGxuZXIgYWRkZWQgY3VybF9mb3JtZ2V0KCksIHdoaWNoIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBleHRyYWN0CiAgKHNlcmlhbGlzZSkgYSBwcmV2aW91c2x5IGJ1aWx0IGZvcm1wb3N0IChhcyB3aXRoIGN1cmxfZm9ybWFkZCgpKS4KCkRhbmllbCAoMjMgSnVuZSAyMDA2KQotIEFydmUgS251ZHNlbiBmb3VuZCBhIGZsYXcgaW4gY3VybF9tdWx0aV9mZHNldCgpIGZvciBzeXN0ZW1zIHdoZXJlCiAgY3VybF9zb2NrZXRfdCBpcyB1bnNpZ25lZCAobGlrZSBXaW5kb3dzKSB0aGF0IGNvdWxkIGNhdXNlIGl0IHRvIHdyb25nbHkKICByZXR1cm4gYSBtYXggZmQgb2YgLTEuCgpEYW5pZWwgKDIwIEp1bmUgMjAwNikKLSBQZXRlciBTaWx2YSBpbnRyb2R1Y2VkIENVUkxPUFRfTUFYX1NFTkRfU1BFRURfTEFSR0UgYW5kCiAgQ1VSTE9QVF9NQVhfUkVDVl9TUEVFRF9MQVJHRSB0aGF0IGxpbWl0IHRoYSBtYXhpbXVtIHJhdGUgbGliY3VybCBpcyBhbGxvd2VkCiAgdG8gc2VuZCBvciByZWNlaXZlIGRhdGEuIFRoaXMga2luZCBvZiBhZGRzIHRoZSB0aGUgY29tbWFuZCBsaW5lIHRvb2wncwogIG9wdGlvbiAtLWxpbWl0LXJhdGUgdG8gdGhlIGxpYnJhcnkuCgogIFRoZSByYXRlIGxpbWl0aW5nIGxvZ2ljIGluIHRoZSBjdXJsIGFwcCBpcyBub3cgcmVtb3ZlZCBhbmQgaXMgaW5zdGVhZAogIHByb3ZpZGVkIGJ5IGxpYmN1cmwgaXRzZWxmLiBUcmFuc2ZlciByYXRlIGxpbWl0aW5nIHdpbGwgbm93IGFsc28gd29yayBmb3IgLWQKICBhbmQgLUYsIHdoaWNoIGl0IGRpZG4ndCBiZWZvcmUuCgpEYW5pZWwgKDE5IEp1bmUgMjAwNikKLSBNYWRlIC1LIG9uIGEgZmlsZSB0aGF0IGNvdWxkbid0IGJlIHJlYWQgY2F1c2UgYSB3YXJuaW5nIHRvIGJlIGRpc3BsYXllZC4KCkRhbmllbCAoMTMgSnVuZSAyMDA2KQotIERhbiBGYW5kcmljaCBpbXBsZW1lbnRlZCAtLWVuYWJsZS1oaWRkZW4tc3ltYm9scyBjb25maWd1cmUgb3B0aW9uIHRvIGVuYWJsZQogIC1mdmlzaWJpbGl0eT1oaWRkZW4gb24gZ2NjID49IDQuMC4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgbGliY3VybAogIGJpbmFyeSBhbmQgc3BlZWRzIHVwIGR5bmFtaWMgbGlua2luZyBieSBoaWRpbmcgYWxsIHRoZSBpbnRlcm5hbCBzeW1ib2xzIGZyb20KICB0aGUgc3ltYm9sIHRhYmxlLgoKVmVyc2lvbiA3LjE1LjQgKDEyIEp1bmUgMjAwNikKCkRhbmllbCAoOCBKdW5lIDIwMDYpCi0gQnJpYW4gRGVzc2VudCBmaXhlZCB0aGUgY29kZSBmb3IgY3lnd2luIGluIHRocmVlIGRpc3RpbmN0IHdheXM6CgogIFRoZSBmaXJzdCBtb2RpZmllcyB7bGliLHNyY30vc2V0dXAuaCB0byBub3QgaW5jbHVkZSB0aGUgd2luc29jayBoZWFkZXJzCiAgdW5kZXIgQ3lnd2luLiAgVGhpcyBmaXhlcyB0aGUgcmVwb3J0ZWQgYnVpbGQgcHJvYmxlbS4gIEN5Z3dpbiBhdHRlbXB0cyBhcwogIG11Y2ggYXMgcG9zc2libGUgdG8gZW11bGF0ZSBhIHBvc2l4IGVudmlyb25tZW50IHVuZGVyIFdpbmRvd3MuICBUaGlzIG1lYW5zCiAgdGhhdCBXSU4zMiBpcyAqbm90KiAjZGVmaW5lZCBhbmQgKHRvIHRoZSBleHRlbnQgcG9zc2libGUpIGV2ZXJ5dGhpbmcgaXMgZG9uZQogIGFzIGl0IHdvdWxkIGJlIG9uIGEgKml4IHR5cGUgc3lzdGVtLiAgVGh1cyA8c3lzL3NvY2tldC5oPiBpcyB0aGUgcHJvcGVyCiAgaW5jbHVkZSwgYW5kIGV2ZW4gdGhvdWdoIHdpbnNvY2syLmggaXMgcHJlc2VudCwgaW5jbHVkaW5nIGl0IGp1c3QgaW50cm9kdWNlcwogIGEgd2hvbGUgYnVuY2ggb2YgaW5jb21wYXRpYmxlIHNvY2tldCBBUEkgc3R1ZmYuCgogIFRoZSBzZWNvbmQgaXMgYSBwYXRjaCBJJ3ZlIGluY2x1ZGVkIGluIHRoZSBDeWd3aW4gYmluYXJ5IHBhY2thZ2VzIGZvciBhCiAgd2hpbGUuICBJdCBza2lwcyB0d28gdW5uZWNlc3NhcnkgbGlicmFyeSBjaGVja3MgKC1sd2lubW0gYW5kIC1sZ2RpMzIpLiAgVGhlCiAgY2hlY2tzIGFyZSBpbm5vY3VvdXMgYW5kIHRoZXkgZG8gc3VjY2VlZCwgYnV0IHRoZXkgcG9sbHV0ZSBMSUJTIHdpdGgKICB1bm5lY2Vzc2FyeSBzdHVmZiB3aGljaCBnZXRzIHJlY29yZGVkIGFzIHN1Y2ggaW4gdGhlIGxpYmN1cmwubGEgZmlsZSwgd2hpY2gKICBicmluZ3MgdGhlbSBpbnRvIHRoZSBidWlsZCBvZiBhbnkgbGliY3VybC1kb3duc3RyZWFtLiAgQXMgZmFyIGFzIEkga25vdwogIHRoZXNlIGxpYnMgYXJlIHJlYWxseSBvbmx5IG5lY2Vzc2FyeSBmb3IgbWluZ3csIHNvIGFsdGVybmF0aXZlbHkgdGhleSBjb3VsZAogIGJlIGRlc2lnbmVkIHRvIG9ubHkgcnVuIGlmICRob3N0IG1hdGNoZXMgKi0qLW1pbmd3KiBidXQgSSB0b29rIHRoZSBzYWZlcgogIHJvdXRlIG9mIHNraXBwaW5nIHRoZW0gZm9yICotKi1jeWd3aW4qLgoKICBUaGUgdGhpcmQgcGF0Y2ggcmVwbGFjZXMgYWxsIHVzZXMgb2YgdGhlIGFuY2llbnQgYW5kIG9ic29sZXRlIF9fQ1lHV0lOMzJfXwogIHdpdGggX19DWUdXSU5fXy4gUmVmOiA8aHR0cHM6Ly9jeWd3aW4uY29tL21sL2N5Z3dpbi8yMDAzLTA5L21zZzAxNTIwLmh0bWw+LgoKRGFuaWVsICg3IEp1bmUgMjAwNikKLSBNaWthZWwgU2VubmVyaG9sbSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgYWRkZWQgTlRMTTIgc2Vzc2lvbiByZXNwb25zZSBzdXBwb3J0CiAgdG8gbGliY3VybC4gVGhlIDIxIE5UTE0gdGVzdCBjYXNlcyB3ZXJlIGFnYWluIG1vZGlmaWVkIHRvIGNvbXBseS4uLgoKRGFuaWVsICgyNyBNYXkgMjAwNikKLSDTc2NhciBNb3JhbGVzIFZpdvMgdXBkYXRlZCB0aGUgbGliY3VybC5mcmFtZXdvcmsubWFrZSBmaWxlLgoKRGFuaWVsICgyNiBNYXkgMjAwNikKLSBPbGFmIFN0/GJlbiBmaXhlZCBhIGJ1ZyB0aGF0IGNhdXNlZCBEaWdlc3QgYXV0aGVudGljYXRpb24gd2l0aCBtZDUtc2VzcyB0bwogIGZhaWwuIFdoZW4gdXNpbmcgdGhlIG1kNS1zZXNzLCB0aGUgcmVzdWx0IHdhcyBub3QgTWQ1IGVuY29kZWQgYW5kIEJhc2U2NAogIHRyYW5zZm9ybWVkLgoKRGFuaWVsICgyNSBNYXkgMjAwNikKLSBNaWNoYWVsIFdhbGxuZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGFsbG93cyAiU0VTUyIgdG8gYmUgc2V0IHdpdGgKICBDVVJMT1BUX0NPT0tJRUxJU1QsIHdoaWNoIHRoZW4gbWFrZXMgYWxsIHNlc3Npb24gY29va2llcyBnZXQgY2xlYXJlZC4KCkRhbmllbCAoMjQgTWF5IDIwMDYpCi0gVG9yIEFybnRzZW4gbWFkZSB0ZXN0IDI3MSBydW4gZmluZSBhZ2FpbiBzaW5jZSB0aGUgVEZUUCBwYXRoIGZpeC4KCkRhbmllbCAoMjMgTWF5IDIwMDYpCi0gTWFydGluIE1pY2hsbWF5ciBmaWxlZCBkZWJpYW4gYnVnIHJlcG9ydCAjMzY3OTU0LCBidXQgdGhlIHNhbWUgZXJyb3IgYWxzbwogIHNob3dlZCB1cCBpbiB0aGUgYXV0b2J1aWxkcy4gSXQgc2VlbXMgYSByYXRoZXIgbG9uZy1zaW5jZSBpbnRyb2R1Y2VkIHNoZWxsCiAgc2NyaXB0IGZsYXcgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgc3VkZGVubHkgd2FzIGRldGVjdGVkIGJ5IHRoZSBiYXNoCiAgdmVyc2lvbiBpbiBEZWJpYW4gVW5zdGFibGUuIEl0IGhhZCBwcmV2aW91c2x5IHBhc3NlZCB1bmRldGVjdGVkIGJ5IGFsbAogIHNoZWxscyB1c2VkIHNvIGZhci4uLgoKLSBEYXZpZCBNY0NyZWVkeSB1cGRhdGVkIGxpYi9jb25maWctdHBmLmgKCkRhbmllbCAoMTEgTWF5IDIwMDYpCi0gRml4ZWQgdGhlIGNvbmZpZ3VyZSdzIGNoZWNrIGZvciBvbGQtc3R5bGUgU1NMZWF5IGhlYWRlcnMgc2luY2UgSSBmZWxsIG92ZXIgYQogIGNhc2Ugd2l0aCBhIGR1cGxpY2F0ZSBmaWxlIG5hbWUgKGEga3JiNCBpbXBsZW1lbnRhdGlvbiB3aXRoIGFuIGVyci5oCiAgZmlsZSkuIEkgY29udmVydGVkIHRoZSBjaGVjayB0byBtYW51YWxseSBtYWtlIHN1cmUgdGhyZWUgb2YgdGhlIGhlYWRlcnMgYXJlCiAgcHJlc2VudCBiZWZvcmUgY29uc2lkZXJpbmcgdGhlbSBmaW5lLgoKLSBEYXZpZCBNY0NyZWVkeSBwcm92aWRlZCBhIGZpeCBmb3IgQ1VSTElORk9fTEFTVFNPQ0tFVCB0aGF0IGRvZXMgZXh0ZW5kZWQKICBjaGVja3Mgb24gdGhlIHRvLWJlLXJldHVybmVkIHNvY2tldCB0byBtYWtlIHN1cmUgaXQgdHJ1bHkgc2VlbXMgdG8gYmUgYWxpdmUKICBhbmQgd2VsbC4gRm9yIFNTTCBjb25uZWN0aW9uIGl0IChvbmx5KSB1c2VzIE9wZW5TU0wgZnVuY3Rpb25zLgoKRGFuaWVsICgxMCBNYXkgMjAwNikKLSBGaXhlZCBESUNUIGluIHR3byBhc3BlY3RzOgoKICAxIC0gYWxsb3cgcHJvcGVybHkgVVJMLWVzY2FwZWQgd29yZHMsIGxpa2UgdXNpbmcgJTIwIGZvciBzcGFjZXMKCiAgMiAtIHByb3Blcmx5IGVzY2FwZSBjZXJ0YWluIGxldHRlcnMgd2l0aGluIGEgd29yZCB0byBjb21wbHkgdG8gdGhlIFJGQzIyMjkKCkRhbmllbCAoOSBNYXkgMjAwNikKLSBBbmRyZWFzIE50YWZsb3MgcmVwb3J0ZWQgYSBidWcgaW4gbGliY3VybC5tNDogV2hlbiBjb25maWd1cmluZyBteSBHTlUKICBhdXRvdG9vbHMgcHJvamVjdCwgd2hpY2ggb3B0aW9uYWxseSAoZGVmYXVsdD15ZXMpIHVzZXMgbGliY3VybCBvbiBhIHN5c3RlbQogIHdpdGhvdXQgYSAodXNhYmxlKSBsaWJjdXJsIGluc3RhbGxhdGlvbiwgYnV0IG5vdCBzcGVjaWZ5aW5nCiAgYC0td2l0aG91dC1saWJjdXJsJywgY29uZmlndXJlIGRldGVybWluZXMgY29ycmVjdGx5IHRoYXQgbm8gbGliY3VybCBpcwogIGF2YWlsYWJsZSwgaG93ZXZlciwgdGhlIExJQkNVUkwgdmFyaWFibGUgZ2V0cyBleHBhbmRlZCB0byBgTElCQ1VSTCA9IC1sY3VybCcKICBpbiB0aGUgcmVzdWx0aW5nIE1ha2VmaWxlcy4KCiAgRGF2aWQgU2hhdyBmaXhlZCB0aGUgZmxhdy4KCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBmaXhlZCB0d28gcHJvYmxlbXMgaW4gdGhlIHJlY2VudGx5IGFkZGVkIG5vbi1ibG9ja2luZyBTU0wKICBjb25uZWN0cy4gVGhlIHN0YXRlIG1hY2hpbmUgd2FzIG5vdCByZXNldCBwcm9wZXJseSBzbyB0aGF0IHN1YnNlcXVlbnQKICBjb25uZWN0cyB1c2luZyB0aGUgc2FtZSBoYW5kbGUgd291bGQgZmFpbCwgYW5kIHRoZXJlIHdlcmUgdHdvIG1lbW9yeSBsZWFrcy4KCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBmaXhlZCBhIG1lbW9yeSBsZWFrIHdoZW4geW91IGFkZGVkIGFuIGVhc3kgaGFuZGxlIHRvIGEKICBtdWx0aSBzdGFjayBhbmQgdGhhdCBlYXN5IGhhbmRsZSBoYWQgYWxyZWFkeSBiZWVuIHVzZWQgdG8gZG8gb25lIG9yIG1vcmUKICBlYXN5IGludGVyZmFjZSB0cmFuc2ZlcnMsIGFzIHRoZW4gdGhlIGNvZGUgdGhyZXcgYXdheSB0aGUgcHJldmlvdXNseSB1c2VkCiAgRE5TIGNhY2hlIHdpdGhvdXQgcHJvcGVybHkgZnJlZWluZyBpdC4KCkRhbmllbCAoOCBNYXkgMjAwNikKLSBEYW4gRmFuZHJpY2ggd2VudCBvdmVyIHRoZSBURlRQIGNvZGUgYW5kIGhlIHBvaW50ZWQgb3V0IGFuZCBmaXhlZCBudW1lcm91cwogIHByb2JsZW1zOgoKICAqIFRoZSByZWNlaXZlZCBmaWxlIGlzIGNvcnJ1cHRlZCB3aGVuIGEgcGFja2V0IGlzIGxvc3QgYW5kIHJldHJhbnNtaXR0ZWQKICAgICh0aGlzIGlzIGEgc2VyaW91cyBwcm9ibGVtISkKCiAgKiBUcmFuc21pdHRpbmcgYSBmaWxlIGFib3J0cyBpZiBhIGJsb2NrIGlzIGxvc3QgYW5kIHJldHJhbnNtaXR0ZWQKCiAgKiBEYXRhIGlzIHN0b3JlZCBpbiB0aGUgd3JvbmcgbG9jYXRpb24gaW4gdGhlIGJ1ZmZlciBmb3IgdXBsb2Fkcywgc28gdXBsb2FkcwogICAgYWx3YXlzIGZhaWwgKEkgZG9uJ3Qgc2VlIGhvdyBpdCBjb3VsZCBoYXZlIGV2ZXIgd29ya2VkLCBidXQgaXQgZGlkIG9uIHg4NgogICAgYXQgbGVhc3QpCgogICogQSBudW1iZXIgb2YgY2FsbHMgYXJlIG1hZGUgdG8gc3RyZXJyb3IgaW5zdGVhZCBvZiBDdXJsX3N0cmVycm9yLCBtYWtpbmcKICAgIHRoZSBjb2RlIG5vdCB0aHJlYWQgc2FmZQoKICAqIFRoZXJlIGFyZSByZWZlcmVuY2VzIHRvIGVycm5vIGluc3RlYWQgb2YgQ3VybF9zb2NrZXJybm8oKSwgY2F1c2luZwogICAgaW5jb3JyZWN0IGVycm9yIG1lc3NhZ2VzIG9uIFdpbmRvd3MKCiAgKiBUaGUgZmlsZSBuYW1lIGluY2x1ZGVzIGEgbGVhZGluZyAvIHdoaWNoIHZpb2xhdGVzIFJGQzM2MTcuIERvaW5nIHNvbWV0aGluZwogICAgc2ltaWxhciB0byBmdHAsIHdoZXJlIHR3byBzbGFzaGVzIGFmdGVyIHRoZSBob3N0IG5hbWUgbWVhbnMgYW4gYWJzb2x1dGUKICAgIHJlZmVyZW5jZSBzZWVtcyBhIHJlYXNvbmFibGUgZXh0ZW5zaW9uIHRvIGZpeCB0aGlzLgoKICAqIEZhaWx1cmVzIGluIEVCQ0RJQyBjb252ZXJzaW9uIGFyZSBub3QgcHJvcGFnYXRlZCB1cCB0byB0aGUgY2FsbGVyIGJ1dCBhcmUKICAgIHNpbGVudGx5IGlnbm9yZWQKCi0gRml4ZWQga25vd24gYnVnICMyOC4gVGhlIFRGVFAgY29kZSBubyBsb25nZXIgYXNzdW1lcyBhIHBhY2tlZCBzdHJ1Y3QgYW5kCiAgdGh1cyB3b3JrcyByZWxpYWJseSBvbiBtb3JlIHBsYXRmb3Jtcy4KCkRhbmllbCAoNSBNYXkgMjAwNikKLSBSb2xhbmQgQmxvbSBmaWxlZCBidWcgcmVwb3J0ICMxNDgxMjE3CiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNDgxMjE3KSwgd2l0aCBmb2xsb3ctdXBzIGJ5IE1pY2hlbGUKICBCaW5pIGFuZCBEYXZpZCBCeXJvbi4gbGliY3VybCBwcmV2aW91c2x5IHdyb25nbHkgdXNlZCBHZXRMYXN0RXJyb3IoKSBvbgogIHdpbmRvd3MgdG8gZ2V0IGVycm9yIGRldGFpbHMgYWZ0ZXIgc29ja2V0LXJlbGF0ZWQgZnVuY3Rpb24gY2FsbHMsIHdoZW4gaXQKICByZWFsbHkgc2hvdWxkIHVzZSBXU0FHZXRMYXN0RXJyb3IoKSBpbnN0ZWFkLgoKICBXaGVuIGNoYW5naW5nIHRvIHRoaXMsIHRoZSBmb3JtZXIgZnVuY3Rpb24gQ3VybF9vdXJlcnJubygpIGlzIG5vdyBpbnN0ZWFkCiAgY2FsbGVkIEN1cmxfc29ja2Vycm5vKCkgYXMgaXQgaXMgbmVjZXNzYXJ5IHRvIG9ubHkgdXNlIGl0IHRvIGdldCBlcnJubyBmcm9tCiAgc29ja2V0LXJlbGF0ZWQgZnVuY3Rpb25zIGFzIG90aGVyd2lzZSBpdCB3b24ndCB3b3JrIGFzIGludGVuZGVkIG9uIFdpbmRvd3MuCgpEYW5pZWwgKDQgTWF5IDIwMDYpCi0gTWFyayBFaWNoaW4gc3VibWl0dGVkIGJ1ZyByZXBvcnQgIzE0ODA4MjEKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0ODA4MjEpIEhlIGZvdW5kIGFuZCBpZGVudGlmaWVkIGEKICBwcm9ibGVtIHdpdGggaG93IGxpYmN1cmwgZGVhbHQgd2l0aCBHbnVUTFMgYW5kIGEgY2FzZSB3aGVyZSBnbnV0bHMgcmV0dXJuZWQKICBHTlVUTFNfRV9BR0FJTiBpbmRpY2F0aW5nIGl0IHdvdWxkIGJsb2NrLiBJdCB3b3VsZCB0aGVuIHJldHVybiBhbiB1bmV4cGVjdGVkCiAgcmV0dXJuIGNvZGUsIG1ha2luZyBDdXJsX3NzbF9zZW5kKCkgY29uZnVzZSB0aGUgdXBwZXIgbGF5ZXIgLSBjYXVzaW5nIHJhbmRvbQogIDI4IGJ5dGVzIHRyYXNoIGRhdGEgdG8gZ2V0IGluc2VydGVkIGluIHRoZSB0cmFuc2ZlcmVkIHN0cmVhbS4KCiAgVGhlIHByb3BlciBmaXggd2FzIHRvIG1ha2UgdGhlIEN1cmxfZ3Rsc19zZW5kKCkgZnVuY3Rpb24gcmV0dXJuIHRoZSBwcm9wZXIKICByZXR1cm4gY29kZXMgdGhhdCB0aGUgY2FsbGVycyB3b3VsZCBleHBlY3QuIFRoZSBDdXJsX29zc2xfc2VuZCgpIGZ1bmN0aW9uCiAgYWxyZWFkeSBkaWQgdGhpcy4KCkRhbmllbCAoMiBNYXkgMjAwNikKLSBBZGRlZCBhIC0tY2hlY2tmb3Igb3B0aW9uIHRvIGN1cmwtY29uZmlnIHRvIGFsbG93IHVzZXJzIHRvIGVhc2llcgogIHdyaXRlIGZvciBleGFtcGxlIHNoZWxsIHNjcmlwdHMgdGhhdCB0ZXN0IGZvciB0aGUgcHJlc2VuY2Ugb2YgYQogIG5ldy1lbm91Z2ggbGliY3VybCB2ZXJzaW9uLiBJZiAtLWNoZWNrZm9yIGlzIGdpdmVuIGEgdmVyc2lvbiBzdHJpbmcKICBuZXdlciB0aGFuIHdoYXQgaXMgY3VycmVudGx5IGluc3RhbGxlZCwgY3VybC1jb25maWcgd2lsbCByZXR1cm4gYQogIG5vbi16ZXJvIGV4aXQgY29kZSBhbmQgb3V0cHV0IGEgc3RyaW5nIGFib3V0IHRoZSB1bmZ1bGZpbGxlZAogIHJlcXVpcmVtZW50LgoKRGFuaWVsICgyNiBBcHJpbCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGJyb3VnaHQgaW5pdGlhbCBsaW5lIGVuZCBjb252ZXJzaW9ucyB3aGVuIGRvaW5nIEZUUCBBU0NJSQogIHRyYW5zZmVycy4gVGhleSBhcmUgZG9uZSBvbiBub24td2luZG93cyBzeXN0ZW1zIGFuZCB0cmFuc2xhdGUgQ1JMRiB0byBMRi4KCiAgSSBtb2RpZmllZCB0aGUgMTUgTElTVC11c2luZyB0ZXN0IGNhc2VzIGFjY29yZGluZ2x5LiBUaGUgZG93bnNpZGUgaXMgdGhhdCBub3cKICB3ZSdsbCBoYXZlIGV2ZW4gbW9yZSB0cm91YmxlIHRvIGdldCB0aGUgdGVzdHMgdG8gcnVuIG9uIFdpbmRvd3Mgc2luY2UgdGhleQogIHNob3VsZCBnZXQgQ1JMRiBuZXdsaW5lcyBsZWZ0IGludGFjdCB3aGljaCB0aGUgKm5peCB2ZXJzaW9ucyBkb24ndC4gSSBmaWd1cmUKICB0aGUgb25seSBzYW5lIHRoaW5nIHRvIGRvIGlzIHRvIGFkZCBzb21lIGtpbmQgb2YgW25ld2xpbmVdIG1hY3JvIGZvciB0aGUgdGVzdAogIGNhc2UgZmlsZXMgYW5kIGhhdmUgdGhlbSBleHBhbmRlZCB0byB0aGUgcHJvcGVyIG5hdGl2ZSBsaW5lIGVuZGluZyB3aGVuIHRoZQogIHRlc3QgY2FzZXMgYXJlIHJ1bi4gVGhpcyBpcyBob3dldmVyIGxlZnQgdG8gaW1wbGVtZW50LgoKRGFuaWVsICgyNSBBcHJpbCAyMDA2KQotIFBhdWwgUXVlcm5hIGZpeGVkIGxpYmN1cmwgdG8gYmV0dGVyIGRlYWwgd2l0aCBkZWZsYXRlIGNvbnRlbnQgZW5jb2RpbmcKICB3aGVuIHRoZSBzdHJlYW0gKHdyb25nbHkpIGxhY2tzIGEgcHJvcGVyIHpsaWIgaGVhZGVyLiBUaGlzIHNlZW1zIHRvIGJlIHRoZQogIGNhc2Ugb24gdG9vIG1hbnkgYWN0dWFsIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMuCgpEYW5pZWwgKDIxIEFwcmlsIDIwMDYpCi0gQWxlIFZlc2VseSBmaXhlZCBDVVJMT1BUX0lOVEVSRkFDRSB3aGVuIHVzaW5nIGEgaG9zdG5hbWUuCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDYpCi0gQmFzZWQgb24gcHJldmlvdXMgaW5mbyBmcm9tIFRvciBBcm50c2VuLCBJIG1hZGUgY29uZmlndXJlIGRldGVjdCB0aGUgSW50ZWwKICBJQ0MgY29tcGlsZXIgdG8gYWRkIGEgY29tcGlsZXIgb3B0aW9uIGZvciBpdCwgaW4gb3JkZXIgZm9yIGNvbmZpZ3VyZSB0bwogIHByb3Blcmx5IGJlIGFibGUgdG8gZGV0ZWN0IGZ1bmN0aW9uIHByb3RvdHlwZXMuCgotIFJvYnNvbiBCcmFnYSBBcmF1am8gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIGxpYmN1cmwgbGVzcyBlYWdlciB0byBjbG9zZQogIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gd2hlbiB1c2luZyBGVFAsIGZvciBleGFtcGxlIHdoZW4geW91IHJlbW92ZSBhbiBlYXN5CiAgaGFuZGxlIGZyb20gYSBtdWx0aSBzdGFjay4KCi0gQXBwbGllZCBhIHBhdGNoIGJ5IEF0ZXMgR29yYWwgYW5kIEthdGllIFdhbmcgdGhhdCBjb3JyZWN0ZWQgbXkgYmFkIGZpeAogIGF0dGVtcHQgZnJvbSBBcHJpbCAxMC4KCkRhbmllbCAoMTEgQXByaWwgMjAwNikKLSAjMTQ2ODMzMCAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0NjgzMzApIHBvaW50ZWQgb3V0IGEgYmFkCiAgdHlwZWNhc3QgaW4gdGhlIGN1cmwgdG9vbCBsZWFkaW5nIHRvIGEgY3Jhc2ggd2l0aCAoNjRiaXQ/KSBWUzIwMDUgKGF0IGxlYXN0KQogIHNpbmNlIHRoZSBzdHJ1Y3QgdGltZXZhbCBmaWVsZCB0dl9zZWMgaXMgYW4gaW50IHdoaWxlIHRpbWVfdCBpcyA2NGJpdC4KCkRhbmllbCAoMTAgQXByaWwgMjAwNikKLSBBdGVzIEdvcmFsIGZvdW5kIG91dCB0aGF0IGlmIHlvdSBzcGVjaWZpZWQgYm90aCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUIGFuZAogIENVUkxPUFRfVElNRU9VVCwgdGhlIF9sb25nZXJfIHRpbWUgd291bGQgd3JvbmdseSBiZSB1c2VkIGZvciB0aGUgU1NMCiAgY29ubmVjdGlvbiB0aW1lLW91dCEKCi0gSSBtZXJnZWQgbXkgaGlwZXIgcGF0Y2ggKGh0dHBzOi8vY3VybC5oYXh4LnNlL2xpYmN1cmwvaGlwZXIvKSBpbnRvIHRoZSBtYWluCiAgc291cmNlcy4gU2VlIHRoZSBsaWIvUkVBRE1FLm11bHRpX3NvY2tldCBmb3IgaW1wbGVtZW50YXRpb24gc3Rvcnkgd2l0aAogIGRldGFpbHMuIERvbid0IGV4cGVjdCBpdCB0byB3b3JrIGZ1bGx5IHlldC4gSSBkb24ndCBpbnRlbmQgdG8gYmxvdyBhbnkKICB3aGlzdGxlcyBvciByaW5nIGFueSBiZWxscyBhYm91dCBpdCB1bnRpbCBJJ20gbW9yZSBjb252aW5jZWQgaXQgd29ya3MgYXQKICBsZWFzdCBzb21ld2hhdCByZWxpYWJseS4KCkRhbmllbCAoNyBBcHJpbCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5J3MgRUJDRElDIGFuZCBUUEYgY2hhbmdlcy4gVGhyZWUgbmV3IGN1cmxfZWFzeV9zZXRvcHQoKQogIG9wdGlvbnMgKGNhbGxiYWNrcykgd2VyZSBhZGRlZDoKCiAgQ09OVl9GUk9NX05FVFdPUktfRlVOQ1RJT04KICBDT05WX1RPX05FVFdPUktfRlVOQ1RJT04KICBDT05WX0ZST01fVVRGOF9GVU5DVElPTgoKRGFuaWVsICg1IEFwcmlsIDIwMDYpCi0gTWljaGVsZSBCaW5pIG1vZGlmaWVkIHRoZSBOVExNIGNvZGUgdG8gd29yayBmb3IgaGlzICJ3ZWlyZCBJSVMgY2FzZSIKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNi0wMi8wMTU0Lmh0bWwpIGJ5IGFkZGluZyB0aGUgTlRMTSBoYXNoCiAgZnVuY3Rpb24gaW4gYWRkaXRpb24gdG8gdGhlIExNIG9uZSBhbmQgbWFraW5nIHNvbWUgb3RoZXIgYWRqdXN0bWVudHMgaW4gdGhlCiAgb3JkZXIgdGhlIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgZGF0YSBibG9jayBhcmUgc2VudCBpbiB0aGUgVHlwZS0yIHJlcGx5LgogIEluc3BpcmF0aW9uIGZvciB0aGlzIHdvcmsgd2FzIHRha2VuIGZyb20gdGhlIEZpcmVmb3ggTlRMTSBpbXBsZW1lbnRhdGlvbi4KCiAgSSBlZGl0ZWQgdGhlIGV4aXN0aW5nIDIxKCEpIE5UTE0gdGVzdCBjYXNlcyB0byBydW4gZmluZSB3aXRoIHRoZXNlIG5ld3MuIER1ZQogIHRvIHRoZSBmYWN0IHRoYXQgd2Ugbm93IHByb3Blcmx5IGluY2x1ZGUgdGhlIGhvc3QgbmFtZSBpbiB0aGUgVHlwZS0yIG1lc3NhZ2UKICB0aGUgdGVzdCBjYXNlcyBub3cgb25seSBjb21wYXJlIHBhcnRzIG9mIHRoYXQgY2h1bmsuCgpEYW5pZWwgKDI4IE1hcmNoIDIwMDYpCi0gIzE0NTE5MjkgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNDUxOTI5KSBkZXRhaWxlZCBhIGJ1ZyB0aGF0CiAgb2NjdXJyZWQgd2hlbiBhc2tpbmcgbGliY3VybCB0byBmb2xsb3cgSFRUUCByZWRpcmVjdHMgYW5kIHRoZSBvcmlnaW5hbCBVUkwKICBoYWQgbW9yZSB0aGFuIG9uZSBxdWVzdGlvbiBtYXJrICg/KS4gQWRkZWQgdGVzdCBjYXNlIDI3NiB0byB2ZXJpZnkuCgpEYW5pZWwgKDI3IE1hcmNoIDIwMDYpCi0gRGF2aWQgQnlyb24gZm91bmQgYSBwcm9ibGVtIG11bHRpcGxlIC1kIG9wdGlvbnMgd2hlbiBsaWJjdXJsIHdhcyBidWlsdCB3aXRoCiAgLS1lbmFibGUtZGVidWcsIGFzIHRoZW4gY3VybCB1c2VkIGZyZWUoKSBvbiBtZW1vcnkgYWxsb2NhdGVkIGJvdGggd2l0aAogIG5vcm1hbCBtYWxsb2MoKSBhbmQgd2l0aCBsaWJjdXJsLXByb3ZpZGVkIGZ1bmN0aW9ucywgd2hlbiB0aGUgbGF0dGVyIE1VU1QgYmUKICBmcmVlZCB3aXRoIGN1cmxfZnJlZSgpIGluIGRlYnVnIGJ1aWxkcy4KCkRhbmllbCAoMjYgTWFyY2ggMjAwNikKLSBUb3IgQXJudHNlbiBmaWd1cmVkIG91dCB0aGF0IFRGVFAgd2FzIGJyb2tlbiBvbiBhIGxvdCBvZiBzeXN0ZW1zIHNpbmNlIHdlCiAgY2FsbGVkIGJpbmQoKSB3aXRoIGEgdG9vIGJpZyBhcmd1bWVudCBpbiB0aGUgM3JkIHBhcmFtZXRlciBhbmQgYXQgbGVhc3QKICBUcnU2NCwgQUlYIGFuZCBJUklYIHNlZW0gdG8gYmUgdmVyeSBwaWNreSBhYm91dCBpdC4KCkRhbmllbCAoMjEgTWFyY2ggMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBhZGRlZCBDVVJMSU5GT19GVFBfRU5UUllfUEFUSC4KCi0gWGF2aWVyIEJvdWNob3V4IG1hZGUgdGhlIFNTTCBjb25uZWN0aW9uIG5vbi1ibG9ja2luZyBmb3IgdGhlIG11bHRpIGludGVyZmFjZQogICh3aGVuIHVzaW5nIE9wZW5TU0wpLgoKLSBUb3IgQXJudHNlbiBmaXhlZCB0aGUgQUlYIFRvb2xib3ggUlBNIHNwZWMKCkRhbmllbCAoMjAgTWFyY2ggMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCBsaWJjdXJsIHRvIG5vIGxvbmdlciBpZ25vcmUgQVVUSCBmYWlsdXJlcyBhbmQgbm93IGl0CiAgcmVhY3RzIHByb3Blcmx5IGFjY29yZGluZyB0byB0aGUgQ1VSTE9QVF9GVFBfU1NMIHNldHRpbmcuCgotIERhbiBGYW5kcmljaCBmaXhlZCB0d28gVEZUUCBwcm9ibGVtczogRml4ZWQgYSBidWcgd2hlcmVieSBhIHJlY2VpdmVkIGZpbGUKICB3aG9zZSBsZW5ndGggd2FzIGEgbXVsdGlwbGUgb2YgNTEyIGJ5dGVzIGNvdWxkIGhhdmUgcmFuZG9tIGdhcmJhZ2UKICBhcHBlbmRlZC4gQWxzbywgc3RvcCBwcm9jZXNzaW5nIFRGVFAgcGFja2V0cyB3aGljaCBhcmUgdG9vIHNob3J0IHRvIGJlCiAgbGVnYWwuCgotIElsamEgdmFuIFNwcnVuZGVsIHJlcG9ydGVkIGEgcG9zc2libGUgY3Jhc2ggaW4gdGhlIGN1cmwgdG9vbCB3aGVuIHVzaW5nCiAgImN1cmwgaG9zdHdpdGhvdXRzbGFzaCAtZCBkYXRhIC1HIgoKVmVyc2lvbiA3LjE1LjMgKDIwIE1hcmNoIDIwMDYpCgpEYW5pZWwgKDIwIE1hcmNoIDIwMDYpCi0gVlVMTkVSQUJJTElUWSByZXBvcnRlZCB0byB1cyBieSBVbGYgSGFybmhhbW1hci4KCiAgbGliY3VybCB1c2VzIHRoZSBnaXZlbiBmaWxlIHBhcnQgb2YgYSBURlRQIFVSTCBpbiBhIG1hbm5lciB0aGF0IGFsbG93cyBhCiAgbWFsaWNpb3VzIHVzZXIgdG8gb3ZlcmZsb3cgYSBoZWFwLWJhc2VkIG1lbW9yeSBidWZmZXIgZHVlIHRvIHRoZSBsYWNrIG9mCiAgYm91bmRhcnkgY2hlY2suCgogIFRoaXMgb3ZlcmZsb3cgaGFwcGVucyBpZiB5b3UgcGFzcyBpbiBhIFVSTCB3aXRoIGEgVEZUUCBwcm90b2NvbCBwcmVmaXgKICAoInRmdHA6Ly8iKSwgdXNpbmcgYSB2YWxpZCBob3N0IGFuZCBhIHBhdGggcGFydCB0aGF0IGlzIGxvbmdlciB0aGFuIDUxMgogIGJ5dGVzLgoKICBUaGUgYWZmZWN0ZWQgZmxhdyBjYW4gYmUgdHJpZ2dlcmVkIGJ5IGEgcmVkaXJlY3QsIGlmIGN1cmwvbGliY3VybCBpcyB0b2xkIHRvCiAgZm9sbG93IHJlZGlyZWN0cyBhbmQgYW4gSFRUUCBzZXJ2ZXIgcG9pbnRzIHRoZSBjbGllbnQgdG8gYSB0ZnRwIFVSTCB3aXRoIHRoZQogIGNoYXJhY3RlcmlzdGljcyBkZXNjcmliZWQgYWJvdmUuCgogIFRoZSBDb21tb24gVnVsbmVyYWJpbGl0aWVzIGFuZCBFeHBvc3VyZXMgKENWRSkgcHJvamVjdCBoYXMgYXNzaWduZWQgdGhlIG5hbWUKICBDVkUtMjAwNi0xMDYxIHRvIHRoaXMgaXNzdWUuCgpEYW5pZWwgKDE2IE1hcmNoIDIwMDYpCi0gVG9yIEFybnRzZW4gcHJvdmlkZWQgYSBSUE0gc3BlYyBmaWxlIGZvciBBSVggVG9vbGJveCwgdGhhdCBub3cgaXMgaW5jbHVkZWQKICBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKRGFuaWVsICgxNCBNYXJjaCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGZpeGVkOgoKICBhIGJhZCBTU0wgZXJyb3IgbWVzc2FnZSB3aGVuIE9wZW5TU0wgY2VydGlmaWNhdGVzIGFyZSB2ZXJpZmllZCBmaW5lLgoKICBhIG1pc3NpbmcgcmV0dXJuIGNvZGUgYXNzaWdubWVudCBpbiB0aGUgRlRQIGNvZGUKCkRhbmllbCAoNyBNYXJjaCAyMDA2KQotIE1hcmt1cyBLb2V0dGVyIGZpbGVkIGRlYmlhbiBidWcgcmVwb3J0ICMzNTU3MTUgd2hpY2ggaWRlbnRpZmllZCBhIHByb2JsZW0KICB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kIG11bHRpLXBhcnQgZm9ybXBvc3RzLiBUaGUgZml4IGZyb20gRmVicnVhcnkKICAyMm5kIGNvdWxkIG1ha2UgdGhlIEN1cmxfZG9uZSgpIGZ1bmN0aW9uIGdldCBjYWxsZWQgdHdpY2Ugb24gdGhlIHNhbWUKICBjb25uZWN0aW9uIGFuZCBpdCB3YXMgbm90IGRlc2lnbmVkIGZvciB0aGF0IGFuZCB0aHVzIHRyaWVkIHRvIGNhbGwgZnJlZSgpIG9uCiAgYW4gYWxyZWFkeSBmcmVlZCBtZW1vcnkgYXJlYSEKCi0gUGV0ZXIgSGV1Y2hlcnQgbWFkZSBzdXJlIHRoZSBDVVJMRlRQU1NMX0NPTlRST0wgc2V0dGluZyBmb3IgQ1VSTE9QVF9GVFBfU1NMCiAgaXMgdXNlZCBwcm9wZXJseS4KCkRhbmllbCAoNiBNYXJjaCAyMDA2KQotIExvdHMgb2YgdXNlcnMgb24gV2luZG93cyBoYXZlIHJlcG9ydGVkIGdldHRpbmcgdGhlICJTU0w6IGNvdWxkbid0IHNldAogIGNhbGxiYWNrIiBlcnJvciBtZXNzYWdlIHNvIEkndmUgbm93IG1hZGUgdGhlIHNldHRpbmcgb2YgdGhhdCBjYWxsYmFjayBub3QgYmUKICBhcyBjcml0aWNhbCBhcyBiZWZvcmUuIFRoZSBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgZm9yIGFkZGl0aW9uYWwgbG9nZ2dpbmcvCiAgdHJhY2UgYW55d2F5IHNvIGEgZmFpbHVyZSBqdXN0IG1lYW5zIHNsaWdodGx5IGxlc3MgZGF0YS4gSXQgc2hvdWxkIHN0aWxsIGJlCiAgYWJsZSB0byBwcm9jZWVkIGFuZCBjb25uZWN0IGZpbmUgdG8gdGhlIHNlcnZlci4KCkRhbmllbCAoNCBNYXJjaCAyMDA2KQotIFRob21hcyBLbGF1c25lciBwcm92aWRlZCBhIHBhdGNoIHdyaXR0ZW4gYnkgVG9kZCBWaWVybGluZyBpbiBidWcgcmVwb3J0CiAgIzE0NDI0NzEgdGhhdCBmaXhlcyBhIGJ1aWxkIHByb2JsZW0gb24gSW50ZXJpeC4KCkRhbmllbCAoMiBNYXJjaCAyMDA2KQotIEZUUCB1cGxvYWQgd2l0aG91dCBhIGZpbGUgbmFtZSBwYXJ0IGluIHRoZSBVUkwgbm93IGNhdXNlcwogIGN1cmxfZWFzeV9wZXJmb3JtKCkgdG8gcmV0dXJuIENVUkxFX1VSTF9NQUxGT1JNQVQuIFByZXZpb3VzbHkgaXQgYWxsb3dlZCB0aGUKICB1cGxvYWQgYnV0IG5hbWVkIHRoZSBmaWxlICIobmlsKSIgKHdpdGhvdXQgdGhlIHF1b3RlcykuIFRlc3QgY2FzZSA1MjQKICB2ZXJpZmllcy4KCi0gQWRkZWQgYSBjaGVjayBmb3IgZ2V0cHJvdG9ieW5hbWUgaW4gY29uZmlndXJlIHNvIHRoYXQgaXQnbGwgYmUgdXNlZCwgdGhhbmtzCiAgdG8gR2lzbGUgVmFuZW0ncyBjaGFuZ2UgdGhlIG90aGVyIGRheS4KCkRhbmllbCAoMjggRmVicnVhcnkgMjAwNikKLSBEYW4gRmFuZHJpY2ggcHJldmVudGVkIGN1cmwgZnJvbSBnZXR0aW5nIHN0dWNrIGluIGFuIGVuZGxlc3MgbG9vcCBpbiBjYXNlIHdlCiAgYXJlIG91dCBvZiBmaWxlIGhhbmRsZXMgdmVyeSBlYXJseSBpbiBjdXJsJ3MgY29kZSB3aGVyZSBpdCBtYWtlcyBzdXJlIHRoYXQKICAwLCAxIGFuZCAyIGFyZW4ndCBnb25uYSBiZSB1c2VkIGJ5IHRoZSBsaWIgZm9yIHRyYW5zZmVycy4KCkRhbmllbCAoMjcgRmVicnVhcnkgMjAwNikKLSBNYXJ0eSBLdWhydCBwb2ludGVkIG91dCB0aGF0IHRoZXJlIHdlcmUgdHdvIFZNUy1zcGVjaWZpYyBmaWxlcyBtaXNzaW5nIGluCiAgdGhlIHJlbGVhc2UgYXJjaGl2ZS4KClZlcnNpb24gNy4xNS4yICgyNyBGZWJydWFyeSAyMDA2KQoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDA2KQotIExvdHMgb2Ygd29yayBhbmQgYW5hbHlzaXMgYnkgInhieF9fXyIgaW4gYnVnICMxNDMxNzUwCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNDMxNzUwKSBoZWxwZWQgbWUgaWRlbnRpZnkgYW5kIGZpeCB0d28KICBkaWZmZXJlbnQgYnV0IHJlbGF0ZWQgYnVnczoKCiAgMSkgUmVtb3ZpbmcgYW4gZWFzeSBoYW5kbGUgZnJvbSBhIG11bHRpIGhhbmRsZSBiZWZvcmUgdGhlIHRyYW5zZmVyIGlzIGRvbmUKICAgICBjb3VsZCBsZWF2ZSBhIGNvbm5lY3Rpb24gaW4gdGhlIGNvbm5lY3Rpb24gY2FjaGUgZm9yIHRoYXQgaGFuZGxlIHRoYXQgaXMKICAgICBpbiBhIHN0YXRlIHRoYXQgaXNuJ3Qgc3VpdGFibGUgZm9yIHJlLXVzZS4gQSBzdWJzZXF1ZW50IHJlLXVzZSBjb3VsZCB0aGVuCiAgICAgcmVhZCBmcm9tIGEgTlVMTCBwb2ludGVyIGFuZCBzZWdmYXVsdC4KCiAgMikgV2hlbiBhbiBlYXN5IGhhbmRsZSB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBtdWx0aSBoYW5kbGUsIHRoZXJlIGNvdWxkIGJlIGFuCiAgICAgb3V0c3RhbmRpbmcgYy1hcmVzIEROUyBuYW1lIHJlc29sdmUgcmVxdWVzdC4gV2hlbiB0aGUgcmVzcG9uc2UgYXJyaXZlZCwKICAgICBpdCBjYXVzZWQgaGF2b2Mgc2luY2UgdGhlIGNvbm5lY3Rpb24gc3RydWN0IGl0ICJiZWxvbmdlZCIgdG8gY291bGQndmUKICAgICBiZWVuIGZyZWVkIGFscmVhZHkuCgogIE5vdyBDdXJsX2RvbmUoKSBpcyBjYWxsZWQgd2hlbiBhbiBlYXN5IGhhbmRsZSBpcyByZW1vdmVkIGZyb20gYSBtdWx0aSBoYW5kbGUKICBwcmUtbWF0dXJlbHkgKHRoYXQgaXMsIGJlZm9yZSB0aGUgdHJhbnNmZXIgd2FzIGNvbXBsdGV0ZWQpLiBDdXJsX2RvbmUoKSBhbHNvCiAgbWFrZXMgc3VyZSB0byBjYW5jZWwgYWxsIChpZiBhbnkpIG91dHN0YW5kaW5nIGMtYXJlcyByZXF1ZXN0cy4KCkRhbmllbCAoMjEgRmVicnVhcnkgMjAwNikKLSBQZXRlciBTdSBhZGRlZCBzdXBwb3J0IGZvciBTT0NLUzQgcHJveGllcy4gRW5hYmxlIHRoaXMgYnkgc2V0dGluZyB0aGUgcHJveHkKICB0eXBlIHRvIHRoZSBhbHJlYWR5IHByb3ZpZGVkIHR5cGUgQ1VSTFBST1hZX1NPQ0tTNC4KCiAgSSBhZGRlZCBhIC0tc29ja3M0IG9wdGlvbiB0aGF0IHdvcmtzIGxpa2UgdGhlIGN1cnJlbnQgLS1zb2NrczUgb3B0aW9uIGJ1dAogIGluc3RlYWQgdXNlIHRoZSBzb2NrczQgcHJvdG9jb2wuCgpEYW5pZWwgKDIwIEZlYnJ1YXJ5IDIwMDYpCi0gU2htdWxpayBSZWdldiBmaXhlZCBhbiBpc3N1ZSB3aXRoIG11bHRpLXBhc3MgYXV0aGVudGljYXRpb24gYW5kIGNvbXByZXNzZWQKICBjb250ZW50IHdoZW4gbGliY3VybCBkaWRuJ3QgaG9ub3IgdGhlIGludGVybmFsIGlnbm9yZWJvZHkgZmxhZy4KCkRhbmllbCAoMTggRmVicnVhcnkgMjAwNikKLSBVbGYgSORybmhhbW1hciBmaXhlZCBhIGZvcm1hdCBzdHJpbmcgKHByaW50ZiBzdHlsZSkgcHJvYmxlbSBpbiB0aGUgTmVnb3RpYXRlCiAgY29kZS4gSXQgc2hvdWxkIGhvd2V2ZXIgbm90IGJlIHRoZSBjYXVzZSBvZiBhbnkgdHJvdWJsZXMuIEhlIGFsc28gZml4ZWQgYQogIGZldyBzaW1pbGFyIHByb2JsZW1zIGluIHRoZSBIVFRQIHRlc3Qgc2VydmVyIGNvZGUuCgpEYW5pZWwgKDE3IEZlYnJ1YXJ5IDIwMDYpCi0gU2htdWxpayBSZWdldiBwcm92aWRlZCBhIGZpeCBmb3IgdGhlIEROUyBjYWNoZSB3aGVuIHVzaW5nIHNob3J0IGxpZmUgdGltZXMsCiAgYXMgcHJldmlvdXNseSBpdCBjb3VsZCBiZSBob2xkaW5nIG9uIHRvIG9sZCBjYWNoZWQgZW50cmllcyBsb25nZXIgdGhhbgogIHJlcXVlc3RlZC4KCkRhbmllbCAoMTEgRmVicnVhcnkgMjAwNikKLSBLYXJsIE1vZXJkZXIgYWRkZWQgdGhlIENVUkxPUFRfQ09OTkVDVF9PTkxZIGFuZCBDVVJMSU5GT19MQVNUU09DS0VUIG9wdGlvbnMKICB0aGF0IGFuIGFwcCBjYW4gdXNlIHRvIGxldCBsaWJjdXJsIG9ubHkgY29ubmVjdCB0byBhIHJlbW90ZSBob3N0IGFuZCB0aGVuCiAgZXh0cmFjdCB0aGUgc29ja2V0IGZyb20gbGliY3VybC4gbGliY3VybCB3aWxsIHRoZW4gbm90IGF0dGVtcHQgdG8gZG8gYW55CiAgdHJhbnNmZXIgYXQgYWxsIGFmdGVyIHRoZSBjb25uZWN0IGlzIGRvbmUuCgotIEtlbnQgQm9vcnR6IGltcHJvdmVkIHRoZSBjb25maWd1cmUgY2hlY2sgZm9yIEdudVRMUyB0byBwcm9wZXJseSBzZXQgTElCUwogIGluc3RlYWQgb2YgTERGTEFHUy4KCkRhbmllbCAoOCBGZWJydWFyeSAyMDA2KQotIFBoaWxpcHBlIFZhdWNoZXIgcHJvdmlkZWQgYSBicmlsbGlhbnQgcGllY2Ugb2YgdGVzdCBjb2RlIHRoYXQgc2hvdyBhIHByb2JsZW0KICB3aXRoIHJlLXVzZWQgRlRQIGNvbm5lY3Rpb25zLiBJZiB0aGUgc2Vjb25kIHJlcXVlc3Qgb24gdGhlIHNhbWUgY29ubmVjdGlvbgogIHdhcyBzZXQgbm90IHRvIGZldGNoIGEgImJvZHkiLCBsaWJjdXJsIGNvdWxkIGdldCBjb25mdXNlZCBhbmQgY29uc2lkZXIgaXQgYW4KICBhdHRlbXB0IHRvIHVzZSBhIGRlYWQgY29ubmVjdGlvbiBhbmQgd291bGQgZ28gYWN0aW5nIG1pZ2h0eSBzdHJhbmdlLgoKRGFuaWVsICgyIEZlYnJ1YXJ5IDIwMDYpCi0gTWFrZSAtLWxpbWl0LXJhdGUgW251bV0gbWVhbiBieXRlcy4gSXQgdXNlZCB0byBiZSB0aGF0IGJ1dCBpdCBicm9rZSBpbiBteQogIGNoYW5nZSBkb25lIGluIE5vdmVtYmVyIDIwMDUuCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwNikKLSBBZGRlZCBDVVJMT1BUX0xPQ0FMUE9SVCBhbmQgQ1VSTE9QVF9MT0NBTFBPUlRSQU5HRSB0byBsaWJjdXJsLiBTZXQgd2l0aCB0aGUKICBjdXJsIHRvb2wgd2l0aCAtLWxvY2FsLXBvcnQuIFBsYWluIGFuZCBzaW1wbHkgc2V0IHRoZSByYW5nZSBvZiBwb3J0cyB0byBiaW5kCiAgdGhlIGxvY2FsIGVuZCBvZiBjb25uZWN0aW9ucyB0by4gSW1wbGVtZW50ZWQgb24gdG8gcG9wdWxhciBkZW1hbmQuCgotIEJhc2VkIG9uIGFuIGVycm9yIHJlcG9ydCBieSBQaGlsaXBwZSBWYXVjaGVyLCB3ZSBubyBsb25nZXIgY291bnQgYSByZXRyaWVkCiAgY29ubmVjdGlvbiBzZXR1cCBhcyBhIGZvbGxvdy1yZWRpcmVjdC4gSXQgdHVybnMgb3V0IDEpIHRoaXMgZmFpbHMgd2hlbiBhIEZUUAogIGNvbm5lY3Rpb24gaXMgcmUtc2V0dXAgYW5kIDIpIGl0IGRvZXMgbWFrZSB0aGUgbWF4LXJlZGlycyBjb3VudGVyIGJlaGF2ZQogIHdyb25nLgoKRGFuaWVsICgyNCBKYW51YXJ5IDIwMDYpCi0gTWljaGFsIE1hcmVrIHByb3ZpZGVkIGEgcGF0Y2ggZm9yIEZUUCB0aGF0IG1ha2VzIGxpYmN1cmwgY29udGludWUgdG8gdHJ5CiAgUEFTViBldmVuIGFmdGVyIEVQU1YgcmV0dXJuZWQgYSBwb3NpdGl2ZSByZXNwb25zZSBjb2RlLCBpZiBsaWJjdXJsIGZhaWxlZCB0bwogIGNvbm5lY3QgdG8gdGhlIHBvcnQgbnVtYmVyIHRoZSBFUFNWIHJlc3BvbnNlIHNhaWQuIE9idmlvdXNseSBzb21lIHBlb3BsZSBhcmUKICBnb2luZyB0aHJvdWdoIHByb3RvY29sLXNlbnNpdGl2ZSBmaXJld2FsbHMgKG9yIHNpbWlsYXIpIHRoYXQgZG9uJ3QKICB1bmRlcnN0YW5kIEVQU1YgYW5kIHRoZW4gdGhleSBkb24ndCBhbGxvdyB0aGUgc2Vjb25kIGNvbm5lY3Rpb24gdW5sZXNzIFBBU1YKICB3YXMgdXNlZC4gVGhpcyBhbHNvIGNhbGxlZCBmb3IgYSBtaW5vciBmaXggb2YgdGVzdCBjYXNlIDIzOC4KCkRhbmllbCAoMjAgSmFudWFyeSAyMDA2KQotIER1YW5lIENhdGhleSB3YXMgb25lIG9mIG91ciBmcmllbmRzIHdobyByZXBvcnRlZCB0aGF0IGN1cmwgLVAgW0lQXQogIChDVVJMT1BUX0ZUUFBPUlQpIGRpZG4ndCB3b3JrIGZvciBJUHY2LWVuYWJlZCBjdXJscyBpZiB0aGUgSVAgd2Fzbid0IGEKICAibmF0aXZlIiBJUCB3aGlsZSBpdCB3b3JrcyBmaW5lIGZvciBJUHY2LWRpc2FibGVkIGJ1aWxkcyEKCiAgSW4gdGhlIHByb2Nlc3Mgb2YgZml4aW5nIHRoaXMsIEkgcmVtb3ZlZCB0aGUgc3VwcG9ydCBmb3IgTFBSVCBzaW5jZSBJIGNhbid0CiAgdGhpbmsgb2YgbWFueSByZWFzb25zIHRvIGtlZXAgZG9pbmcgaXQgYW5kIGFza2luZyBvbiB0aGUgbWFpbGluZyBsaXN0IGRpZG4ndAogIHJldmVhbCBhbnlvbmUgZWxzZSB0aGF0IGNvdWxkIGVpdGhlci4gVGhlIGNvZGUgdGhhdCBzZW5kcyBFUFJUIGFuZCBQT1JUIGlzCiAgbm93IGFsc28gYSBsb3Qgc2ltcGxlciB0aGFuIGJlZm9yZSAoSU1ITykuCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwNikKLSBKb24gVHVybmVyIHBvaW50ZWQgb3V0IHRoYXQgZG9pbmcgLVAgW2hvc3RuYW1lXSAoQ1VSTE9QVF9GVFBQT1JUKSB3aXRoIGN1cmwKICAoYnVpbHQgSVB2NC1vbmx5KSBkaWRuJ3Qgd29yay4KCkRhbmllbCAoMTggSmFudWFyeSAyMDA2KQotIEFzIHJlcG9ydGVkIGluIGJ1ZyAjMTQwODc0MiAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0MDg3NDIpLAogIHRoZSBjb25maWd1cmUgc2NyaXB0IGNvbXBsYWluZWQgYWJvdXQgYSBtaXNzaW5nICJtaXNzaW5nIiBzY3JpcHQgaWYgeW91IHJhbgogIGNvbmZpZ3VyZSB3aXRoaW4gYSBwYXRoIHdob3NlIG5hbWUgaW5jbHVkZWQgb25lIG9yIG1vcmUgc3BhY2VzLiBUaGlzIGlzIGR1ZQogIHRvIGEgZmxhdyBpbiBhdXRvbWFrZSAoMS45LjYgYW5kIGVhcmxpZXIpLiBJJ3ZlIG5vdyB3b3JrZWQgYXJvdW5kIGl0IGJ5CiAgaW5jbHVkaW5nIGFuICJvdmVybG9hZGVkIiB2ZXJzaW9uIG9mIHRoZSBBTV9NSVNTSU5HX0hBU19SVU4gc2NyaXB0IHRoYXQnbGwKICBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIG9uZSBhdXRvbWFrZSBzaGlwcyB3aXRoLiBUaGlzIGtsdWRnZSBuZWVkcyB0byBiZQogIHJlbW92ZWQgb25jZSB3ZSBnZXQgYW4gYXV0b21ha2UgdmVyc2lvbiB3aXRoIHRoaXMgcHJvYmxlbSBjb3JyZWN0ZWQuCiAgUG9zc2libHkgd2UnbGwgdGhlbiBuZWVkIHRvIGNvbnZlcnQgdGhpcyBpbnRvIGEga2x1ZGdlIGRlcGVuZGluZyBvbiB3aGF0CiAgYXV0b21ha2UgdmVyc2lvbiB0aGF0IGlzIHVzZWQgYW5kIHRoYXQgaXMgZ29ubmEgYmUgcGFpbmZ1bCBhbmQgSSBkb24ndCBldmVuCiAgd2FudCB0byB0aGluayBhYm91dCB0aGF0IG5vdy4uLiEKCkRhbmllbCAoMTcgSmFudWFyeSAyMDA2KQotIERhdmlkIFNoYXc6IEhlcmUgaXMgdGhlIGxhdGVzdCBsaWJjdXJsLm00IGF1dG9jb25mIHRlc3RzLiBJdCBpcyB1cGRhdGVkIHdpdGgKICB0aGUgbGF0ZXN0IGZlYXR1cmVzIGFuZCBwcm90b2NvbHMgdGhhdCBsaWJjdXJsIHN1cHBvcnRzIGFuZCBoYXMgYSBtaW5vciBmaXgKICB0byBiZXR0ZXIgZGVhbCB3aXRoIHRoZSBvYnNjdXJlIGNhc2Ugd2hlcmUgc29tZW9uZSBoYXMgbW9yZSB0aGFuIG9uZSBsaWJjdXJsCiAgaW5zdGFsbGVkIGF0IHRoZSBzYW1lIHRpbWUuCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwNikKLSBEYXZpZCBTaGF3IGZpbmFsbHkgcmVtb3ZlZCBhbGwgdHJhY2VzIG9mIEdvcGhlciBhbmQgd2UgYXJlIG5vdyBvZmZpY2lhbGx5CiAgbm90IHN1cHBvcnRpbmcgaXQuIEl0IGhhc24ndCBiZWVuIGZ1bmN0aW9uaW5nIGZvciB5ZWFycyBhbnl3YXksIHNvIHRoaXMgaXMKICBqdXN0IGZpbmFsbHkgc3RhdGluZyB3aGF0IGFscmVhZHkgd2FzIHRydWUuIEFuZCBhIGNsZWFudXAgYXQgdGhlIHNhbWUgdGltZS4KCi0gQnJ5YW4gSGVuZGVyc29uIHR1cm5lZCB0aGUgJ2luaXRpYWxpemVkJyB2YXJpYWJsZSBmb3IgY3VybF9nbG9iYWxfaW5pdCgpCiAgaW50byBhIGNvdW50ZXIsIGFuZCB0aHVzIHlvdSBjYW4gbm93IGRvIG11bHRpcGxlIGN1cmxfZ2xvYmFsX2luaXQoKSBhbmQgeW91CiAgYXJlIHRoZW4gc3VwcG9zZWQgdG8gZG8gdGhlIHNhbWUgYW1vdW50IG9mIGNhbGxzIHRvIGN1cmxfZ2xvYmFsX2NsZWFudXAoKS4KICBCcnlhbiBoYXMgYWxzbyB1cGRhdGVkIHRoZSBkb2NzIGFjY29yZGluZ2x5LgoKRGFuaWVsICgxMyBKYW51YXJ5IDIwMDYpCi0gQW5kcmV3IEJlbmhhbSBmaXhlZCBhIHJhY2UgY29uZGl0aW9uIGluIHRoZSB0ZXN0IHN1aXRlIHRoYXQgY291bGQgY2F1c2UgdGhlCiAgdGVzdCBzY3JpcHQgdG8ga2lsbCBhbGwgcHJvY2Vzc2VzIGluIHRoZSBjdXJyZW50IHByb2Nlc3MgZ3JvdXAhCgpEYW5pZWwgKDEyIEphbnVhcnkgMjAwNikKLSBNaWNoYWVsIEphaG46CgogIEZpeGVkIEZUUF9TS0lQX1BBU1ZfSVAgYW5kIEZUUF9VU0VfRVBTViB0byAiZG8gcmlnaHQiIHdoZW4gdXNlZCBvbiBGVFAgdGhydQogIEhUVFAgcHJveHkuCgogIEZpeGVkIFBST1hZVFVOTkVMIHRvIHdvcmsgZmluZSB3aGVuIHlvdSBkbyBmdHAgdGhyb3VnaCBhIHByb3h5LiAgSXQgd291bGQKICBwcmV2aW91c2x5IG92ZXJ3cml0ZSBpbnRlcm5hbCBtZW1vcnkgYW5kIGNhdXNlIHVucHJlZGljdGVkIGJlaGF2aW91ciEKCkRhbmllbCAoMTEgSmFudWFyeSAyMDA2KQotIEkgZGVjaWRlZCB0byBkb2N1bWVudCB0aGUgInNlY3JldCBvcHRpb24iIGhlcmUgbm93LCBhcyBJJ3ZlIHJlY2VpdmVkICpOTyoKICBmZWVkYmFjayBhdCBhbGwgb24gbXkgbWFpbGluZyBsaXN0IHJlcXVlc3RzIGZyb20gTm92ZW1iZXIgMjAwNToKCiAgSSdtIGxvb2tpbmcgZm9yIGZlZWRiYWNrIGFuZCBjb21tZW50cy4gSSBhZGRlZCBzb21lIGV4cGVyaW1lbnRhbCBjb2RlIHRoZQogIG90aGVyIGRheSwgdGhhdCBhbGxvd3MgYSBsaWJjdXJsIHVzZXIgdG8gc2VsZWN0IHdoYXQgbWV0aG9kIGxpYmN1cmwgc2hvdWxkCiAgdXNlIHRvIHJlYWNoIGEgZmlsZSBvbiBhIEZUUChTKSBzZXJ2ZXIuCgogIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUgaW4gQ1ZTIGNvZGUgYW5kIGluIHJlY2VudCBkYWlseSBzbmFwc2hvdHMuCgogIExldCBtZSBleHBsYWluLi4uCgogIFRoZSBjdXJyZW50IG5hbWUgZm9yIHRoZSBvcHRpb24gaXMgQ1VSTE9QVF9GVFBfRklMRU1FVEhPRCAoLS1mdHAtbWV0aG9kIGZvcgogIHRoZSBjb21tYW5kIGxpbmUgdG9vbCkgYW5kIHlvdSBzZXQgaXQgdG8gYSBsb25nICh0aGVyZSBhcmUgY3VycmVubHkgbm8KICBkZWZpbmVzIGZvciB0aGUgYXJndW1lbnQgdmFsdWVzLCBqdXN0IHBsYWluIG51bWVyaWNhbHMpLiBZb3UgY2FuIHNldCB0aHJlZQogIGRpZmZlcmVudCAibWV0aG9kcyIgdGhhdCBkbyB0aGlzOgoKICAxIG11bHRpY3dkIC0gbGlrZSB0b2RheSwgY3VybCB3aWxsIGRvIGEgc2luZ2xlIENXRCBvcGVyYXRpb24gZm9yIGVhY2ggcGF0aAogICAgICAgICAgIHBhcnQgaW4gdGhlIGdpdmVuIFVSTC4gRm9yIGRlZXAgaGllcmFyY2hpZXMgdGhpcyBtZWFucyB2ZXJ5IG1hbnkKICAgICAgICAgICBjb21tYW5kcy4gVGhpcyBpcyBob3cgUkZDMTczOCBzYXlzIGl0IHNob3VsZCBiZSBkb25lLiBUaGlzIGlzIHRoZQogICAgICAgICAgIGRlZmF1bHQuCgogIDIgbm9jd2QgLSBubyBDV0QgYXQgYWxsIGlzIGRvbmUsIGN1cmwgd2lsbCBkbyBTSVpFLCBSRVRSLCBTVE9SIGV0YyBhbmQgZ2l2ZQogICAgICAgICAgIGEgZnVsbCBwYXRoIHRvIHRoZSBzZXJ2ZXIuCgogIDMgc2luZ2xlY3dkIC0gbWFrZSBvbmUgQ1dEIHdpdGggdGhlIGZ1bGwgdGFyZ2V0IGRpcmVjdG9yeSBhbmQgdGhlbiBvcGVyYXRlCiAgICAgICAgICAgIG9uIHRoZSBmaWxlICJub3JtYWxseSIuCgogIChXaXRoIHRoZSBjb21tYW5kIGxpbmUgdG9vbCB5b3UgZG8gLS1mdHAtbWV0aG9kIFtNRVRIT0RdLCB3aGVyZSBbTUVUSE9EXSBpcwogIG9uZSBvZiAibXVsdGljd2QiLCAibm9jd2QiIG9yICJzaW5nbGVjd2QiLikKCiAgV2hhdCBmZWVkYmFjayBJJ20gaW50ZXJlc3RlZCBpbjoKCiAgMSAtIERvIHRoZXkgd29yayBhdCBhbGw/IERvIHlvdSBmaW5kIHNlcnZlcnMgd2hlcmUgb25lIG9mIHRoZXNlIGRvbid0IHdvcms/CgogIDIgLSBXaGF0IHdvdWxkIHByb3BlciBuYW1lcyBmb3IgdGhlIG9wdGlvbiBhbmQgaXRzIGFyZ3VtZW50cyBiZSwgaWYgd2UKICAgICAgY29uc2lkZXIgdGhpcyBmZWF0dXJlIGdvb2QgZW5vdWdoIHRvIGdldCBpbmNsdWRlZCBhbmQgZG9jdW1lbnRlZCBpbgogICAgICB1cGNvbWluZyByZWxlYXNlcz8KCiAgMyAtIFNob3VsZCB3ZSBtYWtlIGxpYmN1cmwgYWJsZSB0byAid2FsayB0aHJvdWdoIiB0aGVzZSBvcHRpb25zIGluIGNhc2Ugb2YKICAgICAgKHBhdGggcmVsYXRlZCkgZmFpbHVyZXMsIG9yIHNob3VsZCBpdCBmYWlsIGFuZCBsZXQgdGhlIHVzZXIgcmVkbyBhbnkKICAgICAgcG9zc2libGUgcmV0cmllcz8KCiAgKFRoaXMgb3B0aW9uIGlzIG5vdCBkb2N1bWVudGVkIGluIGFueSBtYW4gcGFnZSBqdXN0IHlldCBzaW5jZSBJJ20gbm90IHN1cmUKICB0aGVzZSBuYW1lcyB3aWxsIGJlIHVzZWQgb3IgaWYgdGhlIGZ1bmN0aW9uYWxpdHkgd2lsbCBlbmQgdXAgZXhhY3RseSBsaWtlCiAgdGhpcy4gIEFuZCBmb3IgdGhlIHNhbWUgcmVhc29ucyB3ZSBoYXZlIG5vIHRlc3QgY2FzZXMgZm9yIHRoZXNlIHlldC4pCgpEYW5pZWwgKDEwIEphbnVhcnkgMjAwNikKLSBXaGVuIHVzaW5nIGEgYmFkIHBhdGggb3ZlciBGVFAsIGFzIGluIHdoZW4gbGliY3VybCBjb3VsZG4ndCBDV0QgaW50byBhbGwKICBnaXZlbiBzdWJkaXJzLCBsaWJjdXJsIHdvdWxkIHN0aWxsICJyZW1lbWJlciIgdGhlIGZ1bGwgcGF0aCBhcyBpZiBpdCBpcyB0aGUKICBjdXJyZW50IGRpcmVjdG9yeSBsaWJjdXJsIGlzIGluIHNvIHRoYXQgdGhlIG5leHQgY3VybF9lYXN5X3BlcmZvcm0oKSB3b3VsZAogIGdldCByZWFsbHkgY29uZnVzZWQgaWYgaXQgdHJpZWQgdGhlIHNhbWUgcGF0aCBhZ2FpbiAtIGFzIGl0IHdvdWxkIG5vdCBpc3N1ZQogIGFueSBDV0QgY29tbWFuZHMgYXQgYWxsLCBhc3N1bWluZyBpdCBpcyBhbHJlYWR5IGluIHRoZSAicHJvcGVyIiBkaXIuCgogIFN0YXJ0aW5nIG5vdywgYSBmYWlsZWQgQ1dEIGNvbW1hbmQgc2V0cyBhIGZsYWcgdGhhdCBwcmV2ZW50cyB0aGUgcGF0aCB0byBiZQogICJyZW1lbWJlcmVkIiBhZnRlciByZXR1cm5pbmcuCgpEYW5pZWwgKDcgSmFudWFyeSAyMDA2KQotIE1pY2hhZWwgSmFobiBmaXhlZCBzbyB0aGF0IHRoZSBzZWNvbmQgQ09OTkVDVCB3aGVuIGRvaW5nIEZUUCBvdmVyIGEgSFRUUAogIHByb3h5IGFjdHVhbGx5IHVzZWQgYSBuZXcgY29ubmVjdGlvbiBhbmQgbm90IHNlbnQgdGhlIHNlY29uZCByZXF1ZXN0IG9uIHRoZQogIGZpcnN0IHNvY2tldCEKCkRhbmllbCAoNiBKYW51YXJ5IDIwMDYpCi0gQWxleGFuZGVyIExhemljIG1hZGUgdGhlIGJ1aWxkY29uZiBydW4gdGhlIGJ1aWxkY29uZiBpbiB0aGUgYXJlcyBkaXIgaWYgdGhhdAogIGlzIHByZXNlbnQgaW5zdGVhZCBvZiB0cnlpbmcgdG8gbWltaWMgdGhhdCBzY3JpcHQgaW4gY3VybCdzIGJ1aWxkY29uZgogIHNjcmlwdC4KCkRhbmllbCAoMyBKYW51YXJ5IDIwMDYpCi0gQW5kcmVzIEdhcmNpYSBtYWRlIHRoZSBURlRQIHRlc3Qgc2VydmVyIGJ1aWxkIHdpdGggbWluZ3cuCkRhbmllbCAoMTYgRGVjZW1iZXIgMjAwNSkKLSBKZWFuIEphY3F1ZXMgRHJvdWluIHBvaW50ZWQgb3V0IHRoYXQgeW91IGNvdWxkIG9ubHkgaGF2ZSBhIHVzZXIgbmFtZSBvcgogIHBhc3N3b3JkIG9mIDEyNyBieXRlcyBvciBsZXNzIGVtYmVkZGVkIGluIGEgVVJMLCB3aGVyZSBhY3R1YWxseSB0aGUgY29kZQogIHVzZXMgYSAyNTUgYnl0ZSBidWZmZXIgZm9yIGl0ISBNb2RpZmllZCBub3cgdG8gdXNlIHRoZSBmdWxsIGJ1ZmZlciBzaXplLgoKRGFuaWVsICgxMiBEZWNlbWJlciAyMDA1KQotIERvdiBNdXJpayBjb3JyZWN0ZWQgdGhlIEhUVFBfT05MWSBkZWZpbmUgdG8gZGlzYWJsZSB0aGUgVEZUUCBzdXBwb3J0IHByb3Blcmx5CgpWZXJzaW9uIDcuMTUuMSAoNyBEZWNlbWJlciAyMDA1KQoKRGFuaWVsICg2IERlY2VtYmVyIDIwMDUpCi0gRnVsbCB0ZXh0IGhlcmU6IGh0dHBzOi8vY3VybC5oYXh4LnNlL2RvY3MvYWR2XzIwMDUxMjA3Lmh0bWwgUG9pbnRlZCBvdXQgYnkKICBTdGVmYW4gRXNzZXIuCgogIFZVTE5FUkFCSUxJVFkKCiAgbGliY3VybCdzIFVSTCBwYXJzZXIgZnVuY3Rpb24gY2FuIG92ZXJmbG93IGEgbWFsbG9jZWQgYnVmZmVyIGluIHR3byB3YXlzLCBpZgogIGdpdmVuIGEgdG9vIGxvbmcgVVJMLgoKICBUaGVzZSBvdmVyZmxvd3MgaGFwcGVuIGlmIHlvdQoKICAxIC0gcGFzcyBpbiBhIFVSTCB3aXRoIG5vIHByb3RvY29sIChsaWtlICJodHRwOi8vIikgcHJlZml4LCB1c2luZyBubyBzbGFzaAogICAgICBhbmQgdGhlIHN0cmluZyBpcyAyNTYgYnl0ZXMgb3IgbG9uZ2VyLiBUaGlzIGxlYWRzIHRvIGEgc2luZ2xlIHplcm8gYnl0ZQogICAgICBvdmVyZmxvdyBvZiB0aGUgbWFsbG9jZWQgYnVmZmVyLgoKICAyIC0gcGFzcyBpbiBhIFVSTCB3aXRoIG9ubHkgYSBxdWVzdGlvbiBtYXJrIGFzIHNlcGFyYXRvciAobm8gc2xhc2gpIGJldHdlZW4KICAgICAgdGhlIGhvc3QgYW5kIHRoZSBxdWVyeSBwYXJ0IG9mIHRoZSBVUkwuIFRoaXMgbGVhZHMgdG8gYSBzaW5nbGUgemVybyBieXRlCiAgICAgIG92ZXJmbG93IG9mIHRoZSBtYWxsb2NlZCBidWZmZXIuCgogIEJvdGggb3ZlcmZsb3dzIGNhbiBiZSBtYWRlIHdpdGggdGhlIHNhbWUgaW5wdXQgc3RyaW5nLCBsZWFkaW5nIHRvIHR3byBzaW5nbGUKICB6ZXJvIGJ5dGUgb3ZlcndyaXRlcy4KCiAgVGhlIGFmZmVjdGVkIGZsYXcgY2Fubm90IGJlIHRyaWdnZXJlZCBieSBhIHJlZGlyZWN0LCBidXQgdGhlIGxvbmcgVVJMIG11c3QKICBiZSBwYXNzZWQgaW4gImRpcmVjdGx5IiB0byBsaWJjdXJsLiBJdCBtYWtlcyB0aGlzIGEgImxvY2FsIiBwcm9ibGVtLiBPZgogIGNvdXJzZSwgbG90cyBvZiBwcm9ncmFtcyBtYXkgc3RpbGwgcGFzcyBpbiB1c2VyLXByb3ZpZGVkIFVSTHMgdG8gbGliY3VybAogIHdpdGhvdXQgZG9pbmcgbXVjaCBzeW50YXggY2hlY2tpbmcgb2YgdGhlaXIgb3duLCBhbGxvd2luZyBhIHVzZXIgdG8gZXhwbG9pdAogIHRoaXMgdnVsbmVyYWJpbGl0eS4KCiAgVGhlcmUgaXMgbm8ga25vd24gZXhwbG9pdCBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgoKRGFuaWVsICgyIERlY2VtYmVyIDIwMDUpCi0gSmFtaWUgTmV3dG9uIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCdzIGZpbGU6Ly8gY29kZSB3b3VsZCBjbG9zZSgpIGEgemVybwogIGZpbGUgZGVzY3JpcHRvciBpZiBnaXZlbiBhIG5vbi1leGlzdGluZyBmaWxlLgoKRGFuaWVsICgyNCBOb3ZlbWJlciAyMDA1KQotIERvdWcgS2F1Zm1hbiBwcm92aWRlZCBhIHNldCBvZiBwYXRjaGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIERKR1BQCiAgYWdhaW4gdXNpbmcgY29uZmlndXJlLgoKLSBZYW5nIFRzZSBwcm92aWRlZCBhIHdob2xlIHNlcmllcyBvZiBwYXRjaGVzIHRvIGNsZWFyIHVwIGNvbXBpbGVyIHdhcm5pbmdzIG9uCiAgTVNWQyA2LgoKRGFuaWVsICgxNyBOb3ZlbWJlciAyMDA1KQotIEkgZXh0ZW5kZWQgYSBwYXRjaCBmcm9tIERhdmlkIFNoYXcgdG8gbWFrZSBsaWJjdXJsIF9hbHdheXNfIHByb3ZpZGUgYW4gZXJyb3IKICBzdHJpbmcgaW4gdGhlIGdpdmVuIGVycm9yIGJ1ZmZlciB0byBhZGRyZXNzIHRoZSBmbGF3IG1lbnRpb24gb24gMjEgc2VwIDIwMDUuCgpEYW5pZWwgKDE2IE5vdmVtYmVyIDIwMDUpCi0gQXBwbGllZCBBbGJlcnQgQ2hpbidzIHBhdGNoIHRoYXQgbWFrZXMgdGhlIGxpYmN1cmwucGMgcGtnY29uZmlnIGZpbGUgZ2V0CiAgaW5zdGFsbGVkIG9uICdtYWtlIGluc3RhbGwnIHRpbWUuCgpEYW5pZWwgKDE0IE5vdmVtYmVyIDIwMDUpCi0gUXVhZ21pcmUgcmVwb3J0ZWQgdGhhdCBoZSBuZWVkZWQgdG8gcmFpc2UgYSBOVExNIGJ1ZmZlciBmb3IgU1NQSSB0byB3b3JrCiAgcHJvcGVybHkgZm9yIGEgY2FzZSwgYW5kIHNvIHdlIGRpZC4gV2UgcmFpc2VkIGl0IGV2ZW4gZm9yIG5vbi1TU1BJIGJ1aWxkcwogIGJ1dCBpdCBzaG91bGQgbm90IGRvIGFueSBoYXJtLiBodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTM1NjcxNQoKLSBKYW4gS3VuZGVyJ3MgZGViaWFuIGJ1ZyByZXBvcnQKICBodHRwczovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMzODY4MCBpZGVudGlmaWVkIGEgd2VpcmQKICBlcnJvciBtZXNzYWdlIGZvciB3aGVuIHlvdSB0cnkgdG8gdXBsb2FkIGEgZmlsZSBhbmQgdGhlIHJlcXVlc3RlZCBkaXJlY3RvcnkKICBkb2Vzbid0IGV4aXN0IG9uIHRoZSB0YXJnZXQgc2VydmVyLgoKLSBZYW5nIFRzZSBmaXhlZCBjb21waWxlciB3YXJuaW5ncyBpbiBsaWIvc3NsdXNlLmMgd2l0aCBPcGVuU1NMIDAuOS44IGFuZCBpbgogIGxpYi9tZW1kZWJ1Zy5oIHRoYXQgc2hvd2VkIHVwIGluIGhpcyBtc3ZjIGJ1aWxkcy4KCkRhbmllbCAoMTMgTm92ZW1iZXIgMjAwNSkKLSBEZWJpYW4gYnVnIHJlcG9ydCAzMzg2ODEgYnkgSmFuIEt1bmRlcjogbWFrZSBjdXJsIGJldHRlciBkZXRlY3QgYW5kIHJlcG9ydAogIGJhZCBsaW1pdC1yYXRlIHVuaXRzOgogIGh0dHBzOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9MzM4NjgxIE5vdyBjdXJsIHdpbGwgcmV0dXJuCiAgZXJyb3IgaWYgYSBiYWQgdW5pdCBpcyB1c2VkLgoKLSBUaGFua3MgdG8gdGhpcyBuaWNlIHN1bW1hcnkgb2YgcG9sbCgpIGltcGxlbWVudGF0aW9uczoKICBodHRwOi8vd3d3LmdyZWVuZW5kLm9yZy51ay9yamsvMjAwMS8wNi9wb2xsLmh0bWwgYW5kIGZ1cnRoZXIgdGVzdHMgYnkgRXVnZW5lCiAgS290bHlhcm92LCB3ZSBub3cga25vdyB0aGF0IGN5Z3dpbidzIHBvbGwgcmV0dXJucyBvbmx5IFBPTExIVVAgb24gcmVtb3RlCiAgY29ubmVjdGluIGNsb3N1cmUgc28gd2UgY2hlY2sgZm9yIHRoYXQgY2FzZSAodG9vKSBhbmQgcmUtZW5hYmxlIHBvbGwgZm9yCiAgY3lnd2luIGJ1aWxkcy4KCkRhbmllbCAoMTIgTm92ZW1iZXIgMjAwNSkKLSBFdWdlbmUgS290bHlhcm92IGZvdW5kIG91dCB0aGF0IGN5Z3dpbidzIHBvbGwoKSBmdW5jdGlvbiBpc24ndCBkb2luZyB0aGluZ3MKICByaWdodDogaHR0cHM6Ly9jdXJsLmhheHguc2UvbWFpbC9hcmNoaXZlLTIwMDUtMTEvMDA0NS5odG1sIHNvIHdlIG5vdyBkaXNhYmxlCiAgcG9sbCgpIGFuZCB1c2Ugc2VsZWN0KCkgb24gY3lnd2luIHRvbyAod2UgYWxyZWFkeSBkbyB0aGUgc2FtZSBjaG9pY2Ugb24gTWFjCiAgT1MgWCkKCi0gRGltYSBCYXJza3kgcGF0Y2hlZCBwcm9ibGVtICMxMzQ4OTMwOiB0aGUgR251VExTIGNvZGUgY29tcGxldGVseSBpZ25vcmVkCiAgY2xpZW50IGNlcnRpZmljYXRlcyEgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzQ4OTMwKS4KCkRhbmllbCAoMTAgTm92ZW1iZXIgMjAwNSkKLSBEYXZpZCBMYW5nIGZpeGVkIElQdjYgc3VwcG9ydCBmb3IgVEZUUCEKCi0gSW50cm9kdWNpbmcgcmFuZ2Ugc3RlcHBpbmcgdG8gdGhlIGN1cmwgZ2xvYmJpbmcgc3VwcG9ydC4gTm93IHlvdSBjYW4gc3BlY2lmeQogIHN0ZXAgY291bnRlciBieSBhZGRpbmcgOltudW1dIHdpdGhpbiB0aGUgYnJhY2tldHMgd2hlbiBzcGVjaWZ5aW5nIGEgcmFuZ2U6CgogICBbMS0xMDA6MTBdCiAgIFthLXo6Ml0KCiAgSWYgbm8gc3RlcCBjb3VudGVyIGlzIHNldCwgaXQgZGVmYXVsdHMgdG8gMSBhcyBiZWZvcmU6CgogICBbMS0xMDBdCiAgIFtkLWhdCgpEYW5pZWwgKDggTm92ZW1iZXIgMjAwNSkKLSBSZW1vdmVkIHRoZSB1c2Ugb2YgQUlfQ0FOT05OQU1FIGluIHRoZSBJUHY2LWVuYWJsZWQgcmVzb2x2ZXIgZnVuY3Rpb25zIHNpbmNlCiAgd2UgcmVhbGx5IGhhdmUgbm8gdXNlIGZvciByZXZlcnNlIGxvb2t1cHMgb2YgdGhlIGFkZHJlc3MuCgogIEkgdHJ1bHkgaG9wZSB0aGVzZSBhcmUgdGhlIGxhc3QgcmV2ZXJzZSBsb29rdXBzIHdlIGhhZCBsaW5nZXJpbmcgaW4gdGhlCiAgY29kZSEKCi0gRG1pdHJ5IEJhcnRzZXZpY2ggZGlzY292ZXJlZCBzb21lIGlzc3VlcyBpbiBjb21wYXRpYmlsdHkgb2YgU1NQSS1lbmFibGVkCiAgdmVyc2lvbiBvZiBsaWJjdXJsIHdpdGggZGlmZmVyZW50IFdpbmRvd3MgdmVyc2lvbnMuIEN1cnJlbnQgdmVyc2lvbiBvZgogIGxpYmN1cmwgaW1wb3J0cyBTU1BJIGZ1bmN0aW9ucyBmcm9tIHNlY3VyMzIuZGxsLiBIb3dldmVyLCB1bmRlciBXaW5kb3dzIE5UCiAgNC4wIHRoZXNlIGZ1bmN0aW9ucyBhcmUgbG9jYXRlZCBpbiBzZWN1cml0eS5kbGwsIHVuZGVyIFdpbmRvd3MgOXggLSBpbgogIHNlY3VyMzIuZGxsIGFuZCBXaW5kb3dzIDIwMDAgYW5kIFhQIGNvbnRhaW5zIGJvdGggdGhlc2UgRExMcyAoc2VjdXJpdHkuZGxsCiAganVzdCBmb3J3YXJkcyBjYWxscyB0byBzZWN1cjMyLmRsbCkuCgogIERtaXRyeSdzIHBhdGNoIGxvYWRzIHByb3BlciBsaWJyYXJ5IGR5bmFtaWNhbGx5IGRlcGVuZGluZyBvbiBXaW5kb3dzCiAgdmVyc2lvbi4gRnVuY3Rpb24gSW5pdFNlY3VyaXR5SW50ZXJmYWNlKCkgaXMgdXNlZCB0byBvYnRhaW4gcG9pbnRlcnMgdG8gYWxsCiAgb2YgU1NQSSBmdW5jdGlvbiBpbiBvbmUgc3RydWN0dXJlLgoKRGFuaWVsICgzMSBPY3RvYmVyIDIwMDUpCi0gVmlsbW9zIE5lYmVoYWogaW1wcm92ZWQgbGliY3VybCdzIExEQVAgYWJpbGl0aWVzOgoKICBUaGUgTERBUCBjb2RlIGluIGxpYmN1cmwgY2FuJ3QgaGFuZGxlIExEQVAgc2VydmVycyBvZiBMREFQdjMgbm9yIGJpbmFyeQogIGF0dHJpYnV0ZXMgaW4gTERBUCBvYmplY3RzLiBTbywgSSBtYWRlIGEgcXVpY2sgcGF0Y2ggdG8gYWRkcmVzcyB0aGVzZQogIHByb2JsZW1zLgoKICBUaGUgc29sdXRpb24gaXMgc2ltcGxlOiBpZiB3ZSBjb25uZWN0IHRvIGFuIExEQVAgc2VydmVyLCBmaXJzdCB0cnkgTERBUHYzCiAgKHdoaWNoIGlzIHRoZSBwcmVmZXJyZWQgcHJvdG9jb2wgYXMgb2Ygbm93KSBhbmQgdGhlbiBmYWxsIGJhY2sgdG8gTERBUHYyLgogIEluIGNhc2Ugb2YgYmluYXJ5IGF0dHJpYnV0ZXMsIHdlIGZpcnN0IGNvbnZlcnQgdGhlbSB0byBiYXNlNjQsIGp1c3QgbGlrZSB0aGUKICBvcGVubGRhcCBjbGllbnQgZG9lcy4gSXQgdXNlcyBsZGFwX2dldF92YWx1ZXNfbGVuKCkgaW5zdGVhZCBvZgogIGxkYXBfZ2V0X3ZhbHVlcygpIHRvIGJlIGFibGUgdG8gcmV0cmlldmUgYmluYXJ5IGF0dHJpYnV0ZXMgY29ycmVjdGx5LiBJCiAgZGVmaW5lZCB0aGUgbmVjZXNzYXJ5IExEQVAgbWFjcm9zIGluIGxpYi9sZGFwLmMgdG8gYmUgYWJsZSB0byBjb21waWxlCiAgbGliY3VybCB3aXRob3V0IHRoZSBwcmVzZW5jZSBvZiBsaWJsZGFwCgpEYW5pZWwgKDI3IE9jdG9iZXIgMjAwNSkKLSBOaXMgSm9yZ2Vuc2VuIGZpbGVkIGJ1ZyByZXBvcnQgIzEzMzg2NDgKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMzg2NDgpIHdoaWNoIHJlYWxseSBpcyBtb3JlIG9mIGEKICBmZWF0dXJlIHJlcXVlc3QsIGJ1dCBhbnl3YXkuIEl0IHBvaW50ZWQgb3V0IHRoYXQgLS1tYXgtcmVkaXJzIGRpZCBub3QgYWxsb3cKICBpdCB0byBiZSBzZXQgdG8gMCwgd2hpY2ggdGhlbiB3b3VsZCByZXR1cm4gYW4gZXJyb3IgY29kZSBvbiB0aGUgZmlyc3QKICBMb2NhdGlvbjogZm91bmQuIEJhc2VkIG9uIE5pcycgcGF0Y2gsIG5vdyBsaWJjdXJsIHN1cHBvcnRzIENVUkxPUFRfTUFYUkVESVJTCiAgc2V0IHRvIDAsIG9yIC0xIGZvciBpbmZpbml0eS4gQWRkZWQgdGVzdCBjYXNlIDI3NCB0byB2ZXJpZnkuCgotIHRvbW1pbmtbYXRdcG9zdC5wbCByZXBvcnRlZCBpbiBidWcgcmVwb3J0ICMxMzM3NzIzCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzM3NzIzKSB0aGF0IGN1cmwgY291bGQgbm90IHVwbG9hZAogIGJpbmFyeSBkYXRhIGZyb20gc3RkaW4gb24gV2luZG93cyBpZiB0aGUgZGF0YSBjb250YWluZWQgY29udHJvbC1aIChoZXggMWEpCiAgc2luY2UgdGhhdCBpcyB0cmVhdGVkIGFzIGVuZC1vZi1maWxlIHdoZW4gcmVhZCBpbiB0ZXh0IG1vZGUuIEdpc2xlIFZhbmVtCiAgcG9pbnRlZCBvdXQgdGhlIGZpeCwgYW5kIEkgbWFkZSBib3RoIC1UIGFuZCAtLWRhdGEtYmluYXJ5IHRha2UgYWR2YW50YWdlIG9mCiAgaXQuCgotIEpheiBGcmVzaCBwb2ludGVkIG91dCB0aGF0IGlmIHlvdSB1c2VkICItciBbbnVtYmVyXSIgYXMgd2FzIHdyb25nbHkgZGVzY3JpYmVkCiAgaW4gdGhlIG1hbiBwYWdlLCBjdXJsIHdvdWxkIHNlbmQgYW4gaW52YWxpZCBIVFRQIFJhbmdlOiBoZWFkZXIuIFRoZSBjb3JyZWN0CiAgd2F5IHdvdWxkIGJlIHRvIHVzZSAiLXIgW251bWJlcl0tIiBvciBldmVuICItciAtW251bWJlcl0iLiBTdGFydGluZyBub3csCiAgY3VybCB3aWxsIHdhcm4gaWYgdGhpcyBpcyBkaXNjb3ZlcmVkLCBhbmQgYXV0b21hdGljYWxseSBhcHBlbmQgYSBkYXNoIHRvIHRoZQogIHJhbmdlIGJlZm9yZSBwYXNzaW5nIGl0IHRvIGxpYmN1cmwuCgpEYW5pZWwgKDI1IE9jdG9iZXIgMjAwNSkKLSBBbW9sIFBhdHRla2FyIHJlcG9ydGVkIGEgYnVnIHdpdGggZ3JlYXQgZGV0YWlsIGFuZCBhIGZpbmUgZXhhbXBsZSBpbiBidWcKICAjMTMyNjMwNiAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMjYzMDYpLiBXaGVuIHVzaW5nIHRoZSBtdWx0aQogIGludGVyZmFjZSBhbmQgY29ubmVjdGluZyB0byBhIGhvc3Qgd2l0aCBtdWx0aXBsZSBJUCBhZGRyZXNzZXMsIGFuZCBvbmUgb2YKICB0aGUgYWRkcmVzc2VzIGZhaWxzIHRvIGNvbm5lY3QgKHRoZSBzZXJ2ZXIgbXVzdCBleGlzdCBhbmQgcmVzcG9uZCwganVzdCBub3QKICBhY2NlcHQgY29ubmVjdGlvbnMpIGxpYmN1cmwgbGVha3MgYSBzb2NrZXQgZGVzY3JpcHRvci4gVGhhbmtzIHRvIHRoZSBmaW5lCiAgcmVwb3J0LCBJIGNvdWxkIGZpbmQgYW5kIGZpeCB0aGlzLgoKRGFuaWVsICgyMiBPY3RvYmVyIDIwMDUpCi0gRGltYSBCYXJza3kgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggR251VExTLWVuYWJsZWQgbGliY3VybCBpbiBidWcgcmVwb3J0CiAgIzEzMzQzMzggKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzM0MzM4KS4gV2hlbiByZWFkaW5nIGFuIFNTTAogIHN0cmVhbSBmcm9tIGEgc2VydmVyIGFuZCB0aGUgc2VydmVyIHJlcXVlc3RzIGEgInJlaGFuZHNoYWtlIiwgdGhlIGN1cnJlbnQKICBjb2RlIHNpbXBseSByZXR1cm5zIHRoaXMgYXMgYW4gZXJyb3IuIEkgaGF2ZSBubyBnb29kIHdheSB0byB0ZXN0IHRoaXMsIGJ1dAogIEkndmUgYWRkZWQgYSBjcnVkZSBhdHRlbXB0IG9mIGRlYWxpbmcgd2l0aCB0aGlzIHNpdHVhdGlvbiBzbGlnaHRseSBiZXR0ZXIgLQogIGl0IG1ha2VzIGEgYmxvY2tpbmcgaGFuZHNoYWtlIGlmIHRoaXMgaGFwcGVucy4gRG9uZSBsaWtlIHRoaXMgYmVjYXVzZSBmaXhpbmcKICB0aGlzIHRoZSAicHJvcGVyIiB3YXkgKHRoYXQgd291bGQgaGFuZHNoYWtlIGFzeW5jaHJvbm91c2x5KSB3aWxsIHJlcXVpcmUKICBxdWl0ZSBzb21lIHdvcmsgYW5kIEkgcmVhbGx5IG5lZWQgYSBnb29kIHdheSB0byB0ZXN0IHRoaXMgdG8gZG8gc3VjaCBhCiAgY2hhbmdlLgoKRGFuaWVsICgyMSBPY3RvYmVyIDIwMDUpCi0gIk9mZXIiIHJlcG9ydGVkIGEgcHJvYmxlbSB3aGVuIGxpYmN1cmwgcmUtdXNlZCBhIGNvbm5lY3Rpb24gYW5kIGZhaWxlZCB0byBkbwogIGl0LCBpdCBjb3VsZCB0aGVuIGFjY2lkZW50YWxseSBhY3R1YWxseSBjcmFzaC4gUHJlc3VtYWJseSwgdGhpcyBjb25jZXJucyBGVFAKICBjb25uZWN0aW9ucy4gIGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzMwMzEwCgotIFRlbXByaW11cyBpbXByb3ZlZCB0aGUgTVNWQyBtYWtlZmlsZSBzbyB0aGF0IHRoZSBzdGF0aWMgZGVidWcgU1NMIGxpYnMgYXJlCiAgbGlua2VkIHRvIHRoZSBleGVjdXRhYmxlIGFuZCBub3QgdG8gdGhlIGxpYmN1cmxkLmxpYgogIGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzI2Njc2CgotIEJyYWRmb3JkIEJydWNlIG1hZGUgdGhlIHdpbmRvd3MgcmVzb2x2ZXIgY29kZSBwcm9wZXJseSByZXR1cm4KICBDVVJMRV9DT1VMRE5UX1JFU09MVkVfUFJPWFkgYW5kIENVUkxFX0NPVUxETlRfUkVTT0xWRV9IT1NUIG9uIHJlc29sdmluZwogIGVycm9ycyAoYXMgZG9jdW1lbnRlZCkuCgpEYW5pZWwgKDIwIE9jdG9iZXIgMjAwNSkKLSBEYXZlIERyaWJpbiBtYWRlIGxpYmN1cmwgdW5kZXJzdGFuZCBhbmQgaGFuZGxlIGNhc2VzIHdoZW4gdGhlIHNlcnZlcgogICh3cm9uZ2x5KSBzZW5kcyAqdHdvKiBXV1ctQXV0aGVudGljYXRlIGhlYWRlcnMgZm9yIERpZ2VzdC4gV2hpbGUgdGhpcyBzaG91bGQKICBuZXZlciBoYXBwZW4gaW4gYSBzYW5lIHdvcmxkLCBsaWJjdXJsIHByZXZpb3VzbHkgZ290IGludG8gYW4gaW5maW5pdGUgbG9vcAogIHdoZW4gdGhpcyBvY2N1cnJlZC4gRGF2ZSBhZGRlZCB0ZXN0IDI3MyB0byB2ZXJpZnkgdGhpcy4KCi0gVGVtcHJpbXVzIGltcHJvdmVkIHRoZSBNU1ZDIG1ha2VmaWxlOiAibWFrZXMgYSBidWlsZCBvcHRpb24gYXZhaWxhYmxlIHNvIGlmCiAgeW91IHNldCBydGxpYmNmZz1zdGF0aWMgZm9yIHRoZSBtYWtlLCB0aGVuIGl0IHdvdWxkIGJ1aWxkIHdpdGggL01ULiBUaGUKICBkZWZhdWx0IGJlaGF2aW91ciBpcyAvTUQgKHRoZSBvcmlnaW5hbCkuIgogIGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzI2NjY1CgpEYW5pZWwgKDE0IE9jdG9iZXIgMjAwNSkKLSBSZXZlcnRlZCB0aGUgTElCQ1VSTF9WRVJTSU9OX05VTSBjaGFuZ2UgZnJvbSBPY3RvYmVyIDYuIEFzIERhdmUgRHJpYmluCiAgcmVwb3J0ZWQsIHRoZSBkZWZpbmUgaXMgdXNlZCBieSB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQgaXMgYXNzdW1lZCB0byB1c2UKICB0aGUgMHhZWVhYWlogZm9ybWF0LiBUaGlzIG1hZGUgImN1cmwtY29uZmlnIC0tdmVybnVtIiBmYWlsIGluIHRoZSA3LjE1LjAKICByZWxlYXNlIHZlcnNpb24uCgpWZXJzaW9uIDcuMTUuMCAoMTMgT2N0b2JlciAyMDA1KQoKRGFuaWVsICgxMiBPY3RvYmVyIDIwMDUpCi0gTWljaGFlbCBTdXR0b24gb2YgaURFRkVOU0UgcmVwb3J0ZWQgYW5kIEkgZml4ZWQgYSBzZWN1cml0ZnkgZmxhdyBpbiB0aGUgTlRMTQogIGNvZGUgdGhhdCB3b3VsZCBvdmVyZmxvdyBhIGJ1ZmZlciBpZiBnaXZlbiBhIHRvbyBsb25nIHVzZXIgbmFtZSBvciBkb21haW4KICBuYW1lLiBUaGlzIHdvdWxkIGhhcHBlbiBpZiB5b3UgZW5hYmxlIE5UTE0gYXV0aGVudGljYXRpb24gYW5kIGVpdGhlcgoKICBBIC0gcGFzcyBpbiBhIHVzZXIgbmFtZSBhbmQgZG9tYWluIG5hbWUgdG8gbGliY3VybCB0aGF0IHRvZ2V0aGVyIGFyZSBsb25nZXIKICAgICAgdGhhbiAxOTIgYnl0ZXMKCiAgQiAtIGFsbG93IChsaWIpY3VybCB0byBmb2xsb3cgSFRUUCAicmVkaXJlY3RzIiAoTG9jYXRpb246IGFuZCB0aGUKICAgICAgYXBwcm9wcmlhdGUgSFRUUCAzMHggcmVzcG9uc2UgY29kZSkgYW5kIHRoZSBuZXcgVVJMIGNvbnRhaW5zIGEgVVJMIHdpdGgKICAgICAgYSB1c2VyIG5hbWUgYW5kIGRvbWFpbiBuYW1lIHRoYXQgdG9nZXRoZXIgYXJlIGxvbmdlciB0aGFuIDE5MiBieXRlcwoKICBTZWUgaHR0cHM6Ly9jdXJsLmhheHguc2UvZG9jcy9zZWN1cml0eS5odG1sIGZvciBmdXJ0aGVyIGRldGFpbHMgYW5kIHVwZGF0ZXMKCkRhbmllbCAoNSBPY3RvYmVyIDIwMDUpCi0gRGFycnlsIEhvdXNlIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIHVzaW5nIC16IHRvIGRvd25sb2FkIGZpbGVzIGZyb20gRlRQLgogIEl0IHR1cm5lZCBvdXQgdGhhdCBpZiB0aGUgZ2l2ZW4gdGltZSBzdGFtcCB3YXMgZXhhY3QgdGhlIHNhbWUgYXMgdGhlIHJlbW90ZQogIHRpbWUgc3RhbXAsIHRoZSBmaWxlIHdvdWxkIHN0aWxsIHdyb25nbHkgYmUgZG93bmxvYWRlZC4gQWRkZWQgdGVzdCBjYXNlIDI3MgogIHRvIHZlcmlmeS4KCkRhbmllbCAoNCBPY3RvYmVyIDIwMDUpCi0gRG9tZW5pY28gQW5kcmVvbGkgZml4ZWQgYSBtYW4gcGFnZSBtYWxmb3JtYXQgYW5kIHJlbW92ZWQgb2RkICgweGEwKSBieXRlcwogIGZyb20gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCgotIE1pY2hhZWwgV2FsbG5lciByZXBvcnRlZCB0aGF0IHRoZSBkYXRlIHBhcnNlciBoYWQgd3Jvbmcgb2Zmc2V0IHN0b3JlZCBmb3IKICB0aGUgTUVTVCBhbmQgQ0VTVCB0aW1lIHpvbmVzLgoKRGFuaWVsICgyNyBTZXB0ZW1iZXIgMjAwNSkKLSBEYXZpZCBZYW4gZmlsZWQgYnVnICMxMjk5MTgxIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTI5OTE4MSkKICB0aGF0IGlkZW50aWZpZWQgYSBzaWxseSBwcm9ibGVtIHdpdGggQ29udGVudC1SYW5nZTogaGVhZGVycyB3aXRoIHRoZSAnYnl0ZXMnCiAga2V5d29yZCB3cml0dGVuIGluIGEgZGlmZmVyZW50IGNhc2UgdGhhbiBhbGwgbG93ZXJjYXNlISBJdCB3b3VsZCBjYXVzZSBhCiAgc2VnZmF1bHQhCgotIFRKIFNhdW5kZXJzIG9mIHRoZSBwcm9mdHBkIHByb2plY3QgaWRlbnRpZmllZCBhbmQgcG9pbnRlZCBvdXQgcHJvYmxlbXMgd2l0aAogIHRoZSBtb2RpZmllZCBGVFBTIG5lZ290aWF0aW9uIGNoYW5nZSBvZiBBdWd1c3QgMTkgMjAwNS4gVGh1cywgd2UgcmV2ZXJ0IHRoZQogIGNoYW5nZSBiYWNrIHRvIHByZS03LjE0LjEgc3RhdHVzLgoKRGFuaWVsICgyMSBTZXB0ZW1iZXIgMjAwNSkKLSBGaXhlZCAiY3V0IG9mZiIgc2VudGVuY2UgaW4gdGhlIGxpYmN1cmwtdHV0b3JpYWwgbWFuIHBhZ2U6CiAgaHR0cHM6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMjkzMDUKCi0gQ2xhcmlmaWVkIGluIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlIHdoYXQgdGhlIGRlZmF1bHQKICBDVVJMT1BUX1dSSVRFRlVOQ1RJT04gYW5kIENVUkxPUFRfV1JJVEVEQVRBIG1lYW46CiAgaHR0cHM6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMjkzMTEKCi0gQ2xhcmlmaWVkIGluIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlIHRoYXQgQ1VSTE9QVF9FUlJPUkJVRkZFUgogIHNvbWV0aW1lcyBkb2Vzbid0IGZpbGwgaW4gdGhlIGJ1ZmZlciBldmVuIHRob3VnaCBpdCBpcyBzdXBwb3NlZCB0bzoKICBodHRwczovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMyOTMxMwoKLSBXaGVuIENVUkxFX1VSTF9NQUxGT1JNQVQgaXMgcmV0dXJuZWQgZHVlIHRvIGEgbWlzc2luZyBVUkwsIGl0IG5vdyBoYXMgYW4KICBlcnJvciBzdHJpbmcgc2V0LgoKRGFuaWVsICgxOSBTZXB0ZW1iZXIgMjAwNSkKLSBEbWl0cnkgQmFydHNldmljaCBtYWRlIHRoZSBTU1BJIHN1cHBvcnQgd29yayBvbiBXaW5kb3dzIDl4IGFzIHdlbGwuCgpEYW5pZWwgKDE1IFNlcHRlbWJlciAyMDA1KQotIEFkZGVkIGEgVEZUUCBzZXJ2ZXIgdG8gdGhlIHRlc3Qgc3VpdGUgYW5kIG1hZGUgdGhlIHRlc3Qgc3VpdGUgY2FwYWJsZSBvZgogIHVzaW5nIGl0LgoKRGFuaWVsICg3IFNlcHRlbWJlciAyMDA1KQotIEJlbiBNYWRzZW4ncyBkZXRhaWxlZCByZXBvcnRzIHRoYXQgZnVubmlseSBlbm91Z2ggb25seSBvY2N1cnJlZCB3aXRoIGNlcnRhaW4KICBnbGliYyB2ZXJzaW9ucyB0dXJuZWQgb3V0IHRvIGJlIGN1cmwgdXNpbmcgYW4gYWxyZWFkeSBjbG9zZWQgZmlsZSBoYW5kbGUKICBkdXJpbmcgY2VydGFpbiBjb25kaXRpb25zIChsaWtlIHdoZW4gc2F2aW5nIEZUUCBzZXJ2ZXIgImhlYWRlcnMiKS4KCi0gU2NvdHQgRGF2aXMgaGVscGVkIG1lIHRyYWNrIGRvd24gYSBwcm9ibGVtIGluIHRoZSB0ZXN0IEhUVFAgc2VydmVyIHRoYXQgbWFkZQogIHRlc3QgY2FzZSA1NiB3cm9uZ2x5IGZhaWwgYXQgdGltZXMuIEl0IHR1cm5lZCBvdXQgaXQgd2FzIGR1ZSB0byB0aGUgc2VydmVyCiAgZmluZGluZyB0aGUgZW5kIG9mIGEgY2h1bmtlZC1lbmNvZGVkIFBPU1QgdG9vIGVhcmx5LgoKRGFuaWVsICg2IFNlcHRlbWJlciAyMDA1KQotIE5vdyBjdXJsIHdhcm5zIGlmIGFuIHVua25vd24gdmFyaWFibGUgaXMgdXNlZCBpbiB0aGUgLXcvLS13cml0ZW91dCBhcmd1bWVudC4KCkRhbmllbCAoNCBTZXB0ZW1iZXIgMjAwNSkKLSBJIGFwcGxpZWQgTmljb2xhcyBGcmFu529pcycgbWFuIHBhZ2UgcGF0Y2ggaGUgcG9zdGVkIHRvIHRoZSBEZWJpYW4gYnVnCiAgdHJhY2tlci4gSXQgY29ycmVjdGVkIHR3byBsaW5lcyB0aGF0IHN0YXJ0ZWQgd2l0aCBhcG9zdHJvcGhlcywgd2hpY2ggaXNuJ3QKICBsZWdhbCBucm9mZiBmb3JtYXQuIGh0dHBzOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9MzI2NTExCgotIEFkZGVkIC0tZnRwLXNraXAtcGFzdi1pcCB0byB0aGUgY29tbWFuZCBsaW5lIHRvb2wsIHRoYXQgc2V0cyB0aGUgbmV3CiAgQ1VSTE9QVF9GVFBfU0tJUF9QQVNWX0lQIG9wdGlvbi4gSXQgbWFrZXMgbGliY3VybCByZS11c2UgdGhlIGNvbnRyb2wKICBjb25uZWN0aW9uJ3MgSVAgYWRkcmVzcyB3aGVuIHNldHRpbmcgdXAgdGhlIGRhdGEgY29ubmVjdGlvbiBpbnN0ZWFkIG9mCiAgZXh0cmFjdHRpbmcgdGhlIElQIGFkZHJlc3MgZnJvbSB0aGUgUEFTViByZXNwb25zZS4gSXQgaGFzIHR1cm5lZCBvdXQgdGhpcwogIGZlYXR1cmUgaXMgZnJlcXVlbnRseSBuZWVkZWQgYnkgcGVvcGxlIHRvIGNpcmN1bXZlbnQgc2lsbHkgc2VydmVycyBhbmQgc2lsbHkKICBmaXJld2FsbHMsIGVzcGVjaWFsbHkgd2hlbiBGVFBTIGlzIHVzZWQgYW5kIHRoZSBQQVNWIGNvbW1hbmQtcmVzcG9uc2UgaXMKICBzZW50IGVuY3J0eXBlZC4KCiAgU3BvbnNvcmVkIGJ5IENVKkFuc3dlcnMKCkRhbmllbCAoMSBTZXB0ZW1iZXIgMjAwNSkKLSBKb2huIEtlbGx5IGFkZGVkIFRGVFAgc3VwcG9ydCB0byBsaWJjdXJsLiBBIGJ1bmNoIG9mIG5ldyBlcnJvciBjb2RlcyB3YXMKICBhZGRlZC4gVE9ETzogYWRkIHRoZW0gdG8gZG9jcy4gYWRkIFRGVFAgc2VydmVyIHRvIHRlc3Qgc3VpdGUuIGFkZCBURlRQIHRvCiAgbGlzdCBvZiBwcm90b2NvbHMgd2hlcmVldmVyIHRob3NlIGFyZSBtZW50aW9uZWQuCgpWZXJzaW9uIDcuMTQuMSAoMSBTZXB0ZW1iZXIgMjAwNSkKCkRhbmllbCAoMjkgQXVndXN0IDIwMDUpCi0gS2V2aW4gTHVzc2llciBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBjdXJsbGliLmRzcCBhbmQgaG93IHRvIGZpeCBpdC4KCi0gSWdvciBQb2x5YWtvdiBmaXhlZCBhIHJhdGhlciBuYXN0eSBwcm9ibGVtIHdpdGggdGhlIHRocmVhZGVkIG5hbWUgcmVzb2x2ZXIKICBmb3IgV2luZG93cywgdGhhdCBjb3VsZCBsZWFkIHRvIGFuIEFjY2VzcyBWaW9sYXRpb24gd2hlbiB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgd2FzIHVzZWQgZHVlIHRvIGFuIGlzc3VlIHdpdGggaG93IHRoZSByZXNvbHZlciB0aHJlYWQgd2FzIGFuZCB3YXMgbm90CiAgdGVybWluYXRlZC4KCi0gU2ltb24gSm9zZWZzc29uIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGFsbG93cyBjdXJsIHRvIGdldCBidWlsdCB0byB1c2UgR05VIEdTUwogIGluc3RlYWQgb2YgTUlUL0hlaW1kYWwgZm9yIEdTUyBjYXBhYmlsaXRpZXMuCgpEYW5pZWwgKDI0IEF1Z3VzdCAyMDA1KQotIFRvYnkgUGV0ZXJzb24gYWRkZWQgQ1VSTE9QVF9JR05PUkVfQ09OVEVOVF9MRU5HVEggdG8gdGhlIGxpYnJhcnksIGFjY2Vzc2libGUKICBmcm9tIHRoZSBjb21tYW5kIGxpbmUgdG9vbCB3aXRoIC0taWdub3JlLWNvbnRlbnQtbGVuZ3RoLiBUaGlzIHdpbGwgbWFrZSBpdAogIGVhc2llciB0byBkb3dubG9hZCBmaWxlcyBmcm9tIEFwYWNoZSAxLnggKGFuZCBzaW1pbGFyKSBzZXJ2ZXJzIHRoYXQgYXJlCiAgc3RpbGwgaGF2aW5nIHByb2JsZW1zIHNlcnZpbmcgZmlsZXMgbGFyZ2VyIHRoYW4gMiBvciA0IEdCLiBXaGVuIHRoaXMgb3B0aW9uCiAgaXMgZW5hYmxlZCwgY3VybCB3aWxsIHNpbXBseSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gY2xvc2UgdGhlCiAgY29ubmVjdGlvbiB0byBzaWduYWwgZW5kIG9mIHRyYW5zZmVyLiBJIHdyb3RlIHRlc3QgY2FzZSAyNjkgdGhhdCBydW5zIGEKICBzaW1wbGUgdGVzdCB0byB2ZXJpZnkgdGhhdCB0aGlzIHdvcmtzLgoKLSAoVHJ5aW5nIGhhcmQgdG8gZXhjbHVkZSBlbW90aW9ucyBub3cuKSB2YWxncmluZCB2ZXJzaW9uIDMgc3VkZGVubHkgcmVuYW1lZAogIHRoZSAtLWxvZ2ZpbGUgY29tbWFuZCBsaW5lIG9wdGlvbiB0byAtLWxvZy1maWxlLCBhbmQgdGh1cyB0aGUgdGVzdCBzY3JpcHQKICB2YWxncmluZCBhdXRvZGV0ZWN0aW9uIG5vdyBoYXMgeWV0IGFub3RoZXIgdmVyc2lvbiBjaGVjayB0byBkbyBhbmQgdGhlbiBpdAogIGFsdGVycyB0aGUgdmFsZ3JpbmQgY29tbWFuZCBsaW5lIGFjY29yZGluZ2x5LgoKLSBGaXhlZCBDQSBjZXJ0IHZlcmlmaWNhdGlvbiB1c2luZyBHbnVUTFMgd2l0aCB0aGUgZGVmYXVsdCBidW5kbGUsIHdoaWNoCiAgcHJldmlvdXNseSBmYWlsZWQgZHVlIHRvIEdudVRMUyBub3QgYWxsb3dpbmcgeDUwOSB2MSBDQSBjZXJ0cyBieSBkZWZhdWx0LgogIFJhbHBoIE1pdGNoZWxsIHJlcG9ydGVkLgoKRGFuaWVsICgxOSBBdWd1c3QgMjAwNSkKLSBOb3JiZXJ0IE5vdm90bnkgaGFkIHByb2JsZW1zIHdpdGggRlRQUyBhbmQgaGUgaGVscGVkIG1lIHdvcmsgb3V0IGEgcGF0Y2gKICB0aGF0IG1hZGUgY3VybCBydW4gZmluZSBpbiBoaXMgZW5kLiBUaGUga2V5IHdhcyB0byBtYWtlIHN1cmUgd2UgZG8gdGhlCiAgU1NML1RMUyBuZWdvdGlhdGlvbiBpbW1lZGlhdGVseSBhZnRlciB0aGUgVENQIGNvbm5lY3QgaXMgZG9uZSBhbmQgbm90IGFmdGVyCiAgYSBmZXcgb3RoZXIgY29tbWFuZHMgaGF2ZSBiZWVuIHNlbnQgbGlrZSB3ZSBkaWQgcHJldmlvdXNseS4gSSBkb24ndCBjb25zaWRlcgogIHRoaXMgY2hhbmdlIG5lY2Vzc2FyeSB0byBvYmV5IHRoZSBzdGFuZGFyZHMsIEkgdGhpbmsgdGhpcyBzZXJ2ZXIgaXMgcGlja2llcgogIHRoYW4gd2hhdCB0aGUgc3BlY3MgYWxsb3cgaXQgdG8gYmUsIGJ1dCBJIGNhbid0IHNlZSBob3cgdGhpcyBtb2RpZmllZAogIGxpYmN1cmwgY29kZSBjYW4gYWRkIGFueSBwcm9ibGVtcyB0byB0aG9zZSB3aG8gYXJlIGludGVycHJldGluZyB0aGUKICBzdGFuZGFyZHMgbW9yZSBsaWJlcmFsbHkuCgpEYW5pZWwgKDE3IEF1Z3VzdCAyMDA1KQotIEplZmYgUG9obG1leWVyIGZvdW5kIG91dCB0aGF0IGlmIHlvdSBhc2sgbGliY3VybCB0byBsb2FkIGEgY29va2llZmlsZSAod2l0aAogIENVUkxPUFRfQ09PS0lFRklMRSksIGFkZCBhIGNvb2tpZSAod2l0aCBDVVJMT1BUX0NPT0tJRUxJU1QpLCB0ZWxsIGl0IHRvCiAgd3JpdGUgdGhlIHJlc3VsdCB0byBhIGdpdmVuIGNvb2tpZSBqYXIgYW5kIHRoZW4gbmV2ZXIgYWN0dWFsbHkgY2FsbAogIGN1cmxfZWFzeV9wZXJmb3JtKCkgLSB0aGUgZ2l2ZW4gZmlsZShzKSB0byByZWFkIHdhcyBuZXZlciByZWFkIGJ1dCB0aGUKICBvdXRwdXQgZmlsZSB3YXMgd3JpdHRlbiBhbmQgdGh1cyBpdCBjYXVzZWQgYSAiZnVubnkiIHJlc3VsdC4KCi0gV2hpbGUgZG9pbmcgc29tZSB0ZXN0cyBmb3IgdGhlIGJ1ZyBhYm92ZSwgSSBub3RpY2VkIHRoYXQgRmlyZWZveCBnZW5lcmF0ZXMKICBsYXJnZSBudW1iZXJzIChmb3IgdGhlIGV4cGlyZSB0aW1lKSBpbiB0aGUgY29va2llcy50eHQgZmlsZSBhbmQgbGliY3VybAogIGRpZG4ndCB0cmVhdCB0aGVtIHByb3Blcmx5LiBOb3cgaXQgZG9lcy4KCkRhbmllbCAoMTUgQXVndXN0IDIwMDUpCi0gQWRkZWQgbW9yZSB2ZXJib3NlICJ3YXJuaW5nIiBtZXNzYWdlcyB0byB0aGUgY3VybCBjbGllbnQgZm9yIGNhc2VzIHdoZXJlIGl0CiAgZmFpbHMgdG8gb3Blbi9yZWFkIGZpbGVzIGV0YyB0byBoZWxwIHVzZXJzIGRpYWdub3NlIHdoeSBpdCBkb2Vzbid0IGRvIHdoYXQKICB5b3UnZCBleHBlY3QgaXQgdG8uIENvbnZlcnRlZCBsb3RzIG9mIG9sZCBtZXNzYWdlcyB0byB1c2UgdGhlIG5ldyBnZW5lcmljCiAgZnVuY3Rpb24gSSB3cm90ZSBmb3IgdGhpcyBwdXJwb3NlLgoKRGFuaWVsICgxMyBBdWd1c3QgMjAwNSkKLSBKYW1lcyBCdXJzYSBpZGVudGlmaWVkIGEgbGliY3VybCBIVFRQIGJ1ZyBhbmQgYSBnb29kIHdheSB0byByZXBlYXQgaXQuIElmIGEKICBzaXRlIHJlc3BvbmRzIHdpdGggYmFkIEhUVFAgcmVzcG9uc2UgdGhhdCBkb2Vzbid0IGNvbnRhaW4gYW55IGhlYWRlciBhdCBhbGwsCiAgb25seSBhIHJlc3BvbnNlIGJvZHksIGFuZCB0aGUgd3JpdGUgY2FsbGJhY2sgcmV0dXJucyAwIHRvIGFib3J0IHRoZQogIHRyYW5zZmVyLCBpdCBkaWRuJ3QgaGF2ZSBhbnkgcmVhbCBlZmZlY3QgYnV0IHRoZSB3cml0ZSBjYWxsYmFjayB3b3VsZCBiZQogIGNhbGxlZCBvbmNlIG1vcmUgYW55d2F5LgoKRGFuaWVsICgxMiBBdWd1c3QgMjAwNSkKLSBCYXNlZCBvbiBSaWNoYXJkIENsYXl0b24ncyByZXBvcnRzLCBJIGZvdW5kIG91dCB0aGF0IHVzaW5nIGN1cmwgLWQgQGZpbGVuYW1lCiAgd2hlbiAnZmlsZW5hbWUnIHdhcyBub3QgcG9zc2libGUgdG8gYWNjZXNzIG1hZGUgY3VybCB1c2UgYSBHRVQgcmVxdWVzdAogIGluc3RlYWQuCgotIFRoZSB0aW1lIGNvbmRpdGlvbiBpbGxlZ2FsIHN5bnRheCB3YXJuaW5nIGlzIG5vdyBpbmhpYml0ZWQgaWYgLXMgaXMgdXNlZC4KCkRhbmllbCAoMTAgQXVndXN0IDIwMDUpCi0gTWFyaW8gU2Nocm9lZGVyIGZvdW5kIG91dCB0aGF0IG9uZSBvZiB0aGUgZGVidWcgY2FsbGJhY2tzIGNhbGxzIHRoYXQgcmVnYXJkcwogIFNTTCBkYXRhIHdpdGggdGhlIENVUkxJTkZPX1RFWFQgdHlwZSBjbGFpbWVkIHRoYXQgdGhlIGRhdGEgd2FzIG9uZSBieXRlCiAgbGFyZ2VyIHRoYW4gaXQgYWN0dWFsbHkgaXMsIHRodXMgZmFsc2VseSB0ZWxsaW5nIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHRoZQogIHRlcm1pbmF0aW5nIHplcm8gd2FzIHBhcnQgb2YgdGhlIGRhdGEuCgpEYW5pZWwgKDkgQXVndXN0IDIwMDUpCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIGZpeGVkIHRoZSBvZmZzZXRzIHVzZWQgZm9yIGRhdGUgcGFyc2luZ3Mgd2hlbiB0aGUgdGltZQogIHpvbmUgbmFtZSBvZiBhIGRheWxpZ2h0IHNhdmluZ3MgdGltZSB3YXMgdXNlZC4gRm9yIGV4YW1wbGUsIFBEVCB2cyBQRFMuIFRoaXMKICBmbGF3IHdhcyBpbnRyb2R1Y2VkIHdpdGggdGhlIG5ldyBkYXRlIHBhcnNlciAoMTEgc2VwIDIwMDQgLSA3LjEyLjIpLgogIEZvcnR1bmF0ZWx5LCBubyB3ZWIgc2VydmVyIG9yIGNvb2tpZSBzdHJpbmcgZXRjIHNob3VsZCBiZSB1c2luZyBzdWNoIHRpbWUKICB6b25lIG5hbWVzIHRodXMgbGltaXRpbmcgdGhlIGVmZmVjdCBvZiB0aGlzIGJ1Zy4KCkRhbmllbCAoOCBBdWd1c3QgMjAwNSkKLSBKb24gR3J1YmJzIGZpbGVkIGJ1ZyByZXBvcnQgIzEyNDk5NjIKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyNDk5NjIpIHdoaWNoIGlkZW50aWZpZWQgYSBwcm9ibGVtCiAgd2l0aCBOVExNIG9uIGEgSFRUUCBwcm94eSBpZiBhbiBGVFAgVVJMIHdhcyBnaXZlbi4gbGliY3VybCBub3cgcHJvcGVybHkKICBzd2l0Y2hlcyB0byBwdXJlIEhUVFAgaW50ZXJuYWxseSB3aGVuIGFuIEhUVFAgcHJveHkgaXMgdXNlZCwgZXZlbiBmb3IgRlRQCiAgVVJMcy4gVGhlIHByb2JsZW0gd291bGQgYWxzbyBvY2N1ciB3aXRoIG90aGVyIG11bHRpLXBhc3MgYXV0aCBtZXRob2RzLgoKRGFuaWVsICg3IEF1Z3VzdCAyMDA1KQotIFdoZW4gY3VybCBpcyBidWlsdCB3aXRoIEdudVRMUywgY3VybC1jb25maWcgZGlkbid0IGluY2x1ZGUgIlNTTCIgd2hlbgogIC0tZmVhdHVyZXMgd2FzIHVzZWQuCgpEYW5pZWwgKDI4IEp1bHkgMjAwNSkKLSBJZiBhbnkgb2YgdGhlIG9wdGlvbnMgQ1VSTE9QVF9IVFRQR0VULCBDVVJMT1BUX1BPU1QgYW5kIENVUkxPUFRfSFRUUFBPU1QgaXMKICBzZXQgdG8gMSwgQ1VSTE9QVF9OT0JPRFkgd2lsbCBub3cgYXV0b21hdGljYWxseSBiZSBzZXQgdG8gMC4KCkRhbmllbCAoMjcgSnVseSAyMDA1KQotIERhbiBGYW5kcmljaCBjaGFuZ2VzIG92ZXIgdGhlIGxhc3Qgd2VlazogZml4ZWQgbnVtZXJvdXMgbWlub3IgY29uZmlndXJlCiAgb3B0aW9uIHBhcnNpbmcgZmxhd3M6IC0td2l0aG91dC1nbnV0bHMsIC0td2l0aG91dC1zcG5lZ28gLS13aXRob3V0LWdzc2FwaQogIGFuZCAtLXdpdGhvdXQta3JiNC4gU3BlbGxmaXhlZCBzZXZlcmFsIGVycm9yIG1lc3NhZ2VzLgoKLSBQZXRlcmlzIEtydW1pbnMgYWRkZWQgQ1VSTE9QVF9DT09LSUVMSVNUIGFuZCBDVVJMSU5GT19DT09LSUVMSVNULCB3aGljaCBpcyBhCiAgc2ltcGxlIGludGVyZmFjZSB0byBleHRyYWN0aW5nIGFuZCBzZXR0aW5nIGNvb2tpZXMgaW4gbGliY3VybCdzIGludGVybmFsCiAgImNvb2tpZSBqYXIiLiBTZWUgdGhlIG5ldyBjb29raWVfaW50ZXJmYWNlLmMgZXhhbXBsZSBjb2RlLgoKRGFuaWVsICgxMyBKdWx5IDIwMDUpCi0gRGllZ28gQ2Fzb3JyYW4gcHJvdmlkZWQgcGF0Y2hlcyB0byBtYWtlIGN1cmwgYnVpbGQgZmluZSBvbiBBbWlnYSBhZ2Fpbi4KCkRhbmllbCAoMTIgSnVseSAyMDA1KQotIEFkcmlhbiBTY2h1dXIgYWRkZWQgdHJhaWxlciBzdXBwb3J0IGluIHRoZSBjaHVua2VkIGVuY29kaW5nIHN0cmVhbS4gVGhlCiAgdHJhaWxlciBpcyB0aGVuIHNlbnQgdG8gdGhlIG5vcm1hbCBoZWFkZXIgY2FsbGJhY2svc3RyZWFtLiBJIHdyb3RlIHVwIHRlc3QKICBjYXNlIDI2NiB0byB2ZXJpZnkgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkuIERvIG5vdGUgdGhhdCB0ZXN0IGNhc2UgMzQKICBjb250YWlucyBhIGZsYXdlZCBjaHVua2VkIGVuY29kaW5nIHN0cmVhbSB0aGF0IHN0aWxsIHdvcmtzIHRoZSBzYW1lLgoKRGFuaWVsICg1IEp1bHkgMjAwNSkKLSBHaXNsZSBWYW5lbSBjYW1lIHVwIHdpdGggYSBuaWNlIGxpdHRsZSB3b3JrLWFyb3VuZCBmb3IgYnVnICMxMjMwMTE4CiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjMwMTE4KS4gSXQgc2VlbXMgdGhlIFdpbmRvd3MgKE1TVkMpCiAgbGliYyB0aW1lIGZ1bmN0aW9ucyBtYXkgcmV0dXJuIGRhdGEgb25lIGhvdXIgb2ZmIGlmIFRaIGlzIG5vdCBzZXQgYW5kCiAgYXV0b21hdGljIERTVCBhZGp1c3RtZW50IGlzIGVuYWJsZWQuIFRoaXMgbWFkZSBjdXJsX2dldGRhdGUoKSByZXR1cm4gd3JvbmcKICB2YWx1ZSwgYW5kIGl0IGFsc28gY29uY2VybmVkIGludGVybmFsIGNvb2tpZSBleHBpcmF0aW9ucyBldGMuCgpEYW5pZWwgKDQgSnVseSAyMDA1KQotIEFuZHJldyBCdXNobmVsbCBwcm92aWRlZCBlbm91Z2ggaW5mbyBmb3IgbWUgdG8gdGVsbCB0aGF0IHdlIGJhZGx5IG5lZWRlZCB0bwogIGZpeCB0aGUgQ09OTkVDVCBhdXRoZW50aWNhdGlvbiBjb2RlIHdpdGggbXVsdGktcGFzcyBhdXRoIG1ldGhvZHMgKHN1Y2ggYXMKICBOVExNKSBhcyBpdCBkaWRuJ3QgcHJldmlvdXNseSBwcm9wZXJseSBpZ25vcmUgcmVzcG9uc2UtYm9kaWVzIC0gaW4gZmFjdCBpdAogIHN0b3BwZWQgcmVhZGluZyBhZnRlciBhbGwgcmVzcG9uc2UgaGVhZGVycyBoYWQgYmVlbiByZWNlaXZlZC4gVGhpcyBjb3VsZAogIGxlYWQgdG8gbGliY3VybCBzZW5kaW5nIHRoZSBuZXh0IHJlcXVlc3QgYW5kIHJlYWRpbmcgdGhlIGJvZHkgZnJvbSB0aGUgZmlyc3QKICByZXF1ZXN0IGFzIHJlc3BvbnNlIHRvIHRoZSBzZWNvbmQgcmVxdWVzdC4gKEkgYWxzbyByZW5hbWVkIHRoZSBmdW5jdGlvbiwKICB3aGljaCB3YXNuJ3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IGJ1dC4uLikKCiAgVGhlIGJlc3QgZml4IHdvdWxkIHRvIG9uY2UgYW5kIGZvciBhbGwgbWFrZSB0aGUgQ09OTkVDVCBjb2RlIHVzZSB0aGUKICBvcmRpbmFyeSByZXF1ZXN0IHNlbmRpbmcvcmVjZWl2aW5nIGNvZGUsIHRyZWF0aW5nIGl0IGFzIGFueSBvcmRpbmFyeSByZXF1ZXN0CiAgaW5zdGVhZCBvZiB0aGUgc3BlY2lhbC1wdXJwb3NlIGZ1bmN0aW9uIHdlIGhhdmUgbm93LiBJdCBzaG91bGQgbWFrZSBpdAogIGJldHRlciBmb3IgbXVsdGktaW50ZXJmYWNlIHRvby4gQW5kIHBvc3NpYmx5IGxlYWQgdG8gbGVzcyBjb2RlLi4uCgogIEFkZGVkIHRlc3QgY2FzZSAyNjUgZm9yIHRoaXMuIEl0IGRvZXNuJ3Qgd29yayBhcyBhIF9yZWFsbHlfIGdvb2QgdGVzdCBjYXNlCiAgc2luY2UgdGhlIHRlc3QgcHJveHkgaXMgdG9vIHN0dXBpZCwgYnV0IHRoZSB0ZXN0IGNhc2UgaGVscHMgd2hlbiBydW5uaW5nIHRoZQogIGRlYnVnZ2VyIHRvIHZlcmlmeS4KCkRhbmllbCAoMzAgSnVuZSAyMDA1KQotIERhbiBGYW5kcmljaCBpbXByb3ZlZCB0aGUgY29uZmlndXJlIHNjcmlwdCdzIGFiaWxpdHkgdG8gZmlndXJlIG91dCB3aGF0IGtpbmQKICBvZiBzdHJlcnJvcl9yKCkgQVBJIHRoYXQgaXMgdXNlZCB3aGVuIGNyb3NzLWNvbXBpbGluZy4gSWYgX19HTElCX18gaXMKICBkZWZpbmVkLCBpdCBhc3N1bWVzIHRoZSBnbGliYyBBUEkuIElmIG5vdCwgaXQgaXNzdWVzIGEgbm90aWNlIGFzIGJlZm9yZSB0aGF0CiAgdGhlIHVzZXIgbmVlZHMgdG8gbWFudWFsbHkgZWRpdCBsaWIvY29uZmlnLmggZm9yIHRoaXMuCgpEYW5pZWwgKDIzIEp1bmUgMjAwNSkKLSBEYXZpZCBTaGF3J3MgZml4IHRoYXQgdW5pZmllcyBwcm94eSBzdHJpbmcgdHJlYXRtZW50IHNvIHRoYXQgYSBwcm94eSBnaXZlbgogIHdpdGggQ1VSTE9QVF9QUk9YWSBjYW4gdXNlIGEgaHR0cDovLyBwcmVmaXggYW5kIHVzZXIgKyBwYXNzd29yZC4gVGhlIHVzZXIKICBhbmQgcGFzc3dvcmQgZmllbGRzIGFyZSBub3cgYWxzbyBVUkwgZGVjb2RlZCBwcm9wZXJseS4gVGVzdCBjYXNlIDI2NCBhZGRlZAogIHRvIHZlcmlmeS4KCkRhbmllbCAoMjIgSnVuZSAyMDA1KQotIERhdmlkIFNoYXcgdXBkYXRlZCBsaWJjdXJsLm00CgpEYW5pZWwgKDE0IEp1bmUgMjAwNSkKLSBHaXNsZSBWYW5lbSBmaXhlZCBhIHBvdGVudGlhbCB0aHJlYWQgaGFuZGxlIGxlYWsuIEJ1ZyByZXBvcnQgIzEyMTY1MDAKICAoaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyMTY1MDApLiAgQ29tbWVudCBpbgogIGh0dHBzOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDUtMDYvMDA1OS5odG1sCgpEYW5pZWwgKDEzIEp1bmUgMjAwNSkKLSBNYWRlIGJ1aWxkY29uZiBydW4gbGlidG9vbGl6ZSBpbiB0aGUgYXJlcyBkaXIgdG9vIChpbnNwaXJlZCBieSBUdXBvbmUncwogIHJldmVydGVkIHBhdGNoKS4KCkRhbmllbCAoOSBKdW5lIDIwMDUpCi0gSW5jb3Jwb3JhdGVkIFR1cG9uZSdzIGZpbmR0b29sIGZpeCBpbiBidWlsZGNvbmYgKHNsaWdodGx5IGVkaXRlZCkKCi0gSW5jb3Jwb3JhdGVkIFR1cG9uZSdzIGhlYWQgLW4gZml4IGluIGJ1aWxkY29uZi4KCkRhbmllbCAoOCBKdW5lIDIwMDUpCi0gUmV2ZXJ0ZWQgVHVwb25lJ3MgcGF0Y2ggYWdhaW4sIGl0IGJyb2tlIG51bWVyb3VzIGF1dG9idWlsZHMuIExldCdzIGFwcGx5IGl0CiAgaW4gcGllY2VzLCBvbmUgYnkgb25lIGFuZCBzZWUgd2hhdCB3ZSBuZWVkIHRvIGFkanVzdCB0byB3b3JrIGFsbCBvdmVyLgoKRGFuaWVsICg2IEp1bmUgMjAwNSkKLSBUdXBvbmUgQWxmcmVkbyBmaXhlZCB0aHJlZSBwcm9ibGVtcyBpbiBidWlsZGNvbmY6CgogIDEpIGZpbmR0b29sIGRvZXMgbG9vayBwZXIgdG9vbCBpbiBQQVRIIGFuZCB0aGluayAuL3BlcmwgaXMgdGhlIHBlcmwKICBleGVjdXRhYmxlLCB3aGlsZSBpcyBqdXN0IGEgbG9jYWwgZGlyZWN0b3J5IChJIGhhdmUgLiBpbiB0aGUgUEFUSCkKCiAgMikgSSBnb3Qgc2V2ZXJhbCB3YXJuaW5nIGZvciBoZWFkIC0xIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGhlYWQgLW4gMQoKICAzKSBhcmVzIGRpcmVjdG9yeSBpcyBtaXNzaW5nIHNvbWUgZmlsZSAobWlzc2luZyBpcyBtaXNzaW5nIDotKSApIGJlY2F1c2UKICBhdXRvbWFrZSBhbmQgZnJpZW5kcyBpcyBub3QgcnVuLgoKRGFuaWVsICgzIEp1bmUgMjAwNSkKLSBBZGRlZCBkb2NzL2xpYmN1cmwvZ2V0aW5mby10aW1lcywgYmFzZWQgb24gZmVlZGJhY2sgZnJvbSAnRWRpJzoKICBodHRwczovL2N1cmwuaGF4eC5zZS9mZWVkYmFjay9kaXNwbGF5LmNnaT9pZD0xMTE3ODMyNTc5ODI5OSZzdXBwb3J0PXllcwoKLSBBbmRyZXMgR2FyY2lhIHByb3ZpZGVkIHlldCBhbm90aGVyIHRleHQgbW9kZSBwYXRjaCBmb3Igc2V2ZXJhbCB0ZXN0IGNhc2VzIHNvCiAgdGhhdCB0aGV5IGRvIHRleHQgY29tcGFyaXNpb25zIGJldHRlciBvbiBXaW5kb3dzIChuZXdsaW5lLXdpc2UpLgoKRGFuaWVsICgxIEp1bmUgMjAwNSkKLSBUaGUgY29uZmlndXJlIGNoZWNrIGZvciBjLWFyZXMgbm93IGFkZHMgdGhlIGNhcmVzIGxpYiBiZWZvcmUgdGhlIG90aGVyIGxpYnMsCiAgdG8gbWFrZSBpdCBidWlsZCBmaW5lIHdpdGggbWluZ3cuIEluc3BpcmVkIGJ5IFR1cG9uZSBBbGZyZWRvJ3MgYnVnIHJlcG9ydAogIGFuZCBwYXRjaDogaHR0cHM6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyMTI5NDAKCkRhbmllbCAoMzEgTWF5IDIwMDUpCi0gVG9kZCBLdWxlc3phIHJlcG9ydGVkIGEgZmxhdyBpbiB0aGUgcHJveHkgb3B0aW9uLCBzaW5jZSBhIG51bWVyaWNhbCBJUHY2CiAgYWRkcmVzcyB3YXMgbm90IHBvc3NpYmxlIHRvIHVzZS4gSXQgaXMgbm93LCBidXQgcmVxdWlyZXMgaXQgd3JpdHRlbgogIFJGQzI3MzItc3R5bGUsIHdpdGhpbiBicmFja2V0cyAtIHdoaWNoIGluY2lkZW50bHkgaXMgaG93IHlvdSBlbnRlciBudW1lcmljYWwKICBJUHY2IGFkZHJlc3NlcyBpbiBVUkxzLiBUZXN0IGNhc2UgMjYzIGFkZGVkIHRvIHZlcmlmeS4KCkRhbmllbCAoMzAgTWF5IDIwMDUpCi0gRXJpYyBDb29wZXIgcmVwb3J0ZWQgYWJvdXQgYSBwcm9ibGVtIHdpdGggSFRUUCBzZXJ2ZXJzIHRoYXQgcmVzcG9uZHMgd2l0aAogIGJpbmFyeSB6ZXJvZXMgd2l0aGluIHRoZSBoZWFkZXJzLiBUaGV5IGNvbmZ1c2VkIGxpYmN1cmwgdG8gZG8gd3Jvbmcgc28gdGhlCiAgZG93bmxvYWRlZCBoZWFkZXJzIGJlY29tZSBpbmNvbXBsZXRlLiBUaGUgZml4IGlzIG5vdyB2ZXJpZmllZCB3aXRoIHRlc3QgY2FzZQogIDI2Mi4gaHR0cHM6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMTA5NDgKCkRhbmllbCAoMjUgTWF5IDIwMDUpCi0gRml4ZWQgcHJvYmxlbXMgd2l0aCB0aGUgdGVzdCBzdWl0ZSwgYW5kIGluIHBhcnRpY3VsYXIgdGhlIEZUUCB0ZXN0IGNhc2VzCiAgc2luY2UgaXQgcHJldmlvdXNseSB3YXMgZmFpbGluZyBldmVyeSBub3cgYW5kIHRoZW4gaW4gYSBub25zZW5zZSBtYW5uZXIuCgotIC0tdHJhY2UtdGltZSBub3cgb3V0cHV0cyB0aGUgZnVsbCBtaWNyb3NlY29uZCwgYWxsIDYgZGlnaXRzLgoKRGFuaWVsICgyNCBNYXkgMjAwNSkKLSBBbmRyZXMgR2FyY2lhIHByb3ZpZGVkIGEgdGV4dCBtb2RlIHBhdGNoIGZvciBzZXZlcmFsIHRlc3QgY2FzZXMgc28gdGhhdCB0aGV5CiAgZG8gdGV4dCBjb21wYXJpc2lvbnMgYmV0dGVyIG9uIFdpbmRvd3MgKG5ld2xpbmUtd2lzZSkuCgotIEFueSAyeHggcmVzcG9uc2UgKGFuZCBub3QganVzdCAyMDApIGlzIG5vdyBjb25zaWRlcmVkIGEgZmluZSByZXNwb25zZSB0bwogIFRZUEUsIGFzIHNvbWUgc2VydmVycyBvYnZpb3VzbHkgc2VuZHMgYSAyMjYgdGhlcmUuIEFkZGVkIHRlc3QgY2FzZSAyNjEgdG8KICB2ZXJpZnkuIEJhc2VkIG9uIGEgcXVlc3Rpb24vcmVwb3J0IGJ5IEdlb3JnIFdpY2hlcnNraS4KCkRhbmllbCAoMjAgTWF5IDIwMDUpCi0gSW1wcm92ZWQgcnVudGVzdHMucGwgdG8gYWxsb3cgc3Rkb3V0IHRlc3RzIHRvIGJlIG1vZGU9dGV4dCBhcyB3ZWxsLCBqdXN0CiAgYXMgZmlsZSBjb21wYXJpc29ucyBhbHJlYWR5IHN1cHBvcnRzLiBBZGRlZCB0aGlzIGluZm8gdG8gdGhlIEZJTEVGT1JNQVQKICBkb2NzLgoKRGFuaWVsICgxOCBNYXkgMjAwNSkKLSBKb2huIE1jR293YW4gaWRlbnRpZmllZCBhIHByb2JsZW0gaW4gYnVnIHJlcG9ydCAjMTIwNDQzNQogIChodHRwczovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTIwNDQzNSkgd2l0aCBtYWxmb3JtZWQgVVJMcyBsaWtlCiAgImh0dHA6Ly9zb21laG9zdD9kYXRhIiBhcyBpdCBhZGRlZCBhIHNsYXNoIHRvbyBtdWNoIGluIHRoZSByZXF1ZXN0ICgiR0VUCiAgLz9kYXRhLyIuLi4pLiBBZGRlZCB0ZXN0IGNhc2UgMjYwIHRvIHZlcmlmeS4KCi0gVGhlIGNvbmZpZ3VyZSBjaGVjayBmb3Igc3RyZXJyb3JfcigpIGZhaWxlZCB0byBkZXRlY3QgdGhlIHByb3BlciBBUEkgYXQKICB0aW1lcywgbGlrZSBvbiBIUC1VWCAxMC4yMC4gVGhlbiBsaWIvc3RyZXJyb3IuYyBiYWRseSBhc3N1bWVkIHRoZSBnbGliYwogIHZlcnNpb24gaWYgdGhlIHBvc2l4IGRlZmluZSB3YXNuJ3Qgc2V0IChzaW5jZSBpdCBfaGFkXyBmb3VuZCBhIHN0cmVycm9yX3IpLgoKRGFuaWVsICgxNiBNYXkgMjAwNSkKLSBUaGUgZ210aW1lX3IoKSBmdW5jdGlvbiBpbiBIUC1VWCAxMC4yMCBpcyBicm9rZW4uIEFib3V0IDEzIHRlc3QgY2FzZXMgZmFpbAogIGR1ZSB0byB0aGlzLiBUaGVyZSdzIG5vdyBhIGNvbmZpZ3VyZSBjaGVjayB0aGF0IGF0dGVtcHRzIHRvIGRldGVjdCB0aGUgYmFkCiAgZnVuY3Rpb24gYW5kIG5vdCB1c2UgaXQgb24gc3VjaCBzeXN0ZW1zLgoKVmVyc2lvbiA3LjE0LjAgKDE2IE1heSAyMDA1KQoKRGFuaWVsICgxMyBNYXkgMjAwNSkKLSBHcmlnb3J5IEVudGluIHJlcG9ydGVkIHRoYXQgY3VybCdzIGNvbmZpZ3VyZSBkZXRlY3RzIGEgZmluZSBwb2xsKCkgZm9yIE1hYwogIE9TIFggMTAuNCAod2hpbGUgMTAuMyBvciBsYXRlciBkZXRlY3RlZCBhICJiYWQiIG9uZSksIGJ1dCB0aGUgZXhlY3V0YWJsZQogIGRvZXNuJ3Qgd29yayBhcyBnb29kIGFzIGlmIGJ1aWx0IHdpdGhvdXQgcG9sbCgpLiBJJ3ZlIGFkanVzdGVkIHRoZSBjb25maWd1cmUKICB0byBhbHdheXMgc2tpcCB0aGUgZmluZS1wb2xsKCkgdGVzdCBvbiBNYWMgT1MgWCAoZGFyd2luKS4KCkRhbmllbCAoMTIgTWF5IDIwMDUpCi0gV2hlbiBkb2luZyBhIHNlY29uZCByZXF1ZXN0IChhZnRlciBhIGRpc2Nvbm5lY3QpIHVzaW5nIHRoZSBzYW1lIGVhc3kgaGFuZGxlLAogIG92ZXIgYSBwcm94eSB0aGF0IHVzZXMgTlRMTSBhdXRoZW50aWNhdGlvbiwgbGliY3VybCBmYWlsZWQgdG8gdXNlIE5UTE0gYWdhaW4KICBwcm9wZXJseSAodGhlIGF1dGggbWV0aG9kIHdhcyBhY2NpZGVudGFsbHkgcmVzZXQgdG8gdGhlIHNhbWUgYXMgaGFkIGJlZW4gc2V0CiAgZm9yIGhvc3QgYXV0aCwgd2hpY2ggZGVmYXVsdHMgdG8gQmFzaWMpLiBCdWcgcmVwb3J0ICMxMjAwNjYxCiAgKGh0dHBzOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjAwNjYxKSBpZGVudGlmaWVkIHRoZSB0aGUgcHJvYmxlbSBhbmQKICB0aGUgZml4LgoKLSBJZiAtei8tLXRpbWUtY29uZCBpcyB1c2VkIHdpdGggYW4gaW52YWxpZCBkYXRlIHN5bnRheCwgdGhpcyBpcyBubyBsb25nZXIKICBzaWxlbnRseSBkaXNjYXJkZWQuIEluc3RlYWQgYSBwcm9wZXIgd2FybmluZyBtZXNzYWdlIGlzIGRpcGxheWVkIHRoYXQKICBpbmZvcm1zIGFib3V0IGl0LiBCdXQgaXQgc3RpbGwgY29udGludWVzIHdpdGhvdXQgdGhlIGNvbmRpdGlvbi4KClZlcnNpb24gNy4xNC4wLXByZTIgKDExIE1heSAyMDA1KQoKRGFuaWVsICgxMSBNYXkgMjAwNSkKLSBTdGFydGluZyBub3csIGxpYmN1cmwgc2VuZHMgYSBsaXR0bGUgZGlmZmVyZW50IHNldCBvZiBoZWFkZXJzIGluIGl0cyBkZWZhdWx0CiAgSFRUUCByZXF1ZXN0czoKCiAgQSkgTm9ybWFsIG5vbi1wcm94eSBIVFRQOgogICAgLSBubyBtb3JlICJQcmFnbWE6IG5vLWNhY2hlIiAodGhpcyBvbmx5IG1ha2VzIHNlbnNlIHRvIHByb3hpZXMpCgogIEIpIE5vbi1DT05ORUNUIEhUVFAgcmVxdWVzdCBvdmVyIHByb3h5OgogICAgLSAiUHJhZ21hOiBuby1jYWNoZSIgaXMgdXNlZCAobGlrZSBiZWZvcmUpCiAgICAtICJQcm94eS1Db25uZWN0aW9uOiBLZWVwLWFsaXZlIiAoZm9yIG9sZGVyIHN0eWxlIDEuMC1wcm94aWVzKQoKICBDKSBDT05ORUNUIEhUVFAgcmVxdWVzdCBvdmVyIHByb3h5OgogICAgLSAiSG9zdDogW25hbWVdOltwb3J0XSIKICAgIC0gIlByb3h5LUNvbm5lY3Rpb246IEtlZXAtYWxpdmUiCgogIFRoZSBBKSBjYXNlIGlzIG1vc3RseSB0byByZWR1Y2UgdGhlIGRlZmF1bHQgaGVhZGVyIHNpemUgYW5kIHJlbW92ZSBhCiAgcG9pbnRsZXNzIGhlYWRlci4KCiAgVGhlIEIpIGlzIHRvIGFkZHJlc3MgKHJhcmUpIHByb2JsZW1zIHdpdGggSFRUUCAxLjAgcHJveGllcwoKICBUaGUgQykgaGVhZGVycyBhcmUgYm90aCB0byBhZGRyZXNzIChyYXJlKSBwcm9ibGVtcyB3aXRoIHNvbWUgcHJveGllcy4gVGhlCiAgY29kZSBpbiBsaWJjdXJsIHRoYXQgZGVhbHMgd2l0aCBDT05ORUNUIHJlcXVlc3RzIG5lZWQgYSByZXdyaXRlLCBidXQgaXQKICBmZWVscyBsaWtlIGEgdG9vIGJpZyBhIGpvYiBmb3IgbWUgdG8gZG8gbm93LiBEZXRhaWxzIGFyZSBhZGRlZCBpbiB0aGUgY29kZQogIGNvbW1lbnRzIGZvciBub3cuCgogIFVwZGF0ZWQgYSBsYXJnZSBhbW91bnQgb2YgdGVzdCBjYXNlcyB0byByZWZsZWN0IHRoZSBuZXdzLgoKRGFuaWVsICgxMCBNYXkgMjAwNSkKLSBIYWxmLWJha2VkIGF0dGVtcHQgdG8gYmFpbCBvdXQgaWYgc2VsZWN0KCkgcmV0dXJucyBfb25seV8gZXJyb3JmZHMgd2hlbiB0aGUKICB0cmFuc2ZlciBpcyBpbiBwcm9ncmVzcy4gQW4gYXR0ZW1wdCB0byBmaXggQWxsYW4ncyBwcm9ibGVtLiBTZWUKICBodHRwczovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA1LTA1LzAwNzMuaHRtbCBhbmQgdGhlIHJlc3Qgb2YgdGhhdCB0aHJlYWQKICBmb3IgZGV0YWlscy4KCiAgSSdtIHN0aWxsIG5vdCBzdXJlIHRoaXMgaXMgdGhlIHJpZ2h0IGZpeCwgYnV0Li4uCgpWZXJzaW9uIDcuMTQuMC1wcmUxICg5IE1heSAyMDA1KQoKRGFuaWVsICgyIE1heSAyMDA1KQotIFNvcnQgb2YgImZpeGVkIiBLTk9XTl9CVUdTICM0OiBjdXJsIG5vdyBidWlsZHMgSVB2NiBlbmFibGVkIG9uIEFJWCA0LjMuIEF0CiAgbGVhc3QgaXQgc2hvdWxkIG5vIGxvbmdlciBjYXVzZSBhIGNvbXBpbGVyIGVycm9yLiBIb3dldmVyLCBpdCBkb2VzIG5vdCBoYXZlCiAgQUlfTlVNRVJJQ0hPU1Qgc28gd2UgY2Fubm90IGdldGFkZHJpbmZvKCkgYW55IG51bWVyaWNhbCBhZGRyZXNzZXMgd2l0aCBpdAogICh3ZSB1c2UgdGhhdCBmb3IgRlRQIFBPUlQvRVBSVCkhIFNvLCBJIG1vZGlmaWVkIHRoZSBjb25maWd1cmUgY2hlY2sgdGhhdAogIGNoZWNrcyBpZiB0aGUgZ2V0YWRkcmluZm8oKSBpcyB3b3JraW5nLCB0byB1c2UgQUlfTlVNRVJJQ0hPU1Qgc2luY2UgdGhlbgogIGl0J2xsIGZhaWwgb24gQUlYIDQuMyBhbmQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIHdpdGggSVB2NiBzdXBwb3J0CiAgZGlzYWJsZWQuCgotIEFkZGVkIC0tdHJhY2UtdGltZSB0aGF0IHdoZW4gdXNlZCBhZGRzIGEgdGltZSBzdGFtcCB0byBlYWNoIHRyYWNlIGxpbmUgdGhhdAogIC0tdHJhY2UsIC0tdHJhY2UtYXNjaWkgYW5kIC0tdmVyYm9zZSBvdXRwdXQuIEkgYWxzbyBtYWRlIHRoZSAnPicgZGlzcGxheQogIHNlcGFyYXRlIGVhY2ggbGluZSBvbiB0aGUgbGluZWZlZWQgc28gdGhhdCBIVFRQIHJlcXVlc3RzIGV0YyBsb29rIG5pY2VyIGluCiAgdGhlIC12IG91dHB1dC4KCi0gTWFkZSBjdXJsIHJlY29nbml6ZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIEx5bnggKGFuZCBvdGhlcnM/KSBzdXBwb3J0IGZvcgogIHBvaW50aW5nIG91dCB0aGUgQ0EgY2VydCBwYXRoL2ZpbGU6IFNTTF9DRVJUX0RJUiBhbmQgU1NMX0NFUlRfRklMRS4gSWYKICBDVVJMX0NBX0JVTkRMRSBpcyBub3Qgc2V0LCB0aGV5IGFyZSBjaGVja2VkIGFmdGVyd2FyZHMuCgogIExpa2UgYmVmb3JlOiBvbiB3aW5kb3dzIGlmIG5vbmUgb2YgdGhlc2UgYXJlIHNldCwgaXQgY2hlY2tzIGZvciB0aGUgY2EgY2VydAogIGZpbGUgbGlrZSB0aGlzOgoKICAxLiBhcHBsaWNhdGlvbidzIGRpcmVjdG9yeQogIDIuIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKICAzLiBXaW5kb3dzIFN5c3RlbSBkaXJlY3RvcnkgKGUuZy4gQzpcd2luZG93c1xzeXN0ZW0zMikKICA0LiBXaW5kb3dzIERpcmVjdG9yeSAoZS5nLiBDOlx3aW5kb3dzKQogIDUuIGFsbCBkaXJlY3RvcmllcyBhbG9uZyAlUEFUSCUKCkRhbmllbCAoMSBNYXkgMjAwNSkKLSBUaGUgcnVudGVzdHMucGwgc2NyaXB0IG5vdyBzdGFydHMgdGVzdCBzZXJ2ZXJzIGJ5IGRvaW5nIGZvcmsoKSBhbmQgZXhlYygpCiAgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgYXBwcm9hY2guIFRoaXMgaXMgbGVzcyBjb21wbGljYXRlZCBhbmQgc2hvdWxkCiAgaG9wZWZ1bGx5IGxlYWQgdG8gbGVzcyAibGVha2VkIiBzZXJ2ZXJzIChzZXJ2ZXJzIHRoYXQgYXJlbid0IHN0b3BwZWQKICBwcm9wZXJseSB3aGVuIHRoZSB0ZXN0cyBhcmUgc3RvcHBlZCkuCgotIEFsZXhhbmRlciBaaHVyYXZsZXYgZm91bmQgYSBjYXNlIHdoZW4geW91IGRpZCAiY3VybCAtSSBbVVJMXSIgYW5kIGl0CiAgY29tcGxhaW5lZCBvbiB0aGUgY2h1bmtlZCBlbmNvZGluZywgZXZlbiB0aG91Z2ggYSBIRUFEIHNob3VsZCBuZXZlciByZXR1cm4gYQogIGJvZHkgYW5kIHRodXMgaXQgY2Fubm90IGJlIGEgY2h1bmtlZC1lbmNvZGluZyBwcm9ibGVtIQoKRGFuaWVsICgzMCBBcHJpbCAyMDA1KQotIEFsZXhhbmRlciBaaHVyYXZsZXYgZm91bmQgb3V0IHRoYXQgKGxpYiljdXJsIFNJR1NFR1ZlZCB3aGVuIHVzaW5nCiAgLS1pbnRlcmZhY2Ugb24gYW4gYWRkcmVzcyB0aGF0IGNhbid0IGJlIGJvdW5kLgoKRGFuaWVsICgyOCBBcHJpbCAyMDA1KQotIFdvcmtpbmcgb24gZml4aW5nIHVwIHRlc3QgY2FzZXMgdG8gbWFyayBzZWN0aW9ucyBhcyAnbW9kZT10ZXh0JyBmb3IgdGhpbmdzCiAgdGhhdCBjdXJsIHdyaXRlcyBhcyB0ZXh0IGZpbGVzLCBzaW5jZSB0aGVuIHRoZXkgY2FuIGdldCBkaWZmZXJlbnQgbGluZQogIGVuZGluZ3MgZGVwZW5kaW5nIG9uIE9TLiBBbmRy6XMgR2FyY+1hIGhlbHBzIG1lIHdvcmsgdGhpcyBvdXQuCgogIERpZCBsb3RzIG9mIG90aGVyIG1pbm9yIHR3ZWFrcyBvbiB0aGUgdGVzdCBzY3JpcHRzIHRvIHdvcmsgYmV0dGVyIGFuZCBtb3JlCiAgcmVsaWFibHkgZmluZCB0ZXN0IHNlcnZlcnMgYW5kIGFsc28ga2lsbCB0ZXN0IHNlcnZlcnMuCgotIERhbiBGYW5kcmljaCBwb2ludGVkIG91dCBob3cgdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCBraWxsZWQgdGhlIEhUVFAgc2VydmVyCiAgaW5zdGVhZCBvZiB0aGUgSFRUUFMgc2VydmVyIHdoZW4gY2xvc2luZyBpdCBkb3duLgoKRGFuaWVsICgyNyBBcHJpbCAyMDA1KQotIFBhdWwgTW9vcmUgbWFkZSBjdXJsIGNoZWNrIGZvciB0aGUgLmN1cmxyYyBmaWxlIChfY3VybHJjIG9uIHdpbmRvd3MpIG9uIHR3bwogIG1vcmUgcGxhY2VzLiBGaXJzdCwgQ1VSTF9IT01FIGlzIGEgbmV3IGVudmlyb25tZW50IHZhcmlhYmxlIHRoYXQgaXMgdXNlZAogIGluc3RlYWQgb2YgSE9NRSBpZiBpdCBpcyBzZXQsIHRvIHBvaW50IG91dCB3aGVyZSB0aGUgZGVmYXVsdCBjb25maWcgZmlsZQogIGxpdmVzLiBJZiB0aGVyZSdzIG5vIGNvbmZpZyBmaWxlIGluIHRoZSBkaXIgcG9pbnRlZCBvdXQgYnkgb25lIG9mIHRoZQogIGVudmlyb25tZW50IHZhcmlhYmxlcywgdGhlIFdpbmRvd3MgdmVyc2lvbiB3aWxsIGluc3RlYWQgY2hlY2sgdGhlIHNhbWUKICBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgY3VybCBpcyBsb2NhdGVkIGluLgoKRGFuaWVsICgyNiBBcHJpbCAyMDA1KQotIENvcnkgTmVsc29uJ3Mgd29yayBvbiBudWtpbmcgY29tcGlsZXIgd2FybmluZ3Mgd2hlbiBidWlsZGluZyBvbiB4NjQgd2l0aAogIFZTMjAwNS4KCkRhbmllbCAoMjUgQXByaWwgMjAwNSkKLSBGcmVkIE5ldyByZXBvcnRlZCBhIGJ1ZyB3aGVyZSB3ZSB1c2VkIEJhc2ljIGF1dGggYW5kIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQKICBpbiAubmV0cmMsIGFuZCB3aGVuIGZvbGxvd2luZyBhIExvY2F0aW9uOiB0aGUgc3Vic2VxdWVudCByZXF1ZXN0cyBkaWRuJ3QKICBwcm9wZXJseSB1c2UgdGhlIGF1dGggYXMgZm91bmQgaW4gdGhlIG5ldHJjIGZpbGUuIEFkZGVkIHRlc3QgY2FzZSAyNTcgdG8KICB2ZXJpZnkgbXkgZml4LgoKLSBCYXNlZCBvbiBmZWVkYmFjayBmcm9tIENvcnkgTmVsc29uLCBJIGFkZGVkIHNvbWUgcHJlcHJvY2Vzc29yIG1hZ2ljIGluCiAgKi9zZXR1cC5oIGFuZCAqL2NvbmZpZy13aW4zMi5oIHRvIGJ1aWxkIGZpbmUgd2l0aCBWUzIwMDUgb24geDY0LgoKRGFuaWVsICgyMyBBcHJpbCAyMDA1KQotIEFsZXggU3V5a292IG1hZGUgdGhlIGN1cmwgdG9vbCBub3cgYXNzdW1lIHRoYXQgdXBsb2FkcyB1c2luZyBIVFRQOi8vIG9yCiAgSFRUUFM6Ly8gYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCBzaG93IG91dHB1dCBhbmQgdGh1cyBtb3RpdmF0ZXMgYSBzd2l0Y2hlZAogIG9mZiBwcm9ncmVzcyBtZXRlciBpZiB0aGUgb3V0cHV0IGlzIHNlbnQgdG8gdGhlIHRlcm1pbmFsLiBUaGlzIG1ha2VzIEZUUAogIHVwbG9hZHMgd2l0aG91dCAnPicsIC1vIG9yIC1PIHNob3cgdGhlIHByb2dyZXNzIG1ldGVyLgoKRGFuaWVsICgyMiBBcHJpbCAyMDA1KQotIERhdmUgRHJpYmluJ3MgTVNWQyBtYWtlZmlsZSBmaXg6IHNldCBDVVJMX1NUQVRJQ0xJQiB3aGVuIGl0IGJ1aWxkcyBzdGF0aWMKICBsaWJyYXJ5IHZhcmlhbnRzLgoKLSBBbmRyZXMgR2FyY2lhIGZpeGVkIGNvbmZpZ3VyZSB0byBzZXQgdGhlIHByb3BlciBkZWZpbmUgd2hlbiBidWlsZGluZyBzdGF0aWMKICBsaWJjdXJsIG9uIHdpbmRvd3MuCgotIC0tcmV0cnktZGVsYXkgZGlkbid0IHdvcmsuCgpEYW5pZWwgKDE4IEFwcmlsIDIwMDUpCi0gT2xpdmllciByZXBvcnRlZCB0aGF0IGV2ZW4gdGhvdWdoIGhlIHVzZWQgQ1VSTE9QVF9QT1JULCBsaWJjdXJsIGNsZWFybHkKICBzdGlsbCB1c2VkIHRoZSBkZWZhdWx0IHBvcnQuIEhlIHdhcyByaWdodC4gSSBmaXhlZCB0aGUgcHJvYmxlbSBhbmQgYWRkZWQgdGhlCiAgdGVzdCBjYXNlcyA1MjEsIDUyMiBhbmQgNTIzIHRvIHZlcmlmeSB0aGUgZml4LgoKLSBUb3NoaXl1a2kgTWFlemF3YSByZXBvcnRlZCB0aGF0IHdoZW4gZG9pbmcgYSBQT1NUIHdpdGggYSByZWFkIGNhbGxiYWNrLAogIGxpYmN1cmwgZGlkbid0IHByb3Blcmx5IHNlbmQgYW4gRXhwZWN0OiAxMDAtY29udGludWUgaGVhZGVyLiBJdCBkb2VzIG5vdy4KCi0gSSBjb21taXR0ZWQgYnkgbWlnIGNoYW5nZSBpbiB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgdGhhdCBtb3ZlcyBvdXQgYWxsCiAgc29ja2V0L1RDUCBjb2RlIHRvIGEgc2VwYXJhdGUgQyBwcm9ncmFtIG5hbWVkIHNvY2tmaWx0LiBBbmQgYWRkZWQgNCBuZXcKICB0ZXN0IGNhc2VzIGZvciBGVFAgb3ZlciBJUHY2LgoKRGFuaWVsICg4IEFwcmlsIDIwMDUpCi0gQ29yeSBOZWxzb24gcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggYSBIVFRQIHNlcnZlciB0aGF0IHJlc3BvbmRlZCB3aXRoIGEgMzA0CiAgcmVzcG9uc2UgY29udGFpbmluZyBhbiAiaWxsZWdhbCIgQ29udGVudC1MZW5ndGg6IGhlYWRlciwgd2hpY2ggd2FzIG5vdAogIHByb3Blcmx5IGlnbm9yZWQgYnkgbGliY3VybC4gTm93IGl0IGlzLiBUZXN0IGNhc2UgMjQ5IHZlcmlmaWVzLgoKRGFuaWVsICg3IEFwcmlsIDIwMDUpCi0gQWRkZWQgYWJpbGl0eSB0byBidWlsZCBhbmQgcnVuIHdpdGggR251VExTIGFzIGFuIGFsdGVybmF0aXZlIHRvIE9wZW5TU0wgZm9yCiAgdGhlIHNlY3VyZSBsYXllci4gY29uZmlndXJlIC0td2l0aC1nbnV0bHMgZW5hYmxlcyB3aXRoLiBOb3RlIHRoYXQgdGhlCiAgcHJldmlvdXMgT3BlblNTTCBjaGVjayBzdGlsbCBoYXMgcHJlZmVyZW5jZSBhbmQgaWYgaXQgZmlyc3QgZGV0ZWN0cyBPcGVuU1NMLAogIGl0IHdpbGwgbm90IGNoZWNrIGZvciBHbnVUTFMuIFlvdSBtYXkgbmVlZCB0byBleHBsaWN0bHkgZGlhYmxlIE9wZW5TU0wgd2l0aAogIC0td2l0aG91dC1zc2wuCgogIFRoaXMgd29yayBoYXMgYmVlbiBzcG9uc29yZWQgYnkgVGhlIFdyaXR0ZW4gV29yZC4KCkRhbmllbCAoNSBBcHJpbCAyMDA1KQotIENocmlzdG9waGUgTGVncnkgZml4ZWQgdGhlIHBvc3QtdXBsb2FkIGNoZWNrIGZvciBGVFAgdG8gbm90IGNvbXBsYWluIGlmIHRoZQogIHVwbG9hZCB3YXMgc2tpcHBlZCBkdWUgdG8gYSB0aW1lLWNvbmRpdGlvbiBhcyBzZXQgd2l0aAogIENVUkxPUFRfVElNRUNPTkRJVElPTi4gSSBhZGRlZCB0ZXN0IGNhc2UgMjQ3IGFuZCAyNDggdG8gdmVyaWZ5LgoKVmVyc2lvbiA3LjEzLjIgKDUgQXByaWwgMjAwNSkKCkRhbmllbCAoNCBBcHJpbCAyMDA1KQotIE1hcmNlbG8gSnVjaGVtIGZpeGVkIHRoZSBNU1ZDIG1ha2VmaWxlIGZvciBsaWJjdXJsCgotIEdpc2xlIFZhbmVtIGZpeGVkIGEgY3Jhc2ggaW4gbGliY3VybCwgdGhhdCBjb3VsZCBoYXBwZW4gaWYgdGhlIGVhc3kgaGFuZGxlCiAgd2FzIGtpbGxlZCBiZWZvcmUgdGhlIHRocmVhZGluZyByZXNvbHZlciAod2luZG93cyBvbmx5KSBzdGlsbCBoYWRuJ3QKICBjb21wbGV0ZWQuCgotIEhhcmRlZXAgU2luZ2ggcmVwb3J0ZWQgYSBwcm9ibGVtIGRvaW5nIEhUVFAgUE9TVCB3aXRoIERpZ2VzdC4gKEl0IHdhcwogIGFjdHVhbGx5IGFsc28gYWZmZWN0aW5nIE5UTE0gYW5kIE5lZ290aWF0ZS4pIEl0IHR1cm5lZCBvdXQgdGhhdCBpZiB0aGUKICBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGggMTAwIENvbnRpbnVlIGJlZm9yZSB0aGUgaW5pdGlhbCA0MDEgcmVzcG9uc2UsIGxpYmN1cmwKICBkaWRuJ3QgdGFrZSBjYXJlIG9mIHRoZSByZXNwb25zZSBwcm9wZXJseS4gVGVzdCBjYXNlIDI0NSBhbmQgMjQ2IGFkZGVkIHRvCiAgdmVyaWZ5IHRoaXMuCgpEYW5pZWwgKDMwIE1hcmNoIDIwMDUpCi0gQW5kcmVzIEdhcmNpYSBtb2RpZmllZCB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBjaGVjayBmb3IgbGliZ2RpMzIgYmVmb3JlCiAgbGliY3J5cHRvLCB0byBtYWtlIHRoZSBTU0wgY2hlY2sgd29yayBmaW5lIG9uIG1zeXMvbWluZ3cuCgpEYW5pZWwgKDI5IE1hcmNoIDIwMDUpCi0gVG9tIE1vZXJzIGlkZW50aWZpZWQgYSBmbGF3IHdoZW4geW91IHNlbnQgYSBQT1NUIHdpdGggRGlnZXN0IGF1dGhlbnRpY2F0aW9uLAogIGFzIGluIHRoZSBmaXJzdCByZXF1ZXN0IHdoZW4gY3VybCBzZW5kcyBhIFBPU1Qgd2l0aCBDb250ZW50LUxlbmd0aDogMCwgaXQKICBzdGlsbCBmb3JjaWJseSBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gYmVmb3JlIGRvaW5nIHRoZSBuZXh0IHN0ZXAgaW4gdGhlIGF1dGgKICBuZWdvdGlhdGlvbi4KCi0gSmVzcGVyIEplbnNlbiBmb3VuZCBvdXQgdGhhdCBGVFAtU1NMIGRpZG4ndCB3b3JrIHNpbmNlIG15IEZUUAogIHJld3JpdGUuIEZpeGluZyB0aGF0IHdhcyBlYXN5LCBidXQgaXQgYWxzbyByZXZlYWxlZCBhIG11Y2ggd29yc2UgcHJvYmxlbToKICB0aGUgRlRQIHNlcnZlciByZXNwb25zZSByZWFkZXIgZnVuY3Rpb24gZGlkbid0IHByb3Blcmx5IGRlYWwgd2l0aCByZWFkaW5nCiAgcmVzcG9uc2VzIGluIG11bHRpcGxlIHRpbnkgY2h1bmtzIHByb3Blcmx5ISBJIG1vZGlmaWVkIHRoZSBGVFAgc2VydmVyIHRvCiAgYWxsb3cgaXQgdG8gcHJvZHVjZSBzdWNoIHNwbGl0LXVwIHJlc3BvbnNlcyB0byBtYWtlIHN1cmUgY3VybCBkZWFscyB3aXRoCiAgdGhlbSBhcyBpdCBzaG91bGQuCgotIEJhc2VkIG9uIEF1Z3VzdHVzIFNhdW5kZXJzJyBjb21tZW50cyBhbmQgZmluZGluZ3MsIHRoZSBIVFRQIG91dHB1dCBhdXRoCiAgZnVuY3Rpb24gd2FzIGZpeGVkIHRvIHVzZSB0aGUgcHJvcGVyIHByb3h5IGF1dGhlbnRpY2F0aW9uIHdoZW4gbXVsdGlwbGUgb25lcwogIGFyZSBhY2NlcHRlZC4gdGVzdCAyMzkgYW5kIHRlc3QgMjQzIHdlcmUgYWRkZWQgdG8gcmVwZWF0IHRoZSBwcm9ibGVtcyBhbmQKICB2ZXJpZnkgdGhlIGZpeGVzLgoKICAtLXByb3h5LWFueWF1dGggd2FzIGFkZGVkIHRvIHRoZSBjdXJsIHRvb2wKCkRhbmllbCAoMTYgTWFyY2ggMjAwNSkKLSBUcnU2NCBhbmQgc29tZSBJUklYIGJveGVzIHNlZW0gdG8gbm90IGxpa2UgdGVzdCAyMzcgYXMgaXQgaXMuIFRoZWlyCiAgaW5ldF9hZGRyKCkgZnVuY3Rpb25zIHNlZW1zIHRvIHVzZSAmMjU1IG9uIGFsbCBudW1lcmljYWxzIGluIGEgaXB2NCBkb3R0ZWQKICBhZGRyZXNzIHdoaWNoIG1ha2VzIGEgZGlmZmVyZW50IGZhaWx1cmUuLi4gTm93IEkndmUgbW9kaWZpZWQgdGhlIElQdjQKICByZXNvbHZlIGNvZGUgdG8gdXNlIGluZXRfcHRvbigpIGluc3RlYWQgaW4gYW4gYXR0ZW1wdCB0byBtYWtlIHRoZXNlIHN5c3RlbXMKICBiZXR0ZXIgZGV0ZWN0IHRoaXMgYXMgYSBiYWQgSVAgYWRkcmVzcyByYXRoZXIgdGhhbiBjcmVhdGluZyBhIHRvYWxseSBib2d1cwogIGFkZHJlc3MgdGhhdCBpcyB0aGVuIHBhc3NlZCBvbiBhbmQgdXNlZC4KCkRhbmllbCAoMTUgTWFyY2ggMjAwNSkKLSBEYW4gRmFuZHJpY2ggbWFkZSB0aGUgY29kZSBwcm9wZXJseSB1c2UgdGhlIHVDbGliYydzIHZlcnNpb24gb2YKICBpbmV0X250b2FfcigpIHdoZW4gYnVpbHQgd2l0aCBpdC4KCi0gQWRkZWQgdGVzdCAyMzcgYW5kIDIzODogdGVzdCBFUFNWIGFuZCBQQVNWIHJlc3BvbnNlIGhhbmRsaW5nIHdoZW4gdGhleSBnZXQKICB3ZWxsLSBmb3JtYXRlZCBkYXRhIGJhY2sgYnV0IHVzaW5nIGlsbGVnYWwgdmFsdWVzLiBJbiAyMzcgUEFTViBnZXRzIGFuIElQCiAgYWRkcmVzcyB0aGF0IGlzIHdheSBiYWQuIEluIDIzOCBFUFNWIGdldHMgYSBwb3J0IHRoYXQgaXMgd2F5IG91dCBvZiByYW5nZS4KCkRhbmllbCAoMTQgTWFyY2ggMjAwNSkKLSBBZGRlZCBhIGZldyBtaXNzaW5nIGZlYXR1cmVzIHRvIHRoZSBjdXJsLWNvbmZpZyAtLWZlYXR1cmVzIGxpc3QKCi0gTW9kaWZpZWQgdGVzdGN1cmwucGwgdG8gbm93IG9mZmVyCiAgMSAtIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciBhbGwgaW5mbyBpdCBwcmV2aW91c2x5IG9ubHkgcmVhZCBmcm9tCiAgICAgIGZpbGU6IC0tbmFtZSwgLS1lbWFpbCwgLS1kZXNjIGFuZCAtLWNvbmZpZ3VyZQogIDIgLSAtLW5vY3ZzdXAgbWFrZXMgaXQgbm90IGF0dGVtcHQgdG8gZG8gY3ZzIHVwZGF0ZQogIDMgLSAtLWNyb3NzY29tcGlsZSBpbmZvcm1zIGl0IGFuZCBtYWtlcyBpdCBub3QgYXR0ZW1wdCB0aGluZ3MgaXQgY2FuJ3QgZG8KCi0gRml4ZWQgbnVtZXJvdXMgd2luMzIgY29tcGlsZXIgd2FybmluZ3MuCgotIFJlbW92ZWQgdGhlIGxpYi9zZWN1cml0eS5oIGZpbGUgc2luY2UgaXQgc2hhZG93ZWQgdGhlIG1pbmd3L3dpbjMyIGhlYWRlcgogIHdpdGggdGhlIHNhbWUgbmFtZSB3aGljaCBpcyBuZWVkZWQgZm9yIFNTUEkgYnVpbGRzLiBUaGUgY29udGVudHMgb2YgdGhlCiAgZm9ybWVyIHNlY3VyaXR5LmggaXMgbm93IGkga3JiNC5oCgotIGNvbmZpZ3VyZSAtLWVuYWJsZS1zc3BpIG5vdyBlbmFibGVzIFNTUEkgaW4gdGhlIGJ1aWxkLiBJdCBvbmx5IHdvcmtzIGZvcgogIHdpbmRvd3MgYnVpbGRzIChpbmNsdWRpbmcgY3Jvc3MtY29tcGlsZXMgZm9yIHdpbmRvd3MpLgoKRGFuaWVsICgxMiBNYXJjaCAyMDA1KQotIERhdmlkIEhvdWxkZXIgYWRkZWQgLS1mb3JtLXN0cmluZyB0aGF0IGFkZHMgdGhhdCBzdHJpbmcgdG8gYSBtdWx0aXBhcnQKICBmb3JtcG9zdCBwYXJ0LCB3aXRob3V0IHNwZWNpYWwgY2hhcmFjdGVycyBoYXZpbmcgc3BlY2lhbCBtZWFuaW5ncyBldGMgbGlrZQogIC0tZm9ybSBmZWF0dXJlcy4KCkRhbmllbCAoMTEgTWFyY2ggMjAwNSkKLSBjdXJsX3ZlcnNpb25faW5mbygpIHJldHVybnMgdGhlIGZlYXR1cmUgYml0IENVUkxfVkVSU0lPTl9TU1BJIGlmIGl0IHdhcwogIGJ1aWx0IHdpdGggU1NQSSBzdXBwb3J0LgoKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgbWFkZSBpdCBwb3NzaWJsZSB0byBidWlsZCBsaWJjdXJsIHdpdGggdGhlCiAgVVNFX1dJTkRPV1NfU1NQSSBvbiBXaW5kb3dzLCBhbmQgdGhlbiBsaWJjdXJsIHdpbGwgYmUgYnVpbHQgdG8gdXNlIHRoZQogIG5hdGl2ZSB3YXkgdG8gZG8gTlRMTS4gU1NQSSBhbHNvIGFsbG93cyBsaWJjdXJsIHRvIHBhc3Mgb24gdGhlIGN1cnJlbnQgdXNlcgogIGFuZCBpdHMgcGFzc3dvcmQgaW4gdGhlIHJlcXVlc3QuCgpEYW5pZWwgKDkgTWFyY2ggMjAwNSkKLSBEYW4gRiBpbXByb3ZlZCB0aGUgU1NMIGxpYiBzZXR1cCBpbiBjb25maWd1cmUuCgotIE5vZGFrIFNvZGFrIHJlcG9ydGVkIGEgY3Jhc2ggd2hlbiB1c2luZyBhIFNPQ0tTNCBwcm94eS4KCi0gSmVhbi1NYXJjIFJhbmdlciBwb2ludGVkIG91dCBhbiBlbWJhcmFzc2luZyBkZWJ1ZyBwcmludGYoKSBsZWZ0b3ZlciBpbiB0aGUKICBtdWx0aSBpbnRlcmZhY2UgY29kZS4KCi0gQWRqdXN0ZWQgdGhlIG1hbiBwYWdlIGZvciB0aGUgY3VybF9nZXRkYXRlKCkgcmV0dXJuIHZhbHVlIGZvciBkYXRlcyBhZnRlcgogIHllYXIgMjAzOC4gRm9yIDMyIGJpdCB0aW1lX3QgaXQgcmV0dXJucyAweDdmZmZmZmZmIGJ1dCBmb3IgNjRiaXQgdGltZV90IGl0CiAgcmV0dXJucyBlaXRoZXIgdGhlIGNvcnJlY3QgdmFsdWUgb3IgZXZlbiAtMSBvbiBzb21lIHN5c3RlbXMgdGhhdCBzdGlsbCBzZWVtCiAgdG8gbm90IGRlYWwgd2l0aCB0aGlzIHByb3Blcmx5LiBUb3IgQXJudHNlbiBmb3VuZCBhIDY0Yml0IEFJWCBzeXN0ZW0gZm9yIHVzCiAgdGhhdCBkaWQgdGhlIGxhdHRlci4gR3dlbm9sZSBCZWF1Y2hlc25lJ3MgTWFuZHJha2UgcGF0Y2ggcHV0IHRoZSBsaWdodHMgb24KICB0aGlzIHByb2JsZW0gaW4gdGhlIGZpcnN0IHBsYWNlLgoKRGFuaWVsICg4IE1hcmNoIDIwMDUpCi0gRG9taW5pY2sgTWVnbGlvIHJlcG9ydGVkIHRoYXQgdXNpbmcgQ1VSTE9QVF9GSUxFVElNRSB3aGVuIHRyYW5zZmVycmluZyBhIEZUUAogIGZpbGUgZ290IGEgTGFzdC1Nb2RpZmllZDogaGVhZGVyIHdyaXR0ZW4gdG8gdGhlIGRhdGEgc3RyZWFtLCBjb3JydXB0aW5nIHRoZQogIGFjdHVhbCBkYXRhLiBUaGlzIHdhcyBiZWNhdXNlIHNvbWUgY29uZGl0aW9ucyBmcm9tIHRoZSBwcmV2aW91cyBGVFAgY29kZSB3YXMKICBub3QgcHJvcGVybHkgYnJvdWdodCBpbnRvIHRoZSBuZXcgRlRQIGNvZGUuIEkgZml4ZWQgYW5kIEkgYWRkZWQgdGVzdCBjYXNlCiAgNTIwIHRvIHZlcmlmeS4gKFRoaXMgYnVnIHdhcyBpbnRyb2R1Y2VkIGluIDcuMTMuMSkKCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHRoZSBjb25maWd1cmUgLS13aXRoLXpsaWIgb3B0aW9uIHRvIGFsd2F5cyBjb25zaWRlciB0aGUKICBnaXZlbiBwYXRoIGJlZm9yZSBhbnkgc3RhbmRhcmQgcGF0aHMuCgpEYW5pZWwgKDYgTWFyY2ggMjAwNSkKLSBSYW5keSBNY011cmNoeSB3YXMgdGhlIGZpcnN0IHRvIHJlcG9ydCB0aGF0IHZhbGdyaW5kLnBtIHdhcyBtaXNzaW5nIGZyb20gdGhlCiAgcmVsZWFzZSBhcmNoaXZlIGFuZCB0aHVzICdtYWtlIHRlc3QnIGZhaWxzLgoKRGFuaWVsICg1IE1hcmNoIDIwMDUpCi0gRGFuIEZhbmRyaWNoIGFkZGVkIEhBVkVfRlRSVU5DQVRFIHRvIHNldmVyYWwgY29uZmlnLSouaCBmaWxlcy4KCi0gQWRkZWQgdGVzdCBjYXNlIDIzNSB0aGF0IG1ha2VzIGEgcmVzdW1lZCB1cGxvYWQgb2YgYSBmaWxlIHRoYXQgaXNuJ3QgcHJlc2VudAogIG9uIHRoZSByZW1vdGUgc2lkZS4gVGhpcyB0aGVuIGNvbnZlcnRzIHRoZSBvcGVyYXRpb24gdG8gYW4gb3JkaW5hcnkgU1RPUgogIHVwbG9hZC4gVGhpcyB3YXMgcmVxdWVzdGVkL3BvaW50ZWQgb3V0IGJ5IElnbmFjaW8gVmF6cXVlei1BYnJhbXMuCgogIEl0IGFsc28gcHJvdmVkIChhbmQgSSBmaXhlZCkgYSBidWcgaW4gdGhlIG5ld2x5IHJld3JpdHRlbiBmdHAgY29kZSAoYW5kCiAgcHJlc2VudCBpbiB0aGUgNy4xMy4xIHJlbGVhc2UpIHdoZW4gdHJ5aW5nIHRvIHJlc3VtZSBhbiB1cGxvYWQgYW5kIHRoZQogIHNlcnZlcnMgcmV0dXJucyBhbiBlcnJvciB0byB0aGUgU0laRSBjb21tYW5kLiBsaWJjdXJsIHRoZW4gbG9vcHMgYW5kIHNlbmRzCiAgU0laRSBjb21tYW5kcyBpbmZpbml0ZWx5LgoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgYSBTU0wgcHJvYmxlbSBpbnRyb2R1Y2VkIG9uIEZlYnJ1YXJ5IDl0aCB0aGF0IG1hZGUKICBsaWJjdXJsIGF0dGVtcHQgdG8gbG9hZCB0aGUgd2hvbGUgcmFuZG9tIGZpbGUgdG8gc2VlZCB0aGUgUFJORy4gVGhpcyBpcwogIHJlYWxseSBiYWQgc2luY2UgdGhpcyB0dXJucyBvdXQgdG8gYmUgdXNpbmcgL2Rldi91cmFuZG9tIGF0IHRpbWVzLi4uCgpWZXJzaW9uIDcuMTMuMSAoNCBNYXJjaCAyMDA1KQoKRGFuaWVsICg0IE1hcmNoIDIwMDUpCi0gRGF2ZSBEcmliaW4gbWFkZSBpdCBwb3NzaWJsZSB0byBzZXQgQ1VSTE9QVF9DT09LSUVGSUxFIHRvICIiIHRvIGFjdGl2YXRlCiAgdGhlIGNvb2tpZSAiZW5naW5lIiB3aXRob3V0IGhhdmluZyB0byBwcm92aWRlIGFuIGVtcHR5IG9yIG5vbi1leGlzdGluZyBmaWxlLgoKLSBSZW5lIFJlYmUgZml4ZWQgYSAtIyBjcmFzaCB3aGVuIG1vcmUgZGF0YSB0aGFuIGV4cGVjdGVkIHdhcyByZXRyaWV2ZWQuCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDUpCi0gTlRMTSBhbmQgZnRwLWtyYjQgYnVmZmVyIG92ZXJmbG93IGZpeGVkLCBhcyByZXBvcnRlZCBoZXJlOgogIGh0dHA6Ly93d3cuc2VjdXJpdHlmb2N1cy5jb20vYXJjaGl2ZS8xLzM5MTA0MiBhbmQgdGhlIENBTiByZXBvcnQgaGVyZToKICBodHRwczovL2N2ZS5taXRyZS5vcmcvY2dpLWJpbi9jdmVuYW1lLmNnaT9uYW1lPUNBTi0yMDA1LTA0OTAKCiAgSWYgdGhlc2Ugc2VjdXJpdHkgZ3V5cyB3ZXJlIHNlcmlvdXMsIHdlJ2QgYmVlbiBub3RpZmllZCBpbiBhZHZhbmNlIGFuZCB3ZQogIGNvdWxkJ3ZlIHNhdmVkIGEgZmV3IG9mIHlvdSBhIGxpdHRsZSBzdXJwcmlzZSwgYnV0IG5vdyB3ZSB3ZXJlbid0LgoKRGFuaWVsICgxOSBGZWJydWFyeSAyMDA1KQotIFJhbHBoIE1pdGNoZWxsIHJlcG9ydGVkIGEgZmxhdyB3aGVuIHlvdSB1c2VkIGEgcHJveHkgd2l0aCBhdXRoLCBhbmQgeW91CiAgcmVxdWVzdGVkIGRhdGEgZnJvbSBhIGhvc3QgYW5kIHRoZW4gZm9sbG93ZWQgYSByZWRpcmVjdCB0byBhbm90aGVyCiAgaG9zdC4gbGliY3VybCB0aGVuIGRpZG4ndCB1c2UgdGhlIHByb3h5LWF1dGggcHJvcGVybHkgaW4gdGhlIHNlY29uZCByZXF1ZXN0LAogIGR1ZSB0byB0aGUgaG9zdC1vbmx5IGNoZWNrIGZvciBvcmlnaW5hbCBob3N0IG5hbWUgd3JvbmdseSBiZWluZyBleHRlbmRlZCB0bwogIHRoZSBwcm94eSBhdXRoIGFzIHdlbGwuIEFkZGVkIHRlc3QgY2FzZSAyMzMgdG8gdmVyaWZ5IHRoZSBmbGF3IGFuZCB0aGF0IHRoZQogIGZpeCByZW1vdmVkIHRoZSBwcm9ibGVtLgoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDA1KQotIE1pa2UgRG9iYnMgcmVwb3J0ZWQgYSBtaW5ndyBidWlsZCBmYWlsdXJlIGR1ZSB0byB0aGUgbGFjayBvZgogIEJVSUxESU5HX0xJQkNVUkwgYmVpbmcgZGVmaW5lZCB3aGVuIGxpYmN1cmwgaXMgYnVpbHQuIE5vdyB0aGlzIGlzIGRlZmluZWQgYnkKICBjb25maWd1cmUgd2hlbiBtaW5ndyBpcyB1c2VkLgoKRGFuaWVsICgxNyBGZWJydWFyeSAyMDA1KQotIERhdmlkIGluIGJ1ZyByZXBvcnQgIzExMjQ1ODggZm91bmQgYW5kIGZpeGVkIGEgc29ja2V0IGxlYWsgd2hlbiBsaWJjdXJsCiAgZGlkbid0IGNsb3NlIHRoZSBzb2NrZXQgcHJvcGVybHkgd2hlbiByZXR1cm5pbmcgZXJyb3IgZHVlIHRvIGZhaWxpbmcKICBsb2NhbGJpbmQKCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwNSkKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggSFRUUC1QT1NUaW5nIHVzaW5nICJhbnlhdXRoIgogIHRoYXQgcGlja3MgTlRMTS4gVGhhbmtzIHRvIERhdmlkIEJ5cm9uIGxldHRpbmcgbWUgdGVzdCBOVExNIGFnYWluc3QgaGlzCiAgc2VydmVycywgSSBjb3VsZCBxdWlja2x5IHJlcGVhdCBhbmQgZml4IHRoZSBwcm9ibGVtLiBJdCB0dXJuZWQgb3V0IHRvIGJlOgoKICBXaGVuIGxpYmN1cmwgUE9TVHMgd2l0aG91dCBrbm93aW5nL3VzaW5nIGFuIGF1dGhlbnRpY2F0aW9uIGFuZCBpdCBnZXRzIGJhY2sKICBhIGxpc3Qgb2YgdHlwZXMgZnJvbSB3aGljaCBpdCBwaWNrcyBOVExNLCBpdCBuZWVkcyB0byBlaXRoZXIgY29udGludWUKICBzZW5kaW5nIGl0cyBkYXRhIGlmIGl0IGtlZXBzIHRoZSBjb25uZWN0aW9uIGFsaXZlLCBvciBub3Qgc2VuZCB0aGUgZGF0YSBidXQKICBjbG9zZSB0aGUgY29ubmVjdGlvbi4gVGhlbiBkbyB0aGUgZmlyc3Qgc3RlcCBpbiB0aGUgTlRMTSBhdXRoLiBsaWJjdXJsCiAgZGlkbid0IHNlbmQgdGhlIGRhdGEgbm9yIGNsb3NlIHRoZSBjb25uZWN0aW9uIGJ1dCBzaW1wbHkgcmVhZCB0aGUKICByZXNwb25zZS1ib2R5IGFuZCB0aGVuIHNlbnQgdGhlIGZpcnN0IG5lZ290aWF0aW9uIHN0ZXAuIFdoaWNoIHRoZW4gZmFpbGVkCiAgbWlzZXJhYmx5IG9mIGNvdXJzZS4gVGhlIGZpeGVkIHZlcnNpb24gZm9yY2VzIGEgY29ubmVjdGlvbiBpZiB0aGVyZSBpcyBtb3JlCiAgdGhhbiAyMDAwIGJ5dGVzIGxlZnQgdG8gc2VuZC4KCkRhbmllbCAoMTQgRmVicnVhcnkgMjAwNSkKLSBUaGUgY29uZmlndXJlIHNjcmlwdCBkaWRuJ3QgY2hlY2sgZm9yIEVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpIHNvIGl0CiAgd2FzIG5ldmVyIHVzZWQuCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDUpCi0gUmVtb3ZlZCBhbGwgdXNlcyBvZiBzdHJmdGltZSgpIHNpbmNlIGl0IHVzZXMgdGhlIGxvY2FsaXNlZCB2ZXJzaW9uIG9mIHRoZQogIHdlZWsgZGF5IG5hbWVzIGFuZCBtb250aCBuYW1lcyBhbmQgc2VydmVycyBkb24ndCBsaWtlIHRoYXQuCgpEYW5pZWwgKDEwIEZlYnJ1YXJ5IDIwMDUpCi0gTm93IHRoZSB0ZXN0IHNjcmlwdCBkaXNhYmxlcyB2YWxncmluZC10ZXN0aW5nIHdoZW4gdGhlIHRlc3Qgc3VpdGUgcnVucyBpZgogIGxpYmN1cmwgaXMgYnVpbHQgc2hhcmVkLiBPdGhlcndpc2UgdmFsZ3JpbmQgb25seSB0ZXN0cyB0aGUgc2hlbGwgdGhhdCBydW5zCiAgdGhlIHdyYXBwZXItc2NyaXB0IG5hbWVkICdjdXJsJyB0aGF0IGlzIGEgZnJvbnQtZW5kIHRvIGN1cmwgaW4gdGhpcyBjYXNlLgogIFRoaXMgc2hvdWxkIGFsc28gZml4IHRoZSBodWdlIGFtb3VudCBvZiByZXBvcnRzIG9mIGZhbHNlIHBvc2l0aXZlcyB3aGVuCiAgdmFsZ3JpbmQgaGFzIGlkZW50aWZpZWQgbGVha3MgaW4gKGJhKXNoIGFuZCBub3QgaW4gY3VybCBhbmQgcGVvcGxlIHJlcG9ydAogIHRoYXQgYXMgY3VybCBidWdzLiBCdWcgcmVwb3J0ICMxMTE2NjcyIGlzIG9uZSBleGFtcGxlLgoKICBBbHNvLCB0aGUgdmFsZ3JpbmQgcmVwb3J0IHBhcnNlciBoYXMgYmVlbiBhZGFwdGVkIHRvIGNoZWNrIHRoYXQgYXQgbGVhc3Qgb25lCiAgb2YgdGhlIHNvdXJjZXMgaW4gYSBzdGFjayBzdHJhY2UgaXMgb25lIG9mIChsaWIpY3VybCdzIHNvdXJjZSBmaWxlcyBvcgogIG90aGVyd2lzZSBpdCB3aWxsIG5vdCBjb25zaWRlciB0aGUgcHJvYmxlbSB0byBjb25jZXJuIChsaWIpY3VybC4KCi0gTWFydHkgS3VocnQgc3RyZWFtbGluZWQgdGhlIFZNUyBidWlsZC4KCkRhbmllbCAoOSBGZWJydWFyeSAyMDA1KQotIERhdmlkIEJ5cm9uIGZpeGVkIGhpcyBTU0wgcHJvYmxlbXMsIGluaXRpYWxseSBtZW50aW9uZWQgaGVyZToKICBodHRwczovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA1LTAxLzAyNDAuaHRtbC4gSXQgdHVybmVkIG91dCB3ZSBkaWRuJ3QgdXNlCiAgU1NMX3BlbmRpbmcoKSBhcyB3ZSBzaG91bGQuCgotIENvbnZlcnRlZCBsb3RzIG9mIEZUUCBjb2RlIHRvIGEgc3RhdGVtYWNoaW5lLCBzbyB0aGF0IHRoZSBtdWx0aSBpbnRlcmZhY2UKICBkb2Vzbid0IGJsb2NrIHdoaWxlIGNvbW11bmljYXRpbmcgY29tbWFuZHMtcmVzcG9uc2VzIHdpdGggYW4gRlRQIHNlcnZlci4KCiAgSSd2ZSBhZGRlZCBhIGNvbW1lbnQgbGlrZSBCTE9DS0lORyBpbiB0aGUgY29kZSBvbiBhbGwgc3BvdHMgSSBjb3VsZCBmaW5kCiAgd2hlcmUgd2Ugc3RpbGwgaGF2ZSBibG9ja2luZyBvcGVyYXRpb25zLiBXaGVuIHdlIGNoYW5nZSBjdXJsX2Vhc3lfcGVyZm9ybSgpCiAgdG8gdXNlIHRoZSBtdWx0aSBpbnRlcmZhY2UsIHdlJ2xsIGFsc28gYmUgYWJsZSB0byBzaW1wbGlmeSB0aGUgY29kZSBzaW5jZQogIHRoZXJlIHdpbGwgb25seSBiZSBvbmUgImludGVybmFsIGludGVyZmFjZSIuCgogIFdoaWxlIGRvaW5nIHRoaXMsIEkndmUgbm93IG1hZGUgQ1VSTEVfRlRQX0FDQ0VTU19ERU5JRUQgc2VwYXJhdGUgZnJvbSB0aGUKICBuZXcgQ1VSTEVfTE9HSU5fREVOSUVELiBUaGUgZmlyc3Qgb25lIGlzIG5vdyBhY2Nlc3MgZGVuaWVkIHRvIGEgZnVuY3Rpb24sCiAgbGlrZSBjaGFuZ2luZyBkaXJlY3Rvcnkgb3IgcmV0cmlldmluZyBhIGZpbGUsIHdoaWxlIHRoZSBzZWNvbmQgbWVhbnMgdGhhdCB3ZQogIHdlcmUgZGVuaWVkIGxvZ2luLgoKICBUaGUgQ1ZTIHRhZyAnYmVmb3JlX2Z0cF9zdGF0ZW1hY2hpbmUnIHdhcyBzZXQganVzdCBiZWZvcmUgdGhpcyB3ZW50IGluLCBpbgogIGNhc2Ugb2YgZnV0dXJlIG5lZWQuCgotIEdpc2xlIG1hZGUgdGhlIERJQ1QgY29kZSBzZW5kIENSTEYgYW5kIG5vdCBqdXN0IExGIGFzIHRoZSBzcGVjIHNheXMgc28uCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwNSkKLSBHaXNsZSBmaXhlZCBwcm9ibGVtcyB3aGVuIGxpYmN1cmwgcnVucyBvdXQgb2YgbWVtb3J5LCBhbmQgd29ya2VkIG9uIG1ha2luZwogIHN1cmUgdGhlIHByb3BlciBlcnJvciBjb2RlIGlzIHJldHVybmVkIGZvciB0aG9zZSBvY2NhdGlvbnMuCgpEYW5pZWwgKDcgRmVicnVhcnkgMjAwNSkKLSBNYXJ1a28gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggaW5mbGF0ZSBkZWNvbXByZXNzaW5nIGV4YWN0bHkgNjRLCiAgY29udGVudHMuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwNSkKLSBFcmljIFZlcmduYXVkIGZvdW5kIGEgdXNlIG9mIGFuIHVuaW5pdGlhbGlzZWQgdmFyaWFibGUgaW4gdGhlIGZ0cCB3aGVuIGRvaW5nCiAgUE9SVCBvbiBJUHY2LWVuYWJsZWQgaG9zdHMuCgotIERhdmlkIEJ5cm9uIHBvaW50ZWQgb3V0IHdlIGNvdWxkIHVzZSBCVUZTSVpFIHRvIHJlYWQgZGF0YSAoaW4KICBsaWIvdHJhbnNmZXIuYykgaW5zdGVhZCBvZiB1c2luZyBCVUZTSVpFIC0xLgoKVmVyc2lvbiA3LjEzLjAgKDEgRmVicnVhcnkgMjAwNSkKCkRhbmllbCAoMzEgSmFudWFyeSAyMDA1KQotIEFkZGVkIExhcnMgTmlsc3NvbidzIGh0bWx0aXRsZS5jYyBleGFtcGxlCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwNSkKLSBGaXhlZCBhIG1lbW9yeSBsZWFrIHdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSBhbmQgdGhlIERPIG9wZXJhdGlvbgogIGZhaWxlZCAoYXMgaW4gdGVzdCBjYXNlIDIwNSkuCgotIEZpeGVkIGEgdmFsZ3JpbmQgd2FybmluZyBmb3IgZmlsZTovLyBvcGVyYXRpb25zLgoKLSBGaXhlZCBhIHZhbGdyaW5kIHJlcG9ydCBpbiB0aGUgdXJsIGdsb2JiaW5nIGNvZGUgZm9yIHRoZSBjdXJsIGNvbW1hbmQgbGluZQogIHRvb2wuCgotIEJ1Z2ZpeGVkIHRoZSBwYXJzZXIgdGhhdCBzY2FucyB0aGUgdmFsZ3JpbmQgcmVwb3J0IG91dHB1dHMgKGluIHJ1bnRlc3RzLnBsKS4KICBJIG5vdGljZWQgdGhhdCBpdCBwcmV2aW91c2x5IGRpZG4ndCBkZXRlY3QgYW5kIHJlcG9ydCB0aGUgIkNvbmRpdGlvbmFsIGp1bXAKICBvciBtb3ZlIGRlcGVuZHMgb24gdW5pbml0aWFsaXNlZCB2YWx1ZShzKSIgZXJyb3IuIFdoZW4gSSBmaXhlZCB0aGlzLCBJCiAgY2F1Z2h0IGEgZmV3IGN1cmwgYnVncyB3aXRoIGl0LiBBbmQgdGhlbiBJIGhhZCB0byBzcGVuZCB0aW1lIHRvIG1ha2UgdGhlCiAgdGVzdCBzdWl0ZSBJR05PUkUgdGhlc2UgZXJyb3JzIHdoZW4gT3BlblNTTCBpcyB1c2VkIHNpbmNlIGl0IHByb2R1Y2UgbWFzc2l2ZQogIGFtb3VudHMgb2YgdmFsZ3JpbmQgd2FybmluZ3MgKGJ1dCBvbmx5IG9mIHRoZSAiQ29uZGl0aW9uYWwuLi4iIGtpbmQgaXQKICBzZWVtcykuIFNvLCBpZiBhIHRlc3QgdGhhdCByZXF1aXJlcyBTU0wgaXMgcnVuLCBpdCBpZ25vcmVzIHRoZQogICJDb25kaXRpb25hbC4uLiIgZXJyb3JzLCBhbmQgeW91J2xsIGdldCBhICJ2YWxncmluZCBQQVJUSUFMIiBvdXRwdXQgaW5zdGVhZAogIG9mICJ2YWxncmluZCBPSyIuCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwNSkKLSBVc2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlLCBhbmQgZG9pbmcgYSByZXF1c3RlZCBhIHJlLXVzZWQgY29ubmVjdGlvbiB0aGF0CiAgZ2V0cyBjbG9zZWQganVzdCBhZnRlciB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzZW50IGZhaWxlZCBhbmQgZGlkIG5vdCByZS1pc3N1ZQogIGEgcmVxdWVzdCBvbiBhIGZyZXNoIHJlY29ubmVjdCBsaWtlIHRoZSBlYXN5IGludGVyZmFjZSBkaWQuIE5vdyBpdCBkb2VzIQoKLSBEZWZpbmUgQ1VSTF9NVUxUSUVBU1kgd2hlbiBidWlsZGluZyBsaWJjdXJsIChsaWIvZWFzeS5jIHRvIGJlIGV4YWN0KSwgdG8gdXNlCiAgbXkgbmV3IGN1cmxfZWFzeV9wZXJmb3JtKCkgdGhhdCB1c2VzIHRoZSBtdWx0aSBpbnRlcmZhY2UgdG8gcnVuIHRoZQogIHJlcXVlc3QuIEl0IGlzIGEgZ3JlYXQgdGVzdGJlZCBmb3IgdGhlIG11bHRpIGludGVyZmFjZSBhbmQgSSBiZWxpZXZlIHdlCiAgc2hhbGwgZG8gaXQgdGhpcyB3YXkgZm9yIHJlYWwgaW4gdGhlIGZ1dHVyZSB3aGVuIHdlIGhhdmUgYSBzdWNjZXNzb3IgdG8KICBjdXJsX211bHRpX2Zkc2V0KCkuIEkndmUgdXNlZCB0aGlzIGFwcHJvYWNoIHRvIGRldGVjdCBhbmQgZml4IHNldmVyYWwgb2YgdGhlCiAgcmVjZW50IG11bHRpLWludGVyZmFjZXMgaXNzdWVzLgoKLSBBZGp1c3RlZCB0aGUgS05PV05fQlVHUyAjMTcgZml4IGEgYml0IG1vcmUgc2luY2UgdGhlIEZUUCBjb2RlIGFsc28gZGlkIHNvbWUKICBiYWQgYXNzdW1wdGlvbnMuCgotIG11bHRpIGludGVyZmFjZTogd2hlbiBhIHJlcXVlc3QgaXMgZGVuaWVkIGR1ZSB0byAiTWF4aW11bSByZWRpcmVjdHMKICBmb2xsb3dlZCIgbGliY3VybCBsZWFrZWQgdGhlIGxhc3QgTG9jYXRpb246IFVSTC4KCi0gQ29ubmVjdCBmYWlsdXJlcyB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2FzIG9mdGVuIHJldHVybmVkIGFzICJjb25uZWN0KCkKICB0aW1lZCBvdXQiIGV2ZW4gdGhvdWdoIHRoZSByZWFzb24gd2FzIGRpZmZlcmVudC4KCkRhbmllbCAoMjggSmFudWFyeSAyMDA1KQotIEtOT1dOX0JVR1MgIzE3IGZpeGVkLiBBIEROUyBjYWNoZSBlbnRyeSBtYXkgbm90IHJlbWFpbiBsb2NrZWQgYmV0d2VlbiB0d28KICBjdXJsX2Vhc3lfcGVyZm9ybSgpIGludm9rZXMuIEl0IHdhcyBwcmV2aW91c2x5IHVubG9ja2VkIGF0IGRpc2Nvbm5lY3QsIHdoaWNoCiAgY291bGQgbWVhbiB0aGF0IGl0IHJlbWFpbmVkIGxvY2tlZCBiZXR3ZWVuIG11bHRpcGxlIHRyYW5zZmVycy4gVGhlIEROUyBjYWNoZQogIG1heSBub3QgbGl2ZSBhcyBsb25nIGFzIHRoZSBjb25uZWN0aW9uIGNhY2hlIGRvZXMsIGFzIHRoZXkgYXJlIHNlcGFyYXRlLgoKICBUbyBkZWFsIHdpdGggdGhlIGxhY2sgb2YgRE5TIChob3N0IGFkZHJlc3MpIGRhdGEgYXZhaWxhYmlsaXR5IGluIHJlLXVzZWQKICBjb25uZWN0aW9ucywgbGliY3VybCBub3cga2VlcHMgYSBjb3B5IG9mIHRoZSBJUCBhZHJlc3MgYXMgYSBzdHJpbmcsIHRvIGJlCiAgYWJsZSB0byBzaG93IGl0IGV2ZW4gb24gc3Vic2VxdWVudCByZXF1ZXN0cyBvbiB0aGUgc2FtZSBjb25uZWN0aW9uLgoKICBUaGUgcHJvYmxlbSBjb3VsZCBiZSBtYWRlIHRvIGFwcGVhciB3aXRoIHRoaXMgc3R1bnQ6CgogIDEuIGNyZWF0ZSBhIG11bHRpIGhhbmRsZQogIDIuIGFkZCBhbiBlYXN5IGhhbmRsZQogIDMuIGZldGNoIGEgVVJMIHRoYXQgaXMgcGVyc2lzdGVudCAobGVhdmVzIHRoZSBjb25uZWN0aW9uIGFsaXZlKQogIDQuIHJlbW92ZSB0aGUgZWFzeSBoYW5kbGUgZnJvbSB0aGUgbXVsdGkKICA1LiBraWxsIHRoZSBtdWx0aSBoYW5kbGUKICA2LiBjcmVhdGUgYSBtdWx0aSBoYW5kbGUKICA3LiBhZGQgdGhlIHNhbWUgZWFzeSBoYW5kbGUgdG8gdGhlIG5ldyBtdWx0aSBoYW5kbGUKICA4LiBmZXRjaCBhIFVSTCBmcm9tIHRoZSBzYW1lIHNlcnZlciBhcyBiZWZvcmUgKHJlLXVzaW5nIHRoZSBjb25uZWN0aW9uKQoKLSBTdGVwaGVuIE1vcmUgcG9pbnRlZCBvdXQgdGhhdCBDVVJMT1BUX0ZUUFBPUlQgYW5kIHRoZSAtUCBvcHRpb24gZGlkbid0IHdvcmsKICB3aGVuIGJ1aWx0IElQdjYtZW5hYmxlZC4gSSd2ZSBub3cgbWFkZSBhIGZpeCBmb3IgaXQuIFdyaXRpbmcgdGVzdCBjYXNlcyBmb3IKICBjdXN0b20gcG9ydCBob3N0cyB0dXJuZWQgdG9vIHRyaWNreSBzbyB1bmZvcnR1bmF0ZWx5IHRoZXJlJ3Mgbm9uZS4KCkRhbmllbCAoMjUgSmFudWFyeSAyMDA1KQotIElhbiBGb3JkIGFza2VkIGFib3V0IHN1cHBvcnQgZm9yIHRoZSBGVFAgY29tbWFuZCBBQ0NULCBhbmQgSSBkaXNjb3ZlcmVkIGl0CiAgaXMgcHJlc2VudCBpbiBSRkM5NTkuLi4gc28gbm93IChsaWIpY3VybCBzdXBwb3J0cyBpdCBhcyB3ZWxsLiAtLWZ0cC1hY2NvdW50CiAgYW5kIENVUkxPUFRfRlRQX0FDQ09VTlQgc2V0IHRoZSBhY2NvdW50IHN0cmluZy4gKFRoZSBzZXJ2ZXIgbWF5IGFzayBmb3IgYW4KICBhY2NvdW50IHN0cmluZyBhZnRlciBQQVNTIGhhdmUgYmVlbiBzZW50IGF3YXkuIFRoZSBjbGllbnQgcmVzcG9uZHMKICB3aXRoICJBQ0NUIFthY2NvdW50IHN0cmluZ10iLikgQWRkZWQgdGVzdCBjYXNlIDIyOCBhbmQgMjI5IHRvIHZlcmlmeSB0aGUKICBmdW5jdGlvbmFsaXR5LiBVcGRhdGVkIHRoZSB0ZXN0IEZUUCBzZXJ2ZXIgdG8gc3VwcG9ydCBBQ0NUIHNvbWV3aGF0LgoKLSBEYXZpZCBTaGF3IGNvbnRyaWJ1dGVkIGEgZmFpcmx5IGNvbXBsZXRlIGFuZCBkZXRhaWxlZCBhdXRvY29uZiB0ZXN0IHlvdSBjYW4KICB1c2UgdG8gZGV0ZWN0IGxpYmN1cmwgYW5kIHNldHVwIHZhcmlhYmxlcyBmb3IgdGhlIHByb3RvY29scyB0aGUgaW5zdGFsbGVkCiAgbGliY3VybCBzdXBwb3J0czogZG9jcy9saWJjdXJsL2xpYmN1cmwubTQKCkRhbmllbCAoMjEgSmFudWFyeSAyMDA1KQotIE1ham9yIEZUUCB0aGlyZCBwYXJ0eSB0cmFuc2ZlciBvdmVyaGF1bC4KCiAgVGhlc2UgZm91ciBvcHRpb25zIGFyZSBub3cgb2Jzb2xldGU6IENVUkxPUFRfU09VUkNFX0hPU1QsCiAgQ1VSTE9QVF9TT1VSQ0VfUEFUSCwgQ1VSTE9QVF9TT1VSQ0VfUE9SVCAodGhpcyBvcHRpb24gZGlkbid0IHdvcmsgYmVmb3JlKQogIGFuZCBDVVJMT1BUX1BBU1ZfSE9TVC4KCiAgVGhlc2UgdHdvIG9wdGlvbnMgYXJlIGFkZGVkOiBDVVJMT1BUX1NPVVJDRV9VUkwgYW5kIENVUkxPUFRfU09VUkNFX1FVT1RFLgoKICBUaGUgdGFyZ2V0LXNpZGUgZGlkbid0IHVzZSB0aGUgcHJvcGVyIHBhdGggd2l0aCBSRVRSLCBhbmQgdGh1cyB0aGlzIG9ubHkKICB3b3JrZWQgY29ycmVjdGx5IGluIHRoZSBsb2dpbiBwYXRoIChpLmUgd2l0aG91dCBkb2luZyBhbnkgQ1dEKS4gVGhlIHNvdXJjZS0KICBzaWRlIHN0aWxsIHVzZXMgYSB3cm9uZyBwYXRoLCBidXQgdGhlIGZpeCBmb3IgdGhpcyB3aWxsIG5lZWQgdG8gd2FpdC4gVmVyaWZ5CiAgdGhlIGZsYXcgYnkgdXNpbmcgYSBzb3VyY2UgVVJMIHdpdGggaW5jbHVkZWQgJVhYLWNvZGVzLgoKICBNYWRlIENVUkxPUFRfRlRQUE9SVCBjb250cm9sIHdlYXRoZXIgdGhlIHRhcmdldCBvcGVyYXRpb24gc2hvdWxkIHVzZSBQT1JUCiAgKG9yIG5vdCkuIFRoZSBvdGhlciBzaWRlIHRodXMgdXNlcyBwYXNzaXZlIChQQVNWKSBtb2RlLgoKICBVcGRhdGVkIHRoZSBmdHAzcmRwYXJ0eS5jIGV4YW1wbGUgc291cmNlIHRvIHVzZSB0aGUgdXBkYXRlZCBvcHRpb25zLgoKICBBZGRlZCBzdXBwb3J0IGZvciBhIHNlY29uZCBGVFAgc2VydmVyIGluIHRoZSB0ZXN0IHN1aXRlLiBOYW1lZC4uLiBmdHAyLgogIEFkZGVkIHRlc3QgY2FzZXMgMjMwLCAyMzEgYW5kIDIzMiBhcyBhIGZldyBmaXJzdCBiYXNpYyB0ZXN0cyBvZiB2ZXJ5IHNpbXBsZQogIDNyZCBwYXJ0eSB0cmFuc2ZlcnMuCgogIENoYW5nZWQgdGhlIGRlYnVnIG91dHB1dCB0byBpbmNsdWRlICd0YXJnZXQnIGFuZCAnc291cmNlJyB3aGVuIGEgM3JkIHBhcnR5CiAgaXMgYmVpbmcgbWFkZSwgdG8gbWFrZSBpdCBjbGVhcmVyIHdoYXQgY29tbWFuZHMvcmVzcG9uc2VzIGNhbWUgb24gd2hhdAogIGNvbm5lY3Rpb24uCgogIEFkZGVkIHRocmVlIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uczogLS0zcC11cmwsIC0tM3AtdXNlciBhbmQgLS0zcC1xdW90ZS4KCiAgRG9jdW1lbnRlZCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG9wdGlvbnMgcmVsYXRlZAogIHRvIHRoaXJkIHBhcnR5IHRyYW5zZmVycy4KCiAgKFRlbXBvcmFyaWx5KSBkaXNhYmxlZCB0aGUgYWJpbGl0eSB0byByZS11c2UgYW4gZXhpc3RpbmcgY29ubmVjdGlvbiBmb3IgdGhlCiAgc291cmNlIGNvbm5lY3Rpb24uIFRoaXMgaXMgYmVjYXVzZSBpdCBuZWVkcyB0byBmb3JjZSBhIG5ldyBpbiBjYXNlIHRoZQogIHNvdXJjZSBhbmQgdGFyZ2V0IGlzIHRoZSBzYW1lIGhvc3QsIGFuZCB0aGUgaG9zdCBuYW1lIGNoZWNrIGlzIHRyaWNraWVyIG5vdwogIHdoZW4gdGhlIHNvdXJjZSBpcyBpZGVudGlmaWVkIHdpdGggYSBmdWxsIFVSTCBpbnN0ZWFkIG9mIGEgcGxhaW4gaG9zdCBuYW1lCiAgbGlrZSBiZWZvcmUuCgogIFRPRE8gKHNob3J0LXRlcm0pIGZvciAzcmQgcGFydHkgdHJhbnNmZXJzOiBxdW90ZSBzdXBwb3J0LiBUaGUgb3B0aW9ucyBhcmUKICB0aGVyZSwgd2UgbmVlZCB0byBhZGQgdGVzdCBjYXNlcyB0byB2ZXJpZnkgdGhlaXIgZnVuY3Rpb25hbGl0eS4KCiAgVE9ETyAobG9uZy10ZXJtKSBmb3IgM3JkIHBhcnR5IHRyYW5zZmVyczogSVB2NiBzdXBwb3J0IChFUFJUIGFuZCBFUFNWIGV0YykKICBhbmQgU1NML1RTTCBzdXBwb3J0LgoKRGFuaWVsICgyMCBKYW51YXJ5IDIwMDUpCi0gUGhpbGlwcGUgSGFtZWF1IGZvdW5kIG91dCB0aGF0IC1RICIrW2NvbW1hbmRdIiBkaWRuJ3Qgd29yaywgYWx0aG91Z2ggc29tZQogIGNvZGUgd2FzIHdyaXR0ZW4gZm9yIGl0LiBJIGZpeGVkIGFuZCBhZGRlZCB0ZXN0IGNhc2UgMjI3IHRvIHZlcmlmeSBpdC4KICBUaGUgY3VybC4xIG1hbiBwYWdlIGRpZG4ndCBtZW50aW9uIHRoZSAnKycgc28gSSBhZGRlZCBpdC4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDA1KQotIFN0ZXBoYW4gQmVyZ21hbm4gbWFkZSBsaWJjdXJsIHJldHVybiBDVVJMRV9VUkxfTUFMRk9STUFUIGlmIGFuIEZUUCBVUkwKICBjb250YWlucyAlMGEgb3IgJTBkIGluIHRoZSB1c2VyLCBwYXNzd29yZCBvciBDV0QgcGFydHMuIChBIGZ1dHVyZSBmaXggd291bGQKICBpbmNsdWRlIGRvaW5nIGl0IGZvciAlMDAgYXMgd2VsbCAtIHNlZSBLTk9XTl9CVUdTIGZvciBkZXRhaWxzLikgVGVzdCBjYXNlCiAgMjI1IGFuZCAyMjYgd2VyZSBhZGRlZCB0byB2ZXJpZnkgdGhpcwoKLSBTdGVwaGFuIEJlcmdtYW5uIHBvaW50ZWQgb3V0IHR3byBmbGF3cyBpbiBsaWJjdXJsIGJ1aWx0IHdpdGggSFRUUCBkaXNhYmxlZDoKCiAgMSkgdGhlIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc3RpbGwgcmVhZCBhbmQgdXNlZCB0byBzZXQgSFRUUCBwcm94eQoKICAyKSB5b3UgY291bGRuJ3QgZGlzYWJsZSBodHRwIHByb3h5IHdpdGggQ1VSTE9QVF9QUk9YWSAoc2luY2UgdGhlIG9wdGlvbiB3YXMKICAgICBkaXNhYmxlZCkuIFRoaXMgaXMgaW1wb3J0YW50IHNpbmNlIGFwcHMgbWF5IHdhbnQgdG8gZGlzYWJsZSBIVFRQIHByb3h5CiAgICAgd2l0aG91dCBhY3R1YWxseSBrbm93aW5nIGlmIGxpYmN1cmwgd2FzIGJ1aWx0IHRvIGRpc2FibGUgSFRUUCBvciBub3QuCgogIEJhc2VkIG9uIFN0ZXBoYW4ncyBwYXRjaCwgYm90aCB0aGVzZSBpc3N1ZXMgc2hvdWxkIG5vdyBiZSBmaXhlZC4KCkRhbmllbCAoMTggSmFudWFyeSAyMDA1KQotIENvZHkgSm9uZXMnIGVuaGFuY2VkIHZlcnNpb24gb2YgU2FtdWVsIETtYXogR2FyY+1hJ3MgTVNWQyBtYWtlZmlsZSBwYXRjaCB3YXMKICBhcHBsaWVkLgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDUpCi0gQWxleCBha2EgV2luZEVhZ2xlIHBvaW50ZWQgb3V0IHRoYXQgd2hlbiBkb2luZyAiY3VybCAtdiBkaWN0aW9uYXJ5LmNvbSIsIGN1cmwKICBhc3N1bWVkIHRoaXMgdXNlZCB0aGUgRElDVCBwcm90b2NvbC4gV2hpbGUgZ3Vlc3NpbmcgcHJvdG9jb2xzIHdpbGwgcmVtYWluCiAgZnV6enksIEkndmUgbm93IG1hZGUgc3VyZSB0aGF0IHRoZSBob3N0IG5hbWVzIG11c3Qgc3RhcnQgd2l0aCAiW3Byb3RvY29sXS4iCiAgZm9yIHRoZW0gdG8gYmUgYSB2YWxpZCBndWVzc2FibGUgbmFtZS4gSSBhbHNvIHJlbW92ZWQgImh0dHBzIiBhcyBhIHByZWZpeAogIHRoYXQgaW5kaWNhdGVzIEhUVFBTLCBzaW5jZSB3ZSBoYXJkbHkgZXZlciBzZWUgYW55IGhvc3QgbmFtZXMgdXNpbmcgdGhhdC4KCkRhbmllbCAoMTMgSmFudWFyeSAyMDA1KQotIEluc3BpcmVkIGJ5IE1hcnRpam4gS29zdGVyJ3MgcGF0Y2ggYW5kIGV4YW1wbGUgc291cmNlIGF0CiAgaHR0cDovL3d3dy5ncmVlbmhpbGxzLmNvLnVrL21hay9nZW50b28vY3VybC1laW50ci1idWcuYywgSSBub3cgbWFkZSB0aGUKICBzZWxlY3QoKSBhbmQgcG9sbCgpIGNhbGxzIHByb3Blcmx5IGxvb3AgaWYgdGhleSByZXR1cm4gLTEgYW5kIGVycm5vIGlzCiAgRUlOVFIuIGdsaWJjIGRvY3MgZm9yIHRoaXMgaXMgZm91bmQgaGVyZToKICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmMvbWFudWFsL2h0bWxfbm9kZS9JbnRlcnJ1cHRlZC1QcmltaXRpdmVzLmh0bWwKCiAgVGhpcyBsYXN0IGxpbmsgc2F5cyBCU0QgZG9lc24ndCBoYXZlIHRoaXMgImVmZmVjdCIuIFdpbGwgdGhlcmUgYmUgYSBwcm9ibGVtCiAgaWYgd2UgZG8gdGhpcyB1bmNvbmRpdGlvbmFsbHk/CgpEYW5pZWwgKDExIEphbnVhcnkgMjAwNSkKLSBEYW4gVG9yb3AgY2xlYW5lZCB1cCBhIGZldyBubyBsb25nZXIgdXNlZCB2YXJpYWJsZXMgZnJvbSBEYXZpZCBQaGlsbGlwcycKICBzZWxlY3QoKSBvdmVyaGF1bCBmaXguCgotIEN5cmlsbCBPc3RlcndhbGRlciBwb3N0ZWQgYSBkZXRhaWxlZCBhbmFseXNpcyBhYm91dCBhIGJ1ZyB0aGF0IG9jY3VycyB3aGVuCiAgdXNpbmcgYSBjdXN0b20gSG9zdDogaGVhZGVyIGFuZCBjdXJsIGZhaWxzIHRvIHNlbmQgYSByZXF1ZXN0IG9uIGEgcmUtdXNlZAogIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBhbmQgdGh1cyBjcmVhdGVzIGEgbmV3IGNvbm5lY3Rpb24gYW5kIHJlc2VuZHMgaXQuIEl0CiAgdGhlbiBzZW50IHR3byBIb3N0OiBoZWFkZXJzLiBDeXJpbGwncyBhbmFseXNpcyB3YXMgcG9zdGVkIGhlcmU6CiAgaHR0cHM6Ly9jdXJsLmhheHguc2UvbWFpbC9hcmNoaXZlLTIwMDUtMDEvMDAyMi5odG1sCgotIEJydWNlIE1pdGNoZW5lciBpZGVudGlmaWVkIChidWcgcmVwb3J0ICMxMDk5NjQwKSB0aGUgbmV2ZXItZW5kaW5nIFNPQ0tTNQogIHByb2JsZW0gd2l0aCB0aGUgdmVyc2lvbiBieXRlIGFuZCB0aGUgY2hlY2sgZm9yIGJhZCB2ZXJzaW9ucy4gQnJ1Y2UgaGFzIGxvdHMKICBvZiBjbHVlcyBvbiB0aGlzLCBhbmQgYmFzZWQgb24gaGlzIHN1Z2dlc3Rpb24gSSd2ZSBub3cgcmVtb3ZlZCB0aGUgY2hlY2sgb2YKICB0aGF0IGJ5dGUgc2luY2UgaXQgc2VlbXMgdG8gYmUgYWJsZSB0byBjb250YWluIDEgb3IgNS4KCkRhbmllbCAoMTAgSmFudWFyeSAyMDA1KQotIFBhdmVsIE9yZWhvdiByZXBvcnRlZCBtZW1vcnkgcHJvYmxlbXMgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIGluIGJ1ZyByZXBvcnQKICAjMTA5ODg0My4gSW4gc2hvcnQsIGEgc2hhcmVkIEROUyBjYWNoZSB3YXMgc2V0dXAgZm9yIGEgbXVsdGkgaGFuZGxlIGFuZCB3aGVuCiAgdGhlIHNoYXJlZCBjYWNoZSB3YXMgZGVsZXRlZCBiZWZvcmUgdGhlIGluZGl2aWR1YWwgZWFzeSBoYW5kbGVzLCB0aGUgbGF0dGVyCiAgY2xlYW51cHMgY2F1c2VkIHJlYWQvd3JpdGVzIHRvIGFscmVhZHkgZnJlZWQgbWVtb3J5LgoKLSBIemhpanVuIHJlcG9ydGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIFNTTCBjZXJ0aWZpY2F0ZSBjb2RlLCB0aGF0IGxlYWtlZCB0aGUKICByZW1vdGUgY2VydGlmaWNhdGUgbmFtZSB3aGVuIGl0IGRpZG4ndCBtYXRjaCB0aGUgdXNlZCBob3N0IG5hbWUuCgpHaXNsZSAoOCBKYW51YXJ5IDIwMDUpCi0gQWRkZWQgTWFrZWZpbGUuV2F0Y29tIGZpbGVzIChzcmMvbGliKS4gVXBkYXRlZCBNYWtlZmlsZS5kaXN0LgoKRGFuaWVsICg3IEphbnVhcnkgMjAwNSkKLSBJbXByb3ZlZCB0aGUgdGVzdCBzY3JpcHQncyB2YWxncmluZCBsb2cgcGFyc2VyIHRvIGFjdHVhbGx5IHdvcmshIEFsc28gYWRkZWQKICB0aGUgYWJpbGl0eSB0byBkaXNhYmxlIHRoZSBsb2cgc2Nhbm5lciBmb3Igc3BlY2lmaWMgdGVzdCBjYXNlcy4gVGVzdCBjYXNlCiAgNTA5IHJlc3VsdHMgaW4gbnVtZXJvdXMgcHJvYmxlbXMgYW5kIGxlYWtzIGluIE9wZW5TU0wgYW5kIGhhcyB0byBnZXQgaXQKICBkaXNhYmxlZC4KCkRhbmllbCAoNiBKYW51YXJ5IDIwMDUpCi0gRml4ZWQgYSBzaW5nbGUtYnl0ZSByZWFkIG91dCBvZiBib3VuZHMgaW4gdGVzdCBjYXNlIDM5IGluIHRoZSBjdXJsIHRvb2wgY29kZQogIChpLmUgbm90IGluIHRoZSBsaWJyYXJ5KS4KCi0gQnVnIHJlcG9ydCAjMTA5NzAxOSBpZGVudGlmaWVkIGEgcHJvYmxlbSB3aGVuIGRvaW5nIC1kICJkYXRhIiB3aXRoIC1HIGFuZAogIHNlbmRpbmcgaXQgdG8gdHdvIFVSTHMgd2l0aCB7fS4gQWRkZWQgdGVzdCAxOTkgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDQgSmFudWFyeSAyMDA1KQotIE1hcnR5IEt1aHJ0IGFkanVzdGVkIGEgVk1TIGJ1aWxkIHNjcmlwdCBzbGlnaHRseQoKLSBLYWkgU29tbWVyZmVsZCBhbmQgR2lzbGUgVmFuZW0gZml4ZWQgbGliY3VybCB0byBidWlsZCB3aXRoIElQdjYgc3VwcG9ydCBvbgogIFdpbjIwMDAuCgpEYW5pZWwgKDIgSmFudWFyeSAyMDA1KQotIEFsZXggTmVibGV0dCB1cGRhdGVkIHRoZSBNU1ZDIG1ha2VmaWxlcyBzbGlnaHRseS4KRGFuaWVsICgyNSBEZWNlbWJlciAyMDA0KQotIFJlbW92ZWQgc3JjL2NvbmZpZy5oLmluIGZyb20gQ1ZTLCBpdCBpcyBub3cgY29waWVkIGZyb20gdGhlIChnZW5lcmF0ZWQpCiAgbGliL2NvbmZpZy5oLmluIGluc3RlYWQsIGFzIHRoZXkgY2FuIHZlcnkgd2VsbCBiZSB0aGUgc2FtZS4gVGhpcyByZW1vdmVzIGEKICAibWFudWFsIGhhc3NsZSIuIFlvdSBtYXkgd2FudCB0byByZS1ydW4gYnVpbGRjb25mIG5vdy4KCi0gV2VybmVyIEtvY2ggZmlsZWQgRGViaWFuIGJ1ZyByZXBvcnQgIzI4Njc5NCwgbWVudGlvbmluZyB0aGF0IGN1cmwgY29udGFpbmVkCiAgbm9uLWZyZWUgKGJ5IERlYmlhbidzIHZpZXcpIHNvdXJjZSBjb2RlLiBUaGlzIHdhcyBBbmd1cyBNYWNrYXkncwogIHNyYy9nZXRwYXNzLmMgc291cmNlIGNvZGUuIEkgdHJpZWQgdG8gY29udGFjdCBoaW0gYWJvdXQgaXQgdG8gcXVpY2tseSBzb2x2ZQogIHRoaXMgaXNzdWUsIGJ1dCBoaXMgZW1haWwgYWRkcmVzc2VzIGJvdW5jZSBhbmQgSSBnb3Qgc29tZSB0aW1lICJvdmVyIiBhbmQKICByZWltcGxlbWVudGVkIHRoZSBmdW5jdGlvbmFsaXR5IG9uY2UgYnJvdWdodCBieSBBbmd1cy4gV2Ugbm8gbG9uZ2VyIHVzZSBhbnkKICBvZiBBbmd1cycgb3JpZ2luYWwgY29kZSBhbmQgdGhlIG5ldyBmdW5jdGlvbiBpcyBtdWNoIHNpbXBsZXIgKElNTykuIElzc3VlCiAgc29sdmVkLgoKRGFuaWVsICgyNCBEZWNlbWJlciAyMDA0KQotIERhdmlkIFNoYXcgYWRkZWQgLS1wcm90b2NvbHMgdG8gY3VybC1jb25maWcsIHNvIHRoYXQgaXQgbm93IGxpc3RzIGFsbAogIHByb3RvY29scyBsaWJjdXJsIHdhcyBidWlsdCB0byBzdXBwb3J0LiAtLWZlYXR1cmUgbm8gbG9uZ2VyIGxpc3RzIGRpc2FibGVkCiAgcHJvdG9jb2xzLgoKRGFuaWVsICgyMyBEZWNlbWJlciAyMDA0KQotIERhdmlkIFNoYXcgZml4ZWQgdGhlIGNvbmZpZ3VyZSAtLWRpc2FibGUtW3Byb3RvY29sXSB2YXJpYWJsZXMgc28gdGhhdAogIGN1cmwtY29uZmlnIC0tZmVhdHVyZSBub3cgd29ya3MgY29ycmVjdGx5IQoKRGFuaWVsICgyMiBEZWNlbWJlciAyMDA0KQotIFJ1bmUgS2xldmVsYW5kIGZpeGVkIGEgbWlub3IgbWVtb3J5IGxlYWsgZm9yIHJlY2VpdmVkIGNvb2tpZXMgd2l0aCB0aGUKICAocmFyZSkgdmVyc2lvbiBhdHRyaWJ1dGUgc2V0LgoKLSBNYXJjaW4gS29uaWNraSBwcm92aWRlZCB0d28gY29uZmlndXJlIGZpeGVzIGFuZCBhIHNvdXJjZSBmaXggdG8gbWFrZSBjdXJsCiAgYnVpbGQgb3V0LW9mLXRoZS1ib3ggb24gQmVPUy4KCkRhbmllbCAoMjEgRGVjZW1iZXIgMjAwNCkKLSBBZGRlZCB0ZXN0IGNhc2UgMjE3IHRoYXQgdmVyaWZpZWQgQ1VSTElORk9fSFRUUF9DT05ORUNUQ09ERSwgYW5kIEkgbWFkZSB0aGUKICAtdyBvcHRpb24gc3VwcG9ydCAnaHR0cF9jb25uZWN0JyB0byBtYWtlIGl0IGVhc2llciB0byB2ZXJpZnkhCgotIEZpeGVkIGxpYi9zZWxlY3QuYyBpbmNsdWRlIG9yZGVyIHRvIGJ1aWxkIGZpbmUgb24gRnJlZUJTRAoKLSBGaXhlZCBmYWlsZigpJ3MgcmV1c2Ugb2YgdGhlIHZhX2xpc3QgdmFyaWFibGUgdGhhdCBjcmFzaGVkIG9uIEZyZWVCU0QuCiAgUG9pbnRlZCBvdXQgYnkgUGV0ZXIgUGVudGNoZXYuCgpWZXJzaW9uIDcuMTIuMyAoMjAgRGVjZW1iZXIgMjAwNCkKCkRhbmllbCAoMTkgRGVjZW1iZXIgMjAwNCkKLSBJIGludmVzdGlnYXRlZCBvdXIgUEtDUzEyIGJ1aWxkIHByb2JsZW0gb24gU29sYXJpcyAyLjcgd2l0aCBPcGVuU1NMIDAuOS43ZSwKICBhbmQgaXQgdHVybmVkIG91dCB0byBiZSB0aGUgZmF1bHQgb2YgdGhlIHpsaWIgMS4xLjQgaGVhZGVycyBkb2luZyBhIHR5cGVkZWYKICBuYW1lZCAnZnJlZV9mdW5jJyBhbmQgdGhlIE9wZW5TU0wgaGVhZGVycyBoYXZlIGEgcHJvdG90eXBlIHRoYXQgdXNlcwogICdmcmVlX2Z1bmMnIGluIG9uZSBvZiBpdHMgYXJndW1lbnRzLiBUaGlzIGlzIHdoeSB0aGUgY29tcGlsZSBlcnJvcnMgb3V0LgoKICBJbiBvdGhlciB3b3Jkcywgd2UgbmVlZCB0byBpbmNsdWRlIHRoZSBvcGVuc3NsL3BrY3MxMi5oIGhlYWRlciBiZWZvcmUgdGhlCiAgemxpYi5oIGhlYWRlciBhbmQgaXQgYnVpbGRzIGZpbmUuIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBjaGVja3MgZm9yIHRoaXMKICBmaWxlIGFuZCBpdCB0aGVuIGdldHMgaW5jbHVkZWQgZWFybHkgaW4gbGliL3VybGRhdGEuaC4KCkRhbmllbCAoMTggRGVjZW1iZXIgMjAwNCkKLSBTYW11ZWwgTGlzdG9wYWQgYWRkZWQgc3VwcG9ydCBmb3IgUEtDUzEyIGZvcm1hdHRlZCBjZXJ0aWZpY2F0ZXMuCgotIFNhbXVlbCBMaXN0b3BhZCBmaXhlZCAtRSB0byBzdXBwb3J0ICJDOi9wYXRoIiAod2l0aCBmb3J3YXJkIHNsYXNoKSBhcyB3ZWxsLgoKRGFuaWVsICgxNiBEZWNlbWJlciAyMDA0KQotIEdpc2xlIGZvdW5kIGFuZCBmaXhlZCBhIHByb2JsZW0gaW4gdGhlIGRpcmVjdG9yeSByZS11c2UgZm9yIEZUUC4KCiAgSSBhZGRlZCB0ZXN0IGNhc2UgMjE1IGFuZCAyMTYgdG8gYmV0dGVyIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCi0gRGluYXIgaW4gYnVnIHJlcG9ydCAjMTA4NjEyMSwgZm91bmQgYSBmaWxlIGhhbmRsZSBsZWFrIHdoZW4gYSBtdWx0aXBhcnQKICBmb3JtcG9zdCAoaW5jbHVkaW5nIGEgZmlsZSB1cGxvYWQgcGFydCkgd2FzIGFib3J0ZWQgYmVmb3JlIHRoZSB3aG9sZSBmaWxlCiAgd2FzIHNlbnQuCgpEYW5pZWwgKDE1IERlY2VtYmVyIDIwMDQpCi0gVG9tIExlZSBmb3VuZCBvdXQgdGhhdCBnbG9iYmluZyBvZiBzdHJpbmdzIHdpdGggYmFja3NsYXNoZXMgZGlkbid0IHdvcmsgYXMKICB5b3UnZCBleHBlY3QuIEJhY2tzbGFzaGVzIGFyZSBzdWNoIGEgY2VudHJhbCBwYXJ0IG9mIHdpbmRvd3MgZmlsZSBuYW1lcyB0aGF0CiAgZm9yY2luZyBiYWNrc2xhc2hlcyB0byBoYXZlIHRvIGJlIGVzY2FwZWQgd2l0aCBiYWNrc2xhc2hlcyBpcyBhIGJpdCB0b28KICBhd2t3YXJkIHRvIHVzZXJzLiBTdGFydGluZyBub3csIHlvdSBvbmx5IG5lZWQgdG8gZXNjYXBlIGdsb2JiaW5nIGNoYXJhY3RlcnMKICBzdWNoIGFzIHRoZSBmaXZlIGxldHRlcnM6ICJbXXt9LCIuIEFkZGVkIHRlc3QgY2FzZSAyMTQgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgKDE0IERlY2VtYmVyIDIwMDQpCi0gSGFyc2hhbCBQcmFkaGFuIHBhdGNoZWQgYSBIVFRQIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBmbGF3OiBpZiB0aGUgdXNlciBuYW1lCiAgYW5kL29yIHBhc3N3b3JkIHdlcmUgbW9kaWZpZWQgYmV0d2VlbiB0d28gcmVxdWVzdHMgb24gYSBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbiwgdGhlIHNlY29uZCByZXF1ZXN0IHdlcmUgc3RpbGwgbWFkZSB3aXRoIHRoZSBmaXJzdCBzZXR1cCEKCiAgSSBhZGRlZCB0ZXN0IGNhc2UgNTE5IHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICgxMyBEZWNlbWJlciAyMDA0KQotIEdpc2xlIGFkZGVkIENVUkxJTkZPX1NTTF9FTkdJTkVTIHRvIGN1cmxfZWFzeV9nZXRpbmZvKCkgdG8gYWxsb3cgYW4gYXBwCiAgdG8gbGlzdCBhbGwgYXZhaWxhYmxlIGNyeXB0byBFTkdJTkVTLgoKLSBHaXNsZSBmaXhlZCBidWcgcmVwb3J0ICMxMDgzNTQyLCB3aGljaCBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCByZXN1bWluZwogIGxhcmdlIGZpbGUgKD40R0IpIGZpbGU6Ly8gdHJhbnNmZXJzIG9uIHdpbmRvd3MuCgpEYW5pZWwgKDExIERlY2VtYmVyIDIwMDQpCi0gTWFkZSB0aGUgdGVzdCBzdWl0ZSBIVFRQIHNlcnZlciAoc3dzKSBjYXBhYmxlIG9mIHVzaW5nIElQdjYsIGFuZCB0aGVuCiAgZXh0ZW5kZWQgdGhlIHRlc3QgZW52aXJvbm1lbnQgdG8gc3VwcG9ydCB0aGF0IGFuZCBhbHNvIGFkZGVkIHRocmVlIHRlc3QKICBjYXNlcyAoMjQwLCAyNDEsIDI0MikgdGhhdCBydW4gdGVzdHMgdXNpbmcgSVB2Ni4gVGVzdCAyNDIgdXNlcyBhIFVSTCB0aGF0CiAgZGlkbid0IHdvcmsgYmVmb3JlIHRoZSAxMCBkZWMgZml4IGJ5IEthaSBTb21tZXJmZWxkLgoKLSBNYWRlIGEgZmFpbGVkIGZpbGU6Ly8gcmVzdW1lIG91dHB1dCBhbiBlcnJvciBtZXNzYWdlCgotIENvcnJlY3RlZCB0aGUgQ1VSTEVfQkFEX0RPV05MT0FEX1JFU1VNRSBlcnJvciBtZXNzYWdlIGluIGxpYi9zdHJlcnJvci5jCgotIERhbiBGYW5kcmljaDoKCiAgc2ltcGxpZmllZCBhbmQgY29uc29saWRhdGVkIHRoZSBTU0wgY2hlY2tzIGluIGNvbmZpZ3VyZSBhbmQgdGhlIHVzYWdlIG9mIHRoZQogIGRlZmluZXMgaW4gbGliL3NldHVwLmgKCiAgcHJvdmlkZWQgYSBmaXJzdCBsaWJjdXJsLnBjLmluIGZpbGUgZm9yIHBrZy1jb25maWcgKGJ1dCB0aGUgcmVzdWx0IGlzIG5vdAogIGluc3RhbGxlZCBhbnl3aGVyZSBhdCB0aGlzIHBvaW50KQoKICBleHRlbmRlZCB0aGUgY3Jvc3MgY29tcGlsZSBzZWN0aW9uIGluIHRoZSBkb2NzL0lOU1RBTEwgZmlsZQoKRGFuaWVsICgxMCBEZWNlbWJlciAyMDA0KQotIFdoZW4gcHJvdmlkaW5nIHVzZXIgbmFtZSBpbiB0aGUgVVJMIGFuZCBhIElQdjYtc3R5bGUgSVAtYWRkcmVzcyAobGlrZSBpbgogICJmdHA6Ly91c2VyQFs6OjFdL3RtcCIpLCB0aGUgVVJMIHBhcnNlciBkaWRuJ3QgZ2V0IHRoZSBob3N0IGV4dHJhY3RlZAogIHByb3Blcmx5LiAgUmVwb3J0ZWQgYW5kIGZpeGVkIGJ5IEthaSBTb21tZXJmZWxkLgoKRGFuaWVsICg5IERlY2VtYmVyIDIwMDQpCi0gVG9uIFZvb24gcHJvdmlkZWQgYSBjb25maWd1cmUgZml4IHRoYXQgc2hvdWxkIGZpeCB0aGUgbm90b3Jpb3VzIChtb3N0bHkKICByZXBvcnRlZCBvbiBTb2xhcmlzKSBwcm9ibGVtIHdoZXJlIHRoZSBzaXplX3QgY2hlY2sgZmFpbHMgZHVlIHRvIHRoZSBTU0wKICBsaWJzIGJlaW5nIGZvdW5kIGluIGEgZGlyIG5vdCBzZWFyY2hlZCB0aHJvdWdoIGJ5IHRoZSBydW4tdGltZSBsaW5rZXIuCiAgcGF0Y2gtdHJhY2tlciBlbnRyeSAjMTA4MTcwNy4KCi0gQnJ5YW4gSGVuZGVyc29uIHBvaW50ZWQgb3V0IGluIGJ1ZyByZXBvcnQgIzEwODE3ODggdGhhdCB0aGUgY3VybC1jb25maWcKICAtLXZlcm51bSBvdXRwdXQgd2Fzbid0IHplcm8gcHJlZml4ZWQgcHJvcGVybHkgKGFzIGNsYWltZWQgaW4gZG9jdW1lbnRhdGlvbikuCiAgVGhpcyBpcyBmaXhlZCBpbiBtYWtldGd6IG5vdy4KCkRhbmllbCAoOCBEZWNlbWJlciAyMDA0KQotIE1hdHQgVmVlbnN0cmEgdXBkYXRlZCB0aGUgbWFjaC1PIGZyYW1ld29yayBmaWxlcyBmb3IgTWFjIE9TIFguCgotIFJlbmUgQmVybmhhcmR0IGZvdW5kIGFuZCBmaXhlZCBhIGJ1ZmZlciBvdmVycnVuIGluIHRoZSBOVExNIGNvZGUsIHdoZXJlCiAgbGliY3VybCBhbHdheXMgYW5kIHVuY29uZGl0aW9uYWxseSBvdmVyd3JvdGUgYSBzdGFjay1iYXNlZCBhcnJheSB3aXRoIDMgemVybwogIGJ5dGVzLiBUaGlzIGlzIG5vdCBhbiBleHBsb2l0YWJsZSBidWZmZXIgb3ZlcmZsb3cuIE5vIG5lZWQgdG8gZ2V0IGFsYXJtZWQuCgpEYW5pZWwgKDcgRGVjZW1iZXIgMjAwNCkKLSBGaXhlZCBzbyB0aGF0IHRoZSBmaW5hbCBlcnJvciBtZXNzYWdlIGlzIHNlbnQgdG8gdGhlIHZlcmJvc2UgaW5mbyAic3RyZWFtIgogIGV2ZW4gaWYgbm8gZXJyb3JidWZmZXIgaXMgc2V0LgoKRGFuaWVsICg2IERlY2VtYmVyIDIwMDQpCi0gRGFuIEZhbmRyaWNoIGFkZGVkIHRoZSAtLWRpc2FibGUtY29va2llcyBvcHRpb24gdG8gY29uZmlndXJlIHRvIGJ1aWxkCiAgbGliY3VybCB3aXRob3V0IGNvb2tpZSBzdXBwb3J0LiBUaGlzIGlzIG1haW5seSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gYnVpbGQgYQogIG1pbmltYWxpc3RpYyBsaWJjdXJsIHdpdGggbm8gY29va2llcyBzdXBwb3J0IGF0IGFsbC4gTGlrZSBmb3IgZW1iZWRkZWQKICBzeXN0ZW1zIG9yIHNpbWlsYXIuCgotIFJpY2hhcmQgQXR0ZXJlciBmaXhlZCBsaWJjdXJsJ3Mgd2F5IG9mIGRlYWxpbmcgd2l0aCB0aGUgRVBTVgogIHJlc3BvbnNlLiBQcmV2aW91c2x5LCBsaWJjdXJsIHdvdWxkIHJlLXJlc29sdmUgdGhlIGhvc3QgbmFtZSB3aXRoIHRoZSBuZXcKICBwb3J0IG51bWJlciBhbmQgYXR0ZW1wdCB0byBjb25uZWN0IHRvIHRoYXQsIHdoaWxlIGl0IHNob3VsZCB1c2UgdGhlIElQIGZyb20KICB0aGUgY29udHJvbCBjaGFubmVsLiBUaGlzIGJ1ZyBtYWRlIGl0IGhhcmQgdG8gRVBTViBmcm9tIGFuIEZUUCBzZXJ2ZXIgd2l0aAogIG11bHRpcGxlIElQIGFkZHJlc3NlcyEKCkRhbmllbCAoMyBEZWNlbWJlciAyMDA0KQotIEJ1ZyByZXBvcnQgIzEwNzgwNjY6IHdoZW4gYSBjaHVua2VkIHRyYW5zZmVyIHdhcyBwcmUtbWF0dXJlbHkgY2xvc2VkIGV4YWN0bHkKICBhdCBhIGNodW5rIGJvdW5kYXJ5IGl0IHdhcyBub3QgY29uc2lkZXJlZCBhbiBlcnJvciBhbmQgdGh1cyB3ZW50IHVubm90aWNlZC4KICBGaXhlZCBieSBNYXVyaWNlIEJhcm51bS4KCiAgQWRkZWQgdGVzdCBjYXNlIDIwNyB0byB2ZXJpZnkuCgpEYW5pZWwgKDIgRGVjZW1iZXIgMjAwNCkKLSBGaXhlZCB0aGUgQ09OTkVDVCBsb29wIHRvIGRlZmF1bHQgdGltZW91dCB0byAzNjAwIHNlY29uZHMuCgogIEFkZGVkIHRlc3QgY2FzZSAyMDYgdGhhdCBtYWtlcyBDT05ORUNUIHdpdGggRGlnZXN0LgoKICBGaXhlZCBhIGZsYXcgdGhhdCBwcmVwZW5kZWQgIihuaWwpIiB0byB0aGUgaW5pdGlhbCBDT05ORUNUIHJxZXVlc3QncyB1c2VyLQogIGFnZW50IGZpZWxkLgoKRGFuaWVsICgzMCBOb3ZlbWJlciAyMDA0KQotIERhbiBGYW5kcmljaCdzIGZpeCBmb3IgbGlieiAxLjEgYW5kICJleHRyYSBmaWVsZCIgdXNhZ2UgaW4gYSBnemlwIHN0cmVhbQoKLSBEYW4gYWxzbyBoZWxwZWQgbWUgd2l0aCBpbnB1dCBkYXRhIHRvIGNyZWF0ZSB0aHJlZSBtb3JlIHRlc3QgY2FzZXMgZm9yIHRoZQogIC0tY29tcHJlc3NlZCBvcHRpb24uCgpEYW5pZWwgKDI5IE5vdmVtYmVyIDIwMDQpCi0gSSBpbXByb3ZlZCB0aGUgdGVzdCBzdWl0ZSB0byBlbmFibGUgYmluYXJ5IGNvbnRlbnRzIGluIHRoZSB0ZXN0cyAoYnkgcHJvdmluZwogIGl0IGJhc2U2NCBlbmNvZGVkKSwgbGlrZSBmb3IgdGVzdGluZyBkZWNvbXByZXNzIGV0Yy4gQWRkZWQgdGVzdCAyMjAgYW5kIDIyMQogIGZvciB0aGlzIHB1cnBvc2UuIFRlc3RzIGNhbiBub3cgYWxzbyBkZXBlbmQgb24gbGlieiB0byBydW4uCgotIEFzIHJlcG9ydGVkIGJ5IFJlaW5vdXQgdmFuIFNjaG91d2VuIGluIE1hbmRyYWtlJ3MgYnVnIHRyYWNrZXIgYnVnIDEyMjg1CiAgKGh0dHA6Ly9xYS5tYW5kcmFrZXNvZnQuY29tL3Nob3dfYnVnLmNnaT9pZD0xMjI4NSksIHdoZW4gY29ubmVjdGluZyB0byBhbgogIElQdjYgaG9zdCB3aXRoIEZUUCwgLS1kaXNhYmxlLWVwc3YgKG9yIC0tZGlzYWJsZS1lcHJ0KSBlZmZlY3RpdmVseSBkaXNhYmxlcwogIHRoZSBhYmlsaXR5IHRvIHRyYW5zZmVyIGEgZmlsZS4gTm93LCB3aGVuIGNvbm5lY3RlZCB0byBhbiBGVFAgc2VydmVyIHdpdGgKICBJUHY2LCB0aGVzZSBGVFAgY29tbWFuZHMgY2FuJ3QgYmUgZGlzYWJsZWQgZXZlbiBpZiBhc2tlZCB0byB3aXRoIHRoZQogIGF2YWlsYWJsZSBsaWJjdXJsIG9wdGlvbnMuCgpEYW5pZWwgKDI2IE5vdmVtYmVyIDIwMDQpCi0gQXMgcmVwb3J0ZWQgaW4gTWFuZHJha2UncyBidWcgdHJhY2tlciBidWcgMTIyODkKICAoaHR0cDovL3FhLm1hbmRyYWtlc29mdC5jb20vc2hvd19idWcuY2dpP2lkPTEyMjg5KSwgY3VybCB3b3VsZCBwcmludCBhCiAgbmV3bGluZSB0byAiZmluaXNoIiB0aGUgcHJvZ3Jlc3MgbWV0ZXIgYWZ0ZXIgZWFjaCByZWRpcmVjdCBhbmQgbm90IG9ubHkKICBhZnRlciBhIGNvbXBsZXRlZCB0cmFuc2Zlci4KCkRhbmllbCAoMjUgTm92ZW1iZXIgMjAwNCkKLSBGVFAgaW1wcm92ZW1lbnRzOgoKICBJZiBFUFNWLCBFUFJUIG9yIExQUlQgaXMgdHJpZWQgYW5kIGRvZXNuJ3Qgd29yaywgaXQgd2lsbCBub3QgYmUgcmV0cmllZCBvbgogIHRoZSBzYW1lIHNlcnZlciBhZ2FpbiBldmVuIGlmIGEgZm9sbG93aW5nIHJlcXVlc3QgaXMgbWFkZSB1c2luZyBhIHBlcnNpc3RlbnQKICBjb25uZWN0aW9uLgoKICBJZiBhIHNlY29uZCByZXF1ZXN0IGlzIG1hZGUgdG8gYSBzZXJ2ZXIsIHJlcXVlc3RpbmcgYSBmaWxlIGZyb20gdGhlIHNhbWUKICBkaXJlY3RvcnkgYXMgdGhlIHByZXZpb3VzIHJlcXVlc3Qgb3BlcmF0ZWQgb24sIGxpYmN1cmwgd2lsbCBubyBsb25nZXIgbWFrZQogIHRoYXQgbG9uZyBzZXJpZXMgb2YgQ1dEIGNvbW1hbmRzIGp1c3QgdG8gZW5kIHVwIG9uIHRoZSBzYW1lIHNwb3QuIE5vdGUgdGhhdAogIHRoaXMgaXMgb25seSBmb3IgKmV4YWN0bHkqIHRoZSBzYW1lIGRpci4gVGhlcmUgaXMgc3RpbGwgcm9vbSBmb3IgaW1wcm92ZW1lbnRzCiAgdG8gb3B0aW1pemUgdGhlIENXRC1zZW5kaW5nIHdoZW4gdGhlIGRpcnMgYXJlIG9ubHkgc2xpZ2h0bHkgZGlmZmVyZW50LgoKICBBZGRlZCB0ZXN0IDIxMCwgMjExIGFuZCAyMTIgdG8gdmVyaWZ5IHRoZXNlIGNoYW5nZXMuIEhhZCB0byBpbXByb3ZlIHRoZQogIHRlc3Qgc2NyaXB0IHRvbyBhbmQgYWRkZWQgYSBuZXcgcHJpbWl0aXZlIHRvIHRoZSB0ZXN0IGZpbGUgZm9ybWF0LgoKRGFuaWVsICgyNCBOb3ZlbWJlciAyMDA0KQotIEFuZHLpcyBHYXJj7WEgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gZGV0ZWN0IHNlbGVjdCBwcm9wZXJseSB3aGVuIHJ1bgogIHdpdGggTXN5cy9NaW5ndyBvbiBXaW5kb3dzLgoKRGFuaWVsICgyMiBOb3ZlbWJlciAyMDA0KQotIE1hZGUgSFRUUCBQVVQgYW5kIFBPU1QgcmVxdWVzdHMgbm8gbG9uZ2VyIHVzZSBIRUFEIHdoZW4gZG9pbmcgbXVsdGktcGFzcwogIGF1dGggbmVnb3RpYXRpb24gKE5UTE0sIERpZ2VzdCBhbmQgTmVnb3RpYXRlKSwgYnV0IGluc3RlYWQgdXNlIHRoZSByZXF1ZXN0CiAga2V5d29yZCAicHJvcGVybHkiLiBEZXRhaWxzIGluIGxpYi9SRUFETUUuaHR0cGF1dGguIFRoaXMgYWxzbyBpbnRyb2R1Y2VzCiAgQ1VSTE9QVF9JT0NUTEZVTkNUSU9OIGFuZCBDVVJMT1BUX0lPQ1RMREFUQSwgdG8gYmUgdXNlZCBieSBhcHBzIHRoYXQgdXNlIHRoZQogICJhbnkiIGF1dGggYWx0ZXJuYXRpdmUgYXMgdGhlbiBsaWJjdXJsIG1heSBuZWVkIHRvIHNlbmQgdGhlIFBVVC9QT1NUIGRhdGEKICBtb3JlIHRoYW4gb25jZSBhbmQgdGh1cyBtYXkgbmVlZCB0byBhc2sgdGhlIGFwcCB0byAicmV3aW5kIiB0aGUgcmVhZCBkYXRhCiAgc3RyZWFtIHRvIHN0YXJ0LgoKICBTZWUgYWxzbyB0aGUgbmV3IGV4YW1wbGUgdXNpbmcgdGhpczogZG9jcy9leGFtcGxlcy9hbnlhdXRocHV0LmMKCi0gRGF2aWQgUGhpbGxpcHMgZW5oYW5jZWQgdGVzdCA1MTguIEkgbWFkZSBpdCBkZXBlbmQgb24gYSAiZmVhdHVyZSIgc28gdGhhdAogIHN5c3RlbXMgd2l0aG91dCBnZXRybGltaXQoKSB3b24ndCBhdHRlbXB0IHRvIHRlc3QgNTE4LiBjb25maWd1cmUgbm93IGNoZWNrcwogIGZvciBnZXRybGltaXQoKSBhbmQgc2V0cmxpbWl0KCkgZm9yIHRoaXMgdGVzdCBjYXNlLgoKRGFuaWVsICgxOCBOb3ZlbWJlciAyMDA0KQotIERhdmlkIFBoaWxsaXBzIGZpeGVkIGxpYmN1cmwgdG8gbm90IGNyYXNoIGFueW1vcmUgd2hlbiBtb3JlIHRoYW4gRkRfU0VUU0laRQogIGZpbGUgZGVzY3JpcHRvcnMgYXJlIGluIHVzZS4gVGVzdCBjYXNlIDUxOCBhZGRlZCB0byB2ZXJpZnkuCgpEYW5pZWwgKDE1IE5vdmVtYmVyIDIwMDQpCi0gVG8gdGVzdCBteSBmaXggZm9yIHRoZSBDVVJMSU5GT19SRURJUkVDVF9USU1FIGJ1ZywgSSBhZGRlZCB0aW1lX3JlZGlyZWN0IGFuZAogIG51bV9yZWRpcmVjdHMgc3VwcG9ydCB0byB0aGUgLXcgd3JpdGVvdXQgb3B0aW9uIGZvciB0aGUgY29tbWFuZCBsaW5lIHRvb2wuCgotIFdvamNpZWNoIFp3aWVma2EgZm91bmQgb3V0IHRoYXQgQ1VSTElORk9fUkVESVJFQ1RfVElNRSBkaWRuJ3Qgd29yayBhcwogIGRvY3VtZW50ZWQuCgpEYW5pZWwgKDEyIE5vdmVtYmVyIDIwMDQpCi0gR2lzbGUgVmFuZW0gbW9kaWdpZWQgdGhlIE1TVkMgYW5kIE5ldHdhcmUgbWFrZWZpbGVzIHRvIGJ1aWxkIHdpdGhvdXQKICBsaWJjdXJsLmRlZgoKLSBEYW4gRmFuZHJpY2ggYWRkZWQgdGhlIC0tZGlzYWJsZS1jcnlwdG8tYXV0aCBvcHRpb24gdG8gY29uZmlndXJlIHRvIGFsbG93CiAgbGliY3VybCB0byBidWlsZCB3aXRob3V0IERpZ2VzdCBzdXBwb3J0LiAoSSBmaWd1cmUgaXQgc2hvdWxkIGFsc28gZXhwbGljaXRseQogIGRpc2FibGUgTmVnb3RpYXRlIGFuZCBOVExNLikKCi0gICAgICAgICAgICAgICAgICoqKiBNb2RpZmllZCBCZWhhdmlvdXIgQWxlcnQgKioqCgogIFNldHRpbmcgQ1VSTE9QVF9QT1NURklFTERTIHRvIE5VTEwgd2lsbCBubyBsb25nZXIgZG8gYSBHRVQuCgogIFNldHRpbmcgQ1VSTE9QVF9QT1NURklFTERTIHRvICIiIHdpbGwgc2VuZCBhIHplcm8gYnl0ZSBQT1NUIGFuZCBzZXR0aW5nCiAgQ1VSTE9QVF9QT1NURklFTERTIHRvIE5VTEwgYW5kIENVUkxPUFRfUE9TVEZJRUxEU0laRSB0byB6ZXJvIHdpbGwgYWxzbyBtYWtlCiAgYSB6ZXJvIGJ5dGUgUE9TVC4gQWRkZWQgdGVzdCBjYXNlIDUxNSB0byB2ZXJpZnkgdGhpcy4KCiAgU2V0dGluZyBDVVJMT1BUX0hUVFBQT1NUIHRvIE5VTEwgbWFrZXMgYSB6ZXJvIGJ5dGUgcG9zdC4gQWRkZWQgdGVzdCBjYXNlIDUxNgogIHRvIHZlcmlmeSB0aGlzLgoKICBDVVJMT1BUX1BPU1RGSUVMRFNJWkUgbXVzdCBub3cgYmUgc2V0IHRvIC0xIHRvIHNpZ25hbCAid2UgZG9uJ3Qga25vdyIuCiAgU2V0dGluZyBpdCB0byB6ZXJvIHNpbXBseSBzYXlzIHRoaXMgaXMgYSB6ZXJvIGJ5dGUgUE9TVC4KCiAgV2hlbiBwcm92aWRpbmcgUE9TVCBkYXRhIHdpdGggYSByZWFkIGNhbGxiYWNrLCBzZXR0aW5nIHRoZSBzaXplIHVwIGZyb250CiAgaXMgbm93IG1hZGUgd2l0aCBDVVJMT1BUX1BPU1RGSUVMRFNJWkUgYW5kIG5vdCB3aXRoIENVUkxPUFRfSU5GSUxFU0laRS4KCkRhbmllbCAoMTEgTm92ZW1iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2ggYWRkZWQgLS1kaXNhYmxlLXZlcmJvc2UgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYWxsb3cgYnVpbGRzCiAgd2l0aG91dCB2ZXJib3NlIHN0cmluZ3MgaW4gdGhlIGNvZGUsIHRvIHNhdmUgc29tZSAxMktCIHNwYWNlLiBNYWtlcyBzZW5zZQogIG9ubHkgZm9yIHN5c3RlbXMgd2l0aCB2ZXJ5IGxpdHRsZSBtZW1vcnkgcmVzb3VyY2VzLgoKLSBKZWZmIFBoaWxsaXBzIGZvdW5kIG91dCB0aGF0IGEgZGF0ZSBzdHJpbmcgd2l0aCBhIHllYXIgYmV5b25kIDIwMzggY291bGQKICBjcmFzaCB0aGUgbmV3IGRhdGUgcGFyc2VyIG9uIHN5c3RlbXMgd2l0aCAzMmJpdCB0aW1lX3QuIFdlIG5vdyBjaGVjayBmb3IKICB0aGlzIGNhc2UgYW5kIGRlYWwgd2l0aCBpdC4KCkRhbmllbCAoMTAgTm92ZW1iZXIgMjAwNCkKLSBJIGluc3RhbGxlZCBIZWltZGFsIG9uIG15IERlYmlhbiBib3ggKHVzaW5nIHRoZSBkZWJpYW4gcGFja2FnZSkgYW5kIG5vdGljZWQKICB0aGF0IGNvbmZpZ3VyZSAtLXdpdGgtZ3NzYXBpIGZhaWxlZCB0byBjcmVhdGUgYSBuaWNlIGJ1aWxkLiBGaXhlZCBub3cuCgpEYW5pZWwgKDkgTm92ZW1iZXIgMjAwNCkKLSBHaXNsZSBWYW5lbSBtYXJrZWQgYWxsIGV4dGVybmFsIGZ1bmN0aW9uIGNhbGxzIHdpdGggQ1VSTF9FWFRFUk4gc28gdGhhdCBub3cKICB0aGUgV2luZG93cywgTmV0d2FyZSBhbmQgb3RoZXIgYnVpbGRzIG5vIGxvbmdlciBuZWVkIGxpYmN1cmwuZGVmIG9yIHNpbWlsYXIKICBmaWxlcy4KCkRhbmllbCAoOCBOb3ZlbWJlciAyMDA0KQotIE1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY2hlY2sgZm9yIHRsZC5oIGlmIGxpYmlkbiB3YXMgZGV0ZWN0ZWQsIHNpbmNlCiAgbGliaWRuIDAuMy5YIGRpZG4ndCBoYXZlIHN1Y2ggYSBoZWFkZXIgYW5kIHdlIGRvbid0IHdvcmsgd2l0aCBhbnl0aGluZwogIGJlZm9yZSBsaWJpZG4gMC40LjEgYW55d2F5ISBTdXNlIDkuMSBhcHBhcmVudGx5IHNoaXBzIHdpdGggYSAwLjMuWCB2ZXJzaW9uCiAgb2YgbGliaWRuIHdoaWNoIG1ha2VzIHRoZSBjdXJsIDcuMTIuMiBidWlsZCBmYWlsLiBKZWFuLVBoaWxpcHBlCiAgQmFycmV0dGUtTGFQaWVycmUgaGVscGVkIHBvaW50aW5nIHRoaXMgb3V0LgoKLSBJYW4gR3VsbGl2ZXIgcmVwb3J0ZWQgaW4gZGViaWFuIGJ1ZyByZXBvcnQgIzI3ODY5MTogaWYgY3VybCBpcyBpbnZva2VkIGluIGFuCiAgZW52aXJvbm1lbnQgd2hlcmUgc3RkZXJyIGlzIGNsb3NlZCB0aGUgLXYgb3V0cHV0IHdpbGwgc3RpbGwgYmUgc2VudCB0byBmaWxlCiAgZGVzY3JpcHRvciAyIHdoaWNoIHRoZW4gbWlnaHQgYmUgdGhlIG5ldHdvcmsgc29ja2V0IGhhbmRsZSEgTm93IHdlIGhhdmUgYQogIHdlaXJkIGhhY2sgaW5zdGVhZCB0aGF0IGF0dGVtcHRzIHRvIG1ha2Ugc3VyZSB0aGF0IGZpbGUgZGVzY3JpcHRvciAyIGlzCiAgb3BlbmVkICh3aXRoIGEgY2FsbCB0byBwaXBlKCkpIGJlZm9yZSBsaWJjdXJsIGlzIGNhbGxlZCB0byBkbyB0aGUgdHJhbnNmZXIuCiAgY29uZmlndXJlIG5vdyBjaGVja3MgZm9yIHBpcGUoKSBhbmQgc3lzdGVtcyB3aXRob3V0IHBpcGUgZG9uJ3QgZ2V0IHRoZSB3ZWlyZAogIGhhY2sgZG9uZS4KCkRhbmllbCAoNSBOb3ZlbWJlciAyMDA0KQotIFRpbSBTbmVkZG9uIG1hZGUgbGliY3VybCBzZW5kIG5vIG1vcmUgdGhhbiA2NEsgaW4gYSBzaW5nbGUgZmlyc3QgY2h1bmsgd2hlbgogIGRvaW5nIGEgaHVnZSBQT1NUIG9uIFZNUywgYXMgdGhpcyBpcyBhIHN5c3RlbSBsaW1pdGF0aW9uLiBEZWZhdWx0IG9uIGdlbmVyYWwKICBzeXN0ZW1zIGlzIDEwMEsuCgpEYW5pZWwgKDQgTm92ZW1iZXIgMjAwNCkKLSBBbmRyZXMgR2FyY2lhIG1hZGUgaXQgYnVpbGQgb24gbWluZ3cgYWdhaW5hLCBteSAtLXJldHJ5IGNvZGUgYnJva2UgdGhlIGJ1aWxkLgoKRGFuaWVsICgyIE5vdmVtYmVyIDIwMDQpCi0gQWRkZWQgLS1yZXRyeS1tYXgtdGltZSB0aGF0IGFsbG93cyBhIG1heGltdW0gdGltZSB0aGF0IG1heSBub3QgaGF2ZSBiZWVuCiAgcmVhY2hlZCBmb3IgYSByZXRyeSB0byBiZSBtYWRlLiBJZiBub3Qgc2V0IHRoZXJlIGlzIG5vIG1heGltdW0gdGltZSwgb25seQogIHRoZSBhbW91bnQgb2YgcmV0cmllcyBzZXQgd2l0aCAtLXJldHJ5LgoKLSBQYXVsIE5vbGFuIHByb3ZpZGVkIGEgcGF0Y2ggdG8gbWFrZSBsaWJjdXJsIGJ1aWxkIG5pY2VseSBvbiBXaW5kb3dzIENFLgoKRGFuaWVsICgxIE5vdmVtYmVyIDIwMDQpCi0gV2hlbiBjcm9zcy1jb21waWxpbmcsIHRoZSBjb25maWd1cmUgc2NyaXB0IG5vIGxvbmdlciBhdHRlbXB0cyB0byB1c2UKICBwa2ctY29uZmlnIG9uIHRoZSBidWlsZCBob3N0IGluIG9yZGVyIHRvIGRldGVjdCBPcGVuU1NMIGNvbXBpbGVyIG9wdGlvbnMuCgpEYW5pZWwgKDI3IE9jdG9iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2g6CgogIEFuIGltcHJvdmVtZW50IHRvIHRoZSBnemlwIGhhbmRsaW5nIG9mIGxpYmN1cmwuIFRoZXJlIHdlcmUgdHdvIHByb2JsZW1zIHdpdGgKICB0aGUgb2xkIHZlcnNpb246IGl0IHdhcyBwb3NzaWJsZSBmb3IgYSBtYWxpY2lvdXMgZ3ppcCBmaWxlIHRvIGNhdXNlIGxpYmN1cmwKICB0byBsZWFrIG1lbW9yeSwgYXMgYSBidWZmZXIgd2FzIG1hbGxvY2VkIHRvIGhvbGQgdGhlIGhlYWRlciBhbmQgbmV2ZXIgZnJlZWQKICBpZiB0aGUgaGVhZGVyIGVuZGVkIHdpdGggbm8gZmlsZSBjb250ZW50cy4gIFRoZSBzZWNvbmQgcHJvYmxlbSBpcyB0aGF0IHRoZQogIDY0IEtpQiBkZWNvbXByZXNzaW9uIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjaywgd2hpY2ggY2F1c2VkCiAgdW5leHBlY3RlZGx5IGhpZ2ggc3RhY2sgdXNhZ2UgYW5kIG92ZXJmbG93ZWQgdGhlIHN0YWNrIG9uIHNvbWUgc3lzdGVtcwogIChzb21lb25lIGNvbXBsYWluZWQgYWJvdXQgdGhhdCBpbiB0aGUgbWFpbGluZyBsaXN0IGFib3V0IGEgeWVhciBhZ28pLgoKICBCb3RoIHByb2JsZW1zIGFyZSBmaXhlZCBieSB0aGlzIHBhdGNoLiBUaGUgZmlyc3Qgb25lIGlzIGZpeGVkIHdoZW4gYSByZWNlbnQKICAoMS4yKSB2ZXJzaW9uIG9mIHpsaWIgaXMgdXNlZCwgYXMgaXQgdGFrZXMgY2FyZSBvZiBnemlwIGhlYWRlciBwYXJzaW5nCiAgaXRzZWxmLiAgQSBjaGVjayBmb3IgdGhlIHZlcnNpb24gbnVtYmVyIGlzIGRvbmUgYXQgcnVuLXRpbWUgYW5kIGxpYmN1cmwgdXNlcwogIHRoYXQgZmVhdHVyZSBpZiBpdCdzIHByZXNlbnQuIEkndmUgY3JlYXRlZCBhIGRlZmluZSBPTERfWkxJQl9TVVBQT1JUIHRoYXQKICBjYW4gYmUgY29tbWVudGVkIG91dCB0byBzYXZlIHNvbWUgY29kZSBzcGFjZSBpZiBsaWJjdXJsIGlzIGd1YXJhbnRlZWQgdG8gYmUKICB1c2luZyBhIDEuMiB2ZXJzaW9uIG9mIHpsaWIuCgogIFRoZSBzZWNvbmQgcHJvYmxlbSBpcyBzb2x2ZWQgYnkgZHluYW1pY2FsbHkgYWxsb2NhdGluZyB0aGUgbWVtb3J5IGJ1ZmZlcgogIGluc3RlYWQgb2Ygc3RvcmluZyBpdCBvbiB0aGUgc3RhY2suIFRoZSBhbGxvY2F0aW9uL2ZyZWUgaXMgZG9uZSBmb3IgZXZlcnkKICBpbmNvbWluZyBwYWNrZXQsIHdoaWNoIGlzIHN1Ym9wdGltYWwsIGJ1dCBzaG91bGQgYmUgZHdhcmZlZCBieSB0aGUgYWN0dWFsCiAgZGVjb21wcmVzc2lvbiBjb21wdXRhdGlvbi4KCiAgSSd2ZSBhbHNvIGZhY3RvcmVkIG91dCBzb21lIGNvbW1vbiBjb2RlIGJldHdlZW4gZGVmbGF0ZSBhbmQgZ3ppcCB0byByZWR1Y2UKICB0aGUgY29kZSBmb290cHJpbnQgc29tZXdoYXQuICBJJ3ZlIHRlc3RlZCB0aGUgZ3ppcCBjb2RlIG9uIGEgZmV3IHRlc3QgZmlsZXMKICBhbmQgSSB0cmllZCBkZWZsYXRlIHVzaW5nIHRoZSBmcmVzaG1lYXQubmV0IHNlcnZlciwgYW5kIGl0IGFsbCBsb29rcyBPSy4gSQogIGRpZG4ndCB0cnkgcnVubmluZyBpdCB3aXRoIHZhbGdyaW5kLCBob3dldmVyLgoKLSBBZGRlZCBhIC0tcmV0cnkgb3B0aW9uIHRvIGN1cmwgdGhhdCB0YWtlcyBhIG51bWVyaWNhbCBvcHRpb24gZm9yIHRoZSBudW1iZXIKICBvZiB0aW1lcyB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSByZXRyaWVkLiBJdCBpcyByZXRyaWVkIGlmIGEgdHJhbnNpZW50IGVycm9yCiAgaXMgZGV0ZWN0ZWQgb3IgaWYgYSB0aW1lb3V0IG9jY3VycmVkLiBCeSBkZWZhdWx0LCBpdCB3aWxsIGZpcnN0IHdhaXQgb25lCiAgc2Vjb25kIGJldHdlZW4gdGhlIHJldHJpZXMgYW5kIHRoZW4gZG91YmxlIHRoZSBkZWxheSB0aW1lIGJldHdlZW4gZWFjaCByZXRyeQogIHVudGlsIHRoZSBkZWxheSB0aW1lIGlzIHRlbiBtaW51dGVzIHdoaWNoIHRoZW4gd2lsbCBiZSB0aGUgZGVsYXkgdGltZQogIGJldHdlZW4gYWxsIGZvcnRoY29taW5nIHJldHJpZXMuIFlvdSBjYW4gc2V0IGEgc3RhdGljIGRlbGF5IHRpbWUgd2l0aAogICItLXJldHJ5LWRlbGF5IFtudW1dIiB3aGVyZSBbbnVtXSBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBiZXR3ZWVuCiAgZWFjaCByZXRyeS4KCkRhbmllbCAoMjUgT2N0b2JlciAyMDA0KQotIFRvbWFzIFBvc3Bpc2VrIGZpbGVkIGJ1ZyByZXBvcnQgIzEwNTMyODcgdGhhdCBwcm92ZWQgLUMgLSBhbmQgLS1mYWlsIG9uIGEKICBmaWxlIHRoYXQgd2FzIGFscmVhZHkgY29tcGxldGVseSBkb3dubG9hZGVkIGNhdXNlZCBhbiBlcnJvciwgd2hpbGUgaXQKICBkb2Vzbid0IGlmIHlvdSBkb24ndCB1c2UgLS1mYWlsISBJIGFkZGVkIHRlc3QgY2FzZSAxOTQgdG8gdmVyaWZ5IHRoZSBmaXguCiAgR3Jyci4gQ1VSTE9QVF9GQUlMT05FUlJPUiBpcyBub3cgYWRkZWQgdG8gdGhlIGxpc3Qgc3R1ZmYgdG8gcmVtb3ZlIGluCiAgbGliY3VybCB2OCBkdWUgdG8gYWxsIHRoZSBrbHVkZ2VzIG5lZWRlZCB0byBzdXBwb3J0IGl0LgoKLSBNb2h1biBCaXN3YXMgZm91bmQgb3V0IHRoYXQgZm9ybXBvc3RpbmcgYSB6ZXJvLWJ5dGUgZmlsZSBkaWRuJ3Qgd29yayB2ZXJ5CiAgZ29vZC4gSSBmaXhlZC4KCkRhbmllbCAoMTkgT2N0b2JlciAyMDA0KQotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IG1hZGUgaXQgcG9zc2libGUgdG8gbWFrZSBGVFAgM3JkIHBhcnR5IHRyYW5zZmVycwogIHdpdGggYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJlaW5nIHRoZSBzYW1lIGhvc3QuIEl0IGNhbiBiZSB1c2VmdWwgaWYKICB5b3Ugd2FudCB0byBtb3ZlIGEgZmlsZSBvbiBhIHNlcnZlciBvciBzaW1pbGFyLgoKLSBHdWlsbGF1bWUgQXJsdWlzb24gYWRkZWQgQ1VSTElORk9fTlVNX0NPTk5FQ1RTIHRvIGFsbG93IGFuIGFwcCB0byBmaWd1cmUKICBvdXQgaG93IG1hbnkgbmV3IGNvbm5lY3RzIGEgcHJldmlvdXMgdHJhbnNmZXIgcmVxdWlyZWQuCgogIEkgYWRkZWQgJXtudW1fY29ubmVjdHN9IHRvIHRoZSBjdXJsIHRvb2wgYW5kIGFkZGVkIHRlc3QgY2FzZSAxOTIgYW5kIDE5MwogIHRvIHZlcmlmeSB0aGUgbmV3IGNvZGUuCgpEYW5pZWwgKDE4IE9jdG9iZXIgMjAwNCkKLSBQZXRlciBXdWxsaW5nZXIgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIHNob3VsZCBjYWxsIHNldGxvY2FsZSgpIHByb3Blcmx5IHRvCiAgaW5pdGlhdGUgdGhlIHNwZWNpZmljIGxhbmd1YWdlIG9wZXJhdGlvbnMsIHRvIG1ha2UgdGhlIElETiBzdHVmZiB3b3JrCiAgYmV0dGVyLgoKVmVyc2lvbiA3LjEyLjIgKDE4IE9jdG9iZXIgMjAwNCkKCkRhbmllbCAoMTYgT2N0b2JlciAyMDA0KQotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IG1hZGUgdGhlIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMgb3B0aW9uIHdvcmsKICBmaW5lIGV2ZW4gZm9yIHRoaXJkIHBhcnR5IHRyYW5zZmVycy4KCi0gcnVuZWtsIGF0IG9wb2ludC5jb20gZm91bmQgb3V0IChhbmQgcHJvdmlkZWQgYSBmaXgpIHRoYXQgbGliY3VybCBsZWFrZWQKICBtZW1vcnkgZm9yIGNvb2tpZXMgd2l0aCB0aGUgIm1heC1hZ2UiIGZpZWxkIHNldC4KCkdpc2xlICgxNiBPY3RvYmVyIDIwMDQpCi0gSXNzdWUgNTAgaW4gVE9ETy1SRUxFQVNFOyBBZGRlZCBUcmFpYW4gTmljb2xlc2N1J3MgcGF0Y2hlcyBmb3IgdGhyZWFkZWQKICByZXNvbHZlciBvbiBXaW5kb3dzLiBQbHVnZ2VkIHNvbWUgcG90ZW50aWFsIGhhbmRsZSBhbmQgbWVtb3J5IGxlYWtzLgoKRGFuaWVsICgxNCBPY3RvYmVyIDIwMDQpCi0gRXJpYyBWZXJnbmF1ZCBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgZGlkbid0IHRyZWF0ID8tbGV0dGVycyBpbiB0aGUgdXNlcgogIG5hbWUgYW5kIHBhc3N3b3JkIGZpZWxkcyBwcm9wZXJseSBpbiBVUkxzLCBsaWtlCiAgZnRwOi8vdXM/ZXI6cGFzcz93b3JkQHNpdGUuY29tLy4gQWRkZWQgdGVzdCAxOTEgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDExIE9jdG9iZXIgMjAwNCkKLSBsaWJjdXJsIG5vdyB1c2VzIFNPX05PU0lHUElQRSBmb3Igc3lzdGVtcyB0aGF0IHN1cHBvcnQgaXQgKE1hYyBPUyBYIDEwLjIgb3IKICBsYXRlciBpcyBvbmUpIHRvIGluaGliaXQgdGhlIFNJR1BJUEUgc2lnbmFsIHdoZW4gd3JpdGluZyB0byBhIHNvY2tldCB3aGlsZQogIHRoZSBwZWVyIGRpZXMuIFRoZSBzYW1lIGVmZmVjdCBpcyBwcm92aWRlIGJ5IHRoZSBNU0dfTk9TSUdOQUwgcGFyYW1ldGVyIHRvCiAgc2VuZCgpIG9uIG90aGVyIHN5c3RlbXMuIEFsYW4gUGluc3RlaW4gdmVyaWZpZWQgdGhlIGZpeC4KCkRhbmllbCAoMTAgT2N0b2JlciAyMDA0KQotIFN5c3RlbXMgd2l0aCA2NGJpdCBsb25ncyBubyBsb25nZXIgdXNlIHN0cnRvbGwoKSBvciBvdXIgc3RydG9sbC0gcmVwbGFjZW1lbnQKICB0byBwYXJzZSA2NCBiaXQgbnVtYmVycy4gc3RydG9sKCkgd29ya3MgZmluZS4gQWRkZWQgYSBjb25maWd1cmUgY2hlY2sgdG8KICBkZXRlY3QgaWYgW2NvbnN0YW50XUxMIHdvcmtzIGFuZCBpZiBzbywgdXNlIHRoYXQgaW4gdGhlIHN0cnRvbGwgcmVwbGFjZW1lbnQKICBjb2RlIHRvIHdvcmsgYXJvdW5kIGNvbXBpbGVyIHdhcm5pbmdzIHJlcG9ydGVkIGJ5IEFuZHkgQ2VkaWxuaWsuCgpHaXNsZSAoNiBPY3RvYmVyIDIwMDQpCi0gRm9yIFVTRV9MSUJJRE4gYnVpbGRzOiBBZGRlZCBUb3AtTGV2ZWwtRG9tYWluIChUTEQpIGNoZWNrIG9mIGhvc3QtbmFtZQogIHVzZWQgaW4gZml4X2hvc3RuYW1lKCkuIENoZWNrcyBpZiBjaGFyYWN0ZXJzIGluICdob3N0LT5uYW1lJyAoaW5kaXJlY3RseQogIHZpYSAnYWNlX2hvc3RuYW1lJykgYXJlIGxlZ2FsIGFjY29yZGluZyB0byB0aGUgVExEIHRhYmxlcyBpbiBsaWJpZG4uCgpEYW5pZWwgKDYgT2N0b2JlciAyMDA0KQotIENoaWgtQ2h1bmcgQ2hhbmcgcmVwb3J0ZWQgdGhhdCBpZiB5b3UgdXNlIENVUkxPUFRfUkVTVU1FX0ZST00gYW5kIGVuYWJsZWQKICBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCBsaWJjdXJsIHJlcG9ydGVkIGVycm9yIGlmIGEgcmVkaXJlY3QgaGFwcGVuZWQgZXZlbgogIGlmIHRoZSBuZXcgVVJMIHdvdWxkIHByb3ZpZGUgdGhlIHJlc3VtZWQgZmlsZS4gVGVzdCBjYXNlIDE4OCBhZGRlZCB0byB2ZXJpZnkKICB0aGUgZml4ICh0b2dldGhlciB3aXRoIGV4aXN0aW5nIHRlc3QgOTkpLgoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgYSBjb25maWd1cmUgZmxhdyBmb3Igc3lzdGVtcyB0aGF0IG5lZWQgYm90aCBuc2wgYW5kIHNvY2tldAogIGxpYnMgdG8gdXNlIGdldGhvc3RieW5hbWUoKS4KCi0gUmVtb3ZlZCB0YWJzIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gbG90cyBvZiBzb3VyY2UgZmlsZXMuCgpEYW5pZWwgKDUgT2N0b2JlciAyMDA0KQotIE1hZGUgY29uZmlndXJlIC0td2l0aC1saWJpZG49UEFUSCB0cnkgdGhlIGdpdmVuIFBBVEggYmVmb3JlIHRoZSBkZWZhdWx0CiAgcGF0aHMgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBvdmVycmlkZS4KCi0gSWYgaWRuYV9zdHJlcnJvcigpIGlzIHByZXNlbnQgaW4gbGliaWRuLCB3ZSBjYW4gdXNlIHRoYXQgaW5zdGVhZCBvZiBvdXIKICBpbnRlcm5hbCByZXBsYWNlbWVudC4gVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgYnkgU2ltb24gaW4gbGliaWRuIDAuNS42IGFuZAogIGlzIGRldGVjdGVkIGJ5IGNvbmZpZ3VyZS4KCi0gSXQgc2VlbXMgYmFzZW5hbWUoKSBvbiBJUklYIGlzIGluIHRoZSBsaWJnZW4gbGlicmFyeSBhbmQgc2luY2Ugd2UgZG9uJ3QgdXNlCiAgdGhhdCwgY29uZmlndXJlIGZpbmRzIGxpYmdlbi5oIGJ1dCBub3QgYmFzZW5hbWUgYW5kIHRoZW4gd2UgZ2V0IGEgY29tcGlsZXIKICBlcnJvciBiZWNhdXNlIG91ciBiYXNlbmFtZSgpIHJlcGxhY2VtZW50IGRvZXNuJ3QgbWF0Y2ggdGhlIHByb3RvIGluCiAgbGliZ2VuLmguIFN0YXJ0aW5nIG5vdywgd2UgZG9uJ3QgaW5jbHVkZSB0aGUgZmlsZSBpZiBiYXNlbmFtZSB3YXNuJ3QgZm91bmQKICBhcyB3ZWxsLgoKRGFuaWVsICg0IE9jdG9iZXIgMjAwNCkKLSBDaHJpcyBmb3VuZCBhIHJhY2UgY29uZGl0aW9uIHJlc3VsdGluZyBpbiBDVVJMRV9DT1VMRE5UX1JFU09MVkVfSE9TVCBhbmQKICBwb3RlbnRpYWwgY3Jhc2gsIGluIHRoZSB3aW5kb3dzIHRocmVhZGVkIG5hbWUgcmVzb2x2ZXIgY29kZS4KCkRhbmllbCAoMyBPY3RvYmVyIDIwMDQpCi0gUmVwbGFjZWQgdGhlIHVzZSBvZiBpc3NwYWNlKCkgaW4gY29va2llLmMgd2l0aCBvdXIgb3duIHZlcnNpb24gaW5zdGVhZCBzaW5jZQogIHdlIGhhdmUgbW9zdCBkYXRhIGFzICdjaGFyIConIGFuZCB0aGF0IG1ha2VzIHVzIHBhc3MgaW4gbmVnYXRpdmUgdmFsdWVzIGlmCiAgdGhlcmUgaXMgOGJpdCBkYXRhIGluIHRoZSBzdHJpbmcuIENoYW5naW5nIHRvIHVuc2lnbmVkIGNhdXNlcyB0b28gbXVjaAogIHdhcm5pbmdzIG9yIHRvbyBtYW55IHJlcXVpcmVkIHR5cGVjYXN0cyB0byB0aGUgbm9ybWFsIHN0cmluZyBmdW5jdGlvbnMuCiAgSGFyc2hhbCBQcmFkaGFuIGlkZW50aWZpZWQgdGhpcyBwcm9ibGVtLgoKRGFuaWVsICgyIE9jdG9iZXIgMjAwNCkKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmb3VuZCBhIGNhc2Ugd2hlcmUgbGliY3VybCBjb3VsZCByZWFkIGFscmVhZHkgZnJlZWQKICBkYXRhIHdoZW4gQ1VSTE9QVF9WRVJCT1NFIGlzIHVzZWQgYW5kIGEgKHZlcnkpIHBlcnNpc3RlbnQgY29ubmVjdGlvbi4gSXQKICBoYXBwZW5lZCB3aGVuIHRoZSBkbnMgY2FjaGUgZW50cnkgZm9yIHRoZSBjb25uZWN0aW9uIHdhcyBwcnVuZWQgd2hpbGUgdGhlCiAgY29ubmVjdGlvbiB3YXMgc3RpbGwgYWxpdmUgYW5kIHRoZW4gYWdhaW4gcmUtdXNlZC4gV2Ugd29ya2VkIHRvZ2V0aGVyIG9uCiAgdGhpcyBmaXguCgotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIGNvZGUgdGhhdCBkaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlIHdoZW4gdGhlIChsaWJpZG4KICBiYXNlZCkgSUROIGNvbnZlcnNpb24gZmFpbHMuIFRoaXMgaXMgcmVhbGx5IGR1ZSB0byBhIG1pc3Npbmcgc3VpdGFibGUKICBmdW5jdGlvbiBpbiB0aGUgbGliaWRuIEFQSSB0aGF0IEkgaG9wZSB3ZSBjYW4gcmVtb3ZlIG9uY2UgbGliaWRuIGdldHMgYQogIGZ1bmN0aW9uIGxpa2UgdGhpcy4KCkRhbmllbCAoMSBPY3RvYmVyIDIwMDQpCi0gQWxla3NhbmRhciBNaWxpdm9qZXZpYyByZXBvcnRlZCBhIHByb2JsZW0gaW4gdGhlIFJlZGhhdCBidWd6aWxsYSAoc2VlCiAgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xMzQxMzMpIGFuZCBub3QgdG8KICBhbnlvbmUgaW52b2x2ZWQgaW4gdGhlIGN1cmwgcHJvamVjdCEgVGhpcyBoYXBwZW5zIHdoZW4geW91IHRyeSB0byBjdXJsIGEKICBmaWxlIGZyb20gYSBwcm9mdHBkIHNpdGUgdXNpbmcgU1NMLiBJdCBzZWVtcyBwcm9mdHBkIHNlbmRzIGEgc29tZXdoYXQKICB1bm9ydGhvZG94IHJlc3BvbnNlIGNvZGUgKDIzMiBpbnN0ZWFkIG9mIDIzMCkuIEkgcmVsYXhlZCB0aGUgcmVzcG9uc2UgY29kZQogIGNoZWNrIHRvIGRlYWwgd2l0aCB0aGlzIGFuZCBzaW1pbGFyIGNhc2VzLgoKLSBCYXNlZCBvbiBGZWRvciBLYXJwZWxldml0Y2gncyBmb3JtcG9zdCBwYXRoIGJhc2VuYW1lIHBhdGNoLCBmaWxlIHBhcnRzIGluCiAgZm9ybXBvc3RzIG5vIGxvbmdlciBpbmNsdWRlIHRoZSBwYXRoIHBhcnQuIElmIHlvdSBfcmVhbGx5XyB3YW50IHRoZW0sIHlvdQogIG11c3QgcHJvdmlkZSB5b3VyIHByZWZlcnJlZCBmdWxsIGZpbGUgbmFtZSB3aXRoIENVUkxGT1JNX0ZJTEVOQU1FLgoKICBBZGRlZCBkZXRlY3Rpb24gZm9yIGxpYmdlbi5oIGFuZCBiYXNlbmFtZSgpIHRvIGNvbmZpZ3VyZS4gTXkgY3VzdG9tCiAgYmFzZW5hbWUoKSByZXBsYWNlbWVudCBmdW5jdGlvbiBmb3Igc3lzdGVtcyB3aXRob3V0IGl0LCBtaWdodCBiZSBhIGJpdCB0b28KICBuYWl2ZS4uLgoKICBVcGRhdGVkIDYgdGVzdCBjYXNlcyB0byBtYWtlIHRoZW0gd29yayB3aXRoIHRoZSBzdHJpcHBlZCBwYXRocy4KCkRhbmllbCAoMzAgU2VwdGVtYmVyIDIwMDQpCi0gTGFycnkgQ2FtcGJlbGwgYWRkZWQgQ1VSTElORk9fT1NfRVJSTk8gdG8gY3VybF9lYXN5X2dldGluZm8oKSB0aGF0IGFsbG93cyBhbgogIGFwcCB0byByZXRyaWV2ZSB0aGUgZXJybm8gdmFyaWFibGUgYWZ0ZXIgYSAoY29ubmVjdCkgZmFpbHVyZS4gSXQgd2lsbCBtYWtlCiAgc2Vuc2UgdG8gcHJvdmlkZSB0aGlzIGZvciBtb3JlIGZhaWx1cmVzIGluIGEgbW9yZSBnZW5lcmljIHdheSwgYnV0IGxldCdzCiAgc3RhcnQgbGlrZSB0aGlzLgoKLSBH/G50ZXIgS25hdWYgYW5kIENhc2V5IE8nRG9ubmVsbCB3b3JrZWQgb3V0IGFuIGV4dHJhICNpZiBjb25kaXRpb24gZm9yIHRoZQogIGN1cmwvbXVsdGkuaCBoZWFkZXIgdG8gd29yayBiZXR0ZXIgaW4gd2luc29jay11c2luZyBhcHBzLgoKLSBKZWFuLVBoaWxpcHBlIEJhcnJldHRlLUxhUGllcnJlIG1hZGUgYnVpbGRjb25mIHJ1biBiZXR0ZXIgb24gTWFjIE9TIFggYnkKICBwcm9wZXJseSB1c2luZyBnbGlidG9vbGl6ZSBpbnN0ZWFkIG9mIHBsYWluIGxpYnRvb2xpemUuIChUaGlzIGlzIG1hZGUgaWYKICBnbGlidG9vbCB3YXMgZm91bmQgYW5kIHVzZWQgaW5zdGVhZCBvZiBwbGFpbiBsaWJ0b29sLikKCkRhbmllbCAoMjkgU2VwdGVtYmVyIDIwMDQpCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZml4ZWQgY3VybF9lYXN5X3Jlc2V0KCkgc28gdGhhdCBpdCBkb2Vzbid0IG1pc3Rha2luZ2x5CiAgZW5hYmxlIHRoZSBwcm9ncmVzcyBtZXRlci4KCkRhbmllbCAoMjggU2VwdGVtYmVyIDIwMDQpCi0gIk1la29uaWt1bSIgZm91bmQgb3V0IHRoYXQgaWYgeW91IGJ1aWx0IGN1cmwgd2l0aG91dCBTU0wgc3VwcG9ydCwgYWx0aG91Z2gKICB5b3VyIGN1cnJlbnQgU1NMIGluc3RhbGxhdGlvbiBzdXBwb3J0cyBFbmdpbmUsIHRoZSBjb21waWxlIGZhaWxzLgoKRGFuaWVsICgyNyBTZXB0ZW1iZXIgMjAwNCkKLSBXaGVuIC0td2l0aC1zc2w9UEFUSCBpcyB1c2VkIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0LCBpdCBubyBsb25nZXIgdXNlcwogIHBrZy1jb25maWcgdG8gZmlndXJlIG91dCBleHRyYSBkZXRhaWxzLiBUaGF0IGlzIG5vdyBvbmx5IGRvbmUgaWYgbm8gUEFUSCBpcwogIGluY2x1ZGVkIG9yIGlmIFNTTCBpcyBjaGVja2VkIGZvciBieSBkZWZhdWx0IHdpdGhvdXQgdGhlIC0td2l0aC1zc2wgb3B0aW9uLgoKRGFuaWVsICgyNSBTZXB0ZW1iZXIgMjAwNCkKLSBQZXRlciBTeWx2ZXN0ZXIgcG9pbnRlZCBvdXQgdGhhdCBDVVJMT1BUX1NTTEVOR0lORSBjb3VsZG4ndCBldmVuIGJlIHNldCB0bwogIE5VTEwgd2hlbiBubyBlbmdpbmUgd2FzIHN1cHBvcnRlZC4gSXQgY2FuIG5vdy4KCkRhbmllbCAoMjIgU2VwdGVtYmVyIDIwMDQpCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHRocmVlIHRlc3QgY2FzZXMgdG8gbm8gbG9uZ2VyIHVzZSAibG9jYWxob3N0IiBidXQgaW5zdGVhZAogIHVzZSAiMTI3LjAuMC4xIiB0byBhdm9pZCByZXF1aXJpbmcgdGhhdCBsb2NhbGhvc3QgcmVzb2x2ZXMgbmljZWx5LgoKLSBKZWFuLUNsYXVkZSBDaGF1dmUgZml4ZWQgYW4gTERBUCBjcmFzaCB3aGVuIG1vcmUgdGhhbiBvbmUgcmVjb3JkIHdhcwogIHJldHJpZXZlZC4KCkRhbmllbCAoMTkgU2VwdGVtYmVyIDIwMDQpCi0gQW5kcmVhcyBSaWVrZSBwb2ludGVkIG91dCB0aGF0IHdoZW4gYXR0ZW1wdGluZyB0byBjb25uZWN0IHRvIGEgaG9zdCB3aXRob3V0CiAgYSBzZXJ2aWNlIG9uIHRoZSBzcGVjaWZpZWQgcG9ydCwgY3VybF9lYXN5X3BlcmZvcm0oKSBkaWRuJ3QgcHJvcGVybHkgcHJvdmlkZQogIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhlIENVUkxPUFRfRVJST1JCVUZGRVIgYnVmZmVyLgoKRGFuaWVsICgxNiBTZXB0ZW1iZXIgMjAwNCkKLSBEYW5pZWwgYXQgdG91Y2h0dW5lcyB1c2VzIHRoZSBGVFArU1NMIHNlcnZlciAiQlNERlRQRC1TU0wgZnJvbQogIGh0dHA6Ly9ic2RmdHBkLXNzbC5zYy5ydS8iIHdoaWNoIGFjY29yZGluZ2x5IGRvZXNuJ3QgcHJvcGVybHkgd29yayB3aXRoIGN1cmwKICB3aGVuICJBVVRIIFNTTCIgaXMgaXNzdWVkIChhbHRob3VnaCB0aGUgc2VydmVyIHJlc3BvbmRzIGZpbmUgYW5kIGV2ZXJ5dGhpbmcpCiAgYnV0IHJlcXVpcmVzIHRoYXQgY3VybCBpc3N1ZXMgIkFVVEggVExTIiBpbnN0ZWFkLiBTZWUKICBodHRwczovL2N1cmwuaGF4eC5zZS9mZWVkYmFjay9kaXNwbGF5LmNnaT9pZD0xMDk1MTk0NDkzNzYwMyZzdXBwb3J0PXllcwoKICBJbnRyb2R1Y2luZyBDVVJMT1BUX0ZUUFNTTEFVVEggdGhhdCBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHNlbGVjdCB3aGljaAogIG9mIHRoZSBBVVRIIHN0cmluZ3MgdG8gYXR0ZW1wdCBmaXJzdC4KCi0gQW5vbnltb3VzIGZpbGVkIGJ1ZyByZXBvcnQgIzEwMjk0Nzggd2hpY2ggaWRlbnRpZmllZCBhIGJ1ZyB3aGVuIHlvdSAxKSB1c2VkCiAgYSBVUkwgd2l0aG91dCBwcm9wZXJseSBzZXBlcmF0aW5nIHRoZSBob3N0IG5hbWUgYW5kIHRoZSBwYXJhbWV0ZXJzIHdpdGggYQogIHNsYXNoLiAyKSB0aGUgVVJMIGhhZCBwYXJhbWV0ZXJzIHRvIHRoZSByaWdodCBvZiBhID8gdGhhdCBjb250YWlucyBhIHNsYXNoCiAgMykgY3VybCB3YXMgdG9sZCB0byBmb2xsb3cgTG9jYXRpb246cyA0KSB0aGUgcmVxdWVzdCBnb3QgYSByZXNwb25zZSB0aGF0CiAgY29udGFpbmVkIGEgTG9jYXRpb246IHRvIHJlZGlyZWN0IHRvICIvZGlyIi4gY3VybCB0aGVuIGFwcGVuZGVkIHRoZSBuZXcgcGF0aAogIG9uIHRoZSB3cm9uZyBwb3NpdGlvbiBvZiB0aGUgb3JpZ2luYWwgVVJMLgoKICBUZXN0IGNhc2UgMTg3IHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhhdCB0aGlzIHdhcyBmaXhlZCBwcm9wZXJseS4KCkRhbmllbCAoMTEgU2VwdGVtYmVyIDIwMDQpCi0gQWRkZWQgcGFyc2VkYXRlLmMgdGhhdCBjb250YWlucyBhIHJld3JpdGUgb2YgdGhlIGRhdGUgcGFyc2VyIGN1cnJlbnRseQogIHByb3ZpZGVkIGJ5IGdldGRhdGUueS4gVGhlIG5ldyBvbmUgaXMgTVVDSCBzbWFsbGVyIGFuZCB3aWxsIGFsbG93IHVzIHRvIHJ1bgogIGF3YXkgZnJvbSB0aGUgeWFjYy9iaXNvbiBqdW5nbGUuIEl0IGlzIGFsc28gc2xpZ2h0bHkgbGFja2luZyBpbiBmZWF0dXJlcwogIGNvbXBhcmVkIHRvIHRoZSBvbGQgb25lLCBidXQgaXQgc3VwcG9ydHMgcGFyc2luZyBvZiBhbGwgZGF0ZSBmb3JtYXRzIEhUVFAKICBpbnZvbHZlcyAoYW5kIGEgZmFpciBidW5jaCBvZiBvdGhlcnMpLgoKRGFuaWVsICgxMCBTZXB0ZW1iZXIgMjAwNCkKLSBBcyBmb3VuZCBvdXQgYnkgSm9uYXMgRm9yc21hbiwgY3VybCBkaWRuJ3QgYWxsb3cgLUYgdG8gc2V0IENvbnRlbnQtVHlwZSBvbgogIHRleHQtcGFydHMuIFN0YXJ0aW5nIG5vdywgd2UgY2FuIGRvIC1GICJuYW1lPWRhbmllbDt0eXBlPXRleHQvZXh0cmEiLiBBZGRlZAogIHRlc3QgY2FzZSAxODYgdG8gdmVyaWZ5LgoKLSBCdWcgcmVwb3J0ICMxMDI1OTg2LiBXaGVuIGZvbGxvd2luZyBhIExvY2F0aW9uOiB3aXRoIGEgY3VzdG9tIEhvc3Q6IGhlYWRlcgogIHJlcGxhY2VtZW50LCBjdXJsIG9ubHkgcmVwbGFjZWQgdGhlIEhvc3Q6IGhlYWRlciBvbiB0aGUgaW5pdGlhbCByZXF1ZXN0CiAgYW5kIGRpZG4ndCByZXBsYWNlIGl0IG9uIHRoZSBmb2xsb3dpbmcgb25lcy4gVGhpcyByZXN1bHRlZCBpbiByZXF1ZXN0cyB3aXRoCiAgdHdvIEhvc3Q6IGhlYWRlcnMuCgogIE5vdywgY3VybCBjaGVja3MgaWYgdGhlIGxvY2F0aW9uIGlzIG9uIHRoZSBzYW1lIGhvc3QgYXMgdGhlIGluaXRpYWwgcmVxdWVzdAogIGFuZCB0aGVuIGNvbnRpbnVlcyB0byByZXBsYWNlIHRoZSBIb3N0OiBoZWFkZXIuIEFuZCB3aGVuIGl0IG1vdmVzIHRvIGFub3RoZXIKICBob3N0LCBpdCBkb2Vzbid0IHJlcGxhY2UgdGhlIEhvc3Q6IGhlYWRlciBidXQgaXQgYWxzbyBkb2Vzbid0IG1ha2UgdGhlCiAgc2Vjb25kIEhvc3Q6IGhlYWRlciBnZXQgdXNlZCBpbiB0aGUgcmVxdWVzdC4KCiAgVGhpcyBjaGFuZ2UgaXMgdmVyaWZpZWQgYnkgdGhlIHR3byBuZXcgdGVzdCBjYXNlcyAxODQgYW5kIDE4NS4KCkRhbmllbCAoOCBTZXB0ZW1iZXIgMjAwNCkKLSBNb2RpZmllZCB0aGUgdGVzdCBzdWl0ZSB0byBiZSBhYmxlIHRvIHVzZSBhbmQgcnVuIHdpdGggY3VzdG9taXplZCBwb3J0CiAgbnVtYmVycy4gVGhpcyB3YXMgYWx3YXlzIGludGVuZGVkIGJ1dCBuZXZlciBiZWZvcmUgcG9zc2libGUuIE5vdyBhIHNpbXBsZQogIGNoYW5nZSBpbiB0aGUgcnVudGVzdHMucGwgc2NyaXB0IGNhbiBtYWtlIGFsbCB0ZXN0cyB1c2UgZGlmZmVyZW50IHBvcnRzLgogIFRoZSBkZWZhdWx0IHBvcnRzIGluIHVzZSBmcm9tIG5vdyBvbiBhcmUgODk5MCB0byA4OTkzLgoKRGFuaWVsICgyIFNlcHRlbWJlciAyMDA0KQotIE1pbm9yIG1vZGlmaWNhdGlvbiBvZiBhbiBTU0wtcmVsYXRlZCBlcnJvciBtZXNzYWdlLgoKRGFuaWVsICgzMSBBdWd1c3QgMjAwNCkKLSBEYXZpZCBUYXJlbmRhc2ggZm91bmQgb3V0IHRoYXQgY3VybF9tdWx0aV9hZGRfaGFuZGxlKCkgcmV0dXJuZWQKICBDVVJMTV9DQUxMX01VTFRJX1BFUkZPUk0gaW5zdGVhZCBvZiBDVVJMTV9PSy4KCkRhbmllbCAoMzAgQXVndXN0IDIwMDQpCi0gTWFrZSAiUHJveHktQ29ubmVjdGlvbjogY2xvc2UiIGNsb3NlIHRoZSBjdXJyZW50IHByb3h5IGNvbm5lY3Rpb24sIGFzIFJvbWFuCiAgS29pZm1hbiBmb3VuZCBvdXQuCgpEYW5pZWwgKDI0IEF1Z3VzdCAyMDA0KQotIEZpeGVkIGEgZ2V0ZGF0ZSBwcm9ibGVtIGJ5IHBvc3QtcmVwbGFjaW5nIHRoZSBnZXRkYXRlLmMgZmlsZSBhZnRlciB0aGUKICBiaXNvbi95YWNjIHByb2Nlc3MgdG8gYWRkIHRoZSBmaXggSGFyc2hhbCBQcmFkaGFuIHN1Z2dlc3RlZC4gVGhlIHByb2JsZW0KICBjYXVzZWQgYSBjcmFzaCBvbiBXaW5kb3dzIHdoZW4gcGFyc2luZyBzb21lIGRhdGVzLgoKRGFuaWVsICgyMyBBdWd1c3QgMjAwNCkKLSBSb21hbiBLb2lmbWFuIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCBzZW5kIEV4cGVjdDogMTAwLWNvbnRpbnVlIG9uIFBPU1RzCiAgZXZlbiB3aGVuIHRvbGQgdG8gdXNlIEhUVFAgMS4wLCB3aGljaCBpcyBub3QgY29ycmVjdC4gVGVzdCBjYXNlIDE4MCBhbmQKICAxODEgdmVyaWZ5IHRoaXMuCgotIEFkZGVkIHRlc3QgY2FzZSAxODIgdG8gdmVyaWZ5IHRoYXQgemVybyBieXRlIHRyYW5zZmVycyBjYWxsIHRoZSBjYWxsYmFjawogIHByb3Blcmx5LgoKRGFuaWVsICgyMCBBdWd1c3QgMjAwNCkKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBtYWRlIHRoZSB3cml0ZSBjYWxsYmFjayBnZXQgY2FsbGVkIGV2ZW4gd2hlbiBhIHplcm8KICBieXRlIGZpbGUgaXMgZG93bmxvYWRlZC4KCkRhbmllbCAoMTggQXVndXN0IDIwMDQpCi0gTGluZyBUaGlvIHBvaW50ZWQgb3V0IHRoYXQgd2hlbiBsaWJjdXJsIGlzIGJ1aWx0IElQdjYtZW5hYmxlZCwgaXQgc3RpbGwgZGlkCiAgcmV2ZXJzZSBETlMgbG9va3VwcyB3aGVuIGZlZCB3aXRoIGEgbnVtZXJpY2FsIElQLWFkZHJlc3MgKGxpa2UKICBodHRwOi8vMTI3LjAuMC4xLyksIGFsdGhvdWdoIGl0IGRvZXNuJ3Qgd2hlbiBidWlsdCBJUHY2LWRpc2FibGVkLiBsaWJjdXJsCiAgc2hvdWxkIG5ldmVyIGRvIHJldmVyc2UgbG9va3Vwcy4KCkRhbmllbCAoMTcgQXVndXN0IDIwMDQpCi0gS2pldGlsIEphY29ic2VuIG5vdGljZWQgdGhhdCB3aGVuIHRyYW5zZmVycmluZyBhIGZpbGU6Ly8gVVJMIHBvaW50aW5nIHRvIGFuCiAgZW1wdHkgZmlsZSwgbGliY3VybCB3b3VsZCByZXR1cm4gd2l0aCB0aGUgZmlsZSBzdGlsbCBvcGVuLgoKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBwb2ludGVkIG91dCB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IG5lZWRzIHRvIGRlZmluZQogIF9USFJFQURfU0FGRSBmb3IgQUlYIHN5c3RlbXMgdG8gbWFrZSBsaWJjdXJsIGJ1aWx0IHJlYWxseSB0aHJlYWQtc2FmZS4KCiAgQWxzbyBhZGRlZCBhIGNoZWNrIGZvciB0aGUgeGxjIGNvbXBpbGVyIG9uIEFJWCwgYW5kIGlmIHRoYXQgaXMgZGV0ZWN0IHdlIHVzZQogIHRoZSAtcXRocmVhZGVkIGNvbXBpbGVyIG9wdGlvbgoKRGFuaWVsICgxNiBBdWd1c3QgMjAwNCkKLSBsaWJjdXJsIG5vdyBhbGxvd3MgYSBjdXN0b20gIkFjY2VwdC1FbmNvZGluZzoiIGhlYWRlciBvdmVycmlkZSB0aGUKICBpbnRlcm5hbGx5IHNldCBvbmUgdGhhdCBnZXRzIHNldCB3aXRoIENVUkxPUFRfRU5DT0RJTkcuIFBvaW50ZWQgb3V0IGJ5IEFsZXguCgotIFJvbGFuZCBLcmlrYXZhIGZvdW5kIGFuZCBmaXhlZCBhIGNvb2tpZSBwcm9ibGVtIHdoZW4gdXNpbmcgYSBwcm94eSAodGhlCiAgcGF0aCBtYXRjaGluZyB3YXMgd3JvbmcpLiBJIGFkZGVkIHRlc3QgY2FzZSAxNzkgdG8gdmVyaWZ5IHRoYXQgd2Ugbm93IGRvCiAgcmlnaHQuCgpEYW5pZWwgKDE1IEF1Z3VzdCAyMDA0KQotIENhc2V5IE8nRG9ubmVsbCBmaXhlZCBzb21lIE1TVkMgbWFrZWZpbGUgdGFyZ2V0cyB0byBsaW5rIHByb3Blcmx5LgoKRGFuaWVsICgxMSBBdWd1c3QgMjAwNCkKLSBjb25maWd1cmUgbm93IGRlZmluZXMgX1hPUEVOX1NPVVJDRSB0byA1MDAgb24gc3lzdGVtcyB0aGF0IG5lZWQgaXQgdG8gYnVpbGQKICB3YXJuaW5nLWZyZWUgKHRoZSBvbmx5IGtub3duIG9uZSBzbyBmYXIgaXMgbm9uLWdjYyBidWlsZHMgb24gNjRiaXQgU0dJCiAgSVJJWCkuIChSZXZlcnRlZCB0aGlzIGNoYW5nZSBsYXRlciBhcyBpdCBjYXVzZWQgY29tcGlsZXIgZXJyb3JzLikKCi0gdGhlIEZUUCBjb2RlIG5vdyBpbmNsdWRlcyB0aGUgc2VydmVyIHJlc3BvbnNlIGluIHRoZSBlcnJvciBtZXNzYWdlIHdoZW4gdGhlCiAgc2VydmVyIGdpdmVzIGJhY2sgYSA1MzAgYWZ0ZXIgdGhlIHBhc3N3b3JkIGlzIHByb3ZpZGVkLCBhcyBpdCBpc24ndAogIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIGEgYmFkIHVzZXIgbmFtZSBvciBwYXNzd29yZC4KClZlcnNpb24gNy4xMi4xICgxMCBBdWd1c3QgMjAwNCkKCkRhbmllbCAoMTAgQXVndXN0IDIwMDQpCi0gSW4gT3BlblNTTCAwLjkuN2QgYW5kIGVhcmxpZXIsIEFTTjFfU1RSSU5HX3RvX1VURjggZmFpbHMgaWYgdGhlIGlucHV0IGlzCiAgYWxyZWFkeSBVVEYtOCBlbmNvZGVkLiBUaGlzIG1hZGUgdGhlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBmYWlsIGlmIHRoZQogIHJlbW90ZSBzZXJ2ZXIgdXNlZCBhIGNlcnRpZmljYXRlIHdpdGggdGhlIG5hbWUgVVRGLTggZW5jb2RlZC4KCiAgV29yay1hcm91bmQgYnJvdWdodCBieSBBbGV4aXMgUy4gTC4gQ2FydmFsaG8uCgpEYW5pZWwgKDkgQXVndXN0IDIwMDQpCi0gSSBmaXhlZCB0aGUgY29uZmlndXJlIHNjcmlwdCBmb3Iga3JiNCB0byB1c2UgLWxjb21fZXJyIGFzIHdlbGwsIGFzIEkgc3RhcnRlZAogIHRvIGdldCBsaW5rIHByb2JsZW1zIHdpdGggaXQgdW5sZXNzIEkgZGlkIHRoYXQgb24gbXkgU29sYXJpcyAyLjcgYm94LiBJCiAgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgSSBzdGFydGVkIHRvIGdldCBwcm9ibGVtcyB3aXRoIHRoaXMgbm93IQoKRGFuaWVsICg1IEF1Z3VzdCAyMDA0KQotIEVucmljbyBTY2hvbHogZml4ZWQgdGhlIEhUVFAtTmVnb3RpYXRlIHNlcnZpY2UgbmFtZSB0byBiZSB1cHBlcmNhc2UgYXMKICByZXBvcnRlZCBpbiBidWcgcmVwb3J0ICMxMDA0MTA1CgpEYW5pZWwgKDQgQXVndXN0IDIwMDQpCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgYSBmaXggZm9yIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kIGNvbm5lY3RpbmcgdG8gYSBob3N0CiAgdXNpbmcgbXVsdGlwbGUgSVAgKGJhZCkgYWRkcmVzc2VzLgoKLSBEeWxhbiBTYWxpc2J1cnkgbWFkZSBsaWJjdXJsIG5vIGxvbmdlciBhY2NlcHQgY29va2llcyBzZXQgdG8gYSBUTEQgb25seSAoaXQKICBwcmV2aW91c2x5IGFsbG93ZWQgdGhhdCBvbiB0aGUgc2V2ZW4gdGhyZWUtbGV0dGVyIGRvbWFpbnMpLgoKRGFuaWVsICgzMSBKdWx5IDIwMDQpCi0gSm9lbCBDaGVuIHJlcG9ydGVkIHRoYXQgdGhlIGRpZ2VzdCBjb2RlIGFzc3VtZWQgcXVvdGVzIGFyb3VuZCB0aGUgY29udGVudHMgYQogIGJpdCB0b28gbXVjaC4KCkRhbmllbCAoMjggSnVseSAyMDA0KQotIEJlcnRyYW5kIERlbWlkZGVsYWVyIGZpeGVkIHRoZSBob3N0IG5hbWUgdG8gZ2V0IHNldHVwIHByb3Blcmx5IGV2ZW4gd2hlbiBhCiAgY29ubmVjdGlvbiBpcyByZS11c2VkLCB3aGVuIGEgcHJveHkgaXMgaW4gdXNlLiBQcmV2aW91c2x5IHRoZSB3cm9uZyBIb3N0OgogIGhlYWRlciBjb3VsZCBnZXQgc2VudCB3aGVuIHJlLXVzaW5nIGEgcHJveHkgY29ubmVjdGlvbiB0byBhIGRpZmZlcmVudCB0YXJnZXQKICBob3N0LgoKLSBGaXhlZCBCcmlhbiBBa2lucycgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCBkdXBsaWNhdGUgSG9zdDogaGVhZGVycyBvbiByZS11c2VkCiAgY29ubmVjdGlvbnMuIElmIHlvdSBhdHRlbXB0ZWQgdG8gcmVwbGFjZSB0aGUgSG9zdDogaGVhZGVyIGluIHRoZSBzZWNvbmQKICByZXF1ZXN0LCB5b3UgZ290IHR3byBzdWNoIGhlYWRlcnMhCgotIHNyYy9NYWtlZmlsZS5hbSBub3cgaW5jbHVkZXMgdGhlIE1ha2VmaWxlLmluYyBmaWxlIHRvIGdldCBpbmZvIGFib3V0IGZpbGVzCgpEYW5pZWwgKDI2IEp1bHkgMjAwNCkKLSBNYWRlICJjdXJsIFtVUkxdIC1vIG5hbWUjMiIgd29yayBhcyBleHBlY3RlZC4gSWYgdGhlcmUncyBubyBnbG9iYmluZyBmb3IgdGhlCiAgIy1udW1iZXIsIGl0IHdpbGwgc2ltcGx5IGJlIHVzZWQgYXMgIzIgaW4gdGhlIGZpbGUgbmFtZS4KCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZml4ZWQgdGVzdGluZyB3aXRoIHZhbGdyaW5kIDIuMS54IGFuZCBhZGRlZCB0d28gbWlzc2luZwogIG5ld2xpbmVzIGluIHRoZSBjb29raWUgaW5mb3JtYXRpb25hbHMuCgpEYW5pZWwgKDI0IEp1bHkgMjAwNCkKLSBJIGZpeGVkIHRoZSBhdXRvYnVpbGRzIHdpdGggYXJlcywgc2luY2UgdGhleSBub3cgbmVlZCB0byBoYXZlIGJ1aWxkY29uZiBydW4KICBpbiB0aGUgYXJlcyBkaXIgYmVmb3JlIHRoZSBjb25maWd1cmUgc2NyaXB0IGlzIHJ1bi4KCi0gQWRkZWQgQ2FzZXkgTydEb25uZWxsJ3MgY3VybF9lYXN5X3Jlc2V0KCkgZnVuY3Rpb24uIEl0IGhhcyBhIHByb3RvIGluCiAgY3VybC9jdXJsLmggYnV0IHdlIGhhdmUgbm8gbWFuIHBhZ2UgeWV0LgoKRGFuaWVsICgyMCBKdWx5IDIwMDQpCi0gQWRkZWQgYnVpbGRjb25mIGFuZCBidWlsZGNvbmYuYmF0IHRvIHRoZSByZWxlYXNlIGFyY2hpdmVzLCBzaW5jZSB0aGV5IGFyZQogIGhhbmR5IGZvciByZWJ1aWxkaW5nIGN1cmwgd2hlbiB1c2luZyBhIGRhaWx5IHNuYXBzaG90IChhbmQgbm90IGEgcHVyZSBDVlMKICBjaGVja291dCkuCgpEYW5pZWwgKDE2IEp1bHkgMjAwNCkKLSBBcyBzdWdnZXN0ZWQgYnkgVG9ieSBQZXRlcnNvbiwgbGliY3VybCBub3cgaWdub3JlcyBDb250ZW50LUxlbmd0aCBkYXRhIGlmIHRoZQogIGdpdmVuIHNpemUgaXMgYSBuZWdhdGl2ZSBudW1iZXIuIFRlc3QgY2FzZSAxNzggdmVyaWZpZXMgdGhpcy4KCkRhbmllbCAoMTQgSnVseSAyMDA0KQotIEf8bnRlciBLbmF1ZiBoYXMgbWFkZSB0aGUgTmV0d2FyZSBidWlsZHMgZG8gd2l0aG91dCB0aGUgY29uZmlnLW5ldHdhcmUuaAogIGZpbGVzLCBzbyB0aGV5IGFyZSBub3cgcmVtb3ZlZCBmcm9tIHRoZSBkaXN0IHBhY2thZ2VzLgoKLSBH/G50ZXIgS25hdWYgbWFkZSBjdXJsIGFuZCBsaWJjdXJsIGJ1aWxkIHdpdGggQm9ybGFuZCBhZ2Fpbi4KCi0gQW5kcmVzIEdhcmNpYSBmaXhlZCB0aGUgY29tbW9uIHRlc3QgNTA1IGZhaWx1cmVzIG9uIHdpbmRvd3MuCgpEYW5pZWwgKDYgSnVseSAyMDA0KQotIEFuZHLpcyBHYXJj7WEgZm91bmQgb3V0IHdoeSB0aGUgd2luZG93cyB0ZXN0cyBmYWlsZWQgb24gZmlsZTovLyAidXBsb2FkcyIuCgpEYW5pZWwgKDIgSnVseSAyMDA0KQotIEFuZHLpcyBHYXJj7WEgcmVwb3J0ZWQgYSBjdXJsX3NoYXJlX2NsZWFudXAoKSBjcmFzaCB0aGF0IG9jY3VycyB3aGVuIG5vCiAgbG9jay91bmxvY2sgY2FsbGJhY2tzIGhhdmUgYmVlbiBzZXQgYW5kIHRoZSBzaGFyZSBpcyBjbGVhbmVkIHVwLgoKRGFuaWVsICgxIEp1bHkgMjAwNCkKLSBXaGVuIHVzaW5nIGN1cmwgLS10cmFjZSBvciAtLXRyYWNlLWFzY2lpLCBubyB0cmFjZSBtZXNzYWdlcyB0aGF0IHdlcmUgc2VudAogIGJ5IGN1cmxfZWFzeV9jbGVhbnVwKCkgd2VyZSBpbmNsdWRlZCBpbiB0aGUgdHJhY2UgZmlsZS4gVGhpcyBtYWRlIHRoZQogIG1lc3NhZ2UgIkNsb3NpbmcgY29ubmVjdGlvbiAjMCIgbmV2ZXIgYXBwZWFyIGluIHRyYWNlIGR1bXBzLgoKRGFuaWVsICgzMCBKdW5lIDIwMDQpCi0gTmllbHMgdmFuIFRvbmdlcmVuIGZvdW5kIHRoYXQgc2V0dGluZyBDVVJMT1BUX05PQk9EWSB0byBUUlVFIGRvZXNuJ3QgZGlzYWJsZQogIGEgcHJldmlvdXNseSBzZXQgUE9TVCByZXF1ZXN0LCBtYWtpbmcgYSB2ZXJ5IG9kZCByZXF1ZXN0IGdldCBzZW50ICh1bmxlc3MKICB5b3UgZGlzYWJsZWQgdGhlIFBPU1QpIGEgSEVBRCByZXF1ZXN0IHdpdGggYSBQT1NUIHJlcXVlc3QtYm9keS4gSSd2ZSBub3cKICBtYWRlIENVUkxPUFRfTk9CT0RZIGVuZm9yY2UgYSBwcm9wZXIgSEVBRC4gQWRkZWQgdGVzdCBjYXNlIDUxNCBmb3IgdGhpcy4KCkRhbmllbCAoMjkgSnVuZSAyMDA0KQotIEf8bnRlciBLbmF1ZiBtYWRlIHRoZSB0ZXN0Y3VybC5wbCBzY3JpcHQgY2FwYWJsZSBvZiB1c2luZyBhIGN1c3RvbSBzZXR1cAogIGZpbGUgdG8gZWFzaWVyIHJ1biBtdWx0aXBsZSBhdXRvYnVpbGRzIG9uIHRoZSBzYW1lIHNvdXJjZSB0cmVlLgoKLSBHaXNsZSBmaXhlZCB0aGUgZGpncHAgYnVpbGQgYW5kIGZpeGVkIGEgbWVtb3J5IHByb2JsZW0gaW4gc29tZSBvZiB0aGUKICByZW9yZ2VkIG5hbWUgcmVzb2x2ZWQgY29kZS4KCi0gRml4ZWQgY29kZSB0byBhbGxvdyBjb25uZWN0cyBkb25lIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UgdG8gYXR0ZW1wdCB0aGUKICBuZXh0IElQIHdoZW4gY29ubmVjdGluZyB0byBhIGhvc3QgdGhhdCByZXNvbHZlcyB0byBtdWx0aXBsZSBJUHMgYW5kIGEKICBjb25uZWN0IGF0dGVtcHQgZmFpbHMuCgpEYW5pZWwgKDI3IEp1bmUgMjAwNCkKLSBCYXNlZCBvbiBSb2IgU3RhbnplbCdzIGJ1ZyByZXBvcnQgIzk3OTQ4MCwgSSB3cm90ZSBhIGNvbmZpZ3VyZSBjaGVjayB0aGF0CiAgY2hlY2tzIGlmIHBvbGwoKSBjYW4gYmUgdXNlZCB0byB3YWl0IG9uIE5VTEwgYXMgb3RoZXJ3aXNlIHNlbGVjdCgpIHNob3VsZCBiZQogIHVzZWQgdG8gZG8gaXQuIFRoZSBzZWxlY3QoKSB1c2FnZSB3YXMgYWxzbyBmaXhlZCBhY2NvcmRpbmcgdG8gaGlzIHJlcG9ydC4KCiAgTWFjIE9TIFggMTAuMyBzYXlzICJwb2xsKCkgZnVuY3Rpb25hbGl0eSBmb3IgTWFjIE9TIFggaXMgaW1wbGVtZW50ZWQgdmlhIGFuCiAgZW11bGF0aW9uIGxheWVyIG9uIHRvcCBvZiBzZWxlY3QoKSwgbm90IGluIHRoZSBrZXJuZWwgZGlyZWN0bHkuIEl0IGlzCiAgcmVjb21tZW5kZWQgdGhhdCBwcm9ncmFtcyBydW5uaW5nIHVuZGVyIE9TIFggMTAuMyBwcmVmZXIgc2VsZWN0KCkgb3ZlcgogIHBvbGwoKS4gQ29uZmlndXJlIHNjcmlwdHMgc2hvdWxkIGxvb2sgZm9yIHRoZSBfUE9MTF9FTVVMX0hfIGRlZmluZSAoaW5zdGVhZAogIG9mIF9QT0xMX0hfIG9yIF9TWVNfUE9MTF9IXykgYW5kIGF2b2lkIGltcGxlbWVudGF0aW9ucyB3aGVyZSBwb2xsIGlzIG5vdAogIGltcGxlbWVudGVkIGluIHRoZSBrZXJuZWwuIgoKICBZZXMsIHdlIGNhbiBwcm9iYWJseSB1c2Ugc2VsZWN0KCkgb24gbW9zdCBwbGF0Zm9ybXMgYnV0IHRvZGF5IEkgcHJlZmVyZWQgdG8KICBsZWF2ZSB0aGUgY29kZSB1bmFsdGVyZWQuCgpEYW5pZWwgKDI0IEp1bmUgMjAwNCkKLSBUaGUgc3RhbmRhcmQgY3VybF92ZXJzaW9uKCkgc3RyaW5nIG5vdyBvbmx5IGluY2x1ZGVzIHZlcnNpb24gaW5mbyBhYm91dAogIGludm9sdmVkIGxpYnJhcmllcyBhbmQgbm90IGFib3V0IHBhcnRpY3VsYXIgZmVhdHVyZXMuIFRodXMgaXQgd2lsbCBubyBsb25nZXIKICBpbmNsdWRlIGluZm8gYWJvdXQgSVB2NiBub3IgR1NTLiBUaGF0IGluZm8gaXMgb2YgY291cnNlIHN0aWxsIGF2YWlsYWJsZSBpbgogIHRoZSBmZWF0dXJlIGJpdG1hc2sgY3VybF92ZXJzaW9uX2luZm8oKSBvZmZlcnMuCgotIFJlcGxhY2VkIGFsbCBvY2N1cmFuY2VzIG9mIHNwcmludGYoKSB3aXRoIHNucHJpbnRmKCkuIFRoaXMgaXMgbW9zdGx5IGJlY2F1c2UKICBpdCBpcyAiQSBHb29kIFRoaW5nIiByYXRoZXIgdGhhbiBhY3R1YWxseSBmaXhpbmcgYW55IGtub3duIHByb2JsZW0uIFRoaXMKICB3aWxsIGhlbHAgcHJldmVudGluZyBmdXR1cmUgcG9zc2libGUgbWlzdGFrZXMgdG8gY2F1c2UgYnVmZmVyIG92ZXJmbG93cy4KCi0gTWFqb3IgcmVvcmdhbml6YXRpb24gaW4gdGhlIGhvc3QgcmVzb2x2ZSBjb2RlIChhZ2FpbikuIFRoaXMgdGltZSwgSSd2ZQogIG1vZGlmaWVkIHRoZSBjb2RlIHRvIG5vdyBhbHdheXMgdXNlIGEgbGlua2VkIGxpc3Qgb2YgQ3VybF9hZGRyaW5mbyBzdHJ1Y3RzCiAgdG8gcmV0dXJuIHJlc29sdmVkIGluZm8gaW4sIG5vIG1hdHRlciB3aGF0IHJlc29sdmVyIG1ldGhvZCBvciBzdXBwb3J0IHRoYXQKICBpcyBhdmFpbGFibGUgb24gdGhlIHBsYXRmb3JtLiBJdCBtYWtlcyBpdCBhIGxvdCBlYXNpZXIgdG8gd3JpdGUgY29kZSB0aGF0CiAgdXNlcyBvciBkZXBlbmRzIG9uIHJlc29sdmVkIGRhdGEuCgogIEludGVybmFsbHksIHRoaXMgbWVhbnMgYW1vbmdzdCBvdGhlciB0aGluZ3MgdGhhdCB3ZSBjYW4gc3RvcCBkb2luZyB0aGUgd2VpcmQKICAiaW5jcmVhc2UgYnVmZmVyIHNpemUgdW50aWwgaXQgd29ya3MiIHRyaWNrIHdoZW4gcmVzb2x2aW5nIGhvc3RzIG9uCiAgSVB2NC1vbmx5IHdpdGggZ2V0aG9zdGJ5bmFtZV9yKCksIHdlIHN1cHBvcnQgc29ja3MgZXZlbiBvbiBsaWJjdXJscyBidWlsdAogIHdpdGggSVB2NiBlbmFibGVkIChidXQgb25seSB0byBzb2NrcyBzZXJ2ZXJzIHRoYXQgcmVzb2x2ZSB0byBhbiBJUHY0CiAgYWRkcmVzcykgYW5kIHdlIG5vIGxvbmdlciBkZWVwLWNvcHkgb3IgcmVsb2NhdGUgaG9zdGVudCBzdHJ1Y3RzICh3ZSBjcmVhdGUKICBDdXJsX2FkZHJpbmZvIGNoYWlucyBpbnN0ZWFkKS4KCiAgVGhlIG5ldyAiaG9zdGVudCB0byBDdXJsX2FkZHJpbmZvIiBjb252ZXJ0ZXIgZnVuY3Rpb24gaXMgbmFtZWQgQ3VybF9oZTJhaSgpCiAgYW5kIGlzIHNsaWdodGx5IG5haXZlIGFuZCBzaW1wbGUsIHlldCBJIGJlbGlldmUgaXQgaXMgZnVuY3Rpb25hbCBlbm91Z2ggdG8KICB3b3JrIGZvciBsaWJjdXJsLgoKRGFuaWVsICgyMiBKdW5lIDIwMDQpCi0gRGF2aWQgQ29oZW4gcG9pbnRlZCBvdXQgdGhhdCBSRkMyMTA5IHNheXMgY2xpZW50cyBzaG91bGQgYWxsb3cgY29va2llcyB0bwogIGNvbnRhaW4gbGVhc3QgNDA5NiBieXRlcyB3aGlsZSBsaWJjdXJsIG9ubHkgYWxsb3dlZCAyMDQ3LiBJIHJhaXNlZCB0aGUgbGltaXQKICB0byA0OTk5IG5vdyBhbmQgbWFkZSB0aGUgdXNlZCBidWZmZXIgZ2V0IG1hbGxvYygpZWQgaW5zdGVhZCBvZiBzaW1wbHkKICBhbGxvY2F0ZWQgb24gc3RhY2sgYXMgYmVmb3JlLiBFeHRlbmRlZCB0ZXN0IGNhc2UgNDYgdG8gaW5jbHVkZSBhIGNvb2tpZSB3aXRoCiAgdmVyeSBodWdlIGNvbnRlbnQgdG8gdmVyaWZ5IHRoZSBmaXguCgotIEf8bnRlciBLbmF1ZiBmaXhlZCBnZXRkYXRlLnkgdG8gcmVtb3ZlIGEgZmV3IHdhcm5pbmdzLiBJIHJlbW92ZWQgdGhlCiAgaWZkZWYnZWQgdGVzdCB3ZSBuZXZlciBldmVyIHVzZSBhbnl3YXkuCgotIEdpc2xlIFZhbmVtIGZpeGVkIHRoZSBjZXJ0aWZpY2F0ZSB3aWxkY2FyZCBjaGVja3MgdG8gc3VwcG9ydCBhICcqJy1sZXR0ZXIKICBhbnl3aGVyZSBpbiB0aGUgd2lsZGNhcmQgc3RyaW5nLCBzdXBwb3J0IG11bHRpcGxlICcqJy1sZXR0ZXJzIGluIHRoZQogIHdpbGRjYXJkIGFuZCB0byBhbGxvdyB0aGUgJyonLWxldHRlciB0byBtYXRjaCBhIHN0cmluZyB0aGF0IGluY2x1ZGVzIGEgZG90LgoKRGFuaWVsICgyMSBKdW5lIDIwMDQpCi0gdGVzdGN1cmwuc2ggaXMgbm93IHJlbW92ZWQgY29tcGxldGVseSwgdGVzdHMvdGVzdGN1cmwucGwgaXMgdGhlIHNjcmlwdCB0bwogIHVzZSB3aGVuIGF1dG9idWlsZGluZyBjdXJsIQoKLSBLamV0aWwgSmFjb2JzZW4gYnJvdWdodCBteSBhdHRlbnRpb24gdG8gdGhlIGZhY3QgdGhhdCB5b3UgY2Fubm90IHByb3Blcmx5CiAgYWJvcnQgYW4gdXBsb2FkIHdpdGggdGhlIHJlYWRmdW5jdGlvbiBjYWxsYmFjaywgc2luY2UgcmV0dXJuaW5nIDAgb3IgLTEgb25seQogIHN0b3BzIHRoZSB1cGxvYWQgYW5kIGxpYmN1cmwgd2lsbCBjb250aW51ZSB3YWl0aW5nIGZvciBkb3dubG9hZGVkIGRhdGEgYW5kCiAgdGhlIHNlcnZlciBvZnRlbiB3YWl0cyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHVwbG9hZCBkYXRhIHRvIGFycml2ZS4KCiAgVGh1cywgSSd2ZSBub3cgYWRkZWQgdGhlIGFiaWxpdHkgZm9yIHJlYWQgY2FsbGJhY2tzIHRvIHJldHVybgogIENVUkxfUkVBREZVTkNfQUJPUlQgdG8gYWJvcnQgYW4gdXBsb2FkIGZyb20gYSByZWFkIGNhbGxiYWNrLiBUaGlzIHdpbGwgc3RvcAogIHRoZSB0cmFuc2ZlciBpbW1lZGlhdGVseSB3aXRoIGEgQ1VSTEVfQUJPUlRFRF9CWV9DQUxMQkFDSyByZXR1cm4gY29kZS4KCiAgVGVzdCBjYXNlIDUxMyB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoYXQgaXQgd29ya3MuIEkgaGFkIHRvIGltcHJvdmUgdGhlIHRlc3QKICBIVFRQIHNlcnZlciB0b28gdG8gZHVtcCB0aGUgcmVxdWVzdCB0byBhIGZpbGUgZXZlbiB3aGVuIHRoZSBjbGllbnQKICBkaXNjb25uZWN0cyBwcmVtYXR1cmVseS4KCkRhbmllbCAoMTkgSnVuZSAyMDA0KQotIEx1Y2EgQWx0ZWFzIHByb3ZpZGVkIGEgdGVzdCBjYXNlIHdpdGggYSBmYWlsaW5nIGN1cmwgb3BlcmF0aW9uOiB3aGVuIHdlIFBPU1QKICB0byBhIHNpdGUgd2l0aCAtLWRpZ2VzdCAob3Igc2ltaWxhcikgc2V0LCBhbmQgdGhlIHNlcnZlciByZXNwb25kZWQgd2l0aCBhIDMwMgogIExvY2F0aW9uOiB0byB0aGUgImF1dGhwcm9iZSIgcmVxdWVzdCwgaXQgd2FzIG5vdCB0cmVhdGVkIGNvcnJlY3RseS4gV2Ugc3RpbGwKICB3aWxsIGJlaGF2ZSBiYWRseSBpZiBGT0xMT1dMT0NBVElPTiBpcyBlbmFibGVkIGZvciB0aGlzIGNhc2UsIGJ1dCBJJ20gbm90CiAgaW4gdGhlIG1vb2QgdG8gZGl2ZSBpbnRvIHRoaXMgcmlnaHQgbm93IGFuZCB3aWxsIGxlYXZlIGl0IGFzLWlzIGZvciBub3cuCiAgVmVyaWZpZWQgbXkgZml4IHdpdGggdGVzdCBjYXNlIDE3Ny4KCkRhbmllbCAoMTggSnVuZSAyMDA0KQotIEdpc2xlIFZhbmVtJ3MgcGF0Y2ggdGhhdCBwcm92aWRlcyBtb3JlIGRldGFpbHMgZnJvbSB0aGUgU1NMIGxheWVycyAoaWYgeW91CiAgdXNlIGFuIE9wZW5TU0wgdmVyc2lvbiB0aGF0IHN1cHBvcnRzIGl0KS4gSXQgYWxzbyBpbnRyb2R1Y2VzIHR3byBuZXcgdHlwZXMKICBvZiBkYXRhIHRoYXQgY2FuIGJlIHNlbnQgdG8gdGhlIGRlYnVnIGNhbGxiYWNrOiBDVVJMSU5GT19TU0xfREFUQV9JTiBhbmQKICBDVVJMSU5GT19TU0xfREFUQV9PVVQuCgotIFdpdGggRGF2aWQgQnlyb24ncyB0ZXN0IHNlcnZlciBJIGNvdWxkIHJlcGVhdCBoaXMgcHJvYmxlbSBhbmQgbWFrZSBzdXJlIHRoYXQKICBQT1NUaW5nIG92ZXIgSFRUUFM6Ly8gd2l0aCBOVExNIHdvcmtzIGZpbmUgbm93LiBUaGVyZSB3YXMgYSBnZW5lcmFsIHByb2JsZW0KICB3aXRoIG11bHRpLXBhc3MgYXV0aGVudGljYXRpb24gd2l0aCBub24tR0VUIG9wZXJhdGlvbnMgd2l0aCBDT05ORUNULgoKRGFuaWVsICgxNiBKdW5lIDIwMDQpCi0gTW9kaWZpZWQgdG8ga2VlcCB0aGUgdXBsb2FkIGJ5dGUgY291bnRlciBpbiBhbiBjdXJsX29mZl90LCBub3QgYW4gaW50IGFzCiAgYmVmb3JlLiAzMmJpdHMgaXMgbm90IGVub3VnaC4gVGhpcyBpcyBtb3N0IGxpa2VseSB0aGUgYnVnIEplYW4tTG91aXMgTGVtYWlyZQogIHJlcG9ydGVkIHRoYXQgbWFrZXMgMkdCIEZUUCB1cGxvYWRzIHRvIHJlcG9ydCBlcnJvciAoInVuYWxpZ25lZCBmaWxlIHNpemVzIikKICB3aGVuIGNvbXBsZXRlZC4KCkRhbmllbCAoMTUgSnVuZSAyMDA0KQotIEx1Y2EgQWx0ZWFzIHJlcG9ydGVkIGEgcHJvYmxlbSB0aGF0IEkgZml4ZWQ6IGlmIHlvdSBkaWQgYSBQT1NUIHdpdGgKICBDVVJMQVVUSF9ESUdFU1Qgc2V0IGJ1dCB0aGUgc2VydmVyIGRpZG4ndCByZXF1aXJlIGFueSBhdXRoZW50aWNhdGlvbiwKICBsaWJjdXJsIHdvdWxkIHJlcGVhdGVkbHkgc2VuZCBIRUFEIGxvdHMgb2YgdGltZXMgdW50aWwgaXQgZ2l2ZXMgdXAuIFRoaXMgd2FzCiAgYWN0dWFsbHkgdGhlIGNhc2UgZm9yIGFsbCBtdWx0aS1wYXNzIGF1dGhlbnRpY2F0aW9ucy4gQWRkZWQgdGVzdCBjYXNlIDE3NCwKICAxNzUgYW5kIDE3NiB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMTQgSnVuZSAyMDA0KQotIE11bHRpcGFydCBmb3JtcG9zdHMgdXBsb2FkaW5nIGZpbGVzIG5vIGxvbmdlciBpbnNlcnRzIHRoZSBmaWxlcyB0aGVtc2VsdmVzCiAgaW50byB0aGUgaHVnZSBwcmVidWlsdCBjaHVuay4gVGhpcyBlbmFibGVzIGxpYmN1cmwgdG8gZm9ybXBvc3QgZmlsZXMgdGhhdCBpcwogIGxhcmdlciB0aGFuIHRoZSBhbW91bnQgb2Ygc3lzdGVtIG1lbW9yeS4gV2hlbiB0aGUgZmlsZSBnaXZlbiBpcyBwYXNzZWQgb24KICBzdGRpbiwgbGliY3VybCBzdGlsbCB1c2VzIHRoZSBvbGQgbWV0aG9kIG9mIHJlYWRpbmcgdGhlIGZ1bGwgZmlsbCBiZWZvcmUgdGhlCiAgdXBsb2FkIHRha2VzIHBsYWNlLiBUaGlzIGFwcHJvYWNoIHdhcyBzZWxlY3RlZCBpbiBvcmRlciB0byBub3QgYWx0ZXIgdGhlCiAgYmVoYXZpb3IgZm9yIGV4aXN0aW5nIGFwcGxpY2F0aW9ucywgYXMgd2hlbiB1c2luZyBzdGRpbiBsaWJjdXJsIGNhbid0IGtub3cKICB0aGUgc2l6ZSBvZiB0aGUgdXBsb2FkIGFuZCBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nIGNhbiBvbmx5IGJlIHVzZWQgb24KICBIVFRQIDEuMSBzZXJ2ZXJzLgoKRGFuaWVsICgxMyBKdW5lIDIwMDQpCi0gR2lzbGUgZm91bmQgb3V0IHRoYXQgd2UgZGlkIHdpbGRjYXJkIGNlcnQgbmFtZSBjaGVja3Mgd3JvbmcsIHNvIHRoYXQgcGFydHMKICBvZiB0aGUgY2hlY2sgd3JvbmdseSB3YXMgY2FzZSBzZW5zaXRpdmUuCgpEYW5pZWwgKDExIEp1bmUgMjAwNCkKLSBUaW0gU25lZGRvbiBicm91Z2h0IGEgbWlub3IgVk1TIGZpeCB0byBtYWtlIGN1cmwgYnVpbGQgcHJvcGVybHkgb24gaGlzIFZNUwogIG1hY2hpbmUuIEhlIGFsc28gaGFkIHNvbWUgaW50ZXJlc3RpbmcgbGliY3VybCBwYXRjaGVzLi4uIHRoZXkgbWlnaHQgYmUgYWJsZQogIHRvIGRvIGluIGEgc2xpZ2h0bHkgbmljZXIgd2F5LiBEaXNjdXNzaW9ucyBhcmUgaW4gcHJvZ3Jlc3MuCgpEYW5pZWwgKDEwIEp1bmUgMjAwNCkKLSBHaXNsZSBWYW5lbSBicm91Z2h0IGNvZGUgY2xlYW51cHNtIGJldHRlciB2ZXJib3NlIG91dHB1dCBhbmQgYmV0dGVyIGNvbm5lY3QKICB0aW1lb3V0IGhhbmRsaW5nIHdoZW4gYXR0ZW1wdGluZyB0byBjb25uZWN0IHRvIGEgaG9zdCB0aGF0IHJlc29sdmVzIHRvCiAgbXVsdGlwbGUgSVAgYWRkcmVzc2VzLgoKLSBTdGV2ZW4gQmF6eWwgYW5kIFNlc2h1YmFidSBQYXNhbSBwb2ludGVkIG91dCBhIGJ1ZyBvbiB3aW4zMiB3aGVuIGZyZWVpbmcgdGhlCiAgcGF0aCBhZnRlciBhIGZpbGU6Ly8gdHJhbnNmZXIuCgpEYW5pZWwgKDkgSnVuZSAyMDA0KQotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IG1hZGUgJ2NvbmZpZ3VyZSAtLWRpc2FibGUtaHR0cCcgd29yayB0byBidWlsZCBsaWJjdXJsCiAgd2l0aG91dCBIVFRQIHN1cHBvcnQuIEkgYWRkZWQgYSBuZXcgcmV0dXJuIGNvZGUgZm9yIGN1cmxfZm9ybWFkZCgpIGluIGNhc2UKICBsaWJjdXJsIGlzIGJ1aWx0IHdpdGggSFRUUCBkaXNhYmxlOiBDVVJMX0ZPUk1BRERfRElTQUJMRUQuCgotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IHBvaW50ZWQgb3V0IGEgbWlzc2luZyBmaWxlIGluIHRoZSBnZW5lcmF0ZWQKICBjdXJsbGliLmRzcCBmaWxlLCBhbmQgbm93IHBlb3BsZSBidWlsZGluZyB3aXRoIHRoaXMgc2hvdWxkIGdldCBhIGxpYmN1cmwubGliCiAgZmlsZSBnZW5lcmF0ZWQgYXMgaXQgdXNlZCB0byBkbyBiZWZvcmUgd2UgZ2VuZXJhdGVkIHRoaXMgZmlsZS4KCkRhbmllbCAoOCBKdW5lIDIwMDQpCi0gTWFydHkgS3VocnQgZml4ZWQgYSBtaW5vciBidWlsZCBwcm9ibGVtIGZvciBWTVMuCgpEYW5pZWwgKDcgSnVuZSAyMDA0KQotIFJldmVydGVkIHRoZSBjb25maWd1cmUgY2hlY2sgZnJvbSB0aGUgNHRoIHNpbmNlIGl0IG9idmlvdXNseSBkaWRuJ3Qgd29yay4KICBSZW1hZGUgaXQgaW4gYSBkaWZmZXJlbnQgbWFubmVyIHRoYXQgaG9wZWZ1bGx5IHdvcmtzIGJldHRlci4KCkRhbmllbCAoNCBKdW5lIDIwMDQpCi0gR/xudGVyIEtuYXVmIGJyb3VnaHQgcGF0Y2hlcyB0byBtYWtlIGN1cmwgYnVpbGQgZmluZSBvbiBOZXRXYXJlIGFnYWluLgoKLSBNYWRlIHRoZSBjb25maWd1cmUgY2hlY2tzIGZvciBzdHJlcnJvcl9yKCkgbm90IGV4aXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICB3aGVuIGJ1aWx0IGZvciBjcm9zcy1jb21waWxpbmcuCgpEYW5pZWwgKDMgSnVuZSAyMDA0KQotIENocmlzIEdhdWtyb2dlciBwb2ludGVkIG91dCB0aGF0ICdtYWtlIHRlc3QnIGF0dGVtcHRzIHRvIHJ1biB0aGUgdGVzdHMgZXZlbgogIGlmIGN1cmwgaXMgYnVpbHQgY3Jvc3MtY29tcGlsZWQuIEkndmUgbm93IG1hZGUgaXQgb3V0cHV0IGEgc2hvcnQgbWVzc2FnZQogIGluc3RlYWQsIHNheWluZyBpdCBpc24ndCBwb3NzaWJsZSB0byBkby4KCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgYnJvdWdodCBGVFAgM3JkIHBhcnR5IHRyYW5zZmVyIHN1cHBvcnQgdG8gbGliY3VybC4KICBZb3UgY2FuIG5vdyB1c2UgbGliY3VybCB0byB0cmFuc2ZlciBmaWxlcyBiZXR3ZWVuIHR3byByZW1vdGUgaG9zdHMgdXNpbmcKICBGVFAuIFRoZXJlIGFyZSBhIGJ1bmNoIG9mIG5ldyBvcHRpb25zIHRvIGNvbnRyb2wgdGhpcyB3aXRoOgogICBDVVJMT1BUX1NPVVJDRV9IT1NUCiAgIENVUkxPUFRfU09VUkNFX1VTRVJQV0QKICAgQ1VSTE9QVF9TT1VSQ0VfUEFUSAogICBDVVJMT1BUX1NPVVJDRV9QT1JUCiAgIENVUkxPUFRfUEFTVl9IT1NUCiAgIENVUkxPUFRfU09VUkNFX1BSRVFVT1RFCiAgIENVUkxPUFRfU09VUkNFX1BPU1RRVU9URQoKICAoVGhleSBzdGlsbCByZW1haW4gdG8gYmUgZG9jdW1lbnRlZCBwcm9wZXJseSBpbiB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4KICBwYWdlLikKCiAgV2hlbiB1c2luZyB0aGlzLCB0aGUgb3JkaW5hcnkgQ1VSTE9QVF9VUkwgc3BlY2lmaWVzIHRoZSB0YXJnZXQgVVJMLCBhbmQgeW91CiAgc3BlY2lmeSB0aGUgc291cmNlIGRhdGEgd2l0aCB0aGVzZSBhZGRpdGlvbmFsIG9wdGlvbnMuIGZ0cDNyZHBhcnR5LmMgaXMgYQogIG5ldyBleGFtcGxlIHNvdXJjZSBjb2RlIHNob3dpbmcgaG93IHRvIHVzZSB0aGlzLgoKLSBWaW5jZW50IEJyb25uZXIgZml4ZWQgdGhlIEhUVFAgRGlnZXN0IGNvZGUgdG8gdXNlIHRoZSBwcm94eSB1c2VyIG5hbWUgYW5kCiAgcGFzc3dvcmQgd2hlbiBkb2luZyBwcm94eSBhdXRoZW50aWNhdGlvbiwgaXQgcHJldmlvdXNseSBhbHdheXMgdXNlZCB0aGUgaG9zdAogIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQhCgpEYW5pZWwgKDIgSnVuZSAyMDA0KQotIENVUkxPUFRfVVBMT0FEIGFuZCBDVVJMT1BUX1BVVCBub3cgZG8gdGhlIGV4YWN0IHNhbWUgdGhpbmcgaW50ZXJuYWxseSwgd2hpY2gKICBmaXhlcyBzb21lIG9sZCBjb25mdXNpb25zIG9uIHdoZW4gd2hpY2ggb2YgdGhlc2Ugc2hvdWxkIGJlIHVzZWQgYW5kIHdoYXQgdGhlCiAgZGlmZmVyZW5jZXMgYXJlLgoKLSBBcHBsaWVkIEdpc2xlJ3MgZml4ZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgd2l0aCBsY2Mtd2luMzIKClZlcnNpb24gNy4xMi4wICgyIEp1bmUgMjAwNCkKCkRhbmllbCAoMSBKdW5lIDIwMDQpCi0gSSBjbGFyaWZpZWQgdGhlIC0tY3JlYXRlLWRpcnMgb3B0aW9uIHNvbWV3aGF0IGluIHRoZSBjdXJsIG1hbiBwYWdlLgoKLSBSZW5hdWQgRHVoYXV0IGNvcnJlY3RlZCB0aGUgY3VybF91bmVzY2FwZSBtYW4gcGFnZS4KCi0gRGF2aWQgQnlyb24gbW9kaWZpZWQgb25lIG9mIE1hc3NpbWlsaWFubyBaaWNjYXJkaSdzIHJlY2VudCBNU1ZDIG1ha2VmaWxlCiAgY2hhbmdlcyB0byBub3cgYWdhaW4gdXNlIHRoZSBtbSBsaWIgYnkgZGVmYXVsdC4KCkRhbmllbCAoMjYgTWF5IDIwMDQpCi0gTW9odW4gQmlzd2FzIGFkZGVkIHJlbGVhc2UtemxpYiBhbmQgZGVidWctemxpYiB0YXJnZXRzIHRvIHRoZSBNU1ZDIGxpYmN1cmwKICBNYWtlZmlsZQoKLSBEYXZpZCBCeXJvbiByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBwcm94eSBhdXRoZW50aWNhdGlvbiB3aGVuIGRvaW5nIENPTk5FQ1QsCiAgbGlrZSB3aGVuIGFjY2Vzc2luZyBIVFRQUyBzaXRlcyB3aWh0IGEgcHJveHkuIFRoaXMgcHJvYmFibHkgYnJva2Ugd2hlbiBJCiAgcmV3cm90ZSB0aGUgYXV0aCBzdHVmZiByZWNlbnRseS4KCi0gSSBhZGRlZCBmaWxldXBsb2FkLmMgaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSwgc2hvd2luZyBob3cgYW4gdXBsb2FkIHRvIGEKICBmaWxlOi8vIFVSTCBpcyBtYWRlLgoKRGFuaWVsICgyNSBNYXkgMjAwNCkKLSBNYXNzaW1pbGlhbm8gWmljY2FyZGkgdXBkYXRlZCB0aGUgTVNWQyBtYWtlZmlsZXMuCgpEYW5pZWwgKDI0IE1heSAyMDA0KQotIGxpYmN1cmwgbm93IHN1cHBvcnRzICJ1cGxvYWRpbmciIHRvIGZpbGU6Ly8gVVJMcy4gVGVzdCAyMDQgYW5kIDIwNSB3ZXJlCiAgYWRkZWQgdG8gdmVyaWZ5LgoKLSBTaW1vbiBKb3NlZnNzb24gYWRkZWQgYSBpZG5fZnJlZSgpIGZ1bmN0aW9uIGluIGxpYmlkbiAwLjQuNSBhcyBhIHJlYWN0aW9uIHRvCiAgR2lzbGUncyBwcmV2aW91cyBtYWlsLiBXZSBub3cgdXNlIHRoaXMgZnVuY3Rpb24sIGFuZCB0aHVzIHdlIHJlcXVpcmUgbGliaWRuCiAgMC40LjUgb3IgbGF0ZXIuIE5vIGVhcmxpZXIgdmVyc2lvbiB3aWxsIGRvLgoKLSBSb2JlcnQgRC4gWW91bmcgcmVwb3J0ZWQgdGhhdCBDVVJMT1BUX0NPT0tJRUZJTEUgYW5kIENVUkxPUFRfQ09PS0lFIGNvdWxkCiAgbm90IGJlIHVzZWQgYm90aCBpbiBvbmUgcmVxdWVzdC4gRml4ZWQgaXQgYW5kIGFkZGVkIHRlc3QgY2FzZSAxNzIgdG8gdmVyaWZ5LgoKRGFuaWVsICgyMSBNYXkgMjAwNCkKLSBXaGlsZSB0YWxraW5nIHRvIGhvc3QgYS5iLmMsIGxpYmN1cmwgZGlkIHdyb25nbHkgbm90IGFjY2VwdCBjb29raWVzIHRoYXQKICB3ZXJlIHNldCB0byB0aGUgZG9tYWluIC5hLmIuYyAodGhhdCBpcyB3aXRoIGEgZG90IHByZWZpeCkuIFRoaXMgaXMgbm93IGZpeGVkCiAgYW5kIHRlc3QgY2FzZSAxNzEgdmVyaWZpZXMgaXQuCgpEYW5pZWwgKDIwIE1heSAyMDA0KQotIEplc3NlIE5vbGxlciByZXBvcnRlZCB0aGF0IHRoZSB1cGxvYWQgc3BlZWQgaW5mbyByZXBvcnRlZCBieSBsaWJjdXJsIHdhcwogIHdyb25nLiBUaGUgc2FtZSB3YXMgdHJ1ZSBmb3IgdGhlIGRvd25sb2FkIHNwZWVkLiBGaXhlZCBub3cuCgpEYW5pZWwgKDE5IE1heSAyMDA0KQotIERhdmlkIEJ5cm9uIGFkZGVkIHRlc3QgY2FzZSAxNzAgLSB0aGlzIHVzZWQgdG8gY3Jhc2ggdGhlIHByZXZpb3VzIHZlcnNpb24gb2YKICBjdXJsLgoKRGFuaWVsICgxNyBNYXkgMjAwNCkKLSBQZXRlciBTeWx2ZXN0ZXIncyBwYXRjaCB0aGF0IGFkZHJlc3NlcyB0d28gZmxhd3MgaW4gdGhlIHBlZXIgY2VydGlmaWNhdGUKICBuYW1lIHZlcmlmaWNhdGlvbjoKICBvIHdoZW4gbXVsdGlwbGUgY29tbW9uIG5hbWVzIGFyZSB1c2VkIChhcyBpbiB0aGUgY3VybCB0ZXN0cyksIHRoZSBsYXN0IG5hbWUKICAgIG5lZWRzIHRvIGJlIHNlbGVjdGVkLgogIG8gYWxsb3cgY29tcGFyaW5nIHdpdGggZW5jb2RlZCB2YWx1ZXMsIGF0IGxlYXN0IHdpdGggQk1QIGFuZCBJU08gbGF0aW4xCiAgICBlbmNvZGVkIFQ2MXN0cmluZ3MuCgotIEFsbCAxOTEgdGVzdCBjYXNlcyBydW4gdGhyb3VnaCB0aGUgdG9ydHVyZSB0ZXN0IE9LISAnbWFrZSB0ZXN0LXRvcnR1cmUnIGlzCiAgbm93IGF2YWlsYWJsZSBpbiB0aGUgcm9vdCBtYWtlZmlsZSAob24gY29uZmlndXJlLWJhc2VkIGVudmlyb25tZW50cykuCgpEYW5pZWwgKDE0IE1heSAyMDA0KQotIFdpdGggYSBzbGlnaHRseSBtb2RpZmllZCBmdHBzZXJ2ZXIucGwgSSd2ZSBub3cgcnVuIGFsbW9zdCBhbGwgdGVzdHMgdGhyb3VnaAogIHdpdGggcnVudGVzdHMucGwgLXQuIFRoaXMgaXMgZ29vZG5lc3MhCgotIFNpbmNlIEkgaGF2ZSBiZWVuIHVuYWJsZSB0byBjb250YWN0IHRoZSBDVlMgYWRtaW5zIGZvciBzZXZlcmFsIG1vbnRocywgSSd2ZQogIGRlY2lkZWQgdGhhdCB0aGUgY3VycmVudCBDVlMgaG9zdGluZyB3YXMgbm90IGdvb2QgZW5vdWdoLiBJJ3ZlIG5vdyBtb3ZlZCB0aGUKICBDVlMgcmVwbyBvbmNlIGFnYWluLCBzZWUgUkVBRE1FIGZvciB1cGRhdGVkIGN2cyBjaGVja291dCBpbnN0cnVjdGlvbnMuCgpEYW5pZWwgKDEzIE1heSAyMDA0KQotIHJ1bnRlc3RzLnBsIC10IG5vdyBydW5zIGZpbmUgYWxsIHRoZSB3YXkgdG8gdGVzdCAxMDAuIEkgYmVsaWV2ZSB0ZXN0IGNhc2UKICAxMDAgZmFpbHMgYmVjYXVzZSBvZiBhbiBGVFAgc2VydmVyIHByb2JsZW0uCgpEYW5pZWwgKDEyIE1heSAyMDA0KQotIEdlbmVyYWwgY2xlYW51cHMgYWxsIG92ZXIgdG8gbWFrZSBsaWJjdXJsIHN1cnZpdmUgYW5kIGRvIHdlbGwgd2hlbiBhIG1lbW9yeQogIGZ1bmN0aW9uIHJldHVybnMgTlVMTC4gcnVudGVzdHMucGwgLXQgbm93IHdvcmtzIGZpbmUgZm9yIHRoZSBmaXJzdCAyNiB0ZXN0CiAgY2FzZXMuCgpEYW5pZWwgKDExIE1heSAyMDA0KQotIFNlc2h1YmFidSBQYXNhbSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBjdXJsX2dsb2JhbF9pbml0X21lbSgpIC0KICBsaWtlIG5vcm1hbCBjdXJsX2dsb2JhbF9pbml0KCkgYnV0IGFsbG93cyB0aGUgYXBwIHRvIHJlcGxhY2UgYWxsIG1lbW9yeQogIGZ1bmN0aW9ucyB3aXRoIGl0cyBvd24gc2V0LiBJIG1vZGlmaWVkIGl0IHNsaWdodGx5LgoKLSBCYXNlZCBvbiBMdWNhIEFsdGVhcycgY29tbWVudHMsIEkgbW9kaWZpZWQgdGhlIGN1cmxsaWIuZHNwIGdlbmVyYXRpb24gY29kZS4KCkRhbmllbCAoMTAgTWF5IDIwMDQpCi0gR2lzbGUgbWFpbGVkIFNpbW9uIEpvc2Vmc3NvbiAob2YgbGliaWRuIGZhbWUpIGFib3V0IHRoZSBiZW5lZml0cyBvZiBhCiAgc2VwYXJhdGUgZnJlZSgpLWZ1bmN0aW9uIGJ5IHRoYXQgbGliIHRvIG1ha2Ugc3VyZSB0aGUgbWVtb3J5IGlzIGZyZWVkIGJ5IHRoZQogIHNhbWUgbWVtb3J5IHN1YnN5c3RlbSB0aGF0IGFsbG9jYXRlZCBpdC4gSGUgcmVzcG9uZGVkIHBvc2l0aXZlbHkgYW5kIHRoaXMKICB3aWxsIGxpa2VseSBjYXVzZSB1cyB0byByZXF1aXJlIGEgbmV3ZXIgdmVyc2lvbiBvZiBsaWJpZG4gYXMgc29vbiBhcyBTaW1vbgogIHJlbGVhc2VzIG9uZSB3aXRoIHN1Y2ggYSBsaWJpZG5fZnJlZSgpIGZ1bmN0aW9uLgoKLSBKYW1lcyBCdXJzYSBtYWRlIHJ1bnRlc3RzLnBsJ3MgLXQgb3B0aW9uIHdvcmsgZm9yIGFueSBnaXZlbiB0ZXN0IGNhc2UsIGFuZCBJCiAgZWRpdGVkIHRvIGFsbG93IC1nIHRvby4gTm90IGV2ZW4gdGVzdCBjYXNlIDEgd29ya2VkLi4uCgotIEx1Y2EgQWx0ZWEgbWFkZSB0aGUgbmM9IGZpZWxkIG5vdCB1c2UgcXVvdGVzIGluIG91dGdvaW5nIEhUVFAgRGlnZXN0IGhlYWRlcnMuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgYSBwcm9ibGVtIGluIHRoZSB0ZXN0IHNjcmlwdCB0aGF0IG1hZGUgaXQgZmFpbCB0bwogIHJlY29nbml6ZSBvdXIgb3duIHJ1bm5pbmcgSFRUUCBzZXJ2ZXIuCgpEYW5pZWwgKDcgTWF5IDIwMDQpCi0gSmFtZXMgQnVyc2EgZml4ZWQgdGhlIG1lbWFuYWx5emUucGwgc2NyaXB0IHRvIGNvbmRlciBtYWxsb2MoMCkgYXJlYXMgT0sgdG8KICBmcmVlKCkgYW5kIGhlIG1hZGUgdHdvIGZhaWxlZC1yZXNvbHZlIGVycm9yIG1lc3NhZ2VzIHVzZSB0aGUgbmV3IGRpc3BsYXktCiAgbmFtZSBpbnN0ZWFkIG9mIHRoZSBpbnRlcm5hbGx5LXVzZWQgbmFtZS4KCi0gR2lzbGUgVmFuZW0gdHJpZWQgY3VybCB3aXRoCiAgd3d3LmV0ZG9tZW5lbmF2bmthbm1ha3NpbWFsdGlubmVob2xkZXNla3N0aXRyZWJva3N0YXZlcnNsaWtzb21kZXR0ZS5jb20KICB3aGljaCBjYXVzZWQgcHJvYmxlbXMsIGFuZCBJIGZpeGVkIHRoZSBzaW5nbGUgemVybyBieXRlIGJ1ZmZlciBvdmVyd3JpdGUKICB0aGF0IG9jY3VycmVkIChkdWUgdG8gYSBzdHVwaWQgcHJvdG9jb2wgYnVmZmVyIHNpemUgYW5kIHBhcnNlcikuCgotIE1hZGUgdGhlIGxpYi9jdXJsbGliLmRzcCBmaWxlIGdldCBnZW5lcmF0ZWQgYXV0b21hdGljbHkgd2hlbiBhIGRpc3RyaWJ1dGlvbgogIHBhY2thZ2UgaXMgbWFkZSwgd2l0aCB0aGUgbXN2Y3Byb2ouKiBmaWxlcyBhcyB0ZW1wbGF0ZXMgYW5kIGFsbAogIHdpbjMyLXNvdXJjZXMgYWRkZWQuIEkgdGhpbmsgdGhpcyBjYW4gYmUgbWFkZSB0byB3b3JrIGJldHRlciB0aGFuIHRoZSBhbHdheXMKICBsYWdnaW5nLWJlaGluZCBwcmV2aW91cyBhcHByb2FjaC4gSSdtIG5vdCBzdXJlIHRoaXMgYnVpbGRzIGEgd29ya2luZyBwcm9qZWN0CiAgZmlsZSByaWdodCBub3cgdGhvdWdoIQoKRGFuaWVsICg2IE1heSAyMDA0KQotIE1pY2hhZWwgQmVuZWRpY3QgYnJvdWdodCBhIGZpeCB0aGF0IGZpbGxzIGluIHRoZSBlcnJvcmJ1ZmZlciBwcm9wZXJseSB3aGVuCiAgYXJlcyBmYWlscyB0byByZXNvbHZlIGEgbmFtZSBmb3IgYSBjYXNlIG5vdCBwcmV2aW91c2x5IGRlYWx0IHdpdGggbGlrZSB0aGlzLgoKRGFuaWVsICg1IE1heSAyMDA0KQotIEpvZSBIYWxwaW4gZml4ZWQgdGhlIGFubm95aW5nIHR5cGVjYXN0IHdhcm5pbmcgaW4gbGliL2xkYXAuYwoKLSBHaXNsZSBWYW5lbSBmaXhlczoKICBvIG1lbWRlYnVnIHRvIG5vdCBhY2Nlc3MgTlVMTCBvbiBzZXZlcmFsIHBsYWNlcwogIG8gbGliY3VybC5kZWY7IGN1cmxfZm9ybXBhcnNlIGlzIGdvbmUuCiAgbyBwcm9ncmVzcy5jOyBmaXhlZCB0aGUgcGVyY2VudCB2YWx1ZXMgYmVpbmcgdHJ1bmNlZCB0byAwLgogIG8gaWYyaXAuKjsgY29uc3RpZmllZCB0aGUgJ2ludGVyZmFjZScgYXJndW1lbnQuCgotIFRvciBBcm50c2VuIHJlcG9ydGVkIHRoYXQgbWFueSBvZiBoaXMgYXV0b2J1aWxkcyBmcm96ZSBhbmQgSSBmb3VuZCBhbmQgZml4ZWQKICBhIHByb2JsZW0gaW50cm9kdWNlZCB3aXRoIHRoZSBIVFRQIGF1dGggb3ZlcmhhdWwgdGhhdCBjb3VsZCBsZWFkIHRvIGEKICBuZXZlci1lbmRpbmcgaW50ZXJuYWwgcmVxdWVzdC1sb29wIGR1ZSB0byB1bi1pbml0aWFsaXplZCB2YXJpYWJsZXMhCgotIFJlbW92ZWQgc2V2ZXJhbCBjb21waWxlciB3YXJuaW5ncyBvbiB2YXJpb3VzIGNvbXBpbGVycy9wbGF0Zm9ybXMuCgpEYW5pZWwgKDQgTWF5IDIwMDQpCi0gY3VybF9mb3JtcGFyc2UoKSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpYnJhcnkuIEl0IGhhcyBiZWVuIG1hcmtlZCBhbmQKICBtZW50aW9uZWQgYXMgZGVwcmVjYXRlZCBmb3Igc2V2ZXJhbCB5ZWFycy4KCkRhbmllbCAoMyBNYXkgMjAwNCkKLSBSZXdyaXR0ZW4gSFRUUCBhdXRoZW50aWNhdGlvbiBjb2RlLiBUaGUgcHJldmlvdXMgY29kZSBjb3VsZCBub3QgcHJvcGVybHkKICBkZWFsIHdpdGggdGhlIGFkZGVkIHRlc3QgY2FzZXMgMTY3LCAxNjggYW5kIDE2OS4gSSd2ZSBub3cgcmV3cml0dGVuIHRoZSBjb2RlCiAgdG8gYmV0dGVyIHNlcGFyYXRlIGhvc3QgYW5kIHByb3h5IGF1dGhlbnRpY2F0aW9uIGFuZCBub3QgcmUtdXNlIHRoZSBzYW1lCiAgdmFyaWFibGVzIGFzIG11Y2ggYXMgYmVmb3JlIGFzIGl0IHByb3ZlZCBub24gd29ya2luZyBpbiB0aGUgbW9yZSBpbnZvbHZlZAogIGNhc2VzLiBBbGwgdGhlIGN1cnJlbnQgdGVzdHMgcnVuIE9LIG5vdywgYW5kIHNvIGRvIHRoZSBuZXcgb25lcy4gVGhlIGN1cmwKICB0b29sIGdvdCBhIG5ldyBvcHRpb24gbmFtZWQgLS1wcm94eS1kaWdlc3QgdG8gZW5hYmxlIEhUVFAgRGlnZXN0CiAgYXV0aGVudGljYXRpb24gd2l0aCB0aGUgcHJveHkuIEkgYWxzbyBtYWRlIHRoZSBsaWJyYXJ5IHN1cHBvcnQgaXQuCgotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIExEQVAgY29kZSB3b3JrIHdpdGggd2xkYXAzMi5kbGwgYXMgc3VwcGxpZWQgd2l0aAogIFdpbi05OC9NRS8yMDAwL1hQLCBzbyBubyBleHRyYSAuZGxscyBhcmUgcmVxdWlyZWQgd2hlbiBjdXJsL2xpYmN1cmwgaXMgdXNlZAogIG9uIHRoZXNlIFdpbmRvd3MgdmVyc2lvbnMuCgpEYW5pZWwgKDMwIEFwcmlsIDIwMDQpCi0gcnVudGVzdHMucGwgbm93IHNjYW5zIHRoZSB2YWxncmluZCBsb2cgZm9yIHZhbGdyaW5kLWRldGVjdGVkIG1lbW9yeSBsZWFrcwogIGFmdGVyIGVhY2ggdGVzdCBjYXNlIGlmIHZhbGdyaW5kIHdhcyBmb3VuZCBhbmQgdXNlZC4KCi0gSSBtb2RpZmllZCB0aGUgYXBwLWNvZGUgaW4gY3VybCB0byBpbmNsdWRlIHRoZSBuZXcgbGliL2N1cmx4LmggYW5kIG9ubHkKICBhY2Nlc3MgdGhvc2UgZnVuY3Rpb25zIHVzaW5nIHRoZSBjdXJseF8tcHJlZml4IGluIHByZXBhcmF0aW9uIGZvciB0aGUgZnV0dXJlCiAgcmVtb3ZhbCBvZiBzZXZlcmFsIGN1cmxfLWZ1bmN0aW9ucyBmcm9tIHRoZSBwdWJsaWMgbGliY3VybCBBUEkuCgotIEludHJvZHVjZWQgbGliL2N1cmx4LmggYXMgYSBzaW5nbGUgaGVhZGVyIHRvIHByb3ZpZGUgdGhlIGN1cmx4Xy1mdW5jdGlvbnMKICB0byBhcHBzLgoKLSBBZGRlZCBub3RpY2VzIGluIHRoZSBtYW4gcGFnZXMgZm9yIGN1cmxfZ2V0ZW52LCBjdXJsX21wcmludGYsIGN1cmxfc3RyZXF1YWwKICBhbmQgY3VybF9zdHJuZXF1YWwgdGhhdCB0aGV5IGFyZSBzdWJqZWN0IGZvciByZW1vdmFsIGluIGEgZnV0dXJlIHJlbGVhc2UuCiAgU1RPUCBVU0lORyBUSEVTRSBGVU5DVElPTlMuCgotIE1paGFpIElvbmVzY3Ugbm90aWNlZCBoZSBjb3VsZG4ndCBkbyBmb3JtcG9zdHMgd2l0aCB3aGl0ZXNwYWNlIGluIHRoZSBmaWxlCiAgbmFtZXMgYW5kIHllcywgSSBicm9rZSB0aGF0IG9uIEFwcmlsIDIzLiBTaWdoLiBJIGZpeGVkIGl0IG5vdyBhbmQgYWRkZWQKICB0ZXN0IGNhc2UgMTY2IHRvIHZlcmlmeSBpdC4KCi0gTHVjYSBBbHRlYSBwb2ludGVkIG91dCBhIG1pc3Rha2UgbGVmdCBmcm9tIHRoZSBEaWdlc3QgcGF0Y2ggb2YgeWVzdGVyZGF5LgoKRGFuaWVsICgyOSBBcHJpbCAyMDA0KQotIE1hZGUgSUROIGRvbWFpbnMgd29yayB3aGVuIHNlbmRpbmcgcmVxdXN0cyBvdmVyIEhUVFAgcHJveHkgYXMgd2VsbC4gQWRkZWQKICB0ZXN0IGNhc2UgMTY1IHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCi0gRml4ZWQgYSBidWcgaW4gdGhlIG5ldyBpbnRlcm5hbCBob3N0IG5hbWUgc2V0dXAgd2hlbiByZS11c2luZyBjb25uZWN0aW9ucy4KCi0gSmFtZXMgQnVyc2EgZm91bmQgb3V0IHRoYXQgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHdpdGggYXJlcy1idWlsdCBsaWJjdXJsCiAgY3JlYXRlZCBhIGJhZCBoYW5kbGUgdGhhdCB3b3VsZCBjcmFzaCBpbiB0aGUgZmlyc3QgbmFtZSByZXNvbHZlIGF0dGVtcHQuIFRoaXMKICBpcyBub3cgZml4ZWQgYW5kIHRlc3QgY2FzZSA1MTIgd2FzIGFkZGVkIHRvIHZlcmlmeSBpdC4KCi0gTHVjYSBBbHRlYSBwcm92aWRlZCBhIG1ham9yIEhUVFAgRGlnZXN0IGNvZGUgZml4IGFuZCBjbGVhbnVwLiBXZSBub3cgZm9sbG93CiAgdGhlIERpZ2VzdCBSRkMgYSBsb3QgYmV0dGVyLgoKLSBHaXNsZSBWYW5lbSBtYWRlIHRoZSBTU0wgY29kZSB1c2UgRVJSX2Vycm9yX3N0cmluZ19uKCkgd2hlcmUgYXBwbGljYWJsZS4KCkRhbmllbCAoMjcgQXByaWwgMjAwNCkKLSBJIHJlbW9kZWxlZCBHaXNsZSdzIElETiBjb2RlIHNsaWdodGx5IGFuZCBub3cgd2UgY29udmVydCBib3RoIHRoZSBob3N0IG5hbWUKICBhbmQgcHJveHkgbmFtZSB0byB0aGUgQUNFIGVuY29kZWQgdmVyc2lvbiB0byB1c2UgaW50ZXJuYWxseSBmb3IgcmVzb2x2ZXMgYW5kCiAgY29va2llcyBldGMuIFRoZXkgYXJlIG5vdyB1c2luZyBvbmUgJ3N0cnVjdCBob3N0bmFtZScgZWFjaCB0aGF0IGtlZXAgYm90aAogIHRoZSBvcmlnaW5hbCBuYW1lIGFuZCB0aGUgcG9zc2libHkgZW5jb2RlZCBuYW1lLiBJRE4gcmVzb2x2ZXMgd29yayBmb3IgbWUKICBub3cgdXNpbmcgSVB2NiwgSVB2NCBhbmQgYXJlcyByZXNvbHZpbmcuIEV2ZW4gY29va2llcyBvbiBJRE4gc2l0ZXMgc2VlbSB0bwogIGRvIHJpZ2h0LiBJIGdvdCBzb21lIGZhaWx1cmVzIGF0IGZpcnN0IHdoZW4gQ0hBUlNFVCB3YXNuJ3Qgc2V0IGF0IGFsbCB3aGljaAogIGNvbmZ1c2VkIGxpYmlkbiBjb21wbGV0ZWx5IGFuZCBpdCBkZWNpZGVkIGJ5IGVuY29kaW5nIG9mIGNob2ljZSB3YXMKICAnQU5TSV9YMy40LTE5NjgnLi4uCgotIG1hZGUgJ2NvbmZpZ3VyZSAtLXdpdGhvdXQtbGliaWRuJyB3b3JrCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDQpCi0gRml4ZWQgdGhlIHNyYy9odWdlaGVscC5jIGZpbGUgdG8gaW5jbHVkZSAic2V0dXAuaCIgaW5zdGVhZCBvZiAiY29uZmlnLmgiIHRvCiAgbWFrZSB0aGUgcHJvYmxlbXMgd2l0aCBVU0VfTUFOVUFMIG9uIHdpbmRvd3MgZ28gYXdheS4KCi0gY29uZmlndXJlIC0td2l0aG91dC1zc2wgY291bGQgc3RpbGwgd3JvbmdseSBpbmNsdWRlIHNvbWUgT3BlblNTTCBpbmZvIGluIHRoZQogIE1ha2VmaWxlcyBpZiBwa2ctY29uZmlnIGhhZCBpbmZvIGFib3V0IE9wZW5TU0wuIEJ1ZyAjOTQxNzYyIHJlcG9ydGVkIGJ5CiAgTWFydGluLgoKLSBTaW5jZSB3ZSBjYW4gbm93IGJ1aWxkIGFuZCB1c2UgcXVpdGUgYSBsYXJnZSBzZXQgb2YgM3JkIHBhcnR5IGxpYnJhcmllcywgSQogIGRlY2lkZWQgSSB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBwcm9kdWNlIGEgc3VtbWFyeSBhdCB0aGUgZW5kIHNob3dpbmcgd2hhdAogIGxpYnJhcmllcyBpdCB1c2VzIGFuZCBpZiBub3QsIHdoYXQgb3B0aW9uIHRvIHVzZSB0byBtYWtlIGl0IHVzZSB0aGF0LiBJIGFsc28KICBhZGRlZCBzb21lIG90aGVyIHJhbmRvbSBpbmZvIHRoYXQgaXMgbmljZSBpbiBhICJjb25maWd1cmUgc3VtbWFyeSIgb3V0cHV0LgoKLSBBcHBsaWVkIFRvbW15VGFtJ3MgcGF0Y2ggdGhhdCBub3cgbWFrZSBjdXJsIHdvcmsgd2l0aCB0ZWxuZXQgYW5kIHN0ZGluCiAgcHJvcGVybHkgb24gV2luZG93cy4KCi0gVGhlIGNoYW5nZXMgZm9yIHRvZGF5IGJlbG93IHdlcmUgbWFkZSBieSBtZSBhbmQgR2lzbGUgVmFuZW0uCgogIFRoZSBmaWxlIHByZXZpb3VzbHkga25vd24gYXMgaG9zdGlwLmMgaGFzIG5vdyB1bmRlcmdvbmUgYSBodWdlIGNsZWFudXAgYW5kCiAgc3BsaXQ6CgogIGhvc3RpcC5jIGV4cGxhaW5lZAogID09PT09PT09PT09PT09PT09PQoKICBUaGUgbWFpbiBDT01QSUxFLVRJTUUgREVGSU5FUyB0byBrZWVwIGluIG1pbmQgd2hlbiByZWFkaW5nIHRoZSBob3N0Ki5jCiAgc291cmNlIGZpbGUgYXJlIHRoZXNlOgoKICBDVVJMUkVTX0lQVjYgLSB0aGlzIGhvc3QgaGFzIGdldGFkZHJpbmZvKCkgYW5kIGZhbWlseSwgYW5kIHRodXMgd2UgdXNlCiAgdGhhdC4gVGhlIGhvc3QgbWF5IG5vdCBiZSBhYmxlIHRvIHJlc29sdmUgSVB2NiwgYnV0IHdlIGRvbid0IHJlYWxseSBoYXZlIHRvCiAgdGFrZSB0aGF0IGludG8gYWNjb3VudC4gSG9zdHMgdGhhdCBhcmVuJ3QgSVB2Ni1lbmFibGVkIGhhdmUgQ1VSTFJFU19JUFY0CiAgZGVmaW5lZC4KCiAgQ1VSTFJFU19BUkVTIC0gaXMgZGVmaW5lZCBpZiBsaWJjdXJsIGlzIGJ1aWx0IHRvIHVzZSBjLWFyZXMgZm9yIGFzeW5jaHJvbm91cwogIG5hbWUgcmVzb2x2ZXMuIEl0IGNhbm5vdCBoYXZlIEVOQUJMRV9JUFY2IGRlZmluZWQgYXQgdGhlIHNhbWUgdGltZSwgYXMKICBjLWFyZXMgaGFzIG5vIElQdjYgc3VwcG9ydC4gVGhpcyBjYW4gYmUgV2luZG93cyBvciAqbml4LgoKICBDVVJMUkVTX1RIUkVBREVEIC0gaXMgZGVmaW5lZCBpZiBsaWJjdXJsIGlzIGJ1aWx0IHRvIHJ1biB1bmRlciAobmF0aXZlKQogIFdpbmRvd3MsIGFuZCB0aGVuIHRoZSBuYW1lIHJlc29sdmUgd2lsbCBiZSBkb25lIGluIGEgbmV3IHRocmVhZCwgYW5kIHRoZQogIHN1cHBvcnRlZCBhc3luY2ggQVBJIHdpbGwgYmUgdGhlIHNhbWUgYXMgZm9yIGFyZXMtYnVpbGRzLgoKICBJZiBhbnkgb2YgdGhlIHR3byBwcmV2aW91cyBhcmUgZGVmaW5lZCwgQ1VSTFJFU19BU1lOQ0ggaXMgZGVmaW5lZCB0b28uIElmCiAgbGliY3VybCBpcyBub3QgYnVpbHQgdG8gdXNlIGFuIGFzeW5jaHJvbm91cyByZXNvbHZlciwgQ1VSTFJFU19TWU5DSCBpcwogIGRlZmluZWQuCgogIFRoZSBob3N0Ki5jIHNvdXJjZXMgZmlsZXMgYXJlIHNwbGl0IHVwIGxpa2UgdGhpczoKCiAgaG9zdGlwLmMgICAtIG1ldGhvZC1pbmRlcGVuZGVudCByZXNvbHZlciBmdW5jdGlvbnMgYW5kIHV0aWxpdHkgZnVuY3Rpb25zCiAgaG9zdGFzeW4uYyAtIGZ1bmN0aW9ucyBmb3IgYXN5bmNocm9ub3VzIG5hbWUgcmVzb2x2ZXMKICBob3N0c3luLmMgIC0gZnVuY3Rpb25zIGZvciBzeW5jaHJvbm91cyBuYW1lIHJlc29sdmVzCiAgaG9zdGFyZXMuYyAtIGZ1bmN0aW9ucyBmb3IgYXJlcy11c2luZyBuYW1lIHJlc29sdmVzCiAgaG9zdHRocmUuYyAtIGZ1bmN0aW9ucyBmb3IgdGhyZWFkZWQgbmFtZSByZXNvbHZlcwogIGhvc3RpcDQuYyAgLSBJUHY0IHNwZWNpZmljIGZ1bmN0aW9ucwogIGhvc3RpcDYuYyAgLSBJUHY2IHNwZWNpZmljIGZ1bmN0aW9ucwoKICBUaGUgaG9zdGlwLmggaXMgdGhlIHNpbmdsZSB1bml0ZWQgaGVhZGVyIGZpbGUgZm9yIGFsbCB0aGlzLiBJdCBkZWZpbmVzIHRoZQogIENVUkxSRVNfKiBkZWZpbmVzIGJhc2VkIG9uIHRoZSBjb25maWcqLmggYW5kIHNldHVwLmggZGVmaW5lcy4KCi0gQWRkZWQgZnVuY3Rpb24gaGVhZGVyIGNvbW1lbnRzIHRvIG1hbnkgZnVuY3Rpb25zIGluIGFuIGF0dGVtcHQgdG8gYmV0dGVyCiAgZXhwbGFpbiB0aGUgcHVycG9zZSBvZiB0aGVtIGFsbC4KCi0gY29uZmlndXJlIC0td2l0aC1saWJpZG4gaXMgbm93IHN1cHBvcnRlZC4gSXQgbWFrZXMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICBjaGVjayBmb3IgbGliaWRuIGxpYnMgYW5kIGluY2x1ZGUgZmlsZXMgaW4gdGhlIHByZWZpeCBwYXRoIGdpdmVuLiBJZiB5b3UKICBzYXkgLS13aXRoLWxpYmlkbj0vdXNyL2xvY2FsLCBpdCB3aWxsIGNoZWNrIGZvciB0aGUgbGliIGluIC91c3IvbG9jYWwvbGliCiAgYW5kIHRoZSBpbmNsdWRlcyBpbiAvdXNyL2xvY2FsL2luY2x1ZGUgZXRjLgoKLSBjdXJsX3ZlcnNpb25faW5mbygpIG5vdyByZXR1cm5zIGEgc3RydWN0IGFnZWQgQ1VSTFZFUlNJT05fVEhJUkQgaW5jbHVkaW5nCiAgbGliaWRuIHZlcnNpb24gaW5mby4gVGhlIHN0cmluZyBjdXJsX3ZlcnNpb24oKSByZXR1cm5zIGFsc28gaW5jbHVkZXMgbGliaWRuCiAgdmVyc2lvbiBpbmZvLCBpZiBhdmFpbGFibGUuCgpWZXJzaW9uIDcuMTEuMiAoMjYgQXByaWwgMjAwNCkKCkRhbmllbCAoMjUgQXByaWwgMjAwNCkKLSBFcndpbiBBdXRocmllZCBwb2ludGVkIG91dCB0aGF0IGNvbmZpZ3VyZSAtLWRpc2FibGUtbWFudWFsIGRpZG4ndCBkbyByaWdodAogIGlmIHlvdSBhbHJlYWR5IGhhZCBhIHNyYy9odWdlaGVscC5jIHNvdXJjZSBmaWxlIHByZXNlbnQgKHdoaWNoIG1vc3QgcGVvcGxlCiAgZG8gSSBndWVzcykuIEl0IG5vdyB1c2VzIHRoZSBVU0VfTUFOVUFMIGRlZmluZSBwcm9wZXJseS4KCkRhbmllbCAoMjMgQXByaWwgMjAwNCkKLSBHaXNsZSBWYW5lbSBmb3VuZCBhbmQgZml4ZWQgYSBtZW1vcnkgbGVhayB3aGVuIGRvaW5nIChmYWlsaW5nKSBXaW5kb3dzCiAgdGhyZWFkZWQgbmFtZSByZXNvbHZlcy4KCi0gSSBhbHNvIGFkZGVkIHRlc3QgY2FzZSAxNjMganVzdCB0byBtYWtlIHN1cmUgLUYgInZhcj08ZmlsZSIgd29ya3MgZmluZSBhbmQKICBjYW4gcGFzcyBvbiBjaGFyYWN0ZXJzIHN1Y2ggYXMgbmV3bGluZXMsIGNhcnJpYWdlLXJldHVybiBhbmQgdGFicy4KCi0gV2hlbiB3ZSBhZGRlZCB0ZXN0IGNhc2UgMTYyIHdpdGhvdXQgYWRkaW5nIHRoZSBuZWNlc3NhcnkgcmVxdWlyZW1lbnQgZmllbGQKICBpbiB0aGUgdGVzdCBtZXRhIGRhdGEgd2UgY291bGQgc2VlIHRoYXQgY3VybCBkaWRuJ3QgY29tcGxhaW4gaWYgeW91IHVzZWQKICAtLXByb3h5LW50bG0gZXZlbiBpZiB0aGUgdW5kZXJseWluZyBsaWJjdXJsIGl0IHVzZXMgaGFzIG5vIE5UTE0gc3VwcG9ydCEgSQogIG5vdyBtYWRlIGl0IGNoZWNrIHRoaXMgZmlyc3QsIGFuZCBpdCBub3cgZXhpc3RzIHdpdGggYSAidGhlIGluc3RhbGxlZAogIGxpYmN1cmwgdmVyc2lvbiBkb2Vzbid0IHN1cHBvcnQgdGhpcyIgbWVzc2FnZSBpZiBpdCBoYXBwZW5zIGFnYWluLgoKRGFuaWVsICgyMiBBcHJpbCAyMDA0KQotIERhdmlkIEJ5cm9uIGZvdW5kIGFuZCBmaXhlZCBhIHNtYWxsIGJ1ZyB3aXRoIHRoZSAtLWZhaWwgYW5kIGF1dGhlbnRpY2F0aW9uCiAgc3R1ZmYgYWRkZWQgYSBmZXcgd2Vla3MgYWdvLiAgVHVybnMgb3V0IHRoYXQgaWYgeW91IHNwZWNpZnkgLS1wcm94eS1udGxtIGFuZAogIGNvbW11bmljYXRlIHdpdGggYSBwcm94eSB0aGF0IHJlcXVpcmVzIGJhc2ljIGF1dGhlbnRpY2F0aW9uLCB0aGUgcHJveHkKICBwcm9wZXJseSByZXR1cm5zIGEgNDA3LCBidXQgdGhlIGZhaWx1cmUgZGV0ZWN0aW9uIGNvZGUgZG9lc24ndCByZWFsaXplIGl0CiAgc2hvdWxkIGdpdmUgdXAsIHNvIGN1cmwgcmV0dXJucyB3aXRoIGV4aXQgY29kZSAwLiBUZXN0IGNhc2UgMTYyIGFkZGVkIHRvCiAgdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKLSBhbGxvdyBuZXdsaW5lcyBpbiB0aGUgY29udGVudHMgd2hlbiBkb2luZyAtRiAidmFyPVtjb250ZW50c10iCiAgUm9iZXJ0IE1hcmxvdyByZXBvcnRlZC4KCi0gSWYgYSB0cmFuc2ZlciBpcyBmb3VuZCBvdXQgdG8gYmUgb25seSBwYXJ0aWFsLCBsaWJjdXJsIHdpbGwgbm93IHRyZWF0IHRoYXQKICBhcyBhIHByb2JsZW0gc2VyaW91cyBlbm91Z2ggdG8gc2tpcCB0aGUgZmluYWwgUVVJVCBjb21tYW5kIGJlZm9yZSBjbG9zaW5nCiAgdGhlIGNvbnRyb2wgY29ubmVjdGlvbi4gVG8gYXZvaWQgdGhlIHJpc2sgdGhhdCBpdCB3aWxsICJoYW5nIiB3YWl0aW5nIGZvcgogIHRoZSBRVUlUIHJlc3BvbnNlLiBBZGRlZCB0ZXN0IGNhc2UgMTYxIHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgyMSBBcHJpbCAyMDA0KQotIE1vZGlmaWVkIHRoZSBoZXVyaXN0aWNzIGZvciBkZWFsaW5nIHdpdGggdGhlIHRlc3QgMTYwIHNjZW5hcmlvLiBXaGVuIGEKICBjb25uZWN0aW9uIGlzIHJlLXVzZWQgYW5kIG5vdGhpbmcgYXQgYWxsIGlzIHJlY2VpdmVkIGZyb20gaXQgKGJlY2F1c2UgdGhlCiAgc2VydmVyIGNsb3NlcyB0aGUgY29ubmVjdGlvbiksIHdlIHdpbGwgbm93IHJldHJ5IHRoZSByZXF1ZXN0IG9uIGEgZnJlc2ggbmV3CiAgY29ubmVjdGlvbi4gVGhlIHByZXZpb3VzIEVDT05OUkVTRVQgc3R1ZmYgZnJvbSBKYW51YXJ5IDMwIHdhcyByZW1vdmVkIGFnYWluCiAgYXMgaXQgZGlkbid0IGRldGVjdCB0aGUgc2l0dWF0aW9uIGdvb2QgZW5vdWdoLgoKRGFuaWVsICgyMCBBcHJpbCAyMDA0KQotIEFkZGVkIHRlc3QgY2FzZSAxNjAgdG8gdmVyaWZ5IHRoYXQgY3VybCB3b3JrcyBjb3JyZWN0bHkgd2hlbiBpdCBnZXRzIGEKICBjb25uZWN0aW9uIHJlc2V0IHdoZW4gdHJ5aW5nIHRvIHJlLXVzZSBhIGNvbm5lY3Rpb24uIEl0IHNob3VsZCB0aGVuIHNpbXBseQogIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGFuZCByZXNlbmQgdGhlIHJlcXVlc3QuCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDQpCi0gTm8gbW9yZSA1MTIgYnl0ZSBsaW1pdCBmb3IgaG9zdCBuYW1lIChpbmNsdXNpbmcgbmFtZSArIHBhc3N3b3JkKSBpbiBsaWJjdXJsLgogIEFuIGFkZGVkIGJvbnVzIGlzIHRoYXQgd2UgdXNlIGxlc3MgbWVtb3J5IGZvciB0aGUgdHlwaWNhbCAoc2hvcnRlciBVUkwpCiAgY2FzZS4KCi0gQ2xlYW5lZCB1cCB0aGUgc291cmNlcyB0byBiZXR0ZXIgdXNlIHRoZSB0ZXJtcyAnaG9zdG5hbWUnIGFuZCAncGF0aCcKICBpbnRlcm5hbGx5IHdoZW4gcmVmZXJyaW5nIHRvIHRoYXQgZGF0YS4gVGhlIGJ1ZmZlcnMgdXNlZCBmb3Iga2VlcCB0aGF0IGluZm8KICBpcyBjYWxsZWQgJ25hbWVidWZmZXInIGFuZCAncGF0aGJ1ZmZlcicuIE11Y2ggZWFzaWVyIHRvIHJlYWQgYW5kIHVuZGVyc3RhbmQKICB0aGFuIHRoZSBwcmV2aW91cyBtZXNzLgoKRGFuaWVsICgxNSBBcHJpbCAyMDA0KQotIE1vZGlmaWVkIHJ1bnRlc3RzLnBsIGFnYWluIHRvIHJlbW92ZSBhbGwgbG9nIGZpbGVzIGluIHRoZSBsb2cvIGRpciBiZXR3ZWVuCiAgZWFjaCB0ZXN0LCBhbmQgdGhlbiBtYWRlIC1wIGRpc3BsYXkgYWxsIG5vbi16ZXJvIGJ5dGUgZmlsZXMgaW4gdGhlIGxvZyBkaXIuCiAgSXQgc2hvdWxkIG1ha2UgdGhhdCBkYXRhIG1vcmUgdXNhYmxlIGFuZCBjb250YWluIGxlc3MgcnViYmlzaC4KCi0gZnRwc2VydmVyLnBsIG5vdyBwcm9kdWNlcyBsb2cgZmlsZXMgbW9yZSBzaW1pbGFyIHRvIGhvdyB0aGUgc3dzIG9uZXMgbG9vawogIGFuZCB0aGV5IG5vdyBhbHNvIGNvbnRhaW5zIGEgYml0IG1vcmUgZGV0YWlscyB0byBoZWxwIGRlYnVnZ2luZyBmdHAKICBwcm9ibGVtcy4KCi0gUmVtb3ZlZCB0aGUgZml4ZWQgbWF4aW11bSBhbW91bnQgb2YgZGlyIGxldmVscyB0aGUgRlRQIGNvZGUgc3VwcG9ydGVkLgogIFByZXZpb3VzbHkgd2UgaGFkIGEgZml4ZWQgYXJyYXkgZm9yIDEwMCBsZXZlbHMsIG5vdyB3ZSBzYXZlIHNwYWNlIGluIGVhY2gKICBoYW5kbGUgYnkgYWxsb2NhdGluZyBvbmx5IGZvciBhIGZldyBsZXZlbCBieSBkZWZhdWx0IGFuZCB0aGVuIGVubGFyZ2luZyB0aGF0CiAgaW4gY2FzZSBvZiBuZWVkICh3aXRoIG5vIG1heGltdW0gZGVwdGgpLiBBZGp1c3RlZCB0ZXN0IGNhc2UgMTQyIHRvIHZlcmlmeQogIHRoYXQgMTUwIGRpciBsZXZlbHMgd29yayBmaW5lLiAgQW4gYWRkZWQgYm9udXMgaXMgdGhhdCB3ZSB1c2UgbGVzcyBtZW1vcnkKICBmb3IgdGhlIHR5cGljYWwgKG5vdCB2ZXJ5IGRlZXApIGNhc2UuCgpEYW5pZWwgKDE0IEFwcmlsIDIwMDQpCi0gQXNraW5nIGZvciBDVVJMX0lQUkVTT0xWRV9WNiB3aGVuIElQdjYgYWRkcmVzc2VzIGNhbid0IGJlIHJlc29sdmVkIHdpbGwKICBub3cgY2F1c2UgdGhlIHJlc29sdmUgZnVuY3Rpb24gdG8gcmV0dXJuIE5VTEwgaW1tZWRpYXRlbHkuIFRoaXMgZmxhdyB3YXMKICBwb2ludGVkIG91dCBieSBHaXNsZSBWYW5lbS4KCi0gR2lzbGUgVmFuZW0gbWFkZSBjdXJsIC00Ly02IGFjdHVhbGx5IHNldCB0aGUgZGVzaXJlZCBvcHRpb24gdG8gbGliY3VybC4KCi0gcnVudGVzdHMucGwgbm93IGhhcyBhIG5ldyBvcHRpb24gKC1wKSB0aGF0IHdpbGwgZGlzcGxheSAiaW50ZXJlc3RpbmciIGxvZwogIGZpbGVzIHRvIHN0ZG91dCBpbiBjYXNlIG9mIGEgdGVzdCBmYWlsdXJlLiBUaGlzIGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBiZQogIHVzZWQgaW4gdGhlICdmdWxsLXRlc3QnIG1ha2UgdGFyZ2V0IHRoYXQgaXMgdXNlZCBieSB0aGUgYXV0b2J1aWxkIHRlc3RzLCBhcwogIHdlIHRoZW4gZ2V0IGEgbXVjaCBiZXR0ZXIgY2hhbmNlIHRvIHVuZGVyc3RhbmQgKHJlbW90ZSkgdGVzdCBmYWlsdXJlcyBiYXNlZAogIG9uIGF1dG9idWlsZCBsb2dzIGFsb25lLgoKRGFuaWVsICgxMyBBcHJpbCAyMDA0KQotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIG11bHRpIGludGVyZmFjZSB3b3JrIGFnYWluIG9uIFdpbmRvd3MgZXZlbiB3aGVuIGJ1aWx0CiAgd2l0aG91dCBhcmVzLiBCZWZvcmUgdGhpcywgc2VsZWN0KCkgd291bGQgcmV0dXJuIC0xIGR1cmluZyB0aGUgbmFtZSByZXNvbHZlCiAgcGhhc2Ugc2luY2UgY3VybF9tdWx0aV9mZHNldCgpIGRpZG4ndCByZXR1cm4gYW55IGZkX3NldCBhdCBhbGwgd2hpY2ggd2Fzbid0CiAgYXBwcmVjaWF0ZWQhCgotIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSBub3cgZHVwbGljYXRlcyB0aGUgdGNwX25vZGVsYXkgaW5mbyBhcyB3ZWxsLgoKRGFuaWVsICgxMSBBcHJpbCAyMDA0KQotIEFwcGxpZWQgRGF2aWQgQnlyb24ncyBwYXRjaCBmb3IgdGhlIE1TVkMgbGliY3VybCBtYWtlZmlsZSBmb3IgYnVpbGRzIHdpdGgKICB6bGliLgoKRGFuaWVsICg5IEFwcmlsIDIwMDQpCi0gRGlyayBNYW5za2UgaW1wcm92ZWQgdGhlIHRpbWVyIHJlc29sdXRpb24gZm9yIENVUkxJTkZPXypfVElNRSwgaXQgY2FuIG5vdwogIGJlIGRvd24gdG8gdXNlYyBpZiB0aGUgc3lzdGVtIHN5cHBvcnRzIGl0LgoKRGFuaWVsICg3IEFwcmlsIDIwMDQpCi0gQSByZXF1ZXN0IHRoYXQgc2VuZHMgIkV4cGVjdDogMTAwLWNvbnRpbnVlIiBhbmQgZ2V0cyBub3RoaW5nIGJ1dCBhIHNpbmdsZQogIDEwMCByZXNwb25zZSBiYWNrIHdpbGwgbm93IHJldHVybiBhIENVUkxFX0dPVF9OT1RISU5HLiBUZXN0IDE1OCB2ZXJpZmllcy4KCi0gVGhlIHN0cnRvb2ZmdCgpIG1hY3JvIGlzIG5vdyBuYW1lZCBjdXJseF9zdHJ0b29mZnQoKSB0byB1c2UgdGhlIGN1cmx4XyoKICBhcHByb2FjaCBmdWxseS4KCkRhbmllbCAoNiBBcHJpbCAyMDA0KQotIEdpc2xlIFZhbmVtJ3MgZml4ZWQgYnVnICM5Mjc5NzkgcmVwb3J0ZWQgYnkgTmF0aGFuIE8nU3VsbGl2YW4uIFRoZSBwcm9ibGVtCiAgbWFkZSBsaWJjdXJsIG9uIFdpbmRvd3MgbGVhayBhIHNtYWxsIGFtb3VudCBvZiBtZW1vcnkgaW4gZWFjaCBuYW1lIHJlc29sdmUKICB3aGVuIG5vdCB1c2VkIGFzIGEgRExMLgoKLSBOZXcgYXV0aGVudGljYXRpb24gY29kZSBhZGRlZCwgcGFydGljdWxhcmx5IG5vdGljYWJsZSB3aGVuIGRvaW5nIFBPU1Qgb3IgUFVUCiAgd2l0aCBEaWdlc3Qgb3IgTlRMTS4gbGliY3VybCB3aWxsIG5vdyB1c2UgSEVBRCB0byBuZWdvdGlhdGUgdGhlCiAgYXV0aGVudGljYXRpb24gYW5kIHdoZW4gZG9uZSBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgUE9TVC4gUHJldmlvdXNseSBsaWJjdXJsCiAgc2VudCBQT1NUIGltbWVkaWF0ZWx5IGFuZCBleHBlY3RlZCB0aGUgc2VydmVyIHRvIHJlcGx5IGEgZmluYWwgc3RhdHVzIGNvZGUKICB3aXRoIGFuIGVycm9yIGFuZCB0aGVuIGxpYmN1cmwgd291bGQgbm90IHNlbmQgdGhlIHJlcXVlc3QtYm9keSBidXQgaW5zdGVhZAogIHNlbmQgdGhlbiBuZXh0IHJlcXVlc3QgaW4gdGhlIHNlcXVlbmNlLgoKICBUaGUgcmVhc29uIGZvciB0aGlzIGNoYW5nZSBpcyBkdWUgdG8gSUlTNiBiYXJmaW5nIG9uIGxpYmN1cmwgd2hlbiB3ZSBhdHRlbXB0CiAgdG8gUE9TVCB3aXRoIE5UTE0gYXV0aGVudGljYXRpb24uIFRoZSByZWFzb24gZm9yIHRoZSBwcm9ibGVtcyBpcyBmb3VuZCBpbgogIFJGQzI2MTYgc2VjdGlvbiA4LjIuMyByZWdhcmRpbmcgaG93IHNlcnZlcnMgc2hvdWxkIGRlYWwgd2l0aCB0aGUgMTAwCiAgY29udGludWUgcmVxdWVzdC1oZWFkZXI6CgogICAgICAgIElmIGl0IHJlc3BvbmRzIHdpdGggYSBmaW5hbCBzdGF0dXMgY29kZSwgaXQgTUFZIGNsb3NlIHRoZSB0cmFuc3BvcnQKICAgICAgICBjb25uZWN0aW9uIG9yIGl0IE1BWSBjb250aW51ZSB0byByZWFkIGFuZCBkaXNjYXJkIHRoZSByZXN0IG9mIHRoZQogICAgICAgIHJlcXVlc3QuCgogIFByZXZpb3VzIHZlcnNpb25zIG9mIElJUyBjbGVhcmx5IGRpZCBjbG9zZSB0aGUgY29ubmVjdGlvbiBpbiB0aGlzIGNhc2UsCiAgd2hpbGUgdGhpcyBuZXdlciB2ZXJzaW9uIGRlY2lkZWQgaXQgc2hvdWxkICJyZWFkIGFuZCBkaXNjYXJkIi4gVGhhdCB3b3VsZCd2ZQogIGZvcmNlZCB1cyB0byBzZW5kIHRoZSB3aG9sZSBQT1NUIChvciBQVVQpIGRhdGEgb25seSB0byBoYXZlIGl0IGRpc2NhcmRlZCBhbmQKICB0aGVuIGJlIGZvcmNlZCB0byBzZW5kIGl0IGFnYWluLiBUbyBhdm9pZCB0aGF0IGh1Z2UgcGVuYWxpdHksIHdlIHN3aXRjaCB0bwogIHVzaW5nIEhFQUQgdW50aWwgd2UgYXJlIGF1dGhlbnRpY2F0ZWQgYW5kIHRoZW4gc2VuZCB0aGUgUE9TVC4KCiAgVGhlIG9ubHkgYWN0dWFsIGRyYXdiYWNrIEkgY2FuIHRoaW5rIG9mIChleGNlcHQgZm9yIHRoZSBvZGQgc2l0ZXMgdGhhdCBtaWdodAogIHRyZWF0IEhFQUQgZGlmZmVyZW50bHkgdGhhbiB0aGV5IHdvdWxkIHRyZWF0IFBPU1QvUFVUIHdoZW4gZ2l2ZW4gdGhlIHNhbWUKICBVUkwpIGlzIHRoYXQgaWYgeW91IGRvIFBPU1Qgd2l0aCBDVVJMQVVUSF9BTlkgc2V0IGFuZCB0aGUgc2l0ZSByZXF1aXJlcyBOTwogIGF1dGhlbnRpY2F0aW9uLCBsaWJjdXJsIHdpbGwgc3RpbGwgdXNlIGEgSEVBRCBpbiBhIGZpcnN0IHJvdW5kIGFuZCB0aGVuIGRvIGEKICBQT1NULgoKICBJZiB5b3UgZG8gYSBIRUFEIG9yIGEgR0VUIG9uIGEgc2l0ZSB1c2luZyBDVVJMQVVUSF9BTlksIGxpYmN1cmwgd2lsbCBzZW5kCiAgYW4gdW4tYXV0aGVudGljYXRlZCByZXF1ZXN0IGF0IG9uY2UsIHdoaWNoIHRoZW4gaXMgdGhlIG9ubHkgcmVxdWVzdCBpZiB0aGUKICBzaXRlIHJlcXVpcmVzIG5vIGF1dGguCgogIEFsYW4gUGluc3RlaW4gaGVscGVkIG1lIHdvcmsgb3V0IHRoZSBwcm90b2NvbCBkZXRhaWxzIGJ5IGZpZ3VyaW5nIG91dCB3aHkKICBsaWJjdXJsIGZhaWxlZCBhbmQgd2hhdCBJSVM2IGV4cGVjdHMuCgotIFRoZSAtLWxpbWl0LXJhdGUgbG9naWMgd2FzIGNvcnJlY3RlZCBhbmQgbm93IGl0IHdvcmtzIGEgbG90IGJldHRlciBmb3IKICBoaWdoZXIgc3BlZWRzLCBzdWNoIGFzICcxMG0nIG9yIHNpbWlsYXIuIFJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzkzMDI0OS4KCi0gSW50cm9kdWNpbmcgY3VybHhfdHZub3coKSBhbmQgY3VybHhfdHZkaWZmKCkgdXNpbmcgdGhlIG5ldyBjdXJseF8qIGZhc2hpb24uCiAgI2luY2x1ZGUgInRpbWV2YWwuaCIgZnJvbSB0aGUgbGliIGRpciB0byBnZXQgdGhlIHByb3RvcyBldGMuICBOb3RlIHRoYXQKICB0aGVzZSBhcmUgTk9UIHBhcnQgb2YgdGhlIGxpYmN1cmwgQVBJLiBUaGUgY3VybCBhcHAgc2ltcGx5IHVzZXMgdGhlIHNhbWUKICBzb3VyY2UgZmlsZXMgYXMgdGhlIGxpYnJhcnkgZG9lcyBhbmQgdGhlcmVmb3JlIHRoZSBmaWxlIG5lZWRzIHRvIGJlIGNvbXBpbGVkCiAgYW5kIGxpbmtlZCB3aXRoIGN1cmwgdG9vLCBub3QganVzdCB3aGVuIGNyZWF0aW5nIGxpYmN1cmwuCgotIGxpYi9zdHJlcnJvci5jIG5vIGxvbmdlciB1c2VzIHN5c19uZXJyIG9uIG5vbi13aW5kb3dzIHBsYXRmb3JtcyBzaW5jZSBpdAogIGlzbid0IHBvcnRhYmxlIGVub3VnaAoKRGFuaWVsICgyIEFwcmlsIDIwMDQpCi0gSW4gdGhlIGN1cmxfc3RybnF1YWwuMyBtYW4gcGFnZSwgd2Ugbm93IHByZXBlbmQgdGhlIG1hbjMgZGlyIHRvIHRoZSBmaWxlCiAgbmFtZSB0byB3b3JrIGJldHRlci4gQXMgcG9pbnRlZCBvdXQgYnkgUm9iaW4gS2F5LgoKLSBBbmRy6XMgR2FyY+1hIHVwZGF0ZWQgdGhlIG1pbmd3IG1ha2VmaWxlcy4KCi0gRGlyayBNYW5za2UgZml4ZWQgYSBwcm9ibGVtIEkgcmVjZW50bHkgYWRkZWQgaW4gdGhlIHByb2dyZXNzIG1ldGVyIGNvZGUgdGhhdAogIGJyb2tlIHN1YnNlY29uZCByZXNvbHV0aW9uIGZvciBDVVJMSU5GT19UT1RBTF9USU1FLiBIZSBhbHNvIHBvaW50ZWQgb3V0IGEKICBtaXN0YWtlIGluIHRoZSBjb2RlIHRoYXQgcHJvZHVjZXMgdGhlIGZpbmFsIHVwZGF0ZSBvZiB0aGUgcHJvZ3Jlc3MgbWV0ZXIKICB0aGF0IHdvdWxkIG9mdGVuIHByZXZlbnQgaXQgZnJvbSBhY3R1YWxseSBiZWluZyB1cGRhdGVkIHRoYXQgZmluYWwgdGltZS4KCkRhbmllbCAoMSBBcHJpbCAyMDA0KQotIERpcmsgTWFuc2tlIGZpeGVkIGEgbWVtb3J5IGxlYWsgdGhhdCBoYXBwZW5lZCB3aGVuIHdlIHVzZSBhcmVzIGZvciBuYW1lCiAgcmVzb2x2ZXMgYW5kIGRlY2lkZXMgdG8gdGltZS1vdXQgYmVmb3JlIGFyZXMgZG9lcyBpdC4gVGhpcyBmaXggdXNlcyB0aGUKICBicmFuZCBuZXcgYXJlc19jYW5jZWwoKSBmdW5jdGlvbiB3aGljaCBpcyBub3QgcHJlc2VudCBpbiBjLWFyZXMgMS4xLjAuCgogIFdoZW4gdG9sZCB0byBlbmFibGUgYXJlcywgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGNoZWNrcyBmb3IgcHJlc2VuY2Ugb2YKICB0aGUgYXJlc19jYW5jZWwgZnVuY3Rpb24gdG8gYWxlcnQgdXNlcnMgaWYgdGhleSBhdHRlbXB0IHRvIHVzZSBhIHRvbyBvbGQKICBjLWFyZXMgbGlicmFyeS4KCkRhbmllbCAoMzEgTWFyY2ggMjAwNCkKLSBSb3kgU2hhbiBmaXhlZCBhIGZsYXcgdGhhdCBwcmV2ZW50ZWQgYXJlcyBuYW1lIHJlc29sdmUgdGltZW91dHMgdG8gb2NjdXIhCgotIERpcmsgTWFuc2tlIGZvdW5kIG91dCB0aGF0IGxpYmN1cmwgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlc29sdmVzIGZhciB0b28KICBlYXN5IHdoZW4gbGliY3VybCB3YXMgYnVpbHQgdG8gdXNlIChjLSlhcmVzIGZvciBuYW1lIHJlc29sdmluZy4KCi0gRnVydGhlciBEaWdlc3QgZml4aW5nIGFuZCBhIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlIDE1MyBub3cgbWFrZXMgbWUgYmVsaWV2ZQogIE1pdHogV2FyaydzIHByb2JsZW1zIGFyZSBmaXhlZC4KCi0gQW5kcmVzIEdhcmNpYSBmaWd1cmVkIG91dCB0aGF0IHRlc3QgY2FzZSA2Mywgd2hpbGUgd29ya2luZywgb25seSBwcm92ZWQgYQogIGZsYXcgaW4gbGliY3VybCdzICdodHRwX3Byb3h5JyBwYXJzZXIgd2hlbiBhIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgaXMKICBwcm92aWRlZC4gVGhlIHVzZXIgbmFtZSB3YXMgbm90IGV4dHJhY3RlZCBwcm9wZXJseSAoYW5kICdodHRwJyB3YXMgYWx3YXlzCiAgdXNlZCBhcyB1c2VyIG5hbWUpLgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzIGluIG91ciBpb2N0bHNvY2tldCgpIHVzYWdlLgoKRGFuaWVsICgzMCBNYXJjaCAyMDA0KQotIEpvZSBIYWxwaW4gZmFjZWQgcHJvYmxlbXMgd2l0aCB0aGUgZ2V0bmFtZWluZm8oKSBhcmd1bWVudCBhaV9mbGFncyBhbmQgdGhlCiAgcGFydGljdWxhciBiaXQgbmFtZWQgJ05JX1dJVEhTQ09QRUlEJyBvbiBTb2xhcmlzIDkgZm9yIEludGVsLiAgSSd2ZSBub3cKICB3cml0dGVuIGEgY29uZmlndXJlIHRlc3QgdGhhdCBjaGVja3MgZm9yIGEgd29ya2luZyBOSV9XSVRIU0NPUEVJRAogIGltcGxlbWVuYXRpb24uIE5vIGNvZGUgdXNlcyB0aGUgcmVzdWx0IGZyb20gdGhpcyB0ZXN0IHlldCwgaXQgaXMgc3RpbGwKICBleHBlcmltZW50YWwuIEphbWVzIENhcmxzb24gd3JvdGUgaW4gY29tcC51bml4LnNvbGFyaXM6ICJJdCdzIGEgYnVnCiAgKDUwMDY2MjMpIC0tIGl0J3Mgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkbid0IGJlIGluIHRoZSBoZWFkZXIgZmlsZS4iCgotIEkgcHJvdmlkZWQgTWl0eiBXYXJrIHdpdGggYSBmaXJzdCBwYXRjaCBpbiBvcmRlciB0byBmaXggbGliY3VybCdzIHByb2JsZW1zCiAgdG8gcmUtbmVnb3RpYXRlIERpZ2VzdCBhdXRoZW50aWNhdGlvbiAod2hlbiAnc3RhbGU9dHJ1ZScgaXMgaW5jbHVkZWQgaW4gdGhlCiAgcmVzcG9uc2UgaGVhZGVyKS4KCi0gUm95IFNoYW4gZGlzY292ZXJlZCB0aGF0IHRoZSBtdWx0aSBpbnRlcmZhY2UgZGlkbid0IHByb3Blcmx5IHRpbWVvdXQgbmFtZQogIGxvb2t1cHMgd2hpY2ggY291bGQgbWFrZSBoYW5kbGVzIGdldCBzdHVjayBpbiB0aGF0IHN0YXRlIGFuZCB0aHVzIG5ldmVyIGdldAogIGNvbXBsZXRlZC4gSSd2ZSBwcm9kdWNlZCBhIGZpcnN0IHRlc3QgcGF0Y2ggdGhhdCBhdHRlbXB0cyB0byBjb3JyZWN0IHRoaXMuCgotIERhdmlkIEJ5cm9uJ3MgcGF0Y2ggd2FzIGFwcHBsaWVkIHRvIG1ha2UgQ1VSTE9QVF9GQUlMT05FUlJPUiB3b3JrIG5pY2VseQogIGV2ZW4gd2l0aCBhdXRoZW50Y2F0aW9ucyBzdWNoIGFzIE5UTE0gb3IgRGlnZXN0IGVuYWJsZWQuIFRlc3QgY2FzZXMgMTUwLCAxNTEKICBhbmQgMTUyIHdlcmUgYWRkZWQgdG8gdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKRGFuaWVsICgyOSBNYXJjaCAyMDA0KQotIEdpc2xlIFZhbmVtIHVwZGF0ZWQgZmlsZXMgZm9yIHRoZSBkamdwcC9NUy1ET1MgYnVpbGQuCgotIEFuZHLpcyBHYXJj7WEgaGVscGVkIG1lIHdvcmsgb3V0IGEgZml4IGZvciB0aGUgcnVudGVzdHMucGwgc2NyaXB0IHRvIG1ha2UKICB0aGUgZmlsZTovLyB0ZXN0cyBydW4gZmluZSB3aGVuIHRlc3RlZCB3aXRoIHRoZSBtaW5ndy1idWlsdCB2ZXJzaW9uIG9mIGN1cmwuCgotIEZpeGVkIGFuIGluY2x1ZGUgaXNzdWUgd2l0aCBuZXRpbmV0L3RjcC5oIG9uIEFJWCwgYmFzZWQgb24gaW5wdXQgYnkgVG9yLgogIFRoaXMgYWxzbyByZXF1aXJlZCBhIG1pbm9yIGZpeCBvZiB0aGUgY29uZmlndXJlIHNjcmlwdC4KCi0gVGhlIHBvc3RpdDIuYyBzb3VyY2UgZXhhbXBsZSB1c2VkIHRoZSB3cm9uZyBzdHJ1Y3QgbmFtZSBmb3IgdGhlIHBvc3QgZGF0YS4KCkRhbmllbCAoMjYgTWFyY2ggMjAwNCkKLSBHaXNsZSBWYW5lbSBpbXByb3ZlZCBJUHY2IHN1cHBvcnQgb24gV2luZG93cyBieSBtYWtpbmcgdGhlIGN1cmwgYnVpbGQgdXNlCiAgdGhlIGNvcnJlY3QgZ2V0YWRkcmluZm8oKSBmdW5jdGlvbi4KCkRhbmllbCAoMjUgTWFyY2ggMjAwNCkKLSBJdCB0dXJuZWQgb3V0IHRoYXQgQUlYLCBkZXNwaXRlIGhhdmluZyBhICJ0aHJlYWQtc2FmZSBsaWJjIiwgZG9lc24ndCBvZmZlcgogIGFsbCB0cmFkaXRpb25hbCBmdW5jdGlvbnMgdGhyZWFkLXNhZmUuIFRoaXMgVVJMIGlzIGluZm9ybWF0aXZlIG9uIHRoaXMKICBzdWJqZWN0OgoKICAgIGh0dHA6Ly9wdWJsaWJuLmJvdWxkZXIuaWJtLmNvbS9kb2NfbGluay9lbl9VUy9hX2RvY19saWIvYWl4cHJnZ2QvIFwKICAgIGdlbnByb2djL3RocmVhZF9xdWlja19yZWYuaHRtCgogIEFzIGEgcmVzdWx0IG9mIHRoaXMsIHdlIG5vdyBjaGVjayBmb3IgdGhyZWUgKl9yKCkgZnVuY3Rpb25zIG9uIHJlY2VudCBBSVgKICB2ZXJzaW9ucyBhcyB3ZWxsIHRoYXQgdGhlIFVSTCBtZW50aW9ucyBhcmVuJ3QgdGhyZWFkLXNhZmUgaW4gQUlYIDUuMS4KCi0gcmVuYW1lZCBjdXJsX3N0cmVycm9yLltjaF0gdG8gc3RyZXJyb3IuW2NoXQoKLSBKb2UgSGFscGluIGFkZGVkIENVUkxPUFRfVENQX05PREVMQVkgYW5kIC0tdGNwLW5vZGVsYXkgdG8gbWFrZSBpdCBwb3NzaWJsZQogIGZvciB1c2VycyB0byBkaXNhYmxlIHRoZSBOYWdsZSBhbGdvcnRoaW0tdXNhZ2UuCgotIFRvciBBcm50c2VuIHByb3ZpZGVkIHNvbWUgaW50ZXJlc3Rpbmcgc3RyZXJyb3JfcigpIGtub3dsZWRnZS4gZ2xpYmMgaGFzIGl0cwogIG93biBBUEkgd2hpY2ggZGlmZmVycyBmcm9tIHRoZSBQT1NJWCBvbmUuIERhbmllbCBhZGp1c3RlZCB0aGUgY29uZmlndXJlCiAgc2NyaXB0IHRvIGRldGVjdCB0aGUgdmVyc2lvbiBpbiB1c2UsIGFuZCB0aGUgY29kZSBub3cgdXNlcyB0aGUgbmV3IGRlZmluZXMKICBhY2NvcmRpbmdseS4KCi0gRml4ZWQgc29tZSBidWlsZCBmbGF3cyB3aXRoIHRoZSBuZXcgbGliL2N1cmxfc3RyZXJyb3IuYyBzb3VyY2UgZmlsZS4KCkRhbmllbCAoMjQgTWFyY2ggMjAwNCkKLSBHaXNsZSBWYW5lbSdzIGZpeCB0byByZXBsYWNlIHRoZSBiYWQgdXNlIG9mIHN0cmVycm9yKCkuIFRoaXMgaW50cm9kdWNlcwogIEN1cmxfc3RyZXJyb3IoKSB0aGF0IGF0dGVtcHRzIHRvIGJlIHRocmVhZC1zYWZlIF9hbmRfIHdvcmtzIG9uIFdpbmRvd3MgdG9vIQoKLSBUb3IgQXJudHNlbiBzcGVsbC1maXhlZCBsb3RzIG9mIGxpYmN1cmwgbWFuIHBhZ2VzLgoKLSBUb3IgQXJudHNlbiBtYWRlIHRlc3RjdXJsLnBsIHdvcmsgd2l0aCBvbGRlciBwZXJsIDUgdmVyc2lvbnMsIGFuZCBEYW5pZWwKICBtYWRlIGl0IG5vdCB1c2UgY2hkaXIgLi4gdG8gZ28gYmFjaywgYXMgdGhhdCBpc24ndCB2ZXJ5IGdvb2Qgd2hlbiB5b3UndmUKICBzZXR1cCBhIHRlc3RkaXIgY29udGFpbmluZyBzeW1saW5rcy4KCi0gQWRkZWQgYSBjaGVjayBmb3Igc3RyZXJyb3JfcigpIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKRGFuaWVsICgyMyBNYXJjaCAyMDA0KQotIEFkZGVkIEdyZWcgSGV3Z2lsbCdzIHRlc3RjdXJsLnBsIHNjcmlwdCB0byBDVlMuIFdlIGhhdmUgbm90IG1vdmVkIG92ZXIgdG8KICB1c2UgdGhpcyBzY3JpcHQgZm9yIHRoZSByZWFsIGRpc3RyaWJ1dGVkIHRlc3RpbmcganVzdCB5ZXQsIGJ1dCBpdCBpcyBvbmx5CiAgYSBtYXR0ZXIgb2YgdGltZS4KCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgY29kZSB0aGF0IG1ha2VzIGN1cmwgcmVwb3J0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UKICBpZiAtLWludGVyZmFjZSBmYWlscyBvbiB3aW5kb3dzLgoKLSBUaGUgcmVndWxhciBwcm9ncmVzcyBtZXRlciBpcyBub3cgZml4ZWQgdG8gbmV2ZXIgd3JhcCBkdWUgdG8gbG9uZyBsaW5lcy4gQWxsCiAgZmllbGRzIGFyZSBub3cgc3RhdGljIHNpemVkLiBJZiB0aGUgdGltZSBpbiB0aGUgdGltZSBmaWVsZHMgZ2V0IGEgdGltZSB2YWx1ZQogIHRoYXQgd291bGQgcmVwcmVzZW50IGEgdGltZSB0aGF0IGlzIDEwMCBob3VycyBvciBtb3JlIChpZiBub3QsIGl0IHJlbWFpbnMKICB1c2luZyBhIEhIOk1NOlNTIGRpc3BsYXkpLCBpdCBzd2l0Y2hlcyBmaXJzdCB0byBhICJOTk5kIE5OaCIgZGlzcGxheSAoZm9yCiAgZGF5cyBhbmQgaG91cnMpIGFuZCBpZiB0aGF0IGlzbid0IGVub3VnaCBpdCBzd2l0Y2hlcyB0byBhICJOTk5kIiBkaXNwbGF5IGlmCiAgaXQgaXMgbW9yZSB0aGFuIDk5OSBkYXlzLgoKICBTZXZlcmFsIG9mIHRoZSBjYWxjdWxhdGlvbnMgd2VyZSBhbHNvIG1vdmVkIHRvIGZpeGVkLXBvaW50IG1hdGggaW5zdGVhZCBvZgogIHVzaW5nIGRvdWJsZXMuCgpEYW5pZWwgKDIyIE1hcmNoIDIwMDQpCi0gR2xlbiBOYWthbXVyYSBub3RpY2VkIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIGRpZG4ndCB3b3JrIGFzIGl0CiAgdXNlZCB0byBkbyBpZiBDVVJMT1BUX05PQk9EWSBpcyBzZXQgVFJVRS4KCi0gS2V2aW4gUm90aCBwYXRjaGVkIHRoZSBjeWd3aW4gcGFja2FnZSBtYWtlZmlsZSBhbmQgUkVBRE1FIHRvIGFkanVzdCB0bwogIG5ldyBjeWd3aW4gcGFja2FnaW5nIGd1aWRlbGluZXMuCgotIEVuYWJsZWQgIk5UIHJlc3BvbnNlcyIgaW4gdGhlIE5UTE0gYXV0aGVudGljYXRpb24uIERvaW5nIHRoaXMgc2ltcGx5IG1lYW5zCiAgdGhhdCB3ZSBwcm92aWRlIGFuIGV4dHJhIGNodW5rIG9mIGRhdGEgaW4gZWFjaCAidHlwZS0zIG1lc3NhZ2UiLiBUaGUgb25seQogIHJlYXNvbiBmb3IgZG9pbmcgdGhpcyBpcyB0aGF0IGl0IHNlZW1zIHRoYXQgdXNpbmcgb25seSB0aGUgIkxhbm1hbmFnZXIgaGFzaCIKICAoYXMgd2UndmUgYmVlbiBkb2luZyB1bnRpbCBub3cpIGRvZXNuJ3Qgc3VwcG9ydCBwYXNzd29yZHMgbG9uZ2VyIHRoYW4gMTQKICBjaGFyYWN0ZXJzIGFuZCBpdCB0dXJucyBvdXQgdGhlcmUgYXJlIHVzZXJzIG91dCB0aGVyZSB3aG8gd2FudCB0byB1c2UKICBsaWJjdXJsIGFuZCBOVExNIHdpdGggc3VjaCBwYXNzd29yZHMhIDstKSBTZXZlbiBOVExNLXJlbGF0ZWQgdGVzdCBjYXNlcyB3ZXJlCiAgdXBkYXRlZCBhY2NvcmRpbmdseS4gTWVudGlvbmVkIGFzIGlzc3VlIDI5IGluIFRPRE8tUkVMRUFTRSwgYnVnIHJlcG9ydAogICM5MTU2MDkKCi0gTW92ZWQgdGhlIGdlbmVyYXRlZCBsaWJjdXJsIHZlcnNpb24gaW5mbyB0byBhIG5ldyBoZWFkZXIgZmlsZSwgbmFtZWQKICBjdXJsL2N1cmx2ZXIuaC4gTm93IGludGVyZXN0ZWQgcGFydGllcyBjYW4gaW5jbHVkZSBPTkxZIHZlcnNpb24gaW5mbywgc2hvdWxkCiAgYW55b25lIHdhbnQgdGhhdCAoYW5kIGl0IHNlZW1zIGF0IGxlYXN0IHNvbWUgd2luZG93cyByZXNvdXJjZSBmaWxlcyB3b3VsZCkuCiAgTWVudGlvbmVkIGFzIGlzc3VlIDI3IGluIFRPRE8tUkVMRUFTRS4KCkRhbmllbCAoMjEgTWFyY2ggMjAwNCkKLSBGaXhlZCB0aGUgcm9vdCBNYWtlZmlsZSB0byB1c2UgdGFicyBmb3IgdGhlIG5ldHdhcmUgdGFyZ2V0LiBH/G50ZXIgS25hdWYKICBwb2ludGVkIHRoaXMgb3V0LgoKLSBNYXJ0eSBLdWhydCdzIFZNUyBjbGVhbnVwCgotIFRob21hcyBTY2h3aW5nZSBtYWRlIGJ1aWxkY29uZiByZWNvZ25pemUgQUNMT0NBTF9GTEFHUyB0byBpbnZva2UgYWNsb2NhbAogIHdpdGggcGFydGljdWxhciBwcmUtZGV0ZXJtaW5lZCBvcHRpb25zLgoKVmVyc2lvbiA3LjExLjEgKDE5IE1hcmNoIDIwMDQpCgpEYW5pZWwgKDE4IE1hcmNoIDIwMDQpCi0gVG9yIEFybnRzZW4gYnJvdWdodCBzb21lIGluZm8gYWJvdXQgU0dJIElSSVg6CgogIElSSVggc3VwcG9ydHMgMyBkaWZmZXJlbnQgZXhlY3V0YWJsZS9vYmplY3QgZm9ybWF0cywgLTMyLCAtbjMyIGFuZCAtNjQuCiAgLW4zMiBpcyBkZWZhdWx0IDMyLWJpdCBmb3JtYXQsIC0zMiBpcyB0aGUgIm9sZCIgMzItYml0IGZvcm1hdCwgYW5kIC02NCBpcwogIHRoZSA2NC1iaXQgZm9ybWF0LiAgTGlicmFyaWVzIGZvciB0aGUgZGlmZmVyZW50IGZvcm1hdHMgYXJlIGluIGxpYiwgbGliMzIKICBhbmQgbGliNjQgcmVzcGVjdGl2ZWx5LgoKICBXZSd2ZSBub3cgYWRqdXN0ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYWRhcHQgdG8gdGhpcyB3aGVuIHNjYW5uaW5nIGZvcgogIDNyZCBwYXJ0eSBsaWJzLCBzdWNoIGFzIE9wZW5TU0wuCgpEYW5pZWwgKDE3IE1hcmNoIDIwMDQpCi0gV2F0eiBwb2ludGVkIG91dCBhIGZldyBtaXNzaW5nIGZpbGVzIGluIHRoZSBNU1ZDIHByb2plY3QgZGVzY3JpcHRpb24gZmlsZS4KCi0gR/xudGVyIEtuYXVmIGJyb3VnaHQgcGF0Y2hlcywgY29kZSBhbmQgbWFrZWZpbGVzIHRvIGJ1aWxkIGN1cmwgb24gTm92ZWxsCiAgTmV0V2FyZS4KCkRhbmllbCAoMTUgTWFyY2ggMjAwNCkKLSBMb3RzIG9mIGxpYmN1cmwgbWFuIHBhZ2VzIHdlcmUgdXBkYXRlZCB0byBjb250YWluIHJlZmVyZW5jZXMgdG8gb3RoZXIgbWFuCiAgcGFnZXMgdGhlIHJlY29nbml6ZWQgd2F5IHNvIHRoYXQgdGhleSBhcHBlYXIgYXMgbmljZSBoeXBlcmxpbmtzIGluIHRoZSBIVE1MCiAgdmVyc2lvbnMuCgotIGJ1aWxkY29uZiBub3cgY2hlY2tzIHRoZSBtNCB2ZXJzaW9uIHRvbywgc2luY2UgYXV0b2NvbmYgcmVxdWlyZXMgYSBHTlUgbTQKICB2ZXJzaW9uIHRvIGJ1aWxkIHByb3BlciBjb25maWd1cmUgc2NyaXB0cy4KCkRhbmllbCAoMTIgTWFyY2ggMjAwNCkKLSBBZGRlZCBDVVJMT1BUX1BPU1RGSUVMRFNJWkVfTEFSR0UsIHRoZSBsYXJnZSBmaWxlIHZlcnNpb24gb2YKICBDVVJMT1BUX1BPU1RGSUVMRFNJWkUgdG8gYWxsb3cgUE9TVHMgbGFyZ2VyIHRoYW4gMkdCLgoKLSBEYXZpZCBCeXJvbiBmaXhlZCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGNhc2UvY3Jhc2guCgpEYW5pZWwgKDEwIE1hcmNoIDIwMDQpCi0gSmVmZiBMYXdzb24gZml4ZWQgdGhlIFNTTCBjb25uZWN0aW9uIHRvIGRlYWwgd2l0aCByZWNlaXZlZCBzaWduYWxzIGR1cmluZyB0aGUKICBjb25uZWN0LgoKLSBDaGFuZ2VkIHRoZSBPUyBzdHJpbmcgZm9yIHdpbjMyIHRvIGJlY29tZSAiaTM4Ni1wYy13aW4zMiIuCgpEYW5pZWwgKDkgTWFyY2ggMjAwNCkKLSBDaGFuZ2VkIHRoZSBpbnRlcm5hbHMgdG8gdXNlIGN1cmxfc29ja2V0X3QgZm9yIHNvY2tldCB2YXJpYWJsZSB0eXBlLiBUaGlzCiAgc2hvdWxkIGVuYWJsZSB1cyB0byBidWlsZCB3aXRoIGxlc3Mgd2FybmluZ3Mgb24gV2luZG93cywgd2hlcmUgU09DS0VUIGlzCiAgdXNlZCB3aGljaCBpcyBhbiB1bnNpZ25lZCBpbnQsIHdoaWxlIG1vc3Qgb3RoZXIgcGxhdGZvcm1zIHVzZSBhIG1lcmUgaW50LgoKLSBNb2RpZmllZCBsaWIvY29uZmlnLXdpbjMyLmggdG8gYnVpbGQgZmluZSBvbiBNU1ZDIGFnYWluLgoKVmVyc2lvbiA3LjExLjEtcHJlMSAoOCBNYXJjaCAyMDA0KQoKRGFuaWVsICg4IE1hcmNoIDIwMDQpCi0gTWlub3IgZml4IHRvIG1ha2UgY3VybCBDVVJMX1ZFUlNJT05fTEFSR0VGSUxFIGlzIG9ubHkgc2V0IGlmIGN1cmxfb2ZmX3QgaXMKICBsYXJnZXIgdGhhbiA0IGJ5dGVzLgoKRGFuaWVsICg0IE1hcmNoIDIwMDQpCi0gSW1wcm92ZWQgUFVUL1BPU1Qgd2l0aCBOVExNL0RpZ2VzdCBhdXRoZW50aWNhdGlvbiwgdGhlIHNvIGNhbGxlZCBpc3N1ZSAxMi4KCi0gTW9kaWZpZWQgdGhlIHRlc3QgSFRUUCBzZXJ2ZXIgYSBsb3QgdG8gd29yayB3aXRoIHRoZSB1cGNvbWluZyBjaGFuZ2VzIGZvcgogIFBVVC9QT1NUIHdpdGggTlRMTS9EaWdlc3QgYXV0aGVudGljYXRpb24gKGxpa2UgdGVzdCBjYXNlIDg4KS4gQWRkZWQgQW5kculzCiAgR2FyY+1hJ3Mgd2luMzItY2hhbmdlcy4gSW1wcm92ZWQgdGhlIGxvZ2dpbmcuCgotIEZpeGVkIHRoZSBmaWxlOi1yZWxhdGVkIHByb2dyZXNzL2dldGluZm8gc3R1ZmYgYSBiaXQgbW9yZS4KCkRhbmllbCAoNCBNYXJjaCAyMDA0KQotIEkgY29ycmVjdGVkIGEgcHJvYmxlbSB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2hlbiBmb2xsb3dpbmcgYSBMb2NhdGlvbjoKICBoZWFkZXIgb3Igd2hlbiBkb2luZyBtdWx0aXBsZS1yZXF1ZXN0IGF1dGhlbnRpY2F0aW9ucy4gQSBzdWJzZXF1ZW50IHJlcXVlc3QKICBjb3VsZCBlcnJvbmVvdXNseSByZS11c2UgYSBwcmV2aW91cyBjb25uZWN0aW9uIHRoYXQgd2FzIHNlbnQgd2l0aAogIENvbm5lY3Rpb246IGNsb3NlLiBDaHJpc3RvcGhlciBSLiBQYWxtZXIgcmVwb3J0ZWQuCgotIEFuZHLpcyBHYXJj7WEgcGF0Y2hlZCBjdXJsIHRvIHByZXZlbnQgd2FybmluZ3Mgd2hpbGUgY29tcGlsaW5nIHdpdGggbWluZ3csCiAgbWFpbmx5IGJlY2F1c2UgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGhhdmUgYm90aCBXSU4zMiBhbmQgSEFWRV9DT05GSUdfSAogIGRlZmluZWQuCgotIFdoZW4gdHJhbnNmZXJyaW5nIGZpbGVzIGZyb20gYSBmaWxlOiBVUkwsIHRoZSBwcm9ncmVzcyBtZXRlciBhbmQgb3RoZXIKICB0cmFuc2ZlciBtZXRyaWNzIHdlcmUgbm90IHVwZGF0ZWQgcHJvcGVybHkuCgotIERhdmlkIEJ5cm9uIHByb3ZpZGVkIGEgInZlcnNpb24gcmVzb3VyY2UiIGZpbGUgdG8gdGhlIGN1cmwgZXhlY3V0YWJsZSBmb3IKICB0aGUgd2luZG93cyBidWlsZHMuCgpEYW5pZWwgKDMgTWFyY2ggMjAwNCkKLSBEYXZpZCBCeXJvbidzIHdvcmsgb24gbWFraW5nIGxpYmN1cmwgb25seSByZXF1aXJlIHdpbnNvY2sgMS4xIG9uIFdpbmRvd3MKICBtYWNoaW5lcy4KCi0gTW9yZSB2YXJpYWJsZSBjbGVhbnVwcyBiYXNlZCBvbiBjb21waWxlciB3YXJuaW5ncyBnZW5lcmF0ZWQgYnkgVG9yIEFybnRzZW4ncwogIGF1dG9idWlsZHMgd2l0aCBNSVBTUHJvLgoKLSBKb2UgSGFscGluIGhlbHBlZCB1cyBmaXggc29tZSBwZWRhbnRpYyBjb21waWxlciB3YXJuaW5ncyBvbiBGcmVlQlNELgoKLSBBcHBsaWVkIFRvbSBCYXRlcycgcGF0Y2ggdG8gYnVpbGQgb24gbnNyLXRhbmRlbS1uc2suCgotIERhbiBGYW5kcmljaCBjb3JyZWN0ZWQgc29tZSBmbGF3cyBpbiB0aGUgY29uZmlndXJlIEdTUyBkZXRlY3Rpb24uCgpEYW5pZWwgKDIgTWFyY2ggMjAwNCkKLSBGaXhlZCB0aGUgbGliY3VybCBjb2RlIHRvIHVzZSBGT1JNQVRfT0ZGX1QgZm9yIHByaW50ZigpIGZvcm1hdHRpbmcKICBjdXJsX29mZl90IHR5cGVzIGludGVybmFsbHkuCgpEYW5pZWwgKDEgTWFyY2ggMjAwNCkKLSBBZGRlZCBDVVJMX1ZFUlNJT05fTEFSR0VGSUxFIGFzIGEgZmVhdHVyZS1iaXQgaW4gdGhlIGN1cmxfdmVyc2lvbl9pbmZvKCkKICByZXNwb25zZSwgdGhhdCBzaWduYWxzIGlmIHRoaXMgbGliY3VybCBzdXBwb3J0cyA+MkdCIGZpbGVzLiBjdXJsIC1WIG5vdwogIG91dHB1dHMgJ0xhcmdlZmlsZScgaW4gdGhlIEZlYXR1cmVzOiBmaWVsZCBpZiB0aGlzIGlzIHRoZSBjYXNlLiBNb3N0IHN5c3RlbXMKICBhcmUgbGlrZWx5IHRvIHN1cHBvcnQgdGhpcy4KCi0gV2Ugb2ZmZXIgYSBDVVJMX0ZPUk1BVF9PRkZfVCBkZWZpbmUgaW4gdGhlIHB1YmxpYyBoZWFkZXIsIHdoaWNoIGNhbiBiZSB1c2VkCiAgdG8gcHJpbnRmKCkgY3VybF9vZmZfdCB2YXJpYWJsZXMuIFdlIGFsc28gbW9kaWZpZWQgdGhlIGxpYmN1cmwgc291cmNlcyB0bwogIHVzZSB0aGlzIGRlZmluZSBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyAlT2QgYXBwcm9hY2ggKGFsdGhvdWdoIEkndmUgbGVmdCB0aGUKICBPLWZsYWcgZnVuY3Rpb25hbCBpbiB0aGUgY29kZSkuIFRoaXMgc2hvdWxkIGFsc28gcHJldmVudCBjb21waWxlcnMgdG8gd2FybgogIG9uIHRoZSBob21lLWdyb3duIG9wdGlvbi4KCi0gRml4ZWQgdGhlIHJlc3VtZS1jaGVjayBjb2RlIHRvIHRlc3QgZm9yIGEgd29ya2luZyByZXN1bWUgYXQgdGhlIGVuZCBvZiB0aGUKICBoZWFkZXJzIGFuZCBub3QgYXQgdGhlIGZpcnN0IGJvZHktYnl0ZS4KCi0gQ1VSTE9QVF9ETlNfVVNFX0dMT0JBTF9DQUNIRSBpcyBub3cgY29uc2lkZXJlZCBvYnNvbGV0ZS4gU3RvcCB1c2luZyBpdC4gSWYKICB5b3UgbmVlZCBhIGdsb2JhbCBETlMgY2FjaGUgZm9yIHdoYXRldmVyIHJlYXNvbiwgdXNlIHRoZSBzaGFyZSBpbnRlcmZhY2UgYW5kCiAgeW91J2xsIGdldCBhIGdsb2JhbCBjYWNoZSB0aGF0IHdvcmtzIHRoZSB3YXkgaXQgc2hvdWxkIHdvcmsuIFlvdSBjYW4gZXZlbgogIGhhdmUgYW55IG51bWJlciBvZiBnbG9iYWwgY2FjaGVzLCBhbGwgYXQgeW91ciBjb21tYW5kLiBUaGlzIGlzIG5vdyBhbHNvCiAgbWVudGlvbmVkIGluIHRoZSBkb2NzLgoKLSBNYWRlIHRoZSAqcHJpbnRmIGNvZGUgc3VwcG9ydCB0aGUgei1mbGFnIHRvIGVuYWJsZSBzaXplX3QgcHJpbnRmKCkgaW4gYQogIG1hbm5lciBzaW1pbGFyIHRvIGhvdyBnbGliYyBhbGxvd3MgaXQuIFRvIG1ha2UgcHJpbnRmaW5nIG9mIHRoaXMgd29yayBvbgogIHBsYXRmb3JtcyB3aXRoIDY0Yml0IHNpemVfdCBhbmQgMzJiaXQgaW50cy4gSWYgdGhlcmUgZXZlbiBhcmUgYW55ISA7LSkKCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIGRpc2NvdmVyZWQgdGhhdCBpZiB5b3UgQ1VSTE9QVF9GUkVTSF9DT05ORUNUIGFuZAogIENVUkxBVVRIX05UTE0gKG9yIENVUkxBVVRIX0FOWSBhbmQgbGliY3VybCB0aGVuIHBpY2tlZCBOVExNKSwgbGliY3VybCB3b3VsZAogIGxvb3Agd2l0aG91dCBzdWNjZWVkaW5nIHRvIGF1dGhlbnRpY2F0ZSBkdWUgdG8gdGhlIG5ldyBjb25uZWN0aW9uIHRoYXQgd2FzCiAgbWFkZSBmb3IgYWxsIHJvdW5kLXRyaXBzIGluIHRoZSBhdXRoZW50aWNhdGlvbi4gTm93LCB0aGUgRlJFU0hfQ09OTkVDVCBpcwogIHJlbWFkZSB0byBvbmx5IG1hdHRlciBmb3IgdGhlIGZpcnN0IGNvbm5lY3Rpb24gbWFkZSB3aXRoIGN1cmxfZWFzeV9wZXJmb3JtKCkKICBhbmQgYWxsIHRoZSByZXN0IHRoYXQgbWlnaHQgZm9sbG93IGR1ZSB0byBGT0xMT1dMT0NBVElPTiBvciBIVFRQCiAgYXV0aGVudGljYXRpb24gYXJlIG5vdyBpZ25vcmluZyB0aGF0IG9wdGlvbi4KCi0gQWRqdXN0ZWQgdGhlIFFVSVQgY29kZSBzbGlnaHRseSBzaW5jZSBpdCBjb3VsZCBjb3JlLWR1bXAuCgotIENvcnJlY3RlZCB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgdG8gcHJvdmlkZSBhIGNvcnJlY3Qgc2l6ZSB0byB0aGUKICAndmVyaWZpZWRzZXJ2ZXInIHJlcXVlc3QuCgpEYW5pZWwgKDI3IEZlYnJ1YXJ5IDIwMDQpCi0gSm9lIEhhbHBpbiBtYWRlIHRoZSBGVFAgY29kZSBzZW5kIFFVSVQgb24gdGhlIGNvbnRyb2wgY29ubmVjdGlvbiBiZWZvcmUKICBkaXNjb25uZWN0aW5nIHRoZSBUQ1AgY29ubmVjdGlvbi4gVGhpcyBpcyB3aGF0IGdvb2QtYmVoYXZpbmcgZnRwIGNsaWVudHMKICBzaG91bGQgZG8uCgpEYW5pZWwgKDI2IEZlYnJ1YXJ5IDIwMDQpCi0gRGF2aWQgQnlyb24gdXBkYXRlZCBzZXZlcmFsIGZpbGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIE1TVkMgNi4gSGUKICBhbHNvIGFkZGVkIHRoZSAnYnVpbGRjb25mLmJhdCcgdGhhdCB3b3JrcyBsaWtlIHRoZSAnYnVpbGRjb25mICsgY29uZmlndXJlJwogIGNvbWJvIGRvZXMgb24gdW5peGVzLgoKLSBHaXNsZSBWYW5lbSBtYWRlIHRoZSBtZW1kZWJ1ZyBzdHVmZiBzdXBwb3J0IGNhbGxvYygpIGFzIHdlbGwuCgotIFRvciBBcm50c2VuIHBvaW50ZWQgb3V0IHRoYXQgdGVzdGN1cmwuc2ggbmVlZGVkIHRvIHJlbW92ZSB0aGUgZ2VuZXJhdGVkCiAgZmlsZXMgaW4gb3JkZXIgdG8gaGF2ZSB0aGVtIHJlLWdlbmVyYXRlZCBpbiBlYWNoIGJ1aWxkLgoKLSBBbmR5IFNlcnBhIGZvdW5kIG91dCB0aGF0IHRoZSBzaGFyZSBpbnRlcmZhY2UgZGlkIG5vdCBlbmpveSBsaWZlIHdoZW4gbm90CiAgaGF2aW5nIHRoZSBsb2NrIGFuZCB1bmxvY2sgY2FsbGJhY2tzIHNldCwgZXZlbiB0aG91Z2ggZG9jdW1lbnRlZCB0byBiZQogIE9LLiBJdCBzdGlsbCBpcyBPSywgYW5kIG5vdyB0aGUgY29kZSB3b24ndCBzZWdmYXVsdCBhbnltb3JlIQoKRGFuaWVsICgyNSBGZWJydWFyeSAyMDA0KQotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgR3JlZyBIZXdnaWxsIEkgbW9kaWZpZWQgaG93IGxvbmcgbG9uZyBpcyB1c2VkIGluIHRoZQogIG1wcmludGYgY29kZSwgYXMgd2UgY2FuIHVzZSBhIDY0Yml0IHR5cGUgd2l0aCBNU1ZDIHRoYXQgaXMgYSBsb25nIGxvbmcKICBlcXVpdmFsZW50LiBUaGlzIGNvcnJlY3RzIHNvbWUgd2VpcmQgbGFyZ2UgZmlsZSBiZWhhdmlvcnMgb24gd2luZG93cy4KCi0gVG9yIEFybnRzZW4gaGVscGVkIG1lIHdvcmsgb3V0IC0tZW5hYmxlLWRlYnVnIHRvIHdvcmsgYmV0dGVyIHdpdGggZGlmZmVyZW50CiAgdmVyc2lvbnMgb2YgdGhlIGdjYyBhbmQgaWNjIGNvbXBpbGVycy4KCi0gQWRkZWQgQ1VSTE9QVF9TSEFSRSB0byB0aGUgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlLgoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDA0KQotIEFwcGxpZWQgdGhlIGZpbmFsIHBpZWNlcyBvZiBHaXNsZSBWYW5lbSdzIHBhdGNoIHRoYXQgYnJpbmdzIGEgd29ya2luZyBuYW1lCiAgcmVzb2x2ZSB0aW1lb3V0IHRvIHRoZSB3aW5kb3dzIHZlcnNpb25zIG9mIGN1cmwhCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDQpCi0gRGF2aWQgQnlyb24ncyBmaXggdG8gYWxsb3cgdGhlIHNwZWVkLWxpbWl0IGxvZ2ljIHdvcmsgZXZlbiBpZiB5b3Ugc2V0CiAgbGltaXQtcmF0ZS4gSXQgZG9lcyB3b3JrIG9uIHRoZSBleHBlbnNlIG9mIHRoZSByYXRlIGxpbWl0ZXIuCgpEYW5pZWwgKDIwIEZlYnJ1YXJ5IDIwMDQpCi0gY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnIHdpdGggZ2NjIG5vdyBhbHNvIHRyaWVzIHRvIGRldGVjdCB0aGUgaWNjIGNvbXBpbGVyCiAgKHdoaWNoIHNvbWVob3cgZ2V0cyB0cmVhdGVkIGFzIGlmIGl0IGlzIGEgZ2NjKSB0byBzdG9wIHVzaW5nIGFsbCB0aGUgZ2NjCiAgb3B0aW9ucyB3aXRoIGl0LCBhbmQgd2UgYWxzbyBwcm92aWRlIC1pc3lzdGVtIG9wdGlvbnMgZm9yIGVhY2ggZXh0cmEgLUkKICBvcHRpb24gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaGFzIGZpZ3VyZWQgb3V0IChmb3IgT3BlblNTTCwga2VyYmVyb3MsIHpsaWIsCiAgSGVpbWRhbCBldGMpLiBUaGlzIG9mIGNvdXJzZSB0byBwcmV2ZW50IHdhcm5pbmdzIG9uIGhlYWRlcnMgd2UgZG9uJ3QgaGF2ZQogIGNvbnRyb2wgb2YuCgpEYW5pZWwgKDE5IEZlYnJ1YXJ5IDIwMDQpCi0gRG91ZyBQb3J0ZXIgbWFkZSBsaWJjdXJsIHVzZSB0aGUgSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBiZWZvcmUgdGhlCiAgZ2V0cHd1aWQgcmVzdWx0cyB3aGVuIGxvb2tpbmcgZm9yIC5uZXRyYyBmaWxlcy4KCi0gSWYgJ2NvbmZpZ3VyZSAtLWVuYWJsZS1kZWJ1ZycgaXMgdXNlZCB3aXRoIGdjYywgaXQgbm93IGNoZWNrcyB3aGljaCBnY2MKICB2ZXJzaW9uIGl0IGlzIGFuZCB1c2VzIGFzIHBpY2t5IGNvbXBpbGVyIG9wdGlvbnMgYXMgcG9zc2libGUgZm9yIHRoZQogIHBhcnRpY3VsYXIgdmVyc2lvbi4KCi0gQ29kZSB0aGF0IGNhbiBiZSB1c2VkIGluIGJvdGggdGhlIGxpYiBhbmQgaW4gdGhlIGN1cmwgYXBwIGlzIG5vdyBtYWRlIHRvIHVzZQogIHRoZSBjdXJseF8gcHJlZml4LiBUaGUgZmlyc3QgZnVuY3Rpb24gdG8gYmUgYXZhaWxhYmxlIGxpa2UgdGhpcyBpcyB0aGUKICBjdXJseF9zdHJ0b2xsKCkgZnVuY3Rpb24uIFRoaXMgaXMgbWFkZSB0byBhbGxvdyB0aGUgYXBwIHRvIHVzZSBleGlzdGluZyBjb2RlLAogIGJ1dCB3aXRob3V0IHBvbGx1dGluZyB0aGUgbGliY3VybCBBUEkuIEZ1cnRoZXIgZXhwbGFuYXRpb25zIHBvc3RlZCBoZXJlOgoKICAgIGh0dHBzOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDQtMDIvMDIxNS5odG1sCgpEYW5pZWwgKDE4IEZlYnJ1YXJ5IDIwMDQpCi0gRml4ZWQgYnVpbGRjb25mIHRvIG5vdCB1c2UgIndoaWNoIiBhcyBBSVggYW5kIFRydTY0IGhhdmUgd2hhdCBoYXZlIGJlZW4KICByZWZlcnJlZCB0byBhcyAiaG9ycmlibHkgYnJva2VuICd3aGljaCcgcHJvZ3JhbXMiLgoKLSBNYWRlIHN1cmUgZG5zIGNhY2hlIHRpbWVvdXQgc2V0IHRvIC0xIHJlYWxseSBtZWFucyBjYWNoaW5nIGZvcmV2ZXIuCgpEYW5pZWwgKDE3IEZlYnJ1YXJ5IDIwMDQpCi0gTWFkZSBpdCBwb3NzaWJseSB0byBidWlsZCBjLWFyZXMgd2l0aCB0aGUgbGliY3VybCBtZW1kZWJ1ZyBzeXN0ZW0gdG8gYmV0dGVyCiAgdHJhY2sgbWVtb3J5LgoKRGFuaWVsICgxNiBGZWJydWFyeSAyMDA0KQotIFdoZW4gdXNpbmcgYXJlcywgd2Ugbm93IGluaXRpYWxpemUgdGhlIGFyZXMgJ2NoYW5uZWwnIGluIGN1cmxfZWFzeV9pbml0KCkKICBhbmQgcmUtdXNlIHRoYXQgc2FtZSBoYW5kbGUgZHVyaW5nIHRoZSBlbnRpcmUgY3VybCBoYW5kbGUncyBsaWZlLXRpbWUuIEl0CiAgaW1wcm92ZXMgcGVyZm9ybWFuY2UuCgotIEZpeGVkIGEgcHJvYmxlbSB3aGVuIGRpc3BsYXlpbmcgdmVyYm9zZSBmb3IgSVB2Ni1lbmFibGVkIGxpYmN1cmxzIGFuZAogIHJlLXVzZWQgY29ubmVjdGlvbnMuIFByb2JsZW0gcmVwb3J0ZWQgYW5kIGZpeCB2ZXJpZmllZCBieSBHcmlnb3J5IEVudGluLgoKLSBKZWZmIExhd3NvbiBmaXhlZCB0aGUgdmVyc2lvbi1jaGVjayBpbiB0aGUgU09DS1M1IGNvZGUuCgpEYW5pZWwgKDE1IEZlYnJ1YXJ5IDIwMDQpCi0gRml4ZWQgYSBjYXNlIHdoZXJlIGEgaG9zdCBjYWNoZSBlbnRyeSB3YXMgbm90IGZsYWdnZWQgaW4tdXNlIHByb3Blcmx5IHdoZW4gYQogIGNhY2hlZCBlbnRyeSB3YXMgdXNlZC4KCi0gQW5kculzIEdhcmPtYSdzIHBhdGNoIHRoYXQgY2hlY2tzIGZvciB3aW5tbSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCB3YXMKICBhcHBsaWVkLgoKRGFuaWVsICgxMyBGZWJydWFyeSAyMDA0KQotIEJlbiBHcmVlYXIncyBTT19CSU5EVE9ERVZJQ0UgcGF0Y2ggZm9yIHRoZSBiaW5kaW5nIG9mIHRoZSBsb2NhbCBlbmQgdG8gYQogIHNwZWNpZmljIG5ldHdvcmsgaW50ZXJmYWNlLgoKLSBHcmVnIEhld2dpbGwgZm91bmQgb3V0IHRoYXQgdGhlIHZhcmlhYmxlIGhvbGRpbmcgJ2NvbnRlbnRsZW5ndGgnIHdhc24ndCBiaWcKICBlbm91Z2ggdG8gaG9sZCBhIGxhcmdlIGZpbGUhCgotIFRvciBBcm50c2VuIGZpeGVkIGEgNjRiaXQtcmVsYXRlZCBwcm9ibGVtIGluIGRhdGUtcmVsYXRlZCBjb2RlIGluIHRoZSBmdHAKICBkZXBhcnRtZW50LCBhbmQgdGhlcmUgd2FzIGFub3RoZXIgcG90ZW50aWFsIHByb2JsZW0gaW4gdGhlIG5hbWUgcmVzb2x2ZSBjb2RlCiAgdG9vLgoKRGFuaWVsICgxMSBGZWJydWFyeSAyMDA0KQotIFJlbW92ZWQgYSBmZXcgdmFyaWFibGVzIHRoYXQgd2VyZSBvbmx5IHNldCBidXQgbmV2ZXIgdXNlZCwgYXMgc29tZSBjb21waWxlcnMKICB3YXJuIGFib3V0IHRoYXQgYW5kIHdlIGRvIG5vdCBsaWtlIGNvbXBpbGVyIHdhcm5pbmdzIQoKLSBSZW1vdmVkIHRoZSBuZWVkIGZvciBzeW1saW5rcyBpbiB0aGUgdGVzdHMvZGF0YSBkaXJlY3RvcnkgaWYgY3VybCBpcyBidWlsdAogIG91dHNpZGUgb2YgdGhlIHNvdXJjZSBkaXJlY3RvcnkgYW5kIHRoZSAnbWFrZSB0ZXN0JyBpcyB1c2VkLiBUaGlzIHdhcyBkb25lCiAgYnkgcHJvdmlkaW5nIGEgInNvdXJjZSBkaXIgcGF0aCIgdG8gdGhlIHNjcmlwdHMvc2VydmVycy4KCi0gTm93LCBpZiB0aGUgY29uZmlndXJlIHNjcmlwdCBjYW4ndCBmaW5kIGFuIG5yb2ZmIHRvb2wgb3IgYW4gb3B0aW9uIHRvIG5yb2ZmCiAgdG8gdXNlIHRvIGNvbnZlcnQgbWFuIHBhZ2VzIHdpdGgsIGl0IHdpbGwgY29tcGxldGVseSBzd2l0Y2ggb2ZmIHRoZSBidWlsdC1pbgogIG1hbnVhbC4KCi0gJ2NvbmZpZ3VyZSAtLWRpc2FibGUtbWFudWFsJyBjb21wbGV0ZWx5IGRpc2FibGVzIHRoZSBidWlsdC1pbiBtYW51YWwgZnJvbQogIHRoZSBjdXJsIGNvbW1hbmQgdG9vbC4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQgYSBtaW5vciBzb3VyY2UgZWRpdCwgYW5kIG5vdwogIGhlIGhhcyBtYW5hZ2VkIHRvIGdldCBtc3lzL21pbmd3IHRvIHJ1biBjb25maWd1cmUgYW5kIHRoZW4gYnVpbGQhCgpEYW5pZWwgKDkgRmVicnVhcnkgMjAwNCkKLSBUaGUgZGVmYXVsdCBIVFRQIEFjY2VwdDogaGVhZGVyIHdhcyBtb2RpZmllZCB0byB0aGUgbXVjaCBzaW1wbGVyCiAgIkFjY2VwdDogKi8qIi4KCi0gUCBSIFNjaGFmZm5lciB1cGRhdGVkIHRoZSBjdXJsLXNzbCBzcGVjIGZpbGUgZm9yIFJQTXMuCgotIERvbWluaWNrIE1lZ2xpbyBicm91Z2h0IGxvdHMgb2YgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHNoYXJlIGludGVyZmFjZSdzIG1hbgogIHBhZ2VzIHRoYXQgd2VyZSBwcmV2aW91c2x5IG1pc3NpbmcuCgotIFRvciBBcm50c2VuIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyBsaWJjdXJsIHdvcmstYXJvdW5kIGEgYnVnIGluIHRoZQogIEFJWDUgaW1wbGVtZW50YXRpb24gb2YgZ2V0YWRkcmluZm8oKS4gVGhpcyBtYWtlcyB0aGUgRlRQIFBPUlQgc3R1ZmYgd29yayBvbgogIElQdjYtZW5hYmxlZCBBSVggYnVpbGRzLgoKLSBLZW4gUmFzdGF0dGVyIHByb3ZpZGVkIHBvcnRhYmlsaXR5IGZpeGVzIGZvciB0aGUgY3VybGd0ay5jIGV4YW1wbGUsIGFuZCBub3cKICBpdCBydW5zIG9uIHdpbmRvd3Mgd2l0aCBHVEsgYXMgd2VsbCEKCkRhbmllbCAoNiBGZWJydWFyeSAyMDA0KQotIEFuZHLpcyBHYXJj7WEgbWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBmaW5kIGdldGhvc3RieW5hbWUoKSBmaW5lIHdoZW4gcnVuCiAgd2l0aCBtaW5ndyBvbiB3aW5kb3dzLgoKLSBNb2RpZmllZCB0aGUgbGRhcCBjb2RlIHRvIHVzZSBwcm9wZXIgZnVuY3Rpb24gcG9pbnRlcnMgYWxsIG92ZXIgKGluc3RlYWQgb2YKICBtaXhlZCBkYXRhIGFuZCBmdW5jdGlvbiBwb2ludGVycykgdG8gd29yay1hcm91bmQgdGhlIHBpY2t5IE1JUFNQcm8gY29tcGlsZXIKICB3YXJuaW5ncy4KCi0gQSBjdXN0b20gSG9zdDogaGVhZGVyIGlzIG9ubHkgY29uc2lkZXJlZCBpZiB0aGUgcmVxdWVzdCBpcyBub3QgbWFkZSBieQogIGZvbGxvd2luZyBhIGxvY2F0aW9uLiBBZnRlciBkaXNjdXNzaW9ucyB3aXRoIFRpbSBCYWtlci4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDA0KQotIFRoZSBsaWJ6IHBhcnQgb2YgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IG9ubHkgc2V0IHRoZSB0d28gbGliei1yZWxhdGVkCiAgZGVmaW5lIEhBVkVfWkxJQl9IIGFuZCBIQVZFX0xJQlogaWYgYm90aCB0aGUgbGliIGFuZCB0aGUgaGVhZGVyIGlzIGZvdW5kLgogIElmIG9uZSBpcyBtaXNzaW5nLCBub25lIG9mIHRoZSBkZWZpbmVzIGlzIHNldC4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCB0aGUgTWluZ3cgbWFrZWZpbGVzLgoKLSBMZW4gS3JhdXNlIHJlcG9ydGVkIHRoYXQgY3VybCA3LjkuWCBjb3VsZCBkbyB1cGxvYWRpbmcgZnJvbSBzdGRpbiB3aXRob3V0CiAgZG9pbmcgY2h1bmtlZCBlbmNvZGluZywgd2hpY2ggY3VycmVudCBjdXJsIGNhbm5vdCBkbyBldmVuIGlmIHlvdSBkaXNhYmxlCiAgdGhlIHRyYW5zZmVyLWVuY29kaW5nIGNodW5rZWQgaGVhZGVyLiBOb3cgaXQgY2FuIGFnYWluLCBhbmQgdGVzdCBjYXNlIDk4CiAgdmVyaWZpZXMgdGhpcyBmdW5jdGlvbmFsaXR5LgoKLSBUb3IgQXJudHNlbiBmaXhlZCBhIHdlaXJkIGdldGFkZHJpbmZvKCkgdXNhZ2UgaW4gdGhlIEZUUCBjb2RlLCBwcmV2ZW50aW5nCiAgdGhlIElQdjYtY29kZSBmb3IgUE9SVCB3b3JrIG9uIEFJWCA1LjIuIFdlIG5vdyBhbHNvIHByb3ZpZGUgKGJldHRlcikgZXJyb3IKICBtZXNzYWdlcyB3aGVuIGJhaWxpbmcgb3V0IGluIHRoZSB0aGF0IGZ1bmN0aW9uLgoKLSBUb3IgQXJudHNlbiBub3cgcHJvdmlkZXMgQUlYIGFuZCBJUklYICh1c2luZyBnY2MsIHhsYyBhbmQgdGhlIE1JUFNQcm8KICBjb21waWxlcnMpIGF1dG9tYXRlZCBidWlsZCBsb2dzIChodHRwczovL2N1cmwuaGF4eC5zZS9hdXRvLykgYW5kIHdlJ3ZlIGZpeGVkCiAgbnVtZXJvdXMgbWlub3IgcXVpcmtzIHRvIG1ha2UgbGVzcyB3YXJuaW5ncyBhcHBlYXIuCgpEYW5pZWwgKDQgRmVicnVhcnkgMjAwNCkKLSBCYXNlZCBvbiBhIHBhdGNoIGJ5IEdpbGFkLCB3ZSBub3cgdXNlIHRoZSBjdXN0b20gdGltZW91dHMgd2hlbiB3YWl0aW5nIGZvciBhCiAgc2VydmVyIHRvIGNvbm5lY3Qgd2hlbiB1c2luZyBGVFAgUE9SVC4gUHJldmlvdXNseSB3ZSBhbHdheXMgd2FpdGVkIDEwCiAgc2Vjb25kcywgbm8gbW9yZSBubyBsZXNzLiBXZSBub3cgYWxzbyBjaGFuZ2VkIHRoZSBkZWZhdWx0IChpZiBubyB0aW1lb3V0IGlzCiAgc2V0KSB0byB3YWl0IDYwIHNlY29uZHMgZm9yIHRoZSBjb25uZWN0IGJlZm9yZSB3ZSBmYWlsLgoKRGFuaWVsICgzIEZlYnJ1YXJ5IDIwMDQpCi0gTW9kaWZpZWQgdG8gbGluayB3aXRoIGMtYXJlcyBpbnN0ZWFkIG9mIGFyZXMuCgpEYW5pZWwgKDIgRmVicnVhcnkgMjAwNCkKLSBBZGRlZCBhIGNvbmZpZ3VyZSB0ZXN0IHRvIGNoZWNrIGZvciB3aGljaCBvcHRpb24gdGhlIChnKW5yb2ZmIHRvb2wgd2FudHMKICB0byBleHRyYWN0IHBsYWluIHRleHQgZnJvbSB0aGUgbWFuIHBhZ2VzLiBUb3IgQXJudHNlbiB0b2xkIHVzIHRoZSBBSVgKICB2ZXJzaW9uIG9mIEdOVSBnbnJvZmYgZG9lc24ndCBzdXBwb3J0IC1tYW4hCgotIEFkZGVkIGFuIHVuZGVmIG9mIGFjY2VwdCBpbiBtZW1kZWJ1Zy5oIHRvIG1ha2UgY3VybCBidWlsZCB3aXRoIC0tZW5hYmxlLWRlYnVnCiAgb24gQUlYIDUuMiB3aGljaCBzZWVtcyB0byBoYXZlIGFjY2VwdCBkZWZpbmVkLiBSZXBvcnRlZCBieSBUb3IgQXJudHNlbi4KCi0gY3VybF92ZXJzaW9uKCkgbm93IGluY2x1ZGVzIGMtYXJlcyB2ZXJzaW9uIGluZm8sIGFuZCBjdXJsX3ZlcnNpb25faW5mbygpIG5vdwogIHJldHVybnMgYSBzdHJ1Y3Qgd2l0aCB2ZXJzaW9uIFNFQ09ORCB0aGF0IGFsc28gaW5jbHVkZXMgdGhhdCBpbmZvLgoKLSBXZSBhcmUgbm93IG9mZmljaWFsbHkgdXNpbmcgYy1hcmVzIGZvciBhc3luY2ggbmFtZSByZXNvbHZlcy4gYy1hcmVzIGlzIHRoZQogIG5ldyBsaWJyYXJ5LCBiYXNlZCBvbiB0aGUgZXhpc3RpbmcgYXJlcyBidXQgd2l0aCBhbiBleHRlbmRlZCBhbmQgc2xpZ2h0bHkKICBtb2RpZmllZCBBUEkuCgotIERpcmsgaW1wcm92ZWQgdGhlIGFyZXMgdGltZW91dCBjb2RlLCBhbmQgbm93IHdlIGFsc28gaW5jbHVkZSB0aGUgYXJlcyBlcnJvcgogIHN0cmluZyB3aGVuIHdlIGZhaWwgdG8gcmVzb2x2ZSBhIG5hbWUuCgotIEFub3RoZXIgdHdlYWsgdG8gbWFrZSB0ZXN0IGNhc2UgOTEgcnVuIGZpbmUuIE5vdyB3ZSBoYXZlIGFub3RoZXIgYml0IG9uIGEKICBjb25uZWN0aW9uIHRoYXQgaXMgc2V0IHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbWFya2VkIGZvciAncmV0cnknLiBUaGF0CiAgbWFrZXMgdGhlIGNvbm5lY3Rpb24gZ2V0IGNsb3NlZCBhbmQgcmUtb3BlbmVkIGFuZCB0aGUgSFRUUC1kb25lIGNvZGUgbXVzdAogIG5vdCBjb21wbGFpbiBvbiB0aGUgZmFjdCB0aGF0IG5vIGRhdGEgd2FzIHJlY2VpdmVkLgoKLSBCYXNlZCBvbiBEaXJrIE1hbnNrZSdzIHBhdGNoLCBJIG1vZGlmaWVkIHRoZSBuYW1lIHJlc29sdmluZyB3aXRoIGFyZXMgdG8KICBmZWF0dXJlIGEgdGltZW91dCBmb3IgcmVhbGx5IHNsb3cgbG9va3Vwcy4gSXQgbm93IGRlZmF1bHRzIHRvIDMwMCBzZWNvbmRzLAogIGJ1dCBpcyBub3cgYWRqdXN0ZWQgdG8gdGhlIENPTk5FQ1RUSU1FT1VUL1RJTU9VRSB0aW1lb3V0cyBpZiBvbmUgb2YgdGhlbQogIGlzIHNldC4KCi0gRml4ZWQgdGhlIGluY2x1c2lvbiBvZiBjYS1idW5kbGUuaCB0byByZWFsbHkgdXNlIHRoZSBvbmUgaW4gdGhlIGJ1aWxkIGRpcgogIGJlZm9yZSB0aGUgb25lIGluIHRoZSBzb3VyY2UgZGlyLiBEb21lbmljbyBBbmRyZW9saSBmb3VuZCBvdXQgYW5kIHJlcG9ydGVkLgoKLSBBZGRlZCB0ZXN0IGNhc2UgOTcsIGEgc2ltcGxlIFBPU1Qgd2l0aCBhIGN1c3RvbSBDb250ZW50LVR5cGUgaGVhZGVyCiAgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgb25lLgoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDQpCi0gQWRkZWQgY29kZSB0aGF0IGF0dGVtcHRzIHRvIGZpeCB0aGUgdGVzdCA5MSBmYWlsdXJlLiBBcyBoYXMgYmVlbiBmaWd1cmVkIG91dAogIGJ5IFBhdHJpY2sgU21pdGgsIHRoZSBlcnJvciBoYXBwZW5zIGJlY2F1c2Ugd2UgcmUtdXNlIGEgY29ubmVjdGlvbiB0aGF0IHRoZQogIHNlcnZlciBpcyBqdXN0IGFib3V0IHRvIGNsb3NlIGFuZCB3ZSBldmVuIG1hbmFnZSB0byBzZW5kIGF3YXkgdGhlIHJlcXVlc3QKICB3aXRob3V0IHNlZWluZyBhbiBlcnJvci4gT24gdGhlIGZpcnN0IHJlYWQgYXR0ZW1wdCB3ZSBnZXQgYSBFQ09OTlJFU0VULgogIFN0YXJ0aW5nIG5vdywgd2UgYXR0ZW1wdCB0byBkZXRlY3QgdGhpcyBhbmQgaWYgc28sIHdlIHJldHJ5IHRoZSByZXF1ZXN0IG9uIGEKICBmcmVzaCBjb25uZWN0aW9uLgoKLSBJIGFkZGVkIHRlc3QgY2FzZSA1MTAgd2hpY2ggaXMgYSBjdXN0b20gcHJvZ3JhbSB0aGF0IGRvZXMgYSBQT1NUIHVzaW5nIGEKICByZWFkIGNhbGxiYWNrLCB3aXRoIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcuCgotIEFkanVzdGVkIG9uZSBvZiB0aGUgTVBFL2lYIGNoYW5nZXMgYXMgaXQgbWFkZSB0ZXN0IGNhc2UgNTA0IGZhaWwgYWxsIG92ZXIuCgotIEFkZGVkIC0tc29ja3MgYXMgYSByZWNvZ25pemVkIG9wdGlvbi4gSXQgd29ya3MganVzdCBsaWtlIC0tcHJveHkgYnV0IHNldHMgYQogIFNPQ0tTNSBwcm94eSB0byB1c2UuIFNPQ0tTNSBzdXBwb3J0IGhhcyBiZWVuIGF2YWlsYWJsZSBpbiBsaWJjdXJsIGZvciBhCiAgd2hpbGUsIGp1c3Qgbm90IHByb3ZpZGVkIGJ5IHRoZSBjdXJsIHRvb2wuIFRoaXMgZG9lcyBub3QgY3VycmVudGx5IHdvcmsgZm9yCiAgSVB2Ni1lbmFibGVkIGxpYmN1cmxzLgoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDQpCi0gU3RhZGxlciBTdGVwaGFuIHBvaW50ZWQgb3V0IHRoYXQgc3JjL2h1Z2VoZWxwLmMgaW5jbHVkZWQgY29uZmlnLmggd2l0aG91dAogIGNoZWNraW5nIHRoZSBkZWZpbmUgaWYgaXRzIHByZXNlbnQuLi4KCi0gS2VuIEhpcnNjaCBwcm92aWRlZCBwYXRjaGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIHRoZSBNUEUvaVggb3BlcmF0aW5nCiAgc3lzdGVtLgoKLSBEYW4gRmFuZHJpY2ggY29tcGlsZWQgY3VybCB3aXRoIGxvdHMgb2YgYWdncmVzc2l2ZWx5IHBlZGFudGljIGNvbXBpbGVyCiAgb3B0aW9ucyBhbmQgdGh1cyBmb3VuZCBhIGZldyBtaW5vciBlcnJvcnMgYW5kIGRpZCBzb21lIGdlbmVyYWwgY2xlYW51cHMgdG8KICBhdm9pZCB0aGVtLgoKLSBEaXJrIE1hbnNrZSBmaXhlZCBhIGZsYXcgaW4gYXJlcyB0aGF0IHByZXZlbnRlZCBpdCB0byB1c2Ugbm9uLWJsb2NraW5nCiAgc29ja2V0cyBwcm9wZXJseS4KCkRhbmllbCAoMjggSmFudWFyeSAyMDA0KQotIFJpY2hhcmQgQnJhbWFudGUgZml4ZWQgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGVkICJ1cGxvYWRzIiB0byBzZW5kIGEgZmluYWwKICBDUkxGIGNvbWJvIHByb3Blcmx5LgoKRGFuaWVsICgyNyBKYW51YXJ5IDIwMDQpCi0gTWFkZSB0aGUgcmVzcG9uc2UtaGVhZGVycyBkdXJpbmcgYSBDT05ORUNUIHJlcXVlc3QgdG8gYSBwcm94eSBnZXQgcGFzc2VkIG9uCiAgYXMgcmVndWxhciBoZWFkZXJzLCBzbyB0aGV5IGFwcGVhciB3aXRoIC1pLy1JIG9wdGlvbnMgYW5kIHNpbWlsYXIuCgotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgR2lzbGUgVmFuZW0sIEkndmUgbWFkZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgZGlzcGxheQogIHByb3Blcmx5IHN3aXRjaCB0byBhIEdCLWRpc3BsYXkgd2hlbiBtb3JlIHRoYW4gOTk5OU1CIGhhdmUgYmVlbiB0cmFuc2ZlcmVkLgoKRGFuaWVsICgyMyBKYW51YXJ5IDIwMDQpCi0gR2lzbGUgVmFuZW0gcG9pbnRlZCBvdXQgYSBjdXJscmMgcGFyc2VyIHByb2JsZW0vY3Jhc2ggd2hlbiBhbiBvcHRpb24gd2l0aCBhCiAgcmVxdWlyZWQgZGlkbid0IGhhdmUgb25lIGFuZCB3YXMgb24gdGhlIGxhc3QgbGluZSBvZiBhIGZpbGUuCgotIE1vcmUgV2luZG93cyBmaXhlcyBmb3IgbGFyZ2UgZmlsZXMuIFdlIG5vdyBidWlsZCBhbmQgbGluayB3aXRoCiAgLi4vbGliL3N0cnRvb2ZmdC5jIGluIHRoZSBhcHAgY29kZSBzaW5jZSBDdXJsX3N0cnRvbGwoKSBpcyBub3QgYSBwcm92aWRlZAogIGxpYmN1cmwgZnVuY3Rpb24uLi4gUGVyaGFwcyB3ZSBzaG91bGQgY29uc2lkZXIgYSAnY29tbW9uJyBkaXIgb3Igc2ltaWxhcgogIHdoZXJlIHdlIHB1dCBzb3VyY2UgY29kZSB1c2VkIGluIGJvdGggdGhlIGxpYiBhbmQgdGhlIGNsaWVudC4gT3IgcGVyaGFwcwogIHdlJ2xsIGp1c3QgbWFrZSB0aGlzIGZ1bmN0aW9uIGF2YWlsYWJsZSBpbiB0aGUgbGlicmFyeS4uLgoKLSBWaW5jZW50IEJyb25uZXIgZm91bmQgb3V0IHRoZSBzb2NrczUgY29kZSBjcmFzaGVkIHdoZW4gbm8gdXNlcm5hbWUgd2FzCiAgc2V0LgoKLSBWaW5jZW50IEJyb25uZXIgc3BvdHRlZCBhIHByb2JsZW0gd2l0aCBwcm94eSB1c2VybmFtZS9wYXNzd29yZCB3aGVuIHJlLXVzaW5nCiAgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uCgotIEZpeGVkIHRoZSBwcm9ncmVzcyBtZXRlciBkaXNwbGF5IGZvciBmaWxlcyBsYXJnZXIgdGhhbiAyXjMxIGJ5dGVzLiBHaXNsZQogIFZhbmVtIHJlcG9ydGVkLgoKRGFuaWVsICgyMiBKYW51YXJ5IDIwMDQpCi0gR2lzbGUgVmFuZW0gbWFkZSBzdHJ0b2xsKCkgZ2V0IHVzZWQgd2hlbiBjdXJsIGlzIGJ1aWx0IHdpdGggdGhlIG1pbmd3CiAgY29tcGlsZXIuCgotIEdpc2xlIFZhbmVtIGZpeGVkIHRoZSBjb21wcmVzc2VkIGhlbHAgdGV4dCBjb2RlIHRvIGRpc3BsYXkgcHJvcGVybHkuCgotIFJlbW92ZWQgdGhlICcjZGVmaW5lIEh0dHBQb3N0JyBmcm9tIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUsIGFzIGN1cmxfaHR0cHBvc3QKICBpcyB0aGUgcHJvcGVyIG5hbWUgYW5kIGl0IGhhcyBiZWVuIGZvciBxdWl0ZSBzb21lIHRpbWUgbm93LiBGaXhlcyBhbm90aGVyCiAgbmFtZSBzcGFjZSBwb2xsdXRpb24uCgotIEFkZGVkICdjdXJsX29mZl90JyB0eXBlZGVmIGluIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUsIHRvIGJlIHVzZWQgdG8gcHJvdmlkZQogIGxhcmdlIGZpbGUgc2l6ZXMgdG8gdGhlICpfTEFSR0Ugb3B0aW9ucy4gQWRqdXN0ZWQgdGhlIGNvZGUgYWxsIG92ZXIgdG8gdXNlCiAgdGhpcyB2YXJpYWJsZSB0eXBlIGluc3RlYWQgb2YgJ29mZl90Jy4gVGhpcyBpcyBhbiBhdHRlbXB0IHRvIG1ha2UgdGhlIGxhcmdlCiAgZmlsZSBzdXBwb3J0IHdvcmsgb24gbW9yZSBwbGF0Zm9ybXMuIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBjaGVja3MgdGhlCiAgc2l6ZSBvZiB0aGUgY3VybF9vZmZfdCBpbnN0ZWFkIG9mIHRoZSBwbGFpbiBvZmZfdC4KClZlcnNpb24gNy4xMS4wICgyMiBKYW51YXJ5IDIwMDQpCgpEYW5pZWwgKDIxIEphbnVhcnkgMjAwNCkKLSBSZW1vdmVkIHRoZSBkZWZpbmVzIGluIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUgd2l0aCBUSU1FQ09ORF8gcHJlZml4ZXMuIFRoZXkKICBoYXZlIGJlZW4gb2Jzb2xldGUgc2luY2UgQXByaWwgMjJuZCAyMDAyLCBhbmQgaWYgdGhpcyBjYXVzZXMgYW55b25lIGFueQogIHByb2JsZW1zIG5vdyBpdCBpcyB2ZXJ5IGVhc3kgdG8ganVzdCBhZGQgQ1VSTF8gdG8gdGhlIG5hbWVzLiBUaGlzIGNvcnJlY3RzCiAgdGhpcyBuYW1lIHNwYWNlIHBvbGx1dGlvbi4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDA0KQotIERhdmlkIEJ5cm9uIGNsZWFuZWQgdXAgaG93IC0tdHJhY2Ugd2l0aCBubyBvcHRpb24gd2FzIHRyZWF0ZWQsIGFuZCBhbHNvCiAgYXJndW1lbnRzIGluIGEgY29uZmlnIGZpbGUgd2l0aG91dCBhIHJlcXVpcmVkIHBhcmFtZXRlciEKCkRhbmllbCAoMTYgSmFudWFyeSAyMDA0KQotIEdpc2xlIFZhbmVtIGZpeGVkIGEgZmV3IGlzc3VlcyB3aGVyZSBjb21waWxlcnMgd2FybmVkIGFib3V0IHZhcmlhYmxlcwogIHBvc3NpYmx5IGJlaW5nIHVzZWQgdW5hc3NpZ25lZC4KCi0gTWlub3IgSW50ZXJpeCBidWlsZCBwcm9ibGVtIGZpeGVkLgoKRGFuaWVsICgxNSBKYW51YXJ5IDIwMDQpCi0gUGV0ZXIgU3lsdmVzdGVyIHBvaW50ZWQgb3V0IHNvbWUgbmVjZXNzYXJ5IGVzY2FwaW5nIG5lZWRlZCBpbiB0aGUKICBhY2luY2x1ZGUubTQgZmlsZSB3aGVuIGF1dG9tYWtlIDEuOCBvciBsYXRlciBpcyB1c2VkLgoKRGFuaWVsICgxNCBKYW51YXJ5IDIwMDQpCi0gVmluY2VudCBCcm9ubmVyIGZpeGVkIHRoZSBDdXJsX3Jlc29sdigpIHJldHVybiBjb2RlLiBUaGlzIGV4dGVuZHMgdGhlIGZpeAogIFN0ZXZlIEdyZWVuIHByb3ZpZGVkIG9uIGRlY2VtYmVyIDMuLi4KCkRhbmllbCAoMTMgSmFudWFyeSAyMDA0KQotIEx1a2UgQ2FsbCBtYWRlIHRoZSB3aW4zMiB2ZXJzaW9uIG9mIHRoZSBwYXNzd29yZCBwcm9tcHRpbmcgZnVuY3Rpb24gc3VwcG9ydAogIGJhY2tzcGFjZS4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHRoZSBodWdlaGVscCBzb3VyY2UgZmlsZSB0byBjb250YWluIGJvdGggYSBjb21wcmVzc2VkIGFuZAogIGFuIHVuY29tcHJlc3NlZCB2ZXJzaW9uIGluIHRoZSBkaXN0cmlidXRpb24sIHNvIHRoYXQgbW9yZSBwZW9wbGUgZWFzaWVyIGNhbgogIGJ1aWxkIGN1cmwgd2l0aCB0aGUgY29tcHJlc3NlZCB2ZXJzaW9uLgoKLSBEaWVnbyBDYXNvcnJhbiBicm91Z2h0IGFub3RoZXIgQW1pZ2FPUyBidWlsZCBwYXRjaCBmb3IgbmF0aXZlIEFtaWdhIGJ1aWxkcy4KCi0gTWF0dCBWZWVuc3RyYSB1cGRhdGVkIHRoZSBNYWMgT1MgWCBmcmFtZXdvcmsgZmlsZXMuCgotIEJyaWFuIFIgRHVmZnkgYnJvdWdodCBhIHNlY3Rpb24gdG8gdGhlIElOU1RBTEwgZmlsZSBvbiBob3cgdG8gYnVpbGQgYQogIFNTTC1lbmFibGVkIGN1cmwgdXNpbmcgdGhlIGZyZWUgQm9ybGFuZCBDKysgY29tcGlsZXIuIEhlIGFsc28gdXBkYXRlZCB0aGUKICBCb3JsYW5kIGxpYi9NYWtlZmlsZS5iMzIuCgotIEkgZml4ZWQgdGhlIHRlc3QgY2FzZSA1MDkgd2hpY2ggSSBicm9rZSB5ZXN0ZXJkYXkuIE5vdyB0aGUgbGlidGVzdCBhcmUKICBjb21waWxlZCB3aXRoIGFuIGluY2x1ZGUgcGF0aCB0aGF0IHBvaW50cyB0byB0aGUgbGlicmFyeSdzIHNvdXJjZSBkaXIsIHNvCiAgdGhhdCB0aGUgbGlidGVzdHMgY2FuIGluY2x1ZGUgZmlsZXMgZnJvbSB0aGUgc291cmNlIHRyZWUuIFRoaXMgd2FzIG1hZGUgdG8KICBtYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSB0aGUgVVNFX1NTTEVBWSBkZWZpbmUgaW4gdGhlIGxpYnJhcnkgdGVzdCBmaWxlcy4KCkRhbmllbCAoMTIgSmFudWFyeSAyMDA0KQotIFBldGVyIFN5bHZlc3RlciBicm91Z2h0IGNvZGUgdGhhdCBub3cgYWxsb3dzIGEgY2FsbGJhY2sgdG8gbW9kaWZpZWQgdGhlIFVSTAogIGV2ZW4gd2hlbiB0aGUgbXVsdGkgaW50ZXJmYWNlIGlzIHVzZWQsIGFuZCB0aGVuIGxpYmN1cmwgd2lsbCBzaW11bGF0ZSBhCiAgImZvbGxvdyBsb2NhdGlvbiIgdG8gdGhhdCBuZXcgVVJMLiBUZXN0IDUwOSB3YXMgYWRkZWQgdG8gdGVzdCB0aGlzIGZlYXR1cmUuCgotIEV4dGVuZGVkIHRoZSB0aW1lIHdlIHJldHJ5IHNlcnZlcnMgaW4gdGhlIHRlc3Qgc2NyaXB0LCBhbmQgSSBhbHNvIG1hZGUgaXQKICByZXRyeSB0aGUgaHR0cHMgYW5kIGZ0cHMgc2VydmVycyBiZWZvcmUgdGhleSBhcmUgY29uc2lkZXJlZCBiYWQuIEkgYmVsaWV2ZQogIHRoZSBwcmV2aW91cyBhcHByb2FjaCBjb3VsZCB0dXJuIHByb2JsZW1hdGljIG9uIHJlYWxseSBzbG93IGhvc3RzLgoKVmVyc2lvbiA3LjExLjAtcHJlMSAoMTIgSmFudWFyeSAyMDA0KQoKRGFuaWVsICgxMSBKYW51YXJ5IDIwMDQpCi0gRG9taW5pY2sgTWVnbGlvIHBvaW50ZWQgb3V0IEZUUFMgc2hvdWxkIHVzZSBkZWZhdWx0IHBvcnQgOTkwIGFjY29yZGluZyB0bwogIElBTkEuCgpEYW5pZWwgKDggSmFudWFyeSAyMDA0KQotIEZpeGVkIHRoZSBTUE5FR08gY29uZmlndXJlIGNoZWNrIHRvIG5vdCB1c2UgLVIgb3Igb3RoZXIgbm9uLXBvcnRhYmxlIG9wdGlvbnMKICBpbiB0aGUgTERGTEFHUy4gUmVwb3J0ZWQgYnkgUGllcnJlIGluIGJ1ZyByZXBvcnQgIzg3MjkzMC4KCkRhbmllbCAoNSBKYW51YXJ5IDIwMDQpCi0gRGFuIEZhbmRyaWNoIHByb3ZpZGVkIGEgZml4IG9uIG91ciB6bGliIHVzYWdlLgoKLSBEYXZpZCBKIE1leWVyJ3MgcGF0Y2ggdGhhdCBpbnRyb2R1Y2UgbGFyZ2UgZmlsZSBzdXBwb3J0IHRvIGxpYmN1cmwgd2FzCiAgYXBwbGllZC4gTmV3IGN1cmxfZWFzeV9zZXRvcHQgb3B0aW9ucyB0aGF0IGFjY2VwdCAnb2ZmX3QnIGFyZ3VtZW50cyBhcmU6CgogIElORklMRVNJWkVfTEFSR0UKICBSRVNVTUVfRlJPTV9MQVJHRQogIE1BWEZJTEVTSVpFX0xBUkdFCgpEYW5pZWwgKDQgSmFudWFyeSAyMDA0KQotIEJhc2VkIG9uIERvbWluaWNrIE1lZ2xpbydzIGNvbW1lbnRzLCBJIG1hZGUgb3VyIHByaXZhdGUgdmVyc2lvbiBvZgogIGdldHRpbWVvZmRheSgpIGRlY2xhcmVkIHN0YXRpYy4gVGhpcyB3b3VsZCBvdGhlcndpc2UgY29sbGlkZSB3aXRoIHRoZSBzYW1lCiAgZnVuY3Rpb24gaW4gb3RoZXIgbGlicyAobGlrZSBhcmVzIGZvciBleGFtcGxlKS4KCi0gQWRkZWQgRG9taW5pY2sgTWVnbGlvJ3MgZGVzY3JpcHRpb24gb24gaG93IHRvIGJ1aWxkIGxpYmN1cmwgd2l0aCBhcmVzCiAgb24gd2luMzIuCkRhbmllbCAoMTkgRGVjZW1iZXIpCi0gQ1VSTE9QVF9JUFJFU09MVkUgd2FzIG5vdCBwb3NzaWJsZSB0byBzZXQuCgotIEdpc2xlIFZhbmVtIHVwZGF0ZWQgdGhlIGRqZ3BwIGJ1aWxkIGZpbGVzLgoKRGFuaWVsICgxOCBEZWNlbWJlcikKLSBKb2huIE1jR293YW4gcmVwb3J0ZWQgYSByZWRpcmVjdC1wcm9ibGVtIHRoYXQgaGFwcGVuZWQgaWYgYSBzaXRlIHVzZWQgYSBVUkwKICBsaWtlICJ1cmwuY29tP3Zhcj1jb250ZW50IiAod2l0aG91dCBhIHByb3BlciBzbGFzaCkgYW5kIGZyb20gdGhhdCBhZGRyZXNzCiAgcmVkaXJlY3RlZCB0aGUgdXNlci1hZ2VudCB0byBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkuCgotIERhdmlkIEJ5cm9uIG1hZGUgbGliY3VybCBidWlsZCBmaW5lIHdpdGggYm90aCB0aGUgLk5FVCBhbmQgVkM2IHZlcnNpb25zIG9mCiAgTVNWQwoKRGFuaWVsICgxNiBEZWNlbWJlcikKLSBVcGRhdGVkIHRlc3QgNTA2IHNpbmNlIGl0IHN0YXJ0ZWQgdG8gZmFpbCBhZnRlciB0aGUgY2FjaGUgcHJ1bmUgY2hhbmdlCiAgeWVzdGVyZGF5LiBJIGFsc28gY2hhbmdlZCBpdCBzbGlnaHRseSB0byBmZWF0dXJlIGEgY291bnRlciBpbiBlYWNoIGRlYnVnCiAgb3V0cHV0IGZvciBlYXNpZXIgdHJhY2luZy4KCkRhbmllbCAoMTUgRGVjZW1iZXIpCi0gT2xkIEROUyBjYWNoZSBlbnRyaWVzIGFyZSBub3cgb25seSBwcnVuZWQgYWZ0ZXIgY3VybCBpcyBkb25lIHdpdGggYSByZXF1ZXN0LAogIGFuZCBub3QgaW4gdGhlIGFjdHVhbCBuYW1lIHJlc29sdmUgY2FsbC4KCi0gY29ycmVjdGVkIHRoZSAtLWVuYWJsZS1hcmVzIHBhdGNoCgotIEdpdXNlcHBlIEF0dGFyZGkgZm91bmQgYW5kIGZpeGVkIGEgcHJvYmxlbSB3aXRoaW4gbGliY3VybCB0aGF0IHJlLXVzZWQKICBhbHJlYWR5IGZyZWVkIG1lbW9yeS4KCkRhbmllbCAoMTAgRGVjZW1iZXIpCi0gR2lzbGUgVmFuZW0gcmVwb3J0ZWQgdGhhdCB0aGUgZGljdCBzdXBwb3J0IHdhcyBicm9rZW4uIEkgYnJva2UgaXQgZHVyaW5nIG15CiAgZnRwcy1jaGFuZ2VzIG92ZXJoYXVsLiBJJ3ZlIG5vdyBhZGRlZCBhICdjdXJsYXNzZXJ0JyBmdW5jdGlvbiB0aGF0IGNhbiBiZQogIHVzZWQgdG8gdmVyaWZ5IGV4cHJlc3Npb25zLCB0byBwcmV2ZW50IGZ1dHVyZSBlcnJvcnMgb2YgdGhlIHNhbWUKICBraW5kLiBUaGV5J3JlIG9ubHkgcHJlc2VudCBpbiBkZWJ1Zy1idWlsZHMuCgotIERpZWdvIENhc29ycmFuIG1hZGUgY3VybCBhbmQgbGliY3VybCBwb3NzaWJsZSB0byBidWlsZCBuYXRpdmVseSAobm8gbW9yZQogIG5lZWQgZm9yIHRoZSBpeGVtdWwgbGlicmFyeSkgb24gQW1pZ2FPUy4KCi0gRG9taW5pY2sgTWVnbGlvIG1hZGUgY29uZmlndXJlIC0tZW5hYmxlLWFyZXMgc3VwcG9ydCBhIGdpdmVuIHBhdGggdG8gdGhlCiAgaW5zdGFsbGVkIGFyZXMgbGliLCBpbnN0ZWFkIG9mIGFsd2F5cyB1c2luZyBpdCBpbiB0aGUgY3VybCBzb3VyY2UgdHJlZS4KICBUaGlzIGFsc28gZml4ZWQgdGhlIGN1cmwtY29uZmlnIC0tbGlicyBvdXRwdXQuCgotIEVyaWMgUy4gUmF5bW9uZCBwYXRjaGVkIGEgdmVyeSBtaW5vciBtYW4gcGFnZSBmb3JtYXQgZXJyb3IgaW4KICBsaWJjdXJsLWVycm9ycy4zCgpEYW5pZWwgKDggRGVjZW1iZXIpCi0gRml4ZWQgdGhlIGZsYXcgdGhhdCBtYWRlIC1seiBhcHBlYXIgdHdpY2Ugb24gdGhlIGxpbmsgY29tbWFuZCBsaW5lLgoKLSBBZnRlciBjb3JyZXNwb25kZW5jZSB3aXRoIEdpc2xlIFZhbmVtLCBJIGNoYW5nZWQgdGhlICdjb25uZWN0aW9uIGFib3J0ZWQnCiAgZXJyb3IgdGV4dCB3aGVuIHRoZSBGVFAgcmVzcG9uc2UgcmVhZGVyIGZhaWxlZCB0byBtb3JlIHNwZWNpZmljbHkgaWRlbnRpZnkKICB3aGF0IHRoZSBwcm9ibGVtIGlzLgoKLSBCYXNlZCBvbiBhIHBhdGNoIGZyb20gRG9taW5pY2sgTWVnbGlvLCBjdXJsLWNvbmZpZyAtLWZlYXR1cmUgbm93IG91dHB1dHMKICAnQXN5bmNoRE5TJyBhcyBhIGZlYXR1cmUgaWYgbGliY3VybCB3YXMgYnVpbHQgd2l0aCBhcmVzLiBUaGUgZmVhdHVyZSBuYW1lCiAgaXMgdGhlIHNhbWUgdGhhdCAnY3VybCAtVicgb3V0cHV0cywgZm9yIHNpbXBsaWNpdHkuCgpEYW5pZWwgKDMgRGVjZW1iZXIpCi0gTWFydHkgS3VocnQgbWFkZSB0aGUgYnVpbGQgdXAtdG8tZGF0ZSBvbiBWTVMsIGFuZCBtb3ZlZCBtb3N0IG9mIHRoZSBWTVMtCiAgc3BlY2lmaWMgc3R1ZmYgaW4gdGhlIGNsaWVudCBjb2RlIHRvIGEgc2VwYXJhdGUgaGVhZGVyIGZpbGUuCgotIFN0ZXZlIEdyZWVuIGZpeGVkIGEgcmV0dXJuIGNvZGUgYnVnIGluIEN1cmxfcmVzb2x2KCksIHRoYXQgbWFkZSB0aGUgc29ja3M1CiAgY29kZSBmYWlsLgoKLSBzd2Fsa2F1cyBhdCB5YWhvby5jb20gcGF0Y2hlZCBsaWJjdXJsIHRvIGlnbm9yZSBDb250ZW50LUxlbmd0aDogaGVhZGVycwogIHdoZW4gVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQgaXMgdXNlZCwgYXMgbWFuZGF0ZWQgYnkgUkZDMjYxNi4KCkRhbmllbCAoMiBEZWNlbWJlcikKLSAtLWZ0cC1wYXN2IHdhcyBhZGRlZCwgd2hpY2ggc2VydmVzIHRoZSBvbmx5IHB1cnBvc2Ugb2Ygb3ZlcnJpZGluZyBhCiAgcHJldmlvdXNseSBzZXQgLS1mdHBwb3J0IG9wdGlvbi4gU3RhcnRpbmcgbm93LCAtLWZ0cC1wb3J0IGlzIGEgcmVjb2duaXplZAogIGFsaWFzIGZvciAtLWZ0cHBvcnQgZm9yIGNvbnNpc3RlbmN5LgoKLSBHaXVzZXBwZSBBdHRhcmRpIHBvaW50ZWQgb3V0IHRoYXQgd2Ugc2hvdWxkIHVzZSBNU0dfTk9TSUdOQUwgd2hlbiB3ZSB1c2UKICBzZW5kKCkgYW5kIHJlY3YoKS4gSSBhZGRlZCBjaGVja3MgZm9yIHRoZSBkZWZpbmUgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kCiAgYWRqdXN0ZWQgdGhlIGNvZGUgYWNjb3JkaW5nbHkuIElmIHRoZSBzeW1ib2wgaXMgcHJlc2VudCwgd2Ugd29uJ3QgYXR0ZW1wdAogIHRvIGlnbm9yZSB0aGUgU0lHUElQRSBzaWduYWwuCgpEYW5pZWwgKDEgRGVjZW1iZXIpCi0gTWF0aGlhcyBBeGVsc3NvbiBzZXQgdXAgYSBic2RmdHBkLXNzbCBzZXJ2ZXIgZm9yIG1lIGFuZCBJIGNvdWxkIG1ha2UgY3VybAogIHJ1biBmaW5lIGFnYWluc3QgaXRzIEZUUFMgaW1wbGVtZW50YXRpb24uIE5vdyB0aGVzZSBGVFBTLXJlbGF0ZWQgdGhpbmdzCiAgd29yazoKICAgbyBleHBsaWNpdCBhbmQgaW1wbGljaXQgRlRQUwogICBvIGFjdGl2ZSAoUE9SVCkgYW5kIHBhc3NpdmUgKFBBU1YpCiAgIG8gdXBsb2FkIGFuZCBkb3dubG9hZAogICBvIHZlcmlmaWVkIGFnYWluc3QgYnNkZnRwZC1zc2wgYW5kIFJhaWRlbkZUUEQKCkRhbmllbCAoMjcgTm92ZW1iZXIpCi0gSmFtZXMgQ2xhbmN5IG1hZGUgdGhlIEJvcmxhbmQgTWFrZWZpbGVzIHVwIHRvIGRhdGUuCgotIE1hcmt1cyBNb2VsbGVyIGltcHJvdmVkIHRoZSBTUE5FR08gZGV0ZWN0aW9uIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKRGFuaWVsICgyNSBOb3ZlbWJlcikKLSBEYXZlIE1heSBmaWxlZCBidWcgcmVwb3J0ICM4NDgzNzEsIGlkZW50aWZ5aW5nIHRoYXQgaWYgeW91J2QgZG8gUE9TVCBvdmVyIGEKICBwcm94eSB0byBhIGh0dHBzIHNlcnZlciwgbGliY3VybCBkaWRuJ3QgUE9TVCBhdCBhbGwsIGl0IGp1c3QgbWFkZSBhIEdFVCEgSXQKICB0dXJuZWQgb3V0IHRvIGJlIGJlY2F1c2UgbGliY3VybCB3cm9uZ2x5IGRpZG4ndCBjb25zaWRlciB0aGUgYXV0aGVudGljYXRpb24KICAibmVnb3RpYXRpb24gcGhhc2UiIHRvIGJlIGNvbXBsZXRlIHlldC4KCiAgSSBhZGRlZCB0ZXN0IGNhc2UgOTUgdG8gdmVyaWZ5IG15IGZpeCBmb3IgdGhpcy4KCkRhbmllbCAoMjQgTm92ZW1iZXIpCi0gVGhhbmtzIHRvIE1hdGhpYXMgQXhlbHNzb24sIEkndmUgYmVlbiBhYmxlIHRvIHdvcmsgb24gRlRQUyBmb3IgbGliY3VybCBhbmQgaXQKICBzZWVtcyB0byB3b3JrIHNvbWV3aGF0IGZpbmUgbm93LgoKICBUaGUgRlRQUyBzdHVmZiBpcyBiYXNlZCBvbiBSRkMyMjI4IGFuZCB0aGUgbXVycmF5LWF1dGgtZnRwLXNzbCBkcmFmdAogICh2ZXJzaW9uIDEyKS4gVGhlcmUgc2VlbXMgdG8gZXhpc3QgcXVpdGUgYSBmZXcgc2VydmVycyB0aGF0IGhhdmUgaW1wbGVtZW50ZWQKICB0aGUgc2VydmVyIHNpZGUgb2YgdGhpcy4KCiAgV2UgY2FuIG5vdyB1c2UgZnRwczovLyBVUkxzIHRvIGV4cGxpY2l0bHkgc3dpdGNoIG9uIFNTTC9UU0wgZm9yIHRoZSBjb250cm9sCiAgY29ubmVjdGlvbiBhbmQgdGhlIGRhdGEgY29ubmVjdGlvbiAoZGVhbGluZyB3aXRoIHR3byBTU0wgY29ubmVjdGlvbnMgZm9yY2VkCiAgbWUgdG8gY2hhbmdlIGEgbG90IG9mIHN0dWZmIGluIGxpYmN1cmwpLgoKICBBbHRlcm5hdGl2ZWx5LCBhbmQgd2hhdCBzZWVtcyB0byBiZSB0aGUgcmVjb21tZW5kZWQgd2F5LCB3ZSBjYW4gc2V0IHRoZSBuZXcKICBvcHRpb24gQ1VSTE9QVF9GVFBfU1NMIHRvIG9uZSBvZiB0aGVzZSB2YWx1ZXM6CgogICAgIENVUkxGVFBTU0xfTk9QRSwgICAtIGRvIG5vdCBhdHRlbXB0IHRvIHVzZSBTU0wKICAgICBDVVJMRlRQU1NMX1RSWSAgICAgLSB0cnkgdXNpbmcgU1NMLCBwcm9jZWVkIGFueXdheSBvdGhlcndpc2UKICAgICBDVVJMRlRQU1NMX0NPTlRST0wgLSBTU0wgZm9yIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gb3IgZmFpbAogICAgIENVUkxGVFBTU0xfQUxMICAgICAtIFNTTCBmb3IgYWxsIGNvbW11bmljYXRpb24gb3IgZmFpbAoKICBBbnkgZmFpbHVyZSB0byBzZXQgdGhlIGRlc2lyZWQgbGV2ZWwgd2lsbCBtYWtlIGxpYmN1cmwgZmFpbCB3aXRoIHRoZSBlcnJvcgogIGNvZGUgQ1VSTEVfRlRQX1NTTF9GQUlMRUQuIFRoaXMgbmV3IG9wdGlvbiBtYWtlcyBhICJub3JtYWwiIGZ0cDovLyB0cmFuc2ZlcgogIGF0dGVtcHQgdG8gYmUgbWFkZSBzZWN1cmVseS4KCiAgSSd2ZSBiZWVuIGFibGUgdG8gbG9naW4gYW5kIGdldCBmaWxlcyAocGFzc2l2ZWx5KSBmcm9tIE1hdGhpYXMnIHNlcnZlciB1c2luZwogIGJvdGggZnRwczovLyBhbmQgQ1VSTE9QVF9GVFBfU1NMLiAoSSd2ZSBtYWRlICdjdXJsJyB1bmRlcnN0YW5kIHRoZSAtLWZ0cC1zc2wKICBvcHRpb24gdGhhdCBzZXRzIENVUkxGVFBTU0xfVFJZLikKCi0gR2F6IElxYmFsIGZpeGVkIGEgcmFuZ2Ugc3RyaW5nIG1lbW9yeSBsZWFrLgoKLSBHaXNsZSBWYW5lbSBmaXhlZCB0aGUgV2luZG93cyBidWlsZHMuCgotIEFkZGVkIHRoZSBuZXcgRlRQU1NMIGRlZmluZXMgaW4gY3VybC9jdXJsLmgKCkRhbmllbCAoMjAgTm92ZW1iZXIpCi0gSm9zaCBLYXBlbGwgZmlsZWQgYnVnIHJlcG9ydCAjODQ1MjQ3IGFzIGhlIGZvdW5kIGFuIGVuZGxlc3MgbG9vcCB3aGVuCiAgZ2V0dGluZyBhIDQwNyBiYWNrIGZyb20gYSBwcm94eSB3aGVuIG5vIHVzZXIrcGFzc3dvcmQgd2FzIGdpdmVuLiBBZGRlZCB0ZXN0CiAgY2FzZSA5NCB0byB2ZXJpZnkgdGhlIGZpeC4KCkRhbmllbCAoMTkgTm92ZW1iZXIpCi0gS2V2aW4gUm90aCBmaXhlZCBhIHByb2dyZXNzLWJhciBwcm9ibGVtIG9uIFdpbmRvd3MuCgotIFdoaWxlIHdvcmtpbmcgd2l0aCBOaWNvbGFzIENyb2lzZXQncyBidWcgcmVwb3J0ICM4NDM3MzksIEkgbm90aWNlZCB0d28gbWlub3IKICBwcm9ibGVtcyByZWxhdGVkIHRvIGZ0cCBwYXJ0aWFsIGRvd25sb2FkczogaWYgYSBwYXJ0aWFsIHRyYW5zZmVyIGlzCiAgZGV0ZWN0ZWQsIHdlIG11c3QgY2xvc2UgdGhlIGNvbm5lY3Rpb24gYXMgd2UgY2Fubm90IGtub3cgaW4gd2hhdCBzdGF0ZSBpdCBpcwogIGFueW1vcmUuIFRoaXMgbG9va3MgbGlrZSBhIFByb0ZUUEQgYnVnOgogIGh0dHBzOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDMtMTEvMDA3OS5odG1sCgpEYW5pZWwgKDE3IE5vdmVtYmVyKQotIE1hY2llaiBXLiBSb3p5Y2tpIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdXNlIGEgY2FjaGUgdmFyaWFibGUgZm9yIHRoZQogIHdyaXRhYmxlIGFyZ3YgdGVzdC4gVGhpcyB3YXksIHRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGJldHRlciAoZm9yCiAgY3Jvc3MtY29tcGlsZXMgZXRjKQoKRGFuaWVsICgxNSBOb3ZlbWJlcikKLSBNYXRoaWFzIEF4ZWxzc29uIGZvdW5kIG91dCBsaWJjdXJsIHNvbWV0aW1lcyBmcmVlZCB0aGUgc2VydmVyIGNlcnRpZmljYXRlCiAgdHdpY2UsIGxlYWRpbmcgdG8gY3Jhc2hlcyEKCkRhbmllbCAoMTQgTm92ZW1iZXIpCi0gU2lkZGhhcnRoYSBQcmFrYXNoIEphaW4gZm91bmQgYSBjYXNlIHdpdGggYSBiYWQgcmVzb2x2ZSB0aGF0IHdlIGRpZG4ndAogIHByb3Blcmx5IGJhaWwgb3V0IGZyb20sIHdoZW4gdXNpbmcgYXJlcy4KCkRhbmllbCAoMTMgTm92ZW1iZXIpCi0gRGVmYXVsdCBDb250ZW50LVR5cGUgZm9yIHBhcnRzIGluIG11bHRpcGFydCBmb3JtcG9zdHMgaGFzIGNoYW5nZWQgdG8KICAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIi4gIFRoaXMgc2VlbXMgbW9yZSBhcHByb3ByaWF0ZSwgYW5kIEkgYmVsaWV2ZQogIG1vemlsbGEgYW5kIHRoZSBsaWtlcyBkbyB0aGlzLiBJbiB0aGUgc2FtZSBhcmVhOiAuaHRtbCBmaWxlcyBub3cgZ2V0CiAgdGV4dC9odG1sIGFzIENvbnRlbnQtVHlwZS4gKFBvaW50ZWQgb3V0IGluIGJ1ZyByZXBvcnQgIzgzOTgwNikKCi0gR2lzbGUgVmFuZW0gY29ycmVjdGVkIHRoZSAtLXByb2dyZXNzLWJhciBvdXRwdXQgYnkgZG9pbmcgYSBmbHVzaCBvZiB0aGUKICBvdXRwdXQsIHdoaWNoIGFwcGFyZW50bHkgbWFrZXMgaXQgbG9vayBiZXR0ZXIgb24gYXQgbGVhc3Qgd2luZG93cywgYnV0CiAgcG9zc2libHkgb3RoZXIgcGxhdGZvcm1zIHRvby4KCi0gUGV0ZXIgU3lsdmVzdGVyIGlkZW50aWZpZWQgYSBwcm9ibGVtIGluIHRoZSBjb25uZWN0IGNvZGUsIHdoaWNoIG1hZGUgdGhlCiAgbXVsdGkgaW50ZXJmYWNlIG9uIGEgSVB2Ni1lbmFibGVkIFNvbGFyaXMgYm94IGRvIGJhZC4gVGVzdCBjYXNlIDUwNCB0byBiZQogIHNwZWNpZmljLiBJJ3ZlIHNwZW50IHNvbWUgdGltZSB0byBjbGVhbi11cCB0aGUgQ3VybF9jb25uZWN0aG9zdCgpIGZ1bmN0aW9uCiAgbm93IHRvIHVzZSBsZXNzIGR1cGxpY2F0ZWQgY29kZSBmb3IgdGhlIHR3byBkaWZmZXJlbnQgc2VjdGlvbnM6IElQdjYgYW5kCiAgSVB2NC4KCkRhbmllbCAoMTEgTm92ZW1iZXIpCi0gQWRkZWQgQ1VSTE9QVF9ORVRSQ19GSUxFLiBVc2UgdGhpcyB0byB0ZWxsIGxpYmN1cmwgd2hpY2ggZmlsZSB0byB1c2UgaW5zdGVhZAogIG9mIHRyeWluZyB0byBmaW5kIGEgLm5ldHJjIGluIHRoZSBjdXJyZW50IHVzZXIncyBob21lIGRpcmVjdG9yeS4gVGhlCiAgZXhpc3RpbmcgLm5ldHJjIGZpbGUgZmluZGVyIGlzIHNvbWV3aGF0IG5haXZlIGFuZCBpcyBmYXIgZnJvbSBwZXJmZWN0IG9uCiAgc2V2ZXJhbCBwbGF0Zm9ybXMgdGhhdCBhcmVuJ3QgdW5peC1zdHlsZS4gSWYgdGhpcyBvcHRpb24gaXNuJ3Qgc2V0IHdoZW4KICBDVVJMT1BUX05FVFJDIGlzIHNldCwgdGhlIHByZXZpb3VzIGFwcHJvYWNoIHdpbGwgc3RpbGwgYmUgdXNlZC4KCiAgVGhlIGN1cnJlbnQgLm5ldHJjIGNoZWNrIGNvZGUgbm93IGFsc28gc3VwcG9ydCBsb25nZXIgdGhhbiAyNTYgYnl0ZXMgcGF0aAogIG5hbWVzLgoKRGFuaWVsICgxMCBOb3ZlbWJlcikKLSBLYW5nLUppbiBMZWUgcG9pbnRlZCBvdXQgdGhhdCB0aGUgZ2VuZXJhdGVkIGNhLWJ1bmRsZS5oIGZpbGUgc2hvdWxkbid0IGJlCiAgd3JpdHRlbiBpbiB0aGUgc291cmNlIGRpciBpZiBhIGRpZmZlcmVudCBidWlsZCBkaXIgaXMgdXNlZC4KCi0gQWZ0ZXIgU+liYXN0aWVuIFdpbGxlbWlqbnMnIGJ1ZyByZXBvcnQsIHdlIG5vdyBjaGVjayB0aGUgc2VwYXJhdG9ycyBwcm9wZXJseQogIGluIHRoZSAyMjktcmVwbHkgc2VydmVycyByZXNwb25kIG9uIGEgRVBTViBjb21tYW5kIGFuZCBiYWlsIG91dCBiZXR0ZXIgaWYKICB0aGUgcmVwbHkgc3RyaW5nIGlzIG5vdCBSRkMyNDI4LWNvbXBsaWFudC4KCkRhbmllbCAoNyBOb3ZlbWJlcikKLSBCYXNlZCBvbiBHaXNsZSBWYW5lbSdzIHBhdGNoLCBJIG1hZGUgY3VybCB0cnkgaGFyZGVyIHRvIGdldCB0aGUgaG9tZQogIGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCB1c2VyLCBpbiBvcmRlciB0byBmaW5kIHRoZSBkZWZhdWx0IC5jdXJscmMgZmlsZS4KICBXZSdyZSBhbHNvIGNvbnNpZGVyaW5nIG1vdmluZyBvdXQgdGhlIEhPTUUtZGlyIGNvZGUgZnJvbSBsaWJjdXJsLCBhbmQKICBpbnN0ZWFkIGhhdmUgdGhlIGFwcCBwYXNzIGluIHRoZSBwYXRoIHRvIHRoZSAubmV0cmMgZmlsZSAod2hpY2ggaXMgdGhlIG9ubHkKICBsb2dpYyBsZWZ0IGluIGxpYmN1cmwgdGhhdCB1c2VzIHRoZSBIT01FIGRpcikuIFRoZW4gY3VybCBjYW4gdXNlIHRoZSBob21lCiAgZGlyIGZvciB0aGF0IHB1cnBvc2UgdG9vLgoKLSBSYWxwaCBNaXRjaGVsbCdzIHVwZGF0ZWQgdGVzdGN1cmwuc2ggdG8gdGhlIHNjcmlwdCB0byB0YWtlIGFuIGV4aXN0aW5nCiAgZGlyZWN0b3J5IG5hbWUgYW5kIGJ1aWxkL3J1bi90ZXN0IGN1cmwgaW4gdGhlcmUgaW5zdGVhZCBvZiB0cnlpbmcgdG8gdXBkYXRlCiAgZnJvbSBDVlMuIFVzaW5nIHRoaXMgYXBwcm9hY2gsIHRoZSBzY3JpcHQgY2FuIG5vdyBiZSB1c2VkIHRvIHRlc3QgZGFpbHkKICB0YXJiYWxscyBldGMuCgotIEdpc2xlIFZhbmVtIGFkZGVkIGEgInJlc291cmNlIGZpbGUiIHRvIHRoZSBXaW5kb3dzIERMTCBidWlsZHMsIHRvIGNvbnRhaW4KICBpbmZvcm1hdGlvbiBzdWNoIGFzIHZlcnNpb24gbnVtYmVyLCBsaWJyYXJ5IG5hbWUsIGNvcHlyaWdodCBpbmZvIGV0Yy4KCkRhbmllbCAoNiBOb3ZlbWJlcikKLSBjdXJsIGNoZWNrcyBpZiB0aGUgZXhpc3RpbmcgbGliY3VybCBzdXBwb3J0cyB0aGluZ3MgbGlrZSAtLW50bG0sIC0tbmVnb3RpYXRlCiAgYW5kIC0ta3JiNCBhbmQgcmV0dXJucyBlcnJvciBpZiBub3QuCgotIEkgYWRkZWQgdGhyZWUgbmV3IGdsb2JhbCBkZWZpbmVzIGluIHRoZSBjdXJsL2N1cmwuaCBoZWFkZXI6CiAgTElCQ1VSTF9WRVJTSU9OX01BSk9SLCBMSUJDVVJMX1ZFUlNJT05fTUlOT1IgYW5kIExJQkNVUkxfVkVSU0lPTl9QQVRDSC4gVGhleQogIGFyZSB0aGUgdGhyZWUgbnVtYmVycyBpbiB0aGUgbGlicmFyeSdzIHZlcnNpb24gbnVtYmVyLCBzZXBhcmF0ZWQgZm9yIGVhc2llcgogIHVzYWdlLiAnbWFrZXRneicgd2FzIHVwZGF0ZWQgYWNjb3JkaW5nbHkgdG8gZ2VuZXJhdGUgdGhlc2UgbnVtYmVycyBwcm9wZXJseQogIHdoZW4gYnVpbGRpbmcgcmVsZWFzZS1hcmNoaXZlcy4KCi0gVW5pbml0aWFsaXplZCB2YXJpYWJsZSBmaXgsIHJlcG9ydGVkIGJ5IGJvdGggTWFydHkgS3VocnQgYW5kIEJlbmphbWluCiAgR2VyYXJkLgoKLSBNYXR0IFZlZW5zdHJhIHByb3ZpZGVkIGJ1aWxkIGZpbGVzIHRvIGJ1aWxkIGxpYmN1cmwgYXMgYSAiZnJhbWV3b3JrIiB1bmRlcgogIE1hYyBPUyBYLiBTZWUgdGhlIGxpYi9saWJjdXJsLmZyYW1ld29yay5tYWtlIGZvciBkZXRhaWxzLgoKLSBSZW1vdmVkIHRoZSBkZWZpbmVzIG9mIFRSVUUgYW5kIEZBTFNFIGZyb20gdGhlIGN1cmwvY3VybC5oIGhlYWRlciBmaWxlLgogIFRoZXkncmUgbm90IGluIG91ciBuYW1lIHNwYWNlIHNvIHdlIHNob3VsZCBub3QgZmlkZGxlIHdpdGggdGhlbS4KCkRhbmllbCAoNSBOb3ZlbWJlcikKLSBSZXBsYWNlZCB0aGUgbWFuIHBhZ2UgdG8gSFRNTCBjb252ZXJ0ZXIgcHJvZ3JhbSB3aXRoIGEgbmV3IG9uZTogcm9mZml0LgogIE1ha2VzIG5pY2VyIHdlYiBwYWdlcy4KCkRhbmllbCAoNCBOb3ZlbWJlcikKLSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gZml4ZWQgdGhlIE1TVkMgbWFrZWZpbGVzIHRvIGxldCB0aGVtIGJ1aWxkIGN1cmwgZmluZQogIG9uIFdpbmRvd3MuCgotIEtldmluIFJvdGggY29ycmVjdGVkIHRoZSBjeWd3aW4gcGFja2FnZSBnZW5lcmF0b3IgYW5kIHNwZWxsLWZpeGVkIHRoZQogIGNvbW1lbnQgaW4gdGhlIGNhLWJ1bmRsZS5oIGZpbGUuCgpWZXJzaW9uIDcuMTAuOCAoMSBOb3ZlbWJlciAyMDAzKQoKRGFuaWVsICgzMSBPY3RvYmVyKQotIEFzc3VtZSB0aGF0IE1EVE0gb24gYW4gRlRQIHNlcnZlciByZXR1cm5zIHRoZSB0aW1lc3RhbXAgdXNpbmcgdGhlIFVUQyB0aW1lCiAgem9uZS4gVGhpcyBjaGFuZ2VzIHRoZSB0aW1lIENVUkxJTkZPX0ZJTEVUSU1FIHJldHVybnMgZm9yIGEgZ2l2ZW4gZmlsZSBvdmVyCiAgRlRQLCBhbmQgd2lsbCBjaGFuZ2UgZXhpc3RpbmcgdXNlcyBvZiBDVVJMT1BUX1RJTUVDT05ESVRJT04uIEl0IHdpbGwgbWFrZQogIHRoZSBmdW5jdGlvbmFsaXR5IG1vcmUgc2ltaWxhciB0byBob3cgdGhlIEhUVFAgb25lIGlzIGFscmVhZHkgd29ya2luZy4KCi0gQ29tbWFuZCBsaW5lIG9wdGlvbnMgdGhhdCB0YWtlIG51bWVyaWNhbCBwYXJhbWV0ZXJzIChzdWNoIGFzIC15LCAtWSwgLUMgZXRjKQogIG5vdyByZXBvcnQgZXJyb3IgYW5kIGV4aXQgaWYgdGhlIHBhcmFtZXRlciBpc24ndCB0cnVseSBhIG51bWJlciBncmVhdGVyIHRoYW4KICBvciBlcXVhbCB0byB6ZXJvLiBUaGlzIGhlbHBzIHVzZXJzIHRvIG5vdGljZSBiYWQgdXNhZ2UgZWFybGllci4gQmVmb3JlLCB3aGVuCiAgYSB1c2VyIGZvcmdvdCBvciBtaXNzZWQgdG8gYWRkIGEgbnVtZXJpY2FsIHBhcmFtZXRlciB0byBhbiBvcHRpb24sIHRoZQogIGNvbW1hbmQgbGluZSBwYXJzZXIgd291bGQgc2ltcGx5ICJlYXQiIHRoZSBmb2xsb3dpbmcgb3B0aW9uIGFuZCBpdCB3b3VsZAogIGNhdXNlIGdyZWF0IGNvbmZ1c2lvbi4KCkRhbmllbCAoMzAgT2N0b2JlcikKLSBEYXZpZCBIdWxsIG1hZGUgbGliY3VybCBkZWFsIHdpdGggTk9CT0RZIGFuZCBIRUFERVIgZm9yIGZpbGU6Ly8gdGhlIHNhbWUgd2F5CiAgaXQgYWxyZWFkeSBkb2VzIGZvciBGVFA6IGl0IHByb3ZpZGVzIEhUVFAtbG9va2luZyBoZWFkZXJzIHRoYXQgcHJvdmlkZSBpbmZvCiAgb25seSBhYm91dCB0aGUgZmlsZSwgd2l0aG91dCBkb2luZyB0aGUgYWN0dWFsIHRyYW5zZmVyLiBUaGUgY3VybCB0b29sIHRoZW4KICBsZXRzIC0taGVhZCBkbyB0aGlzLgoKRGFuaWVsICgyOSBPY3RvYmVyKQotIHJ1bnRlc3RzLnBsIG5vdyBjaGVja3MgZm9yIGFuZCB1c2UgdmFsZ3JpbmQgaWYgcHJlc2VudC4gSXQgd2lsbCByZWRpcmVjdCB0aGUKICB2YWxncmluZCByZXN1bHRzIGluIGxvZy92YWxncmluZFtudW1dIGJ1dCBpdCBjdXJyZW50bHkgZG9lc24ndCBzY2FuIHRoYXQKICBmaWxlIGZvciBhbnkgZXJyb3JzIG9yIGFueXRoaW5nLCB0aGF0IGlzIHN0aWxsIG9ubHkgbWFkZSBtYW51YWxseS4KCi0gRGF2aWQgSHVsbCBtYWRlIHRoZSBmaWxlOiBVUkwgcGFyc2VyIGFsc28gYWNjZXB0IHRoZSBzb21ld2hhdCBzbG9wcHkgZmlsZQogIHN5bnRheDogZmlsZTovcGF0aC4gSSBhZGRlZCB0ZXN0IGNhc2UgMjAzIHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgyOCBPY3RvYmVyKQotIERhbiBDIHRyYWNrZWQgZG93biB5ZXQgYW5vdGhlciB3ZWlyZCBiZWhhdmlvciBpbiB0aGUgZ2xpYmMgZ2V0aG9zdGJ5bmFtZV9yKCkKICBmdW5jdGlvbiBmb3Igc29tZSBzcGVjaWZpYyB2ZXJzaW9ucyAocmVwb3J0ZWQgb24gMi4yLjUgYW5kIDIuMS4xKSwgYW5kCiAgcHJvdmlkZWQgYSBmaXguIE9uIExpbnV4IG1hY2hpbmVzIHdpdGggdGhlc2UgZ2xpYmMgdmVyc2lvbnMsIG5vbi1JUHY2CiAgYnVpbGRzIG9mIGxpYmN1cmwgd291bGQgb2Z0ZW4gZmFpbCB0byByZXNvbHZlIHBlcmZlY3RseSByZXNvbHZhYmxlIGhvc3QKICBuYW1lcy4KCkRhbmllbCAoMjYgT2N0b2JlcikKLSBKYW1lcyBCdXJzYSBmb3VuZCBvdXQgdGhhdCBjdXJsX21zbnByaW50ZigpIGNvdWxkIHdyaXRlIHRoZSB0cmFpbGluZwogIHplcm8tYnl0ZSBvdXRzaWRlIGl0cyBnaXZlbiBidWZmZXIgc2l6ZS4gVGhpcyBjb3VsZCBoYXBwZW4gaWYgeW91IGdlbmVyYXRlZAogIGEgdmVyeSBsb25nIGVycm9yIG1lc3NhZ2UgYXMgdGhlbiBsaWJjdXJsIHdvdWxkIG92ZXJ3cml0ZSB0aGUgRVJST1JCVUZGRVIKICB3aXRoIG9uZSBieXRlLiBVc2luZyBhIG5vbi1leGlzdGluZyB2ZXJ5IGxvbmcgbG9jYWwgZmlsZTovLyBuYW1lIGlzIG9uZSBjYXNlCiAgdGhhdCBjb3VsZCBtYWtlIHRoaXMgb2NjdXIuCgpEYW5pZWwgKDI0IE9jdG9iZXIpCi0gRGF2aWQgSHVsbCBmaWxlZCBidWcgcmVwb3J0ICM4Mjk4MjcuIEl0IGlkZW50aWZpZWQgYSBwcm9ibGVtIHdpdGggLUMgLSBpZgogIHRoZSBmdWxsIGZpbGUgYWxyZWFkeSB3YXMgZG93bmxvYWRlZCBhbmQgdGh1cyB0aGUgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGEKICA0MTYuIGxpYmN1cmwgd291bGQgdGhlbiB3cm9uZ2x5IHVzZSB0aGUgQ29udGVudC1MZW5ndGg6IGhlYWRlciBhbmQgZXhwZWN0CiAgdGhhdCBzaXplIHRvIGdldCB0cmFuc2ZlciwgY2F1c2luZyBhICJoYW5nIiB1bnRpbCB0aGUgc2VydmVyIGNsb3NlZCB0aGUKICBjb25uZWN0aW9uIGFuZCB0aGVuIGFuIGVycm9yIDE4ICgic3RpbGwgTiBieXRlcyBkYXRhIGxlZnQgb2YgdGhlIHRyYW5zZmVyIikuCgogIE5vdyB3ZSBkb24ndCByZXR1cm4gYW55IGVycm9yIGF0IGFsbCwgYnV0IEkgdGhpbmsgbGliY3VybCBzaG91bGQgcGVyaGFwcwogIHJldHVybiBzb21lIGtpbmQgb2YgaW5mbyBzaW5jZSB0aGUgcmVxdWVzdGVkIHJhbmdlIHdhcyBvdXQgb2YgdGhlIHNpemUgb2YKICB0aGUgZG9jdW1lbnQuCgotIEJhc2VkIG9uIERhdmlkIEh1bGwncyBmaXggaW4gYnVnIHJlcG9ydCAjODA0NTk5LCB3ZSBub3cgY2hlY2sgZm9yIHNvbGFyaXMgYW5kCiAgZ2NjIGluIGNvbmZpZ3VyZSBhbmQgc2V0IHRoZSAtbWltcHVyZS10ZXh0IGxpbmsgZmxhZyBmb3IgbGlua2luZyB0aGUgbGliCiAgYmV0dGVyLgoKLSBJJ3ZlIGludHJvZHVjZWQgYSAtdCBvcHRpb24gdG8gdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdC4gV2l0aCB0aGF0IG9wdGlvbiBzZXQsCiAgdGhlIHNjcmlwdCBydW5zIHNwZWNpYWwgIm1lbW9yeSB0b3J0dXJlIiB0ZXN0cy4gRm9yIGVhY2ggdGVzdCBjb21tYW5kIGxpbmUKICBpbiB0aGF0IHNlY3Rpb24sIHRoZSBzY3JpcHQgZmlyc3QgcnVucyB0aGUgY29tbWFuZCBsaW5lIGFuZCBjb3VudHMgdGhlIHRvdGFsCiAgYW1vdW50IG9mIGFsbG9jYXRpb25zIG1hZGUuIEl0IHRoZW4gcnVucyB0aGUgZXhhY3Qgc2FtZSBjb21tYW5kIGxpbmUgYWdhaW4sCiAgZm9yY2luZyBhbGxvY2F0aW9uIG51bWJlciBOIHRvIGZhaWwuIEl0IHdpbGwgdHJ5IGV2ZXJ5IE4gZnJvbSAxIHRvIHRoZSB0b3RhbAogIG51bWJlciBvZiBhbW91bnRzIG1hZGUuIEZvciBldmVyeSBpbnZva2UsIGl0IGNoZWNrcyB0aGF0IG5vIG1lbW9yeSB3YXMKICBsZWFrZWQgYXMgdGhhdCB3b3VsZCBpbmRpY2F0ZSBhIGJhZCBjbGVhbnVwIHNvbWV3aGVyZSBpbiB0aGUgY29kZS4KCiAgVGhpcyBpcyBqdXN0IGJlZ2lubmluZyB0byB3b3JrLCBhbmQgSSd2ZSBhbHJlYWR5IG1hZGUgc29tZSBjb3JyZWN0aW9ucyBpbgogIGxpYmN1cmwgY29kZS4gV2hlbiB0aGlzIGNvZGUgd29ya3Mgc29tZXdoYXQgZmluZSwgSSdsbCBtYWtlIHN1cmUgJ21ha2UgdGVzdCcKICBpbiB0aGUgcm9vdCBkaXIgd2lsbCBydW4gdGhlc2UgdGVzdHMgYXMgd2VsbC4KCkRhbmllbCAoMjMgT2N0b2JlcikKLSBHZW9yZyBIb3JuIGZpeGVkIGhvdyB0aGUgQ0EgdmVyaWZpY2F0aW9uIGlzIG1hZGUuIFZlcmlmaWNhdGlvbnMgY2FuIG5vdyBiZQogIG1hZGUgd2hpbGUgYXQgdGhlIHNhbWUgdGltZSB0aGUgcmVzdWx0IG9mIGl0IGNhbiBiZSBpZ25vcmVkLiBUaGlzIGFsc28KICBhZmZlY3RzIHRoZSBjdXJsIHRvb2wgYXMgLWsgY2FuIG5vdyBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggLS1jYWNlcnQgb3IKICAtLWNhcGF0aC4KCkRhbmllbCAoMjIgT2N0b2JlcikKLSBHaXNsZSBWYW5lbSBmb3VuZCBvdXQgLS1kaXNhYmxlLWVwcnQgZGlkbid0IHdvcmsgYW5kIHBhdGNoZWQgaXQuCgotIFRlc3QgY2FzZSA5MSB3YXMgbW9kaWZpZWQgYW5kIGNvdWxkIG5vdyByZXBlYXQgdGhlIHByb2JsZW0gS2V2aW4gUm90aCBoYXMKICByZXBvcnRlZCwgYW5kIHRoZSBidWcgd2FzIGZpeGVkLgoKLSBEeWxhbiBFbGxpY290dCBhZGRlZCB2Yy1saWJjdXJsLXNzbC1kbGwgYXMgYSB0YXJnZXQgdG8gdGhlIHJvb3QgbWFrZWZpbGUKICB0byBidWlsZCBhIHN0YXRpYyBsaWJjdXJsIHRoYXQgbGlua3Mgd2l0aCBhIHNoYXJlZCBPcGVuU1NMIHVzaW5nIE1TVkMuCgpEYW5pZWwgKDIxIE9jdG9iZXIpCi0gQW5kculzIEdhcmPtYSB1cGRhdGVkIHRoZSBtaW5ndzMyIG1ha2VmaWxlcy4KClZlcnNpb24gNy4xMC44LXByZTUgKDIxIE9jdG9iZXIgMjAwMykKCkRhbmllbCAoMTkgT2N0b2JlcikKLSBHZW9yZyBIb3JuIG1hZGUgbGliY3VybCBvdXRwdXQgbW9yZSBpbmZvIG9uIFNTTCBmYWlsdXJlcyB3aGVuIHJlY2VpdmluZwogIGRhdGEuCgpWZXJzaW9uIDcuMTAuOC1wcmU0ICgxOCBPY3RvYmVyIDIwMDMpCgpEYW5pZWwgKDE3IE9jdG9iZXIpCi0gRG9taW5pY2sgTWVnbGlvIGltcGxlbWVudGVkIENVUkxPUFRfTUFYRklMRVNJWkUgYW5kIC0tbWF4LWZpbGVzaXplLgoKLSBNYWRlIGxpYmN1cmwgc2hvdyB2ZXJib3NlIGluZm8gYWJvdXQgd2hhdCBhdXRoIHR5cGUgYW5kIHVzZXIgbmFtZSB0aGF0IGlzCiAgYmVpbmcgc2VudCBpbiBpdHMgSFRUUCByZXF1ZXN0LWhlYWRlcnMuCgpEYW5pZWwgKDE2IE9jdG9iZXIpCi0gUmVtb3ZlZCBzdXBwb3J0IGZvciBDVVJMT1BUX1BBU1NXREZVTkNUSU9OIGFuZCBDVVJMT1BUX1BBU1NXRERBVEEuIGxpYmN1cmwKICBubyBsb25nZXIgcHJvbXB0IGZvciBwYXNzd29yZHMgdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMuIFBhc3N3b3JkIHByb21wdGluZwogIHdhcyBpbnN0ZWFkIG1vdmVkIHRvIGN1cmwsIHdoaWNoIG5vdyBwcm9tcHRzIGZvciBwYXNzd29yZCBpZiAtdSBvciAtVSBsYWNrCiAgaXQuIFRoaXMgc29sdmVzIHRoZSBwcm9ibGVtIEtldmluIFJvdGggcmVwb3J0ZWQgd2hlbiBjdXJsIHByb21wdGVkIGZvcgogIHBhc3N3b3JkIHR3aWNlIHdoZW4gZG9pbmcgTlRMTSBhdXRoZW50aWNhdGlvbi4KCi0gSSByZXdyb3RlIHRoZSBTU0wgc3ViamVjdEFsdE5hbWUgY2hlY2sgdG8gYXZvaWQgaGF2aW5nIHRvIHJlbHkgb24gT3BlbkxEQVAtCiAgbGljZW5zZWQgZGVyaXZhdGUgY29kZS4KCkRhbmllbCAoMTUgT2N0b2JlcikKLSBBdm9pZCBkb2luZyBnZXRzb2Nrb3B0KCkgb24gV2luZG93cyB0byB2ZXJpZnkgY29ubmVjdHMuIEl0IHNlZW1zIHRoYXQgdGhpcwogIGhvZ3MgV2luZG93cyBtYWNoaW5lcyB3aGVuIGxpYmN1cmwgaXMgYmVpbmcgdXNlZCBtdWx0aS10aHJlYWRlZCAod2l0aCA+IH41MAogIHRocmVhZHMpLiBBbmRyZXcgRnVsbGVyIGhlbHBlZCB1cyB2ZXJpZnkgYW5kIHRlc3QgdGhpcy4KCkRhbmllbCAoMTQgT2N0b2JlcikKLSBLaW1tbyBLaW5udW5lbiBmaXhlZCBhIGNyYXNoIHdpdGggZHVwaGFuZGxlKCkgd2hlbiBDVVJMREVCVUcgaXMgc2V0LgoKLSBHaXNsZSBWYW5lbSBtYWRlIGxpYmN1cmwgYnVpbGQgYW5kIHdvcmsgd2l0aCBJUHY2IG9uIFdpbmRvd3MuCgpEYW5pZWwgKDEzIE9jdG9iZXIpCi0gR2l1c2VwcGUgQXR0YXJkaSByZXBvcnRlZCB5ZXQgYW5vdGhlciBzZWdmYXVsdCB3aXRoIGFyZXMgYW5kIHRoZSBtdWx0aQogIGludGVyZmFjZS4gTWUgZml4ZWQuCgotIERvbWVuaWNvIEFuZHJlb2xpIHJlbW92ZWQgdGhlIGV4dHJhIExERkxBR1MgYXNzaWdubWVudCBpbiBsaWIvTWFrZWZpbGUuYW0KICB0aGF0IHdhcyByZXBvcnRlZCBhYm91dCBpbiB0aGUgZGViaWFuIGJ1ZyByZXBvcnQgIzIxMjA4Ni4KCiAgRG9tZW5pY28gYWxzbyBmaXhlZCB0d28gbWFrZWZpbGVzIHdoZXJlIHdlIHVzZWQgJ2ducm9mZicgaW5zdGVhZCBvZiB0aGUgbW9yZQogIHBvcnRhYmxlICQoTlJPRkYpLgoKRGFuaWVsICgxMiBPY3RvYmVyKQotIERpcmsgTWFuc2tlIG1hZGUgdGhlIHNoYXJlIGxvY2tpbmcgYXJvdW5kIEROUyBsb29rdXBzIHNsaWdodGx5IGRpZmZlcmVudCB0bwogIGFsbG93IHRoZSBzaGFyZSBzeXN0ZW0ncyBETlMgbG9va3VwcyB0byBydW4gc29tZXdoYXQgbW9yZQogIGluZGVwZW5kZW50L2Zhc3Rlci4KCkRhbmllbCAoOSBPY3RvYmVyKQotIExhY2hsYW4gTydEZWEgZml4ZWQgYSByZXN1bWUgcHJvYmxlbTogIklmIEkgc2V0IENVUkxPUFRfUkVTVU1FX0ZST00sIHBlcmZvcm0KICBhbiBIVFRQIGRvd25sb2FkLCB0aGVuIHJlc2V0IENVUkxPUFRfUkVTVU1FX0ZST00gdG8gMCwgdGhlIG5leHQgZG93bmxvYWQKICBzdGlsbCBoYXMgYSBSYW5nZSBoZWFkZXIgd2l0aCBhIGdhcmJhZ2UgdmFsdWUuIiBidWcgcmVwb3J0ICM4MjA1MDIKCi0gRG9taW5pY2sgTWVnbGlvIG1hZGUgdGhlIGluZXRfcHRvbi5jIGZpbGUgYnVpbGQgZmluZSB1c2luZyBNU1ZDLgoKLSBUaGUgJ3N3cycgdGVzdCBzdWl0ZSB3ZWIgc2VydmVyIG5vdyAjaW5jbHVkZSBzZXR1cC5oIGZyb20gdGhlIGxpYiBkaXJlY3RvcnkuCiAgVGhpcyBtYWtlcyBpdCBtb3JlIHBvcnRhYmxlIGVhc2llci4KClZlcnNpb24gNy4xMC44LXByZTMgKDggT2N0b2JlciAyMDAzKQoKRGFuaWVsICg4IE9jdG9iZXIpCi0gRnJhbmsgVGljaGVsZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGZpeGVzIGhvdyBsaWJjdXJsIGNvbm5lY3RzIHRvIG11bHRpcGxlCiAgYWRkcmVzc2VzLCBpZiBvbmUgb2YgdGhlbSBmYWlscyAoSVB2NCBjb2RlKS4KCkRhbmllbCAoNyBPY3RvYmVyKQotIE5laWwgRHVuYmFyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBub3cgbWFrZXMgbGliY3VybCBjaGVjayBTU0wKICBzdWJqZWN0QWx0TmFtZXMgd2hlbiBtYXRjaGluZyBjZXJ0cy4gVGhpcyBpcyBhcHBhcmVudGx5IGRldGFpbGVkIGluIFJGQzI4MTgKICBhcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8uIEkgaGFkIHRvIGFkZCBjb25maWd1cmUgY2hlY2tzIGZvciBpbmV0X3B0b24oKSBhbmQKICBvdXIgb3duIChzdHJpY3RseSBzcGVha2luZywgY29kZSBmcm9tIEJJTkQgd3JpdHRlbiBieSBQYXVsIFZpeGllKSBwcm92aWRlZAogIGNvZGUgZm9yIHRoZSBmdW5jdGlvbiBmb3IgcGxhdGZvcm1zIHRoYXQgbWlzcyBpdC4KCi0gSFRUUCBQT1NUIHVzaW5nIHRoZSByZWFkIGNhbGxiYWNrIGRpZG4ndCB3b3JrLCBhcyBGbG9yaWFuIFNjaG9wcG1hbm4KICByZXBvcnRlZC4KCkRhbmllbCAoNSBPY3RvYmVyKQotIFNoYXJlZCBwcm92aWRlZCBhIGZldyBmaXhlcyB0byBtYWtlIGxpYmN1cmwgYnVpbGQgb24gQmVPUwogIG91dC1vZi10aGUtYm94LiBOZXcgY29kZSBmb3IgQmVPUy1zdHlsZSBub24tYmxvY2tpbmcgc29ja2V0cywgcHJvdmlkZWQgYnkKICBTaGFyZCBhbmQgSmVyZW15IEZyaWVzbmVyLiBNb2RpZmllZCB0aGUgYXV0b2NvbmYgY2hlY2sgZm9yIG5vbi1ibG9ja2luZwogIHNvY2tldHMgdG8gY2hlY2sgZm9yIHRoaXMga2luZCB0b28uCgpEYW5pZWwgKDQgT2N0b2JlcikKLSBWaW5jZW50IEJyb25uZXIgcG9pbnRlZCBvdXQgdGhhdCBpZiB5b3Ugc2V0IENVUkxPUFRfQ09PS0lFIGZvciBhIHRyYW5zZmVyCiAgYW5kIHRoZW4gc2V0IGl0IHRvIE5VTEwgaW4gYSBzdWJzZXF1ZW50IG9uZSwgdGhlIHByZXZpb3VzIGNvb2tpZSB3YXMgc3RpbGwKICBzZW50IG9mZiEKCi0gSm9uIFR1cm5lciBmaXhlZCBhIHByb2JsZW0gbGliY3VybCBoYWQgd2hlbiBpdCBmYWlsZWQgb24gYW4gRlRQIHRyYW5zZmVyIGR1ZQogIHRvIGEgYmFkIHBhdGgsIGl0IHdvdWxkIGNhdXNlIHRoZSBuZXh0IHRyYW5zZmVyIHRvIHVzZSBhIGJhZCBwYXRoIGFzIHdlbGwuCgotIFNpZGRoYXJ0aGEgUHJha2FzaCBKYWluIHByb3ZpZGVkIGEgcGF0Y2ggd2l0aCBhIGZpeCBmb3IgbGliY3VybCB3aXRoIGFyZXMsCiAgd2hlbiB3b3JraW5nIG9uIElQLW9ubHkgbmFtZXMgYXMgd2UgdGhlbiBjb3VsZCByZXR1cm4gIndhaXQiIHN0YXR1cyB3aGVuIHRoZQogIG5hbWUgaW4gZmFjdCBhbHJlYWR5IHdhcyByZXNvbHZlZC4gSSBlZGl0ZWQgdGhlIHBhdGNoIHNsaWdodGx5IHRvIG5vdCBleHBvc2UKICBhc3luY2ggZGV0YWlscyB0byBub24tYXJlcyBhd2FyZSBzb3VyY2UgY29kZS4KCkRhbmllbCAoMyBPY3RvYmVyKQotIE5laWwgU3ByaW5nIHBvc3RlZCB0aGUgZGViaWFuIGJ1ZyByZXBvcnQgIzIxMzE4MCwgYW5kIHBvaW50ZWQgb3V0IHRoYXQgdXNpbmcKICB0aGUgbmFtZSAnYWNjZXNzJyBpbiBhIGZ1bmN0aW9uIHByb3RvdHlwZSBpcyBub3QgdmVyeSB3aXNlIGFzIHNvbWUgY29tcGlsZXJzCiAgY29tcGxhaW4uCgotIFBldGVyIFN5bHZlc3RlciBwcm92aWRlZCBoaXMgYW5kIEplYW4tUGF1bCBNZXJsaW4ncyBjdXJseC5jIGV4YW1wbGUgc291cmNlCiAgY29kZSB0aGF0IHNob3dzIGhvdyB0aGV5IHVzZSBzc2wgYW5kIGNhbGxiYWNrcy4KCkRhbmllbCAoMiBPY3RvYmVyKQotIEphbWVzIE1hY01pbGxhbidzIHBhdGNoIG1ha2VzIGN1cmwgYnVpbGQgb24gUU5YIDYuMi54LgoKRGFuaWVsICgyNiBTZXB0ZW1iZXIpCi0gTXkgZGF1Z2h0ZXIgd2FzIGJvcm4hCgpEYW5pZWwgKDIzIFNlcHRlbWJlcikKLSBBZGRlZCBzdXBwb3J0IGZvciAtNC8tLWlwdjQgYW5kIC02Ly0taXB2NiB0byBmb3JjZSBuYW1lcyB0byByZXNvbHZlIHRvIHRoYXQKICBwYXJ0aWN1bGFyIElQIHZlcnNpb24uIFRoZXkgb25seSB3b3JrIGZvciBJUHY2LWVuYWJsZWQgbGliY3VybHMuCgotIGN1cmwgLVYgbm93IG91dHB1dHMgJ1NQTkVHTycgYXMgYSBmZWF0dXJlIGluIGNhc2UgbGliY3VybCB3YXMgYnVpbHQgdG8KICBzdXBwb3J0IHRoYXQuCgpWZXJzaW9uIDcuMTAuOC1wcmUyICgyMiBTZXB0ZW1iZXIgMjAwMykKCkRhbmllbCAoMjIgU2VwdGVtYmVyKQotIEdpdXNlcHBlIEF0dGFyZGkgZm91bmQgYSBzZWdmYXVsdCBpbiBsaWJjdXJsIHdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZQogIHdpdGggYXJlcyBhbmQgZG9pbmcgcmVwZWF0ZWQgb3BlcmF0aW9ucyBhZ2FpbnN0IGEgbm9uLXJlc29sdmluZyBob3N0IG5hbWUuCgpEYW5pZWwgKDE5IFNlcHRlbWJlcikKLSBBZGRlZCB0aGUgQ1VSTE9QVF9JUFJFU09MVkUgb3B0aW9uLCB0aGF0IGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBzZWxlY3QKICB3aGF0IGtpbmQgb2YgSVAgYWRkcmVzc2VzIGhlIHdhbnRzIHRvIHVzZSB3aGVuIHJlc29sdmluZyBob3N0IG5hbWVzLiBUaGlzCiAgaXMgb25seSBpbnRlcmVzdGluZyB3aGVuIHVzaW5nIGhvc3QgbmFtZXMgdGhhdCByZXNvbHZlIGFkZHJlc3NlcyB1c2luZyBtb3JlCiAgdGhhbiBvbmUgdmVyc2lvbiBvZiBJUC4KCi0gQXBwbGllZCBNYXJrdXMgTW9lbGxlcidzIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBTUE5FR08gc3VwcG9ydCBpZiBsaWJjdXJsCiAgaXMgYnVpbHQgd2l0aCB0aGUgRkJvcGVuc3NsIGxpYnJhcmllcy4gY3VybF92ZXJzaW9uX2luZm8oKSBub3cgcmV0dXJucwogIGluZm8gb24gU1BORUdPIGF2YWlsYWJpbGl0eS4gVGhlIHBhdGNoIGFsc28gbWFkZSB0aGUgR1NTQVBJIHN0dWZmIHdvcmsgZmluZQogIHdpdGggdGhlIE1JVCBHU1MtbGlicmFyeSAodGhlIEhlaW1kYWwgb25lIHN0aWxsIHdvcmtzIHRvbykuCgpEYW5pZWwgKDE2IFNlcHRlbWJlcikKLSBEb2luZyBQVVQgd2l0aCAtLWRpZ2VzdCBmYWlsZWQsIGFzIHJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzgwNTg1My4KCi0gVXNpbmcgLS1hbnlhdXRoIHRoYXQgcGlja2VkIE5UTE0sIGFuZCB0aGVuIGEgcmVkaXJlY3QgY2xvc2VkIHRoZSBjb25uZWN0aW9uCiAgYW5kIHRvb2sgY3VybCB0byBhIHNlY29uZCBOVExNIHBhZ2UgbWFkZSBjdXJsIGZhaWwuIEJ1ZyByZXBvcnQgIzgwNjMyOAogIGlkZW50aWZpZWQgdGhlIHByb2JsZW0sIHRlc3QgY2FzZSA5MCB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDE0IFNlcHRlbWJlcikKLSBjb2RlbWFzdHIgYnJvdWdodCBhIHBhdGNoIGZvciBhcmVzIHRvIG1ha2UgdGhlIFdpbmRvd3MgcG9ydGlvbnMgb2YgaXQgd29yawogIHByb3Blcmx5IG9uIE5UNC4gSSB1cGxvYWRlZCBhIG5ldyBkaWZmIGFuZCB1cGRhdGVkIHRoZSBkb2NzIG9uIHdoZXJlIHRvIGdldAogIGl0IGV0Yy4KCi0gSmVmZiBQb2hsbWV5ZXIgdHJhY2tlZCBkb3duIGEgdmVyeSBoYXJkLXRvLWZpbmQgYnVnIHdoZXJlIHdlIHJlbW92ZWQgYQogIGNhY2hlZCBETlMgZW50cnkgZXZlbiB0aG91Z2ggaXQgbWF5IGJlIGluIHVzZSwgd2hpY2ggY2F1c2VkICJyYW5kb20iIG1lbW9yeQogIHRvIGdldCBvdmVyd3JpdHRlbiBhbmQgdGh1cyAicmFuZG9tIiBjcmFzaGVzLgoKRGFuaWVsICgxMiBTZXB0ZW1iZXIpCi0gQmFzZWQgb24gYSBidWcgcmVwb3J0IGJ5IERhdmlkIEtpbWRvbiwgSSBtYWRlIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQgY2xlYXIKICBhbGwgcG9zc2libGUgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlZm9yZSB0aGUgdGVzdHMgYXJlIHJ1bi4KCi0gQnkgZGVmYXVsdCwgZWFzeSBoYW5kbGVzIHdpdGhpbiBhIG11bHRpIGhhbmRsZSBub3cgc2hhcmUgRE5TIGNhY2hlLgoKLSBUaW0gQmFydGxleSBicm91Z2h0IGEgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgR1NTTkVHT1RJQVRFIG9wdGlvbiB3b3JrIGZvcgogIE1pY3Jvc29mdCdzICJOZWdvdGlhdGUiIGF1dGhlbnRpY2F0aW9uIGFzIHdlbGwuCgpEYW5pZWwgKDExIFNlcHRlbWJlcikKLSBBIHplcm8tbGVuZ3RoIHByb3h5IHN0cmluZyBjb25mdXNlZCBGVFAgdHJhbnNmZXJzLgoKLSBCam9ybiBSZWVzZSBmb3VuZCBhIGNhc2Ugd2l0aCBhbiB1bmluaXRpYWxpemVkIHBvaW50ZXIsIG9ubHkgcHJlc2VudCB3aGVuCiAgYnVpbHQgZm9yIGFyZXMuCgpWZXJzaW9uIDcuMTAuOC1wcmUxICg4IFNlcHRlbWJlciAyMDAzKQoKRGFuaWVsICg3IFNlcHRlbWJlcikKLSBKdXJpaiBTbWFrb3YgZm91bmQgb3V0IHRoYXQgdGhlIG5vbi1PcGVuU1NMIE1ENSBjb2RlIHdhcyBub3Qgd29ya2luZyBvbgogIEFscGhhIChvciBpYTY0KS4gT25seSB0aGUgT3BlblNTTC12ZXJzaW9uIGRpZC4gSSBtYWRlIGEgZml4IEkgdGhpbmsgY29ycmVjdHMKICB0aGUgcHJvYmxlbS4KCkRhbmllbCAoNSBTZXB0ZW1iZXIpCi0gS2V2aW4gRmlzayByZXBvcnRlZCB0aGF0IGNvbmZpZ3VyZSAtLWVuYWJsZS10aHJlYWQgZGlkbid0IHdvcmsuIEkgZml4ZWQuCgotIERlLW1hY3JvZmllZCB0aGUgbGliL2hhc2guYyBzb3VyY2UgY29kZSBzb21ld2hhdC4KCkRhbmllbCAoNCBTZXB0ZW1iZXIpCi0gQ1VSTElORk9fSFRUUEFVVEhfQVZBSUwgYW5kIENVUkxJTkZPX1BST1hZQVVUSF9BVkFJTCBhZGRlZCwgQmFzZWQgb24gSm9lcmcKICBNdWVsbGVyLVRvbGsncyBwYXRjaCwKCkVhcmx5ICg0IFNlcHRlbWJlcikKLSBBZGRlZCBDVVJMT1BUX0ZUUF9SRVNQT05TRV9USU1FT1VUIC0gYWxsb3dzIHVzZXIgdG8gc2V0IHN0cmljdCB0aW1lb3V0CiAgcmVxdWlyZW1lbnRzIG9uIHRoZSBGVFAgc2VydmVyJ3MgYWJpbGl0eSB0byByZXNwb25kIHRvIGluZGl2aWR1YWwgY29tbWFuZHMKICB3aXRob3V0IHBsYWNpbmcgZ2xvYmFsIHJlcXVpcmVtZW50cyBvbiB0cmFuc2ZlciBvciBjb25uZWN0IHRpbWUuICBGaWxlcwogIGFmZmVjdGVkOgogICAgLSBpbmNsdWRlL2N1cmwvY3VybC5oCiAgICAgICAgQWRkZWQgb3B0aW9uIENVUkxPUFRfRlRQX1JFU1BPTlNFX1RJTUVPVVQKICAgIC0gbGliL2Z0cC5jCiAgICAgICAgQWRkZWQgYnJhbmNoIGluc2lkZSBDdXJsX0dldEZUUFJlc3BvbnNlIHRvIGNoZWNrIGZvcgogICAgICAgIGRhdGEtPnNldC5mdHBfcmVzcG9uc2VfdGltZW91dAogICAgLSBsaWIvdXJsLmMKICAgICAgICBNb2RpZmllZCBDdXJsX3NldG9wdCB0byByZWNvZ25pemUgQ1VSTE9QVF9GVFBfUkVTUE9OU0VfVElNRU9VVAogICAgLSBsaWIvdXJsZGF0YS5oCiAgICAgICAgQWRkZWQgZnRwX3Jlc3BvbnNlX3RpbWVvdXQgdG8gc3RydWN0IFVzZXJEZWZpbmVkCgpEYW5pZWwgKDMgU2VwdGVtYmVyKQotIFBldGVyIFBlbnRjaGV2IGZvdW5kIGFuZCBmaXhlZCB0d28gcHJvYmxlbXMgaW4gdGhlIHRlc3Qgc3VpdGUncyB3ZWIgc2VydmVyCiAgY29kZSwgdGhhdCBtYWRlIGl0IHNlZ2ZhdWx0IGF0IHRpbWVzLgoKLSBK9nJnIE11ZWxsZXItVG9sayBpbXByb3ZlZCB0aGUgcHJveHkgdXNlcitwYXNzd29yZCBoYW5kbGluZywgZXNwZWNpYWxseQogIHdoZW4gcHJvdmlkaW5nIGEgYmxhbmsgcGFzc3dvcmQuCgpEYW5pZWwgKDIgU2VwdGVtYmVyKQotIEZpeCBmb3IgbWFraW5nIENPTk5FQ1QgdG8gcHJveGllcyBkbyB0aGUgY29ycmVjdCBtYWdpYyB0byBhbGxvdyBOVExNLCBEaWdlc3QKICBhbmQgc2ltaWxhciB0byB3b3JrLgoKRGFuaWVsICgxIFNlcHRlbWJlcikKLSBIZW5yaWsgU3Rvcm5lciBtYWRlIGxpYmN1cmwgd29yayBmaW5lIHdpdGggT3BlbkxEQVAgMi4xLjIyIChjdXJyZW50KS4KCi0gSmVmZiBQb2hsbWV5ZXIgYWRkZWQgYSBwcm9wZXIgZXJyb3IgbWVzc2FnZSBmb3Igbm9uLXJlc29sdmluZyBob3N0cyB3aGVuCiAgdXNpbmcgYXJlcyBmb3IgbG9va3Vwcy4KCkRhbmllbCAoMjUgQXVndXN0KQotIEpvaG4gTWNHb3dhbiByZXBvcnRlZCB0aGF0IGN1cmwgLWsgc3RpbGwgZmFpbGVkIGlmIHRoZSBIVFRQUyBzZXJ2ZXIncyBDTgogIGZpZWxkIHdhc24ndCBvYnRhaW5hYmxlLiBUaGlzIHdhcyBkdWUgdG8gdGhlIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QgYmVpbmcKICBzZXQgdG8gMSwgYW5kIGxpYmN1cmwgZmFpbGVkIGlmIHRoZSBDTiB3YXMgbWlzc2luZy4gU3RhcnRpbmcgbm93LCBoYXZpbmcgaXQKICBzZXQgdG8gMSB3aWxsIHNpbXBseSBvdXRwdXQgYSB3YXJuaW5nIGlmIG5vIENOIGNvdWxkIGJlIG9idGFpbmVkIChhcyBoYXZpbmcKICBhIG1pc21hdGNoIGlzIE9LKS4KCkRhbmllbCAoMjEgQXVndXN0KQotIFZpbmNlbnQgU2FuZGVycyBwcm92aWRlZCBhIGZpeCBmb3IgbmFtZSByZXNvbHZpbmcgd2hlbiBsaW5rZWQgd2l0aCB1Q2xpYmMuCgpEYW5pZWwgKDIwIEF1Z3VzdCkKLSBHZXJkIHYuIEVnaWR5IHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyBsaWJjdXJsIHN0b3JlIHRoZSBGVFAgcmVzcG9uc2UKICBjb2RlIGZyb20gZnRwIHNlcnZlcnMuIFVzaW5nIGN1cmxfZWFzeV9nZXRpbmZvKCkgd2l0aCBDVVJMSU5GT19IVFRQX0NPREUKICByZXR1cm5zIHRoYXQgZGF0YS4gVGhlIG9wdGlvbiBpcyB0aGVyZWZvcmUgbm93IGFsc28ga25vd24gYXMKICBDVVJMSU5GT19SRVNQT05TRV9DT0RFLgoKLSBBbnRvaW5lIENhbGFuZG8gZm91bmQgYSBzZWdmYXVsdCB3aGVuIGRvaW5nIG11bHRpLXBhcnQvZm9ybXBvc3QgdXNpbmcKICB0aGUgbXVsdGkgaW50ZXJmYWNlLgoKLSBBbnRvaW5lIENhbGFuZG8gcG9pbnRlZCBvdXQgdGhhdCBjdXJsX211bHRpX2luZm9fcmVhZCgpIGRpZG4ndCBzZXQgdGhlCiAgbXNnc19pbl9xdWV1ZSB0byAwIHByb3Blcmx5IHdoZW4gcmV0dXJuaW5nIE5VTEwuCgpEYW5pZWwgKDE5IEF1Z3VzdCkKLSBJIG1hZGUgY3VybCBzdXBwb3J0IG11bHRpcGxlIC1UIG9wdGlvbnMsIGFzIHdlbGwgYXMgLVQgIntmaWxlMSxmaWxlMn0iCiAgc3R5bGUgZ2xvYmJpbmcuIE9uZSAtVCBmb3IgZWFjaCBVUkwgaXMgc3VwcG9ydGVkLgoKLSBKZWZmIFBvaGxtZXllciBmb3VuZCBhIHNlZ2ZhdWx0IHdoZW4gdXNpbmcgYXJlcy1lbmFibGVkIGxpYmN1cmwgYW5kIHRoZQogIG11bHRpIGludGVyZmFjZSB3aGVuIHRyeWluZyBhIG5vbi1leGlzdGluZyBob3N0IG5hbWUuCgotIE1hZGUgdGhlIGxpYmN1cmwgcHJpbnRmIGNvZGUgc3VwcG9ydCBsb25nIGxvbmdzIGlmIGF2YWlsYWJsZS4KCi0gTG9yZW4gS2lya2J5IHBvaW50ZWQgb3V0IHRoYXQgd2UgZGlkIG5vdCBjbGVhbiB1cCBhbGwgU1NMLWFsbG9jYXRlZCBtZW1vcnkKICBpbiBjdXJsX2dsb2JhbF9jbGVhbnVwKCkuCgpEYW5pZWwgKDE3IEF1Z3VzdCkKLSBTZXR0aW5nIENVUkxPUFRfV1JJVEVGVU5DVElPTiBvciBDVVJMT1BUX1JFQURGVU5DVElPTiB0byBOVUxMIHdpbGwgbm93IG1ha2UKICB0aGVtIGdldCB0aGUgaW50ZXJuYWwgZGVmYXVsdHMgcmVzdG9yZWQuIFByZXZpb3VzbHkgdGhpcyBjb3VsZCBjYXVzZSBhCiAgc2VnZmF1bHQuIFdlIHNob3VsZCBhaW0gYXQgaGF2aW5nIGFsbCBwb2ludGVyLXJlbGF0ZWQgb3B0aW9ucyBnZXQgcmVzdG9yZWQKICB0byBkZWZhdWx0L3NhZmUgdmFsdWVzIHdoZW4gc2V0IHRvIE5VTEwuCgpWZXJzaW9uIDcuMTAuNyAoMTUgQXVndXN0IDIwMDMpCgpEYW5pZWwgKDE0IEF1Z3VzdCkKLSBJIG1vZGlmaWVkIHRoZSBtZW1kZWJ1ZyBzeXN0ZW0gdG8gcmV0dXJuIGZhaWx1cmUgb24gbWVtb3J5IGFsbG9jYXRpb24KICBmdW5jdGlvbnMgYWZ0ZXIgYSBzZXQgYW1vdW50IG9mIHN1Y2Nlc3NmdWwgb25lcy4gVGhpcyBlbmFibGVzIHVzIHRvIHRlc3QKICBvdXQtb2YtbWVtb3J5IHNpdHVhdGlvbnMgaW4gYSBjb250cm9sbGVkIG1hbm5lciBhbmQgd2UgY2FuIG1ha2Ugc3VyZSB0aGF0CiAgY3VybC9saWJjdXJsIGJlaGF2ZXMgZ29vZCBpbiB0aG9zZS4KCiAgVGhpcyBtYWRlIG1lIGZpbmQgYW5kIGZpeCBzZXZlcmFsIHNwb3RzIHdoZXJlIHdlIGRpZCBub3QgY2xlYW51cCBwcm9wZXJseQogIHdoZW4gYmFpbGluZyBvdXQgZHVlIHRvIGVycm9ycyAobG93IG1lbW9yeSkuCgotIENvcnJlY3RlZCB0ZXN0IGNhc2UgNzQuIE1hZGUgdXNpbmcgLW8gd2l0aCBiYWQgI1tudW1dIGNvZGVzIGNvbXBsYWluIGFuZAogIGJhaWwgb3V0LiBNYWRlICNbbnVtXSBzdXBwb3J0IG51bWJlcnMgbGFyZ2VyIHRoYW4gOSBhcyB3ZWxsLiBBZGRlZCB0ZXN0CiAgY2FzZSA4NiBmb3IgYSBwcm9wZXIgcmFuZ2UgZ2xvYmJpbmcgdGVzdCBhcyB3ZWxsLgoKVmVyc2lvbiA3LjEwLjctcHJlNCAoMTIgQXVndXN0IDIwMDMpCgpEYW5pZWwgKDEyIEF1Z3VzdCkKLSBjdXJsX3ZlcnNpb25faW5mbygpIG5vdyByZXR1cm5zIGEgZmxhZyBpZiBsaWJjdXJsIHdhcyBidWlsdCB3aXRoIGFzeW5jaCBETlMKICBzdXBwb3J0LCBhbmQgdGhpcyBpcyBub3cgYWxzbyBkaXNwbGF5ZWQgd2l0aCAnY3VybCAtVicuCgotIEFkZGVkIGEgZmV3IG5ldyBtYW4gcGFnZXMgdG8gdGhlIGRvY3MvbGliY3VybCBkaXI6IGN1cmxfc2hhcmVfaW5pdCwKICBjdXJsX3NoYXJlX3NldG9wdCwgY3VybF9zaGFyZV9jbGVhbnVwLCBsaWJjdXJsLWVhc3kgYW5kIGxpYmN1cmwtc2hhcmUuCgpEYW5pZWwgKDExIEF1Z3VzdCkKLSBNaWtlIENoZXJlcG92IG1hZGUgdGhlIGxvY2FsIGJpbmRpbmcgY29kZSB3b3JrIGZvciBXaW5kb3dzLCB3aGljaCBtYWtlcwogIHRoZSBvcHRpb24gQ1VSTE9QVF9JTlRFUkZBQ0Ugd29yayBvbiBXaW5kb3dzIGFzIHdlbGwuCgotIFZpbmNlbnQgU2FuZGVycyB1cGRhdGVkIHRoZSBmb3Blbi5jIGV4YW1wbGUgY29kZSBhIGxvdC4KCi0gLS1wcm94eS1udGxtIGlzIG5vdyBzdXBwb3J0ZWQgYnkgdGhlIGN1cmwgdG9vbC4gSXQgZm9yY2VzIHRoZSBwcm94eQogIGF1dGhlbnRpY2F0aW9uIHRvIGJlIG1hZGUgdXNpbmcgTlRMTS4gSXQgZG9lcyBub3QgeWV0IHdvcmsgZm9yIEhUVFBTIG92ZXIKICBwcm94aWVzIChvciBvdGhlciBwcm94eS10dW5uZWxpbmcgb3B0aW9ucykuIFRlc3QgY2FzZSA4MSBhbmQgODIgZG8gc29tZQogIHNpbXBsZSBpbml0aWFsIG50bG0gdGVzdGluZy4KCi0gRm91bmQgYW5kIGZpeGVkIGEgbWlub3IgbWVtb3J5IGxlYWsgb24gcmUtdXNlZCBjb25uZWN0aW9ucyB3aXRoCiAgcHJveHktYXV0aGVudGljYXRpb24uCgotIEkgcmVtb3ZlZCAtQCBhbmQgLVogYXMgdmFsaWQgc2hvcnQgb3B0aW9ucy4gVGhleSB3ZXJlIHZlcnkgcmFyZWx5IHVzZWQgKEAKICB3YXNuJ3QgZXZlbiBkb2N1bWVudGVkKS4KCi0gU2VyZ2UgU2VtYXNoa28gaW50cm9kdWNlZCBDVVJMT1BUX1BST1hZQVVUSCwgYW5kIG1ha2UgaXQgd29yayB3aGVuIHNldCB0bwogIENVUkxBVVRIX05UTE0gYW5kL29yIENVUkxBVVRIX0JBU0lDLiBUaGUgUFJPWEFVVEggaXMgc2ltaWxhciB0byBIVFRQQVVUSCwKICBidXQgaXMgZm9yIHRoZSBwcm94eSBjb25uZWN0aW9uIG9ubHksIGFuZCBIVFRQQVVUSCBpcyBmb3IgdGhlIHJlbW90ZSBob3N0LgoKLSBGaXhlZCBsb2FkaW5nIG9mIGNvb2tpZXMgd2l0aCBibGFuayBjb250ZW50cyBmcm9tIGEgY29va2llIGphci4gQWxzbyBtYWRlIHRoZQogIGNvb2tpZSBmdW5jdGlvbnMgaW5mb3JtIG9uIGFkZGVkIGFuZCBza2lwcGVkIGNvb2tpZXMgKGZvciBjb29raWUgZGVidWdnaW5nKS4KClZlcnNpb24gNy4xMC43LXByZTMgKDggQXVndXN0IDIwMDMpCgpEYW5pZWwgKDggQXVndXN0KQotIEFwcGxpZWQgRGF2aWQgQnlyb24ncyBmaXggZm9yIGZpbGU6Ly8gVVJMcyB3aXRoIGRyaXZlIGxldHRlcnMgaW5jbHVkZWQuCgotIEkgYWRkZWQgdGhlIC0tZnRwLWNyZWF0ZS1kaXJzIHRvIHRoZSBjbGllbnQgY29kZSwgd2hpY2ggYWN0aXZhdGVzIEVhcmx5J3MKICBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTIG9wdGlvbiwgYW5kIHdyb3RlIHRlc3QgY2FzZSAxNDcgdG8gdmVyaWZ5CiAgaXQuIEFkZGVkIHRoZSBvcHRpb24gdG8gdGhlIGN1cmwuMSBtYW4gcGFnZSB0b28uIEFkZGVkIHRoZSBvcHRpb24gdG8gdGhlCiAgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlIHRvby4KCkRhbmllbCAoNyBBdWd1c3QpCi0gVGVzdCBjYXNlIDYwIGZhaWxlZCBvbiBpYTY0IGFuZCBBTUQgT3B0ZXJvbi4gRml4ZWQgbm93LgoKLSBGaXhlZCBhIHByaW50ZiBwcm9ibGVtIHRoYXQgcmVzdWx0ZWQgaW4gdXJsZ2xvYmJpbmcgYnVncyAoYnVnICMyMDM4MjcgaW4gdGhlCiAgZGViaWFuIGJ1ZyB0cmFja2VyKS4gQWRkZWQgdGVzdCBjYXNlIDc0IHRvIHZlcmlmeSB0aGUgZml4IGFuZCB0byBkaXNjb3ZlciBpZgogIHRoaXMgYnJlYWtzIGluIHRoZSBmdXR1cmUuCgotICJtYWtlIGRpc3RjaGVjayIgd29ya3MgYWdhaW4uCgpWZXJzaW9uIDcuMTAuNy1wcmUyICg2IEF1Z3VzdCAyMDAzKQoKRGFuaWVsICg1IEF1Z3VzdCkKLSBEdW5jYW4gV2lsY294IGhlbHBlZCBtZSB2ZXJpZnkgdGhhdCB0aGUgbGF0ZXN0IGluY2FybmF0aW9uIG9mIG15IGFyZXMgcGF0Y2gKICBidWlsZHMgZmluZSBvbiBNYWMgT1MgWCAoc2VlIHRoZSBuZXcgbGliL1JFQURNRS5hcmVzKSBmaWxlIGZvciBhbGwgZGV0YWlscy4KCi0gU2FsdmF0b3JlIFNvcnJlbnRpbm8gZmlsZWQgYnVnIHJlcG9ydCAjNzgzMTE2IGFuZCBFYXJseSBFaGxpbmdlciBwb3N0ZWQgYQogIGJ1ZyByZXBvcnQgdG8gdGhlIGxpYmN1cmwgbGlzdCwgYm90aCBpZGVudGlmeWluZyBhIHByb2JsZW0gd2l0aCBGVFAKICBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGFuZCBob3cgdGhlIGRpciBoaWVyYXJjaHkgd2FzIG5vdCBwcm9wZXJseSByZXNldAogIGJldHdlZW4gZmlsZXMuCgotIERhdmlkIEJ5cm9uJ3MgdGhvdWdodHMgb24gYSBmaXhlZCBNYWtlZmlsZSBpbiB0ZXN0cy8gd2VyZSBhcHBsaWVkLgoKLSBKYW4gU3VuZGluIHJlcG9ydGVkIGEgY2FzZSB3aGVyZSBjdXJsIGlnbm9yZWQgYSBjb29raWUgdGhhdCBicm93c2VycyBkb24ndCwKICB3aGljaCB0dXJuZWQgdXAgdG8gYmUgZHVlIHRvIHRoZSBudW1iZXIgb2YgZG90cyBpbiB0aGUgJ2RvbWFpbicuIEkndmUgbm93CiAgbWFkZSBjdXJsIGZvbGxvdyB0aGUgdGhlIG9yaWdpbmFsIG5ldHNjYXBlIGNvb2tpZSBzcGVjIGxlc3Mgc3RyaWN0IG9uIHRoYXQKICBwYXJ0LgoKRGFuaWVsICg0IEF1Z3VzdCkKLSBEaXJrIE1hbnNrZSBhZGRlZCBjb29raWUgc3VwcG9ydCBmb3IgdGhlIGV4cGVyaW1lbnRhbCwgaGlkZGVuIGFuZCBzdGlsbAogIHVuZG9jdW1lbnRlZCBzaGFyZSBmZWF0dXJlIQoKLSBNYXJrIEZsZXRjaGVyIHByb3ZpZGVkIGFuIGV4Y2VsbGVudCBidWcgcmVwb3J0IHRoYXQgaWRlbnRpZmllZCBhIHByb2JsZW0KICB3aXRoIEZPTExPV0xPQ0FUSU9OIGFuZCBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nLCBhcyBsaWJjdXJsIHdvdWxkIG5vdAogIHByb3Blcmx5IGlnbm9yZSB0aGUgYm9keSBjb250ZW50cyBvZiAzWFggcmVzcG9uc2UgdGhhdCBpbmNsdWRlZCB0aGUKICBMb2NhdGlvbjogaGVhZGVyLgoKRWFybHkgKDYgQXVndXN0KQotIEFkZGVkIG9wdGlvbiBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTCiAgICBUaGlzIG9wdGlvbiB3aWxsIGZvcmNlIHRoZSB0YXJnZXQgZmlsZSdzIHBhdGggdG8gYmUgY3JlYXRlZCBpZiBpdAogICAgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBvbiB0aGUgcmVtb3RlIHN5c3RlbS4KCiAgRmlsZXMgYWZmZWN0ZWQ6CiAgICAtIGluY2x1ZGUvY3VybC9jdXJsLmgKICAgICAgICBBZGRlZCBvcHRpb24gQ1VSTE9QVF9GVFBfQ1JFQVRFX01JU1NJTkdfRElSUwogICAgLSBsaWIvZnRwLmMKICAgICAgICBBZGRlZCBmdW5jdGlvbiBmdHBfbWtkLCB3aGljaCBpc3N1ZXMgYSBNS0QgY29tbWFuZAogICAgICAgIEFkZGVkIGZ1bmN0aW9uIGZ0cF9mb3JjZV9jd2QsIHdoaWNoIGF0dGVtcHRzIGEgQ1dELAogICAgICAgICAgYW5kIGRvZXMgYSBNS0QgYW5kIHJldHJpZXMgdGhlIENXRCBpZiB0aGUgb3JpZ2luYWwgQ1dECiAgICAgICAgICBmYWlscwogICAgICAgIE1vZGlmaWVkIGZ0cF9wZXJmb3JtKCkgdG8gY2FsbCBpdHMgY2hhbmdlIGRpcmVjdG9yeSBmdW5jdGlvbgogICAgICAgICAgdGhyb3VnaCBhIHBvaW50ZXIuICBUaGUgcG9pbnRlciBwb2ludHMgdG8gZnRwX2N3ZCBieSBkZWZhdWx0LAogICAgICAgICAgYW5kIGlzIG1vZGlmaWVkIHRvIHBvaW50IHRvIGZ0cF9mb3JjZV9jd2QgSUZGCiAgICAgICAgICBkYXRhLT5zZXQuZnRwX2NyZWF0ZV9taXNzaW5nX2RpcnMgaXMgbm90IDAuCiAgICAtIGxpYi91cmwuYwogICAgICAgIE1vZGlmaWVkIEN1cmxfc2V0b3B0IHRvIHJlY29nbml6ZSBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTCiAgICAtIGxpYi91cmxkYXRhLmgKICAgICAgICBBZGRlZCBmdHBfY3JlYXRlX21pc3NpbmdfZGlycyB0byBzdHJ1Y3QgVXNlckRlZmluZWQKCi0gTWlub3IgQnVnZml4IGZvciBDVVJMT1BUX1RJTUVDT05ESVRJT04gd2l0aCBGVFAgLSBpZiB0aGUgZmlsZSB3YXMgbm90CiAgcHJlc2VudCB0byBkbyB0aGUgdGltZSBjb21wYXJpc29uLCBpdCB3b3VsZCBmYWlsLgogIEZpbGVzIGFmZmVjdGVkOgogICAgLSBsaWIvZnRwLmMKICAgICAgICBJbiBmdHBfcGVyZm9ybSgpLCB0aGUgY2FsbCB0byBmdHBfZ2V0ZmlsZXRpbWUoKSB1c2VkIHRvIGJlIGZvbGxvd2VkCiAgICAgICAgYnkKCSAgaWYgKHJlc3VsdCkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICBBbmQgdGhlbiBieSB0aGUgY29kZSB0aGF0IGFjdHVhbGx5IGRpZCB0aGUgdGltZSBjb21wYXJpc29uLgogICAgICAgIFRoZSBjb2RlIHRoYXQgZGlkIHRoZSBjb21wYXJpc29uIGhhbmRsZWQgdGhlIGNhc2Ugd2hlcmUgdGhlIGZpbGV0aW1lCiAgICAgICAgd2FzIG5vdCBhdmFpbGFibGUgKGFzIGluZGljYXRlZCBieSBpbmZvLmZpbGV0aW1lIDwgMCBvciBzZXQudGltZXZhbHVlCiAgICAgICAgPCAwKSwgc28gSSByZXBsYWNlZCB0aGUgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdCB3aXRoIGEgc3dpdGNoKHJlc3VsdCkKICAgICAgICB0aGF0IGFsbG93cyBDVVJMRV9GVFBfQ09VTEROVF9SRVRSX0ZJTEUgdG8gZmFsbCB0aHJvdWdoIHRvIHRoZQogICAgICAgIG5vcm1hbCB0aW1lIGNvbXBhcmlzb24uCgpEYW5pZWwgKDMgQXVndXN0KQotIFdoZW4gcHJveHkgYXV0aGVudGljYXRpb24gaXMgdXNlZCBpbiBhIENPTk5FQ1QgcmVxdWVzdCAoYXMgdXNlZCBmb3IgYWxsIFNTTAogIGNvbm5lY3RzIGFuZCBvdGhlcndpc2UgZW5mb3JjZWQgdHVubmVsLXRocnUtcHJveHkgcmVxdWVzdHMpLCB0aGUgc2FtZQogIGF1dGhlbnRpY2F0aW9uIGhlYWRlciBpcyBhbHNvIHdyb25nbHkgc2VudCB0byB0aGUgcmVtb3RlIGhvc3QuCgogIFRoaXMgaXMgYSByYXRoZXIgc2lnbmlmaWNhbnQgaW5mbyBsZWFrLiBJJ3ZlIGZpeGVkIGl0IG5vdyBhbmQgbWFpbGVkIGEgcGF0Y2gKICBhbmQgd2FybmluZyB0byB0aGUgbWFpbGluZyBsaXN0cy4KCkRhbmllbCAoMSBBdWd1c3QpCi0gRGF2aWQgQnlyb24gcHJvdmlkZWQgYSBwYXRjaCB0byBtYWtlIDcuMTAuNiBidWlsZCBjb3JyZWN0bHkgd2l0aCB0aGUKICBjb21wcmVzc2VkIGh1Z2VoZWxwLmMgc291cmNlIGZpbGUuCgpWZXJzaW9uIDcuMTAuNy1wcmUxICgzMSBKdWx5IDIwMDMpCgpEYW5pZWwgKDMwIEp1bHkpCi0gSvZyZyBN/GxsZXItVG9sayB1cGRhdGVkIHRoZSBWQyBtYWtlZmlsZS4KCi0gRGFuaWVsIE5vZ3Vlcm9sIG1hZGUgdGhlIGZ0cCBjb2RlIG91dHB1dCAiQWNjZXB0LVJhbmdlczogYnl0ZXMiIGluIHNpbWlsYXIKICBzdHlsZSBsaWtlIG90aGVyIGZha2VkIEhUVFAgaGVhZGVycyB3aGVuIE5PQk9EWSBhbmQgSEVBREVSIGFyZSB1c2VkLiBJCiAgdXBkYXRlZCB0d28gY29ycmVzcG9uZGluZyB0ZXN0IGNhc2VzIHRvby4KCi0gTWFydHkgS3VocnQgcG9pbnRlZCBvdXQgYSBjb21waWxhdGlvbiBwcm9ibGVtIG9uIFZNUyBkdWUgdG8gbXkgaGF2aW5nCiAgY2hhbmdlZCBhIHR5cGUgZnJvbSBsb25nIHRvIHRpbWVfdCwgYW5kIEknbSBub3cgY2hhbmdpbmcgaXQgYmFjayB0byB3b3JrCiAgbW9yZSBwb3J0YWJseS4uLgoKICBIZSBhbHNvIGluZGljYXRlZCB0aGF0IGRpc3RyaWJ1dGluZyB0aGUgc3JjL2h1Z2VoZWxwLmMgaW4gYSBjb21wcmVzc2VkIHN0YXRlCiAgbGlrZSBJIGFjY2lkZW50YWxseSBkaWQgbWF5IG5vdCBiZSB0aGUgc21hcnRlc3QgbW92ZS4uLiBJJ3ZlIG5vdyBmaXhlZCB0aGUKICBkaXN0cmlidXRlIHByb2NlZHVyZSB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGFuIHVuY29tcHJlc3NlZCB2ZXJzaW9uIHdoZW4gSQogIG1ha2UgcmVsZWFzZSBhcmNoaXZlcy4KCkRhbmllbCAoMjkgSnVseSkKLSBHaXNsZSBWYW5lbSBicm91Z2h0IGNoYW5nZXMgdG8gdGhlIG1raGVscCBzY3JpcHQgZm9yIHRoZSBnZW5lcmF0aW9uIG9mIHRoZQogIGNvbXByZXNzZWQgaGVscCB0ZXh0IG9uIHNvbWUgcGxhdGZvcm1zLgoKVmVyc2lvbiA3LjEwLjYgKDI4IEp1bHkgMjAwMykKCkRhbmllbCAoMjggSnVseSkKLSBGcmFu529pcyBQb25zIGJyb3VnaHQgYSBwYXRjaCB0aGF0IG9uY2UgYWdhaW4gbWFkZSBjdXJsIGRlYWwgd2l0aCBmdHAgYW5kCiAgImRvdWJsZSBzbGFzaCIgYXMgaW5kaWNhdGluZyB0aGUgcm9vdCBkaXJlY3RvcnkuIEluIHRoZSBSRkMxNzM4LWZpeCBvZiBBcHJpbAogIDMwLCB0aGF0IGFiaWxpdHkgd2FzIHJlbW92ZWQgKHNpbmNlIGl0IGlzIG5vdCB0aGUgInJpZ2h0IiB3YXkpLiBTbywgc3RhcnRpbmcKICBub3cgd2UgY2FuIGxpc3QgdGhlIHJvb3QgZGlyIG9mIGFuIGZ0cCBzZXJ2ZXIgYm90aCB0aGVzZSB3YXlzOgoKICAgIGN1cmwgZnRwOi8vc2VydmVyLmNvbS8lMmYgIGFzIHdlbGwgYXMKICAgIGN1cmwgZnRwOi8vc2VydmVyLmNvbS8vCgpEYW5pZWwgKDI0IEp1bHkpCi0gSGVucnkgQmxhbmQgcG9pbnRlZCBvdXQgdGhhdCB3ZSBpbmNsdWRlZCBzeXMvcmVzb3VyY2UuaCB3aXRob3V0IGdvb2QgcmVhc29uCiAgaW4gc2V2ZXJhbCBzb3VyY2UgZmlsZXMuIFdpdGhvdXQgaXQgaW5jbHVkZWQsIFFOWCBidWlsZHMgYmV0dGVyLi4uCgotIEFuZHLpcyBHYXJj7WEgdXBkYXRlZCB0aGUgbWluZ3cgbWFrZWZpbGVzLgoKRGFuaWVsICgyMyBKdWx5KQotIFRyYWN5IEJvZWhyZXIgZXhwZXJpZW5jZWQgRE5TIGNhY2hlIHByb2JsZW1zIGFuZCBkaWQgc29tZSBuaWNlIGRlYnVnZ2luZwogIGFuZCB0cmFja2luZyB3aGljaCBtYWRlIGl0IGVhc3kgZm9yIG1lIHRvIGNvcnJlY3QgdGhlIHByb2JsZW0gYW5kIFRyYWN5CiAgY291bGQgdmVyaWZ5IHRoYXQgaXQgZGlkIGN1cmUgdGhlIHByb2JsZW0hIFdoZW4gcmUtdXNpbmcgYSBjb25uZWN0aW9uIHdlCiAgbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCByZS11c2UgdGhlICdjb25uZWN0X2FkZHInIHN0cnVjdC4KCi0gRGFuaWVsIEtvdXJpbCBjb3JyZWN0ZWQgdGhlIEdTUy1OZWdvdGlhdGUgY29kZS4KCi0gSnVhbiBGLiBDb2RhZ25vbmUgcHJvdmlkZWQgZml4ZXMgdG8gYWxsb3cgY3VybCB0byBidWlsZCBmaW5lIG9uIFdpbmRvd3MKICBhZ2Fpbi4KCkRhbmllbCAoMjIgSnVseSkKLSBFZGl0ZWQgdGhlIGN1cmwvY3VybC5oIGluY2x1ZGUgZmlsZSB0byBidWlsZCBvbiBXaW5kb3dzIHByb3Blcmx5LgoKRGFuaWVsICgyMSBKdWx5KQotIE1vdmVkIHRoZSBwcm94eSBjcmVkZW50aWFscyBmcm9tIHRoZSBTZXNzaW9uSGFuZGxlIHN0cnVjdCB0byB0aGUgY29ubmVjdGRhdGEKICBzdHJ1Y3QsIHRvIG1ha2UgbXVsdGlwbGUgcHJveHkgY29ubmVjdGlvbnMgd2l0aCBkaWZmZXJlcmVudCB1c2VyIG5hbWVzIHdvcmsuCgotIEFkanVzdGVkIHRoZSBOVExNIGNvZGUgdG8gc3VwcG9ydCBwcm94eSBmdW5jdGlvbmFsaXR5LgoKLSBNYWRlIHRoZSBrcmI0IHN0dWZmIGNvbXBpbGUgd2l0aCB0aGUgdXNlcitwYXNzd29yZCBmaWVsZHMgbW92ZWQuCgpWZXJzaW9uIDcuMTAuNi1wcmU0ICgyMSBKdWx5IDIwMDMpCgpEYW5pZWwgKDIwIEp1bHkpCi0gRGF2aWQgR2FyZG5lciBwb2ludGVkIG91dCBpbiBidWcgcmVwb3J0IDc3MDc1NSB0aGF0IHVzaW5nIHRoZSBGVFAgY29tbWFuZAogIENXRCB3aXRoIGEgYmxhbmsgYXJndW1lbnQgaXMgYSBiYWQgaWRlYSBhbmQgSSBtYWRlIGxpYmN1cmwgc2tpcCBlbXB0eSBwYXRoCiAgc2VnbWVudHMgc3RhcnRpbmcgbm93LgoKRGFuaWVsICgxOCBKdWx5KQotIENyaXMgcG9pbnRlZCBvdXQgdGhhdCBteSBmaXggb24gSnVseSAxNnRoIGRpZG4ndCB3b3JrIGZ1bGx5LiBIaXMgcG9pbnRpbmcKICBvdXQgdGhpcyAoYW5kIGhpcyBwYXRjaCkgYWxzbyBtYWRlIG1lIHJlYWxpemUgdGhhdCB3ZSBoYXZlIGEgdmVyeSBzaW1pbGFyCiAgYnVnIGluIHRoZSBGVFAgY29ubmVjdGlvbiByZS11c2UgY29kZS4gV2UgbXVzdCBzdG9yZSBhIHNlcGFyYXRlIHVzZXIgYW5kCiAgcGFzc3dvcmQgZmllbGQgZm9yIGVhY2ggY29ubmVjdGlvbiB3ZSBrZWVwIChhdCBsZWFzdCBmb3IgRlRQIGFuZCBIVFRQK05UTE0KICBjb25uZWN0aW9ucywgc28gSSBtYWRlIHVzIGRvIHRoaXMgdW5jb25kaXRpb25hbGx5KS4KCi0gU2luY2UgTlRMTSBhdXRoZW50aWNhdGVzIGNvbm5lY3Rpb25zIGluc3RlYWQgb2Ygc2luZ2xlIHJlcXVlc3RzLCBJIGhhZCB0bwogIHJlLWFycmFuZ2UgaG93IHdlIHN0b3JlIHRoZSBOVExNIGRhdGEgYW5kIEkgaGFkIHRvIGltcHJvdmUgdGhlIHRlc3Qgc3VpdGUgdG8KICBmaW5hbGx5IHdvcmsgcHJvcGVybHkgd2l0aCBwZXJzaXN0ZW5jeSB0byBtYWtlIHRoZSBOVExNIHRlc3RzIHJ1biBmaW5lCiAgYWdhaW4uIFRoaXMgYWxzbyBmb3JjZWQgbWUgdG8gaGF2ZSB0byB1cGRhdGUgbG90cyBvZiBIVFRQIHRlc3QgY2FzZXMuCgpEYW5pZWwgKDE2IEp1bHkpCi0gQ3JpcyBCYWlsaWZmJ3MgYnVnIHJlcG9ydCA3NjgyNzUgcG9pbnRlZCBvdXQgdGhhdCB1c2luZyBCYXNpYyBhdXRoIHdpdGgKICB3cm9uZyB1c2VyK3Bhc3N3b3JkIGNhdXNlZCBhbiBlbmRsZXNzIGxvb3AuIEZpeGVkIG5vdy4gSGUgYWxzbyBmb3VuZCBvdXQgdGhhdAogIHdlIGRpZG4ndCBwcm9wZXJseSBhdXRoZW50aWNhdGUgY29ubmVjdGlvbnMgd2l0aCBOVExNLiBGaXhlZCB0b28uCgotIERhbiBXaW5zaGlwIHByb3ZpZGVkIGZpeGVzIGZvciB0aGUgTlRMTSBjb2RlLgoKRGFuaWVsICg1IEp1bHkpCi0gRG91ZyBLYXVmbWFuIHByb3ZpZGVkIGFkZGl0aW9uYWwgZml4ZXMgZm9yIHRoZSBET1MgcG9ydC4KCkRhbmllbCAoNCBKdWx5KQotIFJpY2sgUmljaGFyZHNvbiBwb2ludGVkIG91dCB0aGF0IHVzaW5nIHNldHZidWYoKSB0byBhY2hpZXZlIG5vbi1idWZmZXJpbmcKICBvbiBvdXRwdXQgaXMgbm8tZ29vZCBmb3IgU0NPIFhlbml4IGFuZCBvdGhlciB1bml4ZXMuIFdlIHN3aXRjaGVkIG92ZXIgdG8KICB1c2luZyBwbGFpbiBmZmx1c2goKSBpbnN0ZWFkLgoKLSBEYW4gR3JheXNvbiBwb2ludGVkIG91dCB0aGF0IHdlIHNldCB0aGUgQ1VSTF9DQV9CVU5ETEUgdmFyaWFibGUgd3JvbmdseSBpbgogIHRoZSBjb25maWd1cmUgc2NyaXB0LCBhbmQgSSBoYWQgdG8gY2hhbmdlIHNvbWUgYnVpbGQgc3R1ZmYgdG8gbWFrZSB0aGUgbmV3CiAgd2F5IHdvcmsuCgotIFBldGVyIFN5bHZlc3RlcidzIHBhdGNoIHdhcyBhcHBsaWVkIHRoYXQgaW50cm9kdWNlcyB0aGUgZm9sbG93aW5nOgoKICAgQ1VSTE9QVF9TU0xfQ1RYX0ZVTkNUSU9OIHRvIHNldCBhIGNhbGxiYWNrIHRoYXQgZ2V0cyBjYWxsZWQgd2l0aCB0aGUKICAgT3BlblNTTCdzIHNzbF9jdHggcG9pbnRlciBwYXNzZWQgaW4gYW5kIGFsbG93IGEgY2FsbGJhY2sgdG8gYWN0IG9uIGl0LiBJZgogICBhbnl0aGluZyBidXQgQ1VSTEVfT0sgaXMgcmV0dXJuZWQsIHRoYXQgd2lsbCBhbHNvIGJlIHJldHVybmVkIGJ5IGxpYmN1cmwKICAgYWxsIHRoZSB3YXkgYmFjay4gSWYgdGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBDVVJMT1BUX1VSTCwgbGliY3VybCB3aWxsCiAgIGRldGVjdCB0aGlzIGFuZCBpbnN0ZWFkIGdvIHVzZSB0aGUgbmV3IFVSTC4KCiAgIENVUkxPUFRfU1NMX0NUWF9EQVRBIGlzIGEgcG9pbnRlciB5b3Ugc2V0IHRvIGdldCBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIHNldAogICB3aXRoIENVUkxPUFRfU1NMX0NUWF9GVU5DVElPTi4KCkRhbmllbCAoMSBKdWx5KQotIERhdmlkIEJ5cm9uIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBhbGxvd3MgYSBjbGllbnQgdG8gcXVpdCB0aGUgdGVzdCBzdWl0ZSdzCiAgSFRUUCBzZXJ2ZXIuCgotIEdpc2xlIFZhbmVtIGZvdW5kIGFuZCBwYXRjaGVkIGEgbGliIGhhbmRsZSBsZWFrIGluIHRoZSBsZGFwIGNvZGUuCgpEYW5pZWwgKDI1IEp1bmUpCi0gTW9yZSBOVExNLWltcHJvdmVtZW50cy4gTGVzcyBjb2RlLiBTbWFsbGVyIHBhY2tldHMgYmFjayBhbmQgZm9ydGguCgpEYW5pZWwgKDIzIEp1bmUpCi0gRXJpYyBHbGFzcyBwcm92aWRlZCB1cyB3aXRoIGEgYmV0dGVyIGRvYyBvbiBOVExNIGRldGFpbHMsIGFuZCBJIGFkZGVkIG1vcmUKICBjb21tZW50cyBhbmQgY2xhcmlmaWVkIHRoZSBjdXJyZW50IGNvZGUgbW9yZS4gVXNpbmcgdGhlIG5ldyBrbm93bGVkZ2UsIHdlCiAgc2hvdWxkIGJlIGFibGUgdG8gbWFrZSB0aGUgTlRMTSBzdHVmZiB3b3JrIGV2ZW4gYmV0dGVyLgogIEVyaWMncyBvcmlnaW5hbCBVUkw6IGh0dHA6Ly9kYXZlbnBvcnQuc291cmNlZm9yZ2UubmV0L250bG0uaHRtbAogIFZlcnNpb24gc3RvcmVkIGFuZCBwcm92aWRlZCBhdCBjdXJsIHNpdGU6IGh0dHBzOi8vY3VybC5oYXh4LnNlL3JmYy9udGxtLmh0bWwKCi0gRml4ZWQgdGhlIG1pbm9yIGNvbXBpbGUgcHJvYmxlbXMgcHJlMyBoYWQgaWYgYnVpbHQgd2l0aG91dCBHU1NBUEkgYW5kL29yCiAgU1NMLgoKVmVyc2lvbiA3LjEwLjYtcHJlMyAoMTkgSnVuZSAyMDAzKQoKRGFuaWVsICgxOSBKdW5lKQotIE1hZGUgY3VybCB1c2UgY3VybF9mcmVlKCkgb24gbWVtb3J5IHJldHVybmVkIGJ5IGN1cmxfZ2V0ZW52KCksIGFzIHRoaXMKICBzaG91bGQgdGhlb3JldGljbHkgbWFrZSBpdCBwb3NzaWJseSB0byBidWlsZCBhbmQgcnVuIGN1cmwgYW5kIGxpYmN1cmwgd2l0aAogIGRpZmZlcmVudCBtZW1vcnkgYWxsb2NhdGlvbiBzY2hlbWVzIHdpdGggbm8gcHJvYmxlbXMuCgpEYW5pZWwgKDE4IEp1bmUpCi0gSW1wcm92ZWQgdGhlIG1raGVscC5wbCBhIGJpdCBmdXJ0aGVyIHRvIG1ha2UgYSBuaWNlciBodWdlaGVscCB0ZXh0IGFuZCB0bwogIGluY2x1ZGUgYSBiZXR0ZXIgY29tbWVudCBpbiB0aGUgdG9wIGZvciB0aGUgZ3ppcCBjb21wcmVzc2VkIHZlcnNpb24uCgpEYW5pZWwgKDE3IEp1bmUpCi0gQ1VSTE9QVF9IVFRQQVVUSCBpcyBub3cgYSBiaXRtYXNrLCBpbiB3aGljaCB5b3Ugc2V0IHdoaWNoIGF1dGhlbnRpY2F0aW9uCiAgdHlwZShzKSB5b3Ugd2FudCB0byB1c2UuIElmIG1vcmUgdGhhbiBvbmUgaXMgc2V0LCBsaWJjdXJsIHdpbGwgdXNlIG9uZSBvZgogIHRoZSBzZWxlY3RlZCBvbmUgYW5kIHRoZSBvbmUgaXQgY29uc2lkZXJzIGlzIG1vcmUgc2VjdXJlLiBUZXN0IGNhc2UgNjcgYW5kCiAgNjggKGZvciBOVExNKSB3ZXJlIGZpeGVkIGFuZCB3ZSd2ZSByZWR1Y2VkIGEgcm91bmQtdHJpcCBmb3Igc3BlY2lmaWMgLS1udGxtCiAgZmV0Y2hlcywgYW5kIHRlc3QgY2FzZSA2OSBhbmQgNzAgd2VyZSBhZGRlZCBmb3IgdGVzdGluZyBhdXRoZW50aWNhdGlvbgogICJwaWNraW5nIi4gLS1hbnlhdXRoIGlzIHRoZSBuZXcgY29tbWFuZCBsaW5lIHRvb2wgb3B0aW9uLCBhbmQgSSBhbHNvIGFkZGVkCiAgLS1iYXNpYyBmb3IgY29tcGxldGVuZXNzICh0aGF0J3MgdGhlIGRlZmF1bHQgdHlwZSkuCgotIEZpeGVkIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQgdG8gdXNlIHRoZSBpbmZvIHByb3ZpZGVkIGJ5IHRoZSBuZXcgY3VybCAtVgogIG91dHB1dC4KCi0gLS1lbmFibGUtZGVidWcgbm93IHNldHMgdGhlIENVUkxERUJVRyBkZWZpbmUgaW5zdGVhZCBvZiBNQUxMT0NERUJVRywgYXMgaXQKICBpcyBtZWFudCB0byBiZSBhIGdlbmVyaWMgZGVidWcgY29uZGl0aW9uYWwuCgotIGN1cmxfdmVyc2lvbl9pbmZvKCkgY2FuIG5vdyByZXR1cm4gQ1VSTF9WRVJTSU9OX0RFQlVHIGFzIGEgZmVhdHVyZSBiaXQsIHRvCiAgaW5kaWNhdGUgdGhhdCB0aGUgbGlicmFyeSB3YXMgYnVpbHQgd2l0aCBDVVJMREVCVUcgc2V0LgoKLSBSYWxwaCBNaXRjaGVsbCBmb3VuZCBvdXQgdGhhdCBzb21lIHdlYiBhcHBsaWNhdGlvbnMgdmVyeSBiYWRseSB1c2VzIHdoaXRlCiAgc3BhY2VzIGluIExvY2F0aW9uOiByZWRpcmVjdHMsIGFuZCBhcHBhcmVudGx5IElFIGlzIGEgYnJvd3NlciAodGhlIG9ubHkKICBvbmU/KSB0aGF0IHN1cHBvcnRzIHRoaXMgYWJvbWluYXRpb24uIEJhc2VkIG9uIFJhbHBoJ3MgcGF0Y2gsIEkgYWRkZWQgY29kZQogIHRoYXQgbm93IGF0dGVtcHRzIHRvIHJlcGxhY2Ugd2hpdGUgc3BhY2VzIHdpdGggdGhlIHByb3BlciAiJTIwIiBvciAiKyIuCiAgVGVzdCBjYXNlIDQwIGFuZCA0MiB3ZXJlIGFkZGVkIHRvIHZlcmlmeSBteSBjaGFuZ2VzLgoKLSBjdXJsIC1WIG5vdyBhbHNvIG91dHB1dHMgYSBsaXN0IG9mIGZlYXR1cmVzIHRoZSBhdmFpbGFibGUgbGlicmFyeSBvZmZlcnMgKGlmCiAgYW55KS4KCi0gVGhlIGN1cmxfdmVyc2lvbigpIHN0cmluZyBub3cgaW5jbHVkZXMgIkdTUyIgaWYgbGliY3VybCBpcyBidWlsdCB3aXRoIEdTU0FQSQogIHN1cHBvcnQuCgotIERhdmlkIE9ycmVsbCByZXBvcnRlZCB0aGF0IGxpYmN1cmwgc3RpbGwgY3Jhc2hlZCB3aGVuIHNlbmRpbmcgSFVHRSByZXF1ZXN0cwogIG92ZXIgSFRUUFMuLi4gSSBmaXhlZC4KClZlcnNpb24gNy4xMC42LXByZTIgKDE2IEp1bmUgMjAwMykKCkRhbmllbCAoMTYgSnVuZSkKLSBjdXJsX3ZlcnNpb25faW5mbygpIG5vdyByZXR1cm5zIGJpdG1hc2tlZCBpbmZvcm1hdGlvbiB3ZWF0aGVyIE5UTE0gYW5kCiAgR1NTTkVHT1RJQVRFIGFyZSBzdXBwb3J0ZWQsIHNpbmNlIGl0IGlzIGRvb21lZCB0byB2YXJ5IG9uIGRpZmZlcmVudAogIGluc3RhbGxhdGlvbnMuCgotIEkgcmVtYWRlIHRoZSBIVFRQIERpZ2VzdCBjb2RlIHRvIHVzZSB0aGUgTUQ1LWNvZGUgcHJvdmlkZWQgYnkgT3BlblNTTCBpZgogIHRoYXQgaXMgcHJlc2VudCwgYW5kIG9ubHkgdXNlIG91ciBvd24gTUQ1LWNvZGUgaWYgaXQgaXNuJ3QuCgpEYW5pZWwgKDEzIEp1bmUpCi0gTW9yZSBOVExNIGhlbHAsIGZpeGVzIGFuZCBwYXRjaGVzIGZyb20gQ3JpcyBCYWlsaWZmLgoKLSBNYXJ0eSBLdWhydCBicm91Z2h0IGluY2x1ZGUgZml4ZXMgZm9yIG1ha2luZyBWTVMgYnVpbGRzIHdhcm5pbmctZnJlZS4KCkRhbmllbCAoMTIgSnVuZSkKLSBOVExNIGF1dGhlbnRpY2F0aW9uIHdvcmtzIHNvbWV3aGF0IGFnYWluc3QgdGhlIHRlc3Qgc2VydmVycyBwcm92aWRlZCBieQogIE1hdGhpYXMgQXhlbHNzb24gYW5kIENyaXMgQmFpbGlmZi4gVXNlIGJ5IHNldHRpbmcgQ1VSTE9QVF9IVFRQQVVUSCB0bwogIENVUkxBVVRIX05UTE0gdG8gbGliY3VybCwgb3IgLS1udGxtIGZvciB0aGUgY3VybCB0b29sLiBUZXN0IGNhc2UgNjcgYW5kIDY4CiAgd2VyZSBhZGRlZCBmb3IgdGhpcy4gTlRMTS1zdXBwb3J0IHJlcXVpcmVzIE9wZW5TU0wuCgotIERhbiBGYW5kcmljaCBwcm92aWRlZCBhIHBhdGNoLCB0aGF0IGdyYW50ZWQgdGhhdCBnemlwIGFuZCBsaWJ6IGFyZSBhdmFpbGFibGUKICBhdCBidWlsZC10aW1lLCBjb21wcmVzc2VzIHRoZSBodWdlaGVscCB0ZXh0IGluIHRoZSBjdXJsIGNvbW1hbmQgbGluZSBhbmQKICB1bmNvbXByZXNzZXMgaXQgYXQgcmVxdWVzdC4gU2F2ZXMgc29tZSB+NjBLIGluIHRoZSBmaW5hbCBvdXRwdXQgZXhlY3V0YWJsZS4KCkRhbmllbCAoMTEgSnVuZSkKLSBMb25nIGRheSBvZiBmaWdodGluZyB0aGUgTlRMTSBkZW1vbnMuCgpEYW5pZWwgKDEwIEp1bmUpCi0gTW9kaWZpZWQgaG93IHRvIHNldCBhdXRoIHR5cGUgdG8gbGliY3VybC4gTm93IHVzZSBDVVJMT1BUX0hUVFBBVVRIIGluc3RlYWQsCiAgYW5kIHBpY2sgbWV0aG9kLiBTdXBwb3J0ZWQgb25lcyBjdXJyZW50bHkgYXJlOgogIENVUkxBVVRIX0JBU0lDICAgICAtIGRlZmF1bHQgc2VsZWN0aW9uCiAgQ1VSTEFVVEhfRElHRVNUICAgIC0gZm9ybWVybHkgQ1VSTE9QVF9IVFRQRElHRVNUCiAgQ1VSTEFVVEhfR1NTTkVHT1RJQVRFCgotIERhbmllbCBLb3VyaWwgYWRkZWQgSFRUUCBHU1MtTmVnb3RpYXRlIGF1dGhlbnRpY2F0aW9uIHN1cHBvcnQsIGFzIGRlZmluZWQgaW4KICB0aGUgSUVURiBkcmFmdCBkcmFmdC1icmV6YWstc3BuZWdvLWh0dHAtMDQudHh0LiBJbiB1c2UgYWxyZWFkeSBieSB2YXJpb3VzCiAgTWljcm9zb2Z0IHdlYiBhcHBsaWNhdGlvbnMuIC0tbmVnb3RpYXRlIGlzIHRoZSBuZXcgZmFtaWx5IG1lbWJlci4gVG8gdGFrZQogIGFkdmFudGFnZSBvZiB0aGlzLCB5b3UgbmVlZCBvbmUgb2YgdGhlc2UgcGFja2FnZXM6CgogIG8gSGVpbWRhbCBLZXJiZXJvczUgICAgICAgICAgICAgICBodHRwOi8vd3d3LnBkYy5rdGguc2UvaGVpbWRhbC9oZWltZGFsLmh0bWwKICBvIEdTU0FQSSBmcm9tIEdsb2J1cyAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3Lmdsb2J1cy5vcmcvCiAgbyBHU1NBUEkgbGlicmFyaWVzIGZyb20gTUlUIEtlcmJlcm9zNSAgaHR0cDovL3dlYi5taXQuZWR1L2tlcmJlcm9zL3d3dy8KCi0gQSBtaXNzaW5nIGVuZGluZyBicmFja2V0ICgnXScpIHdoaWxlIGRvaW5nIFVSTCBnbG9iYmluZyBjb3VsZCBsZWFkIHRvIGEKICBzZWdmYXVsdC4gV2hpbGUgZml4aW5nIHRoaXMsIEkgYWxzbyBpbnRyb2R1Y2VkIGJldHRlciBlcnJvciByZXBvcnRpbmcgaW4gdGhlCiAgZ2xvYmJpbmcgY29kZS4gKEFsbCB0aGlzIGlzIGFwcGxpY2F0aW9uIGNvZGUgb3V0c2lkZSBsaWJjdXJsLikKCkRhbmllbCAoNiBKdW5lKQotIERhdmlkIE9ycmVsbCBmb3VuZCBvdXQgdGhhdCBzZW5kaW5nIGEgaHVnZSBHRVQgcmVxdWVzdCBvdmVyIEhUVFBTIGNvdWxkCiAgbWFrZSBsaWJjdXJsIGZhaWwgYW5kIHJldHVybiBhbiBlcnJvciBjb2RlLgoKRGFuaWVsICgyIEp1bmUpCi0gUmljaGFyZCBCcmFtYW50ZSBmb3VuZCBvdXQgdGhhdCAiQ29udGVudC1MZW5ndGg6IDAiIHdhcyBub3QgcHJvcGVybHkgdXNlZCBieQogIGxpYmN1cmwgaWYgdGhlIHJlc3BvbnNlLWhlYWRlcnMgaW5kaWNhdGVkIHRoYXQgdGhlIGNvbm5lY3Rpb24gd291bGQgYmUKICBjbG9zZWQuCgotIERhdmlkIEJ5cm9uJ3MgcGF0Y2ggd2FzIGFwcGxpZWQsIHRoYXQgbWFrZXMgdGhlIC0tcHJvZ3Jlc3MtYmFyIHRha2UgdGhlCiAgbG9jYWwgc2l6ZSBpbnRvIGFjY291bnQgd2hlbiBkb2luZyByZXN1bWVkIGRvd25sb2Fkcy4KCi0gRmVlZGJhY2sgZnJvbSBTZXJnZSBTZW1hc2hrbyBtYWRlIG1lIGNoYW5nZSB0aGUgZXJyb3IgbWVzc2FnZSByZXR1cm5lZCB3aGVuCiAgQ1VSTEVfSFRUUF9SRVRVUk5FRF9FUlJPUiBpcyByZXR1cm5lZC4KCi0gQW5vbnltb3VzIGluIGJ1ZyByZXBvcnQgIzc0NTEyMiBwb2ludGVkIG91dCB0aGF0IHdlIHNob3VsZCByZWFsbHkgYmUgdXNpbmcKICBTU0xfQ1RYX3NldF9vcHRpb25zKC4uLiBTU0xfT1BfQUxMKSB0byB3b3JrIGFyb3VuZCBmbGF3cyBpbiBleGlzdGluZyBTU0wKICBpbXBsZW1lbnRhdGlvbnMuCgpEYW5pZWwgKDI3IE1heSkKLSBBbmRyZWFzIExleSBhbmQgUmljaCBHcmF5IGhlbHBlZCBtZSBwb2ludCBvdXQgdGhhdCBubyB2ZXJzaW9uIG9mIEhQLVVYIGhhcwogIHRoZSBzeXMvc2VsZWN0LmggaGVhZGVyIGZpbGUgc28gaW5jbHVkaW5nIGl0IHVuY29uZGl0aW9uYWxseSBpbiBjdXJsL211bHRpLmgKICBpcyBub3QgYSBnb29kIHRoaW5nLiBOb3cgd2UgY2hlY2sgZm9yIEhQVVggYW5kIGF2b2lkIHVzaW5nIHRoYXQgaGVhZGVyIG9uCiAgc3VjaCBzeXN0ZW1zLgoKLSBSdWR5IEtvZW50byBleHBlcmllbmNlZCBwcm9ibGVtcyB3aXRoIGN1cmwncyByZWNlbnQgaGFiaXQgb2YgUE9TVGluZyBkYXRhIGluCiAgdHdvIHNlcGFyYXRlIHNlbmQoKSBjYWxscywgZmlyc3QgdGhlIGhlYWRlcnMgYW5kIHRoZW4gdGhlIGRhdGEuIEkndmUgbm93CiAgbWFkZSBhIGZpeCB0aGF0IGZvciBzdGF0aWMgYW5kIGtub3duIGNvbnRlbnQgdGhhdCBpcyBsZXNzIHRoYW4gMTAwSyBpbiBzaXplLAogIGV2ZXJ5dGhpbmcgaXMgbm93IHNlbnQgaW4gb25lIHNpbmdsZSBzeXN0ZW0gY2FsbCBhZ2Fpbi4gVGhpcyBpcyBhbHNvIGJldHRlcgogIGZvciBuZXR3b3JrIHBlcmZvcm1hbmNlIHJlYXNvbnMuCgotIEkgbW9kaWZpZWQgdGhlIG1haW4gbWFrZWZpbGUgdG8gbm90IGJ1aWxkIHRoZSB0ZXN0IHN1aXRlIGFuZCBhIGZldyBvdGhlcgogIHVubmVjZXNzYXJ5IHRoaW5ncyBieSBkZWZhdWx0LiBOb3csIHRoZSB0ZXN0IHN1aXRlIGlzIGJ1aWx0IHdoZW4gJ21ha2UgdGVzdCcKICBpcyBydW4uICBUaGlzIHJlZHVjZXMgYnVpbGQgdGltZSBmb3IgdGhvc2Ugd2hvIGRvbid0IGNhcmUgZm9yIHRoZSB0ZXN0CiAgc3VpdGUsIGFuZCBpdCBhbHNvIHJlZHVjZXMgY29uZnVzaW9uIGZvciBwZW9wbGUgdXNpbmcgcGxhdGZvcm1zIHdoZXJlIHRoZQogIHRlc3Qgc3VpdGUgYnVpbGQgZmFpbHMhCgpEYW5pZWwgKDI2IE1heSkKLSBDaHJpcyBMZXdpcyBwb2ludGVkIG91dCBhIGZsYXcgaW4gdGhlICNpZmRlZnMgaW4gY3VybC9tdWx0aS5oIGZvciBXaW5kb3dzLAogIHdoaWNoIGlzIG5vdyBjb3JyZWN0ZWQuCgotIEppcyBKb3kgZm91bmQgYW5vdGhlciBmbGF3IGluIHRoZSBTT0NLNSBjb2RlLCBhcyBsaWJjdXJsIHRyZWF0ZWQgdGhlIHNvY2tzNQogIHByb3h5IGEgbGl0dGxlIHRvbyBtdWNoIGxpa2UgYXMgaWYgaXQgd2FzIGEgaHR0cCBwcm94eS4KCkRhbmllbCAoMjMgTWF5KQotIFJpY2FyZG8gQ2FkaW1lIGZvdW5kIGEgc29ja2V0IGxlYWsgd2hlbiBsaXN0aW5nIGRpcmVjdG9yaWVzIHdpdGhvdXQKICBjb250ZW50cy4gVGVzdCBjYXNlcyAxNDQgYW5kIDE0NSB3ZXJlIGFkZGVkIHRvIHZlcmlmeSB0aGUgZml4LgoKLSBSdWR5IEtvZW50byBmb3VuZCB5ZXQgYW5vdGhlciBwcm9ibGVtIHdoZW4gYSBIVFRQIHNlcnZlciByZXR1cm5zIG9ubHkgYQogIHNpbmdsZS1saW5lIG9mIGNvbnRlbnRzIHdpdGhvdXQgYW55IGhlYWRlcnMgYXQgYWxsLiBsaWJjdXJsIHRoZW4gZmFpbGVkIHRvCiAgY291bnQgdGhlIGRhdGEsIHRodXMgcmV0dXJuaW5nIGVycm9yIDUyICJubyBjb250ZW50cyIuIFRlc3QgY2FzZSA2NiB3YXMKICBhZGRlZCB0byB2ZXJpZnkgdGhhdCB3ZSBub3cgZG8gcmlnaHQuCgpWZXJzaW9uIDcuMTAuNi1wcmUxICgyMyBNYXkgMjAwMykKCkRhbmllbCAoMjMgTWF5KQotIEppcyBpbiBidWcgcmVwb3J0ICM3NDE4NDEsIGZpeGVkIGEgYnVnIGluIHRoZSBTT0NLUzUgcHJveHktdXNpbmcgY29kZS4KCkRhbmllbCAoMjIgTWF5KQotIERhdmlkIFJlbWFobCBzZXQgdXAgYSB0ZXN0LXNlcnZlciBmb3IgbWUgcHJvdmlkaW5nIERpZ2VzdCBhdXRoZW50aWNhdGlvbiwKICBhbmQgSSB3cm90ZSB0aGUgZmlyc3Qgd29ya2luZyBjb2RlIHRoYXQgc3VwcG9ydCBpdC4gVGhlIHRlc3Qgc3VpdGUgd2FzCiAgbW9kaWZpZWQgc2xpZ2h0bHkgYXMgd2VsbCB0byB3b3JrIGJldHRlciBmb3IgaXQgYW5kIC0tZGlnZXN0IHdhcyBhZGRlZCB0bwogIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyAoYW5kIENVUkxPUFRfSFRUUERJR0VTVCB0byB0aGUgbGlicmFyeSkuLi4gIFJGQzI2MTcKICBoYXMgYWxsIHRoZSBnb3J5IGRldGFpbHMuCgpEYW5pZWwgKDIxIE1heSkKLSBEYXZpZCBCYWxhemljIHBvaW50ZWQgb3V0IHRoYXQgY3VybF91bmVzY2FwZSgpIGRpZG4ndCBjaGVjayB0aGF0ICUtY29kZXMKICB3ZXJlIGNvcnJlY3RseSBmb2xsb3dlZCBieSB0d28gaGV4YWRlY2ltYWwgZGlnaXRzIHdoZW4gaXQgdW5lc2NhcGUgc3RyaW5ncy4KICBOb3csIHdlIGRvIHRoZSBjaGVjayBhbmQgb25seSAlWFggY29kZXMgYXJlIHVuZXNjYXBlZCBpZiB0aGUgWCBsZXR0ZXJzIGFyZQogIGhleGFkZWNpbWFscy4KCi0gR2lzbGUgVmFuZW0gbWFkZSBjdXJsIGJ1aWxkIHdpdGggZGpncHAgb24gRE9TLgoKLSBHaXNsZSBWYW5lbSBpbXByb3ZlZCB0aGUgbWtoZWxwLnBsIHNjcmlwdCB0byBtYWtlIGEgbmljZXIgbWFudWFsIHRoYXQgaXMKICBzaG93biB3aXRoIGN1cmwgLU0uCgpEYW5pZWwgKDIwIE1heSkKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCBhIGZpeCB0aGF0IG1ha2VzIGxpYmN1cmwgbW9yZSBjb25zZXJ2YXRpdmUsIG5vdAogIGV4cGVjdGluZyBoX2FsaWFzZXMgb2YgdGhlIGhvc3RlbnQgc3RydWN0IHRvIGFsd2F5cyBiZSBub24tTlVMTC4KCkRhbmllbCAoMTkgTWF5KQotIEFzIHJlcXVlc3RlZCBieSBNYXJ0aW4gTWljaGxtYXlyIGluIERlYmlhbiBidWcgcmVwb3J0ICMxOTM2MzAsIGxpYmN1cmwgbm93CiAgc3VwcG9ydHMgdXNlciBuYW1lIGFuZCBwYXNzd29yZCBpbiB0aGUgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBBZGRlZAogIHRlc3QgY2FzZSA2MyB0byB2ZXJpZnkgdGhpcy4KClZlcnNpb24gNy4xMC41ICgxOSBNYXkgMjAwMykKCkRhbmllbCAoMTUgTWF5KQotIENoYW5nZWQgdGhlIG9yZGVyIGZvciB0aGUgaW5fYWRkcl90IHRlc3RpbmcsIGFzICd1bnNpZ25lZCBsb25nJyBzZWVtcyB0byBiZQogIGEgdmVyeSBjb21tb24gdHlwZSBpbmV0X2FkZHIoKSByZXR1cm5zLgoKRGFuaWVsICgxNCBNYXkpCi0gR2VvcmdlIENvbW5pbm9zIHByb3ZpZGVkIGEgZml4IHRoYXQgY2FsbHMgdGhlIHByb2dyZXNzIG1ldGVyIHdoZW4gd2FpdGluZwogIGZvciBGVFAgY29tbWFuZCByZXNwb25zZXMgdGFrZSA+MSBzZWNvbmQuIEl0J2xsIG1ha2UgYXBwbGljYXRpb25zIG1vcmUKICAicmVzcG9uc2l2ZSIgZXZlbiB3aGVuIGRlYWxpbmcgd2l0aCB2ZXJ5IHNsb3cgZnRwIHNlcnZlcnMuCgpEYW5pZWwgKDEyIE1heSkKLSBHZW9yZ2UgQ29tbmlub3MgcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsIHVwbG9hZHMgaGFkIHR3byBxdWlya3M6CiAgIG8gd2hlbiB1c2luZyBGVFAgUE9SVCBjb21tYW5kLCBpdCB1c2VkIGJsb2NraW5nIHNvY2tldHMhCiAgIG8gaXQgY291bGQgbG9vcCBhIGxvbmcgdGltZSB3aXRob3V0IGRvaW5nIHByb2dyZXNzIG1ldGVyIHVwZGF0ZXMKICBCb3RoIGl0ZW1zIGFyZSBmaXhlZCBub3cuCgpEYW5pZWwgKDkgTWF5KQotIERhbiBGYW5kcmljaCBjaGFuZ2VkIENVUkxPUFRfRU5DT0RJTkcgdG8gc2VsZWN0IGFsbCBzdXBwb3J0ZWQgZW5jb2RpbmdzIGlmCiAgc2V0IHRvICIiLiAgVGhpcyBmcmVlcyB0aGUgYXBwbGljYXRpb24gZnJvbSBoYXZpbmcgdG8ga25vdyB3aGljaCBlbmNvZGluZ3MKICB0aGUgbGlicmFyeSBzdXBwb3J0cy4KCi0gRGFuIEZhbmRyaWNoIHBvaW50ZWQgb3V0IHdlIGhhZCB0aHJlZSB1bm5lY2Vzc2FyeSBmaWxlcyBpbiBDVlMgdGhhdCBpcwogIGdlbmVyYXRlZCB3aXRoIGxpYnRvb2xpemUsIHNvIHRoZXkncmUgbm93IHJlbW92ZWQgYW5kIGxpYnRvb2xpemUgaXMgaW52b2tlZAogIGFjY29yZGluZ2x5IGluIHRoZSBidWlsZGNvbmYgc2NyaXB0LgoKLSBBdmVyeSBGYXkgZm91bmQgb3V0IHRoYXQgdGhlIENVUkxPUFRfSU5URVJGQUNFIHdheSBvZiBmaXJzdCBjaGVja2luZyBpZiB0aGUKICBnaXZlbiBuYW1lIGlzIGEgbmV0d29yayBpbnRlcmZhY2UgZ2F2ZSBhIHJlYWwgcGVyZm9ybWFuY2UgcGVuYWx0eSBvbiBMaW51eCwKICBzbyBub3cgd2UgbW9yZSBhcHByb3ByaWF0ZWx5IGZpcnN0IGNoZWNrIGlmIGl0IGlzIGFuIElQIG51bWJlciBhbmQgaWYgc28KICB3ZSBkb24ndCBjaGVjayBmb3IgYSBuZXR3b3JrIGludGVyZmFjZSB3aXRoIHRoYXQgbmFtZS4KCi0gQ1VSTE9QVF9GVFBfVVNFX0VQUlQgYWRkZWQuIFNldCB0aGlzIHRvIEZBTFNFIHRvIGRpc2FibGUgbGliY3VybCdzIGF0dGVtcHRzCiAgdG8gdXNlIEVQUlQgYW5kIExQUlQgYmVmb3JlIHRoZSB0cmFkaXRpb25hbCBQT1JUIGNvbW1hbmQuIFRoZSBjb21tYW5kIGxpbmUKICB0b29sIHNldHMgdGhpcyBvcHRpb24gd2l0aCAnLS1kaXNhYmxlLWVwcnQnLgoKVmVyc2lvbiA3LjEwLjUtcHJlMiAoNiBNYXkgMjAwMykKCkRhbmllbCAoNiBNYXkpCi0gS2V2aW4gRGVsYWZpZWxkIHJlcG9ydGVkIGFub3RoZXIgY2FzZSB3aGVyZSB3ZSBkaWRuJ3QgY29ycmVjdGx5IGNoZWNrIGZvcgogIEVBR0FJTiBidXQgb25seSBFV09VTERCTE9DSywgd2hpY2ggY2F1c2VkIGJhZG5lc3Mgb24gSFBVWC4KCkRhbmllbCAoNCBNYXkpCi0gQmVuIEdyZWVhciBub3RpY2VkIHRoYXQgdGhlIGNoZWNrIGZvciAnd3JpdGFibGUgYXJndicgZXhpdGVkIHRoZSBjb25maWd1cmUKICBzY3JpcHQgd2hlbiBydW4gZm9yIGNyb3NzLWNvbXBpbGluZywgd2hpY2ggd2Fzbid0IG5pY2UuIE5vdyBpdCdsbCBkZWZhdWx0IHRvCiAgbm8gYW5kIG91dHB1dCBhIHdhcm5pbmcgYWJvdXQgdGhlIGZhY3QgdGhhdCBpdCB3YXMgbm90IGNoZWNrZWQgZm9yLgoKRGFuaWVsICgyIE1heSkKLSBBZGRlZCB0ZXN0IGNhc2UgNjIgYW5kIGZpeGVkIHNvbWUgbW9yZSBvbiB0aGUgY29va2llIHNlbmRpbmcgd2l0aCBhIGN1c3RvbQogIEhvc3Q6IGhlYWRlciBzZXQuCgpEYW5pZWwgKDEgTWF5KQotIEFuZHkgQ2VkaWxuaWsgZml4ZWQgYSBmZXcgY29tcGlsZXIgd2FybmluZ3MuCgotIE1hZGUgdGhlICJTU0wgcmVhZCBlcnJvcjogNSIgZXJyb3IgbWVzc2FnZSBtb3JlIHZlcmJvc2UsIGJ5IGFkZGluZyBjb2RlIHRoYXQKICBxdWVyaWVzIHRoZSBPcGVuU1NMIGxpYnJhcnkgdG8gZmlsbCBpbiB0aGUgZXJyb3IgYnVmZmVyLgoKRGFuaWVsICgzMCBBcHIpCi0gQWRkZWQgc3lzL3NlbGVjdC5oIGluY2x1ZGUgaW4gdGhlIGN1cmwvbXVsdGkuaCBmaWxlLCBhZnRlciBoYXZpbmcgYmVlbgogIHJlbWluZGVkIGFib3V0IHRoaXMgYnkgUmljaCBHcmF5LgoKLSBJIG1hZGUgZWFjaCB0ZXN0IHNldCBpdHMgb3duIHNlcnZlciByZXF1aXJlbWVudHMsIHRodXMgYWJhbmRvbmluZyB0aGUKICBwcmV2aW91cyBzeXN0ZW0gd2hlcmUgdGhlIHRlc3QgbnVtYmVyIGltcGxpZWQgd2hhdCBzZXJ2ZXIocykgdG8gdXNlIGZvciBhCiAgc3BlY2lmaWMgdGVzdC4KCi0gRGF2aWQgQmFsYXppYyBtYWRlIGN1cmwgbW9yZSBSRkMxNzM4LWNvbXBsaWFudCBmb3IgRlRQIFVSTHMsIGJ5IGZpeGluZyBzbwogIHRoYXQgbGliY3VybCBub3cgdXNlcyBvbmUgQ1dEIGNvbW1hbmQgZm9yIGVhY2ggcGF0aCBwYXJ0LiBBIGJ1bmNoIG9mIHRlc3QKICBjYXNlcyB3ZXJlIGZpeGVkIHRvIHdvcmsgYWNjb3JkaW5nbHkuCgotIENvb2tpZSBmaXhlczoKCiAgQS4gU2F2ZSBkb21haW5zIGluIGphcnMgbGlrZSBNb3ppbGxhIGRvZXMuIEl0IG1lYW5zIGFsbCBkb21haW5zIHNldCBpbgogICAgIFNldC1Db29raWU6IGhlYWRlcnMgYXJlIGRvdC1wcmVmaXhlZC4KICBCLiBTYXZlIGFuZCB1c2UgdGhlICd0YWlsbWF0Y2gnIGZpZWxkIGluIHRoZSBNb3ppbGxhL05ldHNjYXBlIGNvb2tpZSBqYXJzCiAgICAgKHRoZSBzZWNvbmQgY29sdW1uKS4KICBDLiBSZWplY3QgY29va2llcyB1c2luZyBpbGxlZ2FsIGRvbWFpbnMgaW4gdGhlIFNldC1Db29raWU6IGxpbmUuIENvbmNlcm5zCiAgICAgYm90aCBkb21haW5zIHdpdGggdG9vIGZldyBkb3RzIG9yIGRvbWFpbnMgdGhhdCBhcmUgb3V0c2lkZSB0aGUgY3VycmVudGx5CiAgICAgb3BlcmF0aW5nIHNlcnZlciBob3N0J3MgZG9tYWluLgogIEQuIFNldCB0aGUgcGF0aCBwYXJ0IGJ5IGRlZmF1bHQgdG8gdGhlIG9uZSB1c2VkIGluIHRoZSByZXF1ZXN0LCBpZiBub25lIHdhcwogICAgIHNldCBpbiB0aGUgU2V0LUNvb2tpZSBsaW5lLgoKICBUbyBtYWtlIGl0ZW0gQyByZWFsbHkgZ29vZCwgSSBhbHNvIG1hZGUgbGliY3VybCBub3RpY2UgY3VzdG9tIEhvc3Q6IGhlYWRlcnMKICBhbmQgZXh0cmFjdCB0aGUgaG9zdCBuYW1lIHNldCBpbiB0aGVyZSBhbmQgdXNlIHRoYXQgYXMgdGhlIGhvc3QgbmFtZSBmb3IgdGhlCiAgc2l0ZSB3ZSdyZSBnZXR0aW5nIHRoZSBjb29raWVzIGZyb20uIFRoaXMgYWxsb3dzIHVzZXIgdG8gc3BlY2lmeSBhIHNpdGUncwogIElQLWFkZHJlc3MsIGJ1dCBzdGlsbCBiZSBhYmxlIHRvIHJlY2VpdmUgYW5kIHNlbmQgaXRzIGNvb2tpZXMgcHJvcGVybHkgaWYKICB5b3UgcHJvdmlkZSBhIHZhbGlkIEhvc3Q6IG5hbWUgZm9yIHRoZSBzaXRlLgoKRGFuaWVsICgyOSBBcHIpCi0gUGV0ZXIgS292YWNzIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgQ1VSTElORk9fQ09OTkVDVF9USU1FIHdvcmsgZmluZQogIHdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSAodG9vKS4KClZlcnNpb24gNy4xMC41LXByZTEgKDIzIEFwciAyMDAzKQoKRGFuaWVsICgyMyBBcHIpCi0gVXBncmFkZWQgdG8gbGlidG9vbCAxLjUuCgpEYW5pZWwgKDIyIEFwcikKLSBQZXRlciBTeWx2ZXN0ZXIgcG9pbnRlZCBvdXQgdGhhdCBjdXJsX2Vhc3lfc2V0b3B0KCkgd2lsbCBhbHdheXMgKHdyb25nbHkpCiAgcmV0dXJuIENVUkxFX09LIG5vIG1hdHRlciB3aGF0IGhhcHBlbnMuCgotIERhbiBGYW5kcmljaCBmaXhlZCBzb21lIGd6aXAgZGVjb21wcmVzc2lvbiBidWdzIGFuZCBmbGF3cy4KCkRhbmllbCAoMTYgQXByKQotIEZpeGVkIG1pbm9yIHR5cG8gaW4gbWFuIHBhZ2UsIHJlcG9ydGVkIGluIHRoZSBEZWJpYW4gYnVnIHRyYWNrZXIuCgpEYW5pZWwgKDE1IEFwcikKLSBGaXhlZCBzb21lIEZUUCB0ZXN0cyBpbiB0aGUgdGVzdCBzdWl0ZSB0aGF0IGZhaWxlZCBvbiBteSBTb2xhcmlzIGhvc3QsIGR1ZQogIHRvIHRoZSBjb25maWcuaCBub3QgYmVpbmcgaW5jbHVkZWQgYmVmb3JlIHRoZSBzeXN0ZW0gaGVhZGVycy4gV2hlbiBkb25lIHRoYXQKICB3YXksIGl0IGRpZCBnZXQgYSBtaXhlZCBzZW5zZSBvZiBpZiBiaWcgZmlsZXMgYXJlIHN1cHBvcnRlZCBvciBub3QgYW5kIHRoZW4KICBzdGF0KCkgYW5kIGZzdGF0KCkgKGFzIHVzZWQgaW4gdGVzdCBjYXNlIDUwNSkgZ290IGNvbmZ1c2VkIGFuZCBmYWlsZWQgdG8KICByZXR1cm4gYSBwcm9wZXIgZmlsZSBzaXplLgoKLSBGb3JtcG9zdGluZyBhIGZpbGUgdXNpbmcgYSAuaHRtbCBzdWZmaXggaXMgbm93IHByb3Blcmx5IHNldCB0byBDb250ZW50LVR5cGU6ICAgIHRleHQvaHRtbC4KCkRhbmllbCAoMTQgQXByKQotIEZpeGVkIHRoZSBTU0wgZXJyb3IgaGFuZGxpbmcgdG8gcmV0dXJuIHByb3BlciBTU0wgZXJyb3IgbWVzc2FnZXMgYWdhaW4sIHRoZXkKICBicm9rZSBpbiA3LjEwLjQuIEkgYWxzbyBhdHRlbXB0IHRvIHRyYWNrIGRvd24gQ0EgY2VydCBwcm9ibGVtcyBhbmQgdGhlbgogIHJldHVybiB0aGUgQ1VSTEVfU1NMX0NBQ0VSVCBlcnJvciBjb2RlLgoKLSBUaGUgY3VybCB0b29sIG5vdyBpbnRlcmNlcHRzIHRoZSBDVVJMRV9TU0xfQ0FDRVJUIGVycm9yIGNvZGUgYW5kIGRpc3BsYXlzCiAgYSBmYWlybHkgYmlnIGFuZCBleHBsYW5hdG9yeSBlcnJvciBtZXNzYWdlLiBLZXZpbiBSb3RoIGhlbHBlZCBtZSBvdXQgd2l0aAogIHRoZSB3b3JkaW5nLgoKRGFuaWVsICgxMSBBcHIpCi0gTmljIEhpbmVzIHByb3ZpZGVkIGEgc2Vjb25kIHBhdGNoIGZvciBnemlwIGRlY29tcHJlc3Npb24sIGFuZCBmaXhlZCBhIGJ1ZwogIHdoZW4gZGVmbGF0ZSBvciBnemlwIGNvbnRlbnRzIHdlcmUgZG93bmxvYWRlZCB1c2luZyBjaHVua2VkIGVuY29kaW5nLgoKLSBEYW4gRmFuZHJpY2ggbWFkZSBsaWJjdXJsIHN1cHBvcnQgYXV0b21hdGljIGRlY29tcHJlc3Npb24gb2YgZ3ppcCBjb250ZW50cwogIChhcyBhbiBhZGRpdGlvbiB0byB0aGUgcHJldmlvdXMgZGVmbGF0ZSBzdXBwb3J0KS4KCi0gSSBtYWRlIHRoZSBDV0QgY29tbWFuZCBkdXJpbmcgRlRQIHNlc3Npb24gY29uc2lkZXIgYWxsIDJ4eSBjb2RlcyB0byBiZSBPSwogIHJlc3BvbnNlcy4KCkRhbmllbCAoMTAgQXByKQotIFZsYWQgS3J1cGluIGZpeGVkIGEgVVJMIHBhcnNpbmcgaXNzdWUuIFVSTHMgdGhhdCB3ZXJlIG5vdCB1c2luZyBhIHNsYXNoCiAgYWZ0ZXIgdGhlIGhvc3QgbmFtZSwgYnV0IHN0aWxsIGhhZCAiPyIgYW5kIHBhcmFtZXRlcnMgYXBwZW5kZWQsIGFzIGluCiAgImh0dHA6Ly9ob3N0bmFtZS5jb20/Zm9vYmFyPW1vbyIsIHdlcmUgbm90IHByb3Blcmx5IHBhcnNlZCBieSBsaWJjdXJsLgoKRGFuaWVsICg5IEFwcikKLSBNYWRlIENVUkxPUFRfVElNRUNPTkRJVElPTiB3b3JrIGZvciBGVFAgdHJhbnNmZXJzLCB1c2luZyB0aGUgc2FtZSBzeW50YXggYXMKICBmb3IgSFRUUC4gVGhpcyB0aGVuIG1hZGUgLXogd29yayBmb3IgZnRwIHRyYW5zZmVycyB0b28uIEFkZGVkIHRlc3QgY2FzZSAxMzkKICBhbmQgMTQwIGZvciB2ZXJpZnlpbmcgdGhpcy4KCi0gR2V0dGluZyB0aGUgZmlsZSBkYXRlIG9mIGFuIGZ0cCBmaWxlIHVzZWQgdGhlIHdyb25nIHRpbWUgem9uZSB3aGVuCiAgZGlzcGxheWVkLiBJdCBpcyBzdXBwb3NlZGx5IGFsd2F5cyBHTVQuIEFkZGVkIHRlc3QgY2FzZSAxNDEgZm9yIHRoaXMuCgotIE1hZGUgdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHN1cHBvcnQgTURUTS4KCi0gVGhlIGRlZmF1bHQgREVCVUdGVU5DVElPTiwgYXMgZW5hYmxlZCB3aXRoIENVUkxPUFRfVkVSQk9TRSBub3cgb3V0cHV0cwogIENVUkxJTkZPX0hFQURFUl9JTiBkYXRhIGFzIHdlbGwuIFRoZSBtb3N0IG5vdGFibGUgZWZmZWN0IGZyb20gdGhpcyBpcyB0aGF0CiAgdXNpbmcgY3VybCAtdiwgeW91IGdldCB0byBzZWUgdGhlIGluY29taW5nICJoZWFkZXJzIiBhcyB3ZWxsLiBUaGlzIGlzCiAgcGVyaGFwcyBtb3N0IHVzZWZ1bCB3aGVuIGRvaW5nIGZ0cC4KCkRhbmllbCAoOCBBcHIpCi0gSmFtZXMgQnVyc2EgZml4ZWQgYSBmbGF3IGluIHRoZSBDb250ZW50LVR5cGUgZXh0cmFjdGlvbiBjb2RlLCB3aGljaCBtaXNzZWQKICB0aGUgZmlyc3QgbGV0dGVyIGlmIG5vIHNwYWNlIGZvbGxvd2VkIHRoZSBjb2xvbi4KCi0gTWFnbnVzIE5pbHNzb24gcG9pbnRlZCBvdXQgdGhhdCBzaGFyZS5jIHdhcyBtaXNzaW5nIGluIHRoZSBNU1ZDIHByb2plY3QKICBmaWxlLgoKRGFuaWVsICg2IEFwcikKLSBSeWFuIFdlYXZlciBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgdGhlIENBIGNlcnQgYnVuZGxlIG5vdCBnZXQgaW5zdGFsbGVkCiAgYW55bW9yZSB3aGVuICdjb25maWd1cmUgLS13aXRob3V0LXNzbCcgaGFzIGJlZW4gdXNlZC4KCkRhbmllbCAoNCBBcHIpCi0gTWFydGlqbiBCcm9lbmxhbmQgZm91bmQgYW5vdGhlciBjYXNlcyB3aGVyZSBhIHNlcnZlciBhcHBsaWNhdGlvbiBkaWRuJ3QKICBsaWtlIHRoZSBib3VuZGFyeSBzdHJpbmcgdXNlZCBieSBjdXJsIHdoZW4gZG9pbmcgYSBtdWx0aS1wYXJ0L2Zvcm1wb3N0LiBXZQogIG1vZGlmaWVkIHRoZSBib3VuZGFyeSBzdHJpbmcgdG8gbG9vayBsaWtlIHRoZSBvbmUgSUUgdXNlcywgYXMgdGhpcyBpcwogIHByb2JhYmx5IGdvbm5hIG1ha2UgY3VybCB3b3JrIHdpdGggbW9yZSBhcHBsaWNhdGlvbnMuCgpEYW5pZWwgKDMgQXByKQotIEtldmluIFJvdGggcmVwb3J0ZWQgdGhhdCBhIGJ1bmNoIG9mIHRlc3RzIGZhaWxzIG9uIGN5Z3dpbi4gT25lIHNldCBmYWlscwogIHdoZW4gdXNpbmcgcGVybCA1LjggKGFuZCB0aGV5IHJ1biBmaW5lIHdpdGggcGVybCA1LjYpLCBhbmQgYW5vdGhlciBzZXQKICBmYWlsZWQgYmVjYXVzZSBvZiBhbiBhcnRpZmFjdCBpbiB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgdGhhdCBJCiAgY29ycmVjdGVkLiBJdCB0dXJuZWQgb3V0IHRoZSBGVFAgc2VydmVyIGNvZGUgd2FzIHN0aWxsIGhhdmluZyBhIGZpbGUgb3BlbmVkCiAgd2hpbGUgdGhlIG1haW4gdGVzdCBzY3JpcHQgcmVtb3ZlZCBpdCBhbmQgaW52b2tlZCB0aGUgSFRUUCBzZXJ2ZXIgdGhhdAogIGF0dGVtcHRlZCB0byBjcmVhdGUgdGhlIHNhbWUgZmlsZSBuYW1lIG9mIHRoZSBmaWxlIHRoZSBGVFAgc2VydmVyIGtlcHQgb3Blbi4KICBUaGlzIG9wZXJhdGlvbiB3b3JrcyBmaW5lIG9uIHVuaXgsIGJ1dCBub3Qgb24gY3lnd2luLgoKVmVyc2lvbiA3LjEwLjQgKDIgQXByIDIwMDMpCgpEYW5pZWwgKDEgQXByKQotIEFkZGVkIHRlc3QgY2FzZSA1MDUgdG8gZXhlcmNpc2UgRlRQIHVwbG9hZCB3aXRoIHJlbmFtZSBkb25lIHdpdGggbGliY3VybCwKICBhbmQgZm9yIHRoYXQgSSBoYWQgdG8gZXh0ZW5kIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciB0byBkZWFsIHdpdGggdGhlCiAgUk5GUiBhbmQgUk5UTyBjb21tYW5kcy4KCkRhbmllbCAoMzEgTWFyKQotIEV2ZW4gbW9yZSBTU0wgY29uZmlnIGNoZWNrIG1vZGlmaWNhdGlvbnMgYWZ0ZXIgUmljaGFyZCdzIHRlc3RpbmcuCgpWZXJzaW9uIDcuMTAuNC1wcmU2ICgzMSBNYXIgMjAwMykKCkRhbmllbCAoMzEgTWFyKQotIE1vcmUgZml4ZXMgZm9yIHRoZSBTU0wgc2Vzc2lvbiBJRCBjYWNoZSBjaGVja3Mgd2hlbiBTU0wgY29uZmlncyBhcmUgY2hhbmdlZAogIGJldHdlZW4gY29ubmVjdGlvbnMuIEJhc2VkIG9uIHRlc3RzIGFuZCB0YWxrcyB3aXRoIFJpY2hhcmQgQnJhbWFudGUuCgotIEd1aWxsYXVtZSBDb3R0ZW5jZWF1IHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBhZGRlZCBDVVJMT1BUX1VOUkVTVFJJQ1RFRF9BVVRILgogIFdoZW4gZW5hYmxlZCwgaXQgd2lsbCBwcmV2ZW50IGxpYmN1cmwgZnJvbSBsaW1pdGluZyB0byB3aGljaCBob3N0IGl0IHNlbmRzCiAgdXNlcitwYXNzd29yZCB0byB3aGVuIGZvbGxvd2luZyBsb2NhdGlvbnMuIEJ5IGRlZmF1bHQsIGxpYmN1cmwgb25seSBzZW5kcwogIG5hbWUgYW5kIHBhc3N3b3JkIHRvIHRoZSBvcmlnaW5hbCBob3N0IHVzZWQgaW4gdGhlIGZpcnN0IFVSTCwgYnV0IHdpdGggdGhpcwogIG9wdGlvbiBzZXQgaXQgd2lsbCBzZW5kIHRoZSBhdXRoIGluZm8gdG8gYWxsIGhvc3RzIGl0IGZvbGxvd3MgbG9jYXRpb24KICBoZWFkZXJzIHRvLiBUaGUgbmV3IHRvb2wgY29tbWFuZCBsaW5lIG9wdGlvbiBmb3IgdGhpcyBpcyBuYW1lZAogICItLWxvY2F0aW9uLXRydXN0ZWQiLgoKLSBGcmFua2llIEZvbmcgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggbGliY3VybCBpZiB5b3UgcmUtdXNlZCBhbiBlYXN5IGhhbmRsZQogIHdpdGggYSBwcm94eSwgYW5kIHlvdSBmaXJzdCBtYWRlIGEgaHR0cHM6Ly8gY29ubmVjdGlvbiB0byBhIGhvc3QgYW5kIHRoZW4KICBzd2l0Y2hlZCB0byBhIGh0dHA6Ly8gb25lIHRvIHRoZSBzYW1lIGhvc3QuIGxpYmN1cmwgd291bGQgdGhlbiB3cm9uZ2x5IHJlLXVzZQogIHRoZSBzYW1lIGNvbm5lY3Rpb24gZm9yIGl0IGFuZCBmYWlsIHRvIGdldCB0aGUgc2Vjb25kIFVSTCBwcm9wZXJseQoKRGFuaWVsICgyOSBNYXIpCi0gRGFuIFNoZWFyZXIncyBmaXggdGhhdCBtYWtlcyBjdXJsIGNvbXBsYWluIGlmIGludm9rZWQgd2l0aCBub3RoaW5nIGJ1dCAiY3VybAogIC1PIiB3YXMgYXBwbGllZC4KCkRhbmllbCAoMjYgTWFyKQotIEJyeWFuIEtlbXAgd2FzIGZyaWVuZGx5IGVub3VnaCB0byBsZW5kIG1lIGFuIGFjY291bnQgb24gaGlzIFJlZGhhdCA5IGJveCBhbmQKICBJIGNvdWxkIGZpeCB0aGUgY29uZmlndXJlIHByb2JsZW1zIG9uIHJlZGhhdCA4LjEgYW5kIDkgaW4gbm8gdGltZSB0aGFua3MgdG8KICB0aGlzLiBUaGFua3MgYSBidW5jaCBCcnlhbiEKCkRhbmllbCAoMjUgTWFyKQotIFJlbmFtZWQgY29uZmlndXJlLmluIHRvIGNvbmZpZ3VyZS5hYwoKVmVyc2lvbiA3LjEwLjQtcHJlNSAoMjUgTWFyIDIwMDMpCgpEYW5pZWwgKDI1IE1hcikKLSBSaWNoYXJkIEJyYW1hbnRlIHByb3ZpZGVkIGEgZml4IGZvciBhIGhhbmRsZSByZS11c2UgcHJvYmxlbSBzZWVuIHdoZW4geW91CiAgY2hhbmdlIG9wdGlvbnMgb24gYW4gU1NMLWVuYWJsZWQgY29ubmVjdGlvbiBiZXR3ZWVuIHJlcXVlc3RzLiBQcmV2aW91c2x5LAogIGNoYW5naW5nIHBlZXIgdmVyaWZpY2F0aW9uIG9yIGhvc3QgdmVyaWZpY2F0aW9uIGFuZCBzaW1pbGFyIHRoaW5ncyB3YXMgbm90CiAgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gYSBjb25uZWN0aW9uIHdlcmUgY2hlY2tlZCBmb3IgcmUtdXNlIGFuZCB0aHVzCiAgZW5hYmxpbmcgc3RyaWN0ZXIgY2hlY2sgYmV0d2VlbiByZXF1ZXN0cyBvbiBhIHJlLXVzZWQgY29ubmVjdGlvbiBtYWRlIG5vCiAgZGlmZmVyZW5jZSBhbmQgdGhlIGNvbm5lY3Rpb24gd291bGQgdGh1cyBiZSB1c2VkIGVycm9uZW91c2x5LgoKRGFuaWVsICgyNCBNYXIpCi0gR/Z0eiBCYWJpbi1FYmVsbCBwb2ludGVkIG91dCB0aGF0IHRoZSBjYS1idW5kbGUuY3J0IGZpbGUgY29udGFpbmVkIGEKICBjZXJ0aWZpY2F0ZSBmcm9tIFRydXN0Y2VudGVyIHRoYXQgd2FzIGEgZGVtbyBjZXJ0aWZpY2F0ZSBvbmx5IHRoYXQgd2FzIG5ldmVyCiAgaW50ZW5kZWQgdG8gYmUgcGFydCBvZiBhIENBIGJ1bmRsZS4KCkRhbmllbCAoMjEgTWFyKQotIExpZmUgaXMgYSBteXN0ZXJ5LiBXaXRoaW4gYSB0aW1lIHBlcmlvZCBvZiAxNyBob3VycywgVGltIFBvcGUgYW5kIE1pY2hhZWwKICBDaHVyY2hpbGwgZmlsZWQgb25lIGJ1ZyByZXBvcnQgZWFjaCwgYm90aCBpZGVudGlmeWluZyBwcm9ibGVtcyB3aXRoIGEgc2Vjb25kCiAgdHJhbnNmZXIgd2hlbiBkb2luZyBwZXJzaXN0ZW50IHRyYW5zZmVycyByZS11c2luZyBhIGNvbm5lY3Rpb24uIFRpbSdzIG9uZSBpcwogICM3MDY2MjQsIGxhYmVsZWQgIk11bHRpcGxlIHVwbG9hZHMgcGVyIGhhbmRsZSBmYWlsIiBhbmQgTWljaGFlbCdzICM3MDcwMDMKICAiRG9lcyBub3Qgc2VuZCBBdXRob3JpemF0aW9uOiBoZWFkZXIgd2hlbiByZXVzaW5nIGNvbm5lY3Rpb24iLiBJIGNvdWxkIHRyYWNrCiAgYm90aCBkb3duIHRvIHRoZSBzYW1lIHBpZWNlIG9mIGxvZ2ljIGFuZCBpdCB0dXJuZWQgb3V0IGxpYmN1cmwgd2FzIG5vdCB1c2luZwogIG5ldyBzZXR0aW5ncyBwcm9wZXJseSB3aGVuIHJlLXVzaW5nIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24uIFRoaXMgY29uY2VybmVkCiAgYm90aCB1cGxvYWRpbmcgYW5kIGRvd25sb2FkaW5nIGFuZCBpbnZvbHZlZCBleGFjdGx5IHRob3NlIHBpZWNlcyB0aGVzZSB0d28KICByZXBvcnRzIGlkZW50aWZpZWQuIFRoaXMgY29kZSBoYXMgYmVlbiB0aGlzIGZhdWx0eSBzaW5jZSB0aGUgZGF5IEkKICBpbnRyb2R1Y2VkIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBzdXBwb3J0IGluIGxpYmN1cmwsIG1vcmUgdGhhbiAyIHllYXJzIGFnby4KCkRhbmllbCAoMjAgTWFyIDIwMDMpCi0gRml2ZSB5ZWFyIGFubml2ZXJzYXJ5LiBUb2RheSBmaXZlIHllYXJzIGFnbywgdGhlIGZpcnN0IGV2ZXIgY3VybCByZWxlYXNlIHNhdwogIHRoZSBsaWdodCBvZiBkYXkuCgpEYW5pZWwgKDE3IE1hcikKLSBBbmR5IENlZGlsbmlrIGNvcnJlY3RlZCBmbGF3cyBpbiBzb21lIGxpYmN1cmwgZXhhbXBsZS11c2FnZSBzb3VyY2VzLgoKRGFuaWVsICgxNiBNYXIpCi0gSnVhbiBGLiBDb2RhZ25vbmUgcmVwb3J0ZWQgdGhhdCB0aGUgZml4IGZyb20gTWFyY2ggMm5kIHdhcyBpbmNvbXBsZXRlLgoKLSBBZGRlZCBjb2RlIHRvIHRoZSBjb25maWd1cmUuaW4gdG8gY2hlY2sgZm9yIHNlbGVjdCgpIGFyZ3VtZW50IHR5cGVzLiBJJ3ZlCiAgbm90IG1hZGUgYW55IGNvZGUgdXNlIHRoZSByZXN1bHRzIGp1c3QgeWV0IHRob3VnaC4KCkRhbmllbCAoMTUgTWFyKQotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIHR3byBwYXRjaGVzIHRvIGJ1aWxkIGJldHRlciBvbiBXaW5kb3dzLgoKLSBBZGp1c3RlZCB0aGUgdGVzdCBzdWl0ZSBjb2RlIHRvIGJldHRlciBtYWtlIHN1cmUgdGhhdCB0aGUgc2VydmVyKHMpIHJlcXVpcmVkCiAgZm9yIGEgc3BlY2lmaWMgdGVzdCBpcyBwcm9wZXJseSBzdGFydGVkIGJlZm9yZSB0aGUgdGVzdCBjYXNlIGlzIGF0dGVtcHRlZC4KICBNYW55IHRlc3RzIG5vdyBydW4gYSBsb3QgZmFzdGVyIHRoYW4gYmVmb3JlLgoKRGFuaWVsICgxNCBNYXIpCi0gQW5vdGhlciBjb25maWd1cmUuaW4gYWRqdXN0bWVudCBtYWRlIHRoZSBjb25maWd1cmUgZGV0ZWN0IGZ1bmN0aW9ucyBwcm9wZXJseQogIG9uIEhQVVggbm93LgoKRGFuaWVsICgxMyBNYXIpCi0gUGhpbGlwcGUgUmFvdWx0IGZpeGVkIHByZTQtY29tcGlsZSBxdWlya3MgZm9yIEZyZWVCU0QuCgpWZXJzaW9uIDcuMTAuNC1wcmU0ICgxMyBNYXIgMjAwMykKCkRhbmllbCAoMTMgTWFyKQotIEFkZGVkIGEgYmFja3VwLWNoZWNrIGZvciBmdW5jdGlvbnMgdGhhdCBhcmVuJ3QgZm91bmQgYnkgQUNfQ0hFQ0tfRlVOQ1MoKQogIGFzIEkgYmVsaWV2ZSBzb21lIGNoZWNrcyBvbiBIUFVYIG5lZWQgdGhpcy4gQXQgbGVhc3Qgc29tZSBvZiB0aGUgaW5mbyBnaXZlbgogIHRvIHVzIGJ5IFJpY2sgSm9uZXMgc2VlbWVkIHRvIGluZGljYXRlIHRoaXMuCgpEYW5pZWwgKDEyIE1hcikKLSBUaG9tYXMgVG9uaW5vIGZvdW5kIG91dCB0aGF0IGlmIHlvdSB1c2VkIHRoZSBjdXJsIHRvb2wgdG8gZG8gUFVUIG9wZXJhdGlvbnMKICBhcyBpbiAnY3VybCB3d3cuZm9vLmNvbS9kaXIvIC1UIGZpbGUnIGFuZCB0aGUgZmlsZSBuYW1lIGluY2x1ZGVkIGZvciBleGFtcGxlCiAgc3BhY2Ugb3Igb3RoZXIgY2hhcmFjdGVycyB0aGF0IGRvbid0IGJlbG9uZyBpbiBVUkxzLCBjdXJsIGRpZCBub3QgcHJvcGVybHkKICBVUkwgZW5jb2RlIHRoZW0gYmVmb3JlIHVzaW5nIHRoZW0gaW4gdGhlIFVSTC4KCi0gQWRkZWQgYW4gb3B0aW9uIHRvIGNvbmZpZ3VyZSBjYWxsZWQgLS1lbmFibGUtbGliZ2NjIHRoYXQgc2ltcGx5IGFkZHMgLWxnY2MKICB0byB0aGUgTElCUyB2YXJpYWJsZSwgYXMgdGhpcyBzZWVtcyB0byBiZSBhIGNvbW1vbiBwcm9ibGVtLgoKLSBJIG1vZGlmaWVkIHRoZSBjb25maWd1cmUuaW4gZmlsZSwgc28gdGhhdCB0aGUgaGVhZGVycyBhcmUgbm93IGNoZWNrZWQgaW4gYW4KICBvcmRlciBvZiAidmlhbGl0eSIuIFdlIG11c3QgYWxzbyBtYWtlIHN1cmUgdG8gdXNlIHRoZSAiZGVmYXVsdCBoZWFkZXJzIgogIHBhcmFtZXRlciB0byBBQ19DSEVDS19IRUFERVJTKCkgc28gdGhhdCBoZWFkZXJzIGFyZSBjaGVja2VkIHdpdGggdGhlIHByb3BlcgogIHByZXJlcXVpc2l0ZXMgaW5jbHVkZWQgKGkuZSBhbGwgdGhlIG1ham9yIGFuZCBnZW5lcmFsbHkgaW1wb3J0YW50IGhlYWRlcgogIGZpbGVzIGFyZSBpbmNsdWRlZCB0aGVyZSBieSBkZWZhdWx0KS4gVGhpcyBtaWdodCBiZSB3aGF0IHdlIG5lZWQgZm9yIHZhcmlvdXMKICBTdW4sIEhQLCBBSVggYW5kIFRydTY0IHN5c3RlbXMgdG8gYmVoYXZlIGdvb2QgYWdhaW4gb24gdGhlIGhlYWRlciBjaGVjawogIGZyb250LgoKLSBSaWNrIEpvbmVzIHBvaW50ZWQgb3V0IGEgZmV3IGNvbXBpbGVyIHdhcm5pbmdzIG9uIEhQLVVYIHRoYXQgSSBhZGRyZXNzZWQuCgotIEkgbWFkZSB0aGUgY29uZmlndXJlIC0taGVscCBvdXRwdXQgbmljZXIgYnkgdXNpbmcgQUNfSEVMUF9TVFJJTkcoKSBhIGxvdAogIG1vcmUuCgpEYW5pZWwgKDExIE1hcikKLSBDaHJpc3RvcGhlIERlbW9yeSBmaXhlZCB0aGUgc29ja2V0IHNlbmRpbmcgY29kZSB0byB3b3JrIGJldHRlciBvbiBIUC1VWAogIHdoZW4gc2VuZGluZyBkYXRhIHRvIGEgc29ja2V0IHRoYXQgd291bGQgYmxvY2suIEl0IHRoZW4gcmV0dXJucyBFQUdBSU4sIG5vdAogIEVXT1VMREJMT0NLLgoKLSBSaWNoYXJkIEdvcnRvbiBpbXByb3ZlZCB0aGUgc2VlZGluZyBmdW5jdGlvbiBmb3Igc3lzdGVtcyB3aXRob3V0IGEgZ29vZAogIGFuZCByZWxpYWJsZSByYW5kb20gc291cmNlLgoKLSBSaWNoYXJkIEdvcnRvbiBmaXhlZCBhIGZldyB3YXJuaW5ncyB0aGF0IHBvcHBlZCB1cCB3aGVuIHlvdSBidWlsdCBjdXJsCiAgdXNpbmcgdGhlIFN1biBjb21waWxlciBvbiBhIDY0Yml0IFNQQVJDIHBsYXRmb3JtLgoKLSBNYXJ0aW4gQy4gTWFydGluIGZpeGVkIGEgY2FzZSB3aGVyZSBhIGNvbm5lY3QgZmFpbHVyZSB1c2luZyB0aGUgbXVsdGkKICBpbnRlcmZhY2UgZGlkbid0IHByb2R1Y2UgYSBodW1hbiByZWFkYWJsZSBlcnJvciBzdHJpbmcuCgpEYW5pZWwgKDEwIE1hcikKLSBSZXZlcnRlZCBsdG1haW4uc2ggYmFjayB0byBsaWJ0b29sIDEuNC4yIHN0YXR1cyBhZ2FpbiwgYXMgdGhlIDEuNC4zIHZlcnNpb24KICBicm9rZSB0aGUgYnVpbGQgb24gbnVtZXJvdXMgcGxhdGZvcm1zLiBJdCBzZWVtcyB0aGF0IGxpYnRvb2wgMS40LjMgcHV0cyBzb21lCiAgcmVxdWlyZW1lbnRzIG9uIHdoYXQgdmVyc2lvbnMgb2YgdGhlIG90aGVyIHRvb2xzIChhdXRvY29uZiArIGF1dG9tYWtlKSB0aGF0CiAgSSBhbSBub3QgZmFtaWxpYXIgd2l0aCBhbmQgdGh1cyBJIGNvdWxkbid0IGZ1bGZpbGwgYXQgdGhpcyBwb2ludC4KCiAgWWVzLCB0aGlzIGlzIG1vcmUgdGhhbiBtaWxkbHkgZnJ1c3RyYXRpbmcuCgpEYW5pZWwgKDcgTWFyKQotIFJ1biBsaWJ0b29saXplIHZlcnNpb24gMS40LjMuCgpWZXJzaW9uIDcuMTAuNC1wcmUzICg0IE1hciAyMDAzKQoKRGFuaWVsICgzIE1hcikKLSBBZGRlZCBzaGFyZS5vYmogdG8gdGhlIFZDNiBhbmQgQm9ybGFuZCBsaWJjdXJsIG1ha2VmaWxlcy4KCi0gVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIGZvdW5kIGFuZCBpbnZlc3RpZ2F0ZWQgYSBwcm9ibGVtIHdpdGggbGliY3VybCBvbiBBSVgsCiAgcHJlc3VtYWJseSBvbmx5IG9uIDQuMyBvciBsYXRlci4gZ2V0aG9zdGJ5bmFtZV9yKCkgaXMgbm90IHJldHVybmluZyBkYXRhCiAgdGhhdCBpcyBwb3NzaWJsZSB0byAia2VlcCIgYW5kIGNhY2hlIHRoZSB3YXkgbGliY3VybCBkb2VzLiBCdXQgaW5zdGVhZCB0aGVzZQogIHZlcnNpb25zIG9mIEFJWCB1c2VzIGEgZ2V0aG9zdGJ5bmFtZSgpIHRoYXQgd29ya3MgdGhyZWFkLXNhZmVseSB3ZSBjYW4KICBpbnN0ZWFkIHVzZSB0aGUgb3JkaW5hcnkgZ2V0aG9zdGJ5bmFtZSgpIGFuZCBvdXIgcGFja19ob3N0ZW50KCkgYXBwcm9hY2ggdG8KICBhY2hpZXZlIHdoYXQgd2Ugd2FudC4gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGF0dGVtcHRzIHRvIGRldGVjdCBBSVggNC4zIG9yCiAgbGF0ZXIgdG8gYWRqdXN0IGZvciB0aGlzLgoKRGFuaWVsICgyIE1hcikKLSBKdWFuIEYuIENvZGFnbm9uZSBmb3VuZCBhIHByb2JsZW0gaW50cm9kdWNlZCBpbiA3LjEwLjMgd2hlbiB5b3UgZmlyc3QgZGlkIGEKICBQT1NUIGFuZCB0aGVuIGJhY2sgdG8gYSBHRVQgdXNpbmcgdGhlIHNhbWUgZWFzeSBoYW5kbGUuCgpEYW5pZWwgKDI4IEZlYikKLSBSZW1vdmVkIHRoZSBzdHJlcXVhbCBhbmQgc3RybmVxdWFsIGRlZmluZXMgZnJvbSBjdXJsL2N1cmwuaCBoZWFkZXIuIFRoZXkKICB3ZXJlIG5ldmVyIG1lYW50IGZvciB0aGUgcHVibGljIGhlYWRlciBhbnl3YXkuIFBoaWxpcHBlIFJhb3VsdCBicm91Z2h0IGl0CiAgdXAuCgotIEphbWVzIEJ1cnNhIGZpeGVkIHRoZSBSSVNDIE9TIGJ1aWxkLgoKRGFuaWVsICgyNyBGZWIpCi0gQXZlcnkgRmF5IHBvaW50ZWQgb3V0IHRoZSB2ZXJ5IG1pc2xlYWRpbmcgY3VybF9tdWx0aV9pbmZvX3JlYWQgbWFuIHBhZ2UsIGFuZAogIEkgdXBkYXRlZCBpdCB0byBiZWNvbWUgbW9yZSBhY2N1cmF0ZS4KCi0gU2FsdmF0b3JlIFNvcnJlbnRpbm8gZm91bmQgYSBwcm9ibGVtIHdpdGggRlRQIGRvd25sb2FkaW5nIHRoYXQgdHVybmVkIG91dCB0bwogIGJlIGhpcyBGVFAgc2VydmVyIHJldHVybmluZyBzaXplIHplcm8gKDAgYnl0ZXMpIHdoZW4gU0laRSB3YXMgdXNlZCBvbiBhIGZpbGUKICB3aGlsZSBiZWluZyBpbiBCSU5BUlkgbW9kZS4gV2Ugbm93IG1ha2UgYSBzZWNvbmQgY2hlY2sgZm9yIHRoZSBhY3R1YWwgc2l6ZQogIGJ5IHNjYW5uaW5nIHRoZSBSRVRSIHJlcGx5IGFueXdheSwgZXZlbiBpZiB0aGUgU0laRSBjb21tYW5kIHJldHVybmVkIDAuCgpEYW5pZWwgKDI2IEZlYikKLSBLeWxlIFNhbGxlZSByZXBvcnRlZCBhIGNhc2Ugd2hlcmUgaGUgd291bGQgZG8gYSB0cmFuc2ZlciB0aGF0IGRpZG4ndCB1cGRhdGUKICB0aGUgcHJvZ3Jlc3MgbWV0ZXIgcHJvcGVybHkuIEl0IHR1cm5lZCBvdXQgdG8gYmUgYSBjYXNlIHdoZXJlIGxpYmN1cmwgd291bGQKICBsb29wIGEgbGl0dGxlIHRvbyBlYWdlcmx5IGluIHRoZSB0cmFuc2ZlciBsb29wLCB3aGljaCBpc24ndCByZWFsbHkgZ29vZCBmb3IKICB0aGUgQVBJcywgZXNwZWNpYWxseSBub3QgdGhlIG11bHRpIEFQSS4KClZlcnNpb24gNy4xMC40LXByZTIgKDI0IEZlYiAyMDAzKQoKRGFuaWVsICgyNCBGZWIpCi0gS2pldGlsIEphY29ic2VuIGZvdW5kIG91dCB0aGF0IHNldHRpbmcgQ1VSTE9QVF9NQVhDT05ORUNUUyB0byBhIHZhbHVlIGhpZ2hlcgogIHRoYW4gNSBjb3VsZCBjYXVzZSBhIHNlZ2ZhdWx0LgoKLSBJIGJlbGlldmUgSSBmaXhlZCB0aGUgJ0V4cGVjdDogMTAwLWNvbnRpbnVlJyBiZWhhdmlvciB0aGF0IGhhcyBiZWVuIGJyb2tlbgogIGZvciBhIHdoaWxlIChJIHRoaW5rIHNpbmNlIG15IGNoYW5nZSBkYXRlZCBEZWMgMTAgMjAwMikuIFdoZW4gdGhpcyBoZWFkZXIgaXMKICB1c2VkLCBsaWJjdXJsIHNob3VsZCB3YWl0IGZvciBhIEhUVFAgMTAwIChvciB0aW1lb3V0KSBiZWZvcmUgc2VuZGluZyB0aGUKICBwb3N0L3B1dCBkYXRhLgoKRGFuaWVsICgxNCBGZWIpCi0gTWF0dGhldyBDbGFya2UgcHJvdmlkZWQgc29tZSBpbmZvIHdoYXQgdG8gbW9kaWZ5IHRvIG1ha2UgY3VybCBidWlsZAogIGZsYXdsZXNzbHkgb24gQUlYIDMuMi41LgoKLSBNYXJ0aW4gQy4gTWFydGluIGZvdW5kIGFuZCBmaXhlZCBhIHByb2JsZW0gaW4gdGhlIG11bHRpIGludGVyZmFjZSB3aGVuCiAgcnVubmluZyBvbiBXaW5kb3dzIGFuZCB0cnlpbmcgdG8gY29ubmVjdCB0byBhIHBvcnQgd2l0aG91dCBhIGxpc3RlbmVyLgoKRGFuaWVsICgxMyBGZWIpCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIGZpeGVkIEN1cmxfYmFzZTY0X2VuY29kZSgpIHRvIGRlYWwgd2l0aCB6ZXJvZXMgaW4gdGhlCiAgZGF0YSB0byBlbmNvZGUuCgpEYW5pZWwgKDQgRmViKQotIEplYW4tUGhpbGlwcGUgYWRkZWQgdGhlIGZpcnN0IGNvZGUgdGhhdCBlbmFibGVzIHRoZSAnc2hhcmUnIHN5c3RlbS4gVGhpcwogIHNob3VsZCBub3cgZW5hYmxlIHNoYXJpbmcgb2YgRE5TIGRhdGEgYmV0d2VlbiB0d28gY3VybCBlYXN5IGhhbmRsZXMuCgotIEluY29ycG9yYXRlZCBOaWNvIEJhZ2d1cycgZml4ZXMgdG8gYWdhaW4gY29tcGlsZSBmbGF3bGVzc2x5IG9uIFZNUy4KCi0gSmFtZXMgQnVyc2EgY29ycmVjdGVkIGEgYmFkIGNvbW1lbnQgaW4gdGhlIHB1YmxpYyBpbmNsdWRlIGZpbGUgY3VybC9tdWx0aS5oCgotIFBldGVyIEZvcnJldCByZXBvcnRlZCBvbmUgb2YgdGhvc2UgZXJyb3I6MDAwMDAwMDAgY2FzZXMgaW4gbGliY3VybCBhZ2FpbgogIHdoZW4gY29ubmVjdGluZyB0byBhIEhUVFBTIHNpdGUsIGFuZCB0aGlzIHRpbWUgSSBkaWQgZGlzY292ZXIgc29tZSBvZGRpdGllcwogIGluIGhvdyBjdXJsIHJlcG9ydHMgU1NMIGVycm9ycyBiYWNrLiBJdCBjb3VsZCBtaXNzIHNob3dpbmcgdGhlIGFjdHVhbCBlcnJvci4KClZlcnNpb24gNy4xMC40LXByZTEgKDMgRmViIDIwMDMpCgpEYW5pZWwgKDMgRmViKQotIFJlbW92ZWQgdGhpbmdzIGluIHRoZSBkb2NzIHNheWluZyBjYXBhdGggZG9lc24ndCB3b3JrIG9uIFdpbmRvd3MsIGFzIEp1bGlhbgogIE5vYmxlIHRvbGQgdXMgaXQgd29ya3MgZmluZS4KCkRhbmllbCAoMzEgSmFuKQotIEtldmluIFJvdGggZml4ZWQgdGhlIHpsaWIgYnVpbGQgc3R1ZmYgaW4gdGhlIE1pbmd3MzIgbWFrZWZpbGUuCgpEYW5pZWwgKDMwIEphbikKLSBLZXZpbiBSb3RoIGZvdW5kIG91dCB0aGF0IGN1cmwgb24gV2luZG93cyBhbHdheXMgY2hlY2tlZCBmb3IgdGhlIENBIGNlcnQKICBidW5kbGUgdXNpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCB0aGUgcGF0aCBzY2FuLCBldmVuIHRob3VnaAogIC1rLy0taW5zZWN1cmUgd2FzIHVzZWQuCgotIEhhbWlzaCBNYWNrZW56aWUgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIG9ubHkgZGlkIHN0cmljdCBob3N0IG5hbWUgdmVyaWZ5aW5nCiAgaWYgY2FwYXRoIG9yIGNhaW5mbyB3YXMgdXNlZC4gTm93IGl0J2xsIGFsd2F5cyBkbyBpdCB1bmxlc3MgLWsgLyAtLWluc2VjdXJlCiAgaXMgdXNlZCEKCi0gUGF2ZWwgQ2VuZWsgcG9pbnRlZCBvdXQgdGhhdCB0aGUgQ29udGVudC1UeXBlIGV4dHJhY3Rpb24gd2FzIGRvbmUgd3JvbmdseQogIGFzIHRoZSBmdWxsIHN0cmluZyB3YXMgbm90IGZldGNoZWQuIEFkZGVkIHRlc3QgY2FzZSA1NyB0byB2ZXJpZnkgdGhhdCBjdXJsCiAgZG9lcyBpdCByaWdodCBub3cuCgpEYW5pZWwgKDI5IEphbikKLSBKYW1pZSBXaWxraW5zb24gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG5vdyBtYWtlcyBjdXJsIGF0dGVtcHQgdG8gY2xlYXIgb3V0CiAgInNlbnNpdGl2ZSIgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBzbyB0aGF0IHRoZXkgZG9uJ3QgYXBwZWFyIGluIHBzIG91dHB1dHMKICAob25seSBvbiBwbGF0Zm9ybXMgdGhhdCBhbGxvdyB3cml0aW5nIHRvIGFyZ3ZbXSkuCgotIEpvaG4gTWNHb3dhbiBmb3VuZCBvdXQgdGhhdCB0aGUgREVCVUdGVU5DVElPTiBjb3VsZCBiZSBjYWxsZWQgd2l0aCBiYWQKICBhcmd1bWVudHMgYW5kIHRodXMgY2F1c2UgdGhlIC0tdHJhY2Ugb3V0cHV0cyB0byBnbyB3cm9uZy4KCi0gUmVtb3ZlZCBhbGwgdGhlIGVtYWNzIGxvY2FsIHZhcmlhYmxlcyBmcm9tIGFsbCBmaWxlcy4gTWF0cyBMaWRlbGwgcHJvdmlkZWQKICB0aGUgbmV3IHNhbXBsZS5lbWFjcyBmaWxlIChmb3IgYSBzYW1wbGUgb2Ygd2hhdCB0byBpbmNsdWRlIGluIHlvdXIgLmVtYWNzKQogIGFuZCB0aGUgY3VybC1zdHlsZS5lbCB0aGF0IHNldHMgYSBiZXR0ZXIgYy1zdHlsZSBmb3IgZWRpdGluZyBjdXJsIHNvdXJjZXMuCgotIERhdmUgSGFsYmFra2VuIGZvdW5kIGEgcHJvYmxlbSB3aXRoIEZUUCBkb3dubG9hZHMgdGhhdCBjb3VsZCBhY2NpZGVudGx5CiAgcmV0dXJuIENVUkxFX1BBUlRJQUxfRklMRSB3aGVuIGN1cmxfZWFzeV9wZXJmb3JtKCkgd2FzIGNhbGxlZCB3aXRoIE5PQk9EWQogIHNldCBUUlVFLgoKRGFuaWVsICgyNyBKYW4pCi0gVGhlIGZvcGVuLmMgZXhhbXBsZSB3YXMgZmxhd2VkIGFzIE5pY2sgSHVtZnJleSBub3RpY2VkLCBhbmQgSSBmaXhlZCBpdCB0bwogIHdvcmsgYWdhaW4uCgpEYW5pZWwgKDI0IEphbikKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmb3VuZCBhbmQgZml4ZWQgYSBtZW1vcnkgbGVhayAodGhlIGNvbnRlbnQtdHlwZSBzdHJpbmcpCiAgd2hlbiBmb2xsb3dpbmcgbG9jYXRpb25zLgoKRGFuaWVsICgyMiBKYW4gMjAwMykKLSBJYW4gV2lsa2VzIGFuZCBMZWdvZmYgVmluY2VudCBib3RoIGluZGVwZW5kZW50bHkgcHJvdmlkZWQgZml4ZXMgZm9yIG1ha2luZwogIGN1cmwvbXVsdGkuaCB3b3JrIHByb3Blcmx5IHdoZW4gY29tcGlsZWQgd2l0aCBhIEMrKyBjb21waWxlci4KCkRhbmllbCAoMjAgSmFuIDIwMDMpCi0gRml4ZWQgJ2J1aWxkY29uZicgdG8gY2hlY2sgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHJlcXVpcmVkIHRvb2xzIGJlZm9yZQogIHRoZXkncmUgYWN0dWFsbHkgdXNlZC4KCi0gV3JvdGUgJ3Rlc3RjdXJsLnNoJywgYSBzY3JpcHQgdGFyZ2V0ZWQgZm9yIGF1dG9tYXRpYyBhbmQgZGlzdHJpYnV0ZWQgY3VybAogIHRlc3RzIG9uIHZhcmlvdXMgcGxhdGZvcm1zLgoKLSBEYXZpZCBUaGllbCBwb2ludGVkIG91dCB0aGF0IHRoZSAubmV0cmMgZmlsZSB3YXMgbm90IGJlaW5nIGRlYWx0IHdpdGgKICBwcm9wZXJseSBhbnltb3JlLiBJIGJyb2tlIHRoaXMgaW4gdGhlIHBhc3N3b3JkIHByb21wdGluZyAiZml4Ii4KCi0gTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIgcGF0Y2hlZCBsaWJjdXJsIHRvIGFsbG9jYXRlIHRoZSBzY3JhdGNoIGJ1ZmZlciBvbmx5CiAgb24gZGVtYW5kIGFuZCB0aHVzIHdlIHNhdmUgMzJLQiBpbiBlYWNoIGN1cmwgaGFuZGxlIHRoYXQgZG9uJ3QgdXNlIHRoYXQKICBidWZmZXIuIFRoaXMgbmVlZCBhcHBlYXJlZCB3aGVuIHNvbWUgcGVvcGxlIHN0YXJ0ZWQgdXNpbmcgdGhvdXNhbmRzIG9mCiAgc2ltdWx0YW5lb3VzIGN1cmwgaGFuZGxlcy4uLiA6LSkKCkRhbmllbCAoMTYgSmFuIDIwMDMpCi0gTWFya3VzIE9iZXJodW1lciBmaXhlZCBjdXJsLWNvbmZpZyAtLWNmbGFncyB3aGVuIHRoZSBpbmNsdWRlZGlyIHdhcyBub3QKICAvdXNyL2luY2x1ZGUuCgotIE1hcmt1cyBPYmVyaHVtZXIgZml4ZWQgQ1VSTElORk9fUFJJVkFURSB0byBwcm9wZXJseSByZXR1cm4gTlVMTCBpZiBpdCB3YXMKICBzZXQgdG8gTlVMTCEKClZlcnNpb24gNy4xMC4zICgxNCBKYW4gMjAwMykKCkRhbmllbCAoMTAgSmFuIDIwMDMpCi0gU3RldmUgT2xpcGhhbnQgcG9pbnRlZCBvdXQgdGhhdCB0ZXN0IGNhc2UgMTA1IGRpZCBub3Qgd29yayBhbnltb3JlIGFuZCB0aGlzCiAgd2FzIGR1ZSB0byBhIG1pc3NpbmcgZml4IGZvciB0aGUgcGFzc3dvcmQgcHJvbXB0aW5nLgoKVmVyc2lvbiA3LjEwLjMtcHJlNiAoMTAgSmFuIDIwMDMpCgpEYW5pZWwgKDkgSmFuIDIwMDMpCi0gQnJ5YW4gS2VtcCBwb2ludGVkIG91dCB0aGF0IGN1cmwgLXUgY291bGQgbm90IHByb3ZpZGUgYSBibGFuayBwYXNzd29yZAogIHdpdGhvdXQgcHJvbXB0aW5nIHRoZSB1c2VyLiBJdCBjYW4gbm93LiAtdSB1c2VybmFtZTogbWFrZXMgdGhlIHBhc3N3b3JkCiAgZW1wdHksIHdoaWxlIC11IHVzZXJuYW1lIG1ha2VzIGN1cmwgcHJvbXB0IHRoZSB1c2VyIGZvciBhIHBhc3N3b3JkLgoKLSBLamV0aWwgSmFjb2JzZW4gZm91bmQgYSByZW1haW5pbmcgY29ubmVjdCBwcm9ibGVtIGluIHRoZSBtdWx0aSBpbnRlcmZhY2Ugb24KICBpcHY0IHN5c3RlbXMgKExpbnV4IG9ubHk/KSwgdGhhdCBJIGZpeGVkIGFuZCBLamV0aWwgdmVyaWZpZWQgdGhhdCBpdCBmaXhlZAogIGhpcyBwcm9ibGVtcy4KCi0gbWVtYW5hbHl6ZS5wbCBub3cgcmVhZHMgYSBmaWxlIG5hbWUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBhbmQgbm8gbG9uZ2VyCiAgdGFrZXMgdGhlIGRhdGEgb24gc3RkaW4gYXMgYmVmb3JlLgoKVmVyc2lvbiA3LjEwLjMtcHJlNSAoOSBKYW4gMjAwMykKCkRhbmllbCAoOSBKYW4gMjAwMykKLSBGaXhlZCB0ZXN0cy9tZW1hbmFseXplLnBsIHRvIHdvcmsgd2l0aCBmaWxlIG5hbWVzIHRoYXQgY29udGFpbiBjb2xvbnMgKGFzIG9uCiAgV2luZG93cykuCgotIEtqZXRpbCBKYWNvYnNlbiBxdWlja2x5IHBvaW50ZWQgb3V0IHRoYXQgbGliL3NoYXJlLmggd2FzIG1pc3NpbmcuLi4KClZlcnNpb24gNy4xMC4zLXByZTQgKDkgSmFuIDIwMDMpCgpEYW5pZWwgKDkgSmFuIDIwMDMpCi0gVXBkYXRlZCBsaWIvc2hhcmUuYyBxdWl0ZSBhIGJpdCB0byBtYXRjaCB0aGUgZGVzaWduIGRvY3VtZW50IGF0CiAgaHR0cHM6Ly9jdXJsLmhheHguc2UvZGV2L3NoYXJpbmcudHh0IGEgbG90IG1vcmUuCgogIEknbGwgdHJ5IHRvIHVwZGF0ZSB0aGUgZG9jdW1lbnQgc29vbmlzaC4gc2hhcmUuYyBpcyBzdGlsbCBub3QgYWN0dWFsbHkgdXNlZAogIGJ5IGxpYmN1cmwsIGJ1dCB0aGUgQVBJIGlzIHNsb3dseSBnZXR0aW5nIHRoZXJlIGFuZCB3ZSBjYW4gc3RhcnQKICBpbXBsZW1lbnRpbmcgY29kZSB0aGF0IHRha2VzIGFkdmFudGFnZSBvZiB0aGlzIHN5c3RlbS4KCkRhbmllbCAoOCBKYW4gMjAwMykKLSBVcGRhdGVkIHNoYXJlIHN0dWZmIGluIGN1cmwvY3VybC5oLCBpbmNsdWRpbmcgZGF0YSB0eXBlcywgc3RydWN0cyBhbmQKICBmdW5jdGlvbiBwcm90b3R5cGVzLiBUaGUgY29ycmVzcG9uZGluZyBmaWxlcyBpbiBsaWIvIHdlcmUgYWxzbyBtb2RpZmllZAogIG9mIGNvdXJzZSB0byByZW1haW4gY29tcGlsYWJsZS4gQmFzZWQgb24gaW5wdXQgZnJvbSBKZWFuLVBoaWxpcHBlIGFuZCBhbHNvCiAgdG8gbWFrZSBpdCBtb3JlIGluIGxpbmUgd2l0aCB0aGUgZGVzaWduIGRvY3VtZW50LgoKLSBKZWFuLVBoaWxpcHBlIEJhcnJldHRlLUxhUGllcnJlIHBhdGNoZWQgYSB2ZXJ5IHRyaXZpYWwgbWVtb3J5IGxlYWsgaW4KICBjdXJsX2VzY2FwZSgpIHRoYXQgd291bGQgaGFwcGVuIHdoZW4gcmVhbGxvYygpIHJldHVybnMgTlVMTC4uLgoKLSBNYXR0aGV3IEJsYWluIHByb3ZpZGVkIGZlZWRiYWNrIHRvIG1ha2UgdGhlIC0tY3JlYXRlLWRpcnMgc3R1ZmYgYnVpbGQKICBwcm9wZXJseSBvbiBXaW5kb3dzLgoKLSBGaXhlZCB0aGUgI2luY2x1ZGUgaW4gdGVzdHMvbGlidGVzdC9maXJzdC5jIGFzIExlZ29mZiBWaW5jZW50IHBvaW50ZWQgb3V0LgoKRGFuaWVsICg3IEphbiAyMDAzKQotIFBoaWxpcHBlIFJhb3VsdCBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbm93IG1ha2VzIGxpYmN1cmwgcHJvcGVybHkgc3VwcG9ydAogIHdpbGRjYXJkIGNoZWNrcyBmb3IgY2VydGlmaWNhdGUgbmFtZXMuCgotIFNpbW9uIExpdSBhZGRlZCBDVVJMT1BUX0hUVFAyMDBBTElBU0VTLCB0byBsZXQgYW4gYXBwbGljYXRpb24gc2V0IG90aGVyCiAgc3RyaW5ncyByZWNvZ25pemVkIGFzICJIVFRQIDIwMCIgdG8gYWxsb3cgaHR0cC1saWtlIHByb3RvY29scyB0byBnZXQKICBkb3dubG9hZGVkIGZpbmUgYnkgY3VybC4KCi0gTm93IHVzaW5nIGF1dG9jb25mIDIuNTcgYW5kIGF1dG9tYWtlIDEuNy4yCgotIERvaW5nICJjdXJsIC1JIGZ0cDovL2RvbWFpbi9ub24tZXhpc3RpbmctZmlsZSIgc3RpbGwgb3V0cHV0ZWQgYSBkYXRlIQogIFdheW5lIEhhaWdoIHJlcG9ydGVkLgoKLSBUaGUgZXJyb3IgbWVzc2FnZSBpcyBub3cgd3JpdHRlbiBwcm9wZXJseSB3aXRoIGEgbmV3bGluZSBpbiB0aGUgLS10cmFjZQogIGZpbGUuCgpEYW5pZWwgKDYgSmFuIDIwMDMpCi0gU3RlcmxpbmcgSHVnaGVzIGZpeGVkIGEgcG9zc2libGUgYnVnOiBwcmV2aW91c2x5LCBpZiB5b3UgY2FsbGVkCiAgY3VybF9lYXN5X3BlcmZvcm0gYW5kIHRoZW4gc2V0IHRoZSBnbG9iYWwgZG5zIGNhY2hlLCB0aGUgZ2xvYmFsIGNhY2hlCiAgd291bGRuJ3QgYmUgdXNlZC4gUG9pbnRlZCBvdXQgYnkgSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZS4KCi0gTWF0dGhldyBCbGFpbidzIGZpeGVkIHRoZSBWQzYgbGliY3VybCBtYWtlZmlsZSB0byBpbmNsdWRlIGJldHRlciBkZWJ1ZyBkYXRhCiAgb24gZGVidWcgYnVpbGRzLgpEYW5pZWwgKDI3IERlYyAyMDAyKQotIFBoaWxpcHBlIFJhb3VsdCByZXBvcnRlZCBhIGJ1ZyB3aXRoIEhUVFBTIGNvbm5lY3Rpb25zIHdoaWNoIEkgZXZpZGVudGx5CiAgYWRkZWQgaW4gbXkgMTkgZGVjIGZpeC4gSSBjb3JyZWN0ZWQgaXQuCgpEYW5pZWwgKDIwIERlYykKLSBJZGVhIGZyb20gdGhlIERlYmlhbiBsYXRlc3QgcGF0Y2g6IHVzZSBBTV9NQUlOVEFJTkVSX01PREUgaW4gdGhlIGNvbmZpZ3VyZQogIHNjcmlwdCB0byBtYWtlIHRoZSBkZWZhdWx0IG1ha2VmaWxlIGxlc3MgY29uZnVzaW5nICJ0byB0aGUgY2FzdWFsCiAgaW5zdGFsbGVyIi4KClZlcnNpb24gNy4xMC4zLXByZTMgKDIwIERlYykKCkRhbmllbCAoMTkgRGVjKQotIE1hdHRoZXcgQmxhaW4gcGF0Y2hlZCB0aGUgQ3VybF9iYXNlNjRfZGVjb2RlKCkgZnVuY3Rpb24uCgotIEV2YW4gSm9yZGFuIHJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzY1MzAyMiB0aGF0IHRoZSBTU0xfcmVhZCgpIHVzYWdlIHdhcwogIHdyb25nLCBhbmQgaXQgY2VydGFpbmx5IHdhcy4gSXQgY291bGQgbGVhZCB0byBjdXJsIHVzaW5nIHRvbyBtdWNoIENQVSBkdWUgdG8KICBhIHN0dXBpZCBsb29wLgoKRGFuaWVsICgxOCBEZWMpCi0gQXMgc3VnZ2VzdGVkIGJ5IE1hcmd1cyBGcmV1ZGVudGhhbCwgQ1VSTEVfSFRUUF9OT1RfRk9VTkQgd2FzIHJlbmFtZWQgdG8KICBDVVJMRV9IVFRQX1JFVFVSTkVEX0VSUk9SIHNpbmNlIGl0IGlzIHJldHVybmVkIG9uIGFueSA+PSA0MDAgY29kZSB3aGVuCiAgQ1VSTE9QVF9GQUlMT05FUlJPUiBpcyBzZXQuCgpEYW5pZWwgKDE3IERlYykKLSBCdWcgcmVwb3J0ZWQgIzY1MTQ2NCwgcmVwb3J0ZWQgYnkgQ2hyaXN0b3BoZXIgUGFsbWVyLCBwcm92aWRlZCBhbiBleGFtcGxlCiAgc291cmNlIGNvZGUgdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSB0aGF0IGhhbmcgd2hlbiB0cnlpbmcgdG8gY29ubmVjdCB0byBhCiAgcHJveHkgb24gYSBsb2NhbGhvc3QgcG9ydCB3aGVyZSBubyBwcm94eSB3YXMgbGlzdGVuaW5nLiBUaGlzIGJ1ZyB3YXMgbm90CiAgcmVwZWF0YWJsZSBvbiBsaWJjdXJscyB0aGF0IHdlcmUgSVB2Ni1lbmFibGVkLgoKRGFuaWVsICgxNiBEZWMpCi0gQ2hyaXN0b3BoZXIgUGFsbWVyIGFsc28gbm90aWNlZCB3aGF0IFZvanRlY2ggSmFub3RhIGFscmVhZHkgd2FzCiAgZXhwZXJpZW5jaW5nOiBUaGUgYXR0ZW1wdGVkIG5hbWUgcmVzb2x2ZSBmaXggZm9yIGdsaWJjIDIuMi45MyBjYXVzZWQgbGliY3VybAogIHRvIGNyYXNoIHdoZW4gdXNlZCBvbiBzb21lIG9sZGVyIGdsaWJjIHZlcnNpb25zLiBUaGUgcHJvYmxlbSBpcyBvZiBjb3Vyc2UKICB0aGUgc2lsbGluZXNzIG9mIHRoZSAyLjIuOTMuIEkgY29tbWl0dGVkIGEgZml4IHRoYXQgaG9wZWZ1bGx5IHNob3VsZCBtYWtlCiAgdGhlIGJpbmFyeSBydW4gZmluZSBvbiBlaXRoZXIgb25lIG9mIHRoZSB2ZXJzaW9ucywgZXZlbiB0aG91Z2ggdGhlIHNvbHV0aW9uCiAgaXMgbm90IGFzIG5pY2UgYXMgSSdkIGxpa2UgaXQgdG8gYmUuCgpEYW5pZWwgKDEzIERlYykKLSBCdWcgcmVwb3J0ICM2NTE0NjAgYnkgQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIHNob3dlZCB0aGF0IHdoZW4gdXNpbmcgbGliY3VybAogIHRvIGZvciBleGFtcGxlIGdvIG92ZXIgYSBwcm94eSBvbiBsb2NhbGhvc3QsIGl0IHdvdWxkIGF0dGVtcHQgdG8gY29ubmVjdAogIHRocm91Z2ggdGhlIHByb3h5IFRXSUNFLgoKICBJIGFkZGVkIHRlc3QgY2FzZSA1MDMgd2l0aCB3aGljaCBJIG1hbmFnZWQgdG8gcmVwZWF0IHRoaXMgcHJvYmxlbSBhbmQgSQogIGZpeGVkIHRoZSBjb2RlIHRvIG5vdCByZS1hdHRlbXB0IGFueSBjb25uZWN0cyAod2hpY2ggYWxzbyBtYWRlIGl0IGEgbmljZXIKICBmaXggZm9yIHRoZSAjNjUwOTQxIGJ1ZyBtZW50aW9uZWQgYmVsb3cpLgoKICBUaGUgc3dzIHNlcnZlciB3YXMgZXh0ZW5kZWQgdG8gZGVhbCB3aXRoIENPTk5FQ1QgaW4gb3JkZXIgdG8gbWFrZSB0ZXN0CiAgY2FzZSA1MDMgZG8gZ29vZC4KCi0gRXZhbiBKb3JkYW4gcG9zdGVkIGJ1ZyByZXBvcnQgIzY1MDk4OSBhYm91dCBhIG1lbW9yeSBsZWFrIGluIHRoZSBwdWJsaWMga2V5CiAgcmV0cmlldmluZyBjb2RlLiBIZSBwcm92aWRlZCBhIHN1Z2dlc3RlZCBmaXggYW5kIEkgbWVyZWx5IGFwcGxpZWQgaXQhCgotIEJ1ZyByZXBvcnQgIzY1MDk0MSwgcG9zdGVkIGJ5IENocmlzdG9waGVyIFIuIFBhbG1lciBpZGVudGlmaWVkIGEgcHJvYmxlbQogIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBhbmQgZ2V0dGluZyBmaWxlOi8vIFVSTHMuIFRoaXMgd2FzIG5vdyBmaXhlZCBhbmQKICB0ZXN0IGNhc2UgNTAyIHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMTIgRGVjKQotIFRlc3QgY2FzZSA1MDAgYW5kIDUwMSBhcmUgdGhlIGZpcnN0IGV2ZXIgbGliY3VybCB0ZXN0IGNhc2VzIHRoYXQgcnVuLgoKLSBNYWRlICJjb25maWd1cmUgLS1lbmFibGUtZGVidWciIGN1dCBvZmYgYWxsIC1PKiBvcHRpb25zIHRvIHRoZSBjb21waWxlcgoKLSBGaW5hbGx5IGZpeGVkIHRoZSB0ZXN0IHN1aXRlJ3MgZnRwIHNlcnZlciBzbyB0aGF0IHRlc3QgY2FzZSA0MDIgZG9lc24ndAogIGNhdXNlIHRoZSBmb2xsb3dpbmcgdGVzdCBjYXNlIHRvIGZhaWwgYW55bW9yZSEKCkRhbmllbCAoMTEgRGVjKQotIENVUkxfTUFYX1dSSVRFX1NJWkUgaXMgbm93IGRlY3JlYXNlZCB0byAxNktCIHNpbmNlIGl0IG1ha2VzIHRoZSBXaW5kb3dzCiAgdmVyc2lvbiBwZXJmb3JtIHVwbG9hZHMgbXVjaCBmYXN0ZXIhISEgUkJyYW1hbnRlIGRpZCBsb3RzIG9mIHJlc2VhcmNoIG9uCiAgdGhpcyB0b3BpYy4KCi0gRml4ZWQgdGhlICNpbmNsdWRlIGluIGN1cmwvY3VybC5oIHRvIGluY2x1ZGUgdGhlIG90aGVyIGZpbGVzIG91dHNpZGUgdGhlCiAgZXh0ZXJuICJDIiBzY29wZS4KCkRhbmllbCAoMTAgRGVjKQotIE1vdmVkIGFyb3VuZCBhbmQgYWRkZWQgbW9yZSBsb2dpYzoKCiAgRmlyc3QsIFBPU1QgZGF0YSBpcyBuZXZlciBzZW50IGFzIHBhcnQgb2YgdGhlIHJlcXVlc3QgaGVhZGVycyBpbiB0aGUgaHR0cC5jCiAgY29kZS4gSXQgaXMgYWx3YXlzIHNlbnQgdGhlICJub3JtYWwiIHJlYWQgY2FsbGJhY2sgdGhlbiBzZW5kKCkgd2F5LiBUaGlzIG5vdwogIGVuYWJsZXMgYSBwbGFpbiBIVFRQIFBPU1QgdG8gYmUgc2VudCBjaHVua2VkIGlmIHdlIHdhbnQgdG8uIFRoaXMgYWxzbwogIHJlZHVjZXMgdGhlIHJpc2sgb2YgaGF2aW5nIHZlcnkgYmlnIFBPU1RzIGNhdXNpbmcgcHJvYmxlbXMuCgogIEZ1cnRoZXIsIHNlbmRpbmcgb2ZmIHRoZSBpbml0aWFsIEhUVFAgcmVxdWVzdCBpcyBub3QgZG9uZSB1c2luZyBhIGxvb3AKICBhbnltb3JlLiBJZiBpdCB3YXNuJ3QgYWxsIHNlbnQgb2ZmIGluIHRoZSBmaXJzdCBzZW5kKCksIHRoZSByZXN0IG9mIHRoZQogIHJlcXVlc3QgaXMgc2VudCBvZmYgaW4gdGhlIG5vcm1hbCB0cmFuc2ZlciBzZWxlY3QoKSBsb29wLiBUaGlzIG1ha2VzIHNldmVyYWwKICB0aGluZ3MgcG9zc2libGUsIGJ1dCBtYWlubHkgaXQgbWFrZXMgbGliY3VybCBibG9jayBsZXNzIHdoZW4gdXNlZCBmcm9tIHRoZQogIG11bHRpIGludGVyZmFjZSBhbmQgaXQgYWxzbyByZWR1Y2VzIHRoZSByaXNrIG9mIHByb2JsZW1zIHdpdGggaXNzdWluZyB2ZXJ5CiAgbGFyZ2UgcmVxdWVzdHMuCgpEYW5pZWwgKDkgRGVjKQotIE1vdmVkIHRoZSByZWFkIGNhbGxiYWNrIHBvaW50ZXIgYW5kIGRhdGEgd2l0aGluIHRoZSBzdHJ1Y3RzIHRvIGEgbW9yZQogIHN1aXRhYmxlIHBsYWNlLiBUaGlzIGluIHByZXBhcmF0aW9uIGZvciBhIGJldHRlciBIVFRQLXJlcXVlc3Qgc2VuZGluZyBjb2RlCiAgd2l0aG91dCAoYSBzaWxseSkgbG9vcC4KCi0gVGhlIERvZGRzIGZpeCBzZWVtcyBub3QgdG8gd29yay4KCi0gVm9qdGVjaCBKYW5vdGEgdGVzdHMgcHJvdmVkIHRoYXQgdGhlIHJlc29sdmUgZml4IGZyb20gb2N0IDIxc3QgaXMgbm90IGdvb2QKICBlbm91Z2ggc2luY2Ugb2J2aW91c2x5IG9sZGVyIGdsaWJjcyBtaWdodCByZXR1cm4gRUFHQUlOIHdpdGhvdXQgdGhpcyBtZWFuaW5nCiAgdGhhdCB0aGUgYnVmZmVyIHdhcyB0b28gc21hbGwuCgotIFt0aGUgb3RoZXIgZGF5XSBNYWRlIGxpYmN1cmwgbG9vcCBvbiByZWN2KCkgYW5kIHNlbmQoKSBub3cgdW50aWwgZG9uZSwgYW5kCiAgdGhlbiBnZXQgYmFjayB0byBzZWxlY3QoKS4gUHJldmlvdXNseSBpdCB3ZW50IGJhY2sgdG8gc2VsZWN0KCkgbW9yZSBvZnRlbgogIHdoaWNoIHJlYWxseSB3YXMgYSBzbGlnaHQgb3ZlcmhlYWQuIFRoaXMgd2FzIGR1ZSB0byB0aGUgcmVwb3J0ZWQgcGVyZm9ybWFuY2UKICBwcm9ibGVtcyBvbiBIVFRQIFBVVCBvbiBXaW5kb3dzLiBJIGNvdWxkbid0IHNlZSBhbnkgbm90YWJsZSBkaWZmZXJlbmNlIG9uCiAgTGludXguLi4KClZlcnNpb24gNy4xMC4zLXByZTIgKDQgRGVjIDIwMDIpCgpEYW5pZWwgKDQgRGVjIDIwMDIpCi0gTG90cyBvZiB3b3JrIHdpdGggTWFsY29sbSBEb2RkcyBtYWRlIG1lIGFkZCBhIHRlbXBvcmFyeSBjb2RlIGZpeCB0aGF0IG5vdwogIHNob3J0ZW5zIHRoZSB0aW1lb3V0IHdhaXRpbmcgZm9yIHRoZSAyMjYgb3IgMjUwIGxpbmUgYWZ0ZXIgYSBjb21wbGV0ZWQKICBGVFAgdHJhbnNmZXIuCgogIElmIG5vIGRhdGEgaXMgcmVjZWl2ZWQgd2l0aGluIDYwIHNlY29uZHMsIHRoaXMgaXMgdGFrZW4gYXMgYSBzaWduIG9mIGEgZGVhZAogIGNvbnRyb2wgY29ubmVjdGlvbiBhbmQgd2UgYmFpbCBvdXQuCgpEYW5pZWwgKDMgRGVjIDIwMDIpCi0gUmFscGgncyBidWcgcmVwb3J0ICM2NDQ4NDEgaWRlbnRpZmllZCBhIHByb2JsZW0gaW4gd2hpY2ggY3VybCByZXR1cm5lZCBhCiAgdGltZW91dCBlcnJvciBjb2RlIHdoZW4gaW4gZmFjdCB0aGUgcHJvYmxlbSB3YXMgbm90IGEgdGltZW91dC4gVGhlIHByb3BlcgogIGVycm9yIHNob3VsZCBub3cgYmUgcHJvcGFnYXRlZCBiZXR0ZXIgd2hlbiB0aGV5J3JlIGRldGVjdGVkIGluIHRoZSBGVFAKICByZXNwb25zZSByZWFkaW5nIGZ1bmN0aW9uLgoKLSBVcGRhdGVkIHRoZSBCb3JsYW5kIE1ha2VmaWxlcy4KCkRhbmllbCAoMiBEZWMgMjAwMikKLSBOaWNvbGFzIEJlcmxvcXVpbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlZCAtLWNyZWF0ZS1kaXJzIHRvIHRoZQogIGNvbW1hbmQgbGluZSB0b29sLiBXaGVuIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCAtbywgaXQgbGV0cyBjdXJsIGNyZWF0ZQogIFtub24tZXhpc3RpbmddIGRpcmVjdG9yaWVzIHVzZWQgaW4gLW8sIHN1aXRhYmx5IHVzZWQgd2l0aCAjLWNvbWJpbmF0aW9ucwogIHN1Y2ggYXM6CgogICAgIGN1cmwgInd3dy5pbWFnZXMuY29tL3tmbG93ZXJzLGNpdGllcyxwYXJrcyxtb3VudGFpbnN9L3BpY19bMS0xMDBdLmpwZyBcCiAgICAgICAtbyAiZGlyXyMxL3BpYyMyLmpwZyIgLS1jcmVhdGUtZGlycwoKVmVyc2lvbiA3LjEwLjMtcHJlMQoKRGFuaWVsICgyOCBOb3YgMjAwMikKLSBJIHZpc2l0ZWQgTGFycyBOb3JkZ3JlbiBhbmQgaGFkIGEgZ28gd2l0aCBoaXMgcHJvYmxlbSwgd2hpY2ggbGVhZCBtZSB0bwogIGltcGxlbWVudCB0aGlzIGZpeC4gSWYgbGliY3VybCBkZXRlY3RzIHRoZSBhZGRlZCBjdXN0b20gaGVhZGVyCiAgIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIiwgaXQgd2lsbCBub3cgZW5hYmxlIGEgY2h1bmtlZCB0cmFuc2Zlci4KCiAgQWxzbywgY2h1bmtlZCB0cmFuc2ZlciBkaWRuJ3QgcXVpdGUgd29yayBiZWZvcmUgYnV0IHNlZW1zIHRvIGRvIHNvIG5vdy4KCi0gS2pldGlsIEphY29ic2VuIHBvaW50ZWQgb3V0IHRoYXQgLi9jb25maWd1cmUgLS1kaXNhYmxlLWlwdjYgLS13aXRob3V0LXpsaWIKICBkaWRuJ3Qgd29yayBvbiBhbnkgcGxhdGZvcm0uLi4KCkRhbmllbCAoMjYgTm92IDIwMDIpCi0gRml4ZWQgYSBiYWQgYWRkcmluZm8gZnJlZSBpbiB0aGUgaG9zdGlwLmMgY29kZSwgaGFyZGx5IGV4cG9zZWQgYW55d2hlcmUKCi0gRGFuIEJlY2tlciBmb3VuZCBhbmQgZml4ZWQgYSBtaW5vciBtZW1vcnkgbGVhayBvbiBwZXJzaXN0ZW50IGNvbm5uZWN0aW9ucwogIHVzaW5nIENVUkxPUFRfVVNFUlBXRC4KCkRhbmllbCAoMjIgTm92IDIwMDIpCi0gQmFzZWQgb24gUmFscGggTWl0Y2hlbGwncyBleGNlbGxlbnQgYW5hbHlzaXMgSSBmb3VuZCBhIGJ1ZyBpbiB0aGUgdGVzdCBzdWl0ZQogIHdlYiBzZXJ2ZXIgKHN3cykgd2hpY2ggbm93IGxldHMgdGVzdCBjYXNlIDMwNiBydW4gZmluZSBldmVuIGluIGNvbWJpbmF0aW9uCiAgd2l0aCB0aGUgb3RoZXIgdGVzdCBjYXNlcy4KCi0gSnVhbiBJZ25hY2lvIEhlcnbhcyBmb3VuZCBhIGNyYXNoIGluIHRoZSB2ZXJib3NlIGNvbm5lY3QgbWVzc2FnZSB0aGF0IGlzCiAgdXNlZCBvbiBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zLiBUaGlzIGJ1ZyB3YXMgYWRkZWQgaW4gNy4xMC4yIGR1ZSB0byB0aGUKICByZWFycmFuZ2VkIG5hbWUgcmVzb2x2ZSBjb2RlLgoKRGFuaWVsICgyMCBOb3YgMjAwMikKLSBLamV0aWwgSmFjb2JzZW4gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGludHJvZHVjZXM6CgogICBDVVJMT1BUX1BSSVZBVEUgc3RvcmVzIGEgcHJpdmF0ZSBwb2ludGVyIGluIHRoZSBjdXJsIGhhbmRsZS4KCiAgIENVUkxJTkZPX1BSSVZBVEUgcmV0cmlldmVzIHRoZSBwcml2YXRlIHBvaW50ZXIgZnJvbSB0aGUgY3VybCBoYW5kbGUuCgotIEthcm9sIFBpZXRyemFrIHBvaW50ZWQgb3V0IGhvdyBjdXJsLWNvbmZpZyAtLWNmbGFncyBkaWRuJ3Qgb3V0cHV0IGEgZ29vZAogIGluY2x1ZGUgZGlyIHNvIEkndmUgcmVtb3ZlZCB0aGF0IGZvciBub3cuCgpWZXJzaW9uIDcuMTAuMiAoMTggTm92IDIwMDIpCgpEYW5pZWwgKDExIE5vdiAyMDAyKQotIERhdmUgSGFsYmFra2VuIGFkZGVkIGN1cmxfdmVyc2lvbl9pbmZvIHRvIGxpYi9saWJjdXJsLmRlZiB0byBtYWtlIGxpYmN1cmwKICBwcm9wZXJseSBidWlsZCB3aXRoIE1TVkMgb24gV2luZG93cy4KCkRhbmllbCAoOCBOb3YgMjAwMikKLSBEb2luZyBIVFRQIFBVVCB3aXRob3V0IGEgc3BlY2lmaWVkIGZpbGUgc2l6ZSBub3cgbWFrZXMgbGliY3VybCB1c2UKICBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZC4KCkRhbmllbCAoNyBOb3YgMjAwMikKLSBCdWcgcmVwb3J0ICM2MzQ2MjUgaWRlbnRpZmllZCBob3cgY3VybCByZXR1cm5lZCB0aW1lb3V0IGltbWVkaWF0ZWx5IHdoZW4KICBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUIHdhcyB1c2VkIGFuZCBwcm92aWRlZCBhIGZpeC4KClZlcnNpb24gNy4xMC4yLXByZTQgKDYgTm92IDIwMDIpCgpEYW5pZWwgKDUgTm92IDIwMDIpCi0gTGVoZWwgQmVybmFkdCBmb3VuZCBvdXQgYW5kIGZpeGVkLiBsaWJjdXJsIHNlbnQgZXJyb3IgbWVzc2FnZSB0byB0aGUgZGVidWcKICBvdXRwdXQgd2hlbiBpdCBzdG9yZWQgdGhlIGVycm9yIG1lc3NhZ2UuCgotIEF2ZXJ5IEZheSBmb3VuZCBzb21lIHByb2JsZW1zIHdpdGggdGhlIEROUyBjYWNoZSAod2hlbiB0aGUgY2FjaGUgdGltZSB3YXMKICBzZXQgdG8gMCB3ZSBnb3QgYSBtZW1vcnkgbGVhaywgYnV0IHdoZW4gdGhlIGxlYWsgd2FzIGZpeGVkIGhlIGdvdCBhIGNyYXNoCiAgd2hlbiBoZSB1c2VkIHRoZSBDVVJMT1BUX0lOVEVSRkFDRSB3aXRoIHRoYXQpIHRoYXQgaGFkIG1lIGRvIHNvbWUgcmVhbAogIHJlc3RydWN0dXJpbmcgc28gdGhhdCB3ZSBub3cgaGF2ZSBhIHJlZmVyZW5jZSBjb3VudGVyIGluIHRoZSBkbnMgY2FjaGUKICBlbnRyaWVzIHRvIHByZXZlbnQgYW4gZW50cnkgdG8gZ2V0IGZsdXNoZWQgd2hpbGUgc3RpbGwgYWN0dWFsbHkgaW4gdXNlLgoKICBJIGFsc28gZGV0ZWN0ZWQgdGhhdCB3ZSBwcmV2aW91c2x5IGRpZG4ndCB1cGRhdGUgdGhlIHRpbWUgc3RhbXAgd2hlbiB3ZQogIGV4dHJhY3RlZCBhbiBlbnRyeSBmcm9tIHRoZSBjYWNoZSBzbyB0aGF0IG11c3QndmUgYmVlbiBhIHJlYXNvbiBmb3Igc29tZQogIHZlcnkgd2VpcmQgZG5zIGNhY2hlIGJ1Z3MuCgpWZXJzaW9uIDcuMTAuMi1wcmUzCgpEYW5pZWwgKDMxIE9jdCAyMDAyKQotIERvd25ncmFkZWQgYXV0b21ha2UgdG8gMS42LjMgaW4gYW4gYXR0ZW1wdCB0byBmaXggY3lnd2luIHByb2JsZW1zLiAoSXQKICB0dXJuZWQgb3V0IHRoaXMgZGlkbid0IGhlbHAgdGhvdWdoLikKCi0gRGlzYWJsZSB0aGUgRE5TIGNhY2hlIChieSBzZXR0aW5nIHRoZSB0aW1lb3V0IHRvIDApIG1hZGUgbGliY3VybCBsZWFrCiAgbWVtb3J5LiBBdmVyeSBGYXkgYnJvdWdodCB0aGUgZXhhbXBsZSBjb2RlIHRoYXQgcHJvdmVkIHRoaXMuCgpWZXJzaW9uIDcuMTAuMi1wcmUyCgpEYW5pZWwgKDI4IE9jdCAyMDAyKQotIFVwZ3JhZGVkIHRvIGF1dG9jb25mIDIuNTQgYW5kIGF1dG9tYWtlIDEuNyBvbiB0aGUgcmVsZWFzZS1idWlsZCBob3N0LgoKLSBLZXZpbiBSb3RoIG1hZGUgdGhlIGNvbW1hbmQgbGluZSB0b29sIGNoZWNrIGZvciBhIENVUkxfQ0FfQlVORExFIGVudmlyb25tZW50CiAgdmFyaWFibGUgKGlmIC0tY2FjZXJ0IGlzbid0IHVzZWQpIGFuZCBpZiBub3Qgc2V0LCB0aGUgV2luZG93cyB2ZXJzaW9uIHdpbGwKICBjaGVjayBmb3IgYSBmaWxlIG5hbWVkICJjdXJsLWNhLWJ1bmRsZS5jcnQiIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBvciB0aGUKICBkaXJlY3Rvcnkgd2hlcmUgY3VybCBpcyBsb2NhdGVkLiBUaGF0IGZpbGUgaXMgdGhlbiB1c2VkIGFzIENBIHJvb3QgY2VydAogIGJ1bmRsZS4KCi0gQXZlcnkgRmF5IHBvaW50ZWQgb3V0IHRoYXQgY3VybCdzIGNvbmZpZ3VyZSBzY3JpcCBkaWRuJ3QgZ2V0IHJpZ2h0IGlmIHlvdQogIHVzZWQgYXV0b2NvbmYgbmV3ZXIgdGhhbiAyLjUyLiBUaGlzIHdhcyBkdWUgdG8gc29tZSBiYWRseSBxdW90ZWQgY29kZS4KClZlcnNpb24gNy4xMC4yLXByZTEKCkRhbmllbCAoMjMgT2N0IDIwMDIpCi0gRW1pbGlhbm8gSWRhIGNvbmZpcm1lZCB0aGF0IHdlIG5vdyBidWlsZCBwcm9wZXJseSB3aXRoIHRoZSBCb3JsYW5kIEMrKwogIGNvbXBpbGVyIHRvby4gV2UgbmVlZGVkIHlldCBhbm90aGVyIGZpeCBmb3IgdGhlIElTTyBjcHAgY2hlY2sgaW4gdGhlIGN1cmwuaAogIGhlYWRlciBmaWxlLgoKLSBZZXQgYW5vdGhlciBmaXggd2FzIG5lZWRlZCB0byBnZXQgdGhlIEhUVFAgZG93bmxvYWQgd2l0aG91dCBoZWFkZXJzIHRvIHdvcmsuCiAgVGhpcyB0aW1lIGl0IHdhcyBuZWVkZWQgaWYgdGhlIGZpcnN0ICJiZWxpZXZlZCBoZWFkZXIiIHdhcyByZWFkIGFsbCBpbiB0aGUKICBmaXJzdCByZWFkLiBUZXN0IDMwNiBoYXMgbm90IHJ1biBwcm9wZXJseSBzaW5jZSB0aGUgMTF0aCBvY3RvYmVyIGZpeC4KCkRhbmllbCAoMjEgT2N0IDIwMDIpCi0gWnZpIEhhcidFbCBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBjdXJsJ3MgbmFtZSByZXNvbHZpbmcgb24gUmVkaGF0IDgKICBtYWNoaW5lcyAocnVubmluZyBJUHY2IGRpc2FibGVkKS4gTWF0cyBMaWRlbGwgbGV0IG1lIHVzZSBhbiBhY2NvdW50IG9uIGhpcwogIG1hY2hpbmUgYW5kIEkgY291bGQgdmVyaWZ5IHRoYXQgZ2V0aG9zdGJ5bmFtZV9yKCkgaGFzIGJlZW4gY2hhbmdlZCB0byByZXR1cm4KICBFQUdBSU4gaW5zdGVhZCBvZiBFUkFOR0Ugd2hlbiB0aGUgZ2l2ZW4gYnVmZmVyIHNpemUgaXMgdG9vIHNtYWxsLiBUaGlzIGlzCiAgZ2xpYmMgMi4yLjkzLgoKLSBBbGJlcnQgQ2hpbiBoZWxwZWQgbWUgZ2V0IHRoZSAtbm8tdW5kZWZpbmVkIG9wdGlvbiBjb3JyZWN0ZWQgaW4KICBsaWIvTWFrZWZpbGUuYW0gc2luY2UgQ3lnd2luIGJ1aWxkcyB3YW50IGl0IHRoZXJlIHdoaWxlIFNvbGFyaXMgYnVpbGRzIGRvbid0CiAgd2FudCBpdCBwcmVzZW50LiBLZXZpbiBSb3RoIGhlbHBlZCBtZSB0cnkgaXQgb3V0IG9uIGN5Z3dpbi4KCi0gTmlraXRhIFNjaG1pZHQgcHJvdmlkZWQgYSBidWcgZml4IGZvciBhIEZPTExPV0xPQ0FUSU9OIGJ1ZyBpbnRyb2R1Y2VkIHdoZW4KICB0aGUgLi4vIHN1cHBvcnQgZ290IGluICg3LjEwLjEpLgoKRGFuaWVsICgxOCBPY3QgMjAwMikKLSBGYWJyaXppbyBBbW1vbGxvIHBvaW50ZWQgb3V0IGEgcmVtYWluaW5nIHByb2JsZW0gd2l0aCBGT0xMT1dMT0NBVElPTiBpbgogIHRoZSBtdWx0aSBpbnRlcmZhY2UuCgpEYW5pZWwgKDE3IE9jdCAyMDAyKQotIFJpY2hhcmQgQ29vcGVyJ3MgZXhwZXJpbWVudGluZyBwcm92ZWQgdGhhdCAtaiAoQ1VSTE9QVF9DT09LSUVTRVNTSU9OKSBkaWRuJ3QKICB3b3JrIHF1aXRlIGFzIHN1cHBvc2VkLiBZb3UgbmVlZGVkIHRvIHNldCBpdCAqYmVmb3JlKiB5b3UgdXNlCiAgQ1VSTE9QVF9DT09LSUVGSUxFLCBhbmQgd2UgZG9udCcgd2FudCB0aGF0IGtpbmQgb2YgZGVwZW5kZW5jaWVzLgoKRGFuaWVsICgxNSBPY3QgMjAwMikKLSBBbmRy6XMgR2FyY+1hIHByb3ZpZGVkIGNvcnJlY3Rpb25zIGZvciBlcnJhdGFzIGluIGZvdXIgbGliY3VybCBtYW4gcGFnZXMuCgpEYW5pZWwgKDEzIE9jdCAyMDAyKQotIFN0YXJ0aW5nIG5vdywgd2UgZ2VuZXJhdGUgYW5kIGluY2x1ZGUgUERGIHZlcnNpb25zIG9mIGFsbCB0aGUgZG9jcyBpbiB0aGUKICByZWxlYXNlIGFyY2hpdmVzLgoKRGFuaWVsICgxMiBPY3QgMjAwMikKLSBUcnlpbmcgdG8gY29ubmVjdCB0byBhIGhvc3Qgb24gYSBiYWQgcG9ydCBudW1iZXIgY2F1c2VkIHRoZSBtdWx0aSBpbnRlcmZhY2UKICB0byBuZXZlciByZXR1cm4gZmFpbHVyZSBhbmQgaXQgYXBwZWFyZWQgdG8ga2VlcCBvbiB0cnlpbmcgZm9yZXZlciAoaXQganVzdAogIGRpZG4ndCBkbyBhbnl0aGluZykuCgpEYW5pZWwgKDExIE9jdCAyMDAyKQotIERvd25sb2FkaW5nIEhUVFAgd2l0aG91dCBoZWFkZXJzIGRpZG4ndCB3b3JrIDEwMCUsIHNvbWUgb2YgdGhlIGluaXRpYWwgZGF0YQogIGdvdCB3cml0dGVuIHR3aWNlLiBLZXZpbiBSb3RoIHJlcG9ydGVkLgoKLSBLZXZpbiBSb3RoIGZvdW5kIG91dCB0aGUgImNvbmZpZyBmaWxlIiBwYXJzZXIgaW4gdGhlIGNsaWVudCBjb2RlIGNvdWxkCiAgc2VnZmF1bHQsIGxpa2UgaWYgRE9TIG5ld2xpbmVzIHdlcmUgdXNlZC4KClZlcnNpb24gNy4xMC4xICgxMSBPY3QgMjAwMikKCkRhbmllbCAoMTAgT2N0IDIwMDIpCi0gSmVmZiBMYXdzb24gZml4ZWQgYSBmZXcgcHJvYmxlbXMgd2l0aCBjb25uZWN0aW9uIHJlLXVzZSB0aGF0IHJlbWFpbmVkIHdoZW4KICB5b3Ugc2V0IENVUkxPUFRfUFJPWFkgdG8gIiIuCgpEYW5pZWwgKDkgT2N0IDIwMDIpCi0gQ3JhaWcgRGF2aXNvbiBmb3VuZCBhIHRlcnJpYmxlIGZsYXcgYW5kIENyaXMgQmFpbGlmZiBoZWxwZWQgb3V0IGluIHRoZQogIHNlYXJjaC4gR2V0dGluZyBIVFRQIGRhdGEgZnJvbSBzZXJ2ZXJzIHdoZW4gdGhlIGhlYWRlcnMgYXJlIHNwbGl0IHVwIGluCiAgbXVsdGlwbGUgcmVhZHMsIGNvdWxkIGNhdXNlIGp1bmsgZGF0YSB0byBnZXQgaW5zZXJ0ZWQgYW1vbmcgdGhlIHNhdmVkCiAgaGVhZGVycy4gVGhpcyBvbmx5IGNvbmNlcm5zIEhUVFAoUykgaGVhZGVycy4KCkRhbmllbCAoOCBPY3QgMjAwMikKLSBWaW5jZW50IFBlbnF1ZXJjJ2ggZ2F2ZSB1cyB0aGUgZ29vZCBzdWdnZXN0aW9uIHRoYXQgd2hlbiB0aGUgRVJSUk9SQlVGRkVSCiAgaXMgc2V0IGludGVybmFsbHksIHRoZSBlcnJvciB0ZXh0IGlzIHNlbnQgdG8gdGhlIGRlYnVnIGZ1bmN0aW9uIGFzIHdlbGwuCgotIEkgZml4ZWQgdGhlIHRlbG5ldCBjb2RlIHRvIHRpbWVvdXQgcHJvcGVybHkgYXMgdGhlIG9wdGlvbiB0ZWxscyBpdCB0by4gT24KICBub24td2luZG93cyBwbGF0Zm9ybXMuCgpEYW5pZWwgKDcgT2N0IDIwMDIpCi0gSm9obiBDcm93IHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybC10aGUtZ3VpZGUgd2Fzbid0IGluY2x1ZGVkIGluIHRoZSByZWxlYXNlCiAgdGFyYmFsbCEKCi0gS2V2aW4gUm90aCBwb2ludGVkIG91dCB0aGF0IG1ha2UgaW5zdGFsbCBkaWRuJ3QgZG8gcmlnaHQgaWYgYnVpbGQgb3V0c2lkZQogIHRoZSBzb3VyY2UgdHJlZSAoY2EtYnVuZGxlIHdpc2UpLgoKLSBGT0xMT1dMT0NBVElPTiBidWdmaXggZm9yIHRoZSBtdWx0aSBpbnRlcmZhY2UKCkRhbmllbCAoNCBPY3QgMjAwMikKLSBLZXZpbiBSb3RoIGdvdCBwcm9ibGVtcyB3aXRoIGhpcyBjeWd3aW4gYnVpbGQgd2l0aCAtbm8tdW5kZWZpbmVkIHdhcyBub3QKICBwcmVzZW50IGluIGxpYi9NYWtlZmlsZS5hbSBzbyBJIHB1dCBpdCBiYWNrIGluIHRoZXJlIGFnYWluLiBUaGUgcG9vciBvbmUgd2hvCiAgbmVlZHMgdG8gcmVtb3ZlIGl0IGFnYWluIG11c3Qgd3JpdGUgYSBjb25maWd1cmUgc2NyaXB0IHRvIGRldGVjdCB0aGF0IG5lZWQuCgotIFJhbHBoIE1pdGNoZWxsIHBvaW50ZWQgb3V0IHRoYXQgY3VybCB3YXMgYSBiaXQgbmFpdmUgYW5kIGRpZG4ndCBkZWFsIHdpdGggLi8KICBvciAuLi8gc3R1ZmYgaW4gdGhlIHN0cmluZyBwYXNzZWQgYmFjayBpbiBhIExvY2F0aW9uOiBoZWFkZXIgd2hlbiBmb2xsb3dpbmcKICBsb2NhdGlvbnMuCgotIEFsYmVydCBDaGluIGhlbHBlZCBtZSB0byB3b3JrIG91dCBhIGJldHRlciBjb25maWd1cmUuaW4gY2hlY2sgZm9yIHpsaWIsIGFuZAogIGJvdGggLS13aXRob3V0LXpsaWIgYW5kIC13aXRoLXpsaWIgc2VlbSB0byB3b3JrIHJhdGhlciB3ZWxsIHJpZ2h0IG5vdy4KCi0gWnZpIEhhcidFbCBpbXByb3ZpZWQgdGhlIE9wZW5TU0wgRU5HSU5FIGNoZWNrIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvCiAgYmVjb21lIG1vcmUgYWNjdXJhdGUuCgpEYW5pZWwgKDEgT2N0IDIwMDIpCi0gRGV0bGVmIFNjaG1pZXIgcG9pbnRlZCBvdXQgdGhlIGxhY2sgb2YgYSAtLXdpdGhvdXQtbGlieiBvcHRpb24gdG8gY29uZmlndXJlLAogIHNvIEkgYWRkZWQgb25lLgoKVmVyc2lvbiA3LjEwICgxIE9jdCAyMDAyKQoKRGFuaWVsICgzMCBTZXAgMjAwMikKLSBNb2RpZmllZCB0aGUgY3VybF92ZXJzaW9uX2luZm8oKSBwcm90byBhbmQgcmV0dXJuZWQgc3RydWN0IG9uY2UgYWdhaW4sIGFuZAogIHVwZGF0ZWQgdGhlIG1hbiBwYWdlIGFjY29yZGluZ2x5LgoKLSBDcmlzIEJhaWxpZmYgZm91bmQgb3V0IHRoYXQgdGhlIHByZS1yZWxlYXNlcyBjcmFzaGVkIG9uIG5hbWUgbG9va3VwcyBvbgogIG5hbWVzIHN1Y2ggYXMgImE6IiBvciAiYmF6OiIgKG9uIExpbnV4IHZlcnNpb25zIG5vdCBiZWluZyBJUHY2LWVuYWJsZWQpIGR1ZQogIHRvIHNvbWUgd2VpcmQgcmV0dXJuIGNvZGVzIGZyb20gZ2V0aG9zdGJ5bmFtZV9yKCkuIEknbGwgYmxhbWUgdGhlIGNvbXBsZXRlCiAgbGFjayBvZiBkb2NzIGluIHRoYXQgZGVwYXJ0bWVudC4gQ3JpcyBwcm92aWRlZCBhIGZpeCwgd2hpY2ggSSBtb2RpZmllZCBvbmx5CiAgc2xpZ2h0bHkuCgpEYW5pZWwgKDI3IFNlcCAyMDAyKQotIEFmdGVyIGEgc3VnZ2VzdGlvbiBmcm9tIENocmlzdGlhbiBLdXJ6IHRvIERlYmlhbiBjdXJsIHBhY2thZ2UgbWFpbnRhaW5lcgogIERvbWVuaWNvIEFuZHJlb2xpLCBJIG1hZGUgaXQgcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhlIHByb3h5IGVudmlyb25tZW50CiAgdmFyaWFibGVzIGJldHRlci4gTm93LCBieSBzZXR0aW5nIC14ICIiIHlvdSBjYW4gZXhwbGljaXRseSB0ZWxsIGxpYmN1cmwgdG8KICBub3QgdXNlIGEgcHJveHksIG5vIG1hdHRlciB3aGFuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2F5LgoKVmVyc2lvbiA3LjEwLXByZTQKCkRhbmllbCAoMjYgU2VwIDIwMDIpCi0gRXh0ZW5kZWQgY3VybF92ZXJzaW9uX2luZm8oKSBtb3JlIGFuZCB3cm90ZSBhIG1hbiBwYWdlIGZvciBpdC4KCkRhbmllbCAoMjUgU2VwIDIwMDIpCi0gbGliY3VybCBjb3VsZCBsZWFrIG1lbW9yeSB3aGVuIGRvd25sb2FkaW5nIG11bHRpcGxlIGZpbGVzIHVzaW5nIGh0dHAgcmFuZ2VzLAogIHJlcG9ydGVkIGFuZCBmaXhlZCBieSBKZWFuLUx1YyBHdWV2ZWwuCgotIFdhbHRlciBKLiBNYWNrIHByb3ZpZGVkIGNvZGUgYW5kIGRvY3MgZm9yIHRoZSBuZXcgY3VybF9mcmVlKCkgZnVuY3Rpb24gdGhhdAogIHNoYWxsIGJlIHVzZWQgdG8gZnJlZSBtZW1vcnkgdGhhdCBpcyBhbGxvY2F0ZWQgYnkgbGliY3VybCBhbmQgcmV0dXJuZWQgYmFjawogIHRvIHRoZSBhcHBsaWNhdGlvbiwgYXMgY3VybF9lc2NhcGUoKSBhbmQgY3VybF91bmVzY2FwZSgpIGRvLgoKLSBZYXJyYW0gU3VuaWwgcG9pbnRlZCBvdXQgYSBmbGF3IGluIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2hlcmUgYSBmYWlsZWQKICBjb25uZWN0aW9uIGRpZG4ndCBjbG9zZSBkb3duIHByb3Blcmx5IGFuZCB0aHVzIGEgc2Vjb25kIHRyYW5zZmVyIHVzaW5nIHRoZQogIHNhbWUgaGFuZGxlIGZhaWxlZC4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCBhIGZsYXcgdGhhdCBtYWRlIChhbW9uZyBvdGhlciB0aGluZ3MpIGRpY3QtZmV0Y2hlcwogIHJldHVybiBhIHJhbmRvbSB2YWx1ZS4KCkRhbmllbCAoMjQgU2VwIDIwMDIpCi0gV2V6IEZ1cmxvbmcgYnJvdWdodCBoaXMgaW5pdGlhbCBwYXRjaCB0aGF0IGludHJvZHVjZWQgY3VybF92ZXJzaW9uX2luZm8oKS4KICBXZSBtaWdodCBuZWVkIHRvIHR3ZWFrIGl0IHNvbWV3aGF0IGJlZm9yZSByZWxlYXNlLgoKRGFuaWVsICgyMCBTZXAgMjAwMikKLSBDcmFpZyBNYXJrd2FyZHQgZml4ZWQgYW5vdGhlciBUcnU2NCBJUCByZXNvbHZlIHByb2JsZW0uCgpEYW5pZWwgKDE5IFNlcCAyMDAyKQotIERvbGJuZWZmIEEuViBhbmQgU3Bpcmlkb25vZmYgQS5WIG1hZGUgdGhlIGZpbGU6Ly8gY29kZSB3b3JrIHdpdGggcmVzdW1lcwogIGluIHRoZSBzYW1lIHN0eWxlIG90aGVyIGNvZGUgZG9lcy4KCi0gSWxndWl6IExhdHlwb3YgZml4ZWQgYSBmbGF3IGluIHRoZSBjbGllbnQgY29kZSB3aGVuIGZldGNoaW5nIG11bHRpcGxlIFVSTHMKICBhbmQgLUMgLSB3YXMgdXNlZC4gVGhlIGZpcnN0IGZpbGUncyByZXN1bWUgcG9zaXRpb24gd2FzIHRoZW4gYWNjaWRlbnRhbGx5CiAgcmV1c2VkIG9uIGFsbCB0aGUgb3RoZXIgZmlsZXMgdG9vLgoKRGFuaWVsICgxOCBTZXAgMjAwMikKLSBUaGUgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlIHdhcyBncmVhdGx5IG1vZGlmaWVkIGFuZCB0aGUgb3B0aW9ucyBoYXZlCiAgbm93IGJlZW4gZ3JvdXBlZCBpbiBsb2dpY2FsIGdyb3VwcyBzbyB0aGF0IGl0IHNob3VsZCBiZSBzb21ld2hhdCBlYXNpZXIgdG8KICByZWFkIGl0IGFuZCBmaW5kIHRoaW5ncyB5b3Ugc2VhcmNoIGZvci4KCkRhbmllbCAoMTMgU2VwIDIwMDIpCi0gS2V2aW4gUm90aCBwaW5wb2ludGVkIGEgc2NhcnkgZmxhdyBpbiBsaWJjdXJsLCB3aGVuIHRoZSBIVFRQIHNlcnZlciBkb2Vzbid0CiAgc2VuZCBhbnkgaGVhZGVycyBiYWNrLCBvbmx5IHJhdyBjb250ZW50LiBSaWdodCwgdGhhdCBpcyBhIHZpb2xhdGlvbiBvZiB0aGUKICBzdGFuZGFyZCBidXQgc3RpbGwgaGFwcGVucyBhdCB0aW1lcyBhbmQgd2UgbmVlZCB0byBkZWFsIHdpdGggaXQuIFRlc3QgY2FzZQogIDMwNiB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoYXQgd2UgZG8gcmlnaHQgbm93LgoKVmVyc2lvbiA3LjEwLXByZTMKCkRhbmllbCAoMTEgU2VwIDIwMDIpCi0gTHVrYXN6IEN6ZWtpZXJkYSBmb3VuZCBvdXQgdGhhdCBjdXJsIGRpZG4ndCBzZW5kIGEgY29ycmVjdCBIVFRQIEhvc3Q6IGhlYWRlcgogIHdoZW4geW91IHNwZWNpZmllZCB0aGUgVVJMIHdpdGggYW4gSVB2NiBJUC1hZGRyZXNzLgoKRGFuaWVsICg0IFNlcCAyMDAyKQotIFN2ZW4gTmV1aGF1cyBtYWRlIC0tc2lsZW50IGJlaW5nIGFja25vd2xlZGdlZCBldmVuIHdoZW4gbXVsdGlwbGUgVVJMcwogIHdlcmUgdXNlZC4gSXQgdXNlZCB0byBvdXRwdXQgIlsxLzJdOiBodHRwOi8vaG9zdC9hLmh0bWwuZGUgLS0+IGEuaHRtbC5kIiBldGMKICBldmVuIHdoZW4gdG9sZCB0byBzaHV0IHVwLgoKRGFuaWVsICgzIFNlcCAyMDAyKQotIFVwZGF0ZWQgYWxsIHNvdXJjZSBjb2RlIGhlYWRlcnMgdG8gdXNlIE1JVC1saWNlbnNlIHJlZmVyZW5jZXMgb25seSwgYW5kCiAgcG9pbnQgdG8gdGhlIENPUFlJTkcgZmlsZSBhbmQgdGhlIGh0dHBzOi8vY3VybC5oYXh4LnNlL2RvY3MvY29weXJpZ2h0Lmh0bWwKICBVUkwuIEkndmUgY3V0IG91dCBhbGwgcmVmZXJlbmNlcyB0byBNUEwgdGhhdCBJIGNvdWxkIGZpbmQuCgotIENvcmVjdGVkIHRoZSBtYWtlZmlsZXMgdG8gbm90IGFsd2F5cyB1c2UgLWx6IHdoZW4gbGlua2luZwoKVmVyc2lvbiA3LjEwLXByZTIKCkRhbmllbCAoMiBTZXAgMjAwMikKLSBKYW1lcyBHYWxsYWdoZXIgYWRkZWQgQ29udGVudC1FbmNvZGluZyBzdXBwb3J0IHRvIGxpYmN1cmwgc28gbm93IGN1cmwgYW5kCiAgbGliY3VybC11c2luZyBhcHBzIGNhbiByZXF1ZXN0IGNvbXByZXNzZWQgY29udGVudHMgdXNpbmcgdGhlICdkZWZsYXRlJwogIG1ldGhvZC4gU2VlIHRoZSBzcGVjaWFsIGZpbGUgbGliL1JFQURNRS5lbmNvZGluZyBmb3IgZGV0YWlscy4KCiAgY3VybCAtLWNvbXByZXNzZWQgaXMgbm93IHVzZWQgdG8gcmVxdWVzdCBjb21wcmVzc2VkIGNvbnRlbnRzLgoKICBjdXJsLWNvbmZpZyAtLWZlYXR1cmUgd2lsbCBpbmNsdWRlICdsaWJ6JyBpZiB0aGlzIGZlYXR1cmUgd2FzIGFyb3VuZCB3aGVuCiAgdGhlIGxpYnJhcnkgd2FzIGJ1aWx0LgoKRGFuaWVsICgzMCBBdWcgMjAwMikKLSBBcHBsaWVkIGFuIGFub255bW91cyBTT0NLUzUtcHJveHkgcGF0Y2guIE5vdCBwcm9wZXJseSB3b3JraW5nIGluIGFsbAogIHNpdHVhdGlvbnMgdGhvdWdoLCBhcyBhbGwgZ2V0YWRkcmluZm8oKS11c2luZyBsaWJjdXJscyB3aWxsIGZhaWwgb24gdGhpcy4KICBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIHNvbWV3aGF0IG5haXZlIHdheSB0aGUgY3VycmVudCBjb2RlIHRyaWVzIHRvIGV4dHJhY3QKICB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcHJveHkuCgotIEZpeGVkIHVwIHRoZSBTU0wgY2VydCBmaXhlcyBmcm9tIHRoZSBvdGhlciBkYXkgZXZlbiBtb3JlIGFmdGVyIG1vcmUgaW5wdXRzCiAgZnJvbSBDcmlzLiBBZGRlZCB0aHJlZSBuZXcgU1NMIGVycm9yIGNvZGVzIHRvIG1ha2UgdGhlCiAgQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1Igc2xpZ2h0bHkgbGVzcyBvdmVybG9hZGVkLgoKRGFuaWVsICgyNyBBdWcgMjAwMikKLSBBZnRlciBsb3RzIG9mIHRhbGsgd2l0aCBUb20gWmVydWNoYSwgTmljayBHaW1icm9uZSBhbmQgQ3JpcyBCYWlsaWZmIEkKICBkZWNpZGVkIHRvIHRhbGsgdGhlIGJvbGQgcGF0aCBhbmQgSSBub3cgbWFkZSBsaWJjdXJsIGRvIENBIGNlcnRpZmljYXRlCiAgdmVyaWZpY2F0aW9uIGJ5IGRlZmF1bHQuIFRodXMgbGlicmFyeSB1c2VycyBuZWVkIHRvIGV4cGxpY2l0bHkgdHVybiB0aGlzIG9mZgogIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdG8gc2l0ZXMgd2l0aG91dCBwcm9wZXIgY2hlY2tpbmcuIFdlIGFsc28gaW5zdGFsbCBhCiAgQ0EgY2VydCBidW5kbGUgb24gJ21ha2UgaW5zdGFsbCcgbm93LgoKICBUaGUgY3VybCB0b29sIG5vdyByZXF1aXJlcyB0aGUgLWsvLS1pbnNlY3VyZSBvcHRpb24gaW4gb3JkZXIgdG8gYWxsb3cKICBjb25uZWN0aW9ucyBhbmQgb3BlcmF0aW9ucyBvbiBTU0wgc2l0ZXMgdGhhdCBhcmVuJ3QgcHJvcGVybHkgdmVyaWZpZWQgd2l0aAogIC1jYWZpbGUgb3IgLS1jYXBhdGguCgogIGN1cmwtY29uZmlnIC0tY2EgZGlzcGxheXMgdGhlIGJ1aWx0LWluIHBhdGggdG8gdGhlIENBIGNlcnQgYnVuZGxlLgoKRGFuaWVsICgyNiBBdWcgMjAwMikKLSBBbmRyZXcgRnJhbmNpcyBjbGVhbmVkIHVwIHNvbWUgY29kZSB0aGF0IG5vdyBjb21waWxlcyBmaW5lIHdpdGhvdXQgdGhlIG5lZWQKICBmb3IgdWdseSBNU1ZDIHByYWdtYXMuCgotIEtlaXRoIE1hY0RvbmFsZCBmb3VuZCBhIG1pbm9yIGJ1ZyBpbiBzcmMvbWFpbi5jIHRoYXQgbWFkZSBpdCBjbG9zZSBzdGRpbgogIGluc3RlYWQgb2YgdGhlIGFjdHVhbCBmaWxlIGhhbmRsZS4gSXQgc2hvdWxkbid0IGhhdmUgcmVzdWx0ZWQgaW4gbXVjaAogIHRyb3VibGUgYXMgbW9zdCBvcGVyYXRpbmcgc3lzdGVtcyBjbG9zZSBhbGwgZmlsZSBoYW5kbGVzIG9uIHByb2Nlc3MgZXhpdAogIGFueXdheS4KCkRhbmllbCAoMjIgQXVnIDIwMDIpCi0gTWFya3VzIE9iZXJodW1lciBwcm92aWRlZCBzb21lIGRvY3VtZW50YXRpb24gZm9yIGhpcyBwcmV2aW91c2x5IHByb3ZpZGVkCiAgQ1VSTE9QVF9OT1NJR05BTCBmaXguCgotIFBhdGNoZWQgdGhlIGxpYi9NYWtlZmlsZS5hbSB0byBob3BlZnVsbHkgbm8gbG9uZ2VyIGNvbXBsYWluIG9uIHVuZGVmaW5lZAogIHN5bWJvbHMgdGhhdCBzZWVtZWQgdG8gb2NjdXIgb24gYnVpbGRzIHdpdGggc2hhcmVkIE9wZW5TU0wgbGlicmFyaWVzIG9uCiAgU29sYXJpcyBsYXRlbHkuLi4KCkRhbmllbCAoMjAgQXVnIDIwMDIpCi0gRml4ZWQgY29tcGlsZXIgd2FybmluZ3Mgb24gTVNDVisrIGNvbXBpbGVzLiBXZSdyZSBsb29raW5nIGZvciBoZWxwIGhlcmU6CiAgcmVtb3ZlIHRoZSBwcmFnbWFzIGZyb20gbGliL2NvbmZpZy13aW4zMi5oIGFuZCBhZGp1c3QgdGhlIHNvdXJjZXMgd2hlcmUKICB0aGUgd2FybmluZ3Mgb2NjdXIuIEhpZGluZyB0aGVtIHdpdGggcHJhZ21hcyBsaWtlIHRoaXMgaXMgbm90IHRoZSBjb3JyZWN0CiAgd2F5IG9mIGRlYWxpbmcgd2l0aCBjb21waWxlciB3YXJuaW5ncy4KCkRhbmllbCAoMTMgQXVnIDIwMDIpCi0gVWxyaWNoIFphZG93IG1hZGUgdGhlIGdsb2JhbCBpbmNsdWRlIGZpbGVzIGluIGN1cmwvKiBpbmNsdWRlIHRoZW1zZWx2ZXMKICB1c2luZyAiY3VybC5oIiBpbnN0ZWFkIG9mIDxjdXJsL2N1cmwuaD4gd2hpY2ggdGh1cyBhbGxvd3MgcGVvcGxlIHRvIG1vcmUKICBmcmVlbHkgZGVjaWRlIGhvdyB0byBpbmNsdWRlIGN1cmwgYW5kIGhvdyB0byBzZXR1cCB0aGVpciBpbmNsdWRlIHBhdGhzLgoKLSBTdGVybGluZyBIdWdoZXMgYWRkZWQgdGhlIGN1cmxfc2hhcmUqIGludGVyZmFjZSwgc29tZXdoYXQgYXMgZGlzY3Vzc2VkCiAgcHJldmlvdXNseS4KCi0gSvZybiBIYXJ0cm90aCBwb2ludGVkIG91dCB0aGF0IHBvbGwoKSB3YXMgdXNlZCBpbiB0aGUgcHJlMSBzb3VyY2UgY29kZSBhbmQKICBpdCBpc24ndCB2ZXJ5IHBvcnRhYmxlLCBzbyBub3cgSSBjaGVjayBmb3IgaXQgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kCiAgd29yayBhcm91bmQgaXQuCgpWZXJzaW9uIDcuOS45LXByZTEKCkRhbmllbCAoMTIgQXVnIDIwMDIpCi0gQXBwbGllZCBteSBpbml0aWFsIHRha2Ugb24gbWFraW5nIHRoZSBtdWx0aSBzdHVmZiBtb3JlIGFzeW5jaHJvbm91cy4gQ29ubmVjdHMKICBzaG91bGQgbm93IHJldHVybiBiYWNrIHdpdGhvdXQgImhhbmdpbmciIHVudGlsIGl0IGhhcyBjb25uZWN0ZWQgZm9yIHJlYWwuCiAgVGhpcyBzaG91bGQgYWxzbyBiZSB0aGUgY2FzZSBmb3IgRlRQLVBBU1YgY29ubmVjdHMuCgpEYW5pZWwgKDkgQXVnIDIwMDIpCi0gQXBwbGllZCBNYXJrdXMgRi5YLkouIE9iZXJodW1lcidzIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBDVVJMT1BUX05PU0lHTkFMLAogIHdoaWNoIGVmZmVjdGl2ZWx5IHByZXZlbnRzIGxpYmN1cmwgZnJvbSBkb2luZyBhbnl0aGluZyB0aGF0IG1heSBjYXVzZQogIHNpZ25hbHMgdG8gZ2V0IHNlbnQuIFRoaXMgaXMgYmFzaWNseSBmb3IgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zIHRoYXQKICBub3cgY2FuIHVzZSB0aW1lb3V0cyBwcm9wZXJseSwgd2l0aG91dCByaXNraW5nIGFueSBzaWduYWxzIHRvIGJ1cnN0IGluIGFuZAogIHJ1aW4gdGhlIHBhcnR5LgoKRGFuaWVsICg1IEF1ZyAyMDAyKQotIEx1a2FzeiBDemVraWVyZGEgcmVwb3J0ZWQgdGhhdCBSRkMyNzMyLXN0eWxlIGxpdGVyYWwgSVB2NiBhZGRyZXNzZXMgZGlkbid0CiAgd29yay4gV2hlbiBkaWQgdGhhdCBjb2RlIHZhbmlzaD8gQW55d2F5LCBpdCdzIGJhY2sgYWdhaW4gbm93IGFuZCBzZWVtcyB0bwogIHdvcmshCgotIEpvbmF0YW4gTGFuZGVyIGZvdW5kIG91dCB0aGF0IFBPU1RpbmcgYW4gZW1wdHkgc3RyaW5nIGRpZG4ndCB3b3JrIHdpdGggdGhlCiAgY29tbWFuZCBsaW5lIHRvb2wuCgpEYW5pZWwgKDMgQXVnIDIwMDIpCi0gSvZybiBIYXJ0cm90aCBmaXhlZCB0aGUgbGliY3VybC5kZWYgZmlsZSB0byBidWlsZCB0aGUgd2luZG93cyBETEwgd2l0aAogIHRoZSBtdWx0aSBpbnRlcmZhY2UgZW5hYmxlZC4KCkRhbmllbCAoMSBBdWcgMjAwMikKLSBUaGUgZnRwIFBPUlQgY29tbWFuZCBub3cgdXNlcyBhIGJldHRlciBkZWZhdWx0IElQIGFkZHJlc3MsIGFzIGl0IHdpbGwKICBleHRyYWN0IGFuZCB1c2UgdGhlIGxvY2FsIElQIGFkZHJlc3MgdXNlZCBieSB0aGUgY29udHJvbCBjb25uZWN0aW9uLgoKLSBNb2RpZmllZCB0aGUgI2luY2x1ZGUgbGluZXMgaW4gY3VybC9tdWx0aS5oIHRvIHdvcmsgYmV0dGVyIG9uIG1vcmUKICBwbGF0Zm9ybXMuCgpEYW5pZWwgKDMxIEp1bCAyMDAyKQotIEF0dGVtcHRlZCBhIGZpeCBmb3IgUmF5IERlR2VubmFybydzIHJlcG9ydGVkIEhQLVVYIGhvc3QgbmFtZSByZXNvbHZlCiAgcHJvYmxlbXMuCgpEYW5pZWwgKDMwIEp1bCAyMDAyKQotIFByaXlhIFJhbWFrcmlzaG5hbiBhbmQgUnlhbiBKb25lcyBjb21waWxlcyBjdXJsL2N1cmwuaCB3aXRoIGEgQysrIGNvbXBpbGVyCiAgYW5kIGRvbid0IGdldCBfX1NURENfXyBkZWZpbmVkLCB3aGljaCByZXF1aXJlZCB1cyB0byBleHRlbmQgdGhlIHByZXByb2Nlc3NvcgogIGNoZWNrIGZvciB0aGUgIyMgb3BlcmF0b3IgdXNhZ2UuCgotIENvcnJlY3QgdGhlIGRlc2NyaXB0aW9uIGZvciBDVVJMT1BUX1BBU1NXREZVTkNUSU9OLCBpZiBzZXQgdG8gTlVMTCB0aGUKICBpbnRlcm5hbCBkZWZhdWx0IGZ1bmN0aW9uIHdpbGwgYmUgcHV0IGJhY2suCgotIGRhbmZ1enogYXQgbWlsay5jb20gZm91bmQgb3V0IHRoYXQgbGliY3VybCBiYWRseSBhc3N1bWVkIGEgc3BhY2UgYWZ0ZXIKICAnU2V0LUNvb2tpZTonIHNvIGlmIGl0IHdhc24ndCBwcmVzZW50LCBpdCBjYXVzZWQgdGhlIGZpcnN0IGxldHRlciBvZiB0aGUKICBjb29raWUgbmFtZSB0byBmYWxsIG9mZiEKCkRhbmllbCAoMjkgSnVsIDIwMDIpCi0gVGhlIHBhc3N3b3JkIHByb21wdCBhc2tpbmcgZm9yIHVzZXIgcGFzc3dvcmQgdXNlZCBzdGRvdXQgYW5kIG5vdyB1c2VzCiAgc3RkZXJyIGluc3RlYWQgdG8gYmV0dGVyIGFsbG93IHJlZGlyZWN0aW5nLiBJdCBhbHNvIGxlYWtlZCBhIGZvcGVuKCkgZmlsZQogIGhhbmRsZSB0aGF0IGlzIG5vdyBmaXhlZC4KCkRhbmllbCAoMjggSnVsIDIwMDIpCi0gSEFWRV9TRVRWQlVGIHdhcyBsZWZ0IG91dCBmcm9tIHNyYy9tYWluLmMgd2hpY2ggbWFkZSAtTiBub3Qgd29yay4gRm91bmQgb3V0CiAgYnkgTSBULgoKRGFuaWVsICgyNiBKdW4gMjAwMikKLSBHbGVuIE5ha2FtdXJhIHNvbHZlZCBhIGNyYXNoIGluIHRoZSBuYW1lIHJlc29sdmluZyBmdW5jdGlvbiBmb3IgSVAtb25seQogIGFkZHJlc3NlcyBvbiBBbHBoYSBMaW51eCAoYXQgbGVhc3QpLgoKLSBULiBCaGFyYXRoIGNvcnJlY3RlZCB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyIGludHJvZHVjZWQgaW4gNy45LjguCgpEYW5pZWwgKDIyIEp1biAyMDAyKQotIEFuZHLpcyBHYXJj7WEgcG9pbnRlZCBvdXQgbWFuIHBhZ2UgZXJyb3JzIGluIGN1cmxfZm9ybWFkZC4zLiBJIGZpeGVkLgoKRGFuaWVsICgxOSBKdW4gMjAwMikKLSBDaHJpcyBDb21iZXMgcG9pbnRlZCBvdXQgYSBmbGF3IGluIGN1cmxfZXNjYXBlKCkuIEkgZml4ZWQuIFdlIG5vIGxvbmdlcgogIHRyaWVzIHRvIGdlbmVyYXRlIG5vciBwYXJzZSAnKycgaW4gVVJMcy4gU3BhY2VzIGJlY29tZSAlMjAsIGFuZCBvbmx5ICUtY29kZXMKICBhcmUgdHJhbnNsYXRlZCBieSBjdXJsX3VuZXNjYXBlKCkuCgpEYW5pZWwgKDE1IEp1biAyMDAyKQotIEFkZGVkIC0tbGltaXQtcmF0ZSB0byB0aGUgY3VybCB0b29sLiBBbGxvd3MgdGhlIHVzZXIgdG8gc2V0IGEgbWF4bWltdW0KICB1cHBlciBsaW1pdCB0byBob3cgbXVjaCBiYW5kd2lkdGggdG8gdXNlIGZvciB0cmFuc2ZlcnMuCgotIENVUkxPUFRfQlVGRkVSU0laRSB3YXMgYWRkZWQgdG8gbGliY3VybC4gVGhpcyBzZXRzIGEgcHJlZmVyZWQgc2l6ZSBmb3IgdGhlCiAgcmVjZWl2ZSBidWZmZXIgaW4gbGliY3VybC4gVGhlIG1haW4gcG9pbnQgb2YgdGhpcyB3b3VsZCBiZSB0aGF0IHRoZSB3cml0ZQogIGNhbGxiYWNrIGdldHMgY2FsbGVkIG1vcmUgb2Z0ZW4gYW5kIHdpdGggc21hbGxlciBjaHVua3MuCgpEYW5pZWwgKDE0IEp1biAyMDAyKQotIFlhcnJhbSBTdW5pbCBmb3VuZCBvdXQgdGhhdCB0aGUgU29ja2V0SXNEZWFkKCkgZnVuY3Rpb24gcGVyZm9ybWVkIGEgbG90CiAgZmFzdGVyIG9uIFdpbmRvd3Mgd2hlbiByZW1vdmluZyB0aGUgMSBtaWNyb3NlY29uZCB0aW1lb3V0LgoKLSBIYW5ubyBMLiBLcmFuemhvZmYgZml4ZWQgdGhlIFZDKysgcHJvamVjdCBmaWxlcy4KCi0gVG9tIE1hdHRpc29uIGZvdW5kIG91dCB0aGF0IGZ0cCB0cmFuc2ZlcnMgY2xvc2VkIHRoZSBjb25uZWN0aW9uIGEgbGl0dGxlCiAgdG9vIG9mdGVuLgoKLSBNaWtsb3MgTmVtZXRoIHBvc3RlZCBhIFZDKysgbWFrZWZpbGUgZml4IGFuZCBzb21lIElOU1RBTEwgY29tbWVudHMgb24gaG93CiAgdG8gZGlzYWJsZSBzcGVjaWZpYyBwcm90b2NvbHMgd2hlbiBidWlsZGluZyBmb3IgV2luZG93cy4KClZlcnNpb24gNy45LjgKCkRhbmllbCAoMTMgSnVuIDIwMDIpCi0gVGltZSB0byBsZXQgdGhpcyBiYWJ5IGdvLgoKRGFuaWVsICgxMiBKdW4gMjAwMikKLSBDaHJpcyBDb21iZXMgYWRkZWQgdGhyZWUgbmV3IG9wdGlvbnMgZm9yIGN1cmxfZm9ybWFkZCgpOiBDVVJMRk9STV9CVUZGRVIsCiAgQ1VSTEZPUk1fQlVGRkVSUFRSLCBDVVJMRk9STV9CVUZGRVJMRU5HVEguICBUaGV5IGFyZSB1c2VkIHRvIGNyZWF0ZSBhCiAgbXVsdGlwYXJ0IHRoYXQgYXBwZWFycyBhcyBhIHJlZ3VsYXIgZmlsZSB1cGxvYWQsIGJ1dCB0aGUgZGF0YSBpcyBwcm92aWRlZAogIHdpdGggYSBwb2ludGVyIGFuZCBsZW5ndGguCgotIE5pY28gQmFnZ3VzIG1hZGUgdGhlIFZNUyB2ZXJzaW9uIHVzZSBzaWdzZXRqbXAoKSB0b28uCgotIEr2cm4gSGFydHJvdGggZml4ZWQgdGhlIG1pbmd3MzIgYnVpbGQgdXNpbmcgdGhlIG1tIGxpYi4KCi0gQXBwbGllZCBwYXRjaGVzIGJ5IEtyaXMgS2VubmF3YXkgdGhhdCBjb3JyZWN0IGZvcm1hdCBzdHJpbmcgcHJvYmxlbXMgaW4KICBsaWIvZnRwLmMgYW5kIGxpYi9sZGFwLmMuCgpWZXJzaW9uIDcuOS44LXByZTMKCkRhbmllbCAoMTEgSnVuIDIwMDIpCi0gSmFtZXMgQ29uZSBicm91Z2h0IHRoZSBpZGVhIG9mIHVzaW5nIHNpZ3NldGptcCgpIGluIHRoZSBzaWduYWwgaGFuZGxlciB0bwogIG1ha2UgdGhlIHRpbWUtb3V0IG9mIG5hbWUgbG9va3VwcyB0byB3b3JrLCBldmVuIHdoZW4gdGhlIHVuZGVybHlpbmcgbmFtZQogIHJlc29sdmVyIGxpYnJhcnkgdHJhcHMgRUlOVFIuIFRoZSB1c2Ugb2Ygc2lnc2V0am1wKCkgYW5kIHNpZ2xvbmdqbXAoKSBmb3IKICB0aGlzIG1heSBiZSBhIGJpdCBkcmFzdGljLCBhbmQgYWxzbyBub3QgbGlrZWx5IHRvIGV4aXN0IG9uIGFsbCBwbGF0Zm9ybXMuICBJCiAgYWRkZWQgY2FyZWZ1bCBjaGVja2luZyBmb3IgdGhpcyBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCwgZXZlbiBjaGVja3MgZm9yIGl0CiAgYmVpbmcgYSBtYWNybyAod2hpY2ggc2VlbXMgdG8gYmUgdGhlIGNhc2UgaW4gZm9yIGV4YW1wbGUgTGludXgpLgoKICBzaWdzZXRqbXAoKSBzZWVtcyB0byBiZSBtZW50aW9uZWQgaW4gdGhlIFNpbmdsZSBVbml4IHNwZWNpZmljYXRpb24uCgotIE1pa2xvcyBOZW1ldGggYnJvdWdodCBhIHBhdGNoIHRoYXQgYWxsb3dzIGxpYmN1cmwgdG8gZ2V0IGJ1aWx0IHdpdGggc3BlY2lmaWMKICBwcm90b2NvbHMgZGlzYWJsZWQuIFRoaXMgaXMgZG9uZSBieSBydW5uaW5nIC4vY29uZmlndXJlCiAgLS1kaXNhYmxlLVtwcm90b2NvbF0uCgotIEZUUCByYW5nZSBkb3dubG9hZHMgY291bGQgbWFrZSBDVVJMRV9GVFBfV1JJVEVfRVJST1IgZ2V0IHJldHVybmVkLiBXZSBub3cKICBtYWtlIHByZWNhdXRpb25zIHRvIG5vdCByZXR1cm4gdGhpcyBmb3IgcmFuZ2UgZG93bmxvYWRzLgoKICBBZGRlZCB0ZXN0IGNhc2UgMTM1IHRoYXQgbWFrZXMgYW4gZnRwIHJhbmdlIGRvd25sb2FkLiBIYWQgdG8gdHdlYWsgdGhlCiAgcnVudGVzdHMucGwgc2NyaXB0IGEgYml0IHRvby4KCi0gQnVnIHJlcG9ydCAjNTY2ODM1IGlkZW50aWZpZWQgYSBzdHJsZW4oKSBvbiBhIE5VTEwgcG9pbnRlci4gQWRkZWQgYWRkaXRpb25hbAogIGNoZWNrIHRvIHByZXZlbnQgdGhpcy4KCkRhbmllbCAoMTAgSnVuIDIwMDIpCi0gRm91bmQgYW5kIGNvcnJlY3RlZCBhIGNvbm5lY3QgZmFpbHVyZSBwcm9ibGVtIHRoYXQgZGlkbid0IGNyZWF0ZSBhIGh1bWFuCiAgZXJyb3IgdGV4dC4KCi0gQWRkZWQgY29kZSB0byBjb21waWxlIHdpdGggT3BlblNTTCAwLjkuNy4gQmFzZWQgb24gcGF0Y2ggZnJvbSBKYWNvYiBNZXVzZXIKICBhbmQgY29tbWVudHMgZnJvbSBH9nR6IEJhYmluLUViZWxsLgoKLSBHYXV0YW0gTWFuaSBmb3VuZCBhIHNvY2tldCBkZXNjcmlwdG9yIGxlYWsgdGhhdCBoYXBwZW5lZCB3aGVuIEZUUCB0cmFuc2ZlcnMKICBmYWlsZWQgYW5kIHlvdSByZWludm9rZWQgY3VybF9lYXN5X3BlcmZvcm0oKS4KCkRhbmllbCAoNSBKdW4gMjAwMikKLSBHdXN0YWYgSHVpIGNvcnJlY3RlZCBjdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoKSBzbyB0aGF0IGl0IHdvbid0IGNyYXNoIG5vCiAgbWF0dGVyIHdoZW4geW91IGRlY2lkZSB0byByZW1vdmUgdGhlIENVUkwgaGFuZGxlLgoKLSBIQVZFX1JBTkRfU1RBVFVTIHdhcyBhZGRlZCB0byBsaWIvY29uZmlnLXdpbjMyLmggYnkgQW5kcmVhcyBPbHNzb24sIGFzIGl0CiAgbWFrZXMgd2luZG93cyBidWlsZHMgc3RvcCBjb21wbGFpbmluZyBhYm91dCAid2VhayBzZWVkaW5nIiB3aGVuIGl0IGluIGZhY3QKICBpc24ndC4KCi0gQW5vdGhlciA2NGJpdCBhcmNoaXRlY3R1cmUgY3Jhc2ggdGhhdCB3YXMgaW50cm9kdWNlZCBpbiA3LjkuNyB3YXMgbm93CiAgcmVtb3ZlZCwgYXMgYnVnIHJlcG9ydCAjNTY0NTg1IGNsYXJpZmllZC4gVGhpcyBoYXBwZW5lZCBkdWUgdG8gb3VyIGF0dGVtcHRzCiAgdG8gb25seSBhbGxvY2F0ZSBvbmx5IGFzIG11Y2ggbWVtb3J5IGFzIGlzIGFjdHVhbGx5IG5lZWRlZCBmb3IgbmFtZQogIHJlc29sdmluZyAodXNpbmcgcmVhbGxvYykgd2hpY2ggY2FsbGVkIGZvciBhIGZ1bmN0aW9uIHRoYXQgY291bGQgJ21vdmUnIGEKICBob3N0ZW50IHN0cnVjdCBpbiBtZW1vcnkuCgpWZXJzaW9uIDcuOS44LXByZTIKCkRhbmllbCAoMyBKdW4gMjAwMikKLSBULiBCaGFyYXRoIGZpeGVkIHRoZSBDVVJMSU5GT19SRURJUkVDVF9USU1FIHRvIHJldHVybiBhIGNvcnJlY3QgdGltZSBhbmQKICBtYWRlIHRoZSBDVVJMSU5GT19SRVFVRVNUX1NJWkUgcmV0dXJuIHRoZSBjb3JyZWN0IHRvdGFsIHJlcXVlc3Qgc2l6ZS4gSGUKICBhbHNvIG1hZGUgdGhlIHdpbjMyIHRpbWVycyB1c2UgaGlnaGVyIHJlc29sdXRpb24gdGhhbiBiZWZvcmUuCgpEYW5pZWwgKDI5IE1heSAyMDAyKQotIFJlbmF1ZCBDaGFpbGxhdCBtYWRlIG1lIGF3YXJlIG9mIHRoZSBmYWN0IHRoYXQgbGliY3VybCByZXR1cm5lZCBhbiBlcnJvciBpZgogIHlvdSB0cmllZCB0byBnZXQgYW4gZW1wdHkgRlRQIGZpbGUuIFRoaXMgc2VlbWVkIGxpa2UgYSB3cm9uZyB0aGluZyB0byBkbywgc28KICBub3cgaXQgbm8gbG9uZ2VyIGRvZXMgdGhhdCEgSSBqdXN0IGhvcGUgdGhhdCBubyBvbmUgYnVpbHQgYW55dGhpbmcgZmFuY3kKICB1cG9uIHRoaXMgdW5leHBlY3RlZCBiZWhhdmlvci4uLgoKRGFuaWVsICgyOCBNYXkgMjAwMikKLSBDcmlzIEJhaWxpZmYgYnJvdWdodCBDVVJMT1BUX0NBUEFUSCB0aGF0IHdvcmtzIGxpa2UgQ1VSTE9QVF9DQUlORk8gYnV0CiAgc3BlY2lmaWVzIGEgcGF0aCB0byBhIGRpcmVjdG9yeSB3aXRoIGNlcnRpZmljYXRlcyByYXRoZXIgdGhhbiBhIHNpbmdsZSBmaWxlCiAgd2l0aCB0aGVtIGFsbCBjb25jYXRlbmF0ZWQuIC0tY2FwYXRoIHdhcyBhZGRlZCB0byB0aGUgY29tbWFuZCBsaW5lIHRvb2wKICBmb3IgdGhlIHNhbWUgZnVuY3Rpb24uCgogIFdpbmRvd3MgdXNlcnMgbmVlZCB0byBwYXkgYXR0ZW50aW9uIHRoYXQgdGhlIGRpcmVjdG9yeSBzaG91bGQgYmUgc2V0dXAgd2l0aAogIHRoZSBjX3JlaGFzaCB0b29sIG9mIHRoZSBPcGVuU1NMIHBhY2thZ2UsIGFuZCB0aGF0IGNyZWF0ZXMgc3ltbGlua3MgYnkKICBkZWZhdWx0IHRoYXQgbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGFjdHVhbCBjb3BpZXMgdG8gd29yayBvbiBXaW5kb3dzLgoKLSBHdXN0YWYgSHVpIHByb3ZpZGVkIG5ldyBjb2RlIHRoYXQgY2hhbmdlcyBob3cgY3VybF9tdWx0aV9pbmZvX3JlYWQoKQogIG1lc3NhZ2VzIGFyZSBzdG9yZWQsIHNvIHRoYXQgdGhleSBkb24ndCBoYXZlIHRvIGJlIGtlcHQgYXJvdW5kIGZvciB0aGUgbXVsdGkKICBoYW5kbGUncyBlbnRpcmUgbGlmZSB0aW1lLiBIZSBhbHNvIG1hZGUgaXQgcmV0dXJuIGZhaWx1cmUgY29kZXMgcHJvcGVybHkKICB3aGljaCBpdCBkaWRuJ3QgZG8gYmVmb3JlLgoKRGFuaWVsICgyNyBNYXkgMjAwMikKLSBHdXN0YWYgSHVpIHBvaW50ZWQgb3V0IHRoYXQgcnVubmluZyBjdXJsX211bHRpX3BlcmZvcm0oKSB3aXRob3V0IGRvaW5nCiAgY3VybF9tdWx0aV9mZHNldCgpIGZpcnN0IHdhcyBub3QgcmVhbGx5IGEgd29ya2luZyBjb21iby4gSSBhZGRlZCBhbiBpbnRlcm5hbAogIGNoZWNrIGZvciB0aGlzIGFuZCBoYXZlIHNvbWUgZXh0cmEgc2VsZWN0KCkgY29kZSB3aXRob3V0IHRpbWVvdXQgdG8gbWFrZSB0aGUKICBsaWJyYXJ5IGludGVybmFscyB3b3JrIGlkZW50aWNhbGx5IG5ldmVydGhlbGVzcy4gV2UgbWlnaHQgbmVlZCB0byBzb21laG93CiAgZWl0aGVyIGRvY3VtZW50IHRoYXQgb25jZSB5b3UndmUgdXNlZCB0aGUgKl9mZHNldCgpIHlvdSBzaG91bGQgcmVtYWluIHVzaW5nCiAgdGhlbSBpbiBzZWxlY3QoKSBvciB5b3Ugc2hvdWxkIGJsYW5rIHRoZW0gc29tZWhvdyBzbyB0aGF0IGxpYmN1cmwgd29uJ3QgZ28KICBjcmF6eS4KClZlcnNpb24gNy45LjgtcHJlMQoKRGFuaWVsICgyMiBNYXkgMjAwMikKLSBKYW1lcyBDb25lIGJyb3VnaHQgYW4gZXhjZWxsZW50IHBhdGNoLCBpbmNsdWRpbmcgc2V2ZXJhbCB0ZXN0cyBhbmQgZG9jcyEKICBDVVJMT1BUX05FVFJDIG5vdyB0YWtlcyBhbiBlbnVtIGFzIGFyZ3VtZW50IGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIGJvb2xlYW4uCiAgLS1uZXRyYy1vcHRpb25hbCB3YXMgaW50cm9kdWNlZCBhcyBhbiBhZGRpdGlvbiB0byAtLW5ldHJjIHRvIGFsbG93IHRoZQogIGNvbW1hbmQgbGluZSBjbGllbnQgdG8gdGFrZSB1c2Ugb2YgYWxsIHRoYXQgbmV3IG5ldHJjIHN0dWZmLgoKLSBCdWcgcmVwb3J0ICM1NTg4ODggc2hvd2VkIGEgY2FzZSB3aGVyZSBsaWJjdXJsIHJlLXVzZWQgdGhlIHByZXZpb3VzIGhvc3QKICBuYW1lIHdoZW4gYSBjb25uZWN0aW9uIG92ZXIgYSBwcm94eSB3YXMgcmUtdXNlZCBidXQgdG8gYSBkaWZmZXJlbnQgdGFyZ2V0CiAgaG9zdC4KCkRhbmllbCAoMjEgTWF5IDIwMDIpCi0gRWRpbiBLYWRyaWJhc2ljIGhlbHBlZCBtZSBzb3J0IG91dCBhIHByb2JsZW0gdG8gbWFkZSBsaWJjdXJsIGNyYXNoIHdoZW4KICB0cnlpbmcgdG8gSFRUUCBQT1NUIGFuIGVtcHR5IHN0cmluZy4KCi0gQ2xhcmlmaWVkIHRoYXQgSnVlcmdlbiBXaWxrZSBkb25hdGVkIHRoZSBvcmlnaW5hbCB0ZXN0cy9zZXJ2ZXIvc3dzLmMgY29kZS4KCi0gSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZSBtYWRlIGN1cmxfZm9ybWFkZCgpIHJldHVybiBhIHR5cGVkZWYgbmFtZWQKICBDVVJMRk9STWNvZGUgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgJ2ludCcsIGFuZCB0aGUgdmFyaW91cyByZXR1cm4gY29kZXMgYXJlCiAgbm93IGdsb2JhbGx5IGV4cG9ydGVkLiBJdCBhbGxvd3MgYXBwbGljYXRpb25zIHRvIGJldHRlciBmaWd1cmUgb3V0IHdoYXQgZ29lcwogIHdyb25nIHdoZW4gY3VybF9mb3JtYWRkKCkgcmV0dXJucyBlcnJvcnMuCgpEYW5pZWwgKDIwIE1heSAyMDAyKQotIFJvbGFuZCBaaW1tZXJtYW5uIHBvaW50ZWQgb3V0IHRoYXQgU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZSgpCiAgaXMgcHJlZmVyZWQgdG8gU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZSgpLgoKRGFuaWVsICgxNyBNYXkgMjAwMikKLSBCdWcgcmVwb3J0ICM1NTY4NjkgcG9pbnRlZCBvdXQgdGhhdCBzcmMvd3JpdGVvdXQuYyBkaWRuJ3QgY29tcGlsZSBvbiBmcmVlYnNkCiAgYWZ0ZXIgbXkgQUlYIGZpeGVzIHRoZSBvdGhlciB3ZWVrLgoKLSBCdWcgcmVwb3J0ICM1NTY5MzAgcG9pbnRlZCBvdXQgYSBGcmVlQlNEIGNvcmUgZHVtcCBpbnRyb2R1Y2VkIGluIDcuOS43IGluCiAgdGhlIEROUyBzdHJ1Y3QgcmVhbGxvYyBzdHVmZi4gQWN0dWFsbHksIHRoaXMgY3Jhc2ggY291bGQgaGFwcGVuIG9uIGFsbAogIHN5c3RlbXMgdGhhdCBtYWRlIHRoZSBwYWNrX2hvc3RlbnQoKSBmdW5jdGlvbiBnZXQgaW52b2tlZC4KCi0gSSByZW1vdmVkIHNldmVyYWwgY29tcGlsZXIgd2FybmluZ3MgaW4gdGhlIHRlc3Qgc3VpdGUncyBIVFRQIHNlcnZlci4KClZlcnNpb24gNy45LjcKCkRhbmllbCAoMTAgTWF5IDIwMDIpCi0gS2V2aW4gUm90aCBhZGp1c3RlZCB0aGUgLS10cmFjZS1hc2NpaSBvdXRwdXQgc2xpZ2h0bHkuCgotIFBhdWwgSGFycmluZ3RvbiBmb3VuZCBvdXQgdGhhdCBzcmMvd3JpdGVvdXQuYyBuZWVkZWQgYW4gYWRkaXRpb25hbCBoZWFkZXIKICBmaWxlIGluY2x1ZGVkIGZvciBBSVggYnVpbGRzCgpWZXJzaW9uIDcuOS43LXByZTIKCkRhbmllbCAoNyBNYXkgMjAwMikKLSBVcGRhdGVkIHRoZSBtYW4gcGFnZSB3aXRoIC0tdHJhY2UtYXNjaWkgYW5kIC1qLy0tanVuay1zZXNzaW9uLWNvb2tpZXMuCgotIE1hZGUgLS10cmFjZS1hc2NpaSBkbyBwcmV0dHkgbXVjaCB0aGUgc2FtZSBhcyAtLXRyYWNlIGJ1dCB3aXRob3V0IHRoZSBoZXgKICBwYXJ0IGluIHRoZSBvdXRwdXQuCgotIEFkZGVkIENVUkxPUFRfQ09PS0lFU0VTU0lPTiB0aGF0IHdoZW4gZW5hYmxlZCBtYWtlcyBsaWJjdXJsIGlnbm9yZSBzZXNzaW9uCiAgY29va2llcyByZWFkIGZyb20gYSBmaWxlLiBUaGlzIG9wdGlvbiBpcyBlbmZvcmNlZCBieSB0aGUgY3VybCBjb21tYW5kIGxpbmUKICB0b29sIHVzaW5nIHRoZSBuZXcgLWovLS1qdW5rLXNlc3Npb24tY29va2llcyBvcHRpb24uIEFmdGVyIGRpc2N1c3Npb25zIHdpdGgKICBLZXZpbiBSb3RoLiBUaGlzIG1ha2VzIGl0IGVhc2llciB0byB1c2UgY3VybCB0byBmdWxseSBlbXVsYXRlIGEgYnJvd3NlcidzCiAgYmVoYXZpb3IsIGV2ZW4gd2hlbiBpdCBjb21lcyB0byAic2Vzc2lvbiBjb29raWVzIi4gU2Vzc2lvbiBjb29raWVzIGFyZQogIGNvb2tpZXMgdGhhdCBhIG5vcm1hbCBicm93c2VyIGRpc2NhcmRzIHdoZW4gdGhlIGJyb3dzZXIgaXMgc2h1dAogIGRvd24uIFRoZXkncmUgaWRlbnRpZmllZCBieSBub3QgaGF2aW5nIGFueSBleHBpcmUgZGF0ZS90aW1lLgoKLSBXaGVuIENVUkxPUFRfREVCVUdEQVRBIHdhcyBzZXQsIGl0IHJ1aW5lZCB0aGUgQ1VSTE9QVF9TVERFUlIgc2V0dGluZyBhbmQKICB0aGlzIHdhcyBkaXNjb3ZlcmVkIHdoZW4gLS10cmFjZSB3YXMgbWFkZSB0byBjcmFzaC4KCi0gVXNpbmcgLXYgYW5kIC0tdHJhY2UgYXQgdGhlIHNhbWUgdGltZSBjb25mdXNlZCBtYXR0ZXJzLiAtdiBpcyBub3cgcHJldHR5CiAgbXVjaCBpZ25vcmVkIHdoZW4gLS10cmFjZSBvciAtLXRyYWNlLWFzY2lpIGlzIHVzZWQuCgotIE1hZGUgLS10cmFjZSAoYW5kIC0tdHJhY2UtYXNjaWkpIHN1cHBvcnQgLSBhcyBmaWxlIG5hbWUgdG8gcGFzcyBvdXRwdXQgdG8KICBzdGRvdXQgaW5zdGVhZC4gSXQgbWFrZXMgaXQgY29uc2lzdGVudCB3aXRoIGhvdyBvdGhlciBvcHRpb25zIHdvcmsuCgpWZXJzaW9uIDcuOS43LXByZTEKCkRhbmllbCAoNiBNYXkgMjAwMikKLSBBZGRlZCBtdWx0aS1wb3N0LmMgdG8gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeS4gSSBnb3QgdGhlIGJhc2ljIHNvdXJjZSBmb3IKICB0aGlzIGZyb20gR3VzdGFmIEh1aS4KCkRhbmllbCAoMyBNYXkgMjAwMikKLSBDVVJMX01BWF9XUklURV9TSVpFIGlzIG5vdyBhbiBleHBvcnRlZCAjZGVmaW5lIGluIHRoZSBjdXJsL2N1cmwuaCBoZWFkZXIgYW5kCiAgY2FuIGJlIHVzZWQgdG8gZmlndXJlIG91dCB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZSB5b3VyIHdyaXRlIGNhbGxiYWNrIGNhbgogIGdldC4KCi0gQ1VSTE9QVF9SRUFEREFUQSBpcyBub3cgYW4gYWxpYXMgZm9yIENVUkxPUFRfSU5GSUxFIGFuZCBDVVJMT1BUX1dSSVRFREFURSBpcwogIGFuIGFsaWFzIGZvciBDVVJMT1BUX0ZJTEUuIFRoZXNlIHR3byB3ZXJlIGFkZGVkIGZvciBjb25mb3JtaXR5LiBNb3N0IG90aGVyCiAgY2FsbGJhY2sgZnVuY3Rpb24ncyB1c2VyZGF0YSBhcmUgcHJvdmlkZWQgd2l0aCBvcHRpb25zIHVzaW5nIGEgc2ltaWxhciBuYW1lLQogIHNjaGVtZS4KCi0gQWRkZWQgIi0tdHJhY2UgW2ZpbGVdIiB0byB0aGUgY29tbWFuZCBsaW5lIHRvb2wuIEl0IG1ha2VzIGEgdmVyeSBkZXRhaWxlZAogIHRyYWNlIGR1bXAgZ2V0IHN0b3JlZCwgd2l0aCBhIGZ1bGwgcHJvdG9jb2wgZHVtcCB0aGF0IGluY2x1ZGVzIGFsbCByZWNlaXZlZAogIGFuZCB0cmFuc21pdHRlZCBkYXRhLiBUaGlzIGNvdWxkIGJlIGEgdmVyeSBlZmZlY3RpdmUgdG9vbCBmb3IgZGVidWdnaW5nIHdoYXQKICBnb2VzIHdyb25nLiBUaGlzIGR1bXAgaW5jbHVkZXMgZXZlcnkgYnl0ZSB0aGUgd2F5IGl0IGlzIHNlbnQgdG8vcmVjZWl2ZWQKICBmcm9tIHRoZSBzZXJ2ZXIuIFRoZSBkdW1wIGlzIHRoZSBwbGFpbi10ZXh0IHZlcnNpb24sIHNvIFNTTCB0cmFuc2ZlcnMgd2lsbAogIHN0aWxsIGJlIHJlYWRhYmxlLgoKLSBJIGZvdW5kIG91dCB0aGF0IHRoZSBERUJVR0ZVTkNUSU9OIHdhcyBub3QgY2FsbGVkIHByb3Blcmx5IGV2ZXJ5d2hlcmUgYXMgd2UKICB3YW50ZWQgaXQgdG8uIEkgZml4ZWQgaXQuCgotIC1EIG5vdyBzdG9yZXMgYWxsIGhlYWRlcnMgdG8gdGhlIHNhbWUgZmlsZSBpZiBtdWx0aXBsZSBVUkxzIGFyZSBnaXZlbiBvbiB0aGUKICBjb21tYW5kIGxpbmUhIEtldmluIFJvdGggbWFkZSBtZSBhd2FyZSBvZiB0aGF0IGl0IGRpZG4ndCBhbHJlYWR5IGRvIHRoaXMhCgotIEd1c3RhZiBIdWkgd3JvdGUgYW4gZXhjZWxsZW50IGZvcm1wb3N0IGV4YW1wbGUgdGhhdCB1c2VkIHRoZSBtdWx0aQogIGludGVyZmFjZS4gIFVuZm9ydHVuYXRlbHksIGl0IGRpZG4ndCB3b3JrIGR1ZSB0byBzZXZlcmFsIGJ1Z3MgaW4gaG93CiAgdHJhbnNmZXJzIHdlcmUgbWFkZSB3aGVuIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2FzIHVzZWQuCgpEYW5pZWwgKDIgTWF5IDIwMDIpCi0gSGFubm8gS3Jhbnpob2ZmIGZvdW5kIG91dCB0aGF0IHdoZW4gZG9pbmcgbXVsdGlwbGUgdHJhbnNmZXJzIG9uIHRoZSBzYW1lCiAgZWFzeSBoYW5kbGUsIHRoZSBwcm9ncmVzcyBtZXRlciB3b3VsZCBzaG93IGEgYmFkICJjdXJyZW50bHkgZG93bmxvYWRlZAogIHZhbHVlIiB3aGVuIHRoZSB0cmFuc2ZlciBzdGFydHMuCgpEYW5pZWwgKDEgTWF5IDIwMDIpCi0gQXBwbGllZCBhbm90aGVyIHBhdGNoIGJ5IEphY2t5IExhbSB0byBtYWtlIHRoZSBuYW1lIHJlc29sdmUgaW5mbyByZWFsbG9jKCkKICBzdHVmZiB3b3JrIHByb3Blcmx5LgoKRGFuaWVsICgyOCBBcHJpbCAyMDAyKQotIGN1cmxfbXVsdGlfaW5mb19yZWFkKCkgaXMgbm93IGltcGxlbWVudGVkIQoKRGFuaWVsICgyNyBBcHJpbCAyMDAyKQotIFVwZGF0ZWQgQlVHUywgVE9ETywgRkFRLCBJTlNUQUxMIGFuZCBhZGRlZCBCSU5ESU5HUy4KCi0gSSB0aGluayBJIGZpeGVkIHRoZSBETlMgY2FjaGUgcHJ1bmUgY3JhY2ggSmFja3kgTGFtIGZvdW5kIGFuZCByZXBvcnRlZC4KCi0gSSBjbGVhbmVkIHVwIHRoZSBuYW1lIHByZWZpeCBzdHVmZiBpbiB0aGUgaGFzaCBhbmQgbGxpc3QgbW9kdWxlcy4KCi0gRlRQIHJlc3BvbnNlcyBzaG91bGQgbm93IGJlIGJldHRlciBvbiB0aW1pbmcgb3V0IHByb3Blcmx5LiBUaGUgdGltZW91dCB2YWx1ZQogIGlzIG1heGltdW0gdGltZW91dCBmb3IgdGhlIGVudGlyZSByZXF1ZXN0IG9wZXJhdGlvbiwgYnV0IGJlZm9yZSB0aGlzLCB0aGUKICB0aW1lb3V0IHdhcyB1c2VkIGFzIGEgbWF4aW11bSBhbGxvd2VkIHRpbWUgYmV0d2VlbiB0d28gcmVhZHMuLi4KCkRhbmllbCAoMjYgQXByaWwgMjAwMikKLSBGaXhlZCB0aGUgdGVzdCBzdWl0ZSBodHRwIHNlcnZlciB0byBub3QgdXNlIHNucHJpbnRmKCkgYW55bW9yZSBkdWUgdG8gYmV0dGVyCiAgcG9ydGFiaWxpdHkuCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDIpCi0gV2l0aCBTdGVybGluZyBIdWdoZXMnIG5ldyBETlMgcHJ1bmluZywgSmFja3kgTGFtIGFza2VkIGlmIHRoaXMgd291bGRuJ3QKICBjYXVzZSBwcm9ibGVtcyBzaW5jZSB0aGUgcHJ1bmluZyBpcyBvbmx5IGNoZWNraW5nIHRoZSBlbnRyeSB0aW1lLCBhbmQgaXQKICBzdXJlIGNvdWxkIGNhdXNlIHByb2JsZW1zLiBUaGVyZWZvciwgSSd2ZSBub3cgYWRkZWQgYW5kIGNoYW5nZWQgY29kZSBzbyB0aGF0CiAgdGhpcyBzaG91bGQgbm90IGJlIGEgcHJvYmxlbS4gTm93aGVyZSBpbiB0aGUgY29kZSB3aWxsIGJlIHN0b3JlIG5hbWUKICByZXNvbHZlZCBpbmZvcm1hdGlvbiBhcm91bmQgc28gdGhhdCBhIHN1bnNlcXVlbnQgRE5TIGNhY2hlIHBydW5lIHNob3VsZAogIGNhdXNlIGEgcHJvYmxlbS4gVGhpcyBvZiBjb3Vyc2UgY2FsbGVkIGZvciBzb21lIG1pbGQgaW50ZXJuYWwgY2hhbmdlcy4KCkRhbmllbCAoMjMgQXByaWwgMjAwMikKLSBJbXByb3ZlZCB0aGUgJ25vX3Byb3h5JyBjaGVjaywgYXMgdXNpbmcgcG9ydCBudW1iZXJzIGluIHRoZSBVUkwgY29uZnVzZWQgaXQKICBwcmV2aW91c2x5LiBSZXBvcnRlZCBieSBFcndhbiBMZWdyYW5kIGluIGJ1ZyByZXBvcnQgIzU0NzQ4NC4KCi0gVGhlIC0taW50ZXJmYWNlIG9wdGlvbiBub3cgd29ya3MgZXZlbiBvbiBJUHY2IGVuYWJsZWQgYnVpbGRzLiBSZXBvcnRlZCBieQogICd0aG9yJy4KCkRhbmllbCAoMjIgQXByaWwgMjAwMikKLSBUaGUgI2RlZmluZXMgbmFtZXMgc3RhcnRpbmcgd2l0aCBUSU1FQ09ORCBub3cgaGFzIENVUkxfIHByZWZpeGVzLiAoVGhlIG9sZAogIG5hbWVzIGFyZSBzdGlsbCAjZGVmaW5lZCB0b28uKSBQb2ludGVkIG91dCBieSBSb2JlcnQgT2xzb24uCgotIEphY2t5IExhbSBicm91Z2h0IGNvZGUgdGhhdCBsZXRzIHRoZSBuYW1lIHJlc29sdmUgZnVuY3Rpb24gb25seSB1c2UgYXMgbXVjaAogIG1lbW9yeSBhcyBpdCBhY3R1YWxseSBuZWVkcy4gVGhpcyBvbmx5IHdvcmtzIG9uIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMsCiAgYnV0IGlzIHRvdGFsbHkgdHJhbnNwYXJhbnQgdG8gYWxsIHVzZXJzLgoKRGFuaWVsICgxOSBBcHJpbCAyMDAyKQotIEJqb3JuIFJlZXNlIGZpeGVkIHBhY2tfaG9zdGVudCB0byB3b3JrIHByb3Blcmx5IHdpdGggNjQgYml0IHBvaW50ZXJzLgoKRGFuaWVsICgxOCBBcHJpbCAyMDAyKQotIFN0ZXJsaW5nIEh1Z2hlcyBhZGRlZCBjb2RlIHRvIHBydW5lIG9sZCBETlMgY2FjaGUgZW50cmllcywgc2luY2UgSmFja3kgTGFtCiAgZXhwZXJpZW5jZWQgdmVyeSBiaWcgY2FjaGVzLgoKRGFuaWVsICgxNyBBcHJpbCAyMDAyKQotIERpcmsgTWFuc2tlIHBhdGNoZWQgdGhlIDMwMSByZXNwb25zZSB0byB3b3JrIGFnYWluc3QgdGhlIFJGQyBidXQgbW9yZSBsaWtlCiAgY29tbW9uIGJyb3dzZXJzIGRvLiBJZiBhIFBPU1QgZ2V0IGEgMzAxIGJhY2ssIGl0J2xsIHN3aXRjaCB0byBHRVQgaW4gdGhlCiAgbmV4dCByZXF1ZXN0IChpZiBsb2NhdGlvbi1mb2xsb3dpbmcgaXMgZW5hYmxlZCkuCgpEYW5pZWwgKDE2IEFwcmlsIDIwMDIpCi0gRGlyayBNYW5za2UgcG9zdGVkIGEgcGF0Y2ggb3JpZ2luYWxseSB3cml0dGVuIGJ5IEluZ28gV2lsa2VuIHRoYXQgaW50cm9kdWNlZAogIHR3byBuZXcgQ1VSTElORk9fKiB2YWx1ZXM6IENVUkxJTkZPX1JFRElSRUNUX1RJTUUgYW5kCiAgQ1VSTElORk9fUkVESVJFQ1RfQ09VTlQuCgpEYW5pZWwgKDE1IEFwcmlsIDIwMDIpCi0gSm9uYXRhbiBMYW5kZXIgcGF0Y2hlZCB0aGUgdmVyYm9zZSB0ZXh0ICdEaXNhYmxlcyBQT1NULCBnb2VzIHdpdGggR0VUJyB0bwogIHJlZmxlY3QgcmVhbGl0eSBiZXR0ZXIsIGxpa2Ugd2hlbiB0aGUgZmlyc3QgcmVxdWVzdCBpc24ndCBQT1NUIGFuZCB3aGVuCiAgdGhlIHNlY29uZCBpc24ndCBHRVQuLi4gOi0pCgotIENyYWlnIERhdmlzb24gcG9pbnRlZCBvdXQgdGhhdCB3aGVuIGN1cmxfZm9ybWFkZCgpaW5nIGEgZmlsZSB0aGF0IGRvZXNuJ3QKICBleGlzdCwgbGliY3VybCBkb2Vzbid0IHJldHVybiBlcnJvci4gTm93LCBjdXJsX2Vhc3lfcGVyZm9ybSgpIHdpbGwgcmV0dXJuCiAgQ1VSTEVfUkVBRF9FUlJPUiBpZiB0aGF0IGlzIHRoZSBjYXNlLiBUZXN0IDQxIHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhpcy4KClZlcnNpb24gNy45LjYKCkRhbmllbCAoMTQgQXByaWwgMjAwMikKLSBEaXJrIE1hbnNrZSBicm91Z2h0IGEgZml4IHRoYXQgbWFrZXMgbGliY3VybCBzdHJpcCBvZmYgd2hpdGUgc3BhY2VzIGZyb20gdGhlCiAgYmVnaW5uaW5nIG9mIGNvb2tpZSBjb250ZW50cy4KCi0gSGFkIHRvIHBhdGNoIGluY2x1ZGUvY3VybC9jdXJsLmggc2luY2UgTVNWQyBkb2Vzbid0IHNldCB0aGUgX19TVERDX18gZGVmaW5lLgogIE1vb25lc2FteSBwb2ludGVkIG91dCB0aGUgcHJvYmxlbSwgQmpvcm4gUmVlc2UgdGhlIHNvbHV0aW9uLgoKVmVyc2lvbiA3LjkuNi1wcmU1CgpEYW5pZWwgKDEyIEFwcmlsIDIwMDIpCi0gRml4ZWQgdGhlIFRJTUVSX0NPTk5FQ1QgdG8gYmUgbW9yZSBhY2N1cmF0ZSBmb3IgRlRQIHRyYW5zZmVycy4gUHJldmlvdXNseQogIEZUUCB0cmFuc2ZlcnMgZ290IHRoZSAiY29ubmVjdCBkb25lIiB0aW1lIHNldCBhZnRlciB0aGUgaW5pdGlhbCBGVFAgY29tbWFuZHMKICBhbmQgbm90IGRpcmVjdGx5IGFmdGVyIHRoZSBUQ1AvSVAgY29ubmVjdCBhcyBpdCBzaG91bGQuCgogIEkgYWxzbyBtYWRlIHRoZSB0aW1lIHN0YW1wIGdldCBzZXQgZXZlbiBpZiB0aGUgY29ubmVjdCBpdHNlbGYgZmFpbHMsIHdoaWNoCiAgaXQgZGlkbid0IGRvIHByZXZpb3VzbHkuCgotIEplYW4tUGhpbGlwcGUgQmFycmV0dGUtTGFQaWVycmUgcHJvdmlkZWQgaGlzIHBhdGNoIHRoYXQgaW50cm9kdWNlcwogIENVUkxPUFRfREVCVUdGVU5DVElPTiBhbmQgQ1VSTE9QVF9ERUJVR0RBVEEuIFRoZXkgYWxsb3cgYSBwcm9ncmFtIHRvIGEgc2V0IGEKICBjYWxsYmFjayB0byByZWNlaXZlIGRlYnVnL2luZm9ybWF0aW9uIGRhdGEuIFRoYXQgaW5jbHVkZXMgaGVhZGVycyBhbmQgZGF0YQogIHRoYXQgaXMgcmVjZWl2ZWQgYW5kIHNlbnQuIENVUkxPUFRfVkVSQk9TRSBzdGlsbCBjb250cm9scyBpdC4KCiAgQnkgZGVmYXVsdCwgdGhlcmUgaXMgYW4gaW50ZXJuYWwgZGVidWdmdW5jdGlvbiB0aGF0IHdpbGwgbWFrZSB0aGluZ3MgbG9vawogIGFuZCB3b3JrIGFzIGJlZm9yZSBpZiBub3QgY2hhbmdlZC4KCkRhbmllbCAoMTAgQXByaWwgMjAwMikKLSBTZWJhc3RpZW4gV2lsbGVtaWpucyBmb3VuZCBvdXQgdGhhdCAteCBkaWRuJ3QgdXNlIHRoZSBkZWZhdWx0IHBvcnQgbnVtYmVyIGFzCiAgaXMgZG9jdW1lbnRlZC4gSXQgZG9lcyBub3cuCgotIGxpYmN1cmwtZXJyb3JzLjMgaXMgYSBuZXcgbWFuIHBhZ2UgYXR0ZW1wdGluZyB0byBkb2N1bWVudCBhbGwgbGliY3VybCBlcnJvcgogIGNvZGVzCgotIEFkZGVkIHR3byBuZXcgZXJyb3IgY29kZXMgYW5kIGNoYW5nZWQgdGhlIGJlaGF2aW91ciBvZiB0d28gb2xkIG9uZXMKICBzbGlnaHRseToKCiAgQ1VSTEVfV1JJVEVfRVJST1IKICAgVGhpcyBlcnJvciB3YXMgcmV0dXJuZWQgKmJvdGgqIGZvciBlcnJvcnMgdGhhdCBvY2N1cmVkIHdoZW4gd3JpdGluZwogICByZWNlaXZlZCBkYXRhIHRvIGEgbG9jYWwgZmlsZSwgYXMgd2VsbCBhcyB3aGVuIHdlIGdldCBwcm9ibGVtcyB3cml0aW5nIGRhdGEKICAgdG8gYSByZW1vdGUgc2VydmVyLiBDVVJMRV9TRU5EX0VSUk9SIGhhcyBub3cgYmVlbiBhZGRlZCBmb3IgdGhlIGxhdHRlcgogICBlcnJvci4KCiAgQ1VSTEVfUkVBRF9FUlJPUgogICBUaGlzIGVycm9yIHdhcyBzaW1pbGFybHkgcmV0dXJuZWQgKmJvdGgqIGZvciBlcnJvcnMgd2hlbiByZWFkaW5nIGEgbG9jYWwKICAgZmlsZSwgYXMgd2VsbCBhcyB3aGVuIGdldHRpbmcgcHJvYmxlbXMgd2hlbiByZWFkaW5nIG5ldHdvcmsgZGF0YS4KICAgQ1VSTEVfUkVDVl9FUlJPUiBoYXMgbm93IGJlZW4gYWRkZWQgZm9yIHRoZSBsYXR0ZXIgZXJyb3IuCgogKFR3byB0ZXN0IGNhc2VzIHdlcmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuKQoKRGFuaWVsICg5IEFwcmlsIDIwMDIpCi0gcnVudGVzdHMucGwgbm93IHNldHMgdGhlIEhPTUUgdmFyaWFibGUgYmVmb3JlIHJ1bm5pbmcgY3VybCwgdG8gcHJldmVudCBhbnkKICBhY3R1YWwgfi8uY3VybHJjIGZpbGUgdG8gZm9vbCB0aGUgdGVzdHMhCgpWZXJzaW9uIDcuOS42LXByZTQKCkRhbmllbCAoOCBBcHJpbCAyMDAyKQotIE1pY2hhZWwgQ3VydGlzIHByb3ZpZGVkIG5ldyBmdW5jdGlvbmFsaXR5IGZvciBjdXJsIG9uIHNvbWUgcGxhdGZvcm1zLiBVc2luZwogIHRoZSAtLWVudmlyb25tZW50IG9wdGlvbiwgY3VybCB3aWxsICpzZXQqIGEgYnVuY2ggb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzCiAgdG8gdmFsdWVzLiBUaGUgbmFtZXMgYXJlIHRoZSBzYW1lIG9uZXMgYXMgZm9yIHRoZSAtdy8tLXdyaXRlb3V0IG9wdGlvbi4KCiAgRm9yIG5vdywgdGhpcyBvbmx5IHdvcmtzIG9uIHRoZSBSSVNDIE9TIHZlcnNpb24sIGFzIHRoaXMgZmVhdHVyZSByZWxpZXMgb24KICBib3RoIE9TIHN1cHBvcnQgYW5kIHRoYXQgaXQgbWF0Y2hlcyBPUyBwYXJhZGlnbXMuCgotIEphY2t5IExhbSBwcm92aWRlZCBhIGZpeCBmb3IgZ2V0dGluZyBoZWFkZXJzLW9ubHkgd2hlbiB0aGUgcmVwbHkgaXMgSFRUUC8xLjAKICBhbmQgMzA0LCBJIGVkaXRlZCBpdCBzbGlnaHRseS4KCkRhbmllbCAoNSBBcHJpbCAyMDAyKQotIEFzIHJlcXVlc3RlZCBieSBKYXkgR3JhdmVzLCB0aGUgJy5jdXJscmMnIGZpbGUgKG9yIF9jdXJscmMgYXMgaXQgaXMgY2FsbGVkCiAgd2hlbiB1c2VkIGluIHdpbmRvd3MpLCBpcyBub3cgbG9hZGVkIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIHRoZSBIT01FCiAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXNuJ3Qgc2V0IChvciBpZiBpdCBpcyB0b28gbG9uZykuIEkgYWxzbyBlbmxhcmdlZCB0aGUKICBhcnJheSB1c2VkIHRvIHN0b3JlIHRoZSBmdWxsIGZpbGUgcGF0aCBpbiwgdG8gNTEyIGJ5dGVzLgoKLSBLZXZpbiBSb3RoIHBvaW50ZWQgb3V0IHRvIG1lIHdoeSB0aGUgIjE5IE1hcmNoIiBjaGFuZ2UgcmVnYXJkaW5nIC1HIGFuZCAtSQogIHdhcyBzdHVwaWQgYW5kIHRoZSBjaGFuZ2Ugd2FzIHJldmVydGVkLiBBZGRlZCB0ZXN0IGNhc2UgNDggdG8gdmVyaWZ5IHRoZQogIGZ1bmN0aW9uYWxpdHkuCgpWZXJzaW9uIDcuOS42LXByZTMKCkRhbmllbCAoNCBBcHJpbCAyMDAyKQotIEpvbmF0YW4gTGFuZGVyIGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2VzIGN1cmwvY3VybC5oIGNvbXBpbGUgbmljZWx5IG9uCiAgcHJlLUlTTyBjb21waWxlcnMsIGxpa2Ugd2hlbiB1c2luZyBnY2MgLXRyYWRpdGlvbmFsLgoKRGFuaWVsICgzIEFwcmlsIDIwMDIpCi0gSmFja3kgTGFtIGlkZW50aWZpZWQgYSBnbGl0Y2ggd2hlbiBnZXR0aW5nIGhlYWRlcnMtb25seSwgd2hlcmUgbGliY3VybCB3b3VsZAogICJoYW5nIiAxIHNlY29uZCBpbiB2YWluIGluIHRoZSBzZWxlY3QoKSBsb29wIGJlZm9yZSByZXR1cm5pbmcgYmFjay4KCi0gVG9yIEFybnRzZW4gYnJvdWdodCBhIHBhdGNoIGZvciBtdWx0aXBhcnQgZm9ybXBvc3RzLiBJdCB0dXJuZWQgb3V0IHRoYXQgdGhlCiAgIkNHSV9MaXRlIFBlcmwgcGFja2FnZSIgbWFrZXMgc29tZSBiYWQgYXNzdW1wdGlvbnMgb24gd2hhdCBsZXR0ZXJzIHRoYXQgbWF5CiAgYmUgdXNlZCBpbiBib3VuZGFyeSBzdHJpbmdzIGFuZCB0aHVzIGN1cmwgY291bGQgY29uZnVzZSBpdCBieSBpbmNsdWRpbmcgJysnCiAgYW5kICcvJy4gV2hpbGUgdGhpcyBpcyBzdGFuZGFyZHMtY29tcGxpYW50LCB3ZSBjaGFuZ2UgdGhlIGJlaGF2aW9yIHRvIHdvcmsKICBzbW9vdGhseSB3aXRoIGV4aXN0aW5nIHNvZnR3YXJlIGJhc2VkIG9uIHRoYXQgcGFja2FnZS4KCkRhbmllbCAoMiBBcHJpbCAyMDAyKQotIEdlcmhhcmQgSGVycmUgZmlsZWQgYnVnIHJlcG9ydCAjNTM2MjM4IHdoZXJlIGhlIHBvaW50ZWQgb3V0IGEgY3Jhc2ggaW4KICB2ZXJib3NlIEZUUCBwYXNzaXZlIHRyYW5zZmVycyBmb3IgQUlYLgoKLSBDbGFyZW5jZSBHYXJkbmVyIHBvaW50ZWQgb3V0IGEgbWlub3IgZmxhdyBpbiBob3cgbGliY3VybCBkaWRuJ3QgcHJvcGVybHkKICB0YWtlIGNhcmUgb2YgYWxsIGVycm9ycyB0aGF0IFNTTF9yZWFkKCkgY291bGQgcmV0dXJuLgoKLSBKYWNreSBMYW0gZml4ZWQgYSBNQUxMT0NERUJVRyBwcm9ibGVtIGluIGxpYi9nZXRpbmZvLmMKCkRhbmllbCAoMjcgTWFyY2ggMjAwMikKLSBULiBCaGFyYXRoIHBvaW50ZWQgb3V0IGEgZmxhdyBpbiB0aGUgY29ubmVjdGlvbiByZS11c2UgZnVuY3Rpb24gdGhhdCBkaWRuJ3QKICBjaGVjayBwcm94eSBjb25uZWN0aW9ucyBwcm9wZXJseSBmb3IgImRlYWRuZXNzIiBiZWZvcmUgdGhleSB3ZXJlIHJlLXVzZWQuCgotIFBlZHJvIE5ldmVzIGZvdW5kIG91dCB0aGF0IEhUVFAgUE9TVGluZyB3aXRoIC0tZGF0YS1iaW5hcnkgZGlkIG5vdCBwcm9wZXJseQogIHdvcmsgdW5kZXIgV2luZG93cyBhcyB0aGUgZmlsZSBzcGVjaWZpZWQgd2Fzbid0IHJlYWQgZnVsbHkgYmluYXJ5IQoKRGFuaWVsICgyNSBNYXJjaCAyMDAyKQotIEphY2t5IExhbSBicm91Z2h0IGEgZml4IHRoYXQgaW1wcm92ZXMgdHJlYXRtZW50IG9mIGNvb2tpZXMgdXNpbmcgaWRlbnRpY2FsCiAgZG9tYWlucyBidXQgd2l0aCBsZWFkaW5nIGRvdHMgcHJvcGVybHkuCgpEYW5pZWwgKDIyIE1hcmNoIDIwMDIpCi0gTWlrbG9zIE5lbWV0aCB1cGRhdGVkIHRoZSB3aW5kb3dzIHNlY3Rpb24gb2YgdGhlIGRvY3MvSU5TVEFMTCBmaWxlIGFuZCB0aGUKICB3aW5kb3dzIG1ha2VmaWxlcy4KCi0gSm9uIERpbGxvbiBwcm92aWRlZCB1cyB3aXRoIHNldmVyYWwgZ29vZC1sb29raW5nIGN1cmwgaW1hZ2VzIGZvcgogIHByb21vdGlvbi4gVmlldyB0aGVtIGhlcmUgaHR0cHM6Ly9jdXJsLmhheHguc2UvaWNvbnMuaHRtbAoKRGFuaWVsICgyMCBNYXJjaCAyMDAyKQotIFBldGVyIFZlcmhhcyBmb3VuZCBvdXQgdGhhdCBDUkxGIHJlcGxhY2VtZW50IGluIHVwbG9hZHMgd2FzIG5vdCB3b3JraW5nLiBJCiAgZml4ZWQgaXQsIGFuZCBhZGRlZCB0ZXN0IGNhc2UgMTI4IHRoYXQgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkuCgotIFRoZSBsaXN0IGZvcm1lcmx5IGtub3duIGFzIGN1cmwtbWFpbiBpcyBub3cgbmFtZWQgY3VybC11c2VycyBhbmQgaXMgaG9zdGVkCiAgYnkgc291cmNlZm9yZ2UuIFN1c2JjcmliZSB0byB0aGUgbmV3IGxpc3QsIGdldCBvZmYgdGhlIG9sZCBvbmUuCgpWZXJzaW9uIDcuOS42LXByZTIKCkRhbmllbCAoMTkgTWFyY2ggMjAwMikKLSBNYWRlIC1HIGFuZCAtSSBvbiB0aGUgc2FtZSBjb21tYW5kIGxpbmUgY2F1c2UgYW4gZXJyb3IuCgotIE1vdmVkIHRoZSBtdWx0aS5oIGZpbGUgdG8gdGhlICJwdWJsaWMiIGluY2x1ZGUgZGlyZWN0b3J5IGFuZCBtYWRlIGl0IGdldAogIGluY2x1ZGVkIGJ5IGN1cmwuaCBzbyB0aGF0IG5vIGV4dHJhIGluY2x1ZGUgZmlsZXMgd2lsbCBiZSBuZWNlc3NhcnkgdG8gdXNlCiAgaXQuCgogIEFkZGVkIGRvY3MgYW5kIG1hbiBwYWdlcyBmb3IgdGhlIG11bHRpIGludGVyZmFjZSB0byB0aGUgcmVsZWFzZSBhcmNoaXZlLgogIEFkZGVkIHRoZSB0aHJlZSBleGFtcGxlIHNvdXJjZSBjb2RlcyB0b28uCgogIE5lY2Vzc2FyeSBzdGVwcyBpbiBteSBjYW1wYWlnbiB0byBzbmVhayBpbiB0aGUgbXVsdGkgaW50ZXJmYWNlLi4uIDstKQoKLSBVcGRhdGVkIHRoZSB5ZWFyIGluIGFsbCBjb3B5cmlnaHQgbm90aWNlcyBpbiBhbGwgQyBhbmQgSCBmaWxlcy4KCkRhbmllbCAoMTggTWFyY2ggMjAwMikKLSBUb21hcyBTemVwZSBmb3VuZCBvdXQgdGhhdCAtZCBhbmQgLUcgZGlkbid0IG1peCBhcyB0aGV5IHNob3VsZC4gSSBicm9rZSB0aGlzCiAgaW4gNy45LjUuLi4gQWRkZWQgdGVzdCBjYXNlIDMyIGZvciB0aGlzLgoKVmVyc2lvbiA3LjkuNi1wcmUxCgpEYW5pZWwgKDE2IE1hcmNoIDIwMDIpCi0gUGV0ZXIgVmVyaGFzIHBvaW50ZWQgb3V0IHRoYXQgdGhlIGN1cmxfZXNjYXBlIGFuZCBjdXJsX3Vuc2NhcGUgbWFuIHBhZ2VzCiAgY29udGFpbmVkIGZhY3R1YWwgZXJyb3JzLgoKLSBBbGJlcnQgQ2hveSBmb3VuZCBhbmQgY29ycmVjdGVkIGEgcHJvYmxlbSB3aXRoIHRoZSB2ZXJib3NlIG91dHB1dCB3aGVuIGRvaW5nCiAgUEFTViBmdHAgdHJhbnNmZXJzLiBJdCBjb3VsZCBtYWtlIGxpYmN1cmwgY3Jhc2guCgogIERldGFpbHMgaW4gYnVnIHJlcG9ydCAjNTMwNTYyOgogIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3AvY3VybC9idWdzLzE3OC8KCkRhbmllbCAoMTUgTWFyY2ggMjAwMikKLSBKdW4taWNoaXJvIGl0b2p1biBIYWdpbm8gZmlsZWQgYnVnIHJlcG9ydCAjNTMwMjA0IHRoYXQgY2xlYXJseSBwb2ludGVkIG91dAogIHRoZSBQRl9JTkVUIGZpeCBmcm9tIEZlYnJ1YXJ5IDE5IGFzIGEgbm90LXZlcnktZ29vZCBmaXggYXMgaXQgYnJva2UgSVB2NgogIGNhcGFiaWxpdHkhIFRoYXQgcGF0Y2ggaXMgbm93IHJldmVydGVkLgoKICBUaGUgcHJvYmxlbSB3aXRoIHNsb3cgbmFtZSBsb29rdXBzIHdpdGggZ2V0YWRkcmluZm8oKSBvbiBub24tSVB2NiBlbmFibGVkCiAgaG9zdHMgYXJlIGluc3RlYWQgbWFkZSBieSBmaXJzdCBjaGVja2luZyBpZiB0aGUgc3RhY2sgaXMgSVB2Ni1lbmFibGVkIGFuZCBpZgogIG5vdCwgdGhlIFBGX0lORVQgaXMgdXNlZCBhbmQgb3RoZXJ3aXNlIHdlIGdvIHdpdGggdGhlIGZ1bGwgUEZfVU5TUEVDLgoKLSBULiBCaGFyYXRoIHBvaW50ZWQgb3V0IHRoYXQgd2hlbiB3ZSByZXR1cm4gYW4gImVycm9yIiBmcm9tIGEgV1JJVEVGVU5DVElPTgogIGFzIGRlc2NyaWJlZCBpbiB0aGUgbWFuIHBhZ2UsIGxpYmN1cmwgZGlkIG5vdCByZXR1cm4gdGhlIGRvY3VtZW50ZWQgZXJyb3IKICBjb2RlIChDVVJMRV9XUklURV9FUlJPUikgYnV0IHdvdWxkIGluc3RlYWQgcmV0dXJuIENVUkxFX1JFQURfRVJST1IuIFRoaXMgaXMKICBub3cgY29ycmVjdGVkLgoKRGFuaWVsICgxNCBNYXJjaCAyMDAyKQotIFNldHRpbmcgQ1VSTE9QVF9QT1NUIHdpdGhvdXQgc2V0dGluZyBDVVJMT1BUX1BPU1RGSUVMRFMgbm93IHJlYWQgdGhlIFBPU1QtCiAgZGF0YSBmcm9tIHRoZSBjYWxsYmFjay4KCi0gVGhlIEdPUEhFUiBzdXBwb3J0IHNlZW1zIHRvIGJlIGJyb2tlbi4gSSBkb24ndCB0aGluayBJJ2xsIGV2ZW4gc3RhcnQgZml4aW5nCiAgaXQgdW50aWwgc29tZW9uZSBlbHNlIGZpbmRzIG91dC4uLiA6LSkKCkRhbmllbCAoMTMgTWFyY2ggMjAwMikKLSBUcnlpbmcgJ2N1cmwgLUkgZnRwLnN1bmV0LnNlJyBvciBzaW1pbGFyIGRpZCBhIFNJWkUgb24gYSBzaWxseSAiKG5pbCkiCiAgc3RyaW5nLiBJZiBzdWNoIGEgZmlsZSB3b3VsZCBiZSBwcmVzZW50LCBjdXJsIHJldHVybmVkIHRoZSBzaXplIG9mIGl0ISBOb3cKICB3ZSBwcmV2ZW50IHRoaXMuCgotIEN1cmxfc2VuZGYoKSB3YXMgZml4ZWQgdG8gZGVhbCB3aXRoIHNpdHVhdGlvbiB3aGVyZSBDdXJsX3dyaXRlKCkgd291bGQndmUKICBibG9ja2VkIGFuZCB0aHVzIHJldHVybiAtMS4KCi0gU2V0dGluZyBDVVJMT1BUX1BST0dSRVNTRlVOQ1RJT04gdG8gTlVMTCBub3cgcmVzdG9yZXMgdGhlIGludGVybmFsIGZ1bmN0aW9uLgoKLSBBbGwgQ1VSTEZPUk1fKiBvcHRpb25zIGNhbiBub3cgYmUgdXNlZCBpbiBhIENVUkxGT1JNX0FSUkFZIGV4Y2VwdCB0aGUKICBDVVJMRk9STV9BUlJBWSBpdHNlbGYuIFRoaXMgd2FzIG5lY2Vzc2FyeSBzaW5jZSB3ZSBjb3VsZG4ndCBleHBhbmQgdGhlCiAgQ1VSTEZPUk1fKiBsaXN0IHByb3ByZWx5IGFuZCB1bnJlc3RyaWN0ZWQgdW50aWwgdGhpcyB3YXMgdGhlIGNhc2UuIEl0IHdhcwogIGFsc28gYSBiaXQgcGVjdWxpYXIgdG8gdXNlcnMgd2h5IHNvbWUgb3B0aW9ucyBjb3VsZCBiZSB1c2VkIGluIGFuIGFycmF5CiAgd2hpbGUgb3RoZXJzIGNvdWxkbid0LgoKLSBSZW1vdmVkIHNvbWUgc2lsbHkgQ1JMRiBsaW5lcyB0aGF0IGhhZCBhY2NpZGVudGFsbHkgc2xpcHBlZCBpbnRvIHNyYy9tYWluLmMKICBOaWNvIEJhZ2d1cyBwb2ludGVkIHRoZW0gb3V0IHRvIG1lLgoKRGFuaWVsICgxMSBNYXJjaCAyMDAyKQotIENVUkxGT1JNX0ZJTEVOQU1FIHdhcyBhZGRlZC4gVGhpcyBjYW4gYmUgc2V0IHdoZW4gY3JlYXRpbmcgYSBmaWxlIHVwbG9hZAogIHBhcnQsIHRvIHNldCB0aGUgJ2ZpbGVuYW1lJyBmaWVsZCB0byBhIGN1c3RvbSB2YWx1ZS4gSWYgdGhpcyBpc24ndCB1c2VkLAogIHRoZSBhY3R1YWxseSB1c2VkIGZpbGVuYW1lIHdpbGwgYmUgaW5jbHVkZWQgaW5zdGVhZCAoYXMgbGliY3VybCBhbHdheXMgaGFzCiAgZG9uZSkuIGN1cmwgd2FzIGFkanVzdGVkIGFjY29yZGluZ2x5LCBhbmQgbm93IC1GIGFjY2VwdHMgYSAnZmlsZW5hbWU9JyBmaWVsZAogIHRvbywgYW5kIGFsbG93cyBjb25zdHJ1Y3RzIHN1Y2ggYXM6CgogICAgLUYgJ25hbWU9QGZpbGVuYW1lO2ZpbGVuYW1lPS9kZXYvbnVsbCcKCiAgYW5kIHRoaXMgY2FuIGJlIGNvbWJpbmVkIHdpdGggdHlwZT0gdG9vLCBpbiBhIG1hbm5lciBzaW1pbGFyIHRvOgoKICAgLUYgImZpbGU9QGxvZy90ZXN0MzkudHh0O2ZpbGVuYW1lPWZha2VyZmlsZTt0eXBlPW1vby9mb29iYXIiCgogIFRlc3QgY2FzZSAzOSB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoaXMgZnVuY3Rpb25hbGl0eS4KCi0gVGhlIHN0cnVjdCBmb3JtZXJseSBrbm93biBhcyBIdHRwUG9zdCBpcyBub3cgbmFtZWQgY3VybF9odHRwcG9zdCB0byBwcm9wZXJseQogIHVzZSB0aGUgY3VybCBuYW1lIHNwYWNlLiBJIGFkZGVkIGEgI2RlZmluZSBmb3IgdGhlIG9sZCBuYW1lIHRvIG1ha2UgZXhpc3RpbmcKICBwcm9ncmFtcyBjb21waWxlIGV2ZW4gd2hlbiB0aGlzIG5ldyBpbmNsdWRlIGZpbGUgaXMgdXNlZC4KCkRhbmllbCAoOCBNYXJjaCAyMDAyKQotIENsaWZmb3JkIGFsc28gZGlzY292ZXJlZCB0aGF0IGlmIHRoZSBjbGllbnQgY29kZSBmYWlsZWQgZWFybHksIGFzIHdoZW4gZG9pbmcKICAiY3VybCAtTyIgb25seSwgaXQgd291bGQgZG8gZmNsb3NlKE5VTEwpIHdoaWNoIGNhdXNlZCBhIHNlZ21lbnRhdGlvbiBmYXVsdAogIG9uIHNvbWUgc3lzdGVtcy4KCi0gQ2xpZmZvcmQgV29sZiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFkZSAtLXByb2dyZXNzLWJhciB3b3JrIGFnYWluLgoKLSBJIGNsb3NlZCBidWcgcmVwb3J0ICM1MjcwMzIgYnkgbWFraW5nIHN1cmUgdGhhdCB3ZSBhZGQgYSBuZXdsaW5lIGFmdGVyIGEKICB0cmFuc2ZlciB3aGVuIC0tcHJvZ3Jlc3MtYmFyIGhhcyBiZWVuIHVzZWQuIEJlZm9yZSwgd2l0aG91dCB0aGUgbmV3bGluZSwgaXQKICBtYWRlIHRoZSBzdWJzZXF1ZW50IHRleHQgY29tZSBvdXQgd3JvbmcuCgpWZXJzaW9uIDcuOS41CgpEYW5pZWwgKDcgTWFyY2ggMjAwMikKLSBBZGRlZCBkb2NzL0tOT1dOX0JVR1MgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KCkRhbmllbCAoNiBNYXJjaCAyMDAyKQotIEtldmluIFJvdGggY29ycmVjdGVkIGEgZmxhdyBpbiB0aGUgY3VybCBjbGllbnQgZ2xvYmJpbmcgY29kZSB0aGF0IG1hZGUgaXQKICBtZXNzIHVwIGJhY2tzbGFzaGVzLiBUaGlzIHdhcyBtb3N0IG5vdGFibGUgb24gd2luZG93cyAoY3lnd2luKSBtYWNoaW5lcyB3aGVuCiAgdXNpbmcgZmlsZTovLy4KCi0gQnJhZCBwcm92aWRlZCBhbm90aGVyIGZpeCBmb3IgYnVpbGRpbmcgb3V0c2lkZSB0aGUgc291cmNlLXRyZWUuCgotIFJhbHBoIE1pdGNoZWxsIHBhdGNoZWQgYXdheSBhIGZldyBjb21waWxlciB3YXJuaW5ncyBpbiB0ZXN0cy9zZXJ2ZXIvc3dzLmMKCkRhbmllbCAoNSBNYXJjaCAyMDAyKQotIEkgbm90aWNlZCB0aGF0IHRoZSB0eXBlZGVmIGluIGN1cmwuaCBmb3IgdGhlIHByb2dyZXNzIGNhbGxiYWNrIHByb3RvdHlwZSB3YXMKICB3cm9uZyBhbmQgdGh1cyBhcHBsaWNhdGlvbnMgdGhhdCB1c2VkIGl0IHdvdWxkIG5vdCBnZXQgdGhlIHByb3BlciBpbnB1dAogIGRhdGEuIEl0IHVzZWQgc2l6ZV90IHdoZXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBhY3R1YWxseSB1c2VzIGRvdWJsZXMhCgogIEkgd2lzaCBJIGNvdWxkIGJsYW1lIHNvbWVvbmUgZWxzZSwgYnV0IHRoaXMgd2FzIG15IGZhdWx0LiBBZ2Fpbi4KClZlcnNpb24gNy45LjUtcHJlNgoKRGFuaWVsICg0IE1hcmNoIDIwMDIpCi0gQ3V0IG9mZiB0aGUgY2hhbmdlcyBkb25lIGR1cmluZyAyMDAxIGZyb20gdGhpcyBjaGFuZ2Vsb2cgZmlsZSBhbmQgcHV0IHRoZW0KICBpbiBhIHNlcGFyYXRlIGZpbGUgKENIQU5HRVMuMjAwMSksIGF2YWlsYWJsZSBmcm9tIENWUyBvZiBjb3Vyc2UuCgotIEkgcmVtb3ZlZCB0aGUgbXVsdGkgZGlyZWN0b3J5LiBUaGUgZXhhbXBsZSBzb3VyY2VzIHdlcmUgbW92ZWQgdG8gdGhlCiAgZG9jcy9leGFtcGxlcyBkaXJlY3Rvcnkgd2hlcmUgdGhleSBiZWxvbmcuCgotIFdyb3RlIDcgbmV3IG1hbiBwYWdlcyBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb25zIGluIHRoZSBuZXcgbXVsdGkgaW50ZXJmYWNlLgogIFRoZXkncmUgYWxsIHN0aWxsIHByZXR0eSBiYXNpYywgYnV0IHdlIGNhbiB1c2UgdGhlbSBhcyBhIHN0YXJ0IGFuZCBhZGQgbW9yZQogIGNvbnRlbnRzIHRvIHRoZW0gd2hlbiB3ZSBmaWd1cmUgb3V0IHdoYXQgdG8gd3JpdGUuIFRoZSBsYXJnZSBhbW91bnQgb2YgbWFuCiAgcGFnZXMgZm9yIGxpYmN1cmwgbm93IHByZXNlbnQgbWFkZSBtZSBkZWNpZGUgdG8gcHV0IHRoZW0gaW4gYSBuZXcgc2VwYXJhdGUKICBzdWJkaXJlY3RvcnkgaW4gdGhlIGRvY3MgZGlyZWN0b3J5LiBOYW1lZCBsaWJjdXJsLgoKLSBHaXVzZXBwZSBDb3JiZWxsaSBwcm92aWRlZCBhIHRlbXBsYXRlIGZpbGUgZm9yIHRoZSBFUE0gcGFja2FnZSBtYW5hZ2VyLCBpdAogIGdldHMgZ2VuZXJhdGVkIG5pY2VseSBieSB0aGUgY29uZmlndXJlIHNjcmlwdCBub3cuCgpWZXJzaW9uIDcuOS41LXByZTUKCkRhbmllbCAoMSBNYXJjaCAyMDAyKQotIE1vdmVkIHRoZSBtZW1hbmFseXplLnBsIHNjcmlwdCBpbnRvIHRoZSB0ZXN0cy8gZGlyIGFuZCBhZGRlZCBpdCB0byB0aGUKICByZWxlYXNlIGFyY2hpdmVzLiBJdCB3YXMgcHJldmlvdXNseSBvbmx5IHByZXNlbnQgaW4gdGhlIENWUyB0cmVlLgoKLSBNb2RpZmllZCB0aGUgRmVicnVhcnkgMTd0aCBIb3N0OiBmaXgsIGFzIGJ1ZyByZXBvcnQgIzUyMzcxOCBwb2ludGVkIG91dCB0aGF0CiAgaXQgY2F1c2VkIGNyYXNoZXMhCgotIE5pY28gQmFnZ3VzIGFkZGVkIG1vcmUgZXJyb3IgY29kZXMgdG8gdGhlIFZNUyBzdHVmZi4KCi0gV2VzbGV5IExheHRvbiBicm91Z2h0IHRoZSBjb2RlIHRoYXQgaW50cm9kdWNlZCB0aGUgbmV3IENVUkxPUFRfUFJFUVVPVEUKICBvcHRpb24uIEl0IGlzIGp1c3QgYW5vdGhlciBGVFAgcXVvdGUgb3B0aW9uIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkKICBhIGxpc3Qgb2YgRlRQIGNvbW1hbmRzIHRvIGlzc3VlICpqdXN0IGJlZm9yZSogdGhlIHRyYW5zZmVyIGNvbW1hbmQgKFJFVFIgb3IKICBTVE9SIGV0YykuIEl0IGhhcyB0dXJuZWQgdXAgYSBmZXcgc3lzdGVtcyB0aGF0IHJlYWxseSBuZWVkIHRoaXMuCgogIFRoZSBjdXJsIGNvbW1hbmQgbGluZSB0b29sIGNhbiBhbHNvIHRha2UgYWR2YW50YWdlIG9mIHRoaXMgYnkgcHJlZml4aW5nIHRoZQogIHF1b3RlIGNvbW1hbmRzIHdpdGggYSBwbHVzICgrKSBpbiBzaW1pbGFyIHN0eWxlIHRoYXQgcG9zdCB0cmFuc2ZlciBxdW90ZQogIGNvbW1hbmRzIGFyZSBzcGVjaWZpZWQuCgogIFRoaXMgaXMgbm90IHlldCBkb2N1bWVudGVkLiBUaGVyZSBpcyBubyB0ZXN0IGNhc2UgZm9yIHRoaXMgeWV0LgoKRGFuaWVsICgyOCBGZWJydWFyeSAyMDAyKQotIFJhbHBoIE1pdGNoZWxsIG1hZGUgc29tZSBzZXJpb3VzIGVmZm9ydHMgYW5kIHB1dCBhIGxvdCBvZiBzd2VhdCBpbiBzZXR0aW5nCiAgdXAgc2NyaXB0cyBhbmQgdGhpbmdzIGZvciBtZSB0byBiZSBhYmxlIHRvIHJlcGVhdCBoaXMgcHJvYmxlbXMsIGFuZCBJCiAgZmluYWxseSBjb3VsZC4gIEkgZm91bmQgYSBwcm9ibGVtIHdpdGggdGhlIGhlYWRlciBieXRlIGNvdW50ZXIgdGhhdCB3YXNuJ3QKICBpbmNyZWFzZWQgcHJvcGVybHkgYW5kIHRodXMgd2UgY291bGQgcmV0dXJuIENVUkxFX0dPVF9OT1RISU5HIHdoZW4gd2UgaW4KICBmYWN0IGhhZCByZWNlaXZlZCBkYXRhLgoKRGFuaWVsICgyNyBGZWJydWFyeSAyMDAyKQotIEkgaGFkIHRvIHJldmVydCB0aGUgbm9uLXNwYWNlIHBhcnNpbmcgY29va2llIGZpeCBJIHBvc3RlZCB0byB0aGUgbWFpbGluZwogIGxpc3QuIEV4cGlyZSBkYXRlcyBkbyBoYXZlIHNwYWNlcyBhbmQgc3RpbGwgbmVlZCB0byBnZXQgcGFyc2VkIHByb3Blcmx5IQogIEluc3RlYWQgd2UganVzdCBpZ25vcmUgdHJhaWxpbmcgd2hpdGUgc3BhY2UgYW5kIGl0IHNlZW1zIHRvIHdvcmsuLi4KCkRhbmllbCAoMjYgRmVicnVhcnkgMjAwMikKLSBNYWRlIHRoZSBjb29raWUgcHJvcGVydHkgJ01heC1BZ2UnIHdvcmssIGp1c3Qgc2luY2Ugd2UgYWxyZWFkeSB0cmllZCB0bwogIHN1cHBvcnQgaXQsIGl0IGlzIGJldHRlciB0byBkbyBpdCByaWdodC4gTm8gb25lIHVzZXMgdGhpcyBhbnl3YXkuCgotIFRoZSBjb29raWUgcGFyc2VyIGNvdWxkIGNyYXNoIGlmIGEgcmVhbGx5IHdlaXJkIChpbGxlZ2FsKSBjb29raWUgbGluZSB3YXMKICByZWNlaXZlZC4gSSBhbHNvIG1hZGUgaXQgYmV0dGVyIGRpc2NhcmQgcmVhbGx5IG9kZGx5IGZvcm1hdHRlZCBsaW5lcyBiZXR0ZXIuCgogIE1hZGUgdGhlIGNvb2tpZSBqYXIgc3RvcmUgdGhlIHNlY29uZCBmaWVsZCBmcm9tIHRoZSBsZWZ0IHVzaW5nIHRoZSBzeW50YXgKICB0aGF0IE5ldHNjYXBlIGFuZCBNb3ppbGxhIHByb2JhYmx5IGxpa2UuIEN1cmwgaXRzZWxmIGlnbm9yZXMgaXQuCgogIEFkZGVkIHRlc3QgY2FzZSAzMSBmb3IgdGhlc2UgY2FzZXMuCgogIENsYXkgTG92ZWxlc3MnIGVtYWlsIHJlZ2FyZGluZyBzb21lIGNvb2tpZSBpc3N1ZXMgc3RhcnRlZCBteSBjbGVhbnVwLgoKLSBLZXZpbiBSb3RoIHBvaW50ZWQgb3V0IHRoYXQgbXkgYXV0b21ha2UgZmlkZGxlcyBicm9rZSB0aGUgYWJpbGl0eSB0byBidWlsZAogIG91dHNpZGUgdGhlIHNvdXJjZS10cmVlIGFuZCBJIHBvc3RlZCBhIHBhdGNoIHRvIHRoZSBtYWlsaW5nIGxpc3QgdGhhdCBicmluZ3MKICB0aGlzIGFiaWxpdHkgYmFjay4KClZlcnNpb24gNy45LjUtcHJlNAoKRGFuaWVsICgyNSBGZWJydWFyeSAyMDAyKQotIEZpZGRsZWQgd2l0aCB0aGUgYXV0b21ha2UgZmlsZXMgdG8gbWFrZSBhbGwgc291cmNlIGZpbGVzIGluIHRoZSBsaWIKICBkaXJlY3Rvcnkgbm90IGhhdmUgLi4vc3JjIGluIHRoZSBpbmNsdWRlIHBhdGgsIGFuZCB0aGUgc3JjIHNvdXJjZXMgc2hvdWxkbid0CiAgaGF2ZSAuLi9saWIhCgotIEFsbCA3OSB0ZXN0IGNhc2VzIHJhbiBPSyB1bmRlciBMaW51eCBhbmQgU29sYXJpcyB1c2luZyB0aGUgbmV3IEhUVFAgc2VydmVyCiAgaW4gdGhlIHRlc3Qgc3VpdGUuIFRoZSBuZXcgSFRUUCBzZXJ2ZXIgd2FzIGZpcnN0IGRvbmF0ZWQgYnkgR2VvcmcgSG9ybiBhbmQKICBzdWJzZXF1ZW50bHkgbW9kaWZpZWQgdG8gd29yayB3aXRoIHRoZSB0ZXN0IHN1aXRlLiBJdCBpcyBjdXJyZW50bHkgc3RpbGwgbm90CiAgcG9ydGFibGUgZW5vdWdoIHRvIHJ1biBvbiAiYWxsIG92ZXIiIGJ1dCB0aGlzIGlzIGEgc3RhcnQgYW5kIEkgY2FuIHJ1biBhbGwKICBjdXJsIHRlc3RzIG9uIG15IG1hY2hpbmVzLiBUaGlzIGlzIGFuIGltcG9ydGFudCByZXF1aXJlbWVudCBmb3IgdGhlIHVwY29taW5nCiAgcHVibGljIHJlbGVhc2UuCgotIFVzaW5nIC1kIGFuZCAtSSBvbiB0aGUgc2FtZSBjb21tYW5kIGxpbmUgbm93IHJlcG9ydHMgYW4gZXJyb3IsIGFzIGl0IGltcGxpZXMKICB0d28gZGlmZmVyZW50IEhUVFAgcmVxdWVzdHMgdGhhdCBjYW4ndCBiZSBtaXhlZC4KCi0gSmVmZnJleSBQb2hsbWV5ZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1hZGUgdGhlIC13Ly0td3JpdGUtb3V0IG9wdGlvbgogIHN1cHBvcnQgJXtjb250ZW50X3R5cGV9IHRvIGdldCB0aGUgY29udGVudCB0eXBlIG9mIHRoZSByZWNlbnQgZG93bmxvYWQuCgotIEtldmluIFJvdGggcmVwb3J0ZWQgdGhhdCBwcmUyIGFuZCBwcmUzIGRpZG4ndCBjb21waWxlIHByb3Blcmx5IG9uIGN5Z3dpbiwKICBhbmQgdGhpcyB3YXMgYmVjYXVzZSBJIHVzZWQgI2lmZGVmIEhBVkVfV0lOU09DS19IIGluIGxpYi9tdWx0aS5oIHRvIGZpZ3VyZQogIG91dCBpZiB3ZSBjb3VsZCBpbmNsdWRlIHdpbnNvY2suaCB3aGljaCB0dXJucyBvdXQgbm90IHRvIGJlIGEgd2lzZSBjaG9pY2UgdG8KICBkbyBvbiBjeWd3aW4gc2luY2UgaXQgaGFzIHRoZSBmaWxlIGJ1dCBjYW4ndCBpbmNsdWRlIGl0IQoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDAyKQotIEFkZGVkIHNyYy9jb25maWctdm1zLmggdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KCi0gRml4ZWQgdGhlIGNvbm5lY3Rpb24gdGltZW91dCB2YWx1ZSBhZ2FpbiwgdGhlIGNoYW5nZSBmcm9tIEZlYnJ1YXJ5IDE4IHdhc24ndAogIGNvbXBsZXRlLgoKVmVyc2lvbiA3LjkuNS1wcmUzCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDIpCi0gS2V2aW4gUm90aCBhbmQgQW5kculzIEdhcmPtYSBib3RoIGZvdW5kIG91dCB0aGF0IGxpYi9jb25maWcuaC5pbiB3YXMgbWlzc2luZwogIGluIHRoZSBwcmUtcmVsZWFzZSBhcmNoaXZlIGFuZCB0aHVzIHRoZSBjb25maWd1cmUgc2NyaXB0IGZhaWxlZC4KClZlcnNpb24gNy45LjUtcHJlMgoKRGFuaWVsICgyMCBGZWJydWFyeSAyMDAyKQotIEFuZHLpcyBHYXJj7WEgcHJvdmlkZWQgYSBzb2x1dGlvbiB0byBidWcgcmVwb3J0ICM1MTUyMjguIHRoZSB0b3RhbCB0aW1lCiAgY291bnRlciB3YXMgbm90IHNldCBjb3JyZWN0bHkgd2hlbiAtSSB3YXMgdXNlZCBkdXJpbmcgc29tZSBjb25kaXRpb25zIChhbGwKICBoZWFkZXJzIHdlcmUgcmVhZCBpbiBvbmUgc2luZ2xlIHJlYWQpLgoKLSBOaWNvIEJhZ2d1cyBwcm92aWRlZCBhIGh1Z2UgcGF0Y2ggd2l0aCBtaW5vciB0d2Vha3MgYWxsIG92ZXIgdG8gbWFrZSBjdXJsCiAgY29tcGlsZSBuaWNlbHkgb24gVk1TLgoKRGFuaWVsICgxOSBGZWJydWFyeSAyMDAyKQotIFJpY2sgUmljaGFyZHNvbiBmb3VuZCBvdXQgdGhhdCBieSByZXBsYWNpbmcgUEZfVU5TUEVDIHdpdGggUEZfSU5FVCBpbiB0aGUKICBnZXRhZGRyaW5mbygpIGNhbGxzLCBoZSBjb3VsZCBzcGVlZCB1cCBzb21lIG5hbWUgcmVzb2x2aW5nIGNhbGxzIHdpdGggYW4KICBvcmRlciBvZiBtYWduaXR1ZGVzIG9uIGhpcyBSZWRoYXQgTGludXggNy4yLgoKLSBQaGlsaXAgR2xhZHN0b25lIGZvdW5kIGEgc2Vjb25kIElOQUREUl9OT05FIHByb2JsZW0gd2hlcmUgd2UgdXNlZCBsb25nCiAgaW50ZWFkIG9mIGluX2FkZHJfdCB3aGljaCBjYXVzZWQgNjRiaXQgcHJvYmxlbW9zLiBXZSByZWFsbHkgc2hvdWxkbid0IGRlZmluZQogIHRoYXQgb24gdHdvIGRpZmZlcmVudCBwbGFjZXMuCgpEYW5pZWwgKDE4IEZlYnJ1YXJ5IDIwMDIpCi0gUGhpbGlwIEdsYWRzdG9uZSBmb3VuZCBhIHByb2JsZW0gaW4gaG93IEhUVFAgcmVxdWVzdHMgd2VyZSBzZW50IGlmIHRoZQogIHJlcXVlc3QgY291bGRuJ3QgYmUgc2VudCBhbGwgYXQgb25jZS4KCi0gRW1pbCBmb3VuZCBhbmQgY29ycmVjdGVkIGEgYmFkIGNvbm5lY3Rpb24gdGltZW91dCBjb21wYXJpc29uIHRoYXQgbWFkZSBjdXJsCiAgdXNlIHRoZSBsb25nZXN0IG9mIGNvbm5lY3QtdGltZW91dCBhbmQgdGltb3V0IGFzIGEgdGltZW91dCB2YWx1ZSwgaW5zdGVhZCBvZgogIHRoZSBzaG9ydGVzdCBhcyBpdCB3YXMgc3VwcG9zZWQgdG8hCgotIEFyb24gUm9iZXJ0cyBwcm92aWRlZCB1cGRhdGVkIGluZm9ybWF0aW9uIGFib3V0IExEQVAgVVJMIHN5bnRheCB0byBnbyBpbnRvCiAgdGhlIG1hbnVhbCBhcyBhIHJlcGxhY2VtZW50IGZvciB0aGUgb2xkIHJlZmVyZW5jZXMuCgpEYW5pZWwgKDE3IEZlYnJ1YXJ5IDIwMDIpCi0gUGhpbGlwIEdsYWRzdG9uZSBwb2ludGVkIG91dCB0d28gbWlzc2luZyBpbmNsdWRlIGZpbGVzIHRoYXQgbWFkZSBjdXJsIGNvcmUKICBkdW1wIG9uIDY0Yml0IGFyY2hpdGVjdHVyZXMuIFdlIG5lZWQgdG8gcGF5IG1vcmUgYXR0ZW50aW9uIG9uIHRoZXNlIGRldGFpbHMuCiAgSXQgaXMgKmxldGhhbCogdG8gZm9yIGV4YW1wbGUgZm9yZ2V0IHRoZSBtYWxsb2MoKSBwcm90b3R5cGUsIGFzICdpbnQnIGlzCiAgMzJiaXQgYW5kIG1hbGxvYygpIG11c3QgcmV0dXJuIGEgNjRiaXQgcG9pbnRlciBvbiB0aGVzZSBwbGF0Zm9ybXMuCgotIEdpYXNsYXMgR2Vvcmdpb3MgZml4ZWQgYSBwcm9ibGVtIHdpdGggSG9zdDogaGVhZGVycyBvbiByZXBlYXRlZCByZXF1ZXN0cyBvbgogIHRoZSBzYW1lIGhhbmRsZSB1c2luZyBhIHByb3h5LgoKRGFuaWVsICg4IEZlYnJ1YXJ5IDIwMDIpCi0gSGFubm8gTC4gS3Jhbnpob2ZmIGFjY3VyYXRlbHkgZm91bmQgb3V0IHRoYXQgZGlzYWJsaW5nIHRoZSBFeHBlY3Q6IGhlYWRlcgogIHdoZW4gZG9pbmcgbXVsdGlwYXJ0IGZvcm1wb3N0cyBkaWRuJ3Qgd29yayB2ZXJ5IHdlbGwuIEl0IGRpc2FibGVkIG90aGVyCiAgcGFydHMgb2YgdGhlIHJlcXVlc3QgaGVhZGVyIHRvbywgcmVzdWx0aW5nIGluIGEgYnJva2VuIGhlYWRlci4gV2hlbiBJIGZpeGVkCiAgdGhpcywgSSBhbHNvIG5vdGljZWQgdGhhdCB0aGUgQ29udGVudC1UeXBlIHdhc24ndCBwb3NzaWJsZSB0byBkaXNhYmxlLiBJdCBpcwogIG5vdywgZXZlbiB0aG91Z2ggaXQgcHJvYmFibHkgaXMgcmVhbGx5IHN0dXBpZCB0byB0cnkgdG8gZG8gdGhpcyAoYmVjYXVzZSBvZgogIHRoZSBib3VuZGFyeSBzdHJpbmcgdGhhdCBpcyBpbmNsdWRlZCBpbiB0aGUgaW50ZXJuYWxseSBnZW5lcmF0ZWQgaGVhZGVyLAogIHVzZWQgYXMgZm9ybSBwYXJ0IHNlcGFyYXRvci4pCgpEYW5pZWwgKDcgRmVicnVhcnkgMjAwMikKLSBJIG1vdmVkIHRoZSBjb25maWcqLmggZmlsZXMgZnJvbSB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gdGhlIGxpYi8gZGlyZWN0b3J5LgoKLSBJJ3ZlIGFkZGVkIHRoZSBuZXcgdGVzdCBzdWl0ZSBIVFRQIHNlcnZlciB0byB0aGUgQ1ZTIHJlcG9zaXRvcnksIEl0IHNlZW1zIHRvCiAgd29yayBwcmV0dHkgZ29vZCBub3csIGJ1dCB3ZSBtdXN0IG1ha2UgaXQgZ2V0IHVzZWQgYnkgdGhlIHRlc3Qgc2NyaXB0cwogIHByb3Blcmx5IGFuZCB0aGVuIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaXQgY29tcGlsZXMsIGJ1aWxkcyBhbmQgcnVucyBvbgogIG1vc3Qgb3BlcmF0aW5nIHN5c3RlbXMuCgpWZXJzaW9uIDcuOS41LXByZTEKCkRhbmllbCAoNiBGZWJydWFyeSAyMDAyKQotIE1pa2xvcyBOZW1ldGggcHJvdmlkZWQgdXBkYXRlZCB3aW5kb3dzIG1ha2VmaWxlcyBhbmQgSU5TVEFMTCBkb2NzLgoKLSBNciBMYXJyeSBGYWhub2UgZm91bmQgYSBwcm9ibGVtIHdpdGggZm9ybXBvc3RzIGFuZCBJIG1hbmFnZWQgdG8gdHJhY2sgZG93bgogIGFuZCBwYXRjaCB0aGlzIGJ1Zy4gVGhpcyB3YXMgYWN0dWFsbHkgdHdvIGJ1Z3MsIGFzIHRoZSBwb3N0ZWQgc2l6ZSB3YXMgYWxzbwogIHNhaWQgdG8gYmUgdHdvIGJ5dGVzIHRvbyBsYXJnZS4KCi0gQnJlbnQgQmVhcmRzbGV5IGZvdW5kIG91dCBhbmQgYnJvdWdodCBhIGNvcnJlY3Rpb24gZm9yIHRoZQogIENVUkxJTkZPX0NPTlRFTlRfVFlQRSBwYXJzZXIgdGhhdCB3YXMgb2ZmIG9uZSBieXRlLiBUaGlzIHdhcyBteSBmYXVsdCwgSQogIGFjY2lkZW50YWx5IGJyb2tlIEdpYXNsYXMgR2Vvcmdpb3MnIHBhdGNoLgoKRGFuaWVsICg1IEZlYnJ1YXJ5IDIwMDIpCi0gS2V2aW4gUm90aCBmb3VuZCB5ZXQgYW5vdGhlciBTU0wgZG93bmxvYWQgcHJvYmxlbS4KClZlcnNpb24gNy45LjQKCi0gbm8gY2hhbmdlcyBzaW5jZSBwcmUtcmVsZWFzZQoKVmVyc2lvbiA3LjkuNC1wcmUyCgpEYW5pZWwgKDMgRmVicnVhcnkgMjAwMikKLSBFcmljIE1lbHZpbGxlIHByb3ZpZGVkIGEgZmV3IHNwZWxsaW5nIGNvcnJlY3Rpb25zIGluIHRoZSBjdXJsIG1hbiBwYWdlLgoKRGFuaWVsICgxIEZlYnJ1YXJ5IDIwMDIpCi0gQW5kcmVhcyBEYW1tIGNvcnJlY3RlZCB0aGUgdW5jb25kaXRpb25hbCB1c2Ugb2YgZ210aW1lKCkgaW4gZ2V0ZGF0ZSwgaXQgbm93CiAgdXNlcyBnbXRpbWVfcigpIG9uIGFsbCBob3N0cyB0aGF0IGhhdmUgaXQuCgpEYW5pZWwgKDMxIEphbnVhcnkgMjAwMikKLSBBbiBhbm9ueW1vdXMgYnVnIHJlcG9ydCBpZGVudGlmaWVkIGEgcHJvYmxlbSBpbiB0aGUgRE5TIGNhY2hpbmcgd2hpY2ggbWFkZSBpdAogIHNvbWV0aW1lcyBhbGxvY2F0ZSBvbmUgYnl0ZSB0b28gbGl0dGxlIHRvIHN0b3JlIHRoZSBjYWNoZSBlbnRyeSBpbi4gVGhpcwogIGhhcHBlbmVkIHdoZW4gdGhlIHBvcnQgbnVtYmVyIHN0YXJ0ZWQgd2l0aCAxIQoKLSBBbGJlcnQgQ2hpbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgaW1wcm92ZXMgdGhlIGdldGhvc3RieW5hbWVfcigpIGNvbmZpZ3VyZQogIGNoZWNrIG9uIEhQLVVYIDExLjAwLgoKVmVyc2lvbiA3LjkuNC1wcmUxCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwMikKLSBHZW9yZyBIb3JuIGZvdW5kIGFub3RoZXIgd2F5IHRoZSBTU0wgcmVhZGluZyBmYWlsZWQgZHVlIHRvIHRoZSBub24tYmxvY2tpbmcKICBzdGF0ZSBvZiB0aGUgc29ja2V0cyEgSSBmaXhlZC4KCkRhbmllbCAoMjkgSmFudWFyeSAyMDAyKQotIE11bHRpcGFydCBmb3JtcG9zdHMgbm93IHNlbmQgdGhlIGZ1bGwgcmVxdWVzdCBwcm9wZXJseSwgaW5jbHVkaW5nIHRoZSBDUkxGLgogIFRoZXkgd2VyZSBwcmV2aW91c2x5IHRyZWF0ZWQgYXMgcGFydCBvZiB0aGUgcG9zdCBkYXRhLgoKLSBUaGUgdXBsb2FkIGJ5dGUgY291bnRlciBidWdnZWQuCgotIFQuIEJoYXJhdGggcG9pbnRlZCBvdXQgdGhhdCB3ZSBzZWVkIFNTTCBvbiBldmVyeSBjb25uZWN0LCB3aGljaCBpcyBhIHRpbWUtCiAgY29uc3VtaW5nIG9wZXJhdGlvbiB0aGF0IHNob3VsZCBvbmx5IGJlIG5lZWRlZCB0byBkbyBvbmNlLiBXZSBwYXRjaGVkCiAgbGliY3VybCB0byBub3cgb25seSBzZWVkIG9uIHRoZSBmaXJzdCBjb25uZWN0IHdoZW4gdW5zZWVkZWQuIFRoZSBzZWVkZWQKICBzdGF0dXMgaXMgZ2xvYmFsIHNvIGl0J2xsIG5vdyBvbmx5IGhhcHBlbiBvbmNlIGR1cmluZyBhIHByb2dyYW0ncyBsaWZlIHRpbWUuCgogIElmIHRoZSByYW5kb21fZmlsZSBvciBlZ2Rzb2NrZXQgaXMgc2V0LCB0aGUgc2VlZCB3aWxsIGJlIHJlLW1hZGUgdGhvdWdoLgoKLSBHaWFzbGFzIEdlb3JnaW9zIGludHJvZHVjZWQgQ1VSTElORk9fQ09OVEVOVF9UWVBFIHRoYXQgbGV0cwogIGN1cmxfZWFzeV9nZXRpbmZvKCkgcmVhZCB0aGUgY29udGVudC10eXBlIGZyb20gdGhlIHByZXZpb3VzIHJlcXVlc3QuCgpEYW5pZWwgKDI4IEphbnVhcnkgMjAwMikKLSBLamV0aWwgSmFjb2JzZW4gZm91bmQgYSB3YXkgdG8gY3Jhc2ggY3VybCBhbmQgYWZ0ZXIgbXVjaCBkZWJ1Z2dpbmcsIGl0CiAgdHVybmVkIG91dCBpdCB3YXMgYSBJUHY0LWxpbnV4IG9ubHkgcHJvYmxlbSBpbnRyb2R1Y2VkIGluIDcuOS4zIHJlbGF0ZWQgdG8KICBuYW1lIHJlc29sdmluZy4KCi0gQW5kcmVhcyBEYW1tIHBvc3RlZCBhIGh1Z2UgcGF0Y2ggdGhhdCBtYWRlIHRoZSBjdXJsX2dldGRhdGUoKSBmdW5jdGlvbiBmdWxseQogIHJlZW50cmFudCEKCi0gU3RldmUgTWFyeCBwb2ludGVkIG91dCB0aGF0IHlvdSBjb3VsZG4ndCBtaXggQ1VSTE9QVF9DVVNUT01SRVFVRVNUIHdpdGgKICBDVVJMT1BUX1BPU1RGSUVMRFMuIFlvdSBjYW4gbm93IQoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDIpCi0gS3Jpc2huZW5kdSBNYWp1bWRhciBwb2ludGVkIG91dCB0aGF0IHRoZSBoZWFkZXIgbGVuZ3RoIGNvdW50ZXIgd2FzIG5vdCByZXNldAogIGJldHdlZW4gbXVsdGlwbGUgcmVxdWVzdHMgb24gdGhlIHNhbWUgaGFuZGxlLgoKLSBQZWRybyBOZXZlcyByaWdodGZ1bGx5IHF1ZXN0aW9uZWQgd2h5IGN1cmwgYWx3YXlzIGFwcGVuZCBcclxuIHRvIHRoZSBkYXRhCiAgdGhhdCBpcyBzZW50IGluIEhUVFAgUE9TVCByZXF1ZXN0cy4gVW5mb3J0dW5hdGVseSwgdGhpcyBicm9rZSB0aGUgdGVzdCBzdWl0ZQogIGFzIHRoZSB0ZXN0IEhUVFAgc2VydmVyIGlzIGxhbWUgZW5vdWdoIG5vdCB0byBkZWFsIHdpdGggdGhpcy4uLiA6LU8KCi0gRm9sbG93aW5nIExvY2F0aW9uOiBoZWFkZXJzIHdoZW4gdGhlIGNvbm5lY3Rpb24gZGlkbid0IGNsb3NlIGRpZG4ndCB3b3JrIGFzCiAgbGliY3VybCBkaWRuJ3QgcHJvcGVybHkgc3RvcCByZWFkaW5nLiBUaGlzIHByb2JsZW0gd2FzIGFkZGVkIGluIDcuOS4zIGR1ZSB0bwogIHRoZSByZXN0cnVjdHVyZWQgaW50ZXJuYWxzLiAnRnJhbmsnIHBvc3RlZCBhIGJ1ZyByZXBvcnQgYWJvdXQgdGhpcy4KCkRhbmllbCAoMjQgSmFudWFyeSAyMDAyKQotIEtldmluIFJvdGggdmVyeSBxdWlja2x5IHNwb3R0ZWQgdGhhdCB3ZSB3cm9uZ2x5IGluc3RhbGxlZCB0aGUgZXhhbXBsZQogIHByb2dyYW1zIHRoYXQgd2VyZSBidWlsdCBpbiB0aGUgbXVsdGkgZGlyZWN0b3J5LCB3aGVuICdtYWtlIGluc3RhbGwnIHdhcwogIHVzZWQuIDotLwoKVmVyc2lvbiA3LjkuMwoKRGFuaWVsICgyMyBKYW51YXJ5IDIwMDIpCi0gQW5kculzIEdhcmPtYSBmb3VuZCBhIHBlcnNpc3RhbmN5IHByb2JsZW0gd2hlbiBkb2luZyBIVFRQIEhFQUQsIHRoYXQgbWFkZQogIGN1cmwgImhhbmciIHVudGlsIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgYnkgdGhlIHNlcnZlci4gVGhpcyBwcm9ibGVtIGhhcwogIGJlZW4gaW50cm9kdWNlZCBpbiA3LjkuMyBkdWUgdG8gaW50ZXJuYWwgcmV3cml0ZXMsIHRoaXMgd2FzIG5vdCBwcmVzZW50IGluCiAgNy45LjIuCgpWZXJzaW9uIDcuOS4zLXByZTQKCkRhbmllbCAoMTkgSmFudWFyeSAyMDAyKQotIEFudG9uaW8gZmlsZWQgYnVnIHJlcG9ydCAjNTA1NTE0IGFuZCBwcm92aWRlZCBhIGZpeCEgV2hlbiBkb2luZyBtdWx0aXBhcnQKICBmb3JtcG9zdHMsIGxpYmN1cmwgd291bGQgaW5jbHVkZSBhbiBlcnJvciB0ZXh0IGluIHRoZSBhY3R1YWwgcG9zdCBpZiBhCiAgc3BlY2lmaWVkIGZpbGUgd2Fzbid0IGZvdW5kLiBUaGlzIGlzIG5vdCBsaWJjdXJsJ3Mgam9iLiBJbnN0ZWFkIHdlIGFkZCBhbgogIGVtcHR5IHBhcnQuCgpEYW5pZWwgKDE4IEphbnVhcnkgMjAwMikKLSBQbGF5ZWQgYXJvdW5kIHdpdGggc3RyaWN0ZXIgY29tcGlsZXIgd2FybmluZ3MgZm9yIGdjYyAod2hlbiAuL2NvbmZpZ3VyZQogIC0tZW5hYmxlLWRlYnVnIGlzIHVzZWQpIGFuZCBjaGFuZ2VkIHNvbWUgbWlub3IgdGhpbmdzIHRvIHN0b3AgdGhlIHdhcm5pbmdzLgoKLSBDb21tZW50ZWQgb3V0IHRoZSAnbG9uZyBsb25nJyBhbmQgJ2xvbmcgZG91YmxlJyBjaGVja3MgaW4gY29uZmlndXJlLmluLCBhcwogIHdlIGRvbid0IGN1cnJlbnRseSB1c2UgdGhlbSBhbnl3YXkgYW5kIHRoZSBjb2RlIGluIGxpYi9tcHJpbnRmLmMgdGhhdCB1c2UKICB0aGVtIGNhdXNlcyB3YXJuaW5ncy4KCi0gU2F1bCBHb29kIGFuZCBqb25hdGFuIHBvaW50ZWQgb3V0IE1hYyBPUyBYIGJ1aWxkIHByb2JsZW1zIHdpdGggcHJlMyBhbmQgaG93CiAgdG8gY29ycmVjdCB0aGVtLiBUd28gY29tcGlsZXIgd2FybmluZ3Mgd2VyZSByZW1vdmVkIGFzIHdlbGwuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgdHdvIG1pbm9yIG1pbmd3MzIgYnVpbGRpbmcgcHJvYmxlbXMuCgpWZXJzaW9uIDcuOS4zLXByZTMKCkRhbmllbCAoMTcgSmFudWFyeSAyMDAyKQotIGRvY3MvbGliY3VybC10aGUtZ3VpZGUgaXMgYSBuZXcgdHV0b3JpYWwgZm9yIG91ciBsaWJjdXJsIHByb2dyYW1taW5nCiAgZnJpZW5kcy4KCi0gUmljaGFyZCBBcmNoZXIgYnJvdWdodCBiYWNrIHRoZSBhYmlsaXR5IHRvIGNvbXBpbGUgYW5kIGJ1aWxkIHdpdGggT3BlblNTTAogIHZlcnNpb25zIGJlZm9yZSAwLjkuNS4KICBbaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9jdXJsL2J1Z3MvMTQ5L10KCi0gVGhlIEROUyBjYWNoZSBjb2RlIGRpZG4ndCB0YWtlIHRoZSBwb3J0IG51bWJlciBpbnRvIGFjY291bnQsIHdoaWNoIG1hZGUgaXQKICB3b3JrIHJhdGhlciBiYWQgb24gSVB2Ni1lbmFibGVkIGhvc3RzIChlc3BlY2lhbGx5IHdoZW4gZG9pbmcgcGFzc2l2ZQogIEZUUCkuIFN0ZXJsaW5nIGZpeGVkIGl0LgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDIpCi0gR2VvcmcgSG9ybiBjb3VsZCBtYWtlIGEgdHJhbnNmZXIgdGltZS1vdXQgd2l0aG91dCBlcnJvciB0ZXh0LiBJIGZvdW5kIGl0IGFuZAogIGNvcnJlY3RlZCBpdC4KCi0gU1NMIHdyaXRlcyBkaWRuJ3Qgd29yaywgdGhleSByZXR1cm4gYW4gdW5pbml0aWFsaXplZCB2YWx1ZSB0aGF0IGNhdXNlZAogIGhhdm9jIGFsbCBvdmVyLiBHZW9yZyBIb3JuIGV4cGVyaWVuY2VkIHRoaXMuCgotIEtldmluIFJvdGggcGF0Y2hlZCB0aGUgY3VybF92ZXJzaW9uKCkgZnVuY3Rpb24gdG8gdXNlIHRoZSBwcm9wZXIgT3BlblNTTAogIGZ1bmN0aW9uIGZvciB2ZXJzaW9uIGluZm9ybWF0aW9uLiBUaGlzIHdheSwgY3VybCB3aWxsIHJlcG9ydCB0aGUgdmVyc2lvbiBvZgogIHRoZSBTU0wgbGlicmFyeSBhY3R1YWxseSBydW5uaW5nIHJpZ2h0IG5vdywgbm90IHRoZSBvbmUgdGhhdCBoYWQgaXRzIGhlYWRlcnMKICBpbnN0YWxsZWQgd2hlbiBsaWJjdXJsIHdhcyBidWlsdC4gTWFpbmx5IGludGVyc3Rpbmcgd2hlbiBydW5uaW5nIHdpdGggc2hhcmVkCiAgT3BlblNTTCBsaWJyYXJpZXMuCgpWZXJzaW9uIDcuOS4zLXByZTIKCkRhbmllbCAoMTYgSmFudWFyeSAyMDAyKQotIE1vZmllZCB0aGUgbWFpbiB0cmFuc2ZlciBsb29wIGFuZCByZWxhdGVkIHN0dWZmIHRvIGRlYWwgd2l0aCBub24tYmxvY2tpbmcKICBzb2NrZXRzIGluIHRoZSB1cGxvYWQgc2VjdGlvbi4gV2hpbGUgZG9pbmcgdGhpcywgSSd2ZSBub3cgc2VwYXJhdGVkIHRoZQogIGNvbm5lY3Rpb24gb3JpZW50ZWQgYnVmZmVycyB0byBoYXZlIG9uZSBmb3IgZG93bmxvYWRzIGFuZCBvbmUgZm9yIHVwbG9hZHMKICAoYXMgdHdvIGNhbiBoYXBwZW4gc2ltdWx0YW5lb3VzbHkpLiBJIGFsc28gc2hydW5rIHRoZSBidWZmZXJzIHRvIDIwSwogIGVhY2guIEFzIHdlIGhhdmUgYSBzY3JhdGNoIGJ1ZmZlciB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgdXBsb2FkIGJ1ZmZlciwgd2UKICBhcnJpdmVkIGF0IDgwSyBmb3IgYnVmZmVycyBjb21wYXJlZCB3aXRoIHRoZSBwcmV2aW91cyAxNTBLLgoKLSBBZGRlZCB0aGUgLS1jYyBvcHRpb24gdG8gY3VybC1jb25maWcgY29tbWFuZCBhcyBpdCBlbmFibGVzIHNvIHZlcnkgY29vbAogIG9uZS1saW5lcnMuIEhhdmUgYSBnbyBhIHRoaXMgb25lLCBidWlsZGluZyB0aGUgc2ltcGxlLmMgZXhhbXBsZToKCiAgICAgICAgJCBgY3VybC1jb25maWcgLS1jYyAtLWNmbGFncyAtLWxpYnNgIC1vIGV4YW1wbGUgc2ltcGxlLmMKCkRhbmllbCAoMTQgSmFudWFyeSAyMDAyKQotIEkgbWFkZSBhbGwgc29ja2V0IHJlYWRzIChyZWN2KSBoYW5kbGUgRVdPVUxEQkxPQ0suIEkgaG9wZSBuaWNlbHkuIE5vdyB3ZQogIG9ubHkgbmVlZCB0byBhZGRyZXNzIGFsbCB3cml0ZXMgKHNlbmQpIHRvbyBhbmQgdGhlbiBJJ20gcmVhZHkgZm9yIGFub3RoZXIKICBwcmUtcmVsZWFzZS4uLgoKLSBTdG9uZWQgRWxpcG90IHBhdGNoZWQgdGhlIGluX2FkZHJfdCBjb25maWd1cmUgdGVzdCB0byBtYWtlIGl0IHdvcmsgYmV0dGVyIG9uCiAgbW9yZSBwbGF0Zm9ybXMuCgpEYW5pZWwgKDkgSmFudWFyeSAyMDAyKQotIENyaXMgQmFpbGlmZiBmb3VuZCBvdXQgdGhhdCBmaWxsaW5nIHVwIGN1cmwncyBTU0wgc2Vzc2lvbiBjYWNoZSBjYXVzZWQgYQogIGNyYXNoIQoKLSBQb3N0ZWQgdGhlIGN1cmwgcXVlc3Rpb25uYWlyZSBvbiB0aGUgd2ViIHNpdGUuIElmIHlvdSBoYXZlbid0IHBvc3RlZCB5b3VyCiAgb3BpbmlvbnMgdGhlcmUgeWV0LCBnbyB0aGVyZSBhbmQgZG8gaXQgbm93IHdoaWxlIGl0IGlzIHN0aWxsIHRoZXJlOgoKICAgICAgICBodHRwczovL2N1cmwuaGF4eC5zZS9xLwoKLSBHZW9yZyBIb3JuIHF1aWNrbHkgZm91bmQgb3V0IHRoYXQgdGhlIFNTTCByZWFkaW5nIG5vIGxvbmdlciB3b3JrZWQgYXMKICBzdXBwb3NlZCBzaW5jZSB0aGUgc3dpdGNoIHRvIG5vbi1ibG9ja2luZyBzb2NrZXRzLiBJJ3ZlIG1hZGUgYSBxdWljayBwYXRjaAogIChmb3IgcmVhZGluZyBvbmx5KSBidXQgd2Ugc2hvdWxkIGltcHJvdmUgaXQgZXZlbiBmdXJ0aGVyLgoKVmVyc2lvbiA3LjkuMy1wcmUxCgpEYW5pZWwgKDcgSmFudWFyeSAyMDAyKQotIEkgbWFkZSB0aGUgJ2Jvb2wnIHR5cGVkZWYgdXNlIGFuICJ1bnNpZ25lZCBjaGFyIi4gSXQgbWFrZXMgaXQgdGhlIHNhbWUgb24KICBhbGwgcGxhdGZvcm1zLCBubyBtYXR0ZXIgd2hhdCB0aGUgcGxhdGZvcm0gdGhpbmtzIHRoZSBkZWZhdWx0IGZvcm1hdCBmb3IKICBjaGFyIGlzLiBUaGlzIHdhcyBub3RpY2VkIHNpbmNlIHdlIG1hZGUgYSBzaWxseSBjb21wYXJpc29uIGludm9sdmluZyBzdWNoIGEKICBib29sIHZhcmlhYmxlLCBhbmQgb25seSBvbmUgY29tcGlsZXIvcGxhdGZvcm0gY29tYmluYXRpb24gKG9uIERlYmlhbiBMaW51eCkKICBjb21wbGFpbmVkIGFib3V0IGl0ICh0aGF0IGhhcHBlbmVkIHRvIGhhdmUgaXRzIGNoYXIgdW5zaWduZWQgYnkgZGVmYXVsdCkuCgotIEJ1ZyByZXBvcnQgIzQ5NTI5MCBpZGVudGlmaWVkIGEgY29va2llIHBhcnNpbmcgcHJvYmxlbSB0aGF0IHdhcyBjb3JyZWN0ZWQuCiAgV2hlbiBhIFNldC1Db29raWU6IGxpbmUgaXMgcmVjZWl2ZWQgd2l0aG91dCBhIHRyYWlsaW5nIHNlbWljb2xvbiwgbGliY3VybAogIGRpZG4ndCByZWFkIHRoZSBsYXN0ICJuYW1lPXZhbHVlIiBwYWlyIG9mIHRoZSBsaW5lLCBsZWFkaW5nIHRvIGNvbmZ1c2lvbnMuLi4KCi0gU3RlcmxpbmcgY29tbWl0dGVkIGhpcyB1cGRhdGVkIEROUyBjYWNoZSBjb2RlLgoKLSBJIHdvcmtlZCB3aXRoIEdlb3JnIEhvcm4gYW5kIGNvbW1lbnRzIGZyb20gR/Z0eiBCYWJpbi1FYmVsbCBhbmQgc3dpdGNoZWQKICBjdXJsJ3Mgc29ja2V0IG9wZXJhdGlvbnMgY29tcGxldGVseSBvdmVyIHRvIG5vbi1ibG9ja2luZyBmb3IgdGhlIGVudGlyZQogIG9wZXJhdGlvbiAocHJldmlvdXNseSB3ZSB1c2VkIG5vbi1ibG9ja2luZyBvbmx5IGZvciB0aGUgY29ubmVjdGlvbiBwaGFzZSkuCiAgV2UgaGFkIHRvIGRvIHRoaXMgdG8gbWFrZSB0aGUgU1NMIGNvbm5lY3Rpb24gcGhhc2UgdGltZW91dCBwcm9wZXJseSB3aXRob3V0CiAgdGhlIHVzZSBvZiBzaWduYWxzLiBBIGxpdHRsZSBleHRyYSBjb2RlIHRvIGRlYWwgd2l0aCB0aGlzIHdhcyBhZGRlZC4KCi0gVC4gQmhhcmF0aCBwb2ludGVkIG91dCBhIHNsaWdodGx5IG9ic2N1cmUgY29va2llIGVuZ2luZSBmbGF3LgoKLSBQZXRlIFN1IHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCBkaWRuJ3QgdHJlYXQgSFRUUCBjb2RlIDIwNCBhcyBpdCBzaG91bGQuCiAgMjA0LXJlcGxpZXMgbmV2ZXIgcHJvdmlkZXMgYSByZXNwb25zZS1ib2R5LiBUaGlzIHJlc3VsdGVkIGluIGJhZCBwZXJzaXN0YW50CiAgYmVoYXZpb3Igd2hlbiAyMDQgd2FzIHJlY2VpdmVkLgoKRGFuaWVsICg1IEphbnVhcnkgMjAwMikKLSBTTSB1cGRhdGVkIHRoZSBWQysrIGxpYnJhcnkgTWFrZWZpbGVzIGZvciB0aGUgbmV3IHNvdXJjZSBmaWxlcy4KCkRhbmllbCAoNCBKYW51YXJ5IDIwMDIpCi0gSSBkaXNjb3ZlcmVkIHRoYXQgd2Ugd3JvbmdseSB1c2VkIGluZXRfbnRvYSgpIChpbnN0ZWFkIG9mIGluZXRfbnRvYV9yKCkgaW4KICB0d28gcGxhY2VzIGluIHRoZSBzb3VyY2UgY29kZSkuIE9uZSBoYXBwZW5lZCB3aXRoIFZFUkJPU0Ugc2V0IG9uIGNvbm5lY3RzLAogIGFuZCB0aGUgb3RoZXIgd2hlbiBWRVJCT1NFIHdhcyBvbiBhbmQga3JiNCBvdmVyIG5hdCB3YXMgdXNlZC4uLiBJIGhvbmVzdGx5CiAgZG9uJ3QgdGhpbmsgYW55b25lIGhhcyBzdWZmZXJlZCBmcm9tIHRoZXNlIG1pc3Rha2VzLgoKLSBJIHJlcGxhY2VkIGEgbG90IG9mIHNpbGx5IG9jY3VyYW5jZXMgb2YgcHJpbnRmKCkgdG8gaW5zdGVhZCB1c2UgdGhlIG1vcmUKICBhcHByb3ByaWF0ZSBDdXJsX2luZm9mKCkgb3IgQ3VybF9mYWlsZigpLiBUaGUga3JiNCBhbmQgdGVsbmV0IGNvZGUgd2VyZQogIGFmZmVjdGVkLgoKLSBQaGlsaXAgR2xhZHN0b25lIGZvdW5kIGEgZmV3IG1vcmUgcHJvYmxlbXMgd2l0aCA2NC1iaXQgYXJjaHMgKHRoZSA2NC1iaXQKICBzcGFyYyBvbiBzb2xhcmlzIDgpLgoKLSBBZnRlciBkaXNjdXNzaW9ucyBvbiB0aGUgbGliY3VybCBsaXN0IHdpdGggUmFvdWwgQ3JpZGxpZywgSSBqdXN0IG1hZGUgRlRQCiAgcmVzcG9uc2UgbGluZXMgZ2V0IHBhc3NlZCB0byB0aGUgaGVhZGVyIGNhbGxiYWNrIGlmIHN1Y2ggYSBvbmUgaXMKICByZWdpc3RlcmVkLiBJdCdsbCBtYWtlIGl0IHBvc3NpYmxlIGZvciBhbnkgYXBwbGljYXRpb24gdG8gZ2V0IGFsbCB0aGUKICByZXNwb25zZXMgYW4gRlRQIHNlcnZlciBzZW5kcyB0byBsaWJjdXJsLgoKRGFuaWVsICgzIEphbnVhcnkgMjAwMikKLSBTdGVybGluZyBIdWdoZXMgYnJvdWdodCBhIGZldyBidWNrZXRzIG9mIGNvZGUuIE5vdywgbGliY3VybCB3aWxsCiAgYXV0b21hdGljYWxseSBjYWNoZSBETlMgbG9va3VwcyBhbmQgcmUtdXNlIHRoZSBwcmV2aW91cyByZXN1bHRzIGZpcnN0IGlmIGFueQogIHN1Y2ggaXMgYXZhaWxhYmxlLiBJdCBncmVhdGx5IGltcHJvdmVzIHNwZWVkIHdoZW4gZG9pbmcgbWFueSByZXBlYXRlZAogIG9wZXJhdGlvbnMgdG8gdGhlIHNhbWUgaG9zdC4KCi0gQXMgdGhlIHRlc3QgY2FzZSB1c2VzIC0taW5jbHVkZSBhbmQgdGhlbiAtLWhlYWQsIEkgaGFkIHRvIG1vZGlmeSBzcmMvbWFpbi5jCiAgdG8gZGVhbCB3aXRoIHRoaXMgc2l0dWF0aW9uIHNsaWdodGx5IGJldHRlciB0aGFuIHByZXZpb3VzbHkuIFdoZW4gZG9uZSwgd2UKICBoYXZlIDEwMCUgZ29vZCB0ZXN0cyBhZ2FpbiBpbiB0aGUgbWFpbiBicmFuY2guCgpEYW5pZWwgKDIgSmFudWFyeSAyMDAyKQotIE1hZGUgdGVzdCBjYXNlIDI1IHJ1biBhZ2FpbiBpbiB0aGUgbXVsdGktZGV2IGJyYW5jaC4gQnV0IGl0IHNlZW1zIHRoYXQgdGhlCiAgY2hhbmdlcyBkb25lIG9uIGRlYy0yMCBtYWRlIHRlc3QgY2FzZSAxMDQgY2Vhc2UgdG8gd29yayAoaW4gYm90aCBicmFuY2hlcykuCgotIFBoaWxpcCBHbGFkc3RvbmUgcG9pbnRlZCBvdXQgYSBmZXcgcG9ydGFiaWxpdHkgcHJvYmxlbXMgaW4gdGhlIHNvdXJjZSBjb2RlCiAgdGhhdCBkaWRuJ3QgY29tcGlsZSBvbiA2NC1iaXQgc3BhcmNzIHVzaW5nIFN1bidzIG5hdGl2ZSBjb21waWxlci4KRGFuaWVsICgyMCBEZWNlbWJlciAyMDAxKQotIEJq9nJuIFN0ZW5iZXJnIGNhdWdodCBhbiB1bnBsZWFzZW50IChidXQgaGFyZC10by1maW5kKSBidWcgdGhhdCBjb3VsZCBjYXVzZQogIGxpYmN1cmwgdG8gaGFuZyBvbiB0cmFuc2ZlcnMgb3ZlciBwcm94eSwgd2hlbiB0aGUgcHJveHkgd2FzIHNwZWNpZmllZCB3aXRoCiAgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUhCgotIEFkZGVkIGNvZGUgdG8gbWFrZSBmdHAgb3BlcmF0aW9ucyB0cmVhdCB0aGUgTk9fQk9EWSBhbmQgSEVBREVSUyBvcHRpb25zCiAgYmV0dGVyOgoKICAgTk9fQk9EWSBzZXQgVFJVRSBhbmQgSEVBREVSUyBzZXQgVFJVRToKICAgIFJldHVybiBhIHNldCBvZiBoZWFkZXJzIHdpdGggZmlsZSBpbmZvCgogICBOT19CT0RZIHNldCBGQUxTRQogICAgVHJhbnNmZXIgZGF0YSBhcyB1c3VhbCwgSEVBREVSUyBpcyBpZ25vcmVkCgogICBOT19CT0RZIHNldCBUUlVFIGFuZCBIRUFERVJTIHNldCBGQUxTRQogICAgRG9uJ3QgdHJhbnNmZXIgYW55IGRhdGEsIGRvbid0IHJldHVybiBhbnkgaGVhZGVycy4gSnVzdCBwZXJmb3JtIHRoZSBzZXQKICAgIG9mIEZUUCBjb21tYW5kcy4KCkRhbmllbCAoMTcgRGVjZW1iZXIgMjAwMSkKLSBH9nR6IEJhYmluLUViZWxsIGRvdmUgaW50byB0aGUgZGFyayBkdW5nZW9ucyBvZiB0aGUgT3BlblNTTCBFTkdJTkUgc3R1ZmYgYW5kCiAgbWFkZSBsaWJjdXJsIHN1cHBvcnQgaXQhIFRoaXMgYWxsb3dzIGxpYmN1cmwgdG8gZG8gU1NMIGNvbm5lY3Rpb25zIHdpdGggdGhlCiAgcHJpdmF0ZSBrZXkgc3RvcmVkIGluIGV4dGVybmFsIGhhcmR3YXJlLgoKICBUbyBtYWtlIHRoaXMgZ29vZCwgaGUgaGFkIHRvIGFkZCBhIGJ1bmNoIG9mIG5ldyBsaWJyYXJ5IG9wdGlvbnMgdGhhdCdsbCBiZQogIHVzZWZ1bCB0byBvdGhlcnMgYXMgd2VsbDoKCiAgIENVUkxPUFRfU1NMQ0VSVFRZUEUgIHNldCBTU0wgY2VydCB0eXBlIChQRU0vREVSKQogICBDVVJMT1BUX1NTTEtFWSAgICAgICBzZXQgU1NMIHByaXZhdGUga2V5IChmaWxlKQogICBDVVJMT1BUX1NTTEtFWVRZUEU6ICBzZXQgU1NMIGtleSB0eXBlIChQRU0vREVSL0VORykKICAgQ1VSTE9QVF9TU0xLRVlQQVNTV0Q6IHNldCB0aGUgcGFzc3BocmFzZSBmb3IgeW91ciBwcml2YXRlIGtleQogICAgICAgICAgICAgICAgICAgICAgICAgIChDVVJMT1BUX1NTTENFUlRQQVNTV0QgaXMgYW4gYWxpYXMpCiAgIENVUkxPUFRfU1NMRU5HSU5FOiAgIHNldCB0aGUgbmFtZSBvZiB0aGUgY3J5cHRvIGVuZ2luZQogICAgICAgICAgICAgICAgICAgICAgICAocmV0dXJucyBDVVJMRV9TU0xfRU5HSU5FX05PVEZPVU5EIG9uIGVycm9yKQogICBDVVJMT1BUX1NTTEVOR0lORV9ERUZBVUxUOiBzZXQgdGhlIGRlZmF1bHQgZW5naW5lCgogIFRoZXJlIGFyZSB0d28gbmV3IGZhaWx1cmUgY29kZXM6CgogICBDVVJMRV9TU0xfRU5HSU5FX05PVEZPVU5ECiAgIENVUkxFX1NTTF9FTkdJTkVfU0VURkFJTEVECgpEYW5pZWwgKDE0IERlY2VtYmVyIDIwMDEpCi0gV2UgaGF2ZSAiYnJhbmNoZWQiIHRoZSBzb3VyY2UtdHJlZSBhdCBhIGZldyBwbGFjZXMuIENoZWNrb3V0IHRoZSBDVlMgc291cmNlcwogIHdpdGggdGhlICdtdWx0aS1kZXYnIGxhYmVsIHRvIGdldCB0aGUgbGF0ZXN0IG11bHRpIGludGVyZmFjZSBkZXZlbG9wbWVudAogIHRyZWUuIFRoZSBpZGVhIGlzIHRvIG9ubHkgYnJhbmNoIGFmZmVjdGVkIGZpbGVzIGFuZCB0byByZXN0cmljdCB0aGUgYnJhbmNoCiAgdG8gdGhlIHY4IG11bHRpIGludGVyZmFjZSBkZXZlbG9wbWVudCBvbmx5LgoKICAqTk9URSogdGhhdCBpZiB3ZSBnZXQgYnVnIHJlcG9ydHMgYW5kIHBhdGNoZXMgZXRjLCB3ZSBtaWdodCBuZWVkIHRvIGFwcGx5CiAgdGhlbSBpbiBib3RoIGJyYW5jaGVzIQoKICBUaGUgbXVsdGktZGV2IGJyYW5jaCBpcyB3aGF0IHdlIGFyZSBnb25uYSB1c2UgYXMgbWFpbiBicmFuY2ggaW4gdGhlIGZ1dHVyZQogIGlmIGl0IHR1cm5zIG91dCBzdWNjZXNzZnVsLiBUaHVzLCB3ZSBtdXN0IG1haW50YWluIGJvdGggbm93IGluIGNhc2Ugd2UgbmVlZAogIHRoZW0uIFRoZSBjdXJyZW50IG1haW4gYnJhbmNoIHdpbGwgYmUgdXNlZCBpZiB3ZSB3YW50IHRvIHJlbGVhc2UgYSA3LjkuMyBvcgogIHBlcmhhcHMgYSA3LjEwIHJlbGVhc2UgYmVmb3JlIHZlcnNpb24gOC4gV2hpY2ggaXMgdmVyeSBsaWtlbHkuCgotIE1hcmN1cyBXZWJzdGVyIHByb3ZpZGVkIGNvZGUgZm9yIHRoZSBuZXcgQ1VSTEZPUk1fQ09OVEVOVEhFQURFUiBvcHRpb24gZm9yCiAgY3VybF9mb3JtYWRkKCksIHRoYXQgbGV0cyBhbiBhcHBsaWNhdGlvbiBhZGQgYSBzZXQgb2YgaGVhZGVycyBmb3IgdGhhdAogIHBhcnRpY3VsYXIgcGFydCBpbiBhIG11bHRpcGFydC9mb3JtLXBvc3QuIEhlIGFsc28gcHJvdmlkZWQgYSBzZWN0aW9uIHRvIHRoZQogIG1hbiBwYWdlIHRoYXQgZGVzY3JpYmVzIHRoZSBuZXcgb3B0aW9uLgoKRGFuaWVsICgxMSBEZWNlbWJlciAyMDAxKQotIEJlbiBHcmVlYXIgbWFkZSBtZSBhd2FyZSBvZiB0aGUgZmFjdCB0aGF0IHRoZSBDdXJsX2ZhaWxmKCkgdXNhZ2UgaW50ZXJuYWxseQogIHdhcyBhIGJpdCBzbG9wcHkgd2l0aCBhZGRpbmcgbmV3bGluZXMgb3Igbm90IHRvIHRoZSBlcnJvciBtZXNzYWdlcy4gTGV0J3MKICBvbmNlIGFuZCBmb3IgYWxsIHNheSB0aGF0IHRoZXkgZG8gbm90IGJlbG9uZyB0aGVyZSEKCi0gV2hlbiB1cGxvYWRpbmcgZmlsZXMgd2l0aCAtVCB0byBnaXZlIGEgbG9jYWwgZmlsZSBuYW1lLCBhbmQgeW91IGVuZCB0aGUgVVJMCiAgd2l0aCBhIHNsYXNoIHRvIGhhdmUgdGhlIGxvY2FsIGZpbGUgbmFtZSB1c2VkIHJlbW90ZSB0b28sIHdlIG5vdyBubyBsb25nZXIKICB1c2UgdGhlIGxvY2FsIGRpcmVjdG9yeSBhcyB3ZWxsLiBPbmx5IHRoZSBmaWxlIHBhcnQgb2YgdGhlIC1UIGZpbGUgbmFtZQogIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHJpZ2h0IG9mIHRoZSBzbGFzaCBpbiB0aGUgVVJMLgoKRGFuaWVsICg3IERlY2VtYmVyIDIwMDEpCi0gTWljaGFsIEJvbmlubyBwb2ludGVkIG91dCB0aGF0IERpZ2l0YWwgVW5peCBkb2Vzbid0IGhhdmUgZ210aW1lX3Igc28gdGhlCiAgbGluayBmYWlsZWQuIEFkZGVkIGEgY29uZmlndXJlIGNoZWNrIGFuZCBjb3JyZWN0ZWQgc291cmNlIGNvZGUuCgpWZXJzaW9uIDcuOS4yCgpEYW5pZWwgKDUgRGVjZW1iZXIgMjAwMSkKLSBKb24gVHJhdmlzIGZvdW5kIG91dCB0aGF0IGlmIHlvdSB1c2VkIGxpYmN1cmwgYW5kIENVUkxPUFRfVVBMT0FEIGFuZCB0aGVuCiAgb24gdGhlIHNhbWUgaGFuZGxlIHVzZWQgQ1VSTE9QVF9IVFRQR0VUIGl0IHdvdWxkIHN0aWxsIGF0dGVtcHQgdG8gdXBsb2FkLgogIEhpcyBzdWdnZXN0ZWQgZml4IHdhcyBwZXJmZWN0LgoKRGFuaWVsICg0IERlY2VtYmVyIDIwMDEpCi0gSW5jb3Jwb3JhdGVkIG1vcmUgbWFjb3MgZml4ZXMgYW5kIGFkZGVkIGZvdXIgc3BlY2lmaWMgZmlsZXMgaW4gYSBuZXcKICBzdWJkaXJlY3RvcnkgYmVsb3cgc3JjLgoKRGFuaWVsICgzIERlY2VtYmVyIDIwMDEpCi0gRXJpYyBMYXZpZ25lIHJlcG9ydGVkIHR3byBwcm9ibGVtczoKCiAgRmlyc3Qgb25lIGluIHRoZSBjdXJsX3N0cm5lcXVhbCgpIGZ1bmN0aW9uLiBJIHRoaW5rIHRoaXMgcHJvYmxlbSBpcyByYXRoZXIKICBtYWNvcyA5IHNwZWNpZmljLCBhcyBtb3N0IHBsYXRmb3JtIHByb3ZpZGVzIGEgZnVuY3Rpb24gdG8gdXNlIGluc3RlYWQgb2YgdGhlCiAgb25lIHByb3ZpZGVkIGJ5IGxpYmN1cmwuCgogIEEgc2Vjb25kLCBtb3JlIGltcG9ydGFudCwgd2FzIGluIHRoZSB3YXkgd2UgdGFrZSBjYXJlIG9mIEZUUCByZXNwb25zZXMuIFRoZQogIGNvZGUgd291bGQgcmVhZCBhIGxhcmdlIGNodW5rIG9mIGRhdGEgYW5kIHNlYXJjaCBmb3IgdGhlIGVuZC1vZi1yZXNwb25zZQogIGxpbmUgd2l0aGluIHRoYXQgY2h1bmsuIFdoZW4gZm91bmQsIGl0IHdvdWxkIGp1c3Qgc2tpcCB0aGUgcmVzdCBvZiB0aGUKICBkYXRhLiBIb3dldmVyLCB3aGVuIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb25zIGFyZSBzcGVjaWFsLCBvciBwZXJoYXBzIHRoZQogIHNlcnZlciBpcywgd2UgY291bGQgYWN0dWFsbHkgZ2V0IG1vcmUgdGhhbiBvbmUgcmVzcG9uc2UgaW4gdGhhdCBjaHVuayBvZgogIGRhdGEgc28gdGhhdCB3aGVuIHRoZSBuZXh0IGludm9rZSB0byB0aGlzIGZ1bmN0aW9uIHdhcyBkb25lLCB0aGUgcmVzcG9uc2UKICBoYWQgYWxyZWFkeSBiZWVuIHJlYWQgYW5kIHRocm93biBhd2F5LiBOb3csIHdlIGNhY2hlIHRoZSBkYXRhIG5vdCB1c2VkIGluCiAgb25lIGNhbGwsIGFzIGl0IGNvdWxkIGJlIHVzZWZ1bCBpbiB0aGUgc3Vic2VxdWVudCBjYWxsLiBUZXN0IGNhc2UgMTI2IHdhcwogIGFkZGVkIGFuZCB0aGUgdGVzdCBmdHAgc2VydmVyIG1vZGlmaWVkLCB0byBleGVyY2lzZSB0aGlzIHBhcnRpY3VsYXIgY2FzZS4KClZlcnNpb24gNy45LjItcHJlOAoKRGFuaWVsICgyIERlY2VtYmVyIDIwMDEpCi0gQnVnIHJlcG9ydCAjNDg3ODI1IGNvcnJlY3RseSBpZGVudGlmaWVkIGEgcHJvYmxlbSB3aGVuIHVzaW5nIGEgcHJveHkgYW5kCiAgZm9sbG93aW5nIGEgcmVkaXJlY3Rpb24gZnJvbSBIVFRQIHRvIEhUVFBTLiBsaWJjdXJsIHRoZW4gcmUtdXNlZCB0aGUgc2FtZQogIHByb3h5IGNvbm5lY3Rpb24gYnV0IHdpdGhvdXQgZG9pbmcgYSBwcm9wZXIgSFRUUFMgcmVxdWVzdC4KCi0gRml4ZWQgd2luMzIgY29tcGlsaW5nIHF1aXJrcy4KClZlcnNpb24gNy45LjItcHJlNwoKRGFuaWVsICgzMCBOb3ZlbWJlciAyMDAxKQotIERvY3VtZW50ZWQgLS1kaXNhYmxlLWVwc3YgYW5kIENVUkxPUFRfRlRQX1VTRV9FUFNWLgoKRGFuaWVsICgyOSBOb3ZlbWJlciAyMDAxKQotIEFkZGVkIC0tZGlzYWJsZS1lcHN2IGFzIGFuIG9wdGlvbi4gV2hlbiB1c2VkLCBjdXJsIHdvbid0IGF0dGVtcHQgdG8gdXNlIHRoZQogIEVQU1YgY29tbWFuZCB3aGVuIGRvaW5nIHBhc3NpdmUgRlRQIGRvd25sb2Fkcy4gV3JvdGUgYSB0ZXN0IGNhc2UgZm9yIGl0LgoKLSBFcmljIHByb3ZpZGVkIGEgZmV3IG1vcmUgZml4ZXMgZm9yIGJ1aWxkaW5nIG9uIE1hY3MuIEhlIGFsc28gcG9pbnRlZCBvdXQKICBhIGZsYXcgaW4gdGhlIHNpZ25hbCBoYW5kbGVyIHJlc3RvcmF0aW9uIGNvZGUuCgpEYW5pZWwgKDI4IE5vdmVtYmVyIDIwMDEpCi0gRmlkZGxlZCB3aXRoIHNvbWUgVHJ1NjQgcHJvYmxlbXMgcmVwb3J0ZWQgYnkgRGltaXRyaXMgU2FycmlzLiBUaGV5IGFwcGVhcmVkCiAgb25seSB3aGVuIHVzaW5nIFZFUkJPU0UgZnRwIHRyYW5zZmVycy4gRG8gd2UgdXNlIGEgdG9vIHNtYWxsIGJ1ZmZlciBmb3IKICBnZXRob3N0YnlhZGRyX3IoKSwgd2FzIHRoZSBsYWNrIG9mIHVzaW5nIGluX2FkZHJfdCB3cm9uZyBvciBpcyBpdCB0aGF0IHRoZQogIGhvc3RlbnQgc3RydWN0IG11c3QgYmUgYmxhbmtlZCBiZWZvcmUgdXNlPyBXaXRoIERpbWl0cmlzIGhlbHAgYW5kIHRoZXNlCiAgcGF0Y2hlcywgdGhlIHByb2JsZW1zIHNlZW0gdG8gYmUgaGlzdG9yeS4KCi0gQ1VSTE9QVF9GVFBfVVNFX0VQU1Ygd2FzIGFkZGVkIGFuZCBjYW4gYmUgc2V0IHRvIEZBTFNFIHRvIHByZXZlbnQgbGliY3VybAogIGZyb20gdXNpbmcgdGhlIEVQU1YgY29tbWFuZCBiZWZvcmUgdHJ5aW5nIHRoZSBub3JtYWwgUEFTVi4gSGVpa2tpIEtvcnBlbGEKICBwb2ludGVkIG91dCB0aGF0IHNvbWUgZmlyZXdhbGxzIGFuZCBzaW1pbGFyIGRvbid0IGxpa2UgdGhlIEVQU1Ygc28gd2UgbXVzdAogIGJlIGFibGUgdG8gc2h1dCBpZiBvZmYgdG8gd29yayBldmVyeXdoZXJlLgoKLSBJIGFkZGVkIGEgY29uZmlndXJlIGNoZWNrIGZvciAnaW5fYWRkcl90JyBhbmQgbWFkZSB0aGUgZnRwIGNvZGUgdXNlIHRoYXQgdG8KICByZWNlaXZlIHRoZSBpbmV0X2FkZHIoKSByZXR1cm4gY29kZSBpbi4gV29ya3Mgb24gU29sYXJpcyBhbmQgTGludXggYXQKICBsZWFzdC4gVGhlIExpbnV4IG1hbiBwYWdlIGZvciBpbmV0X2FkZHIoKSBkb2Vzbid0IGV2ZW4gbWVudGlvbiBpbl9hZGRyX3QuLi4KCi0gQWRqdXN0ZWQgKGFsbW9zdCkgYWxsIEZUUCB0ZXN0cyB0byB0aGUgbmV3IGNvbW1hbmQgc2VxdWVuY2UuCgotIEZUUCBjb21tYW5kIHNlcXVlbmNlIGNoYW5nZXM6CgogIEVQU1YgaXMgbm93IGFsd2F5cyBhdHRlbXB0ZWQgYmVmb3JlIFBBU1YuIEl0IGlzIHRoZSBmaW5hbCB0b3VjaCB0byBtYWtlIElQdjYKICBwYXNzaXZlIEZUUCBkb3dubG9hZHMgdG8gd29yaywgYnV0IEVQU1YgaXMgbm90IHJlc3RyaWN0ZWQgdG8gSVB2NiBidXQgd29ya3MKICBmaW5lIHdpdGggSVB2NCB0b28gb24gdGhlIHNlcnZlcnMgdGhhdCBzdXBwb3J0IGl0LgoKICBTSVpFIGlzIG5vdyBhbHdheXMgaXNzdWVkIGJlZm9yZSBSRVRSLiBJdCBtYWtlcyBjdXJsIGtub3cgdGhlIGFjdHVhbAogIGRvd25sb2FkIHNpemUgYmVmb3JlIHRoZSBkb3dubG9hZCB0YWtlcyBwbGFjZSwgYXMgaXQgbWFrZXMgaXQgbGVzcyBpbXBvcnRhbnQKICB0byBmaW5kIHRoZSBzaXplIHNlbnQgaW4gUkVUUiByZXNwb25zZXMuIE1hbnkgc2l0ZXMgZG9uJ3QgaW5jbHVkZSB0aGUgc2l6ZQogIGluIHRoZXJlLgoKICBCb3RoIHRoZXNlIGNoYW5nZXMgbWFkZSBpdCBuZWNlc3NhcnkgdG8gY2hhbmdlIHRoZSB0ZXN0IHN1aXRlJ3MgZnRwIHNlcnZlcgogIGNvZGUsIGFuZCBhbGwgRlRQIHRlc3QgY2FzZXMgbmVlZCB0byBiZSBjaGVja2VkIGFuZCBhZGp1c3RlZCEKCkRhbmllbCAoMjcgTm92ZW1iZXIgMjAwMSkKLSBIYW5zIFN0ZWVnZXJzIHBvaW50ZWQgb3V0IHRoYXQgdGhlIHRlbG5ldCBjb2RlIHJlYWQgZnJvbSBzdGRvdXQsIG5vdCBzdGRpbgogIGFzIGl0IGlzIHN1cHBvc2VkIHRvIGRvIQoKVmVyc2lvbiA3LjkuMi1wcmU2CgpEYW5pZWwgKDI3IE5vdmVtYmVyIDIwMDEpCi0gRXJpYyBMYXZpZ25lJ3MgbWlub3IgY2hhbmdlcyB0byBidWlsZCBvbiBNYWNPUyBiZWZvcmUgT1MgWCB3ZXJlIGFwcGxpZWQuCgotIGdyZWVwIGF0IG1pbmRzcHJpbmcuY29tIHByb3ZpZGVkIGEgbWFpbiBpbmRleC5odG1sIHBhZ2UgZm9yIG91ciByZWxlYXNlCiAgYXJjaGl2ZSBkb2NzIGRpcmVjdG9yeS4gSXQganVzdCBsaW5rcyB0byBhbGwgdGhlIGV4aXN0aW5nIEhUTUwgZmlsZXMsIGJ1dAogIEkgdGhpbmsgaXQgbWF5IGNvbWUgdXNlZnVsIHRvIHBlb3BsZS4KCi0gVGhlcmUncyBub3cgc29tZSBpbml0aWFsIGNvZGUgdG8gc3VwcG9ydCB0aGUgRVBTViBGVFAgY29tbWFuZC4gVGhhdCBzaG91bGQKICBiZSB1c2VkIHRvIGRvIHBhc3NpdmUgdHJhbnNmZXJzIElQdjYtc3R5bGUuIFRoZSBjb2RlIGlzIHN0aWxsICNpZiAwJ2VkIGluCiAgbGliL2Z0cC5jIGFzIEkgaGF2ZSBubyBJUHY2IGZ0cCBzZXJ2ZXIgdG8gdGVzdCB0aGlzIHdpdGguCgpEYW5pZWwgKDI2IE5vdmVtYmVyIDIwMDEpCi0gUm9iZXJ0IFNjaGxhYmJhY2ggaGFkIHByb2JsZW1zIHRvIHVuZGVyc3RhbmQgaG93IHRvIGRvIHJlc3VtZWQgdHJhbnNmZXJzLAogIGFuZCBJIGNsYXJpZmllZCB0aGUgbWFuIHBhZ2UgLUMgc2VjdGlvbiBzb21ld2hhdC4KClZlcnNpb24gNy45LjItcHJlNQoKRGFuaWVsICgyMiBOb3ZlbWJlciAyMDAxKQotIEFuZHLpcyBHYXJj7WEgaGVscGVkIG1lIG91dCB0byB0cmFjayBkb3duIHRoZSByb290cyBvZiBidWcgcmVwb3J0ICM0Nzk1MzcsCiAgd2hpY2ggd2FzIGNvbmNlcm5pbmcgY3VybCByZXR1cm5pbmcgdGhlIHdyb25nIGVycm9yIGNvZGUgd2hlbiBmYWlsaW5nIHRvCiAgY29ubmVjdC4gVGhpcyBkaWRuJ3QgaGFwcGVuIG9uIGFsbCBzeXN0ZW1zLCBhbmQgbW9yZSBzcGVjaWZpY2x5IEkndmUgc28gZmFyCiAgb25seSBzZWVuIHRoaXMgaGFwcGVuIG9uIElQdjQtb25seSBMaW51eCBob3N0cy4KCi0gSSBhcHBsaWVkIHRoZSBmaXhlcyBmb3IgdGhlIHR3byBidWdzIEVyaWMgTGF2aWduZSBmb3VuZCB3aGVuIGRvaW5nIGhpcyBNYWNPUwogIHBvcnQuIEEgbWlzc2luZyBjb21tYSBpbiBhcnBhX3RlbG5ldC5oIGFuZCBhIHByZXR0eSB3aWxkIHdyaXRlIGluIHRoZSBGVFAKICByZXNwb25zZSByZWFkZXIgZnVuY3Rpb24uIFRoZSBsYXR0ZXIgd3JpdGUgaXMgaG93ZXZlciBsaWtlbHkgdG8gb2NjdXIgaW4gb3VyCiAgb3duIGJ1ZmZlciB1bmxlc3MgdmVyeSBiaWcgRlRQIHNlcnZlciByZXBsaWVzICg+MjVLKSBhcmUgcmVhZC4gSSd2ZSBuZXZlcgogIHNlZW4gc3VjaCBhIHJlcGx5IGV2ZXIsIHNvIEkgdGhpbmsgdGhpcyBpcyBhIHJlbGF0aXZlbHkgbWlub3Igcmlzay4KCkRhbmllbCAoMjEgTm92ZW1iZXIgMjAwMSkKLSBNb29uZXNhbXkgcHJvdmlkZWQgY29kZSB0byBwcmV2ZW50IGp1bmsgZnJvbSBiZWluZyBvdXRwdXQgd2hlbiBsaWJjdXJsCiAgcmV0dXJucyBhbiBlcnJvciBjb2RlIGJ1dCBubyBlcnJvciBkZXNjcmlwdGlvbiBhbmQgdGhhdCBjb3JyZWN0cyBob3cgbWFrZSBpcwogIHJ1biBpbiB0aGUgTWFrZWZpbGUuZGlzdCBmaWxlICh0aGF0IGFwcGVhcnMgYXMgcm9vdCBNYWtlZmlsZSBpbiByZWxlYXNlCiAgYXJjaGl2ZXMpLgoKLSBFcmljIExhdmlnbmUgbWFpbGVkIG1lIGJ1Z2ZpeGVzIGFuZCBwYXRjaGVzIGZvciBidWlsZGluZyBsaWJjdXJsIG9uIE1hY09TCiAgKG5vbi1YKS4KCi0gS2V2aW4gUm90aCBtb2RpZmllZCB0aGUgY3lnd2luIGZpbGVzIG9uY2UgYWdhaW4sIG5vdyB0byBidWlsZCBhZ2FpbnN0IHRoZQogIHNoYXJlZCBPcGVuU1NMIERMTHMuCgpWZXJzaW9uIDcuOS4yLXByZTQKCkRhbmllbCAoMjAgTm92ZW1iZXIgMjAwMSkKLSBHZW9yZyBIb3JuIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGludHJvZHVjZWQgQ1VSTElORk9fU1RBUlRUUkFOU0ZFUl9USU1FLAogIGNvbXBsZXRlIHdpdGggbWFuIHBhZ2UgdXBkYXRlcyEKCkRhbmllbCAoMTkgTm92ZW1iZXIgMjAwMSkKLSBNaWtsb3MgTmVtZXRoIHByb3ZpZGVkIGRldGFpbHMgZW5vdWdoIHRvIHVwZGF0ZSB0aGUgQm9ybGFuZCBtYWtlZmlsZQogIHByb3Blcmx5LgoKLSBMYXJzIE0gR3VzdGFmc3NvbiBmb3VuZCBhIGNhc2Ugd2l0aCBhIGJhZCBmcmVlKCkuIEluIGZhY3QsIGl0IHdhcyBzbyBiYWQgSSdtCiAgYW1hemVkIHdlIG5ldmVyIHNhdyB0aGlzIGJlZm9yZSEKCi0gS2V2aW4gUm90aCBwYXRjaGVkIHRoZSBjeWd3aW4gTWFrZmlsZS4KCkRhbmllbCAoMTYgTm92ZW1iZXIgMjAwMSkKLSBLbGV2dHNvdiBWYWRpbSBmaXhlZCBhIGJ1ZyBpbiBob3cgdGltZS1jb25kaXRpb25hbHMgd2VyZSBzZW50IHdoZW4gZG9pbmcKICBIVFRQLgoKVmVyc2lvbiA3LjkuMi1wcmUzCgpEYW5pZWwgKDE0IE5vdmVtYmVyIDIwMDEpCi0gU2FtdWVsIExpc3RvcGFkIHBhdGNoZWQgYXdheSB0aGUgcHJvYmxlbSB3aXRoIFNTTCB3ZSBnb3Qgd2hlbiBzb21lb25lIGNhbGwKICBjdXJsX2dsb2JhbF9pbml0KCkgPT4gY3VybF9nbG9iYWxfY2xlYW51cCgpID0+IGN1cmxfZ2xvYmFsX2luaXQoKS4gVGhlCiAgc2Vjb25kIGluaXQgd291bGQgbm90ICJ0YWtlIiBhbmQgU1NMIHdvdWxkIGJlIHVudXNhYmxlIHdpdGggY3VybCBmcm9tIHRoYXQKICBwb2ludC4gVGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUgZmFjdCB0aGF0IGNhbGxpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IHdheSBpcwogIHdyb25nLiBjdXJsX2dsb2JhbF9pbml0KCkgc2hvdWxkIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYW5kIG5vdCBtb3JlLgoKRGFuaWVsICgxMyBOb3ZlbWJlciAyMDAxKQotIEZpeGVkIHNvbWUgbWlub3IgdmFyaWFibGUgdHlwZSBtaXh1cHMgaW4gZnRwLmMgdGhhdCBjYXVzZWQgY29tcGlsZXIgd2FybmluZ3MKICBvbiBIUC1VWCAxMS4wMC4KCi0gVGhlIEZUUCBmaXggSSBkaWQgeWVzdGVyZGF5IHVzZWQgYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSB0aGF0IGNhdXNlZAogIHNwdXJpb3VzIGVycm9ycyB3aGVuIGRvaW5nIEZUUC4KClZlcnNpb24gNy45LjItcHJlMgoKRGFuaWVsICgxMiBOb3ZlbWJlciAyMDAxKQotIFJpY2FyZG8gQ2FkaW1lIGZlbGwgb3ZlciBhIG11bHRpcGxlLXJlcXVlc3RzIHByb2JsZW0gd2hlbiBmaXJzdCBhIEZUUAogIGRpcmVjdG9yeSBmZXRjaCBmYWlsZWQgYW5kIHRoZW4gYSBzZWNvbmQgcmVxdWVzdCBpcyBtYWRlIGFmdGVyIHRoYXQuIFRoZQogIHNlY29uZCByZXF1ZXN0IGhhcHBlbmVkIHRvIGdldCB0aGUgRlRQIHNlcnZlciByZXNwb25zZSBiYWNrIGZyb20gdGhlCiAgcHJldmlvdXMgcmVxdWVzdCwgd2hlbiBpdCBkaWQgaXRzIGluaXRpYWwgQ1dEIGNvbW1hbmQuCgotIEJqb3JuIFJlZXNlIHBvaW50ZWQgb3V0IHRoYXQgd2UgY291bGQgaW1wcm92ZSB0aGUgdGltZSBkaWZmIGZ1bmN0aW9uIHRvCiAgcHJldmVudCB0cnVuY2F0aW9uIGEgYml0LgoKLSBLYWktVXdlIFJvbW1lbCBtYWRlIG1lIGF3YXJlIHRoYXQgLXAgKGh0dHAgcHJveHkgdHVubmVsKSBzaWxseSBlbm91Z2ggZGlkbid0CiAgd29yayBmb3IgcGxhaW4gSFRUUCByZXF1ZXN0cyEgU28gSSBtYWRlIHRoYXQgd29yay4KClZlcnNpb24gNy45LjItcHJlMQoKRGFuaWVsICgxMiBOb3ZlbWJlciAyMDAxKQotIFJld3JvdGUgdGhlIEN1cmxfQ29ubmVjdEhUVFBQcm94eVR1bm5lbCgpLiBJdCBzaG91bGQgbm93IG5vdCBvbmx5IHdvcmsgYSBsb3QKICBmYXN0ZXIsIGl0IHNob3VsZCBhbHNvIHN1cHBvcnQgc3VjaCAoImJyb2tlbiIpIHByb3hpZXMgdGhhdCBKb2huIExhc2sKICBwcmV2aW91c2x5IGhhdmUgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aC4gSGlzIHByb3h5IHNlbmRzIGEgdHJhaWxpbmcgemVybyBieXRlCiAgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgKHByb3h5LSkgaGVhZGVycy4gSSd2ZSB0ZXN0ZWQgdGhpcyBteXNlbGYgYW5kIGl0IHNlZW1zCiAgdG8gd29yayBvbiBhIHByb3h5IHRoZSBwcmV2aW91cyB2ZXJzaW9uIGFsc28gd29ya2VkIHdpdGguLi4hIFRoaXMgcmV3cml0ZSBpcwogIGR1ZSB0byB0aGUgcHJvYmxlbXMgSm9obiBMYXNrIHByZXZpb3VzbHkgZXhwZXJpZW5jZWQuCgotIEFuZHLpcyBHYXJj7WEgZm91bmQgb3V0IHdoeSB0aGUgImN1cnJlbnQgc3BlZWQiIG1ldGVyIHNvbWV0aW1lcyBzaG93ZWQgMjA0OEsKICBmb3IgdmVyeSBxdWljayB0cmFuc2ZlcnMuIEl0IHR1cm5lZCBvdXQgdGhlICJ0aW1lIGRpZmYiLWZ1bmN0aW9uIHJldHVybmVkIGEKICB6ZXJvIG1pbGxpc2Vjb25kIGRpZmYuIFdlIG5vdyBhbHdheXMgc2F5IGl0IGlzIGF0IGxlYXN0IG9uZSBtaWxsaXNlY29uZCEgSW4KICByZWFsaXR5LCB0aGVzZSB0aW1lcnMgdmVyeSByYXJlbHkgaGF2ZSB0aGF0IGdvb2QgcmVzb2x1dGlvbiBzbyBldmVuIHRob3VnaAogIHRoZSB0aW1lIGRpZmYgd2FzIGxvbmdlciB0aGFuIDEgbWlsbGlzZWNvbmQsIGl0IHdhcyByZXBvcnRlZCBhcyBubyBkaWZmLgoKLSBJIGFsc28gbW9kaWZpZWQgdGhlIGdldGluZm8oKSBhZ2FpbiB3aGVuIHJldHVybmluZyB0aW1lcywgYXMgUGF1bCBIYXJyaW5ndG9uCiAgcmVwb3J0cyB0aGF0IDcuOS4xIG9ubHkgcmV0dXJucyB0aW1lcyB3aXRoIDEgc2Vjb25kIGFjY3VyYWN5LCB3aGljaCBpbmRlZWQKICBpcyB3cm9uZy4KCkRhbmllbCAoOCBOb3ZlbWJlciAyMDAxKQotIE1hcmN1cyBXZWJzdGVyIGZvdW5kIG91dCB0aGF0IGN1cmxfZm9ybWFkZCgpIGNvdWxkIHJlYWQgb25lIGJ5dGUgb3V0c2lkZSBhCiAgYnVmZmVyIGJvdW5kYXJ5LCB3aGljaCB0aGVuIG9mIGNvdXJzZSBjb3VsZCBsZWFkIHRvIGEgY3Jhc2guIE1hcmN1cyBhbHNvCiAgZ3JhY2VmdWxseSBwcm92aWRlZCBhIHBhdGNoIGZvciB0aGlzIHRoaXMuCgotIEdsZW4gU2NvdHQgcmFuIGNvbmZpZ3VyZSBvbiBoaXMgQ29iYWx0IFF1YmUgYW5kIGl0IGRpZG4ndCBmaWd1cmUgb3V0IHRoZQogIGNvcnJlY3Qgd2F5IG9mIGNhbGxpbmcgZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIHRodXMgZmFpbGVkIHRvIHJlc29sdmUgaG9zdHMuCiAgVGhpcyBpcyB0d28gZXJyb3JzOiBpdCBzaG91bGRuJ3QgY29udGludWUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaWYgaXQgZmluZHMKICBnZXRob3N0YnluYW1lX3IoKSBidXQgY2FuJ3QgZmlndXJlIG91dCBob3cgdG8gdXNlIGl0LCBhbmQgaXQgc2hvdWxkIHJlYWxseQogIGZpZ3VyZSBvdXQgaG93IHRvIHVzZSBpdCBhcyBpdCB3YXMgcnVubmluZyBMaW51eCBhbmQgd2Uga25vdyBob3cgdGhhdAogIHdvcmtzLi4uCgpEYW5pZWwgKDcgTm92ZW1iZXIgMjAwMSkKLSBkb2NzL1ZFUlNJT05TIGlzIGEgbmV3IGZpbGUgaW4gdGhlIGFyY2hpdmUgdGhhdCBleHBsYWlucyB0aGUgdmVyc2lvbiBudW1iZXIKICBzeXN0ZW0gd2UgdXNlIGluIHRoZSBjdXJsIHByb2plY3QuCgotIERpZCBzb21lIG1vcmUgZml4ZXMgdGhhdCBub3cgbWFrZXMgbGliY3VybCBvbmx5IGlnbm9yZSBzaWduYWxzIGFzIGxvbmcgYXMKICBpdCBuZWVkcyB0bywgYW5kIHRoZW4gcmVzdG9yZSAoaWYgYW55KSBwcmV2aW91cyBzaWduYWwgaGFuZGxlciBhZ2Fpbi4KCkRhbmllbCAoNiBOb3ZlbWJlciAyMDAxKQotIEVucmlrIEJlcmtoYW4gcG9zdGVkIGJ1ZyByZXBvcnQgIzQ3ODc4MCwgaW4gd2hpY2ggaGUgdmVyeSBjb3JyZWN0bHkgcG9pbnRlZAogIG91dCB0d28gYmFkIHRpbWVvdXQgbWF0dGVycyBpbiBsaWJjdXJsOiB3ZSBkaWRuJ3QgcmVzdG9yZSB0aGUgc2lnYWN0aW9uCiAgc3RydWN0ICh0aGUgYWxhcm0gaGFuZGxlciBmb3IgU0lHQUxSTSkgbm9yIGRpZCB3ZSByZXN0b3JlIHRoZSBwcmV2aW91cwogIGFsYXJtKCkgdGltZW91dCB0aGF0IGNvdWxkJ3ZlIGJlZW4gc2V0IGJ5IGEgInBhcmVudCIgcHJvY2VzcyBvciBzaW1pbGFyLgoKLSBLZXZpbiBSb3RoIG1hZGUgdGhlIGN5Z3dpbiBiaW5hcnkgZ2V0IHN0cmlwcGVkIGJlZm9yZSBpbnN0YWxsLgoKRGFuaWVsICg1IE5vdmVtYmVyIDIwMDEpCi0gRGV0bGVmIFNjaG1pZXIgcmVwb3J0ZWQgdGhhdCBjdXJsIGRpZG4ndCBjb21waWxlIHVzaW5nIFNvbGFyaXMgOCB3aXRoIHRoZQogIG5hdGl2ZSBjYyBjb21waWxlci4gSXQgd2FzIGR1ZSB0byBhIGJhZCBmdW5jdGlvbiBwcm90b3R5cGUuIEZpeGVkIG5vdy4KICBVbmZvcnR1bmF0ZWx5LCBJIGNhbid0IGVuYWJsZSB0aGUgLVdzdHJpY3QtcHJvdG90eXBlcyBpbiBteSBkZWJ1ZyBidWlsZHMKICB0aG91Z2gsIGFzIGdjYyB0aGVuIGNvbXBsYWlucyBsaWtlIGNyYXp5IG9uIE9wZW5TU0wgaW5jbHVkZSBmaWxlcy4uLiA6LSgKCi0gSm9obiBMYXNrIHByb3ZpZGVkIFNTTCBvdmVyIEhUVFAgcHJveHkgZml4ZXMuIFRoZXknbGwgbmVlZCBzb21lIHR3ZWFraW5nCiAgdG8gd29yayBvbiBhbGwgcGxhdGZvcm1zLgoKLSBKb2huIExhc2sgYWRkZWQgdGhlIC0xLy0tVExTdjEgb3B0aW9ucyB0aGF0IGZvcmNlcyBTU0wgaW50byB1c2luZyBUTFMKICB2ZXJzaW9uIDEgd2hlbiBzcGVha2luZyBIVFRQUy4KCi0gSm9obiBMYXNrIGJyb3VnaHQgYSBicmFuZCBuZXcgVkMrKyBtYWtlZmlsZSBmb3IgdGhlIGxpYiBkaXJlY3RvcnksIHRoYXQKICB3b3JrcyBhIGxvdCBiZXR0ZXIgdGhhbiB0aGUgcHJldmlvdXMhCgotIFJhbWFuYSBNb2trYXBhdGkgYnJvdWdodCBzb21lIGNsZXZlciBpbnNpZ2h0cyBvbiB0aGUgTERBUCBmYWlsdXJlcyAoYnVnCiAgcmVwb3J0ICM0NzU0MDcpLCBhbmQgaGlzIHN1Z2dlc3RlZCBjaGFuZ2VzIGFyZSBub3cgYXBwbGllZC4KClZlcnNpb24gNy45LjEKCkRhbmllbCAoNCBOb3ZlbWJlciAyMDAxKQotIEkndmUgYWRkZWQgYSBudW1iZXIgb2YgbmV3IHRlc3QgY2FzZXMgdGhlIGxhc3QgZmV3IGRheXMuIEEgZmV3IG9mIHRoZW0gc2luY2UKICBJIGdvdCByZXBvcnRzIHRoYXQgaGludGVkIG9uIHByb2JsZW1zIG9uIHRpbWVvdXRzLCBzbyBJIGFkZGVkIGZvdXIgdGVzdHMKICB3aXRoIHRpbWVvdXRzIGZvciBhbGwgc29ydHMgb2YgcHJvdG9jb2xzIGFuZCBzdHVmZi4gSSBhbHNvIGNhbWUgdG8gdGhpbmsgb2YKICBhIGZldyBvdGhlciBlcnJvciBzY2VuYXJpb3MgdGhhdCB3ZSBjdXJyZW50bHkgZGlkbid0IHRlc3QgcHJvcGVybHksIHNvIEkKICB3cm90ZSB1cCB0ZXN0cyBmb3IgYSBmZXcgb2YgdGhvc2UgdG9vLgoKRGFuaWVsICgyIE5vdmVtYmVyIDIwMDEpCi0gUmVwbGFjZWQgcmVhZCgpIGFuZCB3cml0ZSgpIHdpdGggcmVjdigpIGFuZCBzZW5kKCkgZm9yIHNvY2tldCBvcGVyYXRpb25zCiAgZXZlbiB1bmRlciBub3JtYWwgdW5peGVzLgoKRGFuaWVsICgxIE5vdmVtYmVyIDIwMDEpCi0gV2hlbiBhbiBGVFAgdHJhbnNmZXIgd2FzIGFib3J0ZWQgZHVlIHRvIGEgdGltZW91dCwgaXQgd2Fzbid0IHJlYWxseSBhd2FyZSBvZgogIGhvdyBtYW55IGJ5dGVzIHRoYXQgaGFkIGJlZW4gdHJhbnNmZXJyZWQgYW5kIHRoZSBlcnJvciB0ZXh0IGFsd2F5cyBzYWlkIDAKICBieXRlcy4gSSBtb2RpZmllZCB0aGlzIHRvIG91dHB1dCB0aGUgYWN0dWFsbHkgdHJhbnNmZXJyZWQgYW1vdW50ISA6LSkKCi0gVGhlIEZUUCBmaXhlcyBpbiBwcmU3IGRpZG4ndCBjb21waWxlIG9uIElQdjYgZW5hYmxlZCBob3N0cy4gRG9lcyBub3cuIEkgYWxzbwogIGFkZGVkIG1vcmUgY29tbWVudHMgaW4gdGhlIGxpYi9mdHAuYyBzb3VyY2UgZmlsZS4KCi0gTWlub3IgdXBkYXRlcyB0byB0aGUgRkFRLCBhZGRlZCBhIGJyYW5kIG5ldyBzZWN0aW9uIHRvIHRoZSB3ZWIgc2l0ZSBhYm91dAogIHRoZSBuYW1lIGlzc3VlICh3aG8gb3ducyAiY3VybCI/IHdpbGwgc29tZW9uZSBzdWUgdXM/IGV0YyBldGMpOgogIGh0dHBzOi8vY3VybC5oYXh4LnNlL2xlZ2FsL3RoZW5hbWUuaHRtbAoKVmVyc2lvbiA3LjkuMS1wcmU3CgpEYW5pZWwgKDMxIE9jdG9iZXIgMjAwMSkKLSBUaGUgY3VybF9lYXN5X2dldGluZm8oKSB0aW1lcnMgYWNjaWRlbnRhbGx5IGxvc3QgdGhlaXIgc3Vic2Vjb25kIGFjY3VyYWN5IGFzCiAgdGhlIGNhbGN1bGF0aW9ucyB1c2VkIGxvbmdzIGluc3RlYWQgb2YgZG91YmxlcyEgUGF1bCBIYXJyaW5ndG9uIHJlcG9ydGVkLgoKLSBUaGUgU1NMIFNvY2tldElzRGVhZCgpIGNoZWNrcyB3ZXJlbid0IGdvb2QgZW5vdWdoIChhcyBleHBlY3RlZCByZWFsbHkpLCBzbyBJCiAgaGFkIHRvIGFkZCBhIGdlbmVyaWMgaW50ZXJuYWwgdHJ5LWl0LW91dCBzeXN0ZW0uIElmIHRoZSByZXF1ZXN0IG9uIGEgcmUtdXNlZAogIGNvbm5lY3Rpb24gc2VlbXMgdG8gZmFpbCwgdGhlbiB3ZSBnbyBiYWNrIGFuZCBnZXQgYSBuZXcgKGZyZXNoKSBjb25uZWN0aW9uCiAgYW5kIHJlLXRyaWVzIHRoZSByZXF1ZXN0IG9uIHRoYXQgaW5zdGVhZC4gSXQga2luZCBvZiBtYWtlcyB0aGUKICBTb2NrZXRJc0RlYWQoKSBjaGVjayBvYnNvbGV0ZSwgYnV0IEkgdGhpbmsgaXQgaXMgYSBxdWlja2VyIHdheSBmb3IgdGhvc2UKICBjYXNlcyB3aGVyZSBpdCBhY3R1YWxseSBkaXNjb3ZlcnMgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBkZWFkLgoKLSBXaGVuIGZpeGluZyB0aGUgYWJvdmUsIEkgbm90aWNlZCB0aGF0IHdlIGRpZCBxdWl0ZSBhIGZldyB3cml0ZXMgdG8gc29ja2V0cwogIGluIGxpYmN1cmwgd2hlcmUgd2UgZGlkbid0IGNoZWNrIHRoZSByZXR1cm4gY29kZSAodGhhdCBpdCBhY3R1YWxseSB3b3JrZWQgdG8KICBzZW5kIHRoZSBkYXRhKS4gV2l0aCB0aGUgbmV3ICJhdHRlbXB0ZWQgcmVxdWVzdCIgc3lzdGVtIHdlIG11c3QgZGV0ZWN0IHRob3NlCiAgc2l0dWF0aW9ucyBzbyBJIHdlbnQgb3ZlciBhIGJ1bmNoIG9mIGZ1bmN0aW9ucywgY2hhbmdlZCByZXR1cm4gdHlwZXMgYW5kCiAgYWRkZWQgY2hlY2tzIGZvciB3aGF0IHRoZXkgYWN0dWFsbHkgcmV0dXJuLgoKVmVyc2lvbiA3LjkuMS1wcmU2CgpEYW5pZWwgKDMxIE9jdG9iZXIgMjAwMSkKLSBQYXVsIEhhcnJpbmd0b24gZGV0ZWN0ZWQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGFudCBTU0wgY29ubmVjdGlvbnMuIE9yIHRvIGJlCiAgbW9yZSBleGFjdCwgd2UgZGlkbid0IHByb3Blcmx5IGRldGVjdCB0aGF0IHRoZSBjb25uZWN0aW9uIHdhcyBkZWFkIGFuZCB0aGVuCiAgYSBzZWNvbmQgY29ubmVjdGlvbiB3b3VsZCB0cnkgdG8gcmUtdXNlIGl0IHdyb25nbHkuIFRoZSBzb2x1dGlvbiB0byB0aGlzCiAgcHJvYmxlbSBpcyBzdGlsbCBub3QgdmVyeSBjbGVhciBhbmQgSSdtIHdvcmtpbmcgb24gaXQuIE9uZSBPcGVuU1NMIGluc2lkZXIKICBzYWlkIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IGlmIHRoZSBTU0wgY29ubmVjdGlvbiBpcyBhbGl2ZSBvciBub3Qgd2l0aG91dAogIGFjdHVhbGx5IHRyeWluZyBhbiBvcGVyYXRpb24uCgpEYW5pZWwgKDMwIE9jdG9iZXIgMjAwMSkKLSBJZiBhIGNvb2tpZSB3YXMgcmVhZCBmcm9tIGEgZmlsZSwgaXQgY291bGQgYWNjaWRlbnRhbGx5IHN0cmR1cCgpIGEgTlVMTAogIHBvaW50ZXIuIFBhdWwgSGFycmluZ3RvbiByZXBvcnRlZC4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi9jb29raWUuYy5kaWZmP3IxPTEuMjUmcjI9MS4yNl0KCi0gVGhlIE1BTlVBTCBmaWxlIG5vdyBkb2N1bWVudHMgLXQgY29ycmVjdGx5LiBJIGFsc28gZml4ZWQgdGhlIC1UIGRlc2NyaXB0aW9uCiAgaW4gdGhlIGN1cmwuMSBtYW4gcGFnZS4KCkRhbmllbCAoMjkgT2N0b2JlciAyMDAxKQotIEpvaG4gSmFuc3NlbiBmb3VuZCBvdXQgdGhhdCBjdXJsX2Zvcm1hZGQgd2FzIG1pc3NpbmcgaW4gdGhlIGxpYmN1cmwuZGVmIGZpbGUKICBhbmQgdGhhdCB0aGUgZG9jcyBzdGF0ZWQgdGhlIHdyb25nIHJldHVybiB0eXBlIGZvciB0aGUgZnVuY3Rpb24uCgotIEFuZHLpcyBHYXJj7WEgZm91bmQgYSBidWcgd2l0aCBtdWx0aXBsZSBmaWxlcyBpbiB0aGUgY3VybF9mb3JtYWRkKCkgZnVuY3Rpb24sCiAgdGhhdCBJIHJlbW92ZWQgd2l0aCB0aGlzIHBhdGNoIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvZm9ybWRhdGEuYy5kaWZmP3IxPTEuMjUmcjI9MS4yNl0uCgotIEtldmluIFJvdGggYnJvdWdodCBhbm90aGVyIHBhdGNoIHRoYXQgbW92ZWQgdGhlIGN5Z3dpbiBwYWNrYWdlIGZpbGVzIHRvIHRoZQogIHBhY2thZ2VzL1dpbjMyL2N5Z3dpbiBkaXJlY3RvcnkuCgotIEEgYnVnIGluIHRoZSBjb25uZWN0aW9uIHJlLXVzZSBsb2dpYyBtYWRlIHJlcGVhdGVkIHJlcXVlc3RzIHRvIHRoZSBzYW1lIEZUUAogIHNlcnZlciAod2hlbiB1c2luZyBuYW1lK3Bhc3dvcmQgaW4gdGhlIFVSTCkgc29tZXRpbWVzIHVzZSBtb3JlIHRoYW4gb25lCiAgY29ubmVjdGlvbi4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi91cmwuYy5kaWZmP3IxPTEuMTY2JnIyPTEuMTY3XQoKLSBNb29uZXNhbXkgdHJhY2tlZCBkb3duIGFuZCBmaXhlZCBhIHByb2JsZW0gd2l0aCB0aGUgbmV3IDcuOS4xIGNvbm5lY3QKICBjb2RlLiBUaGlzIGNvcnJlY3RlZCB0aGUgZXJyb3IgS2V2aW4gUm90aCByZXBvcnRlZCBvbiB0aGUgNy45LjEtcHJlNSByZWxlYXNlCiAgKHRlc3QgMTkpLi4uCiAgW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi9jb25uZWN0LmMuZGlmZj9yMT0xLjEzJnIyPTEuMTRdCgpEYW5pZWwgKDI2IE9jdG9iZXIgMjAwMSkKLSBBZGRlZCB0ZXN0Mjggd2hpY2ggdmVyaWZpZXMgdGhhdCAiTG9jYXRpb246Ii1mb2xsb3dpbmcgd29ya3MgZXZlbiBpZiB0aGUKICBjb250ZW50cyBpcyBzZXBhcmF0ZWQgd2l0aCBtb3JlIHRoYW4gb25lIHNwYWNlLgoKRGFuaWVsICgyNSBPY3RvYmVyIDIwMDEpCi0gUmFtYW5hIE1va2thcGF0aSBwb2ludGVkIG91dCB0aGF0IExEQVAgdHJhbnNmZXJzIHdvdWxkICdoYW5nJyBhZnRlciB0aGUKICBjb3JyZWN0IGRhdGEgaGFzIGJlZW4gb3V0cHV0LgoKVmVyc2lvbiA3LjkuMS1wcmU1CgpEYW5pZWwgKDI0IE9jdG9iZXIgMjAwMSkKLSBULiBCaGFyYXRoIGZvdW5kIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGNvb2tpZSBlbmdpbmUuIFdoZW4gd2UgdXBkYXRlIGEgY29va2llCiAgdGhhdCB3ZSBhbHJlYWR5IGtuZXcgYWJvdXQsIHdlIGxvc3QgYSBjaHVuayBvZiBtZW1vcnkgaW4gdGhlIHByb2dyZXNzLi4uIFRoZQogIGJyYW5kIG5ldyB0ZXN0IGNhc2UgMjcgbm93IHRlc3RzIGZvciB0aGlzIG9jY3VycmVuY2UuIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvY29va2llLmMuZGlmZj9yMT0xLjI0JnIyPTEuMjVdCgpEYW5pZWwgKDIzIE9jdG9iZXIgMjAwMSkKLSBwYWNrX2hvc3RlbnQoKSBkaWRuJ3QgcHJvcGVybHkgYWxpZ24gc29tZSBwb2ludGVycywgc28gYXQgbGVhc3QgU1BBUkMgQ1BVcwogIHdvdWxkIGNvcmUuIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvaG9zdGlwLmMuZGlmZj9yMT0xLjM0JnIyPTEuMzVdCgpEYW5pZWwgKDIyIE9jdG9iZXIgMjAwMSkKLSBUb20gQmVub2lzdCByZXBvcnRlZCB0aGF0IHRoaXMgU0dJIElSSVggY29tcGlsZXIgZGlkbid0IGhhbmRsZSBpbmRlbnRlZAogIHByZXByb2Nlc3NvciBpbnN0cnVjdGlvbnMsIHNvIHRoZXkncmUgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgY29kZSEKCi0gQXBwbGllZCBLZXZpbiBSb3RoJ3MgcGF0Y2hlcyB0byBtYWtlIGl0IGVhc2llciB0byBidWlsZCBjeWd3aW4gcGFja2FnZXMgZnJvbQogIHRoZSBvdXQtb2YtdGhlLWJveCBjdXJsIHJlbGVhc2UgYXJjaGl2ZXMuCgotIEkgZm9yZ290IHRvIG1lbnRpb24gaXQgYmVsb3csIGJ1dCBsaWJjdXJsIG5vdyBjbG9zZXMgY29ubmVjdGlvbnMgdGhhdCByZXBvcnQKICB0cmFuc2ZlciBmYWlsdXJlcy4gVW5jb25kaXRpb25hbGx5LiBUaGlzIGNvdWxkIGJlIG1hZGUgbW9yZSBuaWNlbHkgaW4gdGhlCiAgZnV0dXJlIGlmIHdlIHNldCBhIGZsYWcgb3Igc29tZXRoaW5nIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgZ29vZCB0byBiZQogIHVzZWQgZm9yIHRoZSBlcnJvcnMgdGhhdCBrbm93IHRoYXQgZm9yIGEgZmFjdC4gV2UgaGF2ZSB0byBjbG9zZSB0aGUKICBjb25uZWN0aW9uIGZvciB0aGUgY2FzZXMgd2hlcmUgd2UgYWJvcnQgZm9yIGV4YW1wbGUgYSBIVFRQIHRyYW5zZmVyIGluIHRoZQogIG1pZGRsZSwgb3Igb3RoZXJ3aXNlIHdlIG1pZ2h0IHJlLXVzZSB0aGF0IGNvbm5lY3Rpb24gbGF0ZXIgd2l0aCBsb3RzIG9mIGRhdGEKICBzdGlsbCBiZWluZyBzZW50IHRvIHVzIG9uIGl0LiBbaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi92aWV3Y3ZzLmNnaS9jdXJsL2N1cmwvbGliL3RyYW5zZmVyLmMuZGlmZj9yMT0xLjYzJnIyPTEuNjRdCgpEYW5pZWwgKDE5IE9jdG9iZXIgMjAwMSkKLSBDVVJMRV9HT1RfTk9USElORyBpcyBub3cgcmV0dXJuZWQgd2hlbiBhIEhUVFAgc2VydmVyIGRvZXNuJ3QgcmV0dXJuCiAgYW55dGhpbmcsIG5vdCBldmVuIGEgaGVhZGVyLiB0ZXN0IGNhc2UgMzcgd2FzIGFkZGVkIHRvIHRlc3QgZm9yIHRoaXMuCgotIFQuIEJoYXJhdGggbWFkZSBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgcHJvcGVybHkgY2xvbmUgdGhlIGNvb2tpZSBzdGF0dXMgYXMKICB3ZWxsLgoKVmVyc2lvbiA3LjkuMS1wcmU0CgpEYW5pZWwgKDE4IE9jdG9iZXIgMjAwMSkKLSBDVVJMT1BUX0ZBSUxPTkVSUk9SLCBzZXQgd2l0aCAiY3VybCAtLWZhaWwiIG5vIGxvbmdlciByZXR1cm5zIGFuIGVycm9yIGlmCiAgdGhlIEhUVFAgcmV0dXJuIGNvZGUgaXMgYmVsb3cgNDAwLgoKRGFuaWVsICgxNyBPY3RvYmVyIDIwMDEpCi0gVGhlIHRlc3Qgc3VpdGUgbm93IGtpbGxzIGFueSBydW5uaW5nIHRlc3QgaHR0cCBzZXJ2ZXIgd2hlbiB5b3UgcmUtc3RhcnQgdGhlCiAgdGVzdHMuCgotIFdlIGhhZCB0byByZW1vdmUgJ3VzZSBzdHJpY3QnIGZyb20gdHdvIHBlcmwgc2NyaXB0cywgYXMgdGhlIGN5Z3dpbgogIGFkanVzdG1lbnRzIGRpZG4ndCBwbGF5IG5pY2VseSBvdGhlcndpc2UgZm9yIHNvbWUgcmVhc29uLiBBbnkgcGVybCB3aXphcmQKICBvdXQgdGhlcmUgd2hvIGNhbiBwdXQgdGhlIHNjcmljdCBiYWNrIGFuZCBzdGlsbCBtYWtlIGl0IHJ1biBnb29kIG9uIHVuaXggYW5kCiAgY3lnd2luPwoKLSBBIHBvdGVudGlhbCBtZW1vcnkgbGVhayBwb2ludGVkIG91dCB0byB1cyBieSBZYW5pY2sgUGVsbGV0aWVyIHdhcyByZW1vdmVkLgogIEl0IHdvdWxkIG9jY3VyIHdoZW4gYSBodHRwIGZpbGUgdHJhbnNmZXIgZmFpbHMuIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvdHJhbnNmZXIuYy5kaWZmP3IxPTEuNjAmcjI9MS42MV0KCi0gVGhlIG1lbW9yeSBkZWJ1Z2dpbmcgc3lzdGVtIHNob3VsZCBubyBsb25nZXIgZGlzcGxheSBhbnl0aGluZyB0byBzdGRlcnIKICBpZiB0aGUgY3VybF9tZW1kZWJ1ZygpIGhhc24ndCBiZWVuIHVzZWQgdG8gZXhwbGljaXRseSBzYXkgc28uIFRoaXMgbWFrZXMgaXQKICBlYXNpZXIgdG8gdXNlIHRoZSBtZW1vcnkgZGVidWcgc3lzdGVtIGFuZCBzd2l0Y2ggdGhlIGxvZ2dpbmcgb24vb2ZmLgoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDEpCi0gS2V2aW4gUm90aCBwcm92aWRlZCBmaXhlcyBmb3IgYnVpbGRpbmcgY3VybCBuaWNlciBpbiBjeWd3aW4gZW52aXJvbm1lbnRzLgoKRGFuaWVsICgxMiBPY3RvYmVyIDIwMDEpCi0gQ2xlYW5pbmcgdXAgdGhlIHByb2dyZXNzIG1ldGVyL2luZm8gY29kZS4gVGhlICJjdXJyZW50IHNwZWVkIiBpcyBub3cgbW9yZQogIGFjY3VyYXRlIHRoYW4gYmVmb3JlIGFzIHdlIG5vdyB1c2UgdGhlIHRydWUgdGltZSBzcGVudCBiZXR3ZWVuIHRoZSBtZWFzdXJlcywKICBhbmQgbm90IGp1c3QgImFzc3VtaW5nIiBldmVyeS1zZWNvbmQtdXBkYXRlIGxpa2UgYmVmb3JlLiBUaGUgb3V0cHV0IHNob3VsZAogIG5vdyBhbHNvIGJlIG9mIHRoZSBzYW1lIHdpZHRoIGF0IGFsbCB0aW1lcywgbmV2ZXIgdG8gc2hvdyAiZXh0cmEiIHplcm9lcyBvbgogIHRoZSByaWdodCBlZGdlLgoKLSBBZnRlciB0YWxraW5nIGFib3V0IHBvc3NpYmxlIExvY2F0aW9uOiBidWdzIG9uIHRoZSBtYWlsaW5nIGxpc3QsIEkgbW9kaWZpZWQKICB0aGUgImFic29sdXRlIFVSTCIgY2hlY2tlciBpbiBsaWIvdHJhbnNmZXIuYyB0byBiZSBtb3JlIHN0cmljdCB3aGVuIGNoZWNraW5nCiAgaWYgdGhlIHJlZGlyZWN0ZWQgVVJMIGlzIGFic29sdXRlLgoKRGFuaWVsICgxMSBPY3RvYmVyIDIwMDEpCi0gS2V2aW4gUm90aCBwcm92aWRlZCBwYXRjaGVzIHRoYXQgbWFrZSB0aGUgdGVzdCBzdWl0ZSBydW4gZmluZSBvbiBXaW5kb3dzCiAgMjAwMCBydW5uaW5nIGN5Z3dpbi4KCkRhbmllbCAoMTAgT2N0b2JlciAyMDAxKQotIFNldHRpbmcgdGhlIC1jIG9yIHRoZSBDVVJMT1BUX0NPT0tJRUpBUiBvcHRpb24gbm93IGVuYWJsZXMgdGhlIGNvb2tpZSBwYXJzZXIuCiAgUHJldmlvdXNseSAtYiBvciBDVVJMT1BUX0NPT0tJRUZJTEUgd2FzIGFsc28gcmVxdWlyZWQgZm9yIHRoZSBqYXIgdG8gd29yay4KClZlcnNpb24gNy45LjEtcHJlMwoKRGFuaWVsICg5IE9jdG9iZXIgMjAwMSkKLSBBZGRlZCBhIG5ldyBvcHRpb24gdG8gdGhlIGNvbW1hbmQgbGluZSBjbGllbnQ6IC0wLy0taHR0cDEuMC4gSXQgdXNlcyB0aGUgbmV3CiAgbGliY3VybCBvcHRpb24gQ1VSTE9QVF9IVFRQX1ZFUlNJT04gdG8gcmVxdWVzdCB0aGF0IGxpYmN1cmwgdXNlcyBIVFRQIDEuMAogIHJlcXVlc3RzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgdmVyc2lvbiAoMS4xKS4gSXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UKICByZWFsbHkgTVVTVCBkbyB0aGF0IGJlY2F1c2Ugb2YgYSBzaWxseSByZW1vdGUgc2VydmVyLgoKLSBSZW5hbWVkIHRoZSAnVGltZUNvbmQnIHR5cGVkZWYgaW4gY3VybC9jdXJsLmggdG8gdXNlIGEgJ2N1cmxfJyBwcmVmaXggYXMKICBhbGwgcHVibGljIGN1cmwtc3ltYm9scyBzaG91bGQuCgotIGxpYmN1cmwgbm93IGV4cGxpY2l0bHkgaWdub3JlcyB0aGUgU0lHUElQRSBzaWduYWwuCgpEYW5pZWwgKDggT2N0b2JlciAyMDAxKQotIEtldmluIFJvdGgncyBjaGFuZ2UgdG8gdGhlIGNvb2tpZS1qYXIgY29tbWVudCAoaW4gdGhlIHN0b3JlZCBmaWxlKSB3YXMKICBhcHBsaWVkLgoKLSBMdWNhcyBBZGFtc2tpJ3MgbWlub3IgYnVnIGluIHRoZSBiaW5kIGVycm9yIGNvZGUgZmFpbGYoKSB3YXMgZml4ZWQuCgpEYW5pZWwgKDUgT2N0b2JlciAyMDAxKQotIE1vb25lc2FteSBmaXhlZCB0aGUgQ3VybF9jb25uZWN0aG9zdCgpIGZ1bmN0aW9uIHRvIG5vdCBnaXZlIGNvbXBpbGVyIGVycm9ycwogIG9uIGEgYnVuY2ggb2YgY29tcGlsZXJzLCBkdWUgdG8gdGhlIGFyZ3VtZW50IG5hbWVkICdzb2NrZXQnLgoKLSBNb29uZXNhbXkgYWxzbyBwcm92aWRlZCB1cGRhdGVkIFZDKysgbWFrZWZpbGVzIGFuZCBwcm9qZWN0IGZpbGVzLgoKVmVyc2lvbiA3LjkuMS1wcmUyCgpEYW5pZWwgKDQgT2N0b2JlciAyMDAxKQotIEFsYmVydCBDaGluIHByb3ZpZGVkIGEgY29uZmlndXJlIHBhdGNoIHRoYXQgbWFrZXMgdGhlIHNjcmlwdCBkZXRlY3QgcHJvcGVyCiAgZ2V0aG9zdGJ5bmFtZV9yKCkgbWV0aG9kIHdpdGhvdXQgYWN0dWFsbHkgcnVubmluZyBhbnkgY29kZSwgb25seSBjb21waWxpbmcKICBpcyBuZWNlc3NhcnkuIFRoaXMgYWxzbyByZW1vdmVzIHRoZSBuZWVkIG9mIGhhdmluZyBhIHJlc29sdmluZyAnbG9jYWxob3N0JwogIG5hbWUuCgotIEZvdW5kIGFuZCByZW1vdmVkIG1lbW9yeSBsZWFrYWdlIChuYW1lIHJlc29sdmUgZGF0YSkgaW4gbGliY3VybCBvbgogIElQdjYtZW5hYmxlZCBob3N0cy4gVGhlc2UgY291bGQgc25lYWsgdGhyb3VnaCBiZWNhdXNlIHdlIGRpZG4ndCBoYXZlIGFueQogIHJlc291cmNlIHRyYWNpbmcgb24gdGhlIElQdjYtcmVsYXRlZCBmdW5jdGlvbnMuIFdlIGRvIG5vdy4KCkRhbmllbCAoMyBPY3RvYmVyIDIwMDEpCi0gS2VpdGggTWNHdWlnYW4gcGF0Y2hlZCBhd2F5IGEgKG1haW5seSBXaW5kb3dzLSkgcHJvYmxlbSB3aXRoIHRoZSBuYW1lCiAgcmVzb2x2ZXIgZGF0YSBiZWluZyBrZXB0IGluIHRoZSBzdGF0aWMgbWVtb3J5IGFyZWEsIHdoaWNoIGlzIHJlbW92ZWQgd2hlbiBhCiAgdGhyZWFkIGlzIGtpbGxlZC4gVGhlIGN1cmwgaGFuZGxlIGl0c2VsZiB0aG91Z2ggcGVyZmVjdGx5IGhhbmRsZXMgYmVpbmcKICBwYXNzZWQgYmV0d2VlbiB0aHJlYWRzLgoKLSBEaXJrIEVkZGVsYnVldHRlbCByZXBvcnRlZCBhbiBvZGQgYnVnIHRoYXQgdHVybmVkIG91dCB0byBiZSBoaXMgcHJveHkgdGhhdAogIHJlcXVpcmVkIGFuIEF1dGhvcml6YXRpb246IGhlYWRlci4gTm93LCBwcm94aWVzIGFyZSBub3Qgc3VwcG9zZWQgdG8gcmVxdWlyZQogIHRoYXQgaGVhZGVyLCB0aGF0IGlzIGZvciB0cnVlIHNlcnZlcnMuLi4KCi0gSSBhY2NpZGVudGFsbHkgcnVpbmVkIEdlb3JnJ3MgY3VybF9mb3JtYWRkKCkuIFVoLCBiYWQgbWUuIENvcnJlY3RlZCBub3cuCgpWZXJzaW9uIDcuOS4xLXByZTEKCkRhbmllbCAoMyBPY3RvYmVyIDIwMDEpCi0gR2VvcmcgSHVldHRlbmVnZ2VyIG9uY2UgYWdhaW4gbWFkZSBhbiBlZmZvcnQgYmV5b25kIHRoZSBjYWxsIG9mIGR1dHkgYW5kIG5vdAogIG9ubHkgaW1wcm92ZWQgdGhlIGN1cmxfZm9ybWFkZCgpIGZ1bmN0aW9uLCBidXQgYWxzbyB0b29rIGNhcmUgb2YgYWRqdXN0aW5nCiAgdGhlIGN1cmwgY29tbWFuZCBsaW5lIGNsaWVudCB0byB1c2UgdGhpcyBuZXcgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUKICBvYnNvbGV0ZWQgY3VybF9mb3JtcGFyc2UuCgpEYW5pZWwgKDIgT2N0b2JlciAyMDAxKQotIE1ham9yIGZpeCBpbiBob3cgbGliY3VybCBkb2VzIFRDUCBjb25uZWN0cy4gSXQgbm93IGRvZXMgbm9uLWJsb2NraW5nCiAgY29ubmVjdHMgdG8gZW5hYmxlIGdvb2QgdGltZW91dHMgd2l0aG91dCBzaWduYWxzLCBhbmQgaXQgbm93IHRyaWVzIGFsbCBJUAogIGFkZHJlc3NlcyBmb3IgYW55IGdpdmVuIGhvc3QgKGlmIGl0IHJlc29sdmVzIG1vcmUgdGhhbiBvbmUgYW5kIHRoZSBmaXJzdAogIG9uZShzKSBkb24ndCBjb25uZWN0KS4gQWRkZWQgYSBuZXcgc291cmNlIGZpbGUgJ2Nvbm5lY3QuYycgdG8gZGVhbCB3aXRoIGFsbAogIHRoZSBUQ1AgY29ubmVjdCBzdHVmZi4KCi0gV2Ugbm93IHN1cHBvcnQgSVB2NC1zdHlsZSBJUC1hZGRyZXNzZXMgaW4gcmZjMjczMi1mb3JtYXQsIHRvIGJldHRlciBzdXBwb3J0CiAgcGVvcGxlIHdyaXRpbmcgc2NyaXB0cyB3aXRob3V0IGtub3dpbmcgd2hhdCBhZGRyZXNzIHRoZXJlIGlzLgoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwMSkKLSBDbGVhbnVwcyBpbiB0aGUgRlRQIHNvdXJjZSBjb2RlLiBEaXZpZGVkIHRoZSBjb2RlIGludG8gZXZlbiBtb3JlIHNtYWxsZXIKICBmdW5jdGlvbnMgYW5kIGdlbmVyYWxseSB0cmllZCB0byBtYWtlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIElQdjQgYW5kIElQdjYKICBnZXQgbGVzcyBub3RpY2FibGUgaW4gdGhlIHNvdXJjZXMuCgotIElmIHRoZSByZW1vdGUgZmlsZSB0aW1lIGlzIG5vdCByZWFkYWJsZS9hY2Nlc3NhYmxlL3VuZGVyc3Rvb2QgYnkgbGliY3VybCwKICBsaWJjdXJsIG5vdyByZXR1cm5zIC0xIGluIHRoZSBDVVJMSU5GT19GSUxFVElNRSBkYXRhLCBub3QgMCBhcyBpdCBwcmV2aW91c2x5CiAgZGlkLiBUaGlzIHNob3VsZCBtYWtlIGN1cmwgbm90IHRvdWNoIHRoZSBmaWxlIGRhdGEgdW5sZXNzIHRoZXJlIHdhcyBhIGtub3duCiAgcmVtb3RlIGRhdGUgd2hlbiAtUiBpcyB1c2VkLgoKRGFuaWVsICgyNyBTZXB0ZW1iZXIgMjAwMSkKLSBXb3JraW5nIG9uIGdldHRpbmcgbm9uLWJsb2NraW5nIGNvbm5lY3RzIHdvcmtpbmcgcGxhdGZvcm0gaW5kZXBlbmRlbnQuIFdlCiAgd2lsbCBhbHNvIG1ha2UgY3VybCB0cnkgYWxsIElQcyBmb3IgYSBnaXZlbiBob3N0IGlmIHRoZSBmaXJzdCBvbmUgc2hvdWxkCiAgZmFpbC4KCkRhbmllbCAoMjYgU2VwdGVtYmVyIDIwMDEpCi0gS2V2aW4gUm90aCBwcm92aWRlZCBhIGNvb2tpZSBleGFtcGxlIHRoYXQgcHJvdmVkIHRoZSBjb29raWUgamFyCiAgZnVuY3Rpb25hbGl0eSB3YXNuJ3Qgd29ya2luZyBwcm9wZXJseS4gSSBhZGRlZCB0ZXN0IGNhc2UgNDYgYW5kIG1hZGUgaXQKICB3b3JrLgoKRGFuaWVsICgyNSBTZXB0ZW1iZXIgMjAwMSkKLSBK9nJuIEhhcnRyb3RoIHVwZGF0ZWQgdGhlIG1pbmd3MzIgbWFrZWZpbGVzLgoKVmVyc2lvbiA3LjkKCkRhbmllbCAoMjMgU2VwdGVtYmVyIDIwMDEpCi0gRm91bmQgYW5kIHJlbW92ZWQgYSAnc29ja2V0IGxlYWsnIHRoYXQgd291bGQgb2NjdXIgb24gSVB2NiBlbmFibGVkIGhvc3RzCiAgd2hlbiBGVFAgUkVUUiBmYWlsZWQuCgotIE1hZGUgdGhlIEZUUCB1cGxvYWQgdGVzdHMgcnVuIGZpbmUgb24gbWFjaGluZXMgd2l0aCBJUHY2IGVuYWJsZWQuCgpWZXJzaW9uIDcuOS1wcmU4CgpEYW5pZWwgKDE5IFNlcHRlbWJlciAyMDAxKQotIFZvanRlY2ggTWluYXJpayBzZXQgdXAgYSBzcGVjaWFsLXB1cnBvc2UgdGVzdCBzZXJ2ZXIgYW5kIHByb3ZpZGVkIG1lIHdpdGgKICB0ZXN0IGNlcnRpZmljYXRlcyBpbiBvcmRlciBmb3IgbWUgdG8gcmVwZWF0IHRoZSBidWcgcmVwb3J0cyAjNDQwMDY4IGFuZAogICM0NDAzNzMuIEl0IHR1cm5lZCBvdXQgd2UgZGlkbid0IGNoZWNrIGFsbCB0aGUgZXJyb3IgY29kZXMgcHJvcGVybHkuIFdlIGRvCiAgbm93LCBhbmQgY29ubmVjdGluZyB3aXRoIGEgdW5hY2NlcHRhYmxlIGNlcnRpZmljYXRlIHdpbGwgbWFrZSBsaWJjdXJsIGZhaWwKICB0byBjb25uZWN0IHdpdGggYW4gZXJyb3IgY29kZSByZXR1cm5lZC4KCi0gUmFtYW5hIE1va2thcGF0aSBmb3VuZCBhIGNhc2Ugd2hlbiB0aGUgTG9jYXRpb246IGZvbGxvd2luZyBjb2RlIGRpZCB3cm9uZy4KICBJIHdyb3RlIGEgdGVzdCBjYXNlIGZvciB0aGlzICg0NSkuCgpWZXJzaW9uIDcuOS1wcmU3CgpEYW5pZWwgKDE3IFNlcHRlbWJlciAyMDAxKQotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgZml4ZWQgdGVsbmV0IGZvciB3aW4zMi4gSXQgbWFrZXMgbGliY3VybCByZXF1aXJlCiAgd2luc29jayAyLjAuCgpWZXJzaW9uIDcuOS1wcmU2CgotIGxpYnRvb2wgMS40LjIgaXMgbm93IGluIHVzZSEKClZlcnNpb24gNy45LXByZTUKCkRhbmllbCAoMTQgU2VwdGVtYmVyIDIwMDEpCi0gQWRkZWQgYW5vdGhlciAxNCBmdHAgdGVzdHMuCgpEYW5pZWwgKDEzIFNlcHRlbWJlciAyMDAxKQotIEFkZGVkIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSB0byB0aGUgZWFzeS5oIGhlYWRlciBmaWxlLiBJdCBoYXMgbm93IGJlZW4KICB0ZXN0ZWQgYW5kIHByb3ZlZCB0byB3b3JrIGluIGEgcmVhbC13b3JsZCB0ZXN0cyBieSBUIEJoYXJhdGguIFdlIHN0aWxsIG5lZWQKICB0byB3cml0ZSB1cCBzb21lIGRvY3MgZm9yIHRoaXMgZnVuY3Rpb24uCgotIEFkZGVkIGZvdXIgbW9yZSBmdHAgdGVzdHMgdG8gdGhlIHRlc3Qgc3VpdGUuCgpEYW5pZWwgKDEyIFNlcHRlbWJlciAyMDAxKQotIENVUkxPUFRfU1NMX0NJUEhFUl9MSVNUIHdhcyBhZGRlZCwgYW5kIHRoZSBjdXJsIHRvb2wgb3B0aW9uIGlzIG5hbWVkCiAgLS1jaXBoZXJzLiBVc2UgdGhlbSB0byBzcGVjaWZ5IGEgbGlzdCBvZiBjaXBoZXJzIHRvIHVzZSBpbiB0aGUgU1NMCiAgY29ubmVjdGlvbi4KCi0gVC4gQmhhcmF0aCBmb3VuZCBhIG1lbW9yeSBsZWFrIGluIGxpYmN1cmwncyB3aW5kb3dzIHZlcnNpb24uIEl0IHR1cm5lZCBvdXQKICB0byBiZSB0aGUgbmV3IGR1cGhhbmRsZSgpIHRoYXQgZGlkbid0IHF1aXRlIHdvcmsgeWV0LgoKVmVyc2lvbiA3LjktcHJlNAoKRGFuaWVsICgxMSBTZXB0ZW1iZXIgMjAwMSkKLSBBZGRlZCB2ZXJib3NlIG91dHB1dCBmb3IgU1NMIGNvbm5lY3Rpb25zIHRoYXQgb3V0cHV0IHRoZSBzZXJ2ZXIKICBjZXJ0aWZpY2F0ZSdzIHN0YXJ0IGFuZCBleHBpcmUgZGF0ZXMuIEFzIHN1Z2dlc3RlZCBieSBQYXVsIEhhcnJpbmd0b24uCgotIEhlaWtraSBLb3JwZWxhIGZvdW5kIHByb2JsZW1zIGluIHRoZSBwZXJsIGZ0cCBzZXJ2ZXIgdXNlZCBmb3IgdGhlIHRlc3QKICBzdWl0ZSwgd2hlbiBoZSBydW5zIG9uIG9uIE9wZW5CU0Qgd2l0aCBwZXJsIDUuNi4gU29tZSBjaGFuZ2VzIGhhdmUgYmVlbgogIG1hZGUsIGJ1dCBub3RoaW5nIHJlYWxseSBjZXJ0YWluLgoKLSBULiBCaGFyYXRoIGhhcyBleHBlcmllbmNlZCBwcm9ibGVtcyB3aXRoIGxpYmN1cmwncyBzdGFjayB1c2FnZSBvbiB3aW5kb3dzCiAgYW5kIHdvcmtzIG9uIHJlZHVjaW5nIGl0LgoKRGFuaWVsICgxMCBTZXB0ZW1iZXIgMjAwMSkKLSBDcmlzIEJhaWxpZmYgZml4ZWQgdGhlIHBlcmwgaW50ZXJmYWNlLiBJdCBzdG9wcGVkIHdvcmtpbmcgc2luY2UgdGhlIGNoYW5nZWQKICBiZWhhdmlvciB3aXRoIFdSSVRFSEVBREVSIGFuZCBOVUxMIHBvaW50ZXJzLgoKLSBUaGUgIm91dHB1dCBjb29raWVzIiBmdW5jdGlvbiBjb3VsZCBkdW1wIGNvcmUgaWYgbm8gY29va2llcyB3ZXJlIGVuYWJsZWQuCgpEYW5pZWwgKDcgU2VwdGVtYmVyIDIwMDEpCi0gU00gcG9pbnRlZCBvdXQgdGhhdCB0aGUgU1NMIGNvZGUgZGlkbid0IGNvbXBpbGUgYW55IGxvbmdlciBpZiBTU0wgd2FzCiAgZGlzYWJsZWQuLi4gQWxzbywgd2UgbmVlZGVkIHRvIGNvcnJlY3QgdGhlICNpbmNsdWRlIGZvciB0aGUgdXRpbWUgc3R1ZmYgb24KICB3aW5kb3dzLgoKRGFuaWVsICg2IFNlcHRlbWJlciAyMDAxKQotIFQuIEJoYXJhdGggcG9pbnRlZCBvdXQgYSBmbGF3IGluIHRoZSBTU0wgc2Vzc2lvbiBjYWNoZSBjb2RlIHRoYXQgbWFkZSBpdAogIHNvbWV0aW1lcyByZWFkIGZyb20gYSBOVUxMIHBvaW50ZXIuCgpWZXJzaW9uIDcuOS1wcmUzCgpEYW5pZWwgKDMgU2VwdGVtYmVyIDIwMDEpCi0gQWRkZWQgdGhlIC1SLy0tcmVtb3RlLXRpbWUgb3B0aW9uLCB0aGF0IHVzZXMgdGhlIHJlbW90ZSBmaWxlJ3MgZGF0ZXN0YW1wIHRvCiAgc2V0IHRoZSBsb2NhbCBmaWxlJ3MgZGF0ZXN0YW1wLiBUaHVzLCB3aGVuIHlvdSBnZXQgYSByZW1vdGUgZmlsZSB5b3VyIGxvY2FsCiAgZmlsZSB3aWxsIGdldCB0aGUgc2FtZSB0aW1lIGFuZCBkYXRlLiBOb3RlIHRoYXQgdGhpcyBvbmx5IHdvcmtzIHdoZW4geW91IHVzZQogIC1vIG9yIC1PLgoKLSBJbnN0YWxsZWQgbGlidG9vbCAxLjQuMSwgbGlidG9vbGl6ZWQgYW5kIGV2ZXJ5dGhpbmcuCgpEYW5pZWwgKDEgU2VwdGVtYmVyIDIwMDEpCi0gSGVpa2tpIEtvcnBlbGEgcG9pbnRlZCBvdXQgdGhhdCBJIGRpZCBub3Qgc2hpcCB0aGUgcHJvcGVyIGxpYnRvb2wgc3R1ZmYgaW4KICB0aGUgcHJlLXJlbGVhc2VzLCBldmVuIHRob3VnaCB0aGF0IHdhcyBteSBpbnRlbnRpb24uIGxpYnRvb2xpemUgaGFzIG5vdwogIGJlZW4gcmUtcnVuLgoKLSBIZWlra2kgYWxzbyBwYXRjaGVkIGF3YXkgdGhlIGJhZCB1c2Ugb2YgJ21ha2UgLUMnIGluIHRoZSB0ZXN0IHN1aXRlCiAgbWFrZWZpbGUuIG1ha2UgLUMgaXMgbm90IHZlcnkgcG9ydGFibGUgYW5kIGlzIG5vdyBiYW5uZWQgZnJvbSBoZXJlLgoKVmVyc2lvbiA3LjktcHJlMgoKRGFuaWVsICgzMSBBdWd1c3QgMjAwMSkKLSBJIGp1c3QgbWFkZSBhIGh1Z2UgaW50ZXJuYWwgc3RydWN0IHJlaGF1bCwgYW5kIGFsbCB0aGUgYmlnIGludGVybmFsbHkgdXNlZAogIHN0cnVjdHMgaGF2ZSBiZWVuIHJlbmFtZWQsIHJlZGVzaWduZWQgYW5kIHN0dWZmIGhhdmUgYmVlbiBtb3ZlZCBhcm91bmQgYSBiaXQKICB0byBtYWtlIHRoZSBzb3VyY2UgZWFzaWVyIHRvIGZvbGxvdywgbW9yZSBsb2dpY2FsbHkgZ3JvdXBlZCBhbmQgdG8gaG9wZWZ1bGx5CiAgZGVjcmVhc2UgZnV0dXJlIGJ1Z3MuIEkgYWxzbyBob3BlIHRoYXQgdGhpcyB3aWxsIG1ha2UgbmV3IGZ1bmN0aW9ucyB0byBnZXQKICBlYXNpZXIgdG8gYWRkLCBhbmQgbWFrZSBpdCBsZXNzIGxpa2VseSB0aGF0IHdlIGhhdmUgYnVncyBsZWZ0IGxpa2UgdGhlIFVSTC0KICBmcmVlIGJ1ZyBmcm9tIEF1Z3VzdCAyMy4KClZlcnNpb24gNy45LXByZTEKCkRhbmllbCAoMjkgQXVndXN0IDIwMDEpCi0gVGhlIG5ldyBjb29raWUgY29kZSBoYXZlIGVuYWJsZWQgdGhlIGJyYW5kIG5ldyAnLWMvLS1jb29raWUtamFyJyBvcHRpb24uIFVzZQogIHRoYXQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIGluIHdoaWNoIHlvdSB3YW50IHRvIGhhdmUgYWxsIGNvb2tpZXMgY3VybAogIGtub3dzIG9mLCBkdW1wZWQgdG8uIEl0J2xsIGJlIHdyaXR0ZW4gdXNpbmcgdGhlIG5ldHNjYXBlIGNvb2tpZSBmb3JtYXQuCgogIFRoaXMgaXMgaW50ZXJuYWxseSBkb25lIHdpdGggdGhlIG5ldyBDVVJMT1BUX0NPT0tJRUpBUiBvcHRpb24gdG8gbGliY3VybCwKICB3aGljaCBpbiB0dXJuIGR1bXBzIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBjdXJsX2Vhc3lfY2xlYW51cCgpIGlzIGludm9rZWQuCiAgVGhlcmUgbWlnaHQgYmUgcmVhc29ucyB0byByZS1jb25zaWRlciBteSBjaG9pY2Ugb2YgcHV0dGluZyBpdCB0aGVyZS4gUGVyaGFwcwogIGl0IGlzIGJldHRlciBwbGFjZWQgdG8gZ2V0IGRvbmUganVzdCBiZWZvcmUgKl9wZXJmb3JtKCkgaXMgZG9uZS4gSXQgaXMgYWxsCiAgb2YgY291cnNlIGRlcGVuZGluZyBvbiBob3cgeW91IGd1eXMgd2FudCB0byB1c2UgdGhpcyBmZWF0dXJlLi4uCgotIEFkZGVkIGZ0cHVwbG9hZC5jIGluIHRoZSBzb3VyY2UgZXhhbXBsZXMgc2VjdGlvbiwgYmFzZWQgb24gc291cmNlIGNvZGUgcG9zdGVkCiAgYnkgRXJpY2sgTnV3ZW5kYW0uCgpEYW5pZWwgKDI4IEF1Z3VzdCAyMDAxKQotIE5vdyBydW5uaW5nIGxpYnRvb2wgQ1ZTIGJyYW5jaC0xLTQgdG8gZ2VuZXJhdGUgc3R1ZmYuIFNob3VsZCBmaXggcHJvYmxlbXMKICBvbiBPcGVuQlNEIGFuZCBob3BlZnVsbHkgb24gRnJlZUJTRCBhcyB3ZWxsIQoKLSBHZW9yZyBIdWV0dGVuZWdnZXIgbW9kaWZpZWQgdGhlIGN1cmxfZm9ybWFkZCgpIGZ1bmN0aW9uYWxpdHkgc2xpZ2h0bHksIGFuZAogIGFkZGVkIHN1cHBvcnQgZm9yIGVycm9yIGNvZGUgNDE3IHdoZW4gZG9pbmcgZm9ybSBwb3N0IGFuZCB1c2luZyB0aGUgRXhwZWN0OgogIGhlYWRlci4gR3JlYXQgd29yayEKCi0gTWFkZSBzb21lIHRlc3RzIHdpdGggY2FjaGVkIFNTTCBzZXNzaW9uIElEcywgYW5kIHRoZXkgc2VlbSB0byB3b3JrLiBUaGVyZQogIHNob3VsZCBiZSBhIHNpZ25pZmljYW50IHNwZWVkIGltcHJvdmVtZW50IGluIHRoZSBTU0wgY29ubmVjdGlvbiBwaGFzZSwgYnV0CiAgaW4gbXkgdGlueSB0ZXN0cyBpdCBqdXN0IGlzbid0IHBvc3NpYmxlIHRvIG5vdGljZSBhbnkgZGlmZmVyZW5jZS4gTGlrZSBvdGhlcgogIGNhY2hpbmcgaW4gbGliY3VybCwgeW91IG11c3QgcmV1c2UgdGhlIHNhbWUgaGFuZGxlIGZvciB0aGUgY2FjaGluZyB0byB0YWtlCiAgZWZmZWN0LiBTU0wgc2Vzc2lvbiBJRCBjYWNoaW5nIGlzIGRvbmUgb24gYSBwZXIgaG9zdC1uYW1lIGFuZCBkZXN0aW5hdGlvbgogIHBvcnQgbnVtYmVyIGJhc2lzLgoKICBTZXQgdmVyYm9zZSwgYW5kIHlvdSdsbCBnZXQgaW5mb3JtYXRpb25hbCB0ZXN0cyB3aGVuIGxpYmN1cmwgZGV0ZWN0cyBhbmQKICB1c2VzIGEgcHJldmlvdXMgU1NMIHNlc3Npb24gSUQuCgotIFVwZ3JhZGVkIHRvIGF1dG9tYWtlIDEuNSBvbiBteSBkZXZlbG9wbWVudC9yZWxlYXNlIG1hY2hpbmUuCgpEYW5pZWwgKDI3IEF1Z3VzdCAyMDAxKQotIFNsb3dseSBzdGFydGVkIHdyaXRpbmcgU1NMIHNlc3Npb24gSUQgY2FjaGluZyBjb2RlCgpEYW5pZWwgKDI0IEF1Z3VzdCAyMDAxKQotIFQuIEJoYXJhdGggcmVtb3ZlZCBjb21waWxlciB3YXJuaW5ncyBvbiB3aW5kb3dzIGFuZCB1cGRhdGVkIHRoZSBNUyBwcm9qZWN0CiAgZmlsZXMuCgotIEtldmluIFJvdGggcmVwb3J0ZWQgdHdvIGtpbmRzIG9mIGNvbW1hbmQgbGluZSBjb25zdHJ1Y3RzIHdpdGggdGhlIG5ldyAtRyB0aGF0CiAgY3VybCBkaWRuJ3QgcmVhbGx5IGRlYWwgd2l0aCB0aGUgd2F5IG9uZSB3b3VsZCBsaWtlLgoKLSBUaW0gQ29zdGVsbG8gcGF0Y2hlZCBhd2F5IGEgdXNlIG9mIHN0cmNhc2VjbXAoKSBpbiB0aGUgU1NMIGNvZGUuIFdlIGhhdmUgb3VyCiAgb3duIHBvcnRhYmxlIHZlcnNpb24gbmFtZWQgc3RyZXF1YWwoKSB0aGF0IHNob3VsZCBiZSB1c2VkIQoKLSBUaW0gYWxzbyBwb2ludGVkIG91dCBhIHByb2JsZW0gaW4gdGhlIGxpYi9NYWtlZmlsZS52YzYgZmlsZSB0aGF0IG1hZGUgaXQgbWl4CiAgZGVidWcgb2JqZWN0IG1vZHVsZXMgY2F1c2luZyBjb25mdXNpb25zLgoKRGFuaWVsICgyMyBBdWd1c3QgMjAwMSkKLSBULiBCaGFyYXRoIGFjY3VyYXRlbHkgZm91bmQgYSBsaWJjdXJsIGJ1ZyB0aGF0IHdvdWxkIGhhcHBlbiB3aGVuIGRvaW5nIGEKICBzZWNvbmQgaW52b2tlIG9mIGN1cmxfZWFzeV9wZXJmb3JtKCkgd2l0aCBhIG5ldyBVUkwgd2hlbiB0aGUgcHJldmlvdXMgaW52b2tlCiAgZm9sbG93ZWQgYSBMb2NhdGlvbjogaGVhZGVyLgoKLSBTdGFydGVkIHRoZSBpbXByb3ZlbWVudCB3b3JrIG9uIHRoZSBjb29raWUgZW5naW5lOgogIC0gTm93IGtlZXBzIGNvb2tpZXMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGNvb2tpZSBmaWxlCiAgLSBBIHdyaXRlIHRvIHRoZSBwb3NzaWJseSBzdGF0aWMgc3RyaW5nIHdhcyByZW1vdmVkCiAgLSBBZGRlZCBhIGZ1bmN0aW9uIHRoYXQgY2FuIG91dHB1dCBhbGwgY29va2llcwogIC0gTm93IHN1cHBvcnRzIHJlYWRpbmcgbXVsdGlwbGUgY29va2llIGZpbGVzCgotIFN0ZXZlIExob21tZSBjb3JyZWN0ZWQgYSBETEwgbmFtaW5nIGlzc3VlIGluIHRoZSBNU1ZDKysgcHJvamVjdCBmaWxlLgoKLSBTcGxpdCB1cCB0aGUgbW9uc3RlciBmdW5jdGlvbiBpbiBsaWIvZnRwLmMgdG8gdXNlIG1vcmUgc21hbGxpc2ggZnVuY3Rpb25zIHRvCiAgaW5jcmVhc2UgcmVhZGFiaWxpdHkgYW5kIG1haW50YWluYWJpbGl0eS4KCkRhbmllbCAoMjEgQXVndXN0IDIwMDEpCi0gR2VvcmcgSHVldHRlbmVnZ2VyJ3MgYmlnIHBhdGNoIHdhcyBhcHBsaWVkLiBOb3cgd2UgaGF2ZToKICBvICJFeHBlY3Q6IDEwMC1jb250aW51ZSIgc3VwcG9ydC4gV2Ugd2lsbCBmcm9tIG5vdyBvbiBzZW5kIHRoYXQgaGVhZGVyIGluCiAgICBhbGwgcmZjMTg2Ny1wb3N0cywgYXMgdGhhdCBtYWtlcyB1cyBhYm9ydCBtdWNoIGZhc3RlciB3aGVuIHRoZSBzZXJ2ZXIKICAgIHJlamVjdHMgb3VyIFBPU1QuIFBvc3Rpbmcgd2l0aG91dCB0aGUgRXhwZWN0OiBoZWFkZXIgaXMgc3RpbGwgcG9zc2libGUgaW4KICAgIHRoZSBzdGFuZGFyZCByZXBsYWNlLWludGVybmFsLWhlYWRlciBzdHlsZS4KICBvIGN1cmxfZm9ybWFkZCgpIGlzIGEgbmV3IGZvcm1wb3N0IGJ1aWxkaW5nIGZ1bmN0aW9uIHRoYXQgaXMgaW50cm9kdWNlZCB0bwogICAgcmVwbGFjZSB0aGUgbm93IGRlcHJlY2F0ZWQgY3VybF9mb3JtcGFyc2UoKSBmdW5jdGlvbi4gVGhlIGxhdHRlciBmdW5jdGlvbgogICAgd2lsbCBzdGlsbCBoYW5nIGFyb3VuZCBmb3IgYSB3aGlsZSwgYnV0IHRoZSBjdXJsX2Zvcm1hZGQoKSBpcyB0aGUgbmV3IHdheQogICAgYW5kIGNvcnJlY3Qgd2F5IHRvIGJ1aWxkIGZvcm0gcG9zdHMuCiAgbyBEb2N1bWVudGF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGVzZSBjaGFuZ2VzCgogIFRoZXNlIGNoYW5nZXMgYXJlIHJlYXNvbiBlbm91Z2ggdG8gbmFtZSB0aGUgbmV4dCBjdXJsIHJlbGVhc2UgNy45Li4uCgotIFdlIG5vdyBjb252ZXJ0IG1hbiBwYWdlcyB0byBIVE1MIHBhZ2VzIGFuZCBpbmNsdWRlIHRoZW0gaW4gdGhlIHJlbGVhc2UKICBhcmNoaXZlLiBGb3IgdGhlIHBsZWFzdXJlIG9mIGV2ZXJ5b25lIHdpdGhvdXQgbnJvZmYgd2l0aGluIHJlYWNoLgoKLSBBbmRy6XMgR2FyY+1hJ3Mgc3VnZ2VzdGVkIGZsdXNoaW5nIG9mIHRoZSBwcm9ncmVzcyBtZXRlciBvdXRwdXQgc3RyZWFtIHdhcwogIGFkZGVkLiBJdCBzaG91bGQgbWFrZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgbG9vayBiZXR0ZXIgb24gV2luZG93cy4KCi0gVHJveSBFbmdlbCBwb2ludGVkIG91dCBhIG1pc3Rha2UgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdGhhdCBtYWRlIGl0IGZhaWwKICBvbiBtYW55IFJlZCBIYXQgYm94ZXMhCgpEYW5pZWwgKDIwIEF1Z3VzdCAyMDAxKQotIFdlIG5lZWQgYW4gdXBkYXRlZCBsaWJ0b29sIHRvIG1ha2UgYSBiZXR0ZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIE9wZW5CU0QKICBhcyB3ZWxsIGFzIEZyZWVCU0QKClZlcnNpb24gNy44LjEKCkRhbmllbCAoMjAgQXVndXN0IDIwMDEpCi0gQnJhZCBwb2ludGVkIG91dCB0aGF0IHdlIHNoaXAgdHdvIGV4dHJhIGxpYnRvb2wgZmlsZXMgaW4gdGhlIHRhcmJhbGxzIHRoYXQKICB3ZSByZWFsbHkgZG9uJ3QgbmVlZCB0byEgUmVtb3ZpbmcgdGhlbSBtYWtlcyB0aGUgZ3otYXJjaGl2ZSBhYm91dCA2MEsKICBzbWFsbGVyIQoKLSBBbGJlcnQgQ2hpbiBicm91Z2h0IGZpeGVzIGZvciB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBkZXRlY3Qgc29ja2xlbl90CiAgcHJvcGVybHkgYXMgd2VsbCBhcyBtb3ZpbmcgbG90cyBvZiBvdXIgY3VzdG9tIGF1dG9jb25mIG1hY3JvcyB0bwogIGFjaW5jbHVkZS5tNC4KCkRhbmllbCAoMTkgQXVndXN0IDIwMDEpCi0gTW9vbmVzYW15IGltcHJvdmVkIGhpcyAtRyBmZWF0dXJlIGZvciBob3N0IG5hbWVzIG9ubHkgVVJMcy4uLgoKRGFuaWVsICgxNyBBdWd1c3QgMjAwMSkKLSBGaW5hbGx5IGNsZWFuZWQgdXAgdGhlIGtlcmJlcm9zIGNvZGUgdG8gdXNlIEN1cmxfIHByZWZpeGVzIG9uIGFsbCBnbG9iYWwKICBzeW1ib2xzIGFuZCB0byBub3QgdXNlIGdsb2JhbCB2YXJpYWJsZXMuCgpWZXJzaW9uIDcuOC4xLXByZTYKCkRhbmllbCAoMTYgQXVndXN0IDIwMDEpCi0gUy4gTW9vbmVzYW15IGFkZGVkIHRoZSAtRyBvcHRpb24gdG8gY3VybCwgdGhhdCBjb252ZXJ0cyB0aGUgZGF0YSBzcGVjaWZpZWQKICB3aXRoIC1kIHRvIGEgR0VUIHJlcXVlc3QuIERlZmF1bHQgYWN0aW9uIHdoZW4gdXNpbmcgLWQgaXMgUE9TVC4gV2hlbiAtRyBpcwogIHVzZWQsIHRoZSAtZCBzcGVjaWZpZWQgZGF0YSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBVUkwgd2l0aCBhICc/JwogIHNlcGFyYXRvci4gQXMgc3VnZ2VzdGVkIHByZXZpb3VzbHkgYnkgS2V2aW4gUm90aC4KCi0gY3VybC1jb25maWcgLS1saWJzIHNob3VsZCBub3cgZGlzcGxheSBhbGwgbGlua2VyIG9wdGlvbnMgcmVxdWlyZWQgdG8gbGluawogIHdpdGggbGliY3VybC4gSXQgaW5jbHVkZXMgdGhlIHBhdGggYW5kIG9wdGlvbnMgZm9yIGxpYmN1cmwgaXRzZWxmLgogIGN1cmwtY29uZmlnIC0tY2ZsYWdzIGRpc3BsYXlzIHRoZSBjb21waWxlciBvcHRpb24ocykgbmVlZGVkIHRvIGNvbXBpbGUKICBzb3VyY2UgZmlsZXMgdGhhdCB1c2UgbGliY3VybCBmdW5jdGlvbnMuIEJhc2ljYWxseSwgdGhhdCBzZXRzIHRoZSBpbmNsdWRlCiAgcGF0aCBjb3JyZWN0LgoKRGFuaWVsICgxNSBBdWd1c3QgMjAwMSkKLSBBcmthZGl1c3ogTWlza2lld2ljeiBwb2ludGVkIG91dCBhIG1pc3Rha2UgaW4gaG93IElQdjYtc3R5bGUgSVAtYWRkcmVzc2VzCiAgd2VyZSBwYXJzZWQgYW5kIHVzZWQuIChSRkMyNzMyLWZvcm1hdCkKCi0gQnVnICMxMjczMyBvdmVyIG9uIHBocC5uZXQgaWRlbnRpZmllZCBhIHByb2JsZW0gaW4gbGliY3VybCB0aGF0IG1hZGUgaXQgY29yZQogIGR1bXAgaWYgeW91IHVzZWQgQ1VSTE9QVF9QT1NUIHdpdGhvdXQgc2V0dGluZyBhbnkgZGF0YSB0byBwb3N0IHdpdGgKICBDVVJMT1BUX1BPU1RGSUVMRFMhIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlLiBOb3QgdXNpbmcgQ1VSTE9QVF9QT1NURklFTERTCiAgbm93IGVxdWFscyBzZXR0aW5nIGl0IHRvIG5vIGRhdGEgYXQgYWxsLgoKLSBSYW1hbmEgTW9ra2FwYXRpIHJlcG9ydGVkIHRoYXQgY3VybCB3aXRoICctdyAle2h0dHBfY29kZX0nIGRpZG4ndCB3b3JrCiAgcHJvcGVybHkgd2hlbiB1c2VkIGZvciBtdWx0aXBsZSBVUkxzIG9uIGEgc2luZ2xlIGNvbW1hbmQgbGluZS4gSW5kZWVkLCB0aGUKICB2YXJpYWJsZSB3YXMgbm90IHJlc2V0IGJldHdlZW4gdGhlIHJlcXVlc3RzLiBUaGlzIGlzIG5vdyBmaXhlZC4KCi0gRGF2aWQgSmFtZXMgZml4ZWQgdGhlIEJvcmxhbmQgbWFrZWZpbGUgc28gdGhhdCBsaWJjdXJsIHN0aWxsIGNvbXBpbGVzIGFuZAogIGJ1aWxkcyB3aXRoIHRoYXQgY29tcGlsZXIuCgpEYW5pZWwgKDE0IEF1Z3VzdCAyMDAxKQotIE9vcHMuIEkgcnVpbmVkIE5pY28ncyBzb2NrbGVuX3QgZGVmaW5lIGluIGNvbmZpZy12bXMuaCwgY29ycmVjdGVkIGl0IG5vdy4KCi0gQW4gb2xkZXIgaXRlbSBub3QgbWVudGlvbmVkIGhlcmUgYmVmb3JlOiBDVVJMX0dMT0JBTF9XSU4zMiBpcyBhIGRlZmluZSBmb3IKICB3aW5kb3dzIHVzZXJzIHRvIGN1cmxfZ2xvYmFsX2luaXQoKSwgdGhhdCBtYWtlcyBsaWJjdXJsIGluaXQgdGhlIHdpbnNvY2sKICBzdHVmZi4gSWYgbGliY3VybCBpcyBhbGwgc29ja2V0IHN0dWZmIHlvdSBkbywgdGhlbiBhbGxvd2luZyBpdCB0byBmaWRkbGUKICB3aXRoIHRoaXMgaXMgYSBjb21mb3J0YWJsZSBzaG9ydGN1dCB0byBmYW1lLgoKVmVyc2lvbiA3LjguMS1wcmU1CgpEYW5pZWwgKDE0IEF1Z3VzdCAyMDAxKQotIE5pY28gQmFnZ3VzIHByb3ZpZGVkIG1vcmUgZmVlZGJhY2sgZnJvbSBoaXMgVk1TIHBvcnRpbmcgZWZmb3J0cyBhbmQgYSBmZXcKICBtaW5vciBjaGFuZ2VzIHdlcmUgbmVjZXNzYXJ5LgoKLSBJIG1vZGlmaWVkIGNvbmZpZ3VyZS5pbiBzbyB0aGF0IC0tZW5hYmxlLWRlYnVnIHNldHMgbW9yZSBwaWNreSBnY2Mgb3B0aW9ucy4KICBJIHRoZW4gcmVtb3ZlZCBhbG1vc3QgYWxsIHRoZSBuZXcgd2FybmluZ3MgdGhhdCBhcHBlYXJlZCwgYW5kIGJ5IGRvaW5nIHNvIEkKICBjb3JyZWN0ZWQgdGhlIHNpemVfdC10cmVhdGVkLWFzLXNpZ25lZCBwcm9ibGVtIHRoYXQgaGFzIGJlZW4gZGlzY3Vzc2VkIG9uCiAgdGhlIG1haWxpbmcgbGlzdCBwcmV2aW91c2x5LiBJIGFsc28gcmVtb3ZlZCBhIGJ1bmNoIG9mIHRoZSBqdXN0IHJlY2VudGx5CiAgYWRkZWQgI2lmZGVmIFZNUyBsaW5lcy4KCi0gSSByZW1vdmVkIHRoZSB1c2Ugb2YgYSBnbG9iYWwgdmFyaWFibGUgaW4gdGhlIFNTTCBjb2RlLiBJdCB3YXMgb25jZQogIG5lY2Vzc2FyeSBidXQgaGFzbid0IGJlZW4gbmVlZGVkIHNpbmNlIE9wZW5TU0wgMC45LjQuIFRoZSBvbGQgY29kZSBzaG91bGQKICAoaG9wZWZ1bGx5KSBzdGlsbCB3b3JrIGlmIGxpYmN1cmwgaXMgYnVpbHQgYWdhaW5zdCBhbiBhbmNpZW50IHZlcnNpb24gb2YKICBPcGVuU1NMLgoKRGFuaWVsICgxMyBBdWd1c3QgMjAwMSkKLSBQZXRlciBUb2RkIHBvc3RlZCBhIHBhdGNoIHRoYXQgbm93IGFsbG93cyBub24tZmlsZSByYzE4Njctc3R5bGUgZm9ybSBwb3N0cwogIHRvIGJlIGxhcmdlciB0aGFuIDRLLgoKRGFuaWVsICgxMCBBdWd1c3QgMjAwMSkKLSBTLiBNb29uZXNhbXkgZml4ZWQgYnVncyBmb3IgYnVpbGRpbmcgZGVidWcgYW5kIFNTTCBsaWIgaW4gVkMgbWFrZWZpbGUKCkRhbmllbCAoOSBBdWd1c3QgMjAwMSkKLSBUaGUgcmVkaXJlY3RlZCBlcnJvciBzdHJlYW0gd2FzIGNsb3NlZCBiZWZvcmUgdGhlIGN1cmxfZWFzeV9jbGVhbnVwKCkgY2FsbAogIHdhcyBtYWRlLCBhbmQgd2hlbiBWRVJCT1NFIHdhcyBlbmFibGVkLCB0aGUgY2xlYW51cCBmdW5jdGlvbiB0cmllZCB0byB1c2UKICB0aGUgc3RyZWFtLiBJdCBjb3VsZCBsZWFkIHRvIGEgc2VnbWVudGF0aW9uIGZhdWx0LiBBbHNvLCB0aGUgc3RyZWFtIHdhcwogIGNsb3NlZCBldmVuIGlmIHdlIGxvb3BlZCB0byBnZXQgbW9yZSBmaWxlcy4gIENvcnJlY3RzIER1c3RpbiBCb3N3ZWxsJ3MgYnVnCiAgcmVwb3J0ICM0NDE2MTAKCi0gTm93IGdlbmVyYXRlcyB0aGUgcmVsZWFzZSBjb25maWd1cmUgc2NyaXB0IHdpdGggYXV0b2NvbmYgMi41MgoKVmVyc2lvbiA3LjguMS1wcmU0CgpEYW5pZWwgKDggQXVndXN0IDIwMDEpCi0gY3VybCAtRSB1c2VzIGEgY29sb24gdG8gc2VwYXJhdGUgYSBmaWxlIG5hbWUgZnJvbSBhIHBhc3NwaHJhc2UuIFRoaXMgdHVybmVkCiAgb3V0IHJlYWxseSBiYWQgZm9yIHRoZSB3aW5kb3dzIHBlb3BsZSB3aG8gd2FudHMgdG8gaW5jbHVkZSBhIGRyaXZlIGxldHRlciBpbgogIHRoZSBmaWxlIG5hbWUgbGlrZSAiYzpcY2VydC5wZW0iLiBUaGVyZSdzIG5vdyBhIHdpbjMyIHdvcmstYXJvdW5kCiAgaW1wbGVtZW50ZWQgdGhhdCB0cmllcyB3b3JrIGFyb3VuZCB0aGF0LCB3aGVuIHRoZSBjb2xvbiBzZWVtcyB0byBiZSB1c2VkIGZvcgogIHRoaXMga2luZCBvZiBjb25zdHJ1Y3QuCgotIFBhdHJpY2sgQmloYW4tRmFvdSBpbnRyb2R1Y2VkIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIHdoaWNoIG1ha2VzIGN1cmwKICB2ZXJpZnkgdGhlIHNlcnZlcidzIENOIGZpZWxkIHdoZW4gdGFsa2luZyBodHRwczovLy4gSWYgLS1jYWNlcnQgaXMgbm90IHVzZWQsCiAgYW55IGZhaWx1cmVzIGluIG1hdGNoaW5nIGlzIG9ubHkgZGlzcGxheWVkIGFzIGluZm9ybWF0aW9uICgtdikuCgpEYW5pZWwgKDcgQXVndXN0IDIwMDEpCi0gV3JvdGUgdXAgbmluZSBtb3JlIHRlc3QgY2FzZXMsIG1vcmUgb3IgbGVzcyBjb252ZXJ0ZWQgZnJvbSB0aGUgZm9ybWVyIHRlc3QKICBzdWl0ZS4KCkRhbmllbCAoNiBBdWd1c3QgMjAwMSkKLSBIZWlra2kgS29ycGVsYSBwb3N0ZWQgYSBwYXRjaCB0aGF0IG1ha2VzICdjdXJsLWNvbmZpZyAtLWxpYnMnIGluY2x1ZGUgdGhlCiAgZGlyZWN0b3J5IGluIHdoaWNoIGxpYmN1cmwgaXRzZWxmIGlzIGluc3RhbGxlZCBpbi4gV2hpbGUgdGhpcyB3YXNuJ3QgbXkKICBpbml0aWFsIGludGVudGlvbiB3aXRoIHRoaXMgb3B0aW9uLCBpdCBtYWtlcyBzZW5zZSBhbmQgbWFrZXMgbGlua2luZyB3aXRoCiAgbGliY3VybCBlYXNpZXIuCgotIFN0ZWZhbiBVbHJpY2ggcG9pbnRlZCBvdXQgdG8gdXMgdGhhdCBvdGhlciB0b29scyBhbmQgbGlicmFyaWVzIHRyZWF0IGZpbGU6Ly8KICBVUkxzIHdpdGggb25seSBvbmUgc2xhc2ggYWZ0ZXIgdGhlIGhvc3QgbmFtZSBzbGlnaGx5IGRpZmZlcmVudCB0aGFuIGxpYmN1cmwKICBkb2VzLiBTaW5jZSBhbGwgdGhlIG90aGVycyBzZWVtIHRvIGFncmVlLCB3ZSBiZXR0ZXIgZm9sbG93IHRoZW0uCgotIE5pY28gQmFnZ3VzIHByb3ZpZGVkIHVzIHdpdGggYSBodWdlIHNldCBvZiBmaXhlcyB0byBtYWtlIGN1cmwgY29tcGlsZSBhbmQKICBidWlsZCB1bmRlciBPcGVuVk1TLgoKVmVyc2lvbiA3LjguMS1wcmUzCgpEYW5pZWwgKDYgQXVndXN0IDIwMDEpCi0gSm9uYXRoYW4gSHNldSBub3RpY2VkIHRoYXQgeW91IGNvdWxkbid0IGdldCBhIGhlYWRlciBjYWxsYmFjayB1bmxlc3MgeW91CiAgc2V0IENVUkxPUFRfV1JJVEVIRUFERVIgdG8gbm9uLU5VTEwsIGV2ZW4gaWYgeW91IGRpZG4ndCBjYXJlIGFib3V0IHRoYXQKICBkYXRhLiBUaGlzIGlzIG5vdyBmaXhlZC4KCkRhbmllbCAoNSBBdWd1c3QgMjAwMSkKLSBTZXJnaW8gQmFsbGVzdHJlcm8gcHJvdmlkZWQgYSBwYXRjaCBmb3IgcmVhZGluZyByZXNwb25zZXMgZnJvbSBOQ1NBIGh0dHBkCiAgMS41Lnggc2VydmVycywgYXMgdGhleSByZXR1cm4gcmVhbGx5IHNjcmV3ZWQgdXAgcmVzcG9uc2UgaGVhZGVycyB3aGVuIGFza2VkCiAgZm9yIHdpdGggSFRUUCAxLjEuCgotIGN1cmxfZXNjYXBlKCkgbm8gbG9uZ2VyIHRyZWF0cyBhbHJlYWR5IGVuY29kZWQgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQKICBzdHJpbmcgZXNwZWNpYWxseS4KCkRhbmllbCAoMyBBdWd1c3QgMjAwMSkKLSBJIHJlcGxhY2VkIHRoZSBmb3JtZXIgbGliL2FycGFfdGVsbmV0LmggZmlsZSB3aXRoIG9uZSBJIHdyb3RlIG15c2VsZiwgdG8KICBhdm9pZCB0aGUgQlNEIGFubm91Y2VtZW50IGNsYXVzZSBvZiB0aGUgbGljZW5zZSBpbiB0aGUgZm9ybWVyIGZpbGUuCgotIEFuZHJldyBGcmFuY2lzIHByb3ZpZGVkIGEgbmV3IHZlcnNpb24gb2YgYmFzZTY0LmMgdG8gd29yayBhcm91bmQgdGhlIGxpY2Vuc2UKICBib2lsZXIgcGxhdGUgdGhhdCBjYW1lIHdpdGggdGhlIHByZXZpb3VzIG9uZS4gSSBwYXRjaGVkIGl0LCBidXQgdGhlIGdsb3J5CiAgc2hvdWxkIGdvIHRvIEFuZHJldyBmb3IgaGlzIGhlYWRzIHVwLgoKLSBUb21hc3ogTGFja2kgbm90aWNlZCB0aGF0IHdoZW4geW91IGRvIHJlcGVhdGVkIHRyYW5zZmVycyB3aXRoIGxpYmN1cmwgeW91CiAgY291bGRuJ3QgYWx3YXlzIHJlbGlhYmx5IGNoYW5nZSBIVFRQIHJlcXVlc3QuIFRoaXMgaGFzIG5vdyBiZWVuIGZpeGVkIGFuZCBhCiAgbmV3IGxpYmN1cmwgb3B0aW9uIHdhcyBhZGRlZDogQ1VSTE9QVF9IVFRQR0VULCB0aGF0IGNhbiBmb3JjZSB0aGUgSFRUUAogIHJlcXVlc3RyIChiYWNrKSB0byBHRVQuCgotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgcG9pbnRlZCBvdXQgdGhhdCBodHRwc3NlcnZlci5wbCB3YXNuJ3QgaW5jbHVkZWQgaW4KICByZWxlYXNlIGFyY2hpdmVzLiBJdCBzaG91bGQgYmUgbm93LgoKRGFuaWVsICgyIEF1Z3VzdCAyMDAxKQotIEZyYW5rIEtlZW5leSBwb2ludGVkIG91dCBhIG1hbnVhbCBtaXN0YWtlIGZvciBjZXJ0aWZpY2F0ZSBjb252ZXJ0aW9ucy4KCi0gVG9tYXN6IExhY2tpIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSBpbiB0aGUgdHJhbnNmZXIgbG9vcCB0aGF0IGNvdWxkIG1ha2UgdGhlCiAgc2VsZWN0KCkgbG9vcCB1c2UgZmFyIHRvbyBtdWNoIENQVS4KCi0gUGF3ZWwgQS4gR2FqZGEgcG9pbnRlZCBvdXQgYW4gb3V0cHV0IG1pc3Rha2UgZG9uZSB3aGVuIHVzaW5nIGxpYmN1cmwncwogIHByb2dyZXNzIGNhbGxiYWNrLgoKRGFuaWVsICgyOSBKdW5lIDIwMDEpCi0gTmF2ZWVuIE5vZWwgbm90aWNlZCB0aGF0IHRoZSBCb3JsYW5kIGxpYnJhcnkgbWFrZWZpbGUgd2Fzbid0IHVwZGF0ZWQuCgotIE5pYyBSb2V0cyBicm91Z2h0IGEgZml4IGZvciB0aGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIHdoZW4gdXNpbmcgU1NMLgoKRGFuaWVsICgyNyBKdW5lIDIwMDEpCi0gTWFkZSB0aGUgRlRQIHRlc3RzIHJ1biBPSyBldmVuIG9uIG1hY2hpbmVzIHJ1bm5pbmcgY3VybCBJUHY2LWVuYWJsZWQuCgotIFRyb3kgRW5nZWwgY29ycmVjdGVkIHNvbWUgUlBNIHBhY2thZ2UgZGV0YWlscy4KClZlcnNpb24gNy44LjEtcHJlMgoKRGFuaWVsICgyNSBKdW5lIDIwMDEpCi0gQmr2cm4gU3RlbmJlcmcgY29ycmVjdGx5IGlkZW50aWZpZWQgYSBwcm9ibGVtIHRoYXQgb2NjdXJyZWQgd2hlbiBkb3dubG9hZGluZwogIHNldmVyYWwgZmlsZXMgd2l0aCBjdXJsLCBhbmQgdXNpbmcgcmVzdW1lLiBUaGUgZmlyc3QgZmlsZSdzIHJlc3VtZSBpbmRleCB3YXMKICB0aGVuIHVzZWQgZm9yIGFsbCBmaWxlcywgcmVzdWx0aW5nIGluIHdlaXJkIHJlc3VsdHMuLi4KCi0gQW50b24gS2FsbXlrb3YgcHJvdmlkZWQgYSBmaXggdGhhdCBtYWtlcyBjdXJsIHdvcmsgd2l0aCBmb3JtIGZpZWxkIG5hbWVzCiAgd2l0aCBzcGFjZXMgbGlrZSB3aGVuIC1GIGlzIHVzZWQuCgpWZXJzaW9uIDcuOC4xLXByZTEKCkRhbmllbCAoMjAgSnVuZSAyMDAxKQotIE1pa2UgQnl0bmFyIHByb3ZpZGVkIGEgZmluZSByZXBvcnQgdGhhdCBwcm92ZWQgdGhhdCB0aGUgLS13aXRoLXNzbCBvcHRpb24KICBmb3IgY29uZmlndXJlIG5lZWRlZCB0d2Vha2luZy4gSXQgbm8gbG9uZ2VyIHNlYXJjaGVzIHRoZSBkZWZhdWx0IGRpcmVjdG9yaWVzCiAgZm9yIE9wZW5TU0wgbGlicyBvciBkaXJlY3RvcmllcyB3aGVuIGEgc3BlY2lmaWVkIHBhdGggaXMgZ2l2ZW4uCgpEYW5pZWwgKDE5IEp1bmUgMjAwMSkKLSBXaGVuIGFuIEZUUCB0cmFuc2ZlciBpcyBjdXQgb2ZmIGR1cmluZyB0cmFuc2ZlciwgY3VybCBjb3VsZCBwcmVzZW50IGEgdHJ1bHkKICBnYXJiYWdlZCBlcnJvciBtZXNzYWdlIGFuZCBpbiB3b3JzdCBjYXNlIGR1bXAgY29yZS4gVGhhbmtzIHRvIGRldGFpbGVkCiAgcmVwb3J0cyBmcm9tIFNoYXduIFBvdWxzb24gd2UgbmFpbGVkIHRoaXMuCgpEYW5pZWwgKDEyIEp1bmUgMjAwMSkKLSBTYWx2YWRvciBE4XZpbGEgcHJvdmlkZWQgYSBmaXggZm9yIEZUUCByYW5nZSBkb3dubG9hZHMuCgotIEFkZGVkIGEgZmV3IG1vcmUgdGVzdCBjYXNlcyBmcm9tIHRoZSBmb3JtZXIgdGVzdCBzdWl0ZSB0byB0aGUgbmV3IGZpbGUKICBmb3JtYXQuIFdlJ3JlIG5vdyBhdCBhIHRvdGFsIG9mIDI2IHRlc3RzLgoKRGFuaWVsICgxMSBKdW5lIDIwMDEpCi0gbGliY3VybCdzIHZlcnNpb24taW5mbyB3YXMgd3JvbmcsIGFzIG5vdGVkIGJ5IGJvdGggRG9tZW5pY28gQW5kcmVvbGkgYW5kCiAgRGF2aWQgT2Rpbi4KCkRhbmllbCAoNyBKdW5lIDIwMDEpCi0gSvZybiBmaXhlZCB0aGUgY3VybF91bmVzY2FwZSBkdXBsaWNhdGUgZW50cnkgaW4gbGliL2xpYmN1cmwuZGVmCgotIEkgbWFkZSBTU0wgY2VydGlmaWNhdGUgZmFpbHVyZSBtZXNzYWdlcyB0byBiZSBtb3JlIGRldGFpbGVkLgoKVmVyc2lvbiA3LjgKCkRhbmllbCAoNyBKdW5lIDIwMDEpCi0gU0RhdmlsYSBwcm92aWRlZCBhIHJlc3VtZWQgZG93bmxvYWQgZml4LgoKVmVyc2lvbiA3LjgtcHJlNAoKRGFuaWVsICgxIEp1bmUgMjAwMSkKLSBTdGVybGluZyBwcm92aWRlZCBzb21lIG5ldyBQSFAgZXhhbXBsZXMuCgotIENoYW5nZWQgdGhlIENWUyBoaWVyYXJjaHkgYW5kIHRoZSBvbGRlciBjaGVja291dCBpbnN0cnVjdGlvbiBkb2VzIG5vIGxvbmdlcgogIHdvcmsuIFdlIG1vdmVkIHRoZSBlbnRpcmUgc291cmNlIGNvZGUgaW50byBhIENWUyBtb2R1bGUgbmFtZWQgJ2N1cmwnLgoKRGFuaWVsICgzMSBNYXkgMjAwMSkKLSBDVVJMT1BUX01VVEUgZG9lcyBub3QgZXhpc3QgYW55bW9yZS4gSXQgaXMgc3RpbGwgcHJlc2VudCBpbiB0aGUgaW5jbHVkZSBmaWxlCiAgdG8gbm90IGNhdXNlIGNvbXBpbGVyIGVycm9ycyBmb3IgYXBwbGljYXRpb25zIHVzaW5nIGl0LCBidXQgaXQgaXNuJ3QgdXNlZAogIGFueXdoZXJlIGluIHRoZSBsaWJyYXJ5LgoKVmVyc2lvbiA3LjgtcHJlMwoKRGFuaWVsICgzMSBNYXkgMjAwMSkKLSBPbmNlIGFuZCBmb3IgYWxsIGZpeGVkIHRoZSBfUkVFTlRSQU5UIG1lc3MgZm9yIFNvbGFyaXMgY29tcGlsZXMgdG8gcHJlc2VudAogIGxlc3Mgd2FybmluZ3MuCgotIFN0ZXJsaW5nIEh1Z2hlcyB0aXJlbGVzc2x5IHBvaW50cyBvdXQgYW5kIGNvcnJlY3RzIG15IG1pc3Rha2VzLi4uISBTbywKICBjdXJsX2dsb2JhbF9pbml0KCkgbm93IGxldHMgdGhlIGFyZ3VtZW50IGZsYWdzICpTRVQqIHdoYXQgcGFydHMgdG8KICBpbml0LiBDVVJMX0dMT0JBTF9ERUZBVUxUIG1ha2VzIGEgbmljZSBkZWZhdWx0LCBDVVJMX0dMT0JBTF9BTEwgaW5pdHMgYWxsCiAga25vd24gc3Vic3lzdGVtcyBhbmQgQ1VSTF9HTE9CQUxfTk9ORSBpbml0cyBub3RoaW5nIG1vcmUgdGhhbiBhYnNvbHV0ZWx5CiAgbmVjZXNzYXJ5LiBNYW4gcGFnZSB1cGRhdGVkIGFjY29yZGluZ2x5LgoKLSBGaXhlZCB0aGUgc3RydG9rLmggaW5jbHVkZSBmaWxlIGFzIGl0IHdvdWxkbid0IGNvbXBpbGUgb24gYWxsIHBsYXRmb3JtcyEKCkRhbmllbCAoMzAgTWF5IDIwMDEpCi0gTWFkZSBsaWJjdXJsIGJ5IGRlZmF1bHQgYWN0IGFzIGlmIENVUkxPUFRfTVVURSBhbmQgQ1VSTE9QVF9OT1BST0dSRVNTIHdlcmUKICBzZXQgVFJVRS4gU2V0IHRoZW0gdG8gRkFMU0UgdG8gbWFrZSBsaWJjdXJsIG1vcmUgdGFsa2F0aXZlLiBUaGUgKl9NVVRFCiAgb3B0aW9uIGlzIHN1YmplY3QgZm9yIGNvbXBsZXRlIHJlbW92YWwuLi4KClZlcnNpb24gNy44LXByZTIKCkRhbmllbCAoMzAgTWF5IDIwMDEpCi0gQ3JpcyBCYWlsaWZmIHdyb3RlIGEgbWFrZWZpbGUgZm9yIGJ1aWxkaW5nIFNvbGFyaXMgcGFja2FnZXMuCgotIFN0ZXJsaW5nIEh1Z2hlcyBicm91Z2h0IGZpeGVzIGZvciAnYnVpbGRjb25mJyAodGhlIGJ1aWxkLWZyb20tQ1ZTIHRvb2wpIGFuZAogIHdlIGRpc2N1c3NlZCBhbmQgYWRkZWQgYSBmZXcgQ1VSTF9HTE9CQUxfKiBmbGFncyBpbiBpbmNsdWRlL2N1cmwuaAoKLSBLamV0aWwgSmFjb2JzZW4gcHJpdmF0ZWx5IGFubm91bmNlZCBoaXMgcHl0aG9uIGludGVyZmFjZSB0byBsaWJjdXJsLAogIGF2YWlsYWJsZSBhdCBodHRwOi8vcHljdXJsLnNvdXJjZWZvcmdlLm5ldC8KCkRhbmllbCAoMjkgTWF5IDIwMDEpCi0gU3RlcmxpbmcgSHVnaGVzIGZpeGVkIGEgc3RydG9rKCkgcHJvYmxlbSBpbiBsaWJjdXJsLiBJdCBpcyBub3QgYSB0aHJlYWQtCiAgc2FmZSBmdW5jdGlvbi4gTm93IGNvbmZpZ3VyZSBjaGVja3MgZm9yIGEgdGhyZWFkLXNhZmUgdmVyc2lvbiwgYW5kCiAgbGliL3N0cnRvay5jIG9mZmVycyBvbmUgZm9yIHRoZSBzeXN0ZW1zIHRoYXQgZG9uJ3QgY29tZSB3aXRoIG9uZSBpbmNsdWRlZCEKCi0gTWV0dGd1dCBKYW1hbGxhIGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IHRoZSAtIyBwcm9ncmVzcyBiYXIgd2FzIHdyaXR0ZW4KICB0byBzdGRlcnIgZXZlbiB0aG91Z2ggLS1zdGRlcnIgcmVkaXJlY3Rpb24gd2FzIHVzZWQuIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KCi0gSSBtb3ZlZCBvdXQgdGhlIGxpc3Qgb2YgY29udHJpYnV0b3JzIGZyb20gdGhlIGN1cmwuMSBtYW4gcGFnZSBhbmQgbWFkZSBhCiAgc2VwYXJhdGUgZG9jcy9USEFOS1MgZmlsZS4gSXQgbWFrZXMgdGhlIGxpc3QgZWFzaWVyIHRvIGZpbmQsIGFuZCBtYWRlIGl0CiAgZWFzaWVyIGZvciBtZSB0byBtYWtlIGEgc2VwYXJhdGUgd2ViIHBhZ2Ugd2l0aCB0aGF0IHNhbWUgaW5mb3JtYXRpb24uCgogIEkgcmVhbGx5IGRvIHdhbnQgYWxsIHlvdSBndXlzIG1lbnRpb25lZCBpbiB0aGVyZSB0byBmZWVsIHlvdSBnZXQgdGhlIGNyZWRpdAogIHlvdSBkZXNlcnZlLgoKLSBsaWIvZWFzeS5jIGRpZG4ndCBjb21waWxlIHByb3Blcmx5IGluIHRoZSA3LjgtcHJlMSBkdWUgdG8gYSBzaWxseSBtaXN0YWtlCgpWZXJzaW9uIDcuOC1wcmUxCgpEYW5pZWwgKDI4IE1heSAyMDAxKQotIGN1cmwtY29uZmlnIG5vdyBzdXBwb3J0cyAnLS12ZXJudW0nIHRoYXQgb3V0cHV0cyBhIHBsYWluIGhleGFkZWNpbWFsIHZlcnNpb24KICBvZiB0aGUgbGliY3VybCB2ZXJzaW9uIG51bWJlciAodXNpbmcgOCBiaXRzIGZvciBlYWNoIDMgbnVtYmVycykuIFZlcnNpb24KICA3LjcuNCBhcHBlYXJzIGFzIDA3MDcwNAoKLSBXcm90ZSBtYW4gcGFnZXMgZm9yIGN1cmxfZ2xvYmFsX2luaXQgYW5kIGN1cmxfZ2xvYmFsX2NsZWFudXAuLi4KCi0gVC4gQmhhcmF0aCBicm91Z2h0IG5ld3MgYWJvdXQgdGhlIHVzYWdlIG9mIHRoZSBPcGVuU1NMIGludGVyZmFjZSB0aGF0IHdhcwogIG5vdCBwcmV2aW91c2x5IHRha2VuIGludG8gY29uc2lkZXJhdGlvbiBhbmQgdGh1cyBjYXVzZWQgbGliY3VybCB0byBsZWFrCiAgbWVtb3J5LiAgVGhlIG9ubHkgc29tZXdoYXQgc2FuZSBhcHByb2FjaCB0byBmaXggdGhpcyBkaWxlbW1hLCBpcyBhZGRpbmcgdHdvCiAgdHdvIG5ldyBmdW5jdGlvbnMgY3VybF9nbG9iYWxfaW5pdCgpIGFuZCBjdXJsX2dsb2JhbF9jbGVhbnVwKCkgdGhhdCBzaG91bGQKICBiZSBjYWxsZWQgKk9OQ0UqIGJ5IHRoZSBhcHBsaWNhdGlvbiB1c2luZyBsaWJjdXJsLiBUaGUgaW5pdCBzaG91bGQgYmUgZG9uZQogIG9ubHkgYXQgc3RhcnR1cCwgbm8gbWF0dGVyIGhvdyBtYW55IHRocmVhZHMgdGhlIGFwcGxpY2F0aW9uIGlzIGdvbm5hIHVzZSwKICBhbmQgdGhlIGNsZWFudXAgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBoYXMgZmluaXNoZWQgdXNpbmcKICBsaWJjdXJsIGNvbXBsZXRlbHkuCgogICoqKiBVUEdSQURFIE5PVElDRSAqKioKCiAgSWYgeW91IHdyaXRlIGFwcGxpY2F0aW9ucyB1c2luZyBsaWJjdXJsLCB5b3UgcmVhbGx5IHdhbnQgdG8gdXNlIHRoZSB0d28KICBmdW5jdGlvbnMgbWVudGlvbmVkIGFib3ZlICEhIQoKICBJIGNhbid0IHNheSBJIHRoaW5rIHRoaXMgaXMgYSB2ZXJ5IGJlYXV0aWZ1bCBzb2x1dGlvbiwgYnV0IGFzIE9wZW5TU0wKICBpbnNpc3RzIG9uIG1ha2luZyBsb3RzIG9mIHN0dWZmIG9uIGEgImdsb2JhbCIgc2NvcGUsIHdlJ3JlIGZvcmNlZCB0byB3YWxrCiAgdGhlIHBhdGggdGhleSBwb2ludCB1cyB0by4KCi0gTW92aW5nIG1vcmUgdGVzdCBjYXNlcyBpbnRvIHRoZSBuZXcgZmlsZSBmb3JtYXQuCgpWZXJzaW9uIDcuNy40LXByZTMKCkRhbmllbCAoMjMgTWF5IDIwMDEpCi0gSW50cm9kdWNlZCBhIG5ldyBmaWxlIGZvcm1hdCBmb3Igc3RvcmluZyB0ZXN0IGNhc2VzLCBhbmQgdGh1cyBJIGhhZCB0bwogIG1vZGlmeSBhbGwgdGhlIHBlcmwgdGVzdCBzY3JpcHRzIGFuZCBtb3JlIChJIGFkZGVkIGEgbmV3IG9uZSkuIEkgaGF2ZSBub3QKICAicG9ydGVkIiBhbGwgdGhlIG9sZCB0ZXN0IGNhc2VzIHRvIHRoZSBuZXcgZm9ybWF0IHlldCwgYnV0IGl0J2xsIGNvbWUuCgogIFRoZSBtYWluIGFkdmFudGFnZSBvZiB0aGlzIG5ldyBmb3JtYXQgaXMgdGhhdCBhbGwgdGVzdCBkYXRhIGZvciBlYWNoIHRlc3QKICBjYXNlIGlzIHN0b3JlZCBpbiBhIHNpbmdsZSBmaWxlLiBJdCBnaXZlcyBhIGJldHRlciBvdmVydmlldyBmb3IgZWFjaCB0ZXN0CiAgY2FzZSBhbmQgYSBsb3QgbGVzcyBmaWxlcy4KCi0gQW5kculzIEdhcmPtYSBicm91Z2h0IGEgZml4IGZvciB0aGUgbmV0c2NhcGUvbW96aWxsYSBjb29raWUgZmlsZSBwYXJzaW5nCiAgZnVuY3Rpb24sIGFzIGl0IHR1cm5zIG91dCBpdCBkb2Vzbid0IGFsd2F5cyBzdG9yZSB0aGUgcGF0aCEKCkRhbmllbCAoMjIgTWF5IDIwMDEpCi0gQXMgd2FzIHJlcG9ydGVkIGFub255bW91c2x5LCB3aGVuIEZBSUxPTkVSUk9SIHdhcyB1c2VkLCB0aGUgaHR0cGNvZGUgd2FzCiAgbm90IHN0b3JlZCBwcm9wZXJseSBhbmQgdGh1cyB3YXNuJ3QgcG9zc2libHkgdG8gcmVhZCBhZnRlciBhIHRyYW5zZmVyIHdpdGgKICB0aGUgY3VybF9lYXN5X2dldGluZm8oKSBmdW5jdGlvbi4gVGhpcyBpcyBub3cgY29ycmVjdGVkLgoKLSBJbnN0YWxsZWQgYW5kIG1hZGUgdXNlIG9mIHRoZSBmb2xsb3dpbmcgdG9vbCB2ZXJzaW9uczoKICAgIGF1dG9jb25mIDIuNTAKICAgIGxpYnRvb2wgMS40CiAgICBhdXRvbWFrZSAxLjQtcDEKCiAgSSB3b3VsZG4ndCByZWNvbW1lbmQgYW55IGRldmVsb3BlciB0byB0cnkgdG8gZ2VuZXJhdGUgdGhpbmdzIHdpdGggb2xkZXIKICB2ZXJzaW9ucyB0aGFuIHRoZXNlLiBCdWlsZGluZyBmcm9tIENWUyB3aWxsIHByb2JhYmx5IG1vcmUgb3IgbGVzcyByZXF1aXJlCiAgYXQgbGVhc3QgdGhlc2UgdmVyc2lvbnMuCgogIEFzIGEgcmVzdWx0IG9mIHRoaXMsIHRoZSBjb25maWd1cmUgc2NyaXB0IGdyZXcgdG8gbW9yZSB0aGFuIGRvdWJsZSBpdHMKICBwcmV2aW91cyBzaXplIQoKICBBcmthZGl1c3ogTWlza2lld2ljeiBoZWxwZWQgbWUgYnkgcG9pbnRpbmcgb3V0IEkgaGFkIHRvIHJlbW92ZSBteQogIGFjaW5jbHVkZS5tNCBmaWxlIGJlZm9yZSBJIGNvdWxkIGdldCBpdCB3b3JraW5nIQoKRGFuaWVsICgyMSBNYXkgMjAwMSkKLSBJIG1hZGUgZnRwczovLyB3b3JrLiBBZGRlZCB0ZXN0IGNhc2UgNDAwIHRvIHRoZSByZWxlYXNlIGFyY2hpdmUsIGFzIHRoZQogIGZpcnN0IGZ0cHM6Ly8gdGVzdCBjYXNlLiBSZXF1aXJlcyBzdHVubmVsLgoKLSBBbHNvIG1hZGUgdGhlIHRlc3QgY2FzZXMgdGhhdCBydW5zIHNzbCB0ZXN0cyBub3QgcnVuIGlmIGxpYmN1cmwgaXNuJ3QgYnVpbHQKICB3aXRoIHNzbCBzdXBwb3J0LgoKRGFuaWVsICgxOSBNYXkgMjAwMSkKLSBNYWRlIHRoZSBjb25maWd1cmUgbm90IGFkZCBhbnkgZXh0cmEgLUwgTERGTEFHUyBvciAtSSBDUFBGTEFHUyB1bmxlc3MgdGhleQogIGFyZSBhY3R1YWxseSBuZWVkZWQuIEFsYmVydCBDaGluJ3MgYW5kIERvbWVuaWNvIEFuZHJlb2xpJ3Mgc3VnZ2VzdGlvbnMKICBoZWxwZWQgb3V0LgoKVmVyc2lvbiA3LjcuNC1wcmUyCgpEYW5pZWwgKDE4IE1heSAyMDAxKQotIE5pY2VyIGNvbmZpZ3VyZS1jaGVjayBmb3IgdGhlIE9wZW5TU0wgaGVhZGVycywgd2hpY2ggdGhlbiBzZXRzIHRoZSBwcm9wZXIKICB2YXJpYWJsZSB0byBoYXZlIGN1cmwtY29uZmlnIGJlIGdvb2QuIChBbGJlcnQgQ2hpbiBwcm92aWRlZCB0aGUgZml4KQoKLSBGb3Igc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgdGhlaXcgb3duICdzdHJsY2F0KCknIGxpYmN1cmwgcHJvdmlkZXMgaXRzIG93bi4KICBJdCB3YXMgbm93IHJlbmFtZWQgdG8gcHJldmVudCBjb2xsaWRlcyB3aXRoIG90aGVyIGxpYnMuIChBZnRlciBkaXNjdXNzaW9ucwogIHdpdGggU3RlcmxpbmcgSHVnaGVzIGFuZCB0aGUgaW1wbGljYXRpb25zIHRoaXMgaGFkIG9uIFBIUCBidWlsZHMuKQoKRGFuaWVsICgxNyBNYXkgMjAwMSkKLSBDb2xtIEJ1Y2tsZXkgcG9zdGVkIGEgZGV0YWlsZWQgYnVnIHJlcG9ydCBvbiAodGhlIGRlYmlhbml6ZWQpIDcuNy4zLCB0aGF0CiAgdHVybmVkIG91dCB0byBiZSBhIHByb2JsZW0gd2l0aCB0aGUgZGViaWFuLWJ1aWx0IDcuNy4zLXBhY2thZ2UgdGhhdAogIGNvbnRhaW5lZCBmaWxlcyBmcm9tIHRoZSA3LjcuMiByZWxlYXNlIQoKLSBJIGFkZGVkIHRoZSBDVVJMRV9BTFJFQURZX0NPTVBMRVRFIGFnYWluLCBidXQgd2l0aCBhIGZha2UgdmFsdWUsIGp1c3QgdG8KICBtYWtlIHByb2dyYW1zIHRoYXQgdXNlIGl0LCBub3QgZmFpbCB3aGVuIGNvbXBpbGluZyBhZ2FpbnN0IHRoaXMgdmVyc2lvbiBvZgogIGxpYmN1cmwuCgpEYW5pZWwgKDE0IE1heSAyMDAxKQotIFBhd2VsIEEuIEdhamRhIGZpeGVkIGEgcHJvYmxlbSB3aXRoIHJlc3VtZWQgdHJhbnNmZXJzIG9uIHJlLXVzZWQgcGVyc2lzdGVudAogIGNvbm5lY3Rpb25zLgoKVmVyc2lvbiA3LjcuNC1wcmUxCgpEYW5pZWwgKDE0IE1heSAyMDAxKQotIEp1bi1pY2hpcm8gaXRvanVuIEhhZ2lubyBmaXhlZCBGVFAgUE9SVCBmb3IgSVB2Ni1lbmFibGVkIGxpYmN1cmwuCgotIEFkZGVkIHRoZSBmaXJzdCBIVFRQUyB0ZXN0IHRvIHRoZSB0ZXN0IHN1aXRlIGluIHRoZSByZWxlYXNlIGFyY2hpdmUuCgpEYW5pZWwgKDEyIE1heSAyMDAxKQotIEp1a2thIFBpaGwgc3VnZ2VzdGVkIHRoYXQgaWYgKGxpYiljdXJsIGlzIHRvbGQgdG8gdmVyaWZ5IHRoZSBwZWVyJ3MKICBjZXJ0aWZpY2F0ZSBhbmQgdGhlIHBlZXIgY2FuJ3QgYmUgdmVyaWZpZWQsIGl0IHNob3VsZCBmYWlsIGFuZCByZXR1cm4gYQogIHByb3BlciBlcnJvciBjb2RlLiBJIGFkZGVkIGEgYnJhbmQgbmV3IGVycm9yIGNvZGUgbmFtZWQKICBDVVJMRV9TU0xfUEVFUl9DRVJUSUZJQ0FURSBmb3IgdGhpcyBwdXJwb3NlLgoKRGFuaWVsICgxMSBNYXkgMjAwMSkKLSBBcyB3YXMgZGlzY3Vzc2VkIHdpdGggRnJlZGVyaWMgTGVwaWVkIGEgd2hpbGUgYWdvLCBJIG5vdyBtYWRlIGxpYmN1cmwgbm90CiAgcmV0dXJuIGVycm9yIGV2ZW4gdGhvdWdoIG5vIGRhdGEgd2FzIHRyYW5zZmVyZWQgb24gdXBsb2FkL2Rvd25sb2FkIHJlc3VtZQogIHdoZW4gdGhlIG5vIHRyYW5zZmVyIGlzIG5lZWRlZC4gVGhlIENVUkxFX0FMUkVBRFlfQ09NUExFVEUgZXJyb3Igd2FzIHJlbW92ZWQKICBmcm9tIHRoZSBoZWFkZXIgZmlsZSB0byBtYWtlIGFueSBpbXBsZW1lbmF0b3IgdGhhdCB1c2VzIHRoYXQgdG8gYmUgYXdhcmUgb2YKICB0aGUgZmFjdCB0aGF0IGl0IGNhbid0IGJlIHJldHVybmVkIGFueW1vcmUhCgotIEltcHJvdmVkIGdlbmVyYWwgaGVhZGVyLXBhcnNpbmcgdG8gYmV0dGVyIGFsbG93IHdoaXRlIHNwYWNlcyBhbmQgbW9yZS4KCi0gUm9kbmV5IFNpbW1vbnMgcHJvdmVkIHRoZSBmaXggSSBkaWQgeWVzdGVyZGF5IHdhcyBiYWQgYW5kIEkgaGFkIHRvIHBvc3QKICBhbm90aGVyIG9uZS4KCi0gSW5nbyBXaWxrZW4gcGF0Y2hlZCBhd2F5IHR3byByZWRpcmVjdCBwcm9ibGVtcyBtb3JlIQoKRGFuaWVsICgxMCBNYXkgMjAwMSkKLSBDcmlzIEJhaWxpZmYgY29ycmVjdGx5IG5vdGVkIHRoYXQgdGhlIHNwYWNlLWFmdGVyLWhlYWRlciBwcm9ibGVtIHdpdGgKICBMb2NhdGlvbjogaXMgcHJlc2VudCBvbiBzZXZlcmFsIG90aGVyIHBsYWNlcyBpbiB0aGUgbGliY3VybCBzb3VyY2VzLgoKLSBJbmdvIFdpbGtlbiBwYXRjaGVkIGF3YXkgYSBwcm9ibGVtIGxpYmN1cmwgaGFkIHdoZW4gZm9sbG93aW5nIExvY2F0aW9uOgogIGhlYWRlcnMgd2l0aCBhbiBleHRyYSBzcGFjZSBhZnRlciB0aGUgY29sb24uCgotIFJvZG5leSBTaW1tb25zIGZvdW5kIG91dCB0aGF0IG11bHRpcGxlIEZUUCB0cmFuc2ZlcnMgZGlkIG5vdCB0cmVhdCByZWxhdGl2ZQogIGRpcmVjdG9yaWVzIGNvcnJlY3RseS4KCkRhbmllbCAoOSBNYXkgMjAwMSkKLSBHZXR0aW5nIGFuIEZUUCBmaWxlIHdpdGggQ1VSTE9QVF9OT0JPRFkgc2V0IChvciAtSSBmcm9tIHRoZSBjb21tYW5kIGxpbmUpLAogIG1ha2VzIGN1cmwgdXNlIHRoZSBub24tc3RhbmRhcmQgZnRwIGNvbW1hbmQgIlNJWkUiLiBJZiBpdCBmYWlsZWQsIGxpYmN1cmwKICByZXR1cm5lZCBlcnJvci4gU3RhcnRpbmcgbm93LCBpdCBqdXN0IGRvbid0IG91dHB1dCB0aGUgZmlsZSBzaXplIGluc3RlYWQuCiAgQW5vbnltb3VzIGJ1ZyByZXBvcnQuCgotIHN0dW5uZWwucG0gd2FzIGFjY2lkZW50YWxseSBsZWZ0IG91dCBmcm9tIHRoZSByZWxlYXNlIGFyY2hpdmUsIGl0IGlzIG5vdwogIGFkZGVkIChzdHVubmVsIGlzIG5lZWRlZCB0byBydW4gdGhlIGh0dHBzLXRlc3RzIGluIHRoZSB0ZXN0IHN1aXRlKQoKRGFuaWVsICg3IE1heSAyMDAxKQotIENvcnJlY3RlZCB0d28gbWlub3IgY29tcGlsZXIgd2FybmluZ3MgZHVlIHRvIHRoZSBGSUxFICogdG8gdm9pZCAqIGNvbnZlcnNpb24KICB0aGF0IEkgbWlzc2VkIGF0IHR3byBwbGFjZXMuIEr2cm4gSGFydHJvdGggYnJvdWdodCBtZSBwYXRjaGVzLiBTYW5kZXIgR2F0ZXMKICBmaWxlZCBhIGJ1ZyByZXBvcnQgb24gdGhpcy4KClZlcnNpb24gNy43LjMKCkRhbmllbCAoNCBNYXkgMjAwMSkKLSBBbGwgY2FsbGJhY2sgZnVuY3Rpb25zIG5vdyB0YWtlICd2b2lkIConIGluc3RlYWQgb2YgJ0ZJTEUgKicuIFRoaXMgaXMgbWFkZQogIHRoaXMgd2F5IHRvIG1ha2UgaXQgbW9yZSBvYnZpb3VzIHRvIHBlb3BsZSB0aGF0IGFueXRoaW5nIGNhbiBiZSBwYXNzZWQgdG8KICB0aGVtIChieSB1c2luZyB0aGUgYXByb3ByaWF0ZSBvcHRpb24pLiBBZnRlciBkaXNjdXNzaW9ucyB3aXRoIFN0ZXJsaW5nCiAgSHVnaGVzLgoKRGFuaWVsICgzIE1heSAyMDAxKQotIENyaXMgQmFpbGlmZiBmaXhlZCBhIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcgcHJvYmxlbSB3aXRoIHBlcnNpc3RlbnQKICBjb25uZWN0aW9uIHRoYXQgbWFkZSBsaWJjdXJsIGZhaWwgaWYgdGhlIHBlcnNpc3RlbnQgY29ubmVjdGlvbiB1c2VkIG1peGVkCiAgY2h1bmtlZCBhbmQgbm9uLWNodW5rZWQgdHJhbnNmZXJzLgoKLSBDcmlzIEJhaWxpZmYgZml4ZWQgYSBiYWQgdHJlYXRtZW50IG9mIDMwNC1yZXBsaWVzLCBhcyB0aGV5IHdvdWxkIG5vdCBiZQogIHRyZWF0ZWQgYXMgY29udGVudC1sZW5ndGggMCByZXBsaWVzIGJ1dCB3b3VsZCBjYXVzZSBhICJoYW5nIiB1bnRpbCB0aGUKICBzZXJ2ZXIgdGltZWQtb3V0IGFuZCBjbG9zZWQgdGhlIGNvbm5lY3Rpb24uCgotIEJyYWQgQnVyZGljayBmb3VuZCBhIG1pbm9yIHByb2JsZW0gaW4gdGhlIGRvY3MvZXhhbXBsZXMvTWFrZWZpbGUuYW0KCkRhbmllbCAoMjcgQXByaWwgMjAwMSkKLSBVcGRhdGVkIHRoZSBJTlRFUkFMUyBkb2N1bWVudCBhZ2Fpbi4gSXQgd2FzIGxhZ2dpbmcgYSBiaXQuIEkgdGhpbmsgSSBtYWRlIGl0CiAgbW9yZSBlYXN5IHRvIGZvbGxvdyBub3cgYXMgd2VsbC4KCi0gQnJhZCBCdXJkaWNrIGZvdW5kIGEgcHJvYmxlbSB3aXRoIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgd2hlbiBjdXJsIHJlY2VpdmVkCiAgYSAiQ29udGVudC1MZW5ndGg6IDAiIGhlYWRlci4KCi0gR2l1c2VwcGUgRCdBbWJyb3NpbyB3YXMgZmlyc3Qgb3V0IHRvIHJlcG9ydCB0aGF0IFRFTE5FVCBkb2Vzbid0IHdvcmsgaW4gY3VybAogIGNvbXBpbGVkL2J1aWx0IG9uIHdpbjMyLiBJdCBzZWVtcyB0byB3b3JrIGZvciB1bml4ZXMgdGhvdWdoIQoKLSBEYXZlIEhhbWlsdG9uIHJlcG9ydGVkIHdlaXJkIHByb2JsZW1zIHdpdGggQ1VSTC9QSFAgdGhhdCBJIHJlYWxseSBjYW4ndAogIGV4cGxhaW4gYXQgdGhlIG1vbWVudC4gSSdtIGhvcGluZyBvbiBzb21lIGhlbHAgZnJvbSB0aGUgUEhQIGNyZXcuCgpEYW5pZWwgKDI2IEFwcmlsIDIwMDEpCi0gSSByZXdyb3RlIHRoZSBGVFAgY29tbWFuZCByZXNwb25zZSBmdW5jdGlvbi4gSSBoYWQgdG8gZG8gaXQgdG8gbWFrZSBmdHBzCiAgd29yaywgYXMgdGhlIE9wZW5TU0wgcmVhZCgpLWZ1bmN0aW9uIGRpZG4ndCB3b3JrIHRoZSBzYW1lIHdheSB0aGUgbm9ybWFsCiAgdW5peCByZWFkKCkgZG9lcywgYnV0IGl0IHdhcyBhbHNvIGEgaHVnZSBwZXJmb3JtYW5jZSBib29zdC4gUHJldmlvdXNseSB0aGUKICBmdW5jdGlvbiByZWFkIG9uZSBieXRlIGF0IGEgdGltZSwgbm93IGl0IHJlYWRzIHZlcnkgbGFyZ2UgY2h1bmtzLCBhbmQgaXQKICBtYWtlcyBhIG5vdGFibGUgc3BlZWQgZGlmZmVyZW5jZS4KCkRhbmllbCAoMjUgQXByaWwgMjAwMSkKLSBDb25uZWN0aW9uIHJlLXVzZSB3aGVuIG5vdCB1c2luZyBhIHByb3h5IGRpZG4ndCB3b3JrIHByb3Blcmx5IGZvcgogIG5vbi1kZWZhdWx0IHBvcnQgbnVtYmVycy4KCkRhbmllbCAoMjQgQXByaWwgMjAwMSkKLSBJJ3ZlIG5vdGljZWQgdGhhdCBGVFBTIGRvZXNuJ3Qgd29yay4gV2UgYXR0ZW1wdCB0byB1c2Ugc3NsIGV2ZW4gZm9yIHRoZQogIGRhdGEgdHJhbnNmZXIsIHdoaWNoIGNhdXNlcyB0aGUgdHJhbnNmZXIgdG8gJ2hhbmcnLi4uIFdlIG5lZWQgdG8gZml4IHRoaXMuCgotIEltcHJvdmVkIHRoZSB0ZXN0IHN1aXRlIHRvIHVzZSAnc3R1bm5lbCcgdG8gZG8gSFRUUFMgYW5kIEZUUFMgdGVzdGluZyBvbgogIHRoZSBhbHJlZHkgd3JpdHRlbiBwZXJsIHNlcnZlcnMgZWFzaWx5LgoKRGFuaWVsICgyMyBBcHJpbCAyMDAxKQotIFRoZSBPcGVuU1NMIHZlcnNpb24gc3RyaW5nIHJlY2VudGx5IG1vZGlmaWVkIGRpZG4ndCB6ZXJvIHRlcm1pbmF0ZSBvbmUKICBvZiB0aGUgZ2VuZXJhdGVkIHN0cmluZ3MgcHJvcGVybHksIHdoaWNoIGNvdWxkIGxlYWQgdG8gYSBjcmFzaCBvciBzaW1wbHkKICB3ZWlyZCB2ZXJzaW9uIHN0cmluZyBvdXRwdXQhCgpWZXJzaW9uIDcuNy4yCgpEYW5pZWwgKDIyIEFwcmlsIDIwMDEpCi0gUm9zaW1pbGRvIGRhIFNpbHZhIHVwZGF0ZWQgdGhlIE1ha2VmaWxlcyBmb3IgQm9ybGFuZC9XaW5kb3dzLgoKLSBFcmljIFJhdXRtYW4gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGVudCBjb25uZWN0aW9ucyB0aGF0IHdvdWxkCiAgbGVhZCB0byBicm9rZW4gSG9zdDogaGVhZGVycyBpbiB0aGUgc2Vjb25kIEhUVFAgcmVxdWVzdC4KCkRhbmllbCAoMjAgQXByaWwgMjAwMSkKLSBBZGRlZCBtYW4gcGFnZXMgZm9yIHRoZSBjdXJsX3N0cmVxdWFsKCkgYW5kIGN1cmxfbXByaW50ZigpIGZhbWlsaWVzLiBXcm90ZQogIGEgJ2xpYmN1cmwgb3ZlcnZpZXcnIG1hbiBwYWdlLgoKLSBTcGVsbC1maXhlZCBzb21lIGRvY3VtZW50cy4KCi0gUy4gTW9vbmVzYW15IGNvcnJlY3RlZCBtaXN0YWtlcyBpbiB0aGUgbWFuIHBhZ2UuCgotIENyaXMgQmFpbGlmZiBmaXhlZCB0aGUgY3VybF9zbGlzdHMgb3B0aW9ucyBpbiB0aGUgcGVybCBpbnRlcmZhY2UsIHByZXNlbnQKICBzZXBhcmF0ZWx5IGluIHRoZSBDdXJsOjplYXN5IDEuMS40IHBhY2thZ2UuCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDEpCi0gTGludXMgTmllbHNlbiBGZWx0emluZyByZW1vdmVkIHRoZSBkZWNpbWFscyBmcm9tIHRoZSBzaXplIHZhcmlhYmxlcyBpbiB0aGUKICAtLXdyaXRlLW91dCBvdXRwdXQuIFdlIGhhcmRseSBldmVyIGdldCBmcmFjdGlvbiBvZiBieXRlcyEgOi0pCgpWZXJzaW9uIDcuNy4yLXByZTEKCkRhbmllbCAoMTkgQXByaWwgMjAwMSkKCi0gQWxiZXJ0IENoaW4gcHJvdmlkZWQgYSBjb25maWd1cmUgcGF0Y2ggZm9yIHRoZSBBQ19TWVNfTEFSR0VGSUxFIG1hY3JvLgoKRGFuaWVsICgxOCBBcHJpbCAyMDAxKQotIElucHV0IGZyb20gTWljaGFlbCBNZWFsbGluZyBtYWRlIG1lIGFkZCAtLWZlYXR1cmUgdG8gY3VybC1jb25maWcuIEl0CiAgZGlzcGxheXMgYSBsaXN0IG9mIGZlYXR1cmVzIHRoYXQgaGF2ZSBiZWVuIGJ1aWx0LWluIGluIHRoZSBjdXJyZW50CiAgbGliY3VybC4gVGhlIGN1cnJlbnRseSBhdmFpbGFibGUgZmVhdHVyZXMgdGhhdCBjYW4gYmUgbGlzdGVkIGFyZTogU1NMLCBLUkI0CiAgYW5kIElQdjYuCgotIEkgY29tbWl0dGVkIENyaXMgYW5kIEdlb3JnJ3MgcGVybCBpbnRlcmZhY2Ugd29yay4gVGhleSd2ZSBnb3QgY2FsbGJhY2tzCiAgd29ya2luZyBhbmQgb3B0aW9ucyB0aGF0IHJlY2VpdmVzIHRob3NlIHNsaXN0IHBvaW50ZXJzLgoKLSBQdW5lZXQgUGF3YWlhIGRldGVjdGVkIGEgcHJvYmxlbSB3aXRoIHJlc3VtZWQgZG93bmxvYWRzIHRoYXQgdXNlIHBlcnNpc3RlbnQKICBjb25uZWN0aW9ucyBhbmQgSSBtYWRlIGEgcmF0aGVyIGxhcmdlIHdyaXRldXAgdG8gY29ycmVjdCB0aGlzLiBJdCBpcwogIGltcG9ydGFudCB0aGF0IGFsbCBzZXNzaW9uLWRhdGEgaXMgc3RvcmVkIGluIHRoZSBjb25uZWN0ZGF0YSBzdHJ1Y3QgYW5kIG5vdAogIGluIHRoZSBtYWluIHN0cnVjdCBhcyB0aGlzIHByZXZpb3VzbHkgZGlkLgoKRGFuaWVsICgxNyBBcHJpbCAyMDAxKQotIEZyZWRlcmljIExlcGllZCBmaXhlZCBhIGZ0cCByZXN1bWVkIGRvd25sb2FkIHByb2JsZW0gYW5kIGludHJvZHVjZWQgYSBuZXcKICBlcnJvciBjb2RlIHRoYXQgbGV0cyBhcHBsaWNhdGlvbnMgYmUgYWJsZSB0byBkZXRlY3Qgd2hlbiBhIHJlc3VtZWQgZG93bmxvYWQKICBhY3R1YWxseSBkaWRuJ3QgZG93bmxvYWQgYW55dGhpbmcgc2luY2UgdGhlIHdob2xlIGZpbGUgaXMgYWxyZWFkeSBwcmVzZW50LgogIFNob3VsZCB0aGlzIHJldHVybiBPSyBpbnN0ZWFkPwoKLSBJIGFkZGVkICdjdXJsLWNvbmZpZy5pbicgdG8gdGhlIHJvb3QgZGlyIGFuZCBjb25maWd1cmUgc2NyaXB0LiBOb3csIGEKICBjdXJsLWNvbmZpZyBzY3JpcHQgaXMgbWFkZSB3aGVuIGN1cmwgaXMgYnVpbHQuIFRoZSBzY3JpcHQgY2FuIGJlIHVzZWQgdG8KICBmaWd1cmUgb3V0IGNvbXBpbGUgdGltZSBvcHRpb25zIHVzZWQgd2hlbiBsaWJjdXJsIHdhcyBidWlsdCwgd2hpY2ggaW4gdHVybgogIHNob3VsZCBiZSBvcHRpb25zIFlPVSBzaG91bGQgdXNlIHRvIGJ1aWxkIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBsaWJjdXJsLgoKICBUaGlzICotY29uZmlnIHN0eWxlIGlzIG5vdCBhIG5ldyBpZGVhLCBidXQgc29tZXRoaW5nIHRoYXQgaGFzIGJlZW4gdXNlZAogIHN1Y2Nlc3NmdWxseSBpbiBvdGhlciAobGlicmFyeSBiYXNlZCkgcHJvamVjdHMuCgotIFBoaWwgS2FybiBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgd3JvbmdseSBkaWQgbm90IGFsd2F5cyB1c2UgR01UIHRpbWUgem9uZQogIGZvciB0aGUgSWYtTW9kaWZpZWQtU2luY2Ugc3R5bGUgaGVhZGVycy4KCi0gR2VvcmcgU2Nod2FyeiBwb2ludGVkIG91dCBhbiBleHRyYSBuZWVkZWQgI2luY2x1ZGUgZmlsZSBuZWVkZWQgaW4gc3JjL21haW4uYwogIGZvciBjdXJsIHRvIGJ1aWxkIG9uIFVsdHJpeC4KCkRhbmllbCAoMTEgQXByaWwgMjAwMSkKLSBDcmlzIEJhaWxpZmYgcG9pbnRlZCBvdXQgdHdvIHByb2JsZW1zIHRoYXQgSSBjb3JyZWN0ZWQuIEZpcnN0LCBsaWJjdXJsJ3MgdXNlCiAgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEhUVFBfUFJPWFkgaW4gdXBwZXJjYXNlIG1heSBiZWNvbWUgYSBzZWN1cml0eQogIGhhemFyZCB3aGVuIHBlb3BsZSB1c2UgbGliY3VybCBpbiBhIHNlcnZlci9jZ2kgc2l0dWF0aW9uIHdoZXJlIHRoZSBzZXJ2ZXIKICBzZXRzIHRoZSBIVFRQXyotdmFyaWFibGVzIGFjY29yZGluZyB0byBpbmNvbWluZyBoZWFkZXJzIGluIHRoZSBIVFRQCiAgcmVxdWVzdC4gVGh1cywgYSAiUHJveHk6Ii1oZWFkZXIgd291bGQgc2V0IHRoYXQgZW52aXJvbm1lbnQgdmFyaWFibGUhCgogIFRoZW4sIGludm9raW5nIGN1cmxfZWFzeV9wZXJmb3JtKCkgd2l0aG91dCBoYXZpbmcgYW4gVVJMIHNldCBjYXVzZWQgYSBjcmFzaC4KCi0gUy4gTW9vbmVzYW15IGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2UgY3VybCB1c2Ugbm9uLWJsb2NraW5nIGNvbm5lY3RzIG9uCiAgd2luZG93cyB3aGVuIGNvbm5lY3Rpb24gdGltZW91dCBpcyBzZXQsIGFzIGl0IGFsbG93cyB3aW5kb3dzIHVzZXJzIHRvIHNldAogIHRoYXQgdGltZW91dCEKCi0gSGlyb3Rha2EgTWF0c3V5dWtpIHdyb3RlIGEgUnVieSBpbnRlcmZhY2UgdG8gbGliY3VybCEKCi0gQ3JpcyBCYWlsaWZmLCBGb3JyZXN0IENhaG9vbiBhbmQgR2VvcmcgSG9ybiB3b3JrIG9uIHRoZSBQZXJsIGludGVyZmFjZS4KCi0gSSd2ZSB3cml0dGVuIGEgZmlyc3Qgc2hvdCBhdCBhIEphdmEgaW50ZXJmYWNlIHRvIGxpYmN1cmwuIE1hbnkgdGhhbmtzIHRvCiAgRGFuaWVsIE1hcmVsbCBmb3IgdGlyZWxlc3NseSBhbnN3ZXJpbmcgdG8gYWxsIG15IGJhc2ljIEphdmEgcXVlc3Rpb25zLiBJdAogIHdvcmtzLCBidXQgaXQgaXMgc3RpbGwgdmVyeSBiYXNpYy4KCkRhbmllbCAoMTAgQXByaWwgMjAwMSkKLSBUaGUgcHJvZ3Jlc3MgZGlzcGxheSBjb3VsZCBnZXQgc2lsbHkgd2hlbiBkb2luZyBtdWx0aXBsZSBmaWxlIHRyYW5zZmVycywgYXMKICBpdCB3YXNuJ3QgcHJvcGVybHkgcmVzZXQgYmV0d2VlbiB0cmFuc2ZlcnMhCgotIERpc2N1c3Npb25zIHdpdGggQ3JpcyBCYWlsaWZmIHdobyB3cml0ZXMgYSBQZXJsIGludGVyZmFjZSB0byBsaWJjdXJsLCBtYWRlCiAgbWUgYWRkIENVUkxPUFRfSEVBREVSRlVOQ1RJT04uIEl0IGNhbiBiZSB1c2VkIHRvIHNldCBhIHNlcGFyYXRlIGNhbGxiYWNrCiAgZnVuY3Rpb24gZm9yIHdyaXRpbmcgaGVhZGVycy4gUHJldmlvdXNseSB5b3UgY291bGQgb25seSBzZXQgYSBkaWZmZXJlbnQgRklMRQogICogd2hlbiBoZWFkZXJzIGFyZSB3cml0dGVuIGZyb20gd2l0aGluIGxpYmN1cmwuCgpEYW5pZWwgKDcgQXByaWwgMjAwMSkKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIGEgcHJvYmxlbSBpbiBjdXJsX2VzY2FwZSgpIGFuZCBwb2ludGVkIG91dCBhIGZsYXcgaW4KICB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZS4KCkRhbmllbCAoNiBBcHJpbCAyMDAxKQotIEFkanVzdGVkIHRoZSB2ZXJzaW9uIGNvZGUgdG8gcHJvcGVybHkgZGlzcGxheSBPcGVuU1NMIDAuOS42YS4gVGhleSBzdXJlCiAgY2hhbmdlIHRoZWlyIHZlcnNpb24gZGVmaW5lIGZvcm1hdCBvZnRlbi4uLgoKLSBjdXJsX2Zvcm1mcmVlKCkgbm93IGFjY2VwdHMgYSBOVUxMIHBvaW50ZXIgd2l0aG91dCBjcmFzaGluZyEKClZlcnNpb24gNy43LjEKCkRhbmllbCAoMyBBcHJpbCAyMDAxKQotIFB1bmVldCBQYXdhaWEgcG9pbnRlZCBvdXQgdHdvIHNlcmlvdXMgcHJvYmxlbXMuIExpYmN1cmwgd291bGQgYXR0ZW1wdCB0bwogIHJlYWQgYmFkIG1lbW9yeSBkdXJpbmcgc2l0dWF0aW9ucyB3aGVuIGFuIChmdHApIGNvbm5lY3Rpb24gYXR0ZW1wdCBmYWlsZWQuCiAgQWxzbywgdGhlIGxpYi9NYWtlZmlsZS52YzYgd2FzIGNvcnJlY3RlZC4KCi0gTW9yZSBpbnZlc3RpZ2F0aW9ucyBpbiB0aGUgTG9jYXRpb246IGZvbGxvd2luZyBjb2RlIG1hZGUgbWUgcmVhbGl6ZSB0aGF0CiAgaXQgd2FzIG5vdCBjbGVhbiBlbm91Z2ggdG8gd29yayB0cmFuc3BhcmFudGx5IHdpdGggcGVyc2lzdGVudCBhbmQgbm9uLQogIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMuIEkgdGhpbmsgSSd2ZSBmaXhlZCBpdCBub3cuCgpEYW5pZWwgKDI5IE1hcmNoIDIwMDEpCi0gR2VvcmcgSG9ybiBtYWlsZWQgbWUgc29tZSBjb3JyZWN0aW9ucyBmb3IgdGhlIEN1cmw6OmVhc3kgcGVybCBpbnRlcmZhY2UuCgotIEV4cGVyaW1lbnRhbCBmdHBzOi8vIHN1cHBvcnQgYWRkZWQuIEl0IGlzIGJhc2ljYWxseSBGVFAgb3ZlciBTU0wgZm9yIHRoZQogIGNvbnRyb2wgY29ubmVjdGlvbi4gSXQgc3RpbGwgbWFrZXMgYWxsIGRhdGEgdHJhbnNmZXJzIGdvaW5nIG92ZXIgdW5lbmNyeXB0ZWQKICBjb25uZWN0aW9ucy4gUmFpbmVyIFdlaWt1c2F0J3MgZnRwZC1zc2wgc2VydmVyIGhhY2sgc3VwcG9ydHMgdGhpcyBhbmQgSSB1c2VkCiAgdGhhdCB0byB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgpEYW5pZWwgKDI3IE1hcmNoIDIwMDEpCi0gR3Vlbm9sZSBCZXNjb24gZGlzY292ZXJlZCB0aGF0IGlmIHlvdSBzZXQgYSBDVVJMT1BUX1RJTUVPVVQgYW5kIHRoZW4gdHJpZWQKICB0byBnZXQgYSBmaWxlIGZyb20gYSBzaXRlIGFuZCBpdCBmYWlscywgdGhlIFNJR0FMUk0gd291bGQgc3RpbGwgYmUgc2VudAogIGFmdGVyIHRoZSB0aW1lb3V0LXRpbWUsIHF1aXRlIGluZXhwZWN0ZWRseSEKCi0gSSBhZGRlZCBhbiBmdHAgdHJhbnNmZXIgZXhhbXBsZSB0byBkb2NzL2V4YW1wbGVzLyBhbmQgSSBhbHNvIHdyb3RlIGEgdGlueQogIGV4YW1wbGUgbWFrZWZpbGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIHN0YXJ0IHdoZW4gYnVpbGRpbmcgb25lIG9mIHRoZQogIGV4YW1wbGVzLgoKVmVyc2lvbiA3LjcuMS1iZXRhMQoKRGFuaWVsICgyNiBNYXJjaCAyMDAxKQotIE1vaGFtZWQgTHJoYXppIHJlcG9ydGVkIHByb2JsZW1zIHdpdGggNy42LjEgYW5kIHBlcnNpc3RlbnQgSFRUUC8xLjAKICBjb25uZWN0aW9ucyAod2hlbiB0aGUgc2VydmVyIHJlcGxpZWQgYSBDb25uZWN0aW9uOiBLZWVwLUFsaXZlKSBhbmQgdGhpcwogIHByb2JsZW0gd2FzIG5vdCBwcm9wZXJseSBkZWFsdCB3aXRoIGluIDcuNyBlaXRoZXIuIEEgcGF0Y2ggd2FzIHBvc3RlZCB0byB0aGUKICBjdXJsLWFuZC1waHAgbWFpbGluZyBsaXN0LgoKRGFuaWVsICgyNCBNYXJjaCAyMDAxKQotIENvbGluIFdhdHNvbiByZXBvcnRlZCBhYm91dCBhIHByb2JsZW0gYW5kIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCBpdCwKICB3aGljaCB3YXMgYWJvdXQgdGhlIG1hbiBwYWdlIGFuZCBsaW5lcyBzdGFydGluZyB3aXRoIGEgc2luZ2xlIHF1b3RlICgnKSBpbiBhCiAgd2F5IHRoYXQgZ25yb2ZmIGRvZXNuJ3QgbGlrZS4KCkRhbmllbCAoMjMgTWFyY2ggMjAwMSkKLSBQZXRlciBCcmF5IHJlcG9ydGVkIGNvcnJlY3RseSB0aGF0IHRoZSByb290IG1ha2VmaWxlIHVzZWQgbWFrZSBpbnN0ZWFkIG9mCiAgJChNQUtFKSBmb3IgdGhlIHRlc3QgdGFyZ2V0LgoKLSBDb3JyZWN0ZWQgdGhlIEN1cmw6OmVhc3kgcGVybCBpbnRlcmZhY2UgdG8gdXNlIGN1cmxfZWFzeV9zZXRvcHQoKSBhbmQgbm90CiAgY3VybF9zZXRvcHQoKSB3aGljaCB3YXMgcmVtb3ZlZCBpbiA3LjchCgotIFMuIE1vb25lc2FteSBwcm92aWRlZCB1cGRhdGVzIG9uIHRocmVlIGRvY3VtZW50cyAoTUFOVUFMLCBJTlNUQUxMIGFuZCBGQVEpLgoKLSBXaGVuIGZvbGxvd2luZyBhIExvY2F0aW9uOiwgbGliY3VybCB3b3VsZCBzb21ldGltZXMgd3JpdGUgdG8gdGhlIFVSTCBzdHJpbmcKICBpbiBhIHdheSBpdCBzaG91bGRuJ3QuIEFzIHRoZSBwb2ludGVyIGlzIHBhc3NlZC1pbiB0byBsaWJjdXJsIGZyb20gYW4KICBhcHBsaWNhdGlvbiwgd2UgY2FuJ3QgYmUgYWxsb3dlZCB0byB3cml0ZSB0byBpdC4gVGhlIHBhcnRpY3VsYXIgYnVnIHJlcG9ydAogIGZyb20gJ25rJyB0aGF0IGJyb3VnaHQgdGhpcyB1cCB3YXMgYmVjYXVzZSBoZSBoYWQgYSByZWFkLW9ubHkgVVJMIHRoYXQgdGhlbgogIGNhdXNlZCBhIGxpYmN1cmwgY3Jhc2ghCgotIE5vIGxvbmdlciByZWFkcyBIRUFEIHJlc3BvbnNlcyBsb25nZXIgdGhhbiB0byB0aGUgbGFzdCBoZWFkZXIuIFByZXZpb3VzbHksCiAgY3VybCB3b3VsZCByZWFkIHRoZSBmdWxsIHJlcGx5IGlmIHRoZSBjb25uZWN0aW9uIHdhcyBhICJjbG9zZSIgb25lLgoKLSBsaWJjdXJsIGRpZCByZS11c2UgY29ubmVjdGlvbnMgd2F5IHRvbyBtdWNoLiBEb2luZyAiY3VybAogIGh0dHA6Ly93d3cue21pY3Jvc29mdCxpYm19LmNvbSIgd291bGQgbWFrZSBpdCByZS11c2UgdGhlIGNvbm5lY3Rpb24gd2hpY2gKICBtYWRlIHRoZSBzZWNvbmQgcmVxdWVzdCByZXR1cm4gdmVyeSBvZGQgcmVzdWx0cy4KCkRhbmllbCAoMjIgTWFyY2ggMjAwMSkKLSBFZGluIEthZHJpYmFzaWMgbWFkZSBtZSBhd2FyZSB0aGF0IGN1cmwgc2hvdWxkIG5vdCByZS1zZW5kIFBPU1QgcmVxdWVzdHMKICB3aGVuIGZvbGxvd2luZyAzMDItcmVkaXJlY3RzLiBJIG1hZGUgMzAyIHdvcmsgbGlrZSAzMDMgd2hpY2ggbWVhbnMgY3VybCB1c2VzCiAgR0VUIGluIHRoZSBmb2xsb3dpbmcgcmVxdWVzdChzKS4KCi0gbGliY3VybCBub3cgcmVzZXQgdGhlICJmb2xsb3dlZC1sb2NhdGlvbiIgY291bnRlciBvbiBlYWNoIGludm9rZSBvZgogIGN1cmxfZWFzeV9wZXJmb3JtKCkgYXMgaXQgb3RoZXJ3aXNlIHdvdWxkIHN1bSB1cCBhbGwgcmVkaXJlY3RzIG9uIHRoZSBzYW1lCiAgY29ubmVjdGlvbiBhbmQgdGh1cyBjb3VsZCByZWFjaCB0aGUgbWF4cmVkaXJzIGNvdW50ZXIgd3JvbmdseS4KCi0gSmltIERyYXNoIHN1Z2dlc3RlZCBjdXJsX2VzY2FwZSgpIHNob3VsZCBub3QgcmUtZW5jb2RlIHdoYXQgYWxyZWFkeSBsb29rcwogIGxpa2UgYW4gZW5jb2RlZCBzZXF1ZW5jZSBhbmQgSSB0aGluayB0aGF0J3MgYSBmYWlyIHN1Z2dlc3Rpb24uCgpWZXJzaW9uIDcuNwoKRGFuaWVsICgyMiBNYXJjaCAyMDAxKQotIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBmYWlscyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgZ2V0aG9zdGJ5bmFtZV9yKCkgaXMKICBkZXRlY3RlZCBidXQgaXQgY291bGRuJ3QgZmlndXJlIG91dCBob3cgdG8gaW52b2tlIGl0ICh3aGF0IGFtb3VudCBvZgogIGFyZ3VtZW50cyBpdCBpcyBzdXBwb3NlZCB0byBnZXQpLiBSZXBvcnRzIGZyb20gQW5kculzIEdhcmPtYSBtYWRlIG1lIGF3YXJlCiAgb2YgdGhpcyBuZWVkLgoKLSBUYWxraW5nIHdpdGggSmltIERyYXNoIG1hZGUgbWUgZmluYWxseSBwdXQgdGhlIGN1cmxfZXNjYXBlIGFuZCBjdXJsX3VuZXNjYXBlCiAgZnVuY3Rpb25zIGluIHRoZSBjdXJsLmggaW5jbHVkZSBmaWxlIGFuZCB3cml0ZSBtYW4gcGFnZXMgZm9yIHRoZW0uIFRoZQogIGVzY2FwZSBmdW5jdGlvbiB3YXMgbW9kaWZpZWQgdG8gdXNlIHRoZSBzYW1lIGludGVyZmFjZSBhcyB0aGUgdW5lc2NhcGUgb25lCiAgaGFkLgoKLSBObyBidWcgcmVwb3J0cyBhdCBhbGwgb24gdGhlIGxhdGVzdCBiZXRhcy4gUmVsZWFzZSB0aW1lIGNvbWluZyB1cC4KClZlcnNpb24gNy43LWJldGE1CgpEYW5pZWwgKDE5IE1hcmNoIDIwMDEpCi0gR2VvcmcgT3R0aW5nZXIgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCB1c2luZyAtQyB0b2dldGhlciB3aXRoIC1MIGluIHRoZSBzZW5zZQogIHRoYXQgdGhlIC1DIGluZm8gZ290IGxvc3Qgd2hlbiBpdCB3YXMgcmVkaXJlY3RlZC4gSSBjb3VsZCBub3QgcmVwZWF0IHRoaXMKICBwcm9ibGVtIG9uIHRoZSA3LjcgYnJhbmNoIHdoeSBJIGxlYXZlIHRoaXMgZm9yIHRoZSBtb21lbnQuIFRlc3QgY2FzZSAzOSB3YXMKICBhZGRlZCB0byBkbyBleGFjdGx5IHRoaXMsIGFuZCBpdCBzZWVtcyB0byBkbyByaWdodC4KCi0gQ2hyaXN0aWFuIFJvYm90dG9tIFJlaXMgcmVwb3J0ZWQgaG93IGhpcyA3LjcgYmV0YSBkaWRuJ3Qgc3VjY2Vzc2Z1bGx5IGRvCiAgZm9ybSBwb3N0cyBhcyBlbGVnYW50bHkgYXMgNy42LjEgZGlkLiBJbmRlZWQsIHRoaXMgd2FzIGEgZmxhdyBpbiB0aGUgaGVhZGVyCiAgZW5naW5lLCBhcyBIVFRQIDEuMSBoYXMgaW50cm9kdWNlZCBhIG5ldyAxMDAgInRyYW5zaWVudCIgcmV0dXJuIGNvZGUgZm9yIFBVVAogIGFuZCBQT1NUIG9wZXJhdGlvbnMgdGhhdCBJIG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yLiBTZWN0aW9uIDguMi4zIGluIFJGQzI2MTYKICBoYXMgYWxsIHRoZSBkZXRhaWxzLiBTZWVtcyB0byB3b3JrIG5vdyEKCkRhbmllbCAoMTYgTWFyY2ggMjAwMSkKLSBBZnRlciBoYXZpbmcgZXhwZXJpZW5jZWQgYW5vdGhlciBtYWNoaW5lIGJyZWFrLWRvd24sIHdlJ3JlIGJhY2suCgotIEdlb3JnIEhvcm4ncyBwZXJsIGludGVyZmFjZSBDdXJsOjplYXN5IGlzIG5vdyBpbmNsdWRlZCBpbiB0aGUgY3VybCByZWxlYXNlCiAgYXJjaGl2ZS4gVGhlIHBlcmwvIGRpcmVjdG9yeSBpcyBub3cgcHJlc2VudC4gUGxlYXNlIGhlbHAgbWUgd2l0aCBkb2NzLAogIGV4YW1wbGVzIGFuZCB1cGRhdGVzIHlvdSB0aGluayBmaXQuCgotIE1hZGUgYSBuZXcgcGhwLyBkaXJlY3RvcnkgaW4gdGhlIHJlbGVhc2UgYXJjaGl2ZSBhbmQgbW92ZWQgdGhlIFBIUCBleGFtcGxlcwogIGludG8gYSBzdWJkaXJlY3RvcnkgaW4gdGhlcmUuIE5vdCBtdWNoIFBIUCBpbmZvIHlldCwgYnV0IEkgcGxhbiB0by4gUGxlYXNlCiAgaGVscCBtZSBoZXJlIGFzIHdlbGwhCgotIE1hZGUgbGliY3VybCByZXR1cm4gZXJyb3IgaWYgYSB0cmFuc2ZlciBpcyBhYm9ydGVkIGluIHRoZSBtaWRkbGUgb2YgYQogICJjaHVuayIuIEl0IGFjdHVhbGx5IGVuYWJsZXMgbGliY3VybCB0byBkaXNjb3ZlciBwcmVtYXR1cmUgdHJhbnNmZXIgYWJvcnRzCiAgZXZlbiBpZiB0aGUgQ29udGVudC1MZW5ndGg6IHNpemUgaXMgdW5rbm93bi4KCkRhbmllbCAoMTUgTWFyY2ggMjAwMSkKLSBBZGRlZCAtLWNvbm5lY3QtdGltZW91dCB0byBjdXJsLCB3aGljaCBzZXRzIHRoZSBuZXcgQ1VSTE9QVF9DT05ORUNUVElNRU9VVAogIG9wdGlvbiBpbiBsaWJjdXJsLiBJdCBsaW1pdHMgdGhlIHRpbWUgY3VybCBpcyBhbGxvd2VkIHRvIHNwZW5kIGluIHRoZQogIGNvbm5lY3Rpb24gcGhhc2UuIFRoaXMgZGlmZmVycyBmcm9tIC1tLy0tbWF4LXRpbWUgdGhhdCBsaW1pdHMgdGhlIGVudGlyZQogIGZpbGUgdHJhbnNmZXIgb3BlcmF0aW9uLiBSZXF1ZXN0ZWQgYnkgTGFycnkgRmFobm9lIGFuZCBvdGhlcnMuCgogIEkgYWxzbyB1cGRhdGVkIHRoZSBjdXJsLjEgYW5kIGN1cmxfZWFzeV9zZXRvcHQuMyBtYW4gcGFnZXMgYW5kIHJlbW92ZWQgdGhlCiAgaXRlbSBmcm9tIHRoZSBUT0RPLgoKVmVyc2lvbiA3LjctYmV0YTQKCkRhbmllbCAoMTQgTWFyY2ggMjAwMSkKLSBNYWRlIGN1cmwgZ3JvayBJUHY2IHdpdGggSFRUUCBwcm94aWVzIGFuZCBnb3QgZXZlcnl0aGluZyB0byBjb21waWxlIG5pY2VseQogIGFnYWluIHdoZW4gRU5BQkxFX0lQVjYgaXMgc2V0LgoKICBJIG5lZWQgdG8gcmVtYWtlIHRoaW5ncyBpbiB0aGUgdGVzdCBzdWl0ZS4gSSBjYW4ndCB0ZXN0IHRoZSBGVFAgcGFydHMgd2l0aAogIGN1cmwgYnVpbHQgZm9yIElQdjYgYXMgaXQgdXNlcyBhIGRpZmZlcmVudCBzZXQgb2YgRlRQIGNvbW1hbmRzIHRoZW4hCgotIEkgZmVsbCBvbnRvIGEgYnVnIHJlcG9ydCBvbiBwaHAubmV0IChwb3N0ZWQgYnkgTGFycyBUb3JiZW4gV2lsc29uKSB0aGF0IHdhcwogIGEgcmVwb3J0IG1lYW50IGZvciBvdXIgcHJvamVjdC4gQW55d2F5LCBpdCBzYWlkIHRoZSAubmV0cmMgcGFyc2luZyBkaWRuJ3QKICB3b3JrIGFzIHN1cHBvc2VkLCBhbmQgYXMgSSBhZ3JlZWQgd2l0aCBMYXJzLCBJIG1hZGUgdGhlIG5ldHJjIHBhcnNlciB1c2UKICBnZXRwd3VpZCgpIHRvIGZpZ3VyZSBvdXQgdGhlIGhvbWUgZGlyZWN0b3J5IG9mIHRoZSBlZmZlY3RpdmUgdXNlciBhbmQgdHJ5CiAgdGhhdCBuZXRyYy4gSXQgc3RpbGwgdXNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgSE9NRSBmb3IgdGhvc2UgdGhhdCBkb24ndAogIGhhdmUgdGhhdCBmdW5jdGlvbiBvciBpZiB0aGUgdXNlciBkb2Vzbid0IHJldHVybiB2YWxpZCBwd2QgaW5mby4KCi0gRWRpbiBLYWRyaWJhaWMgcG9zdGVkIGEgYnVnIHJlcG9ydCB3aGVyZSBoZSBnb3QgYSBjcmFzaCB3aGVuIGEgZmV0Y2ggd2l0aAogIHVzZXIrcGFzc3dvcmQgaW4gdGhlIFVSTCBmb2xsb3dlZCBhIExvY2F0aW9uOiB0byBhIHNlY29uZCBVUkwgKGFic29sdXRlLAogIHdpdGhvdXQgbmFtZStwYXNzd29yZCkuIFRoaXMgYnVnIGhhcyBiZWVuIGFyb3VuZCBmb3IgYSBsb25nIHdoaWxlIGFuZAogIGNyYXNoZXMgZHVlIHRvIGEgcmVhZCBhdCBhZGRyZXNzIHplcm8uIEZpeGVkIG5vdy4gV3JvdGUgdGVzdCBjYXNlIDM4LCB0aGF0CiAgdGVzdHMgdGhpcy4KCi0gTW9kaWZpZWQgdGhlIHRlc3Qgc3VpdGUncyBodHRwc2VydmVyIHNsaWdodGx5IHRvIGFwcGVuZCBhbGwgY2xpZW50IHJlcXVlc3QKICBkYXRhIHRvIGl0cyBsb2cgZmlsZSBzbyB0aGF0IHRoZSB0ZXN0IHNjcmlwdCBub3cgYmV0dGVyIGNhbiB2ZXJpZnkgYSByYW5nZQogIG9mIHJlcXVlc3RzIGFuZCBub3Qgb25seSB0aGUgbGFzdCBvbmUsIGFzIGl0IGRpZCBwcmV2aW91c2x5LgoKLSBVcGRhdGVkIHRoZSBjdXJsIG1hbiBwYWdlIHdpdGggLS1yYW5kb20tZmlsZSBhbmQgLS1lZ2QtZmlsZSBkZXRhaWxzLgoKVmVyc2lvbiA3LjctYmV0YTMKCkRhbmllbCAoMTQgTWFyY2ggMjAwMSkKLSBCavZybiBTdGVuYmVyZyBwcm92aWRlZCBzaW1pbGFyIGZpeGVzIGFzIEr2cm4gZGlkIGFuZCBzb21lIGFkZGl0aW9uYWwgcGF0Y2hlcwogIGZvciBub24tU1NMIGNvbXBpbGVzLgoKLSBJIGluY3JlYXNlZCB0aGUgaW50ZXJmYWNlIG51bWJlciBmb3IgbGliY3VybCBhcyBJJ3ZlIHJlbW92ZWQgdGhlIGxvdyBsZXZlbAogIGZ1bmN0aW9ucyBmcm9tIHRoZSBpbnRlcmZhY2UuIEkgYWxzbyB0b29rIHRoaXMgb3Bwb3J0dW5pdHkgdG8gcmVuYW1lIHRoZQogIEN1cmxfc3RyZXF1YWwgZnVuY3Rpb24gdG8gY3VybF9zdHJlcXVhbCBhbmQgQ3VybF9zdHJuZXF1YWwgdG8KICBjdXJsX3N0cm5lcXVhbCwgYXMgdGhleSdyZSBwdWJsaWMgbGliY3VybCBmdW5jdGlvbnMgKGV2ZW4gaWYgdGhleSdyZSBzdGlsbAogIHVuZG9jdW1lbnRlZCkuCgogIFRoaXMgd2lsbCBtYWtlIG9sZGVyIHByb2dyYW1zIG5vdCBjYXBhYmxlIG9mIHVzaW5nIHRoZSBuZXcgbGliY3VybCB3aXRoCiAganVzdCBhIGRyb3AtaW4gcmVwbGFjZW1lbnQuCgotIEr2cm4gSGFydHJvdGggdXBkYXRlZCBzdHVmZiBmb3Igd2luMzIgY29tcGlsZXM6CiAgbyBjb25maWctd2luMzIuaCB3YXMgZml4ZWQgZm9yIHNvY2tsZW5fdAogIG8gbGliL3NzbHVzZS5jIGhhZCBhIGJhZCAjZW5kaWYgcGxhY2VtZW50CiAgbyBsaWIvZmlsZS5jIHdhcyBtYWRlIHRvIGNvbXBpbGUgb24gd2luMzIgYWdhaW4KICBvIGxpYi9NYWtlZmlsZS5tMzIgd2FzIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IGZpbGVzCiAgbyBsaWIvbGliY3VybC5kZWYgbWF0Y2hlcyB0aGUgY3VycmVudCBpbnRlcmZhY2Ugc3RhdGUKCkRhbmllbCAoMTMgTWFyY2ggMjAwMSkKLSBJdCBvbmx5IHRvb2sgYW4gaG91ciBvciBzbyBiZWZvcmUgSvZybiBIYXJ0cm90aCBmb3VuZCBhIHByb2JsZW0gaW4gdGhlCiAgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZy4gR2l2ZW4gaGlzIGZpbmUgZXhhbXBsZS1zaXRlLCBJIGNvdWxkIGVhc2lseSBzcG90CiAgdGhlIHByb2JsZW0gYW5kIHdoZW4gSSByZS1yZWFkIHRoZSBzcGVjICh0aGUgcGFydCBJIGhhdmUgcGFzdGVkIGluIHRoZSB0b3AKICBvZiB0aGUgaHR0cF9jaHVua3MuaCBmaWxlKSwgSSByZWFsaXplZCBJIGhhZCBtYWRlIG15IHN0YXRlLW1hY2hpbmUgc2xpZ2h0bHkKICB3cm9uZyBhbmQgZGlkbid0IGV4cGVjdC9oYW5kbGUgdGhlIHRyYWlsaW5nIENSTEYgdGhhdCBjb21lcyBhZnRlciB0aGUgZGF0YQogIGluIGVhY2ggY2h1bmsgKGFuZCB0aG9zZSBleHRyYSB0d28gYnl0ZXMgc3VyZSBmZWVsIHdhc3RlZCkuCgogIEhhZCB0byBtb2RpZnkgdGVzdCBjYXNlIDM0IHRvIG1hdGNoIHRoaXMgYXMgd2VsbC4KClZlcnNpb24gNy43LWJldGEyCgpEYW5pZWwgKDEzIE1hcmNoIDIwMDEpCi0gQWRkZWQgdGhlIHBvbGljeSBzdHVmZiB0byB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZSBmb3IgdGhlIHR3byBzdXBwb3J0ZWQKICBwb2xpY2llcy4KCi0gSW1wbGVtZW50ZWQgc29tZSBzdXBwb3J0IGZvciB0aGUgQ1VSTE9QVF9DTE9TRVBPTElDWSBvcHRpb24uIFRoZSBwb2xpY2llcwogIENVUkxDTE9TRVBPTElDWV9MRUFTVF9SRUNFTlRMWV9VU0VEIGFuZCBDVVJMQ0xPU0VQT0xJQ1lfT0xERVNUIGFyZSBub3cKICBzdXBwb3J0ZWQsIGFuZCB0aGUgImxlYXN0IHJlY2VudGx5IHVzZWQiIGlzIHVzZWQgYXMgZGVmYXVsdCBpZiBubyBwb2xpY3kKICBpcyBjaG9zZW4uCgpEYW5pZWwgKDEyIE1hcmNoIDIwMDEpCi0gQWRkZWQgQ1VSTE9QVF9SQU5ET01fRklMRSBhbmQgQ1VSTE9QVF9FR0RTT0NLRVQgdG8gbGliY3VybCBmb3Igc2VlZGluZyB0aGUKICBTU0wgcmFuZG9tIGVuZ2luZS4gVGhlIHJhbmRvbSBzZWVkaW5nIHN1cHBvcnQgd2FzIGFsc28gYnJvdWdodCB0byB0aGUgY3VybAogIGNsaWVudCB3aXRoIHRoZSBuZXcgb3B0aW9ucyAtLXJhbmRvbS1maWxlIDxmaWxlPiBhbmQgLS1lZ2QtZmlsZSA8ZmlsZT4uIEkKICBuZWVkIHNvbWUgcGVvcGxlIHRvIHJlYWxseSB0ZXN0IHRoaXMgdG8ga25vdyB0aGV5IHdvcmsgYXMgc3VwcG9zZWQuIFJlbWVtYmVyCiAgdGhhdCBsaWJjdXJsIG5vdyBpbmZvcm1zIChpZiB2ZXJib3NlIGlzIG9uKSBpZiB0aGUgcmFuZG9tIHNlZWQgaXMgY29uc2lkZXJlZAogIHdlYWsgKEhUVFBTIGNvbm5lY3Rpb25zKS4KCi0gTWFkZSB0aGUgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZyBlbmdpbmUgZGV0ZWN0ZWQgYmFkIGZvcm1hdHRlZCBkYXRhIGxlbmd0aAogIGFuZCByZXR1cm4gZXJyb3IgaWYgc28gKHdlIGNhbid0IHBvc3NpYmx5IGV4dHJhY3Qgc2Vuc2libGUgZGF0YSBpZiB0aGlzIGlzCiAgdGhlIGNhc2UpLiBBZGRlZCBhIHRlc3QgY2FzZSB0aGF0IGRldGVjdHMgdGhpcy4gTnVtYmVyIDM2LiBOb3cgdGhlcmUgYXJlIDYwCiAgdGVzdCBjYXNlcy4KCi0gQWRkZWQgNSBuZXcgbGliY3VybCBvcHRpb25zIHRvIGN1cmwvY3VybC5oIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUKICBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gc3VwcG9ydCBpbiBsaWJjdXJsLiBUaGV5J3JlIGFsc28gZG9jdW1lbnRlZCAoZmFpcmx5CiAgdGhvcm91Z2hseSkgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQuMyBtYW4gcGFnZS4gVGhyZWUgb2YgdGhlbSBhcmUgbm93CiAgaW1wbGVtZW50ZWQsIGFsdGhvdWdoIG5vdCByZWFsbHkgdGVzdGVkIGF0IHRoaXMgcG9pbnQuLi4gQW55d2F5LCB0aGUgbmV3CiAgaW1wbGVtZW50ZWQgb3B0aW9ucyBhcmUgbmFtZWQgQ1VSTE9QVF9NQVhDT05ORUNUUywgQ1VSTE9QVF9GUkVTSF9DT05ORUNULAogIENVUkxPUFRfRk9SQklEX1JFVVNFLiBUaGUgb25lcyBzdGlsbCBsZWZ0IHRvIHdyaXRlIGNvZGUgZm9yIGFyZToKICBDVVJMT1BUX0NMT1NFUE9MSUNZIGFuZCBpdHMgcmVsYXRlZCBvcHRpb24gQ1VSTE9QVF9DTE9TRUZVTkNUSU9OLgoKLSBNYWRlIGN1cmwgKHRoZSBhY3R1YWwgY29tbWFuZCBsaW5lIHRvb2wpIHVzZSB0aGUgbmV3IGxpYmN1cmwgNy43IHBlcnNpc3RlbnQKICBjb25uZWN0aW9uIHN1cHBvcnQgYnkgcmUtdXNpbmcgdGhlIHNhbWUgY3VybCBoYW5kbGUgZm9yIGV2ZXJ5IHNwZWNpZmllZCBmaWxlCiAgdHJhbnNmZXIgYW5kIGFmdGVyIHNvbWUgbW9yZSB0ZXN0IGNhc2UgdHdlYWtpbmcgd2UgaGF2ZSAxMDAlIHRlc3QgY2FzZSBPSy4KICBJIG1hZGUgc29tZSB0ZXN0IGNhc2VzIHJldHVybiBIVFRQLzEuMCBub3cgdG8gbWFrZSBzdXJlIHRoYXQgd29ya3MgYXMgd2VsbC4KCi0gSGFkIHRvIGFkZCAnQ29ubmVjdGlvbjogY2xvc2UnIHRvIHRoZSBoZWFkZXJzIG9mIGEgYnVuY2ggb2YgdGVzdCBjYXNlcyBzbwogIHRoYXQgY3VybCBiZWhhdmVzICJvbGQtc3R5bGUiIHNpbmNlIHRoZSB0ZXN0IGh0dHAgc2VydmVyIGRvZXNuJ3QgZG8gbXVsdGlwbGUKICBjb25uZWN0aW9ucy4uLiBOb3cgSSBnZXQgMTAwJSB0ZXN0IGNhc2UgT0suCgotIFRoZSBjdXJsLmhheHguc2Ugc2l0ZSwgdGhlIG1haW4gY3VybCBtYWlsaW5nIGxpc3QgYW5kIG15IHBlcnNvbmFsIGVtYWlsIGFyZQogIGFsbCBkZWFkIHRvZGF5IGR1ZSB0byBwb3dlciBibGFja291dCBpbiB0aGUgYXJlYSB3aGVyZSB0aGUgbWFpbiBzZXJ2ZXJzIGFyZQogIGxvY2F0ZWQuIEhvcnJpYmxlLgoKLSBJJ3ZlIG1hZGUgcGVyc2lzdGFuY2Ugd29yayBvdmVyIGEgc3F1aWQgSFRUUCBwcm94eS4gSSBmaW5kIGl0IGRpc3R1cmJpbmcKICB0aGF0IGl0IHVzZXMgaGVhZGVycyB0aGF0IGFyZW4ndCBwcmVzZW50IGluIGFueSBIVFRQIHN0YW5kYXJkIHRob3VnaAogIChQcm94eS1Db25uZWN0aW9uOikgYW5kIHRoYXQgbWFrZXMgbWUgZmVlbCB0aGF0IEknbSBub3cgb24gdGhlIGVkZ2Ugb2Ygd2hhdAogIHRoZSBzdGFuZGFyZCBhY3R1YWxseSBkZWZpbmVzLiBJIG5lZWQgdG8gZ2V0IHRoaXMgY29kZSBleGNlcmNpc2VkIG9uIGEgbG90CiAgb2YgZGlmZmVyZW50IEhUVFAgcHJveGllcyBiZWZvcmUgSSBmZWVsIHNhZmUuCgogIE5vdyBJJ20gZmFjaW5nIHRoZSBwcm9ibGVtIHdpdGggbXkgdGVzdCBzdWl0ZSBzZXJ2ZXJzIChib3RoIEZUUCBhbmQgSFRUUCkKICBub3Qgc3VwcG9ydGluZyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGFuZCBsaWJjdXJsIGlzIGRvaW5nIHRoZW0gbm93LiBJIGhhdmUKICB0byBmaXggdGhlIHRlc3Qgc2VydmVycyB0byBnZXQgYWxsIHRoZSB0ZXN0IGNhc2VzIGRvIE9LLgoKRGFuaWVsICg4IE1hcmNoIDIwMDEpCi0gR3Vlbm9sZSBCZXNjb24gcmVwb3J0ZWQgdGhhdCBsaWJjdXJsIGRpZCBvdXRwdXQgZXJyb3JzIHRvIHN0ZGVyciBldmVuIGlmCiAgTVVURSBhbmQgTk9QUk9HUkVTUyB3YXMgc2V0LiBJdCB0dXJuZWQgb3V0IHRvIGJlIGEgYnVnIGFuZCBoYXBwZW5zIGlmCiAgdGhlcmUncyBhbiBlcnJvciBhbmQgbm8gRVJST1JCVUZGRVIgaXMgc2V0LiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgpWZXJzaW9uIDcuNy1iZXRhMQoKRGFuaWVsICg4IE1hcmNoIDIwMDEpCi0gIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIiBpcyBubyBsb25nZXIgYW55IHRyb3VibGUgZm9yIGxpYmN1cmwuIEkndmUKICBhZGRlZCB0d28gc291cmNlIGZpbGVzIGFuZCBJJ3ZlIHJ1biBzb21lIHRlc3QgZG93bmxvYWRzIHRoYXQgbG9vayBmaW5lLgoKLSBIVFRQIEhFQUQgd29ya3MgdG9vLCBldmVuIG9uIDEuMSBzZXJ2ZXJzLgoKRGFuaWVsICg1IE1hcmNoIDIwMDEpCi0gVGhlIGN1cnJlbnQgNTcgdGVzdCBjYXNlcyBub3cgcGFzcyBPSy4gSXQgd291bGQgc3VnZ2VzdCB0aGF0IGxpYmN1cmwgd29ya3MKICB1c2luZyB0aGUgb2xkLXN0eWxlIHdpdGggb25lIGNvbm5lY3Rpb24gcGVyIGhhbmRsZS4gVGhlIHRlc3Qgc3VpdGUgZG9lc24ndAogIGhhbmRsZSBtdWx0aXBsZSBjb25uZWN0aW9ucyB5ZXQgc28gdGhlcmUgYXJlIG5vIHRlc3QgY2FzZXMgZm9yIHRoaXMuCgotIEkgcGF0Y2hlZCB0aGUgdGVsbmV0LmMgaGVhdmlseSB0byBub3QgdXNlIGFueSBnbG9iYWwgdmFyaWFibGVzIGFueW1vcmUuIEl0CiAgc2hvdWxkIG1ha2UgaXQgYSBsb3QgbmljZXIgbGlicmFyeS13aXNlLgoKLSBUaGUgZmlsZTovLyBzdXBwb3J0IHdhcyBtb2RpZmllZCBzbGlnaHRseSB0byB1c2UgdGhlIGludGVybmFsIGNvbm5lY3QtZmlyc3QtCiAgdGhlbi1kbyBhcHByb2FjaC4KCkRhbmllbCAoNCBNYXJjaCAyMDAxKQotIE1vcmUgYnVncyBlcmFzZWQuCgpWZXJzaW9uIDcuNy1hbHBoYTIKCkRhbmllbCAoNCBNYXJjaCAyMDAxKQotIE5vdywgdGhlcmUncyBldmVuIGEgYmFzaWMgY2hlY2sgdGhhdCBhIHJlLXVzZWQgY29ubmVjdGlvbiBpcyBzdGlsbCBhbGl2ZQogIGJlZm9yZSBpdCBpcyBhc3N1bWVkIHNvLiBBIGZldyBmaXJzdCB0ZXN0cyBoYXZlIHByb3ZlbiB0aGF0IGxpYmN1cmwgd2lsbAogIHRoZW4gcmUtY29ubmVjdCBpbnN0ZWFkIG9mIHJlLXVzZSB0aGUgZGVhZCBjb25uZWN0aW9uIQoKRGFuaWVsICgyIE1hcmNoIDIwMDEpCi0gTm93IHRoZXkgd29yayBpbnRlcm1peGVkIGFzIHdlbGwuIE1ham9yIGNvb2xuZXNzIQoKLSBNb3JlIGZpZGRsaW5nIGFyb3VuZCwgbXkgJ3RpbnknIGNsaWVudCBJIGhhdmUgZm9yIHRlc3RpbmcgcHVycG9zZXMgbm93IGhhcwogIHByb3ZlZCB0byBkb3dubG9hZCBib3RoIEZUUCBhbmQgSFRUUCB3aXRoIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMuIFRoZXkgZG8KICBub3Qgd29yayBpbnRlcm1peGVkIHlldCB0aG91Z2guCgpEYW5pZWwgKDEgTWFyY2ggMjAwMSkKLSBXaWxmcmVkbyBTYW5jaGV6IHBvaW50ZWQgb3V0IGEgbWlub3Igc3BlbGxpbmcgbWlzdGFrZSBpbiBhIG1hbiBwYWdlIGFuZCB0aGF0CiAgY3VybF9zbGlzdF9hcHBlbmQoKSBzaG91bGQgdGFrZSBhIGNvbnN0IGNoYXIgKiBhcyBzZWNvbmQgYXJndW1lbnQuIEl0IGRvZXMKICBub3cuCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDEpCi0gVGhlIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgc3RhcnQgdG8gbG9vayBnb29kIGZvciBIVFRQLiBPbiBhIHN1YnNlcXVlbnQKICByZXF1ZXN0LCBpdCBzZWVtcyB0aGF0IGxpYmN1cmwgbm93IGNhbiBwaWNrIGFuIGFscmVhZHkgZXhpc3RpbmcgY29ubmVjdGlvbgogIGlmIGEgc3VpdGFibGUgb25lIGV4aXN0cywgb3IgaXQgb3BlbnMgYSBuZXcgb25lLgoKLSBEb3VnbGFzIFIuIEhvcm5lciBtYWlsZWQgbWUgY29ycmVjdGlvbnMgdG8gdGhlIGN1cmxfZm9ybXBhcnNlKCkgbWFuIHBhZ2UKICB0aGF0IEkgYXBwbGllZC4KCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwMSkKLSBBZGRlZCB0aGUgZG9jcy9leGFtcGxlcy93aW4zMnNvY2tldHMuYyBmaWxlIGZvciBvdXIgd2luZG93cyBmcmllbmRzLgoKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIHByb3ZpZGVkIGJyYW5kIG5ldyBURUxORVQgZnVuY3Rpb25hbGl0eSBhbmQKICBpbXByb3ZlbWVudHM6CgogICogTmVnb3RpYXRpb24gaXMgbm93IHBhc3NpdmUuIEN1cmwgZG9lcyBub3QgbmVnb3RpYXRlIHVudGlsIHRoZSBwZWVyIGRvZXMuCiAgKiBQb3NzaWJpbGl0eSB0byBzZXQgbmVnb3RpYXRpb24gb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lLCBjdXJyZW50bHkgb25seQogICAgWERJU1BMT0MsIFRUWVBFIGFuZCBORVdfRU5WSVJPTiAoY2FsbGVkIE5FV19FTlYpLgogICogTm93IHNlbmRzIHRoZSBVU0VSIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHRoZSAtdSBzd2l0Y2ggaXMgdXNlZC4KICAqIFVzZSAtdCB0byBzZXQgdGVsbmV0IG9wdGlvbnMgKExpbnVzIGV2ZW4gdXBkYXRlZCB0aGUgbWFuIHBhZ2UsIGF3ZXNvbWUhKQoKLSBIYXZlbid0IGRvbmUgdGhpcyBiaWcgY2hhbmdlcyB0byBjdXJsIGZvciBhIHdoaWxlLiBNb3ZlZCBhcm91bmQgYSBsb3Qgb2YKICBzdHJ1Y3QgZmllbGRzIGFuZCBzdHVmZiB0byBtYWtlIG11bHRpcGxlIGNvbm5lY3Rpb25zIGdldCBjb25uZWN0aW9uIHNwZWNpZmljCiAgZGF0YSBpbiBzZXBhcmF0ZSBzdHJ1Y3RzIHNvIHRoYXQgdGhleSBjYW4gY28tZXhpc3QgaW4gYSBuaWNlIHdheS4gU2VlIHRoZQogIG1haWxpbmcgbGlzdHMgZm9yIGRpc2N1c3Npb25zIGFyb3VuZCBob3cgdGhpcyBpcyBnb25uYSBiZSBpbXBsZW1lbnRlZC4gRG9jcwogIGFuZCBtb3JlIHdpbGwgZm9sbG93LgoKICBTdHVkaWVkIHRoZSBIVFRQIFJGQyB0byBmaW5kIG91dCBiZXR0ZXIgaG93IHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgc2hvdWxkCiAgd29yay4gU2VlbXMgY29vbCBlbm91Z2guCgpEYW5pZWwgKDE5IEZlYnJ1YXJ5IDIwMDEpCi0gQm9iIFNjaGFkZXIgYnJvdWdodCBtZSB0d28gZmlsZXMgdGhhdCBoZWxwIHNldCB1cCBhIE1TIFZDKysgbGliY3VybCBwcm9qZWN0CiAgZWFzaWVyLiBIZSBhbHNvIHByb3ZpZGVkIG1lIHdpdGggYW4gdXAtdG8tZGF0ZSBsaWJjdXJsLmRlZiBmaWxlLgoKLSBJIG1vdmVkIGEgYnVuY2ggb2YgcHJvdG90eXBlcyBmcm9tIHRoZSBwdWJsaWMgPGN1cmwvY3VybC5oPiBmaWxlIHRvIHRoZQogIGxpYnJhcnkgcHJpdmF0ZSB1cmxkYXRhLmguIFRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgdXBjb21pbmcgY2hhbmdlcy4gVGhlCiAgbG93IGxldmVsIGludGVyZmFjZSBpcyBubyBsb25nZXIgYmVpbmcgcGxhbm5lZCB0byBiZWNvbWUgcmVhbGl0eS4KCkRhbmllbCAoMTUgRmVicnVhcnkgMjAwMSkKLSBDVVJMT1BUX1BPU1QgaXMgbm90IHJlcXVpcmVkIGFueW1vcmUuIEp1c3Qgc2V0dGluZyB0aGUgUE9TVCBzdHJpbmcgd2l0aAogIENVUkxPUFRfUE9TVEZJRUxEUyB3aWxsIHN3aXRjaCBvbiB0aGUgSFRUUCBQT1NULiBNb3N0IG90aGVyIHRoaW5ncyBpbgogIGxpYmN1cmwgYWxyZWFkeSB3b3JrcyB0aGlzIHdheSwgaS5lIHRoZXkgcmVxdWlyZSBvbmx5IHRoZSBwYXJhbWV0ZXIgdG8KICBzd2l0Y2ggb24gYSBmZWF0dXJlIHNvIEkgdGhpbmsgdGhpcyB3b3JrcyB3ZWxsIHdpdGggdGhlIHJlc3QuIFNldHRpbmcgYSBOVUxMCiAgc3RyaW5nIHN3aXRjaGVzIG9mZiB0aGUgUE9TVCBhZ2Fpbi4KCi0gRXhjZWxsZW50IHN1Z2dlc3Rpb25zIGZyb20gUmljaCBHcmF5LCBSaWNrIEpvbmVzLCBKb2hhbiBOaWxzc29uIGFuZCBCam9ybgogIFJlZXNlIGhlbHBlZCBtZSBkZWZpbmUgYSB3YXkgaG93IHRvIGluY29ycG9yYXRlIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgaW50bwogIGxpYmN1cmwgaW4gYSB2ZXJ5IHNtb290aCB3YXkuIElmIGRvbmUgcmlnaHQsIG5vIGNoYW5nZSBtYXkgaGF2ZSB0byBiZSBtYWRlCiAgdG8gb2xkZXIgcHJvZ3JhbXMgYW5kIHRoZXkgd2lsbCBqdXN0IHN0YXJ0IHVzaW5nIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgd2hlbgogIGFwcGxpY2FibGUhCgpEYW5pZWwgKDEzIEZlYnJ1YXJ5IDIwMDEpCi0gQ2hhbmdlZCB0aGUgd29yZCAndGltZW91dGVkJyB0byAndGltZWQgb3V0JyBpbiB0d28gZGlmZmVyZW50IGVycm9yIG1lc3NhZ2VzLgogIFN1Z2dlc3RlZCBieSBMYXJyeSBGYWhub2UuCgpWZXJzaW9uIDcuNi4xCgpEYW5pZWwgKDkgRmVicnVhcnkgMjAwMSkKLSBGcmFuayBSZWlkIGFuZCBDYWluIEhvcHdvb2QgcHJvdmlkZWQgaW5mb3JtYXRpb24gYW5kIHJlc2VhcmNoIGFyb3VuZCBhIEhUVFBTCiAgUFVUL3VwbG9hZCBwcm9ibGVtIHdlIHNlZW0gdG8gaGF2ZS4gTm8gc29sdXRpb24gZm91bmQgeWV0LgoKRGFuaWVsICg4IEZlYnJ1YXJ5IDIwMDEpCi0gQW4gaW50ZXJlc3RpbmcgZGlzY3Vzc2lvbiBpcyBob3cgdG8gc3BlY2lmeSBhbiBlbXB0eSBwYXNzd29yZCB3aXRob3V0IGhhdmluZwogIGN1cmwgYXNrIGZvciBpdCBpbnRlcmFjdGl2ZWx5PyBUaGUgY3VycmVudCBpbXBsbWVudGF0aW9uIHRha2VzIGFuIGVtcHR5CiAgcGFzc3dvcmQgYXMgYSByZXF1ZXN0IGZvciBhIHBhc3N3b3JkIHByb21wdC4gSG93ZXZlciwgSSBzdGlsbCB3YW50IHRvCiAgc3VwcG9ydCBhIGJsYW5rIHVzZXIgZmllbGQuIFRodXMsIHRvZGF5IGlmIHlvdSBlbnRlciAiLXUgOiIgKHdpdGhvdXQgdXNlcgogIGFuZCBwYXNzd29yZCkgY3VybCB3aWxsIHByb21wdCBmb3IgdGhlIHBhc3N3b3JkLiBUcmlja3kuIEhvdyB3b3VsZCB5b3UKICBzcGVjaWZ5IHlvdSB3YW50IHRoZSBwcm9tcHQgb3RoZXJ3aXNlPwoKLSBNYWRlIHRoZSBuZXRyYyBwYXJzZSByZXN1bHQgcG9zc2libGUgdG8gdXNlIGZvciBvdGhlciBwcm90b2NvbHMgdGhhbiBGVFAgYW5kCiAgSFRUUCAoc3VjaCBhcyB0aGUgdXBjb21pbmcgVEVMTkVUIGZpeGVzKS4KCi0gVGhlIHByZXZpb3VzbHkgbWVudGlvbmVkICJNU1ZDKysgcHJvYmxlbXMiIHR1cm5lZCBvdXQgdG8gYmUgYSBub24taXNzdWUuCgotIEFkZGVkIGEgSFRUUCBmaWxlIHVwbG9hZCBjb2RlIGV4YW1wbGUgaW4gdGhlIGRvY3MvZXhhbXBsZXMvIHNlY3Rpb24gb24KICByZXF1ZXN0LgoKLSBBZGp1c3RlZCB0aGUgRlRQIHJlc3BvbnNlIGZpeCBzbGlnaHRseS4KClZlcnNpb24gNy42LjEtcHJlMwoKRGFuaWVsICg3IEZlYnJ1YXJ5IDIwMDEpCi0gUy4gTW9vbmVzYW15IGZvdW5kIGEgZmxhdyBpbiB0aGUgcmVzcG9uc2UgcmVhZGluZyBmdW5jdGlvbiBmb3IgRlRQIHRoYXQKICBjb3VsZCBtYWtlIGxpYmN1cmwgbm90IGdldCBvdXQgb2YgdGhlIGxvb3AgcHJvcGVybHkgd2hlbiBpdCBzaG91bGQsIGlmCiAgbGliY3VybCBnb3QgLTEgcmV0dXJuZWQgd2hlbiByZWFkaW5nIHRoZSBzb2NrZXQuCgotIEkgZm91bmQgYSBzaW1pbGFyIG1pc3Rha2UgaW4gaHR0cC5jIHdoZW4gdXNpbmcgYSBwcm94eSBhbmQgcmVhZGluZyB0aGUKICByZXN1bHRzIGZyb20gdGhlIHByb3h5IGNvbm5lY3Rpb24uCgpEYW5pZWwgKDYgRmVicnVhcnkgMjAwMSkKLSBTLiBNb29uZXNhbXkgcG9pbnRlZCBvdXQgdGhhdCB0aGUgVkMgbWFrZWZpbGUgaW4gc3JjLyBuZWVkZWQgdGhlIGxpYnBhdGggc2V0CiAgZm9yIHRoZSBkZWJ1ZyBidWlsZCB0byB3b3JrLgoKLSBEYW5pZWwgR2VocmlnZXIgc3RlcHBlZCBpbiB0byBhc3Npc3Qgd2l0aCB0aGUgVkMrKyBzdHVmZiBSb2JlcnQgV2VhdmVyCiAgYnJvdWdodCB1cCB5ZXN0ZXJkYXkuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwMSkKLSBKdW4taWNoaXJvIGl0b2p1biBIYWdpbm8gYnJvdWdodCBhIGJpZyBwYXRjaCB0aGF0IGJyaW5ncyBJUHY2LWF3YXJlbmVzcyB0bwogIGEgYnVuY2ggb2YgZGlmZmVyZW50IGFyZWFzIHdpdGhpbiBsaWJjdXJsLgoKLSBSb2JlcnQgV2VhdmVyIHRvbGQgbWUgYWJvdXQgdGhlIHByb2JsZW1zIHRoZSBNUyBWQysrIDYuMCBjb21waWxlciBoYXMgd2l0aAogIHRoZSAnc3RhdGljJyBrZXl3b3JkIG9uIGEgbnVtYmVyIG9mIGxpYmN1cmwgZnVuY3Rpb25zLiBJIG1pZ2h0IG5lZWQgdG8gYWRkIGEKICBwYXRjaCB0aGF0IHJlZGVmaW5lcyBzdGF0aWMgd2hlbiBsaWJjdXJsIGlzIGNvbXBpbGVkIHdpdGggdGhhdCBjb21waWxlci4KICBIb3cgZG8gSSBrbm93IHdoZW4gVkMrKyBjb21waWxlcywgYW55b25lPwoKRGFuaWVsICg0IEZlYnJ1YXJ5IDIwMDEpCi0gY3VybF9nZXRpbmZvKCkgd2FzIGV4dGVuZGVkIHdpdGggdHdvIG5ldyBvcHRpb25zOgogIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIGFuZCBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9VUExPQUQuIFRoZXkKICByZXR1cm4gdGhlIGZ1bGwgYXNzdW1lZCBjb250ZW50IGxlbmd0aCBvZiB0aGUgdHJhbnNmZXIgaW4gdGhlIGdpdmVuCiAgZGlyZWN0aW9uLiBUaGUgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgd2lsbCBiZSB0aGUgQ29udGVudC1MZW5ndGg6CiAgc2l6ZSBvZiBhIEhUVFAgZG93bmxvYWQuIEFkZGVkIGRlc2NyaXB0aW9ucyB0byB0aGUgbWFuIHBhZ2UgYXMgd2VsbC4gVGhpcwogIHdhcyBkb25lIGFmdGVyIGRpc2N1c3Npb25zIHdpdGggQm9iIFNjaGFkZXIuCgpEYW5pZWwgKDMgRmVicnVhcnkgMjAwMSkKLSBJbmdvIFJhbGYgQmx1bSBwcm92aWRlZCBhbm90aGVyIGZpeCB0aGF0IG1ha2VzIGN1cmwgYnVpbGQgdW5kZXIgdGhlIG1vcmUKICByZWNlbnQgY3lnd2luIGluc3RhbGxhdGlvbnMuIEl0IHNlZW1zIHRoZXkndmUgY2hhbmdlZCB0aGUgcHJlc2V0IGRlZmluZXMgdG8KICBub3QgaW5jbHVkZSBXSU4zMiBhbnltb3JlLgoKVmVyc2lvbiA3LjYuMS1wcmUyCgpEYW5pZWwgKDMxIEphbnVhcnkgMjAwMSkKLSBDdXJsX3JlYWQoKSBhbmQgY3VybF9yZWFkKCkgbm93IHJldHVybiBhIHNzaXplX3QgZm9yIHRoZSBzaXplLCBhcyBpdCBoYWQgdG8KICBiZSBhYmxlIHRvIHJldHVybiAtMS4gVGhlIHRlbG5ldCBzdXBwb3J0IGNyYXNoZWQgZHVlIHRvIHRoaXMgYW5kIHRoZXJlIHdhcyBhCiAgcG9zc2liaWxpdHkgdG8gd2VpcmQgYmVoYXZpb3IgYWxsIG92ZXIuIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgaGVscGVkIG1lCiAgZmluZCB0aGlzLgoKLSBBZGRlZCBhIGNvbmZpZ3VyZS5pbiBjaGVjayBmb3IgYSB3b3JraW5nIGdldGFkZHJpbmZvKCkgaWYgSVB2NiBpcyByZXF1ZXN0ZWQuCiAgSSBhbHNvIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmVhdHVyZSAtLWVuYWJsZS1kZWJ1ZyB3aGljaCBzZXRzIGEgY291cGxlCiAgb2YgY29tcGlsZXIgb3B0aW9ucyB3aGVuIHVzZWQuIEl0IGFzc3VtZXMgZ2NjLgoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDEpCi0gSSBmaW5hbGx5IHRvb2sgYSBzdGFiIGF0IHRoZSBsb25nLXRlcm0gRklYTUUgaXRlbSBJJ3ZlIGhhZCBvbiBteXNlbGYsIGFuZAogIG5vdyBsaWJjdXJsIHdpbGwgcHJvcGVybHkgd29yayB3aGVuIGRvaW5nIGEgSFRUUCByYW5nZS1yZXF1ZXN0IHRoYXQgZm9sbG93cwogIGEgTG9jYXRpb246LiBQcmV2aW91c2x5IHRoYXQgd291bGQgbWFrZSBsaWJjdXJsIGZhaWwgc2F5aW5nIHRoYXQgdGhlIHNlcnZlcgogIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IHJhbmdlIHJlcXVlc3RzLgoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDEpCi0gSSBhZGRlZCBhIHRlc3QgY2FzZSBmb3IgdGhlIEhUVFAgUFVUIHJlc3VtZSB0aGluZyAodGVzdCBjYXNlIDMzKS4KClZlcnNpb24gNy42LjEtcHJlMQoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDEpCi0gWWV0IGFub3RoZXIgQ29udGVudC1SYW5nZSBjaGFuZ2UuIE9rIG5vdz8gQm9iIFNjaGFkZXIgY2hlY2tzIGZyb20gaGlzIGVuZAogIGFuZCBpdCB3b3JrcyBmb3IgaGltLgoKRGFuaWVsICgyNyBKYW51YXJ5IDIwMDEpCi0gU28gdGhlIEhUVFAgUFVUIHJlc3VtZSBmaXggd2Fzbid0IGdvb2QuIFRoZXJlIHNob3VsZCBhcHBlYXJhbnRseSBiZSBhCiAgQ29udGVudC1SYW5nZSBoZWFkZXIgd2hlbiByZXN1bWluZyBhIFBVVC4KCi0gSSBub3RpY2VkIEkgYnJva2UgdGhlIGRvd25sb2FkLWNoZWNrIHRoYXQgdmVyaWZpZXMgdGhhdCBhIHJlc3VtZWQgSFRUUAogIGRvd25sb2FkIGlzIGFjdHVhbGx5IHJlc3VtZWQuIEl0IGdvdCBicm9rZSBiZWNhdXNlIG15IG5ldyAnaHR0cHJlcScgZmllbGQKICBpbiB0aGUgbWFpbiBjdXJsIHN0cnVjdC4gSSBzaG91bGQgZ2V0IHNsYXBwZWQuIEkgYWRkZWQgYSB0ZXN0IGNhc2UgZm9yCiAgdGhpcyBub3csIHNvIEkgd29uJ3QgYmUgYWJsZSB0byBydWluIHRoaXMgYWdhaW4gd2l0aG91dCBub3RpY2luZy4KCi0gQWRkZWQgYSB0ZXN0IGNhc2UgZm9yIGNvbnRlbnQtbGVuZ3RoIHZlcmlmeWluZyB3aGVuIGRvd25sb2FkaW5nIEhUVFAuCgotIE1hZGUgdGhlIHByb2dyZXNzIG1ldGVyIHRpdGxlIHNheSBpZiB0aGUgdHJhbnNmZXIgaXMgYmVpbmcgdHJhbnNmZXJlZC4gSXQKICBtYWtlcyB0aGUgb3V0cHV0IHNsaWdodGx5IGJldHRlciBmb3IgcmVzdW1lcy4KCi0gV2hlbiBkZWFsaW5nIHdpdGggTG9jYXRpb246IGFuZCBIVFRQIHJldHVybiBjb2RlcywgbGliY3VybCB3aWxsIG5vdCBhdHRlbXB0CiAgdG8gZm9sbG93IHRoZSBzcGlyaXQgb2YgUkZDMjYxNiBiZXR0ZXIuIEl0IG1lYW5zIHRoYXQgd2hlbiBQT1NUaW5nIHRvIGEKICBVUkwgdGhhdCBpcyBiZWluZyBmb2xsb3dpbmcgdG8gYSBzZWNvbmQgcGxhY2UsIHRoZSBzdGFuZGFyZCB3aWxsIGp1ZGdlIG9uCiAgd2hhdCB0byBkby4gQWxsIEhUVFAgY29kZXMgZXhjZXB0IDMwMyBhbmQgMzA1IHdpbGwgY2F1c2UgY3VybCB0byBtYWtlIGEKICBzZWNvbmQgUE9TVCBvcGVyYXRpb24uIDMwMyB3aWxsIG1ha2UgYSBHRVQgYW5kIDMwNSBpcyBub3QgeWV0IHN1cHBvcnRlZC4KCiAgSSBhbHNvIHdyb3RlIHR3byB0ZXN0IGNhc2VzIGZvciB0aGlzIFBPU1QvR0VUL0xvY2F0aW9uIHN0dWZmLgoKVmVyc2lvbiA3LjYKCkRhbmllbCAoMjYgSmFudWFyeSAyMDAxKQotIExvdHMgb2YgbWFpbHMgYmFjayBhbmQgZm9ydGggd2l0aCBCb2IgU2NoYWRlciBmaW5hbGx5IG1hZGUgbWUgYWRkIGEgc21hbGwKICBwaWVjZSBvZiBjb2RlIGluIHRoZSBIVFRQIGVuZ2luZSBzbyB0aGF0IEhUVFAgdXBsb2FkIHJlc3VtZSB3b3Jrcy4gWW91IGNhbgogIG5vdyBkbyBhbiBvcGVyYXRpb24gbGlrZSAnY3VybCAtVCBmaWxlIC1DIDxvZmZzZXQ+IDxVUkw+JyBhbmQgY3VybCB3aWxsIFBVVAogIHRoZSBlbmRpbmcgcGFydCBvZiB0aGUgZmlsZSBzdGFydGluZyBhdCBnaXZlbiBvZmZldCB0byB0aGUgc3BlY2lmaWVkIFVSTC4KClZlcnNpb24gNy42LXByZTQKCkRhbmllbCAoMjUgSmFudWFyeSAyMDAxKQotIEkgdG9vayBob2xkIG9mIFJpY2sgSm9uZXMnIHF1ZXN0aW9uIHdoeSB3ZSBkb24ndCB1c2UgcmVjdigpIGFuZCBzZW5kKCkgZm9yCiAgcmVhZGluZy93cml0aW5nIHRvIHRoZSBzb2NrZXRzIGFuZCBJJ3ZlIG5vdyBtb2RpZmllZCB0aGUgc3JlYWQoKSBhbmQKICBzd3JpdGUoKSBtYWNyb3MgdG8gdXNlIHRoZW0gaW5zdGVhZC4gSWYgbm90aGluZyBlbHNlLCB0aGV5IGNvdWxkIGJlIHRlc3RlZAogIGluIHRoZSBuZXh0IGJldGEtcm91bmQgY29taW5nIHJpZ2h0IHVwLgoKLSBKZWZmIE1vcnJvdyBmb3VuZCBhIHByb2JsZW0gd2l0aCBsaWJjdXJsJ3MgdXNhZ2Ugb2YgU1NMX3JlYWQoKSBhbmQgc3VwcGxpZWQKICBoaXMgcmVzZWFyY2ggcmVzdWx0cyBpbiBob3cgdG8gZml4IHRoaXMuIEl0IHR1cm5zIG91dCB3ZSBoYXZlIHRvIGludm9rZSB0aGUKICBmdW5jdGlvbiBzZXZlcmFsIHRpbWVzIGluIHNvbWUgY2FzZXMuIFRoZSBzYW1lIGdvZXMgZm9yIHRoZSBTU0xfd3JpdGUoKS4KCiAgSSBtYWRlIHNvbWUgcmF0aGVyIGRyYXN0aWMgY2hhbmdlcyBhbGwgb3ZlciBsaWJjdXJsIHRvIG1ha2UgYWxsIHdyaXRlcyBhbmQKICByZWFkcyBnZXQgZG9uZSBvbiBvbmUgc2luZ2xlIHBsYWNlIHNvIHRoYXQgdGhpcyByZXBlYXRlZC1hdHRlbXB0cyB0aGluZwogIHdvdWxkIG9ubHkgaGF2ZSB0byBiZSBpbXBsZW1lbnRlZCBhdCBvbmUgcG9pbnQuCgotIFJpY2sgSm9uZXMgc3BvdHRlZCB0aGF0IHRoZSAndG90YWwgdGltZScgY291bnRlciByZWFsbHkgZGlkbid0IG1lYXN1cmUgdGhlCiAgdG90YWwgdGltZSB2ZXJ5IGFjY3VyYXRlIG9uIHN1YnNlY29uZCBsZXZlbHMuCgotIEpvaGFuIE5pbHNzb24gcG9pbnRlZCBvdXQgdGhlIG5lZWQgdG8gbW9yZSBjbGVhcmx5IHNwZWNpZnkgdGhhdCB0aGUgdGltZW91dAogIHZhbHVlIHlvdSBzZXQgZm9yIGEgZG93bmxvYWQgaXMgZm9yIHRoZSAqZW50aXJlKiBkb3dubG9hZC4gVGhlcmUncyBjdXJyZW50bHkKICBubyBvcHRpb24gYXZhaWxhYmxlIHRoYXQgc2V0cyBhIHRpbWVvdXQgZm9yIHRoZSBjb25uZWN0aW9uIHBoYXNlIG9ubHkuCgpEYW5pZWwgKDI0IEphbnVhcnkgMjAwMSkKLSBJbmdvIFJhbGYgQmx1bSBzdWJtaXR0ZWQgYSBzZXJpZXMgb2YgcGF0Y2hlcyByZXF1aXJlZCB0byBnZXQgY3VybCB0byBjb21waWxlCiAgcHJvcGVybHkgd2l0aCBjeWd3aW4uCgotIFJvYmVydCBXZWF2ZXIgcG9zdGVkIGEgZml4IGZvciB0aGUgd2luMzIgc2VjdGlvbiBvZiB0aGUgY3VybF9nZXRlbnYoKSBjb2RlCiAgdGhhdCBjb3JyZWN0ZWQgYSBwb3RlbnRpYWwgbWVtb3J5IGxlYWsuCgotIEFkZGVkIGNvbW1lbnRzIGluIGEgZmV3IGZpbGVzIGluIGEgc3VkZGVuIGF0dGVtcHQgdG8gbWFrZSB0aGUgc291cmNlcyBtb3JlCiAgZWFzeSB0byByZWFkIGFuZCB1bmRlcnN0YW5kIQoKRGFuaWVsICgyMyBKYW51YXJ5IDIwMDEpCi0gQWRkZWQgc2ltcGxlIElQdjYgZGV0ZWN0aW9uIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZCBtYWRlIHRoZSB2ZXJzaW9uCiAgc3RyaW5nIGFkZCAnaXB2NicgdG8gdGhlIGVuYWJsZSBzZWN0aW9uIGluIHRoYXQgY2FzZS4gRU5BQkxFX0lQVjYgd2lsbCBiZQogIHNldCBpZiBjdXJsIGlzIGNvbXBpbGVkIHdpdGggSVB2NiBzdXBwb3J0IGVuYWJsZWQuCgotIEFkZGVkIGEgcGFyc2VyIGZvciBJUHY2LXN0eWxlIHNwZWNpZmllZCBJUC1hZGRyZXNzZXMgaW4gYSBVUkwuIFRodXMsIHdoZW4KICBJUHY2IGdldHMgZW5hYmxlZCBzb29uLCB3ZSBjYW4gdXNlIFVSTHMgbGlrZSAnWzA6OjFdOjgwJy4uLgoKLSBNYWRlIHRoZSBVUkwgZ2xvYmJpbmcgaW4gdGhlIGNsaWVudCBwb3NzaWJsZSB0byBmYWlsIHNpbGVudGx5IGlmIHRoZXJlJ3MgYW4KICBlcnJvciBpbiB0aGUgZ2xvYmJpbmcuIEl0IG1ha2VzIGl0IGFsbW9zdCBpbnR1aXRpdmUsIHNvIHdoZW4geW91IGRvbid0CiAgZm9sbG93IHRoZSBzeW50YXggcnVsZXMsIGdsb2JiaW5nIGlzIHNpbXBseSBzd2l0Y2hlZCBvZmYgYW5kIHRoZSByYXcgc3RyaW5nCiAgaXMgdXNlZCBpbnN0ZWFkLgoKICBJIHN0aWxsIHRoaW5rIHdlJ2xsIGdldCBwcm9ibGVtcyB3aXRoIElQdjYtc3R5bGUgSVAtYWRkcmVzc2VzIHdoZW4gd2UgKndhbnQqCiAgZ2xvYmJpbmcgb24gcGFydHMgb2YgdGhlIFVSTCBhcyB0aGUgaW5pdGlhbCBwYXJ0IG9mIHRoZSBVUkwgd2lsbCBmb3Igc3VyZQogIHNlcmlvdXNseSBjb25mdXNlIHRoZSBnbG9iYmVyLgoKRGFuaWVsICgyMiBKYW51YXJ5IDIwMDEpCi0gQmr2cm4gU3RlbmJlcmcgc3VwcGxpZWQgYSBwcm9ncmVzcyBtZXRlciBwYXRjaCB0aGF0IG1ha2VzIGl0IGxvb2sgYmV0dGVyIGV2ZW4KICBkdXJpbmcgc2xvdyBzdGFydHMuIFByZXZpb3VzbHkgaXQgbWFkZSBzb21lIHNpbGx5IGFzc3VtcHRpb25zLi4uCgotIEFkZGVkIHR3byBGVFAgdGVzdHMgZm9yIC1RIGFuZCAtUSAtIHN0dWZmIHNpbmNlIGl0IHdhcyBiZWluZyBkaXNjdXNzZWQgb24KICB0aGUgbWFpbGluZyBsaXN0LiBIYWQgdG8gY29ycmVjdCB0aGUgZnRwc2VydmVyLnBsIHRvbyBhcyBpdCBidWdnZWQgc2xpZ2h0bHkuCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwMSkKLSBNYWRlIHRoZSBMb2NhdGlvbjogcGFyc2VycyBkZWFsIHdpdGggYW55LWxlbmd0aCBVUkxzLiBUaHVzIEkgcmVtb3ZlZCB0aGUgbGFzdAogIGNvZGUgdGhhdCByZXN0cmljdHMgdGhlIGxlbmd0aCBvZiBVUkxzIHRoYXQgY3VybCBzdXBwb3J0cy4KCi0gQWRkZWQgYSAtLWdsb2JvZmYgdGVzdCBjYXNlICgjMjgpIGFuZCBpdCBxdWlja2x5IGlkZW50aWZpZWQgYSBtZW1vcnkgcHJvYmxlbQogIGluIHNyYy9tYWluLmMgdGhhdCBJIHRvb2sgY2FyZSBvZi4KClZlcnNpb24gNy42LXByZTMKCkRhbmllbCAoMTcgSmFudWFyeSAyMDAxKQotIE1hZGUgdGhlIHR3byBmb3JtZXIgZmlsZXMgbGliL2Rvd25sb2FkLmMgYW5kIGxpYi9oaWdobGV2ZWwuYyBiZWNvbWUgdGhlIG5ldwogIGxpYi90cmFuc2Zlci5jIHdoaWNoIG1ha2VzIG1vcmUgc2Vuc2UuIEkgYWxzbyBkaWQgdGhlIHJlbmFtZSBmcm9tIFRyYW5zZmVyKCkKICB0byBDdXJsX1RyYW5zZmVyKCkgaW4gdGhlIG90aGVyIHNvdXJjZSBmaWxlcyB0aGF0IHVzZSB0aGUgdHJhbnNmZXIgZnVuY3Rpb24KICBpbiB0aGUgc3Bpcml0IG9mIHVzaW5nIEN1cmxfIHByZWZpeCBmb3IgbGlicmFyeS1zY29wZWQgZ2xvYmFsIHN5bWJvbHMuCgpEYW5pZWwgKDExIEphbnVhcnkgMjAwMSkKLSBBZGRlZCAtZy8tLWdsb2JvZmYgdGhhdCBzd2l0Y2hlcyBPRkYgdGhlIFVSTCBnbG9iYmluZyBhbmQgdGh1cyBlbmFibGVzIHt9W10KICBsZXR0ZXJzIHRvIGJlIHBhcnQgb2YgdGhlIFVSTC4gRG8gbm90ZSB0aGF0IFJGQzIzOTYgc2VjdGlvbiAyLjQuMyBleHBsaWNpdGx5CiAgbWVudGlvbiB0aGVzZSBsZXR0ZXJzIHRvIGJlIGVzY2FwZWQuIFRoaXMgd2FzIHBvc3RlZCBhcyBhIGZlYXR1cmUgcmVxdWVzdCBieQogIEpvcmdlIEd1dGllcnJleiBhbmQgYXMgYSBidWcgYnkgVGVycnkuCgotIFNob3J0IG9wdGlvbnMgdG8gY3VybCB0aGF0IHJlcXVpcmVzIHBhcmFtZXRlcnMgY2FuIG5vdyBiZSBzcGVjaWZpZWQgd2l0aG91dAogIGhhdmluZyB0aGUgb3B0aW9uIGFuZCBpdHMgcGFyYW1ldGVyIHNwYWNlIHNlcGFyYXRlZC4gLW9maWxlIHdvcmtzIGFzIGdvb2QgYXMKICAtbyBmaWxlLiAtbTIwIGlzIGVxdWFsIHRvIC1tIDIwLiBEbyBub3RlIHRoYXQgdGhpcyBnb2VzIGZvciBzaW5nbGUtbGV0dGVyCiAgb3B0aW9ucyBvbmx5LCB2ZXJib3NlIC0tbG9uZy1zdHlsZSBvcHRpb25zIHN0aWxsIG11c3QgYmUgc2VwYXJhdGVkIHdpdGgKICBzcGFjZSBmcm9tIHRoZWlyIHBhcmFtZXRlcnMuCgpEYW5pZWwgKDggSmFudWFyeSAyMDAxKQotIEZyYW5jaXMgRGFnZW5haXMgcmVwb3J0ZWQgdGhhdCB0aGUgU0NPIGNvbXBpbGVyIHN0aWxsIGZhaWxzIHdoZW4gY29tcGlsaW5nCiAgY3VybCBkdWUgdG8gdGhhdCBnZXRwYXNzX3IoKSBwcm90b3R5cGUuIEkndmUgbm93IHB1dCBpdCBhcm91bmQgI2lmbmRlZgogIEhBVkVfR0VUUEFTU19SIGluIGFuIGF0dGVtcHQgdG8gcGxlYXNlIHRoZSBTQ08gc3lzdGVtcy4KCi0gTWFkZSBzb21lIG1pbm9yIGNvcnJlY3Rpb25zIHRvIGdldCB0aGUgY2xpZW50IHRvIGNsZWFudXAgcHJvcGVybHkgYW5kIEkgbWFkZQogIHRoZSBzZXBhcmF0b3Igd29yayBhZ2FpbiB3aGVuIGdldHRpbmcgbXVsdGlwbGUgZ2xvYmJlZCBVUkxzIHRvIHN0ZG91dC4KCi0gV29ya2VkIHdpdGggTG9pYyBEYWNoYXJ5IHRvIGdldCB0aGUgbWFrZSBkaXN0IGFuZCBtYWtlIGRpc3RjaGVjayB3b3JrCiAgY29ycmVjdGx5LiBUaGUgJ21ha2V0Z3onIHNjcmlwdCBpcyBub3cgdXNpbmcgdGhlIGF1dG9tYWtlIGdlbmVyYXRlZCAnbWFrZQogIGRpc3QnIHdoZW4gY3JlYXRpbmcgcmVsZWFzZSBhcmNoaXZlcy4gTG9pYyBzdWNjZXNzZnVsbHkgbWFkZSAnbWFrZSBycG1zJwogIGF1dG9tYXRpY2FsbHkgYnVpbGQgUlBNcyEKCkxvaWMgRGFjaGFyeSAoNiBKYW51YXJ5IDIwMDEpCi0gQXV0b21hdGVkIGdlbmVyYXRpb24gb2YgcnBtIHBhY2thZ2VzLCBubyBuZWVkIHRvIGJlIHJvb3QuCgotIG1ha2UgZGlzdGNoZWNrIGdlbmVyYXRlcyBhIHByb3BlciBkaXN0cmlidXRpb24gKEVYVFJBX0RJU1QKICBpbiBhbGwgTWFrZWZpbGUuYW0gbW9kaWZpZWQgdG8gbWF0Y2ggRklMRVMpLgoKRGFuaWVsICg1IEphbnVhcnkgMjAwMSkKLSBIdWdlIGNsaWVudC1zaWRlIGhhY2s6IG5vdyBtdWx0aXBsZSBVUkxzIGFyZSBzdXBwb3J0ZWQuIEFueSBudW1iZXIgb2YgVVJMcwogIGNhbiBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgYW5kIHRoZXknbGwgYWxsIGJlIGRvd25sb2FkZWQuIFRoZXJlCiAgbXVzdCBiZSBhIGNvcnJlc3BvbmRpbmcgLW8gb3IgLU8gZm9yIGVhY2ggVVJMIG9yIHRoZSBkYXRhIHdpbGwgYmUgd3JpdHRlbiB0bwogIHN0ZG91dC4gVGhpcyBuZWVkcyBtb3JlIHRlc3RpbmcsIHRpbWUgdG8gcmVsZWFzZSBhIDcuNi1wcmUgcGFja2FnZS4KCi0gVGhlIGtyYjQgc3VwcG9ydCB3YXMgYnJva2VuIGluIHRoZSByZWxlYXNlLiBGaXhlZCBub3cuCgotIEh1Z2UgaW50ZXJuYWwgc3ltYm9sIHJlbmFtZSBvcGVyYXRpb24uIEFsbCBub24tc3RhdGljIGJ1dCBzdGlsbCBsaWItaW50ZXJuYWwKICBzeW1ib2xzIHNob3VsZCBub3cgYmUgcHJlZml4ZWQgd2l0aCAnQ3VybF8nIHRvIHByZXZlbnQgY29sbGlzaW9ucyB3aXRoIG90aGVyCiAgbGlicy4gQWxsIHB1YmxpYyBzeW1ib2xzIHNob3VsZCBiZSBwcmVmaXhlZCB3aXRoICdjdXJsXycgYW5kIHRoZSByZXN0IHNob3VsZAogIGJlIHN0YXRpYyBhbmQgdGh1cyBpbnZpc2libGUgdG8gdGhlIG91dHNpZGUgd29ybGQuIEkgdXBkYXRlZCB0aGUgSU5URVJOQUxTCiAgZG9jdW1lbnQgdG8gc2F5IHRoaXMgYXMgd2VsbC4KClZlcnNpb24gNy41LjIKCkRhbmllbCAoNCBKYW51YXJ5IDIwMDEpCi0gQXMgS2V2aW4gUCBSb3RoIHN1Z2dlc3RlZCwgSSd2ZSBhZGRlZCB0ZXh0IHRvIHRoZSBtYW4gcGFnZSBmb3IgZXZlcnkgY29tbWFuZAogIGxpbmUgb3B0aW9uIGFuZCB3aGF0IGhhcHBlbnMgd2hlbiB5b3Ugc3BlY2lmeSB0aGF0IG9wdGlvbiBtb3JlIHRoYW4KICBvbmNlLiBUaGF0IGhhc24ndCBiZWVuIGV4YWN0bHkgY3J5c3RhbCBjbGVhciBiZWZvcmUuCgotIE1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgcG9zc2libGUgdG8gcnVuIGZyb20gb3V0c2lkZSB0aGUgc291cmNlLXRyZWUuIEZvcgogIG9kZCByZWFzb25zIEkgY2FuJ3QgYnVpbGQgY3VybCBwcm9wZXJseSBvdXRzaWRlIHRob3VnaC4gSXQgaGFzIHRvIGRvIHdpdGgKICBjdXJsJ3MgZGVwZW5kZW5jaWVzIG9uIGxpYmN1cmwuLi4KCi0gQ3V0IG9mZiBhbGwgb2xkZXIgKGRhdGVkIDE5OTkgYW5kIGVhcmxpZXIpIENIQU5HRVMgZW50cmllcyBmcm9tIHRoaXMgZmlsZS4KICBUaGUgb2xkZXIgcGllY2UgaXMgbmFtZWQgQ0hBTkdFUy4wIGFuZCBpcyBhZGRlZCB0byB0aGUgQ1ZTIHJlcG9zaXRvcnkgaW4KICBjYXNlIGFueW9uZSB3b3VsZCBuZWVkIGl0LgoKLSBJIGFkZGVkIGFub3RoZXIgZmlsZSAnQ1ZTLUlORk8nIHRvIHRoZSBDVlMuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0CiAgZmlsZXMgaW4gdGhlIENWUyB0aGF0IGFyZW4ndCBpbmNsdWRlZCBpbiByZWxlYXNlIGFyY2hpdmVzIGFuZCBob3cgdG8gYnVpbGQKICBjdXJsIHdoZW4geW91IGdldCB0aGUgc291cmNlcyBvZmYgQ1ZTLgoKLSBVcGRhdGVkIENPTlRSSUJVVEUgYW5kIEZBUSBkdWUgdG8gdGhlIG5ldyBsaWNlbnNlLgoKRGFuaWVsICgzIEphbnVhcnkgMjAwMSkKLSBSZW5hbWVkIFJFQURNRS5saWJjdXJsIHRvIExJQkNVUkwKCi0gQ2hhbmdlZCBoZWFkZXJzIGluIGFsbCBzb3VyY2VzIGZpbGVzIHRvIHRoZSBuZXcgZHVhbCBsaWNlbnNlIGNvbmNlcHQgb2YKICBjdXJsOiB1c2UgdGhlIE1JVC9YIGRlcml2YXRlIGxpY2Vuc2UgKm9yKiBNUEwuIFRoZSBMRUdBTCBmaWxlIHdhcyB1cGRhdGVkCiAgYWNjb3JkaW5nbHkgYW5kIHRoZSBNUEwgMS4xIGFuZCBNSVQvWCBkZXJpdmF0ZSBsaWNlbnNlcyBhcmUgbm93IHBhcnQgb2YgdGhlCiAgcmVsZWFzZSBhcmNoaXZlLgpEYW5pZWwgKDMwIERlY2VtYmVyIDIwMDApCi0gTWFkZSBhbGwgRlRQIGNvbW1hbmRzIGdldCBzZW50IHdpdGggdGhlIHRyYWlsaW5nIENSTEYgaW4gb25lIHNpbmdsZSB3cml0ZSgpCiAgYXMgc3BsaXR0aW5nIHRoZW0gdXAgc2VlbXMgdG8gY29uZnVzZSBhdCBsZWFzdCBzb21lIGZpcmV3YWxscyAoRlctMSBiZWluZwogIG9uZSBtYWpvcikuCgpEYW5pZWwgKDE5IERlY2VtYmVyIDIwMDApCi0gQWRkZWQgZmlsZSBkZXNyY2lwdG9yIGFuZCBGSUxFIGhhbmRsZSBsZWFrIGRldGVjdGlvbiB0byB0aGUgbWVtZGVidWcgc3lzdGVtCiAgYW5kIHRodXMgSSBmb3VuZCBhbmQgcmVtb3ZlZCBhIGZpbGUgZGVzY3JpcHRvciBsZWFrYWdlIGluIHRoZSBmdHAgcGFydHMKICB0aGF0IGhhcHBlbmVkIHdoZW4geW91IGRpZCBQT1JUZWQgZG93bmxvYWRzLgoKLSBBZGRlZCBhbiBpbmNsdWRlIDxzdGRpby5oPiBpbiA8Y3VybC9jdXJsLmg+IHNpbmNlIGl0IHVzZXMgRklMRSAqLgoKRGFuaWVsICgxMiBEZWNlbWJlciAyMDAwKQotIE11bHRpcGxlIFVSTCBkb3dubG9hZHMgd2l0aCAtTyB3YXMgc3RpbGwgYnVnZ2luZy4gTm90IGFueW1vcmUgSSB0aGluayBvcgogIGhvcGUsIG9yIGF0IGxlYXN0IEkndmUgdHJpZWQuLi4gOi1PCgotIEZyYW5jb2lzIFBldGl0amVhbiBmaXhlZCBhbm90aGVyIC1PIHByb2JsZW0KClZlcnNpb24gNy41LjEKCkRhbmllbCAoMTEgRGVjZW1iZXIgMjAwMCkKLSBDbGVhbmVkIHVwIGEgZmV3IG9mIHRoZSBtYWtlZmlsZXMgdG8gdXNlIHVuaXgtc3R5bGUgbmV3bGluZXMgb25seS4gQXMgS2V2aW4KICBQIFJvdGggZm91bmQgb3V0LCBhdCBsZWFzdCBvbmUgQ1ZTIGNsaWVudCBiZWhhdmVkIHdyb25nbHkgd2hlbiBpdCBmb3VuZAogIGRpZmZlcmVudCBuZXdsaW5lIGNvbnZlbnRpb25zIHdpdGhpbiB0aGUgc2FtZSBmaWxlLgoKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIGNvcnJlY3RlZCB0aGUgTERGTEFHUyB1c2UgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yCiAgdGhlIFNTTCBzdHVmZi4KCkRhbmllbCAoNiBEZWNlbWJlciAyMDAwKQotIE1hc3NpbW8gU3F1aWxsYWNlIGNvcnJlY3RseSBkZXNjcmliZWQgaG93IGxpYmN1cmwgY291bGQgdXNlIHNlc3Npb24gaWRzIHdoZW4KICBkb2luZyBTU0wgY29ubmVjdGlvbnMuCgotIEphbWVzIEdyaWZmaXRocyBmb3VuZCBvdXQgdGhhdCBjdXJsIHdvdWxkIGNyYXNoIGlmIHRoZSBmaWxlIHlvdSBzcGVjaWZ5IHdpdGgKICAtbyBpcyBzaG9ydGVyIHRoYW4gdGhlIFVSTCEgVGhpcyB0b29rIHNvbWUgaG91cnMgdG8gZnVsbHkgaHVudCBkb3duLCBidXQgaXQKICBpcyBmaXhlZCBub3cuCgpEYW5pZWwgKDUgRGVjZW1iZXIgMjAwMCkKLSBKYWVwaWwgS2ltIHNlbnQgdXMgbWFrZWZpbGVzIHRoYXQgYnVpbGQgY3VybCB1c2luZyB0aGUgZnJlZSB3aW5kb3dzIGJvcmxhbmQKICBjb21waWxlci4gVGhlIHJvb3QgbWFrZWZpbGUgbm93IGFjY2VwdHMgJ21ha2UgYm9ybGFuZCcgdG8gYnVpbGQgY3VybCB3aXRoCiAgdGhhdCBjb21waWxlci4KCi0gU3RlZmFuIFJhZG1hbiBwb2ludGVkIG91dCB0aGF0IHRoZSB0ZXN0IG1ha2VmaWxlcyBkaWRuJ3QgdXNlIHRoZSBQRVJMCiAgdmFyaWFibGUgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdHMgZmlndXJlIG91dC4gQWN0dWFsbHksIHlvdSBzdGlsbCBuZWVkCiAgcGVybCBpbiB0aGUgcGF0aCBmb3IgdGhlIHRlc3Qgc3VpdGUgdG8gcnVuIG9rLgoKLSBSaWNoIEdyYXkgZm91bmQgbnVtZXJvdXMgcG9ydGFiaWxpdHkgcHJvYmxlbXM6CiAgKiBUaGUgU0NPIGNvbXBpbGVyIGdvdCBhbiBlcnJvciBvbiB0aGUgZ2V0cGFzc19yKCkgcHJvdG90eXBlIGluIGdldHBhc3MuaAogICAgc2luY2UgdGhlIGN1cmwgb25lIGRpZmZlcmVkIGZyb20gdGhlIFNDTyBvbmUKICAqIFRoZSBIUFVYIGNvbXBpbGVyIGdvdCBhbiBlcnJvciBiZWNhdXNlIG9mIGhvdyBjdXJsIGRpZCB0aGUgc2lnYWN0aW9uCiAgICBzdHVmZiBhbmQgdXNlZCBhIGRlZmluZSBIUFVYIGRvZXNuJ3QgaGF2ZSAob3IgbmVlZCkuCiAgKiBBIGZldyBtb3JlIHByb2JsZW1zIHJlbWFpbiB0byBiZSByZXNlYXJjaGVkLgoKLSBQYXVsIEhhcnJpbmd0b24gZXhwZXJpZW5jZWQgYSBjb3JlIGR1bXAgdXNpbmcgaHR0cHMuIE5vdCBtdWNoIGRldGFpbHMgeWV0LgoKRGFuaWVsICg0IERlY2VtYmVyIDIwMDApCi0gSvZybiBIYXJ0cm90aCBmaXhlZCBhIHByb2JsZW0gd2l0aCBtdWx0aXBsZSBVUkxzIGFuZCAtby8tTy4KClZlcnNpb24gNy41CgpEYW5pZWwgKDEgRGVjZW1iZXIgMjAwMCkKLSBDcmFpZyBEYXZpc29uIGdhdmUgdXMgaGlzIHVwZGF0ZXMgb24gdGhlIFZDKysgbWFrZWZpbGVzLCBzbyBub3cgY3VybCBzaG91bGQKICBidWlsZCBmaW5lIHdpdGggdGhlIE1pY3Jvc29mdCBjb21waWxlciBvbiB3aW5kb3dzIHRvby4KCi0gRml4ZWQgdGhlIGxpYmN1cmwgdmVyc2lvbmluZyBzbyB0aGF0IHdlIGRvbid0IHJ1aW4gb2xkIHByb2dyYW1zIHdoZW4KICByZWxlYXNpbmcgbmV3IHNoYXJlZCBsaWJyYXJ5IGludGVyZmFjZXMuCgpEYW5pZWwgKDMwIE5vdmVtYmVyIDIwMDApCi0gUmVuYW1lZCBkb2NzL1JFQURNRS5jdXJsIHRvIGRvY3MvTUFOVUFMIHRvIGJldHRlciByZWZsZWN0IHdoYXQgdGhlIGRvY3VtZW50CiAgYWN0dWFsbHkgY29udGFpbnMuCgpEYW5pZWwgKDI5IE5vdmVtYmVyIDIwMDApCi0gSSByZW1vdmVkIGEgYnVuY2ggb2YgJyNpZiAwJyBzZWN0aW9ucyBmcm9tIHRoZSBjb2RlLiBUaGV5IG9ubHkgbWFrZSB0aGluZ3MKICBoYXJkZXIgdG8gZm9sbG93LiBBZnRlciBhbGwsIHdlIGRvIGhhdmUgYWxsIG9sZGVyIHZlcnNpb25zIGluIHRoZSBDVlMuCgpWZXJzaW9uIDcuNS1wcmU1CgpEYW5pZWwgKDI4IE5vdmVtYmVyIDIwMDApCi0gSSBmaWxsZWQgaW4gbW9yZSBlcnJvciBjb2RlcyBpbiB0aGUgbWFuIHBhZ2UgZXJyb3IgY29kZSBsaXN0IHRoYXQgaGFkIGJlZW4KICBsYWdnaW5nLgoKLSBKYW1lcyBHcmlmZml0aHMgbWFpbGVkIG1lIGEgZmluZSBwYXRjaCB0aGF0IGludHJvZHVjZXMgdGhlIENVUkxPUFRfTUFYUkVESVJTCiAgbGliY3VybCBvcHRpb24uIFdoZW4gdXNlZCwgaXQnbGwgcHJldmVudCBsb2NhdGlvbiBmb2xsb3dpbmcgbW9yZSB0aGFuIHRoZQogIHNldCBudW1iZXIgb2YgdGltZXMuIEl0IGlzIHVzZWZ1bCB0byBicmVhayBvdXQgb2YgZW5kbGVzcyByZWRpcmVjdC1sb29wcy4KCkRhbmllbCAoMjcgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCB0d28gdGVzdCBjYXNlcyBmb3IgZmlsZTovLy4KCkRhbmllbCAoMjIgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCB0aGUgbGliY3VybCBDVVJMT1BUX0ZJTEVUSU1FIHNldG9wdCwgd2hlbiBzZXQgaXQgdHJpZXMgdG8gZ2V0IHRoZQogIG1vZGlmaWVkIHRpbWUgb2YgdGhlIHJlbW90ZSBkb2N1bWVudC4gVGhpcyBpcyBhIHNwZWNpYWwgb3B0aW9uIHNpbmNlIGl0CiAgaW52b2x2ZXMgYW4gZXh0cmEgc2V0IG9mIGNvbW1hbmRzIG9uIEZUUCBzZXJ2ZXJzLiAoVXNpbmcgdGhlIE1EVE0gY29tbWFuZAogIHdoaWNoIGlzIG5vdCBpbiB0aGUgUkZDOTU5KQoKICBjdXJsX2Vhc3lfZ2V0aW5mbygpIGdvdCBhIGNvcnJlc3BvbmRpbmcgQ1VSTElORk9fRklMRVRJTUUgdG8gZ2V0IHRoZSB0aW1lCiAgYWZ0ZXIgYSB0cmFuc2Zlci4gSXQnbGwgcmV0dXJuIGEgemVybyBpZiBDVVJMT1BUX0ZJTEVUSU1FIHdhc24ndCB1c2VkIG9yIGlmCiAgdGhlIHRpbWUgd2Fzbid0IHBvc3NpYmxlIHRvIGdldC4KCiAgLS1oZWFkLy1JIHVzZWQgb24gYSBGVFAgc2VydmVyIHdpbGwgbm93IHByZXNlbnQgYSAnTGFzdC1Nb2RpZmllZDonIGhlYWRlcgogIGlmIGN1cmwgY291bGQgZ2V0IHRoZSB0aW1lIG9mIHRoZSBzcGVjaWZpZWQgZmlsZS4KCi0gQWRkZWQgdGhlIG9wdGlvbiAnLS1jYWNlcnQgW2ZpbGVdJyB0byBjdXJsLCB3aGljaCBhbGxvd3MgYSBzcGVjaWZpZWQgUEVNCiAgZmlsZSB0byBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgcGVlcidzIGNlcnRpZmljYXRlIHdoZW4gZG9pbmcgSFRUUFMKICBjb25uZWN0aW9ucy4gVGhpcyBoYXMgYmVlbiByZXF1ZXN0ZWQsIHJhdGhlciByZWNlbnRseSBieSBIdWxrYSBCb2h1c2xhdiBidXQKICBvdGhlcnMgaGF2ZSBhc2tlZCBmb3IgaXQgYmVmb3JlIGFzIHdlbGwuCgpEYW5pZWwgKDIxIE5vdmVtYmVyIDIwMDApCi0gTnVtZXJvdXMgZml4ZXMgdGhlIHRlc3Qgc3VpdGUgaGFzIGJyb3VnaHQgaW50byB0aGUgZGF5bGlnaHQ6CgogICAqIGN1cmxfdW5lc2NhcGUoKSBjb3VsZCByZXR1cm4gYSB0b28gbG9uZyBzdHJpbmcKICAgKiBvbiBmdHAgdHJhbnNmZXIgZmFpbHVyZXMsIHRoZXJlIGNvdWxkIGJlIG1lbW9yeSBsZWFrcwogICAqIGZ0cCBDV0QgY291bGQgdXNlIGJhZCBkaXJlY3RvcnkgbmFtZXMKICAgKiBtZW1kZWJ1ZyBub3cgdXNlcyB0aGUgbXByaW50ZigpIHJvdXRpbmVzIGZvciBiZXR0ZXIgcG9ydGFiaWxpdHkKICAgKiBmcmVlKE5VTEwpIHJlbW92ZWQgd2hlbiBkb2luZyByZXN1bWVkIHRyYW5zZmVycwoKLSBBZGRlZCBhIGJ1bmNoIG9mIHRlc3QgY2FzZXMgZm9yIEZUUC4KCi0gR2VuZXJhbCBjbGVhbnVwcyB0byBtYWtlIGxlc3Mgd2FybmluZ3Mgd2l0aCBnY2MgLVdhbGwgLXBlZGFudGljLgoKLSBJIG1hZGUgdGhlIHRlc3RzL2Z0cHNlcnZlci5wbCB3b3JrIHdpdGggdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBmdHAKICBvcGVyYXRpb25zLiBQT1JULCBQQVNWLCBSRVRSLCBTVE9SLCBMSVNULCBTSVpFLCBVU0VSLCBQQVNTIGFsbCB3b3JrIG5vdy4gTm93CiAgYWxsIEkgaGF2ZSB0byBkbyBpcyBpbnRlZ3JhdGUgdGhlIGZ0cCBzZXJ2ZXIgZG9pbmdzIGluIHRoZSBydW50ZXN0cy5wbAogIHNjcmlwdCBzbyB0aGF0IGZ0cCB0ZXN0cyBjYW4gYmUgcnVuIHRoZSBzYW1lIHdheSBodHRwIHRlc3RzIGFscmVhZHkgcnVuLgoKRGFuaWVsICgyMCBOb3ZlbWJlciAyMDAwKQotIE1hZGUgbGliY3VybCBjYXBhYmxlIG9mIGRlYWxpbmcgd2l0aCBhbnktbGVuZ3RoIFVSTHMuIFRoZSBmb3JtZXIgbGltaXQgb2YKICA0MDk2IGJ5dGVzIHdhcyBhIGJpdCBhbm5veWluZyB3aGVuIHBlb3BsZSB3YW50ZWQgdG8gdXNlIGN1cmwgdG8gcmVhbGx5IG1ha2UKICBsaWZlIHRvdWdoIG9uIGEgd2ViIHNlcnZlci4gTm93LCB0aGUgY29tbWFuZCBsaW5lIGxpbWl0IGlzIHRoZSBtb3N0IGFubm95aW5nCiAgYnV0IHRoYXQgY2FuIGJlIGNpcmN1bXZlbnRlZCBieSB1c2luZyBhIGNvbmZpZyBmaWxlLgoKICBOT1RFOiB0aGVyZSBpcyBzdGlsbCBhIDQwOTYtYnl0ZSBsaW1pdCBvbiBVUkxzIGV4dHJhY3RlZCBmcm9tIExvY2F0aW9uOgogIGhlYWRlcnMuCgotIENvcnJlY3RlZCB0aGUgc3BlbGxpbmcgb2YgJ3Jlc29sdmUnIGluIHR3byBlcnJvciBtZXNzYWdlcy4KCi0gQWxleGFuZGVyIEtvdXJha29zIHBvc3RlZCBhIGJ1ZyByZXBvcnQgYW5kIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgaXQhIEl0CiAgdHVybmVkIG91dCB0aGF0IGx5bnggYW5kIHdnZXQgc3VwcG9ydCBsb3dlcmNhc2UgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMKICB3aGVyZSBjdXJsIG9ubHkgbG9va2VkIGZvciB0aGUgdXBwZXJjYXNlIHZlcnNpb25zLiBOb3cgY3VybCB3aWxsIHVzZSB0aGUKICBsb3dlcmNhc2UgdmVyc2lvbnMgaWYgdGhleSBleGlzdCwgYnV0IGlmIHRoZXkgZG9uJ3QsIGl0J2xsIHVzZSB0aGUgdXBwZXJjYXNlCiAgdmVyc2lvbnMuCgpEYW5pZWwgKDE3IE5vdmVtYmVyIDIwMDApCi0gY3VybF9mb3JtZnJlZSgpIHdhcyBhZGRlZC4gSG93IGNvbWUgbm8gb25lIG1pc3NlZCB0aGF0IG9uZSBiZWZvcmU/IEkgcmFuIHRoZQogIHRlc3Qgc3VpdGUgd2l0aCB0aGUgbWFsbG9jIGRlYnVnIGVuYWJsZWQgYW5kIGdvdCBsb3RzIG9mICJuaWNlIiB3YXJuaW5ncyBvbgogIG1lbW9yeSBsZWFrcy4gVGhlIG1vc3Qgc2VyaW91cyBvbmUgd2FzIHRoaXMuIFRoZXJlIHdlcmUgYWxzbyBsZWFrcyBpbiB0aGUKICBjb29raWUgaGFuZGxpbmcsIGFuZCBhIGZldyBlcnJvcnMgd2hlbiBjdXJsIGZhaWxlZCB0byBjb25uZWN0IGFuZCBzaW1pbGFyCiAgdGhpbmdzLiBNb3JlIHRlc3RzIGNhc2VzIHdlcmUgYWRkZWQgdG8gY292ZXIgdXAgYW5kIHRvIHZlcmlmeSB0aGF0IHRoZXNlCiAgcHJvYmxlbXMgaGF2ZSBiZWVuIHJlbW92ZWQuCgotIE11Y2hvIHVwZGF0ZWQgY29uZmlnIGZpbGUgcGFyc2VyIChJJ20gZGVhZCB0aXJlZCBvZiBhbGwgdGhlIGJ1ZyByZXBvcnRzIGFuZAogIHdlaXJkIGJlaGF2aW91ciBJIGdldCBvbiB0aGUgZm9ybWVyIG9uZSkuIEl0IHdvcmtzIHNsaWdodGx5IGRpZmZlcmVudGx5IG5vdywKICBhbHRob3VnaCBJIGRvdWJ0IG1hbnkgcGVvcGxlIHdpbGwgbm90aWNlIHRoZSBkaWZmZXJlbmNlcy4gVGhlIG1haW4KICBkaWZmZXJlbmNlIGJlaW5nIHRoYXQgaWYgeW91IHVzZSBvcHRpb25zIHRoYXQgcmVxdWlyZSBwYXJhbWV0ZXJzLCB0aGV5IG11c3QKICBib3RoIGJlIHNwZWNpZmllZCBvbiB0aGUgc2FtZSBsaW5lLiBXaXRoIHRoaXMgbmV3IHBhcnNlciwgeW91IGNhbiBhbHNvCiAgc3BlY2lmeSBsb25nIG9wdGlvbnMgd2l0aG91dCAnLS0nIGFuZCB5b3UgbWF5IHNlcGFyYXRlIG9wdGlvbnMgYW5kCiAgcGFyYW1ldGVycyB3aXRoIDogb3IgPS4gSXQgbWFrZXMgYSBjb25maWcgZmlsZSBsaW5lIGNvdWxkIGxvb2sgbGlrZToKCiAgICAgICAgdXNlci1hZ2VudCA9ICJmb29iYXIgYW5kIHNvbWV0aGluZyIKCiAgUGFyYW1ldGVycyB3aXRoaW4gcXVvdGVzIG1heSBjb250YWluIHNwYWNlcy4gV2l0aG91dCBxdW90ZXMsIHRoZXkncmUKICBleHBlY3RlZCB0byBiZSBhIHNpbmdsZSBub24tc3BhY2Ugd29yZC4KCiAgSGFkIHRvIHBhdGNoIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgcGFyc2VyIGEgbGl0dGxlIHRvIG1ha2UgdGhpcyB3b3JrLgoKLSBBZGRlZCAtLXVybCBhcyBhbiBvcHRpb24gdG8gYWxsb3cgdGhlIFVSTCB0byBiZSBzcGVjaWZpZWQgdGhpcyB3YXkuIEl0IG1ha2VzCiAgd2F5IG5pY2VyIGNvbmZpZyBmaWxlcy4gVGhlIHByZXZpb3VzIHdheSBvZiBzcGVjaWZ5aW5nIFVSTHMgaW4gdGhlIGNvbmZpZwogIGZpbGUgZG9lc24ndCB3b3JrIGFueW1vcmUuCgpEYW5pZWwgKDE1IE5vdmVtYmVyIDIwMDApCi0gVXNpbmcgY2VydGFpbiBjaGFyYWN0ZXJzIGluIHVzZXJuYW1lcyBvciBwYXNzd29yZHMgZm9yIEhUVFAgYXV0aGVudGljYXRpb24KICBmYWlsZWQuIFRoaXMgd2FzIGR1ZSB0byB0aGUgbXByaW50ZigpIHRoYXQgaGFkIGEgc2lsbHkgY2hlY2sgZm9yIGxldHRlcnMsCiAgYW5kIGlmIHRoZXkgd2VyZW4ndCBpc3ByaW50KCkgdGhleSB3ZXJlbid0IG91dHB1dGVkICJhcy1pcyIuIFRoaXMgY2F1c2VkCiAgcGFzc3dvcmRzIGFuZCB1c2VybmFtZXMgdXNpbmcgJ6cnIChmb3IgZXhhbXBsZSkgdG8gZmFpbC4KClZlcnNpb24gNy40LjIKCkRhbmllbCAoMTUgTm92ZW1iZXIgMjAwMCkKLSAndGVzdHMvcnVudGVzdHMucGwnIG5vdyBzb3J0cyB0aGUgdGVzdCBjYXNlcyBwcm9wZXJseSB3aGVuICdhbGwnIGlzIHVzZWQuCgpEYW5pZWwgKDE0IE5vdmVtYmVyIDIwMDApCi0gSSBmZWxsIG92ZXIgdGhlIGRyYWZ0LWlldGYtZnRwZXh0LW1sc3QtMTIudHh0IEludGVybmV0IERyYWZ0IHRpdGxlZAogICJFeHRlbnNpb25zIHRvIEZUUCIgdGhhdCBjb250YWlucyBhIGRlZmluZWQgd2F5IGhvdyB0aGUgZnRwIGNvbW1hbmQgU0laRQogIGNvdWxkIGJlIGFzc3VtZWQgdG8gd29yay4KCi0gTGF1cmVudCBQYXBpZXIgcG9zdGVkIGEgYnVnIHJlcG9ydCBhYm91dCB1c2luZyAiLUMgLSIgYW5kIEZUUCB1cGxvYWRpbmcgYQogIGZpbGUgdGhhdCBpc24ndCBwcnNlbnQgb24gdGhlIHNlcnZlci4gVGhlIHNlcnZlciBtaWdodCB0aGVuIHJldHVybiBhIDU1MCBhbmQKICBjdXJsIHdpbGwgZmFpbC4gU2hvdWxkIGl0IGluc3RlYWQgYXMgTGF1cmVudCBQYXBpZXIgc3VnZ2VzdHMsIHN0YXJ0CiAgdXBsb2FkaW5nIGZyb20gdGhlIGJlZ2lubmluZyBhcyBhIG5vcm1hbCB1cGxvYWQ/CgpEYW5pZWwgKDEzIE5vdmVtYmVyIDIwMDApCi0gRml4ZWQgYSBjcmFzaCB3aXRoIHRoZSBmb2xsb3dsb2NhdGlvbiBjb3VudGVyLgoKLSBXaGlsZSB3cml0aW5nIHRlc3QgY2FzZXMgZm9yIHRoZSB0ZXN0IHN1aXRlLCBJIGRpc2NvdmVyZWQgYW4gb2xkIGxpbWl0YXRpb24KICB0aGF0IHByZXZlbnRlZCAtbyBhbmQgLVQgdG8gYmUgdXNlZCBhdCB0aGUgc2FtZSB0aW1lLiBJIHJlbW92ZWQgdGhpcwogIGltbWVkaWF0ZWx5IGFzIHRoaXMgaGFzIG5vIHJlbGV2YW5jZSBpbiB0aGUgY3VycmVudCBsaWJjdXJsLgoKLSBDaHJpcyBGYWhlcnR5IGZpeGVkIGEgZnJlZS10d2ljZSBwcm9ibGVtIGluIGxpYi9maWxlLmMKCi0gSSBmaXhlZCB0aGUgcGVybCBodHRwIHNlcnZlciBwcm9ibGVtIGluIHRoZSB0ZXN0IHN1aXRlLgoKVmVyc2lvbiA3LjQuMiBwcmU0CgpEYW5pZWwgKDEwIE5vdmVtYmVyIDIwMDApCi0gSSd2ZSAoZmluYWxseSkgc3RhcnRlZCB3b3JraW5nIG9uIHRoZSBjdXJsIHRlc3Qgc3VpdGUuIEl0IGlzIGluIHRoZSBuZXcKICB0ZXN0cy8gZGlyZWN0b3J5LiBJdCByZXF1aXJlcyBzaCBhbmQgcGVybC4gVGhlcmUncyBhIFRDUCBzZXJ2ZXIgaW4gcGVybCBhbmQKICBtb3N0IG9mIHRoZSBvdGhlciBzdHVmZiBydW5uaW5nIGEgcHJldHR5IHNpbXBsZSBzaGVsbCBzY3JpcHQuCgogIEkndmUgb25seSBtYWRlIGZvdXIgdGVzdCBjYXNlcyBzbyBmYXIsIGJ1dCBpdCBwcm92ZXMgdGhlIHN5c3RlbSBjYW4gd29yay4KCi0gTGF1cmVudCBQYXBpZXIgbm90aWNlZCB0aGF0IGN1cmwgZGlkbid0IHNldCBUWVBFIHdoZW4gZG9pbmcgLS1oZWFkIGNoZWNrcwogIGZvciBzaXplcyBvbiBGVFAgc2VydmVycy4gU29tZSBzZXJ2ZXJzIHNlZW0gdG8gcmV0dXJuIGRpZmZlcmVudCBzaXplcwogIGRlcGVuZGluZyBvbiB3aGV0aGVyIEFTQ0lJIG9yIEJJTkFSWSBpcyB1c2VkIQoKLSBMYXVyZW50IFBhcGllciBkZXRlY3RlZCB0aGF0IGlmIHlvdSBhcHBlbmRlZCBhIEZUUCB1cGxvYWQgYW5kIGV2ZXJ5dGhpbmcgd2FzCiAgYWxyZWFkeSB1cGxvYWRlZCwgY3VybCB3b3VsZCBoYW5nLgoKLSBBbmd1cyBNYWNrYXkncyBnZXRwYXNzX3IoKSBpbiBsaWIvZ2V0cGFzcy5jIGlzIG5vdyBjb21wbGlhbnQgd2l0aCB0aGUKICBnZXRwYXNzX3IoKSBmdW5jdGlvbiBpdCBzZWVtcyBzb21lIHN5c3RlbXMgYWN0dWFsbHkgaGF2ZS4KCi0gVmVua2F0YXJhbWFuYSBNb2trYXBhdGkgZGV0ZWN0ZWQgYSBidWcgaW4gdGhlIGNvb2tpZSBwYXJzZXIgYW5kIGNvcnJlY3RlZAogIGl0LiAgSWYgdGhlIGNvb2tpZSB3YXMgc2V0IGZvciB0aGUgZnVsbCBob3N0IG5hbWUgKGRvbWFpbj1mdWxsLmhvc3QuY29tKSwKICB0aGUgY29va2llIHdhcyBuZXZlciBzZW50IGJhY2sgYmVjYXVzZSBvZiBhIGZhdWx0eSBsZW5ndGggY29tcGFyaXNvbiBiZXR3ZWVuCiAgdGhlIHNldCBkb21haW4gbGVuZ3RoIGFuZCB0aGUgY3VycmVudCBob3N0IG5hbWUuCgpEYW5pZWwgKDkgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCBhIGNvbmZpZ3VyZSBjaGVjayBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbHNvY2tldCAoT1MvMiBzZWVtcyB0byBuZWVkCiAgaXQpLiBBZGRlZCBhIGNoZWNrIGZvciBSU0FnbHVlL3JzYXJlZiBmb3IgdGhlIGNhc2VzIHdoZXJlIGxpYmNyeXB0byBpcyBmb3VuZAogIGJ1dCBsaWJzc2wgaXNuJ3QuIEkgaGF2ZW4ndCB2ZXJpZmllZCB0aGlzIGZpeCB5ZXQgdGhvdWdoLCBhcyBJIGhhdmUgbm8KICBzeXN0ZW0gdGhhdCByZXF1aXJlcyB0aG9zZSBsaWJzIHRvIGJ1aWxkLgoKVmVyc2lvbiA3LjQuMiBwcmUzCgpEYW5pZWwgKDcgTm92ZW1iZXIgMjAwMCkKLSBSZW1vdmVkIHBlcnJvcigpIG91dHB1dHMgZnJvbSBnZXRwYXNzLmMuIEFuZ3VzIE1hY2theSBhbHNvIGFncmVlZCB0byBhCiAgc2xpZ2h0bHkgbW9kaWZpZWQgbGljZW5zZSBvZiB0aGUgZ2V0cGFzcy5jIGZpbGUgYXMgdGhlIHByb3RvdHlwZSB3YXMgY2hhbmdlZC4KCkRhbmllbCAoNiBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIHBvc3NpYmlsaXR5IHRvIHNldCBhIHBhc3N3b3JkIGNhbGxiYWNrIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbi4KICBUaGV5J3JlIGNvbnRyb2xlZCB3aXRoIGN1cmxfZWFzeV9zZXRvcHQoKSBvZiBjb3Vyc2UsIHRoZSB0YWdzIGFyZQogIENVUkxPUFRfUEFTU1dERlVOQ1RJT04gYW5kIENVUkxPUFRfUEFTU1dEREFUQS4KCi0gVXNlZCBULiBCaGFyYXRoJ3MgdGhpbmtpbmcgYW5kIGZpeGVkIHRoZSB0aW1lcnMgdGhhdCBzaG93ZWQgdGVycmlibHkgd3JvbmcKICB0aW1lcyB3aGVuIGxvY2F0aW9uOiBoZWFkZXJzIHdlcmUgZm9sbG93ZWQuCgotIEVtbWFudWVsIFR5Y2hvbiBkaXNjb3ZlcmVkIHRoYXQgY3VybCBkaWRuJ3QgcmVhbGx5IGxpa2UgdXNlciBuYW1lcyBvbmx5IGluCiAgdGhlIFVSTC4gSSBjb3JyZWN0ZWQgdGhpcyBhbmQgSSBhbHNvIGZpeGVkIHRoZSBzaW5jZSBsb25nIGxpdmluZyBwcm9ibGVtCiAgd2l0aCBVUkwgZW5jb2RlZCB1c2VyIG5hbWVzIGFuZCBwYXNzd29yZHMgaW4gdGhlIFVSTHMuIFRoZXkgc2hvdWxkIHdvcmsgbm93LgoKRGFuaWVsICgyIE5vdmVtYmVyIDIwMDApCi0gV2hlbiBJIGFkZGVkIC0taW50ZXJmYWNlLCB0aGUgbmV3IGVycm9yIGNvZGUgdGhhdCB3YXMgYWRkZWQgd2l0aCBpdCB3YXMKICBpbnNlcnRlZCBpbiB0aGUgd3JvbmcgcGxhY2UgYW5kIHRodXMgYWxsIGVycm9yIGNvZGVzIGZyb20gMzUgYW5kIHVwd2FyZHMgZ290CiAgaW5jcmVhc2VkIG9uZSBzdGVwLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQsIHdlJ3JlIGJhY2sgYXQgdGhlIHByZXZpb3VzCiAgbnVtYmVycy4gQWxsIG5ldyBleGl0IGNvZGVzIHNob3VsZCBiZSBhZGRlZCBhdCB0aGUgZW5kLgoKRGFuaWVsICgxIE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgYSBjaGVjayBmb3Igc2lnbmFsKCkgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgc28gdGhhdCBpZiBzaWdhY3Rpb24oKQogIGlzbid0IHByZXNlbnQsIHdlIGNhbiB1c2Ugc2lnbmFsKCkgaW5zdGVhZC4KCi0gSSdtIGhhdmluZyBhIGxpY2Vuc2UgZGlzY3Vzc2lvbiBnb2luZyBvbiBwcml2YXRlbHkuIFRoZSBpc3N1ZSBpcyB5ZXQgYWdhaW4KICBHUEwtbGljZW5zZWQgcHJvZ3JhbXMgdGhhdCBoYXZlIHByb2JsZW1zIHdpdGggTVBMLiBJIGFtIGxlYW5pbmcgdG93YXJkcwogIG1ha2luZyBhIGtpbmQgb2YgZHVhbC1saWNlbnNlIHRoYXQgd2lsbCBzb2x2ZSB0aGlzIG9uY2UgYW5kIGZvciBhbGwuLi4KCkRhbmllbCAoMzEgT2N0b2JlciAyMDAwKQotIEFkZGVkIHRoZSBwYWNrYWdlcy8gZGlyZWN0b3J5LiBJIGludGVuZCB0byBsZXQgdGhpcyBjb250YWluIHNvbWUgZG9jcyBhbmQKICB0ZW1wbGF0ZXMgb24gaG93IHRvIGdlbmVyYXRlIGN1c3RvbS1mb3JtYXQgcGFja2FnZXMgZm9yIHZhcmlvdXMgcGxhdGZvcm1zLgogIEkndmUgbm93IHJlbW92ZWQgdGhlIFJQTSByZWxhdGVkIGN1cmwuc3BlYyBmaWxlcyBmcm9tIHRoZSBhcmNoaXZlIHJvb3QuCgpEYW5pZWwgKDMwIE9jdG9iZXIgMjAwMCkKLSBULiBCaGFyYXRoIGJyb3VnaHQgYSBzZXQgb2YgcGF0Y2hlcyB0aGF0IGJyaW5nIG5ldyBmdW5jdGlvbmFsaXR5IHRvCiAgY3VybF9lYXN5X2dldGluZm8oKSBhbmQgY3VybF9lYXN5X3NldG9wdCgpLiBOb3cgeW91IGNhbiByZXF1ZXN0IHBlZXIKICBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gd2l0aCB0aGUgKnNldG9wdCgpIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIgb3B0aW9uCiAgYW5kIHRoZW4gdXNlIHRoZSBDVVJMT1BUX0NBSU5GTyB0byBzZXQgdGhlIGNlcnRpZmljYXRlIHRvIHZlcmlmeSB0aGUgcmVtb3RlCiAgcGVlciBhZ2FpbnN0LiBBZnRlciBhbiBzdWNoIGFuIG9wZXJhdGlvbiB3aXRoIGEgdmVyaWZpY2F0aW9uIHJlcXVlc3QsIHRoZQogICpfZ2V0aW5mbygpIG9wdGlvbiBDVVJMSU5GT19TU0xfVkVSSUZZUkVTVUxUIHdpbGwgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0CiAgd2hldGhlciB0aGUgdmVyaWZpY2F0aW9uIHN1Y2NlZWRlZCBvciBub3QuCgpEYW5pZWwgKDI3IE9jdG9iZXIgMjAwMCkKLSBHZW9yZyBIb3JuIGJyb3VnaHQgdXMgYSBzcGxlbmRpZCBwYXRjaCB0aGF0IHNvbHZlcyB0aGUgbG9uZy1zdGFuZGluZwogIGFubm95aW5nIHByb2JsZW0gd2l0aCB0aW1lb3V0cyB0aGF0IG1hZGUgY3VybCBleGl0IHdpdGggc2lsbHkgZXhpdCBjb2RlcwogICh3aGljaCBhcyBiZWVuIGNvbW1lbnRlZCBvdXQgbGF0ZWx5KS4gVGhpcyBzb2x1dGlvbiBpcyBzaWdhY3Rpb24oKSBiYXNlZCBhbmQKICBvZiBjb3Vyc2UgdGhlbiBvbmx5IHdvcmtzIGZvciB1bml4ZXMgKGFuZCBvbmx5IHRob3NlIHVuaXhlcyB0aGF0IGFjdHVhbGx5CiAgaGF2ZSB0aGUgc2lnYWN0aW9uKCkgZnVuY3Rpb24pLgoKRGFuaWVsICgyNiBPY3RvYmVyIDIwMDApCi0gQmr2cm4gU3RlbmJlcmcgc3VwcGxpZWQgYSBwYXRjaCB0aGF0IGZpeGVkIHRoZSBmbGF3IG1lbnRpb25lZCBieSBLZXZpbiBSb3RoCiAgdGhhdCBtYWRlIHRoZSBwYXNzd29yZCBnZXQgZWNob2VkIHdoZW4gcHJvbXB0ZWQgZm9yIGludGVyYWN0aXZlbHkuIFRoZQogIGdldHBhc3MoKSBmdW5jdGlvbiAobm93IGtub3duIGFzIG15X2dldHBhc3MoKSkgd2FzIGFsc28gZml4ZWQgdG8gbm90IHVzZSBhbnkKICBzdGF0aWMgYnVmZmVycy4gVGhpcyBhbHNvIG1lYW5zIHdlIGNhbm5vdCB1c2UgdGhlICJzdGFuZGFyZCIgZ2V0cGFzcygpCiAgZnVuY3Rpb24gZXZlbiBmb3IgdGhvc2Ugc3lzdGVtcyB0aGF0IGhhdmUgaXQsIHNpbmNlIGl0IGlzbid0IHRocmVhZC1zYWZlLgoKLSBLZXZpbiBSb3RoIGZvdW5kIG91dCB0aGF0IGlmIHlvdSdkIHdyaXRlIGEgY29uZmlnIGZpbGUgd2l0aCAnLXYgdXJsJywgdGhlCiAgdXJsIHdvdWxkIG5vdCBiZSB1c2VkIGFzICJkZWZhdWx0IFVSTCIgYXMgZG9jdW1lbnRlZCwgYWx0aG91Z2ggaWYgeW91IHdyb3RlCiAgaXQgJ3VybCAtdicgaXQgd29ya2VkISBUaGlzIGhhcyBiZWVuIGNvcnJlY3RlZCBub3cuCgotIEtldmluIFJvdGgncyBpZGVhIG9mIHVzaW5nIG11bHRpcGxlIC1kIG9wdGlvbnMgb24gdGhlIHNhbWUgY29tbWFuZCBsaW5lIHdhcwogIGp1c3QgYnJpbGxpYW50LCBhbmQgSSBjb3VsZG4ndCByZWFsbHkgdGhpbmsgb2YgYW55IHJlYXNvbiB3aHkgd2Ugc2hvdWxkbid0CiAgc3VwcG9ydCBpdCEgVGhlIGFwcGVuZCBmdW5jdGlvbiBhbHdheXMgYXBwZW5kICcmJyBhbmQgdGhlbiB0aGUgbmV3IC1kCiAgY2h1bmsuIFRoaXMgZW5hYmxlcyBjb25zdHJ1Y3RzIGxpa2UgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgY3VybCAtZCBuYW1lPWRhbmllbCAtZCBhZ2U9dW5rbm93biBmb29iYXJzaXRlLmNvbQoKRGFuaWVsICgyNCBPY3RvYmVyIDIwMDApCi0gSSBmaXhlZCB0aGUgbGliL21lbWRlYnVnLmMgc291cmNlIHNvIHRoYXQgaXQgY29tcGlsZXMgb24gTGludXggYW5kIG90aGVyCiAgc3lzdGVtcy4gSXQgd2lsbCBiZSB1c2VmdWwgb25lIGRheSB3aGVuIHNvbWVvbmUgZWxzZSBidXQgbWUgd2FudHMgdG8gcnVuIHRoZQogIG1lbW9yeSBkZWJ1Z2dpbmcgc3lzdGVtLgoKRGFuaWVsICgyMyBPY3RvYmVyIDIwMDApCi0gSSBtb2RpZmllZCB0aGUgbWFrZXRneiBhbmQgY29uZmlndXJlIHNjcmlwdHMsIHNvIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICB3aWxsIGZldGNoIHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tIHRoZSBpbmNsdWRlL2N1cmwvY3VybC5oIGhlYWRlciBmaWxlcywgYW5kCiAgdGhlbiB0aGUgbWFrZXRneiBkb2Vzbid0IGhhdmUgdG8gcmVidWlsZCB0aGUgY29uZmlndXJlIHNjcmlwdCB3aGVuIEkgYnVpbGQKICByZWxlYXNlLWFyY2hpdmVzLgoKLSBCavZybiBTdGVuYmVyZyBhbmQgTGludXMgTmllbHNlbiBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIHdhcyBzaWxseQogIGVub3VnaCB0byBub3QgYWxsb3cgQC1sZXR0ZXJzIGluIHBhc3N3b3JkcyB3aGVuIHRoZXkgd2VyZSBzcGVjaWZpZWQgd2l0aCB0aGUKICAtdSBvciAtVSBmbGFncyAoQ1VSTE9QVF9VU0VSUFdEIGFuZCBDVVJMT1BUX1BST1hZVVNFUlBXRCkuIFRoaXMgYWxzbwogIHN1Z2dlc3RzIHRoYXQgY3VybCBwcm9iYWJseSBzaG91bGQgdXJsLWRlY29kZSB0aGUgcGFzc3dvcmQgcGllY2Ugb2YgYW4gVVJMCiAgc28gdGhhdCB5b3UgY291bGQgcGFzcyBhbiBlbmNvZGVkIEAtbGV0dGVyIHRoZXJlLi4uCgpEYW5pZWwgKDIwIE9jdG9iZXIgMjAwMCkKLSBZZXQgYW5vdGhlciBodHRwIHNlcnZlciBiYXJmZWQgb24gY3VybCdzIHJlcXVlc3QgdGhhdCBpbmNsdWRlIHRoZSBwb3J0CiAgbnVtYmVyIGluIHRoZSBIb3N0OiBoZWFkZXIgYWx3YXlzLiBJIG5vdyBvbmx5IGluY2x1ZGUgdGhlIHBvcnQgbnVtYmVyIGlmIGl0CiAgaXNuJ3QgdGhlIGRlZmF1bHQgKDgwIGZvciBIVFRQLCA0NDMgZm9yIEhUVFBTKS4gd3d3LnBlcmwuY29tIHR1cm5lZCBvdXQgdG8KICBydW4gb25lIG9mIHRob3NlIG5hc3R5IHNlcnZlcnMuCgotIFRoZSBQSFA0IG1vZHVsZSBmb3IgY3VybCBoYWQgcHJvYmxlbXMgd2l0aCByZWZlcmVyIHRoYXQgc2VlbXMgdG8gaGF2ZSBiZWVuCiAgY29ycmVjdGVkIGp1c3QgeWVzdGVyZGF5LiAoU3RlcmxpbmcgSHVnaGVzIG9mIHRoZSBQSFAgdGVhbSBjb25maXJtZWQgdGhpcykKCkRhbmllbCAoMTcgT2N0b2JlciAyMDAwKQotIFZsYWRpbWlyIE9ibG9tb3YgcmVwb3J0ZWQgdGhhdCB0aGUgLVkgYW5kIC15IG9wdGlvbnMgZGlkbid0IHdvcmsuIFRoZXkKICBkaWRuJ3Qgd29yayBmb3IgbWUgZWl0aGVyLiBUaGlzIG9uY2UgYWdhaW4gcHJvdmVzIHdlIHNob3VsZCBoYXZlIHRoYXQgdGVzdAogIHN1aXRlLi4uCgotIEkgZmluYWxseSBjaGFuZ2VkIHRoZSBlcnJvciBtZXNzYWdlIGxpYmN1cmwgcmV0dXJucyBpZiB5b3UgdHJ5IGEgaHR0cHM6Ly8KICBVUkwgd2hlbiB0aGUgbGlicmFyeSB3YXNuJ3QgYnVpbGQgd2l0aCBTU0wgZW5hYmxlZC4gSXQgd2lsbCBub3cgcmV0dXJuIHRoaXMKICBlcnJvcjoKICAgICAgICAibGliY3VybCB3YXMgYnVpbHQgd2l0aCBTU0wgZGlzYWJsZWQsIGh0dHBzOiBub3Qgc3VwcG9ydGVkISIKCiAgSSByZWFsbHkgaG9wZSBpdCB3aWxsIG1ha2UgaXQgYSBiaXQgY2xlYXJlciB0byB1c2VycyB3aGVyZSB0aGUgYWN0dWFsCiAgcHJvYmxlbSBsaWVzLgoKVmVyc2lvbiA3LjQuMQoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDApCi0gSSBmb3Jnb3QgdG8gcmVtb3ZlIHNvbWUgb2YgdGhlIG1hbGxvYyBkZWJ1ZyBkZWZpbmVzIGZyb20gdGhlIG1ha2VmaWxlcyBpbgogIHRoZSByZWxlYXNlIGFyY2hpdmUgKG9mIGNvdXJzZSkuCgpWZXJzaW9uIDcuNAoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDApCi0gVGhlIGJ1ZmZlciBvdmVyZmxvdyBtZW50aW9uZWQgYmVsb3cgd2FzIHBvc3RlZCB0byBidWd0cmFxIG9uIEZyaWRheSAxM3RoLgoKRGFuaWVsICgxMiBPY3RvYmVyIDIwMDApCi0gQ29saW4gUm9iZXJ0IFBoaXBwcyBlbGVnYW50bHkgY29ycmVjdGVkIGEgYnVmZmVyIG92ZXJmbG93LiBJdCBjb3VsZCBiZSB1c2VkCiAgYnkgYW4gZXZpbCBmdHAgc2VydmVyIHRvIGNyYXNoIGN1cmwuIEkgdG9vayB0aGUgb3Bwb3J0dW5pdHkgb2YgcmVwbGFjaW5nIGEKICBmZXcgb3RoZXIgc3ByaW50ZigpcyBpbnRvIHNucHJpbnRmKClzIGFzIHdlbGwuCgpEYW5pZWwgKDExIE9jdG9iZXIgMjAwMCkKLSBGb3VuZCBzb21lIG1vcmUgbWVtb3J5IGxlYWtzLiBUaGlzIG5ldyBzaW1wbGUgbWVtb3J5IGRlYnVnZ2VyIGhhcyB0dXJuZWQgb3V0CiAgcmVhbGx5IHVzZWZ1bCEKClZlcnNpb24gNy40IHByZTYKCkRhbmllbCAoOSBPY3RvYmVyIDIwMDApCi0gRmxvcmlhbiBLb2VuaWcgcG9pbnRlZCBvdXQgdGhhdCB0aGUgYm9vbCB0eXBlZGVmIGluIHRoZSBjdXJsL2N1cmwuaCBpbmNsdWRlCiAgZmlsZSB3YXMgYnJlYWtpbmcgUEhQIDQuMC4zIGNvbXBpbGluZy4gVGhlIGJvb2wgdHlwZWRlZiBpcyBub3QgdXNlZCBpbiB0aGUKICBwdWJsaWMgaW50ZXJmYWNlIGFuZCB3YXMgd3JvbmdseSBpbnNlcnRlZCBpbiB0aGF0IGhlYWRlciBmaWxlLgoKLSBK9nJnIEhhcnRyb3RoIGNvcnJlY3RlZCBhIG1pbm9yIG1lbW9yeSBsZWFrIGluIHRoZSBzcmMvdXJsZ2xvYi5jIHN0dWZmLiBJdAogIGRpZG4ndCBoYXJtIGFueW9uZSBzaW5jZSB0aGUgbWVtb3J5IGlzIGZyZWUoKWVkIG9uIGV4aXQgYW55d2F5LgoKLSBDb3JyZWN0ZWQgdGhlIHNyYy9tYWluLmMuIFdlIHVzZSB0aGUgX01QUklOVEZfUkVQTEFDRSAjZGVmaW5lIHRvIHVzZSBvdXIKICBsaWJjdXJsLXByaW50ZigpIGZ1bmN0aW9ucy4gVGhpcyBnaXZlcyB1cyBzbnByaW50ZigpIGV0IGFsIG9uIGFsbAogIHBsYXRmb3Jtcy4gSSBjb252ZXJ0ZWQgdGhlIGFsbG9jYXRlZCB1c2VyYWdlbnQgc3RyaW5nIHRvIG9uZSB0aGF0IHVzZXMgYQogIGxvY2FsIGJ1ZmZlci4KCi0gSSd2ZSBzZXQgYW4gI2lmIDAgc2VjdGlvbiBhcm91bmQgdGhlIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcgaGVhZGVyCiAgZ2VuZXJhdGVkIGluIGxpYi9mb3JtZGF0YS5jLiBUaGlzIHdpbGwgaG9wZWZ1bGx5IG1ha2UgY3VybCBkbyBtb3JlCiAgUEhQLWZyaWVuZGx5IG11bHRpLXBhcnQgcG9zdHMuCgpWZXJzaW9uIDcuNCBwcmU1CgpEYW5pZWwgKDkgT2N0b2JlciAyMDAwKQotIE5pY28gQmFnZ3VzIGZvdW5kIG91dCB0aGF0IGN1cmwncyBhYmlsaXR5IHRvIGZvcmNlIGEgQVNDSUkgZG93bmxvYWQgd2hlbgogIHVzaW5nIEZUUCB3YXMgbm8gbG9uZ2VyIHdvcmtpbmchIEkgY29ycmVjdGVkIHRoaXMuIFRoaXMgcHJvYmxlbSB3YXMgcHJvYmFibHkKICBpbnRyb2R1Y2VkIHdoZW4gSSByZWRlc2lnbmVkIGxpYmN1cmwgZm9yIHZlcnNpb24gNy4KCi0gR2VvcmcgSG9ybiBwcm92aWRlZCBhIHNvdXJjZSBleGFtcGxlIHRoYXQgcHJvdmVkIGEgbWVtb3J5IGxlYWsgaW4gbGliY3VybC4KICBJIGFkZGVkIHNpbXBsZSBtZW1vcnkgZGVidWdnaW5nIGZhY2lsaXRpZXMgYW5kIG5vdyB3ZSBjYW4gbWFrZSBsaWJjdXJsIGxvZwogIGFsbCBtZW1vcnkgZmlkZGxpbmcgZnVuY3Rpb25zLiBBbiBhZGRpdGlvbmFsIHBlcmwgc2NyaXB0IGlzIHVzZWQgdG8gYW5hbHl6ZQogIHRoZSBvdXRwdXQgbG9nZmlsZSBhbmQgdG8gbWF0Y2ggbWFsbG9jKClzIHdpdGggZnJlZSgpcyBldGMuIFRoZSBtZW1vcnkgbGVhawogIEdlb3JnIGZvdW5kIHR1cm5lZCBvdXQgdG8gYmUgdGhlIG1haW4gY29va2llIHN0cnVjdCB0aGF0IGNvb2tpZV9jbGVhbnVwKCkKICBkaWRuJ3QgZnJlZSEgVGhlIHBlcmwgc2NyaXB0IGlzIG5hbWVkIG1lbWFuYWx5emUucGwgYW5kIGl0IGlzIGF2YWlsYWJsZSBpbgogIHRoZSBDVlMgcmVzcG9zaXRvcnksIG5vdCBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKRGFuaWVsICg4IE9jdG9iZXIgMjAwMCkKLSBHZW9yZyBIb3JuIGZvdW5kIGEgR2V0SG9zdCgpIHByb2JsZW0uIEl0IHR1cm5lZCBvdXQgaXQgbmV2ZXIgYXNzaWduZWQgdGhlCiAgcG9pbnRlciBpbiB0aGUgdGhpcmQgYXJndW1lbnQgcHJvcGVybHkhIFRoaXMgY291bGQgbWFrZSBhIGNyYXNoLCBvciBhdCBiZXN0CiAgYSBtZW1vcnkgbGVhayEKClZlcnNpb24gNy40IHByZTQKCkRhbmllbCAoNiBPY3RvYmVyIDIwMDApCi0gSXMgdGhlIC1GIHBvc3QgZm9sbG93aW5nIHRoZSBSRkMgMTg2NyBzcGVjPyBXZSBoYWQgdGhpcyBkaWN1c3Npb24gb24gdGhlCiAgbWFpbGluZyBsaXN0IHNpbmNlIGl0IGFwcGVhcnMgY3VybCBjYW4ndCBwb3N0IC1GIGZvcm0gcG9zdHMgdG8gYSBQSFAKICByZWNlaXZlci4uLiBJJ3ZlIGJlZW4gaW4gdG91Y2ggd2l0aCB0aGUgUEhQIGRldmVsb3BlcnMgYWJvdXQgdGhpcy4KCi0gRG9tZW5pY28gQW5kcmVvbGkgZm91bmQgb3V0IHRoYXQgdGhlIGxvbmcgb3B0aW9uICctLXByb3h5JyB3YXNuJ3Qgd29ya2luZwogIGFueW1vcmUhIFRoZSBvcHRpb24gcGFyc2VyIGdvdCBjb25mdXNlZCB3aGVuIEkgYWRkZWQgdGhlIC0tcHJveHl0dW5uZWwgZm9yCiAgNy4zLiBUaGlzIHdhcyBpbmRlZWQgYSB2ZXJ5IG9sZCBmbGF3IHRoYXQgaGFzbid0IHR1cm5lZCB1cCB1bnRpbCBub3cuLi4KCi0gSvZybiBIYXJ0cm90aCBwcm92aWRlZCBwYXRjaGVzLCB1cGRhdGVkIG1ha2VmaWxlcyBhbmQgdHdvIG5ldyBmaWxlcyBmb3IgRExMCiAgc3R1ZmYgb24gd2luMzIuIEhlIGFsc28gcG9pbnRlZCBvdXQgdGhhdCBsaWIgc291cmNlIGZpbGVzIHdlcmUgY29tcGlsZWQgd2l0aAogIC1JLi4vc3JjIHdoaWNoIGlzbid0IG9ubHkgd3JvbmcgYnV0IHBsYWluIHN0dXBpZCEKCi0gVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIGZpeGVkIGEgcHJvYmxlbSB3aXRoIEhUVFAgcmVzdW1lLiBDdXJsIHByZXZpb3VzbHkgdXNlZAogIGEgbG9jYWwgdmFyaWFibGUgYmFkbHksIHRoYXQgY291bGQgbGVhZCB0byBjcmFzaGVzLgoKVmVyc2lvbiA3LjQgcHJlMwoKRGFuaWVsICg0IE9jdG9iZXIgMjAwMCkKLSBNb3JlIGRvY3Mgd3JpdHRlbi4gVGhlIGN1cmxfZWFzeV9nZXRpbmZvLjMgbWFuIHBhZ2UgaXMgbm93IHByZXR0eSBhY2N1cmF0ZSwKICBhcyBpcyB0aGUgLXcgc2VjdGlvbiBpbiBjdXJsLjEuIEkgYWRkZWQgdHdvIG9wdGlvbnMgdG8gZW5hYmxlIHRoZSB1c2VyIHRvCiAgZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWNlaXZlZCBoZWFkZXJzJyBzaXplIGFuZCB0aGUgc2l6ZSBvZiB0aGUgSFRUUAogIHJlcXVlc3QuIFQuIEJoYXJhdGggcmVxdWVzdGVkIHRoZW0uCgpEYW5pZWwgKDMgT2N0b2JlciAyMDAwKQotIENvcnJlY3RlZCBhIHNldmVyIGZyZWUoKSBiZWZvcmUgdXNlIGluIHRoZSBuZXcgYWRkX2J1ZmZlcl9zZW5kKCkhIDstKQoKVmVyc2lvbiA3LjQgcHJlMgoKRGFuaWVsICgzIE9jdG9iZXIgMjAwMCkKLSBKYXNvbiBTLiBQcmllYmUgc2VudCBtZSBwYXRjaGVzIHRoYXQgY2hhbmdlZCB0aGUgd2F5IGN1cmwgaXNzdWVzIEhUVFAKICByZXF1ZXN0cy4gVGhlIGVudGlyZSByZXF1ZXN0IGlzIG5vdyBpc3N1ZWQgaW4gb25lIHNpbmdsZSBzaG90LiBJdCBkaWRuJ3QgZG8KICB0aGlzIHByZXZpb3VzbHksIGFuZCBpdCBoYXMgdHVybmVkIG91dCB0aGF0IHNpbmNlIHRoZSBjb21tb24gYnJvd3NlcnMgZG8gaXQKICB0aGlzIHdheSwgc29tZSBzaXRlcyBoYXZlIHR1cm5lZCBvdXQgdG8gd29yayB3aXRoIGJyb3dzZXJzIGJ1dCBub3Qgd2l0aAogIGN1cmwhIEFsdGhvdWdoIHRoaXMgaXMgbm90IGEgY2xpZW50LXNpZGUgcHJvYmxlbSwgd2Ugd2FudCB0byBiZSBhYmxlIHRvCiAgZnVsbHkgZW11bGF0ZSBicm93c2VycywgYW5kIHRodXMgd2UgaGF2ZSBub3cgYWRqdXN0ZWQgdGhlIG5ldHdvcmtpbmcgbGF5ZXIKICB0byBzbGlnaHRseSBtb3JlIGFwcGVhciBhcyBhIGJyb3dzZXIuIEkgYWRqdXN0ZWQgSmFzb24ncyBwYXRjaCwgdGhlIGZhdWx0cwogIGFyZSBwcm9iYWJseSBtaW5lLgoKRGFuaWVsICgyIE9jdG9iZXIgMjAwMCkKLSBBbnlvbmUgd2hvIGV2ZXIgdXBsb2FkZWQgZGF0YSB3aXRoIGN1cmwgb24gYSBzbG93IGxpbmsgaGFzIG5vdGljZWQgdGhhdCB0aGUKICBwcm9nZXNzIG1ldGVyIGlzIHVwZGF0ZWQgdmVyeSBpbmZyZXF1ZW50bHkuIFRoYXQgaXMgZHVlIHRvIHRoZSBsYXJnZSBidWZmZXIKICBzaXplIGN1cmwgaXMgdXNpbmcuIEl0IHJlYWRzIDUwS2IgYW5kIHNlbmRzIGl0LCB1cGRhdGVzIHRoZSBwcm9ncmVzcyBtZXRlcgogIGFuZCBsb29wcy4gNTBLYiBpcyB2ZXJ5IG11Y2ggb24gYSBzbG93IGxpbmssIGFsdGhvdWdoIGl0IGlzIHByZXR0eSBuZWF0IHRvCiAgdXNlIG9uIGEgZmFzdCBvbmUuCgogIEkndmUgbm93IG1hZGUgYW4gYWRqdXN0bWVudCB0aGF0IG1ha2VzIGN1cmwgdXNlIGEgMktiIGJ1ZmZlciBmb3IgdXBsb2FkcyB0bwogIHN0YXJ0IHdpdGguIElmIGN1cmwncyBhdmVyYWdlIHVwbG9hZCBzcGVlZCBpcyBmYXN0ZXIgdGhhbiBidWZmZXIgc2l6ZSBieXRlcwogIHBlciBzZWNvbmQsIGN1cmwgd2lsbCBpbmNyZWFzZSB0aGUgdXNlZCBidWZmZXIgc2l6ZSB1cCB0byBtYXggNTBLYi4gSXQKICBzaG91bGQgbWFrZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgd29yayBiZXR0ZXIuCgpWZXJzaW9uIDcuNCBwcmUxCgpEYW5pZWwgKDI5IFNlcHRlbWJlciAyMDAwKQotIFJpcHBlZCBvdXQgdGhlIC13IHN0dWZmIGZyb20gdGhlIGxpYnJhcnkgYW5kIHB1dCBpbiB0aGUgY3VybCB0b29sLiBJdCBnZXRzCiAgYWxsIHRoZSByZWxldmFudCBpbmZvIGZyb20gdGhlIGxpYnJhcnkgdXNpbmcgdGhlIG5ldyBjdXJsX2Vhc3lfZ2V0aW5mbygpCiAgZnVuY3Rpb24uCgotIGJyYWQgYXQgb3BlbmJzZC5vcmcgbWFpbGVkIG1lIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgbXkga2VyYmVyb3MgbWlzdGFrZSBhbmQKICByZW1vdmVkIGEgY29tcGlsZXIgd2FybmluZyBmcm9tIGhvc3RpcC5jIHRoYXQgT3BlbkJTRCBwZW9wbGUgZ2V0LgoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwMCkKLSBPZiBjb3Vyc2UgKEkgc2hvdWxkIHByb2JhYmx5IGdldCBwdW5pc2hlZCBzb21laG93KSBJIGRpZG4ndCBwcm9wZXJseSBjb3JyZWN0CiAgdGhlICNpbmNsdWRlIGxpbmVzIGZvciB0aGUgYmFzZTY0IHN0dWZmIGluIHRoZSBrZXJiZXJvcyBzb3VyY2VzIGluIHRoZSBqdXN0CiAgcmVsZWFzZWQgNy4zIHBhY2thZ2UuIFRoZXkgc3RpbGwgaW5jbHVkZSB0aGUgKl9rcmIuaCBmaWxlcyEgTm93LCB0aGUgZXJyb3IKICBpcyBzb29vIHZlcnkgZWFzeSB0byBzcG90IGFuZCBmaXggc28gSSB3b24ndCBib3RoZXIgd2l0aCBhIHF1aWNrIGJ1ZyBmaXgKICByZWxlYXNlLiBJJ2xsIHBvc3QgYSBwYXRjaCB3aGVuZXZlciBvbmUgaXMgbmVlZGVkIGluc3RlYWQuIEl0J2xsIGJlCiAgYXZhaWxhYmxlIGluIHRoZSBDVlMgaW4gYSBmZXcgbWludXRlcyBhbnl3YXkuCgpWZXJzaW9uIDcuMwoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwMCkKLSBSZW1vdmVkIHRoZSBiYXNlNjRfa3JiLltjaF0gZmlsZXMuIFRoZXkndmUgbm93IHJlcGxhY2VkIHRoZSBmb3JtZXIKICBiYXNlNjQuW2NoXSBmaWxlcy4KCkRhbmllbCAoMjYgU2VwdGVtYmVyIDIwMDApCi0gVXBkYXRlZCBzb21lIGRvY3MuCgotIEkgY2hhbmdlZCB0aGUgT3BlblNTTCBmaXggdG8gd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIGFzIHdlbGwuIFRoZSBwb3N0ZWQKICBwYXRjaCB3YXMgb25seSB3b3JraW5nIHdpdGggMC45LjYgYW5kIG5vIG9sZGVyIG9uZXMuCgpWZXJzaW9uIDcuMy1wcmU4CgpEYW5pZWwgKDI1IFNlcHRlbWJlciAyMDAwKQotIEVyZG11dCBQZmVpZmVyIGluZm9ybWVkIHVzIHRoYXQgY3VybCBkaWRuJ3QgYnVpbGQgd2l0aCBPcGVuU1NMIDAuOS42IGFuZAogIHNob3dlZCB1cyB3aGF0IG5lZWRlZCB0byBnZXQgcGF0Y2hlZCBpbiBvcmRlciB0byBtYWtlIGl0IGJ1aWxkIHByb3Blcmx5CiAgYWdhaW4uCgotIERpcmsgS3J1c2NoZXdza2kgZm91bmQgYSBidWcgaW4gdGhlIGNvb2tpZSBwYXJzZXIuIEkgbWFkZSBhbiBhbHRlcm5hdGl2ZQogIGFwcHJvYWNoIHRvIHRoZSBzb2x1dGlvbiBEaXJrIGhpbXNlbGYgc3VnZ2VzdGVkLiBUaGUgYnVnIG1hZGUgYSBjb29raWUKICBoZWFkZXIgdGhhdCBkaWRuJ3QgZW5kIHdpdGggYSB0cmFpbGluZyBzZW1pY29sb24gdG8gbm90IGdldCBwYXJzZWQuCgotIEkndmUgbWFya2VkIC1jIGFuZCAtdCBkZXByZWNhdGVkIG5vdy4gSWYgeW91IHVzZSBhbnkgb2YgdGhlbSwgY3VybCB3aWxsIHRlbGwKICB5b3UgdG8gdXNlICItQyAtIiBvciAiLVQgLSIgaW5zdGVhZC4gSSBkb24ndCB0aGluayBvY2N1cHlpbmcgdHdvIGxldHRlcnMgZm9yCiAgbmVhcmx5IGlkZW50aWNhbCBmdW5jdGlvbnMgaXMgZ29vZCB1c2UuIEFsc28sIC1UIC0ga2luZCBvZiBmb2xsb3dzIHRoZSBjdXJsCiAgdHJhZGl0aW9uIG9mIHVzaW5nIC0gZm9yIHN0ZGluIHdoZXJlIGEgZmlsZSBuYW1lIGlzIGV4cGVjdGVkLgoKRGFuaWVsICgyMyBTZXB0ZW1iZXIgMjAwMCkKLSBNYXJ0aW4gSGVkZW5mYWxrIHByb3ZpZGVkIHRoZSBwYXRjaCB0aGF0IGZpbmFsbHkgbWFkZSB0aGUga3JiNCBmdHAgdXBsb2FkCiAgd29yayEKCkRhbmllbCAoMjEgU2VwdGVtYmVyIDIwMDApCi0gVGhlIGtlcmJlcm9zIGNvZGUgaXMgbm90IHF1aXRlIHRocmVhZC1zYWZlIHlldC4gVGhlcmUgYXJlIGEgZmV3IG1vcmUgZ2xvYmFscwogIHRoYXQgbmVlZCB0byBiZSB0YWtlIGNhcmUgb2YuIExldCdzIGdldCB0aGUgdXBsb2FkIHdvcmtpbmcgZmlyc3QhCgpEYW5pZWwgKDIwIFNlcHRlbWJlciAyMDAwKQotIFJpY2hhcmQgUHJlc2NvdHQgc29sdmVkIGFub3RoZXIgbmFtZSBsb29rdXAgYnVmZmVyIHNpemUgcHJvYmxlbS4gSSB0b29rIHRoaXMKICBvcHBvcnR1bml0eSB0byByZXdyaXRlIHRoZSBHZXRIb3N0KCkgZnVuY3Rpb24uIFdpdGggdGhlc2UgbGFyZ2UgYnVmZmVyCiAgc2l6ZXMsIEkgdGhpbmsga2VlcGluZyB0aGVtIGFzIGxvY2FsIGFycmF5cyBxdWlja2x5IHR1cm4gdWdseS4gSSBub3cgdXNlCiAgbWFsbG9jKCkgdG8gZ2V0IHRoZSBidWZmZXIgbWVtb3J5LiBUaGFua3MgdG8gdGhpcywgSSBub3cgY2FuIHJlYWxsb2MoKSB0byBhCiAgbGFyZ2UgYnVmZmVyIGluIGNhc2Ugb2YgZGVtYW5kIChlcnJubyA9PSBFUkFOR0UpIGluIGNhc2UgYSBzb2x1dGlvbiBsaWtlCiAgdGhhdCB3b3VsZCBiZWNvbWUgbmVjZXNzYXJ5LiBJIHN0aWxsIHdhbnQgdG8gYXZvaWQgdGhhdCBraW5kIG9mIG5hc3RpbmVzcy4KCi0gVHJpZWQgdG8gY29tcGlsZSBhbmQgcnVuIGN1cmwgb24gTGludXggZm9yIGFscGhhIGFuZCBGcmVlQlNEIGZvciBhbHBoYS4gV2VudAogIGFzIHNtb290aCBhcyBpdCBjb3VsZC4KCi0gQWRkZWQgYSBkb2NzL2V4YW1wbGVzIGRpcmVjdG9yeSB3aXRoIHR3byB0aW55IGV4YW1wbGUgc291cmNlcyB0aGF0IHNob3cgaG93CiAgdG8gdXNlIGxpYmN1cmwuIEkgaG9wZSB1c2VycyB3aWxsIHN1cHBseSBtZSB3aXRoIG1vcmUgdXNlZnVsIGV4YW1wbGVzCiAgZnVydGhlciBvbi4KCi0gQXBwbGllZCBhIHBhdGNoIGJ5IEr2cm4gSGFydHJvdGggdG8gbm8gbG9uZ2VyIHVzZSB0aGUgd29yZCAnaW50ZWZhY2UnIGluIHRoZQogIGNvbmZpZyBzdHJ1Y3QgaW4gdGhlIHNyYy9tYWluLmMgZmlsZSBzaW5jZSBjZXJ0YWluIGNvbXBpbGVycyBoYXZlIHRoYXQgd29yZAogICJyZXNlcnZlcmVkIi4gIEkgZmlndXJlIHRoYXQgaXMgc29tZSBraW5kIG9mIEMrKyBkZWNlYXNlLgoKLSBVcGRhdGVkIHRoZSBjdXJsLjEgbWFuIHBhZ2Ugd2l0aCAtLWludGVyZmFjZSBhbmQgLS1rcmI0LgoKLSBNb2RpZmllZCB0aGUgYmFzZTY0RW5jb2RlKCkgZnVuY3Rpb24gdG8gd29yayBsaWtlIHRoZSBrZXJiZXJvcyBvbmUsIHNvIHRoYXQKICBJIGNvdWxkIHJlbW92ZSB0aGUgdXNlIG9mIHRoYXQuIFRoZXJlIGlzIG5vIG5lZWQgZm9yICp0d28qIGJhc2U2NCBlbmNvZGluZwogIGZ1bmN0aW9ucyEgOy0pCgpWZXJzaW9uIDcuM3ByZTUKCkRhbmllbCAoMTkgU2VwdGVtYmVyIDIwMDApCi0gVGhlIGtlcmJlcm9zNC1sYXllciBzb3VyY2UgY29kZSB0aGF0IGlzIG11Y2ggImluZmx1ZW5jZWQiIGJ5IHRoZSBvcmlnaW5hbAogIGtyYjQgc291cmNlIGNvZGUsIHRocm91Z2ggeWFmYyBpbnRvIGN1cmwsIHdhcyB1c2luZyBxdWl0ZSBhIGxvdCBvZiBnbG9iYWwKICB2YXJpYWJsZXMuIGxpYmN1cmwgY2FuJ3Qgd29yayBwcm9wZXJseSB3aXRoIGdsb2JhbHMgbGlrZSB0aGF0IHdoeSBJIGhhZCB0bwogIGNsZWFuIHVwIGFsbW9zdCBldmVyeSBmdW5jdGlvbiBpbiB0aGUgbmV3IHNlY3VyaXR5LmMgdG8gbWFrZSB0aGVtIHVzZQogIGNvbm5lY3Rpb24gc3BlY2lmaWMgdmFyaWFibGVzIGluc3RlYWQgb2YgdGhlIGdsb2JhbHMuIEkganVzdCBob3BlIEkgZGlkbid0CiAgZGVzdHJveSBhbnl0aGluZyBub3cuLi4gOi0pIGNvbmZpZ3VyZSB1cGRhdGVkLCB2ZXJzaW9uIHN0cmluZyBub3cgcmVmbGVjdHMKICBrcmI0IGJ1aWx0LWluLiBJdCBhbG1vc3Qgd29ya3Mgbm93LiBPbmx5IHVwbG9hZHMgYXJlIHN0aWxsIGJlaW5nIG5hdWdodHkuCgpWZXJzaW9uIDcuM3ByZTMKCkRhbmllbCAoMTggU2VwdGVtYmVyIDIwMDApCi0gTWFydGluIEhlZGVuZmFsayBzdXBwbGllZCBhIG1ham9yIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBrcmI0LWZ0cCBzdXBwb3J0IHRvCiAgY3VybC4gTWFydGluIGlzIHRoZSBwcmltYXJ5IGF1dGhvciBvZiB0aGUgZnRwIGNsaWVudCBuYW1lZCB5YWZjIGFuZCBoZSBkaWQKICBub3QgaGVzaXRhdGUgdG8gaGVscCB1cyBpbXBsZW1lbnQgdGhpcyB3aGVuIEkgYXNrZWQgaGltLiBNYW55IGFuZCBzaW5jZXJlCiAgdGhhbmtzIHRvIGEgc3BsZW5kaWQgZWZmb3J0LiBJdCBkaWRuJ3QgZXZlbiB0YWtlIG1hbnkgaG91cnMhCgotIFN0ZXBoZW4gS2ljayBzdXBwbGllZCBhIGJpZyBwYXRjaCB0aGF0IGludHJvZHVjZXMgdGhlIC0taW50ZXJmYWNlIGZsYWcgdG8KICB0aGUgY3VybCB0b29sIGFuZCBDVVJMT1BUX0lOVEVSRkFDRSBmb3IgbGliY3VybC4gSXQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGFuCiAgb3V0Z29pbmcgaW50ZXJmYWNlIHRvIHVzZSBmb3IgeW91ciByZXF1ZXN0LiBUaGlzIG1heSBub3Qgd29yayBvbiBhbGwKICBwbGF0Zm9ybXMuIFRoaXMgbmVlZHMgdGVzdGluZy4KCi0gUmljaGFyZCBQcmVzY290dCBub3RpY2VkIHRoYXQgY3VybCBvbiBUcnU2NCB1bml4IGNvdWxkIGNvcmUgZHVtcGVkIGlmIHRoZQogIG5hbWUgZGlkbid0IHJlc29sdmUgcHJvcGVybHkuIFRoaXMgd2FzIGR1ZSB0byB0aGUgR2V0SG9zdCgpIGZ1bmN0aW9uIG5vdAogIHJldHVybmluZyBhbiBlcnJvciBldmVuIHRob3VnaCBpdCBmYWlsZWQgb24gc29tZSBwbGF0Zm9ybXMhCgpEYW5pZWwgKDE1IFNlcHRlbWJlciAyMDAwKQotIFVwZGF0ZWQgYWxsIHNvcnRzIG9mIGRvY3VtZW50cyBpbiByZWdhcmRzIHRvIHRoZSBuZXcgcHJveHl0dW5uZWwgc3VwcG9ydC4KClZlcnNpb24gNy4zcHJlMgoKRGFuaWVsICgxNSBTZXB0ZW1iZXIgMjAwMCkKLSBLYWktVXdlIFJvbW1lbCBwb2ludGVkIG91dCBhIHByb2JsZW0gaW4gdGhlIGh0dHBwcm94eXR1bm5lbCBzdHVmZiBmb3IgZnRwLgogIEFkanVzdGVkIGl0LiBBZGRlZCBiZXR0ZXIgaW5mbyBtZXNzYWdlIHdoZW4gc2V0dGluZyB1cCB0aGUgdHVubmVsIGFuZCB0aGUKICBwYXN2IG1lc3NhZ2Ugd2hlbiBkb2luZyB0aGUgc2Vjb25kIGNvbm5lY3QuCgpWZXJzaW9uIDcuM3ByZTEKCkRhbmllbCAoMTUgU2VwdGVtYmVyIDIwMDApCi0gbGliY3VybCBub3cgYWxsb3dzICJodHRwcHJveHl0dW5uZWwiIHRvIGFuIGFyYml0cmFyeSBob3N0IGFuZCBwb3J0IG5hbWUuIFRoZQogIHNlY29uZCBjb25uZWN0aW9uIG9uIGZ0cCBuZWVkZWQgdGhhdC4KCi0gVGhlQXJ0T2ZIVFRQU2NyaXB0aW5nIHdhcyBjb3JyZWN0ZWQgYWxsIG92ZXIuIEkgYm90aCB0eXBlIGFuZCBzcGVsbCByZWFsbHkKICBiYWQgYXQgdGltZXMhCgpEYW5pZWwgKDE0IFNlcHRlbWJlciAyMDAwKQotIC1wLy0tcHJveHl0dW5uZWwgd2FzIGFkZGVkIHRvICdjdXJsJy4gSXQgdXNlcyB0aGUgbmV3CiAgQ1VSTE9QVF9IVFRQUFJPWFlUVU5ORUwgbGliY3VybCBvcHRpb24gdGhhdCBhbGxvd3MgImFueSIgcHJvdG9jb2wgdG8gdHVubmVsCiAgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGh0dHAgcHJveHkuIEF0IHRoZSBtb21lbnQsIHRoaXMgc2hvdWxkIHdvcmsgd2l0aCBmdHAuCgpEYW5pZWwgKDEzIFNlcHRlbWJlciAyMDAwKQotIEpvY2hlbiBTY2hhZXVibGUgZm91bmQgdGhhdCBmaWxlOi8vIGRpZG4ndCB3b3JrIGFzIGV4cGVjdGVkLiBDb3JyZWN0ZWQgdGhpcwogIGFuZCBtYWlsZWQgdGhlIHBhdGNoIHRvIHRoZSBtYWlsaW5nIGxpc3QuCgpEYW5pZWwgKDcgU2VwdGVtYmVyIDIwMDApCi0gSSBjaGFuZ2VkIHRoZSAjZGVmaW5lIFQoKSBpbiBjdXJsLmggc2luY2UgaXQgdHVybmVkIG91dCBpdCB3YXNuJ3QgcmVhbGx5CiAgYSBnb29kIHN5bWJvbCB0byB1c2UgKHdoZW4geW91IGNvbXBpbGVkIFBIUCB3aXRoIGN1cmwgYXMgYSBtb2R1bGUsIHRoYXQKICBkZWZpbmUgY29sbGlkZWQgd2l0aCBzb21lIElNQVAgZGVmaW5lIG9yIHNvbWV0aGluZykuIFRoaXMgd2FzIHBvc3RlZCB0byB0aGUKICBQSFAgYnVnIHRyYWNrZXIuCgotIEkgYWRkZWQgZXh0ZXJuICJDIiBzdHVmZiBpbiB0d28gaGVhZGVyIGZpbGVzIHRvIGJldHRlciBhbGxvdyBsaWJjdXJsIHVzYWdlCiAgaW4gQysrIHNvcmNlcy4gRGlzY3Vzc2lvbnMgb24gdGhlIGxpYmN1cmwgbGlzdCB3aXRoIERhbm55IEhvcnN3ZWxsIGxlYWQgdG8KICB0aGlzLgoKVmVyc2lvbiA3LjIuMQoKRGFuaWVsICgzMSBBdWd1c3QgMjAwMCkKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0ICphZ2FpbiogYW5kIG5vdyBpdCBzZWVtcyB0bwogIGRldGVjdCBMaW51eCBuYW1lIHJlc29sdmluZyBwcm9wZXJseSEgKGhlYXJkIHRoYXQgYmVmb3JlPykKCi0gVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIHBvaW50ZWQgb3V0IHRoYXQgZG93bmxvYWRpbmcgYSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgbGV0dGVyICcrJyBmcm9tIGFuIGZ0cCBzZXJ2ZXIgZGlkbid0IHdvcmsuIEl0IGRpZCB3b3JrIGZyb20gSFRUUCB0aG91Z2ggYW5kCiAgdGhlIHJlYXNvbiB3YXMgbXkgbGFtZSBVUkwgZGVjb2Rlci4KCi0gSSBoYXBwZW5lZCB0byBub3RpY2UgdGhhdCAtSSBkaWRuJ3QgYXQgYWxsIHdvcmsgb24gZnRwIGFueW1vcmUuIEkgY29ycmVjdGVkCiAgdGhhdC4KClZlcnNpb24gNy4yCgpEYW5pZWwgKDMwIEF1Z3VzdCAyMDAwKQotIFVuZGVyc3RhbmRpbmcgQUlYIGlzIGEgaGFyZCB0YXNrLiBJIGJlbGlldmUgSSdsbCBuZXZlciBmaWd1cmUgb3V0IHdoeSB0aGV5CiAgc29sdmUgdGhpbmdzIHNvIGRpZmZlcmVudGx5IGZyb20gdGhlIG90aGVyIHVuaXhlcy4gTm93LCBJJ20gbGVmdCB3aXRoIHRoZQogIEFJWCA0LjMgcnVuLXRpbWUgd2FybmluZ3MgYWJvdXQgZHVwbGljYXRlIHN5bWJvbHMgdGhhdCBhY2NvcmRpbmcgdG8gdGhpcwogIGFydGljbGUgKGh0dHA6Ly93d3cuZ2VvY3Jhd2xlci5jb20vYXJjaGl2ZXMvMy80MDUvMTk5OS85LzAvMjU5MzQyOC8pIGlzIGEKICBsaWJ0b29sIGZsYXcuIEkgdHJpZWQgdGhlIG1lbnRpb25lZCBwYXRjaCwgYWx0aG91Z2ggdGhhdCBzdG9wcyB0aGUgbGlua2luZwogIGNvbXBsZXRlbHkuCgogIFNvLCBpZiBJIHNlbGVjdCB0byBpZ25vcmUgdGhlIGxkIHdhcm5pbmdzIHRoZXJlIGFyZSBjb21waWxlciB3YXJuaW5ncyB0aGF0CiAgZmlsbCB0aGUgc2NyZWVuIHByZXR0eSBiYWQgd2hlbiBjdXJsIGNvbXBpbGVzLiBJdCB0dXJucyBvdXQgdGhhdCBpZiBJIHdhbnQKICB0byAnI2luY2x1ZGUgPGFycGEvaW5ldC5oPicsIEkgY2FuIGdldCB0aWQgb2YgdGhlIHdhcm5pbmdzIGJ5IGluY2x1ZGUgdGhlCiAgZm9sbG93aW5nIHRocmVlIGluY2x1ZGUgZmlsZXMgYmVmb3JlIHRoYXQgb25lOgoKICAgICAgICAjaW5jbHVkZSA8bmV0L2lmX2RsLmg+CiAgICAgICAgI2luY2x1ZGUgPHN5cy9tYnVmLmg+CiAgICAgICAgI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KCiAgTm93LCBpcyBpdCByZWFsbHkgc2FuZSB0byBhZGQgdGhvc2UgaW5jbHVkZSBmaWxlcyBiZWZvcmUgYXJwYS9pbmV0LmggaW4gYWxsCiAgdGhlIHNvdXJjZSBmaWxlcyB0aGF0IGluY2x1ZGUgaXQ/CgogIFRoYW5rcyB0byBBbGJlcnQgQ2hpbi1BLVlvdW5nIGF0IHRoZXdyaXR0ZW53b3JkLmNvbSB3aG8gZ2F2ZSBtZSB0aGUgQUlYCiAgbG9naW4gdG8gdHJ5IGV2ZXJ5dGhpbmcgb24uCgpEYW5pZWwgKDI0IEF1Z3VzdCAyMDAwKQotIEphbiBTY2htaWR0IHN1cHBsaWVkIHVzIGEgbmV3IFZDNiBtYWtlZmlsZSBmb3IgV2luZG93cyBhcyB0aGUgcHJldmlvdXMgb25lCiAgd2FzIG5vdCB1cCB0byBkYXRlIGJ1dCBsYWNrZWQgc2V2ZXJhbCBvYmplY3QgZmlsZXMuCgotIE1vcmUgd29yayBvbiB0aGUgbmFtaW5nLgoKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIHByb3ZpZGVkIGEgY29uZmlndXJlLWNoZWNrIGZvciBsYXJnZSBmaWxlIHN1cHBvcnQsIGFzCiAgc29tZSBzeXN0ZW1zIHNlZW0gdG8gbmVlZCB0aGF0IGZvciB0aGVtIHRvIHdvcmsuIEhhZCB0byBjaGFuZ2UgdGhlIHBvc2l0aW9uCiAgZm9yIHRoZSBjb25maWcuaCBpbmNsdWRlIGZpbGUgaW4gZXZlcnkgLmMgZmlsZSBpbiB0aGUgbGliY3VybCBkaXIuLi4KCi0gQXMgc3VnZ2VzdGVkIG9uIHRoZSBtYWlsaW5nIGxpc3QgKGJ5IFRyb3kgRW5nZWwpLCBJIGRpZCB1c2UgYSAtLWRhdGEtYmluYXJ5CiAgb3B0aW9uIGluc3RlYWQgb2YgdGhlIG1lc3N5IHdheSBJJ3ZlIGxlZnQgZGVzY3JpYmVkIGJlbG93LiBJdCBzZWVtcyB0bwogIHdvcmsuIFRoZSBsaWJjdXJsIGZpeCByZW1haW5lZCB0aGUgc2FtZSBhcyB5ZXN0ZXJkYXkuCgpEYW5pZWwgKDIzIEF1Z3VzdCAyMDAwKQotIEJhY2sgb24gdGhlIC1kIHN0cmlwcGluZyBuZXdsaW5lcyB0aGluZy4gVGhlICdwbGFpbiBwb3N0JyB0aGluZyB3YXMgYWRkZWQKICB3aGVuIEkgaGFkIG5vIHRob3VnaHQgb2YgdGhhdCBvbmUgY291bGQgYWN0dWFsbHkgcG9zdCBiaW5hcnkgZGF0YSB3aXRoCiAgaXQuIE5vdywgSSBoYXZlIHRvIGFkZCB0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gYSBncmFjZWZ1bCBtYW5uZXIgYW5kIEkgdGhpbmsKICBJJ3ZlIG1hbmFnZWQgdG8gY29tZSB1cCB3aXRoIGEgd2F5OiAnLWQgQGZpbGU7YmluYXJ5JyB3aWxsIHRodXMgcG9zdCB0aGUKICBmaWxlIGJpbmFyeSwgZXhhY3RseSBhcyBpdHMgY29udGVudHMgYXJlLiBJdCBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgbmV3CiAgKnNldG9wdCgpIG9wdGlvbiAoQ1VSTE9QVF9QT1NURklFTERTSVpFKSB0byBzZXQgdGhlIHBvc3RmaWVsZCBzaXplLCBzaW5jZQogIGxpYmN1cmwgY2FuJ3Qgc3RybGVuKCkgdGhlIGRhdGEgaW4gdGhlc2UgY2FzZXMuCgotIEFsYmVydCBDaGluLUEtWW91bmcgbWFkZSBzb21lIHZlcnkgc2VyaW91cyBlZmZvcnRzIGFuZCBhbGwgdGhlIG5hbWUKICByZXNvbHZpbmcgcHJvYmxlbXMgc2VlbSB0byBoYXZlIGJlZW4gc29ydGVkIG91dCBub3cgb24gYWxsIHRoZSBwbGF0Zm9ybXMKICB0aGF0IHByZXZpb3VzbHkgc2hvd2VkIHRoZW0uIEknbGwgbWFrZSBhbm90aGVyIHJlbGVhc2Ugbm93IGFueWRheSBiZWNhdXNlIG9mCiAgdGhpcy4KCi0gVGhlIEZBUSB3YXMgbXVjaCBlbmhhbmNlZCB3aGVuIGl0IGNvbWVzIHRvIHRoZSBsaWNlbnNpbmcgaXNzdWVzIHRoYW5rcyB0bwogIEJqb3JuIFJlZXNlLgoKRGFuaWVsICgyMSBBdWd1c3QgMjAwMCkKLSBSaWNrIFdlbHlrb2NoeSBwb2ludGVkIG91dCBhIHByb2JsZW0gd2hlbiB5b3UgdXNlIC1kIHRvIHBvc3QgYW5kIHlvdSB3YW50IHRvCiAga2VlcCB0aGUgbmV3bGluZXMsIGFzIGN1cmwgc3RyaXBzIHRoZW0gb2ZmIGFzIGEgYm9udXMgYmVmb3JlIHBvc3RpbmcuLi4KICBUaGlzIG5lZWRzIHRvIGJlIGFkZHJlc3NlZC4KClZlcnNpb24gNy4xLjEKCkRhbmllbCAoMjEgQXVndXN0IDIwMDApCi0gR290IG1vcmUgcGVvcGxlIGludm9sdmVkIGluIHRoZSBnZXRob3N0YnluYW1lX3IoKSBtZXNzLiBDYW9sYW4gTWNOYW1hcmEgc2VudAogIG1lIGNvbmZpZ3VyZS1jb2RlIHRoYXQgdHVybmVkIG91dCB0byBiZSB2ZXJ5IHNpbWlsYXIgdG8gbXkgZXhpc3RpbmcgdGVzdHMKICB3aGljaCBvbmx5IG1ha2UgbWUgbW9yZSBzdXJlIEknbSBvbiB0aGUgcmlnaHQgcGF0aC4gSSBjaGFuZ2VkIHRoZSBvcmRlciBvZgogIHRoZSB0ZXN0cyBzbGlnaHRseSwgYXMgaXQgc2VlbXMgdGhhdCBzb21lIGNvbXBpbGVycyBkb24ndCB5ZWxsIGVycm9yIGlmIGEKICBmdW5jdGlvbiBpcyB1c2VkIHdpdGggdG9vIG1hbnkgcGFyYW1ldGVycy4gVGh1cywgdGhlIGZpcnN0IHRlc3RlZCBmdW5jdGlvbgogIHdpbGwgc2VlbSBvay4uLiBMZXQncyBob3BlIG1vcmUgY29tcGlsZXJzIHRoaW5rIG9mIHRvby1mZXcgcGFyYW1ldGVycyBhcyBiYWQKICBtYW5uZXJzLCBhcyB3ZSdyZSBub3cgdHJ5aW5nIHRoZSBmdW5jdGlvbnMgaW4gdGhhdCBvcmRlcjsgZmV3ZXIgZmlyc3QuIEkKICBzaG91bGQgYWxzbyBhZGQgdGhhdCBMYXJzIEhlY2tpbmcgbWFpbGVkIG1lIGFuZCB2b2x1bnRlZXJlZCB0byBydW4gdGVzdHMgb24KICBhIGZldyBvZGQgc3lzdGVtcy4gQ29hbGFuIGlzIGtlZXBpbmcgaGlzIHdvcmsgb3ZlciBhdAogIGh0dHA6Ly93d3cuY3NuLnVsLmllL35jYW9sYW4vcHVibGluay9nZXRob3N0YnluYW1lX3IvLiBNaWdodCBiZSBoYW5keSBpbiB0aGUKICBmdXR1cmUgYXMgd2VsbC4KCkRhbmllbCAoMTggQXVndXN0IDIwMDApCi0gSSBub3RpY2VkIEkgaGFkbid0IGluY3JlYXNlZCB0aGUgbmFtZSBsb29rdXAgYnVmZmVyIGluIGxpYi9mdHAuYy4gSSBkb24ndAogIHRoaW5rIHRoaXMgaXMgdGhlIHJlYXNvbiBmb3IgdGhlIGNvbnRpbnVlZCB0cm91YmxlIHRob3VnaC4KCkRhbmllbCAoMTcgQXVndXN0IDIwMDApCi0gRnJlZCBOb3ogY29ycmVjdGVkIG15IHN0dXBpZCBtaXN0YWtlcyBpbiB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgZmx1ZmYuIEl0CiAgc2hvdWxkIGFmZmVjdCBzb21lIEFJWCwgRGlnaXRhbCBVbml4IGFuZCBIUFVYIDEwIHN5c3RlbXMuCgpEYW5pZWwgKDE1IEF1Z3VzdCAyMDAwKQotIE1hdGhpZXUgTGVnYXJlIGNvbXBpbGVkIGFuZCBidWlsZCA3LjEgd2l0aG91dCBlcnJvcnMgb24gYm90aCBBSVggNC4yIGFzIHdlbGwKICBhcyBBSVggNC4zLiBOb3cgd2h5IGRpZCBwcm9ibGVtcyBvY2N1ciBiZWZvcmU/CgotIEZyZWQgTm96IHJlcG9ydGVkIGEgLXcvLS13cml0ZS1vdXQgYnVnIHRoYXQgY2F1c2VkIGl0IHRvIG1hbGZ1bmN0aW9uIHdoZW4KICB1c2VkIGNvbWJpbmVkIHdpdGggbXVsdGlwbGUgVVJMIHJldHJpZXZhbGVzLiBBbGwgYnV0IHRoZSBmaXJzdCBkaXNwbGF5IGdvdAogIHNjcmV3ZWQgdXAhCgpEYW5pZWwgKDExIEF1Z3VzdCAyMDAwKQotIEphc29uIFByaWViZSBhbmQgYW4gYW5vbnltb3VzIGZyaWVuZCBmb3VuZCBzb21lIGhvc3QgbmFtZXMgdGhlIExpbnV4IHZlcnNpb24KICBvZiBjdXJsIGNvdWxkIG5vdCByZXNvbHZlLiBJdCB0dXJuZWQgb3V0IHRoZSBidWZmZXIgdXNlZCB0byByZXRyaWV2ZSB0aGF0CiAgaW5mb3JtYXRpb24gd2FzIHRvbyBzbWFsbC4gRml4ZWQuIE9uZSBjb3VsZCBhcmd1ZSBhYm91dCB0aGUgdXNlZnVsbmVzcyBvZgogIG5vdCBoYXZpbmcgdGhlIHNsaWdodGVzdCB0cmFjZSBvZiBhIG1hbiBwYWdlIGZvciBnZXRob3N0YnluYW1lX3IoKSBvbiBteQogIExpbnV4IFJlZGhhdCBpbnN0YWxsYXRpb24uLi4KCkRhbmllbCAoMTAgQXVndXN0IDIwMDApCi0gQmFsYWppIFMgUmFvIHdhcyBmaXJzdCBpbiBsaW5lIHRvIG5vdGUgdGhlIG1pc3NpbmcgcG9zc2liaWxpdHkgdG8gcmVwbGFjZQogIHRoZSBDb250ZW50LVR5cGU6IGFuZCBDb250ZW50LUxlbmd0aDogaGVhZGVycyB3aGVuIGRvaW5nIC1kIHBvc3RzLiBJIGFkZGVkCiAgdGhlIHBvc3NpYmlsaXR5IGp1c3Qgbm93LiBJdCBzZWVtcyBzb21lIHBlb3BsZSB3YW50cyB0byBkbyBzdGFuZGFyZCBwb3N0cwogIHVzaW5nIGN1c3RvbSBDb250ZW50LVR5cGVzLgoKRGFuaWVsICg4IEF1Z3VzdCAyMDAwKQotIE1pa2UgRG93ZWxsIGNvcnJlY3RseSBkaXNjb3ZlcmVkIHRoYXQgY3VybCBkaWQgbm90IGFwcHJvdmUgb2YgVVJMcyB3aXRoIG5vCiAgdXNlciBuYW1lIGJ1dCBwYXNzd29yZC4gQXMgaW4gJ2h0dHA6Ly86Zm9vQGhheHguc2UnLiBJIGNvcnJlY3RlZCB0aGlzLgoKVmVyc2lvbiA3LjEKCkRhbmllbCAoNyBBdWd1c3QgMjAwMCkKLSBNeSBBSVggNCBmaXggZG9lcyBub3Qgd29yay4gSSBuZWVkIGhlbHAgZnJvbSBhIEFJWCA0IGhhY2tlci4KCi0gSSBhZGRlZCBteSBuZXcgZG9jdW1lbnQgaW4gdGhlIGRvY3MgZGlyZWN0b3J5LiBJdCBpcyBhaW1lZCB0byBiZWNvbWUgYSBzb3J0CiAgb2YgdHV0b3JpYWwgb24gaG93IHRvIGRvIEhUVFAgc2NyaXB0aW5nIHdpdGggY3VybC4KCkRhbmllbCAoNCBBdWd1c3QgMjAwMCkKLSBXb3JraW5nIHdpdGggUmljaCBHcmF5IG9uIGNvbXBpbGluZyBjdXJsIGZvciBsb3RzIG9mIGRpZmZlcmVudCBwbGF0Zm9ybXMuCiAgTXkgZml4IGZvciBBSVggMy4yIHdhcyBub3QgZ29vZCBlbm91Z2ggYW5kIHdhcyBzbGlnaHRseSBjaGFuZ2VkLCBJIGhhZCB0bwogIG1vdmUgYW4gaW5jbHVkZSBmaWxlIGJlZm9yZSBhbm90aGVyLCBhcyBpcyBub3cgZGVzY3JpYmVkIGluIHRoZSBzb3VyY2UuCgogIEFJWCA0LjIgKDQuWD8pIGhhcyBkaWZmZXJlbnQgZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIGdldGhvc3RieWFkZHJfcigpCiAgZnVuY3Rpb25zIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZGlkbid0IGNoZWNrIGZvciBhbmQgdGh1cyB0aGUgY29tcGlsZQogIGJyb2tlIHdpdGggYW4gZXJyb3IuIEkgaGF2ZSBub3cgY2hhbmdlZCB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgY2hlY2sgaW4gdGhlCiAgY29uZmlndXJlIGZpbGUgdG8gc3VwcG9ydCBhbGwgdGhyZWUgdmVyc2lvbnMgb2YgYm90aCB0aGVzZSBmdW5jdGlvbnMuIE15CiAgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIHRoZSBBSVgtc3R5bGUgaXMgdGhvdWdoIG5vdCB5ZXQgdmVyaWZpZWQgYW5kIEkgbWF5CiAgZ2V0IHByb2JsZW1zIHRvIGZpeCBpdCBpZiBpdCB0dXJucyBvdXQgdG8gYnVnIHNpbmNlIEkgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8KICBhbnkgc3lzdGVtIHVzaW5nIHRoYXQuCgogIEZvciBwcm9ibGVtcyBsaWtlIHRoYXQsIEkgbWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBhbGxvdyAtLWRpc2FibGUtdGhyZWFkCiAgdG8gY29tcGxldGVseSBzd2l0Y2ggb2ZmIHRoZSBjaGVjayBmb3IgdGhyZWFkc2FmZSB2ZXJzaW9ucyBvZiBhIGZldwogIGZ1bmN0aW9ucyBhbmQgdGh1cyBnbyB3aXRoIHRoZSAiZ29vZCBvbGQgdmVyc2lvbnMiIHRoYXQgdGVuZCB0byB3b3JrCiAgYWx0aG91Z2ggd2lsbCBicmVhayB0aHJlYWQtc2FmZW5lc3MgZm9yIGxpYmN1cmwuIE1vc3QgcGVvcGxlIHdvbid0IHVzZQogIGxpYmN1cmwgZm9yIG90aGVyIHRoaW5ncyB0aGFuIGN1cmwgdGhvdWdoLCBhbmQgY3VybCBkb2Vzbid0IG5lZWQgYQogIHRocmVhZC1zYWZlIGxpYi4KCi0gV29ya2luZyBvbiBteSBiaWcgdHV0b3JpYWwgYWJvdXQgSFRUUCBzY3JpcHRpbmcgd2l0aCBjdXJsLgoKRGFuaWVsICgxIEF1Z3VzdCAyMDAwKQotIFJpY2ggR3JheSBzcG90dGVkIGEgcHJvYmxlbSBpbiBzcmMvc2V0dXAuaCBjYXVzZWQgYnkgYSAjZGVmaW5lIHN0cmVxdWFsKCkKICB0aGF0IHdhcyBqdXN0IGEgbGVmdC1vdmVyIGZyb20gcGFzc2VkIHRpbWVzLiBUaGUgc3RyZXF1YWwoKSBpcyBub3cgYSB0cnVlCiAgZnVuY3Rpb24gc3VwcGxpZWQgYnkgbGliY3VybCBmb3IgYSBwb3J0YWJsZSBjYXNlIGluc2Vuc2l0aXZlIHN0cmluZwogIGNvbXBhcmlzb24uIEkgYWRkZWQgdGhlIHByb3RvdHlwZXMgaW4gaW5jbHVkZS9jdXJsLmggYW5kIHJlbW92ZWQgdGhlCiAgbm93IG9ic29sZXRlICNkZWZpbmUuCgotIElnb3IgS2hyaXN0b3Bob3JvdiBtYWRlIGEgZml4IHRvIGFsbG93IHJlc3VtZWQgZG93bmxvYWQgZnJvbSBTdW4ncwogIEphdmFXZWJTZXJ2ZXIvMS4xLjEuIEl0IHNlZW1zIHRoYXQgdGhlaXIgc2VydmVyIHNlbmRzIGJhZCBDb250ZW50LVJhbmdlCiAgaGVhZGVycy4KCi0gVGhlIG1ha2VmaWxlcyBmb3JjZWQgYSBzdGF0aWMgbGlicmFyeSBidWlsZCwgd2hpY2ggaXMgYmFkIHNpbmNlIHdlIG5vdyB1c2UKICBsaWJ0b29sIGFuZCB0aHVzIGhhdmUgZXhjZWxsZW50IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQhIEFsYmVydCBDaGluLUEtWW91bmcKICBmb3VuZCBvdXQuCgpWZXJzaW9uIDcuMC4xMWJldGEKCkRhbmllbCAoMSBBdWd1c3QgMjAwMCkKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIHBvaW50ZWQgb3V0IHRoYXQgJ21ha2UgaW5zdGFsbCcgZGlkIG5vdCBwcm9wZXJseSBjcmVhdGUKICB0aGUgaGVhZGVyIGluY2x1ZGUgZGlyZWN0b3J5LCB3aHkgaXQgZmFpbGVkIHRvIGluc3RhbGwgdGhlIGhlYWRlciBmaWxlcyBhcwogIGl0IHNob3VsZC4gQXV0b21ha2UgaXNuJ3QgcmVhbGx5IGVxdWlwcGVkIHRvIGRlYWwgd2l0aCBzdWJkaXJlY3RvcmllcwogIHdpdGhvdXQgTWFrZWZpbGVzIGluIGFueSBuaWNlIHdheS4gSSBoYWQgdG8gcnVuIGFoZWFkIGFuZCBhZGQgTWFrZWZpbGVzIGluCiAgYm90aCBpbmNsdWRlIGFuZCBpbmNsdWRlL2N1cmwgYmVmb3JlIEkgbWFuYWdlZCB0byBjcmVhdGUgYSB0b3AtbGV2ZWwKICBtYWtlZmlsZSB0aGF0IHN1Y2NlZWRzIGluIGluc3RhbGwgZXZlcnl0aGluZyBwcm9wZXJseSEKCi0gT2ssIG5vIG1vcmUgImZlYXR1cmVzIiBhZGRlZCBub3cuIExldCdzIGp1c3QgdmVyaWZ5IHRoYXQgdGhlcmUncyBubyBtYWpvcgogIGZsYXdzIGFkZGVkIG5vdy4KCkRhbmllbCAoMzEgSnVseSAyMDAwKQotIEJvdGggSmVmZiBTY2hhc255IGFuZCBLZXRpbCBGcm95biBhc2tlZCBtZSBob3cgdG8gdGVsbCBjdXJsIG5vdCB0byBzZW5kIG9uZQogIG9mIHRob3NlIGludGVybmFsbHkgZ2VuZXJhdGVkIGhlYWRlcnMuIFRoZXkgZGlkbid0IHNldHRsZSB3aXRoIHRoZSBibGFuawogIG9uZXMgeW91IGNvdWxkIHRlbGwgY3VybCB0byB1c2UuIEkgcmV3cm90ZSB0aGUgaGVhZGVyLXJlcGxhY2Ugc3R1ZmYgYQogIGxpdHRsZS4gTm93LCBpZiB5b3UgcmVwbGFjZSBhbiBpbnRlcm5hbCBoZWFkZXIgd2l0aCB5b3VyIG93biBhbmQgdGhhdCBuZXcKICBvbmUgaXMgYSBibGFuayBoZWFkZXIgeW91IHdpbGwgb25seSByZW1vdmUgdGhlIGludGVybmFsIG9uZSBhbmQgbm90IGdldCBhbnkKICBibGFuay4gSSBjb3VsZG4ndCBmaWd1cmUgb3V0IGFueSBjYXNlIHdoZW4geW91IHdhbnQgdGhhdCBibGFuayBoZWFkZXIuCgpEYW5pZWwgKDI5IEp1bHkgMjAwMCkKLSBJdCBzdHJ1Y2sgbWUgdGhhdCB0aGUgbGliIHVzZWQgbG9jYWx0aW1lKCkgd2hpY2ggaXMgbm90IHRocmVhZC1zYWZlLCBzbyBub3cKICBJIHVzZSBsb2NhbHRpbWVfcigpIGluIHRoZSBzeXN0ZW1zIHRoYXQgaGFzIGl0LgoKLSBJIHdlbnQgdGhyb3VnaCB0aGlzIGVudGlyZSBkb2N1bWVudCBhbmQgcmVtb3ZlZCBhbGwgZW1haWwgYWRkcmVzc2VzIGFuZCBsZWZ0CiAgbmFtZXMgb25seS4gSSd2ZSByZWFsbHkgbWFkZSBhbiBlZmZvcnQgdG8gYWx3YXlzIG5vdGUgd2hvIGJyb3VnaHQgYmUgYnVnCiAgcmVwb3J0cyBvciBmaXhlcywgYnV0IG1vcmUgYW5kIG1vcmUgcGVvcGxlIGFzayBtZSB0byByZW1vdmUgdGhlIGVtYWlsCiAgYWRkcmVzc2VzIHNpbmNlIHRoZXkgYmVjb21lIHZpY3RpbXMgZm9yIHNwYW1zIHRoaXMgd2F5LiBHb3Jkb24gQmVhdG9uIGdvdCBtZQogIHdvcmtpbmcgb24gdGhpcy4KCkRhbmllbCAoMjcgSnVseSAyMDAwKQotIEr2cm4gSGFydHJvdGggZm91bmQgb3V0IHRoYXQgd2hlbiB5b3Ugc3BlY2lmaWVkIGEgSFRUUCBwcm94eSBpbiBhbgogIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCB1c2VkIC1MLCBjdXJsIGZhaWxlZCBpbiB0aGUgc2Vjb25kIGZldGNoLiBJCiAgY29ycmVjdGVkIHRoaXMgcHJvYmxlbSBhbmQgcG9zdGVkIGEgcGF0Y2ggdG8gdGhlIGxpc3QuIE5vIG5lZWQgZm9yIGFuIGV4dHJhCiAgYmV0YSByZWxlYXNlIGp1c3QgZm9yIHRoaXMuCgpWZXJzaW9uIDcuMC4xMGJldGEKCkRhbmllbCAoMjcgSnVseSAyMDAwKQotIFNvLCBsaWJ0b29sIHJlcGxhY2VkIHR3byBvZiBteSBmaWxlcyB3aXRoIHN5bWJvbGljIGxpbmtzIGFuZCBJIGZvcmdvdCB0byBhZGQKICB0aGUgdHdvIG5ldyBsaWJ0b29sIGZpbGVzIHRvIHRoZSByZWxlYXNlIGFyY2hpdmUgKGFuZCB0aGV5IHdlcmUgYWRkZWQgYXMKICBzeW1saW5rcyBhcyB3ZWxsISkgVGhpcyBvZiBjb3Vyc2UgbGVhZCB0byB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGZhaWxlZAogIG9uIDcuMC45Li4uCgpWZXJzaW9uIDcuMC45YmV0YQoKRGFuaWVsICgyNSBKdWx5IDIwMDApCi0gS3Jpc3RpYW4gS/ZobnRvcHAgPGtyaXMgYXQga29laG50b3BwLmRlPiBicm91Z2h0IGEgZml4IHRoYXQgbWFrZXMgbGliY3VybAogIGxpYnRvb2xpZmllZCwganVzdCBhcyB3ZSd2ZSB3YW50ZWQgZm9yIGEgd2hpbGUgbm93LiBIZSBhbHNvIG1hZGUgdGhlCiAgcmVjZW50bHkgYWRkZWQgbWFuIHBhZ2VzIGdldCBpbnN0YWxsZWQgcHJvcGVybHkgb24gJ21ha2UgaW5zdGFsbCcgYW5kIHNvbWUKICBvdGhlciBuaWNlIGNsZWFudXBzLgoKLSBJbiBhIGRpc2N1c3Npb24gd2l0aCBFZXR1IE9qYW5lbiBpdCBzdHJ1Y2sgbWUgdGhhdCBpZiB3ZSB1c2UgY3VybCB0byBnZXQgYQogIHBhZ2UgdXNpbmcgYSBwYXNzd29yZCwgYW5kIHRoYXQgcGFnZSB0aGVuIHNlbmRzIGEgTG9jYXRpb246IHRvIGFub3RoZXIKICBzZXJ2ZXIgdGhhdCBjdXJsIGZvbGxvd3MsIGN1cmwgd2lsbCBzZW5kIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIHRvIHRoYXQKICBzZXJ2ZXIgYXMgd2VsbC4KCiAgTm93LCBJJ2xsIG5ldmVyIGJlIGFibGUgdG8gbWFrZSBjdXJsIGRvIExvY2F0aW9uOiBmb2xsb3dpbmcgYWxsIHRoYXQgcGVyZmVjdAogIGFuZCB5b3UncmUgYWxsIHNvb25lciBvciBsYXRlciByZXF1aXJlZCB0byB3cml0ZSBhIHNjcmlwdCB0byBkbyBzZXZlcmFsCiAgZmV0Y2hlcyB3aGVuIHlvdSdyZSBkb2luZyBhZHZhbmNlZCBzdHVmZiwgYnV0IG5vdyBJJ3ZlIG1vZGlmaWVkIGN1cmwgdG8gYXQKICBsZWFzdCAqb25seSogc2VuZCB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCB0byB0aGUgb3JpZ2luYWwgc2VydmVyLiBXaGljaAogIG1lYW5zIHRoYXQgaWYgZ2V0IGEgcGFnZSBmcm9tIHNlcnZlciBBIHdpdGggYSBwYXNzd29yZCwgdGhhdCBmb3J3YXJkcyBjdXJsCiAgdG8gc2VydmVyIEIsIGN1cmwgd29uJ3QgdXNlIHRoZSBwYXNzd29yZCB0aGVyZS4gSWYgc2VydmVyIEIgdGhlbiBmb3J3YXJkcwogIGN1cmwgYmFjayB0byBzZXJ2ZXIgQSBhZ2FpbiwgdGhlIHBhc3N3b3JkIHdpbGwgYmUgdXNlZCBhZ2Fpbi4KCiAgVGhpcyBpcyBub3QgYSBwZXJmZWN0IGltcGxlbWVudGF0aW9uLCBhcyBpbiBhIGJyb3dzZXIgY2FzZSBpdCB3b3VsZCBvbmx5IHVzZQogIHRoZSBwYXNzd29yZCBpZiB0aGUgbGVmdC1wcmVmaXggb2YgdGhlIGZpcnN0IHBhdGggaXMgdGhlIHNhbWUuIEkganVzdCB0aGluawogIHRoYXQgdGhpcyBmaXggcHJldmVudHMgYSBzb21ld2hhdCBsdXJreSAic2VjdXJpdHkgaG9sZSIuCgogIEFzIGEgc2lkZS1ub3RlIGluIHRoaXMgc3ViamVjdDogSFRUUCBwYXNzd29yZHMgYXJlIHNlbnQgaW4gY2xlYXJ0ZXh0IGFuZAogIHdpbGwgbmV2ZXIgYmUgY29uc2lkZXJlZCB0byBiZSBzYWZlIG9yIHNlY3VyZS4gVXNlIEhUVFBTIGZvciB0aGF0LgoKLSBBcyBkaXNjdXNzZWQgb24gdGhlIG1haWxpbmcgbGlzdCwgSSBjb252ZXJ0ZWQgdGhlIEZUUCByZXNwb25zZSByZWFkaW5nCiAgZnVuY3Rpb24gaW50byB1c2luZyBzZWxlY3QoKSB3aGljaCB0aGVuIGFsbG93cyB0aW1lb3V0cyAoZXZlbiB1bmRlciB3aW4zMiEpCiAgaWYgdGhlIGNvbW1hbmQtcmVwbHkgc2Vzc2lvbiBnZXRzIHRvbyBzbG93IG9yIGRpZXMgY29tcGxldGVseS4gSSBtYWRlIGEKICBkZWZhdWx0IHRpbWVvdXQgb24gMzYwMCBzZWNvbmRzIHVubGVzcyBhbnl0aGluZyBlbHNlIGlzIHNwZWNpZmllZCwgc2luY2UgSQogIGRvbid0IHRoaW5rIGFueW9uZSB3YW50cyB0byB3YWl0IG1vcmUgdGhhbiB0aGF0IGZvciBhIHNpbmdsZSBjaGFyYWN0ZXIgdG8KICBnZXQgcmVjZWl2ZWQuLi4KCi0gVG9yc3RlbiBGb2VydHNjaCA8dG9yc3Rlbi5mb2VydHNjaCBhdCBnbXgubmV0PiBicm91Z2h0IGEgc2V0IG9mIGZpeGVzIGZvcgogIHRoZSByZmMxODY3IGZvcm0gcG9zdHMuIEhlIGludHJvZHVjZWQgJ25hbWU9PGZpbGUnIHdoaWNoIGJyaW5ncyBhIG1lYW5zIHRvCiAgc3V1cGx5IHZlcnkgbGFyZ2UgdGV4dCBjaHVua3MgcmVhZCBmcm9tIHRoZSBnaXZlbiBmaWxlIG5hbWUuIEl0IGRpZmZlcnMgZnJvbQogICduYW1lPUBmaWxlJyBpbiB0aGUgd2F5IHRoYXQgdGhpcyBsYXR0ZXIgdGhpbmcgaXMgbWFya2VkIGluIHRoZSB1cGxvYWRlZAogIGNvbnRlbnRzIGFzIGEgZmlsZSB1cGxvYWQsIHdoaWxlIHRoZSBmaXJzdCBpcyBqdXN0IHRleHQgKGFzIGluIGEgaW5wdXQgb3IKICB0ZXh0YXJlYSBmaWVsZCkuIFRvcnN0ZW4gYWxzbyBjb3JyZWN0ZWQgYSBidWcgdGhhdCB3b3VsZCBoYXBwZW4gaWYgeW91IHVzZWQKICAlcyBvciBzaW1pbGFyIGluIGEgLUYgZmlsZSBuYW1lLgoKLSBBcyBkaXNjb3ZlcmVkIGJ5IE5pY28gQmFnZ3VzIDxOaWNvLkJhZ2d1cyBhdCBtYWlsLmluZy5ubD4sIHdoZW4gdHJhbnNmZXJyaW5nCiAgZmlsZXMgdG8vZnJvbSBGVFAgdXNpbmcgdHlwZSBBU0NJSSBjdXJsIHNob3VsZCBub3QgZXhwZWN0IHRoZSB0cmFuc2ZlciB0byBiZQogIHRoZSBleGFjdCBzaXplIHJlcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIgYXMgdGhlIGZpbGUgc2l6ZS4gU2luY2UgQVNDSUkgbWF5IHZlcnkKICB3ZWxsIG1lYW4gdGhhdCB0aGUgY29udGVudCBpcyB0cmFuc2xhdGVkIHdoaWxlIHRyYW5zZmVyZWQsIHRoZSBmaW5hbCBzaXplCiAgbWF5IHZlcnkgd2VsbCBkaWZmZXIuIFRoZXJlZm9yLCBjdXJsIG5vdyBpZ25vcmVzIHRoZSBmaWxlIHNpemUgd2hlbiBkb2luZwogIEFTQ0lJIHRyYW5zZmVycyBpbiBGVFAuCgpEYW5pZWwgKDI0IEp1bHkgMjAwMCkKLSBBZGRlZCBDVVJMT1BUX1BST1hZUE9SVCB0byB0aGUgY3VybF9lYXN5X3NldG9wdCgpIGNhbGwgdG8gYWxsb3cgdGhlIHByb3h5CiAgcG9ydCBudW1iZXIgdG8gYmUgc2V0IHNlcGFyYXRlbHkgZnJvbSB0aGUgcHJveHkgaG9zdCBuYW1lLgoKLSBBbmRyZXcgPGFuZHJldyBhdCB1Z2gubmV0LmF1PiBwb2ludGVkIG91dCBhIG5ldHJjIG1hbnVhbCBidWcuCgotIFRoZSBGVFAgdHJhbnNmZXIgY29kZSBub3cgYWNjZXB0cyBhIDI1MC1jb2RlIGFzIHdlbGwgYXMgdGhlIHByZXZpb3VzbHkKICBhY2NlcHRlZCAyMjYsIGFmdGVyIGEgc3VjY2Vzc2Z1bCBmaWxlIHRyYW5zZmVyLiBNb2hhbiA8bW5haXIgYXQKICBldmVyZ3JlZW4tZnVuZHMuY29tPiBwb2ludGVkIHRoaXMgb3V0LgoKLSBUaGUgY2hlY2sgZm9yICpib3RoKiBuc2wgYW5kIHNvY2tldCB3YXMgbmV2ZXIgYWRkZWQgaW4gdGhlIHY3IGNvbmZpZ3VyZS5pbgogIHdoZW4gSSBtb3ZlZCB0aGUgbWFpbiBicmFuY2guIEkgcmUtYWRkZWQgdGhhdCBjaGVjayB0byBjb25maWd1cmUuaW4uIFRoaXMgd2FzCiAgZGlzY292ZXJlZCBieSBSaWNoIEdyYXkuCgotIEhvd2FyZCwgQmxhaXNlIDxCbGFpc2UuSG93YXJkIGF0IGZhY3RpdmEuY29tPiBwb2ludGVkIG91dCBhIG1pc3NpbmcgZnJlZSgpIGluCiAgY3VybF9kaXNjb25uZWN0KCkgd2hpY2ggb2YgY291cnNlIG1lYW50IGxpYmN1cmwgYXRlIG1lbW9yeS4KCi0gQnJpYW4gRS4gR2FsbGV3IG5vdGVkIHRoYXQgdGhlIEhUVFAgJ0hvc3Q6JyBoZWFkZXIgY3VybCBzZW50IGRpZCBub3QKICBwcm9wZXJseSBpbmNsdWRlIHRoZSBwb3J0IG51bWJlciBpZiBub24tZGVmYXVsdCBwb3J0cyB3ZXJlIHVzZWQuIFRoaXMgc2hvdWxkCiAgbm93IGhhdmUgYmVlbiBmaXhlZC4KCi0gSFRUUCBjb25uZWN0IGVycm9ycyBub3cgcmV0dXJuIGVycm9ycyBlYXJsaWVyLiBUaGlzIHdhcyBtb3N0IG5vdGFibHkgY2F1c2luZwogIHByb2JsZW1zIHdoZW4gdGhlIEhUVFBTIGNlcnRpZmljYXRlIGhhZCBwcm9ibGVtcyBhbmQgbGF0ZXIgY2F1c2VkIGEgY3Jhc2guCiAgTWFueSB0aGFua3MgdG8gR3JlZ29yeSBOaWNob2xscyA8Z25pY2hvbGxzIGF0IGxldmVsOC5jb20+IGZvciBkaXNjb3ZlcmluZwogIGFuZCBzdWdnZXN0aW5nIGEgZml4Li4uCgpEYW5pZWwgKDIxIEp1bmUgMjAwMCkKLSBBZnRlciBhICJidWcgcmVwb3J0IiBJIHJlY2VpdmVkIHdoZXJlIHRoZSB1c2VyIHdhcyB1c2luZyBib3RoIC1GIGFuZCAtSSBpbiBhCiAgSFRUUCByZXF1ZXN0IChpdCBzZXZlcmx5IGNvbmZ1c2VkIHRoZSBsaWJyYXJ5IEkgc2hvdWxkIGFkZCksIEkgYWRkZWQgc29tZQogIGNoZWNrcyB0byBzcmMvbWFpbi5jIHRoYXQgcHJldmVudHMgc2V0dGluZyBtb3JlIHRoYW4gb25lIEhUVFAgcmVxdWVzdAogIGNvbW1hbmQsIG5vIG1hdHRlciB3aGF0IHRoZSB1c2VyIHdhbnRzISA7LSkKClZlcnNpb24gNy4wLjhiZXRhCgpEYW5pZWwgKDIwIEp1bmUgMjAwMCkKLSBJIGRpZCBhIG1ham9yIHJlcGxhY2UgaW4gbWFueSBmaWxlcyB0byB1c2UgdGhlIG5ldyBjdXJsIGRvbWFpbiBoYXh4LnNlCiAgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgb25lLgoKLSBBcyBFZXR1IE9qYW5lbiBzdWdnZXN0ZWQsIEkgZmluYWxseSB0b29rIHRoZSBzdGVwIGFuZCBub3cgbGliY3VybCBubyBsb25nZXIKICBtYWtlcyBhIFBPU1QgYWZ0ZXIgaXQgaGFzIGZvbGxvd2VkIGEgbG9jYXRpb24uIFdoZW4gdGhlIGluaXRpYWwgUE9TVCBoYXMKICBiZWVuIGRvbmUsIGl0J2xsIHR1cm5lZCBpbnRvIGEgR0VUIGZvciB0aGUgZnVydGhlciByZXF1ZXN0cy4gVGhpcyBpcyBvbmx5CiAgaW50ZXJlc3Rpbmcgd2hlbiB1c2luZyAtTC8tLWxvY2F0aW9uICphbmQqIGRvaW5nIGEgUE9TVCBhdCB0aGUgc2FtZSB0aW1lLgoKICBXaGlsZSBtZXNzaW5nIHdpdGggdGhpcywgSSBhZGRlZCBhbm90aGVyIHdlaXJkIGZlYXR1cmUgSSBjYWxsICdhdXRvCiAgcmVmZXJlcicuIElmIHlvdSBhcHBlbmQgJzthdXRvJyB0byB0aGUgcmlnaHQgb2YgYSBnaXZlbiByZWZlcmVyIHN0cmluZyAob3IKICBvbmx5IHVzZSB0aGF0IHN0cmluZyBhcyByZWZlcmVyKSwgbGliY3VybCB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRoZQogIHByZXZpb3VkIFVSTCBhcyByZWZlcmVkIHdoZW4gaXQgZm9sbG93cyBhIExvY2F0aW9uOiBhbmQgZ2V0cyBhIHN1Y2NlZWRpbmcKICBkb2N1bWVudC4KCi0gTXkgaGVybyBSaWNoIEdyYXkgZm91bmQgdGhlIHZlcnkgb2JzY3VyZSBGVFAgYnVnIHRoYXQgaGFwcGVuZWQgdG8gaGltIG9ubHkKICB3aGVuIHBhc3NpbmcgdGhyb3VnaCBhIHBhcnRpY3VsYXIgZmlyZXdhbGwgYW5kIHVzaW5nIHRoZSBQT1JUIGNvbW1hbmQuIEl0CiAgdHVybmVkIG91dCB0aGF0IFBPUlQgd2FzIHRoZSBvbmx5IGNvbW1hbmQgaW4gdGhlIGxpYi9mdHAuYyBzb3VyY2UgdGhhdAogIGRpZG4ndCBzZW5kIGEgcHJvcGVyIFxyXG4gc2VxdWVuY2UgYnV0IGluc3RlYWQgdXNlZCB0aGUgZmF1bHR5IFxuIHdoaWNoIGFzCiAgaXQgc2VlbWVkIGlzIHN1cHBvcnRlZCBieSBtb3N0IG1ham9yIGZ0cCBzZXJ2ZXJzLi4uIDotTwoKVmVyc2lvbiA3LjAuN2JldGEKCkRhbmllbCAoMTYgSnVuZSAyMDAwKQotIEkgaGFkIGF2b2lkZWQgdGhpcyBsb25nIGVub3VnaCBub3csIHNvIEkgbW92ZWQgdGhlIGFsdGVybmF0aXZlIHByb2dyZXNzIGJhcgogIHN0dWZmIGZyb20gdGhlIGxpYiBhbmQgYWRkZWQgaXQgdG8gdGhlIGNsaWVudCBjb2RlLiBUaGlzIGlzIG5vdyB1c2luZyB0aGUKICByZWNlbnRseSBhZGRlZCBwcm9ncmVzcyBjYWxsYmFjayBhbmQgaXQgc2VlbXMgdG8gd29yayBwcmV0dHkgbXVjaCBsaWtlCiAgYmVmb3JlLiBTaW5jZSBpdCBpcyBvbmx5IG9uZSBwcm9ncmVzcyBiYXIgYW5kIHlvdSBhbmQgZG93bmxvYWQgYW5kIHVwbG9hZCBhdAogIHRoZSBzYW1lIHRpbWUsIHRoaXMgYmFyIHNob3dzIHRoZSBjb21iaW5lZCBwcm9ncmVzcyBvZiBib3RoIGRpcmVjdGlvbnMuIFRoaXMKICBjb2RlIHdhcyBqdXN0IHBvcnRlZCBmcm9tIHRoZSBvbGQgcGxhY2UgdG8gdGhpcywgTGFycyBpcyBzdGlsbCBvdXIgc2F2aW91ciEKICA7LSkgVGhpcyBhbHNvIG1hZGUgdGhlIGRvY3VtZW50YXRpb24gbW9yZSBhY2N1cmF0ZSBzaW5jZSBJIG5ldmVyIHJlbW92ZWQKICB0aGlzIGZ1bmN0aW9uIGZyb20gYW55IGRvY3MhIEFsdGhvdWdoIEkgbm93IHJlbW92ZWQgdGhlIENVUkxPUFRfUFJPR1JFU1NNT0RFCiAgZnJvbSB0aGUgbGlicmFyeSBzaW5jZSB0aGUgbGliIGhhcyBvbmx5IG9uZSBpbnRlcm5hbCBwcm9ncmVzcyBtZXRlciBhbmQgaXQKICB3aWxsIG5ldmVyIGdldCBhbm90aGVyLiBJdCBpcyBhbHRob3VnaCBsaWtlbHkgdGhhdCB0aGUgaW50ZXJuYWwgb25lIGFsc28KICB3aWxsIGJlIG1vdmVkIHRvIHRoZSBjbGllbnQgY29kZSBpbiB0aGUgZnV0dXJlICh3aGVuIEkgaGF2ZSBvdGhlciBtZWFucyBvZgogIGdldHRpbmcgdGhlIHdyaXRlb3V0IGRhdGEgYW5kIG1vdmUgdGhhdCB0b28gdG8gdGhlIGNsaWVudCkuCgotIEkgdG9vayB0aGUgb3Bwb3J0dW5pdHkgdG8gdmVyaWZ5IHRoYXQgc3RhbmRhcmQgcHJvZ3Jlc3MgbWV0ZXIgd29ya3MgYW5kIEkKICBmb3VuZCBvdXQgaXQgZGlkbid0IGdldCBpbml0ZWQgcHJvcGVybHkuIEdycnIuIEkgY29ycmVjdGVkIHRoYXQgYXMgd2VsbC4KCkRhbmllbCAoMTUgSnVuZSAyMDAwKQotIEkgdGhvdWdodCBJJ2QgYmV0dGVyIHZlcmlmeSB0aGF0IHRoZSAtRiBvcHRpb24gc3RpbGwgd29ya3MgaW4gdjcgYW5kIG9mCiAgY291cnNlIGl0IGRpZG4ndC4uLiA6LS8gQW55d2F5LCBJIGhhZCB0aGUgcHJvYmxlbXMgSSBjb3VsZCBkaXNjb3ZlcgogIGNvcnJlY3RlZC4gQWJvdXQgb25lIG1vbnRoIG9mIGJldGEgdGVzdGluZyBhbmQgbm90IGEgc2luZ2xlIHBlcnNvbiBoYXMgdXNlZAogIHRoaXMgZmVhdHVyZSB3aXRoIHY3PwoKLSBCavZybiBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCB0aGUgLS1wcm9ncmVzcy1iYXIgc3RpbGwgZG9lc24ndCB3b3JrIGluCiAgdjcuIEhtLgoKRGFuaWVsICgxNCBKdW5lIDIwMDApCi0gVGltIFRhc3NvbmlzIGRpc2NvdmVyZWQgdGhhdCBjdXJsIDcgZGlkbid0IGhhbmRsZSBub3JtYWwgaHR0cCBQT1NUIGFzIGl0CiAgc2hvdWxkLiBJIGNvcnJlY3RlZCB0aGlzLgoKVmVyc2lvbiA3LjAuNmJldGEKCkRhbmllbCAoMTQgSnVuZSAyMDAwKQotIEJq9nJuIFN0ZW5iZXJnIHBvaW50ZWQgb3V0IHNldmVyYWwgcHJvYmxlbXMgKHJlbGF0ZWQgdG8gd2luMzIgY29tcGlsaW5nKToKICBsaWIvc3RyZXF1YWwuYyBoYWQgYSBiYWQgI2lmZGVmIGZvciBvbmUgb2YgdGhlIHN0cmluZyBjb21wYXJpc29ucyAod2luMzIpCiAgc3JjL21haW4uYyBoYWQgc2V2ZXJhbCBtaW5vciBwcm9ibGVtcwogIGxpYi9tYWtlZmlsZS5tMzIgaGFkIGdldHBhc3MuW2NvXSB0d2ljZQogIHNyYy9jb25maWctd2luMzIuaCBsYWNrZWQgdGhlIEhBVkVfRkNOVExfSCBkZWZpbmUKICBib3RoIGNvbmZpZy13aW4zMi5oIGZpbGVzIG5vdyBvbmx5IHNldCB0aGUgSEFWRV9VTklTVERfSCBkZWZpbmUgaWYgdGhlCiAgZGVmaW5lIE1JTkdXMzIgaXMgc2V0LCBhbmQgSSBtb2RpZmllZCBzcmMvbWFrZWZpbGUubTMyIGFuZCBsaWIvbWFrZWZpbGUubTMyCiAgdG8gc2V0IGl0LgoKVmVyc2lvbiA3LjAuNWJldGEKCkRhbmllbCAoMTQgSnVuZSAyMDAwKQotIEFwcGxpZWQgTHVvbmcgRGluaCBEdW5nJ3MgY29tbWVudHMgYWJvdXQgYSBmZXcgd2luMzIgY29tcGlsZSBwcm9ibGVtcy4KCi0gQXBwbGllZCBCavZybiBTdGVuYmVyZydzIHN1Z2dlc3RlZCBmaXggdGhhdCB0dXJucyB0aGUgd2luMzIgc3Rkb3V0IHRvCiAgYmluYXJ5LiBJdCB3b24ndCBkbyBpdCBpZiB0aGUgLUIgLyAtLXVzZS1hc2NpaSBvcHRpb24gaXMgdXNlZC4gVGhhdCBvcHRpb24KICBpcyBub3cgYW4gZXh0ZW5kZWQgdmVyc2lvbiBvZiB0aGUgcHJldmlvdXMgLUIgLy0tZnRwLS1hc2NpaS4gVGhlIGZsYWcgd2FzCiAgYWxyZWFkeSBpbiB1c2UgYmUgdGhlIGxkYXAgYXMgd2VsbCBzbyB0aGUgbmV3IG5hbWUgZml0cyBwcmV0dHkgZ29vZC4gVGhlCiAgbGliY3lybCBDVVJMT1BUX1RSQU5TRkVSVEVYVCB3YXMgYWxzbyBpbnRyb2R1Y2VkIGFzIGFuIGFsaWFzIHRvIHRoZSBub3cKICBvYnNvbGV0ZSBDVVJMT1BUX0ZUUEFTQ0lJLiBDYW4ndCB2ZXJpZnkgdGhpcyBmaXggbXlzZWxmIGFzIEkgaGF2ZSBubyB3aW4zMgogIGNvbXBpbGVyIGFyb3VuZC4KCkRhbmllbCAoMTMgSnVuZSAyMDAwKQotIEx1b25nIERpbmggRHVuZyA8ZHVuZyBhdCBzY2guYm1lLmh1PiBmb3VuZCBhIHByb2JsZW0gaW4gY3VybF9lYXN5X2NsZWFudXAoKQogIHNpbmNlIGl0IGZyZWUoKWVkIHRoZSBtYWluIGN1cmwgc3RydWN0ICp0d2ljZSouIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KCkRhbmllbCAoOSBKdW5lIDIwMDApCi0gVXBkYXRlZCB0aGUgUkVTT1VSQ0VTIGZpbGUsIGFkZGVkIGEgUkVBRE1FLndpbjMyIGZpbGUuCgpEYW5pZWwgKDggSnVuZSAyMDAwKQotIFNvIEkgZmluYWxseSBhZGRlZCB0aGUgcHJvZ3Jlc3MgY2FsbGJhY2sgdG8gdGhlICpzZXRvcHQoKSBvcHRpb25zIGFuZCBpdAogIHNob3VsZCB3b3JrIG5vdy4gSSBkb24ndCBoYXZlIHRoZSBlbmVyZ3kgdG8gd3JpdGUgYW55IHRlc3QgcHJvZ3JhbSBmb3IgaXQKICByaWdodCBub3cuCi0gTWFkZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdHlwZWRlZnMgcHVibGljIGluIGN1cmwvY3VybC5oIGZvciBjb21mb3J0LiBKdXN0CiAgaW4gY2FzZSBhbnlvbmUgd2FubmEgZmlkZGxlIHdpdGggc3VjaCBwb2ludGVycy4KLSBVcGRhdGVkIHRoZSBjdXJsX2Vhc3lfc2V0b3B0KCkgbWFuIHBhZ2UgYWNjb3JkaW5nbHkuCgpWZXJzaW9uIDcuMC40YmV0YQoKRGFuaWVsICgyIEp1bmUgMjAwMCkKLSBJIG5vdGljZWQgdGhhdCB3aGVuIGRvaW5nIExvY2F0aW9uOiBmb2xsb3dpbmcsIHdlIGxvc3QgY3VzdG9tIGhlYWRlcnMgaW4gYWxsCiAgYnV0IHRoZSBmaXJzdCByZXF1ZXN0LgotIFJlbW92ZWQgdGhlICdIdHRwUG9zdCcgc3RydWN0IGFuZCBtb3ZlZCB0aGUgaGVhZGVyIHN0dWZmIHRvIHRoZSBtb3JlIGdlbmVyaWMKICBjdXJsX3NsaXN0LgotIEFkZGVkIHNvbWUgYmV0dGVyIHNsaXN0LWNsZWFudXBzIGluIHNyYy9tYWluLmMKClZlcnNpb24gNy4wLjNiZXRhCgpEYW5pZWwgKDMxIE1heSAyMDAwKQotIFNvIEkgZGlzY292ZXJlZCB0aGF0IEkgcmVsZWFzZWQgdGhlIDcuMC4yYmV0YSB3aXRob3V0IGl0IGJlaW5nIGFibGUgdG8KICBjb21waWxlIHVuZGVyIExpbnV4LiBnZXRob3N0YnluYW1lX3IoKSBhbmQgZ2V0aG9zdGJ5YWRkcl9yKCkgdHVybmVkIG91dCB0bwogIGZlYXR1cmUgYSBkaWZmZXJlbnQgYW1vdW50IG9mIGFyZ3VtZW50cyBvbiBkaWZmZXJlbnQgc3lzdGVtcyBzbyBJIGhhZCB0byBhZGQKICBhIGNvbmZpZ3VyZSBjaGVjayBmb3IgdGhpcyBhbmQgYWRqdXN0IHRoZSBjb2RlIHNsaWdodGx5LgoKVmVyc2lvbiA3LjAuMmJldGEKCkRhbmllbCAoMjkgTWF5IDIwMDApCi0gQ29ycmVjdGVkIHRoZSBiaXRzLiogYXNzaWdubWVudHMgd2hlbiB1c2luZyBDVVJMT1BUIG9wdGlvbnMgdGhhdCBvbmx5CiAgdG9nZ2xlcyBvbmUgb2YgdGhvc2UgYml0cy4KCi0gQXBwbGllZCB0aGUgaHVnZSBwYXRjaGVzIGZyb20gRGF2aWQgTGVCbGFuYyA8ZGxlYmxhbmMgYXQgcW54LmNvbT4gdGhhdCBhZGQKICB1c2FnZSBvZiB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIHNpbWlsYXIgZnVuY3Rpb25zIGluIGNhc2UgdGhleSdyZSBhcm91bmQsCiAgc2luY2UgdGhhdCBtYWtlIGxpYmN1cmwgbXVjaCBiZXR0ZXIgdGhyZWFkc2FmZSBpbiBtYW55IHN5c3RlbXMgKHN1Y2ggYXMKICBzb2xhcmlzKS4gSSBhZGRlZCB0aGUgY2hlY2tzIGZvciB0aGVzZSBmdW5jdGlvbnMgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCgogIEkgY2FuJ3QgZXhwbGFpbiB3aHksIGJ1dCB0aGUgaW5ldF9udG9hX3IoKSBmdW5jdGlvbiBkaWQgbm90IGFwcGVhciBpbiBteQogIFNvbGFyaXMgaW5jbHVkZSBmaWxlcywgSSBoYWQgdG8gYWRkIG15IG93biBpbmNsdWRlIGZpbGUgZm9yIHRoaXMgZm9yIG5vdy4KCkRhbmllbCAoMjIgTWF5IDIwMDApCi0gSvZybiBIYXJ0cm90aCBicm91Z2h0IG1lIGZpeGVzIHRvIG1ha2UgdGhlIHdpbjMyIHZlcnNpb24gY29tcGlsZSBwcm9wZXJseSBhcwogIHdlbGwgYXMgYSByZW5hbWUgb2YgdGhlICdpbnRlcmZhY2UnIGZpZWxkIGluIHRoZSB1cmxkYXRhIHN0cnVjdCwgYXMgaXQgc2VlbXMKICB0byBiZSByZXNlcnZlZCBpbiBzb21lIGdjYyB2ZXJzaW9ucyEKCi0gUmljaCBHcmF5IHN0cnVjayBiYWNrIHdpdGggeWV0IHNvbWUgcG9ydGFiaWxpdHkgcmVwb3J0cy4gRGF0YSBHZW5lcmFsIERHL1VYCiAgbmVlZGVkIGEgbGl0dGxlIGZpeCBpbiBsaWIvbGRhcC5jIHNpbmNlIGl0IGRvZXNuJ3QgaGF2ZSBSVExEX0dMT0JBTCBkZWZpbmVkLgogIE1vcmUgZml4ZXMgYXJlIGV4cGVjdGVkIGFzIGEgcmVzdWx0IG9mIFJpY2hpZXMgdmVyeSBoZWxwZnVsIHdvcmsuCgpWZXJzaW9uIDcuMC4xYmV0YQoKRGFuaWVsICgyMSBNYXkgMjAwMCkKLSBVcGRhdGVkIGxvdHMgb2YgI2RlZmluZXMsIGVudW1zIGFuZCB2YXJpYWJsZSB0eXBlIG5hbWVzIGluIHRoZSBsaWJyYXJ5LiBObwogIG1vcmUgd2VpcmQgVVJHIG9yIFVSTFRBRyBwcmVmaXhlcy4gQWxsIHR5cGVzIGFuZCBuYW1lcyBzaG91bGQgYmUgY3VybC0KICBwcmVmaXhlZCB0byBhdm9pZCBuYW1lIHNwYWNlIGNsYXNoZXMuIFRoZSBGTEFHUy1wYXJhbWV0ZXIgdG8gdGhlIGZvcm1lcgogIGN1cmxfdXJsZ2V0KCkgaGFzIGJlZW4gY29udmVydGVkIGludG8gYSBidW5jaCBvZiBmbGFncyB0byB1c2UgaW4gc2VwYXJhdGUKICBzZXRvcHQgY2FsbHMuIEknbSBzdGlsbCBmb2N1c2luZyBvbiB0aGUgZWFzeS1pbnRlcmZhY2UsIGFzIHRoZSBjdXJsIHRvb2wgaXMKICBub3cgdXNpbmcgdGhhdC4KCi0gQmpvcm4gUmVlc2UgaGFzIHByb3ZpZGVkIG1lIHdpdGggYW4gYXN5bmNocm9ub3VzIG5hbWUgcmVzb2x2ZXIgdGhhdCBJIHBsYW4KICB0byB1c2UgaW4gdXBjb21pbmcgdmVyc2lvbnMgb2YgY3VybCB0byBiZSBhYmxlIHRvIGdyYWNlZnVsbHkgdGltZW91dCBuYW1lCiAgbG9va3Vwcy4KClZlcnNpb24gNy4wYmV0YQoKRGFuaWVsICgxOCBNYXkgMjAwMCkKLSBJbnRyb2R1Y2VkIExJQkNVUkxfVkVSU0lPTl9OVU0gdG8gdGhlIGN1cmwuaCBpbmNsdWRlIGZpbGUgdG8gYmV0dGVyIGFsbG93CiAgc291cmNlIGNvZGVzIHRvIGJlIGRlcGVuZGVudCBvbiB0aGUgbGliIHZlcnNpb24uIFRoaXMgZGVmaW5lIGlzIG5vdyBzZXQgdG8KICBhIGRleGFkZWNpbWFsIG51bWJlciwgd2l0aCA4IGJpdHMgZWFjaCBmb3IgbWFqb3IgbnVtYmVyLCBtaW5vciBudW1iZXIgYW5kCiAgcGF0Y2ggbnVtYmVyLiBJbiBvdGhlciB3b3JkcywgdmVyc2lvbiAxLjIuMyB3b3VsZCBtYWtlIGl0IDB4MDEwMjAzLiBJdCBhbHNvCiAgbWFrZXMgYSBsYXJnZXIgbnVtYmVyIGEgbmV3ZXIgdmVyc2lvbi4KCkRhbmllbCAoMTcgTWF5IDIwMDApCi0gTWFydGluIEthbW1lcmhvZmVyIGNvcnJlY3RseSBwb2ludGVkIG91dCBzZXZlcmFsIGZsYXdzIGluIHRoZSBGVFAgcmFuZ2UKICBvcHRpb24uIEkgY29ycmVjdGVkIHRoZW0uCi0gUmVtb3ZlZCB0aGUgd2luMzIgd2luc29jayBpbml0IGNyYXAgZnJvbSB0aGUgbGliIHRvIHRoZSBzcmMvbWFpbi5jIGZpbGUKICBpbiB0aGUgYXBwbGljYXRpb24gaW5zdGVhZC4gVGhleSBjYW4ndCBiZSBpbiB0aGUgbGliLCBlc3BlY2lhbGx5IG5vdCBmb3IKICBtdWx0aXRocmVhZGVkIHB1cnBvc2VzLgoKRGFuaWVsICgxNiBNYXkgMjAwMCkKLSBSZXdyb3RlIHRoZSBzcmMvbWFpbi5jIHNvdXJjZSB0byB1c2UgdGhlIG5ldyBlYXN5LWludGVyZmFjZSB0byBsaWJjdXJsIDcuCiAgVGhlcmUgaXMgc3RpbGwgbW9yZSB3b3JrIHRvIGRvLCBidXQgdGhlIGZpcnN0IHN0ZXAgaXMgbm93IHRha2VuLgogIDxjdXJsL2Vhc3kuaD4gaXMgdGhlIGluY2x1ZGUgZmlsZSB0byB1c2UuCgpEYW5pZWwgKDE0IE1heSAyMDAwKQotIEZUUCBVUkxzIGFyZSBub3cgdHJlYXRlZCBzbGlnaHRseSBkaWZmZXJlbnQsIG1vcmUgYWNjb3JkaW5nIHRvIFJGQyAxNzM4LgotIEZUUCBzZXNzaW9ucyBhcmUgbm93IHBlcmZvcm1lZCBkaWZmZXJlbnRseSwgd2l0aCBDV0QgY29tbWFuZHMgdG8gY2hhbmdlCiAgZGlyZWN0b3J5IGluc3RlYWQgb2YgUkVUUi9TVE9SL0xJU1Qgd2l0aCB0aGUgZnVsbCBwYXRoLiBEaXNjdXNzaW9ucyB3aXRoCiAgUmljaCBHcmF5IG1hZGUgbWUgbm90aWNlIHRoZXNlIHByb2JsZW1zLgotIEphbm5lIEpvaGFuc3NvbiBkaXNjb3ZlcmVkIGFuZCBjb3JyZWN0ZWQgYSBidWZmZXIgb3ZlcmZsb3cgaW4gdGhlCiAgc3JjL3Vzcmdsb2IuYyBmaWxlLgotIEkgaGFkIHRvIGFkZCBhIGxpYi9zdHJlcXVhbC5jIGZpbGUgZm9yIGRvaW5nIGNhc2UgaW5zZW5zaXRpdmUgc3RyaW5nCiAgY29tcGFyZXMgb24gYWxsIHBsYXRmb3Jtcy4KCkRhbmllbCAoOCBNYXkgMjAwMCk6Ci0gQmVlbiB3b3JraW5nIGxvdHMgb24gdGhlIG5ldyBsaWIuCi0gVG9nZXRoZXIgd2l0aCBSaWNoIEdyYXksIEkndmUgdHJpZWQgdG8gYWRqdXN0IHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIHdvcmsKICBiZXR0ZXIgb24gdGhlIE5DUiBNUC1SQVMgVW5peC4KCkRhbmllbCAoMiBNYXkgMjAwMCk6Ci0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBwb2ludGVkIG91dCB0aGF0IEkgaGFkIGEgZmV3IHRvbyBtYW55IGluc3RydWN0aW9ucyBpbgogIGNvbmZpZ3VyZS5pbiB0aGF0IGRpZG4ndCBkbyBhbnkgZ29vZC4KCkRhbmllbCAoMjQgQXByaWwgMjAwMCk6Ci0gQWRkZWQgYSBuZXcgcGFyYWdyYXBoIHRvIHRoZSBGQVEgYWJvdXQgd2hhdCB0byBkbyB3aGVuIGNvbmZpZ3VyZSBjYW4ndAogIGZpbmQgT3BlblNTTCBldmVuIHRob3VnaCBpdCBpcyBpbnN0YWxsZWQuIFN1cHBsaWVkIGJ5IEJvYiBBbGxpc29uCgpEYW5pZWwgKDEyIEFwcmlsIDIwMDApOgotIFN0YXJ0ZWQgbWVzc2luZyBhcm91bmQgYmlnLXRpbWUgdG8gY29udmVydCB0aGUgb2xkIGxpYnJhcnkgaW50ZXJmYWNlIHRvIGEKICBiZXR0ZXIgb25lLi4uCgpEYW5pZWwgKDggQXByaWwgMjAwMCk6Ci0gTWFkZSB0aGUgcHJvZ3Jlc3MgYmFyIGxvb2sgYmV0dGVyIGZvciBmaWxlIHNpemVzIGJldHdlZW4gOTk5OSBraWxvYnl0ZXMKICBhbmQgMTAwIG1lZ2FieXRlcy4gVGhleSdyZSBub3cgZGlzcGxheWVkIFhYLlhNLgotIEkgYWxzbyBub3RpY2VkIHRoYXQgZnRwIGZldGNoZXMgdGhyb3VnaCBIVFRQIHByb3hpZXMgZGlkbid0IGFkZCB0aGUgdXNlcgogIGFnZW50IHN0cmluZy4gSXQgZG9lcyBub3cuCi0gSGFiaWJpZSA8aGFiaWJpZSBhdCBNYWlsYW5kTmV3cy5jb20+IHN1cHBsaWVkIGEgcHJldHR5IGdvb2Qgd2F5IHRvIGJ1aWxkIFJQTXMKICBvbiBhIExpbnV4IG1hY2hpbmUuIEl0IHN0aWxsIGEpIHJlcXVpcmVzIG1lIHRvIGJlIHJvb3QgdG8gZG8gaXQsIGIpIGxlYXZlcwogIHRoZSBycG0gcGFja2FnZXMgbGF5aW5nIGF0IHNvbWUgb2RkIHBsYWNlIG9uIG15IGRpc2sgYykgZG9lc24ndCB3b3JrIHRvCiAgYnVpbGQgdGhlIHNzbCB2ZXJzaW9uIG9mIGN1cmwgc2luY2UgSSBkaWRuJ3QgaW5zdGFsbCBvcGVuc3NsIGZyb20gYW4gcnBtCiAgcGFja2FnZSBzbyBub3cgdGhlIHJwbSBjcmFwIHRoaW5rcyBJIGRvbid0IGhhdmUgb3BlbnNzbCBhbmQgcmVmdXNlcyB0byBidWlsZAogIGEgcGFja2FnZSB0aGF0IGRlcGVuZHMgb24gc3NsLi4uIERpZCBJIG1lbnRpb24gSSBkb24ndCBnZXQgYWxvbmcgd2l0aCBSUE0/Ci0gT25jZSBhZ2FpbiBJIHJlY2VpdmVkIGEgYnVnIHJlcG9ydCBhYm91dCBhdXRvY29uZiBub3Qgc2V0dGluZyAtTCBwcmlvciB0byAtbAogIG9uIHRoZSBjb21tYW5kIGxpbmUgd2hlbiBjaGVja2luZyBmb3IgbGlicy4gSW4gdGhpcyBjYXNlIGl0IG1hZGUgdGhlIG5hdGl2ZQogIGNjIGNvbXBpbGVyIG9uIFNvbGFyaXMgNyB0byBmYWlsIHRoZSBPcGVuU1NMIGNoZWNrLiBUaGlzIGhhcyBwcmV2aW91c2x5IGJlZW4KICByZXBvcnRlZCB0byBjYXVzZSBwcm9ibGVtcyBvbiBIUC1VWCBhbmQgaXMgYSBrbm93biBmbGF3IGluIGF1dG9jb25mIDIuMTMuIEl0CiAgaXMgYSBwaXR5IHRoZXJlJ3Mgbm8gbmV3ZXIgcmVsZWFzZSBhcm91bmQuLi4KCkRhbmllbCAoNCBBcHJpbCAyMDAwKToKLSBNYXJjbyBHLiBTYWx2YWdubyBzdXBwbGllZCBtZSB3aXRoIHR3byBmaXhlcyB0aGF0CiAgYXBwZWFyYW50bHkgbWFrZXMgdGhlIE9TLzIgcG9ydCB3b3JrIGJldHRlciB3aXRoIG11bHRpcGxlIFVSTHMuCgpEYW5pZWwgKDIgQXByaWwgMjAwMCk6Ci0gQW5vdGhlciBMb2NhdGlvbjogZml4LiBUaGlzIHRpbWUsIHdoZW4gY3VybCBjb25uZWN0ZWQgdG8gYSBwb3J0IGFuZCB0aGVuCiAgZm9sbG93ZWQgYSBsb2NhdGlvbiB3aXRoIGFuIGFic29sdXRlIFVSTCB0byBhbm90aGVyIHBvcnQsIGl0IG1pc2JlaGF2ZWQuCgpEYW5pZWwgKDI3IE1hcmNoIDIwMDApOgotIEguIERhcGhuZSBMdW9uZyBwb2ludGVkIG91dCB0aGF0IGN1cmwgd2FzIHdyb25nbHkKICBtZXNzaW5nIHVwIHRoZSBwcm94eSBzdHJpbmcgd2hlbiBmZXRjaGluZyBhIGRvY3VtZW50IHRocm91Z2ggYSBodHRwIHByb3h5LAogIHdoaWNoIHNjcmV3ZWQgdXAgbXVsdGlwbGUgZmV0Y2hlcyBzdWNoIGFzIGluIGxvY2F0aW9uOiBmb2xsb3dpbmdzLgoKRGFuaWVsICgyMyBNYXJjaCAyMDAwKToKLSBNYXJjbyBHLiBTYWx2YWdubyBjb3JyZWN0ZWQgbXkgYmFkbHkgYXBwbGllZCBwYXRjaCBoZQogIGFjdHVhbGx5IGFscmVhZHkgdG9sZCBtZSBhYm91dCEKCi0gSC4gRGFwaG5lIEx1b25nIGJyb3VnaHQgbWUgYSBmaXggdGhhdCBub3cgbWFrZXMgY3VybAogIGlnbm9yZSBzZWxlY3QoKSBlcnJvcnMgaW4gdGhlIGRvd25sb2FkIGlmIGVycm5vIGlzIEVJTlRSLCB3aGljaCB0dXJucyBvdXQgdG8KICBoYXBwZW4gZXZlcnkgbm93IGFuZCB0aGVuIHdoZW4gdXNpbmcgbGliY3VybCBtdWx0aS10aHJlYWRlZC4uLgoKRGFuaWVsICgyMiBNYXJjaCAyMDAwKToKLSBXaGFtIEJhbmcgc3VwcGxpZWQgYSBjb3VwbGUgb2Ygd2luMzIgZml4ZXMuIEhBVkVfVU5BTUUKICB3YXMgYWNjaWRlbnRhbGx5ICNkZWZpbmVkIGluIGNvbmZpZy13aW4zMi5oLCB3aGljaCBpdCBzaG91bGRuJ3QgaGF2ZSBiZWVuLgogIFRoZSBIQVZFX1VOSVNURF9IIGlzIG5vdCBkZWZpbmVkIHdoZW4gY29tcGlsaW5nIHdpdGggdGhlIE1ha2VmaWxlLnZjNgogIG1ha2VmaWxlIGZvciBNUyBWQysrLgoKRGFuaWVsICgyMSBNYXJjaCAyMDAwKToKLSBJIHJlbW92ZWQgdGhlIEFDX1BST0dfSU5TVEFMTCBtYWNybyBmcm9tIGNvbmZpZ3VyZS5pbiwgc2luY2UgaXQgYXBwZWFycyB0aGF0CiAgb25lIG9mIHRoZSBBTV8qIG1hY3JvcyBzZWFyY2hlcyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIGFscmVhZHkuIEphbm5lCiAgSm9oYW5zc29uIG1hZGUgbWUgYXdhcmUgb2YgdGhpcy4KClZlcnNpb24gNi41LjIKCkRhbmllbCAoMjEgTWFyY2ggMjAwMCk6Ci0gUGF1bCBIYXJyaW5ndG9uIHF1aWNrbHkgcG9pbnRlZCBvdXQgdG8gbWUgdGhhdCA2LjUuMQogIGNyYXNoZXMgaGFyZC4gSSB1cGxvYWQgNi41LjIgbm93IGFzIHF1aWNrbHkgYXMgcG9zc2libGUhIFRoZSBwcm9ibGVtIHdhcwogIHRoZSAtRCBhZGp1c3RtZW50cyBpbiBzcmMvbWFpbi5jLgoKVmVyc2lvbiA2LjUuMQoKRGFuaWVsICgyMCBNYXJjaCAyMDAwKToKLSBBbiBhbm9ueW1vdXMgcG9zdCBvbiBzb3VyY2Vmb3JnZSBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgYSBwb3NzaWJsZSBidWZmZXIKICBvdmVyZmxvdyBpbiB0aGUgY3VybF91bmVzY2FwZSgpIGZ1bmN0aW9uIGZvciBVUkwgY29udmVyc2lvbnMuIFRoZSBtYWluCiAgcHJvYmxlbSB3aXRoIHRoaXMgYnVnIGlzIHRoYXQgdGhlIGZ0cCBkb3dubG9hZCB1c2VzIHRoYXQgZnVuY3Rpb24gYW5kIHRoaXMKICBzaW5nbGUtIGJ5dGUgb3ZlcmZsb3cgY291bGQgbGVhZCB0byB2ZXJ5IG9kZCBidWdzIChhcyBvbmUgcmVwb3J0ZWQgYnkgSmFubmUKICBKb2hhbnNzb24pLgoKRGFuaWVsICgxOSBNYXJjaCAyMDAwKToKLSBNYXJjbyBHLiBTYWx2YWdubyBzdXBwbGllZCBtZSB3aXRoIGEgc2VyaWVzIG9mIHBhdGNoZXMKICB0aGF0IG5vdyBhbGxvd3MgY3VybCB0byBnZXQgY29tcGlsZWQgb24gT1MvMi4gSXQgZXZlbiBpbmNsdWRlcyBhIHNlY3Rpb24gaW4KICB0aGUgSU5TVEFMTCBmaWxlLiBWZXJ5IG5pY2Ugam9iIQoKRGFuaWVsICgxNyBNYXJjaCAyMDAwKToKLSBXaGFtIEJhbmcgc3VwcGxpZWQgYSBwYXRjaCBmb3IgdGhlIGxpYi9NYWtlZmlsZS52YzYKICBmaWxlLiBXZSBzdGlsbCBuZWVkIHNvbWUgZml4ZXMgZm9yIHRoZSBjb25maWctd2luMzIuaCBzaW5jZSBpdCBhcHBlYXJzIHRoYXQKICBWQysrIGFuZCBtaW5ndzMyIGhhdmUgZGlmZmVyZW50IG9waW5pb25zIGFib3V0IChhdCBsZWFzdCkgdW5pc3RkLmgncwogIGV4aXN0ZW5jZS4KCkRhbmllbCAoMTUgTWFyY2ggMjAwMCk6Ci0gSSBtb2RpZmllZCB0aGUgLUQvLS1kdW1wLWhlYWRlciB3b3JraW5ncyBzbyB0aGF0IGl0IGRvZXNuJ3Qgd3JpdGUgYW55dGhpbmcKICB0byB0aGUgZmlsZSB1bnRpbCBpdCBuZWVkcyB0by4gVGhpcyB3YXksIHlvdSBjYW4gYWN0dWFsbHkgdXNlIC1iIGFuZCAtRAogIG9uIHRoZSBzYW1lIGZpbGUgaWYgeW91IHdhbnQgcmVwZWF0ZWQgaW52b2tlcyB0byBzdG9yZSBhbmQgcmVhZCB0aGUgY29va2llcwogIGluIHRoYXQgb25lIHNpbmdsZSBmaWxlLgoKLSBQb2tlZCBhcm91bmQgaW4gbG90cyBvZiB0ZXh0cy4gQWRkZWQgdGhlIEJVR1MgZmlsZSBmb3IgYnVnIHJlcG9ydGluZyBzdHVmZi4KICBBZGRlZCB0aGUgY2xhc3NpYyBIVFRQIFBPU1QgcXVlc3Rpb24gdG8gdGhlIEZBUSwgcmVtb3ZlZCBzb21lICNpZmRlZiBXSU4zMgogIHN0dWZmIGZyb20gdGhlIHNvdXJjZXMgKHRoZXkncmUgY292ZXJlZCBieSB0aGUgY29uZmlnLXdpbjMyLmggbm93KS4KCi0gUGFzY2FsIEdhdWRldHRlIGZpeGVkIGEgbWlzc2luZyBsZGFwLmMgcHJvYmxlbSBpbiB0aGUKICBNYWtlZmlsZS52YzYgZmlsZS4gSGUgYWxzbyBhZGRyZXNzZWQgYSBwcm9ibGVtIGluIHNyYy9jb25maWctd2luMzIuaC4KCkRhbmllbCAoMTQgTWFyY2ggMjAwMCk6Ci0gUGF1bCBIYXJyaW5ndG9uIHBvaW50ZWQgb3V0IHRoYXQgdGhlICdodHRwX2NvZGUnIHZhcmlhYmxlIGluIHRoZSAtdyBvdXRwdXQKICB3YXMgbmV2ZXIgd3JpdHRlbi4gSSBmaXhlZCBpdCBub3cuCgotIEphbm5lIEpvaGFuc3NvbiByZXBvcnRlZCB0aGUgY29tcGxhaW50cyB0aGF0IE9wZW5CU0QgZG9lcwogIHdoZW4gZ2V0ZGF0ZS5jICNpbmNsdWRlcyBtYWxsb2MuaC4gSXQgY2xhaW1zIHN0ZGxpYi5oIHNob3VsZCBiZSBpbmNsdWRlZAogIGluc3RlYWQuIEkgYWRkZWQgI2lmZGVmIEhBVkVfTUFMTE9DX0ggY29kZSBpbiBnZXRkYXRlLnkgYW5kIHR3byBjaGVja3MgaW4KICB0aGUgY29uZmlndXJlLmluIGZvciBtYWxsb2MuaCBhbmQgc3RkbGliLmguCgpWZXJzaW9uIDYuNQoKRGFuaWVsICgxMyBNYXJjaCAyMDAwKToKLSA8Y3VybCBhdCBzcGFtLndvbHZlc2JhbmUubmV0PiBwb2ludGVkIG91dCB0aGF0IHRoZSB3YXkgY3VybCBzZW50IGNvb2tpZXMgaW4gYQogIHNpbmdsZSBsaW5lIHdhc24ndCBlbmpveWVkIGJ5IElJUzQuMCBzZXJ2ZXJzLiBJbiBteSB2aWV3LCB0aGF0IGlzIG5vdCB3aGF0CiAgdGhlIHN0YW5kYXJkcyBzYXksIGJ1dCBJIGFkZGVkIGEgd2hpdGUgc3BhY2UgYmV0d2VlbiB0aGUgbmFtZS92YWx1ZSBwYWlycyB0bwogIHBlcmhhcHMgbWFrZSB0aGVtIHdvcmsgYmV0dGVyLgoKLSBBZGRlZCB0aGUgcGVybCBjaGVjayBiYWNrIGluIHRoZSBjb25maWd1cmUuaW4gYWdhaW4gc2luY2UgdGhlIG1raGVscC5wbAogIHNjcmlwdCBuZWVkcyBpdCEKCi0gTWFkZSBzb21lIGJlYXV0aWZpY2F0aW9ucyBpbiB0aGUgY3VybCBtYW4gcGFnZS4KCkRhbmllbCAoMyBNYXJjaCAyMDAwKToKLSBK9nJuIGhlbHBlZCBtZSB1cGRhdGUgdGhlIGNvbmZpZy13aW4zMi5oIGZpbGVzIHdpdGggSEFWRV9TRVRWQlVGIGFuZAogIEhBVkVfU1RSRFVQLgoKRGFuaWVsICgzIE1hcmNoIDIwMDApOgotIFVwbG9hZGVkIHRoZSA2LjVwcmUyIHBhY2thZ2UuCgpEYW5pZWwgKDIgTWFyY2ggMjAwMCk6Ci0gUmVtb3ZlZCB0aGUgcGVybC1wcm9ncmFtcyBmcm9tIHRoZSBkaXN0cmlidXRpb24sIHRoZXkgbmV2ZXIgbWFkZSBtYW55IHBlb3BsZQogIGhhcHB5IGFuZCBJJ2xsIHN0aWxsIGtlZXAgdGhlbSBhdmFpbGFibGUgb24gdGhlIHdlYi4KCi0gQWRkZWQgdGhlIC13IGFuZCAtTiBzdHVmZiB0byB0aGUgbWFuIHBhZ2UuIERvY3VtZW50ZWQgdGhlIG5ldyBwcm9ncmVzcyBtZXRlcgogIGRpc3BsYXkgaW4gUkVBRE1FLmN1cmwuCgotIEr2cm4gSGFydHJvdGgsIENocmlzIDxjYmF5bGlzcyBhdCBjc2MuY29tZT4gYW5kIFVsZgogIE32bGxlciBmcm9tIHRoZSBvcGVuc3NsIGRldmVsb3BtZW50IHRlYW0gaGVscGVkIGJyaW5naW5nIG1lIHRoZSBkZXRhaWxzIGZvcgogIGZpeGluZyBhbiBPcGVuU1NMIHVzYWdlIGZsYXcuIEl0IGJlY2FtZSBhcHBhcmVudCB3aGVuIHRoZXkgcmVsZWFzZWQgb3BlbnNzbAogIDAuOS41IHNpbmNlIHRoYXQgYmFyZmVkIG9uIGN1cmwncyBiYWQgYmVoYXZpb3IgKG5vdCBzZWVkaW5nIGEgcmFuZG9tIG51bWJlcgogIHRoaW5nKS4KCi0gWWV0IGFub3RoZXIgb3B0aW9uOiAtTi8tLW5vLWJ1ZmZlciBkaXNhYmxlcyBidWZmZXJpbmcgaW4gdGhlIG91dHB1dCBzdHJlYW0uCiAgUHJvYmFibHkgbW9zdCB1c2VmdWwgZm9yIHZlcnkgc2xvdyB0cmFuc2ZlcnMgd2hlbiB5b3UgcmVhbGx5IHdhbnQgdG8gZ2V0CiAgZXZlcnkgYnl0ZSBjdXJsIHJlY2VpdmVzIHdpdGhpbiBzb21lIHByZWZlcnJlZCB0aW1lLiBBbmRyZXcgPHRtciBhdCBnY2kubmV0PgogIHN1Z2dlc3RlZCB0aGlzLgoKLSBEYW1pZW4gQWRhbnQgbWFpbGVkIG1lIGhpcyBmaXhlcyBmb3IgbWFraW5nIGN1cmwgY29tcGlsZSBvbiBVbHRyaXguCgpEYW5pZWwgKDI0IEZlYnJ1YXJ5IDIwMDApOgotIEFwcGxpZWQgSvZybiBIYXJ0cm90aCdzIGZpeGVzIGZvciBjb25maWctd2luMzIuaCBhbmQgbGliL01ha2VmaWxlLnczMi4KCiAgSSBzaG91bGQgYWxzbyBtYWtlIGEgbm90ZSBoZXJlLCBpZiBub3RoaW5nIGVsc2UgdG8gbXlzZWxmLCB0aGF0IHdoZW4gdXNpbmcKICB0aGUgJS1zeW50YXggZm9yIHZhcmlhYmxlcyBpbiBET1MgY29tbWFuZCBwcm9tcHRzLCB5b3UgbXVzdCB1c2UgdHdvICUtCiAgbGV0dGVycyBmb3IgZWFjaCBvbmUgc2luY2UgdGhhdCBpcyBhbiBlc2NhcGUgbGV0dGVyIHRoZXJlISBNYXliZSBJIHNob3VsZAogIHVzZSBhbm90aGVyIGxldHRlciBpbnN0ZWFkIQoKLSBBZGRlZCBtb3JlIHZhcmlhYmxlcyB0byAtdzoKCiAgJ2h0dHBfY29kZScKICAndGltZV9uYW1lbG9va3VwJwogICd0aW1lX2Nvbm5lY3QnCiAgJ3RpbWVfcHJldHJhbnNmZXInCiAgJ3VybF9lZmZlY3RpdmUnCgotIE1hZGUgLXdAZmlsZW5hbWUgcmVhZCB0aGUgc3ludGF4IGZyb20gYSBmaWxlIGFuZCAtd0AtIHJlYWRzIHRoZSBzeW50YXggZnJvbQogIHN0ZGluIGluIHRoZSBnb29kIG9sZCAic3RhbmRhcmQiIGN1cmwgd2F5LgoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDAwKToKLSBSZWxlYXNlZCBhIDYuNXByZTEgdmVyc2lvbiB0byBnZXQgc29tZSB0ZXN0IGFuZCB1c2VyIGZlZWRiYWNrLgoKRGFuaWVsICgyMSBGZWJydWFyeSAyMDAwKToKCi0gSSBhZGRlZCB0aGUgLXcvLS13cml0ZS1vdXQgZmxhZyBhbmQgc29tZSB2YXJpYWJsZXMgdG8gZ28gd2l0aCBpdC4gLXcgaXMgYQogIHNpbmdsZSBzdHJpbmcsIHdoYXRldmVyIHlvdSBlbnRlciB0aGVyZSB3aWxsIGJlIHdyaXR0ZW4gb3V0IHdoZW4gY3VybCBoYXMKICBjb21wbGV0ZWQgYSBzdWNjZXNzZnVsIHJlcXVlc3QuIFRoZXJlIGFyZSBzb21lIHZhcmlhYmxlIHN1YnN0aXR1dGlvbnMgYW5kCiAgdGhleSBhcmUgc3BlY2lmaWVkIGFzICcle3ZhcmlhYmxlfScgKHdpdGhvdXQgdGhlIHF1b3RlcykuIFZhcmlhYmxlcyB0aGF0CiAgZXhpc3QgYXMgb2YgdGhpcyBtb21lbnQgYXJlOgoKICAgICAgICB0b3RhbF90aW1lICAgICAtIHRvdGFsIHRyYW5zZmVyIHRpbWUgaW4gc2Vjb25kcyAod2l0aCAyIGRlY2ltYWxzKQogICAgICAgIHNpemVfZG93bmxvYWQgIC0gdG90YWwgZG93bmxvYWRlZCBhbW91bnQgb2YgYnl0ZXMKICAgICAgICBzaXplX3VwbG9hZCAgICAtIHRvdGFsIHVwbG9hZGVkIGFtb3VudCBvZiBieXRlcwogICAgICAgIHNwZWVkX2Rvd25sb2FkIC0gdGhlIGF2ZXJhZ2Ugc3BlZWQgb2YgdGhlIGVudGlyZSBkb3dubG9hZAogICAgICAgIHNwZWVkX3VwbG9hZCAgIC0gdGhlIGF2ZXJhZ2Ugc3BlZWQgb2YgdGhlIGVudGlyZSB1cGxvYWQKCiAgSSB3aWxsIG9mIGNvdXJzZSBhZGQgbW9yZSB2YXJpYWJsZXMsIGJ1dCBJIG5lZWQgaW5wdXQgb24gdGhlc2UgYW5kIG90aGVycy4KCi0gSXQgc3RydWNrIG1lIHRoYXQgdGhlIC0jIHByb2dyZXNzIGJhciB3aWxsIGJlIGhhcmQgdG8ganVzdCBhcHBseSBvbiB0aGUgbmV3CiAgcHJvZ3Jlc3MgYmFyIGNvbmNlcHQuIEkgbmVlZCBzb21lIGZlZWRiYWNrIG9uIHRoaXMgYmVmb3JlIHRoYXQnbGwgZ2V0IHJlLQogIGludHJvZHVjZWQhIDotLwoKRGFuaWVsICgxNiBGZWJydWFyeSAyMDAwKToKLSBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgbWUgc29tZSBmaXhlcyBmb3IgdGhlIHByb2dyZXNzIG1ldGVyIGFuZCBJIGNvbnRpbnVlZAogIHdvcmtpbmcgb24gaXQuIEl0IHNlZW1zIHRvIHdvcmsgZm9yIGh0dHAgZG93bmxvYWQsIGh0dHAgcG9zdCwgZnRwIGRvd25sb2FkCiAgYW5kIGZ0cCB1cGxvYWQuIEl0IHNob3VsZCBiZSBhIHByZXR0eSBnb29kIHRlc3QgaXQgd29ya3MgZ2VuZXJhbGx5IGdvb2QuCgotIFN0aWxsIG5lZWQgdG8gYWRkIHRoZSAtIyBwcm9ncmVzcyBiYXIgaW50byB0aGUgbmV3IHN0eWxlIHByb2dyZXNzIGludGVyZmFjZS4KCi0gR29ubmEgaGF2ZSBhIGdvIGF0IG15IG5ldyBvdXRwdXQgb3B0aW9uIHBhcmFtZXRlciBuZXh0LgoKRGFuaWVsICgxNSBGZWJydWFyeSAyMDAwKToKLSBUaGUgcHJvZ3Jlc3MgbWV0ZXIgc3R1ZmYgaXMgc2xvd2x5IHRha2luZyBwbGFjZS4gVGhlcmUncyBtb3JlIGxlZnQgYmVmb3JlIGl0CiAgaXMgd29ya2luZyBvayBhbmQgZXZlcnl0aGluZyBpcyB0ZXN0ZWQsIGJ1dCB3ZSdyZSByZWFjaGluZyB0aGVyZS4gU2xvd2x5IQoKRGFuaWVsICgxMSBGZWJydWFyeSAyMDAwKToKLSBQYXVsIE1hcnF1aXMgZml4ZWQgdGhlIGNvbmZpZyBmaWxlIHBhcnNpbmcgb2YgY3VybCB0bwogIGRlYWwgd2l0aCBhbnktbGVuZ3RoIGxpbmVzLCByZW1vdmluZyB0aGUgcHJldmlvdXMgbGltaXQgb2YgNEsuCgotIEVldHUgT2phbmVuJ3Mgc3VnZ2VzdGlvbiBvZiBzdXBwb3J0aW5nIHRoZSBALXN0eWxlIGZvciAtYgogIGlzIGltcGxlbWVudGVkLiBOb3cgLWJAPGZpbGVuYW1lPiB3b3JrcyBhcyB3ZWxsIGFzIHRoZSBvbGQgc3R5bGUuIC1iQC0gYWxzbwogIHNpbWlsYXJseSByZWFkcyB0aGUgY29va2llcyBmcm9tIHN0ZGluLgoKLSBSZW1pbmRlcjogLUQgc2hvdWxkIG5vdCB3cml0ZSB0byB0aGUgZmlsZSB1bnRpbCBpdCBuZWVkcyB0bywgaW4gdGhlIHNhbWUgd2F5CiAgLW8gZG9lcy4gVGhhdCB3b3VsZCBlbmFibGUgY3VybCB0byB1c2UgLWIgYW5kIC1EIG9uIHRoZSBzYW1lIGZpbGUuLi4KCi0gRWxsaXMgUHJpdGNoYXJkIG1hZGUgZ2V0ZGF0ZS55IHdvcmsgZm9yIE1hY09TIFguCgotIFBhdWwgSGFycmluZ3RvbiBoZWxwZWQgbWUgb3V0IGZpbmRpbmcgdGhlIGNyYXNoIGluIHRoZQogIGNvb2tpZSBwYXJzZXIuIEhlIGFsc28gcG9pbnRlZCBvdXQgY3VybCdzIGhhYml0IG9mIHNlbmRpbmcgZW1wdHkgY29va2llcyB0bwogIHRoZSBzZXJ2ZXIuCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwMCk6CiAtIFJvbiBaYXBwIGNvcnJlY3RlZCBhIHByb2JsZW0gaW4gc3JjL3VybGdsb2IuYyB0aGF0CiAgIHByZXZlbnRlZCBjdXJsIGZyb20gZ2V0dGluZyBjb21waWxlZCBvbiBzdW5vcyA0LiBUaGUgcHJvYmxlbSBoYWQgdG8gZG8KICAgd2l0aCB0aGUgZGlmZmVyZW5jZSBpbiBzcHJpbnRmKCkgcmV0dXJuIGNvZGUgdHlwZXMuCgogLSBUcmFuc2ZlcigpIHNob3VsZCBub3cgYmUgYWJsZSB0byBkb3dubG9hZCBhbmQgdXBsb2FkIHNpbXVsdGFuZW91c2x5LiBMZXQncwogICBkbyBzb21lIHByb2dyZXNzIG1ldGVyIGZpeGVzIGxhdGVyIHRoaXMgd2Vlay4KCkRhbmllbCAoMzEgSmFudWFyeSAyMDAwKToKIC0gUGF1bCBIYXJyaW5ndG9uIGZvdW5kIGFub3RoZXIgY29yZSBkdW1wIGluIHRoZSBjb29raWUKICAgcGFyc2VyLiBDdXJsIGRvZXNuJ3QgcHJvcGVybHkgcmVjb2duaXplIHRoZSAndmVyc2lvbicga2V5d29yZCBhbmQgSSB0aGluawogICB0aGF0IGlzIHdoYXQgY2F1c2VkIHRoaXMuIEkgbmVlZCB0byByZWZyZXNoIHNvbWUgc3BlY3Mgb24gY29va2llcyBhbmQgc2VlCiAgIHdoYXQgZWxzZSBjdXJsIGxhY2tzIHRvIGltcHJvdmUgdGhpcyBhIGJpdCBtb3JlIG9uY2UgYW5kIGZvciBhbGwuCgogICBSRkMgMjEwOSBjbGVhcmx5IHNwZWNpZmllcyBob3cgY29va2llcyBzaG91bGQgYmUgZGVhbHQgd2l0aCB3aGVuIHRoZXkgYXJlCiAgIGNvbXBsaWFudCB3aXRoIHRoYXQgc3BlYy4gSSBkb24ndCB0aGluayBtYW55IHNlcnZlcnMgYXJlIHRob3VnaC4uLgoKIC0gTWFyayBXLiBFaWNoaW4gZm91bmQgdGhhdCB3aGlsZSBjdXJsIGlzIHVwbG9hZGluZyBhIGZvcm0KICAgdG8gYSB3ZWIgc2l0ZSwgaXQgZG9lc24ndCByZWFkIGluY29taW5nIGRhdGEgd2h5IGl0J2xsIGhhbmcgYWZ0ZXIgYSB3aGlsZQogICBzaW5jZSB0aGUgc29ja2V0ICJwaXBlIiBiZWNvbWVzIGZ1bGwuCgogICBJdCB0b29rIG1lIHR3byBob3VycyB0byByZXdyaXRlIERvd25sb2FkKCkgYW5kIFVwbG9hZCgpIGludG8gdGhlIG5ldwogICBzaW5nbGUgZnVuY3Rpb24gVHJhbnNmZXIoKS4gSXQgZXZlbiBzZWVtcyB0byB3b3JrISBNb3JlIHRlc3RpbmcgaXMgcmVxdWlyZWQKICAgb2YgY291cnNlLi4uIEkgc2hvdWxkIGdldCB0aGUgaGVhZGVyLXNlbmRpbmcgdG9nZXRoZXIgaW4gYSBraW5kIG9mIHF1ZXVlCiAgIGFuZCBsZXQgdGhlbSBnZXQgInVwbG9hZGVkIiBpbiBUcmFuc2ZlcigpIGFzIHdlbGwuCgogLSBaaGliaWFvIFd1IHBvaW50ZWQgb3V0IGEgY3VybCBidWcgaW4gdGhlIGxvY2F0aW9uOiBhcmVhLAogICBhbHRob3VnaCBJIGRpZCBub3QgZ2V0IGEgcmVwcm9kdWNpYmxlIHdheSB0byBkbyB0aGlzIHdoeSBJIGhhdmUgdG8gd2FpdAogICB3aXRoIGZpeGluZyBhbnl0aGluZy4KCiAtIEJvYiBTY2hhZGVyIHN1Z2dlc3RlZCBJIHNob3VsZCBpbXBsZW1lbnQgcmVzdW1lCiAgIHN1cHBvcnQgZm9yIHRoZSBIVFRQIFBVVCBvcGVyYXRpb24sIGFuZCBhcyBJIHRoaW5rIGl0IGlzIGEgdmFsaWQgc3VnZ2VzdGlvbgogICBJJ2xsIHdvcmsgb24gaXQuCgpEYW5pZWwgKDI1IEphbnVhcnkgMjAwMCk6CiAtIE0gVHJhdmlzIE9iZW5oYXVzIHBvaW50ZWQgb3V0IGEgbWFudWFsIG1peHVwIHdpdGggLXkgYW5kIC1ZIHRoYXQgd2FzCiAgIGNvcnJlY3RlZC4KCiAtIEplbnMgU2NobGV1c2VuZXIgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHRvIGNvbXBpbGUKICAgY3VybCBvbiBBSVggNC4xLjQgYW5kIGdhdmUgbWUgYSBzb2x1dGlvbi4gVGhpcyBwcm9ibGVtIHdhcyBhbHJlYWR5IGZpeGVkCiAgIGJ5IEr2cm4ncyByZWNlbnQgI2luY2x1ZGUgbW9kaWZpY2F0aW9ucyEKCkRhbmllbCAoMTkgSmFudWFyeSAyMDAwKToKIC0gT3NrYXIgTGlsamVibGFkIHBvaW50ZWQgb3V0IGFuZCBjb3JyZWN0ZWQgYSBwcm9ibGVtCiAgIGluIHRoZSBMb2NhdGlvbjogZm9sbG93aW5nIHN5c3RlbSB0aGF0IG1hZGUgY3VybCBmb2xsb3dpbmcgYSBsb2NhdGlvbjogdG8gYQogICBkaWZmZXJlbnQgcHJvdG9jb2wgdG8gZmFpbC4KCiAgIEF0IEphbnVhcnkgMzFzdCBJIHJlLWNvbnNpZGVyZWQgdGhpcyBmaXggYW5kIHRoZSBzdXJyb3VuZGluZyBzb3VyY2UgY29kZS4gSQogICBjb3VsZCBub3QgcmVhbGx5IHNlZSB0aGF0IHRoZSBwYXRjaCBkaWQgYW55IGRpZmZlcmVuY2UsIHdoeSBJIHJlbW92ZWQgaXQKICAgYWdhaW4gZm9yIGZ1cnRoZXIgcmVzZWFyY2ggYW5kIGRlYnVnZ2luZy4gKEl0IGRpc2FibGVkIGxvY2F0aW9uOiBmb2xsb3dpbmcKICAgb24gc2VydmVyIG5vdCBydW5uaW5nIG9uIGRlZmF1bHQgcG9ydHMuKQoKIC0gSvZybiBIYXJ0cm90aCBicm91Z2h0IGEgZml4IHRoYXQgb25jZSBhZ2FpbgogICBtYWRlIGl0IHBvc3NpYmxlIHRvIHNlbGVjdCBwcm9ncmVzcyBiYXIuCgogLSBK9nJuIGFsc28gZml4ZWQgYSBmZXcgaW5jbHVkZSBwcm9ibGVtcy4KClZlcnNpb24gNi40CgpEYW5pZWwgKDE3IEphbnVhcnkgMjAwMCk6CiAtIEJhc2VkIG9uIHN1Z2dlc3Rpb25zIGZyb20gQmr2cm4gU3RlbmJlcmcsIEkgbWFkZSB0aGUKICAgcHJvZ3Jlc3MgZGVhbCBiZXR0ZXIgd2l0aCBsYXJnZXIgZmlsZXMgYW5kIGFkZGVkIGEgIlRpbWUiIGZpZWxkIHdoaWNoIHNob3dzCiAgIHRoZSB0aW1lIHNwZW50IG9uIHRoZSBkb3dubG9hZCBzbyBmYXIuCiAtIEknbSBub3cgdXNpbmcgdGhlIENWUyByZXBvc2l0b3J5IG9uIHNvdXJjZWZvcmdlLm5ldCwgd2hpY2ggYWxzbyBhbGxvd3Mgd2ViCiAgIGJyb3dzaW5nLgoKRGFuaWVsICgxMCBKYW51YXJ5IDIwMDApOgogLSBSZW51bWJlcmVkIHNvbWUgZW51bXMgaW4gY3VybC9jdXJsLmggc2luY2UgdGFnIG51bWJlciAzNSB3YXMgdXNlZCB0d2ljZSEKIC0gQWRkZWQgInBvc3RxdW90ZSIgc3VwcG9ydCB0byB0aGUgZnRwIHNlY3Rpb24gdGhhdCBlbmFibGVzIHBvc3QtZnRwLXRyYW5zZmVyCiAgIHF1b3RlIGNvbW1hbmRzLgogLSBOb3cgbWFkZSB0aGUgLVEvLS1xdW90ZSBwYXJhbWV0ZXIgcmVjb2duaXplICctJyBhcyBhIHByZWZpeCwgd2hpY2ggbWVhbnMKICAgdGhhdCBjb21tYW5kIHdpbGwgYmUgaXNzdWVkIEFGVEVSIGEgc3VjY2Vzc2Z1bCBmdHAgdHJhbnNmZXIuIFRoaXMgY2FuIG9mCiAgIGNvdXJzZSBiZSB1c2VkIHRvIGRlbGV0ZSBvciByZW5hbWUgYSBmaWxlIGFmdGVyIGl0IGhhcyBiZWVuIHVwbG9hZGVkIG9yCiAgIGRvd25sb2FkZWQuIFVzZSB5b3VyIGltYWdpbmF0aW9uISA7LSkKIC0gU2luY2UgSSBkbyB0aGUgbWFpbiBkZXZlbG9wbWVudCBvbiBzb2xhcmlzIDIuNiBub3csIEkgaGFkIHRvIGRvd25sb2FkIGFuZAogICBpbnN0YWxsIEdOVSBncm9mZiB0byBnZW5lcmF0ZSB0aGUgaHVnZWhlbHAuYyBmaWxlLiBUaGUgc29sYXJpcyBucm9mZiBjb3JlcwogICBvbiB0aGUgbWFuIHBhZ2UhIFNvLCBpbiBvcmRlciB0byBtYWtlIHRoZSBzb2xhcmlzIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCBhCiAgIGJldHRlciByZXN1bHQgSSBtYWRlIGducm9mZiBnZXQgY2hlY2tlZCBwcmlvciB0byB0aGUgcmVndWxhciBucm9mZi4KIC0gQWRkZWQgYWxsIHRoZSBjdXJsIGV4aXQgY29kZXMgdG8gdGhlIG1hbiBwYWdlLgogLSBKaW0gR2FsbGFnaGVyIHByb3Blcmx5IHRyYWNrZWQgZG93biBhIGJ1ZyBpbiBhdXRvY29uZgogICAyLjEzLiBUaGUgQUNfQ0hFQ0tfTElCKCkgbWFjcm8gd3JvbmdmdWxseSB1c2VzIHRoZSAtbCBmbGFnIGJlZm9yZSB0aGUgLUwKICAgZmxhZyB0byAnbGQnIHdoaWNoIGNhdXNlcyB0aGUgSFAtVVggMTAuMjAgZmxhdm91ciB0byBmYWlsIG9uIGFsbCBsaWJjaGVja3MKICAgYW5kIHRoZXJlZm9yZSB5b3UgY2FuJ3QgbWFrZSB0aGUgY29uZmlndXJlIHNjcmlwdCBmaW5kIHRoZSBvcGVuc3NsIGxpYnMhCgpEYW5pZWwgKDI4IERlY2VtYmVyIDE5OTkpOgogLSBUaW0gVmVyaG9ldmVuIGNvcnJlY3RseSBpZGVudGlmaWVkIHRoYXQgY3VybAogICBkb2Vzbid0IHN1cHBvcnQgVVJMIGZvcm1hdHRlZCBmaWxlIG5hbWVzIHdoZW4gZ2V0dGluZyBmdHAuIE5vdywgdGhlcmUncyBhCiAgIHByb2JsZW0gd2l0aCBnZXR0aW5nIHZlcnkgd2VpcmQgZmlsZSBuYW1lcyBvZmYgRlRQIHNlcnZlcnMuIFJGQyA5NTkgZGVmaW5lcwogICB0aGF0IHRoZSBmaWxlIG5hbWUgc3ludGF4IHRvIHVzZSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgaW4gdGhlIG5hdGl2ZSBPUyBvZgogICB0aGUgc2VydmVyLiBTaW5jZSB3ZSBkb24ndCBrbm93IHRoZSBwZWVyIHNlcnZlciBzeXN0ZW0gd2UgY3VycmVudGx5IGp1c3QKICAgdHJhbnNsYXRlIHRoZSBVUkwgc3ludGF4IGludG8gcGxhaW4gbGV0dGVycy4gSXQgaXMgc3RpbGwgYmV0dGVyIGFuZCB3aXRoCiAgIHRoZSBzb2xhcmlzIDIuNi1zdXBwbGllZCBmdHAgc2VydmVyIGl0IHdvcmtzIHdpdGggc3BhY2VzIGluIHRoZSBmaWxlIG5hbWVzLgoKRGFuaWVsICgyNyBEZWNlbWJlciAxOTk5KToKIC0gV2hlbiBjdXJsIHBhcnNlZCBjb29raWVzIHN0cmFpZ2h0IG9mZiBhIHJlbW90ZSBzaXRlLCBpdCBjb3JydXB0ZWQgdGhlIGlucHV0CiAgIGRhdGEsIHdoaWNoLCBpZiB0aGUgZG93bmxvYWRlZCBoZWFkZXJzIHdlcmUgc3RvcmVkIG1hZGUgdmVyeSBvZGQgY2hhcmFjdGVycwogICBpbiB0aGUgc2F2ZWQgZGF0YS4gQ29ycmVjdGx5IGlkZW50aWZpZWQgYW5kIHJlcG9ydGVkIGJ5IFBhdWwgSGFycmluZ3Rvbi4KCkRhbmllbCAoMTMgRGVjZW1iZXIgMTk5OSk6CiAtIEdlbmVyYWwgY2xlYW51cHMgaW4gdGhlIGxpYnJhcnkgaW50ZXJmYWNlLiBUaGVyZSBoYWQgYmVlbiBzb21lIGJhZCBrbHVkZ2VzCiAgIGFkZGVkIGR1cmluZyB0aW1lcyBvZiBzdHJlc3MgYW5kIEkgZGlkIG15IGJlc3QgdG8gY2xlYW4gdGhlbSBvZmYuIEl0IHdhcwogICBib3RoIHJlZ2FyZGluZyB0aGUgbGliIEFQSSBhcyB3ZWxsIGFzIGluY2x1ZGUgZmlsZSBjb25mdXNpb25zLgoKRGFuaWVsICgzIERlY2VtYmVyIDE5OTkpOgogLSBBIHNtYWxsIC0tc3RkZXJyIGJ1ZyB3YXMgcmVwb3J0ZWQgYnkgRWV0dSBPamFuZW4uLi4KCiAtIHdobyBhbHNvIGJyb3VnaHQgdGhlIHN1Z2dlc3Rpb24gb2YgZXh0ZW5kaW5nIHRoZSAtWCBmbGFnIHRvIGZ0cCBsaXN0IGFzCiAgIHdlbGwuIFNvLCBub3cgaXQgaXMgYW5kIHRoZSBsb25nIG9wdGlvbiBpcyBub3cgLS1yZXF1ZXN0IGluc3RlYWQuIEl0IGlzCiAgIG9ubHkgZm9yIGZ0cCBsaXN0IGZvciBub3cgKGFuZCB0aGUgZm9ybWVyIGh0dHAgc3R1ZmYgdG9vIG9mIGNvdXJzZSkuCgpMYXJzIEouIEFhcyAoMjQgTm92ZW1iZXIgMTk5OSk6CiAtIFBhdGNoZWQgY3VybCB0byBjb21waWxlIGFuZCBidWlsZCB1bmRlciBCZU9TLiBEb2Vzbid0IHdvcmsgeWV0IHRob3VnaCEKCiAtIENvcnJlY3RlZCB0aGUgTWFrZWZpbGUuYW0gZmlsZXMgdG8gYWxsb3cgcHV0dGluZyBvYmplY3QgZmlsZXMgaW4KICAgZGlmZmVyZW50IGRpcmVjdG9yaWVzIHRoYW4gdGhlIHNvdXJjZXMuCgpWZXJzaW9uIDYuMy4xCgpEYW5pZWwgKDIzIE5vdmVtYmVyIDE5OTkpOgogLSBJJ3ZlIGhhZCB0aGlzIG1ham9yIGRpc2sgY3Jhc2guIE15IGdvb2Qgb2xkIHRydXN0LXdvcnRoeSBzb3VyY2UgZGlzayBkaWVkCiAgIGFsb25nIHdpdGggdGhlIG1hY2hpbmUgdGhhdCBob3N0ZWQgaXQuIFRoYW5rIGdvb2RuZXNzIG1vc3Qgb2YgYWxsIHRoZQogICB0aGluZ3MgSSd2ZSBkb25lIGFyZSBlaXRoZXIgYmFja2VkIHVwIGVsc2V3aGVyZSBvciBzdG9yZWQgaW4gdGhpcyBDVlMKICAgc2VydmVyIQoKIC0gTWljaGFlbCBTLiBTdGV1ZXIgcG9pbnRlZCBvdXQgYSBidWcgaW4gdGhlIC1GIGhhbmRsaW5nCiAgIHRoYXQgbWFkZSBjdXJsIGhhbmcgaWYgeW91IHBvc3RlZCBhbiBlbXB0eSB2YXJpYWJsZSBzdWNoIGFzICctRiBuYW1lPScuIEl0CiAgIHdhcyBvbmUgb2YgdGhvc2Ugb2xkIGJ1Z3MgdGhhdCBuZXZlciBoYXZlIHdvcmtlZCBwcm9wZXJseS4uLgoKIC0gSmFzb24gQmFpZXR0byBwb2ludGVkIG91dCBhIGdlbmVyYWwgZmxhdyBpbiB0aGUgSFRUUAogICBkb3dubG9hZC4gQ3VybCBkaWRuJ3QgY29tcGxhaW4gaWYgaXQgd2FzIHByZW1hdHVyZWx5IGFib3J0ZWQgYmVmb3JlIHRoZQogICBlbnRpcmUgZG93bmxvYWQgd2FzIGNvbXBsZXRlZC4gSXQgZG9lcyBub3cuCgpEYW5pZWwgKDE5IE5vdmVtYmVyIDE5OTkpOgogLSBDaHJpcyBNYWx0YnkgdmVyeSBhY2N1cmF0ZWx5IGNyaXRpY2l6ZWQgdGhlIGxhY2sgb2YKICAgcmV0dXJuIGNvZGUgY2hlY2tzIG9uIHRoZSBmd3JpdGUoKSBjYWxscy4gSSBkaWQgYSB0aG9yb3VnaCBjaGVjayBmb3IgYWxsCiAgIG9jY3VycmVuY2VzIGFuZCBjb3JyZWN0ZWQgdGhpcy4KCkRhbmllbCAoMTcgTm92ZW1iZXIgMTk5OSk6CiAtIFBhdWwgSGFycmluZ3RvbiBwb2ludGVkIG91dCB0aGF0IHRoZSAtbS8tLW1heC10aW1lIG9wdGlvbgogICBkb2Vzbid0IHdvcmsgZm9yIHRoZSBzbG93IHN5c3RlbSBjYWxscyBsaWtlIGdldGhvc3RieW5hbWUoKS4uLiBJIGRvbid0IGhhdmUKICAgYW55IGdvb2QgZml4IHlldCwganVzdCBhIHNsaWdodGx5IGxlc3MgYmFkIG9uZSB0aGF0IG1ha2VzIGN1cmwgZXhpdCBoYXJkCiAgIHdoZW4gdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC4KCiAtIEJqb3JuIFJlZXNlIGhlbHBlZCBtZSBwb2ludCBvdXQgYSBwb3NzaWJsZSBwcm9ibGVtIHRoYXQgbWlnaHQgYmUgdGhlIHJlYXNvbgogICB3aHkgVGhvbWFzIEh1cnN0IGV4cGVyaWVuY2UgcHJvYmxlbXMgaW4gaGlzIEFtaWdhIHZlcnNpb24uCgogRGFuaWVsICgxMiBOb3ZlbWJlciAxOTk5KToKIC0gSSBmb3VuZCBhIGNyYXNoIGluIHRoZSBuZXcgY29va2llIGZpbGUgcGFyc2VyLiBJdCBjcmFzaGVkIHdoZW4geW91IGdhdmUKICAgYSBwbGFpbiBodHRwIGhlYWRlciBmaWxlIGFzIGlucHV0Li4uCgpWZXJzaW9uIDYuMwoKIERhbmllbCAoMTAgTm92ZW1iZXIgMTk5OSk6CiAtIEkga2luZCBvZiBmb3VuZCBvdXQgdGhhdCB0aGUgSFRUUCB0aW1lLWNvbmRpdGlvbmFsIEdFVHMgKC16KSBhcmVuJ3QgYWx3YXlzCiAgIHJlc3BlY3RlZCBieSB0aGUgd2ViIHNlcnZlciBhbmQgdGhlIGRvY3VtZW50IGlzIHRoZXJlZm9yZSBzZW50IGluIHdob2xlCiAgIGFnYWluLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IG1hdGNoIHRoZSByZXF1ZXN0ZWQgY29uZGl0aW9uLiBBZnRlciByZWFkaW5nCiAgIHNlY3Rpb24gMTMuMy40IG9mIFJGQyAyNjE2LCBJIHRoaW5rIEknbSBkb2luZyB0aGUgcmlnaHQgdGhpbmcgbm93IHdoZW4gSSBkbwogICBteSBvd24gY2hlY2sgYXMgd2VsbC4gSWYgY3VybCB0aGlua3MgdGhlIGNvbmRpdGlvbiBpc24ndCBtZXQsIHRoZSB0cmFuc2ZlcgogICBpcyBhYm9ydGVkIHByZW1hdHVyZWx5IChhZnRlciBhbGwgdGhlIGhlYWRlcnMgaGF2ZSBiZWVuIHJlY2VpdmVkKS4KCiAtIEFmdGVyIGNvbW1lbnRzIGZyb20gUm9iZXJ0IExpbmRlbiBJIGFsc28gcmV3cm90ZSBzb21lIHBhcnRzIG9mIHRoZSBtYW4gcGFnZQogICB0byBiZXR0ZXIgZGVzY3JpYmUgaG93IHRoZSAtRiB3b3Jrcy4KCiAtIE1pY2hhZWwgQW50aSBwdXQgdXAgYSBuZXcgY3VybCBkb3dubG9hZCBtaXJyb3IgaW4KICAgQ2hpbmE6ICBodHRwOi8vd3d3LnBzaG93aW5nLmNvbS9jdXJsLwoKIC0gSSBhZGRlZCB0aGUgbGlzdCBvZiBkb3dubG9hZCBtaXJyb3JzIHRvIHRoZSBSRUFETUUgZmlsZQoKIC0gSSBkaWQgYWRkIG1vcmUgZXhwbGFuYXRpb25zIHRvIHRoZSBtYW4gcGFnZQoKIERhbmllbCAoOCBOb3ZlbWJlciAxOTk5KToKIC0gSSBtYWRlIHRoZSAtYi8tLWNvb2tpZSBvcHRpb24gY2FwYWJsZSBvZiByZWFkaW5nIG5ldHNjYXBlIGZvcm1hdHRlZCBjb29raWUKICAgZmlsZXMgYXMgd2VsbCBhcyBub3JtYWwgaHR0cC1oZWFkZXIgZmlsZXMuIEl0IHNob3VsZCBiZSBhYmxlIHRvCiAgIHRyYW5zcGFyZW50bHkgZmlndXJlIG91dCB3aGF0IGtpbmQgb2YgZmlsZSBpdCBnb3QgYXMgaW5wdXQuCgogRGFuaWVsICgyOSBPY3RvYmVyIDE5OTkpOgogLSBBbm90aGVyIG9uZSBvZiBTZWJhc3RpYWFuIHZhbiBFcmsncyBpZGVhcyAodGhhdCBoYXMgYmVlbiByZXF1ZXN0ZWQgYmVmb3JlCiAgIGJ1dCBJIHNlZW0gdG8gaGF2ZSBmb3Jnb3R0ZW4gd2hvIGl0IHdhcyksIGlzIHRvIGFkZCBzdXBwb3J0IGZvciByYW5nZXMgaW4KICAgRlRQIGRvd25sb2Fkcy4gQXMgdXN1YWwsIG9uZSByZXF1ZXN0IGlzIGp1c3QgYSByZXF1ZXN0LCB3aGVuIHRoZXkncmUgdHdvCiAgIGl0IGlzIGEgZGVtYW5kLiBJJ3ZlIGFkZGVkIHNpbXBsZSBzdXBwb3J0IGZvciBYLVkgc3R5bGUgZmV0Y2hlcy4gWCBoYXMgdG8KICAgYmUgdGhlIGxvd2VyIG51bWJlciwgdGhvdWdoIHlvdSBtYXkgb21pdCBvbmUgb2YgdGhlIG51bWJlcnMuIFVzZSB0aGUgLXIvCiAgIC0tcmFuZ2Ugc3dpdGNoIChwcmV2aW91c2x5IEhUVFAtb25seSkuCgogLSBTZWJhc3RpYWFuIHZhbiBFcmsgc3VnZ2VzdGVkIHRoYXQgY3VybCBzaG91bGQgYmUKICAgYWJsZSB0byBzaG93IHRoZSBmaWxlIHNpemUgb2YgYSBzcGVjaWZpZWQgZmlsZS4gSSB0aGluayB0aGlzIGlzIGEgc3BsZW5kaWQKICAgaWRlYSBhbmQgdGhlIC1JIGZsYWcgaXMgbm93IHdvcmtpbmcgZm9yIEZUUC4gSXQgZGlzcGxheXMgdGhlIGZpbGUgc2l6ZSBpbgogICB0aGlzIG1hbm5lcjoKICAgICAgICBDb250ZW50LUxlbmd0aDogWFhYWAogICBBcyBpdCByZXNlbWJsZXMgbm9ybWFsIGhlYWRlcnMsIGFuZCBsZWF2ZXMgdXMgdGhlIG9wcG9ydHVuaXR5IHRvIGFkZCBtb3JlCiAgIGluZm8gaW4gdGhhdCBkaXNwbGF5IGlmIHdlIGNhbiBjb21lIHVwIHdpdGggbW9yZSBpbiB0aGUgZnV0dXJlISBJdCBhbHNvCiAgIG1ha2VzIHNlbnNlIHNpbmNlIGlmIHlvdSBhY2Nlc3MgZnRwIHRocm91Z2ggYSBIVFRQIHByb3h5LCB5b3UnZCBnZXQgdGhlCiAgIGZpbGUgc2l6ZSB0aGUgc2FtZSB3YXkuCgogICBJIGNoYW5nZWQgdGhlIG9yZGVyIG9mIHRoZSBRVU9URSBjb21tYW5kIGV4ZWN1dGlvbnMuIFRoZXkncmUgbm93IGV4ZWN1dGVkCiAgIGp1c3QgYWZ0ZXIgdGhlIGxvZ2luIGFuZCBiZWZvcmUgYW55IG90aGVyIGNvbW1hbmQuIEkgbWFkZSB0aGlzIHRvIGVuYWJsZQogICBxdW90ZSBjb21tYW5kcyB0byBydW4gYmVmb3JlIHRoZSAtSSBzdHVmZiBpcyBkb25lIHRvby4KCiAtIEkgZm91bmQgb3V0IHRoYXQgLUQvLS1kdW1wLWhlYWRlciBhbmQgLVYvLS12ZXJzaW9uIHdlcmVuJ3QgZG9jdW1lbnRlZCBpbgogICB0aGUgbWFuIHBhZ2UuCgogLSBNYW55IEhUVFAvMS4xIHNlcnZlcnMgZG8gbm90IHN1cHBvcnQgcmFuZ2VzLiBEb24ndCBhc2sgbWUgd2h5LiBJIGRpZCBhZGQKICAgc29tZSB0ZXh0IGFib3V0IHRoaXMgaW4gdGhlIG1hbiBwYWdlIGZvciB0aGUgcmFuZ2Ugb3B0aW9uLiBUaGUgdGhyZWFkIGluCiAgIHRoZSBtYWlsaW5nIGxpc3QgdGhhdCBzdGFydGVkIHRoaXMgd2FzIGluaXRpYXRlZCBieSBNaWNoYWVsIEFudGkuCgogLSBJIGdldCByZXBvcnRzIGFib3V0IG5yb2ZmIGNyYXNoZXMgb24gc29sYXJpcyAyLjYrIHdoZW4gZGlzcGxheWluZyB0aGUgY3VybAogICBtYW4gcGFnZS4gU3dpdGNoIHRvIGducm9mZiBpbnN0ZWFkLCBpdCBpcyByZXBvcnRlZCB0byB3b3JrKCEpLiBBZGFtIEJhcmNsYXkKICAgcmVwb3J0ZWQgYW5kIGJyb3VnaHQgdGhlIHN1Z2dlc3Rpb24uCgogLSBJbiBhIGRpYWxvZ3VlIHdpdGggSm9oYW5uZXMgRy4gS3Jpc3RpbnNzb24gd2UgY2FtZQogICB1cCB3aXRoIHRoZSBpZGVhIHRvIGxldCAtSC8tLWhlYWRlciBzcGVjaWZpZWQgaGVhZGVycyByZXBsYWNlIHRoZQogICBpbnRlcm5hbGx5IGdlbmVyYXRlZCBoZWFkZXJzLCBpZiB5b3UgaGFwcGVuZWQgdG8gc2VsZWN0IHRvIGFkZCBhIGhlYWRlcgogICB0aGF0IGN1cmwgbm9ybWFsbHkgdXNlcyBieSBpdHNlbGYuIFRoZSBhZHZhbnRhZ2Ugd2l0aCB0aGlzIGlzIG5vdCBlbnRpcmVseQogICBvYnZpb3VzLCBidXQgaW4gSm9oYW5uZXMnIGNhc2UgaXQgbWVhbnMgdGhhdCBoZSBjYW4gdXNlIGFub3RoZXIgSG9zdDogdGhhbgogICB0aGUgb25lIGN1cmwgd291bGQgc2V0LgoKIERhbmllbCAoMjcgT2N0b2JlciAxOTk5KToKIC0gSm9uZ2tpIFN1d2FuZGkgYnJvdWdodCBhIG5pY2UgcGF0Y2ggZm9yICh5ZXQgYW5vdGhlcikgY3Jhc2ggd2hlbiBmb2xsb3dpbmcKICAgYSBsb2NhdGlvbjouIFRoaXMgdGltZSB5b3UgaGFkIHRvIGZvbGxvdyBhIGh0dHBzOi8vIHNlcnZlcidzIHJlZGlyZWN0IHRvCiAgIGdldCB0aGUgY29yZS4KClZlcnNpb24gNi4yCgogRGFuaWVsICgyMSBPY3RvYmVyIDE5OTkpOgogLSBJIHRoaW5rIEkgbWFuYWdlZCB0byByZW1vdmUgdGhlIHN1c3BpY2lvdXMgKG5pbCkgdGhhdCBoYXMgYmVlbiBzZWVuIGp1c3QKICAgYmVmb3JlIHRoZSAiSG9zdDoiIGluIEhUVFAgcmVxdWVzdHMgd2hlbiAtdiB3YXMgdXNlZC4KIC0gSSBmb3VuZCBvdXQgdGhhdCBpZiB5b3UgZm9sbG93ZWQgYSBsb2NhdGlvbjogd2hlbiB1c2luZyBhIHByb3h5LCB3aXRob3V0CiAgIGhhdmluZyBzcGVjaWZpZWQgaHR0cDovLyBpbiB0aGUgVVJMLCB0aGUgcHJvdG9jb2wgcGFydCB3YXMgYWRkZWQgb25jZSBhZ2FpbgogICB3aGVuIG1vdmluZyB0byB0aGUgbmV4dCBVUkwhIChUaGUgcHJvdG9jb2wgcGFydCBoYXMgdG8gYmUgYWRkZWQgdG8gdGhlCiAgIFVSTCB3aGVuIGdvaW5nIHRocm91Z2ggYSBwcm94eSBzaW5jZSBpdCBoYXMgbm8gcHJvdG9jb2wtZ3Vlc3Npbmcgc3lzdGVtCiAgIHN1Y2ggYXMgY3VybCBoYXMuKQogLSBCZW5qYW1pbiBSaXRjZXkgcmVwb3J0ZWQgYSBjb3JlIGR1bXAgdW5kZXIgc29sYXJpcyAyLjYKICAgd2l0aCBPcGVuU1NMIDAuOS40LiBJdCB0dXJuZWQgb3V0IHRoaXMgd2FzIGR1ZSB0byBhIGJhZCBmcmVlKCkgaW4gbWFpbi5jCiAgIHRoYXQgb2NjdXJyZWQgYWZ0ZXIgdGhlIGRvd25sb2FkIHdhcyBkb25lIGFuZCBjb21wbGV0ZWQuCiAtIEJlbmphbWluIGZvdW5kIGZ0cCBkb3dubG9hZHMgdG8gc2hvdyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZG93bmxvYWQgbWV0ZXIKICAgdG8gZ2V0IHdyaXR0ZW4gdHdpY2UsIGFuZCBJIHJlbW92ZWQgdGhhdCBwcm9ibGVtLiBJdCB3YXMgaW50cm9kdWNlZCB3aXRoCiAgIHRoZSBtdWx0aXBsZSBVUkwgc3VwcG9ydC4KIC0gRGFuIFppdHRlciBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIDYuMSBhbmQgZWFybGllciB2ZXJzaW9ucyBkaWRuJ3QKICAgaG9ub3IgUkZDIDI2MTYgY2hhcHRlciA0IHNlY3Rpb24gMiwgIk1lc3NhZ2UgSGVhZGVycyI6ICIuLi5GaWVsZCBuYW1lcyBhcmUKICAgY2FzZS1pbnNlbnNpdGl2ZS4uLiIgIEhUVFAgaGVhZGVyIHBhcnNpbmcgYXNzdW1lZCBhIGNlcnRhaW4gY2FzaW5nLiBEYW4KICAgYWxzbyBwcm92aWRlZCBtZSB3aXRoIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgdGhpcywgd2hpY2ggSSB0b29rIHRoZSBsaWJlcnR5CiAgIG9mIGVkaXRpbmcgc2xpZ2h0bHkuCiAtIERhbiBaaXR0ZXIgYWxzbyBwcm92aWRlZCBhIG5pY2UgcGF0Y2ggZm9yIGNvbmZpZy5ndWVzcyB0byBiZXR0ZXIgcmVjb2duaXplCiAgIHRoZSBNYWMgT1MgWAogLSBEYW4gYWxzbyBjb3JyZWN0ZWQgYSBtaW5vciBwcm9ibGVtIGluIHRoZSBsaWIvTWFrZWZpbGUgdGhhdCBjYXVzZWQgbGlua2luZwogICB0byBmYWlsIG9uIE9TIFguCgogRGFuaWVsICgxOSBPY3RvYmVyIDE5OTkpOgogLSBMZW4gTWFyaW5hY2NpbyBjYW1lIHVwIHdpdGggc29tZSBwcm9ibGVtcyB3aXRoIGN1cmwuICBTaW5jZSBXaW5kb3dzIGhhcyBhCiAgIGNyaXBwbGVkIHNoZWxsLCBpdCBjYW4ndCByZWRpcmVjdCBzdGRlcnIgYW5kIHRoYXQgY2F1c2VzIHRyb3VibGUuIEkgYWRkZWQKICAgLS1zdGRlcnIgdG9kYXkgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIHJlZGlyZWN0IHRoZSBzdGRlcnIgc3RyZWFtIHRvIGEKICAgZmlsZSBvciBzdGRvdXQuCgogRGFuaWVsICgxOCBPY3RvYmVyIDE5OTkpOgogLSBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgdW5kZXJzdGFuZHMgdGhlICctLXdpdGhvdXQtc3NsJyBmbGFnLCB3aGljaCBub3cKICAgdG90YWxseSBkaXNhYmxlIFNTTC9odHRwcyBzdXBwb3J0LiBQcmV2aW91c2x5IGl0IHdhc24ndCBwb3NzaWJsZSB0byBmb3JjZQogICB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBsZWF2ZSBTU0wgYWxvbmUuIFRoZSBwcmV2aW91cyBmdW5jdGlvbmFsaXR5IGhhcwogICBiZWVuIHJldGFpbmVkLiBUcm95IEVuZ2VsIGhlbHBlZCB0ZXN0IHRoaXMgbmV3IG9uZS4KClZlcnNpb24gNi4xIChPY3RvYmVyIDE3IDE5OTkpCgogRGFuaWVsICgxNyBPY3RvYmVyIDE5OTkpOgogLSBJIGlmZGVmJ2VkIG9yIGNvbW1lbnRlZCBhbGwgdGhlIHpsaWIgc3R1ZmYgaW4gdGhlIHNvdXJjZXMgYW5kIGNvbmZpZ3VyZQogICBzY3JpcHQuIEl0IHR1cm5lZCBvdXQgd2UgbmVlZGVkIHRvIG1vY2sgbW9yZSB3aXRoIHpsaWIgdGhhbiBJIGluaXRpYWxseQogICB0aG91Z2h0LCB0byBtYWtlIGl0IGNhcGFibGUgb2YgZG93bmxvYWRpbmcgY29tcHJlc3NlZCBIVFRQIGRvY3VtZW50cyBhbmQKICAgdW5jb21wcmVzcyB0aGVtIG9uIHRoZSBmbHkuIEkgZGlkbid0IG1lYW4gdGhlIHpsaWIgcGFydHMgb2YgY3VybCB0byBiZWNvbWUKICAgbW9yZSB0aGFuIG1pbm9yIHNvIHRoaXMgbWVhbnMgSSBoYWx0IHRoZSB6bGliIGV4cGVkaXRpb24gZm9yIG5vdyBhbmQgd2FpdAogICB1bnRpbCBzb21lb25lIGVpdGhlciB3cml0ZXMgdGhlIGNvZGUgb3IgemxpYiBnZXRzIHVwZGF0ZWQgYW5kIGJldHRlcgogICBhZGp1c3RlZCBmb3IgdGhpcyBraW5kIG9mIHVzYWdlLiAgSSB3b24ndCBnZXQgaW50byBkZXRhaWxzIGhlcmUsIGJ1dCBhCiAgIHNob3J0IGEgc3VtbWFyeSBpcyBzdWl0YWJsZToKICAgLSB6bGliIGNhbid0IGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHdoZXRoZXIgdG8gdXNlIHpsaWIgb3IgZ3ppcAogICAgIGRlY29tcHJlc3Npb24gbWV0aG9kcy4KICAgLSB6bGliIGlzIHZlcnkgbmVhdCBmb3IgcmVhZGluZyBnemlwcGVkIGZpbGVzIGZyb20gYSBmaWxlIGRlc2NyaXB0b3IsCiAgICAgYWx0aG91Z2ggbm90IGFzIG5pY2UgZm9yIHJlYWRpbmcgYnVmZmVyLWJhc2VkIGRhdGEgc3VjaCBhcyB3ZSB3b3VsZAogICAgIHdhbnQgaXQuCiAgIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgd2luMzIgdmVyc2lvbiB3aGVuIHJlYWRpbmcgZnJvbQogICAgIGEgZmlsZSBkZXNjcmlwdG9yIGlmIHRoYXQgaXMgYSBzb2NrZXQKCiBEYW5pZWwgKDE0IE9jdG9iZXIgMTk5OSk6CiAtIE1vdmVkIHRoZSAoZXh0ZXJuYWwpIGluY2x1ZGUgZmlsZXMgZm9yIGxpYmN1cmwgaW50byBhIHN1YmRpcmVjdG9yeSBuYW1lZAogICBjdXJsIGFuZCBhZGp1c3RlZCBhbGwgI2luY2x1ZGUgbGluZXMgdG8gdXNlIDxjdXJsL1hYWFg+IHRvIG1haW50YWluIGEKICAgYmV0dGVyIG5hbWUgc3BhY2UgYW5kIGNvbnRyb2wgb2YgdGhlIGhlYWRlcnMuIFRoaXMgaGFzIGJlZW4gcmVxdWVzdGVkLgoKIERhbmllbCAoMTIgT2N0b2JlciAxOTk5KToKIC0gSSBtb2RpZmllZCB0aGUgJ21ha2V0Z3onIHNjcmlwdCB0byBwZXJmb3JtIGEgJ21ha2UnIHRvbyBiZWZvcmUgYSByZWxlYXNlCiAgIGFyY2hpdmUgaXMgcHV0IHRvZ2V0aGVyIGluIGFuIGF0dGVtcHQgdG8gbWFrZSB0aGUgdGltZSBzdGFtcHMgYmV0dGVyIGFuZAogICBob3BlZnVsbHkgYXZvaWQgdGhlIGRvdWJsZSBjb25maWd1cmUtcnVubmluZyB0aGF0IHVzZSB0byBvY2N1ci4KCiBEYW5pZWwgKDExIE9jdG9iZXIgMTk5OSk6CiAtIEFwcGxpZWQgSvZybidzIHBhdGNoZXMgdGhhdCBmaXhlcyB6bGliIGZvciBtaW5ndzMyIGNvbXBpbGVzIGFzIHdlbGwgYXMKICAgc29tZSBvdGhlciBtaXNzaW5nIHpsaWIgI2lmZGVmIGFuZCBtb3JlIHRleHQgb24gdGhlIG11bHRpcGxlIFVSTCBkb2NzIGluCiAgIHRoZSBtYW4gcGFnZS4KClZlcnNpb24gNi4xYmV0YQoKIERhbmllbCAoNiBPY3RvYmVyIDE5OTkpOgogLSBEb3VnbGFzIEUuIFdlZ3NjaGVpZCBzZW50IG1lIGEgcGF0Y2ggdGhhdCBtYWRlIHRoZSBleGFjdCBzYW1lIHRoaW5nIGFzIEkKICAganVzdCBtYWRlOiB0aGUgLWQgc3dpdGNoIGlzIG5vdyBjYXBhYmxlIG9mIHJlYWRpbmcgcG9zdCBkYXRhIGZyb20gYSBuYW1lZAogICBmaWxlIG9yIHN0ZGluLiAgVXNlIGl0IHNpbWlsYXJseSB0byB0aGUgLUYuIFRvIHJlYWQgdGhlIHBvc3QgZGF0YSBmcm9tIGEKICAgZ2l2ZW4gZmlsZToKCiAgICAgICAgY3VybCAtZCBAcGF0aC90by9maWxlbmFtZSB3d3cucG9zdHNpdGUuY29tCgogICBvciBsZXQgY3VybCByZWFkIGl0IG91dCBmcm9tIHN0ZGluOgoKICAgICAgICBjdXJsIC1kIEAtIHd3dy5wb3N0aXQuY29tCgogSvZybiBIYXJ0cm90aCAoMyBPY3RvYmVyIDE5OTkpOgogLSBCcm91Z2h0IHNvbWUgbW9yZSBwYXRjaGVzIGZvciBtdWx0aXBsZSBVUkwgZnVuY3Rpb25hbGl0eS4gVGhlIE1JTUUKICAgc2VwYXJhdGlvbiBpZGVhcyBhcmUgYWxtb3N0IHNjcmFwcGVkIG5vdywgYW5kIGEgY3VzdG9tIHNlcGFyYXRvciBpcyBiZWluZwogICB1c2VkIGluc3RlYWQuIFRoaXMgaXMgc3RpbGwgY29tcGlsZS10aW1lICJmbGFnZ2VkIi4KCiBEYW5pZWwKIC0gVXBkYXRlZCBjdXJsLjEgd2l0aCBtdWx0aXBsZSBVUkwgaW5mby4KCiBEYW5pZWwgKDMwIFNlcHRlbWJlciAxOTk5KToKIC0gRmVsaXggdm9uIExlaXRuZXIgYnJvdWdodCBvcGVuc3NsLWNoZWNrIGZpeGVzIGZvciBjb25maWd1cmUuaW4gdG8gd29yawogICBvdXQtb2YtdGhlLWJveCB3aGVuIHRoZSBvcGVuc3NsIGZpbGVzIGFyZSBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbSBkZWZhdWx0CiAgIGRpcnMuCgogRGFuaWVsICgyOCBTZXB0ZW1iZXIgMTk5OSkKIC0gQWRkZWQgbGlieiBmdW5jdGlvbmFsaXR5LiBUaGlzIHNob3VsZCBlbmFibGUgZGVjb21wcmVzc2luZyBnemlwLCBjb21wcmVzcwogICBvciBkZWZsYXRlIGVuY29kaW5nIEhUVFAgZG9jdW1lbnRzLiBJdCBhbHNvIG1ha2VzIGN1cmwgc2VuZCBhbiBhY2NlcHQgdGhhdAogICBpdCBhY2NlcHRzIHRoYXQga2luZCBvZiBlbmNvZGluZy4gQ29tcHJlc3NlZCBjb250ZW50cyB1c3VhbGx5IHNob3J0ZW5zCiAgIGRvd25sb2FkIHRpbWUuIEkgKm5lZWQqIHNvbWVvbmUgdG8gdGVsbCBtZSBhIHNpdGUgdGhhdCB1c2VzIGNvbXByZXNzZWQgSFRUUAogICBkb2N1bWVudHMgc28gdGhhdCBJIGNhbiB0ZXN0IHRoaXMgb3V0IHByb3Blcmx5LgoKIC0gQXMgYSByZXN1bHQgb2YgdGhlIGFkZGluZyBvZiB6bGliIGF3YXJlbmVzcywgSSBjaGFuZ2VkIHRoZSB2ZXJzaW9uIHN0cmluZwogICBhIGxpdHRsZS4gSSBwbGFuIHRvIGFkZCBvcGVubGRhcCB2ZXJzaW9uIHJlcG9ydGluZyBpbiB0aGVyZSB0b28uCgogRGFuaWVsICgxNyBTZXB0ZW1iZXIgMTk5OSkKIC0gTWFkZSB0aGUgLUYgb3B0aW9uIGFsbG93IHN0ZGluIHdoZW4gc3BlY2lmeWluZyBmaWxlcy4gQnkgdXNpbmcgJy0nIGluc3RlYWQKICAgb2YgZmlsZSBuYW1lLCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQgZnJvbSBzdGRpbi4KClZlcnNpb24gNi4wIChTZXB0ZW1iZXIgMTQgMTk5OSkKCiBEYW5pZWwgKDEzIFNlcHRlbWJlciAxOTk5KQogLSBBZGRlZCAtWC8tLWh0dHAtcmVxdWVzdCA8cmVxdWVzdD4gdG8gZW5hYmxlIGFueSBIVFRQIGNvbW1hbmQgdG8gYmUgc2VudC4KICAgRG8gbm90IHRoYXQgeW91ciBzZXJ2ZXIgaGFzIHRvIHN1cHBvcnQgdGhlIGV4YWN0IHN0cmluZyB5b3UgZW50ZXIuIFRoaXMKICAgc2hvdWxkIHBvc3NpYmx5IGEgc3RyaW5nIGxpa2UgREVMRVRFIG9yIFRSQUNFLgoKIC0gQXBwbGllZCBEb3VnbGFzJyBtaW5ndzMyLWZpeGVzIGZvciB0aGUgbWFrZWZpbGVzLgoKIERhbmllbCAoMTAgU2VwdGVtYmVyIDE5OTkpCiAtIERvdWdsYXMgRS4gV2Vnc2NoZWlkIHBvaW50ZWQgb3V0IGEgcHJvYmxlbS4gQ3VybCBkaWRuJ3QgY2hlY2sgdGhlIEZUUAogICBzZXJ2ZXJzIHJldHVybiBjb2RlIHByb3Blcmx5IGFmdGVyIHRoZSAtLXF1b3RlIGNvbW1hbmRzIHdlcmUgaXNzdWVkLiBJdAogICB0b29rIGFueXRoaW5nIG5vbiAyMDAgYXMgYW4gZXJyb3IsIHdoZW4gYWxsIDJYWCBjb2RlcyBzaG91bGQgYmUgYWNjZXB0ZWQgYXMKICAgT0suCgogLSBTZW5kaW5nIGNvb2tpZXMgdG8gdGhlIHNhbWUgc2l0ZSBpbiBtdWx0aXBsZSBsaW5lcyBsaWtlIGN1cmwgdXNlZCB0byBkbwogICB0dXJuZWQgb3V0IHRvIGJlIGJhZCBhbmQgYnJlYWtpbmcgdGhlIGNvb2tpZSBzcGVjcy4gQ3VybCBub3cgc2VuZHMgYWxsCiAgIGNvb2tpZXMgb24gYSBzaW5nbGUgQ29va2llOiBsaW5lLiBDdXJsIGlzIG5vdCB5ZXQgUkZDIDIxMDkgY29tcGxpYW50LCBidXQgSQogICBkb3VidCB0aGF0IG1hbnkgc2VydmVycyBkbyB1c2UgdGhhdCBzeW50YXggKHlldCkuCgogRGFuaWVsICg4IFNlcHRlbWJlciAxOTk5KQogLSBK9nJuIGhlbHBlZCBtZSBtYWtlIHN1cmUgaXQgc3RpbGwgY29tcGlsZXMgbmljZWx5IHdpdGggbWluZ3czMiB1bmRlciB3aW4zMi4KCiBEYW5pZWwgKDcgU2VwdGVtYmVyIDE5OTkpCiAtIEZUUCB1cGxvYWQgdGhyb3VnaCBwcm94eSBpcyBub3cgdHVybmVkIGludG8gYSBIVFRQIFBVVC4gUmVxdWVzdGVkIGJ5CiAgIFN0ZWZhbiBLYW50aGFrLgoKIC0gQWRkZWQgdGhlIGxkYXAgZmlsZXMgdG8gdGhlIC5tMzIgbWFrZWZpbGUuCgogRGFuaWVsICgzIFNlcHRlbWJlciAxOTk5KQogLSBNYWRlIGNvb2tpZSBtYXRjaGluZyB3b3JrIHdoaWxlIHVzaW5nIEhUVFAgcHJveHkuCgogQmpvcm4gUmVlc2UgKDMxIEF1Z3VzdCAxOTk5KQogLSBQYXNzZWQgaGlzIGxkYXA6Ly8gcGF0Y2guIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIHRoZSBvcGVubGRhcCBzaGFyZWQKICAgbGlicmFyeSB0byBiZSBpbnN0YWxsZWQgYW5kIHRoYXQgTERfTElCUkFSWV9QQVRIIHBvaW50cyB0byB0aGUKICAgZGlyZWN0b3J5IHdoZXJlIHRoZSBsaWIgd2lsbCBiZSBmb3VuZCB3aGVuIGN1cmwgaXMgcnVuIHdpdGggYQogICBsZGFwOi8vIFVSTC4KCiBK9nJuIEhhcnRyb3RoICgzMSBBdWd1c3QgMTk5OSkKIC0gTWFkZSB0aGUgTWluZ3czMiBtYWtlZmlsZXMgaW50byBzaW5nbGUgZmlsZXMuCiAtIE1hZGUgZmlsZTovLyB3b3JrIGZvciBXaW4zMi4gVGhlIHNhbWUgY29kZSBpcyBub3cgdXNlZCBmb3IgdW5peCBhcyB3ZWxsIGZvcgogICBwZXJmb3JtYW5jZSByZWFzb25zLgoKIERvdWdsYXMgRS4gV2Vnc2NoZWlkICgzMCBBdWd1c3QgMTk5OSkKIC0gUGF0Y2hlZCB0aGUgTWluZ3czMiBtYWtlZmlsZXMgZm9yIFNTTCBidWlsZHMuCgogTWF0dGhldyBDbGFya2UgKDMwIEF1Z3VzdCAxOTk5KQogLSBNYWRlIGEgY29vbCBwYXRjaCBmb3IgY29uZmlndXJlLmluIHRvIGFsbG93IC0td2l0aC1zc2wgdG8gc3BlY2lmeSB0aGUKICAgcm9vdCBkaXIgb2YgdGhlIG9wZW5zc2wgaW5zdGFsbGF0aW9uLCBhcyBpbgoKICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtc3NsPS91c3Ivc3NsX2hlcmUKCiAtIENvcnJlY3RlZCB0aGUgJ3JlY29uZicgc2NyaXB0IHRvIHdvcmsgYmV0dGVyIHdpdGggc29tZSBzaGVsbHMuCgogSvZybiBIYXJ0cm90aCAoMjYgQXVndXN0IDE5OTkpCiAtIEZpeGVkIHRoZSBNaW5ndzMyIG1ha2VmaWxlcyBpbiBsaWIvIGFuZCBjb3JyZWN0ZWQgdGhlIGZpbGUuYyBmb3Igd2luMzIKICAgY29tcGlsZXMuCgpWZXJzaW9uIDUuMTEKCiBEYW5pZWwgKDI1IEF1Z3VzdCAxOTk5KQogLSBKb2huIFdlaXNtaWxsZXIgcG9pbnRlZCBvdXQgYSBidWcgaW4gdGhlIGhlYWRlci1saW5lCiAgIHJlYWxsb2MoKSBzeXN0ZW0gaW4gZG93bmxvYWQuYy4KCiAtIEkgYWRkZWQgbGliL2ZpbGUuW2NoXSB0byBvZmZlciBhIGZpcnN0LCBzaW1wbGUsIGZpbGU6Ly8gc3VwcG9ydC4gSXQKICAgcHJvYmFibHkgd29uJ3QgZG8gbXVjaCBnb29kIG9uIHdpbjMyIHN5c3RlbSBhdCB0aGlzIHBvaW50LCBidXQgSSBzZWUgaXQKICAgYXMgYSBzdGFydC4KCiAtIE1hZGUgdGhlIHJlbGVhc2UgYXJjaGl2ZXMgZ2V0IGEgTWFrZWZpbGUgaW4gdGhlIHJvb3QgZGlyLCB3aGljaCBjYW4gYmUKICAgdXNlZCB0byBzdGFydCB0aGUgY29tcGlsaW5nL2J1aWxkaW5nIHByb2Nlc3MgZWFzaWVyLiBJIGhhdmVuJ3QgcmVhbGx5CiAgIGNoYW5nZWQgYW55IElOU1RBTEwgdGV4dCB5ZXQsIEkgd2FudGVkIHRvIGdldCBzb21lIGZlZWQtYmFjayBvbiB0aGlzCiAgIGZpcnN0LgoKIERhbmllbCAoMTcgQXVndXN0IDE5OTkpCiAtIEFub3RoZXIgTG9jYXRpb246IGJ1Zy4gQ3VybCBkaWRuJ3QgZG8gcHJvcGVyIHJlbGF0aXZlIGxvY2F0aW9ucyBpZiB0aGUKICAgb3JpZ2luYWwgVVJMIGhhZCBjZ2ktcGFyYW1ldGVycyB0aGF0IGNvbnRhaW5lZCBhIHNsYXNoLiBOdXN1J3MgcGFnZQogICBhZ2Fpbi4KCiAtIENvcnJlY3RlZCB0aGUgTk9fUFJPWFkgdXNhZ2UuIEl0IGlzIGEgbGlzdCBvZiBzdWJzdHJpbmdzIHRoYXQgaWYgb25lIG9mCiAgIHRoZW0gbWF0Y2hlcyB0aGUgdGFpbCBvZiB0aGUgaG9zdCBuYW1lIGl0IHNob3VsZCBjb25uZWN0IHRvLCBjdXJsIHNob3VsZAogICBub3QgdXNlIGEgcHJveHkgdG8gY29ubmVjdCB0aGVyZS4gUG9pbnRlZCBvdXQgdG8gbWUgYnkgRG91Z2xhcwogICBFLiBXZWdzY2hlaWQuICBJIGFsc28gY2hhbmdlZCB0aGUgUkVBRE1FIHRleHQgYSBsaXR0bGUgcmVnYXJkaW5nIHRoaXMuCgogRGFuaWVsICgxNiBBdWd1c3QgMTk5OSkKIC0gRml4ZWQgYSBtZW1vcnkgYnVnIHdpdGggaHR0cC1zZXJ2ZXJzIHRoYXQgc2VudCBMb2NhdGlvbjogdG8gYSBMb2NhdGlvbjoKICAgcGFnZS4gTnVzdSdzIHBhZ2Ugc2hvd2VkIHRoaXMgdG9vLgoKIC0gTWFkZSBjb29raWVzIHdvcmsgYSBsb3QgYmV0dGVyLiBTZXR0aW5nIHRoZSBzYW1lIGNvb2tpZSBuYW1lIHNldmVyYWwgdGltZXMKICAgdXNlZCB0byBhZGQgbW9yZSBjb29raWVzIGluc3RlYWQgb2YgcmVwbGFjaW5nIHRoZSBmb3JtZXIgb25lIHdoaWNoIGl0CiAgIHNob3VsZCd2ZS4gTnVzdSA8bnVzIGF0IGludGVyZ29yai5ybz4gYnJvdWdodCBtZSBhbiBVUkwgdGhhdCBtYWRlIHRoaXMKICAgcGFpbmZ1bGx5IHZpc2libGUuLi4KCiBUcm95ICgxNSBBdWd1c3QgMTk5OSkKIC0gQnJvdWdodCBuZXcgLnNwZWMgZmlsZXMgYXMgd2VsbCBhcyBhIHBhdGNoIGZvciBjb25maWd1cmUuaW4gdGhhdCBsZXRzIHRoZQogICBjb25maWd1cmUgc2NyaXB0IGZpbmQgdGhlIG9wZW5zc2wgZmlsZXMgYmV0dGVyLCBldmVuIHdoZW4gdGhlIGluY2x1ZGUKICAgZmlsZXMgYXJlIGluIC91c3IvaW5jbHVkZS9vcGVuc3NsCgpWZXJzaW9uIDUuMTAKCiBEYW5pZWwgKDEzIEF1Z3VzdCAxOTk5KQogLSBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYigpIGhhcyBiZWVuIG1vZGlmaWVkIGluIHRoZSAwLjkuNCB2ZXJzaW9uIG9mCiAgIE9wZW5TU0wuIE5vdyB3aHkgY291bGRuJ3QgdGhleSBzaW1wbHkgYWRkIGEgKm5ldyogZnVuY3Rpb24gaW5zdGVhZCBvZgogICBtb2RpZnlpbmcgdGhlIHBhcmFtZXRlcnMgb2YgYW4gYWxyZWFkeSBleGlzdGluZyBmdW5jdGlvbj8gVGhpcyB3YXksIHdlIGdldAogICBhIGNvbXBpbGVyIHdhcm5pbmcgaWYgY29tcGlsaW5nIHdpdGggMC45LjQgYnV0IG5vdCB3aXRoIGVhcmxpZXIuIFNvLCBJIGhhZAogICB0byBjb21lIHVwIHdpdGggYSAjaWYgY29uc3RydWN0aW9uIHRoYXQgZGVhbHMgd2l0aCB0aGlzLi4uCgogLSBNYWRlIGN1cmwgb3V0cHV0IHRoZSBTU0wgdmVyc2lvbiBudW1iZXIgZ2V0IGRpc3BsYXllZCBwcm9wZXJseSB3aXRoIDAuOS40LgoKIFRyb3kgKDEyIEF1Z3VzdCAxOTk5KQogLSBBZGRlZCBNaW5nVzMyIChHQ0MtMi45NSkgc3VwcG9ydCB1bmRlciBXaW4zMi4gVGhlIElOU1RBTEwgZmlsZSB3YXMgYWxzbwogICBhIGJpdCByZWFycmFuZ2VkLgoKIERhbmllbCAoMTIgQXVndXN0IDE5OTkpCiAtIEkgaGFkIHRvIGNvcHkgYSBnb29kIDxhcnBhL3RlbG5ldC5oPiBpbmNsdWRlIGZpbGUgaW50byB0aGUgY3VybCBzb3VyY2UKICAgdHJlZSB0byBlbmFibGUgdGhlIHNpbGx5IHdpbjMyIHN5c3RlbXMgdG8gY29tcGlsZS4gVGhlIGRpc3RyaWJ1dGlvbiByaWdodHMKICAgYWxsb3dzIHVzIHRvIGRvIHRoYXQgYXMgbG9uZyBhcyB0aGUgZmlsZSByZW1haW5zIHVubW9kaWZpZWQuCgogLSBJIGNvcnJlY3RlZCBhIGZldyBtaW5vciB0aGluZ3MgdGhhdCBtYWRlIHRoZSBjb21waWxlciBjb21wbGFpbiB3aGVuCiAgIC1XYWxsIC1wZWRhbnRpYyB3YXMgdXNlZC4KCiAtIEknbSBtb3ZpbmcgdGhlIG9mZmljaWFsIGN1cmwgd2ViIHBhZ2UgdG8gY3VybC5oYXh4Lm51LiBJIHRoaW5rIGl0CiAgIHdpbGwgbWFrZSBpdCBlYXNpZXIgdG8gcmVtZW1iZXIgYXMgaXQgaXMgYSBsb3Qgc2hvcnRlciBhbmQgbGVzcyBjcnlwdGljLgogICBUaGUgb2xkIG9uZSBzdGlsbCB3b3JrcyBhbmQgc2hvd3MgdGhlIHNhbWUgaW5mby4KCiBEYW5pZWwgKDExIEF1Z3VzdCAxOTk5KQogLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIG1haWxlZCBtZSBhbm90aGVyIGNvcnJlY3Rpb24gZm9yIE5ST0ZGIGluIHRoZQogICBjb25maWd1cmUuaW4gdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBiZXR0ZXIgZm9yIElSSVggdXNlcnMuCgogRGFuaWVsICgxMCBBdWd1c3QgMTk5OSkKIC0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBoZWxwZWQgbWUgd2l0aCBzb21lIHN0dXBpZCBNYWtlZmlsZSB0aGluZ3MsIGFzIHdlbGwgYXMKICAgc29tZSBmaWRkbGluZyB3aXRoIHRoZSBnZXRkYXRlLmMgc3R1ZmYgdGhhdCBoZSBoYWQgcHJvYmxlbXMgd2l0aCB1bmRlcgogICBIUC1VWCB2MTAuIGdldGRhdGUueSB3aWxsIG5vdyBiZSBjb21waWxlZCBpbnRvIGdldGRhdGUuYyBpZiB0aGUgYXBwcm9wcmlhdGUKICAgeWFjYyBvciBiaXNvbiBpcyBmb3VuZCBieSB0aGUgY29uZmlndXJlIHNjcmlwdC4gU2luY2UgdGhpcyBpcyBzbGlnaHRseSBuZXcsCiAgIHdlIG5lZWQgdG8gdGVzdCB0aGUgb3V0cHV0IGdldGRhdGUuYyB3aXRoIHdpbjMyIHN5c3RlbXMgdG8gbWFrZSBzdXJlIGl0CiAgIHN0aWxsIGNvbXBpbGVzIHRoZXJlLgoKIERhbmllbCAoNSBBdWd1c3QgMTk5OSkKIC0gSSd2ZSBqdXN0IHNldHVwIGEgbmV3IG1haWxpbmcgbGlzdCB3aXRoIHRoZSBpbnRlbnRpb24gdG8ga2VlcCBkaXNjdXNzaW9ucwogICBhcm91bmQgbGliY3VybCBkZXZlbG9wbWVudCBpbiBpdC4gSSBtYWlubHkgZXhwZWN0IGl0IHRvIGJlIGZvciB0aG91Z2h0cyBhbmQKICAgYnJhaW5zdG9ybWluZyBhcm91bmQgYSAibmV4dCBnZW5lcmF0aW9uIiBsaWJyYXJ5LCByYXRoZXIgdGhhbiBuaXRwaWNraW5nCiAgIGFib3V0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9yIGRldGFpbHMgaW4gdGhlIGN1cnJlbnQgbGliY3VybC4KCiAgIFRvIGpvaW4gb3VyIGhhcHB5IGJ1bmNoIG9mIGZ1dHVyZS1sb29raW5nIGdlZWtzLCBlbnRlciAnc3Vic2NyaWJlCiAgIDxhZGRyZXNzPicgaW4gdGhlIGJvZHkgb2YgYSBtYWlsIGFuZCBzZW5kIGl0IHRvCiAgIGxpYmN1cmwtcmVxdWVzdEBsaXN0c2Vydi5mdHMuZnJvbnRlYy5zZS4gIEN1cmwgYnVnIHJlcG9ydHMsIHRoZSB1c3VhbCBjdXJsCiAgIHRhbGsgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBzaG91bGQgc3RpbGwgYmUga2VwdCBpbiB0aGlzIG1haWxpbmcgbGlzdC4gSSd2ZQogICBzdGFydGVkIHRvIGFyY2hpdmUgdGhpcyBtYWlsaW5nIGxpc3QgYW5kIGhhdmUgcHV0IHRoZSBsaWJjdXJsIHdlYiBwYWdlIGF0CiAgIHd3dy5mdHMuZnJvbnRlYy5zZS9+ZGFzdC9saWJjdXJsLy4KCiAtIFN0ZWZhbiBLYW50aGFrIGNvbnRhY3RlZCBtZSByZWdhcmRpbmcgYSBmZXcgcHJvYmxlbXMgaW4gdGhlIGNvbmZpZ3VyZQogICBzY3JpcHQgd2hpY2ggaGUgZGlzY292ZXJlZCB3aGVuIHRyeWluZyB0byBtYWtlIGN1cmwgY29tcGlsZSBhbmQgYnVpbGQgdW5kZXIKICAgU2llbWVucyBTSU5JWC1aIFY1LjQyQjIwMDQhCgogLSBNYXJjdXMgS2xlaW4gdmVyeSBhY2N1cmF0ZWx5IGluZm9ybWVkIG1lIHRoYXQgc3JjL3ZlcnNpb24uaCB3YXMgbm90IHByZXNlbnQKICAgaW4gdGhlIENWUyByZXBvc2l0b3J5LiBPaCwgaG93IHNpbGx5Li4uCgogLSBMaW51cyBOaWVsc2VuIHJld3JvdGUgdGhlIHRlbG5ldDovLyBwYXJ0IGFuZCBub3cgY3VybCBvZmZlcnMgbGltaXRlZCB0ZWxuZXQKICAgc3VwcG9ydC4gSWYgeW91IHJ1biBjdXJsIGxpa2UgJ2N1cmwgdGVsbmV0Oi8vaG9zdCcgeW91J2xsIGdldCBhbGwgb3V0cHV0IG9uCiAgIHRoZSBzY3JlZW4gYW5kIGN1cmwgd2lsbCByZWFkIGlucHV0IGZyb20gc3RkaW4uIFlvdSdsbCBiZSBhYmxlIHRvIGxvZ2luIGFuZAogICBydW4gY29tbWFuZHMgZXRjLCBidXQgc2luY2UgdGhlIG91dHB1dCBpcyBidWZmZXJlZCwgZXhwZWN0IHRvIGdldCBhIGxpdHRsZQogICB3ZWlyZCBvdXRwdXQuCgogICBUaGlzIGlzIHN0aWxsIGluIGl0cyBpbmZhbmN5IGFuZCBpdCBtaWdodCBnZXQgY2hhbmdlZC4gV2UgbmVlZCB5b3VyCiAgIGZlZWQtYmFjayBhbmQgaW5wdXQgaW4gaG93IHRoaXMgaXMgYmVzdCBkb25lLgoKICAgV0lOMzIgTk9URTogSSBiZXQgd2UnbGwgZ2V0IHByb2JsZW1zIHdoZW4gdHJ5aW5nIHRvIGNvbXBpbGUgdGhlIGN1cnJlbnQKICAgbGliL3RlbG5ldC5jIG9uIHdpbjMyLCBidXQgSSB0aGluayB3ZSBjYW4gc29ydCB0aGVtIG91dCBpbiB0aW1lLgoKIC0gRGF2aWQgU2FuZGVyc29uIHJlcG9ydGVkIHRoYXQgRk9SQ0VfQUxMT0NBX0ggb3IgSEFWRV9BTExPQ0FfSCBtdXN0IGJlCiAgIGRlZmluZWQgZm9yIGdldGRhdGUuYyB0byBjb21waWxlIHByb3Blcmx5IG9uIEhQLVVYIDExLjAuIEkgdXBkYXRlZCB0aGUKICAgY29uZmlndXJlIHNjcmlwdCB0byBjaGVjayBmb3IgYWxsb2NhLmggd2hpY2ggc2hvdWxkIG1ha2UgaXQuCgogRGFuaWVsICg0IEF1Z3VzdCAxOTk5KQogLSBJIGZpbmFsbHkgZ290IHRvIHVuZGVyc3RhbmQgTWFyY3VzIEtsZWluJ3MgZnRwIGRvd25sb2FkIHJlc3VtZSBwcm9ibGVtLAogICB3aGljaCB0dXJucyBvdXQgdG8gYmUgZHVlIHRvIGRpZmZlcmVudCBvdXRwdXRzIGZyb20gZGlmZmVyZW50IGZ0cAogICBzZXJ2ZXJzLiBJdCBtYWtlcyBmdHAgZG93bmxvYWQgcmVzdW1pbmcgYSBsaXR0bGUgdHJpY2tpZXIsIGJ1dCBJJ3ZlIG1hZGUKICAgc29tZSBtb2RpZmljYXRpb25zIEkgcmVhbGx5IGJlbGlldmUgd2lsbCB3b3JrIGZvciBtb3N0IGZ0cCBzZXJ2ZXJzIGFuZCBJIGRvCiAgIGhvcGUgeW91IHJlcG9ydCBpZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIHRoaXMhCgogLSBBZGRlZCB0ZXh0IGFib3V0IGZpbGUgdHJhbnNmZXIgcmVzdW1pbmcgdG8gUkVBRE1FLmN1cmwuCgogRGFuaWVsICgyIEF1Z3VzdCAxOTk5KQogLSBBcHBsaWVkIGEgcHJvZ3Jlc3MtYmFyIHBhdGNoIGZyb20gTGFycyBKLiBBYXMuIEl0IG9mZmVycwogICBhIG5ldyBzdHlsZWQgcHJvZ3Jlc3MgYmFyIGVuYWJsZWQgd2l0aCAtIy8tLXByb2dyZXNzLWJhci4KCiBULiBZYW1hZGEgPHRhaSBhdCBpbWFzeS5vci5qcD4gKDMwIEp1bHkgMTk5OSkKIC0gSXQgYnJlYWtzIHdpdGggc2VnZmF1bHQgd2hlbiAxKSBjdXJsIGlzIHVzaW5nIC5uZXRyYyB0byBvYnRhaW4KICAgdXNlcm5hbWUvcGFzc3dvcmQgKG9wdGlvbiAnLW4nKSwgYW5kIDIpIGlzIGF1dG9tYXRpY2FsbHkgcmVkaXJlY3RlZCB0bwogICBhbm90aGVyIGxvY2F0aW9uIChvcHRpb24gJy1MJykuCgogICBUaGVyZSBpcyBhIHNtYWxsIGJ1ZyBpbiBsaWIvdXJsLmMgKGJsb2NrIHN0YXJ0aW5nIGZyb20gbGluZSA2NDEpLCB3aGljaAogICB0cmllcyB0byB0YWtlIG91dCB1c2VybmFtZS9wYXNzd29yZCBmcm9tIHVzZXItIHN1cHBsaWVkIGNvbW1hbmQtbGluZQogICBhcmd1bWVudCAoJy11JyBvcHRpb24pLiBUaGlzIGJsb2NrIGlzIG5ldmVyIGV4ZWN1dGVkIG9uIGZpcnN0IGF0dGVtcHQgc2luY2UKICAgQ09ORl9VU0VSUFdEIGJpdCBpc24ndCBzZXQgYXQgZmlyc3QsIGJ1dCBjdXJsIGxhdGVyIHR1cm5zIGl0IG9uIHdoZW4gaXQKICAgY2hlY2tzIGZvciBDT05GX05FVFJDIGJpdC4gU28gd2hlbiBjdXJsIHRyaWVzIHRvIHJlZG8gZXZlcnl0aGluZyBkdWUgdG8KICAgcmVkaXJlY3Rpb24sIGl0IHNlZ2ZhdWx0cyB0cnlpbmcgdG8gYWNjZXNzICpkYXRhLT51c2VycHdkLgoKVmVyc2lvbiA1LjkuMQoKIERhbmllbCAoMzAgSnVseSAxOTk5KQogLSBTdGV2ZSBXYWxjaCBwb2ludGVkIG91dCB0aGF0IHRoZXJlIGlzIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGZvcm1kYXRhCiAgIGZ1bmN0aW9ucy4gSSBhZGRlZCBhIEZvcm1GcmVlKCkgZnVuY3Rpb24gdGhhdCBpcyBub3cgdXNlZCBhbmQgc3VwcG9zZWQgdG8KICAgY29ycmVjdCB0aGlzIGZsYXcuCgogLSBNYXJrIFdvdHRvbiByZXBvcnRlZDoKICAgJ2N1cmwgLUwgaHR0cHM6Ly93d3cuY3dhLmNvbS5hdS8nIGNvcmUgZHVtcHMuICBJIG1hbmFnZWQgdG8gY3VyZSB0aGlzIGJ5CiAgIGNvcnJlY3RpbmcgdGhlIGNsZWFudXAgcHJvY2VkdXJlLiBUaGUgYnVnIHNlZW1zIHRvIGJlIGdvbmUgd2l0aCBteSBPcGVuU1NMCiAgIDAuOS4yYiwgYWx0aG91Z2ggc3RpbGwgb2NjdXJzIHdoZW4gSSBydW4gdGhlIH4xMDAgeWVhcnMgb2xkIFNTTGVheSAwLjguMC4gSQogICBkb24ndCBrbm93IHdoZXRoZXIgaXQgaXMgY3VybCBvciBTU0xlYXkgdGhhdCBpcyB0byBibGFtZSBmb3IgdGhhdC4KCiAtIE1hcmN1cyBLbGVpbjoKICAgUmVwb3J0ZWQgYW4gRlRQIHVwbG9hZCByZXN1bWUgYnVnIHRoYXQgSSByZWFsbHkgY2FuJ3QgcmVwZWF0IG5vciB1bmRlcnN0YW5kLgogICBJIGxlYXZlIGl0IGhlcmUgc28gdGhhdCBpdCB3b24ndCBiZSBmb3Jnb3R0ZW4uCgogRGFuaWVsICgyOSBKdWx5IDE5OTkpCiAtIENvc3R5YSBTaHVseXVwaW4gc3VnZ2VzdGVkIHN1cHBvcnQgZm9yIGxvbmdlciBVUkxzIHdoZW4gZm9sbG93aW5nIExvY2F0aW9uOgogICBhbmQgSSBjb3VsZCBvbmx5IGFncmVlIGFuZCBmaXggaXQhCgogLSBMZWlnaCBQdXJkaWUgZm91bmQgYSBwcm9ibGVtIGluIHRoZSB1cGxvYWQvUE9TVCBkZXBhcnRtZW50LiBJdCB0dXJuZWQgb3V0CiAgIHRoYXQgaHR0cC5jIGFjY2lkZW50YWx5IGNsZWFyZWQgdGhlIHBvaW50ZXIgaW5zdGVhZCBvZiB0aGUgYnl0ZSBjb3VudGVyCiAgIHdoZW4gc3VwcG9zZWQgdG8uCgogLSBDb3N0eWEgU2h1bHl1cGluIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIHBvcnQgbnVtYmVycyBhbmQgTG9jYXRpb246LiBJZgogICB5b3UgaGFkIGEgc2VydmVyIGF0IGEgbm9uLXN0YW5kYXJkIHBvcnQgdGhhdCByZWRpcmVjdGVkIHRvIGFuIFVSTCB1c2luZyBhCiAgIHN0YW5kYXJkIHBvcnQgbnVtYmVyLCBjdXJsIHN0aWxsIHVzZWQgdGhhdCBmaXJzdCBwb3J0IG51bWJlci4KCiAtIFJhbHBoIEJlY2ttYW5uIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aGVuIHVzaW5nIGJvdGggQ09ORl9GT0xMT1dMT0NBVElPTgogICBhbmQgQ09ORl9GQUlMT05FUlJPUiBzaW11bHRhbmVvdXNseS4gU2luY2UgdGhlIENPTkZfRkFJTE9ORVJST1IgZXhpdHMgb24KICAgdGhlIDMwMi1jb2RlIHRoYXQgdGhlIGZvbGxvdyBsb2NhdGlvbiBoZWFkZXIgb3V0cHV0cyBpdCB3aWxsIG5ldmVyIHNob3cgYW55CiAgIGh0bWwgb24gbG9jYXRpb246IHBhZ2VzLiBJIGhhdmUgbm93IG1hZGUgaXQgbG9vayBmb3IgPj00MDAgY29kZXMgaWYKICAgQ09ORl9GT0xMT1dMT0NBVElPTiBpcyBzZXQuCgogLSAnc3RydWN0IHNsaXN0JyBpcyBub3cgcmVuYW1lZCB0byAnc3RydWN0IGN1cmxfc2xpc3QnIChhcyBzdWdnZXN0ZWQgYnkgUmFscGgKICAgQmVja21hbm4pLgoKIC0gSm9zaHVhIFN3aW5rIGFuZCBSaWNrIFdlbHlrb2NoeSB3ZXJlIHRoZSBmaXJzdCB0byBwb2ludCBvdXQgdG8gbWUgdGhhdCB0aGUKICAgbGF0ZXN0IE9wZW5TU0wgcGFja2FnZSBub3cgaGF2ZSBtb3ZlZCB0aGUgc3RhbmRhcmQgaW5jbHVkZSBwYXRoLiBJdCBpcyBub3cKICAgaW4gL3Vzci9sb2NhbC9zc2wvaW5jbHVkZS9vcGVuc3NsIGFuZCBJIGhhdmUgbm93IG1vZGlmaWVkIHRoZSAtLWVuYWJsZS1zc2wKICAgb3B0aW9uIGZvciB0aGUgY29uZmlndXJlIHNjcmlwdCB0byB1c2UgdGhhdCBhcyB0aGUgcHJpbWFyeSBwYXRoLCBhbmQgSQogICBsZWF2ZSB0aGUgZm9ybWVyIHBhdGggdG9vIHRvIHdvcmsgd2l0aCBvbGRlciBwYWNrYWdlcyBvZiBPcGVuU1NMIHRvby4KCiBEYW5pZWwgKDkgSnVuZSAxOTk5KQogLSBJIGZpbmFsbHkgdW5kZXJzdG9vZCB0aGUgSVJJWCBwcm9ibGVtIGFuZCBub3cgaXQgc2VlbSB0byBjb21waWxlIG9uIGl0IQogICBJIGFtIGdvbm5hIHJlbW92ZSB0aG9zZSAjZGVmaW5lIHN0cmNhc2VjbXAoKSB0aGluZ3Mgb25jZSBhbmQgZm9yIGFsbCBub3cuCgogRGFuaWVsICg0IEp1bmUgMTk5OSkKIC0gSSBhZGp1c3RlZCB0aGUgRlRQIHJlcGx5IDIyNyBwYXJzZXIgdG8gbWFrZSB0aGUgUEFTViBjb21tYW5kIHdvcmsgYmV0dGVyCiAgIHdpdGggbW9yZSBmdHAgc2VydmVycy4gQXBwZWFyYW50bHkgdGhlIFJveGVuIENoYWxsYW5nZXIgc2VydmVyIHJlcGxpZWQKICAgc29tZXRoaW5nIGN1cmwgNS45IGNvdWxkIGRlYWwgd2l0aCEgOi0oIFJlcG9ydGVkIGJ5IEFzaGxleSBSZWlkLU1vbnRhbmFybwogICBhbmQgTWFyayBCdXRsZXIgYnJvdWdodCBhIHNvbHV0aW9uIGZvciBpdC4KCiBEYW5pZWwgKDI2IE1heSAxOTk5KQogLSBSZWFycmFuZ2VkLiBSRUFETUUgaXMgbmV3LCB0aGUgb2xkIG9uZSBpcyBub3cgUkVBRE1FLmN1cmwgYW5kIEkgYWRkZWQgYQogICBSRUFETUUubGliY3VybCB3aXRoIHRleHQgSSBnb3QgZnJvbSBSYWxwaCBCZWNrbWFubi4KCiAtIEkgYWxzbyB1cGRhdGVkIHRoZSBJTlNUQUxMIHRleHQuCgogRGFuaWVsICgyNSBNYXkgMTk5OSkKIC0gRGF2aWQgSm9uYXRoYW4gTG93c2t5IGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IGN1cmwgZGlkbid0IHByb3Blcmx5IGRlYWwKICAgd2l0aCBmb3JtIHBvc3Rpbmcgd2hlcmUgdGhlIHZhcmlhYmxlIHNob3VsZG4ndCBoYXZlIGFueSBjb250ZW50LCBhcyBpbiBjdXJsCiAgIC1GICJmb3JtPSIgd3d3LnNpdGUuY29tLiBJdCB3YXMgbm93IGZpeGVkLgoKVmVyc2lvbiA1LjkgKE1heSAyMiAxOTk5KQoKIERhbmllbCAoMjIgTWF5IDE5OTkpCiAtIEkndmUgZ290IGEgYnVnIHJlcG9ydCBmcm9tIEFhcm9uIFNjYXJpc2JyaWNrIGluIHdoaWNoIGhlIHN0YXRlcyBoZSBoYXMgc29tZQogICBwcm9ibGVtcyB3aXRoIC1MIHVuZGVyIEZyZWVCU0QgMy4wLiBJIGhhdmUgcHJldmlvdXNseSBnb3QgYW5vdGhlciBidWcKICAgcmVwb3J0IGZyb20gU3RlZmFuIEdyZXRoZXIgd2hpY2ggcG9pbnRzIGF0IGFuIGVycm9yIHdpdGggc2ltaWxhciBzeW1wdGhvbXMKICAgd2hlbiB1c2luZyB3aW4zMi4gSSBtYWRlIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBuZXcgdXJsIHN0cmluZyBhIGJpdCBmYXN0ZXIKICAgYW5kIGRpZmZlcmVudCwgZG9uJ3Qga25vdyBpZiBpdCBhY3R1YWxseSBpbXByb3ZlcyBhbnl0aGluZyB0aG91Z2guLi4KCiBEYW5pZWwgKDIwIE1heSAxOTk5KQogLSBNYWRlIHRoZSBjb29raWUgcGFyc2VyIGRlYWwgd2l0aCBDUkxGIG5ld2xpbmVzIHRvby4KCiBEYW5pZWwgKDE5IE1heSAxOTk5KQogLSBEb3dubG9hZCgpIGRpZG4ndCBwcm9wZXJseSBkZWFsIHdpdGggZmFpbGluZyByZXR1cm4gY29kZXMgZnJvbSB0aGUgc3JlYWQoKQogICBmdW5jdGlvbi4gQWRhbSBDb3luZSBmb3VuZCB0aGUgcHJvYmxlbSBpbiB0aGUgd2luMzIgdmVyc2lvbiwgYW5kIFRyb3kgRW5nZWwKICAgaGVscGVkIG1lIG91dCBpc29sYXRpbmcgaXQuCgogRGFuaWVsICgxNiBNYXkgMTk5OSkKIC0gUmljaGFyZCBBZGFtcyBwb2ludGVkIG91dCBhIGJ1ZyBJIGludHJvZHVjZWQgaW4gNS44LiAtLWR1bXAtaGVhZGVyIGRvZXNuJ3QKICAgd29yayBhbnltb3JlISA6LS8gSSBmaXhlZCBpdCBub3cuCgogLSBBZnRlciBhIHN1Z2dlc3Rpb24gYnkgSm9zaHVhIFN3aW5rIEkgYWRkZWQgLVMgLyAtLXNob3ctZXJyb3IgdG8gZm9yY2UgY3VybAogICB0byBkaXNwbGF5IHRoZSBlcnJvciBtZXNzYWdlIGluIGNhc2Ugb2YgYW4gZXJyb3IsIGV2ZW4gaWYgLXMvLS1zaWxlbnQgd2FzCiAgIHVzZWQuCgogRGFuaWVsICgxMCBNYXkgMTk5OSkKIC0gSSBtb3ZlZCB0aGUgc3R1ZmYgY29uY2VybmluZyBIVFRQLCBESUNUIGFuZCBURUxORVQgaXQgdGhlaXIgb3duIHNvdXJjZQogICBmaWxlcyBub3cuIEl0IGlzIGEgYmVnaW5uaW5nIG9uIG15IGNsZWFuLXVwIG9mIHRoZSBzb3VyY2VzIHRvIG1ha2UgdGhlbQogICBsYXllciBhbGwgdGhvc2UgcHJvdG9jb2xzIGJldHRlciB0byBlbmFibGUgbW9yZSB0byBiZSBhZGRlZCBlYXNpZXIgaW4gdGhlCiAgIGZ1dHVyZSEKCiAtIExlb24gQnJlZWR0IHNlbnQgbWUgc29tZSBmaWxlcyBJJ3ZlIG5vdCBwdXQgaW50byB0aGUgbWFpbiBjdXJsCiAgIGFyY2hpdmUuIFRoZXkncmUgZm9yIGNyZWF0aW5nIHRoZSBEZWJpYW4gcGFja2FnZSB0aGluZ2llLiBIZSBhbHNvIHNlbnQgbWUgYQogICBkZWJpYW4gcGFja2FnZSB0aGF0IEkndmUgbWFkZSBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGF0IHRoZSB3ZWIgcGFnZQoKIERhbmllbCAoOSBNYXkgMTk5OSkKIC0gTWFkZSBpdCBjb21waWxlIG9uIGN5Z3dpbiB0b28uCgogVHJveSBFbmdlbCAoNyBNYXkgMTk5OSkKIC0gQnJvdWdodCBhIHNlcmllcyBvZiBwYXRjaGVzIHRvIGFsbG93IGN1cmwgdG8gY29tcGlsZSBzbW9vdGhseSBvbiBNU1ZDKysgNgogICBhZ2FpbiEKCiBEYW5pZWwgKDYgTWF5IDE5OTkpCiAtIEkgY2hhbmdlZCB0aGUgI2lmZGVmIEhBVkVfU1RSRlRJTUUgcGxhY2VtZW50IGZvciB0aGUgLXogY29kZSBzbyB0aGF0IGl0CiAgIHdpbGwgYmUgZWFzaWVyIHRvIGRpc2NvdmVyIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIHRoYXQgZnVuY3Rpb24gYW5kIHRodXMKICAgY2FuJ3QgdXNlIC16IHN1Y2Nlc3NmdWxseS4gTWFkZSB0aGUgc3RyZnRpbWUoKSBnZXQgdXNlZCBpZiBXSU4zMiBpcyBkZWZpbmVkCiAgIHRvby4KClZlcnNpb24gNS44CgogRGFuaWVsICg1IE1heSAxOTk5KQogLSBJJ3ZlIGhhZCBpdCB3aXRoIHRoaXMgYXV0b2NvbmYvYXV0b21ha2UgbWVzcy4gSXQgc2VlbXMgdG8gd29yayBhbGxyaWdodAogICBmb3IgbW9zdCBwZW9wbGUgd2hvIGRvbid0IGhhdmUgYXV0b21ha2UgaW5zdGFsbGVkLCBidXQgZm9yIHRob3NlIHdobyBoYXZlCiAgIHRoZXJlIGFyZSBwcm9ibGVtcyBhbGwgb3Zlci4KCiAgIEkndmUgZ290IGxpa2UgZml2ZSBkaWZmZXJlbnQgYnVnIHJlcG9ydHMgb24gdGhpcyBvbmx5IHRoZSBsYXN0CiAgIHdlZWsuLi4gQ2xhdWRpbyBOZXZlcyBhbmQgRmVkZXJpY28gQmlhbmNoaSBhbmQgcm9vdCA8ZHVnZ2VyajAwMSBhdAogICBoYXdhaWkucnIuY29tPiBhcmUgc29tZSBvZiB0aGVtIHJlcG9ydGluZyB0aGlzLgoKICAgQ3VycmVudGx5LCBJIGhhdmUgbm8gcmVhbGx5IGdvb2QgZml4IHNpbmNlIEkgd2FudCB0byB1c2UgYXV0b21ha2UgbXlzZWxmIHRvCiAgIGdlbmVyYXRlIHRoZSBNYWtlZmlsZS5pbiBmaWxlcy4gSSd2ZSBmb3VuZCBvdXQgdGhhdCB0aGUgQFNIRUxMQC1wcm9ibGVtcwogICBjYW4gb2Z0ZW4gYmUgZml4ZWQgYnkgbWFudWFsbHkgaW52b2tpbmcgJ2F1dG9tYWtlJyBpbiB0aGUgYXJjaGl2ZSByb290CiAgIGJlZm9yZSB5b3UgcnVuIC4vY29uZmlndXJlLi4uIEkndmUgaGFja2VkIG15IG1ha2V0Z3ogc2NyaXB0IG5vdyB0byBmaWRkbGUKICAgYSBiaXQgd2l0aCB0aGlzIGFuZCBteSB0ZXN0cyBzZWVtIHRvIHdvcmsgYmV0dGVyIHRoYW4gYmVmb3JlIGF0IGxlYXN0IQoKIERhbmllbCAoNCBNYXkgMTk5OSkKIC0gbWtoZWxwLnBsIGhhcyBiZWVuIGRvaW5nIGJhZGx5IGxhdGVseS4gSSBjb3JyZWN0ZWQgYSBjYXNlIHByb2JsZW0gaW4KICAgdGhlIHJlZ2V4ZXMuCgogLSBJJ3ZlIG5vdyByZW1hZGUgdGhlIC1vIG9wdGlvbiB0byBub3QgdG91Y2ggdGhlIGZpbGUgdW5sZXNzIGl0IG5lZWRzIHRvLgogICBJIGhhZCB0byBkbyB0aGlzIHRvIG1ha2UgLXogb3B0aW9uIHJlYWxseSBmaW5lLCBzaW5jZSBub3cgeW91IGNhbiBtYWtlIGEKICAgY3VybCBmZXRjaCBhbmQgdXNlIGEgbG9jYWwgY29weSdzIHRpbWUgd2hlbiBkb3dubG9hZGluZyB0byB0aGF0IGZpbGUsIGFzCiAgIGluOgoKICAgICAgICBjdXJsIC16IGR1bXAgLW8gZHVtcCByZW1vdGUuc2l0ZS5jb20vZmlsZS5odG1sCgogICBUaGlzIHdpbGwgb25seSBnZXQgdGhlIGZpbGUgaWYgdGhlIHJlbW90ZSBvbmUgaXMgbmV3ZXIgdGhhbiB0aGUgbG9jYWwuCiAgIEknbSBhd2FyZSB0aGF0IHRoaXMgYWx0ZXJzIHByZXZpb3VzIGJlaGF2aW91ciBhIGxpdHRsZS4gU29tZSBzY3JpcHRzIG91dAogICB0aGVyZSBtYXkgZGVwZW5kIG9uIHRoYXQgdGhlIGZpbGUgaXMgYWx3YXlzIHRvdWNoZWQuLi4KCiAtIENvcnJlY3RlZCBhIGJ1ZyBpbiB0aGUgU1NMdjIvdjMgc2VsZWN0aW9uLgoKIC0gRmVsaXggdm9uIExlaXRuZXIgcmVxdWVzdGVkIHRoYXQgY3VybCBzaG91bGQgYmUgYWJsZSB0byBzZW5kCiAgICJJZi1Nb2RpZmllZC1TaW5jZSIgaGVhZGVycywgd2hpY2ggaW5kZWVkIGlzIGEgZmFpciBpZGVhLiAgSSBpbXBsZW1lbnRlZCBpdAogICByaWdodCBhd2F5ISBUcnkgLXogPGV4cHJlc3Npb24+IHdoZXJlIGV4cHJlc3Npb24gaXMgYSBmdWxsIEdOVSBkYXRlCiAgIGV4cHJlc3Npb24gb3IgYSBmaWxlIG5hbWUgdG8gZ2V0IHRoZSBkYXRlIGZyb20hCgogU3RlcGhhbiBMYWdlcmhvbG0gKDMwIEFwciAxOTk5KQogLSBQb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCB0aGUgc3JjL01ha2VmaWxlIGZvciBGcmVlQlNELiBUaGUgUk0gdmFyaWFibGUKICAgaXNuJ3Qgc2V0IGFuZCBjYXVzZXMgdGhlIG1ha2UgdG8gZmFpbC4KCiBEYW5pZWwgKDI2IEFwcmlsIDE5OTkpCiAtIEFtIEkgc2lsbHkgb3Igd2hhdD8gSXJ2aW5nIFdvbGZlIHBvaW50ZWQgb3V0IHRvIG1lIHRoYXQgdGhlIGN1cmwgdmVyc2lvbgogICBudW1iZXIgd2FzIG5vdCBzZXQgcHJvcGVybHkuIEhhc24ndCBiZWVuIHNpbmNlIDUuNi4gVGhpcyB3YXMgZHVlIHRvIGEgYnVnCiAgIGluIG15IG1ha2V0Z3ogc2NyaXB0IQoKIERhdmlkIEVyaWtzc29uICgyNSBBcHIgMTk5OSkKIC0gRm91bmQgYSBidWcgaW4gY29va2llcy5jIHRoYXQgbWFkZSBpdCBjcmFzaCBhdCB0aW1lcy4KClZlcnNpb24gNS43LjEKCiBEb3VnIEthdWZtYW4gKDIzIEFwciAxOTk5KQogLSBCcm91Z2h0IHR3byBzdW5vcyA0IGZpeGVzLiBPbmUgb2YgdGhlbSBiZWluZyB0aGUgaG9zdGlwLmMgZml4IG1lbnRpb25lZAogICBiZWxvdyBhbmQgdGhlIG90aGVyIG9uZSBhIGNvcnJlY3Rpb24gaW4gaW5jbHVkZS9zdGRjaGVhZGVycy5oCgogLSBBZGRlZCBhIHBhcmFncmFwaCBhYm91dCBjb21waWxpbmcgd2l0aCB0aGUgVVMtdmVyc2lvbiBvZiBvcGVuc3NsIHRvIHRoZQogICBJTlNUQUxMIGZpbGUuCgogRGFuaWVsCiAtIE5ldyBtYWlsaW5nIGxpc3QgYWRkcmVzcy4gSW5mbyB1cGRhdGVkIG9uIHRoZSB3ZWIgcGFnZSBhcyB3ZWxsIGFzIGluIHRoZQogICBSRUFETUUgZmlsZQoKIEdyZWcgT251ZmVyICgyMCBBcHIgMTk5OSkKIC0gaG9zdGlwLmMgZGlkbid0IGNvbXBpbGUgcHJvcGVybHkgb24gU3VuT1MgNS41LjEuCiAgIEl0IG5lZWRzIGFuICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KClZlcnNpb24gNS43CgogRGFuaWVsIChBcHIgMjAgMTk5OSkKIC0gRGVjaWRlZCB0byB1cGxvYWQgYSBub24tYmV0YSB2ZXJzaW9uIHJpZ2h0IG5vdyEKCiAtIE1hZGUgY3VybCBzdXBwb3J0IGFueS1sZW5ndGggSFRUUCBoZWFkZXJzLiBUaGUgZGVzdGluYXRpb24gYnVmZmVyIGlzIG5vdwogICBzaW1wbHkgZW5sYXJnZWQgZXZlcnkgdGltZSBpdCB0dXJucyBvdXQgdG8gYmUgdG9vIHNtYWxsIQoKIC0gQWRkZWQgdGhlIEZBUSBmaWxlIHRvIHRoZSBhcmNoaXZlLiBTdGlsbCBhIGJpdCBzbWFsbGlzaCwgYnV0IGl0IGlzIGEKICAgc3RhcnQuCgogRXJpYyBUaGVsaW4gKDE1IEFwciAxOTk5KQogLSBNYWRlIC1EIGFjY2VwdCAnLScgaW5zdGVhZCBvZiBmaWxlbmFtZSB0byB3cml0ZSB0byBzdGRvdXQuCgpWZXJzaW9uIDUuNi4zYmV0YQoKIERhbmllbCAoQXByIDEyIDE5OTkpCgogLSBDaGFuZ2VkIHR3byAjaWZkZWYgV0lOMzIgdG8gYmV0dGVyICNpZmRlZiA8ZXJyb3Jjb2RlPiB3aGVuIGNvbm5lY3QoKWluZwogICBpbiB1cmwuYyBhbmQgZnRwLmMuIE1ha2VzIGN5Z3dpbjMyIGRlYWwgd2l0aCB0aGVtIGJldHRlciB0b28uIFdlIHNob3VsZAogICB0cnkgdG8gZ2V0IHNvbWUgZGVjZW50IHdpbjMyLXJlcGxhY2VtZW50IHRoZXJlLiBBbnlvbmU/CgogLSBUaGUgb2xkIC0zLy0tY3JsZiBvcHRpb24gaXMgbm93IE9OTFkgLS1jcmxmIQoKIC0gSSBjaGFuZ2VkIHRoZSAiU1NMIGZpeCIgdG8gYSBtb3JlIGxhbWUgb25lLCBidXQgdGhhdCBkb2Vzbid0IHJlbW92ZSBhcwogICBtdWNoIGZ1bmN0aW9uYWxpdHkuIE5vdyBJJ3ZlIGVuYWJsZWQgdGhlIGxpYiB0byBzZWxlY3Qgd2hhdCBTU0wgdmVyc2lvbiBpdAogICBzaG91bGQgdHJ5IGZpcnN0LiBBcHBlYXJhbnRseSBzb21lIG9sZGVyIFNTTC1zZXJ2ZXJzIGRvbid0IGxpa2Ugd2hlbiB5b3UKICAgdGFsayB2MyB3aXRoIHRoZW0gc28geW91IG5lZWQgdG8gYmUgYWJsZSB0byBmb3JjZSBjdXJsIHRvIHRhbGsgdjIgZnJvbSB0aGUKICAgc3RhcnQuIFRoZSBmaXggZGF0ZWQgQXByaWwgNiBhbmQgcG9zdGVkIG9uIHRoZSBtYWlsaW5nIGxpc3QgZm9yY2VkIGN1cmwgdG8KICAgdXNlIHYyIGF0IGFsbCB0aW1lcyB1c2luZyBhIG1vZGVybiBPcGVuU1NMIHZlcnNpb24sIGJ1dCB3ZSBkb24ndCByZWFsbHkKICAgd2FudCBzdWNoIGEgY3JpcHBsZWQgc29sdXRpb24uCgogLSBNYXJjIEJvdWNoZXIgc2VudCBtZSBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIGEgbWF0aCBlcnJvciBmb3IgdGhlCiAgICJDdXJyLlNwZWVkIiBwcm9ncmVzcyBtZXRlci4KCiAtIEVyaWMgVGhlbGluIHNlbnQgbWUgYSBwYXRjaCB0aGF0IGVuYWJsZXMgJy1LIC0nIHRvIHJlYWQgYSBjb25maWcgZmlsZSBmcm9tCiAgIHN0ZGluLgoKIC0gSSBmb3VuZCBvdXQgd2UgZGlkbid0IGNsb3NlIHRoZSBmaWxlIHByb3Blcmx5IGJlZm9yZSBzbyBJIGFkZGVkIGl0IQoKIERhbmllbCAoQXByIDkgMTk5OSkKIC0gWXUgWGluIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIGZ0cCBkb3dubG9hZCByZXN1bWUuICBJdCBkaWRuJ3Qgd29yayBhdAogICBhbGwhIDstTwoKIERhbmllbCAoQXByIDYgMTk5OSkKIC0gQ29ycmVjdGVkIHRoZSB2ZXJzaW9uIHN0cmluZyBwYXJ0IGdlbmVyYXRlZCBmb3IgdGhlIFNTTCB2ZXJzaW9uLgoKIC0gSSBmb3VuZCBhIHdheSB0byBtYWtlIHNvbWUgb3RoZXIgU1NMIHBhZ2Ugd29yayB3aXRoIG9wZW5zc2wgMC45LjErIHRoYXQKICAgcHJldmlvdXNseSBkaWRuJ3QgKHNzbGVheSAwLjguMCB3b3JrcyB3aXRoIGl0IHRob3VnaCEpLiBUcnlpbmcgdG8gZ2V0CiAgIHNvbWUgcmVhbCBpbmZvIGZyb20gdGhlIE9wZW5TU0wgZ3V5cyB0byBzZWUgaG93IEkgc2hvdWxkIGRvIHRvIGJlaGF2ZSB0aGUKICAgYmVzdCB3YXkuIFNTTGVheSAwLjguMCBzaG91bGRuJ3QgYmUgdGhhdCBtdWNoIGluIHVzZSBhbnl3YXkgdGhlc2UgZGF5cyEKClZlcnNpb24gNS42LjJiZXRhCgogRGFuaWVsIChBcHIgNCAxOTk5KQogLSBGaW5hbGx5IGhhdmUgY3VybCBtb3JlIGNvb2tpZSAiYXdhcmUiLiBOb3cgcmVhZCBjYXJlZnVsbHkuIFRoaXMgaXMgaG93CiAgIGl0IHdvcmtzLgogICBUbyBtYWtlIGN1cmwgcmVhZCBjb29raWVzIGZyb20gYW4gYWxyZWFkeSBleGlzdGluZyBmaWxlLCBpbiBwbGFpbiBoZWFkZXItCiAgIGZvcm1hdCAobGlrZSBmcm9tIHRoZSBoZWFkZXJzIG9mIGEgcHJldmlvdXMgZmV0Y2gpIGludm9rZSBjdXJsIHdpdGggdGhlCiAgIC1iIGZsYWcgbGlrZToKCiAgICAgICAgY3VybCAtYiBmaWxlIGh0dHA6Ly9zaXRlL2Zvby5odG1sCgogICBDdXJsIHdpbGwgdGhlbiB1c2UgYWxsIGNvb2tpZXMgaXQgZmluZHMgbWF0Y2hpbmcuIFRoZSBvbGQgc3R5bGUgdGhhdCBzZXRzCiAgIGEgc2luZ2xlIGNvb2tpZSB3aXRoIC1iIGlzIHN0aWxsIHN1cHBvcnRlZCBhbmQgaXMgdXNlZCBpZiB0aGUgc3RyaW5nCiAgIGZvbGxvd2luZyAtYiBpbmNsdWRlcyBhICc9JyBsZXR0ZXIsIGFzIGluICItYiBuYW1lPWRhbmllbCIuCgogICBUbyBtYWtlIGN1cmwgcmVhZCB0aGUgY29va2llcyBzZW50IGluIGNvbWJpbmF0aW9uIHdpdGggYSBsb2NhdGlvbjogKHdoaWNoCiAgIHNpdGVzIG9mdGVuIGRvKSBwb2ludCBjdXJsIHRvIHJlYWQgYSBub24tZXhpc3RpbmcgZmlsZSBhdCBmaXJzdCAoaS5lCiAgIHRvIHN0YXJ0IHdpdGggbm8gZXhpc3RpbmcgY29va2llcyksIGxpa2U6CgogICAgICAgIGN1cmwgLWIgbm93aGVyZSBodHRwOi8vc2l0ZS9zZXRjb29raWVhbmRyZWxvY2F0ZS5odG1sCgogLSBBZGRlZCBhIHBhcmFncmFwaCBpbiB0aGUgVE9ETyBmaWxlIGFib3V0IHRoZSBTU0wgcHJvYmxlbXMgcmVjZW50bHkKICAgcmVwb3J0ZWQuIEV2aWRlbnRseSwgc29tZSBraW5kIG9mIFNTTC1wcm9ibGVtIGN1cmwgbWF5IG5lZWQgdG8gYWRkcmVzcy4KCiAtIEJldHRlciAiTG9jYXRpb246IiBmb2xsb3dpbmcuCgogRG91Z2xhcyBFLiBXZWdzY2hlaWQgKFR1ZSwgMzAgTWFyIDE5OTkpCiAtIEEgc3Vic2Vjb25kIGRpc3BsYXkgcGF0Y2guCgogRGFuaWVsIChNYXIgMTQgMTk5OSkKIC0gSSd2ZSBzZXBhcmF0ZWQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGxpYmN1cmwgYW5kIGN1cmwgbm93LiBUbyBtYWtlCiAgIHRoaW5ncyBhIGxpdHRsZSBlYXNpZXIsIEkgZGVjaWRlZCB0byBzdGFydCB0aGUgY3VybCBudW1iZXJpbmcgZnJvbQogICA1LjYgYW5kIHRoZSBmb3JtZXIgdmVyc2lvbiBudW1iZXIga25vd24gYXMgImN1cmwiIGlzIG5vdyB0aGUgb25lCiAgIHNldCBmb3IgbGliY3VybC4KCiAtIFJlbW92ZWQgdGhlICdlbmFibGUtbm8tcGFzcycgZnJvbSBjb25maWd1cmUsIEkgZG91YnQgYW55b25lIHdhbnRlZAogICB0aGF0LgoKIC0gTWFkZSBsb3RzIG9mIHRpbnkgYWRqdXN0bWVudHMgdG8gY29tcGlsZSBzbW9vdGhseSB3aXRoIGN5Z3dpbiB1bmRlcgogICB3aW4zMi4gSXQncyBhIGtpbGxlciBmb3IgcG9ydGluZyB0aGlzIHRvIHdpbjMyLCBieWUgYnllIFZDKyshIDstKQogICBDb21waWxlcyBhbmQgYnVpbGRzIG91dC1vZi10aGUtYm94IG5vdy4gU2VlIHRoZSBuZXcgd29yZGluZ3MgaW4KICAgSU5TVEFMTCBmb3IgZGV0YWlscy4KCiAtIEJlZ2lubmluZyBleHBlcmltZW50cyB3aXRoIGRvd25sb2FkaW5nIG11bHRpcGxlIGRvY3VtZW50IGZyb20gYSBodHRwCiAgIHNlcnZlciB3aGlsZSByZW1haW5pbmcgY29ubmVjdGVkLgoKVmVyc2lvbiA1LjZiZXRhCgogRGFuaWVsIChNYXIgMTMgMTk5OSkKIC0gU2luY2UgSSd2ZSBjaGFuZ2VkIHNvIG11Y2gsIEkgdGhvdWdodCBJJ2QganVzdCBnbyBhaGVhZCBhbmQgaW1wbGVtZW50IHRoZQogICBzdWdnZXN0aW9uIGZyb20gRG91Z2xhcyBFLiBXZWdzY2hlaWQuIC1EIG9yIC0tZHVtcC1oZWFkZXIgaXMgbm93IHN0b3JpbmcKICAgSFRUUCBoZWFkZXJzIHNlcGFyYXRlbHkgaW4gdGhlIHNwZWNpZmllZCBmaWxlLgoKIC0gQWRkZWQgbmV3IHRleHQgdG8gSU5TVEFMTCBvbiB3aGF0IHRvIGRvIHRvIGJ1aWxkIHRoaXMgb24gd2luMzIgbm93LgoKIC0gQWFhcmdoLiBJIGhhZCB0byB0YWtlIGEgc3RlcCBiYWNrIGFuZCBwcmVmaXggdGhlIHNoYXJlZCAjaW5jbHVkZSBmaWxlcwogICBpbiB0aGUgc291cmNlcyB3aXRoICIuLi9pbmNsdWRlLyIgdG8gcGxlYXNlIFZDKysuLi4KCiBEYW5pZWwgKE1hciAxMiAxOTk5KQogLSBTcGxpdCB0aGUgdXJsLmMgc291cmNlIGludG8gbWFueSB0aW55IHNvdXJjZXMgZm9yIGJldHRlciByZWFkYWJpbGl0eQogICBhbmQgc21hbGxlciBzaXplLgoKIERhbmllbCAoTWFyIDExIDE5OTkpCiAtIFN0YXJ0ZWQgdG8gY2hhbmdlIHN0dWZmIGZvciBhIG1vdmUgdG8gbWFrZSBsaWJjdXJsIGFuZCBhIG1vcmUgc2VwYXJhdGUKICAgY3VybCBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgdGhlIGxpYmN1cmwuIE1hZGUgdGhlIGxpYmN1cmwgc291cmNlcyBpbnRvCiAgIHRoZSBuZXcgbGliIGRpcmVjdG9yeSB3aGlsZSB0aGUgY3VybCBhcHBsaWNhdGlvbiB3aWxsIHJlbWFpbiBpbiBzcmMgYXMKICAgYmVmb3JlLiBOZXcgbWFrZWZpbGVzLCBhZGp1c3RlZCBjb25maWd1cmUgc2NyaXB0IGFuZCBzby4KCiAgIGxpYmN1cmwuYSBidWlsdCBxdWlja2x5IGFuZCBlYXNpbHkuIEkgYmV0dGVyIG1ha2UgYSBiZXR0ZXIgaW50ZXJmYWNlIHRvCiAgIHRoZSBsaWIgZnVuY3Rpb25zIHRob3VnaC4KCiAgIFRoZSBuZXcgcm9vdCBkaXIgaW5jbHVkZS8gaXMgc3VwcG9zZWQgdG8gY29udGFpbiB0aGUgcHVibGljIGluZm9ybWF0aW9uCiAgIGFib3V0IHRoZSBuZXcgbGliY3VybC4gSXQgaXMgYSBsaXR0bGUgdWdseSBzbyBmYXIgOi0pCgoKIERhbmllbCAoTWFyIDEgMTk5OSkKIC0gVG9kZCBLYXVmbWFubiBzZW50IG1lIGEgZ29vZCBsaW5rIHRvIE5ldHNjYXBlJ3MgY29va2llIHNwZWMgYXMgd2VsbCBhcyB0aGUKICAgaW5mbyB0aGF0IFJGQyAyMTA5IHNwZWNpZmllcyBob3cgdG8gdXNlIHRoZW0uICBUaGUgbGluayBpcyBub3cgaW4gdGhlCiAgIFJFQURNRSBhbmQgdGhlIFJGQyBpbiB0aGUgUkVTT1VSQ0VTLgoKIERhbmllbCAoRmViIDIzIDE5OTkpCiAtIEZpbmFsbHkgbWFkZSBjb25maWd1cmUgYWNjZXB0IC0td2l0aC1zc2wgdG8gbG9vayBmb3IgU1NMIGxpYnMgYW5kIGluY2x1ZGVzCiAgIGluIHRoZSAic3RhbmRhcmQiIHBsYWNlIC91c3IvbG9jYWwvc3NsLi4uCgogRGFuaWVsIChGZWIgMjIgMTk5OSkKIC0gVmVyaWZpZWQgdGhhdCBjdXJsIGxpbmtlZCBmaW5lIHdpdGggT3BlblNTTCAwLjkuMWMgd2hpY2ggc2VlbXMgdG8gYmUKICAgdGhlIG1vc3QgcmVjZW50LgoKIEhlbnJpIEdvbWV6IChGcmkgRmViICA1IDE5OTkpCiAtIFNlbnQgaW4gYW4gdXBkYXRlZCBjdXJsLXNzbC5zcGVjLiBJIHN0aWxsIG1pc3MgdGhlIHNjcmlwdCB0aGF0IGJ1aWxkcyBhbgogICBSUE0gYXV0b21hdGljYWxseS4uLgoKVmVyc2lvbiA1LjUuMQoKIE1hcmsgQnV0bGVyICgyNyBKYW4gMTk5OSkKIC0gQ29ycmVjdGVkIHByb2JsZW1zIGluIERvd25sb2FkKCkuCgogRGFuaXRlbCBTdGVuYmVyZyAoMjUgSmFuIDE5OTkpCiAtIEplcmVtaWUgUGV0aXQgcG9pbnRlZCBvdXQgYSBmZXcgZmxhd3MgaW4gdGhlIHNvdXJjZSB0aGF0IHByZXZlbnRlZCBpdCBmcm9tCiAgIGNvbXBpbGUgd2FybmluZyBmcmVlIHdpdGggdGhlIG5hdGl2ZSBjb21waWxlciB1bmRlciBEaWdpdGFsIFVuaXggdjQuMGQuCgpWZXJzaW9uIDUuNQoKIERhbmllbCBTdGVuYmVyZyAoMTUgSmFuIDE5OTkpCiAtIEFkZGVkIEJqb3JucyBzbWFsbCB0ZXh0IHRvIHRoZSBSRUFETUUgYWJvdXQgdGhlIERJQ1QgcHJvdG9jb2wuCgogRGFuaWVsIFN0ZW5iZXJnICgxMSBKYW4gMTk5OSkKIC0gPGpzd2luayBhdCBzb2Z0Y29tLm5ldD4gcmVwb3J0ZWQgYWJvdXQgdGhlIHdpbjMyLXZlcnNpb2luOiAiRG9lc24ndCB1c2UKICAgQUxMX1BST1hZIGVudmlyb25tZW50IHZhcmlhYmxlIi4gVHVybmVkIG91dCB0byBiZSBiZWNhdXNlIG9mIHRoZSBzdGF0aWMtCiAgIGJ1ZmZlciBuYXR1cmUgb2YgdGhlIHdpbjMyIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbGxzIQoKIEJqb3JuIFJlZXNlICgxMCBKYW4gMTk5OSkKIC0gSSBoYXZlIGF0dGFjaGVkIGEgc2ltcGxlIGFkZGl0aW9uIGZvciB0aGUgRElDVCBwcm90b2NvbCAoUkZDIDIyMjkpLgogICBJdCBwZXJmb3JtcyBkaWN0aW9uYXJ5IGxvb2t1cHMuIFRoZSBvdXRwdXQgc3RpbGwgbmVlZHMgdG8gYmUgYmV0dGVyCiAgIGZvcm1hdHRlZC4KCiAgIFRvIHRlc3QgaXQgdHJ5ICh0aGUgZXhhY3QgZm9ybWF0LCBhbmQgbW9yZSBleGFtcGxlcyBhcmUgZGVzY3JpYmVkIGluCiAgIHRoZSBSRkMpCgogICAgICAgIGRpY3Q6Ly9kaWN0Lm9yZy9tOmhlbGxvCiAgICAgICAgZGljdDovL2RpY3Qub3JnL206aGVsbG86OnNvdW5kZXgKCgogVmljZW50ZSBHYXJjaWEgKDEwIEphbiAxOTk5KQogLSBDb3JyZWN0ZWQgdGhlIHByb2dyZXNzIG1ldGVyIGZvciBmaWxlcyBsYXJnZXIgdGhhbiAyME1CLgoKIERhbmllbCBTdGVuYmVyZyAoNyBKYW4gMTk5OSkKIC0gQ29ycmVjdGVkIHRoZSAtdCBhbmQgLVQgaGVscCB0ZXh0cy4gVGhleSBjbGFpbWVkIHRvIGJlIEZUUCBvbmx5LgoKVmVyc2lvbiA1LjQKCiBEYW5pZWwgU3RlbmJlcmcKICg3IEphbiAxOTk5KQogLSBJcnZpbmcgV29sZmUgcmVwb3J0ZWQgdGhhdCBjdXJsIC1zIGRpZG4ndCBhbHdheXMgc3VwcmVzcyB0aGUgcHJvZ3Jlc3MKICAgcmVwb3J0aW5nLiBJdCB3YXMgdGhlIGZvcm0gcG9zdCB0aGF0IGF1dG9hbXRpY2FsbHkgYWx3YXlzIHN3aXRjaGVkIGl0IG9uCiAgIGFnYWluLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQhCgogKDQgSmFuIDE5OTkpCiAtIEFuZHJlYXMgS29zdHlya2Egc3VnZ2VzdGVkIEknZCBhZGQgUFVUIGFuZCBoZSBoZWxwZWQgbWUgb3V0IHRvIHRlc3QgaXQuIElmCiAgIHlvdSB1c2UgLXQgb3IgLVQgbm93IG9uIGEgaHR0cCBvciBodHRwcyBzZXJ2ZXIsIFBVVCB3aWxsIGJlIHVzZWQgZm9yIGZpbGUKICAgdXBsb2FkLgoKICAgSSByZW1vdmVkIHRoZSBmb3JtZXIgdXNlIG9mIC1UIHdpdGggSFRUUC4gSSBkb3VidCBhbnlvbmUgZXZlciByZWFsbHkgdXNlZAogICB0aGF0LgoKICg0IEphbiAxOTk5KQogLSBFcmlrIEphY29ic2VuIGZvdW5kIGEgd2lkdGggYnVnIGluIHRoZSBtcHJpbnRmKCkgZnVuY3Rpb24uICBJIGNvcnJlY3RlZCBpdAogICBub3cuCgogKDQgSmFuIDE5OTkpCiAtIEFzIEpvaG4gVi4gQ2hvdyBwb2ludGVkIG91dCB0byBtZSwgY3VybCBhY2NlcHRlZCB2ZXJ5IGxpbWl0ZWQgVVJMIHNpemVzLiBJdAogICBzaG91bGQgbm93IGFjY2VwdCBwYXRoIHBhcnRzIHRoYXQgYXJlIHVwIHRvIGF0IGxlYXN0IDQwOTYgYnl0ZXMuCgogLSBTb21laG93IEkgc2NyZXdlZCB1cCB3aGVuIGFwcGx5aW5nIHRoZSBBSVggZml4IGZyb20gR2lsYmVydCBSYW1pcmV6LCBzbwogICBJIHJlZGlkIHRoYXQgbm93LgoKVmVyc2lvbiA1LjNhICh3aW4zMiBvbmx5KQoKIFRyb3kgRW5nZWwKIC0gQ29ycmVjdGVkIGEgd2luMzIgYnVnIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBwYXJ0LgoKVmVyc2lvbiA1LjMKCiBHaWxiZXJ0IFJhbWlyZXogSnIuICgyMSBEZWMgMTk5OCkKIC0gSSBoYXZlIGltcGxlbWVudGVkIHRoZSAicXVvdGUiIGZ1bmN0aW9uIG9mIEZUUCBjbGllbnRzLiBJdCBhbGxvd3MgeW91IHRvCiAgIHNlbmQgYXJiaXRyYXJ5IGNvbW1hbmRzIHRvIHRoZSByZW1vdGUgRlRQIHNlcnZlci4gSSBjaG9zZSB0aGUgLVEvLS1xdW90ZQogICBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgoKICAgWW91IGNhbiBoYXZlIG1vcmUgdGhhbiBvbmUgcXVvdGVkIHN0cmluZywgYW5kIGN1cmwgd2lsbCBhcHBseSB0aGVtIGluCiAgIG9yZGVyLiAgVGhpcyBpcyB3aGF0IEkgdXNlIGZvciBteSBNVlMgdXBsb2FkOgoKICBjdXJsIC1CIC0tY3JsZiAtUSAic2l0ZSBscmVjbD04MCIgLVEgInNpdGUgYmxrPTgwMDAiIC1UIGZpbGUgZnRwOi8vb3MzOTAvdGVzdAoKICAgQ3VybCB3aWxsIHNlbmQgdGhlIHR3byBxdW90ZWQgInNpdGUiIGNvbW1hbmRzIGluIHRoZSBwcm9wZXIgb3JkZXIuCgogLSBNYWRlIGl0IGNvbXBpbGUgc21vb3RobHkgb24gQUlYLgoKIEdpbGJlcnQgUmFtaXJleiBKci4gKDE4IERlYyAxOTk4KQogLSBCcm91Z2h0IGFuIE1WUyBwYXRjaDogLTMvLS1tdnMsIGZvciBmdHAgdXBsb2FkIHRvIHRoZSBNVlMgZnRwIHNlcnZlci4KCiBUcm95IEVuZ2VsICgxNyBEZWMgMTk5OCkKIC0gQnJvdWdodCBhIGNvcnJlY3Rpb24gdGhhdCBmaXhlcyB0aGUgd2luMzIgY3VybCBidWcuCgogRGFuaWVsIFN0ZW5iZXJnCiAtIEEgYnVnLCBwb2ludGVkIG91dCB0byBtZSBieSBEciBILiBULiBMZXVuZywgY2F1c2VkIGN1cmwgdG8gY3Jhc2ggb24gdGhlIC1BCiAgIGZsYWcgb24gY2VydGFpbiBzeXN0ZW1zLiBBY3R1YWxseSwgYWxsIHN5c3RlbXMgc2hvdWxkJ3ZlIQoKIC0gQWRkZWQgYSBmZXcgZGVmaW5lcyB0byBtYWtlIGRpcmVjdG9yaWVzL2ZpbGUgbmFtZXMgZ2V0IGJ1aWxkIG5pY2VyICh3aXRoIF8KICAgaW5zdGVhZCBvZiAuIGFuZCBcIGluc3RlYWQgb2YgLyBpbiB3aW4zMikuCgogLSBzdGV2ZSA8ZmlzayBhdCBwb2xhci5ib3dkb2luLmVkdT4gcmVwb3J0ZWQgYSB3ZWlyZCBidWcgdGhhdCBvY2N1cmVkIGlmIHRoZQogICBmdHAgc2VydmVyIHJlc3BvbnNlIGxpbmUgaGFkIGEgcGFyZW50aGVzaXMgb24gdGhlIGxpbmUgYmVmb3JlIHRoZSAoc2l6ZSkKICAgaW5mby4gSSBob3BlIGl0IHdvcmtzIGJldHRlciBub3chCgpWZXJzaW9uIDUuMi4xCgogU3RldmVuIEcuIEpvaG5zb24gKERlYyAxNCwgMTk5OCkKIC0gQnJvdWdodCBhIGZpeCB0aGF0IGNvcnJlY3RlZCBhIGNyYXNoIGluIDUuMiBkdWUgdG8gYmFkIHRyZWF0bWVudCBvZiB0aGUKICAgZW52aXJvbm1lbnQgdmFyaWFibGVzLgoKVmVyc2lvbiA1LjIKCiBEYW5pZWwgU3RlbmJlcmcgKERlYyAxNCwgMTk5OCkKIC0gUmV3cm90ZSB0aGUgbWtoZWxwIHNjcmlwdCBhbmQgbm93LCB0aGUgbWtoZWxwLnBsIHNjcmlwdCBnZW5lcmF0ZXMgdGhlCiAgIGh1Z2VoZWxwLmMgZmlsZSBmcm9tIHRoZSBSRUFETUUgKmFuZCogdGhlIG1hbiBwYWdlIGZpbGUgY3VybC4xLiBCeSB1c2luZwogICBib3RoIGZpbGVzLCBJIG5vIGxvbmdlciBuZWVkIHRvIGhhdmUgZG91YmxlIGluZm9ybWF0aW9uIGluIGJvdGggdGhlIG1hbgogICBwYWdlIGFuZCB0aGUgUkVBRE1FIGFzIHdlbGwuIFNvLCB3aW4zMi11c2VycyB3aWxsIG9ubHkgaGF2ZSB0aGUgaHVnZWhlbHAuYwogICBmaWxlIGZvciBhbGwgaW5mbywgYnV0IHRoZW4sIHRoZXkgZG93bmxvYWQgdGhlIHBsYWluIGJpbmFyeSBtb3N0IHRpbWVzCiAgIGFueXdheS4KCiAtIGdjYzIuOC4xIHdpdGggdGhlIC1XYWxsIGZsYWcgY29tcGxhaW50cyBhIGxvdCBvbiBzdWJzY3JpcHQgaGFzIHR5cGUgYGNoYXInCiAgIGlmIEkgZG9uJ3QgZXhwbGljaXRseSB0eXBlY2FzdCB0aGUgYXJndW1lbnQgdG8gaXNkaWdpdCgpIG9yIGlzc3BhY2UoKSB0bwogICBpbnQuIFNvIEkgZGlkIHRvIGNvbXBpbGUgd2FybmluZyBmcmVlIHdpdGggdGhhdCB0b28uCgogLSBBZGRlZCBjaGVja3MgZm9yICdsb25nIGRvdWJsZScgYW5kICdsb25nIGxvbmcnIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LiBJCiAgIG5lZWQgdGhvc2UgZm9yIHRoZSBtcHJpbnRmLmMgc291cmNlIHRvIGNvbXBpbGUgd2VsbCBvbiBub24gbG9uZyBsb25nCiAgIGNvbWZvcm1pbmcgc3lzdGVtcyEKClZlcnNpb24gNS4xIChub3QgcHVibGljbHkgcmVsZWFzZWQpCgogRGFuaWVsIFN0ZW5iZXJnIChEZWMgMTAsIDE5OTgpCiAtIEkgZ290IGEgcmVxdWVzdCBmb3IgYSBwcmUtY29tcGlsZWQgTlQgQWxwaGEgdmVyc2lvbi4gQW55b25lPwoKIC0gQWRkZWQgTHlueC9DRVJOIHd3dyBsaWIgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGUgc3VwcG9ydC4gVGhhdCBtZWFucyBjdXJsCiAgIG5vdyByZWFkcyBhbmQgdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CgoJSFRUUF9QUk9YWSwgSFRUUFNfUFJPWFksIEZUUF9QUk9YWSwgR09QSEVSX1BST1hZCgogICBUaGV5IHNob3VsZCBiZSBzZXQgZm9yIHByb3RvY29sLXNwZWNpZmljIHByb3hpZXMuIEdlbmVyYWwgcHJveHkgc2hvdWxkIGJlCiAgIHNldCB3aXRoCgoJQUxMX1BST1hZCgogICBBbmQgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBob3N0IG5hbWVzIHRoYXQgc2hvdWxkbid0IGdvIHRocm91Z2ggYW55CiAgIHByb3h5IGlzIHNldCBpbiAob25seSBhbiBhc3RlcmlzaywgJyonIG1hdGNoZXMgYWxsIGhvc3RzKS4KCglOT19QUk9YWQoKICAgVGhlIHVzYWdlIG9mIHRoZSAteC8tLXByb3h5IGZsYWcgb3ZlcnJpZGVzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCgogLSBQcm94eSBjYW4gbm93IGJlIHNwZWNpZmllZCB3aXRoIGEgcHJvY290b2w6Ly8gcHJlZml4LgoKIC0gV3JvdGUgdGhlIGN1cmwuMSBtYW4gcGFnZS4KCiAtIEludHJvZHVjZWQgYSB3aG9sZSBuZXcgZHluYW1pYyBidWZmZXIgc3lzdGVtIGZvciBhbGwgc3ByaW50Zigpcy4gSXQgaXMKICAgYmFzZWQgb24gdGhlICpwcmludGYoKSBwYWNrYWdlIGJ5IHlvdXJzIHRydWx5IGFuZCBCam9ybiBSZWVzZS4gSG9wZWZ1bGx5LAogICB0aGVyZSBhcmVuJ3QgdGhhdCBtYW55IGJ1ZmZlciBvdmVyZmxvdyByaXNrcyBsZWZ0IG5vdy4KCiAtIEFoLCBJIHNob3VsZCBtZW50aW9uIEkndmUgY29tcGlsZWQgYW5kIGJ1aWx0IGN1cmwgc3VjY2Vzc2Z1bGx5IHVuZGVyCiAgIHNvbGFyaXMgMi42IHdpdGggZ2NjIG5vdywgZ2NjIDIuNy4yIHdvbid0IHdvcmsgYnV0IDIuOC4xIGRpZCBvay4KCiBPcmVuIFRpcm9zaCAoRGVjIDMsIDE5OTgpCiAtIEJyb3VnaHQgdHdvIC5zcGVjIGZpbGVzLCB0byB1c2Ugd2hlbiBjcmVhdGluZyAoTGludXgpIFJlZGhhdCBzdHlsZSBSUE0KICAgcGFja2FnZXMuIFRoZXkncmUgbmFtZWQgY3VybC5zcGVjIGFuZCBjdXJsLXNzbC5zcGVjLgoKIFRyb3kgRW5nZWwKIC0gU3VwcGxpZWQgdGhlIHNyYy9NYWtlZmlsZS52YzYgZm9yIGVhc3kgY29tcGlsaW5nIHdpdGggVkMrKyB1bmRlciBXaW4zMi4KClZlcnNpb24gNS4wCgogRGFuaWVsIFN0ZW5iZXJnIChEZWMgMSwgMTk5OCkKIC0gTm90IGEgc2luZ2xlIGJ1ZyByZXBvcnQgaW4gYWdlcy4KIC0gQ29ycmVjdGVkIGdldHBhc3MuYyBhbmQgbWFpbi5jIHRvIGNvbXBpbGUgd2FybmluZyBhbmQgZXJyb3IgZnJlZSB3aXRoIHRoZQogICBXaW4zMiBWQysrIGNyYXAuCgpWZXJzaW9uIDUuMCBiZXRhIDI0CgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMjAsIDE5OTgpCgogSE9XIFRPIEJVSUxEIEEgUkVMRUFTRSBBUkNISVZFOgoKICogUHJlLXJlcXVpc2l0ZSBzb2Z0d2FyZToKICAgV2hhdAkJICAgICBUbyBidWlsZCB3aGF0ICAgICAgICAgICAgIFJlYWRzIGRhdGEgZnJvbQogICA9PT09ICAgICAgICAgICAgICA9PT09PT09PT09PT09ICAgICAgICAgICAgID09PT09PT09PT09PT09PQogICBHTlUgYXV0b21ha2UgICAgICBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNCAgIGNvbmZpZ3VyZS5pbgogICAgIEdOVSBtYWtlKDEpICAgICAgLSAiIC0KICAgICBHTlUgZ2NjKDEpICAgICAgIC0gIiAtCiAgIEdOVSBhdXRvY29uZiAgICAgIGNvbmZpZ3VyZSAgICAgICAgICAgICAgICAgY29uZmlndXJlLmluCiAgIEdOVSBhdXRvaGVhZGVyKDIpIGNvbmZpZy5oLmluCSAgICAgICBjb25maWd1cmUuaW4sIGFjY29uZmlnLmgKCiAqIE1ha2Ugc3VyZSBhbGwgZmlsZXMgdGhhdCBzaG91bGQgYmUgcGFydCBvZiB0aGUgYXJjaGl2ZSBhcmUgcHV0IGluIEZJTEVTLgoKICogUnVuICcuL21ha2V0Z3onIGFuZCBlbnRlciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbmV3IHRvIGJlY29tZSBhcmNoaXZlLgoKICAgbWFrZXRneiBkb2VzOgoKICAgLSBFbnRlcnMgdGhlIG5ld2x5IGNyZWF0ZWQgdmVyc2lvbiBudW1iZXIgaW4gdXJsLmguCiAgIC0gKElmIHlvdSBkb24ndCBoYXZlIGF1dG9tYWtlLCB0aGlzIHNjcmlwdCB3aWxsIHdhcm4gYWJvdXQgdGhhdCwgYnV0IHVubGVzcwogICAgIHlvdSBoYXZlIGNoYW5nZWQgdGhlIE1ha2VmaWxlLmFtIGZpbGVzLCB0aGF0IGlzIG5vdGhpbmcgdG8gY2FyZSBhYm91dC4pCiAgICAgSWYgeW91IGhhdmUgaXQsIGl0J2xsIHJ1biBpdC4KICAgLSBJZiB5b3UgaGF2ZSBhdXRvY29uZiwgdGhlIGNvbmZpZ3VyZS5pbiB3aWxsIGJlIGVkaXRlZCB0byBnZXQgdGhlIG5ld2x5CiAgICAgY3JlYXRlZCB2ZXJzaW9uIG51bWJlciBhbmQgYXV0b2NvbmYgd2lsbCBiZSBydW4uCiAgIC0gQ3JlYXRlcyBhIG5ldyBkaXJlY3RvcnkgbmFtZWQgY3VybC08dmVyc2lvbj4uIChBY3R1YWxseSwgaXQgdXNlcyB0aGUgYmFzZQogICAgIG5hbWUgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHVwIHRvIHRoZSBmaXJzdCAnLScuKQogICAtIENvcGllcyBhbGwgZmlsZXMgbWVudGlvbmVkIGluIEZJTEVTIHRvIHRoZSBuZXcgZGlyZWN0b3J5LiBTYXZpbmcKICAgICBwZXJtaXNzaW9ucyBhbmQgZGlyZWN0b3J5IHN0cnVjdHVyZS4KICAgLSBVc2VzIHRhciB0byBjcmVhdGUgYW4gYXJjaGl2ZSBvZiBpdCBhbGwsIG5hbWVkIGN1cmwtPHZlcnNpb24+LnRhci5negogICAtIGd6aXBzIHRoZSBhcmNoaXZlCiAgIC0gUmVtb3ZlcyB0aGUgbmV3IGRpcmVjdG9yeSBhbmQgYWxsIGl0cyBjb250ZW50cy4KCiAqIFdoZW4gZG9uZSwgeW91IGhhdmUgYW4gYXJjaGl2ZSBzdG9yZWQgaW4geW91ciBkaXJlY3RvcnkgbmFtZWQKICAgY3VybC08dmVyc2lvbj4udGFyLmd6LgoKICAgRG9uZSEKCiAgICgxKSBUaGV5J3JlIHJlcXVpcmVkIHRvIG1ha2UgYXV0b21ha2UgcnVuIHByb3Blcmx5LgogICAoMikgSXQgaXMgZGlzdHJpYnV0ZWQgYXMgYSBwYXJ0IG9mIHRoZSBHTlUgYXV0b2NvbmYgYXJjaGl2ZS4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxOCwgMTk5OCkKIC0gSSBjaGFuZ2VkIHRoZSBUQUctc3lzdGVtLiBJZiB5b3UgZXZlciB1c2VkIHVybGdldCgpIGZyb20gdGhpcyBwYWNrYWdlIGluCiAgIGFub3RoZXIgcHJvZHVjdCwgeW91IG5lZWQgdG8gcmVjb21waWxlIHdpdGggdGhlIG5ldyBoZWFkZXJzLiBJIGRpZCB0aGlzCiAgIG5ldyBzdHVmZiB0byBiZXR0ZXIgZGVhbCB3aXRoIGRpZmZlcmVudCBjb21waWxlcnMgYW5kIHN5c3RlbSB3aXRoIGRpZmZlcmVudAogICB2YXJpYWJsZSBzaXplcy4gSSB0aGluayBpdCBtYWtlcyBpdCBhIGxpdHRsZSBtb3JlIHBvcnRhYmxlLiBUaGlzIHByb3ZlcwogICB0byBjb21waWxlIHdhcm5pbmcgZnJlZSB3aXRoIHRoZSBwcm9ibGVtYXRpYyBJUklYIGNvbXBpbGVyIQogLSBXaW4zMiBjb21waWxlZCB3aXRoIGEgc2lsbHkgZXJyb3IuIENvcnJlY3RlZCBub3cuCiAtIEJyaWFuIENoYXBsaW4gcmVwb3J0ZWQgeWV0IGFub3RoZXIgcHJvYmxlbSBpbgogICBtdWx0aWxpbmUgRlRQIHJlc3BvbnNlcy4gSSd2ZSB0cmllZCB0byBjb3JyZWN0IGl0LiBJIG1haWxlZCBoaW0gYSBuZXcKICAgdmVyc2lvbiBhbmQgSSBob3BlIGhlIGdldHMgYmFjayBzb29uIHdpdGggcG9zaXRpdmUgZmVlZGJhY2shCiAtIEltcHJvdmVkIHRoZSAnbWFrZXRneicgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0cmVlIHdoaWNoIGl0IG1ha2VzCiAgIGFuIGFyY2hpdmUgZnJvbSBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyByZW5hbWluZyBvZiB0aGUgY3VycmVudCBvbmUuCiAtIE1haWxpbmcgbGlzdCBvcGVuZWQgKHNlZSBSRUFETUUpLgogLSBNYWRlIC12IG1vcmUgdmVyYm9zZSBvbiB0aGUgUEFTViBzZWN0aW9uIG9mIGZ0cCB0cmFuc2ZlcnMuIE5vdyBpdCB0ZWxscwogICBob3N0IG5hbWUgYW5kIElQIG9mIHRoZSBuZXcgaG9zdCAoYW5kIHBvcnQgbnVtYmVyKS4gSSBhbHNvIGFkZGVkIGEgc2VjdGlvbgogICBhYm91dCBQT1JUIHZzIFBBU1YgaW4gdGhlIFJFQURNRS4KClZlcnNpb24gNS4wIGJldGEgMjEKCiBBbmd1cyBNYWNrYXkgKE5vdiAxNSwgMTk5OCkKIC0gSW50cm9kdWNlZCBhdXRvbWFrZSBzdHVmZi4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxMywgMTk5OCkKIC0gSnVzdCBtYWRlIGEgc3VjY2Vzc2Z1bCBHRVQgb2YgYSBkb2N1bWVudCBmcm9tIGFuIFNTTC1zZXJ2ZXIgdXNpbmcgbXkgb3duCiAgIHByaXZhdGUgY2VydGlmaWNhdGUgZm9yIGF1dGhlbnRpY2F0aW9uISBUaGUgY2VydGlmaWNhdGUgaGFzIHRvIGJlIGluIFBFTQogICBmb3JtYXQuIFlvdSBkbyB0aGF0IHRoZSBlYXNpZXN0IHdheSAoYWx0aG91Z2ggbm90ICp0aGF0KiBlYXN5KSBieQogICBkb3dubG9hZGluZyB0aGUgU1NMeWVheSBQS0NTIzEyLXBhdGNoIGJ5IERyIFN0ZXBoZW4gTi4gSGVuc29uIGZyb20gaGlzIHNpdGUKICAgYXQ6IGh0dHA6Ly93d3cuZHJoLWNvbnN1bHRhbmN5LmRlbW9uLmNvLnVrLy4gVXNpbmcgaGlzIHRvb2wsIHlvdSBjYW4KICAgY29udmVydCBhbnkgbW9kZXJuIE5ldHNjYXBlIG9yIChldmVuKSBNU0lFIGNlcnRpZmljYXRlIHRvIFBFTS1mb3JtYXQuICBVc2UKICAgaXQgd2l0aCAnY3VybCAtRSA8Y2VydGlmaWNhdGU6cGFzc3dvcmQ+IGh0dHBzOi8vc2l0ZS5jb20nLiAgSWYgdGhpcyBpc24ndCBhCiAgIGNvb2wgZmVhdHVyZSwgdGhlbiBJIGRvbid0IGtub3cgd2hhdCBjb29sIGZlYXR1cmVzIGxvb2sgbGlrZSEgOy0pCiAtIFdvcmtpbmcgc2xvd2x5IG9uIHRlbG5ldCBjb25uZWN0aW9ucy4gI2RlZmluZSBUUllfVEVMTkVUIHRvIHRyeSBpdCBvdXQuCiAgIChjdXJsIC11IHVzZXI6cGFzc3dkICJ0ZWxuZXQ6Ly9ob3N0LmNvbS9jYXQgLmxvZ2luIiBpcyBvbmUgZXhhbXBsZSkgSSBkbwogICBoYXZlIHByb2JsZW0gdG8gZGVmaW5lIGhvdyBpdCBzaG91bGQgd29yay4gVGhlIHByaW1lIHB1cnBvc2UgZm9yIHRoaXMgbXVzdAogICBiZSB0byBnZXQgKDhiaXQgY2xlYW4pIGZpbGVzIHZpYSB0ZWxuZXQsIGFuZCBpdCByZWFsbHkgaXNuJ3QgdGhhdCBlYXN5IHRvCiAgIGdldCBmaWxlcyB0aGlzIHdheS4gU3RpbGwgaGF2aW5nIHByb2JsZW1zIHdpdGggXG4gYmVpbmcgY29udmVydGVkIHRvIFxyXG4uCgogQW5ndXMgTWFja2F5IChOb3YgMTIsIDE5OTgpCiAtIENvcnJlY3RlZCBhbm90aGVyIGJ1ZyBpbiB0aGUgbG9uZyBwYXJhbWV0ZXIgbmFtZSBwYXJzZXIuCiAtIE1vZGlmaWVkIGdldHBhc3MuYyAoTk9URTogc2VlIHRoZSBzcGVjaWFsIGxpY2Vuc2luZyBpbiB0aGUgdG9wIG9mIHRoYXQKICAgc291cmNlIGZpbGUpLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDEyLCAxOTk4KQogLSBXZSBtYXkgaGF2ZSByZW1vdmVkIHRoZSBzaWxseSB3YXJuaW5ncyBmcm9tIHVybC5jIHdoZW4gY29tcGlsZWQgdW5kZXIgSVJJWC4KICAgVGhhbmtzIGFnYWluIHRvIEJqb3JuIFJlZXNlIGFuZCBNYXJ0aW4gU3RhYWVsLgogLSBXcm90ZSBmb3JtZmluZC5wbCB3aGljaCBpcyBhIG5ldyBwZXJsIHNjcmlwdCBpbnRlbmRlZCB0byBoZWxwIHlvdSBmaW5kIG91dAogICBob3cgYSBGT1JNIHN1Ym1pc3Npb24gc2hvdWxkIGJlIGRvbmUuIFRoaXMgbmVlZHMgYSBsaXR0bGUgbW9yZSB3b3JrIHRvIGdldAogICByZWFsbHkgZ29vZC4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxMSwgMTk5OCkKIC0gTWFkZSB0aGUgSFRUUCBoZWFkZXItY2hlY2tlciBhY2NlcHQgd2hpdGUgc3BhY2VzIGJlZm9yZSB0aGUgSFRUUC8xLj8gbGluZS4KICAgQXBwZWFyYW50bHkgc29tZSBwcm94aWVzL3NpdGVzIGFkZCBzdWNoIGF0IHRpbWVzIChteSB0ZXN0IHByb3h5IGRpZCB3aGVuIEkKICAgZG93bmxvYWRlZCBhIGdvcGhlciBwYWdlIHdpdGggaXQpIQogLSBNb3ZlZCB0aGUgZm9ybWVyIC1oIHRvIC1NIGFuZCBtYWRlIC1oIHNob3cgdGhlIHNob3J0IGhlbHAgdGV4dCBpbnN0ZWFkLiBJCiAgIGhhZCB0byBlbmFibGUgYSBmb3JjZWQgaGVscCB0ZXh0IG9wdGlvbi4gTm93IGFuIGV2ZW4gc2hvcnRlciBoZWxwIHRleHQgd2lsbAogICBiZSBwcmVzZW50ZWQgd2hlbiBhbiB1bmtub3duIG9wdGlvbiBhbmQgc2ltaWxhciwgaXMgdXNlZC4KIC0gc3RkY2hlYWRlcnMuaCBkaWRuJ3Qgd29yayB3aXRoIElSSVggNi40IG5hdGl2ZSBjYyBjb21waWxlci4gSSBob3BlIG15CiAgIGNoYW5nZXMgZG9uJ3QgbWFrZSBvdGhlciB2ZXJzaW9ucyBnbyBudXRzIGluc3RlYWQuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTAsIDE5OTgpCiAtIEFkZGVkIGEgd2VpcmQgY2hlY2sgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gY2hlY2sgZm9yIHRoZSBzaWxseSBBSVgKICAgd2FybmluZ3MgYWJvdXQgbXkgI2RlZmluZSBzdHJjYXNlY21wKCkgc3R1ZmYuIEkgZG8gdGhhdCBkZWZpbmUgdG8gcHJldmVudAogICBtZSBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHRvIGFjY2lkZW50YWx5IHVzZSB0aGF0IGZ1bmN0aW9uIG5hbWUgaW5zdGVhZAogICBvZiBzdHJlcXVhbCgpLi4uCiAtIEkgYnVnZml4ZWQgQW5ndXMncyBnZXRwYXNzLmMgdmVyeSBsaXR0bGUuCiAtIEZpeGVkIHRoZSB2ZXJib3NlIGZsYWcgbmFtZXMgdG8gZ2V0b3B0LXN0eWxlLCBpLmUgJ2N1cmwgLS1sb2MnIHdpbGwgYmUKICAgc3VmZmljaWVudCBpbnN0ZWFkIG9mIC0tbG9jYXRpb24gYXMgImxvYyIgaXMgYSB1bmlxdWUgcHJlZml4LiBBbHNvLCBhbnl0aGluZwogICBhZnRlciBhICctLScgaXMgdHJlYXRlZCBhcyBhbiBVUkwuIFNvIGlmIHlvdSBkbyBoYXZlIGEgaG9zdCB3aXRoIGEgd2VlZWlyZAogICBuYW1lIHlvdSBjYW4gZG8gJ2N1cmwgLS0gLWhvc3QuY29tJy4KIC0gQW5vdGhlciBnZXRvcHQtYWRqdXN0OyBjdXJsIG5vdyBhY2NlcHRzIGZsYWdzIGFmdGVyIHRoZSBVUkwgb24gdGhlIGNvbW1hbmQKICAgbGluZS4gJ2N1cmwgd3d3LmZvby5jb20gLU8nIGlzIHBlcmZlY3RseSB2YWxpZC4KIC0gQ29ycmVjdGVkIHRoZSAuY3VybHJjIHBhcnNlciBzbyB0aGF0IHN0cnRvaygpIGlzIG5vIGxvbmdlciB1c2VkIGFuZCBJCiAgIGJlbGlldmUgaXQgd29ya3MgYmV0dGVyLiBFdmVuIFVSTHMgY2FuIGJlIHNwZWNpZmllZCBpbiBpdCBub3cuCgogQW5ndXMgTWFja2F5IChOb3YgOSwgMTk5OCkKIC0gUmVwbGFjZWQgZ2V0cGFzcy5jIHdpdGggYSBuZXdseSB3cml0dGVuIG9uZSwgbm90IHVuZGVyIEdQTCBsaWNlbnNlCiAtIENoYW5nZWQgT1MgdG8gYSAjZGVmaW5lIGluIGNvbmZpZy5oIGluc3RlYWQgb2YgY29tcGlsZXIgZmxhZwogLSBNYWtlZmlsZSBub3cgdXNlcyAtREhBVkVfQ09ORklHX0gKCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiA5LCAxOTk4KQogLSBPaywgSSBleHBhbmRlZCB0aGUgdGd6LXRhcmdldCB0byB1cGRhdGUgdGhlIHZlcnNpb24gc3RyaW5nIG9uIGVhY2ggb2NjYXRpb24KICAgSSBidWlsZCBhIHJlbGVhc2UgYXJjaGl2ZSEKIC0gSSByZWFjdGVkIG9uIEFuZ3VzIE1hY2theSdzIGluaXRpYXRpdmUgYW5kIHJlbWFkZSB0aGUgcGFyYW1ldGVyIHBhcnNlciB0bwogICBiZSBtb3JlIGdldG9wdCBjb21wbGlhbnQuIEN1cmwgbm93IHN1cHBvcnRzICJtZXJnZWQiIGZsYWdzIGFzIGluCgljdXJsIC1sc3YgZnRwLnNpdGUuY29tCiAgIERvIG5vdGUgdGhhdCBJIGhhZCB0byBtb3ZlIHRocmVlIHNob3J0LW5hbWVzIG9mIHRoZSBvcHRpb25zLiBQYXJhbWV0ZXJzCiAgIHRoYXQgbmVlZHMgYW4gYWRkaXRpb25hbCBzdHJpbmcgc3VjaCBhcyAteCBtdXN0IGJlIHN0YW5kLWFsb25lIG9yIHRoZQogICBsYXN0IGluIGEgbWVyZ2VkIHNlcXVlbmNlOgoJY3VybCAtbHN4IG15LXByb3h5IGZ0cC5zaXRlLmNvbQogICBpcyBvaywgYnV0IHVzaW5nIHRoZSBmbGFncyBpbiBhIGRpZmZlcmVudCBvcmRlciBsaWtlICctbHhzJyB3b3VsZCBjYXVzZQogICB1bmV4cGVjdGVkIHJlc3VsdHMgKGFzIHRoZSAncycgb3B0aW9uIHdvdWxkIGJlIHNraXBwZWQpLgogLSBJJ3ZlIGNoYW5nZWQgdGhlIGhlYWRlcnMgaW4gYWxsIGZpbGVzIHRoYXQgYXJlIHN1YmplY3QgdG8gdGhlIE1velBMCiAgIGxpY2Vuc2UsIGFzIHRoZXkgYXJlIHN1cHBvc2VkIHRvIGxvb2sgbGlrZSB3aGVuIGNvbmZvcm1pbmcuCiAtIE1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbWFrZSB0aGUgY29uZmlnLmguIFRoZSBmb3JtZXIgY29uZmlnLmggaXMgbm93CiAgIHNldHVwLmguCiAtIFRoZSBSRVNPVVJDRVMgYW5kIFRPRE8gZmlsZXMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBhcmNoaXZlLgoKIEFuZ3VzIE1hY2theSAoTm92IDUsIDE5OTgpCiAtIEZpeGVkIGdldHBhc3MuYyBhbmQgdmFyaW91cyBjb25maWd1cmUgc3R1ZmYKCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAzLCAxOTk4KQogLSBVc2UgLUgvLS1oZWFkZXIgZm9yIGN1c3RvbSBIVFRQLWhlYWRlcnMuIExldHMgeW91IHBhc3Mgb24geW91ciBvd24KICAgc3BlY2lmaWVkIGhlYWRlcnMgdG8gdGhlIHJlbW90ZSBzZXJ2ZXIuIEkgd291bGRuJ3QgcmVjb21tZW5kIHRyeWluZyB0byB1c2UKICAgYSBoZWFkZXIgd2l0aCBhIGRlZmluZWQgdXNhZ2UgYWNjb3JkaW5nIHRvIHN0YW5kYXJkcy4gVXNlIHRoaXMgZmxhZyBvbmNlCiAgIGZvciBldmVyeSBjdXN0b20gaGVhZGVyIHlvdSB3YW50IHRvIGFkZC4KIC0gVXNlIC1CLy0tZnRwLWFzY2lpIHRvIGZvcmNlIGZ0cCB0byB1c2UgQVNDSUkgbW9kZSB3aGVuIHRyYW5zZmVyaW5nIGZpbGVzLgogLSBDb3JyZWN0ZWQgdGhlICdnZXRsaW5rcy5wbCcgc2NyaXB0LCBJIGFjY2lkZW50YWxseSBsZWZ0IG15IHNpbGx5IHByb3h5CiAgIHVzYWdlIGluIHRoZXJlISBTaW5jZSB0aGUgaW50cm9kdWN0aW9uIG9mIHRoZSAuY3VybHJjIGZpbGUsIGl0IGlzIGVhc2llciB0bwogICB3cml0ZSBzY3JpcHRzIHRoYXQgdXNlIGN1cmwgc2luY2UgcHJveGllcyBhbmQgc3R1ZmYgc2hvdWxkIGJlIGluIHRoZQogICAuY3VybHJjIGZpbGUgYW55d2F5LgogLSBJbnRyb2R1Y2luZyB0aGUgbmV3IC1GIGZsYWcgZm9yIEhUVFAgUE9TVC4gSXQgc3VwcG9ydHMgbXVsdGlwYXJ0L2Zvcm0tZGF0YQogICB3aGljaCBtZWFucyBpdCBpcyBnb25uYSBiZSBwb3NzaWJsZSB0byB1cGxvYWQgZmlsZXMgZXRjIHRocm91Z2ggSFRUUCBQT1NULgogICBTaGlyYXogS2FuZ2EgYXNrZWQgZm9yIHRoZSBmZWF0dXJlIGFuZCBteSBicm90aGVyLAogICBCavZybiBTdGVuYmVyZyBoZWxwZWQgbWUgZGVzaWduIHRoZSB1c2VyCiAgIGludGVyZmFjZSBmb3IgdGhpcyBiZWFzdC4gIFRoaXMgZmVhdHVyZSByZXF1aXJlcyBxdWl0ZSBzb21lIGRvY3MsCiAgIHNpbmNlIGl0IGhhcyB0dXJuZWQgb3V0IG5vdCBvbmx5IHF1aXRlIGNhcGFibGUsIGJ1dCBhbHNvIGNvbXBsaWNhdGVkISA6LSkKIC0gQSBub3RlIGhlcmUsIHNpbmNlIEkndmUgcmVjZWl2ZWQgbWFpbCBhYm91dCBpdC4gU1NMZWF5IHZlcnNpb25zIHByaW9yIHRvCiAgIDAuOCB3aWxsICpub3QqIHdvcmsgd2l0aCBjdXJsIQogLSBXaWwgTGFuZ2ZvcmQgcmVwb3J0ZWQgYSBidWcgdGhhdCBvY2N1cnJlZCBzaW5jZSBjdXJsCiAgIGRpZCBub3QgcHJvcGVybHkgdXNlIENSTEYgd2hlbiBpc3N1aW5nIGZ0cCBjb21tYW5kcy4gSSBmaXhlZCBpdC4KIC0gUmVhcnJhbmdlZCB0aGUgb3JkZXIgY29uZmlnIGZpbGVzIGFyZSByZWFkLiAuY3VybHJjIGlzIG5vdyAqYWx3YXlzKiByZWFkCiAgIGZpcnN0IGFuZCBiZWZvcmUgdGhlIGNvbW1hbmQgbGluZSBmbGFncy4gLUsgY29uZmlnIGZpbGVzIHRoZW4gYWN0IGFzCiAgIGFkZGl0aW9uYWwgY29uZmlnIGl0ZW1zLgogLSBVc2UgLXEgQVMgVEhFIEZJUlNUIE9QVElPTiBzcGVjaWZpZWQgdG8gcHJldmVudCAuY3VybHJjIGZyb20gYmVpbmcgcmVhZC4KIC0gWW91IGNhbiBub3cgZGlzYWJsZSBhIHByb3h5IGJ5IHVzaW5nIC14ICIiLiBVc2VmdWwgaWYgdGhlIC5jdXJscmMgZmlsZQogICBzcGVjaWZpZXMgYSBwcm94eSBhbmQgeW91IHdhbm5hIGZldGNoIHNvbWV0aGluZyB3aXRob3V0IGdvaW5nIHRocm91Z2gKICAgdGhhdC4KIC0gSSdtIHRoaW5raW5nIG9mIGRyb3BwaW5nIHRoZSAtcCBzdXBwb3J0LiBJdHMgcmVhbGx5IG5vdCB1c2VmdWwgc2luY2UgcG9ydHMKICAgY291bGQgKGFuZCBzaG91bGQ/KSBiZSBzcGVjaWZpZWQgYXMgOjxwb3J0PiBhcHBlbmRlZCBvbiB0aGUgaG9zdCBuYW1lCiAgIGluc3RlYWQsIGJvdGggaW4gVVJMcyBhbmQgdG8gcHJveHkgaG9zdCBuYW1lcy4KIC0gTWFydGluIFN0YWFlbCByZXBvcnRzIGN1cmwgLUwgYnVncyB1bmRlciBXaW5kb3dzIE5UCiAgICh0ZXN0IHdpdGggVVJMIGh0dHA6Ly9jb21lLnRvL3Njc2RlKS4gVGhpcyBidWcgaXMgbm90IHByZXNlbnQgaW4gdGhpcwogICB2ZXJzaW9uIGFueW1vcmUuCiAtIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSB3ZWlyZCBGVFAgVVJMIHR5cGU9IHRoaW5nLiBZb3UgY2FuIGRvd25sb2FkIGEgZmlsZQogICB1c2luZyBBU0NJSSB0cmFuc2ZlciBieSBhcHBlbmRpbmcgIjt0eXBlPUEiIHRvIHRoZSByaWdodCBvZiBpdC4gT3RoZXIKICAgYXZhaWxhYmxlIHR5cGVzIGFyZSB0eXBlPUQgZm9yIGRpci1saXN0IChOTFNUKSBhbmQgdHlwZT1JIGZvciBiaW5hcnkKICAgdHJhbnNmZXIuIEkgY2FuJ3Qgc2F5IEkndmUgZXZlciBzZWVuIGFueW9uZSB1c2UgdGhpcyBraW5kIG9mIFVSTCB0aG91Z2ghCiAgIDotKQogLSBUcm95IEVuZ2VsIHBvaW50ZWQgb3V0IGEgYnVnIGluIG15IGdldGVudigiSE9NRSIpCiAgIHVzYWdlIGZvciB3aW4zMiBzeXN0ZW1zLiBJIGludHJvZHVjZSBnZXRlbnYuYyB0byBiZXR0ZXIgY29wZSB3aXRoCiAgIHRoaXMuIE1yIEVuZ2VsIGhlbHBzIG1lIHdpdGggdGhlIGRldGFpbHMgYXJvdW5kIHRoYXQuLi4KIC0gQSBsaXR0bGUgbm90ZSB0byBteXNlbGYgYW5kIG90aGVycywgSSBzaG91bGQgbWFrZSB0aGUgd2luMzItYmluYXJ5IGJ1aWx0CiAgIHdpdGggU1NMIHN1cHBvcnQuLi4KIC0gUnlhbiBOZWxzb24gc2VudCBtZSBjb21tZW50cyBhYm91dCBidWlsZGluZyBjdXJsCiAgIHdpdGggU1NMIHVuZGVyIEZyZWVCU0QuIFNlZSB0aGUgTWFrZWZpbGUgZm9yIGRldGFpbHMuIFVzaW5nIHRoZSBjb25maWd1cmUKICAgc2NyaXB0LCBpdCBzaG91bGQgd29yayBiZXR0ZXIgYW5kIGF1dG9tYXRpY2FsbHkgbm93Li4uCiAtIENsZWFuZWQgdXAgaW4gdGhlIHBvcnQgbnVtYmVyIG1lc3MgaW4gdGhlIHNvdXJjZS4gTm8gbG9uZ2VyIHN0b3JlcyBhbmQgdXNlcwogICBwcm94eSBwb3J0IG51bWJlciBzZXBhcmF0ZSBmcm9tIG5vcm1hbCBwb3J0IG51bWJlci4KIC0gJ2NvbmZpZ3VyZScgc2NyaXB0IHdvcmtpbmcuIENvbmZpcm1lZCBjb21waWxlcyBvbjoKICAgIEhvc3QgICAgICAgICBTU0wgIENvbXBpbGVyCiAgICBTdW5PUyA1LjUgICAgbm8gICBnY2MKICAgIFN1bk9TIDUuNS4xICB5ZXMgIGdjYwogICAgU3VuT1MgNS42ICAgIG5vICAgY2MgICh3aXRoIGdjYywgaXQgaGFzIHRoZSAiZ2NjIGluY2x1ZGUgZmlsZXMiIHByb2JsZW0pCiAgICBTdW5PUyA0LjEuMyAgbm8gICBnY2MgKHdpdGhvdXQgQU5TSSBDIGhlYWRlcnMpCiAgICBTdW5PUyA0LjEuMiAgbm8gICBnY2MgKG5hdGl2ZSBjb21waWxlciBmYWlsZWQpCiAgICBMaW51eCAyLjAuMTggbm8gICBnY2MKICAgIExpbnV4IDIuMC4zMiB5ZXMgIGdjYwogICAgTGludXggMi4wLjM1IG5vICAgZ2NjICh3aXRoIGdsaWJjKQogICAgSVJJWCA2LjIgICAgIG5vICAgZ2NjIChjYyBjb21waWxlcyBnZW5lcmF0ZSBhIGZldyB3YXJuaW5ncykKICAgIElSSVggNi40ICAgICBubyAgIGNjICAoZ2VuZXJhdGVkIHdhcm5pbmdzIHRob3VnaCkKICAgIFdpbjMyICAgICAgICBubyAgIEJvcmxhbmQKICAgIE9TRjQuMAkgbm8gICA/CgogLSBPb29wcy4gVGhlIDViZXRhIChhbmQgNC4xMCkgdW5kZXIgd2luMzIgZmFpbGVkIGlmIHRoZSBIT01FIHZhcmlhYmxlIHdhc24ndAogICBzZXQuCiAtIFdoZW4gdXNpbmcgYSBwcm94eSwgY3VybCBub3cgZ3Vlc3NlcyBhbmQgdXNlcyB0aGUgcHJvdG9jb2wgcGFydCBpbiBjYXNlcwogICBsaWtlOgoJY3VybCAteCBwcm94eTo4MCB3d3cuc2l0ZS5jb20KICAgUHJveGllcyBub3JtYWxseSBnbyBudXRzIHVubGVzcyBodHRwOi8vIGlzIHByZXBlbmRlZCB0byB0aGUgaG9zdCBuYW1lLCBzbwogICBpZiBjdXJsIGlzIHVzZWQgbGlrZSB0aGlzLCBpdCBndWVzc2VzIHByb3RvY29sIGFuZCBhcHBlbmRzIHRoZSBwcm90b2NvbAogICBzdHJpbmcgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIHByb3h5LiBJdCBhbHJlYWR5IGRpZCB0aGlzIHdoZW4gdXNlZAogICB3aXRob3V0IHByb3h5LgogLSBCZXR0ZXIgcG9ydCB1c2FnZSB3aXRoIFNTTCB0aHJvdWdoIHByb3h5IG5vdy4gSWYgeW91IHNwZWNpZmllZCBhIGRpZmZlcmVudAogICBodHRwcy1wb3J0IHdoZW4gYWNjZXNzaW5nIHRocm91Z2ggYSBwcm94eSwgaXQgZGlkbid0IHVzZSB0aGF0IG51bWJlcgogICBjb3JyZWN0bHkuIEkgYWxzbyByZXdyb3RlIHRoZSBjb2RlIHRoYXQgcGFyc2VzIHRoZSBzdHVmZiByZWFkIGZyb20gdGhlCiAgIHByb3h5IHdoZW4geW91IHdhbm5hIGNvbm5lY3QgdGhyb3VnaCBpdCB3aXRoIFNTTC4KIC0gQmpvcm4gUmVlc2UgaGVscGVkIG1lIHdvcmsgYXJvdW5kIG9uZSBvZiB0aGUgY29tcGlsZXIKICAgd2FybmluZ3Mgb24gSVJJWCBuYXRpdmUgY2MgY29tcGlsZXMuCgpWZXJzaW9uIDQuMTAgKE9jdCAyNiwgMTk5OCkKIERhbmllbCBTdGVuYmVyZwogLSBKb2huIEEuIEJyaXN0b3Igc3VnZ2VzdGVkIGEgY29uZmlnIGZpbGUgc3dpdGNoLAogICBhbmQgc2luY2UgSSd2ZSBiZWVuIGhhdmluZyB0aGF0IGlkZWEga2luZCBvZiBpbiB0aGUgYmFja2dyb3VuZCBmb3IgYSBsb25nCiAgIHRpbWUgSSByZXdyb3RlIHRoZSBwYXJhbWV0ZXIgcGFyc2luZyBmdW5jdGlvbiBhIGxpdHRsZSBhbmQgbm93IEkgaW50cm9kdWNlCiAgIHRoZSAtSy8tLWNvbmZpZyBmbGFnLiBJIGFsc28gbWFkZSBjdXJsICphbHdheXMqICh1bmxlc3MgLUsgaXMgdXNlZCkgdHJ5IHRvCiAgIGxvYWQgdGhlIC5jdXJscmMgZmlsZSBmb3IgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMuIFRoZSBzeW50YXggZm9yIHRoZQogICBjb25maWcgZmlsZSBpcyB0aGUgc3RhbmRhcmQgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHN0eWxlLiBEZXRhaWxzIGluICdjdXJsCiAgIC1oJyBvciB0aGUgUkVBRE1FLgogLSBJIHJlbW92ZWQgdGhlIC1rIG9wdGlvbi4gS2VlcC1hbGl2ZSBpc24ndCByZWFsbHkgYW55dGhpbmcgYW55b25lIHdvdWxkCiAgIHdhbnQgdG8gZW5hYmxlIHdpdGggY3VybCBhbnl3YXkuCiAtIE1hcnRpbiBTdGFhZWwgaGVscGVkIG1lIGFkZCB0aGUgJ2lyaXgnIHRhcmdldC4gTm93CiAgICJtYWtlIGlyaXgiIHNob3VsZCBidWlsZCBjdXJsIHN1Y2Nlc3NmdWxseSBvbiBub24tZ2NjIFNHSSBtYWNoaW5lcy4KIC0gU2luZ2xlIHN3aXRjaGVzIG5vdyB0b2dnbGUgYmVoYXZpb3Vycy4gSS5lIGlmIHlvdSB1c2UgLXYgLXYgdGhlIHNlY29uZAogICB3aWxsIHN3aXRjaCBvZmYgdGhlIHZlcmJvc2UgbW9kZSB0aGUgZmlyc3Qgb25lIGVuYWJsZWQuIFRoaXMgaXMgc28gdGhhdAogICB5b3UgY2FuIGRpc2FibGUgYSBkZWZhdWx0IHNldHRpbmcgYSAuY3VybHJjIGZpbGUgZW5hYmxlcyBldGMuCgpWZXJzaW9uIDQuOSAoT2N0IDcsIDE5OTgpCiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFydGluIFN0YWFlbCBzdWdnZXN0ZWQgY3VybCB3b3VsZCBzdXBwb3J0IGNvb2tpZXMuCiAgIEkgYWRkZWQgLWIvLS1jb29raWUgdG8gZW5hYmxlIGZyZWUtdGV4dCBjb29raWUgZGF0YSB0byBiZSBwYXNzZWQuIFRoZXJlJ3MKICAgYWxzbyBhIGxpdHRsZSBibHVyYiBhYm91dCBnZW5lcmFsIGNvb2tpZSBzdHVmZiBpbiB0aGUgUkVBRE1FL2hlbHAgdGV4dC4KIC0gZG1oIDxkbWggYXQgamV0LmVzPiBzdWdnZXN0ZWQgSFRUUCByZXN1bWUgY2FwYWJpbGl0aWVzLiBBbHRob3VnaCB5b3UgY291bGQKICAgbWFudWFsbHkgZ2V0IGN1cmwgdG8gcmVzdW1lIEhUVFAgZG9jdW1lbnRzLCBJIG1hZGUgdGhlIC1jIHJlc3VtZSBmbGFnIHdvcmsKICAgZm9yIEhUVFAgdG9vICh1bmxlc3MgLXIgaXMgdXNlZCB0b28sIHdoaWNoIHdvdWxkIGJlIHZlcnkgb2RkIGFueXdheSkuCiAtIEFkZGVkIGNoZWNrbGlua3MucGwgdG8gdGhlIGFyY2hpdmUuIEl0IGlzIGEgc3RpbGwgZXhwZXJpbWVudGFsIHBlcmwgc2NyaXB0CiAgIHRoYXQgY2hlY2tzIGFsbCBsaW5rcyBvZiBhIHdlYiBwYWdlIGJ5IHVzaW5nIGN1cmwuCiAtIFJlYXJyYW5nZWQgdGhlIGFyY2hpdmUgaGllcmFyY2h5IGEgbGl0dGxlLiBCdWlsZCB0aGUgZXhlY3V0YWJsZSBpbiB0aGUKICAgc3JjLyBkaXIgZnJvbSBub3cgb24hCiAtIFZlcnNpb24gNC45IGFuZCBoZXJlYWZ0ZXIsIGlzIG5vIGxvbmdlciByZWxlYXNlZCB1bmRlciB0aGUgR1BMIGxpY2Vuc2UuCiAgIEkgaGF2ZSBub3cgdXBkYXRlZCB0aGUgTEVHQUwgZmlsZSBldGMgYW5kIG5vdyB0aGlzIGlzIHJlbGVhc2VkIHVzaW5nIHRoZQogICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIHRvIGF2b2lkIHRoZSBwbGFndWUga25vd24gYXMgInRoZSBHUEwgdmlydXMiLiBZb3UKICAgbXVzdCBtYWtlIHRoZSBzb3VyY2UgYXZhaWxhYmxlIGlmIHlvdSBkZWNpZGUgdG8gY2hhbmdlIGFuZC9vciByZWRpc3RyaWJ1dGUKICAgY3VybCwgYnV0IGlmIHlvdSBkZWNpZGUgdG8gdXNlIGN1cmwgd2l0aGluIHNvbWV0aGluZyBlbHNlIHlvdSBkbyBub3QgbmVlZAogICB0byBvZmZlciB0aGUgd29ybGQgdGhlIHNvdXJjZSB0byB0aGF0IHRvby4KIC0gQ3VybCBkaWQgbm90IGxpa2UgSFRUUCBzZXJ2ZXJzIHRoYXQgc2VudCBubyBoZWFkZXJzIGF0IGFsbCBvbiBhIEdFVAogICByZXF1ZXN0LiAgSXQgaXMgYSB2aW9sYXRpb24gb2YgUkZDMjA2OCBidXQgYXBwZWFyYW50bHkgc29tZSBzZXJ2ZXJzIGRvCiAgIHRoYXQgYW55d2F5LiAgVGhhbmtzIHRvIEdvcmRvbiBCZWF0b24gZm9yIHRoZSByZXBvcnQhCiAtIC1MLy0tbG9jYXRpb24gd2FzIGFkZGVkIGFmdGVyIGEgc3VnZ2VzdGlvbiBmcm9tIE1hcnRpbiBTdGFhZWwuIFRoaXMgbWFrZXMKICAgY3VybCBBVFRFTVBUIHRvIGZvbGxvdyB0aGUgTG9jYXRpb246IHJlZGlyZWN0IGlmIG9uZSBpcyBwcmVzZW50IGluIHRoZSBIVFRQCiAgIGhlYWRlcnMuIElmIC1pIG9yIC1JIGlzIHVzZWQgd2l0aCB0aGlzIGZsYWcsIHlvdSB3aWxsIHNlZSBoZWFkZXJzIGZyb20gYWxsCiAgIHNpdGVzIHRoZSBMb2NhdGlvbjogcG9pbnRzIHRvLiBEbyBub3RlIHRoYXQgdGhlIGZpcnN0IHNlcnZlciBjYW4gcG9pbnQgdG8gYQogICBzZWNvbmQgdGhhdCBwb2ludHMgdG8gYSB0aGlyZCBldGMuIEl0IHNlZW1zIHRoZSBMb2NhdGlvbjogcGFyYW1ldGVyIChzYWlkCiAgIHRvIGJlIGFuIEFic29sdXRlVVJJIGluIFJGQzIwNjgpIGlzbid0IGFsd2F5cyBhYnNvbHV0ZS4uIDotLyBBbnl3YXksIEkndmUKICAgbWFkZSBjdXJsIEFUVEVNUFQgdG8gZG8gdGhlIGJlc3QgaXQgY2FuIHRvIGRlYWwgd2l0aCB0aGUgcmVhbGl0eS4KIC0gQWRkZWQgZ2V0bGlua3MucGwgdG8gdGhlIGFyY2hpdmUuIGdldGxpbmtzLnBsIHNlbGVjdGl2ZWx5IGRvd25sb2FkcwogICBmaWxlcyB0aGF0IGEgd2ViIHBhZ2UgbGlua3MgdG8uCgpWZXJzaW9uIDQuOC40CiBEYW5pZWwgU3RlbmJlcmcKIC0gQXMgSnVsaWFuIFJvbWVybyBOaWV0byByZXBvcnRlZCwgY3VybCByZXBvcnRlZCB3cm9uZyB2ZXJzaW9uIG51bWJlci4KIC0gQXMgVGVlbXUgWWxpLUVsc2lsYSBwb2ludGVkIG91dCwgdGhlIHdpbjMyIHZlcnNpb24gb2YgNC44IChhbmQgcHJvYmFibHkgYWxsCiAgIG90aGVyIHZlcnNpb25zIGZvciB3aW4zMikgZGlkbid0IHdvcmsgd2l0aCBiaW5hcnkgZmlsZXMgc2luY2UgSSdtIHRvbyB1c2VkCiAgIHRvIHRoZSBVbml4IHN0eWxlIGZvcGVuKCkgd2hlcmUgYmluYXJ5IGFuZCB0ZXh0IGRvbid0IGRpZmZlci4uLgogLSBSYWxwaCBCZWNrbWFubiBicm91Z2h0IG1lIHNvbWUgY2hhbmdlcyB0aGF0IGxldHMgY3VybCBjb21waWxlIGVycm9yIGFuZAogICB3YXJuaW5nIGZyZWUgd2l0aCAtV2FsbCAtcGVkYW50aWMgd2l0aCBnKysuIEkgYWxzbyB0b29rIHRoZSBvcHBvcnR1bml0eSB0bwogICBjbGVhbiBvZmYgc29tZSB1bnVzZWQgdmFyaWFibGVzIGFuZCBzaW1pbGFyLgogLSBSYWxwaCBCZWNrbWFubiBtYWRlIG1lIGF3YXJlIG9mIGEgcmVhbGx5IG9kZCBidWcgbm93IGNvcnJlY3RlZC4gV2hlbiBjdXJsCiAgIHJlYWQgYSBzZXQgb2YgaGVhZGVycyBmcm9tIGEgSFRUUCBzZXJ2ZXIsIGRpdmlkZWQgaW50byBtb3JlIHRoYW4gb25lIHJlYWQKICAgYW5kIHRoZSBmaXJzdCByZWFkIHNob3dlZCBhIGZ1bGwgbGluZSAqZXhhY3RseSogKGkuZSBlbmRpbmcgd2l0aCBhCiAgIG5ld2xpbmUpLCBjdXJsIGRpZCBub3QgYmVoYXZlIHdlbGwuCgpWZXJzaW9uIDQuOC4zCiBEYW5pZWwgU3RlbmJlcmcKIC0gSSB3YXMgdG9vIHF1aWNrIHRvIHJlbGVhc2UgNC44LjIgd2l0aCB0b28gbGl0dGxlIHRlc3RpbmcuIE9uZSBvZiB0aGUKICAgY2hhbmdlcyBpcyBub3cgcmV2ZXJ0ZWQgc2xpZ2h0bHkgdG8gdGhlIDQuOC4xIHdheSBzaW5jZSA0LjguMiBjb3VsZG4ndAogICB1cGxvYWQgZmlsZXMuIEkgc3RpbGwgdGhpbmsgYm90aCBwcm9ibGVtcyBjb3JyZWN0ZWQgaW4gNC44LjIgcmVtYWluCiAgIGNvcnJlY3RlZC4gIFJlcG9ydGVkIGJ5IEp1bGlhbiBSb21lcm8gTmlldG8uCgpWZXJzaW9uIDQuOC4yCiBEYW5pZWwgU3RlbmJlcmcKIC0gQmVybmhhcmQgSXNlbGJvcm4gcmVwb3J0ZWQgdHdvIEZUUCBwcm90b2NvbCBlcnJvcnMgY3VybCBkaWQuIFRoZXkncmUgbm93CiAgIGNvcnJlY3RlZC4gQm90aCBhcHBlYXJlZCB3aGVuIGdldHRpbmcgZmlsZXMgZnJvbSBhIE1TIEZUUCBzZXJ2ZXIhIDotKQoKVmVyc2lvbiA0LjguMQogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkZGVkIGEgbGFzdCB1cGRhdGUgb2YgdGhlIHByb2dyZXNzIG1ldGVyIHdoZW4gdGhlIHRyYW5zZmVyIGlzIGRvbmUuIFRoZQogICBmaW5hbCBvdXRwdXQgb24gdGhlIHNjcmVlbiBkaWRuJ3QgaGF2ZSB0byBiZSB0aGUgZmluYWwgc2l6ZSB0cmFuc2ZlcmVkCiAgIHdoaWNoIG1hZGUgaXQgc29tZXRpbWVzIGxvb2sgb2RkLgogLSBUaGFua3MgdG8gRGF2aWQgTG9uZyBJIGdvdCByaWQgb2YgYSBzaWxseSBidWcgdGhhdCBoYXBwZW5lZCBpZiBhIEhUVFAtcGFnZQogICBoYWQgbm90aGluZyBidXQgaGVhZGVyLiBBcHBlYXJhbnRseSBTb2xhcmlzIGRlYWxzIHdpdGggbmVnYXRpdmUgc2l6ZXMgaW4KICAgZndyaXRlKCkgY2FsbHMgYSBsb3QgYmV0dGVyIHRoYW4gTGludXggZG9lcy4uLiA9Qi1dCgpWZXJzaW9uIDQuOCAoQXVnIDMxLCAxOTk4KQogRGFuaWVsIFN0ZW5iZXJnCiAtIENvbnRpbnVlIEZUUCBmaWxlIHRyYW5zZmVyLiAtYyBpcyB0aGUgc3dpdGNoLiBOb3RlIHRoYXQgeW91IG5lZWQgdG8KICAgc3BlY2lmeSBhIGZpbGUgbmFtZSBpZiB5b3Ugd2FubmEgcmVzdW1lIGEgZG93bmxvYWQgKHlvdSBjYW4ndCByZXN1bWUgYQogICBkb3dubG9hZCBzZW50IHRvIHN0ZG91dCkuIFJlc3VtaW5nIHVwbG9hZCBtYXkgYmUgbGltaXRlZCBieSB0aGUgc2VydmVyCiAgIHNpbmNlIGN1cmwgaXMgdGhlbiB1c2luZyB0aGUgbm9uLVJGQzk1OSBjb21tYW5kIFNJWkUgdG8gZ2V0IHRoZSBzaXplIG9mCiAgIHRoZSB0YXJnZXQgZmlsZSBiZWZvcmUgdXBsb2FkIGJlZ2lucyAodG8gZmlndXJlIG91dCB3aGljaCBvZmZzZXQgdG8KICAgdXNlKS4gVXNlIC1DIHRvIHNwZWNpZnkgdGhlIG9mZnNldCB5b3Vyc2VsZiEgLUMgaXMgaGFuZHkgaWYgeW91J3JlIGRvaW5nCiAgIHRoZSBvdXRwdXQgdG8gc29tZXRoaW5nIGVsc2UgYnV0IGEgcGxhaW4gZmlsZSBvciB3aGVuIHlvdSBqdXN0IHdhbnQgdG8gZ2V0CiAgIHRoZSBlbmQgb2YgYSBmaWxlLgogLSByZWN1cnNpdmVmdHBnZXQucGwgbm93IGZlYXR1cmVzIGEgbWF4aW11bSByZWN1cnNpdmUgbGV2ZWwgYXJndW1lbnQuCgpWZXJzaW9uIDQuNwogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkZGVkIHN1cHBvcnQgdG8gYWJvcnQgYSBkb3dubG9hZCBpZiB0aGUgc3BlZWQgaXMgYmVsb3cgYSBjZXJ0YWluIGFtb3VudAogICAoc3BlZWQtbGltaXQpIGJ5dGVzIHBlciBzZWNvbmQgZm9yIGEgY2VydGFpbiAoc3BlZWQtdGltZSkgdGltZS4KIC0gV3JvdGUgYSBwZXJsIHNjcmlwdCAncmVjdXJzaXZlZnRwZ2V0LnBsJyB0byByZWN1cnNpdmVseSB1c2UgY3VybCB0byBnZXQgYQogICB3aG9sZSBmdHAgZGlyZWN0b3J5IHRyZWUuIEl0IGlzIG1lYW50IGFzIGFuIGV4YW1wbGUgb2YgaG93IGN1cmwgY2FuIGJlCiAgIHVzZWQuICBJIGFncmVlIGl0IGlzbid0IHRoZSB3aXNlc3QgdGhpbmcgdG8gZG8gdG8gbWFrZSBhIHNlcGFyYXRlIG5ldwogICBjb25uZWN0aW9uIGZvciBlYWNoIGZpbGUgYW5kIGRpcmVjdG9yeSBmb3IgdGhpcy4KClZlcnNpb24gNC42CiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgYSBmaXJzdCBhdHRlbXB0IHRvIG9wdGlvbmFsbHkgcGFyc2UgdGhlIC5uZXRyYyBmaWxlIGZvciBsb2dpbiB1c2VyCiAgIGFuZCBwYXNzd29yZC4gSWYgdXNlZCB3aXRoIGh0dHAsIGl0IGVuYWJsZXMgdXNlciBhdXRoZW50aWNhdGlvbi4gLW4gaXMKICAgdGhlIG5ldyBzd2l0Y2guCiAtIFJlbW92ZWQgdGhlIGV4dHJhIG5ld2xpbmVzIG9uIHRoZSBkZWZhdWx0IHVzZXItYWdlbnQgc3RyaW5nLgogLSBDb3JyZWN0ZWQgdGhlIG1pc3NpbmcgZnRwIHVwbG9hZCBlcnJvciBtZXNzYWdlcyB3aGVuIGl0IGZhaWxlZCB3aXRob3V0IHRoZQogICB2ZXJib3NlIGZsYWcgc2V0LiBHYXJ5IFcuIFN3ZWFyaW5nZW4gZm91bmQgaXQuCiAtIE5vdyB1c2luZyBhbGFybSgpIHRvIGVuYWJsZSBzZWNvbmQtcHJlY2lzaW9uIHRpbWVvdXQgZXZlbiBvbiB0aGUgbmFtZQogICByZXNvbHZpbmcvY29ubmVjdGluZyBwaGFzZS4gVGhlIHRpbWVvdXQgaXMgYWx0aG91Z2ggcmVzZXQgYWZ0ZXIgdGhhdCBmaXJzdAogICBzZXF1ZW5jZS4gKFRoaXMgc2hvdWxkIGJlIGNvcnJlY3RlZC4pIEdhcnkgVy4gU3dlYXJpbmdlbiByZXBvcnRlZC4KIC0gTm93IHNwZWxscyAiVW5rbm93biIgcHJvcGVybHksIGFzIGluICJVbmtub3duIG9wdGlvbiAneiciLi4uIDotKQogLSBBZGRlZCBidWcgcmVwb3J0IGVtYWlsIGFkZHJlc3MgaW4gdGhlIFJFQURNRS4KIC0gQWRkZWQgYSAiY3VycmVudCBzcGVlZCIgZmllbGQgdG8gdGhlIHByb2dyZXNzIG1ldGVyLiBJdCBzaG93cyB0aGUgYXZlcmFnZQogICBzcGVlZCB0aGUgbGFzdCA1IHNlY29uZHMuIFRoZSBvdGhlciBzcGVlZCBmaWVsZCBzaG93cyB0aGUgYXZlcmFnZSBzcGVlZCBvZgogICB0aGUgZW50aXJlIHRyYW5zZmVyIHNvIGZhci4KClZlcnNpb24gNC41LjEKIExpbmFzIFZlcHN0YXMKIC0gU1NMIHRocm91Z2ggcHJveHkgZml4CiAtIEFkZGVkIC1BIHRvIGFsbG93IFVzZXItQWdlbnQ6IGNoYW5nZXMKCiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFkZSB0aGUgLUEgd29yayB3aGVuIFNTTC10aHJvdWdoLXByb3h5LgoKVmVyc2lvbiA0LjUKIExpbmFzIFZlcHN0YXMKIC0gTW9yZSBTU0wgY29ycmVjdGlvbnMKIC0gSSd2ZSBhZGRlZCBhIHBvcnQgdG8gQUlYLgogLSBydW5uaW5nIFNTTCB0aHJvdWdoIGEgcHJveHkgY2F1c2VzIGEgY2h1bmsgb2YgY29kZSB0byBiZSBleGVjdXRyZWQgdHdpY2UuCiAgIG9uZSBvZiB0aG9zZSBibG9ja3MgbmVlZHMgdG8gYmUgZGVsZXRlZC4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFkZSAtaSBhbmQgLUkgd29yayBhZ2FpbgoKVmVyc2lvbiA0LjQKIExpbmFzIFZlcHN0YXMKIC0gLXggY2FuIG5vdyBhbHNvIHNwZWNpZnkgcHJveHlwb3J0IHdoZW4gdXNlZCBhcyBpbiAncHJveHlob3N0OnByb3h5cG9ydCcKIC0gU1NMIGZpeGVzCgpWZXJzaW9uIDQuMwogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkanVzdGVkIHRvIGNvbXBpbGUgdW5kZXIgd2luMzIgKFZpc3VhbEMrKyA1KS4gVGhlIC1QIHN3aXRjaCBkb2VzIG5vdAogICBzdXBwb3J0IG5ldHdvcmsgaW50ZXJmYWNlIG5hbWVzIGluIHdpbjMyLiBJIGNvdWxkbid0IGZpZ3VyZSBvdXQgaG93IQoKVmVyc2lvbiA0LjIKIExpbmFzIFZlcHN0YXMgLyBTYW1wbyBLZWxsb21ha2kKIC0gQWRkZWQgU1NMIC8gU1NMZWF5IHN1cHBvcnQgKGh0dHBzOi8vKQogLSBBZGRlZCB0aGUgLVQgdXNhZ2UgZm9yIEhUVFAgUE9TVC4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gQnVnZml4ZWQgdGhlIFNTTCBpbXBsZW1lbnRhdGlvbi4KIC0gTWFkZSAtUCBhIGxvdCBiZXR0ZXIgdG8gdXNlIG90aGVyIElQIGFkZHJlc3Nlcy4gSXQgbm93IGFjY2VwdHMgYSBmb2xsb3dpbmcKICAgcGFyYW1ldGVyIHRoYXQgY2FuIGJlIGVpdGhlcgogICAgICAgIGludGVyZmFjZSAtIGkuZSAiZXRoMCIgdG8gc3BlY2lmeSB3aGljaCBpbnRlcmZhY2UncyBJUCBhZGRyZXNzIHlvdQogICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gdXNlCiAgICAgICAgSVAgYWRkcmVzcyAtIGkuZSAiMTkyLjE2OC4xMC4xIiB0byBzcGVjaWZ5IGV4YWN0IElQIG51bWJlcgogICAgICAgIGhvc3QgbmFtZSAtIGkuZSAibXkuaG9zdC5kb21haW4iIHRvIHNwZWNpZnkgbWFjaGluZQogICAgICAgICItIiAgICAgICAtIChhbnkgc2luZ2xlLWxldHRlciBzdHJpbmcpIHRvIG1ha2UgaXQgcGljayB0aGUgbWFjaGluZSdzCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdAogLSBUaGUgTWFrZWZpbGUgaXMgbm93IHJlYWR5IHRvIGNvbXBpbGUgZm9yIHNvbGFyaXMsIHN1bm9zNCBhbmQgbGludXggcmlnaHQKICAgb3V0IG9mIHRoZSBib3guCiAtIEJldHRlciBnZW5lcmF0ZWQgdmVyc2lvbiBzdHJpbmcgc2VlbiB3aXRoICdjdXJsIC1WJwoKVmVyc2lvbiA0LjEKIERhbmllbCBTdGVuYmVyZwogLSBUaGUgSVAgbnVtYmVyIHJldHVybmVkIGJ5IHRoZSBmdHAgc2VydmVyIGFzIGEgcmVwbHkgdG8gUEFTViBkb2VzIG5vIGxvbmdlcgogICBoYXZlIHRvIEROUyByZXNvbHZlLiBJbiBmYWN0LCBubyBJUC1udW1iZXItb25seSBhZGRyZXNzZXMgaGF2ZSB0byBhbnltb3JlLgogLSBCaW5kcyBiZXR0ZXIgdG8gYXZhaWxhYmxlIHBvcnQgd2hlbiAtUCBpcyB1c2VkLgogLSBOb3cgTElTVHMgLi8gaW5zdGVhZCBvZiAvIHdoZW4gdXNlZCBhcyBpbiBmdHA6Ly9mdHAuZnVuZXQuZmkvLiBUaGUgcmVhc29uCiAgIGZvciB0aGlzIGlzIHRoYXQgZXhhY3RseSB0aGF0IHNpdGUsIGZ0cC5mdW5ldC5maSwgZG9lcyBub3QgYWxsb3cgTElTVCAvCiAgIHdoaWxlIExJU1QgLi8gaXMgZmluZS4gQW55IG9iamVjdGlvbnM/CgpWZXJzaW9uIDQgKDE5OTgtMDMtMjApCiBEYW5pZWwgU3RlbmJlcmcKIC0gSSB0b29rIGFub3RoZXIgaHVnZSBzdGVwIGFuZCBjaGFuZ2VkIGJvdGggdmVyc2lvbiBudW1iZXIgYW5kIHByb2plY3QgbmFtZSEKICAgVGhlIHJlYXNvbiBmb3IgdGhlIG5ldyBuYW1lIGlzIHRoYXQgdGhlcmUgYXJlIGp1c3Qgb25lIHRvbyBtYW55IHByb2dyYW1zCiAgIG5hbWVkIHVybGdldCBhbHJlYWR5IGFuZCB0aGlzIHByb2dyYW0gYWxyZWFkeSBjYW4gYSBsb3QgbW9yZSB0aGFuIG1lcmVseQogICBnZXR0aW5nIFVSTHMsIGFuZCB0aGUgcmVhc29uIGZvciB0aGUgdmVyc2lvbiBudW1iZXIgaXMgdGhhdCBJIGRpZCBhZGQgdGhlCiAgIHByZXR0eSBiaWcgY2hhbmdlIGluIC1QIGFuZCBzaW5jZSBJIGNoYW5nZWQgbmFtZSBJIHdhbnRlZCB0byBzdGFydCB3aXRoCiAgIHNvbWV0aGluZyBmcmVzaCEKIC0gVGhlIC0tc3R5bGUgZmxhZ3MgYXJlIHdvcmtpbmcgYmV0dGVyIG5vdy4KIC0gTGlzdGluZyBkaXJlY3RvcmllcyB3aXRoIEZUUCBvZnRlbiByZXBvcnRlZCB0aGF0IHRoZSBmaWxlIHRyYW5zZmVyIHdhcwogICBpbmNvbXBsZXRlLiBXcm9uZyBhc3N1bXB0aW9ucyB3ZXJlIHRvbyBjb21tb24gZm9yIGRpcmVjdG9yaWVzLCB3aHkgbm8KICAgc2l6ZSB3aWxsIGJlIGF0dGVtcHRlZCB0byBnZXQgY29tcGFyZWQgb24gdGhlbSBmcm9tIG5vdyBvbi4KIC0gSW1wbGVtZW50ZWQgdGhlIC1QIGZsYWcgdGhhdCBsZXQncyB0aGUgZnRwIGNvbnRyb2wgaXNzdWUgYSBQT1JUIGNvbW1hbmQKICAgaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgUEFTVi4KIC0gLWEgZm9yIGFwcGVuZGluZyBGVFAgdXBsb2FkcyB3b3Jrcy4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKVmVyc2lvbiAzLjEyICgxNCBNYXJjaCAxOTk4KQogRGFuaWVsIFN0ZW5iZXJnCiAtIEVuZC1vZi1oZWFkZXIgdHJhY2tpbmcgc3RpbGwgbGFja2VkIHN1cHBvcnQgZm9yIFxyXG4gb3IganVzdCBcbiBhdCB0aGUKICAgZW5kIG9mIHRoZSBsYXN0IGhlYWRlciBsaW5lLgogU2VyZ2lvIEJhcnJlc2kKIC0gQWRkZWQgUFJPWFkgYXV0aGVudGljYXRpb24uCiBSYWZhZWwgU2FndWxhCiAtIEZpeGVkIHNvbWUgbGl0dGxlIGJ1Z3MuCgpWZXJzaW9uIDMuMTEKIERhbmllbCBTdGVuYmVyZwogLSBUaGUgaGVhZGVyIHBhcnNpbmcgd2FzIHN0aWxsIG5vdCBjb3JyZWN0IHNpbmNlIHRoZSAzLjIgbW9kaWZpY2F0aW9uLi4uCgpWZXJzaW9uIDMuMTAKIERhbmllbCBTdGVuYmVyZwogLSAzLjcgYW5kIDMuOSB3ZXJlIHNpbXVsdGFuZW91c2x5IGRldmVsb3BlZCBhbmQgbWVyZ2VkIGludG8gdGhpcyB2ZXJzaW9uLgogLSBGVFAgdXBsb2FkIGRpZCBub3Qgd29yayBjb3JyZWN0bHkgc2luY2UgMy4yLgoKVmVyc2lvbiAzLjkKIFJhZmFlbCBTYWd1bGEKIC0gQWRkZWQgdGhlICItZSA8dXJsPiAvIC0tcmVmZXJlciA8dXJsPiIgb3B0aW9uIHdoZXJlIHdlIGNhbiBzcGVjaWZ5CiAgIHRoZSByZWZlcmVyIHBhZ2UuIE9idmlvdXNseSwgdGhpcyBpcyBuZWNlc3Nhcnkgb25seSB0byBmb29sIHRoZQogICBzZXJ2ZXIsIGJ1dC4uLgoKVmVyc2lvbiAzLjcKIERhbmllbCBTdGVuYmVyZwogLSBOb3cgY2hlY2tzIHRoZSBsYXN0IGVycm9yIGNvZGUgc2VudCBmcm9tIHRoZSBmdHAgc2VydmVyIGFmdGVyIGEgZmlsZSBoYXMKICAgYmVlbiByZWNlaXZlZCBvciB1cGxvYWRlZC4gV2Fzbid0IGRvbmUgcHJldmlvdXNseS4KIC0gV2hlbiAndXJsZ2V0IDxob3N0PicgaXMgdXNlZCB3aXRob3V0IGEgJ3Byb3RvY29sOi8vJyBmaXJzdCBpbiB0aGUgaG9zdCBwYXJ0LAogICBpdCBub3cgY2hlY2tzIGZvciBob3N0IG5hbWVzIHN0YXJ0aW5nIHdpdGggZnRwIG9yIGdvcGhlciBhbmQgaWYgaXQgZG9lcywKICAgaXQgdXNlcyB0aGF0IHByb3RvY29sIGJ5IGRlZmF1bHQgaW5zdGVhZCBvZiBodHRwLgoKVmVyc2lvbiAzLjYKIERhbmllbCBTdGVuYmVyZwogLSBTaWxseSBtaXN0YWtlIG1hZGUgdGhlIFBPU1QgYnVnLiBUaGlzIGhhcyBub3cgYWxzbyBiZWVuIHRlc3RlZCB0byB3b3JrIHdpdGgKICAgcHJveHkuCgpWZXJzaW9uIDMuNQogRGFuaWVsIFN0ZW5iZXJnCiAtIEhpZ2hseSBpbnNwaXJlZCBieSBSYWZhZWwgU2FndWxhJ3MgY2hhbmdlcyB0byB0aGUgMy4xIHRoYXQgYWRkZWQgYW4gYWxtb3N0CiAgIGZ1bmN0aW9uYWwgUE9TVCwgSSBhcHBsaWVkIGhpcyBjaGFuZ2VzIGludG8gdGhpcyB2ZXJzaW9uIGFuZCBtYWRlIHRoZW0gd29yay4KICAgKEl0IHNlZW1zIFBPU1QgcmVxdWlyZXMgdGhlIENvbnRlbnQtVHlwZSBhbmQgQ29udGVudC1MZW5ndGggaGVhZGVycy4pIEl0IGlzCiAgIG5vdyB1c2FibGUgd2l0aCB0aGUgLWQgc3dpdGNoLgoKVmVyc2lvbiAzLjMgLSAzLjQKIFBhc3NlZCB0byBhdm9pZCBjb25mdXNpb25zCgpWZXJzaW9uIDMuMgogRGFuaWVsIFN0ZW5iZXJnCiAtIE1ham9yIHJld3JpdGUgb2YgdHdvIGNydWNpYWwgcGFydHMgb2YgdGhpcyBjb2RlOiB1cGxvYWQgYW5kIGRvd25sb2FkLgogICBUaGV5IGFyZSBib3RoIG5vdyB1c2luZyBhIHNlbGVjdCgpIHN3aXRjaCwgdGhhdCBhbGxvd3MgbXVjaCBiZXR0ZXIKICAgcHJvZ3Jlc3MgbWV0ZXIgYW5kIHRpbWUgY29udHJvbC4KIC0gYWxhcm0oKSB1c2FnZSByZW1vdmVkIGNvbXBsZXRlbHkKIC0gRlRQIGdldCBjYW4gbm93IGxpc3QgZGlyZWN0b3J5IGNvbnRlbnRzIGlmIHRoZSBwYXRoIGVuZHMgd2l0aCBhIHNsYXNoICcvJy4KICAgVXJsZ2V0IG9uIGEgZnRwLXBhdGggdGhhdCBkb2Vzbid0IGVuZCB3aXRoIGEgc2xhc2ggbWVhbnMgdXJsZ2V0IHdpbGwKICAgYXR0ZW1wdCBnZXR0aW5nIGl0IGFzIGEgZmlsZSBuYW1lLgogLSBGVFAgZGlyZWN0b3J5IHZpZXcgc3VwcG9ydHMgLWwgZm9yICJsaXN0LW9ubHkiIHdoaWNoIGxpc3RzIHRoZSBmaWxlIG5hbWVzCiAgIG9ubHkuCiAtIEFsbCBvcGVyYXRpb25zIHN1cHBvcnQgLW0gZm9yIG1heCB0aW1lIHVzYWdlIGluIHNlY29uZHMgYWxsb3dlZC4KIC0gRlRQIHVwbG9hZCBub3cgYWxsb3dzIHRoZSBzaXplIG9mIHRoZSB1cGxvYWRlZCBmaWxlIHRvIGJlIHByb3ZpZGVkLCBhbmQKICAgdGh1cyBpdCBjYW4gYmV0dGVyIGNoZWNrIGl0IGFjdHVhbGx5IHVwbG9hZGVkIHRoZSB3aG9sZSBmaWxlLiBJdCBhbHNvCiAgIG1ha2VzIHRoZSBwcm9ncmVzcyBtZXRlciBmb3IgdXBsb2FkcyBtdWNoIGJldHRlciEKIC0gTWFkZSB0aGUgcGFyYW1ldGVyIHBhcnNpbmcgZmFpbCBpbiBjYXNlcyBsaWtlICd1cmxnZXQgLXIgOTAwJyB3aGljaAogICBwcmV2aW91c2x5IHRyaWVkIHRvIGNvbm5lY3QgdG8gdGhlIGhvc3QgbmFtZWQgJzkwMCcuCgpWZXJzaW9uIDMuMQogS2plbGwgRXJpY3NvbgogLSBQb2ludGVkIG91dCBob3cgdG8gY29ycmVjdCB0aGUgMyB3YXJuaW5ncyBpbiB3aW4zMi1jb21waWxlcy4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gUmVtb3ZlZCBhbGwgY2FsbHMgdG8gZXhpdCgpLgogLSBNYWRlIHRoZSBzaG9ydCBoZWxwIHRleHQgZ2V0IHdyaXR0ZW4gdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyLgogLSBNYWRlIHRoaXMgZmlsZSBpbnN0ZWFkIG9mIGtlZXBpbmcgdGhlc2UgY29tbWVudHMgaW4gdGhlIHNvdXJjZS4KIC0gTWFkZSB0d28gY2FsbGJhY2sgaG9va3MsIHRoYXQgZW5hYmxlIGV4dGVybmFsIHByb2dyYW1zIHRvIHVzZSB1cmxnZXQoKQogICBlYXNpZXIgYW5kIHRvIGdyYWIgdGhlIG91dHB1dC9vZmZlciB0aGUgaW5wdXQgZWFzaWVyLgogLSBJdCBpcyBldmlkZW50IHRoYXQgV2luMzItY29tcGlsZXMgYXJlIHBhaW5mdWwuIEkgd2F0Y2hlZCB0aGUgb3V0cHV0IGZyb20KICAgdGhlIEJvcmxhbmQgQysrIHY1IGFuZCBpdCB3YXMgYXdmdWwuIEp1c3QgaWdub3JlIGFsbCB0aG9zZSB3YXJuaW5ncy4KClZlcnNpb24gMy4wCiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgRlRQIHVwbG9hZCBjYXBhYmlsaXRpZXMuIFRoZSBuYW1lIHVybGdldCBnZXRzIGEgYml0IHNpbGx5IG5vdwogICB3aGVuIHdlIGNhbiBwdXQgdG9vLi4uID0pCiAtIFJlc3RydWN0dXJlZCB0aGUgc291cmNlIHF1aXRlIGEgbG90LgogICBDaGFuZ2VkIHRoZSB1cmxnZXQoKSBpbnRlcmZhY2UuIFRoaXMgd2F5LCB3ZSB3aWxsIHN1cnZpdmUgY2hhbmdlcyBtdWNoCiAgIGJldHRlci4gTmV3IGZlYXR1cmVzIGNhbiBjb21lIGFuZCBvbGQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCB1cyBuZWVkaW5nCiAgIHRvIGNoYW5nZSB0aGUgaW50ZXJmYWNlLiBJJ3ZlIHdyaXR0ZW4gYSBzbWFsbCBleHBsYW5hdGlvbiBpbiB1cmxnZXQuaAogICB0aGF0IGV4cGxhaW5zIGl0LgogLSBOZXcgZmxhZ3MgaW5jbHVkZSAtdCwgLVQsIC1PIGFuZCAtaC4gVGhlIC1oIHRleHQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBuZXcKICAgbWtoZWxwIHNjcmlwdC4KClZlcnNpb24gMi45CiBSZW1jbyB2YW4gSG9vZmYKIC0gQWRkZWQgYSBmaXggdG8gbWFrZSBpdCBjb21waWxlIHNtb290aGx5IG9uIEFtaWdhIHVzaW5nIHRoZSBTQVMvQwogICBjb21waWxlci4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gQmVsaWV2ZSBpdCBvciBub3QsIGJ1dCB0aGUgU1RVUElEIE5vdmVsbCB3ZWIgc2VydmVyIHNlZW1zIHRvIHJlcXVpcmUKICAgdGhhdCB0aGUgSG9zdDoga2V5d29yZCBpcyB1c2VkLCBzbyB3ZWxsIEkgdXNlIGl0IGFuZCBJIChyZS1pbnRyb2R1Y2UpIHRoZQogICB1cmxnZXQgVXNlci1BZ2VudDouIEkgc3RpbGwgaGF2ZSB0byBjaGVjayB0aGF0IHRoaXMgSG9zdDogdXNhZ2Ugd29ya3Mgd2l0aAogICBwcm94aWVzLi4uICdIb3N0OicgaXMgcmVxdWlyZWQgZm9yIEhUVFAvMS4xIEdFVCBhY2NvcmRpbmcgdG8gUkZDMjA2OC4KClZlcnNpb24gMi44CiBSYWZhZWwgU2FndWxhCiAtIHNvbWUgbGl0dGxlIG1vZGlmaWNhdGlvbnMKClZlcnNpb24gMi43CiBEYW5pZWwgU3RlbmJlcmcKIC0gUmVtb3ZlZCB0aGUgLWwgb3B0aW9uIGFuZCBpbnRyb2R1Y2VkIHRoZSAtZiBvcHRpb24gaW5zdGVhZC4gTm93IEknbGwKICAgcmV3cml0ZSB0aGUgZm9ybWVyIC1sIGtsdWRnZSBpbiBhbiBleHRlcm5hbCBzY3JpcHQgdGhhdCdsbCB1c2UgdXJsZ2V0IHRvCiAgIGZldGNoIG11bHRpcGFydCBmaWxlcyBsaWtlIHRoYXQuCiAtICctZicgaXMgaW50cm9kdWNlZCwgaXQgbWVhbnMgRmFpbCB3aXRob3V0IG91dHB1dCBpbiBjYXNlIG9mIEhUVFAgc2VydmVyCiAgIGVycm9ycyAocmV0dXJuIGNvZGUgPj00MDApLgogLSBBZGRlZCBzdXBwb3J0IGZvciAtciwgcmFuZ2VzLiBTcGVjaWZ5IHdoaWNoIHBhcnQgb2YgYSBkb2N1bWVudCB5b3UKICAgd2FudCwgYW5kIG9ubHkgdGhhdCBwYXJ0IGlzIHJldHVybmVkLiBPbmx5IHdpdGggSFRUUC8xLjEtc2VydmVycy4KIC0gU3BsaXQgdXAgdGhlIHNvdXJjZSBpbiAzIHBhcnRzLiBOb3cgYWxsIHB1cmUgVVJMIGZ1bmN0aW9ucyBhcmUgaW4KICAgdXJsZ2V0LmMgYW5kIHN0dWZmIHRoYXQgZGVhbHMgd2l0aCB0aGUgc3RhbmQtYWxvbmUgcHJvZ3JhbSBpcyBpbiBtYWluLmMuCiAtIEkgdG9vayBhIGZldyBtaW51dGVzIGFuZCB3cm90ZSBhbiBlbWJyeW8gb2YgYSBSRUFETUUgZmlsZSB0byBleHBsYWluCiAgIGEgZmV3IHRoaW5ncy4KClZlcnNpb24gMi42CiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFkZSB0aGUgLWwgKGxvb3ApIHRoaW5nIHVzZSB0aGUgbmV3IENPTkZfRkFJTE9ORVJST1Igd2hpY2ggbWFrZXMKICAgdXJsZ2V0KCkgcmV0dXJuIGVycm9yIGNvZGUgaWYgbm9uLXN1Y2Nlc3NmdWwuIEl0IGFsc28gd29uJ3Qgb3V0cHV0IGFueXRoaW5nCiAgIHRoZW4uIE5vdyBmaW5hbGx5IHJlbW92ZWQgdGhlIEhUVFAgMS4wIGFuZCBlcnJvciA0MDQgZGVwZW5kZW5jaWVzLgogLSBBZGRlZCAtSSB3aGljaCB1c2VzIHRoZSBIRUFEIHJlcXVlc3QgdG8gZ2V0IHRoZSBoZWFkZXIgb25seSBmcm9tIGEKICAgaHR0cC1zZXJ2ZXIuCgpWZXJzaW9uIDIuNQogUmFmYWVsIFNhZ3VsYQogLSBNYWRlIHRoZSBwcm9ncmVzcyBtZXRlciB1c2UgSEhIOk1NOlNTIGluc3RlYWQgb2Ygb25seSBzZWNvbmRzLgoKVmVyc2lvbiAyLjQKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBwcm9ncmVzcyBtZXRlci4gSXQgYXBwZWFycyB3aGVuIGRvd25sb2FkaW5nID4gQlVGRkVSIFNJWkUgYW5kCiAgIG11dGUgaXMgbm90IHNlbGVjdGVkLiBJIGZvdW5kIG91dCB0aGF0IHdoZW4gZG93bmxvYWRpbmcgbGFyZ2UgZmlsZXMgZnJvbQogICByZWFsbHkgcmVhbGx5IHNsb3cgc2l0ZXMsIGl0IGlzIGRlc2lyYWJsZSB0byBrbm93IHRoZSBzdGF0dXMgb2YgdGhlCiAgIGRvd25sb2FkLiBEbyBub3RlIHRoYXQgc29tZSBkb3dubG9hZHMgYXJlIGRvbmUgdW5hd2FyaW5nIG9mIHRoZSBzaXplLCB3aGljaAogICBtYWtlcyB0aGUgcHJvZ3Jlc3MgbWV0ZXIgbGVzcyB0aHJpbGxpbmcgOykgSWYgdGhlIG91dHB1dCBpcyBzZW50IHRvIGEgdHR5LAogICB0aGUgcHJvZ3Jlc3MgbWV0ZXIgaXMgc2h1dCBvZmYuCiAtIEluY3JlYXNlZCBidWZmZXIgc2l6ZSB1c2VkIGZvciByZWFkaW5nLgogLSBBZGRlZCBsZW5ndGggY2hlY2tzIGluIHRoZSB1c2VyK3Bhc3N3ZCBwYXJzaW5nLgogLSBNYWRlIGl0IGdyb2sgdXNlcitwYXNzd2QgZm9yIEhUVFAgZmV0Y2hlcy4gVGhlIHRyaWNrIGlzIHRvIGJhc2U2NAogICBlbmNvZGUgdGhlIHVzZXIrcGFzc3dkIGFuZCBzZW5kIGFuIGV4dHJhIGhlYWRlciBsaW5lLiBSZWFkIGNoYXB0ZXIgMTEuMSBpbgogICBSRkMyMDY4IGZvciBkZXRhaWxzLiBJIGFkZGVkIGl0IHRvIGJlIHVzZWQganVzdCBsaWtlIHRoZSBmdHAgb25lLiAgVG8gZ2V0IGEKICAgaHR0cCBkb2N1bWVudCBmcm9tIGEgcGxhY2UgdGhhdCByZXF1aXJlcyB1c2VyIGFuZCBwYXNzd29yZCwgdXNlIGFuIFVSTAogICBsaWtlOgoKICAgICAgICBodHRwOi8vdXNlcjpwYXNzd2RAd3d3LnNpdGUudG8ubGVhY2gvZG9jLmh0bWwKCiAgIEkgYWxzbyBhZGRlZCB0aGUgLXUgZmxhZywgc2luY2UgV0hFTiBVU0lORyBBIFBST1hZIFlPVSBDQU4nVCBTUEVDSUZZIFRIRQogICBVU0VSIEFORCBQQVNTV09SRCBXSVRIIEhUVFAgTElLRSBUSEFULiBUaGUgLXUgZmxhZyB3b3JrcyBmb3IgZnRwIHRvbywgYnV0CiAgIG5vdCBpZiB1c2VkIHdpdGggcHJveHkuIFRvIGRvIHRoZSBzYW1lIGFzIHRoZSBhYm92ZSBvbmUsIHlvdSBjYW4gaW52b2tlOgoKICAgICAgICB1cmxnZXQgLXUgdXNlcjpwYXNzd2QgaHR0cDovL3d3dy5zaXRlLnRvLmxlYWNoL2RvYy5odG1sCgpWZXJzaW9uIDIuMwogUmFmYWVsIFNhZ3VsYQogLSBBZGRlZCAiLW8iIG9wdGlvbiAob3V0cHV0IGZpbGUpCiAtIEFkZGVkIFVSR19IVFRQX05PVF9GT1VORCByZXR1cm4gY29kZS4KICAgKERhbmllbCdzIG5vdGU6KQogICBQZXJoYXBzIHdlIHNob3VsZCBkZXRlY3QgYWxsIGtpbmRzIG9mIGVycm9ycyBhbmQgaW5zdGVhZCBvZiB3cml0aW5nIHRoYXQKICAgY3VzdG9tIHN0cmluZyBmb3IgdGhlIHBhcnRpY3VsYXIgNDA0LWVycm9yLCB1c2UgdGhlIGVycm9yIHRleHQgd2UgYWN0dWFsbHkKICAgZ2V0IGZyb20gdGhlIHNlcnZlci4gU2VlIGZ1cnRoZXIgZGV0YWlscyBpbiBSRkMyMDY4IChIVFRQIDEuMQogICBkZWZpbml0aW9uKS4gVGhlIGN1cnJlbnQgd2F5IGFsc28gcmVsaWVzIG9uIGEgSFRUUC8xLjAgcmVwbHksIHdoaWNoIG5ld2VyCiAgIHNlcnZlcnMgbWlnaHQgbm90IGRvLgogLSBMb29waW5nIG1vZGUgKCItbCIgb3B0aW9uKS4gSXQncyBlYXNpZXIgdG8gZ2V0IHZhcmlvdXMgc3BsaXQgZmlsZXMuCiAgIChEYW5pZWwncyBub3RlOikKICAgVXNlIGl0IGxpa2UgJ3VybGdldCAtbCAxIGh0dHA6Ly9mcm9tLnRoaXMuc2l0ZS9maWxlJWQuaHRtbCcsIHdoaWNoIHdpbGwKICAgbWFrZSB1cmxnZXQgdG8gYXR0ZW1wdCB0byBmZXRjaCBhbGwgZmlsZXMgbmFtZWQgZmlsZTEuaHRtbCwgZmlsZTIuaHRtbCBldGMKICAgdW50aWwgbm8gbW9yZSBmaWxlcyBhcmUgZm91bmQuIFRoaXMgaXMgb25seSBhIG1vZGlmaWNhdGlvbiBvZiB0aGUKICAgU1RBTkRfQUxPTkUgcGFydCwgbm90aGluZyBpbiB0aGUgdXJsZ2V0KCkgZnVuY3Rpb24gd2FzIG1vZGZpZmllZCBmb3IgdGhpcy4KIERhbmllbCBTdGVuYmVyZwogLSBDaGFuZ2VkIHRoZSAtaCB0byBiZSAtaSBpbnN0ZWFkLiAtaCBzaG91bGQgYmUgcHJlc2VydmVkIHRvIGhlbHAgdXNlLgogLSBCam9ybiBSZWVzZSBpbmRpY2F0ZWQgdGhhdCBCb3JsYW5kIF9taWdodF8gdXNlICdfV0lOMzInIGluc3RlYWQgb2YgdGhlCiAgIFZDKysgV0lOMzIgZGVmaW5lIGFuZCB0aGVyZWZvcmUgSSBhZGRlZCBhIGxpdHRsZSBmaXggZm9yIHRoYXQuCgpWZXJzaW9uIDIuMgogSm9oYW4gQW5kZXJzc29uCiAtIFRoZSB1cmxnZXQgZnVuY3Rpb24gZGlkbid0IHNldCB0aGUgcGF0aCB0byB1cmwgd2hlbiB1c2luZyBwcm94eS4KIC0gRml4ZWQgYnVnIHdpdGggSU1DIHByb3h5LiBOb3cgdXNpbmcgKGFsbW9zdCkgY29tcGxldGUgR0VUIGNvbW1hbmQuCgogRGFuaWVsIFN0ZW5iZXJnCiAtIE1hZGUgaXQgY29tcGlsZSBvbiBTb2xhcmlzLiBIYWQgdG8gcmVvcmdhbml6ZSB0aGUgaW5jbHVkZXMgYSBiaXQuCiAgIChzbyBXaW4zMiwgTGludXgsIFN1bk9TIDQgYW5kIFNvbGFyaXMgMiBjb21waWxlIGZpbmUuKQogLSBNYWRlIEpvaGFuJ3Mga2VlcGFsaXZlIGtleXdvcmQgb3B0aW9uYWwgd2l0aCB0aGUgLWsgZmxhZyAoc2luY2UgaXQKICAgbWFrZXMgYSBsb3Qgb2YgdXJsZ2V0cyB0YWtlIGEgbG90IGxvbmdlciB0aW1lKS4KIC0gTWFkZSBhICctaCcgc3dpdGNoIGluIGNhc2UgeW91IHdhbnQgdGhlIEhUVFAtaGVhZGVyIGluIHRoZSBvdXRwdXQuCgpWZXJzaW9uIDIuMQogRGFuaWVsIFN0ZW5iZXJnIGFuZCBLamVsbCBFcmljc29uCiAtIFdpbjMyLWNvbXBpbGFibGUKIC0gTm8gbW9yZSBnbG9iYWwgdmFyaWFibGVzCiAtIE11dGUgb3B0aW9uIChubyBvdXRwdXQgYXQgYWxsIHRvIHN0ZGVycikKIC0gRnVsbCByYW5nZSBvZiByZXR1cm4gY29kZXMgZnJvbSB1cmxnZXQoKSwgd2hpY2ggaXMgbm93IHdyaXR0ZW4gdG8gYmUgYQogICBmdW5jdGlvbiBmb3IgZWFzeS10by11c2UgaW4gW290aGVyXSBwcm9ncmFtcy4KIC0gRGVmaW5lIFNUQU5EX0FMT05FIHRvIGNvbXBpbGUgdGhlIHN0YW5kIGFsb25lIHVybGdldCBwcm9ncmFtCiAtIE5vdyBjb21waWxlcyB3aXRoIGdjYyBvcHRpb25zIC1hbnNpIC1XYWxsIC1wZWRhbnRpYyA7KQoKVmVyc2lvbiAyLjAKIC0gSW50cm9kdWNpbmcgZnRwIEdFVCBzdXBwb3J0LiBUaGUgRlRQIFVSTCB0eXBlIGlzIHJlY29nbml6ZWQgYW5kIHVzZWQuCiAtIFJlbmFtZWQgdGhlIHByb2plY3QgdG8gJ3VybGdldCcuCiAtIFN1cHBvcnRzIHRoZSB1c2VyK3Bhc3N3ZCBpbiB0aGUgRlRQIFVSTCAob3RoZXJ3aXNlIGl0IHRyaWVzIGFub255bW91cwogICBsb2dpbiB3aXRoIGEgd2VpcmQgZW1haWwgYWRkcmVzcyBhcyBwYXNzd29yZCkuCgpWZXJzaW9uIDEuNQogRGFuaWVsIFN0ZW5iZXJnCiAtIFRoZSBza2lwX2hlYWRlcigpIGNyYXAgbWVzc2VkIGl0IHVwIGJpZy10aW1lLiBCeSBzaW1wbHkgcmVtb3ZpbmcgdGhhdAogICBvbmUgd2UgY2FuIGFsbCBvZiBhIHN1ZGRlbiBkb3dubG9hZCBhbnl0aGluZyA7KQogLSBObyBsb25nZXIgcmVxdWlyZXMgYSB0cmFpbGluZyBzbGFzaCBvbiB0aGUgVVJMcy4KIC0gSWYgdGhlIGdpdmVuIFVSTCBpc24ndCBwcmVmaXhlZCB3aXRoICdodHRwOi8vJywgSFRUUCBpcyBhc3N1bWVkIGFuZAogICBnaXZlbiBhIHRyeSEKIC0gJ3ZvaWQgbWFpbigpJyBpcyBoaXN0b3J5LgoKVmVyc2lvbiAxLjQKIERhbmllbCBTdGVuYmVyZwogLSBUaGUgZ29waGVyIHNvdXJjZSB1c2VkIHRoZSBwcGF0aCB2YXJpYWJsZSBpbnN0ZWFkIG9mIHBhdGggd2hpY2ggY291bGQKICAgbGVhZCB0byBkaXNhc3Rlci4KClZlcnNpb24gMS4zCiBEYW5pZWwgU3RlbmJlcmcKIC0gV2VsbCwgSSBhZGRlZCBhIGxhbWUgdGV4dCBhYm91dCB0aGUgdGltZSBpdCB0b29rIHRvIGdldCB0aGUgZGF0YS4gSSBhbHNvCiAgIGZvdWdodCBhZ2FpbnN0IEpvaGFuIHRvIHByZXZlbnQgaGlzIC1mIG9wdGlvbiAodG8gc3BlY2lmeSBhIGZpbGUgbmFtZQogICB0aGF0IHNob3VsZCBiZSB3cml0dGVuIGluc3RlYWQgb2Ygc3Rkb3V0KSEgPSkKIC0gTWFkZSBpdCB3cml0ZSAnY29ubmVjdGlvbiByZWZ1c2VkJyBmb3IgdGhhdCBwYXJ0aWN1bGFyIGNvbm5lY3QoKQogICBwcm9ibGVtLgogLSBSZW51bWJlcmVkIHRoZSB2ZXJzaW9uLiBMZXQncyBub3QgbWFrZSBzaWxseSAxLjAuWCB2ZXJzaW9ucywgdGhpcyBpcwogICBhIHBsYWluIDEuMyBpbnN0ZWFkLgoKVmVyc2lvbiAxLjIKIEpvaGFuIEFuZGVyc3NvbgogLSBEaXNjb3ZlcmVkIGFuZCBmaXhlZCB0aGUgcHJvYmxlbSB3aXRoIGdldHRpbmcgYmluYXJ5IGZpbGVzLiBwdXRzKCkgaXMKICAgbm93IHJlcGxhY2VkIHdpdGggZndyaXRlKCkuIChEYW5pZWwncyBub3RlOiB0aGlzIGFsc28gZml4ZWQgdGhlIGJ1ZmZlcgogICBvdmVyd3JpdGUgcHJvYmxlbSBJIGZvdW5kIGluIHRoZSBwcmV2aW91cyB2ZXJzaW9uLikKCiBSYWZhZWwgU2FndWxhCiAtIExldCAiLXAiIGJlZm9yZSAiLXgiLgoKIERhbmllbCBTdGVuYmVyZwogLSBCdWdmaXhlZCB0aGUgcHJveHkgdXNhZ2UuIEl0IHNob3VsZCAqTk9UKiB1c2Ugbm9yIHN0cmlwIHRoZSBwb3J0IG51bWJlcgogICBmcm9tIHRoZSBVUkwgYnV0IHNpbXBseSBwYXNzIHRoYXQgaW5mb3JtYXRpb24gdG8gdGhlIHByb3h5LiBUaGlzIGFsc28KICAgbWFkZSB0aGUgdXNlci9wYXNzd29yZCBmaWVsZHMgcG9zc2libGUgdG8gdXNlIGluIHByb3h5IFtmdHAtXSBVUkxzLgogICAobGlrZSBpbiBmdHA6Ly91c2VyOnBhc3N3b3JkQGZ0cC5teS5zaXRlOjgwMjEvUkVBRE1FKQoKIEpvaGFuIEFuZGVyc3NvbgogLSBJbXBsZW1lbnRlZCBIVFRQIHByb3h5IHN1cHBvcnQuCiAtIFJlY2VpdmUgYnl0ZSBjb3VudGVyIGFkZGVkLgoKIEJqb3JuIFJlZXNlCiAtIEltcGxlbWVudGVkIFVSTHMgKGFuZCBza2lwcGVkIHRoZSBvbGQgc3ludGF4KS4KIC0gT3V0cHV0IGlzIHdyaXR0ZW4gdG8gc3Rkb3V0LCBzbyB0byBhY2hpZXZlIHRoZSBhYm92ZSBleGFtcGxlLCBkbzoKICAgaHR0cGdldCBodHRwOi8vMTQzLjU0LjEwLjYvaW5mb19sb2dvLmdpZiA+IHRlc3QuZ2lmCgpWZXJzaW9uIDEuMQogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkanVzdGVkIGl0IHNsaWdodGx5IHRvIGFjY2VwdCBuYW1lZCBob3N0cyBvbiB0aGUgY29tbWFuZCBsaW5lLiBXZQogICB3b3VsZG4ndCB3YW5uYSB1c2UgSVAgbnVtYmVycyBmb3IgdGhlIHJlc3Qgb2Ygb3VyIGxpZmVzLCB3b3VsZCB3ZT8KClZlcnNpb24gMS4wCiAgUmFmYWVsIFNhZ3VsYQogIC0gV3JvdGUgdGhlIGluaXRpYWwgaHR0cGdldCwgd2hpY2ggc3RhcnRlZCBhbGwgdGhpcyEK