Transaction executed successfully

Transaction Details

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

Transaction hash
3BA1F3D0E0AAACBCD2663477F4AAB8A57D4DFCD7D88114772F3B14D34344D8E6

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
197,909,674
Requested gas limit
GAS USED
164,924,778
Gas consumed
FEE
197910ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1q5tjjv3kkslzwf2na9y9wk7e5a8ugph8xfsk04

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

CpCNCAoML3ZtLm1fYWRkcGtnEv6MCAooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBLQjAgKCmdvdmVybmFuY2USIWduby5sYW5kL3IvZ25vc3dhcC9nb3YvZ292ZXJuYW5jZRrdOwoJUkVBRE1FLm1kEs87IyBHb3Zlcm5hbmNlCgpEZWNlbnRyYWxpemVkIHByb3RvY29sIGdvdmVybmFuY2UgdmlhIEdOUyBzdGFraW5nIGFuZCB2b3RpbmcuCgojIyBPdmVydmlldwoKR292ZXJuYW5jZSBlbmFibGVzIEdOUyBob2xkZXJzIHRvIHN0YWtlIHRocm91Z2ggYGdvdi9zdGFrZXJgLCByZWNlaXZlIHhHTlMsIGRlbGVnYXRlIHZvdGluZyBwb3dlciwgY3JlYXRlIHByb3Bvc2FscywgYW5kIHZvdGUgb24gcHJvdG9jb2wgY2hhbmdlcy4gRm9yIG1vcmUgZGV0YWlscywgY2hlY2sgb3V0IFtkb2NzXShodHRwczovL2RvY3MuZ25vc3dhcC5pby9jb3JlLWNvbmNlcHRzL2dvdmVybmFuY2UpLgoKIyMgQ29uZmlndXJhdGlvbgoKVGhlIGBnb3Zlcm5hbmNlLkNvbmZpZ2AgdHlwZSBkZWZpbmVzIHRoZSBnb3Zlcm5hbmNlIHBhcmFtZXRlcnMuIFRoZSB2YWx1ZXMgdXNlZCBieSBhIHByb3Bvc2FsIGFyZSBzdG9yZWQgd2l0aCB0aGF0IHByb3Bvc2FsOyBsYXRlciByZWNvbmZpZ3VyYXRpb24gZG9lcyBub3QgcmV3cml0ZSBhbiBleGlzdGluZyBwcm9wb3NhbC4gVGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBjYW4gYmUgY2hhbmdlZCB0aHJvdWdoIHRoZSBnb3Zlcm5hbmNlIGBSZWNvbmZpZ3VyZWAgaGFuZGxlci4gVGhpcyB0eXBlIGNhbiBiZSBmb3VuZCBpbiBbY29uZmlnLmdub10oLi9jb25maWcuZ25vKS4KCnwgRmllbGQgfCBEZXNjcmlwdGlvbiB8IERlZmF1bHQgfAp8LS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwKfCBgVm90aW5nU3RhcnREZWxheWAgfCBEZWxheSBiZWZvcmUgdm90aW5nIHN0YXJ0cyBhZnRlciBwcm9wb3NhbCBjcmVhdGlvbiB8IDEgZGF5IHwKfCBgVm90aW5nUGVyaW9kYCB8IER1cmF0aW9uIGZvciBjb2xsZWN0aW5nIHZvdGVzIHwgNyBkYXlzIHwKfCBgVm90aW5nV2VpZ2h0U21vb3RoaW5nRHVyYXRpb25gIHwgRHVyYXRpb24gdXNlZCBmb3IgdGltZXN0YW1wLWJhc2VkIHZvdGluZy13ZWlnaHQgYXZlcmFnaW5nIHwgMSBkYXkgfAp8IGBRdW9ydW1gIHwgUGVyY2VudGFnZSBvZiB0b3RhbCB4R05TIHN1cHBseSByZXF1aXJlZCBmb3IgcHJvcG9zYWwgcGFzc2FnZTsgdG90YWwgc3VwcGx5IGluY2x1ZGVzIGxhdW5jaHBhZC1oZWxkIGlzc3VhbmNlIHwgNTAlIHwKfCBgUHJvcG9zYWxDcmVhdGlvblRocmVzaG9sZGAgfCBNaW5pbXVtIHhHTlMgYmFsYW5jZSByZXF1aXJlZCB0byBjcmVhdGUgYSBwcm9wb3NhbCB8IDEsMDAwLDAwMCwwMDAgeEdOUyB8CnwgYEV4ZWN1dGlvbkRlbGF5YCB8IFdhaXRpbmcgcGVyaW9kIGFmdGVyIHZvdGluZyBlbmRzIGJlZm9yZSBleGVjdXRpb24gfCAxIGRheSB8CnwgYEV4ZWN1dGlvbldpbmRvd2AgfCBUaW1lIHdpbmRvdyBkdXJpbmcgd2hpY2ggYW4gYXBwcm92ZWQgcHJvcG9zYWwgY2FuIGJlIGV4ZWN1dGVkIHwgMzAgZGF5cyB8CgpBbGwgdmFsdWVzIGFyZSBjb25maWd1cmFibGU7IHRoZSB2YWx1ZXMgYWJvdmUgYXJlIHRoZSBkZWZhdWx0cyBpbiBgTmV3RGVmYXVsdENvbmZpZ2AuCgojIyBDb3JlIE1lY2hhbmljcwoKIyMjIFN0YWtpbmcgRmxvdwoKYGBgcGxhaW4KR05TIOKGkiBEZWxlZ2F0ZSDihpIgeEdOUyArIGRlbGVnYXRlZCB2b3RpbmcgaGlzdG9yeSDihpIgVm90ZQpgYGAKCjEuIERlbGVnYXRlIEdOUyB0aHJvdWdoIGBnb3Yvc3Rha2VyYCB0byByZWNlaXZlIGFuIGVxdWFsIGFtb3VudCBvZiB4R05TLgoyLiBBc3NpZ24gdm90aW5nIHBvd2VyIHRvIGEgZGVsZWdhdGVlICh3aGljaCBtYXkgYmUgdGhlIGRlbGVnYXRvciBpdHNlbGYpLgozLiBWb3RlIG9uIHByb3Bvc2FscyB3aXRoIHRoZSBkZWxlZ2F0ZWUncyB0aW1lc3RhbXBlZCBkZWxlZ2F0aW9uIHdlaWdodC4KNC4gVW5kZWxlZ2F0aW9uIHJlbW92ZXMgdm90aW5nIHBvd2VyIGltbWVkaWF0ZWx5OyB0aGUgZGVmYXVsdCBsb2NrdXAgYmVmb3JlIGNvbGxlY3RpbmcgR05TIGlzIDcgZGF5cyBhbmQgaXMgY29uZmlndXJhYmxlLgoKTGF1bmNocGFkLWJhY2tlZCB4R05TIGlzIGluY2x1ZGVkIGluIHRvdGFsIHhHTlMgc3VwcGx5IGZvciBxdW9ydW0sIGJ1dCBpcyBub3QgYW4gb3JkaW5hcnkgdXNlciBkZWxlZ2F0aW9uIHJlY29yZC4KCiMjIyBQcm9wb3NhbCBUeXBlcwoKLSAqKlRleHQqKjogU2lnbmFsIHByb3Bvc2FscyB3aXRob3V0IGV4ZWN1dGlvbi4KLSAqKkNvbW11bml0eVBvb2xTcGVuZCoqOiBUcmVhc3VyeSBkaXNidXJzZW1lbnRzIGVuY29kZWQgYXMgYSBjb21tdW5pdHktcG9vbCB0cmFuc2ZlciBvbiBleGVjdXRpb24uCi0gKipQYXJhbWV0ZXJDaGFuZ2UqKjogUHJvdG9jb2wgcGFyYW1ldGVyIHVwZGF0ZXMgZGlzcGF0Y2hlZCB0byByZWdpc3RlcmVkIGhhbmRsZXJzLgoKIyMgUHJvcG9zYWwgTGlmZWN5Y2xlCgojIyMgQ3JlYXRpb24KCi0gUmVxdWlyZXMgdGhlIGNvbmZpZ3VyZWQgYFByb3Bvc2FsQ3JlYXRpb25UaHJlc2hvbGRgIHhHTlMgYmFsYW5jZSAoMSwwMDAsMDAwLDAwMCB4R05TIGJ5IGRlZmF1bHQpLgotIE9uZSBhY3RpdmUgcHJvcG9zYWwgcGVyIGFkZHJlc3MuCi0gVmFsaWQgdHlwZSBhbmQgcGFyYW1ldGVycyBhcmUgcmVxdWlyZWQuIENvbW11bml0eS1wb29sIHNwZW5kIGFtb3VudHMgbXVzdCBiZSBzdHJpY3RseSBwb3NpdGl2ZSwgcmVjaXBpZW50cyBtdXN0IGJlIHZhbGlkLCBhbmQgdG9rZW4gcGF0aHMgbXVzdCBiZSByZWdpc3RlcmVkLgotIEEgcHJvcG9zYWwgc3RvcmVzIGl0cyBjb25maWd1cmF0aW9uIHZlcnNpb24sIGNyZWF0aW9uIHRpbWVzdGFtcCwgY3JlYXRpb24gYmxvY2sgaGVpZ2h0LCBxdW9ydW0gYW1vdW50LCBhbmQgdGltZXN0YW1wIHVzZWQgZm9yIGhpc3RvcmljYWwgZGVsZWdhdGlvbiBsb29rdXAuIFRoZSBibG9jayBoZWlnaHQgaXMgbWV0YWRhdGE7IHZvdGluZy13ZWlnaHQgbG9va3VwIGlzIHRpbWVzdGFtcC1iYXNlZC4KCiMjIyBWb3RpbmcKCi0gVm90aW5nIHN0YXJ0cyBhZnRlciB0aGUgY29uZmlndXJlZCBzdGFydCBkZWxheSAoMSBkYXkgYnkgZGVmYXVsdCkgYW5kIHJ1bnMgZm9yIHRoZSBjb25maWd1cmVkIHZvdGluZyBwZXJpb2QgKDcgZGF5cyBieSBkZWZhdWx0KS4KLSBXZWlnaHQgaXMgdGhlIGF2ZXJhZ2Ugb2YgdGhlIGNhbGxlcidzIGRlbGVnYXRpb24gYXQgdGhlIHByb3Bvc2FsJ3Mgc3RvcmVkIHNuYXBzaG90IHRpbWVzdGFtcCBhbmQgYXQgcHJvcG9zYWwgY3JlYXRpb24gdGltZS4gVGhlIHNuYXBzaG90IHRpbWVzdGFtcCBpcyBgY3JlYXRlZEF0IC0gVm90aW5nV2VpZ2h0U21vb3RoaW5nRHVyYXRpb25gIChjbGFtcGVkIGF0IHplcm8pLCBhbmQgdGhlIHNtb290aGluZyBkdXJhdGlvbiBkZWZhdWx0cyB0byAyNCBob3Vycy4KLSBFYWNoIGFkZHJlc3MgY2FuIHZvdGUgb25seSBvbmNlIG9uIGEgcHJvcG9zYWwuIGBWb3RlYCByZXR1cm5zIHRoZSBhcHBsaWVkIHZvdGUgd2VpZ2h0IGFzIGEgZGVjaW1hbCBzdHJpbmcuCgojIyMgRXhlY3V0aW9uCgpBIHByb3Bvc2FsIGlzIGNvbnNpZGVyZWQgdmFsaWQgYW5kIGV4ZWN1dGFibGUgd2hlbjoKCi0gVGhlIHZvdGluZyBwZXJpb2QgaGFzIGVuZGVkLgotIFRvdGFsIHZvdGVzIG1lZXQgdGhlIHF1b3J1bSBhbW91bnQgY29tcHV0ZWQgYXQgY3JlYXRpb24gZnJvbSB0aGUgdG90YWwgeEdOUyBzdXBwbHkgKGluY2x1ZGluZyBsYXVuY2hwYWQtaGVsZCBpc3N1YW5jZSkgYW5kIHRoZSBwcm9wb3NhbCdzIGNvbmZpZ3VyZWQgcXVvcnVtIHBlcmNlbnRhZ2UuCi0gYFlFU2Agdm90ZXMgc3RyaWN0bHkgZXhjZWVkIGBOT2Agdm90ZXMgKHRpZXMgZG8gbm90IHBhc3MpLgotIFRoZSBjb25maWd1cmVkIGV4ZWN1dGlvbiBkZWxheSAoMSBkYXkgYnkgZGVmYXVsdCkgaGFzIHBhc3NlZCBhZnRlciB2b3RpbmcgZW5kcy4KLSBFeGVjdXRpb24gb2NjdXJzIHdpdGhpbiB0aGUgY29uZmlndXJlZCBleGVjdXRpb24gd2luZG93ICgzMCBkYXlzIGJ5IGRlZmF1bHQpLgotIFRleHQgcHJvcG9zYWxzIGFyZSBpbmZvcm1hdGlvbmFsIGFuZCBjYW5ub3QgYmUgZXhlY3V0ZWQ7IGFueW9uZSBjYW4gdHJpZ2dlciBleGVjdXRpb24gb2YgYW4gYXBwcm92ZWQgZXhlY3V0YWJsZSBwcm9wb3NhbC4KCkFuIGFwcHJvdmVkIGNvbW11bml0eS1wb29sIHNwZW5kIGNhbiBzdGlsbCBmYWlsIGF0IGV4ZWN1dGlvbiBpZiB0aGUgcG9vbCBubyBsb25nZXIgaGFzIGVub3VnaCBvZiB0aGUgcmVnaXN0ZXJlZCB0b2tlbi4KCiMjIFRlY2huaWNhbCBEZXRhaWxzCgojIyMgVm90ZSBXZWlnaHQgQ2FsY3VsYXRpb24KCmBgYGdvCi8vIGBzbW9vdGhpbmdgIGlzIHRoZSBwcm9wb3NhbCdzIGNvbmZpZ3VyZWQgVm90aW5nV2VpZ2h0U21vb3RoaW5nRHVyYXRpb24uCnNuYXBzaG90VGltZSA9IG1heChjcmVhdGVkQXQgLSBzbW9vdGhpbmcsIDApCndlaWdodEF0U25hcHNob3QgPSBnZXREZWxlZ2F0aW9uQXQodm90ZXIsIHNuYXBzaG90VGltZSkKd2VpZ2h0QXRDcmVhdGlvbiA9IGdldERlbGVnYXRpb25BdCh2b3RlciwgY3JlYXRlZEF0KQp2b3RlV2VpZ2h0ID0gKHdlaWdodEF0U25hcHNob3QgKyB3ZWlnaHRBdENyZWF0aW9uKSAvIDIKYGBgCgpUaGUgbG9va3VwcyByZWFkIGRlbGVnYXRpb24gaGlzdG9yeSBieSBVbml4IHRpbWVzdGFtcC4gVGhpcyBpcyBub3QgYSBibG9jay1oZWlnaHQgc25hcHNob3QuCgojIyMgUXVvcnVtIENhbGN1bGF0aW9uCgpgYGBnbwpxdW9ydW1XZWlnaHQgPSB0b3RhbFhHbnNTdXBwbHlBdFByb3Bvc2FsQ3JlYXRpb24gLy8gaW5jbHVkZXMgbGF1bmNocGFkLWhlbGQgeEdOUwpxdW9ydW1BbW91bnQgPSBxdW9ydW1XZWlnaHQgKiBxdW9ydW1QZXJjZW50IC8gMTAwICAvLyBxdW9ydW1QZXJjZW50IGRlZmF1bHRzIHRvIDUwCmBgYAoKVGhlIHF1b3J1bSBhbW91bnQgaXMgc3RvcmVkIG9uIHRoZSBwcm9wb3NhbCBhbmQgaXMgbm90IHJlY29tcHV0ZWQgZnJvbSB0aGUgcHJvcG9zZXIncyBvciB2b3RlcnMnIHNtb290aGVkIHZvdGluZyB3ZWlnaHQuIEEgcHJvcG9zYWwgcGFzc2VzIG9ubHkgd2hlbiB0b3RhbCB2b3RlcyByZWFjaCBxdW9ydW0gYW5kIGFjY3VtdWxhdGVkIGBZRVNgIHZvdGVzIHN0cmljdGx5IGV4Y2VlZCBhY2N1bXVsYXRlZCBgTk9gIHZvdGVzLgoKIyMjIFJld2FyZHMgRGlzdHJpYnV0aW9uCgpHb3Yvc3Rha2VyIGV4cG9zZXMgdHdvIHJld2FyZCBzdHJlYW1zOgoKMS4gKipHTlMgZW1pc3Npb24gcmV3YXJkcyoqIHVzZSB0aGUgZW1pc3Npb24gYWNjdW11bGF0b3IgYW5kIGVhY2ggc3Rha2VyJ3Mgb3duIHN0YWtlIGhpc3RvcnkuCjIuICoqUHJvdG9jb2wtZmVlIHJld2FyZHMqKiBhcmUgdHJhY2tlZCBwZXIgdG9rZW4gYW5kIGFjY3J1YWwgZXBvY2guIEVhY2ggY29uc3VtZWQgYnVja2V0IGlzIGRpdmlkZWQgYnkgdGhlIHRvdGFsIHN0YWtlIGluIGZvcmNlIGR1cmluZyB0aGF0IGVwb2NoLCBhZGRlZCB0byB0aGF0IHRva2VuJ3MgUTEyOCBhY2N1bXVsYXRvciwgYW5kIHNldHRsZWQgb3ZlciB0aGUgc3Rha2VyJ3Mgc3Rha2UtZXZlbnQgc2VnbWVudHMuIFN1Yi11bml0IFExMjggcmVtYWluZGVycyBhcmUgcmV0YWluZWQgZm9yIGxhdGVyIGNvbGxlY3Rpb24uCgpgQ29sbGVjdFJld2FyZGAgc2V0dGxlcyB0aGUgZW1pc3Npb24gc3RyZWFtIGFuZCBldmVyeSBrbm93biBwcm90b2NvbC1mZWUgdG9rZW4uIGBDb2xsZWN0RW1pc3Npb25SZXdhcmRgIGFuZCBgQ29sbGVjdFByb3RvY29sRmVlUmV3YXJkKHRva2VuUGF0aClgIGFyZSBuYXJyb3dlciBwYXRoczsgdGhlIHRva2VuLXNwZWNpZmljIHByb3RvY29sLWZlZSBwYXRoIGJvdW5kcyBib3RoIHBlbmRpbmcgYWNjcnVhbCBidWNrZXRzIGFuZCBzdGFrZSBldmVudHMgcGVyIGNhbGwsIHNvIHJlbWFpbmluZyB3b3JrIGlzIGNvbGxlY3RlZCBsYXRlci4gTGF1bmNocGFkIHByb2plY3Qgd2FsbGV0cyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgbGF1bmNocGFkLW9ubHkgZW50cnkgcG9pbnRzLgoKIyMgVXNhZ2UKClRoZXNlIHNuaXBwZXRzIGNhbGwgdGhlIHB1YmxpYyBkb21haW4gcHJveGllcyBmcm9tIGEgcmVhbG0gZnVuY3Rpb24gd2l0aCBhIGN1cnJlbnQgYGN1cmAgdG9rZW4uCkltcG9ydCB0aGUgY29ycmVzcG9uZGluZyBwcm94eSBwYWNrYWdlcyBhbmQgcXVhbGlmeSB0aGVpciBmdW5jdGlvbiBuYW1lcyBpbiBpbnRlZ3JhdGluZyBjb2RlLgoKYGBgZ28KLy8gVGhyb3VnaCBnb3Yvc3Rha2VyOiBkZWxlZ2F0ZSBHTlMgZm9yIHhHTlMgdm90aW5nIHBvd2VyLgpEZWxlZ2F0ZShjcm9zcyhjdXIpLCBkZWxlZ2F0ZWUsIDFfMDAwXzAwMF8wMDAsICJnMXJlZmVycmVyLi4uIikKCi8vIENyZWF0ZSBhIHRleHQgb3IgY29tbXVuaXR5LXBvb2wgcHJvcG9zYWwuClByb3Bvc2VUZXh0KGNyb3NzKGN1ciksICJUaXRsZSIsICJEZXNjcmlwdGlvbiIpClByb3Bvc2VDb21tdW5pdHlQb29sU3BlbmQoY3Jvc3MoY3VyKSwgIlRpdGxlIiwgIkRlc2NyaXB0aW9uIiwgcmVjaXBpZW50LCB0b2tlblBhdGgsIGFtb3VudCkKCi8vIEEgcGFyYW1ldGVyLWNoYW5nZSBleGVjdXRpb24gdXNlcyBhIHJlZ2lzdGVyZWQgaGFuZGxlci4gVGhpcyBpcyBvbmUgdmFsaWQKLy8gUmVjb25maWd1cmUgbWVzc2FnZSAoYWxsIHNldmVuIHBhcmFtZXRlcnMgYXJlIHJlcXVpcmVkKS4KZXhlY3V0aW9uIDo9ICJnbm8ubGFuZC9yL2dub3N3YXAvZ292L2dvdmVybmFuY2UqRVhFKlJlY29uZmlndXJlKkVYRSo4NjQwMCw2MDQ4MDAsODY0MDAsNTAsMTAwMDAwMDAwMCw4NjQwMCwyNTkyMDAwIgpQcm9wb3NlUGFyYW1ldGVyQ2hhbmdlKGNyb3NzKGN1ciksICJVcGRhdGUgY29uZmlnIiwgIlJhdGlvbmFsZSIsIDEsIGV4ZWN1dGlvbikKCi8vIFZvdGU7IHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGFwcGxpZWQgd2VpZ2h0IGZvcm1hdHRlZCBhcyBhIGRlY2ltYWwgc3RyaW5nLgp2b3RlV2VpZ2h0IDo9IFZvdGUoY3Jvc3MoY3VyKSwgcHJvcG9zYWxJZCwgdHJ1ZSkgLy8gWUVTCgovLyBFeGVjdXRlIGFmdGVyIHRoZSBjb25maWd1cmVkIHRpbWVsb2NrIGFuZCB0aGVuLCBpZiBuZWVkZWQsIHN0YXJ0IHVuZGVsZWdhdGlvbi4KRXhlY3V0ZShjcm9zcyhjdXIpLCBwcm9wb3NhbElkKQpVbmRlbGVnYXRlKGNyb3NzKGN1ciksIGRlbGVnYXRlZSwgMjUwXzAwMF8wMDApCgovLyBDb2xsZWN0IG9ubHkgYWZ0ZXIgdGhlIGNvbmZpZ3VyZWQgdW5kZWxlZ2F0aW9uIGxvY2t1cCBoYXMgZXhwaXJlZC4KQ29sbGVjdFVuZGVsZWdhdGVkR25zKGNyb3NzKGN1cikpCmBgYAoKIyMgU2VjdXJpdHkKCi0gVGltZXN0YW1wLWJhc2VkIHNtb290aGluZyByZWR1Y2VzIGZsYXNoLWxvYW4tc3R5bGUgdm90aW5nIG1hbmlwdWxhdGlvbjsgaXQgaXMgbm90IGEgYmxvY2sgc25hcHNob3QuCi0gU3liaWwgcmVzaXN0YW5jZSBjb21lcyBmcm9tIHN0YWtlLXdlaWdodGVkIGRlbGVnYXRpb24uCi0gVGhlIGV4ZWN1dGlvbiBkZWxheSBhbmQgd2luZG93IGNvbnN0cmFpbiB3aGVuIGFwcHJvdmVkIGV4ZWN1dGFibGUgcHJvcG9zYWxzIGNhbiBydW4uCi0gQSBzaW5nbGUgYWN0aXZlIHByb3Bvc2FsIGlzIGFsbG93ZWQgcGVyIHByb3Bvc2VyIGFkZHJlc3MuCi0gUXVvcnVtIGlzIGZpeGVkIGZyb20gdGhlIGNyZWF0aW9uLXRpbWUgdG90YWwgeEdOUyBzdXBwbHksIGluY2x1ZGluZyBsYXVuY2hwYWQtaGVsZCBpc3N1YW5jZS4KLSBDb21tdW5pdHktcG9vbCBiYWxhbmNlIGlzIGNoZWNrZWQgd2hlbiB0aGUgYXBwcm92ZWQgdHJhbnNmZXIgZXhlY3V0ZXMsIG5vdCB3aGVuIHRoZSBwcm9wb3NhbCBpcyBjcmVhdGVkLgoasgwKDGFjY2Vzc29yLmdubxKhDHBhY2thZ2UgZ292ZXJuYW5jZQoKaW1wb3J0ICgKCSJnbm8ubGFuZC9yL2dub3N3YXAvZ292L3N0YWtlciIKKQoKdHlwZSBnb3ZTdGFrZXJBY2Nlc3NvciBzdHJ1Y3R7fQoKLy8gR2V0VG90YWxEZWxlZ2F0aW9uQW1vdW50QXRTbmFwc2hvdCBmb3J3YXJkcyBhbiBhZ2dyZWdhdGUgZGVsZWdhdGlvbi1oaXN0b3J5IGxvb2t1cC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHNuYXBzaG90VGltZTogVW5peCB0aW1lc3RhbXAgYXQgb3IgYmVmb3JlIHdoaWNoIHRvIHNlbGVjdCB0aGUgbGF0ZXN0IHRvdGFsLWRlbGVnYXRpb24gZW50cnkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogYWdncmVnYXRlIGRlbGVnYXRlZCBhbW91bnQgYXQgb3IgYmVmb3JlIHNuYXBzaG90VGltZS4KLy8gICAtIGJvb2w6IHRydWUgd2hlbiBhIHF1YWxpZnlpbmcgaGlzdG9yeSBlbnRyeSBleGlzdHM7IGZhbHNlIG90aGVyd2lzZS4KZnVuYyAoZyAqZ292U3Rha2VyQWNjZXNzb3IpIEdldFRvdGFsRGVsZWdhdGlvbkFtb3VudEF0U25hcHNob3Qoc25hcHNob3RUaW1lIGludDY0KSAoaW50NjQsIGJvb2wpIHsKCXJldHVybiBzdGFrZXIuR2V0VG90YWxEZWxlZ2F0aW9uQW1vdW50QXRTbmFwc2hvdChzbmFwc2hvdFRpbWUpCn0KCi8vIEdldFVzZXJEZWxlZ2F0aW9uQW1vdW50QXRTbmFwc2hvdCBmb3J3YXJkcyBhIHVzZXIncyBkZWxlZ2F0aW9uLWhpc3RvcnkgbG9va3VwLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdXNlckFkZHI6IERlbGVnYXRvciBhZGRyZXNzIHdob3NlIGhpc3RvcmljYWwgYW1vdW50IGlzIHF1ZXJpZWQuCi8vICAgLSBzbmFwc2hvdFRpbWU6IFVuaXggdGltZXN0YW1wIGF0IG9yIGJlZm9yZSB3aGljaCB0byBzZWxlY3QgdGhlIGxhdGVzdCB1c2VyIGVudHJ5LgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IHVzZXIncyBkZWxlZ2F0ZWQgYW1vdW50IGF0IG9yIGJlZm9yZSBzbmFwc2hvdFRpbWUuCi8vICAgLSBib29sOiB0cnVlIHdoZW4gYSBxdWFsaWZ5aW5nIGhpc3RvcnkgZW50cnkgZXhpc3RzOyBmYWxzZSBvdGhlcndpc2UuCmZ1bmMgKGcgKmdvdlN0YWtlckFjY2Vzc29yKSBHZXRVc2VyRGVsZWdhdGlvbkFtb3VudEF0U25hcHNob3QodXNlckFkZHIgYWRkcmVzcywgc25hcHNob3RUaW1lIGludDY0KSAoaW50NjQsIGJvb2wpIHsKCXJldHVybiBzdGFrZXIuR2V0VXNlckRlbGVnYXRpb25BbW91bnRBdFNuYXBzaG90KHVzZXJBZGRyLCBzbmFwc2hvdFRpbWUpCn0KCi8vIEdldFRvdGFseEduc1N1cHBseSByZXR1cm5zIHRoZSB0b3RhbCB4R05TIHN1cHBseSByZXBvcnRlZCBieSB0aGUgc3Rha2VyIHJlYWxtLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IHRvdGFsIHhHTlMgc3VwcGx5LCBpbmNsdWRpbmcgbGF1bmNocGFkLWhlbGQgeEdOUy4KZnVuYyAoZyAqZ292U3Rha2VyQWNjZXNzb3IpIEdldFRvdGFseEduc1N1cHBseSgpIGludDY0IHsKCXJldHVybiBzdGFrZXIuR2V0VG90YWx4R25zU3VwcGx5KCkKfQoKZnVuYyBuZXdHb3ZTdGFrZXJBY2Nlc3NvcigpIEdvdlN0YWtlckFjY2Vzc29yIHsKCXJldHVybiAmZ292U3Rha2VyQWNjZXNzb3J7fQp9ChrfNQoKY29uZmlnLmdubxLQNXBhY2thZ2UgZ292ZXJuYW5jZQoKaW1wb3J0ICgKCSJlcnJvcnMiCgoJYnB0cmVlICJnbm8ubGFuZC9wL250L2JwdHJlZS92MCIKKQoKLy8gQ29uZmlnIHJlcHJlc2VudHMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGdvdmVybm9yIGNvbnRyYWN0LgovLyBBbGwgcGFyYW1ldGVycyBjYW4gYmUgbW9kaWZpZWQgdGhyb3VnaCBSZWNvbmZpZ3VyZSBieSBhZG1pbiBvciBnb3Zlcm5hbmNlLgp0eXBlIENvbmZpZyBzdHJ1Y3QgewoJLy8gVm90aW5nU3RhcnREZWxheSBpcyB0aGUgZGVsYXkgYmVmb3JlIHZvdGluZyBzdGFydHMgYWZ0ZXIgcHJvcG9zYWwgY3JlYXRpb24gKGluIHNlY29uZHMpCglWb3RpbmdTdGFydERlbGF5IGludDY0CgkvLyBWb3RpbmdQZXJpb2QgaXMgdGhlIGR1cmF0aW9uIGR1cmluZyB3aGljaCB2b3RlcyBhcmUgY29sbGVjdGVkIChpbiBzZWNvbmRzKQoJVm90aW5nUGVyaW9kIGludDY0CgkvLyBWb3RpbmdXZWlnaHRTbW9vdGhpbmdEdXJhdGlvbiBpcyB0aGUgcGVyaW9kIG92ZXIgd2hpY2ggdm90aW5nIHdlaWdodCBpcyBhdmVyYWdlZAoJLy8gZm9yIHByb3Bvc2FsIGNyZWF0aW9uIGFuZCBjYW5jZWxsYXRpb24gdGhyZXNob2xkIGNhbGN1bGF0aW9ucyAoaW4gc2Vjb25kcykuCglWb3RpbmdXZWlnaHRTbW9vdGhpbmdEdXJhdGlvbiBpbnQ2NAoJLy8gUXVvcnVtIGlzIHRoZSBwZXJjZW50YWdlIG9mIHRvdGFsIHhHTlMgc3VwcGx5IHJlcXVpcmVkIGZvciBwcm9wb3NhbCBhcHByb3ZhbC4KCS8vIFRvdGFsIHN1cHBseSBpbmNsdWRlcyB4R05TIGhlbGQgYnkgdGhlIGxhdW5jaHBhZC4KCVF1b3J1bSBpbnQ2NAoJLy8gUHJvcG9zYWxDcmVhdGlvblRocmVzaG9sZCBpcyB0aGUgbWluaW11bSB4R05TIGFtb3VudCByZXF1aXJlZCB0byBjcmVhdGUgYSBwcm9wb3NhbAoJUHJvcG9zYWxDcmVhdGlvblRocmVzaG9sZCBpbnQ2NAoJLy8gRXhlY3V0aW9uRGVsYXkgaXMgdGhlIHdhaXRpbmcgcGVyaW9kIGFmdGVyIHZvdGluZyBlbmRzIGJlZm9yZSBhIHByb3Bvc2FsIGNhbiBiZSBleGVjdXRlZCAoaW4gc2Vjb25kcykKCUV4ZWN1dGlvbkRlbGF5IGludDY0CgkvLyBFeGVjdXRpb25XaW5kb3cgaXMgdGhlIHRpbWUgd2luZG93IGR1cmluZyB3aGljaCBhbiBhcHByb3ZlZCBwcm9wb3NhbCBjYW4gYmUgZXhlY3V0ZWQgKGluIHNlY29uZHMpCglFeGVjdXRpb25XaW5kb3cgaW50NjQKfQoKLy8gSXNWYWxpZCByZXBvcnRzIHdoZXRoZXIgdGhlIGNvbmZpZ3VyYXRpb24ncyBkdXJhdGlvbnMsIHRocmVzaG9sZCwgcXVvcnVtLCBhbmQKLy8gY3VtdWxhdGl2ZSBzY2hlZHVsZSB2YWx1ZXMgc2F0aXNmeSB0aGUgZ292ZXJuYW5jZSB2YWxpZGF0aW9uIGNvbnN0cmFpbnRzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VycmVudFRpbWU6IGN1cnJlbnQgdGltZSB2YWx1ZSBpbmNsdWRlZCB3aGVuIGNoZWNraW5nIHRoYXQgdGhlIGN1bXVsYXRpdmUgc2NoZWR1bGUgZG9lcyBub3QgYmVjb21lIG5lZ2F0aXZlCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogbmlsIHdoZW4gYWxsIGZpZWxkcyBhbmQgY3VtdWxhdGl2ZSB2YWx1ZXMgYXJlIHZhbGlkOyBvdGhlcndpc2UgYW4gZXJyb3IgZGVzY3JpYmluZyB0aGUgZmlyc3QgaW52YWxpZCB2YWx1ZQpmdW5jIChjIENvbmZpZykgSXNWYWxpZChjdXJyZW50VGltZSBpbnQ2NCkgZXJyb3IgewoJaWYgYy5Wb3RpbmdTdGFydERlbGF5IDwgMCB7CgkJcmV0dXJuIGVycm9ycy5OZXcoInZvdGluZ1N0YXJ0RGVsYXkgY2Fubm90IGJlIG5lZ2F0aXZlIikKCX0KCglpZiBjLlZvdGluZ1BlcmlvZCA8IDAgewoJCXJldHVybiBlcnJvcnMuTmV3KCJ2b3RpbmdQZXJpb2QgY2Fubm90IGJlIG5lZ2F0aXZlIikKCX0KCglpZiBjLkV4ZWN1dGlvbkRlbGF5IDwgMCB7CgkJcmV0dXJuIGVycm9ycy5OZXcoImV4ZWN1dGlvbkRlbGF5IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCgl9CgoJaWYgYy5FeGVjdXRpb25XaW5kb3cgPCAwIHsKCQlyZXR1cm4gZXJyb3JzLk5ldygiZXhlY3V0aW9uV2luZG93IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCgl9CgoJaWYgYy5Wb3RpbmdXZWlnaHRTbW9vdGhpbmdEdXJhdGlvbiA8IDAgewoJCXJldHVybiBlcnJvcnMuTmV3KCJ2b3RpbmdXZWlnaHRTbW9vdGhpbmdEdXJhdGlvbiBjYW5ub3QgYmUgbmVnYXRpdmUiKQoJfQoKCWlmIGMuUHJvcG9zYWxDcmVhdGlvblRocmVzaG9sZCA8IDAgewoJCXJldHVybiBlcnJvcnMuTmV3KCJwcm9wb3NhbENyZWF0aW9uVGhyZXNob2xkIGNhbm5vdCBiZSBuZWdhdGl2ZSIpCgl9CgoJaWYgYy5RdW9ydW0gPCAwIHx8IGMuUXVvcnVtID4gMTAwIHsKCQlyZXR1cm4gZXJyb3JzLk5ldygicXVvcnVtIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAiKQoJfQoKCXN1bSA6PSBpbnQ2NCgwKQoKCXN1bSArPSBjLlZvdGluZ1N0YXJ0RGVsYXkKCWlmIHN1bSA8IDAgewoJCXJldHVybiBlcnJvcnMuTmV3KCJ2b3RpbmdTdGFydERlbGF5IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCgl9CgoJc3VtICs9IGMuVm90aW5nUGVyaW9kCglpZiBzdW0gPCAwIHsKCQlyZXR1cm4gZXJyb3JzLk5ldygidm90aW5nUGVyaW9kIGNhbm5vdCBiZSBuZWdhdGl2ZSIpCgl9CgoJc3VtICs9IGMuRXhlY3V0aW9uRGVsYXkKCWlmIHN1bSA8IDAgewoJCXJldHVybiBlcnJvcnMuTmV3KCJleGVjdXRpb25EZWxheSBjYW5ub3QgYmUgbmVnYXRpdmUiKQoJfQoKCXN1bSArPSBjLkV4ZWN1dGlvbldpbmRvdwoJaWYgc3VtIDwgMCB7CgkJcmV0dXJuIGVycm9ycy5OZXcoImV4ZWN1dGlvbldpbmRvdyBjYW5ub3QgYmUgbmVnYXRpdmUiKQoJfQoKCXN1bSArPSBjdXJyZW50VGltZQoJaWYgc3VtIDwgMCB7CgkJcmV0dXJuIGVycm9ycy5OZXcoInRvdGFsIGRlbGF5IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCgl9CgoJcmV0dXJuIG5pbAp9CgovLyBOZXdDb25maWcgY29uc3RydWN0cyBhIGdvdmVybmFuY2UgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBzdXBwbGllZCBkZWxheXMsCi8vIHRocmVzaG9sZHMsIHF1b3J1bSBwZXJjZW50YWdlLCBhbmQgZXhlY3V0aW9uIHdpbmRvdy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHZvdGluZ1N0YXJ0RGVsYXk6IGRlbGF5IGZyb20gcHJvcG9zYWwgY3JlYXRpb24gdW50aWwgdm90aW5nIG9wZW5zLCBpbiBzZWNvbmRzCi8vICAgLSB2b3RpbmdQZXJpb2Q6IGR1cmF0aW9uIGZvciB3aGljaCB2b3RpbmcgcmVtYWlucyBvcGVuLCBpbiBzZWNvbmRzCi8vICAgLSB2b3RpbmdXZWlnaHRTbW9vdGhpbmdEdXJhdGlvbjogaW50ZXJ2YWwgdXNlZCB0byBzbW9vdGggZGVsZWdhdGlvbiB3ZWlnaHQsIGluIHNlY29uZHMKLy8gICAtIHF1b3J1bTogcmVxdWlyZWQgYXBwcm92YWwgcGVyY2VudGFnZSBvZiB0b3RhbCB4R05TIHN1cHBseSwgZnJvbSAwIHRocm91Z2ggMTAwCi8vICAgLSBwcm9wb3NhbENyZWF0aW9uVGhyZXNob2xkOiBtaW5pbXVtIHhHTlMgYW1vdW50IHJlcXVpcmVkIHRvIGNyZWF0ZSBhIHByb3Bvc2FsCi8vICAgLSBleGVjdXRpb25EZWxheTogZGVsYXkgYWZ0ZXIgdm90aW5nIGVuZHMgYmVmb3JlIGV4ZWN1dGlvbiwgaW4gc2Vjb25kcwovLyAgIC0gZXhlY3V0aW9uV2luZG93OiBkdXJhdGlvbiBhZnRlciB0aGUgZXhlY3V0aW9uIGRlbGF5IGR1cmluZyB3aGljaCBleGVjdXRpb24gaXMgYWxsb3dlZCwgaW4gc2Vjb25kcwovLwovLyBSZXR1cm5zOgovLyAgIC0gQ29uZmlnOiBjb25maWd1cmF0aW9uIHZhbHVlIHBvcHVsYXRlZCB3aXRoIHRoZSBzdXBwbGllZCBnb3Zlcm5hbmNlIHBhcmFtZXRlcnMKZnVuYyBOZXdDb25maWcoCgl2b3RpbmdTdGFydERlbGF5LAoJdm90aW5nUGVyaW9kLAoJdm90aW5nV2VpZ2h0U21vb3RoaW5nRHVyYXRpb24sCglxdW9ydW0sCglwcm9wb3NhbENyZWF0aW9uVGhyZXNob2xkLAoJZXhlY3V0aW9uRGVsYXksCglleGVjdXRpb25XaW5kb3cgaW50NjQsCikgQ29uZmlnIHsKCXJldHVybiBDb25maWd7CgkJVm90aW5nU3RhcnREZWxheTogICAgICAgICAgICAgIHZvdGluZ1N0YXJ0RGVsYXksCgkJVm90aW5nUGVyaW9kOiAgICAgICAgICAgICAgICAgIHZvdGluZ1BlcmlvZCwKCQlWb3RpbmdXZWlnaHRTbW9vdGhpbmdEdXJhdGlvbjogdm90aW5nV2VpZ2h0U21vb3RoaW5nRHVyYXRpb24sCgkJUXVvcnVtOiAgICAgICAgICAgICAgICAgICAgICAgIHF1b3J1bSwKCQlQcm9wb3NhbENyZWF0aW9uVGhyZXNob2xkOiAgICAgcHJvcG9zYWxDcmVhdGlvblRocmVzaG9sZCwKCQlFeGVjdXRpb25EZWxheTogICAgICAgICAgICAgICAgZXhlY3V0aW9uRGVsYXksCgkJRXhlY3V0aW9uV2luZG93OiAgICAgICAgICAgICAgIGV4ZWN1dGlvbldpbmRvdywKCX0KfQoKLy8gTmV3Q29uZmlnUHRyIGNvbnN0cnVjdHMgYSBDb25maWcgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIGl0LiBUaGUgQ29uZmlnIGlzCi8vIGFsbG9jYXRlZCB3aXRoaW4gdGhlIGdvdmVybmFuY2UgZG9tYWluIHJlYWxtLCBzYXRpc2Z5aW5nIHJlYWxtIGFsbG9jYXRpb24KLy8gY2hlY2tzIGZvciBjYWxsZXJzIChzdWNoIGFzIHRlc3RzKSB0aGF0IHJlcXVpcmUgYSAqQ29uZmlnIHZhbHVlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdm90aW5nU3RhcnREZWxheTogZGVsYXkgZnJvbSBwcm9wb3NhbCBjcmVhdGlvbiB1bnRpbCB2b3Rpbmcgb3BlbnMsIGluIHNlY29uZHMKLy8gICAtIHZvdGluZ1BlcmlvZDogZHVyYXRpb24gZm9yIHdoaWNoIHZvdGluZyByZW1haW5zIG9wZW4sIGluIHNlY29uZHMKLy8gICAtIHZvdGluZ1dlaWdodFNtb290aGluZ0R1cmF0aW9uOiBpbnRlcnZhbCB1c2VkIHRvIHNtb290aCBkZWxlZ2F0aW9uIHdlaWdodCwgaW4gc2Vjb25kcwovLyAgIC0gcXVvcnVtOiByZXF1aXJlZCBhcHByb3ZhbCBwZXJjZW50YWdlIG9mIHRvdGFsIHhHTlMgc3VwcGx5LCBmcm9tIDAgdGhyb3VnaCAxMDAKLy8gICAtIHByb3Bvc2FsQ3JlYXRpb25UaHJlc2hvbGQ6IG1pbmltdW0geEdOUyBhbW91bnQgcmVxdWlyZWQgdG8gY3JlYXRlIGEgcHJvcG9zYWwKLy8gICAtIGV4ZWN1dGlvbkRlbGF5OiBkZWxheSBhZnRlciB2b3RpbmcgZW5kcyBiZWZvcmUgZXhlY3V0aW9uLCBpbiBzZWNvbmRzCi8vICAgLSBleGVjdXRpb25XaW5kb3c6IGR1cmF0aW9uIGFmdGVyIHRoZSBleGVjdXRpb24gZGVsYXkgZHVyaW5nIHdoaWNoIGV4ZWN1dGlvbiBpcyBhbGxvd2VkLCBpbiBzZWNvbmRzCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqQ29uZmlnOiBwb2ludGVyIHRvIGEgY29uZmlndXJhdGlvbiB2YWx1ZSBwb3B1bGF0ZWQgd2l0aCB0aGUgc3VwcGxpZWQgZ292ZXJuYW5jZSBwYXJhbWV0ZXJzCmZ1bmMgTmV3Q29uZmlnUHRyKAoJdm90aW5nU3RhcnREZWxheSwKCXZvdGluZ1BlcmlvZCwKCXZvdGluZ1dlaWdodFNtb290aGluZ0R1cmF0aW9uLAoJcXVvcnVtLAoJcHJvcG9zYWxDcmVhdGlvblRocmVzaG9sZCwKCWV4ZWN1dGlvbkRlbGF5LAoJZXhlY3V0aW9uV2luZG93IGludDY0LAopICpDb25maWcgewoJYyA6PSBOZXdDb25maWcoCgkJdm90aW5nU3RhcnREZWxheSwKCQl2b3RpbmdQZXJpb2QsCgkJdm90aW5nV2VpZ2h0U21vb3RoaW5nRHVyYXRpb24sCgkJcXVvcnVtLAoJCXByb3Bvc2FsQ3JlYXRpb25UaHJlc2hvbGQsCgkJZXhlY3V0aW9uRGVsYXksCgkJZXhlY3V0aW9uV2luZG93LAoJKQoJcmV0dXJuICZjCn0KCi8vIE5ld0RlZmF1bHRDb25maWcgcmV0dXJucyB0aGUgZ292ZXJuYW5jZSBjb25maWd1cmF0aW9uJ3MgYnVpbHQtaW4gZGVmYXVsdHM6Ci8vIG9uZSBkYXkgYmVmb3JlIHZvdGluZywgc2V2ZW4gZGF5cyBvZiB2b3RpbmcsIG9uZSBkYXkgb2Ygd2VpZ2h0IHNtb290aGluZywKLy8gNTAlIHF1b3J1bSwgYSAxLWJpbGxpb24teEdOUyBjcmVhdGlvbiB0aHJlc2hvbGQsIG9uZSBkYXkgZXhlY3V0aW9uIGRlbGF5LAovLyBhbmQgYSAzMC1kYXkgZXhlY3V0aW9uIHdpbmRvdy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIENvbmZpZzogZGVmYXVsdCBnb3Zlcm5hbmNlIGNvbmZpZ3VyYXRpb24gdmFsdWUKZnVuYyBOZXdEZWZhdWx0Q29uZmlnKCkgQ29uZmlnIHsKCXJldHVybiBDb25maWd7CgkJVm90aW5nU3RhcnREZWxheTogICAgICAgICAgICAgIDg2NDAwLCAgICAgICAgIC8vIDEgZGF5IC0gZGVsYXkgYmVmb3JlIHZvdGluZyBzdGFydHMKCQlWb3RpbmdQZXJpb2Q6ICAgICAgICAgICAgICAgICAgNjA0ODAwLCAgICAgICAgLy8gNyBkYXlzIC0gZHVyYXRpb24gZm9yIGNvbGxlY3Rpbmcgdm90ZXMKCQlWb3RpbmdXZWlnaHRTbW9vdGhpbmdEdXJhdGlvbjogODY0MDAsICAgICAgICAgLy8gMSBkYXkgLSBwZXJpb2QgZm9yIGF2ZXJhZ2luZyB2b3Rpbmcgd2VpZ2h0CgkJUXVvcnVtOiAgICAgICAgICAgICAgICAgICAgICAgIDUwLCAgICAgICAgICAgIC8vIDUwJSBvZiB0b3RhbCB4R05TIHN1cHBseSByZXF1aXJlZAoJCVByb3Bvc2FsQ3JlYXRpb25UaHJlc2hvbGQ6ICAgICAxXzAwMF8wMDBfMDAwLCAvLyAxIGJpbGxpb24geEdOUyAtIG1pbmltdW0gYW1vdW50IHRvIGNyZWF0ZSBwcm9wb3NhbHMKCQlFeGVjdXRpb25EZWxheTogICAgICAgICAgICAgICAgODY0MDAsICAgICAgICAgLy8gMSBkYXkgLSB3YWl0aW5nIHBlcmlvZCBiZWZvcmUgZXhlY3V0aW9uCgkJRXhlY3V0aW9uV2luZG93OiAgICAgICAgICAgICAgIDI1OTIwMDAsICAgICAgIC8vIDMwIGRheXMgLSB3aW5kb3cgZm9yIGV4ZWN1dGluZyBwcm9wb3NhbHMKCX0KfQoKLy8gTmV3Q29uZmlnVHJlZSBjcmVhdGVzIGFuIGVtcHR5IEJQVHJlZSB1c2VkIHRvIGluZGV4IGNvbmZpZ3VyYXRpb24gdmFsdWVzIGJ5Ci8vIHRoZWlyIGVuY29kZWQgaW50NjQgdmVyc2lvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpicHRyZWUuQlBUcmVlOiBlbXB0eSBjb25maWd1cmF0aW9uIGluZGV4IHRyZWUKZnVuYyBOZXdDb25maWdUcmVlKCkgKmJwdHJlZS5CUFRyZWUgewoJcmV0dXJuIGJwdHJlZS5OZXdCUFRyZWVOKDE2KQp9ChrXBgoLY291bnRlci5nbm8SxwZwYWNrYWdlIGdvdmVybmFuY2UKCi8vIENvdW50ZXIgbWFuYWdlcyB1bmlxdWUgaW5jcmVtZW50aW5nIElEcy4KdHlwZSBDb3VudGVyIHN0cnVjdCB7CglpZCBpbnQ2NAp9CgovLyBOZXdDb3VudGVyIGNyZWF0ZXMgYSBuZXcgQ291bnRlciB3aG9zZSBjdXJyZW50IElEIGlzIGluaXRpYWxpemVkIHRvIHplcm8uCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqQ291bnRlcjogY291bnRlciBpbml0aWFsaXplZCB3aXRoIGN1cnJlbnQgSUQgMApmdW5jIE5ld0NvdW50ZXIoKSAqQ291bnRlciB7CglyZXR1cm4gJkNvdW50ZXJ7CgkJaWQ6IDAsCgl9Cn0KCi8vIEdldCByZXR1cm5zIHRoZSBjb3VudGVyJ3MgY3VycmVudCBJRCB3aXRob3V0IGNoYW5naW5nIGl0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGN1cnJlbnRseSBzdG9yZWQgY291bnRlciBJRApmdW5jIChjICpDb3VudGVyKSBHZXQoKSBpbnQ2NCB7IHJldHVybiBjLmlkIH0KCi8vIFNldCByZXBsYWNlcyB0aGUgY291bnRlcidzIGN1cnJlbnQgSUQgd2l0aCBpZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGlkOiBuZXcgY3VycmVudCBJRCB0byBzdG9yZTsgdGhlIHZhbHVlIGlzIG5vdCBpbmNyZW1lbnRlZApmdW5jIChjICpDb3VudGVyKSBTZXQoaWQgaW50NjQpIHsgYy5pZCA9IGlkIH0KCi8vIE5leHQgaW5jcmVtZW50cyB0aGUgY291bnRlciBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIElELgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGluY3JlbWVudGVkIGNvdW50ZXIgSUQgYWZ0ZXIgdGhlIHVwZGF0ZQpmdW5jIChjICpDb3VudGVyKSBOZXh0KCkgaW50NjQgewoJYy5pZCsrCglyZXR1cm4gYy5pZAp9ChreAgoHZG9jLmdubxLSAi8vIFBhY2thZ2UgZ292ZXJuYW5jZSBpbXBsZW1lbnRzIHByb3Bvc2FsIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCB2b3RpbmcuCi8vIEl0IHN1cHBvcnRzIHRleHQgcHJvcG9zYWxzLCBwYXJhbWV0ZXIgY2hhbmdlcywgYW5kIGNvbW11bml0eS1wb29sIHNwZW5kaW5nLgovLyBWb3RpbmcgdXNlcyB0aW1lc3RhbXBlZCBkZWxlZ2F0aW9uIGhpc3RvcnkgYW5kIHF1b3J1bSBmcm9tIHRvdGFsIHhHTlMgc3VwcGx5Ci8vIChpbmNsdWRpbmcgbGF1bmNocGFkLWhlbGQgeEdOUyk7IHByb3Bvc2FsIHRpbWluZyBhbmQgdGhyZXNob2xkcyBhcmUgY29uZmlndXJhYmxlLgpwYWNrYWdlIGdvdmVybmFuY2UKGrZqCgtnZXR0ZXJzLmdubxKmanBhY2thZ2UgZ292ZXJuYW5jZQoKaW1wb3J0ICgKCXJvdHJlZSAiZ25vLmxhbmQvcC9udC9icHRyZWUvcm90cmVlL3YwIgopCgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIFN0b3JlIERhdGEgR2V0dGVycwovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLyBHZXRMYXRlc3RDb25maWdWZXJzaW9uIHJldHVybnMgdGhlIGN1cnJlbnQgZ292ZXJuYW5jZSBjb25maWd1cmF0aW9uIHZlcnNpb24uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogbGF0ZXN0IGNvbmZpZ3VyYXRpb24gdmVyc2lvbiBzdG9yZWQgYnkgZ292ZXJuYW5jZQpmdW5jIEdldExhdGVzdENvbmZpZ1ZlcnNpb24oKSBpbnQ2NCB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRMYXRlc3RDb25maWdWZXJzaW9uKCkKfQoKLy8gR2V0Q3VycmVudFByb3Bvc2FsSUQgcmV0dXJucyB0aGUgY3VycmVudCBwcm9wb3NhbCBJRCBjb3VudGVyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGN1cnJlbnQgcHJvcG9zYWwgSUQgY291bnRlciB1c2VkIGZvciBuZXdseSBjcmVhdGVkIHByb3Bvc2FscwpmdW5jIEdldEN1cnJlbnRQcm9wb3NhbElEKCkgaW50NjQgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0Q3VycmVudFByb3Bvc2FsSUQoKQp9CgovLyBHZXRNYXhTbW9vdGhpbmdQZXJpb2QgcmV0dXJucyB0aGUgbWF4aW11bSBzbW9vdGhpbmcgcGVyaW9kIGZvciBkZWxlZ2F0aW9uIGhpc3RvcnkgY2xlYW51cC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBtYXhpbXVtIHBlcm1pdHRlZCBzbW9vdGhpbmcgcGVyaW9kIGluIHNlY29uZHMKZnVuYyBHZXRNYXhTbW9vdGhpbmdQZXJpb2QoKSBpbnQ2NCB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRNYXhTbW9vdGhpbmdQZXJpb2QoKQp9CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIENvbmZpZyBHZXR0ZXJzCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vIEdldExhdGVzdENvbmZpZyByZXR1cm5zIHRoZSBsYXRlc3QgZ292ZXJuYW5jZSBjb25maWd1cmF0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gQ29uZmlnOiBsYXRlc3Qgc3RvcmVkIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjdXJyZW50IHZlcnNpb24KLy8gICAtIGVycm9yOiBuaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGlzIG1pc3NpbmcKZnVuYyBHZXRMYXRlc3RDb25maWcoKSAoQ29uZmlnLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0TGF0ZXN0Q29uZmlnKCkKfQoKLy8gR2V0Q29uZmlnIHJldHVybnMgYSBzcGVjaWZpYyBnb3Zlcm5hbmNlIGNvbmZpZ3VyYXRpb24gYnkgdmVyc2lvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGNvbmZpZ1ZlcnNpb246IGNvbmZpZ3VyYXRpb24gdmVyc2lvbiB0byByZXRyaWV2ZQovLwovLyBSZXR1cm5zOgovLyAgIC0gQ29uZmlnOiBjb25maWd1cmF0aW9uIHN0b3JlZCB1bmRlciBjb25maWdWZXJzaW9uCi8vICAgLSBlcnJvcjogbmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gY29uZmlnVmVyc2lvbiBpcyBub3QgZm91bmQKZnVuYyBHZXRDb25maWcoY29uZmlnVmVyc2lvbiBpbnQ2NCkgKENvbmZpZywgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldENvbmZpZyhjb25maWdWZXJzaW9uKQp9CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIFByb3Bvc2FsIEdldHRlcnMKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy8gR2V0UHJvcG9zYWxzIHJldHVybnMgYSByZWFkLW9ubHkgdmlldyBvZiBldmVyeSBwcm9wb3NhbCwga2V5ZWQgYnkgdGhlIGRlY2ltYWwKLy8gc3RyaW5nIGZvcm0gb2YgdGhlIHByb3Bvc2FsIElELiBDYWxsZXJzIHBhZ2luYXRlIGl0IHRoZW1zZWx2ZXMgdGhyb3VnaAovLyBJdGVyYXRlQnlPZmZzZXQuIFJlYWRpbmcgYW4gZW50cnkgeWllbGRzIGEgY2xvbmUsIHNvIHRoZSB2aWV3IGNhbm5vdCBtdXRhdGUKLy8gcmVhbG0gc3RhdGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqcm90cmVlLlJlYWRPbmx5VHJlZTogcmVhZC1vbmx5IHByb3Bvc2FsIHRyZWUga2V5ZWQgYnkgZGVjaW1hbCBwcm9wb3NhbCBJRApmdW5jIEdldFByb3Bvc2FscygpICpyb3RyZWUuUmVhZE9ubHlUcmVlIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFByb3Bvc2FscygpCn0KCi8vIEV4aXN0c1Byb3Bvc2FsIGNoZWNrcyB3aGV0aGVyIGEgcHJvcG9zYWwgaXMgc3RvcmVkLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvcG9zYWxJRDogcHJvcG9zYWwgaWRlbnRpZmllciB0byBsb29rIHVwCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIHdoZW4gcHJvcG9zYWxJRCBpcyBzdG9yZWQsIG90aGVyd2lzZSBmYWxzZQpmdW5jIEV4aXN0c1Byb3Bvc2FsKHByb3Bvc2FsSUQgaW50NjQpIGJvb2wgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuRXhpc3RzUHJvcG9zYWwocHJvcG9zYWxJRCkKfQoKLy8gR2V0UHJvcG9zZXJCeVByb3Bvc2FsSWQgcmV0dXJucyB0aGUgcHJvcG9zZXIgYWRkcmVzcyBvZiBhIHByb3Bvc2FsLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvcG9zYWxJZDogcHJvcG9zYWwgaWRlbnRpZmllciB0byBsb29rIHVwCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhZGRyZXNzOiBhZGRyZXNzIHRoYXQgc3VibWl0dGVkIHRoZSBwcm9wb3NhbAovLyAgIC0gZXJyb3I6IG5pbCBvbiBzdWNjZXNzLCBvciBhbiBlcnJvciB3aGVuIHRoZSBwcm9wb3NhbCBkb2VzIG5vdCBleGlzdApmdW5jIEdldFByb3Bvc2VyQnlQcm9wb3NhbElkKHByb3Bvc2FsSWQgaW50NjQpIChhZGRyZXNzLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvcG9zZXJCeVByb3Bvc2FsSWQocHJvcG9zYWxJZCkKfQoKLy8gR2V0UHJvcG9zYWxUeXBlQnlQcm9wb3NhbElkIHJldHVybnMgdGhlIHR5cGUgb2YgYSBwcm9wb3NhbC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb3Bvc2FsSWQ6IHByb3Bvc2FsIGlkZW50aWZpZXIgdG8gbG9vayB1cAovLwovLyBSZXR1cm5zOgovLyAgIC0gUHJvcG9zYWxUeXBlOiB0eXBlIHJlY29yZGVkIGZvciB0aGUgcHJvcG9zYWwKLy8gICAtIGVycm9yOiBuaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgcHJvcG9zYWwgZG9lcyBub3QgZXhpc3QKZnVuYyBHZXRQcm9wb3NhbFR5cGVCeVByb3Bvc2FsSWQocHJvcG9zYWxJZCBpbnQ2NCkgKFByb3Bvc2FsVHlwZSwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFByb3Bvc2FsVHlwZUJ5UHJvcG9zYWxJZChwcm9wb3NhbElkKQp9CgovLyBHZXRZZWFCeVByb3Bvc2FsSWQgcmV0dXJucyB0aGUgeWVzIHZvdGUgd2VpZ2h0IG9mIGEgcHJvcG9zYWwuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9wb3NhbElkOiBwcm9wb3NhbCBpZGVudGlmaWVyIHRvIGluc3BlY3QKLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiB0b3RhbCB2b3Rpbmcgd2VpZ2h0IHJlY29yZGVkIGZvciB5ZXMgdm90ZXMKLy8gICAtIGVycm9yOiBuaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgcHJvcG9zYWwgZG9lcyBub3QgZXhpc3QKZnVuYyBHZXRZZWFCeVByb3Bvc2FsSWQocHJvcG9zYWxJZCBpbnQ2NCkgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0WWVhQnlQcm9wb3NhbElkKHByb3Bvc2FsSWQpCn0KCi8vIEdldE5heUJ5UHJvcG9zYWxJZCByZXR1cm5zIHRoZSBubyB2b3RlIHdlaWdodCBvZiBhIHByb3Bvc2FsLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvcG9zYWxJZDogcHJvcG9zYWwgaWRlbnRpZmllciB0byBpbnNwZWN0Ci8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogdG90YWwgdm90aW5nIHdlaWdodCByZWNvcmRlZCBmb3Igbm8gdm90ZXMKLy8gICAtIGVycm9yOiBuaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgcHJvcG9zYWwgZG9lcyBub3QgZXhpc3QKZnVuYyBHZXROYXlCeVByb3Bvc2FsSWQocHJvcG9zYWxJZCBpbnQ2NCkgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0TmF5QnlQcm9wb3NhbElkKHByb3Bvc2FsSWQpCn0KCi8vIEdldENvbmZpZ1ZlcnNpb25CeVByb3Bvc2FsSWQgcmV0dXJucyB0aGUgY29uZmlnIHZlcnNpb24gdXNlZCBieSBhIHByb3Bvc2FsLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvcG9zYWxJZDogcHJvcG9zYWwgaWRlbnRpZmllciB0byBpbnNwZWN0Ci8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogZ292ZXJuYW5jZSBjb25maWd1cmF0aW9uIHZlcnNpb24gY2FwdHVyZWQgYnkgdGhlIHByb3Bvc2FsCi8vICAgLSBlcnJvcjogbmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIHByb3Bvc2FsIGRvZXMgbm90IGV4aXN0CmZ1bmMgR2V0Q29uZmlnVmVyc2lvbkJ5UHJvcG9zYWxJZChwcm9wb3NhbElkIGludDY0KSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRDb25maWdWZXJzaW9uQnlQcm9wb3NhbElkKHByb3Bvc2FsSWQpCn0KCi8vIEdldFF1b3J1bUFtb3VudEJ5UHJvcG9zYWxJZCByZXR1cm5zIHRoZSBxdW9ydW0gcmVxdWlyZW1lbnQgZm9yIGEgcHJvcG9zYWwuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9wb3NhbElkOiBwcm9wb3NhbCBpZGVudGlmaWVyIHRvIGluc3BlY3QKLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBtaW5pbXVtIHZvdGluZyB3ZWlnaHQgcmVxdWlyZWQgZm9yIHRoZSBwcm9wb3NhbCdzIHF1b3J1bQovLyAgIC0gZXJyb3I6IG5pbCBvbiBzdWNjZXNzLCBvciBhbiBlcnJvciB3aGVuIHRoZSBwcm9wb3NhbCBkb2VzIG5vdCBleGlzdApmdW5jIEdldFF1b3J1bUFtb3VudEJ5UHJvcG9zYWxJZChwcm9wb3NhbElkIGludDY0KSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRRdW9ydW1BbW91bnRCeVByb3Bvc2FsSWQocHJvcG9zYWxJZCkKfQoKLy8gR2V0VGl0bGVCeVByb3Bvc2FsSWQgcmV0dXJucyB0aGUgdGl0bGUgb2YgYSBwcm9wb3NhbC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb3Bvc2FsSWQ6IHByb3Bvc2FsIGlkZW50aWZpZXIgdG8gaW5zcGVjdAovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RyaW5nOiBwcm9wb3NhbCB0aXRsZQovLyAgIC0gZXJyb3I6IG5pbCBvbiBzdWNjZXNzLCBvciBhbiBlcnJvciB3aGVuIHRoZSBwcm9wb3NhbCBkb2VzIG5vdCBleGlzdApmdW5jIEdldFRpdGxlQnlQcm9wb3NhbElkKHByb3Bvc2FsSWQgaW50NjQpIChzdHJpbmcsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRUaXRsZUJ5UHJvcG9zYWxJZChwcm9wb3NhbElkKQp9CgovLyBHZXREZXNjcmlwdGlvbkJ5UHJvcG9zYWxJZCByZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiBhIHByb3Bvc2FsLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvcG9zYWxJZDogcHJvcG9zYWwgaWRlbnRpZmllciB0byBpbnNwZWN0Ci8vCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6IHByb3Bvc2FsIGRlc2NyaXB0aW9uCi8vICAgLSBlcnJvcjogbmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIHByb3Bvc2FsIGRvZXMgbm90IGV4aXN0CmZ1bmMgR2V0RGVzY3JpcHRpb25CeVByb3Bvc2FsSWQocHJvcG9zYWxJZCBpbnQ2NCkgKHN0cmluZywgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldERlc2NyaXB0aW9uQnlQcm9wb3NhbElkKHByb3Bvc2FsSWQpCn0KCi8vIEdldFByb3Bvc2FsU3RhdHVzQnlQcm9wb3NhbElkIHJldHVybnMgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGEgcHJvcG9zYWwuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9wb3NhbElkOiBwcm9wb3NhbCBpZGVudGlmaWVyIHRvIGluc3BlY3QKLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogc3RhdHVzIGNvbXB1dGVkIGZyb20gdGhlIHByb3Bvc2FsIGFuZCB0aGUgY3VycmVudCBVbml4IHRpbWUKLy8gICAtIGVycm9yOiBuaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgcHJvcG9zYWwgZG9lcyBub3QgZXhpc3QKZnVuYyBHZXRQcm9wb3NhbFN0YXR1c0J5UHJvcG9zYWxJZChwcm9wb3NhbElkIGludDY0KSAoc3RyaW5nLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvcG9zYWxTdGF0dXNCeVByb3Bvc2FsSWQocHJvcG9zYWxJZCkKfQoKLy8gR2V0UHJvcG9zYWxDcmVhdGVkQXQgcmV0dXJucyB0aGUgY3JlYXRpb24gdGltZXN0YW1wIG9mIGEgcHJvcG9zYWwuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9wb3NhbElkOiBwcm9wb3NhbCBpZGVudGlmaWVyIHRvIGxvb2sgdXAKLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBVbml4IHRpbWVzdGFtcCBhdCB3aGljaCB0aGUgcHJvcG9zYWwgd2FzIGNyZWF0ZWQKLy8gICAtIGVycm9yOiBuaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgcHJvcG9zYWwgZG9lcyBub3QgZXhpc3QKZnVuYyBHZXRQcm9wb3NhbENyZWF0ZWRBdChwcm9wb3NhbElkIGludDY0KSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQcm9wb3NhbENyZWF0ZWRBdChwcm9wb3NhbElkKQp9CgovLyBHZXRQcm9wb3NhbENyZWF0ZWRIZWlnaHQgcmV0dXJucyB0aGUgY3JlYXRpb24gYmxvY2sgaGVpZ2h0IG9mIGEgcHJvcG9zYWwuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9wb3NhbElkOiBwcm9wb3NhbCBpZGVudGlmaWVyIHRvIGxvb2sgdXAKLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBibG9jayBoZWlnaHQgYXQgd2hpY2ggdGhlIHByb3Bvc2FsIHdhcyBjcmVhdGVkCi8vICAgLSBlcnJvcjogbmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIHByb3Bvc2FsIGRvZXMgbm90IGV4aXN0CmZ1bmMgR2V0UHJvcG9zYWxDcmVhdGVkSGVpZ2h0KHByb3Bvc2FsSWQgaW50NjQpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFByb3Bvc2FsQ3JlYXRlZEhlaWdodChwcm9wb3NhbElkKQp9CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIFZvdGUgR2V0dGVycwovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLyBHZXRWb3RlU3RhdHVzIHJldHVybnMgdGhlIHZvdGUgc3RhdHVzIG9mIGEgcHJvcG9zYWwuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9wb3NhbElkOiBwcm9wb3NhbCBpZGVudGlmaWVyIHRvIGluc3BlY3QKLy8KLy8gUmV0dXJuczoKLy8gICAtIHF1b3J1bTogbWluaW11bSB2b3RlIHdlaWdodCByZXF1aXJlZCBmb3IgdGhlIHByb3Bvc2FsIHRvIHBhc3MKLy8gICAtIG1heFZvdGluZ1dlaWdodDogbWF4aW11bSBwb3NzaWJsZSB2b3Rpbmcgd2VpZ2h0IHJlY29yZGVkIGZvciB0aGUgcHJvcG9zYWwKLy8gICAtIHllc1dlaWdodDogdG90YWwgd2VpZ2h0IG9mIHllcyB2b3RlcwovLyAgIC0gbm9XZWlnaHQ6IHRvdGFsIHdlaWdodCBvZiBubyB2b3RlcwovLyAgIC0gZXJyOiBuaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgcHJvcG9zYWwgZG9lcyBub3QgZXhpc3QKZnVuYyBHZXRWb3RlU3RhdHVzKHByb3Bvc2FsSWQgaW50NjQpIChxdW9ydW0sIG1heFZvdGluZ1dlaWdodCwgeWVzV2VpZ2h0LCBub1dlaWdodCBpbnQ2NCwgZXJyIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRWb3RlU3RhdHVzKHByb3Bvc2FsSWQpCn0KCi8vIEdldFZvdGluZ0luZm9zIHJldHVybnMgYSByZWFkLW9ubHkgdmlldyBvZiBhIHByb3Bvc2FsJ3MgdmFsdWUtYmFja2VkIHZvdGluZwovLyBpbmZvcywga2V5ZWQgYnkgdm90ZXIgYWRkcmVzcy4gRXhpc3RpbmcgcHJvcG9zYWxzIGhhdmUgYW4gZW1wdHkgdmlldyBiZWZvcmUKLy8gdGhlIGZpcnN0IHZvdGU7IG5pbCBpcyByZXR1cm5lZCBvbmx5IHdoZW4gdGhlIHN0b3JlZCB2b3RpbmctaW5mbyB0cmVlIGlzIGFic2VudC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb3Bvc2FsSUQ6IHByb3Bvc2FsIGlkZW50aWZpZXIgd2hvc2Ugdm90aW5nIGluZm9ybWF0aW9uIGlzIHJlcXVlc3RlZAovLwovLyBSZXR1cm5zOgovLyAgIC0gKnJvdHJlZS5SZWFkT25seVRyZWU6IHJlYWQtb25seSB2b3RpbmctaW5mbyB0cmVlIGtleWVkIGJ5IHZvdGVyIGFkZHJlc3MsIG9yIG5pbCB3aGVuIG5vIHRyZWUgaXMgc3RvcmVkCmZ1bmMgR2V0Vm90aW5nSW5mb3MocHJvcG9zYWxJRCBpbnQ2NCkgKnJvdHJlZS5SZWFkT25seVRyZWUgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0Vm90aW5nSW5mb3MocHJvcG9zYWxJRCkKfQoKLy8gRXhpc3RzVm90aW5nSW5mbyBjaGVja3Mgd2hldGhlciB2b3RpbmcgaW5mb3JtYXRpb24gZXhpc3RzIGZvciBhIHVzZXIgb24gYSBwcm9wb3NhbC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb3Bvc2FsSUQ6IHByb3Bvc2FsIGlkZW50aWZpZXIgdG8gaW5zcGVjdAovLyAgIC0gYWRkcjogdm90ZXIgYWRkcmVzcyB0byBsb29rIHVwIHdpdGhpbiBwcm9wb3NhbElECi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIHdoZW4gdm90aW5nIGluZm9ybWF0aW9uIGV4aXN0cyBmb3IgdGhlIHByb3Bvc2FsIGFuZCBhZGRyZXNzCmZ1bmMgRXhpc3RzVm90aW5nSW5mbyhwcm9wb3NhbElEIGludDY0LCBhZGRyIGFkZHJlc3MpIGJvb2wgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuRXhpc3RzVm90aW5nSW5mbyhwcm9wb3NhbElELCBhZGRyKQp9CgovLyBHZXRWb3RlV2VpZ2h0IHJldHVybnMgdGhlIHZvdGluZyB3ZWlnaHQgb2YgYW4gYWRkcmVzcyBmb3IgYSBwcm9wb3NhbC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb3Bvc2FsSUQ6IHByb3Bvc2FsIGlkZW50aWZpZXIgdG8gaW5zcGVjdAovLyAgIC0gYWRkcjogdm90ZXIgYWRkcmVzcyB3aG9zZSByZWNvcmRlZCB2b3RlIHdlaWdodCBpcyByZXF1ZXN0ZWQKLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiB3ZWlnaHQgcmVjb3JkZWQgZm9yIGFkZHIncyB2b3RlCi8vICAgLSBlcnJvcjogbmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gbm8gdm90aW5nIGluZm9ybWF0aW9uIGV4aXN0cyBmb3IgdGhlIHByb3Bvc2FsIGFuZCBhZGRyZXNzCmZ1bmMgR2V0Vm90ZVdlaWdodChwcm9wb3NhbElEIGludDY0LCBhZGRyIGFkZHJlc3MpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFZvdGVXZWlnaHQocHJvcG9zYWxJRCwgYWRkcikKfQoKLy8gR2V0Vm90ZWRIZWlnaHQgcmV0dXJucyB0aGUgYmxvY2sgaGVpZ2h0IHdoZW4gYW4gYWRkcmVzcyB2b3RlZCBvbiBhIHByb3Bvc2FsLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvcG9zYWxJRDogcHJvcG9zYWwgaWRlbnRpZmllciB0byBpbnNwZWN0Ci8vICAgLSBhZGRyOiB2b3RlciBhZGRyZXNzIHdob3NlIHZvdGUgaGVpZ2h0IGlzIHJlcXVlc3RlZAovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGJsb2NrIGhlaWdodCByZWNvcmRlZCBmb3IgYWRkcidzIHZvdGUKLy8gICAtIGVycm9yOiBuaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiBubyB2b3RpbmcgaW5mb3JtYXRpb24gZXhpc3RzIGZvciB0aGUgcHJvcG9zYWwgYW5kIGFkZHJlc3MKZnVuYyBHZXRWb3RlZEhlaWdodChwcm9wb3NhbElEIGludDY0LCBhZGRyIGFkZHJlc3MpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFZvdGVkSGVpZ2h0KHByb3Bvc2FsSUQsIGFkZHIpCn0KCi8vIEdldFZvdGVkQXQgcmV0dXJucyB0aGUgdGltZXN0YW1wIHdoZW4gYW4gYWRkcmVzcyB2b3RlZCBvbiBhIHByb3Bvc2FsLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvcG9zYWxJRDogcHJvcG9zYWwgaWRlbnRpZmllciB0byBpbnNwZWN0Ci8vICAgLSBhZGRyOiB2b3RlciBhZGRyZXNzIHdob3NlIHZvdGUgdGltZXN0YW1wIGlzIHJlcXVlc3RlZAovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IFVuaXggdGltZXN0YW1wIHJlY29yZGVkIGZvciBhZGRyJ3Mgdm90ZQovLyAgIC0gZXJyb3I6IG5pbCBvbiBzdWNjZXNzLCBvciBhbiBlcnJvciB3aGVuIG5vIHZvdGluZyBpbmZvcm1hdGlvbiBleGlzdHMgZm9yIHRoZSBwcm9wb3NhbCBhbmQgYWRkcmVzcwpmdW5jIEdldFZvdGVkQXQocHJvcG9zYWxJRCBpbnQ2NCwgYWRkciBhZGRyZXNzKSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRWb3RlZEF0KHByb3Bvc2FsSUQsIGFkZHIpCn0KCi8vIEdldFByb3Bvc2FsQ29tbXVuaXR5UG9vbFNwZW5kSW5mbyByZXR1cm5zIGEgY2xvbmVkIGNvcHkgb2YgdGhlIGNvbW11bml0eSBwb29sIHNwZW5kIGluZm8gZm9yIGEgcHJvcG9zYWwuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9wb3NhbElEOiBwcm9wb3NhbCBpZGVudGlmaWVyIHRvIGluc3BlY3QKLy8KLy8gUmV0dXJuczoKLy8gICAtICpDb21tdW5pdHlQb29sU3BlbmRJbmZvOiBjbG9uZWQgY29tbXVuaXR5LXBvb2wgc3BlbmQgZGV0YWlscywgb3IgbmlsIHdoZW4gYW4gZXJyb3Igb2NjdXJzCi8vICAgLSBlcnJvcjogbmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIHByb3Bvc2FsIGlzIG1pc3Npbmcgb3IgaGFzIG5vIHNwZW5kIGRhdGEKZnVuYyBHZXRQcm9wb3NhbENvbW11bml0eVBvb2xTcGVuZEluZm8ocHJvcG9zYWxJRCBpbnQ2NCkgKCpDb21tdW5pdHlQb29sU3BlbmRJbmZvLCBlcnJvcikgewoJaW5mbywgZXJyIDo9IGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvcG9zYWxDb21tdW5pdHlQb29sU3BlbmRJbmZvKHByb3Bvc2FsSUQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCglyZXR1cm4gaW5mby5DbG9uZSgpLCBuaWwKfQoKLy8gR2V0UHJvcG9zYWxFeGVjdXRpb25JbmZvIHJldHVybnMgYSBjbG9uZWQgY29weSBvZiB0aGUgZXhlY3V0aW9uIGluZm8gZm9yIGEgcHJvcG9zYWwuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9wb3NhbElEOiBwcm9wb3NhbCBpZGVudGlmaWVyIHRvIGluc3BlY3QKLy8KLy8gUmV0dXJuczoKLy8gICAtICpFeGVjdXRpb25JbmZvOiBjbG9uZWQgcGFyYW1ldGVyLWNoYW5nZSBleGVjdXRpb24gbWVzc2FnZXMgYW5kIGNvdW50LCBvciBuaWwgd2hlbiBhbiBlcnJvciBvY2N1cnMKLy8gICAtIGVycm9yOiBuaWwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3Igd2hlbiB0aGUgcHJvcG9zYWwgaXMgbWlzc2luZyBvciBoYXMgbm8gZXhlY3V0aW9uIGRhdGEKZnVuYyBHZXRQcm9wb3NhbEV4ZWN1dGlvbkluZm8ocHJvcG9zYWxJRCBpbnQ2NCkgKCpFeGVjdXRpb25JbmZvLCBlcnJvcikgewoJaW5mbywgZXJyIDo9IGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvcG9zYWxFeGVjdXRpb25JbmZvKHByb3Bvc2FsSUQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCglyZXR1cm4gaW5mby5DbG9uZSgpLCBuaWwKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBVc2VyIFByb3Bvc2FsIEdldHRlcnMKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy8gR2V0VXNlclByb3Bvc2FscyByZXR1cm5zIGEgcmVhZC1vbmx5IHZpZXcgb2YgdGhlIHByb3Bvc2FscyBjcmVhdGVkIHBlciB1c2VyLAovLyBrZXllZCBieSBjcmVhdG9yIGFkZHJlc3Mgd2l0aCB0aGUgY3JlYXRvcidzIHByb3Bvc2FsIElEcyBhcyB0aGUgdmFsdWUuCi8vIFJlYWRpbmcgYW4gZW50cnkgeWllbGRzIGEgY29weSBvZiB0aGUgSUQgc2xpY2UsIHNvIHRoZSB2aWV3IGNhbm5vdCBtdXRhdGUKLy8gcmVhbG0gc3RhdGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqcm90cmVlLlJlYWRPbmx5VHJlZTogcmVhZC1vbmx5IHVzZXItcHJvcG9zYWwgdHJlZSBrZXllZCBieSBjcmVhdG9yIGFkZHJlc3MKZnVuYyBHZXRVc2VyUHJvcG9zYWxzKCkgKnJvdHJlZS5SZWFkT25seVRyZWUgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0VXNlclByb3Bvc2FscygpCn0KCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gQWN0aXZlIFByb3Bvc2FsIFF1ZXJ5Ci8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vIEdldE9sZGVzdEFjdGl2ZVByb3Bvc2FsU25hcHNob3RUaW1lIHJldHVybnMgdGhlIG9sZGVzdCBhY3RpdmUgcHJvcG9zYWwncwovLyB0aW1lc3RhbXAgYW5jaG9yLiBBbiBlbXB0eSBpbmRleCByZXR1cm5zIG5vIGFjdGl2ZSBwcm9wb3NhbDsgYSBzdGFsZSBvcgovLyBtaXNzaW5nIGZpcnN0IGVudHJ5IHJldHVybnMgYW4gZXJyb3Igc28gY2xlYW51cCBjYW5ub3Qgc2lsZW50bHkgc2tpcCBpdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBzbmFwc2hvdCB0aW1lc3RhbXAgb2YgdGhlIG9sZGVzdCBhY3RpdmUgcHJvcG9zYWwsIG9yIHplcm8gd2hlbiB0aGUgaW5kZXggaXMgZW1wdHkgb3IgYW4gZXJyb3Igb2NjdXJzCi8vICAgLSBib29sOiB0cnVlIHdoZW4gYW4gYWN0aXZlIHByb3Bvc2FsIHdhcyBmb3VuZCBhdCB0aGUgb2xkZXN0IGluZGV4IGVudHJ5LCBvdGhlcndpc2UgZmFsc2UKLy8gICAtIGVycm9yOiBuaWwgZm9yIGFuIGVtcHR5IGluZGV4IG9yIGFjdGl2ZSBlbnRyeSwgb3IgYW4gZXJyb3Igd2hlbiB0aGUgZW50cnkgaXMgbWlzc2luZyBvciBpbmFjdGl2ZQpmdW5jIEdldE9sZGVzdEFjdGl2ZVByb3Bvc2FsU25hcHNob3RUaW1lKCkgKGludDY0LCBib29sLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0T2xkZXN0QWN0aXZlUHJvcG9zYWxTbmFwc2hvdFRpbWUoKQp9CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIFZvdGluZyB3ZWlnaHQgc25hcHNob3QgZ2V0dGVycwovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLyBHZXRDdXJyZW50Vm90aW5nV2VpZ2h0U25hcHNob3QgcmV0dXJucyB0aGUgY3VycmVudCB0b3RhbCB2b3Rpbmcgd2VpZ2h0IGFuZCBpdHMKLy8gdGltZXN0YW1wIGFuY2hvciBjb21wdXRlZCB3aXRoIHRoZSBjb25maWd1cmVkIHNtb290aGluZyBkdXJhdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiB0b3RhbCB2b3Rpbmcgd2VpZ2h0IGF2ZXJhZ2VkIG92ZXIgdGhlIGNvbmZpZ3VyZWQgc21vb3RoaW5nIHdpbmRvdwovLyAgIC0gaW50NjQ6IFVuaXggdGltZXN0YW1wIHVzZWQgYXMgdGhlIHNuYXBzaG90IGhpc3RvcnkgYW5jaG9yCi8vICAgLSBlcnJvcjogbmlsIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHdoZW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvciBzbmFwc2hvdCBkYXRhIGNhbm5vdCBiZSByZXRyaWV2ZWQKZnVuYyBHZXRDdXJyZW50Vm90aW5nV2VpZ2h0U25hcHNob3QoKSAoaW50NjQsIGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0Q3VycmVudFZvdGluZ1dlaWdodFNuYXBzaG90KCkKfQoaRwoLZ25vbW9kLnRvbWwSOG1vZHVsZSA9ICJnbm8ubGFuZC9yL2dub3N3YXAvZ292L2dvdmVybmFuY2UiCmdubyA9ICIwLjkiGvQ/Cgxwcm9wb3NhbC5nbm8S4z9wYWNrYWdlIGdvdmVybmFuY2UKCmltcG9ydCBicHRyZWUgImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgoKLy8gUHJvcG9zYWwgcmVwcmVzZW50cyBhIGdvdmVybmFuY2UgcHJvcG9zYWwgd2l0aCBhbGwgaXRzIGFzc29jaWF0ZWQgZGF0YSBhbmQgc3RhdGUuCi8vIFRoaXMgaXMgdGhlIGNvcmUgc3RydWN0dXJlIHRoYXQgdHJhY2tzIHByb3Bvc2FsIGxpZmVjeWNsZSBmcm9tIGNyZWF0aW9uIHRvIGV4ZWN1dGlvbi4KdHlwZSBQcm9wb3NhbCBzdHJ1Y3QgewoJaWQgICAgICAgICAgICBpbnQ2NCAgICAgICAgICAgICAvLyBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHByb3Bvc2FsCglwcm9wb3NlciAgICAgIGFkZHJlc3MgICAgICAgICAgIC8vIFRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wb3NlcgoJY29uZmlnVmVyc2lvbiBpbnQ2NCAgICAgICAgICAgICAvLyBUaGUgdmVyc2lvbiBvZiB0aGUgZ292ZXJuYW5jZSBjb25maWcgdXNlZAoJc3RhdHVzICAgICAgICAqUHJvcG9zYWxTdGF0dXMgICAvLyBDdXJyZW50IHN0YXR1cyBhbmQgdm90aW5nIGluZm9ybWF0aW9uCgltZXRhZGF0YSAgICAgICpQcm9wb3NhbE1ldGFkYXRhIC8vIFRpdGxlIGFuZCBkZXNjcmlwdGlvbgoJZGF0YSAgICAgICAgICAqUHJvcG9zYWxEYXRhICAgICAvLyBUeXBlLXNwZWNpZmljIHByb3Bvc2FsIGRhdGEKCXNuYXBzaG90VGltZSAgaW50NjQgICAgICAgICAgICAgLy8gVGltZXN0YW1wIGZvciB2b3Rpbmcgd2VpZ2h0IHNuYXBzaG90IGxvb2t1cAoJY3JlYXRlZEhlaWdodCBpbnQ2NCAgICAgICAgICAgICAvLyBCbG9jayBoZWlnaHQgYXQgY3JlYXRpb24KfQoKLy8gSUQgcmV0dXJucyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgYXNzaWduZWQgdG8gdGhlIHByb3Bvc2FsLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IHByb3Bvc2FsIGlkZW50aWZpZXIgdXNlZCBhcyBpdHMgc3RvcmFnZSBrZXkKZnVuYyAocCAqUHJvcG9zYWwpIElEKCkgaW50NjQgewoJcmV0dXJuIHAuaWQKfQoKLy8gVHlwZSByZXR1cm5zIHRoZSBwcm9wb3NhbCdzIHR5cGUgZGlzY3JpbWluYXRvciBmcm9tIGl0cyB0eXBlLXNwZWNpZmljIGRhdGEuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBQcm9wb3NhbFR5cGU6IHByb3Bvc2FsIGtpbmQsIHN1Y2ggYXMgdGV4dCwgY29tbXVuaXR5LXBvb2wgc3BlbmQsIG9yIHBhcmFtZXRlciBjaGFuZ2UKZnVuYyAocCAqUHJvcG9zYWwpIFR5cGUoKSBQcm9wb3NhbFR5cGUgewoJcmV0dXJuIHAuZGF0YS5Qcm9wb3NhbFR5cGUoKQp9CgovLyBUaXRsZSByZXR1cm5zIHRoZSBwcm9wb3NhbCB0aXRsZSBzdG9yZWQgaW4gaXRzIG1ldGFkYXRhLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RyaW5nOiBwcm9wb3NhbCB0aXRsZQpmdW5jIChwICpQcm9wb3NhbCkgVGl0bGUoKSBzdHJpbmcgewoJcmV0dXJuIHAubWV0YWRhdGEuVGl0bGUoKQp9CgovLyBEZXNjcmlwdGlvbiByZXR1cm5zIHRoZSBwcm9wb3NhbCBkZXNjcmlwdGlvbiBzdG9yZWQgaW4gaXRzIG1ldGFkYXRhLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RyaW5nOiBwcm9wb3NhbCBkZXNjcmlwdGlvbgpmdW5jIChwICpQcm9wb3NhbCkgRGVzY3JpcHRpb24oKSBzdHJpbmcgewoJcmV0dXJuIHAubWV0YWRhdGEuRGVzY3JpcHRpb24oKQp9CgovLyBQcm9wb3NlciByZXR1cm5zIHRoZSBhZGRyZXNzIHRoYXQgY3JlYXRlZCB0aGUgcHJvcG9zYWwuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhZGRyZXNzOiBwcm9wb3NhbCBjcmVhdG9yJ3MgYWRkcmVzcwpmdW5jIChwICpQcm9wb3NhbCkgUHJvcG9zZXIoKSBhZGRyZXNzIHsKCXJldHVybiBwLnByb3Bvc2VyCn0KCi8vIENyZWF0ZWRIZWlnaHQgcmV0dXJucyB0aGUgYmxvY2sgaGVpZ2h0IGF0IHdoaWNoIHRoZSBwcm9wb3NhbCB3YXMgY3JlYXRlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBwcm9wb3NhbCBjcmVhdGlvbiBibG9jayBoZWlnaHQKZnVuYyAocCAqUHJvcG9zYWwpIENyZWF0ZWRIZWlnaHQoKSBpbnQ2NCB7CglyZXR1cm4gcC5jcmVhdGVkSGVpZ2h0Cn0KCi8vIENyZWF0ZWRBdCByZXR1cm5zIHRoZSBwcm9wb3NhbCBjcmVhdGlvbiB0aW1lc3RhbXAgcmVjb3JkZWQgaW4gaXRzIHNjaGVkdWxlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IHByb3Bvc2FsIGNyZWF0aW9uIHRpbWVzdGFtcApmdW5jIChwICpQcm9wb3NhbCkgQ3JlYXRlZEF0KCkgaW50NjQgewoJcmV0dXJuIHAuc3RhdHVzLnNjaGVkdWxlLmNyZWF0ZVRpbWUKfQoKLy8gVm90aW5nWWVzV2VpZ2h0IHJldHVybnMgdGhlIHRvdGFsIHdlaWdodCByZWNvcmRlZCBmb3IgInllcyIgdm90ZXMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogY3VycmVudCAieWVzIiB2b3RlIHdlaWdodApmdW5jIChwICpQcm9wb3NhbCkgVm90aW5nWWVzV2VpZ2h0KCkgaW50NjQgewoJcmV0dXJuIHAuc3RhdHVzLnZvdGVTdGF0dXMueWVhCn0KCi8vIFZvdGluZ05vV2VpZ2h0IHJldHVybnMgdGhlIHRvdGFsIHdlaWdodCByZWNvcmRlZCBmb3IgIm5vIiB2b3Rlcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBjdXJyZW50ICJubyIgdm90ZSB3ZWlnaHQKZnVuYyAocCAqUHJvcG9zYWwpIFZvdGluZ05vV2VpZ2h0KCkgaW50NjQgewoJcmV0dXJuIHAuc3RhdHVzLnZvdGVTdGF0dXMubmF5Cn0KCi8vIFZvdGluZ1F1b3J1bUFtb3VudCByZXR1cm5zIHRoZSBtaW5pbXVtIHRvdGFsIHZvdGUgd2VpZ2h0IHJlcXVpcmVkIHRvIHBhc3MuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogcXVvcnVtIHZvdGUgd2VpZ2h0IHJlcXVpcmVkIGJ5IHRoaXMgcHJvcG9zYWwncyBjb25maWd1cmF0aW9uCmZ1bmMgKHAgKlByb3Bvc2FsKSBWb3RpbmdRdW9ydW1BbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gcC5zdGF0dXMudm90ZVN0YXR1cy5xdW9ydW1BbW91bnQKfQoKLy8gVm90aW5nTWF4V2VpZ2h0IHJldHVybnMgdGhlIG1heGltdW0gdm90aW5nIHdlaWdodCByZWNvcmRlZCBmb3IgdGhpcyBwcm9wb3NhbC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBtYXhpbXVtIHZvdGluZyB3ZWlnaHQgdXNlZCBmb3IgdGhlIHByb3Bvc2FsJ3MgcXVvcnVtIGNhbGN1bGF0aW9uCmZ1bmMgKHAgKlByb3Bvc2FsKSBWb3RpbmdNYXhXZWlnaHQoKSBpbnQ2NCB7CglyZXR1cm4gcC5zdGF0dXMudm90ZVN0YXR1cy5tYXhWb3RpbmdXZWlnaHQKfQoKLy8gQ29uZmlnVmVyc2lvbiByZXR1cm5zIHRoZSBnb3Zlcm5hbmNlIGNvbmZpZ3VyYXRpb24gdmVyc2lvbiB1c2VkIGJ5IHRoZSBwcm9wb3NhbC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBjb25maWd1cmF0aW9uIHZlcnNpb24gY2FwdHVyZWQgd2hlbiB0aGUgcHJvcG9zYWwgd2FzIGNyZWF0ZWQKZnVuYyAocCAqUHJvcG9zYWwpIENvbmZpZ1ZlcnNpb24oKSBpbnQ2NCB7CglyZXR1cm4gcC5jb25maWdWZXJzaW9uCn0KCi8vIFNuYXBzaG90VGltZSByZXR1cm5zIHRoZSB0aW1lc3RhbXAgdXNlZCB0byBsb29rIHVwIGhpc3RvcmljYWwgdm90aW5nIHdlaWdodC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiB2b3Rpbmctd2VpZ2h0IHNuYXBzaG90IHRpbWVzdGFtcApmdW5jIChwICpQcm9wb3NhbCkgU25hcHNob3RUaW1lKCkgaW50NjQgewoJcmV0dXJuIHAuc25hcHNob3RUaW1lCn0KCi8vIERhdGEgcmV0dXJucyB0aGUgcHJvcG9zYWwncyB0eXBlLXNwZWNpZmljIGRhdGEuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqUHJvcG9zYWxEYXRhOiB0eXBlLXNwZWNpZmljIHByb3Bvc2FsIGRhdGEgc3RvcmVkIG9uIHRoZSBwcm9wb3NhbApmdW5jIChwICpQcm9wb3NhbCkgRGF0YSgpICpQcm9wb3NhbERhdGEgewoJcmV0dXJuIHAuZGF0YQp9CgovLyBTdGF0dXMgcmV0dXJucyB0aGUgcHJvcG9zYWwncyBzY2hlZHVsZSwgdm90ZSwgYW5kIGFjdGlvbiBzdGF0dXMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqUHJvcG9zYWxTdGF0dXM6IG11dGFibGUgYWdncmVnYXRlIHN0YXR1cyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3Bvc2FsCmZ1bmMgKHAgKlByb3Bvc2FsKSBTdGF0dXMoKSAqUHJvcG9zYWxTdGF0dXMgewoJcmV0dXJuIHAuc3RhdHVzCn0KCi8vIE1ldGFkYXRhIHJldHVybnMgdGhlIHByb3Bvc2FsJ3MgdGl0bGUgYW5kIGRlc2NyaXB0aW9uIG1ldGFkYXRhLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKlByb3Bvc2FsTWV0YWRhdGE6IG1ldGFkYXRhIHN0b3JlZCBvbiB0aGUgcHJvcG9zYWwKZnVuYyAocCAqUHJvcG9zYWwpIE1ldGFkYXRhKCkgKlByb3Bvc2FsTWV0YWRhdGEgewoJcmV0dXJuIHAubWV0YWRhdGEKfQoKLy8gSXNUZXh0VHlwZSByZXBvcnRzIHdoZXRoZXIgdGhlIHByb3Bvc2FsIGlzIGEgdGV4dCBwcm9wb3NhbC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgd2hlbiB0aGUgcHJvcG9zYWwgdHlwZSBpcyBUZXh0CmZ1bmMgKHAgKlByb3Bvc2FsKSBJc1RleHRUeXBlKCkgYm9vbCB7CglyZXR1cm4gcC5UeXBlKCkgPT0gVGV4dAp9CgovLyBJc0NvbW11bml0eVBvb2xTcGVuZFR5cGUgcmVwb3J0cyB3aGV0aGVyIHRoZSBwcm9wb3NhbCBzcGVuZHMgY29tbXVuaXR5LXBvb2wgZnVuZHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIHdoZW4gdGhlIHByb3Bvc2FsIHR5cGUgaXMgQ29tbXVuaXR5UG9vbFNwZW5kCmZ1bmMgKHAgKlByb3Bvc2FsKSBJc0NvbW11bml0eVBvb2xTcGVuZFR5cGUoKSBib29sIHsKCXJldHVybiBwLlR5cGUoKSA9PSBDb21tdW5pdHlQb29sU3BlbmQKfQoKLy8gSXNQYXJhbWV0ZXJDaGFuZ2VUeXBlIHJlcG9ydHMgd2hldGhlciB0aGUgcHJvcG9zYWwgY2hhbmdlcyBnb3Zlcm5hbmNlIHBhcmFtZXRlcnMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIHdoZW4gdGhlIHByb3Bvc2FsIHR5cGUgaXMgUGFyYW1ldGVyQ2hhbmdlCmZ1bmMgKHAgKlByb3Bvc2FsKSBJc1BhcmFtZXRlckNoYW5nZVR5cGUoKSBib29sIHsKCXJldHVybiBwLlR5cGUoKSA9PSBQYXJhbWV0ZXJDaGFuZ2UKfQoKLy8gSXNQcm9wb3NlciByZXBvcnRzIHdoZXRoZXIgYWRkciBtYXRjaGVzIHRoZSBwcm9wb3NhbCdzIHByb3Bvc2VyIGFkZHJlc3MuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhZGRyOiBhZGRyZXNzIHRvIGNvbXBhcmUgd2l0aCB0aGUgcHJvcG9zYWwgcHJvcG9zZXIKLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgd2hlbiBhZGRyIGlzIHRoZSBwcm9wb3NhbCBwcm9wb3NlcgpmdW5jIChwICpQcm9wb3NhbCkgSXNQcm9wb3NlcihhZGRyIGFkZHJlc3MpIGJvb2wgewoJcmV0dXJuIHAucHJvcG9zZXIgPT0gYWRkcgp9CgovLyBOZXdQcm9wb3NhbCBjcmVhdGVzIGEgbmV3IHByb3Bvc2FsIGluc3RhbmNlIHdpdGggdGhlIHN1cHBsaWVkIGlkZW50aXR5LAovLyBsaWZlY3ljbGUsIG1ldGFkYXRhLCBhbmQgdHlwZS1zcGVjaWZpYyBkYXRhLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvcG9zYWxJRDogdW5pcXVlIGlkZW50aWZpZXIgYXNzaWduZWQgdG8gdGhlIHByb3Bvc2FsCi8vICAgLSBzdGF0dXM6IGluaXRpYWwgc2NoZWR1bGUsIGFjdGlvbiwgYW5kIHZvdGluZyBzdGF0dXMKLy8gICAtIG1ldGFkYXRhOiBwcm9wb3NhbCB0aXRsZSBhbmQgZGVzY3JpcHRpb24gbWV0YWRhdGEKLy8gICAtIGRhdGE6IHR5cGUtc3BlY2lmaWMgcHJvcG9zYWwgZGF0YQovLyAgIC0gcHJvcG9zZXJBZGRyZXNzOiBhZGRyZXNzIG9mIHRoZSBwcm9wb3NhbCBjcmVhdG9yCi8vICAgLSBjb25maWdWZXJzaW9uOiBnb3Zlcm5hbmNlIGNvbmZpZ3VyYXRpb24gdmVyc2lvbiBjYXB0dXJlZCBmb3IgdGhlIHByb3Bvc2FsCi8vICAgLSBzbmFwc2hvdFRpbWU6IHRpbWVzdGFtcCBhbmNob3IgZm9yIGhpc3RvcmljYWwgdm90aW5nLXdlaWdodCBsb29rdXAKLy8gICAtIGNyZWF0ZWRIZWlnaHQ6IGJsb2NrIGhlaWdodCBhdCB3aGljaCB0aGUgcHJvcG9zYWwgd2FzIGNyZWF0ZWQKLy8KLy8gUmV0dXJuczoKLy8gICAtICpQcm9wb3NhbDogbmV3bHkgaW5pdGlhbGl6ZWQgcHJvcG9zYWwgY29udGFpbmluZyB0aGUgc3VwcGxpZWQgZmllbGRzCmZ1bmMgTmV3UHJvcG9zYWwoCglwcm9wb3NhbElEIGludDY0LAoJc3RhdHVzICpQcm9wb3NhbFN0YXR1cywKCW1ldGFkYXRhICpQcm9wb3NhbE1ldGFkYXRhLAoJZGF0YSAqUHJvcG9zYWxEYXRhLAoJcHJvcG9zZXJBZGRyZXNzIGFkZHJlc3MsCgljb25maWdWZXJzaW9uIGludDY0LAoJc25hcHNob3RUaW1lIGludDY0LAoJY3JlYXRlZEhlaWdodCBpbnQ2NCwKKSAqUHJvcG9zYWwgewoJcmV0dXJuICZQcm9wb3NhbHsKCQlpZDogICAgICAgICAgICBwcm9wb3NhbElELAoJCXByb3Bvc2VyOiAgICAgIHByb3Bvc2VyQWRkcmVzcywKCQlzdGF0dXM6ICAgICAgICBzdGF0dXMsCgkJbWV0YWRhdGE6ICAgICAgbWV0YWRhdGEsCgkJZGF0YTogICAgICAgICAgZGF0YSwKCQljb25maWdWZXJzaW9uOiBjb25maWdWZXJzaW9uLAoJCXNuYXBzaG90VGltZTogIHNuYXBzaG90VGltZSwKCQljcmVhdGVkSGVpZ2h0OiBjcmVhdGVkSGVpZ2h0LAoJfQp9CgovLyBDbG9uZSByZXR1cm5zIGEgZGVlcCBjb3B5IG9mIHRoZSBwcm9wb3NhbCwgaW5jbHVkaW5nIGl0cyB0eXBlLXNwZWNpZmljIGRhdGEKLy8gYW5kIG5lc3RlZCBleGVjdXRpb24gbWVzc2FnZXMuCi8vCi8vIFRoZSByZXR1cm5lZCBwcm9wb3NhbCBhbmQgYWxsIG5lc3RlZCBzdGF0dXMsIG1ldGFkYXRhLCBkYXRhLCBhbmQgbWVzc2FnZQovLyB2YWx1ZXMgYXJlIGluZGVwZW5kZW50IGNvcGllczsgbXV0YXRpbmcgdGhlIGNsb25lIGRvZXMgbm90IG11dGF0ZSByZWFsbSBzdGF0ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpQcm9wb3NhbDogaW5kZXBlbmRlbnQgcHJvcG9zYWwgY29weSwgb3IgbmlsIHdoZW4gdGhlIHJlY2VpdmVyIGlzIG5pbApmdW5jIChwICpQcm9wb3NhbCkgQ2xvbmUoKSAqUHJvcG9zYWwgewoJaWYgcCA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCglyZXR1cm4gJlByb3Bvc2FsewoJCWlkOiAgICAgICAgICAgIHAuaWQsCgkJcHJvcG9zZXI6ICAgICAgcC5wcm9wb3NlciwKCQljb25maWdWZXJzaW9uOiBwLmNvbmZpZ1ZlcnNpb24sCgkJc3RhdHVzOiAgICAgICAgcC5zdGF0dXMuQ2xvbmUoKSwKCQltZXRhZGF0YTogICAgICBwLm1ldGFkYXRhLkNsb25lKCksCgkJZGF0YTogICAgICAgICAgcC5kYXRhLkNsb25lKCksCgkJc25hcHNob3RUaW1lOiAgcC5zbmFwc2hvdFRpbWUsCgkJY3JlYXRlZEhlaWdodDogcC5jcmVhdGVkSGVpZ2h0LAoJfQp9CgovLyBOZXdQcm9wb3NhbFRyZWUgY3JlYXRlcyBhbiBlbXB0eSBCKyB0cmVlIGZvciBwcm9wb3NhbHMga2V5ZWQgYnkgcHJvcG9zYWwgSUQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqYnB0cmVlLkJQVHJlZTogZW1wdHkgMTYtd2F5IHByb3Bvc2FsIHRyZWUKZnVuYyBOZXdQcm9wb3NhbFRyZWUoKSAqYnB0cmVlLkJQVHJlZSB7CglyZXR1cm4gYnB0cmVlLk5ld0JQVHJlZU4oMTYpCn0KCi8vIE5ld1VzZXJQcm9wb3NhbFRyZWUgY3JlYXRlcyBhbiBlbXB0eSBCKyB0cmVlIG1hcHBpbmcgdXNlcnMgdG8gcHJvcG9zYWwgSURzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKmJwdHJlZS5CUFRyZWU6IGVtcHR5IDE2LXdheSB1c2VyLXByb3Bvc2FsIGluZGV4IHRyZWUKZnVuYyBOZXdVc2VyUHJvcG9zYWxUcmVlKCkgKmJwdHJlZS5CUFRyZWUgewoJcmV0dXJuIGJwdHJlZS5OZXdCUFRyZWVOKDE2KQp9CgovLyBOZXdWb3RpbmdJbmZvVHJlZSBjcmVhdGVzIGFuIGVtcHR5IEIrIHRyZWUgZm9yIHBlci11c2VyIHZvdGluZyBpbmZvcm1hdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpicHRyZWUuQlBUcmVlOiBlbXB0eSAxNi13YXkgdm90aW5nLWluZm9ybWF0aW9uIHRyZWUKZnVuYyBOZXdWb3RpbmdJbmZvVHJlZSgpICpicHRyZWUuQlBUcmVlIHsKCXJldHVybiBicHRyZWUuTmV3QlBUcmVlTigxNikKfQoKLy8gTmV3UHJvcG9zYWxVc2VyVm90aW5nSW5mb1RyZWUgY3JlYXRlcyBhbiBlbXB0eSBCKyB0cmVlIG1hcHBpbmcgcHJvcG9zYWwgSURzCi8vIHRvIHRoZWlyIHBlci11c2VyIHZvdGluZy1pbmZvcm1hdGlvbiB0cmVlcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpicHRyZWUuQlBUcmVlOiBlbXB0eSAxNi13YXkgcHJvcG9zYWwgdm90aW5nLWluZm9ybWF0aW9uIGluZGV4IHRyZWUKZnVuYyBOZXdQcm9wb3NhbFVzZXJWb3RpbmdJbmZvVHJlZSgpICpicHRyZWUuQlBUcmVlIHsKCXJldHVybiBicHRyZWUuTmV3QlBUcmVlTigxNikKfQoanTcKGnByb3Bvc2FsX2FjdGlvbl9zdGF0dXMuZ25vEv42cGFja2FnZSBnb3Zlcm5hbmNlCgovLyBQcm9wb3NhbEFjdGlvblN0YXR1cyB0cmFja3MgdGhlIGV4ZWN1dGlvbiBhbmQgY2FuY2VsbGF0aW9uIHN0YXR1cyBvZiBhIHByb3Bvc2FsLgovLyBUaGlzIHN0cnVjdHVyZSBtYW5hZ2VzIHRoZSBhY3Rpb24tcmVsYXRlZCBzdGF0ZSBpbmNsdWRpbmcgd2hvIHBlcmZvcm1lZCBhY3Rpb25zIGFuZCB3aGVuLgp0eXBlIFByb3Bvc2FsQWN0aW9uU3RhdHVzIHN0cnVjdCB7CgljYW5jZWxlZCAgICAgICBib29sICAgIC8vIFdoZXRoZXIgdGhlIHByb3Bvc2FsIGhhcyBiZWVuIGNhbmNlbGVkCgljYW5jZWxlZEF0ICAgICBpbnQ2NCAgIC8vIFRpbWVzdGFtcCB3aGVuIHByb3Bvc2FsIHdhcyBjYW5jZWxlZAoJY2FuY2VsZWRIZWlnaHQgaW50NjQgICAvLyBCbG9jayBoZWlnaHQgd2hlbiBwcm9wb3NhbCB3YXMgY2FuY2VsZWQKCWNhbmNlbGVkQnkgICAgIGFkZHJlc3MgLy8gV2hvIGNhbmNlbGVkIHRoZSBwcm9wb3NhbAoKCWV4ZWN1dGVkICAgICAgIGJvb2wgICAgLy8gV2hldGhlciB0aGUgcHJvcG9zYWwgaGFzIGJlZW4gZXhlY3V0ZWQKCWV4ZWN1dGVkQXQgICAgIGludDY0ICAgLy8gVGltZXN0YW1wIHdoZW4gcHJvcG9zYWwgd2FzIGV4ZWN1dGVkCglleGVjdXRlZEhlaWdodCBpbnQ2NCAgIC8vIEJsb2NrIGhlaWdodCB3aGVuIHByb3Bvc2FsIHdhcyBleGVjdXRlZAoJZXhlY3V0ZWRCeSAgICAgYWRkcmVzcyAvLyBXaG8gZXhlY3V0ZWQgdGhlIHByb3Bvc2FsCgoJZXhlY3V0YWJsZSBib29sIC8vIFdoZXRoZXIgdGhpcyBwcm9wb3NhbCB0eXBlIHN1cHBvcnRzIGV4ZWN1dGlvbgp9CgovKiBHZXR0ZXIgbWV0aG9kcyAqLwovLyBDYW5jZWxlZCByZXBvcnRzIHdoZXRoZXIgdGhpcyBwcm9wb3NhbCBoYXMgYmVlbiBtYXJrZWQgY2FuY2VsZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIHdoZW4gY2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlY29yZGVkCmZ1bmMgKHAgKlByb3Bvc2FsQWN0aW9uU3RhdHVzKSBDYW5jZWxlZCgpIGJvb2wgeyByZXR1cm4gcC5jYW5jZWxlZCB9CgovLyBDYW5jZWxlZEF0IHJldHVybnMgdGhlIHRpbWVzdGFtcCByZWNvcmRlZCB3aGVuIHRoZSBwcm9wb3NhbCB3YXMgY2FuY2VsZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogY2FuY2VsbGF0aW9uIHRpbWVzdGFtcCwgb3IgemVybyB3aGVuIG5vbmUgaGFzIGJlZW4gcmVjb3JkZWQKZnVuYyAocCAqUHJvcG9zYWxBY3Rpb25TdGF0dXMpIENhbmNlbGVkQXQoKSBpbnQ2NCB7IHJldHVybiBwLmNhbmNlbGVkQXQgfQoKLy8gQ2FuY2VsZWRIZWlnaHQgcmV0dXJucyB0aGUgYmxvY2sgaGVpZ2h0IHJlY29yZGVkIHdoZW4gdGhlIHByb3Bvc2FsIHdhcyBjYW5jZWxlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBjYW5jZWxsYXRpb24gYmxvY2sgaGVpZ2h0LCBvciB6ZXJvIHdoZW4gbm9uZSBoYXMgYmVlbiByZWNvcmRlZApmdW5jIChwICpQcm9wb3NhbEFjdGlvblN0YXR1cykgQ2FuY2VsZWRIZWlnaHQoKSBpbnQ2NCB7IHJldHVybiBwLmNhbmNlbGVkSGVpZ2h0IH0KCi8vIEV4ZWN1dGVkIHJlcG9ydHMgd2hldGhlciB0aGlzIHByb3Bvc2FsIGhhcyBiZWVuIG1hcmtlZCBleGVjdXRlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgd2hlbiBleGVjdXRpb24gaGFzIGJlZW4gcmVjb3JkZWQKZnVuYyAocCAqUHJvcG9zYWxBY3Rpb25TdGF0dXMpIEV4ZWN1dGVkKCkgYm9vbCB7IHJldHVybiBwLmV4ZWN1dGVkIH0KCi8vIEV4ZWN1dGVkQXQgcmV0dXJucyB0aGUgdGltZXN0YW1wIHJlY29yZGVkIHdoZW4gdGhlIHByb3Bvc2FsIHdhcyBleGVjdXRlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBleGVjdXRpb24gdGltZXN0YW1wLCBvciB6ZXJvIHdoZW4gbm9uZSBoYXMgYmVlbiByZWNvcmRlZApmdW5jIChwICpQcm9wb3NhbEFjdGlvblN0YXR1cykgRXhlY3V0ZWRBdCgpIGludDY0IHsgcmV0dXJuIHAuZXhlY3V0ZWRBdCB9CgovLyBFeGVjdXRlZEhlaWdodCByZXR1cm5zIHRoZSBibG9jayBoZWlnaHQgcmVjb3JkZWQgd2hlbiB0aGUgcHJvcG9zYWwgd2FzIGV4ZWN1dGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGV4ZWN1dGlvbiBibG9jayBoZWlnaHQsIG9yIHplcm8gd2hlbiBub25lIGhhcyBiZWVuIHJlY29yZGVkCmZ1bmMgKHAgKlByb3Bvc2FsQWN0aW9uU3RhdHVzKSBFeGVjdXRlZEhlaWdodCgpIGludDY0IHsgcmV0dXJuIHAuZXhlY3V0ZWRIZWlnaHQgfQoKLy8gRXhlY3V0YWJsZSByZXBvcnRzIHdoZXRoZXIgdGhpcyBwcm9wb3NhbCB0eXBlIHN1cHBvcnRzIGV4ZWN1dGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgd2hlbiB0aGUgcHJvcG9zYWwncyBhY3Rpb24gY2FuIGJlIGV4ZWN1dGVkCmZ1bmMgKHAgKlByb3Bvc2FsQWN0aW9uU3RhdHVzKSBFeGVjdXRhYmxlKCkgYm9vbCB7IHJldHVybiBwLmV4ZWN1dGFibGUgfQoKLyogU2V0dGVyIG1ldGhvZHMgKi8KLy8gU2V0Q2FuY2VsZWQgcmVjb3JkcyB3aGV0aGVyIHRoZSBwcm9wb3NhbCBpcyBjYW5jZWxlZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGNhbmNlbGVkOiBjYW5jZWxsYXRpb24gc3RhdGUgdG8gc3RvcmUKZnVuYyAocCAqUHJvcG9zYWxBY3Rpb25TdGF0dXMpIFNldENhbmNlbGVkKGNhbmNlbGVkIGJvb2wpIHsKCXAuY2FuY2VsZWQgPSBjYW5jZWxlZAp9CgovLyBTZXRDYW5jZWxlZEF0IHJlY29yZHMgdGhlIHRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggcHJvcG9zYWwgY2FuY2VsbGF0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY2FuY2VsZWRBdDogY2FuY2VsbGF0aW9uIHRpbWVzdGFtcCB0byBzdG9yZQpmdW5jIChwICpQcm9wb3NhbEFjdGlvblN0YXR1cykgU2V0Q2FuY2VsZWRBdChjYW5jZWxlZEF0IGludDY0KSB7CglwLmNhbmNlbGVkQXQgPSBjYW5jZWxlZEF0Cn0KCi8vIFNldENhbmNlbGVkSGVpZ2h0IHJlY29yZHMgdGhlIGJsb2NrIGhlaWdodCBhc3NvY2lhdGVkIHdpdGggcHJvcG9zYWwgY2FuY2VsbGF0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY2FuY2VsZWRIZWlnaHQ6IGNhbmNlbGxhdGlvbiBibG9jayBoZWlnaHQgdG8gc3RvcmUKZnVuYyAocCAqUHJvcG9zYWxBY3Rpb25TdGF0dXMpIFNldENhbmNlbGVkSGVpZ2h0KGNhbmNlbGVkSGVpZ2h0IGludDY0KSB7CglwLmNhbmNlbGVkSGVpZ2h0ID0gY2FuY2VsZWRIZWlnaHQKfQoKLy8gU2V0Q2FuY2VsZWRCeSByZWNvcmRzIHRoZSBhZGRyZXNzIHRoYXQgY2FuY2VsZWQgdGhlIHByb3Bvc2FsLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY2FuY2VsZWRCeTogYWRkcmVzcyBvZiB0aGUgYWN0b3IgdGhhdCBjYW5jZWxlZCB0aGUgcHJvcG9zYWwKZnVuYyAocCAqUHJvcG9zYWxBY3Rpb25TdGF0dXMpIFNldENhbmNlbGVkQnkoY2FuY2VsZWRCeSBhZGRyZXNzKSB7CglwLmNhbmNlbGVkQnkgPSBjYW5jZWxlZEJ5Cn0KCi8vIFNldEV4ZWN1dGVkIHJlY29yZHMgd2hldGhlciB0aGUgcHJvcG9zYWwgaXMgZXhlY3V0ZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBleGVjdXRlZDogZXhlY3V0aW9uIHN0YXRlIHRvIHN0b3JlCmZ1bmMgKHAgKlByb3Bvc2FsQWN0aW9uU3RhdHVzKSBTZXRFeGVjdXRlZChleGVjdXRlZCBib29sKSB7CglwLmV4ZWN1dGVkID0gZXhlY3V0ZWQKfQoKLy8gU2V0RXhlY3V0ZWRBdCByZWNvcmRzIHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoIHByb3Bvc2FsIGV4ZWN1dGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGV4ZWN1dGVkQXQ6IGV4ZWN1dGlvbiB0aW1lc3RhbXAgdG8gc3RvcmUKZnVuYyAocCAqUHJvcG9zYWxBY3Rpb25TdGF0dXMpIFNldEV4ZWN1dGVkQXQoZXhlY3V0ZWRBdCBpbnQ2NCkgewoJcC5leGVjdXRlZEF0ID0gZXhlY3V0ZWRBdAp9CgovLyBTZXRFeGVjdXRlZEhlaWdodCByZWNvcmRzIHRoZSBibG9jayBoZWlnaHQgYXNzb2NpYXRlZCB3aXRoIHByb3Bvc2FsIGV4ZWN1dGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGV4ZWN1dGVkSGVpZ2h0OiBleGVjdXRpb24gYmxvY2sgaGVpZ2h0IHRvIHN0b3JlCmZ1bmMgKHAgKlByb3Bvc2FsQWN0aW9uU3RhdHVzKSBTZXRFeGVjdXRlZEhlaWdodChleGVjdXRlZEhlaWdodCBpbnQ2NCkgewoJcC5leGVjdXRlZEhlaWdodCA9IGV4ZWN1dGVkSGVpZ2h0Cn0KCi8vIFNldEV4ZWN1dGVkQnkgcmVjb3JkcyB0aGUgYWRkcmVzcyB0aGF0IGV4ZWN1dGVkIHRoZSBwcm9wb3NhbC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGV4ZWN1dGVkQnk6IGFkZHJlc3Mgb2YgdGhlIGFjdG9yIHRoYXQgZXhlY3V0ZWQgdGhlIHByb3Bvc2FsCmZ1bmMgKHAgKlByb3Bvc2FsQWN0aW9uU3RhdHVzKSBTZXRFeGVjdXRlZEJ5KGV4ZWN1dGVkQnkgYWRkcmVzcykgewoJcC5leGVjdXRlZEJ5ID0gZXhlY3V0ZWRCeQp9CgovLyBTZXRFeGVjdXRhYmxlIHJlY29yZHMgd2hldGhlciB0aGlzIHByb3Bvc2FsIHR5cGUgc3VwcG9ydHMgZXhlY3V0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZXhlY3V0YWJsZTogZXhlY3V0aW9uIGNhcGFiaWxpdHkgdG8gc3RvcmUgZm9yIHRoZSBwcm9wb3NhbCB0eXBlCmZ1bmMgKHAgKlByb3Bvc2FsQWN0aW9uU3RhdHVzKSBTZXRFeGVjdXRhYmxlKGV4ZWN1dGFibGUgYm9vbCkgewoJcC5leGVjdXRhYmxlID0gZXhlY3V0YWJsZQp9CgovLyBDYW5jZWxlZEJ5IHJldHVybnMgdGhlIGFkZHJlc3MgcmVjb3JkZWQgYXMgaGF2aW5nIGNhbmNlbGVkIHRoZSBwcm9wb3NhbC4KLy8gVGhlIHZhbHVlIGlzIG1lYW5pbmdmdWwgd2hlbiBDYW5jZWxlZCgpIGlzIHRydWU7IGJlZm9yZSB0aGVuIGl0IGlzIHRoZQovLyB6ZXJvIGFkZHJlc3MgdW5sZXNzIGEgY2FsbGVyIGhhcyBleHBsaWNpdGx5IHN0b3JlZCBhbm90aGVyIHZhbHVlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYWRkcmVzczogYWRkcmVzcyByZWNvcmRlZCBmb3IgdGhlIGNhbmNlbGxhdGlvbiBhY3RvcgpmdW5jIChwICpQcm9wb3NhbEFjdGlvblN0YXR1cykgQ2FuY2VsZWRCeSgpIGFkZHJlc3MgewoJcmV0dXJuIHAuY2FuY2VsZWRCeQp9CgovLyBJc0V4ZWN1dGVkIHJlcG9ydHMgd2hldGhlciBleGVjdXRpb24gaGFzIGJlZW4gcmVjb3JkZWQgZm9yIHRoZSBwcm9wb3NhbC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgd2hlbiB0aGUgcHJvcG9zYWwgaGFzIGJlZW4gbWFya2VkIGV4ZWN1dGVkCmZ1bmMgKHAgKlByb3Bvc2FsQWN0aW9uU3RhdHVzKSBJc0V4ZWN1dGVkKCkgYm9vbCB7CglyZXR1cm4gcC5leGVjdXRlZAp9CgovLyBFeGVjdXRlZEJ5IHJldHVybnMgdGhlIGFkZHJlc3MgcmVjb3JkZWQgYXMgaGF2aW5nIGV4ZWN1dGVkIHRoZSBwcm9wb3NhbC4KLy8gVGhlIHZhbHVlIGlzIG1lYW5pbmdmdWwgd2hlbiBJc0V4ZWN1dGVkKCkgaXMgdHJ1ZTsgYmVmb3JlIHRoZW4gaXQgaXMgdGhlCi8vIHplcm8gYWRkcmVzcyB1bmxlc3MgYSBjYWxsZXIgaGFzIGV4cGxpY2l0bHkgc3RvcmVkIGFub3RoZXIgdmFsdWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhZGRyZXNzOiBhZGRyZXNzIHJlY29yZGVkIGZvciB0aGUgZXhlY3V0aW9uIGFjdG9yCmZ1bmMgKHAgKlByb3Bvc2FsQWN0aW9uU3RhdHVzKSBFeGVjdXRlZEJ5KCkgYWRkcmVzcyB7CglyZXR1cm4gcC5leGVjdXRlZEJ5Cn0KCi8vIElzRXhlY3V0YWJsZSByZXBvcnRzIHdoZXRoZXIgdGhpcyBwcm9wb3NhbCB0eXBlIGNhbiBiZSBleGVjdXRlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgd2hlbiBleGVjdXRpb24gaXMgc3VwcG9ydGVkIGZvciB0aGUgcHJvcG9zYWwgdHlwZQpmdW5jIChwICpQcm9wb3NhbEFjdGlvblN0YXR1cykgSXNFeGVjdXRhYmxlKCkgYm9vbCB7CglyZXR1cm4gcC5leGVjdXRhYmxlCn0KCi8vIE5ld1Byb3Bvc2FsQWN0aW9uU3RhdHVzIGNyZWF0ZXMgYSBuZXcgYWN0aW9uIHN0YXR1cyBmb3IgYSBwcm9wb3NhbC4KLy8gSW5pdGlhbGl6ZXMgdGhlIHN0YXR1cyB3aXRoIGRlZmF1bHQgdmFsdWVzIGFuZCB0aGUgZXhlY3V0YWJsZSBmbGFnLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZXhlY3V0YWJsZTogd2hldGhlciB0aGlzIHByb3Bvc2FsIHR5cGUgY2FuIGJlIGV4ZWN1dGVkCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqUHJvcG9zYWxBY3Rpb25TdGF0dXM6IG5ldyBhY3Rpb24gc3RhdHVzIGluc3RhbmNlCmZ1bmMgTmV3UHJvcG9zYWxBY3Rpb25TdGF0dXMoZXhlY3V0YWJsZSBib29sKSAqUHJvcG9zYWxBY3Rpb25TdGF0dXMgewoJcmV0dXJuICZQcm9wb3NhbEFjdGlvblN0YXR1c3sKCQljYW5jZWxlZDogICBmYWxzZSwgICAgICAvLyBQcm9wb3NhbCBzdGFydHMgYXMgbm90IGNhbmNlbGVkCgkJZXhlY3V0ZWQ6ICAgZmFsc2UsICAgICAgLy8gUHJvcG9zYWwgc3RhcnRzIGFzIG5vdCBleGVjdXRlZAoJCWV4ZWN1dGFibGU6IGV4ZWN1dGFibGUsIC8vIFNldCBiYXNlZCBvbiBwcm9wb3NhbCB0eXBlCgl9Cn0KCi8vIENsb25lIGNyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgdGhlIFByb3Bvc2FsQWN0aW9uU3RhdHVzLCBvciBuaWwgd2hlbiB0aGUKLy8gcmVjZWl2ZXIgaXMgbmlsLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKlByb3Bvc2FsQWN0aW9uU3RhdHVzOiBpbmRlcGVuZGVudCBjb3B5IG9mIHRoZSBzdGF0dXMsIG9yIG5pbCBmb3IgYSBuaWwgcmVjZWl2ZXIKZnVuYyAocCAqUHJvcG9zYWxBY3Rpb25TdGF0dXMpIENsb25lKCkgKlByb3Bvc2FsQWN0aW9uU3RhdHVzIHsKCWlmIHAgPT0gbmlsIHsKCQlyZXR1cm4gbmlsCgl9CgoJcmV0dXJuICZQcm9wb3NhbEFjdGlvblN0YXR1c3sKCQljYW5jZWxlZDogICAgICAgcC5jYW5jZWxlZCwKCQljYW5jZWxlZEF0OiAgICAgcC5jYW5jZWxlZEF0LAoJCWNhbmNlbGVkSGVpZ2h0OiBwLmNhbmNlbGVkSGVpZ2h0LAoJCWNhbmNlbGVkQnk6ICAgICBwLmNhbmNlbGVkQnksCgkJZXhlY3V0ZWQ6ICAgICAgIHAuZXhlY3V0ZWQsCgkJZXhlY3V0ZWRBdDogICAgIHAuZXhlY3V0ZWRBdCwKCQlleGVjdXRlZEhlaWdodDogcC5leGVjdXRlZEhlaWdodCwKCQlleGVjdXRlZEJ5OiAgICAgcC5leGVjdXRlZEJ5LAoJCWV4ZWN1dGFibGU6ICAgICBwLmV4ZWN1dGFibGUsCgl9Cn0KGq4/ChFwcm9wb3NhbF9kYXRhLmdubxKYP3BhY2thZ2UgZ292ZXJuYW5jZQoKaW1wb3J0ICgKCSJzdHJpbmdzIgopCgovLyBQcm9wb3NhbE1ldGFkYXRhIGNvbnRhaW5zIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvcG9zYWwuCi8vIFRoaXMgaW5jbHVkZXMgdGhlIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiB0aGF0IGFyZSBkaXNwbGF5ZWQgdG8gdm90ZXJzLgp0eXBlIFByb3Bvc2FsTWV0YWRhdGEgc3RydWN0IHsKCXRpdGxlICAgICAgIHN0cmluZyAvLyBQcm9wb3NhbCB0aXRsZSAobWF4IDI1NSBjaGFyYWN0ZXJzKQoJZGVzY3JpcHRpb24gc3RyaW5nIC8vIERldGFpbGVkIHByb3Bvc2FsIGRlc2NyaXB0aW9uIChtYXggMTAsMDAwIGNoYXJhY3RlcnMpCn0KCi8vIFRpdGxlIHJldHVybnMgdGhlIHByb3Bvc2FsIHRpdGxlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RyaW5nOiBwcm9wb3NhbCB0aXRsZQpmdW5jIChwICpQcm9wb3NhbE1ldGFkYXRhKSBUaXRsZSgpIHN0cmluZyB7CglyZXR1cm4gcC50aXRsZQp9CgovLyBEZXNjcmlwdGlvbiByZXR1cm5zIHRoZSBwcm9wb3NhbCBkZXNjcmlwdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogcHJvcG9zYWwgZGVzY3JpcHRpb24KZnVuYyAocCAqUHJvcG9zYWxNZXRhZGF0YSkgRGVzY3JpcHRpb24oKSBzdHJpbmcgewoJcmV0dXJuIHAuZGVzY3JpcHRpb24KfQoKLy8gTmV3UHJvcG9zYWxNZXRhZGF0YSBjcmVhdGVzIGEgbmV3IHByb3Bvc2FsIG1ldGFkYXRhIGluc3RhbmNlIHdpdGggdHJpbW1lZCBpbnB1dC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpdGxlOiBwcm9wb3NhbCB0aXRsZQovLyAgIC0gZGVzY3JpcHRpb246IHByb3Bvc2FsIGRlc2NyaXB0aW9uCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqUHJvcG9zYWxNZXRhZGF0YTogbmV3IG1ldGFkYXRhIGluc3RhbmNlIHdpdGggdHJpbW1lZCB3aGl0ZXNwYWNlCmZ1bmMgTmV3UHJvcG9zYWxNZXRhZGF0YSh0aXRsZSBzdHJpbmcsIGRlc2NyaXB0aW9uIHN0cmluZykgKlByb3Bvc2FsTWV0YWRhdGEgewoJcmV0dXJuICZQcm9wb3NhbE1ldGFkYXRhewoJCXRpdGxlOiAgICAgICBzdHJpbmdzLlRyaW1TcGFjZSh0aXRsZSksCgkJZGVzY3JpcHRpb246IHN0cmluZ3MuVHJpbVNwYWNlKGRlc2NyaXB0aW9uKSwKCX0KfQoKLy8gUHJvcG9zYWxEYXRhIGNvbnRhaW5zIHRoZSB0eXBlLXNwZWNpZmljIGRhdGEgZm9yIGEgcHJvcG9zYWwuCi8vIFRoaXMgc3RydWN0dXJlIGhvbGRzIGRpZmZlcmVudCBkYXRhIGRlcGVuZGluZyBvbiB0aGUgcHJvcG9zYWwgdHlwZS4KdHlwZSBQcm9wb3NhbERhdGEgc3RydWN0IHsKCXByb3Bvc2FsVHlwZSAgICAgICBQcm9wb3NhbFR5cGUgICAgICAgICAgICAvLyBUeXBlIG9mIHByb3Bvc2FsIChUZXh0LCBDb21tdW5pdHlQb29sU3BlbmQsIFBhcmFtZXRlckNoYW5nZSkKCWNvbW11bml0eVBvb2xTcGVuZCAqQ29tbXVuaXR5UG9vbFNwZW5kSW5mbyAvLyBEYXRhIGZvciBjb21tdW5pdHkgcG9vbCBzcGVuZGluZyBwcm9wb3NhbHMKCWV4ZWN1dGlvbiAgICAgICAgICAqRXhlY3V0aW9uSW5mbyAgICAgICAgICAvLyBEYXRhIGZvciBwYXJhbWV0ZXIgY2hhbmdlIHByb3Bvc2Fscwp9CgovLyBQcm9wb3NhbFR5cGUgcmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIHByb3Bvc2FsLgovLwovLyBSZXR1cm5zOgovLyAgIC0gUHJvcG9zYWxUeXBlOiB0aGUgcHJvcG9zYWwgdHlwZQpmdW5jIChwICpQcm9wb3NhbERhdGEpIFByb3Bvc2FsVHlwZSgpIFByb3Bvc2FsVHlwZSB7CglyZXR1cm4gcC5wcm9wb3NhbFR5cGUKfQoKLy8gQ29tbXVuaXR5UG9vbFNwZW5kIHJldHVybnMgdGhlIGNvbW11bml0eSBwb29sIHNwZW5kaW5nIGluZm9ybWF0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKkNvbW11bml0eVBvb2xTcGVuZEluZm86IGNvbW11bml0eSBwb29sIHNwZW5kaW5nIGRldGFpbHMKZnVuYyAocCAqUHJvcG9zYWxEYXRhKSBDb21tdW5pdHlQb29sU3BlbmQoKSAqQ29tbXVuaXR5UG9vbFNwZW5kSW5mbyB7CglyZXR1cm4gcC5jb21tdW5pdHlQb29sU3BlbmQKfQoKLy8gRXhlY3V0aW9uIHJldHVybnMgdGhlIGV4ZWN1dGlvbiBpbmZvcm1hdGlvbiBmb3IgcGFyYW1ldGVyIGNoYW5nZXMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqRXhlY3V0aW9uSW5mbzogcGFyYW1ldGVyIGNoYW5nZSBleGVjdXRpb24gZGV0YWlscwpmdW5jIChwICpQcm9wb3NhbERhdGEpIEV4ZWN1dGlvbigpICpFeGVjdXRpb25JbmZvIHsKCXJldHVybiBwLmV4ZWN1dGlvbgp9CgovLyBOZXdQcm9wb3NhbERhdGEgY3JlYXRlcyBhIG5ldyBwcm9wb3NhbCBkYXRhIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBjb21wb25lbnRzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvcG9zYWxUeXBlOiB0eXBlIG9mIHRoZSBwcm9wb3NhbAovLyAgIC0gY29tbXVuaXR5UG9vbFNwZW5kOiBjb21tdW5pdHkgcG9vbCBzcGVuZGluZyBpbmZvcm1hdGlvbgovLyAgIC0gZXhlY3V0aW9uOiBwYXJhbWV0ZXIgY2hhbmdlIGV4ZWN1dGlvbiBpbmZvcm1hdGlvbgovLwovLyBSZXR1cm5zOgovLyAgIC0gKlByb3Bvc2FsRGF0YTogbmV3IHByb3Bvc2FsIGRhdGEgaW5zdGFuY2UKZnVuYyBOZXdQcm9wb3NhbERhdGEocHJvcG9zYWxUeXBlIFByb3Bvc2FsVHlwZSwgY29tbXVuaXR5UG9vbFNwZW5kICpDb21tdW5pdHlQb29sU3BlbmRJbmZvLCBleGVjdXRpb24gKkV4ZWN1dGlvbkluZm8pICpQcm9wb3NhbERhdGEgewoJcmV0dXJuICZQcm9wb3NhbERhdGF7CgkJcHJvcG9zYWxUeXBlOiAgICAgICBwcm9wb3NhbFR5cGUsCgkJY29tbXVuaXR5UG9vbFNwZW5kOiBjb21tdW5pdHlQb29sU3BlbmQsCgkJZXhlY3V0aW9uOiAgICAgICAgICBleGVjdXRpb24sCgl9Cn0KCi8vIENvbW11bml0eVBvb2xTcGVuZEluZm8gY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIGNvbW11bml0eSBwb29sIHNwZW5kaW5nIHByb3Bvc2Fscy4KdHlwZSBDb21tdW5pdHlQb29sU3BlbmRJbmZvIHN0cnVjdCB7Cgl0byAgICAgICAgYWRkcmVzcyAvLyBSZWNpcGllbnQgYWRkcmVzcyBmb3IgdG9rZW4gdHJhbnNmZXIKCXRva2VuUGF0aCBzdHJpbmcgIC8vIFBhdGggb2YgdGhlIHRva2VuIHRvIHRyYW5zZmVyCglhbW91bnQgICAgaW50NjQgICAvLyBBbW91bnQgb2YgdG9rZW5zIHRvIHRyYW5zZmVyCn0KCi8vIE5ld0NvbW11bml0eVBvb2xTcGVuZEluZm8gY3JlYXRlcyBjb21tdW5pdHktcG9vbCBzcGVuZCBkYXRhLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG86IFJlY2lwaWVudCBhZGRyZXNzIHRoYXQgcmVjZWl2ZXMgdGhlIGNvbW11bml0eS1wb29sIHRyYW5zZmVyLgovLyAgIC0gdG9rZW5QYXRoOiBSZWdpc3RlcmVkIHRva2VuIHBhdGggb2YgdGhlIGFzc2V0IHRvIHRyYW5zZmVyLgovLyAgIC0gYW1vdW50OiBUcmFuc2ZlciBhbW91bnQgaW4gdGhlIHRva2VuJ3Mgc21hbGxlc3QgdW5pdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpDb21tdW5pdHlQb29sU3BlbmRJbmZvOiBzcGVuZCBkYXRhIGNvbnRhaW5pbmcgdGhlIHJlY2lwaWVudCwgdG9rZW4gcGF0aCwgYW5kIGFtb3VudC4KZnVuYyBOZXdDb21tdW5pdHlQb29sU3BlbmRJbmZvKHRvIGFkZHJlc3MsIHRva2VuUGF0aCBzdHJpbmcsIGFtb3VudCBpbnQ2NCkgKkNvbW11bml0eVBvb2xTcGVuZEluZm8gewoJcmV0dXJuICZDb21tdW5pdHlQb29sU3BlbmRJbmZvewoJCXRvOiAgICAgICAgdG8sCgkJdG9rZW5QYXRoOiB0b2tlblBhdGgsCgkJYW1vdW50OiAgICBhbW91bnQsCgl9Cn0KCi8qIEdldHRlciBtZXRob2RzICovCi8vIFJldHVybnM6Ci8vICAgLSBhZGRyZXNzOiByZWNpcGllbnQgYWRkcmVzcyBjb25maWd1cmVkIGZvciB0aGUgY29tbXVuaXR5LXBvb2wgc3BlbmQuCi8vCmZ1bmMgKGkgKkNvbW11bml0eVBvb2xTcGVuZEluZm8pIFRvKCkgYWRkcmVzcyB7IHJldHVybiBpLnRvIH0KCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6IHJlZ2lzdGVyZWQgdG9rZW4gcGF0aCBjb25maWd1cmVkIGZvciB0aGUgY29tbXVuaXR5LXBvb2wgc3BlbmQuCmZ1bmMgKGkgKkNvbW11bml0eVBvb2xTcGVuZEluZm8pIFRva2VuUGF0aCgpIHN0cmluZyB7IHJldHVybiBpLnRva2VuUGF0aCB9CgovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IHRyYW5zZmVyIGFtb3VudCBpbiB0aGUgdG9rZW4ncyBzbWFsbGVzdCB1bml0LgpmdW5jIChpICpDb21tdW5pdHlQb29sU3BlbmRJbmZvKSBBbW91bnQoKSBpbnQ2NCB7IHJldHVybiBpLmFtb3VudCB9CgovLyBFeGVjdXRpb25JbmZvIGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBwYXJhbWV0ZXIgY2hhbmdlIGV4ZWN1dGlvbi4KLy8gTWVzc2FnZXMgYXJlIGVuY29kZWQgc3RyaW5ncyB0aGF0IHNwZWNpZnkgZnVuY3Rpb24gY2FsbHMgYW5kIHBhcmFtZXRlcnMuCnR5cGUgRXhlY3V0aW9uSW5mbyBzdHJ1Y3QgewoJbnVtICBpbnQ2NCAgICAvLyBOdW1iZXIgb2YgcGFyYW1ldGVyIGNoYW5nZXMgdG8gZXhlY3V0ZQoJbXNncyBbXXN0cmluZyAvLyBFeGVjdXRpb24gbWVzc2FnZXMgc2VwYXJhdGVkIGJ5IG1lc3NhZ2VTZXBhcmF0b3IgKCpHT1YqKQp9CgovLyBOZXdFeGVjdXRpb25JbmZvIGNyZWF0ZXMgZXhlY3V0aW9uIGRhdGEgZm9yIGEgcGFyYW1ldGVyLWNoYW5nZSBwcm9wb3NhbC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIG51bTogTnVtYmVyIG9mIGVuY29kZWQgcGFyYW1ldGVyLWNoYW5nZSBtZXNzYWdlcyB0byBleGVjdXRlLgovLyAgIC0gbXNnczogRW5jb2RlZCBwYXJhbWV0ZXItY2hhbmdlIG1lc3NhZ2VzLCBvbmUgbWVzc2FnZSBwZXIgZXhlY3V0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKkV4ZWN1dGlvbkluZm86IGV4ZWN1dGlvbiBkYXRhIGNvbnRhaW5pbmcgdGhlIGRlY2xhcmVkIGNvdW50IGFuZCBtZXNzYWdlcy4KZnVuYyBOZXdFeGVjdXRpb25JbmZvKG51bSBpbnQ2NCwgbXNncyBbXXN0cmluZykgKkV4ZWN1dGlvbkluZm8gewoJcmV0dXJuICZFeGVjdXRpb25JbmZvewoJCW51bTogIG51bSwKCQltc2dzOiBtc2dzLAoJfQp9CgovKiBHZXR0ZXIgbWV0aG9kcyAqLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGRlY2xhcmVkIG51bWJlciBvZiBwYXJhbWV0ZXItY2hhbmdlIG1lc3NhZ2VzLgovLwpmdW5jIChpICpFeGVjdXRpb25JbmZvKSBOdW0oKSBpbnQ2NCB7IHJldHVybiBpLm51bSB9CgovLyBSZXR1cm5zOgovLyAgIC0gW11zdHJpbmc6IGVuY29kZWQgcGFyYW1ldGVyLWNoYW5nZSBtZXNzYWdlcyBpbiBleGVjdXRpb24gb3JkZXIuCmZ1bmMgKGkgKkV4ZWN1dGlvbkluZm8pIE1zZ3MoKSBbXXN0cmluZyB7IHJldHVybiBpLm1zZ3MgfQoKLy8gUGFyYW1ldGVyQ2hhbmdlSW5mbyByZXByZXNlbnRzIGEgc2luZ2xlIHBhcmFtZXRlciBjaGFuZ2UgdG8gYmUgZXhlY3V0ZWQuCnR5cGUgUGFyYW1ldGVyQ2hhbmdlSW5mbyBzdHJ1Y3QgewoJcGtnUGF0aCAgc3RyaW5nICAgLy8gUGFja2FnZSBwYXRoIG9mIHRoZSB0YXJnZXQgY29udHJhY3QKCWZ1bmN0aW9uIHN0cmluZyAgIC8vIEZ1bmN0aW9uIG5hbWUgdG8gY2FsbAoJcGFyYW1zICAgW11zdHJpbmcgLy8gUGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgp9CgovLyBOZXdQYXJhbWV0ZXJDaGFuZ2VJbmZvIGNyZWF0ZXMgb25lIGVuY29kZWQgcGFyYW1ldGVyLWNoYW5nZSB0YXJnZXQgZGVzY3JpcHRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwa2dQYXRoOiBQYWNrYWdlIHBhdGggY29udGFpbmluZyB0aGUgcGFyYW1ldGVyLWNoYW5nZSBoYW5kbGVyLgovLyAgIC0gZnVuY3Rpb246IEhhbmRsZXIgZnVuY3Rpb24gbmFtZSB0byBpbnZva2UuCi8vICAgLSBwYXJhbXM6IFN0cmluZyBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIGluIG9yZGVyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gUGFyYW1ldGVyQ2hhbmdlSW5mbzogcGFyYW1ldGVyLWNoYW5nZSB0YXJnZXQgYW5kIGl0cyBlbmNvZGVkIGFyZ3VtZW50cy4KZnVuYyBOZXdQYXJhbWV0ZXJDaGFuZ2VJbmZvKHBrZ1BhdGggc3RyaW5nLCBmdW5jdGlvbiBzdHJpbmcsIHBhcmFtcyBbXXN0cmluZykgUGFyYW1ldGVyQ2hhbmdlSW5mbyB7CglyZXR1cm4gUGFyYW1ldGVyQ2hhbmdlSW5mb3sKCQlwa2dQYXRoOiAgcGtnUGF0aCwKCQlmdW5jdGlvbjogZnVuY3Rpb24sCgkJcGFyYW1zOiAgIHBhcmFtcywKCX0KfQoKLyogR2V0dGVyIG1ldGhvZHMgKi8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogcGFja2FnZSBwYXRoIG9mIHRoZSBwYXJhbWV0ZXItY2hhbmdlIGhhbmRsZXIuCi8vCmZ1bmMgKGkgKlBhcmFtZXRlckNoYW5nZUluZm8pIFBrZ1BhdGgoKSBzdHJpbmcgeyByZXR1cm4gaS5wa2dQYXRoIH0KCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6IGZ1bmN0aW9uIG5hbWUgb2YgdGhlIHBhcmFtZXRlci1jaGFuZ2UgaGFuZGxlci4KZnVuYyAoaSAqUGFyYW1ldGVyQ2hhbmdlSW5mbykgRnVuY3Rpb24oKSBzdHJpbmcgeyByZXR1cm4gaS5mdW5jdGlvbiB9CgovLyBSZXR1cm5zOgovLyAgIC0gW11zdHJpbmc6IGVuY29kZWQgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgcGFyYW1ldGVyLWNoYW5nZSBoYW5kbGVyLgpmdW5jIChpICpQYXJhbWV0ZXJDaGFuZ2VJbmZvKSBQYXJhbXMoKSBbXXN0cmluZyB7IHJldHVybiBpLnBhcmFtcyB9CgovLyBDbG9uZSBjcmVhdGVzIGEgZGVlcCBjb3B5IG9mIHRoZSBQcm9wb3NhbE1ldGFkYXRhLgovLyBSZXR1cm5zOgovLyAgIC0gKlByb3Bvc2FsTWV0YWRhdGE6IGluZGVwZW5kZW50IG1ldGFkYXRhIGNvcHksIG9yIG5pbCB3aGVuIHRoZSByZWNlaXZlciBpcyBuaWwuCmZ1bmMgKHAgKlByb3Bvc2FsTWV0YWRhdGEpIENsb25lKCkgKlByb3Bvc2FsTWV0YWRhdGEgewoJaWYgcCA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCglyZXR1cm4gJlByb3Bvc2FsTWV0YWRhdGF7CgkJdGl0bGU6ICAgICAgIHAudGl0bGUsCgkJZGVzY3JpcHRpb246IHAuZGVzY3JpcHRpb24sCgl9Cn0KCi8vIENsb25lIGNyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgdGhlIENvbW11bml0eVBvb2xTcGVuZEluZm8uCi8vIFJldHVybnM6Ci8vICAgLSAqQ29tbXVuaXR5UG9vbFNwZW5kSW5mbzogaW5kZXBlbmRlbnQgc3BlbmQtZGF0YSBjb3B5LCBvciBuaWwgd2hlbiB0aGUgcmVjZWl2ZXIgaXMgbmlsLgpmdW5jIChpICpDb21tdW5pdHlQb29sU3BlbmRJbmZvKSBDbG9uZSgpICpDb21tdW5pdHlQb29sU3BlbmRJbmZvIHsKCWlmIGkgPT0gbmlsIHsKCQlyZXR1cm4gbmlsCgl9CgoJcmV0dXJuICZDb21tdW5pdHlQb29sU3BlbmRJbmZvewoJCXRvOiAgICAgICAgaS50bywKCQl0b2tlblBhdGg6IGkudG9rZW5QYXRoLAoJCWFtb3VudDogICAgaS5hbW91bnQsCgl9Cn0KCi8vIENsb25lIGNyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgdGhlIEV4ZWN1dGlvbkluZm8uCi8vIFJldHVybnM6Ci8vICAgLSAqRXhlY3V0aW9uSW5mbzogaW5kZXBlbmRlbnQgZXhlY3V0aW9uLWRhdGEgY29weSBpbmNsdWRpbmcgYSBjb3BpZWQgbWVzc2FnZSBzbGljZSwgb3IgbmlsIHdoZW4gdGhlIHJlY2VpdmVyIGlzIG5pbC4KZnVuYyAoaSAqRXhlY3V0aW9uSW5mbykgQ2xvbmUoKSAqRXhlY3V0aW9uSW5mbyB7CglpZiBpID09IG5pbCB7CgkJcmV0dXJuIG5pbAoJfQoKCWNsb25lZE1zZ3MgOj0gbWFrZShbXXN0cmluZywgbGVuKGkubXNncykpCgljb3B5KGNsb25lZE1zZ3MsIGkubXNncykKCglyZXR1cm4gJkV4ZWN1dGlvbkluZm97CgkJbnVtOiAgaS5udW0sCgkJbXNnczogY2xvbmVkTXNncywKCX0KfQoKLy8gQ2xvbmUgY3JlYXRlcyBhIGRlZXAgY29weSBvZiB0aGUgUHJvcG9zYWxEYXRhLgovLyBSZXR1cm5zOgovLyAgIC0gKlByb3Bvc2FsRGF0YTogaW5kZXBlbmRlbnQgcHJvcG9zYWwtZGF0YSBjb3B5IHdpdGggY2xvbmVkIG5lc3RlZCB2YWx1ZXMsIG9yIG5pbCB3aGVuIHRoZSByZWNlaXZlciBpcyBuaWwuCmZ1bmMgKHAgKlByb3Bvc2FsRGF0YSkgQ2xvbmUoKSAqUHJvcG9zYWxEYXRhIHsKCWlmIHAgPT0gbmlsIHsKCQlyZXR1cm4gbmlsCgl9CgoJcmV0dXJuICZQcm9wb3NhbERhdGF7CgkJcHJvcG9zYWxUeXBlOiAgICAgICBwLnByb3Bvc2FsVHlwZSwKCQljb21tdW5pdHlQb29sU3BlbmQ6IHAuY29tbXVuaXR5UG9vbFNwZW5kLkNsb25lKCksCgkJZXhlY3V0aW9uOiAgICAgICAgICBwLmV4ZWN1dGlvbi5DbG9uZSgpLAoJfQp9ChqfIgoccHJvcG9zYWxfc2NoZWR1bGVfc3RhdHVzLmdubxL+IXBhY2thZ2UgZ292ZXJuYW5jZQoKLy8gUHJvcG9zYWxTY2hlZHVsZVN0YXR1cyByZXByZXNlbnRzIHRoZSBwcmUtY2FsY3VsYXRlZCB0aW1lIHNjaGVkdWxlIGZvciBhIHByb3Bvc2FsLgovLyBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFsbCB0aGUgaW1wb3J0YW50IHRpbWVzdGFtcHMgaW4gYSBwcm9wb3NhbCdzIGxpZmVjeWNsZSwKLy8gZnJvbSBjcmVhdGlvbiB0aHJvdWdoIHZvdGluZyB0byBleGVjdXRpb24gYW5kIGV4cGlyYXRpb24uCnR5cGUgUHJvcG9zYWxTY2hlZHVsZVN0YXR1cyBzdHJ1Y3QgewoJY3JlYXRlVGltZSAgICAgaW50NjQgLy8gV2hlbiB0aGUgcHJvcG9zYWwgd2FzIGNyZWF0ZWQKCWFjdGl2ZVRpbWUgICAgIGludDY0IC8vIFdoZW4gdm90aW5nIHN0YXJ0cyAoQ3JlYXRlVGltZSArIFZvdGluZ1N0YXJ0RGVsYXkpCgl2b3RpbmdFbmRUaW1lICBpbnQ2NCAvLyBXaGVuIHZvdGluZyBlbmRzIChBY3RpdmVUaW1lICsgVm90aW5nUGVyaW9kKQoJZXhlY3V0YWJsZVRpbWUgaW50NjQgLy8gV2hlbiBleGVjdXRpb24gd2luZG93IHN0YXJ0cyAoVm90aW5nRW5kVGltZSArIEV4ZWN1dGlvbkRlbGF5KQoJZXhwaXJlZFRpbWUgICAgaW50NjQgLy8gV2hlbiBleGVjdXRpb24gd2luZG93IGVuZHMgKEV4ZWN1dGFibGVUaW1lICsgRXhlY3V0aW9uV2luZG93KQp9CgovLyBOZXdQcm9wb3NhbFNjaGVkdWxlU3RhdHVzIGNyZWF0ZXMgYSBwcm9wb3NhbCBzY2hlZHVsZSBmcm9tIGl0cyBsaWZlY3ljbGUgdGltZXN0YW1wcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGNyZWF0ZVRpbWU6IFVuaXggdGltZXN0YW1wIHdoZW4gdGhlIHByb3Bvc2FsIHdhcyBjcmVhdGVkCi8vICAgLSBhY3RpdmVUaW1lOiBVbml4IHRpbWVzdGFtcCB3aGVuIHZvdGluZyBzdGFydHMKLy8gICAtIHZvdGluZ0VuZFRpbWU6IFVuaXggdGltZXN0YW1wIHdoZW4gdm90aW5nIGVuZHMKLy8gICAtIGV4ZWN1dGFibGVUaW1lOiBVbml4IHRpbWVzdGFtcCB3aGVuIHRoZSBleGVjdXRpb24gd2luZG93IHN0YXJ0cwovLyAgIC0gZXhwaXJlZFRpbWU6IFVuaXggdGltZXN0YW1wIHdoZW4gdGhlIGV4ZWN1dGlvbiB3aW5kb3cgY2xvc2VzCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqUHJvcG9zYWxTY2hlZHVsZVN0YXR1czogc2NoZWR1bGUgY29udGFpbmluZyB0aGUgc3VwcGxpZWQgbGlmZWN5Y2xlIHRpbWVzdGFtcHMKZnVuYyBOZXdQcm9wb3NhbFNjaGVkdWxlU3RhdHVzKAoJY3JlYXRlVGltZSBpbnQ2NCwKCWFjdGl2ZVRpbWUgaW50NjQsCgl2b3RpbmdFbmRUaW1lIGludDY0LAoJZXhlY3V0YWJsZVRpbWUgaW50NjQsCglleHBpcmVkVGltZSBpbnQ2NCwKKSAqUHJvcG9zYWxTY2hlZHVsZVN0YXR1cyB7CglyZXR1cm4gJlByb3Bvc2FsU2NoZWR1bGVTdGF0dXN7CgkJY3JlYXRlVGltZTogICAgIGNyZWF0ZVRpbWUsCgkJYWN0aXZlVGltZTogICAgIGFjdGl2ZVRpbWUsCgkJdm90aW5nRW5kVGltZTogIHZvdGluZ0VuZFRpbWUsCgkJZXhlY3V0YWJsZVRpbWU6IGV4ZWN1dGFibGVUaW1lLAoJCWV4cGlyZWRUaW1lOiAgICBleHBpcmVkVGltZSwKCX0KfQoKLyogR2V0dGVyIG1ldGhvZHMgKi8KLy8gQ3JlYXRlVGltZSByZXR1cm5zIHRoZSBVbml4IHRpbWVzdGFtcCB3aGVuIHRoZSBwcm9wb3NhbCB3YXMgY3JlYXRlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBwcm9wb3NhbCBjcmVhdGlvbiB0aW1lc3RhbXAKZnVuYyAocCAqUHJvcG9zYWxTY2hlZHVsZVN0YXR1cykgQ3JlYXRlVGltZSgpIGludDY0IHsgcmV0dXJuIHAuY3JlYXRlVGltZSB9CgovLyBBY3RpdmVUaW1lIHJldHVybnMgdGhlIFVuaXggdGltZXN0YW1wIHdoZW4gcHJvcG9zYWwgdm90aW5nIHN0YXJ0cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiB2b3Rpbmcgc3RhcnQgdGltZXN0YW1wCmZ1bmMgKHAgKlByb3Bvc2FsU2NoZWR1bGVTdGF0dXMpIEFjdGl2ZVRpbWUoKSBpbnQ2NCB7IHJldHVybiBwLmFjdGl2ZVRpbWUgfQoKLy8gVm90aW5nRW5kVGltZSByZXR1cm5zIHRoZSBVbml4IHRpbWVzdGFtcCB3aGVuIHByb3Bvc2FsIHZvdGluZyBlbmRzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IHZvdGluZyBlbmQgdGltZXN0YW1wCmZ1bmMgKHAgKlByb3Bvc2FsU2NoZWR1bGVTdGF0dXMpIFZvdGluZ0VuZFRpbWUoKSBpbnQ2NCB7IHJldHVybiBwLnZvdGluZ0VuZFRpbWUgfQoKLy8gRXhlY3V0YWJsZVRpbWUgcmV0dXJucyB0aGUgVW5peCB0aW1lc3RhbXAgd2hlbiB0aGUgZXhlY3V0aW9uIHdpbmRvdyBzdGFydHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogZXhlY3V0aW9uIHN0YXJ0IHRpbWVzdGFtcApmdW5jIChwICpQcm9wb3NhbFNjaGVkdWxlU3RhdHVzKSBFeGVjdXRhYmxlVGltZSgpIGludDY0IHsgcmV0dXJuIHAuZXhlY3V0YWJsZVRpbWUgfQoKLy8gRXhwaXJlZFRpbWUgcmV0dXJucyB0aGUgVW5peCB0aW1lc3RhbXAgd2hlbiB0aGUgZXhlY3V0aW9uIHdpbmRvdyBjbG9zZXMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogZXhlY3V0aW9uIGV4cGlyYXRpb24gdGltZXN0YW1wCmZ1bmMgKHAgKlByb3Bvc2FsU2NoZWR1bGVTdGF0dXMpIEV4cGlyZWRUaW1lKCkgaW50NjQgeyByZXR1cm4gcC5leHBpcmVkVGltZSB9CgovKiBTZXR0ZXIgbWV0aG9kcyAqLwovLyBTZXRDcmVhdGVUaW1lIHVwZGF0ZXMgdGhlIHByb3Bvc2FsIGNyZWF0aW9uIHRpbWVzdGFtcC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGNyZWF0ZVRpbWU6IFVuaXggdGltZXN0YW1wIHdoZW4gdGhlIHByb3Bvc2FsIHdhcyBjcmVhdGVkCmZ1bmMgKHAgKlByb3Bvc2FsU2NoZWR1bGVTdGF0dXMpIFNldENyZWF0ZVRpbWUoY3JlYXRlVGltZSBpbnQ2NCkgewoJcC5jcmVhdGVUaW1lID0gY3JlYXRlVGltZQp9CgovLyBTZXRBY3RpdmVUaW1lIHVwZGF0ZXMgdGhlIHRpbWVzdGFtcCB3aGVuIHByb3Bvc2FsIHZvdGluZyBzdGFydHMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhY3RpdmVUaW1lOiBVbml4IHRpbWVzdGFtcCB3aGVuIHZvdGluZyBzdGFydHMKZnVuYyAocCAqUHJvcG9zYWxTY2hlZHVsZVN0YXR1cykgU2V0QWN0aXZlVGltZShhY3RpdmVUaW1lIGludDY0KSB7CglwLmFjdGl2ZVRpbWUgPSBhY3RpdmVUaW1lCn0KCi8vIFNldFZvdGluZ0VuZFRpbWUgdXBkYXRlcyB0aGUgdGltZXN0YW1wIHdoZW4gcHJvcG9zYWwgdm90aW5nIGVuZHMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB2b3RpbmdFbmRUaW1lOiBVbml4IHRpbWVzdGFtcCB3aGVuIHZvdGluZyBlbmRzCmZ1bmMgKHAgKlByb3Bvc2FsU2NoZWR1bGVTdGF0dXMpIFNldFZvdGluZ0VuZFRpbWUodm90aW5nRW5kVGltZSBpbnQ2NCkgewoJcC52b3RpbmdFbmRUaW1lID0gdm90aW5nRW5kVGltZQp9CgovLyBTZXRFeGVjdXRhYmxlVGltZSB1cGRhdGVzIHRoZSB0aW1lc3RhbXAgd2hlbiBwcm9wb3NhbCBleGVjdXRpb24gY2FuIHN0YXJ0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZXhlY3V0YWJsZVRpbWU6IFVuaXggdGltZXN0YW1wIHdoZW4gdGhlIGV4ZWN1dGlvbiB3aW5kb3cgc3RhcnRzCmZ1bmMgKHAgKlByb3Bvc2FsU2NoZWR1bGVTdGF0dXMpIFNldEV4ZWN1dGFibGVUaW1lKGV4ZWN1dGFibGVUaW1lIGludDY0KSB7CglwLmV4ZWN1dGFibGVUaW1lID0gZXhlY3V0YWJsZVRpbWUKfQoKLy8gU2V0RXhwaXJlZFRpbWUgdXBkYXRlcyB0aGUgdGltZXN0YW1wIHdoZW4gcHJvcG9zYWwgZXhlY3V0aW9uIGV4cGlyZXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBleHBpcmVkVGltZTogVW5peCB0aW1lc3RhbXAgd2hlbiB0aGUgZXhlY3V0aW9uIHdpbmRvdyBjbG9zZXMKZnVuYyAocCAqUHJvcG9zYWxTY2hlZHVsZVN0YXR1cykgU2V0RXhwaXJlZFRpbWUoZXhwaXJlZFRpbWUgaW50NjQpIHsKCXAuZXhwaXJlZFRpbWUgPSBleHBpcmVkVGltZQp9CgovLyBDbG9uZSBjcmVhdGVzIGEgZGVlcCBjb3B5IG9mIHRoZSBQcm9wb3NhbFNjaGVkdWxlU3RhdHVzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKlByb3Bvc2FsU2NoZWR1bGVTdGF0dXM6IGNvcGllZCBzY2hlZHVsZSwgb3IgbmlsIHdoZW4gdGhlIHJlY2VpdmVyIGlzIG5pbApmdW5jIChwICpQcm9wb3NhbFNjaGVkdWxlU3RhdHVzKSBDbG9uZSgpICpQcm9wb3NhbFNjaGVkdWxlU3RhdHVzIHsKCWlmIHAgPT0gbmlsIHsKCQlyZXR1cm4gbmlsCgl9CgoJcmV0dXJuICZQcm9wb3NhbFNjaGVkdWxlU3RhdHVzewoJCWNyZWF0ZVRpbWU6ICAgICBwLmNyZWF0ZVRpbWUsCgkJYWN0aXZlVGltZTogICAgIHAuYWN0aXZlVGltZSwKCQl2b3RpbmdFbmRUaW1lOiAgcC52b3RpbmdFbmRUaW1lLAoJCWV4ZWN1dGFibGVUaW1lOiBwLmV4ZWN1dGFibGVUaW1lLAoJCWV4cGlyZWRUaW1lOiAgICBwLmV4cGlyZWRUaW1lLAoJfQp9ChqxIQoTcHJvcG9zYWxfc3RhdHVzLmdubxKZIXBhY2thZ2UgZ292ZXJuYW5jZQoKLy8gUHJvcG9zYWxTdGF0dXNUeXBlIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGEgcHJvcG9zYWwgaW4gaXRzIGxpZmVjeWNsZS4KLy8gVGhlc2Ugc3RhdHVzZXMgZGV0ZXJtaW5lIHdoYXQgYWN0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBhIHByb3Bvc2FsLgp0eXBlIFByb3Bvc2FsU3RhdHVzVHlwZSBpbnQKCmNvbnN0ICgKCV8gICAgICAgICAgICAgICAgUHJvcG9zYWxTdGF0dXNUeXBlID0gaW90YQoJU3RhdHVzVXBjb21pbmcgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvcG9zYWwgY3JlYXRlZCBidXQgdm90aW5nIGhhc24ndCBzdGFydGVkIHlldAoJU3RhdHVzQWN0aXZlICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvcG9zYWwgaXMgaW4gdm90aW5nIHBlcmlvZAoJU3RhdHVzUGFzc2VkICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvcG9zYWwgaGFzIHBhc3NlZCBidXQgaGFzbid0IGJlZW4gZXhlY3V0ZWQgKG9yIGlzIHRleHQgcHJvcG9zYWwpCglTdGF0dXNSZWplY3RlZCAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9wb3NhbCBmYWlsZWQgdG8gbWVldCB2b3RpbmcgcmVxdWlyZW1lbnRzCglTdGF0dXNFeGVjdXRhYmxlICAgICAgICAgICAgICAgICAgICAvLyBQcm9wb3NhbCBjYW4gYmUgZXhlY3V0ZWQgKHBhc3NlZCBhbmQgaW4gZXhlY3V0aW9uIHdpbmRvdykKCVN0YXR1c0V4ZWN1dGVkICAgICAgICAgICAgICAgICAgICAgIC8vIFByb3Bvc2FsIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBleGVjdXRlZAoJU3RhdHVzRXhwaXJlZCAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvcG9zYWwgZXhlY3V0aW9uIHdpbmRvdyBoYXMgcGFzc2VkCglTdGF0dXNDYW5jZWxlZCAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9wb3NhbCBoYXMgYmVlbiBjYW5jZWxlZAopCgovLyBTdHJpbmcgcmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIFByb3Bvc2FsU3RhdHVzVHlwZSBmb3IgZGlzcGxheSBwdXJwb3Nlcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogbG93ZXJjYXNlIHN0YXR1cyBuYW1lLCBvciAidW5rbm93biIgZm9yIGFuIHVucmVjb2duaXplZCB2YWx1ZQpmdW5jIChzIFByb3Bvc2FsU3RhdHVzVHlwZSkgU3RyaW5nKCkgc3RyaW5nIHsKCXN3aXRjaCBzIHsKCWNhc2UgU3RhdHVzVXBjb21pbmc6CgkJcmV0dXJuICJ1cGNvbWluZyIKCWNhc2UgU3RhdHVzQWN0aXZlOgoJCXJldHVybiAiYWN0aXZlIgoJY2FzZSBTdGF0dXNQYXNzZWQ6CgkJcmV0dXJuICJwYXNzZWQiCgljYXNlIFN0YXR1c1JlamVjdGVkOgoJCXJldHVybiAicmVqZWN0ZWQiCgljYXNlIFN0YXR1c0V4ZWN1dGFibGU6CgkJcmV0dXJuICJleGVjdXRhYmxlIgoJY2FzZSBTdGF0dXNFeGVjdXRlZDoKCQlyZXR1cm4gImV4ZWN1dGVkIgoJY2FzZSBTdGF0dXNFeHBpcmVkOgoJCXJldHVybiAiZXhwaXJlZCIKCWNhc2UgU3RhdHVzQ2FuY2VsZWQ6CgkJcmV0dXJuICJjYW5jZWxlZCIKCWRlZmF1bHQ6CgkJcmV0dXJuICJ1bmtub3duIgoJfQp9CgovLyBQcm9wb3NhbFN0YXR1cyBtYW5hZ2VzIHRoZSBjb21wbGV0ZSBzdGF0dXMgb2YgYSBwcm9wb3NhbCBpbmNsdWRpbmcgc2NoZWR1bGluZywgdm90aW5nLCBhbmQgYWN0aW9ucy4KLy8gVGhpcyBpcyB0aGUgY2VudHJhbCBzdGF0dXMgdHJhY2tpbmcgc3RydWN0dXJlIHRoYXQgY29vcmRpbmF0ZXMgZGlmZmVyZW50IGFzcGVjdHMgb2YgcHJvcG9zYWwgc3RhdGUuCnR5cGUgUHJvcG9zYWxTdGF0dXMgc3RydWN0IHsKCXNjaGVkdWxlICAgICAqUHJvcG9zYWxTY2hlZHVsZVN0YXR1cyAvLyBUaW1lLWJhc2VkIHNjaGVkdWxpbmcgaW5mb3JtYXRpb24KCWFjdGlvblN0YXR1cyAqUHJvcG9zYWxBY3Rpb25TdGF0dXMgICAvLyBFeGVjdXRpb24gYW5kIGNhbmNlbGxhdGlvbiBzdGF0dXMKCXZvdGVTdGF0dXMgICAqUHJvcG9zYWxWb3RlU3RhdHVzICAgICAvLyBWb3RpbmcgdGFsbGllcyBhbmQgcmVxdWlyZW1lbnRzCn0KCi8vIE5ld1Byb3Bvc2FsU3RhdHVzQnkgY29tYmluZXMgc2NoZWR1bGUsIGFjdGlvbiwgYW5kIHZvdGUgc3RhdGUgaW50byBhIHByb3Bvc2FsIHN0YXR1cy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHNjaGVkdWxlOiB0aW1lLWJhc2VkIGxpZmVjeWNsZSBzY2hlZHVsZSBmb3IgdGhlIHByb3Bvc2FsCi8vICAgLSBhY3Rpb25TdGF0dXM6IGV4ZWN1dGlvbiBhbmQgY2FuY2VsbGF0aW9uIHN0YXRlIGZvciB0aGUgcHJvcG9zYWwKLy8gICAtIHZvdGVTdGF0dXM6IHZvdGUgdGFsbGllcyBhbmQgdm90aW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlIHByb3Bvc2FsCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqUHJvcG9zYWxTdGF0dXM6IHN0YXR1cyBvYmplY3QgY29udGFpbmluZyB0aGUgc3VwcGxpZWQgbGlmZWN5Y2xlIGNvbXBvbmVudHMKZnVuYyBOZXdQcm9wb3NhbFN0YXR1c0J5KAoJc2NoZWR1bGUgKlByb3Bvc2FsU2NoZWR1bGVTdGF0dXMsCglhY3Rpb25TdGF0dXMgKlByb3Bvc2FsQWN0aW9uU3RhdHVzLAoJdm90ZVN0YXR1cyAqUHJvcG9zYWxWb3RlU3RhdHVzLAopICpQcm9wb3NhbFN0YXR1cyB7CglyZXR1cm4gJlByb3Bvc2FsU3RhdHVzewoJCXNjaGVkdWxlOiAgICAgc2NoZWR1bGUsCgkJYWN0aW9uU3RhdHVzOiBhY3Rpb25TdGF0dXMsCgkJdm90ZVN0YXR1czogICB2b3RlU3RhdHVzLAoJfQp9CgovKiBHZXR0ZXIgbWV0aG9kcyAqLwovLyBTY2hlZHVsZSByZXR1cm5zIHRoZSBwcm9wb3NhbCdzIHRpbWUtYmFzZWQgc2NoZWR1bGluZyBzdGF0ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpQcm9wb3NhbFNjaGVkdWxlU3RhdHVzOiBzY2hlZHVsZSBjb250YWluaW5nIHByb3Bvc2FsIGxpZmVjeWNsZSB0aW1lc3RhbXBzCmZ1bmMgKHMgKlByb3Bvc2FsU3RhdHVzKSBTY2hlZHVsZSgpICpQcm9wb3NhbFNjaGVkdWxlU3RhdHVzIHsgcmV0dXJuIHMuc2NoZWR1bGUgfQoKLy8gQWN0aW9uU3RhdHVzIHJldHVybnMgdGhlIHByb3Bvc2FsJ3MgZXhlY3V0aW9uIGFuZCBjYW5jZWxsYXRpb24gc3RhdGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqUHJvcG9zYWxBY3Rpb25TdGF0dXM6IGFjdGlvbiBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3Bvc2FsCmZ1bmMgKHMgKlByb3Bvc2FsU3RhdHVzKSBBY3Rpb25TdGF0dXMoKSAqUHJvcG9zYWxBY3Rpb25TdGF0dXMgeyByZXR1cm4gcy5hY3Rpb25TdGF0dXMgfQoKLy8gVm90ZVN0YXR1cyByZXR1cm5zIHRoZSBwcm9wb3NhbCdzIHZvdGUgdGFsbGllcyBhbmQgdm90aW5nIHJlcXVpcmVtZW50cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpQcm9wb3NhbFZvdGVTdGF0dXM6IHZvdGUgc3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wb3NhbApmdW5jIChzICpQcm9wb3NhbFN0YXR1cykgVm90ZVN0YXR1cygpICpQcm9wb3NhbFZvdGVTdGF0dXMgeyByZXR1cm4gcy52b3RlU3RhdHVzIH0KCi8qIERlbGVnYXRpb24gZ2V0dGVycyBmb3Igdm90ZSBkYXRhICovCgovLyBZZXNXZWlnaHQgcmV0dXJucyB0aGUgdG90YWwgd2VpZ2h0IG9mICJ5ZXMiIHZvdGVzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IHRvdGFsICJ5ZXMiIHZvdGUgd2VpZ2h0CmZ1bmMgKHMgKlByb3Bvc2FsU3RhdHVzKSBZZXNXZWlnaHQoKSBpbnQ2NCB7CglyZXR1cm4gcy52b3RlU3RhdHVzLlllc1dlaWdodCgpCn0KCi8vIE5vV2VpZ2h0IHJldHVybnMgdGhlIHRvdGFsIHdlaWdodCBvZiAibm8iIHZvdGVzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IHRvdGFsICJubyIgdm90ZSB3ZWlnaHQKZnVuYyAocyAqUHJvcG9zYWxTdGF0dXMpIE5vV2VpZ2h0KCkgaW50NjQgewoJcmV0dXJuIHMudm90ZVN0YXR1cy5Ob1dlaWdodCgpCn0KCi8vIENsb25lIGNyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgdGhlIFByb3Bvc2FsU3RhdHVzLCBvciBuaWwgd2hlbiB0aGUKLy8gcmVjZWl2ZXIgaXMgbmlsLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKlByb3Bvc2FsU3RhdHVzOiBpbmRlcGVuZGVudCBjb3B5IG9mIHRoZSBzdGF0dXMsIG9yIG5pbCBmb3IgYSBuaWwgcmVjZWl2ZXIKZnVuYyAocyAqUHJvcG9zYWxTdGF0dXMpIENsb25lKCkgKlByb3Bvc2FsU3RhdHVzIHsKCWlmIHMgPT0gbmlsIHsKCQlyZXR1cm4gbmlsCgl9CgoJcmV0dXJuICZQcm9wb3NhbFN0YXR1c3sKCQlzY2hlZHVsZTogICAgIHMuc2NoZWR1bGUuQ2xvbmUoKSwKCQlhY3Rpb25TdGF0dXM6IHMuYWN0aW9uU3RhdHVzLkNsb25lKCksCgkJdm90ZVN0YXR1czogICBzLnZvdGVTdGF0dXMuQ2xvbmUoKSwKCX0KfQoaggsKEXByb3Bvc2FsX3R5cGUuZ25vEuwKcGFja2FnZSBnb3Zlcm5hbmNlCgovLyBQcm9wb3NhbFR5cGUgZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHByb3Bvc2FscyBzdXBwb3J0ZWQgYnkgdGhlIGdvdmVybmFuY2Ugc3lzdGVtLgovLyBFYWNoIHR5cGUgaGFzIGRpZmZlcmVudCBleGVjdXRpb24gYmVoYXZpb3IgYW5kIHZhbGlkYXRpb24gcmVxdWlyZW1lbnRzLgp0eXBlIFByb3Bvc2FsVHlwZSBzdHJpbmcKCmNvbnN0ICgKCVRleHQgICAgICAgICAgICAgICBQcm9wb3NhbFR5cGUgPSAiVEVYVCIgICAgICAgICAgICAgICAgIC8vIEluZm9ybWF0aW9uYWwgcHJvcG9zYWxzIGZvciBjb21tdW5pdHkgZGlzY3Vzc2lvbgoJQ29tbXVuaXR5UG9vbFNwZW5kIFByb3Bvc2FsVHlwZSA9ICJDT01NVU5JVFlfUE9PTF9TUEVORCIgLy8gUHJvcG9zYWxzIHRvIHNwZW5kIGNvbW11bml0eSBwb29sIGZ1bmRzCglQYXJhbWV0ZXJDaGFuZ2UgICAgUHJvcG9zYWxUeXBlID0gIlBBUkFNRVRFUl9DSEFOR0UiICAgICAvLyBQcm9wb3NhbHMgdG8gbW9kaWZ5IHN5c3RlbSBwYXJhbWV0ZXJzCikKCi8vIFN0cmluZyByZXR1cm5zIHRoZSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3Bvc2FsIHR5cGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6ICJUZXh0IiwgIkNvbW11bml0eVBvb2xTcGVuZCIsIG9yICJQYXJhbWV0ZXJDaGFuZ2UiIGZvciBhIGtub3duIHR5cGU7ICJVbmtub3duIiBvdGhlcndpc2UKZnVuYyAocCBQcm9wb3NhbFR5cGUpIFN0cmluZygpIHN0cmluZyB7Cglzd2l0Y2ggcCB7CgljYXNlIFRleHQ6CgkJcmV0dXJuICJUZXh0IgoJY2FzZSBDb21tdW5pdHlQb29sU3BlbmQ6CgkJcmV0dXJuICJDb21tdW5pdHlQb29sU3BlbmQiCgljYXNlIFBhcmFtZXRlckNoYW5nZToKCQlyZXR1cm4gIlBhcmFtZXRlckNoYW5nZSIKCWRlZmF1bHQ6CgkJcmV0dXJuICJVbmtub3duIgoJfQp9CgovLyBJc0V4ZWN1dGFibGUgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgcHJvcG9zYWwgdHlwZSBjYW4gYmUgZXhlY3V0ZWQuCi8vIFRleHQgcHJvcG9zYWxzIGFyZSBpbmZvcm1hdGlvbmFsIG9ubHkgYW5kIGNhbm5vdCBiZSBleGVjdXRlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgZm9yIGV4ZWN1dGFibGUgQ29tbXVuaXR5UG9vbFNwZW5kIG9yIFBhcmFtZXRlckNoYW5nZSB0eXBlczsgZmFsc2UgZm9yIFRleHQgYW5kIHVua25vd24gdHlwZXMKZnVuYyAocCBQcm9wb3NhbFR5cGUpIElzRXhlY3V0YWJsZSgpIGJvb2wgewoJc3dpdGNoIHAgewoJY2FzZSBUZXh0OgoJCXJldHVybiBmYWxzZQoJY2FzZSBDb21tdW5pdHlQb29sU3BlbmQsIFBhcmFtZXRlckNoYW5nZToKCQlyZXR1cm4gdHJ1ZQoJZGVmYXVsdDoKCQlyZXR1cm4gZmFsc2UKCX0KfQoaqxwKGHByb3Bvc2FsX3ZvdGVfc3RhdHVzLmdubxKOHHBhY2thZ2UgZ292ZXJuYW5jZQoKLy8gUHJvcG9zYWxWb3RlU3RhdHVzIHRyYWNrcyB0aGUgdm90aW5nIHRhbGxpZXMgYW5kIHJlcXVpcmVtZW50cyBmb3IgYSBwcm9wb3NhbC4KLy8gVGhpcyBzdHJ1Y3R1cmUgbWFuYWdlcyB2b3RlIGNvdW50aW5nLCBxdW9ydW0gY2FsY3VsYXRpb24sIGFuZCB2b3Rpbmcgb3V0Y29tZSBkZXRlcm1pbmF0aW9uLgp0eXBlIFByb3Bvc2FsVm90ZVN0YXR1cyBzdHJ1Y3QgewoJeWVhICAgICAgICAgICAgIGludDY0IC8vIFRvdGFsIHdlaWdodCBvZiAieWVzIiB2b3RlcyBjb2xsZWN0ZWQKCW5heSAgICAgICAgICAgICBpbnQ2NCAvLyBUb3RhbCB3ZWlnaHQgb2YgIm5vIiB2b3RlcyBjb2xsZWN0ZWQKCW1heFZvdGluZ1dlaWdodCBpbnQ2NCAvLyBUaGUgbWF4IHZvdGluZyB3ZWlnaHQgYXQgdGhlIHRpbWUgb2YgcHJvcG9zYWwgY3JlYXRpb24KCXF1b3J1bUFtb3VudCAgICBpbnQ2NCAvLyBIb3cgbWFueSB0b3RhbCB2b3RlcyBtdXN0IGJlIGNvbGxlY3RlZCBmb3IgdGhlIHByb3Bvc2FsIHRvIGJlIHZhbGlkCn0KCi8qIEdldHRlciBtZXRob2RzICovCi8vIE1heFZvdGluZ1dlaWdodCByZXR1cm5zIHRoZSBtYXhpbXVtIHZvdGluZyB3ZWlnaHQgY2FwdHVyZWQgZm9yIHRoZSBwcm9wb3NhbC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBtYXhpbXVtIHZvdGluZyB3ZWlnaHQgdXNlZCB3aGVuIGV2YWx1YXRpbmcgdGhlIHByb3Bvc2FsJ3MgcXVvcnVtLgpmdW5jIChwICpQcm9wb3NhbFZvdGVTdGF0dXMpIE1heFZvdGluZ1dlaWdodCgpIGludDY0IHsgcmV0dXJuIHAubWF4Vm90aW5nV2VpZ2h0IH0KCi8vIFF1b3J1bUFtb3VudCByZXR1cm5zIHRoZSB2b3Rpbmcgd2VpZ2h0IHJlcXVpcmVkIGZvciB0aGUgcHJvcG9zYWwgdG8gc2F0aXNmeSBxdW9ydW0uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogbWluaW11bSB0b3RhbCB2b3RlIHdlaWdodCByZXF1aXJlZCBieSB0aGlzIHByb3Bvc2FsLgpmdW5jIChwICpQcm9wb3NhbFZvdGVTdGF0dXMpIFF1b3J1bUFtb3VudCgpIGludDY0IHsgcmV0dXJuIHAucXVvcnVtQW1vdW50IH0KCi8vIFllc1dlaWdodCByZXR1cm5zIHRoZSB0b3RhbCB3ZWlnaHQgb2YgInllcyIgdm90ZXMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogdG90YWwgInllcyIgdm90ZSB3ZWlnaHQKZnVuYyAocCAqUHJvcG9zYWxWb3RlU3RhdHVzKSBZZXNXZWlnaHQoKSBpbnQ2NCB7CglyZXR1cm4gcC55ZWEKfQoKLy8gTm9XZWlnaHQgcmV0dXJucyB0aGUgdG90YWwgd2VpZ2h0IG9mICJubyIgdm90ZXMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogdG90YWwgIm5vIiB2b3RlIHdlaWdodApmdW5jIChwICpQcm9wb3NhbFZvdGVTdGF0dXMpIE5vV2VpZ2h0KCkgaW50NjQgewoJcmV0dXJuIHAubmF5Cn0KCi8qIFNldHRlciBtZXRob2RzICovCi8vIFNldFllc1dlaWdodCByZXBsYWNlcyB0aGUgcHJvcG9zYWwncyBhY2N1bXVsYXRlZCB5ZXMtdm90ZSB3ZWlnaHQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB5ZXM6IHRvdGFsIHdlaWdodCB0byByZWNvcmQgZm9yIGFmZmlybWF0aXZlIHZvdGVzLgpmdW5jIChwICpQcm9wb3NhbFZvdGVTdGF0dXMpIFNldFllc1dlaWdodCh5ZXMgaW50NjQpIHsKCXAueWVhID0geWVzCn0KCi8vIFNldE5vV2VpZ2h0IHJlcGxhY2VzIHRoZSBwcm9wb3NhbCdzIGFjY3VtdWxhdGVkIG5vLXZvdGUgd2VpZ2h0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gbm86IHRvdGFsIHdlaWdodCB0byByZWNvcmQgZm9yIG5lZ2F0aXZlIHZvdGVzLgpmdW5jIChwICpQcm9wb3NhbFZvdGVTdGF0dXMpIFNldE5vV2VpZ2h0KG5vIGludDY0KSB7CglwLm5heSA9IG5vCn0KCi8vIFNldE1heFZvdGluZ1dlaWdodCByZWNvcmRzIHRoZSBwcm9wb3NhbCdzIG1heGltdW0gdm90aW5nLXdlaWdodCBzbmFwc2hvdC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIG1heFZvdGluZ1dlaWdodDogbWF4aW11bSB2b3Rpbmcgd2VpZ2h0IGF2YWlsYWJsZSB3aGVuIHRoZSBwcm9wb3NhbCB3YXMgY3JlYXRlZC4KZnVuYyAocCAqUHJvcG9zYWxWb3RlU3RhdHVzKSBTZXRNYXhWb3RpbmdXZWlnaHQobWF4Vm90aW5nV2VpZ2h0IGludDY0KSB7CglwLm1heFZvdGluZ1dlaWdodCA9IG1heFZvdGluZ1dlaWdodAp9CgovLyBTZXRRdW9ydW1BbW91bnQgcmVjb3JkcyB0aGUgcHJvcG9zYWwncyBxdW9ydW0gcmVxdWlyZW1lbnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBxdW9ydW1BbW91bnQ6IG1pbmltdW0gdG90YWwgdm90ZSB3ZWlnaHQgcmVxdWlyZWQgZm9yIHRoaXMgcHJvcG9zYWwuCmZ1bmMgKHAgKlByb3Bvc2FsVm90ZVN0YXR1cykgU2V0UXVvcnVtQW1vdW50KHF1b3J1bUFtb3VudCBpbnQ2NCkgewoJcC5xdW9ydW1BbW91bnQgPSBxdW9ydW1BbW91bnQKfQoKLy8gTmV3UHJvcG9zYWxWb3RlU3RhdHVzIGNyZWF0ZXMgYSBuZXcgdm90ZSBzdGF0dXMgZm9yIGEgcHJvcG9zYWwuCi8vIEluaXRpYWxpemVzIHZvdGUgdGFsbGllcyB0byB6ZXJvIGFuZCBjYWxjdWxhdGVzIHRoZSBxdW9ydW0gcmVxdWlyZW1lbnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBtYXhWb3RpbmdXZWlnaHQ6IG1heGltdW0gcG9zc2libGUgdm90aW5nIHdlaWdodCBmb3IgdGhpcyBwcm9wb3NhbAovLyAgIC0gcXVvcnVtQW1vdW50OiBxdW9ydW0gYW1vdW50IHJlcXVpcmVkIGZvciBwYXNzYWdlCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqUHJvcG9zYWxWb3RlU3RhdHVzOiBuZXcgdm90ZSBzdGF0dXMgaW5zdGFuY2UKZnVuYyBOZXdQcm9wb3NhbFZvdGVTdGF0dXMoCgltYXhWb3RpbmdXZWlnaHQgaW50NjQsCglxdW9ydW1BbW91bnQgaW50NjQsCikgKlByb3Bvc2FsVm90ZVN0YXR1cyB7CglyZXR1cm4gJlByb3Bvc2FsVm90ZVN0YXR1c3sKCQl5ZWE6ICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgLy8gU3RhcnQgd2l0aCBubyAieWVzIiB2b3RlcwoJCW5heTogICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAvLyBTdGFydCB3aXRoIG5vICJubyIgdm90ZXMKCQltYXhWb3RpbmdXZWlnaHQ6IG1heFZvdGluZ1dlaWdodCwgLy8gU2V0IG1heGltdW0gcG9zc2libGUgdm90ZXMKCQlxdW9ydW1BbW91bnQ6ICAgIHF1b3J1bUFtb3VudCwgICAgLy8gU2V0IHJlcXVpcmVkIHZvdGVzIGZvciBwYXNzYWdlCgl9Cn0KCi8vIENsb25lIHJldHVybnMgYW4gaW5kZXBlbmRlbnQgY29weSBvZiB0aGUgdm90ZSBzdGF0dXMsIG9yIG5pbCB3aGVuIHRoZSByZWNlaXZlciBpcyBuaWwuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqUHJvcG9zYWxWb3RlU3RhdHVzOiBjb3BpZWQgdm90ZSB0YWxsaWVzIGFuZCByZXF1aXJlbWVudHMsIG9yIG5pbCBmb3IgYSBuaWwgcmVjZWl2ZXIuCmZ1bmMgKHAgKlByb3Bvc2FsVm90ZVN0YXR1cykgQ2xvbmUoKSAqUHJvcG9zYWxWb3RlU3RhdHVzIHsKCWlmIHAgPT0gbmlsIHsKCQlyZXR1cm4gbmlsCgl9CgoJcmV0dXJuICZQcm9wb3NhbFZvdGVTdGF0dXN7CgkJeWVhOiAgICAgICAgICAgICBwLnllYSwKCQluYXk6ICAgICAgICAgICAgIHAubmF5LAoJCW1heFZvdGluZ1dlaWdodDogcC5tYXhWb3RpbmdXZWlnaHQsCgkJcXVvcnVtQW1vdW50OiAgICBwLnF1b3J1bUFtb3VudCwKCX0KfQoa9i0KCXByb3h5LmdubxLoLXBhY2thZ2UgZ292ZXJuYW5jZQoKLy8gUHJvcG9zZVRleHQgY3JlYXRlcyBhIG5ldyB0ZXh0IHByb3Bvc2FsIHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbS4KLy8gICAtIHRpdGxlOiBUaGUgdGl0bGUgb2YgdGhlIHByb3Bvc2FsLgovLyAgIC0gZGVzY3JpcHRpb246IFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcG9zYWwuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwcm9wb3NhbElkOiBUaGUgSUQgb2YgdGhlIHByb3Bvc2FsLgovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBHb3Zlcm5hbmNlIGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIFByb3Bvc2VUZXh0KAoJY3VyIHJlYWxtLAoJdGl0bGUgc3RyaW5nLAoJZGVzY3JpcHRpb24gc3RyaW5nLAopIGludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLlByb3Bvc2VUZXh0KAoJCTAsIGN1ciwKCQl0aXRsZSwKCQlkZXNjcmlwdGlvbiwKCSkKfQoKLy8gUHJvcG9zZUNvbW11bml0eVBvb2xTcGVuZCBjcmVhdGVzIGEgQ29tbXVuaXR5UG9vbFNwZW5kIHByb3Bvc2FsIHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuCi8vIFRoZSB0cmFuc2ZlciBpcyBhdHRlbXB0ZWQgd2hlbiBhbiBhcHByb3ZlZCBwcm9wb3NhbCBleGVjdXRlcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gdGl0bGU6IFRoZSB0aXRsZSBvZiB0aGUgcHJvcG9zYWwuCi8vICAgLSBkZXNjcmlwdGlvbjogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9wb3NhbC4KLy8gICAtIHRvOiBBIHZhbGlkIGFkZHJlc3MgdG8gcmVjZWl2ZSB0aGUgc3BlbnQgdG9rZW4uCi8vICAgLSB0b2tlblBhdGg6IEEgcmVnaXN0ZXJlZCB0b2tlbiBwYXRoLgovLyAgIC0gYW1vdW50OiBBIHN0cmljdGx5IHBvc2l0aXZlIGFtb3VudCBpbiB0aGUgdG9rZW4ncyBzbWFsbGVzdCB1bml0LgovLwovLyBUaGUgY29tbXVuaXR5LXBvb2wgYmFsYW5jZSBpcyBjaGVja2VkIGF0IGV4ZWN1dGlvbiwgbm90IHByb3Bvc2FsIGNyZWF0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcHJvcG9zYWxJZDogVGhlIElEIG9mIHRoZSBwcm9wb3NhbC4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgR292ZXJuYW5jZSBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBQcm9wb3NlQ29tbXVuaXR5UG9vbFNwZW5kKAoJY3VyIHJlYWxtLAoJdGl0bGUgc3RyaW5nLAoJZGVzY3JpcHRpb24gc3RyaW5nLAoJdG8gYWRkcmVzcywKCXRva2VuUGF0aCBzdHJpbmcsCglhbW91bnQgaW50NjQsCikgaW50NjQgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuUHJvcG9zZUNvbW11bml0eVBvb2xTcGVuZCgKCQkwLCBjdXIsCgkJdGl0bGUsCgkJZGVzY3JpcHRpb24sCgkJdG8sCgkJdG9rZW5QYXRoLAoJCWFtb3VudCwKCSkKfQoKLy8gUHJvcG9zZVBhcmFtZXRlckNoYW5nZSBjcmVhdGVzIGEgUGFyYW1ldGVyQ2hhbmdlIHByb3Bvc2FsIHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbS4KLy8gICAtIHRpdGxlOiBUaGUgdGl0bGUgb2YgdGhlIHByb3Bvc2FsLgovLyAgIC0gZGVzY3JpcHRpb246IFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcG9zYWwuCi8vICAgLSBudW1Ub0V4ZWN1dGU6IFRoZSBudW1iZXIgb2YgY2hhbmdlcyB0byBleGVjdXRlLgovLyAgIC0gZXhlY3V0aW9uczogVGhlIGxpc3Qgb2YgY2hhbmdlcyB0byBleGVjdXRlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcHJvcG9zYWxJZDogVGhlIElEIG9mIHRoZSBwcm9wb3NhbC4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgR292ZXJuYW5jZSBoYWx0IHNjb3BlIGlzIGFjdGl2ZSwgZXhjZXB0IGZvciBoYWx0LXJlY292ZXJ5IHByb3Bvc2FscyB0aGF0IG9ubHkgdGFyZ2V0IHRoZSBoYWx0IHJlYWxtLgpmdW5jIFByb3Bvc2VQYXJhbWV0ZXJDaGFuZ2UoCgljdXIgcmVhbG0sCgl0aXRsZSBzdHJpbmcsCglkZXNjcmlwdGlvbiBzdHJpbmcsCgludW1Ub0V4ZWN1dGUgaW50NjQsCglleGVjdXRpb25zIHN0cmluZywKKSBpbnQ2NCB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5Qcm9wb3NlUGFyYW1ldGVyQ2hhbmdlKAoJCTAsIGN1ciwKCQl0aXRsZSwKCQlkZXNjcmlwdGlvbiwKCQludW1Ub0V4ZWN1dGUsCgkJZXhlY3V0aW9ucywKCSkKfQoKLy8gVm90ZSBhbGxvd3MgYSB1c2VyIHRvIHZvdGUgb24gYSBnaXZlbiBwcm9wb3NhbC4KLy8KLy8gVGhlIHByb3Bvc2FsJ3MgdGltZXN0YW1wLWJhc2VkIHNtb290aGluZyBjYWxjdWxhdGlvbiBkZXRlcm1pbmVzIHRoZSBhcHBsaWVkCi8vIHdlaWdodC4gQSB2b3RlIGNhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIGl0IGlzIHJlY29yZGVkLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBwcm9wb3NhbElkOiBUaGUgSUQgb2YgdGhlIHByb3Bvc2FsIHRvIHZvdGUuCi8vICAgLSB5ZXM6IFRoZSBmbGFnIHRvIHZvdGUgYXMgeWVzIG9yIG5vdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHZvdGVXZWlnaHQ6IFRoZSBjYWxsZXIncyBjYWxjdWxhdGVkIHZvdGUgd2VpZ2h0LCBmb3JtYXR0ZWQgYXMgYSBkZWNpbWFsIHN0cmluZy4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgR292ZXJuYW5jZSBoYWx0IHNjb3BlIGlzIGFjdGl2ZSwgZXhjZXB0IGZvciBoYWx0LXJlY292ZXJ5IHByb3Bvc2FscyB0aGF0IG9ubHkgdGFyZ2V0IHRoZSBoYWx0IHJlYWxtLgpmdW5jIFZvdGUoCgljdXIgcmVhbG0sCglwcm9wb3NhbElkIGludDY0LAoJeWVzIGJvb2wsCikgc3RyaW5nIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLlZvdGUoCgkJMCwgY3VyLAoJCXByb3Bvc2FsSWQsCgkJeWVzLAoJKQp9CgovLyBFeGVjdXRlIGV4ZWN1dGVzIHRoZSBnaXZlbiBwcm9wb3NhbC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gcHJvcG9zYWxJZDogVGhlIElEIG9mIHRoZSBwcm9wb3NhbCB0byBleGVjdXRlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcHJvcG9zYWxJZDogVGhlIElEIG9mIHRoZSBwcm9wb3NhbC4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgR292ZXJuYW5jZSBoYWx0IHNjb3BlIGlzIGFjdGl2ZSwgZXhjZXB0IGZvciBoYWx0LXJlY292ZXJ5IHByb3Bvc2FscyB0aGF0IG9ubHkgdGFyZ2V0IHRoZSBoYWx0IHJlYWxtLgpmdW5jIEV4ZWN1dGUoCgljdXIgcmVhbG0sCglwcm9wb3NhbElkIGludDY0LAopIGludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkV4ZWN1dGUoMCwgY3VyLCBwcm9wb3NhbElkKQp9CgovLyBDYW5jZWwgY2FuY2VscyB0aGUgcHJvcG9zYWwgd2l0aCB0aGUgZ2l2ZW4gSUQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbS4KLy8gICAtIHByb3Bvc2FsSWQ6IFRoZSBJRCBvZiB0aGUgcHJvcG9zYWwgdG8gY2FuY2VsLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcHJvcG9zYWxJZDogVGhlIElEIG9mIHRoZSBwcm9wb3NhbC4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgR292ZXJuYW5jZSBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBDYW5jZWwoCgljdXIgcmVhbG0sCglwcm9wb3NhbElkIGludDY0LAopIGludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkNhbmNlbCgwLCBjdXIsIHByb3Bvc2FsSWQpCn0KCi8vIFJlbW92ZUluYWN0aXZlUHJvcG9zYWxGcm9tSW5kZXggcmVtb3ZlcyBhbiBpbmFjdGl2ZSBwcm9wb3NhbCBmcm9tIHRoZQovLyB0aW1lc3RhbXAtb3JkZXJlZCBpbmRleCB3aXRob3V0IGRlbGV0aW5nIGl0cyBwcm9wb3NhbCBvciB2b3RpbmcgaGlzdG9yeS4KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gcHJvcG9zYWxJRDogSWRlbnRpZmllciBvZiB0aGUgaW5hY3RpdmUgcHJvcG9zYWwgdG8gcmVtb3ZlIGZyb20gdGhlIGFjdGl2ZSBpbmRleC4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgR292ZXJuYW5jZSBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBSZW1vdmVJbmFjdGl2ZVByb3Bvc2FsRnJvbUluZGV4KGN1ciByZWFsbSwgcHJvcG9zYWxJRCBpbnQ2NCkgewoJZ2V0SW1wbGVtZW50YXRpb24oKS5SZW1vdmVJbmFjdGl2ZVByb3Bvc2FsRnJvbUluZGV4KDAsIGN1ciwgcHJvcG9zYWxJRCkKfQoKLy8gUmVjb25maWd1cmUgdXBkYXRlcyB0aGUgZ292ZXJuYW5jZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCi8vIE9ubHkgY2FsbGFibGUgYnkgYWRtaW4gb3IgZ292ZXJuYW5jZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gdm90aW5nU3RhcnREZWxheTogZGVsYXkgYmVmb3JlIHZvdGluZyBzdGFydHMgKHNlY29uZHMpCi8vICAgLSB2b3RpbmdQZXJpb2Q6IHZvdGluZyBkdXJhdGlvbiAoc2Vjb25kcykKLy8gICAtIHZvdGluZ1dlaWdodFNtb290aGluZ0R1cmF0aW9uOiB3ZWlnaHQgc21vb3RoaW5nIGR1cmF0aW9uIChzZWNvbmRzKQovLyAgIC0gcXVvcnVtOiBtaW5pbXVtIHZvdGluZyB3ZWlnaHQgcmVxdWlyZWQgKHBlcmNlbnRhZ2UpCi8vICAgLSBwcm9wb3NhbENyZWF0aW9uVGhyZXNob2xkOiBtaW5pbXVtIHdlaWdodCB0byBjcmVhdGUgcHJvcG9zYWwKLy8gICAtIGV4ZWN1dGlvbkRlbGF5OiBkZWxheSBiZWZvcmUgZXhlY3V0aW9uIChzZWNvbmRzKQovLyAgIC0gZXhlY3V0aW9uV2luZG93OiBleGVjdXRpb24gdGltZSB3aW5kb3cgKHNlY29uZHMpCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogbmV3IGNvbmZpZ3VyYXRpb24gdmVyc2lvbgovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBHb3Zlcm5hbmNlIGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIFJlY29uZmlndXJlKAoJY3VyIHJlYWxtLAoJdm90aW5nU3RhcnREZWxheSBpbnQ2NCwKCXZvdGluZ1BlcmlvZCBpbnQ2NCwKCXZvdGluZ1dlaWdodFNtb290aGluZ0R1cmF0aW9uIGludDY0LAoJcXVvcnVtIGludDY0LAoJcHJvcG9zYWxDcmVhdGlvblRocmVzaG9sZCBpbnQ2NCwKCWV4ZWN1dGlvbkRlbGF5IGludDY0LAoJZXhlY3V0aW9uV2luZG93IGludDY0LAopIGludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLlJlY29uZmlndXJlKAoJCTAsIGN1ciwKCQl2b3RpbmdTdGFydERlbGF5LAoJCXZvdGluZ1BlcmlvZCwKCQl2b3RpbmdXZWlnaHRTbW9vdGhpbmdEdXJhdGlvbiwKCQlxdW9ydW0sCgkJcHJvcG9zYWxDcmVhdGlvblRocmVzaG9sZCwKCQlleGVjdXRpb25EZWxheSwKCQlleGVjdXRpb25XaW5kb3csCgkpCn0KGrABCgpyZW5kZXIuZ25vEqEBcGFja2FnZSBnb3Zlcm5hbmNlCgovLyBSZW5kZXIgZGVsZWdhdGVzIHdlYiByZW5kZXJpbmcgdG8gdGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbi4KZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5SZW5kZXIocGF0aCkKfQoanwsKCXN0YXRlLmdubxKRC3BhY2thZ2UgZ292ZXJuYW5jZQoKaW1wb3J0ICgKCSJlcnJvcnMiCgoJXyAiZ25vLmxhbmQvci9nbm9zd2FwL3JiYWMvdjEiIC8vIGluaXRpYWxpemUgcmVhZGFibGUgY29udHJhY3Qgcm9sZShzKQoKCSJnbm8ubGFuZC9wL2dub3N3YXAvc3RvcmUvdjEiCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3ZlcnNpb25fbWFuYWdlci92MSIKKQoKY29uc3QgRXJyU3Bvb2ZlZFJlYWxtID0gInJsbSBkb2VzIG5vdCBtYXRjaCB0aGUgY3VycmVudCBjcm9zc2luZyBmcmFtZSIKCnZhciAoCgkvLyBjdXJyZW50QWRkcmVzcyBhbmQgZG9tYWluUGF0aCBkZXNjcmliZSB0aGUgZ292ZXJuYW5jZSByZWFsbSBpdHNlbGYuCgkvLyBUaGV5IGFyZSBjYXB0dXJlZCBmcm9tIHRoZSBgY3VyIHJlYWxtYCBwYXJhbWV0ZXIgaW4gaW5pdChjdXIgcmVhbG0pLAoJLy8gd2hpY2ggcmVzb2x2ZXMgdG8gdGhpcyBnb3Zlcm5hbmNlIGRvbWFpbiByZWFsbS4KCWN1cnJlbnRBZGRyZXNzIGFkZHJlc3MKCWRvbWFpblBhdGggICAgIHN0cmluZwoKCWt2U3RvcmUgc3RvcmUuS1ZTdG9yZQoKCXZlcnNpb25NYW5hZ2VyIHZlcnNpb25fbWFuYWdlci5WZXJzaW9uTWFuYWdlcgoJaW1wbGVtZW50YXRpb24gSUdvdmVybmFuY2UKKQoKZnVuYyBpbml0KGN1ciByZWFsbSkgewoJY3VycmVudEFkZHJlc3MgPSBjdXIuQWRkcmVzcygpCglkb21haW5QYXRoID0gY3VyLlBrZ1BhdGgoKQoKCWt2U3RvcmUgPSBzdG9yZS5OZXdLVlN0b3JlKGN1cnJlbnRBZGRyZXNzKQoJdmVyc2lvbk1hbmFnZXIgPSB2ZXJzaW9uX21hbmFnZXIuTmV3VmVyc2lvbk1hbmFnZXIoZG9tYWluUGF0aCwga3ZTdG9yZSwgaW5pdGlhbGl6ZURvbWFpblN0b3JlKQoKCWltcGxlbWVudGF0aW9uID0gbmlsCn0KCmZ1bmMgaW5pdGlhbGl6ZURvbWFpblN0b3JlKF8gaW50LCBybG0gcmVhbG0sIGt2U3RvcmUgc3RvcmUuS1ZTdG9yZSkgYW55IHsKCXJldHVybiBOZXdHb3Zlcm5hbmNlU3RvcmUoa3ZTdG9yZSkKfQoKZnVuYyBnZXRJbXBsZW1lbnRhdGlvbigpIElHb3Zlcm5hbmNlIHsKCWlmIGltcGxlbWVudGF0aW9uID09IG5pbCB7CgkJcGFuaWMoImltcGxlbWVudGF0aW9uIGlzIG5vdCBpbml0aWFsaXplZCIpCgl9CgoJcmV0dXJuIGltcGxlbWVudGF0aW9uCn0KCmZ1bmMgdXBkYXRlSW1wbGVtZW50YXRpb24oKSBlcnJvciB7CglyZXN1bHQgOj0gdmVyc2lvbk1hbmFnZXIuR2V0Q3VycmVudEltcGxlbWVudGF0aW9uKCkKCWlmIHJlc3VsdCA9PSBuaWwgewoJCXJldHVybiBlcnJvcnMuTmV3KCJpbXBsZW1lbnRhdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQiKQoJfQoKCWltcGwsIG9rIDo9IHJlc3VsdC4oSUdvdmVybmFuY2UpCglpZiAhb2sgewoJCXJldHVybiBlcnJvcnMuTmV3KCJpbXBsIGlzIG5vdCBhbiBJR292ZXJuYW5jZSIpCgl9CgoJaW1wbGVtZW50YXRpb24gPSBpbXBsCgoJcmV0dXJuIG5pbAp9ChqkpgEKCXN0b3JlLmdubxKVpgFwYWNrYWdlIGdvdmVybmFuY2UKCmltcG9ydCAoCgkiZXJyb3JzIgoJInN0cmNvbnYiCgoJImduby5sYW5kL3AvZ25vc3dhcC9zdG9yZS92MSIKCWJwdHJlZSAiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCnR5cGUgU3RvcmVLZXkgc3RyaW5nCgovLyBTdHJpbmcgcmV0dXJucyB0aGUgc3RvcmFnZS1rZXkgdGV4dCByZXByZXNlbnRlZCBieSBzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RyaW5nOiB1bmRlcmx5aW5nIHN0cmluZyB1c2VkIGFzIHRoZSBLVi1zdG9yZSBrZXkKZnVuYyAocyBTdG9yZUtleSkgU3RyaW5nKCkgc3RyaW5nIHsKCXJldHVybiBzdHJpbmcocykKfQoKY29uc3QgKAoJU3RvcmVLZXlDb25maWdDb3VudGVyICAgU3RvcmVLZXkgPSAiY29uZmlnQ291bnRlciIgICAvLyBDb25maWcgdmVyc2lvbiBjb3VudGVyCglTdG9yZUtleVByb3Bvc2FsQ291bnRlciBTdG9yZUtleSA9ICJwcm9wb3NhbENvdW50ZXIiIC8vIFByb3Bvc2FsIElEIGNvdW50ZXIKCglTdG9yZUtleUNvbmZpZ3MgU3RvcmVLZXkgPSAiY29uZmlncyIgLy8gQ29uZmlndXJhdGlvbnMgQlBUcmVlCgoJU3RvcmVLZXlQcm9wb3NhbHMgU3RvcmVLZXkgPSAicHJvcG9zYWxzIiAvLyBQcm9wb3NhbHMgQlBUcmVlCgoJU3RvcmVLZXlBY3RpdmVQcm9wb3NhbHNCeVNuYXBzaG90IFN0b3JlS2V5ID0gImFjdGl2ZVByb3Bvc2Fsc0J5U25hcHNob3QiCgoJU3RvcmVLZXlQcm9wb3NhbFVzZXJWb3RpbmdJbmZvcyBTdG9yZUtleSA9ICJwcm9wb3NhbFVzZXJWb3RpbmdJbmZvcyIgLy8gUHJvcG9zYWwgdm90aW5nIGluZm9zIEJQVHJlZQoKCVN0b3JlS2V5VXNlclByb3Bvc2FscyBTdG9yZUtleSA9ICJ1c2VyUHJvcG9zYWxzIiAvLyBVc2VyIHByb3Bvc2FscyBtYXBwaW5nIEJQVHJlZQopCgp0eXBlIGdvdmVybmFuY2VTdG9yZSBzdHJ1Y3QgewoJa3ZTdG9yZSBzdG9yZS5LVlN0b3JlCn0KCi8vIENvdW50ZXIgbWV0aG9kcwovLyBIYXNDb25maWdDb3VudGVyU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBjb25maWd1cmF0aW9uLXZlcnNpb24gY291bnRlcgovLyBpcyBwcmVzZW50IGluIHRoZSBLViBzdG9yZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBjb3VudGVyIHN0b3JhZ2Uga2V5IGV4aXN0cwpmdW5jIChzICpnb3Zlcm5hbmNlU3RvcmUpIEhhc0NvbmZpZ0NvdW50ZXJTdG9yZUtleSgpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlDb25maWdDb3VudGVyLlN0cmluZygpKQp9CgovLyBHZXRDb25maWdDb3VudGVyIHJldHJpZXZlcyB0aGUgcGVyc2lzdGVkIGNvbmZpZ3VyYXRpb24tdmVyc2lvbiBjb3VudGVyLgovLyBTdG9yYWdlIG9yIHR5cGUtY2FzdCBmYWlsdXJlcyBwYW5pYy4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpDb3VudGVyOiBjb3VudGVyIHN0b3JlZCB1bmRlciB0aGUgY29uZmlndXJhdGlvbiBjb3VudGVyIGtleQpmdW5jIChzICpnb3Zlcm5hbmNlU3RvcmUpIEdldENvbmZpZ0NvdW50ZXIoKSAqQ291bnRlciB7CglyZXN1bHQsIGVyciA6PSBzLmt2U3RvcmUuR2V0KFN0b3JlS2V5Q29uZmlnQ291bnRlci5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgljb3VudGVyLCBvayA6PSByZXN1bHQuKCpDb3VudGVyKQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byAqQ291bnRlcjogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiBjb3VudGVyCn0KCi8vIFNldENvbmZpZ0NvdW50ZXIgcGVyc2lzdHMgdGhlIGNvbmZpZ3VyYXRpb24tdmVyc2lvbiBjb3VudGVyIGFmdGVyIGNoZWNraW5nCi8vIHRoZSBzdXBwbGllZCByZWFsbSBjb250ZXh0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogbGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBhdXRob3JpemVkIHN0b3JlIGNhbGw7IGNhbGxlcnMgcGFzcyAwCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBzYXRpc2Z5IHJsbS5Jc0N1cnJlbnQoKSBvciBFcnJTcG9vZmVkUmVhbG0gaXMgcmV0dXJuZWQKLy8gICAtIGNvdW50ZXI6IGNvdW50ZXIgdmFsdWUgdG8gcGVyc2lzdCB1bmRlciB0aGUgY29uZmlndXJhdGlvbiBjb3VudGVyIGtleQovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IG5pbCB3aGVuIHRoZSBjb3VudGVyIGlzIHBlcnNpc3RlZDsgRXJyU3Bvb2ZlZFJlYWxtIG9yIHRoZSBLVi1zdG9yZSB3cml0ZSBlcnJvciBvdGhlcndpc2UKZnVuYyAocyAqZ292ZXJuYW5jZVN0b3JlKSBTZXRDb25maWdDb3VudGVyKF8gaW50LCBybG0gcmVhbG0sIGNvdW50ZXIgKkNvdW50ZXIpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5Q29uZmlnQ291bnRlci5TdHJpbmcoKSwgY291bnRlcikKfQoKLy8gSGFzUHJvcG9zYWxDb3VudGVyU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBwcm9wb3NhbC1JRCBjb3VudGVyIGlzCi8vIHByZXNlbnQgaW4gdGhlIEtWIHN0b3JlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRoZSBwcm9wb3NhbCBjb3VudGVyIHN0b3JhZ2Uga2V5IGV4aXN0cwpmdW5jIChzICpnb3Zlcm5hbmNlU3RvcmUpIEhhc1Byb3Bvc2FsQ291bnRlclN0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleVByb3Bvc2FsQ291bnRlci5TdHJpbmcoKSkKfQoKLy8gR2V0UHJvcG9zYWxDb3VudGVyIHJldHJpZXZlcyB0aGUgcGVyc2lzdGVkIHByb3Bvc2FsLUlEIGNvdW50ZXIuCi8vIFN0b3JhZ2Ugb3IgdHlwZS1jYXN0IGZhaWx1cmVzIHBhbmljLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKkNvdW50ZXI6IGNvdW50ZXIgc3RvcmVkIHVuZGVyIHRoZSBwcm9wb3NhbCBjb3VudGVyIGtleQpmdW5jIChzICpnb3Zlcm5hbmNlU3RvcmUpIEdldFByb3Bvc2FsQ291bnRlcigpICpDb3VudGVyIHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlQcm9wb3NhbENvdW50ZXIuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJY291bnRlciwgb2sgOj0gcmVzdWx0LigqQ291bnRlcikKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gaW50NjQ6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gY291bnRlcgp9CgovLyBTZXRQcm9wb3NhbENvdW50ZXIgcGVyc2lzdHMgdGhlIHByb3Bvc2FsLUlEIGNvdW50ZXIgYWZ0ZXIgY2hlY2tpbmcgdGhlCi8vIHN1cHBsaWVkIHJlYWxtIGNvbnRleHQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgY2FsbDsgY2FsbGVycyBwYXNzIDAKLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IHNhdGlzZnkgcmxtLklzQ3VycmVudCgpIG9yIEVyclNwb29mZWRSZWFsbSBpcyByZXR1cm5lZAovLyAgIC0gY291bnRlcjogY291bnRlciB2YWx1ZSB0byBwZXJzaXN0IHVuZGVyIHRoZSBwcm9wb3NhbCBjb3VudGVyIGtleQovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IG5pbCB3aGVuIHRoZSBjb3VudGVyIGlzIHBlcnNpc3RlZDsgRXJyU3Bvb2ZlZFJlYWxtIG9yIHRoZSBLVi1zdG9yZSB3cml0ZSBlcnJvciBvdGhlcndpc2UKZnVuYyAocyAqZ292ZXJuYW5jZVN0b3JlKSBTZXRQcm9wb3NhbENvdW50ZXIoXyBpbnQsIHJsbSByZWFsbSwgY291bnRlciAqQ291bnRlcikgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlQcm9wb3NhbENvdW50ZXIuU3RyaW5nKCksIGNvdW50ZXIpCn0KCi8vIENvbmZpZ3MgbWV0aG9kcwovLyBIYXNDb25maWdzU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBjb25maWd1cmF0aW9ucyB0cmVlIGlzIHByZXNlbnQgaW4gdGhlCi8vIEtWIHN0b3JlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRoZSBjb25maWd1cmF0aW9ucyBzdG9yYWdlIGtleSBleGlzdHMKZnVuYyAocyAqZ292ZXJuYW5jZVN0b3JlKSBIYXNDb25maWdzU3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5Q29uZmlncy5TdHJpbmcoKSkKfQoKLy8gR2V0Q29uZmlncyByZXRyaWV2ZXMgdGhlIHBlcnNpc3RlZCBjb25maWd1cmF0aW9ucyB0cmVlLgovLyBTdG9yYWdlIG9yIHR5cGUtY2FzdCBmYWlsdXJlcyBwYW5pYy4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpicHRyZWUuQlBUcmVlOiB0cmVlIGNvbnRhaW5pbmcgZ292ZXJuYW5jZSBjb25maWd1cmF0aW9ucyBrZXllZCBieSB2ZXJzaW9uCmZ1bmMgKHMgKmdvdmVybmFuY2VTdG9yZSkgR2V0Q29uZmlncygpICpicHRyZWUuQlBUcmVlIHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlDb25maWdzLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCWNvbmZpZ3MsIG9rIDo9IHJlc3VsdC4oKmJwdHJlZS5CUFRyZWUpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvICpicHRyZWUuQlBUcmVlOiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIGNvbmZpZ3MKfQoKLy8gU2V0Q29uZmlncyBwZXJzaXN0cyB0aGUgY29uZmlndXJhdGlvbnMgdHJlZSBhZnRlciBjaGVja2luZyB0aGUgc3VwcGxpZWQKLy8gcmVhbG0gY29udGV4dC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGxlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciB0aGUgYXV0aG9yaXplZCBzdG9yZSBjYWxsOyBjYWxsZXJzIHBhc3MgMAovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IGl0IG11c3Qgc2F0aXNmeSBybG0uSXNDdXJyZW50KCkgb3IgRXJyU3Bvb2ZlZFJlYWxtIGlzIHJldHVybmVkCi8vICAgLSBjb25maWdzOiBjb25maWd1cmF0aW9ucyB0cmVlIHRvIHBlcnNpc3QKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgd2hlbiB0aGUgdHJlZSBpcyBwZXJzaXN0ZWQ7IEVyclNwb29mZWRSZWFsbSBvciB0aGUgS1Ytc3RvcmUgd3JpdGUgZXJyb3Igb3RoZXJ3aXNlCmZ1bmMgKHMgKmdvdmVybmFuY2VTdG9yZSkgU2V0Q29uZmlncyhfIGludCwgcmxtIHJlYWxtLCBjb25maWdzICpicHRyZWUuQlBUcmVlKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleUNvbmZpZ3MuU3RyaW5nKCksIGNvbmZpZ3MpCn0KCi8vIEdldENvbmZpZyByZXRyaWV2ZXMgb25lIGdvdmVybmFuY2UgY29uZmlndXJhdGlvbiBieSB2ZXJzaW9uLgovLyBBIG1pc3NpbmcgdmVyc2lvbiByZXR1cm5zIHRoZSB6ZXJvIENvbmZpZyBhbmQgZmFsc2UuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB2ZXJzaW9uOiBjb25maWd1cmF0aW9uIHZlcnNpb24gdXNlZCB0byBmb3JtIHRoZSB0cmVlIGtleQovLwovLyBSZXR1cm5zOgovLyAgIC0gQ29uZmlnOiBjb25maWd1cmF0aW9uIHN0b3JlZCBmb3IgdmVyc2lvbiwgb3IgemVybyBDb25maWcgd2hlbiBhYnNlbnQKLy8gICAtIGJvb2w6IHRydWUgd2hlbiB2ZXJzaW9uIHdhcyBmb3VuZDsgZmFsc2Ugd2hlbiBubyBjb25maWd1cmF0aW9uIGlzIHN0b3JlZApmdW5jIChzICpnb3Zlcm5hbmNlU3RvcmUpIEdldENvbmZpZyh2ZXJzaW9uIGludDY0KSAoQ29uZmlnLCBib29sKSB7Cgljb25maWdzIDo9IHMuR2V0Q29uZmlncygpCglyZXN1bHQgOj0gY29uZmlncy5HZXQoZm9ybWF0SW50NjRLZXkodmVyc2lvbikpCglpZiByZXN1bHQgPT0gbmlsIHsKCQlyZXR1cm4gQ29uZmlne30sIGZhbHNlCgl9CgoJY29uZmlnLCBvayA6PSByZXN1bHQuKENvbmZpZykKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gQ29uZmlnOiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIGNvbmZpZywgdHJ1ZQp9CgovLyBTZXRDb25maWcgc3RvcmVzIGNvbmZpZyB1bmRlciB2ZXJzaW9uIGFmdGVyIGNoZWNraW5nIHRoZSBzdXBwbGllZCByZWFsbQovLyBjb250ZXh0IGFuZCB0aGUgY29uZmlndXJhdGlvbnMgc3RvcmFnZSBrZXkuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgY2FsbDsgY2FsbGVycyBwYXNzIDAKLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IHNhdGlzZnkgcmxtLklzQ3VycmVudCgpIG9yIEVyclNwb29mZWRSZWFsbSBpcyByZXR1cm5lZAovLyAgIC0gdmVyc2lvbjogY29uZmlndXJhdGlvbiB2ZXJzaW9uIHVzZWQgYXMgdGhlIHRyZWUga2V5Ci8vICAgLSBjb25maWc6IGNvbmZpZ3VyYXRpb24gdmFsdWUgdG8gc3RvcmUgZm9yIHZlcnNpb24KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgd2hlbiBjb25maWcgaXMgc3RvcmVkOyBhbiBhdXRob3JpemF0aW9uLCBtaXNzaW5nLWtleSwgb3IgS1Ytc3RvcmUgZXJyb3Igb3RoZXJ3aXNlCmZ1bmMgKHMgKmdvdmVybmFuY2VTdG9yZSkgU2V0Q29uZmlnKF8gaW50LCBybG0gcmVhbG0sIHZlcnNpb24gaW50NjQsIGNvbmZpZyBDb25maWcpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglpZiAhcy5IYXNDb25maWdzU3RvcmVLZXkoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoImNvbmZpZ3Mgc3RvcmUga2V5IG5vdCBmb3VuZCIpCgl9CgoJY29uZmlncyA6PSBzLkdldENvbmZpZ3MoKQoJY29uZmlncy5TZXQoZm9ybWF0SW50NjRLZXkodmVyc2lvbiksIGNvbmZpZykKCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5Q29uZmlncy5TdHJpbmcoKSwgY29uZmlncykKfQoKLy8gUHJvcG9zYWxzIG1ldGhvZHMKLy8gSGFzUHJvcG9zYWxzU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBwcm9wb3NhbHMgdHJlZSBpcyBwcmVzZW50IGluIHRoZSBLVgovLyBzdG9yZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgd2hlbiB0aGUgcHJvcG9zYWxzIHN0b3JhZ2Uga2V5IGV4aXN0cwpmdW5jIChzICpnb3Zlcm5hbmNlU3RvcmUpIEhhc1Byb3Bvc2Fsc1N0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleVByb3Bvc2Fscy5TdHJpbmcoKSkKfQoKLy8gR2V0UHJvcG9zYWxzIHJldHJpZXZlcyB0aGUgcGVyc2lzdGVkIHByb3Bvc2FscyB0cmVlLgovLyBTdG9yYWdlIG9yIHR5cGUtY2FzdCBmYWlsdXJlcyBwYW5pYy4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpicHRyZWUuQlBUcmVlOiB0cmVlIGNvbnRhaW5pbmcgcHJvcG9zYWxzIGtleWVkIGJ5IGZvcm1hdHRlZCBwcm9wb3NhbCBJRApmdW5jIChzICpnb3Zlcm5hbmNlU3RvcmUpIEdldFByb3Bvc2FscygpICpicHRyZWUuQlBUcmVlIHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlQcm9wb3NhbHMuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJcHJvcG9zYWxzLCBvayA6PSByZXN1bHQuKCpicHRyZWUuQlBUcmVlKQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byAqYnB0cmVlLkJQVHJlZTogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiBwcm9wb3NhbHMKfQoKLy8gU2V0UHJvcG9zYWxzIHBlcnNpc3RzIHRoZSBwcm9wb3NhbHMgdHJlZSBhZnRlciBjaGVja2luZyB0aGUgc3VwcGxpZWQgcmVhbG0KLy8gY29udGV4dC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGxlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciB0aGUgYXV0aG9yaXplZCBzdG9yZSBjYWxsOyBjYWxsZXJzIHBhc3MgMAovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IGl0IG11c3Qgc2F0aXNmeSBybG0uSXNDdXJyZW50KCkgb3IgRXJyU3Bvb2ZlZFJlYWxtIGlzIHJldHVybmVkCi8vICAgLSBwcm9wb3NhbHM6IHByb3Bvc2FscyB0cmVlIHRvIHBlcnNpc3QKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgd2hlbiB0aGUgdHJlZSBpcyBwZXJzaXN0ZWQ7IEVyclNwb29mZWRSZWFsbSBvciB0aGUgS1Ytc3RvcmUgd3JpdGUgZXJyb3Igb3RoZXJ3aXNlCmZ1bmMgKHMgKmdvdmVybmFuY2VTdG9yZSkgU2V0UHJvcG9zYWxzKF8gaW50LCBybG0gcmVhbG0sIHByb3Bvc2FscyAqYnB0cmVlLkJQVHJlZSkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlQcm9wb3NhbHMuU3RyaW5nKCksIHByb3Bvc2FscykKfQoKLy8gR2V0UHJvcG9zYWwgcmV0cmlldmVzIGEgcHJvcG9zYWwgYnkgaXRzIGlkZW50aWZpZXIuCi8vIEEgbWlzc2luZyBlbnRyeSBvciBhIHZhbHVlIG9mIHRoZSB3cm9uZyB0eXBlIHJldHVybnMgbmlsIGFuZCBmYWxzZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb3Bvc2FsSUQ6IHByb3Bvc2FsIGlkZW50aWZpZXIgdXNlZCB0byBmb3JtIHRoZSB0cmVlIGtleQovLwovLyBSZXR1cm5zOgovLyAgIC0gKlByb3Bvc2FsOiBzdG9yZWQgcHJvcG9zYWwsIG9yIG5pbCB3aGVuIGFic2VudCBvciBub3QgYSBQcm9wb3NhbAovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIGEgUHJvcG9zYWwgd2FzIGZvdW5kIGF0IHByb3Bvc2FsSUQKZnVuYyAocyAqZ292ZXJuYW5jZVN0b3JlKSBHZXRQcm9wb3NhbChwcm9wb3NhbElEIGludDY0KSAoKlByb3Bvc2FsLCBib29sKSB7Cglwcm9wb3NhbHMgOj0gcy5HZXRQcm9wb3NhbHMoKQoJcmVzdWx0IDo9IHByb3Bvc2Fscy5HZXQoZm9ybWF0SW50NjRLZXkocHJvcG9zYWxJRCkpCglpZiByZXN1bHQgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBmYWxzZQoJfQoKCXByb3Bvc2FsLCBvayA6PSByZXN1bHQuKCpQcm9wb3NhbCkKCWlmICFvayB7CgkJcmV0dXJuIG5pbCwgZmFsc2UKCX0KCXJldHVybiBwcm9wb3NhbCwgdHJ1ZQp9CgovLyBTZXRQcm9wb3NhbCBzdG9yZXMgcHJvcG9zYWwgdW5kZXIgcHJvcG9zYWxJRCBhZnRlciBjaGVja2luZyByZWFsbQovLyBhdXRob3JpemF0aW9uLCBzdG9yYWdlIGluaXRpYWxpemF0aW9uLCBhbmQgSUQgY29uc2lzdGVuY3kuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgY2FsbDsgY2FsbGVycyBwYXNzIDAKLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IHNhdGlzZnkgcmxtLklzQ3VycmVudCgpIG9yIEVyclNwb29mZWRSZWFsbSBpcyByZXR1cm5lZAovLyAgIC0gcHJvcG9zYWxJRDogc3RvcmFnZSBpZGVudGlmaWVyIHRoYXQgbXVzdCBlcXVhbCBwcm9wb3NhbC5JRCgpCi8vICAgLSBwcm9wb3NhbDogcHJvcG9zYWwgdmFsdWUgdG8gcGVyc2lzdDsgbmlsIG9yIGFuIElEIG1pc21hdGNoIHJldHVybnMgYW4gZXJyb3IKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgd2hlbiBzdG9yZWQ7IGFuIGF1dGhvcml6YXRpb24sIG1pc3Npbmcta2V5LCBJRC1taXNtYXRjaCwgb3IgS1Ytc3RvcmUgZXJyb3Igb3RoZXJ3aXNlCmZ1bmMgKHMgKmdvdmVybmFuY2VTdG9yZSkgU2V0UHJvcG9zYWwoXyBpbnQsIHJsbSByZWFsbSwgcHJvcG9zYWxJRCBpbnQ2NCwgcHJvcG9zYWwgKlByb3Bvc2FsKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJaWYgIXMuSGFzUHJvcG9zYWxzU3RvcmVLZXkoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoInByb3Bvc2FscyBzdG9yZSBrZXkgbm90IGZvdW5kIikKCX0KCglpZiBwcm9wb3NhbCA9PSBuaWwgfHwgcHJvcG9zYWwuSUQoKSAhPSBwcm9wb3NhbElEIHsKCQlyZXR1cm4gZXJyb3JzLk5ldygicHJvcG9zYWwgSUQgZG9lcyBub3QgbWF0Y2ggdGhlIHN0b3JhZ2Uga2V5IikKCX0KCglwcm9wb3NhbHMgOj0gcy5HZXRQcm9wb3NhbHMoKQoJcHJvcG9zYWxzLlNldChmb3JtYXRJbnQ2NEtleShwcm9wb3NhbElEKSwgcHJvcG9zYWwpCgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVByb3Bvc2Fscy5TdHJpbmcoKSwgcHJvcG9zYWxzKQp9CgovLyBIYXNBY3RpdmVQcm9wb3NhbHNCeVNuYXBzaG90U3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBhY3RpdmUtcHJvcG9zYWwKLy8gc25hcHNob3QgaW5kZXggaXMgcHJlc2VudCBpbiB0aGUgS1Ygc3RvcmUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIHdoZW4gdGhlIGFjdGl2ZSBzbmFwc2hvdCBpbmRleCBzdG9yYWdlIGtleSBleGlzdHMKZnVuYyAocyAqZ292ZXJuYW5jZVN0b3JlKSBIYXNBY3RpdmVQcm9wb3NhbHNCeVNuYXBzaG90U3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5QWN0aXZlUHJvcG9zYWxzQnlTbmFwc2hvdC5TdHJpbmcoKSkKfQoKLy8gR2V0QWN0aXZlUHJvcG9zYWxzQnlTbmFwc2hvdCByZXRyaWV2ZXMgdGhlIGFjdGl2ZS1wcm9wb3NhbCBzbmFwc2hvdCBpbmRleC4KLy8gU3RvcmFnZSBvciB0eXBlLWNhc3QgZmFpbHVyZXMgcGFuaWMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqYnB0cmVlLkJQVHJlZTogdHJlZSBpbmRleGluZyBhY3RpdmUgcHJvcG9zYWxzIGJ5IHNuYXBzaG90IGtleQpmdW5jIChzICpnb3Zlcm5hbmNlU3RvcmUpIEdldEFjdGl2ZVByb3Bvc2Fsc0J5U25hcHNob3QoKSAqYnB0cmVlLkJQVHJlZSB7CglyZXN1bHQsIGVyciA6PSBzLmt2U3RvcmUuR2V0KFN0b3JlS2V5QWN0aXZlUHJvcG9zYWxzQnlTbmFwc2hvdC5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCXRyZWUsIG9rIDo9IHJlc3VsdC4oKmJwdHJlZS5CUFRyZWUpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgYWN0aXZlIHByb3Bvc2FsIHNuYXBzaG90IGluZGV4OiAlVCIsIHJlc3VsdCkpCgl9CglyZXR1cm4gdHJlZQp9CgovLyBTZXRBY3RpdmVQcm9wb3NhbHNCeVNuYXBzaG90IHBlcnNpc3RzIHRoZSBhY3RpdmUtcHJvcG9zYWwgc25hcHNob3QgaW5kZXgKLy8gYWZ0ZXIgY2hlY2tpbmcgdGhlIHN1cHBsaWVkIHJlYWxtIGNvbnRleHQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgY2FsbDsgY2FsbGVycyBwYXNzIDAKLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IHNhdGlzZnkgcmxtLklzQ3VycmVudCgpIG9yIEVyclNwb29mZWRSZWFsbSBpcyByZXR1cm5lZAovLyAgIC0gdHJlZTogYWN0aXZlLXByb3Bvc2FsIHNuYXBzaG90IGluZGV4IHRyZWUgdG8gcGVyc2lzdAovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IG5pbCB3aGVuIHRoZSBpbmRleCBpcyBwZXJzaXN0ZWQ7IEVyclNwb29mZWRSZWFsbSBvciB0aGUgS1Ytc3RvcmUgd3JpdGUgZXJyb3Igb3RoZXJ3aXNlCmZ1bmMgKHMgKmdvdmVybmFuY2VTdG9yZSkgU2V0QWN0aXZlUHJvcG9zYWxzQnlTbmFwc2hvdChfIGludCwgcmxtIHJlYWxtLCB0cmVlICpicHRyZWUuQlBUcmVlKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5QWN0aXZlUHJvcG9zYWxzQnlTbmFwc2hvdC5TdHJpbmcoKSwgdHJlZSkKfQoKLy8gUHJvcG9zYWwgVXNlciBWb3RpbmcgSW5mb3MgbWV0aG9kcwovLyBIYXNQcm9wb3NhbFVzZXJWb3RpbmdJbmZvc1N0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgcHJvcG9zYWwgdm90aW5nLWluZm8KLy8gaW5kZXggaXMgcHJlc2VudCBpbiB0aGUgS1Ygc3RvcmUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIHdoZW4gdGhlIHByb3Bvc2FsIHZvdGluZy1pbmZvIHN0b3JhZ2Uga2V5IGV4aXN0cwpmdW5jIChzICpnb3Zlcm5hbmNlU3RvcmUpIEhhc1Byb3Bvc2FsVXNlclZvdGluZ0luZm9zU3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5UHJvcG9zYWxVc2VyVm90aW5nSW5mb3MuU3RyaW5nKCkpCn0KCi8vIEdldFByb3Bvc2FsVXNlclZvdGluZ0luZm9zIHJldHJpZXZlcyB0aGUgcGVyc2lzdGVkIHByb3Bvc2FsIHZvdGluZy1pbmZvCi8vIGluZGV4IHRyZWUuIFN0b3JhZ2Ugb3IgdHlwZS1jYXN0IGZhaWx1cmVzIHBhbmljLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKmJwdHJlZS5CUFRyZWU6IHRyZWUgbWFwcGluZyBwcm9wb3NhbCBJRHMgdG8gcGVyLXVzZXIgdm90aW5nLWluZm8gdHJlZXMKZnVuYyAocyAqZ292ZXJuYW5jZVN0b3JlKSBHZXRQcm9wb3NhbFVzZXJWb3RpbmdJbmZvcygpICpicHRyZWUuQlBUcmVlIHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlQcm9wb3NhbFVzZXJWb3RpbmdJbmZvcy5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgl2b3RpbmdJbmZvcywgb2sgOj0gcmVzdWx0LigqYnB0cmVlLkJQVHJlZSkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gKmJwdHJlZS5CUFRyZWU6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gdm90aW5nSW5mb3MKfQoKLy8gU2V0UHJvcG9zYWxVc2VyVm90aW5nSW5mb3MgcGVyc2lzdHMgdGhlIHByb3Bvc2FsIHZvdGluZy1pbmZvIGluZGV4IGFmdGVyCi8vIGNoZWNraW5nIHRoZSBzdXBwbGllZCByZWFsbSBjb250ZXh0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogbGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBhdXRob3JpemVkIHN0b3JlIGNhbGw7IGNhbGxlcnMgcGFzcyAwCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBzYXRpc2Z5IHJsbS5Jc0N1cnJlbnQoKSBvciBFcnJTcG9vZmVkUmVhbG0gaXMgcmV0dXJuZWQKLy8gICAtIHZvdGluZ0luZm9zOiBwcm9wb3NhbCB2b3RpbmctaW5mbyBpbmRleCB0cmVlIHRvIHBlcnNpc3QKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgd2hlbiB0aGUgaW5kZXggaXMgcGVyc2lzdGVkOyBFcnJTcG9vZmVkUmVhbG0gb3IgdGhlIEtWLXN0b3JlIHdyaXRlIGVycm9yIG90aGVyd2lzZQpmdW5jIChzICpnb3Zlcm5hbmNlU3RvcmUpIFNldFByb3Bvc2FsVXNlclZvdGluZ0luZm9zKF8gaW50LCBybG0gcmVhbG0sIHZvdGluZ0luZm9zICpicHRyZWUuQlBUcmVlKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVByb3Bvc2FsVXNlclZvdGluZ0luZm9zLlN0cmluZygpLCB2b3RpbmdJbmZvcykKfQoKLy8gR2V0UHJvcG9zYWxWb3RpbmdJbmZvcyByZXRyaWV2ZXMgdGhlIHBlci11c2VyIHZvdGluZy1pbmZvIHRyZWUgZm9yIGEKLy8gcHJvcG9zYWwuIEEgbWlzc2luZyBlbnRyeSBvciB3cm9uZyB0eXBlIHJldHVybnMgbmlsIGFuZCBmYWxzZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb3Bvc2FsSUQ6IHByb3Bvc2FsIGlkZW50aWZpZXIgdXNlZCB0byBzZWxlY3QgaXRzIHZvdGluZy1pbmZvIHRyZWUKLy8KLy8gUmV0dXJuczoKLy8gICAtICpicHRyZWUuQlBUcmVlOiBwZXItdXNlciB2b3RpbmctaW5mbyB0cmVlIGZvciBwcm9wb3NhbElELCBvciBuaWwgd2hlbiBhYnNlbnQgb3IgaW52YWxpZAovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIGEgY29ycmVjdGx5IHR5cGVkIHZvdGluZy1pbmZvIHRyZWUgd2FzIGZvdW5kCmZ1bmMgKHMgKmdvdmVybmFuY2VTdG9yZSkgR2V0UHJvcG9zYWxWb3RpbmdJbmZvcyhwcm9wb3NhbElEIGludDY0KSAoKmJwdHJlZS5CUFRyZWUsIGJvb2wpIHsKCXZvdGluZ0luZm9zIDo9IHMuR2V0UHJvcG9zYWxVc2VyVm90aW5nSW5mb3MoKQoJdm90aW5nSW5mbyA6PSB2b3RpbmdJbmZvcy5HZXQoZm9ybWF0SW50NjRLZXkocHJvcG9zYWxJRCkpCglpZiB2b3RpbmdJbmZvID09IG5pbCB7CgkJcmV0dXJuIG5pbCwgZmFsc2UKCX0KCgl2b3RpbmdJbmZvVHJlZSwgb2sgOj0gdm90aW5nSW5mby4oKmJwdHJlZS5CUFRyZWUpCglpZiAhb2sgewoJCXJldHVybiBuaWwsIGZhbHNlCgl9CgoJcmV0dXJuIHZvdGluZ0luZm9UcmVlLCB0cnVlCn0KCi8vIFNldFByb3Bvc2FsVm90aW5nSW5mb3Mgc3RvcmVzIHZvdGluZ0luZm9zIHVuZGVyIHByb3Bvc2FsSUQgYWZ0ZXIgY2hlY2tpbmcKLy8gcmVhbG0gYXV0aG9yaXphdGlvbiBhbmQgaW5kZXggaW5pdGlhbGl6YXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgY2FsbDsgY2FsbGVycyBwYXNzIDAKLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IHNhdGlzZnkgcmxtLklzQ3VycmVudCgpIG9yIEVyclNwb29mZWRSZWFsbSBpcyByZXR1cm5lZAovLyAgIC0gcHJvcG9zYWxJRDogcHJvcG9zYWwgaWRlbnRpZmllciB1c2VkIGFzIHRoZSBuZXN0ZWQgdHJlZSBrZXkKLy8gICAtIHZvdGluZ0luZm9zOiBwZXItdXNlciB2b3RpbmctaW5mbyB0cmVlIHRvIHN0b3JlIGZvciBwcm9wb3NhbElECi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogbmlsIHdoZW4gc3RvcmVkOyBhbiBhdXRob3JpemF0aW9uLCBtaXNzaW5nLWtleSwgb3IgS1Ytc3RvcmUgZXJyb3Igb3RoZXJ3aXNlCmZ1bmMgKHMgKmdvdmVybmFuY2VTdG9yZSkgU2V0UHJvcG9zYWxWb3RpbmdJbmZvcyhfIGludCwgcmxtIHJlYWxtLCBwcm9wb3NhbElEIGludDY0LCB2b3RpbmdJbmZvcyAqYnB0cmVlLkJQVHJlZSkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCWlmICFzLkhhc1Byb3Bvc2FsVXNlclZvdGluZ0luZm9zU3RvcmVLZXkoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoInByb3Bvc2FsIHVzZXIgdm90aW5nIGluZm9zIHN0b3JlIGtleSBub3QgZm91bmQiKQoJfQoKCWFsbFZvdGluZ0luZm9zIDo9IHMuR2V0UHJvcG9zYWxVc2VyVm90aW5nSW5mb3MoKQoJYWxsVm90aW5nSW5mb3MuU2V0KGZvcm1hdEludDY0S2V5KHByb3Bvc2FsSUQpLCB2b3RpbmdJbmZvcykKCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5UHJvcG9zYWxVc2VyVm90aW5nSW5mb3MuU3RyaW5nKCksIGFsbFZvdGluZ0luZm9zKQp9CgovLyBVc2VyIFByb3Bvc2FscyBtZXRob2RzCi8vIEhhc1VzZXJQcm9wb3NhbHNTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIHVzZXItdG8tcHJvcG9zYWxzIGluZGV4IGlzCi8vIHByZXNlbnQgaW4gdGhlIEtWIHN0b3JlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRoZSB1c2VyIHByb3Bvc2FscyBzdG9yYWdlIGtleSBleGlzdHMKZnVuYyAocyAqZ292ZXJuYW5jZVN0b3JlKSBIYXNVc2VyUHJvcG9zYWxzU3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5VXNlclByb3Bvc2Fscy5TdHJpbmcoKSkKfQoKLy8gR2V0VXNlclByb3Bvc2FscyByZXRyaWV2ZXMgdGhlIHBlcnNpc3RlZCB1c2VyLXRvLXByb3Bvc2FscyBpbmRleC4KLy8gU3RvcmFnZSBvciB0eXBlLWNhc3QgZmFpbHVyZXMgcGFuaWMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqYnB0cmVlLkJQVHJlZTogdHJlZSBtYXBwaW5nIHVzZXIgc3RyaW5ncyB0byBwcm9wb3NhbCBJRCBzbGljZXMKZnVuYyAocyAqZ292ZXJuYW5jZVN0b3JlKSBHZXRVc2VyUHJvcG9zYWxzKCkgKmJwdHJlZS5CUFRyZWUgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleVVzZXJQcm9wb3NhbHMuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJdXNlclByb3Bvc2Fscywgb2sgOj0gcmVzdWx0LigqYnB0cmVlLkJQVHJlZSkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gKmJwdHJlZS5CUFRyZWU6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gdXNlclByb3Bvc2Fscwp9CgovLyBTZXRVc2VyUHJvcG9zYWxzIHBlcnNpc3RzIHRoZSB1c2VyLXRvLXByb3Bvc2FscyBpbmRleCBhZnRlciBjaGVja2luZyB0aGUKLy8gc3VwcGxpZWQgcmVhbG0gY29udGV4dC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGxlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvciB0aGUgYXV0aG9yaXplZCBzdG9yZSBjYWxsOyBjYWxsZXJzIHBhc3MgMAovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IGl0IG11c3Qgc2F0aXNmeSBybG0uSXNDdXJyZW50KCkgb3IgRXJyU3Bvb2ZlZFJlYWxtIGlzIHJldHVybmVkCi8vICAgLSB1c2VyUHJvcG9zYWxzOiB1c2VyLXRvLXByb3Bvc2FscyBpbmRleCB0cmVlIHRvIHBlcnNpc3QKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgd2hlbiB0aGUgaW5kZXggaXMgcGVyc2lzdGVkOyBFcnJTcG9vZmVkUmVhbG0gb3IgdGhlIEtWLXN0b3JlIHdyaXRlIGVycm9yIG90aGVyd2lzZQpmdW5jIChzICpnb3Zlcm5hbmNlU3RvcmUpIFNldFVzZXJQcm9wb3NhbHMoXyBpbnQsIHJsbSByZWFsbSwgdXNlclByb3Bvc2FscyAqYnB0cmVlLkJQVHJlZSkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlVc2VyUHJvcG9zYWxzLlN0cmluZygpLCB1c2VyUHJvcG9zYWxzKQp9CgovLyBHZXRVc2VyUHJvcG9zYWxJRHMgcmV0cmlldmVzIHRoZSBwcm9wb3NhbCBJRHMgaW5kZXhlZCBmb3IgdXNlci4KLy8gQSBtaXNzaW5nIHVzZXIgcmV0dXJucyBuaWwgYW5kIGZhbHNlOyBhIHdyb25nIHN0b3JlZCB0eXBlIHBhbmljcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHVzZXI6IHVzZXItc3RyaW5nIGtleSBpbiB0aGUgdXNlci10by1wcm9wb3NhbHMgaW5kZXgKLy8KLy8gUmV0dXJuczoKLy8gICAtIFtdaW50NjQ6IHByb3Bvc2FsIElEcyBjdXJyZW50bHkgaW5kZXhlZCBmb3IgdXNlcgovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHVzZXIgaGFzIGFuIGluZGV4IGVudHJ5OyBmYWxzZSB3aGVuIHVzZXIgaXMgYWJzZW50CmZ1bmMgKHMgKmdvdmVybmFuY2VTdG9yZSkgR2V0VXNlclByb3Bvc2FsSURzKHVzZXIgc3RyaW5nKSAoW11pbnQ2NCwgYm9vbCkgewoJdXNlclByb3Bvc2FscyA6PSBzLkdldFVzZXJQcm9wb3NhbHMoKQoJcmVzdWx0IDo9IHVzZXJQcm9wb3NhbHMuR2V0KHVzZXIpCglpZiByZXN1bHQgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBmYWxzZQoJfQoKCXByb3Bvc2FsSURzLCBvayA6PSByZXN1bHQuKFtdaW50NjQpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvIFtdaW50NjQ6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gcHJvcG9zYWxJRHMsIHRydWUKfQoKLy8gQWRkVXNlclByb3Bvc2FsIGFwcGVuZHMgcHJvcG9zYWxJRCB0byB0aGUgSURzIGluZGV4ZWQgZm9yIHVzZXIgYW5kIHBlcnNpc3RzCi8vIHRoZSB1cGRhdGVkIHVzZXItdG8tcHJvcG9zYWxzIHRyZWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgY2FsbDsgY2FsbGVycyBwYXNzIDAKLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IHNhdGlzZnkgcmxtLklzQ3VycmVudCgpIG9yIEVyclNwb29mZWRSZWFsbSBpcyByZXR1cm5lZAovLyAgIC0gdXNlcjogdXNlci1zdHJpbmcga2V5IHdob3NlIHByb3Bvc2FsIGxpc3QgaXMgdXBkYXRlZAovLyAgIC0gcHJvcG9zYWxJRDogcHJvcG9zYWwgaWRlbnRpZmllciB0byBhcHBlbmQgdG8gdXNlcidzIGxpc3QKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgd2hlbiB0aGUgbGlzdCBpcyBwZXJzaXN0ZWQ7IGFuIGF1dGhvcml6YXRpb24sIG1pc3Npbmcta2V5LCBvciBLVi1zdG9yZSBlcnJvciBvdGhlcndpc2UKZnVuYyAocyAqZ292ZXJuYW5jZVN0b3JlKSBBZGRVc2VyUHJvcG9zYWwoXyBpbnQsIHJsbSByZWFsbSwgdXNlciBzdHJpbmcsIHByb3Bvc2FsSUQgaW50NjQpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglpZiAhcy5IYXNVc2VyUHJvcG9zYWxzU3RvcmVLZXkoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoInVzZXIgcHJvcG9zYWxzIHN0b3JlIGtleSBub3QgZm91bmQiKQoJfQoKCXVzZXJQcm9wb3NhbHMgOj0gcy5HZXRVc2VyUHJvcG9zYWxzKCkKCgkvLyBHZXQgZXhpc3RpbmcgcHJvcG9zYWxzIGZvciB1c2VyCgl2YXIgcHJvcG9zYWxJRHMgW11pbnQ2NAoJaWYgZXhpc3RpbmcgOj0gdXNlclByb3Bvc2Fscy5HZXQodXNlcik7IGV4aXN0aW5nICE9IG5pbCB7CgkJdmFyIG9rIGJvb2wKCQlwcm9wb3NhbElEcywgb2sgPSBleGlzdGluZy4oW11pbnQ2NCkKCQlpZiAhb2sgewoJCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byBbXWludDY0OiAlVCIsIGV4aXN0aW5nKSkKCQl9Cgl9CgoJLy8gQWRkIG5ldyBwcm9wb3NhbCBJRAoJcHJvcG9zYWxJRHMgPSBhcHBlbmQocHJvcG9zYWxJRHMsIHByb3Bvc2FsSUQpCgl1c2VyUHJvcG9zYWxzLlNldCh1c2VyLCBwcm9wb3NhbElEcykKCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5VXNlclByb3Bvc2Fscy5TdHJpbmcoKSwgdXNlclByb3Bvc2FscykKfQoKLy8gUmVtb3ZlVXNlclByb3Bvc2FsIHJlbW92ZXMgZXZlcnkgb2NjdXJyZW5jZSBvZiBwcm9wb3NhbElEIGZyb20gdXNlcidzCi8vIGluZGV4ZWQgcHJvcG9zYWwgSURzIGFuZCBwZXJzaXN0cyB0aGUgcmVzdWx0aW5nIHRyZWUuIE1pc3NpbmcgdXNlcnMgYXJlIGEKLy8gbm8tb3AuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgY2FsbDsgY2FsbGVycyBwYXNzIDAKLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IHNhdGlzZnkgcmxtLklzQ3VycmVudCgpIG9yIEVyclNwb29mZWRSZWFsbSBpcyByZXR1cm5lZAovLyAgIC0gdXNlcjogdXNlci1zdHJpbmcga2V5IHdob3NlIHByb3Bvc2FsIGxpc3QgaXMgdXBkYXRlZAovLyAgIC0gcHJvcG9zYWxJRDogcHJvcG9zYWwgaWRlbnRpZmllciB0byByZW1vdmUgZnJvbSB0aGUgdXNlcidzIGxpc3QKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgd2hlbiByZW1vdmVkIG9yIGFscmVhZHkgYWJzZW50OyBhbiBhdXRob3JpemF0aW9uLCBtaXNzaW5nLWtleSwgb3IgS1Ytc3RvcmUgZXJyb3Igb3RoZXJ3aXNlCmZ1bmMgKHMgKmdvdmVybmFuY2VTdG9yZSkgUmVtb3ZlVXNlclByb3Bvc2FsKF8gaW50LCBybG0gcmVhbG0sIHVzZXIgc3RyaW5nLCBwcm9wb3NhbElEIGludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJaWYgIXMuSGFzVXNlclByb3Bvc2Fsc1N0b3JlS2V5KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KCJ1c2VyIHByb3Bvc2FscyBzdG9yZSBrZXkgbm90IGZvdW5kIikKCX0KCgl1c2VyUHJvcG9zYWxzIDo9IHMuR2V0VXNlclByb3Bvc2FscygpCglwcm9wb3NhbElEc1JhdyA6PSB1c2VyUHJvcG9zYWxzLkdldCh1c2VyKQoJLy8gcHJvcG9zYWwgYWxyZWFkeSByZW1vdmVkCglpZiBwcm9wb3NhbElEc1JhdyA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCglwcm9wb3NhbElEcywgb2sgOj0gcHJvcG9zYWxJRHNSYXcuKFtdaW50NjQpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvIFtdaW50NjQ6ICVUIiwgcHJvcG9zYWxJRHMpKQoJfQoKCW5ld1Byb3Bvc2FsSURzIDo9IG1ha2UoW11pbnQ2NCwgMCkKCglmb3IgXywgaWQgOj0gcmFuZ2UgcHJvcG9zYWxJRHMgewoJCWlmIGlkICE9IHByb3Bvc2FsSUQgewoJCQluZXdQcm9wb3NhbElEcyA9IGFwcGVuZChuZXdQcm9wb3NhbElEcywgaWQpCgkJfQoJfQoKCWlmIGxlbihuZXdQcm9wb3NhbElEcykgPT0gMCB7CgkJdXNlclByb3Bvc2Fscy5SZW1vdmUodXNlcikKCX0gZWxzZSB7CgkJdXNlclByb3Bvc2Fscy5TZXQodXNlciwgbmV3UHJvcG9zYWxJRHMpCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVVzZXJQcm9wb3NhbHMuU3RyaW5nKCksIHVzZXJQcm9wb3NhbHMpCn0KCi8vIE5ld0dvdmVybmFuY2VTdG9yZSBjcmVhdGVzIGEgZ292ZXJuYW5jZSBzdG9yZSBiYWNrZWQgYnkgdGhlIHByb3ZpZGVkIEtWIHN0b3JlLgovLyBUaGUgcmV0dXJuZWQgaW50ZXJmYWNlIGlzIHVzZWQgYnkgZ292ZXJuYW5jZSBpbXBsZW1lbnRhdGlvbnMgYW5kIHVwZ3JhZGVzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0ga3ZTdG9yZTogS1Ygc3RvcmUgdXNlZCBmb3IgZ292ZXJuYW5jZSBjb3VudGVycywgdHJlZXMsIGFuZCByZWNvcmRzCi8vCi8vIFJldHVybnM6Ci8vICAgLSBJR292ZXJuYW5jZVN0b3JlOiBnb3Zlcm5hbmNlIHN0b3JlIGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSBrdlN0b3JlCmZ1bmMgTmV3R292ZXJuYW5jZVN0b3JlKGt2U3RvcmUgc3RvcmUuS1ZTdG9yZSkgSUdvdmVybmFuY2VTdG9yZSB7CglyZXR1cm4gJmdvdmVybmFuY2VTdG9yZXsKCQlrdlN0b3JlOiBrdlN0b3JlLAoJfQp9CgovLyBmb3JtYXRJbnQ2NEtleSBmb3JtYXRzIGludDY0IGlkZW50aWZpZXJzIGZvciBzdG9yYWdlIGtleXMuCmZ1bmMgZm9ybWF0SW50NjRLZXkoaWQgaW50NjQpIHN0cmluZyB7CglyZXR1cm4gc3RyY29udi5Gb3JtYXRJbnQoaWQsIDEwKQp9ChrJ3AEKCXR5cGVzLmdubxK63AFwYWNrYWdlIGdvdmVybmFuY2UKCmltcG9ydCAoCglyb3RyZWUgImduby5sYW5kL3AvbnQvYnB0cmVlL3JvdHJlZS92MCIKCWJwdHJlZSAiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCikKCnR5cGUgSUdvdmVybmFuY2UgaW50ZXJmYWNlIHsKCUlHb3Zlcm5hbmNlTWFuYWdlcgoJSUdvdmVybmFuY2VHZXR0ZXIKCVJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nCn0KCnR5cGUgSUdvdmVybmFuY2VNYW5hZ2VyIGludGVyZmFjZSB7CgkvLyBQcm9wb3NhbCBtYW5hZ2VtZW50CgkvLyBQcm9wb3NlVGV4dCBjcmVhdGVzIGEgbm9uLWV4ZWN1dGFibGUgcHJvcG9zYWwgZm9yIGNvbW11bml0eSBkaXNjdXNzaW9uLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTm9uY3Jvc3NpbmcgaW1wbGVtZW50YXRpb24tY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBDdXJyZW50IHJlYWxtIGNvbnRleHQgZm9yd2FyZGVkIHVuY2hhbmdlZCBieSB0aGUgZ292ZXJuYW5jZSBwcm94eS4KCS8vICAgLSB0aXRsZTogc2hvcnQsIG5vbi1lbXB0eSB0aXRsZSBkZXNjcmliaW5nIHRoZSBwcm9wb3NhbC4KCS8vICAgLSBkZXNjcmlwdGlvbjogbm9uLWVtcHR5IHByb3Bvc2FsIHJhdGlvbmFsZSBhbmQgZGlzY3Vzc2lvbiB0ZXh0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW50NjQ6IElEIGFzc2lnbmVkIHRvIHRoZSBuZXdseSBjcmVhdGVkIHRleHQgcHJvcG9zYWwuCglQcm9wb3NlVGV4dCgKCQlfIGludCwgcmxtIHJlYWxtLAoJCXRpdGxlIHN0cmluZywKCQlkZXNjcmlwdGlvbiBzdHJpbmcsCgkpIGludDY0CgoJLy8gUHJvcG9zZUNvbW11bml0eVBvb2xTcGVuZCBjcmVhdGVzIGEgcHJvcG9zYWwgdG8gdHJhbnNmZXIgcmVnaXN0ZXJlZCB0b2tlbnMgZnJvbSB0aGUgY29tbXVuaXR5IHBvb2wuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBOb25jcm9zc2luZyBpbXBsZW1lbnRhdGlvbi1jYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBnb3Zlcm5hbmNlIHByb3h5LgoJLy8gICAtIHRpdGxlOiBzaG9ydCB0aXRsZSBkZXNjcmliaW5nIHRoZSByZXF1ZXN0ZWQgZGlzYnVyc2VtZW50LgoJLy8gICAtIGRlc2NyaXB0aW9uOiByYXRpb25hbGUgYW5kIGJ1ZGdldCBkZXRhaWxzIGZvciB0aGUgZGlzYnVyc2VtZW50LgoJLy8gICAtIHRvOiByZWNpcGllbnQgYWRkcmVzcyBmb3IgdGhlIGNvbW11bml0eS1wb29sIHRyYW5zZmVyLgoJLy8gICAtIHRva2VuUGF0aDogcmVnaXN0ZXJlZCB0b2tlbiByZWFsbSBwYXRoIHRvIHRyYW5zZmVyLgoJLy8gICAtIGFtb3VudDogcG9zaXRpdmUgdHJhbnNmZXIgYW1vdW50IGluIHRoZSB0b2tlbidzIHNtYWxsZXN0IHVuaXQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBpbnQ2NDogSUQgYXNzaWduZWQgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgY29tbXVuaXR5LXBvb2wtc3BlbmQgcHJvcG9zYWwuCglQcm9wb3NlQ29tbXVuaXR5UG9vbFNwZW5kKAoJCV8gaW50LCBybG0gcmVhbG0sCgkJdGl0bGUgc3RyaW5nLAoJCWRlc2NyaXB0aW9uIHN0cmluZywKCQl0byBhZGRyZXNzLAoJCXRva2VuUGF0aCBzdHJpbmcsCgkJYW1vdW50IGludDY0LAoJKSBpbnQ2NAoKCS8vIFByb3Bvc2VQYXJhbWV0ZXJDaGFuZ2UgY3JlYXRlcyBhIHByb3Bvc2FsIGNvbnRhaW5pbmcgcmVnaXN0ZXJlZCBwYXJhbWV0ZXItaGFuZGxlciBleGVjdXRpb25zLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTm9uY3Jvc3NpbmcgaW1wbGVtZW50YXRpb24tY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBDdXJyZW50IHJlYWxtIGNvbnRleHQgZm9yd2FyZGVkIHVuY2hhbmdlZCBieSB0aGUgZ292ZXJuYW5jZSBwcm94eS4KCS8vICAgLSB0aXRsZTogc2hvcnQgdGl0bGUgZGVzY3JpYmluZyB0aGUgcGFyYW1ldGVyIGNoYW5nZXMuCgkvLyAgIC0gZGVzY3JpcHRpb246IHJhdGlvbmFsZSBhbmQgaW1wYWN0IGRldGFpbHMgZm9yIHRoZSBjaGFuZ2VzLgoJLy8gICAtIG51bVRvRXhlY3V0ZTogbnVtYmVyIG9mIGVuY29kZWQgcGFyYW1ldGVyLWNoYW5nZSBleGVjdXRpb25zIGV4cGVjdGVkLgoJLy8gICAtIGV4ZWN1dGlvbnM6IGV4ZWN1dGlvbiBtZXNzYWdlcyBlbmNvZGVkIHdpdGggdGhlIGdvdmVybmFuY2UgZXhlY3V0aW9uIGRlbGltaXRlcnMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBpbnQ2NDogSUQgYXNzaWduZWQgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgcGFyYW1ldGVyLWNoYW5nZSBwcm9wb3NhbC4KCVByb3Bvc2VQYXJhbWV0ZXJDaGFuZ2UoCgkJXyBpbnQsIHJsbSByZWFsbSwKCQl0aXRsZSBzdHJpbmcsCgkJZGVzY3JpcHRpb24gc3RyaW5nLAoJCW51bVRvRXhlY3V0ZSBpbnQ2NCwKCQlleGVjdXRpb25zIHN0cmluZywKCSkgaW50NjQKCgkvLyBWb3RpbmcKCS8vIFZvdGUgcmVjb3JkcyB0aGUgY2FsbGVyJ3MgZmluYWwgeWVzIG9yIG5vIHZvdGUgb24gYSBwcm9wb3NhbC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IE5vbmNyb3NzaW5nIGltcGxlbWVudGF0aW9uLWNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIGdvdmVybmFuY2UgcHJveHkuCgkvLyAgIC0gcHJvcG9zYWxJZDogSUQgb2YgdGhlIHByb3Bvc2FsIHRvIHZvdGUgb24uCgkvLyAgIC0geWVzOiB0cnVlIHRvIGNhc3QgYW4gYWZmaXJtYXRpdmUgdm90ZSwgZmFsc2UgdG8gY2FzdCBhIG5lZ2F0aXZlIHZvdGUuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBzdHJpbmc6IGNhbGxlcidzIGFwcGxpZWQgdm90aW5nIHdlaWdodCBmb3JtYXR0ZWQgYXMgYSBkZWNpbWFsIHN0cmluZy4KCVZvdGUoCgkJXyBpbnQsIHJsbSByZWFsbSwKCQlwcm9wb3NhbElkIGludDY0LAoJCXllcyBib29sLAoJKSBzdHJpbmcKCgkvLyBFeGVjdXRpb24KCS8vIEV4ZWN1dGUgYXBwbGllcyBhbiBhcHByb3ZlZCBleGVjdXRhYmxlIHByb3Bvc2FsIHdpdGhpbiBpdHMgZGVsYXkgYW5kIGV4ZWN1dGlvbiB3aW5kb3cuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBOb25jcm9zc2luZyBpbXBsZW1lbnRhdGlvbi1jYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBnb3Zlcm5hbmNlIHByb3h5LgoJLy8gICAtIHByb3Bvc2FsSWQ6IElEIG9mIHRoZSBwcm9wb3NhbCB0byBleGVjdXRlLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW50NjQ6IElEIG9mIHRoZSBwcm9wb3NhbCBzdWNjZXNzZnVsbHkgZXhlY3V0ZWQuCglFeGVjdXRlKAoJCV8gaW50LCBybG0gcmVhbG0sCgkJcHJvcG9zYWxJZCBpbnQ2NCwKCSkgaW50NjQKCgkvLyBDYW5jZWwgbWFya3MgYW4gdXBjb21pbmcgcHJvcG9zYWwgYXMgY2FuY2VsbGVkIGF0IHRoZSByZXF1ZXN0IG9mIGl0cyBwcm9wb3Nlci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IE5vbmNyb3NzaW5nIGltcGxlbWVudGF0aW9uLWNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIGdvdmVybmFuY2UgcHJveHkuCgkvLyAgIC0gcHJvcG9zYWxJZDogSUQgb2YgdGhlIHByb3Bvc2FsIHRvIGNhbmNlbC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiBJRCBvZiB0aGUgcHJvcG9zYWwgc3VjY2Vzc2Z1bGx5IGNhbmNlbGxlZC4KCUNhbmNlbCgKCQlfIGludCwgcmxtIHJlYWxtLAoJCXByb3Bvc2FsSWQgaW50NjQsCgkpIGludDY0CgoJLy8gUmVtb3ZlSW5hY3RpdmVQcm9wb3NhbEZyb21JbmRleCByZW1vdmVzIGFuIGluYWN0aXZlIHByb3Bvc2FsIGZyb20gdGhlIHNuYXBzaG90IGluZGV4LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTm9uY3Jvc3NpbmcgaW1wbGVtZW50YXRpb24tY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBDdXJyZW50IHJlYWxtIGNvbnRleHQgZm9yd2FyZGVkIHVuY2hhbmdlZCBieSB0aGUgZ292ZXJuYW5jZSBwcm94eS4KCS8vICAgLSBwcm9wb3NhbElEOiBJRCBvZiB0aGUgaW5hY3RpdmUgcHJvcG9zYWwgaW5kZXggZW50cnkgdG8gcmVtb3ZlLgoJUmVtb3ZlSW5hY3RpdmVQcm9wb3NhbEZyb21JbmRleChfIGludCwgcmxtIHJlYWxtLCBwcm9wb3NhbElEIGludDY0KQoKCS8vIENvbmZpZ3VyYXRpb24KCS8vIFJlY29uZmlndXJlIHZhbGlkYXRlcyBhbmQgc3RvcmVzIGEgbmV3IGdvdmVybmFuY2UgY29uZmlndXJhdGlvbiB2ZXJzaW9uLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTm9uY3Jvc3NpbmcgaW1wbGVtZW50YXRpb24tY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBDdXJyZW50IHJlYWxtIGNvbnRleHQgZm9yd2FyZGVkIHVuY2hhbmdlZCBieSB0aGUgZ292ZXJuYW5jZSBwcm94eS4KCS8vICAgLSB2b3RpbmdTdGFydERlbGF5OiBzZWNvbmRzIGZyb20gcHJvcG9zYWwgY3JlYXRpb24gdW50aWwgdm90aW5nIG9wZW5zLgoJLy8gICAtIHZvdGluZ1BlcmlvZDogc2Vjb25kcyBmb3Igd2hpY2ggdm90aW5nIHJlbWFpbnMgb3Blbi4KCS8vICAgLSB2b3RpbmdXZWlnaHRTbW9vdGhpbmdEdXJhdGlvbjogc2Vjb25kcyB1c2VkIHRvIHNtb290aCBkZWxlZ2F0aW9uIGhpc3RvcnkgZm9yIHZvdGluZyB3ZWlnaHQuCgkvLyAgIC0gcXVvcnVtOiByZXF1aXJlZCBhcHByb3ZhbCBwZXJjZW50YWdlIG9mIHRvdGFsIHhHTlMgc3VwcGx5LCBmcm9tIDAgdGhyb3VnaCAxMDAuCgkvLyAgIC0gcHJvcG9zYWxDcmVhdGlvblRocmVzaG9sZDogbWluaW11bSB4R05TIGFtb3VudCByZXF1aXJlZCB0byBjcmVhdGUgYSBwcm9wb3NhbC4KCS8vICAgLSBleGVjdXRpb25EZWxheTogc2Vjb25kcyByZXF1aXJlZCBiZXR3ZWVuIGFwcHJvdmFsIGFuZCBleGVjdXRpb24uCgkvLyAgIC0gZXhlY3V0aW9uV2luZG93OiBzZWNvbmRzIGFmdGVyIHRoZSBkZWxheSBkdXJpbmcgd2hpY2ggZXhlY3V0aW9uIGlzIGFsbG93ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBpbnQ2NDogbmV3bHkgc3RvcmVkIGdvdmVybmFuY2UgY29uZmlndXJhdGlvbiB2ZXJzaW9uLgoJUmVjb25maWd1cmUoCgkJXyBpbnQsIHJsbSByZWFsbSwKCQl2b3RpbmdTdGFydERlbGF5IGludDY0LAoJCXZvdGluZ1BlcmlvZCBpbnQ2NCwKCQl2b3RpbmdXZWlnaHRTbW9vdGhpbmdEdXJhdGlvbiBpbnQ2NCwKCQlxdW9ydW0gaW50NjQsCgkJcHJvcG9zYWxDcmVhdGlvblRocmVzaG9sZCBpbnQ2NCwKCQlleGVjdXRpb25EZWxheSBpbnQ2NCwKCQlleGVjdXRpb25XaW5kb3cgaW50NjQsCgkpIGludDY0Cn0KCi8vIElHb3Zlcm5hbmNlR2V0dGVyIHByb3ZpZGVzIHJlYWQtb25seSBhY2Nlc3MgdG8gZ292ZXJuYW5jZSBkYXRhLgp0eXBlIElHb3Zlcm5hbmNlR2V0dGVyIGludGVyZmFjZSB7CgkvLyBTdG9yZSBkYXRhIGdldHRlcnMKCS8vIEdldExhdGVzdENvbmZpZ1ZlcnNpb24gcmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGN1cnJlbnQgZ292ZXJuYW5jZSBjb25maWd1cmF0aW9uLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW50NjQ6IGN1cnJlbnQgY29uZmlndXJhdGlvbiB2ZXJzaW9uIHVzZWQgZm9yIG5ldyBwcm9wb3NhbHMuCglHZXRMYXRlc3RDb25maWdWZXJzaW9uKCkgaW50NjQKCS8vIEdldEN1cnJlbnRQcm9wb3NhbElEIHJldHVybnMgdGhlIGN1cnJlbnQgcHJvcG9zYWwgSUQgY291bnRlciB2YWx1ZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiBjdXJyZW50IHByb3Bvc2FsIGlkZW50aWZpZXIgY291bnRlciB2YWx1ZS4KCUdldEN1cnJlbnRQcm9wb3NhbElEKCkgaW50NjQKCS8vIEdldE1heFNtb290aGluZ1BlcmlvZCByZXR1cm5zIHRoZSB1cHBlciBib3VuZCBmb3IgdGhlIHZvdGluZy13ZWlnaHQgc21vb3RoaW5nIHBlcmlvZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiBmaXhlZCBtYXhpbXVtIHNtb290aGluZyBkdXJhdGlvbiBvZiAzMCBkYXlzICgyLDU5MiwwMDAgc2Vjb25kcykuCglHZXRNYXhTbW9vdGhpbmdQZXJpb2QoKSBpbnQ2NAoKCS8vIENvbmZpZyBnZXR0ZXJzCgkvLyBHZXRMYXRlc3RDb25maWcgcmV0dXJucyB0aGUgY3VycmVudCBnb3Zlcm5hbmNlIGNvbmZpZ3VyYXRpb24uCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBDb25maWc6IGxhdGVzdCBzdG9yZWQgY29uZmlndXJhdGlvbiwgb3IgYSB6ZXJvIGNvbmZpZ3VyYXRpb24gd2hlbiB1bmF2YWlsYWJsZS4KCS8vICAgLSBlcnJvcjogbmlsIHdoZW4gZm91bmQ7IG90aGVyd2lzZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaXMgdW5hdmFpbGFibGUuCglHZXRMYXRlc3RDb25maWcoKSAoQ29uZmlnLCBlcnJvcikKCS8vIEdldENvbmZpZyByZXR1cm5zIGEgZ292ZXJuYW5jZSBjb25maWd1cmF0aW9uIGJ5IHZlcnNpb24uCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBjb25maWdWZXJzaW9uOiBjb25maWd1cmF0aW9uIHZlcnNpb24gdG8gcmV0cmlldmUuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBDb25maWc6IGNvbmZpZ3VyYXRpb24gc3RvcmVkIGF0IHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiwgb3IgYSB6ZXJvIGNvbmZpZ3VyYXRpb24gd2hlbiBhYnNlbnQuCgkvLyAgIC0gZXJyb3I6IG5pbCB3aGVuIGZvdW5kOyBvdGhlcndpc2UgYW4gZXJyb3IgaWRlbnRpZnlpbmcgdGhlIG1pc3NpbmcgdmVyc2lvbi4KCUdldENvbmZpZyhjb25maWdWZXJzaW9uIGludDY0KSAoQ29uZmlnLCBlcnJvcikKCgkvLyBHZXRQcm9wb3NhbHMgcmV0dXJucyBhIHJlYWQtb25seSB2aWV3IG9mIHN0b3JlZCBwcm9wb3NhbHMga2V5ZWQgYnkgZGVjaW1hbCBwcm9wb3NhbCBJRC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtICpyb3RyZWUuUmVhZE9ubHlUcmVlOiByZWFkLW9ubHkgcHJvcG9zYWwgdHJlZSB3aXRoIGNsb25lZCBwcm9wb3NhbCB2YWx1ZXMuCglHZXRQcm9wb3NhbHMoKSAqcm90cmVlLlJlYWRPbmx5VHJlZQoJLy8gRXhpc3RzUHJvcG9zYWwgcmVwb3J0cyB3aGV0aGVyIGEgcHJvcG9zYWwgaXMgc3RvcmVkIGZvciBhbiBJRC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb3Bvc2FsSUQ6IHByb3Bvc2FsIGlkZW50aWZpZXIgdG8gbG9vayB1cC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGJvb2w6IHRydWUgd2hlbiBhIHByb3Bvc2FsIGV4aXN0cyBmb3IgcHJvcG9zYWxJRC4KCUV4aXN0c1Byb3Bvc2FsKHByb3Bvc2FsSUQgaW50NjQpIGJvb2wKCS8vIEdldFByb3Bvc2VyQnlQcm9wb3NhbElkIHJldHVybnMgdGhlIGFkZHJlc3MgdGhhdCBjcmVhdGVkIGEgcHJvcG9zYWwuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwcm9wb3NhbElkOiBwcm9wb3NhbCBpZGVudGlmaWVyIHRvIGxvb2sgdXAuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhZGRyZXNzOiBwcm9wb3NlciBhZGRyZXNzIHJlY29yZGVkIG9uIHRoZSBwcm9wb3NhbC4KCS8vICAgLSBlcnJvcjogbmlsIHdoZW4gZm91bmQ7IG90aGVyd2lzZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoZSBwcm9wb3NhbCBpcyBtaXNzaW5nLgoJR2V0UHJvcG9zZXJCeVByb3Bvc2FsSWQocHJvcG9zYWxJZCBpbnQ2NCkgKGFkZHJlc3MsIGVycm9yKQoJLy8gR2V0UHJvcG9zYWxUeXBlQnlQcm9wb3NhbElkIHJldHVybnMgdGhlIHR5cGUgZGlzY3JpbWluYXRvciBvZiBhIHByb3Bvc2FsLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvcG9zYWxJZDogcHJvcG9zYWwgaWRlbnRpZmllciB0byBsb29rIHVwLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gUHJvcG9zYWxUeXBlOiBwcm9wb3NhbCB0eXBlIHN0b3JlZCBvbiB0aGUgcHJvcG9zYWwuCgkvLyAgIC0gZXJyb3I6IG5pbCB3aGVuIGZvdW5kOyBvdGhlcndpc2UgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGUgcHJvcG9zYWwgaXMgbWlzc2luZy4KCUdldFByb3Bvc2FsVHlwZUJ5UHJvcG9zYWxJZChwcm9wb3NhbElkIGludDY0KSAoUHJvcG9zYWxUeXBlLCBlcnJvcikKCS8vIEdldFByb3Bvc2FsQ3JlYXRlZEF0IHJldHVybnMgYSBwcm9wb3NhbCdzIGNyZWF0aW9uIHRpbWVzdGFtcC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb3Bvc2FsSWQ6IHByb3Bvc2FsIGlkZW50aWZpZXIgdG8gbG9vayB1cC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiBjcmVhdGlvbiB0aW1lIGFzIGEgVW5peCB0aW1lc3RhbXAgaW4gc2Vjb25kcy4KCS8vICAgLSBlcnJvcjogbmlsIHdoZW4gZm91bmQ7IG90aGVyd2lzZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoZSBwcm9wb3NhbCBpcyBtaXNzaW5nLgoJR2V0UHJvcG9zYWxDcmVhdGVkQXQocHJvcG9zYWxJZCBpbnQ2NCkgKGludDY0LCBlcnJvcikKCS8vIEdldFByb3Bvc2FsQ3JlYXRlZEhlaWdodCByZXR1cm5zIHRoZSBibG9jayBoZWlnaHQgYXQgd2hpY2ggYSBwcm9wb3NhbCB3YXMgY3JlYXRlZC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb3Bvc2FsSWQ6IHByb3Bvc2FsIGlkZW50aWZpZXIgdG8gbG9vayB1cC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiBjcmVhdGlvbiBibG9jayBoZWlnaHQuCgkvLyAgIC0gZXJyb3I6IG5pbCB3aGVuIGZvdW5kOyBvdGhlcndpc2UgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGUgcHJvcG9zYWwgaXMgbWlzc2luZy4KCUdldFByb3Bvc2FsQ3JlYXRlZEhlaWdodChwcm9wb3NhbElkIGludDY0KSAoaW50NjQsIGVycm9yKQoJLy8gR2V0UHJvcG9zYWxDb21tdW5pdHlQb29sU3BlbmRJbmZvIHJldHVybnMgdGhlIHRyZWFzdXJ5LXRyYW5zZmVyIHBheWxvYWQgb2YgYSBwcm9wb3NhbC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb3Bvc2FsSUQ6IHByb3Bvc2FsIGlkZW50aWZpZXIgdG8gbG9vayB1cC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtICpDb21tdW5pdHlQb29sU3BlbmRJbmZvOiBzcGVuZCBwYXlsb2FkLCBvciBuaWwgd2hlbiB0aGUgcHJvcG9zYWwgaXMgYWJzZW50IG9yIGFub3RoZXIgdHlwZS4KCS8vICAgLSBlcnJvcjogbmlsIGZvciBhIGNvbW11bml0eS1wb29sLXNwZW5kIHByb3Bvc2FsOyBvdGhlcndpc2UgYSBub3QtZm91bmQgb3Igd3JvbmctdHlwZSBlcnJvci4KCUdldFByb3Bvc2FsQ29tbXVuaXR5UG9vbFNwZW5kSW5mbyhwcm9wb3NhbElEIGludDY0KSAoKkNvbW11bml0eVBvb2xTcGVuZEluZm8sIGVycm9yKQoJLy8gR2V0UHJvcG9zYWxFeGVjdXRpb25JbmZvIHJldHVybnMgdGhlIHBhcmFtZXRlci1leGVjdXRpb24gcGF5bG9hZCBvZiBhIHByb3Bvc2FsLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvcG9zYWxJRDogcHJvcG9zYWwgaWRlbnRpZmllciB0byBsb29rIHVwLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gKkV4ZWN1dGlvbkluZm86IGV4ZWN1dGlvbiBwYXlsb2FkLCBvciBuaWwgd2hlbiB0aGUgcHJvcG9zYWwgaXMgYWJzZW50IG9yIGFub3RoZXIgdHlwZS4KCS8vICAgLSBlcnJvcjogbmlsIGZvciBhIHBhcmFtZXRlci1jaGFuZ2UgcHJvcG9zYWw7IG90aGVyd2lzZSBhIG5vdC1mb3VuZCBvciB3cm9uZy10eXBlIGVycm9yLgoJR2V0UHJvcG9zYWxFeGVjdXRpb25JbmZvKHByb3Bvc2FsSUQgaW50NjQpICgqRXhlY3V0aW9uSW5mbywgZXJyb3IpCgkvLyBHZXRZZWFCeVByb3Bvc2FsSWQgcmV0dXJucyB0aGUgYWZmaXJtYXRpdmUgdm90ZSB3ZWlnaHQgcmVjb3JkZWQgb24gYSBwcm9wb3NhbC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb3Bvc2FsSWQ6IHByb3Bvc2FsIGlkZW50aWZpZXIgdG8gbG9vayB1cC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiB0b3RhbCB5ZXMtdm90ZSB3ZWlnaHQuCgkvLyAgIC0gZXJyb3I6IG5pbCB3aGVuIGZvdW5kOyBvdGhlcndpc2UgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGUgcHJvcG9zYWwgaXMgbWlzc2luZy4KCUdldFllYUJ5UHJvcG9zYWxJZChwcm9wb3NhbElkIGludDY0KSAoaW50NjQsIGVycm9yKQoJLy8gR2V0TmF5QnlQcm9wb3NhbElkIHJldHVybnMgdGhlIG5lZ2F0aXZlIHZvdGUgd2VpZ2h0IHJlY29yZGVkIG9uIGEgcHJvcG9zYWwuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwcm9wb3NhbElkOiBwcm9wb3NhbCBpZGVudGlmaWVyIHRvIGxvb2sgdXAuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBpbnQ2NDogdG90YWwgbm8tdm90ZSB3ZWlnaHQuCgkvLyAgIC0gZXJyb3I6IG5pbCB3aGVuIGZvdW5kOyBvdGhlcndpc2UgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGUgcHJvcG9zYWwgaXMgbWlzc2luZy4KCUdldE5heUJ5UHJvcG9zYWxJZChwcm9wb3NhbElkIGludDY0KSAoaW50NjQsIGVycm9yKQoJLy8gR2V0Q29uZmlnVmVyc2lvbkJ5UHJvcG9zYWxJZCByZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIHZlcnNpb24gY2FwdHVyZWQgYnkgYSBwcm9wb3NhbC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb3Bvc2FsSWQ6IHByb3Bvc2FsIGlkZW50aWZpZXIgdG8gbG9vayB1cC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiBjb25maWd1cmF0aW9uIHZlcnNpb24gdXNlZCB0byBjcmVhdGUgdGhlIHByb3Bvc2FsLgoJLy8gICAtIGVycm9yOiBuaWwgd2hlbiBmb3VuZDsgb3RoZXJ3aXNlIGFuIGVycm9yIGluZGljYXRpbmcgdGhlIHByb3Bvc2FsIGlzIG1pc3NpbmcuCglHZXRDb25maWdWZXJzaW9uQnlQcm9wb3NhbElkKHByb3Bvc2FsSWQgaW50NjQpIChpbnQ2NCwgZXJyb3IpCgkvLyBHZXRRdW9ydW1BbW91bnRCeVByb3Bvc2FsSWQgcmV0dXJucyB0aGUgcHJvcG9zYWwncyBzdG9yZWQgcXVvcnVtIHJlcXVpcmVtZW50LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvcG9zYWxJZDogcHJvcG9zYWwgaWRlbnRpZmllciB0byBsb29rIHVwLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW50NjQ6IG1pbmltdW0gdm90ZSB3ZWlnaHQgcmVxdWlyZWQgZm9yIHF1b3J1bS4KCS8vICAgLSBlcnJvcjogbmlsIHdoZW4gZm91bmQ7IG90aGVyd2lzZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoZSBwcm9wb3NhbCBpcyBtaXNzaW5nLgoJR2V0UXVvcnVtQW1vdW50QnlQcm9wb3NhbElkKHByb3Bvc2FsSWQgaW50NjQpIChpbnQ2NCwgZXJyb3IpCgkvLyBHZXRUaXRsZUJ5UHJvcG9zYWxJZCByZXR1cm5zIGEgcHJvcG9zYWwncyB0aXRsZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb3Bvc2FsSWQ6IHByb3Bvc2FsIGlkZW50aWZpZXIgdG8gbG9vayB1cC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHN0cmluZzogdGl0bGUgc3RvcmVkIGluIHByb3Bvc2FsIG1ldGFkYXRhLgoJLy8gICAtIGVycm9yOiBuaWwgd2hlbiBmb3VuZDsgb3RoZXJ3aXNlIGFuIGVycm9yIGluZGljYXRpbmcgdGhlIHByb3Bvc2FsIGlzIG1pc3NpbmcuCglHZXRUaXRsZUJ5UHJvcG9zYWxJZChwcm9wb3NhbElkIGludDY0KSAoc3RyaW5nLCBlcnJvcikKCS8vIEdldERlc2NyaXB0aW9uQnlQcm9wb3NhbElkIHJldHVybnMgYSBwcm9wb3NhbCdzIGZ1bGwgZGVzY3JpcHRpb24uCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwcm9wb3NhbElkOiBwcm9wb3NhbCBpZGVudGlmaWVyIHRvIGxvb2sgdXAuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBzdHJpbmc6IGRlc2NyaXB0aW9uIHN0b3JlZCBpbiBwcm9wb3NhbCBtZXRhZGF0YS4KCS8vICAgLSBlcnJvcjogbmlsIHdoZW4gZm91bmQ7IG90aGVyd2lzZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoZSBwcm9wb3NhbCBpcyBtaXNzaW5nLgoJR2V0RGVzY3JpcHRpb25CeVByb3Bvc2FsSWQocHJvcG9zYWxJZCBpbnQ2NCkgKHN0cmluZywgZXJyb3IpCgkvLyBHZXRQcm9wb3NhbFN0YXR1c0J5UHJvcG9zYWxJZCByZXR1cm5zIHRoZSBjdXJyZW50IHN0YXR1cyBzdHJpbmcgZm9yIGEgcHJvcG9zYWwuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwcm9wb3NhbElkOiBwcm9wb3NhbCBpZGVudGlmaWVyIHRvIGxvb2sgdXAuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBzdHJpbmc6IHN0YXR1cyBjb21wdXRlZCBmcm9tIHRoZSBwcm9wb3NhbCBzdGF0ZSBhbmQgY3VycmVudCB0aW1lLgoJLy8gICAtIGVycm9yOiBuaWwgd2hlbiBmb3VuZDsgb3RoZXJ3aXNlIGFuIGVycm9yIGluZGljYXRpbmcgdGhlIHByb3Bvc2FsIGlzIG1pc3NpbmcuCglHZXRQcm9wb3NhbFN0YXR1c0J5UHJvcG9zYWxJZChwcm9wb3NhbElkIGludDY0KSAoc3RyaW5nLCBlcnJvcikKCgkvLyBWb3RlIGdldHRlcnMKCS8vIEdldFZvdGVTdGF0dXMgcmV0dXJucyB0aGUgcXVvcnVtIGFuZCB2b3RlIHRhbGxpZXMgc3RvcmVkIGZvciBhIHByb3Bvc2FsLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvcG9zYWxJZDogcHJvcG9zYWwgaWRlbnRpZmllciB0byBsb29rIHVwLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gcXVvcnVtOiBtaW5pbXVtIHZvdGUgd2VpZ2h0IHJlcXVpcmVkIGZvciBxdW9ydW0uCgkvLyAgIC0gbWF4Vm90aW5nV2VpZ2h0OiBtYXhpbXVtIHZvdGluZyB3ZWlnaHQgY2FwdHVyZWQgYXQgcHJvcG9zYWwgY3JlYXRpb24uCgkvLyAgIC0geWVzV2VpZ2h0OiB0b3RhbCBhZmZpcm1hdGl2ZSB2b3RlIHdlaWdodC4KCS8vICAgLSBub1dlaWdodDogdG90YWwgbmVnYXRpdmUgdm90ZSB3ZWlnaHQuCgkvLyAgIC0gZXJyOiBuaWwgd2hlbiBmb3VuZDsgb3RoZXJ3aXNlIGFuIGVycm9yIGluZGljYXRpbmcgdGhlIHByb3Bvc2FsIGlzIG1pc3NpbmcuCglHZXRWb3RlU3RhdHVzKHByb3Bvc2FsSWQgaW50NjQpIChxdW9ydW0sIG1heFZvdGluZ1dlaWdodCwgeWVzV2VpZ2h0LCBub1dlaWdodCBpbnQ2NCwgZXJyIGVycm9yKQoJLy8gR2V0Vm90aW5nSW5mb3MgcmV0dXJucyBhIHJlYWQtb25seSB2aWV3IG9mIGEgcHJvcG9zYWwncyB2b3RlciByZWNvcmRzLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvcG9zYWxJRDogcHJvcG9zYWwgaWRlbnRpZmllciB3aG9zZSB2b3RpbmcgcmVjb3JkcyBzaG91bGQgYmUgdmlld2VkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gKnJvdHJlZS5SZWFkT25seVRyZWU6IHJlYWQtb25seSB2b3Rlci1pbmZvIHRyZWUsIG9yIG5pbCB3aGVuIGl0cyBzdG9yZWQgdHJlZSBpcyBhYnNlbnQuCglHZXRWb3RpbmdJbmZvcyhwcm9wb3NhbElEIGludDY0KSAqcm90cmVlLlJlYWRPbmx5VHJlZQoJLy8gRXhpc3RzVm90aW5nSW5mbyByZXBvcnRzIHdoZXRoZXIgYW4gYWRkcmVzcyBoYXMgYSB2b3RpbmcgcmVjb3JkIGZvciBhIHByb3Bvc2FsLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvcG9zYWxJRDogcHJvcG9zYWwgaWRlbnRpZmllciB0byBpbnNwZWN0LgoJLy8gICAtIGFkZHI6IHZvdGVyIGFkZHJlc3MgdG8gbG9vayB1cC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGJvb2w6IHRydWUgd2hlbiBhIHZvdGluZyByZWNvcmQgZXhpc3RzIGZvciB0aGUgcHJvcG9zYWwgYW5kIGFkZHJlc3MuCglFeGlzdHNWb3RpbmdJbmZvKHByb3Bvc2FsSUQgaW50NjQsIGFkZHIgYWRkcmVzcykgYm9vbAoJLy8gR2V0Vm90ZVdlaWdodCByZXR1cm5zIHRoZSByZWNvcmRlZCB2b3Rpbmcgd2VpZ2h0IGZvciBhbiBhZGRyZXNzLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvcG9zYWxJRDogcHJvcG9zYWwgaWRlbnRpZmllciB0byBpbnNwZWN0LgoJLy8gICAtIGFkZHI6IHZvdGVyIGFkZHJlc3MgdG8gbG9vayB1cC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiB3ZWlnaHQgYXBwbGllZCB0byB0aGUgYWRkcmVzcydzIHZvdGUuCgkvLyAgIC0gZXJyb3I6IG5pbCB3aGVuIGEgdm90aW5nIHJlY29yZCBleGlzdHM7IG90aGVyd2lzZSBhbiBlcnJvciBpZGVudGlmeWluZyB0aGUgbWlzc2luZyByZWNvcmQuCglHZXRWb3RlV2VpZ2h0KHByb3Bvc2FsSUQgaW50NjQsIGFkZHIgYWRkcmVzcykgKGludDY0LCBlcnJvcikKCS8vIEdldFZvdGVkSGVpZ2h0IHJldHVybnMgdGhlIGJsb2NrIGhlaWdodCBhdCB3aGljaCBhbiBhZGRyZXNzIHZvdGVkLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvcG9zYWxJRDogcHJvcG9zYWwgaWRlbnRpZmllciB0byBpbnNwZWN0LgoJLy8gICAtIGFkZHI6IHZvdGVyIGFkZHJlc3MgdG8gbG9vayB1cC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiBibG9jayBoZWlnaHQgcmVjb3JkZWQgZm9yIHRoZSB2b3RlLgoJLy8gICAtIGVycm9yOiBuaWwgd2hlbiBhIHZvdGluZyByZWNvcmQgZXhpc3RzOyBvdGhlcndpc2UgYW4gZXJyb3IgaWRlbnRpZnlpbmcgdGhlIG1pc3NpbmcgcmVjb3JkLgoJR2V0Vm90ZWRIZWlnaHQocHJvcG9zYWxJRCBpbnQ2NCwgYWRkciBhZGRyZXNzKSAoaW50NjQsIGVycm9yKQoJLy8gR2V0Vm90ZWRBdCByZXR1cm5zIHRoZSB0aW1lc3RhbXAgYXQgd2hpY2ggYW4gYWRkcmVzcyB2b3RlZC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb3Bvc2FsSUQ6IHByb3Bvc2FsIGlkZW50aWZpZXIgdG8gaW5zcGVjdC4KCS8vICAgLSBhZGRyOiB2b3RlciBhZGRyZXNzIHRvIGxvb2sgdXAuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBpbnQ2NDogdm90ZSB0aW1lc3RhbXAgYXMgVW5peCBzZWNvbmRzLgoJLy8gICAtIGVycm9yOiBuaWwgd2hlbiBhIHZvdGluZyByZWNvcmQgZXhpc3RzOyBvdGhlcndpc2UgYW4gZXJyb3IgaWRlbnRpZnlpbmcgdGhlIG1pc3NpbmcgcmVjb3JkLgoJR2V0Vm90ZWRBdChwcm9wb3NhbElEIGludDY0LCBhZGRyIGFkZHJlc3MpIChpbnQ2NCwgZXJyb3IpCgoJLy8gR2V0VXNlclByb3Bvc2FscyByZXR1cm5zIGEgcmVhZC1vbmx5IHZpZXcgb2YgcHJvcG9zYWwgSURzIGdyb3VwZWQgYnkgY3JlYXRvciBhZGRyZXNzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gKnJvdHJlZS5SZWFkT25seVRyZWU6IHJlYWQtb25seSBjcmVhdG9yLXRvLXByb3Bvc2FsLUlEIHRyZWUgd2l0aCBjb3BpZWQgSUQgc2xpY2VzLgoJR2V0VXNlclByb3Bvc2FscygpICpyb3RyZWUuUmVhZE9ubHlUcmVlCgoJLy8gQWN0aXZlIHByb3Bvc2FsIHF1ZXJ5CgkvLyBHZXRPbGRlc3RBY3RpdmVQcm9wb3NhbFNuYXBzaG90VGltZSBpbnNwZWN0cyB0aGUgZmlyc3QgdGltZXN0YW1wLW9yZGVyZWQgYWN0aXZlLXByb3Bvc2FsIGluZGV4IGVudHJ5LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gc25hcHNob3RUaW1lOiBzbmFwc2hvdCB0aW1lc3RhbXAgb2YgdGhlIG9sZGVzdCBhY3RpdmUgcHJvcG9zYWwuCgkvLyAgIC0gaGFzQWN0aXZlOiB0cnVlIHdoZW4gYW4gYWN0aXZlIGluZGV4ZWQgcHJvcG9zYWwgd2FzIGZvdW5kOyBmYWxzZSB3aGVuIHRoZSBpbmRleCBpcyBlbXB0eS4KCS8vICAgLSBlcnJvcjogbmlsIG9uIHN1Y2Nlc3M7IG90aGVyd2lzZSBhbiBlcnJvciB3aGVuIHRoZSBpbmRleCBlbnRyeSBpcyBtaXNzaW5nIG9yIG5lZWRzIGNsZWFudXAuCglHZXRPbGRlc3RBY3RpdmVQcm9wb3NhbFNuYXBzaG90VGltZSgpIChpbnQ2NCwgYm9vbCwgZXJyb3IpCgoJLy8gVm90aW5nIHdlaWdodCBzbmFwc2hvdCBnZXR0ZXJzCgkvLyBHZXRDdXJyZW50Vm90aW5nV2VpZ2h0U25hcHNob3QgY29tcHV0ZXMgdGhlIGN1cnJlbnQgdG90YWwgdm90aW5nIHdlaWdodCBhbmQgaXRzIHNtb290aGVkIHRpbWVzdGFtcCBhbmNob3IuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0b3RhbFZvdGluZ1dlaWdodDogdG90YWwgZGVsZWdhdGlvbiB3ZWlnaHQgYXQgdGhlIGNvbXB1dGVkIHNuYXBzaG90LgoJLy8gICAtIHNuYXBzaG90VGltZTogVW5peCB0aW1lc3RhbXAgdXNlZCBhcyB0aGUgc25hcHNob3QgYW5jaG9yLgoJLy8gICAtIGVycm9yOiBuaWwgd2hlbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGFuZCBzbmFwc2hvdCBhcmUgYXZhaWxhYmxlOyBvdGhlcndpc2UgdGhlIGxvb2t1cCBlcnJvci4KCUdldEN1cnJlbnRWb3RpbmdXZWlnaHRTbmFwc2hvdCgpIChpbnQ2NCwgaW50NjQsIGVycm9yKQp9Cgp0eXBlIElHb3Zlcm5hbmNlU3RvcmUgaW50ZXJmYWNlIHsKCS8vIENvdW50ZXIgbWV0aG9kcwoJLy8gSGFzQ29uZmlnQ291bnRlclN0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgY29uZmlndXJhdGlvbiBjb3VudGVyIGtleSBleGlzdHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBib29sOiB0cnVlIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gY291bnRlciBpcyBwcmVzZW50IGluIHBlcnNpc3RlbnQgc3RvcmFnZS4KCUhhc0NvbmZpZ0NvdW50ZXJTdG9yZUtleSgpIGJvb2wKCS8vIEdldENvbmZpZ0NvdW50ZXIgcmV0dXJucyB0aGUgcGVyc2lzdGVkIGNvbmZpZ3VyYXRpb24tdmVyc2lvbiBjb3VudGVyLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gKkNvdW50ZXI6IHN0b3JlZCBjb25maWd1cmF0aW9uIGNvdW50ZXI7IHVuZGVybHlpbmcgc3RvcmFnZS90eXBlIGZhaWx1cmVzIHBhbmljLgoJR2V0Q29uZmlnQ291bnRlcigpICpDb3VudGVyCgkvLyBTZXRDb25maWdDb3VudGVyIHBlcnNpc3RzIHRoZSBjb25maWd1cmF0aW9uLXZlcnNpb24gY291bnRlci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yIGZvciB0aGUgaW50ZXJuYWwgc3RvcmUgbWV0aG9kOyBjYWxsZXJzIHBhc3MgMC4KCS8vICAgLSBybG06IGZvcndhcmRlZCByZWFsbSBjb250ZXh0IGZvciB0aGUgcGVyc2lzdGVudCB3cml0ZTsgdGhlIHN0b3JlIHZhbGlkYXRlcyBpdCBhcyBjdXJyZW50LgoJLy8gICAtIGNvdW50ZXI6IGNvdW50ZXIgdmFsdWUgdG8gc3RvcmUuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnJvcjogbmlsIHdoZW4gcGVyc2lzdGVkOyBvdGhlcndpc2UgYSBzcG9vZmVkLXJlYWxtIG9yIGtleS12YWx1ZSBzdG9yZSBlcnJvci4KCVNldENvbmZpZ0NvdW50ZXIoXyBpbnQsIHJsbSByZWFsbSwgY291bnRlciAqQ291bnRlcikgZXJyb3IKCgkvLyBIYXNQcm9wb3NhbENvdW50ZXJTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIHByb3Bvc2FsIGNvdW50ZXIga2V5IGV4aXN0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGJvb2w6IHRydWUgd2hlbiB0aGUgcHJvcG9zYWwgY291bnRlciBpcyBwcmVzZW50IGluIHBlcnNpc3RlbnQgc3RvcmFnZS4KCUhhc1Byb3Bvc2FsQ291bnRlclN0b3JlS2V5KCkgYm9vbAoJLy8gR2V0UHJvcG9zYWxDb3VudGVyIHJldHVybnMgdGhlIHBlcnNpc3RlZCBwcm9wb3NhbC1JRCBjb3VudGVyLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gKkNvdW50ZXI6IHN0b3JlZCBwcm9wb3NhbCBjb3VudGVyOyB1bmRlcmx5aW5nIHN0b3JhZ2UvdHlwZSBmYWlsdXJlcyBwYW5pYy4KCUdldFByb3Bvc2FsQ291bnRlcigpICpDb3VudGVyCgkvLyBTZXRQcm9wb3NhbENvdW50ZXIgcGVyc2lzdHMgdGhlIHByb3Bvc2FsLUlEIGNvdW50ZXIuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvciBmb3IgdGhlIGludGVybmFsIHN0b3JlIG1ldGhvZDsgY2FsbGVycyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBmb3J3YXJkZWQgcmVhbG0gY29udGV4dCBmb3IgdGhlIHBlcnNpc3RlbnQgd3JpdGU7IHRoZSBzdG9yZSB2YWxpZGF0ZXMgaXQgYXMgY3VycmVudC4KCS8vICAgLSBjb3VudGVyOiBjb3VudGVyIHZhbHVlIHRvIHN0b3JlLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyb3I6IG5pbCB3aGVuIHBlcnNpc3RlZDsgb3RoZXJ3aXNlIGEgc3Bvb2ZlZC1yZWFsbSBvciBrZXktdmFsdWUgc3RvcmUgZXJyb3IuCglTZXRQcm9wb3NhbENvdW50ZXIoXyBpbnQsIHJsbSByZWFsbSwgY291bnRlciAqQ291bnRlcikgZXJyb3IKCgkvLyBDb25maWcgbWV0aG9kcwoJLy8gSGFzQ29uZmlnc1N0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgY29uZmlndXJhdGlvbnMgdHJlZSBrZXkgZXhpc3RzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRoZSBjb25maWd1cmF0aW9ucyB0cmVlIGlzIHByZXNlbnQgaW4gcGVyc2lzdGVudCBzdG9yYWdlLgoJSGFzQ29uZmlnc1N0b3JlS2V5KCkgYm9vbAoJLy8gU2V0Q29uZmlncyByZXBsYWNlcyB0aGUgcGVyc2lzdGVkIGNvbmZpZ3VyYXRpb24tdmVyc2lvbiB0cmVlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBpbnRlcm5hbCBzdG9yZSBtZXRob2Q7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogZm9yd2FyZGVkIHJlYWxtIGNvbnRleHQgZm9yIHRoZSBwZXJzaXN0ZW50IHdyaXRlOyB0aGUgc3RvcmUgdmFsaWRhdGVzIGl0IGFzIGN1cnJlbnQuCgkvLyAgIC0gY29uZmlnczogY29uZmlndXJhdGlvbi12ZXJzaW9uIHRyZWUgdG8gc3RvcmUuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnJvcjogbmlsIHdoZW4gcGVyc2lzdGVkOyBvdGhlcndpc2UgYSBzcG9vZmVkLXJlYWxtIG9yIGtleS12YWx1ZSBzdG9yZSBlcnJvci4KCVNldENvbmZpZ3MoXyBpbnQsIHJsbSByZWFsbSwgY29uZmlncyAqYnB0cmVlLkJQVHJlZSkgZXJyb3IKCS8vIFNldENvbmZpZyBzdG9yZXMgb25lIGNvbmZpZ3VyYXRpb24gdW5kZXIgaXRzIHZlcnNpb24ga2V5LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBpbnRlcm5hbCBzdG9yZSBtZXRob2Q7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogZm9yd2FyZGVkIHJlYWxtIGNvbnRleHQgZm9yIHRoZSBwZXJzaXN0ZW50IHdyaXRlOyB0aGUgc3RvcmUgdmFsaWRhdGVzIGl0IGFzIGN1cnJlbnQuCgkvLyAgIC0gdmVyc2lvbjogY29uZmlndXJhdGlvbiB2ZXJzaW9uIGtleS4KCS8vICAgLSBjb25maWc6IGNvbmZpZ3VyYXRpb24gdmFsdWUgdG8gc3RvcmUuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnJvcjogbmlsIHdoZW4gcGVyc2lzdGVkOyBvdGhlcndpc2UgYSBzcG9vZmVkLXJlYWxtLCBtaXNzaW5nLXRyZWUsIG9yIGtleS12YWx1ZSBzdG9yZSBlcnJvci4KCVNldENvbmZpZyhfIGludCwgcmxtIHJlYWxtLCB2ZXJzaW9uIGludDY0LCBjb25maWcgQ29uZmlnKSBlcnJvcgoJLy8gR2V0Q29uZmlnIHJldHJpZXZlcyBvbmUgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBwZXJzaXN0ZWQgdmVyc2lvbiB0cmVlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gdmVyc2lvbjogY29uZmlndXJhdGlvbiB2ZXJzaW9uIGtleSB0byBsb29rIHVwLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gQ29uZmlnOiBzdG9yZWQgY29uZmlndXJhdGlvbiwgb3IgaXRzIHplcm8gdmFsdWUgd2hlbiBhYnNlbnQ7IHdyb25nIHN0b3JlZCB0eXBlcyBwYW5pYy4KCS8vICAgLSBib29sOiB0cnVlIHdoZW4gYSBjb25maWd1cmF0aW9uIGV4aXN0cyBmb3IgdmVyc2lvbi4KCUdldENvbmZpZyh2ZXJzaW9uIGludDY0KSAoQ29uZmlnLCBib29sKQoKCS8vIFByb3Bvc2FsIG1ldGhvZHMKCS8vIEhhc1Byb3Bvc2Fsc1N0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgcHJvcG9zYWxzIHRyZWUga2V5IGV4aXN0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGJvb2w6IHRydWUgd2hlbiB0aGUgcHJvcG9zYWxzIHRyZWUgaXMgcHJlc2VudCBpbiBwZXJzaXN0ZW50IHN0b3JhZ2UuCglIYXNQcm9wb3NhbHNTdG9yZUtleSgpIGJvb2wKCS8vIEdldFByb3Bvc2FscyByZXR1cm5zIHRoZSBtdXRhYmxlIGRvbWFpbi1vd25lZCBwcm9wb3NhbHMgdHJlZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtICpicHRyZWUuQlBUcmVlOiBzdG9yZWQgcHJvcG9zYWwgdHJlZSBrZXllZCBieSBwcm9wb3NhbCBJRCBzdHJpbmc7IHN0b3JhZ2UvdHlwZSBmYWlsdXJlcyBwYW5pYy4KCUdldFByb3Bvc2FscygpICpicHRyZWUuQlBUcmVlCgkvLyBHZXRQcm9wb3NhbCByZXRyaWV2ZXMgYSBwcm9wb3NhbCBieSBudW1lcmljIElELgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvcG9zYWxJRDogcHJvcG9zYWwgaWRlbnRpZmllciB1c2VkIGFzIHRoZSB0cmVlIGtleS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtICpQcm9wb3NhbDogc3RvcmVkIHByb3Bvc2FsIHdoZW4gcHJlc2VudCBhbmQgY29ycmVjdGx5IHR5cGVkLgoJLy8gICAtIGJvb2w6IHRydWUgd2hlbiBhIHZhbGlkIHByb3Bvc2FsIGV4aXN0cyBmb3IgcHJvcG9zYWxJRC4KCUdldFByb3Bvc2FsKHByb3Bvc2FsSUQgaW50NjQpICgqUHJvcG9zYWwsIGJvb2wpCgkvLyBTZXRQcm9wb3NhbCBzdG9yZXMgYSBwcm9wb3NhbCB1bmRlciBpdHMgbWF0Y2hpbmcgbnVtZXJpYyBJRC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yIGZvciB0aGUgaW50ZXJuYWwgc3RvcmUgbWV0aG9kOyBjYWxsZXJzIHBhc3MgMC4KCS8vICAgLSBybG06IGZvcndhcmRlZCByZWFsbSBjb250ZXh0IGZvciB0aGUgcGVyc2lzdGVudCB3cml0ZTsgdGhlIHN0b3JlIHZhbGlkYXRlcyBpdCBhcyBjdXJyZW50LgoJLy8gICAtIHByb3Bvc2FsSUQ6IHN0b3JhZ2Uga2V5IHRoYXQgbXVzdCBtYXRjaCBwcm9wb3NhbC5JRCgpLgoJLy8gICAtIHByb3Bvc2FsOiBwcm9wb3NhbCB2YWx1ZSB0byBwZXJzaXN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyb3I6IG5pbCB3aGVuIHBlcnNpc3RlZDsgb3RoZXJ3aXNlIGEgc3Bvb2ZlZC1yZWFsbSwgbWlzc2luZy10cmVlLCBvciBJRC1taXNtYXRjaCBlcnJvci4KCVNldFByb3Bvc2FsKF8gaW50LCBybG0gcmVhbG0sIHByb3Bvc2FsSUQgaW50NjQsIHByb3Bvc2FsICpQcm9wb3NhbCkgZXJyb3IKCS8vIFNldFByb3Bvc2FscyByZXBsYWNlcyB0aGUgcGVyc2lzdGVkIHByb3Bvc2FscyB0cmVlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBpbnRlcm5hbCBzdG9yZSBtZXRob2Q7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogZm9yd2FyZGVkIHJlYWxtIGNvbnRleHQgZm9yIHRoZSBwZXJzaXN0ZW50IHdyaXRlOyB0aGUgc3RvcmUgdmFsaWRhdGVzIGl0IGFzIGN1cnJlbnQuCgkvLyAgIC0gcHJvcG9zYWxzOiBwcm9wb3NhbCB0cmVlIHRvIHBlcnNpc3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnJvcjogbmlsIHdoZW4gcGVyc2lzdGVkOyBvdGhlcndpc2UgYSBzcG9vZmVkLXJlYWxtIG9yIGtleS12YWx1ZSBzdG9yZSBlcnJvci4KCVNldFByb3Bvc2FscyhfIGludCwgcmxtIHJlYWxtLCBwcm9wb3NhbHMgKmJwdHJlZS5CUFRyZWUpIGVycm9yCgoJLy8gSGFzQWN0aXZlUHJvcG9zYWxzQnlTbmFwc2hvdFN0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgYWN0aXZlLXByb3Bvc2FsIHNuYXBzaG90IGluZGV4IGV4aXN0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGJvb2w6IHRydWUgd2hlbiB0aGUgdGltZXN0YW1wLW9yZGVyZWQgYWN0aXZlLXByb3Bvc2FsIGluZGV4IGlzIHByZXNlbnQuCglIYXNBY3RpdmVQcm9wb3NhbHNCeVNuYXBzaG90U3RvcmVLZXkoKSBib29sCgkvLyBHZXRBY3RpdmVQcm9wb3NhbHNCeVNuYXBzaG90IHJldHVybnMgdGhlIGRvbWFpbi1vd25lZCBhY3RpdmUtcHJvcG9zYWwgc25hcHNob3QgaW5kZXguCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSAqYnB0cmVlLkJQVHJlZTogaW5kZXgga2V5ZWQgYnkgc25hcHNob3QgdGltZXN0YW1wIGFuZCBjb250YWluaW5nIHByb3Bvc2FsIElEczsgc3RvcmFnZS90eXBlIGZhaWx1cmVzIHBhbmljLgoJR2V0QWN0aXZlUHJvcG9zYWxzQnlTbmFwc2hvdCgpICpicHRyZWUuQlBUcmVlCgkvLyBTZXRBY3RpdmVQcm9wb3NhbHNCeVNuYXBzaG90IHJlcGxhY2VzIHRoZSBhY3RpdmUtcHJvcG9zYWwgc25hcHNob3QgaW5kZXguCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvciBmb3IgdGhlIGludGVybmFsIHN0b3JlIG1ldGhvZDsgY2FsbGVycyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBmb3J3YXJkZWQgcmVhbG0gY29udGV4dCBmb3IgdGhlIHBlcnNpc3RlbnQgd3JpdGU7IHRoZSBzdG9yZSB2YWxpZGF0ZXMgaXQgYXMgY3VycmVudC4KCS8vICAgLSB0cmVlOiB0aW1lc3RhbXAtb3JkZXJlZCBhY3RpdmUtcHJvcG9zYWwgaW5kZXggdG8gcGVyc2lzdC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycm9yOiBuaWwgd2hlbiBwZXJzaXN0ZWQ7IG90aGVyd2lzZSBhIHNwb29mZWQtcmVhbG0gb3Iga2V5LXZhbHVlIHN0b3JlIGVycm9yLgoJU2V0QWN0aXZlUHJvcG9zYWxzQnlTbmFwc2hvdChfIGludCwgcmxtIHJlYWxtLCB0cmVlICpicHRyZWUuQlBUcmVlKSBlcnJvcgoKCS8vIFByb3Bvc2FsIHZvdGluZyBpbmZvIG1ldGhvZHMKCS8vIEhhc1Byb3Bvc2FsVXNlclZvdGluZ0luZm9zU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSByb290IHZvdGluZy1pbmZvIHRyZWUgZXhpc3RzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHByb3Bvc2FsIHZvdGluZy1pbmZvIHN0b3JhZ2UgaXMgcHJlc2VudC4KCUhhc1Byb3Bvc2FsVXNlclZvdGluZ0luZm9zU3RvcmVLZXkoKSBib29sCgkvLyBHZXRQcm9wb3NhbFVzZXJWb3RpbmdJbmZvcyByZXR1cm5zIHRoZSByb290IHByb3Bvc2FsLXRvLXZvdGVyLWluZm8gdHJlZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtICpicHRyZWUuQlBUcmVlOiBzdG9yZWQgdHJlZSBjb250YWluaW5nIG9uZSB2b3Rlci1pbmZvIHRyZWUgcGVyIHByb3Bvc2FsOyBzdG9yYWdlL3R5cGUgZmFpbHVyZXMgcGFuaWMuCglHZXRQcm9wb3NhbFVzZXJWb3RpbmdJbmZvcygpICpicHRyZWUuQlBUcmVlCgkvLyBTZXRQcm9wb3NhbFVzZXJWb3RpbmdJbmZvcyByZXBsYWNlcyB0aGUgcm9vdCBwcm9wb3NhbC10by12b3Rlci1pbmZvIHRyZWUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvciBmb3IgdGhlIGludGVybmFsIHN0b3JlIG1ldGhvZDsgY2FsbGVycyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBmb3J3YXJkZWQgcmVhbG0gY29udGV4dCBmb3IgdGhlIHBlcnNpc3RlbnQgd3JpdGU7IHRoZSBzdG9yZSB2YWxpZGF0ZXMgaXQgYXMgY3VycmVudC4KCS8vICAgLSB2b3RpbmdJbmZvczogcm9vdCBwcm9wb3NhbC10by12b3Rlci1pbmZvIHRyZWUgdG8gcGVyc2lzdC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycm9yOiBuaWwgd2hlbiBwZXJzaXN0ZWQ7IG90aGVyd2lzZSBhIHNwb29mZWQtcmVhbG0gb3Iga2V5LXZhbHVlIHN0b3JlIGVycm9yLgoJU2V0UHJvcG9zYWxVc2VyVm90aW5nSW5mb3MoXyBpbnQsIHJsbSByZWFsbSwgdm90aW5nSW5mb3MgKmJwdHJlZS5CUFRyZWUpIGVycm9yCgkvLyBHZXRQcm9wb3NhbFZvdGluZ0luZm9zIHJldHVybnMgdGhlIHZvdGVyLWluZm8gdHJlZSBmb3Igb25lIHByb3Bvc2FsLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvcG9zYWxJRDogcHJvcG9zYWwgaWRlbnRpZmllciB1c2VkIGFzIHRoZSByb290LXRyZWUga2V5LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gKmJwdHJlZS5CUFRyZWU6IHZvdGVyLWFkZHJlc3MtdG8tdm90aW5nLWluZm8gdHJlZSB3aGVuIHByZXNlbnQuCgkvLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRoZSBwcm9wb3NhbCBoYXMgYSBjb3JyZWN0bHkgdHlwZWQgdm90ZXItaW5mbyB0cmVlLgoJR2V0UHJvcG9zYWxWb3RpbmdJbmZvcyhwcm9wb3NhbElEIGludDY0KSAoKmJwdHJlZS5CUFRyZWUsIGJvb2wpCgkvLyBTZXRQcm9wb3NhbFZvdGluZ0luZm9zIHN0b3JlcyBvbmUgcHJvcG9zYWwncyB2b3Rlci1pbmZvIHRyZWUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvciBmb3IgdGhlIGludGVybmFsIHN0b3JlIG1ldGhvZDsgY2FsbGVycyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBmb3J3YXJkZWQgcmVhbG0gY29udGV4dCBmb3IgdGhlIHBlcnNpc3RlbnQgd3JpdGU7IHRoZSBzdG9yZSB2YWxpZGF0ZXMgaXQgYXMgY3VycmVudC4KCS8vICAgLSBwcm9wb3NhbElEOiBwcm9wb3NhbCBpZGVudGlmaWVyIHVzZWQgYXMgdGhlIHJvb3QtdHJlZSBrZXkuCgkvLyAgIC0gdm90aW5nSW5mb3M6IHZvdGVyLWFkZHJlc3MtdG8tdm90aW5nLWluZm8gdHJlZSB0byBwZXJzaXN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyb3I6IG5pbCB3aGVuIHBlcnNpc3RlZDsgb3RoZXJ3aXNlIGEgc3Bvb2ZlZC1yZWFsbSwgbWlzc2luZy10cmVlLCBvciBrZXktdmFsdWUgc3RvcmUgZXJyb3IuCglTZXRQcm9wb3NhbFZvdGluZ0luZm9zKF8gaW50LCBybG0gcmVhbG0sIHByb3Bvc2FsSUQgaW50NjQsIHZvdGluZ0luZm9zICpicHRyZWUuQlBUcmVlKSBlcnJvcgoKCS8vIFVzZXIgcHJvcG9zYWxzIG1ldGhvZHMKCS8vIEhhc1VzZXJQcm9wb3NhbHNTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIHVzZXItdG8tcHJvcG9zYWwgaW5kZXggZXhpc3RzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHVzZXIgcHJvcG9zYWwgc3RvcmFnZSBpcyBwcmVzZW50LgoJSGFzVXNlclByb3Bvc2Fsc1N0b3JlS2V5KCkgYm9vbAoJLy8gR2V0VXNlclByb3Bvc2FscyByZXR1cm5zIHRoZSBkb21haW4tb3duZWQgdXNlci10by1wcm9wb3NhbCBpbmRleCB0cmVlLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gKmJwdHJlZS5CUFRyZWU6IHRyZWUgbWFwcGluZyB1c2VyIHN0cmluZ3MgdG8gcHJvcG9zYWwtSUQgc2xpY2VzOyBzdG9yYWdlL3R5cGUgZmFpbHVyZXMgcGFuaWMuCglHZXRVc2VyUHJvcG9zYWxzKCkgKmJwdHJlZS5CUFRyZWUKCS8vIEdldFVzZXJQcm9wb3NhbElEcyByZXR1cm5zIHByb3Bvc2FsIElEcyBjdXJyZW50bHkgaW5kZXhlZCBmb3IgYSB1c2VyLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gdXNlcjogdXNlci1zdHJpbmcga2V5IGluIHRoZSB1c2VyLXRvLXByb3Bvc2FscyBpbmRleC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIFtdaW50NjQ6IHByb3Bvc2FsIElEcyBpbmRleGVkIGZvciB1c2VyLCBvciBuaWwgd2hlbiBhYnNlbnQ7IHdyb25nIHN0b3JlZCB0eXBlcyBwYW5pYy4KCS8vICAgLSBib29sOiB0cnVlIHdoZW4gdGhlIHVzZXIgaGFzIGFuIGluZGV4IGVudHJ5LgoJR2V0VXNlclByb3Bvc2FsSURzKHVzZXIgc3RyaW5nKSAoW11pbnQ2NCwgYm9vbCkKCS8vIFNldFVzZXJQcm9wb3NhbHMgcmVwbGFjZXMgdGhlIHBlcnNpc3RlZCB1c2VyLXRvLXByb3Bvc2FsIGluZGV4LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBpbnRlcm5hbCBzdG9yZSBtZXRob2Q7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogZm9yd2FyZGVkIHJlYWxtIGNvbnRleHQgZm9yIHRoZSBwZXJzaXN0ZW50IHdyaXRlOyB0aGUgc3RvcmUgdmFsaWRhdGVzIGl0IGFzIGN1cnJlbnQuCgkvLyAgIC0gdXNlclByb3Bvc2FsczogdXNlci10by1wcm9wb3NhbCBpbmRleCB0cmVlIHRvIHBlcnNpc3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnJvcjogbmlsIHdoZW4gcGVyc2lzdGVkOyBvdGhlcndpc2UgYSBzcG9vZmVkLXJlYWxtIG9yIGtleS12YWx1ZSBzdG9yZSBlcnJvci4KCVNldFVzZXJQcm9wb3NhbHMoXyBpbnQsIHJsbSByZWFsbSwgdXNlclByb3Bvc2FscyAqYnB0cmVlLkJQVHJlZSkgZXJyb3IKCS8vIEFkZFVzZXJQcm9wb3NhbCBhcHBlbmRzIGEgcHJvcG9zYWwgSUQgdG8gYSB1c2VyJ3MgaW5kZXhlZCBsaXN0LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBpbnRlcm5hbCBzdG9yZSBtZXRob2Q7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogZm9yd2FyZGVkIHJlYWxtIGNvbnRleHQgZm9yIHRoZSBwZXJzaXN0ZW50IHdyaXRlOyB0aGUgc3RvcmUgdmFsaWRhdGVzIGl0IGFzIGN1cnJlbnQuCgkvLyAgIC0gdXNlcjogdXNlci1zdHJpbmcga2V5IHdob3NlIHByb3Bvc2FsIGxpc3QgaXMgdXBkYXRlZC4KCS8vICAgLSBwcm9wb3NhbElEOiBwcm9wb3NhbCBpZGVudGlmaWVyIHRvIGFwcGVuZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycm9yOiBuaWwgd2hlbiBwZXJzaXN0ZWQ7IG90aGVyd2lzZSBhIHNwb29mZWQtcmVhbG0sIG1pc3Npbmcta2V5LCBvciBrZXktdmFsdWUgc3RvcmUgZXJyb3IuCglBZGRVc2VyUHJvcG9zYWwoXyBpbnQsIHJsbSByZWFsbSwgdXNlciBzdHJpbmcsIHByb3Bvc2FsSUQgaW50NjQpIGVycm9yCgkvLyBSZW1vdmVVc2VyUHJvcG9zYWwgcmVtb3ZlcyBldmVyeSBvY2N1cnJlbmNlIG9mIGEgcHJvcG9zYWwgSUQgZnJvbSBhIHVzZXIncyBsaXN0LgoJLy8gQSBtaXNzaW5nIHVzZXIgZW50cnkgaXMgdHJlYXRlZCBhcyBhbiBhbHJlYWR5LWNvbXBsZXRlIG5vLW9wLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBpbnRlcm5hbCBzdG9yZSBtZXRob2Q7IGNhbGxlcnMgcGFzcyAwLgoJLy8gICAtIHJsbTogZm9yd2FyZGVkIHJlYWxtIGNvbnRleHQgZm9yIHRoZSBwZXJzaXN0ZW50IHdyaXRlOyB0aGUgc3RvcmUgdmFsaWRhdGVzIGl0IGFzIGN1cnJlbnQuCgkvLyAgIC0gdXNlcjogdXNlci1zdHJpbmcga2V5IHdob3NlIHByb3Bvc2FsIGxpc3QgaXMgdXBkYXRlZC4KCS8vICAgLSBwcm9wb3NhbElEOiBwcm9wb3NhbCBpZGVudGlmaWVyIHRvIHJlbW92ZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycm9yOiBuaWwgd2hlbiByZW1vdmVkIG9yIGFscmVhZHkgYWJzZW50OyBvdGhlcndpc2UgYSBzcG9vZmVkLXJlYWxtLCBtaXNzaW5nLWtleSwgb3Iga2V5LXZhbHVlIHN0b3JlIGVycm9yLgoJUmVtb3ZlVXNlclByb3Bvc2FsKF8gaW50LCBybG0gcmVhbG0sIHVzZXIgc3RyaW5nLCBwcm9wb3NhbElEIGludDY0KSBlcnJvcgp9CgovLyBHb3ZTdGFrZXJBY2Nlc3NvciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGFjY2Vzc2luZyBnb3Ygc3Rha2VyIGZ1bmN0aW9uYWxpdHkuCi8vIFRoaXMgYWJzdHJhY3Rpb24gYWxsb3dzIGZvciBlYXNpZXIgdGVzdGluZyBieSBlbmFibGluZyBtb2NrIGltcGxlbWVudGF0aW9ucy4KdHlwZSBHb3ZTdGFrZXJBY2Nlc3NvciBpbnRlcmZhY2UgewoJLy8gR2V0VG90YWxEZWxlZ2F0aW9uQW1vdW50QXRTbmFwc2hvdCByZXR1cm5zIHRoZSB0b3RhbCBkZWxlZ2F0aW9uIGFtb3VudCBhdCBhIHNwZWNpZmljIHNuYXBzaG90IHRpbWUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBzbmFwc2hvdFRpbWU6IFVuaXggdGltZXN0YW1wIGF0IHdoaWNoIGRlbGVnYXRpb24gaGlzdG9yeSBpcyBzYW1wbGVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW50NjQ6IHRvdGFsIGRlbGVnYXRlZCBhbW91bnQgYXQgc25hcHNob3RUaW1lLgoJLy8gICAtIGJvb2w6IHRydWUgd2hlbiBhIHNuYXBzaG90IHZhbHVlIGV4aXN0cyBhdCB0aGF0IHRpbWVzdGFtcC4KCUdldFRvdGFsRGVsZWdhdGlvbkFtb3VudEF0U25hcHNob3Qoc25hcHNob3RUaW1lIGludDY0KSAoaW50NjQsIGJvb2wpCgoJLy8gR2V0VXNlckRlbGVnYXRpb25BbW91bnRBdFNuYXBzaG90IHJldHVybnMgdGhlIHVzZXIgZGVsZWdhdGlvbiBhbW91bnQgYXQgYSBzcGVjaWZpYyBzbmFwc2hvdCB0aW1lLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gdXNlckFkZHI6IHVzZXIgYWRkcmVzcyB3aG9zZSBkZWxlZ2F0ZWQgYW1vdW50IGlzIHNhbXBsZWQuCgkvLyAgIC0gc25hcHNob3RUaW1lOiBVbml4IHRpbWVzdGFtcCBhdCB3aGljaCB0aGUgdXNlcidzIGhpc3RvcnkgaXMgc2FtcGxlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiB1c2VyJ3MgZGVsZWdhdGVkIGFtb3VudCBhdCBzbmFwc2hvdFRpbWUuCgkvLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIGEgc25hcHNob3QgdmFsdWUgZXhpc3RzIGZvciB0aGUgdXNlciBhbmQgdGltZXN0YW1wLgoJR2V0VXNlckRlbGVnYXRpb25BbW91bnRBdFNuYXBzaG90KHVzZXJBZGRyIGFkZHJlc3MsIHNuYXBzaG90VGltZSBpbnQ2NCkgKGludDY0LCBib29sKQoKCS8vIEdldFRvdGFseEduc1N1cHBseSByZXR1cm5zIHRoZSB0b3RhbCB4R05TIHN1cHBseSB1c2VkIGFzIHRoZSBxdW9ydW0gYmFzZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiB0b3RhbCB4R05TIHN1cHBseSB1c2VkIGFzIHRoZSBnb3Zlcm5hbmNlIHF1b3J1bSBiYXNlLgoJR2V0VG90YWx4R25zU3VwcGx5KCkgaW50NjQKfQoaqRgKC3VwZ3JhZGUuZ25vEpkYcGFja2FnZSBnb3Zlcm5hbmNlCgppbXBvcnQgKAoJImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCikKCi8vIFJlZ2lzdGVySW5pdGlhbGl6ZXIgcmVnaXN0ZXJzIGEgdmVyc2lvbi1zcGVjaWZpYyBpbml0aWFsaXplci4gRWFjaCB2ZXJzaW9uCi8vIChlLmcuIHYxLCB2MikgY2FsbHMgdGhpcyBmdW5jdGlvbiBmcm9tIGl0cyBpbml0IGJvZHkgdG8gcGx1ZyBpdHNlbGYgaW50bwovLyB0aGUgcHJveHkuCi8vCi8vIFRoZSBpbml0aWFsaXplciBjb25zdHJ1Y3RzIHRoZSB2ZXJzaW9uJ3MgSUdvdmVybmFuY2UgZnJvbSB0aGUgc3VwcGxpZWQKLy8gSUdvdmVybmFuY2VTdG9yZSBhbmQgR292U3Rha2VyQWNjZXNzb3IuIEl0IHJlY2VpdmVzIGEgcmVhbG0gdmFsdWUgdGhhdAovLyByZXNvbHZlcyB0byB0aGUgZ292ZXJuYW5jZSBwcm94eSByZWFsbSDigJQgdGhlIG9ubHkgYWRkcmVzcyB3aXRoIHdyaXRlCi8vIHBlcm1pc3Npb24gb24gdGhlIHNoYXJlZCBLViBzdG9yZSDigJQgc28gYW55IHBlci12ZXJzaW9uIHN0b3JlIGJvb3RzdHJhcAovLyBwZXJmb3JtZWQgaW5zaWRlIHRoZSBpbml0aWFsaXplciBwYXNzZXMgdGhlIHByb3h5J3MgYXV0aG9yaXphdGlvbiBjaGVjay4KLy8KLy8gU2VjdXJpdHk6IE9ubHkgY29udHJhY3RzIHdpdGhpbiB0aGUgZG9tYWluIHBhdGggY2FuIHJlZ2lzdGVyIGluaXRpYWxpemVycy4KLy8gRWFjaCBwYWNrYWdlIHBhdGggY2FuIG9ubHkgcmVnaXN0ZXIgb25jZSB0byBwcmV2ZW50IGR1cGxpY2F0ZSByZWdpc3RyYXRpb25zLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBpbml0aWFsaXplcjogQ2FsbGJhY2sgdGhhdCByZWNlaXZlcyB0aGUgcHJveHktYXV0aG9yaXplZCByZWFsbSBjb250ZXh0LCBnb3Zlcm5hbmNlIHN0b3JlLCBhbmQgc3Rha2VyIGFjY2Vzc29yIGFuZCByZXR1cm5zIHRoZSB2ZXJzaW9uZWQgaW1wbGVtZW50YXRpb24uCmZ1bmMgUmVnaXN0ZXJJbml0aWFsaXplcihjdXIgcmVhbG0sIGluaXRpYWxpemVyIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSwgZ292ZXJuYW5jZVN0b3JlIElHb3Zlcm5hbmNlU3RvcmUsIHN0YWtlckFjY2Vzc29yIEdvdlN0YWtlckFjY2Vzc29yKSBJR292ZXJuYW5jZSkgewoJLy8gYGN1cmAgY2FwdHVyZWQgaGVyZSBpcyB0aGUgZ292ZXJuYW5jZSBjcm9zc2luZyBmcmFtZS4gVGhlIHdyYXBwaW5nCgkvLyBjbG9zdXJlIGZvcndhcmRzIGl0IHRvIHRoZSB2ZXJzaW9uIGluaXRpYWxpemVyIHNvIGFueSBzdG9yZSB3cml0ZXMKCS8vIHRoZSBpbml0aWFsaXplciBwZXJmb3JtcyBydW4gdW5kZXIgdGhlIHByb3h5J3MgaWRlbnRpdHkgcmF0aGVyIHRoYW4KCS8vIHRoZSB2ZXJzaW9uIHBhY2thZ2Uncywgd2hpY2ggd291bGQgZmFpbCB0aGUga3ZTdG9yZSBBQ0wuCglpbml0aWFsaXplckZ1bmMgOj0gZnVuYyhfIGludCwgcmxtIHJlYWxtLCBkb21haW5TdG9yZSBhbnkpIGFueSB7CgkJYWNjZXNzLkFzc2VydElzUmxtQ3VycmVudCgwLCBybG0pCgoJCWN1cnJlbnRHb3Zlcm5hbmNlU3RvcmUsIG9rIDo9IGRvbWFpblN0b3JlLihJR292ZXJuYW5jZVN0b3JlKQoJCWlmICFvayB7CgkJCXBhbmljKCJkb21haW5TdG9yZSBpcyBub3QgYW4gSUdvdmVybmFuY2VTdG9yZSIpCgkJfQoJCXJldHVybiBpbml0aWFsaXplcigwLCBybG0sIGN1cnJlbnRHb3Zlcm5hbmNlU3RvcmUsIG5ld0dvdlN0YWtlckFjY2Vzc29yKCkpCgl9CgoJZXJyIDo9IHZlcnNpb25NYW5hZ2VyLlJlZ2lzdGVySW5pdGlhbGl6ZXIoMCwgY3VyLCBpbml0aWFsaXplckZ1bmMpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJZXJyID0gdXBkYXRlSW1wbGVtZW50YXRpb24oKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQp9CgovLyBVcGdyYWRlSW1wbCBzd2l0Y2hlcyB0aGUgYWN0aXZlIGdvdmVybmFuY2UgaW1wbGVtZW50YXRpb24gdG8gYSBkaWZmZXJlbnQgdmVyc2lvbi4KLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3Mgc2VhbWxlc3MgdXBncmFkZXMgZnJvbSBvbmUgdmVyc2lvbiB0byBhbm90aGVyIHdpdGhvdXQKLy8gZGF0YSBtaWdyYXRpb24gb3IgZG93bnRpbWUuCi8vCi8vIFNlY3VyaXR5OiBPbmx5IGFkbWluIG9yIGdvdmVybmFuY2UgY2FuIHBlcmZvcm0gdXBncmFkZXMuCi8vIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSByZWdpc3RlcmVkIHZpYSBSZWdpc3RlckluaXRpYWxpemVyLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSB0YXJnZXRQYWNrYWdlUGF0aDogUmVnaXN0ZXJlZCBpbXBsZW1lbnRhdGlvbiBwYWNrYWdlIHBhdGggdG8gYWN0aXZhdGUuCmZ1bmMgVXBncmFkZUltcGwoY3VyIHJlYWxtLCB0YXJnZXRQYWNrYWdlUGF0aCBzdHJpbmcpIHsKCS8vIEVuc3VyZSBvbmx5IGFkbWluIG9yIGdvdmVybmFuY2UgY2FuIHBlcmZvcm0gdXBncmFkZXMKCXByZXYgOj0gY3VyLlByZXZpb3VzKCkKCWFjY2Vzcy5Bc3NlcnRJc0FkbWluT3JHb3Zlcm5hbmNlKHByZXYuQWRkcmVzcygpKQoKCWVyciA6PSB2ZXJzaW9uTWFuYWdlci5DaGFuZ2VJbXBsZW1lbnRhdGlvbigwLCBjdXIsIHRhcmdldFBhY2thZ2VQYXRoKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCWVyciA9IHVwZGF0ZUltcGxlbWVudGF0aW9uKCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KfQoKLy8gR2V0SW1wbGVtZW50YXRpb25QYWNrYWdlUGF0aCByZXR1cm5zIHRoZSBwYWNrYWdlIHBhdGggb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgaW1wbGVtZW50YXRpb24uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwYWNrYWdlUGF0aDogcGFja2FnZSBwYXRoIG9mIHRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24KZnVuYyBHZXRJbXBsZW1lbnRhdGlvblBhY2thZ2VQYXRoKCkgc3RyaW5nIHsKCXJldHVybiB2ZXJzaW9uTWFuYWdlci5HZXRDdXJyZW50UGFja2FnZVBhdGgoKQp9ChqGIgoPdm90aW5nX2luZm8uZ25vEvIhcGFja2FnZSBnb3Zlcm5hbmNlCgovLyBWb3RpbmdJbmZvIHRyYWNrcyB2b3RpbmctcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyB1c2VyIG9uIGEgc3BlY2lmaWMgcHJvcG9zYWwuCi8vIFRoaXMgc3RydWN0dXJlIG1haW50YWlucyB0aGUgdXNlcidzIHZvdGluZyBlbGlnaWJpbGl0eSwgdm90aW5nIGhpc3RvcnksIGFuZCB2b3RpbmcgcG93ZXIuCnR5cGUgVm90aW5nSW5mbyBzdHJ1Y3QgewoJYXZhaWxhYmxlVm90ZVdlaWdodCBpbnQ2NCAvLyBUb3RhbCB2b3Rpbmcgd2VpZ2h0IGF2YWlsYWJsZSB0byB0aGlzIHVzZXIgZm9yIHRoaXMgcHJvcG9zYWwKCXZvdGVkV2VpZ2h0ICAgICAgICAgaW50NjQgLy8gQWN0dWFsIHdlaWdodCB1c2VkIHdoZW4gdm90aW5nICgwIGlmIG5vdCB2b3RlZCkKCXZvdGVkSGVpZ2h0ICAgICAgICAgaW50NjQgLy8gQmxvY2sgaGVpZ2h0IHdoZW4gdm90ZSB3YXMgY2FzdAoJdm90ZWRBdCAgICAgICAgICAgICBpbnQ2NCAvLyBUaW1lc3RhbXAgd2hlbiB2b3RlIHdhcyBjYXN0Cgl2b3RlZFllcyAgICAgICAgICAgIGJvb2wgIC8vIFRydWUgaWYgdm90ZWQgInllcyIsIGZhbHNlIGlmIHZvdGVkICJubyIKCXZvdGVkICAgICAgICAgICAgICAgYm9vbCAgLy8gVHJ1ZSBpZiB1c2VyIGhhcyBhbHJlYWR5IHZvdGVkCn0KCi8vIE5ld1ZvdGluZ0luZm8gY3JlYXRlcyBhIG5ldyB2b3RpbmcgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciBhIHVzZXIuCi8vIFRoaXMgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgdGhlIHZvdGluZyBlbGlnaWJpbGl0eSBiYXNlZCBvbiBkZWxlZ2F0aW9uIHNuYXBzaG90cy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGF2YWlsYWJsZVZvdGVXZWlnaHQ6IHRvdGFsIHZvdGluZyB3ZWlnaHQgYXZhaWxhYmxlIHRvIHRoaXMgdXNlcgovLwovLyBSZXR1cm5zOgovLyAgIC0gVm90aW5nSW5mbzogbmV3bHkgY3JlYXRlZCB2b3RpbmcgaW5mb3JtYXRpb24gdmFsdWUKZnVuYyBOZXdWb3RpbmdJbmZvKGF2YWlsYWJsZVZvdGVXZWlnaHQgaW50NjQpIFZvdGluZ0luZm8gewoJcmV0dXJuIFZvdGluZ0luZm97CgkJYXZhaWxhYmxlVm90ZVdlaWdodDogYXZhaWxhYmxlVm90ZVdlaWdodCwKCQkvLyBPdGhlciBmaWVsZHMgYXJlIGluaXRpYWxpemVkIHRvIHplcm8gdmFsdWVzIChmYWxzZSwgMCkKCQkvLyB2b3RlZCBzdGFydHMgYXMgZmFsc2UsIGluZGljYXRpbmcgbm8gdm90ZSBoYXMgYmVlbiBjYXN0Cgl9Cn0KCi8vIERlZmF1bHRWb3RpbmdJbmZvIGNyZWF0ZXMgYW4gZW1wdHkgdm90aW5nIGluZm9ybWF0aW9uIHZhbHVlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gVm90aW5nSW5mbzogemVyby12YWx1ZWQgdm90aW5nIHJlY29yZCB3aXRoIG5vIGF2YWlsYWJsZSB3ZWlnaHQgYW5kIG5vIHZvdGUgcmVjb3JkZWQKZnVuYyBEZWZhdWx0Vm90aW5nSW5mbygpIFZvdGluZ0luZm8gewoJcmV0dXJuIFZvdGluZ0luZm97fQp9CgovLyBOZXdWb3RlZFZvdGluZ0luZm8gY3JlYXRlcyBhIHZvdGluZyBpbmZvcm1hdGlvbiB2YWx1ZSB3aXRoIGEgcmVjb3JkZWQgdm90ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGF2YWlsYWJsZVZvdGVXZWlnaHQ6IHRvdGFsIHZvdGluZyB3ZWlnaHQgYXZhaWxhYmxlIHRvIHRoZSB1c2VyIGZvciB0aGlzIHByb3Bvc2FsCi8vICAgLSB2b3RlZFllczogdHJ1ZSB3aGVuIHRoZSByZWNvcmRlZCB2b3RlIGlzIHllcywgZmFsc2Ugd2hlbiBpdCBpcyBubwovLyAgIC0gdm90ZWRXZWlnaHQ6IHZvdGluZyB3ZWlnaHQgYXBwbGllZCB0byB0aGUgcmVjb3JkZWQgdm90ZQovLyAgIC0gdm90ZWRIZWlnaHQ6IGJsb2NrIGhlaWdodCBhdCB3aGljaCB0aGUgdm90ZSB3YXMgcmVjb3JkZWQKLy8gICAtIHZvdGVkQXQ6IFVuaXggdGltZXN0YW1wIGF0IHdoaWNoIHRoZSB2b3RlIHdhcyByZWNvcmRlZAovLwovLyBSZXR1cm5zOgovLyAgIC0gVm90aW5nSW5mbzogdm90aW5nIHJlY29yZCBwb3B1bGF0ZWQgd2l0aCB0aGUgc3VwcGxpZWQgd2VpZ2h0LCBjaG9pY2UsIGhlaWdodCwgYW5kIHRpbWVzdGFtcCBhbmQgbWFya2VkIGFzIHZvdGVkCmZ1bmMgTmV3Vm90ZWRWb3RpbmdJbmZvKGF2YWlsYWJsZVZvdGVXZWlnaHQgaW50NjQsIHZvdGVkWWVzIGJvb2wsIHZvdGVkV2VpZ2h0LCB2b3RlZEhlaWdodCwgdm90ZWRBdCBpbnQ2NCkgVm90aW5nSW5mbyB7CglyZXR1cm4gVm90aW5nSW5mb3sKCQlhdmFpbGFibGVWb3RlV2VpZ2h0OiBhdmFpbGFibGVWb3RlV2VpZ2h0LAoJCXZvdGVkV2VpZ2h0OiAgICAgICAgIHZvdGVkV2VpZ2h0LAoJCXZvdGVkSGVpZ2h0OiAgICAgICAgIHZvdGVkSGVpZ2h0LAoJCXZvdGVkQXQ6ICAgICAgICAgICAgIHZvdGVkQXQsCgkJdm90ZWRZZXM6ICAgICAgICAgICAgdm90ZWRZZXMsCgkJdm90ZWQ6ICAgICAgICAgICAgICAgdHJ1ZSwKCX0KfQoKLy8gVm90aW5nVHlwZSByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2b3RlIGNob2ljZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogInllcyIgb3IgIm5vIiBiYXNlZCBvbiB2b3RpbmcgY2hvaWNlCmZ1bmMgKHYgVm90aW5nSW5mbykgVm90aW5nVHlwZSgpIHN0cmluZyB7CglpZiB2LnZvdGVkWWVzIHsKCQlyZXR1cm4gInllcyIKCX0KCglyZXR1cm4gIm5vIgp9CgovLyBJc1ZvdGVkIGNoZWNrcyBpZiB0aGUgdXNlciBoYXMgYWxyZWFkeSBjYXN0IHRoZWlyIHZvdGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIGlmIHVzZXIgaGFzIHZvdGVkIG9uIHRoaXMgcHJvcG9zYWwKZnVuYyAodiBWb3RpbmdJbmZvKSBJc1ZvdGVkKCkgYm9vbCB7CglyZXR1cm4gdi52b3RlZAp9CgovLyBWb3RlZFllcyBjaGVja3MgaWYgdGhlIHVzZXIgdm90ZWQgInllcyIgb24gdGhlIHByb3Bvc2FsLgovLyBPbmx5IG1lYW5pbmdmdWwgaWYgSXNWb3RlZCgpIHJldHVybnMgdHJ1ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgaWYgdXNlciB2b3RlZCAieWVzIgpmdW5jICh2IFZvdGluZ0luZm8pIFZvdGVkWWVzKCkgYm9vbCB7CglyZXR1cm4gdi52b3RlZFllcwp9CgovLyBWb3RlZE5vIGNoZWNrcyBpZiB0aGUgdXNlciB2b3RlZCAibm8iIG9uIHRoZSBwcm9wb3NhbC4KLy8gT25seSBtZWFuaW5nZnVsIGlmIElzVm90ZWQoKSByZXR1cm5zIHRydWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIGlmIHVzZXIgdm90ZWQgIm5vIgpmdW5jICh2IFZvdGluZ0luZm8pIFZvdGVkTm8oKSBib29sIHsKCXJldHVybiAhdi52b3RlZFllcwp9CgovLyBBdmFpbGFibGVWb3RlV2VpZ2h0IHJldHVybnMgdGhlIHRvdGFsIHZvdGluZyB3ZWlnaHQgYXZhaWxhYmxlIHRvIHRoaXMgdXNlci4KLy8gVGhpcyB3ZWlnaHQgaXMgZGV0ZXJtaW5lZCBhdCBwcm9wb3NhbCBjcmVhdGlvbiB0aW1lIGJhc2VkIG9uIGRlbGVnYXRpb24gc25hcHNob3RzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGF2YWlsYWJsZSB2b3Rpbmcgd2VpZ2h0CmZ1bmMgKHYgVm90aW5nSW5mbykgQXZhaWxhYmxlVm90ZVdlaWdodCgpIGludDY0IHsKCXJldHVybiB2LmF2YWlsYWJsZVZvdGVXZWlnaHQKfQoKLy8gVm90ZWRXZWlnaHQgcmV0dXJucyB0aGUgd2VpZ2h0IGFjdHVhbGx5IHVzZWQgd2hlbiB2b3RpbmcuCi8vIFJldHVybnMgMCBpZiB0aGUgdXNlciBoYXNuJ3Qgdm90ZWQgeWV0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IHdlaWdodCB1c2VkIGZvciB2b3RpbmcsIG9yIDAgaWYgbm90IHZvdGVkCmZ1bmMgKHYgVm90aW5nSW5mbykgVm90ZWRXZWlnaHQoKSBpbnQ2NCB7CglpZiAhdi52b3RlZCB7CgkJcmV0dXJuIDAKCX0KCglyZXR1cm4gdi52b3RlZFdlaWdodAp9CgovLyBWb3RlZEhlaWdodCByZXR1cm5zIHRoZSBibG9jayBoZWlnaHQgd2hlbiB0aGUgdm90ZSB3YXMgY2FzdC4KLy8gUmV0dXJucyAwIGlmIHRoZSB1c2VyIGhhc24ndCB2b3RlZCB5ZXQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogYmxvY2sgaGVpZ2h0IHdoZW4gdm90ZSB3YXMgY2FzdApmdW5jICh2IFZvdGluZ0luZm8pIFZvdGVkSGVpZ2h0KCkgaW50NjQgewoJaWYgIXYudm90ZWQgewoJCXJldHVybiAwCgl9CgoJcmV0dXJuIHYudm90ZWRIZWlnaHQKfQoKLy8gVm90ZWRBdCByZXR1cm5zIHRoZSB0aW1lc3RhbXAgd2hlbiB0aGUgdm90ZSB3YXMgY2FzdC4KLy8gUmV0dXJucyAwIGlmIHRoZSB1c2VyIGhhc24ndCB2b3RlZCB5ZXQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogdGltZXN0YW1wIHdoZW4gdm90ZSB3YXMgY2FzdApmdW5jICh2IFZvdGluZ0luZm8pIFZvdGVkQXQoKSBpbnQ2NCB7CglpZiAhdi52b3RlZCB7CgkJcmV0dXJuIDAKCX0KCglyZXR1cm4gdi52b3RlZEF0Cn0KIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsEhMI1PLevAESCzE5NzkxMHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAwSc1QTD4tI6os8LnebKOB+i6fWXOKGBf9lRpSI1wrrhEkBX8+2SNZPqs69Pq3TeOSJGivFQkda8SUGBUBzsx+vUIU1X3jcjdbfhk+z8k2dL+933+b4brEP0fdJsJMIqqqp0GihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl

Raw transaction data

Raw JSON data