Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
1EAC8D00E8BF7216324A12441F9CFA9479F9F7D77134275100B6C534CC80D758
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
27,993,672
Requested gas limit
GAS USED
23,328,010
Gas consumed
FEE
1000000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1manfred47kzduec920z88wfr64ylksmdcedlf5
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CvyFAQoML3ZtLm1fYWRkcGtnEuqFAQooZzFtYW5mcmVkNDdremR1ZWM5MjB6ODh3ZnI2NHlsa3NtZGNlZGxmNRK8hQEKB3Jwc2R1ZWwSImduby5sYW5kL3IvbW91bC94L2RhaWx5L3Jwc2R1ZWwvdjAamhkKCVJFQURNRS5tZBKMGSMgUm9jay1QYXBlci1TY2lzc29ycyBEdWVsCgo+IOKaoO+4jyAqKkV4cGVyaW1lbnRhbCDigJQgZ2VuZXJhdGVkIHdpdGggbm8gaHVtYW4gc3VwZXJ2aXNpb24uKiogVGhpcyByZWFsbSB3YXMKPiBwcm9kdWNlZCBhdXRvbWF0aWNhbGx5IGJ5IGFuIE1DUC1kcml2ZW4gYWdlbnQgdG8gZXhlcmNpc2UgdGhlIGdubyBNQ1Agc2VydmVyCj4gYW5kIHRvb2xpbmcsIGFuZCB0byBnZW5lcmF0ZSB0ZXN0IGNvbnRlbnQgZm9yIGdubyBjb21waWxlcnMsIGxpbnRlcnMgYW5kCj4gZm9ybWF0dGVycy4gKipOb3QgYXVkaXRlZC4gTm90IGZvciBwcm9kdWN0aW9uLioqIEZ1bGwgY29udGV4dCAmIGZvbGRlciBSRUFETUU6Cj4gW3IvbW91bC94L2RhaWx5XShodHRwczovL2dpdGh1Yi5jb20vbW91bC9nbm8tY29udHJhY3RzL2Jsb2IvbWFpbi9yL21vdWwveC9kYWlseS9SRUFETUUubWQpCgotLS0KCgpBc3luY2hyb25vdXMsIHR3by1wbGF5ZXIgcm9jay1wYXBlci1zY2lzc29ycyB3aXRoIGEgcmVhbCBjb21taXQtcmV2ZWFsCmhhbmRzaGFrZTogdGhlIGNoYWxsZW5nZXIgbG9ja3MgaW4gYSBtb3ZlIGFzIGEgc2hhMjU2IGNvbW1pdG1lbnQsIHRoZQpvcHBvbmVudCByZXBsaWVzIGluIHRoZSBvcGVuIChzZWVpbmcgb25seSBhIGhhc2ggZ2l2ZXMgdGhlbSBub3RoaW5nIHRvIGdvCm9uKSwgYW5kIHRoZSBjaGFsbGVuZ2VyIHJldmVhbHMgbGFzdCB0byBzZXR0bGUgdGhlIHJvdW5kLiBBIGNoYWxsZW5nZXIgd2hvCnRyaWVzIHRvIGRvZGdlIGEgbG9zaW5nIHJldmVhbCBjYW4gYmUgZm9yZmVpdGVkIGJ5IHRoZSBvcHBvbmVudCBvbmNlIGEKNTAtYmxvY2sgcmV2ZWFsIHdpbmRvdyBleHBpcmVzIOKAlCBubyBob3VzZSBtb3ZlLCBubyBzaW5nbGUtdHggc2hvcnRjdXQsIGp1c3QKdHdvIHBsYXllcnMgYW5kIGEgZmFpcm5lc3MgcHJpbWl0aXZlLgoKKipSZWFsbSBwYXRoOioqIGBnbm8ubGFuZC9yL2cxMmNzNGNlaHVqcGZmcGpweXdta3FqNDNtNnU1eWE1M25qNjlzanovcnBzZHVlbGAKCiMjIEV4YW1wbGUgY2FsbHMKCmBgYHNoCiMgMS4gQ29tcHV0ZSB5b3VyIGNvbW1pdG1lbnQgb2ZmLWNoYWluIChvciB2aWEgYSByZWFkLW9ubHkgcXVlcnkpCmdub2tleSBxdWVyeSB2bS9xZXZhbCBcCiAgLS1kYXRhICdnbm8ubGFuZC9yL2cxMmNzNGNlaHVqcGZmcGpweXdta3FqNDNtNnU1eWE1M25qNjlzanovcnBzZHVlbC5Db21wdXRlQ29tbWl0KCJyb2NrIiwgInh5ejEyMyIpJwoKIyAyLiBPcGVuIGEgZHVlbCBhZ2FpbnN0IGFuIG9wcG9uZW50IHdpdGggdGhhdCBjb21taXRtZW50Cmdub2tleSBtYWtldHggY2FsbCBcCiAgLXBrZ3BhdGggImduby5sYW5kL3IvZzEyY3M0Y2VodWpwZmZwanB5d21rcWo0M202dTV5YTUzbmo2OXNqei9ycHNkdWVsIiBcCiAgLWZ1bmMgT3BlbiAtYXJncyAiZzFvcHBvbmVudGFkZHIuLi4iIC1hcmdzICI8NjQtY2hhciBoZXggY29tbWl0PiIgXAogIC1nYXMtZmVlIDEwMDAwMDB1Z25vdCAtZ2FzLXdhbnRlZCAzMDAwMDAwIC1icm9hZGNhc3QgLWNoYWluaWQgc2FwcGhpcmUtMSA8a2V5PgoKIyAzLiBPcHBvbmVudCByZXBsaWVzIGluIHRoZSBjbGVhcgpnbm9rZXkgbWFrZXR4IGNhbGwgXAogIC1wa2dwYXRoICJnbm8ubGFuZC9yL2cxMmNzNGNlaHVqcGZmcGpweXdta3FqNDNtNnU1eWE1M25qNjlzanovcnBzZHVlbCIgXAogIC1mdW5jIEFjY2VwdCAtYXJncyAiMSIgLWFyZ3MgInBhcGVyIiBcCiAgLWdhcy1mZWUgMTAwMDAwMHVnbm90IC1nYXMtd2FudGVkIDMwMDAwMDAgLWJyb2FkY2FzdCAtY2hhaW5pZCBzYXBwaGlyZS0xIDxrZXk+CgojIDQuIENoYWxsZW5nZXIgcmV2ZWFscyB0byBzZXR0bGUgaXQKZ25va2V5IG1ha2V0eCBjYWxsIFwKICAtcGtncGF0aCAiZ25vLmxhbmQvci9nMTJjczRjZWh1anBmZnBqcHl3bWtxajQzbTZ1NXlhNTNuajY5c2p6L3Jwc2R1ZWwiIFwKICAtZnVuYyBSZXZlYWwgLWFyZ3MgIjEiIC1hcmdzICJyb2NrIiAtYXJncyAieHl6MTIzIiBcCiAgLWdhcy1mZWUgMTAwMDAwMHVnbm90IC1nYXMtd2FudGVkIDMwMDAwMDAgLWJyb2FkY2FzdCAtY2hhaW5pZCBzYXBwaGlyZS0xIDxrZXk+CgojIFZpZXcgdGhlIGxvYmJ5LCBhIHNwZWNpZmljIGR1ZWwsIG9yIGEgcGxheWVyJ3MgcmVjb3JkCmdub2tleSBxdWVyeSB2bS9xcmVuZGVyIC0tZGF0YSAiZ25vLmxhbmQvci9nMTJjczRjZWh1anBmZnBqcHl3bWtxajQzbTZ1NXlhNTNuajY5c2p6L3Jwc2R1ZWw6Igpnbm9rZXkgcXVlcnkgdm0vcXJlbmRlciAtLWRhdGEgImduby5sYW5kL3IvZzEyY3M0Y2VodWpwZmZwanB5d21rcWo0M202dTV5YTUzbmo2OXNqei9ycHNkdWVsOjEiCmBgYAoKIyMgVG9vbGNoYWluIHN0YXR1cwoKQ29tcGlsZWQgYW5kIHRlc3RlZCBhZ2FpbnN0IHRoZSBgY2hhaW4vc2FwcGhpcmVgIChnbm8gMC45KSB0b29sY2hhaW4gdGFnIGZyb20KYGdub2xhbmcvZ25vYCDigJQgYGdubyB0ZXN0IC5gIGFuZCBgZ25vIGxpbnQgLmAgYm90aCBwYXNzIGNsZWFuLgoKPCEtLSBCRUdJTiBHTk9DT05UUkFDVFMgRk9PVEVSIChnZW5lcmF0ZWQgYnkgYG1ha2UgcmVhZG1lc2A7IGRvIG5vdCBlZGl0IGJlbG93KSAtLT4KCi0tLQoKUGFydCBvZiAqKlttb3VsL2duby1jb250cmFjdHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3VsL2duby1jb250cmFjdHMpKiog4oCUIG1vdWwncyB2ZXJzaW9uZWQgZ25vLmxhbmQgY29udHJhY3RzLiBTZWUgdGhlIHJlcG9zaXRvcnkgZm9yIHRoZSBmdWxsIGNhdGFsb2csIGJ1aWxkL3Rlc3QgdG9vbGluZywgYW5kIHVzYWdlLgoKKipEZXBlbmRlbmN5IGdyYXBoOioqCgohW2duby5sYW5kL3IvbW91bC94L2RhaWx5L3Jwc2R1ZWwvdjAgZGVwZW5kZW5jeSBncmFwaF0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL21vdWwvZ25vLWNvbnRyYWN0cy9tYWluL19hc3NldHMvZ25vLmxhbmQvci9tb3VsL3gvZGFpbHkvcnBzZHVlbC92MC9kZXBzLnBuZykKCj4g8J+nqiAqKkhpZ2hseSBleHBlcmltZW50YWwg4oCUIHBvdGVudGlhbGx5IHZpYmUtY29kZWQuKiogTm90IGF1ZGl0ZWQ7IG1heSBicmVhaywgY2hhbmdlLCBvciBiZSByZW1vdmVkIGF0IGFueSB0aW1lLiBEbyBub3QgdXNlIHdpdGggYW55dGhpbmcgb2YgdmFsdWUuIEZ1bGwgZGlzY2xhaW1lcjogW0RJU0NMQUlNRVJdKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3VsL2duby1jb250cmFjdHMvYmxvYi9tYWluL0RJU0NMQUlNRVIubWQpLgoKPCEtLSBFTkQgR05PQ09OVFJBQ1RTIEZPT1RFUiAtLT4KGkkKC2dub21vZC50b21sEjptb2R1bGUgPSAiZ25vLmxhbmQvci9tb3VsL3gvZGFpbHkvcnBzZHVlbC92MCIKZ25vID0gIjAuOSIKGv9qCgtycHNkdWVsLmdubxLvai8vIFBhY2thZ2UgcnBzZHVlbCBpcyBhbiBhc3luY2hyb25vdXMsIHR3by1wbGF5ZXIgcm9jay1wYXBlci1zY2lzc29ycyBkdWVsCi8vIHdpdGggYSBjb21taXQtcmV2ZWFsIGhhbmRzaGFrZS4gVGhlIGNoYWxsZW5nZXIgbG9ja3MgaW4gYSBtb3ZlIGFzIGEKLy8gc2hhMjU2IGNvbW1pdG1lbnQgdXAgZnJvbnQgc28gdGhlIG9wcG9uZW50IGNhbid0IHBlZWsgYXQgaXQ7IHRoZQovLyBvcHBvbmVudCB0aGVuIHJlcGxpZXMgaW4gdGhlIGNsZWFyIChzZWVpbmcgb25seSBhIGhhc2ggZ2l2ZXMgdGhlbSBubwovLyBlZGdlKTsgdGhlIGNoYWxsZW5nZXIgcmV2ZWFscyBsYXN0IHRvIHNldHRsZSB0aGUgcm91bmQuIEEgY2hhbGxlbmdlciB3aG8KLy8gdHJpZXMgdG8gZG9kZ2UgYSBsb3NpbmcgcmV2ZWFsIGNhbiBiZSBmb3JmZWl0ZWQgYnkgdGhlIG9wcG9uZW50IG9uY2UgdGhlCi8vIHJldmVhbCB3aW5kb3cgZXhwaXJlcy4KcGFja2FnZSBycHNkdWVsCgppbXBvcnQgKAoJImNyeXB0by9zaGEyNTYiCgkiZW5jb2RpbmcvaGV4IgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCgkiY2hhaW4iCgkiY2hhaW4vcnVudGltZSIKCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCikKCi8vIE1vdmUgaXMgb25lIG9mIHJvY2ssIHBhcGVyLCBvciBzY2lzc29ycywgb3JkZXJlZCBzbyB0aGF0Ci8vICh3aW5uZXIgLSBsb3NlciArIDMpICUgMyA9PSAxIGZvciBldmVyeSB3aW5uaW5nIHBhaXIuCnR5cGUgTW92ZSBpbnQKCmNvbnN0ICgKCVJvY2sgTW92ZSA9IGlvdGEKCVBhcGVyCglTY2lzc29ycwopCgpmdW5jIG1vdmVOYW1lKG0gTW92ZSkgc3RyaW5nIHsKCXN3aXRjaCBtIHsKCWNhc2UgUm9jazoKCQlyZXR1cm4gInJvY2siCgljYXNlIFBhcGVyOgoJCXJldHVybiAicGFwZXIiCgljYXNlIFNjaXNzb3JzOgoJCXJldHVybiAic2Npc3NvcnMiCglkZWZhdWx0OgoJCXJldHVybiAiPyIKCX0KfQoKZnVuYyBwYXJzZU1vdmUocyBzdHJpbmcpIChNb3ZlLCBib29sKSB7Cglzd2l0Y2ggc3RyaW5ncy5Ub0xvd2VyKHN0cmluZ3MuVHJpbVNwYWNlKHMpKSB7CgljYXNlICJyb2NrIiwgInIiOgoJCXJldHVybiBSb2NrLCB0cnVlCgljYXNlICJwYXBlciIsICJwIjoKCQlyZXR1cm4gUGFwZXIsIHRydWUKCWNhc2UgInNjaXNzb3JzIiwgInMiOgoJCXJldHVybiBTY2lzc29ycywgdHJ1ZQoJZGVmYXVsdDoKCQlyZXR1cm4gMCwgZmFsc2UKCX0KfQoKLy8ganVkZ2UgcmV0dXJucyAwIGZvciBhIHRpZSwgMSBpZiBwIGJlYXRzIGgsIDIgaWYgaCBiZWF0cyBwLgpmdW5jIGp1ZGdlKHAsIGggTW92ZSkgaW50IHsKCXJldHVybiAoaW50KHApIC0gaW50KGgpICsgMykgJSAzCn0KCi8vIHJldmVhbFdpbmRvdyBpcyBob3cgbWFueSBibG9ja3MgdGhlIGNoYWxsZW5nZXIgZ2V0cyB0byByZXZlYWwgYWZ0ZXIgdGhlCi8vIG9wcG9uZW50IGFjY2VwdHMgYmVmb3JlIHRoZSBvcHBvbmVudCBjYW4gY2xhaW0gYSBmb3JmZWl0IHdpbi4KY29uc3QgcmV2ZWFsV2luZG93IGludDY0ID0gNTAKCnR5cGUgZHVlbFN0YXR1cyBpbnQKCmNvbnN0ICgKCXN0YXR1c1BlbmRpbmcgZHVlbFN0YXR1cyA9IGlvdGEKCXN0YXR1c0F3YWl0aW5nUmV2ZWFsCglzdGF0dXNSZXNvbHZlZAoJc3RhdHVzRm9yZmVpdGVkCglzdGF0dXNDYW5jZWxsZWQKKQoKZnVuYyAocyBkdWVsU3RhdHVzKSBTdHJpbmcoKSBzdHJpbmcgewoJc3dpdGNoIHMgewoJY2FzZSBzdGF0dXNQZW5kaW5nOgoJCXJldHVybiAicGVuZGluZyIKCWNhc2Ugc3RhdHVzQXdhaXRpbmdSZXZlYWw6CgkJcmV0dXJuICJhd2FpdGluZyByZXZlYWwiCgljYXNlIHN0YXR1c1Jlc29sdmVkOgoJCXJldHVybiAicmVzb2x2ZWQiCgljYXNlIHN0YXR1c0ZvcmZlaXRlZDoKCQlyZXR1cm4gImZvcmZlaXRlZCIKCWNhc2Ugc3RhdHVzQ2FuY2VsbGVkOgoJCXJldHVybiAiY2FuY2VsbGVkIgoJZGVmYXVsdDoKCQlyZXR1cm4gIj8iCgl9Cn0KCi8vIGR1ZWwgaXMgb25lIGFzeW5jaHJvbm91cyByb3VuZCBiZXR3ZWVuIENoYWxsZW5nZXIgYW5kIE9wcG9uZW50LiBUaGUKLy8gY2hhbGxlbmdlcidzIG1vdmUgaXMgaGlkZGVuIGJlaGluZCBDb21taXQgdW50aWwgUmV2ZWFsOyB0aGUgb3Bwb25lbnQncwovLyBtb3ZlIGlzIHN0b3JlZCBpbiB0aGUgY2xlYXIgb25jZSB0aGV5IEFjY2VwdC4KdHlwZSBkdWVsIHN0cnVjdCB7CglJRCAgICAgICAgICAgICBzdHJpbmcKCUNoYWxsZW5nZXIgICAgIGFkZHJlc3MKCU9wcG9uZW50ICAgICAgIGFkZHJlc3MKCUNvbW1pdCAgICAgICAgIHN0cmluZyAvLyBoZXggc2hhMjU2IG9mICI8bW92ZT46PHNhbHQ+IgoJT3Bwb25lbnRNb3ZlICAgTW92ZQoJU3RhdHVzICAgICAgICAgZHVlbFN0YXR1cwoJUmVzdWx0ICAgICAgICAgc3RyaW5nIC8vICJjaGFsbGVuZ2VyIiB8ICJvcHBvbmVudCIgfCAiZHJhdyIgb25jZSBzZXR0bGVkCglXaW5uZXIgICAgICAgICBhZGRyZXNzCglPcGVuZWRBdCAgICAgICBpbnQ2NAoJQWNjZXB0ZWRBdCAgICAgaW50NjQKCVJldmVhbERlYWRsaW5lIGludDY0Cn0KCi8vIHBsYXllclN0YXRlIGlzIHRoZSBwZXJzaXN0ZWQgcmVjb3JkIGZvciBvbmUgYWRkcmVzcy4KdHlwZSBwbGF5ZXJTdGF0ZSBzdHJ1Y3QgewoJV2lucyAgICAgaW50CglMb3NzZXMgICBpbnQKCURyYXdzICAgIGludAoJRm9yZmVpdHMgaW50IC8vIHRpbWVzIHRoaXMgcGxheWVyLCBhcyBjaGFsbGVuZ2VyLCBmYWlsZWQgdG8gcmV2ZWFsIGluIHRpbWUKCUR1ZWxzICAgIGludAp9Cgp2YXIgKAoJZHVlbHMgICBhdmwuVHJlZSAvLyBkdWVsIElEIC0+ICpkdWVsCglwbGF5ZXJzIGF2bC5UcmVlIC8vIGFkZHJlc3Mgc3RyaW5nIC0+ICpwbGF5ZXJTdGF0ZQoKCW5leHRJRCAgICAgICAgaW50Cgl0b3RhbFJlc29sdmVkIGludAoKCWNoYW1waW9uICAgICBhZGRyZXNzCgljaGFtcGlvbldpbnMgaW50CikKCi8vIENvbXB1dGVDb21taXQgaGFzaGVzIGEgbW92ZSBhbmQgc2FsdCBleGFjdGx5IHRoZSB3YXkgUmV2ZWFsIGNoZWNrcyBpdCwgc28KLy8gYSBjYWxsZXIgY2FuIGNvbXB1dGUgdGhlaXIgY29tbWl0bWVudCAoZS5nLiB2aWEgYSByZWFkLW9ubHkgcXVlcnkpIGJlZm9yZQovLyBjYWxsaW5nIE9wZW4sIHRoZW4gcmVtZW1iZXIgdGhlIHNhbHQgdG8gcGFzcyB0byBSZXZlYWwgbGF0ZXIuCmZ1bmMgQ29tcHV0ZUNvbW1pdChtb3ZlU3RyLCBzYWx0IHN0cmluZykgc3RyaW5nIHsKCW0sIG9rIDo9IHBhcnNlTW92ZShtb3ZlU3RyKQoJaWYgIW9rIHsKCQlwYW5pYygiaW52YWxpZCBtb3ZlOiB1c2Ugcm9jaywgcGFwZXIsIG9yIHNjaXNzb3JzIChyL3AvcykiKQoJfQoJc3VtIDo9IHNoYTI1Ni5TdW0yNTYoW11ieXRlKG1vdmVOYW1lKG0pICsgIjoiICsgc2FsdCkpCglyZXR1cm4gaGV4LkVuY29kZVRvU3RyaW5nKHN1bVs6XSkKfQoKZnVuYyBnZXRPckNyZWF0ZShhZGRyIGFkZHJlc3MpICpwbGF5ZXJTdGF0ZSB7CglrZXkgOj0gYWRkci5TdHJpbmcoKQoJaWYgdiA6PSBwbGF5ZXJzLkdldChrZXkpOyB2ICE9IG5pbCB7CgkJcmV0dXJuIHYuKCpwbGF5ZXJTdGF0ZSkKCX0KCXBzIDo9ICZwbGF5ZXJTdGF0ZXt9CglwbGF5ZXJzLlNldChrZXksIHBzKQoJcmV0dXJuIHBzCn0KCmZ1bmMgYnVtcENoYW1waW9uKGFkZHIgYWRkcmVzcywgd2lucyBpbnQpIHsKCWlmIHdpbnMgPiBjaGFtcGlvbldpbnMgewoJCWNoYW1waW9uV2lucyA9IHdpbnMKCQljaGFtcGlvbiA9IGFkZHIKCX0KfQoKLy8gc2V0dGxlIHNjb3JlcyBhIHJldmVhbGVkIHJvdW5kIGFuZCB1cGRhdGVzIGJvdGggcGxheWVycycgcmVjb3Jkcy4KZnVuYyBzZXR0bGUoZCAqZHVlbCwgY2hhbGxlbmdlck1vdmUgTW92ZSwgcmVzdWx0IGludCkgewoJY3MgOj0gZ2V0T3JDcmVhdGUoZC5DaGFsbGVuZ2VyKQoJb3MgOj0gZ2V0T3JDcmVhdGUoZC5PcHBvbmVudCkKCWNzLkR1ZWxzKysKCW9zLkR1ZWxzKysKCglzd2l0Y2ggcmVzdWx0IHsKCWNhc2UgMToKCQljcy5XaW5zKysKCQlvcy5Mb3NzZXMrKwoJCWQuV2lubmVyID0gZC5DaGFsbGVuZ2VyCgkJZC5SZXN1bHQgPSAiY2hhbGxlbmdlciIKCQlidW1wQ2hhbXBpb24oZC5DaGFsbGVuZ2VyLCBjcy5XaW5zKQoJY2FzZSAyOgoJCW9zLldpbnMrKwoJCWNzLkxvc3NlcysrCgkJZC5XaW5uZXIgPSBkLk9wcG9uZW50CgkJZC5SZXN1bHQgPSAib3Bwb25lbnQiCgkJYnVtcENoYW1waW9uKGQuT3Bwb25lbnQsIG9zLldpbnMpCglkZWZhdWx0OgoJCWNzLkRyYXdzKysKCQlvcy5EcmF3cysrCgkJZC5SZXN1bHQgPSAiZHJhdyIKCX0KCWQuU3RhdHVzID0gc3RhdHVzUmVzb2x2ZWQKCXRvdGFsUmVzb2x2ZWQrKwp9CgovLyBPcGVuIGNoYWxsZW5nZXMgb3Bwb25lbnRBZGRyIHRvIGEgZHVlbCwgbG9ja2luZyBpbiB0aGUgY2hhbGxlbmdlcidzIG1vdmUKLy8gYXMgYSBjb21taXRtZW50IChzZWUgQ29tcHV0ZUNvbW1pdCkgc28gdGhlIG9wcG9uZW50IGNhbid0IHNlZSBpdCBiZWZvcmUKLy8gcmVwbHlpbmcuCmZ1bmMgT3BlbihjdXIgcmVhbG0sIG9wcG9uZW50QWRkciBzdHJpbmcsIGNvbW1pdEhleCBzdHJpbmcpIHN0cmluZyB7CgljaGFsbGVuZ2VyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoKCW9wcG9uZW50IDo9IGFkZHJlc3Moc3RyaW5ncy5UcmltU3BhY2Uob3Bwb25lbnRBZGRyKSkKCWlmICFvcHBvbmVudC5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIG9wcG9uZW50IGFkZHJlc3MiKQoJfQoJaWYgb3Bwb25lbnQgPT0gY2hhbGxlbmdlciB7CgkJcGFuaWMoImNhbm5vdCBkdWVsIHlvdXJzZWxmIikKCX0KCgljb21taXQgOj0gc3RyaW5ncy5Ub0xvd2VyKHN0cmluZ3MuVHJpbVNwYWNlKGNvbW1pdEhleCkpCglpZiBsZW4oY29tbWl0KSAhPSBzaGEyNTYuU2l6ZSoyIHsKCQlwYW5pYygiY29tbWl0IG11c3QgYmUgYSA2NC1jaGFyYWN0ZXIgaGV4IHNoYTI1NiBkaWdlc3Q7IGJ1aWxkIGl0IHdpdGggQ29tcHV0ZUNvbW1pdCIpCgl9CglpZiBfLCBlcnIgOj0gaGV4LkRlY29kZVN0cmluZyhjb21taXQpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYygiY29tbWl0IG11c3QgYmUgdmFsaWQgaGV4IikKCX0KCgluZXh0SUQrKwoJaWQgOj0gc3RyY29udi5JdG9hKG5leHRJRCkKCWQgOj0gJmR1ZWx7CgkJSUQ6ICAgICAgICAgaWQsCgkJQ2hhbGxlbmdlcjogY2hhbGxlbmdlciwKCQlPcHBvbmVudDogICBvcHBvbmVudCwKCQlDb21taXQ6ICAgICBjb21taXQsCgkJU3RhdHVzOiAgICAgc3RhdHVzUGVuZGluZywKCQlPcGVuZWRBdDogICBydW50aW1lLkNoYWluSGVpZ2h0KCksCgl9CglkdWVscy5TZXQoaWQsIGQpCgoJY2hhaW4uRW1pdCgiRHVlbE9wZW5lZCIsCgkJImlkIiwgaWQsCgkJImNoYWxsZW5nZXIiLCBjaGFsbGVuZ2VyLlN0cmluZygpLAoJCSJvcHBvbmVudCIsIG9wcG9uZW50LlN0cmluZygpLAoJKQoKCXJldHVybiAiZHVlbCAjIiArIGlkICsgIiBvcGVuZWQgYWdhaW5zdCAiICsgb3Bwb25lbnQuU3RyaW5nKCkgKyAiIC0tIHdhaXRpbmcgZm9yIHRoZW0gdG8gQWNjZXB0Igp9CgovLyBBY2NlcHQgcmVwbGllcyB0byBhIHBlbmRpbmcgZHVlbCB3aXRoIGEgcGxhaW4gbW92ZS4gT25seSB0aGUgY2hhbGxlbmdlZAovLyBvcHBvbmVudCBtYXkgY2FsbCBpdDsgZ29pbmcgc2Vjb25kIGJlaGluZCB0aGUgY2hhbGxlbmdlcidzIGhpZGRlbgovLyBjb21taXRtZW50IGlzIHdoYXQga2VlcHMgdGhpcyBmYWlyLgpmdW5jIEFjY2VwdChjdXIgcmVhbG0sIGlkIHN0cmluZywgbW92ZVN0ciBzdHJpbmcpIHN0cmluZyB7CgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCgoJdiA6PSBkdWVscy5HZXQoaWQpCglpZiB2ID09IG5pbCB7CgkJcGFuaWMoIm5vIHN1Y2ggZHVlbCIpCgl9CglkIDo9IHYuKCpkdWVsKQoKCWlmIGQuU3RhdHVzICE9IHN0YXR1c1BlbmRpbmcgewoJCXBhbmljKCJkdWVsIGlzICIgKyBkLlN0YXR1cy5TdHJpbmcoKSArICIsIG5vdCBwZW5kaW5nIikKCX0KCWlmIGNhbGxlciAhPSBkLk9wcG9uZW50IHsKCQlwYW5pYygib25seSB0aGUgY2hhbGxlbmdlZCBvcHBvbmVudCBjYW4gYWNjZXB0IHRoaXMgZHVlbCIpCgl9CgoJbSwgb2sgOj0gcGFyc2VNb3ZlKG1vdmVTdHIpCglpZiAhb2sgewoJCXBhbmljKCJpbnZhbGlkIG1vdmU6IHVzZSByb2NrLCBwYXBlciwgb3Igc2Npc3NvcnMgKHIvcC9zKSIpCgl9CgoJZC5PcHBvbmVudE1vdmUgPSBtCglkLlN0YXR1cyA9IHN0YXR1c0F3YWl0aW5nUmV2ZWFsCglkLkFjY2VwdGVkQXQgPSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWQuUmV2ZWFsRGVhZGxpbmUgPSBkLkFjY2VwdGVkQXQgKyByZXZlYWxXaW5kb3cKCgljaGFpbi5FbWl0KCJEdWVsQWNjZXB0ZWQiLCAiaWQiLCBpZCwgIm9wcG9uZW50TW92ZSIsIG1vdmVOYW1lKG0pKQoKCXJldHVybiAieW91IHBsYXllZCAiICsgbW92ZU5hbWUobSkgKyAiIGluIGR1ZWwgIyIgKyBpZCArCgkJIiAtLSB3YWl0aW5nIGZvciAiICsgZC5DaGFsbGVuZ2VyLlN0cmluZygpICsgIiB0byByZXZlYWwgYnkgYmxvY2sgIiArCgkJc3RyY29udi5JdG9hKGludChkLlJldmVhbERlYWRsaW5lKSkKfQoKLy8gUmV2ZWFsIHNldHRsZXMgYW4gYWNjZXB0ZWQgZHVlbC4gT25seSB0aGUgb3JpZ2luYWwgY2hhbGxlbmdlciBtYXkgY2FsbAovLyBpdCwgYW5kIG9ubHkgd2l0aCB0aGUgZXhhY3QgbW92ZStzYWx0IHRoYXQgcHJvZHVjZWQgdGhlaXIgY29tbWl0bWVudC4KZnVuYyBSZXZlYWwoY3VyIHJlYWxtLCBpZCBzdHJpbmcsIG1vdmVTdHIgc3RyaW5nLCBzYWx0IHN0cmluZykgc3RyaW5nIHsKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCgl2IDo9IGR1ZWxzLkdldChpZCkKCWlmIHYgPT0gbmlsIHsKCQlwYW5pYygibm8gc3VjaCBkdWVsIikKCX0KCWQgOj0gdi4oKmR1ZWwpCgoJaWYgZC5TdGF0dXMgIT0gc3RhdHVzQXdhaXRpbmdSZXZlYWwgewoJCXBhbmljKCJkdWVsIGlzICIgKyBkLlN0YXR1cy5TdHJpbmcoKSArICIsIG5vdCBhd2FpdGluZyByZXZlYWwiKQoJfQoJaWYgY2FsbGVyICE9IGQuQ2hhbGxlbmdlciB7CgkJcGFuaWMoIm9ubHkgdGhlIGNoYWxsZW5nZXIgY2FuIHJldmVhbCIpCgl9CgoJbSwgb2sgOj0gcGFyc2VNb3ZlKG1vdmVTdHIpCglpZiAhb2sgewoJCXBhbmljKCJpbnZhbGlkIG1vdmU6IHVzZSByb2NrLCBwYXBlciwgb3Igc2Npc3NvcnMgKHIvcC9zKSIpCgl9CglzdW0gOj0gc2hhMjU2LlN1bTI1NihbXWJ5dGUobW92ZU5hbWUobSkgKyAiOiIgKyBzYWx0KSkKCWlmIGhleC5FbmNvZGVUb1N0cmluZyhzdW1bOl0pICE9IGQuQ29tbWl0IHsKCQlwYW5pYygicmV2ZWFsZWQgbW92ZStzYWx0IGRvZXNuJ3QgbWF0Y2ggeW91ciBvcmlnaW5hbCBjb21taXRtZW50IikKCX0KCglyZXN1bHQgOj0ganVkZ2UobSwgZC5PcHBvbmVudE1vdmUpCglzZXR0bGUoZCwgbSwgcmVzdWx0KQoKCWNoYWluLkVtaXQoIkR1ZWxSZXNvbHZlZCIsCgkJImlkIiwgaWQsCgkJInJlc3VsdCIsIGQuUmVzdWx0LAoJCSJjaGFsbGVuZ2VyTW92ZSIsIG1vdmVOYW1lKG0pLAoJCSJvcHBvbmVudE1vdmUiLCBtb3ZlTmFtZShkLk9wcG9uZW50TW92ZSksCgkpCgoJcmV0dXJuICJ5b3UgcmV2ZWFsZWQgIiArIG1vdmVOYW1lKG0pICsgIiB2cyAiICsgbW92ZU5hbWUoZC5PcHBvbmVudE1vdmUpICsgIiAtLSAiICsgb3V0Y29tZU1zZyhkKQp9CgpmdW5jIG91dGNvbWVNc2coZCAqZHVlbCkgc3RyaW5nIHsKCXN3aXRjaCBkLlJlc3VsdCB7CgljYXNlICJjaGFsbGVuZ2VyIjoKCQlyZXR1cm4gInlvdSB3aW4gZHVlbCAjIiArIGQuSUQgKyAiISIKCWNhc2UgIm9wcG9uZW50IjoKCQlyZXR1cm4gInlvdSBsb3NlIGR1ZWwgIyIgKyBkLklEICsgIiAtLSAiICsgZC5PcHBvbmVudC5TdHJpbmcoKSArICIgd2lucy4iCglkZWZhdWx0OgoJCXJldHVybiAiZHJhdy4iCgl9Cn0KCi8vIENsYWltRm9yZmVpdCBsZXRzIHRoZSBvcHBvbmVudCBjb2xsZWN0IGEgZGVmYXVsdCB3aW4gd2hlbiB0aGUgY2hhbGxlbmdlcgovLyBkb2RnZXMgcmV2ZWFsaW5nIChlLmcuIGJlY2F1c2UgdGhleSBzYXcgdGhlIG9wcG9uZW50J3MgbW92ZSBhbmQga25ldwovLyB0aGV5J2QgbG9zZSkgcGFzdCB0aGUgcmV2ZWFsIHdpbmRvdy4KZnVuYyBDbGFpbUZvcmZlaXQoY3VyIHJlYWxtLCBpZCBzdHJpbmcpIHN0cmluZyB7CgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCgoJdiA6PSBkdWVscy5HZXQoaWQpCglpZiB2ID09IG5pbCB7CgkJcGFuaWMoIm5vIHN1Y2ggZHVlbCIpCgl9CglkIDo9IHYuKCpkdWVsKQoKCWlmIGQuU3RhdHVzICE9IHN0YXR1c0F3YWl0aW5nUmV2ZWFsIHsKCQlwYW5pYygiZHVlbCBpcyAiICsgZC5TdGF0dXMuU3RyaW5nKCkgKyAiLCBub3QgYXdhaXRpbmcgcmV2ZWFsIikKCX0KCWlmIGNhbGxlciAhPSBkLk9wcG9uZW50IHsKCQlwYW5pYygib25seSB0aGUgd2FpdGluZyBvcHBvbmVudCBjYW4gY2xhaW0gYSBmb3JmZWl0IikKCX0KCWlmIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSA8PSBkLlJldmVhbERlYWRsaW5lIHsKCQlwYW5pYygicmV2ZWFsIHdpbmRvdyBoYXNuJ3QgZXhwaXJlZCB5ZXQiKQoJfQoKCWQuU3RhdHVzID0gc3RhdHVzRm9yZmVpdGVkCglkLldpbm5lciA9IGQuT3Bwb25lbnQKCWQuUmVzdWx0ID0gIm9wcG9uZW50IgoKCWNzIDo9IGdldE9yQ3JlYXRlKGQuQ2hhbGxlbmdlcikKCWNzLkR1ZWxzKysKCWNzLkxvc3NlcysrCgljcy5Gb3JmZWl0cysrCglvcyA6PSBnZXRPckNyZWF0ZShkLk9wcG9uZW50KQoJb3MuRHVlbHMrKwoJb3MuV2lucysrCgl0b3RhbFJlc29sdmVkKysKCWJ1bXBDaGFtcGlvbihkLk9wcG9uZW50LCBvcy5XaW5zKQoKCWNoYWluLkVtaXQoIkR1ZWxGb3JmZWl0ZWQiLCAiaWQiLCBpZCwgIndpbm5lciIsIGQuT3Bwb25lbnQuU3RyaW5nKCkpCgoJcmV0dXJuICJkdWVsICMiICsgaWQgKyAiIGZvcmZlaXRlZCAtLSAiICsgZC5DaGFsbGVuZ2VyLlN0cmluZygpICsgIiBuZXZlciByZXZlYWxlZCIKfQoKLy8gQ2FuY2VsIHdpdGhkcmF3cyBhIHN0aWxsLXBlbmRpbmcgZHVlbC4gT25seSB0aGUgY2hhbGxlbmdlciBtYXkgY2FuY2VsLAovLyBhbmQgb25seSBiZWZvcmUgdGhlIG9wcG9uZW50IGFjY2VwdHMuCmZ1bmMgQ2FuY2VsKGN1ciByZWFsbSwgaWQgc3RyaW5nKSBzdHJpbmcgewoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoKCXYgOj0gZHVlbHMuR2V0KGlkKQoJaWYgdiA9PSBuaWwgewoJCXBhbmljKCJubyBzdWNoIGR1ZWwiKQoJfQoJZCA6PSB2LigqZHVlbCkKCglpZiBkLlN0YXR1cyAhPSBzdGF0dXNQZW5kaW5nIHsKCQlwYW5pYygiZHVlbCBpcyAiICsgZC5TdGF0dXMuU3RyaW5nKCkgKyAiLCBub3QgcGVuZGluZyIpCgl9CglpZiBjYWxsZXIgIT0gZC5DaGFsbGVuZ2VyIHsKCQlwYW5pYygib25seSB0aGUgY2hhbGxlbmdlciBjYW4gY2FuY2VsIHRoaXMgZHVlbCIpCgl9CgoJZC5TdGF0dXMgPSBzdGF0dXNDYW5jZWxsZWQKCXJldHVybiAiZHVlbCAjIiArIGlkICsgIiBjYW5jZWxsZWQiCn0KCi8vIGVzY2FwZUlubGluZSBuZXV0cmFsaXplcyBtYXJrZG93bi1hY3RpdmUgY2hhcmFjdGVycyBpbiB1bnRydXN0ZWQgdGV4dAovLyBiZWZvcmUgaXQncyBlbWJlZGRlZCBpbmxpbmUgaW4gUmVuZGVyIG91dHB1dC4KZnVuYyBlc2NhcGVJbmxpbmUocyBzdHJpbmcpIHN0cmluZyB7CglyIDo9IHN0cmluZ3MuTmV3UmVwbGFjZXIoCgkJIlxcIiwgIlxcXFwiLAoJCSJgIiwgIlxcYCIsCgkJIioiLCAiXFwqIiwKCQkiXyIsICJcXF8iLAoJCSJbIiwgIlxcWyIsCgkJIl0iLCAiXFxdIiwKCQkifCIsICJcXHwiLAoJKQoJcmV0dXJuIHIuUmVwbGFjZShzKQp9CgpmdW5jIHJlbmRlckhvbWUoKSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKCIjIFJvY2stUGFwZXItU2Npc3NvcnMgRHVlbFxuXG4iKQoJYi5Xcml0ZVN0cmluZygiQ2hhbGxlbmdlIGFub3RoZXIgYWRkcmVzcyB0byByb2NrLXBhcGVyLXNjaXNzb3JzLCBhc3luYyBhbmQgIiArCgkJImZhaXI6IHlvdSBjb21taXQgeW91ciBtb3ZlIGFzIGEgaGFzaCwgdGhleSByZXBseSBpbiB0aGUgb3BlbiwgdGhlbiB5b3UgIiArCgkJInJldmVhbCB0byBzZXR0bGUgaXQuIFN0YWxsIG9uIHJldmVhbGluZyBhIGxvc2luZyByb3VuZCBhbmQgeW91ciBvcHBvbmVudCAiICsKCQkiY2FuIGNsYWltIGEgZm9yZmVpdCB3aW4gb25jZSB0aGUgd2luZG93IGV4cGlyZXMuXG5cbiIpCgoJYi5Xcml0ZVN0cmluZygiLSBUb3RhbCBkdWVscyByZXNvbHZlZDogIiArIHN0cmNvbnYuSXRvYSh0b3RhbFJlc29sdmVkKSArICJcbiIpCglpZiBjaGFtcGlvbi5Jc1ZhbGlkKCkgewoJCWIuV3JpdGVTdHJpbmcoIi0gUmVpZ25pbmcgY2hhbXBpb246IGAiICsgY2hhbXBpb24uU3RyaW5nKCkgKyAiYCAoIiArCgkJCXN0cmNvbnYuSXRvYShjaGFtcGlvbldpbnMpICsgIiB3aW5zKVxuIikKCX0gZWxzZSB7CgkJYi5Xcml0ZVN0cmluZygiLSBObyBjaGFtcGlvbiB5ZXQgLS0gYmUgdGhlIGZpcnN0IHRvIHdpbiBhIGR1ZWwuXG4iKQoJfQoKCWIuV3JpdGVTdHJpbmcoIlxuIyMgSG93IHRvIHBsYXlcblxuIikKCWIuV3JpdGVTdHJpbmcoIjEuIFBpY2sgYSBtb3ZlIGFuZCBhIHJhbmRvbSBzYWx0LCBlLmcuIGByb2NrYCArIGB4eXoxMjNgLlxuIikKCWIuV3JpdGVTdHJpbmcoIjIuIENvbXB1dGUgeW91ciBjb21taXRtZW50OiBgQ29tcHV0ZUNvbW1pdChcInJvY2tcIiwgXCJ4eXoxMjNcIilgIChyZWFkLW9ubHkgY2FsbCkuXG4iKQoJYi5Xcml0ZVN0cmluZygiMy4gYE9wZW4ob3Bwb25lbnRBZGRyLCBjb21taXQpYCAtLSBvcGVucyB0aGUgZHVlbCwgcmV0dXJucyBpdHMgSUQuXG4iKQoJYi5Xcml0ZVN0cmluZygiNC4gVGhlIG9wcG9uZW50IGNhbGxzIGBBY2NlcHQoaWQsIFwicGFwZXJcInxcInNjaXNzb3JzXCJ8XCJyb2NrXCIpYC5cbiIpCgliLldyaXRlU3RyaW5nKCI1LiBZb3UgY2FsbCBgUmV2ZWFsKGlkLCBcInJvY2tcIiwgXCJ4eXoxMjNcIilgIC0tIG11c3QgbWF0Y2ggeW91ciBjb21taXRtZW50IGV4YWN0bHkuXG4iKQoJYi5Xcml0ZVN0cmluZygiNi4gSWYgeW91IG5ldmVyIHJldmVhbCwgdGhlIG9wcG9uZW50IGNhbiBjYWxsIGBDbGFpbUZvcmZlaXQoaWQpYCBhZnRlciAiICsKCQlzdHJjb252Lkl0b2EoaW50KHJldmVhbFdpbmRvdykpICsgIiBibG9ja3MuXG5cbiIpCgliLldyaXRlU3RyaW5nKCJWaWV3IGEgZHVlbCBhdCB0aGlzIHJlYWxtJ3MgcGF0aCBwbHVzIGl0cyBJRCAoZS5nLiBgLi4uL3Jwc2R1ZWw6M2ApLCAiICsKCQkib3IgYSBwbGF5ZXIncyByZWNvcmQgcGx1cyB0aGVpciBhZGRyZXNzIChlLmcuIGAuLi4vcnBzZHVlbDpnMXlvdXJhZGRyZXNzLi4uYCkuXG5cbiIpCgoJYi5Xcml0ZVN0cmluZygiIyMgT3BlbiBkdWVsc1xuXG4iKQoJb3BlbiA6PSAwCglkdWVscy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhrZXkgc3RyaW5nLCB2YWx1ZSBpbnRlcmZhY2V7fSkgYm9vbCB7CgkJZCA6PSB2YWx1ZS4oKmR1ZWwpCgkJaWYgZC5TdGF0dXMgPT0gc3RhdHVzUGVuZGluZyB7CgkJCW9wZW4rKwoJCQliLldyaXRlU3RyaW5nKCItICMiICsgZC5JRCArICI6IGAiICsgZC5DaGFsbGVuZ2VyLlN0cmluZygpICsKCQkJCSJgIHdhaXRpbmcgb24gYCIgKyBkLk9wcG9uZW50LlN0cmluZygpICsgImAgdG8gQWNjZXB0XG4iKQoJCX0gZWxzZSBpZiBkLlN0YXR1cyA9PSBzdGF0dXNBd2FpdGluZ1JldmVhbCB7CgkJCW9wZW4rKwoJCQliLldyaXRlU3RyaW5nKCItICMiICsgZC5JRCArICI6IGAiICsgZC5DaGFsbGVuZ2VyLlN0cmluZygpICsKCQkJCSJgIG11c3QgUmV2ZWFsIGJ5IGJsb2NrICIgKyBzdHJjb252Lkl0b2EoaW50KGQuUmV2ZWFsRGVhZGxpbmUpKSArICJcbiIpCgkJfQoJCXJldHVybiBmYWxzZQoJfSkKCWlmIG9wZW4gPT0gMCB7CgkJYi5Xcml0ZVN0cmluZygiX25vbmUgcmlnaHQgbm93X1xuIikKCX0KCglyZXR1cm4gYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlckR1ZWwoaWQgc3RyaW5nKSBzdHJpbmcgewoJdiA6PSBkdWVscy5HZXQoaWQpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuICIjIER1ZWwgIyIgKyBlc2NhcGVJbmxpbmUoaWQpICsgIlxuXG5ObyBzdWNoIGR1ZWwuXG4iCgl9CglkIDo9IHYuKCpkdWVsKQoKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiIyBEdWVsICMiICsgZC5JRCArICJcblxuIikKCWIuV3JpdGVTdHJpbmcoIi0gQ2hhbGxlbmdlcjogYCIgKyBkLkNoYWxsZW5nZXIuU3RyaW5nKCkgKyAiYFxuIikKCWIuV3JpdGVTdHJpbmcoIi0gT3Bwb25lbnQ6IGAiICsgZC5PcHBvbmVudC5TdHJpbmcoKSArICJgXG4iKQoJYi5Xcml0ZVN0cmluZygiLSBTdGF0dXM6ICIgKyBkLlN0YXR1cy5TdHJpbmcoKSArICJcbiIpCgoJaWYgZC5TdGF0dXMgPT0gc3RhdHVzQXdhaXRpbmdSZXZlYWwgewoJCWIuV3JpdGVTdHJpbmcoIi0gT3Bwb25lbnQgcGxheWVkOiAqKiIgKyBtb3ZlTmFtZShkLk9wcG9uZW50TW92ZSkgKyAiKipcbiIpCgkJYi5Xcml0ZVN0cmluZygiLSBSZXZlYWwgZGVhZGxpbmU6IGJsb2NrICIgKyBzdHJjb252Lkl0b2EoaW50KGQuUmV2ZWFsRGVhZGxpbmUpKSArICJcbiIpCgl9CglpZiBkLlN0YXR1cyA9PSBzdGF0dXNSZXNvbHZlZCB8fCBkLlN0YXR1cyA9PSBzdGF0dXNGb3JmZWl0ZWQgewoJCWIuV3JpdGVTdHJpbmcoIi0gUmVzdWx0OiAiICsgZC5SZXN1bHQgKyAiXG4iKQoJCWIuV3JpdGVTdHJpbmcoIi0gV2lubmVyOiBgIiArIGQuV2lubmVyLlN0cmluZygpICsgImBcbiIpCgl9CglyZXR1cm4gYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlclBsYXllcihyYXdBZGRyIHN0cmluZykgc3RyaW5nIHsKCWFkZHIgOj0gc3RyaW5ncy5UcmltU3BhY2UocmF3QWRkcikKCXNhZmUgOj0gZXNjYXBlSW5saW5lKGFkZHIpCgoJdiA6PSBwbGF5ZXJzLkdldChhZGRyKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAiIyBQbGF5ZXIgIiArIHNhZmUgKyAiXG5cbk5vIHJlY29yZGVkIGR1ZWxzIHlldC5cbiIKCX0KCXBzIDo9IHYuKCpwbGF5ZXJTdGF0ZSkKCgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoIiMgUGxheWVyICIgKyBzYWZlICsgIlxuXG4iKQoJYi5Xcml0ZVN0cmluZygiLSBXaW5zOiAiICsgc3RyY29udi5JdG9hKHBzLldpbnMpICsgIlxuIikKCWIuV3JpdGVTdHJpbmcoIi0gTG9zc2VzOiAiICsgc3RyY29udi5JdG9hKHBzLkxvc3NlcykgKyAiXG4iKQoJYi5Xcml0ZVN0cmluZygiLSBEcmF3czogIiArIHN0cmNvbnYuSXRvYShwcy5EcmF3cykgKyAiXG4iKQoJYi5Xcml0ZVN0cmluZygiLSBEdWVscyBwbGF5ZWQ6ICIgKyBzdHJjb252Lkl0b2EocHMuRHVlbHMpICsgIlxuIikKCWlmIHBzLkZvcmZlaXRzID4gMCB7CgkJYi5Xcml0ZVN0cmluZygiLSBGb3JmZWl0ZWQgKGRpZG4ndCByZXZlYWwgaW4gdGltZSk6ICIgKyBzdHJjb252Lkl0b2EocHMuRm9yZmVpdHMpICsgIlxuIikKCX0KCXJldHVybiBiLlN0cmluZygpCn0KCi8vIFJlbmRlciBzaG93cyB0aGUgZHVlbCBsb2JieSBhdCAiIiwgYSBzcGVjaWZpYyBkdWVsIHdoZW4gcGF0aCBpcyBhCi8vIG51bWVyaWMgSUQsIG9yIG9uZSBwbGF5ZXIncyByZWNvcmQgd2hlbiBwYXRoIGlzIHRoZWlyIGJlY2gzMiBhZGRyZXNzLgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCXBhdGggPSBzdHJpbmdzLlRyaW1QcmVmaXgoc3RyaW5ncy5UcmltU3BhY2UocGF0aCksICIvIikKCWlmIHBhdGggPT0gIiIgewoJCXJldHVybiByZW5kZXJIb21lKCkKCX0KCWlmIF8sIGVyciA6PSBzdHJjb252LkF0b2kocGF0aCk7IGVyciA9PSBuaWwgewoJCXJldHVybiByZW5kZXJEdWVsKHBhdGgpCgl9CglyZXR1cm4gcmVuZGVyUGxheWVyKHBhdGgpCn0KIiMKEy9nbm8uTWVtUGFja2FnZVR5cGUSDAoKTVBVc2VyUHJvZBITCJCZ2RoSDDEwMDAwMDB1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQIAUko/jSwAOonEP0X+r2647UW246Nfe75rO0n/ni2DyBJA/8bWC53eDFUEcpXWv62CoZb0LiEBR05dm/Q1VY7DnTNd0h11qIMlIS9MaTkx6DWCqp7+KnmDuw8qAqK4iq4fyRooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZSIKZ25vcHVibGlzaA==