Transaction executed successfully

Transaction Details

Inspect execution, participants, message data, gas usage, events and raw transaction data.

Transaction hash
22C8B63EFB64EB0FF6526E13376C217C6C1F698B2D7A94454138D4E7C6DA28F5

Transaction overview

Status
Success
Execution completed
Block
#77257
Included in block
Message Type
m_addpkg
Primary message

Execution summary

TX INDEX
0
Position in block
GAS WANTED
48,337,560
Requested gas limit
GAS USED
40,281,330
Gas consumed
FEE
48338ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1q5tjjv3kkslzwf2na9y9wk7e5a8ugph8xfsk04

Execution log

msg:0,success:true,log:,events:[]

Events

No events emitted by this transaction.

Raw encoded transaction

CsipAgoML3ZtLm1fYWRkcGtnErapAgooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBKIqQIKBnJvdXRlchIZZ25vLmxhbmQvci9nbm9zd2FwL3JvdXRlchq9VQoJUkVBRE1FLm1kEq9VIyBSb3V0ZXIKClN3YXAgcm91dGluZyBlbmdpbmUgZm9yIG9wdGltYWwgdHJhZGUgZXhlY3V0aW9uIGFjcm9zcyBwb29scy4KCiMjIE92ZXJ2aWV3CgpSb3V0ZXIgaGFuZGxlcyBzd2FwIGV4ZWN1dGlvbiBhY3Jvc3MgbXVsdGlwbGUgcG9vbHMsIGZpbmRpbmcgb3B0aW1hbCBwYXRocyBhbmQgbWFuYWdpbmcgc2xpcHBhZ2UgcHJvdGVjdGlvbiBmb3IgdHJhZGVycy4KCiMjIEdub3dlYgoKVGhlIHJvb3QgYFJlbmRlcigiIilgIGRlbGVnYXRlcyB0byB0aGUgYWN0aXZlIGltcGxlbWVudGF0aW9uLiBJdCBleHBvc2VzIHNlcGFyYXRlCnN0YXR1cyBhbmQgcmVhZC1vbmx5IHN3YXAtZmVlIHNlY3Rpb25zLiBOYXRpdmUgR25vd2ViIGV4ZWN1dGlvbiBmb3JtcyBzaG93Cm9uZSB1c2VyLWZhY2luZyBzd2FwIGFjdGlvbiBwZXIgcGFnZToKCi0gYCIiYDogYEV4YWN0SW5TaW5nbGVTd2FwUm91dGVgCi0gYCJzd2FwL2V4YWN0LWluImA6IGBFeGFjdEluU3dhcFJvdXRlYAotIGAic3dhcC9leGFjdC1vdXQtc2luZ2xlImA6IGBFeGFjdE91dFNpbmdsZVN3YXBSb3V0ZWAKLSBgInN3YXAvZXhhY3Qtb3V0ImA6IGBFeGFjdE91dFN3YXBSb3V0ZWAKCklucHV0IHBsYWNlaG9sZGVycyBzaG93IHRva2VuLWtleSwgcm91dGUsIGFuZCBwZXJjZW50YWdlIGV4YW1wbGVzIHdpdGhvdXQKc2VwYXJhdGUgZXhwbGFuYXRvcnkgcGFyYWdyYXBocy4gVG9rZW4gYW1vdW50cyBhcmUgaW50ZWdlciBiYXNlIHVuaXRzLgpTZXQgYGFtb3VudE91dE1pbmAgb3IgYGFtb3VudEluTWF4YCBmb3Igc2xpcHBhZ2UKcHJvdGVjdGlvbiwgdXNlIGEgZnV0dXJlIFVuaXggYGRlYWRsaW5lYCwgYW5kIHNldCBtdWx0aS1yb3V0ZSBgcXVvdGVBcnJgCnBlcmNlbnRhZ2VzIHRvIHN1bSB0byAxMDAuIEFwcHJvdmUgZWFjaCBpbnB1dCBHUkMyMCB0b2tlbiBmb3IgdGhlIHJvdXRlciByZWFsbQpiZWZvcmUgc3dhcHBpbmcuIFRoZSBzaW5nbGUtcm91dGUgcHJpY2UgbGltaXQgYWNjZXB0cyBgc3FydFByaWNlTGltaXRYOTZgIGFzIGEKYmFzZS0xMCBRNjQuOTYgc3F1YXJlLXJvb3QgcHJpY2U7IGAwYCBkaXNhYmxlcyBpdC4KCk5vIHByaXZpbGVnZWQgZmVlLXNldHRpbmcgZm9ybSwgZ3VpZGFuY2Ugcm91dGUsIG9yIG5hdmlnYXRpb24gbGluayBpcyBleHBvc2VkLgpgU2V0U3dhcEZlZWAgaXRzZWxmIGlzIHVuY2hhbmdlZC4gTm8gaW50ZXJuYWwgY2FsbGJhY2sgZm9ybSBpcyBleHBvc2VkLgpVbnN1cHBvcnRlZCByZW5kZXIgcGF0aHMsIGluY2x1ZGluZyBgImZlZSJgLCByZXR1cm4gYDQwNGAuCgojIyBDb25maWd1cmF0aW9uCgotICoqUm91dGVyIEZlZSoqOiAxNSBicHMgKDAuMTUlKSBieSBkZWZhdWx0IG9uIG91dHB1dCB0b2tlbnM7IGNvbmZpZ3VyYWJsZSBieQogIGFkbWluL2dvdmVybmFuY2UgZnJvbSAwIHRocm91Z2ggMTAwMCBicHMgKDDigJMxMCUpCi0gKipNYXggSG9wcyoqOiAzIHBvb2xzIHBlciByb3V0ZQotICoqRGVhZGxpbmUgQnVmZmVyKio6IDUtMzAgbWludXRlcyByZWNvbW1lbmRlZCBmb3IgbGl2ZSBzd2FwcwoKIyMgQ29yZSBGdW5jdGlvbnMKCiMjIyBgRXhhY3RJblN3YXBSb3V0ZWAKClN3YXBzIGFuIGV4YWN0IGlucHV0IGFtb3VudCBmb3Igb3V0cHV0LCBzdWJqZWN0IHRvIGEgbWluaW11bSBuZXQgb3V0cHV0LgoKLSBGaXhlZCBpbnB1dCwgdmFyaWFibGUgb3V0cHV0Ci0gVGhlIHJldHVybmVkIG91dHB1dCBpcyBhZnRlciB0aGUgcm91dGVyIGZlZQotIFJldmVydHMgaWYgb3V0cHV0IDwgYW1vdW50T3V0TWluCi0gU3VwcG9ydHMgbXVsdGktaG9wIHJvdXRpbmcKCiMjIyBgRXhhY3RPdXRTd2FwUm91dGVgCgpTd2FwcyBmb3IgYSByZXF1ZXN0ZWQgZmluYWwgdXNlciBvdXRwdXQgYW1vdW50IHdpdGggbWF4aW11bSBpbnB1dC4gVGhlCmBhbW91bnRPdXRgIHRhcmdldCBpcyBwb3N0LXJvdXRlci1mZWU6IHRoZSByb3V0ZXIgcmVxdWVzdHMgdGhlIGNvcnJlc3BvbmRpbmcKZ3Jvc3MgcG9vbCBvdXRwdXQsIGRlZHVjdHMgdGhlIGZlZSwgdGhlbiB2YWxpZGF0ZXMgYW5kIHRyYW5zZmVycyB0aGUgbmV0IG91dHB1dC4KCi0gV2l0aCBubyBzaW5nbGUtaG9wIHByaWNlIGxpbWl0LCB0YXJnZXRzIHRoZSByZXF1ZXN0ZWQgcG9zdC1mZWUgb3V0cHV0IHdpdGhpbgogIHRoZSBpbXBsZW1lbnRhdGlvbidzIHNtYWxsIHBlci1ob3Agcm91bmRpbmcgdG9sZXJhbmNlCi0gQSBub256ZXJvIHNpbmdsZS1ob3AgcHJpY2UgbGltaXQgbWF5IHN0b3AgZWFybHkgYW5kIHJldHVybiBhIHBhcnRpYWwgb3V0cHV0Ci0gUmV2ZXJ0cyBpZiBpbnB1dCA+IGFtb3VudEluTWF4Ci0gQ2FsY3VsYXRlcyBwYXRoIGJhY2t3YXJkcwoKIyMjIGBEcnlTd2FwUm91dGVgCgpTaW11bGF0ZXMgYSBzd2FwIHdpdGhvdXQgZXhlY3V0aW9uLgoKLSBGcm9udGVuZCBwcmljZSBxdW90ZXMKLSBTbGlwcGFnZSBjYWxjdWxhdGlvbgotIFBhdGggdmFsaWRhdGlvbgotIE5vIGRlYWRsaW5lIGNoZWNrIG9yIHRva2VuIHRyYW5zZmVyCgojIyBUZWNobmljYWwgRGV0YWlscwoKIyMjIFJvdXRlIEZvcm1hdCB2cyBQb29sIEZvcm1hdCAtIElNUE9SVEFOVCBESVNUSU5DVElPTgoKIyMjIyBSb3V0ZSBGb3JtYXQgKFN3YXAgRGlyZWN0aW9uKQoKUm91dGVzIGluIHRoZSByb3V0ZXIgZm9sbG93ICoqc3dhcCBkaXJlY3Rpb24gb3JkZXJpbmcqKjogYHRva2VuSW46dG9rZW5PdXQ6ZmVlYAoKLSBGaXJzdCB0b2tlbiA9IElucHV0IHRva2VuICh3aGF0IHlvdSdyZSBzd2FwcGluZyBGUk9NKQotIFNlY29uZCB0b2tlbiA9IE91dHB1dCB0b2tlbiAod2hhdCB5b3UncmUgc3dhcHBpbmcgVE8pCi0gVGhpcyByZXByZXNlbnRzIHRoZSBhY3R1YWwgZmxvdyBvZiB0aGUgc3dhcAoKRXhhbXBsZSBmb3Igc3dhcHBpbmcgR05TIHRvIFdVR05PVDoKCmBgYApnbm8ubGFuZC9yL2dub3N3YXAvZ25zLkdOUzpnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdDozMDAwCmBgYAoKIyMjIyBQb29sIEZvcm1hdCAoQWxwaGFiZXRpY2FsKQoKUG9vbHMgYXJlIGlkZW50aWZpZWQgdXNpbmcgKiphbHBoYWJldGljYWwgb3JkZXJpbmcqKjogYHRva2VuMDp0b2tlbjE6ZmVlYAoKLSB0b2tlbjAgPCB0b2tlbjEgKGxleGljb2dyYXBoaWNhbGx5IHNvcnRlZCkKLSBUaGlzIGlzIHRoZSBjYW5vbmljYWwgcG9vbCBpZGVudGlmaWVyCgpFeGFtcGxlIHBvb2wgaWRlbnRpZmllciAoc2FtZSBwb29sIGFzIGFib3ZlKToKCmBgYApnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdDpnbm8ubGFuZC9yL2dub3N3YXAvZ25zLkdOUzozMDAwICAjIGdub2xhbmQvd3Vnbm90IDwgZ25vc3dhcC9nbnMgYWxwaGFiZXRpY2FsbHkKYGBgCgojIyMjIEtleSBEaWZmZXJlbmNlCgotICoqUm91dGVyIHJvdXRlcyoqOiBGb2xsb3cgeW91ciBzd2FwIGRpcmVjdGlvbiAoQkFS4oaSQkFaIG1lYW5zIGJhcjpiYXogaW4gcm91dGUpCi0gKipQb29sIGlkZW50aWZpZXJzKio6IEFsd2F5cyBhbHBoYWJldGljYWxseSBzb3J0ZWQgKG1pZ2h0IGJlIGJhcjpiYXogb3IgYmF6OmJhcikKLSBUaGUgcm91dGVyIGF1dG9tYXRpY2FsbHkgaGFuZGxlcyB0aGUgY29udmVyc2lvbiBiZXR3ZWVuIHRoZXNlIGZvcm1hdHMKCiMjIyMgTmF0aXZlIFRva2VuIFJvdXRlIFNwZWNpZmljYXRpb24KCioqSU1QT1JUQU5UKio6IFJvdXRlciBzd2FwIGZ1bmN0aW9ucyBkbyAqKm5vdCoqIGFjY2VwdCBuYXRpdmUgYHVnbm90YCBkaXJlY3RseS4KCi0gKipUb2tlbiBQYXJhbWV0ZXJzKio6IFVzZSB0b2tlbiBrZXlzIChgcGtnUGF0aC5TWU1CT0xgKSBzdWNoIGFzIGAiZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3QiYAotICoqUm91dGUgUGF0aHMqKjogQWxzbyB1c2UgdG9rZW4ga2V5cyAoYHBrZ1BhdGguU1lNQk9MYCkgc3VjaCBhcyBgImduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90ImAKClRoaXMgbWF0Y2hlcyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbjoKCi0gUG9vbHMgb3BlcmF0ZSBvbiB0b2tlbiBjb250cmFjdCBwYXRocywgaW5jbHVkaW5nIHdyYXBwZWQgR05PVCAoYHd1Z25vdGApCi0gUm91dGVyIHN3YXAgZW50cnlwb2ludHMgcmVqZWN0IG5hdGl2ZS1jb2luIGhhbmRsaW5nCi0gTmF0aXZlLXRva2VuIHJlZnVuZCBhbmQgdW53cmFwIGZsb3dzIGFyZSBub3QgcGFydCBvZiB0aGUgY3VycmVudCByb3V0ZXIgaW1wbGVtZW50YXRpb24KCiMjIyMgUm91dGUgU3RyaW5nIEZvcm1hdAoKU2luZ2xlLWhvcCBmb3JtYXQ6CgpgYGAKdG9rZW5Jbjp0b2tlbk91dDpmZWUKYGBgCgpNdWx0aS1ob3AgZm9ybWF0ICh1c2luZyBfUE9PTF8gc2VwYXJhdG9yKToKCmBgYAp0b2tlbkluOnRva2VuQjpmZWUxKlBPT0wqdG9rZW5COnRva2VuQzpmZWUyKlBPT0wqdG9rZW5DOnRva2VuT3V0OmZlZTMKYGBgCgpTaW5nbGUtaG9wIGV4YW1wbGU6CgpgYGAKIyBTd2FwcGluZyBHTlMgdG8gV1VHTk9UClJvdXRlOiBnbm8ubGFuZC9yL2dub3N3YXAvZ25zLkdOUzpnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdDozMDAwCiMgUm91dGVyIGludGVycHJldHM6IHRva2VuSW49Z25zLCB0b2tlbk91dD13dWdub3QsIGZlZT0zMDAwCmBgYAoKTXVsdGktaG9wIGV4YW1wbGUgKEdOUyDihpIgV1VHTk9UIOKGkiBUT0tFTl9DKToKCmBgYAojIEVhY2ggc2VnbWVudCBmb2xsb3dzIHN3YXAgZGlyZWN0aW9uLCBjb25uZWN0ZWQgYnkgKlBPT0wqCmduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOmduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90OjMwMDAqUE9PTCpnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdDpnbm8ubGFuZC9yLzxuYW1lc3BhY2U+L3Rva2VuX2MuVE9LRU5fQzo1MDAKYGBgCgojIyMgUXVvdGUgRGlzdHJpYnV0aW9uCgpTcGxpdCBsYXJnZSB0cmFkZXMgYWNyb3NzIHJvdXRlcyB0byBtaW5pbWl6ZSBpbXBhY3Q6CgotIGBxdW90ZUFycmA6IHBvc2l0aXZlIHBlcmNlbnRhZ2UgcGVyIHJvdXRlLCB3aXRoIG9uZSBxdW90ZSBmb3IgZWFjaCByb3V0ZQotIFF1b3RlcyBtdXN0IHN1bSB0byAxMDA7IGF0IG1vc3QgNyByb3V0ZXMgYXJlIGFjY2VwdGVkCi0gRXhhbXBsZTogIjMwLDcwIiA9IDMwJSByb3V0ZTEsIDcwJSByb3V0ZTIKCiMjIyBOYXRpdmUgVG9rZW4gSGFuZGxpbmcKClRoZSBjdXJyZW50IHJvdXRlciBpbXBsZW1lbnRhdGlvbiBkb2VzICoqbm90KiogaGFuZGxlIG5hdGl2ZSBgdWdub3RgIGRpcmVjdGx5LiBJdCByZWplY3RzIG5hdGl2ZS1jb2luIGhhbmRsaW5nIGFuZCByb3V0ZXMgc3dhcHMgb25seSB0aHJvdWdoIHRva2VuIGtleXMgKGBwa2dQYXRoLlNZTUJPTGApIHN1Y2ggYXMgd3JhcHBlZCBHTk9UIChgd3Vnbm90YCkuCgojIyMjIFRva2VuIElkZW50aWZpZXIgUmVxdWlyZW1lbnRzCgotIFVzZSB0b2tlbiBrZXlzIChgcGtnUGF0aC5TWU1CT0xgKSBzdWNoIGFzIGBnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdGAgZm9yIGJvdGggaW5wdXRzL291dHB1dHMgYW5kIHJvdXRlIHNwZWNpZmljYXRpb25zLgotIERvIG5vdCBwYXNzIGAidWdub3QiYCBhcyBgaW5wdXRUb2tlbmAgb3IgYG91dHB1dFRva2VuYCB0byByb3V0ZXIgc3dhcCBmdW5jdGlvbnMuCgojIyMjIEFwcHJvdmFsIGFuZCBUcmFuc2ZlciBSZXF1aXJlbWVudHMKCi0gQXBwcm92ZSB0aGUgcm91dGVyIHRvIHNwZW5kIHRoZSB0b2tlbiBjb250cmFjdCB5b3UgYXJlIHN3YXBwaW5nIGZyb20uCi0gSWYgeW91IHdhbnQgd3JhcHBlZCBHTk9UIGV4cG9zdXJlLCB1c2UgdGhlIGB3dWdub3RgIHRva2VuIGNvbnRyYWN0IHBhdGggZGlyZWN0bHkuCi0gTmF0aXZlLXRva2VuIHJlZnVuZCBhbmQgdW53cmFwIGZsb3dzIGFyZSBub3QgcGFydCBvZiB0aGUgY3VycmVudCByb3V0ZXIgaW1wbGVtZW50YXRpb24uCgojIyMjIEV4YW1wbGUgd2l0aCBXcmFwcGVkIEdOT1QKCkV4YW1wbGVzIGluIHRoaXMgZG9jdW1lbnQgY2FsbCB0aGUgcHVibGljIGRvbWFpbiBwcm94eSBmcm9tIGEgcmVhbG0gZnVuY3Rpb24gd2l0aCBhIGN1cnJlbnQgYGN1cmAgdG9rZW4uCkltcG9ydCB0aGUgcHJveHkgcGFja2FnZSBhbmQgcXVhbGlmeSBpdHMgZnVuY3Rpb24gbmFtZXMgaW4gaW50ZWdyYXRpbmcgY29kZS4KCmBgYGdvCi8vIDEuIEFwcHJvdmUgV1VHTk9UIHNwZW5kaW5nIGZvciB0aGUgcm91dGVyCnd1Z25vdC5BcHByb3ZlKGNyb3NzKGN1ciksIHJvdXRlckFkZHJlc3MsIDEwMDAwMDApCgovLyAyLiBDYWxsIHN3YXAgZnVuY3Rpb24gd2l0aCB3cmFwcGVkIEdOT1QgcGF0aHMKYW1vdW50SW4sIGFtb3VudE91dCA6PSBFeGFjdEluU3dhcFJvdXRlKAogICAgY3Jvc3MoY3VyKSwKICAgICJnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdCIsICAgICAgIC8vIGlucHV0IHRva2VuCiAgICAiZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlMiLCAgICAgICAgICAgICAvLyBvdXRwdXQgdG9rZW4KICAgICIxMDAwMDAwIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFtb3VudCBpbiB3cmFwcGVkIHRva2VuIHVuaXRzCiAgICAiZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3Q6Z25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlM6MzAwMCIsCiAgICAiMTAwIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxMDAlIHRocm91Z2ggcm91dGUKICAgICI5NTAwMDAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pbiBvdXRwdXQKICAgIHRpbWUuTm93KCkuVW5peCgpICsgMzAwLCAgICAgICAgICAgICAgICAgIC8vIGRlYWRsaW5lCiAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZWZlcnJlcgopCmBgYAoKRm9yIGxpdmUgbGlxdWlkaXR5LWNoYW5naW5nIHN3YXBzOgoKLSBTZXQgYGFtb3VudE91dE1pbiA9IGV4cGVjdGVkICogKDEgLSBzbGlwcGFnZSUpYAotIDAuNS0xJSBmb3Igc3RhYmxlIHBhaXJzCi0gMS0zJSBmb3Igdm9sYXRpbGUgcGFpcnMKLSBSZXZlcnRzIGlmIHRoZSBuZXQgb3V0cHV0IGlzIGJlbG93IHRoZSBtaW5pbXVtCgojIyBVc2FnZQoKIyMjIEJhc2ljIFRva2VuIFN3YXBzCgpgYGBnbwovLyBTaW1wbGUgZXhhY3QgaW5wdXQgc3dhcAphbW91bnRJbiwgYW1vdW50T3V0IDo9IEV4YWN0SW5Td2FwUm91dGUoCiAgICBjcm9zcyhjdXIpLAogICAgImduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TIiwgICAgICAgLy8gaW5wdXQgdG9rZW4KICAgICJnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdCIsIC8vIG91dHB1dCB0b2tlbgogICAgIjEwMDAwMDAiLCAgICAgICAgICAgICAgICAgLy8gYW1vdW50ICg2IGRlY2ltYWxzKQogICAgImduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOmduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90OjMwMDAiLCAvLyByb3V0ZQogICAgIjEwMCIsICAgICAgICAgICAgICAgICAgICAgLy8gMTAwJSB0aHJvdWdoIHJvdXRlCiAgICAiOTUwMDAwIiwgICAgICAgICAgICAgICAgICAvLyBtaW4gb3V0cHV0CiAgICB0aW1lLk5vdygpLlVuaXgoKSArIDMwMCwgICAvLyBkZWFkbGluZQogICAgImcxcmVmZXJyZXIuLi4iLCAgICAgICAgICAgLy8gcmVmZXJyYWwKKQoKLy8gTXVsdGktaG9wIHN3YXAKRXhhY3RJblN3YXBSb3V0ZSgKICAgIGNyb3NzKGN1ciksCiAgICAiZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlMiLAogICAgImduby5sYW5kL3IvPG5hbWVzcGFjZT4vdG9rZW5fYy5UT0tFTl9DIiwKICAgICIxMDAwMDAwIiwKICAgICJnbm8ubGFuZC9yL2dub3N3YXAvZ25zLkdOUzpnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdDozMDAwKlBPT0wqZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3Q6Z25vLmxhbmQvci88bmFtZXNwYWNlPi90b2tlbl9jLlRPS0VOX0M6MzAwMCIsCiAgICAiMTAwIiwKICAgICI5MDAwMDAiLAogICAgZGVhZGxpbmUsCiAgICAiIiwKKQoKLy8gU3BsaXQgcm91dGUgZm9yIGxhcmdlIHRyYWRlcwpFeGFjdEluU3dhcFJvdXRlKAogICAgY3Jvc3MoY3VyKSwKICAgICJnbm8ubGFuZC9yL2dub3N3YXAvZ25zLkdOUyIsCiAgICAiZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3QiLAogICAgIjEwMDAwMDAwMDAwIiwKICAgICJnbm8ubGFuZC9yL2dub3N3YXAvZ25zLkdOUzpnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdDo1MDAsZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlM6Z25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3Q6MzAwMCIsCiAgICAiNjAsNDAiLCAgLy8gNjAlIHRocm91Z2ggMC4wNSUsIDQwJSB0aHJvdWdoIDAuMyUKICAgICI5NTAwMDAwMDAwIiwKICAgIGRlYWRsaW5lLAogICAgIiIsCikKYGBgCgpTaW5nbGUtaG9wIGZ1bmN0aW9ucyBzdXBwb3J0IHBhcnRpYWwgZXhlY3V0aW9uIHRocm91Z2ggYSBub256ZXJvCmBzcXJ0UHJpY2VMaW1pdFg5NmA6CgpgYGBnbwovLyBQYXJ0aWFsIHN3YXAgd2l0aCBwcmljZSBsaW1pdCAtIG1heSBub3QgY29uc3VtZSBmdWxsIGlucHV0IGFtb3VudAphbW91bnRJbiwgYW1vdW50T3V0IDo9IEV4YWN0SW5TaW5nbGVTd2FwUm91dGUoCiAgICBjcm9zcyhjdXIpLAogICAgImduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TIiwgICAgICAgLy8gaW5wdXQgdG9rZW4KICAgICJnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdCIsIC8vIG91dHB1dCB0b2tlbgogICAgIjEwMDAwMDAiLCAgICAgICAgICAgICAgICAgLy8gbWF4IGFtb3VudCB0byBzd2FwCiAgICAiZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlM6Z25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3Q6MzAwMCIsIC8vIHNpbmdsZSByb3V0ZQogICAgIjk1MDAwMCIsICAgICAgICAgICAgICAgICAgLy8gbWluIG91dHB1dAogICAgIjEwMDAwMDAwMDAwMDAwMDAwMDAiLCAgICAgLy8gc3FydFByaWNlTGltaXRYOTYgKHByaWNlIGxpbWl0KQogICAgZGVhZGxpbmUsCiAgICAiIiwKKQovLyBJZiB0aGUgcHJpY2UgbGltaXQgaXMgcmVhY2hlZCwgb25seSBhIHBhcnRpYWwgYW1vdW50IGlzIHN3YXBwZWQuIEZvciBleGFjdC1pbgovLyB0aGlzIGNhbiBjb25zdW1lIGxlc3MgaW5wdXQ7IGV4YWN0LW91dCBjYW4gZGVsaXZlciBsZXNzIHRoYW4gaXRzIHRhcmdldC4KLy8gYW1vdW50T3V0TWluIG9yIGFtb3VudEluTWF4IHJlbWFpbnMgZW5mb3JjZWQsIHJlc3BlY3RpdmVseS4KYGBgCgojIyBJbXBvcnRhbnQgRGV2ZWxvcGVyIE5vdGVzCgojIyMgQ29tbW9uIEludGVncmF0aW9uIFBpdGZhbGxzCgoxLiAqKk5hdGl2ZSBUb2tlbiBBc3N1bXB0aW9ucyoqOiBQYXNzaW5nIGAidWdub3QiYCB0byByb3V0ZXIgc3dhcCBmdW5jdGlvbnMgd2lsbCBmYWlsIGJlY2F1c2Ugcm91dGVyIGVudHJ5cG9pbnRzIHJlamVjdCBuYXRpdmUtY29pbiBoYW5kbGluZy4KCjIuICoqUm91dGUgdnMgVG9rZW4gSWRlbnRpZmllciBDb25mdXNpb24qKjogVXNpbmcgYCJ1Z25vdCJgIGluIHJvdXRlIHN0cmluZ3MgaW5zdGVhZCBvZiBgImduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90ImAgd2lsbCBjYXVzZSB0cmFuc2FjdGlvbnMgdG8gZmFpbCBzaW5jZSBubyBwb29scyBleGlzdCBmb3IgdGhlIGAidWdub3QiYCBpZGVudGlmaWVyLgoKMy4gKipXcm9uZyBUb2tlbiBQYXRoKio6CgogICAtIFVzZSBgZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3RgIHdoZW4gc3dhcHBpbmcgd3JhcHBlZCBHTk9UCiAgIC0gRG8gbm90IHBhc3MgbmF0aXZlIGB1Z25vdGAgdG8gcm91dGVyIHN3YXAgZnVuY3Rpb25zCiAgIC0gUm91dGUgc3RyaW5ncyBtdXN0IHN0YXkgaW4gc3dhcC1kaXJlY3Rpb24gb3JkZXIgYW5kIHVzZSB0b2tlbiBjb250cmFjdCBwYXRocwoKIyMjIEZyb250ZW5kIEludGVncmF0aW9uIENoZWNrbGlzdAoKLSBbIF0gSW1wbGVtZW50IFdVR05PVCBhcHByb3ZhbCBiZWZvcmUgd3JhcHBlZC1HTk9UIHN3YXBzCi0gWyBdIFVzZSB0b2tlbiBrZXlzIChgcGtnUGF0aC5TWU1CT0xgKSBzdWNoIGFzIGAiZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3QiYCBmb3IgYm90aCBwYXJhbWV0ZXJzIGFuZCByb3V0ZXMKLSBbIF0gVGVzdCBib3RoIHBhcnRpYWwgYW5kIGZ1bGwgc3dhcCBzY2VuYXJpb3MKLSBbIF0gSW1wbGVtZW50IHByb3BlciBlcnJvciBoYW5kbGluZyBmb3IgZmFpbGVkIGFwcHJvdmFscwoKQm90aCBzaW5nbGUtaG9wIGZ1bmN0aW9ucyBzdXBwb3J0IHBhcnRpYWwgZXhlY3V0aW9uIHdoZW4KYHNxcnRQcmljZUxpbWl0WDk2YCBpcyBub256ZXJvOgoKLSBFeGFjdC1pbiBtYXkgY29uc3VtZSBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCBpbnB1dCBhbW91bnQKLSBFeGFjdC1vdXQgbWF5IGRlbGl2ZXIgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgcG9zdC1mZWUgb3V0cHV0Ci0gVGhlIHJlbGV2YW50IGFtb3VudCBsaW1pdCAoYGFtb3VudE91dE1pbmAgb3IgYGFtb3VudEluTWF4YCkgc3RpbGwgYXBwbGllcwotIFJlbWFpbmluZyBpbnB1dCB0b2tlbnMgc3RheSB3aXRoIHRoZSB1c2VyIGJlY2F1c2UgdGhlIHJvdXRlciB1c2VzIHRva2VuCiAgY29udHJhY3QgdHJhbnNmZXJzCi0gQSB6ZXJvIGxpbWl0IHVzZXMgdGhlIGdsb2JhbCB0aWNrLW1hdGggYm91bmRhcnkgYW5kIHByZXNlcnZlcyBmdWxsIGV4YWN0CiAgc2VtYW50aWNzCgojIyBTZWN1cml0eQoKLSBQYXRoIHZhbGlkYXRpb24gY2hlY2tzIHN5bnRheCwgZW5kcG9pbnRzLCBob3AgY29udGludWl0eSwgYW5kIHBvb2wgZXhpc3RlbmNlOwogIGl0IGRvZXMgbm90IHJlamVjdCBjaXJjdWxhciByb3V0ZXMKLSBEZWFkbGluZSBwcmV2ZW50cyBzdGFsZSBsaXZlIHRyYW5zYWN0aW9ucwotIFNsaXBwYWdlIGxpbWl0cyBwcm90ZWN0IGFnYWluc3QgdW5mYXZvcmFibGUgZXhlY3V0aW9uCi0gVGhlIHJvdXRlciBmZWUgcmF0ZSBpcyBjb25maWd1cmFibGU7IHRoZSBjdXJyZW50IHJhdGUgaXMgZml4ZWQgZHVyaW5nIG9uZQogIGV4ZWN1dGlvbgotIFdVR05PVCBhcHByb3ZhbCByZXF1aXJlbWVudCBwcmV2ZW50cyB1bmF1dGhvcml6ZWQgdG9rZW4gdHJhbnNmZXJzChqBBgoHZG9jLmdubxL1BS8vIFBhY2thZ2Ugcm91dGVyIHByb3ZpZGVzIHN3YXAgcm91dGluZyBhbmQgZXhlY3V0aW9uIGFjcm9zcyBHbm9Td2FwIGxpcXVpZGl0eSBwb29scy4KLy8KLy8gUm91dGVyIGRvbWFpbiBwcm94eSBmb3Igc2luZ2xlLWhvcCBhbmQgbXVsdGktaG9wIGV4YWN0LWluLCBleGFjdC1vdXQsIGFuZAovLyBkcnktcm91dGUgb3BlcmF0aW9ucy4KLy8KLy8gTGl2ZSBleGFjdC1pbiBhbmQgZXhhY3Qtb3V0IGNhbGxzIHZhbGlkYXRlIGEgZGVhZGxpbmUgYW5kIHRoZSBjb3JyZXNwb25kaW5nCi8vIGFtb3VudCBsaW1pdCAobWluaW11bSBvdXRwdXQgb3IgbWF4aW11bSBpbnB1dCkuIERyeVN3YXBSb3V0ZSBpcyBhIHJlYWQtb25seQovLyBxdW90ZSBwYXRoIHdpdGggbm8gZGVhZGxpbmUgb3IgdG9rZW4gdHJhbnNmZXIuCi8vCi8vIFRoZSByb3V0ZXIgZmVlIGlzIGNoYXJnZWQgb24gb3V0cHV0IHRva2Vucy4gSXQgZGVmYXVsdHMgdG8gMTUgYnBzICgwLjE1JSkKLy8gYW5kIGlzIGNvbmZpZ3VyYWJsZSBieSBhZG1pbi9nb3Zlcm5hbmNlIGZyb20gMCB0aHJvdWdoIDEwMDAgYnBzICgw4oCTMTAlKTsKLy8gdGhlIGN1cnJlbnQgcmF0ZSBpcyBmaXhlZCBmb3IgZWFjaCBpbmRpdmlkdWFsIGV4ZWN1dGlvbi4KLy8KLy8gVGhlIHJvdXRlciBhY3RzIGFzIGEgcHJveHkgdG8gdmVyc2lvbi1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMsCi8vIGN1cnJlbnRseSByb3V0aW5nIHRvIHYxIGZvciBhbGwgc3dhcCBvcGVyYXRpb25zLgpwYWNrYWdlIHJvdXRlcgoawQIKEGdldHRlcl91dGlscy5nbm8SrAJwYWNrYWdlIHJvdXRlcgoKLy8gY2xvbmVTdHJpbmdJbnQ2NE1hcCByZXR1cm5zIGEgY29weSBzbyBjYWxsZXJzIGNhbm5vdCByZWFjaCB0aGUgc3RvcmVkIG1hcC4KZnVuYyBjbG9uZVN0cmluZ0ludDY0TWFwKHNyYyBtYXBbc3RyaW5nXWludDY0KSBtYXBbc3RyaW5nXWludDY0IHsKCWlmIHNyYyA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCgljbG9uZWQgOj0gbWFrZShtYXBbc3RyaW5nXWludDY0LCBsZW4oc3JjKSkKCWZvciBrLCB2IDo9IHJhbmdlIHNyYyB7CgkJY2xvbmVkW2tdID0gdgoJfQoKCXJldHVybiBjbG9uZWQKfQoaPwoLZ25vbW9kLnRvbWwSMG1vZHVsZSA9ICJnbm8ubGFuZC9yL2dub3N3YXAvcm91dGVyIgpnbm8gPSAiMC45IhrfNAoJcHJveHkuZ25vEtE0cGFja2FnZSByb3V0ZXIKCi8vIEV4YWN0SW5Td2FwUm91dGUgZXhlY3V0ZXMgYSBtdWx0aS1ob3Agc3dhcCBmb3IgYW4gZXhhY3QgaW5wdXQgYW1vdW50LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0KLy8gICAtIGlucHV0VG9rZW46IGlucHV0IHRva2VuIHBhdGgKLy8gICAtIG91dHB1dFRva2VuOiBvdXRwdXQgdG9rZW4gcGF0aAovLyAgIC0gYW1vdW50SW46IGV4YWN0IGlucHV0IGFtb3VudAovLyAgIC0gcm91dGVBcnI6IGVuY29kZWQgcm91dGUKLy8gICAtIHF1b3RlQXJyOiBlbmNvZGVkIHF1b3RlcwovLyAgIC0gYW1vdW50T3V0TWluOiBtaW5pbXVtIG91dHB1dCBhbW91bnQKLy8gICAtIGRlYWRsaW5lOiB0cmFuc2FjdGlvbiBkZWFkbGluZQovLyAgIC0gcmVmZXJyZXI6IHJlZmVycmFsIGFkZHJlc3MKLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudEluOiBpbnB1dCBhbW91bnQgY29uc3VtZWQKLy8gICAtIGFtb3VudE91dDogbmV0IG91dHB1dCBhbW91bnQgZGVsaXZlcmVkIGFmdGVyIHRoZSByb3V0ZXIgZmVlCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFJvdXRlciBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBFeGFjdEluU3dhcFJvdXRlKGN1ciByZWFsbSwgaW5wdXRUb2tlbiBzdHJpbmcsIG91dHB1dFRva2VuIHN0cmluZywgYW1vdW50SW4gc3RyaW5nLCByb3V0ZUFyciBzdHJpbmcsIHF1b3RlQXJyIHN0cmluZywgYW1vdW50T3V0TWluIHN0cmluZywgZGVhZGxpbmUgaW50NjQsIHJlZmVycmVyIHN0cmluZykgKHN0cmluZywgc3RyaW5nKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5FeGFjdEluU3dhcFJvdXRlKDAsIGN1ciwgaW5wdXRUb2tlbiwgb3V0cHV0VG9rZW4sIGFtb3VudEluLCByb3V0ZUFyciwgcXVvdGVBcnIsIGFtb3VudE91dE1pbiwgZGVhZGxpbmUsIHJlZmVycmVyKQp9CgovLyBFeGFjdEluU2luZ2xlU3dhcFJvdXRlIGV4ZWN1dGVzIGEgc2luZ2xlLWhvcCBzd2FwIGZvciBhbiBleGFjdCBpbnB1dCBhbW91bnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IGN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbQovLyAgIC0gaW5wdXRUb2tlbjogaW5wdXQgdG9rZW4gcGF0aAovLyAgIC0gb3V0cHV0VG9rZW46IG91dHB1dCB0b2tlbiBwYXRoCi8vICAgLSBhbW91bnRJbjogZXhhY3QgaW5wdXQgYW1vdW50Ci8vICAgLSByb3V0ZUFycjogZW5jb2RlZCByb3V0ZQovLyAgIC0gYW1vdW50T3V0TWluOiBtaW5pbXVtIG91dHB1dCBhbW91bnQKLy8gICAtIHNxcnRQcmljZUxpbWl0WDk2OiBRNjQuOTYgcHJpY2UgbGltaXQKLy8gICAtIGRlYWRsaW5lOiB0cmFuc2FjdGlvbiBkZWFkbGluZQovLyAgIC0gcmVmZXJyZXI6IHJlZmVycmFsIGFkZHJlc3MKLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudEluOiBpbnB1dCBhbW91bnQgY29uc3VtZWQgKGEgbm9uemVybyBwcmljZSBsaW1pdCBtYXkgc3RvcCBlYXJseSkKLy8gICAtIGFtb3VudE91dDogbmV0IG91dHB1dCBhbW91bnQgZGVsaXZlcmVkIGFmdGVyIHRoZSByb3V0ZXIgZmVlCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFJvdXRlciBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBFeGFjdEluU2luZ2xlU3dhcFJvdXRlKGN1ciByZWFsbSwgaW5wdXRUb2tlbiBzdHJpbmcsIG91dHB1dFRva2VuIHN0cmluZywgYW1vdW50SW4gc3RyaW5nLCByb3V0ZUFyciBzdHJpbmcsIGFtb3VudE91dE1pbiBzdHJpbmcsIHNxcnRQcmljZUxpbWl0WDk2IHN0cmluZywgZGVhZGxpbmUgaW50NjQsIHJlZmVycmVyIHN0cmluZykgKHN0cmluZywgc3RyaW5nKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5FeGFjdEluU2luZ2xlU3dhcFJvdXRlKDAsIGN1ciwgaW5wdXRUb2tlbiwgb3V0cHV0VG9rZW4sIGFtb3VudEluLCByb3V0ZUFyciwgYW1vdW50T3V0TWluLCBzcXJ0UHJpY2VMaW1pdFg5NiwgZGVhZGxpbmUsIHJlZmVycmVyKQp9CgovLyBFeGFjdE91dFN3YXBSb3V0ZSBleGVjdXRlcyBhIG11bHRpLWhvcCBzd2FwIGZvciBhIHJlcXVlc3RlZCBwb3N0LWZlZSBvdXRwdXQKLy8gdGFyZ2V0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0KLy8gICAtIGlucHV0VG9rZW46IGlucHV0IHRva2VuIHBhdGgKLy8gICAtIG91dHB1dFRva2VuOiBvdXRwdXQgdG9rZW4gcGF0aAovLyAgIC0gYW1vdW50T3V0OiByZXF1ZXN0ZWQgbmV0IG91dHB1dCB0YXJnZXQKLy8gICAtIHJvdXRlQXJyOiBlbmNvZGVkIHJvdXRlCi8vICAgLSBxdW90ZUFycjogZW5jb2RlZCBxdW90ZXMKLy8gICAtIGFtb3VudEluTWF4OiBtYXhpbXVtIGlucHV0IGFtb3VudAovLyAgIC0gZGVhZGxpbmU6IHRyYW5zYWN0aW9uIGRlYWRsaW5lCi8vICAgLSByZWZlcnJlcjogcmVmZXJyYWwgYWRkcmVzcwovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50SW46IGlucHV0IGFtb3VudCBjb25zdW1lZAovLyAgIC0gYW1vdW50T3V0OiBuZXQgb3V0cHV0IGRlbGl2ZXJlZCBhZnRlciB0aGUgcm91dGVyIGZlZQovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBSb3V0ZXIgaGFsdCBzY29wZSBpcyBhY3RpdmUuCmZ1bmMgRXhhY3RPdXRTd2FwUm91dGUoY3VyIHJlYWxtLCBpbnB1dFRva2VuIHN0cmluZywgb3V0cHV0VG9rZW4gc3RyaW5nLCBhbW91bnRPdXQgc3RyaW5nLCByb3V0ZUFyciBzdHJpbmcsIHF1b3RlQXJyIHN0cmluZywgYW1vdW50SW5NYXggc3RyaW5nLCBkZWFkbGluZSBpbnQ2NCwgcmVmZXJyZXIgc3RyaW5nKSAoc3RyaW5nLCBzdHJpbmcpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkV4YWN0T3V0U3dhcFJvdXRlKDAsIGN1ciwgaW5wdXRUb2tlbiwgb3V0cHV0VG9rZW4sIGFtb3VudE91dCwgcm91dGVBcnIsIHF1b3RlQXJyLCBhbW91bnRJbk1heCwgZGVhZGxpbmUsIHJlZmVycmVyKQp9CgovLyBFeGFjdE91dFNpbmdsZVN3YXBSb3V0ZSBleGVjdXRlcyBhIHNpbmdsZS1ob3Agc3dhcCBmb3IgYSByZXF1ZXN0ZWQgcG9zdC1mZWUKLy8gb3V0cHV0IHRhcmdldC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogY3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtCi8vICAgLSBpbnB1dFRva2VuOiBpbnB1dCB0b2tlbiBwYXRoCi8vICAgLSBvdXRwdXRUb2tlbjogb3V0cHV0IHRva2VuIHBhdGgKLy8gICAtIGFtb3VudE91dDogcmVxdWVzdGVkIG5ldCBvdXRwdXQgdGFyZ2V0Ci8vICAgLSByb3V0ZUFycjogZW5jb2RlZCByb3V0ZQovLyAgIC0gYW1vdW50SW5NYXg6IG1heGltdW0gaW5wdXQgYW1vdW50Ci8vICAgLSBzcXJ0UHJpY2VMaW1pdFg5NjogUTY0Ljk2IHByaWNlIGxpbWl0Ci8vICAgLSBkZWFkbGluZTogdHJhbnNhY3Rpb24gZGVhZGxpbmUKLy8gICAtIHJlZmVycmVyOiByZWZlcnJhbCBhZGRyZXNzCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnRJbjogaW5wdXQgYW1vdW50IGNvbnN1bWVkIChhIG5vbnplcm8gcHJpY2UgbGltaXQgbWF5IHN0b3AgZWFybHkpCi8vICAgLSBhbW91bnRPdXQ6IG5ldCBvdXRwdXQgZGVsaXZlcmVkIGFmdGVyIHRoZSByb3V0ZXIgZmVlOyBpdCBtYXkgYmUgYmVsb3cKLy8gICAgIHRoZSByZXF1ZXN0ZWQgdGFyZ2V0IHdoZW4gdGhlIGxpbWl0IGlzIHJlYWNoZWQKLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgUm91dGVyIGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIEV4YWN0T3V0U2luZ2xlU3dhcFJvdXRlKGN1ciByZWFsbSwgaW5wdXRUb2tlbiBzdHJpbmcsIG91dHB1dFRva2VuIHN0cmluZywgYW1vdW50T3V0IHN0cmluZywgcm91dGVBcnIgc3RyaW5nLCBhbW91bnRJbk1heCBzdHJpbmcsIHNxcnRQcmljZUxpbWl0WDk2IHN0cmluZywgZGVhZGxpbmUgaW50NjQsIHJlZmVycmVyIHN0cmluZykgKHN0cmluZywgc3RyaW5nKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5FeGFjdE91dFNpbmdsZVN3YXBSb3V0ZSgwLCBjdXIsIGlucHV0VG9rZW4sIG91dHB1dFRva2VuLCBhbW91bnRPdXQsIHJvdXRlQXJyLCBhbW91bnRJbk1heCwgc3FydFByaWNlTGltaXRYOTYsIGRlYWRsaW5lLCByZWZlcnJlcikKfQoKLy8gRHJ5U3dhcFJvdXRlIHNpbXVsYXRlcyBhIHN3YXAgcm91dGUgd2l0aG91dCBjaGFuZ2luZyBzdGF0ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGlucHV0VG9rZW46IGlucHV0IHRva2VuIHBhdGgKLy8gICAtIG91dHB1dFRva2VuOiBvdXRwdXQgdG9rZW4gcGF0aAovLyAgIC0gc3BlY2lmaWVkQW1vdW50OiBleGFjdCBpbnB1dCBvciBvdXRwdXQgYW1vdW50Ci8vICAgLSBzd2FwVHlwZVN0cjogYEVYQUNUX0lOYCBvciBgRVhBQ1RfT1VUYAovLyAgIC0gc3RyUm91dGVBcnI6IGVuY29kZWQgcm91dGUKLy8gICAtIHF1b3RlQXJyOiBlbmNvZGVkIHF1b3RlcwovLyAgIC0gdG9rZW5BbW91bnRMaW1pdDogbWluaW11bSBvdXRwdXQgb3IgbWF4aW11bSBpbnB1dCBhbW91bnQKLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudEluOiBlc3RpbWF0ZWQgaW5wdXQgYW1vdW50Ci8vICAgLSBhbW91bnRPdXQ6IGVzdGltYXRlZCBvdXRwdXQgYW1vdW50Ci8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiByb3V0ZSB2YWxpZGF0aW9uIG9yIHNpbXVsYXRpb24gZmFpbHMKZnVuYyBEcnlTd2FwUm91dGUoCglpbnB1dFRva2VuLCBvdXRwdXRUb2tlbiBzdHJpbmcsCglzcGVjaWZpZWRBbW91bnQgc3RyaW5nLAoJc3dhcFR5cGVTdHIgc3RyaW5nLAoJc3RyUm91dGVBcnIsIHF1b3RlQXJyIHN0cmluZywKCXRva2VuQW1vdW50TGltaXQgc3RyaW5nLAopIChzdHJpbmcsIHN0cmluZywgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkRyeVN3YXBSb3V0ZShpbnB1dFRva2VuLCBvdXRwdXRUb2tlbiwgc3BlY2lmaWVkQW1vdW50LCBzd2FwVHlwZVN0ciwgc3RyUm91dGVBcnIsIHF1b3RlQXJyLCB0b2tlbkFtb3VudExpbWl0KQp9CgovLyBTd2FwQ2FsbGJhY2sgdHJhbnNmZXJzIGFtb3VudHMgb3dlZCBieSBhIHBvb2wgZHVyaW5nIGEgc3dhcC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogY3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtCi8vICAgLSB0b2tlbjBQYXRoOiB0b2tlbjAgcGF0aAovLyAgIC0gdG9rZW4xUGF0aDogdG9rZW4xIHBhdGgKLy8gICAtIGFtb3VudDBEZWx0YTogdG9rZW4wIGFtb3VudCBvd2VkIHRvIG9yIGJ5IHRoZSBwb29sCi8vICAgLSBhbW91bnQxRGVsdGE6IHRva2VuMSBhbW91bnQgb3dlZCB0byBvciBieSB0aGUgcG9vbAovLyAgIC0gcGF5ZXI6IGFkZHJlc3MgdGhhdCBzdXBwbGllcyBwb3NpdGl2ZSBkZWx0YXMKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHBheW1lbnQgdmFsaWRhdGlvbiBvciB0cmFuc2ZlciBmYWlscwovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBSb3V0ZXIgaGFsdCBzY29wZSBpcyBhY3RpdmUuCmZ1bmMgU3dhcENhbGxiYWNrKGN1ciByZWFsbSwgdG9rZW4wUGF0aCBzdHJpbmcsIHRva2VuMVBhdGggc3RyaW5nLCBhbW91bnQwRGVsdGEgaW50NjQsIGFtb3VudDFEZWx0YSBpbnQ2NCwgcGF5ZXIgYWRkcmVzcykgZXJyb3IgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuU3dhcENhbGxiYWNrKDAsIGN1ciwgdG9rZW4wUGF0aCwgdG9rZW4xUGF0aCwgYW1vdW50MERlbHRhLCBhbW91bnQxRGVsdGEsIHBheWVyKQp9CgovLyBHZXRTd2FwRmVlIHJldHVybnMgdGhlIGN1cnJlbnQgcm91dGVyIGZlZSByYXRlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZmVlOiBmZWUgcmF0ZSBpbiBiYXNpcyBwb2ludHMKZnVuYyBHZXRTd2FwRmVlKCkgdWludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFN3YXBGZWUoKQp9CgovLyBTZXRTd2FwRmVlIHNldHMgdGhlIHJvdXRlciBmZWUgcmF0ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogY3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtCi8vICAgLSBmZWU6IGZlZSByYXRlIGluIGJhc2lzIHBvaW50cwovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBSb3V0ZXIgb3IgUHJvdG9jb2xGZWUgaGFsdCBzY29wZSBpcyBhY3RpdmUuCmZ1bmMgU2V0U3dhcEZlZShjdXIgcmVhbG0sIGZlZSB1aW50NjQpIHsKCWdldEltcGxlbWVudGF0aW9uKCkuU2V0U3dhcEZlZSgwLCBjdXIsIGZlZSkKfQoKLy8gR2V0UGVuZGluZ1Byb3RvY29sRmVlcyByZXR1cm5zIGEgY29weSBvZiB1bmNvbGxlY3RlZCBwcm90b2NvbCBmZWVzIGJ5IHRva2VuLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZmVlczogcGVuZGluZyBwcm90b2NvbCBmZWUgYW1vdW50IGtleWVkIGJ5IHRva2VuIHBhdGgKZnVuYyBHZXRQZW5kaW5nUHJvdG9jb2xGZWVzKCkgbWFwW3N0cmluZ11pbnQ2NCB7CglyZXR1cm4gY2xvbmVTdHJpbmdJbnQ2NE1hcChnZXRJbXBsZW1lbnRhdGlvbigpLkdldFBlbmRpbmdQcm90b2NvbEZlZXMoKSkKfQoarAEKCnJlbmRlci5nbm8SnQFwYWNrYWdlIHJvdXRlcgoKLy8gUmVuZGVyIGRlbGVnYXRlcyB3ZWIgcmVuZGVyaW5nIHRvIHRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24uCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuUmVuZGVyKHBhdGgpCn0KGrgJCglzdGF0ZS5nbm8SqglwYWNrYWdlIHJvdXRlcgoKaW1wb3J0ICgKCSJjaGFpbiIKCSJlcnJvcnMiCgoJImduby5sYW5kL3AvZ25vc3dhcC9zdG9yZS92MSIKCSJnbm8ubGFuZC9wL2dub3N3YXAvdmVyc2lvbl9tYW5hZ2VyL3YxIgopCgpjb25zdCBkb21haW5QYXRoID0gImduby5sYW5kL3IvZ25vc3dhcC9yb3V0ZXIiCgp2YXIgKAoJY3VycmVudEFkZHJlc3MgPSBjaGFpbi5QYWNrYWdlQWRkcmVzcyhkb21haW5QYXRoKQoKCWt2U3RvcmUgc3RvcmUuS1ZTdG9yZQoKCXZlcnNpb25NYW5hZ2VyIHZlcnNpb25fbWFuYWdlci5WZXJzaW9uTWFuYWdlcgoJaW1wbGVtZW50YXRpb24gSVJvdXRlcgopCgpmdW5jIGluaXQoKSB7CgkvLyBDcmVhdGUgYSBuZXcgS1Ygc3RvcmUgaW5zdGFuY2UgZm9yIHRoaXMgZG9tYWluCglrdlN0b3JlID0gc3RvcmUuTmV3S1ZTdG9yZShjdXJyZW50QWRkcmVzcykKCgkvLyBJbml0aWFsaXplIHRoZSBpbml0aWFsaXplcnMgbWFwIHRvIHN0b3JlIGltcGxlbWVudGF0aW9uIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbnMKCXZlcnNpb25NYW5hZ2VyID0gdmVyc2lvbl9tYW5hZ2VyLk5ld1ZlcnNpb25NYW5hZ2VyKAoJCWRvbWFpblBhdGgsCgkJa3ZTdG9yZSwKCQlpbml0aWFsaXplRG9tYWluU3RvcmUsCgkpCgoJaW1wbGVtZW50YXRpb24gPSBuaWwKfQoKZnVuYyBpbml0aWFsaXplRG9tYWluU3RvcmUoXyBpbnQsIHJsbSByZWFsbSwga3ZTdG9yZSBzdG9yZS5LVlN0b3JlKSBhbnkgewoJcmV0dXJuIE5ld1JvdXRlclN0b3JlKGt2U3RvcmUpCn0KCmZ1bmMgZ2V0SW1wbGVtZW50YXRpb24oKSBJUm91dGVyIHsKCWlmIGltcGxlbWVudGF0aW9uID09IG5pbCB7CgkJcGFuaWMoImltcGxlbWVudGF0aW9uIGlzIG5vdCBpbml0aWFsaXplZCIpCgl9CgoJcmV0dXJuIGltcGxlbWVudGF0aW9uCn0KCmZ1bmMgdXBkYXRlSW1wbGVtZW50YXRpb24oKSBlcnJvciB7CglyZXN1bHQgOj0gdmVyc2lvbk1hbmFnZXIuR2V0Q3VycmVudEltcGxlbWVudGF0aW9uKCkKCWlmIHJlc3VsdCA9PSBuaWwgewoJCXJldHVybiBlcnJvcnMuTmV3KCJpbXBsZW1lbnRhdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQiKQoJfQoKCWltcGwsIG9rIDo9IHJlc3VsdC4oSVJvdXRlcikKCWlmICFvayB7CgkJcmV0dXJuIGVycm9ycy5OZXcoImltcGwgaXMgbm90IGFuIElSb3V0ZXIiKQoJfQoKCWltcGxlbWVudGF0aW9uID0gaW1wbAoKCXJldHVybiBuaWwKfQoaqi8KCXN0b3JlLmdubxKcL3BhY2thZ2Ugcm91dGVyCgppbXBvcnQgKAoJImVycm9ycyIKCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3N0b3JlL3YxIgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgpjb25zdCBlcnJTcG9vZmVkUmVhbG0gPSAicmxtIGRvZXMgbm90IG1hdGNoIHRoZSBjdXJyZW50IGNyb3NzaW5nIGZyYW1lIgoKdHlwZSBTdG9yZUtleSBzdHJpbmcKCi8vIFN0cmluZyBjb252ZXJ0cyB0aGUgdHlwZWQgc3RvcmUga2V5IHRvIHRoZSBzdHJpbmcga2V5IHVzZWQgYnkgS1ZTdG9yZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGtleTogdW5kZXJseWluZyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0b3JlIGtleQpmdW5jIChzIFN0b3JlS2V5KSBTdHJpbmcoKSBzdHJpbmcgewoJcmV0dXJuIHN0cmluZyhzKQp9Cgpjb25zdCAoCglTdG9yZUtleVN3YXBGZWUgICAgICAgICAgICAgU3RvcmVLZXkgPSAic3dhcEZlZSIgICAgICAgICAgICAgLy8gU3dhcCBmZWUgaW4gYmFzaXMgcG9pbnRzCglTdG9yZUtleVBlbmRpbmdQcm90b2NvbEZlZXMgU3RvcmVLZXkgPSAicGVuZGluZ1Byb3RvY29sRmVlcyIgLy8gdG9rZW5QYXRoIC0+IGFtb3VudCBoZWxkIGxvY2FsbHkgZm9yIHByb3RvY29sX2ZlZQopCgp0eXBlIHJvdXRlclN0b3JlIHN0cnVjdCB7CglrdlN0b3JlIHN0b3JlLktWU3RvcmUKfQoKLy8gSGFzU3dhcEZlZUtleSByZXBvcnRzIHdoZXRoZXIgcGVyc2lzdGVudCBzdG9yYWdlIGNvbnRhaW5zIHRoZSByb3V0ZXIgc3dhcC1mZWUga2V5LgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gdGhlIHN3YXAtZmVlIGtleSBpcyBwcmVzZW50LCBvdGhlcndpc2UgZmFsc2UKZnVuYyAocyAqcm91dGVyU3RvcmUpIEhhc1N3YXBGZWVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5U3dhcEZlZS5TdHJpbmcoKSkKfQoKLy8gR2V0U3dhcEZlZSByZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc3dhcCBmZWUgZnJvbSBwZXJzaXN0ZW50IHN0b3JhZ2UuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBmZWU6IGNvbmZpZ3VyZWQgcm91dGVyIGZlZSBpbiBiYXNpcyBwb2ludHM7IHBhbmljcyBpZiB0aGUga2V5IGlzIG1pc3Npbmcgb3IgaGFzIHRoZSB3cm9uZyB0eXBlCmZ1bmMgKHMgKnJvdXRlclN0b3JlKSBHZXRTd2FwRmVlKCkgdWludDY0IHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlTd2FwRmVlLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXN3YXBGZWUsIG9rIDo9IHJlc3VsdC4odWludDY0KQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byB1aW50NjQ6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gc3dhcEZlZQp9CgovLyBTZXRTd2FwRmVlIHN0b3JlcyB0aGUgcm91dGVyIGZlZSBpbiBwZXJzaXN0ZW50IHN0b3JhZ2UuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIGNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKLy8gICAtIHJsbTogY3VycmVudCByZWFsbSBjb250ZXh0OyBtdXN0IGJlIHRoZSBjdXJyZW50IGNyb3NzaW5nIGZyYW1lCi8vICAgLSBmZWU6IHJvdXRlciBmZWUgcmF0ZSBpbiBiYXNpcyBwb2ludHMKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogbmlsIHdoZW4gc3RvcmFnZSBzdWNjZWVkczsgYW4gZXJyb3Igd2hlbiBybG0gaXMgbm90IGN1cnJlbnQgb3IgS1ZTdG9yZSByZWplY3RzIHRoZSB3cml0ZQpmdW5jIChzICpyb3V0ZXJTdG9yZSkgU2V0U3dhcEZlZShfIGludCwgcmxtIHJlYWxtLCBmZWUgdWludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhlcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVN3YXBGZWUuU3RyaW5nKCksIGZlZSkKfQoKLy8gSGFzUGVuZGluZ1Byb3RvY29sRmVlc0tleSByZXBvcnRzIHdoZXRoZXIgcGVyc2lzdGVudCBzdG9yYWdlIGNvbnRhaW5zIHRoZSBwZW5kaW5nLWZlZXMgbWFwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gdGhlIHBlbmRpbmcgcHJvdG9jb2wtZmVlcyBrZXkgaXMgcHJlc2VudCwgb3RoZXJ3aXNlIGZhbHNlCmZ1bmMgKHMgKnJvdXRlclN0b3JlKSBIYXNQZW5kaW5nUHJvdG9jb2xGZWVzS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleVBlbmRpbmdQcm90b2NvbEZlZXMuU3RyaW5nKCkpCn0KCi8vIEdldFBlbmRpbmdQcm90b2NvbEZlZXMgcmV0cmlldmVzIHRoZSB0b2tlbi1wYXRoIGtleWVkIHBlbmRpbmcgcHJvdG9jb2wtZmVlcyBtYXAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBmZWVzOiBzdG9yZWQgdG9rZW4tcGF0aCB0byBwZW5kaW5nIGFtb3VudCBtYXA7IHBhbmljcyBpZiBzdG9yYWdlIGlzIG1pc3Npbmcgb3IgaGFzIHRoZSB3cm9uZyB0eXBlCmZ1bmMgKHMgKnJvdXRlclN0b3JlKSBHZXRQZW5kaW5nUHJvdG9jb2xGZWVzKCkgbWFwW3N0cmluZ11pbnQ2NCB7CglyZXN1bHQsIGVyciA6PSBzLmt2U3RvcmUuR2V0KFN0b3JlS2V5UGVuZGluZ1Byb3RvY29sRmVlcy5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglwZW5kaW5nUHJvdG9jb2xGZWVzLCBvayA6PSByZXN1bHQuKG1hcFtzdHJpbmddaW50NjQpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvIG1hcFtzdHJpbmddaW50NjQ6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gcGVuZGluZ1Byb3RvY29sRmVlcwp9CgovLyBTZXRQZW5kaW5nUHJvdG9jb2xGZWVzIHJlcGxhY2VzIHRoZSBwZW5kaW5nIHByb3RvY29sLWZlZXMgbWFwIGluIHBlcnNpc3RlbnQgc3RvcmFnZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGxlYWRpbmcgY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAovLyAgIC0gcmxtOiBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IG11c3QgYmUgdGhlIGN1cnJlbnQgY3Jvc3NpbmcgZnJhbWUKLy8gICAtIGZlZXM6IHRva2VuLXBhdGgga2V5ZWQgcGVuZGluZyBmZWUgYW1vdW50cyB0byBzdG9yZTsgZW50cmllcyBhcmUgY29waWVkIGludG8gcmVhbG0tb3duZWQgc3RvcmFnZQovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBuaWwgd2hlbiBzdG9yYWdlIHN1Y2NlZWRzOyBhbiBlcnJvciB3aGVuIHJsbSBpcyBub3QgY3VycmVudCBvciBLVlN0b3JlIHJlamVjdHMgdGhlIHdyaXRlCmZ1bmMgKHMgKnJvdXRlclN0b3JlKSBTZXRQZW5kaW5nUHJvdG9jb2xGZWVzKF8gaW50LCBybG0gcmVhbG0sIGZlZXMgbWFwW3N0cmluZ11pbnQ2NCkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoZXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCS8vIFRoZSBtYXAgaXMgY29waWVkIGhlcmUgc28gaXQgaXMgYWxsb2NhdGVkIGJ5LCBhbmQgdGhlcmVmb3JlIG11dGFibGUgZnJvbSwgdGhpcyByZWFsbS4KCW93bmVkIDo9IG1ha2UobWFwW3N0cmluZ11pbnQ2NCwgbGVuKGZlZXMpKQoJZm9yIHRva2VuUGF0aCwgYW1vdW50IDo9IHJhbmdlIGZlZXMgewoJCW93bmVkW3Rva2VuUGF0aF0gPSBhbW91bnQKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5UGVuZGluZ1Byb3RvY29sRmVlcy5TdHJpbmcoKSwgb3duZWQpCn0KCi8vIEdldFBlbmRpbmdQcm90b2NvbEZlZSByZXR1cm5zIHRoZSBwZW5kaW5nIGFtb3VudCByZWNvcmRlZCBmb3Igb25lIHRva2VuIHBhdGguCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0b2tlblBhdGg6IHRva2VuIGNvbnRyYWN0IHBhdGggd2hvc2UgcGVuZGluZyBwcm90b2NvbCBmZWUgaXMgcXVlcmllZAovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBwZW5kaW5nIGZlZSBhbW91bnQgZm9yIHRva2VuUGF0aCwgb3IgemVybyB3aGVuIG5vIGVudHJ5IGV4aXN0cwpmdW5jIChzICpyb3V0ZXJTdG9yZSkgR2V0UGVuZGluZ1Byb3RvY29sRmVlKHRva2VuUGF0aCBzdHJpbmcpIGludDY0IHsKCXJldHVybiBzLkdldFBlbmRpbmdQcm90b2NvbEZlZXMoKVt0b2tlblBhdGhdCn0KCi8vIFNldFBlbmRpbmdQcm90b2NvbEZlZSB1cGRhdGVzIG9uZSB0b2tlbiBwYXRoJ3MgcGVuZGluZyBwcm90b2NvbC1mZWUgYW1vdW50LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogbGVhZGluZyBjYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCi8vICAgLSBybG06IGN1cnJlbnQgcmVhbG0gY29udGV4dDsgbXVzdCBiZSBjdXJyZW50IGFuZCBhdXRob3JpemVkIHRvIHdyaXRlIHN0b3JhZ2UKLy8gICAtIHRva2VuUGF0aDogdG9rZW4gY29udHJhY3QgcGF0aCB3aG9zZSBwZW5kaW5nIGFtb3VudCBpcyB1cGRhdGVkCi8vICAgLSBhbW91bnQ6IHBlbmRpbmcgcHJvdG9jb2wtZmVlIGFtb3VudCB0byByZWNvcmQKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogbmlsIHdoZW4gdXBkYXRlZDsgYW4gZXJyb3Igd2hlbiB0aGUgcmVhbG0gaXMgc3Bvb2ZlZCBvciBsYWNrcyBLVlN0b3JlIHdyaXRlIHBlcm1pc3Npb24KZnVuYyAocyAqcm91dGVyU3RvcmUpIFNldFBlbmRpbmdQcm90b2NvbEZlZShfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nLCBhbW91bnQgaW50NjQpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KGVyclNwb29mZWRSZWFsbSkKCX0KCglpZiBybG0uSXNDb2RlKCkgJiYgIXMua3ZTdG9yZS5Jc1dyaXRlQXV0aG9yaXplZChybG0uQWRkcmVzcygpKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoc3RvcmUuRXJyV3JpdGVQZXJtaXNzaW9uRGVuaWVkKQoJfQoKCXMuR2V0UGVuZGluZ1Byb3RvY29sRmVlcygpW3Rva2VuUGF0aF0gPSBhbW91bnQKCglyZXR1cm4gbmlsCn0KCi8vIFJlbW92ZVBlbmRpbmdQcm90b2NvbEZlZSBkZWxldGVzIG9uZSB0b2tlbiBwYXRoJ3MgcGVuZGluZyBwcm90b2NvbC1mZWUgZW50cnkuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIGNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKLy8gICAtIHJsbTogY3VycmVudCByZWFsbSBjb250ZXh0OyBtdXN0IGJlIGN1cnJlbnQgYW5kIGF1dGhvcml6ZWQgdG8gd3JpdGUgc3RvcmFnZQovLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBjb250cmFjdCBwYXRoIHdob3NlIHBlbmRpbmcgYW1vdW50IGlzIHJlbW92ZWQKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogbmlsIHdoZW4gcmVtb3ZlZDsgYW4gZXJyb3Igd2hlbiB0aGUgcmVhbG0gaXMgc3Bvb2ZlZCBvciBsYWNrcyBLVlN0b3JlIHdyaXRlIHBlcm1pc3Npb24KZnVuYyAocyAqcm91dGVyU3RvcmUpIFJlbW92ZVBlbmRpbmdQcm90b2NvbEZlZShfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhlcnJTcG9vZmVkUmVhbG0pCgl9CgoJaWYgcmxtLklzQ29kZSgpICYmICFzLmt2U3RvcmUuSXNXcml0ZUF1dGhvcml6ZWQocmxtLkFkZHJlc3MoKSkgewoJCXJldHVybiBlcnJvcnMuTmV3KHN0b3JlLkVycldyaXRlUGVybWlzc2lvbkRlbmllZCkKCX0KCglkZWxldGUocy5HZXRQZW5kaW5nUHJvdG9jb2xGZWVzKCksIHRva2VuUGF0aCkKCglyZXR1cm4gbmlsCn0KCi8vIE5ld1JvdXRlclN0b3JlIGNyZWF0ZXMgYSByb3V0ZXIgc3RvcmUgYmFja2VkIGJ5IHRoZSBwcm92aWRlZCBLViBzdG9yZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGt2U3RvcmU6IHBlcnNpc3RlbnQga2V5LXZhbHVlIHN0b3JlIHVzZWQgZm9yIHJvdXRlciBmZWUgYW5kIHBlbmRpbmctZmVlIGRhdGEKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJvdXRlclN0b3JlOiByb3V0ZXIgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiB1c2luZyBrdlN0b3JlCmZ1bmMgTmV3Um91dGVyU3RvcmUoa3ZTdG9yZSBzdG9yZS5LVlN0b3JlKSBJUm91dGVyU3RvcmUgewoJcnMgOj0gJnJvdXRlclN0b3JlewoJCWt2U3RvcmU6IGt2U3RvcmUsCgl9CgoJcmV0dXJuIHJzCn0KGu9LCgl0eXBlcy5nbm8S4UtwYWNrYWdlIHJvdXRlcgoKdHlwZSBJUm91dGVyIGludGVyZmFjZSB7CgkvLyBFeGFjdEluU3dhcFJvdXRlIGV4ZWN1dGVzIGEgbXVsdGktaG9wIGV4YWN0LWlucHV0IHN3YXAuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIGltcGxlbWVudGF0aW9uIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dCB1c2VkIGZvciBzd2FwIHZhbGlkYXRpb24gYW5kIHRyYW5zZmVycwoJLy8gICAtIGlucHV0VG9rZW46IGlucHV0IHRva2VuIGNvbnRyYWN0IHBhdGgKCS8vICAgLSBvdXRwdXRUb2tlbjogb3V0cHV0IHRva2VuIGNvbnRyYWN0IHBhdGgKCS8vICAgLSBhbW91bnRJbjogZXhhY3QgaW5wdXQgYW1vdW50IGVuY29kZWQgYXMgYSBkZWNpbWFsIHN0cmluZwoJLy8gICAtIHJvdXRlQXJyOiBjb21tYS1zZXBhcmF0ZWQgcm91dGUgcGF0aHMsIGVhY2ggd2l0aCB1cCB0byB0aHJlZSBwb29sIGhvcHMKCS8vICAgLSBxdW90ZUFycjogY29tbWEtc2VwYXJhdGVkIHJvdXRlIGFsbG9jYXRpb24gcGVyY2VudGFnZXMgc3VtbWluZyB0byAxMDAKCS8vICAgLSBhbW91bnRPdXRNaW46IG1pbmltdW0gbmV0IG91dHB1dCBhbW91bnQgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCgkvLyAgIC0gZGVhZGxpbmU6IFVuaXggdGltZXN0YW1wIGFmdGVyIHdoaWNoIHRoZSBzd2FwIGlzIHJlamVjdGVkCgkvLyAgIC0gcmVmZXJyZXI6IG9wdGlvbmFsIHJlZmVycmFsIGFkZHJlc3MgdXNlZCBmb3IgcmVnaXN0cmF0aW9uCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnRJbjogYWN0dWFsIGlucHV0IGFtb3VudCBjb25zdW1lZCwgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCgkvLyAgIC0gYW1vdW50T3V0OiBuZXQgb3V0cHV0IGFtb3VudCBhZnRlciByb3V0ZXIgZmVlLCBlbmNvZGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKCUV4YWN0SW5Td2FwUm91dGUoXyBpbnQsIHJsbSByZWFsbSwgaW5wdXRUb2tlbiBzdHJpbmcsIG91dHB1dFRva2VuIHN0cmluZywgYW1vdW50SW4gc3RyaW5nLCByb3V0ZUFyciBzdHJpbmcsIHF1b3RlQXJyIHN0cmluZywgYW1vdW50T3V0TWluIHN0cmluZywgZGVhZGxpbmUgaW50NjQsIHJlZmVycmVyIHN0cmluZykgKHN0cmluZywgc3RyaW5nKQoJLy8gRXhhY3RJblNpbmdsZVN3YXBSb3V0ZSBleGVjdXRlcyBhbiBleGFjdC1pbnB1dCBzd2FwIHRocm91Z2ggb25lIHBvb2wuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIGltcGxlbWVudGF0aW9uIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dCB1c2VkIGZvciBzd2FwIHZhbGlkYXRpb24gYW5kIHRyYW5zZmVycwoJLy8gICAtIGlucHV0VG9rZW46IGlucHV0IHRva2VuIGNvbnRyYWN0IHBhdGgKCS8vICAgLSBvdXRwdXRUb2tlbjogb3V0cHV0IHRva2VuIGNvbnRyYWN0IHBhdGgKCS8vICAgLSBhbW91bnRJbjogZXhhY3QgaW5wdXQgYW1vdW50IGVuY29kZWQgYXMgYSBkZWNpbWFsIHN0cmluZwoJLy8gICAtIHJvdXRlQXJyOiBzaW5nbGUtaG9wIHJvdXRlIHBhdGgKCS8vICAgLSBhbW91bnRPdXRNaW46IG1pbmltdW0gbmV0IG91dHB1dCBhbW91bnQgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCgkvLyAgIC0gc3FydFByaWNlTGltaXRYOTY6IG9wdGlvbmFsIFE2NC45NiBzcXVhcmUtcm9vdCBwcmljZSBsaW1pdCBlbmNvZGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKCS8vICAgLSBkZWFkbGluZTogVW5peCB0aW1lc3RhbXAgYWZ0ZXIgd2hpY2ggdGhlIHN3YXAgaXMgcmVqZWN0ZWQKCS8vICAgLSByZWZlcnJlcjogb3B0aW9uYWwgcmVmZXJyYWwgYWRkcmVzcyB1c2VkIGZvciByZWdpc3RyYXRpb24KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGFtb3VudEluOiBhY3R1YWwgaW5wdXQgYW1vdW50IGNvbnN1bWVkLCBlbmNvZGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKCS8vICAgLSBhbW91bnRPdXQ6IG5ldCBvdXRwdXQgYW1vdW50IGFmdGVyIHJvdXRlciBmZWUsIGVuY29kZWQgYXMgYSBkZWNpbWFsIHN0cmluZwoJRXhhY3RJblNpbmdsZVN3YXBSb3V0ZShfIGludCwgcmxtIHJlYWxtLCBpbnB1dFRva2VuIHN0cmluZywgb3V0cHV0VG9rZW4gc3RyaW5nLCBhbW91bnRJbiBzdHJpbmcsIHJvdXRlQXJyIHN0cmluZywgYW1vdW50T3V0TWluIHN0cmluZywgc3FydFByaWNlTGltaXRYOTYgc3RyaW5nLCBkZWFkbGluZSBpbnQ2NCwgcmVmZXJyZXIgc3RyaW5nKSAoc3RyaW5nLCBzdHJpbmcpCgoJLy8gRXhhY3RPdXRTd2FwUm91dGUgZXhlY3V0ZXMgYSBtdWx0aS1ob3Agc3dhcCBmb3IgYSByZXF1ZXN0ZWQgbmV0IG91dHB1dC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgaW1wbGVtZW50YXRpb24gZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0IHVzZWQgZm9yIHN3YXAgdmFsaWRhdGlvbiBhbmQgdHJhbnNmZXJzCgkvLyAgIC0gaW5wdXRUb2tlbjogaW5wdXQgdG9rZW4gY29udHJhY3QgcGF0aAoJLy8gICAtIG91dHB1dFRva2VuOiBvdXRwdXQgdG9rZW4gY29udHJhY3QgcGF0aAoJLy8gICAtIGFtb3VudE91dDogcmVxdWVzdGVkIG5ldCBvdXRwdXQgYW1vdW50IGVuY29kZWQgYXMgYSBkZWNpbWFsIHN0cmluZwoJLy8gICAtIHJvdXRlQXJyOiBjb21tYS1zZXBhcmF0ZWQgcm91dGUgcGF0aHMsIGVhY2ggd2l0aCB1cCB0byB0aHJlZSBwb29sIGhvcHMKCS8vICAgLSBxdW90ZUFycjogY29tbWEtc2VwYXJhdGVkIHJvdXRlIGFsbG9jYXRpb24gcGVyY2VudGFnZXMgc3VtbWluZyB0byAxMDAKCS8vICAgLSBhbW91bnRJbk1heDogbWF4aW11bSBpbnB1dCBhbW91bnQgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCgkvLyAgIC0gZGVhZGxpbmU6IFVuaXggdGltZXN0YW1wIGFmdGVyIHdoaWNoIHRoZSBzd2FwIGlzIHJlamVjdGVkCgkvLyAgIC0gcmVmZXJyZXI6IG9wdGlvbmFsIHJlZmVycmFsIGFkZHJlc3MgdXNlZCBmb3IgcmVnaXN0cmF0aW9uCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnRJbjogYWN0dWFsIGlucHV0IGFtb3VudCBjb25zdW1lZCwgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCgkvLyAgIC0gYW1vdW50T3V0OiBuZXQgb3V0cHV0IGFtb3VudCBhZnRlciByb3V0ZXIgZmVlLCBlbmNvZGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKCUV4YWN0T3V0U3dhcFJvdXRlKF8gaW50LCBybG0gcmVhbG0sIGlucHV0VG9rZW4gc3RyaW5nLCBvdXRwdXRUb2tlbiBzdHJpbmcsIGFtb3VudE91dCBzdHJpbmcsIHJvdXRlQXJyIHN0cmluZywgcXVvdGVBcnIgc3RyaW5nLCBhbW91bnRJbk1heCBzdHJpbmcsIGRlYWRsaW5lIGludDY0LCByZWZlcnJlciBzdHJpbmcpIChzdHJpbmcsIHN0cmluZykKCS8vIEV4YWN0T3V0U2luZ2xlU3dhcFJvdXRlIGV4ZWN1dGVzIGFuIGV4YWN0LW91dHB1dCBzd2FwIHRocm91Z2ggb25lIHBvb2wuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIGltcGxlbWVudGF0aW9uIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dCB1c2VkIGZvciBzd2FwIHZhbGlkYXRpb24gYW5kIHRyYW5zZmVycwoJLy8gICAtIGlucHV0VG9rZW46IGlucHV0IHRva2VuIGNvbnRyYWN0IHBhdGgKCS8vICAgLSBvdXRwdXRUb2tlbjogb3V0cHV0IHRva2VuIGNvbnRyYWN0IHBhdGgKCS8vICAgLSBhbW91bnRPdXQ6IHJlcXVlc3RlZCBuZXQgb3V0cHV0IGFtb3VudCBlbmNvZGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKCS8vICAgLSByb3V0ZUFycjogc2luZ2xlLWhvcCByb3V0ZSBwYXRoCgkvLyAgIC0gYW1vdW50SW5NYXg6IG1heGltdW0gaW5wdXQgYW1vdW50IGVuY29kZWQgYXMgYSBkZWNpbWFsIHN0cmluZwoJLy8gICAtIHNxcnRQcmljZUxpbWl0WDk2OiBvcHRpb25hbCBRNjQuOTYgc3F1YXJlLXJvb3QgcHJpY2UgbGltaXQgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCgkvLyAgIC0gZGVhZGxpbmU6IFVuaXggdGltZXN0YW1wIGFmdGVyIHdoaWNoIHRoZSBzd2FwIGlzIHJlamVjdGVkCgkvLyAgIC0gcmVmZXJyZXI6IG9wdGlvbmFsIHJlZmVycmFsIGFkZHJlc3MgdXNlZCBmb3IgcmVnaXN0cmF0aW9uCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnRJbjogYWN0dWFsIGlucHV0IGFtb3VudCBjb25zdW1lZCwgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCgkvLyAgIC0gYW1vdW50T3V0OiBuZXQgb3V0cHV0IGFtb3VudCBhZnRlciByb3V0ZXIgZmVlLCBlbmNvZGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKCUV4YWN0T3V0U2luZ2xlU3dhcFJvdXRlKF8gaW50LCBybG0gcmVhbG0sIGlucHV0VG9rZW4gc3RyaW5nLCBvdXRwdXRUb2tlbiBzdHJpbmcsIGFtb3VudE91dCBzdHJpbmcsIHJvdXRlQXJyIHN0cmluZywgYW1vdW50SW5NYXggc3RyaW5nLCBzcXJ0UHJpY2VMaW1pdFg5NiBzdHJpbmcsIGRlYWRsaW5lIGludDY0LCByZWZlcnJlciBzdHJpbmcpIChzdHJpbmcsIHN0cmluZykKCgkvLyBEcnlTd2FwUm91dGUgc2ltdWxhdGVzIGEgcm91dGUgd2l0aG91dCB3cml0aW5nIHN0YXRlIG9yIHRyYW5zZmVycmluZyB0b2tlbnMuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBpbnB1dFRva2VuOiBpbnB1dCB0b2tlbiBjb250cmFjdCBwYXRoCgkvLyAgIC0gb3V0cHV0VG9rZW46IG91dHB1dCB0b2tlbiBjb250cmFjdCBwYXRoCgkvLyAgIC0gc3BlY2lmaWVkQW1vdW50OiBleGFjdCBpbnB1dCBvciBvdXRwdXQgYW1vdW50IGVuY29kZWQgYXMgYSBkZWNpbWFsIHN0cmluZwoJLy8gICAtIHN3YXBUeXBlU3RyOiBzd2FwIHR5cGUgc3RyaW5nLCBlaXRoZXIgRVhBQ1RfSU4gb3IgRVhBQ1RfT1VUCgkvLyAgIC0gc3RyUm91dGVBcnI6IGNvbW1hLXNlcGFyYXRlZCBlbmNvZGVkIHJvdXRlIHBhdGhzCgkvLyAgIC0gcXVvdGVBcnI6IGNvbW1hLXNlcGFyYXRlZCByb3V0ZSBhbGxvY2F0aW9uIHBlcmNlbnRhZ2VzIHN1bW1pbmcgdG8gMTAwCgkvLyAgIC0gdG9rZW5BbW91bnRMaW1pdDogbWluaW11bSBvdXRwdXQgZm9yIEVYQUNUX0lOIG9yIG1heGltdW0gaW5wdXQgZm9yIEVYQUNUX09VVAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYW1vdW50SW46IHNpbXVsYXRlZCBpbnB1dCBhbW91bnQgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCgkvLyAgIC0gYW1vdW50T3V0OiBzaW11bGF0ZWQgbmV0IG91dHB1dCBhbW91bnQgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCgkvLyAgIC0gZXJyOiBuaWwgb24gc3VjY2VzczsgdmFsaWRhdGlvbiwgbGlxdWlkaXR5LCBvciBzbGlwcGFnZSBlcnJvciBvbiBmYWlsdXJlCglEcnlTd2FwUm91dGUoaW5wdXRUb2tlbiwgb3V0cHV0VG9rZW4sIHNwZWNpZmllZEFtb3VudCwgc3dhcFR5cGVTdHIsIHN0clJvdXRlQXJyLCBxdW90ZUFyciwgdG9rZW5BbW91bnRMaW1pdCBzdHJpbmcpIChzdHJpbmcsIHN0cmluZywgZXJyb3IpCgkvLyBTd2FwQ2FsbGJhY2sgcGF5cyBhIHBvb2wncyBwb3NpdGl2ZSBpbnB1dCBkZWx0YSBkdXJpbmcgYSBzd2FwLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyBjYWxsYmFjayBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGltcGxlbWVudGF0aW9uIHZlcmlmaWVzIGl0IGlzIGN1cnJlbnQKCS8vICAgLSB0b2tlbjBQYXRoOiB0b2tlbi0wIGNvbnRyYWN0IHBhdGggaW4gY2Fub25pY2FsIHBvb2wgb3JkZXIKCS8vICAgLSB0b2tlbjFQYXRoOiB0b2tlbi0xIGNvbnRyYWN0IHBhdGggaW4gY2Fub25pY2FsIHBvb2wgb3JkZXIKCS8vICAgLSBhbW91bnQwRGVsdGE6IHNpZ25lZCB0b2tlbi0wIGRlbHRhOyBwb3NpdGl2ZSBtZWFucyB0aGUgcG9vbCBpcyBvd2VkIHRva2VucwoJLy8gICAtIGFtb3VudDFEZWx0YTogc2lnbmVkIHRva2VuLTEgZGVsdGE7IHBvc2l0aXZlIG1lYW5zIHRoZSBwb29sIGlzIG93ZWQgdG9rZW5zCgkvLyAgIC0gcGF5ZXI6IGFkZHJlc3Mgd2hvc2UgYmFsYW5jZSBzdXBwbGllcyB0aGUgcG9zaXRpdmUgZGVsdGEKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogbmlsIGFmdGVyIHBheW1lbnQ7IGVycm9yIHdoZW4gcmVhbG0sIGxpcXVpZGl0eSBkZWx0YSwgb3IgdHJhbnNmZXIgdmFsaWRhdGlvbiBmYWlscwoJU3dhcENhbGxiYWNrKF8gaW50LCBybG0gcmVhbG0sIHRva2VuMFBhdGggc3RyaW5nLCB0b2tlbjFQYXRoIHN0cmluZywgYW1vdW50MERlbHRhIGludDY0LCBhbW91bnQxRGVsdGEgaW50NjQsIHBheWVyIGFkZHJlc3MpIGVycm9yCgkvLyBHZXRTd2FwRmVlIHJlYWRzIHRoZSByb3V0ZXIgZmVlIHJhdGUuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBmZWU6IHJvdXRlciBmZWUgaW4gYmFzaXMgcG9pbnRzCglHZXRTd2FwRmVlKCkgdWludDY0CgkvLyBTZXRTd2FwRmVlIHVwZGF0ZXMgdGhlIHJvdXRlciBmZWUgcmF0ZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQgdXNlZCBmb3IgYXV0aG9yaXplZCBzdG9yYWdlIHdyaXRlcwoJLy8gICAtIGZlZTogcm91dGVyIGZlZSBpbiBiYXNpcyBwb2ludHMKCVNldFN3YXBGZWUoXyBpbnQsIHJsbSByZWFsbSwgZmVlIHVpbnQ2NCkKCS8vIEdldFBlbmRpbmdQcm90b2NvbEZlZXMgcmVhZHMgcGVuZGluZyBwcm90b2NvbCBmZWVzIGtleWVkIGJ5IHRva2VuIHBhdGguCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBmZWVzOiB0b2tlbi1wYXRoIHRvIHBlbmRpbmctZmVlIGFtb3VudCBtYXAKCUdldFBlbmRpbmdQcm90b2NvbEZlZXMoKSBtYXBbc3RyaW5nXWludDY0CglSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZwp9Cgp0eXBlIElSb3V0ZXJTdG9yZSBpbnRlcmZhY2UgewoJLy8gSGFzU3dhcEZlZUtleSByZXBvcnRzIHdoZXRoZXIgYSBzdG9yZWQgcm91dGVyIGZlZSBleGlzdHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0aGUgc3dhcC1mZWUga2V5IGlzIHByZXNlbnQKCUhhc1N3YXBGZWVLZXkoKSBib29sCgkvLyBHZXRTd2FwRmVlIHJlYWRzIHRoZSBzdG9yZWQgcm91dGVyIGZlZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGZlZTogY29uZmlndXJlZCByb3V0ZXIgZmVlIGluIGJhc2lzIHBvaW50cwoJR2V0U3dhcEZlZSgpIHVpbnQ2NAoJLy8gU2V0U3dhcEZlZSBwZXJzaXN0cyB0aGUgcm91dGVyIGZlZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IHN0b3JhZ2UgdmFsaWRhdGVzIGN1cnJlbnQtZnJhbWUgc3RhdHVzCgkvLyAgIC0gZmVlOiByb3V0ZXIgZmVlIGluIGJhc2lzIHBvaW50cwoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBuaWwgb24gc3VjY2Vzczsgc3RvcmFnZSBvciByZWFsbS12YWxpZGF0aW9uIGVycm9yIG90aGVyd2lzZQoJU2V0U3dhcEZlZShfIGludCwgcmxtIHJlYWxtLCBmZWUgdWludDY0KSBlcnJvcgoJLy8gSGFzUGVuZGluZ1Byb3RvY29sRmVlc0tleSByZXBvcnRzIHdoZXRoZXIgYSBzdG9yZWQgcGVuZGluZy1mZWVzIG1hcCBleGlzdHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0aGUgcGVuZGluZy1mZWVzIGtleSBpcyBwcmVzZW50CglIYXNQZW5kaW5nUHJvdG9jb2xGZWVzS2V5KCkgYm9vbAoJLy8gR2V0UGVuZGluZ1Byb3RvY29sRmVlcyByZWFkcyBhbGwgcGVuZGluZyBwcm90b2NvbCBmZWVzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZmVlczogdG9rZW4tcGF0aCB0byBwZW5kaW5nLWZlZSBhbW91bnQgbWFwCglHZXRQZW5kaW5nUHJvdG9jb2xGZWVzKCkgbWFwW3N0cmluZ11pbnQ2NAoJLy8gU2V0UGVuZGluZ1Byb3RvY29sRmVlcyByZXBsYWNlcyBhbGwgcGVuZGluZyBwcm90b2NvbCBmZWVzLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyBjYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dDsgc3RvcmFnZSB2YWxpZGF0ZXMgY3VycmVudC1mcmFtZSBzdGF0dXMKCS8vICAgLSBmZWVzOiB0b2tlbi1wYXRoIHRvIHBlbmRpbmctZmVlIGFtb3VudCBtYXAgdG8gcGVyc2lzdAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBuaWwgb24gc3VjY2Vzczsgc3RvcmFnZSBvciByZWFsbS12YWxpZGF0aW9uIGVycm9yIG90aGVyd2lzZQoJU2V0UGVuZGluZ1Byb3RvY29sRmVlcyhfIGludCwgcmxtIHJlYWxtLCBmZWVzIG1hcFtzdHJpbmddaW50NjQpIGVycm9yCgkvLyBHZXRQZW5kaW5nUHJvdG9jb2xGZWUgcmVhZHMgb25lIHRva2VuJ3MgcGVuZGluZyBmZWUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSB0b2tlblBhdGg6IHRva2VuIGNvbnRyYWN0IHBhdGggdG8gcXVlcnkKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGFtb3VudDogcGVuZGluZyBhbW91bnQgZm9yIHRva2VuUGF0aCwgb3IgemVybyBpZiBhYnNlbnQKCUdldFBlbmRpbmdQcm90b2NvbEZlZSh0b2tlblBhdGggc3RyaW5nKSBpbnQ2NAoJLy8gU2V0UGVuZGluZ1Byb3RvY29sRmVlIHVwZGF0ZXMgb25lIHRva2VuJ3MgcGVuZGluZyBmZWUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIGNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0OyBzdG9yYWdlIHZhbGlkYXRlcyBjdXJyZW50LWZyYW1lIGFuZCB3cml0ZSBhdXRob3JpemF0aW9uCgkvLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBjb250cmFjdCBwYXRoIHRvIHVwZGF0ZQoJLy8gICAtIGFtb3VudDogcGVuZGluZyBhbW91bnQgdG8gcmVjb3JkCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IG5pbCBvbiBzdWNjZXNzOyByZWFsbSBvciBzdG9yYWdlIGF1dGhvcml6YXRpb24gZXJyb3Igb3RoZXJ3aXNlCglTZXRQZW5kaW5nUHJvdG9jb2xGZWUoXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZywgYW1vdW50IGludDY0KSBlcnJvcgoJLy8gUmVtb3ZlUGVuZGluZ1Byb3RvY29sRmVlIGRlbGV0ZXMgb25lIHRva2VuJ3MgcGVuZGluZyBmZWUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIGNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0OyBzdG9yYWdlIHZhbGlkYXRlcyBjdXJyZW50LWZyYW1lIGFuZCB3cml0ZSBhdXRob3JpemF0aW9uCgkvLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBjb250cmFjdCBwYXRoIHRvIHJlbW92ZQoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBuaWwgb24gc3VjY2VzczsgcmVhbG0gb3Igc3RvcmFnZSBhdXRob3JpemF0aW9uIGVycm9yIG90aGVyd2lzZQoJUmVtb3ZlUGVuZGluZ1Byb3RvY29sRmVlKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcpIGVycm9yCn0KGooPCgt1cGdyYWRlLmdubxL6DnBhY2thZ2Ugcm91dGVyCgppbXBvcnQgKAoJImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCikKCi8vIFJlZ2lzdGVySW5pdGlhbGl6ZXIgcmVnaXN0ZXJzIGEgbmV3IHJvdXRlciBpbXBsZW1lbnRhdGlvbiB2ZXJzaW9uLgovLyBFYWNoIGltcGxlbWVudGF0aW9uIHBhY2thZ2UgY2FsbHMgaXQgZHVyaW5nIGluaXRpYWxpemF0aW9uIGJlZm9yZSBpdCBjYW4gYmUgc2VsZWN0ZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IGN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbQovLyAgIC0gaW5pdGlhbGl6ZXI6IGNhbGxiYWNrIHRoYXQgcmVjZWl2ZXMgdGhlIHByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dCBhbmQgcm91dGVyIHN0b3JlLCB0aGVuIGNvbnN0cnVjdHMgdGhlIElSb3V0ZXIgaW1wbGVtZW50YXRpb24KZnVuYyBSZWdpc3RlckluaXRpYWxpemVyKGN1ciByZWFsbSwgaW5pdGlhbGl6ZXIgZnVuYyhfIGludCwgcmxtIHJlYWxtLCByb3V0ZXJTdG9yZSBJUm91dGVyU3RvcmUpIElSb3V0ZXIpIHsKCWluaXRpYWxpemVyRnVuYyA6PSBmdW5jKF8gaW50LCBybG0gcmVhbG0sIGRvbWFpblN0b3JlIGFueSkgYW55IHsKCQlhY2Nlc3MuQXNzZXJ0SXNSbG1DdXJyZW50KDAsIHJsbSkKCgkJY3VycmVudFJvdXRlclN0b3JlLCBvayA6PSBkb21haW5TdG9yZS4oSVJvdXRlclN0b3JlKQoJCWlmICFvayB7CgkJCXBhbmljKCJkb21haW5TdG9yZSBpcyBub3QgYW4gSVJvdXRlclN0b3JlIikKCQl9CgoJCXJldHVybiBpbml0aWFsaXplcigwLCBybG0sIGN1cnJlbnRSb3V0ZXJTdG9yZSkKCX0KCgllcnIgOj0gdmVyc2lvbk1hbmFnZXIuUmVnaXN0ZXJJbml0aWFsaXplcigwLCBjdXIsIGluaXRpYWxpemVyRnVuYykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgllcnIgPSB1cGRhdGVJbXBsZW1lbnRhdGlvbigpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cn0KCi8vIFVwZ3JhZGVJbXBsIHN3aXRjaGVzIHRoZSBhY3RpdmUgcm91dGVyIGltcGxlbWVudGF0aW9uIHRvIGEgZGlmZmVyZW50IHJlZ2lzdGVyZWQgdmVyc2lvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogY3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtCi8vICAgLSBwYWNrYWdlUGF0aDogcGFja2FnZSBwYXRoIG9mIHRoZSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgaW1wbGVtZW50YXRpb24gdG8gYWN0aXZhdGUKZnVuYyBVcGdyYWRlSW1wbChjdXIgcmVhbG0sIHBhY2thZ2VQYXRoIHN0cmluZykgewoJLy8gRW5zdXJlIG9ubHkgYWRtaW4gb3IgZ292ZXJuYW5jZSBjYW4gcGVyZm9ybSB1cGdyYWRlcwoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJYWNjZXNzLkFzc2VydElzQWRtaW5PckdvdmVybmFuY2UoY2FsbGVyKQoKCWVyciA6PSB2ZXJzaW9uTWFuYWdlci5DaGFuZ2VJbXBsZW1lbnRhdGlvbigwLCBjdXIsIHBhY2thZ2VQYXRoKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCWVyciA9IHVwZGF0ZUltcGxlbWVudGF0aW9uKCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KfQoKLy8gR2V0SW1wbGVtZW50YXRpb25QYWNrYWdlUGF0aCByZXR1cm5zIHRoZSBwYWNrYWdlIHBhdGggb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgaW1wbGVtZW50YXRpb24uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwYWNrYWdlUGF0aDogcGFja2FnZSBwYXRoIG9mIHRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24KZnVuYyBHZXRJbXBsZW1lbnRhdGlvblBhY2thZ2VQYXRoKCkgc3RyaW5nIHsKCXJldHVybiB2ZXJzaW9uTWFuYWdlci5HZXRDdXJyZW50UGFja2FnZVBhdGgoKQp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbBIRCLDKjC4SCjQ4MzM4dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDBJzVBMPi0jqizwud5so4H6Lp9Zc4oYF/2VGlIjXCuuESQOfE+K7OP9+SeyUiJ3ViR6u4O6vNprFD5x+CqQZGGfZaPd1ew525Ft2Wvgr2b+4fiFAPHyhxPzJir/37gcLq7LQaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data