Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
16F8D6439ED00501EBBB78B71BB7F236076DF2C6E5767AF8BA321F5783EF4DDF
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
250,000,000
Requested gas limit
GAS USED
47,288,847
Gas consumed
FEE
1000000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1n4pl5uc4yt5r96m9w6fmdznx3x0jyg8l6arhmt90000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CrmUAgoML3ZtLm1fYWRkcGtnEqeUAgooZzFuNHBsNXVjNHl0NXI5Nm05dzZmbWR6bngzeDBqeWc4bDZhcmhtdBLqkwIKCmJhemFhcmdlbnMSR2duby5sYW5kL3IvZzFuNHBsNXVjNHl0NXI5Nm05dzZmbWR6bngzeDBqeWc4bDZhcmhtdC9iYXphYXIvYy9iYXphYXJnZW5zGpLzAQoOYmF6YWFyZ2Vucy5nbm8S/vIBcGFja2FnZSBiYXphYXJnZW5zCgovLyBNYWlubmV0IGZhY3RvcnkgdGVtcGxhdGU6IGdlbmVzaXMgcC9udC9ncmM3MjEgc28gQWRlbmEgaW5kZXhlcyBOZXdUb2tlbi9UcmFuc2ZlciwKLy8gcGx1cyBMaXN0L0J1eSBlc2Nyb3cgb24gdGhpcyByZWFsbS4gTGlzdGVkIE93bmVyT2YgaXMgdGhlIGNvbGxlY3Rpb24gKHdhbGxldCBoaWRlcwovLyB0aGUgdG9rZW4gdW50aWwgQ2FuY2VsIG9yIEJ1eSkuIERvIG5vdCBpbXBvcnQgcC9iYXphYXIvZ3JjNzIxIGhlcmUuCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL2JhbmtlciIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJlcnJvcnMiCgkic3RyY29udiIKCSJzdHJpbmdzIgoJInRpbWUiCgoJImduby5sYW5kL3AvbnQvZ3JjNzIxL21ldGFkYXRhL3YwIgoJImduby5sYW5kL3AvbnQvZ3JjNzIxL3YwIgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvc2VxaWQvdjAiCglmYWN0b3J5ICJnbm8ubGFuZC9yL2cxbjRwbDV1YzR5dDVyOTZtOXc2Zm1kem54M3gwanlnOGw2YXJobXQvYmF6YWFyL2JhemFhcnY1IgopCgpjb25zdCAoCgltYXhOYW1lTGVuICAgICAgPSA2NAoJbWF4SW1hZ2VMZW4gICAgID0gMjAwCgltYXhTdXBwbHlCb3VuZCAgPSAxXzAwMF8wMDAKCW1heFJveWFsdHlCcHMgICA9IDEwMDAKCW5hdGl2ZURlbm9tICAgICA9ICJ1Z25vdCIKCXB1YmxpY09yaWdpbiAgICA9ICJodHRwczovL2JhemFhci1nbm8udmVyY2VsLmFwcCIKCWRyb3BBZGRDYXAgICAgICA9IDIwCglkcm9wU2xvdEhhcmRDYXAgPSAxMDAwMAoJYWxsb3dBZGRDYXAgICAgID0gNTAKCW1pblNsdWdMZW4gICAgICA9IDIKKQoKdHlwZSBpdGVtIHN0cnVjdCB7CglpZCAgICAgICBpbnQKCW5hbWUgICAgIHN0cmluZwoJaW1hZ2UgICAgc3RyaW5nCglvd25lciAgICBhZGRyZXNzCglzZWxsZXIgICBhZGRyZXNzCglwcmljZSAgICBpbnQ2NAoJbGlzdGVkICAgYm9vbAoJcmFyaXR5ICAgc3RyaW5nCgl0cmFpdHMgICBzdHJpbmcKCXJldmVhbGVkIGJvb2wKCXNsb3QgICAgIGludAp9Cgp0eXBlIGRyb3BTbG90IHN0cnVjdCB7CgluYW1lICAgc3RyaW5nCglpbWFnZSAgc3RyaW5nCglyYXJpdHkgc3RyaW5nCgl0cmFpdHMgc3RyaW5nCn0KCnR5cGUgcGhhc2VDb3VudCBzdHJ1Y3QgewoJd2wgIGludAoJcHViIGludAp9Cgp2YXIgKAoJaXRlbXMgICAgICBhdmwuVHJlZQoJZHJvcFNsb3RzICBhdmwuVHJlZQoJYWxsb3dsaXN0ICBhdmwuVHJlZQoJbWludGVkQnkgICBhdmwuVHJlZQoJdG9rZW4gICAgICAqZ3JjNzIxLlRva2VuCglsZWRnZXIgICAgICpncmM3MjEuUHJpdmF0ZUxlZGdlcgoJbWV0YVZpZXcgICAqbWV0YWRhdGEuTWV0YWRhdGEKCW1ldGFMZWQgICAgKm1ldGFkYXRhLkxlZGdlcgoJdG9rZW5TZXEgICBzZXFpZC5JRAoJbmV4dElEICAgICBpbnQKCW1pbnRlZCAgICAgaW50Cglsb2FkZWQgICAgIGludAoJYWxsb3dOICAgICBpbnQKCW1pbnRDYXAgICAgaW50Cgl3bE1pbnRDYXAgIGludAoJcHViTWludENhcCBpbnQKCW1heFN1cHBseSAgaW50CgltaW50UHJpY2UgIGludDY0Cgl3bFByaWNlICAgICBpbnQ2NAoJd2xTdXBwbHkgICAgaW50Cgl3bFN0YXJ0ICAgICAgaW50NjQKCXdsRW5kICAgICAgICBpbnQ2NAoJcHVibGljU3RhcnQgIGludDY0CglwdWJsaWNFbmQgICAgaW50NjQKCXB1YmxpY0ZvcmNlZCBib29sCglyb3lhbHR5QnBzICAgaW50CglwYXVzZWQgICAgIGJvb2wKCWhpZGRlbiAgICAgYm9vbAoJaW5pdGVkICAgICBib29sCgljcmVhdG9yICAgIGFkZHJlc3MKCXNlbGYgICAgICAgYWRkcmVzcwoJY29sTmFtZSAgICBzdHJpbmcKCWNvbFN5bWJvbCAgc3RyaW5nCgljb2xDb3ZlciAgIHN0cmluZwoJcHJlcmV2ZWFsICBzdHJpbmcKCXNsdWcgICAgICAgc3RyaW5nCikKCmZ1bmMgSW5pdChjdXIgcmVhbG0sIG5hbWUsIHN5bWJvbCwgY292ZXIgc3RyaW5nLCBtYXhTdXBwbHlOIGludCwgbWludFByaWNlVWdub3QgaW50NjQsIHJveWFsdHkgaW50NjQpIHsKCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgewoJCXBhbmljKCJjb2w6IEVPQSBvbmx5IikKCX0KCWlmICFjdXIuSXNDdXJyZW50KCkgewoJCXBhbmljKCJjb2w6IHNwb29mZWQgcmVhbG0iKQoJfQoJaWYgbGVuKHN5bWJvbCkgPCAxIHx8IGxlbihzeW1ib2wpID4gZ3JjNzIxLk1heFN5bWJvbExlbiB7CgkJcGFuaWMoImNvbDogc3ltYm9sIikKCX0KCXBhdGhTbHVnIDo9IGxhc3RFbGVtKGN1ci5Qa2dQYXRoKCkpCglpZiAhdmFsaWRQa2dOYW1lKHBhdGhTbHVnKSB7CgkJcGFuaWMoImNvbDogc2x1ZyIpCgl9CglpZiBtYXhTdXBwbHlOIDwgMCB8fCBtYXhTdXBwbHlOID4gbWF4U3VwcGx5Qm91bmQgewoJCXBhbmljKCJjb2w6IG1heFN1cHBseSIpCgl9CglpZiBtaW50UHJpY2VVZ25vdCA8IDAgewoJCXBhbmljKCJjb2w6IG1pbnRQcmljZSIpCgl9CglpZiByb3lhbHR5IDwgMCB8fCByb3lhbHR5ID4gbWF4Um95YWx0eUJwcyB7CgkJcGFuaWMoImNvbDogcm95YWx0eSIpCgl9CglpZiAhdmFsaWROYW1lKG5hbWUpIHsKCQlwYW5pYygiY29sOiBuYW1lIikKCX0KCWlmICF2YWxpZEltYWdlKGNvdmVyKSB7CgkJcGFuaWMoImNvbDogY292ZXIiKQoJfQoJaWYgaW5pdGVkIHsKCQlwYW5pYygiY29sOiBhbHJlYWR5IGluaXRpYWxpemVkIikKCX0KCXNsdWcgPSBwYXRoU2x1ZwoJcmVzZXJ2ZWRXaG8gOj0gZmFjdG9yeS5SZXNlcnZlZENyZWF0b3Ioc2x1ZykKCWlmIHJlc2VydmVkV2hvID09ICIiIHx8IHJlc2VydmVkV2hvICE9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKS5TdHJpbmcoKSB7CgkJcGFuaWMoImNvbDogcmVzZXJ2ZSBmaXJzdCIpCgl9Cgl0YWtlRXhhY3QoMCkKCXRvaywgbGVkIDo9IGdyYzcyMS5OZXdUb2tlbihuYW1lLCBzeW1ib2wsIHRva2VuU2VxLk5leHQoKSwgY3VyKQoJdG9rZW4gPSB0b2sKCWxlZGdlciA9IGxlZAoJbWV0YVZpZXcsIG1ldGFMZWQgPSBtZXRhZGF0YS5OZXdNZXRhZGF0YShsZWQpCgljcmVhdG9yID0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglzZWxmID0gY3VyLkFkZHJlc3MoKQoJY29sTmFtZSA9IG5hbWUKCWNvbFN5bWJvbCA9IHN5bWJvbAoJY29sQ292ZXIgPSBjb3ZlcgoJcHJlcmV2ZWFsID0gIiIKCW1heFN1cHBseSA9IG1heFN1cHBseU4KCW1pbnRQcmljZSA9IG1pbnRQcmljZVVnbm90Cglyb3lhbHR5QnBzID0gaW50KHJveWFsdHkpCglpdGVtcyA9IGF2bC5UcmVle30KCWRyb3BTbG90cyA9IGF2bC5UcmVle30KCWFsbG93bGlzdCA9IGF2bC5UcmVle30KCW1pbnRlZEJ5ID0gYXZsLlRyZWV7fQoJbG9hZGVkID0gMAoJYWxsb3dOID0gMAoJbWludENhcCA9IDAKCXdsTWludENhcCA9IDAKCXB1Yk1pbnRDYXAgPSAwCgl3bFByaWNlID0gMAoJd2xTdXBwbHkgPSAwCgl3bFN0YXJ0ID0gMAoJd2xFbmQgPSAwCglwdWJsaWNTdGFydCA9IDAKCXB1YmxpY0VuZCA9IDAKCXB1YmxpY0ZvcmNlZCA9IGZhbHNlCgloaWRkZW4gPSBmYWxzZQoJcGF1c2VkID0gbWF4U3VwcGx5TiA+IDAKCWluaXRlZCA9IHRydWUKCWZhY3RvcnkuUmVnaXN0ZXIoY3Jvc3MoY3VyKSwgbmFtZSwgc3ltYm9sLCBjb3ZlciwgbWF4U3VwcGx5TiwgbWludFByaWNlVWdub3QsIHJveWFsdHkpCgljaGFpbi5FbWl0KCJJbml0IiwgImNyZWF0b3IiLCBjcmVhdG9yLlN0cmluZygpLCAic2x1ZyIsIHNsdWcpCn0KCmZ1bmMgTWludChjdXIgcmVhbG0sIG5hbWUsIGltYWdlVVJMIHN0cmluZykgaW50IHsKCWNhbGxlciA6PSByZXF1aXJlVXNlcihjdXIpCglpZiBjYWxsZXIgIT0gY3JlYXRvciB7CgkJcGFuaWMoImNvbDogbm90IGNyZWF0b3IiKQoJfQoJaWQgOj0gbWludFRvKGN1ciwgY2FsbGVyLCBuYW1lLCBpbWFnZVVSTCkKCXdyaXRlVG9rZW5NZXRhKGlkKQoJY2hhaW4uRW1pdCgiTWludCIsICJpZCIsIHN0cmNvbnYuSXRvYShpZCksICJvd25lciIsIGNhbGxlci5TdHJpbmcoKSkKCXJldHVybiBpZAp9CgpmdW5jIFB1YmxpY01pbnQoY3VyIHJlYWxtKSBpbnQgewoJY2FsbGVyIDo9IHJlcXVpcmVVc2VyKGN1cikKCWlmIHBhdXNlZCB7CgkJcGFuaWMoImNvbDogcGF1c2VkIikKCX0KCWlmIG1pbnRQaGFzZSh0aW1lLk5vdygpLlVuaXgoKSkgPT0gImNsb3NlZCIgewoJCXBhbmljKCJjb2w6IG5vdCBvcGVuIikKCX0KCXJlcXVpcmVBbGxvdyhjYWxsZXIpCgljaGVja01pbnRDYXAoY2FsbGVyKQoJaWYgbWF4U3VwcGx5ID4gMCAmJiBsb2FkZWQgPT0gMCB7CgkJcGFuaWMoImNvbDogbm8gc2xvdCIpCgl9CglwYXkgOj0gbWludFByaWNlCglpZiB3bFBoYXNlKCkgewoJCXBheSA9IHdsUHJpY2UKCX0KCXRha2VFeGFjdChwYXkpCgluYW1lIDo9IGNvbE5hbWUgKyAiICMiICsgc3RyY29udi5JdG9hKG1pbnRlZCsxKQoJaW1hZ2UgOj0gcHVibGljSW1hZ2UoKQoJdmFyIHNsb3QgKmRyb3BTbG90CglzbG90SW5kZXggOj0gLTEKCWlmIGxvYWRlZCA+IDAgewoJCWlmIG1pbnRlZCA+PSBsb2FkZWQgewoJCQlwYW5pYygiY29sOiBubyBzbG90IikKCQl9CgkJdiA6PSBkcm9wU2xvdHMuR2V0KHNsb3RLZXkobWludGVkKSkKCQlpZiB2ID09IG5pbCB7CgkJCXBhbmljKCJjb2w6IG5vIHNsb3QiKQoJCX0KCQlzbG90ID0gdi4oKmRyb3BTbG90KQoJCXNsb3RJbmRleCA9IG1pbnRlZAoJCWlmIGhpZGRlbiB7CgkJCW5hbWUgPSAiVW5yZXZlYWxlZCIKCQkJaW1hZ2UgPSBwcmVyZXZlYWxJbWFnZSgpCgkJfSBlbHNlIHsKCQkJbmFtZSA9IHNsb3QubmFtZQoJCQlpbWFnZSA9IHNsb3QuaW1hZ2UKCQl9Cgl9CglpZCA6PSBtaW50VG8oY3VyLCBjYWxsZXIsIG5hbWUsIGltYWdlKQoJaWYgc2xvdCAhPSBuaWwgewoJCWlmIGhpZGRlbiB7CgkJCWl0IDo9IG11c3RJdGVtKGlkKQoJCQlpdC5yZXZlYWxlZCA9IGZhbHNlCgkJCWl0LnNsb3QgPSBzbG90SW5kZXgKCQkJaXRlbXMuU2V0KGl0ZW1LZXkoaWQpLCBpdCkKCQl9IGVsc2UgewoJCQlhcHBseVNsb3QoaWQsIHNsb3QsIHNsb3RJbmRleCkKCQl9Cgl9Cgl3cml0ZVRva2VuTWV0YShpZCkKCW5vdGVNaW50KGNhbGxlcikKCWlmIHBheSA+IDAgewoJCWJrIDo9IGJhbmtlci5OZXdCYW5rZXIoYmFua2VyLkJhbmtlclR5cGVSZWFsbVNlbmQsIGN1cikKCQliay5TZW5kQ29pbnMoc2VsZiwgY3JlYXRvciwgY2hhaW4uQ29pbnN7e0Rlbm9tOiBuYXRpdmVEZW5vbSwgQW1vdW50OiBwYXl9fSkKCX0KCWNoYWluLkVtaXQoIlB1YmxpY01pbnQiLCAiaWQiLCBzdHJjb252Lkl0b2EoaWQpLCAibiIsIHN0cmNvbnYuSXRvYShtaW50ZWQpKQoJcmV0dXJuIGlkCn0KCmZ1bmMgQWRkRHJvcEl0ZW1zKGN1ciByZWFsbSwgYmxvYiBzdHJpbmcpIHsKCWNhbGxlciA6PSByZXF1aXJlVXNlcihjdXIpCglpZiBjYWxsZXIgIT0gY3JlYXRvciB7CgkJcGFuaWMoImNvbDogbm90IGNyZWF0b3IiKQoJfQoJbGluZXMgOj0gc3BsaXREcm9wTGluZXMoYmxvYikKCWlmIGxlbihsaW5lcykgPCAxIHx8IGxlbihsaW5lcykgPiBkcm9wQWRkQ2FwIHsKCQlwYW5pYygiY29sOiBzbG90cyIpCgl9CglpZiBsb2FkZWQrbGVuKGxpbmVzKSA+IHNsb3RDYXAoKSB7CgkJcGFuaWMoImNvbDogc2xvdHMiKQoJfQoJZm9yIF8sIGxpbmUgOj0gcmFuZ2UgbGluZXMgewoJCW5hbWUsIGltYWdlLCByYXJpdHksIHRyYWl0cyA6PSBwYXJzZURyb3BMaW5lKGxpbmUpCgkJaWYgIXZhbGlkTmFtZShuYW1lKSB7CgkJCXBhbmljKCJjb2w6IG5hbWUiKQoJCX0KCQlpZiAhdmFsaWRJbWFnZShpbWFnZSkgewoJCQlwYW5pYygiY29sOiBpbWFnZSIpCgkJfQoJCWlmICF2YWxpZFJhcml0eShyYXJpdHkpIHsKCQkJcGFuaWMoImNvbDogcmFyaXR5IikKCQl9CgkJaWYgIXZhbGlkVHJhaXRzKHRyYWl0cykgewoJCQlwYW5pYygiY29sOiB0cmFpdHMiKQoJCX0KCQlkcm9wU2xvdHMuU2V0KHNsb3RLZXkobG9hZGVkKSwgJmRyb3BTbG90e25hbWU6IG5hbWUsIGltYWdlOiBpbWFnZSwgcmFyaXR5OiByYXJpdHksIHRyYWl0czogdHJhaXRzfSkKCQlsb2FkZWQrKwoJfQoJY2hhaW4uRW1pdCgiQWRkRHJvcEl0ZW1zIiwgInNsdWciLCBzbHVnLCAibG9hZGVkIiwgc3RyY29udi5JdG9hKGxvYWRlZCkpCn0KCmZ1bmMgTGlzdERyb3BTbG90cygpIHN0cmluZyB7CglyZXF1aXJlSW5pdCgpCglpZiBoaWRkZW4gewoJCXJldHVybiAiIgoJfQoJb3V0IDo9ICIiCglmb3IgaSA6PSAwOyBpIDwgbG9hZGVkOyBpKysgewoJCXYgOj0gZHJvcFNsb3RzLkdldChzbG90S2V5KGkpKQoJCWlmIHYgPT0gbmlsIHsKCQkJY29udGludWUKCQl9CgkJcyA6PSB2LigqZHJvcFNsb3QpCgkJaWYgb3V0ICE9ICIiIHsKCQkJb3V0ICs9ICJcbiIKCQl9CgkJb3V0ICs9IHN0cmNvbnYuSXRvYShpKSArICJ8IiArIHMubmFtZSArICJ8IiArIHMuaW1hZ2UgKyAifCIgKyBzLnJhcml0eSArICJ8IiArIHMudHJhaXRzCgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgTG9hZGVkT2YoKSBpbnQgewoJcmVxdWlyZUluaXQoKQoJcmV0dXJuIGxvYWRlZAp9CgpmdW5jIFBhdXNlTWludChjdXIgcmVhbG0pIHsKCWNhbGxlciA6PSByZXF1aXJlVXNlcihjdXIpCglpZiBjYWxsZXIgIT0gY3JlYXRvciB7CgkJcGFuaWMoImNvbDogbm90IGNyZWF0b3IiKQoJfQoJcGF1c2VkID0gdHJ1ZQoJY2hhaW4uRW1pdCgiUGF1c2VNaW50IiwgInNsdWciLCBzbHVnKQp9CgpmdW5jIFJlc3VtZU1pbnQoY3VyIHJlYWxtKSB7CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJaWYgY2FsbGVyICE9IGNyZWF0b3IgewoJCXBhbmljKCJjb2w6IG5vdCBjcmVhdG9yIikKCX0KCWlmIG1heFN1cHBseSA+IDAgJiYgbG9hZGVkIDwgMSB7CgkJcGFuaWMoImNvbDogbm8gc2xvdCIpCgl9CglwYXVzZWQgPSBmYWxzZQoJY2hhaW4uRW1pdCgiUmVzdW1lTWludCIsICJzbHVnIiwgc2x1ZykKfQoKZnVuYyBBZGRBbGxvd2xpc3QoY3VyIHJlYWxtLCBibG9iIHN0cmluZykgewoJY2FsbGVyIDo9IHJlcXVpcmVVc2VyKGN1cikKCWlmIGNhbGxlciAhPSBjcmVhdG9yIHsKCQlwYW5pYygiY29sOiBub3QgY3JlYXRvciIpCgl9CglsaW5lcyA6PSBzcGxpdERyb3BMaW5lcyhibG9iKQoJaWYgbGVuKGxpbmVzKSA8IDEgfHwgbGVuKGxpbmVzKSA+IGFsbG93QWRkQ2FwIHsKCQlwYW5pYygiY29sOiBhbGxvd2xpc3QiKQoJfQoJZm9yIF8sIGxpbmUgOj0gcmFuZ2UgbGluZXMgewoJCXdobyA6PSBzdHJpbmdzLlRvTG93ZXIoc3RyaW5ncy5UcmltU3BhY2UobGluZSkpCgkJaWYgIXZhbGlkRzEod2hvKSB7CgkJCXBhbmljKCJjb2w6IGFkZHJlc3MiKQoJCX0KCQlpZiBhbGxvd2xpc3QuR2V0KHdobykgIT0gbmlsIHsKCQkJY29udGludWUKCQl9CgkJYWxsb3dsaXN0LlNldCh3aG8sIHRydWUpCgkJYWxsb3dOKysKCX0KCWNoYWluLkVtaXQoIkFkZEFsbG93bGlzdCIsICJuIiwgc3RyY29udi5JdG9hKGFsbG93TikpCn0KCmZ1bmMgQWxsb3dOKCkgaW50IHsKCXJlcXVpcmVJbml0KCkKCXJldHVybiBhbGxvd04KfQoKZnVuYyBPbkFsbG93bGlzdChhZGRyIHN0cmluZykgYm9vbCB7CglyZXF1aXJlSW5pdCgpCgl3aG8gOj0gc3RyaW5ncy5Ub0xvd2VyKHN0cmluZ3MuVHJpbVNwYWNlKGFkZHIpKQoJcmV0dXJuIGFsbG93bGlzdC5HZXQod2hvKSAhPSBuaWwKfQoKZnVuYyBTZXREcm9wU2FsZShjdXIgcmVhbG0sIHdsUHJpY2VVZ25vdCBpbnQ2NCwgd2xRdHkgaW50KSB7CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJaWYgY2FsbGVyICE9IGNyZWF0b3IgewoJCXBhbmljKCJjb2w6IG5vdCBjcmVhdG9yIikKCX0KCWlmIG1pbnRlZCA+IDAgewoJCXBhbmljKCJjb2w6IG1pbnRlZCIpCgl9CglpZiB3bFByaWNlVWdub3QgPCAwIHsKCQlwYW5pYygiY29sOiB3bFByaWNlIikKCX0KCWlmIHdsUXR5IDwgMCB7CgkJcGFuaWMoImNvbDogd2xTdXBwbHkiKQoJfQoJaWYgbWF4U3VwcGx5ID4gMCAmJiB3bFF0eSA+IG1heFN1cHBseSB7CgkJcGFuaWMoImNvbDogd2xTdXBwbHkiKQoJfQoJd2xQcmljZSA9IHdsUHJpY2VVZ25vdAoJd2xTdXBwbHkgPSB3bFF0eQoJY2hhaW4uRW1pdCgiU2V0RHJvcFNhbGUiLCAid2xTdXBwbHkiLCBzdHJjb252Lkl0b2Eod2xRdHkpKQp9CgpmdW5jIFN0YXJ0UHVibGljKGN1ciByZWFsbSkgewoJY2FsbGVyIDo9IHJlcXVpcmVVc2VyKGN1cikKCWlmIGNhbGxlciAhPSBjcmVhdG9yIHsKCQlwYW5pYygiY29sOiBub3QgY3JlYXRvciIpCgl9CglpZiB3bFN1cHBseSA8PSAwIHx8IG1pbnRlZCA+PSB3bFN1cHBseSB7CgkJcGFuaWMoImNvbDogcHVibGljIikKCX0KCXB1YmxpY0ZvcmNlZCA9IHRydWUKCXdsU3VwcGx5ID0gbWludGVkCglub3cgOj0gdGltZS5Ob3coKS5Vbml4KCkKCWlmIHdsU3RhcnQgPiBub3cgewoJCXdsU3RhcnQgPSBub3cKCX0KCWlmIHB1YmxpY1N0YXJ0ID4gbm93IHsKCQlwdWJsaWNTdGFydCA9IG5vdwoJfQoJaWYgcHVibGljRW5kID4gMCAmJiBwdWJsaWNFbmQgPD0gbm93IHsKCQlwdWJsaWNFbmQgPSAwCgl9CgljaGFpbi5FbWl0KCJTdGFydFB1YmxpYyIsICJtaW50ZWQiLCBzdHJjb252Lkl0b2EobWludGVkKSkKfQoKLy8gU2V0TWludFNjaGVkdWxlIHNldHMgdW5peC1zZWNvbmQgYm91bmRzIGZvciBib3RoIHJvdW5kcy4gMCwwLDAsMCBjbGVhcnMgdGhlIGNsb2NrLgovLyBBbiBlbmQgb2YgMCBtZWFucyB0aGF0IHJvdW5kIGhhcyBubyBoYXJkIGNsb3NlLiB3bFN0YXJ0ID4gMCByZXF1aXJlcyBwdWJsaWNTdGFydCA+IHdsU3RhcnQuCi8vIEEgc2V0IGVuZCBtdXN0IGJlIGFmdGVyIGl0cyBvd24gc3RhcnQuIHB1YmxpY1N0YXJ0IG11c3Qgbm90IGZhbGwgaW5zaWRlIHRoZSB3aGl0ZWxpc3Qgd2luZG93LgovLyBMb2NrZWQgb25jZSBhbnkgdG9rZW4gaGFzIG1pbnRlZC4KZnVuYyBTZXRNaW50U2NoZWR1bGUoY3VyIHJlYWxtLCB3bFN0YXJ0VW5peCwgd2xFbmRVbml4LCBwdWJsaWNTdGFydFVuaXgsIHB1YmxpY0VuZFVuaXggaW50NjQpIHsKCWNhbGxlciA6PSByZXF1aXJlVXNlcihjdXIpCglpZiBjYWxsZXIgIT0gY3JlYXRvciB7CgkJcGFuaWMoImNvbDogbm90IGNyZWF0b3IiKQoJfQoJaWYgbWludGVkID4gMCB7CgkJcGFuaWMoImNvbDogbWludGVkIikKCX0KCWlmIHdsU3RhcnRVbml4IDwgMCB8fCB3bEVuZFVuaXggPCAwIHx8IHB1YmxpY1N0YXJ0VW5peCA8IDAgfHwgcHVibGljRW5kVW5peCA8IDAgewoJCXBhbmljKCJjb2w6IHNjaGVkdWxlIikKCX0KCWlmIHdsU3RhcnRVbml4ID09IDAgJiYgd2xFbmRVbml4ID09IDAgJiYgcHVibGljU3RhcnRVbml4ID09IDAgJiYgcHVibGljRW5kVW5peCA9PSAwIHsKCQl3bFN0YXJ0ID0gMAoJCXdsRW5kID0gMAoJCXB1YmxpY1N0YXJ0ID0gMAoJCXB1YmxpY0VuZCA9IDAKCQljaGFpbi5FbWl0KCJTZXRNaW50U2NoZWR1bGUiLCAid2xTdGFydCIsICIwIiwgIndsRW5kIiwgIjAiLCAicHVibGljU3RhcnQiLCAiMCIsICJwdWJsaWNFbmQiLCAiMCIpCgkJcmV0dXJuCgl9CglpZiB3bFN0YXJ0VW5peCA+IDAgJiYgcHVibGljU3RhcnRVbml4IDw9IHdsU3RhcnRVbml4IHsKCQlwYW5pYygiY29sOiBzY2hlZHVsZSIpCgl9CglpZiB3bEVuZFVuaXggPiAwICYmICh3bFN0YXJ0VW5peCA9PSAwIHx8IHdsRW5kVW5peCA8PSB3bFN0YXJ0VW5peCkgewoJCXBhbmljKCJjb2w6IHNjaGVkdWxlIikKCX0KCWlmIHB1YmxpY0VuZFVuaXggPiAwICYmIChwdWJsaWNTdGFydFVuaXggPT0gMCB8fCBwdWJsaWNFbmRVbml4IDw9IHB1YmxpY1N0YXJ0VW5peCkgewoJCXBhbmljKCJjb2w6IHNjaGVkdWxlIikKCX0KCWlmIHdsRW5kVW5peCA+IDAgJiYgcHVibGljU3RhcnRVbml4ID4gMCAmJiBwdWJsaWNTdGFydFVuaXggPCB3bEVuZFVuaXggewoJCXBhbmljKCJjb2w6IHNjaGVkdWxlIikKCX0KCXdsU3RhcnQgPSB3bFN0YXJ0VW5peAoJd2xFbmQgPSB3bEVuZFVuaXgKCXB1YmxpY1N0YXJ0ID0gcHVibGljU3RhcnRVbml4CglwdWJsaWNFbmQgPSBwdWJsaWNFbmRVbml4CgljaGFpbi5FbWl0KAoJCSJTZXRNaW50U2NoZWR1bGUiLAoJCSJ3bFN0YXJ0Iiwgc3RyY29udi5Gb3JtYXRJbnQod2xTdGFydFVuaXgsIDEwKSwKCQkid2xFbmQiLCBzdHJjb252LkZvcm1hdEludCh3bEVuZFVuaXgsIDEwKSwKCQkicHVibGljU3RhcnQiLCBzdHJjb252LkZvcm1hdEludChwdWJsaWNTdGFydFVuaXgsIDEwKSwKCQkicHVibGljRW5kIiwgc3RyY29udi5Gb3JtYXRJbnQocHVibGljRW5kVW5peCwgMTApLAoJKQp9CgpmdW5jIE1pbnRTY2hlZHVsZU9mKCkgc3RyaW5nIHsKCXJlcXVpcmVJbml0KCkKCXJldHVybiBzdHJjb252LkZvcm1hdEludCh3bFN0YXJ0LCAxMCkgKyAifCIgKyBzdHJjb252LkZvcm1hdEludCh3bEVuZCwgMTApICsgInwiICsgc3RyY29udi5Gb3JtYXRJbnQocHVibGljU3RhcnQsIDEwKSArICJ8IiArIHN0cmNvbnYuRm9ybWF0SW50KHB1YmxpY0VuZCwgMTApCn0KCmZ1bmMgU2V0TWludENhcChjdXIgcmVhbG0sIG4gaW50KSB7CglpZiBuIDwgMCB7CgkJcGFuaWMoImNvbDogbWludENhcCIpCgl9CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJaWYgY2FsbGVyICE9IGNyZWF0b3IgewoJCXBhbmljKCJjb2w6IG5vdCBjcmVhdG9yIikKCX0KCW1pbnRDYXAgPSBuCgljaGFpbi5FbWl0KCJTZXRNaW50Q2FwIiwgImNhcCIsIHN0cmNvbnYuSXRvYShuKSkKfQoKLy8gU2V0UGhhc2VNaW50Q2FwIHNldHMgaG93IG1hbnkgdGltZXMgb25lIHdhbGxldCBtYXkgUHVibGljTWludCBpbiBlYWNoIHJvdW5kLgovLyAwIG1lYW5zIHRoYXQgcm91bmQgaGFzIG5vIHBlci13YWxsZXQgbGltaXQuIENvdW50cyBhcmUgc2VwYXJhdGU6IGEgd2hpdGVsaXN0Ci8vIG1pbnQgZG9lcyBub3QgY29uc3VtZSB0aGUgcHVibGljIGFsbG93YW5jZS4gbWludENhcCBzdGlsbCBjYXBzIHRoZSB0b3RhbC4KZnVuYyBTZXRQaGFzZU1pbnRDYXAoY3VyIHJlYWxtLCB3bE4sIHB1Yk4gaW50KSB7CglpZiB3bE4gPCAwIHx8IHB1Yk4gPCAwIHsKCQlwYW5pYygiY29sOiBwaGFzZSBjYXAiKQoJfQoJY2FsbGVyIDo9IHJlcXVpcmVVc2VyKGN1cikKCWlmIGNhbGxlciAhPSBjcmVhdG9yIHsKCQlwYW5pYygiY29sOiBub3QgY3JlYXRvciIpCgl9Cgl3bE1pbnRDYXAgPSB3bE4KCXB1Yk1pbnRDYXAgPSBwdWJOCgljaGFpbi5FbWl0KCJTZXRQaGFzZU1pbnRDYXAiLCAid2wiLCBzdHJjb252Lkl0b2Eod2xOKSwgInB1YmxpYyIsIHN0cmNvbnYuSXRvYShwdWJOKSkKfQoKZnVuYyBTZXRNaW50UHJpY2UoY3VyIHJlYWxtLCBwcmljZVVnbm90IGludDY0KSB7CglpZiBwcmljZVVnbm90IDwgMCB7CgkJcGFuaWMoImNvbDogcHJpY2UiKQoJfQoJY2FsbGVyIDo9IHJlcXVpcmVVc2VyKGN1cikKCWlmIGNhbGxlciAhPSBjcmVhdG9yIHsKCQlwYW5pYygiY29sOiBub3QgY3JlYXRvciIpCgl9CgltaW50UHJpY2UgPSBwcmljZVVnbm90CgljaGFpbi5FbWl0KCJTZXRNaW50UHJpY2UiLCAicHJpY2UiLCBzdHJjb252LkZvcm1hdEludChwcmljZVVnbm90LCAxMCkpCn0KCmZ1bmMgTWludENhcE9mKCkgaW50IHsKCXJlcXVpcmVJbml0KCkKCXJldHVybiBtaW50Q2FwCn0KCmZ1bmMgUGhhc2VNaW50Q2FwT2YoKSBzdHJpbmcgewoJcmVxdWlyZUluaXQoKQoJcmV0dXJuIHN0cmNvbnYuSXRvYSh3bE1pbnRDYXApICsgInwiICsgc3RyY29udi5JdG9hKHB1Yk1pbnRDYXApCn0KCmZ1bmMgRHJvcFNhbGVPZigpIHN0cmluZyB7CglyZXF1aXJlSW5pdCgpCglyZXR1cm4gc3RyY29udi5JdG9hKHJveWFsdHlCcHMpICsgInwiICsgc3RyY29udi5Gb3JtYXRJbnQod2xQcmljZSwgMTApICsgInwiICsgc3RyY29udi5JdG9hKHdsU3VwcGx5KSArICJ8IiArIG1pbnRQaGFzZSh0aW1lLk5vdygpLlVuaXgoKSkgKyAifCIgKyBzdHJjb252LkZvcm1hdEludChtaW50UHJpY2UsIDEwKQp9CgpmdW5jIHdsUGhhc2UoKSBib29sIHsKCXJldHVybiBtaW50UGhhc2UodGltZS5Ob3coKS5Vbml4KCkpID09ICJ3aGl0ZWxpc3QiCn0KCi8vIG1pbnRQaGFzZSBpcyBjbG9zZWQsIHdoaXRlbGlzdCwgb3IgcHVibGljLiBBIGZ1dHVyZSBwdWJsaWNTdGFydCBkb2VzIG5vdAovLyBmYWxsIHRocm91Z2ggdG8gcHVibGljIHByaWNlIHdoZW4gdGhlIGFsbG93bGlzdCBxdWFudGl0eSBpcyBhbHJlYWR5IHVzZWQuCi8vIEFmdGVyIHdsRW5kLCBhbmQgYWZ0ZXIgcHVibGljRW5kLCB0aGUgc2FsZSBpcyBjbG9zZWQgdW50aWwgdGhlIG5leHQgb3BlbiBib3VuZC4KZnVuYyBtaW50UGhhc2Uobm93IGludDY0KSBzdHJpbmcgewoJaWYgcHVibGljRm9yY2VkIHsKCQlpZiBwdWJsaWNFbmQgPiAwICYmIG5vdyA+PSBwdWJsaWNFbmQgewoJCQlyZXR1cm4gImNsb3NlZCIKCQl9CgkJcmV0dXJuICJwdWJsaWMiCgl9CglpZiB3bFN0YXJ0ID4gMCAmJiBub3cgPCB3bFN0YXJ0IHsKCQlyZXR1cm4gImNsb3NlZCIKCX0KCWlmIHB1YmxpY1N0YXJ0ID4gMCAmJiBub3cgPj0gcHVibGljU3RhcnQgewoJCWlmIHB1YmxpY0VuZCA+IDAgJiYgbm93ID49IHB1YmxpY0VuZCB7CgkJCXJldHVybiAiY2xvc2VkIgoJCX0KCQlyZXR1cm4gInB1YmxpYyIKCX0KCWlmIHB1YmxpY1N0YXJ0ID4gMCAmJiBub3cgPCBwdWJsaWNTdGFydCB7CgkJaWYgd2xFbmQgPiAwICYmIG5vdyA+PSB3bEVuZCB7CgkJCXJldHVybiAiY2xvc2VkIgoJCX0KCQlpZiB3bFN1cHBseSA+IDAgJiYgbWludGVkIDwgd2xTdXBwbHkgewoJCQlyZXR1cm4gIndoaXRlbGlzdCIKCQl9CgkJcmV0dXJuICJjbG9zZWQiCgl9CglpZiB3bEVuZCA+IDAgJiYgbm93ID49IHdsRW5kIHsKCQlyZXR1cm4gInB1YmxpYyIKCX0KCWlmIHdsU3VwcGx5ID4gMCAmJiBtaW50ZWQgPCB3bFN1cHBseSB7CgkJcmV0dXJuICJ3aGl0ZWxpc3QiCgl9CglyZXR1cm4gInB1YmxpYyIKfQoKZnVuYyByZXF1aXJlQWxsb3coY2FsbGVyIGFkZHJlc3MpIHsKCWlmIHB1YmxpY0ZvcmNlZCB7CgkJcmV0dXJuCgl9Cgl3aG8gOj0gc3RyaW5ncy5Ub0xvd2VyKGNhbGxlci5TdHJpbmcoKSkKCWlmIHdsUGhhc2UoKSB7CgkJaWYgYWxsb3dOIDw9IDAgewoJCQlwYW5pYygiY29sOiBhbGxvd2xpc3QiKQoJCX0KCQlpZiBhbGxvd2xpc3QuR2V0KHdobykgPT0gbmlsIHsKCQkJcGFuaWMoImNvbDogbm90IGFsbG93ZWQiKQoJCX0KCQlyZXR1cm4KCX0KCWlmIHdsU3VwcGx5ID4gMCB7CgkJcmV0dXJuCgl9CglpZiBhbGxvd04gPD0gMCB7CgkJcmV0dXJuCgl9CglpZiBhbGxvd2xpc3QuR2V0KHdobykgPT0gbmlsIHsKCQlwYW5pYygiY29sOiBub3QgYWxsb3dlZCIpCgl9Cn0KCmZ1bmMgd2FsbGV0UGhhc2Uod2hvIHN0cmluZykgcGhhc2VDb3VudCB7CglpZiB2IDo9IG1pbnRlZEJ5LkdldCh3aG8pOyB2ICE9IG5pbCB7CgkJcmV0dXJuIHYuKHBoYXNlQ291bnQpCgl9CglyZXR1cm4gcGhhc2VDb3VudHt9Cn0KCmZ1bmMgY2hlY2tNaW50Q2FwKGNhbGxlciBhZGRyZXNzKSB7Cgl3aG8gOj0gc3RyaW5ncy5Ub0xvd2VyKGNhbGxlci5TdHJpbmcoKSkKCWdvdCA6PSB3YWxsZXRQaGFzZSh3aG8pCglpZiBtaW50Q2FwID4gMCAmJiBnb3Qud2wrZ290LnB1YiA+PSBtaW50Q2FwIHsKCQlwYW5pYygiY29sOiBtaW50IGNhcCIpCgl9CglpZiB3bFBoYXNlKCkgewoJCWlmIHdsTWludENhcCA+IDAgJiYgZ290LndsID49IHdsTWludENhcCB7CgkJCXBhbmljKCJjb2w6IHdsIG1pbnQgY2FwIikKCQl9CgkJcmV0dXJuCgl9CglpZiBwdWJNaW50Q2FwID4gMCAmJiBnb3QucHViID49IHB1Yk1pbnRDYXAgewoJCXBhbmljKCJjb2w6IHB1YmxpYyBtaW50IGNhcCIpCgl9Cn0KCmZ1bmMgbm90ZU1pbnQoY2FsbGVyIGFkZHJlc3MpIHsKCXdobyA6PSBzdHJpbmdzLlRvTG93ZXIoY2FsbGVyLlN0cmluZygpKQoJZ290IDo9IHdhbGxldFBoYXNlKHdobykKCWlmIHdsUGhhc2UoKSB7CgkJZ290LndsKysKCX0gZWxzZSB7CgkJZ290LnB1YisrCgl9CgltaW50ZWRCeS5TZXQod2hvLCBnb3QpCn0KCmZ1bmMgSGlkZGVuKCkgYm9vbCB7CglyZXF1aXJlSW5pdCgpCglyZXR1cm4gaGlkZGVuCn0KCmZ1bmMgU2V0SGlkZGVuKGN1ciByZWFsbSwgaGlkZSBib29sKSB7CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJaWYgY2FsbGVyICE9IGNyZWF0b3IgewoJCXBhbmljKCJjb2w6IG5vdCBjcmVhdG9yIikKCX0KCWlmICFoaWRlIHsKCQlwYW5pYygiY29sOiByZXZlYWwiKQoJfQoJaWYgbG9hZGVkIDwgMSB7CgkJcGFuaWMoImNvbDogbm8gc2xvdHMiKQoJfQoJaWYgIWhpZGRlbiAmJiBtaW50ZWQgPiAwIHsKCQlwYW5pYygiY29sOiByZXZlYWxlZCIpCgl9CgloaWRkZW4gPSB0cnVlCgljaGFpbi5FbWl0KCJTZXRIaWRkZW4iLCAiaGlkZGVuIiwgInRydWUiKQp9CgovLyBTZXRQcmVyZXZlYWwgaXMgdGhlIGltYWdlIGV2ZXJ5IHNlYWxlZCBORlQgc2hvd3MuIEVtcHR5IHVzZXMgdGhlIGNvdmVyLgovLyBDcmVhdG9yIG9ubHkuIEFmdGVyIFJldmVhbENvbGxlY3Rpb24gdGhlIHJlYWwgc2xvdCBpbWFnZSBpcyBhbHJlYWR5IHB1YmxpYy4KZnVuYyBTZXRQcmVyZXZlYWwoY3VyIHJlYWxtLCBpbWFnZSBzdHJpbmcpIHsKCWNhbGxlciA6PSByZXF1aXJlVXNlcihjdXIpCglpZiBjYWxsZXIgIT0gY3JlYXRvciB7CgkJcGFuaWMoImNvbDogbm90IGNyZWF0b3IiKQoJfQoJaW1hZ2UgPSBzdHJpbmdzLlRyaW1TcGFjZShpbWFnZSkKCWlmIGltYWdlICE9ICIiICYmICF2YWxpZEltYWdlKGltYWdlKSB7CgkJcGFuaWMoImNvbDogaW1hZ2UiKQoJfQoJaWYgIWhpZGRlbiAmJiBtaW50ZWQgPiAwIHsKCQlwYW5pYygiY29sOiByZXZlYWxlZCIpCgl9CglwcmVyZXZlYWwgPSBpbWFnZQoJaWYgaGlkZGVuIHsKCQlwYWludFNlYWxlZChwcmVyZXZlYWxJbWFnZSgpKQoJfQoJY2hhaW4uRW1pdCgiU2V0UHJlcmV2ZWFsIiwgImltYWdlIiwgaW1hZ2UpCn0KCmZ1bmMgUHJlcmV2ZWFsKCkgc3RyaW5nIHsKCXJlcXVpcmVJbml0KCkKCXJldHVybiBwcmVyZXZlYWwKfQoKLy8gUmV2ZWFsQ29sbGVjdGlvbiBvcGVucyBldmVyeSBtaW50ZWQgTkZULiBDcmVhdG9yIG9ubHksIGFuZCBvbmx5IHdoaWxlIHNlYWxlZC4KZnVuYyBSZXZlYWxDb2xsZWN0aW9uKGN1ciByZWFsbSkgewoJY2FsbGVyIDo9IHJlcXVpcmVVc2VyKGN1cikKCWlmIGNhbGxlciAhPSBjcmVhdG9yIHsKCQlwYW5pYygiY29sOiBub3QgY3JlYXRvciIpCgl9CglpZiAhaGlkZGVuIHsKCQlwYW5pYygiY29sOiByZXZlYWxlZCIpCgl9CglpZiBsb2FkZWQgPCAxIHsKCQlwYW5pYygiY29sOiBubyBzbG90cyIpCgl9CgloaWRkZW4gPSBmYWxzZQoJZm9yIF8sIGlkIDo9IHJhbmdlIHNlYWxlZElEcygpIHsKCQlpdCA6PSBtdXN0SXRlbShpZCkKCQl2IDo9IGRyb3BTbG90cy5HZXQoc2xvdEtleShpdC5zbG90KSkKCQlpZiB2ID09IG5pbCB7CgkJCXBhbmljKCJjb2w6IG5vIHNsb3QiKQoJCX0KCQlhcHBseVNsb3QoaWQsIHYuKCpkcm9wU2xvdCksIGl0LnNsb3QpCgkJd3JpdGVUb2tlbk1ldGEoaWQpCgl9CgljaGFpbi5FbWl0KCJSZXZlYWxDb2xsZWN0aW9uIiwgInNsdWciLCBzbHVnKQp9CgpmdW5jIFJldmVhbGVkKGlkIGludCkgYm9vbCB7CglyZXR1cm4gbXVzdEl0ZW0oaWQpLnJldmVhbGVkCn0KCmZ1bmMgUmV2ZWFsKGN1ciByZWFsbSwgaWQgaW50KSB7CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJaXQgOj0gbXVzdEl0ZW0oaWQpCglpZiBjYWxsZXIgIT0gaXQub3duZXIgewoJCXBhbmljKCJjb2w6IG5vdCBvd25lciIpCgl9CglpZiBoaWRkZW4gewoJCXBhbmljKCJjb2w6IHNlYWxlZCIpCgl9CglpZiBpdC5yZXZlYWxlZCB7CgkJcGFuaWMoImNvbDogcmV2ZWFsZWQiKQoJfQoJaWYgaXQuc2xvdCA8IDAgewoJCXBhbmljKCJjb2w6IG5vIHNsb3QiKQoJfQoJdiA6PSBkcm9wU2xvdHMuR2V0KHNsb3RLZXkoaXQuc2xvdCkpCglpZiB2ID09IG5pbCB7CgkJcGFuaWMoImNvbDogbm8gc2xvdCIpCgl9CglhcHBseVNsb3QoaWQsIHYuKCpkcm9wU2xvdCksIGl0LnNsb3QpCgl3cml0ZVRva2VuTWV0YShpZCkKCWNoYWluLkVtaXQoIlJldmVhbCIsICJpZCIsIHN0cmNvbnYuSXRvYShpZCkpCn0KCi8vIEFkZW5hIElJRkU6IG93bmVyLCBlcnIgOj0gT3duZXJPZigiMSIpOyBvd25lci5TdHJpbmcoKSA9PSB3YWxsZXQKZnVuYyBPd25lck9mKHRpZCBzdHJpbmcpIChhZGRyZXNzLCBlcnJvcikgewoJcmVxdWlyZUluaXQoKQoJaWQsIGVyciA6PSBzdHJjb252LkF0b2kodGlkKQoJaWYgZXJyICE9IG5pbCB8fCBpZCA8IDEgewoJCXJldHVybiBhZGRyZXNzKCIiKSwgZXJyb3JzLk5ldygiY29sOiB0aWQiKQoJfQoJdiA6PSBpdGVtcy5HZXQoaXRlbUtleShpZCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIGFkZHJlc3MoIiIpLCBlcnJvcnMuTmV3KCJjb2w6IHVua25vd24gaXRlbSIpCgl9CglyZXR1cm4gdi4oKml0ZW0pLm93bmVyLCBuaWwKfQoKZnVuYyBHcmNOYW1lKCkgc3RyaW5nIHsKCXJlcXVpcmVJbml0KCkKCXJldHVybiB0b2tlbi5HZXROYW1lKCkKfQoKZnVuYyBHcmNTeW1ib2woKSBzdHJpbmcgewoJcmVxdWlyZUluaXQoKQoJcmV0dXJuIHRva2VuLkdldFN5bWJvbCgpCn0KCmZ1bmMgR3JjQmFsYW5jZU9mKGFkZHIgc3RyaW5nKSBpbnQ2NCB7CglyZXF1aXJlSW5pdCgpCgl3aG8gOj0gYWRkcmVzcyhhZGRyKQoJaWYgIXdoby5Jc1ZhbGlkKCkgewoJCXJldHVybiAwCgl9CgluLCBlcnIgOj0gdG9rZW4uQmFsYW5jZU9mKHdobykKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwCgl9CglyZXR1cm4gbgp9CgpmdW5jIEdyY093bmVyT2YoaWQgaW50KSBzdHJpbmcgewoJcmVxdWlyZUluaXQoKQoJb3duZXIsIGVyciA6PSB0b2tlbi5Pd25lck9mKGl0ZW1UaWQoaWQpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoImNvbDogb3duZXIiKQoJfQoJcmV0dXJuIG93bmVyLlN0cmluZygpCn0KCmZ1bmMgTmFtZSgpIHN0cmluZyB7CglyZXR1cm4gR3JjTmFtZSgpCn0KCmZ1bmMgU3ltYm9sKCkgc3RyaW5nIHsKCXJldHVybiBHcmNTeW1ib2woKQp9CgpmdW5jIEJhbGFuY2VPZihhZGRyIHN0cmluZykgaW50NjQgewoJcmV0dXJuIEdyY0JhbGFuY2VPZihhZGRyKQp9CgpmdW5jIFRva2VuVVJJKHRpZCBzdHJpbmcpIHN0cmluZyB7CglpZCA6PSBwYXJzZVRpZCh0aWQpCgltdXN0SXRlbShpZCkKCWlmIG1ldGFWaWV3ICE9IG5pbCB7CgkJdSwgZXJyIDo9IG1ldGFWaWV3LlRva2VuVVJJKGl0ZW1UaWQoaWQpKQoJCWlmIGVyciA9PSBuaWwgJiYgdSAhPSAiIiB7CgkJCXJldHVybiB1CgkJfQoJfQoJcmV0dXJuIHRva2VuSlNPTihtdXN0SXRlbShpZCkpCn0KCmZ1bmMgZ3VhcmRVbmxpc3RlZChpZCBpbnQpIHsKCWlmIG11c3RJdGVtKGlkKS5saXN0ZWQgewoJCXBhbmljKCJjb2w6IGxpc3RlZCIpCgl9Cn0KCmZ1bmMgQXBwcm92ZShjdXIgcmVhbG0sIHRvLCB0aWQgc3RyaW5nKSB7CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJaWQgOj0gcGFyc2VUaWQodGlkKQoJZ3VhcmRVbmxpc3RlZChpZCkKCXdobyA6PSBhZGRyZXNzKHRvKQoJaWYgdG8gIT0gIiIgJiYgIXdoby5Jc1ZhbGlkKCkgewoJCXBhbmljKCJjb2w6IGFkZHIiKQoJfQoJaWYgZXJyIDo9IGxlZGdlci5BcHByb3ZlKGNhbGxlciwgd2hvLCBpdGVtVGlkKGlkKSk7IGVyciAhPSBuaWwgewoJCXBhbmljKCJjb2w6IGFwcHJvdmUiKQoJfQp9CgpmdW5jIFNldEFwcHJvdmFsRm9yQWxsKGN1ciByZWFsbSwgb3BlcmF0b3Igc3RyaW5nLCBhcHByb3ZlZCBib29sKSB7CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJb3AgOj0gYWRkcmVzcyhvcGVyYXRvcikKCWlmICFvcC5Jc1ZhbGlkKCkgewoJCXBhbmljKCJjb2w6IGFkZHIiKQoJfQoJaWYgZXJyIDo9IGxlZGdlci5TZXRBcHByb3ZhbEZvckFsbChjYWxsZXIsIG9wLCBhcHByb3ZlZCk7IGVyciAhPSBuaWwgewoJCXBhbmljKCJjb2w6IGFwcHJvdmUiKQoJfQp9CgpmdW5jIFRyYW5zZmVyRnJvbShjdXIgcmVhbG0sIGZyb20sIHRvLCB0aWQgc3RyaW5nKSB7CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJaWQgOj0gcGFyc2VUaWQodGlkKQoJZ3VhcmRVbmxpc3RlZChpZCkKCXNyYyA6PSBhZGRyZXNzKGZyb20pCglkc3QgOj0gYWRkcmVzcyh0bykKCWlmICFzcmMuSXNWYWxpZCgpIHx8ICFkc3QuSXNWYWxpZCgpIHsKCQlwYW5pYygiY29sOiBhZGRyIikKCX0KCWlmIGVyciA6PSBsZWRnZXIuVHJhbnNmZXJGcm9tKGNhbGxlciwgc3JjLCBkc3QsIGl0ZW1UaWQoaWQpKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoImNvbDogdHJhbnNmZXIiKQoJfQoJaXQgOj0gbXVzdEl0ZW0oaWQpCglpdC5vd25lciA9IGRzdAoJaXRlbXMuU2V0KGl0ZW1LZXkoaWQpLCBpdCkKfQoKZnVuYyBHZXRBcHByb3ZlZChpZCBpbnQpIHN0cmluZyB7CglyZXF1aXJlSW5pdCgpCgl3aG8sIGVyciA6PSB0b2tlbi5HZXRBcHByb3ZlZChpdGVtVGlkKGlkKSkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuIHdoby5TdHJpbmcoKQp9CgpmdW5jIElzQXBwcm92ZWRGb3JBbGwob3duZXIsIG9wZXJhdG9yIHN0cmluZykgYm9vbCB7CglyZXF1aXJlSW5pdCgpCglhIDo9IGFkZHJlc3Mob3duZXIpCgliIDo9IGFkZHJlc3Mob3BlcmF0b3IpCglpZiAhYS5Jc1ZhbGlkKCkgfHwgIWIuSXNWYWxpZCgpIHsKCQlyZXR1cm4gZmFsc2UKCX0KCXJldHVybiB0b2tlbi5Jc0FwcHJvdmVkRm9yQWxsKGEsIGIpCn0KCmZ1bmMgVG90YWxTdXBwbHkoKSBpbnQ2NCB7CglyZXF1aXJlSW5pdCgpCglyZXR1cm4gdG9rZW4uVG90YWxTdXBwbHkoKQp9CgpmdW5jIFNlbGxlck9mKGlkIGludCkgYWRkcmVzcyB7CglyZXR1cm4gbXVzdEl0ZW0oaWQpLnNlbGxlcgp9CgpmdW5jIFByaWNlT2YoaWQgaW50KSBpbnQ2NCB7CglyZXR1cm4gbXVzdEl0ZW0oaWQpLnByaWNlCn0KCmZ1bmMgTmFtZU9mKGlkIGludCkgc3RyaW5nIHsKCWl0IDo9IG11c3RJdGVtKGlkKQoJaWYgIWl0LnJldmVhbGVkIHsKCQlyZXR1cm4gIlVucmV2ZWFsZWQiCgl9CglyZXR1cm4gaXQubmFtZQp9CgpmdW5jIEltYWdlT2YoaWQgaW50KSBzdHJpbmcgewoJaXQgOj0gbXVzdEl0ZW0oaWQpCglpZiAhaXQucmV2ZWFsZWQgewoJCXJldHVybiBwcmVyZXZlYWxJbWFnZSgpCgl9CglyZXR1cm4gaXQuaW1hZ2UKfQoKZnVuYyBMaXN0ZWQoaWQgaW50KSBib29sIHsKCXJldHVybiBtdXN0SXRlbShpZCkubGlzdGVkCn0KCmZ1bmMgTmV4dElEKCkgaW50IHsKCXJldHVybiBuZXh0SUQKfQoKZnVuYyBDb2xsZWN0aW9uT2YoXyBpbnQpIHN0cmluZyB7CglyZXF1aXJlSW5pdCgpCglyZXR1cm4gc2x1Zwp9CgpmdW5jIEl0ZW1MaW5lKGlkIGludCkgc3RyaW5nIHsKCWl0IDo9IG11c3RJdGVtKGlkKQoJbmFtZSA6PSBpdC5uYW1lCglpbWFnZSA6PSBpdC5pbWFnZQoJcmFyaXR5IDo9IGl0LnJhcml0eQoJdHJhaXRzIDo9IGl0LnRyYWl0cwoJaWYgIWl0LnJldmVhbGVkIHsKCQluYW1lID0gIlVucmV2ZWFsZWQiCgkJaW1hZ2UgPSBwcmVyZXZlYWxJbWFnZSgpCgkJcmFyaXR5ID0gIiIKCQl0cmFpdHMgPSAiIgoJfQoJcmV0dXJuIHN0cmNvbnYuSXRvYShpdC5pZCkgKyAifCIgKyBuYW1lICsgInwiICsgaXQub3duZXIuU3RyaW5nKCkgKyAifCIgKyBpdC5zZWxsZXIuU3RyaW5nKCkgKyAifCIgKyBzdHJjb252LkZvcm1hdEludChpdC5wcmljZSwgMTApICsgInwiICsgc3RyY29udi5Gb3JtYXRCb29sKGl0Lmxpc3RlZCkgKyAifCIgKyBpbWFnZSArICJ8IiArIHNsdWcgKyAifCIgKyByYXJpdHkgKyAifCIgKyB0cmFpdHMgKyAifCIgKyBzdHJjb252LkZvcm1hdEJvb2woaXQucmV2ZWFsZWQpICsgInwiICsgc3RyY29udi5JdG9hKGl0LnNsb3QpCn0KCmZ1bmMgTGlzdE9wZW4oKSBzdHJpbmcgewoJcmVxdWlyZUluaXQoKQoJb3V0IDo9ICIiCgluIDo9IDAKCWl0ZW1zLkl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCWl0IDo9IHZhbHVlLigqaXRlbSkKCQlpZiAhaXQubGlzdGVkIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJCWlmIG4gPj0gNTAgewoJCQlyZXR1cm4gdHJ1ZQoJCX0KCQlpZiBvdXQgIT0gIiIgewoJCQlvdXQgKz0gIlxuIgoJCX0KCQlvdXQgKz0gSXRlbUxpbmUoaXQuaWQpCgkJbisrCgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIG91dAp9CgpmdW5jIFRva2Vuc09mKG93bmVyIHN0cmluZykgc3RyaW5nIHsKCXJlcXVpcmVJbml0KCkKCXdobyA6PSBhZGRyZXNzKG93bmVyKQoJaWYgIXdoby5Jc1ZhbGlkKCkgewoJCXJldHVybiAiIgoJfQoJb3V0IDo9ICIiCglpdGVtcy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhfIHN0cmluZywgdmFsdWUgYW55KSBib29sIHsKCQlpdCA6PSB2YWx1ZS4oKml0ZW0pCgkJaWYgaXQub3duZXIgIT0gd2hvIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJCWlmIG91dCAhPSAiIiB7CgkJCW91dCArPSAiLCIKCQl9CgkJb3V0ICs9IHN0cmNvbnYuSXRvYShpdC5pZCkKCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gb3V0Cn0KCmZ1bmMgVG9rZW5PZk93bmVyQnlJbmRleChvd25lciBzdHJpbmcsIGluZGV4IGludDY0KSBzdHJpbmcgewoJcmVxdWlyZUluaXQoKQoJd2hvIDo9IGFkZHJlc3Mob3duZXIpCglpZiAhd2hvLklzVmFsaWQoKSB7CgkJcGFuaWMoImNvbDogYWRkciIpCgl9CglpZiBpbmRleCA8IDAgewoJCXBhbmljKCJjb2w6IGluZGV4IikKCX0KCXZhciBuIGludDY0Cglmb3VuZCA6PSAiIgoJaXRlbXMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJaXQgOj0gdmFsdWUuKCppdGVtKQoJCWlmIGl0Lm93bmVyICE9IHdobyB7CgkJCXJldHVybiBmYWxzZQoJCX0KCQlpZiBuID09IGluZGV4IHsKCQkJZm91bmQgPSBzdHJjb252Lkl0b2EoaXQuaWQpCgkJCXJldHVybiB0cnVlCgkJfQoJCW4rKwoJCXJldHVybiBmYWxzZQoJfSkKCWlmIGZvdW5kID09ICIiIHsKCQlwYW5pYygiY29sOiBpbmRleCIpCgl9CglyZXR1cm4gZm91bmQKfQoKZnVuYyBUb2tlbkJ5SW5kZXgoaW5kZXggaW50NjQpIHN0cmluZyB7CglyZXF1aXJlSW5pdCgpCglpZiBpbmRleCA8IDAgewoJCXBhbmljKCJjb2w6IGluZGV4IikKCX0KCXZhciBuIGludDY0Cglmb3VuZCA6PSAiIgoJaXRlbXMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJaWYgbiA9PSBpbmRleCB7CgkJCWZvdW5kID0gc3RyY29udi5JdG9hKHZhbHVlLigqaXRlbSkuaWQpCgkJCXJldHVybiB0cnVlCgkJfQoJCW4rKwoJCXJldHVybiBmYWxzZQoJfSkKCWlmIGZvdW5kID09ICIiIHsKCQlwYW5pYygiY29sOiBpbmRleCIpCgl9CglyZXR1cm4gZm91bmQKfQoKZnVuYyBDcmVhdG9yKCkgc3RyaW5nIHsKCXJlcXVpcmVJbml0KCkKCXJldHVybiBjcmVhdG9yLlN0cmluZygpCn0KCmZ1bmMgTWludFByaWNlKCkgaW50NjQgewoJcmVxdWlyZUluaXQoKQoJcmV0dXJuIG1pbnRQcmljZQp9CgpmdW5jIE1heFN1cHBseSgpIGludCB7CglyZXF1aXJlSW5pdCgpCglyZXR1cm4gbWF4U3VwcGx5Cn0KCmZ1bmMgTWludGVkKCkgaW50IHsKCXJlcXVpcmVJbml0KCkKCXJldHVybiBtaW50ZWQKfQoKZnVuYyBSb3lhbHR5QnBzKCkgaW50IHsKCXJlcXVpcmVJbml0KCkKCXJldHVybiByb3lhbHR5QnBzCn0KCmZ1bmMgU2V0Um95YWx0eShjdXIgcmVhbG0sIGJwcyBpbnQpIHsKCWNhbGxlciA6PSByZXF1aXJlVXNlcihjdXIpCglpZiBjYWxsZXIgIT0gY3JlYXRvciB7CgkJcGFuaWMoImNvbDogbm90IGNyZWF0b3IiKQoJfQoJaWYgbWludGVkICE9IDAgewoJCXBhbmljKCJjb2w6IG1pbnRlZCIpCgl9CglpZiBicHMgPCAwIHx8IGJwcyA+IG1heFJveWFsdHlCcHMgewoJCXBhbmljKCJjb2w6IHJveWFsdHkiKQoJfQoJcm95YWx0eUJwcyA9IGJwcwoJZmFjdG9yeS5Ob3RlUm95YWx0eShjcm9zcyhjdXIpLCBicHMpCgljaGFpbi5FbWl0KCJTZXRSb3lhbHR5IiwgInNsdWciLCBzbHVnLCAiYnBzIiwgc3RyY29udi5JdG9hKGJwcykpCn0KCmZ1bmMgUmFyaXR5T2YoaWQgaW50KSBzdHJpbmcgewoJaXQgOj0gbXVzdEl0ZW0oaWQpCglpZiAhaXQucmV2ZWFsZWQgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuIGl0LnJhcml0eQp9CgpmdW5jIFRyYWl0c09mKGlkIGludCkgc3RyaW5nIHsKCWl0IDo9IG11c3RJdGVtKGlkKQoJaWYgIWl0LnJldmVhbGVkIHsKCQlyZXR1cm4gIiIKCX0KCXJldHVybiBpdC50cmFpdHMKfQoKZnVuYyBQYXVzZWQoKSBib29sIHsKCXJlcXVpcmVJbml0KCkKCXJldHVybiBwYXVzZWQKfQoKZnVuYyBSZW5kZXIoXyBzdHJpbmcpIHN0cmluZyB7CglpZiAhaW5pdGVkIHsKCQlyZXR1cm4gIiMgQ29sbGVjdGlvblxuXG5DYWxsIEluaXQgZmlyc3QuXG4iCgl9CglvdXQgOj0gIiMgIiArIGNvbE5hbWUgKyAiICgkIiArIGNvbFN5bWJvbCArICIpXG5cbiIKCW91dCArPSAiLSBtaW50ZWQ6ICIgKyBzdHJjb252Lkl0b2EobWludGVkKSArICJcbiIKCW91dCArPSAiLSBtaW50IHByaWNlOiAiICsgc3RyY29udi5Gb3JtYXRJbnQobWludFByaWNlLCAxMCkgKyAiIHVnbm90XG5cbiIKCW9wZW4gOj0gTGlzdE9wZW4oKQoJaWYgb3BlbiA9PSAiIiB7CgkJb3V0ICs9ICJfTm8gb3BlbiBsaXN0aW5ncy5fXG4iCgl9IGVsc2UgewoJCW91dCArPSAiYGBgXG4iICsgb3BlbiArICJcbmBgYFxuIgoJfQoJcmV0dXJuIG91dAp9CgpmdW5jIG1pbnRUbyhjdXIgcmVhbG0sIGNhbGxlciBhZGRyZXNzLCBuYW1lLCBpbWFnZVVSTCBzdHJpbmcpIGludCB7CglyZXF1aXJlSW5pdCgpCglpZiAhY3VyLklzQ3VycmVudCgpIHsKCQlwYW5pYygiY29sOiBzcG9vZmVkIHJlYWxtIikKCX0KCWlmIG1heFN1cHBseSA+IDAgJiYgbWludGVkID49IG1heFN1cHBseSB7CgkJcGFuaWMoImNvbDogc29sZCBvdXQiKQoJfQoJaWYgIXZhbGlkTmFtZShuYW1lKSB7CgkJcGFuaWMoImNvbDogbmFtZSIpCgl9CglpZiAhdmFsaWRJbWFnZShpbWFnZVVSTCkgewoJCXBhbmljKCJjb2w6IGltYWdlIikKCX0KCW5leHRJRCsrCglpZCA6PSBuZXh0SUQKCWl0IDo9ICZpdGVtewoJCWlkOiAgICAgICBpZCwKCQluYW1lOiAgICAgbmFtZSwKCQlpbWFnZTogICAgaW1hZ2VVUkwsCgkJb3duZXI6ICAgIGNhbGxlciwKCQlyYXJpdHk6ICAgcmFyaXR5T2YoaWQpLAoJCXJldmVhbGVkOiB0cnVlLAoJCXNsb3Q6ICAgICAtMSwKCX0KCWl0ZW1zLlNldChpdGVtS2V5KGlkKSwgaXQpCgllcnIgOj0gbGVkZ2VyLk1pbnQoY2FsbGVyLCBpdGVtVGlkKGlkKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKCJjb2w6IG1pbnQiKQoJfQoJbWludGVkKysKCWZhY3RvcnkuTm90ZU1pbnRlZChjcm9zcyhjdXIpLCBtaW50ZWQpCglyZXR1cm4gaWQKfQoKZnVuYyB0YWtlRXhhY3Qod2FudCBpbnQ2NCkgewoJc2VudCA6PSB1bnNhZmUuT3JpZ2luU2VuZCgpCglpZiB3YW50ID09IDAgewoJCWlmIGxlbihzZW50KSAhPSAwIHsKCQkJcGFuaWMoImNvbDogZXh0cmEgZGVub21zIikKCQl9CgkJcmV0dXJuCgl9CglpZiBsZW4oc2VudCkgIT0gMSB8fCBzZW50WzBdLkRlbm9tICE9IG5hdGl2ZURlbm9tIHx8IHNlbnRbMF0uQW1vdW50ICE9IHdhbnQgewoJCXBhbmljKCJjb2w6IHdyb25nIHBheW1lbnQiKQoJfQp9CgpmdW5jIHByZXJldmVhbEltYWdlKCkgc3RyaW5nIHsKCWlmIHByZXJldmVhbCAhPSAiIiB7CgkJcmV0dXJuIHByZXJldmVhbAoJfQoJcmV0dXJuIGNvbENvdmVyCn0KCmZ1bmMgc2VhbGVkSURzKCkgW11pbnQgewoJb3V0IDo9IFtdaW50e30KCWl0ZW1zLkl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCWl0IDo9IHZhbHVlLigqaXRlbSkKCQlpZiAhaXQucmV2ZWFsZWQgJiYgaXQuc2xvdCA+PSAwIHsKCQkJb3V0ID0gYXBwZW5kKG91dCwgaXQuaWQpCgkJfQoJCXJldHVybiBmYWxzZQoJfSkKCXJldHVybiBvdXQKfQoKZnVuYyBwYWludFNlYWxlZChpbWFnZSBzdHJpbmcpIHsKCWZvciBfLCBpZCA6PSByYW5nZSBzZWFsZWRJRHMoKSB7CgkJaXQgOj0gbXVzdEl0ZW0oaWQpCgkJaXQuaW1hZ2UgPSBpbWFnZQoJCWl0ZW1zLlNldChpdGVtS2V5KGlkKSwgaXQpCgkJd3JpdGVUb2tlbk1ldGEoaWQpCgl9Cn0KCmZ1bmMgcHVibGljSW1hZ2UoKSBzdHJpbmcgewoJaW1nIDo9ICIvc2FtcGxlcy8iICsgc2x1ZyArICItMCIgKyBzdHJjb252Lkl0b2EobWludGVkKzEpICsgIi5wbmciCglpZiB2YWxpZEltYWdlKGltZykgewoJCXJldHVybiBpbWcKCX0KCXJldHVybiBjb2xDb3Zlcgp9CgpmdW5jIHJlcXVpcmVJbml0KCkgewoJaWYgIWluaXRlZCB7CgkJcGFuaWMoImNvbDogY2FsbCBJbml0IGZpcnN0IikKCX0KfQoKZnVuYyByZXF1aXJlVXNlcihjdXIgcmVhbG0pIGFkZHJlc3MgewoJcmVxdWlyZUluaXQoKQoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoImNvbDogc3Bvb2ZlZCByZWFsbSIpCgl9CglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsKCQlwYW5pYygiY29sOiBFT0Egb25seSIpCgl9CglyZXR1cm4gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCn0KCmZ1bmMgaXRlbVRpZChpZCBpbnQpIGdyYzcyMS5Ub2tlbklEIHsKCXJldHVybiBncmM3MjEuVG9rZW5JRChzdHJjb252Lkl0b2EoaWQpKQp9CgpmdW5jIHBhcnNlVGlkKHRpZCBzdHJpbmcpIGludCB7CglpZCwgZXJyIDo9IHN0cmNvbnYuQXRvaSh0aWQpCglpZiBlcnIgIT0gbmlsIHx8IGlkIDwgMSB7CgkJcGFuaWMoImNvbDogdGlkIikKCX0KCXJldHVybiBpZAp9CgpmdW5jIG11c3RJdGVtKGlkIGludCkgKml0ZW0gewoJdiA6PSBpdGVtcy5HZXQoaXRlbUtleShpZCkpCglpZiB2ID09IG5pbCB7CgkJcGFuaWMoImNvbDogdW5rbm93biBpdGVtIikKCX0KCXJldHVybiB2LigqaXRlbSkKfQoKZnVuYyBpdGVtS2V5KGlkIGludCkgc3RyaW5nIHsKCXJldHVybiBzdHJjb252Lkl0b2EoaWQpCn0KCmZ1bmMgbGFzdEVsZW0ocGtnIHN0cmluZykgc3RyaW5nIHsKCWkgOj0gc3RyaW5ncy5MYXN0SW5kZXgocGtnLCAiLyIpCglpZiBpIDwgMCB8fCBpKzEgPj0gbGVuKHBrZykgewoJCXBhbmljKCJjb2w6IHBrZyIpCgl9CglyZXR1cm4gcGtnW2krMTpdCn0KCmZ1bmMgc2xvdEtleShpIGludCkgc3RyaW5nIHsKCXJldHVybiBzdHJjb252Lkl0b2EoaSkKfQoKZnVuYyBzbG90Q2FwKCkgaW50IHsKCWlmIG1heFN1cHBseSA+IDAgewoJCXJldHVybiBtYXhTdXBwbHkKCX0KCXJldHVybiBkcm9wU2xvdEhhcmRDYXAKfQoKZnVuYyBhcHBseVNsb3QoaWQgaW50LCBzICpkcm9wU2xvdCwgc2xvdEluZGV4IGludCkgewoJaXQgOj0gbXVzdEl0ZW0oaWQpCglpdC5uYW1lID0gcy5uYW1lCglpdC5pbWFnZSA9IHMuaW1hZ2UKCWlmIHMucmFyaXR5ICE9ICIiIHsKCQlpdC5yYXJpdHkgPSBzLnJhcml0eQoJfQoJaXQudHJhaXRzID0gcy50cmFpdHMKCWl0LnJldmVhbGVkID0gdHJ1ZQoJaXQuc2xvdCA9IHNsb3RJbmRleAoJaXRlbXMuU2V0KGl0ZW1LZXkoaWQpLCBpdCkKfQoKZnVuYyB3cml0ZVRva2VuTWV0YShpZCBpbnQpIHsKCWl0IDo9IG11c3RJdGVtKGlkKQoJbmFtZSwgaW1hZ2UsIGF0dHJzIDo9IHB1YmxpY01ldGEoaXQpCgl1cmkgOj0gdG9rZW5KU09OKGl0KQoJaWYgbWV0YUxlZCA9PSBuaWwgewoJCXJldHVybgoJfQoJaWYgZXJyIDo9IG1ldGFMZWQuU2V0VG9rZW5VUkkoaXRlbVRpZChpZCksIHVyaSk7IGVyciAhPSBuaWwgewoJCXBhbmljKCJjb2w6IHRva2VuVVJJIikKCX0KCWlmIGVyciA6PSBtZXRhTGVkLlNldFRva2VuTWV0YWRhdGEoaXRlbVRpZChpZCksIG1ldGFkYXRhLkRhdGF7CgkJTmFtZTogICAgICAgIG5hbWUsCgkJRGVzY3JpcHRpb246IGNvbE5hbWUgKyAiICMiICsgc3RyY29udi5JdG9hKGlkKSwKCQlJbWFnZTogICAgICAgYWJzSW1hZ2UoaW1hZ2UpLAoJCUF0dHJpYnV0ZXM6ICBhdHRycywKCX0pOyBlcnIgIT0gbmlsIHsKCQlwYW5pYygiY29sOiBtZXRhZGF0YSIpCgl9Cn0KCmZ1bmMgcHVibGljTWV0YShpdCAqaXRlbSkgKHN0cmluZywgc3RyaW5nLCBbXW1ldGFkYXRhLlRyYWl0KSB7CglpZiAhaXQucmV2ZWFsZWQgewoJCXJldHVybiAiVW5yZXZlYWxlZCIsIHByZXJldmVhbEltYWdlKCksIFtdbWV0YWRhdGEuVHJhaXR7fQoJfQoJcmV0dXJuIGl0Lm5hbWUsIGl0LmltYWdlLCB0cmFpdEF0dHJzKGl0KQp9CgpmdW5jIHRva2VuSlNPTihpdCAqaXRlbSkgc3RyaW5nIHsKCW5hbWUsIGltYWdlLCB0cmFpdHMgOj0gcHVibGljTWV0YShpdCkKCWF0dHJzIDo9ICIiCglmb3IgXywgdHIgOj0gcmFuZ2UgdHJhaXRzIHsKCQlpZiBhdHRycyAhPSAiIiB7CgkJCWF0dHJzICs9ICIsIgoJCX0KCQlhdHRycyArPSBgeyJ0cmFpdF90eXBlIjpgICsganNvblN0cih0ci5UcmFpdFR5cGUpICsgYCwidmFsdWUiOmAgKyBqc29uU3RyKHRyLlZhbHVlKSArIGB9YAoJfQoJYm9keSA6PSBgeyJuYW1lIjpgICsganNvblN0cihuYW1lKSArIGAsImRlc2NyaXB0aW9uIjpgICsganNvblN0cihjb2xOYW1lKyIgIyIrc3RyY29udi5JdG9hKGl0LmlkKSkgKyBgLCJpbWFnZSI6YCArIGpzb25TdHIoYWJzSW1hZ2UoaW1hZ2UpKSArIGAsImF0dHJpYnV0ZXMiOltgICsgYXR0cnMgKyBgXX1gCglyZXR1cm4gImRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04LCIgKyBwY3RVUkkoYm9keSkKfQoKZnVuYyB0cmFpdEF0dHJzKGl0ICppdGVtKSBbXW1ldGFkYXRhLlRyYWl0IHsKCW91dCA6PSBbXW1ldGFkYXRhLlRyYWl0e30KCWlmIGl0LnJhcml0eSAhPSAiIiB7CgkJb3V0ID0gYXBwZW5kKG91dCwgbWV0YWRhdGEuVHJhaXR7VHJhaXRUeXBlOiAiUmFyaXR5IiwgVmFsdWU6IGl0LnJhcml0eX0pCgl9Cglmb3IgXywgcGFydCA6PSByYW5nZSBzdHJpbmdzLlNwbGl0KGl0LnRyYWl0cywgIjsiKSB7CgkJcGFydCA9IHN0cmluZ3MuVHJpbVNwYWNlKHBhcnQpCgkJY29sb24gOj0gc3RyaW5ncy5JbmRleChwYXJ0LCAiOiIpCgkJaWYgY29sb24gPD0gMCB8fCBjb2xvbiA+PSBsZW4ocGFydCktMSB7CgkJCWNvbnRpbnVlCgkJfQoJCWtleSA6PSBzdHJpbmdzLlRyaW1TcGFjZShwYXJ0Wzpjb2xvbl0pCgkJdmFsIDo9IHN0cmluZ3MuVHJpbVNwYWNlKHBhcnRbY29sb24rMTpdKQoJCWlmIGtleSA9PSAiIiB8fCB2YWwgPT0gIiIgewoJCQljb250aW51ZQoJCX0KCQlvdXQgPSBhcHBlbmQob3V0LCBtZXRhZGF0YS5UcmFpdHtUcmFpdFR5cGU6IGtleSwgVmFsdWU6IHZhbH0pCgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgYWJzSW1hZ2UodSBzdHJpbmcpIHN0cmluZyB7CglpZiB1ID09ICIiIHsKCQlyZXR1cm4gdQoJfQoJaWYgc3RyaW5ncy5IYXNQcmVmaXgodSwgImh0dHBzOi8vIikgfHwgc3RyaW5ncy5IYXNQcmVmaXgodSwgImh0dHA6Ly8iKSB8fCBzdHJpbmdzLkhhc1ByZWZpeCh1LCAiaXBmczovLyIpIHsKCQlyZXR1cm4gdQoJfQoJaWYgc3RyaW5ncy5IYXNQcmVmaXgodSwgIi8iKSB7CgkJcmV0dXJuIHB1YmxpY09yaWdpbiArIHUKCX0KCXJldHVybiB1Cn0KCmZ1bmMganNvblN0cihzIHN0cmluZykgc3RyaW5nIHsKCW91dCA6PSBgImAKCWZvciBfLCByIDo9IHJhbmdlIHMgewoJCXN3aXRjaCByIHsKCQljYXNlICciJzoKCQkJb3V0ICs9IGBcImAKCQljYXNlICdcXCc6CgkJCW91dCArPSBgXFxgCgkJY2FzZSAnXG4nOgoJCQlvdXQgKz0gYFxuYAoJCWNhc2UgJ1xyJzoKCQkJb3V0ICs9IGBccmAKCQljYXNlICdcdCc6CgkJCW91dCArPSBgXHRgCgkJZGVmYXVsdDoKCQkJaWYgciA8IDB4MjAgewoJCQkJb3V0ICs9IGBcdTAwYAoJCQkJaGV4IDo9ICIwMTIzNDU2Nzg5YWJjZGVmIgoJCQkJb3V0ICs9IHN0cmluZyhbXWJ5dGV7aGV4W3I+PjRdLCBoZXhbciYxNV19KQoJCQl9IGVsc2UgewoJCQkJb3V0ICs9IHN0cmluZyhyKQoJCQl9CgkJfQoJfQoJcmV0dXJuIG91dCArIGAiYAp9CgpmdW5jIHBjdFVSSShzIHN0cmluZykgc3RyaW5nIHsKCW91dCA6PSAiIgoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQljIDo9IHNbaV0KCQlpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJykgfHwgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fCBjID09ICctJyB8fCBjID09ICdfJyB8fCBjID09ICcuJyB8fCBjID09ICd+JyB7CgkJCW91dCArPSBzdHJpbmcoYykKCQkJY29udGludWUKCQl9CgkJaGV4IDo9ICIwMTIzNDU2Nzg5QUJDREVGIgoJCW91dCArPSAiJSIKCQlvdXQgKz0gc3RyaW5nKFtdYnl0ZXtoZXhbYz4+NF0sIGhleFtjJjE1XX0pCgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgc3BsaXREcm9wTGluZXMoYmxvYiBzdHJpbmcpIFtdc3RyaW5nIHsKCWJsb2IgPSBzdHJpbmdzLlJlcGxhY2VBbGwoYmxvYiwgIlx4MWUiLCAiXG4iKQoJcmF3IDo9IHN0cmluZ3MuU3BsaXQoYmxvYiwgIlxuIikKCW91dCA6PSBtYWtlKFtdc3RyaW5nLCAwLCBsZW4ocmF3KSkKCWZvciBfLCBsaW5lIDo9IHJhbmdlIHJhdyB7CgkJbGluZSA9IHN0cmluZ3MuVHJpbVNwYWNlKGxpbmUpCgkJaWYgbGluZSA9PSAiIiB7CgkJCWNvbnRpbnVlCgkJfQoJCW91dCA9IGFwcGVuZChvdXQsIGxpbmUpCgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgcGFyc2VEcm9wTGluZShsaW5lIHN0cmluZykgKHN0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZykgewoJcGFydHMgOj0gc3RyaW5ncy5TcGxpdChsaW5lLCAifCIpCgluYW1lIDo9ICIiCglpbWFnZSA6PSAiIgoJcmFyaXR5IDo9ICIiCgl0cmFpdHMgOj0gIiIKCWlmIGxlbihwYXJ0cykgPiAwIHsKCQluYW1lID0gc3RyaW5ncy5UcmltU3BhY2UocGFydHNbMF0pCgl9CglpZiBsZW4ocGFydHMpID4gMSB7CgkJaW1hZ2UgPSBzdHJpbmdzLlRyaW1TcGFjZShwYXJ0c1sxXSkKCX0KCWlmIGxlbihwYXJ0cykgPiAyIHsKCQlyYXJpdHkgPSBzdHJpbmdzLlRyaW1TcGFjZShwYXJ0c1syXSkKCX0KCWlmIGxlbihwYXJ0cykgPiAzIHsKCQl0cmFpdHMgPSBzdHJpbmdzLlRyaW1TcGFjZShwYXJ0c1szXSkKCX0KCXJldHVybiBuYW1lLCBpbWFnZSwgcmFyaXR5LCB0cmFpdHMKfQoKZnVuYyB2YWxpZFJhcml0eShzIHN0cmluZykgYm9vbCB7CglpZiBzID09ICIiIHsKCQlyZXR1cm4gdHJ1ZQoJfQoJcmV0dXJuIHMgPT0gIkNvbW1vbiIgfHwgcyA9PSAiVW5jb21tb24iIHx8IHMgPT0gIlJhcmUiIHx8IHMgPT0gIkVwaWMiIHx8IHMgPT0gIkxlZ2VuZGFyeSIgfHwgcyA9PSAiTXl0aGljIgp9CgpmdW5jIHZhbGlkVHJhaXRzKHMgc3RyaW5nKSBib29sIHsKCWlmIHMgPT0gIiIgewoJCXJldHVybiB0cnVlCgl9CglpZiBsZW4ocykgPiAyMDAgewoJCXJldHVybiBmYWxzZQoJfQoJaWYgc3RyaW5ncy5Db250YWluc0FueShzLCAiXG5ccnwiKSB7CgkJcmV0dXJuIGZhbHNlCgl9CgluIDo9IDAKCWZvciBfLCBwYXJ0IDo9IHJhbmdlIHN0cmluZ3MuU3BsaXQocywgIjsiKSB7CgkJcGFydCA9IHN0cmluZ3MuVHJpbVNwYWNlKHBhcnQpCgkJaWYgcGFydCA9PSAiIiB7CgkJCWNvbnRpbnVlCgkJfQoJCWNvbG9uIDo9IHN0cmluZ3MuSW5kZXgocGFydCwgIjoiKQoJCWlmIGNvbG9uIDw9IDAgfHwgY29sb24gPj0gbGVuKHBhcnQpLTEgewoJCQlyZXR1cm4gZmFsc2UKCQl9CgkJa2V5IDo9IHN0cmluZ3MuVHJpbVNwYWNlKHBhcnRbOmNvbG9uXSkKCQl2YWwgOj0gc3RyaW5ncy5UcmltU3BhY2UocGFydFtjb2xvbisxOl0pCgkJaWYga2V5ID09ICIiIHx8IHZhbCA9PSAiIiB7CgkJCXJldHVybiBmYWxzZQoJCX0KCQlpZiAhYXNjaWlTZXQoa2V5LCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkgXy0iKSB7CgkJCXJldHVybiBmYWxzZQoJCX0KCQlpZiAhYXNjaWlTZXQodmFsLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkgXy0iKSB7CgkJCXJldHVybiBmYWxzZQoJCX0KCQluKysKCQlpZiBuID4gOCB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiBuID49IDEKfQoKZnVuYyB2YWxpZEcxKHMgc3RyaW5nKSBib29sIHsKCWlmIGxlbihzKSA8IDM5IHx8IGxlbihzKSA+IDY0IHsKCQlyZXR1cm4gZmFsc2UKCX0KCWlmIHNbMF0gIT0gJ2cnIHx8IHNbMV0gIT0gJzEnIHsKCQlyZXR1cm4gZmFsc2UKCX0KCXJldHVybiBhc2NpaVNldChzLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IikKfQoKZnVuYyB2YWxpZFBrZ05hbWUocyBzdHJpbmcpIGJvb2wgewoJaWYgbGVuKHMpIDwgbWluU2x1Z0xlbiB8fCBsZW4ocykgPiBncmM3MjEuTWF4U3ltYm9sTGVuIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWlmIHNbMF0gPCAnYScgfHwgc1swXSA+ICd6JyB7CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gYXNjaWlTZXQocywgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIpCn0KCmZ1bmMgcmFyaXR5T2YoaWQgaW50KSBzdHJpbmcgewoJciA6PSBpZCAlIDEwCglpZiByID09IDAgewoJCXJldHVybiAiTGVnZW5kYXJ5IgoJfQoJaWYgciA9PSAxIHsKCQlyZXR1cm4gIkNvbW1vbiIKCX0KCWlmIHIgPT0gMiB7CgkJcmV0dXJuICJVbmNvbW1vbiIKCX0KCWlmIHIgPT0gMyB7CgkJcmV0dXJuICJSYXJlIgoJfQoJaWYgciA9PSA0IHsKCQlyZXR1cm4gIkVwaWMiCgl9CglpZiByIDw9IDcgewoJCXJldHVybiAiVW5jb21tb24iCgl9CglyZXR1cm4gIkNvbW1vbiIKfQoKZnVuYyB2YWxpZE5hbWUobmFtZSBzdHJpbmcpIGJvb2wgewoJaWYgbGVuKG5hbWUpIDwgMSB8fCBsZW4obmFtZSkgPiBtYXhOYW1lTGVuIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWlmIHN0cmluZ3MuQ29udGFpbnNBbnkobmFtZSwgIlxuXHJ8XHRcIlxcIikgewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIF8sIHIgOj0gcmFuZ2UgbmFtZSB7CgkJaWYgciA8IDB4MjAgewoJCQlyZXR1cm4gZmFsc2UKCQl9Cgl9CglyZXR1cm4gdHJ1ZQp9CgpmdW5jIHZhbGlkSW1hZ2UodSBzdHJpbmcpIGJvb2wgewoJaWYgdSA9PSAiIiB7CgkJcmV0dXJuIHRydWUKCX0KCWlmIGxlbih1KSA+IG1heEltYWdlTGVuIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWlmIHN0cmluZ3MuQ29udGFpbnNBbnkodSwgIiBcdFxuXHJ8PD5cIidgIikgewoJCXJldHVybiBmYWxzZQoJfQoJaWYgc3RyaW5ncy5IYXNQcmVmaXgodSwgImh0dHBzOi8vIikgfHwgc3RyaW5ncy5IYXNQcmVmaXgodSwgImh0dHA6Ly8iKSB7CgkJcmV0dXJuIHRydWUKCX0KCWNvbnN0IHByZWZpeCA9ICIvc2FtcGxlcy8iCglpZiAhc3RyaW5ncy5IYXNQcmVmaXgodSwgcHJlZml4KSB7CgkJcmV0dXJuIGZhbHNlCgl9CglyZXN0IDo9IHVbbGVuKHByZWZpeCk6XQoJaWYgcmVzdCA9PSAiIiB7CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gYXNjaWlTZXQocmVzdCwgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS5fLSIpCn0KCmZ1bmMgYXNjaWlTZXQocywgYWxsb3dlZCBzdHJpbmcpIGJvb2wgewoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQlpZiAhc3RyaW5ncy5Db250YWluc1J1bmUoYWxsb3dlZCwgcnVuZShzW2ldKSkgewoJCQlyZXR1cm4gZmFsc2UKCQl9Cgl9CglyZXR1cm4gdHJ1ZQp9ChroHgoIYm9vay5nbm8S2x5wYWNrYWdlIGJhemFhcmdlbnMKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vYmFua2VyIgoJInN0cmNvbnYiCgoJImduby5sYW5kL3AvZzFuNHBsNXVjNHl0NXI5Nm05dzZmbWR6bngzeDBqeWc4bDZhcmhtdC9iYXphYXIvZmVlL3YxIgoJZmFjdG9yeSAiZ25vLmxhbmQvci9nMW40cGw1dWM0eXQ1cjk2bTl3NmZtZHpueDN4MGp5ZzhsNmFyaG10L2JhemFhci9iYXphYXJ2NSIKKQoKZnVuYyBMaXN0KGN1ciByZWFsbSwgaWQgaW50LCBwcmljZVVnbm90IGludDY0KSB7CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJaWYgcHJpY2VVZ25vdCA8PSAwIHsKCQlwYW5pYygiY29sOiBwcmljZSIpCgl9CglpdCA6PSBtdXN0SXRlbShpZCkKCWlmIGl0Lmxpc3RlZCB7CgkJcGFuaWMoImNvbDogbGlzdGVkIikKCX0KCWlmIGl0Lm93bmVyICE9IGNhbGxlciB7CgkJcGFuaWMoImNvbDogbm90IG93bmVyIikKCX0KCWdyY1RyYW5zZmVyKGNhbGxlciwgY2FsbGVyLCBzZWxmLCBpZCkKCWl0Lmxpc3RlZCA9IHRydWUKCWl0LnNlbGxlciA9IGNhbGxlcgoJaXQucHJpY2UgPSBwcmljZVVnbm90CglpdC5vd25lciA9IHNlbGYKCWl0ZW1zLlNldChpdGVtS2V5KGlkKSwgaXQpCgljaGFpbi5FbWl0KCJMaXN0IiwgImlkIiwgc3RyY29udi5JdG9hKGlkKSwgInNlbGxlciIsIGNhbGxlci5TdHJpbmcoKSwgInByaWNlIiwgc3RyY29udi5Gb3JtYXRJbnQocHJpY2VVZ25vdCwgMTApKQp9CgpmdW5jIFVwZGF0ZVByaWNlKGN1ciByZWFsbSwgaWQgaW50LCBwcmljZVVnbm90IGludDY0KSB7CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJaWYgcHJpY2VVZ25vdCA8PSAwIHsKCQlwYW5pYygiY29sOiBwcmljZSIpCgl9CglpdCA6PSBtdXN0SXRlbShpZCkKCWlmICFpdC5saXN0ZWQgewoJCXBhbmljKCJjb2w6IG5vdCBsaXN0ZWQiKQoJfQoJaWYgaXQuc2VsbGVyICE9IGNhbGxlciB7CgkJcGFuaWMoImNvbDogbm90IHNlbGxlciIpCgl9CglpdC5wcmljZSA9IHByaWNlVWdub3QKCWl0ZW1zLlNldChpdGVtS2V5KGlkKSwgaXQpCgljaGFpbi5FbWl0KCJMaXN0IiwgImlkIiwgc3RyY29udi5JdG9hKGlkKSwgInNlbGxlciIsIGNhbGxlci5TdHJpbmcoKSwgInByaWNlIiwgc3RyY29udi5Gb3JtYXRJbnQocHJpY2VVZ25vdCwgMTApKQp9CgpmdW5jIENhbmNlbChjdXIgcmVhbG0sIGlkIGludCkgewoJY2FsbGVyIDo9IHJlcXVpcmVVc2VyKGN1cikKCWl0IDo9IG11c3RJdGVtKGlkKQoJaWYgIWl0Lmxpc3RlZCB7CgkJcGFuaWMoImNvbDogbm90IGxpc3RlZCIpCgl9CglpZiBjYWxsZXIgIT0gaXQuc2VsbGVyIHsKCQlwYW5pYygiY29sOiBub3Qgc2VsbGVyIikKCX0KCWdyY1RyYW5zZmVyKHNlbGYsIHNlbGYsIGl0LnNlbGxlciwgaWQpCglpdC5saXN0ZWQgPSBmYWxzZQoJaXQub3duZXIgPSBpdC5zZWxsZXIKCWl0LnNlbGxlciA9IGFkZHJlc3MoIiIpCglpdC5wcmljZSA9IDAKCWl0ZW1zLlNldChpdGVtS2V5KGlkKSwgaXQpCgljaGFpbi5FbWl0KCJDYW5jZWwiLCAiaWQiLCBzdHJjb252Lkl0b2EoaWQpKQp9CgpmdW5jIEJ1eShjdXIgcmVhbG0sIGlkIGludCkgewoJY2FsbGVyIDo9IHJlcXVpcmVVc2VyKGN1cikKCWl0IDo9IG11c3RJdGVtKGlkKQoJaWYgIWl0Lmxpc3RlZCB7CgkJcGFuaWMoImNvbDogbm90IGxpc3RlZCIpCgl9CglpZiBjYWxsZXIgPT0gaXQuc2VsbGVyIHsKCQlwYW5pYygiY29sOiBzZWxmIGJ1eSIpCgl9Cgl0YWtlRXhhY3QoaXQucHJpY2UpCglwcmljZSA6PSBpdC5wcmljZQoJcHJvdG8gOj0gZmVlLlByb3RvY29sRmVlKHByaWNlLCB0cmFkZVByb3RvY29sQnBzKGl0LnNlbGxlciwgY2FsbGVyKSkKCXJveWFsIDo9IGludDY0KDApCglpZiByb3lhbHR5QnBzID4gMCB7CgkJcm95YWwgPSBmZWUuUHJvdG9jb2xGZWUocHJpY2UsIGludDY0KHJveWFsdHlCcHMpKQoJfQoJaWYgcHJvdG8rcm95YWwgPiBwcmljZSB7CgkJcGFuaWMoImNvbDogZmVlIikKCX0KCXNlbGxlckFtdCA6PSBwcmljZSAtIHByb3RvIC0gcm95YWwKCXNoYXJlIDo9IGludDY0KDApCglpZiBwcm90byA+IDAgewoJCXNoYXJlID0gZmVlLlByb3RvY29sRmVlKHByb3RvLCBmYWN0b3J5LkdlbmVzaXNTaGFyZUJwcygpKQoJfQoJc2lua0FtdCA6PSBwcm90byAtIHNoYXJlCglzaW5rIDo9IGZhY3RvcnkuUHJvdG9jb2xTaW5rKCkKCWlmIHByb3RvID4gMCAmJiAhc2luay5Jc1ZhbGlkKCkgewoJCXBhbmljKCJjb2w6IHNpbmsiKQoJfQoJYmsgOj0gYmFua2VyLk5ld0JhbmtlcihiYW5rZXIuQmFua2VyVHlwZVJlYWxtU2VuZCwgY3VyKQoJaWYgc2VsbGVyQW10ID4gMCB7CgkJYmsuU2VuZENvaW5zKHNlbGYsIGl0LnNlbGxlciwgY2hhaW4uQ29pbnN7e0Rlbm9tOiBuYXRpdmVEZW5vbSwgQW1vdW50OiBzZWxsZXJBbXR9fSkKCX0KCWlmIHJveWFsID4gMCB7CgkJYmsuU2VuZENvaW5zKHNlbGYsIGNyZWF0b3IsIGNoYWluLkNvaW5ze3tEZW5vbTogbmF0aXZlRGVub20sIEFtb3VudDogcm95YWx9fSkKCX0KCWlmIHNpbmtBbXQgPiAwIHsKCQliay5TZW5kQ29pbnMoc2VsZiwgc2luaywgY2hhaW4uQ29pbnN7e0Rlbm9tOiBuYXRpdmVEZW5vbSwgQW1vdW50OiBzaW5rQW10fX0pCgl9CglpZiBzaGFyZSA+IDAgewoJCWdhZGRyIDo9IGZhY3RvcnkuR2VuZXNpc1NpbmsoKQoJCWlmICFnYWRkci5Jc1ZhbGlkKCkgewoJCQlwYW5pYygiY29sOiBnZW5lc2lzIikKCQl9CgkJYmsuU2VuZENvaW5zKHNlbGYsIGdhZGRyLCBjaGFpbi5Db2luc3t7RGVub206IG5hdGl2ZURlbm9tLCBBbW91bnQ6IHNoYXJlfX0pCgl9CglncmNUcmFuc2ZlcihzZWxmLCBzZWxmLCBjYWxsZXIsIGlkKQoJaXQubGlzdGVkID0gZmFsc2UKCWl0Lm93bmVyID0gY2FsbGVyCglpdC5zZWxsZXIgPSBhZGRyZXNzKCIiKQoJaXQucHJpY2UgPSAwCglpdGVtcy5TZXQoaXRlbUtleShpZCksIGl0KQoJY2hhaW4uRW1pdCgiQnV5IiwgImlkIiwgc3RyY29udi5JdG9hKGlkKSwgImJ1eWVyIiwgY2FsbGVyLlN0cmluZygpLCAiZmVlIiwgc3RyY29udi5Gb3JtYXRJbnQocHJvdG8sIDEwKSkKfQoKZnVuYyBUcmFuc2ZlcihjdXIgcmVhbG0sIHRvIGFkZHJlc3MsIGlkIGludCkgewoJY2FsbGVyIDo9IHJlcXVpcmVVc2VyKGN1cikKCWlmICF0by5Jc1ZhbGlkKCkgewoJCXBhbmljKCJjb2w6IGludmFsaWQgYWRkcmVzcyIpCgl9CglpZiB0byA9PSBjYWxsZXIgfHwgdG8gPT0gc2VsZiB7CgkJcGFuaWMoImNvbDogaW52YWxpZCBhZGRyZXNzIikKCX0KCWl0IDo9IG11c3RJdGVtKGlkKQoJaWYgaXQubGlzdGVkIHsKCQlwYW5pYygiY29sOiBsaXN0ZWQiKQoJfQoJaWYgaXQub3duZXIgIT0gY2FsbGVyIHsKCQlwYW5pYygiY29sOiBub3Qgb3duZXIiKQoJfQoJZ3JjVHJhbnNmZXIoY2FsbGVyLCBjYWxsZXIsIHRvLCBpZCkKCWl0Lm93bmVyID0gdG8KCWl0ZW1zLlNldChpdGVtS2V5KGlkKSwgaXQpCgljaGFpbi5FbWl0KCJUcmFuc2ZlciIsICJpZCIsIHN0cmNvbnYuSXRvYShpZCksICJ0byIsIHRvLlN0cmluZygpKQp9CgpmdW5jIFByb3RvY29sQnBzKCkgaW50NjQgewoJcmV0dXJuIGZhY3RvcnkuUHJvdG9jb2xCcHMoKQp9CgpmdW5jIHRyYWRlUHJvdG9jb2xCcHMoc2VsbGVyLCBidXllciBhZGRyZXNzKSBpbnQ2NCB7CglicHMgOj0gUHJvdG9jb2xCcHMoKQoJZCA6PSBmYWN0b3J5LkhvbGRlckRpc2NvdW50KHNlbGxlci5TdHJpbmcoKSkKCWlmIGJkIDo9IGZhY3RvcnkuSG9sZGVyRGlzY291bnQoYnV5ZXIuU3RyaW5nKCkpOyBiZCA+IGQgewoJCWQgPSBiZAoJfQoJaWYgZCA+IGJwcyB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBicHMgLSBkCn0KCmZ1bmMgZ3JjVHJhbnNmZXIoc3BlbmRlciwgZnJvbSwgdG8gYWRkcmVzcywgaWQgaW50KSB7CgllcnIgOj0gbGVkZ2VyLlRyYW5zZmVyRnJvbShzcGVuZGVyLCBmcm9tLCB0bywgaXRlbVRpZChpZCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYygiY29sOiB0cmFuc2ZlciIpCgl9Cn0KGm4KC2dub21vZC50b21sEl9tb2R1bGUgPSAiZ25vLmxhbmQvci9nMW40cGw1dWM0eXQ1cjk2bTl3NmZtZHpueDN4MGp5ZzhsNmFyaG10L2JhemFhci9jL2JhemFhcmdlbnMiCmdubyA9ICIwLjkiCiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbCINOTAwMDAwMDB1Z25vdBIUCIDKte4BEgwxMDAwMDAwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECMUm5DwZgnt2UhYmlCfsy/+i/HtUmmVkWJmorMAzLSZASQFZIAO2gIe5L9PQAVPfwYtLdqLOmjx09zq840pITOjoyJbXSfkKPJ+bSKJ8Ks0WYXb/MVEK0NHAbDirR5FBM+moaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=