Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
96CE187C0776A245CA82AEE3DA9D119AB1B682ED9B5D50BD4ECBCBD12876A88C
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
34,063,740
Requested gas limit
GAS USED
28,386,480
Gas consumed
FEE
34064ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1q5tjjv3kkslzwf2na9y9wk7e5a8ugph8xfsk04
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CpupAQoML3ZtLm1fYWRkcGtnEompAQooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBLbqAEKCHJlZmVycmFsEh5nbm8ubGFuZC9yL2dub3N3YXAvcmVmZXJyYWwvdjEa4hwKCVJFQURNRS5tZBLUHCMgUmVmZXJyYWwKClJlZmVycmFsIHN5c3RlbSBmb3IgdHJhY2tpbmcgdXNlciByZWxhdGlvbnNoaXBzLgoKIyMgT3ZlcnZpZXcKCk1hbmFnZXMgcmVmZXJyYWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHVzZXJzLiBOb24tcmVtb3ZhbCB3cml0ZXMgaGF2ZSBhIDI0LWhvdXIgY29vbGRvd24gcGVyIHVzZXIuCgojIyBHbG9iYWwgRnVuY3Rpb25zCgojIyMgYFRyeVJlZ2lzdGVyKGN1ciByZWFsbSwgYWRkciBhZGRyZXNzLCByZWZlcnJhbCBzdHJpbmcpIHN0cmluZ2AKQXR0ZW1wdHMgdG8gcmVnaXN0ZXIsIHVwZGF0ZSwgb3IgcmVtb3ZlIGEgcmVmZXJyYWwgcmVsYXRpb25zaGlwIGFuZCByZXR1cm5zIHRoZSBlZmZlY3RpdmUgcmVmZXJyZXIgc3RyaW5nLgoKLSBBbiBlbXB0eSBgcmVmZXJyYWxgIG9ubHkgcmVhZHMgYW5kIHJldHVybnMgdGhlIHVzZXIncyBjdXJyZW50IHJlZmVycmVyLiBJdCBkb2VzIG5vdCByZXF1aXJlIGF1dGhvcml6YXRpb24gb3IgZW1pdCBhbiBldmVudC4KLSBBbiBhdXRob3JpemVkIG5vbi1lbXB0eSB3cml0ZSB0aGF0IGZhaWxzIGVtaXRzIGBSZWZlcnJhbFJlZ2lzdHJhdGlvbkZhaWxlZGAgYW5kIHJldHVybnMgdGhlIGN1cnJlbnRseSBzdG9yZWQgcmVmZXJyZXIuCi0gUGFzc2luZyBgQ29udHJhY3RBZGRyZXNzKClgIGFzIGByZWZlcnJhbGAgcmVtb3ZlcyB0aGUgcmVsYXRpb25zaGlwIGFuZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4gVGhlIHplcm8gYWRkcmVzcyBpcyBub3QgdGhlIHJlbW92YWwgc2VudGluZWwgYW5kIGlzIGludmFsaWQuCgojIyMgYEdldFJlZmVycmFsKGFkZHIgc3RyaW5nKSBzdHJpbmdgClJldHVybnMgdGhlIHJlZmVycmFsIGFkZHJlc3MgZm9yIHRoZSBnaXZlbiBhZGRyZXNzLiBSZXR1cm5zIGVtcHR5IHN0cmluZyBpZiBub3QgZm91bmQuCgojIyMgYEhhc1JlZmVycmFsKGFkZHIgc3RyaW5nKSBib29sYApSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGFkZHJlc3MgaGFzIGEgcmVmZXJyYWwuCgojIyMgYElzRW1wdHkoKSBib29sYApSZXR1cm5zIHRydWUgaWYgbm8gcmVmZXJyYWxzIGV4aXN0IGluIHRoZSBzeXN0ZW0uCgojIyMgYEdldExhc3RPcFRpbWVzdGFtcChhZGRyIHN0cmluZykgKGludDY0LCBlcnJvcilgClJldHVybnMgdGhlIGxhc3Qgbm9uLXJlbW92YWwgcmVnaXN0cmF0aW9uIG9yIHVwZGF0ZSB0aW1lc3RhbXAgZm9yIHRoZSBhZGRyZXNzLiBSZXR1cm5zIGBFcnJOb3RGb3VuZGAgaWYgbm8gc3VjaCBvcGVyYXRpb24gaGFzIGJlZW4gcmVjb3JkZWQuCgojIyMgYENvbnRyYWN0QWRkcmVzcygpIHN0cmluZ2AKUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVmZXJyYWwgY29udHJhY3QuIFBhc3MgdGhpcyB2YWx1ZSBhcyBgcmVmZXJyYWxgIHRvIHJlbW92ZSBhbiBleGlzdGluZyByZWxhdGlvbnNoaXAuCgojIyBHbm93ZWIKCmBSZW5kZXIoIiIpYCBleHBsYWlucyB0aGUgcmVnaXN0cmF0aW9uIGludGVydmFsIGFuZCByZW1vdmFsIGJlaGF2aW9yLgpgUmVuZGVyKCJhZGRyZXNzLzxhZGRyZXNzPiIpYCBzaG93cyB0aGUgY3VycmVudCByZWZlcnJlciBhbmQgbGFzdCByZWdpc3RyYXRpb24gb3IKdXBkYXRlIHRpbWUgaW4gVVRDLiBNaXNzaW5nIHJlY29yZHMgYW5kIHVuc3VwcG9ydGVkIHBhdGhzIHJldHVybiBgNDA0YC4KCiMjIFVzYWdlCgojIyMgUmVnaXN0ZXJpbmcgb3IgVXBkYXRpbmcgYSBSZWZlcnJhbAoKYGBgZ28KcGFja2FnZSBleGFtcGxlCgppbXBvcnQgKAogICAgImduby5sYW5kL3IvZ25vc3dhcC9yZWZlcnJhbC92MSIKKQoKLy8gUmVnaXN0ZXJVc2VyUmVmZXJyYWwgcmVnaXN0ZXJzIG9yIHVwZGF0ZXMgYSByZWZlcnJhbCByZWxhdGlvbnNoaXAuCi8vIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgdGhlIGVmZmVjdGl2ZSByZWZlcnJlci4KZnVuYyBSZWdpc3RlclVzZXJSZWZlcnJhbChjdXIgcmVhbG0sIHVzZXJBZGRyLCByZWZlcnJlckFkZHIgYWRkcmVzcykgc3RyaW5nIHsKICAgIHJldHVybiByZWZlcnJhbC5UcnlSZWdpc3Rlcihjcm9zcyhjdXIpLCB1c2VyQWRkciwgcmVmZXJyZXJBZGRyLlN0cmluZygpKQp9CmBgYAoKIyMjIFJlbW92aW5nIGEgUmVmZXJyYWwKCmBgYGdvCnBhY2thZ2UgZXhhbXBsZQoKaW1wb3J0ICgKICAgICJnbm8ubGFuZC9yL2dub3N3YXAvcmVmZXJyYWwvdjEiCikKCi8vIFJlbW92ZVVzZXJSZWZlcnJhbCByZW1vdmVzIHRoZSByZWZlcnJhbCByZWxhdGlvbnNoaXAgZm9yIGEgdXNlci4KZnVuYyBSZW1vdmVVc2VyUmVmZXJyYWwoY3VyIHJlYWxtLCB1c2VyQWRkciBhZGRyZXNzKSBzdHJpbmcgewogICAgcmV0dXJuIHJlZmVycmFsLlRyeVJlZ2lzdGVyKGNyb3NzKGN1ciksIHVzZXJBZGRyLCByZWZlcnJhbC5Db250cmFjdEFkZHJlc3MoKSkKfQpgYGAKCiMjIyBRdWVyeWluZyBSZWZlcnJhbHMKCmBgYGdvCnBhY2thZ2UgZXhhbXBsZQoKaW1wb3J0ICgKICAgICJnbm8ubGFuZC9yL2dub3N3YXAvcmVmZXJyYWwvdjEiCikKCi8vIEdldFVzZXJSZWZlcnJlciByZXR1cm5zIHRoZSByZWZlcnJlciBhZGRyZXNzIGZvciBhIHVzZXIuCi8vIFJldHVybnMgZW1wdHkgc3RyaW5nIGlmIG5vIHJlZmVycmFsIGV4aXN0cy4KZnVuYyBHZXRVc2VyUmVmZXJyZXIodXNlckFkZHIgc3RyaW5nKSBzdHJpbmcgewogICAgcmV0dXJuIHJlZmVycmFsLkdldFJlZmVycmFsKHVzZXJBZGRyKQp9CgovLyBDaGVja1VzZXJIYXNSZWZlcnJhbCByZXR1cm5zIHRydWUgaWYgdGhlIHVzZXIgaGFzIGEgcmVnaXN0ZXJlZCByZWZlcnJhbC4KZnVuYyBDaGVja1VzZXJIYXNSZWZlcnJhbCh1c2VyQWRkciBzdHJpbmcpIGJvb2wgewogICAgcmV0dXJuIHJlZmVycmFsLkhhc1JlZmVycmFsKHVzZXJBZGRyKQp9CmBgYAoKIyMgUmF0ZSBMaW1pdGluZwoKLSBOb24tcmVtb3ZhbCByZWdpc3RyYXRpb25zIGFuZCB1cGRhdGVzIGFyZSBsaW1pdGVkIHRvIG9uZSBvcGVyYXRpb24gcGVyIDI0IGhvdXJzIHBlciBhZGRyZXNzLgotIFBhc3NpbmcgdGhlIHJlZmVycmFsIGNvbnRyYWN0J3Mgb3duIGFkZHJlc3MgcmVtb3ZlcyBhIHJlbGF0aW9uc2hpcCBhbmQgYnlwYXNzZXMgdGhlIHJhdGUtbGltaXQgY2hlY2suCi0gUmVtb3ZhbCBkb2VzIG5vdCBvdmVyd3JpdGUgdGhlIHByZXZpb3VzIG5vbi1yZW1vdmFsIHRpbWVzdGFtcCwgc28gaW1tZWRpYXRlIHJlLXJlZ2lzdHJhdGlvbiBjYW4gc3RpbGwgYmUgcmVqZWN0ZWQgd2hpbGUgdGhhdCB0aW1lc3RhbXAgaXMgd2l0aGluIHRoZSBjb29sZG93bi4KCiMjIEV2ZW50cwoKLSBgUmVnaXN0ZXJSZWZlcnJhbGAgaXMgZW1pdHRlZCBmb3IgZXZlcnkgc3VjY2Vzc2Z1bCBub24tZW1wdHkgd3JpdGUsIGluY2x1ZGluZyBjcmVhdGlvbiwgdXBkYXRlLCBhbmQgcmVtb3ZhbC4KLSBgUmVmZXJyYWxSZWdpc3RyYXRpb25GYWlsZWRgIGlzIGVtaXR0ZWQgd2hlbiBhbiBhdXRob3JpemVkIG5vbi1lbXB0eSB3cml0ZSBmYWlscy4KLSBFbXB0eSByZWZlcnJhbCBxdWVyaWVzIGRvIG5vdCBlbWl0IGV2ZW50cy4KCiMjIFNlY3VyaXR5CgotIE9uZSByZWZlcnJhbCBwZXIgYWRkcmVzcwotIFNlbGYtcmVmZXJyYWxzIGFyZSByZWplY3RlZAotIE5vbi1lbXB0eSB3cml0ZXMgcmVxdWlyZSBhbiBhdXRob3JpemVkIGNhbGxlcgotIFRoZSByZWZlcnJhbCBjb250cmFjdCdzIG93biBhZGRyZXNzIGlzIHRoZSByZW1vdmFsIHNlbnRpbmVsOyB0aGUgemVybyBhZGRyZXNzIGlzIGludmFsaWQKGqIICgphc3NlcnQuZ25vEpMIcGFja2FnZSByZWZlcnJhbAoKaW1wb3J0ICgKCXByYWJjICJnbm8ubGFuZC9wL2dub3N3YXAvcmJhYy92MSIKCgkiZ25vLmxhbmQvci9nbm9zd2FwL2FjY2Vzcy92MSIKCV8gImduby5sYW5kL3IvZ25vc3dhcC9yYmFjL3YxIgopCgovLyBNVVNUIEJFIElNTVVUQUJMRSwgRE8gTk9UIE1PRElGWS4KLy8gdmFsaWRDYWxsZXJSb2xlcyBpcyBhIGxpc3Qgb2Ygcm9sZXMgdGhhdCBhcmUgYXV0aG9yaXplZCB0byBtb2RpZnkgcmVmZXJyYWwgZGF0YS4KLy8gVGhpcyBpbmNsdWRlcyBnb3Zlcm5hbmNlLCBnb3Zlcm5hbmNlIHN0YWtlciwgcm91dGVyLCBwb3NpdGlvbiwgc3Rha2VyLCBhbmQgbGF1bmNocGFkIGNvbnRyYWN0cy4KdmFyIHZhbGlkQ2FsbGVyUm9sZXMgPSBbXXN0cmluZ3sKCXByYWJjLlJPTEVfR09WRVJOQU5DRS5TdHJpbmcoKSwKCXByYWJjLlJPTEVfR09WX1NUQUtFUi5TdHJpbmcoKSwKCXByYWJjLlJPTEVfUk9VVEVSLlN0cmluZygpLAoJcHJhYmMuUk9MRV9QT1NJVElPTi5TdHJpbmcoKSwKCXByYWJjLlJPTEVfU1RBS0VSLlN0cmluZygpLAoJcHJhYmMuUk9MRV9MQVVOQ0hQQUQuU3RyaW5nKCksCn0KCi8vIGFzc2VydFZhbGlkQ2FsbGVyIGNoZWNrcyBpZiB0aGUgY2FsbGVyIGFkZHJlc3MgaGFzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHJlZmVycmFsIGRhdGEuCi8vIE9ubHkgYWRkcmVzc2VzIHdpdGggc3BlY2lmaWMgcm9sZXMgZGVmaW5lZCBpbiB2YWxpZENhbGxlclJvbGVzIGFyZSBhdXRob3JpemVkLgovLwovLyBFcnJvcnM6Ci8vICAgLSBFcnJVbmF1dGhvcml6ZWQ6IHRoZSBjYWxsZXIgaXMgbm90IGF1dGhvcml6ZWQgdG8gbW9kaWZ5IHJlZmVycmFsIGRhdGEKZnVuYyBhc3NlcnRWYWxpZENhbGxlcihjYWxsZXIgYWRkcmVzcykgewoJZm9yIF8sIHJvbGUgOj0gcmFuZ2UgdmFsaWRDYWxsZXJSb2xlcyB7CgkJaWYgYWNjZXNzLklzQXV0aG9yaXplZChyb2xlLCBjYWxsZXIpIHsKCQkJcmV0dXJuCgkJfQoJfQoKCXBhbmljKG1ha2VFcnJvcldpdGhEZXRhaWxzKEVyclVuYXV0aG9yaXplZCwgY2FsbGVyLlN0cmluZygpKSkKfQoa/y4KB2RvYy5nbm8S8y4vLyBQYWNrYWdlIHJlZmVycmFsIGltcGxlbWVudHMgYSByZWZlcnJhbCBzeXN0ZW0gb24gR25vLiBJdCBhbGxvd3MKLy8gYXV0aG9yaXplZCBjb250cmFjdHMgdG8gcmVnaXN0ZXIsIHVwZGF0ZSwgb3IgcmVtb3ZlIHJlZmVycmFsCi8vIHJlbGF0aW9uc2hpcHMuIEEgcmVmZXJyYWwgbGluayBpcyBkZWZpbmVkIGFzIGEgbWFwcGluZyBmcm9tIG9uZQovLyBhZGRyZXNzICh0aGUgInVzZXIiKSB0byBhbm90aGVyIGFkZHJlc3MgKHRoZSAicmVmZXJyZXIiKS4KLy8KLy8gIyMgT3ZlcnZpZXcKLy8KLy8gVGhlIHJlZmVycmFsIHBhY2thZ2UgaXMgY29tcG9zZWQgb2YgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOgovLwovLyAgMS4gKiplcnJvcnMuZ25vKio6IERlZmluZXMgZXJyb3IgdHlwZXMgZm9yIGludmFsaWQgYWRkcmVzc2VzLAovLyAgICAgdW5hdXRob3JpemVkIGNhbGxlcnMsIHNlbGYtcmVmZXJyYWxzLCByYXRlIGxpbWl0cywgYW5kIG1pc3NpbmcgcmVmZXJyYWxzLgovLyAgMi4gKiphc3NlcnQuZ25vKio6IENoZWNrcyB3aGV0aGVyIGEgY2FsbGVyIGhhcyBhbiBhdXRob3JpemVkIHJvbGUuCi8vICAzLiAqKnR5cGUuZ25vKio6IERlZmluZXMgdGhlIFJlZmVycmFsS2VlcGVyIGludGVyZmFjZSBhbmQgdGhlIGNvbnRyYWN0LWFkZHJlc3MKLy8gICAgIHNlbnRpbmVsIHVzZWQgdG8gcmVxdWVzdCByZW1vdmFsLgovLyAgNC4gKiprZWVwZXIuZ25vKio6IEltcGxlbWVudHMgUmVmZXJyYWxLZWVwZXIgd2l0aCBCUFRyZWUgc3RvcmFnZS4gTm9uLXJlbW92YWwKLy8gICAgIHJlZ2lzdHJhdGlvbnMgYW5kIHVwZGF0ZXMgaGF2ZSBhIDI0LWhvdXIgY29vbGRvd24uCi8vICA1LiAqKmdsb2JhbF9rZWVwZXIuZ25vKio6IEV4cG9zZXMgdGhlIHB1YmxpYyBBUEkgYW5kIGVtaXRzIHJlZmVycmFsIGV2ZW50cy4KLy8KLy8gIyMgUHVibGljIEFQSQovLwovLyBUaGUgcGFja2FnZSBleHBvc2VzIHRoZSBmb2xsb3dpbmcgcHVibGljIGZ1bmN0aW9uczoKLy8KLy8gICAtIEdldFJlZmVycmFsKGFkZHIgc3RyaW5nKSBzdHJpbmc6IFJldHVybnMgdGhlIHJlZmVycmVyIGFkZHJlc3MgZm9yCi8vICAgICB0aGUgZ2l2ZW4gdXNlci4gUmV0dXJucyBlbXB0eSBzdHJpbmcgaWYgbm90IGZvdW5kLgovLyAgIC0gSGFzUmVmZXJyYWwoYWRkciBzdHJpbmcpIGJvb2w6IFJldHVybnMgdHJ1ZSBpZiB0aGUgdXNlciBoYXMgYQovLyAgICAgcmVnaXN0ZXJlZCByZWZlcnJlci4KLy8gICAtIElzRW1wdHkoKSBib29sOiBSZXR1cm5zIHRydWUgaWYgbm8gcmVmZXJyYWwgcmVsYXRpb25zaGlwcyBleGlzdC4KLy8gICAtIEdldExhc3RPcFRpbWVzdGFtcChhZGRyIHN0cmluZykgKGludDY0LCBlcnJvcik6IFJldHVybnMgdGhlIGxhc3QKLy8gICAgIG5vbi1yZW1vdmFsIHJlZ2lzdHJhdGlvbiBvciB1cGRhdGUgdGltZXN0YW1wIGZvciB0aGUgdXNlci4KLy8gICAtIFRyeVJlZ2lzdGVyKGN1ciByZWFsbSwgYWRkciBhZGRyZXNzLCByZWZlcnJhbCBzdHJpbmcpIHN0cmluZzoKLy8gICAgIEVtcHR5IGlucHV0IHJlYWRzIHRoZSBzdG9yZWQgcmVmZXJyYWwgd2l0aG91dCBhdXRob3JpemF0aW9uLiBBIG5vbi1lbXB0eQovLyAgICAgaW5wdXQgcmVnaXN0ZXJzLCB1cGRhdGVzLCBvciByZW1vdmVzIGEgcmVsYXRpb25zaGlwIGFuZCByZXR1cm5zIHRoZQovLyAgICAgZWZmZWN0aXZlIHJlZmVycmVyIHN0cmluZy4gUGFzc2luZyBDb250cmFjdEFkZHJlc3MoKSByZXF1ZXN0cyByZW1vdmFsLgovLwovLyAjIyBXb3JrZmxvdwovLwovLyBUeXBpY2FsIHVzYWdlIG9mIHRoaXMgY29udHJhY3QgZm9sbG93cyB0aGVzZSBzdGVwczoKLy8KLy8gIDEuIEEgY2FsbGVyIHVzZXMgVHJ5UmVnaXN0ZXIgdG8gcmVzb2x2ZSB0aGUgZWZmZWN0aXZlIHJlZmVycmVyLiBFbXB0eSBpbnB1dAovLyAgICAgb25seSByZWFkczsgbm9uLWVtcHR5IGlucHV0IG11c3QgY29tZSBmcm9tIGFuIGF1dGhvcml6ZWQgcm9sZS4KLy8gIDIuIFRoZSBrZWVwZXIgdmFsaWRhdGVzIHRoZSBjYWxsZXIncyBwZXJtaXNzaW9ucyB2aWEgYXNzZXJ0VmFsaWRDYWxsZXIuCi8vICAzLiBBZGRyZXNzIHZhbGlkYXRpb24gZW5zdXJlcyB0aGUgdXNlciBhZGRyZXNzIGlzIHZhbGlkLCB0aGUgcmVmZXJyYWwgaXMKLy8gICAgIHZhbGlkIGZvciByZWdpc3RyYXRpb24sIGFuZCBzZWxmLXJlZmVycmFscyBhcmUgcmVqZWN0ZWQuIFRoZSBjb250cmFjdCdzCi8vICAgICBvd24gYWRkcmVzcyBpcyB0aGUgcmVtb3ZhbCBzZW50aW5lbC4KLy8gIDQuIFRoZSAyNC1ob3VyIHJhdGUgbGltaXQgaXMgY2hlY2tlZCBmb3Igbm9uLXJlbW92YWwgcmVnaXN0cmF0aW9ucyBhbmQKLy8gICAgIHVwZGF0ZXMuIFJlbW92YWwgYnlwYXNzZXMgdGhpcyBjaGVjay4KLy8gIDUuIFN1Y2Nlc3NmdWwgbm9uLXJlbW92YWwgd3JpdGVzIHN0b3JlIGEgbmV3IHRpbWVzdGFtcC4gU3VjY2Vzc2Z1bAovLyAgICAgbm9uLWVtcHR5IHdyaXRlcyBlbWl0IGEgUmVnaXN0ZXJSZWZlcnJhbCBldmVudC4KLy8KLy8gIyMgQXV0aG9yaXplZCBDYWxsZXJzCi8vCi8vIE9ubHkgY29udHJhY3RzIHdpdGggdGhlIGZvbGxvd2luZyByb2xlcyBjYW4gbW9kaWZ5IHJlZmVycmFsIGRhdGE6Ci8vCi8vICAgLSBST0xFX0dPVkVSTkFOQ0U6IEdvdmVybmFuY2UgY29udHJhY3RzCi8vICAgLSBST0xFX0dPVl9TVEFLRVI6IEdvdmVybmFuY2Ugc3Rha2VyIGNvbnRyYWN0cwovLyAgIC0gUk9MRV9ST1VURVI6IFJvdXRlciBjb250cmFjdHMKLy8gICAtIFJPTEVfUE9TSVRJT046IFBvc2l0aW9uIG1hbmFnZXIgY29udHJhY3RzCi8vICAgLSBST0xFX1NUQUtFUjogU3Rha2VyIGNvbnRyYWN0cwovLyAgIC0gUk9MRV9MQVVOQ0hQQUQ6IExhdW5jaHBhZCBjb250cmFjdHMKLy8KLy8gIyMgUmF0ZSBMaW1pdGluZwovLwovLyBUbyBwcmV2ZW50IGFidXNlLCB0aGUgc3lzdGVtIGVuZm9yY2VzIGEgMjQtaG91ciBjb29sZG93biBiZXR3ZWVuIG5vbi1yZW1vdmFsCi8vIHJlZ2lzdHJhdGlvbnMgb3IgdXBkYXRlcyBmb3IgZWFjaCBhZGRyZXNzLiBUaGlzIG1lYW5zOgovLwovLyAgIC0gQSBuZXcgcmVmZXJyYWwgY2FuIG9ubHkgYmUgcmVnaXN0ZXJlZCBvbmNlIHBlciAyNCBob3VycyBwZXIgYWRkcmVzcy4KLy8gICAtIFVwZGF0ZXMgYXJlIGFsc28gc3ViamVjdCB0byB0aGUgc2FtZSByYXRlIGxpbWl0LgovLyAgIC0gUmVtb3ZhbCB2aWEgdGhlIGNvbnRyYWN0LWFkZHJlc3Mgc2VudGluZWwgYnlwYXNzZXMgdGhlIHJhdGUtbGltaXQgY2hlY2suCi8vICAgLSBSZW1vdmFsIGRvZXMgbm90IG92ZXJ3cml0ZSB0aGUgcHJldmlvdXMgdGltZXN0YW1wLCBzbyBpbW1lZGlhdGUKLy8gICAgIHJlLXJlZ2lzdHJhdGlvbiBjYW4gc3RpbGwgYmUgcmVqZWN0ZWQgZHVyaW5nIHRoZSBwcmlvciBjb29sZG93bi4KLy8gICAtIEF0dGVtcHRzIHRoYXQgZXhjZWVkIHRoZSBjb29sZG93biByZXR1cm4gRXJyVG9vTWFueVJlcXVlc3RzLgovLwovLyAjIyBFdmVudHMKLy8KLy8gVGhlIHBhY2thZ2UgZW1pdHMgdGhlIGZvbGxvd2luZyBldmVudHM6Ci8vCi8vICAgLSBSZWdpc3RlclJlZmVycmFsOiBFbWl0dGVkIGZvciBldmVyeSBzdWNjZXNzZnVsIG5vbi1lbXB0eSB3cml0ZSwgaW5jbHVkaW5nCi8vICAgICBjcmVhdGlvbiwgdXBkYXRlLCBhbmQgcmVtb3ZhbC4KLy8gICAtIFJlZmVycmFsUmVnaXN0cmF0aW9uRmFpbGVkOiBFbWl0dGVkIHdoZW4gYW4gYXV0aG9yaXplZCBub24tZW1wdHkgd3JpdGUKLy8gICAgIGZhaWxzLgovLyAgIC0gRW1wdHkgcmVmZXJyYWwgcXVlcmllcyBkbyBub3QgZW1pdCBldmVudHMuCi8vCi8vICMjIEVycm9yIEhhbmRsaW5nCi8vCi8vIFRoZSBwYWNrYWdlIGRlZmluZXMgc2V2ZXJhbCBlcnJvciB0eXBlczoKLy8gICAtIGBFcnJJbnZhbGlkQWRkcmVzc2A6IFJldHVybmVkIHdoZW4gYW4gYWRkcmVzcyBmb3JtYXQgaXMgaW52YWxpZAovLyAgIC0gYEVyclNlbGZSZWZlcnJhbGA6IFJldHVybmVkIHdoZW4gYXR0ZW1wdGluZyB0byBzZXQgc2VsZiBhcyByZWZlcnJlcgovLyAgIC0gYEVyclVuYXV0aG9yaXplZGA6IFJldHVybmVkIHdoZW4gdGhlIGNhbGxlciBsYWNrcyBwZXJtaXNzaW9uCi8vICAgLSBgRXJyVG9vTWFueVJlcXVlc3RzYDogUmV0dXJuZWQgd2hlbiByYXRlIGxpbWl0IGlzIGV4Y2VlZGVkICgyNC1ob3VyIGNvb2xkb3duKQovLyAgIC0gYEVyck5vdEZvdW5kYDogUmV0dXJuZWQgd2hlbiBhdHRlbXB0aW5nIHRvIGdldCBhIG5vbi1leGlzdGVudCByZWZlcnJhbAovLyAgIC0gYEVyckludmFsaWRUaW1lYDogUmV0dXJuZWQgd2hlbiB0aGUgc3RvcmVkIHRpbWVzdGFtcCBmb3JtYXQgaXMgaW52YWxpZAovLwovLyAjIyBFeGFtcGxlOiBJbnRlZ3JhdGlvbiB3aXRoIFJvdXRlciBDb250cmFjdAovLwovLyBUaGUgcm91dGVyIGNvbnRyYWN0IGNhbiByZWdpc3RlciByZWZlcnJhbHMgZHVyaW5nIHN3YXAgb3BlcmF0aW9uczoKLy8KLy8gYGBgZ28KLy8KLy8JaW1wb3J0ICgKLy8JICAgICJnbm8ubGFuZC9yL2dub3N3YXAvcmVmZXJyYWwvdjEiCi8vCSkKLy8KLy8JZnVuYyBTd2FwV2l0aFJlZmVycmFsKGN1ciByZWFsbSwgcmVmZXJyYWxDb2RlIHN0cmluZywgLi4uKSB7Ci8vCSAgICAvLyBHZXQgdGhlIGNhbGxlciBhZGRyZXNzCi8vCSAgICBjYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCi8vCi8vCSAgICBhY3R1YWxSZWZlcnJlciA6PSByZWZlcnJhbC5UcnlSZWdpc3Rlcihjcm9zcyhjdXIpLCBjYWxsZXIsIHJlZmVycmFsQ29kZSkKLy8KLy8JICAgIC8vIENvbnRpbnVlIHdpdGggc3dhcCBsb2dpYy4uLgovLwl9Ci8vCi8vIGBgYAovLwovLyAjIyBFeGFtcGxlOiBDaGVja2luZyBSZWZlcnJhbCBmb3IgUmV3YXJkcwovLwovLyBPdGhlciBjb250cmFjdHMgY2FuIGNoZWNrIHJlZmVycmFsIHJlbGF0aW9uc2hpcHMgZm9yIHJld2FyZCBkaXN0cmlidXRpb246Ci8vCi8vIGBgYGdvCi8vCi8vCWltcG9ydCAoCi8vCSAgICAiZ25vLmxhbmQvci9nbm9zd2FwL3JlZmVycmFsL3YxIgovLwkpCi8vCi8vCWZ1bmMgRGlzdHJpYnV0ZVJld2FyZHModXNlciBhZGRyZXNzLCBhbW91bnQgdWludDY0KSB7Ci8vCSAgICAvLyBDaGVjayBpZiB1c2VyIGhhcyBhIHJlZmVycmVyCi8vCSAgICBpZiByZWZlcnJhbC5IYXNSZWZlcnJhbCh1c2VyLlN0cmluZygpKSB7Ci8vCSAgICAgICAgcmVmZXJyZXJBZGRyIDo9IHJlZmVycmFsLkdldFJlZmVycmFsKHVzZXIuU3RyaW5nKCkpCi8vCSAgICAgICAgLy8gQ2FsY3VsYXRlIGFuZCBkaXN0cmlidXRlIHJlZmVycmFsIGJvbnVzCi8vCSAgICAgICAgcmVmZXJyZXJCb251cyA6PSBhbW91bnQgKiByZWZlcnJhbFJhdGUgLyAxMDAKLy8JICAgICAgICBzZW5kUmV3YXJkKGFkZHJlc3MocmVmZXJyZXJBZGRyKSwgcmVmZXJyZXJCb251cykKLy8JICAgIH0KLy8JfQovLwovLyBgYGAKLy8KLy8gIyMgTGltaXRhdGlvbnMgYW5kIENvbnN0cmFpbnRzCi8vCi8vICAgLSBBIHVzZXIgY2FuIGhhdmUgb25seSBvbmUgcmVmZXJyZXIgYXQgYSB0aW1lLgovLyAgIC0gU2VsZi1yZWZlcnJhbCBpcyBub3QgYWxsb3dlZC4KLy8gICAtIE5vbi1yZW1vdmFsIHJlZ2lzdHJhdGlvbnMgYW5kIHVwZGF0ZXMgYXJlIHJhdGUtbGltaXRlZCB0byBvbmNlIHBlciAyNAovLyAgICAgaG91cnMgcGVyIGFkZHJlc3MuCi8vICAgLSBPbmx5IGNhbGxlcnMgd2l0aCBhbiBhdXRob3JpemVkIHJvbGUgY2FuIHBlcmZvcm0gbm9uLWVtcHR5IHdyaXRlcy4KLy8gICAtIFRoZSByZWZlcnJhbCBjb250cmFjdCdzIG93biBhZGRyZXNzIGlzIHRoZSByZW1vdmFsIHNlbnRpbmVsOyB0aGUgemVybwovLyAgICAgYWRkcmVzcyBpcyBpbnZhbGlkLgovLwovLyAjIyBOb3RlcwovLwovLyAgIC0gVGhlIGNvbnRyYWN0IHVzZXMgUkJBQyAoUm9sZS1CYXNlZCBBY2Nlc3MgQ29udHJvbCkgZm9yIGF1dGhvcml6YXRpb24uCi8vICAgLSBSYXRlLWxpbWl0IHN0YXRlIHBlcnNpc3RzIGFjcm9zcyB0cmFuc2FjdGlvbnMuCi8vICAgLSBUaGUgcmVmZXJyYWwgcmVsYXRpb25zaGlwIGlzIHN0b3JlZCBpbiBhIEJQVHJlZS4KcGFja2FnZSByZWZlcnJhbAoakAQKCmVycm9ycy5nbm8SgQRwYWNrYWdlIHJlZmVycmFsCgppbXBvcnQgKAoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgpjb25zdCAoCglFcnJJbnZhbGlkQWRkcmVzcyAgPSAiaW52YWxpZCBhZGRyZXNzIGZvcm1hdCIKCUVyclNlbGZSZWZlcnJhbCAgICA9ICJzZWxmIHJlZmVycmFsIGlzIG5vdCBhbGxvd2VkIgoJRXJyVW5hdXRob3JpemVkICAgID0gInVuYXV0aG9yaXplZCBjYWxsZXIiCglFcnJUb29NYW55UmVxdWVzdHMgPSAidG9vIG1hbnkgcmVxdWVzdHM6IG9wZXJhdGlvbnMgYWxsb3dlZCBvbmNlIHBlciAyNCBob3VycyBmb3IgZWFjaCBhZGRyZXNzIgoJRXJyTm90Rm91bmQgICAgICAgID0gInJlZmVycmFsIG5vdCBmb3VuZCIKCUVyckludmFsaWRUaW1lICAgICA9ICJpbnZhbGlkIHRpbWUgZm9ybWF0IgopCgpmdW5jIG1ha2VFcnJvcldpdGhEZXRhaWxzKG1lc3NhZ2Ugc3RyaW5nLCBkZXRhaWwgc3RyaW5nKSBlcnJvciB7CglyZXR1cm4gdWZtdC5FcnJvcmYoIiVzOiAlcyIsIG1lc3NhZ2UsIGRldGFpbCkKfQoa7RoKEWdsb2JhbF9rZWVwZXIuZ25vEtcacGFja2FnZSByZWZlcnJhbAoKaW1wb3J0ICgKCSJjaGFpbiIKKQoKdmFyIGdSZWZlcnJhbEtlZXBlciBSZWZlcnJhbEtlZXBlcgoKLy8gRXZlbnRSZWdpc3RlckZhaWxlZCBpcyBlbWl0dGVkIHdoZW4gYW4gYXV0aG9yaXplZCBub24tZW1wdHkgd3JpdGUgZmFpbHMuCi8vIFN1Y2Nlc3NmdWwgbm9uLWVtcHR5IHdyaXRlcyBlbWl0IHRoZSBSZWdpc3RlclJlZmVycmFsIGV2ZW50Lgpjb25zdCBFdmVudFJlZ2lzdGVyRmFpbGVkID0gIlJlZmVycmFsUmVnaXN0cmF0aW9uRmFpbGVkIgoKZnVuYyBpbml0KCkgewoJaWYgZ1JlZmVycmFsS2VlcGVyID09IG5pbCB7CgkJZ1JlZmVycmFsS2VlcGVyID0gTmV3S2VlcGVyKCkKCX0KfQoKLy8gR2V0UmVmZXJyYWwgcmV0dXJucyB0aGUgcmVmZXJyYWwgYWRkcmVzcyBzdHJpbmcgc3RvcmVkIGZvciB0aGUgZ2l2ZW4gYWRkcmVzcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGFkZHI6IGFkZHJlc3Mgc3RyaW5nIHdob3NlIHJlZmVycmFsIHJlbGF0aW9uc2hpcCBpcyBxdWVyaWVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVmZXJyYWw6IHN0b3JlZCByZWZlcnJlciBhZGRyZXNzIHN0cmluZywgb3IgYW4gZW1wdHkgc3RyaW5nIHdoZW4gbm8gdmFsaWQgcmVmZXJyYWwgaXMgZm91bmQuCmZ1bmMgR2V0UmVmZXJyYWwoYWRkciBzdHJpbmcpIHN0cmluZyB7CglyZWZlcnJhbCwgZXJyIDo9IGdSZWZlcnJhbEtlZXBlci5nZXQoYWRkcmVzcyhhZGRyKSkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuIHJlZmVycmFsLlN0cmluZygpCn0KCi8vIEhhc1JlZmVycmFsIHJlcG9ydHMgd2hldGhlciB0aGUgZ2l2ZW4gYWRkcmVzcyBoYXMgYSBzdG9yZWQgcmVmZXJyYWwuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhZGRyOiBhZGRyZXNzIHN0cmluZyB3aG9zZSByZWZlcnJhbCByZWxhdGlvbnNoaXAgaXMgY2hlY2tlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGhhc1JlZmVycmFsOiB0cnVlIHdoZW4gYSByZWZlcnJhbCByZWNvcmQgZXhpc3RzOyBmYWxzZSB3aGVuIGl0IGlzIGFic2VudCBvciBpbnZhbGlkLgpmdW5jIEhhc1JlZmVycmFsKGFkZHIgc3RyaW5nKSBib29sIHsKCV8sIGVyciA6PSBnUmVmZXJyYWxLZWVwZXIuZ2V0KGFkZHJlc3MoYWRkcikpCglyZXR1cm4gZXJyID09IG5pbAp9CgovLyBJc0VtcHR5IHJlcG9ydHMgd2hldGhlciB0aGUgcmVmZXJyYWwga2VlcGVyIGNvbnRhaW5zIG5vIHJlZmVycmFsIHJlY29yZHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlbXB0eTogdHJ1ZSB3aGVuIHRoZSBrZWVwZXIgc3RvcmUgaGFzIHplcm8gcmVmZXJyYWwgcmVjb3Jkcy4KZnVuYyBJc0VtcHR5KCkgYm9vbCB7CglyZXR1cm4gZ1JlZmVycmFsS2VlcGVyLmlzRW1wdHkoKQp9CgovLyBHZXRMYXN0T3BUaW1lc3RhbXAgcmV0dXJucyB0aGUgbGFzdCBub24tcmVtb3ZhbCByZWdpc3RyYXRpb24gb3IgdXBkYXRlIHRpbWVzdGFtcCBmb3IgYW4gYWRkcmVzcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGFkZHI6IGFkZHJlc3Mgc3RyaW5nIHdob3NlIGxhc3Qgbm9uLXJlbW92YWwgb3BlcmF0aW9uIGlzIHF1ZXJpZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aW1lc3RhbXA6IFVuaXggdGltZXN0YW1wIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgcmVnaXN0cmF0aW9uIG9yIHVwZGF0ZS4KLy8gICAtIGVycm9yOiBuaWwgd2hlbiBhIHRpbWVzdGFtcCBleGlzdHM7IG90aGVyd2lzZSBhbiBpbnZhbGlkLWFkZHJlc3Mgb3IgRXJyTm90Rm91bmQgZXJyb3IuCmZ1bmMgR2V0TGFzdE9wVGltZXN0YW1wKGFkZHIgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ1JlZmVycmFsS2VlcGVyLmdldExhc3RPcFRpbWVzdGFtcChhZGRyZXNzKGFkZHIpKQp9CgovLyBDb250cmFjdEFkZHJlc3MgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVmZXJyYWwgY29udHJhY3QuCi8vIFVzZSB0aGlzIGFkZHJlc3MgYXMgdGhlIHJlZmVycmFsIHBhcmFtZXRlciBpbiBUcnlSZWdpc3RlciB0byByZW1vdmUgYW4gZXhpc3RpbmcgcmVmZXJyYWwuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhZGRyZXNzOiByZWZlcnJhbCBjb250cmFjdCBhZGRyZXNzIHN0cmluZywgdXNlZCBhcyB0aGUgcmVtb3ZhbCBzZW50aW5lbC4KZnVuYyBDb250cmFjdEFkZHJlc3MoKSBzdHJpbmcgewoJcmV0dXJuIHNlbGZBZGRyZXNzLlN0cmluZygpCn0KCi8vIFRyeVJlZ2lzdGVyIGF0dGVtcHRzIHRvIHJlZ2lzdGVyLCB1cGRhdGUsIG9yIHJlbW92ZSBhIHJlZmVycmFsLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBhZGRyOiBhZGRyZXNzIHdob3NlIHJlZmVycmFsIHJlbGF0aW9uc2hpcCBpcyByZWFkIG9yIGNoYW5nZWQuCi8vICAgLSByZWZlcnJhbDogZW1wdHkgc3RyaW5nIGZvciBhIHJlYWQsIENvbnRyYWN0QWRkcmVzcygpIHRvIHJlbW92ZSwgb3IgYSBjYW5kaWRhdGUgcmVmZXJyZXIgYWRkcmVzcyBzdHJpbmcuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlZmZlY3RpdmVSZWZlcnJhbDogc3RvcmVkIHJlZmVycmVyIGFmdGVyIHRoZSBvcGVyYXRpb24gb3IgZmFsbGJhY2s7IGVtcHR5IHdoZW4gbm9uZSBpcyBzdG9yZWQuCi8vCi8vIEVtcHR5IGlucHV0IGlzIHRyZWF0ZWQgYXMgYSByZWFkIGFuZCByZXR1cm5zIHRoZSBzdG9yZWQgcmVmZXJyZXIgd2l0aG91dAovLyBhdXRob3JpemF0aW9uLCByYXRlLWxpbWl0IGNoZWNrcywgb3IgZXZlbnQgZW1pc3Npb24uCi8vIE5vbi1lbXB0eSBpbnB1dCByZXF1aXJlcyBhbiBhdXRob3JpemVkIGNhbGxlci4KZnVuYyBUcnlSZWdpc3RlcihjdXIgcmVhbG0sIGFkZHIgYWRkcmVzcywgcmVmZXJyYWwgc3RyaW5nKSBzdHJpbmcgewoJaWYgcmVmZXJyYWwgPT0gIiIgewoJCXJldHVybiBHZXRSZWZlcnJhbChhZGRyLlN0cmluZygpKQoJfQoKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWFzc2VydFZhbGlkQ2FsbGVyKGNhbGxlcikKCglyZXN1bHQsIGVyciA6PSBnUmVmZXJyYWxLZWVwZXIucmVnaXN0ZXIoYWRkciwgYWRkcmVzcyhyZWZlcnJhbCkpCglpZiBlcnIgIT0gbmlsIHsKCQljaGFpbi5FbWl0KAoJCQlFdmVudFJlZ2lzdGVyRmFpbGVkLAoJCQkiYWRkcmVzcyIsIGFkZHIuU3RyaW5nKCksCgkJCSJlcnJvciIsIGVyci5FcnJvcigpLAoJCSkKCgkJcmV0dXJuIEdldFJlZmVycmFsKGFkZHIuU3RyaW5nKCkpCgl9CgoJY2hhaW4uRW1pdCgKCQkiUmVnaXN0ZXJSZWZlcnJhbCIsCgkJInByZXZBZGRyIiwgY2FsbGVyLlN0cmluZygpLAoJCSJhZGRyZXNzIiwgYWRkci5TdHJpbmcoKSwKCQkicmVmZXJyYWwiLCByZXN1bHQuU3RyaW5nKCksCgkpCgoJcmV0dXJuIHJlc3VsdC5TdHJpbmcoKQp9ChpFCgtnbm9tb2QudG9tbBI2bW9kdWxlID0gImduby5sYW5kL3IvZ25vc3dhcC9yZWZlcnJhbC92MSIKZ25vID0gIjAuOSIKGuUdCgprZWVwZXIuZ25vEtYdcGFja2FnZSByZWZlcnJhbAoKaW1wb3J0ICgKCSJlcnJvcnMiCgkidGltZSIKCglicHRyZWUgImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgopCgpjb25zdCAoCgkvLyBNaW5UaW1lQmV0d2VlblVwZGF0ZXMgaXMgbWluaW11bSBkdXJhdGlvbiBiZXR3ZWVuIG9wZXJhdGlvbnMgKDI0IGhvdXJzKS4KCU1pblRpbWVCZXR3ZWVuVXBkYXRlcyBpbnQ2NCA9IDI0ICogNjAgKiA2MAopCgovLyBrZWVwZXIgaW1wbGVtZW50cyBSZWZlcnJhbEtlZXBlciB1c2luZyBCUFRyZWUgc3RvcmFnZS4KLy8gTm9uLXJlbW92YWwgcmVnaXN0cmF0aW9ucyBhbmQgdXBkYXRlcyB1c2UgYSAyNC1ob3VyIGNvb2xkb3duOyByZW1vdmFsIHZpYQovLyB0aGUgY29udHJhY3QtYWRkcmVzcyBzZW50aW5lbCBieXBhc3NlcyB0aGF0IGNoZWNrIGFuZCBwcmVzZXJ2ZXMgdGhlIHRpbWVzdGFtcC4KdHlwZSBrZWVwZXIgc3RydWN0IHsKCXN0b3JlICAgKmJwdHJlZS5CUFRyZWUgLy8gYWRkcmVzcyhzdHJpbmcpIC0+IHJlZmVycmFsIGFkZHJlc3Moc3RyaW5nKQoJbGFzdE9wcyAqYnB0cmVlLkJQVHJlZSAvLyBhZGRyZXNzKHN0cmluZykgLT4gbGFzdCBvcGVyYXRpb24gdGltZXN0YW1wKGludDY0KQp9Cgp2YXIgXyBSZWZlcnJhbEtlZXBlciA9ICZrZWVwZXJ7fQoKLy8gTmV3S2VlcGVyIGNyZWF0ZXMgYW4gZW1wdHkgUmVmZXJyYWxLZWVwZXIgYmFja2VkIGJ5IGluZGVwZW5kZW50IHJlZmVycmFsIGFuZAovLyBsYXN0LW9wZXJhdGlvbiBCUFRyZWVzLgovLwovLyBSZXR1cm5zOgovLyAgIC0ga2VlcGVyOiBuZXcgcmVmZXJyYWwgc3RvcmUgd2l0aCBubyByZWxhdGlvbnNoaXBzIG9yIG9wZXJhdGlvbiB0aW1lc3RhbXBzCmZ1bmMgTmV3S2VlcGVyKCkgUmVmZXJyYWxLZWVwZXIgewoJcmV0dXJuICZrZWVwZXJ7CgkJc3RvcmU6ICAgYnB0cmVlLk5ld0JQVHJlZU4oMTYpLAoJCWxhc3RPcHM6IGJwdHJlZS5OZXdCUFRyZWVOKDE2KSwKCX0KfQoKLy8gcmVnaXN0ZXIgY3JlYXRlcyBvciB1cGRhdGVzIGEgcmVmZXJyYWwgcmVsYXRpb25zaGlwIGJldHdlZW4gYWRkcmVzc2VzLgovLyBTZXR0aW5nIHJlZkFkZHIgdG8gdGhlIGNvbnRyYWN0J3Mgb3duIGFkZHJlc3MgcmVtb3ZlcyB0aGUgcmVmZXJyYWwuCmZ1bmMgKGsgKmtlZXBlcikgcmVnaXN0ZXIoYWRkciwgcmVmQWRkciBhZGRyZXNzKSAoYWRkcmVzcywgZXJyb3IpIHsKCWlmIGVyciA6PSBrLnZhbGlkYXRlQWRkcmVzc2VzKGFkZHIsIHJlZkFkZHIpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gemVyb0FkZHJlc3MsIGVycgoJfQoKCWFkZHJTdHIgOj0gYWRkci5TdHJpbmcoKQoJcmVmQWRkclN0ciA6PSByZWZBZGRyLlN0cmluZygpCgoJaWYgaXNSZW1vdmFsUmVxdWVzdChyZWZBZGRyKSB7CgkJaWYgay5oYXMoYWRkcikgewoJCQlfLCBvayA6PSBrLnN0b3JlLlJlbW92ZShhZGRyU3RyKQoJCQlpZiAhb2sgewoJCQkJcmV0dXJuIHplcm9BZGRyZXNzLCBlcnJvcnMuTmV3KEVyck5vdEZvdW5kKQoJCQl9CgkJfQoKCQlyZXR1cm4gemVyb0FkZHJlc3MsIG5pbAoJfQoKCWlmIGVyciA6PSBrLmNoZWNrUmF0ZUxpbWl0KGFkZHJTdHIpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gemVyb0FkZHJlc3MsIGVycgoJfQoKCWsuc3RvcmUuU2V0KGFkZHJTdHIsIHJlZkFkZHJTdHIpCglrLmxhc3RPcHMuU2V0KGFkZHJTdHIsIHRpbWUuTm93KCkuVW5peCgpKQoKCXJldHVybiByZWZBZGRyLCBuaWwKfQoKLy8gdmFsaWRhdGVBZGRyZXNzZXMgdmFsaWRhdGVzIHRoYXQgYWRkcmVzc2VzIGFyZSBwcm9wZXJseSBmb3JtYXR0ZWQgYW5kIG5vdCBzZWxmLXJlZmVyZW5jaW5nLgpmdW5jIChrICprZWVwZXIpIHZhbGlkYXRlQWRkcmVzc2VzKGFkZHIsIHJlZkFkZHIgYWRkcmVzcykgZXJyb3IgewoJaWYgIWFkZHIuSXNWYWxpZCgpIHx8ICghaXNSZW1vdmFsUmVxdWVzdChyZWZBZGRyKSAmJiAhcmVmQWRkci5Jc1ZhbGlkKCkpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJJbnZhbGlkQWRkcmVzcykKCX0KCWlmIGFkZHIgPT0gcmVmQWRkciB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU2VsZlJlZmVycmFsKQoJfQoJcmV0dXJuIG5pbAp9CgovLyBoYXMgcmV0dXJucyB0cnVlIGlmIGEgcmVmZXJyYWwgZXhpc3RzIGZvciB0aGUgZ2l2ZW4gYWRkcmVzcy4KZnVuYyAoayAqa2VlcGVyKSBoYXMoYWRkciBhZGRyZXNzKSBib29sIHsKCWV4aXN0cyA6PSBrLnN0b3JlLkdldChhZGRyLlN0cmluZygpKSAhPSBuaWwKCXJldHVybiBleGlzdHMKfQoKLy8gZ2V0IHJldHJpZXZlcyB0aGUgcmVmZXJyYWwgYWRkcmVzcyBmb3IgYSBnaXZlbiBhZGRyZXNzLgovLyBSZXR1cm5zIEVyck5vdEZvdW5kIGlmIG5vIHJlZmVycmFsIGV4aXN0cy4KZnVuYyAoayAqa2VlcGVyKSBnZXQoYWRkciBhZGRyZXNzKSAoYWRkcmVzcywgZXJyb3IpIHsKCWlmICFhZGRyLklzVmFsaWQoKSB7CgkJcmV0dXJuIHplcm9BZGRyZXNzLCBlcnJvcnMuTmV3KEVyckludmFsaWRBZGRyZXNzKQoJfQoKCXZhbCA6PSBrLnN0b3JlLkdldChhZGRyLlN0cmluZygpKQoJaWYgdmFsID09IG5pbCB7CgkJcmV0dXJuIHplcm9BZGRyZXNzLCBlcnJvcnMuTmV3KEVyck5vdEZvdW5kKQoJfQoKCXJlZkFkZHIsIG9rIDo9IHZhbC4oc3RyaW5nKQoJaWYgIW9rIHsKCQlyZXR1cm4gemVyb0FkZHJlc3MsIGVycm9ycy5OZXcoRXJySW52YWxpZEFkZHJlc3MpCgl9CgoJcmV0dXJuIGFkZHJlc3MocmVmQWRkciksIG5pbAp9CgovLyBpc0VtcHR5IHJldHVybnMgdHJ1ZSBpZiBubyByZWZlcnJhbHMgZXhpc3QgaW4gdGhlIHN0b3JlLgpmdW5jIChrICprZWVwZXIpIGlzRW1wdHkoKSBib29sIHsKCXJldHVybiBrLnN0b3JlLlNpemUoKSA9PSAwCn0KCi8vIGdldExhc3RPcFRpbWVzdGFtcCByZXRyaWV2ZXMgdGhlIGxhc3Qgb3BlcmF0aW9uIHRpbWVzdGFtcCBmb3IgYSBnaXZlbiBhZGRyZXNzLgovLyBSZXR1cm5zIEVyck5vdEZvdW5kIGlmIG5vIG9wZXJhdGlvbiBleGlzdHMuCmZ1bmMgKGsgKmtlZXBlcikgZ2V0TGFzdE9wVGltZXN0YW1wKGFkZHIgYWRkcmVzcykgKGludDY0LCBlcnJvcikgewoJaWYgIWFkZHIuSXNWYWxpZCgpIHsKCQlyZXR1cm4gMCwgZXJyb3JzLk5ldyhFcnJJbnZhbGlkQWRkcmVzcykKCX0KCgl2YWwgOj0gay5sYXN0T3BzLkdldChhZGRyLlN0cmluZygpKQoJaWYgdmFsID09IG5pbCB7CgkJcmV0dXJuIDAsIGVycm9ycy5OZXcoRXJyTm90Rm91bmQpCgl9CgoJdHMsIG9rIDo9IHZhbC4oaW50NjQpCglpZiAhb2sgewoJCXJldHVybiAwLCBlcnJvcnMuTmV3KEVyckludmFsaWRUaW1lKQoJfQoKCXJldHVybiB0cywgbmlsCn0KCi8vIGNoZWNrUmF0ZUxpbWl0IHZlcmlmaWVzIGlmIGVub3VnaCB0aW1lIGhhcyBwYXNzZWQgc2luY2UgdGhlIGxhc3Qgb3BlcmF0aW9uLgovLyBSZXR1cm5zIEVyclRvb01hbnlSZXF1ZXN0cyBpZiByYXRlIGxpbWl0IGlzIGV4Y2VlZGVkLgpmdW5jIChrICprZWVwZXIpIGNoZWNrUmF0ZUxpbWl0KGFkZHIgc3RyaW5nKSBlcnJvciB7Cglub3cgOj0gdGltZS5Ob3coKS5Vbml4KCkKCglsYXN0T3BUaW1lUmF3IDo9IGsubGFzdE9wcy5HZXQoYWRkcikKCWlmIGxhc3RPcFRpbWVSYXcgPT0gbmlsIHsKCQlyZXR1cm4gbmlsCgl9CgoJbGFzdE9wVGltZSwgb2sgOj0gbGFzdE9wVGltZVJhdy4oaW50NjQpCglpZiAhb2sgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyckludmFsaWRUaW1lKQoJfQoKCXRpbWVTaW5jZUxhc3RPcCA6PSBub3cgLSBsYXN0T3BUaW1lCglpZiB0aW1lU2luY2VMYXN0T3AgPCBNaW5UaW1lQmV0d2VlblVwZGF0ZXMgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclRvb01hbnlSZXF1ZXN0cykKCX0KCglyZXR1cm4gbmlsCn0KGogMCgpyZW5kZXIuZ25vEvkLcGFja2FnZSByZWZlcnJhbAoKaW1wb3J0ICgKCSJzdHJpbmdzIgoJInRpbWUiCgoJImduby5sYW5kL3AvbW91bC9tZC92MCIKCSJnbm8ubGFuZC9wL21vdWwvbWR0YWJsZS92MCIKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKLy8gUmVuZGVyIGRlc2NyaWJlcyByZWZlcnJhbCByZWdpc3RyYXRpb24gb3Igc2hvd3MgdGhlIHJlZmVycmFsIGZvciBhbiBhZGRyZXNzLgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIHBhdGggPT0gIiIgewoJCXRhYmxlIDo9IG1kdGFibGUuVGFibGV7CgkJCUhlYWRlcnM6IFtdc3RyaW5neyJSdWxlIiwgIlZhbHVlIn0sCgkJCVJvd3M6IFtdW11zdHJpbmd7CgkJCQl7Ik1pbmltdW0gaW50ZXJ2YWwgYmV0d2VlbiByZWdpc3RyYXRpb25zIG9yIHVwZGF0ZXMiLCB1Zm10LlNwcmludGYoIiVkIGhvdXJzIiwgTWluVGltZUJldHdlZW5VcGRhdGVzLzM2MDApfSwKCQkJfSwKCQl9CgoJCXJldHVybiBtZC5IMSgiR25vc3dhcCBSZWZlcnJhbHMiKSArCgkJCSJcbiIgKwoJCQltZC5QYXJhZ3JhcGgoIkF1dGhvcml6ZWQgcHJvdG9jb2wgY29udHJhY3RzIHJlZ2lzdGVyIGEgcmVmZXJyZXIgZm9yIGVhY2ggYWRkcmVzcy4iKSArCgkJCW1kLkgyKCJSZWdpc3RyYXRpb24iKSArCgkJCSJcbiIgKwoJCQl0YWJsZS5TdHJpbmcoKSArCgkJCSJcbiIgKwoJCQltZC5QYXJhZ3JhcGgoCgkJCQkiUmVtb3ZpbmcgYSByZWZlcnJhbCBieXBhc3NlcyB0aGUgaW50ZXJ2YWwgYnV0IGRvZXMgbm90IHJlc2V0IHRoZSBsYXN0IHJlZ2lzdHJhdGlvbiB0aW1lLlxuIisKCQkJCQkiQWRkcmVzcy1zcGVjaWZpYyByZWNvcmRzIGFyZSBhdmFpbGFibGUgYXQgIittZC5JbmxpbmVDb2RlKCJhZGRyZXNzLzxhZGRyZXNzPiIpKyIuIiwKCQkJKQoJfQoKCXBhcnRzIDo9IHN0cmluZ3MuU3BsaXQocGF0aCwgIi8iKQoJaWYgbGVuKHBhcnRzKSAhPSAyIHx8IHBhcnRzWzBdICE9ICJhZGRyZXNzIiB8fCBwYXJ0c1sxXSA9PSAiIiB7CgkJcmV0dXJuICI0MDRcbiIKCX0KCglhZGRyIDo9IHBhcnRzWzFdCglpZiAhSGFzUmVmZXJyYWwoYWRkcikgewoJCXJldHVybiAiNDA0XG4iCgl9CgoJbGFzdE9wVGltZXN0YW1wLCBlcnIgOj0gR2V0TGFzdE9wVGltZXN0YW1wKGFkZHIpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gIjQwNFxuIgoJfQoKCXRhYmxlIDo9IG1kdGFibGUuVGFibGV7CgkJSGVhZGVyczogW11zdHJpbmd7IkZpZWxkIiwgIlZhbHVlIn0sCgkJUm93czogW11bXXN0cmluZ3sKCQkJeyJBZGRyZXNzIiwgYWRkcn0sCgkJCXsiUmVmZXJyZXIiLCBHZXRSZWZlcnJhbChhZGRyKX0sCgkJCXsiTGFzdCByZWdpc3RyYXRpb24gb3IgdXBkYXRlIChVVEMpIiwgdGltZS5Vbml4KGxhc3RPcFRpbWVzdGFtcCwgMCkuVVRDKCkuRm9ybWF0KCIyMDA2LTAxLTAyIDE1OjA0OjA1Iil9LAoJCX0sCgl9CgoJcmV0dXJuIG1kLkgxKCJHbm9zd2FwIFJlZmVycmFsIikgKwoJCSJcbiIgKwoJCW1kLkgyKCJSZWZlcnJhbCByZWNvcmQiKSArCgkJIlxuIiArCgkJdGFibGUuU3RyaW5nKCkKfQoawQoKCHR5cGUuZ25vErQKcGFja2FnZSByZWZlcnJhbAoKY29uc3QgemVyb0FkZHJlc3MgPSBhZGRyZXNzKCIiKQoKLy8gc2VsZkFkZHJlc3MgaXMgY2FjaGVkIGF0IHBhY2thZ2UgaW5pdGlhbGl6YXRpb24gdG8gZW5zdXJlIGNvbnNpc3RlbnQgY29tcGFyaXNvbi4KdmFyIHNlbGZBZGRyZXNzIGFkZHJlc3MKCmZ1bmMgaW5pdChjdXIgcmVhbG0pIHsKCXNlbGZBZGRyZXNzID0gY3VyLkFkZHJlc3MoKQp9CgovLyBjb250cmFjdEFkZHJlc3MgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVmZXJyYWwgY29udHJhY3QuCi8vIFRoaXMgaXMgdXNlZCBhcyBhIHNlbnRpbmVsIHZhbHVlIGZvciByZW1vdmluZyByZWZlcnJhbHMuCmZ1bmMgY29udHJhY3RBZGRyZXNzKCkgYWRkcmVzcyB7CglyZXR1cm4gc2VsZkFkZHJlc3MKfQoKLy8gaXNSZW1vdmFsUmVxdWVzdCBjaGVja3MgaWYgdGhlIGdpdmVuIGFkZHJlc3MgaW5kaWNhdGVzIGEgcmVtb3ZhbCByZXF1ZXN0LgovLyBSZW1vdmFsIGlzIGluZGljYXRlZCBieSBwYXNzaW5nIHRoZSBjb250cmFjdCdzIG93biBhZGRyZXNzIGFzIHRoZSByZWZlcnJhbC4KZnVuYyBpc1JlbW92YWxSZXF1ZXN0KHJlZkFkZHIgYWRkcmVzcykgYm9vbCB7CglyZXR1cm4gcmVmQWRkciA9PSBzZWxmQWRkcmVzcwp9CgovLyBSZWZlcnJhbEtlZXBlciBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgZm9yIG1hbmFnaW5nIHJlZmVycmFsIHJlbGF0aW9uc2hpcHMuCnR5cGUgUmVmZXJyYWxLZWVwZXIgaW50ZXJmYWNlIHsKCS8vIHJlZ2lzdGVyIGNyZWF0ZXMgb3IgdXBkYXRlcyBhIHJlZmVycmFsIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFkZHJlc3Nlcy4KCS8vIFNldHRpbmcgcmVmQWRkciB0byB0aGUgY29udHJhY3QncyBvd24gYWRkcmVzcyByZW1vdmVzIHRoZSByZWZlcnJhbC4KCXJlZ2lzdGVyKGFkZHIsIHJlZkFkZHIgYWRkcmVzcykgKGFkZHJlc3MsIGVycm9yKQoKCS8vIGhhcyByZXR1cm5zIHRydWUgaWYgYSByZWZlcnJhbCBleGlzdHMgZm9yIHRoZSBnaXZlbiBhZGRyZXNzLgoJaGFzKGFkZHIgYWRkcmVzcykgYm9vbAoKCS8vIGdldCByZXRyaWV2ZXMgdGhlIHJlZmVycmFsIGFkZHJlc3MgZm9yIGEgZ2l2ZW4gYWRkcmVzcy4KCWdldChhZGRyIGFkZHJlc3MpIChhZGRyZXNzLCBlcnJvcikKCgkvLyBpc0VtcHR5IHJldHVybnMgdHJ1ZSBpZiBubyByZWZlcnJhbHMgZXhpc3QgaW4gdGhlIHN5c3RlbS4KCWlzRW1wdHkoKSBib29sCgoJLy8gZ2V0TGFzdE9wVGltZXN0YW1wIHJldHVybnMgdGhlIGxhc3Qgb3BlcmF0aW9uIHRpbWVzdGFtcCBmb3IgYW4gYWRkcmVzcy4KCWdldExhc3RPcFRpbWVzdGFtcChhZGRyIGFkZHJlc3MpIChpbnQ2NCwgZXJyb3IpCn0KIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsEhEI+JW+IBIKMzQwNjR1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMEnNUEw+LSOqLPC53myjgfoun1lzihgX/ZUaUiNcK64RJAhh0ssr4ArxWsrUigkBZr93QqNx8vrSTqHEwtyoOEtjZg4gKjbd1nXTtYFZQXgqHUQC6+XF5UOTyVyzUDvOmkGxooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==