Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
48407FBF306B182C7C7D39D112845E771ABC84332EF371654B4442488E9B3B09
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
90,000,000
Requested gas limit
GAS USED
54,701,805
Gas consumed
FEE
180000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g136j0m08pkm2lwwde9dmlx8uee26llent9s5cpf8000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CvKrAgoML3ZtLm1fYWRkcGtnEuCrAgooZzEzNmowbTA4cGttMmx3d2RlOWRtbHg4dWVlMjZsbGVudDlzNWNwZhKkqwIKCWVzY3Jvd192MxIcZ25vLmxhbmQvci9zYW1jcmV3L2VzY3Jvd192MxrsJQoJYWRtaW4uZ25vEt4lcGFja2FnZSBlc2Nyb3dfdjMKCi8vIEFkbWluIGF1dGhvcml0eSBhbmQgaXRzIHJvdGF0aW9uIHBhdGguCi8vCi8vIE5vIGFkbWluIGlzIGNvbXBpbGVkIGluOiBgYWRtaW5gIGJlbG93IGlzIHNlZWRlZCBhdCBwYWNrYWdlIGxvYWQgZnJvbSB0aGUKLy8gcHVibGlzaGluZyB0cmFuc2FjdGlvbidzIHNpZ25lciAob24gZ25vbGFuZC0xIHRoZSBzYW1jcmV3IG5hbWVzcGFjZQovLyBtdWx0aXNpZywgdGhlIHN0YW1wZWQgY3JlYXRvciBhdCBlbmFibGUgdGltZSkuIEV2ZXJ5IGdhdGUgaW4gdGhpcyByZWFsbQovLyByZWFkcyB0aGUgbXV0YWJsZSBgYWRtaW5gLCBzbyB0aGUgYWRkcmVzcyB0aGF0IGhvbGRzIGFkbWluIGNhbiBiZSBjaGFuZ2VkCi8vIGFmdGVyIGRlcGxveW1lbnQuCi8vCi8vIFdIWSBUSElTIElTIE5PVCBPUFRJT05BTCBPTiBNQUlOTkVULiBSZWFsbXMgYXJlIGltbXV0YWJsZSBvbmNlIHB1Ymxpc2hlZCBhbmQKLy8gdGhlcmUgaXMgbm8gZmF1Y2V0OyBtYWlubmV0IGdlbmVzaXMgYWRkaXRpb25hbGx5IGxvY2tzIHVnbm90IHRyYW5zZmVycyB1bmRlcgovLyBDb25zdGl0dXRpb24gwqcxMjYuIEEgY29tcGlsZS10aW1lIGFkbWluIHRoZXJlZm9yZSBjYW5ub3QgYmUgY29ycmVjdGVkIGFmdGVyCi8vIHRoZSBmYWN0LiBBIGNvbXBpbGUtdGltZSB0ZXN0bmV0IGtleSB3b3VsZCBwZXJtYW5lbnRseSBkaXNhYmxlIFBhdXNlL1VucGF1c2UKLy8gYW5kIFJlc29sdmVEaXNwdXRlLCB0aGUgb25seSBwYXRoIHRoYXQgc2V0dGxlcyBhIGRpc3B1dGVkIG1pbGVzdG9uZSwKLy8gc3RyYW5kaW5nIGN1c3RvZGllZCBmdW5kcyB3aXRoIG5vYm9keSBhYmxlIHRvIG1vdmUgdGhlbS4gUmVkZXBsb3lpbmcgYXQgYQovLyBuZXcgcGF0aCBpcyBub3QgYSByZWNvdmVyeTogaXQgYWJhbmRvbnMgdGhlIGZ1bmRzIGFscmVhZHkgaGVsZCBhdCB0aGlzIG9uZS4KLy8KLy8gVFdPLVNURVAgQlkgREVTSUdOLiBUaGUgaGFuZG9mZiBzdGFnZXMgYSBwZW5kaW5nIGFkZHJlc3MgdGhhdCBtdXN0IGNsYWltIGl0Ci8vIHdpdGggaXRzIG93biB0cmFuc2FjdGlvbi4gQSBvbmUtc3RlcCBzZXR0ZXIgd291bGQgbGV0IGFkbWluIGJlIGhhbmRlZCB0byBhbgovLyBhZGRyZXNzIHRoYXQgY2Fubm90IGFjdCDigJQgYSB0eXBvLCBvciBhbiB1bmZ1bmRlZCBhZGRyZXNzIHVuZGVyIMKnMTI2IOKAlCB3aXRoIG5vCi8vIHdheSBiYWNrLCB3aGljaCBpcyBwcmVjaXNlbHkgdGhlIGZhaWx1cmUgdGhpcyBmaWxlIGV4aXN0cyB0byBwcmV2ZW50LgovLwovLyBDQUxMRVIgQVVUSDogYGN1ci5Jc0N1cnJlbnQoKWAgdGhlbiBgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpYCwgbWF0Y2hpbmcKLy8gbWVtYmFfYXJjYWRlX2xlYWRlcmJvYXJkX3YxIC8gbWVtYmFfcG9pbnRzX3YxIGFuZCB0aGUgcHJvamVjdCdzIGNvbnRyYWN0LXJldmlldwovLyBjaGVja2xpc3QgIzkuIFRoaXMgZmlsZSBkZWxpYmVyYXRlbHkgaW1wb3J0cyBub25lIG9mIHRoZSBmcmFtZS11bnZlcmlmaWVkCi8vIGNhbGxlciBwYWNrYWdlIHRoYXQgY2hlY2tsaXN0IGZsYWdzIOKAlCBhIG5ldyBwYXRoIHNob3VsZCBub3QgaW5oZXJpdCBpdC4KLy8KLy8gZXNjcm93LmdubydzIG9sZGVyIGdhdGVzIHN0aWxsIHJlYWQgdGhlIGZyYW1lLXVudmVyaWZpZWQgY2FsbGVyIGFuZCBzdGF5Ci8vIGdyYW5kZmF0aGVyZWQgaW4gYW50aXBhdHRlcm4tcHJldnJlYWxtLWJhc2VsaW5lLnR4dC4gVGhhdCBpcyBub3QgYSBkYW5nZXJvdXMKLy8gbWl4OiBmb3IgdGhlIGRpcmVjdCBtdWx0aXNpZyBjYWxscyB0aGVzZSBlbnRyeXBvaW50cyBhcmUgZm9yLCBib3RoIGZvcm1zCi8vIHJlc29sdmUgdG8gdGhlIHNhbWUgYWRkcmVzcywgYW5kIGBJc0N1cnJlbnQoKWAgcmVqZWN0cyB0aGUgc2libGluZy9zdGFsZS1gY3VyYAovLyBjYXNlcyB3aGVyZSB0aGV5IGNvdWxkIGRpZmZlciBhdCBhbGwg4oCUIHNvIHRoaXMgZmlsZSBpcyBzdHJpY3RseSB0aGUgdGlnaHRlcgovLyBvZiB0aGUgdHdvLgoKaW1wb3J0ICJjaGFpbiIKCnZhciAoCgkvLyBhZG1pbiBpcyB0aGUgTElWRSBhdXRob3JpdHksIHNlZWRlZCB3aXRoIHRoZSBwdWJsaXNoZXIgYXQgcGFja2FnZSBsb2FkLgoJLy8gSW5pdGlhbGl6ZWQgYXQgZGVjbGFyYXRpb24gcmF0aGVyIHRoYW4gaW4gaW5pdCgpIHNvIHRoZXJlIGlzIG5vCgkvLyBpbml0LW9yZGVyaW5nIHF1ZXN0aW9uIGFib3V0IGdhdGVzIHRoYXQgcmVhZCBpdC4KCWFkbWluIGFkZHJlc3MgPSBwdWJsaXNoZXJBdExvYWQoKQoKCS8vIGZlZUZhbGxiYWNrIHJlY2VpdmVzIHRoZSBwcm90b2NvbCBmZWUgb25seSB3aGVuIG1lbWJhX21hcmtldF9jb25maWcKCS8vIHJlcG9ydHMgbm8gdHJlYXN1cnkgKHNlZSByZXNvbHZlRmVlKS4gSXQgaXMgdGhlIHB1Ymxpc2hlciB0b28sIHNvIGEgY29uZmlnCgkvLyBtaXNyZWFkIHJvdXRlcyBmZWVzIHRvIHRoZSBuYW1lc3BhY2UgbXVsdGlzaWcgcmF0aGVyIHRoYW4gdG8gYSB0ZXN0bmV0CgkvLyBrZXkgb3IgdG8gbm9ib2R5LgoJZmVlRmFsbGJhY2sgYWRkcmVzcyA9IHB1Ymxpc2hlckF0TG9hZCgpCgoJLy8gcGVuZGluZ0FkbWluIGlzIHRoZSBzdGFnZWQgc3VjY2Vzc29yOyAiIiB3aGVuIG5vIGhhbmRvZmYgaXMgaW4gZmxpZ2h0LgoJcGVuZGluZ0FkbWluIGFkZHJlc3MKKQoKLy8gVHJhbnNmZXJPd25lcnNoaXAgc3RhZ2VzIGEgaGFuZG9mZiB0byBuZXdBZG1pbi4gQWRtaW4gb25seS4gVGhlIHRyYW5zZmVyIGRvZXMKLy8gbm90IHRha2UgZWZmZWN0IHVudGlsIG5ld0FkbWluIGNhbGxzIEFjY2VwdE93bmVyc2hpcCwgc28gYWRtaW4gaXMgbmV2ZXIgbW92ZWQKLy8gdG8gYW4gYWRkcmVzcyB0aGF0IGhhcyBub3QgZGVtb25zdHJhdGVkIGl0IGNhbiB0cmFuc2FjdC4KLy8KLy8gQ2FsbGluZyBpdCBhZ2FpbiBiZWZvcmUgYWNjZXB0YW5jZSByZXBsYWNlcyB0aGUgc3RhZ2VkIGFkZHJlc3MsIHdoaWNoIGlzIGhvdwovLyBhIG1pc3R5cGVkIHByb3Bvc2FsIGlzIGNvcnJlY3RlZC4KZnVuYyBUcmFuc2Zlck93bmVyc2hpcChjdXIgcmVhbG0sIG5ld0FkbWluIGFkZHJlc3MpIHsKCWFzc2VydEFkbWluKGN1cikKCWlmIG5ld0FkbWluID09ICIiIHsKCQlwYW5pYygibmV3QWRtaW4gbXVzdCBiZSBub24tZW1wdHkiKQoJfQoJcGVuZGluZ0FkbWluID0gbmV3QWRtaW4KCWNoYWluLkVtaXQoIk93bmVyc2hpcFRyYW5zZmVyU3RhcnRlZCIsICJwZW5kaW5nIiwgbmV3QWRtaW4uU3RyaW5nKCkpCn0KCi8vIEFjY2VwdE93bmVyc2hpcCBjb21wbGV0ZXMgdGhlIGhhbmRvZmYuIE9ubHkgdGhlIHN0YWdlZCBwZW5kaW5nQWRtaW4gbWF5IGNhbGwKLy8gaXQg4oCUIGluY2x1ZGluZyBhZ2FpbnN0IHRoZSBvdXRnb2luZyBhZG1pbiwgc28gdGhlIHR3byBzdGVwcyBjYW5ub3QgYmUKLy8gY29sbGFwc2VkIGludG8gb25lIGJ5IHRoZSBwYXJ0eSBnaXZpbmcgdXAgdGhlIHJvbGUuCmZ1bmMgQWNjZXB0T3duZXJzaGlwKGN1ciByZWFsbSkgewoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoInNwb29mZWQgcmVhbG0iKQoJfQoJaWYgcGVuZGluZ0FkbWluID09ICIiIHsKCQlwYW5pYygibm8gcGVuZGluZyBvd25lcnNoaXAgdHJhbnNmZXIiKQoJfQoJaWYgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IHBlbmRpbmdBZG1pbiB7CgkJcGFuaWMoInVuYXV0aG9yaXplZDogb25seSB0aGUgcGVuZGluZyBhZG1pbiBtYXkgYWNjZXB0IikKCX0KCWFkbWluID0gcGVuZGluZ0FkbWluCglwZW5kaW5nQWRtaW4gPSAiIgoJY2hhaW4uRW1pdCgiT3duZXJzaGlwVHJhbnNmZXJBY2NlcHRlZCIsICJhZG1pbiIsIGFkbWluLlN0cmluZygpKQp9CgovLyBDYW5jZWxPd25lcnNoaXBUcmFuc2ZlciBjbGVhcnMgYSBzdGFnZWQgaGFuZG9mZi4gQWRtaW4gb25seSDigJQgdGhlIG91dGdvaW5nCi8vIGFkbWluIG11c3QgYmUgYWJsZSB0byBhYm9ydCBhIHByb3Bvc2FsIGl0IG5vIGxvbmdlciB3YW50cywgd2l0aG91dCBuZWVkaW5nCi8vIHRoZSBwcm9wb3NlZCBhZGRyZXNzIHRvIGNvb3BlcmF0ZS4KZnVuYyBDYW5jZWxPd25lcnNoaXBUcmFuc2ZlcihjdXIgcmVhbG0pIHsKCWFzc2VydEFkbWluKGN1cikKCWlmIHBlbmRpbmdBZG1pbiA9PSAiIiB7CgkJcGFuaWMoIm5vIHBlbmRpbmcgb3duZXJzaGlwIHRyYW5zZmVyIikKCX0KCWNhbmNlbGxlZCA6PSBwZW5kaW5nQWRtaW4KCXBlbmRpbmdBZG1pbiA9ICIiCgljaGFpbi5FbWl0KCJPd25lcnNoaXBUcmFuc2ZlckNhbmNlbGxlZCIsICJjYW5jZWxsZWQiLCBjYW5jZWxsZWQuU3RyaW5nKCkpCn0KCi8vIEdldEFkbWluIHJldHVybnMgdGhlIGFkZHJlc3MgdGhhdCBjdXJyZW50bHkgaG9sZHMgYWRtaW4uCmZ1bmMgR2V0QWRtaW4oKSBzdHJpbmcgeyByZXR1cm4gYWRtaW4uU3RyaW5nKCkgfQoKLy8gR2V0UGVuZGluZ0FkbWluIHJldHVybnMgdGhlIHN0YWdlZCBzdWNjZXNzb3IgKCIiIHdoZW4gbm9uZSBpcyBpbiBmbGlnaHQpLgpmdW5jIEdldFBlbmRpbmdBZG1pbigpIHN0cmluZyB7IHJldHVybiBwZW5kaW5nQWRtaW4uU3RyaW5nKCkgfQoKLy8gYXNzZXJ0QWRtaW4gaXMgdGhlIGF1dGhvcml6YXRpb24gZ2F0ZSBmb3IgdGhpcyBmaWxlJ3MgZW50cnlwb2ludHMuIEl0IHJlamVjdHMKLy8gYSBzdGFsZS9zaWJsaW5nIGBjdXJgIGZpcnN0LCB0aGVuIHRha2VzIHRoZSBjYWxsZXIgZnJvbSBjdXIuUHJldmlvdXMoKS4KZnVuYyBhc3NlcnRBZG1pbihjdXIgcmVhbG0pIHsKCWlmICFjdXIuSXNDdXJyZW50KCkgewoJCXBhbmljKCJzcG9vZmVkIHJlYWxtIikKCX0KCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBhZG1pbiB7CgkJcGFuaWMoInVuYXV0aG9yaXplZDogb25seSBhZG1pbiBtYXkgcGVyZm9ybSB0aGlzIGFjdGlvbiIpCgl9Cn0KGqveAQoKZXNjcm93LmdubxKb3gFwYWNrYWdlIGVzY3Jvd192MwoKLy8gTWlsZXN0b25lLWJhc2VkIEVzY3JvdyDigJQgT24tY2hhaW4gZnJlZWxhbmNlIHNlcnZpY2UgY29udHJhY3RzIGZvciBNZW1iYS4KLy8KLy8gRmxvdzogQ3JlYXRlQ29udHJhY3Qg4oaSIEZ1bmRNaWxlc3RvbmUg4oaSIENvbXBsZXRlTWlsZXN0b25lIOKGkiBSZWxlYXNlRnVuZHMKLy8gRGlzcHV0ZXM6IFJhaXNlRGlzcHV0ZSDihpIgYWRtaW4gcmVzb2x2ZXMgKG9yIGF1dG8tcmVzb2x2ZXMgYWZ0ZXIgdGltZW91dCkKLy8gVGltZW91dHM6IENsYWltUmVmdW5kIChhdXRvLXJlZnVuZCBpZiBtaWxlc3RvbmUgbm90IGNvbXBsZXRlZCBhZnRlciBOIGJsb2NrcykKLy8gICAgICAgICAgIENsYWltRGlzcHV0ZVRpbWVvdXQgKGF1dG8tcmVsZWFzZSB0byBmcmVlbGFuY2VyIGlmIGFkbWluIGRvZXNuJ3QgYWN0KQovLwovLyBTZWN1cml0eToKLy8gICAtIFNUQVRFLUJFRk9SRS1TRU5EOiBBbGwgc3RhdGUgdXBkYXRlcyBoYXBwZW4gYmVmb3JlIFNlbmRDb2lucyBjYWxscwovLyAgIC0gZmVlIGZhaWwtc2FmZSByZWNpcGllbnQgc2VlZGVkIGZyb20gdGhlIHB1Ymxpc2hlciBhdCBsb2FkIChhZG1pbi5nbm8pCi8vICAgLSBTZWxmLWhpcmUgcHJldmVudGlvbjogZnJlZWxhbmNlciAhPSBjbGllbnQKLy8gICAtIElucHV0IHZhbGlkYXRpb246IHRpdGxlL2Rlc2NyaXB0aW9uIGxlbmd0aCwgbWlsZXN0b25lIGFtb3VudHMgPiAwCi8vICAgLSBBdXRvLXJlZnVuZDogcHJldmVudHMgcGVybWFuZW50IGZ1bmQgbG9ja2luZwovLyAgIC0gRGlzcHV0ZSB0aW1lb3V0OiBwcmV2ZW50cyBwZXJtYW5lbnQgZGlzcHV0ZSBsb2NraW5nCi8vCi8vIFJlbmRlcigpIGNvbnRyYWN0OgovLyAgIEhvbWUg4oCUIFJlbmRlcigiIik6Ci8vICAgICAjIEVzY3JvdyBDb250cmFjdHMKLy8gICAgIHwgSUQgfCBUaXRsZSB8IENsaWVudCB8IEZyZWVsYW5jZXIgfCBTdGF0dXMgfCBUb3RhbCB8Ci8vCi8vICAgRGV0YWlsIOKAlCBSZW5kZXIoImNvbnRyYWN0L0lEIik6Ci8vICAgICAjIFRpdGxlCi8vICAgICAqKkNsaWVudDoqKiBnMS4uLgovLyAgICAgKipGcmVlbGFuY2VyOioqIGcxLi4uCi8vICAgICAqKlN0YXR1czoqKiBhY3RpdmUKLy8gICAgICMjIE1pbGVzdG9uZXMKLy8gICAgIC0gKipNaWxlc3RvbmUgVGl0bGUqKiDigJQgMTAwMDAwMCB1Z25vdCBbZnVuZGVkXQoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9iYW5rZXIiCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJImduby5sYW5kL3Avc2FtY3Jldy9hdmwiCgkiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoKCWNmZyAiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX21hcmtldF9jb25maWciCikKCi8vIOKUgOKUgCBDb25zdGFudHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgovLyBsYW5lU2VydmljZSBpcyB0aGlzIGVuZ2luZSdzIGxhbmUga2V5IGludG8gdGhlIERBTyBmZWUgc3BpbmUgKG1lbWJhX21hcmtldF9jb25maWcpLgovLyBTZWVkZWQgdGhlcmUgYXQgMjAwIGJwcyAoMi4wJSkg4oCUIHNlZSBtZW1iYV9tYXJrZXRfY29uZmlnL2NvbmZpZy5nbm8ncyBpbml0KCksIHdoaWNoCi8vIGV4cGxpY2l0bHkgZG9jdW1lbnRzICJzZXJ2aWNlIiBhcyBlc2Nyb3cncyByZWxlYXNlIGZlZSBsYW5lLgpjb25zdCBsYW5lU2VydmljZSA9ICJzZXJ2aWNlIgoKY29uc3QgKAoJLy8gTm8gYXV0aG9yaXR5IGFkZHJlc3MgaXMgY29tcGlsZWQgaW4uIGFkbWluLmdubyBzZWVkcyB0aGUgbGl2ZSBgYWRtaW5gIGFuZAoJLy8gdGhlIGZlZSBmYWlsLXNhZmUgYGZlZUZhbGxiYWNrYCBmcm9tIHRoZSBwdWJsaXNoaW5nIHRyYW5zYWN0aW9uJ3Mgc2lnbmVyIGF0CgkvLyBwYWNrYWdlIGxvYWQgKG9uIGdub2xhbmQtMSB0aGUgc2FtY3JldyBuYW1lc3BhY2UgbXVsdGlzaWcsIHRoZSBzdGFtcGVkCgkvLyBjcmVhdG9yIGF0IGVuYWJsZSB0aW1lKTsgYWRtaW4gaXMgcm90YXRlZCB2aWEgVHJhbnNmZXJPd25lcnNoaXAvCgkvLyBBY2NlcHRPd25lcnNoaXAuIERvIG5vdCBjb21wYXJlIGEgY2FsbGVyIGFnYWluc3QgYSBjb25zdGFudDogb24gbWFpbm5ldCBhCgkvLyBjb21waWxlLXRpbWUgYXV0aG9yaXR5IGlzIHVucmVjb3ZlcmFibGUgKGltbXV0YWJsZSByZWFsbSwgbm8gZmF1Y2V0KS4KCS8vIFBsYXRmb3JtRmVlUGN0IGlzIG5vdyBvbmx5IHRoZSBGQUlMLVNBRkUgZmFsbGJhY2sgYnBzIHNvdXJjZSAoc2VlIHJlc29sdmVGZWUpIOKAlAoJLy8gdGhlIGxpdmUgcGF0aCByZWFkcyBjZmcuR2V0RmVlQlBTKGxhbmVTZXJ2aWNlKS4gS2VwdCBhcyBhIDAtMTAwIHBlcmNlbnQgKG5vdCBicHMpCgkvLyBmb3IgYmFja3dhcmQtY29tcGF0IHJlYWRhYmlsaXR5OyByZXNvbHZlRmVlIGNvbnZlcnRzIGl0LgoJUGxhdGZvcm1GZWVQY3QgID0gMiAgLy8gMiUgZmFsbGJhY2sgb25seQoJQ2FuY2VsRmVlUGN0ICAgID0gNSAgLy8gNSUgY2FuY2VsbGF0aW9uIGZlZSDigJQgZXNjcm93LWludGVybmFsLCBOT1Qgb24gdGhlIGZlZSBzcGluZQoJICAgICAgICAgICAgICAgICAgICAgLy8gKHBhaWQgdG8gdGhlIGZyZWVsYW5jZXIgYXMgY29tcGVuc2F0aW9uLCBub3QgYSBwcm90b2NvbCBmZWUpCglBdXRvUmVmdW5kQmxrcyAgPSBpbnQ2NCg4NjQwMDApICAvLyB+MzAgZGF5cyBhdCAzcy9ibG9jawoJQXV0b1Jlc29sdmVCbGtzID0gaW50NjQoODA2NDAwKSAgLy8gfjI4IGRheXMgYXQgM3MvYmxvY2sKCU1heFRpdGxlTGVuICAgICAgICA9IDIwMAoJTWF4RGVzY0xlbiAgICAgICAgID0gNTAwMAoJTWF4TWlsZXN0b25lcyAgICAgID0gMjAKCU1heENvbnRyYWN0cyAgICAgICA9IDUwMAoJTWluTWlsZXN0b25lQW1vdW50ID0gaW50NjQoMTAwMCkgLy8gMC4wMDEgR05PVCDigJQgcHJldmVudHMgZmVlIGV2YXNpb24gdmlhIHRydW5jYXRpb24KKQoKLy8g4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKdHlwZSBDb250cmFjdFN0YXR1cyBzdHJpbmcKCmNvbnN0ICgKCVN0YXR1c0FjdGl2ZSAgICBDb250cmFjdFN0YXR1cyA9ICJhY3RpdmUiCglTdGF0dXNDb21wbGV0ZWQgQ29udHJhY3RTdGF0dXMgPSAiY29tcGxldGVkIgoJU3RhdHVzRGlzcHV0ZWQgIENvbnRyYWN0U3RhdHVzID0gImRpc3B1dGVkIgoJU3RhdHVzQ2FuY2VsbGVkIENvbnRyYWN0U3RhdHVzID0gImNhbmNlbGxlZCIKKQoKdHlwZSBNaWxlc3RvbmVTdGF0dXMgc3RyaW5nCgpjb25zdCAoCglNc1BlbmRpbmcgICBNaWxlc3RvbmVTdGF0dXMgPSAicGVuZGluZyIKCU1zRnVuZGVkICAgIE1pbGVzdG9uZVN0YXR1cyA9ICJmdW5kZWQiCglNc0NvbXBsZXRlZCBNaWxlc3RvbmVTdGF0dXMgPSAiY29tcGxldGVkIgoJTXNSZWxlYXNlZCAgTWlsZXN0b25lU3RhdHVzID0gInJlbGVhc2VkIgoJTXNEaXNwdXRlZCAgTWlsZXN0b25lU3RhdHVzID0gImRpc3B1dGVkIgoJTXNSZWZ1bmRlZCAgTWlsZXN0b25lU3RhdHVzID0gInJlZnVuZGVkIgopCgp0eXBlIENvbnRyYWN0IHN0cnVjdCB7CglJRCAgICAgICAgICBzdHJpbmcKCUNsaWVudCAgICAgIGFkZHJlc3MKCUZyZWVsYW5jZXIgIGFkZHJlc3MKCVRpdGxlICAgICAgIHN0cmluZwoJRGVzY3JpcHRpb24gc3RyaW5nCglTdGF0dXMgICAgICBDb250cmFjdFN0YXR1cwoJQ3JlYXRlZEF0ICAgaW50NjQgLy8gYmxvY2sgaGVpZ2h0CglNaWxlc3RvbmVzICBbXU1pbGVzdG9uZQp9Cgp0eXBlIE1pbGVzdG9uZSBzdHJ1Y3QgewoJSUQgICAgICAgICAgICAgICBpbnQKCVRpdGxlICAgICAgICAgICAgc3RyaW5nCglBbW91bnQgICAgICAgICAgIGludDY0IC8vIHVnbm90CglTdGF0dXMgICAgICAgICAgIE1pbGVzdG9uZVN0YXR1cwoJRnVuZGVkQXQgICAgICAgICBpbnQ2NCAgICAgICAgICAgLy8gYmxvY2sgaGVpZ2h0ICgwIGlmIG5vdCBmdW5kZWQpCglDb21wbGV0ZWRBdCAgICAgIGludDY0ICAgICAgICAgICAvLyBibG9jayBoZWlnaHQgKDAgaWYgbm90IGNvbXBsZXRlZCkKCURpc3B1dGVkQXQgICAgICAgaW50NjQgICAgICAgICAgIC8vIGJsb2NrIGhlaWdodCAoMCBpZiBub3QgZGlzcHV0ZWQpCglQcmVEaXNwdXRlU3RhdHVzIE1pbGVzdG9uZVN0YXR1cyAvLyBzdGF0dXMgYmVmb3JlIGRpc3B1dGUgKE1zRnVuZGVkIG9yIE1zQ29tcGxldGVkKQp9CgovLyDilIDilIAgU3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgp2YXIgKAoJY29udHJhY3RzICAgKmF2bC5UcmVlIC8vIGlkIC0+ICpDb250cmFjdAoJbmV4dElEICAgICAgaW50CglwYXVzZWQgICAgICBib29sCgl0b3RhbExpYWJsZSBpbnQ2NCAvLyBORi0yOiB1Z25vdCBvd2VkIHRvIGZ1bmRlZC9kaXNwdXRlZCBtaWxlc3RvbmVzIOKAlCBzZWUgZ2V0dGVycy5nbm8KKQoKZnVuYyBpbml0KCkgewoJY29udHJhY3RzID0gYXZsLk5ld1RyZWUoKQp9CgovLyByZXNvbHZlRmVlIHJlYWRzIHRoZSAic2VydmljZSIgbGFuZSBwcm90b2NvbCBmZWUgKGJwcykgYW5kIHRyZWFzdXJ5IGZyb20gdGhlIERBTwovLyBmZWUgc3BpbmUgKG1lbWJhX21hcmtldF9jb25maWcpLCBzYW1lIGZhaWwtc2FmZSBwYXR0ZXJuIGFzIG1lbWJhX25mdF9tYXJrZXRfdjNfMidzCi8vIHJlc29sdmVGZWUgYW5kIG1lbWJhX3Rva2VuX290Y192MidzIEZpbGw6IHRoZSBjb25maWcgZ2V0dGVycyBhcmUgcHVyZSBhbmQKLy8gbm9uLWZhaWxpbmcsIGFuZCBvbiBhbnkgaW1wbGF1c2libGUgdmFsdWUgdGhpcyBmYWxscyBiYWNrIHRvIHRoZSBlbmdpbmUncyBvd24KLy8gZnJvemVuIGNvbnN0YW50cyByYXRoZXIgdGhhbiByZXZlcnRpbmcgYSBjbGllbnQncyByZWxlYXNlL3JlZnVuZCDigJQgYSBjb25maWcKLy8gbWlzcmVhZCBtdXN0IG5ldmVyIHN0cmFuZCBlc2Nyb3dlZCBmdW5kcy4KZnVuYyByZXNvbHZlRmVlKCkgKGludDY0LCBhZGRyZXNzKSB7CglicHMgOj0gaW50NjQoY2ZnLkdldEZlZUJQUyhsYW5lU2VydmljZSkpCglpZiBicHMgPCAwIHx8IGJwcyA+IGNmZy5NYXhGZWVCUFMgewoJCWJwcyA9IGludDY0KFBsYXRmb3JtRmVlUGN0KSAqIDEwMCAvLyBmYWxsYmFjaywgZXhwcmVzc2VkIGluIGJwcwoJfQoJdHJlYXN1cnkgOj0gY2ZnLkdldFRyZWFzdXJ5KCkKCWlmIHRyZWFzdXJ5ID09ICIiIHsKCQl0cmVhc3VyeSA9IGZlZUZhbGxiYWNrIC8vIGZhbGxiYWNrIHRvIHRoZSBwdWJsaXNoZXItc2VlZGVkIHJlY2lwaWVudAoJfQoJcmV0dXJuIGJwcywgdHJlYXN1cnkKfQoKLy8g4pSA4pSAIEVtZXJnZW5jeSBQYXVzZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmZ1bmMgYXNzZXJ0Tm90UGF1c2VkKCkgewoJaWYgcGF1c2VkIHsKCQlwYW5pYygicmVhbG0gaXMgcGF1c2VkIOKAlCBlbWVyZ2VuY3kgbWFpbnRlbmFuY2UiKQoJfQp9CgovLyBQYXVzZSBoYWx0cyBhbGwgd3JpdGUgb3BlcmF0aW9ucy4gQWRtaW4gb25seS4KZnVuYyBQYXVzZShjdXIgcmVhbG0pIHsKCWNhbGxlciA6PSB1bnNhZmUuUHJldmlvdXNSZWFsbSgpLkFkZHJlc3MoKQoJaWYgY2FsbGVyICE9IGFkbWluIHsKCQlwYW5pYygib25seSBhZG1pbiBjYW4gcGF1c2UiKQoJfQoJcGF1c2VkID0gdHJ1ZQp9CgovLyBVbnBhdXNlIHJlc3VtZXMgbm9ybWFsIG9wZXJhdGlvbnMuIEFkbWluIG9ubHkuCmZ1bmMgVW5wYXVzZShjdXIgcmVhbG0pIHsKCWNhbGxlciA6PSB1bnNhZmUuUHJldmlvdXNSZWFsbSgpLkFkZHJlc3MoKQoJaWYgY2FsbGVyICE9IGFkbWluIHsKCQlwYW5pYygib25seSBhZG1pbiBjYW4gdW5wYXVzZSIpCgl9CglwYXVzZWQgPSBmYWxzZQp9CgovLyBJc1BhdXNlZCByZXR1cm5zIHRoZSBjdXJyZW50IHBhdXNlIHN0YXRlLgpmdW5jIElzUGF1c2VkKCkgYm9vbCB7CglyZXR1cm4gcGF1c2VkCn0KCi8vIOKUgOKUgCBDb250cmFjdCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgovLyBDcmVhdGVDb250cmFjdCBjcmVhdGVzIGEgbmV3IGVzY3JvdyBjb250cmFjdCB3aXRoIG1pbGVzdG9uZXMuCi8vIE1pbGVzdG9uZXMgZm9ybWF0OiAidGl0bGUxOmFtb3VudDEsdGl0bGUyOmFtb3VudDIiCmZ1bmMgQ3JlYXRlQ29udHJhY3QoY3VyIHJlYWxtLCBmcmVlbGFuY2VyIGFkZHJlc3MsIHRpdGxlLCBkZXNjcmlwdGlvbiwgbWlsZXN0b25lcyBzdHJpbmcpIHN0cmluZyB7Cglhc3NlcnROb3RQYXVzZWQoKQoJY2FsbGVyIDo9IHVuc2FmZS5QcmV2aW91c1JlYWxtKCkuQWRkcmVzcygpCgoJLy8gVmFsaWRhdGlvbnMKCWlmIGZyZWVsYW5jZXIgPT0gY2FsbGVyIHsKCQlwYW5pYygiY2Fubm90IGhpcmUgeW91cnNlbGYiKQoJfQoJaWYgbGVuKHRpdGxlKSA9PSAwIHx8IGxlbih0aXRsZSkgPiBNYXhUaXRsZUxlbiB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJ0aXRsZSBtdXN0IGJlIDEtJWQgY2hhcmFjdGVycyIsIE1heFRpdGxlTGVuKSkKCX0KCWlmIGxlbihkZXNjcmlwdGlvbikgPiBNYXhEZXNjTGVuIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImRlc2NyaXB0aW9uIG11c3QgYmUgdW5kZXIgJWQgY2hhcmFjdGVycyIsIE1heERlc2NMZW4pKQoJfQoJaWYgY29udHJhY3RzLlNpemUoKSA+PSBNYXhDb250cmFjdHMgewoJCXBhbmljKCJjb250cmFjdCBsaW1pdCByZWFjaGVkIikKCX0KCgltcyA6PSBwYXJzZU1pbGVzdG9uZXMobWlsZXN0b25lcykKCWlmIGxlbihtcykgPT0gMCB7CgkJcGFuaWMoImF0IGxlYXN0IG9uZSBtaWxlc3RvbmUgcmVxdWlyZWQiKQoJfQoJaWYgbGVuKG1zKSA+IE1heE1pbGVzdG9uZXMgewoJCXBhbmljKHVmbXQuU3ByaW50ZigibWF4aW11bSAlZCBtaWxlc3RvbmVzIGFsbG93ZWQiLCBNYXhNaWxlc3RvbmVzKSkKCX0KCglpZCA6PSBzdHJjb252Lkl0b2EobmV4dElEKQoJbmV4dElEKysKCgljIDo9ICZDb250cmFjdHsKCQlJRDogICAgICAgICAgaWQsCgkJQ2xpZW50OiAgICAgIGNhbGxlciwKCQlGcmVlbGFuY2VyOiAgZnJlZWxhbmNlciwKCQlUaXRsZTogICAgICAgc2FuaXRpemVNaWxlc3RvbmVUaXRsZSh0aXRsZSksCgkJRGVzY3JpcHRpb246IHNhbml0aXplTWlsZXN0b25lVGl0bGUoZGVzY3JpcHRpb24pLAoJCVN0YXR1czogICAgICBTdGF0dXNBY3RpdmUsCgkJQ3JlYXRlZEF0OiAgIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSwKCQlNaWxlc3RvbmVzOiAgbXMsCgl9Cgljb250cmFjdHMuU2V0KGlkLCBjKQoKCWNoYWluLkVtaXQoIkNvbnRyYWN0Q3JlYXRlZCIsCgkJImlkIiwgaWQsCgkJImNsaWVudCIsIGNhbGxlci5TdHJpbmcoKSwKCQkiZnJlZWxhbmNlciIsIGZyZWVsYW5jZXIuU3RyaW5nKCksCgkJIm1pbGVzdG9uZXMiLCBzdHJjb252Lkl0b2EobGVuKG1zKSksCgkpCglyZXR1cm4gaWQKfQoKLy8gRnVuZE1pbGVzdG9uZSBkZXBvc2l0cyBmdW5kcyBmb3IgYSBzcGVjaWZpYyBtaWxlc3RvbmUuIENsaWVudCBvbmx5LgpmdW5jIEZ1bmRNaWxlc3RvbmUoY3VyIHJlYWxtLCBjb250cmFjdElkIHN0cmluZywgbWlsZXN0b25lSWR4IGludCkgewoJYXNzZXJ0Tm90UGF1c2VkKCkKCgkvLyBQMCBmdW5kLWd1YXJkOiBhIHBheWFibGUgZW50cnlwb2ludCBNVVNUIGJlIGEgZGlyZWN0IHVzZXIgY2FsbC4gdW5zYWZlLk9yaWdpblNlbmQoKQoJLy8gcmVwb3J0cyB0aGUgdHgtbGV2ZWwgYC0tc2VuZGAsIGNyZWRpdGVkIHRvIHRoZSBESVJFQ1QgbWVzc2FnZSB0YXJnZXQgcmVhbG0g4oCUIG5vdCB0bwoJLy8gYW4gaW5uZXIgcmVhbG0gcmVhY2hlZCB2aWEgYSBjcm9zcy1jYWxsLiBXaXRob3V0IHRoaXMgZ3VhcmQgYW4gYXR0YWNrZXIgZnVuZHMgYQoJLy8gbWlsZXN0b25lIHRocm91Z2ggdGhlaXIgb3duIGludGVybWVkaWFyeSByZWFsbSAoY29pbnMgbGFuZCB0aGVyZSksIHRoZSBlc2Nyb3cgbWFya3MKCS8vIHRoZSBtaWxlc3RvbmUgZnVuZGVkIHRob3VnaCBpdCByZWNlaXZlZCBub3RoaW5nLCB0aGVuIHRoZSBhdHRhY2tlciBleHRyYWN0cyByZWFsCgkvLyBwb29sZWQgY2xpZW50IGZ1bmRzIHZpYSBSZWxlYXNlRnVuZHMvQ2xhaW1SZWZ1bmQuIFJlcXVpcmluZyBhIGRpcmVjdCB1c2VyIGNhbGwgZm9yY2VzCgkvLyB0aGlzIHJlYWxtIHRvIGJlIHRoZSBtZXNzYWdlIHRhcmdldCwgdGhlIG9uZSBjYXNlIHdoZXJlIHRoZSBPcmlnaW5TZW5kIGNvaW5zIGFyZSBpdHMgb3duLgoJaWYgIXVuc2FmZS5QcmV2aW91c1JlYWxtKCkuSXNVc2VyQ2FsbCgpIHsKCQlwYW5pYygiRnVuZE1pbGVzdG9uZSBtdXN0IGJlIGEgZGlyZWN0IHVzZXIgY2FsbCIpCgl9CgoJY2FsbGVyIDo9IHVuc2FmZS5QcmV2aW91c1JlYWxtKCkuQWRkcmVzcygpCgljIDo9IGdldENvbnRyYWN0KGNvbnRyYWN0SWQpCgoJaWYgYy5DbGllbnQgIT0gY2FsbGVyIHsKCQlwYW5pYygib25seSBjbGllbnQgY2FuIGZ1bmQiKQoJfQoJaWYgYy5TdGF0dXMgIT0gU3RhdHVzQWN0aXZlIHsKCQlwYW5pYygiY29udHJhY3Qgbm90IGFjdGl2ZSIpCgl9CglpZiBtaWxlc3RvbmVJZHggPCAwIHx8IG1pbGVzdG9uZUlkeCA+PSBsZW4oYy5NaWxlc3RvbmVzKSB7CgkJcGFuaWMoImludmFsaWQgbWlsZXN0b25lIGluZGV4IikKCX0KCgltcyA6PSAmYy5NaWxlc3RvbmVzW21pbGVzdG9uZUlkeF0KCWlmIG1zLlN0YXR1cyAhPSBNc1BlbmRpbmcgewoJCXBhbmljKCJtaWxlc3RvbmUgYWxyZWFkeSBmdW5kZWQgb3IgcHJvY2Vzc2VkIikKCX0KCgkvLyBWZXJpZnkgY29pbnMgc2VudCAoYWNjdW11bGF0ZSB0byBoYW5kbGUgbXVsdGktZW50cnkgZGVmZW5zaXZlbHkpCglzZW50IDo9IHVuc2FmZS5PcmlnaW5TZW5kKCkKCXNlbnRBbW91bnQgOj0gaW50NjQoMCkKCWZvciBfLCBjb2luIDo9IHJhbmdlIHNlbnQgewoJCWlmIGNvaW4uRGVub20gPT0gInVnbm90IiB7CgkJCXNlbnRBbW91bnQgKz0gY29pbi5BbW91bnQKCQl9Cgl9CglpZiBzZW50QW1vdW50ICE9IG1zLkFtb3VudCB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJtdXN0IHNlbmQgZXhhY3RseSAlZCB1Z25vdCAoc2VudCAlZCkiLCBtcy5BbW91bnQsIHNlbnRBbW91bnQpKQoJfQoKCW1zLlN0YXR1cyA9IE1zRnVuZGVkCgltcy5GdW5kZWRBdCA9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJY29udHJhY3RzLlNldChjb250cmFjdElkLCBjKQoJdG90YWxMaWFibGUgKz0gbXMuQW1vdW50CgoJY2hhaW4uRW1pdCgiTWlsZXN0b25lRnVuZGVkIiwKCQkiY29udHJhY3RJZCIsIGNvbnRyYWN0SWQsCgkJIm1pbGVzdG9uZSIsIHN0cmNvbnYuSXRvYShtaWxlc3RvbmVJZHgpLAoJCSJhbW91bnQiLCBzdHJjb252LkZvcm1hdEludChtcy5BbW91bnQsIDEwKSwKCSkKfQoKLy8gQ29tcGxldGVNaWxlc3RvbmUgbWFya3MgYSBtaWxlc3RvbmUgYXMgY29tcGxldGVkLiBGcmVlbGFuY2VyIG9ubHkuCmZ1bmMgQ29tcGxldGVNaWxlc3RvbmUoY3VyIHJlYWxtLCBjb250cmFjdElkIHN0cmluZywgbWlsZXN0b25lSWR4IGludCkgewoJYXNzZXJ0Tm90UGF1c2VkKCkKCWNhbGxlciA6PSB1bnNhZmUuUHJldmlvdXNSZWFsbSgpLkFkZHJlc3MoKQoJYyA6PSBnZXRDb250cmFjdChjb250cmFjdElkKQoKCWlmIGMuRnJlZWxhbmNlciAhPSBjYWxsZXIgewoJCXBhbmljKCJvbmx5IGZyZWVsYW5jZXIgY2FuIG1hcmsgY29tcGxldGUiKQoJfQoJLy8gT25seSBhbGxvdyBjb21wbGV0aW9uIHdoZW4gY29udHJhY3QgaXMgQWN0aXZlLiBEaXNwdXRlZCBjb250cmFjdHMgYXJlIGZyb3plbgoJLy8gdW50aWwgUmVzb2x2ZURpc3B1dGUvQ2xhaW1EaXNwdXRlVGltZW91dCByZXR1cm5zIHRoZSBjb250cmFjdCB0byBBY3RpdmUuCglpZiBjLlN0YXR1cyAhPSBTdGF0dXNBY3RpdmUgewoJCXBhbmljKCJjb250cmFjdCBpcyAiICsgc3RyaW5nKGMuU3RhdHVzKSArICIg4oCUIGNhbm5vdCBjb21wbGV0ZSBtaWxlc3RvbmVzIGR1cmluZyBkaXNwdXRlIikKCX0KCWlmIG1pbGVzdG9uZUlkeCA8IDAgfHwgbWlsZXN0b25lSWR4ID49IGxlbihjLk1pbGVzdG9uZXMpIHsKCQlwYW5pYygiaW52YWxpZCBtaWxlc3RvbmUgaW5kZXgiKQoJfQoKCW1zIDo9ICZjLk1pbGVzdG9uZXNbbWlsZXN0b25lSWR4XQoJaWYgbXMuU3RhdHVzICE9IE1zRnVuZGVkIHsKCQlwYW5pYygibWlsZXN0b25lIG5vdCBmdW5kZWQiKQoJfQoKCW1zLlN0YXR1cyA9IE1zQ29tcGxldGVkCgltcy5Db21wbGV0ZWRBdCA9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJY29udHJhY3RzLlNldChjb250cmFjdElkLCBjKQoKCWNoYWluLkVtaXQoIk1pbGVzdG9uZUNvbXBsZXRlZCIsCgkJImNvbnRyYWN0SWQiLCBjb250cmFjdElkLAoJCSJtaWxlc3RvbmUiLCBzdHJjb252Lkl0b2EobWlsZXN0b25lSWR4KSwKCQkiZnJlZWxhbmNlciIsIGNhbGxlci5TdHJpbmcoKSwKCSkKfQoKLy8gUmVsZWFzZUZ1bmRzIHJlbGVhc2VzIGZ1bmRzIHRvIGZyZWVsYW5jZXIgYWZ0ZXIgY2xpZW50IGFwcHJvdmVzLiBDbGllbnQgb3IgQWRtaW4uCmZ1bmMgUmVsZWFzZUZ1bmRzKGN1ciByZWFsbSwgY29udHJhY3RJZCBzdHJpbmcsIG1pbGVzdG9uZUlkeCBpbnQpIHsKCWFzc2VydE5vdFBhdXNlZCgpCgljYWxsZXIgOj0gdW5zYWZlLlByZXZpb3VzUmVhbG0oKS5BZGRyZXNzKCkKCWMgOj0gZ2V0Q29udHJhY3QoY29udHJhY3RJZCkKCglpZiBjLkNsaWVudCAhPSBjYWxsZXIgJiYgY2FsbGVyICE9IGFkbWluIHsKCQlwYW5pYygib25seSBjbGllbnQgb3IgYWRtaW4gY2FuIHJlbGVhc2UiKQoJfQoJLy8gT25seSBhbGxvdyByZWxlYXNlIHdoZW4gY29udHJhY3QgaXMgQWN0aXZlLiBEaXNwdXRlZCBjb250cmFjdHMgYXJlIGZyb3plbgoJLy8gdW50aWwgUmVzb2x2ZURpc3B1dGUvQ2xhaW1EaXNwdXRlVGltZW91dCByZXR1cm5zIHRoZSBjb250cmFjdCB0byBBY3RpdmUuCglpZiBjLlN0YXR1cyAhPSBTdGF0dXNBY3RpdmUgewoJCXBhbmljKCJjb250cmFjdCBpcyAiICsgc3RyaW5nKGMuU3RhdHVzKSArICIg4oCUIGNhbm5vdCByZWxlYXNlIGZ1bmRzIGR1cmluZyBkaXNwdXRlIikKCX0KCWlmIG1pbGVzdG9uZUlkeCA8IDAgfHwgbWlsZXN0b25lSWR4ID49IGxlbihjLk1pbGVzdG9uZXMpIHsKCQlwYW5pYygiaW52YWxpZCBtaWxlc3RvbmUgaW5kZXgiKQoJfQoKCW1zIDo9ICZjLk1pbGVzdG9uZXNbbWlsZXN0b25lSWR4XQoJaWYgbXMuU3RhdHVzICE9IE1zQ29tcGxldGVkIHsKCQlwYW5pYygibWlsZXN0b25lIG5vdCBjb21wbGV0ZWQiKQoJfQoKCS8vIENhbGN1bGF0ZSBmZWVzIOKAlCByZWFkIGxpdmUgZnJvbSB0aGUgREFPIGZlZSBzcGluZSAoZmFpbC1zYWZlIGZhbGxiYWNrIGluc2lkZSkuCglicHMsIHRyZWFzdXJ5IDo9IHJlc29sdmVGZWUoKQoJcGxhdGZvcm1BbW91bnQgOj0gYmFzaXNQb2ludHNGZWUobXMuQW1vdW50LCBicHMpCglmcmVlbGFuY2VyQW1vdW50IDo9IG1zLkFtb3VudCAtIHBsYXRmb3JtQW1vdW50CgoJLy8gU1RBVEUtQkVGT1JFLVNFTkQ6IHVwZGF0ZSBhbGwgc3RhdGUgYmVmb3JlIGFueSBjb2luIHRyYW5zZmVycwoJbXMuU3RhdHVzID0gTXNSZWxlYXNlZAoJaWYgYWxsTWlsZXN0b25lc1JlbGVhc2VkKGMpIHsKCQljLlN0YXR1cyA9IFN0YXR1c0NvbXBsZXRlZAoJfQoJY29udHJhY3RzLlNldChjb250cmFjdElkLCBjKQoJdG90YWxMaWFibGUgLT0gbXMuQW1vdW50CgoJLy8gVHJhbnNmZXIgZnVuZHMKCWJuayA6PSBiYW5rZXIuTmV3QmFua2VyKGJhbmtlci5CYW5rZXJUeXBlUmVhbG1TZW5kLCBjdXIpCglyZWFsbUFkZHIgOj0gdW5zYWZlLkN1cnJlbnRSZWFsbSgpLkFkZHJlc3MoKQoKCWJuay5TZW5kQ29pbnMocmVhbG1BZGRyLCBjLkZyZWVsYW5jZXIsIGNoYWluLkNvaW5ze2NoYWluLk5ld0NvaW4oInVnbm90IiwgZnJlZWxhbmNlckFtb3VudCl9KQoJaWYgcGxhdGZvcm1BbW91bnQgPiAwIHsKCQlibmsuU2VuZENvaW5zKHJlYWxtQWRkciwgdHJlYXN1cnksIGNoYWluLkNvaW5ze2NoYWluLk5ld0NvaW4oInVnbm90IiwgcGxhdGZvcm1BbW91bnQpfSkKCX0KCgljaGFpbi5FbWl0KCJGdW5kc1JlbGVhc2VkIiwKCQkiY29udHJhY3RJZCIsIGNvbnRyYWN0SWQsCgkJIm1pbGVzdG9uZSIsIHN0cmNvbnYuSXRvYShtaWxlc3RvbmVJZHgpLAoJCSJmcmVlbGFuY2VyIiwgYy5GcmVlbGFuY2VyLlN0cmluZygpLAoJCSJhbW91bnQiLCBzdHJjb252LkZvcm1hdEludChmcmVlbGFuY2VyQW1vdW50LCAxMCksCgkJImZlZSIsIHN0cmNvbnYuRm9ybWF0SW50KHBsYXRmb3JtQW1vdW50LCAxMCksCgkpCn0KCi8vIOKUgOKUgCBEaXNwdXRlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCi8vIFJhaXNlRGlzcHV0ZSBlc2NhbGF0ZXMgYSBtaWxlc3RvbmUgdG8gYWRtaW4gYXJiaXRyYXRpb24uIENsaWVudCBvciBGcmVlbGFuY2VyLgpmdW5jIFJhaXNlRGlzcHV0ZShjdXIgcmVhbG0sIGNvbnRyYWN0SWQgc3RyaW5nLCBtaWxlc3RvbmVJZHggaW50KSB7Cglhc3NlcnROb3RQYXVzZWQoKQoJY2FsbGVyIDo9IHVuc2FmZS5QcmV2aW91c1JlYWxtKCkuQWRkcmVzcygpCgljIDo9IGdldENvbnRyYWN0KGNvbnRyYWN0SWQpCgoJaWYgYy5DbGllbnQgIT0gY2FsbGVyICYmIGMuRnJlZWxhbmNlciAhPSBjYWxsZXIgewoJCXBhbmljKCJvbmx5IGNsaWVudCBvciBmcmVlbGFuY2VyIGNhbiBkaXNwdXRlIikKCX0KCWlmIGMuU3RhdHVzID09IFN0YXR1c0NhbmNlbGxlZCB8fCBjLlN0YXR1cyA9PSBTdGF0dXNDb21wbGV0ZWQgewoJCXBhbmljKCJjb250cmFjdCBpcyAiICsgc3RyaW5nKGMuU3RhdHVzKSkKCX0KCWlmIG1pbGVzdG9uZUlkeCA8IDAgfHwgbWlsZXN0b25lSWR4ID49IGxlbihjLk1pbGVzdG9uZXMpIHsKCQlwYW5pYygiaW52YWxpZCBtaWxlc3RvbmUgaW5kZXgiKQoJfQoKCW1zIDo9ICZjLk1pbGVzdG9uZXNbbWlsZXN0b25lSWR4XQoJaWYgbXMuU3RhdHVzICE9IE1zRnVuZGVkICYmIG1zLlN0YXR1cyAhPSBNc0NvbXBsZXRlZCB7CgkJcGFuaWMoImNhbiBvbmx5IGRpc3B1dGUgZnVuZGVkIG9yIGNvbXBsZXRlZCBtaWxlc3RvbmVzIikKCX0KCgkvLyBDYXB0dXJlIHByZS1kaXNwdXRlIHN0YXR1cyBzbyBDbGFpbURpc3B1dGVUaW1lb3V0IGNhbiByZXNvbHZlIGZhaXJseToKCS8vIGlmIHdvcmsgd2FzIGRlbGl2ZXJlZCAoTXNDb21wbGV0ZWQpLCBwYXkgZnJlZWxhbmNlcjsgaWYgbm90IChNc0Z1bmRlZCksIHJlZnVuZCBjbGllbnQuCgltcy5QcmVEaXNwdXRlU3RhdHVzID0gbXMuU3RhdHVzCgltcy5TdGF0dXMgPSBNc0Rpc3B1dGVkCgltcy5EaXNwdXRlZEF0ID0gcnVudGltZS5DaGFpbkhlaWdodCgpCgljLlN0YXR1cyA9IFN0YXR1c0Rpc3B1dGVkCgljb250cmFjdHMuU2V0KGNvbnRyYWN0SWQsIGMpCgoJY2hhaW4uRW1pdCgiRGlzcHV0ZVJhaXNlZCIsCgkJImNvbnRyYWN0SWQiLCBjb250cmFjdElkLAoJCSJtaWxlc3RvbmUiLCBzdHJjb252Lkl0b2EobWlsZXN0b25lSWR4KSwKCQkicmFpc2VkQnkiLCBjYWxsZXIuU3RyaW5nKCksCgkpCn0KCi8vIFJlc29sdmVEaXNwdXRlIHJlc29sdmVzIGEgZGlzcHV0ZS4gQWRtaW4gb25seS4KLy8gcmVmdW5kQ2xpZW50PXRydWUgcmVmdW5kcyB0byBjbGllbnQsIGZhbHNlIHBheXMgZnJlZWxhbmNlci4KZnVuYyBSZXNvbHZlRGlzcHV0ZShjdXIgcmVhbG0sIGNvbnRyYWN0SWQgc3RyaW5nLCBtaWxlc3RvbmVJZHggaW50LCByZWZ1bmRDbGllbnQgYm9vbCkgewoJY2FsbGVyIDo9IHVuc2FmZS5QcmV2aW91c1JlYWxtKCkuQWRkcmVzcygpCglpZiBjYWxsZXIgIT0gYWRtaW4gewoJCXBhbmljKCJvbmx5IGFkbWluIGNhbiByZXNvbHZlIGRpc3B1dGVzIikKCX0KCgljIDo9IGdldENvbnRyYWN0KGNvbnRyYWN0SWQpCglpZiBtaWxlc3RvbmVJZHggPCAwIHx8IG1pbGVzdG9uZUlkeCA+PSBsZW4oYy5NaWxlc3RvbmVzKSB7CgkJcGFuaWMoImludmFsaWQgbWlsZXN0b25lIGluZGV4IikKCX0KCgltcyA6PSAmYy5NaWxlc3RvbmVzW21pbGVzdG9uZUlkeF0KCWlmIG1zLlN0YXR1cyAhPSBNc0Rpc3B1dGVkIHsKCQlwYW5pYygibWlsZXN0b25lIG5vdCBpbiBkaXNwdXRlIikKCX0KCgkvLyBTVEFURS1CRUZPUkUtU0VORDogdXBkYXRlIHN0YXRlIGJlZm9yZSB0cmFuc2ZlcnMKCWlmIHJlZnVuZENsaWVudCB7CgkJbXMuU3RhdHVzID0gTXNSZWZ1bmRlZAoJfSBlbHNlIHsKCQltcy5TdGF0dXMgPSBNc1JlbGVhc2VkCgl9CgkvLyBSZXNldCBjb250cmFjdCBzdGF0dXMgaWYgbm8gb3RoZXIgbWlsZXN0b25lcyBhcmUgZGlzcHV0ZWQKCWMuU3RhdHVzID0gU3RhdHVzQWN0aXZlCglmb3IgXywgbSA6PSByYW5nZSBjLk1pbGVzdG9uZXMgewoJCWlmIG0uU3RhdHVzID09IE1zRGlzcHV0ZWQgewoJCQljLlN0YXR1cyA9IFN0YXR1c0Rpc3B1dGVkCgkJCWJyZWFrCgkJfQoJfQoJaWYgYWxsTWlsZXN0b25lc1JlbGVhc2VkKGMpIHsKCQljLlN0YXR1cyA9IFN0YXR1c0NvbXBsZXRlZAoJfQoJY29udHJhY3RzLlNldChjb250cmFjdElkLCBjKQoJdG90YWxMaWFibGUgLT0gbXMuQW1vdW50CgoJYm5rIDo9IGJhbmtlci5OZXdCYW5rZXIoYmFua2VyLkJhbmtlclR5cGVSZWFsbVNlbmQsIGN1cikKCXJlYWxtQWRkciA6PSB1bnNhZmUuQ3VycmVudFJlYWxtKCkuQWRkcmVzcygpCgoJaWYgcmVmdW5kQ2xpZW50IHsKCQlibmsuU2VuZENvaW5zKHJlYWxtQWRkciwgYy5DbGllbnQsIGNoYWluLkNvaW5ze2NoYWluLk5ld0NvaW4oInVnbm90IiwgbXMuQW1vdW50KX0pCgl9IGVsc2UgewoJCWJwcywgdHJlYXN1cnkgOj0gcmVzb2x2ZUZlZSgpCgkJcGxhdGZvcm1BbW91bnQgOj0gYmFzaXNQb2ludHNGZWUobXMuQW1vdW50LCBicHMpCgkJZnJlZWxhbmNlckFtb3VudCA6PSBtcy5BbW91bnQgLSBwbGF0Zm9ybUFtb3VudAoJCWJuay5TZW5kQ29pbnMocmVhbG1BZGRyLCBjLkZyZWVsYW5jZXIsIGNoYWluLkNvaW5ze2NoYWluLk5ld0NvaW4oInVnbm90IiwgZnJlZWxhbmNlckFtb3VudCl9KQoJCWlmIHBsYXRmb3JtQW1vdW50ID4gMCB7CgkJCWJuay5TZW5kQ29pbnMocmVhbG1BZGRyLCB0cmVhc3VyeSwgY2hhaW4uQ29pbnN7Y2hhaW4uTmV3Q29pbigidWdub3QiLCBwbGF0Zm9ybUFtb3VudCl9KQoJCX0KCX0KCglyZXNvbHV0aW9uIDo9ICJyZWxlYXNlZC10by1mcmVlbGFuY2VyIgoJaWYgcmVmdW5kQ2xpZW50IHsKCQlyZXNvbHV0aW9uID0gInJlZnVuZGVkLXRvLWNsaWVudCIKCX0KCWNoYWluLkVtaXQoIkRpc3B1dGVSZXNvbHZlZCIsCgkJImNvbnRyYWN0SWQiLCBjb250cmFjdElkLAoJCSJtaWxlc3RvbmUiLCBzdHJjb252Lkl0b2EobWlsZXN0b25lSWR4KSwKCQkicmVzb2x1dGlvbiIsIHJlc29sdXRpb24sCgkpCn0KCi8vIOKUgOKUgCBDYW5jZWxsYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgovLyBDYW5jZWxDb250cmFjdCBjYW5jZWxzIGFuIGFjdGl2ZSBjb250cmFjdC4gQ2xpZW50IG9ubHkuCi8vIEZ1bmRlZCBtaWxlc3RvbmVzIGFyZSByZWZ1bmRlZCBtaW51cyBjYW5jZWxsYXRpb24gZmVlLgpmdW5jIENhbmNlbENvbnRyYWN0KGN1ciByZWFsbSwgY29udHJhY3RJZCBzdHJpbmcpIHsKCWFzc2VydE5vdFBhdXNlZCgpCgljYWxsZXIgOj0gdW5zYWZlLlByZXZpb3VzUmVhbG0oKS5BZGRyZXNzKCkKCWMgOj0gZ2V0Q29udHJhY3QoY29udHJhY3RJZCkKCglpZiBjLkNsaWVudCAhPSBjYWxsZXIgewoJCXBhbmljKCJvbmx5IGNsaWVudCBjYW4gY2FuY2VsIikKCX0KCWlmIGMuU3RhdHVzICE9IFN0YXR1c0FjdGl2ZSB7CgkJcGFuaWMoImNvbnRyYWN0IG5vdCBhY3RpdmUiKQoJfQoKCS8vIFNUQVRFLUJFRk9SRS1TRU5EOiB1cGRhdGUgYWxsIHN0YXRlIGJlZm9yZSB0cmFuc2ZlcnMuCgkvLyBUcmFjayB3aGljaCBtaWxlc3RvbmVzIGFyZSBORVdMWSB0cmFuc2l0aW9uZWQgc28gd2Ugb25seSBwYXkgdGhvc2UsCgkvLyBwcmV2ZW50aW5nIGRvdWJsZS1yZWZ1bmQgb2YgbWlsZXN0b25lcyBhbHJlYWR5IHJlc29sdmVkIHZpYSBSZXNvbHZlRGlzcHV0ZS4KCWMuU3RhdHVzID0gU3RhdHVzQ2FuY2VsbGVkCgl2YXIgbmV3bHlSZWZ1bmRlZCBbXWludAoJdmFyIG5ld2x5UmVsZWFzZWQgW11pbnQKCWZvciBpIDo9IHJhbmdlIGMuTWlsZXN0b25lcyB7CgkJaWYgYy5NaWxlc3RvbmVzW2ldLlN0YXR1cyA9PSBNc0Z1bmRlZCB7CgkJCWMuTWlsZXN0b25lc1tpXS5TdGF0dXMgPSBNc1JlZnVuZGVkCgkJCW5ld2x5UmVmdW5kZWQgPSBhcHBlbmQobmV3bHlSZWZ1bmRlZCwgaSkKCQl9IGVsc2UgaWYgYy5NaWxlc3RvbmVzW2ldLlN0YXR1cyA9PSBNc0NvbXBsZXRlZCB7CgkJCWMuTWlsZXN0b25lc1tpXS5TdGF0dXMgPSBNc1JlbGVhc2VkCgkJCW5ld2x5UmVsZWFzZWQgPSBhcHBlbmQobmV3bHlSZWxlYXNlZCwgaSkKCQl9CgkJLy8gQWxyZWFkeS10ZXJtaW5hbCBtaWxlc3RvbmVzIChNc1JlZnVuZGVkIGZyb20gUmVzb2x2ZURpc3B1dGUsIE1zUmVsZWFzZWQgZnJvbQoJCS8vIFJlbGVhc2VGdW5kcykgYXJlIE5PVCBhZGRlZCB0byB0aGUgcGF5bWVudCBsaXN0cyDigJQgdGhlaXIgZnVuZHMgd2VyZSBhbHJlYWR5CgkJLy8gZGlzdHJpYnV0ZWQgaW4gdGhlIG9yaWdpbmFsIG9wZXJhdGlvbi4KCX0KCWNvbnRyYWN0cy5TZXQoY29udHJhY3RJZCwgYykKCglibmsgOj0gYmFua2VyLk5ld0JhbmtlcihiYW5rZXIuQmFua2VyVHlwZVJlYWxtU2VuZCwgY3VyKQoJcmVhbG1BZGRyIDo9IHVuc2FmZS5DdXJyZW50UmVhbG0oKS5BZGRyZXNzKCkKCglmb3IgXywgaSA6PSByYW5nZSBuZXdseVJlZnVuZGVkIHsKCQltcyA6PSBjLk1pbGVzdG9uZXNbaV0KCQkvLyBSZWZ1bmQgZnVuZGVkIG1pbGVzdG9uZXMgbWludXMgY2FuY2VsbGF0aW9uIGZlZQoJCWZlZSA6PSBiYXNpc1BvaW50c0ZlZShtcy5BbW91bnQsIGludDY0KENhbmNlbEZlZVBjdCkqMTAwKQoJCXJlZnVuZCA6PSBtcy5BbW91bnQgLSBmZWUKCQlpZiByZWZ1bmQgPiAwIHsKCQkJYm5rLlNlbmRDb2lucyhyZWFsbUFkZHIsIGMuQ2xpZW50LCBjaGFpbi5Db2luc3tjaGFpbi5OZXdDb2luKCJ1Z25vdCIsIHJlZnVuZCl9KQoJCX0KCQkvLyBDYW5jZWxsYXRpb24gZmVlIGdvZXMgdG8gZnJlZWxhbmNlciBhcyBjb21wZW5zYXRpb24gZm9yIGxvc3Qgb3Bwb3J0dW5pdHkKCQkvLyAoZXNjcm93LWludGVybmFsLCBub3Qgb24gdGhlIERBTyBmZWUgc3BpbmUg4oCUIHNlZSBDYW5jZWxGZWVQY3QgZG9jIGNvbW1lbnQpLgoJCWlmIGZlZSA+IDAgewoJCQlibmsuU2VuZENvaW5zKHJlYWxtQWRkciwgYy5GcmVlbGFuY2VyLCBjaGFpbi5Db2luc3tjaGFpbi5OZXdDb2luKCJ1Z25vdCIsIGZlZSl9KQoJCX0KCQl0b3RhbExpYWJsZSAtPSBtcy5BbW91bnQKCX0KCWlmIGxlbihuZXdseVJlbGVhc2VkKSA+IDAgewoJCWJwcywgdHJlYXN1cnkgOj0gcmVzb2x2ZUZlZSgpCgkJZm9yIF8sIGkgOj0gcmFuZ2UgbmV3bHlSZWxlYXNlZCB7CgkJCW1zIDo9IGMuTWlsZXN0b25lc1tpXQoJCQkvLyBQYXkgZnJlZWxhbmNlciBmb3IgY29tcGxldGVkIHdvcmsgKGZ1bGwgYW1vdW50IG1pbnVzIHBsYXRmb3JtIGZlZSkKCQkJcGxhdGZvcm1BbW91bnQgOj0gYmFzaXNQb2ludHNGZWUobXMuQW1vdW50LCBicHMpCgkJCWZyZWVsYW5jZXJBbW91bnQgOj0gbXMuQW1vdW50IC0gcGxhdGZvcm1BbW91bnQKCQkJYm5rLlNlbmRDb2lucyhyZWFsbUFkZHIsIGMuRnJlZWxhbmNlciwgY2hhaW4uQ29pbnN7Y2hhaW4uTmV3Q29pbigidWdub3QiLCBmcmVlbGFuY2VyQW1vdW50KX0pCgkJCWlmIHBsYXRmb3JtQW1vdW50ID4gMCB7CgkJCQlibmsuU2VuZENvaW5zKHJlYWxtQWRkciwgdHJlYXN1cnksIGNoYWluLkNvaW5ze2NoYWluLk5ld0NvaW4oInVnbm90IiwgcGxhdGZvcm1BbW91bnQpfSkKCQkJfQoJCQl0b3RhbExpYWJsZSAtPSBtcy5BbW91bnQKCQl9Cgl9Cn0KCi8vIOKUgOKUgCBUaW1lb3V0cyAocGVybWlzc2lvbmxlc3MpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKLy8gQ2xhaW1SZWZ1bmQgcmVmdW5kcyBhIGZ1bmRlZCBtaWxlc3RvbmUgdGhhdCBoYXMgdGltZWQgb3V0LgovLyBBbnlvbmUgY2FuIGNhbGwg4oCUIHBlcm1pc3Npb25sZXNzLCBwcmV2ZW50cyBmdW5kIGxvY2tpbmcuCmZ1bmMgQ2xhaW1SZWZ1bmQoY3VyIHJlYWxtLCBjb250cmFjdElkIHN0cmluZywgbWlsZXN0b25lSWR4IGludCkgewoJYyA6PSBnZXRDb250cmFjdChjb250cmFjdElkKQoKCWlmIG1pbGVzdG9uZUlkeCA8IDAgfHwgbWlsZXN0b25lSWR4ID49IGxlbihjLk1pbGVzdG9uZXMpIHsKCQlwYW5pYygiaW52YWxpZCBtaWxlc3RvbmUgaW5kZXgiKQoJfQoKCW1zIDo9ICZjLk1pbGVzdG9uZXNbbWlsZXN0b25lSWR4XQoJaWYgbXMuU3RhdHVzICE9IE1zRnVuZGVkIHsKCQlwYW5pYygibWlsZXN0b25lIG5vdCBmdW5kZWQiKQoJfQoJaWYgbXMuRnVuZGVkQXQgPT0gMCB7CgkJcGFuaWMoIm1pbGVzdG9uZSBoYXMgbm8gZnVuZGluZyByZWNvcmQiKQoJfQoKCWVsYXBzZWQgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpIC0gbXMuRnVuZGVkQXQKCWlmIGVsYXBzZWQgPCBBdXRvUmVmdW5kQmxrcyB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJ0b28gZWFybHk6ICVkIGJsb2NrcyByZW1haW5pbmciLCBBdXRvUmVmdW5kQmxrcy1lbGFwc2VkKSkKCX0KCgkvLyBTVEFURS1CRUZPUkUtU0VORAoJbXMuU3RhdHVzID0gTXNSZWZ1bmRlZAoJLy8gVXBkYXRlIGNvbnRyYWN0IHN0YXR1cyBpZiBhbGwgbWlsZXN0b25lcyBhcmUgbm93IHRlcm1pbmFsCglpZiBhbGxNaWxlc3RvbmVzVGVybWluYWwoYykgewoJCWMuU3RhdHVzID0gU3RhdHVzQ2FuY2VsbGVkCgl9Cgljb250cmFjdHMuU2V0KGNvbnRyYWN0SWQsIGMpCgl0b3RhbExpYWJsZSAtPSBtcy5BbW91bnQKCglibmsgOj0gYmFua2VyLk5ld0JhbmtlcihiYW5rZXIuQmFua2VyVHlwZVJlYWxtU2VuZCwgY3VyKQoJYm5rLlNlbmRDb2lucygKCQl1bnNhZmUuQ3VycmVudFJlYWxtKCkuQWRkcmVzcygpLAoJCWMuQ2xpZW50LAoJCWNoYWluLkNvaW5ze2NoYWluLk5ld0NvaW4oInVnbm90IiwgbXMuQW1vdW50KX0sCgkpCn0KCi8vIENsYWltRGlzcHV0ZVRpbWVvdXQgYXV0by1yZXNvbHZlcyBhIGRpc3B1dGUgdGhhdCBhZG1pbiBoYXNuJ3QgYWN0ZWQgb24gYWZ0ZXIKLy8gQXV0b1Jlc29sdmVCbGtzICh+MjggZGF5cykuIFJlc29sdXRpb24gZm9sbG93cyB0aGUgcHJlLWRpc3B1dGUgc3RhdHVzOgovLyAgIC0gSWYgdGhlIG1pbGVzdG9uZSB3YXMgTXNDb21wbGV0ZWQgKGZyZWVsYW5jZXIgZGVsaXZlcmVkIHdvcmspIGJlZm9yZSBkaXNwdXRlLAovLyAgICAgZnVuZHMgZ28gdG8gZnJlZWxhbmNlciAobWludXMgcGxhdGZvcm0gZmVlKS4gVGhpcyBwcmV2ZW50cyBncmllZmluZyB3aGVyZQovLyAgICAgYSBjbGllbnQgZGlzcHV0ZXMgYWZ0ZXIgZGVsaXZlcnkgYW5kIHNpbXBseSB3YWl0cyBvdXQgdGhlIGNsb2NrLgovLyAgIC0gSWYgdGhlIG1pbGVzdG9uZSB3YXMgTXNGdW5kZWQgKHdvcmsgbm90IHlldCBkZWxpdmVyZWQpIGJlZm9yZSBkaXNwdXRlLAovLyAgICAgZnVuZHMgYXJlIHJlZnVuZGVkIHRvIGNsaWVudC4KLy8gQW55b25lIGNhbiBjYWxsIChwZXJtaXNzaW9ubGVzcyBzYWZldHkgdmFsdmUpLgpmdW5jIENsYWltRGlzcHV0ZVRpbWVvdXQoY3VyIHJlYWxtLCBjb250cmFjdElkIHN0cmluZywgbWlsZXN0b25lSWR4IGludCkgewoJYyA6PSBnZXRDb250cmFjdChjb250cmFjdElkKQoKCWlmIG1pbGVzdG9uZUlkeCA8IDAgfHwgbWlsZXN0b25lSWR4ID49IGxlbihjLk1pbGVzdG9uZXMpIHsKCQlwYW5pYygiaW52YWxpZCBtaWxlc3RvbmUgaW5kZXgiKQoJfQoKCW1zIDo9ICZjLk1pbGVzdG9uZXNbbWlsZXN0b25lSWR4XQoJaWYgbXMuU3RhdHVzICE9IE1zRGlzcHV0ZWQgewoJCXBhbmljKCJtaWxlc3RvbmUgbm90IGluIGRpc3B1dGUiKQoJfQoJaWYgbXMuRGlzcHV0ZWRBdCA9PSAwIHsKCQlwYW5pYygibWlsZXN0b25lIGhhcyBubyBkaXNwdXRlIHJlY29yZCIpCgl9CgoJZWxhcHNlZCA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkgLSBtcy5EaXNwdXRlZEF0CglpZiBlbGFwc2VkIDwgQXV0b1Jlc29sdmVCbGtzIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoInRvbyBlYXJseTogJWQgYmxvY2tzIHJlbWFpbmluZyIsIEF1dG9SZXNvbHZlQmxrcy1lbGFwc2VkKSkKCX0KCgkvLyBSZXNvbHZlIGJhc2VkIG9uIHByZS1kaXNwdXRlIHN0YXR1cyDigJQgZmFpciB0byBib3RoIHBhcnRpZXMuCglwYXlGcmVlbGFuY2VyIDo9IG1zLlByZURpc3B1dGVTdGF0dXMgPT0gTXNDb21wbGV0ZWQKCgkvLyBTVEFURS1CRUZPUkUtU0VORAoJaWYgcGF5RnJlZWxhbmNlciB7CgkJbXMuU3RhdHVzID0gTXNSZWxlYXNlZAoJfSBlbHNlIHsKCQltcy5TdGF0dXMgPSBNc1JlZnVuZGVkCgl9CgkvLyBSZXNldCBjb250cmFjdCBzdGF0dXMKCWMuU3RhdHVzID0gU3RhdHVzQWN0aXZlCglmb3IgXywgbSA6PSByYW5nZSBjLk1pbGVzdG9uZXMgewoJCWlmIG0uU3RhdHVzID09IE1zRGlzcHV0ZWQgewoJCQljLlN0YXR1cyA9IFN0YXR1c0Rpc3B1dGVkCgkJCWJyZWFrCgkJfQoJfQoJaWYgYWxsTWlsZXN0b25lc1JlbGVhc2VkKGMpIHsKCQljLlN0YXR1cyA9IFN0YXR1c0NvbXBsZXRlZAoJfSBlbHNlIGlmIGFsbE1pbGVzdG9uZXNUZXJtaW5hbChjKSB7CgkJYy5TdGF0dXMgPSBTdGF0dXNDYW5jZWxsZWQKCX0KCWNvbnRyYWN0cy5TZXQoY29udHJhY3RJZCwgYykKCXRvdGFsTGlhYmxlIC09IG1zLkFtb3VudAoKCWJuayA6PSBiYW5rZXIuTmV3QmFua2VyKGJhbmtlci5CYW5rZXJUeXBlUmVhbG1TZW5kLCBjdXIpCglyZWFsbUFkZHIgOj0gdW5zYWZlLkN1cnJlbnRSZWFsbSgpLkFkZHJlc3MoKQoKCWlmIHBheUZyZWVsYW5jZXIgewoJCS8vIFdvcmsgd2FzIGRlbGl2ZXJlZCDigJQgcGF5IGZyZWVsYW5jZXIgbWludXMgcGxhdGZvcm0gZmVlCgkJYnBzLCB0cmVhc3VyeSA6PSByZXNvbHZlRmVlKCkKCQlwbGF0Zm9ybUFtb3VudCA6PSBiYXNpc1BvaW50c0ZlZShtcy5BbW91bnQsIGJwcykKCQlmcmVlbGFuY2VyQW1vdW50IDo9IG1zLkFtb3VudCAtIHBsYXRmb3JtQW1vdW50CgkJYm5rLlNlbmRDb2lucyhyZWFsbUFkZHIsIGMuRnJlZWxhbmNlciwgY2hhaW4uQ29pbnN7Y2hhaW4uTmV3Q29pbigidWdub3QiLCBmcmVlbGFuY2VyQW1vdW50KX0pCgkJaWYgcGxhdGZvcm1BbW91bnQgPiAwIHsKCQkJYm5rLlNlbmRDb2lucyhyZWFsbUFkZHIsIHRyZWFzdXJ5LCBjaGFpbi5Db2luc3tjaGFpbi5OZXdDb2luKCJ1Z25vdCIsIHBsYXRmb3JtQW1vdW50KX0pCgkJfQoJCWNoYWluLkVtaXQoIkRpc3B1dGVUaW1lZE91dCIsCgkJCSJjb250cmFjdElkIiwgY29udHJhY3RJZCwKCQkJIm1pbGVzdG9uZSIsIHN0cmNvbnYuSXRvYShtaWxlc3RvbmVJZHgpLAoJCQkicmVzb2x1dGlvbiIsICJwYWlkLWZyZWVsYW5jZXItd29yay1kZWxpdmVyZWQiLAoJCSkKCX0gZWxzZSB7CgkJLy8gV29yayBuZXZlciBkZWxpdmVyZWQg4oCUIHJlZnVuZCBjbGllbnQgaW4gZnVsbAoJCWJuay5TZW5kQ29pbnMocmVhbG1BZGRyLCBjLkNsaWVudCwgY2hhaW4uQ29pbnN7Y2hhaW4uTmV3Q29pbigidWdub3QiLCBtcy5BbW91bnQpfSkKCQljaGFpbi5FbWl0KCJEaXNwdXRlVGltZWRPdXQiLAoJCQkiY29udHJhY3RJZCIsIGNvbnRyYWN0SWQsCgkJCSJtaWxlc3RvbmUiLCBzdHJjb252Lkl0b2EobWlsZXN0b25lSWR4KSwKCQkJInJlc29sdXRpb24iLCAicmVmdW5kZWQtY2xpZW50LW5vLWRlbGl2ZXJ5IiwKCQkpCgl9Cn0KCi8vIOKUgOKUgCBSZW5kZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIHBhdGggPT0gIiIgewoJCXJldHVybiByZW5kZXJIb21lKCkKCX0KCWlmIHN0cmluZ3MuSGFzUHJlZml4KHBhdGgsICJjb250cmFjdC8iKSB7CgkJaWQgOj0gc3RyaW5ncy5UcmltUHJlZml4KHBhdGgsICJjb250cmFjdC8iKQoJCXJldHVybiByZW5kZXJDb250cmFjdChpZCkKCX0KCWlmIHBhdGggPT0gInN0YXRzIiB7CgkJcmV0dXJuIHJlbmRlclN0YXRzKCkKCX0KCXJldHVybiAiIyA0MDRcbk5vdCBmb3VuZDogIiArIHBhdGgKfQoKZnVuYyByZW5kZXJIb21lKCkgc3RyaW5nIHsKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCXNiLldyaXRlU3RyaW5nKCIjIEVzY3JvdyBDb250cmFjdHNcblxuIikKCXNiLldyaXRlU3RyaW5nKCJNaWxlc3RvbmUtYmFzZWQgZXNjcm93IGZvciBmcmVlbGFuY2Ugc2VydmljZXMgb24gR25vLlxuXG4iKQoKCWlmIGNvbnRyYWN0cy5TaXplKCkgPT0gMCB7CgkJc2IuV3JpdGVTdHJpbmcoIipObyBjb250cmFjdHMgeWV0LipcbiIpCgkJcmV0dXJuIHNiLlN0cmluZygpCgl9CgoJc2IuV3JpdGVTdHJpbmcoInwgSUQgfCBUaXRsZSB8IENsaWVudCB8IEZyZWVsYW5jZXIgfCBTdGF0dXMgfCBUb3RhbCB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgLS0tIHwgLS0tIHwgLS0tIHwgLS0tIHwgLS0tIHwgLS0tIHxcbiIpCgoJY29udHJhY3RzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGtleSBzdHJpbmcsIHZhbHVlIGludGVyZmFjZXt9KSBib29sIHsKCQljIDo9IHZhbHVlLigqQ29udHJhY3QpCgkJdG90YWwgOj0gaW50NjQoMCkKCQlmb3IgXywgbXMgOj0gcmFuZ2UgYy5NaWxlc3RvbmVzIHsKCQkJdG90YWwgKz0gbXMuQW1vdW50CgkJfQoJCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigifCAlcyB8IFslc10oOmNvbnRyYWN0LyVzKSB8ICVzIHwgJXMgfCAlcyB8ICVkIHVnbm90IHxcbiIsCgkJCWMuSUQsIGMuVGl0bGUsIGMuSUQsIHRydW5jQWRkcihjLkNsaWVudCksIHRydW5jQWRkcihjLkZyZWVsYW5jZXIpLAoJCQlzdHJpbmcoYy5TdGF0dXMpLCB0b3RhbCkpCgkJcmV0dXJuIGZhbHNlCgl9KQoKCXJldHVybiBzYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlckNvbnRyYWN0KGlkIHN0cmluZykgc3RyaW5nIHsKCXZhbCwgZXhpc3RzIDo9IGNvbnRyYWN0cy5HZXQoaWQpCglpZiAhZXhpc3RzIHsKCQlyZXR1cm4gIiMgNDA0XG5Db250cmFjdCBub3QgZm91bmQ6ICIgKyBpZAoJfQoJYyA6PSB2YWwuKCpDb250cmFjdCkKCgl2YXIgc2Igc3RyaW5ncy5CdWlsZGVyCglzYi5Xcml0ZVN0cmluZygiIyAiICsgYy5UaXRsZSArICJcblxuIikKCWlmIGxlbihjLkRlc2NyaXB0aW9uKSA+IDAgewoJCXNiLldyaXRlU3RyaW5nKGMuRGVzY3JpcHRpb24gKyAiXG5cbiIpCgl9CglzYi5Xcml0ZVN0cmluZygiKipJRDoqKiAiICsgYy5JRCArICJcbiIpCglzYi5Xcml0ZVN0cmluZygiKipDbGllbnQ6KiogIiArIGMuQ2xpZW50LlN0cmluZygpICsgIlxuIikKCXNiLldyaXRlU3RyaW5nKCIqKkZyZWVsYW5jZXI6KiogIiArIGMuRnJlZWxhbmNlci5TdHJpbmcoKSArICJcbiIpCglzYi5Xcml0ZVN0cmluZygiKipTdGF0dXM6KiogIiArIHN0cmluZyhjLlN0YXR1cykgKyAiXG4iKQoJc2IuV3JpdGVTdHJpbmcoIioqQ3JlYXRlZDoqKiBibG9jayAiICsgc3RyY29udi5Gb3JtYXRJbnQoYy5DcmVhdGVkQXQsIDEwKSArICJcblxuIikKCgl0b3RhbCA6PSBpbnQ2NCgwKQoJZm9yIF8sIG1zIDo9IHJhbmdlIGMuTWlsZXN0b25lcyB7CgkJdG90YWwgKz0gbXMuQW1vdW50Cgl9CglzYi5Xcml0ZVN0cmluZygiKipUb3RhbCBWYWx1ZToqKiAiICsgc3RyY29udi5Gb3JtYXRJbnQodG90YWwsIDEwKSArICIgdWdub3RcblxuIikKCglzYi5Xcml0ZVN0cmluZygiIyMgTWlsZXN0b25lc1xuXG4iKQoJZm9yIF8sIG1zIDo9IHJhbmdlIGMuTWlsZXN0b25lcyB7CgkJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCItICoqJXMqKiDigJQgJWQgdWdub3QgWyVzXSIsCgkJCW1zLlRpdGxlLCBtcy5BbW91bnQsIHN0cmluZyhtcy5TdGF0dXMpKSkKCQlpZiBtcy5GdW5kZWRBdCA+IDAgewoJCQlzYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiAoZnVuZGVkIGJsb2NrICVkKSIsIG1zLkZ1bmRlZEF0KSkKCQl9CgkJaWYgbXMuQ29tcGxldGVkQXQgPiAwIHsKCQkJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIgKGNvbXBsZXRlZCBibG9jayAlZCkiLCBtcy5Db21wbGV0ZWRBdCkpCgkJfQoJCWlmIG1zLkRpc3B1dGVkQXQgPiAwIHsKCQkJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIgKGRpc3B1dGVkIGJsb2NrICVkKSIsIG1zLkRpc3B1dGVkQXQpKQoJCX0KCQlzYi5Xcml0ZVN0cmluZygiXG4iKQoJfQoKCXJldHVybiBzYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlclN0YXRzKCkgc3RyaW5nIHsKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCXNiLldyaXRlU3RyaW5nKCIjIEVzY3JvdyBTdGF0c1xuXG4iKQoKCXRvdGFsQ29udHJhY3RzIDo9IGNvbnRyYWN0cy5TaXplKCkKCWFjdGl2ZSwgY29tcGxldGVkLCBkaXNwdXRlZCwgY2FuY2VsbGVkIDo9IDAsIDAsIDAsIDAKCXRvdGFsVmFsdWUgOj0gaW50NjQoMCkKCgljb250cmFjdHMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoa2V5IHN0cmluZywgdmFsdWUgaW50ZXJmYWNle30pIGJvb2wgewoJCWMgOj0gdmFsdWUuKCpDb250cmFjdCkKCQlzd2l0Y2ggYy5TdGF0dXMgewoJCWNhc2UgU3RhdHVzQWN0aXZlOgoJCQlhY3RpdmUrKwoJCWNhc2UgU3RhdHVzQ29tcGxldGVkOgoJCQljb21wbGV0ZWQrKwoJCWNhc2UgU3RhdHVzRGlzcHV0ZWQ6CgkJCWRpc3B1dGVkKysKCQljYXNlIFN0YXR1c0NhbmNlbGxlZDoKCQkJY2FuY2VsbGVkKysKCQl9CgkJZm9yIF8sIG1zIDo9IHJhbmdlIGMuTWlsZXN0b25lcyB7CgkJCXRvdGFsVmFsdWUgKz0gbXMuQW1vdW50CgkJfQoJCXJldHVybiBmYWxzZQoJfSkKCglzYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIioqVG90YWwgQ29udHJhY3RzOioqICVkXG4iLCB0b3RhbENvbnRyYWN0cykpCglzYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIioqQWN0aXZlOioqICVkIHwgKipDb21wbGV0ZWQ6KiogJWQgfCAqKkRpc3B1dGVkOioqICVkIHwgKipDYW5jZWxsZWQ6KiogJWRcbiIsIGFjdGl2ZSwgY29tcGxldGVkLCBkaXNwdXRlZCwgY2FuY2VsbGVkKSkKCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKipUb3RhbCBWYWx1ZToqKiAlZCB1Z25vdFxuIiwgdG90YWxWYWx1ZSkpCgoJcmV0dXJuIHNiLlN0cmluZygpCn0KCi8vIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZnVuYyBnZXRDb250cmFjdChpZCBzdHJpbmcpICpDb250cmFjdCB7Cgl2YWwsIGV4aXN0cyA6PSBjb250cmFjdHMuR2V0KGlkKQoJaWYgIWV4aXN0cyB7CgkJcGFuaWMoImNvbnRyYWN0IG5vdCBmb3VuZDogIiArIGlkKQoJfQoJcmV0dXJuIHZhbC4oKkNvbnRyYWN0KQp9CgpmdW5jIGFsbE1pbGVzdG9uZXNSZWxlYXNlZChjICpDb250cmFjdCkgYm9vbCB7Cglmb3IgXywgbSA6PSByYW5nZSBjLk1pbGVzdG9uZXMgewoJCWlmIG0uU3RhdHVzICE9IE1zUmVsZWFzZWQgewoJCQlyZXR1cm4gZmFsc2UKCQl9Cgl9CglyZXR1cm4gdHJ1ZQp9CgovLyBhbGxNaWxlc3RvbmVzVGVybWluYWwgcmV0dXJucyB0cnVlIGlmIGV2ZXJ5IG1pbGVzdG9uZSBpcyBpbiBhIGZpbmFsIHN0YXRlCi8vIChyZWxlYXNlZCwgcmVmdW5kZWQsIG9yIHBlbmRpbmcg4oCUIHBlbmRpbmcgd2l0aCBubyBmdW5kcyBpcyB0ZXJtaW5hbCkuCmZ1bmMgYWxsTWlsZXN0b25lc1Rlcm1pbmFsKGMgKkNvbnRyYWN0KSBib29sIHsKCWZvciBfLCBtIDo9IHJhbmdlIGMuTWlsZXN0b25lcyB7CgkJaWYgbS5TdGF0dXMgPT0gTXNGdW5kZWQgfHwgbS5TdGF0dXMgPT0gTXNDb21wbGV0ZWQgfHwgbS5TdGF0dXMgPT0gTXNEaXNwdXRlZCB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KCi8vIHBhcnNlTWlsZXN0b25lcyBwYXJzZXMgInRpdGxlMTphbW91bnQxLHRpdGxlMjphbW91bnQyIiBpbnRvIE1pbGVzdG9uZSBzbGljZS4KLy8gSW52YWxpZCBlbnRyaWVzIGNhdXNlIGEgcGFuaWMgKG5vdCBzaWxlbnRseSBza2lwcGVkKS4KZnVuYyBwYXJzZU1pbGVzdG9uZXMoaW5wdXQgc3RyaW5nKSBbXU1pbGVzdG9uZSB7Cgl2YXIgcmVzdWx0IFtdTWlsZXN0b25lCglwYXJ0cyA6PSBzdHJpbmdzLlNwbGl0KGlucHV0LCAiLCIpCglmb3IgaSwgcCA6PSByYW5nZSBwYXJ0cyB7CgkJcCA9IHN0cmluZ3MuVHJpbVNwYWNlKHApCgkJaWYgbGVuKHApID09IDAgewoJCQljb250aW51ZQoJCX0KCQlrdiA6PSBzdHJpbmdzLlNwbGl0TihwLCAiOiIsIDIpCgkJaWYgbGVuKGt2KSAhPSAyIHsKCQkJcGFuaWModWZtdC5TcHJpbnRmKCJpbnZhbGlkIG1pbGVzdG9uZSBmb3JtYXQgYXQgcG9zaXRpb24gJWQ6IGV4cGVjdGVkICd0aXRsZTphbW91bnQnIiwgaSkpCgkJfQoJCXRpdGxlIDo9IHN0cmluZ3MuVHJpbVNwYWNlKGt2WzBdKQoJCWlmIGxlbih0aXRsZSkgPT0gMCB7CgkJCXBhbmljKHVmbXQuU3ByaW50ZigiZW1wdHkgbWlsZXN0b25lIHRpdGxlIGF0IHBvc2l0aW9uICVkIiwgaSkpCgkJfQoJCWlmIGxlbih0aXRsZSkgPiBNYXhUaXRsZUxlbiB7CgkJCXBhbmljKHVmbXQuU3ByaW50ZigibWlsZXN0b25lIHRpdGxlIHRvbyBsb25nIGF0IHBvc2l0aW9uICVkOiAlZC8lZCBjaGFycyIsIGksIGxlbih0aXRsZSksIE1heFRpdGxlTGVuKSkKCQl9CgkJdGl0bGUgPSBzYW5pdGl6ZU1pbGVzdG9uZVRpdGxlKHRpdGxlKQoJCWFtb3VudCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQoc3RyaW5ncy5UcmltU3BhY2Uoa3ZbMV0pLCAxMCwgNjQpCgkJaWYgZXJyICE9IG5pbCB8fCBhbW91bnQgPD0gMCB7CgkJCXBhbmljKHVmbXQuU3ByaW50ZigiaW52YWxpZCBtaWxlc3RvbmUgYW1vdW50IGF0IHBvc2l0aW9uICVkOiBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIiLCBpKSkKCQl9CgkJLy8gTWluaW11bSBtaWxlc3RvbmUgYW1vdW50IHByZXZlbnRzIGZlZSBldmFzaW9uIHZpYSBpbnRlZ2VyIHRydW5jYXRpb24uCgkJLy8gQXQgMiUgZmVlLCBhbW91bnRzIDwgNTAgdWdub3Qgd291bGQgcGF5IDAgZmVlLgoJCWlmIGFtb3VudCA8IE1pbk1pbGVzdG9uZUFtb3VudCB7CgkJCXBhbmljKHVmbXQuU3ByaW50ZigibWlsZXN0b25lIGFtb3VudCB0b28gc21hbGwgYXQgcG9zaXRpb24gJWQ6IG1pbmltdW0gJWQgdWdub3QiLCBpLCBNaW5NaWxlc3RvbmVBbW91bnQpKQoJCX0KCQlyZXN1bHQgPSBhcHBlbmQocmVzdWx0LCBNaWxlc3RvbmV7CgkJCUlEOiAgICAgaSwKCQkJVGl0bGU6ICB0aXRsZSwKCQkJQW1vdW50OiBhbW91bnQsCgkJCVN0YXR1czogTXNQZW5kaW5nLAoJCX0pCgl9CglyZXR1cm4gcmVzdWx0Cn0KCmZ1bmMgdHJ1bmNBZGRyKGFkZHIgYWRkcmVzcykgc3RyaW5nIHsKCXMgOj0gYWRkci5TdHJpbmcoKQoJaWYgbGVuKHMpID4gMTMgewoJCXJldHVybiBzWzoxMF0gKyAiLi4uIgoJfQoJcmV0dXJuIHMKfQoKLy8gc2FuaXRpemVNaWxlc3RvbmVUaXRsZSBzdHJpcHMgbWFya2Rvd24gc3BlY2lhbCBjaGFyYWN0ZXJzIHRvIHByZXZlbnQgaW5qZWN0aW9uCi8vIGluIGdub3dlYiBSZW5kZXIgb3V0cHV0LgpmdW5jIHNhbml0aXplTWlsZXN0b25lVGl0bGUocyBzdHJpbmcpIHN0cmluZyB7Cgl2YXIgb3V0IHN0cmluZ3MuQnVpbGRlcgoJZm9yIF8sIGMgOj0gcmFuZ2UgcyB7CgkJc3dpdGNoIGMgewoJCWNhc2UgJ1snLCAnXScsICcoJywgJyknLCAnIycsICcqJywgJ2AnLCAnIScsICc8JywgJz4nLCAnfCcsICdcXCcsICdfJywgJ34nLCAnXG4nLCAnXHInLCAnXHQnOgoJCQljb250aW51ZSAvLyBzdHJpcCBtYXJrZG93bi1zZW5zaXRpdmUgY2hhcmFjdGVycyBhbmQgY29udHJvbCB3aGl0ZXNwYWNlCgkJZGVmYXVsdDoKCQkJb3V0LldyaXRlUnVuZShjKQoJCX0KCX0KCXJldHVybiBvdXQuU3RyaW5nKCkKfQoaiQQKCGZlZXMuZ25vEvwDcGFja2FnZSBlc2Nyb3dfdjMKCi8vIGJhc2lzUG9pbnRzRmVlIGNvbXB1dGVzIGZsb29yKGFtb3VudCpicHMvMTAwMDApIHdpdGhvdXQgb3ZlcmZsb3dpbmcgdGhlCi8vIGludGVybWVkaWF0ZSBwcm9kdWN0LiBGb3Igbm9ubmVnYXRpdmUgYW1vdW50IGFuZCBicHMgPD0gMTAwMDAsIHRoZSBxdW90aWVudAovLyBwcm9kdWN0IGFuZCBmaW5hbCBzdW0gYXJlIDw9IGFtb3VudDsgdGhlIHJlbWFpbmRlciBwcm9kdWN0IGlzIDwgMTAwMDAwMDAwLgovLyBDYWxsZXJzIHJldGFpbiB0aGVpciBleGlzdGluZyBjb25maWd1cmVkIHJhdGVzLCByZWNpcGllbnRzIGFuZCByb3VuZGluZy4KZnVuYyBiYXNpc1BvaW50c0ZlZShhbW91bnQsIGJwcyBpbnQ2NCkgaW50NjQgewoJaWYgYW1vdW50IDwgMCB8fCBicHMgPCAwIHx8IGJwcyA+IDEwMDAwIHsKCQlwYW5pYygiaW52YWxpZCBmZWUgaW5wdXRzIikKCX0KCXJldHVybiAoYW1vdW50LzEwMDAwKSpicHMgKyAoKGFtb3VudCUxMDAwMCkqYnBzKS8xMDAwMAp9ChqcDAoLZ2V0dGVycy5nbm8SjAxwYWNrYWdlIGVzY3Jvd192MwoKLy8g4pSA4pSAIE5GLTIgc29sdmVuY3kgZ2V0dGVycyAoTUFJTk5FVF9SRUFESU5FU1MubWQgwqczKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLy8KLy8gZXNjcm93X3YzIHBvb2xzIGZ1bmRzIGJldHdlZW4gRnVuZE1pbGVzdG9uZSBhbmQgcmVsZWFzZS9yZWZ1bmQsIG1ha2luZyBpdCBhCi8vIHBvb2xlZC1mdW5kIHJlYWxtLiBXaXRob3V0IGEgbWFjaGluZS1yZWFkYWJsZSBsaWFiaWxpdGllcyBmaWd1cmUgdGhlIHNvbHZlbmN5Ci8vIG1vbml0b3IgY2FuIG9ubHkgZG8gYSBiYWxhbmNlLW9ubHkgaGV1cmlzdGljLiBlc2Nyb3dfdjMgd2FzIHRoZSBMQVNUIHVucHVibGlzaGVkCi8vIHBvb2xlZC1mdW5kIHJlYWxtIHdpdGhvdXQgdGhpcyBwYWlyIOKAlCBjYW5kaWRhdHVyZV92MyBhbmQgYWdlbnRfcmVnaXN0cnlfdjIKLy8gYWxyZWFkeSBzaGlwcGVkIG9uIFRvcGF6IHdpdGhvdXQgaXQgYW5kIGNhbiBuZXZlciBnZXQgaXQgbm93LCBvbiBpbW11dGFibGUKLy8gcGFja2FnZSBwYXRocyAowqczYikuIEFkZGVkIGJlZm9yZSB0aGlzIHJlYWxtIHNoaXBzIHRvIGFueSBlbmZvcmNlIGNoYWluLgovLwovLyBJbnZhcmlhbnQgdGhlIG1vbml0b3IgcmVjb25jaWxlczogcmVhbG0gYmFsYW5jZSA+PSBUb3RhbExpYWJpbGl0aWVzKCkuCi8vIHRvdGFsTGlhYmxlIGlzIG1haW50YWluZWQgaW4gbG9ja3N0ZXAgd2l0aCBldmVyeSBmdW5kLW1vdmluZyBtdXRhdGlvbiBpbgovLyBlc2Nyb3cuZ25vOiArbXMuQW1vdW50IG9uIEZ1bmRNaWxlc3RvbmUsIC1tcy5BbW91bnQgYXQgZXZlcnkgcG9pbnQgZnVuZHMgbGVhdmUKLy8gKFJlbGVhc2VGdW5kczsgUmVzb2x2ZURpc3B1dGUgYm90aCBicmFuY2hlczsgQ2FuY2VsQ29udHJhY3QgYm90aCBicmFuY2hlczsKLy8gQ2xhaW1SZWZ1bmQ7IENsYWltRGlzcHV0ZVRpbWVvdXQgYm90aCBicmFuY2hlcykg4oCUIHNlZSBlc2Nyb3dfZmVlc3BpbmVfdGVzdC5nbm8KLy8gZm9yIHRoZSBsb2Nrc3RlcCBwaW4gYWNyb3NzIGV2ZXJ5IG9uZSBvZiB0aG9zZSBwYXRocy4KCmltcG9ydCAiY2hhaW4vcnVudGltZS91bnNhZmUiCgovLyBUb3RhbExpYWJpbGl0aWVzIHJldHVybnMgdGhlIHRvdGFsIHVnbm90IHRoZSByZWFsbSBvd2VzIGFjcm9zcyBhbGwgZnVuZGVkIGFuZAovLyBkaXNwdXRlZCBtaWxlc3RvbmVzIChmdW5kcyB0aGF0IGhhdmUgYXJyaXZlZCBidXQgbm90IHlldCBsZWZ0IHRoZSByZWFsbSkuCmZ1bmMgVG90YWxMaWFiaWxpdGllcygpIGludDY0IHsgcmV0dXJuIHRvdGFsTGlhYmxlIH0KCi8vIFJlYWxtQWRkcmVzcyBpcyB0aGUgTkYtMiBjYW5vbmljYWwgbmFtZSBmb3IgdGhlIHJlYWxtJ3Mgb3duIGFkZHJlc3MgKHRoZQovLyBzb2x2ZW5jeSBtb25pdG9yIHBhaXJzIGl0IHdpdGggVG90YWxMaWFiaWxpdGllcykuCmZ1bmMgUmVhbG1BZGRyZXNzKCkgc3RyaW5nIHsgcmV0dXJuIHVuc2FmZS5DdXJyZW50UmVhbG0oKS5BZGRyZXNzKCkuU3RyaW5nKCkgfQoaQwoLZ25vbW9kLnRvbWwSNG1vZHVsZSA9ICJnbm8ubGFuZC9yL3NhbWNyZXcvZXNjcm93X3YzIgpnbm8gPSAiMC45IgoazBIKFGdvdmVybmFuY2VfcmVhZHMuZ25vErMScGFja2FnZSBlc2Nyb3dfdjMKCmltcG9ydCAoCgkiY3J5cHRvL3NoYTI1NiIKCSJlbmNvZGluZy9oZXgiCgljZmcgImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9tYXJrZXRfY29uZmlnIgoJInN0cmNvbnYiCikKCi8vIFZhbHVlLW9ubHkgY29waWVzOiBubyBDb250cmFjdCBwb2ludGVyIG9yIHBlcnNpc3RlbnQgbWlsZXN0b25lIHNsaWNlIGVzY2FwZXMuCnR5cGUgR292ZXJuYW5jZU1pbGVzdG9uZSBzdHJ1Y3QgewoJSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludAoJQW1vdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0CglTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nCglGdW5kZWRBdCwgQ29tcGxldGVkQXQsIERpc3B1dGVkQXQgaW50NjQKCVByZURpc3B1dGVTdGF0dXMgICAgICAgICAgICAgICAgICBzdHJpbmcKfQp0eXBlIEdvdmVybmFuY2VDb250cmFjdCBzdHJ1Y3QgewoJRXhpc3RzICAgICAgICAgICAgICAgICAgYm9vbAoJSUQsIENvbnRlbnRIYXNoLCBTdGF0dXMgc3RyaW5nCglDbGllbnQsIEZyZWVsYW5jZXIgICAgICBhZGRyZXNzCglDb3VudCAgICAgICAgICAgICAgICAgICBpbnQKCU1pbGVzdG9uZXMgICAgICAgICAgICAgIFsyMF1Hb3Zlcm5hbmNlTWlsZXN0b25lCn0KCmZ1bmMgR2V0R292ZXJuYW5jZUNvbnRyYWN0KGlkIHN0cmluZykgR292ZXJuYW5jZUNvbnRyYWN0IHsKCXYsIG9rIDo9IGNvbnRyYWN0cy5HZXQoaWQpCglpZiAhb2sgewoJCXJldHVybiBHb3Zlcm5hbmNlQ29udHJhY3R7fQoJfQoJYyA6PSB2LigqQ29udHJhY3QpCglpZiBsZW4oYy5NaWxlc3RvbmVzKSA+IDIwIHsKCQlwYW5pYygiaW52YWxpZCBlc2Nyb3cgbWlsZXN0b25lIGNvdW50IikKCX0KCXMgOj0gR292ZXJuYW5jZUNvbnRyYWN0e0V4aXN0czogdHJ1ZSwgSUQ6IGMuSUQsIFN0YXR1czogc3RyaW5nKGMuU3RhdHVzKSwgQ2xpZW50OiBjLkNsaWVudCwgRnJlZWxhbmNlcjogYy5GcmVlbGFuY2VyLCBDb3VudDogbGVuKGMuTWlsZXN0b25lcyl9CgltZXRhZGF0YSA6PSAiZXNjcm93LW1ldGFkYXRhL3YxIiArIGVzY3Jvd01ldGFkYXRhRmllbGQoYy5JRCkgKyBlc2Nyb3dNZXRhZGF0YUZpZWxkKHN0cmluZyhjLkNsaWVudCkpICsgZXNjcm93TWV0YWRhdGFGaWVsZChzdHJpbmcoYy5GcmVlbGFuY2VyKSkgKyBlc2Nyb3dNZXRhZGF0YUZpZWxkKGMuVGl0bGUpICsgZXNjcm93TWV0YWRhdGFGaWVsZChjLkRlc2NyaXB0aW9uKSArIGVzY3Jvd01ldGFkYXRhRmllbGQoc3RyY29udi5Gb3JtYXRJbnQoYy5DcmVhdGVkQXQsIDEwKSkgKyBlc2Nyb3dNZXRhZGF0YUZpZWxkKHN0cmNvbnYuSXRvYShsZW4oYy5NaWxlc3RvbmVzKSkpCglmb3IgaSwgbSA6PSByYW5nZSBjLk1pbGVzdG9uZXMgewoJCXMuTWlsZXN0b25lc1tpXSA9IEdvdmVybmFuY2VNaWxlc3RvbmV7SUQ6IG0uSUQsIEFtb3VudDogbS5BbW91bnQsIFN0YXR1czogc3RyaW5nKG0uU3RhdHVzKSwgRnVuZGVkQXQ6IG0uRnVuZGVkQXQsIENvbXBsZXRlZEF0OiBtLkNvbXBsZXRlZEF0LCBEaXNwdXRlZEF0OiBtLkRpc3B1dGVkQXQsIFByZURpc3B1dGVTdGF0dXM6IHN0cmluZyhtLlByZURpc3B1dGVTdGF0dXMpfQoJCW1ldGFkYXRhICs9IGVzY3Jvd01ldGFkYXRhRmllbGQoc3RyY29udi5JdG9hKG0uSUQpKSArIGVzY3Jvd01ldGFkYXRhRmllbGQobS5UaXRsZSkgKyBlc2Nyb3dNZXRhZGF0YUZpZWxkKHN0cmNvbnYuRm9ybWF0SW50KG0uQW1vdW50LCAxMCkpCgl9CglkaWdlc3QgOj0gc2hhMjU2LlN1bTI1NihbXWJ5dGUobWV0YWRhdGEpKQoJcy5Db250ZW50SGFzaCA9IGhleC5FbmNvZGVUb1N0cmluZyhkaWdlc3RbOl0pCglyZXR1cm4gcwp9Cgp0eXBlIEdvdmVybmFuY2VGZWVUZXJtcyBzdHJ1Y3QgewoJUmF3QlBTLCBFZmZlY3RpdmVCUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0CglSYXdUcmVhc3VyeSwgRmFsbGJhY2tUcmVhc3VyeSwgRWZmZWN0aXZlVHJlYXN1cnkgYWRkcmVzcwp9CgpmdW5jIEdldEdvdmVybmFuY2VGZWVUZXJtcygpIEdvdmVybmFuY2VGZWVUZXJtcyB7CglicHMsIHRyZWFzdXJ5IDo9IHJlc29sdmVGZWUoKQoJcmV0dXJuIEdvdmVybmFuY2VGZWVUZXJtc3tSYXdCUFM6IGludDY0KGNmZy5HZXRGZWVCUFMobGFuZVNlcnZpY2UpKSwgRWZmZWN0aXZlQlBTOiBicHMsIFJhd1RyZWFzdXJ5OiBjZmcuR2V0VHJlYXN1cnkoKSwgRmFsbGJhY2tUcmVhc3VyeTogZmVlRmFsbGJhY2ssIEVmZmVjdGl2ZVRyZWFzdXJ5OiB0cmVhc3VyeX0KfQoKZnVuYyBlc2Nyb3dNZXRhZGF0YUZpZWxkKHZhbHVlIHN0cmluZykgc3RyaW5nIHsgcmV0dXJuIHN0cmNvbnYuSXRvYShsZW4odmFsdWUpKSArICI6IiArIHZhbHVlIH0KGvcCCg1wdWJsaXNoZXIuZ25vEuUCcGFja2FnZSBlc2Nyb3dfdjMKCmltcG9ydCAiY2hhaW4vcnVudGltZS91bnNhZmUiCgovLyBwdWJsaXNoZXJBdExvYWQgY2FwdHVyZXMgdGhlIEFkZFBhY2thZ2Ugc2lnbmVyIGR1cmluZyBwYWNrYWdlIGluaXRpYWxpemF0aW9uLgovLyBLZWVwaW5nIHRoZSB1bnNhZmUgbG9hZC10aW1lIHByaW1pdGl2ZSBzZXBhcmF0ZSBmcm9tIGNyb3NzaW5nIGVudHJ5cG9pbnRzIGxldHMKLy8gcHJpdmlsZWdlZCBjYWxscyB1c2Ugb25seSB0aGUgZnJhbWUtdmVyaWZpZWQgY3VyLklzQ3VycmVudC9jdXIuUHJldmlvdXMgQVBJLgpmdW5jIHB1Ymxpc2hlckF0TG9hZCgpIGFkZHJlc3MgeyByZXR1cm4gdW5zYWZlLk9yaWdpbkNhbGxlcigpIH0KIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsIgw4MDAwMDAwdWdub3QSEgiAqupVEgsxODAwMDB1Z25vdBqIAwrNAQoSL3RtLlB1YktleU11bHRpc2lnErYBCAISOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDXU7K848tqANWyscQogEgTFVEXmW3vBUKP59RlEEvX+0SOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDKOOJ3rhkJhDgSaVn8LeWBXf9fD3IHUtT4nWr6t2RpngSOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDIOV/XirsLZoGpqv9CvKHp1VH1UALFVlXp85ozdflgQASiwEKBQgDEgGgEkA0FWqrBfqsiZ7ML7HDetsPFb108KqK/etY2HU+xNNY0g5w6gXxFNfBPhmNQS3knz3U+fzU3DQOz2UGsDJCRhwOEkBSX6LMyhLHCj344/X+XxHwIkaP4nhrW0iCPiIMiybAj3FbtgM718iugOeXKPRN5C1enTQWFvL4PyMiFnBfQKRMGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl