Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
C873C718F27D221B5DA7BDF99883CC53D44D03A7E863B66D84F58D1F0C1BAA85
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
47,591,222
Requested gas limit
GAS USED
39,659,381
Gas consumed
FEE
47592ugnot
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
CuiZAgoML3ZtLm1fYWRkcGtnEtaZAgooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBKomQIKD3ZlcnNpb25fbWFuYWdlchIlZ25vLmxhbmQvcC9nbm9zd2FwL3ZlcnNpb25fbWFuYWdlci92MRrjSQoJUkVBRE1FLm1kEtVJIyBWZXJzaW9uIE1hbmFnZXIKClJ1bnRpbWUgdmVyc2lvbiBtYW5hZ2VtZW50IHN5c3RlbSBmb3IgZHluYW1pYyBpbXBsZW1lbnRhdGlvbiBzd2l0Y2hpbmcgd2l0aG91dCBkYXRhIG1pZ3JhdGlvbi4KCiMjIE92ZXJ2aWV3CgpWZXJzaW9uIE1hbmFnZXIgaW1wbGVtZW50cyBhIFN0cmF0ZWd5IFBhdHRlcm4tYmFzZWQgc3lzdGVtIHRoYXQgZW5hYmxlcyBob3Qtc3dhcHBpbmcgYmV0d2VlbiBkaWZmZXJlbnQgdmVyc2lvbmVkIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgc2FtZSBkb21haW4gKGUuZy4sIHYxLCB2MiwgdjMpIHdoaWxlIG1haW50YWluaW5nIGEgdW5pZmllZCBzdG9yYWdlIGxheWVyLiBUaGlzIGFwcHJvYWNoIGFsbG93cyBzZWFtbGVzcyB1cGdyYWRlcyB3aXRob3V0IGRvd250aW1lIG9yIG1pZ3JhdGlvbiBvdmVyaGVhZC4KCiMjIEZlYXR1cmVzCgotICoqWmVyby1Eb3dudGltZSBVcGdyYWRlcyoqOiBTd2l0Y2ggaW1wbGVtZW50YXRpb25zIGF0IHJ1bnRpbWUgd2l0aG91dCBzZXJ2aWNlIGludGVycnVwdGlvbgotICoqVW5pZmllZCBTdG9yYWdlKio6IEFsbCB2ZXJzaW9ucyBzaGFyZSBhIHNpbmdsZSBLVlN0b3JlIG93bmVkIGJ5IHRoZSBkb21haW4gKHByb3h5KSByZWFsbQotICoqRG9tYWluLVNjb3BlZCBTZWN1cml0eSoqOiBPbmx5IGF1dGhvcml6ZWQgcGFja2FnZXMgd2l0aGluIHRoZSBkb21haW4gcGF0aCBjYW4gcmVnaXN0ZXIKLSAqKkhvdC1Td2FwcGluZyoqOiBJbnN0YW50IHZlcnNpb24gc3dpdGNoaW5nIHRocm91Z2ggZHluYW1pYyBzdHJhdGVneSByZXBsYWNlbWVudAotICoqU2VjdXJlIGJ5IERlc2lnbioqOiBJbXBsZW1lbnRhdGlvbiByZWFsbXMgY2Fubm90IGRpcmVjdGx5IG1vZGlmeSBzdG9yYWdlIChzZWUgU3RvcmFnZSBBY2Nlc3MgTW9kZWwgYmVsb3cpCgoqKlBhdHRlcm4qKjogU3RyYXRlZ3kgKyBQbHVnaW4gQXJjaGl0ZWN0dXJlCgojIyBVc2FnZQoKIyMjIFN0ZXAgMTogRGVmaW5lIERvbWFpbiBJbnRlcmZhY2UKCmBgYGdvCi8vIHByb3RvY29sX2ZlZS90eXBlcy5nbm8KcGFja2FnZSBwcm90b2NvbF9mZWUKCnR5cGUgUHJvdG9jb2xGZWUgaW50ZXJmYWNlIHsKICAgIFNldEZlZVJhdGlvKHJhdGlvIHVpbnQ2NCkgZXJyb3IKICAgIEdldEZlZVJhdGlvKCkgdWludDY0Cn0KYGBgCgojIyMgU3RlcCAyOiBDcmVhdGUgVmVyc2lvbiBNYW5hZ2VyCgpgYGBnbwovLyBwcm90b2NvbF9mZWUvcHJvdG9jb2xfZmVlLmdubwpwYWNrYWdlIHByb3RvY29sX2ZlZQoKaW1wb3J0ICgKICAgICJnbm8ubGFuZC9wL2dub3N3YXAvc3RvcmUvdjEiCiAgICAiZ25vLmxhbmQvcC9nbm9zd2FwL3ZlcnNpb25fbWFuYWdlci92MSIKKQoKdmFyIG1hbmFnZXIgdmVyc2lvbl9tYW5hZ2VyLlZlcnNpb25NYW5hZ2VyCgpmdW5jIGluaXQoY3VyIHJlYWxtKSB7CiAgICBrdlN0b3JlIDo9IHN0b3JlLk5ld0tWU3RvcmUoY3VyLkFkZHJlc3MoKSkKCiAgICBtYW5hZ2VyID0gdmVyc2lvbl9tYW5hZ2VyLk5ld1ZlcnNpb25NYW5hZ2VyKAogICAgICAgIGN1ci5Qa2dQYXRoKCksCiAgICAgICAga3ZTdG9yZSwKICAgICAgICAvLyBpbml0aWFsaXplRG9tYWluU3RvcmVGbiBjYXJyaWVzIHRoZSB2MiBpbnRlcnJlYWxtIG1hcmtlciAoYF8gaW50LCBybG0gcmVhbG1gKToKICAgICAgICAvLyB0aGUgbGVhZGluZyAwIHN1cmZhY2VzIHJlYWxtLXRocmVhZGluZyBhdCB0aGUgY2FsbCBzaXRlLgogICAgICAgIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSwga3Ygc3RvcmUuS1ZTdG9yZSkgYW55IHsKICAgICAgICAgICAgcmV0dXJuIE5ld1Byb3RvY29sRmVlU3RvcmUoa3YpCiAgICAgICAgfSwKICAgICkKfQoKZnVuYyBHZXRNYW5hZ2VyKCkgdmVyc2lvbl9tYW5hZ2VyLlZlcnNpb25NYW5hZ2VyIHsKICAgIHJldHVybiBtYW5hZ2VyCn0KCi8vIFJlZ2lzdGVySW5pdGlhbGl6ZXIgaXMgdGhlIGNyb3NzaW5nIGVudHJ5IHBvaW50IGVhY2ggdmVyc2lvbiBwYWNrYWdlIGNhbGxzLgovLyBgY3VyYCBpcyB0aGUgbGl2ZSBjcm9zc2luZy1mcmFtZSByZWFsbSB0b2tlbjsgaXQgaXMgdGhyZWFkZWQgc3RyYWlnaHQgaW50byB0aGUKLy8gdmVyc2lvbiBtYW5hZ2VyICh0aGUgbGVhZGluZyAwIGlzIHRoZSB2MiBzZW50aW5lbCkgc28gdGhlIG1hbmFnZXIgY2FuIHJlamVjdAovLyBzcG9vZmVkL3N0YWxlIHRva2VucyB2aWEgcmxtLklzQ3VycmVudCgpIGFuZCBpZGVudGlmeSB0aGUgY2FsbGVyIHZpYSBybG0uUHJldmlvdXMoKS4KZnVuYyBSZWdpc3RlckluaXRpYWxpemVyKGN1ciByZWFsbSwgaW5pdGlhbGl6ZXIgZnVuYyhfIGludCwgcmxtIHJlYWxtLCBzdG9yZSBhbnkpIGFueSkgewogICAgaWYgZXJyIDo9IG1hbmFnZXIuUmVnaXN0ZXJJbml0aWFsaXplcigwLCBjdXIsIGluaXRpYWxpemVyKTsgZXJyICE9IG5pbCB7CiAgICAgICAgcGFuaWMoZXJyKQogICAgfQp9CgovLyBVcGdyYWRlSW1wbCBzd2l0Y2hlcyB0aGUgYWN0aXZlIHZlcnNpb24uIEF1dGhvcml6YXRpb24gKGFkbWluIC8gZ292ZXJuYW5jZSkgaXMKLy8gZW5mb3JjZWQgaGVyZSBpbiB0aGUgL3IvIHJlYWxtOyB2ZXJzaW9uX21hbmFnZXIgb25seSByZWplY3RzIHNwb29mZWQgdG9rZW5zLgpmdW5jIFVwZ3JhZGVJbXBsKGN1ciByZWFsbSwgcGFja2FnZVBhdGggc3RyaW5nKSB7CiAgICBpZiBlcnIgOj0gbWFuYWdlci5DaGFuZ2VJbXBsZW1lbnRhdGlvbigwLCBjdXIsIHBhY2thZ2VQYXRoKTsgZXJyICE9IG5pbCB7CiAgICAgICAgcGFuaWMoZXJyKQogICAgfQp9CmBgYAoKIyMjIFN0ZXAgMzogSW1wbGVtZW50IFZlcnNpb25zCgpgYGBnbwovLyBwcm90b2NvbF9mZWUvdjEvdjEuZ25vCnBhY2thZ2UgdjEKCmltcG9ydCAiZ25vLmxhbmQvci9nbm9zd2FwL3Byb3RvY29sX2ZlZSIKCnR5cGUgcHJvdG9jb2xGZWVWMSBzdHJ1Y3QgewogICAgc3RvcmUgYW55Cn0KCmZ1bmMgaW5pdChjdXIgcmVhbG0pIHsKICAgIC8vIFJlZ2lzdGVyIHRoaXMgdmVyc2lvbiBkdXJpbmcgcGFja2FnZSBpbml0aWFsaXphdGlvbi4KICAgIC8vIGBjcm9zcyhjdXIpYCBpbnZva2VzIHRoZSBkb21haW4ncyBjcm9zc2luZyBlbnRyeSBwb2ludCwgd2hpY2ggdGhyZWFkcyB0aGUKICAgIC8vIGxpdmUgcmVhbG0gdG9rZW4gaW50byB0aGUgdmVyc2lvbiBtYW5hZ2VyLgogICAgcHJvdG9jb2xfZmVlLlJlZ2lzdGVySW5pdGlhbGl6ZXIoY3Jvc3MoY3VyKSwgZnVuYyhfIGludCwgcmxtIHJlYWxtLCBzdG9yZSBhbnkpIGFueSB7CiAgICAgICAgcmV0dXJuICZwcm90b2NvbEZlZVYxe3N0b3JlOiBzdG9yZX0KICAgIH0pCn0KCmZ1bmMgKHBmICpwcm90b2NvbEZlZVYxKSBTZXRGZWVSYXRpbyhyYXRpbyB1aW50NjQpIGVycm9yIHsKICAgIC8vIHYxIGltcGxlbWVudGF0aW9uCn0KCmZ1bmMgKHBmICpwcm90b2NvbEZlZVYxKSBHZXRGZWVSYXRpbygpIHVpbnQ2NCB7CiAgICAvLyB2MSBpbXBsZW1lbnRhdGlvbgp9CmBgYAoKYGBgZ28KLy8gcHJvdG9jb2xfZmVlL3YyL3YyLmdubwpwYWNrYWdlIHYyCgp0eXBlIHByb3RvY29sRmVlVjIgc3RydWN0IHsKICAgIHN0b3JlIGFueQp9CgpmdW5jIGluaXQoY3VyIHJlYWxtKSB7CiAgICAvLyBSZWdpc3RlciB2MiDigJQgaW5hY3RpdmUgdW50aWwgZXhwbGljaXRseSBhY3RpdmF0ZWQuCiAgICBwcm90b2NvbF9mZWUuUmVnaXN0ZXJJbml0aWFsaXplcihjcm9zcyhjdXIpLCBmdW5jKF8gaW50LCBybG0gcmVhbG0sIHN0b3JlIGFueSkgYW55IHsKICAgICAgICByZXR1cm4gJnByb3RvY29sRmVlVjJ7c3RvcmU6IHN0b3JlfQogICAgfSkKfQoKZnVuYyAocGYgKnByb3RvY29sRmVlVjIpIFNldEZlZVJhdGlvKHJhdGlvIHVpbnQ2NCkgZXJyb3IgewogICAgLy8gdjIgaW1wcm92ZWQgaW1wbGVtZW50YXRpb24KfQoKZnVuYyAocGYgKnByb3RvY29sRmVlVjIpIEdldEZlZVJhdGlvKCkgdWludDY0IHsKICAgIC8vIHYyIGltcHJvdmVkIGltcGxlbWVudGF0aW9uCn0KYGBgCgojIyMgU3RlcCA0OiBVc2UgQWN0aXZlIEltcGxlbWVudGF0aW9uCgpgYGBnbwovLyBjbGllbnQgY29kZQppbXBvcnQgImduby5sYW5kL3IvZ25vc3dhcC9wcm90b2NvbF9mZWUiCgpmdW5jIFVzZUZlZSgpIHsKICAgIG1hbmFnZXIgOj0gcHJvdG9jb2xfZmVlLkdldE1hbmFnZXIoKQogICAgaW1wbCA6PSBtYW5hZ2VyLkdldEN1cnJlbnRJbXBsZW1lbnRhdGlvbigpLihwcm90b2NvbF9mZWUuUHJvdG9jb2xGZWUpCgogICAgcmF0aW8gOj0gaW1wbC5HZXRGZWVSYXRpbygpCiAgICAvLyBVc2UgdGhlIGFjdGl2ZSB2ZXJzaW9uJ3MgaW1wbGVtZW50YXRpb24KfQpgYGAKCiMjIyBTdGVwIDU6IFN3aXRjaCBWZXJzaW9ucyBhdCBSdW50aW1lCgpgYGBnbwovLyBnb3Zlcm5hbmNlIG9yIGFkbWluIGVudHJ5IHBvaW50CmZ1bmMgVXBncmFkZVRvVjIoY3VyIHJlYWxtKSB7CiAgICAvLyBIb3Qtc3dhcCB0byB2MiDigJQgemVybyBkb3dudGltZS4gYGNyb3NzKGN1cilgIGVudGVycyBVcGdyYWRlSW1wbCdzIGNyb3NzaW5nCiAgICAvLyBmcmFtZTsgVXBncmFkZUltcGwgdGhyZWFkcyB0aGUgcmVhbG0gdG9rZW4gaW50byB0aGUgdmVyc2lvbiBtYW5hZ2VyLgogICAgcHJvdG9jb2xfZmVlLlVwZ3JhZGVJbXBsKGNyb3NzKGN1ciksICJnbm8ubGFuZC9yL2dub3N3YXAvcHJvdG9jb2xfZmVlL3YyIikKfQpgYGAKCiMjIFdvcmtmbG93CgojIyMgUmVnaXN0cmF0aW9uIEZsb3cKCmBgYAoxLiBEb21haW4gcGFja2FnZSBpbml0aWFsaXplcyB2ZXJzaW9uIG1hbmFnZXIgd2l0aCBLVlN0b3JlCiAgIOKGkwoyLiB2MSBwYWNrYWdlIGNhbGxzIFJlZ2lzdGVySW5pdGlhbGl6ZXIgKHZpYSB0aGUgZG9tYWluJ3MgY3Jvc3Npbmcgd3JhcHBlcikgZHVyaW5nIGBpbml0KGN1ciByZWFsbSlgCiAgIOKGkiBNYW5hZ2VyIHZhbGlkYXRlcyB0aGUgcmVhbG0gdG9rZW4gKHJsbS5Jc0N1cnJlbnQoKSkgYW5kIGNhbGxlciBkb21haW4gcGF0aAogICDihpIgQmVjb21lcyBhY3RpdmUgaW1wbGVtZW50YXRpb24KICAg4oaTCjMuIHYyIHBhY2thZ2UgY2FsbHMgUmVnaXN0ZXJJbml0aWFsaXplciBkdXJpbmcgYGluaXQoY3VyIHJlYWxtKWAKICAg4oaSIFJlZ2lzdGVyZWQgZm9yIGxhdGVyIGFjdGl2YXRpb24KICAg4oaTCjQuIHYzIHBhY2thZ2UgY2FsbHMgUmVnaXN0ZXJJbml0aWFsaXplciBkdXJpbmcgYGluaXQoY3VyIHJlYWxtKWAKICAg4oaSIFJlZ2lzdGVyZWQKYGBgCgojIyMgVmVyc2lvbiBTd2l0Y2hpbmcgRmxvdwoKYGBgCjEuIEFkbWluL2dvdmVybmFuY2UgY2FsbHMgQ2hhbmdlSW1wbGVtZW50YXRpb24gKHZpYSB0aGUgZG9tYWluJ3MgVXBncmFkZUltcGwgd3JhcHBlcikKICAg4oaSIEF1dGhvcml6YXRpb24gaXMgZW5mb3JjZWQgaW4gdGhlIC9yLyB3cmFwcGVyCiAgIOKGkwoyLiBWZXJzaW9uIE1hbmFnZXIgdmFsaWRhdGVzIHRoZSByZWFsbSB0b2tlbiAocmxtLklzQ3VycmVudCgpKSwgcmVqZWN0aW5nIHNwb29mZWQvc3RhbGUgdG9rZW5zCiAgIOKGkwozLiBWZXJzaW9uIE1hbmFnZXIgcmV0cmlldmVzIHYyJ3MgaW5pdGlhbGl6ZXIKICAg4oaTCjQuIEV4ZWN1dGVzIHYyIGluaXRpYWxpemVyIHdpdGggc2hhcmVkIEtWU3RvcmUKICAg4oaTCjUuIFVwZGF0ZXMgY3VycmVudEltcGxlbWVudGF0aW9uIHBvaW50ZXIgdG8gdjIKICAg4oaTCjYuIHYyIGlzIG5vdyB0aGUgYWN0aXZlIGltcGxlbWVudGF0aW9uCmBgYAoKIyMjIFN0b3JhZ2UgQWNjZXNzIE1vZGVsCgotICoqRG9tYWluIE93bmVyc2hpcCoqOiBUaGUgZG9tYWluIChwcm94eSkgcmVhbG0gb3ducyB0aGUgS1ZTdG9yZSBhbmQgaGFzIHdyaXRlIHBlcm1pc3Npb24KLSAqKkV4cGxpY2l0IFJlYWxtIFRocmVhZGluZyoqOiBSZWdpc3RyYXRpb24vdXBncmFkZSBjYWxscyB0aHJlYWQgdGhlIGxpdmUgY3Jvc3NpbmctZnJhbWUgdG9rZW4gKGBybG1gKSBpbnRvIHRoZSBtYW5hZ2VyIGluc3RlYWQgb2YgcmVseWluZyBvbiBgcnVudGltZS5DdXJyZW50UmVhbG0oKWAuIFRoZSBtYW5hZ2VyIHZhbGlkYXRlcyBpdCB3aXRoIGBybG0uSXNDdXJyZW50KClgIChyZWplY3Rpbmcgc3Bvb2ZlZC9zdGFsZSB0b2tlbnMpIGFuZCBpZGVudGlmaWVzIHRoZSByZWdpc3RlcmluZyB2ZXJzaW9uIHBhY2thZ2UgdmlhIGBybG0uUHJldmlvdXMoKWAKLSAqKk5vIERpcmVjdCBQZXJtaXNzaW9uIEdyYW50cyoqOiBJbXBsZW1lbnRhdGlvbiByZWFsbXMgZG8gbm90IHJlY2VpdmUgc3RvcmFnZSBwZXJtaXNzaW9ucyBkaXJlY3RseTsgdGhlIHByb3h5IHJlYWxtIGRyaXZlcyBhbGwgc3RvcmFnZSBhY2Nlc3MKLSAqKlNlY3VyaXR5IGJ5IERlc2lnbioqOiBFeHRlcm5hbCBjYWxsZXJzIGNhbm5vdCBpbnZva2UgaW1wbGVtZW50YXRpb24gcmVhbG1zIHRvIG1vZGlmeSBzdG9yYWdlCgojIyMgQmVzdCBQcmFjdGljZXMKCjEuICoqVmVyc2lvbiBSZWdpc3RyYXRpb24qKjogQWxsIHZlcnNpb25zIHNob3VsZCByZWdpc3RlciBkdXJpbmcgYGluaXQoY3VyIHJlYWxtKWAKMi4gKipJbnRlcmZhY2UgQ29tcGxpYW5jZSoqOiBFbnN1cmUgYWxsIHZlcnNpb25zIGltcGxlbWVudCB0aGUgc2FtZSBkb21haW4gaW50ZXJmYWNlCjMuICoqU3RvcmFnZSBDb21wYXRpYmlsaXR5Kio6IERlc2lnbiBzdG9yYWdlIHNjaGVtYSB0byBiZSBmb3J3YXJkL2JhY2t3YXJkIGNvbXBhdGlibGUKNC4gKipUZXN0aW5nKio6IFRlc3QgdmVyc2lvbiBzd2l0Y2hpbmcgdGhvcm91Z2hseSBiZWZvcmUgcHJvZHVjdGlvbiB1c2UKNS4gKipSb2xsYmFjayBTdXBwb3J0Kio6IEtlZXAgcHJldmlvdXMgdmVyc2lvbnMgcmVnaXN0ZXJlZCBmb3IgcXVpY2sgcm9sbGJhY2sgY2FwYWJpbGl0eQoKIyMgRXJyb3IgSGFuZGxpbmcKClRoZSBwYWNrYWdlIHJldHVybnMgZXJyb3JzIGZvcjoKCi0gQSBzcG9vZmVkIG9yIHN0YWxlIHJlYWxtIHRva2VuIChgcmxtLklzQ3VycmVudCgpID09IGZhbHNlYCDihpIgYEVyclNwb29mZWRSZWFsbWApCi0gVW5hdXRob3JpemVkIGNhbGxlciBhdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIChub3QgaW4gZG9tYWluIHBhdGgpCi0gRHVwbGljYXRlIHJlZ2lzdHJhdGlvbiBvZiB0aGUgc2FtZSBwYWNrYWdlIHBhdGgKLSBBdHRlbXB0aW5nIHRvIHN3aXRjaCB0byBhbiB1bnJlZ2lzdGVyZWQgdmVyc2lvbgotIEEgbmlsIGluaXRpYWxpemVyIGluIHRoZSByZWdpc3RlcmVkIG1hcCAoYENoYW5nZUltcGxlbWVudGF0aW9uYCdzIGludGVybmFsCiAgaW52YWxpZC1zdGF0ZSBjaGVjaykuIFRoZSBpbml0aWFsaXplciBmdW5jdGlvbiBzaWduYXR1cmUgaXMgY2hlY2tlZCBhdAogIGNvbXBpbGUgdGltZSBieSB0aGUgdHlwZWQgQVBJLgoKIyMgVXNlIENhc2VzCgojIyMgUHJvdG9jb2wgVXBncmFkZXMKClVwZ3JhZGUgRGVGaSBwcm90b2NvbCBsb2dpYyB3aXRob3V0IGRpc3J1cHRpbmcgYWN0aXZlIHVzZXJzLiBUaGUgdGFyZ2V0IHZlcnNpb24KbXVzdCBhbHJlYWR5IGJlIGRlcGxveWVkL2xvYWRlZCBhbmQgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgaXRzIGluaXRpYWxpemVyIGR1cmluZwpwYWNrYWdlIGluaXRpYWxpemF0aW9uOyBgVXBncmFkZUltcGxgIG9ubHkgYWN0aXZhdGVzIHJlZ2lzdGVyZWQgcGF0aHM6CgpgYGBnbwovLyBUaGUgcHJvdG9jb2xfZmVlL3YyIHBhY2thZ2UgaGFzIGFscmVhZHkgcmVnaXN0ZXJlZCB0aGlzIHBhdGggZHVyaW5nIGluaXQuCnByb3RvY29sX2ZlZS5VcGdyYWRlSW1wbChjcm9zcyhjdXIpLCAiZ25vLmxhbmQvci9nbm9zd2FwL3Byb3RvY29sX2ZlZS92MiIpCmBgYAoKIyMjIEEvQiBUZXN0aW5nCgpUZXN0IGEgbmV3IGltcGxlbWVudGF0aW9uIGJlZm9yZSBmdWxsIHJvbGxvdXQuIERlcGxveS9sb2FkIHRoZSBwYWNrYWdlIGFuZCBsZXQKaXRzIGBpbml0YCBjYWxsIGBSZWdpc3RlckluaXRpYWxpemVyYCBiZWZvcmUgc3dpdGNoaW5nOgoKYGBgZ28KLy8gdjIgd2FzIGRlcGxveWVkIGFuZCByZWdpc3RlcmVkIGJlZm9yZSB0aGlzIGNhbGwuCnByb3RvY29sX2ZlZS5VcGdyYWRlSW1wbChjcm9zcyhjdXIpLCAiZ25vLmxhbmQvci9nbm9zd2FwL3Byb3RvY29sX2ZlZS92MiIpCgovLyBSb2xsIGJhY2sgdG8gYW5vdGhlciBwYXRoIHRoYXQgd2FzIGFsc28gcmVnaXN0ZXJlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCnByb3RvY29sX2ZlZS5VcGdyYWRlSW1wbChjcm9zcyhjdXIpLCAiZ25vLmxhbmQvci9nbm9zd2FwL3Byb3RvY29sX2ZlZS92MSIpCmBgYAoKIyMjIEVtZXJnZW5jeSBSZXNwb25zZQoKUXVpY2tseSBzd2l0Y2ggdG8gYSBwYXRjaGVkIHZlcnNpb24gZHVyaW5nIHNlY3VyaXR5IGluY2lkZW50cy4gVGhlIGhvdGZpeApwYWNrYWdlIG11c3QgYmUgZGVwbG95ZWQvbG9hZGVkIGFuZCByZWdpc3RlcmVkIGJlZm9yZSBhY3RpdmF0aW9uOgoKYGBgZ28KLy8gdjFfaG90Zml4IHdhcyBkZXBsb3llZCBhbmQgcmVnaXN0ZXJlZCBkdXJpbmcgaXRzIHBhY2thZ2UgaW5pdC4KcHJvdG9jb2xfZmVlLlVwZ3JhZGVJbXBsKGNyb3NzKGN1ciksICJnbm8ubGFuZC9yL2dub3N3YXAvcHJvdG9jb2xfZmVlL3YxX2hvdGZpeCIpCmBgYAoKIyMgSW1wbGVtZW50YXRpb24gTm90ZXMKCi0gQnVpbHQgb24gU3RyYXRlZ3kgUGF0dGVybiBmb3IgcnVudGltZSBhbGdvcml0aG0gc3dhcHBpbmcKLSBVc2VzIFBsdWdpbiBBcmNoaXRlY3R1cmUgZm9yIGV4cGxpY2l0IHZlcnNpb24gcmVnaXN0cmF0aW9uCi0gU3RvcmFnZSBhY2Nlc3MgaXMgZHJpdmVuIGJ5IHRoZSBwcm94eSByZWFsbTsgdGhlIGxpdmUgcmVhbG0gdG9rZW4gaXMgdGhyZWFkZWQgZXhwbGljaXRseSAodGhlIHYyIGBfIGludCwgcmxtIHJlYWxtYCBtYXJrZXIpIGFuZCB2YWxpZGF0ZWQgdmlhIGBybG0uSXNDdXJyZW50KClgCi0gTm8gZGF0YSBtaWdyYXRpb24gcmVxdWlyZWQgLSBhbGwgdmVyc2lvbnMgc2hhcmUgdGhlIHNhbWUgc3RvcmFnZQotIFR5cGUgYXNzZXJ0aW9ucyByZXF1aXJlZCB3aGVuIHJldHJpZXZpbmcgY3VycmVudCBpbXBsZW1lbnRhdGlvbgotIEluaXRpYWxpemVycyBhcmUgcmVnaXN0ZXJlZCBieSB2ZXJzaW9uIHBhY2thZ2VzOyB0aGUgbWFuYWdlciBkb2VzIG5vdCBsb2FkIG9yIGRlcGxveSBwYWNrYWdlcyBpdHNlbGYKCiMjIExpbWl0YXRpb25zCgotICoqVHlwZSBTYWZldHkqKjogUmVxdWlyZXMgcnVudGltZSB0eXBlIGFzc2VydGlvbiB0byBkb21haW4gaW50ZXJmYWNlCi0gKipTdG9yYWdlIFNjaGVtYSoqOiBSZXF1aXJlcyBjYXJlZnVsIHNjaGVtYSBkZXNpZ24gZm9yIGNyb3NzLXZlcnNpb24gY29tcGF0aWJpbGl0eQotICoqUmVnaXN0cmF0aW9uIE9yZGVyKio6IEZpcnN0IHJlZ2lzdGVyZWQgdmVyc2lvbiBiZWNvbWVzIHRoZSBpbml0aWFsIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbgotICoqRG9tYWluIENhbGwgUmVxdWlyZW1lbnQqKjogSW1wbGVtZW50YXRpb24gZnVuY3Rpb25zIG11c3QgYmUgY2FsbGVkIHRocm91Z2ggZG9tYWluIHByb3h5IGZvciBzdG9yYWdlIGFjY2VzcwoKIyMgUmVsYXRlZCBQYWNrYWdlcwoKLSBgZ25vLmxhbmQvcC9nbm9zd2FwL3N0b3JlL3YxYDogS1ZTdG9yZSB3aXRoIHBlcm1pc3Npb24tYmFzZWQgYWNjZXNzIGNvbnRyb2wKGplZCgdkb2MuZ25vEo1ZLy8gUGFja2FnZSB2ZXJzaW9uX21hbmFnZXIgcHJvdmlkZXMgYSBydW50aW1lIHZlcnNpb24gbWFuYWdlbWVudCBzeXN0ZW0gZm9yIGR5bmFtaWMKLy8gaW1wbGVtZW50YXRpb24gc3dpdGNoaW5nIHdpdGhvdXQgZGF0YSBtaWdyYXRpb24uIEl0IGltcGxlbWVudHMgdGhlIFN0cmF0ZWd5IFBhdHRlcm4KLy8gY29tYmluZWQgd2l0aCBQbHVnaW4gQXJjaGl0ZWN0dXJlIHRvIGVuYWJsZSBob3Qtc3dhcHBpbmcgYmV0d2VlbiBkaWZmZXJlbnQgdmVyc2lvbmVkCi8vIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgc2FtZSBkb21haW4uCi8vCi8vICMjIE92ZXJ2aWV3Ci8vCi8vIFZlcnNpb24gTWFuYWdlciBlbmFibGVzIHNlYW1sZXNzIHVwZ3JhZGVzIGJ5IGFsbG93aW5nIG11bHRpcGxlIHZlcnNpb25lZCBpbXBsZW1lbnRhdGlvbnMKLy8gKHYxLCB2MiwgdjMpIHRvIGNvZXhpc3QgYW5kIHNoYXJlIGEgdW5pZmllZCBzdG9yYWdlIGxheWVyLiBUaGUgZG9tYWluCi8vIChwcm94eSkgcmVhbG0gb3ducyB0aGF0IHN0b3JhZ2U7IHRoZSBtYW5hZ2VyIHJlY29yZHMgdmVyc2lvbiBpbml0aWFsaXplcnMgYW5kCi8vIHN3YXBzIHRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gcmVmZXJlbmNlIHdpdGhvdXQgZ3JhbnRpbmcgaW1wbGVtZW50YXRpb24KLy8gcmVhbG1zIGRpcmVjdCB3cml0ZSBwZXJtaXNzaW9uLgovLwovLyBLZXkgY29tcG9uZW50cyBvZiB0aGlzIHBhY2thZ2UgaW5jbHVkZToKLy8KLy8gIDEuICoqVmVyc2lvbk1hbmFnZXIgSW50ZXJmYWNlKio6IERlZmluZXMgdGhlIGNvbnRyYWN0IGZvciBtYW5hZ2luZyBtdWx0aXBsZSB2ZXJzaW9uZWQKLy8gICAgIGltcGxlbWVudGF0aW9ucyBvZiBhIGRvbWFpbi4KLy8gIDIuICoqdmVyc2lvbk1hbmFnZXIgSW1wbGVtZW50YXRpb24qKjogQ29uY3JldGUgaW1wbGVtZW50YXRpb24gdGhhdCBtYW5hZ2VzIHZlcnNpb24KLy8gICAgIHJlZ2lzdHJhdGlvbiBhbmQgYWN0aXZlIGltcGxlbWVudGF0aW9uIHN3aXRjaGluZy4KLy8gIDMuICoqUmVhbG0tVGhyZWFkZWQgVmFsaWRhdGlvbioqOiBWYWxpZGF0ZXMgbGl2ZSByZWFsbSB0b2tlbnMgYW5kIHJlc3RyaWN0cwovLyAgICAgcmVnaXN0cmF0aW9uIHRvIHBhY2thZ2VzIHVuZGVyIHRoZSBjb25maWd1cmVkIGRvbWFpbiBwYXRoLgovLyAgNC4gKipEb21haW4tU2NvcGVkIFNlY3VyaXR5Kio6IEVuc3VyZXMgb25seSBhdXRob3JpemVkIHBhY2thZ2VzIHdpdGhpbiB0aGUgZG9tYWluCi8vICAgICBwYXRoIGNhbiByZWdpc3RlciBpbXBsZW1lbnRhdGlvbnMuCi8vCi8vICMjIEtleSBGZWF0dXJlcwovLwovLyAgIC0gKipaZXJvLURvd250aW1lIFVwZ3JhZGVzKio6IFN3aXRjaCBpbXBsZW1lbnRhdGlvbnMgYXQgcnVudGltZSB3aXRob3V0IHNlcnZpY2UKLy8gICAgIGludGVycnVwdGlvbiBvciBkYXRhIG1pZ3JhdGlvbi4KLy8gICAtICoqVW5pZmllZCBTdG9yYWdlKio6IEFsbCB2ZXJzaW9ucyBzaGFyZSBhIHNpbmdsZSBLVlN0b3JlIG93bmVkIGJ5IHRoZQovLyAgICAgZG9tYWluIChwcm94eSkgcmVhbG0sIGVsaW1pbmF0aW5nIG1pZ3JhdGlvbiBvdmVyaGVhZC4KLy8gICAtICoqSG90LVN3YXBwaW5nKio6IEluc3RhbnQgdmVyc2lvbiBzd2l0Y2hpbmcgdGhyb3VnaCBkeW5hbWljIHN0cmF0ZWd5IHJlcGxhY2VtZW50Ci8vICAgICB3aXRoIGV4cGxpY2l0IHJlYWxtIHZhbGlkYXRpb24uCi8vICAgLSAqKkRvbWFpbi1TY29wZWQgU2VjdXJpdHkqKjogT25seSBwYWNrYWdlcyB1bmRlciB0aGUgYXV0aG9yaXplZCBkb21haW4gcGF0aCBjYW4KLy8gICAgIHJlZ2lzdGVyIGltcGxlbWVudGF0aW9ucywgcHJldmVudGluZyB1bmF1dGhvcml6ZWQgYWNjZXNzLgovLyAgIC0gKipCYWNrd2FyZCBDb21wYXRpYmlsaXR5Kio6IFByZXZpb3VzIHZlcnNpb25zIHJlbWFpbiByZWdpc3RlcmVkIGZvcgovLyAgICAgZ3JhZHVhbCBtaWdyYXRpb24gYW5kIHJvbGxiYWNrIHN1cHBvcnQuCi8vICAgLSAqKlN0cmF0ZWd5IFBhdHRlcm4qKjogRW5hYmxlcyBydW50aW1lIGFsZ29yaXRobSBzd2FwcGluZyB3aXRob3V0IGNvZGUgY2hhbmdlcy4KLy8KLy8gIyMgQXJjaGl0ZWN0dXJlIFBhdHRlcm4KLy8KLy8gVGhlIHBhY2thZ2UgaW1wbGVtZW50cyB0d28gY29tcGxlbWVudGFyeSBkZXNpZ24gcGF0dGVybnM6Ci8vCi8vICAgLSAqKlN0cmF0ZWd5IFBhdHRlcm4qKjogRW5hYmxlcyBydW50aW1lIHNlbGVjdGlvbiBvZiBpbXBsZW1lbnRhdGlvbiBzdHJhdGVnaWVzCi8vICAgLSAqKlBsdWdpbiBBcmNoaXRlY3R1cmUqKjogU3VwcG9ydHMgZXhwbGljaXQgcmVnaXN0cmF0aW9uIG9mIHZlcnNpb24gcGFja2FnZXMKLy8KLy8gIyMgV29ya2Zsb3cKLy8KLy8gVHlwaWNhbCB1c2FnZSBvZiB0aGUgdmVyc2lvbl9tYW5hZ2VyIHBhY2thZ2UgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBzdGVwczoKLy8KLy8gIDEuICoqSW5pdGlhbGl6YXRpb24qKjogQ3JlYXRlIGEgdmVyc2lvbiBtYW5hZ2VyIGZvciB0aGUgZG9tYWluIHVzaW5nIE5ld1ZlcnNpb25NYW5hZ2VyLgovLyAgMi4gKipWZXJzaW9uIFJlZ2lzdHJhdGlvbioqOiBFYWNoIHZlcnNpb24gKHYxLCB2MiwgdjMpIGNhbGxzIFJlZ2lzdGVySW5pdGlhbGl6ZXIgZHVyaW5nCi8vICAgICBpdHMgaW5pdChjdXIgcmVhbG0pIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIGl0cyBpbXBsZW1lbnRhdGlvbi4KLy8gIDMuICoqQWN0aXZlIEltcGxlbWVudGF0aW9uKio6IFRoZSBmaXJzdCByZWdpc3RlcmVkIHZlcnNpb24gYmVjb21lcyB0aGUgYWN0aXZlIGltcGxlbWVudGF0aW9uOwovLyAgICAgc3Vic2VxdWVudCB2ZXJzaW9ucyBhcmUgcmV0YWluZWQgZm9yIGxhdGVyIHN3aXRjaGluZy4KLy8gIDQuICoqVmVyc2lvbiBTd2l0Y2hpbmcqKjogVXNlIENoYW5nZUltcGxlbWVudGF0aW9uIHRvIGhvdC1zd2FwIHRvIGEgZGlmZmVyZW50IHZlcnNpb24KLy8gICAgIHdoaWxlIHN0b3JhZ2Ugb3duZXJzaGlwIHN0YXlzIHdpdGggdGhlIGRvbWFpbiBLVlN0b3JlLgovLwovLyAjIyBFeGFtcGxlIFVzYWdlCi8vCi8vICMjIyBTdGVwIDE6IERlZmluZSBEb21haW4gSW50ZXJmYWNlCi8vCi8vIGBgYGdubwovLyAvLyBwcm90b2NvbF9mZWUvdHlwZXMuZ25vCi8vIHBhY2thZ2UgcHJvdG9jb2xfZmVlCi8vCi8vCXR5cGUgUHJvdG9jb2xGZWUgaW50ZXJmYWNlIHsKLy8JICAgIFNldEZlZVJhdGlvKHJhdGlvIHVpbnQ2NCkgZXJyb3IKLy8JICAgIEdldEZlZVJhdGlvKCkgdWludDY0Ci8vCX0KLy8KLy8gYGBgCi8vCi8vICMjIyBTdGVwIDI6IENyZWF0ZSBWZXJzaW9uIE1hbmFnZXIKLy8KLy8gYGBgZ25vCi8vIC8vIHByb3RvY29sX2ZlZS9wcm90b2NvbF9mZWUuZ25vCi8vIHBhY2thZ2UgcHJvdG9jb2xfZmVlCi8vCi8vIGltcG9ydCAoCi8vCi8vCSJnbm8ubGFuZC9wL2dub3N3YXAvdmVyc2lvbl9tYW5hZ2VyL3YxIgovLwkiZ25vLmxhbmQvcC9nbm9zd2FwL3N0b3JlL3YxIgovLwovLyApCi8vCi8vCXZhciBtYW5hZ2VyIHZlcnNpb25fbWFuYWdlci5WZXJzaW9uTWFuYWdlcgovLwovLwlmdW5jIGluaXQoY3VyIHJlYWxtKSB7Ci8vCSAgICBrdlN0b3JlIDo9IHN0b3JlLk5ld0tWU3RvcmUoY3VyLkFkZHJlc3MoKSkKLy8KLy8JICAgIG1hbmFnZXIgPSB2ZXJzaW9uX21hbmFnZXIuTmV3VmVyc2lvbk1hbmFnZXIoCi8vCSAgICAgICAgY3VyLlBrZ1BhdGgoKSwKLy8JICAgICAgICBrdlN0b3JlLAovLwkgICAgICAgIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSwga3Ygc3RvcmUuS1ZTdG9yZSkgYW55IHsKLy8JICAgICAgICAgICAgcmV0dXJuIE5ld1Byb3RvY29sRmVlU3RvcmUoa3YpCi8vCSAgICAgICAgfSwKLy8JICAgICkKLy8JfQovLwovLwlmdW5jIEdldE1hbmFnZXIoKSB2ZXJzaW9uX21hbmFnZXIuVmVyc2lvbk1hbmFnZXIgewovLwkgICAgcmV0dXJuIG1hbmFnZXIKLy8JfQovLwovLyBgYGAKLy8KLy8gIyMjIFN0ZXAgMzogSW1wbGVtZW50IFZlcnNpb24gMQovLwovLyBgYGBnbm8KLy8gLy8gcHJvdG9jb2xfZmVlL3YxL3YxLmdubwovLyBwYWNrYWdlIHYxCi8vCi8vIGltcG9ydCAiZ25vLmxhbmQvci9nbm9zd2FwL3Byb3RvY29sX2ZlZSIKLy8KLy8gdHlwZSBwcm90b2NvbEZlZVYxIHN0cnVjdCB7Ci8vCi8vCXN0b3JlIGFueQovLwovLyB9Ci8vCi8vCWZ1bmMgaW5pdChjdXIgcmVhbG0pIHsKLy8JICAgIC8vIFJlZ2lzdGVyIHRoaXMgdmVyc2lvbiBkdXJpbmcgcGFja2FnZSBpbml0aWFsaXphdGlvbi4KLy8JICAgIHByb3RvY29sX2ZlZS5SZWdpc3RlckluaXRpYWxpemVyKGNyb3NzKGN1ciksIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSwgc3RvcmUgYW55KSBhbnkgewovLwkgICAgICAgIHJldHVybiAmcHJvdG9jb2xGZWVWMXtzdG9yZTogc3RvcmV9Ci8vCSAgICB9KQovLwl9Ci8vCi8vCWZ1bmMgKHBmICpwcm90b2NvbEZlZVYxKSBTZXRGZWVSYXRpbyhyYXRpbyB1aW50NjQpIGVycm9yIHsKLy8JICAgIC8vIHYxIGltcGxlbWVudGF0aW9uCi8vCSAgICByZXR1cm4gbmlsCi8vCX0KLy8KLy8JZnVuYyAocGYgKnByb3RvY29sRmVlVjEpIEdldEZlZVJhdGlvKCkgdWludDY0IHsKLy8JICAgIC8vIHYxIGltcGxlbWVudGF0aW9uCi8vCSAgICByZXR1cm4gMAovLwl9Ci8vCi8vIGBgYAovLwovLyAjIyMgU3RlcCA0OiBJbXBsZW1lbnQgVmVyc2lvbiAyCi8vCi8vIGBgYGdubwovLyAvLyBwcm90b2NvbF9mZWUvdjIvdjIuZ25vCi8vIHBhY2thZ2UgdjIKLy8KLy8gaW1wb3J0ICJnbm8ubGFuZC9yL2dub3N3YXAvcHJvdG9jb2xfZmVlIgovLwovLyB0eXBlIHByb3RvY29sRmVlVjIgc3RydWN0IHsKLy8KLy8Jc3RvcmUgYW55Ci8vCi8vIH0KLy8KLy8JZnVuYyBpbml0KGN1ciByZWFsbSkgewovLwkgICAgLy8gUmVnaXN0ZXIgdjIgLSBpbmFjdGl2ZSB1bnRpbCBleHBsaWNpdGx5IGFjdGl2YXRlZC4KLy8JICAgIHByb3RvY29sX2ZlZS5SZWdpc3RlckluaXRpYWxpemVyKGNyb3NzKGN1ciksIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSwgc3RvcmUgYW55KSBhbnkgewovLwkgICAgICAgIHJldHVybiAmcHJvdG9jb2xGZWVWMntzdG9yZTogc3RvcmV9Ci8vCSAgICB9KQovLwl9Ci8vCi8vCWZ1bmMgKHBmICpwcm90b2NvbEZlZVYyKSBTZXRGZWVSYXRpbyhyYXRpbyB1aW50NjQpIGVycm9yIHsKLy8JICAgIC8vIHYyIGltcHJvdmVkIGltcGxlbWVudGF0aW9uCi8vCSAgICByZXR1cm4gbmlsCi8vCX0KLy8KLy8JZnVuYyAocGYgKnByb3RvY29sRmVlVjIpIEdldEZlZVJhdGlvKCkgdWludDY0IHsKLy8JICAgIC8vIHYyIGltcHJvdmVkIGltcGxlbWVudGF0aW9uCi8vCSAgICByZXR1cm4gMAovLwl9Ci8vCi8vIGBgYAovLwovLyAjIyMgU3RlcCA1OiBVc2UgQWN0aXZlIEltcGxlbWVudGF0aW9uCi8vCi8vIGBgYGdubwovLyAvLyBjbGllbnQgY29kZQovLyBpbXBvcnQgImduby5sYW5kL3IvZ25vc3dhcC9wcm90b2NvbF9mZWUiCi8vCi8vCWZ1bmMgVXNlRmVlKCkgewovLwkgICAgbWFuYWdlciA6PSBwcm90b2NvbF9mZWUuR2V0TWFuYWdlcigpCi8vCSAgICBpbXBsIDo9IG1hbmFnZXIuR2V0Q3VycmVudEltcGxlbWVudGF0aW9uKCkuKHByb3RvY29sX2ZlZS5Qcm90b2NvbEZlZSkKLy8KLy8JICAgIHJhdGlvIDo9IGltcGwuR2V0RmVlUmF0aW8oKQovLwkgICAgLy8gVXNlIHRoZSBhY3RpdmUgdmVyc2lvbidzIGltcGxlbWVudGF0aW9uCi8vCX0KLy8KLy8gYGBgCi8vCi8vICMjIyBTdGVwIDY6IFN3aXRjaCBWZXJzaW9ucyBhdCBSdW50aW1lCi8vCi8vIGBgYGdubwovLyAvLyBnb3Zlcm5hbmNlIG9yIGFkbWluIGZ1bmN0aW9uCi8vCi8vCWZ1bmMgVXBncmFkZVRvVjIoY3VyIHJlYWxtKSB7Ci8vCSAgICAvLyBIb3Qtc3dhcCB0byB2MiAtIHplcm8gZG93bnRpbWUuCi8vCSAgICBwcm90b2NvbF9mZWUuVXBncmFkZUltcGwoY3Jvc3MoY3VyKSwgImduby5sYW5kL3IvZ25vc3dhcC9wcm90b2NvbF9mZWUvdjIiKQovLwl9Ci8vCi8vIGBgYAovLwovLyAjIyBSZWdpc3RyYXRpb24gRmxvdwovLwovLyBUaGUgdmVyc2lvbiByZWdpc3RyYXRpb24gcHJvY2VzcyBmb2xsb3dzIHRoaXMgc2VxdWVuY2U6Ci8vCi8vICAxLiBEb21haW4gcGFja2FnZSBpbml0aWFsaXplcyB2ZXJzaW9uIG1hbmFnZXIgd2l0aCBLVlN0b3JlCi8vICAgICDihpMKLy8gIDIuIHYxIHBhY2thZ2UgY2FsbHMgdGhlIGRvbWFpbiByZWdpc3RyYXRpb24gd3JhcHBlciBkdXJpbmcgaW5pdChjdXIgcmVhbG0pCi8vICAgICDihpIgQmVjb21lcyB0aGUgYWN0aXZlIGltcGxlbWVudGF0aW9uCi8vICAgICDihpMKLy8gIDMuIHYyIHBhY2thZ2UgY2FsbHMgdGhlIGRvbWFpbiByZWdpc3RyYXRpb24gd3JhcHBlciBkdXJpbmcgaW5pdChjdXIgcmVhbG0pCi8vICAgICDihpIgUmVnaXN0ZXJlZCBmb3IgbGF0ZXIgYWN0aXZhdGlvbgovLyAgICAg4oaTCi8vICA0LiB2MyBwYWNrYWdlIGNhbGxzIHRoZSBkb21haW4gcmVnaXN0cmF0aW9uIHdyYXBwZXIgZHVyaW5nIGluaXQoY3VyIHJlYWxtKQovLyAgICAg4oaSIFJlZ2lzdGVyZWQgZm9yIGxhdGVyIGFjdGl2YXRpb24KLy8KLy8gIyMgVmVyc2lvbiBTd2l0Y2hpbmcgRmxvdwovLwovLyBXaGVuIHN3aXRjaGluZyB2ZXJzaW9ucywgdGhlIGZvbGxvd2luZyBzdGVwcyBvY2N1cjoKLy8KLy8gIDEuIEFkbWluL2dvdmVybmFuY2UgY2FsbHMgdGhlIGRvbWFpbiB1cGdyYWRlIHdyYXBwZXIKLy8gICAgIOKGkwovLyAgMi4gVGhlIGRvbWFpbiB3cmFwcGVyIGVuZm9yY2VzIGF1dGhvcml6YXRpb24gYW5kIGNhbGxzIENoYW5nZUltcGxlbWVudGF0aW9uKDAsIGN1ciwgLi4uKQovLyAgICAg4oaTCi8vICAzLiBWZXJzaW9uIE1hbmFnZXIgdmFsaWRhdGVzIHRoZSBsaXZlIHJlYWxtIHRva2VuIGFuZCByZXRyaWV2ZXMgdjIncyBpbml0aWFsaXplcgovLyAgICAg4oaTCi8vICA0LiBFeGVjdXRlcyB2MiBpbml0aWFsaXplciB3aXRoIHRoZSBzaGFyZWQgS1ZTdG9yZQovLyAgICAg4oaTCi8vICA1LiBVcGRhdGVzIGN1cnJlbnRQYWNrYWdlUGF0aCBhbmQgY3VycmVudEltcGxlbWVudGF0aW9uCi8vCi8vICMjIFN0b3JhZ2UgQWNjZXNzIE1vZGVsCi8vCi8vIFRoZSB2ZXJzaW9uIG1hbmFnZXIga2VlcHMgc3RvcmFnZSBvd25lcnNoaXAgd2l0aCB0aGUgZG9tYWluIChwcm94eSkgcmVhbG06Ci8vCi8vICAgLSAqKkRvbWFpbiBPd25lcnNoaXAqKjogVGhlIGRvbWFpbiByZWFsbSBvd25zIHRoZSBLVlN0b3JlIGFuZCBkcml2ZXMgd3JpdGVzLgovLyAgIC0gKipObyBEaXJlY3QgR3JhbnRzKio6IEltcGxlbWVudGF0aW9uIHJlYWxtcyBkbyBub3QgcmVjZWl2ZSBkaXJlY3Qgc3RvcmFnZQovLyAgICAgcGVybWlzc2lvbnMgZnJvbSB2ZXJzaW9uX21hbmFnZXIuCi8vICAgLSAqKkV4cGxpY2l0IFJlYWxtIFRocmVhZGluZyoqOiBSZWdpc3RyYXRpb24gYW5kIHN3aXRjaGluZyBjYWxscyB2YWxpZGF0ZSB0aGUKLy8gICAgIGxpdmUgcmVhbG0gdG9rZW4gd2l0aCBgcmxtLklzQ3VycmVudCgpYCBhbmQgaWRlbnRpZnkgdGhlIGNhbGxlciB3aXRoCi8vICAgICBgcmxtLlByZXZpb3VzKClgLgovLyAgIC0gKipEb21haW4gSXNvbGF0aW9uKio6IFJlZ2lzdHJhdGlvbiBpcyBzY29wZWQgdG8gcGFja2FnZXMgdW5kZXIgdGhlIGRvbWFpbiBwYXRoLgovLwovLyAjIyBTZWN1cml0eQovLwovLyBEb21haW4tc2NvcGVkIHNlY3VyaXR5IGVuc3VyZXMgdGhhdCBvbmx5IGF1dGhvcml6ZWQgcGFja2FnZXMgY2FuIHJlZ2lzdGVyOgovLwovLyAgIC0gKipQYXRoIFZhbGlkYXRpb24qKjogQ2FsbGVyJ3MgcGFja2FnZSBwYXRoIG11c3Qgc3RhcnQgd2l0aCB0aGUgZG9tYWluIHBhdGggKyAiLyIKLy8gICAtICoqUmVhbG0gVmVyaWZpY2F0aW9uKio6IE9ubHkgcmVhbG0gKGNvbnRyYWN0KSBjb2RlIGNhbiByZWdpc3Rlciwgbm90IHVzZXIgY2FsbHMKLy8gICAtICoqRXhhbXBsZSoqOiBGb3IgZG9tYWluICJnbm8ubGFuZC9yL2dub3N3YXAvcHJvdG9jb2xfZmVlIjoKLy8gICAtIFZhbGlkOiAiZ25vLmxhbmQvci9nbm9zd2FwL3Byb3RvY29sX2ZlZS92MSIsICJnbm8ubGFuZC9yL2dub3N3YXAvcHJvdG9jb2xfZmVlL3YyIgovLyAgIC0gSW52YWxpZDogImduby5sYW5kL3IvZ25vc3dhcC9vdGhlciIsICJnbm8ubGFuZC9yL2F0dGFja2VyL21hbGljaW91cyIKLy8KLy8gIyMgRXJyb3IgSGFuZGxpbmcKLy8KLy8gVGhlIHBhY2thZ2UgcmV0dXJucyBlcnJvcnMgZm9yOgovLwovLyAgIC0gVW5hdXRob3JpemVkIGNhbGxlciBhdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIChub3QgaW4gZG9tYWluIHBhdGgpCi8vICAgLSBEdXBsaWNhdGUgcmVnaXN0cmF0aW9uIG9mIHRoZSBzYW1lIHBhY2thZ2UgcGF0aAovLyAgIC0gQXR0ZW1wdGluZyB0byBzd2l0Y2ggdG8gYW4gdW5yZWdpc3RlcmVkIHZlcnNpb24KLy8gICAtIEEgbmlsIGluaXRpYWxpemVyIGluIHRoZSByZWdpc3RlcmVkIG1hcCAoYW4gaW50ZXJuYWwgaW52YWxpZCBzdGF0ZSkuCi8vICAgICBUaGUgaW5pdGlhbGl6ZXIgZnVuY3Rpb24gc2lnbmF0dXJlIGlzIGNoZWNrZWQgYXQgY29tcGlsZSB0aW1lIGJ5IHRoZSB0eXBlZCBBUEkuCi8vCi8vICMjIEJlc3QgUHJhY3RpY2VzCi8vCi8vICAxLiAqKlZlcnNpb24gUmVnaXN0cmF0aW9uKio6IEFsbCB2ZXJzaW9ucyBzaG91bGQgcmVnaXN0ZXIgZHVyaW5nIGluaXQoY3VyIHJlYWxtKSB0byBlbnN1cmUKLy8gICAgIHRoZXkncmUgYXZhaWxhYmxlIGJlZm9yZSBhbnkgcnVudGltZSBvcGVyYXRpb25zLgovLyAgMi4gKipJbnRlcmZhY2UgQ29tcGxpYW5jZSoqOiBFbnN1cmUgYWxsIHZlcnNpb25zIGltcGxlbWVudCB0aGUgc2FtZSBkb21haW4gaW50ZXJmYWNlCi8vICAgICBmb3Igc2VhbWxlc3Mgc3dpdGNoaW5nLgovLyAgMy4gKipTdG9yYWdlIENvbXBhdGliaWxpdHkqKjogRGVzaWduIHN0b3JhZ2Ugc2NoZW1hIHRvIGJlIGZvcndhcmQgYW5kIGJhY2t3YXJkCi8vICAgICBjb21wYXRpYmxlIGFjcm9zcyB2ZXJzaW9ucyB0byBwcmV2ZW50IGRhdGEgY29ycnVwdGlvbi4KLy8gIDQuICoqVGVzdGluZyoqOiBUaG9yb3VnaGx5IHRlc3QgdmVyc2lvbiBzd2l0Y2hpbmcgaW4gYSBzdGFnaW5nIGVudmlyb25tZW50IGJlZm9yZQovLyAgICAgcHJvZHVjdGlvbiB1c2UuCi8vICA1LiAqKlJvbGxiYWNrIFN1cHBvcnQqKjogS2VlcCBwcmV2aW91cyB2ZXJzaW9ucyByZWdpc3RlcmVkIHRvIGVuYWJsZSBxdWljayByb2xsYmFjawovLyAgICAgaWYgaXNzdWVzIGFyZSBkZXRlY3RlZCBpbiBuZXcgdmVyc2lvbnMuCi8vICA2LiAqKlR5cGUgQXNzZXJ0aW9ucyoqOiBBbHdheXMgY2hlY2sgdHlwZSBhc3NlcnRpb25zIHdoZW4gcmV0cmlldmluZyB0aGUgY3VycmVudAovLyAgICAgaW1wbGVtZW50YXRpb24gdG8gcHJldmVudCBydW50aW1lIHBhbmljcy4KLy8KLy8gIyMgVXNlIENhc2VzCi8vCi8vICMjIyBQcm90b2NvbCBVcGdyYWRlcwovLwovLyBVcGdyYWRlIERlRmkgcHJvdG9jb2wgbG9naWMgd2l0aG91dCBkaXNydXB0aW5nIGFjdGl2ZSB1c2Vycy4gVGhlIHRhcmdldAovLyB2ZXJzaW9uIHBhY2thZ2UgbXVzdCBhbHJlYWR5IGJlIGRlcGxveWVkL2xvYWRlZCBhbmQgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgaXRzCi8vIGluaXRpYWxpemVyIGR1cmluZyBwYWNrYWdlIGluaXRpYWxpemF0aW9uOgovLwovLwltYW5hZ2VyLkNoYW5nZUltcGxlbWVudGF0aW9uKDAsIGN1ciwgImduby5sYW5kL3IvZ25vc3dhcC9wcm90b2NvbF9mZWUvdjIiKQovLwovLyAjIyMgQS9CIFRlc3RpbmcKLy8KLy8gVGVzdCBuZXcgaW1wbGVtZW50YXRpb25zIGJlZm9yZSBmdWxsIHJvbGxvdXQuIFN3aXRjaCBvbmx5IHRvIHBhdGhzIHdob3NlCi8vIHZlcnNpb24gcGFja2FnZXMgaGF2ZSBhbHJlYWR5IHJlZ2lzdGVyZWQgaW5pdGlhbGl6ZXJzOgovLwovLwkvLyBTd2l0Y2ggdG8gYSByZWdpc3RlcmVkIGV4cGVyaW1lbnRhbCB2ZXJzaW9uCi8vCW1hbmFnZXIuQ2hhbmdlSW1wbGVtZW50YXRpb24oMCwgY3VyLCAiZ25vLmxhbmQvci9nbm9zd2FwL3Byb3RvY29sX2ZlZS9leHBlcmltZW50YWwiKQovLwovLwkvLyBSb2xsYmFjayB0byBhbm90aGVyIHJlZ2lzdGVyZWQgdmVyc2lvbgovLwltYW5hZ2VyLkNoYW5nZUltcGxlbWVudGF0aW9uKDAsIGN1ciwgImduby5sYW5kL3IvZ25vc3dhcC9wcm90b2NvbF9mZWUvdjEiKQovLwovLyAjIyMgRW1lcmdlbmN5IFJlc3BvbnNlCi8vCi8vIFF1aWNrbHkgc3dpdGNoIHRvIGEgcGF0Y2hlZCB2ZXJzaW9uIGR1cmluZyBzZWN1cml0eSBpbmNpZGVudHMuIERlcGxveS9sb2FkCi8vIHRoZSBob3RmaXggcGFja2FnZSBhbmQgcmVnaXN0ZXIgaXRzIGluaXRpYWxpemVyIGJlZm9yZSBhY3RpdmF0aW9uOgovLwovLwltYW5hZ2VyLkNoYW5nZUltcGxlbWVudGF0aW9uKDAsIGN1ciwgImduby5sYW5kL3IvZ25vc3dhcC9wcm90b2NvbF9mZWUvdjFfaG90Zml4IikKLy8KLy8gIyMgTGltaXRhdGlvbnMgYW5kIENvbnNpZGVyYXRpb25zCi8vCi8vICAgLSAqKlR5cGUgU2FmZXR5Kio6IFJlcXVpcmVzIHJ1bnRpbWUgdHlwZSBhc3NlcnRpb24gdG8gZG9tYWluIGludGVyZmFjZS4gTm8gY29tcGlsZS10aW1lCi8vICAgICB0eXBlIGNoZWNraW5nIGZvciBpbXBsZW1lbnRhdGlvbiBjb21wYXRpYmlsaXR5LgovLyAgIC0gKipBdG9taWMgU3dpdGNoaW5nKio6IEluaXRpYWxpemVyIHNpZGUgZWZmZWN0cyBkdXJpbmcgQ2hhbmdlSW1wbGVtZW50YXRpb24gYXJlIG5vdAovLyAgICAgdHJhbnNhY3Rpb25hbGx5IHJvbGxlZCBiYWNrIG9uIHBhcnRpYWwgZmFpbHVyZS4gTWFudWFsIHJlY292ZXJ5IG1heSBiZSByZXF1aXJlZC4KLy8gICAtICoqU3RvcmFnZSBTY2hlbWEqKjogUmVxdWlyZXMgY2FyZWZ1bCBzY2hlbWEgZGVzaWduIGZvciBjcm9zcy12ZXJzaW9uIGNvbXBhdGliaWxpdHkuCi8vICAgICBCcmVha2luZyBzY2hlbWEgY2hhbmdlcyByZXF1aXJlIG1pZ3JhdGlvbiBvciBjYXJlZnVsIHZlcnNpb24gb3JkZXJpbmcuCi8vICAgLSAqKlJlZ2lzdHJhdGlvbiBPcmRlcioqOiBUaGUgZmlyc3QgcmVnaXN0ZXJlZCB2ZXJzaW9uIGF1dG9tYXRpY2FsbHkgYmVjb21lcyB0aGUKLy8gICAgIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbi4gUGxhbiB5b3VyIGRlcGxveW1lbnQgb3JkZXIgY2FyZWZ1bGx5LgovLyAgIC0gKipObyBVbnJlZ2lzdHJhdGlvbioqOiBPbmNlIHJlZ2lzdGVyZWQsIGEgdmVyc2lvbiBjYW5ub3QgYmUgdW5yZWdpc3RlcmVkLiBQbGFuCi8vICAgICB2ZXJzaW9uIGxpZmVjeWNsZXMgYWNjb3JkaW5nbHkuCi8vCi8vICMjIFJlbGF0ZWQgUGFja2FnZXMKLy8KLy8gICAtIGduby5sYW5kL3AvZ25vc3dhcC9zdG9yZS92MTogUHJvdmlkZXMgS1ZTdG9yZSB3aXRoIHBlcm1pc3Npb24tYmFzZWQgYWNjZXNzIGNvbnRyb2wKLy8KLy8gUGFja2FnZSB2ZXJzaW9uX21hbmFnZXIgaXMgaW50ZW5kZWQgZm9yIHVzZSBpbiBHbm8gc21hcnQgY29udHJhY3RzIHJlcXVpcmluZwovLyBkeW5hbWljLCB1cGdyYWRlYWJsZSBpbXBsZW1lbnRhdGlvbnMgd2l0aCB6ZXJvLWRvd250aW1lIHZlcnNpb24gc3dpdGNoaW5nLgpwYWNrYWdlIHZlcnNpb25fbWFuYWdlcgoaTAoLZ25vbW9kLnRvbWwSPW1vZHVsZSA9ICJnbm8ubGFuZC9wL2dub3N3YXAvdmVyc2lvbl9tYW5hZ2VyL3YxIgpnbm8gPSAiMC45Igoa6hsKCXR5cGVzLmdubxLcG3BhY2thZ2UgdmVyc2lvbl9tYW5hZ2VyCgovLyBWZXJzaW9uTWFuYWdlciBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgZm9yIG1hbmFnaW5nIG11bHRpcGxlIHZlcnNpb25lZCBpbXBsZW1lbnRhdGlvbnMgb2YgYSBkb21haW4uCi8vIEl0IHN3aXRjaGVzIGltcGxlbWVudGF0aW9ucyB3aGlsZSByZXRhaW5pbmcgZG9tYWluLW93bmVkIHN0b3JhZ2UuIEVhY2ggdmVyc2lvbgovLyBpcyByZXNwb25zaWJsZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoYXQgc3RhdGUgYW5kIGFueSByZXF1aXJlZCBtaWdyYXRpb24uCi8vCi8vIERlc2lnbiBHb2FsczoKLy8gICAtIFN3aXRjaCByZWdpc3RlcmVkIGltcGxlbWVudGF0aW9ucyB3aXRob3V0IHJlZGVwbG95aW5nIHRoZSBkb21haW4KLy8gICAtIE1haW50YWluIGEgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3Igc3RvcmFnZSBhY3Jvc3MgYWxsIHZlcnNpb25zCi8vICAgLSBFbmZvcmNlIHNlY3VyaXR5IHRocm91Z2ggZG9tYWluLXNjb3BlZCByZWdpc3RyYXRpb24KLy8gICAtIFJldGFpbiByZWdpc3RlcmVkIHZlcnNpb25zIGZvciBsYXRlciBhY3RpdmF0aW9uLCBzdWJqZWN0IHRvIHN0YXRlIGNvbXBhdGliaWxpdHkKLy8KLy8gSW1wbGVtZW50YXRpb24gTm90ZToKLy8gVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbnMgb2YgZWFjaCB2ZXJzaW9uIG11c3Qgc2F0aXNmeSBhIGNvbW1vbiBkb21haW4gaW50ZXJmYWNlCi8vIGRlZmluZWQgYnkgdGhlIHNwZWNpZmljIGRvbWFpbiAoZS5nLiwgUHJvdG9jb2xGZWUgaW50ZXJmYWNlIGZvciBwcm90b2NvbF9mZWUgZG9tYWluKS4KdHlwZSBWZXJzaW9uTWFuYWdlciBpbnRlcmZhY2UgewoJLy8gUmVnaXN0ZXJJbml0aWFsaXplciByZWdpc3RlcnMgYSB2ZXJzaW9uJ3MgaW1wbGVtZW50YXRpb24uCgkvLyBNdXN0IGJlIGNhbGxlZCBieSBlYWNoIHZlcnNpb24gcGFja2FnZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCgkvLyBGaXJzdCByZWdpc3RyYXRpb24gYmVjb21lcyB0aGUgYWN0aXZlIGltcGxlbWVudGF0aW9uLgoJLy8gU3Vic2VxdWVudCByZWdpc3RyYXRpb25zIGFyZSByZXRhaW5lZCBmb3IgbGF0ZXIgc3dpdGNoaW5nLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogSW50ZXJyZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQgZnJvbSB0aGUgZG9tYWluIHdyYXBwZXI7IGltcGxlbWVudGF0aW9ucyB2YWxpZGF0ZSB0aGUgY3VycmVudCBmcmFtZSBhbmQgaW5zcGVjdCBpdHMgcHJldmlvdXMgZnJhbWUgdG8gaWRlbnRpZnkgdGhlIHJlZ2lzdGVyaW5nIHZlcnNpb24gcGFja2FnZS4KCS8vICAgLSBpbml0aWFsaXplcjogQ2FsbGJhY2sgcmVjZWl2aW5nIHRoZSBkaXNjcmltaW5hdG9yLCByZWFsbSBjb250ZXh0LCBhbmQgZG9tYWluIHN0b3JhZ2Ugd3JhcHBlciwgYW5kIHJldHVybmluZyB0aGF0IHZlcnNpb24ncyBpbXBsZW1lbnRhdGlvbiBpbnN0YW5jZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycm9yOiBuaWwgd2hlbiB0aGUgdmVyc2lvbiBpcyByZWdpc3RlcmVkOyBvdGhlcndpc2UgYW4gZXJyb3IgZm9yIGEgc3Bvb2ZlZCBvciB1bmF1dGhvcml6ZWQgY2FsbGVyLCBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uLCBvciBuaWwgaW5pdGlhbGl6ZXIuCglSZWdpc3RlckluaXRpYWxpemVyKF8gaW50LCBybG0gcmVhbG0sIGluaXRpYWxpemVyIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSwgc3RvcmUgYW55KSBhbnkpIGVycm9yCgoJLy8gQ2hhbmdlSW1wbGVtZW50YXRpb24gc3dpdGNoZXMgdGhlIGFjdGl2ZSB2ZXJzaW9uIGF0IHJ1bnRpbWUuCgkvLyBUaGUgZG9tYWluIHJldGFpbnMgaXRzIEtWU3RvcmU7IHRoZSBzZWxlY3RlZCBpbml0aWFsaXplciBtdXN0IGhhbmRsZSBzdGF0ZQoJLy8gY29tcGF0aWJpbGl0eS4gVGhlIG1hbmFnZXIgZG9lcyBub3QgcHJvdmlkZSBhdXRvbWF0aWMgc2NoZW1hIG1pZ3JhdGlvbi4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IEludGVycmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMC4KCS8vICAgLSBybG06IFByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0IGZyb20gdGhlIGRvbWFpbiB3cmFwcGVyOyBpbXBsZW1lbnRhdGlvbnMgdmFsaWRhdGUgdGhlIGN1cnJlbnQgZnJhbWUgYmVmb3JlIHN3aXRjaGluZy4KCS8vICAgLSBwYWNrYWdlUGF0aDogRnVsbCBwYWNrYWdlIHBhdGggb2YgYSB2ZXJzaW9uIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIFJlZ2lzdGVySW5pdGlhbGl6ZXIuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnJvcjogbmlsIHdoZW4gdGhlIHJlZ2lzdGVyZWQgdmVyc2lvbiBiZWNvbWVzIGFjdGl2ZTsgb3RoZXJ3aXNlIGFuIGVycm9yIGZvciBhIHNwb29mZWQgcmVhbG0gb3IgdW5rbm93biBvciBpbnZhbGlkIGluaXRpYWxpemVyLgoJQ2hhbmdlSW1wbGVtZW50YXRpb24oXyBpbnQsIHJsbSByZWFsbSwgcGFja2FnZVBhdGggc3RyaW5nKSBlcnJvcgoKCS8vIEdldERvbWFpblBhdGggcmV0dXJucyB0aGUgYmFzZSBkb21haW4gcGF0aCAoZS5nLiwgImduby5sYW5kL3IvZ25vc3dhcC9wcm90b2NvbF9mZWUiKS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHN0cmluZzogQmFzZSBwYWNrYWdlIHBhdGggdXNlZCB0byBzY29wZSB0aGlzIHZlcnNpb24gbWFuYWdlcidzIGltcGxlbWVudGF0aW9ucy4KCUdldERvbWFpblBhdGgoKSBzdHJpbmcKCgkvLyBHZXRJbml0aWFsaXplcnMgcmV0dXJucyBhbGwgcmVnaXN0ZXJlZCB2ZXJzaW9uIGluaXRpYWxpemVycy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIG1hcFtzdHJpbmddZnVuYyhfIGludCwgcmxtIHJlYWxtLCBzdG9yZSBhbnkpIGFueTogUmVnaXN0cnkgbWFwcGluZyBlYWNoIHZlcnNpb24gcGFja2FnZSBwYXRoIHRvIGl0cyBpbml0aWFsaXplciBjYWxsYmFjay4KCUdldEluaXRpYWxpemVycygpIG1hcFtzdHJpbmddZnVuYyhfIGludCwgcmxtIHJlYWxtLCBzdG9yZSBhbnkpIGFueQoKCS8vIEdldEN1cnJlbnRQYWNrYWdlUGF0aCByZXR1cm5zIHRoZSBwYWNrYWdlIHBhdGggb2YgdGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbi4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHN0cmluZzogUGFja2FnZSBwYXRoIG9mIHRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24sIG9yIHRoZSBlbXB0eSBzdHJpbmcgYmVmb3JlIGFueSB2ZXJzaW9uIGlzIHJlZ2lzdGVyZWQuCglHZXRDdXJyZW50UGFja2FnZVBhdGgoKSBzdHJpbmcKCgkvLyBHZXRDdXJyZW50SW1wbGVtZW50YXRpb24gcmV0dXJucyB0aGUgYWN0aXZlIHZlcnNpb24gaW5zdGFuY2UuCgkvLyBUaGUgY2FsbGVyIHNob3VsZCB0eXBlLWFzc2VydCB0aGlzIHRvIHRoZSBkb21haW4tc3BlY2lmaWMgaW50ZXJmYWNlLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYW55OiBBY3RpdmUgdmVyc2lvbiBpbXBsZW1lbnRhdGlvbiBpbnN0YW5jZSwgb3IgbmlsIGJlZm9yZSB0aGUgZmlyc3QgcmVnaXN0cmF0aW9uLgoJR2V0Q3VycmVudEltcGxlbWVudGF0aW9uKCkgYW55Cn0KGoxZChN2ZXJzaW9uX21hbmFnZXIuZ25vEvRYLy8gUGFja2FnZSB2ZXJzaW9uX21hbmFnZXIgaW1wbGVtZW50cyBhIHJ1bnRpbWUgdmVyc2lvbiBtYW5hZ2VtZW50IHN5c3RlbSB1c2luZyB0aGUgU3RyYXRlZ3kgUGF0dGVybi4KLy8gSXQgZW5hYmxlcyBkeW5hbWljIHN3aXRjaGluZyBiZXR3ZWVuIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBkb21haW4gKGUuZy4sIHYxLCB2MiwgdjMpCi8vIHdoaWxlIG1haW50YWluaW5nIGEgdW5pZmllZCBzdG9yYWdlIGxheWVyLiBUaGlzIGFwcHJvYWNoIGFsbG93cyBmb3Igc2VhbWxlc3MgdXBncmFkZXMgd2l0aG91dCBtaWdyYXRpb24gb3ZlcmhlYWQuCi8vCi8vIEtleSBGZWF0dXJlczoKLy8gICAtIER5bmFtaWMgaW1wbGVtZW50YXRpb24gcmVnaXN0cmF0aW9uIGFuZCBzd2l0Y2hpbmcKLy8gICAtIERvbWFpbi1zY29wZWQgc2VjdXJpdHkgKG9ubHkgYXV0aG9yaXplZCBwYWNrYWdlcyBjYW4gcmVnaXN0ZXIpCi8vICAgLSBaZXJvLWRvd250aW1lIHVwZ3JhZGVzIHRocm91Z2ggaG90LXN3YXBwaW5nCi8vCi8vIEFyY2hpdGVjdHVyZSBQYXR0ZXJuOiBTdHJhdGVneSArIFBsdWdpbiBBcmNoaXRlY3R1cmUKcGFja2FnZSB2ZXJzaW9uX21hbmFnZXIKCmltcG9ydCAoCgkiY2hhaW4iCgkiZXJyb3JzIgoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvZ25vc3dhcC9zdG9yZS92MSIKKQoKLy8gRXJyU3Bvb2ZlZFJlYWxtIGlzIHJldHVybmVkIHdoZW4gdGhlIHN1cHBsaWVkIHJlYWxtIHRva2VuIGRvZXMgbm90IG1hdGNoIHRoZQovLyBsaXZlIGNyb3NzaW5nIGZyYW1lIChybG0uSXNDdXJyZW50KCkgPT0gZmFsc2UpLiBJdCBzaWduYWxzIGEgc3RhbGUgb3IKLy8gc3Bvb2ZlZCB0b2tlbiBjYXB0dXJlZCBpbiBhbiBlYXJsaWVyIGZyYW1lLgpjb25zdCBFcnJTcG9vZmVkUmVhbG0gPSAicmxtIGRvZXMgbm90IG1hdGNoIHRoZSBjdXJyZW50IGNyb3NzaW5nIGZyYW1lIgoKLy8gdmVyc2lvbk1hbmFnZXIgaXMgdGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIFZlcnNpb25NYW5hZ2VyIGludGVyZmFjZS4KLy8gSXQgbWFuYWdlcyBtdWx0aXBsZSB2ZXJzaW9uZWQgaW1wbGVtZW50YXRpb25zIG9mIGEgZG9tYWluIChlLmcuLCBwcm90b2NvbF9mZWUvdjEsIHByb3RvY29sX2ZlZS92MikuCi8vCi8vIFN0b3JhZ2UgQWNjZXNzIE1vZGVsOgovLyBJbXBsZW1lbnRhdGlvbiByZWFsbXMgZG8gTk9UIHJlY2VpdmUgZGlyZWN0IHN0b3JhZ2UgcGVybWlzc2lvbnMuIEluc3RlYWQsIHdoZW4gY2FsbHMgZmxvdwovLyBmcm9tIHRoZSBkb21haW4gcHJveHkgdG8gdGhlIGltcGxlbWVudGF0aW9uLCB0aGUgcHJveHkgcmVhbG0gKHdoaWNoIGhhcyB3cml0ZSBwZXJtaXNzaW9uCi8vIHRvIHRoZSBLVlN0b3JlKSBpcyB0aGUgb25lIHRoYXQgZHJpdmVzIHRoZSBzdG9yYWdlLiBUaGlzIGRlc2lnbiBwcmV2ZW50cyBleHRlcm5hbCBjYWxsZXJzCi8vIGZyb20gZGlyZWN0bHkgaW52b2tpbmcgaW1wbGVtZW50YXRpb24gcmVhbG1zIHRvIG1vZGlmeSBzdG9yYWdlLgp0eXBlIHZlcnNpb25NYW5hZ2VyIHN0cnVjdCB7CgkvLyBpbml0aWFsaXplcnMgc3RvcmVzIHJlZ2lzdGVyZWQgaW5pdGlhbGl6ZXIgZnVuY3Rpb25zIGtleWVkIGJ5IHBhY2thZ2UgcGF0aAoJLy8gRWFjaCBpbml0aWFsaXplciBib290c3RyYXBzIGEgc3BlY2lmaWMgdmVyc2lvbidzIGltcGxlbWVudGF0aW9uCglpbml0aWFsaXplcnMgbWFwW3N0cmluZ11mdW5jKF8gaW50LCBybG0gcmVhbG0sIHN0b3JlIGFueSkgYW55CgoJLy8gZG9tYWluS1ZTdG9yZSBpcyB0aGUgc2hhcmVkIHN0b3JhZ2UgbGF5ZXIgYWNjZXNzaWJsZSBieSBhbGwgdmVyc2lvbnMKCS8vIFRoZSBkb21haW4gKHByb3h5KSByZWFsbSBpcyB0aGUgb3duZXIgYW5kIGhhcyB3cml0ZSBwZXJtaXNzaW9uCglkb21haW5LVlN0b3JlIHN0b3JlLktWU3RvcmUKCgkvLyBpbml0aWFsaXplRG9tYWluU3RvcmVGbiB3cmFwcyB0aGUgS1ZTdG9yZSBpbnRvIGRvbWFpbi1zcGVjaWZpYyBzdG9yYWdlIGludGVyZmFjZQoJLy8gVGhpcyBhYnN0cmFjdGlvbiBkZWNvdXBsZXMgdGhlIHZlcnNpb24gbWFuYWdlciBmcm9tIGRvbWFpbi1zcGVjaWZpYyBzdG9yYWdlIGltcGxlbWVudGF0aW9ucwoJaW5pdGlhbGl6ZURvbWFpblN0b3JlRm4gZnVuYyhfIGludCwgcmxtIHJlYWxtLCBrdlN0b3JlIHN0b3JlLktWU3RvcmUpIGFueQoKCS8vIGRvbWFpblBhdGggZGVmaW5lcyB0aGUgYmFzZSBwYXRoIGZvciB0aGlzIGRvbWFpbiAoZS5nLiwgImduby5sYW5kL3IvZ25vc3dhcC9wcm90b2NvbF9mZWUiKQoJLy8gVXNlZCBmb3Igc2VjdXJpdHkgdmFsaWRhdGlvbiB0byBlbnN1cmUgb25seSBhdXRob3JpemVkIHBhY2thZ2VzIGNhbiByZWdpc3RlcgoJZG9tYWluUGF0aCBzdHJpbmcKCgkvLyBjdXJyZW50UGFja2FnZVBhdGggaG9sZHMgdGhlIHBhY2thZ2UgcGF0aCBvZiB0aGUgYWN0aXZlIGltcGxlbWVudGF0aW9uCgkvLyAoZS5nLiwgImduby5sYW5kL3IvZ25vc3dhcC9wcm90b2NvbF9mZWUvdjIiKQoJY3VycmVudFBhY2thZ2VQYXRoIHN0cmluZwoKCS8vIGN1cnJlbnRJbXBsZW1lbnRhdGlvbiBpcyB0aGUgYWN0aXZlIHZlcnNpb24ncyBpbnN0YW5jZQoJY3VycmVudEltcGxlbWVudGF0aW9uIGFueQp9CgovLyBSZWdpc3RlckluaXRpYWxpemVyIHJlZ2lzdGVycyBhIG5ldyB2ZXJzaW9uIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZG9tYWluLgovLyBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBieSBlYWNoIHZlcnNpb24gcGFja2FnZSAoZS5nLiwgdjEsIHYyKSBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCi8vCi8vIFRoZSByZWdpc3RyYXRpb24gcHJvY2VzczoKLy8gIDEuIFZhbGlkYXRlcyB0aGUgcmVhbG0gdG9rZW4gaXMgdGhlIGxpdmUgY3Jvc3NpbmcgZnJhbWUgKHJlamVjdHMgc3Bvb2ZlZCB0b2tlbnMpCi8vICAyLiBWYWxpZGF0ZXMgdGhlIGNhbGxlciBpcyB3aXRoaW4gdGhlIGF1dGhvcml6ZWQgZG9tYWluIHBhdGgKLy8gIDMuIFN0b3JlcyB0aGUgaW5pdGlhbGl6ZXIgZnVuY3Rpb24gZm9yIGxhdGVyIHZlcnNpb24gc3dpdGNoaW5nCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBJbnRlcnJlYWxtLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0IGZyb20gdGhlIGRvbWFpbiB3cmFwcGVyOyB0aGlzIGltcGxlbWVudGF0aW9uIHZhbGlkYXRlcyBybG0uSXNDdXJyZW50KCkgYW5kIGluc3BlY3RzIHJsbS5QcmV2aW91cygpIHRvIGlkZW50aWZ5IGFuZCBhdXRob3JpemUgdGhlIHJlZ2lzdGVyaW5nIHZlcnNpb24gcGFja2FnZS4KLy8gICAtIGluaXRpYWxpemVyOiBDYWxsYmFjayByZWNlaXZpbmcgdGhlIGRpc2NyaW1pbmF0b3IsIGN1cnJlbnQgcmVhbG0gY29udGV4dCwgYW5kIGRvbWFpbi1zcGVjaWZpYyBzdG9yYWdlIHdyYXBwZXIsIGFuZCByZXR1cm5pbmcgdGhlIHZlcnNpb24gaW1wbGVtZW50YXRpb24gaW5zdGFuY2UuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogbmlsIHdoZW4gdGhlIGluaXRpYWxpemVyIGlzIHJlZ2lzdGVyZWQgKGFuZCB0aGUgZmlyc3Qgb25lIGlzIGFjdGl2YXRlZCk7IG90aGVyd2lzZSBhbiBlcnJvciBmb3IgYSBzcG9vZmVkIHJlYWxtLCBuaWwgaW5pdGlhbGl6ZXIsIHVzZXIgY2FsbGVyLCBjYWxsZXIgb3V0c2lkZSB0aGUgZG9tYWluIHBhdGgsIG9yIGR1cGxpY2F0ZSBwYWNrYWdlIHBhdGguCi8vCi8vIFNlY3VyaXR5OiBPbmx5IHBhY2thZ2VzIHVuZGVyIHRoZSBkb21haW5QYXRoIHByZWZpeCBjYW4gcmVnaXN0ZXIgKGVuZm9yY2VkIGJ5IGlzQ29udGFpbkRvbWFpblBhdGgpLgpmdW5jICh2bSAqdmVyc2lvbk1hbmFnZXIpIFJlZ2lzdGVySW5pdGlhbGl6ZXIoXyBpbnQsIHJsbSByZWFsbSwgaW5pdGlhbGl6ZXIgZnVuYyhfIGludCwgcmxtIHJlYWxtLCBzdG9yZSBhbnkpIGFueSkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCS8vIFZhbGlkYXRlIGluaXRpYWxpemVyIGlzIG5vdCBuaWwgdG8gcHJldmVudCBwYW5pYyBkdXJpbmcgaW5pdGlhbGl6YXRpb24KCWlmIGluaXRpYWxpemVyID09IG5pbCB7CgkJcmV0dXJuIGVycm9ycy5OZXcoInZlcnNpb25fbWFuYWdlcjogaW5pdGlhbGl6ZXIgY2Fubm90IGJlIG5pbCIpCgl9CgoJLy8gRW5zdXJlIHRoZSBjYWxsZXIgaXMgd2l0aGluIHRoZSBkb21haW4gcGF0aCAoZS5nLiwgcHJvdG9jb2xfZmVlL3YxLCBwcm90b2NvbF9mZWUvdjIpLgoJLy8gcmxtLlByZXZpb3VzKCkgY29ycmVzcG9uZHMgdG8gdjEncyBydW50aW1lLlByZXZpb3VzUmVhbG0oKS4KCXByZXZpb3VzUmVhbG0gOj0gcmxtLlByZXZpb3VzKCkKCWlmIHByZXZpb3VzUmVhbG0uSXNVc2VyKCkgewoJCXJldHVybiBlcnJvcnMuTmV3KCJ2ZXJzaW9uX21hbmFnZXI6IGNhbGxlciBjYW5ub3QgYmUgdXNlciIpCgl9CgoJdGFyZ2V0UGFja2FnZVBhdGggOj0gcHJldmlvdXNSZWFsbS5Qa2dQYXRoKCkKCWlmICF2bS5pc0NvbnRhaW5Eb21haW5QYXRoKHRhcmdldFBhY2thZ2VQYXRoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoInZlcnNpb25fbWFuYWdlcjogY2FsbGVyIGlzIG5vdCBpbiB0aGUgZG9tYWluIHBhdGgiKQoJfQoKCS8vIENoZWNrIGlmIHRoaXMgcGFja2FnZSBwYXRoIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZAoJaWYgXywgb2sgOj0gdm0uaW5pdGlhbGl6ZXJzW3RhcmdldFBhY2thZ2VQYXRoXTsgb2sgewoJCXJldHVybiBlcnJvcnMuTmV3KCJ2ZXJzaW9uX21hbmFnZXI6IGluaXRpYWxpemVyIGFscmVhZHkgcmVnaXN0ZXJlZCIpCgl9CgoJLy8gUmVnaXN0ZXIgdGhlIGluaXRpYWxpemVyIGZ1bmN0aW9uIGZvciB0aGlzIHBhY2thZ2UgcGF0aAoJdm0uaW5pdGlhbGl6ZXJzW3RhcmdldFBhY2thZ2VQYXRoXSA9IGluaXRpYWxpemVyCgoJY2hhaW4uRW1pdCgKCQkiUmVnaXN0ZXJJbml0aWFsaXplciIsCgkJImRvbWFpblBhdGgiLCB2bS5kb21haW5QYXRoLAoJCSJyZWdpc3RlcmVkUGFja2FnZVBhdGgiLCB0YXJnZXRQYWNrYWdlUGF0aCwKCSkKCgkvLyBJbml0aWFsaXplIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlmIGl0IGhhc24ndCBiZWVuIGRvbmUgeWV0CglpZiB2bS5jdXJyZW50UGFja2FnZVBhdGggPT0gIiIgfHwgdm0uY3VycmVudEltcGxlbWVudGF0aW9uID09IG5pbCB7CgkJdm0uY3VycmVudFBhY2thZ2VQYXRoID0gdGFyZ2V0UGFja2FnZVBhdGgKCQl2bS5jdXJyZW50SW1wbGVtZW50YXRpb24gPSBpbml0aWFsaXplcigwLCBybG0sIHZtLmluaXRpYWxpemVEb21haW5TdG9yZUZuKDAsIHJsbSwgdm0uZG9tYWluS1ZTdG9yZSkpCgoJCWNoYWluLkVtaXQoCgkJCSJJbml0aWFsaXplSW1wbGVtZW50YXRpb24iLAoJCQkiZG9tYWluUGF0aCIsIHZtLmRvbWFpblBhdGgsCgkJCSJuZXdQYWNrYWdlUGF0aCIsIHRhcmdldFBhY2thZ2VQYXRoLAoJCSkKCX0KCglyZXR1cm4gbmlsCn0KCi8vIENoYW5nZUltcGxlbWVudGF0aW9uIHBlcmZvcm1zIGEgaG90LXN3YXAgdG8gYSBkaWZmZXJlbnQgdmVyc2lvbiBpbXBsZW1lbnRhdGlvbi4KLy8gVGhpcyBlbmFibGVzIHplcm8tZG93bnRpbWUgdXBncmFkZXMgYnkgc3dpdGNoaW5nIHRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gYXQgcnVudGltZS4KLy8KLy8gVGhlIHN3aXRjaGluZyBwcm9jZXNzOgovLyAgMS4gVmFsaWRhdGVzIHRoZSByZWFsbSB0b2tlbiBpcyB0aGUgbGl2ZSBjcm9zc2luZyBmcmFtZSAocmVqZWN0cyBzcG9vZmVkIHRva2VucykKLy8gIDIuIFZhbGlkYXRlcyB0aGUgdGFyZ2V0IHZlcnNpb24gaGFzIGJlZW4gcmVnaXN0ZXJlZCB2aWEgUmVnaXN0ZXJJbml0aWFsaXplcgovLyAgMy4gUmV0cmlldmVzIGFuZCBleGVjdXRlcyB0aGUgdGFyZ2V0IHZlcnNpb24ncyBpbml0aWFsaXplcgovLwovLyBBdXRob3JpemF0aW9uIGlzIHRoZSBjYWxsZXIgcmVhbG0ncyByZXNwb25zaWJpbGl0eSDigJQgdmVyc2lvbl9tYW5hZ2VyIG9ubHkgcmVqZWN0cwovLyBzcG9vZmVkIHJlYWxtIHRva2Vucy4gVXBncmFkZSBBQ0xzIChhZG1pbiAvIGdvdmVybmFuY2UpIGxpdmUgaW4gdGhlIHdyYXBwaW5nIC9yLyByZWFsbQovLyAoc2VlIGVhY2ggbW9kdWxlJ3MgdXBncmFkZS5nbm8pLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogSW50ZXJyZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBQcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dCBmcm9tIHRoZSBkb21haW4gd3JhcHBlcjsgdGhpcyBpbXBsZW1lbnRhdGlvbiB2YWxpZGF0ZXMgcmxtLklzQ3VycmVudCgpIGJlZm9yZSBzd2l0Y2hpbmcuCi8vICAgLSBwYWNrYWdlUGF0aDogRnVsbCBwYWNrYWdlIHBhdGggb2YgdGhlIHRhcmdldCB2ZXJzaW9uOyBpdCBtdXN0IGJlIGEga2V5IGluIHRoZSByZWdpc3RlcmVkIGluaXRpYWxpemVyIG1hcC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgd2hlbiBwYWNrYWdlUGF0aCBiZWNvbWVzIGFjdGl2ZTsgb3RoZXJ3aXNlIEVyclNwb29mZWRSZWFsbSwgYW4gdW5rbm93bi1wYWNrYWdlIGVycm9yLCBvciBhbiBpbnZhbGlkLWluaXRpYWxpemVyIGVycm9yLgpmdW5jICh2bSAqdmVyc2lvbk1hbmFnZXIpIENoYW5nZUltcGxlbWVudGF0aW9uKF8gaW50LCBybG0gcmVhbG0sIHBhY2thZ2VQYXRoIHN0cmluZykgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCS8vIFJldHJpZXZlIHRoZSByZWdpc3RlcmVkIGluaXRpYWxpemVyIGZ1bmN0aW9uCglpbml0aWFsaXplciwgb2sgOj0gdm0uaW5pdGlhbGl6ZXJzW3BhY2thZ2VQYXRoXQoJaWYgIW9rIHsKCQlyZXR1cm4gZXJyb3JzLk5ldygidmVyc2lvbl9tYW5hZ2VyOiBpbml0aWFsaXplciBub3QgZm91bmQgZm9yIHBhY2thZ2UgcGF0aDoiICsgcGFja2FnZVBhdGgpCgl9CgoJaWYgaW5pdGlhbGl6ZXIgPT0gbmlsIHsKCQlyZXR1cm4gZXJyb3JzLk5ldygidmVyc2lvbl9tYW5hZ2VyOiBpbml0aWFsaXplciBpcyBub3QgYSBmdW5jdGlvbiIpCgl9CgoJcHJldlBhY2thZ2VQYXRoIDo9IHZtLmN1cnJlbnRQYWNrYWdlUGF0aAoJdm0uY3VycmVudFBhY2thZ2VQYXRoID0gcGFja2FnZVBhdGgKCXZtLmN1cnJlbnRJbXBsZW1lbnRhdGlvbiA9IGluaXRpYWxpemVyKDAsIHJsbSwgdm0uaW5pdGlhbGl6ZURvbWFpblN0b3JlRm4oMCwgcmxtLCB2bS5kb21haW5LVlN0b3JlKSkKCgljaGFpbi5FbWl0KAoJCSJDaGFuZ2VJbXBsZW1lbnRhdGlvbiIsCgkJImRvbWFpblBhdGgiLCB2bS5kb21haW5QYXRoLAoJCSJwcmV2aW91c1BhY2thZ2VQYXRoIiwgcHJldlBhY2thZ2VQYXRoLAoJCSJuZXdQYWNrYWdlUGF0aCIsIHBhY2thZ2VQYXRoLAoJKQoKCXJldHVybiBuaWwKfQoKLy8gR2V0RG9tYWluUGF0aCByZXR1cm5zIHRoZSBiYXNlIGRvbWFpbiBwYXRoIGZvciB0aGlzIHZlcnNpb24gbWFuYWdlci4KLy8gRXhhbXBsZTogImduby5sYW5kL3IvZ25vc3dhcC9wcm90b2NvbF9mZWUiCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6IEJhc2UgcGFja2FnZSBwYXRoIHVzZWQgdG8gc2NvcGUgcmVnaXN0ZXJlZCB2ZXJzaW9uIGltcGxlbWVudGF0aW9ucy4KZnVuYyAodm0gKnZlcnNpb25NYW5hZ2VyKSBHZXREb21haW5QYXRoKCkgc3RyaW5nIHsKCXJldHVybiB2bS5kb21haW5QYXRoCn0KCi8vIEdldEluaXRpYWxpemVycyByZXR1cm5zIHRoZSBtYXAgY29udGFpbmluZyBhbGwgcmVnaXN0ZXJlZCBpbml0aWFsaXplciBmdW5jdGlvbnMuCi8vIEtleXMgYXJlIHBhY2thZ2UgcGF0aHMsIHZhbHVlcyBhcmUgaW5pdGlhbGl6ZXIgZnVuY3Rpb25zLgovLyBVc2VmdWwgZm9yIGluc3BlY3Rpbmcgd2hpY2ggdmVyc2lvbnMgYXJlIGF2YWlsYWJsZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIG1hcFtzdHJpbmddZnVuYyhfIGludCwgcmxtIHJlYWxtLCBzdG9yZSBhbnkpIGFueTogQ3VycmVudCByZWdpc3RyeSBtYXBwaW5nIHZlcnNpb24gcGFja2FnZSBwYXRocyB0byBpbml0aWFsaXplciBjYWxsYmFja3MuCmZ1bmMgKHZtICp2ZXJzaW9uTWFuYWdlcikgR2V0SW5pdGlhbGl6ZXJzKCkgbWFwW3N0cmluZ11mdW5jKF8gaW50LCBybG0gcmVhbG0sIHN0b3JlIGFueSkgYW55IHsKCXJldHVybiB2bS5pbml0aWFsaXplcnMKfQoKLy8gR2V0Q3VycmVudFBhY2thZ2VQYXRoIHJldHVybnMgdGhlIHBhY2thZ2UgcGF0aCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBpbXBsZW1lbnRhdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogQWN0aXZlIGltcGxlbWVudGF0aW9uJ3MgcGFja2FnZSBwYXRoLCBvciB0aGUgZW1wdHkgc3RyaW5nIGJlZm9yZSByZWdpc3RyYXRpb24uCmZ1bmMgKHZtICp2ZXJzaW9uTWFuYWdlcikgR2V0Q3VycmVudFBhY2thZ2VQYXRoKCkgc3RyaW5nIHsKCXJldHVybiB2bS5jdXJyZW50UGFja2FnZVBhdGgKfQoKLy8gR2V0Q3VycmVudEltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIHZlcnNpb24uCi8vIFRoZSByZXR1cm5lZCB2YWx1ZSBzaG91bGQgYmUgdHlwZS1hc3NlcnRlZCB0byB0aGUgZG9tYWluLXNwZWNpZmljIGludGVyZmFjZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFueTogQWN0aXZlIHZlcnNpb24gaW1wbGVtZW50YXRpb24gaW5zdGFuY2UsIG9yIG5pbCBiZWZvcmUgdGhlIGZpcnN0IGluaXRpYWxpemVyIGlzIHJlZ2lzdGVyZWQuCmZ1bmMgKHZtICp2ZXJzaW9uTWFuYWdlcikgR2V0Q3VycmVudEltcGxlbWVudGF0aW9uKCkgYW55IHsKCXJldHVybiB2bS5jdXJyZW50SW1wbGVtZW50YXRpb24KfQoKLy8gaXNDb250YWluRG9tYWluUGF0aCBjaGVja3MgaWYgdGhlIGNhbGxpbmcgY29udHJhY3QgaXMgd2l0aGluIHRoZSBhdXRob3JpemVkIGRvbWFpbiBwYXRoLgovLyBUaGlzIGlzIGEgY3JpdGljYWwgc2VjdXJpdHkgY2hlY2sgdGhhdCBwcmV2ZW50cyB1bmF1dGhvcml6ZWQgZXh0ZXJuYWwgY29udHJhY3RzIGZyb20KLy8gcmVnaXN0ZXJpbmcgaW1wbGVtZW50YXRpb25zLgovLwovLyBWYWxpZGF0aW9uIHJ1bGVzOgovLyAgIC0gUGFja2FnZSBwYXRoIG11c3Qgc3RhcnQgd2l0aCBkb21haW5QYXRoICsgIi8iCi8vCi8vIEV4YW1wbGU6Ci8vICAgLSBkb21haW5QYXRoOiAiZ25vLmxhbmQvci9nbm9zd2FwL3Byb3RvY29sX2ZlZSIKLy8gICAtIFZhbGlkIGNhbGxlcnM6ICJnbm8ubGFuZC9yL2dub3N3YXAvcHJvdG9jb2xfZmVlL3YxIiwgImduby5sYW5kL3IvZ25vc3dhcC9wcm90b2NvbF9mZWUvdjIiCi8vICAgLSBJbnZhbGlkIGNhbGxlcnM6ICJnbm8ubGFuZC9yL2dub3N3YXAvb3RoZXIiLCAiZ25vLmxhbmQvci9hdHRhY2tlci9tYWxpY2lvdXMiCmZ1bmMgKHZtICp2ZXJzaW9uTWFuYWdlcikgaXNDb250YWluRG9tYWluUGF0aCh0YXJnZXRQYWNrYWdlUGF0aCBzdHJpbmcpIGJvb2wgewoJLy8gYGRvbWFpblBhdGhgIGlzIHNldCB2aWEgdGhlIGN1cnJlbnQgcmVhbG0ncyBQa2dQYXRoIGluIGVhY2ggY29udHJhY3QuCgkvLyBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgc2VwYXJhdGUgdHJhaWxpbmcgc2xhc2ggY2hlY2ssCgkvLyBhbmQgdGhlIHByZWZpeCBpcyBkZXRlcm1pbmVkIGJ5IGRpcmVjdGx5IGFwcGVuZGluZyBgL2AgZm9yIHZlcnNpb24gZGV0ZWN0aW9uLgoJcHJlZml4IDo9IHZtLmRvbWFpblBhdGggKyAiLyIKCglyZXR1cm4gc3RyaW5ncy5IYXNQcmVmaXgodGFyZ2V0UGFja2FnZVBhdGgsIHByZWZpeCkKfQoKLy8gTmV3VmVyc2lvbk1hbmFnZXIgY3JlYXRlcyBhIG5ldyB2ZXJzaW9uIG1hbmFnZXIgaW5zdGFuY2UgZm9yIGEgc3BlY2lmaWMgZG9tYWluLgovLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgb25jZSBwZXIgZG9tYWluIGR1cmluZyBzeXN0ZW0gaW5pdGlhbGl6YXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vCi8vICAgLSBkb21haW5QYXRoOiBUaGUgYmFzZSBwYWNrYWdlIHBhdGggZm9yIHRoZSBkb21haW4gKGUuZy4sICJnbm8ubGFuZC9yL2dub3N3YXAvcHJvdG9jb2xfZmVlIikKLy8gICAgIFVzZWQgZm9yIGFjY2VzcyBjb250cm9sIHRvIGVuc3VyZSBvbmx5IGF1dGhvcml6ZWQgcGFja2FnZXMgY2FuIHJlZ2lzdGVyCi8vCi8vICAgLSBrdlN0b3JlOiBUaGUgc2hhcmVkIGtleS12YWx1ZSBzdG9yZSB0aGF0IGFsbCB2ZXJzaW9ucyB3aWxsIGFjY2VzcwovLyAgICAgVGhlIGRvbWFpbiByZWFsbSAocHJveHkpIGlzIHRoZSBvd25lciBhbmQgaGFzIHdyaXRlIHBlcm1pc3Npb24gdG8gdGhpcyBzdG9yZQovLwovLyAgIC0gaW5pdGlhbGl6ZURvbWFpblN0b3JlRm46IEEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IHdyYXBzIHRoZSBLVlN0b3JlIGludG8gYSBkb21haW4tc3BlY2lmaWMgc3RvcmFnZSBpbnRlcmZhY2UKLy8gICAgIFRoaXMgYWJzdHJhY3Rpb24gYWxsb3dzIGVhY2ggdmVyc2lvbiB0byB3b3JrIHdpdGggYSBmYW1pbGlhciBzdG9yYWdlIEFQSQovLyAgICAgRXhhbXBsZTogZnVuYyhfIGludCwgcmxtIHJlYWxtLCBrdlN0b3JlIHN0b3JlLktWU3RvcmUpIGFueSB7IHJldHVybiBOZXdQcm90b2NvbEZlZVN0b3JlKGt2U3RvcmUpIH0KLy8KLy8gUmV0dXJuczoKLy8gICAtIFZlcnNpb25NYW5hZ2VyOiBBbiBpbml0aWFsaXplZCB2ZXJzaW9uIG1hbmFnZXIgcmVhZHkgdG8gYWNjZXB0IGltcGxlbWVudGF0aW9uIHJlZ2lzdHJhdGlvbnMKLy8KLy8gVXNhZ2UgUGF0dGVybjoKLy8gIDEuIENyZWF0ZSB2ZXJzaW9uIG1hbmFnZXIgaW4gcGFyZW50IGRvbWFpbiBwYWNrYWdlCi8vICAyLiBFYWNoIHZlcnNpb24gKHYxLCB2MiwgdjMpIGNhbGxzIFJlZ2lzdGVySW5pdGlhbGl6ZXIgZHVyaW5nIHRoZWlyIGluaXQoKQovLyAgMy4gVXNlIENoYW5nZUltcGxlbWVudGF0aW9uIHRvIHN3aXRjaCBiZXR3ZWVuIHZlcnNpb25zIGF0IHJ1bnRpbWUKZnVuYyBOZXdWZXJzaW9uTWFuYWdlcigKCWRvbWFpblBhdGggc3RyaW5nLAoJa3ZTdG9yZSBzdG9yZS5LVlN0b3JlLAoJaW5pdGlhbGl6ZURvbWFpblN0b3JlRm4gZnVuYyhfIGludCwgcmxtIHJlYWxtLCBrdlN0b3JlIHN0b3JlLktWU3RvcmUpIGFueSwKKSBWZXJzaW9uTWFuYWdlciB7CglyZXR1cm4gJnZlcnNpb25NYW5hZ2VyewoJCWRvbWFpblBhdGg6ICAgICAgICAgICAgICBkb21haW5QYXRoLAoJCWRvbWFpbktWU3RvcmU6ICAgICAgICAgICBrdlN0b3JlLAoJCWluaXRpYWxpemVEb21haW5TdG9yZUZuOiBpbml0aWFsaXplRG9tYWluU3RvcmVGbiwKCQlpbml0aWFsaXplcnM6ICAgICAgICAgICAgbWFrZShtYXBbc3RyaW5nXWZ1bmMoXyBpbnQsIHJsbSByZWFsbSwgc3RvcmUgYW55KSBhbnkpLAoJCWN1cnJlbnRQYWNrYWdlUGF0aDogICAgICAiIiwKCQljdXJyZW50SW1wbGVtZW50YXRpb246ICAgbmlsLAoJfQp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbBIRCOy8sS0SCjQ3NTkydWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDBJzVBMPi0jqizwud5so4H6Lp9Zc4oYF/2VGlIjXCuuESQBxWWd+MjRQoVVBykWC3+zAJgFzl/apReJtBtgkji12vMmVCRoBbf0+XmTfmhpib22gGSBvtOLs5aqBFokZ+ttEaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=