Transaction executed successfully

Transaction Details

Inspect execution, participants, message data, gas usage, events and raw transaction data.

Transaction hash
851050FCFD54C7E37925F9510FCD2672623E805FDDB69490211A32E95C859DEC

Transaction overview

Status
Success
Execution completed
Block
#652693
Included in block
Message Type
m_addpkg
Primary message

Execution summary

TX INDEX
0
Position in block
GAS WANTED
96,000,000
Requested gas limit
GAS USED
50,420,653
Gas consumed
FEE
96000ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g136j0m08pkm2lwwde9dmlx8uee26llent9s5cpf14000000ugnot

Execution log

msg:0,success:true,log:,events:[]

Events

No events emitted by this transaction.

Raw encoded transaction

CpORAgoML3ZtLm1fYWRkcGtnEoGRAgooZzEzNmowbTA4cGttMmx3d2RlOWRtbHg4dWVlMjZsbGVudDlzNWNwZhLEkAIKD21lbWJhX2JyaWRnZV92MRIiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX2JyaWRnZV92MRqsgAEKCGFwcHMuZ25vEp6AAXBhY2thZ2UgbWVtYmFfYnJpZGdlX3YxCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL2JhbmtlciIKCSJjcnlwdG8vc2hhMjU2IgoJImVuY29kaW5nL2hleCIKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJImduby5sYW5kL3Avc2FtY3Jldy9kYW9hdXRoIgoJZ292ICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfZ292IgoJZXNjcm93ICJnbm8ubGFuZC9yL3NhbWNyZXcvZXNjcm93X3Y0IgoJYmFkZ2VzICJnbm8ubGFuZC9yL3NhbWNyZXcvZ25vYnVpbGRlcnNfYmFkZ2VzX3YyIgoJYXBwc3RvcmUgImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9hcHBzdG9yZV92MyIKCWFyY2FkZSAiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX2FyY2FkZV9sZWFkZXJib2FyZF92MSIKCWNoYW5uZWxzICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfZGFvX2NoYW5uZWxzX3YyIgoJZmVlZCAiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX2ZlZWRfdjEiCglmZWVkYmFjayAiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX2ZlZWRiYWNrX3YyIgoJbWFya2V0ICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfbWFya2V0X2NvbmZpZyIKCXF1ZXN0ICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfcXVlc3RfYXR0ZXN0YXRpb25fdjEiCglyZXZpZXdzICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfcmV2aWV3c192MiIKKQoKLy8g4pSA4pSAIFJvbGVzOiBBcHAgU3RvcmUgY3VyYXRvcnMsIGFyY2FkZSBhdHRlc3RlcnMsIGJhZGdlIGFkbWlucywgZmVlZAovLyBtb2RlcmF0b3JzLiBPcGVyYXRpb25hbCB3b3JrIChjdXJhdGluZywgYXR0ZXN0aW5nLCBtaW50aW5nLCBtb2RlcmF0aW5nKQovLyBpcyBkb25lIGJ5IHRoZSBob2xkZXJzIHRoZSBEQU8gYXBwb2ludHMgaGVyZS4KCmZ1bmMgR3JhbnQoY3VyIHJlYWxtLCBwaWQgdWludDY0LCBhcHAgc3RyaW5nLCB3aG8gYWRkcmVzcykgeyByb2xlKGN1ciwgcGlkLCBhcHAsIHdobywgdHJ1ZSkgfQoKZnVuYyBSZXZva2UoY3VyIHJlYWxtLCBwaWQgdWludDY0LCBhcHAgc3RyaW5nLCB3aG8gYWRkcmVzcykgeyByb2xlKGN1ciwgcGlkLCBhcHAsIHdobywgZmFsc2UpIH0KCmZ1bmMgcm9sZShjdXIgcmVhbG0sIHBpZCB1aW50NjQsIGFwcCBzdHJpbmcsIHdobyBhZGRyZXNzLCBncmFudCBib29sKSB7CglhcHByb3ZlKGN1ciwgcGlkLCByb2xlUGxhbihhcHAsIHdobywgZ3JhbnQpKQoJc3dpdGNoIHsKCWNhc2UgYXBwID09IGFwcEFwcHN0b3JlICYmIGdyYW50OgoJCWFwcHN0b3JlLkFkZEN1cmF0b3IoY3Jvc3MoY3VyKSwgd2hvKQoJY2FzZSBhcHAgPT0gYXBwQXBwc3RvcmU6CgkJYXBwc3RvcmUuUmVtb3ZlQ3VyYXRvcihjcm9zcyhjdXIpLCB3aG8pCgljYXNlIGFwcCA9PSBhcHBBcmNhZGUgJiYgZ3JhbnQ6CgkJYXJjYWRlLkFkZEF0dGVzdGVyKGNyb3NzKGN1ciksIHdobykKCWNhc2UgYXBwID09IGFwcEFyY2FkZToKCQlhcmNhZGUuUmVtb3ZlQXR0ZXN0ZXIoY3Jvc3MoY3VyKSwgd2hvKQoJY2FzZSBhcHAgPT0gYXBwQmFkZ2VzICYmIGdyYW50OgoJCWJhZGdlcy5BZGRBZG1pbihjcm9zcyhjdXIpLCB3aG8pCgljYXNlIGFwcCA9PSBhcHBCYWRnZXM6CgkJYmFkZ2VzLlJlbW92ZUFkbWluKGNyb3NzKGN1ciksIHdobykKCWNhc2UgYXBwID09IGFwcEZlZWQgJiYgZ3JhbnQ6CgkJZmVlZC5BZGRNb2RlcmF0b3IoY3Jvc3MoY3VyKSwgd2hvKQoJZGVmYXVsdDoKCQlmZWVkLlJlbW92ZU1vZGVyYXRvcihjcm9zcyhjdXIpLCB3aG8pCgl9Cn0KCmZ1bmMgcm9sZVBsYW4oYXBwIHN0cmluZywgd2hvIGFkZHJlc3MsIGdyYW50IGJvb2wpIHBsYW4gewoJaWYgZ3JhbnQgewoJCWFyZyh3aG8pCgl9IGVsc2UgaWYgY2Fub25pY2FsKHdobykgPT0gc2VsZiB7CgkJLy8gUmV2b2tpbmcgaXRzIG93biBjdXJhdG9yIGdyYW50IHdvdWxkIGVuZCBEQU8gY3VyYXRpb24gdW50aWwgYSBoYW5kLW92ZXIgcm91bmQgdHJpcC4KCQlwYW5pYygibWVtYmFfYnJpZGdlOiB0aGUgYnJpZGdlIGtlZXBzIGl0cyBvd24gcm9sZSIpCgl9CgkvLyBBIHN0YWxlIGdyYW50IGhlbGQgYnkgYW5vdGhlciBwcm90ZWN0ZWQgcmVhbG0gY2FuIGJlIHJldm9rZWQuCglpZiBoYXNSb2xlKGFwcCwgd2hvKSA9PSBncmFudCB7CgkJcGFuaWMoIm1lbWJhX2JyaWRnZTogcm9sZSBhbHJlYWR5IGluIHRoYXQgc3RhdGUiKQoJfQoJb3AgOj0gIlJldm9rZSIKCWlmIGdyYW50IHsKCQlvcCA9ICJHcmFudCIKCX0KCWFyZ3MgOj0gZGFvYXV0aC5OZXcoKS5BZGRyKHdobykKCWlmIGFwcCA9PSBhcHBCYWRnZXMgewoJCWFyZ3MuSW50KGludDY0KGJhZGdlcy5HZXRBZG1pbkNvdW50KCkpKQoJfQoJcmV0dXJuIG5ld1BsYW4oYXBwLCBvcCwgYXJncywgYXBwLCBnb3YuQ3JpdGljYWwpCn0KCmZ1bmMgaGFzUm9sZShhcHAgc3RyaW5nLCB3aG8gYWRkcmVzcykgYm9vbCB7Cglzd2l0Y2ggYXBwIHsKCWNhc2UgYXBwQXBwc3RvcmU6CgkJcmV0dXJuIGFwcHN0b3JlLklzQ3VyYXRvcihzdHJpbmcod2hvKSkKCWNhc2UgYXBwQXJjYWRlOgoJCXJldHVybiBhcmNhZGUuSXNBdHRlc3RlcihzdHJpbmcod2hvKSkKCWNhc2UgYXBwQmFkZ2VzOgoJCXJldHVybiBiYWRnZXMuSXNBZG1pbih3aG8pCgljYXNlIGFwcEZlZWQ6CgkJcmV0dXJuIGZlZWQuSXNNb2RlcmF0b3Iod2hvKQoJfQoJcGFuaWMoIm1lbWJhX2JyaWRnZTogIiArIGFwcCArICIgaGFzIG5vIHJvbGUgdG8gZ3JhbnQiKQp9CgovLyDilIDilIAgQXBwIFN0b3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKLy8gQ3VyYXRlIHJ1bnMgYSBjdXJhdG9yIGFjdGlvbiBvbiBvbmUgbGlzdGluZzogYXBwcm92ZSwgcmVqZWN0ICh3aXRoIGEKLy8gcmVhc29uKSwgZGVsaXN0LCByZXN0b3JlIG9yIGNsZWFyZmxhZ3MuIEV2ZXJ5IGFwcHJvdmFsIGJpbmRzIHRoZSBsaXN0aW5nJ3MKLy8gc3RhdHVzOyBhcHByb3ZlIGFuZCByZXN0b3JlLCB3aGljaCBwdWJsaXNoLCBhbHNvIGJpbmQgaXRzIGNvbnRlbnQsIGFuZAovLyBjbGVhcmZsYWdzIGJpbmRzIHRoZSBmbGFncyBpdCBjbGVhcnMuIEVkaXRpbmcgb3IgZmxhZ2dpbmcgYSBsaXN0aW5nIHRodXMKLy8gY2Fubm90IHZvaWQgYSByZWplY3Qgb3IgZGVsaXN0IHZvdGUsIGFuZCBjYW5ub3Qgc2xpcCBuZXcgY29udGVudCBwYXN0IG9uZS4KZnVuYyBDdXJhdGUoY3VyIHJlYWxtLCBwaWQgdWludDY0LCBvcCwgcGtnUGF0aCwgcmVhc29uIHN0cmluZykgewoJYXBwcm92ZShjdXIsIHBpZCwgY3VyYXRlUGxhbihvcCwgcGtnUGF0aCwgcmVhc29uKSkKCXN3aXRjaCBvcCB7CgljYXNlICJhcHByb3ZlIjoKCQlhcHBzdG9yZS5BcHByb3ZlQXBwKGNyb3NzKGN1ciksIHBrZ1BhdGgpCgljYXNlICJyZWplY3QiOgoJCWFwcHN0b3JlLlJlamVjdEFwcChjcm9zcyhjdXIpLCBwa2dQYXRoLCByZWFzb24pCgljYXNlICJkZWxpc3QiOgoJCWFwcHN0b3JlLkRlbGlzdEFwcChjcm9zcyhjdXIpLCBwa2dQYXRoKQoJY2FzZSAicmVzdG9yZSI6CgkJYXBwc3RvcmUuUmVzdG9yZUFwcChjcm9zcyhjdXIpLCBwa2dQYXRoKQoJZGVmYXVsdDoKCQlhcHBzdG9yZS5DbGVhckZsYWdzKGNyb3NzKGN1ciksIHBrZ1BhdGgpCgl9Cn0KCmZ1bmMgY3VyYXRlUGxhbihvcCwgcGtnUGF0aCwgcmVhc29uIHN0cmluZykgcGxhbiB7Cglzd2l0Y2ggewoJY2FzZSBvcCAhPSAiYXBwcm92ZSIgJiYgb3AgIT0gInJlamVjdCIgJiYgb3AgIT0gImRlbGlzdCIgJiYgb3AgIT0gInJlc3RvcmUiICYmIG9wICE9ICJjbGVhcmZsYWdzIjoKCQlwYW5pYygibWVtYmFfYnJpZGdlOiB1bmtub3duIGN1cmF0aW9uICIgKyBvcCkKCWNhc2UgKG9wID09ICJyZWplY3QiKSAhPSAocmVhc29uICE9ICIiKToKCQlwYW5pYygibWVtYmFfYnJpZGdlOiBhIHJlYXNvbiBnb2VzIHdpdGggcmVqZWN0IG9ubHkiKQoJfQoJbCA6PSBhcHBzdG9yZS5HZXRHb3Zlcm5hbmNlTGlzdGluZyhwa2dQYXRoLCBvcCA9PSAiY2xlYXJmbGFncyIpCglpZiAhbC5FeGlzdHMgewoJCXBhbmljKCJtZW1iYV9icmlkZ2U6IG5vIGxpc3RpbmcgIiArIHBrZ1BhdGgpCgl9CglhcmdzIDo9IGRhb2F1dGguTmV3KCkuU3RyKG9wKS5TdHIocGtnUGF0aCkuU3RyKHJlYXNvbikuU3RyKGwuU3RhdHVzKQoJaWYgb3AgPT0gImFwcHJvdmUiIHx8IG9wID09ICJyZXN0b3JlIiB7CgkJYXJncy5TdHIobC5Db250ZW50SGFzaCkKCX0KCWlmIG9wID09ICJjbGVhcmZsYWdzIiB7CgkJa2V5cyA6PSBzaGEyNTYuU3VtMjU2KFtdYnl0ZShsLkNsZWFyS2V5cykpCgkJYXJncy5JbnQoaW50NjQobC5GbGFncykpLlN0cihoZXguRW5jb2RlVG9TdHJpbmcoa2V5c1s6XSkpCgl9CglyZXR1cm4gbmV3UGxhbihhcHBBcHBzdG9yZSwgIkN1cmF0ZSIsIGFyZ3MsIGFwcEFwcHN0b3JlKyIvbC8iK3BrZ1BhdGgsIGdvdi5Sb3V0aW5lKQp9CgpmdW5jIFNldFJlZ2lzdHJhdGlvbkZlZShjdXIgcmVhbG0sIHBpZCB1aW50NjQsIGZlZSBpbnQ2NCkgewoJYXBwcm92ZShjdXIsIHBpZCwgcmVnaXN0cmF0aW9uRmVlUGxhbihmZWUpKQoJYXBwc3RvcmUuU2V0UmVnaXN0cmF0aW9uRmVlKGNyb3NzKGN1ciksIGZlZSkKfQoKZnVuYyByZWdpc3RyYXRpb25GZWVQbGFuKGZlZSBpbnQ2NCkgcGxhbiB7CglpZiBmZWUgPCAwIHx8IGZlZSA+IGFwcHN0b3JlLk1heFJlZ2lzdHJhdGlvbkZlZSB7CgkJcGFuaWMoIm1lbWJhX2JyaWRnZTogdGhlIHJlZ2lzdHJhdGlvbiBmZWUgaXMgMCB0byAiICsgc3RyY29udi5Gb3JtYXRJbnQoYXBwc3RvcmUuTWF4UmVnaXN0cmF0aW9uRmVlLCAxMCkgKyAiIHVnbm90IikKCX0KCXJldHVybiBuZXdQbGFuKGFwcEFwcHN0b3JlLCAiU2V0UmVnaXN0cmF0aW9uRmVlIiwgZGFvYXV0aC5OZXcoKS5JbnQoZmVlKS5JbnQoYXBwc3RvcmUuR2V0UmVnaXN0cmF0aW9uRmVlKCkpLCBhcHBBcHBzdG9yZSwgZ292LkZpbmFuY2lhbCkKfQoKLy8gU2V0VHJlYXN1cnkgcG9pbnRzIHRoZSBmZWVzIG9mIG1hcmtldF9jb25maWcgKHdoaWNoIGVzY3JvdyBhbHNvIHBheXMKLy8gaW50bykgb3Igb2YgdGhlIEFwcCBTdG9yZSBhdCBhZGRyLgpmdW5jIFNldFRyZWFzdXJ5KGN1ciByZWFsbSwgcGlkIHVpbnQ2NCwgYXBwIHN0cmluZywgYWRkciBhZGRyZXNzKSB7CglhcHByb3ZlKGN1ciwgcGlkLCB0cmVhc3VyeVBsYW4oYXBwLCBhZGRyKSkKCWlmIGFwcCA9PSBhcHBNYXJrZXQgewoJCW1hcmtldC5TZXRUcmVhc3VyeShjcm9zcyhjdXIpLCBhZGRyKQoJfSBlbHNlIHsKCQlhcHBzdG9yZS5TZXRUcmVhc3VyeShjcm9zcyhjdXIpLCBhZGRyKQoJfQp9CgpmdW5jIHRyZWFzdXJ5UGxhbihhcHAgc3RyaW5nLCBhZGRyIGFkZHJlc3MpIHBsYW4gewoJdmFyIGN1cnJlbnQgYWRkcmVzcwoJc3dpdGNoIGFwcCB7CgljYXNlIGFwcE1hcmtldDoKCQljdXJyZW50ID0gbWFya2V0LkdldFRyZWFzdXJ5KCkKCWNhc2UgYXBwQXBwc3RvcmU6CgkJY3VycmVudCA9IGFwcHN0b3JlLkdldFRyZWFzdXJ5KCkKCWRlZmF1bHQ6CgkJcGFuaWMoIm1lbWJhX2JyaWRnZTogIiArIGFwcCArICIgaGFzIG5vIHRyZWFzdXJ5IikKCX0KCXJldHVybiBuZXdQbGFuKGFwcCwgIlNldFRyZWFzdXJ5IiwgZGFvYXV0aC5OZXcoKS5BZGRyKGFyZyhhZGRyKSkuU3RyKHN0cmluZyhjdXJyZW50KSksIGFwcCwgZ292LkNyaXRpY2FsKQp9CgovLyDilIDilIAgTWFya2V0IGNvbmZpZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmZ1bmMgU2V0RmVlKGN1ciByZWFsbSwgcGlkIHVpbnQ2NCwgbGFuZSBzdHJpbmcsIGJwcyBpbnQ2NCkgewoJYXBwcm92ZShjdXIsIHBpZCwgZmVlUGxhbihsYW5lLCBicHMpKQoJbWFya2V0LlNldEZlZUJQUyhjcm9zcyhjdXIpLCBsYW5lLCBicHMpCn0KCmZ1bmMgZmVlUGxhbihsYW5lIHN0cmluZywgYnBzIGludDY0KSBwbGFuIHsKCWlmIGxhbmUgPT0gIiIgfHwgYnBzIDwgMCB8fCBicHMgPiBtYXJrZXQuTWF4RmVlQlBTIHsKCQlwYW5pYygibWVtYmFfYnJpZGdlOiBhIGZlZSBuYW1lcyBpdHMgbGFuZSBhbmQgaXMgMCB0byAiICsgc3RyY29udi5Gb3JtYXRJbnQobWFya2V0Lk1heEZlZUJQUywgMTApICsgIiBicHMiKQoJfQoJcmV0dXJuIG5ld1BsYW4oYXBwTWFya2V0LCAiU2V0RmVlIiwgZGFvYXV0aC5OZXcoKS5TdHIobGFuZSkuSW50KGJwcykuSW50KGludDY0KG1hcmtldC5HZXRGZWVCUFMobGFuZSkpKSwgYXBwTWFya2V0LCBnb3YuRmluYW5jaWFsKQp9CgovLyDilIDilIAgRXNjcm93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKLy8gUmVzb2x2ZURpc3B1dGUgc2V0dGxlcyBvbmUgZGlzcHV0ZWQgbWlsZXN0b25lOiByZWZ1bmQgcGF5cyB0aGUgY2xpZW50Ci8vIHRoZSB3aG9sZSBhbW91bnQsIG90aGVyd2lzZSB0aGUgZnJlZWxhbmNlciBpcyBwYWlkIGxlc3MgdGhlIGZlZS4gRWl0aGVyCi8vIHdheSBlc2Nyb3cgcGF5cyBvdXQgYXQgbW9zdCB0aGUgbWlsZXN0b25lJ3MgYW1vdW50LCB3aGljaCBpcyBjaGVja2VkLiBBCi8vIG1pbGVzdG9uZSBpcyBkaXNwdXRlZCBhdCBtb3N0IG9uY2UgKGEgcmVzb2x1dGlvbiBpcyBmaW5hbCk7IGJpbmRpbmcgdGhlCi8vIGhlaWdodCBvZiB0aGF0IGRpc3B1dGUgbWVhbnMgbm8gYXBwcm92YWwgY2FuIGJlIHZvdGVkIGJlZm9yZSBpdCBleGlzdHMuCmZ1bmMgUmVzb2x2ZURpc3B1dGUoY3VyIHJlYWxtLCBwaWQgdWludDY0LCBjb250cmFjdElEIHN0cmluZywgbWlsZXN0b25lIGludCwgcmVmdW5kIGJvb2wpIHsKCXAsIGFtb3VudCA6PSBkaXNwdXRlUGxhbihjb250cmFjdElELCBtaWxlc3RvbmUsIHJlZnVuZCkKCWFwcHJvdmUoY3VyLCBwaWQsIHApCgliZWZvcmUgOj0gZXNjcm93QmFsYW5jZSgpCgllc2Nyb3cuUmVzb2x2ZURpc3B1dGUoY3Jvc3MoY3VyKSwgY29udHJhY3RJRCwgbWlsZXN0b25lLCByZWZ1bmQpCglpZiBwYWlkIDo9IGJlZm9yZSAtIGVzY3Jvd0JhbGFuY2UoKTsgcGFpZCA8IDAgfHwgcGFpZCA+IGFtb3VudCB7CgkJcGFuaWMoIm1lbWJhX2JyaWRnZTogZXNjcm93IHBhaWQgb3V0IG1vcmUgdGhhbiB0aGUgbWlsZXN0b25lIikKCX0KfQoKLy8gZGlzcHV0ZVBsYW4gcmV0dXJucyB0aGUgYXBwcm92YWwgYW5kIHRoZSBtaWxlc3RvbmUncyBhbW91bnQuCmZ1bmMgZGlzcHV0ZVBsYW4oY29udHJhY3RJRCBzdHJpbmcsIG1pbGVzdG9uZSBpbnQsIHJlZnVuZCBib29sKSAocGxhbiwgaW50NjQpIHsKCWMgOj0gZXNjcm93LkdldEdvdmVybmFuY2VDb250cmFjdChjb250cmFjdElEKQoJaWYgIWMuRXhpc3RzIHx8IG1pbGVzdG9uZSA8IDAgfHwgbWlsZXN0b25lID49IGMuQ291bnQgewoJCXBhbmljKCJtZW1iYV9icmlkZ2U6IG5vIHN1Y2ggY29udHJhY3QgbWlsZXN0b25lIikKCX0KCW0gOj0gYy5NaWxlc3RvbmVzW21pbGVzdG9uZV0KCWlmIG0uU3RhdHVzICE9ICJkaXNwdXRlZCIgewoJCXBhbmljKCJtZW1iYV9icmlkZ2U6IG1pbGVzdG9uZSBpcyAiICsgbS5TdGF0dXMgKyAiLCBub3QgZGlzcHV0ZWQiKQoJfQoJYXJncyA6PSBkYW9hdXRoLk5ldygpLlN0cihjb250cmFjdElEKS5JbnQoaW50NjQobWlsZXN0b25lKSkuQm9vbChyZWZ1bmQpLgoJCVN0cihtLlN0YXR1cykuU3RyKG0uUHJlRGlzcHV0ZVN0YXR1cykuSW50KG0uQW1vdW50KS5JbnQobS5EaXNwdXRlZEF0KQoJaWYgIXJlZnVuZCB7CgkJdGVybXMgOj0gZXNjcm93LkdldEdvdmVybmFuY2VGZWVUZXJtcygpCgkJYXJncy5JbnQodGVybXMuRWZmZWN0aXZlQlBTKS5TdHIoc3RyaW5nKHRlcm1zLkVmZmVjdGl2ZVRyZWFzdXJ5KSkKCX0KCXJldHVybiBuZXdQbGFuKGFwcEVzY3JvdywgIlJlc29sdmVEaXNwdXRlIiwgYXJncywgYXBwRXNjcm93KyIvYy8iK2NvbnRyYWN0SUQrIi9tLyIrc3RyY29udi5JdG9hKG1pbGVzdG9uZSksIGdvdi5GaW5hbmNpYWwpLCBtLkFtb3VudAp9CgpmdW5jIGVzY3Jvd0JhbGFuY2UoKSBpbnQ2NCB7CgkvLyBPbmUgZGVub20gb25seToganVuayBkZW5vbXMgc2VudCB0byBlc2Nyb3cgY29zdCBub3RoaW5nIHRvIHJlYWQgcGFzdC4KCXJldHVybiBiYW5rZXIuTmV3UmVhZG9ubHlCYW5rZXIoKS5HZXRDb2luKGNoYWluLlBhY2thZ2VBZGRyZXNzKCJnbm8ubGFuZC9yL3NhbWNyZXcvIithcHBFc2Nyb3cpLCAidWdub3QiKQp9CgovLyBQcm9wb3NlRmVlUmVjaXBpZW50IHN0YWdlcyBlc2Nyb3cncyBmYWxsYmFjayBmZWUgcmVjaXBpZW50LCB1c2VkIG9ubHkgd2hlbgovLyBtYXJrZXRfY29uZmlnJ3MgdHJlYXN1cnkgaXMgdW51c2FibGUuCmZ1bmMgUHJvcG9zZUZlZVJlY2lwaWVudChjdXIgcmVhbG0sIHBpZCB1aW50NjQsIGFkZHIgYWRkcmVzcykgewoJYXBwcm92ZShjdXIsIHBpZCwgZmVlUmVjaXBpZW50UGxhbihhZGRyKSkKCWVzY3Jvdy5Qcm9wb3NlRmVlUmVjaXBpZW50KGNyb3NzKGN1ciksIGFkZHIpCn0KCmZ1bmMgZmVlUmVjaXBpZW50UGxhbihhZGRyIGFkZHJlc3MpIHBsYW4gewoJcmV0dXJuIG5ld1BsYW4oYXBwRXNjcm93LCAiUHJvcG9zZUZlZVJlY2lwaWVudCIsIGRhb2F1dGguTmV3KCkuQWRkcihhcmcoYWRkcikpLgoJCVN0cihlc2Nyb3cuR2V0RmVlUmVjaXBpZW50KCkpLlN0cihlc2Nyb3cuR2V0UGVuZGluZ0ZlZVJlY2lwaWVudCgpKSwgYXBwRXNjcm93LCBnb3YuQ3JpdGljYWwpCn0KCmZ1bmMgQ2FuY2VsRmVlUmVjaXBpZW50KGN1ciByZWFsbSwgcGlkIHVpbnQ2NCkgewoJYXBwcm92ZShjdXIsIHBpZCwgY2FuY2VsRmVlUmVjaXBpZW50UGxhbigpKQoJZXNjcm93LkNhbmNlbEZlZVJlY2lwaWVudFByb3Bvc2FsKGNyb3NzKGN1cikpCn0KCmZ1bmMgY2FuY2VsRmVlUmVjaXBpZW50UGxhbigpIHBsYW4gewoJcGVuZGluZyA6PSBlc2Nyb3cuR2V0UGVuZGluZ0ZlZVJlY2lwaWVudCgpCglpZiBwZW5kaW5nID09ICIiIHsKCQlwYW5pYygibWVtYmFfYnJpZGdlOiBubyBmZWUgcmVjaXBpZW50IHN0YWdlZCIpCgl9CglyZXR1cm4gbmV3UGxhbihhcHBFc2Nyb3csICJDYW5jZWxGZWVSZWNpcGllbnQiLCBkYW9hdXRoLk5ldygpLlN0cihwZW5kaW5nKSwgYXBwRXNjcm93LCBnb3YuRmluYW5jaWFsKQp9CgovLyDilIDilIAgUmV2aWV3cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmZ1bmMgSGlkZVJldmlldyhjdXIgcmVhbG0sIHBpZCB1aW50NjQsIGlkIHVpbnQ2NCkgIHsgbW9kZXJhdGUoY3VyLCBwaWQsICJIaWRlUmV2aWV3IiwgaWQpIH0KZnVuYyBIaWRlQ29tbWVudChjdXIgcmVhbG0sIHBpZCB1aW50NjQsIGlkIHVpbnQ2NCkgeyBtb2RlcmF0ZShjdXIsIHBpZCwgIkhpZGVDb21tZW50IiwgaWQpIH0KCi8vIFVuaGlkZSBzaG93cyBhbiBpdGVtIGFnYWluIGFuZCBkaXNtaXNzZXMgaXRzIGZsYWdzLgpmdW5jIFVuaGlkZShjdXIgcmVhbG0sIHBpZCB1aW50NjQsIGlkIHVpbnQ2NCkgeyBtb2RlcmF0ZShjdXIsIHBpZCwgIlVuaGlkZSIsIGlkKSB9CgovLyBtb2RlcmF0ZSBiaW5kcyB0aGUgaXRlbSdzIGtpbmQgYW5kIHZpc2liaWxpdHk7IFVuaGlkZSwgd2hpY2ggc2hvd3MgdGhlCi8vIGl0ZW0gYWdhaW4sIGFsc28gYmluZHMgaXRzIGNvbnRlbnQsIHNvIGFuIGF1dGhvciBlZGl0aW5nIGl0IGNhbiBuZWl0aGVyCi8vIHZvaWQgYSBoaWRlIHZvdGUgbm9yIHNsaXAgbmV3IHRleHQgcGFzdCBhbiB1bmhpZGUgdm90ZS4KZnVuYyBtb2RlcmF0ZShjdXIgcmVhbG0sIHBpZCB1aW50NjQsIG9wIHN0cmluZywgaWQgdWludDY0KSB7CglhcHByb3ZlKGN1ciwgcGlkLCBtb2RlcmF0aW9uUGxhbihvcCwgaWQpKQoJc3dpdGNoIG9wIHsKCWNhc2UgIkhpZGVSZXZpZXciOgoJCXJldmlld3MuSGlkZVJldmlldyhjcm9zcyhjdXIpLCBpZCkKCWNhc2UgIkhpZGVDb21tZW50IjoKCQlyZXZpZXdzLkhpZGVDb21tZW50KGNyb3NzKGN1ciksIGlkKQoJZGVmYXVsdDoKCQlyZXZpZXdzLlVuaGlkZShjcm9zcyhjdXIpLCBpZCkKCX0KfQoKZnVuYyBtb2RlcmF0aW9uUGxhbihvcCBzdHJpbmcsIGlkIHVpbnQ2NCkgcGxhbiB7CglzIDo9IHJldmlld3MuR2V0TW9kZXJhdGlvblN0YXRlKGlkKQoJc3dpdGNoIHsKCWNhc2Ugcy5JRCA9PSAwOgoJCS8vIElkcyBhcmUgcHJlZGljdGFibGU6IGFuIGFwcHJvdmFsIGZvciBhbiBpdGVtIG5vdCBwb3N0ZWQgeWV0IHdvdWxkIGhpZGUgd2hhdGV2ZXIgdGFrZXMgdGhlIGlkLgoJCXBhbmljKCJtZW1iYV9icmlkZ2U6IG5vIHJldmlldyBvciBjb21tZW50ICIgKyBzdHJjb252LkZvcm1hdFVpbnQoaWQsIDEwKSkKCWNhc2Ugb3AgPT0gIkhpZGVSZXZpZXciICYmICFzLlJldmlldzoKCQlwYW5pYygibWVtYmFfYnJpZGdlOiBpdGVtICIgKyBzdHJjb252LkZvcm1hdFVpbnQoaWQsIDEwKSArICIgaXMgYSBjb21tZW50LCBub3QgYSByZXZpZXciKQoJY2FzZSBvcCA9PSAiSGlkZUNvbW1lbnQiICYmIHMuUmV2aWV3OgoJCXBhbmljKCJtZW1iYV9icmlkZ2U6IGl0ZW0gIiArIHN0cmNvbnYuRm9ybWF0VWludChpZCwgMTApICsgIiBpcyBhIHJldmlldywgbm90IGEgY29tbWVudCIpCgljYXNlIG9wICE9ICJVbmhpZGUiICYmIChzLkhpZGRlbiB8fCBzLkRlbGV0ZWQpOgoJCXBhbmljKCJtZW1iYV9icmlkZ2U6IGFscmVhZHkgaGlkZGVuIG9yIGRlbGV0ZWQiKQoJY2FzZSBvcCA9PSAiVW5oaWRlIiAmJiAhcy5IaWRkZW4gJiYgIXMuRmxhZ2dlZDoKCQlwYW5pYygibWVtYmFfYnJpZGdlOiBuZWl0aGVyIGhpZGRlbiBub3IgZmxhZ2dlZCIpCgl9CgkvLyBUaGUgYXV0aG9yIGFuZCBjcmVhdGlvbiB0aW1lIHBpbiB0aGUgaXRlbSBpdHNlbGYuCglhcmdzIDo9IGRhb2F1dGguTmV3KCkuVWludChpZCkuQm9vbChzLlJldmlldykuQm9vbChzLkhpZGRlbikuQm9vbChzLkRlbGV0ZWQpLkFkZHIocy5BdXRob3IpLkludChzLkNyZWF0ZWRBdCkKCWlmIG9wID09ICJVbmhpZGUiIHsKCQkvLyBUaGUgdGV4dCBpcyBib3VuZCBieSBpdHMgaGFzaCBhbmQgZWRpdCBoZWlnaHQuIFVuaGlkZSBhbHNvIGRpc21pc3NlcwoJCS8vIGZsYWdzOyB0aGUgZmxhZ2dlZCBiaXQgaXMgYm91bmQsIG5vdCBhIGNvdW50IChyZXZpZXdzX3YyIGV4cG9zZXMgbm9uZSksCgkJLy8gc28gYSBmbGFnIGFkZGVkIGFmdGVyIHRoZSB2b3RlIHRvIGFuIGl0ZW0gYWxyZWFkeSBmbGFnZ2VkIGlzCgkJLy8gZGlzbWlzc2VkIHdpdGggdGhlIG90aGVycy4KCQlhcmdzLlN0cihzLkJvZHlIYXNoKS5JbnQocy5FZGl0ZWRBdCkuQm9vbChzLkZsYWdnZWQpCgl9CglyZXR1cm4gbmV3UGxhbihhcHBSZXZpZXdzLCBvcCwgYXJncywgYXBwUmV2aWV3cysiL2kvIitzdHJjb252LkZvcm1hdFVpbnQoaWQsIDEwKSwgZ292LlJvdXRpbmUpCn0KCi8vIOKUgOKUgCBRdWVzdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgovLyBTZXRRdWVzdFNpZ25lciByb3RhdGVzIHRoZSBrZXkgZXZlcnkgcXVlc3Qgdm91Y2hlciBpcyBjaGVja2VkIGFnYWluc3QuCmZ1bmMgU2V0UXVlc3RTaWduZXIoY3VyIHJlYWxtLCBwaWQgdWludDY0LCBwdWJLZXlIZXggc3RyaW5nKSB7CglhcHByb3ZlKGN1ciwgcGlkLCBzaWduZXJQbGFuKHB1YktleUhleCkpCglxdWVzdC5TZXRTaWduZXIoY3Jvc3MoY3VyKSwgcHViS2V5SGV4KQp9CgpmdW5jIHNpZ25lclBsYW4ocHViS2V5SGV4IHN0cmluZykgcGxhbiB7CglpZiBsZW4ocHViS2V5SGV4KSAhPSA2NCB8fCBzdHJpbmdzLlRyaW0ocHViS2V5SGV4LCAiMDEyMzQ1Njc4OWFiY2RlZiIpICE9ICIiIHx8IHB1YktleUhleCA9PSBxdWVzdC5HZXRTaWduZXIoKSB7CgkJcGFuaWMoIm1lbWJhX2JyaWRnZTogYSBuZXcgc2lnbmVyIGlzIDY0IGxvd2VyY2FzZSBoZXggZGlnaXRzIikKCX0KCXJldHVybiBuZXdQbGFuKGFwcFF1ZXN0LCAiU2V0U2lnbmVyIiwgZGFvYXV0aC5OZXcoKS5TdHIocHViS2V5SGV4KS5TdHIocXVlc3QuR2V0U2lnbmVyKCkpLCBhcHBRdWVzdCwgZ292LkNyaXRpY2FsKQp9CgovLyDilIDilIAgQ2hhbm5lbHMgYW5kIGZlZWRiYWNrIG1lbWJlcnNoaXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgovLyBBZGRNZW1iZXIgYWRkcyBhIG5ldyBtZW1iZXI7IGl0IG5ldmVyIHJld3JpdGVzIGFuIGV4aXN0aW5nIG1lbWJlcidzIHJvbGVzLgpmdW5jIEFkZE1lbWJlcihjdXIgcmVhbG0sIHBpZCB1aW50NjQsIGFwcCBzdHJpbmcsIGFkZHIgYWRkcmVzcywgcm9sZXMgc3RyaW5nKSB7CgltZW1iZXIoY3VyLCBwaWQsIGFwcCwgIkFkZE1lbWJlciIsIGFkZHIsIHJvbGVzKQp9CgpmdW5jIFJlbW92ZU1lbWJlcihjdXIgcmVhbG0sIHBpZCB1aW50NjQsIGFwcCBzdHJpbmcsIGFkZHIgYWRkcmVzcykgewoJbWVtYmVyKGN1ciwgcGlkLCBhcHAsICJSZW1vdmVNZW1iZXIiLCBhZGRyLCAiIikKfQoKZnVuYyBTZXRSb2xlcyhjdXIgcmVhbG0sIHBpZCB1aW50NjQsIGFwcCBzdHJpbmcsIGFkZHIgYWRkcmVzcywgcm9sZXMgc3RyaW5nKSB7CgltZW1iZXIoY3VyLCBwaWQsIGFwcCwgIlNldFJvbGVzIiwgYWRkciwgcm9sZXMpCn0KCmZ1bmMgbWVtYmVyKGN1ciByZWFsbSwgcGlkIHVpbnQ2NCwgYXBwLCBvcCBzdHJpbmcsIHdobyBhZGRyZXNzLCByb2xlcyBzdHJpbmcpIHsKCWFwcHJvdmUoY3VyLCBwaWQsIG1lbWJlclBsYW4oYXBwLCBvcCwgd2hvLCByb2xlcykpCglzd2l0Y2ggewoJY2FzZSBhcHAgPT0gYXBwQ2hhbm5lbHMgJiYgb3AgPT0gIkFkZE1lbWJlciI6CgkJY2hhbm5lbHMuQWRkTWVtYmVyKGNyb3NzKGN1ciksIHdobywgcm9sZXMpCgljYXNlIGFwcCA9PSBhcHBDaGFubmVscyAmJiBvcCA9PSAiUmVtb3ZlTWVtYmVyIjoKCQljaGFubmVscy5SZW1vdmVNZW1iZXIoY3Jvc3MoY3VyKSwgd2hvKQoJY2FzZSBhcHAgPT0gYXBwQ2hhbm5lbHM6CgkJY2hhbm5lbHMuVXBkYXRlTWVtYmVyUm9sZXMoY3Jvc3MoY3VyKSwgd2hvLCByb2xlcykKCWNhc2Ugb3AgPT0gIkFkZE1lbWJlciI6CgkJZmVlZGJhY2suQWRkTWVtYmVyKGNyb3NzKGN1ciksIHdobywgcm9sZXMpCgljYXNlIG9wID09ICJSZW1vdmVNZW1iZXIiOgoJCWZlZWRiYWNrLlJlbW92ZU1lbWJlcihjcm9zcyhjdXIpLCB3aG8pCglkZWZhdWx0OgoJCWZlZWRiYWNrLlVwZGF0ZU1lbWJlclJvbGVzKGNyb3NzKGN1ciksIHdobywgcm9sZXMpCgl9Cn0KCmZ1bmMgbWVtYmVyUGxhbihhcHAsIG9wIHN0cmluZywgd2hvIGFkZHJlc3MsIHJvbGVzIHN0cmluZykgcGxhbiB7CglpZiBvcCA9PSAiUmVtb3ZlTWVtYmVyIiB7CgkJY2Fub25pY2FsKHdobykgLy8gYSBzdGFsZSBtZW1iZXJzaGlwIG9mIGEgcHJvdGVjdGVkIHJlYWxtIGNhbiBiZSByZW1vdmVkCgl9IGVsc2UgewoJCWFyZyh3aG8pCgl9Cgl2YXIgcmV2aXNpb24gdWludDY0Cgl2YXIgY3VycmVudCBzdHJpbmcKCXN3aXRjaCBhcHAgewoJY2FzZSBhcHBDaGFubmVsczoKCQlyZXZpc2lvbiwgY3VycmVudCA9IGNoYW5uZWxzLkdldE1lbWJlcnNoaXBSZXZpc2lvbigpLCBjaGFubmVscy5HZXRNZW1iZXJSb2xlcyh3aG8pCgljYXNlIGFwcEZlZWRiYWNrOgoJCXJldmlzaW9uLCBjdXJyZW50ID0gZmVlZGJhY2suR2V0TWVtYmVyc2hpcFJldmlzaW9uKCksIGZlZWRiYWNrLkdldE1lbWJlclJvbGVzKHdobykKCWRlZmF1bHQ6CgkJcGFuaWMoIm1lbWJhX2JyaWRnZTogIiArIGFwcCArICIgaGFzIG5vIG1lbWJlcnMiKQoJfQoJaWYgKG9wID09ICJBZGRNZW1iZXIiKSAhPSAoY3VycmVudCA9PSAiIikgfHwgKG9wICE9ICJSZW1vdmVNZW1iZXIiICYmICF2YWxpZFJvbGVzKHJvbGVzKSkgewoJCXBhbmljKCJtZW1iYV9icmlkZ2U6IGFkZCBhIG5vbi1tZW1iZXIsIGNoYW5nZSBhIG1lbWJlciwgcm9sZXMgYW4gb3JkZXJlZCBzdWJzZXQgb2YgYWRtaW4sZGV2LG9wcyxtZW1iZXIiKQoJfQoJcmV0dXJuIG5ld1BsYW4oYXBwLCBvcCwgZGFvYXV0aC5OZXcoKS5BZGRyKHdobykuU3RyKHJvbGVzKS5VaW50KHJldmlzaW9uKS5TdHIoY3VycmVudCksIGFwcCwgZ292LkNyaXRpY2FsKQp9CgovLyB2YWxpZFJvbGVzIGFjY2VwdHMgYSBub24tZW1wdHksIG9yZGVyZWQsIGR1cGxpY2F0ZS1mcmVlIHN1YnNldCBvZgovLyBhZG1pbixkZXYsb3BzLG1lbWJlci4KZnVuYyB2YWxpZFJvbGVzKHIgc3RyaW5nKSBib29sIHsKCW5hbWVzIDo9IFtdc3RyaW5neyJhZG1pbiIsICJkZXYiLCAib3BzIiwgIm1lbWJlciJ9CgluZXh0IDo9IDAKCWZvciBfLCB4IDo9IHJhbmdlIHN0cmluZ3MuU3BsaXQociwgIiwiKSB7CgkJZm9yIG5leHQgPCBsZW4obmFtZXMpICYmIG5hbWVzW25leHRdICE9IHggewoJCQluZXh0KysKCQl9CgkJaWYgbmV4dCA9PSBsZW4obmFtZXMpIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJCW5leHQrKwoJfQoJcmV0dXJuIHRydWUKfQoKLy8gQ3JlYXRlQ2hhbm5lbCBhZGRzIGEgY2hhbm5lbC4gQ2hhbm5lbHMgYXJlIHBlcm1hbmVudCAoYXQgbW9zdCAyMCkuCmZ1bmMgQ3JlYXRlQ2hhbm5lbChjdXIgcmVhbG0sIHBpZCB1aW50NjQsIGFwcCwgbmFtZSwgZGVzY3JpcHRpb24sIGN0eXBlIHN0cmluZykgewoJYXBwcm92ZShjdXIsIHBpZCwgY2hhbm5lbFBsYW4oYXBwLCBuYW1lLCBkZXNjcmlwdGlvbiwgY3R5cGUpKQoJaWYgYXBwID09IGFwcENoYW5uZWxzIHsKCQljaGFubmVscy5DcmVhdGVDaGFubmVsKGNyb3NzKGN1ciksIG5hbWUsIGRlc2NyaXB0aW9uLCBjdHlwZSkKCX0gZWxzZSB7CgkJZmVlZGJhY2suQ3JlYXRlQ2hhbm5lbChjcm9zcyhjdXIpLCBuYW1lLCBkZXNjcmlwdGlvbiwgY3R5cGUpCgl9Cn0KCmZ1bmMgY2hhbm5lbFBsYW4oYXBwLCBuYW1lLCBkZXNjcmlwdGlvbiwgY3R5cGUgc3RyaW5nKSBwbGFuIHsKCWlmIGN0eXBlICE9ICJ0ZXh0IiAmJiBjdHlwZSAhPSAiYW5ub3VuY2VtZW50cyIgJiYgY3R5cGUgIT0gInJlYWRvbmx5IiB8fCBkZXNjcmlwdGlvbiA9PSAiIiB8fCBsZW4oZGVzY3JpcHRpb24pID4gMjAwIHx8ICFkYW9hdXRoLlZhbGlkVGV4dChkZXNjcmlwdGlvbikgewoJCXBhbmljKCJtZW1iYV9icmlkZ2U6IHR5cGUgdGV4dCwgYW5ub3VuY2VtZW50cyBvciByZWFkb25seTsgZGVzY3JpcHRpb24gMS0yMDAgcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3RlcnMiKQoJfQoJdmFyIGNvdW50IGludAoJdmFyIGV4aXN0cyBib29sCglzd2l0Y2ggYXBwIHsKCWNhc2UgYXBwQ2hhbm5lbHM6CgkJY291bnQsIGV4aXN0cywgXywgXywgXywgXyA9IGNoYW5uZWxzLkdldENoYW5uZWxTdGF0ZShuYW1lKQoJY2FzZSBhcHBGZWVkYmFjazoKCQljb3VudCwgZXhpc3RzLCBfLCBfLCBfLCBfID0gZmVlZGJhY2suR2V0Q2hhbm5lbFN0YXRlKG5hbWUpCglkZWZhdWx0OgoJCXBhbmljKCJtZW1iYV9icmlkZ2U6ICIgKyBhcHAgKyAiIGhhcyBubyBjaGFubmVscyIpCgl9CglpZiBleGlzdHMgewoJCXBhbmljKCJtZW1iYV9icmlkZ2U6IGNoYW5uZWwgZXhpc3RzIikKCX0KCWlmICFjaGFubmVsTmFtZShuYW1lKSB8fCBjb3VudCA+PSAyMCB7CgkJcGFuaWMoIm1lbWJhX2JyaWRnZTogYSBjaGFubmVsIG5hbWUgaXMgMS01MCBvZiBhLXosIDAtOSBvciAtLCBhbmQgYW4gYXBwIGhvbGRzIGF0IG1vc3QgMjAgY2hhbm5lbHMiKQoJfQoJcmV0dXJuIG5ld1BsYW4oYXBwLCAiQ3JlYXRlQ2hhbm5lbCIsIGRhb2F1dGguTmV3KCkuU3RyKG5hbWUpLlN0cihkZXNjcmlwdGlvbikuU3RyKGN0eXBlKS5JbnQoaW50NjQoY291bnQpKSwgYXBwLCBnb3YuQ3JpdGljYWwpCn0KCi8vIGNoYW5uZWxOYW1lIGlzIHRoZSBhcHBzJyBvd24gY2hhbm5lbC1uYW1lIHJ1bGUuCmZ1bmMgY2hhbm5lbE5hbWUobmFtZSBzdHJpbmcpIGJvb2wgewoJaWYgbmFtZSA9PSAiIiB8fCBsZW4obmFtZSkgPiA1MCB7CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gc3RyaW5ncy5UcmltKG5hbWUsICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktIikgPT0gIiIKfQoavosBCgpicmlkZ2UuZ25vEq6LAS8vIFBhY2thZ2UgbWVtYmFfYnJpZGdlX3YxIGdvdmVybnMgdGhlIHRlbiBNZW1iYSBhcHBsaWNhdGlvbiByZWFsbXMgcHVibGlzaGVkCi8vIGJlZm9yZSBtZW1iYV9nb3YuIEl0IGJlY29tZXMgZWFjaCBhcHAncyBhZG1pbiB0aHJvdWdoIHRoZSBhcHAncyBvd24KLy8gdHdvLXN0ZXAgaGFuZG92ZXIsIHNvIHRoZSBhcHBzJyBjb2RlIGRvZXMgbm90IGNoYW5nZSwgYW5kIHR1cm5zIG1lbWJhX2dvdgovLyBhcHByb3ZhbHMgaW50byB0aGUgYXBwJ3Mgb3duZXItb25seSBjYWxscy4KLy8KLy8gRXZlcnkgZ292ZXJuZWQgZW50cnlwb2ludCBpcyBhIGRpcmVjdCBjYWxsIGJ5IGEgc2VhdGVkIG1lbWJlci4gSXQgcmVhZHMgdGhlCi8vIGFwcCdzIGxpdmUgcHJlLXN0YXRlLCBlbmNvZGVzIGl0IHdpdGggdGhlIGNhbGwncyBhcmd1bWVudHMgYW5kIHRoZSBhcHAncwovLyB0ZW51cmUgKGhvdyBtYW55IHRpbWVzIHRoZSBicmlkZ2UgaGFzIGFjY2VwdGVkIGl0KSwgYW5kIGNvbnN1bWVzIGV4YWN0bHkKLy8gdGhhdCBhcHByb3ZhbCBmcm9tIG1lbWJhX2dvdiBiZWZvcmUgY2FsbGluZyB0aGUgYXBwOiBhbiBhcHByb3ZhbCB2b3RlZCBvbgovLyBhbm90aGVyIHN0YXRlLCBhcHAsIGFjdGlvbiwgYXJndW1lbnQgb3IgdGVudXJlIG5ldmVyIG1hdGNoZXMuIEFjdGlvbiBpZHMKLy8gYXJlICI8YXBwPi48T3A+IjsgdGhlIGludmFsaWRhdGlvbiBzY29wZSBpcyB0aGUgYXBwLCBvciBhbiBvYmplY3Qgb2YgaXQKLy8gd2hlcmUgYWN0aW9ucyBhcmUgaW5kZXBlbmRlbnQuCi8vCi8vIEFjY2VwdCwgRXhwaXJlUGF1c2UgYW5kIHRoZSByZWFkcyBuZWVkIG5vIHZvdGUuIEVtZXJnZW5jeVBhdXNlIG5lZWRzIGEKLy8gc2VhdGVkIG1lbWJlciwgbm8gdm90ZSwgYW5kIGV4cGlyZXMgYnkgaXRzZWxmLiBBcHByb3ZhbCB0ZWxscyBhIHByb3Bvc2VyCi8vIGV4YWN0bHkgd2hhdCBhbiBlbnRyeXBvaW50IGNhbGwgd291bGQgY29uc3VtZSwgZnJvbSB0aGUgc2FtZSBjb2RlLgpwYWNrYWdlIG1lbWJhX2JyaWRnZV92MQoKaW1wb3J0ICgKCSJjaGFpbiIKCSJzdHJjb252IgoJInRpbWUiCgoJImduby5sYW5kL3Avc2FtY3Jldy9kYW9hdXRoIgoJZ292ICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfZ292IgoJZXNjcm93ICJnbm8ubGFuZC9yL3NhbWNyZXcvZXNjcm93X3Y0IgoJYmFkZ2VzICJnbm8ubGFuZC9yL3NhbWNyZXcvZ25vYnVpbGRlcnNfYmFkZ2VzX3YyIgoJYXBwc3RvcmUgImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9hcHBzdG9yZV92MyIKCWFyY2FkZSAiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX2FyY2FkZV9sZWFkZXJib2FyZF92MSIKCWNoYW5uZWxzICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfZGFvX2NoYW5uZWxzX3YyIgoJZmVlZCAiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX2ZlZWRfdjEiCglmZWVkYmFjayAiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX2ZlZWRiYWNrX3YyIgoJbWFya2V0ICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfbWFya2V0X2NvbmZpZyIKCXF1ZXN0ICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfcXVlc3RfYXR0ZXN0YXRpb25fdjEiCglyZXZpZXdzICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfcmV2aWV3c192MiIKKQoKY29uc3QgKAoJYXBwTWFya2V0ICAgPSAibWVtYmFfbWFya2V0X2NvbmZpZyIKCWFwcEVzY3JvdyAgID0gImVzY3Jvd192NCIKCWFwcEFwcHN0b3JlID0gIm1lbWJhX2FwcHN0b3JlX3YzIgoJYXBwUmV2aWV3cyAgPSAibWVtYmFfcmV2aWV3c192MiIKCWFwcFF1ZXN0ICAgID0gIm1lbWJhX3F1ZXN0X2F0dGVzdGF0aW9uX3YxIgoJYXBwQXJjYWRlICAgPSAibWVtYmFfYXJjYWRlX2xlYWRlcmJvYXJkX3YxIgoJYXBwQmFkZ2VzICAgPSAiZ25vYnVpbGRlcnNfYmFkZ2VzX3YyIgoJYXBwRmVlZCAgICAgPSAibWVtYmFfZmVlZF92MSIKCWFwcENoYW5uZWxzID0gIm1lbWJhX2Rhb19jaGFubmVsc192MiIKCWFwcEZlZWRiYWNrID0gIm1lbWJhX2ZlZWRiYWNrX3YyIgopCgp2YXIgKAoJc2VsZiA9IGNoYWluLlBhY2thZ2VBZGRyZXNzKCJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfYnJpZGdlX3YxIikKCWFwcHMgPSBbXXN0cmluZ3thcHBNYXJrZXQsIGFwcEVzY3JvdywgYXBwQXBwc3RvcmUsIGFwcFJldmlld3MsIGFwcFF1ZXN0LCBhcHBBcmNhZGUsIGFwcEJhZGdlcywgYXBwRmVlZCwgYXBwQ2hhbm5lbHMsIGFwcEZlZWRiYWNrfQoJLy8gQWRkcmVzc2VzIG5vIGdvdmVybmVkIGFyZ3VtZW50IG1heSBuYW1lOiBmZWVzIHNlbnQgdGhlcmUgYXJlIGxvY2tlZAoJLy8gZm9yIGdvb2QsIGFuZCBhIHJvbGUgZ2l2ZW4gdG8gb25lIG9mIHRoZW0gaXMgdW51c2FibGUuCglwcm90ZWN0ZWQgICA9IG1hcFthZGRyZXNzXWJvb2x7fQoJdGVudXJlICAgICAgPSBtYXBbc3RyaW5nXXVpbnQ2NHt9ICAgIC8vIGFwcCAtPiB0aW1lcyB0aGUgYnJpZGdlIGFjY2VwdGVkIGl0CglwYXVzZWRVbnRpbCA9IG1hcFtzdHJpbmdddGltZS5UaW1le30gLy8gYXBwIC0+IGVuZCBvZiB0aGUgYnJpZGdlJ3MgcGF1c2UKCWVwaXNvZGVzICAgID0gbWFwW3N0cmluZ111aW50NjR7fSAgICAvLyBhcHAgLT4gcGF1c2VzIHRoZSBicmlkZ2Ugc3RhcnRlZAoJbGFzdFBhdXNlICAgPSBtYXBbc3RyaW5nXXRpbWUuVGltZXt9IC8vIG1lbWJlciBpZCAtPiBsYXN0IGVtZXJnZW5jeSBwYXVzZQopCgpmdW5jIGluaXQoKSB7Cglmb3IgXywgcGF0aCA6PSByYW5nZSBbXXN0cmluZ3sibWVtYmFfYnJpZGdlX3YxIiwgIm1lbWJhX2dvdiIsICJtZW1iYV9kYW8iLCAiZXNjcm93X3YzIn0gewoJCXByb3RlY3RlZFtjaGFpbi5QYWNrYWdlQWRkcmVzcygiZ25vLmxhbmQvci9zYW1jcmV3LyIrcGF0aCldID0gdHJ1ZQoJfQoJZm9yIF8sIGFwcCA6PSByYW5nZSBhcHBzIHsKCQlwcm90ZWN0ZWRbY2hhaW4uUGFja2FnZUFkZHJlc3MoImduby5sYW5kL3Ivc2FtY3Jldy8iK2FwcCldID0gdHJ1ZQoJfQp9CgovLyDilIDilIAgQXV0aG9yaXNhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCi8vIGRpcmVjdCByZXR1cm5zIHRoZSBhY2NvdW50IHRoYXQgY2FsbGVkIHRoZSBicmlkZ2UgZGlyZWN0bHkuCmZ1bmMgZGlyZWN0KGN1ciByZWFsbSkgYWRkcmVzcyB7CglpZiAhY3VyLklzQ3VycmVudCgpIHx8ICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgewoJCXBhbmljKCJtZW1iYV9icmlkZ2U6IGNhbGwgZGlyZWN0bHkgZnJvbSB5b3VyIGFjY291bnQiKQoJfQoJcmV0dXJuIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQp9CgovLyBBIHBsYW4gaXMgdGhlIGFwcHJvdmFsIG9uZSBnb3Zlcm5lZCBjYWxsIG5lZWRzOiBhY3Rpb24gYXBwLm9wLCBhcmdzCi8vIChjb21wbGV0ZWQgYnkgdGhlIGFwcCdzIHRlbnVyZSwgd2hpY2ggdm9pZHMgYXBwcm92YWxzIHZvdGVkIHdoaWxlIHRoZSBhcHAKLy8gd2FzIGF3YXkpLCB0aGUgaW52YWxpZGF0aW9uIHNjb3BlIGFuZCB0aGUgbWluaW11bSBjbGFzcy4KdHlwZSBwbGFuIHN0cnVjdCB7CglhcHAsIG9wIHN0cmluZwoJYXJncyAgICAqZGFvYXV0aC5BcmdzCglzY29wZSAgIHN0cmluZwoJY2xhc3MgICBpbnQKfQoKLy8gbmV3UGxhbiByZWZ1c2VzIGFuIGFwcHJvdmFsIGZvciBhbiBhcHAgdGhlIGJyaWRnZSBkb2VzIG5vdCBnb3Zlcm4gbm93OiBubwovLyBjYWxsIGNvdWxkIGNvbnN1bWUgaXQuCmZ1bmMgbmV3UGxhbihhcHAsIG9wIHN0cmluZywgYXJncyAqZGFvYXV0aC5BcmdzLCBzY29wZSBzdHJpbmcsIGNsYXNzIGludCkgcGxhbiB7CglpZiAhZ292ZXJucyhhcHApIHsKCQlwYW5pYygibWVtYmFfYnJpZGdlOiB0aGUgYnJpZGdlIGRvZXMgbm90IGdvdmVybiAiICsgYXBwKQoJfQoJcmV0dXJuIHBsYW57YXBwLCBvcCwgYXJncywgc2NvcGUsIGNsYXNzfQp9CgpmdW5jIChwIHBsYW4pIHZvdGVkKCkgc3RyaW5nIHsgcmV0dXJuIHAuYXJncy5VaW50KHRlbnVyZVtwLmFwcF0pLlN0cmluZygpIH0KCi8vIGFwcHJvdmUgY29uc3VtZXMgcHJvcG9zYWwgcGlkIGZvciBwOyBtZW1iYV9nb3YgY2hlY2tzIHRoZSBleGVjdXRvciwgdGhlCi8vIGJyaWRnZSdzIGRpcmVjdCBjYWxsZXIsIGlzIGEgc2VhdGVkIG1lbWJlci4KZnVuYyBhcHByb3ZlKGN1ciByZWFsbSwgcGlkIHVpbnQ2NCwgcCBwbGFuKSB7CglleGVjdXRvciA6PSBkaXJlY3QoY3VyKQoJZ292LkNvbnN1bWUoY3Jvc3MoY3VyKSwgcGlkLCBwLmFwcCsiLiIrcC5vcCwgcC52b3RlZCgpLCBwLnNjb3BlLCBwLmNsYXNzLCBleGVjdXRvcikKfQoKLy8gQXBwcm92YWwgcmV0dXJucywgYXMgSlNPTiwgdGhlIHByb3Bvc2FsIGEgZ292ZXJuZWQgZW50cnlwb2ludCBjYWxsIHdvdWxkCi8vIGNvbnN1bWUgaWYgbWFkZSBub3c6IHRhcmdldCB0aGlzIHJlYWxtLCB3aXRoIHRoZSBhY3Rpb24sIGFyZ3MsIHNjb3BlIGFuZAovLyBtaW5pbXVtIGNsYXNzIGdpdmVuLiBjYWxsIGlzIHRoZSBlbnRyeXBvaW50J3MgbmFtZSBhbmQgaXRzIGFyZ3VtZW50cyBhZnRlcgovLyBwaWQsIGRhb2F1dGgtZW5jb2RlZCBpbiBvcmRlciAoc3RyaW5ncyBzOiwgYWRkcmVzc2VzIGE6LCBpbnRlZ2VycyBpOiBvcgovLyB1OiwgYm9vbGVhbnMgYjopLiBJdCByZWZ1c2VzIGEgY2FsbCBpdHMgZW50cnlwb2ludCB3b3VsZCByZWZ1c2UgYmVmb3JlCi8vIHZvdGluZywgYW5kIGhvbGRzIG9ubHkgd2hpbGUgdGhlIHN0YXRlIGl0IGJpbmRzIGlzIHVuY2hhbmdlZC4KZnVuYyBBcHByb3ZhbChjYWxsIHN0cmluZykgc3RyaW5nIHsKCWMgOj0gcGFyc2VDYWxsKGNhbGwpCgl2YXIgcCBwbGFuCglzd2l0Y2ggbmFtZSA6PSBjLnN0cigpOyBuYW1lIHsKCWNhc2UgIlRyYW5zZmVyQWRtaW4iOgoJCXAgPSB0cmFuc2ZlclBsYW4oYy5zdHIoKSwgYy5hZGRyKCkpCgljYXNlICJDYW5jZWxUcmFuc2ZlciI6CgkJcCA9IGNhbmNlbFBsYW4oYy5zdHIoKSkKCWNhc2UgIlNldFBhdXNlIjoKCQlwID0gcGF1c2VQbGFuKGMuc3RyKCksIGMuaTY0KCkpCgljYXNlICJHcmFudCIsICJSZXZva2UiOgoJCXAgPSByb2xlUGxhbihjLnN0cigpLCBjLmFkZHIoKSwgbmFtZSA9PSAiR3JhbnQiKQoJY2FzZSAiQ3VyYXRlIjoKCQlwID0gY3VyYXRlUGxhbihjLnN0cigpLCBjLnN0cigpLCBjLnN0cigpKQoJY2FzZSAiU2V0UmVnaXN0cmF0aW9uRmVlIjoKCQlwID0gcmVnaXN0cmF0aW9uRmVlUGxhbihjLmk2NCgpKQoJY2FzZSAiU2V0VHJlYXN1cnkiOgoJCXAgPSB0cmVhc3VyeVBsYW4oYy5zdHIoKSwgYy5hZGRyKCkpCgljYXNlICJTZXRGZWUiOgoJCXAgPSBmZWVQbGFuKGMuc3RyKCksIGMuaTY0KCkpCgljYXNlICJSZXNvbHZlRGlzcHV0ZSI6CgkJcCwgXyA9IGRpc3B1dGVQbGFuKGMuc3RyKCksIGludChjLmk2NCgpKSwgYy5mbGFnKCkpCgljYXNlICJQcm9wb3NlRmVlUmVjaXBpZW50IjoKCQlwID0gZmVlUmVjaXBpZW50UGxhbihjLmFkZHIoKSkKCWNhc2UgIkNhbmNlbEZlZVJlY2lwaWVudCI6CgkJcCA9IGNhbmNlbEZlZVJlY2lwaWVudFBsYW4oKQoJY2FzZSAiSGlkZVJldmlldyIsICJIaWRlQ29tbWVudCIsICJVbmhpZGUiOgoJCXAgPSBtb2RlcmF0aW9uUGxhbihuYW1lLCBjLnU2NCgpKQoJY2FzZSAiU2V0UXVlc3RTaWduZXIiOgoJCXAgPSBzaWduZXJQbGFuKGMuc3RyKCkpCgljYXNlICJBZGRNZW1iZXIiLCAiU2V0Um9sZXMiOgoJCXAgPSBtZW1iZXJQbGFuKGMuc3RyKCksIG5hbWUsIGMuYWRkcigpLCBjLnN0cigpKQoJY2FzZSAiUmVtb3ZlTWVtYmVyIjoKCQlwID0gbWVtYmVyUGxhbihjLnN0cigpLCBuYW1lLCBjLmFkZHIoKSwgIiIpCgljYXNlICJDcmVhdGVDaGFubmVsIjoKCQlwID0gY2hhbm5lbFBsYW4oYy5zdHIoKSwgYy5zdHIoKSwgYy5zdHIoKSwgYy5zdHIoKSkKCWRlZmF1bHQ6CgkJcGFuaWMoIm1lbWJhX2JyaWRnZTogbm8gZ292ZXJuZWQgZW50cnlwb2ludCAiICsgbmFtZSkKCX0KCWMuZG9uZSgpCglyZXR1cm4gYHsidGFyZ2V0IjoiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX2JyaWRnZV92MSIsImFjdGlvbiI6YCArIHF1b3RlKHAuYXBwKyIuIitwLm9wKSArCgkJYCwiYXJncyI6YCArIHF1b3RlKHAudm90ZWQoKSkgKyBgLCJzY29wZSI6YCArIHF1b3RlKHAuc2NvcGUpICsgYCwiY2xhc3MiOmAgKyBzdHJjb252Lkl0b2EocC5jbGFzcykgKyBgfWAKfQoKLy8gY2FsbCByZWFkcyBhbiBBcHByb3ZhbCBjYWxsJ3MgZmllbGRzIGluIG9yZGVyLCBlYWNoIHdpdGggaXRzIHRhZy4KdHlwZSBjYWxsIHN0cnVjdHsgZiBbXWRhb2F1dGguRmllbGQgfQoKZnVuYyBwYXJzZUNhbGwocyBzdHJpbmcpICpjYWxsIHsKCWYsIGVyciA6PSBkYW9hdXRoLlBhcnNlKHMpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIuRXJyb3IoKSkKCX0KCXJldHVybiAmY2FsbHtmfQp9CgpmdW5jIChjICpjYWxsKSBuZXh0KHRhZyBieXRlKSBzdHJpbmcgewoJaWYgbGVuKGMuZikgPT0gMCB8fCBjLmZbMF0uVGFnICE9IHRhZyB7CgkJcGFuaWMoIm1lbWJhX2JyaWRnZTogY2FsbCBhcmd1bWVudCAiICsgc3RyaW5nKHRhZykgKyAiOiBleHBlY3RlZCIpCgl9Cgl2IDo9IGMuZlswXS5WYWx1ZQoJYy5mID0gYy5mWzE6XQoJcmV0dXJuIHYKfQoKLy8gZGFvYXV0aC5QYXJzZSBoYXMgY2hlY2tlZCBlYWNoIHZhbHVlIGlzIGNhbm9uaWNhbCBmb3IgaXRzIHRhZy4KZnVuYyAoYyAqY2FsbCkgc3RyKCkgc3RyaW5nICAgeyByZXR1cm4gYy5uZXh0KCdzJykgfQpmdW5jIChjICpjYWxsKSBhZGRyKCkgYWRkcmVzcyB7IHJldHVybiBhZGRyZXNzKGMubmV4dCgnYScpKSB9CmZ1bmMgKGMgKmNhbGwpIGk2NCgpIGludDY0IHsKCW4sIF8gOj0gc3RyY29udi5QYXJzZUludChjLm5leHQoJ2knKSwgMTAsIDY0KQoJcmV0dXJuIG4KfQoKZnVuYyAoYyAqY2FsbCkgdTY0KCkgdWludDY0IHsKCW4sIF8gOj0gc3RyY29udi5QYXJzZVVpbnQoYy5uZXh0KCd1JyksIDEwLCA2NCkKCXJldHVybiBuCn0KCmZ1bmMgKGMgKmNhbGwpIGZsYWcoKSBib29sIHsgcmV0dXJuIGMubmV4dCgnYicpID09ICIxIiB9CgpmdW5jIChjICpjYWxsKSBkb25lKCkgewoJaWYgbGVuKGMuZikgIT0gMCB7CgkJcGFuaWMoIm1lbWJhX2JyaWRnZTogdG9vIG1hbnkgY2FsbCBhcmd1bWVudHMiKQoJfQp9CgovLyBxdW90ZSByZXR1cm5zIHMsIHByaW50YWJsZSBBU0NJSSwgYXMgYSBKU09OIHN0cmluZyB3aXRoIDwgPiAmIGVzY2FwZWQuCmZ1bmMgcXVvdGUocyBzdHJpbmcpIHN0cmluZyB7CgliIDo9IG1ha2UoW11ieXRlLCAwLCA2KmxlbihzKSsyKQoJYiA9IGFwcGVuZChiLCAnIicpCglmb3IgaSA6PSAwOyBpIDwgbGVuKHMpOyBpKysgewoJCXN3aXRjaCBjIDo9IHNbaV07IGMgewoJCWNhc2UgJyInLCAnXFwnOgoJCQliID0gYXBwZW5kKGIsICdcXCcsIGMpCgkJY2FzZSAnPCcsICc+JywgJyYnOgoJCQliID0gYXBwZW5kKGIsIGBcdTAwYC4uLikKCQkJYiA9IGFwcGVuZChiLCAiMDEyMzQ1Njc4OWFiY2RlZiJbYz4+NF0sICIwMTIzNDU2Nzg5YWJjZGVmIltjJjB4Zl0pCgkJZGVmYXVsdDoKCQkJYiA9IGFwcGVuZChiLCBjKQoJCX0KCX0KCXJldHVybiBzdHJpbmcoYXBwZW5kKGIsICciJykpCn0KCmZ1bmMgY2hlY2tBcHAoYXBwIHN0cmluZykgewoJZm9yIF8sIGEgOj0gcmFuZ2UgYXBwcyB7CgkJaWYgYSA9PSBhcHAgewoJCQlyZXR1cm4KCQl9Cgl9CglwYW5pYygibWVtYmFfYnJpZGdlOiB1bmtub3duIGFwcCAiICsgYXBwKQp9CgovLyBhcmcgcmVmdXNlcyBhIG5vbi1jYW5vbmljYWwgb3IgcHJvdGVjdGVkIGFkZHJlc3MgYXMgYSByZWNpcGllbnQgb2YgYSByb2xlLAovLyBtZW1iZXJzaGlwLCBhZG1pbiBvciBmZWVzLgpmdW5jIGFyZyhhIGFkZHJlc3MpIGFkZHJlc3MgewoJaWYgcHJvdGVjdGVkW2FdIHsKCQlwYW5pYygibWVtYmFfYnJpZGdlOiBhZGRyZXNzIG11c3Qgbm90IGJlIGEgZ292ZXJuYW5jZSBvciBhcHAgcmVhbG0iKQoJfQoJcmV0dXJuIGNhbm9uaWNhbChhKQp9CgovLyBjYW5vbmljYWwgcmVmdXNlcyBhbiBhZGRyZXNzIHRoZSBjaGFpbiB3b3VsZCBuZXZlciBnaXZlIGEgY2FsbGVyLgpmdW5jIGNhbm9uaWNhbChhIGFkZHJlc3MpIGFkZHJlc3MgewoJaWYgIWRhb2F1dGguVmFsaWRBZGRyZXNzKGEpIHsKCQlwYW5pYygibWVtYmFfYnJpZGdlOiBhZGRyZXNzIG11c3QgYmUgbG93ZXJjYXNlIGJlY2gzMiIpCgl9CglyZXR1cm4gYQp9CgovLyDilIDilIAgQWRtaW4gaGFuZG92ZXIgKGV2ZXJ5IGFwcCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgovLyBBY2NlcHQgdGFrZXMgdGhlIGFkbWluIHJvbGUgdGhlIDItb2YtMyBub21pbmF0ZWQgdGhlIGJyaWRnZSBmb3IuIEl0IG5lZWRzCi8vIG5vIHZvdGU6IHRoZSBub21pbmF0aW9uIGlzIHRoZSBkZWNpc2lvbi4gQSBwYXVzZWQgYXBwIGlzIHJlZnVzZWQ6IG9ubHkgYQovLyBwYXVzZSB0aGUgYnJpZGdlIHN0YXJ0ZWQgY2FuIGJlIGVuZGVkIGJ5IGl0cyBydWxlcy4KZnVuYyBBY2NlcHQoY3VyIHJlYWxtLCBhcHAgc3RyaW5nKSB7CgljaGVja0FwcChhcHApCglpZiBoYXNQYXVzZShhcHApICYmIGlzUGF1c2VkKGFwcCkgewoJCXBhbmljKCJtZW1iYV9icmlkZ2U6IHVucGF1c2UgIiArIGFwcCArICIgYmVmb3JlIGhhbmRpbmcgaXQgb3ZlciIpCgl9Cglzd2l0Y2ggYXBwIHsKCWNhc2UgYXBwTWFya2V0OgoJCW1hcmtldC5BY2NlcHRBZG1pbihjcm9zcyhjdXIpKQoJY2FzZSBhcHBFc2Nyb3c6CgkJZXNjcm93LkFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpKQoJY2FzZSBhcHBBcHBzdG9yZToKCQlhcHBzdG9yZS5BY2NlcHRPd25lcnNoaXAoY3Jvc3MoY3VyKSkKCWNhc2UgYXBwUmV2aWV3czoKCQlyZXZpZXdzLkFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpKQoJY2FzZSBhcHBRdWVzdDoKCQlxdWVzdC5BY2NlcHRPd25lcnNoaXAoY3Jvc3MoY3VyKSkKCWNhc2UgYXBwQXJjYWRlOgoJCWFyY2FkZS5BY2NlcHRPd25lcnNoaXAoY3Jvc3MoY3VyKSkKCWNhc2UgYXBwQmFkZ2VzOgoJCWJhZGdlcy5BY2NlcHRPd25lcnNoaXAoY3Jvc3MoY3VyKSkKCWNhc2UgYXBwRmVlZDoKCQlmZWVkLkFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpKQoJY2FzZSBhcHBDaGFubmVsczoKCQljaGFubmVscy5BY2NlcHRPd25lcnNoaXAoY3Jvc3MoY3VyKSkKCWNhc2UgYXBwRmVlZGJhY2s6CgkJZmVlZGJhY2suQWNjZXB0T3duZXJzaGlwKGNyb3NzKGN1cikpCgl9Cgl0ZW51cmVbYXBwXSsrCglkZWxldGUocGF1c2VkVW50aWwsIGFwcCkgLy8gYSByZWNvcmQgZnJvbSBhbiBlYXJsaWVyIHRlbnVyZSBuZXZlciBhcHBsaWVzCn0KCi8vIFRyYW5zZmVyQWRtaW4gc3RhZ2VzIHRvIGFzIHRoZSBhcHAncyBuZXh0IGFkbWluOiB0aGUgMi1vZi0zLCBhIHN1Y2Nlc3NvcgovLyBicmlkZ2UsIG9yIGFueW9uZSB0aGUgREFPIG5hbWVzLiBUaGUgcmVjaXBpZW50IGFjY2VwdHMgYnkgaXRzIG93biBjYWxsLgpmdW5jIFRyYW5zZmVyQWRtaW4oY3VyIHJlYWxtLCBwaWQgdWludDY0LCBhcHAgc3RyaW5nLCB0byBhZGRyZXNzKSB7CglhcHByb3ZlKGN1ciwgcGlkLCB0cmFuc2ZlclBsYW4oYXBwLCB0bykpCglzd2l0Y2ggYXBwIHsKCWNhc2UgYXBwTWFya2V0OgoJCW1hcmtldC5UcmFuc2ZlckFkbWluKGNyb3NzKGN1ciksIHRvKQoJY2FzZSBhcHBFc2Nyb3c6CgkJZXNjcm93LlRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIHRvKQoJY2FzZSBhcHBBcHBzdG9yZToKCQlhcHBzdG9yZS5UcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCB0bykKCWNhc2UgYXBwUmV2aWV3czoKCQlyZXZpZXdzLlRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIHRvKQoJY2FzZSBhcHBRdWVzdDoKCQlxdWVzdC5UcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCB0bykKCWNhc2UgYXBwQXJjYWRlOgoJCWFyY2FkZS5UcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCB0bykKCWNhc2UgYXBwQmFkZ2VzOgoJCWJhZGdlcy5UcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCB0bykKCWNhc2UgYXBwRmVlZDoKCQlmZWVkLlRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIHRvKQoJY2FzZSBhcHBDaGFubmVsczoKCQljaGFubmVscy5Qcm9wb3NlT3duZXIoY3Jvc3MoY3VyKSwgdG8pCgljYXNlIGFwcEZlZWRiYWNrOgoJCWZlZWRiYWNrLlRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIHRvKQoJfQp9CgpmdW5jIHRyYW5zZmVyUGxhbihhcHAgc3RyaW5nLCB0byBhZGRyZXNzKSBwbGFuIHsKCWNoZWNrQXBwKGFwcCkKCXJldHVybiBuZXdQbGFuKGFwcCwgIlRyYW5zZmVyQWRtaW4iLCBkYW9hdXRoLk5ldygpLkFkZHIoYXJnKHRvKSkuU3RyKHBlbmRpbmdBZG1pbihhcHApKSwgYXBwLCBnb3YuQ3JpdGljYWwpCn0KCi8vIENhbmNlbFRyYW5zZmVyIHdpdGhkcmF3cyBhIHN0YWdlZCBhZG1pbiBiZWZvcmUgdGhlIHJlY2lwaWVudCBhY2NlcHRzLgpmdW5jIENhbmNlbFRyYW5zZmVyKGN1ciByZWFsbSwgcGlkIHVpbnQ2NCwgYXBwIHN0cmluZykgewoJYXBwcm92ZShjdXIsIHBpZCwgY2FuY2VsUGxhbihhcHApKQoJc3dpdGNoIGFwcCB7CgljYXNlIGFwcE1hcmtldDoKCQltYXJrZXQuQ2FuY2VsQWRtaW5UcmFuc2Zlcihjcm9zcyhjdXIpKQoJY2FzZSBhcHBFc2Nyb3c6CgkJZXNjcm93LkNhbmNlbE93bmVyc2hpcFRyYW5zZmVyKGNyb3NzKGN1cikpCgljYXNlIGFwcEFwcHN0b3JlOgoJCWFwcHN0b3JlLkNhbmNlbE93bmVyc2hpcFRyYW5zZmVyKGNyb3NzKGN1cikpCgljYXNlIGFwcFJldmlld3M6CgkJcmV2aWV3cy5DYW5jZWxPd25lcnNoaXBUcmFuc2Zlcihjcm9zcyhjdXIpKQoJY2FzZSBhcHBRdWVzdDoKCQlxdWVzdC5DYW5jZWxPd25lcnNoaXBUcmFuc2Zlcihjcm9zcyhjdXIpKQoJY2FzZSBhcHBBcmNhZGU6CgkJYXJjYWRlLkNhbmNlbE93bmVyc2hpcFRyYW5zZmVyKGNyb3NzKGN1cikpCgljYXNlIGFwcEJhZGdlczoKCQliYWRnZXMuQ2FuY2VsT3duZXJzaGlwVHJhbnNmZXIoY3Jvc3MoY3VyKSkKCWNhc2UgYXBwRmVlZDoKCQlmZWVkLkNhbmNlbE93bmVyc2hpcFRyYW5zZmVyKGNyb3NzKGN1cikpCgljYXNlIGFwcENoYW5uZWxzOgoJCWNoYW5uZWxzLkNhbmNlbFBlbmRpbmdPd25lcihjcm9zcyhjdXIpKQoJY2FzZSBhcHBGZWVkYmFjazoKCQlmZWVkYmFjay5DYW5jZWxPd25lcnNoaXBUcmFuc2Zlcihjcm9zcyhjdXIpKQoJfQp9CgpmdW5jIGNhbmNlbFBsYW4oYXBwIHN0cmluZykgcGxhbiB7CgljaGVja0FwcChhcHApCglwZW5kaW5nIDo9IHBlbmRpbmdBZG1pbihhcHApCglpZiBwZW5kaW5nID09ICIiIHsKCQlwYW5pYygibWVtYmFfYnJpZGdlOiBub3RoaW5nIHN0YWdlZCB0byBjYW5jZWwgZm9yICIgKyBhcHApCgl9CglyZXR1cm4gbmV3UGxhbihhcHAsICJDYW5jZWxUcmFuc2ZlciIsIGRhb2F1dGguTmV3KCkuU3RyKHBlbmRpbmcpLCBhcHAsIGdvdi5GaW5hbmNpYWwpCn0KCi8vIGdvdmVybnMgcmVwb3J0cyB3aGV0aGVyIHRoZSBicmlkZ2UgaXMgYXBwJ3MgYWRtaW4gbm93LgpmdW5jIGdvdmVybnMoYXBwIHN0cmluZykgYm9vbCB7Cgl2YXIgYWRtaW4gc3RyaW5nCglzd2l0Y2ggYXBwIHsKCWNhc2UgYXBwTWFya2V0OgoJCWFkbWluID0gc3RyaW5nKG1hcmtldC5HZXRBZG1pbigpKQoJY2FzZSBhcHBFc2Nyb3c6CgkJYWRtaW4gPSBlc2Nyb3cuR2V0QWRtaW4oKQoJY2FzZSBhcHBBcHBzdG9yZToKCQlhZG1pbiA9IHN0cmluZyhhcHBzdG9yZS5HZXRPd25lcigpKQoJY2FzZSBhcHBSZXZpZXdzOgoJCWFkbWluID0gcmV2aWV3cy5HZXRNb2RlcmF0b3IoKQoJY2FzZSBhcHBRdWVzdDoKCQlhZG1pbiA9IHF1ZXN0LkdldE93bmVyKCkKCWNhc2UgYXBwQXJjYWRlOgoJCWFkbWluID0gc3RyaW5nKGFyY2FkZS5HZXRPd25lcigpKQoJY2FzZSBhcHBCYWRnZXM6CgkJYWRtaW4gPSBzdHJpbmcoYmFkZ2VzLkdldE93bmVyKCkpCgljYXNlIGFwcEZlZWQ6CgkJYWRtaW4gPSBzdHJpbmcoZmVlZC5HZXRPd25lcigpKQoJY2FzZSBhcHBDaGFubmVsczoKCQlhZG1pbiA9IHN0cmluZyhjaGFubmVscy5HZXRPd25lcigpKQoJY2FzZSBhcHBGZWVkYmFjazoKCQlhZG1pbiA9IHN0cmluZyhmZWVkYmFjay5HZXRPd25lcigpKQoJZGVmYXVsdDoKCQlyZXR1cm4gZmFsc2UKCX0KCXJldHVybiBhZG1pbiA9PSBzdHJpbmcoc2VsZikKfQoKZnVuYyBwZW5kaW5nQWRtaW4oYXBwIHN0cmluZykgc3RyaW5nIHsKCXN3aXRjaCBhcHAgewoJY2FzZSBhcHBNYXJrZXQ6CgkJcmV0dXJuIHN0cmluZyhtYXJrZXQuR2V0UGVuZGluZ0FkbWluKCkpCgljYXNlIGFwcEVzY3JvdzoKCQlyZXR1cm4gZXNjcm93LkdldFBlbmRpbmdBZG1pbigpCgljYXNlIGFwcEFwcHN0b3JlOgoJCXJldHVybiBzdHJpbmcoYXBwc3RvcmUuR2V0UGVuZGluZ093bmVyKCkpCgljYXNlIGFwcFJldmlld3M6CgkJcmV0dXJuIHJldmlld3MuR2V0UGVuZGluZ01vZGVyYXRvcigpCgljYXNlIGFwcFF1ZXN0OgoJCXJldHVybiBxdWVzdC5HZXRQZW5kaW5nT3duZXIoKQoJY2FzZSBhcHBBcmNhZGU6CgkJcmV0dXJuIHN0cmluZyhhcmNhZGUuR2V0UGVuZGluZ093bmVyKCkpCgljYXNlIGFwcEJhZGdlczoKCQlyZXR1cm4gc3RyaW5nKGJhZGdlcy5HZXRQZW5kaW5nT3duZXIoKSkKCWNhc2UgYXBwRmVlZDoKCQlyZXR1cm4gc3RyaW5nKGZlZWQuR2V0UGVuZGluZ093bmVyKCkpCgljYXNlIGFwcENoYW5uZWxzOgoJCXJldHVybiBzdHJpbmcoY2hhbm5lbHMuR2V0UGVuZGluZ093bmVyKCkpCgl9CglyZXR1cm4gc3RyaW5nKGZlZWRiYWNrLkdldFBlbmRpbmdPd25lcigpKQp9CgovLyDilIDilIAgUGF1c2UgKGVzY3JvdywgQXBwIFN0b3JlLCBhcmNhZGUsIGJhZGdlcywgZmVlZCwgY2hhbm5lbHMsIGZlZWRiYWNrKSDilIDilIAKCi8vIEVtZXJnZW5jeVBhdXNlIHBhdXNlcyBhcHAgZm9yIDcgZGF5cywgd2l0aG91dCBhIHZvdGUuIEVhY2ggbWVtYmVyIG1heSB1c2UKLy8gaXQgb25jZSBwZXIgMzAgZGF5cywgc28gb25lIGtleSBjYW5ub3Qga2VlcCBhbiBhcHAgY2xvc2VkLgpmdW5jIEVtZXJnZW5jeVBhdXNlKGN1ciByZWFsbSwgYXBwIHN0cmluZykgewoJaWQgOj0gZ292LlBlcnNvbk9mKGRpcmVjdChjdXIpKQoJaWYgaWQgPT0gIiIgewoJCXBhbmljKCJtZW1iYV9icmlkZ2U6IG5vdCBhIHNlYXRlZCBtZW1iZXIiKQoJfQoJaWYgIWdvdmVybnMoYXBwKSB7CgkJcGFuaWMoIm1lbWJhX2JyaWRnZTogdGhlIGJyaWRnZSBkb2VzIG5vdCBnb3Zlcm4gIiArIGFwcCkKCX0KCS8vIEEgcGF1c2VkIGFwcCBpcyByZWZ1c2VkIGZpcnN0LCBhbmQgY29zdHMgbm8gYWxsb3dhbmNlOiBhbiBlbWVyZ2VuY3kKCS8vIHBhdXNlIG11c3QgbmV2ZXIgc2hvcnRlbiBhIGxvbmdlciBwYXVzZSBtZW1iZXJzIHZvdGVkLgoJaWYgaXNQYXVzZWQoYXBwKSB7CgkJcGFuaWMoIm1lbWJhX2JyaWRnZTogYWxyZWFkeSBwYXVzZWQiKQoJfQoJbm93IDo9IHRpbWUuTm93KCkKCWlmIGxhc3QsIG9rIDo9IGxhc3RQYXVzZVtpZF07IG9rICYmIG5vdy5CZWZvcmUobGFzdC5BZGQoUGF1c2VBbGxvd2FuY2UpKSB7CgkJcGFuaWMoIm1lbWJhX2JyaWRnZTogb25lIGVtZXJnZW5jeSBwYXVzZSBwZXIgbWVtYmVyIHBlciAzMCBkYXlzIikKCX0KCXNldFBhdXNlZChjdXIsIGFwcCwgdHJ1ZSkKCXBhdXNlZFVudGlsW2FwcF0gPSBub3cuQWRkKEVtZXJnZW5jeVBhdXNlRm9yKQoJZXBpc29kZXNbYXBwXSsrCglsYXN0UGF1c2VbaWRdID0gbm93Cn0KCi8vIFNldFBhdXNlIGVuZHMgdGhlIGJyaWRnZSdzIHBhdXNlIG9mIGFwcCBub3cgKHVudGlsID0gMCkgb3Iga2VlcHMgYXBwCi8vIHBhdXNlZCB1bnRpbCB0aGUgdW5peCB0aW1lIHVudGlsLCBhdCBtb3N0IDMwIGRheXMgYWhlYWQuIFRoZSBhcHByb3ZhbCBuYW1lcwovLyB0aGUgcGF1c2UgZXBpc29kZSwgc28gaXQgbmV2ZXIgZW5kcyBhIGxhdGVyIHBhdXNlLgpmdW5jIFNldFBhdXNlKGN1ciByZWFsbSwgcGlkIHVpbnQ2NCwgYXBwIHN0cmluZywgdW50aWwgaW50NjQpIHsKCWFwcHJvdmUoY3VyLCBwaWQsIHBhdXNlUGxhbihhcHAsIHVudGlsKSkKCWlmIHVudGlsID09IDAgewoJCWlmIGlzUGF1c2VkKGFwcCkgewoJCQlzZXRQYXVzZWQoY3VyLCBhcHAsIGZhbHNlKQoJCX0KCQlkZWxldGUocGF1c2VkVW50aWwsIGFwcCkKCQlyZXR1cm4KCX0KCWlmICFpc1BhdXNlZChhcHApIHsKCQlzZXRQYXVzZWQoY3VyLCBhcHAsIHRydWUpCgkJZXBpc29kZXNbYXBwXSsrCgl9CglwYXVzZWRVbnRpbFthcHBdID0gdGltZS5Vbml4KHVudGlsLCAwKQp9CgpmdW5jIHBhdXNlUGxhbihhcHAgc3RyaW5nLCB1bnRpbCBpbnQ2NCkgcGxhbiB7Cglub3cgOj0gdGltZS5Ob3coKQoJaWYgZW5kIDo9IHRpbWUuVW5peCh1bnRpbCwgMCk7IHVudGlsICE9IDAgJiYgKCFlbmQuQWZ0ZXIobm93KSB8fCBlbmQuQWZ0ZXIobm93LkFkZChNYXhQYXVzZUFoZWFkKSkpIHsKCQlwYW5pYygibWVtYmFfYnJpZGdlOiBwYXVzZSBlbmQgbXVzdCBiZSB3aXRoaW4gdGhlIG5leHQgMzAgZGF5cyIpCgl9CgkvLyBHb3Zlcm5hbmNlIGZpcnN0OiBhbiBhcHAgdGhlIGJyaWRnZSBkb2VzIG5vdCBnb3Zlcm4gc2F5cyBzbyBiZWZvcmUgaXRzIHBhdXNlIGlzIHJlYWQuCglwIDo9IG5ld1BsYW4oYXBwLCAiU2V0UGF1c2UiLCBkYW9hdXRoLk5ldygpLCBhcHAsIGdvdi5GaW5hbmNpYWwpCglwLmFyZ3MuSW50KHVudGlsKS5Cb29sKGlzUGF1c2VkKGFwcCkpLlVpbnQoZXBpc29kZXNbYXBwXSkKCXJldHVybiBwCn0KCi8vIEV4cGlyZVBhdXNlIGxldHMgYW55b25lIGVuZCB0aGUgYnJpZGdlJ3MgcGF1c2Ugb2YgYXBwIG9uY2UgaXQgaXMgb3Zlci4gQQovLyBTZXRQYXVzZSB0aGF0IGtlZXBzIGFwcCBwYXVzZWQgbG9uZ2VyIG11c3QgZXhlY3V0ZSBiZWZvcmUgdGhlbi4gT25jZSB0aGUKLy8gYnJpZGdlIG5vIGxvbmdlciBnb3Zlcm5zIGFwcCwgaXRzIHJlY29yZCBubyBsb25nZXIgYXBwbGllczogYW55b25lIGRyb3BzCi8vIGl0LCBhbmQgdGhlIGFwcCwgbm93IGl0cyBuZXcgYWRtaW4ncywgaXMgbGVmdCBhcyBpdCBpcy4KZnVuYyBFeHBpcmVQYXVzZShjdXIgcmVhbG0sIGFwcCBzdHJpbmcpIHsKCWVuZCwgb2sgOj0gcGF1c2VkVW50aWxbYXBwXQoJaWYgb2sgJiYgIWdvdmVybnMoYXBwKSB7CgkJZGVsZXRlKHBhdXNlZFVudGlsLCBhcHApCgkJcmV0dXJuCgl9CglpZiAhb2sgfHwgdGltZS5Ob3coKS5CZWZvcmUoZW5kKSB7CgkJcGFuaWMoIm1lbWJhX2JyaWRnZTogbm8gZXhwaXJlZCBwYXVzZSBmb3IgIiArIGFwcCkKCX0KCWRlbGV0ZShwYXVzZWRVbnRpbCwgYXBwKQoJaWYgaXNQYXVzZWQoYXBwKSB7CgkJc2V0UGF1c2VkKGN1ciwgYXBwLCBmYWxzZSkKCX0KfQoKZnVuYyBoYXNQYXVzZShhcHAgc3RyaW5nKSBib29sIHsKCXJldHVybiBhcHAgIT0gYXBwTWFya2V0ICYmIGFwcCAhPSBhcHBSZXZpZXdzICYmIGFwcCAhPSBhcHBRdWVzdAp9CgpmdW5jIGlzUGF1c2VkKGFwcCBzdHJpbmcpIGJvb2wgewoJc3dpdGNoIGFwcCB7CgljYXNlIGFwcEVzY3JvdzoKCQlyZXR1cm4gZXNjcm93LklzUGF1c2VkKCkKCWNhc2UgYXBwQXBwc3RvcmU6CgkJcmV0dXJuIGFwcHN0b3JlLklzUGF1c2VkKCkKCWNhc2UgYXBwQXJjYWRlOgoJCXJldHVybiBhcmNhZGUuSXNQYXVzZWQoKQoJY2FzZSBhcHBCYWRnZXM6CgkJcmV0dXJuIGJhZGdlcy5Jc1BhdXNlZCgpCgljYXNlIGFwcEZlZWQ6CgkJcmV0dXJuIGZlZWQuSXNQYXVzZWQoKQoJY2FzZSBhcHBDaGFubmVsczoKCQlyZXR1cm4gY2hhbm5lbHMuSXNQYXVzZWQoKQoJY2FzZSBhcHBGZWVkYmFjazoKCQlyZXR1cm4gZmVlZGJhY2suSXNQYXVzZWQoKQoJfQoJcGFuaWMoIm1lbWJhX2JyaWRnZTogIiArIGFwcCArICIgaGFzIG5vIHBhdXNlIikKfQoKZnVuYyBzZXRQYXVzZWQoY3VyIHJlYWxtLCBhcHAgc3RyaW5nLCBvbiBib29sKSB7Cglzd2l0Y2ggewoJY2FzZSBhcHAgPT0gYXBwRXNjcm93ICYmIG9uOgoJCWVzY3Jvdy5QYXVzZShjcm9zcyhjdXIpKQoJY2FzZSBhcHAgPT0gYXBwRXNjcm93OgoJCWVzY3Jvdy5VbnBhdXNlKGNyb3NzKGN1cikpCgljYXNlIGFwcCA9PSBhcHBBcHBzdG9yZToKCQlhcHBzdG9yZS5QYXVzZShjcm9zcyhjdXIpLCBvbikKCWNhc2UgYXBwID09IGFwcEFyY2FkZToKCQlhcmNhZGUuUGF1c2UoY3Jvc3MoY3VyKSwgb24pCgljYXNlIGFwcCA9PSBhcHBCYWRnZXMgJiYgb246CgkJYmFkZ2VzLlBhdXNlKGNyb3NzKGN1cikpCgljYXNlIGFwcCA9PSBhcHBCYWRnZXM6CgkJYmFkZ2VzLlVucGF1c2UoY3Jvc3MoY3VyKSkKCWNhc2UgYXBwID09IGFwcEZlZWQgJiYgb246CgkJZmVlZC5QYXVzZVJlYWxtKGNyb3NzKGN1cikpCgljYXNlIGFwcCA9PSBhcHBGZWVkOgoJCWZlZWQuVW5wYXVzZVJlYWxtKGNyb3NzKGN1cikpCgljYXNlIGFwcCA9PSBhcHBDaGFubmVscyAmJiBvbjoKCQljaGFubmVscy5QYXVzZVJlYWxtKGNyb3NzKGN1cikpCgljYXNlIGFwcCA9PSBhcHBDaGFubmVsczoKCQljaGFubmVscy5VbnBhdXNlUmVhbG0oY3Jvc3MoY3VyKSkKCWNhc2UgYXBwID09IGFwcEZlZWRiYWNrICYmIG9uOgoJCWZlZWRiYWNrLlBhdXNlUmVhbG0oY3Jvc3MoY3VyKSkKCWNhc2UgYXBwID09IGFwcEZlZWRiYWNrOgoJCWZlZWRiYWNrLlVucGF1c2VSZWFsbShjcm9zcyhjdXIpKQoJfQp9CgpmdW5jIHVuaXhPZih0IHRpbWUuVGltZSkgaW50NjQgewoJaWYgdC5Jc1plcm8oKSB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiB0LlVuaXgoKQp9CgovLyDilIDilIAgUmVhZHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgovLyBQYXVzZWRVbnRpbCByZXR1cm5zIHRoZSB1bml4IGVuZCBvZiB0aGUgYnJpZGdlJ3MgcGF1c2Ugb2YgYXBwLCBvciAwIChhbHNvCi8vIG9uY2UgdGhlIGJyaWRnZSBubyBsb25nZXIgZ292ZXJucyBhcHApLgpmdW5jIFBhdXNlZFVudGlsKGFwcCBzdHJpbmcpIGludDY0IHsKCWlmICFnb3Zlcm5zKGFwcCkgewoJCXJldHVybiAwCgl9CglyZXR1cm4gdW5peE9mKHBhdXNlZFVudGlsW2FwcF0pCn0KCi8vIFBhdXNlRXBpc29kZSByZXR1cm5zIGhvdyBtYW55IHBhdXNlcyBvZiBhcHAgdGhlIGJyaWRnZSBoYXMgc3RhcnRlZDsgYQovLyBTZXRQYXVzZSBhcHByb3ZhbCBiaW5kcyBpdC4KZnVuYyBQYXVzZUVwaXNvZGUoYXBwIHN0cmluZykgdWludDY0IHsgcmV0dXJuIGVwaXNvZGVzW2FwcF0gfQoKLy8gVGVudXJlIHJldHVybnMgaG93IG1hbnkgdGltZXMgdGhlIGJyaWRnZSBoYXMgYWNjZXB0ZWQgYXBwOyBldmVyeSBhcHByb3ZhbAovLyBmb3IgYXBwIGJpbmRzIGl0IGFzIGl0cyBsYXN0IGFyZ3VtZW50LgpmdW5jIFRlbnVyZShhcHAgc3RyaW5nKSB1aW50NjQgeyByZXR1cm4gdGVudXJlW2FwcF0gfQoKZnVuYyBSZW5kZXIoXyBzdHJpbmcpIHN0cmluZyB7CglvdXQgOj0gIiMgTWVtYmEgYnJpZGdlIHYxXG5cbkdvdmVybnMgdGhlIHRlbiBNZW1iYSBhcHBzIGZvciBtZW1iYV9nb3YuIEJyaWRnZSBwYXVzZXM6XG5cbiIKCW4gOj0gMAoJZm9yIF8sIGFwcCA6PSByYW5nZSBhcHBzIHsKCQlpZiBlbmQsIG9rIDo9IHBhdXNlZFVudGlsW2FwcF07IG9rICYmIGdvdmVybnMoYXBwKSB7CgkJCW91dCArPSAiLSAiICsgYXBwICsgIiB1bnRpbCB1bml4ICIgKyBzdHJjb252LkZvcm1hdEludChlbmQuVW5peCgpLCAxMCkgKyAiXG4iCgkJCW4rKwoJCX0KCX0KCWlmIG4gPT0gMCB7CgkJb3V0ICs9ICJOb25lLlxuIgoJfQoJcmV0dXJuIG91dAp9ChqrAwoNZHVyYXRpb25zLmdubxKZA3BhY2thZ2UgbWVtYmFfYnJpZGdlX3YxCgppbXBvcnQgInRpbWUiCgovLyBUaGUgcGF1c2UgZHVyYXRpb25zLCBpbiB0aGVpciBvd24gZmlsZSBzbyBhIG5vZGUgZml4dHVyZSwgd2hpY2ggY2Fubm90Ci8vIHdhaXQgZGF5cywgY2FuIHJlcGxhY2UgdGhpcyBmaWxlIGFsb25lOyBUZXN0UHJvZHVjdGlvbkR1cmF0aW9ucyBwaW5zIHRoZW0uCmNvbnN0ICgKCUVtZXJnZW5jeVBhdXNlRm9yID0gNyAqIDI0ICogdGltZS5Ib3VyICAvLyBlc2Nyb3cga2VlcHMgZXhpdHMgY2xvc2VkIHRoaXMgbG9uZwoJUGF1c2VBbGxvd2FuY2UgICAgPSAzMCAqIDI0ICogdGltZS5Ib3VyIC8vIG9uZSBlbWVyZ2VuY3kgcGF1c2UgcGVyIG1lbWJlciBwZXIgcGVyaW9kCglNYXhQYXVzZUFoZWFkICAgICA9IDMwICogMjQgKiB0aW1lLkhvdXIKKQoaSQoLZ25vbW9kLnRvbWwSOm1vZHVsZSA9ICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfYnJpZGdlX3YxIgpnbm8gPSAiMC45IgoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTE0MDAwMDAwdWdub3QSEQiA4MZbEgo5NjAwMHVnbm90GogDCs0BChIvdG0uUHViS2V5TXVsdGlzaWcStgEIAhI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQNdTsrzjy2oA1bKxxCiASBMVUReZbe8FQo/n1GUQS9f7RI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMo44neuGQmEOBJpWfwt5YFd/18PcgdS1Pidavq3ZGmeBI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMg5X9eKuwtmgamq/0K8oenVUfVQAsVWVenzmjN1+WBABKLAQoFCAMSAaASQFqe+5yb4uIIfXmC4yF01lrIZhRDhDm+Lqf1aohTk2uoWAcN9UiLbSYQALbD/nKjSLbcSMFZjHmQDaZ7IR2xuTsSQGpTwoamC0WWSTkPfpTtt0NolNMTqbVNgDgP5tSFr875SEzONj/KgaZcwVJXaDIyV7B/rGVmCWMcovwq90hbpKUaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data