ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlbG9nCgpWZXJzaW9uIDcuMTAuNCAoMiBBcHIgMjAwMykKCkRhbmllbCAoMSBBcHIpCi0gQWRkZWQgdGVzdCBjYXNlIDUwNSB0byBleGVyY2lzZSBGVFAgdXBsb2FkIHdpdGggcmVuYW1lIGRvbmUgd2l0aCBsaWJjdXJsLAogIGFuZCBmb3IgdGhhdCBJIGhhZCB0byBleHRlbmQgdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHRvIGRlYWwgd2l0aCB0aGUKICBSTkZSIGFuZCBSTlRPIGNvbW1hbmRzLgoKRGFuaWVsICgzMSBNYXIpCi0gRXZlbiBtb3JlIFNTTCBjb25maWcgY2hlY2sgbW9kaWZpY2F0aW9ucyBhZnRlciBSaWNoYXJkJ3MgdGVzdGluZy4KClZlcnNpb24gNy4xMC40LXByZTYgKDMxIE1hciAyMDAzKQoKRGFuaWVsICgzMSBNYXIpCi0gTW9yZSBmaXhlcyBmb3IgdGhlIFNTTCBzZXNzaW9uIElEIGNhY2hlIGNoZWNrcyB3aGVuIFNTTCBjb25maWdzIGFyZSBjaGFuZ2VkCiAgYmV0d2VlbiBjb25uZWN0aW9ucy4gQmFzZWQgb24gdGVzdHMgYW5kIHRhbGtzIHdpdGggUmljaGFyZCBCcmFtYW50ZS4KCi0gR3VpbGxhdW1lIENvdHRlbmNlYXUgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGFkZGVkIENVUkxPUFRfVU5SRVNUUklDVEVEX0FVVEguCiAgV2hlbiBlbmFibGVkLCBpdCB3aWxsIHByZXZlbnQgbGliY3VybCBmcm9tIGxpbWl0aW5nIHRvIHdoaWNoIGhvc3QgaXQgc2VuZHMKICB1c2VyK3Bhc3N3b3JkIHRvIHdoZW4gZm9sbG93aW5nIGxvY2F0aW9ucy4gQnkgZGVmYXVsdCwgbGliY3VybCBvbmx5IHNlbmRzCiAgbmFtZSBhbmQgcGFzc3dvcmQgdG8gdGhlIG9yaWdpbmFsIGhvc3QgdXNlZCBpbiB0aGUgZmlyc3QgVVJMLCBidXQgd2l0aCB0aGlzCiAgb3B0aW9uIHNldCBpdCB3aWxsIHNlbmQgdGhlIGF1dGggaW5mbyB0byBhbGwgaG9zdHMgaXQgZm9sbG93cyBsb2NhdGlvbgogIGhlYWRlcnMgdG8uIFRoZSBuZXcgdG9vbCBjb21tYW5kIGxpbmUgb3B0aW9uIGZvciB0aGlzIGlzIG5hbWVkCiAgIi0tbG9jYXRpb24tdHJ1c3RlZCIuCgotIEZyYW5raWUgRm9uZyByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBsaWJjdXJsIGlmIHlvdSByZS11c2VkIGFuIGVhc3kgaGFuZGxlCiAgd2l0aCBhIHByb3h5LCBhbmQgeW91IGZpcnN0IG1hZGUgYSBodHRwczovLyBjb25uY3Rpb24gdG8gYSBob3N0IGFuZCB0aGVuCiAgc3dpdGNoZWQgdG8gYSBodHRwOi8vIG9uZSB0byB0aGUgc2FtZSBob3N0LiBsaWJjdXJsIHdvdWxkIHRoZW4gd3JvbmdseSByZS11c2UKICB0aGUgc2FtZSBjb25uZWN0aW9uIGZvciBpdCBhbmQgZmFpbCB0byBnZXQgdGhlIHNlY29uZCBVUkwgcHJvcGVybHkKCkRhbmllbCAoMjkgTWFyKQotIERhbiBTaGVhcmVyJ3MgZml4IHRoYXQgbWFrZXMgY3VybCBjb21wbGFpbiBpZiBpbnZva2VkIHdpdGggbm90aGluZyBidXQgImN1cmwKICAtTyIgd2FzIGFwcGxpZWQuCgpEYW5pZWwgKDI2IE1hcikKLSBCcnlhbiBLZW1wIHdhcyBmcmllbmRseSBlbm91Z2ggdG8gbGVuZCBtZSBhbiBhY2NvdW50IG9uIGhpcyBSZWRoYXQgOSBib3ggYW5kCiAgSSBjb3VsZCBmaXggdGhlIGNvbmZpZ3VyZSBwcm9ibGVtcyBvbiByZWRoYXQgOC4xIGFuZCA5IGluIG5vIHRpbWUgdGhhbmtzIHRvCiAgdGhpcy4gVGhhbmtzIGEgYnVuY2ggQnJ5YW4hCgpEYW5pZWwgKDI1IE1hcikKLSBSZW5hbWVkIGNvbmZpZ3VyZS5pbiB0byBjb25maWd1cmUuYWMKClZlcnNpb24gNy4xMC40LXByZTUgKDI1IE1hciAyMDAzKQoKRGFuaWVsICgyNSBNYXIpCi0gUmljaGFyZCBCcmFtYW50ZSBwcm92aWRlZCBhIGZpeCBmb3IgYSBoYW5kbGUgcmUtdXNlIHByb2JsZW0gc2VlbiB3aGVuIHlvdQogIGNoYW5nZSBvcHRpb25zIG9uIGFuIFNTTC1lbmFibGVkIGNvbm5lY3Rpb24gYmV0d2VlbiByZXF1ZXN0cy4gUHJldmlvdXNseSwKICBjaGFuZ2luZyBwZWVyIHZlcmlmaWNhdGlvbiBvciBob3N0IHZlcmlmaWNhdGlvbiBhbmQgc2ltaWxhciB0aGluZ3Mgd2FzIG5vdAogIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGEgY29ubmVjdGlvbiB3ZXJlIGNoZWNrZWQgZm9yIHJlLXVzZSBhbmQgdGh1cwogIGVuYWJsaW5nIHN0cmljdGVyIGNoZWNrIGJldHdlZW4gcmVxdWVzdHMgb24gYSByZS11c2VkIGNvbm5lY3Rpb24gbWFkZSBubwogIGRpZmZlcmVuY2UgYW5kIHRoZSBjb25uZWN0aW9uIHdvdWxkIHRodXMgYmUgdXNlZCBlcnJvbmVvdXNseS4KCkRhbmllbCAoMjQgTWFyKQotIEf2dHogQmFiaW4tRWJlbGwgcG9pbnRlZCBvdXQgdGhhdCB0aGUgY2EtYnVuZGxlLmNydCBmaWxlIGNvbnRhaW5lZCBhCiAgY2VydGlmaWNhdGUgZnJvbSBUcnVzdGNlbnRlciB0aGF0IHdhcyBhIGRlbW8gY2VydGlmaWNhdGUgb25seSB0aGF0IHdhcyBuZXZlcgogIGluZGVuZGVkIHRvIGJlIHBhcnQgb2YgYSBDQSBidW5kbGUuCgpEYW5pZWwgKDIxIE1hcikKLSBMaWZlIGlzIGEgbXlzdGVyeS4gV2l0aGluIGEgdGltZSBwZXJpb2Qgb2YgMTcgaG91cnMsIFRpbSBQb3BlIGFuZCBNaWNoYWVsCiAgQ2h1cmNoaWxsIGZpbGVkIG9uZSBidWcgcmVwb3J0IGVhY2gsIGJvdGggaWRlbnRpZnlpbmcgcHJvYmxlbXMgd2l0aCBhIHNlY29uZAogIHRyYW5zZmVyIHdoZW4gZG9pbmcgcGVyc2lzdGFudCB0cmFuc2ZlcnMgcmUtdXNpbmcgYSBjb25uZWN0aW9uLiBUaW0ncyBvbmUgaXMKICAjNzA2NjI0LCBsYWJlbGVkICJNdWx0aXBsZSB1cGxvYWRzIHBlciBoYW5kbGUgZmFpbCIgYW5kIE1pY2hhZWwncyAjNzA3MDAzCiAgIkRvZXMgbm90IHNlbmQgQXV0aG9yaXphdGlvbjogaGVhZGVyIHdoZW4gcmV1c2luZyBjb25uZWN0aW9uIi4gSSBjb3VsZCB0cmFjawogIGJvdGggZG93biB0byB0aGUgc2FtZSBwaWVjZSBvZiBsb2dpYyBhbmQgaXQgdHVybmVkIG91dCBsaWJjdXJsIHdhcyBub3QgdXNpbmcKICBuZXcgc2V0dGluZ3MgcHJvcGVybHkgd2hlbiByZS11c2luZyBhbiBleGlzdGluZyBjb25uZWN0aW9uLiBUaGlzIGNvbmNlcm5lZAogIGJvdGggdXBsb2FkaW5nIGFuZCBkb3dubG9hZGluZyBhbmQgaW52b2x2ZWQgZXhhY3RseSB0aG9zZSBwaWVjZXMgdGhlc2UgdHdvCiAgcmVwb3J0cyBpZGVudGlmaWVkLiBUaGlzIGNvZGUgaGFzIGJlZW4gdGhpcyBmYXVsdHkgc2luY2UgdGhlIGRheSBJCiAgaW50cm9kdWNlZCBwZXJzaXN0YW50IGNvbm5lY3Rpb24gc3VwcG9ydCBpbiBsaWJjdXJsLCBtb3JlIHRoYW4gMiB5ZWFycyBhZ28uCgpEYW5pZWwgKDIwIE1hciAyMDAzKQotIEZpdmUgeWVhciBhbm5pdmVyc2FyeS4gVG9kYXkgZml2ZSB5ZWFycyBhZ28sIHRoZSBmaXJzdCBldmVyIGN1cmwgcmVsZWFzZSBzYXcKICB0aGUgbGlnaHQgb2YgZGF5LgoKRGFuaWVsICgxNyBNYXIpCi0gQW5keSBDZWRpbG5payBjb3JyZWN0ZWQgZmxhd3MgaW4gc29tZSBsaWJjdXJsIGV4YW1wbGUtdXNhZ2Ugc291cmNlcy4KCkRhbmllbCAoMTYgTWFyKQotIEp1YW4gRi4gQ29kYWdub25lIHJlcG9ydGVkIHRoYXQgdGhlIGZpeCBmcm9tIE1hcmNoIDJuZCB3YXMgaW5jb21wbGV0ZS4KCi0gQWRkZWQgY29kZSB0byB0aGUgY29uZmlndXJlLmluIHRvIGNoZWNrIGZvciBzZWxlY3QoKSBhcmd1bWVudCB0eXBlcy4gSSd2ZQogIG5vdCBtYWRlIGFueSBjb2RlIHVzZSB0aGUgcmVzdWx0cyBqdXN0IHlldCB0aG91Z2guCgpEYW5pZWwgKDE1IE1hcikKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCB0d28gcGF0Y2hlcyB0byBidWlsZCBiZXR0ZXIgb24gV2luZG93cy4KCi0gQWRqdXN0ZWQgdGhlIHRlc3Qgc3VpdGUgY29kZSB0byBiZXR0ZXIgbWFrZSBzdXJlIHRoYXQgdGhlIHNlcnZlcihzKSByZXF1aXJlZAogIGZvciBhIHNwZWNpZmljIHRlc3QgaXMgcHJvcGVybHkgc3RhcnRlZCBiZWZvcmUgdGhlIHRlc3QgY2FzZSBpcyBhdHRlbXB0ZWQuCiAgTWFueSB0ZXN0cyBub3cgcnVuIGEgbG90IGZhc3RlciB0aGFuIGJlZm9yZS4KCkRhbmllbCAoMTQgTWFyKQotIEFub3RoZXIgY29uZmlndXJlLmluIGFkanVzdG1lbnQgbWFkZSB0aGUgY29uZmlndXJlIGRldGVjdCBmdW5jdGlvbnMgcHJvcGVybHkKICBvbiBIUFVYIG5vdy4KCkRhbmllbCAoMTMgTWFyKQotIFBoaWxpcHBlIFJhb3VsdCBmaXhlZCBwcmU0LWNvbXBpbGUgcXVpcmtzIGZvciBGcmVlQlNELgoKVmVyc2lvbiA3LjEwLjQtcHJlNCAoMTMgTWFyIDIwMDMpCgpEYW5pZWwgKDEzIE1hcikKLSBBZGRlZCBhIGJhY2t1cC1jaGVjayBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlbid0IGZvdW5kIGJ5IEFDX0NIRUNLX0ZVTkNTKCkKICBhcyBJIGJlbGlldmUgc29tZSBjaGVja3Mgb24gSFBVWCBuZWVkIHRoaXMuIEF0IGxlYXN0IHNvbWUgb2YgdGhlIGluZm8gZ2l2ZW4KICB0byB1cyBieSBSaWNrIEpvbmVzIHNlZW1lZCB0byBpbmRpY2F0ZSB0aGlzLgoKRGFuaWVsICgxMiBNYXIpCi0gVGhvbWFzIFRvbmlubyBmb3VuZCBvdXQgdGhhdCBpZiB5b3UgdXNlZCB0aGUgY3VybCB0b29sIHRvIGRvIFBVVCBvcGVyYXRpb25zCiAgYXMgaW4gJ2N1cmwgd3d3LmZvby5jb20vZGlyLyAtVCBmaWxlJyBhbmQgdGhlIGZpbGUgbmFtZSBpbmNsdWRlZCBmb3IgZXhhbXBsZQogIHNwYWNlIG9yIG90aGVyIGNoYXJhY3RlcnMgdGhhdCBkb24ndCBiZWxvbmcgaW4gVVJMcywgY3VybCBkaWQgbm90IHByb3Blcmx5CiAgVVJMIGVuY29kZSB0aGVtIGJlZm9yZSB1c2luZyB0aGVtIGluIHRoZSBVUkwuCgotIEFkZGVkIGFuIG9wdGlvbiB0byBjb25maWd1cmUgY2FsbGVkIC0tZW5hYmxlLWxpYmdjYyB0aGF0IHNpbXBseSBhZGRzIC1sZ2NjCiAgdG8gdGhlIExJQlMgdmFyaWFibGUsIGFzIHRoaXMgc2VlbXMgdG8gYmUgYSBjb21tb24gcHJvYmxlbS4KCi0gSSBtb2RpZmllZCB0aGUgY29uZmlndXJlLmluIGZpbGUsIHNvIHRoYXQgdGhlIGhlYWRlcnMgYXJlIG5vdyBjaGVja2VkIGluIGFuCiAgb3JkZXIgb2YgInZpYWxpdHkiLiBXZSBtdXN0IGFsc28gbWFrZSBzdXJlIHRvIHVzZSB0aGUgImRlZmF1bHQgaGVhZGVycyIKICBwYXJhbWV0ZXIgdG8gQUNfQ0hFQ0tfSEVBREVSUygpIHNvIHRoYXQgaGVhZGVycyBhcmUgY2hlY2tlZCB3aXRoIHRoZSBwcm9wZXIKICBwcmVyZXF1aXNpdGVzIGluY2x1ZGVkIChpLmUgYWxsIHRoZSBtYWpvciBhbmQgZ2VuZXJhbGx5IGltcG9ydGFudCBoZWFkZXIKICBmaWxlcyBhcmUgaW5jbHVkZWQgdGhlcmUgYnkgZGVmYXVsdCkuIFRoaXMgbWlnaHQgYmUgd2hhdCB3ZSBuZWVkIGZvciB2YXJpb3VzCiAgU3VuLCBIUCwgQUlYIGFuZCBUcnU2NCBzeXN0ZW1zIHRvIGJlaGF2ZSBnb29kIGFnYWluIG9uIHRoZSBoZWFkZXIgY2hlY2sKICBmcm9udC4KCi0gUmljayBKb25lcyBwb2ludGVkIG91dCBhIGZldyBjb21waWxlciB3YXJuaW5ncyBvbiBIUC1VWCB0aGF0IEkgYWRkcmVzc2VkLgoKLSBJIG1hZGUgdGhlIGNvbmZpZ3VyZSAtLWhlbHAgb3V0cHV0IG5pY2VyIGJ5IHVzaW5nIEFDX0hFTFBfU1RSSU5HKCkgYSBsb3QKICBtb3JlLgoKRGFuaWVsICgxMSBNYXIpCi0gQ2hyaXN0b3BoZSBEZW1vcnkgZml4ZWQgdGhlIHNvY2tldCBzZW5kaW5nIGNvZGUgdG8gd29yayBiZXR0ZXIgb24gSFAtVVgKICB3aGVuIHNlbmRpbmcgZGF0YSB0byBhIHNvY2tldCB0aGF0IHdvdWxkIGJsb2NrLiBJdCB0aGVuIHJldHVybnMgRUFHQUlOLCBub3QKICBFV09VTERCTE9DSy4KCi0gUmljaGFyZCBHb3J0b24gaW1wcm92ZWQgdGhlIHNlZWRpbmcgZnVuY3Rpb24gZm9yIHN5c3RlbXMgd2l0aG91dCBhIGdvb2QKICBhbmQgcmVsaWFibGUgcmFuZG9tIHNvdXJjZS4KCi0gUmljaGFyZCBHb3J0b24gZml4ZWQgYSBmZXcgd2FybmluZ3MgdGhhdCBwb3BwZWQgdXAgd2hlbiB5b3UgYnVpbHQgY3VybAogIHVzaW5nIHRoZSBTdW4gY29tcGlsZXIgb24gYSA2NGJpdCBTUEFSQyBwbGF0Zm9ybS4KCi0gTWFydGluIEMuIE1hcnRpbiBmaXhlZCBhIGNhc2Ugd2hlcmUgYSBjb25uZWN0IGZhaWx1cmUgdXNpbmcgdGhlIG11bHRpCiAgaW50ZXJmYWNlIGRpZG4ndCBwcm9kdWNlIGEgaHVtYW4gcmVhZGFibGUgZXJyb3Igc3RyaW5nLgoKRGFuaWVsICgxMCBNYXIpCi0gUmV2ZXJ0ZWQgbHRtYWluLnNoIGJhY2sgdG8gbGlidG9vbCAxLjQuMiBzdGF0dXMgYWdhaW4sIGFzIHRoZSAxLjQuMyB2ZXJzaW9uCiAgYnJva2UgdGhlIGJ1aWxkIG9uIG51bWVyb3VzIHBsYXRmb3Jtcy4gSXQgc2VlbXMgdGhhdCBsaWJ0b29sIDEuNC4zIHB1dHMgc29tZQogIHJlcXVpcmVtZW50cyBvbiB3aGF0IHZlcnNpb25zIG9mIHRoZSBvdGhlciB0b29scyAoYXV0b2NvbmYgKyBhdXRvbWFrZSkgdGhhdAogIEkgYW0gbm90IGZhbWlsaWFyIHdpdGggYW5kIHRodXMgSSBjb3VsZG4ndCBmdWxmaWxsIGF0IHRoaXMgcG9pbnQuCgogIFllcywgdGhpcyBpcyBtb3JlIHRoYW4gbWlsZGx5IGZydXN0cmF0aW5nLgoKRGFuaWVsICg3IE1hcikKLSBSdW4gbGlidG9vbGl6ZSB2ZXJzaW9uIDEuNC4zLgoKVmVyc2lvbiA3LjEwLjQtcHJlMyAoNCBNYXIgMjAwMykKCkRhbmllbCAoMyBNYXIpCi0gQWRkZWQgc2hhcmUub2JqIHRvIHRoZSBWQzYgYW5kIEJvcmxhbmQgbGliY3VybCBtYWtlZmlsZXMuCgotIFRyb2VscyBXYWxzdGVkIEhhbnNlbiBmb3VuZCBhbmQgaW52ZXN0aWdhdGVkIGEgcHJvYmxlbSB3aXRoIGxpYmN1cmwgb24gQUlYLAogIHByZXN1bWFibHkgb25seSBvbiA0LjMgb3IgbGF0ZXIuIGdldGhvc3RieW5hbWVfcigpIGlzIG5vdCByZXR1cm5pbmcgZGF0YQogIHRoYXQgaXMgcG9zc2libGUgdG8gImtlZXAiIGFuZCBjYWNoZSB0aGUgd2F5IGxpYmN1cmwgZG9lcy4gQnV0IGluc3RlYWQgdGhlc2UKICB2ZXJzaW9ucyBvZiBBSVggdXNlcyBhIGdldGhvc3RieW5hbWUoKSB0aGF0IHdvcmtzIHRocmVhZC1zYWZlbHkgd2UgY2FuCiAgaW5zdGVhZCB1c2UgdGhlIG9yZGluYXJ5IGdldGhvc3RieW5hbWUoKSBhbmQgb3VyIHBhY2tfaG9zdGVudCgpIGFwcHJvYWNoIHRvCiAgYWNoaWV2ZSB3aGF0IHdlIHdhbnQuIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBhdHRlbXB0cyB0byBkZXRlY3QgQUlYIDQuMyBvcgogIGxhdGVyIHRvIGFkanVzdCBmb3IgdGhpcy4KCkRhbmllbCAoMiBNYXIpCi0gSnVhbiBGLiBDb2RhZ25vbmUgZm91bmQgYSBwcm9ibGVtIGludHJvZHVjZWQgaW4gNy4xMC4zIHdoZW4geW91IGZpcnN0IGRpZCBhCiAgUE9TVCBhbmQgdGhlbiBiYWNrIHRvIGEgR0VUIHVzaW5nIHRoZSBzYW1lIGVhc3kgaGFuZGxlLgoKRGFuaWVsICgyOCBGZWIpCi0gUmVtb3ZlZCB0aGUgc3RyZXF1YWwgYW5kIHN0cm5lcXVhbCBkZWZpbmVzIGZyb20gY3VybC9jdXJsLmggaGVhZGVyLiBUaGV5CiAgd2VyZSBuZXZlciBtZWFudCBmb3IgdGhlIHB1YmxpYyBoZWFkZXIgYW55d2F5LiBQaGlsaXBwZSBSYW91bHQgYnJvdWdodCBpdAogIHVwLgoKLSBKYW1lcyBCdXJzYSBmaXhlZCB0aGUgUklTQyBPUyBidWlsZC4KCkRhbmllbCAoMjcgRmViKQotIEF2ZXJ5IEZheSBwb2ludGVkIG91dCB0aGUgdmVyeSBtaXNsZWFkaW5nIGN1cmxfbXVsdGlfaW5mb19yZWFkIG1hbiBwYWdlLCBhbmQKICBJIHVwZGF0ZWQgaXQgdG8gYmVjb21lIG1vcmUgYWNjdXJhdGUuCgotIFNhbHZhdG9yZSBTb3JyZW50aW5vIGZvdW5kIGEgcHJvYmxlbSB3aXRoIEZUUCBkb3dubG9hZGluZyB0aGF0IHR1cm5lZCBvdXQgdG8KICBiZSBoaXMgRlRQIHNlcnZlciByZXR1cm5pbmcgc2l6ZSB6ZXJvICgwIGJ5dGVzKSB3aGVuIFNJWkUgd2FzIHVzZWQgb24gYSBmaWxlCiAgd2hpbGUgYmVpbmcgaW4gQklOQVJZIG1vZGUuIFdlIG5vdyBtYWtlIGEgc2Vjb25kIGNoZWNrIGZvciB0aGUgYWN0dWFsIHNpemUKICBieSBzY2FubmluZyB0aGUgUkVUUiByZXBseSBhbnl3YXksIGV2ZW4gaWYgdGhlIFNJWkUgY29tbWFuZCByZXR1cm5lZCAwLgoKRGFuaWVsICgyNiBGZWIpCi0gS3lsZSBTYWxsZWUgcmVwb3J0ZWQgYSBjYXNlIHdoZXJlIGhlIHdvdWxkIGRvIGEgdHJhbnNmZXIgdGhhdCBkaWRuJ3QgdXBkYXRlCiAgdGhlIHByb2dyZXNzIG1ldGVyIHByb3Blcmx5LiBJdCB0dXJuZWQgb3V0IHRvIGJlIGEgY2FzZSB3aGVyZSBsaWJjdXJsIHdvdWxkCiAgbG9vcCBhIGxpdHRsZSB0b28gZWFnZXJseSBpbiB0aGUgdHJhbmZlciBsb29wLCB3aGljaCBpc24ndCByZWFsbHkgZ29vZCBmb3IKICB0aGUgQVBJcywgZXNwZWNpYWxseSBub3QgdGhlIG11bHRpIEFQSS4KClZlcnNpb24gNy4xMC40LXByZTIgKDI0IEZlYiAyMDAzKQoKRGFuaWVsICgyNCBGZWIpCi0gS2pldGlsIEphY29ic2VuIGZvdW5kIG91dCB0aGF0IHNldHRpbmcgQ1VSTE9QVF9NQVhDT05ORUNUUyB0byBhIHZhbHVlIGhpZ2hlcgogIHRoYW4gNSBjb3VsZCBjYXVzZSBhIHNlZ2ZhdWx0LgoKLSBJIGJlbGlldmUgSSBmaXhlZCB0aGUgJ0V4cGVjdDogMTAwLWNvbnRpbnVlJyBiZWhhdmlvciB0aGF0IGhhcyBiZWVuIGJyb2tlbgogIGZvciBhIHdoaWxlIChJIHRoaW5rIHNpbmNlIG15IGNoYW5nZSBkYXRlZCBEZWMgMTAgMjAwMikuIFdoZW4gdGhpcyBoZWFkZXIgaXMKICB1c2VkLCBsaWJjdXJsIHNob3VsZCB3YWl0IGZvciBhIEhUVFAgMTAwIChvciB0aW1lb3V0KSBiZWZvcmUgc2VuZGluZyB0aGUKICBwb3N0L3B1dCBkYXRhLgoKRGFuaWVsICgxNCBGZWIpCi0gTWF0dGhldyBDbGFya2UgcHJvdmlkZWQgc29tZSBpbmZvIHdoYXQgdG8gbW9kaWZ5IHRvIG1ha2UgY3VybCBidWlsZAogIGZsYXdsZXNzbHkgb24gQUlYIDMuMi41LgoKLSBNYXJ0aW4gQy4gTWFydGluIGZvdW5kIGFuZCBmaXhlZCBhIHByb2JsZW0gaW4gdGhlIG11bHRpIGludGVyZmFjZSB3aGVuCiAgcnVubmluZyBvbiBXaW5kb3dzIGFuZCB0cnlpbmcgdG8gY29ubmVjdCB0byBhIHBvcnQgd2l0aG91dCBhIGxpc3RlbmVyLgoKRGFuaWVsICgxMyBGZWIpCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIGZpeGVkIEN1cmxfYmFzZTY0X2VuY29kZSgpIHRvIGRlYWwgd2l0aCB6ZXJvZXMgaW4gdGhlCiAgZGF0YSB0byBlbmNvZGUuCgpEYW5pZWwgKDQgRmViKQotIEplYW4tUGhpbGlwcGUgYWRkZWQgdGhlIGZpcnN0IGNvZGUgdGhhdCBlbmFibGVzIHRoZSAnc2hhcmUnIHN5c3RlbS4gVGhpcwogIHNob3VsZCBub3cgZW5hYmxlIHNoYXJpbmcgb2YgRE5TIGRhdGEgYmV0d2VlbiB0d28gY3VybCBlYXN5IGhhbmRsZXMuCgotIEluY29ycG9yYXRlZCBOaWNvIEJhZ2d1cycgZml4ZXMgdG8gYWdhaW4gY29tcGlsZSBmbGF3bGVzc2x5IG9uIFZNUy4KCi0gSmFtZXMgQnVyc2EgY29ycmVjdGVkIGEgYmFkIGNvbW1lbnQgaW4gdGhlIHB1YmxpYyBpbmNsdWRlIGZpbGUgY3VybC9tdWx0aS5oCgotIFBldGVyIEZvcnJldCByZXBvcnRlZCBvbmUgb2YgdGhvc2UgZXJyb3I6MDAwMDAwMDAgY2FzZXMgaW4gbGliY3VybCBhZ2FpbgogIHdoZW4gY29ubmVjdGluZyB0byBhIEhUVFBTIHNpdGUsIGFuZCB0aGlzIHRpbWUgSSBkaWQgZGlzY292ZXIgc29tZSBvZGRpdGllcwogIGluIGhvdyBjdXJsIHJlcG9ydHMgU1NMIGVycm9ycyBiYWNrLiBJdCBjb3VsZCBtaXNzIHNob3dpbmcgdGhlIGFjdHVhbCBlcnJvci4KClZlcnNpb24gNy4xMC40LXByZTEgKDMgRmViIDIwMDMpCgpEYW5pZWwgKDMgRmViKQotIFJlbW92ZWQgdGhpbmdzIGluIHRoZSBkb2NzIHNheWluZyBjYXBhdGggZG9lc24ndCB3b3JrIG9uIFdpbmRvd3MsIGFzIEp1bGlhbgogIE5vYmxlIHRvbGQgdXMgaXQgd29ya3MgZmluZS4KCkRhbmllbCAoMzEgSmFuKQotIEtldmluIFJvdGggZml4ZWQgdGhlIHpsaWIgYnVpbGQgc3R1ZmYgaW4gdGhlIE1pbmd3MzIgbWFrZWZpbGUuCgpEYW5pZWwgKDMwIEphbikKLSBLZXZpbiBSb3RoIGZvdW5kIG91dCB0aGF0IGN1cmwgb24gV2luZG93cyBhbHdheXMgY2hlY2tlZCBmb3IgdGhlIENBIGNlcnQKICBidW5kbGUgdXNpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCB0aGUgcGF0aCBzY2FuLCBldmVuIHRob3VnaAogIC1rLy0taW5zZWN1cmUgd2FzIHVzZWQuCgotIEhhbWlzaCBNYWNrZW56aWUgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIG9ubHkgZGlkIHN0cmljdCBob3N0IG5hbWUgdmVyaWZ5aW5nCiAgaWYgY2FwYXRoIG9yIGNhaW5mbyB3YXMgdXNlZC4gTm93IGl0J2xsIGFsd2F5cyBkbyBpdCB1bmxlc3MgLWsgLyAtLWluc2VjdXJlCiAgaXMgdXNlZCEKCi0gUGF2ZWwgQ2VuZWsgcG9pbnRlZCBvdXQgdGhhdCB0aGUgQ29udGVudC1UeXBlIGV4dHJhY3Rpb24gd2FzIGRvbmUgd3JvbmdseQogIGFzIHRoZSBmdWxsIHN0cmluZyB3YXMgbm90IGZldGNoZWQuIEFkZGVkIHRlc3QgY2FzZSA1NyB0byB2ZXJpZnkgdGhhdCBjdXJsCiAgZG9lcyBpdCByaWdodCBub3cuCgpEYW5pZWwgKDI5IEphbikKLSBKYW1pZSBXaWxraW5zb24gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG5vdyBtYWtlcyBjdXJsIGF0dGVtcHQgdG8gY2xlYXIgb3V0CiAgInNlbnNpdGl2ZSIgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBzbyB0aGF0IHRoZXkgZG9uJ3QgYXBwZWFyIGluIHBzIG91dHB1dHMKICAob25seSBvbiBwbGF0Zm9ybXMgdGhhdCBhbGxvdyB3cml0aW5nIHRvIGFyZ3ZbXSkuCgotIEpvaG4gTWNHb3dhbiBmb3VuZCBvdXQgdGhhdCB0aGUgREVCVUdGVU5DVElPTiBjb3VsZCBiZSBjYWxsZWQgd2l0aCBiYWQKICBhcmd1bWVudHMgYW5kIHRodXMgY2F1c2UgdGhlIC0tdHJhY2Ugb3V0cHV0cyB0byBnbyB3cm9uZy4KCi0gUmVtb3ZlZCBhbGwgdGhlIGVtYWNzIGxvY2FsIHZhcmlhYmxlcyBmcm9tIGFsbCBmaWxlcy4gTWF0cyBMaWRlbGwgcHJvdmlkZWQKICB0aGUgbmV3IHNhbXBsZS5lbWFjcyBmaWxlIChmb3IgYSBzYW1wbGUgb2Ygd2hhdCB0byBpbmNsdWRlIGluIHlvdXIgLmVtYWNzKQogIGFuZCB0aGUgY3VybC1zdHlsZS5lbCB0aGF0IHNldHMgYSBiZXR0ZXIgYy1zdHlsZSBmb3IgZWRpdGluZyBjdXJsIHNvdXJjZXMuCgotIERhdmUgSGFsYmFra2VuIGZvdW5kIGEgcHJvYmxlbSB3aXRoIEZUUCBkb3dubG9hZHMgdGhhdCBjb3VsZCBhY2NpZGVudGx5CiAgcmV0dXJuIENVUkxFX1BBUlRJQUxfRklMRSB3aGVuIGN1cmxfZWFzeV9wZXJmb3JtKCkgd2FzIGNhbGxlZCB3aXRoIE5PQk9EWQogIHNldCBUUlVFLgoKRGFuaWVsICgyNyBKYW4pCi0gVGhlIGZvcGVuLmMgZXhhbXBsZSB3YXMgZmxhd2VkIGFzIE5pY2sgSHVtZnJleSBub3RpY2VkLCBhbmQgSSBmaXhlZCBpdCB0bwogIHdvcmsgYWdhaW4uCgpEYW5pZWwgKDI0IEphbikKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmb3VuZCBhbmQgZml4ZWQgYSBtZW1vcnkgbGVhayAodGhlIGNvbnRlbnQtdHlwZSBzdHJpbmcpCiAgd2hlbiBmb2xsb3dpbmcgbG9jYXRpb25zLgoKRGFuaWVsICgyMiBKYW4gMjAwMykKLSBJYW4gV2lsa2VzIGFuZCBMZWdvZmYgVmluY2VudCBib3RoIGluZGVwZW5kZW50bHkgcHJvdmlkZWQgZml4ZXMgZm9yIG1ha2luZwogIGN1cmwvbXVsdGkuaCB3b3JrIHByb3Blcmx5IHdoZW4gY29tcGlsZWQgd2l0aCBhIEMrKyBjb21waWxlci4KCkRhbmllbCAoMjAgSmFuIDIwMDMpCi0gRml4ZWQgJ2J1aWxkY29uZicgdG8gY2hlY2sgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHJlcXVpcmVkIHRvb2xzIGJlZm9yZQogIHRoZXkncmUgYWN0dWFsbHkgdXNlZC4KCi0gV3JvdGUgJ3Rlc3RjdXJsLnNoJywgYSBzY3JpcHQgdGFyZ2V0ZWQgZm9yIGF1dG9tYXRpYyBhbmQgZGlzdHJpYnV0ZWQgY3VybAogIHRlc3RzIG9uIHZhcmlvdXMgcGxhdGZvcm1zLgoKLSBEYXZpZCBUaGllbCBwb2ludGVkIG91dCB0aGF0IHRoZSAubmV0cmMgZmlsZSB3YXMgbm90IGJlaW5nIGRlYWx0IHdpdGgKICBwcm9wZXJseSBhbnltb3JlLiBJIGJyb2tlIHRoaXMgaW4gdGhlIHBhc3N3b3JkIHByb21wdGluZyAiZml4Ii4KCi0gTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIgcGF0Y2hlZCBsaWJjdXJsIHRvIGFsbG9jYXRlIHRoZSBzY3JhdGNoIGJ1ZmZlciBvbmx5CiAgb24gZGVtYW5kIGFuZCB0aHVzIHdlIHNhdmUgMzJLQiBpbiBlYWNoIGN1cmwgaGFuZGxlIHRoYXQgZG9uJ3QgdXNlIHRoYXQKICBidWZmZXIuIFRoaXMgbmVlZCBhcHBlYXJlZCB3aGVuIHNvbWUgcGVvcGxlIHN0YXJ0ZWQgdXNpbmcgdGhvdXNhbmRzIG9mCiAgc2ltdWx0YW5lb3VzIGN1cmwgaGFuZGxlcy4uLiA6LSkKCkRhbmllbCAoMTYgSmFuIDIwMDMpCi0gTWFya3VzIE9iZXJodW1lciBmaXhlZCBjdXJsLWNvbmZpZyAtLWNmbGFncyB3aGVuIHRoZSBpbmNsdWRlZGlyIHdhcyBub3QKICAvdXNyL2luY2x1ZGUuCgotIE1hcmt1cyBPYmVyaHVtZXIgZml4ZWQgQ1VSTElORk9fUFJJVkFURSB0byBwcm9wZXJseSByZXR1cm4gTlVMTCBpZiBpdCB3YXMKICBzZXQgdG8gTlVMTCEKClZlcnNpb24gNy4xMC4zICgxNCBKYW4gMjAwMykKCkRhbmllbCAoMTAgSmFuIDIwMDMpCi0gU3RldmUgT2xpcGhhbnQgcG9pbnRlZCBvdXQgdGhhdCB0ZXN0IGNhc2UgMTA1IGRpZCBub3Qgd29yayBhbnltb3JlIGFuZCB0aGlzCiAgd2FzIGR1ZSB0byBhIG1pc3NpbmcgZml4IGZvciB0aGUgcGFzc3dvcmQgcHJvbXB0aW5nLgoKVmVyc2lvbiA3LjEwLjMtcHJlNiAoMTAgSmFuIDIwMDMpCgpEYW5pZWwgKDkgSmFuIDIwMDMpCi0gQnJ5YW4gS2VtcCBwb2ludGVkIG91dCB0aGF0IGN1cmwgLXUgY291bGQgbm90IHByb3ZpZGUgYSBibGFuayBwYXNzd29yZAogIHdpdGhvdXQgcHJvbXB0aW5nIHRoZSB1c2VyLiBJdCBjYW4gbm93LiAtdSB1c2VybmFtZTogbWFrZXMgdGhlIHBhc3N3b3JkCiAgZW1wdHksIHdoaWxlIC11IHVzZXJuYW1lIG1ha2VzIGN1cmwgcHJvbXB0IHRoZSB1c2VyIGZvciBhIHBhc3N3b3JkLgoKLSBLamV0aWwgSmFjb2JzZW4gZm91bmQgYSByZW1haW5pbmcgY29ubmVjdCBwcm9ibGVtIGluIHRoZSBtdWx0aSBpbnRlcmZhY2Ugb24KICBpcHY0IHN5c3RlbXMgKExpbnV4IG9ubHk/KSwgdGhhdCBJIGZpeGVkIGFuZCBLamV0aWwgdmVyaWZpZWQgdGhhdCBpdCBmaXhlZAogIGhpcyBwcm9ibGVtcy4KCi0gbWVtYW5hbHl6ZS5wbCBub3cgcmVhZHMgYSBmaWxlIG5hbWUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBhbmQgbm8gbG9uZ2VyCiAgdGFrZXMgdGhlIGRhdGEgb24gc3RkaW4gYXMgYmVmb3JlLgoKVmVyc2lvbiA3LjEwLjMtcHJlNSAoOSBKYW4gMjAwMykKCkRhbmllbCAoOSBKYW4gMjAwMykKLSBGaXhlZCB0ZXN0cy9tZW1hbmFseXplLnBsIHRvIHdvcmsgd2l0aCBmaWxlIG5hbWVzIHRoYXQgY29udGFpbiBjb2xvbnMgKGFzIG9uCiAgV2luZG93cykuCiAgCi0gS2pldGlsIEphY29ic2VuIHF1aWNrbHkgcG9pbnRlZCBvdXQgdGhhdCBsaWIvc2hhcmUuaCB3YXMgbWlzc2luZy4uLgoKVmVyc2lvbiA3LjEwLjMtcHJlNCAoOSBKYW4gMjAwMykKCkRhbmllbCAoOSBKYW4gMjAwMykKLSBVcGRhdGVkIGxpYi9zaGFyZS5jIHF1aXRlIGEgYml0IHRvIG1hdGNoIHRoZSBkZXNpZ24gZG9jdW1lbnQgYXQKICBodHRwOi8vY3VybC5oYXh4LnNlL2Rldi9zaGFyaW5nLnR4dCBhIGxvdCBtb3JlLgoKICBJJ2xsIHRyeSB0byB1cGRhdGUgdGhlIGRvY3VtZW50IHNvb25pc2guIHNoYXJlLmMgaXMgc3RpbGwgbm90IGFjdHVhbGx5IHVzZWQKICBieSBsaWJjdXJsLCBidXQgdGhlIEFQSSBpcyBzbG93bHkgZ2V0dGluZyB0aGVyZSBhbmQgd2UgY2FuIHN0YXJ0CiAgaW1wbGVtZW50aW5nIGNvZGUgdGhhdCB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhpcyBzeXN0ZW0uCgpEYW5pZWwgKDggSmFuIDIwMDMpCi0gVXBkYXRlZCBzaGFyZSBzdHVmZiBpbiBjdXJsL2N1cmwuaCwgaW5jbHVkaW5nIGRhdGEgdHlwZXMsIHN0cnVjdHMgYW5kCiAgZnVuY3Rpb24gcHJvdG90eXBlcy4gVGhlIGNvcnJlc3BvbmRpbmcgZmlsZXMgaW4gbGliLyB3ZXJlIGFsc28gbW9kaWZpZWQKICBvZiBjb3Vyc2UgdG8gcmVtYWluIGNvbXBpbGFibGUuIEJhc2VkIG9uIGlucHV0IGZyb20gSmVhbi1QaGlsaXBwZSBhbmQgYWxzbwogIHRvIG1ha2UgaXQgbW9yZSBpbiBsaW5lIHdpdGggdGhlIGRlc2lnbiBkb2N1bWVudC4KCi0gSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZSBwYXRjaGVkIGEgdmVyeSB0cml2aWFsIG1lbW9yeSBsZWFrIGluCiAgY3VybF9lc2NhcGUoKSB0aGF0IHdvdWxkIGhhcHBlbiB3aGVuIHJlYWxsb2MoKSByZXR1cm5zIE5VTEwuLi4KCi0gTWF0dGhldyBCbGFpbiBwcm92aWRlZCBmZWVkYmFjayB0byBtYWtlIHRoZSAtLWNyZWF0ZS1kaXJzIHN0dWZmIGJ1aWxkCiAgcHJvcGVybHkgb24gV2luZG93cy4KCi0gRml4ZWQgdGhlICNpbmNsdWRlIGluIHRlc3RzL2xpYnRlc3QvZmlyc3QuYyBhcyBMZWdvZmYgVmluY2VudCBwb2ludGVkIG91dC4KCkRhbmllbCAoNyBKYW4gMjAwMykKLSBQaGlsaXBwZSBSYW91bHQgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG5vdyBtYWtlcyBsaWJjdXJsIHByb3Blcmx5IHN1cHBvcnQKICB3aWxkY2FyZCBjaGVja3MgZm9yIGNlcnRpZmljYXRlIG5hbWVzLgoKLSBTaW1vbiBMaXUgYWRkZWQgQ1VSTE9QVF9IVFRQMjAwQUxJQVNFUywgdG8gbGV0IGFuIGFwcGxpY2F0aW9uIHNldCBvdGhlcgogIHN0cmluZ3MgcmVjb2duaXplZCBhcyAiSFRUUCAyMDAiIHRvIGFsbG93IGh0dHAtbGlrZSBwcm90b2NvbHMgdG8gZ2V0CiAgZG93bmxvYWRlZCBmaW5lIGJ5IGN1cmwuCgotIE5vdyB1c2luZyBhdXRvY29uZiAyLjU3IGFuZCBhdXRvbWFrZSAxLjcuMgoKLSBEb2luZyAiY3VybCAtSSBmdHA6Ly9kb21haW4vbm9uLWV4aXN0aW5nLWZpbGUiIHN0aWxsIG91dHB1dGVkIGEgZGF0ZSEKICBXYXluZSBIYWlnaCByZXBvcnRlZC4KCi0gVGhlIGVycm9yIG1lc3NhZ2UgaXMgbm93IHdyaXR0ZW4gcHJvcGVybHkgd2l0aCBhIG5ld2xpbmUgaW4gdGhlIC0tdHJhY2UKICBmaWxlLgoKRGFuaWVsICg2IEphbiAyMDAzKQotIFN0ZXJsaW5nIEh1Z2hlcyBmaXhlZCBhIHBvc3NpYmxlIGJ1ZzogcHJldmlvdXNseSwgaWYgeW91IGNhbGxlZAogIGN1cmxfZWFzeV9wZXJmb3JtIGFuZCB0aGVuIHNldCB0aGUgZ2xvYmFsIGRucyBjYWNoZSwgdGhlIGdsb2JhbCBjYWNoZQogIHdvdWxkbid0IGJlIHVzZWQuIFBvaW50ZWQgb3V0IGJ5IEplYW4tUGhpbGlwcGUgQmFycmV0dGUtTGFQaWVycmUuCgotIE1hdHRoZXcgQmxhaW4ncyBmaXhlZCB0aGUgVkM2IGxpYmN1cmwgbWFrZWZpbGUgdG8gaW5jbHVkZSBiZXR0ZXIgZGVidWcgZGF0YQogIG9uIGRlYnVnIGJ1aWxkcy4KCkRhbmllbCAoMjcgRGVjIDIwMDIpCi0gUGhpbGlwcGUgUmFvdWx0IHJlcG9ydGVkIGEgYnVnIHdpdGggSFRUUFMgY29ubmVjdGlvbnMgd2hpY2ggSSBldmlkZW50bHkKICBhZGRlZCBpbiBteSAxOSBkZWMgZml4LiBJIGNvcnJlY3RlZCBpdC4KCkRhbmllbCAoMjAgRGVjKQotIElkZWEgZnJvbSB0aGUgRGViaWFuIGxhdGVzdCBwYXRjaDogdXNlIEFNX01BSU5UQUlORVJfTU9ERSBpbiB0aGUgY29uZmlndXJlCiAgc2NyaXB0IHRvIG1ha2UgdGhlIGRlZmF1bHQgbWFrZWZpbGUgbGVzcyBjb25mdXNpbmcgInRvIHRoZSBjYXN1YWwKICBpbnN0YWxsZXIiLgoKVmVyc2lvbiA3LjEwLjMtcHJlMyAoMjAgRGVjKQoKRGFuaWVsICgxOSBEZWMpCi0gTWF0dGhldyBCbGFpbiBwYXRjaGVkIHRoZSBDdXJsX2Jhc2U2NF9kZWNvZGUoKSBmdW5jdGlvbi4KCi0gRXZhbiBKb3JkYW4gcmVwb3J0ZWQgaW4gYnVnIHJlcG9ydCAjNjUzMDIyIHRoYXQgdGhlIFNTTF9yZWFkKCkgdXNhZ2Ugd2FzCiAgd3JvbmcsIGFuZCBpdCBjZXJ0YWlubHkgd2FzLiBJdCBjb3VsZCBsZWFkIHRvIGN1cmwgdXNpbmcgdG9vIG11Y2ggQ1BVIGR1ZSB0bwogIGEgc3R1cGlkIGxvb3AuCgpEYW5pZWwgKDE4IERlYykKLSBBcyBzdWdnZXN0ZWQgYnkgTWFyZ3VzIEZyZXVkZW50aGFsLCBDVVJMRV9IVFRQX05PVF9GT1VORCB3YXMgcmVuYW1lZCB0bwogIENVUkxFX0hUVFBfUkVUVVJORURfRVJST1Igc2luY2UgaXQgaXMgcmV0dXJuZWQgb24gYW55ID49IDQwMCBjb2RlIHdoZW4KICBDVVJMT1BUX0ZBSUxPTkVSUk9SIGlzIHNldC4KCkRhbmllbCAoMTcgRGVjKQotIEJ1ZyByZXBvcnRlZCAjNjUxNDY0LCByZXBvcnRlZCBieSBDaHJpc3RvcGhlciBQYWxtZXIsIHByb3ZpZGVkIGFuIGV4YW1wbGUKICBzb3VyY2UgY29kZSB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlIHRoYXQgaGFuZyB3aGVuIHRyeWluZyB0byBjb25uZWN0IHRvIGEKICBwcm94eSBvbiBhIGxvY2FsaG9zdCBwb3J0IHdoZXJlIG5vIHByb3h5IHdhcyBsaXN0ZW5pbmcuIFRoaXMgYnVnIHdhcyBub3QKICByZXBlYXRhYmxlIG9uIGxpYmN1cmxzIHRoYXQgd2VyZSBJUHY2LWVuYWJsZWQuCgpEYW5pZWwgKDE2IERlYykKLSBDaHJpc3RvcGhlciBQYWxtZXIgYWxzbyBub3RpY2VkIHdoYXQgVm9qdGVjaCBKYW5vdGEgYWxyZWFkeSB3YXMKICBleHBlcmllbmNpbmc6IFRoZSBhdHRlbXB0ZWQgbmFtZSByZXNvbHZlIGZpeCBmb3IgZ2xpYmMgMi4yLjkzIGNhdXNlZCBsaWJjdXJsCiAgdG8gY3Jhc2ggd2hlbiB1c2VkIG9uIHNvbWUgb2xkZXIgZ2xpYmMgdmVyc2lvbnMuIFRoZSBwcm9ibGVtIGlzIG9mIGNvdXJzZQogIHRoZSBzaWxsaW5lc3Mgb2YgdGhlIDIuMi45My4gSSBjb21taXR0ZWQgYSBmaXggdGhhdCBob3BlZnVsbHkgc2hvdWxkIG1ha2UKICB0aGUgYmluYXJ5IHJ1biBmaW5lIG9uIGVpdGhlciBvbmUgb2YgdGhlIHZlcnNpb25zLCBldmVuIHRob3VnaCB0aGUgc29sdXRpb24KICBpcyBub3QgYXMgbmljZSBhcyBJJ2QgbGlrZSBpdCB0byBiZS4KCkRhbmllbCAoMTMgRGVjKQotIEJ1ZyByZXBvcnQgIzY1MTQ2MCBieSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgc2hvd2VkIHRoYXQgd2hlbiB1c2luZyBsaWJjdXJsCiAgdG8gZm9yIGV4YW1wbGUgZ28gb3ZlciBhIHByb3h5IG9uIGxvY2FsaG9zdCwgaXQgd291bGQgYXR0ZW1wdCB0byBjb25uZWN0CiAgdGhyb3VnaCB0aGUgcHJveHkgVFdJQ0UuCgogIEkgYWRkZWQgdGVzdCBjYXNlIDUwMyB3aXRoIHdoaWNoIEkgbWFuYWdlZCB0byByZXBlYXQgdGhpcyBwcm9ibGVtIGFuZCBJCiAgZml4ZWQgdGhlIGNvZGUgdG8gbm90IHJlLWF0dGVtcHQgYW55IGNvbm5lY3RzICh3aGljaCBhbHNvIG1hZGUgaXQgYSBuaWNlcgogIGZpeCBmb3IgdGhlICM2NTA5NDEgYnVnIG1lbnRpb25lZCBiZWxvdykuCgogIFRoZSBzd3Mgc2VydmVyIHdhcyBleHRlbmRlZCB0byBkZWFsIHdpdGggQ09OTkVDVCBpbiBvcmRlciB0byBtYWtlIHRlc3QKICBjYXNlIDUwMyBkbyBnb29kLgoKLSBFdmFuIEpvcmRhbiBwb3N0ZWQgYnVnIHJlcG9ydCAjNjUwOTg5IGFib3V0IGEgbWVtb3J5IGxlYWsgaW4gdGhlIHB1YmxpYyBrZXkKICByZXRyaWV2aW5nIGNvZGUuIEhlIHByb3ZpZGVkIGEgc3VnZ2VzdGVkIGZpeCBhbmQgSSBtZXJlbHkgYXBwbGllZCBpdCEKCi0gQnVnIHJlcG9ydCAjNjUwOTQxLCBwb3N0ZWQgYnkgQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIGlkZW50aWZpZWQgYSBwcm9ibGVtCiAgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBnZXR0aW5nIGZpbGU6Ly8gVVJMcy4gVGhpcyB3YXMgbm93IGZpeGVkIGFuZAogIHRlc3QgY2FzZSA1MDIgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgxMiBEZWMpCi0gVGVzdCBjYXNlIDUwMCBhbmQgNTAxIGFyZSB0aGUgZmlyc3QgZXZlciBsaWJjdXJsIHRlc3QgY2FzZXMgdGhhdCBydW4uCgotIE1hZGUgImNvbmZpZ3VyZSAtLWVuYWJsZS1kZWJ1ZyIgY3V0IG9mZiBhbGwgLU8qIG9wdGlvbnMgdG8gdGhlIGNvbXBpbGVyCgotIEZpbmFsbHkgZml4ZWQgdGhlIHRlc3Qgc3VpdGUncyBmdHAgc2VydmVyIHNvIHRoYXQgdGVzdCBjYXNlIDQwMiBkb2Vzbid0CiAgY2F1c2UgdGhlIGZvbGxvd2luZyB0ZXN0IGNhc2UgdG8gZmFpbCBhbnltb3JlIQoKRGFuaWVsICgxMSBEZWMpCi0gQ1VSTF9NQVhfV1JJVEVfU0laRSBpcyBub3cgZGVjcmVhc2VkIHRvIDE2S0Igc2luY2UgaXQgbWFrZXMgdGhlIFdpbmRvd3MKICB2ZXJzaW9uIHBlcmZvcm0gdXBsb2FkcyBtdWNoIGZhc3RlciEhISBSQnJhbWFudGUgZGlkIGxvdHMgb2YgcmVzZWFyY2ggb24KICB0aGlzIHRvcGljLgoKLSBGaXhlZCB0aGUgI2luY2x1ZGUgaW4gY3VybC9jdXJsLmggdG8gaW5jbHVkZSB0aGUgb3RoZXIgZmlsZXMgb3V0c2lkZSB0aGUKICBleHRlcm4gIkMiIHNjb3BlLgoKRGFuaWVsICgxMCBEZWMpCi0gTW92ZWQgYXJvdW5kIGFuZCBhZGRlZCBtb3JlIGxvZ2ljOgoKICBGaXJzdCwgUE9TVCBkYXRhIGlzIG5ldmVyIHNlbnQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdCBoZWFkZXJzIGluIHRoZSBodHRwLmMKICBjb2RlLiBJdCBpcyBhbHdheXMgc2VudCB0aGUgIm5vcm1hbCIgcmVhZCBjYWxsYmFjayB0aGVuIHNlbmQoKSB3YXkuIFRoaXMgbm93CiAgZW5hYmxlcyBhIHBsYWluIEhUVFAgUE9TVCB0byBiZSBzZW50IGNodW5rZWQgaWYgd2Ugd2FudCB0by4gVGhpcyBhbHNvCiAgcmVkdWNlcyB0aGUgcmlzayBvZiBoYXZpbmcgdmVyeSBiaWcgUE9TVHMgY2F1c2luZyBwcm9ibGVtcy4KCiAgRnVydGhlciwgc2VuZGluZyBvZmYgdGhlIGluaXRpYWwgSFRUUCByZXF1ZXN0IGlzIG5vdCBkb25lIHVzaW5nIGEgbG9vcAogIGFueW1vcmUuIElmIGl0IHdhc24ndCBhbGwgc2VudCBvZmYgaW4gdGhlIGZpcnN0IHNlbmQoKSwgdGhlIHJlc3Qgb2YgdGhlCiAgcmVxdWVzdCBpcyBzZW50IG9mZiBpbiB0aGUgbm9ybWFsIHRyYW5zZmVyIHNlbGVjdCgpIGxvb3AuIFRoaXMgbWFrZXMgc2V2ZXJhbAogIHRoaW5ncyBwb3NzaWJsZSwgYnV0IG1haW5seSBpdCBtYWtlcyBsaWJjdXJsIGJsb2NrIGxlc3Mgd2hlbiB1c2VkIGZyb20gdGhlCiAgbXVsdGkgaW50ZXJmYWNlIGFuZCBpdCBhbHNvIHJlZHVjZXMgdGhlIHJpc2sgb2YgcHJvYmxlbXMgd2l0aCBpc3N1aW5nIHZlcnkKICBsYXJnZSByZXF1ZXN0cy4KCkRhbmllbCAoOSBEZWMpCi0gTW92ZWQgdGhlIHJlYWQgY2FsbGJhY2sgcG9pbnRlciBhbmQgZGF0YSB3aXRoaW4gdGhlIHN0cnVjdHMgdG8gYSBtb3JlCiAgc3VpdGFibGUgcGxhY2UuIFRoaXMgaW4gcHJlcGFyYXRpb24gZm9yIGEgYmV0dGVyIEhUVFAtcmVxdWVzdCBzZW5kaW5nIGNvZGUKICB3aXRob3V0IChhIHNpbGx5KSBsb29wLgoKLSBUaGUgRG9kZHMgZml4IHNlZW1zIG5vdCB0byB3b3JrLgoKLSBWb2p0ZWNoIEphbm90YSB0ZXN0cyBwcm92ZWQgdGhhdCB0aGUgcmVzb2x2ZSBmaXggZnJvbSBvY3QgMjFzdCBpcyBub3QgZ29vZAogIGVub3VnaCBzaW5jZSBvYnZpb3VzbHkgb2xkZXIgZ2xpYmNzIG1pZ2h0IHJldHVybiBFQUdBSU4gd2l0aG91dCB0aGlzIG1lYW5pbmcKICB0aGF0IHRoZSBidWZmZXIgd2FzIHRvbyBzbWFsbC4KCi0gW3RoZSBvdGhlciBkYXldIE1hZGUgbGliY3VybCBsb29wIG9uIHJlY3YoKSBhbmQgc2VuZCgpIG5vdyB1bnRpbCBkb25lLCBhbmQKICB0aGVuIGdldCBiYWNrIHRvIHNlbGVjdCgpLiBQcmV2aW91c2x5IGl0IHdlbnQgYmFjayB0byBzZWxlY3QoKSBtb3JlIG9mdGVuCiAgd2hpY2ggcmVhbGx5IHdhcyBhIHNsaWdodCBvdmVyaGVhZC4gVGhpcyB3YXMgZHVlIHRvIHRoZSByZXBvcnRlZCBwZXJmb3JtYW5jZQogIHByb2JsZW1zIG9uIEhUVFAgUFVUIG9uIFdpbmRvd3MuIEkgY291bGRuJ3Qgc2VlIGFueSBub3RhYmxlIGRpZmZlcmVuY2Ugb24KICBMaW51eC4uLgoKVmVyc2lvbiA3LjEwLjMtcHJlMiAoNCBEZWMgMjAwMikKCkRhbmllbCAoNCBEZWMgMjAwMikKLSBMb3RzIG9mIHdvcmsgd2l0aCBNYWxjb2xtIERvZGRzIG1hZGUgbWUgYWRkIGEgdGVtcG9yYXJ5IGNvZGUgZml4IHRoYXQgbm93CiAgc2hvcnRlbnMgdGhlIHRpbWVvdXQgd2FpdGluZyBmb3IgdGhlIDIyNiBvciAyNTAgbGluZSBhZnRlciBhIGNvbXBsZXRlZAogIEZUUCB0cmFuc2Zlci4KCiAgSWYgbm8gZGF0YSBpcyByZWNlaXZlZCB3aXRoaW4gNjAgc2Vjb25kcywgdGhpcyBpcyB0YWtlbiBhcyBhIHNpZ24gb2YgYSBkZWFkCiAgY29udHJvbCBjb25uZWN0aW9uIGFuZCB3ZSBiYWlsIG91dC4KCkRhbmllbCAoMyBEZWMgMjAwMikKLSBSYWxwaCdzIGJ1ZyByZXBvcnQgIzY0NDg0MSBpZGVudGlmaWVkIGEgcHJvYmxlbSBpbiB3aGljaCBjdXJsIHJldHVybmVkIGEKICB0aW1lb3V0IGVycm9yIGNvZGUgd2hlbiBpbiBmYWN0IHRoZSBwcm9ibGVtIHdhcyBub3QgYSB0aW1lb3V0LiBUaGUgcHJvcGVyCiAgZXJyb3Igc2hvdWxkIG5vdyBiZSBwcm9wYWdhdGVkIGJldHRlciB3aGVuIHRoZXkncmUgZGV0ZWN0ZWQgaW4gdGhlIEZUUAogIHJlc3BvbnNlIHJlYWRpbmcgZnVuY3Rpb24uCgotIFVwZGF0ZWQgdGhlIEJvcmxhbmQgTWFrZWZpbGVzLgoKRGFuaWVsICgyIERlYyAyMDAyKQotIE5pY29sYXMgQmVybG9xdWluIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VkIC0tY3JlYXRlLWRpcnMgdG8gdGhlCiAgY29tbWFuZCBsaW5lIHRvb2wuIFdoZW4gdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIC1vLCBpdCBsZXRzIGN1cmwgY3JlYXRlCiAgW25vbi1leGlzdGluZ10gZGlyZWN0b3JpZXMgdXNlZCBpbiAtbywgc3VpdGFibHkgdXNlZCB3aXRoICMtY29tYmluYXRpb25zCiAgc3VjaCBhczoKCiAgICAgY3VybCAid3d3LmltYWdlcy5jb20ve2Zsb3dlcnMsY2l0aWVzLHBhcmtzLG1vdW50YWluc30vcGljX1sxLTEwMF0uanBnIFwKICAgICAgIC1vICJkaXJfIzEvcGljIzIuanBnIiAtLWNyZWF0ZS1kaXJzCgpWZXJzaW9uIDcuMTAuMy1wcmUxCgpEYW5pZWwgKDI4IE5vdiAyMDAyKQotIEkgdmlzaXRlZCBMYXJzIE5vcmRncmVuIGFuZCBoYWQgYSBnbyB3aXRoIGhpcyBwcm9ibGVtLCB3aGljaCBsZWFkIG1lIHRvCiAgaW1wbGVtZW50IHRoaXMgZml4LiBJZiBsaWJjdXJsIGRldGVjdHMgdGhlIGFkZGVkIGN1c3RvbSBoZWFkZXIKICAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiLCBpdCB3aWxsIG5vdyBlbmFibGUgYSBjaHVua2VkIHRyYW5zZmVyLgoKICBBbHNvLCBjaHVua2VkIHRyYW5zZmVyIGRpZG4ndCBxdWl0ZSB3b3JrIGJlZm9yZSBidXQgc2VlbXMgdG8gZG8gc28gbm93LgoKLSBLamV0aWwgSmFjb2JzZW4gcG9pbnRlZCBvdXQgdGhhdCAuL2NvbmZpZ3VyZSAtLWRpc2FibGUtaXB2NiAtLXdpdGhvdXQtemxpYgogIGRpZG4ndCB3b3JrIG9uIGFueSBwbGF0Zm9ybS4uLgoKRGFuaWVsICgyNiBOb3YgMjAwMikKLSBGaXhlZCBhIGJhZCBhZGRyaW5mbyBmcmVlIGluIHRoZSBob3N0aXAuYyBjb2RlLCBoYXJkbHkgZXhwb3NlZCBhbnl3aGVyZQoKLSBEYW4gQmVja2VyIGZvdW5kIGFuZCBmaXhlZCBhIG1pbm9yIG1lbW9yeSBsZWFrIG9uIHBlcnNpc3RlbnQgY29ubm5lY3Rpb25zCiAgdXNpbmcgQ1VSTE9QVF9VU0VSUFdELgoKRGFuaWVsICgyMiBOb3YgMjAwMikKLSBCYXNlZCBvbiBSYWxwaCBNaXRjaGVsbCdzIGV4Y2VsbGVudCBhbmFseXNpcyBJIGZvdW5kIGEgYnVnIGluIHRoZSB0ZXN0IHN1aXRlCiAgd2ViIHNlcnZlciAoc3dzKSB3aGljaCBub3cgbGV0cyB0ZXN0IGNhc2UgMzA2IHJ1biBmaW5lIGV2ZW4gaW4gY29tYmluYXRpb24KICB3aXRoIHRoZSBvdGhlciB0ZXN0IGNhc2VzLgoKLSBKdWFuIElnbmFjaW8gSGVyduFzIGZvdW5kIGEgY3Jhc2ggaW4gdGhlIHZlcmJvc2UgY29ubmVjdCBtZXNzYWdlIHRoYXQgaXMKICB1c2VkIG9uIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMuIFRoaXMgYnVnIHdhcyBhZGRlZCBpbiA3LjEwLjIgZHVlIHRvIHRoZQogIHJlYXJyYW5nZWQgbmFtZSByZXNvbHZlIGNvZGUuCgpEYW5pZWwgKDIwIE5vdiAyMDAyKQotIEtqZXRpbCBKYWNvYnNlbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlczoKCiAgIENVUkxPUFRfUFJJVkFURSBzdG9yZXMgYSBwcml2YXRlIHBvaW50ZXIgaW4gdGhlIGN1cmwgaGFuZGxlLgoKICAgQ1VSTElORk9fUFJJVkFURSByZXRyaWV2ZXMgdGhlIHByaXZhdGUgcG9pbnRlciBmcm9tIHRoZSBjdXJsIGhhbmRsZS4KCi0gS2Fyb2wgUGlldHJ6YWsgcG9pbnRlZCBvdXQgaG93IGN1cmwtY29uZmlnIC0tY2ZsYWdzIGRpZG4ndCBvdXRwdXQgYSBnb29kCiAgaW5jbHVkZSBkaXIgc28gSSd2ZSByZW1vdmVkIHRoYXQgZm9yIG5vdy4KClZlcnNpb24gNy4xMC4yICgxOCBOb3YgMjAwMikKCkRhbmllbCAoMTEgTm92IDIwMDIpCi0gRGF2ZSBIYWxiYWtrZW4gYWRkZWQgY3VybF92ZXJzaW9uX2luZm8gdG8gbGliL2xpYmN1cmwuZGVmIHRvIG1ha2UgbGliY3VybAogIHByb3Blcmx5IGJ1aWxkIHdpdGggTVNWQyBvbiBXaW5kb3dzLgoKRGFuaWVsICg4IE5vdiAyMDAyKQotIERvaW5nIEhUVFAgUFVUIHdpdGhvdXQgYSBzcGVjaWZpZWQgZmlsZSBzaXplIG5vdyBtYWtlcyBsaWJjdXJsIHVzZQogIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkLgoKRGFuaWVsICg3IE5vdiAyMDAyKQotIEJ1ZyByZXBvcnQgIzYzNDYyNSBpZGVudGlmaWVkIGhvdyBjdXJsIHJldHVybmVkIHRpbWVvdXQgaW1tZWRpYXRlbHkgd2hlbgogIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQgd2FzIHVzZWQgYW5kIHByb3ZpZGVkIGEgZml4LgoKVmVyc2lvbiA3LjEwLjItcHJlNCAoNiBOb3YgMjAwMikKCkRhbmllbCAoNSBOb3YgMjAwMikKLSBMZWhlbCBCZXJuYWR0IGZvdW5kIG91dCBhbmQgZml4ZWQuIGxpYmN1cmwgc2VudCBlcnJvciBtZXNzYWdlIHRvIHRoZSBkZWJ1ZwogIG91dHB1dCB3aGVuIGl0IHN0b3JlZCB0aGUgZXJyb3IgbWVzc2FnZS4KCi0gQXZlcnkgRmF5IGZvdW5kIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgRE5TIGNhY2hlICh3aGVuIHRoZSBjYWNoZSB0aW1lIHdhcwogIHNldCB0byAwIHdlIGdvdCBhIG1lbW9yeSBsZWFrLCBidXQgd2hlbiB0aGUgbGVhayB3YXMgZml4ZWQgaGUgZ290IGEgY3Jhc2gKICB3aGVuIGhlIHVzZWQgdGhlIENVUkxPUFRfSU5URVJGQUNFIHdpdGggdGhhdCkgdGhhdCBoYWQgbWUgZG8gc29tZSByZWFsCiAgcmVzdHJ1Y3R1cmluZyBzbyB0aGF0IHdlIG5vdyBoYXZlIGEgcmVmZXJlbmNlIGNvdW50ZXIgaW4gdGhlIGRucyBjYWNoZQogIGVudHJpZXMgdG8gcHJldmVudCBhbiBlbnRyeSB0byBnZXQgZmx1c2hlZCB3aGlsZSBzdGlsbCBhY3R1YWxseSBpbiB1c2UuCgogIEkgYWxzbyBkZXRlY3RlZCB0aGF0IHdlIHByZXZpb3VzbHkgZGlkbid0IHVwZGF0ZSB0aGUgdGltZSBzdGFtcCB3aGVuIHdlCiAgZXh0cmFjdGVkIGFuIGVudHJ5IGZyb20gdGhlIGNhY2hlIHNvIHRoYXQgbXVzdCd2ZSBiZWVuIGEgcmVhc29uIGZvciBzb21lCiAgdmVyeSB3ZWlyZCBkbnMgY2FjaGUgYnVncy4KClZlcnNpb24gNy4xMC4yLXByZTMKCkRhbmllbCAoMzEgT2N0IDIwMDIpCi0gRG93bmdyYWRlZCBhdXRvbWFrZSB0byAxLjYuMyBpbiBhbiBhdHRlbXB0IHRvIGZpeCBjeWd3aW4gcHJvYmxlbXMuIChJdAogIHR1cm5lZCBvdXQgdGhpcyBkaWRuJ3QgaGVscCB0aG91Z2guKQoKLSBEaXNhYmxlIHRoZSBETlMgY2FjaGUgKGJ5IHNldHRpbmcgdGhlIHRpbWVvdXQgdG8gMCkgbWFkZSBsaWJjdXJsIGxlYWsKICBtZW1vcnkuIEF2ZXJ5IEZheSBicm91Z2h0IHRoZSBleGFtcGxlIGNvZGUgdGhhdCBwcm92ZWQgdGhpcy4KClZlcnNpb24gNy4xMC4yLXByZTIKCkRhbmllbCAoMjggT2N0IDIwMDIpCi0gVXBncmFkZWQgdG8gYXV0b2NvbmYgMi41NCBhbmQgYXV0b21ha2UgMS43IG9uIHRoZSByZWxlYXNlLWJ1aWxkIGhvc3QuCgotIEtldmluIFJvdGggbWFkZSB0aGUgY29tbWFuZCBsaW5lIHRvb2wgY2hlY2sgZm9yIGEgQ1VSTF9DQV9CVU5ETEUgZW52aXJvbm1lbnQKICB2YXJpYWJsZSAoaWYgLS1jYWNlcnQgaXNuJ3QgdXNlZCkgYW5kIGlmIG5vdCBzZXQsIHRoZSBXaW5kb3dzIHZlcnNpb24gd2lsbAogIGNoZWNrIGZvciBhIGZpbGUgbmFtZWQgImN1cmwtY2EtYnVuZGxlLmNydCIgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG9yIHRoZQogIGRpcmVjdG9yeSB3aGVyZSBjdXJsIGlzIGxvY2F0ZWQuIFRoYXQgZmlsZSBpcyB0aGVuIHVzZWQgYXMgQ0Egcm9vdCBjZXJ0CiAgYnVuZGxlLgoKLSBBdmVyeSBGYXkgcG9pbnRlZCBvdXQgdGhhdCBjdXJsJ3MgY29uZmlndXJlIHNjcmlwIGRpZG4ndCBnZXQgcmlnaHQgaWYgeW91CiAgdXNlZCBhdXRvY29uZiBuZXdlciB0aGFuIDIuNTIuIFRoaXMgd2FzIGR1ZSB0byBzb21lIGJhZGx5IHF1b3RlZCBjb2RlLgoKVmVyc2lvbiA3LjEwLjItcHJlMQoKRGFuaWVsICgyMyBPY3QgMjAwMikKLSBFbWlsaWFubyBJZGEgY29uZmlybWVkIHRoYXQgd2Ugbm93IGJ1aWxkIHByb3Blcmx5IHdpdGggdGhlIEJvcmxhbmQgQysrCiAgY29tcGlsZXIgdG9vLiBXZSBuZWVkZWQgeWV0IGFub3RoZXIgZml4IGZvciB0aGUgSVNPIGNwcCBjaGVjayBpbiB0aGUgY3VybC5oCiAgaGVhZGVyIGZpbGUuCgotIFlldCBhbm90aGVyIGZpeCB3YXMgbmVlZGVkIHRvIGdldCB0aGUgSFRUUCBkb3dubG9hZCB3aXRob3V0IGhlYWRlcnMgdG8gd29yay4KICBUaGlzIHRpbWUgaXQgd2FzIG5lZWRlZCBpZiB0aGUgZmlyc3QgImJlbGlldmVkIGhlYWRlciIgd2FzIHJlYWQgYWxsIGluIHRoZQogIGZpcnN0IHJlYWQuIFRlc3QgMzA2IGhhcyBub3QgcnVuIHByb3Blcmx5IHNpbmNlIHRoZSAxMXRoIG9jdG9iZXIgZml4LgoKRGFuaWVsICgyMSBPY3QgMjAwMikKLSBadmkgSGFyJ0VsIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIGN1cmwncyBuYW1lIHJlc29sdmluZyBvbiBSZWRoYXQgOAogIG1hY2hpbmVzIChydW5uaW5nIElQdjYgZGlzYWJsZWQpLiBNYXRzIExpZGVsbCBsZXQgbWUgdXNlIGFuIGFjY291bnQgb24gaGlzCiAgbWFjaGluZSBhbmQgSSBjb3VsZCB2ZXJpZnkgdGhhdCBnZXRob3N0YnluYW1lX3IoKSBoYXMgYmVlbiBjaGFuZ2VkIHRvIHJldHVybgogIEVBR0FJTiBpbnN0ZWFkIG9mIEVSQU5HRSB3aGVuIHRoZSBnaXZlbiBidWZmZXIgc2l6ZSBpcyB0b28gc21hbGwuIFRoaXMgaXMKICBnbGliYyAyLjIuOTMuCgotIEFsYmVydCBDaGluIGhlbHBlZCBtZSBnZXQgdGhlIC1uby11bmRlZmluZWQgb3B0aW9uIGNvcnJlY3RlZCBpbgogIGxpYi9NYWtlZmlsZS5hbSBzaW5jZSBDeWd3aW4gYnVpbGRzIHdhbnQgaXQgdGhlcmUgd2hpbGUgU29sYXJpcyBidWlsZHMgZG9uJ3QKICB3YW50IGl0IHByZXNlbnQuIEtldmluIFJvdGggaGVscGVkIG1lIHRyeSBpdCBvdXQgb24gY3lnd2luLgogIAotIE5pa2l0YSBTY2htaWR0IHByb3ZpZGVkIGEgYnVnIGZpeCBmb3IgYSBGT0xMT1dMT0NBVElPTiBidWcgaW50cm9kdWNlZCB3aGVuCiAgdGhlIC4uLyBzdXBwb3J0IGdvdCBpbiAoNy4xMC4xKS4KCkRhbmllbCAoMTggT2N0IDIwMDIpCi0gRmFicml6aW8gQW1tb2xsbyBwb2ludGVkIG91dCBhIHJlbWFpbmluZyBwcm9ibGVtIHdpdGggRk9MTE9XTE9DQVRJT04gaW4KICB0aGUgbXVsdGkgaW50ZXJmYWNlLgoKRGFuaWVsICgxNyBPY3QgMjAwMikKLSBSaWNoYXJkIENvb3BlcidzIGV4cGVyaW1lbnRpbmcgcHJvdmVkIHRoYXQgLWogKENVUkxPUFRfQ09PS0lFU0VTU0lPTikgZGlkbid0CiAgd29yayBxdWl0ZSBhcyBzdXBwb3NlZC4gWW91IG5lZWRlZCB0byBzZXQgaXQgKmJlZm9yZSogeW91IHVzZQogIENVUkxPUFRfQ09PS0lFRklMRSwgYW5kIHdlIGRvbnQnIHdhbnQgdGhhdCBraW5kIG9mIGRlcGVuZGVuY2llcy4KCkRhbmllbCAoMTUgT2N0IDIwMDIpCi0gQW5kculzIEdhcmPtYSBwcm92aWRlZCBjb3JyZWN0aW9ucyBmb3IgZXJyYXRhcyBpbiBmb3VyIGxpYmN1cmwgbWFuIHBhZ2VzLgoKRGFuaWVsICgxMyBPY3QgMjAwMikKLSBTdGFydGluZyBub3csIHdlIGdlbmVyYXRlIGFuZCBpbmNsdWRlIFBERiB2ZXJzaW9ucyBvZiBhbGwgdGhlIGRvY3MgaW4gdGhlCiAgcmVsZWFzZSBhcmNoaXZlcy4KCkRhbmllbCAoMTIgT2N0IDIwMDIpCi0gVHJ5aW5nIHRvIGNvbm5lY3QgdG8gYSBob3N0IG9uIGEgYmFkIHBvcnQgbnVtYmVyIGNhdXNlZCB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgdG8gbmV2ZXIgcmV0dXJuIGZhaWx1cmUgYW5kIGl0IGFwcGVhcmVkIHRvIGtlZXAgb24gdHJ5aW5nIGZvcmV2ZXIgKGl0IGp1c3QKICBkaWRuJ3QgZG8gYW55dGhpbmcpLgoKRGFuaWVsICgxMSBPY3QgMjAwMikKLSBEb3dubG9hZGluZyBIVFRQIHdpdGhvdXQgaGVhZGVycyBkaWRuJ3Qgd29yayAxMDAlLCBzb21lIG9mIHRoZSBpbml0aWFsIGRhdGEKICBnb3Qgd3JpdHRlbiB0d2ljZS4gS2V2aW4gUm90aCByZXBvcnRlZC4KCi0gS2V2aW4gUm90aCBmb3VuZCBvdXQgdGhlICJjb25maWcgZmlsZSIgcGFyc2VyIGluIHRoZSBjbGllbnQgY29kZSBjb3VsZAogIHNlZ2ZhdWx0LCBsaWtlIGlmIERPUyBuZXdsaW5lcyB3ZXJlIHVzZWQuCgpWZXJzaW9uIDcuMTAuMSAoMTEgT2N0IDIwMDIpCgpEYW5pZWwgKDEwIE9jdCAyMDAyKQotIEplZmYgTGF3c29uIGZpeGVkIGEgZmV3IHByb2JsZW1zIHdpdGggY29ubmVjdGlvbiByZS11c2UgdGhhdCByZW1haW5lZCB3aGVuCiAgeW91IHNldCBDVVJMT1BUX1BST1hZIHRvICIiLgoKRGFuaWVsICg5IE9jdCAyMDAyKQotIENyYWlnIERhdmlzb24gZm91bmQgYSB0ZXJyaWJsZSBmbGF3IGFuZCBDcmlzIEJhaWxpZmYgaGVscGVkIG91dCBpbiB0aGUKICBzZWFyY2guIEdldHRpbmcgSFRUUCBkYXRhIGZyb20gc2VydmVycyB3aGVuIHRoZSBoZWFkZXJzIGFyZSBzcGxpdCB1cCBpbgogIG11bHRpcGxlIHJlYWRzLCBjb3VsZCBjYXVzZSBqdW5rIGRhdGEgdG8gZ2V0IGluc2VydGVkIGFtb25nIHRoZSBzYXZlZAogIGhlYWRlcnMuIFRoaXMgb25seSBjb25jZXJucyBIVFRQKFMpIGhlYWRlcnMuCgpEYW5pZWwgKDggT2N0IDIwMDIpCi0gVmluY2VudCBQZW5xdWVyYydoIGdhdmUgdXMgdGhlIGdvb2Qgc3VnZ2VzdGlvbiB0aGF0IHdoZW4gdGhlIEVSUlJPUkJVRkZFUgogIGlzIHNldCBpbnRlcm5hbGx5LCB0aGUgZXJyb3IgdGV4dCBpcyBzZW50IHRvIHRoZSBkZWJ1ZyBmdW5jdGlvbiBhcyB3ZWxsLgoKLSBJIGZpeGVkIHRoZSB0ZWxuZXQgY29kZSB0byB0aW1lb3V0IHByb3Blcmx5IGFzIHRoZSBvcHRpb24gdGVsbHMgaXQgdG8uIE9uCiAgbm9uLXdpbmRvd3MgcGxhdGZvcm1zLgoKRGFuaWVsICg3IE9jdCAyMDAyKQotIEpvaG4gQ3JvdyBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwtdGhlLWd1aWRlIHdhc24ndCBpbmNsdWRlZCBpbiB0aGUgcmVsZWFzZQogIHRhcmJhbGwhCgotIEtldmluIFJvdGggcG9pbnRlZCBvdXQgdGhhdCBtYWtlIGluc3RhbGwgZGlkbid0IGRvIHJpZ2h0IGlmIGJ1aWxkIG91dHNpZGUKICB0aGUgc291cmNlIHRyZWUgKGNhLWJ1bmRsZSB3aXNlKS4KCi0gRk9MTE9XTE9DQVRJT04gYnVnZml4IGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlCgpEYW5pZWwgKDQgT2N0IDIwMDIpCi0gS2V2aW4gUm90aCBnb3QgcHJvYmxlbXMgd2l0aCBoaXMgY3lnd2luIGJ1aWxkIHdpdGggLW5vLXVuZGVmaW5lZCB3YXMgbm90CiAgcHJlc2VudCBpbiBsaWIvTWFrZWZpbGUuYW0gc28gSSBwdXQgaXQgYmFjayBpbiB0aGVyZSBhZ2Fpbi4gVGhlIHBvb3Igb25lIHdobwogIG5lZWRzIHRvIHJlbW92ZSBpdCBhZ2FpbiBtdXN0IHdyaXRlIGEgY29uZmlndXJlIHNjcmlwdCB0byBkZXRlY3QgdGhhdCBuZWVkLgoKLSBSYWxwaCBNaXRjaGVsbCBwb2ludGVkIG91dCB0aGF0IGN1cmwgd2FzIGEgYml0IG5haXZlIGFuZCBkaWRuJ3QgZGVhbCB3aXRoIC4vCiAgb3IgLi4vIHN0dWZmIGluIHRoZSBzdHJpbmcgcGFzc2VkIGJhY2sgaW4gYSBMb2NhdGlvbjogaGVhZGVyIHdoZW4gZm9sbG93aW5nCiAgbG9jYXRpb25zLgoKLSBBbGJlcnQgQ2hpbiBoZWxwZWQgbWUgdG8gd29yayBvdXQgYSBiZXR0ZXIgY29uZmlndXJlLmluIGNoZWNrIGZvciB6bGliLCBhbmQKICBib3RoIC0td2l0aG91dC16bGliIGFuZCAtd2l0aC16bGliIHNlZW0gdG8gd29yayByYXRoZXIgd2VsbCByaWdodCBub3cuCgotIFp2aSBIYXInRWwgaW1wcm92aWVkIHRoZSBPcGVuU1NMIEVOR0lORSBjaGVjayBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCB0bwogIGJlY29tZSBtb3JlIGFjY3VyYXRlLgoKRGFuaWVsICgxIE9jdCAyMDAyKQotIERldGxlZiBTY2htaWVyIHBvaW50ZWQgb3V0IHRoZSBsYWNrIG9mIGEgLS13aXRob3V0LWxpYnogb3B0aW9uIHRvIGNvbmZpZ3VyZSwKICBzbyBJIGFkZGVkIG9uZS4KClZlcnNpb24gNy4xMCAoMSBPY3QgMjAwMikKCkRhbmllbCAoMzAgU2VwIDIwMDIpCi0gTW9kaWZpZWQgdGhlIGN1cmxfdmVyc2lvbl9pbmZvKCkgcHJvdG8gYW5kIHJldHVybmVkIHN0cnVjdCBvbmNlIGFnYWluLCBhbmQKICB1cGRhdGVkIHRoZSBtYW4gcGFnZSBhY2NvcmRpbmdseS4KCi0gQ3JpcyBCYWlsaWZmIGZvdW5kIG91dCB0aGF0IHRoZSBwcmUtcmVsZWFzZXMgY3Jhc2hlZCBvbiBuYW1lIGxvb2t1cHMgb24KICBuYW1lcyBzdWNoIGFzICJhOiIgb3IgImJhejoiIChvbiBMaW51eCB2ZXJzaW9ucyBub3QgYmVpbmcgaXB2Ni1lbmFibGVkKSBkdWUKICB0byBzb21lIHdlaXJkIHJldHVybiBjb2RlcyBmcm9tIGdldGhvc3RieW5hbWVfcigpLiBJJ2xsIGJsYW1lIHRoZSBjb21wbGV0ZQogIGxhY2sgb2YgZG9jcyBpbiB0aGF0IGRlcGFydG1lbnQuIENyaXMgcHJvdmlkZWQgYSBmaXgsIHdoaWNoIEkgbW9kaWZpZWQgb25seQogIHNsaWdodGx5LgoKRGFuaWVsICgyNyBTZXAgMjAwMikKLSBBZnRlciBhIHN1Z2dlc3Rpb24gZnJvbSBDaHJpc3RpYW4gS3VyeiB0byBEZWJpYW4gY3VybCBwYWNrYWdlIG1haW50YWluZXIKICBEb21lbmljbyBBbmRyZW9saSwgSSBtYWRlIGl0IHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoZSBwcm94eSBlbnZpcm9ubWVudAogIHZhcmlhYmxlcyBiZXR0ZXIuIE5vdywgYnkgc2V0dGluZyAteCAiIiB5b3UgY2FuIGV4cGxpY2l0bHkgdGVsbCBsaWJjdXJsIHRvCiAgbm90IHVzZSBhIHByb3h5LCBubyBtYXR0ZXIgd2hhbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNheS4KClZlcnNpb24gNy4xMC1wcmU0CgpEYW5pZWwgKDI2IFNlcCAyMDAyKQotIEV4dGVuZGVkIGN1cmxfdmVyc2lvbl9pbmZvKCkgbW9yZSBhbmQgd3JvdGUgYSBtYW4gcGFnZSBmb3IgaXQuCgpEYW5pZWwgKDI1IFNlcCAyMDAyKQotIGxpYmN1cmwgY291bGQgbGVhayBtZW1vcnkgd2hlbiBkb3dubG9hZGluZyBtdWx0aXBsZSBmaWxlcyB1c2luZyBodHRwIHJhbmdlcywKICByZXBvcnRlZCBhbmQgZml4ZWQgYnkgSmVhbi1MdWMgR3VldmVsLgoKLSBXYWx0ZXIgSi4gTWFjayBwcm92aWRlZCBjb2RlIGFuZCBkb2NzIGZvciB0aGUgbmV3IGN1cmxfZnJlZSgpIGZ1bmN0aW9uIHRoYXQKICBzaGFsbCBiZSB1c2VkIHRvIGZyZWUgbWVtb3J5IHRoYXQgaXMgYWxsb2NhdGVkIGJ5IGxpYmN1cmwgYW5kIHJldHVybmVkIGJhY2sKICB0byB0aGUgYXBwbGljYXRpb24sIGFzIGN1cmxfZXNjYXBlKCkgYW5kIGN1cmxfdW5lc2NhcGUoKSBkby4KCi0gWWFycmFtIFN1bmlsIHBvaW50ZWQgb3V0IGEgZmxhdyBpbiB0aGUgbXVsdGkgaW50ZXJmYWNlIHdoZXJlIGEgZmFpbGVkCiAgY29ubmVjdGlvbiBkaWRuJ3QgY2xvc2UgZG93biBwcm9wZXJseSBhbmQgdGh1cyBhIHNlY29uZCB0cmFuc2ZlciB1c2luZyB0aGUKICBzYW1lIGhhbmRsZSBmYWlsZWQuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgYSBmbGF3IHRoYXQgbWFkZSAoYW1vbmcgb3RoZXIgdGhpbmdzKSBkaWN0LWZldGNoZXMKICByZXR1cm4gYSByYW5kb20gdmFsdWUuCgpEYW5pZWwgKDI0IFNlcCAyMDAyKQotIFdleiBGdXJsb25nIGJyb3VnaHQgaGlzIGluaXRpYWwgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VkIGN1cmxfdmVyc2lvbl9pbmZvKCkuCiAgV2UgbWlnaHQgbmVlZCB0byB0d2VhayBpdCBzb21ld2hhdCBiZWZvcmUgcmVsZWFzZS4KCkRhbmllbCAoMjAgU2VwIDIwMDIpCi0gQ3JhaWcgTWFya3dhcmR0IGZpeGVkIGFub3RoZXIgVHJ1NjQgSVAgcmVzb2x2ZSBwcm9ibGVtLgoKRGFuaWVsICgxOSBTZXAgMjAwMikKLSBEb2xibmVmZiBBLlYgYW5kIFNwaXJpZG9ub2ZmIEEuViBtYWRlIHRoZSBmaWxlOi8vIGNvZGUgd29yayB3aXRoIHJlc3VtZXMKICBpbiB0aGUgc2FtZSBzdHlsZSBvdGhlciBjb2RlIGRvZXMuCgotIElsZ3VpeiBMYXR5cG92IGZpeGVkIGEgZmxhdyBpbiB0aGUgY2xpZW50IGNvZGUgd2hlbiBmZXRjaGluZyBtdWx0aXBsZSBVUkxzCiAgYW5kIC1DIC0gd2FzIHVzZWQuIFRoZSBmaXJzdCBmaWxlJ3MgcmVzdW1lIHBvc2l0aW9uIHdhcyB0aGVuIGFjY2lkZW50YWxseQogIHJldXNlZCBvbiBhbGwgdGhlIG90aGVyIGZpbGVzIHRvby4KCkRhbmllbCAoMTggU2VwIDIwMDIpCi0gVGhlIGN1cmxfZWFzeV9zZXRvcHQuMyBtYW4gcGFnZSB3YXMgZ3JlYXRseSBtb2RpZmllZCBhbmQgdGhlIG9wdGlvbnMgaGF2ZQogIG5vdyBiZWVuIGdyb3VwZWQgaW4gbG9naWNhbCBncm91cHMgc28gdGhhdCBpdCBzaG91bGQgYmUgc29tZXdoYXQgZWFzaWVyIHRvCiAgcmVhZCBpdCBhbmQgZmluZCB0aGluZ3MgeW91IHNlYXJjaCBmb3IuCgpEYW5pZWwgKDEzIFNlcCAyMDAyKQotIEtldmluIFJvdGggcGlucG9pbnRlZCBhIHNjYXJ5IGZsYXcgaW4gbGliY3VybCwgd2hlbiB0aGUgSFRUUCBzZXJ2ZXIgZG9lc24ndAogIHNlbmQgYW55IGhlYWRlcnMgYmFjaywgb25seSByYXcgY29udGVudC4gUmlnaHQsIHRoYXQgaXMgYSB2aW9sYXRpb24gb2YgdGhlCiAgc3RhbmRhcmQgYnV0IHN0aWxsIGhhcHBlbnMgYXQgdGltZXMgYW5kIHdlIG5lZWQgdG8gZGVhbCB3aXRoIGl0LiBUZXN0IGNhc2UKICAzMDYgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGF0IHdlIGRvIHJpZ2h0IG5vdy4KClZlcnNpb24gNy4xMC1wcmUzCgpEYW5pZWwgKDExIFNlcCAyMDAyKQotIEx1a2FzeiBDemVraWVyZGEgZm91bmQgb3V0IHRoYXQgY3VybCBkaWRuJ3Qgc2VuZCBhIGNvcnJlY3QgSFRUUCBIb3N0OiBoZWFkZXIKICB3aGVuIHlvdSBzcGVjaWZpZWQgdGhlIFVSTCB3aXRoIGFuIElQdjYgSVAtYWRkcmVzcy4KCkRhbmllbCAoNCBTZXAgMjAwMikKLSBTdmVuIE5ldWhhdXMgbWFkZSAtLXNpbGVudCBiZWluZyBhY2tub3dsZWRnZWQgZXZlbiB3aGVuIG11bHRpcGxlIFVSTHMKICB3ZXJlIHVzZWQuIEl0IHVzZWQgdG8gb3V0cHV0ICJbMS8yXTogaHR0cDovL2hvc3QvYS5odG1sLmRlIC0tPiBhLmh0bWwuZCIgZXRjCiAgZXZlbiB3aGVuIHRvbGQgdG8gc2h1dCB1cC4KCkRhbmllbCAoMyBTZXAgMjAwMikKLSBVcGRhdGVkIGFsbCBzb3VyY2UgY29kZSBoZWFkZXJzIHRvIHVzZSBNSVQtbGljZW5zZSByZWZlcmVuY2VzIG9ubHksIGFuZAogIHBvaW50IHRvIHRoZSBDT1BZSU5HIGZpbGUgYW5kIHRoZSBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvY29weXJpZ2h0Lmh0bWwKICBVUkwuIEkndmUgY3V0IG91dCBhbGwgcmVmZXJlbmNlcyB0byBNUEwgdGhhdCBJIGNvdWxkIGZpbmQuCgotIENvcmVjdGVkIHRoZSBtYWtlZmlsZXMgdG8gbm90IGFsd2F5cyB1c2UgLWx6IHdoZW4gbGlua2luZwoKVmVyc2lvbiA3LjEwLXByZTIKCkRhbmllbCAoMiBTZXAgMjAwMikKLSBKYW1lcyBHYWxsYWdoZXIgYWRkZWQgQ29udGVudC1FbmNvZGluZyBzdXBwb3J0IHRvIGxpYmN1cmwgc28gbm93IGN1cmwgYW5kCiAgbGliY3VybC11c2luZyBhcHBzIGNhbiByZXF1ZXN0IGNvbXByZXNzZWQgY29udGVudHMgdXNpbmcgdGhlICdkZWZsYXRlJwogIG1ldGhvZC4gU2VlIHRoZSBzcGVjaWFsIGZpbGUgbGliL1JFQURNRS5lbmNvZGluZyBmb3IgZGV0YWlscy4KCiAgY3VybCAtLWNvbXByZXNzZWQgaXMgbm93IHVzZWQgdG8gcmVxdWVzdCBjb21wcmVzc2VkIGNvbnRlbnRzLgoKICBjdXJsLWNvbmZpZyAtLWZlYXR1cmUgd2lsbCBpbmNsdWRlICdsaWJ6JyBpZiB0aGlzIGZlYXR1cmUgd2FzIGFyb3VuZCB3aGVuCiAgdGhlIGxpYnJhcnkgd2FzIGJ1aWx0LgoKRGFuaWVsICgzMCBBdWcgMjAwMikKLSBBcHBsaWVkIGFuIGFub255bW91cyBTT0NLUzUtcHJveHkgcGF0Y2guIE5vdCBwcm9wZXJseSB3b3JraW5nIGluIGFsbAogIHNpdHVhdGlvbnMgdGhvdWdoLCBhcyBhbGwgZ2V0YWRkcmluZm8oKS11c2luZyBsaWJjdXJscyB3aWxsIGZhaWwgb24gdGhpcy4KICBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIHNvbWV3aGF0IG5haXZlIHdheSB0aGUgY3VycmVudCBjb2RlIHRyaWVzIHRvIGV4dHJhY3QKICB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcHJveHkuCgotIEZpeGVkIHVwIHRoZSBTU0wgY2VydCBmaXhlcyBmcm9tIHRoZSBvdGhlciBkYXkgZXZlbiBtb3JlIGFmdGVyIG1vcmUgaW5wdXRzCiAgZnJvbSBDcmlzLiBBZGRlZCB0aHJlZSBuZXcgU1NMIGVycm9yIGNvZGVzIHRvIG1ha2UgdGhlCiAgQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1Igc2xpZ2h0bHkgbGVzcyBvdmVybG9hZGVkLgoKRGFuaWVsICgyNyBBdWcgMjAwMikKLSBBZnRlciBsb3RzIG9mIHRhbGsgd2l0aCBUb20gWmVydWNoYSwgTmljayBHaW1icm9uZSBhbmQgQ3JpcyBCYWlsaWZmIEkKICBkZWNpZGVkIHRvIHRhbGsgdGhlIGJvbGQgcGF0aCBhbmQgSSBub3cgbWFkZSBsaWJjdXJsIGRvIENBIGNlcnRpZmljYXRlCiAgdmVyaWZpY2F0aW9uIGJ5IGRlZmF1bHQuIFRodXMgbGlicmFyeSB1c2VycyBuZWVkIHRvIGV4cGxpY2l0bHkgdHVybiB0aGlzIG9mZgogIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdG8gc2l0ZXMgd2l0aG91dCBwcm9wZXIgY2hlY2tpbmcuIFdlIGFsc28gaW5zdGFsbCBhCiAgQ0EgY2VydCBidW5kbGUgb24gJ21ha2UgaW5zdGFsbCcgbm93LgoKICBUaGUgY3VybCB0b29sIG5vdyByZXF1aXJlcyB0aGUgLWsvLS1pbnNlY3VyZSBvcHRpb24gaW4gb3JkZXIgdG8gYWxsb3cKICBjb25uZWN0aW9ucyBhbmQgb3BlcmF0aW9ucyBvbiBTU0wgc2l0ZXMgdGhhdCBhcmVuJ3QgcHJvcGVybHkgdmVyaWZpZWQgd2l0aAogIC1jYWZpbGUgb3IgLS1jYXBhdGguCgogIGN1cmwtY29uZmlnIC0tY2EgZGlzcGxheXMgdGhlIGJ1aWx0LWluIHBhdGggdG8gdGhlIENBIGNlcnQgYnVuZGxlLgoKRGFuaWVsICgyNiBBdWcgMjAwMikKLSBBbmRyZXcgRnJhbmNpcyBjbGVhbmVkIHVwIHNvbWUgY29kZSB0aGF0IG5vdyBjb21waWxlcyBmaW5lIHdpdGhvdXQgdGhlIG5lZWQKICBmb3IgdWdseSBNU1ZDIHByYWdtYXMuCgotIEtlaXRoIE1hY0RvbmFsZCBmb3VuZCBhIG1pbm9yIGJ1ZyBpbiBzcmMvbWFpbi5jIHRoYXQgbWFkZSBpdCBjbG9zZSBzdGRpbgogIGluc3RlYWQgb2YgdGhlIGFjdHVhbCBmaWxlIGhhbmRsZS4gSXQgc2hvdWxkbid0IGhhdmUgcmVzdWx0ZWQgaW4gbXVjaAogIHRyb3VibGUgYXMgbW9zdCBvcGVyYXRpbmcgc3lzdGVtcyBjbG9zZSBhbGwgZmlsZSBoYW5kbGVzIG9uIHByb2Nlc3MgZXhpdAogIGFueXdheS4KCkRhbmllbCAoMjIgQXVnIDIwMDIpCi0gTWFya3VzIE9iZXJodW1lciBwcm92aWRlZCBzb21lIGRvY3VtZW50YXRpb24gZm9yIGhpcyBwcmV2aW91c2x5IHByb3ZpZGVkCiAgQ1VSTE9QVF9OT1NJR05BTCBmaXguCgotIFBhdGNoZWQgdGhlIGxpYi9NYWtlZmlsZS5hbSB0byBob3BlZnVsbHkgbm8gbG9uZ2VyIGNvbXBsYWluIG9uIHVuZGVmaW5lZAogIHN5bWJvbHMgdGhhdCBzZWVtZWQgdG8gb2NjdXIgb24gYnVpbGRzIHdpdGggc2hhcmVkIE9wZW5TU0wgbGlicmFyaWVzIG9uCiAgU29sYXJpcyBsYXRlbHkuLi4KCkRhbmllbCAoMjAgQXVnIDIwMDIpCi0gRml4ZWQgY29tcGlsZXIgd2FybmluZ3Mgb24gTVNDVisrIGNvbXBpbGVzLiBXZSdyZSBsb29raW5nIGZvciBoZWxwIGhlcmU6CiAgcmVtb3ZlIHRoZSBwcmFnbWFzIGZyb20gbGliL2NvbmZpZy13aW4zMi5oIGFuZCBhZGp1c3QgdGhlIHNvdXJjZXMgd2hlcmUKICB0aGUgd2FybmluZ3Mgb2NjdXIuIEhpZGluZyB0aGVtIHdpdGggcHJhZ21hcyBsaWtlIHRoaXMgaXMgbm90IHRoZSBjb3JyZWN0CiAgd2F5IG9mIGRlYWxpbmcgd2l0aCBjb21waWxlciB3YXJuaW5ncy4KCkRhbmllbCAoMTMgQXVnIDIwMDIpCi0gVWxyaWNoIFphZG93IG1hZGUgdGhlIGdsb2JhbCBpbmNsdWRlIGZpbGVzIGluIGN1cmwvKiBpbmNsdWRlIHRoZW1zZWx2ZXMKICB1c2luZyAiY3VybC5oIiBpbnN0ZWFkIG9mIDxjdXJsL2N1cmwuaD4gd2hpY2ggdGh1cyBhbGxvd3MgcGVvcGxlIHRvIG1vcmUKICBmcmVlbHkgZGVjaWRlIGhvdyB0byBpbmNsdWRlIGN1cmwgYW5kIGhvdyB0byBzZXR1cCB0aGVpciBpbmNsdWRlIHBhdGhzLgoKLSBTdGVybGluZyBIdWdoZXMgYWRkZWQgdGhlIGN1cmxfc2hhcmUqIGludGVyZmFjZSwgc29tZXdoYXQgYXMgZGlzY3Vzc2VkCiAgcHJldmlvdXNseS4KCi0gSvZybiBIYXJ0cm90aCBwb2ludGVkIG91dCB0aGF0IHBvbGwoKSB3YXMgdXNlZCBpbiB0aGUgcHJlMSBzb3VyY2UgY29kZSBhbmQKICBpdCBpc24ndCB2ZXJ5IHBvcnRhYmxlLCBzbyBub3cgSSBjaGVjayBmb3IgaXQgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kCiAgd29yayBhcm91bmQgaXQuCgpWZXJzaW9uIDcuOS45LXByZTEKCkRhbmllbCAoMTIgQXVnIDIwMDIpCi0gQXBwbGllZCBteSBpbml0aWFsIHRha2Ugb24gbWFraW5nIHRoZSBtdWx0aSBzdHVmZiBtb3JlIGFzeW5jaHJvbm91cy4gQ29ubmVjdHMKICBzaG91bGQgbm93IHJldHVybiBiYWNrIHdpdGhvdXQgImhhbmdpbmciIHVudGlsIGl0IGhhcyBjb25uZWN0ZWQgZm9yIHJlYWwuCiAgVGhpcyBzaG91bGQgYWxzbyBiZSB0aGUgY2FzZSBmb3IgRlRQLVBBU1YgY29ubmVjdHMuCgpEYW5pZWwgKDkgQXVnIDIwMDIpCi0gQXBwbGllZCBNYXJrdXMgRi5YLkouIE9iZXJodW1lcidzIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBDVVJMT1BUX05PU0lHTkFMLAogIHdoaWNoIGVmZmVjdGl2ZWx5IHByZXZlbnRzIGxpYmN1cmwgZnJvbSBkb2luZyBhbnl0aGluZyB0aGF0IG1heSBjYXVzZQogIHNpZ25hbHMgdG8gZ2V0IHNlbnQuIFRoaXMgaXMgYmFzaWNseSBmb3IgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zIHRoYXQKICBub3cgY2FuIHVzZSB0aW1lb3V0cyBwcm9wZXJseSwgd2l0aG91dCByaXNraW5nIGFueSBzaWduYWxzIHRvIGJ1cnN0IGluIGFuZAogIHJ1aW4gdGhlIHBhcnR5LgogIApEYW5pZWwgKDUgQXVnIDIwMDIpCi0gTHVrYXN6IEN6ZWtpZXJkYSByZXBvcnRlZCB0aGF0IFJGQzI3MzItc3R5bGUgbGl0ZXJhbCBJUHY2IGFkZHJlc3NlcyBkaWRuJ3QKICB3b3JrLiBXaGVuIGRpZCB0aGF0IGNvZGUgdmFuaXNoPyBBbnl3YXksIGl0J3MgYmFjayBhZ2FpbiBub3cgYW5kIHNlZW1zIHRvCiAgd29yayEKCi0gSm9uYXRhbiBMYW5kZXIgZm91bmQgb3V0IHRoYXQgUE9TVGluZyBhbiBlbXB0eSBzdHJpbmcgZGlkbid0IHdvcmsgd2l0aCB0aGUKICBjb21tYW5kIGxpbmUgdG9vbC4KCkRhbmllbCAoMyBBdWcgMjAwMikKLSBK9nJuIEhhcnRyb3RoIGZpeGVkIHRoZSBsaWJjdXJsLmRlZiBmaWxlIHRvIGJ1aWxkIHRoZSB3aW5kb3dzIERMTCB3aXRoCiAgdGhlIG11bHRpIGludGVyZmFjZSBlbmFibGVkLgoKRGFuaWVsICgxIEF1ZyAyMDAyKQotIFRoZSBmdHAgUE9SVCBjb21tYW5kIG5vdyB1c2VzIGEgYmV0dGVyIGRlZmF1bHQgSVAgYWRkcmVzcywgYXMgaXQgd2lsbAogIGV4dHJhY3QgYW5kIHVzZSB0aGUgbG9jYWwgSVAgYWRkcmVzcyB1c2VkIGJ5IHRoZSBjb250cm9sIGNvbm5lY3Rpb24uCgotIE1vZGlmaWVkIHRoZSAjaW5jbHVkZSBsaW5lcyBpbiBjdXJsL211bHRpLmggdG8gd29yayBiZXR0ZXIgb24gbW9yZQogIHBsYXRmb3Jtcy4KCkRhbmllbCAoMzEgSnVsIDIwMDIpCi0gQXR0ZW1wdGVkIGEgZml4IGZvciBSYXkgRGVHZW5uYXJvJ3MgcmVwb3J0ZWQgSFAtVVggaG9zdCBuYW1lIHJlc29sdmUKICBwcm9ibGVtcy4KCkRhbmllbCAoMzAgSnVsIDIwMDIpCi0gUHJpeWEgUmFtYWtyaXNobmFuIGFuZCBSeWFuIEpvbmVzIGNvbXBpbGVzIGN1cmwvY3VybC5oIHdpdGggYSBDKysgY29tcGlsZXIKICBhbmQgZG9uJ3QgZ2V0IF9fU1REQ19fIGRlZmluZWQsIHdoaWNoIHJlcXVpcmVkIHVzIHRvIGV4dGVuZCB0aGUgcHJlcHJvY2Vzc29yCiAgY2hlY2sgZm9yIHRoZSAjIyBvcGVyYXRvciB1c2FnZS4KCi0gQ29ycmVjdCB0aGUgZGVzY3JpcHRpb24gZm9yIENVUkxPUFRfUEFTU1dERlVOQ1RJT04sIGlmIHNldCB0byBOVUxMIHRoZQogIGludGVybmFsIGRlZmF1bHQgZnVuY3Rpb24gd2lsbCBiZSBwdXQgYmFjay4KCi0gZGFuZnV6eiBhdCBtaWxrLmNvbSBmb3VuZCBvdXQgdGhhdCBsaWJjdXJsIGJhZGx5IGFzc3VtZWQgYSBzcGFjZSBhZnRlcgogICdTZXQtQ29va2llOicgc28gaWYgaXQgd2Fzbid0IHByZXNlbnQsIGl0IGNhdXNlZCB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZQogIGNvb2tpZSBuYW1lIHRvIGZhbGwgb2ZmIQoKRGFuaWVsICgyOSBKdWwgMjAwMikKLSBUaGUgcGFzc3dvcmQgcHJvbXB0IGFza2luZyBmb3IgdXNlciBwYXNzd29yZCB1c2VkIHN0ZG91dCBhbmQgbm93IHVzZXMKICBzdGRlcnIgaW5zdGVhZCB0byBiZXR0ZXIgYWxsb3cgcmVkaXJlY3RpbmcuIEl0IGFsc28gbGVha2VkIGEgZm9wZW4oKSBmaWxlCiAgaGFuZGxlIHRoYXQgaXMgbm93IGZpeGVkLgoKRGFuaWVsICgyOCBKdWwgMjAwMikKLSBIQVZFX1NFVFZCVUYgd2FzIGxlZnQgb3V0IGZyb20gc3JjL21haW4uYyB3aGljaCBtYWRlIC1OIG5vdCB3b3JrLiBGb3VuZCBvdXQKICBieSBNIFQuCgpEYW5pZWwgKDI2IEp1biAyMDAyKQotIEdsZW4gTmFrYW11cmEgc29sdmVkIGEgY3Jhc2ggaW4gdGhlIG5hbWUgcmVzb2x2aW5nIGZ1bmN0aW9uIGZvciBJUC1vbmx5CiAgYWRkcmVzc2VzIG9uIEFscGhhIExpbnV4IChhdCBsZWFzdCkuCgotIFQuIEJoYXJhdGggY29ycmVjdGVkIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIgaW50cm9kdWNlZCBpbiA3LjkuOC4KCkRhbmllbCAoMjIgSnVuIDIwMDIpCi0gQW5kculzIEdhcmPtYSBwb2ludGVkIG91dCBtYW4gcGFnZSBlcnJvcnMgaW4gY3VybF9mb3JtYWRkLjMuIEkgZml4ZWQuCgpEYW5pZWwgKDE5IEp1biAyMDAyKQotIENocmlzIENvbWJlcyBwb2ludGVkIG91dCBhIGZsYXcgaW4gY3VybF9lc2NhcGUoKS4gSSBmaXhlZC4gV2Ugbm8gbG9uZ2VyCiAgdHJpZXMgdG8gZ2VuZXJhdGUgbm9yIHBhcnNlICcrJyBpbiBVUkxzLiBTcGFjZXMgYmVjb21lICUyMCwgYW5kIG9ubHkgJS1jb2RlcwogIGFyZSB0cmFuc2xhdGVkIGJ5IGN1cmxfdW5lc2NhcGUoKS4KCkRhbmllbCAoMTUgSnVuIDIwMDIpCi0gQWRkZWQgLS1saW1pdC1yYXRlIHRvIHRoZSBjdXJsIHRvb2wuIEFsbG93cyB0aGUgdXNlciB0byBzZXQgYSBtYXhtaW11bQogIHVwcGVyIGxpbWl0IHRvIGhvdyBtdWNoIGJhbmR3aWR0aCB0byB1c2UgZm9yIHRyYW5zZmVycy4KCi0gQ1VSTE9QVF9CVUZGRVJTSVpFIHdhcyBhZGRlZCB0byBsaWJjdXJsLiBUaGlzIHNldHMgYSBwcmVmZXJlZCBzaXplIGZvciB0aGUKICByZWNlaXZlIGJ1ZmZlciBpbiBsaWJjdXJsLiBUaGUgbWFpbiBwb2ludCBvZiB0aGlzIHdvdWxkIGJlIHRoYXQgdGhlIHdyaXRlCiAgY2FsbGJhY2sgZ2V0cyBjYWxsZWQgbW9yZSBvZnRlbiBhbmQgd2l0aCBzbWFsbGVyIGNodW5rcy4KCkRhbmllbCAoMTQgSnVuIDIwMDIpCi0gWWFycmFtIFN1bmlsIGZvdW5kIG91dCB0aGF0IHRoZSBTb2NrZXRJc0RlYWQoKSBmdW5jdGlvbiBwZXJmb3JtZWQgYSBsb3QKICBmYXN0ZXIgb24gV2luZG93cyB3aGVuIHJlbW92aW5nIHRoZSAxIG1pY3Jvc2Vjb25kIHRpbWVvdXQuCgotIEhhbm5vIEwuIEtyYW56aG9mZiBmaXhlZCB0aGUgVkMrKyBwcm9qZWN0IGZpbGVzLgoKLSBUb20gTWF0dGlzb24gZm91bmQgb3V0IHRoYXQgZnRwIHRyYW5zZmVycyBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gYSBsaXR0bGUKICB0b28gb2Z0ZW4uCgotIE1pa2xvcyBOZW1ldGggcG9zdGVkIGEgVkMrKyBtYWtlZmlsZSBmaXggYW5kIHNvbWUgSU5TVEFMTCBjb21tZW50cyBvbiBob3cKICB0byBkaXNhYmxlIHNwZWNpZmljIHByb3RvY29scyB3aGVuIGJ1aWxkaW5nIGZvciBXaW5kb3dzLgoKVmVyc2lvbiA3LjkuOAoKRGFuaWVsICgxMyBKdW4gMjAwMikKLSBUaW1lIHRvIGxldCB0aGlzIGJhYnkgZ28uCgpEYW5pZWwgKDEyIEp1biAyMDAyKQotIENocmlzIENvbWJlcyBhZGRlZCB0aHJlZSBuZXcgb3B0aW9ucyBmb3IgY3VybF9mb3JtYWRkKCk6IENVUkxGT1JNX0JVRkZFUiwKICBDVVJMRk9STV9CVUZGRVJQVFIsIENVUkxGT1JNX0JVRkZFUkxFTkdUSC4gIFRoZXkgYXJlIHVzZWQgdG8gY3JlYXRlIGEKICBtdWx0aXBhcnQgdGhhdCBhcHBlYXJzIGFzIGEgcmVndWxhciBmaWxlIHVwbG9hZCwgYnV0IHRoZSBkYXRhIGlzIHByb3ZpZGVkCiAgd2l0aCBhIHBvaW50ZXIgYW5kIGxlbmd0aC4KICAKLSBOaWNvIEJhZ2d1cyBtYWRlIHRoZSBWTVMgdmVyc2lvbiB1c2Ugc2lnc2V0am1wKCkgdG9vLgoKLSBK9nJuIEhhcnRyb3RoIGZpeGVkIHRoZSBtaW5ndzMyIGJ1aWxkIHVzaW5nIHRoZSBtbSBsaWIuCgotIEFwcGxpZWQgcGF0Y2hlcyBieSBLcmlzIEtlbm5hd2F5IHRoYXQgY29ycmVjdCBmb3JtYXQgc3RyaW5nIHByb2JsZW1zIGluCiAgbGliL2Z0cC5jIGFuZCBsaWIvbGRhcC5jLgoKVmVyc2lvbiA3LjkuOC1wcmUzCgpEYW5pZWwgKDExIEp1biAyMDAyKQotIEphbWVzIENvbmUgYnJvdWdodCB0aGUgaWRlYSBvZiB1c2luZyBzaWdzZXRqbXAoKSBpbiB0aGUgc2lnbmFsIGhhbmRsZXIgdG8KICBtYWtlIHRoZSB0aW1lLW91dCBvZiBuYW1lIGxvb2t1cHMgdG8gd29yaywgZXZlbiB3aGVuIHRoZSB1bmRlcmx5aW5nIG5hbWUKICByZXNvbHZlciBsaWJyYXJ5IHRyYXBzIEVJTlRSLiBUaGUgdXNlIG9mIHNpZ3NldGptcCgpIGFuZCBzaWdsb25nam1wKCkgZm9yCiAgdGhpcyBtYXkgYmUgYSBiaXQgZHJhc3RpYywgYW5kIGFsc28gbm90IGxpa2VseSB0byBleGlzdCBvbiBhbGwgcGxhdGZvcm1zLiAgSQogIGFkZGVkIGNhcmVmdWwgY2hlY2tpbmcgZm9yIHRoaXMgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGV2ZW4gY2hlY2tzIGZvciBpdAogIGJlaW5nIGEgbWFjcm8gKHdoaWNoIHNlZW1zIHRvIGJlIHRoZSBjYXNlIGluIGZvciBleGFtcGxlIExpbnV4KS4KCiAgc2lnc2V0am1wKCkgc2VlbXMgdG8gYmUgbWVudGlvbmVkIGluIHRoZSBTaW5nbGUgVW5peCBzcGVjaWZpY2F0aW9uLgoKLSBNaWtsb3MgTmVtZXRoIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGFsbG93cyBsaWJjdXJsIHRvIGdldCBidWlsdCB3aXRoIHNwZWNpZmljCiAgcHJvdG9jb2xzIGRpc2FibGVkLiBUaGlzIGlzIGRvbmUgYnkgcnVubmluZyAuL2NvbmZpZ3VyZQogIC0tZGlzYWJsZS1bcHJvdG9jb2xdLgoKLSBGVFAgcmFuZ2UgZG93bmxvYWRzIGNvdWxkIG1ha2UgQ1VSTEVfRlRQX1dSSVRFX0VSUk9SIGdldCByZXR1cm5lZC4gV2Ugbm93CiAgbWFrZSBwcmVjYXV0aW9ucyB0byBub3QgcmV0dXJuIHRoaXMgZm9yIHJhbmdlIGRvd25sb2Fkcy4KCiAgQWRkZWQgdGVzdCBjYXNlIDEzNSB0aGF0IG1ha2VzIGFuIGZ0cCByYW5nZSBkb3dubG9hZC4gSGFkIHRvIHR3ZWFrIHRoZQogIHJ1bnRlc3RzLnBsIHNjcmlwdCBhIGJpdCB0b28uCgotIEJ1ZyByZXBvcnQgIzU2NjgzNSBpZGVudGlmaWVkIGEgc3RybGVuKCkgb24gYSBOVUxMIHBvaW50ZXIuIEFkZGVkIGFkZGl0aW9uYWwKICBjaGVjayB0byBwcmV2ZW50IHRoaXMuCgpEYW5pZWwgKDEwIEp1biAyMDAyKQotIEZvdW5kIGFuZCBjb3JyZWN0ZWQgYSBjb25uZWN0IGZhaWx1cmUgcHJvYmxlbSB0aGF0IGRpZG4ndCBjcmVhdGUgYSBodW1hbgogIGVycm9yIHRleHQuCgotIEFkZGVkIGNvZGUgdG8gY29tcGlsZSB3aXRoIE9wZW5TU0wgMC45LjcuIEJhc2VkIG9uIHBhdGNoIGZyb20gSmFjb2IgTWV1c2VyCiAgYW5kIGNvbW1lbnRzIGZyb20gR/Z0eiBCYWJpbi1FYmVsbC4KCi0gR2F1dGFtIE1hbmkgZm91bmQgYSBzb2NrZXQgZGVzY3JpcHRvciBsZWFrIHRoYXQgaGFwcGVuZWQgd2hlbiBGVFAgdHJhbnNmZXJzCiAgZmFpbGVkIGFuZCB5b3UgcmVpbnZva2VkIGN1cmxfZWFzeV9wZXJmb3JtKCkuCgpEYW5pZWwgKDUgSnVuIDIwMDIpCi0gR3VzdGFmIEh1aSBjb3JyZWN0ZWQgY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKCkgc28gdGhhdCBpdCB3b24ndCBjcmFzaCBubwogIG1hdHRlciB3aGVuIHlvdSBkZWNpZGUgdG8gcmVtb3ZlIHRoZSBDVVJMIGhhbmRsZS4KCi0gSEFWRV9SQU5EX1NUQVRVUyB3YXMgYWRkZWQgdG8gbGliL2NvbmZpZy13aW4zMi5oIGJ5IEFuZHJlYXMgT2xzc29uLCBhcyBpdAogIG1ha2VzIHdpbmRvd3MgYnVpbGRzIHN0b3AgY29tcGxhaW5pbmcgYWJvdXQgIndlYWsgc2VlZGluZyIgd2hlbiBpdCBpbiBmYWN0CiAgaXNuJ3QuCgotIEFub3RoZXIgNjRiaXQgYXJjaGl0ZWN0dXJlIGNyYXNoIHRoYXQgd2FzIGludHJvZHVjZWQgaW4gNy45Ljcgd2FzIG5vdwogIHJlbW92ZWQsIGFzIGJ1ZyByZXBvcnQgIzU2NDU4NSBjbGFyaWZpZWQuIFRoaXMgaGFwcGVuZWQgZHVlIHRvIG91ciBhdHRlbXB0cwogIHRvIG9ubHkgYWxsb2NhdGUgb25seSBhcyBtdWNoIG1lbW9yeSBhcyBpcyBhY3R1YWxseSBuZWVkZWQgZm9yIG5hbWUKICByZXNvbHZpbmcgKHVzaW5nIHJlYWxsb2MpIHdoaWNoIGNhbGxlZCBmb3IgYSBmdW5jdGlvbiB0aGF0IGNvdWxkICdtb3ZlJyBhCiAgaG9zdGVudCBzdHJ1Y3QgaW4gbWVtb3J5LgoKVmVyc2lvbiA3LjkuOC1wcmUyCgpEYW5pZWwgKDMgSnVuIDIwMDIpCi0gVC4gQmhhcmF0aCBmaXhlZCB0aGUgQ1VSTElORk9fUkVESVJFQ1RfVElNRSB0byByZXR1cm4gYSBjb3JyZWN0IHRpbWUgYW5kCiAgbWFkZSB0aGUgQ1VSTElORk9fUkVRVUVTVF9TSVpFIHJldHVybiB0aGUgY29ycmVjdCB0b3RhbCByZXF1ZXN0IHNpemUuIEhlCiAgYWxzbyBtYWRlIHRoZSB3aW4zMiB0aW1lcnMgdXNlIGhpZ2hlciByZXNvbHV0aW9uIHRoYW4gYmVmb3JlLgoKRGFuaWVsICgyOSBNYXkgMjAwMikKLSBSZW5hdWQgQ2hhaWxsYXQgbWFkZSBtZSBhd2FyZSBvZiB0aGUgZmFjdCB0aGF0IGxpYmN1cmwgcmV0dXJuZWQgYW4gZXJyb3IgaWYKICB5b3UgdHJpZWQgdG8gZ2V0IGFuIGVtcHR5IEZUUCBmaWxlLiBUaGlzIHNlZW1lZCBsaWtlIGEgd3JvbmcgdGhpbmcgdG8gZG8sIHNvCiAgbm93IGl0IG5vIGxvbmdlciBkb2VzIHRoYXQhIEkganVzdCBob3BlIHRoYXQgbm8gb25lIGJ1aWx0IGFueXRoaW5nIGZhbmN5CiAgdXBvbiB0aGlzIHVuZXhwZWN0ZWQgYmVoYXZpb3IuLi4KCkRhbmllbCAoMjggTWF5IDIwMDIpCi0gQ3JpcyBCYWlsaWZmIGJyb3VnaHQgQ1VSTE9QVF9DQVBBVEggdGhhdCB3b3JrcyBsaWtlIENVUkxPUFRfQ0FJTkZPIGJ1dAogIHNwZWNpZmllcyBhIHBhdGggdG8gYSBkaXJlY3Rvcnkgd2l0aCBjZXJ0aWZpY2F0ZXMgcmF0aGVyIHRoYW4gYSBzaW5nbGUgZmlsZQogIHdpdGggdGhlbSBhbGwgY29uY2F0ZW5hdGVkLiAtLWNhcGF0aCB3YXMgYWRkZWQgdG8gdGhlIGNvbW1hbmQgbGluZSB0b29sCiAgZm9yIHRoZSBzYW1lIGZ1bmN0aW9uLgoKICBXaW5kb3dzIHVzZXJzIG5lZWQgdG8gcGF5IGF0dGVudGlvbiB0aGF0IHRoZSBkaXJlY3Rvcnkgc2hvdWxkIGJlIHNldHVwIHdpdGgKICB0aGUgY19yZWhhc2ggdG9vbCBvZiB0aGUgT3BlblNTTCBwYWNrYWdlLCBhbmQgdGhhdCBjcmVhdGVzIHN5bWxpbmtzIGJ5CiAgZGVmYXVsdCB0aGF0IG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBhY3R1YWwgY29waWVzIHRvIHdvcmsgb24gV2luZG93cy4KCi0gR3VzdGFmIEh1aSBwcm92aWRlZCBuZXcgY29kZSB0aGF0IGNoYW5nZXMgaG93IGN1cmxfbXVsdGlfaW5mb19yZWFkKCkKICBtZXNzYWdlcyBhcmUgc3RvcmVkLCBzbyB0aGF0IHRoZXkgZG9uJ3QgaGF2ZSB0byBiZSBrZXB0IGFyb3VuZCBmb3IgdGhlIG11bHRpCiAgaGFuZGxlJ3MgZW50aXJlIGxpZmUgdGltZS4gSGUgYWxzbyBtYWRlIGl0IHJldHVybiBmYWlsdXJlIGNvZGVzIHByb3Blcmx5CiAgd2hpY2ggaXQgZGlkbid0IGRvIGJlZm9yZS4KCkRhbmllbCAoMjcgTWF5IDIwMDIpCi0gR3VzdGFmIEh1aSBwb2ludGVkIG91dCB0aGF0IHJ1bm5pbmcgY3VybF9tdWx0aV9wZXJmb3JtKCkgd2l0aG91dCBkb2luZwogIGN1cmxfbXVsdGlfZmRzZXQoKSBmaXJzdCB3YXMgbm90IHJlYWxseSBhIHdvcmtpbmcgY29tYm8uIEkgYWRkZWQgYW4gaW50ZXJuYWwKICBjaGVjayBmb3IgdGhpcyBhbmQgaGF2ZSBzb21lIGV4dHJhIHNlbGVjdCgpIGNvZGUgd2l0aG91dCB0aW1lb3V0IHRvIG1ha2UgdGhlCiAgbGlicmFyeSBpbnRlcm5hbHMgd29yayBpZGVudGljYWxseSBuZXZlcnRoZWxlc3MuIFdlIG1pZ2h0IG5lZWQgdG8gc29tZWhvdwogIGVpdGhlciBkb2N1bWVudCB0aGF0IG9uY2UgeW91J3ZlIHVzZWQgdGhlICpfZmRzZXQoKSB5b3Ugc2hvdWxkIHJlbWFpbiB1c2luZwogIHRoZW0gaW4gc2VsZWN0KCkgb3IgeW91IHNob3VsZCBibGFuayB0aGVtIHNvbWVob3cgc28gdGhhdCBsaWJjdXJsIHdvbid0IGdvCiAgY3JhenkuCgpWZXJzaW9uIDcuOS44LXByZTEKCkRhbmllbCAoMjIgTWF5IDIwMDIpCi0gSmFtZXMgQ29uZSBicm91Z2h0IGFuIGV4Y2VsbGVudCBwYXRjaCwgaW5jbHVkaW5nIHNldmVyYWwgdGVzdHMgYW5kIGRvY3MhCiAgQ1VSTE9QVF9ORVRSQyBub3cgdGFrZXMgYW4gZW51bSBhcyBhcmd1bWVudCBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyBib29sZWFuLgogIC0tbmV0cmMtb3B0aW9uYWwgd2FzIGludHJvZHVjZWQgYXMgYW4gYWRkaXRpb24gdG8gLS1uZXRyYyB0byBhbGxvdyB0aGUKICBjb21tYW5kIGxpbmUgY2xpZW50IHRvIHRha2UgdXNlIG9mIGFsbCB0aGF0IG5ldyBuZXRyYyBzdHVmZi4KCi0gQnVnIHJlcG9ydCAjNTU4ODg4IHNob3dlZCBhIGNhc2Ugd2hlcmUgbGliY3VybCByZS11c2VkIHRoZSBwcmV2aW91cyBob3N0CiAgbmFtZSB3aGVuIGEgY29ubmVjdGlvbiBvdmVyIGEgcHJveHkgd2FzIHJlLXVzZWQgYnV0IHRvIGEgZGlmZmVyZW50IHRhcmdldAogIGhvc3QuCgpEYW5pZWwgKDIxIE1heSAyMDAyKQotIEVkaW4gS2FkcmliYXNpYyBoZWxwZWQgbWUgc29ydCBvdXQgYSBwcm9ibGVtIHRvIG1hZGUgbGliY3VybCBjcmFzaCB3aGVuCiAgdHJ5aW5nIHRvIEhUVFAgUE9TVCBhbiBlbXB0eSBzdHJpbmcuCgotIENsYXJpZmllZCB0aGF0IEp1ZXJnZW4gV2lsa2UgZG9uYXRlZCB0aGUgb3JpZ2luYWwgdGVzdHMvc2VydmVyL3N3cy5jIGNvZGUuCgotIEplYW4tUGhpbGlwcGUgQmFycmV0dGUtTGFQaWVycmUgbWFkZSBjdXJsX2Zvcm1hZGQoKSByZXR1cm4gYSB0eXBlZGVmIG5hbWVkCiAgQ1VSTEZPUk1jb2RlIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzICdpbnQnLCBhbmQgdGhlIHZhcmlvdXMgcmV0dXJuIGNvZGVzIGFyZQogIG5vdyBnbG9iYWxseSBleHBvcnRlZC4gSXQgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBiZXR0ZXIgZmlndXJlIG91dCB3aGF0IGdvZXMKICB3cm9uZyB3aGVuIGN1cmxfZm9ybWFkZCgpIHJldHVybnMgZXJyb3JzLgoKRGFuaWVsICgyMCBNYXkgMjAwMikKLSBSb2xhbmQgWmltbWVybWFubiBwb2ludGVkIG91dCB0aGF0IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoKQogIGlzIHByZWZlcmVkIHRvIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2ZpbGUoKS4KCkRhbmllbCAoMTcgTWF5IDIwMDIpCi0gQnVnIHJlcG9ydCAjNTU2ODY5IHBvaW50ZWQgb3V0IHRoYXQgc3JjL3dyaXRlb3V0LmMgZGlkbid0IGNvbXBpbGUgb24gZnJlZWJzZAogIGFmdGVyIG15IEFJWCBmaXhlcyB0aGUgb3RoZXIgd2Vlay4KCi0gQnVnIHJlcG9ydCAjNTU2OTMwIHBvaW50ZWQgb3V0IGEgRnJlZUJTRCBjb3JlIGR1bXAgaW50cm9kdWNlZCBpbiA3LjkuNyBpbgogIHRoZSBETlMgc3RydWN0IHJlYWxsb2Mgc3R1ZmYuIEFjdHVhbGx5LCB0aGlzIGNyYXNoIGNvdWxkIGhhcHBlbiBvbiBhbGwKICBzeXN0ZW1zIHRoYXQgbWFkZSB0aGUgcGFja19ob3N0ZW50KCkgZnVuY3Rpb24gZ2V0IGludm9rZWQuCgotIEkgcmVtb3ZlZCBzZXZlcmFsIGNvbXBpbGVyIHdhcm5pbmdzIGluIHRoZSB0ZXN0IHN1aXRlJ3MgSFRUUCBzZXJ2ZXIuCgpWZXJzaW9uIDcuOS43CgpEYW5pZWwgKDEwIE1heSAyMDAyKQotIEtldmluIFJvdGggYWRqdXN0ZWQgdGhlIC0tdHJhY2UtYXNjaWkgb3V0cHV0IHNsaWdodGx5LgoKLSBQYXVsIEhhcnJpbmd0b24gZm91bmQgb3V0IHRoYXQgc3JjL3dyaXRlb3V0LmMgbmVlZGVkIGFuIGFkZGl0aW9uYWwgaGVhZGVyCiAgZmlsZSBpbmNsdWRlZCBmb3IgQUlYIGJ1aWxkcwoKVmVyc2lvbiA3LjkuNy1wcmUyCgpEYW5pZWwgKDcgTWF5IDIwMDIpCi0gVXBkYXRlZCB0aGUgbWFuIHBhZ2Ugd2l0aCAtLXRyYWNlLWFzY2lpIGFuZCAtai8tLWp1bmstc2Vzc2lvbi1jb29raWVzLgoKLSBNYWRlIC0tdHJhY2UtYXNjaWkgZG8gcHJldHR5IG11Y2ggdGhlIHNhbWUgYXMgLS10cmFjZSBidXQgd2l0aG91dCB0aGUgaGV4CiAgcGFydCBpbiB0aGUgb3V0cHV0LgoKLSBBZGRlZCBDVVJMT1BUX0NPT0tJRVNFU1NJT04gdGhhdCB3aGVuIGVuYWJsZWQgbWFrZXMgbGliY3VybCBpZ25vcmUgc2Vzc2lvbgogIGNvb2tpZXMgcmVhZCBmcm9tIGEgZmlsZS4gVGhpcyBvcHRpb24gaXMgZW5mb3JjZWQgYnkgdGhlIGN1cmwgY29tbWFuZCBsaW5lCiAgdG9vbCB1c2luZyB0aGUgbmV3IC1qLy0tanVuay1zZXNzaW9uLWNvb2tpZXMgb3B0aW9uLiBBZnRlciBkaXNjdXNzaW9ucyB3aXRoCiAgS2V2aW4gUm90aC4gVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8gdXNlIGN1cmwgdG8gZnVsbHkgZW11bGF0ZSBhIGJyb3dzZXIncwogIGJlaGF2aW9yLCBldmVuIHdoZW4gaXQgY29tZXMgdG8gInNlc3Npb24gY29va2llcyIuIFNlc3Npb24gY29va2llcyBhcmUKICBjb29raWVzIHRoYXQgYSBub3JtYWwgYnJvd3NlciBkaXNjYXJkcyB3aGVuIHRoZSBicm93c2VyIGlzIHNodXQKICBkb3duLiBUaGV5J3JlIGlkZW50aWZpZWQgYnkgbm90IGhhdmluZyBhbnkgZXhwaXJlIGRhdGUvdGltZS4KCi0gV2hlbiBDVVJMT1BUX0RFQlVHREFUQSB3YXMgc2V0LCBpdCBydWluZWQgdGhlIENVUkxPUFRfU1RERVJSIHNldHRpbmcgYW5kCiAgdGhpcyB3YXMgZGlzY292ZXJlZCB3aGVuIC0tdHJhY2Ugd2FzIG1hZGUgdG8gY3Jhc2guCgotIFVzaW5nIC12IGFuZCAtLXRyYWNlIGF0IHRoZSBzYW1lIHRpbWUgY29uZnVzZWQgbWF0dGVycy4gLXYgaXMgbm93IHByZXR0eQogIG11Y2ggaWdub3JlZCB3aGVuIC0tdHJhY2Ugb3IgLS10cmFjZS1hc2NpaSBpcyB1c2VkLgoKLSBNYWRlIC0tdHJhY2UgKGFuZCAtLXRyYWNlLWFzY2lpKSBzdXBwb3J0IC0gYXMgZmlsZSBuYW1lIHRvIHBhc3Mgb3V0cHV0IHRvCiAgc3Rkb3V0IGluc3RlYWQuIEl0IG1ha2VzIGl0IGNvbnNpc3RlbnQgd2l0aCBob3cgb3RoZXIgb3B0aW9ucyB3b3JrLgoKVmVyc2lvbiA3LjkuNy1wcmUxCgpEYW5pZWwgKDYgTWF5IDIwMDIpCi0gQWRkZWQgbXVsdGktcG9zdC5jIHRvIHRoZSBleGFtcGxlcyBkaXJlY3RvcnkuIEkgZ290IHRoZSBiYXNpYyBzb3VyY2UgZm9yCiAgdGhpcyBmcm9tIEd1c3RhZiBIdWkuCgpEYW5pZWwgKDMgTWF5IDIwMDIpCi0gQ1VSTF9NQVhfV1JJVEVfU0laRSBpcyBub3cgYW4gZXhwb3J0ZWQgI2RlZmluZSBpbiB0aGUgY3VybC9jdXJsLmggaGVhZGVyIGFuZAogIGNhbiBiZSB1c2VkIHRvIGZpZ3VyZSBvdXQgdGhlIG1heGltdW0gYnVmZmVyIHNpemUgeW91ciB3cml0ZSBjYWxsYmFjayBjYW4KICBnZXQuCgotIENVUkxPUFRfUkVBRERBVEEgaXMgbm93IGFuIGFsaWFzIGZvciBDVVJMT1BUX0lORklMRSBhbmQgQ1VSTE9QVF9XUklURURBVEUgaXMKICBhbiBhbGlhcyBmb3IgQ1VSTE9QVF9GSUxFLiBUaGVzZSB0d28gd2VyZSBhZGRlZCBmb3IgY29uZm9ybWl0eS4gTW9zdCBvdGhlcgogIGNhbGxiYWNrIGZ1bmN0aW9uJ3MgdXNlcmRhdGEgYXJlIHByb3ZpZGVkIHdpdGggb3B0aW9ucyB1c2luZyBhIHNpbWlsYXIgbmFtZS0KICBzY2hlbWUuCgotIEFkZGVkICItLXRyYWNlIFtmaWxlXSIgdG8gdGhlIGNvbW1hbmQgbGluZSB0b29sLiBJdCBtYWtlcyBhIHZlcnkgZGV0YWlsZWQKICB0cmFjZSBkdW1wIGdldCBzdG9yZWQsIHdpdGggYSBmdWxsIHByb3RvY29sIGR1bXAgdGhhdCBpbmNsdWRlcyBhbGwgcmVjZWl2ZWQKICBhbmQgdHJhbnNtaXR0ZWQgZGF0YS4gVGhpcyBjb3VsZCBiZSBhIHZlcnkgZWZmZWN0aXZlIHRvb2wgZm9yIGRlYnVnZ2luZyB3aGF0CiAgZ29lcyB3cm9uZy4gVGhpcyBkdW1wIGluY2x1ZGVzIGV2ZXJ5IGJ5dGUgdGhlIHdheSBpdCBpcyBzZW50IHRvL3JlY2VpdmVkCiAgZnJvbSB0aGUgc2VydmVyLiBUaGUgZHVtcCBpcyB0aGUgcGxhaW4tdGV4dCB2ZXJzaW9uLCBzbyBTU0wgdHJhbnNmZXJzIHdpbGwKICBzdGlsbCBiZSByZWFkYWJsZS4KCi0gSSBmb3VuZCBvdXQgdGhhdCB0aGUgREVCVUdGVU5DVElPTiB3YXMgbm90IGNhbGxlZCBwcm9wZXJseSBldmVyeXdoZXJlIGFzIHdlCiAgd2FudGVkIGl0IHRvLiBJIGZpeGVkIGl0LgoKLSAtRCBub3cgc3RvcmVzIGFsbCBoZWFkZXJzIHRvIHRoZSBzYW1lIGZpbGUgaWYgbXVsdGlwbGUgVVJMcyBhcmUgZ2l2ZW4gb24gdGhlCiAgY29tbWFuZCBsaW5lISBLZXZpbiBSb3RoIG1hZGUgbWUgYXdhcmUgb2YgdGhhdCBpdCBkaWRuJ3QgYWxyZWFkeSBkbyB0aGlzIQoKLSBHdXN0YWYgSHVpIHdyb3RlIGFuIGV4Y2VsbGVudCBmb3JtcG9zdCBleGFtcGxlIHRoYXQgdXNlZCB0aGUgbXVsdGkKICBpbnRlcmZhY2UuICBVbmZvcnR1bmF0ZWx5LCBpdCBkaWRuJ3Qgd29yayBkdWUgdG8gc2V2ZXJhbCBidWdzIGluIGhvdwogIHRyYW5zZmVycyB3ZXJlIG1hZGUgd2hlbiB0aGUgbXVsdGkgaW50ZXJmYWNlIHdhcyB1c2VkLgoKRGFuaWVsICgyIE1heSAyMDAyKQotIEhhbm5vIEtyYW56aG9mZiBmb3VuZCBvdXQgdGhhdCB3aGVuIGRvaW5nIG11bHRpcGxlIHRyYW5zZmVycyBvbiB0aGUgc2FtZQogIGVhc3kgaGFuZGxlLCB0aGUgcHJvZ3Jlc3MgbWV0ZXIgd291bGQgc2hvdyBhIGJhZCAiY3VycmVudGx5IGRvd25sb2FkZWQKICB2YWx1ZSIgd2hlbiB0aGUgdHJhbnNmZXIgc3RhcnRzLgoKRGFuaWVsICgxIE1heSAyMDAyKQotIEFwcGxpZWQgYW5vdGhlciBwYXRjaCBieSBKYWNreSBMYW0gdG8gbWFrZSB0aGUgbmFtZSByZXNvbHZlIGluZm8gcmVhbGxvYygpCiAgc3R1ZmYgd29yayBwcm9wZXJseS4KCkRhbmllbCAoMjggQXByaWwgMjAwMikKLSBjdXJsX211bHRpX2luZm9fcmVhZCgpIGlzIG5vdyBpbXBsZW1lbnRlZCEKCkRhbmllbCAoMjcgQXByaWwgMjAwMikKLSBVcGRhdGVkIEJVR1MsIFRPRE8sIEZBUSwgSU5TVEFMTCBhbmQgYWRkZWQgQklORElOR1MuCgotIEkgdGhpbmsgSSBmaXhlZCB0aGUgRE5TIGNhY2hlIHBydW5lIGNyYWNoIEphY2t5IExhbSBmb3VuZCBhbmQgcmVwb3J0ZWQuCgotIEkgY2xlYW5lZCB1cCB0aGUgbmFtZSBwcmVmaXggc3R1ZmYgaW4gdGhlIGhhc2ggYW5kIGxsaXN0IG1vZHVsZXMuCgotIEZUUCByZXNwb25zZXMgc2hvdWxkIG5vdyBiZSBiZXR0ZXIgb24gdGltaW5nIG91dCBwcm9wZXJseS4gVGhlIHRpbWVvdXQgdmFsdWUKICBpcyBtYXhpbXVtIHRpbWVvdXQgZm9yIHRoZSBlbnRpcmUgcmVxdWVzdCBvcGVyYXRpb24sIGJ1dCBiZWZvcmUgdGhpcywgdGhlCiAgdGltZW91dCB3YXMgdXNlZCBhcyBhIG1heGltdW0gYWxsb3dlZCB0aW1lIGJldHdlZW4gdHdvIHJlYWRzLi4uCgpEYW5pZWwgKDI2IEFwcmlsIDIwMDIpCi0gRml4ZWQgdGhlIHRlc3Qgc3VpdGUgaHR0cCBzZXJ2ZXIgdG8gbm90IHVzZSBzbnByaW50ZigpIGFueW1vcmUgZHVlIHRvIGJldHRlcgogIHBvcnRhYmlsaXR5LgoKRGFuaWVsICgyNSBBcHJpbCAyMDAyKQotIFdpdGggU3RlcmxpbmcgSHVnaGVzJyBuZXcgRE5TIHBydW5pbmcsIEphY2t5IExhbSBhc2tlZCBpZiB0aGlzIHdvdWxkbid0CiAgY2F1c2UgcHJvYmxlbXMgc2luY2UgdGhlIHBydW5pbmcgaXMgb25seSBjaGVja2luZyB0aGUgZW50cnkgdGltZSwgYW5kIGl0CiAgc3VyZSBjb3VsZCBjYXVzZSBwcm9ibGVtcy4gVGhlcmVmb3IsIEkndmUgbm93IGFkZGVkIGFuZCBjaGFuZ2VkIGNvZGUgc28gdGhhdAogIHRoaXMgc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0uIE5vd2hlcmUgaW4gdGhlIGNvZGUgd2lsbCBiZSBzdG9yZSBuYW1lCiAgcmVzb2x2ZWQgaW5mb3JtYXRpb24gYXJvdW5kIHNvIHRoYXQgYSBzdW5zZXF1ZW50IEROUyBjYWNoZSBwcnVuZSBzaG91bGQKICBjYXVzZSBhIHByb2JsZW0uIFRoaXMgb2YgY291cnNlIGNhbGxlZCBmb3Igc29tZSBtaWxkIGludGVybmFsIGNoYW5nZXMuCgpEYW5pZWwgKDIzIEFwcmlsIDIwMDIpCi0gSW1wcm92ZWQgdGhlICdub19wcm94eScgY2hlY2ssIGFzIHVzaW5nIHBvcnQgbnVtYmVycyBpbiB0aGUgVVJMIGNvbmZ1c2VkIGl0CiAgcHJldmlvdXNseS4gUmVwb3J0ZWQgYnkgRXJ3YW4gTGVncmFuZCBpbiBidWcgcmVwb3J0ICM1NDc0ODQuCgotIFRoZSAtLWludGVyZmFjZSBvcHRpb24gbm93IHdvcmtzIGV2ZW4gb24gSVB2NiBlbmFibGVkIGJ1aWxkcy4gUmVwb3J0ZWQgYnkKICAndGhvcicuCgpEYW5pZWwgKDIyIEFwcmlsIDIwMDIpCi0gVGhlICNkZWZpbmVzIG5hbWVzIHN0YXJ0aW5nIHdpdGggVElNRUNPTkQgbm93IGhhcyBDVVJMXyBwcmVmaXhlcy4gKFRoZSBvbGQKICBuYW1lcyBhcmUgc3RpbGwgI2RlZmluZWQgdG9vLikgUG9pbnRlZCBvdXQgYnkgUm9iZXJ0IE9sc29uLgoKLSBKYWNreSBMYW0gYnJvdWdodCBjb2RlIHRoYXQgbGV0cyB0aGUgbmFtZSByZXNvbHZlIGZ1bmN0aW9uIG9ubHkgdXNlIGFzIG11Y2gKICBtZW1vcnkgYXMgaXQgYWN0dWFsbHkgbmVlZHMuIFRoaXMgb25seSB3b3JrcyBvbiBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLAogIGJ1dCBpcyB0b3RhbGx5IHRyYW5zcGFyYW50IHRvIGFsbCB1c2Vycy4KCkRhbmllbCAoMTkgQXByaWwgMjAwMikKLSBCam9ybiBSZWVzZSBmaXhlZCBwYWNrX2hvc3RlbnQgdG8gd29yayBwcm9wZXJseSB3aXRoIDY0IGJpdCBwb2ludGVycy4KCkRhbmllbCAoMTggQXByaWwgMjAwMikKLSBTdGVybGluZyBIdWdoZXMgYWRkZWQgY29kZSB0byBwcnVuZSBvbGQgRE5TIGNhY2hlIGVudHJpZXMsIHNpbmNlIEphY2t5IExhbQogIGV4cGVyaWVuY2VkIHZlcnkgYmlnIGNhY2hlcy4KCkRhbmllbCAoMTcgQXByaWwgMjAwMikKLSBEaXJrIE1hbnNrZSBwYXRjaGVkIHRoZSAzMDEgcmVzcG9uc2UgdG8gd29yayBhZ2FpbnN0IHRoZSBSRkMgYnV0IG1vcmUgbGlrZQogIGNvbW1vbiBicm93c2VycyBkby4gSWYgYSBQT1NUIGdldCBhIDMwMSBiYWNrLCBpdCdsbCBzd2l0Y2ggdG8gR0VUIGluIHRoZQogIG5leHQgcmVxdWVzdCAoaWYgbG9jYXRpb24tZm9sbG93aW5nIGlzIGVuYWJsZWQpLgoKRGFuaWVsICgxNiBBcHJpbCAyMDAyKQotIERpcmsgTWFuc2tlIHBvc3RlZCBhIHBhdGNoIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBJbmdvIFdpbGtlbiB0aGF0IGludHJvZHVjZWQKICB0d28gbmV3IENVUkxJTkZPXyogdmFsdWVzOiBDVVJMSU5GT19SRURJUkVDVF9USU1FIGFuZAogIENVUkxJTkZPX1JFRElSRUNUX0NPVU5ULgoKRGFuaWVsICgxNSBBcHJpbCAyMDAyKQotIEpvbmF0YW4gTGFuZGVyIHBhdGNoZWQgdGhlIHZlcmJvc2UgdGV4dCAnRGlzYWJsZXMgUE9TVCwgZ29lcyB3aXRoIEdFVCcgdG8KICByZWZsZWN0IHJlYWxpdHkgYmV0dGVyLCBsaWtlIHdoZW4gdGhlIGZpcnN0IHJlcXVlc3QgaXNuJ3QgUE9TVCBhbmQgd2hlbgogIHRoZSBzZWNvbmQgaXNuJ3QgR0VULi4uIDotKQoKLSBDcmFpZyBEYXZpc29uIHBvaW50ZWQgb3V0IHRoYXQgd2hlbiBjdXJsX2Zvcm1hZGQoKWluZyBhIGZpbGUgdGhhdCBkb2Vzbid0CiAgZXhpc3QsIGxpYmN1cmwgZG9lc24ndCByZXR1cm4gZXJyb3IuIE5vdywgY3VybF9lYXN5X3BlcmZvcm0oKSB3aWxsIHJldHVybgogIENVUkxFX1JFQURfRVJST1IgaWYgdGhhdCBpcyB0aGUgY2FzZS4gVGVzdCA0MSB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoaXMuCgpWZXJzaW9uIDcuOS42CgpEYW5pZWwgKDE0IEFwcmlsIDIwMDIpCi0gRGlyayBNYW5za2UgYnJvdWdodCBhIGZpeCB0aGF0IG1ha2VzIGxpYmN1cmwgc3RyaXAgb2ZmIHdoaXRlIHNwYWNlcyBmcm9tIHRoZQogIGJlZ2lubmluZyBvZiBjb29raWUgY29udGVudHMuCgotIEhhZCB0byBwYXRjaCBpbmNsdWRlL2N1cmwvY3VybC5oIHNpbmNlIE1TVkMgZG9lc24ndCBzZXQgdGhlIF9fU1REQ19fIGRlZmluZS4KICBNb29uZXNhbXkgcG9pbnRlZCBvdXQgdGhlIHByb2JsZW0sIEJqb3JuIFJlZXNlIHRoZSBzb2x1dGlvbi4KClZlcnNpb24gNy45LjYtcHJlNQoKRGFuaWVsICgxMiBBcHJpbCAyMDAyKQotIEZpeGVkIHRoZSBUSU1FUl9DT05ORUNUIHRvIGJlIG1vcmUgYWNjdXJhdGUgZm9yIEZUUCB0cmFuc2ZlcnMuIFByZXZpb3VzbHkKICBGVFAgdHJhbnNmZXJzIGdvdCB0aGUgImNvbm5lY3QgZG9uZSIgdGltZSBzZXQgYWZ0ZXIgdGhlIGluaXRpYWwgRlRQIGNvbW1hbmRzCiAgYW5kIG5vdCBkaXJlY3RseSBhZnRlciB0aGUgVENQL0lQIGNvbm5lY3QgYXMgaXQgc2hvdWxkLgoKICBJIGFsc28gbWFkZSB0aGUgdGltZSBzdGFtcCBnZXQgc2V0IGV2ZW4gaWYgdGhlIGNvbm5lY3QgaXRzZWxmIGZhaWxzLCB3aGljaAogIGl0IGRpZG4ndCBkbyBwcmV2aW91c2x5LgoKLSBKZWFuLVBoaWxpcHBlIEJhcnJldHRlLUxhUGllcnJlIHByb3ZpZGVkIGhpcyBwYXRjaCB0aGF0IGludHJvZHVjZXMKICBDVVJMT1BUX0RFQlVHRlVOQ1RJT04gYW5kIENVUkxPUFRfREVCVUdEQVRBLiBUaGV5IGFsbG93IGEgcHJvZ3JhbSB0byBhIHNldCBhCiAgY2FsbGJhY2sgdG8gcmVjZWl2ZSBkZWJ1Zy9pbmZvcm1hdGlvbiBkYXRhLiBUaGF0IGluY2x1ZGVzIGhlYWRlcnMgYW5kIGRhdGEKICB0aGF0IGlzIHJlY2VpdmVkIGFuZCBzZW50LiBDVVJMT1BUX1ZFUkJPU0Ugc3RpbGwgY29udHJvbHMgaXQuCgogIEJ5IGRlZmF1bHQsIHRoZXJlIGlzIGFuIGludGVybmFsIGRlYnVnZnVuY3Rpb24gdGhhdCB3aWxsIG1ha2UgdGhpbmdzIGxvb2sKICBhbmQgd29yayBhcyBiZWZvcmUgaWYgbm90IGNoYW5nZWQuCgpEYW5pZWwgKDEwIEFwcmlsIDIwMDIpCi0gU2ViYXN0aWVuIFdpbGxlbWlqbnMgZm91bmQgb3V0IHRoYXQgLXggZGlkbid0IHVzZSB0aGUgZGVmYXVsdCBwb3J0IG51bWJlciBhcwogIGlzIGRvY3VtZW50ZWQuIEl0IGRvZXMgbm93LgoKLSBsaWJjdXJsLWVycm9ycy4zIGlzIGEgbmV3IG1hbiBwYWdlIGF0dGVtcHRpbmcgdG8gZG9jdW1lbnQgYWxsIGxpYmN1cmwgZXJyb3IKICBjb2RlcwoKLSBBZGRlZCB0d28gbmV3IGVycm9yIGNvZGVzIGFuZCBjaGFuZ2VkIHRoZSBiZWhhdmlvdXIgb2YgdHdvIG9sZCBvbmVzCiAgc2xpZ2h0bHk6CgogIENVUkxFX1dSSVRFX0VSUk9SCiAgIFRoaXMgZXJyb3Igd2FzIHJldHVybmVkICpib3RoKiBmb3IgZXJyb3JzIHRoYXQgb2NjdXJlZCB3aGVuIHdyaXRpbmcKICAgcmVjZWl2ZWQgZGF0YSB0byBhIGxvY2FsIGZpbGUsIGFzIHdlbGwgYXMgd2hlbiB3ZSBnZXQgcHJvYmxlbXMgd3JpdGluZyBkYXRhCiAgIHRvIGEgcmVtb3RlIHNlcnZlci4gQ1VSTEVfU0VORF9FUlJPUiBoYXMgbm93IGJlZW4gYWRkZWQgZm9yIHRoZSBsYXR0ZXIKICAgZXJyb3IuCgogIENVUkxFX1JFQURfRVJST1IKICAgVGhpcyBlcnJvciB3YXMgc2ltaWxhcmx5IHJldHVybmVkICpib3RoKiBmb3IgZXJyb3JzIHdoZW4gcmVhZGluZyBhIGxvY2FsCiAgIGZpbGUsIGFzIHdlbGwgYXMgd2hlbiBnZXR0aW5nIHByb2JsZW1zIHdoZW4gcmVhZGluZyBuZXR3b3JrIGRhdGEuCiAgIENVUkxFX1JFQ1ZfRVJST1IgaGFzIG5vdyBiZWVuIGFkZGVkIGZvciB0aGUgbGF0dGVyIGVycm9yLgoKIChUd28gdGVzdCBjYXNlcyB3ZXJlIGFkanVzdGVkIGFjY29yZGluZ2x5LikKCkRhbmllbCAoOSBBcHJpbCAyMDAyKQotIHJ1bnRlc3RzLnBsIG5vdyBzZXRzIHRoZSBIT01FIHZhcmlhYmxlIGJlZm9yZSBydW5uaW5nIGN1cmwsIHRvIHByZXZlbnQgYW55CiAgYWN0dWFsIH4vLmN1cmxyYyBmaWxlIHRvIGZvb2wgdGhlIHRlc3RzIQoKVmVyc2lvbiA3LjkuNi1wcmU0CgpEYW5pZWwgKDggQXByaWwgMjAwMikKLSBNaWNoYWVsIEN1cnRpcyBwcm92aWRlZCBuZXcgZnVuY3Rpb25hbGl0eSBmb3IgY3VybCBvbiBzb21lIHBsYXRmb3Jtcy4gVXNpbmcKICB0aGUgLS1lbnZpcm9ubWVudCBvcHRpb24sIGN1cmwgd2lsbCAqc2V0KiBhIGJ1bmNoIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcwogIHRvIHZhbHVlcy4gVGhlIG5hbWVzIGFyZSB0aGUgc2FtZSBvbmVzIGFzIGZvciB0aGUgLXcvLS13cml0ZW91dCBvcHRpb24uCgogIEZvciBub3csIHRoaXMgb25seSB3b3JrcyBvbiB0aGUgUklTQyBPUyB2ZXJzaW9uLCBhcyB0aGlzIGZlYXR1cmUgcmVsaWVzIG9uCiAgYm90aCBPUyBzdXBwb3J0IGFuZCB0aGF0IGl0IG1hdGNoZXMgT1MgcGFyYWRpZ21zLgoKLSBKYWNreSBMYW0gcHJvdmlkZWQgYSBmaXggZm9yIGdldHRpbmcgaGVhZGVycy1vbmx5IHdoZW4gdGhlIHJlcGx5IGlzIEhUVFAvMS4wCiAgYW5kIDMwNCwgSSBlZGl0ZWQgaXQgc2xpZ2h0bHkuCgpEYW5pZWwgKDUgQXByaWwgMjAwMikKLSBBcyByZXF1ZXN0ZWQgYnkgSmF5IEdyYXZlcywgdGhlICcuY3VybHJjJyBmaWxlIChvciBfY3VybHJjIGFzIGl0IGlzIGNhbGxlZAogIHdoZW4gdXNlZCBpbiB3aW5kb3dzKSwgaXMgbm93IGxvYWRlZCBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpZiB0aGUgSE9NRQogIGVudmlyb25tZW50IHZhcmlhYmxlIGlzbid0IHNldCAob3IgaWYgaXQgaXMgdG9vIGxvbmcpLiBJIGFsc28gZW5sYXJnZWQgdGhlCiAgYXJyYXkgdXNlZCB0byBzdG9yZSB0aGUgZnVsbCBmaWxlIHBhdGggaW4sIHRvIDUxMiBieXRlcy4KCi0gS2V2aW4gUm90aCBwb2ludGVkIG91dCB0byBtZSB3aHkgdGhlICIxOSBNYXJjaCIgY2hhbmdlIHJlZ2FyZGluZyAtRyBhbmQgLUkKICB3YXMgc3R1cGlkIGFuZCB0aGUgY2hhbmdlIHdhcyByZXZlcnRlZC4gQWRkZWQgdGVzdCBjYXNlIDQ4IHRvIHZlcmlmeSB0aGUKICBmdW5jdGlvbmFsaXR5LgoKVmVyc2lvbiA3LjkuNi1wcmUzCgpEYW5pZWwgKDQgQXByaWwgMjAwMikKLSBKb25hdGFuIExhbmRlciBicm91Z2h0IGEgcGF0Y2ggdGhhdCBtYWtlcyBjdXJsL2N1cmwuaCBjb21waWxlIG5pY2VseSBvbgogIHByZS1JU08gY29tcGlsZXJzLCBsaWtlIHdoZW4gdXNpbmcgZ2NjIC10cmFkaXRpb25hbC4KCkRhbmllbCAoMyBBcHJpbCAyMDAyKQotIEphY2t5IExhbSBpZGVudGlmaWVkIGEgZ2xpdGNoIHdoZW4gZ2V0dGluZyBoZWFkZXJzLW9ubHksIHdoZXJlIGxpYmN1cmwgd291bGQKICAiaGFuZyIgMSBzZWNvbmQgaW4gdmFpbiBpbiB0aGUgc2VsZWN0KCkgbG9vcCBiZWZvcmUgcmV0dXJuaW5nIGJhY2suCgotIFRvciBBcm50c2VuIGJyb3VnaHQgYSBwYXRjaCBmb3IgbXVsdGlwYXJ0IGZvcm1wb3N0cy4gSXQgdHVybmVkIG91dCB0aGF0IHRoZQogICJDR0lfTGl0ZSBQZXJsIHBhY2thZ2UiIG1ha2VzIHNvbWUgYmFkIGFzc3VtcHRpb25zIG9uIHdoYXQgbGV0dGVycyB0aGF0IG1heQogIGJlIHVzZWQgaW4gYm91bmRhcnkgc3RyaW5ncyBhbmQgdGh1cyBjdXJsIGNvdWxkIGNvbmZ1c2UgaXQgYnkgaW5jbHVkaW5nICcrJwogIGFuZCAnLycuIFdoaWxlIHRoaXMgaXMgc3RhbmRhcmRzLWNvbXBsaWFudCwgd2UgY2hhbmdlIHRoZSBiZWhhdmlvciB0byB3b3JrCiAgc21vb3RobHkgd2l0aCBleGlzdGluZyBzb2Z0d2FyZSBiYXNlZCBvbiB0aGF0IHBhY2thZ2UuCgpEYW5pZWwgKDIgQXByaWwgMjAwMikKLSBHZXJoYXJkIEhlcnJlIGZpbGVkIGJ1ZyByZXBvcnQgIzUzNjIzOCB3aGVyZSBoZSBwb2ludGVkIG91dCBhIGNyYXNoIGluCiAgdmVyYm9zZSBGVFAgcGFzc2l2ZSB0cmFuc2ZlcnMgZm9yIEFJWC4KCi0gQ2xhcmVuY2UgR2FyZG5lciBwb2ludGVkIG91dCBhIG1pbm9yIGZsYXcgaW4gaG93IGxpYmN1cmwgZGlkbid0IHByb3Blcmx5CiAgdGFrZSBjYXJlIG9mIGFsbCBlcnJvcnMgdGhhdCBTU0xfcmVhZCgpIGNvdWxkIHJldHVybi4KCi0gSmFja3kgTGFtIGZpeGVkIGEgTUFMTE9DREVCVUcgcHJvYmxlbSBpbiBsaWIvZ2V0aW5mby5jCgpEYW5pZWwgKDI3IE1hcmNoIDIwMDIpCi0gVC4gQmhhcmF0aCBwb2ludGVkIG91dCBhIGZsYXcgaW4gdGhlIGNvbm5lY3Rpb24gcmUtdXNlIGZ1bmN0aW9uIHRoYXQgZGlkbid0CiAgY2hlY2sgcHJveHkgY29ubmVjdGlvbnMgcHJvcGVybHkgZm9yICJkZWFkbmVzcyIgYmVmb3JlIHRoZXkgd2VyZSByZS11c2VkLgoKLSBQZWRybyBOZXZlcyBmb3VuZCBvdXQgdGhhdCBIVFRQIFBPU1Rpbmcgd2l0aCAtLWRhdGEtYmluYXJ5IGRpZCBub3QgcHJvcGVybHkKICB3b3JrIHVuZGVyIFdpbmRvd3MgYXMgdGhlIGZpbGUgc3BlY2lmaWVkIHdhc24ndCByZWFkIGZ1bGx5IGJpbmFyeSEKCkRhbmllbCAoMjUgTWFyY2ggMjAwMikKLSBKYWNreSBMYW0gYnJvdWdodCBhIGZpeCB0aGF0IGltcHJvdmVzIHRyZWF0bWVudCBvZiBjb29raWVzIHVzaW5nIGlkZW50aWNhbAogIGRvbWFpbnMgYnV0IHdpdGggbGVhZGluZyBkb3RzIHByb3Blcmx5LgoKRGFuaWVsICgyMiBNYXJjaCAyMDAyKQotIE1pa2xvcyBOZW1ldGggdXBkYXRlZCB0aGUgd2luZG93cyBzZWN0aW9uIG9mIHRoZSBkb2NzL0lOU1RBTEwgZmlsZSBhbmQgdGhlCiAgd2luZG93cyBtYWtlZmlsZXMuCgotIEpvbiBEaWxsb24gcHJvdmlkZWQgdXMgd2l0aCBzZXZlcmFsIGdvb2QtbG9va2luZyBjdXJsIGltYWdlcyBmb3IKICBwcm9tb3Rpb24uIFZpZXcgdGhlbSBoZXJlIGh0dHA6Ly9jdXJsLmhheHguc2UvaWNvbnMuaHRtbAoKRGFuaWVsICgyMCBNYXJjaCAyMDAyKQotIFBldGVyIFZlcmhhcyBmb3VuZCBvdXQgdGhhdCBDUkxGIHJlcGxhY2VtZW50IGluIHVwbG9hZHMgd2FzIG5vdCB3b3JraW5nLiBJCiAgZml4ZWQgaXQsIGFuZCBhZGRlZCB0ZXN0IGNhc2UgMTI4IHRoYXQgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkuCgotIFRoZSBsaXN0IGZvcm1lcmx5IGtub3duIGFzIGN1cmwtbWFpbiBpcyBub3cgbmFtZWQgY3VybC11c2VycyBhbmQgaXMgaG9zdGVkCiAgYnkgc291cmNlZm9yZ2UuIFN1c2JjcmliZSB0byB0aGUgbmV3IGxpc3QsIGdldCBvZmYgdGhlIG9sZCBvbmUuCgpWZXJzaW9uIDcuOS42LXByZTIKCkRhbmllbCAoMTkgTWFyY2ggMjAwMikKLSBNYWRlIC1HIGFuZCAtSSBvbiB0aGUgc2FtZSBjb21tYW5kIGxpbmUgY2F1c2UgYW4gZXJyb3IuCgotIE1vdmVkIHRoZSBtdWx0aS5oIGZpbGUgdG8gdGhlICJwdWJsaWMiIGluY2x1ZGUgZGlyZWN0b3J5IGFuZCBtYWRlIGl0IGdldAogIGluY2x1ZGVkIGJ5IGN1cmwuaCBzbyB0aGF0IG5vIGV4dHJhIGluY2x1ZGUgZmlsZXMgd2lsbCBiZSBuZWNlc3NhcnkgdG8gdXNlCiAgaXQuCgogIEFkZGVkIGRvY3MgYW5kIG1hbiBwYWdlcyBmb3IgdGhlIG11bHRpIGludGVyZmFjZSB0byB0aGUgcmVsZWFzZSBhcmNoaXZlLgogIEFkZGVkIHRoZSB0aHJlZSBleGFtcGxlIHNvdXJjZSBjb2RlcyB0b28uCgogIE5lY2Vzc2FyeSBzdGVwcyBpbiBteSBjYW1wYWlnbiB0byBzbmVhayBpbiB0aGUgbXVsdGkgaW50ZXJmYWNlLi4uIDstKQoKLSBVcGRhdGVkIHRoZSB5ZWFyIGluIGFsbCBjb3B5cmlnaHQgbm90aWNlcyBpbiBhbGwgQyBhbmQgSCBmaWxlcy4KCkRhbmllbCAoMTggTWFyY2ggMjAwMikKLSBUb21hcyBTemVwZSBmb3VuZCBvdXQgdGhhdCAtZCBhbmQgLUcgZGlkbid0IG1peCBhcyB0aGV5IHNob3VsZC4gSSBicm9rZSB0aGlzCiAgaW4gNy45LjUuLi4gQWRkZWQgdGVzdCBjYXNlIDMyIGZvciB0aGlzLgoKVmVyc2lvbiA3LjkuNi1wcmUxCgpEYW5pZWwgKDE2IE1hcmNoIDIwMDIpCi0gUGV0ZXIgVmVyaGFzIHBvaW50ZWQgb3V0IHRoYXQgdGhlIGN1cmxfZXNjYXBlIGFuZCBjdXJsX3Vuc2NhcGUgbWFuIHBhZ2VzCiAgY29udGFpbmVkIGZhY3R1YWwgZXJyb3JzLgoKLSBBbGJlcnQgQ2hveSBmb3VuZCBhbmQgY29ycmVjdGVkIGEgcHJvYmxlbSB3aXRoIHRoZSB2ZXJib3NlIG91dHB1dCB3aGVuIGRvaW5nCiAgUEFTViBmdHAgdHJhbnNmZXJzLiBJdCBjb3VsZCBtYWtlIGxpYmN1cmwgY3Jhc2guCgogIERldGFpbHMgaW4gYnVnIHJlcG9ydCAjNTMwNTYyOgogIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci8/ZnVuYz1kZXRhaWwmYXRpZD0xMDA5NzYmYWlkPTUzMDU2MiZncm91cF9pZD05NzYKCkRhbmllbCAoMTUgTWFyY2ggMjAwMikKLSBKdW4taWNoaXJvIGl0b2p1biBIYWdpbm8gZmlsZWQgYnVnIHJlcG9ydCAjNTMwMjA0IHRoYXQgY2xlYXJseSBwb2ludGVkIG91dAogIHRoZSBQRl9JTkVUIGZpeCBmcm9tIEZlYnJ1YXJ5IDE5IGFzIGEgbm90LXZlcnktZ29vZCBmaXggYXMgaXQgYnJva2UgSVB2NgogIGNhcGFiaWxpdHkhIFRoYXQgcGF0Y2ggaXMgbm93IHJldmVydGVkLgoKICBUaGUgcHJvYmxlbSB3aXRoIHNsb3cgbmFtZSBsb29rdXBzIHdpdGggZ2V0YWRkcmluZm8oKSBvbiBub24tSVB2NiBlbmFibGVkCiAgaG9zdHMgYXJlIGluc3RlYWQgbWFkZSBieSBmaXJzdCBjaGVja2luZyBpZiB0aGUgc3RhY2sgaXMgSVB2Ni1lbmFibGVkIGFuZCBpZgogIG5vdCwgdGhlIFBGX0lORVQgaXMgdXNlZCBhbmQgb3RoZXJ3aXNlIHdlIGdvIHdpdGggdGhlIGZ1bGwgUEZfVU5TUEVDLgoKLSBULiBCaGFyYXRoIHBvaW50ZWQgb3V0IHRoYXQgd2hlbiB3ZSByZXR1cm4gYW4gImVycm9yIiBmcm9tIGEgV1JJVEVGVU5DVElPTgogIGFzIGRlc2NyaWJlZCBpbiB0aGUgbWFuIHBhZ2UsIGxpYmN1cmwgZGlkIG5vdCByZXR1cm4gdGhlIGRvY3VtZW50ZWQgZXJyb3IKICBjb2RlIChDVVJMRV9XUklURV9FUlJPUikgYnV0IHdvdWxkIGluc3RlYWQgcmV0dXJuIENVUkxFX1JFQURfRVJST1IuIFRoaXMgaXMKICBub3cgY29ycmVjdGVkLgoKRGFuaWVsICgxNCBNYXJjaCAyMDAyKQotIFNldHRpbmcgQ1VSTE9QVF9QT1NUIHdpdGhvdXQgc2V0dGluZyBDVVJMT1BUX1BPU1RGSUVMRFMgbm93IHJlYWQgdGhlIFBPU1QtCiAgZGF0YSBmcm9tIHRoZSBjYWxsYmFjay4KCi0gVGhlIEdPUEhFUiBzdXBwb3J0IHNlZW1zIHRvIGJlIGJyb2tlbi4gSSBkb24ndCB0aGluayBJJ2xsIGV2ZW4gc3RhcnQgZml4aW5nCiAgaXQgdW50aWwgc29tZW9uZSBlbHNlIGZpbmRzIG91dC4uLiA6LSkKCkRhbmllbCAoMTMgTWFyY2ggMjAwMikKLSBUcnlpbmcgJ2N1cmwgLUkgZnRwLnN1bmV0LnNlJyBvciBzaW1pbGFyIGRpZCBhIFNJWkUgb24gYSBzaWxseSAiKG5pbCkiCiAgc3RyaW5nLiBJZiBzdWNoIGEgZmlsZSB3b3VsZCBiZSBwcmVzZW50LCBjdXJsIHJldHVybmVkIHRoZSBzaXplIG9mIGl0ISBOb3cKICB3ZSBwcmV2ZW50IHRoaXMuCgotIEN1cmxfc2VuZGYoKSB3YXMgZml4ZWQgdG8gZGVhbCB3aXRoIHNpdHVhdGlvbiB3aGVyZSBDdXJsX3dyaXRlKCkgd291bGQndmUKICBibG9ja2VkIGFuZCB0aHVzIHJldHVybiAtMS4KCi0gU2V0dGluZyBDVVJMT1BUX1BST0dSRVNTRlVOQ1RJT04gdG8gTlVMTCBub3cgcmVzdG9yZXMgdGhlIGludGVybmFsIGZ1bmN0aW9uLgoKLSBBbGwgQ1VSTEZPUk1fKiBvcHRpb25zIGNhbiBub3cgYmUgdXNlZCBpbiBhIENVUkxGT1JNX0FSUkFZIGV4Y2VwdCB0aGUKICBDVVJMRk9STV9BUlJBWSBpdHNlbGYuIFRoaXMgd2FzIG5lY2Vzc2FyeSBzaW5jZSB3ZSBjb3VsZG4ndCBleHBhbmQgdGhlCiAgQ1VSTEZPUk1fKiBsaXN0IHByb3ByZWx5IGFuZCB1bnJlc3RyaWN0ZWQgdW50aWwgdGhpcyB3YXMgdGhlIGNhc2UuIEl0IHdhcwogIGFsc28gYSBiaXQgcGVjdWxpYXIgdG8gdXNlcnMgd2h5IHNvbWUgb3B0aW9ucyBjb3VsZCBiZSB1c2VkIGluIGFuIGFycmF5CiAgd2hpbGUgb3RoZXJzIGNvdWxkbid0LgoKLSBSZW1vdmVkIHNvbWUgc2lsbHkgQ1JMRiBsaW5lcyB0aGF0IGhhZCBhY2NpZGVudGFsbHkgc2xpcHBlZCBpbnRvIHNyYy9tYWluLmMKICBOaWNvIEJhZ2d1cyBwb2ludGVkIHRoZW0gb3V0IHRvIG1lLgoKRGFuaWVsICgxMSBNYXJjaCAyMDAyKQotIENVUkxGT1JNX0ZJTEVOQU1FIHdhcyBhZGRlZC4gVGhpcyBjYW4gYmUgc2V0IHdoZW4gY3JlYXRpbmcgYSBmaWxlIHVwbG9hZAogIHBhcnQsIHRvIHNldCB0aGUgJ2ZpbGVuYW1lJyBmaWVsZCB0byBhIGN1c3RvbSB2YWx1ZS4gSWYgdGhpcyBpc24ndCB1c2VkLAogIHRoZSBhY3R1YWxseSB1c2VkIGZpbGVuYW1lIHdpbGwgYmUgaW5jbHVkZWQgaW5zdGVhZCAoYXMgbGliY3VybCBhbHdheXMgaGFzCiAgZG9uZSkuIGN1cmwgd2FzIGFkanVzdGVkIGFjY29yZGluZ2x5LCBhbmQgbm93IC1GIGFjY2VwdHMgYSAnZmlsZW5hbWU9JyBmaWVsZAogIHRvbywgYW5kIGFsbG93cyBjb25zdHJ1Y3RzIHN1Y2ggYXM6CgogICAgLUYgJ25hbWU9QGZpbGVuYW1lO2ZpbGVuYW1lPS9kZXYvbnVsbCcKCiAgYW5kIHRoaXMgY2FuIGJlIGNvbWJpbmVkIHdpdGggdHlwZT0gdG9vLCBpbiBhIG1hbm5lciBzaW1pbGFyIHRvOgoKICAgLUYgImZpbGU9QGxvZy90ZXN0MzkudHh0O2ZpbGVuYW1lPWZha2VyZmlsZTt0eXBlPW1vby9mb29iYXIiCgogIFRlc3QgY2FzZSAzOSB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoaXMgZnVuY3Rpb25hbGl0eS4KCi0gVGhlIHN0cnVjdCBmb3JtZXJseSBrbm93biBhcyBIdHRwUG9zdCBpcyBub3cgbmFtZWQgY3VybF9odHRwcG9zdCB0byBwcm9wZXJseQogIHVzZSB0aGUgY3VybCBuYW1lIHNwYWNlLiBJIGFkZGVkIGEgI2RlZmluZSBmb3IgdGhlIG9sZCBuYW1lIHRvIG1ha2UgZXhpc3RpbmcKICBwcm9ncmFtcyBjb21waWxlIGV2ZW4gd2hlbiB0aGlzIG5ldyBpbmNsdWRlIGZpbGUgaXMgdXNlZC4KCkRhbmllbCAoOCBNYXJjaCAyMDAyKQotIENsaWZmb3JkIGFsc28gZGlzY292ZXJlZCB0aGF0IGlmIHRoZSBjbGllbnQgY29kZSBmYWlsZWQgZWFybHksIGFzIHdoZW4gZG9pbmcKICAiY3VybCAtTyIgb25seSwgaXQgd291bGQgZG8gZmNsb3NlKE5VTEwpIHdoaWNoIGNhdXNlZCBhIHNlZ21lbnRhdGlvbiBmYXVsdAogIG9uIHNvbWUgc3lzdGVtcy4KCi0gQ2xpZmZvcmQgV29sZiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFkZSAtLXByb2dyZXNzLWJhciB3b3JrIGFnYWluLgoKLSBJIGNsb3NlZCBidWcgcmVwb3J0ICM1MjcwMzIgYnkgbWFraW5nIHN1cmUgdGhhdCB3ZSBhZGQgYSBuZXdsaW5lIGFmdGVyIGEKICB0cmFuc2ZlciB3aGVuIC0tcHJvZ3Jlc3MtYmFyIGhhcyBiZWVuIHVzZWQuIEJlZm9yZSwgd2l0aG91dCB0aGUgbmV3bGluZSwgaXQKICBtYWRlIHRoZSBzdWJzZXF1ZW50IHRleHQgY29tZSBvdXQgd3JvbmcuCgpWZXJzaW9uIDcuOS41CgpEYW5pZWwgKDcgTWFyY2ggMjAwMikKLSBBZGRlZCBkb2NzL0tOT1dOX0JVR1MgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KCkRhbmllbCAoNiBNYXJjaCAyMDAyKQotIEtldmluIFJvdGggY29ycmVjdGVkIGEgZmxhdyBpbiB0aGUgY3VybCBjbGllbnQgZ2xvYmJpbmcgY29kZSB0aGF0IG1hZGUgaXQKICBtZXNzIHVwIGJhY2tzbGFzaGVzLiBUaGlzIHdhcyBtb3N0IG5vdGFibGUgb24gd2luZG93cyAoY3lnd2luKSBtYWNoaW5lcyB3aGVuCiAgdXNpbmcgZmlsZTovLy4KCi0gQnJhZCBwcm92aWRlZCBhbm90aGVyIGZpeCBmb3IgYnVpbGRpbmcgb3V0c2lkZSB0aGUgc291cmNlLXRyZWUuCgotIFJhbHBoIE1pdGNoZWxsIHBhdGNoZWQgYXdheSBhIGZldyBjb21waWxlciB3YXJuaW5ncyBpbiB0ZXN0cy9zZXJ2ZXIvc3dzLmMKCkRhbmllbCAoNSBNYXJjaCAyMDAyKQotIEkgbm90aWNlZCB0aGF0IHRoZSB0eXBlZGVmIGluIGN1cmwuaCBmb3IgdGhlIHByb2dyZXNzIGNhbGxiYWNrIHByb3RvdHlwZSB3YXMKICB3cm9uZyBhbmQgdGh1cyBhcHBsaWNhdGlvbnMgdGhhdCB1c2VkIGl0IHdvdWxkIG5vdCBnZXQgdGhlIHByb3BlciBpbnB1dAogIGRhdGEuIEl0IHVzZWQgc2l6ZV90IHdoZXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBhY3R1YWxseSB1c2VzIGRvdWJsZXMhCgogIEkgd2lzaCBJIGNvdWxkIGJsYW1lIHNvbWVvbmUgZWxzZSwgYnV0IHRoaXMgd2FzIG15IGZhdWx0LiBBZ2Fpbi4KClZlcnNpb24gNy45LjUtcHJlNgoKRGFuaWVsICg0IE1hcmNoIDIwMDIpCi0gQ3V0IG9mZiB0aGUgY2hhbmdlcyBkb25lIGR1cmluZyAyMDAxIGZyb20gdGhpcyBjaGFuZ2Vsb2cgZmlsZSBhbmQgcHV0IHRoZW0KICBpbiBhIHNlcGFyYXRlIGZpbGUgKENIQU5HRVMuMjAwMSksIGF2YWlsYWJsZSBmcm9tIENWUyBvZiBjb3Vyc2UuCgotIEkgcmVtb3ZlZCB0aGUgbXVsdGkgZGlyZWN0b3J5LiBUaGUgZXhhbXBsZSBzb3VyY2VzIHdlcmUgbW92ZWQgdG8gdGhlCiAgZG9jcy9leGFtcGxlcyBkaXJlY3Rvcnkgd2hlcmUgdGhleSBiZWxvbmcuCgotIFdyb3RlIDcgbmV3IG1hbiBwYWdlcyBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb25zIGluIHRoZSBuZXcgbXVsdGkgaW50ZXJmYWNlLgogIFRoZXkncmUgYWxsIHN0aWxsIHByZXR0eSBiYXNpYywgYnV0IHdlIGNhbiB1c2UgdGhlbSBhcyBhIHN0YXJ0IGFuZCBhZGQgbW9yZQogIGNvbnRlbnRzIHRvIHRoZW0gd2hlbiB3ZSBmaWd1cmUgb3V0IHdoYXQgdG8gd3JpdGUuIFRoZSBsYXJnZSBhbW91bnQgb2YgbWFuCiAgcGFnZXMgZm9yIGxpYmN1cmwgbm93IHByZXNlbnQgbWFkZSBtZSBkZWNpZGUgdG8gcHV0IHRoZW0gaW4gYSBuZXcgc2VwYXJhdGUKICBzdWJkaXJlY3RvcnkgaW4gdGhlIGRvY3MgZGlyZWN0b3J5LiBOYW1lZCBsaWJjdXJsLgoKLSBHaXVzZXBwZSBDb3JiZWxsaSBwcm92aWRlZCBhIHRlbXBsYXRlIGZpbGUgZm9yIHRoZSBFUE0gcGFja2FnZSBtYW5hZ2VyLCBpdAogIGdldHMgZ2VuZXJhdGVkIG5pY2VseSBieSB0aGUgY29uZmlndXJlIHNjcmlwdCBub3cuCgpWZXJzaW9uIDcuOS41LXByZTUKCkRhbmllbCAoMSBNYXJjaCAyMDAyKQotIE1vdmVkIHRoZSBtZW1hbmFseXplLnBsIHNjcmlwdCBpbnRvIHRoZSB0ZXN0cy8gZGlyIGFuZCBhZGRlZCBpdCB0byB0aGUKICByZWxlYXNlIGFyY2hpdmVzLiBJdCB3YXMgcHJldmlvdXNseSBvbmx5IHByZXNlbnQgaW4gdGhlIENWUyB0cmVlLgoKLSBNb2RpZmllZCB0aGUgRmVicnVhcnkgMTd0aCBIb3N0OiBmaXgsIGFzIGJ1ZyByZXBvcnQgIzUyMzcxOCBwb2ludGVkIG91dCB0aGF0CiAgaXQgY2F1c2VkIGNyYXNoZXMhCgotIE5pY28gQmFnZ3VzIGFkZGVkIG1vcmUgZXJyb3IgY29kZXMgdG8gdGhlIFZNUyBzdHVmZi4KCi0gV2VzbGV5IExheHRvbiBicm91Z2h0IHRoZSBjb2RlIHRoYXQgaW50cm9kdWNlZCB0aGUgbmV3IENVUkxPUFRfUFJFUVVPVEUKICBvcHRpb24uIEl0IGlzIGp1c3QgYW5vdGhlciBGVFAgcXVvdGUgb3B0aW9uIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkKICBhIGxpc3Qgb2YgRlRQIGNvbW1hbmRzIHRvIGlzc3VlICpqdXN0IGJlZm9yZSogdGhlIHRyYW5zZmVyIGNvbW1hbmQgKFJFVFIgb3IKICBTVE9SIGV0YykuIEl0IGhhcyB0dXJuZWQgdXAgYSBmZXcgc3lzdGVtcyB0aGF0IHJlYWxseSBuZWVkIHRoaXMuCgogIFRoZSBjdXJsIGNvbW1hbmQgbGluZSB0b29sIGNhbiBhbHNvIHRha2UgYWR2YW50YWdlIG9mIHRoaXMgYnkgcHJlZml4aW5nIHRoZQogIHF1b3RlIGNvbW1hbmRzIHdpdGggYSBwbHVzICgrKSBpbiBzaW1pbGFyIHN0eWxlIHRoYXQgcG9zdCB0cmFuc2ZlciBxdW90ZQogIGNvbW1hbmRzIGFyZSBzcGVjaWZpZWQuCgogIFRoaXMgaXMgbm90IHlldCBkb2N1bWVudGVkLiBUaGVyZSBpcyBubyB0ZXN0IGNhc2UgZm9yIHRoaXMgeWV0LgoKRGFuaWVsICgyOCBGZWJydWFyeSAyMDAyKQotIFJhbHBoIE1pdGNoZWxsIG1hZGUgc29tZSBzZXJpb3VzIGVmZm9ydHMgYW5kIHB1dCBhIGxvdCBvZiBzd2VhdCBpbiBzZXR0aW5nCiAgdXAgc2NyaXB0cyBhbmQgdGhpbmdzIGZvciBtZSB0byBiZSBhYmxlIHRvIHJlcGVhdCBoaXMgcHJvYmxlbXMsIGFuZCBJCiAgZmluYWxseSBjb3VsZC4gIEkgZm91bmQgYSBwcm9ibGVtIHdpdGggdGhlIGhlYWRlciBieXRlIGNvdW50ZXIgdGhhdCB3YXNuJ3QKICBpbmNyZWFzZWQgcHJvcGVybHkgYW5kIHRodXMgd2UgY291bGQgcmV0dXJuIENVUkxFX0dPVF9OT1RISU5HIHdoZW4gd2UgaW4KICBmYWN0IGhhZCByZWNlaXZlZCBkYXRhLgoKRGFuaWVsICgyNyBGZWJydWFyeSAyMDAyKQotIEkgaGFkIHRvIHJldmVydCB0aGUgbm9uLXNwYWNlIHBhcnNpbmcgY29va2llIGZpeCBJIHBvc3RlZCB0byB0aGUgbWFpbGluZwogIGxpc3QuIEV4cGlyZSBkYXRlcyBkbyBoYXZlIHNwYWNlcyBhbmQgc3RpbGwgbmVlZCB0byBnZXQgcGFyc2VkIHByb3Blcmx5IQogIEluc3RlYWQgd2UganVzdCBpZ25vcmUgdHJhaWxpbmcgd2hpdGUgc3BhY2UgYW5kIGl0IHNlZW1zIHRvIHdvcmsuLi4KCkRhbmllbCAoMjYgRmVicnVhcnkgMjAwMikKLSBNYWRlIHRoZSBjb29raWUgcHJvcGVydHkgJ01heC1BZ2UnIHdvcmssIGp1c3Qgc2luY2Ugd2UgYWxyZWFkeSB0cmllZCB0bwogIHN1cHBvcnQgaXQsIGl0IGlzIGJldHRlciB0byBkbyBpdCByaWdodC4gTm8gb25lIHVzZXMgdGhpcyBhbnl3YXkuCgotIFRoZSBjb29raWUgcGFyc2VyIGNvdWxkIGNyYXNoIGlmIGEgcmVhbGx5IHdlaXJkIChpbGxlZ2FsKSBjb29raWUgbGluZSB3YXMKICByZWNlaXZlZC4gSSBhbHNvIG1hZGUgaXQgYmV0dGVyIGRpc2NhcmQgcmVhbGx5IG9kZGx5IGZvcm1hdHRlZCBsaW5lcyBiZXR0ZXIuCgogIE1hZGUgdGhlIGNvb2tpZSBqYXIgc3RvcmUgdGhlIHNlY29uZCBmaWVsZCBmcm9tIHRoZSBsZWZ0IHVzaW5nIHRoZSBzeW50YXgKICB0aGF0IE5ldHNjYXBlIGFuZCBNb3ppbGxhIHByb2JhYmx5IGxpa2UuIEN1cmwgaXRzZWxmIGlnbm9yZXMgaXQuCgogIEFkZGVkIHRlc3QgY2FzZSAzMSBmb3IgdGhlc2UgY2FzZXMuCgogIENsYXkgTG92ZWxlc3MnIGVtYWlsIHJlZ2FyZGluZyBzb21lIGNvb2tpZSBpc3N1ZXMgc3RhcnRlZCBteSBjbGVhbnVwLgoKLSBLZXZpbiBSb3RoIHBvaW50ZWQgb3V0IHRoYXQgbXkgYXV0b21ha2UgZmlkZGxlcyBicm9rZSB0aGUgYWJpbGl0eSB0byBidWlsZAogIG91dHNpZGUgdGhlIHNvdXJjZS10cmVlIGFuZCBJIHBvc3RlZCBhIHBhdGNoIHRvIHRoZSBtYWlsaW5nIGxpc3QgdGhhdCBicmluZ3MKICB0aGlzIGFiaWxpdHkgYmFjay4KClZlcnNpb24gNy45LjUtcHJlNAoKRGFuaWVsICgyNSBGZWJydWFyeSAyMDAyKQotIEZpZGRsZWQgd2l0aCB0aGUgYXV0b21ha2UgZmlsZXMgdG8gbWFrZSBhbGwgc291cmNlIGZpbGVzIGluIHRoZSBsaWIKICBkaXJlY3Rvcnkgbm90IGhhdmUgLi4vc3JjIGluIHRoZSBpbmNsdWRlIHBhdGgsIGFuZCB0aGUgc3JjIHNvdXJjZXMgc2hvdWxkbid0CiAgaGF2ZSAuLi9saWIhCgotIEFsbCA3OSB0ZXN0IGNhc2VzIHJhbiBPSyB1bmRlciBMaW51eCBhbmQgU29sYXJpcyB1c2luZyB0aGUgbmV3IEhUVFAgc2VydmVyCiAgaW4gdGhlIHRlc3Qgc3VpdGUuIFRoZSBuZXcgSFRUUCBzZXJ2ZXIgd2FzIGZpcnN0IGRvbmF0ZWQgYnkgR2VvcmcgSG9ybiBhbmQKICBzdWJzZXF1ZW50bHkgbW9kaWZpZWQgdG8gd29yayB3aXRoIHRoZSB0ZXN0IHN1aXRlLiBJdCBpcyBjdXJyZW50bHkgc3RpbGwgbm90CiAgcG9ydGFibGUgZW5vdWdoIHRvIHJ1biBvbiAiYWxsIG92ZXIiIGJ1dCB0aGlzIGlzIGEgc3RhcnQgYW5kIEkgY2FuIHJ1biBhbGwKICBjdXJsIHRlc3RzIG9uIG15IG1hY2hpbmVzLiBUaGlzIGlzIGFuIGltcG9ydGFudCByZXF1aXJlbWVudCBmb3IgdGhlIHVwY29taW5nCiAgcHVibGljIHJlbGVhc2UuCgotIFVzaW5nIC1kIGFuZCAtSSBvbiB0aGUgc2FtZSBjb21tYW5kIGxpbmUgbm93IHJlcG9ydHMgYW4gZXJyb3IsIGFzIGl0IGltcGxpZXMKICB0d28gZGlmZmVyZW50IEhUVFAgcmVxdWVzdHMgdGhhdCBjYW4ndCBiZSBtaXhlZC4KCi0gSmVmZnJleSBQb2hsbWV5ZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1hZGUgdGhlIC13Ly0td3JpdGUtb3V0IG9wdGlvbgogIHN1cHBvcnQgJXtjb250ZW50X3R5cGV9IHRvIGdldCB0aGUgY29udGVudCB0eXBlIG9mIHRoZSByZWNlbnQgZG93bmxvYWQuCgotIEtldmluIFJvdGggcmVwb3J0ZWQgdGhhdCBwcmUyIGFuZCBwcmUzIGRpZG4ndCBjb21waWxlIHByb3Blcmx5IG9uIGN5Z3dpbiwKICBhbmQgdGhpcyB3YXMgYmVjYXVzZSBJIHVzZWQgI2lmZGVmIEhBVkVfV0lOU09DS19IIGluIGxpYi9tdWx0aS5oIHRvIGZpZ3VyZQogIG91dCBpZiB3ZSBjb3VsZCBpbmNsdWRlIHdpbnNvY2suaCB3aGljaCB0dXJucyBvdXQgbm90IHRvIGJlIGEgd2lzZSBjaG9pY2UgdG8KICBkbyBvbiBjeWd3aW4gc2luY2UgaXQgaGFzIHRoZSBmaWxlIGJ1dCBjYW4ndCBpbmNsdWRlIGl0IQoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDAyKQotIEFkZGVkIHNyYy9jb25maWctdm1zLmggdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KCi0gRml4ZWQgdGhlIGNvbm5lY3Rpb24gdGltZW91dCB2YWx1ZSBhZ2FpbiwgdGhlIGNoYW5nZSBmcm9tIEZlYnJ1YXJ5IDE4IHdhc24ndAogIGNvbXBsZXRlLgoKVmVyc2lvbiA3LjkuNS1wcmUzCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDIpCi0gS2V2aW4gUm90aCBhbmQgQW5kculzIEdhcmPtYSBib3RoIGZvdW5kIG91dCB0aGF0IGxpYi9jb25maWcuaC5pbiB3YXMgbWlzc2luZwogIGluIHRoZSBwcmUtcmVsZWFzZSBhcmNoaXZlIGFuZCB0aHVzIHRoZSBjb25maWd1cmUgc2NyaXB0IGZhaWxlZC4KClZlcnNpb24gNy45LjUtcHJlMgoKRGFuaWVsICgyMCBGZWJydWFyeSAyMDAyKQotIEFuZHLpcyBHYXJj7WEgcHJvdmlkZWQgYSBzb2x1dGlvbiB0byBidWcgcmVwb3J0ICM1MTUyMjguIHRoZSB0b3RhbCB0aW1lCiAgY291bnRlciB3YXMgbm90IHNldCBjb3JyZWN0bHkgd2hlbiAtSSB3YXMgdXNlZCBkdXJpbmcgc29tZSBjb25kaXRpb25zIChhbGwKICBoZWFkZXJzIHdlcmUgcmVhZCBpbiBvbmUgc2luZ2xlIHJlYWQpLgoKLSBOaWNvIEJhZ2d1cyBwcm92aWRlZCBhIGh1Z2UgcGF0Y2ggd2l0aCBtaW5vciB0d2Vha3MgYWxsIG92ZXIgdG8gbWFrZSBjdXJsCiAgY29tcGlsZSBuaWNlbHkgb24gVk1TLgoKRGFuaWVsICgxOSBGZWJydWFyeSAyMDAyKQotIFJpY2sgUmljaGFyZHNvbiBmb3VuZCBvdXQgdGhhdCBieSByZXBsYWNpbmcgUEZfVU5TUEVDIHdpdGggUEZfSU5FVCBpbiB0aGUKICBnZXRhZGRyaW5mbygpIGNhbGxzLCBoZSBjb3VsZCBzcGVlZCB1cCBzb21lIG5hbWUgcmVzb2x2aW5nIGNhbGxzIHdpdGggYW4KICBvcmRlciBvZiBtYWduaXR1ZGVzIG9uIGhpcyBSZWRoYXQgTGludXggNy4yLgoKLSBQaGlsaXAgR2xhZHN0b25lIGZvdW5kIGEgc2Vjb25kIElOQUREUl9OT05FIHByb2JsZW0gd2hlcmUgd2UgdXNlZCBsb25nCiAgaW50ZWFkIG9mIGluX2FkZHJfdCB3aGljaCBjYXVzZWQgNjRiaXQgcHJvYmxlbW9zLiBXZSByZWFsbHkgc2hvdWxkbid0IGRlZmluZQogIHRoYXQgb24gdHdvIGRpZmZlcmVudCBwbGFjZXMuCgpEYW5pZWwgKDE4IEZlYnJ1YXJ5IDIwMDIpCi0gUGhpbGlwIEdsYWRzdG9uZSBmb3VuZCBhIHByb2JsZW0gaW4gaG93IEhUVFAgcmVxdWVzdHMgd2VyZSBzZW50IGlmIHRoZQogIHJlcXVlc3QgY291bGRuJ3QgYmUgc2VudCBhbGwgYXQgb25jZS4KCi0gRW1pbCBmb3VuZCBhbmQgY29ycmVjdGVkIGEgYmFkIGNvbm5lY3Rpb24gdGltZW91dCBjb21wYXJpc29uIHRoYXQgbWFkZSBjdXJsCiAgdXNlIHRoZSBsb25nZXN0IG9mIGNvbm5lY3QtdGltZW91dCBhbmQgdGltb3V0IGFzIGEgdGltZW91dCB2YWx1ZSwgaW5zdGVhZCBvZgogIHRoZSBzaG9ydGVzdCBhcyBpdCB3YXMgc3VwcG9zZWQgdG8hCgotIEFyb24gUm9iZXJ0cyBwcm92aWRlZCB1cGRhdGVkIGluZm9ybWF0aW9uIGFib3V0IExEQVAgVVJMIHN5bnRheCB0byBnbyBpbnRvCiAgdGhlIG1hbnVhbCBhcyBhIHJlcGxhY2VtZW50IGZvciB0aGUgb2xkIHJlZmVyZW5jZXMuCgpEYW5pZWwgKDE3IEZlYnJ1YXJ5IDIwMDIpCi0gUGhpbGlwIEdsYWRzdG9uZSBwb2ludGVkIG91dCB0d28gbWlzc2luZyBpbmNsdWRlIGZpbGVzIHRoYXQgbWFkZSBjdXJsIGNvcmUKICBkdW1wIG9uIDY0Yml0IGFyY2hpdGVjdHVyZXMuIFdlIG5lZWQgdG8gcGF5IG1vcmUgYXR0ZW50aW9uIG9uIHRoZXNlIGRldGFpbHMuCiAgSXQgaXMgKmxldGhhbCogdG8gZm9yIGV4YW1wbGUgZm9yZ2V0IHRoZSBtYWxsb2MoKSBwcm90b3R5cGUsIGFzICdpbnQnIGlzCiAgMzJiaXQgYW5kIG1hbGxvYygpIG11c3QgcmV0dXJuIGEgNjRiaXQgcG9pbnRlciBvbiB0aGVzZSBwbGF0Zm9ybXMuCgotIEdpYXNsYXMgR2Vvcmdpb3MgZml4ZWQgYSBwcm9ibGVtIHdpdGggSG9zdDogaGVhZGVycyBvbiByZXBlYXRlZCByZXF1ZXN0cyBvbgogIHRoZSBzYW1lIGhhbmRsZSB1c2luZyBhIHByb3h5LgoKRGFuaWVsICg4IEZlYnJ1YXJ5IDIwMDIpCi0gSGFubm8gTC4gS3Jhbnpob2ZmIGFjY3VyYXRlbHkgZm91bmQgb3V0IHRoYXQgZGlzYWJsaW5nIHRoZSBFeHBlY3Q6IGhlYWRlcgogIHdoZW4gZG9pbmcgbXVsdGlwYXJ0IGZvcm1wb3N0cyBkaWRuJ3Qgd29yayB2ZXJ5IHdlbGwuIEl0IGRpc2FibGVkIG90aGVyCiAgcGFydHMgb2YgdGhlIHJlcXVlc3QgaGVhZGVyIHRvbywgcmVzdWx0aW5nIGluIGEgYnJva2VuIGhlYWRlci4gV2hlbiBJIGZpeGVkCiAgdGhpcywgSSBhbHNvIG5vdGljZWQgdGhhdCB0aGUgQ29udGVudC1UeXBlIHdhc24ndCBwb3NzaWJsZSB0byBkaXNhYmxlLiBJdCBpcwogIG5vdywgZXZlbiB0aG91Z2ggaXQgcHJvYmFibHkgaXMgcmVhbGx5IHN0dXBpZCB0byB0cnkgdG8gZG8gdGhpcyAoYmVjYXVzZSBvZgogIHRoZSBib3VuZGFyeSBzdHJpbmcgdGhhdCBpcyBpbmNsdWRlZCBpbiB0aGUgaW50ZXJuYWxseSBnZW5lcmF0ZWQgaGVhZGVyLAogIHVzZWQgYXMgZm9ybSBwYXJ0IHNlcGFyYXRvci4pCgpEYW5pZWwgKDcgRmVicnVhcnkgMjAwMikKLSBJIG1vdmVkIHRoZSBjb25maWcqLmggZmlsZXMgZnJvbSB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gdGhlIGxpYi8gZGlyZWN0b3J5LgoKLSBJJ3ZlIGFkZGVkIHRoZSBuZXcgdGVzdCBzdWl0ZSBIVFRQIHNlcnZlciB0byB0aGUgQ1ZTIHJlcG9zaXRvcnksIEl0IHNlZW1zIHRvCiAgd29yayBwcmV0dHkgZ29vZCBub3csIGJ1dCB3ZSBtdXN0IG1ha2UgaXQgZ2V0IHVzZWQgYnkgdGhlIHRlc3Qgc2NyaXB0cwogIHByb3Blcmx5IGFuZCB0aGVuIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaXQgY29tcGlsZXMsIGJ1aWxkcyBhbmQgcnVucyBvbgogIG1vc3Qgb3BlcmF0aW5nIHN5c3RlbXMuCgpWZXJzaW9uIDcuOS41LXByZTEKCkRhbmllbCAoNiBGZWJydWFyeSAyMDAyKQotIE1pa2xvcyBOZW1ldGggcHJvdmlkZWQgdXBkYXRlZCB3aW5kb3dzIG1ha2VmaWxlcyBhbmQgSU5TVEFMTCBkb2NzLgoKLSBNciBMYXJyeSBGYWhub2UgZm91bmQgYSBwcm9ibGVtIHdpdGggZm9ybXBvc3RzIGFuZCBJIG1hbmFnZWQgdG8gdHJhY2sgZG93bgogIGFuZCBwYXRjaCB0aGlzIGJ1Zy4gVGhpcyB3YXMgYWN0dWFsbHkgdHdvIGJ1Z3MsIGFzIHRoZSBwb3N0ZWQgc2l6ZSB3YXMgYWxzbwogIHNhaWQgdG8gYmUgdHdvIGJ5dGVzIHRvbyBsYXJnZS4KCi0gQnJlbnQgQmVhcmRzbGV5IGZvdW5kIG91dCBhbmQgYnJvdWdodCBhIGNvcnJlY3Rpb24gZm9yIHRoZQogIENVUkxJTkZPX0NPTlRFTlRfVFlQRSBwYXJzZXIgdGhhdCB3YXMgb2ZmIG9uZSBieXRlLiBUaGlzIHdhcyBteSBmYXVsdCwgSQogIGFjY2lkZW50YWx5IGJyb2tlIEdpYXNsYXMgR2Vvcmdpb3MnIHBhdGNoLgoKRGFuaWVsICg1IEZlYnJ1YXJ5IDIwMDIpCi0gS2V2aW4gUm90aCBmb3VuZCB5ZXQgYW5vdGhlciBTU0wgZG93bmxvYWQgcHJvYmxlbS4KClZlcnNpb24gNy45LjQKCi0gbm8gY2hhbmdlcyBzaW5jZSBwcmUtcmVsZWFzZQoKVmVyc2lvbiA3LjkuNC1wcmUyCgpEYW5pZWwgKDMgRmVicnVhcnkgMjAwMikKLSBFcmljIE1lbHZpbGxlIHByb3ZpZGVkIGEgZmV3IHNwZWxsaW5nIGNvcnJlY3Rpb25zIGluIHRoZSBjdXJsIG1hbiBwYWdlLgoKRGFuaWVsICgxIEZlYnJ1YXJ5IDIwMDIpCi0gQW5kcmVhcyBEYW1tIGNvcnJlY3RlZCB0aGUgdW5jb25kaXRpb25hbCB1c2Ugb2YgZ210aW1lKCkgaW4gZ2V0ZGF0ZSwgaXQgbm93CiAgdXNlcyBnbXRpbWVfcigpIG9uIGFsbCBob3N0cyB0aGF0IGhhdmUgaXQuCgpEYW5pZWwgKDMxIEphbnVhcnkgMjAwMikKLSBBbiBhbm9ueW1vdXMgYnVnIHJlcG9ydCBpZGVudGlmaWVkIGEgcHJvYmxlbSBpbiB0aGUgRE5TIGNhY2hpbmcgd2hpY2ggbWFkZSBpdAogIHNvbWV0aW1lcyBhbGxvY2F0ZSBvbmUgYnl0ZSB0b28gbGl0dGxlIHRvIHN0b3JlIHRoZSBjYWNoZSBlbnRyeSBpbi4gVGhpcwogIGhhcHBlbmVkIHdoZW4gdGhlIHBvcnQgbnVtYmVyIHN0YXJ0ZWQgd2l0aCAxIQoKLSBBbGJlcnQgQ2hpbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgaW1wcm92ZXMgdGhlIGdldGhvc3RieW5hbWVfcigpIGNvbmZpZ3VyZQogIGNoZWNrIG9uIEhQLVVYIDExLjAwLgoKVmVyc2lvbiA3LjkuNC1wcmUxCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwMikKLSBHZW9yZyBIb3JuIGZvdW5kIGFub3RoZXIgd2F5IHRoZSBTU0wgcmVhZGluZyBmYWlsZWQgZHVlIHRvIHRoZSBub24tYmxvY2tpbmcKICBzdGF0ZSBvZiB0aGUgc29ja2V0cyEgSSBmaXhlZC4KCkRhbmllbCAoMjkgSmFudWFyeSAyMDAyKQotIE11bHRpcGFydCBmb3JtcG9zdHMgbm93IHNlbmQgdGhlIGZ1bGwgcmVxdWVzdCBwcm9wZXJseSwgaW5jbHVkaW5nIHRoZSBDUkxGLgogIFRoZXkgd2VyZSBwcmV2aW91c2x5IHRyZWF0ZWQgYXMgcGFydCBvZiB0aGUgcG9zdCBkYXRhLgoKLSBUaGUgdXBsb2FkIGJ5dGUgY291bnRlciBidWdnZWQuCgotIFQuIEJoYXJhdGggcG9pbnRlZCBvdXQgdGhhdCB3ZSBzZWVkIFNTTCBvbiBldmVyeSBjb25uZWN0LCB3aGljaCBpcyBhIHRpbWUtCiAgY29uc3VtaW5nIG9wZXJhdGlvbiB0aGF0IHNob3VsZCBvbmx5IGJlIG5lZWRlZCB0byBkbyBvbmNlLiBXZSBwYXRjaGVkCiAgbGliY3VybCB0byBub3cgb25seSBzZWVkIG9uIHRoZSBmaXJzdCBjb25uZWN0IHdoZW4gdW5zZWVkZWQuIFRoZSBzZWVkZWQKICBzdGF0dXMgaXMgZ2xvYmFsIHNvIGl0J2xsIG5vdyBvbmx5IGhhcHBlbiBvbmNlIGR1cmluZyBhIHByb2dyYW0ncyBsaWZlIHRpbWUuCgogIElmIHRoZSByYW5kb21fZmlsZSBvciBlZ2Rzb2NrZXQgaXMgc2V0LCB0aGUgc2VlZCB3aWxsIGJlIHJlLW1hZGUgdGhvdWdoLgoKLSBHaWFzbGFzIEdlb3JnaW9zIGludHJvZHVjZWQgQ1VSTElORk9fQ09OVEVOVF9UWVBFIHRoYXQgbGV0cwogIGN1cmxfZWFzeV9nZXRpbmZvKCkgcmVhZCB0aGUgY29udGVudC10eXBlIGZyb20gdGhlIHByZXZpb3VzIHJlcXVlc3QuCgpEYW5pZWwgKDI4IEphbnVhcnkgMjAwMikKLSBLamV0aWwgSmFjb2JzZW4gZm91bmQgYSB3YXkgdG8gY3Jhc2ggY3VybCBhbmQgYWZ0ZXIgbXVjaCBkZWJ1Z2dpbmcsIGl0CiAgdHVybmVkIG91dCBpdCB3YXMgYSBJUHY0LWxpbnV4IG9ubHkgcHJvYmxlbSBpbnRyb2R1Y2VkIGluIDcuOS4zIHJlbGF0ZWQgdG8KICBuYW1lIHJlc29sdmluZy4KCi0gQW5kcmVhcyBEYW1tIHBvc3RlZCBhIGh1Z2UgcGF0Y2ggdGhhdCBtYWRlIHRoZSBjdXJsX2dldGRhdGUoKSBmdW5jdGlvbiBmdWxseQogIHJlZW50cmFudCEKCi0gU3RldmUgTWFyeCBwb2ludGVkIG91dCB0aGF0IHlvdSBjb3VsZG4ndCBtaXggQ1VSTE9QVF9DVVNUT01SRVFVRVNUIHdpdGgKICBDVVJMT1BUX1BPU1RGSUVMRFMuIFlvdSBjYW4gbm93IQoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDIpCi0gS3Jpc2huZW5kdSBNYWp1bWRhciBwb2ludGVkIG91dCB0aGF0IHRoZSBoZWFkZXIgbGVuZ3RoIGNvdW50ZXIgd2FzIG5vdCByZXNldAogIGJldHdlZW4gbXVsdGlwbGUgcmVxdWVzdHMgb24gdGhlIHNhbWUgaGFuZGxlLgoKLSBQZWRybyBOZXZlcyByaWdodGZ1bGx5IHF1ZXN0aW9uZWQgd2h5IGN1cmwgYWx3YXlzIGFwcGVuZCBcclxuIHRvIHRoZSBkYXRhCiAgdGhhdCBpcyBzZW50IGluIEhUVFAgUE9TVCByZXF1ZXN0cy4gVW5mb3J0dW5hdGVseSwgdGhpcyBicm9rZSB0aGUgdGVzdCBzdWl0ZQogIGFzIHRoZSB0ZXN0IEhUVFAgc2VydmVyIGlzIGxhbWUgZW5vdWdoIG5vdCB0byBkZWFsIHdpdGggdGhpcy4uLiA6LU8KCi0gRm9sbG93aW5nIExvY2F0aW9uOiBoZWFkZXJzIHdoZW4gdGhlIGNvbm5lY3Rpb24gZGlkbid0IGNsb3NlIGRpZG4ndCB3b3JrIGFzCiAgbGliY3VybCBkaWRuJ3QgcHJvcGVybHkgc3RvcCByZWFkaW5nLiBUaGlzIHByb2JsZW0gd2FzIGFkZGVkIGluIDcuOS4zIGR1ZSB0bwogIHRoZSByZXN0cnVjdHVyZWQgaW50ZXJuYWxzLiAnRnJhbmsnIHBvc3RlZCBhIGJ1ZyByZXBvcnQgYWJvdXQgdGhpcy4KCkRhbmllbCAoMjQgSmFudWFyeSAyMDAyKQotIEtldmluIFJvdGggdmVyeSBxdWlja2x5IHNwb3R0ZWQgdGhhdCB3ZSB3cm9uZ2x5IGluc3RhbGxlZCB0aGUgZXhhbXBsZQogIHByb2dyYW1zIHRoYXQgd2VyZSBidWlsdCBpbiB0aGUgbXVsdGkgZGlyZWN0b3J5LCB3aGVuICdtYWtlIGluc3RhbGwnIHdhcwogIHVzZWQuIDotLwoKVmVyc2lvbiA3LjkuMwoKRGFuaWVsICgyMyBKYW51YXJ5IDIwMDIpCi0gQW5kculzIEdhcmPtYSBmb3VuZCBhIHBlcnNpc3RhbmN5IHByb2JsZW0gd2hlbiBkb2luZyBIVFRQIEhFQUQsIHRoYXQgbWFkZQogIGN1cmwgImhhbmciIHVudGlsIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgYnkgdGhlIHNlcnZlci4gVGhpcyBwcm9ibGVtIGhhcwogIGJlZW4gaW50cm9kdWNlZCBpbiA3LjkuMyBkdWUgdG8gaW50ZXJuYWwgcmV3cml0ZXMsIHRoaXMgd2FzIG5vdCBwcmVzZW50IGluCiAgNy45LjIuCgpWZXJzaW9uIDcuOS4zLXByZTQKCkRhbmllbCAoMTkgSmFudWFyeSAyMDAyKQotIEFudG9uaW8gZmlsZWQgYnVnIHJlcG9ydCAjNTA1NTE0IGFuZCBwcm92aWRlZCBhIGZpeCEgV2hlbiBkb2luZyBtdWx0aXBhcnQKICBmb3JtcG9zdHMsIGxpYmN1cmwgd291bGQgaW5jbHVkZSBhbiBlcnJvciB0ZXh0IGluIHRoZSBhY3R1YWwgcG9zdCBpZiBhCiAgc3BlY2lmaWVkIGZpbGUgd2Fzbid0IGZvdW5kLiBUaGlzIGlzIG5vdCBsaWJjdXJsJ3Mgam9iLiBJbnN0ZWFkIHdlIGFkZCBhbgogIGVtcHR5IHBhcnQuCgpEYW5pZWwgKDE4IEphbnVhcnkgMjAwMikKLSBQbGF5ZWQgYXJvdW5kIHdpdGggc3RyaWN0ZXIgY29tcGlsZXIgd2FybmluZ3MgZm9yIGdjYyAod2hlbiAuL2NvbmZpZ3VyZQogIC0tZW5hYmxlLWRlYnVnIGlzIHVzZWQpIGFuZCBjaGFuZ2VkIHNvbWUgbWlub3IgdGhpbmdzIHRvIHN0b3AgdGhlIHdhcm5pbmdzLgoKLSBDb21tZW50ZWQgb3V0IHRoZSAnbG9uZyBsb25nJyBhbmQgJ2xvbmcgZG91YmxlJyBjaGVja3MgaW4gY29uZmlndXJlLmluLCBhcwogIHdlIGRvbid0IGN1cnJlbnRseSB1c2UgdGhlbSBhbnl3YXkgYW5kIHRoZSBjb2RlIGluIGxpYi9tcHJpbnRmLmMgdGhhdCB1c2UKICB0aGVtIGNhdXNlcyB3YXJuaW5ncy4KCi0gU2F1bCBHb29kIGFuZCBqb25hdGFuIHBvaW50ZWQgb3V0IE1hYyBPUyBYIGJ1aWxkIHByb2JsZW1zIHdpdGggcHJlMyBhbmQgaG93CiAgdG8gY29ycmVjdCB0aGVtLiBUd28gY29tcGlsZXIgd2FybmluZ3Mgd2VyZSByZW1vdmVkIGFzIHdlbGwuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgdHdvIG1pbm9yIG1pbmd3MzIgYnVpbGRpbmcgcHJvYmxlbXMuCgpWZXJzaW9uIDcuOS4zLXByZTMKCkRhbmllbCAoMTcgSmFudWFyeSAyMDAyKQotIGRvY3MvbGliY3VybC10aGUtZ3VpZGUgaXMgYSBuZXcgdHV0b3JpYWwgZm9yIG91ciBsaWJjdXJsIHByb2dyYW1taW5nCiAgZnJpZW5kcy4KCi0gUmljaGFyZCBBcmNoZXIgYnJvdWdodCBiYWNrIHRoZSBhYmlsaXR5IHRvIGNvbXBpbGUgYW5kIGJ1aWxkIHdpdGggT3BlblNTTAogIHZlcnNpb25zIGJlZm9yZSAwLjkuNS4KICBbaHR0cDovL3NvdXJjZWZvcmdlLm5ldC90cmFja2VyLz9mdW5jPWRldGFpbCZhdGlkPTEwMDk3NiZhaWQ9NTA0MTYzJmdyb3VwX2lkPTk3Nl0KCi0gVGhlIEROUyBjYWNoZSBjb2RlIGRpZG4ndCB0YWtlIHRoZSBwb3J0IG51bWJlciBpbnRvIGFjY291bnQsIHdoaWNoIG1hZGUgaXQKICB3b3JrIHJhdGhlciBiYWQgb24gSVB2Ni1lbmFibGVkIGhvc3RzIChlc3BlY2lhbGx5IHdoZW4gZG9pbmcgcGFzc2l2ZQogIEZUUCkuIFN0ZXJsaW5nIGZpeGVkIGl0LgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDIpCi0gR2VvcmcgSG9ybiBjb3VsZCBtYWtlIGEgdHJhbnNmZXIgdGltZS1vdXQgd2l0aG91dCBlcnJvciB0ZXh0LiBJIGZvdW5kIGl0IGFuZAogIGNvcnJlY3RlZCBpdC4KCi0gU1NMIHdyaXRlcyBkaWRuJ3Qgd29yaywgdGhleSByZXR1cm4gYW4gdW5pbml0aWFsaXplZCB2YWx1ZSB0aGF0IGNhdXNlZAogIGhhdm9jIGFsbCBvdmVyLiBHZW9yZyBIb3JuIGV4cGVyaWVuY2VkIHRoaXMuCgotIEtldmluIFJvdGggcGF0Y2hlZCB0aGUgY3VybF92ZXJzaW9uKCkgZnVuY3Rpb24gdG8gdXNlIHRoZSBwcm9wZXIgT3BlblNTTAogIGZ1bmN0aW9uIGZvciB2ZXJzaW9uIGluZm9ybWF0aW9uLiBUaGlzIHdheSwgY3VybCB3aWxsIHJlcG9ydCB0aGUgdmVyc2lvbiBvZgogIHRoZSBTU0wgbGlicmFyeSBhY3R1YWxseSBydW5uaW5nIHJpZ2h0IG5vdywgbm90IHRoZSBvbmUgdGhhdCBoYWQgaXRzIGhlYWRlcnMKICBpbnN0YWxsZWQgd2hlbiBsaWJjdXJsIHdhcyBidWlsdC4gTWFpbmx5IGludGVyc3Rpbmcgd2hlbiBydW5uaW5nIHdpdGggc2hhcmVkCiAgT3BlblNTTCBsaWJyYXJpZXMuICAKClZlcnNpb24gNy45LjMtcHJlMgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDIpCi0gTW9maWVkIHRoZSBtYWluIHRyYW5zZmVyIGxvb3AgYW5kIHJlbGF0ZWQgc3R1ZmYgdG8gZGVhbCB3aXRoIG5vbi1ibG9ja2luZwogIHNvY2tldHMgaW4gdGhlIHVwbG9hZCBzZWN0aW9uLiBXaGlsZSBkb2luZyB0aGlzLCBJJ3ZlIG5vdyBzZXBhcmF0ZWQgdGhlCiAgY29ubmVjdGlvbiBvcmllbnRlZCBidWZmZXJzIHRvIGhhdmUgb25lIGZvciBkb3dubG9hZHMgYW5kIG9uZSBmb3IgdXBsb2FkcwogIChhcyB0d28gY2FuIGhhcHBlbiBzaW11bHRhbmVvdXNseSkuIEkgYWxzbyBzaHJ1bmsgdGhlIGJ1ZmZlcnMgdG8gMjBLCiAgZWFjaC4gQXMgd2UgaGF2ZSBhIHNjcmF0Y2ggYnVmZmVyIHR3aWNlIHRoZSBzaXplIG9mIHRoZSB1cGxvYWQgYnVmZmVyLCB3ZQogIGFycml2ZWQgYXQgODBLIGZvciBidWZmZXJzIGNvbXBhcmVkIHdpdGggdGhlIHByZXZpb3VzIDE1MEsuCgotIEFkZGVkIHRoZSAtLWNjIG9wdGlvbiB0byBjdXJsLWNvbmZpZyBjb21tYW5kIGFzIGl0IGVuYWJsZXMgc28gdmVyeSBjb29sCiAgb25lLWxpbmVycy4gSGF2ZSBhIGdvIGEgdGhpcyBvbmUsIGJ1aWxkaW5nIHRoZSBzaW1wbGUuYyBleGFtcGxlOgoKICAgICAgICAkIGBjdXJsLWNvbmZpZyAtLWNjIC0tY2ZsYWdzIC0tbGlic2AgLW8gZXhhbXBsZSBzaW1wbGUuYwoKRGFuaWVsICgxNCBKYW51YXJ5IDIwMDIpCi0gSSBtYWRlIGFsbCBzb2NrZXQgcmVhZHMgKHJlY3YpIGhhbmRsZSBFV09VTERCTE9DSy4gSSBob3BlIG5pY2VseS4gTm93IHdlCiAgb25seSBuZWVkIHRvIGFkZHJlc3MgYWxsIHdyaXRlcyAoc2VuZCkgdG9vIGFuZCB0aGVuIEknbSByZWFkeSBmb3IgYW5vdGhlcgogIHByZS1yZWxlYXNlLi4uCgotIFN0b25lZCBFbGlwb3QgcGF0Y2hlZCB0aGUgaW5fYWRkcl90IGNvbmZpZ3VyZSB0ZXN0IHRvIG1ha2UgaXQgd29yayBiZXR0ZXIgb24KICBtb3JlIHBsYXRmb3Jtcy4KCkRhbmllbCAoOSBKYW51YXJ5IDIwMDIpCi0gQ3JpcyBCYWlsaWZmIGZvdW5kIG91dCB0aGF0IGZpbGxpbmcgdXAgY3VybCdzIFNTTCBzZXNzaW9uIGNhY2hlIGNhdXNlZCBhCiAgY3Jhc2ghCgotIFBvc3RlZCB0aGUgY3VybCBxdWVzdGlvbm5haXJlIG9uIHRoZSB3ZWIgc2l0ZS4gSWYgeW91IGhhdmVuJ3QgcG9zdGVkIHlvdXIKICBvcGluaW9ucyB0aGVyZSB5ZXQsIGdvIHRoZXJlIGFuZCBkbyBpdCBub3cgd2hpbGUgaXQgaXMgc3RpbGwgdGhlcmU6CgogICAgICAgIGh0dHA6Ly9jdXJsLmhheHguc2UvcS8KCi0gR2VvcmcgSG9ybiBxdWlja2x5IGZvdW5kIG91dCB0aGF0IHRoZSBTU0wgcmVhZGluZyBubyBsb25nZXIgd29ya2VkIGFzCiAgc3VwcG9zZWQgc2luY2UgdGhlIHN3aXRjaCB0byBub24tYmxvY2tpbmcgc29ja2V0cy4gSSd2ZSBtYWRlIGEgcXVpY2sgcGF0Y2gKICAoZm9yIHJlYWRpbmcgb25seSkgYnV0IHdlIHNob3VsZCBpbXByb3ZlIGl0IGV2ZW4gZnVydGhlci4KClZlcnNpb24gNy45LjMtcHJlMQoKRGFuaWVsICg3IEphbnVhcnkgMjAwMikKLSBJIG1hZGUgdGhlICdib29sJyB0eXBlZGVmIHVzZSBhbiAidW5zaWduZWQgY2hhciIuIEl0IG1ha2VzIGl0IHRoZSBzYW1lIG9uCiAgYWxsIHBsYXRmb3Jtcywgbm8gbWF0dGVyIHdoYXQgdGhlIHBsYXRmb3JtIHRoaW5rcyB0aGUgZGVmYXVsdCBmb3JtYXQgZm9yCiAgY2hhciBpcy4gVGhpcyB3YXMgbm90aWNlZCBzaW5jZSB3ZSBtYWRlIGEgc2lsbHkgY29tcGFyaXNvbiBpbnZvbHZpbmcgc3VjaCBhCiAgYm9vbCB2YXJpYWJsZSwgYW5kIG9ubHkgb25lIGNvbXBpbGVyL3BsYXRmb3JtIGNvbWJpbmF0aW9uIChvbiBEZWJpYW4gTGludXgpCiAgY29tcGxhaW5lZCBhYm91dCBpdCAodGhhdCBoYXBwZW5lZCB0byBoYXZlIGl0cyBjaGFyIHVuc2lnbmVkIGJ5IGRlZmF1bHQpLgoKLSBCdWcgcmVwb3J0ICM0OTUyOTAgaWRlbnRpZmllZCBhIGNvb2tpZSBwYXJzaW5nIHByb2JsZW0gdGhhdCB3YXMgY29ycmVjdGVkLgogIFdoZW4gYSBTZXQtQ29va2llOiBsaW5lIGlzIHJlY2VpdmVkIHdpdGhvdXQgYSB0cmFpbGluZyBzZW1pY29sb24sIGxpYmN1cmwKICBkaWRuJ3QgcmVhZCB0aGUgbGFzdCAibmFtZT12YWx1ZSIgcGFpciBvZiB0aGUgbGluZSwgbGVhZGluZyB0byBjb25mdXNpb25zLi4uCgotIFN0ZXJsaW5nIGNvbW1pdHRlZCBoaXMgdXBkYXRlZCBETlMgY2FjaGUgY29kZS4KCi0gSSB3b3JrZWQgd2l0aCBHZW9yZyBIb3JuIGFuZCBjb21tZW50cyBmcm9tIEf2dHogQmFiaW4tRWJlbGwgYW5kIHN3aXRjaGVkCiAgY3VybCdzIHNvY2tldCBvcGVyYXRpb25zIGNvbXBsZXRlbHkgb3ZlciB0byBub24tYmxvY2tpbmcgZm9yIHRoZSBlbnRpcmUKICBvcGVyYXRpb24gKHByZXZpb3VzbHkgd2UgdXNlZCBub24tYmxvY2tpbmcgb25seSBmb3IgdGhlIGNvbm5lY3Rpb24gcGhhc2UpLgogIFdlIGhhZCB0byBkbyB0aGlzIHRvIG1ha2UgdGhlIFNTTCBjb25uZWN0aW9uIHBoYXNlIHRpbWVvdXQgcHJvcGVybHkgd2l0aG91dAogIHRoZSB1c2Ugb2Ygc2lnbmFscy4gQSBsaXR0bGUgZXh0cmEgY29kZSB0byBkZWFsIHdpdGggdGhpcyB3YXMgYWRkZWQuCgotIFQuIEJoYXJhdGggcG9pbnRlZCBvdXQgYSBzbGlnaHRseSBvYnNjdXJlIGNvb2tpZSBlbmdpbmUgZmxhdy4KCi0gUGV0ZSBTdSBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgZGlkbid0IHRyZWF0IEhUVFAgY29kZSAyMDQgYXMgaXQgc2hvdWxkLgogIDIwNC1yZXBsaWVzIG5ldmVyIHByb3ZpZGVzIGEgcmVzcG9uc2UtYm9keS4gVGhpcyByZXN1bHRlZCBpbiBiYWQgcGVyc2lzdGFudAogIGJlaGF2aW9yIHdoZW4gMjA0IHdhcyByZWNlaXZlZC4KCkRhbmllbCAoNSBKYW51YXJ5IDIwMDIpCi0gU00gdXBkYXRlZCB0aGUgVkMrKyBsaWJyYXJ5IE1ha2VmaWxlcyBmb3IgdGhlIG5ldyBzb3VyY2UgZmlsZXMuCgpEYW5pZWwgKDQgSmFudWFyeSAyMDAyKQotIEkgZGlzY292ZXJlZCB0aGF0IHdlIHdyb25nbHkgdXNlZCBpbmV0X250b2EoKSAoaW5zdGVhZCBvZiBpbmV0X250b2FfcigpIGluCiAgdHdvIHBsYWNlcyBpbiB0aGUgc291cmNlIGNvZGUpLiBPbmUgaGFwcGVuZWQgd2l0aCBWRVJCT1NFIHNldCBvbiBjb25uZWN0cywKICBhbmQgdGhlIG90aGVyIHdoZW4gVkVSQk9TRSB3YXMgb24gYW5kIGtyYjQgb3ZlciBuYXQgd2FzIHVzZWQuLi4gSSBob25lc3RseQogIGRvbid0IHRoaW5rIGFueW9uZSBoYXMgc3VmZmVyZWQgZnJvbSB0aGVzZSBtaXN0YWtlcy4KCi0gSSByZXBsYWNlZCBhIGxvdCBvZiBzaWxseSBvY2N1cmFuY2VzIG9mIHByaW50ZigpIHRvIGluc3RlYWQgdXNlIHRoZSBtb3JlCiAgYXBwcm9wcmlhdGUgQ3VybF9pbmZvZigpIG9yIEN1cmxfZmFpbGYoKS4gVGhlIGtyYjQgYW5kIHRlbG5ldCBjb2RlIHdlcmUKICBhZmZlY3RlZC4KCi0gUGhpbGlwIEdsYWRzdG9uZSBmb3VuZCBhIGZldyBtb3JlIHByb2JsZW1zIHdpdGggNjQtYml0IGFyY2hzICh0aGUgNjQtYml0CiAgc3BhcmMgb24gc29sYXJpcyA4KS4KCi0gQWZ0ZXIgZGlzY3Vzc2lvbnMgb24gdGhlIGxpYmN1cmwgbGlzdCB3aXRoIFJhb3VsIENyaWRsaWcsIEkganVzdCBtYWRlIEZUUAogIHJlc3BvbnNlIGxpbmVzIGdldCBwYXNzZWQgdG8gdGhlIGhlYWRlciBjYWxsYmFjayBpZiBzdWNoIGEgb25lIGlzCiAgcmVnaXN0ZXJlZC4gSXQnbGwgbWFrZSBpdCBwb3NzaWJsZSBmb3IgYW55IGFwcGxpY2F0aW9uIHRvIGdldCBhbGwgdGhlCiAgcmVzcG9uc2VzIGFuIEZUUCBzZXJ2ZXIgc2VuZHMgdG8gbGliY3VybC4KCkRhbmllbCAoMyBKYW51YXJ5IDIwMDIpCi0gU3RlcmxpbmcgSHVnaGVzIGJyb3VnaHQgYSBmZXcgYnVja2V0cyBvZiBjb2RlLiBOb3csIGxpYmN1cmwgd2lsbAogIGF1dG9tYXRpY2FsbHkgY2FjaGUgRE5TIGxvb2t1cHMgYW5kIHJlLXVzZSB0aGUgcHJldmlvdXMgcmVzdWx0cyBmaXJzdCBpZiBhbnkKICBzdWNoIGlzIGF2YWlsYWJsZS4gSXQgZ3JlYXRseSBpbXByb3ZlcyBzcGVlZCB3aGVuIGRvaW5nIG1hbnkgcmVwZWF0ZWQKICBvcGVyYXRpb25zIHRvIHRoZSBzYW1lIGhvc3QuCgotIEFzIHRoZSB0ZXN0IGNhc2UgdXNlcyAtLWluY2x1ZGUgYW5kIHRoZW4gLS1oZWFkLCBJIGhhZCB0byBtb2RpZnkgc3JjL21haW4uYwogIHRvIGRlYWwgd2l0aCB0aGlzIHNpdHVhdGlvbiBzbGlnaHRseSBiZXR0ZXIgdGhhbiBwcmV2aW91c2x5LiBXaGVuIGRvbmUsIHdlCiAgaGF2ZSAxMDAlIGdvb2QgdGVzdHMgYWdhaW4gaW4gdGhlIG1haW4gYnJhbmNoLgoKRGFuaWVsICgyIEphbnVhcnkgMjAwMikKLSBNYWRlIHRlc3QgY2FzZSAyNSBydW4gYWdhaW4gaW4gdGhlIG11bHRpLWRldiBicmFuY2guIEJ1dCBpdCBzZWVtcyB0aGF0IHRoZQogIGNoYW5nZXMgZG9uZSBvbiBkZWMtMjAgbWFkZSB0ZXN0IGNhc2UgMTA0IGNlYXNlIHRvIHdvcmsgKGluIGJvdGggYnJhbmNoZXMpLgoKLSBQaGlsaXAgR2xhZHN0b25lIHBvaW50ZWQgb3V0IGEgZmV3IHBvcnRhYmlsaXR5IHByb2JsZW1zIGluIHRoZSBzb3VyY2UgY29kZQogIHRoYXQgZGlkbid0IGNvbXBpbGUgb24gNjQtYml0IHNwYXJjcyB1c2luZyBTdW4ncyBuYXRpdmUgY29tcGlsZXIuCg==