Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
B576B8C2ED364BB393FEA112A66DA312110CC706B01F1E819B62FC336725D5B8
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
90,000,000
Requested gas limit
GAS USED
37,311,671
Gas consumed
FEE
900000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1w93f099t4pp9jamyghp88p60fvkg39dxz2qzrc15000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CpXXAQoML3ZtLm1fYWRkcGtnEoPXAQooZzF3OTNmMDk5dDRwcDlqYW15Z2hwODhwNjBmdmtnMzlkeHoycXpyYxLG1gEKBnN0YWJsZRJAZ25vLmxhbmQvci9nMXc5M2YwOTl0NHBwOWphbXlnaHA4OHA2MGZ2a2czOWR4ejJxenJjL2dlbXM1L3N0YWJsZRpnCgtnbm9tb2QudG9tbBJYbW9kdWxlID0gImduby5sYW5kL3IvZzF3OTNmMDk5dDRwcDlqYW15Z2hwODhwNjBmdmtnMzlkeHoycXpyYy9nZW1zNS9zdGFibGUiCmdubyA9ICIwLjkiChrr1AEKCnN0YWJsZS5nbm8S29QBLy8gUGFja2FnZSBzdGFibGUgaXMgdGhlIHBlcm1hbmVudCwgbmV2ZXItcmVkZXBsb3llZCBoYWxmIG9mIHRoZSBHZW1zCi8vIHNwbGl0LXJlYWxtIGRlc2lnbiAtLSB0aGUgZmlmdGggaXRlcmF0aW9uIG9mIHRoaXMgc3Bpa2UgKGdlbXMgLT4KLy8gZ2VtczIgLT4gZ2VtczMgLT4gZ2VtczQgLT4gZ2VtczUpLCBhZGRpbmcgdHdvIHRoaW5ncyBvbiB0b3Agb2YKLy8gZ2VtczQgKDIwMjYtMDktMTQpOgovLwovLyAgIC0gUm95YWx0eUluZm8gKEVJUC0yOTgxLXNoYXBlZDogUm95YWx0eUluZm8odGlkLCBzYWxlUHJpY2UpCi8vICAgICAoYWRkcmVzcywgYW1vdW50LCBlcnJvcikpIC0tIGEgcGxhaW4gYWR2aXNvcnkgZnVuY3Rpb24sIHNhbWUgYXMKLy8gICAgIGV2ZXJ5IHJveWFsdHkgc3RhbmRhcmQgb24gZXZlcnkgY2hhaW46IGl0IHRlbGxzIGEgQ09PUEVSQVRJTkcKLy8gICAgIG1hcmtldHBsYWNlIHdoYXQgdG8gcGF5IG9uIGEgc2Vjb25kYXJ5IHNhbGUsIGJ1dCBub3RoaW5nIGNhbgovLyAgICAgZm9yY2UgYSBUcmFuc2ZlckZyb20gdG8gY2FycnkgYSBwYXltZW50LiByb3lhbHR5UmVjaXBpZW50Ci8vICAgICBkZWZhdWx0cyB0byBjb2xsZWN0aW9uT3duZXIgYXMgYSBwbGFjZWhvbGRlciBhbmQgaXMgbWVhbnQgdG8gYmUKLy8gICAgIHBvaW50ZWQgYXQgYSBkZWRpY2F0ZWQgd2FsbGV0IHZpYSBTZXRSb3lhbHR5UmVjaXBpZW50IG9uY2Ugb25lCi8vICAgICBleGlzdHMsIHNwZWNpZmljYWxseSBzbyByb3lhbHR5IGluY29tZSBzdGF5cyB2aXNpYmx5IHNlcGFyYXRlCi8vICAgICBmcm9tIG1pbnQgcHJvY2VlZHMuCi8vICAgLSBCdXJuIG5vdyBzdHJpcHMgdGhlIGltYWdlIChJbWFnZS9JbWFnZURhdGEpIGJlZm9yZSBhcmNoaXZpbmcgYQovLyAgICAgYnVybmVkIHRva2VuJ3MgbWV0YWRhdGEuIFRoZSBpbWFnZSBpcyB0aGUgc2luZ2xlIGxhcmdlc3QgcGllY2UKLy8gICAgIG9mIGEgdG9rZW4ncyBzdG9yZWQgZGF0YSAoYSBtdWx0aS1LQiBiYXNlNjQgU1ZHKSAtLSBrZWVwaW5nIGEKLy8gICAgIGZ1bGwgY29weSBvZiBpdCBpbiBidXJuZWRSZWNvcmRzIHdvdWxkIHVuZG8gbW9zdCBvZiB0aGUKLy8gICAgIHN0b3JhZ2UtZGVwb3NpdCByZWZ1bmQgYnVybmluZyBpcyBzdXBwb3NlZCB0byBnaXZlIGJhY2suIE5hbWUvCi8vICAgICBkZXNjcmlwdGlvbi9hdHRyaWJ1dGVzL2V0Yy4gYXJlIGtlcHQgc28gdGhlIGJ1cm5lZC10b2tlbnMgcGFnZQovLyAgICAgc3RpbGwgc2hvd3Mgd2hhdCBhIHBpZWNlIFdBUywganVzdCBub3QgaXRzIHBpY3R1cmUuCi8vCi8vIEV2ZXJ5dGhpbmcgZWxzZSAob3duZXJzaGlwLCB0cmFuc2ZlcnMsIC4uL2NhbXBhaWduLWJhc2VkIGRpc2NvdW50Ci8vIHByaWNpbmcsIHRyYWl0LXVuaXF1ZW5lc3MgaGlzdG9yeSwgZ25vd2ViIFJlbmRlcikgaXMgdW5jaGFuZ2VkIGZyb20KLy8gZ2VtczQgLS0gc2VlIHRoYXQgcGFja2FnZSdzIG93biBoaXN0b3J5IGZvciB0aGUgZWFybGllciBkZXNpZ24KLy8gbm90ZXMuCnBhY2thZ2Ugc3RhYmxlCgppbXBvcnQgKAoJcnVudGltZSAiY2hhaW4vcnVudGltZSIKCXVuc2FmZXJlYWxtICJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJlbmNvZGluZy9iYXNlNjQiCgkic3RyY29udiIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL2cxZ242dDBxOXdlbndoZGRhNDdya3JwZmQ2M2tjeGp2eXA3ZXF3a3UvYXZsIgoJZ3JjNzIxICJnbm8ubGFuZC9wL2cxZ242dDBxOXdlbndoZGRhNDdya3JwZmQ2M2tjeGp2eXA3ZXF3a3UvZ3JjNzIxdjIiCgljYW1wYWlnbiAiZ25vLmxhbmQvci9nMXc5M2YwOTl0NHBwOWphbXlnaHA4OHA2MGZ2a2czOWR4ejJxenJjL2dlbXM1L2NhbXBhaWduIgoJImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKY29uc3QgKAoJQ29sbGVjdGlvbk5hbWUgICA9ICJHZW1zIgoJQ29sbGVjdGlvblN5bWJvbCA9ICJHRU1TIgoKCS8vIHJlYWxtUmVsUGF0aCBpcyB0aGlzIHJlYWxtJ3Mgb3duIGdub3dlYi1yZWxhdGl2ZSBwYXRoLCBiYWtlZCBpbgoJLy8gYXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQgLS0gc2VlIHRoZSBvcmlnaW5hbCBzaW5nbGUtcmVhbG0KCS8vIGRlc2lnbidzIG93biBjb21tZW50IG9uIHdoeSAoY2hhaW4vcnVudGltZS91bnNhZmUuQ3VycmVudFJlYWxtKCkKCS8vIHJlc29sdmVzIGRpZmZlcmVudGx5IHdoZW4gY2FsbGVkIG5lc3RlZCBpbnNpZGUgUmVuZGVyIHRoYW4gd2hlbgoJLy8gY2FsbGVkIGRpcmVjdGx5KS4gTXVzdCBiZSB1cGRhdGVkIGJ5IGhhbmQgaWYgdGhpcyByZWFsbSBpcyBldmVyCgkvLyByZWRlcGxveWVkIHRvIGEgbmV3IHBhdGguCglyZWFsbVJlbFBhdGggPSAiL3IvZzF3OTNmMDk5dDRwcDlqYW15Z2hwODhwNjBmdmtnMzlkeHoycXpyYy9nZW1zNS9zdGFibGUiCgoJaG9tZVJlbmRlckxpbWl0ICAgID0gMTAKCXBhZ2VXaW5kb3cgICAgICAgICA9IDIKCXRva2VuUGFnZUltYWdlU2l6ZSA9ICI0MjAiCikKCnZhciAoCgluZnQgKmdyYzcyMS5NZXRhZGF0YU5GVAoKCS8vIGNvbGxlY3Rpb25Pd25lciBpcyB0aGUgb25seSBhZGRyZXNzIGFsbG93ZWQgdG8gY2hhbmdlIHByaWNpbmcsCgkvLyB0aGUgd2hpdGVsaXN0LCByb3lhbHR5IHNldHRpbmdzLCBvciB3aGljaCB2ZXJzaW9uIHJlYWxtIGlzCgkvLyBhcHByb3ZlZC4KCWNvbGxlY3Rpb25Pd25lciBhZGRyZXNzID0gImcxdzkzZjA5OXQ0cHA5amFteWdocDg4cDYwZnZrZzM5ZHh6MnF6cmMiCgoJLy8gYXBwcm92ZWRWZXJzaW9uIGlzIHRoZSBmdWxsIHBrZ3BhdGggb2YgdGhlIE9ORSByZWFsbSBjdXJyZW50bHkKCS8vIGFsbG93ZWQgdG8gY2FsbCBSZWNvcmRNaW50LgoJYXBwcm92ZWRWZXJzaW9uIHN0cmluZwoKCW1pbnRQcmljZVVnbm90IGludDY0ID0gMV8wMDBfMDAwCgoJLy8gd2hpdGVsaXN0QnBzOiBQRVJNQU5FTlQgcGVyLXdhbGxldCBwcmljZSBvdmVycmlkZXMsIGZvciBhCgkvLyBoYW5kZnVsIG9mIG9uZS1vZmYgZ3JhbnRzICh0ZWFtLCBwYXJ0bmVycykgdGhhdCBzaG91bGQgbmV2ZXIKCS8vIGV4cGlyZSBvciBnZXQgc3dlcHQgLS0gdW5saWtlIC4uL2NhbXBhaWduLCB3aGljaCBpcyBtZWFudCB0byBiZQoJLy8gcHJ1bmVkLiBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgY2FtcGFpZ24gd2hlbiBhIHdhbGxldCBoYXMgYm90aAoJLy8gKHNlZSBFZmZlY3RpdmVQcmljZS9SZWNvcmRNaW50KS4KCXdoaXRlbGlzdEJwcyBhdmwuVHJlZQoKCS8vIHJveWFsdHlCcHMvcm95YWx0eVJlY2lwaWVudCBiYWNrIFJveWFsdHlJbmZvIC0tIHNlZSB0aGlzIGZpbGUncwoJLy8gb3duIGRvYyBjb21tZW50LiA1MDAgPSA1JSwgcGVyIHJlcXVlc3QgKDIwMjYtMDktMTQpLgoJcm95YWx0eUJwcyAgICAgICAgaW50NjQgPSA1MDAKCXJveWFsdHlSZWNpcGllbnQgIGFkZHJlc3MgPSAiZzF3OTNmMDk5dDRwcDlqYW15Z2hwODhwNjBmdmtnMzlkeHoycXpyYyIKCgkvLyBtaW50ZWRJRHMgaXMgYW4gYXBwZW5kLW9ubHkgcmVjb3JkIG9mIGV2ZXJ5IHRva2VuIG1pbnRlZCBoZXJlLCBpbgoJLy8gbWludCBvcmRlci4KCW1pbnRlZElEcyBbXWdyYzcyMS5Ub2tlbklECgoJLy8gbWludGVkVHJhaXRDb21ib3MgaXMgdGhlIFBFUk1BTkVOVCAod2VsbCAtLSBzZWUgQnVybikgcmVjb3JkIG9mCgkvLyB3aGljaCBleGFjdCB0cmFpdCBjb21iaW5hdGlvbnMgaGF2ZSBiZWVuIG1pbnRlZCwgbW92ZWQgaGVyZSBmcm9tCgkvLyB0aGUgdmVyc2lvbiByZWFsbSBzbyB1bmlxdWVuZXNzIGhpc3Rvcnkgc3Vydml2ZXMgYW55IGZ1dHVyZQoJLy8gdmVyc2lvbiByZWRlcGxveS4gUmVzZXJ2ZWQgYnkgUmVjb3JkTWludCwgcmVsZWFzZWQgYnkgQnVybi4KCW1pbnRlZFRyYWl0Q29tYm9zIGF2bC5UcmVlIC8vIGNvbWJvIGtleSAtPiB0cnVlCgoJLy8gdG9rZW5Db21ib0tleXMgcmVtZW1iZXJzIHdoaWNoIGNvbWJvS2V5IFJlY29yZE1pbnQgcmVzZXJ2ZWQgZm9yCgkvLyBlYWNoIHRva2VuLCBzbyBCdXJuIGNhbiByZWxlYXNlIHRoZSBFWEFDVCBzYW1lIGtleSAtLSBjb21ib0tleSBpcwoJLy8gYW4gb3BhcXVlIHN0cmluZyBidWlsdCBieSB3aGljaGV2ZXIgdmVyc2lvbiByZWFsbSBtaW50ZWQgdGhlCgkvLyB0b2tlbiAoZnJvbSBpdHMgb3duIHJhdyB0cmFpdCBpbmRpY2VzLCBub3QgYW55dGhpbmcgc3RhYmxlIGNhbgoJLy8gcmVjb25zdHJ1Y3QgZnJvbSBkaXNwbGF5IG1ldGFkYXRhKSwgc28gaXQgaGFzIHRvIGJlIHN0b3JlZAoJLy8gdmVyYmF0aW0gcmF0aGVyIHRoYW4gcmVjb21wdXRlZC4KCXRva2VuQ29tYm9LZXlzIGF2bC5UcmVlIC8vIHRpZC5TdHJpbmcoKSAtPiBjb21ib0tleSBzdHJpbmcKCgkvLyBtaW50Q291bnRCeVdhbGxldCB0cmFja3MgbWludHMgcGVyIHJlY2lwaWVudCwgbW92ZWQgaGVyZSBmb3IgdGhlCgkvLyBzYW1lIHJlYXNvbiAtLSBhIHZlcnNpb24gc3dhcCBtdXN0IG5vdCByZXNldCBhbnlvbmUncyBjYXAgdXNhZ2UuCgltaW50Q291bnRCeVdhbGxldCBhdmwuVHJlZSAvLyBhZGRyZXNzLlN0cmluZygpIC0+IGludDY0CgoJLy8gbWludGluZ09wZW5NaXJyb3IvbWF4TWludHNQZXJXYWxsZXRNaXJyb3IgYXJlIERJU1BMQVktT05MWSBjb3BpZXMKCS8vIG9mIHNldHRpbmdzIHRoZSBhcHByb3ZlZCB2ZXJzaW9uIHJlYWxtIGFjdHVhbGx5IGVuZm9yY2VzIC0tIGdubwoJLy8gZG9lc24ndCBhbGxvdyBjaXJjdWxhciBpbXBvcnRzLCBzbyBzdGFibGUgKHdoaWNoIHYxIGltcG9ydHMpCgkvLyBjYW5ub3QgaW1wb3J0IHYxIGJhY2sgdG8gcmVhZCBpdHMgbGl2ZSBtaW50aW5nT3Blbi8KCS8vIG1heE1pbnRzUGVyV2FsbGV0IGRpcmVjdGx5LiBUaGUgdmVyc2lvbiByZWFsbSBjYWxscwoJLy8gUmVwb3J0TWludGluZ09wZW4vUmVwb3J0TWF4TWludHNQZXJXYWxsZXQgKHZlcnNpb24tZ2F0ZWQsIHNhbWUKCS8vIHBhdHRlcm4gYXMgUmVjb3JkTWludCkgd2hlbmV2ZXIgaXQgY2hhbmdlcyB0aGVtLCBwdXJlbHkgc28KCS8vIFJlbmRlcigpIGhlcmUgY2FuIHNob3cgYWNjdXJhdGUgdmFsdWVzIHdpdGhvdXQgYSBjaXJjdWxhcgoJLy8gZGVwZW5kZW5jeS4KCW1pbnRpbmdPcGVuTWlycm9yICAgICAgID0gdHJ1ZQoJbWF4TWludHNQZXJXYWxsZXRNaXJyb3IgaW50NjQgPSAzCgoJLy8gYnVybmVkUmVjb3Jkcy9idXJuZWRJRHMgYXJlIGEgcGVybWFuZW50IHJlY29yZCBvZiBldmVyeSB0b2tlbgoJLy8gdGhpcyByZWFsbSBoYXMgZXZlciBidXJuZWQgLS0gaW1hZ2Utc3RyaXBwZWQsIHNlZSBCdXJuJ3Mgb3duCgkvLyBkb2MgY29tbWVudC4KCWJ1cm5lZFJlY29yZHMgYXZsLlRyZWUgLy8gdGlkLlN0cmluZygpIC0+IGJ1cm5SZWNvcmQKCWJ1cm5lZElEcyAgICAgW11ncmM3MjEuVG9rZW5JRAopCgovLyB0cmFpdFByZXNldCBtaXJyb3JzIHRoZSB2ZXJzaW9uIHJlYWxtJ3Mgb3duIHRyYWl0UHJlc2V0IGZpZWxkLWZvci0KLy8gZmllbGQgLS0gbmVlZGVkIGhlcmUgb25seSB0byByZWNvbnN0cnVjdCBhIGJ1cm5lZCB0b2tlbidzIGRpc3BsYXkKLy8gbWV0YWRhdGEgb24gZGVtYW5kLCB0aGUgc2FtZSB0cmljayB0aGUgb3JpZ2luYWwgc2luZ2xlLXJlYWxtIGRlc2lnbgovLyB1c2VkIHRvIGF2b2lkIHN0b3JpbmcgYSBzZWNvbmQgY29weSBvZiB0aGUgcmVuZGVyZWQgaW1hZ2UuCnR5cGUgdHJhaXRQcmVzZXQgc3RydWN0IHsKCUNoYWluICAgIHN0cmluZwoJU2hhcGVJZHggaW50CglDb2xvcklkeCBpbnQKCU1ldGFsICAgIHN0cmluZwoJQWN0aXZlICAgYm9vbAp9CgovLyBidXJuUmVjb3JkIGlzIGEgcGVybWFuZW50IHNuYXBzaG90IG9mIG9uZSBidXJuZWQgdG9rZW4uIE1ldGFkYXRhCi8vIGhlcmUgYWx3YXlzIGhhcyBJbWFnZS9JbWFnZURhdGEgc3RyaXBwZWQgLS0gc2VlIEJ1cm4ncyBvd24gZG9jCi8vIGNvbW1lbnQuCnR5cGUgYnVyblJlY29yZCBzdHJ1Y3QgewoJQnVybmVkQnkgICBhZGRyZXNzCglCdXJuSGVpZ2h0IGludDY0CglNZXRhZGF0YSAgIGdyYzcyMS5NZXRhZGF0YQp9CgpmdW5jIGluaXQoY3VyIHJlYWxtKSB7CgluZnQgPSBncmM3MjEuTmV3TkZUV2l0aE1ldGFkYXRhKDAsIGN1ciwgQ29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25TeW1ib2wpCn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGFuZGFyZCByZWFkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmZ1bmMgTmFtZSgpIHN0cmluZyAgICAgIHsgcmV0dXJuIENvbGxlY3Rpb25OYW1lIH0KZnVuYyBTeW1ib2woKSBzdHJpbmcgICAgeyByZXR1cm4gQ29sbGVjdGlvblN5bWJvbCB9CmZ1bmMgVG9rZW5Db3VudCgpIGludDY0IHsgcmV0dXJuIG5mdC5Ub2tlbkNvdW50KCkgfQoKZnVuYyBPd25lck9mKHRpZCBncmM3MjEuVG9rZW5JRCkgKGFkZHJlc3MsIGVycm9yKSAgICAgICAgICAgICAgICB7IHJldHVybiBuZnQuT3duZXJPZih0aWQpIH0KZnVuYyBCYWxhbmNlT2Yob3duZXIgYWRkcmVzcykgKGludDY0LCBlcnJvcikgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBuZnQuQmFsYW5jZU9mKG93bmVyKSB9CmZ1bmMgVG9rZW5NZXRhZGF0YSh0aWQgZ3JjNzIxLlRva2VuSUQpIChncmM3MjEuTWV0YWRhdGEsIGVycm9yKSAgIHsgcmV0dXJuIG5mdC5Ub2tlbk1ldGFkYXRhKHRpZCkgfQpmdW5jIFRva2VuVVJJKHRpZCBncmM3MjEuVG9rZW5JRCkgKHN0cmluZywgZXJyb3IpICAgICAgICAgICAgICAgICB7IHJldHVybiBuZnQuVG9rZW5VUkkodGlkKSB9CmZ1bmMgR2V0QXBwcm92ZWQodGlkIGdyYzcyMS5Ub2tlbklEKSAoYWRkcmVzcywgZXJyb3IpICAgICAgICAgICAgIHsgcmV0dXJuIG5mdC5HZXRBcHByb3ZlZCh0aWQpIH0KZnVuYyBJc0FwcHJvdmVkRm9yQWxsKG93bmVyLCBvcGVyYXRvciBhZGRyZXNzKSBib29sICAgICAgICAgICAgICAgeyByZXR1cm4gbmZ0LklzQXBwcm92ZWRGb3JBbGwob3duZXIsIG9wZXJhdG9yKSB9CgpmdW5jIEFwcHJvdmVkVmVyc2lvbigpIHN0cmluZyB7IHJldHVybiBhcHByb3ZlZFZlcnNpb24gfQpmdW5jIE93bmVyKCkgYWRkcmVzcyAgICAgICAgICB7IHJldHVybiBjb2xsZWN0aW9uT3duZXIgfQpmdW5jIE1pbnRQcmljZSgpIGludDY0ICAgICAgICB7IHJldHVybiBtaW50UHJpY2VVZ25vdCB9CgpmdW5jIE1pbnRlZElEcygpIFtdZ3JjNzIxLlRva2VuSUQgeyByZXR1cm4gbWludGVkSURzIH0KZnVuYyBUb3RhbEJ1cm5lZCgpIGludDY0ICAgICAgICAgIHsgcmV0dXJuIGludDY0KGxlbihidXJuZWRJRHMpKSB9CgpmdW5jIE1pbnRpbmdPcGVuKCkgYm9vbCAgICAgICAgeyByZXR1cm4gbWludGluZ09wZW5NaXJyb3IgfQpmdW5jIE1heE1pbnRzUGVyV2FsbGV0KCkgaW50NjQgeyByZXR1cm4gbWF4TWludHNQZXJXYWxsZXRNaXJyb3IgfQoKZnVuYyBNaW50c0J5V2FsbGV0KG93bmVyIGFkZHJlc3MpIGludDY0IHsKCW4sIF8gOj0gbWludENvdW50QnlXYWxsZXQuR2V0KG93bmVyLlN0cmluZygpKS4oaW50NjQpCglyZXR1cm4gbgp9CgpmdW5jIElzVHJhaXRDb21ib0F2YWlsYWJsZShjb21ib0tleSBzdHJpbmcpIGJvb2wgewoJcmV0dXJuICFtaW50ZWRUcmFpdENvbWJvcy5IYXMoY29tYm9LZXkpCn0KCi8vIFdoaXRlbGlzdEJwcyByZXBvcnRzIHdhbGxldCdzIFBFUk1BTkVOVCBpbmRpdmlkdWFsIHByaWNlIG92ZXJyaWRlIGluCi8vIGJhc2lzIHBvaW50cywgYW5kIHdoZXRoZXIgaXQgaGFzIG9uZSAob2sgPT0gZmFsc2UgbWVhbnM6IGNoZWNrCi8vIC4uL2NhbXBhaWduLCBvciBwYXkgc3RhbmRhcmQgcHJpY2UpLgpmdW5jIFdoaXRlbGlzdEJwcyh3YWxsZXQgYWRkcmVzcykgKGJwcyBpbnQ2NCwgb2sgYm9vbCkgewoJaWYgIXdoaXRlbGlzdEJwcy5IYXMod2FsbGV0LlN0cmluZygpKSB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglyZXR1cm4gd2hpdGVsaXN0QnBzLkdldCh3YWxsZXQuU3RyaW5nKCkpLihpbnQ2NCksIHRydWUKfQoKZnVuYyBXaGl0ZWxpc3RDb3VudCgpIGludDY0IHsgcmV0dXJuIGludDY0KHdoaXRlbGlzdEJwcy5TaXplKCkpIH0KCmZ1bmMgV2hpdGVsaXN0RW50cnkoaW5kZXggaW50KSAod2FsbGV0IHN0cmluZywgYnBzIGludDY0KSB7Cgl3LCB2IDo9IHdoaXRlbGlzdEJwcy5HZXRCeUluZGV4KGluZGV4KQoJcmV0dXJuIHcsIHYuKGludDY0KQp9CgovLyBFZmZlY3RpdmVQcmljZSByZXR1cm5zIHdoYXQgY2FsbGVyIGFjdHVhbGx5IG93ZXMgZm9yIGEgbWludCByaWdodAovLyBub3cuIENoZWNrcywgaW4gb3JkZXI6ICgxKSB0aGUgcGVybWFuZW50IGluZGl2aWR1YWwgd2hpdGVsaXN0QnBzCi8vIG92ZXJyaWRlLCAoMikgYW4gYWN0aXZlIC4uL2NhbXBhaWduIGRpc2NvdW50LCAoMykgdGhlIHN0YW5kYXJkCi8vIG1pbnRQcmljZVVnbm90LiBBIHBsYWluIGNyb3NzLXJlYWxtIFJFQUQgaW50byBjYW1wYWlnbiAtLSBubyBjdXIKLy8gbmVlZGVkLCBhbmQgY2FtcGFpZ24uUGVlayBkb2Vzbid0IGNvbnN1bWUgYW55dGhpbmcsIHNvIGNhbGxpbmcgdGhpcwovLyByZXBlYXRlZGx5IChlLmcuIHRvIHNob3cgYSBsaXZlIHByaWNlIGluIGEgVUkpIGlzIGZyZWUgb2Ygc2lkZQovLyBlZmZlY3RzLgpmdW5jIEVmZmVjdGl2ZVByaWNlKGNhbGxlciBhZGRyZXNzKSBpbnQ2NCB7CglpZiB2LCBvayA6PSB3aGl0ZWxpc3RCcHMuR2V0KGNhbGxlci5TdHJpbmcoKSkuKGludDY0KTsgb2sgewoJCXJldHVybiBtaW50UHJpY2VVZ25vdCAqIHYgLyAxMDAwMAoJfQoJaWYgYnBzLCBfLCBvayA6PSBjYW1wYWlnbi5QZWVrKGNhbGxlcik7IG9rIHsKCQlyZXR1cm4gbWludFByaWNlVWdub3QgKiBicHMgLyAxMDAwMAoJfQoJcmV0dXJuIG1pbnRQcmljZVVnbm90Cn0KCi8vIFJveWFsdHlJbmZvIHJlcG9ydHMgd2hhdCBhIG1hcmtldHBsYWNlIFNIT1VMRCBwYXkgb24gYSBzZWNvbmRhcnkKLy8gc2FsZSBvZiB0aWQgYXQgc2FsZVByaWNlIC0tIEVJUC0yOTgxIHNoYXBlZCAoc2FtZSBzaWduYXR1cmUgZ25vLmxhbmQncwovLyBvd24gb2ZmaWNpYWwgZ3JjNzIxL3JveWFsdHkgZXh0ZW5zaW9uIHVzZXMpLCBzbyBhbnkgbWFya2V0cGxhY2UKLy8gYnVpbHQgdG8gdGhhdCBjb252ZW50aW9uIHJlY29nbml6ZXMgaXQuIFB1cmVseSBhZHZpc29yeTogbm90aGluZyBpbgovLyBHUkM3MjEsIEVJUC0yOTgxLCBvciBhbnkgb3RoZXIgTkZUIHN0YW5kYXJkIGNhbiBmb3JjZSBhIHRyYW5zZmVyIHRvCi8vIGNhcnJ5IGEgcGF5bWVudCAtLSB0aGlzIG9ubHkgdGVsbHMgYSBDT09QRVJBVElORyBtYXJrZXRwbGFjZSB3aGF0IHRvCi8vIHNlbmQgYW5kIHRvIHdob20uIEVycm9ycyBpZiB0aWQgZG9lc24ndCBleGlzdC4KZnVuYyBSb3lhbHR5SW5mbyh0aWQgZ3JjNzIxLlRva2VuSUQsIHNhbGVQcmljZSBpbnQ2NCkgKGFkZHJlc3MsIGludDY0LCBlcnJvcikgewoJaWYgXywgZXJyIDo9IG5mdC5Pd25lck9mKHRpZCk7IGVyciAhPSBuaWwgewoJCXJldHVybiAiIiwgMCwgZXJyCgl9CglyZXR1cm4gcm95YWx0eVJlY2lwaWVudCwgc2FsZVByaWNlICogcm95YWx0eUJwcyAvIDEwMDAwLCBuaWwKfQoKZnVuYyBSb3lhbHR5QnBzKCkgaW50NjQgICAgICAgICAgeyByZXR1cm4gcm95YWx0eUJwcyB9CmZ1bmMgUm95YWx0eVJlY2lwaWVudCgpIGFkZHJlc3MgIHsgcmV0dXJuIHJveWFsdHlSZWNpcGllbnQgfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gb3duZXItZ2F0ZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmZ1bmMgY2FsbGVyQWRkcmVzcygpIGFkZHJlc3MgewoJcmV0dXJuIHVuc2FmZXJlYWxtLlByZXZpb3VzUmVhbG0oKS5BZGRyZXNzKCkKfQoKZnVuYyBhc3NlcnRPd25lcigpIHsKCWlmIGNhbGxlckFkZHJlc3MoKSAhPSBjb2xsZWN0aW9uT3duZXIgewoJCXBhbmljKCJ1bmF1dGhvcml6ZWQ6IGNhbGxlciBpcyBub3QgdGhlIGNvbGxlY3Rpb24gb3duZXIiKQoJfQp9CgpmdW5jIFNldEFwcHJvdmVkVmVyc2lvbihjdXIgcmVhbG0sIHBrZ3BhdGggc3RyaW5nKSB7Cglhc3NlcnRPd25lcigpCglhcHByb3ZlZFZlcnNpb24gPSBwa2dwYXRoCn0KCmZ1bmMgU2V0TWludFByaWNlKGN1ciByZWFsbSwgdWdub3QgaW50NjQpIHsKCWFzc2VydE93bmVyKCkKCWlmIHVnbm90IDwgMCB7CgkJcGFuaWMoInByaWNlIGNhbm5vdCBiZSBuZWdhdGl2ZSIpCgl9CgltaW50UHJpY2VVZ25vdCA9IHVnbm90Cn0KCmZ1bmMgQWRkVG9XaGl0ZWxpc3QoY3VyIHJlYWxtLCB3YWxsZXQgYWRkcmVzcywgYnBzIGludDY0KSB7Cglhc3NlcnRPd25lcigpCglpZiBicHMgPCAwIHx8IGJwcyA+IDEwMDAwIHsKCQlwYW5pYygiYnBzIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAwMCIpCgl9Cgl3aGl0ZWxpc3RCcHMuU2V0KHdhbGxldC5TdHJpbmcoKSwgYnBzKQp9CgpmdW5jIEFkZFRvV2hpdGVsaXN0QmF0Y2goY3VyIHJlYWxtLCB3YWxsZXRzQ1NWIHN0cmluZywgYnBzIGludDY0KSB7Cglhc3NlcnRPd25lcigpCglpZiBicHMgPCAwIHx8IGJwcyA+IDEwMDAwIHsKCQlwYW5pYygiYnBzIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAwMCIpCgl9Cglmb3IgXywgdyA6PSByYW5nZSBzdHJpbmdzLlNwbGl0KHdhbGxldHNDU1YsICIsIikgewoJCXcgPSBzdHJpbmdzLlRyaW1TcGFjZSh3KQoJCWlmIHcgPT0gIiIgewoJCQljb250aW51ZQoJCX0KCQl3aGl0ZWxpc3RCcHMuU2V0KHcsIGJwcykKCX0KfQoKZnVuYyBSZW1vdmVGcm9tV2hpdGVsaXN0KGN1ciByZWFsbSwgd2FsbGV0IGFkZHJlc3MpIHsKCWFzc2VydE93bmVyKCkKCXdoaXRlbGlzdEJwcy5SZW1vdmUod2FsbGV0LlN0cmluZygpKQp9CgovLyBTZXRSb3lhbHR5QnBzIGNoYW5nZXMgdGhlIGZsYXQgc2Vjb25kYXJ5LXNhbGUgcm95YWx0eSByYXRlIChiYXNpcwovLyBwb2ludHMsIDAtMTAwMDApLgpmdW5jIFNldFJveWFsdHlCcHMoY3VyIHJlYWxtLCBicHMgaW50NjQpIHsKCWFzc2VydE93bmVyKCkKCWlmIGJwcyA8IDAgfHwgYnBzID4gMTAwMDAgewoJCXBhbmljKCJicHMgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMDAwIikKCX0KCXJveWFsdHlCcHMgPSBicHMKfQoKLy8gU2V0Um95YWx0eVJlY2lwaWVudCBwb2ludHMgcm95YWx0eSBwYXlvdXRzIGF0IGEgbmV3IGFkZHJlc3MgLS0gbWVhbnQKLy8gdG8gYmUgY2FsbGVkIG9uY2Ugd2l0aCBhIGRlZGljYXRlZCByb3lhbHR5IHdhbGxldCAoa2VwdCBzZXBhcmF0ZQovLyBmcm9tIG1pbnQgcHJvY2VlZHMgc28gaXRzIGJhbGFuY2UgaXMgbGVnaWJsZSBvbiBpdHMgb3duKSwgcmVwbGFjaW5nCi8vIHRoZSBjb2xsZWN0aW9uT3duZXIgcGxhY2Vob2xkZXIgZGVmYXVsdC4KZnVuYyBTZXRSb3lhbHR5UmVjaXBpZW50KGN1ciByZWFsbSwgcmVjaXBpZW50IGFkZHJlc3MpIHsKCWFzc2VydE93bmVyKCkKCXJveWFsdHlSZWNpcGllbnQgPSByZWNpcGllbnQKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB2ZXJzaW9uLWdhdGVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpmdW5jIGFzc2VydENhbGxlcklzQXBwcm92ZWRWZXJzaW9uKGN1ciByZWFsbSkgewoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLlBrZ1BhdGgoKQoJaWYgYXBwcm92ZWRWZXJzaW9uID09ICIiIHsKCQlwYW5pYygibm8gdmVyc2lvbiByZWFsbSBoYXMgYmVlbiBhcHByb3ZlZCB5ZXQiKQoJfQoJaWYgY2FsbGVyICE9IGFwcHJvdmVkVmVyc2lvbiB7CgkJcGFuaWMoInVuYXV0aG9yaXplZDogY2FsbGVyIGlzIG5vdCB0aGUgYXBwcm92ZWQgdmVyc2lvbiByZWFsbSIpCgl9Cn0KCi8vIFJlY29yZE1pbnQgaXMgdGhlIE9OTFkgd2F5IGEgdG9rZW4gZ2V0cyBtaW50ZWQuIE9ubHkgdGhlIGFwcHJvdmVkCi8vIHZlcnNpb24gcmVhbG0gbWF5IGNhbGwgaXQuIFJlc2VydmVzIGNvbWJvS2V5IGF0b21pY2FsbHkgd2l0aCB0aGUKLy8gbWludCAocGFuaWNzIGlmIGFscmVhZHkgdGFrZW4gLS0gdGhlIHZlcnNpb24gcmVhbG0gc2hvdWxkIGhhdmUKLy8gcHJlLWNoZWNrZWQgdmlhIElzVHJhaXRDb21ib0F2YWlsYWJsZSwgYnV0IHRoaXMgaXMgdGhlIHJlYWwsCi8vIGF1dGhvcml0YXRpdmUgY2hlY2spLCBpbmNyZW1lbnRzIHRoZSByZWNpcGllbnQncyBtaW50IGNvdW50LCBhbmQgLS0KLy8gaWYgcGF5ZXIgKHRoZSB3YWxsZXQgdGhhdCBhY3R1YWxseSBzaWduZWQgYW5kIHBhaWQgZm9yIHRoaXMgbWludCwKLy8gd2hpY2ggbWF5IGRpZmZlciBmcm9tIHRvKSBkb2Vzbid0IGhhdmUgYSBwZXJtYW5lbnQgd2hpdGVsaXN0QnBzCi8vIG92ZXJyaWRlIC0tIHNwZW5kcyBvbmUgdXNlIG9mIHRoZWlyIGNhbXBhaWduIGRpc2NvdW50LCBpZiB0aGV5IGhhdmUKLy8gb25lLiBjYW1wYWlnbi5Db25zdW1lRGlzY291bnQgc2FmZWx5IG5vLW9wcyAob2s9ZmFsc2UpIHdoZW4gcGF5ZXIKLy8gaGFzIG5vIGFjdGl2ZSBjYW1wYWlnbiBlbnRyeSwgc28gdGhpcyBpcyBzYWZlIHRvIGNhbGwgdW5jb25kaXRpb25hbGx5LgpmdW5jIFJlY29yZE1pbnQoY3VyIHJlYWxtLCB0byBhZGRyZXNzLCBwYXllciBhZGRyZXNzLCB0aWQgZ3JjNzIxLlRva2VuSUQsIG1ldGFkYXRhIGdyYzcyMS5NZXRhZGF0YSwgY29tYm9LZXkgc3RyaW5nKSBncmM3MjEuVG9rZW5JRCB7Cglhc3NlcnRDYWxsZXJJc0FwcHJvdmVkVmVyc2lvbihjdXIpCglpZiBtaW50ZWRUcmFpdENvbWJvcy5IYXMoY29tYm9LZXkpIHsKCQlwYW5pYygidHJhaXQgY29tYmluYXRpb24gYWxyZWFkeSBtaW50ZWQiKQoJfQoJY2hlY2tFcnIobmZ0Lk1pbnQodG8sIHRpZCkpCgljaGVja0VycihuZnQuU2V0VG9rZW5NZXRhZGF0YSh0bywgdGlkLCBtZXRhZGF0YSkpCgltaW50ZWRUcmFpdENvbWJvcy5TZXQoY29tYm9LZXksIHRydWUpCgl0b2tlbkNvbWJvS2V5cy5TZXQodGlkLlN0cmluZygpLCBjb21ib0tleSkKCW1pbnRDb3VudEJ5V2FsbGV0LlNldCh0by5TdHJpbmcoKSwgTWludHNCeVdhbGxldCh0bykrMSkKCW1pbnRlZElEcyA9IGFwcGVuZChtaW50ZWRJRHMsIHRpZCkKCWlmIF8sIGhhc092ZXJyaWRlIDo9IHdoaXRlbGlzdEJwcy5HZXQocGF5ZXIuU3RyaW5nKCkpLihpbnQ2NCk7ICFoYXNPdmVycmlkZSB7CgkJY2FtcGFpZ24uQ29uc3VtZURpc2NvdW50KGNyb3NzKGN1ciksIHBheWVyKQoJfQoJcmV0dXJuIHRpZAp9CgovLyBSZXBvcnRNaW50aW5nT3Blbi9SZXBvcnRNYXhNaW50c1BlcldhbGxldCBsZXQgdGhlIGFwcHJvdmVkIHZlcnNpb24KLy8gcmVhbG0gbWlycm9yIGl0cyBvd24gbGl2ZSBzZXR0aW5ncyBoZXJlIGZvciBkaXNwbGF5IG9ubHkgLS0gc2VlCi8vIG1pbnRpbmdPcGVuTWlycm9yJ3Mgb3duIGRvYyBjb21tZW50IGZvciB3aHkgdGhpcyBleGlzdHMgaW5zdGVhZCBvZiBhCi8vIGRpcmVjdCBjcm9zcy1yZWFsbSByZWFkLgpmdW5jIFJlcG9ydE1pbnRpbmdPcGVuKGN1ciByZWFsbSwgb3BlbiBib29sKSB7Cglhc3NlcnRDYWxsZXJJc0FwcHJvdmVkVmVyc2lvbihjdXIpCgltaW50aW5nT3Blbk1pcnJvciA9IG9wZW4KfQoKZnVuYyBSZXBvcnRNYXhNaW50c1BlcldhbGxldChjdXIgcmVhbG0sIG1heCBpbnQ2NCkgewoJYXNzZXJ0Q2FsbGVySXNBcHByb3ZlZFZlcnNpb24oY3VyKQoJbWF4TWludHNQZXJXYWxsZXRNaXJyb3IgPSBtYXgKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVG9rZW4tb3duZXIgYWN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmZ1bmMgQXBwcm92ZShjdXIgcmVhbG0sIHRvIGFkZHJlc3MsIHRpZCBncmM3MjEuVG9rZW5JRCkgewoJY2hlY2tFcnIobmZ0LkFwcHJvdmUoY2FsbGVyQWRkcmVzcygpLCB0bywgdGlkKSkKfQoKZnVuYyBTZXRBcHByb3ZhbEZvckFsbChjdXIgcmVhbG0sIG9wZXJhdG9yIGFkZHJlc3MsIGFwcHJvdmVkIGJvb2wpIHsKCWNoZWNrRXJyKG5mdC5TZXRBcHByb3ZhbEZvckFsbChjYWxsZXJBZGRyZXNzKCksIG9wZXJhdG9yLCBhcHByb3ZlZCkpCn0KCmZ1bmMgVHJhbnNmZXJGcm9tKGN1ciByZWFsbSwgZnJvbSwgdG8gYWRkcmVzcywgdGlkIGdyYzcyMS5Ub2tlbklEKSB7CgljaGVja0VycihuZnQuVHJhbnNmZXJGcm9tKGNhbGxlckFkZHJlc3MoKSwgZnJvbSwgdG8sIHRpZCkpCn0KCmZ1bmMgU2FmZVRyYW5zZmVyRnJvbShjdXIgcmVhbG0sIGZyb20sIHRvIGFkZHJlc3MsIHRpZCBncmM3MjEuVG9rZW5JRCkgewoJY2hlY2tFcnIobmZ0LlNhZmVUcmFuc2ZlckZyb20oY2FsbGVyQWRkcmVzcygpLCBmcm9tLCB0bywgdGlkKSkKfQoKLy8gQnVybiBkZXN0cm95cyBhIHRva2VuLiBDYWxsZXIgbXVzdCBiZSBpdHMgY3VycmVudCBvd25lci4gUkVMRUFTRVMgdGhlCi8vIHRva2VuJ3MgdHJhaXQgY29tYmluYXRpb24gYmFjayBpbnRvIG1pbnRlZFRyYWl0Q29tYm9zLCBsb29rZWQgdXAKLy8gZnJvbSB0b2tlbkNvbWJvS2V5cyAodGhlIGV4YWN0IGtleSBSZWNvcmRNaW50IHJlc2VydmVkLCBub3QgYQovLyByZWNvbnN0cnVjdGlvbiAtLSBzZWUgdGhhdCBmaWVsZCdzIG93biBjb21tZW50IG9uIHdoeSBpdCBoYXMgdG8gYmUKLy8gc3RvcmVkIHZlcmJhdGltKS4gQ29tYmluZWQgd2l0aCBuZnQuQnVybiBpdHNlbGYgZnJlZWluZyB0aGUgdG9rZW4ncwovLyBvd25lci9tZXRhZGF0YSBzdG9yYWdlLCB0aGlzIGZyZWVzIHRoZSBtYXhpbXVtIHJlYWwgYnl0ZXMgcG9zc2libGUsCi8vIHdoaWNoIG1heGltaXplcyB0aGUgYXV0b21hdGljIHN0b3JhZ2UtZGVwb3NpdCByZWZ1bmQgZ25vJ3Mgb3duCi8vIHJ1bnRpbWUgc2VuZHMgYmFjayB0byB3aG9ldmVyIGNhbGxzIEJ1cm4uIFRoZSBhcmNoaXZlZCByZWNvcmQgc3RyaXBzCi8vIEltYWdlL0ltYWdlRGF0YSBmaXJzdCAtLSBzZWUgdGhpcyBmaWxlJ3Mgb3duIGRvYyBjb21tZW50IGZvciB3aHkuCmZ1bmMgQnVybihjdXIgcmVhbG0sIHRpZCBncmM3MjEuVG9rZW5JRCkgewoJY2FsbGVyIDo9IGNhbGxlckFkZHJlc3MoKQoJb3duZXIsIGVyciA6PSBuZnQuT3duZXJPZih0aWQpCgljaGVja0VycihlcnIpCglpZiBjYWxsZXIgIT0gb3duZXIgewoJCXBhbmljKGdyYzcyMS5FcnJDYWxsZXJJc05vdE93bmVyKQoJfQoJbWV0YWRhdGEsIGVyciA6PSBuZnQuVG9rZW5NZXRhZGF0YSh0aWQpCgljaGVja0VycihlcnIpCgoJa2V5IDo9IHRpZC5TdHJpbmcoKQoJaWYgY29tYm9LZXksIG9rIDo9IHRva2VuQ29tYm9LZXlzLkdldChrZXkpLihzdHJpbmcpOyBvayB7CgkJbWludGVkVHJhaXRDb21ib3MuUmVtb3ZlKGNvbWJvS2V5KQoJCXRva2VuQ29tYm9LZXlzLlJlbW92ZShrZXkpCgl9CgoJY2hlY2tFcnIobmZ0LkJ1cm4odGlkKSkKCglhcmNoaXZlZCA6PSBtZXRhZGF0YQoJYXJjaGl2ZWQuSW1hZ2UgPSAiIgoJYXJjaGl2ZWQuSW1hZ2VEYXRhID0gIiIKCglidXJuZWRSZWNvcmRzLlNldChrZXksIGJ1cm5SZWNvcmR7CgkJQnVybmVkQnk6ICAgY2FsbGVyLAoJCUJ1cm5IZWlnaHQ6IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSwKCQlNZXRhZGF0YTogICBhcmNoaXZlZCwKCX0pCglidXJuZWRJRHMgPSBhcHBlbmQoYnVybmVkSURzLCB0aWQpCn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbm93ZWIgZGlzcGxheSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmZ1bmMgdHJhaXRzVG9DU1YoYXR0cnMgW11ncmM3MjEuVHJhaXQpIHN0cmluZyB7CglwYWlycyA6PSBtYWtlKFtdc3RyaW5nLCBsZW4oYXR0cnMpKQoJZm9yIGksIGEgOj0gcmFuZ2UgYXR0cnMgewoJCXBhaXJzW2ldID0gYS5UcmFpdFR5cGUgKyAiPSIgKyBhLlZhbHVlCgl9CglyZXR1cm4gc3RyaW5ncy5Kb2luKHBhaXJzLCAiOyIpCn0KCi8vIFRva2VuU3VtbWFyeSByZXR1cm5zIHRpZCwgaXRzIGN1cnJlbnQgb3duZXIsIGFuZCBpdHMgbWV0YWRhdGEgYXMgb25lCi8vIHBpcGUtZGVsaW1pdGVkIGxpbmUsIGVhY2ggdmFsdWUgYmFzZTY0LWVuY29kZWQgLS0gc2FtZSBzaGFwZSB0aGUKLy8gb3JpZ2luYWwgc2luZ2xlLXJlYWxtIGRlc2lnbiB1c2VkLCBmb3IgYW55IG9mZi1jaGFpbiBVSSB0aGF0IHdhbnRzIGEKLy8gZ2FsbGVyeSB2aWV3IHdpdGhvdXQgZGVjb2RpbmcgR25vJ3Mgb3duIHN0cnVjdCB2YWx1ZSBzeW50YXguCmZ1bmMgVG9rZW5TdW1tYXJ5KHRpZCBncmM3MjEuVG9rZW5JRCkgKHN0cmluZywgZXJyb3IpIHsKCW93bmVyLCBlcnIgOj0gbmZ0Lk93bmVyT2YodGlkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCBlcnIKCX0KCW1ldGFkYXRhLCBlcnIgOj0gbmZ0LlRva2VuTWV0YWRhdGEodGlkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCBlcnIKCX0KCWVuYyA6PSBiYXNlNjQuU3RkRW5jb2RpbmcKCWZpZWxkcyA6PSBbXXN0cmluZ3sKCQl0aWQuU3RyaW5nKCksCgkJb3duZXIuU3RyaW5nKCksCgkJZW5jLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShtZXRhZGF0YS5OYW1lKSksCgkJZW5jLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShtZXRhZGF0YS5EZXNjcmlwdGlvbikpLAoJCWVuYy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUobWV0YWRhdGEuSW1hZ2UpKSwKCQllbmMuRW5jb2RlVG9TdHJpbmcoW11ieXRlKG1ldGFkYXRhLkV4dGVybmFsVVJMKSksCgkJZW5jLkVuY29kZVRvU3RyaW5nKFtdYnl0ZSh0cmFpdHNUb0NTVihtZXRhZGF0YS5BdHRyaWJ1dGVzKSkpLAoJCWVuYy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUobWV0YWRhdGEuQmFja2dyb3VuZENvbG9yKSksCgl9CglyZXR1cm4gc3RyaW5ncy5Kb2luKGZpZWxkcywgInwiKSwgbmlsCn0KCi8vIENvbGxlY3Rpb25TdW1tYXJ5IHJldHVybnMgb25lIFRva2VuU3VtbWFyeSBsaW5lIHBlciB0b2tlbiBvbiB0aGUKLy8gZ2l2ZW4gcGFnZSAoMS1pbmRleGVkLCBuZXdlc3QgZmlyc3QsIGhvbWVSZW5kZXJMaW1pdCBwZXIgcGFnZSAtLQovLyBzYW1lIHBhZ2Ugc2l6ZSBSZW5kZXIncyBvd24gbGlzdGluZyB1c2VzKSwgbmV3bGluZS1zZXBhcmF0ZWQuCi8vIFBhZ2luYXRlZCBiZWNhdXNlIGFuIHVuYm91bmRlZCB2ZXJzaW9uIHJ1bnMgb3V0IG9mIGdhcyBwYXN0IGEgZmV3Ci8vIGRvemVuIHRva2VucyAoY29uZmlybWVkIGxpdmUgaW4gdGhlIG9yaWdpbmFsIHNpbmdsZS1yZWFsbSBkZXNpZ24gYXQKLy8gfjIxIHRva2VucykgLS0gZWFjaCBzdW1tYXJ5IHJlLWVtYmVkcyBhIGZ1bGwgcmVuZGVyZWQgaW1hZ2UuCmZ1bmMgQ29sbGVjdGlvblN1bW1hcnkocGFnZSBpbnQpIHN0cmluZyB7Cgl0b3RhbCA6PSBsZW4obWludGVkSURzKQoJaWYgcGFnZSA8IDEgewoJCXBhZ2UgPSAxCgl9CglzdGFydEsgOj0gKHBhZ2UgLSAxKSAqIGhvbWVSZW5kZXJMaW1pdAoJZW5kSyA6PSBzdGFydEsgKyBob21lUmVuZGVyTGltaXQKCWlmIGVuZEsgPiB0b3RhbCB7CgkJZW5kSyA9IHRvdGFsCgl9Cgl2YXIgbGluZXMgW11zdHJpbmcKCWZvciBrIDo9IHN0YXJ0SzsgayA8IGVuZEs7IGsrKyB7CgkJdGlkIDo9IG1pbnRlZElEc1t0b3RhbC0xLWtdCgkJbGluZSwgZXJyIDo9IFRva2VuU3VtbWFyeSh0aWQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCWNvbnRpbnVlIC8vIGJ1cm5lZCBzaW5jZSBtaW50aW5nCgkJfQoJCWxpbmVzID0gYXBwZW5kKGxpbmVzLCBsaW5lKQoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihsaW5lcywgIlxuIikKfQoKY29uc3Qgd2FsbGV0U2NhbkNodW5rID0gMTAwCgovLyBXYWxsZXRTdW1tYXJ5IGlzIENvbGxlY3Rpb25TdW1tYXJ5IGZpbHRlcmVkIHRvIG93bmVyLCBzY2FubmluZyBhdAovLyBtb3N0IHdhbGxldFNjYW5DaHVuayBvZiBtaW50ZWRJRHMgc3RhcnRpbmcgYXQgc3RhcnRJZHguIFJldHVybnMgdGhlCi8vIG1hdGNoaW5nIGxpbmVzIHBsdXMgbmV4dElkeCB0byByZXN1bWUgZnJvbTsgbmV4dElkeCA9PSBUb2tlbkNvdW50KCkKLy8gb25jZSBub3RoaW5nIGlzIGxlZnQgdG8gY2hlY2suCmZ1bmMgV2FsbGV0U3VtbWFyeShvd25lciBhZGRyZXNzLCBzdGFydElkeCBpbnQ2NCkgKHN1bW1hcnkgc3RyaW5nLCBuZXh0SWR4IGludDY0KSB7Cgl0b3RhbCA6PSBsZW4obWludGVkSURzKQoJc3RhcnQgOj0gaW50KHN0YXJ0SWR4KQoJaWYgc3RhcnQgPCAwIHsKCQlzdGFydCA9IDAKCX0KCWVuZCA6PSBzdGFydCArIHdhbGxldFNjYW5DaHVuawoJaWYgZW5kID4gdG90YWwgewoJCWVuZCA9IHRvdGFsCgl9Cgl2YXIgbGluZXMgW11zdHJpbmcKCWZvciBrIDo9IHN0YXJ0OyBrIDwgZW5kOyBrKysgewoJCXRpZCA6PSBtaW50ZWRJRHNbdG90YWwtMS1rXQoJCXRva2VuT3duZXIsIGVyciA6PSBuZnQuT3duZXJPZih0aWQpCgkJaWYgZXJyICE9IG5pbCB8fCB0b2tlbk93bmVyICE9IG93bmVyIHsKCQkJY29udGludWUKCQl9CgkJbGluZSwgZXJyIDo9IFRva2VuU3VtbWFyeSh0aWQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCWNvbnRpbnVlCgkJfQoJCWxpbmVzID0gYXBwZW5kKGxpbmVzLCBsaW5lKQoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihsaW5lcywgIlxuIiksIGludDY0KGVuZCkKfQoKLy8gQnVybmVkVG9rZW5TdW1tYXJ5IHJldHVybnMgYSBwZXJtYW5lbnQgc25hcHNob3Qgb2Ygb25lIGJ1cm5lZCB0b2tlbiwKLy8gc2FtZSBsaW5lIHNoYXBlIGFzIFRva2VuU3VtbWFyeSwgd2l0aCBvd25lciBzd2FwcGVkIGZvcgovLyBidXJuZWRCeS9idXJuSGVpZ2h0LiBJbWFnZSBpcyBhbHdheXMgZW1wdHkgKHNlZSBCdXJuJ3Mgb3duIGRvYwovLyBjb21tZW50KS4KZnVuYyBCdXJuZWRUb2tlblN1bW1hcnkodGlkIGdyYzcyMS5Ub2tlbklEKSAoc3RyaW5nLCBlcnJvcikgewoJcmF3IDo9IGJ1cm5lZFJlY29yZHMuR2V0KHRpZC5TdHJpbmcoKSkKCXJlYywgb2sgOj0gcmF3LihidXJuUmVjb3JkKQoJaWYgIW9rIHsKCQlyZXR1cm4gIiIsIGdyYzcyMS5FcnJJbnZhbGlkVG9rZW5JZAoJfQoJZW5jIDo9IGJhc2U2NC5TdGRFbmNvZGluZwoJZmllbGRzIDo9IFtdc3RyaW5newoJCXRpZC5TdHJpbmcoKSwKCQlyZWMuQnVybmVkQnkuU3RyaW5nKCksCgkJdWZtdC5TcHJpbnRmKCIlZCIsIHJlYy5CdXJuSGVpZ2h0KSwKCQllbmMuRW5jb2RlVG9TdHJpbmcoW11ieXRlKHJlYy5NZXRhZGF0YS5OYW1lKSksCgkJZW5jLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShyZWMuTWV0YWRhdGEuRGVzY3JpcHRpb24pKSwKCQllbmMuRW5jb2RlVG9TdHJpbmcoW11ieXRlKHJlYy5NZXRhZGF0YS5JbWFnZSkpLAoJCWVuYy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUocmVjLk1ldGFkYXRhLkV4dGVybmFsVVJMKSksCgkJZW5jLkVuY29kZVRvU3RyaW5nKFtdYnl0ZSh0cmFpdHNUb0NTVihyZWMuTWV0YWRhdGEuQXR0cmlidXRlcykpKSwKCQllbmMuRW5jb2RlVG9TdHJpbmcoW11ieXRlKHJlYy5NZXRhZGF0YS5CYWNrZ3JvdW5kQ29sb3IpKSwKCX0KCXJldHVybiBzdHJpbmdzLkpvaW4oZmllbGRzLCAifCIpLCBuaWwKfQoKLy8gYmlnVG9rZW5JbWFnZSBzY2FsZXMgdXAgaW1hZ2UncyBkZWNsYXJlZCB3aWR0aC9oZWlnaHQgZm9yIGRpc3BsYXkgb24KLy8gaXRzIG93biB0b2tlbiBwYWdlIC0tIHRoZSB2aWV3Qm94IChhbmQgdGhlcmVmb3JlIGV2ZXJ5IGludGVybmFsCi8vIGNvb3JkaW5hdGUpIGlzIHVudG91Y2hlZCwgc28gdGhlIGJyb3dzZXIganVzdCByZW5kZXJzIHRoZSBzYW1lIHBpZWNlCi8vIGJpZ2dlciwgbm90aGluZyBpcyByZS1yZW5kZXJlZC4KZnVuYyBiaWdUb2tlbkltYWdlKGltYWdlIHN0cmluZykgc3RyaW5nIHsKCWNvbnN0IHByZWZpeCA9ICJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCIKCWlmICFzdHJpbmdzLkhhc1ByZWZpeChpbWFnZSwgcHJlZml4KSB7CgkJcmV0dXJuIGltYWdlCgl9CglyYXcsIGVyciA6PSBiYXNlNjQuU3RkRW5jb2RpbmcuRGVjb2RlU3RyaW5nKGltYWdlW2xlbihwcmVmaXgpOl0pCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gaW1hZ2UKCX0KCXN2ZyA6PSBzdHJpbmcocmF3KQoJcmVzaXplZCA6PSBzdHJpbmdzLlJlcGxhY2Uoc3ZnLCBgd2lkdGg9IjE3MC4wMCIgaGVpZ2h0PSIxNzAuMDAiYCwgYHdpZHRoPSJgK3Rva2VuUGFnZUltYWdlU2l6ZStgIiBoZWlnaHQ9ImArdG9rZW5QYWdlSW1hZ2VTaXplK2AiYCwgMSkKCWlmIHJlc2l6ZWQgPT0gc3ZnIHsKCQlyZXNpemVkID0gc3RyaW5ncy5SZXBsYWNlKHN2ZywgYHdpZHRoPSIxNzAiIGhlaWdodD0iMTcwImAsIGB3aWR0aD0iYCt0b2tlblBhZ2VJbWFnZVNpemUrYCIgaGVpZ2h0PSJgK3Rva2VuUGFnZUltYWdlU2l6ZStgImAsIDEpCgl9CglyZXR1cm4gcHJlZml4ICsgYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShyZXNpemVkKSkKfQoKZnVuYyByZW5kZXJNaW50ZWRMaXN0UGFnZShiICpzdHJpbmdzLkJ1aWxkZXIsIHBhZ2UgaW50KSB7Cgl0b3RhbCA6PSBsZW4obWludGVkSURzKQoJaWYgdG90YWwgPT0gMCB7CgkJcmV0dXJuCgl9Cgl0b3RhbFBhZ2VzIDo9ICh0b3RhbCArIGhvbWVSZW5kZXJMaW1pdCAtIDEpIC8gaG9tZVJlbmRlckxpbWl0CglpZiBwYWdlIDwgMSB7CgkJcGFnZSA9IDEKCX0KCWlmIHBhZ2UgPiB0b3RhbFBhZ2VzIHsKCQlwYWdlID0gdG90YWxQYWdlcwoJfQoJc3RhcnRLIDo9IChwYWdlIC0gMSkgKiBob21lUmVuZGVyTGltaXQKCWVuZEsgOj0gc3RhcnRLICsgaG9tZVJlbmRlckxpbWl0CglpZiBlbmRLID4gdG90YWwgewoJCWVuZEsgPSB0b3RhbAoJfQoKCWIuV3JpdGVTdHJpbmcoIlxuIyMgTWludGVkIHNvIGZhclxuXG4iKQoJaWYgdG90YWxQYWdlcyA+IDEgewoJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCJfcGFnZSAlZCBvZiAlZCAtLSAlZCBtaW50ZWQgdG90YWxfXG5cbiIsIHBhZ2UsIHRvdGFsUGFnZXMsIHRvdGFsKSkKCX0KCWIuV3JpdGVTdHJpbmcoInwgSW1hZ2UgfCBJbmRleCB8IE5hbWUgfCBPd25lciB8XG58LS0tfC0tLXwtLS18LS0tfFxuIikKCWZvciBrIDo9IHN0YXJ0SzsgayA8IGVuZEs7IGsrKyB7CgkJdGlkIDo9IG1pbnRlZElEc1t0b3RhbC0xLWtdCgkJb3duZXIsIGVyciA6PSBuZnQuT3duZXJPZih0aWQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCWNvbnRpbnVlIC8vIGJ1cm5lZAoJCX0KCQltZXRhZGF0YSwgXyA6PSBuZnQuVG9rZW5NZXRhZGF0YSh0aWQpCgkJbmFtZSA6PSBtZXRhZGF0YS5OYW1lCgkJaWYgbmFtZSA9PSAiIiB7CgkJCW5hbWUgPSAiVW50aXRsZWQiCgkJfQoJCWxpbmsgOj0gcmVhbG1SZWxQYXRoICsgIjp0b2tlbi8iICsgdGlkLlN0cmluZygpCgkJaW1hZ2UgOj0gbWV0YWRhdGEuSW1hZ2UKCQlpZiBpbWFnZSA9PSAiIiB7CgkJCWltYWdlID0gbWV0YWRhdGEuSW1hZ2VEYXRhCgkJfQoJCWltZ0NlbGwgOj0gIiIKCQlpZiBpbWFnZSAhPSAiIiB7CgkJCWltZ0NlbGwgPSB1Zm10LlNwcmludGYoIlshWyVzXSglcyldKCVzKSIsIG5hbWUsIGltYWdlLCBsaW5rKQoJCX0KCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigifCAlcyB8IFsjJXNdKCVzKSB8ICVzIHwgJXMgfFxuIiwgaW1nQ2VsbCwgdGlkLlN0cmluZygpLCBsaW5rLCBuYW1lLCBvd25lcikpCgl9CgliLldyaXRlU3RyaW5nKCJcbiIpCgoJcmVuZGVyUGFnZUxpbmtzKGIsIHBhZ2UsIHRvdGFsUGFnZXMsICJwYWdlIikKfQoKZnVuYyByZW5kZXJQYWdlTGlua3MoYiAqc3RyaW5ncy5CdWlsZGVyLCBwYWdlLCB0b3RhbFBhZ2VzIGludCwgbGlua0Jhc2Ugc3RyaW5nKSB7CglpZiB0b3RhbFBhZ2VzIDw9IDEgewoJCXJldHVybgoJfQoJYi5Xcml0ZVN0cmluZygiXG4iKQoJcGFydHMgOj0gW11zdHJpbmd7fQoJaWYgcGFnZSA+IDEgewoJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCB1Zm10LlNwcmludGYoIls8PCBGaXJzdF0oJXM6JXMvMSkiLCByZWFsbVJlbFBhdGgsIGxpbmtCYXNlKSkKCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgdWZtdC5TcHJpbnRmKCJbPC0gbmV3ZXJdKCVzOiVzLyVkKSIsIHJlYWxtUmVsUGF0aCwgbGlua0Jhc2UsIHBhZ2UtMSkpCgl9CglsYXN0U2hvd24gOj0gMAoJZm9yIHAgOj0gMTsgcCA8PSB0b3RhbFBhZ2VzOyBwKysgewoJCWlmIHAgIT0gMSAmJiBwICE9IHRvdGFsUGFnZXMgJiYgKHAgPCBwYWdlLXBhZ2VXaW5kb3cgfHwgcCA+IHBhZ2UrcGFnZVdpbmRvdykgewoJCQljb250aW51ZQoJCX0KCQlpZiBsYXN0U2hvd24gIT0gMCAmJiBwICE9IGxhc3RTaG93bisxIHsKCQkJcGFydHMgPSBhcHBlbmQocGFydHMsICIuLi4iKQoJCX0KCQlpZiBwID09IHBhZ2UgewoJCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgdWZtdC5TcHJpbnRmKCIqKiVkKioiLCBwKSkKCQl9IGVsc2UgewoJCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgdWZtdC5TcHJpbnRmKCJbJWRdKCVzOiVzLyVkKSIsIHAsIHJlYWxtUmVsUGF0aCwgbGlua0Jhc2UsIHApKQoJCX0KCQlsYXN0U2hvd24gPSBwCgl9CglpZiBwYWdlIDwgdG90YWxQYWdlcyB7CgkJcGFydHMgPSBhcHBlbmQocGFydHMsIHVmbXQuU3ByaW50ZigiW29sZGVyIC0+XSglczolcy8lZCkiLCByZWFsbVJlbFBhdGgsIGxpbmtCYXNlLCBwYWdlKzEpKQoJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCB1Zm10LlNwcmludGYoIltMYXN0ID4+XSglczolcy8lZCkiLCByZWFsbVJlbFBhdGgsIGxpbmtCYXNlLCB0b3RhbFBhZ2VzKSkKCX0KCWIuV3JpdGVTdHJpbmcoc3RyaW5ncy5Kb2luKHBhcnRzLCAiIC0gIikpCgliLldyaXRlU3RyaW5nKCJcbiIpCn0KCmZ1bmMgcmVuZGVyQnVybmVkTGlzdFBhZ2UoYiAqc3RyaW5ncy5CdWlsZGVyLCBwYWdlIGludCkgewoJdG90YWwgOj0gbGVuKGJ1cm5lZElEcykKCWlmIHRvdGFsID09IDAgewoJCXJldHVybgoJfQoJdG90YWxQYWdlcyA6PSAodG90YWwgKyBob21lUmVuZGVyTGltaXQgLSAxKSAvIGhvbWVSZW5kZXJMaW1pdAoJaWYgcGFnZSA8IDEgewoJCXBhZ2UgPSAxCgl9CglpZiBwYWdlID4gdG90YWxQYWdlcyB7CgkJcGFnZSA9IHRvdGFsUGFnZXMKCX0KCXN0YXJ0SyA6PSAocGFnZSAtIDEpICogaG9tZVJlbmRlckxpbWl0CgllbmRLIDo9IHN0YXJ0SyArIGhvbWVSZW5kZXJMaW1pdAoJaWYgZW5kSyA+IHRvdGFsIHsKCQllbmRLID0gdG90YWwKCX0KCgliLldyaXRlU3RyaW5nKCJcbiMjIEJ1cm5lZCB0b2tlbnNcblxuIikKCWlmIHRvdGFsUGFnZXMgPiAxIHsKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiX3BhZ2UgJWQgb2YgJWQgLS0gJWQgYnVybmVkIHRvdGFsX1xuXG4iLCBwYWdlLCB0b3RhbFBhZ2VzLCB0b3RhbCkpCgl9CgliLldyaXRlU3RyaW5nKCJ8IEluZGV4IHwgTmFtZSB8IEJ1cm5lZCBCeSB8IEJsb2NrIHxcbnwtLS18LS0tfC0tLXwtLS18XG4iKQoJZm9yIGsgOj0gc3RhcnRLOyBrIDwgZW5kSzsgaysrIHsKCQl0aWQgOj0gYnVybmVkSURzW3RvdGFsLTEta10KCQlyYXcgOj0gYnVybmVkUmVjb3Jkcy5HZXQodGlkLlN0cmluZygpKQoJCXJlYywgb2sgOj0gcmF3LihidXJuUmVjb3JkKQoJCWlmICFvayB7CgkJCWNvbnRpbnVlCgkJfQoJCW5hbWUgOj0gcmVjLk1ldGFkYXRhLk5hbWUKCQlpZiBuYW1lID09ICIiIHsKCQkJbmFtZSA9ICJVbnRpdGxlZCIKCQl9CgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoInwgIyVzIHwgJXMgfCAlcyB8ICVkIHxcbiIsIHRpZC5TdHJpbmcoKSwgbmFtZSwgcmVjLkJ1cm5lZEJ5LCByZWMuQnVybkhlaWdodCkpCgl9CgliLldyaXRlU3RyaW5nKCJcbiIpCgoJcmVuZGVyUGFnZUxpbmtzKGIsIHBhZ2UsIHRvdGFsUGFnZXMsICJidXJuZWQvcGFnZSIpCn0KCmZ1bmMgcmVuZGVyNDA0KCkgc3RyaW5nIHsKCXJldHVybiB1Zm10LlNwcmludGYoIiMgNDA0XG5cbls8LSBiYWNrIHRvIGNvbGxlY3Rpb25dKCVzKVxuIiwgcmVhbG1SZWxQYXRoKQp9CgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIHBhdGggPT0gIiIgewoJCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJCWIuV3JpdGVTdHJpbmcobmZ0LlJlbmRlckhvbWUoKSkKCQliLldyaXRlU3RyaW5nKCJcbiMjIEFib3V0XG5cbiIpCgkJYi5Xcml0ZVN0cmluZygiRWFjaCBHZW0ncyBDaGFpbiB0cmFpdCBuYW1lcyBhIHJlYWwgZ25vLmxhbmQgdGVzdG5ldCAtLSBvbmUgb2YgdGhlIGdlbmVyYXRpb25zIHRoYXQgY2FycmllZCB0aGUgbmV0d29yayBmb3J3YXJkIG9uIGl0cyB3YXkgdG8gTWFpbm5ldC4gU2V0IGluIGEgcmluZyB3aXRoIGl0cyBvd24gc21hbGwgYW50aWdyYXZpdHkgZmllbGQsIGV2ZXJ5IHBpZWNlIGlzIGEga2VlcHNha2UgZm9yIGV2ZXJ5b25lIHdobyBoZWxwZWQgYnVpbGQsIHRlc3QsIGFuZCBncm93IGduby5sYW5kIGludG8gd2hhdCBpdCdzIGJlY29taW5nLlxuXG4iKQoJCWIuV3JpdGVTdHJpbmcoIlRoaXMgY29sbGVjdGlvbiBpcyBhbHNvIGEgZGVtb25zdHJhdGlvbjogZXZlcnkgZ2VtIGlzIGdlbmVyYXRpdmUgYXJ0LCBhc3NlbWJsZWQgZnJlc2ggb24gZWFjaCByZWFkIGFuZCBzdG9yZWQgZW50aXJlbHkgb24tY2hhaW4gLS0gbm8gZXh0ZXJuYWwgbGlua3MsIG5vdGhpbmcgdGhhdCBjYW4gZ28gbWlzc2luZy5cblxuIikKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKk93bmVyKio6ICVzXG4iLCBPd25lcigpKSkKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKkFzc2VtYmxlZCB0cmFpdCBjb21iaW5hdGlvbnMgbWludGVkKio6ICVkXG4iLCBpbnQ2NChtaW50ZWRUcmFpdENvbWJvcy5TaXplKCkpKSkKCQliLldyaXRlU3RyaW5nKCIqICoqTWF4IHN1cHBseSoqOiB1bmxpbWl0ZWRcbiIpCgkJaWYgbWludGluZ09wZW5NaXJyb3IgewoJCQliLldyaXRlU3RyaW5nKCIqICoqTWludGluZyoqOiBvcGVuXG4iKQoJCX0gZWxzZSB7CgkJCWIuV3JpdGVTdHJpbmcoIiogKipNaW50aW5nKio6IGNsb3NlZFxuIikKCQl9CgkJaWYgbWludFByaWNlVWdub3QgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipNaW50IHByaWNlKio6ICVkIHVnbm90XG4iLCBtaW50UHJpY2VVZ25vdCkpCgkJfSBlbHNlIHsKCQkJYi5Xcml0ZVN0cmluZygiKiAqKk1pbnQgcHJpY2UqKjogZnJlZVxuIikKCQl9CgkJaWYgbWF4TWludHNQZXJXYWxsZXRNaXJyb3IgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipNYXggbWludHMgcGVyIHdhbGxldCoqOiAlZFxuIiwgbWF4TWludHNQZXJXYWxsZXRNaXJyb3IpKQoJCX0gZWxzZSB7CgkJCWIuV3JpdGVTdHJpbmcoIiogKipNYXggbWludHMgcGVyIHdhbGxldCoqOiB1bmxpbWl0ZWRcbiIpCgkJfQoJCWlmIHJveWFsdHlCcHMgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipTZWNvbmRhcnkgc2FsZSByb3lhbHR5Kio6ICVkLiUwMmQlJSAoRUlQLTI5ODEgUm95YWx0eUluZm8pXG4iLCByb3lhbHR5QnBzLzEwMCwgcm95YWx0eUJwcyUxMDApKQoJCX0KCQlpZiBsZW4oYnVybmVkSURzKSA+IDAgewoJCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKkJ1cm5lZCoqOiAlZCAtLSBbdmlldyBidXJuZWQgdG9rZW5zIC0+XSglczpidXJuZWQpXG4iLCBsZW4oYnVybmVkSURzKSwgcmVhbG1SZWxQYXRoKSkKCQl9CgoJCXJlbmRlck1pbnRlZExpc3RQYWdlKCZiLCAxKQoJCXJldHVybiBiLlN0cmluZygpCgl9CgoJcGFydHMgOj0gc3RyaW5ncy5TcGxpdChwYXRoLCAiLyIpCglpZiBsZW4ocGFydHMpID09IDIgJiYgcGFydHNbMF0gPT0gInBhZ2UiIHsKCQlwYWdlLCBlcnIgOj0gc3RyY29udi5BdG9pKHBhcnRzWzFdKQoJCWlmIGVyciAhPSBuaWwgfHwgcGFnZSA8IDEgewoJCQlyZXR1cm4gcmVuZGVyNDA0KCkKCQl9CgkJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiMgJXMgLS0gbWludGVkIHRva2Vuc1xuXG5bPC0gYmFjayB0byBjb2xsZWN0aW9uXSglcylcbiIsIG5mdC5OYW1lKCksIHJlYWxtUmVsUGF0aCkpCgkJcmVuZGVyTWludGVkTGlzdFBhZ2UoJmIsIHBhZ2UpCgkJcmV0dXJuIGIuU3RyaW5nKCkKCX0KCWlmIHBhcnRzWzBdID09ICJidXJuZWQiIHsKCQlwYWdlIDo9IDEKCQlpZiBsZW4ocGFydHMpID09IDMgJiYgcGFydHNbMV0gPT0gInBhZ2UiIHsKCQkJcCwgZXJyIDo9IHN0cmNvbnYuQXRvaShwYXJ0c1syXSkKCQkJaWYgZXJyICE9IG5pbCB8fCBwIDwgMSB7CgkJCQlyZXR1cm4gcmVuZGVyNDA0KCkKCQkJfQoJCQlwYWdlID0gcAoJCX0gZWxzZSBpZiBsZW4ocGFydHMpICE9IDEgewoJCQlyZXR1cm4gcmVuZGVyNDA0KCkKCQl9CgkJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiMgJXMgLS0gYnVybmVkIHRva2Vuc1xuXG5bPC0gYmFjayB0byBjb2xsZWN0aW9uXSglcylcbiIsIG5mdC5OYW1lKCksIHJlYWxtUmVsUGF0aCkpCgkJcmVuZGVyQnVybmVkTGlzdFBhZ2UoJmIsIHBhZ2UpCgkJcmV0dXJuIGIuU3RyaW5nKCkKCX0KCWlmIGxlbihwYXJ0cykgPT0gMiAmJiBwYXJ0c1swXSA9PSAidG9rZW4iIHsKCQl0aWQgOj0gZ3JjNzIxLlRva2VuSUQocGFydHNbMV0pCgkJb3duZXIsIGVyciA6PSBuZnQuT3duZXJPZih0aWQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiByZW5kZXI0MDQoKQoJCX0KCQltZXRhZGF0YSwgXyA6PSBuZnQuVG9rZW5NZXRhZGF0YSh0aWQpCgkJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiMgJXMgIyVzXG5cbls8LSBiYWNrIHRvIGNvbGxlY3Rpb25dKCVzKVxuXG4iLCBuZnQuTmFtZSgpLCB0aWQuU3RyaW5nKCksIHJlYWxtUmVsUGF0aCkpCgkJaW1hZ2UgOj0gbWV0YWRhdGEuSW1hZ2UKCQlpZiBpbWFnZSA9PSAiIiB7CgkJCWltYWdlID0gbWV0YWRhdGEuSW1hZ2VEYXRhCgkJfQoJCW5hbWUgOj0gbWV0YWRhdGEuTmFtZQoJCWlmIG5hbWUgPT0gIiIgewoJCQluYW1lID0gIlVudGl0bGVkIgoJCX0KCQlpZiBpbWFnZSAhPSAiIiB7CgkJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIhWyVzXSglcylcblxuIiwgbmFtZSwgYmlnVG9rZW5JbWFnZShpbWFnZSkpKQoJCX0KCgkJYi5Xcml0ZVN0cmluZygiIyMgRGV0YWlsc1xuXG4iKQoJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqQ29sbGVjdGlvbioqOiAlc1xuIiwgbmZ0Lk5hbWUoKSkpCgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipOYW1lKio6ICVzXG4iLCBuYW1lKSkKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKkluZGV4Kio6ICMlc1xuIiwgdGlkLlN0cmluZygpKSkKCQlpZiBtZXRhZGF0YS5EZXNjcmlwdGlvbiAhPSAiIiB7CgkJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqRGVzY3JpcHRpb24qKjogJXNcbiIsIG1ldGFkYXRhLkRlc2NyaXB0aW9uKSkKCQl9CgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipPd25lcioqOiAlc1xuIiwgb3duZXIpKQoKCQlpZiBsZW4obWV0YWRhdGEuQXR0cmlidXRlcykgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZygiXG4jIyBUcmFpdHNcblxuIikKCQkJZm9yIF8sIGF0dHIgOj0gcmFuZ2UgbWV0YWRhdGEuQXR0cmlidXRlcyB7CgkJCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKiVzKio6ICVzXG4iLCBhdHRyLlRyYWl0VHlwZSwgYXR0ci5WYWx1ZSkpCgkJCX0KCQl9CgkJcmV0dXJuIGIuU3RyaW5nKCkKCX0KCglyZXR1cm4gcmVuZGVyNDA0KCkKfQoKZnVuYyBjaGVja0VycihlcnIgZXJyb3IpIHsKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTE1MDAwMDAwdWdub3QSEgiAqupVEgs5MDAwMDB1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMM5XVcsJaWlsWmxTCAN0V1iuEgo/7Uq62TRynbOVWN7RJAVQdYq5KI1Kho3lTNIWonMaPVcSAndNR7cZzk1i4ttzNBICbYD8K7SnYQsiqYLH8V6sKtIMaSagAFfBTko8oywBooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==