Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
D8CB2CBCF03C6F4D249707561E0F6D3E3FFC00E5EB0E741CBEF964B2FE9C7EE3
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
200,000,000
Requested gas limit
GAS USED
27,685,054
Gas consumed
FEE
200000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1t2kg2vtr3fukg43eujkn6x53gfdyakhngt4sfd25000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CoqdAQoML3ZtLm1fYWRkcGtnEvicAQooZzF0MmtnMnZ0cjNmdWtnNDNldWprbjZ4NTNnZmR5YWtobmd0NHNmZBK7nAEKBmdub2ZseRJXZ25vLmxhbmQvci9nMXQya2cydnRyM2Z1a2c0M2V1amtuNng1M2dmZHlha2huZ3Q0c2ZkL2dub2ZseS9uZnRzL21hcmtldC9iYXphYXIvdjEvZ25vZmx5Go8WCgpiYXphYXIuZ25vEoAWcGFja2FnZSBnbm9mbHkKCmltcG9ydCAoCgkic3RyY29udiIKCgkiY2hhaW4iCgoJYmF6YWFyICJnbm8ubGFuZC9yL2cxbjRwbDV1YzR5dDVyOTZtOXc2Zm1kem54M3gwanlnOGw2YXJobXQvYmF6YWFyL2JhemFhcnY1IgoKCSJnbm8ubGFuZC9yL2cxdDJrZzJ2dHIzZnVrZzQzZXVqa242eDUzZ2ZkeWFraG5ndDRzZmQvZ25vZmx5L25mdHMvcGxhbmVzIgopCgovLyBCYXphYXIgKGJhemFhci5nbm9taS5mdW4pIGxpc3RzIHRoZSBjb2xsZWN0aW9ucyByZWdpc3RlcmVkIG9uIGl0cyBmYWN0b3J5LAovLyBiYXphYXJ2NS4gVGhpcyByZWFsbSByZWdpc3RlcnMgaXRzZWxmIHRoZXJlIHdpdGggSW5pdDogdGhlIGZhY3RvcnkgdGFrZXMKLy8gaXRzIHBhdGggYXMgdGhlIGNvbGxlY3Rpb24gKHNsdWc6IHRoZSBsYXN0IGVsZW1lbnQsICJnbm9mbHkiKSBhbmQgc2VuZHMgdGhlCi8vIHNpdGUncyBMaXN0LCBCdXkgYW5kIENhbmNlbCBoZXJlLiBJdHMgZmVlIG9uIGEgc2FsZSBpcyByZWFkIGZyb20gdGhlIGZhY3RvcnkKLy8gYXQgZWFjaCBCdXkuCgpjb25zdCAoCgkvLyBXaGF0IEJhemFhciBzaG93cyBmb3IgdGhlIGNvbGxlY3Rpb246IHRoZSBwbGFuZXMgcmVhbG0ncy4KCWNvbGxlY3Rpb25OYW1lICAgPSAiZ25vZmx5IHBsYW5lcyIKCWNvbGxlY3Rpb25TeW1ib2wgPSAiUExBTkUiCgljb2xsZWN0aW9uQ292ZXIgID0gImh0dHBzOi8vZ25vZmx5Lnh5ei9uZnQvY29sbGVjdGlvbnMvcGxhbmVzLzc3Ny5wbmciCgljb2xsZWN0aW9uU3VwcGx5ID0gNzc3CgkvLyBUaGUgcGxhbmVzIHJlYWxtJ3MgbWludCBwcmljZSwgNzcgR05PVDogc2hvd24gYnkgQmF6YWFyLCBuZXZlciBjaGFyZ2VkCgkvLyBoZXJlIChwbGFuZXMgYXJlIG1pbnRlZCBvbiB0aGUgcGxhbmVzIHJlYWxtKS4KCWNvbGxlY3Rpb25NaW50UHJpY2UgPSBpbnQ2NCg3N18wMDBfMDAwKQopCgovLyByZWdpc3RlcmVkIGlzIHNldCBvbmNlIEluaXQgaGFzIHJlZ2lzdGVyZWQgdGhpcyByZWFsbSBvbiBCYXphYXIncyBmYWN0b3J5OgovLyBvbmx5IHRoZW4gZG9lcyBpdCByZXBvcnQgaXRzIG1pbnRlZCBjb3VudCB0aGVyZS4KdmFyIHJlZ2lzdGVyZWQgYm9vbAoKLy8gSW5pdCByZWdpc3RlcnMgdGhpcyByZWFsbSBvbiBCYXphYXIncyBmYWN0b3J5LiBUaGUgZmFjdG9yeSByZXF1aXJlcyB0aGUKLy8gc2x1ZyAiZ25vZmx5IiByZXNlcnZlZCBmaXJzdCwgd2l0aCBSZXNlcnZlLCBieSB0aGUgd2FsbGV0IGNhbGxpbmcgSW5pdDsgaXQKLy8gbXVzdCBiZSBhbiBhZG1pbiBvZiB0aGUgZ2FtZSByZWFsbSBoZXJlIHRvbzogdGhlIGdub2ZseSB3YWxsZXQuIE9uY2Ugb25seS4KZnVuYyBJbml0KGN1ciByZWFsbSkgewoJdXNlck9mKDAsIGN1cikKCWFzc2VydEFkbWluKDAsIGN1cikKCWlmIHJlZ2lzdGVyZWQgewoJCXBhbmljKGVyclJlZ2lzdGVyZWQpCgl9CglyZWdpc3RlcmVkID0gdHJ1ZQoJYmF6YWFyLlJlZ2lzdGVyKGNyb3NzKGN1ciksIGNvbGxlY3Rpb25OYW1lLCBjb2xsZWN0aW9uU3ltYm9sLCBjb2xsZWN0aW9uQ292ZXIsCgkJY29sbGVjdGlvblN1cHBseSwgY29sbGVjdGlvbk1pbnRQcmljZSwgcGxhbmVzLlJveWFsdHlCcHMoKSkKCW5vdGVNaW50ZWQoMCwgY3VyKQoJY2hhaW4uRW1pdCgiUmVnaXN0ZXJlZCIsICJzbHVnIiwgc2x1ZykKfQoKLy8gbm90ZU1pbnRlZCByZXBvcnRzIHRoZSBwbGFuZXMgbWludGVkIHNvIGZhciB0byBCYXphYXIncyBmYWN0b3J5LCB3aGljaAovLyBzaG93cyB0aGUgY291bnQuIE5vdGhpbmcgYmVmb3JlIEluaXQ6IHRoZSBmYWN0b3J5IGRvZXMgbm90IGtub3cgdGhpcyByZWFsbS4KZnVuYyBub3RlTWludGVkKF8gaW50LCBybG0gcmVhbG0pIHsKCWlmIHJlZ2lzdGVyZWQgewoJCWJhemFhci5Ob3RlTWludGVkKGNyb3NzKHJsbSksIE1pbnRlZCgpKQoJfQp9CgovLyBiYXphYXJGZWUgaXMgd2hhdCBCYXphYXIgdGFrZXMgb24gYSBzYWxlIGF0IHByaWNlIGJldHdlZW4gc2VsbGVyIGFuZAovLyBidXllcjogaXRzIFByb3RvY29sQnBzIGxlc3MgdGhlIGJldHRlciBob2xkZXIgZGlzY291bnQgb2YgdGhlIHR3bywgbmV2ZXIKLy8gYmVsb3cgemVyby4gT2YgaXQsIEdlbmVzaXNTaGFyZUJwcyBnb2VzIHRvIGl0cyBnZW5lc2lzIHNpbmssIHRoZSByZXN0IHRvIGl0cwovLyBwcm90b2NvbCBzaW5rLiBBbGwgcmVhZCBmcm9tIHRoZSBmYWN0b3J5IG5vdzogaXRzIGFkbWluIHNldHMgdGhlbS4KZnVuYyBiYXphYXJGZWUocHJpY2UgaW50NjQsIHNlbGxlciwgYnV5ZXIgYWRkcmVzcykgKGdlbmVzaXMsIHByb3RvY29sIGludDY0KSB7CglkaXNjb3VudCA6PSBiYXphYXIuSG9sZGVyRGlzY291bnQoc2VsbGVyLlN0cmluZygpKQoJaWYgZCA6PSBiYXphYXIuSG9sZGVyRGlzY291bnQoYnV5ZXIuU3RyaW5nKCkpOyBkID4gZGlzY291bnQgewoJCWRpc2NvdW50ID0gZAoJfQoJYnBzIDo9IGJhemFhci5Qcm90b2NvbEJwcygpIC0gZGlzY291bnQKCWlmIGJwcyA8PSAwIHsKCQlyZXR1cm4gMCwgMAoJfQoJZmVlIDo9IHByaWNlICogYnBzIC8gMTBfMDAwCglnZW5lc2lzID0gZmVlICogYmF6YWFyLkdlbmVzaXNTaGFyZUJwcygpIC8gMTBfMDAwCglyZXR1cm4gZ2VuZXNpcywgZmVlIC0gZ2VuZXNpcwp9CgovLyBSZWdpc3RlcmVkIHJlcG9ydHMgd2hldGhlciBJbml0IGhhcyByZWdpc3RlcmVkIHRoaXMgcmVhbG0gb24gQmF6YWFyLgpmdW5jIFJlZ2lzdGVyZWQoKSBib29sIHsgcmV0dXJuIHJlZ2lzdGVyZWQgfQoKLy8gaXRvYTY0IGlzIHN0cmNvbnYuRm9ybWF0SW50IGluIGJhc2UgMTAuCmZ1bmMgaXRvYTY0KG4gaW50NjQpIHN0cmluZyB7IHJldHVybiBzdHJjb252LkZvcm1hdEludChuLCAxMCkgfQoayAoKB2RvYy5nbm8SvAovLyBQYWNrYWdlIGdub2ZseSBpcyB0aGUgd3JhcHBlciB0aGF0IHB1dHMgZ25vZmx5J3MgcGxhbmVzIG9uIEJhemFhcgovLyAoYmF6YWFyLmdub21pLmZ1biksIHRoZSBORlQgbWFya2V0cGxhY2Ugb2YgZ25vLmxhbmQuCi8vCi8vIEJhemFhciBsaXN0cyB0aGUgY29sbGVjdGlvbnMgcmVnaXN0ZXJlZCBvbiBpdHMgZmFjdG9yeSwgYmF6YWFydjUsIGFuZCBzZW5kcwovLyBpdHMgc2l0ZSdzIExpc3QsIEJ1eSBhbmQgQ2FuY2VsIHRvIHRoZSBjb2xsZWN0aW9uJ3Mgb3duIHBhY2thZ2UuIFRoaXMgcmVhbG0KLy8gaXMgdGhhdCBwYWNrYWdlIGZvciB0aGUgcGxhbmVzOiBJbml0IHJlZ2lzdGVycyBpdCB1bmRlciB0aGUgc2x1ZyAiZ25vZmx5IgovLyAoaXRzIGxhc3QgcGF0aCBlbGVtZW50KSwgYW5kIGl0IGhvbGRzIHRoZSBib29rLiBJdCBtaW50cyBub3RoaW5nOiB0aGUKLy8gcGxhbmVzIGFyZSB0aGUgdG9rZW5zIG9mCi8vIGduby5sYW5kL3IvZzF0MmtnMnZ0cjNmdWtnNDNldWprbjZ4NTNnZmR5YWtobmd0NHNmZC9nbm9mbHkvbmZ0cy9wbGFuZXMsCi8vIG1vdmVkIHdpdGggdGhhdCByZWFsbSdzIFRyYW5zZmVyRnJvbS4gQSBzZWxsZXIgZmlyc3QgYXBwcm92ZXMgdGhpcyByZWFsbQovLyB0aGVyZSAoQXBwcm92ZSwgb3IgU2V0QXBwcm92YWxGb3JBbGwgb25jZSk7IExpc3QgdGhlbiBtb3ZlcyB0aGUgcGxhbmUgaGVyZSwKLy8gaW4gZXNjcm93LCBCdXkgaGFuZHMgaXQgdG8gdGhlIGJ1eWVyIGFuZCBDYW5jZWwgYmFjayB0byB0aGUgc2VsbGVyLgovLwovLyBBIHNhbGUgcGF5cywgb3V0IG9mIGl0cyBwcmljZTogQmF6YWFyJ3MgZmVlIChyZWFkIGZyb20gdGhlIGZhY3Rvcnk6IGl0cwovLyBQcm90b2NvbEJwcyBsZXNzIHRoZSBob2xkZXIgZGlzY291bnQsIHNwbGl0IGJldHdlZW4gaXRzIHNpbmtzKSwgdGhlIHBsYW5lcwovLyByZWFsbSdzIHJveWFsdHkgKDUlIHRvIHRoZSBnbm9mbHkgdHJlYXN1cnkpLCBhbmQgdGhlIHJlc3QgdG8gdGhlIHNlbGxlci4KLy8KLy8gSXQgaXMgdmVyc2lvbiB2MSBvZiB0aGUgbWFya2V0OyB2MCBpcyB0aGUgc2FtZSBib29rIHdpdGhvdXQgQmF6YWFyLCB3aGljaAovLyBjYW5ub3QgcmVnaXN0ZXIuIFNldFBhdXNlZCBzdG9wcyBuZXcgbGlzdGluZ3MgZm9yIGEgbW92ZSB0byBhIG5ld2VyIHZlcnNpb247Ci8vIENhbmNlbCBhbmQgQnV5IGtlZXAgd29ya2luZywgc28gbm8gcGxhbmUgaXMgZXZlciBzdHVjayBoZXJlLgovLwovLyBFdmVyeSB3cml0ZSBpcyBhIGRpcmVjdCBjYWxsIGZyb20gYSB3YWxsZXQ6IG5vIHJlYWxtIGNhbiBsaXN0LCBidXkgb3IKLy8gY2FuY2VsIGluIGEgdXNlcidzIG5hbWUuCnBhY2thZ2UgZ25vZmx5Chq1CgoKZXJyb3JzLmdubxKmCnBhY2thZ2UgZ25vZmx5CgovLyBUaGUgcmVmdXNhbHMgb2YgdGhpcyByZWFsbSwgYXMgc3RyaW5nczogYSBzdHJpbmcgY29uc3RhbnQgY29zdHMgaXRzIGxlbmd0aAovLyBpbiBzdG9yYWdlIHdoZXJlIGFuIGVycm9ycy5OZXcgdmFsdWUgY29zdHMgYWJvdXQgYSBraWxvYnl0ZSAoc2VlIHRoZSBwbGFuZXMKLy8gcmVhbG0ncyBlcnJvcnMuZ25vKS4gQSBwYW5pYyB3aXRoIGEgc3RyaW5nIGFib3J0cyB0aGUgY2FsbCB3aXRoIGl0Lgpjb25zdCAoCgllcnJTcG9vZmVkUmVhbG0gPSAiZ25vZmx5IG1hcmtldDogc3Bvb2ZlZCByZWFsbSIKCWVyck5vdEFkbWluICAgICA9ICJnbm9mbHkgbWFya2V0OiBjYWxsZXIgaXMgbm90IGFuIGFkbWluIgoJZXJyTm90VXNlckNhbGwgID0gImdub2ZseSBtYXJrZXQ6IGNhbGwgaXQgZGlyZWN0bHkgZnJvbSBhIHdhbGxldCAobWFrZXR4IGNhbGwgb3IgQWRlbmEpIgoKCWVyclVua25vd25QbGFuZSA9ICJnbm9mbHkgbWFya2V0OiBubyBzdWNoIHBsYW5lIgoJZXJyTm90T3duZXIgICAgID0gImdub2ZseSBtYXJrZXQ6IGNhbGxlciBkb2VzIG5vdCBvd24gdGhpcyBwbGFuZSIKCWVyck5vdFNlbGxlciAgICA9ICJnbm9mbHkgbWFya2V0OiBjYWxsZXIgaXMgbm90IHRoZSBzZWxsZXIgb2YgdGhpcyBwbGFuZSIKCWVyckxpc3RlZCAgICAgICA9ICJnbm9mbHkgbWFya2V0OiB0aGlzIHBsYW5lIGlzIGxpc3RlZCIKCWVyck5vdExpc3RlZCAgICA9ICJnbm9mbHkgbWFya2V0OiB0aGlzIHBsYW5lIGlzIG5vdCBsaXN0ZWQiCgllcnJPd25MaXN0aW5nICAgPSAiZ25vZmx5IG1hcmtldDogYSBzZWxsZXIgY2Fubm90IGJ1eSB0aGVpciBvd24gbGlzdGluZyIKCWVyclBhdXNlZCAgICAgICA9ICJnbm9mbHkgbWFya2V0OiBuZXcgbGlzdGluZ3MgYXJlIHBhdXNlZCIKCWVyckJhZFByaWNlICAgICA9ICJnbm9mbHkgbWFya2V0OiBwcmljZSBtdXN0IGJlIGJldHdlZW4gMTAwMDAwMCBhbmQgMTAwMDAwMDAwMDAwMCB1Z25vdCIKCWVyck5vdEFwcHJvdmVkICA9ICJnbm9mbHkgbWFya2V0OiBhcHByb3ZlIHRoZSBtYXJrZXQgb24gdGhlIHBsYW5lcyByZWFsbSBmaXJzdCAoQXBwcm92ZSBvciBTZXRBcHByb3ZhbEZvckFsbCkiCgllcnJCYWRSZWNpcGllbnQgPSAiZ25vZmx5IG1hcmtldDogaW52YWxpZCByZWNpcGllbnQgYWRkcmVzcyIKCWVyck5vdFN0cmF5ICAgICA9ICJnbm9mbHkgbWFya2V0OiB0aGlzIHBsYW5lIGlzIG5vdCBoZWxkIGJ5IHRoZSBtYXJrZXQgb3V0c2lkZSBhIGxpc3RpbmciCgllcnJSZWdpc3RlcmVkICAgPSAiZ25vZmx5IG1hcmtldDogYWxyZWFkeSByZWdpc3RlcmVkIG9uIEJhemFhciIKKQoafgoLZ25vbW9kLnRvbWwSb21vZHVsZSA9ICJnbm8ubGFuZC9yL2cxdDJrZzJ2dHIzZnVrZzQzZXVqa242eDUzZ2ZkeWFraG5ndDRzZmQvZ25vZmx5L25mdHMvbWFya2V0L2JhemFhci92MS9nbm9mbHkiCmdubyA9ICIwLjkiChrrOQoKbWFya2V0LmdubxLcOXBhY2thZ2UgZ25vZmx5CgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL2JhbmtlciIKCSJzdHJjb252IgoKCS8vIE9ubHkgZm9yIE9yaWdpblNlbmQsIGluIEJ1eS4gQ2FsbGVyIGlkZW50aXR5IGFsd2F5cyBjb21lcyBmcm9tIGN1ciwKCS8vIG5ldmVyIGZyb20gdGhpcyBwYWNrYWdlLgoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoKCSJnbm8ubGFuZC9wL250L2JwdHJlZS92MCIKCSJnbm8ubGFuZC9wL250L2dyYzcyMS92MCIKCgliYXphYXIgImduby5sYW5kL3IvZzFuNHBsNXVjNHl0NXI5Nm05dzZmbWR6bngzeDBqeWc4bDZhcmhtdC9iYXphYXIvYmF6YWFydjUiCgoJImduby5sYW5kL3IvZzF0MmtnMnZ0cjNmdWtnNDNldWprbjZ4NTNnZmR5YWtobmd0NHNmZC9nbm9mbHkvbmZ0cy9wbGFuZXMiCikKCmNvbnN0ICgKCXBheURlbm9tID0gInVnbm90IgoKCS8vIG1pblByaWNlIGtlZXBzIHRoZSByb3lhbHR5IGFib3ZlIHplcm8gYWZ0ZXIgcm91bmRpbmc6IDUlIG9mIDEgR05PVC4KCW1pblByaWNlID0gaW50NjQoMV8wMDBfMDAwKQoJLy8gbWF4UHJpY2Uga2VlcHMgcHJpY2UgKiByb3lhbHR5IGJwcyBmYXIgYmVsb3cgYW4gaW50NjQuCgltYXhQcmljZSA9IGludDY0KDFfMDAwXzAwMF8wMDBfMDAwKQoKCXN1cHBseSA9IDc3NyAvLyBwbGFuZSBpZHMgcnVuIGZyb20gMSB0byA3NzcKKQoKLy8gbGlzdGluZyBpcyBvbmUgcGxhbmUgZm9yIHNhbGUuIFRoZSBwbGFuZSBpdHNlbGYgaXMgaGVsZCBieSB0aGlzIHJlYWxtCi8vIChlc2Nyb3cpIHVudGlsIGl0IGlzIGJvdWdodCBvciB0aGUgbGlzdGluZyBpcyBjYW5jZWxsZWQuCnR5cGUgbGlzdGluZyBzdHJ1Y3QgewoJc2VsbGVyIGFkZHJlc3MKCXByaWNlICBpbnQ2NCAvLyB1Z25vdAp9Cgp2YXIgKAoJLy8gbGlzdGluZ3MgYnkgcGxhbmUgaWQsIGFzIGEgdGhyZWUtZGlnaXQga2V5ICgiMDQyIikgc28gdGhhdCBpdGVyYXRpb24KCS8vIHJ1bnMgaW4gaWQgb3JkZXIuCglsaXN0aW5ncyBicHRyZWUuQlBUcmVlCgkvLyBwYXVzZWQgc3RvcHMgbmV3IGxpc3RpbmdzIGFuZCBwcmljZSBjaGFuZ2VzLCBmb3IgYSBtb3ZlIHRvIGEgbmV3ZXIKCS8vIHZlcnNpb24gb2YgdGhlIG1hcmtldC4gQ2FuY2VsIGFuZCBCdXkga2VlcCB3b3JraW5nOiBub3RoaW5nIGxpc3RlZCBoZXJlCgkvLyBjYW4gYmUgc3R1Y2suCglwYXVzZWQgYm9vbAoJLy8gc2VsZiBpcyB0aGlzIHJlYWxtJ3MgYWRkcmVzcywgcmVjb3JkZWQgYXQgaW5pdDogd2hhdCBzZWxsZXJzIGFwcHJvdmUKCS8vIG9uIHRoZSBwbGFuZXMgcmVhbG0uCglzZWxmIGFkZHJlc3MKKQoKZnVuYyBpbml0KGN1ciByZWFsbSkgewoJc2VsZiA9IGN1ci5BZGRyZXNzKCkKfQoKLy8gTGlzdCBwdXRzIHBsYW5lIGlkIHVwIGZvciBzYWxlIGF0IHByaWNlVWdub3QuIFRoZSBjYWxsZXIgbXVzdCBvd24gaXQgYW5kCi8vIGhhdmUgYXBwcm92ZWQgdGhpcyByZWFsbSBvbiB0aGUgcGxhbmVzIHJlYWxtIChBcHByb3ZlIGZvciB0aGlzIHBsYW5lLCBvcgovLyBTZXRBcHByb3ZhbEZvckFsbCk6IHRoZSBwbGFuZSBtb3ZlcyBoZXJlLCBpbiBlc2Nyb3csIHVudGlsIGl0IGlzIGJvdWdodCBvcgovLyB0aGUgbGlzdGluZyBpcyBjYW5jZWxsZWQuCmZ1bmMgTGlzdChjdXIgcmVhbG0sIGlkIGludCwgcHJpY2VVZ25vdCBpbnQ2NCkgewoJc2VsbGVyIDo9IHVzZXJPZigwLCBjdXIpCglpZiBwYXVzZWQgewoJCXBhbmljKGVyclBhdXNlZCkKCX0KCWNoZWNrUHJpY2UocHJpY2VVZ25vdCkKCWlmIGxpc3RpbmdzLkhhcyhrZXkoaWQpKSB7CgkJcGFuaWMoZXJyTGlzdGVkKQoJfQoJaWYgb3duZXIgOj0gb3duZXJPZihpZCk7IG93bmVyICE9IHNlbGxlciB7CgkJcGFuaWMoZXJyTm90T3duZXIpCgl9CglpZiAhcGxhbmVzLklzQXBwcm92ZWRGb3JBbGwoc2VsbGVyLCBzZWxmKSAmJiBwbGFuZXMuR2V0QXBwcm92ZWQoaW50NjQoaWQpKSAhPSBzZWxmIHsKCQlwYW5pYyhlcnJOb3RBcHByb3ZlZCkKCX0KCWxpc3RpbmdzLlNldChrZXkoaWQpLCAmbGlzdGluZ3tzZWxsZXI6IHNlbGxlciwgcHJpY2U6IHByaWNlVWdub3R9KQoJcGxhbmVzLlRyYW5zZmVyRnJvbShjcm9zcyhjdXIpLCBzZWxsZXIsIHNlbGYsIGludDY0KGlkKSkKCW5vdGVNaW50ZWQoMCwgY3VyKQoJY2hhaW4uRW1pdCgiTGlzdCIsICJpZCIsIHN0cmNvbnYuSXRvYShpZCksICJzZWxsZXIiLCBzZWxsZXIuU3RyaW5nKCksICJwcmljZSIsIHN0cmNvbnYuRm9ybWF0SW50KHByaWNlVWdub3QsIDEwKSkKfQoKLy8gVXBkYXRlUHJpY2UgY2hhbmdlcyB0aGUgcHJpY2Ugb2YgYSBwbGFuZSB0aGUgY2FsbGVyIGxpc3RlZC4KZnVuYyBVcGRhdGVQcmljZShjdXIgcmVhbG0sIGlkIGludCwgcHJpY2VVZ25vdCBpbnQ2NCkgewoJc2VsbGVyIDo9IHVzZXJPZigwLCBjdXIpCglpZiBwYXVzZWQgewoJCXBhbmljKGVyclBhdXNlZCkKCX0KCWNoZWNrUHJpY2UocHJpY2VVZ25vdCkKCWwgOj0gbXVzdExpc3RpbmcoaWQpCglpZiBsLnNlbGxlciAhPSBzZWxsZXIgewoJCXBhbmljKGVyck5vdFNlbGxlcikKCX0KCWwucHJpY2UgPSBwcmljZVVnbm90CgljaGFpbi5FbWl0KCJVcGRhdGVQcmljZSIsICJpZCIsIHN0cmNvbnYuSXRvYShpZCksICJzZWxsZXIiLCBzZWxsZXIuU3RyaW5nKCksICJwcmljZSIsIHN0cmNvbnYuRm9ybWF0SW50KHByaWNlVWdub3QsIDEwKSkKfQoKLy8gQ2FuY2VsIHRha2VzIGEgbGlzdGluZyBkb3duIGFuZCBnaXZlcyB0aGUgcGxhbmUgYmFjayB0byBpdHMgc2VsbGVyLiBJdAovLyB3b3JrcyB3aGlsZSB0aGUgbWFya2V0IGlzIHBhdXNlZC4KZnVuYyBDYW5jZWwoY3VyIHJlYWxtLCBpZCBpbnQpIHsKCXNlbGxlciA6PSB1c2VyT2YoMCwgY3VyKQoJbCA6PSBtdXN0TGlzdGluZyhpZCkKCWlmIGwuc2VsbGVyICE9IHNlbGxlciB7CgkJcGFuaWMoZXJyTm90U2VsbGVyKQoJfQoJbGlzdGluZ3MuUmVtb3ZlKGtleShpZCkpCglwbGFuZXMuVHJhbnNmZXJGcm9tKGNyb3NzKGN1ciksIGN1ci5BZGRyZXNzKCksIHNlbGxlciwgaW50NjQoaWQpKQoJY2hhaW4uRW1pdCgiQ2FuY2VsIiwgImlkIiwgc3RyY29udi5JdG9hKGlkKSwgInNlbGxlciIsIHNlbGxlci5TdHJpbmcoKSkKfQoKLy8gQnV5IGJ1eXMgYSBsaXN0ZWQgcGxhbmU6IHNlbmQgZXhhY3RseSBpdHMgcHJpY2UgaW4gdWdub3QuIE91dCBvZiB0aGUgcHJpY2U6Ci8vIEJhemFhcidzIGZlZSAoYmF6YWFyRmVlLCB0byBpdHMgc2lua3MpLCB0aGUgcGxhbmVzIHJlYWxtJ3Mgcm95YWx0eQovLyAoUm95YWx0eUluZm86IDUlIHRvIHRoZSBnbm9mbHkgdHJlYXN1cnkpLCBhbmQgdGhlIHJlc3QgdG8gdGhlIHNlbGxlcjsgdGhlCi8vIHBsYW5lIGdvZXMgdG8gdGhlIGJ1eWVyLiBJdCB3b3JrcyB3aGlsZSB0aGUgbWFya2V0IGlzIHBhdXNlZC4KZnVuYyBCdXkoY3VyIHJlYWxtLCBpZCBpbnQpIHsKCS8vIEEgZGlyZWN0IHVzZXIgY2FsbDogb25seSB0aGVuIGhhcyB0aGUgLXNlbmQgZW52ZWxvcGUgbGFuZGVkIGF0IHRoaXMKCS8vIHJlYWxtJ3MgYWRkcmVzcywgd2hpY2ggdGhlIE9yaWdpblNlbmQgYmFua2VyIGJlbG93IHBheXMgb3V0IG9mLgoJYnV5ZXIgOj0gdXNlck9mKDAsIGN1cikKCWwgOj0gbXVzdExpc3RpbmcoaWQpCglpZiBsLnNlbGxlciA9PSBidXllciB7CgkJcGFuaWMoZXJyT3duTGlzdGluZykKCX0KCXNlbnQgOj0gdW5zYWZlLk9yaWdpblNlbmQoKQoJaWYgbGVuKHNlbnQpICE9IDEgfHwgc2VudFswXS5EZW5vbSAhPSBwYXlEZW5vbSB8fCBzZW50WzBdLkFtb3VudCAhPSBsLnByaWNlIHsKCQlwYW5pYygiZ25vZmx5IG1hcmtldDogd3JvbmcgcGF5bWVudCwgc2VuZCBleGFjdGx5ICIgKyBzdHJjb252LkZvcm1hdEludChsLnByaWNlLCAxMCkgKyBwYXlEZW5vbSkKCX0KCS8vIFRoZSBsaXN0aW5nIGdvZXMgYmVmb3JlIGFueSBjb2luIG9yIHBsYW5lIG1vdmVzLgoJbGlzdGluZ3MuUmVtb3ZlKGtleShpZCkpCgoJYmFuayA6PSBiYW5rZXIuTmV3QmFua2VyKGJhbmtlci5CYW5rZXJUeXBlT3JpZ2luU2VuZCwgY3VyKQoJcGF5IDo9IGZ1bmModG8gYWRkcmVzcywgYW1vdW50IGludDY0KSBpbnQ2NCB7CgkJaWYgYW1vdW50IDw9IDAgfHwgIXRvLklzVmFsaWQoKSB7CgkJCXJldHVybiAwCgkJfQoJCWJhbmsuU2VuZENvaW5zKGN1ci5BZGRyZXNzKCksIHRvLCBjaGFpbi5OZXdDb2lucyhjaGFpbi5OZXdDb2luKHBheURlbm9tLCBhbW91bnQpKSkKCQlyZXR1cm4gYW1vdW50Cgl9CglnZW5lc2lzLCBwcm90b2NvbCA6PSBiYXphYXJGZWUobC5wcmljZSwgbC5zZWxsZXIsIGJ1eWVyKQoJZmVlIDo9IHBheShiYXphYXIuR2VuZXNpc1NpbmsoKSwgZ2VuZXNpcykgKyBwYXkoYmF6YWFyLlByb3RvY29sU2luaygpLCBwcm90b2NvbCkKCXJlY2VpdmVyLCByb3lhbHR5IDo9IHBsYW5lcy5Sb3lhbHR5SW5mbyhpbnQ2NChpZCksIGwucHJpY2UpCglpZiByb3lhbHR5IDwgMCB8fCByb3lhbHR5ID4gbC5wcmljZS1mZWUgewoJCXJveWFsdHkgPSAwCgl9Cglyb3lhbHR5ID0gcGF5KHJlY2VpdmVyLCByb3lhbHR5KQoJcGF5KGwuc2VsbGVyLCBsLnByaWNlLWZlZS1yb3lhbHR5KQoKCXBsYW5lcy5UcmFuc2ZlckZyb20oY3Jvc3MoY3VyKSwgY3VyLkFkZHJlc3MoKSwgYnV5ZXIsIGludDY0KGlkKSkKCW5vdGVNaW50ZWQoMCwgY3VyKQoJY2hhaW4uRW1pdCgiQnV5IiwgImlkIiwgc3RyY29udi5JdG9hKGlkKSwgInNlbGxlciIsIGwuc2VsbGVyLlN0cmluZygpLCAiYnV5ZXIiLCBidXllci5TdHJpbmcoKSwKCQkicHJpY2UiLCBpdG9hNjQobC5wcmljZSksICJyb3lhbHR5IiwgaXRvYTY0KHJveWFsdHkpLCAiZmVlIiwgaXRvYTY0KGZlZSkpCn0KCi8vIFRyYW5zZmVyIGdpdmVzIGEgcGxhbmUgdGhlIGNhbGxlciBvd25zLCBub3QgbGlzdGVkLCB0byBhbm90aGVyIGFkZHJlc3MsCi8vIHRocm91Z2ggdGhpcyByZWFsbTogdGhlIGNhbGwgQmF6YWFyJ3Mgc2l0ZSBtYWtlcy4gSXQgbmVlZHMgdGhlIHNhbWUKLy8gYXBwcm92YWwgYXMgTGlzdC4gQSBwbGFuZSBjYW4gYWx3YXlzIGJlIG1vdmVkIG9uIHRoZSBwbGFuZXMgcmVhbG0gaXRzZWxmLgpmdW5jIFRyYW5zZmVyKGN1ciByZWFsbSwgdG8gYWRkcmVzcywgaWQgaW50KSB7Cglmcm9tIDo9IHVzZXJPZigwLCBjdXIpCglpZiAhdG8uSXNWYWxpZCgpIHsKCQlwYW5pYyhlcnJCYWRSZWNpcGllbnQpCgl9CglpZiBsaXN0aW5ncy5IYXMoa2V5KGlkKSkgewoJCXBhbmljKGVyckxpc3RlZCkKCX0KCWlmIG93bmVyIDo9IG93bmVyT2YoaWQpOyBvd25lciAhPSBmcm9tIHsKCQlwYW5pYyhlcnJOb3RPd25lcikKCX0KCXBsYW5lcy5UcmFuc2ZlckZyb20oY3Jvc3MoY3VyKSwgZnJvbSwgdG8sIGludDY0KGlkKSkKCWNoYWluLkVtaXQoIlRyYW5zZmVyIiwgImlkIiwgc3RyY29udi5JdG9hKGlkKSwgImZyb20iLCBmcm9tLlN0cmluZygpLCAidG8iLCB0by5TdHJpbmcoKSkKfQoKLy8gU2V0UGF1c2VkIHN0b3BzIChvciByZXN1bWVzKSBuZXcgbGlzdGluZ3MgYW5kIHByaWNlIGNoYW5nZXMuIEFkbWluIG9mIHRoZQovLyBnYW1lIHJlYWxtIG9ubHkuIENhbmNlbCBhbmQgQnV5IGtlZXAgd29ya2luZywgc28gYSBtb3ZlIHRvIGEgbmV3ZXIgbWFya2V0Ci8vIG5ldmVyIHN0cmFuZHMgYSBwbGFuZTogc2VsbGVycyBjYW5jZWwgaGVyZSBhbmQgbGlzdCB0aGVyZS4KZnVuYyBTZXRQYXVzZWQoY3VyIHJlYWxtLCBwIGJvb2wpIHsKCWFzc2VydEFkbWluKDAsIGN1cikKCXBhdXNlZCA9IHAKCWNoYWluLkVtaXQoIlBhdXNlZCIsICJwYXVzZWQiLCBzdHJjb252LkZvcm1hdEJvb2wocCkpCn0KCi8vIFJldHVyblN0cmF5IGdpdmVzIGJhY2sgYSBwbGFuZSB0aGlzIHJlYWxtIGhvbGRzIG91dHNpZGUgYW55IGxpc3Rpbmc6IG9uZQovLyBzb21lb25lIHNlbnQgaGVyZSBieSBtaXN0YWtlLiBBZG1pbiBvZiB0aGUgZ2FtZSByZWFsbSBvbmx5OyB0byBpcyB3aG8gaXQKLy8gY2FtZSBmcm9tLCBhcyB0aGUgY2hhaW4ncyB0cmFuc2ZlciBldmVudHMgc2hvdy4KZnVuYyBSZXR1cm5TdHJheShjdXIgcmVhbG0sIGlkIGludCwgdG8gYWRkcmVzcykgewoJYXNzZXJ0QWRtaW4oMCwgY3VyKQoJaWYgIXRvLklzVmFsaWQoKSB7CgkJcGFuaWMoZXJyQmFkUmVjaXBpZW50KQoJfQoJaWYgbGlzdGluZ3MuSGFzKGtleShpZCkpIHx8IG93bmVyT2YoaWQpICE9IGN1ci5BZGRyZXNzKCkgewoJCXBhbmljKGVyck5vdFN0cmF5KQoJfQoJcGxhbmVzLlRyYW5zZmVyRnJvbShjcm9zcyhjdXIpLCBjdXIuQWRkcmVzcygpLCB0bywgaW50NjQoaWQpKQoJY2hhaW4uRW1pdCgiUmV0dXJuU3RyYXkiLCAiaWQiLCBzdHJjb252Lkl0b2EoaWQpLCAidG8iLCB0by5TdHJpbmcoKSkKfQoKLy8gUGF1c2VkIHJlcG9ydHMgd2hldGhlciBuZXcgbGlzdGluZ3MgYXJlIHN0b3BwZWQuCmZ1bmMgUGF1c2VkKCkgYm9vbCB7IHJldHVybiBwYXVzZWQgfQoKLy8gY2hlY2tQcmljZSBwYW5pY3MgdW5sZXNzIHAgaXMgYSBwcmljZSB0aGlzIG1hcmtldCB0YWtlcy4KZnVuYyBjaGVja1ByaWNlKHAgaW50NjQpIHsKCWlmIHAgPCBtaW5QcmljZSB8fCBwID4gbWF4UHJpY2UgewoJCXBhbmljKGVyckJhZFByaWNlKQoJfQp9CgovLyBtdXN0TGlzdGluZyByZXR1cm5zIHRoZSBsaXN0aW5nIG9mIHBsYW5lIGlkLCBvciBwYW5pY3MuCmZ1bmMgbXVzdExpc3RpbmcoaWQgaW50KSAqbGlzdGluZyB7Cgl2IDo9IGxpc3RpbmdzLkdldChrZXkoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXBhbmljKGVyck5vdExpc3RlZCkKCX0KCXJldHVybiB2LigqbGlzdGluZykKfQoKLy8gZ2V0TGlzdGluZyByZXR1cm5zIHRoZSBsaXN0aW5nIG9mIHBsYW5lIGlkLCBvciBuaWwuCmZ1bmMgZ2V0TGlzdGluZyhpZCBpbnQpICpsaXN0aW5nIHsKCWlmIHYgOj0gbGlzdGluZ3MuR2V0KGtleShpZCkpOyB2ICE9IG5pbCB7CgkJcmV0dXJuIHYuKCpsaXN0aW5nKQoJfQoJcmV0dXJuIG5pbAp9CgovLyBvd25lck9mIHJldHVybnMgdGhlIG93bmVyIG9mIHBsYW5lIGlkIG9uIHRoZSBwbGFuZXMgcmVhbG0sIG9yIHBhbmljcyBmb3IKLy8gYW4gaWQgdGhhdCBpcyBub3QgYSBtaW50ZWQgcGxhbmUuCmZ1bmMgb3duZXJPZihpZCBpbnQpIGFkZHJlc3MgewoJaWYgaWQgPCAxIHx8IGlkID4gc3VwcGx5IHsKCQlwYW5pYyhlcnJVbmtub3duUGxhbmUpCgl9Cglvd25lciwgZXJyIDo9IHBsYW5lcy5Pd25lck9mKHRpZChpZCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnJVbmtub3duUGxhbmUpCgl9CglyZXR1cm4gb3duZXIKfQoKLy8ga2V5IGlzIHRoZSBsaXN0aW5ncyBrZXkgb2YgcGxhbmUgaWQ6IHRocmVlIGRpZ2l0cywgIjA0MiIuCmZ1bmMga2V5KGlkIGludCkgc3RyaW5nIHsKCXMgOj0gc3RyY29udi5JdG9hKGlkKQoJZm9yIGxlbihzKSA8IDMgewoJCXMgPSAiMCIgKyBzCgl9CglyZXR1cm4gcwp9CgpmdW5jIHRpZChpZCBpbnQpIGdyYzcyMS5Ub2tlbklEIHsgcmV0dXJuIGdyYzcyMS5Ub2tlbklEKHN0cmNvbnYuSXRvYShpZCkpIH0KGogqCghyZWFkLmdubxL7KXBhY2thZ2UgZ25vZmx5CgppbXBvcnQgKAoJInN0cmNvbnYiCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9udC9ncmM3MjEvdjAiCgkiZ25vLmxhbmQvcC9vbmJsb2MvanNvbi92MCIKCgkiZ25vLmxhbmQvci9nMXQya2cydnRyM2Z1a2c0M2V1amtuNng1M2dmZHlha2huZ3Q0c2ZkL2dub2ZseS9uZnRzL3BsYW5lcyIKKQoKLy8gVGhlIHJlYWRzIGFyZSBpbiB0aGUgc2hhcGVzIEJhemFhcidzIHNpdGUgKGJhemFhci5nbm9taS5mdW4pIHBhcnNlcyBvbiBhCi8vIGNvbGxlY3Rpb24gcGFja2FnZSwgc28gdGhhdCB0aGlzIG1hcmtldCBjYW4gYmUgcmVnaXN0ZXJlZCB0aGVyZSBsYXRlcgovLyB3aXRob3V0IGEgbmV3IHZlcnNpb24uIExpbmVzIGFyZSBmaWVsZHMgam9pbmVkIGJ5ICJ8IjoKLy8KLy8JaWR8bmFtZXxvd25lcnxzZWxsZXJ8cHJpY2V8bGlzdGVkfGltYWdlfGNvbGxlY3Rpb258cmFyaXR5fHRyYWl0c3xyZXZlYWxlZHxzbG90Ci8vCi8vIG93bmVyIGlzIHRoZSBwbGFuZXMgcmVhbG0ncyBvd25lciwgdGhpcyByZWFsbSBmb3IgYSBsaXN0ZWQgcGxhbmUgKGVzY3Jvdyk7Ci8vIHNlbGxlciBhbmQgcHJpY2UgYXJlIGVtcHR5IGFuZCAwIHdoZW4gdGhlIHBsYW5lIGlzIG5vdCBsaXN0ZWQuIGNvbGxlY3Rpb24KLy8gaXMgdGhlIHNsdWcgQmF6YWFyIHdvdWxkIGtub3cgdGhpcyByZWFsbSBieTogdGhlIGxhc3QgcGF0aCBlbGVtZW50LgoKLy8gc2x1ZyBpcyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoaXMgcmVhbG0ncyBwYXRoLgpjb25zdCBzbHVnID0gImdub2ZseSIKCi8vIG1heE9wZW4gaXMgdGhlIG1vc3QgbGlzdGluZ3MgTGlzdE9wZW4gcmV0dXJucywgYXMgQmF6YWFyJ3Mgb3duIHJlYWxtcyBkby4KY29uc3QgbWF4T3BlbiA9IDUwCgovLyBOYW1lIGFuZCBTeW1ib2wgYXJlIHRoZSBwbGFuZXMgY29sbGVjdGlvbidzOiB0aGUgbWFya2V0IHNlbGxzIG5vdGhpbmcgZWxzZS4KZnVuYyBOYW1lKCkgc3RyaW5nICAgeyByZXR1cm4gImdub2ZseSBwbGFuZXMiIH0KZnVuYyBTeW1ib2woKSBzdHJpbmcgeyByZXR1cm4gIlBMQU5FIiB9CgovLyBNaW50ZWQgcmV0dXJucyBob3cgbWFueSBwbGFuZXMgd2VyZSBtaW50ZWQuCmZ1bmMgTWludGVkKCkgaW50IHsgcmV0dXJuIGludChwbGFuZXMuTWludGVkKCkpIH0KCi8vIE93bmVyT2YgcmV0dXJucyB0aGUgb3duZXIgb2YgYSBwbGFuZSBvbiB0aGUgcGxhbmVzIHJlYWxtOiB0aGlzIHJlYWxtIHdoaWxlCi8vIGl0IGlzIGxpc3RlZC4KZnVuYyBPd25lck9mKHRpZCBzdHJpbmcpIChhZGRyZXNzLCBlcnJvcikgewoJcmV0dXJuIHBsYW5lcy5Pd25lck9mKGdyYzcyMS5Ub2tlbklEKHRpZCkpCn0KCi8vIFRva2VuVVJJIHJldHVybnMgdGhlIGltYWdlIG9mIGEgcGxhbmUsIGFuIGh0dHBzIFVSTC4KZnVuYyBUb2tlblVSSSh0aWQgc3RyaW5nKSBzdHJpbmcgewoJdXJpLCBlcnIgOj0gcGxhbmVzLlRva2VuVVJJKGdyYzcyMS5Ub2tlbklEKHRpZCkpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gIiIKCX0KCXJldHVybiB1cmkKfQoKLy8gVG9rZW5zT2YgcmV0dXJucyB0aGUgaWRzIG9mIHRoZSBwbGFuZXMgb3duZXIgaG9sZHMsIGNvbW1hLXNlcGFyYXRlZCwgaW4KLy8gaWQgb3JkZXI6ICIzLDQyLDcwMCIuIEEgbGlzdGVkIHBsYW5lIGlzIG5vdCBhbW9uZyB0aGVtOiBpdCBpcyBoZWxkIGhlcmUuCmZ1bmMgVG9rZW5zT2Yob3duZXIgc3RyaW5nKSBzdHJpbmcgewoJaWRzIDo9IHN0cmluZ3MuVHJpbVN1ZmZpeChzdHJpbmdzLlRyaW1QcmVmaXgocGxhbmVzLlBsYW5lc09mKGFkZHJlc3Mob3duZXIpKSwgIlsiKSwgIl0iKQoJcmV0dXJuIGlkcwp9CgovLyBMaXN0T3BlbiByZXR1cm5zIHRoZSBsaXN0aW5ncywgb25lIGxpbmUgZWFjaCwgaW4gaWQgb3JkZXIsIGF0IG1vc3QgNTAuCmZ1bmMgTGlzdE9wZW4oKSBzdHJpbmcgewoJdmFyIGxpbmVzIFtdc3RyaW5nCglsaXN0aW5ncy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhrIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCWlkLCBfIDo9IHN0cmNvbnYuQXRvaShrKQoJCWxpbmVzID0gYXBwZW5kKGxpbmVzLCBsaW5lKGlkLCB2LigqbGlzdGluZykpKQoJCXJldHVybiBsZW4obGluZXMpID49IG1heE9wZW4KCX0pCglyZXR1cm4gc3RyaW5ncy5Kb2luKGxpbmVzLCAiXG4iKQp9CgovLyBJdGVtTGluZSByZXR1cm5zIHRoZSBsaW5lIG9mIHBsYW5lIGlkLCBsaXN0ZWQgb3Igbm90LiBJdCBwYW5pY3MgZm9yIGFuIGlkCi8vIHRoYXQgaXMgbm90IGEgbWludGVkIHBsYW5lOiBCYXphYXIncyBzaXRlIHNraXBzIHRoZSBpZHMgaXQgY2Fubm90IHJlYWQuCmZ1bmMgSXRlbUxpbmUoaWQgaW50KSBzdHJpbmcgewoJb3duZXJPZihpZCkgLy8gcGFuaWNzIGZvciBhbiBpZCB0aGF0IGlzIG5vdCBtaW50ZWQKCXJldHVybiBsaW5lKGlkLCBnZXRMaXN0aW5nKGlkKSkKfQoKLy8gbGluZSBidWlsZHMgdGhlIGxpbmUgb2YgcGxhbmUgaWQ7IGwgaXMgaXRzIGxpc3RpbmcsIG5pbCB3aGVuIGl0IGhhcyBub25lLgpmdW5jIGxpbmUoaWQgaW50LCBsICpsaXN0aW5nKSBzdHJpbmcgewoJcCA6PSBwbGFuZUluZm8oaWQpCglvd25lciwgXyA6PSBwbGFuZXMuT3duZXJPZih0aWQoaWQpKQoJc2VsbGVyLCBwcmljZSwgbGlzdGVkIDo9ICIiLCAiMCIsICJmYWxzZSIKCWlmIGwgIT0gbmlsIHsKCQlzZWxsZXIsIHByaWNlLCBsaXN0ZWQgPSBsLnNlbGxlci5TdHJpbmcoKSwgc3RyY29udi5Gb3JtYXRJbnQobC5wcmljZSwgMTApLCAidHJ1ZSIKCX0KCXRyYWl0cyA6PSAibW9kZWw6IiArIHAubW9kZWwgKyAiLHBpbG90OiIgKyBwLnBpbG90ICsgIixsYXNlcjoiICsgcC5sYXNlcgoJcmV0dXJuIHN0cmluZ3MuSm9pbihbXXN0cmluZ3sKCQlzdHJjb252Lkl0b2EoaWQpLCBjbGVhbihwLm5hbWUpLCBvd25lci5TdHJpbmcoKSwgc2VsbGVyLCBwcmljZSwgbGlzdGVkLAoJCWNsZWFuKHAuaW1hZ2UpLCBzbHVnLCBwLnRpZXIsIGNsZWFuKHRyYWl0cyksICJ0cnVlIiwgIiIsCgl9LCAifCIpCn0KCnR5cGUgcGxhbmUgc3RydWN0IHsKCW5hbWUsIGltYWdlLCB0aWVyLCBtb2RlbCwgcGlsb3QsIGxhc2VyIHN0cmluZwp9CgovLyBwbGFuZUluZm8gcmVhZHMgcGxhbmUgaWQgZnJvbSB0aGUgcGxhbmVzIHJlYWxtJ3MgUGxhbmVKU09OLgpmdW5jIHBsYW5lSW5mbyhpZCBpbnQpIHBsYW5lIHsKCW5vZGUsIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocGxhbmVzLlBsYW5lSlNPTihpbnQ2NChpZCkpKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVyclVua25vd25QbGFuZSkKCX0KCXN0ciA6PSBmdW5jKGsgc3RyaW5nKSBzdHJpbmcgewoJCXYsIGVyciA6PSBub2RlLkdldEtleShrKQoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gIiIKCQl9CgkJcywgZXJyIDo9IHYuR2V0U3RyaW5nKCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuICIiCgkJfQoJCXJldHVybiBzCgl9CglyZXR1cm4gcGxhbmV7CgkJbmFtZTogc3RyKCJuYW1lIiksIGltYWdlOiBzdHIoImltYWdlIiksIHRpZXI6IHN0cigidGllciIpLAoJCW1vZGVsOiBzdHIoIm1vZGVsIiksIHBpbG90OiBzdHIoInBpbG90IiksIGxhc2VyOiBzdHIoImxhc2VyIiksCgl9Cn0KCi8vIGNsZWFuIGtlZXBzIGEgZmllbGQgZnJvbSBicmVha2luZyBhIGxpbmU6IG5vICJ8IiBhbmQgbm8gbGluZSBicmVhay4gVGhlCi8vIHBsYW5lcyByZWFsbSdzIG5hbWVzIGFuZCBVUkxzIGhhdmUgbm9uZTsgdGhpcyBpcyBhIGd1YXJkLCBub3QgYSBmaWx0ZXIuCmZ1bmMgY2xlYW4ocyBzdHJpbmcpIHN0cmluZyB7CglyZXR1cm4gc3RyaW5ncy5OZXdSZXBsYWNlcigifCIsICIgIiwgIlxuIiwgIiAiLCAiXHIiLCAiICIpLlJlcGxhY2UocykKfQoKLy8gUmVuZGVyIHNob3dzIHRoZSBsaXN0aW5ncyBvbiBnbm93ZWIuCmZ1bmMgUmVuZGVyKF8gc3RyaW5nKSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKCIjIGdub2ZseSBwbGFuZXMgb24gQmF6YWFyXG5cbiIpCgliLldyaXRlU3RyaW5nKCJUaGUgW2dub2ZseV0oaHR0cHM6Ly9nbm9mbHkueHl6KSBwbGFuZXMgZm9yIHNhbGUgb24gW0JhemFhcl0oaHR0cHM6Ly9iYXphYXIuZ25vbWkuZnVuKSwgdGhlIGNvbGxlY3Rpb24gYGdub2ZseWAuICIpCgliLldyaXRlU3RyaW5nKCJBIGxpc3RlZCBwbGFuZSBpcyBoZWxkIGJ5IHRoaXMgcmVhbG0gdW50aWwgaXQgaXMgYm91Z2h0IG9yIHRoZSBsaXN0aW5nIGlzIGNhbmNlbGxlZC4gIikKCWIuV3JpdGVTdHJpbmcoIkVhY2ggc2FsZSBwYXlzIEJhemFhcidzIGZlZSBhbmQgdGhlIHBsYW5lcycgcm95YWx0eSB0byB0aGUgZ25vZmx5IHRyZWFzdXJ5LCB0aGUgcmVzdCB0byB0aGUgc2VsbGVyLlxuXG4iKQoJaWYgIXJlZ2lzdGVyZWQgewoJCWIuV3JpdGVTdHJpbmcoIk5vdCByZWdpc3RlcmVkIG9uIEJhemFhciB5ZXQuXG5cbiIpCgl9CglpZiBwYXVzZWQgewoJCWIuV3JpdGVTdHJpbmcoIk5ldyBsaXN0aW5ncyBhcmUgcGF1c2VkOiBsaXN0ZWQgcGxhbmVzIGNhbiBzdGlsbCBiZSBib3VnaHQgb3IgY2FuY2VsbGVkLlxuXG4iKQoJfQoJaWYgbGlzdGluZ3MuU2l6ZSgpID09IDAgewoJCWIuV3JpdGVTdHJpbmcoIk5vIHBsYW5lIGlzIGZvciBzYWxlLlxuIikKCQlyZXR1cm4gYi5TdHJpbmcoKQoJfQoJYi5Xcml0ZVN0cmluZygifCBQbGFuZSB8IFRpZXIgfCBQcmljZSB8IFNlbGxlciB8XG58LS0tfC0tLXwtLS18LS0tfFxuIikKCWxpc3RpbmdzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGsgc3RyaW5nLCB2IGFueSkgYm9vbCB7CgkJaWQsIF8gOj0gc3RyY29udi5BdG9pKGspCgkJbCA6PSB2LigqbGlzdGluZykKCQlwIDo9IHBsYW5lSW5mbyhpZCkKCQliLldyaXRlU3RyaW5nKCJ8IFsjIiArIGsgKyAiICIgKyBwLm5hbWUgKyAiXShodHRwczovL2dub2ZseS54eXovbmZ0L2NvbGxlY3Rpb25zL3BsYW5lcy8iICsgc3RyY29udi5JdG9hKGlkKSArICIpIHwgIiArCgkJCXAudGllciArICIgfCAiICsgZ25vdChsLnByaWNlKSArICIgfCAiICsgbC5zZWxsZXIuU3RyaW5nKCkgKyAiIHxcbiIpCgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKLy8gZ25vdCB3cml0ZXMgdWdub3QgYXMgR05PVDogMTAwMDAwMCBpcyAiMSBHTk9UIiwgMTUwMDAwMCAiMS41IEdOT1QiLgpmdW5jIGdub3QodWdub3QgaW50NjQpIHN0cmluZyB7Cgl3aG9sZSwgZnJhYyA6PSB1Z25vdC8xXzAwMF8wMDAsIHVnbm90JTFfMDAwXzAwMAoJaWYgZnJhYyA9PSAwIHsKCQlyZXR1cm4gc3RyY29udi5Gb3JtYXRJbnQod2hvbGUsIDEwKSArICIgR05PVCIKCX0KCWYgOj0gc3RyaW5ncy5UcmltUmlnaHQoc3RyY29udi5Gb3JtYXRJbnQoZnJhYysxXzAwMF8wMDAsIDEwKVsxOl0sICIwIikKCXJldHVybiBzdHJjb252LkZvcm1hdEludCh3aG9sZSwgMTApICsgIi4iICsgZiArICIgR05PVCIKfQoapQsKCXJvbGVzLmdubxKXC3BhY2thZ2UgZ25vZmx5CgppbXBvcnQgImduby5sYW5kL3IvZzF0MmtnMnZ0cjNmdWtnNDNldWprbjZ4NTNnZmR5YWtobmd0NHNmZC9nbm9mbHkvZ2FtZS92MCIKCi8vIFRoZSBtYXJrZXQga2VlcHMgbm8gcm9sZXMgb2YgaXRzIG93bjogaXRzIGFkbWlucyBhcmUgdGhlIGdhbWUgcmVhbG0ncywKLy8gYXNrZWQgYWdhaW4gYXQgZXZlcnkgY2FsbCwgYXMgdGhlIHBsYW5lcyBhbmQgc2tpbnMgcmVhbG1zIGRvLgoKLy8gYXV0aG9yaXR5IGlzIHRoZSBvbmUgcXVlc3Rpb24gdGhpcyByZWFsbSBhc2tzIGFib3V0IHJvbGVzLgp0eXBlIGF1dGhvcml0eSBpbnRlcmZhY2UgewoJSXNBZG1pbihhZGRyIGFkZHJlc3MpIGJvb2wKfQoKLy8gZ2FtZVJvbGVzIGFuc3dlcnMgd2l0aCB0aGUgcm9sZXMgb2YgdGhlIGdhbWUgcmVhbG0uCnR5cGUgZ2FtZVJvbGVzIHN0cnVjdHt9CgpmdW5jIChnYW1lUm9sZXMpIElzQWRtaW4oYWRkciBhZGRyZXNzKSBib29sIHsgcmV0dXJuIGdhbWUuSXNBZG1pbihhZGRyKSB9CgovLyByb2xlcyBpcyB0aGUgYXV0aG9yaXR5IG9mIHRoaXMgcmVhbG0uIEl0IGlzIGEgdmFyaWFibGUgb25seSBzbyB0aGF0IHRoZQovLyB0ZXN0cyBjYW4gYW5zd2VyIGZvciB0aGUgZ2FtZSByZWFsbSwgd2hpY2ggaGFzIG5vIGFkbWluIHVuZGVyIGBnbm8gdGVzdGAuCnZhciByb2xlcyBhdXRob3JpdHkgPSBnYW1lUm9sZXN7fQoKLy8gY2FsbGVyT2YgcmV0dXJucyB0aGUgdmVyaWZpZWQgY2FsbGVyIG9mIGEgY3Jvc3NpbmcgZnVuY3Rpb247IHJsbSBtdXN0IGJlCi8vIGl0cyBsaXZlIGN1ci4KZnVuYyBjYWxsZXJPZihfIGludCwgcmxtIHJlYWxtKSBhZGRyZXNzIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXBhbmljKGVyclNwb29mZWRSZWFsbSkKCX0KCXJldHVybiBybG0uUHJldmlvdXMoKS5BZGRyZXNzKCkKfQoKLy8gdXNlck9mIHJldHVybnMgdGhlIGNhbGxlciwgd2hvIG11c3QgYmUgYSB3YWxsZXQgY2FsbGluZyBkaXJlY3RseTogbmV2ZXIgYQovLyByZWFsbSwgc28gdGhhdCBubyBjb250cmFjdCBjYW4gYWN0IGluIGEgdXNlcidzIG5hbWUgb3Igd3JhcCBhIHB1cmNoYXNlLgpmdW5jIHVzZXJPZihfIGludCwgcmxtIHJlYWxtKSBhZGRyZXNzIHsKCWNhbGxlciA6PSBjYWxsZXJPZigwLCBybG0pCglpZiAhcmxtLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsKCQlwYW5pYyhlcnJOb3RVc2VyQ2FsbCkKCX0KCXJldHVybiBjYWxsZXIKfQoKLy8gYXNzZXJ0QWRtaW4gcGFuaWNzIHVubGVzcyB0aGUgY2FsbGVyIGlzIGFuIGFkbWluIG9mIHRoZSBnYW1lIHJlYWxtLgpmdW5jIGFzc2VydEFkbWluKF8gaW50LCBybG0gcmVhbG0pIGFkZHJlc3MgewoJY2FsbGVyIDo9IGNhbGxlck9mKDAsIHJsbSkKCWlmICFyb2xlcy5Jc0FkbWluKGNhbGxlcikgewoJCXBhbmljKGVyck5vdEFkbWluKQoJfQoJcmV0dXJuIGNhbGxlcgp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbCINMjUwMDAwMDB1Z25vdBITCICI3r4BEgsyMDAwMDB1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQNeXNrocmeWXbqxhnWB4lKlT78iunfJmzE893vTqcXWxxJAsQLRlIuTfduV0DEwAWUn+V7GeMSWOG/3vkawufQdczhq/YRQSw7JsiVeUZ6C2NtN7o230Nk4T8W8bwkvRNg7KRooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==