Transaction executed successfully

Transaction Details

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

Transaction hash
4943AC1620AE2C7FD393704F28A5ECFA2FE6A691624098B54BDE1C6F4CED8A75

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
153,967,283
Requested gas limit
GAS USED
128,306,119
Gas consumed
FEE
153968ugnot
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

Cra1BgoML3ZtLm1fYWRkcGtnEqS1BgooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBL2tAYKBnJvdXRlchIcZ25vLmxhbmQvci9nbm9zd2FwL3JvdXRlci92MhqHRwoJUkVBRE1FLm1kEvlGIyBSb3V0ZXIKClN3YXAgcm91dGluZyBlbmdpbmUgZm9yIG9wdGltYWwgdHJhZGUgZXhlY3V0aW9uIGFjcm9zcyBwb29scy4KCiMjIE92ZXJ2aWV3CgpSb3V0ZXIgaGFuZGxlcyBzd2FwIGV4ZWN1dGlvbiBhY3Jvc3MgbXVsdGlwbGUgcG9vbHMsIGZpbmRpbmcgb3B0aW1hbCBwYXRocyBhbmQgbWFuYWdpbmcgc2xpcHBhZ2UgcHJvdGVjdGlvbiBmb3IgdHJhZGVycy4KCiMjIENvbmZpZ3VyYXRpb24KCi0gKipSb3V0ZXIgRmVlKio6IDE1IGJwcyAoMC4xNSUpIGJ5IGRlZmF1bHQgb24gb3V0cHV0IHRva2VuczsgY29uZmlndXJhYmxlIGJ5CiAgYWRtaW4vZ292ZXJuYW5jZSBmcm9tIDAgdGhyb3VnaCAxMDAwIGJwcyAoMOKAkzEwJSkKLSAqKk1heCBIb3BzKio6IDMgcG9vbHMgcGVyIHJvdXRlCi0gKipEZWFkbGluZSBCdWZmZXIqKjogNS0zMCBtaW51dGVzIHJlY29tbWVuZGVkIGZvciBsaXZlIHN3YXBzCgojIyBDb3JlIEZ1bmN0aW9ucwoKIyMjIGBFeGFjdEluU3dhcFJvdXRlYAoKU3dhcHMgYW4gZXhhY3QgaW5wdXQgYW1vdW50IGZvciBvdXRwdXQsIHN1YmplY3QgdG8gYSBtaW5pbXVtIG5ldCBvdXRwdXQuCgotIEZpeGVkIGlucHV0LCB2YXJpYWJsZSBvdXRwdXQKLSBUaGUgcmV0dXJuZWQgb3V0cHV0IGlzIGFmdGVyIHRoZSByb3V0ZXIgZmVlCi0gUmV2ZXJ0cyBpZiBvdXRwdXQgPCBhbW91bnRPdXRNaW4KLSBTdXBwb3J0cyBtdWx0aS1ob3Agcm91dGluZwoKIyMjIGBFeGFjdE91dFN3YXBSb3V0ZWAKClN3YXBzIGZvciBhIHJlcXVlc3RlZCBmaW5hbCB1c2VyIG91dHB1dCBhbW91bnQgd2l0aCBtYXhpbXVtIGlucHV0LiBUaGUKYGFtb3VudE91dGAgdGFyZ2V0IGlzIHBvc3Qtcm91dGVyLWZlZTogdGhlIHJvdXRlciByZXF1ZXN0cyB0aGUgY29ycmVzcG9uZGluZwpncm9zcyBwb29sIG91dHB1dCwgZGVkdWN0cyB0aGUgZmVlLCB0aGVuIHZhbGlkYXRlcyBhbmQgdHJhbnNmZXJzIHRoZSBuZXQgb3V0cHV0LgoKLSBXaXRoIG5vIHNpbmdsZS1ob3AgcHJpY2UgbGltaXQsIHRhcmdldHMgdGhlIHJlcXVlc3RlZCBwb3N0LWZlZSBvdXRwdXQgd2l0aGluCiAgdGhlIGltcGxlbWVudGF0aW9uJ3Mgc21hbGwgcGVyLWhvcCByb3VuZGluZyB0b2xlcmFuY2UKLSBBIG5vbnplcm8gc2luZ2xlLWhvcCBwcmljZSBsaW1pdCBtYXkgc3RvcCBlYXJseSBhbmQgcmV0dXJuIGEgcGFydGlhbCBvdXRwdXQKLSBSZXZlcnRzIGlmIGlucHV0ID4gYW1vdW50SW5NYXgKLSBDYWxjdWxhdGVzIHBhdGggYmFja3dhcmRzCgojIyMgYERyeVN3YXBSb3V0ZWAKClNpbXVsYXRlcyBhIHN3YXAgd2l0aG91dCBleGVjdXRpb24uCgotIEZyb250ZW5kIHByaWNlIHF1b3RlcwotIFNsaXBwYWdlIGNhbGN1bGF0aW9uCi0gUGF0aCB2YWxpZGF0aW9uCi0gTm8gZGVhZGxpbmUgY2hlY2sgb3IgdG9rZW4gdHJhbnNmZXIKCiMjIFRlY2huaWNhbCBEZXRhaWxzCgojIyMgUm91dGUgRm9ybWF0IHZzIFBvb2wgRm9ybWF0IC0gSU1QT1JUQU5UIERJU1RJTkNUSU9OCgojIyMjIFJvdXRlIEZvcm1hdCAoU3dhcCBEaXJlY3Rpb24pCgpSb3V0ZXMgaW4gdGhlIHJvdXRlciBmb2xsb3cgKipzd2FwIGRpcmVjdGlvbiBvcmRlcmluZyoqOiBgdG9rZW5Jbjp0b2tlbk91dDpmZWVgCgotIEZpcnN0IHRva2VuID0gSW5wdXQgdG9rZW4gKHdoYXQgeW91J3JlIHN3YXBwaW5nIEZST00pCi0gU2Vjb25kIHRva2VuID0gT3V0cHV0IHRva2VuICh3aGF0IHlvdSdyZSBzd2FwcGluZyBUTykKLSBUaGlzIHJlcHJlc2VudHMgdGhlIGFjdHVhbCBmbG93IG9mIHRoZSBzd2FwCgpFeGFtcGxlIGZvciBzd2FwcGluZyBHTlMgdG8gV1VHTk9UOgoKYGBgCmduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOmduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90OjMwMDAKYGBgCgojIyMjIFBvb2wgRm9ybWF0IChBbHBoYWJldGljYWwpCgpQb29scyBhcmUgaWRlbnRpZmllZCB1c2luZyAqKmFscGhhYmV0aWNhbCBvcmRlcmluZyoqOiBgdG9rZW4wOnRva2VuMTpmZWVgCgotIHRva2VuMCA8IHRva2VuMSAobGV4aWNvZ3JhcGhpY2FsbHkgc29ydGVkKQotIFRoaXMgaXMgdGhlIGNhbm9uaWNhbCBwb29sIGlkZW50aWZpZXIKCkV4YW1wbGUgcG9vbCBpZGVudGlmaWVyIChzYW1lIHBvb2wgYXMgYWJvdmUpOgoKYGBgCmduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90Omduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOjMwMDAgICMgZ25vbGFuZC93dWdub3QgPCBnbm9zd2FwL2ducyBhbHBoYWJldGljYWxseQpgYGAKCiMjIyMgS2V5IERpZmZlcmVuY2UKCi0gKipSb3V0ZXIgcm91dGVzKio6IEZvbGxvdyB5b3VyIHN3YXAgZGlyZWN0aW9uIChCQVLihpJCQVogbWVhbnMgYmFyOmJheiBpbiByb3V0ZSkKLSAqKlBvb2wgaWRlbnRpZmllcnMqKjogQWx3YXlzIGFscGhhYmV0aWNhbGx5IHNvcnRlZCAobWlnaHQgYmUgYmFyOmJheiBvciBiYXo6YmFyKQotIFRoZSByb3V0ZXIgYXV0b21hdGljYWxseSBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIGJldHdlZW4gdGhlc2UgZm9ybWF0cwoKIyMjIyBOYXRpdmUgVG9rZW4gUm91dGUgU3BlY2lmaWNhdGlvbgoKKipJTVBPUlRBTlQqKjogUm91dGVyIHN3YXAgZnVuY3Rpb25zIGRvICoqbm90KiogYWNjZXB0IG5hdGl2ZSBgdWdub3RgIGRpcmVjdGx5LgoKLSAqKlRva2VuIFBhcmFtZXRlcnMqKjogVXNlIHRva2VuIGtleXMgKGBwa2dQYXRoLlNZTUJPTGApIHN1Y2ggYXMgYCJnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdCJgCi0gKipSb3V0ZSBQYXRocyoqOiBBbHNvIHVzZSB0b2tlbiBrZXlzIChgcGtnUGF0aC5TWU1CT0xgKSBzdWNoIGFzIGAiZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3QiYAoKVGhpcyBtYXRjaGVzIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uOgoKLSBQb29scyBvcGVyYXRlIG9uIHRva2VuIGNvbnRyYWN0IHBhdGhzLCBpbmNsdWRpbmcgd3JhcHBlZCBHTk9UIChgd3Vnbm90YCkKLSBSb3V0ZXIgc3dhcCBlbnRyeXBvaW50cyByZWplY3QgbmF0aXZlLWNvaW4gaGFuZGxpbmcKLSBOYXRpdmUtdG9rZW4gcmVmdW5kIGFuZCB1bndyYXAgZmxvd3MgYXJlIG5vdCBwYXJ0IG9mIHRoZSBjdXJyZW50IHJvdXRlciBpbXBsZW1lbnRhdGlvbgoKIyMjIyBSb3V0ZSBTdHJpbmcgRm9ybWF0CgpTaW5nbGUtaG9wIGZvcm1hdDoKCmBgYAp0b2tlbkluOnRva2VuT3V0OmZlZQpgYGAKCk11bHRpLWhvcCBmb3JtYXQgKHVzaW5nIF9QT09MXyBzZXBhcmF0b3IpOgoKYGBgCnRva2VuSW46dG9rZW5COmZlZTEqUE9PTCp0b2tlbkI6dG9rZW5DOmZlZTIqUE9PTCp0b2tlbkM6dG9rZW5PdXQ6ZmVlMwpgYGAKClNpbmdsZS1ob3AgZXhhbXBsZToKCmBgYAojIFN3YXBwaW5nIEdOUyB0byBXVUdOT1QKUm91dGU6IGduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOmduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90OjMwMDAKIyBSb3V0ZXIgaW50ZXJwcmV0czogdG9rZW5Jbj1nbnMsIHRva2VuT3V0PXd1Z25vdCwgZmVlPTMwMDAKYGBgCgpNdWx0aS1ob3AgZXhhbXBsZSAoR05TIOKGkiBXVUdOT1Qg4oaSIFRPS0VOX0MpOgoKYGBgCiMgRWFjaCBzZWdtZW50IGZvbGxvd3Mgc3dhcCBkaXJlY3Rpb24sIGNvbm5lY3RlZCBieSAqUE9PTCoKZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlM6Z25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3Q6MzAwMCpQT09MKmduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90Omduby5sYW5kL3IvPG5hbWVzcGFjZT4vdG9rZW5fYy5UT0tFTl9DOjUwMApgYGAKCiMjIyBRdW90ZSBEaXN0cmlidXRpb24KClNwbGl0IGxhcmdlIHRyYWRlcyBhY3Jvc3Mgcm91dGVzIHRvIG1pbmltaXplIGltcGFjdDoKCi0gYHF1b3RlQXJyYDogcG9zaXRpdmUgcGVyY2VudGFnZSBwZXIgcm91dGUsIHdpdGggb25lIHF1b3RlIGZvciBlYWNoIHJvdXRlCi0gUXVvdGVzIG11c3Qgc3VtIHRvIDEwMDsgYXQgbW9zdCA3IHJvdXRlcyBhcmUgYWNjZXB0ZWQKLSBFeGFtcGxlOiAiMzAsNzAiID0gMzAlIHJvdXRlMSwgNzAlIHJvdXRlMgoKIyMjIE5hdGl2ZSBUb2tlbiBIYW5kbGluZwoKVGhlIGN1cnJlbnQgcm91dGVyIGltcGxlbWVudGF0aW9uIGRvZXMgKipub3QqKiBoYW5kbGUgbmF0aXZlIGB1Z25vdGAgZGlyZWN0bHkuIEl0IHJlamVjdHMgbmF0aXZlLWNvaW4gaGFuZGxpbmcgYW5kIHJvdXRlcyBzd2FwcyBvbmx5IHRocm91Z2ggdG9rZW4ga2V5cyAoYHBrZ1BhdGguU1lNQk9MYCkgc3VjaCBhcyB3cmFwcGVkIEdOT1QgKGB3dWdub3RgKS4KCiMjIyMgVG9rZW4gSWRlbnRpZmllciBSZXF1aXJlbWVudHMKCi0gVXNlIHRva2VuIGtleXMgKGBwa2dQYXRoLlNZTUJPTGApIHN1Y2ggYXMgYGduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90YCBmb3IgYm90aCBpbnB1dHMvb3V0cHV0cyBhbmQgcm91dGUgc3BlY2lmaWNhdGlvbnMuCi0gRG8gbm90IHBhc3MgYCJ1Z25vdCJgIGFzIGBpbnB1dFRva2VuYCBvciBgb3V0cHV0VG9rZW5gIHRvIHJvdXRlciBzd2FwIGZ1bmN0aW9ucy4KCiMjIyMgQXBwcm92YWwgYW5kIFRyYW5zZmVyIFJlcXVpcmVtZW50cwoKLSBBcHByb3ZlIHRoZSByb3V0ZXIgdG8gc3BlbmQgdGhlIHRva2VuIGNvbnRyYWN0IHlvdSBhcmUgc3dhcHBpbmcgZnJvbS4KLSBJZiB5b3Ugd2FudCB3cmFwcGVkIEdOT1QgZXhwb3N1cmUsIHVzZSB0aGUgYHd1Z25vdGAgdG9rZW4gY29udHJhY3QgcGF0aCBkaXJlY3RseS4KLSBOYXRpdmUtdG9rZW4gcmVmdW5kIGFuZCB1bndyYXAgZmxvd3MgYXJlIG5vdCBwYXJ0IG9mIHRoZSBjdXJyZW50IHJvdXRlciBpbXBsZW1lbnRhdGlvbi4KCkZvciBsaXZlIGxpcXVpZGl0eS1jaGFuZ2luZyBzd2FwczoKCi0gU2V0IGBhbW91bnRPdXRNaW4gPSBleHBlY3RlZCAqICgxIC0gc2xpcHBhZ2UlKWAKLSAwLjUtMSUgZm9yIHN0YWJsZSBwYWlycwotIDEtMyUgZm9yIHZvbGF0aWxlIHBhaXJzCi0gUmV2ZXJ0cyBpZiB0aGUgbmV0IG91dHB1dCBpcyBiZWxvdyB0aGUgbWluaW11bQoKIyMgVXNhZ2UKClRoZXNlIHNuaXBwZXRzIGNhbGwgdGhlIHB1YmxpYyBkb21haW4gcHJveHkgZnJvbSBhIHJlYWxtIGZ1bmN0aW9uIHdpdGggYSBjdXJyZW50IGBjdXJgIHRva2VuLgpJbXBvcnQgdGhlIHByb3h5IHBhY2thZ2UgYW5kIHF1YWxpZnkgaXRzIGZ1bmN0aW9uIG5hbWVzIGluIGludGVncmF0aW5nIGNvZGUuCgojIyMgQmFzaWMgVG9rZW4gU3dhcHMKCmBgYGdvCi8vIFNpbXBsZSBleGFjdCBpbnB1dCBzd2FwCmFtb3VudEluLCBhbW91bnRPdXQgOj0gRXhhY3RJblN3YXBSb3V0ZSgKICAgIGNyb3NzKGN1ciksCiAgICAiZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlMiLCAgICAgICAvLyBpbnB1dCB0b2tlbgogICAgImduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90IiwgLy8gb3V0cHV0IHRva2VuCiAgICAiMTAwMDAwMCIsICAgICAgICAgICAgICAgICAvLyBhbW91bnQgKDYgZGVjaW1hbHMpCiAgICAiZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlM6Z25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3Q6MzAwMCIsIC8vIHJvdXRlCiAgICAiMTAwIiwgICAgICAgICAgICAgICAgICAgICAvLyAxMDAlIHRocm91Z2ggcm91dGUKICAgICI5NTAwMDAiLCAgICAgICAgICAgICAgICAgIC8vIG1pbiBvdXRwdXQKICAgIHRpbWUuTm93KCkuVW5peCgpICsgMzAwLCAgIC8vIGRlYWRsaW5lCiAgICAiZzFyZWZlcnJlci4uLiIsICAgICAgICAgICAvLyByZWZlcnJhbAopCgovLyBNdWx0aS1ob3Agc3dhcApFeGFjdEluU3dhcFJvdXRlKAogICAgY3Jvc3MoY3VyKSwKICAgICJnbm8ubGFuZC9yL2dub3N3YXAvZ25zLkdOUyIsCiAgICAiZ25vLmxhbmQvci88bmFtZXNwYWNlPi90b2tlbl9jLlRPS0VOX0MiLAogICAgIjEwMDAwMDAiLAogICAgImduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOmduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90OjMwMDAqUE9PTCpnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdDpnbm8ubGFuZC9yLzxuYW1lc3BhY2U+L3Rva2VuX2MuVE9LRU5fQzozMDAwIiwKICAgICIxMDAiLAogICAgIjkwMDAwMCIsCiAgICBkZWFkbGluZSwKICAgICIiLAopCgovLyBTcGxpdCByb3V0ZSBmb3IgbGFyZ2UgdHJhZGVzCkV4YWN0SW5Td2FwUm91dGUoCiAgICBjcm9zcyhjdXIpLAogICAgImduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TIiwKICAgICJnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdCIsCiAgICAiMTAwMDAwMDAwMDAiLAogICAgImduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOmduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90OjUwMCxnbm8ubGFuZC9yL2dub3N3YXAvZ25zLkdOUzpnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdDozMDAwIiwKICAgICI2MCw0MCIsICAvLyA2MCUgdGhyb3VnaCAwLjA1JSwgNDAlIHRocm91Z2ggMC4zJQogICAgIjk1MDAwMDAwMDAiLAogICAgZGVhZGxpbmUsCiAgICAiIiwKKQpgYGAKClNpbmdsZS1ob3AgZnVuY3Rpb25zIHN1cHBvcnQgcGFydGlhbCBleGVjdXRpb24gdGhyb3VnaCBhIG5vbnplcm8KYHNxcnRQcmljZUxpbWl0WDk2YDoKCmBgYGdvCi8vIFBhcnRpYWwgc3dhcCB3aXRoIHByaWNlIGxpbWl0IC0gbWF5IG5vdCBjb25zdW1lIGZ1bGwgaW5wdXQgYW1vdW50CmFtb3VudEluLCBhbW91bnRPdXQgOj0gRXhhY3RJblNpbmdsZVN3YXBSb3V0ZSgKICAgIGNyb3NzKGN1ciksCiAgICAiZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlMiLCAgICAgICAvLyBpbnB1dCB0b2tlbgogICAgImduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90IiwgLy8gb3V0cHV0IHRva2VuCiAgICAiMTAwMDAwMCIsICAgICAgICAgICAgICAgICAvLyBtYXggYW1vdW50IHRvIHN3YXAKICAgICJnbm8ubGFuZC9yL2dub3N3YXAvZ25zLkdOUzpnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdDozMDAwIiwgLy8gc2luZ2xlIHJvdXRlCiAgICAiOTUwMDAwIiwgICAgICAgICAgICAgICAgICAvLyBtaW4gb3V0cHV0CiAgICAiMTAwMDAwMDAwMDAwMDAwMDAwMCIsICAgICAvLyBzcXJ0UHJpY2VMaW1pdFg5NiAocHJpY2UgbGltaXQpCiAgICBkZWFkbGluZSwKICAgICIiLAopCi8vIElmIHRoZSBwcmljZSBsaW1pdCBpcyByZWFjaGVkLCBvbmx5IGEgcGFydGlhbCBhbW91bnQgaXMgc3dhcHBlZC4gRm9yIGV4YWN0LWluCi8vIHRoaXMgY2FuIGNvbnN1bWUgbGVzcyBpbnB1dDsgZXhhY3Qtb3V0IGNhbiBkZWxpdmVyIGxlc3MgdGhhbiBpdHMgdGFyZ2V0LgovLyBhbW91bnRPdXRNaW4gb3IgYW1vdW50SW5NYXggcmVtYWlucyBlbmZvcmNlZCwgcmVzcGVjdGl2ZWx5LgpgYGAKCiMjIEltcG9ydGFudCBEZXZlbG9wZXIgTm90ZXMKCiMjIyBDb21tb24gSW50ZWdyYXRpb24gUGl0ZmFsbHMKCjEuICoqTmF0aXZlIFRva2VuIEFzc3VtcHRpb25zKio6IFBhc3NpbmcgYCJ1Z25vdCJgIHRvIHJvdXRlciBzd2FwIGZ1bmN0aW9ucyB3aWxsIGZhaWwgYmVjYXVzZSByb3V0ZXIgZW50cnlwb2ludHMgcmVqZWN0IG5hdGl2ZS1jb2luIGhhbmRsaW5nLgoKMi4gKipSb3V0ZSB2cyBUb2tlbiBJZGVudGlmaWVyIENvbmZ1c2lvbioqOiBVc2luZyBgInVnbm90ImAgaW4gcm91dGUgc3RyaW5ncyBpbnN0ZWFkIG9mIGAiZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3QiYCB3aWxsIGNhdXNlIHRyYW5zYWN0aW9ucyB0byBmYWlsIHNpbmNlIG5vIHBvb2xzIGV4aXN0IGZvciB0aGUgYCJ1Z25vdCJgIGlkZW50aWZpZXIuCgozLiAqKldyb25nIFRva2VuIFBhdGgqKjoKCiAgIC0gVXNlIGBnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdGAgd2hlbiBzd2FwcGluZyB3cmFwcGVkIEdOT1QKICAgLSBEbyBub3QgcGFzcyBuYXRpdmUgYHVnbm90YCB0byByb3V0ZXIgc3dhcCBmdW5jdGlvbnMKICAgLSBSb3V0ZSBzdHJpbmdzIG11c3Qgc3RheSBpbiBzd2FwLWRpcmVjdGlvbiBvcmRlciBhbmQgdXNlIHRva2VuIGNvbnRyYWN0IHBhdGhzCgojIyMgRnJvbnRlbmQgSW50ZWdyYXRpb24gQ2hlY2tsaXN0CgotIFsgXSBJbXBsZW1lbnQgV1VHTk9UIGFwcHJvdmFsIGJlZm9yZSB3cmFwcGVkLUdOT1Qgc3dhcHMKLSBbIF0gVXNlIHRva2VuIGtleXMgKGBwa2dQYXRoLlNZTUJPTGApIHN1Y2ggYXMgYCJnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdCJgIGZvciBib3RoIHBhcmFtZXRlcnMgYW5kIHJvdXRlcwotIFsgXSBUZXN0IGJvdGggcGFydGlhbCBhbmQgZnVsbCBzd2FwIHNjZW5hcmlvcwotIFsgXSBJbXBsZW1lbnQgcHJvcGVyIGVycm9yIGhhbmRsaW5nIGZvciBmYWlsZWQgYXBwcm92YWxzCgpCb3RoIHNpbmdsZS1ob3AgZnVuY3Rpb25zIHN1cHBvcnQgcGFydGlhbCBleGVjdXRpb24gd2hlbgpgc3FydFByaWNlTGltaXRYOTZgIGlzIG5vbnplcm86CgotIEV4YWN0LWluIG1heSBjb25zdW1lIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkIGlucHV0IGFtb3VudAotIEV4YWN0LW91dCBtYXkgZGVsaXZlciBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBwb3N0LWZlZSBvdXRwdXQKLSBUaGUgcmVsZXZhbnQgYW1vdW50IGxpbWl0IChgYW1vdW50T3V0TWluYCBvciBgYW1vdW50SW5NYXhgKSBzdGlsbCBhcHBsaWVzCi0gUmVtYWluaW5nIGlucHV0IHRva2VucyBzdGF5IHdpdGggdGhlIHVzZXIgYmVjYXVzZSB0aGUgcm91dGVyIHVzZXMgdG9rZW4KICBjb250cmFjdCB0cmFuc2ZlcnMKLSBBIHplcm8gbGltaXQgdXNlcyB0aGUgZ2xvYmFsIHRpY2stbWF0aCBib3VuZGFyeSBhbmQgcHJlc2VydmVzIGZ1bGwgZXhhY3QKICBzZW1hbnRpY3MKCiMjIFNlY3VyaXR5CgotIFBhdGggdmFsaWRhdGlvbiBjaGVja3Mgc3ludGF4LCBlbmRwb2ludHMsIGhvcCBjb250aW51aXR5LCBhbmQgcG9vbCBleGlzdGVuY2U7CiAgaXQgZG9lcyBub3QgcmVqZWN0IGNpcmN1bGFyIHJvdXRlcwotIERlYWRsaW5lIHByZXZlbnRzIHN0YWxlIGxpdmUgdHJhbnNhY3Rpb25zCi0gU2xpcHBhZ2UgbGltaXRzIHByb3RlY3QgYWdhaW5zdCB1bmZhdm9yYWJsZSBleGVjdXRpb24KLSBUaGUgcm91dGVyIGZlZSByYXRlIGlzIGNvbmZpZ3VyYWJsZTsgdGhlIGN1cnJlbnQgcmF0ZSBpcyBmaXhlZCBkdXJpbmcgb25lCiAgZXhlY3V0aW9uCi0gV1VHTk9UIGFwcHJvdmFsIHJlcXVpcmVtZW50IHByZXZlbnRzIHVuYXV0aG9yaXplZCB0b2tlbiB0cmFuc2ZlcnMKGsEaCgphc3NlcnQuZ25vErIacGFja2FnZSByb3V0ZXIKCmltcG9ydCAoCgkiZXJyb3JzIgoJInN0cmluZ3MiCgkidGltZSIKCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCgoJImduby5sYW5kL3IvZ25vc3dhcC9wb29sIgoKCSJnbm8ubGFuZC9yL2dub3N3YXAvY29tbW9uIgopCgovLyBhc3NlcnRJc05vdEV4cGlyZWQgZW5zdXJlcyB0aGUgdHJhbnNhY3Rpb24gZGVhZGxpbmUgaGFzIG5vdCBwYXNzZWQuCmZ1bmMgYXNzZXJ0SXNOb3RFeHBpcmVkKGRlYWRsaW5lIGludDY0KSB7Cglub3cgOj0gdGltZS5Ob3coKS5Vbml4KCkKCglpZiBub3cgPiBkZWFkbGluZSB7CgkJcGFuaWMobWFrZUVycm9yV2l0aERldGFpbHMoCgkJCWVyckV4cGlyZWQsCgkJCXVmbXQuU3ByaW50ZigidHJhbnNhY3Rpb24gdG9vIG9sZCwgbm93KCVkKSA+IGRlYWRsaW5lKCVkKSIsIG5vdywgZGVhZGxpbmUpLAoJCSkpCgl9Cn0KCmZ1bmMgYXNzZXJ0U2luZ2xlU3dhcChwICpTaW5nbGVTd2FwUGFyYW1zKSB7CglpZiBwLnRva2VuSW4gPT0gcC50b2tlbk91dCB7CgkJcGFuaWMoZXJyb3JzLk5ldyhlcnJTYW1lVG9rZW5Td2FwKSkKCX0KCgljb21tb24uTXVzdFJlZ2lzdGVyZWQocC50b2tlbkluLCBwLnRva2VuT3V0KQp9CgpmdW5jIGFzc2VydElzVmFsaWRTcXJ0UHJpY2VMaW1pdFg5NihzcXJ0UHJpY2VMaW1pdFg5NiBzdHJpbmcpIHsKCWlmIHNxcnRQcmljZUxpbWl0WDk2ID09ICIiIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW52YWxpZElucHV0LAoJCQl1Zm10LlNwcmludGYoImludmFsaWQgc3FydFByaWNlTGltaXRYOTY6ICVzIiwgc3FydFByaWNlTGltaXRYOTYpLAoJCSkpCgl9CgoJXywgZXJyIDo9IHUyNTYuRnJvbURlY2ltYWwoc3FydFByaWNlTGltaXRYOTYpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW52YWxpZElucHV0LAoJCQl1Zm10LlNwcmludGYoImludmFsaWQgc3FydFByaWNlTGltaXRYOTY6ICVzIiwgc3FydFByaWNlTGltaXRYOTYpLAoJCSkpCgl9Cn0KCmZ1bmMgYXNzZXJ0SXNWYWxpZFNpbmdsZVN3YXBSb3V0ZUFyclBhdGgocm91dGVQYXRocywgaW5wdXRUb2tlbiwgb3V0cHV0VG9rZW4gc3RyaW5nKSB7CglpZiByb3V0ZVBhdGhzID09ICIiIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW52YWxpZElucHV0LAoJCQl1Zm10LlNwcmludGYoImludmFsaWQgcm91dGU6ICVzIiwgcm91dGVQYXRocyksCgkJKSkKCX0KCglpZiBzdHJpbmdzLkNvdW50KHJvdXRlUGF0aHMsICIsIikgPiAwIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW52YWxpZElucHV0LAoJCQl1Zm10LlNwcmludGYoImludmFsaWQgcm91dGVQYXRoczogJXMiLCByb3V0ZVBhdGhzKSwKCQkpKQoJfQoKCWlmIHN0cmluZ3MuQ291bnQocm91dGVQYXRocywgUE9PTF9TRVBBUkFUT1IpID4gMCB7CgkJcGFuaWMobWFrZUVycm9yV2l0aERldGFpbHMoCgkJCWVyckludmFsaWRJbnB1dCwKCQkJdWZtdC5TcHJpbnRmKCJpbnZhbGlkIHJvdXRlUGF0aHM6ICVzIiwgcm91dGVQYXRocyksCgkJKSkKCX0KCglhc3NlcnRJc1ZhbGlkUm91dGVQYXRocyhyb3V0ZVBhdGhzLCBpbnB1dFRva2VuLCBvdXRwdXRUb2tlbikKfQoKZnVuYyBhc3NlcnRJc1ZhbGlkUm91dGVQYXRocyhyb3V0ZVBhdGhzLCBpbnB1dFRva2VuLCBvdXRwdXRUb2tlbiBzdHJpbmcpIHsKCWVyciA6PSB2YWxpZGF0ZVJvdXRlUGF0aHMocm91dGVQYXRocywgaW5wdXRUb2tlbiwgb3V0cHV0VG9rZW4pCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cn0KCmZ1bmMgYXNzZXJ0SXNFeGlzdHNQb29scyhyb3V0ZVBhdGhBcnIgc3RyaW5nKSB7Cglwb29sUGF0aHMsIGVyciA6PSBwYXJzZVBvb2xQYXRoc0J5Um91dGVQYXRoQXJyKHJvdXRlUGF0aEFycikKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglmb3IgXywgcG9vbFBhdGggOj0gcmFuZ2UgcG9vbFBhdGhzIHsKCQlpZiAhcG9vbC5FeGlzdHNQb29sUGF0aChwb29sUGF0aCkgewoJCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJCWVyckludmFsaWRJbnB1dCwKCQkJCXVmbXQuU3ByaW50ZigicG9vbCBkb2VzIG5vdCBleGlzdDogJXMiLCBwb29sUGF0aCksCgkJCSkpCgkJfQoJfQp9CgpmdW5jIGFzc2VydElzUm91dGVySW1wbGVtZW50YXRpb24oY2FsbGVyIGFkZHJlc3MpIHsKCWlmIGNhbGxlciAhPSByb3V0ZXJJbXBsQWRkciB7CgkJcGFuaWMobWFrZUVycm9yV2l0aERldGFpbHMoCgkJCWVyclVuQXV0aG9yaXplZENhbGxlciwKCQkJdWZtdC5TcHJpbnRmKCJjYWxsZXIgJXMgaXMgbm90IHJvdXRlciBpbXBsZW1lbnRhdGlvbiglcykiLCBjYWxsZXIsIHJvdXRlckltcGxBZGRyKSwKCQkpKQoJfQp9CgovLyBhc3NlcnRJc1JvdXRlclByb3h5UmVhbG0gZW5zdXJlcyB0aGUgc3dhcCBjb250ZXh0IHdhcyBmb3J3YXJkZWQgYnkgdGhlIHJvdXRlciBwcm94eS4KZnVuYyBhc3NlcnRJc1JvdXRlclByb3h5UmVhbG0oXyBpbnQsIHJsbSByZWFsbSkgewoJaWYgcmxtLlBrZ1BhdGgoKSAhPSByb3V0ZXJQcm94eVBrZ1BhdGggewoJCXBhbmljKG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQllcnJVbkF1dGhvcml6ZWRDYWxsZXIsCgkJCXVmbXQuU3ByaW50Zigic3dhcCBjb250ZXh0ICVzIGlzIG5vdCByb3V0ZXIgcHJveHkoJXMpIiwgcmxtLlBrZ1BhdGgoKSwgcm91dGVyUHJveHlQa2dQYXRoKSwKCQkpKQoJfQp9CgovLyBhc3NlcnRIb3BGdWxseUNvbnN1bWVkIHJldmVydHMgd2hlbiBhbiBleGFjdC1pbiBob3AgY29uc3VtZWQgbGVzcyBpbnB1dCB0aGFuIHNwZWNpZmllZC4KZnVuYyBhc3NlcnRIb3BGdWxseUNvbnN1bWVkKGhvcEluZGV4IGludCwgc3BlY2lmaWVkQW1vdW50LCBjb25zdW1lZEFtb3VudCBpbnQ2NCkgewoJZXJyIDo9IHZhbGlkYXRlSG9wRnVsbHlDb25zdW1lZChob3BJbmRleCwgc3BlY2lmaWVkQW1vdW50LCBjb25zdW1lZEFtb3VudCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KfQoKZnVuYyB2YWxpZGF0ZUhvcEZ1bGx5Q29uc3VtZWQoaG9wSW5kZXggaW50LCBzcGVjaWZpZWRBbW91bnQsIGNvbnN1bWVkQW1vdW50IGludDY0KSBlcnJvciB7CglpZiBjb25zdW1lZEFtb3VudCAhPSBzcGVjaWZpZWRBbW91bnQgewoJCXJldHVybiBtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW5zdWZmaWNpZW50TGlxdWlkaXR5LAoJCQl1Zm10LlNwcmludGYoInBhcnRpYWwgZmlsbCBvbiBob3AoJWQpOiByZXF1ZXN0ZWQ9JWQsIGNvbnN1bWVkPSVkIiwgaG9wSW5kZXgsIHNwZWNpZmllZEFtb3VudCwgY29uc3VtZWRBbW91bnQpLAoJCSkKCX0KCglyZXR1cm4gbmlsCn0KGr1DCghiYXNlLmdubxKwQ3BhY2thZ2Ugcm91dGVyCgppbXBvcnQgKAoJImVycm9ycyIKCSJzdHJpbmdzIgoKCWduc21hdGggImduby5sYW5kL3AvZ25vc3dhcC9nbnNtYXRoL3YxIgoJcHJiYWMgImduby5sYW5kL3AvZ25vc3dhcC9yYmFjL3YxIgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCgoJImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCikKCmNvbnN0ICgKCVNJTkdMRV9IT1BfUk9VVEUgaW50ID0gMQopCgovLyBzd2FwIGNhbiBiZSBkb25lIGJ5IG11bHRpcGxlIHBvb2xzCi8vIHRvIHNlcGFyYXRlIGVhY2ggcG9vbCwgd2UgdXNlIFBPT0xfU0VQQVJBVE9SCmNvbnN0ICgKCVBPT0xfU0VQQVJBVE9SID0gIipQT09MKiIKKQoKdHlwZSBSb3V0ZXJPcGVyYXRpb24gaW50ZXJmYWNlIHsKCS8vIFZhbGlkYXRlIGNoZWNrcyBvcGVyYXRpb24gcGFyYW1ldGVycyBiZWZvcmUgcHJvY2Vzc2luZy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogbmlsIHdoZW4gb3BlcmF0aW9uIGlucHV0IGlzIHZhbGlkOyB2YWxpZGF0aW9uIGVycm9yIG90aGVyd2lzZQoJVmFsaWRhdGUoKSBlcnJvcgoJLy8gUHJvY2VzcyBleGVjdXRlcyB0aGUgb3BlcmF0aW9uIGluIHRoZSBwcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIG9wZXJhdGlvbiBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQgdXNlZCBmb3IgcG9vbCBpbnRlcmFjdGlvbgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gcmVzdWx0OiBzd2FwIGFtb3VudHMgYW5kIHJvdXRlIG1ldGFkYXRhLCBvciBuaWwgd2hlbiBwcm9jZXNzaW5nIGZhaWxzCgkvLyAgIC0gZXJyOiBuaWwgb24gc3VjY2VzczsgZXhlY3V0aW9uIGVycm9yIG90aGVyd2lzZQoJUHJvY2VzcyhfIGludCwgcmxtIHJlYWxtKSAoKlN3YXBSZXN1bHQsIGVycm9yKQp9CgovLyBleGVjdXRlU3dhcE9wZXJhdGlvbiB2YWxpZGF0ZXMgYW5kIHByb2Nlc3NlcyBhIHN3YXAgb3BlcmF0aW9uLgpmdW5jIGV4ZWN1dGVTd2FwT3BlcmF0aW9uKF8gaW50LCBybG0gcmVhbG0sIG9wIFJvdXRlck9wZXJhdGlvbikgKCpTd2FwUmVzdWx0LCBlcnJvcikgewoJaWYgZXJyIDo9IG9wLlZhbGlkYXRlKCk7IGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoKCXJlc3VsdCwgZXJyIDo9IG9wLlByb2Nlc3MoMCwgcmxtKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIG5pbCwgZXJyCgl9CgoJcmV0dXJuIHJlc3VsdCwgbmlsCn0KCnR5cGUgQmFzZVN3YXBQYXJhbXMgc3RydWN0IHsKCUlucHV0VG9rZW4gICAgICAgIHN0cmluZwoJT3V0cHV0VG9rZW4gICAgICAgc3RyaW5nCglSb3V0ZUFyciAgICAgICAgICBzdHJpbmcKCVF1b3RlQXJyICAgICAgICAgIHN0cmluZwoJU3FydFByaWNlTGltaXRYOTYgKnUyNTYuVWludAoJRGVhZGxpbmUgICAgICAgICAgaW50NjQKfQoKLy8gY29tbW9uIHN3YXAgb3BlcmF0aW9uCnR5cGUgYmFzZVN3YXBPcGVyYXRpb24gc3RydWN0IHsKCXNxcnRQcmljZUxpbWl0WDk2ICp1MjU2LlVpbnQKCXJvdXRlcyAgICAgICAgICAgIFtdc3RyaW5nCglxdW90ZXMgICAgICAgICAgICBbXXN0cmluZwoJYW1vdW50U3BlY2lmaWVkICAgaW50NjQKfQoKLy8gcHJvY2Vzc1JvdXRlcyBwcm9jZXNzZXMgYWxsIHN3YXAgcm91dGVzIGFuZCByZXR1cm5zIHRvdGFsIGFtb3VudHMuCmZ1bmMgKG9wICpiYXNlU3dhcE9wZXJhdGlvbikgcHJvY2Vzc1JvdXRlcyhfIGludCwgcmxtIHJlYWxtLCByICpyb3V0ZXJWMSwgc3dhcFR5cGUgU3dhcFR5cGUpIChpbnQ2NCwgaW50NjQsIGVycm9yKSB7CglyZXN1bHRBbW91bnRJbiwgcmVzdWx0QW1vdW50T3V0IDo9IGludDY0KDApLCBpbnQ2NCgwKQoJcmVtYWluUmVxdWVzdEFtb3VudCA6PSBvcC5hbW91bnRTcGVjaWZpZWQKCglmb3IgaSwgcm91dGUgOj0gcmFuZ2Ugb3Aucm91dGVzIHsKCQl0b1N3YXBBbW91bnQgOj0gaW50NjQoMCkKCgkJLy8gaWYgaXQncyB0aGUgbGFzdCByb3V0ZSwgdXNlIHRoZSByZW1haW5pbmcgYW1vdW50CgkJaXNMYXN0Um91dGUgOj0gaSA9PSBsZW4ob3Aucm91dGVzKS0xCgkJaWYgIWlzTGFzdFJvdXRlIHsKCQkJLy8gY2FsY3VsYXRlIHRoZSBhbW91bnQgdG8gc3dhcCBmb3IgdGhpcyByb3V0ZQoJCQlzd2FwQW1vdW50LCBlcnIgOj0gY2FsY3VsYXRlU3dhcEFtb3VudEJ5UXVvdGUob3AuYW1vdW50U3BlY2lmaWVkLCBvcC5xdW90ZXNbaV0pCgkJCWlmIGVyciAhPSBuaWwgewoJCQkJcmV0dXJuIDAsIDAsIGVycgoJCQl9CgoJCQkvLyB1cGRhdGUgdGhlIHJlbWFpbmluZyBhbW91bnQKCQkJcmVtYWluUmVxdWVzdEFtb3VudCA9IGduc21hdGguU2FmZVN1YkludDY0KHJlbWFpblJlcXVlc3RBbW91bnQsIHN3YXBBbW91bnQpCgkJCXRvU3dhcEFtb3VudCA9IHN3YXBBbW91bnQKCQl9IGVsc2UgewoJCQl0b1N3YXBBbW91bnQgPSByZW1haW5SZXF1ZXN0QW1vdW50CgkJfQoKCQlhbW91bnRJbiwgYW1vdW50T3V0LCBlcnIgOj0gb3AucHJvY2Vzc1JvdXRlKDAsIHJsbSwgciwgcm91dGUsIHRvU3dhcEFtb3VudCwgc3dhcFR5cGUpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiAwLCAwLCBlcnIKCQl9CgoJCXJlc3VsdEFtb3VudEluID0gZ25zbWF0aC5TYWZlQWRkSW50NjQocmVzdWx0QW1vdW50SW4sIGFtb3VudEluKQoJCXJlc3VsdEFtb3VudE91dCA9IGduc21hdGguU2FmZUFkZEludDY0KHJlc3VsdEFtb3VudE91dCwgYW1vdW50T3V0KQoJfQoKCXJldHVybiByZXN1bHRBbW91bnRJbiwgcmVzdWx0QW1vdW50T3V0LCBuaWwKfQoKLy8gcHJvY2Vzc1JvdXRlIHByb2Nlc3NlcyBhIHNpbmdsZSByb3V0ZSB3aXRoIHNwZWNpZmllZCBzd2FwIGFtb3VudC4KZnVuYyAob3AgKmJhc2VTd2FwT3BlcmF0aW9uKSBwcm9jZXNzUm91dGUoCglfIGludCwKCXJsbSByZWFsbSwKCXIgKnJvdXRlclYxLAoJcm91dGUgc3RyaW5nLAoJdG9Td2FwIGludDY0LAoJc3dhcFR5cGUgU3dhcFR5cGUsCikgKGFtb3VudEluLCBhbW91bnRPdXQgaW50NjQsIGVyciBlcnJvcikgewoJbnVtSG9wcyA6PSBzdHJpbmdzLkNvdW50KHJvdXRlLCBQT09MX1NFUEFSQVRPUikgKyAxCglhc3NlcnRIb3BzSW5SYW5nZShudW1Ib3BzKQoKCXN3aXRjaCBudW1Ib3BzIHsKCWNhc2UgU0lOR0xFX0hPUF9ST1VURToKCQlhbW91bnRJbiwgYW1vdW50T3V0ID0gci5oYW5kbGVTaW5nbGVTd2FwKDAsIHJsbSwgcm91dGUsIHRvU3dhcCwgb3Auc3FydFByaWNlTGltaXRYOTYpCglkZWZhdWx0OgoJCWFtb3VudEluLCBhbW91bnRPdXQgPSByLmhhbmRsZU11bHRpU3dhcCgwLCBybG0sIHN3YXBUeXBlLCByb3V0ZSwgbnVtSG9wcywgdG9Td2FwKQoJfQoKCXJldHVybiBhbW91bnRJbiwgYW1vdW50T3V0LCBuaWwKfQoKLy8gaGFuZGxlU2luZ2xlU3dhcCBleGVjdXRlcyBhIHNpbmdsZS1ob3Agc3dhcCB3aXRoIHRoZSBzcGVjaWZpZWQgYW1vdW50LgpmdW5jIChyICpyb3V0ZXJWMSkgaGFuZGxlU2luZ2xlU3dhcChfIGludCwgcmxtIHJlYWxtLCByb3V0ZSBzdHJpbmcsIGFtb3VudFNwZWNpZmllZCBpbnQ2NCwgc3FydFByaWNlTGltaXRYOTYgKnUyNTYuVWludCkgKGludDY0LCBpbnQ2NCkgewoJaW5wdXQsIG91dHB1dCwgZmVlIDo9IGdldERhdGFGb3JTaW5nbGVQYXRoKHJvdXRlKQoJc2luZ2xlUGFyYW1zIDo9IFNpbmdsZVN3YXBQYXJhbXN7CgkJdG9rZW5JbjogICAgICAgICAgIGlucHV0LAoJCXRva2VuT3V0OiAgICAgICAgICBvdXRwdXQsCgkJZmVlOiAgICAgICAgICAgICAgIGZlZSwKCQlhbW91bnRTcGVjaWZpZWQ6ICAgYW1vdW50U3BlY2lmaWVkLAoJCXNxcnRQcmljZUxpbWl0WDk2OiBzcXJ0UHJpY2VMaW1pdFg5NiwKCX0KCglyZXR1cm4gci5zaW5nbGVTd2FwKDAsIHJsbSwgJnNpbmdsZVBhcmFtcykKfQoKLy8gaGFuZGxlTXVsdGlTd2FwIHByb2Nlc3NlcyBtdWx0aS1ob3Agc3dhcHMgYWNyb3NzIG11bHRpcGxlIHBvb2xzLgpmdW5jIChyICpyb3V0ZXJWMSkgaGFuZGxlTXVsdGlTd2FwKAoJXyBpbnQsCglybG0gcmVhbG0sCglzd2FwVHlwZSBTd2FwVHlwZSwKCXJvdXRlIHN0cmluZywKCW51bUhvcHMgaW50LAoJYW1vdW50U3BlY2lmaWVkIGludDY0LAopIChpbnQ2NCwgaW50NjQpIHsKCXJlY2lwaWVudCA6PSBhY2Nlc3MuTXVzdEdldEFkZHJlc3MocHJiYWMuUk9MRV9ST1VURVIuU3RyaW5nKCkpCgoJc3dpdGNoIHN3YXBUeXBlIHsKCWNhc2UgRXhhY3RJbjoKCQlpbnB1dCwgb3V0cHV0LCBmZWUgOj0gZ2V0RGF0YUZvck11bHRpUGF0aChyb3V0ZSwgMCkgLy8gZmlyc3QgZGF0YQoJCXNwIDo9IG5ld1N3YXBQYXJhbXMoaW5wdXQsIG91dHB1dCwgZmVlLCByZWNpcGllbnQsIGFtb3VudFNwZWNpZmllZCkKCQlyZXR1cm4gci5tdWx0aVN3YXAoMCwgcmxtLCAqc3AsIG51bUhvcHMsIHJvdXRlKQoJY2FzZSBFeGFjdE91dDoKCQlpbnB1dCwgb3V0cHV0LCBmZWUgOj0gZ2V0RGF0YUZvck11bHRpUGF0aChyb3V0ZSwgbnVtSG9wcy0xKSAvLyBsYXN0IGRhdGEKCQlzcCA6PSBuZXdTd2FwUGFyYW1zKGlucHV0LCBvdXRwdXQsIGZlZSwgcmVjaXBpZW50LCBhbW91bnRTcGVjaWZpZWQpCgkJcmV0dXJuIHIubXVsdGlTd2FwTmVnYXRpdmUoMCwgcmxtLCAqc3AsIG51bUhvcHMsIHJvdXRlKQoJZGVmYXVsdDoKCQlwYW5pYyhlcnJvcnMuTmV3KGVyckludmFsaWRTd2FwVHlwZSkpCgl9Cn0KCi8vIFN3YXBSb3V0ZVBhcmFtcyBjb250YWlucyBhbGwgcGFyYW1ldGVycyBuZWVkZWQgZm9yIHN3YXAgcm91dGUgZXhlY3V0aW9uCnR5cGUgU3dhcFJvdXRlUGFyYW1zIHN0cnVjdCB7CglpbnB1dFRva2VuICAgICAgICBzdHJpbmcKCW91dHB1dFRva2VuICAgICAgIHN0cmluZwoJcm91dGVBcnIgICAgICAgICAgc3RyaW5nCglxdW90ZUFyciAgICAgICAgICBzdHJpbmcKCWRlYWRsaW5lICAgICAgICAgIGludDY0Cgl0eXAgICAgICAgICAgICAgICBTd2FwVHlwZQoJZXhhY3RBbW91bnQgICAgICAgaW50NjQgICAgICAvLyBhbW91bnRJbiBmb3IgRXhhY3RJbiwgYW1vdW50T3V0IGZvciBFeGFjdE91dAoJbGltaXRBbW91bnQgICAgICAgaW50NjQgICAgICAvLyBhbW91bnRPdXRNaW4gZm9yIEV4YWN0SW4sIGFtb3VudEluTWF4IGZvciBFeGFjdE91dAoJc3FydFByaWNlTGltaXRYOTYgKnUyNTYuVWludCAvLyBpZiBzcXJ0UHJpY2VMaW1pdFg5NiBpcyB6ZXJvIHN0cmluZywgaXQgd2lsbCBiZSBzZXQgdG8gTUlOX1BSSUNFIG9yIE1BWF9QUklDRQp9CgovLyBFeGFjdEFtb3VudCByZXR1cm5zIHRoZSByZXF1ZXN0ZWQgZXhhY3QgaW5wdXQgb3Igb3V0cHV0IGFtb3VudC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogZXhhY3RBbW91bnQgY29uZmlndXJlZCBmb3IgdGhlIHJvdXRlCmZ1bmMgKHAgKlN3YXBSb3V0ZVBhcmFtcykgRXhhY3RBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gcC5leGFjdEFtb3VudAp9CgovLyBFeHBlY3RlZEV4YWN0QW1vdW50QnlGZWUgcmV0dXJucyB0aGUgYW1vdW50IG5lZWRlZCBieSBwb29sIGV4ZWN1dGlvbiBhZnRlciByb3V0ZXItZmVlIGFkanVzdG1lbnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBmZWVCcHM6IHJvdXRlciBmZWUgaW4gYmFzaXMgcG9pbnRzCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IGV4YWN0IGlucHV0IGFtb3VudCBmb3IgRXhhY3RJbiwgb3IgZ3Jvc3MgcG9vbCBhbW91bnQgZm9yIEV4YWN0T3V0CmZ1bmMgKHAgKlN3YXBSb3V0ZVBhcmFtcykgRXhwZWN0ZWRFeGFjdEFtb3VudEJ5RmVlKGZlZUJwcyB1aW50NjQpIGludDY0IHsKCWlmIHAudHlwID09IEV4YWN0SW4gewoJCXJldHVybiBwLmV4YWN0QW1vdW50Cgl9CgoJcmV0dXJuIGNhbGN1bGF0ZUV4YWN0T3V0V2l0aFJvdXRlckZlZShwLmV4YWN0QW1vdW50LCBmZWVCcHMpCn0KCi8vIFN3YXBDb3VudCBjb3VudHMgcG9vbCBob3BzIGFjcm9zcyBhbGwgY29tbWEtc2VwYXJhdGVkIHJvdXRlcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGNvdW50OiB0b3RhbCBudW1iZXIgb2YgcG9vbCBzd2FwcyByZXByZXNlbnRlZCBieSByb3V0ZUFycgpmdW5jIChwICpTd2FwUm91dGVQYXJhbXMpIFN3YXBDb3VudCgpIGludDY0IHsKCXN3YXBDb3VudCA6PSBpbnQ2NCgwKQoKCWZvciBfLCByb3V0ZSA6PSByYW5nZSBzdHJpbmdzLlNwbGl0KHAucm91dGVBcnIsICIsIikgewoJCXN3YXBDb3VudCArPSBpbnQ2NChzdHJpbmdzLkNvdW50KHJvdXRlLCBQT09MX1NFUEFSQVRPUikgKyAxKQoJfQoKCXJldHVybiBzd2FwQ291bnQKfQoKZnVuYyBidWlsZFJvdXRlRXZlbnRBdHRycyhyb3V0ZUFyciBzdHJpbmcpIFtdc3RyaW5nIHsKCXJvdXRlcyA6PSBzdHJpbmdzLlNwbGl0KHJvdXRlQXJyLCAiLCIpCglyb3V0ZUV2ZW50QXR0cnMgOj0gbWFrZShbXXN0cmluZywgMCwgbGVuKHJvdXRlcykqMikKCglmb3IgaW5kZXgsIHJvdXRlIDo9IHJhbmdlIHJvdXRlcyB7CgkJcm91dGVFdmVudEF0dHJzID0gYXBwZW5kKHJvdXRlRXZlbnRBdHRycywgdWZtdC5TcHJpbnRmKCJyb3V0ZXNbJWRdIiwgaW5kZXgpKQoJCXJvdXRlRXZlbnRBdHRycyA9IGFwcGVuZChyb3V0ZUV2ZW50QXR0cnMsIHJvdXRlKQoJfQoKCXJldHVybiByb3V0ZUV2ZW50QXR0cnMKfQoKLy8gSXNTZXRTcXJ0UHJpY2VMaW1pdFg5NiByZXBvcnRzIHdoZXRoZXIgYSBub256ZXJvIGNhbGxlciBwcmljZSBsaW1pdCBpcyBjb25maWd1cmVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc2V0OiB0cnVlIHdoZW4gc3FydFByaWNlTGltaXRYOTYgaXMgbm9uLW5pbCBhbmQgbm9uemVybwpmdW5jIChwICpTd2FwUm91dGVQYXJhbXMpIElzU2V0U3FydFByaWNlTGltaXRYOTYoKSBib29sIHsKCXJldHVybiBwLnNxcnRQcmljZUxpbWl0WDk2ICE9IG5pbCAmJiAhcC5zcXJ0UHJpY2VMaW1pdFg5Ni5Jc1plcm8oKQp9CgovLyBjcmVhdGVTd2FwT3BlcmF0aW9uIGNyZWF0ZXMgdGhlIGFwcHJvcHJpYXRlIHN3YXAgb3BlcmF0aW9uIGJhc2VkIG9uIHN3YXAgdHlwZS4KZnVuYyBjcmVhdGVTd2FwT3BlcmF0aW9uKHIgKnJvdXRlclYxLCBwYXJhbXMgU3dhcFJvdXRlUGFyYW1zKSAoUm91dGVyT3BlcmF0aW9uLCBlcnJvcikgewoJYmFzZVBhcmFtcyA6PSBCYXNlU3dhcFBhcmFtc3sKCQlJbnB1dFRva2VuOiAgICAgICAgcGFyYW1zLmlucHV0VG9rZW4sCgkJT3V0cHV0VG9rZW46ICAgICAgIHBhcmFtcy5vdXRwdXRUb2tlbiwKCQlSb3V0ZUFycjogICAgICAgICAgcGFyYW1zLnJvdXRlQXJyLAoJCVF1b3RlQXJyOiAgICAgICAgICBwYXJhbXMucXVvdGVBcnIsCgkJU3FydFByaWNlTGltaXRYOTY6IHBhcmFtcy5zcXJ0UHJpY2VMaW1pdFg5NiwKCQlEZWFkbGluZTogICAgICAgICAgcGFyYW1zLmRlYWRsaW5lLAoJfQoKCXN3aXRjaCBwYXJhbXMudHlwIHsKCWNhc2UgRXhhY3RJbjoKCQlwcCA6PSBOZXdFeGFjdEluUGFyYW1zKGJhc2VQYXJhbXMsIHBhcmFtcy5FeGFjdEFtb3VudCgpLCBwYXJhbXMubGltaXRBbW91bnQpCgkJcmV0dXJuIE5ld0V4YWN0SW5Td2FwT3BlcmF0aW9uKHIsIHBwKSwgbmlsCgljYXNlIEV4YWN0T3V0OgoJCXJvdXRlckZlZSA6PSByLnN0b3JlLkdldFN3YXBGZWUoKQoJCXBwIDo9IE5ld0V4YWN0T3V0UGFyYW1zKGJhc2VQYXJhbXMsIHBhcmFtcy5FeHBlY3RlZEV4YWN0QW1vdW50QnlGZWUocm91dGVyRmVlKSwgcGFyYW1zLmxpbWl0QW1vdW50KQoJCXJldHVybiBOZXdFeGFjdE91dFN3YXBPcGVyYXRpb24ociwgcHApLCBuaWwKCWRlZmF1bHQ6CgkJbXNnIDo9IGFkZERldGFpbFRvRXJyb3IoZXJySW52YWxpZFN3YXBUeXBlLCAidW5rbm93biBzd2FwIHR5cGUiKQoJCXJldHVybiBuaWwsIGVycm9ycy5OZXcobXNnKQoJfQp9CgovLyBjb21tb25Td2FwUm91dGUgaGFuZGxlcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIEV4YWN0SW4gYW5kIEV4YWN0T3V0IHN3YXBzLgpmdW5jIChyICpyb3V0ZXJWMSkgY29tbW9uU3dhcFJvdXRlKF8gaW50LCBybG0gcmVhbG0sIHBhcmFtcyBTd2FwUm91dGVQYXJhbXMpIChpbnQ2NCwgaW50NjQsIGVycm9yKSB7CglvcCwgZXJyIDo9IGNyZWF0ZVN3YXBPcGVyYXRpb24ociwgcGFyYW1zKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIDAsIGVycgoJfQoKCXJlc3VsdCwgZXJyIDo9IGV4ZWN1dGVTd2FwT3BlcmF0aW9uKDAsIHJsbSwgb3ApCglpZiBlcnIgIT0gbmlsIHsKCQltc2cgOj0gYWRkRGV0YWlsVG9FcnJvcigKCQkJZXJySW52YWxpZElucHV0LAoJCQl1Zm10LlNwcmludGYoImludmFsaWQgJXMgU3dhcE9wZXJhdGlvbjogJXMiLCBwYXJhbXMudHlwLlN0cmluZygpLCBlcnIuRXJyb3IoKSksCgkJKQoJCXJldHVybiAwLCAwLCBlcnJvcnMuTmV3KG1zZykKCX0KCglpbnB1dEFtb3VudCwgb3V0cHV0QW1vdW50IDo9IHIuZmluYWxpemVTd2FwKAoJCTAsCgkJcmxtLAoJCXBhcmFtcy5pbnB1dFRva2VuLAoJCXBhcmFtcy5vdXRwdXRUb2tlbiwKCQlyZXN1bHQuQW1vdW50SW4sCgkJcmVzdWx0LkFtb3VudE91dCwKCQlwYXJhbXMudHlwLAoJCXBhcmFtcy5saW1pdEFtb3VudCwKCQlwYXJhbXMuRXhhY3RBbW91bnQoKSwKCQlwYXJhbXMuU3dhcENvdW50KCksCgkJcGFyYW1zLklzU2V0U3FydFByaWNlTGltaXRYOTYoKSwKCSkKCglyZXR1cm4gaW5wdXRBbW91bnQsIG91dHB1dEFtb3VudCwgbmlsCn0KGqwBCgpjb25zdHMuZ25vEp0BcGFja2FnZSByb3V0ZXIKCmNvbnN0IHJvdXRlclByb3h5UGtnUGF0aCA9ICJnbm8ubGFuZC9yL2dub3N3YXAvcm91dGVyIgoKdmFyIHJvdXRlckltcGxBZGRyIGFkZHJlc3MKCmZ1bmMgaW5pdChjdXIgcmVhbG0pIHsKCXJvdXRlckltcGxBZGRyID0gY3VyLkFkZHJlc3MoKQp9Chq8AwoHZG9jLmdubxKwAy8vIHBhY2thZ2Ugcm91dGVyIGhhbmRsZXMgdG9rZW4gc3dhcHMgdGhyb3VnaCBHbm9Td2FwIGxpcXVpZGl0eSBwb29scy4KLy8KLy8gVGhlIHJvdXRlciBwcm92aWRlcyB1c2VyLWZhY2luZyBzd2FwIGZ1bmN0aW9ucyB3aXRoIHNsaXBwYWdlIHByb3RlY3Rpb24sCi8vIG11bHRpLWhvcCByb3V0aW5nLCBhbmQgYm90aCBleGFjdC1pbnB1dCBhbmQgZXhhY3Qtb3V0cHV0IHN3YXAgbW9kZXMuCi8vCi8vIExpdmUgZXhhY3QtaW5wdXQgY2FsbHMgZW5mb3JjZSBhIG1pbmltdW0gb3V0cHV0IGFuZCBkZWFkbGluZS4gTGl2ZQovLyBleGFjdC1vdXRwdXQgY2FsbHMgZW5mb3JjZSBhIG1heGltdW0gaW5wdXQgYW5kIGRlYWRsaW5lLiBEcnlTd2FwUm91dGUgaXMKLy8gcmVhZC1vbmx5IGFuZCBoYXMgbm8gZGVhZGxpbmUgb3IgdHJhbnNmZXIuCnBhY2thZ2Ugcm91dGVyChrwDgoKZXJyb3JzLmdubxLhDnBhY2thZ2Ugcm91dGVyCgppbXBvcnQgKAoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgpjb25zdCAoCgllcnJTbGlwcGFnZSAgICAgICAgICAgICAgID0gIltHTk9TV0FQLVJPVVRFUi0wMDFdIHNsaXBwYWdlIGNoZWNrIGZhaWxlZCIKCWVyckludmFsaWRSb3V0ZXNBbmRRdW90ZXMgPSAiW0dOT1NXQVAtUk9VVEVSLTAwMl0gaW52YWxpZCByb3V0ZXMgYW5kIHF1b3RlcyIKCWVyckV4cGlyZWQgICAgICAgICAgICAgICAgPSAiW0dOT1NXQVAtUk9VVEVSLTAwM10gdHJhbnNhY3Rpb24gZXhwaXJlZCIKCWVyckludmFsaWRJbnB1dCAgICAgICAgICAgPSAiW0dOT1NXQVAtUk9VVEVSLTAwNF0gaW52YWxpZCBpbnB1dCBkYXRhIgoJZXJySW52YWxpZFBvb2xGZWVUaWVyICAgICA9ICJbR05PU1dBUC1ST1VURVItMDA1XSBpbnZhbGlkIHBvb2wgZmVlIHRpZXIiCgllcnJJbnZhbGlkU3dhcEZlZSAgICAgICAgID0gIltHTk9TV0FQLVJPVVRFUi0wMDZdIGludmFsaWQgc3dhcCBmZWUiCgllcnJJbnZhbGlkU3dhcFR5cGUgICAgICAgID0gIltHTk9TV0FQLVJPVVRFUi0wMDddIGludmFsaWQgc3dhcCB0eXBlIgoJZXJySW52YWxpZFBvb2xQYXRoICAgICAgICA9ICJbR05PU1dBUC1ST1VURVItMDA4XSBpbnZhbGlkIHBvb2wgcGF0aCIKCWVyclVuQXV0aG9yaXplZENhbGxlciAgICAgPSAiW0dOT1NXQVAtUk9VVEVSLTAwOV0gdW5hdXRob3JpemVkIGNhbGxlciIKCWVyckhvcHNPdXRPZlJhbmdlICAgICAgICAgPSAiW0dOT1NXQVAtUk9VVEVSLTAxMF0gbnVtYmVyIG9mIGhvcHMgbXVzdCBiZSAxfjMiCgllcnJTYW1lVG9rZW5Td2FwICAgICAgICAgID0gIltHTk9TV0FQLVJPVVRFUi0wMTFdIGNhbm5vdCBzd2FwIHNhbWUgdG9rZW4iCgllcnJJbnZhbGlkUm91dGVQYXRoICAgICAgID0gIltHTk9TV0FQLVJPVVRFUi0wMTNdIGludmFsaWQgcm91dGUgcGF0aCIKCWVyckludmFsaWRSb3V0ZUZpcnN0VG9rZW4gPSAiW0dOT1NXQVAtUk9VVEVSLTAxNF0gaW52YWxpZCByb3V0ZSBmaXJzdCB0b2tlbiIKCWVyckludmFsaWRSb3V0ZUxhc3RUb2tlbiAgPSAiW0dOT1NXQVAtUk9VVEVSLTAxNV0gaW52YWxpZCByb3V0ZSBsYXN0IHRva2VuIgoJZXJySW52YWxpZFN3YXBBbW91bnQgICAgICA9ICJbR05PU1dBUC1ST1VURVItMDE2XSBpbnZhbGlkIHN3YXAgYW1vdW50IgoJZXJyUm91dGVIb3BEaXNjb25uZWN0ZWQgICA9ICJbR05PU1dBUC1ST1VURVItMDE3XSByb3V0ZSBob3AgZGlzY29ubmVjdGVkIgoJZXJySW5zdWZmaWNpZW50QmFsYW5jZSAgICA9ICJbR05PU1dBUC1ST1VURVItMDE4XSBpbnN1ZmZpY2llbnQgYmFsYW5jZSBmb3Igc3dhcCIKCWVyclNwb29mZWRSZWFsbSAgICAgICAgICAgPSAiW0dOT1NXQVAtUk9VVEVSLTAxOV0gcmxtIGRvZXMgbm90IG1hdGNoIHRoZSBjdXJyZW50IGNyb3NzaW5nIGZyYW1lIgoJZXJySW5zdWZmaWNpZW50TGlxdWlkaXR5ICA9ICJbR05PU1dBUC1ST1VURVItMDIwXSBpbnN1ZmZpY2llbnQgbGlxdWlkaXR5IGZvciBzd2FwIgopCgovLyBhZGREZXRhaWxUb0Vycm9yIGFkZHMgZGV0YWlsIHRvIGFuIGVycm9yIG1lc3NhZ2UuCmZ1bmMgYWRkRGV0YWlsVG9FcnJvcihtZXNzYWdlIHN0cmluZywgZGV0YWlsIHN0cmluZykgc3RyaW5nIHsKCWZpbmFsRXJyIDo9IHVmbXQuRXJyb3JmKCIlcyB8fCAlcyIsIG1lc3NhZ2UsIGRldGFpbCkKCXJldHVybiBmaW5hbEVyci5FcnJvcigpCn0KCi8vIG1ha2VFcnJvcldpdGhEZXRhaWxzIGNyZWF0ZXMgYW4gZXJyb3Igd2l0aCBhZGRpdGlvbmFsIGNvbnRleHQuCmZ1bmMgbWFrZUVycm9yV2l0aERldGFpbHMobWVzc2FnZSBzdHJpbmcsIGRldGFpbCBzdHJpbmcpIGVycm9yIHsKCXJldHVybiB1Zm10LkVycm9yZigiJXMgfHwgJXMiLCBtZXNzYWdlLCBkZXRhaWwpCn0KGqdECgxleGFjdF9pbi5nbm8SlkRwYWNrYWdlIHJvdXRlcgoKaW1wb3J0ICgKCSJjaGFpbiIKCgkiZ25vLmxhbmQvci9nbm9zd2FwL2FjY2Vzcy92MSIKCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3V0aWxzL3YxIgoKCSJnbm8ubGFuZC9yL2dub3N3YXAvY29tbW9uIgoJImduby5sYW5kL3IvZ25vc3dhcC9lbWlzc2lvbiIKCSJnbm8ubGFuZC9yL2dub3N3YXAvaGFsdC92MSIKCSJnbm8ubGFuZC9yL2dub3N3YXAvcmVmZXJyYWwvdjEiCikKCi8vIEV4YWN0SW5Td2FwUm91dGUgc3dhcHMgYW4gZXhhY3QgYW1vdW50IG9mIGlucHV0IHRva2VucyBmb3Igb3V0cHV0IHRva2Vucy4KLy8KLy8gRXhlY3V0ZXMgbXVsdGktaG9wIHN3YXBzIHRocm91Z2ggc3BlY2lmaWVkIHJvdXRlLgovLyBTdXBwb3J0cyBzcGxpdHRpbmcgYWNyb3NzIG11bHRpcGxlIHBhdGhzIGZvciBwcmljZSBvcHRpbWl6YXRpb24uCi8vIEFwcGxpZXMgc2xpcHBhZ2UgcHJvdGVjdGlvbiB2aWEgbWluaW11bSBvdXRwdXQgYW1vdW50LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogbGVhZGluZyBpbXBsZW1lbnRhdGlvbiBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dDsgdGhpcyBpbXBsZW1lbnRhdGlvbiB2YWxpZGF0ZXMgYW5kIGZvcndhcmRzIGl0Ci8vICAgLSBpbnB1dFRva2VuOiBJbnB1dCB0b2tlbiBjb250cmFjdCBwYXRoCi8vICAgLSBvdXRwdXRUb2tlbjogT3V0cHV0IHRva2VuIGNvbnRyYWN0IHBhdGgKLy8gICAtIGFtb3VudEluOiBFeGFjdCBpbnB1dCBhbW91bnQgdG8gc3dhcAovLyAgIC0gcm91dGVBcnI6IFN3YXAgcm91dGUgKG1heCAzIGhvcHMgcGVyIHBhdGgsIG11bHRpcGxlIHBhdGhzIHNlcGFyYXRlZCBieSBjb21tYSkKLy8gICAtIHF1b3RlQXJyOiBTcGxpdCBwZXJjZW50YWdlcyAiNzAsMzAiIChtdXN0IHN1bSB0byAxMDApCi8vICAgLSBhbW91bnRPdXRNaW46IE1pbmltdW0gYWNjZXB0YWJsZSBvdXRwdXQgKHNsaXBwYWdlIHByb3RlY3Rpb24pCi8vICAgLSBkZWFkbGluZTogVW5peCB0aW1lc3RhbXAgZm9yIGV4cGlyYXRpb24KLy8gICAtIHJlZmVycmVyOiBPcHRpb25hbCByZWZlcnJhbCBhZGRyZXNzCi8vCi8vIFJvdXRlIGZvcm1hdDoKLy8gICAtIFNpbmdsZS1ob3A6ICJUT0tFTjA6VE9LRU4xOkZFRSIKLy8gICAtIE11bHRpLWhvcDogIlRPS0VOMDpUT0tFTjE6RkVFKlBPT0wqVE9LRU4xOlRPS0VOMjpGRUUiICh1c2UgKlBPT0wqIHNlcGFyYXRvcikKLy8gICAtIE11bHRpLXBhdGg6ICJyb3V0ZTEscm91dGUyIiAodXNlIGNvbW1hIHNlcGFyYXRvciBiZXR3ZWVuIGRpZmZlcmVudCByb3V0ZXMpCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnRJbjogQWN0dWFsIGlucHV0IGNvbnN1bWVkCi8vICAgLSBhbW91bnRPdXQ6IEFjdHVhbCBvdXRwdXQgcmVjZWl2ZWQgYWZ0ZXIgdGhlIHJvdXRlciBmZWUKLy8KLy8gUmV2ZXJ0cyBpZiBvdXRwdXQgPCBhbW91bnRPdXRNaW4gb3IgZGVhZGxpbmUgcGFzc2VkLgpmdW5jIChyICpyb3V0ZXJWMSkgRXhhY3RJblN3YXBSb3V0ZSgKCV8gaW50LAoJcmxtIHJlYWxtLAoJaW5wdXRUb2tlbiBzdHJpbmcsCglvdXRwdXRUb2tlbiBzdHJpbmcsCglhbW91bnRJbiBzdHJpbmcsCglyb3V0ZUFyciBzdHJpbmcsCglxdW90ZUFyciBzdHJpbmcsCglhbW91bnRPdXRNaW4gc3RyaW5nLAoJZGVhZGxpbmUgaW50NjQsCglyZWZlcnJlciBzdHJpbmcsCikgKHN0cmluZywgc3RyaW5nKSB7CglhY2Nlc3MuQXNzZXJ0SXNSbG1DdXJyZW50KDAsIHJsbSkKCgloYWx0LkFzc2VydElzTm90SGFsdGVkUm91dGVyKCkKCgljb21tb24uQXNzZXJ0SXNOb3RIYW5kbGVOYXRpdmVDb2luKCkKCglhc3NlcnRJc1ZhbGlkUm91dGVQYXRocyhyb3V0ZUFyciwgaW5wdXRUb2tlbiwgb3V0cHV0VG9rZW4pCglhc3NlcnRJc05vdEV4cGlyZWQoZGVhZGxpbmUpCglhc3NlcnRJc0V4aXN0c1Bvb2xzKHJvdXRlQXJyKQoKCWVtaXNzaW9uLk1pbnRBbmREaXN0cmlidXRlR25zKGNyb3NzKHJsbSkpCgoJcGFyYW1zIDo9IFN3YXBSb3V0ZVBhcmFtc3sKCQlpbnB1dFRva2VuOiAgICAgICAgaW5wdXRUb2tlbiwKCQlvdXRwdXRUb2tlbjogICAgICAgb3V0cHV0VG9rZW4sCgkJcm91dGVBcnI6ICAgICAgICAgIHJvdXRlQXJyLAoJCXF1b3RlQXJyOiAgICAgICAgICBxdW90ZUFyciwKCQlkZWFkbGluZTogICAgICAgICAgZGVhZGxpbmUsCgkJdHlwOiAgICAgICAgICAgICAgIEV4YWN0SW4sCgkJZXhhY3RBbW91bnQ6ICAgICAgIHV0aWxzLlNhZmVQYXJzZUludDY0KGFtb3VudEluKSwKCQlsaW1pdEFtb3VudDogICAgICAgdXRpbHMuU2FmZVBhcnNlSW50NjQoYW1vdW50T3V0TWluKSwKCQlzcXJ0UHJpY2VMaW1pdFg5NjogdTI1Ni5aZXJvKCksIC8vIG11bHRpLWhvcCBzd2FwIGlzIG5vdCBhbGxvd2VkIHRvIHNldCBzcXJ0UHJpY2VMaW1pdFg5NgoJfQoKCWlucHV0QW1vdW50LCBvdXRwdXRBbW91bnQgOj0gci5leGFjdEluU3dhcFJvdXRlKDAsIHJsbSwgcGFyYW1zLCByZWZlcnJlcikKCglyZXR1cm4gdXRpbHMuRm9ybWF0SW50KGlucHV0QW1vdW50KSwgdXRpbHMuRm9ybWF0SW50KG91dHB1dEFtb3VudCkKfQoKLy8gRXhhY3RJblNpbmdsZVN3YXBSb3V0ZSBzd2FwcyBhbiBleGFjdCBhbW91bnQgb2YgaW5wdXQgdG9rZW5zIGZvciBvdXRwdXQgdG9rZW5zIHRocm91Z2ggYSBzaW5nbGUgcm91dGUuCi8vCi8vIEV4ZWN1dGVzIGEgc2luZ2xlLWhvcCBzd2FwIHRocm91Z2ggYSBzaW5nbGUgc3BlY2lmaWVkIHJvdXRlLgovLyBBbGxvd3MgcHJpY2UgbGltaXQgY29udHJvbCB2aWEgc3FydFByaWNlTGltaXRYOTYgcGFyYW1ldGVyLgovLyBBcHBsaWVzIHNsaXBwYWdlIHByb3RlY3Rpb24gdmlhIG1pbmltdW0gb3V0cHV0IGFtb3VudC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGxlYWRpbmcgaW1wbGVtZW50YXRpb24gZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IHRoaXMgaW1wbGVtZW50YXRpb24gdmFsaWRhdGVzIGFuZCBmb3J3YXJkcyBpdAovLyAgIC0gaW5wdXRUb2tlbjogSW5wdXQgdG9rZW4gY29udHJhY3QgcGF0aAovLyAgIC0gb3V0cHV0VG9rZW46IE91dHB1dCB0b2tlbiBjb250cmFjdCBwYXRoCi8vICAgLSBhbW91bnRJbjogRXhhY3QgaW5wdXQgYW1vdW50IHRvIHN3YXAKLy8gICAtIHJvdXRlQXJyOiBTaW5nbGUtaG9wIHJvdXRlIHBhdGgKLy8gICAtIGFtb3VudE91dE1pbjogTWluaW11bSBhY2NlcHRhYmxlIG91dHB1dCAoc2xpcHBhZ2UgcHJvdGVjdGlvbikKLy8gICAtIHNxcnRQcmljZUxpbWl0WDk2OiBQcmljZSBsaW1pdCBmb3Igc3dhcCBleGVjdXRpb24gKDAgZm9yIG5vIGxpbWl0KQovLyAgIC0gZGVhZGxpbmU6IFVuaXggdGltZXN0YW1wIGZvciBleHBpcmF0aW9uCi8vICAgLSByZWZlcnJlcjogT3B0aW9uYWwgcmVmZXJyYWwgYWRkcmVzcwovLwovLyBSb3V0ZSBmb3JtYXQ6Ci8vICAgLSBTaW5nbGUtaG9wOiAiSU5QVVRfVE9LRU46T1VUUFVUX1RPS0VOOkZFRSIKLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudEluOiBBY3R1YWwgaW5wdXQgY29uc3VtZWQKLy8gICAtIGFtb3VudE91dDogQWN0dWFsIG91dHB1dCByZWNlaXZlZCBhZnRlciB0aGUgcm91dGVyIGZlZQovLwovLyBXaXRoIGEgbm9uemVybyBwcmljZSBsaW1pdCwgdGhlIHN3YXAgbWF5IHN0b3AgYXQgdGhlIGxpbWl0IGFmdGVyIGNvbnN1bWluZwovLyBsZXNzIHRoYW4gYW1vdW50SW47IGFtb3VudE91dE1pbiBhbmQgdGhlIGRlYWRsaW5lIGFyZSBzdGlsbCBlbmZvcmNlZC4KZnVuYyAociAqcm91dGVyVjEpIEV4YWN0SW5TaW5nbGVTd2FwUm91dGUoCglfIGludCwKCXJsbSByZWFsbSwKCWlucHV0VG9rZW4gc3RyaW5nLAoJb3V0cHV0VG9rZW4gc3RyaW5nLAoJYW1vdW50SW4gc3RyaW5nLAoJcm91dGVBcnIgc3RyaW5nLAoJYW1vdW50T3V0TWluIHN0cmluZywKCXNxcnRQcmljZUxpbWl0WDk2IHN0cmluZywKCWRlYWRsaW5lIGludDY0LAoJcmVmZXJyZXIgc3RyaW5nLAopIChzdHJpbmcsIHN0cmluZykgewoJYWNjZXNzLkFzc2VydElzUmxtQ3VycmVudCgwLCBybG0pCgoJaGFsdC5Bc3NlcnRJc05vdEhhbHRlZFJvdXRlcigpCgoJY29tbW9uLkFzc2VydElzTm90SGFuZGxlTmF0aXZlQ29pbigpCgoJYXNzZXJ0SXNWYWxpZFNpbmdsZVN3YXBSb3V0ZUFyclBhdGgocm91dGVBcnIsIGlucHV0VG9rZW4sIG91dHB1dFRva2VuKQoJYXNzZXJ0SXNWYWxpZFNxcnRQcmljZUxpbWl0WDk2KHNxcnRQcmljZUxpbWl0WDk2KQoJYXNzZXJ0SXNOb3RFeHBpcmVkKGRlYWRsaW5lKQoJYXNzZXJ0SXNFeGlzdHNQb29scyhyb3V0ZUFycikKCgllbWlzc2lvbi5NaW50QW5kRGlzdHJpYnV0ZUducyhjcm9zcyhybG0pKQoKCXBhcmFtcyA6PSBTd2FwUm91dGVQYXJhbXN7CgkJaW5wdXRUb2tlbjogICAgICAgIGlucHV0VG9rZW4sCgkJb3V0cHV0VG9rZW46ICAgICAgIG91dHB1dFRva2VuLAoJCXJvdXRlQXJyOiAgICAgICAgICByb3V0ZUFyciwKCQlxdW90ZUFycjogICAgICAgICAgIjEwMCIsCgkJZGVhZGxpbmU6ICAgICAgICAgIGRlYWRsaW5lLAoJCXR5cDogICAgICAgICAgICAgICBFeGFjdEluLAoJCWV4YWN0QW1vdW50OiAgICAgICB1dGlscy5TYWZlUGFyc2VJbnQ2NChhbW91bnRJbiksCgkJbGltaXRBbW91bnQ6ICAgICAgIHV0aWxzLlNhZmVQYXJzZUludDY0KGFtb3VudE91dE1pbiksCgkJc3FydFByaWNlTGltaXRYOTY6IHUyNTYuTXVzdEZyb21EZWNpbWFsKHNxcnRQcmljZUxpbWl0WDk2KSwgLy8gc2luZ2xlIHN3YXAgaXMgYWxsb3dlZCB0byBzZXQgc3FydFByaWNlTGltaXRYOTYKCX0KCglpbnB1dEFtb3VudCwgb3V0cHV0QW1vdW50IDo9IHIuZXhhY3RJblN3YXBSb3V0ZSgwLCBybG0sIHBhcmFtcywgcmVmZXJyZXIpCgoJcmV0dXJuIHV0aWxzLkZvcm1hdEludChpbnB1dEFtb3VudCksIHV0aWxzLkZvcm1hdEludChvdXRwdXRBbW91bnQpCn0KCi8vIGV4YWN0SW5Td2FwUm91dGUgZXhlY3V0ZXMgdGhlIHN3YXAgb3BlcmF0aW9uIGFuZCBoYW5kbGVzIHRva2VuIHRyYW5zZmVycyBhbmQgcmVmZXJyYWwgcmVnaXN0cmF0aW9uLgovLwovLyBQZXJmb3JtcyB0aGUgYWN0dWFsIHN3YXAgb3BlcmF0aW9uIHVzaW5nIGNvbW1vblN3YXBSb3V0ZSBhbmQgaGFuZGxlczoKLy8gLSBTYWZlIHRva2VuIHRyYW5zZmVycyB0byB0aGUgY2FsbGVyCi8vIC0gUmVmZXJyYWwgcmVnaXN0cmF0aW9uIGFuZCB0cmFja2luZwovLyAtIEV2ZW50IGVtaXNzaW9uIGZvciBzd2FwIGNvbXBsZXRpb24KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBhcmFtczogU3dhcFJvdXRlUGFyYW1zIGNvbnRhaW5pbmcgYWxsIHN3YXAgY29uZmlndXJhdGlvbgovLyAgIC0gcmVmZXJyZXI6IFJlZmVycmFsIGFkZHJlc3MgZm9yIHJlZ2lzdHJhdGlvbgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW5wdXRBbW91bnQ6IEFjdHVhbCBpbnB1dCBhbW91bnQgY29uc3VtZWQgYXMgc3RyaW5nCi8vICAgLSBvdXRwdXRBbW91bnQ6IEFjdHVhbCBvdXRwdXQgYW1vdW50IHJlY2VpdmVkIGFzIHN0cmluZwovLwovLyBQYW5pY3MgaWYgc3dhcCBleGVjdXRpb24gZmFpbHMgb3IgdG9rZW4gdHJhbnNmZXIgZmFpbHMuCmZ1bmMgKHIgKnJvdXRlclYxKSBleGFjdEluU3dhcFJvdXRlKAoJXyBpbnQsCglybG0gcmVhbG0sCglwYXJhbXMgU3dhcFJvdXRlUGFyYW1zLAoJcmVmZXJyZXIgc3RyaW5nLAopIChpbnQ2NCwgaW50NjQpIHsKCWlucHV0QW1vdW50LCBvdXRwdXRBbW91bnQsIGVyciA6PSByLmNvbW1vblN3YXBSb3V0ZSgwLCBybG0sIHBhcmFtcykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglwcmV2aW91c1JlYWxtIDo9IHJsbS5QcmV2aW91cygpCgljYWxsZXIgOj0gcHJldmlvdXNSZWFsbS5BZGRyZXNzKCkKCgljb21tb24uU2FmZUdSQzIwVHJhbnNmZXIoMCwgcmxtLCBwYXJhbXMub3V0cHV0VG9rZW4sIGNhbGxlciwgb3V0cHV0QW1vdW50KQoKCS8vIGhhbmRsZSByZWZlcnJhbCByZWdpc3RyYXRpb24KCWFjdHVhbFJlZmVycmVyIDo9IHJlZmVycmFsLlRyeVJlZ2lzdGVyKGNyb3NzKHJsbSksIGNhbGxlciwgcmVmZXJyZXIpCgoJZXZlbnRBdHRycyA6PSBhcHBlbmQoW11zdHJpbmd7CgkJInByZXZBZGRyIiwgY2FsbGVyLlN0cmluZygpLAoJCSJwcmV2UmVhbG0iLCBwcmV2aW91c1JlYWxtLlBrZ1BhdGgoKSwKCQkiaW5wdXQiLCBwYXJhbXMuaW5wdXRUb2tlbiwKCQkib3V0cHV0IiwgcGFyYW1zLm91dHB1dFRva2VuLAoJCSJleGFjdEFtb3VudCIsIHV0aWxzLkZvcm1hdEludChwYXJhbXMuZXhhY3RBbW91bnQpLAoJCSJxdW90ZSIsIHBhcmFtcy5xdW90ZUFyciwKCQkicmVzdWx0SW5wdXRBbW91bnQiLCB1dGlscy5Gb3JtYXRJbnQoaW5wdXRBbW91bnQpLAoJCSJyZXN1bHRPdXRwdXRBbW91bnQiLCB1dGlscy5Gb3JtYXRJbnQob3V0cHV0QW1vdW50KSwKCQkicmVmZXJyZXIiLCBhY3R1YWxSZWZlcnJlciwKCX0sIGJ1aWxkUm91dGVFdmVudEF0dHJzKHBhcmFtcy5yb3V0ZUFycikuLi4pCgoJY2hhaW4uRW1pdCgKCQkiRXhhY3RJblN3YXAiLAoJCWV2ZW50QXR0cnMuLi4sCgkpCgoJcmV0dXJuIGlucHV0QW1vdW50LCBvdXRwdXRBbW91bnQKfQoKdHlwZSBFeGFjdEluU3dhcE9wZXJhdGlvbiBzdHJ1Y3QgewoJYmFzZVN3YXBPcGVyYXRpb24KCXBhcmFtcyBFeGFjdEluUGFyYW1zCglyb3V0ZXIgKnJvdXRlclYxCn0KCi8vIE5ld0V4YWN0SW5Td2FwT3BlcmF0aW9uIGNyZWF0ZXMgYW4gZXhhY3QtaW5wdXQgb3BlcmF0aW9uIGZvciByb3V0ZXIgZXhlY3V0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcjogcm91dGVyIGltcGxlbWVudGF0aW9uIHVzZWQgdG8gZXhlY3V0ZSBwb29sIHN3YXBzCi8vICAgLSBwcDogZXhhY3QtaW5wdXQgYW1vdW50IGFuZCByb3V0ZSBzZXR0aW5ncwovLwovLyBSZXR1cm5zOgovLyAgIC0gb3BlcmF0aW9uOiBpbml0aWFsaXplZCBFeGFjdEluU3dhcE9wZXJhdGlvbgpmdW5jIE5ld0V4YWN0SW5Td2FwT3BlcmF0aW9uKHIgKnJvdXRlclYxLCBwcCBFeGFjdEluUGFyYW1zKSAqRXhhY3RJblN3YXBPcGVyYXRpb24gewoJcmV0dXJuICZFeGFjdEluU3dhcE9wZXJhdGlvbnsKCQlyb3V0ZXI6IHIsCgkJcGFyYW1zOiBwcCwKCQliYXNlU3dhcE9wZXJhdGlvbjogYmFzZVN3YXBPcGVyYXRpb257CgkJCXNxcnRQcmljZUxpbWl0WDk2OiBwcC5TcXJ0UHJpY2VMaW1pdFg5NiwKCQl9LAoJfQp9CgovLyBWYWxpZGF0ZSBjaGVja3MgdGhlIGV4YWN0LWlucHV0IGFtb3VudCBhbmQgcGFyc2VzIHJvdXRlL3F1b3RlIGFsbG9jYXRpb25zLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBuaWwgd2hlbiBhbW91bnQsIHJvdXRlcywgYW5kIHF1b3RlcyBhcmUgdmFsaWQ7IHZhbGlkYXRpb24gZXJyb3Igb3RoZXJ3aXNlCmZ1bmMgKG9wICpFeGFjdEluU3dhcE9wZXJhdGlvbikgVmFsaWRhdGUoKSBlcnJvciB7CglhbW91bnRJbiA6PSBvcC5wYXJhbXMuQW1vdW50SW4KCglpZiBhbW91bnRJbiA8PSAwIHsKCQlyZXR1cm4gdWZtdC5FcnJvcmYoImludmFsaWQgYW1vdW50SW4oJWQpLCBtdXN0IGJlIHBvc2l0aXZlIiwgYW1vdW50SW4pCgl9CgoJLy8gd2hlbiBgU3dhcFR5cGVgIGlzIGBFeGFjdEluYCwgYXNzaWduIGBhbW91bnRTcGVjaWZpZWRgIHRoZSBgYW1vdW50SW5gCgkvLyBvYnRhaW5lZCBmcm9tIGFib3ZlLgoJb3AuYW1vdW50U3BlY2lmaWVkID0gYW1vdW50SW4KCglyb3V0ZXMsIHF1b3RlcywgZXJyIDo9IHZhbGlkYXRlUm91dGVzQW5kUXVvdGVzKG9wLnBhcmFtcy5Sb3V0ZUFyciwgb3AucGFyYW1zLlF1b3RlQXJyKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoKCW9wLnJvdXRlcyA9IHJvdXRlcwoJb3AucXVvdGVzID0gcXVvdGVzCgoJcmV0dXJuIG5pbAp9CgovLyBQcm9jZXNzIGV4ZWN1dGVzIHRoZSB2YWxpZGF0ZWQgZXhhY3QtaW5wdXQgb3BlcmF0aW9uIGluIHRoZSBwcm9wYWdhdGVkIHJlYWxtLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogbGVhZGluZyBvcGVyYXRpb24gZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQgdXNlZCBmb3IgcG9vbCBzd2FwcwovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiBhZ2dyZWdhdGUgc3dhcCBhbW91bnRzIGFuZCByb3V0ZSBtZXRhZGF0YSwgb3IgbmlsIG9uIHByb2Nlc3NpbmcgZXJyb3IKLy8gICAtIGVycjogbmlsIG9uIHN1Y2Nlc3M7IHBvb2wgb3Igcm91dGUgZXhlY3V0aW9uIGVycm9yIG90aGVyd2lzZQpmdW5jIChvcCAqRXhhY3RJblN3YXBPcGVyYXRpb24pIFByb2Nlc3MoXyBpbnQsIHJsbSByZWFsbSkgKCpTd2FwUmVzdWx0LCBlcnJvcikgewoJcmVzdWx0QW1vdW50SW4sIHJlc3VsdEFtb3VudE91dCwgZXJyIDo9IG9wLnByb2Nlc3NSb3V0ZXMoMCwgcmxtLCBvcC5yb3V0ZXIsIEV4YWN0SW4pCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCglyZXR1cm4gJlN3YXBSZXN1bHR7CgkJQW1vdW50SW46ICAgICAgICByZXN1bHRBbW91bnRJbiwKCQlBbW91bnRPdXQ6ICAgICAgIHJlc3VsdEFtb3VudE91dCwKCQlSb3V0ZXM6ICAgICAgICAgIG9wLnJvdXRlcywKCQlRdW90ZXM6ICAgICAgICAgIG9wLnF1b3RlcywKCQlBbW91bnRTcGVjaWZpZWQ6IG9wLmFtb3VudFNwZWNpZmllZCwKCX0sIG5pbAp9ChqsRAoNZXhhY3Rfb3V0LmdubxKaRHBhY2thZ2Ugcm91dGVyCgppbXBvcnQgKAoJImNoYWluIgoKCSJnbm8ubGFuZC9yL2dub3N3YXAvYWNjZXNzL3YxIgoKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKCSJnbm8ubGFuZC9wL2dub3N3YXAvdXRpbHMvdjEiCgoJImduby5sYW5kL3IvZ25vc3dhcC9jb21tb24iCgkiZ25vLmxhbmQvci9nbm9zd2FwL2VtaXNzaW9uIgoJImduby5sYW5kL3IvZ25vc3dhcC9oYWx0L3YxIgoJImduby5sYW5kL3IvZ25vc3dhcC9yZWZlcnJhbC92MSIKKQoKLy8gRXhhY3RPdXRTd2FwUm91dGUgc3dhcHMgdG9rZW5zIGZvciBhIHJlcXVlc3RlZCBwb3N0LXJvdXRlci1mZWUgb3V0cHV0IHRhcmdldC4KLy8KLy8gRXhlY3V0ZXMgYSBzd2FwIHRvIHJlY2VpdmUgdGhlIHJlcXVlc3RlZCBuZXQgb3V0cHV0IHRva2Vucy4KLy8gQ2FsY3VsYXRlcyB0aGUgcmVxdWlyZWQgZ3Jvc3MgcG9vbCBvdXRwdXQgYW5kIGlucHV0IHdvcmtpbmcgYmFja3dhcmRzCi8vIHRocm91Z2ggdGhlIHJvdXRlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogbGVhZGluZyBpbXBsZW1lbnRhdGlvbiBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dDsgdGhpcyBpbXBsZW1lbnRhdGlvbiB2YWxpZGF0ZXMgYW5kIGZvcndhcmRzIGl0Ci8vICAgLSBpbnB1dFRva2VuOiBJbnB1dCB0b2tlbiBjb250cmFjdCBwYXRoCi8vICAgLSBvdXRwdXRUb2tlbjogT3V0cHV0IHRva2VuIGNvbnRyYWN0IHBhdGgKLy8gICAtIGFtb3VudE91dDogUmVxdWVzdGVkIG5ldCBvdXRwdXQgdGFyZ2V0Ci8vICAgLSByb3V0ZUFycjogU3dhcCByb3V0ZXMgc2VwYXJhdGVkIGJ5IGNvbW1hOyBlYWNoIHJvdXRlIG1heSBjb250YWluIHVwIHRvIDMgaG9wcyBqb2luZWQgYnkgKlBPT0wqCi8vICAgLSBxdW90ZUFycjogU3BsaXQgcGVyY2VudGFnZXMgIjcwLDMwIiAobXVzdCBzdW0gdG8gMTAwKQovLyAgIC0gYW1vdW50SW5NYXg6IE1heGltdW0gaW5wdXQgdG8gc3BlbmQgKHNsaXBwYWdlIHByb3RlY3Rpb24pCi8vICAgLSBkZWFkbGluZTogVW5peCB0aW1lc3RhbXAgZm9yIGV4cGlyYXRpb24KLy8gICAtIHJlZmVycmVyOiBPcHRpb25hbCByZWZlcnJhbCBhZGRyZXNzCi8vCi8vIFJvdXRlIGNhbGN1bGF0aW9uOgovLyAgIC0gV29ya3MgYmFja3dhcmRzIGZyb20gb3V0cHV0IHRvIGlucHV0Ci8vICAgLSBFYWNoIGhvcCBpbmNyZWFzZXMgcmVxdWlyZWQgaW5wdXQKLy8gICAtIE11bHRpLXBhdGggYWdncmVnYXRlcyB0b3RhbCBpbnB1dAovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50SW46IEFjdHVhbCBpbnB1dCBjb25zdW1lZAovLyAgIC0gYW1vdW50T3V0OiBOZXQgb3V0cHV0IGRlbGl2ZXJlZCBhZnRlciB0aGUgcm91dGVyIGZlZQovLwovLyBSZXZlcnRzIGlmIGlucHV0ID4gYW1vdW50SW5NYXggb3IgZGVhZGxpbmUgcGFzc2VkLgpmdW5jIChyICpyb3V0ZXJWMSkgRXhhY3RPdXRTd2FwUm91dGUoCglfIGludCwKCXJsbSByZWFsbSwKCWlucHV0VG9rZW4gc3RyaW5nLAoJb3V0cHV0VG9rZW4gc3RyaW5nLAoJYW1vdW50T3V0IHN0cmluZywKCXJvdXRlQXJyIHN0cmluZywKCXF1b3RlQXJyIHN0cmluZywKCWFtb3VudEluTWF4IHN0cmluZywKCWRlYWRsaW5lIGludDY0LAoJcmVmZXJyZXIgc3RyaW5nLAopIChzdHJpbmcsIHN0cmluZykgewoJYWNjZXNzLkFzc2VydElzUmxtQ3VycmVudCgwLCBybG0pCgoJaGFsdC5Bc3NlcnRJc05vdEhhbHRlZFJvdXRlcigpCgoJY29tbW9uLkFzc2VydElzTm90SGFuZGxlTmF0aXZlQ29pbigpCgoJYXNzZXJ0SXNWYWxpZFJvdXRlUGF0aHMocm91dGVBcnIsIGlucHV0VG9rZW4sIG91dHB1dFRva2VuKQoJYXNzZXJ0SXNOb3RFeHBpcmVkKGRlYWRsaW5lKQoJYXNzZXJ0SXNFeGlzdHNQb29scyhyb3V0ZUFycikKCgllbWlzc2lvbi5NaW50QW5kRGlzdHJpYnV0ZUducyhjcm9zcyhybG0pKQoKCXBhcmFtcyA6PSBTd2FwUm91dGVQYXJhbXN7CgkJaW5wdXRUb2tlbjogICAgICAgIGlucHV0VG9rZW4sCgkJb3V0cHV0VG9rZW46ICAgICAgIG91dHB1dFRva2VuLAoJCXJvdXRlQXJyOiAgICAgICAgICByb3V0ZUFyciwKCQlxdW90ZUFycjogICAgICAgICAgcXVvdGVBcnIsCgkJZGVhZGxpbmU6ICAgICAgICAgIGRlYWRsaW5lLAoJCXR5cDogICAgICAgICAgICAgICBFeGFjdE91dCwKCQlleGFjdEFtb3VudDogICAgICAgdXRpbHMuU2FmZVBhcnNlSW50NjQoYW1vdW50T3V0KSwKCQlsaW1pdEFtb3VudDogICAgICAgdXRpbHMuU2FmZVBhcnNlSW50NjQoYW1vdW50SW5NYXgpLAoJCXNxcnRQcmljZUxpbWl0WDk2OiB1MjU2Llplcm8oKSwgLy8gbXVsdGktaG9wIHN3YXAgaXMgbm90IGFsbG93ZWQgdG8gc2V0IHNxcnRQcmljZUxpbWl0WDk2Cgl9CgoJaW5wdXRBbW91bnQsIG91dHB1dEFtb3VudCA6PSByLmV4YWN0T3V0U3dhcFJvdXRlKDAsIHJsbSwgcGFyYW1zLCByZWZlcnJlcikKCglyZXR1cm4gdXRpbHMuRm9ybWF0SW50KGlucHV0QW1vdW50KSwgdXRpbHMuRm9ybWF0SW50KG91dHB1dEFtb3VudCkKfQoKLy8gRXhhY3RPdXRTaW5nbGVTd2FwUm91dGUgc3dhcHMgdG9rZW5zIGZvciBhIHJlcXVlc3RlZCBwb3N0LXJvdXRlci1mZWUgb3V0cHV0Ci8vIHRhcmdldCB0aHJvdWdoIGEgc2luZ2xlIHJvdXRlLgovLwovLyBFeGVjdXRlcyBhIHNpbmdsZS1ob3Agc3dhcCB0aHJvdWdoIGEgc2luZ2xlIHNwZWNpZmllZCByb3V0ZS4KLy8gQWxsb3dzIHByaWNlIGxpbWl0IGNvbnRyb2wgdmlhIHNxcnRQcmljZUxpbWl0WDk2LgovLyBBcHBsaWVzIHNsaXBwYWdlIHByb3RlY3Rpb24gdmlhIG1heGltdW0gaW5wdXQgYW1vdW50LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogbGVhZGluZyBpbXBsZW1lbnRhdGlvbiBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dDsgdGhpcyBpbXBsZW1lbnRhdGlvbiB2YWxpZGF0ZXMgYW5kIGZvcndhcmRzIGl0Ci8vICAgLSBpbnB1dFRva2VuOiBJbnB1dCB0b2tlbiBjb250cmFjdCBwYXRoCi8vICAgLSBvdXRwdXRUb2tlbjogT3V0cHV0IHRva2VuIGNvbnRyYWN0IHBhdGgKLy8gICAtIGFtb3VudE91dDogUmVxdWVzdGVkIG5ldCBvdXRwdXQgdGFyZ2V0Ci8vICAgLSByb3V0ZUFycjogU2luZ2xlLWhvcCByb3V0ZSBwYXRoCi8vICAgLSBhbW91bnRJbk1heDogTWF4aW11bSBpbnB1dCB0byBzcGVuZCAoc2xpcHBhZ2UgcHJvdGVjdGlvbikKLy8gICAtIHNxcnRQcmljZUxpbWl0WDk2OiBQcmljZSBsaW1pdCBmb3Igc3dhcCBleGVjdXRpb24gKDAgZm9yIG5vIGxpbWl0KQovLyAgIC0gZGVhZGxpbmU6IFVuaXggdGltZXN0YW1wIGZvciBleHBpcmF0aW9uCi8vICAgLSByZWZlcnJlcjogT3B0aW9uYWwgcmVmZXJyYWwgYWRkcmVzcwovLwovLyBSb3V0ZSBmb3JtYXQ6Ci8vICAgLSBTaW5nbGUtaG9wOiAiSU5QVVRfVE9LRU46T1VUUFVUX1RPS0VOOkZFRSIKLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudEluOiBBY3R1YWwgaW5wdXQgY29uc3VtZWQKLy8gICAtIGFtb3VudE91dDogTmV0IG91dHB1dCBkZWxpdmVyZWQgYWZ0ZXIgdGhlIHJvdXRlciBmZWUKLy8KLy8gV2l0aCBhIG5vbnplcm8gcHJpY2UgbGltaXQsIHRoZSBzd2FwIG1heSBzdG9wIGF0IHRoZSBsaW1pdCBhbmQgZGVsaXZlciBsZXNzCi8vIHRoYW4gYW1vdW50T3V0OyBhbW91bnRJbk1heCBhbmQgdGhlIGRlYWRsaW5lIGFyZSBzdGlsbCBlbmZvcmNlZC4KZnVuYyAociAqcm91dGVyVjEpIEV4YWN0T3V0U2luZ2xlU3dhcFJvdXRlKAoJXyBpbnQsCglybG0gcmVhbG0sCglpbnB1dFRva2VuIHN0cmluZywKCW91dHB1dFRva2VuIHN0cmluZywKCWFtb3VudE91dCBzdHJpbmcsCglyb3V0ZUFyciBzdHJpbmcsCglhbW91bnRJbk1heCBzdHJpbmcsCglzcXJ0UHJpY2VMaW1pdFg5NiBzdHJpbmcsCglkZWFkbGluZSBpbnQ2NCwKCXJlZmVycmVyIHN0cmluZywKKSAoc3RyaW5nLCBzdHJpbmcpIHsKCWFjY2Vzcy5Bc3NlcnRJc1JsbUN1cnJlbnQoMCwgcmxtKQoKCWhhbHQuQXNzZXJ0SXNOb3RIYWx0ZWRSb3V0ZXIoKQoKCWNvbW1vbi5Bc3NlcnRJc05vdEhhbmRsZU5hdGl2ZUNvaW4oKQoKCWFzc2VydElzVmFsaWRTaW5nbGVTd2FwUm91dGVBcnJQYXRoKHJvdXRlQXJyLCBpbnB1dFRva2VuLCBvdXRwdXRUb2tlbikKCWFzc2VydElzVmFsaWRTcXJ0UHJpY2VMaW1pdFg5NihzcXJ0UHJpY2VMaW1pdFg5NikKCWFzc2VydElzTm90RXhwaXJlZChkZWFkbGluZSkKCWFzc2VydElzRXhpc3RzUG9vbHMocm91dGVBcnIpCgoJZW1pc3Npb24uTWludEFuZERpc3RyaWJ1dGVHbnMoY3Jvc3MocmxtKSkKCglwYXJhbXMgOj0gU3dhcFJvdXRlUGFyYW1zewoJCWlucHV0VG9rZW46ICAgICAgICBpbnB1dFRva2VuLAoJCW91dHB1dFRva2VuOiAgICAgICBvdXRwdXRUb2tlbiwKCQlyb3V0ZUFycjogICAgICAgICAgcm91dGVBcnIsCgkJcXVvdGVBcnI6ICAgICAgICAgICIxMDAiLAoJCWRlYWRsaW5lOiAgICAgICAgICBkZWFkbGluZSwKCQl0eXA6ICAgICAgICAgICAgICAgRXhhY3RPdXQsCgkJZXhhY3RBbW91bnQ6ICAgICAgIHV0aWxzLlNhZmVQYXJzZUludDY0KGFtb3VudE91dCksCgkJbGltaXRBbW91bnQ6ICAgICAgIHV0aWxzLlNhZmVQYXJzZUludDY0KGFtb3VudEluTWF4KSwKCQlzcXJ0UHJpY2VMaW1pdFg5NjogdTI1Ni5NdXN0RnJvbURlY2ltYWwoc3FydFByaWNlTGltaXRYOTYpLCAvLyBzaW5nbGUgc3dhcCBpcyBhbGxvd2VkIHRvIHNldCBzcXJ0UHJpY2VMaW1pdFg5NgoJfQoKCWlucHV0QW1vdW50LCBvdXRwdXRBbW91bnQgOj0gci5leGFjdE91dFN3YXBSb3V0ZSgwLCBybG0sIHBhcmFtcywgcmVmZXJyZXIpCgoJcmV0dXJuIHV0aWxzLkZvcm1hdEludChpbnB1dEFtb3VudCksIHV0aWxzLkZvcm1hdEludChvdXRwdXRBbW91bnQpCn0KCi8vIGV4YWN0T3V0U3dhcFJvdXRlIGV4ZWN1dGVzIHRoZSBzd2FwIG9wZXJhdGlvbiBhbmQgaGFuZGxlcyB0b2tlbiB0cmFuc2ZlcnMgYW5kIHJlZmVycmFsIHJlZ2lzdHJhdGlvbi4KLy8KLy8gUGVyZm9ybXMgdGhlIGFjdHVhbCBzd2FwIG9wZXJhdGlvbiB1c2luZyBjb21tb25Td2FwUm91dGUgYW5kIGhhbmRsZXM6Ci8vIC0gU2FmZSB0b2tlbiB0cmFuc2ZlcnMgdG8gdGhlIGNhbGxlcgovLyAtIFJlZmVycmFsIHJlZ2lzdHJhdGlvbiBhbmQgdHJhY2tpbmcKLy8gLSBFdmVudCBlbWlzc2lvbiBmb3Igc3dhcCBjb21wbGV0aW9uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwYXJhbXM6IFN3YXBSb3V0ZVBhcmFtcyBjb250YWluaW5nIGFsbCBzd2FwIGNvbmZpZ3VyYXRpb24KLy8gICAtIHJlZmVycmVyOiBSZWZlcnJhbCBhZGRyZXNzIGZvciByZWdpc3RyYXRpb24KLy8KLy8gUmV0dXJuczoKLy8gICAtIGlucHV0QW1vdW50OiBBY3R1YWwgaW5wdXQgYW1vdW50IGNvbnN1bWVkIGFzIHN0cmluZwovLyAgIC0gb3V0cHV0QW1vdW50OiBBY3R1YWwgb3V0cHV0IGFtb3VudCByZWNlaXZlZCBhcyBzdHJpbmcKLy8KLy8gUGFuaWNzIGlmIHN3YXAgZXhlY3V0aW9uIGZhaWxzIG9yIHRva2VuIHRyYW5zZmVyIGZhaWxzLgpmdW5jIChyICpyb3V0ZXJWMSkgZXhhY3RPdXRTd2FwUm91dGUoCglfIGludCwKCXJsbSByZWFsbSwKCXBhcmFtcyBTd2FwUm91dGVQYXJhbXMsCglyZWZlcnJlciBzdHJpbmcsCikgKGludDY0LCBpbnQ2NCkgewoJaW5wdXRBbW91bnQsIG91dHB1dEFtb3VudCwgZXJyIDo9IHIuY29tbW9uU3dhcFJvdXRlKDAsIHJsbSwgcGFyYW1zKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXByZXZpb3VzUmVhbG0gOj0gcmxtLlByZXZpb3VzKCkKCWNhbGxlciA6PSBwcmV2aW91c1JlYWxtLkFkZHJlc3MoKQoKCWNvbW1vbi5TYWZlR1JDMjBUcmFuc2ZlcigwLCBybG0sIHBhcmFtcy5vdXRwdXRUb2tlbiwgY2FsbGVyLCBvdXRwdXRBbW91bnQpCgoJLy8gaGFuZGxlIHJlZmVycmFsIHJlZ2lzdHJhdGlvbgoJYWN0dWFsUmVmZXJyZXIgOj0gcmVmZXJyYWwuVHJ5UmVnaXN0ZXIoY3Jvc3MocmxtKSwgY2FsbGVyLCByZWZlcnJlcikKCglldmVudEF0dHJzIDo9IGFwcGVuZChbXXN0cmluZ3sKCQkicHJldkFkZHIiLCBjYWxsZXIuU3RyaW5nKCksCgkJInByZXZSZWFsbSIsIHByZXZpb3VzUmVhbG0uUGtnUGF0aCgpLAoJCSJpbnB1dCIsIHBhcmFtcy5pbnB1dFRva2VuLAoJCSJvdXRwdXQiLCBwYXJhbXMub3V0cHV0VG9rZW4sCgkJImV4YWN0QW1vdW50IiwgdXRpbHMuRm9ybWF0SW50KHBhcmFtcy5leGFjdEFtb3VudCksCgkJInF1b3RlIiwgcGFyYW1zLnF1b3RlQXJyLAoJCSJyZXN1bHRJbnB1dEFtb3VudCIsIHV0aWxzLkZvcm1hdEludChpbnB1dEFtb3VudCksCgkJInJlc3VsdE91dHB1dEFtb3VudCIsIHV0aWxzLkZvcm1hdEludChvdXRwdXRBbW91bnQpLAoJCSJyZWZlcnJlciIsIGFjdHVhbFJlZmVycmVyLAoJfSwgYnVpbGRSb3V0ZUV2ZW50QXR0cnMocGFyYW1zLnJvdXRlQXJyKS4uLikKCgljaGFpbi5FbWl0KAoJCSJFeGFjdE91dFN3YXAiLAoJCWV2ZW50QXR0cnMuLi4sCgkpCgoJcmV0dXJuIGlucHV0QW1vdW50LCBvdXRwdXRBbW91bnQKfQoKLy8gRXhhY3RPdXRTd2FwT3BlcmF0aW9uIGhhbmRsZXMgc3dhcHMgd2hlcmUgdGhlIG91dHB1dCBhbW91bnQgaXMgc3BlY2lmaWVkLgp0eXBlIEV4YWN0T3V0U3dhcE9wZXJhdGlvbiBzdHJ1Y3QgewoJcm91dGVyICpyb3V0ZXJWMQoJYmFzZVN3YXBPcGVyYXRpb24KCXBhcmFtcyBFeGFjdE91dFBhcmFtcwp9CgovLyBOZXdFeGFjdE91dFN3YXBPcGVyYXRpb24gY3JlYXRlcyBhbiBleGFjdC1vdXRwdXQgb3BlcmF0aW9uIGZvciByb3V0ZXIgZXhlY3V0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcjogcm91dGVyIGltcGxlbWVudGF0aW9uIHVzZWQgdG8gZXhlY3V0ZSBwb29sIHN3YXBzCi8vICAgLSBwcDogZXhhY3Qtb3V0cHV0IGFtb3VudCBhbmQgcm91dGUgc2V0dGluZ3MKLy8KLy8gUmV0dXJuczoKLy8gICAtIG9wZXJhdGlvbjogaW5pdGlhbGl6ZWQgRXhhY3RPdXRTd2FwT3BlcmF0aW9uCmZ1bmMgTmV3RXhhY3RPdXRTd2FwT3BlcmF0aW9uKHIgKnJvdXRlclYxLCBwcCBFeGFjdE91dFBhcmFtcykgKkV4YWN0T3V0U3dhcE9wZXJhdGlvbiB7CglyZXR1cm4gJkV4YWN0T3V0U3dhcE9wZXJhdGlvbnsKCQlyb3V0ZXI6IHIsCgkJcGFyYW1zOiBwcCwKCQliYXNlU3dhcE9wZXJhdGlvbjogYmFzZVN3YXBPcGVyYXRpb257CgkJCXNxcnRQcmljZUxpbWl0WDk2OiBwcC5TcXJ0UHJpY2VMaW1pdFg5NiwKCQl9LAoJfQp9CgovLyBWYWxpZGF0ZSBjaGVja3MgdGhlIGV4YWN0LW91dHB1dCBhbW91bnQgYW5kIHBhcnNlcyByb3V0ZS9xdW90ZSBhbGxvY2F0aW9ucy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogbmlsIHdoZW4gYW1vdW50LCByb3V0ZXMsIGFuZCBxdW90ZXMgYXJlIHZhbGlkOyB2YWxpZGF0aW9uIGVycm9yIG90aGVyd2lzZQpmdW5jIChvcCAqRXhhY3RPdXRTd2FwT3BlcmF0aW9uKSBWYWxpZGF0ZSgpIGVycm9yIHsKCWFtb3VudE91dCA6PSBvcC5wYXJhbXMuQW1vdW50T3V0CglpZiBhbW91bnRPdXQgPD0gMCB7CgkJcmV0dXJuIHVmbXQuRXJyb3JmKCJpbnZhbGlkIGFtb3VudE91dCglZCksIG11c3QgYmUgcG9zaXRpdmUiLCBhbW91bnRPdXQpCgl9CgoJLy8gYXNzaWduIGEgc2lnbmVkIHJldmVyc2VkIGBhbW91bnRPdXRgIHRvIGBhbW91bnRTcGVjaWZpZWRgCgkvLyB3aGVuIGl0J3MgYW4gRXhhY3RPdXQKCW9wLmFtb3VudFNwZWNpZmllZCA9IC1hbW91bnRPdXQKCglyb3V0ZXMsIHF1b3RlcywgZXJyIDo9IHZhbGlkYXRlUm91dGVzQW5kUXVvdGVzKG9wLnBhcmFtcy5Sb3V0ZUFyciwgb3AucGFyYW1zLlF1b3RlQXJyKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoKCW9wLnJvdXRlcyA9IHJvdXRlcwoJb3AucXVvdGVzID0gcXVvdGVzCgoJcmV0dXJuIG5pbAp9CgovLyBQcm9jZXNzIGV4ZWN1dGVzIHRoZSB2YWxpZGF0ZWQgZXhhY3Qtb3V0cHV0IG9wZXJhdGlvbiBpbiB0aGUgcHJvcGFnYXRlZCByZWFsbS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGxlYWRpbmcgb3BlcmF0aW9uIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0IHVzZWQgZm9yIHBvb2wgc3dhcHMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJlc3VsdDogYWdncmVnYXRlIHN3YXAgYW1vdW50cyBhbmQgcm91dGUgbWV0YWRhdGEsIG9yIG5pbCBvbiBwcm9jZXNzaW5nIGVycm9yCi8vICAgLSBlcnI6IG5pbCBvbiBzdWNjZXNzOyBwb29sIG9yIHJvdXRlIGV4ZWN1dGlvbiBlcnJvciBvdGhlcndpc2UKZnVuYyAob3AgKkV4YWN0T3V0U3dhcE9wZXJhdGlvbikgUHJvY2VzcyhfIGludCwgcmxtIHJlYWxtKSAoKlN3YXBSZXN1bHQsIGVycm9yKSB7CglyZXN1bHRBbW91bnRJbiwgcmVzdWx0QW1vdW50T3V0LCBlcnIgOj0gb3AucHJvY2Vzc1JvdXRlcygwLCBybG0sIG9wLnJvdXRlciwgRXhhY3RPdXQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCglyZXR1cm4gJlN3YXBSZXN1bHR7CgkJQW1vdW50SW46ICAgICAgICByZXN1bHRBbW91bnRJbiwKCQlBbW91bnRPdXQ6ICAgICAgIHJlc3VsdEFtb3VudE91dCwKCQlSb3V0ZXM6ICAgICAgICAgIG9wLnJvdXRlcywKCQlRdW90ZXM6ICAgICAgICAgIG9wLnF1b3RlcywKCQlBbW91bnRTcGVjaWZpZWQ6IG9wLmFtb3VudFNwZWNpZmllZCwKCX0sIG5pbAp9ChpDCgtnbm9tb2QudG9tbBI0bW9kdWxlID0gImduby5sYW5kL3IvZ25vc3dhcC9yb3V0ZXIvdjIiCmdubyA9ICIwLjkiChqiBwoIaW5pdC5nbm8SlQdwYWNrYWdlIHJvdXRlcgoKaW1wb3J0ICgKCSJnbm8ubGFuZC9yL2dub3N3YXAvcm91dGVyIgopCgpjb25zdCAoCglkZWZhdWx0U3dhcEZlZUJQUyA9IHVpbnQ2NCgxNSkgLy8gMC4xNSUKKQoKZnVuYyBpbml0KGN1ciByZWFsbSkgewoJcmVnaXN0ZXJSb3V0ZXJWMShjdXIpCn0KCmZ1bmMgcmVnaXN0ZXJSb3V0ZXJWMShjdXIgcmVhbG0pIHsKCXJvdXRlci5SZWdpc3RlckluaXRpYWxpemVyKGNyb3NzKGN1ciksIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSwgcm91dGVyU3RvcmUgcm91dGVyLklSb3V0ZXJTdG9yZSkgcm91dGVyLklSb3V0ZXIgewoJCWVyciA6PSBpbml0U3RvcmVEYXRhKDAsIHJsbSwgcm91dGVyU3RvcmUpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXBhbmljKGVycikKCQl9CgoJCXJldHVybiBOZXdSb3V0ZXJWMShyb3V0ZXJTdG9yZSkKCX0pCn0KCmZ1bmMgaW5pdFN0b3JlRGF0YShfIGludCwgcmxtIHJlYWxtLCByb3V0ZXJTdG9yZSByb3V0ZXIuSVJvdXRlclN0b3JlKSBlcnJvciB7CglpZiAhcm91dGVyU3RvcmUuSGFzU3dhcEZlZUtleSgpIHsKCQllcnIgOj0gcm91dGVyU3RvcmUuU2V0U3dhcEZlZSgwLCBybG0sIGRlZmF1bHRTd2FwRmVlQlBTKQoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gZXJyCgkJfQoJfQoKCXBlbmRpbmdQcm90b2NvbEZlZXMgOj0gbWFrZShtYXBbc3RyaW5nXWludDY0KQoJaWYgcm91dGVyU3RvcmUuSGFzUGVuZGluZ1Byb3RvY29sRmVlc0tleSgpIHsKCQlwZW5kaW5nUHJvdG9jb2xGZWVzID0gcm91dGVyU3RvcmUuR2V0UGVuZGluZ1Byb3RvY29sRmVlcygpCgl9CglpZiBlcnIgOj0gcm91dGVyU3RvcmUuU2V0UGVuZGluZ1Byb3RvY29sRmVlcygwLCBybG0sIHBlbmRpbmdQcm90b2NvbEZlZXMpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJcmV0dXJuIG5pbAp9ChqZBAoMaW5zdGFuY2UuZ25vEogEcGFja2FnZSByb3V0ZXIKCmltcG9ydCAoCgkiZ25vLmxhbmQvci9nbm9zd2FwL3JvdXRlciIKKQoKdHlwZSByb3V0ZXJWMSBzdHJ1Y3QgewoJc3RvcmUgcm91dGVyLklSb3V0ZXJTdG9yZQp9CgovLyBOZXdSb3V0ZXJWMSBjcmVhdGVzIGEgcm91dGVyIHYxIGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSByb3V0ZXJTdG9yZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHJvdXRlclN0b3JlOiBzdG9yYWdlIGltcGxlbWVudGF0aW9uIHVzZWQgZm9yIHN3YXAtZmVlIGFuZCBwZW5kaW5nIHByb3RvY29sLWZlZSBzdGF0ZQovLwovLyBSZXR1cm5zOgovLyAgIC0gcm91dGVyOiBpbml0aWFsaXplZCBJUm91dGVyIGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSByb3V0ZXJTdG9yZQpmdW5jIE5ld1JvdXRlclYxKAoJcm91dGVyU3RvcmUgcm91dGVyLklSb3V0ZXJTdG9yZSwKKSByb3V0ZXIuSVJvdXRlciB7CglpbnN0YW5jZSA6PSAmcm91dGVyVjF7CgkJc3RvcmU6IHJvdXRlclN0b3JlLAoJfQoKCXJldHVybiBpbnN0YW5jZQp9ChqSLQoVcHJvdG9jb2xfZmVlX3N3YXAuZ25vEvgscGFja2FnZSByb3V0ZXIKCmltcG9ydCAoCgkiY2hhaW4iCgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoKCWduc21hdGggImduby5sYW5kL3AvZ25vc3dhcC9nbnNtYXRoL3YxIgoJcHJiYWMgImduby5sYW5kL3AvZ25vc3dhcC9yYmFjL3YxIgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3V0aWxzL3YxIgoKCSJnbm8ubGFuZC9yL2dub3N3YXAvYWNjZXNzL3YxIgoJImduby5sYW5kL3IvZ25vc3dhcC9jb21tb24iCgkiZ25vLmxhbmQvci9nbm9zd2FwL2hhbHQvdjEiCgoJcGYgImduby5sYW5kL3IvZ25vc3dhcC9wcm90b2NvbF9mZWUiCglfICJnbm8ubGFuZC9yL2dub3N3YXAvcHJvdG9jb2xfZmVlL3YxIgopCgovLyBHZXRTd2FwRmVlIHJldHVybnMgdGhlIGN1cnJlbnQgcm91dGVyIGZlZSByYXRlIGluIGJhc2lzIHBvaW50cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGZlZTogY29uZmlndXJlZCByb3V0ZXIgZmVlIGluIGJhc2lzIHBvaW50cwpmdW5jIChyICpyb3V0ZXJWMSkgR2V0U3dhcEZlZSgpIHVpbnQ2NCB7CglyZXR1cm4gci5zdG9yZS5HZXRTd2FwRmVlKCkKfQoKLy8gU2V0U3dhcEZlZSBzZXRzIHRoZSBwcm90b2NvbCBzd2FwIGZlZSByYXRlLgovLwovLyBGZWUgaXMgZGVkdWN0ZWQgZnJvbSBzd2FwIG91dHB1dCBhbmQgc2VudCB0byBwcm90b2NvbCBmZWUgY29udHJhY3QuCi8vIE9ubHkgY2FsbGFibGUgYnkgYWRtaW4gb3IgZ292ZXJuYW5jZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGxlYWRpbmcgY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGZvciB0aGUgYXV0aG9yaXplZCBzdG9yYWdlIHdyaXRlCi8vICAgLSBmZWU6IG5ldyBwcm90b2NvbCBmZWUgcmF0ZSBpbiBiYXNpcyBwb2ludHMsIGJvdW5kZWQgdG8gMCB0aHJvdWdoIDEwMDAKLy8KLy8gQWNjZXNzOgovLyAgIC0gUmVxdWlyZXM6IEFkbWluIG9yIEdvdmVybmFuY2Ugcm9sZQovLyAgIC0gSGFsdCBjaGVjazogUm91dGVyIGFuZCBQcm90b2NvbEZlZSBtdXN0IG5vdCBiZSBoYWx0ZWQKLy8KLy8gRXZlbnRzOgovLyAgIC0gU2V0U3dhcEZlZTogRW1pdHMgcHJldmlvdXMgYW5kIG5ldyBmZWUgdmFsdWVzCi8vCi8vIFJldmVydHMgaWY6Ci8vICAgLSBDYWxsZXIgaXMgbm90IGFkbWluL2dvdmVybmFuY2UKLy8gICAtIEZlZSA+IDEwMDAgYnBzICgxMCUpCi8vICAgLSBSb3V0ZXIgb3IgUHJvdG9jb2xGZWUgaXMgaGFsdGVkCmZ1bmMgKHIgKnJvdXRlclYxKSBTZXRTd2FwRmVlKF8gaW50LCBybG0gcmVhbG0sIGZlZSB1aW50NjQpIHsKCWFjY2Vzcy5Bc3NlcnRJc1JsbUN1cnJlbnQoMCwgcmxtKQoKCWhhbHQuQXNzZXJ0SXNOb3RIYWx0ZWRSb3V0ZXIoKQoJaGFsdC5Bc3NlcnRJc05vdEhhbHRlZFByb3RvY29sRmVlKCkKCglwcmV2aW91c1JlYWxtIDo9IHJsbS5QcmV2aW91cygpCgljYWxsZXIgOj0gcHJldmlvdXNSZWFsbS5BZGRyZXNzKCkKCWFjY2Vzcy5Bc3NlcnRJc0FkbWluT3JHb3Zlcm5hbmNlKGNhbGxlcikKCgkvLyBtYXggc3dhcCBmZWUgaXMgMTAwMCAoYnBzKQoJaWYgZmVlID4gMTAwMCB7CgkJcGFuaWModWZtdC5FcnJvcmYoCgkJCSIlczogZmVlIG11c3QgYmUgaW4gcmFuZ2UgMCB0byAxMDAwICgxMCUpLiBnb3QgJWQiLAoJCQllcnJJbnZhbGlkU3dhcEZlZSwgZmVlLAoJCSkpCgl9CgoJcHJldlN3YXBGZWUgOj0gci5zdG9yZS5HZXRTd2FwRmVlKCkKCWlmIGVyciA6PSByLnN0b3JlLlNldFN3YXBGZWUoMCwgcmxtLCBmZWUpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJY2hhaW4uRW1pdCgKCQkiU2V0U3dhcEZlZSIsCgkJInByZXZBZGRyIiwgcHJldmlvdXNSZWFsbS5BZGRyZXNzKCkuU3RyaW5nKCksCgkJInByZXZSZWFsbSIsIHByZXZpb3VzUmVhbG0uUGtnUGF0aCgpLAoJCSJuZXdGZWUiLCB1dGlscy5Gb3JtYXRVaW50KGZlZSksCgkJInByZXZGZWUiLCB1dGlscy5Gb3JtYXRVaW50KHByZXZTd2FwRmVlKSwKCSkKfQoKLy8gaGFuZGxlU3dhcEZlZSBkZWR1Y3RzIHRoZSBwcm90b2NvbCBmZWUgZnJvbSB0aGUgc3dhcCBhbW91bnQgYW5kIHRyYW5zZmVycyBpdCB0byB0aGUgcHJvdG9jb2wgZmVlIGNvbnRyYWN0LgpmdW5jIChyICpyb3V0ZXJWMSkgaGFuZGxlU3dhcEZlZSgKCV8gaW50LAoJcmxtIHJlYWxtLAoJb3V0cHV0VG9rZW4gc3RyaW5nLAoJYW1vdW50IGludDY0LAopIGludDY0IHsKCWN1cnJlbnRUb2tlblBhdGggOj0gb3V0cHV0VG9rZW4KCglzd2FwRmVlIDo9IHIuc3RvcmUuR2V0U3dhcEZlZSgpCglpZiBzd2FwRmVlIDw9IDAgewoJCXIuc2V0dGxlUHJvdG9jb2xGZWUoMCwgcmxtLCBjdXJyZW50VG9rZW5QYXRoLCAwKQoJCXJldHVybiBhbW91bnQKCX0KCglmZWVBbW91bnRJbnQ2NCA6PSBjYWxjdWxhdGVSb3V0ZXJGZWUoYW1vdW50LCBzd2FwRmVlKQoJci5zZXR0bGVQcm90b2NvbEZlZSgwLCBybG0sIGN1cnJlbnRUb2tlblBhdGgsIGZlZUFtb3VudEludDY0KQoKCXByZXZpb3VzUmVhbG0gOj0gcmxtLlByZXZpb3VzKCkKCWNoYWluLkVtaXQoCgkJIlN3YXBSb3V0ZUZlZSIsCgkJInByZXZBZGRyIiwgcHJldmlvdXNSZWFsbS5BZGRyZXNzKCkuU3RyaW5nKCksCgkJInByZXZSZWFsbSIsIHByZXZpb3VzUmVhbG0uUGtnUGF0aCgpLAoJCSJ0b2tlblBhdGgiLCBjdXJyZW50VG9rZW5QYXRoLAoJCSJhbW91bnQiLCB1dGlscy5Gb3JtYXRJbnQoZmVlQW1vdW50SW50NjQpLAoJKQoKCXJldHVybiBnbnNtYXRoLlNhZmVTdWJJbnQ2NChhbW91bnQsIGZlZUFtb3VudEludDY0KQp9CgovLyBHZXRQZW5kaW5nUHJvdG9jb2xGZWVzIHJldHVybnMgcGVuZGluZyBwcm90b2NvbCBmZWUgYW1vdW50cyBrZXllZCBieSB0b2tlbiBwYXRoLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZmVlczogdG9rZW4tcGF0aCB0byBwZW5kaW5nIGFtb3VudCBtYXAgaGVsZCBieSB0aGUgcm91dGVyCmZ1bmMgKHIgKnJvdXRlclYxKSBHZXRQZW5kaW5nUHJvdG9jb2xGZWVzKCkgbWFwW3N0cmluZ11pbnQ2NCB7CglyZXR1cm4gci5zdG9yZS5HZXRQZW5kaW5nUHJvdG9jb2xGZWVzKCkKfQoKZnVuYyAociAqcm91dGVyVjEpIGFkZFBlbmRpbmdQcm90b2NvbEZlZShfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nLCBhbW91bnQgaW50NjQpIHsKCWlmIGFtb3VudCA8PSAwIHsKCQlyZXR1cm4KCX0KCglwZW5kaW5nQW1vdW50IDo9IGduc21hdGguU2FmZUFkZEludDY0KHIuc3RvcmUuR2V0UGVuZGluZ1Byb3RvY29sRmVlKHRva2VuUGF0aCksIGFtb3VudCkKCWlmIGVyciA6PSByLnN0b3JlLlNldFBlbmRpbmdQcm90b2NvbEZlZSgwLCBybG0sIHRva2VuUGF0aCwgcGVuZGluZ0Ftb3VudCk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KfQoKLy8gc2V0dGxlUHJvdG9jb2xGZWUgZm9yd2FyZHMgYW1vdW50LCBwbHVzIGFueXRoaW5nIGFscmVhZHkgcGVuZGluZyBmb3IgdG9rZW5QYXRoLCB0bwovLyB0aGUgcHJvdG9jb2wgZmVlIHJlYWxtLiBXaGVuIGNvbGxlY3Rpb24gaXMgaGFsdGVkIG9yIHRoZSB0cmFuc2ZlciBmYWlscywgdGhlIGFtb3VudAovLyBpcyByZWNvcmRlZCBhcyBwZW5kaW5nIGluc3RlYWQgYW5kIHNldHRsZWQgYnkgYSBsYXRlciBjYWxsIGZvciB0aGUgc2FtZSB0b2tlbiwgd2hpY2gKLy8gZXZlcnkgZmVlIHBhdGggbWFrZXMgZXZlbiB3aGVuIHRoZSBmZWUgaXMgemVyby4KLy8KLy8gT25seSB0b2tlblBhdGggaXMgdG91Y2hlZCwgc28gYW4gdW5yZWxhdGVkIHRva2VuIGNhbiBuZXZlciBibG9jayBzZXR0bGVtZW50LiBUaGUKLy8gcGVuZGluZyBlbnRyeSBpcyB3cml0dGVuIG9ubHkgd2hlbiB0aGUgZmVlIGNhbm5vdCBiZSBmb3J3YXJkZWQsIHNvIHRoZSBjb21tb24gcGF0aAovLyBwZXJmb3JtcyBubyBzdG9yZSB3cml0ZSBhdCBhbGwuCmZ1bmMgKHIgKnJvdXRlclYxKSBzZXR0bGVQcm90b2NvbEZlZShfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nLCBhbW91bnQgaW50NjQpIHsKCWlmIGhhbHQuSXNIYWx0ZWRQcm90b2NvbEZlZSgpIHsKCQlyLmFkZFBlbmRpbmdQcm90b2NvbEZlZSgwLCBybG0sIHRva2VuUGF0aCwgYW1vdW50KQoJCXJldHVybgoJfQoKCXBlbmRpbmdBbW91bnQgOj0gci5zdG9yZS5HZXRQZW5kaW5nUHJvdG9jb2xGZWUodG9rZW5QYXRoKQoJdG90YWxBbW91bnQgOj0gZ25zbWF0aC5TYWZlQWRkSW50NjQocGVuZGluZ0Ftb3VudCwgYW1vdW50KQoKCWlmIHRvdGFsQW1vdW50ID4gMCB7CgkJcHJvdG9jb2xGZWVBZGRyIDo9IGFjY2Vzcy5NdXN0R2V0QWRkcmVzcyhwcmJhYy5ST0xFX1BST1RPQ09MX0ZFRS5TdHJpbmcoKSkKCQljb21tb24uU2FmZUdSQzIwQXBwcm92ZSgwLCBybG0sIHRva2VuUGF0aCwgcHJvdG9jb2xGZWVBZGRyLCB0b3RhbEFtb3VudCkKCgkJLy8gQWRkVG9Qcm90b2NvbEZlZSBvbmx5IHJlcG9ydHMgYW4gZXJyb3IgZm9yIGEgaGFsdGVkIHJlYWxtLCB3aGljaCBpcyBoYW5kbGVkCgkJLy8gYWJvdmUuIFRoZSBicmFuY2gga2VlcHMgdGhlIGFtb3VudCBwZW5kaW5nIHNob3VsZCB0aGF0IGV2ZXIgY2hhbmdlLCBhbmQKCQkvLyB3aXRoZHJhd3MgdGhlIGFwcHJvdmFsIHNvIG5vIHVuc3BlbnQgYWxsb3dhbmNlIG91dGxpdmVzIHRoZSBjYWxsLgoJCWlmIGVyciA6PSBwZi5BZGRUb1Byb3RvY29sRmVlKGNyb3NzKHJsbSksIHRva2VuUGF0aCwgdG90YWxBbW91bnQpOyBlcnIgIT0gbmlsIHsKCQkJY29tbW9uLlNhZmVHUkMyMEFwcHJvdmUoMCwgcmxtLCB0b2tlblBhdGgsIHByb3RvY29sRmVlQWRkciwgMCkKCQkJci5hZGRQZW5kaW5nUHJvdG9jb2xGZWUoMCwgcmxtLCB0b2tlblBhdGgsIGFtb3VudCkKCQkJcmV0dXJuCgkJfQoJfQoKCWlmIGVyciA6PSByLnN0b3JlLlJlbW92ZVBlbmRpbmdQcm90b2NvbEZlZSgwLCBybG0sIHRva2VuUGF0aCk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KfQoKZnVuYyBjYWxjdWxhdGVSb3V0ZXJGZWUoYW1vdW50IGludDY0LCBzd2FwRmVlIHVpbnQ2NCkgaW50NjQgewoJaWYgc3dhcEZlZSA8PSAwIHsKCQlyZXR1cm4gMAoJfQoKCWZlZUFtb3VudCA6PSB1MjU2Lk11bERpdih1MjU2Lk5ld1VpbnRGcm9tSW50NjQoYW1vdW50KSwgdTI1Ni5OZXdVaW50KHN3YXBGZWUpLCB1MjU2Lk5ld1VpbnQoMTAwMDApKQoJcmV0dXJuIGduc21hdGguU2FmZUNvbnZlcnRUb0ludDY0KGZlZUFtb3VudCkKfQoKLy8gY2FsY3VsYXRlIGFtb3VudCB0byBmZXRjaCBmcm9tIHBvb2wgaW5jbHVkaW5nIHJvdXRlciBmZWUKLy8gcG9vbEFtb3VudCA9IHVzZXJBbW91bnQgLyAoMSAtIGZlZVJhdGUpCi8vID0gdXNlckFtb3VudCAqIDEwMDAwIC8gKDEwMDAwIC0gc3dhcEZlZUJQUykKZnVuYyBjYWxjdWxhdGVFeGFjdE91dFdpdGhSb3V0ZXJGZWUoYW1vdW50IGludDY0LCBzd2FwRmVlIHVpbnQ2NCkgaW50NjQgewoJaWYgYW1vdW50ID09IDAgewoJCXJldHVybiBhbW91bnQKCX0KCglpZiBzd2FwRmVlID4gMCB7CgkJLy8gVXNlIE11bERpdiB0byBwcmV2ZW50IG92ZXJmbG93IGFuZCBtYWludGFpbiBwcmVjaXNpb24KCQlwb29sQW1vdW50IDo9IHUyNTYuTXVsRGl2KAoJCQl1MjU2Lk5ld1VpbnRGcm9tSW50NjQoYW1vdW50KSwKCQkJdTI1Ni5OZXdVaW50KDEwMDAwKSwKCQkJdTI1Ni5OZXdVaW50KDEwMDAwLXN3YXBGZWUpLAoJCSkKCgkJcmV0dXJuIGduc21hdGguU2FmZUNvbnZlcnRUb0ludDY0KHBvb2xBbW91bnQpCgl9CgoJcmV0dXJuIGFtb3VudAp9ChqNMwoKcmVuZGVyLmdubxL+MnBhY2thZ2Ugcm91dGVyCgppbXBvcnQgKAoJImNoYWluIgoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvbW91bC9tZC92MCIKCSJnbm8ubGFuZC9wL21vdWwvbWR0YWJsZS92MCIKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKCgkiZ25vLmxhbmQvci9nbm9zd2FwL2hhbHQvdjEiCgkiZ25vLmxhbmQvci9nbm9zd2FwL3JvdXRlciIKKQoKY29uc3QgbWF4U3dhcEZlZUJQUyB1aW50NjQgPSAxMDAwCgpmdW5jIChyICpyb3V0ZXJWMSkgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJdmFyIGFjdGlvbiBzdHJpbmcKCXN3aXRjaCBwYXRoIHsKCWNhc2UgIiI6CgkJYWN0aW9uID0gbWQuSDMoIkV4YWN0LWlucHV0IHNpbmdsZS1yb3V0ZSBzd2FwIikgKyAiXG4iICsKCQkJIjxnbm8tZm9ybSBleGVjPVwiRXhhY3RJblNpbmdsZVN3YXBSb3V0ZVwiPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cImlucHV0VG9rZW5cIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiQXBwcm92ZWQgaW5wdXQ6IGduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90XCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJvdXRwdXRUb2tlblwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJPdXRwdXQ6IGduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJhbW91bnRJblwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFeGFjdCBpbnB1dCBhbW91bnQgKGJhc2UgdW5pdHMpXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJyb3V0ZUFyclwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJSb3V0ZTogaW5wdXRUb2tlbjpvdXRwdXRUb2tlbjo1MDBcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cImFtb3VudE91dE1pblwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJNaW5pbXVtIG91dHB1dCBhbW91bnQgKGJhc2UgdW5pdHMpXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJzcXJ0UHJpY2VMaW1pdFg5NlwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJRNjQuOTYgc3FydC1wcmljZSBsaW1pdCAoMCA9IG5vIGxpbWl0KVwiIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4iICsKCQkJIiAgPGduby1pbnB1dCBuYW1lPVwiZGVhZGxpbmVcIiB0eXBlPVwibnVtYmVyXCIgcGxhY2Vob2xkZXI9XCJGdXR1cmUgVW5peCB0aW1lc3RhbXAgKHNlY29uZHMpXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJyZWZlcnJlclwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJPcHRpb25hbCByZWZlcnJlciBhZGRyZXNzXCIgLz5cbiIgKwoJCQkiPC9nbm8tZm9ybT5cbiIKCWNhc2UgInN3YXAvZXhhY3QtaW4iOgoJCWFjdGlvbiA9IG1kLkgzKCJFeGFjdC1pbnB1dCBtdWx0aS1yb3V0ZSBzd2FwIikgKyAiXG4iICsKCQkJIjxnbm8tZm9ybSBleGVjPVwiRXhhY3RJblN3YXBSb3V0ZVwiPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cImlucHV0VG9rZW5cIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiQXBwcm92ZWQgaW5wdXQ6IGduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90XCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJvdXRwdXRUb2tlblwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJPdXRwdXQ6IGduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJhbW91bnRJblwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFeGFjdCBpbnB1dCBhbW91bnQgKGJhc2UgdW5pdHMpXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJyb3V0ZUFyclwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJSb3V0ZXM6IEE6Qzo1MDAsQTpCOjUwMCpQT09MKkI6QzozMDAwIChBL0IvQyA9IHRva2VuIGtleXMpXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJxdW90ZUFyclwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJSb3V0ZSBwZXJjZW50YWdlczogMTAwIG9yIDcwLDMwICh0b3RhbCAxMDApXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJhbW91bnRPdXRNaW5cIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiTWluaW11bSBvdXRwdXQgYW1vdW50IChiYXNlIHVuaXRzKVwiIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4iICsKCQkJIiAgPGduby1pbnB1dCBuYW1lPVwiZGVhZGxpbmVcIiB0eXBlPVwibnVtYmVyXCIgcGxhY2Vob2xkZXI9XCJGdXR1cmUgVW5peCB0aW1lc3RhbXAgKHNlY29uZHMpXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJyZWZlcnJlclwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJPcHRpb25hbCByZWZlcnJlciBhZGRyZXNzXCIgLz5cbiIgKwoJCQkiPC9nbm8tZm9ybT5cbiIKCWNhc2UgInN3YXAvZXhhY3Qtb3V0IjoKCQlhY3Rpb24gPSBtZC5IMygiRXhhY3Qtb3V0cHV0IG11bHRpLXJvdXRlIHN3YXAiKSArICJcbiIgKwoJCQkiPGduby1mb3JtIGV4ZWM9XCJFeGFjdE91dFN3YXBSb3V0ZVwiPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cImlucHV0VG9rZW5cIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiQXBwcm92ZWQgaW5wdXQ6IGduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90XCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJvdXRwdXRUb2tlblwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJPdXRwdXQ6IGduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJhbW91bnRPdXRcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiRXhhY3Qgb3V0cHV0IGFtb3VudCAoYmFzZSB1bml0cylcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cInJvdXRlQXJyXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlJvdXRlczogQTpDOjUwMCxBOkI6NTAwKlBPT0wqQjpDOjMwMDAgKEEvQi9DID0gdG9rZW4ga2V5cylcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cInF1b3RlQXJyXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlJvdXRlIHBlcmNlbnRhZ2VzOiAxMDAgb3IgNzAsMzAgKHRvdGFsIDEwMClcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cImFtb3VudEluTWF4XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk1heGltdW0gaW5wdXQgYW1vdW50IChiYXNlIHVuaXRzKVwiIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4iICsKCQkJIiAgPGduby1pbnB1dCBuYW1lPVwiZGVhZGxpbmVcIiB0eXBlPVwibnVtYmVyXCIgcGxhY2Vob2xkZXI9XCJGdXR1cmUgVW5peCB0aW1lc3RhbXAgKHNlY29uZHMpXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJyZWZlcnJlclwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJPcHRpb25hbCByZWZlcnJlciBhZGRyZXNzXCIgLz5cbiIgKwoJCQkiPC9nbm8tZm9ybT5cbiIKCWNhc2UgInN3YXAvZXhhY3Qtb3V0LXNpbmdsZSI6CgkJYWN0aW9uID0gbWQuSDMoIkV4YWN0LW91dHB1dCBzaW5nbGUtcm91dGUgc3dhcCIpICsgIlxuIiArCgkJCSI8Z25vLWZvcm0gZXhlYz1cIkV4YWN0T3V0U2luZ2xlU3dhcFJvdXRlXCI+XG4iICsKCQkJIiAgPGduby1pbnB1dCBuYW1lPVwiaW5wdXRUb2tlblwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJBcHByb3ZlZCBpbnB1dDogZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3RcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cIm91dHB1dFRva2VuXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk91dHB1dDogZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlNcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cImFtb3VudE91dFwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFeGFjdCBvdXRwdXQgYW1vdW50IChiYXNlIHVuaXRzKVwiIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4iICsKCQkJIiAgPGduby1pbnB1dCBuYW1lPVwicm91dGVBcnJcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiUm91dGU6IGlucHV0VG9rZW46b3V0cHV0VG9rZW46NTAwXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJhbW91bnRJbk1heFwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJNYXhpbXVtIGlucHV0IGFtb3VudCAoYmFzZSB1bml0cylcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cInNxcnRQcmljZUxpbWl0WDk2XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlE2NC45NiBzcXJ0LXByaWNlIGxpbWl0ICgwID0gbm8gbGltaXQpXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJkZWFkbGluZVwiIHR5cGU9XCJudW1iZXJcIiBwbGFjZWhvbGRlcj1cIkZ1dHVyZSBVbml4IHRpbWVzdGFtcCAoc2Vjb25kcylcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cInJlZmVycmVyXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk9wdGlvbmFsIHJlZmVycmVyIGFkZHJlc3NcIiAvPlxuIiArCgkJCSI8L2duby1mb3JtPlxuIgoJZGVmYXVsdDoKCQlyZXR1cm4gIjQwNFxuIgoJfQoKCXN3YXBGZWUgOj0gci5HZXRTd2FwRmVlKCkKCWltcGxlbWVudGF0aW9uIDo9IHJvdXRlci5HZXRJbXBsZW1lbnRhdGlvblBhY2thZ2VQYXRoKCkKCXN0YXR1c1RhYmxlIDo9IG1kdGFibGUuVGFibGV7CgkJSGVhZGVyczogW11zdHJpbmd7IkZpZWxkIiwgIlZhbHVlIn0sCgkJUm93czogW11bXXN0cmluZ3sKCQkJeyJSb3V0ZXIgcGFja2FnZSIsIG1kLkxpbmsoImduby5sYW5kL3IvZ25vc3dhcC9yb3V0ZXIiLCAiL3IvZ25vc3dhcC9yb3V0ZXIiKX0sCgkJCXsiUmVhbG0gYWRkcmVzcyIsIG1kLklubGluZUNvZGUoY2hhaW4uUGFja2FnZUFkZHJlc3MoImduby5sYW5kL3IvZ25vc3dhcC9yb3V0ZXIiKS5TdHJpbmcoKSl9LAoJCQl7IkFjdGl2ZSBpbXBsZW1lbnRhdGlvbiIsIG1kLkxpbmsoaW1wbGVtZW50YXRpb24sIHN0cmluZ3MuVHJpbVByZWZpeChpbXBsZW1lbnRhdGlvbiwgImduby5sYW5kIikpfSwKCQkJeyJSb3V0ZXIgaGFsdGVkIiwgdWZtdC5TcHJpbnRmKCIldCIsIGhhbHQuSXNIYWx0ZWRSb3V0ZXIoKSl9LAoJCX0sCgl9CglmZWVUYWJsZSA6PSBtZHRhYmxlLlRhYmxlewoJCUhlYWRlcnM6IFtdc3RyaW5neyJGaWVsZCIsICJWYWx1ZSJ9LAoJCVJvd3M6IFtdW11zdHJpbmd7CgkJCXsiU3dhcCBmZWUiLCB1Zm10LlNwcmludGYoIiVkIGJwcyIsIHN3YXBGZWUpfSwKCQkJeyJNYXhpbXVtIHN3YXAgZmVlIiwgdWZtdC5TcHJpbnRmKCIlZCBicHMgKDEwJSUpIiwgbWF4U3dhcEZlZUJQUyl9LAoJCQl7IkZlZSB1bml0IiwgIjEgYnBzID0gMC4wMSUgb2YgdGhlIG91dHB1dC10b2tlbiBhbW91bnQifSwKCQkJeyJBbW91bnQgdW5pdCIsICJJbnRlZ2VyIHRva2VuIGJhc2UgdW5pdHM7IGRlY2ltYWxzIGFyZSB0b2tlbi1zcGVjaWZpYyJ9LAoJCX0sCgl9CgoJb3V0IDo9IG1kLkgxKCJHbm9zd2FwIFJvdXRlciIpICsgIlxuIgoJb3V0ICs9IG1kLkgyKCJSb3V0ZXIgc3RhdHVzIikgKyAiXG4iCglvdXQgKz0gc3RhdHVzVGFibGUuU3RyaW5nKCkgKyAiXG4iCglvdXQgKz0gbWQuSDIoIlN3YXAgZmVlIGNvbmZpZ3VyYXRpb24iKSArICJcbiIKCW91dCArPSBmZWVUYWJsZS5TdHJpbmcoKSArICJcbiIKCW91dCArPSBtZC5IMigiU3dhcCIpICsgIlxuIgoJb3V0ICs9IG1kLlBhcmFncmFwaCgKCQltZC5MaW5rKCJFeGFjdCBpbnB1dDogc2luZ2xlIHJvdXRlIiwgIi9yL2dub3N3YXAvcm91dGVyIikgKyAiIMK3ICIgKwoJCQltZC5MaW5rKCJFeGFjdCBpbnB1dDogbXVsdGlwbGUgcm91dGVzIiwgIi9yL2dub3N3YXAvcm91dGVyOnN3YXAvZXhhY3QtaW4iKSArICIgwrcgIiArCgkJCW1kLkxpbmsoIkV4YWN0IG91dHB1dDogc2luZ2xlIHJvdXRlIiwgIi9yL2dub3N3YXAvcm91dGVyOnN3YXAvZXhhY3Qtb3V0LXNpbmdsZSIpICsgIiDCtyAiICsKCQkJbWQuTGluaygiRXhhY3Qgb3V0cHV0OiBtdWx0aXBsZSByb3V0ZXMiLCAiL3IvZ25vc3dhcC9yb3V0ZXI6c3dhcC9leGFjdC1vdXQiKSwKCSkKCW91dCArPSBhY3Rpb24KCXJldHVybiBvdXQKfQoa4TsKCnJvdXRlci5nbm8S0jtwYWNrYWdlIHJvdXRlcgoKaW1wb3J0ICgKCSJlcnJvcnMiCgkic3RyY29udiIKCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCi8vIEVycm9yTWVzc2FnZXMgZGVmaW5lIGFsbCBlcnJvciBtZXNzYWdlIHRlbXBsYXRlcyB1c2VkIHRocm91Z2hvdXQgdGhlIHJvdXRlcgpjb25zdCAoCgkvLyBzbGlwcGFnZSB2YWxpZGF0aW9uCgllcnJFeGFjdEluQW1vdW50TWlzbWF0Y2ggID0gImNvbnN1bWVkIGlucHV0IGRvZXMgbm90IG1hdGNoIHJlcXVlc3RlZCAocmVxdWVzdGVkPSVkLCBjb25zdW1lZD0lZCkiCgllcnJFeGFjdE91dEFtb3VudEV4Y2VlZGVkID0gInJlY2VpdmVkIG1vcmUgdGhhbiByZXF1ZXN0ZWQgaW4gcmVxdWVzdGVkPSVkLCBhY3R1YWw9JWQiCgoJLy8gcm91dGUgdmFsaWRhdGlvbgoJZXJySW52YWxpZFJvdXRlTGVuZ3RoID0gInJvdXRlIGxlbmd0aCglZCkgbXVzdCBiZSAxfjciCgoJLy8gcXVvdGUgdmFsaWRhdGlvbgoJZXJyUm91dGVzUXVvdGVzTWlzbWF0Y2ggPSAibWlzbWF0Y2ggYmV0d2VlbiByb3V0ZXMoJWQpIGFuZCBxdW90ZXMoJWQpIGxlbmd0aCIKCWVyckludmFsaWRRdW90ZSAgICAgICAgID0gImludmFsaWQgcXVvdGUoJXMpIGF0IGluZGV4KCVkKSIKCWVyckludmFsaWRRdW90ZVZhbHVlICAgID0gInF1b3RlKCVzKSBhdCBpbmRleCglZCkgbXVzdCBiZSBwb3NpdGl2ZSB2YWx1ZSIKCWVyclF1b3RlRXhjZWVkc01heCAgICAgID0gInF1b3RlKCVzKSBhdCBpbmRleCglZCkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJWQiCgllcnJRdW90ZVN1bUV4Y2VlZHNNYXggICA9ICJxdW90ZSBzdW0gZXhjZWVkcyAxMDAgYXQgaW5kZXgoJWQpIgoJZXJySW52YWxpZFF1b3RlU3VtICAgICAgPSAicXVvdGUgc3VtKCVkKSBtdXN0IGJlIDEwMCIKCgkvLyBzd2FwIHR5cGUgdmFsaWRhdGlvbgoJZXJyRXhhY3RJblRvb0Zld1JlY2VpdmVkID0gIkV4YWN0SW46IHRvbyBmZXcgcmVjZWl2ZWQgKG1pbjolZCwgZ290OiVkKSIKCWVyckV4YWN0T3V0VG9vTXVjaFNwZW50ICA9ICJFeGFjdE91dDogdG9vIG11Y2ggc3BlbnQgKG1heDolZCwgdXNlZDolZCkiCgoJLy8gcm91dGUgcGFyc2luZyB2YWxpZGF0aW9uCgllcnJFbXB0eVJvdXRlcyA9ICJyb3V0ZXMgY2Fubm90IGJlIGVtcHR5IgopCgovLyBTd2FwVmFsaWRhdG9yIHByb3ZpZGVzIHZhbGlkYXRpb24gbWV0aG9kcyBmb3Igc3dhcCBvcGVyYXRpb25zCnR5cGUgU3dhcFZhbGlkYXRvciBzdHJ1Y3R7fQoKLy8gZXhhY3RPdXRBbW91bnQgY2hlY2tzIGlmIG91dHB1dCBhbW91bnQgbWVldHMgc3BlY2lmaWVkIHJlcXVpcmVtZW50cy4KLy8gRm9yIGV4YWN0LW91dCBzd2FwcywgdGhlIG91dHB1dCBtdXN0IGJlIGV4YWN0bHkgdGhlIHNwZWNpZmllZCBhbW91bnQgd2l0aCB0b2xlcmFuY2UgdXAgdG8gc3dhcENvdW50IHVuaXRzIGZvciByb3VuZGluZy4KZnVuYyAodiAqU3dhcFZhbGlkYXRvcikgZXhhY3RPdXRBbW91bnQocmVzdWx0QW1vdW50LCBzcGVjaWZpZWRBbW91bnQgaW50NjQsIHN3YXBDb3VudCBpbnQ2NCkgZXJyb3IgewoJZGlmZiA6PSBpbnQ2NCgwKQoKCWlmIHJlc3VsdEFtb3VudCA+PSBzcGVjaWZpZWRBbW91bnQgewoJCWRpZmYgPSByZXN1bHRBbW91bnQgLSBzcGVjaWZpZWRBbW91bnQKCX0gZWxzZSB7CgkJZGlmZiA9IHNwZWNpZmllZEFtb3VudCAtIHJlc3VsdEFtb3VudAoJfQoKCWlmIGRpZmYgPiBzd2FwQ291bnQgewoJCXJldHVybiB1Zm10LkVycm9yZihlcnJFeGFjdE91dEFtb3VudEV4Y2VlZGVkLCBzcGVjaWZpZWRBbW91bnQsIHJlc3VsdEFtb3VudCkKCX0KCglyZXR1cm4gbmlsCn0KCi8vIGV4YWN0SW5BbW91bnQgY2hlY2tzIHRoYXQgdGhlIHN3YXAgY29uc3VtZWQgZXhhY3RseSB0aGUgcmVxdWVzdGVkIGlucHV0IGFtb3VudC4KZnVuYyAodiAqU3dhcFZhbGlkYXRvcikgZXhhY3RJbkFtb3VudChyZXN1bHRBbW91bnQsIHNwZWNpZmllZEFtb3VudCBpbnQ2NCkgZXJyb3IgewoJaWYgcmVzdWx0QW1vdW50ICE9IHNwZWNpZmllZEFtb3VudCB7CgkJcmV0dXJuIHVmbXQuRXJyb3JmKGVyckV4YWN0SW5BbW91bnRNaXNtYXRjaCwgc3BlY2lmaWVkQW1vdW50LCByZXN1bHRBbW91bnQpCgl9CgoJcmV0dXJuIG5pbAp9CgovLyBzbGlwcGFnZSBlbnN1cmVzIHN3YXAgYW1vdW50cyBtZWV0IHNsaXBwYWdlIHJlcXVpcmVtZW50cy4KZnVuYyAodiAqU3dhcFZhbGlkYXRvcikgc2xpcHBhZ2Uoc3dhcFR5cGUgU3dhcFR5cGUsIGFtb3VudEluLCBhbW91bnRPdXQsIGxpbWl0IGludDY0KSBlcnJvciB7Cglzd2l0Y2ggc3dhcFR5cGUgewoJY2FzZSBFeGFjdEluOgoJCWlmIGFtb3VudE91dCA8IGxpbWl0IHsKCQkJcmV0dXJuIHVmbXQuRXJyb3JmKGVyckV4YWN0SW5Ub29GZXdSZWNlaXZlZCwgbGltaXQsIGFtb3VudE91dCkKCQl9CgljYXNlIEV4YWN0T3V0OgoJCWlmIGFtb3VudEluID4gbGltaXQgewoJCQlyZXR1cm4gdWZtdC5FcnJvcmYoZXJyRXhhY3RPdXRUb29NdWNoU3BlbnQsIGxpbWl0LCBhbW91bnRJbikKCQl9CglkZWZhdWx0OgoJCXJldHVybiBlcnJvcnMuTmV3KGVyckludmFsaWRTd2FwVHlwZSkKCX0KCXJldHVybiBuaWwKfQoKLy8gc3dhcFR5cGUgZW5zdXJlcyB0aGUgc3dhcCB0eXBlIHN0cmluZyBpcyB2YWxpZC4KZnVuYyAodiAqU3dhcFZhbGlkYXRvcikgc3dhcFR5cGUoc3dhcFR5cGVTdHIgc3RyaW5nKSAoU3dhcFR5cGUsIGVycm9yKSB7Cglzd2FwVHlwZSwgZXJyIDo9IHRyeVN3YXBUeXBlRnJvbVN0cihzd2FwVHlwZVN0cikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBVbmtub3duLCBlcnJvcnMuTmV3KGVyckludmFsaWRTd2FwVHlwZSkKCX0KCXJldHVybiBzd2FwVHlwZSwgbmlsCn0KCi8vIGFtb3VudCBlbnN1cmVzIHRoZSBhbW91bnQgaXMgcHJvcGVybHkgZm9ybWF0dGVkIGFuZCBwb3NpdGl2ZS4KZnVuYyAodiAqU3dhcFZhbGlkYXRvcikgYW1vdW50KGFtb3VudCBpbnQ2NCkgKGludDY0LCBlcnJvcikgewoJaWYgYW1vdW50IDw9IDAgewoJCXJldHVybiAwLCB1Zm10LkVycm9yZihFcnJJbnZhbGlkUG9zaXRpdmVBbW91bnQsIGFtb3VudCkKCX0KCXJldHVybiBhbW91bnQsIG5pbAp9CgovLyBSb3V0ZVBhcnNlciBoYW5kbGVzIHBhcnNpbmcgYW5kIHZhbGlkYXRpb24gb2Ygcm91dGVzIGFuZCBxdW90ZXMKdHlwZSBSb3V0ZVBhcnNlciBzdHJ1Y3R7fQoKLy8gTmV3Um91dGVQYXJzZXIgY3JlYXRlcyBhIHBhcnNlciBmb3IgY29tbWEtc2VwYXJhdGVkIHJvdXRlIGFuZCBxdW90ZSBzdHJpbmdzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcGFyc2VyOiBuZXcgUm91dGVQYXJzZXIgaW5zdGFuY2UKZnVuYyBOZXdSb3V0ZVBhcnNlcigpICpSb3V0ZVBhcnNlciB7CglyZXR1cm4gJlJvdXRlUGFyc2Vye30KfQoKLy8gUGFyc2VSb3V0ZXMgc3BsaXRzIHJvdXRlIGFuZCBxdW90ZSBzdHJpbmdzIGFuZCB2YWxpZGF0ZXMgdGhlaXIgcGFpcmluZy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHJvdXRlczogY29tbWEtc2VwYXJhdGVkIHJvdXRlIHBhdGhzCi8vICAgLSBxdW90ZXM6IGNvbW1hLXNlcGFyYXRlZCByb3V0ZSBhbGxvY2F0aW9uIHBlcmNlbnRhZ2VzCi8vCi8vIFJldHVybnM6Ci8vICAgLSByb3V0ZVBhdGhzOiBwYXJzZWQgcm91dGUgcGF0aCBzdHJpbmdzCi8vICAgLSBxdW90ZVZhbHVlczogcGFyc2VkIHF1b3RlIHN0cmluZ3MgY29ycmVzcG9uZGluZyBvbmUtdG8tb25lIHdpdGggcm91dGVQYXRocwovLyAgIC0gZXJyOiBuaWwgd2hlbiByb3V0ZXMsIGNvdW50cywgYW5kIHF1b3RlIHN1bSBhcmUgdmFsaWQ7IHZhbGlkYXRpb24gZXJyb3Igb3RoZXJ3aXNlCmZ1bmMgKHAgKlJvdXRlUGFyc2VyKSBQYXJzZVJvdXRlcyhyb3V0ZXMsIHF1b3RlcyBzdHJpbmcpIChbXXN0cmluZywgW11zdHJpbmcsIGVycm9yKSB7CgkvLyBDaGVjayBmb3IgZW1wdHkgcm91dGVzCglpZiByb3V0ZXMgPT0gIiIgfHwgcXVvdGVzID09ICIiIHsKCQlyZXR1cm4gbmlsLCBuaWwsIGVycm9ycy5OZXcoZXJyRW1wdHlSb3V0ZXMpCgl9CgoJcm91dGVzQXJyIDo9IHNwbGl0U2luZ2xlQ2hhcihyb3V0ZXMsICcsJykKCXF1b3Rlc0FyciA6PSBzcGxpdFNpbmdsZUNoYXIocXVvdGVzLCAnLCcpCgoJaWYgZXJyIDo9IHAuVmFsaWRhdGVSb3V0ZXNBbmRRdW90ZXMocm91dGVzQXJyLCBxdW90ZXNBcnIpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBuaWwsIGVycgoJfQoKCXJldHVybiByb3V0ZXNBcnIsIHF1b3Rlc0FyciwgbmlsCn0KCi8vIFZhbGlkYXRlUm91dGVzQW5kUXVvdGVzIGNoZWNrcyByb3V0ZSBjb3VudCwgcm91dGUvcXVvdGUgY2FyZGluYWxpdHksIGFuZCBxdW90ZSBzdW0uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSByb3V0ZXM6IHBhcnNlZCByb3V0ZSBwYXRoIHN0cmluZ3MKLy8gICAtIHF1b3RlczogcGFyc2VkIHF1b3RlIHBlcmNlbnRhZ2Ugc3RyaW5ncwovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBuaWwgd2hlbiBvbmUgdG8gc2V2ZW4gcm91dGVzIG1hdGNoIHF1b3RlIGNvdW50IGFuZCBxdW90ZXMgc3VtIHRvIDEwMDsgdmFsaWRhdGlvbiBlcnJvciBvdGhlcndpc2UKZnVuYyAocCAqUm91dGVQYXJzZXIpIFZhbGlkYXRlUm91dGVzQW5kUXVvdGVzKHJvdXRlcywgcXVvdGVzIFtdc3RyaW5nKSBlcnJvciB7CglyciA6PSBsZW4ocm91dGVzKQoJcXEgOj0gbGVuKHF1b3RlcykKCglpZiByciA8IDEgfHwgcnIgPiA3IHsKCQlyZXR1cm4gdWZtdC5FcnJvcmYoZXJySW52YWxpZFJvdXRlTGVuZ3RoLCBycikKCX0KCglpZiByciAhPSBxcSB7CgkJcmV0dXJuIHVmbXQuRXJyb3JmKGVyclJvdXRlc1F1b3Rlc01pc21hdGNoLCByciwgcXEpCgl9CgoJcmV0dXJuIHAuVmFsaWRhdGVRdW90ZVN1bShxdW90ZXMpCn0KCi8vIFZhbGlkYXRlUXVvdGVTdW0gdmVyaWZpZXMgdGhhdCBlYWNoIHF1b3RlIGlzIHBvc2l0aXZlLCBhdCBtb3N0IDEwMCwgYW5kIHRvdGFscyAxMDAuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBxdW90ZXM6IHJvdXRlIGFsbG9jYXRpb24gcGVyY2VudGFnZSBzdHJpbmdzCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IG5pbCB3aGVuIGFsbCBxdW90ZXMgcGFyc2UgYW5kIHRvdGFsIDEwMDsgaW52YWxpZCB2YWx1ZSBvciBzdW0gZXJyb3Igb3RoZXJ3aXNlCmZ1bmMgKHAgKlJvdXRlUGFyc2VyKSBWYWxpZGF0ZVF1b3RlU3VtKHF1b3RlcyBbXXN0cmluZykgZXJyb3IgewoJY29uc3QgKAoJCW1heFF1b3RlIGludDggPSAxMDAKCQltaW5RdW90ZSBpbnQ4ID0gMAoJKQoKCXZhciBzdW0gaW50OAoKCWZvciBpLCBxdW90ZSA6PSByYW5nZSBxdW90ZXMgewoJCXF0LCBlcnIgOj0gc3RyY29udi5QYXJzZUludChxdW90ZSwgMTAsIDgpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiB1Zm10LkVycm9yZihlcnJJbnZhbGlkUXVvdGUsIHF1b3RlLCBpKQoJCX0KCQlpbnRRdW90ZSA6PSBpbnQ4KHF0KQoKCQkvLyBRdW90ZSBtdXN0IGJlIHBvc2l0aXZlICg+IDApIGFzIGVhY2ggcm91dGUgbmVlZHMgYSBub24temVybyBhbGxvY2F0aW9uLgoJCS8vIEEgcXVvdGUgb2YgMCB3b3VsZCBtZWFuIG5vIHN3YXAgdGhyb3VnaCB0aGF0IHJvdXRlLCB3aGljaCBpcyBpbnZhbGlkLgoJCWlmIGludFF1b3RlIDw9IG1pblF1b3RlIHsgLy8gbWluUXVvdGUgPSAwLCBzbyB0aGlzIHJlamVjdHMgcXVvdGUgPSAwCgkJCXJldHVybiB1Zm10LkVycm9yZihlcnJJbnZhbGlkUXVvdGVWYWx1ZSwgcXVvdGUsIGkpCgkJfQoKCQlpZiBpbnRRdW90ZSA+IG1heFF1b3RlIHsKCQkJcmV0dXJuIHVmbXQuRXJyb3JmKGVyclF1b3RlRXhjZWVkc01heCwgcXVvdGUsIGksIG1heFF1b3RlKQoJCX0KCgkJaWYgc3VtID4gbWF4UXVvdGUtaW50UXVvdGUgewoJCQlyZXR1cm4gdWZtdC5FcnJvcmYoZXJyUXVvdGVTdW1FeGNlZWRzTWF4LCBpKQoJCX0KCgkJc3VtICs9IGludFF1b3RlCgl9CgoJaWYgc3VtICE9IG1heFF1b3RlIHsKCQlyZXR1cm4gdWZtdC5FcnJvcmYoZXJySW52YWxpZFF1b3RlU3VtLCBzdW0pCgl9CgoJcmV0dXJuIG5pbAp9CgovLyBmaW5hbGl6ZVN3YXAgaGFuZGxlcyBwb3N0LXN3YXAgb3BlcmF0aW9ucyBhbmQgdmFsaWRhdGlvbnMuCmZ1bmMgKHIgKnJvdXRlclYxKSBmaW5hbGl6ZVN3YXAoCglfIGludCwKCXJsbSByZWFsbSwKCWlucHV0VG9rZW4sIG91dHB1dFRva2VuIHN0cmluZywKCXJlc3VsdEFtb3VudEluLCByZXN1bHRBbW91bnRPdXQgaW50NjQsCglzd2FwVHlwZSBTd2FwVHlwZSwKCXRva2VuQW1vdW50TGltaXQgaW50NjQsCglhbW91bnRTcGVjaWZpZWQgaW50NjQsCglzd2FwQ291bnQgaW50NjQsCglpc1NldFNxcnRQcmljZUxpbWl0WDk2IGJvb2wsCikgKGludDY0LCBpbnQ2NCkgewoJdmFsaWRhdG9yIDo9ICZTd2FwVmFsaWRhdG9ye30KCgkvLyBIYW5kbGUgc3dhcCBmZWUKCXJlc3VsdEFtb3VudE91dFdpdGhvdXRGZWUgOj0gci5oYW5kbGVTd2FwRmVlKDAsIHJsbSwgb3V0cHV0VG9rZW4sIHJlc3VsdEFtb3VudE91dCkKCgkvLyBWYWxpZGF0ZSB0aGUgZXhhY3Qtb3V0IHRhcmdldCB3aGVuIG5vIGNhbGxlciBwcmljZSBsaW1pdCBpcyBzZXQuIEEKCS8vIG5vbnplcm8gc2luZ2xlLWhvcCBsaW1pdCBwZXJtaXRzIHBhcnRpYWwgb3V0cHV0LCBzbyBvbmx5IHRoZSBtYXgtaW5wdXQKCS8vIHNsaXBwYWdlIGNoZWNrIGJlbG93IHJlbWFpbnMgYXBwbGljYWJsZS4KCWlmIHN3YXBUeXBlID09IEV4YWN0T3V0ICYmICFpc1NldFNxcnRQcmljZUxpbWl0WDk2IHsKCQlpZiBlcnIgOj0gdmFsaWRhdG9yLmV4YWN0T3V0QW1vdW50KHJlc3VsdEFtb3VudE91dFdpdGhvdXRGZWUsIGFtb3VudFNwZWNpZmllZCwgc3dhcENvdW50KTsgZXJyICE9IG5pbCB7CgkJCXBhbmljKGFkZERldGFpbFRvRXJyb3IoZXJyU2xpcHBhZ2UsIGVyci5FcnJvcigpKSkKCQl9Cgl9CgoJLy8gVmFsaWRhdGUgZXhhY3QgaW4gYW1vdW50IGlmIGFwcGxpY2FibGUKCS8vIElmIHNxcnRQcmljZUxpbWl0WDk2IGlzIHNldCwgcGFydGlhbCBjb25zdW1wdGlvbiB1cCB0byB0aGUgcHJpY2UgbGltaXQgaXMgaW50ZW5kZWQKCWlmIHN3YXBUeXBlID09IEV4YWN0SW4gJiYgIWlzU2V0U3FydFByaWNlTGltaXRYOTYgewoJCWlmIGVyciA6PSB2YWxpZGF0b3IuZXhhY3RJbkFtb3VudChyZXN1bHRBbW91bnRJbiwgYW1vdW50U3BlY2lmaWVkKTsgZXJyICE9IG5pbCB7CgkJCXBhbmljKGFkZERldGFpbFRvRXJyb3IoZXJySW5zdWZmaWNpZW50TGlxdWlkaXR5LCBlcnIuRXJyb3IoKSkpCgkJfQoJfQoKCWlmIGVyciA6PSB2YWxpZGF0b3Iuc2xpcHBhZ2Uoc3dhcFR5cGUsIHJlc3VsdEFtb3VudEluLCByZXN1bHRBbW91bnRPdXRXaXRob3V0RmVlLCB0b2tlbkFtb3VudExpbWl0KTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoYWRkRGV0YWlsVG9FcnJvcihlcnJTbGlwcGFnZSwgZXJyLkVycm9yKCkpKQoJfQoKCXJldHVybiByZXN1bHRBbW91bnRJbiwgcmVzdWx0QW1vdW50T3V0V2l0aG91dEZlZQp9CgovLyB2YWxpZGF0ZVJvdXRlc0FuZFF1b3RlcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgcGFyc2VzIGFuZCB2YWxpZGF0ZXMgcm91dGVzIGluIG9uZSBjYWxsLgpmdW5jIHZhbGlkYXRlUm91dGVzQW5kUXVvdGVzKHJvdXRlcywgcXVvdGVzIHN0cmluZykgKFtdc3RyaW5nLCBbXXN0cmluZywgZXJyb3IpIHsKCXJldHVybiBOZXdSb3V0ZVBhcnNlcigpLlBhcnNlUm91dGVzKHJvdXRlcywgcXVvdGVzKQp9ChrfUwoOcm91dGVyX2RyeS5nbm8SzFNwYWNrYWdlIHJvdXRlcgoKaW1wb3J0ICgKCSJlcnJvcnMiCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9nbm9zd2FwL2duc21hdGgvdjEiCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3V0aWxzL3YxIgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoKCSJnbm8ubGFuZC9yL2dub3N3YXAvY29tbW9uIgopCgovLyBRdW90ZUNvbnN0cmFpbnRzIGRlZmluZXMgdGhlIHZhbGlkIHJhbmdlIGZvciBzd2FwIHF1b3RlIHBlcmNlbnRhZ2VzCmNvbnN0ICgKCU1heFF1b3RlUGVyY2VudGFnZSAgICAgPSAxMDAKCU1pblF1b3RlUGVyY2VudGFnZSAgICAgPSAwCglQRVJDRU5UQUdFX0RFTk9NSU5BVE9SID0gaW50NjQoMTAwKQopCgovLyBFcnJvck1lc3NhZ2VzIGZvciBEcnlTd2FwUm91dGUgb3BlcmF0aW9ucwpjb25zdCAoCglFcnJVbmtub3duU3dhcFR5cGUgICAgICAgPSAidW5rbm93biBzd2FwVHlwZSglcykiCglFcnJJbnZhbGlkUG9zaXRpdmVBbW91bnQgPSAiaW52YWxpZCBhbW91bnQoJXMpLCBtdXN0IGJlIHBvc2l0aXZlIgoJRXJySW52YWxpZFF1b3RlUmFuZ2UgICAgID0gInF1b3RlKCVkKSBtdXN0IGJlICVkfiVkIgopCgovLyBTd2FwUHJvY2Vzc29yIGhhbmRsZXMgdGhlIGV4ZWN1dGlvbiBvZiBzd2FwIG9wZXJhdGlvbnMKdHlwZSBTd2FwUHJvY2Vzc29yIHN0cnVjdCB7Cglyb3V0ZXIgKnJvdXRlclYxCn0KCi8vIFByb2Nlc3NTaW5nbGVTd2FwIHNpbXVsYXRlcyBvbmUgcG9vbCBob3Agd2l0aG91dCBleGVjdXRpbmcgdHJhbnNmZXJzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcm91dGU6IHNpbmdsZSBwb29sIHBhdGggZm9ybWF0dGVkIGFzIFRPS0VOMDpUT0tFTjE6RkVFCi8vICAgLSBhbW91bnRTcGVjaWZpZWQ6IHNpZ25lZCBpbnB1dCBvciBvdXRwdXQgYW1vdW50IGZvciB0aGUgaG9wCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnRJbjogaW5wdXQgYW1vdW50IHRoZSBwb29sIHdvdWxkIHJlY2VpdmUKLy8gICAtIGFtb3VudE91dDogb3V0cHV0IGFtb3VudCB0aGUgcG9vbCB3b3VsZCBzZW5kCi8vICAgLSBlcnI6IGFsd2F5cyBuaWwgd2hlbiB0aGUgZHJ5IHBvb2wgY2FsbCByZXR1cm5zOyBtYWxmb3JtZWQgcGF0aHMgb3IgcG9vbCBmYWlsdXJlcyBwYW5pYyBpbiB0aGUgdW5kZXJseWluZyBoZWxwZXJzCmZ1bmMgKHAgKlN3YXBQcm9jZXNzb3IpIFByb2Nlc3NTaW5nbGVTd2FwKHJvdXRlIHN0cmluZywgYW1vdW50U3BlY2lmaWVkIGludDY0KSAoYW1vdW50SW4sIGFtb3VudE91dCBpbnQ2NCwgZXJyIGVycm9yKSB7CglpbnB1dCwgb3V0cHV0LCBmZWUgOj0gZ2V0RGF0YUZvclNpbmdsZVBhdGgocm91dGUpCglzaW5nbGVQYXJhbXMgOj0gU2luZ2xlU3dhcFBhcmFtc3sKCQl0b2tlbkluOiAgICAgICAgIGlucHV0LAoJCXRva2VuT3V0OiAgICAgICAgb3V0cHV0LAoJCWZlZTogICAgICAgICAgICAgZmVlLAoJCWFtb3VudFNwZWNpZmllZDogYW1vdW50U3BlY2lmaWVkLAoJfQoKCWFtb3VudEluLCBhbW91bnRPdXQgPSBwLnJvdXRlci5zaW5nbGVEcnlTd2FwKCZzaW5nbGVQYXJhbXMpCglyZXR1cm4gYW1vdW50SW4sIGFtb3VudE91dCwgbmlsCn0KCi8vIFByb2Nlc3NNdWx0aVN3YXAgc2ltdWxhdGVzIGEgbXVsdGktaG9wIHJvdXRlIGluIHRoZSByZXF1ZXN0ZWQgZGlyZWN0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gc3dhcFR5cGU6IEV4YWN0SW4gZm9yIGZvcndhcmQgZXhlY3V0aW9uIG9yIEV4YWN0T3V0IGZvciBiYWNrd2FyZCBxdW90aW5nCi8vICAgLSByb3V0ZTogbXVsdGktaG9wIHBhdGggd2l0aCBQT09MX1NFUEFSQVRPUiBiZXR3ZWVuIGhvcHMKLy8gICAtIG51bUhvcHM6IG51bWJlciBvZiBwb29scyBpbiByb3V0ZQovLyAgIC0gYW1vdW50U3BlY2lmaWVkOiBzaWduZWQgaW5wdXQgb3Igb3V0cHV0IGFtb3VudCBmb3IgdGhlIHJvdXRlCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnRJbjogaW5wdXQgYW1vdW50IHRoZSByb3V0ZSB3b3VsZCBjb25zdW1lCi8vICAgLSBhbW91bnRPdXQ6IG91dHB1dCBhbW91bnQgdGhlIHJvdXRlIHdvdWxkIHByb2R1Y2UKLy8gICAtIGVycjogbmlsIG9uIHN1Y2Nlc3NmdWwgc2ltdWxhdGlvbjsgaW52YWxpZCBzd2FwLXR5cGUgZXJyb3Igb3IgZG93bnN0cmVhbSBkcnktc3dhcCB2YWxpZGF0aW9uIGVycm9yIG90aGVyd2lzZSAocG9vbCBxdWVyeSBmYWlsdXJlcyBwYW5pYykKZnVuYyAocCAqU3dhcFByb2Nlc3NvcikgUHJvY2Vzc011bHRpU3dhcCgKCXN3YXBUeXBlIFN3YXBUeXBlLAoJcm91dGUgc3RyaW5nLAoJbnVtSG9wcyBpbnQsCglhbW91bnRTcGVjaWZpZWQgaW50NjQsCikgKGludDY0LCBpbnQ2NCwgZXJyb3IpIHsKCXBhdGhJbmRleCA6PSBnZXRQYXRoSW5kZXgoc3dhcFR5cGUsIG51bUhvcHMpCgoJaW5wdXQsIG91dHB1dCwgZmVlIDo9IGdldERhdGFGb3JNdWx0aVBhdGgocm91dGUsIHBhdGhJbmRleCkKCXNpbmdsZVBhcmFtcyA6PSBTaW5nbGVTd2FwUGFyYW1zewoJCXRva2VuSW46ICAgICAgICAgaW5wdXQsCgkJdG9rZW5PdXQ6ICAgICAgICBvdXRwdXQsCgkJZmVlOiAgICAgICAgICAgICBmZWUsCgkJYW1vdW50U3BlY2lmaWVkOiBhbW91bnRTcGVjaWZpZWQsCgl9CgoJc3dpdGNoIHN3YXBUeXBlIHsKCWNhc2UgRXhhY3RJbjoKCQlyZXR1cm4gcC5yb3V0ZXIubXVsdGlEcnlTd2FwKHNpbmdsZVBhcmFtcywgbnVtSG9wcywgcm91dGUpCgljYXNlIEV4YWN0T3V0OgoJCXJldHVybiBwLnJvdXRlci5tdWx0aURyeVN3YXBOZWdhdGl2ZShzaW5nbGVQYXJhbXMsIG51bUhvcHMsIHJvdXRlKQoJZGVmYXVsdDoKCQlyZXR1cm4gMCwgMCwgdWZtdC5FcnJvcmYoRXJyVW5rbm93blN3YXBUeXBlLCBzd2FwVHlwZSkKCX0KfQoKLy8gVmFsaWRhdGVTd2FwUmVzdWx0cyBjaGVja3Mgc2ltdWxhdGVkIGFtb3VudHMgYWdhaW5zdCBleGFjdG5lc3MgYW5kIHNsaXBwYWdlIGNvbnN0cmFpbnRzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gc3dhcFR5cGU6IEV4YWN0SW4gb3IgRXhhY3RPdXQgdmFsaWRhdGlvbiBkaXJlY3Rpb24KLy8gICAtIHJlc3VsdEFtb3VudEluOiBzaW11bGF0ZWQgYWdncmVnYXRlIGlucHV0IGFtb3VudAovLyAgIC0gcmVzdWx0QW1vdW50T3V0OiBzaW11bGF0ZWQgYWdncmVnYXRlIG91dHB1dCBhbW91bnQgYWZ0ZXIgcm91dGVyIGZlZQovLyAgIC0gYW1vdW50U3BlY2lmaWVkOiBjYWxsZXIncyBleGFjdCBpbnB1dCBvciBvdXRwdXQgdGFyZ2V0Ci8vICAgLSBhbW91bnRMaW1pdDogbWluaW11bSBvdXRwdXQgb3IgbWF4aW11bSBpbnB1dCBzbGlwcGFnZSBib3VuZAovLyAgIC0gc3dhcENvdW50OiBudW1iZXIgb2YgcG9vbCBob3BzIHVzZWQgZm9yIGV4YWN0LW91dHB1dCB0b2xlcmFuY2UKLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudEluOiByZXN1bHRBbW91bnRJbiB3aGVuIHZhbGlkYXRpb24gcmVhY2hlcyB0aGUgcmV0dXJuIHBhdGgKLy8gICAtIGFtb3VudE91dDogcmVzdWx0QW1vdW50T3V0IHdoZW4gdmFsaWRhdGlvbiByZWFjaGVzIHRoZSByZXR1cm4gcGF0aAovLyAgIC0gZXJyOiBuaWwgd2hlbiBsaXF1aWRpdHksIGV4YWN0bmVzcywgYW5kIHNsaXBwYWdlIGNoZWNrcyBwYXNzOyByZWxldmFudCB2YWxpZGF0aW9uIGVycm9yIG90aGVyd2lzZQpmdW5jIChwICpTd2FwUHJvY2Vzc29yKSBWYWxpZGF0ZVN3YXBSZXN1bHRzKAoJc3dhcFR5cGUgU3dhcFR5cGUsCglyZXN1bHRBbW91bnRJbiwgcmVzdWx0QW1vdW50T3V0IGludDY0LAoJYW1vdW50U3BlY2lmaWVkLCBhbW91bnRMaW1pdCBpbnQ2NCwKCXN3YXBDb3VudCBpbnQ2NCwKKSAoYW1vdW50SW4sIGFtb3VudE91dCBpbnQ2NCwgZXJyIGVycm9yKSB7CglpZiByZXN1bHRBbW91bnRJbiA9PSAwIHx8IHJlc3VsdEFtb3VudE91dCA9PSAwIHsKCQlyZXR1cm4gMCwgMCwgZXJyb3JzLk5ldyhlcnJJbnN1ZmZpY2llbnRMaXF1aWRpdHkpCgl9CgoJdmFsaWRhdG9yIDo9ICZTd2FwVmFsaWRhdG9ye30KCglpZiBzd2FwVHlwZSA9PSBFeGFjdE91dCB7CgkJYWJzU3BlY2lmaWVkIDo9IGduc21hdGguU2FmZUFic0ludDY0KGFtb3VudFNwZWNpZmllZCkKCgkJaWYgZXJyIDo9IHZhbGlkYXRvci5leGFjdE91dEFtb3VudChyZXN1bHRBbW91bnRPdXQsIGFic1NwZWNpZmllZCwgc3dhcENvdW50KTsgZXJyICE9IG5pbCB7CgkJCXJldHVybiByZXN1bHRBbW91bnRJbiwgcmVzdWx0QW1vdW50T3V0LCBlcnIKCQl9Cgl9CgoJaWYgc3dhcFR5cGUgPT0gRXhhY3RJbiB7CgkJaWYgZXJyIDo9IHZhbGlkYXRvci5leGFjdEluQW1vdW50KHJlc3VsdEFtb3VudEluLCBhbW91bnRTcGVjaWZpZWQpOyBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIHJlc3VsdEFtb3VudEluLCByZXN1bHRBbW91bnRPdXQsIGVycgoJCX0KCX0KCglpZiBlcnIgOj0gdmFsaWRhdG9yLnNsaXBwYWdlKHN3YXBUeXBlLCByZXN1bHRBbW91bnRJbiwgcmVzdWx0QW1vdW50T3V0LCBhbW91bnRMaW1pdCk7IGVyciAhPSBuaWwgewoJCXJldHVybiByZXN1bHRBbW91bnRJbiwgcmVzdWx0QW1vdW50T3V0LCBlcnIKCX0KCglyZXR1cm4gcmVzdWx0QW1vdW50SW4sIHJlc3VsdEFtb3VudE91dCwgbmlsCn0KCi8vIEFkZFN3YXBSZXN1bHRzIGFkZHMgb25lIHJvdXRlJ3MgYW1vdW50cyB0byBhY2N1bXVsYXRlZCB0b3RhbHMgdXNpbmcgb3ZlcmZsb3ctc2FmZSBhcml0aG1ldGljLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcmVzdWx0QW1vdW50SW46IGFjY3VtdWxhdGVkIGlucHV0IGJlZm9yZSB0aGlzIHJvdXRlCi8vICAgLSByZXN1bHRBbW91bnRPdXQ6IGFjY3VtdWxhdGVkIG91dHB1dCBiZWZvcmUgdGhpcyByb3V0ZQovLyAgIC0gYW1vdW50SW46IGN1cnJlbnQgcm91dGUgaW5wdXQgYW1vdW50Ci8vICAgLSBhbW91bnRPdXQ6IGN1cnJlbnQgcm91dGUgb3V0cHV0IGFtb3VudAovLwovLyBSZXR1cm5zOgovLyAgIC0gbmV3QW1vdW50SW46IGFjY3VtdWxhdGVkIGlucHV0IGFmdGVyIGFkZGluZyBhbW91bnRJbgovLyAgIC0gbmV3QW1vdW50T3V0OiBhY2N1bXVsYXRlZCBvdXRwdXQgYWZ0ZXIgYWRkaW5nIGFtb3VudE91dAovLyAgIC0gZXJyOiBhbHdheXMgbmlsOyBvdmVyZmxvdyBpcyByYWlzZWQgYnkgc2FmZSBhcml0aG1ldGljIHJhdGhlciB0aGFuIHJldHVybmVkCmZ1bmMgKHAgKlN3YXBQcm9jZXNzb3IpIEFkZFN3YXBSZXN1bHRzKAoJcmVzdWx0QW1vdW50SW4sIHJlc3VsdEFtb3VudE91dCwgYW1vdW50SW4sIGFtb3VudE91dCBpbnQ2NCwKKSAoaW50NjQsIGludDY0LCBlcnJvcikgewoJbmV3QW1vdW50SW4gOj0gZ25zbWF0aC5TYWZlQWRkSW50NjQocmVzdWx0QW1vdW50SW4sIGFtb3VudEluKQoJbmV3QW1vdW50T3V0IDo9IGduc21hdGguU2FmZUFkZEludDY0KHJlc3VsdEFtb3VudE91dCwgYW1vdW50T3V0KQoKCXJldHVybiBuZXdBbW91bnRJbiwgbmV3QW1vdW50T3V0LCBuaWwKfQoKLy8gRHJ5U3dhcFJvdXRlIHNpbXVsYXRlcyBhIHRva2VuIHN3YXAgcm91dGUgd2l0aG91dCBleGVjdXRpbmcgdHJhbnNmZXJzIG9yIGNoYW5naW5nIHN0YXRlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW5wdXRUb2tlbjogaW5wdXQgdG9rZW4gY29udHJhY3QgcGF0aAovLyAgIC0gb3V0cHV0VG9rZW46IG91dHB1dCB0b2tlbiBjb250cmFjdCBwYXRoCi8vICAgLSBzcGVjaWZpZWRBbW91bnQ6IGV4YWN0IGlucHV0IGFtb3VudCBmb3IgRVhBQ1RfSU4gb3IgZXhhY3Qgb3V0cHV0IGFtb3VudCBmb3IgRVhBQ1RfT1VUCi8vICAgLSBzd2FwVHlwZVN0cjogRVhBQ1RfSU4gb3IgRVhBQ1RfT1VUCi8vICAgLSBzdHJSb3V0ZUFycjogY29tbWEtc2VwYXJhdGVkIHJvdXRlIHBhdGhzLCB3aXRoIGF0IG1vc3Qgc2V2ZW4gcm91dGUgZW50cmllcwovLyAgIC0gcXVvdGVBcnI6IGNvbW1hLXNlcGFyYXRlZCByb3V0ZSBhbGxvY2F0aW9uIHBlcmNlbnRhZ2VzIHN1bW1pbmcgdG8gMTAwCi8vICAgLSB0b2tlbkFtb3VudExpbWl0OiBtaW5pbXVtIG91dHB1dCBmb3IgRVhBQ1RfSU4gb3IgbWF4aW11bSBpbnB1dCBmb3IgRVhBQ1RfT1VUCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnRJbjogc2ltdWxhdGVkIGlucHV0IGFtb3VudCBlbmNvZGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcKLy8gICAtIGFtb3VudE91dDogc2ltdWxhdGVkIG5ldCBvdXRwdXQgYW1vdW50IGVuY29kZWQgYXMgYSBkZWNpbWFsIHN0cmluZwovLyAgIC0gZXJyOiBuaWwgb24gc3VjY2VzczsgdmFsaWRhdGlvbiwgbGlxdWlkaXR5LCBwYXJzaW5nLCBvciBzbGlwcGFnZSBlcnJvciBvdGhlcndpc2UKZnVuYyAociAqcm91dGVyVjEpIERyeVN3YXBSb3V0ZSgKCWlucHV0VG9rZW4sIG91dHB1dFRva2VuIHN0cmluZywKCXNwZWNpZmllZEFtb3VudCBzdHJpbmcsCglzd2FwVHlwZVN0ciBzdHJpbmcsCglzdHJSb3V0ZUFyciwgcXVvdGVBcnIgc3RyaW5nLAoJdG9rZW5BbW91bnRMaW1pdCBzdHJpbmcsCikgKGFtb3VudEluLCBhbW91bnRPdXQgc3RyaW5nLCBlcnIgZXJyb3IpIHsKCWRlZmVyIGZ1bmMoKSB7CgkJaWYgciA6PSByZWNvdmVyKCk7IHIgIT0gbmlsIHsKCQkJYW1vdW50SW4gPSAiMCIKCQkJYW1vdW50T3V0ID0gIjAiCgkJCWlmIHJlY292ZXJlZEVyciwgb2sgOj0gci4oZXJyb3IpOyBvayB7CgkJCQllcnIgPSByZWNvdmVyZWRFcnIKCQkJfSBlbHNlIHsKCQkJCWVyciA9IHVmbXQuRXJyb3JmKCIldiIsIHIpCgkJCX0KCQl9Cgl9KCkKCglpbnB1dEFtb3VudCwgb3V0cHV0QW1vdW50LCBlcnIgOj0gci5kcnlTd2FwUm91dGUoCgkJaW5wdXRUb2tlbiwKCQlvdXRwdXRUb2tlbiwKCQl1dGlscy5TYWZlUGFyc2VJbnQ2NChzcGVjaWZpZWRBbW91bnQpLAoJCXN3YXBUeXBlU3RyLAoJCXN0clJvdXRlQXJyLAoJCXF1b3RlQXJyLAoJCXV0aWxzLlNhZmVQYXJzZUludDY0KHRva2VuQW1vdW50TGltaXQpLAoJKQoJcmV0dXJuIHV0aWxzLkZvcm1hdEludChpbnB1dEFtb3VudCksIHV0aWxzLkZvcm1hdEludChvdXRwdXRBbW91bnQpLCBlcnIKfQoKLy8gZHJ5U3dhcFJvdXRlIGlzIHRoZSBpbnRlcm5hbCBkcnktcnVuIHN3YXAgc2ltdWxhdGlvbiB0aGF0IHJldHVybnMgZXJyb3JzCi8vIGluc3RlYWQgb2YgcGFuaWNraW5nIG9uIHZhbGlkYXRpb24gb3IgbGlxdWlkaXR5IGZhaWx1cmVzLgpmdW5jIChyICpyb3V0ZXJWMSkgZHJ5U3dhcFJvdXRlKAoJaW5wdXRUb2tlbiwgb3V0cHV0VG9rZW4gc3RyaW5nLAoJc3BlY2lmaWVkQW1vdW50IGludDY0LAoJc3dhcFR5cGVTdHIgc3RyaW5nLAoJc3RyUm91dGVBcnIsIHF1b3RlQXJyIHN0cmluZywKCXRva2VuQW1vdW50TGltaXQgaW50NjQsCikgKGludDY0LCBpbnQ2NCwgZXJyb3IpIHsKCWlmIGVyciA6PSBjb21tb24uVmFsaWRhdGVSZWdpc3RlcmVkKGlucHV0VG9rZW4sIG91dHB1dFRva2VuKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIDAsIGVycgoJfQoKCWFzc2VydElzVmFsaWRSb3V0ZVBhdGhzKHN0clJvdXRlQXJyLCBpbnB1dFRva2VuLCBvdXRwdXRUb2tlbikKCWFzc2VydElzRXhpc3RzUG9vbHMoc3RyUm91dGVBcnIpCgoJLy8gaW5pdGlhbGl6ZSBjb21wb25lbnRzCgl2YWxpZGF0b3IgOj0gJlN3YXBWYWxpZGF0b3J7fQoJcHJvY2Vzc29yIDo9ICZTd2FwUHJvY2Vzc29ye3JvdXRlcjogcn0KCgkvLyB2YWxpZGF0ZSBhbmQgcGFyc2UgaW5wdXRzCglzd2FwVHlwZSwgZXJyIDo9IHZhbGlkYXRvci5zd2FwVHlwZShzd2FwVHlwZVN0cikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwLCAwLCBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJJbnZhbGlkU3dhcFR5cGUsIGVyci5FcnJvcigpKQoJfQoKCWFtb3VudFNwZWNpZmllZCwgZXJyIDo9IHZhbGlkYXRvci5hbW91bnQoc3BlY2lmaWVkQW1vdW50KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIDAsIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRJbnB1dCwgZXJyLkVycm9yKCkpCgl9CgoJcm91dGVzLCBxdW90ZXMsIGVyciA6PSBOZXdSb3V0ZVBhcnNlcigpLlBhcnNlUm91dGVzKHN0clJvdXRlQXJyLCBxdW90ZUFycikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwLCAwLCBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJJbnZhbGlkUm91dGVzQW5kUXVvdGVzLCBlcnIuRXJyb3IoKSkKCX0KCglzd2FwRmVlIDo9IHIuc3RvcmUuR2V0U3dhcEZlZSgpCgoJLy8gU3RvcmUgb3JpZ2luYWwgYW1vdW50IGZvciB2YWxpZGF0aW9uIChiZWZvcmUgcm91dGVyIGZlZSBhZGp1c3RtZW50KQoJb3JpZ2luYWxBbW91bnRTcGVjaWZpZWQgOj0gYW1vdW50U3BlY2lmaWVkCgoJLy8gYWRqdXN0IGFtb3VudCBzaWduIGZvciBleGFjdCBvdXQgc3dhcHMKCWlmIHN3YXBUeXBlID09IEV4YWN0T3V0IHsKCQlhYnNTcGVjaWZpZWQgOj0gZ25zbWF0aC5TYWZlQWJzSW50NjQoYW1vdW50U3BlY2lmaWVkKQoJCWFtb3VudFNwZWNpZmllZFdpdGhSb3V0ZXJGZWUgOj0gY2FsY3VsYXRlRXhhY3RPdXRXaXRoUm91dGVyRmVlKGFic1NwZWNpZmllZCwgc3dhcEZlZSkKCQlhbW91bnRTcGVjaWZpZWQgPSAtYW1vdW50U3BlY2lmaWVkV2l0aFJvdXRlckZlZQoJfQoKCS8vIGluaXRpYWxpemUgYWNjdW11bGF0b3JzIGZvciBzd2FwIHJlc3VsdHMKCXJlc3VsdEFtb3VudEluLCByZXN1bHRBbW91bnRPdXQgOj0gaW50NjQoMCksIGludDY0KDApCglyZW1haW5SZXF1ZXN0QW1vdW50IDo9IGFtb3VudFNwZWNpZmllZAoJc3dhcENvdW50IDo9IGludDY0KDApCgoJLy8gUHJvY2VzcyBlYWNoIHJvdXRlCglmb3IgaSwgcm91dGUgOj0gcmFuZ2Ugcm91dGVzIHsKCQl0b1N3YXBBbW91bnQgOj0gaW50NjQoMCkKCgkJLy8gaWYgaXQncyB0aGUgbGFzdCByb3V0ZSwgdXNlIHRoZSByZW1haW5pbmcgYW1vdW50CgkJaXNMYXN0Um91dGUgOj0gaSA9PSBsZW4ocm91dGVzKS0xCgkJaWYgIWlzTGFzdFJvdXRlIHsKCQkJLy8gY2FsY3VsYXRlIHRoZSBhbW91bnQgdG8gc3dhcCBmb3IgdGhpcyByb3V0ZQoJCQlzd2FwQW1vdW50LCBlcnIgOj0gY2FsY3VsYXRlU3dhcEFtb3VudEJ5UXVvdGUoYW1vdW50U3BlY2lmaWVkLCBxdW90ZXNbaV0pCgkJCWlmIGVyciAhPSBuaWwgewoJCQkJcmV0dXJuIDAsIDAsIGVycgoJCQl9CgoJCQkvLyB1cGRhdGUgdGhlIHJlbWFpbmluZyBhbW91bnQKCQkJcmVzdWx0UmVtYWluUmVxdWVzdEFtb3VudCA6PSBnbnNtYXRoLlNhZmVTdWJJbnQ2NChyZW1haW5SZXF1ZXN0QW1vdW50LCBzd2FwQW1vdW50KQoKCQkJcmVtYWluUmVxdWVzdEFtb3VudCA9IHJlc3VsdFJlbWFpblJlcXVlc3RBbW91bnQKCQkJdG9Td2FwQW1vdW50ID0gc3dhcEFtb3VudAoJCX0gZWxzZSB7CgkJCXRvU3dhcEFtb3VudCA9IHJlbWFpblJlcXVlc3RBbW91bnQKCQl9CgoJCS8vIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGhvcHMgYW5kIHZhbGlkYXRlCgkJbnVtSG9wcyA6PSBzdHJpbmdzLkNvdW50KHJvdXRlLCBQT09MX1NFUEFSQVRPUikgKyAxCgkJYXNzZXJ0SG9wc0luUmFuZ2UobnVtSG9wcykKCgkJLy8gYWNjdW11bGF0ZSB0b3RhbCBzd2FwIGNvdW50IGZvciB2YWxpZGF0aW9uCgkJc3dhcENvdW50ICs9IGludDY0KG51bUhvcHMpCgoJCS8vIGV4ZWN1dGUgdGhlIGFwcHJvcHJpYXRlIHN3YXAgdHlwZQoJCXZhciBhbW91bnRJbiwgYW1vdW50T3V0IGludDY0CgkJaWYgbnVtSG9wcyA9PSAxIHsKCQkJYW1vdW50SW4sIGFtb3VudE91dCwgZXJyID0gcHJvY2Vzc29yLlByb2Nlc3NTaW5nbGVTd2FwKHJvdXRlLCB0b1N3YXBBbW91bnQpCgkJfSBlbHNlIHsKCQkJYW1vdW50SW4sIGFtb3VudE91dCwgZXJyID0gcHJvY2Vzc29yLlByb2Nlc3NNdWx0aVN3YXAoc3dhcFR5cGUsIHJvdXRlLCBudW1Ib3BzLCB0b1N3YXBBbW91bnQpCgkJfQoKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIDAsIDAsIGVycgoJCX0KCgkJaWYgYW1vdW50SW4gPT0gMCB8fCBhbW91bnRPdXQgPT0gMCB7CgkJCXJldHVybiAwLCAwLCBlcnJvcnMuTmV3KGVyckluc3VmZmljaWVudExpcXVpZGl0eSkKCQl9CgoJCS8vIHVwZGF0ZSBhY2N1bXVsYXRlZCByZXN1bHRzCgkJcmVzdWx0QW1vdW50SW4sIHJlc3VsdEFtb3VudE91dCwgZXJyID0gcHJvY2Vzc29yLkFkZFN3YXBSZXN1bHRzKHJlc3VsdEFtb3VudEluLCByZXN1bHRBbW91bnRPdXQsIGFtb3VudEluLCBhbW91bnRPdXQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiAwLCAwLCBlcnIKCQl9Cgl9CgoJLy8gc2ltdWxhdGUgZGVkdWN0IHJvdXRlciBmZWUKCWZlZUFtb3VudEludDY0IDo9IGNhbGN1bGF0ZVJvdXRlckZlZShyZXN1bHRBbW91bnRPdXQsIHN3YXBGZWUpCgoJcmVzdWx0QW1vdW50T3V0ID0gZ25zbWF0aC5TYWZlU3ViSW50NjQocmVzdWx0QW1vdW50T3V0LCBmZWVBbW91bnRJbnQ2NCkKCglyZXR1cm4gcHJvY2Vzc29yLlZhbGlkYXRlU3dhcFJlc3VsdHMoc3dhcFR5cGUsIHJlc3VsdEFtb3VudEluLCByZXN1bHRBbW91bnRPdXQsIG9yaWdpbmFsQW1vdW50U3BlY2lmaWVkLCB0b2tlbkFtb3VudExpbWl0LCBzd2FwQ291bnQpCn0KCi8vIGdldFBhdGhJbmRleCByZXR1cm5zIHRoZSBwYXRoIGluZGV4IGJhc2VkIG9uIHN3YXAgdHlwZSBhbmQgbnVtYmVyIG9mIGhvcHMuCmZ1bmMgZ2V0UGF0aEluZGV4KHN3YXBUeXBlIFN3YXBUeXBlLCBudW1Ib3BzIGludCkgaW50IHsKCXN3aXRjaCBzd2FwVHlwZSB7CgljYXNlIEV4YWN0SW46CgkJLy8gZmlyc3QgZGF0YSBmb3IgZXhhY3QgaW5wdXQgc3dhcHMKCQlyZXR1cm4gMAoJY2FzZSBFeGFjdE91dDoKCQkvLyBsYXN0IGRhdGEgZm9yIGV4YWN0IG91dHB1dCBzd2FwcwoJCXJldHVybiBudW1Ib3BzIC0gMQoJZGVmYXVsdDoKCQlwYW5pYygic2hvdWxkIG5vdCBoYXBwZW4iKQoJfQp9ChrxFgoRc3dhcF9jYWxsYmFjay5nbm8S2xZwYWNrYWdlIHJvdXRlcgoKaW1wb3J0ICgKCSJlcnJvcnMiCgoJcHJiYWMgImduby5sYW5kL3AvZ25vc3dhcC9yYmFjL3YxIgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCgoJImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCgkiZ25vLmxhbmQvci9nbm9zd2FwL2NvbW1vbiIKCSJnbm8ubGFuZC9yL2dub3N3YXAvaGFsdC92MSIKKQoKLy8gU3dhcENhbGxiYWNrIGltcGxlbWVudHMgdGhlIHBvb2wncyBTd2FwQ2FsbGJhY2sgaW50ZXJmYWNlLgovLyBUaGUgcG9vbCBpbnZva2VzIGl0IGFmdGVyIHNlbmRpbmcgb3V0cHV0IHRva2VuczsgdGhlIHJvdXRlciB0aGVuIHRyYW5zZmVycyB0aGUKLy8gcG9zaXRpdmUgaW5wdXQgZGVsdGEgdG8gdGhlIHBvb2wuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIGNhbGxiYWNrIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0OyBtdXN0IHJlbWFpbiB0aGUgY3VycmVudCBjcm9zc2luZyBmcmFtZQovLyAgIC0gdG9rZW4wUGF0aDogdG9rZW4tMCBjb250cmFjdCBwYXRoIGluIGNhbm9uaWNhbCBwb29sIG9yZGVyCi8vICAgLSB0b2tlbjFQYXRoOiB0b2tlbi0xIGNvbnRyYWN0IHBhdGggaW4gY2Fub25pY2FsIHBvb2wgb3JkZXIKLy8gICAtIGFtb3VudDBEZWx0YTogc2lnbmVkIHRva2VuLTAgZGVsdGE7IHBvc2l0aXZlIG1lYW5zIHRoZSBwb29sIGlzIG93ZWQgdGhpcyBhbW91bnQKLy8gICAtIGFtb3VudDFEZWx0YTogc2lnbmVkIHRva2VuLTEgZGVsdGE7IHBvc2l0aXZlIG1lYW5zIHRoZSBwb29sIGlzIG93ZWQgdGhpcyBhbW91bnQKLy8gICAtIHBheWVyOiBhZGRyZXNzIHdob3NlIGJhbGFuY2Ugc3VwcGxpZXMgdGhlIHBvc2l0aXZlIGlucHV0IGRlbHRhCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IG5pbCBhZnRlciB0aGUgb3dlZCBpbnB1dCB0cmFuc2ZlcjsgYW4gZXJyb3IgZm9yIHNwb29mZWQgcmVhbG0sIGludmFsaWQgbGlxdWlkaXR5IGRlbHRhLCBvciBmYWlsZWQgcGF5bWVudAovLwovLyBQb3NpdGl2ZSBkZWx0YXMgYXJlIHRva2VucyB0aGUgcG9vbCBtdXN0IHJlY2VpdmU7IG5lZ2F0aXZlIGRlbHRhcyBhcmUgdG9rZW5zCi8vIHRoZSBwb29sIGhhcyBzZW50IHRvIHRoZSByZWNpcGllbnQuCmZ1bmMgKHIgKnJvdXRlclYxKSBTd2FwQ2FsbGJhY2soCglfIGludCwKCXJsbSByZWFsbSwKCXRva2VuMFBhdGgsIHRva2VuMVBhdGggc3RyaW5nLAoJYW1vdW50MERlbHRhLCBhbW91bnQxRGVsdGEgaW50NjQsCglwYXllciBhZGRyZXNzLAopIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KGVyclNwb29mZWRSZWFsbSkKCX0KCglpZiBhbW91bnQwRGVsdGEgPD0gMCAmJiBhbW91bnQxRGVsdGEgPD0gMCB7CgkJcmV0dXJuIG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQllcnJJbnN1ZmZpY2llbnRMaXF1aWRpdHksCgkJCSJzd2FwIGVudGlyZWx5IHdpdGhpbiAwLWxpcXVpZGl0eSByZWdpb24iLAoJCSkKCX0KCgloYWx0LkFzc2VydElzTm90SGFsdGVkUm91dGVyKCkKCgljYWxsZXIgOj0gcmxtLlByZXZpb3VzKCkuQWRkcmVzcygpCglhc3NlcnRJc1JvdXRlckltcGxlbWVudGF0aW9uKGNhbGxlcikKCgl2YXIgdG9rZW5Ub1BheSBzdHJpbmcKCXZhciBhbW91bnRUb1BheSBpbnQ2NAoKCS8vIGFtb3VudDBEZWx0YSA+IDAgbWVhbnMgcG9vbCB3YW50cyB0b2tlbjAKCS8vIGFtb3VudDFEZWx0YSA+IDAgbWVhbnMgcG9vbCB3YW50cyB0b2tlbjEKCWlmIGFtb3VudDBEZWx0YSA+IDAgewoJCWFtb3VudFRvUGF5ID0gYW1vdW50MERlbHRhCgkJdG9rZW5Ub1BheSA9IHRva2VuMFBhdGgKCX0gZWxzZSB7CgkJYW1vdW50VG9QYXkgPSBhbW91bnQxRGVsdGEKCQl0b2tlblRvUGF5ID0gdG9rZW4xUGF0aAoJfQoKCS8vIFRyYW5zZmVyIHRva2VucyBmcm9tIHJvdXRlciB0byBwb29sCgkvLyBUaGUgcm91dGVyIHNob3VsZCBhbHJlYWR5IGhhdmUgdGhlIHRva2VucyBmcm9tIHRoZSB1c2VyCglyLnRyYW5zZmVyVG9Qb29sKDAsIHJsbSwgdG9rZW5Ub1BheSwgdTI1Ni5OZXdVaW50RnJvbUludDY0KGFtb3VudFRvUGF5KSwgcGF5ZXIpCgoJcmV0dXJuIG5pbAp9CgovLyB0cmFuc2ZlclRvUG9vbCB0cmFuc2ZlcnMgdG9rZW5zIGZyb20gcm91dGVyIHRvIHBvb2wKZnVuYyAociAqcm91dGVyVjEpIHRyYW5zZmVyVG9Qb29sKF8gaW50LCBybG0gcmVhbG0sIHRva2VuIHN0cmluZywgYW1vdW50ICp1MjU2LlVpbnQsIHBheWVyIGFkZHJlc3MpIHsKCWJhbGFuY2UgOj0gY29tbW9uLkJhbGFuY2VPZih0b2tlbiwgcGF5ZXIpCgoJaWYgdTI1Ni5OZXdVaW50RnJvbUludDY0KGJhbGFuY2UpLkx0KGFtb3VudCkgewoJCXBhbmljKG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQllcnJJbnN1ZmZpY2llbnRCYWxhbmNlLAoJCQl1Zm10LlNwcmludGYoInRva2VuPSVzLCByZXF1aXJlZD0lZCwgYXZhaWxhYmxlPSVkLCBwYXllcj0lcyIsIHRva2VuLCBhbW91bnQuSW50NjQoKSwgYmFsYW5jZSwgcGF5ZXIuU3RyaW5nKCkpLAoJCSkpCgl9CgoJcG9vbEFkZHIgOj0gYWNjZXNzLk11c3RHZXRBZGRyZXNzKHByYmFjLlJPTEVfUE9PTC5TdHJpbmcoKSkKCXJvdXRlckFkZHIgOj0gYWNjZXNzLk11c3RHZXRBZGRyZXNzKHByYmFjLlJPTEVfUk9VVEVSLlN0cmluZygpKQoKCWlmIHBheWVyID09IHJvdXRlckFkZHIgewoJCWNvbW1vbi5TYWZlR1JDMjBUcmFuc2ZlcigwLCBybG0sIHRva2VuLCBwb29sQWRkciwgYW1vdW50LkludDY0KCkpCgl9IGVsc2UgewoJCWNvbW1vbi5TYWZlR1JDMjBUcmFuc2ZlckZyb20oMCwgcmxtLCB0b2tlbiwgcGF5ZXIsIHBvb2xBZGRyLCBhbW91bnQuSW50NjQoKSkKCX0KfQoanhoKDnN3YXBfaW5uZXIuZ25vEosacGFja2FnZSByb3V0ZXIKCmltcG9ydCAoCgkiZ25vLmxhbmQvci9nbm9zd2FwL2FjY2Vzcy92MSIKCSJnbm8ubGFuZC9yL2dub3N3YXAvcm91dGVyIgoKCWkyNTYgImduby5sYW5kL3AvZ25vc3dhcC9pbnQyNTYvdjEiCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKCSJnbm8ubGFuZC9wL2dub3N3YXAvdXRpbHMvdjEiCgoJcGwgImduby5sYW5kL3IvZ25vc3dhcC9wb29sIgopCgpjb25zdCAoCglNSU5fU1FSVF9SQVRJT19QTFVTX09ORSAgc3RyaW5nID0gIjQyOTUxMjg3NDAiCglNQVhfU1FSVF9SQVRJT19NSU5VU19PTkUgc3RyaW5nID0gIjE0NjE0NDY3MDM0ODUyMTAxMDMyODcyNzMwNTIyMDM5ODg4MjIzNzg3MjM5NzAzNDEiCikKCi8vIHN3YXBJbm5lciBleGVjdXRlcyB0aGUgY29yZSBzd2FwIGxvZ2ljIGJ5IGludGVyYWN0aW5nIHdpdGggdGhlIHBvb2wgY29udHJhY3QuCi8vIFJldHVybnMgcG9vbFJlY3YgKHRva2VucyByZWNlaXZlZCBieSBwb29sKSBhbmQgcG9vbE91dCAodG9rZW5zIHNlbnQgYnkgcG9vbCkuCmZ1bmMgKHIgKnJvdXRlclYxKSBzd2FwSW5uZXIoCglfIGludCwKCXJsbSByZWFsbSwKCWFtb3VudFNwZWNpZmllZCBpbnQ2NCwKCXJlY2lwaWVudCBhZGRyZXNzLAoJc3FydFByaWNlTGltaXRYOTYgKnUyNTYuVWludCwKCWRhdGEgU3dhcENhbGxiYWNrRGF0YSwKKSAoaW50NjQsIGludDY0KSB7Cglhc3NlcnRJc1JvdXRlclByb3h5UmVhbG0oMCwgcmxtKQoKCXRva2VuMFBhdGgsIHRva2VuMVBhdGggOj0gZGF0YS50b2tlbkluLCBkYXRhLnRva2VuT3V0Cgl6ZXJvRm9yT25lIDo9IGRhdGEudG9rZW5JbiA8IGRhdGEudG9rZW5PdXQKCglpZiAhemVyb0Zvck9uZSB7CgkJdG9rZW4wUGF0aCwgdG9rZW4xUGF0aCA9IHRva2VuMVBhdGgsIHRva2VuMFBhdGgKCX0KCglzcXJ0UHJpY2VMaW1pdFN0ciA6PSBjYWxjdWxhdGVTcXJ0UHJpY2VMaW1pdFRvU3RyKHplcm9Gb3JPbmUsIHNxcnRQcmljZUxpbWl0WDk2KQoKCWFtb3VudDBTdHIsIGFtb3VudDFTdHIgOj0gcGwuU3dhcCgKCQljcm9zcyhybG0pLAoJCXRva2VuMFBhdGgsCgkJdG9rZW4xUGF0aCwKCQlkYXRhLmZlZSwKCQlyZWNpcGllbnQsCgkJemVyb0Zvck9uZSwKCQl1dGlscy5Gb3JtYXRJbnQoYW1vdW50U3BlY2lmaWVkKSwKCQlzcXJ0UHJpY2VMaW1pdFN0ciwKCQlmdW5jKGN1ciByZWFsbSwgYW1vdW50MERlbHRhLCBhbW91bnQxRGVsdGEgaW50NjQsIF8gKnBsLkNhbGxiYWNrTWFya2VyKSBlcnJvciB7CgkJCS8vIGFzc2VydCBpcyBwb29sIHRvIHByZXZlbnQgdW5hdXRob3JpemVkIGNhbGxiYWNrCgkJCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCQkJYWNjZXNzLkFzc2VydElzUG9vbChjYWxsZXIpCgoJCQlyZXR1cm4gcm91dGVyLlN3YXBDYWxsYmFjayhjcm9zcyhjdXIpLCB0b2tlbjBQYXRoLCB0b2tlbjFQYXRoLCBhbW91bnQwRGVsdGEsIGFtb3VudDFEZWx0YSwgZGF0YS5wYXllcikKCQl9LAoJKQoKCWFtb3VudDAgOj0gaTI1Ni5NdXN0RnJvbURlY2ltYWwoYW1vdW50MFN0cikKCWFtb3VudDEgOj0gaTI1Ni5NdXN0RnJvbURlY2ltYWwoYW1vdW50MVN0cikKCglwb29sT3V0LCBwb29sUmVjdiA6PSBpMjU2TWluTWF4KGFtb3VudDAsIGFtb3VudDEpCglpZiBwb29sUmVjdi5Jc092ZXJmbG93KCkgfHwgcG9vbE91dC5Jc092ZXJmbG93KCkgewoJCXBhbmljKCJvdmVyZmxvdyBpbiBzd2FwSW5uZXIiKQoJfQoKCXJldHVybiBwb29sUmVjdi5JbnQ2NCgpLCBwb29sT3V0LkludDY0KCkKfQoKLy8gc3dhcERyeUlubmVyIHBlcmZvcm1zIGEgZHJ5LXJ1biBvZiBhIHN3YXAgb3BlcmF0aW9uIHdpdGhvdXQgZXhlY3V0aW5nIGl0LgpmdW5jIChyICpyb3V0ZXJWMSkgc3dhcERyeUlubmVyKAoJYW1vdW50U3BlY2lmaWVkIGludDY0LAoJc3FydFByaWNlTGltaXRYOTYgKnUyNTYuVWludCwKCWRhdGEgU3dhcENhbGxiYWNrRGF0YSwKKSAoaW50NjQsIGludDY0KSB7Cgl0b2tlbjBQYXRoLCB0b2tlbjFQYXRoIDo9IGRhdGEudG9rZW5JbiwgZGF0YS50b2tlbk91dAoJemVyb0Zvck9uZSA6PSBkYXRhLnRva2VuSW4gPCBkYXRhLnRva2VuT3V0CgoJaWYgIXplcm9Gb3JPbmUgewoJCXRva2VuMFBhdGgsIHRva2VuMVBhdGggPSB0b2tlbjFQYXRoLCB0b2tlbjBQYXRoCgl9CgoJc3FydFByaWNlTGltaXRTdHIgOj0gY2FsY3VsYXRlU3FydFByaWNlTGltaXRUb1N0cih6ZXJvRm9yT25lLCBzcXJ0UHJpY2VMaW1pdFg5NikKCgkvLyBjaGVjayBwb3NzaWJsZQoJYW1vdW50MFN0ciwgYW1vdW50MVN0ciwgZXJyIDo9IHBsLkRyeVN3YXAoCgkJdG9rZW4wUGF0aCwKCQl0b2tlbjFQYXRoLAoJCWRhdGEuZmVlLAoJCXplcm9Gb3JPbmUsCgkJdXRpbHMuRm9ybWF0SW50KGFtb3VudFNwZWNpZmllZCksCgkJc3FydFByaWNlTGltaXRTdHIsCgkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJYW1vdW50MCA6PSBpMjU2Lk11c3RGcm9tRGVjaW1hbChhbW91bnQwU3RyKQoJYW1vdW50MSA6PSBpMjU2Lk11c3RGcm9tRGVjaW1hbChhbW91bnQxU3RyKQoJaWYgYW1vdW50MC5TaWduKCkgPD0gMCAmJiBhbW91bnQxLlNpZ24oKSA8PSAwIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW5zdWZmaWNpZW50TGlxdWlkaXR5LAoJCQkic3dhcCBlbnRpcmVseSB3aXRoaW4gMC1saXF1aWRpdHkgcmVnaW9uIiwKCQkpKQoJfQoKCXBvb2xPdXQsIHBvb2xSZWN2IDo9IGkyNTZNaW5NYXgoYW1vdW50MCwgYW1vdW50MSkKCWlmIHBvb2xSZWN2LklzT3ZlcmZsb3coKSB8fCBwb29sT3V0LklzT3ZlcmZsb3coKSB7CgkJcGFuaWMoIm92ZXJmbG93IGluIHN3YXBEcnlJbm5lciIpCgl9CgoJcmV0dXJuIHBvb2xSZWN2LkludDY0KCksIHBvb2xPdXQuSW50NjQoKQp9CgovLyBjYWxjdWxhdGVTcXJ0UHJpY2VMaW1pdFRvU3RyIHJldHVybnMgdGhlIHByaWNlLWxpbWl0IHN0cmluZyBmb3IgYSBzd2FwIG9wZXJhdGlvbi4KLy8gQSBub24temVybyBjYWxsZXIgbGltaXQgaXMgZm9ybWF0dGVkIGFzLWlzOyBhIHplcm8gbGltaXQgdXNlcyB0aGUgZ2xvYmFsCi8vIFRpY2tNYXRoIGJvdW5kYXJ5IGZvciB0aGUgc3dhcCBkaXJlY3Rpb24uCmZ1bmMgY2FsY3VsYXRlU3FydFByaWNlTGltaXRUb1N0cih6ZXJvRm9yT25lIGJvb2wsIHNxcnRQcmljZUxpbWl0WDk2ICp1MjU2LlVpbnQpIHN0cmluZyB7CglpZiAhc3FydFByaWNlTGltaXRYOTYuSXNaZXJvKCkgewoJCXJldHVybiBzcXJ0UHJpY2VMaW1pdFg5Ni5Ub1N0cmluZygpCgl9CgoJaWYgemVyb0Zvck9uZSB7CgkJcmV0dXJuIE1JTl9TUVJUX1JBVElPX1BMVVNfT05FCgl9CglyZXR1cm4gTUFYX1NRUlRfUkFUSU9fTUlOVVNfT05FCn0KGowtCg5zd2FwX211bHRpLmdubxL5LHBhY2thZ2Ugcm91dGVyCgppbXBvcnQgKAoJcHJiYWMgImduby5sYW5kL3AvZ25vc3dhcC9yYmFjL3YxIgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCgoJImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCikKCi8vIG11bHRpU3dhcCBwZXJmb3JtcyBhIG11bHRpLWhvcCBleGFjdC1pbnB1dCBzd2FwIGluIGZvcndhcmQgb3JkZXIuCmZ1bmMgKHIgKnJvdXRlclYxKSBtdWx0aVN3YXAoXyBpbnQsIHJsbSByZWFsbSwgc3AgU3dhcFBhcmFtcywgbnVtUG9vbHMgaW50LCBzd2FwUGF0aCBzdHJpbmcpIChpbnQ2NCwgaW50NjQpIHsKCXBheWVyIDo9IHJsbS5QcmV2aW91cygpLkFkZHJlc3MoKQoJcm91dGVyQWRkciA6PSBhY2Nlc3MuTXVzdEdldEFkZHJlc3MocHJiYWMuUk9MRV9ST1VURVIuU3RyaW5nKCkpCglmaXJzdEFtb3VudEluIDo9IGludDY0KDApCgoJZm9yIGN1cnJlbnRQb29sSW5kZXggOj0gMDsgOyBjdXJyZW50UG9vbEluZGV4KysgewoJCWNhbGxiYWNrRGF0YSA6PSBuZXdTd2FwQ2FsbGJhY2tEYXRhKHNwLCBwYXllcikKCQlhbW91bnRJbiwgYW1vdW50T3V0IDo9IHIuc3dhcElubmVyKAoJCQkwLAoJCQlybG0sCgkJCXNwLmFtb3VudFNwZWNpZmllZCwKCQkJc3AucmVjaXBpZW50LAoJCQl1MjU2Llplcm8oKSwKCQkJY2FsbGJhY2tEYXRhLAoJCSkKCgkJLy8gZXZlcnkgaG9wIG9mIGEgZm9yd2FyZCBtdWx0aS1ob3Agc3dhcCBpcyBleGFjdC1pbgoJCWFzc2VydEhvcEZ1bGx5Q29uc3VtZWQoY3VycmVudFBvb2xJbmRleCwgc3AuYW1vdW50U3BlY2lmaWVkLCBhbW91bnRJbikKCgkJaWYgY3VycmVudFBvb2xJbmRleCA9PSAwIHsKCQkJZmlyc3RBbW91bnRJbiA9IGFtb3VudEluCgkJfQoKCQluZXh0UG9vbEluZGV4IDo9IGN1cnJlbnRQb29sSW5kZXggKyAxCgkJaWYgbmV4dFBvb2xJbmRleCA+PSBudW1Qb29scyB7CgkJCXJldHVybiBmaXJzdEFtb3VudEluLCBhbW91bnRPdXQKCQl9CgoJCXBheWVyID0gcm91dGVyQWRkcgoJCW5leHRJbnB1dCwgbmV4dE91dHB1dCwgbmV4dEZlZSA6PSBnZXREYXRhRm9yTXVsdGlQYXRoKHN3YXBQYXRoLCBuZXh0UG9vbEluZGV4KQoJCXNwLnRva2VuSW4gPSBuZXh0SW5wdXQKCQlzcC50b2tlbk91dCA9IG5leHRPdXRwdXQKCQlzcC5mZWUgPSBuZXh0RmVlCgkJc3AuYW1vdW50U3BlY2lmaWVkID0gYW1vdW50T3V0Cgl9Cn0KCi8vIG11bHRpU3dhcE5lZ2F0aXZlIHBlcmZvcm1zIGEgbXVsdGktaG9wIGV4YWN0LW91dHB1dCBzd2FwLiBJdCBmaXJzdCBxdW90ZXMKLy8gZXZlcnkgaG9wIGJhY2t3YXJkLCB0aGVuIGV4ZWN1dGVzIHRoZSBjb2xsZWN0ZWQgc3dhcHMgZm9yd2FyZC4KZnVuYyAociAqcm91dGVyVjEpIG11bHRpU3dhcE5lZ2F0aXZlKF8gaW50LCBybG0gcmVhbG0sIHNwIFN3YXBQYXJhbXMsIG51bVBvb2xzIGludCwgc3dhcFBhdGggc3RyaW5nKSAoaW50NjQsIGludDY0KSB7Cglzd2FwSW5mbyA6PSByLmNvbGxlY3RCYWNrd2FyZERyeVN3YXBJbmZvKHNwLlNpbmdsZVN3YXBQYXJhbXMsIG51bVBvb2xzLCBzd2FwUGF0aCkKCXJldHVybiByLmV4ZWN1dGVDb2xsZWN0ZWRTd2FwcygwLCBybG0sIHN3YXBJbmZvLCBzcC5yZWNpcGllbnQpCn0KCi8vIG11bHRpRHJ5U3dhcCBzaW11bGF0ZXMgYSBtdWx0aS1ob3AgZXhhY3QtaW5wdXQgc3dhcCBpbiBmb3J3YXJkIG9yZGVyLgpmdW5jIChyICpyb3V0ZXJWMSkgbXVsdGlEcnlTd2FwKHNwIFNpbmdsZVN3YXBQYXJhbXMsIG51bVBvb2xzIGludCwgc3dhcFBhdGggc3RyaW5nKSAoaW50NjQsIGludDY0LCBlcnJvcikgewoJZmlyc3RBbW91bnRJbiA6PSBpbnQ2NCgwKQoKCWZvciBjdXJyZW50UG9vbEluZGV4IDo9IDA7IDsgY3VycmVudFBvb2xJbmRleCsrIHsKCQlhbW91bnRJbiwgYW1vdW50T3V0IDo9IHIuc3dhcERyeUlubmVyKAoJCQlzcC5hbW91bnRTcGVjaWZpZWQsCgkJCXUyNTYuWmVybygpLAoJCQluZXdEcnlTd2FwQ2FsbGJhY2tEYXRhKHNwKSwKCQkpCgoJCS8vIG1pcnJvciB0aGUgcmVhbC1zd2FwIGZ1bGwtY29uc3VtcHRpb24gZ3VhcmQgc28gZHJ5IHJ1bnMgcHJlZGljdCByZXZlcnRzCgkJZXJyIDo9IHZhbGlkYXRlSG9wRnVsbHlDb25zdW1lZChjdXJyZW50UG9vbEluZGV4LCBzcC5hbW91bnRTcGVjaWZpZWQsIGFtb3VudEluKQoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gMCwgMCwgZXJyCgkJfQoKCQlpZiBjdXJyZW50UG9vbEluZGV4ID09IDAgewoJCQlmaXJzdEFtb3VudEluID0gYW1vdW50SW4KCQl9CgoJCW5leHRQb29sSW5kZXggOj0gY3VycmVudFBvb2xJbmRleCArIDEKCQlpZiBuZXh0UG9vbEluZGV4ID49IG51bVBvb2xzIHsKCQkJcmV0dXJuIGZpcnN0QW1vdW50SW4sIGFtb3VudE91dCwgbmlsCgkJfQoKCQluZXh0SW5wdXQsIG5leHRPdXRwdXQsIG5leHRGZWUgOj0gZ2V0RGF0YUZvck11bHRpUGF0aChzd2FwUGF0aCwgbmV4dFBvb2xJbmRleCkKCQlzcC50b2tlbkluID0gbmV4dElucHV0CgkJc3AudG9rZW5PdXQgPSBuZXh0T3V0cHV0CgkJc3AuZmVlID0gbmV4dEZlZQoJCXNwLmFtb3VudFNwZWNpZmllZCA9IGFtb3VudE91dAoJfQp9CgovLyBtdWx0aURyeVN3YXBOZWdhdGl2ZSBzaW11bGF0ZXMgYSBtdWx0aS1ob3AgZXhhY3Qtb3V0cHV0IHN3YXAuCi8vIEl0IGZpcnN0IHF1b3RlcyBldmVyeSBob3AgYmFja3dhcmQsIHRoZW4gc2ltdWxhdGVzIHRoZSBjb2xsZWN0ZWQgc3dhcHMgZm9yd2FyZC4KZnVuYyAociAqcm91dGVyVjEpIG11bHRpRHJ5U3dhcE5lZ2F0aXZlKHNwIFNpbmdsZVN3YXBQYXJhbXMsIG51bVBvb2xzIGludCwgc3dhcFBhdGggc3RyaW5nKSAoaW50NjQsIGludDY0LCBlcnJvcikgewoJc3dhcEluZm8gOj0gci5jb2xsZWN0QmFja3dhcmREcnlTd2FwSW5mbyhzcCwgbnVtUG9vbHMsIHN3YXBQYXRoKQoJcmV0dXJuIHIuZXhlY3V0ZUNvbGxlY3RlZERyeVN3YXBzKHN3YXBJbmZvKQp9CgovLyBjb2xsZWN0QmFja3dhcmREcnlTd2FwSW5mbyBxdW90ZXMgYW4gZXhhY3Qtb3V0cHV0IHJvdXRlIGJhY2t3YXJkIGJlZm9yZSByZWFsIGV4ZWN1dGlvbi4KZnVuYyAociAqcm91dGVyVjEpIGNvbGxlY3RCYWNrd2FyZERyeVN3YXBJbmZvKHNwIFNpbmdsZVN3YXBQYXJhbXMsIG51bVBvb2xzIGludCwgc3dhcFBhdGggc3RyaW5nKSBbXVNpbmdsZVN3YXBQYXJhbXMgewoJc3dhcEluZm8gOj0gbWFrZShbXVNpbmdsZVN3YXBQYXJhbXMsIDAsIG51bVBvb2xzKQoKCWZvciBjdXJyZW50UG9vbEluZGV4IDo9IG51bVBvb2xzIC0gMTsgY3VycmVudFBvb2xJbmRleCA+PSAwOyBjdXJyZW50UG9vbEluZGV4LS0gewoJCWFtb3VudEluLCBfIDo9IHIuc2luZ2xlRHJ5U3dhcCgmc3ApCgkJc3dhcEluZm8gPSBhcHBlbmQoc3dhcEluZm8sIHNwKQoKCQlpZiBjdXJyZW50UG9vbEluZGV4ID09IDAgewoJCQlicmVhawoJCX0KCgkJbmV4dFBvb2xJbmRleCA6PSBjdXJyZW50UG9vbEluZGV4IC0gMQoJCW5leHRJbnB1dCwgbmV4dE91dHB1dCwgbmV4dEZlZSA6PSBnZXREYXRhRm9yTXVsdGlQYXRoKHN3YXBQYXRoLCBuZXh0UG9vbEluZGV4KQoJCXNwLnRva2VuSW4gPSBuZXh0SW5wdXQKCQlzcC50b2tlbk91dCA9IG5leHRPdXRwdXQKCQlzcC5mZWUgPSBuZXh0RmVlCgkJc3AuYW1vdW50U3BlY2lmaWVkID0gLWFtb3VudEluCgl9CgoJcmV0dXJuIHN3YXBJbmZvCn0KCi8vIGV4ZWN1dGVDb2xsZWN0ZWRTd2FwcyBleGVjdXRlcyB0aGUgYmFja3dhcmQtcXVvdGVkIGV4YWN0LW91dHB1dCBzd2FwcyBpbiBmb3J3YXJkIG9yZGVyLgpmdW5jIChyICpyb3V0ZXJWMSkgZXhlY3V0ZUNvbGxlY3RlZFN3YXBzKF8gaW50LCBybG0gcmVhbG0sIHN3YXBJbmZvIFtdU2luZ2xlU3dhcFBhcmFtcywgcmVjaXBpZW50IGFkZHJlc3MpIChpbnQ2NCwgaW50NjQpIHsKCXBheWVyIDo9IHJsbS5QcmV2aW91cygpLkFkZHJlc3MoKQoJcm91dGVyQWRkciA6PSBhY2Nlc3MuTXVzdEdldEFkZHJlc3MocHJiYWMuUk9MRV9ST1VURVIuU3RyaW5nKCkpCglmaXJzdEFtb3VudEluIDo9IGludDY0KDApCgoJZm9yIGN1cnJlbnRQb29sSW5kZXggOj0gbGVuKHN3YXBJbmZvKSAtIDE7IGN1cnJlbnRQb29sSW5kZXggPj0gMDsgY3VycmVudFBvb2xJbmRleC0tIHsKCQlhbW91bnRJbiwgYW1vdW50T3V0IDo9IHIuc3dhcElubmVyKAoJCQkwLAoJCQlybG0sCgkJCXN3YXBJbmZvW2N1cnJlbnRQb29sSW5kZXhdLmFtb3VudFNwZWNpZmllZCwKCQkJcmVjaXBpZW50LAoJCQl1MjU2Llplcm8oKSwKCQkJbmV3U3dhcENhbGxiYWNrRGF0YShzd2FwSW5mb1tjdXJyZW50UG9vbEluZGV4XSwgcGF5ZXIpLAoJCSkKCgkJLy8gaG9wcyByZS1zcGVjaWZpZWQgZnJvbSB0aGUgcHJldmlvdXMgaG9wJ3MgYWN0dWFsIG91dHB1dCBydW4gYXMgZXhhY3QtaW4KCQkvLyAocG9zaXRpdmUgYW1vdW50U3BlY2lmaWVkKSBhbmQgbXVzdCBjb25zdW1lIHRoYXQgYW1vdW50IGVudGlyZWx5CgkJaWYgc3BlYyA6PSBzd2FwSW5mb1tjdXJyZW50UG9vbEluZGV4XS5hbW91bnRTcGVjaWZpZWQ7IHNwZWMgPiAwIHsKCQkJYXNzZXJ0SG9wRnVsbHlDb25zdW1lZChjdXJyZW50UG9vbEluZGV4LCBzcGVjLCBhbW91bnRJbikKCQl9CgoJCWlmIGN1cnJlbnRQb29sSW5kZXggPT0gbGVuKHN3YXBJbmZvKS0xIHsKCQkJZmlyc3RBbW91bnRJbiA9IGFtb3VudEluCgkJfQoKCQlpZiBjdXJyZW50UG9vbEluZGV4ID09IDAgewoJCQlyZXR1cm4gZmlyc3RBbW91bnRJbiwgYW1vdW50T3V0CgkJfQoKCQluZXh0UG9vbEluZGV4IDo9IGN1cnJlbnRQb29sSW5kZXggLSAxCgkJc3dhcEluZm9bbmV4dFBvb2xJbmRleF0uYW1vdW50U3BlY2lmaWVkID0gYW1vdW50T3V0CgkJcGF5ZXIgPSByb3V0ZXJBZGRyCgl9CgoJcmV0dXJuIGZpcnN0QW1vdW50SW4sIDAKfQoKZnVuYyAociAqcm91dGVyVjEpIGV4ZWN1dGVDb2xsZWN0ZWREcnlTd2Fwcyhzd2FwSW5mbyBbXVNpbmdsZVN3YXBQYXJhbXMpIChpbnQ2NCwgaW50NjQsIGVycm9yKSB7CglmaXJzdEFtb3VudEluIDo9IGludDY0KDApCgoJZm9yIGN1cnJlbnRQb29sSW5kZXggOj0gbGVuKHN3YXBJbmZvKSAtIDE7IGN1cnJlbnRQb29sSW5kZXggPj0gMDsgY3VycmVudFBvb2xJbmRleC0tIHsKCQlhbW91bnRJbiwgYW1vdW50T3V0IDo9IHIuc3dhcERyeUlubmVyKAoJCQlzd2FwSW5mb1tjdXJyZW50UG9vbEluZGV4XS5hbW91bnRTcGVjaWZpZWQsCgkJCXUyNTYuWmVybygpLAoJCQluZXdEcnlTd2FwQ2FsbGJhY2tEYXRhKHN3YXBJbmZvW2N1cnJlbnRQb29sSW5kZXhdKSwKCQkpCgoJCS8vIG1pcnJvciB0aGUgcmVhbC1zd2FwIGZ1bGwtY29uc3VtcHRpb24gZ3VhcmQgc28gZHJ5IHJ1bnMgcHJlZGljdCByZXZlcnRzCgkJaWYgc3BlYyA6PSBzd2FwSW5mb1tjdXJyZW50UG9vbEluZGV4XS5hbW91bnRTcGVjaWZpZWQ7IHNwZWMgPiAwIHsKCQkJZXJyIDo9IHZhbGlkYXRlSG9wRnVsbHlDb25zdW1lZChjdXJyZW50UG9vbEluZGV4LCBzcGVjLCBhbW91bnRJbikKCQkJaWYgZXJyICE9IG5pbCB7CgkJCQlyZXR1cm4gMCwgMCwgZXJyCgkJCX0KCQl9CgoJCWlmIGN1cnJlbnRQb29sSW5kZXggPT0gbGVuKHN3YXBJbmZvKS0xIHsKCQkJZmlyc3RBbW91bnRJbiA9IGFtb3VudEluCgkJfQoKCQlpZiBjdXJyZW50UG9vbEluZGV4ID09IDAgewoJCQlyZXR1cm4gZmlyc3RBbW91bnRJbiwgYW1vdW50T3V0LCBuaWwKCQl9CgoJCW5leHRQb29sSW5kZXggOj0gY3VycmVudFBvb2xJbmRleCAtIDEKCQlzd2FwSW5mb1tuZXh0UG9vbEluZGV4XS5hbW91bnRTcGVjaWZpZWQgPSBhbW91bnRPdXQKCX0KCglyZXR1cm4gZmlyc3RBbW91bnRJbiwgMCwgbmlsCn0KGtYHCg9zd2FwX3NpbmdsZS5nbm8SwgdwYWNrYWdlIHJvdXRlcgoKaW1wb3J0ICgKCXByYmFjICJnbm8ubGFuZC9wL2dub3N3YXAvcmJhYy92MSIKCXUyNTYgImduby5sYW5kL3AvZ25vc3dhcC91aW50MjU2L3YxIgoKCSJnbm8ubGFuZC9yL2dub3N3YXAvYWNjZXNzL3YxIgopCgovLyBzaW5nbGVTd2FwIGV4ZWN1dGVzIGEgc3dhcCB3aXRoaW4gYSBzaW5nbGUgcG9vbCB1c2luZyB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy4KLy8gSXQgcHJvY2Vzc2VzIGEgdG9rZW4gc3dhcCB3aXRoaW4gdHdvIGFzc2V0cyB1c2luZyBhIHNwZWNpZmljIGZlZSB0aWVyIGFuZAovLyBhdXRvbWF0aWNhbGx5IHNldHMgdGhlIHJlY2lwaWVudCB0byB0aGUgY2FsbGVyJ3MgYWRkcmVzcy4KZnVuYyAociAqcm91dGVyVjEpIHNpbmdsZVN3YXAoXyBpbnQsIHJsbSByZWFsbSwgcCAqU2luZ2xlU3dhcFBhcmFtcykgKGludDY0LCBpbnQ2NCkgewoJYXNzZXJ0U2luZ2xlU3dhcChwKQoKCWNhbGxlciA6PSBybG0uUHJldmlvdXMoKS5BZGRyZXNzKCkKCXJlY2lwaWVudCA6PSBhY2Nlc3MuTXVzdEdldEFkZHJlc3MocHJiYWMuUk9MRV9ST1VURVIuU3RyaW5nKCkpCgoJcmV0dXJuIHIuc3dhcElubmVyKAoJCTAsCgkJcmxtLAoJCXAuYW1vdW50U3BlY2lmaWVkLAoJCXJlY2lwaWVudCwKCQlwLlNxcnRQcmljZUxpbWl0WDk2KCksCgkJbmV3U3dhcENhbGxiYWNrRGF0YShwLCBjYWxsZXIpLAoJKQp9CgovLyBzaW5nbGVEcnlTd2FwIHNpbXVsYXRlcyBhIHNpbmdsZS10b2tlbiBzd2FwIG9wZXJhdGlvbiB3aXRob3V0IGV4ZWN1dGluZyBpdC4KZnVuYyAociAqcm91dGVyVjEpIHNpbmdsZURyeVN3YXAocCAqU2luZ2xlU3dhcFBhcmFtcykgKGludDY0LCBpbnQ2NCkgewoJYXNzZXJ0U2luZ2xlU3dhcChwKQoKCXJldHVybiByLnN3YXBEcnlJbm5lcigKCQlwLmFtb3VudFNwZWNpZmllZCwKCQl1MjU2Llplcm8oKSwKCQluZXdEcnlTd2FwQ2FsbGJhY2tEYXRhKHApLAoJKQp9ChquPAoIdHlwZS5nbm8SoTxwYWNrYWdlIHJvdXRlcgoKaW1wb3J0ICgKCXUyNTYgImduby5sYW5kL3AvZ25vc3dhcC91aW50MjU2L3YxIgoKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKY29uc3QgKAoJcmF3VW5rbm93biAgPSAiVU5LTk9XTiIKCXJhd0V4YWN0SW4gID0gIkVYQUNUX0lOIgoJcmF3RXhhY3RPdXQgPSAiRVhBQ1RfT1VUIgoKCXplcm9BZGRyZXNzID0gYWRkcmVzcygiIikKKQoKdHlwZSBTd2FwVHlwZSBzdHJpbmcKCmNvbnN0ICgKCVVua25vd24gU3dhcFR5cGUgPSByYXdVbmtub3duCgkvLyBFeGFjdEluIHJlcHJlc2VudHMgYSBzd2FwIHR5cGUgd2hlcmUgdGhlIGlucHV0IGFtb3VudCBpcyBleGFjdCBhbmQgdGhlIG91dHB1dCBhbW91bnQgbWF5IHZhcnkuCgkvLyBVc2VkIHdoZW4gYSB1c2VyIHdhbnRzIHRvIHN3YXAgYSBzcGVjaWZpYyBhbW91bnQgb2YgaW5wdXQgdG9rZW5zLgoJRXhhY3RJbiBTd2FwVHlwZSA9IHJhd0V4YWN0SW4KCgkvLyBFeGFjdE91dCByZXByZXNlbnRzIGEgc3dhcCB0eXBlIHdoZXJlIHRoZSBvdXRwdXQgYW1vdW50IGlzIGV4YWN0IGFuZCB0aGUgaW5wdXQgYW1vdW50IG1heSB2YXJ5LgoJLy8gVXNlZCB3aGVuIGEgdXNlciB3YW50cyB0byBzd2FwIGEgc3BlY2lmaWMgYW1vdW50IG9mIG91dHB1dCB0b2tlbnMuCglFeGFjdE91dCBTd2FwVHlwZSA9IHJhd0V4YWN0T3V0CikKCi8vIHRyeVN3YXBUeXBlRnJvbVN0ciBhdHRlbXB0cyB0byBjb252ZXJ0IGEgc3RyaW5nIGludG8gYSBTd2FwVHlwZS4KLy8gSXQgdmFsaWRhdGVzIGFuZCBjb252ZXJ0cyBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIHN3YXAgdHlwZXMgaW50byB0aGVpciBjb3JyZXNwb25kaW5nIGVudW0gdmFsdWVzLgpmdW5jIHRyeVN3YXBUeXBlRnJvbVN0cihzd2FwVHlwZSBzdHJpbmcpIChTd2FwVHlwZSwgZXJyb3IpIHsKCXN3aXRjaCBzd2FwVHlwZSB7CgljYXNlIHJhd0V4YWN0SW46CgkJcmV0dXJuIEV4YWN0SW4sIG5pbAoJY2FzZSByYXdFeGFjdE91dDoKCQlyZXR1cm4gRXhhY3RPdXQsIG5pbAoJZGVmYXVsdDoKCQlyZXR1cm4gIiIsIHVmbXQuRXJyb3JmKCJ1bmtub3duIHN3YXBUeXBlOiBleHBlY3RlZCBFeGFjdEluIG9yIEV4YWN0T3V0LCBnb3QgJXMiLCBzd2FwVHlwZSkKCX0KfQoKLy8gU3RyaW5nIHJldHVybnMgdGhlIHdpcmUtZm9ybWF0IHN0cmluZyBmb3IgYSBTd2FwVHlwZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN3YXBUeXBlOiBFWEFDVF9JTiBvciBFWEFDVF9PVVQgZm9yIGtub3duIHZhbHVlcywgb3IgYW4gZW1wdHkgc3RyaW5nIGZvciBVbmtub3duCmZ1bmMgKHMgU3dhcFR5cGUpIFN0cmluZygpIHN0cmluZyB7Cglzd2l0Y2ggcyB7CgljYXNlIEV4YWN0SW46CgkJcmV0dXJuIHJhd0V4YWN0SW4KCWNhc2UgRXhhY3RPdXQ6CgkJcmV0dXJuIHJhd0V4YWN0T3V0CglkZWZhdWx0OgoJCXJldHVybiAiIgoJfQp9CgovLyBTaW5nbGVTd2FwUGFyYW1zIGNvbnRhaW5zIHBhcmFtZXRlcnMgZm9yIGV4ZWN1dGluZyBhIHNpbmdsZSBwb29sIHN3YXAuCi8vIEl0IHJlcHJlc2VudHMgdGhlIHNpbXBsZXN0IGZvcm0gb2Ygc3dhcCB0aGF0IG9jY3VycyB3aXRoaW4gYSBzaW5nbGUgbGlxdWlkaXR5IHBvb2wuCnR5cGUgU2luZ2xlU3dhcFBhcmFtcyBzdHJ1Y3QgewoJdG9rZW5JbiAgc3RyaW5nIC8vIHRva2VuIHRvIHNwZW5kCgl0b2tlbk91dCBzdHJpbmcgLy8gdG9rZW4gdG8gcmVjZWl2ZQoJZmVlICAgICAgdWludDMyIC8vIGZlZSBvZiB0aGUgcG9vbCB1c2VkIHRvIHN3YXAKCgkvLyBBbW91bnQgc3BlY2lmaWVkIGZvciB0aGUgc3dhcDoKCS8vICAtIFBvc2l0aXZlOiBleGFjdCBpbnB1dCBhbW91bnQgKHRva2VuSW4pCgkvLyAgLSBOZWdhdGl2ZTogZXhhY3Qgb3V0cHV0IGFtb3VudCAodG9rZW5PdXQpCglhbW91bnRTcGVjaWZpZWQgaW50NjQKCglzcXJ0UHJpY2VMaW1pdFg5NiAqdTI1Ni5VaW50IC8vIHNxcnRQcmljZUxpbWl0WDk2IGZvciB0aGUgc3dhcCwgZW1wdHkgc3RyaW5nIG9yIHplcm8gc3RyaW5nIG1lYW5zIG5vIGxpbWl0Cn0KCi8vIFRva2VuSW4gcmV0dXJucyB0aGUgaW5wdXQgdG9rZW4gY29udHJhY3QgcGF0aC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRva2VuSW46IHRva2VuIHNwZW50IGJ5IHRoaXMgc2luZ2xlLXBvb2wgc3dhcApmdW5jIChwIFNpbmdsZVN3YXBQYXJhbXMpIFRva2VuSW4oKSBzdHJpbmcgeyByZXR1cm4gcC50b2tlbkluIH0KCi8vIFRva2VuT3V0IHJldHVybnMgdGhlIG91dHB1dCB0b2tlbiBjb250cmFjdCBwYXRoLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdG9rZW5PdXQ6IHRva2VuIHJlY2VpdmVkIGJ5IHRoaXMgc2luZ2xlLXBvb2wgc3dhcApmdW5jIChwIFNpbmdsZVN3YXBQYXJhbXMpIFRva2VuT3V0KCkgc3RyaW5nIHsgcmV0dXJuIHAudG9rZW5PdXQgfQoKLy8gRmVlIHJldHVybnMgdGhlIHBvb2wgZmVlIHRpZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBmZWU6IGZlZSB0aWVyIGVuY29kZWQgYXMgdGhlIHBvb2wncyB1aW50MzIgZmVlIHZhbHVlCmZ1bmMgKHAgU2luZ2xlU3dhcFBhcmFtcykgRmVlKCkgdWludDMyIHsgcmV0dXJuIHAuZmVlIH0KCi8vIFNxcnRQcmljZUxpbWl0WDk2IHJldHVybnMgdGhlIG9wdGlvbmFsIFE2NC45NiBzcXVhcmUtcm9vdCBwcmljZSBsaW1pdC4KLy8gQSBuaWwgc3RvcmVkIGxpbWl0IGlzIG5vcm1hbGl6ZWQgdG8gdGhlIHplcm8gdmFsdWUsIHdoaWNoIGNhbGxlcnMgaW50ZXJwcmV0IGFzIG5vIGV4cGxpY2l0IGxpbWl0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gbGltaXQ6IGNvbmZpZ3VyZWQgUTY0Ljk2IHByaWNlIGxpbWl0LCBvciBhIHplcm8gdWludCB3aGVuIG5vIGxpbWl0IHdhcyBzdXBwbGllZApmdW5jIChwIFNpbmdsZVN3YXBQYXJhbXMpIFNxcnRQcmljZUxpbWl0WDk2KCkgKnUyNTYuVWludCB7CglpZiBwLnNxcnRQcmljZUxpbWl0WDk2ID09IG5pbCB7CgkJcmV0dXJuIHUyNTYuWmVybygpCgl9CgoJcmV0dXJuIHAuc3FydFByaWNlTGltaXRYOTYKfQoKLy8gU3dhcFBhcmFtcyBjb250YWlucyBwYXJhbWV0ZXJzIGZvciBleGVjdXRpbmcgYSBtdWx0aS1ob3Agc3dhcCBvcGVyYXRpb24uCnR5cGUgU3dhcFBhcmFtcyBzdHJ1Y3QgewoJU2luZ2xlU3dhcFBhcmFtcwoJcmVjaXBpZW50IGFkZHJlc3MgLy8gYWRkcmVzcyB0byByZWNlaXZlIHRoZSB0b2tlbgp9CgovLyBUb2tlbkluIHJldHVybnMgdGhlIGlucHV0IHRva2VuIGNvbnRyYWN0IHBhdGguCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0b2tlbkluOiB0b2tlbiBzcGVudCBieSB0aGlzIG11bHRpLWhvcCBzd2FwIHBhcmFtZXRlcnMgb2JqZWN0CmZ1bmMgKHAgU3dhcFBhcmFtcykgVG9rZW5JbigpIHN0cmluZyB7IHJldHVybiBwLnRva2VuSW4gfQoKLy8gVG9rZW5PdXQgcmV0dXJucyB0aGUgb3V0cHV0IHRva2VuIGNvbnRyYWN0IHBhdGguCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0b2tlbk91dDogdG9rZW4gcmVjZWl2ZWQgYnkgdGhpcyBtdWx0aS1ob3Agc3dhcCBwYXJhbWV0ZXJzIG9iamVjdApmdW5jIChwIFN3YXBQYXJhbXMpIFRva2VuT3V0KCkgc3RyaW5nIHsgcmV0dXJuIHAudG9rZW5PdXQgfQoKLy8gRmVlIHJldHVybnMgdGhlIHBvb2wgZmVlIHRpZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBmZWU6IGZlZSB0aWVyIGVuY29kZWQgYXMgdGhlIHBvb2wncyB1aW50MzIgZmVlIHZhbHVlCmZ1bmMgKHAgU3dhcFBhcmFtcykgRmVlKCkgdWludDMyIHsgcmV0dXJuIHAuZmVlIH0KCi8vIFJlY2lwaWVudCByZXR1cm5zIHRoZSBhZGRyZXNzIHRoYXQgcmVjZWl2ZXMgc3dhcCBvdXRwdXQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZWNpcGllbnQ6IGNvbmZpZ3VyZWQgb3V0cHV0IHJlY2lwaWVudCBhZGRyZXNzCmZ1bmMgKHAgU3dhcFBhcmFtcykgUmVjaXBpZW50KCkgYWRkcmVzcyB7IHJldHVybiBwLnJlY2lwaWVudCB9CgovLyBuZXdTd2FwUGFyYW1zIGNyZWF0ZXMgYSBuZXcgU3dhcFBhcmFtcyBpbnN0YW5jZSB3aXRoIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLgpmdW5jIG5ld1N3YXBQYXJhbXModG9rZW5JbiwgdG9rZW5PdXQgc3RyaW5nLCBmZWUgdWludDMyLCByZWNpcGllbnQgYWRkcmVzcywgYW1vdW50U3BlY2lmaWVkIGludDY0KSAqU3dhcFBhcmFtcyB7CglyZXR1cm4gJlN3YXBQYXJhbXN7CgkJU2luZ2xlU3dhcFBhcmFtczogU2luZ2xlU3dhcFBhcmFtc3sKCQkJdG9rZW5JbjogICAgICAgICB0b2tlbkluLAoJCQl0b2tlbk91dDogICAgICAgIHRva2VuT3V0LAoJCQlmZWU6ICAgICAgICAgICAgIGZlZSwKCQkJYW1vdW50U3BlY2lmaWVkOiBhbW91bnRTcGVjaWZpZWQsCgkJfSwKCQlyZWNpcGllbnQ6IHJlY2lwaWVudCwKCX0KfQoKLy8gU3dhcFJlc3VsdCBlbmNhcHN1bGF0ZXMgdGhlIG91dGNvbWUgb2YgYSBzd2FwIG9wZXJhdGlvbi4KdHlwZSBTd2FwUmVzdWx0IHN0cnVjdCB7CglSb3V0ZXMgICAgICAgICAgW11zdHJpbmcKCVF1b3RlcyAgICAgICAgICBbXXN0cmluZwoJQW1vdW50SW4gICAgICAgIGludDY0CglBbW91bnRPdXQgICAgICAgaW50NjQKCUFtb3VudFNwZWNpZmllZCBpbnQ2NAp9CgovLyBTd2FwUGFyYW1zSSBkZWZpbmVzIHRoZSBjb21tb24gaW50ZXJmYWNlIGZvciBzd2FwIHBhcmFtZXRlcnMuCnR5cGUgU3dhcFBhcmFtc0kgaW50ZXJmYWNlIHsKCS8vIFRva2VuSW4gcmV0dXJucyB0aGUgaW5wdXQgdG9rZW4gcGF0aCByZXF1aXJlZCBieSBzd2FwIHByb2Nlc3NpbmcuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0b2tlbkluOiB0b2tlbiBzcGVudCBieSB0aGUgc3dhcAoJVG9rZW5JbigpIHN0cmluZwoJLy8gVG9rZW5PdXQgcmV0dXJucyB0aGUgb3V0cHV0IHRva2VuIHBhdGggcmVxdWlyZWQgYnkgc3dhcCBwcm9jZXNzaW5nLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdG9rZW5PdXQ6IHRva2VuIHJlY2VpdmVkIGJ5IHRoZSBzd2FwCglUb2tlbk91dCgpIHN0cmluZwoJLy8gRmVlIHJldHVybnMgdGhlIHBvb2wgZmVlIHRpZXIgcmVxdWlyZWQgYnkgc3dhcCBwcm9jZXNzaW5nLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZmVlOiBwb29sIGZlZSB0aWVyCglGZWUoKSB1aW50MzIKfQoKLy8gU3dhcENhbGxiYWNrRGF0YSBjb250YWlucyB0aGUgY2FsbGJhY2sgZGF0YSByZXF1aXJlZCBmb3Igc3dhcCBleGVjdXRpb24uCi8vIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHBhc3MgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGR1cmluZyB0aGUgc3dhcCBjYWxsYmFjayBwcm9jZXNzLAovLyBlbnN1cmluZyBwcm9wZXIgdG9rZW4gdHJhbnNmZXJzIGFuZCBwb29sIGRhdGEgdXBkYXRlcy4KdHlwZSBTd2FwQ2FsbGJhY2tEYXRhIHN0cnVjdCB7Cgl0b2tlbkluICBzdHJpbmcgIC8vIHRva2VuIHRvIHNwZW5kCgl0b2tlbk91dCBzdHJpbmcgIC8vIHRva2VuIHRvIHJlY2VpdmUKCWZlZSAgICAgIHVpbnQzMiAgLy8gZmVlIG9mIHRoZSBwb29sIHVzZWQgdG8gc3dhcAoJcGF5ZXIgICAgYWRkcmVzcyAvLyBhZGRyZXNzIHRvIHNwZW5kIHRoZSB0b2tlbgp9CgovLyBuZXdTd2FwQ2FsbGJhY2tEYXRhIGNyZWF0ZXMgYSBuZXcgU3dhcENhbGxiYWNrRGF0YSBmcm9tIGEgU3dhcFBhcmFtc0kuCmZ1bmMgbmV3U3dhcENhbGxiYWNrRGF0YShwYXJhbXMgU3dhcFBhcmFtc0ksIHBheWVyIGFkZHJlc3MpIFN3YXBDYWxsYmFja0RhdGEgewoJcmV0dXJuIFN3YXBDYWxsYmFja0RhdGF7CgkJdG9rZW5JbjogIHBhcmFtcy5Ub2tlbkluKCksCgkJdG9rZW5PdXQ6IHBhcmFtcy5Ub2tlbk91dCgpLAoJCWZlZTogICAgICBwYXJhbXMuRmVlKCksCgkJcGF5ZXI6ICAgIHBheWVyLAoJfQp9CgovLyBuZXdEcnlTd2FwQ2FsbGJhY2tEYXRhIGNyZWF0ZXMgY2FsbGJhY2sgZGF0YSBmb3IgYSBkcnkgc3dhcC4gVGhlIHBheWVyIGlzCi8vIGRlbGliZXJhdGVseSB0aGUgemVybyBhZGRyZXNzIGJlY2F1c2UgZHJ5IHN3YXBzIGRvIG5vdCBleGVjdXRlIGNhbGxiYWNrcyBvcgovLyB0b2tlbiB0cmFuc2ZlcnMuCmZ1bmMgbmV3RHJ5U3dhcENhbGxiYWNrRGF0YShwYXJhbXMgU3dhcFBhcmFtc0kpIFN3YXBDYWxsYmFja0RhdGEgewoJcmV0dXJuIFN3YXBDYWxsYmFja0RhdGF7CgkJdG9rZW5JbjogIHBhcmFtcy5Ub2tlbkluKCksCgkJdG9rZW5PdXQ6IHBhcmFtcy5Ub2tlbk91dCgpLAoJCWZlZTogICAgICBwYXJhbXMuRmVlKCksCgkJcGF5ZXI6ICAgIHplcm9BZGRyZXNzLAoJfQp9CgovLyBFeGFjdEluUGFyYW1zIGNvbnRhaW5zIHBhcmFtZXRlcnMgZm9yIGV4YWN0IGlucHV0IHN3YXBzLgp0eXBlIEV4YWN0SW5QYXJhbXMgc3RydWN0IHsKCUJhc2VTd2FwUGFyYW1zCglBbW91bnRJbiAgICAgaW50NjQKCUFtb3VudE91dE1pbiBpbnQ2NAp9CgovLyBOZXdFeGFjdEluUGFyYW1zIGNyZWF0ZXMgcGFyYW1ldGVycyBmb3IgYW4gZXhhY3QtaW5wdXQgc3dhcC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGJhc2VQYXJhbXM6IHNoYXJlZCB0b2tlbiwgcm91dGUsIHF1b3RlLCBwcmljZS1saW1pdCwgYW5kIGRlYWRsaW5lIHNldHRpbmdzCi8vICAgLSBhbW91bnRJbjogZXhhY3QgaW5wdXQgYW1vdW50IGluIHRva2VuIHVuaXRzOyBtdXN0IGJlIHBvc2l0aXZlIGJlZm9yZSBleGVjdXRpb24KLy8gICAtIGFtb3VudE91dE1pbjogbWluaW11bSBhY2NlcHRhYmxlIG91dHB1dCBhbW91bnQgaW4gdG9rZW4gdW5pdHMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHBhcmFtczogZXhhY3QtaW5wdXQgcGFyYW1ldGVycyBjb21iaW5pbmcgYmFzZVBhcmFtcyBhbmQgYW1vdW50IGxpbWl0cwpmdW5jIE5ld0V4YWN0SW5QYXJhbXMoCgliYXNlUGFyYW1zIEJhc2VTd2FwUGFyYW1zLAoJYW1vdW50SW4gaW50NjQsCglhbW91bnRPdXRNaW4gaW50NjQsCikgRXhhY3RJblBhcmFtcyB7CglyZXR1cm4gRXhhY3RJblBhcmFtc3sKCQlCYXNlU3dhcFBhcmFtczogYmFzZVBhcmFtcywKCQlBbW91bnRJbjogICAgICAgYW1vdW50SW4sCgkJQW1vdW50T3V0TWluOiAgIGFtb3VudE91dE1pbiwKCX0KfQoKLy8gRXhhY3RPdXRQYXJhbXMgY29udGFpbnMgcGFyYW1ldGVycyBmb3IgZXhhY3Qgb3V0cHV0IHN3YXBzLgp0eXBlIEV4YWN0T3V0UGFyYW1zIHN0cnVjdCB7CglCYXNlU3dhcFBhcmFtcwoJQW1vdW50T3V0ICAgaW50NjQKCUFtb3VudEluTWF4IGludDY0Cn0KCi8vIE5ld0V4YWN0T3V0UGFyYW1zIGNyZWF0ZXMgcGFyYW1ldGVycyBmb3IgYW4gZXhhY3Qtb3V0cHV0IHN3YXAuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBiYXNlUGFyYW1zOiBzaGFyZWQgdG9rZW4sIHJvdXRlLCBxdW90ZSwgcHJpY2UtbGltaXQsIGFuZCBkZWFkbGluZSBzZXR0aW5ncwovLyAgIC0gYW1vdW50T3V0OiByZXF1ZXN0ZWQgb3V0cHV0IGFtb3VudCBpbiB0b2tlbiB1bml0czsgbXVzdCBiZSBwb3NpdGl2ZSBiZWZvcmUgZXhlY3V0aW9uCi8vICAgLSBhbW91bnRJbk1heDogbWF4aW11bSBhY2NlcHRhYmxlIGlucHV0IGFtb3VudCBpbiB0b2tlbiB1bml0cwovLwovLyBSZXR1cm5zOgovLyAgIC0gcGFyYW1zOiBleGFjdC1vdXRwdXQgcGFyYW1ldGVycyBjb21iaW5pbmcgYmFzZVBhcmFtcyBhbmQgYW1vdW50IGxpbWl0cwpmdW5jIE5ld0V4YWN0T3V0UGFyYW1zKAoJYmFzZVBhcmFtcyBCYXNlU3dhcFBhcmFtcywKCWFtb3VudE91dCBpbnQ2NCwKCWFtb3VudEluTWF4IGludDY0LAopIEV4YWN0T3V0UGFyYW1zIHsKCXJldHVybiBFeGFjdE91dFBhcmFtc3sKCQlCYXNlU3dhcFBhcmFtczogYmFzZVBhcmFtcywKCQlBbW91bnRPdXQ6ICAgICAgYW1vdW50T3V0LAoJCUFtb3VudEluTWF4OiAgICBhbW91bnRJbk1heCwKCX0KfQoawlQKCXV0aWxzLmdubxK0VHBhY2thZ2Ugcm91dGVyCgppbXBvcnQgKAoJImJ5dGVzIgoJImVycm9ycyIKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJZ25zbWF0aCAiZ25vLmxhbmQvcC9nbm9zd2FwL2duc21hdGgvdjEiCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3V0aWxzL3YxIgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoJImduby5sYW5kL3IvZ25vc3dhcC9wb29sIgoKCWkyNTYgImduby5sYW5kL3AvZ25vc3dhcC9pbnQyNTYvdjEiCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKKQoKLy8gY2FsY3VsYXRlU3dhcEFtb3VudEJ5UXVvdGUgY2FsY3VsYXRlcyBzd2FwIGFtb3VudCBiYXNlZCBvbiBxdW90ZSBwZXJjZW50YWdlLgpmdW5jIGNhbGN1bGF0ZVN3YXBBbW91bnRCeVF1b3RlKGFtb3VudFNwZWNpZmllZCBpbnQ2NCwgcXVvdGUgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CglxdW90ZUludCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQocXVvdGUsIDEwLCA2NCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwLCB1Zm10LkVycm9yZigiaW52YWxpZCBxdW90ZSglcykiLCBxdW90ZSkKCX0KCglpZiBxdW90ZUludCA8IE1pblF1b3RlUGVyY2VudGFnZSB8fCBxdW90ZUludCA+IE1heFF1b3RlUGVyY2VudGFnZSB7CgkJcmV0dXJuIDAsIHVmbXQuRXJyb3JmKEVyckludmFsaWRRdW90ZVJhbmdlLCBxdW90ZUludCwgTWluUXVvdGVQZXJjZW50YWdlLCBNYXhRdW90ZVBlcmNlbnRhZ2UpCgl9CgoJdG9Td2FwIDo9IGduc21hdGguU2FmZU11bERpdkludDY0KGFtb3VudFNwZWNpZmllZCwgcXVvdGVJbnQsIFBFUkNFTlRBR0VfREVOT01JTkFUT1IpCglpZiB0b1N3YXAgPT0gMCB7CgkJcmV0dXJuIDAsIGVycm9ycy5OZXcoZXJySW52YWxpZFN3YXBBbW91bnQpCgl9CgoJcmV0dXJuIHRvU3dhcCwgbmlsCn0KCi8vIGFzc2VydEhvcHNJblJhbmdlIGVuc3VyZXMgdGhlIG51bWJlciBvZiBob3BzIGlzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgMS0zLgpmdW5jIGFzc2VydEhvcHNJblJhbmdlKGhvcHMgaW50KSB7Cglzd2l0Y2ggaG9wcyB7CgljYXNlIDEsIDIsIDM6CgkJcmV0dXJuCglkZWZhdWx0OgoJCXBhbmljKGVycm9ycy5OZXcoZXJySG9wc091dE9mUmFuZ2UpKQoJfQp9CgovLyBnZXREYXRhRm9yU2luZ2xlUGF0aCBleHRyYWN0cyB0b2tlbiBhZGRyZXNzZXMgYW5kIGZlZSBmcm9tIGEgc2luZ2xlIHBvb2wgcGF0aC4KLy8KLy8gSU1QT1JUQU5UOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdG9rZW5zIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgcm91dGUgc3RyaW5nLAovLyB3aGljaCByZXByZXNlbnRzIHRoZSBzd2FwIGRpcmVjdGlvbiAodG9rZW5Jbjp0b2tlbk91dDpmZWUpLCBOT1QgdGhlIGNhbm9uaWNhbCBwb29sIG9yZGVyaW5nLgpmdW5jIGdldERhdGFGb3JTaW5nbGVQYXRoKHBvb2xQYXRoIHN0cmluZykgKHRva2VuMCwgdG9rZW4xIHN0cmluZywgZmVlIHVpbnQzMikgewoJdG9rZW4wLCB0b2tlbjEsIGZlZSwgZXJyIDo9IGdldERhdGFGb3JTaW5nbGVQYXRoV2l0aEVycm9yKHBvb2xQYXRoKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXJldHVybiB0b2tlbjAsIHRva2VuMSwgZmVlCn0KCi8vIGdldERhdGFGb3JTaW5nbGVQYXRoV2l0aEVycm9yIGV4dHJhY3RzIHRva2VuIGFkZHJlc3NlcyBhbmQgZmVlIGZyb20gYSBzaW5nbGUgcG9vbCBwYXRoIHdpdGggZXJyb3IgaGFuZGxpbmcuCmZ1bmMgZ2V0RGF0YUZvclNpbmdsZVBhdGhXaXRoRXJyb3IocG9vbFBhdGggc3RyaW5nKSAoc3RyaW5nLCBzdHJpbmcsIHVpbnQzMiwgZXJyb3IpIHsKCXBvb2xQYXRoU3BsaXQgOj0gc3RyaW5ncy5TcGxpdChwb29sUGF0aCwgIjoiKQoJaWYgbGVuKHBvb2xQYXRoU3BsaXQpICE9IDMgewoJCXJldHVybiAiIiwgIiIsIDAsIG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQllcnJJbnZhbGlkUG9vbFBhdGgsCgkJCXVmbXQuU3ByaW50ZigibGVuKHBvb2xQYXRoU3BsaXQpICE9IDMsIHBvb2xQYXRoOiAlcyIsIHBvb2xQYXRoKSwKCQkpCgl9CgoJcG9vbFBhdGhTcGxpdFswXSA9IHN0cmluZ3MuVHJpbVNwYWNlKHBvb2xQYXRoU3BsaXRbMF0pCglwb29sUGF0aFNwbGl0WzFdID0gc3RyaW5ncy5UcmltU3BhY2UocG9vbFBhdGhTcGxpdFsxXSkKCglpZiBwb29sUGF0aFNwbGl0WzBdID09ICIiIHx8IHBvb2xQYXRoU3BsaXRbMV0gPT0gIiIgewoJCXJldHVybiAiIiwgIiIsIDAsIG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQllcnJJbnZhbGlkUG9vbFBhdGgsCgkJCXVmbXQuU3ByaW50ZigidG9rZW4gYWRkcmVzc2VzIGNhbm5vdCBiZSBlbXB0eTogJXMiLCBwb29sUGF0aCksCgkJKQoJfQoKCWYsIGVyciA6PSBzdHJjb252LkF0b2kocG9vbFBhdGhTcGxpdFsyXSkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiIiwgIiIsIDAsIG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQllcnJJbnZhbGlkUG9vbFBhdGgsCgkJCXVmbXQuU3ByaW50ZigiaW52YWxpZCBmZWU6ICVzIiwgcG9vbFBhdGhTcGxpdFsyXSksCgkJKQoJfQoKCXJldHVybiBwb29sUGF0aFNwbGl0WzBdLCBwb29sUGF0aFNwbGl0WzFdLCB1aW50MzIoZiksIG5pbAp9CgovLyBnZXREYXRhRm9yTXVsdGlQYXRoIGV4dHJhY3RzIHRva2VuIGFkZHJlc3NlcyBhbmQgZmVlIGZyb20gYSBtdWx0aS1ob3AgcGF0aCBhdCBzcGVjaWZpZWQgaW5kZXguCmZ1bmMgZ2V0RGF0YUZvck11bHRpUGF0aChwb3NzaWJsZVBhdGggc3RyaW5nLCBwb29sSWR4IGludCkgKHRva2VuMCwgdG9rZW4xIHN0cmluZywgZmVlIHVpbnQzMikgewoJcG9vbHMgOj0gc3RyaW5ncy5TcGxpdChwb3NzaWJsZVBhdGgsIFBPT0xfU0VQQVJBVE9SKQoKCXN3aXRjaCBwb29sSWR4IHsKCWNhc2UgMDoKCQlyZXR1cm4gZ2V0RGF0YUZvclNpbmdsZVBhdGgocG9vbHNbMF0pCgljYXNlIDE6CgkJcmV0dXJuIGdldERhdGFGb3JTaW5nbGVQYXRoKHBvb2xzWzFdKQoJY2FzZSAyOgoJCXJldHVybiBnZXREYXRhRm9yU2luZ2xlUGF0aChwb29sc1syXSkKCWRlZmF1bHQ6CgkJcmV0dXJuICIiLCAiIiwgdWludDMyKDApCgl9Cn0KCi8vIGkyNTZNaW5NYXggcmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWVzIG9mIHggYW5kIHkgaW4gbWluLW1heCBvcmRlci4KZnVuYyBpMjU2TWluTWF4KHgsIHkgKmkyNTYuSW50KSAobWluLCBtYXggKnUyNTYuVWludCkgewoJaWYgeC5MdCh5KSB8fCB4LkVxKHkpIHsKCQlyZXR1cm4geC5BYnMoKSwgeS5BYnMoKQoJfQoJcmV0dXJuIHkuQWJzKCksIHguQWJzKCkKfQoKLy8gdmFsaWRhdGVSb3V0ZVBhdGhzIHZhbGlkYXRlcyBtdWx0aXBsZSByb3V0ZSBwYXRocyB0byBlbnN1cmUgdGhleSBhbGwgc3RhcnQgd2l0aCBpbnB1dFRva2VuIGFuZCBlbmQgd2l0aCBvdXRwdXRUb2tlbi4KLy8gVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgY29tbWEtc2VwYXJhdGVkIHJvdXRlIHBhdGhzIGFuZCB2YWxpZGF0ZXMgZWFjaCBwYXRoIGluZGl2aWR1YWxseS4KLy8KLy8gVmFsaWRhdGVzOgovLyAtIEVhY2ggcm91dGUgcGF0aCBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIGlucHV0VG9rZW4KLy8gLSBFYWNoIHJvdXRlIHBhdGggZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgb3V0cHV0VG9rZW4KLy8gLSBSb3V0ZSBwYXRoIGZvcm1hdCBjb25zaXN0ZW5jeSAocHJldmVudHMgc3dhcC1kaXJlY3Rpb24gdnMgYWxwaGFiZXRpY2FsIHBvb2wgb3JkZXJpbmcgY29uZnVzaW9uKQovLwovLyBQYXJhbWV0ZXJzOgovLyAtIHJvdXRlUGF0aEFyclN0cmluZzogY29tbWEtc2VwYXJhdGVkIHJvdXRlIHBhdGhzIChlLmcuLCAiZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3Q6Z25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlM6NTAwLGduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90Omduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOjMwMDAiKQovLyAtIGlucHV0VG9rZW46IGV4cGVjdGVkIGZpcnN0IHRva2VuIGluIGFsbCByb3V0ZSBwYXRocwovLyAtIG91dHB1dFRva2VuOiBleHBlY3RlZCBsYXN0IHRva2VuIGluIGFsbCByb3V0ZSBwYXRocwovLwovLyBFeGFtcGxlczoKLy8gLSBTaW5nbGUgcm91dGU6ICJ0b2tlbkE6dG9rZW5COjUwMCIgd2l0aCBpbnB1dFRva2VuPSJ0b2tlbkEiLCBvdXRwdXRUb2tlbj0idG9rZW5CIgovLyAtIE11bHRpLXJvdXRlOiAidG9rZW5BOnRva2VuQjo1MDAsdG9rZW5BOnRva2VuQzozMDAwKlBPT0wqdG9rZW5DOnRva2VuQjo1MDAiIHdpdGggaW5wdXRUb2tlbj0idG9rZW5BIiwgb3V0cHV0VG9rZW49InRva2VuQiIKLy8KLy8gUmV0dXJucyBlcnJvciBpZiBhbnkgcm91dGUgcGF0aCB2YWxpZGF0aW9uIGZhaWxzLgpmdW5jIHZhbGlkYXRlUm91dGVQYXRocyhyb3V0ZVBhdGhBcnJTdHJpbmcsIGlucHV0VG9rZW4sIG91dHB1dFRva2VuIHN0cmluZykgZXJyb3IgewoJcm91dGVQYXRocyA6PSBzdHJpbmdzLlNwbGl0KHJvdXRlUGF0aEFyclN0cmluZywgIiwiKQoKCWZvciBfLCByb3V0ZVBhdGggOj0gcmFuZ2Ugcm91dGVQYXRocyB7CgkJaWYgZXJyIDo9IHZhbGlkYXRlUm91dGVQYXRoKHJvdXRlUGF0aCwgaW5wdXRUb2tlbiwgb3V0cHV0VG9rZW4pOyBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIGVycgoJCX0KCX0KCglyZXR1cm4gbmlsCn0KCi8vIHZhbGlkYXRlUm91dGVQYXRoIHZhbGlkYXRlcyBhIHNpbmdsZSByb3V0ZSBwYXRoIHRvIGVuc3VyZSBpdCBzdGFydHMgd2l0aCBpbnB1dFRva2VuIGFuZCBlbmRzIHdpdGggb3V0cHV0VG9rZW4uCi8vIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBib3RoIHNpbmdsZS1ob3AgYW5kIG11bHRpLWhvcCByb3V0ZSBwYXRocy4KLy8KLy8gVmFsaWRhdGVzOgovLyAtIFJvdXRlIHBhdGggc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBpbnB1dFRva2VuCi8vIC0gUm91dGUgcGF0aCBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCBvdXRwdXRUb2tlbgovLyAtIFByb3BlciB0b2tlbiBvcmRlcmluZyBpbiBzd2FwIGRpcmVjdGlvbiAobm90IGFscGhhYmV0aWNhbCBwb29sIG9yZGVyaW5nKQovLwovLyBSb3V0ZSBQYXRoIEZvcm1hdHM6Ci8vIC0gc2luZ2xlLWhvcDogInRva2VuQTp0b2tlbkI6ZmVlIiAoZGlyZWN0IHN3YXAgYmV0d2VlbiB0d28gdG9rZW5zKQovLyAtIG11bHRpLWhvcDogInRva2VuQTp0b2tlbkI6ZmVlMSpQT09MKnRva2VuQjp0b2tlbkM6ZmVlMiIgKHN3YXAgdGhyb3VnaCBpbnRlcm1lZGlhdGUgdG9rZW5zKQovLwovLyBQYXJhbWV0ZXJzOgovLyAtIHJvdXRlUGF0aDogc2luZ2xlIHJvdXRlIHBhdGggc3RyaW5nIChlLmcuLCAiZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3Q6Z25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlM6NTAwIikKLy8gLSBpbnB1dFRva2VuOiBleHBlY3RlZCBmaXJzdCB0b2tlbiBpbiB0aGUgcm91dGUgcGF0aAovLyAtIG91dHB1dFRva2VuOiBleHBlY3RlZCBsYXN0IHRva2VuIGluIHRoZSByb3V0ZSBwYXRoCi8vCi8vIEV4YW1wbGVzOgovLyAtIHNpbmdsZS1ob3A6ICJ0b2tlbkE6dG9rZW5COjUwMCIgd2l0aCBpbnB1dFRva2VuPSJ0b2tlbkEiLCBvdXRwdXRUb2tlbj0idG9rZW5CIgovLyAtIG11bHRpLWhvcDogInRva2VuQTp0b2tlbkI6MzAwMCpQT09MKnRva2VuQjp0b2tlbkM6NTAwIiB3aXRoIGlucHV0VG9rZW49InRva2VuQSIsIG91dHB1dFRva2VuPSJ0b2tlbkMiCi8vCi8vIFJldHVybnMgZXJyb3Igd2l0aCBzcGVjaWZpYyBkZXRhaWxzIGlmIHZhbGlkYXRpb24gZmFpbHMuCmZ1bmMgdmFsaWRhdGVSb3V0ZVBhdGgocm91dGVQYXRoLCBpbnB1dFRva2VuLCBvdXRwdXRUb2tlbiBzdHJpbmcpIGVycm9yIHsKCS8vIEV4dHJhY3QgZmlyc3QgYW5kIGxhc3QgdG9rZW5zIGZyb20gdGhlIHJvdXRlUGF0aAoJdmFyICgKCQlmaXJzdFRva2VuLCBsYXN0VG9rZW4gc3RyaW5nCgkJZXJyICAgICAgICAgICAgICAgICAgIGVycm9yCgkpCgoJLy8gbXVsdGktaG9wIHJvdXRlUGF0aAoJaWYgc3RyaW5ncy5Db250YWlucyhyb3V0ZVBhdGgsIFBPT0xfU0VQQVJBVE9SKSB7CgkJcG9vbHMgOj0gc3RyaW5ncy5TcGxpdChyb3V0ZVBhdGgsIFBPT0xfU0VQQVJBVE9SKQoKCQkvLyBHZXQgZmlyc3QgdG9rZW4gZnJvbSBmaXJzdCBwb29sCgkJZmlyc3RQb29sIDo9IHBvb2xzWzBdCgkJZmlyc3RUb2tlbiwgXywgXywgZXJyID0gZ2V0RGF0YUZvclNpbmdsZVBhdGhXaXRoRXJyb3IoZmlyc3RQb29sKQoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gZXJyCgkJfQoKCQkvLyBWYWxpZGF0ZSBob3AtdG8taG9wIGNvbnRpbnVpdHk6IG91dHB1dCB0b2tlbiBvZiBob3AgTiBtdXN0IGVxdWFsIGlucHV0IHRva2VuIG9mIGhvcCBOKzEKCQllcnIgPSB2YWxpZGF0ZVBvb2xQYXRoSG9wQ29udGludWl0eShwb29scykKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIGVycgoJCX0KCgkJLy8gR2V0IGxhc3QgdG9rZW4gZnJvbSBsYXN0IHBvb2wKCQlsYXN0UG9vbCA6PSBwb29sc1tsZW4ocG9vbHMpLTFdCgkJXywgbGFzdFRva2VuLCBfLCBlcnIgPSBnZXREYXRhRm9yU2luZ2xlUGF0aFdpdGhFcnJvcihsYXN0UG9vbCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIGVycgoJCX0KCX0gZWxzZSB7CgkJLy8gc2luZ2xlLWhvcCByb3V0ZVBhdGgKCQlmaXJzdFRva2VuLCBsYXN0VG9rZW4sIF8sIGVyciA9IGdldERhdGFGb3JTaW5nbGVQYXRoV2l0aEVycm9yKHJvdXRlUGF0aCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIGVycgoJCX0KCX0KCglpZiBmaXJzdFRva2VuID09ICIiIHx8IGxhc3RUb2tlbiA9PSAiIiB7CgkJcmV0dXJuIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRSb3V0ZVBhdGgsIHVmbXQuU3ByaW50ZigiZmlyc3RUb2tlbjogJXMsIGxhc3RUb2tlbjogJXMiLCBmaXJzdFRva2VuLCBsYXN0VG9rZW4pKQoJfQoKCS8vIFZhbGlkYXRlIGNvbnNpc3RlbmN5CglpZiBmaXJzdFRva2VuICE9IGlucHV0VG9rZW4gewoJCXJldHVybiBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJJbnZhbGlkUm91dGVGaXJzdFRva2VuLCB1Zm10LlNwcmludGYoImZpcnN0VG9rZW46ICVzLCBpbnB1dFRva2VuOiAlcyIsIGZpcnN0VG9rZW4sIGlucHV0VG9rZW4pKQoJfQoKCWlmIGxhc3RUb2tlbiAhPSBvdXRwdXRUb2tlbiB7CgkJcmV0dXJuIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRSb3V0ZUxhc3RUb2tlbiwgdWZtdC5TcHJpbnRmKCJsYXN0VG9rZW46ICVzLCBvdXRwdXRUb2tlbjogJXMiLCBsYXN0VG9rZW4sIG91dHB1dFRva2VuKSkKCX0KCglyZXR1cm4gbmlsCn0KCmZ1bmMgdmFsaWRhdGVQb29sUGF0aEhvcENvbnRpbnVpdHkocm91dGVQb29sUGF0aHMgW11zdHJpbmcpIGVycm9yIHsKCWlmIGxlbihyb3V0ZVBvb2xQYXRocykgPCAyIHsKCQlyZXR1cm4gbmlsCgl9CgoJXywgcHJldmlvdXNPdXQsIF8sIHBFcnIgOj0gZ2V0RGF0YUZvclNpbmdsZVBhdGhXaXRoRXJyb3Iocm91dGVQb29sUGF0aHNbMF0pCglpZiBwRXJyICE9IG5pbCB7CgkJcmV0dXJuIHBFcnIKCX0KCglmb3IgaSA6PSAxOyBpIDwgbGVuKHJvdXRlUG9vbFBhdGhzKTsgaSsrIHsKCQluZXh0SW4sIG5leHRPdXQsIF8sIG5FcnIgOj0gZ2V0RGF0YUZvclNpbmdsZVBhdGhXaXRoRXJyb3Iocm91dGVQb29sUGF0aHNbaV0pCgkJaWYgbkVyciAhPSBuaWwgewoJCQlyZXR1cm4gbkVycgoJCX0KCgkJaWYgcHJldmlvdXNPdXQgIT0gbmV4dEluIHsKCQkJcmV0dXJuIG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQkJZXJyUm91dGVIb3BEaXNjb25uZWN0ZWQsCgkJCQl1Zm10LlNwcmludGYoImhvcCAlZCBvdXRwdXQoJXMpICE9IGhvcCAlZCBpbnB1dCglcykiLCBpLTEsIHByZXZpb3VzT3V0LCBpLCBuZXh0SW4pLAoJCQkpCgkJfQoKCQlwcmV2aW91c091dCA9IG5leHRPdXQKCX0KCglyZXR1cm4gbmlsCn0KCi8vIHNwbGl0U2luZ2xlQ2hhciBzcGxpdHMgYSBzdHJpbmcgYnkgYSBzaW5nbGUgY2hhcmFjdGVyIHNlcGFyYXRvci4KLy8gVGhpcyBmdW5jdGlvbiBpcyBvcHRpbWl6ZWQgZm9yIHNwbGl0dGluZyBzdHJpbmdzIHdpdGggYSBzaW5nbGUtYnl0ZSBzZXBhcmF0b3IKLy8gYW5kIGlzIG1vcmUgbWVtb3J5IGVmZmljaWVudCB0aGFuIHN0cmluZ3MuU3BsaXQgZm9yIHRoaXMgdXNlIGNhc2UuCmZ1bmMgc3BsaXRTaW5nbGVDaGFyKHMgc3RyaW5nLCBzZXAgYnl0ZSkgW11zdHJpbmcgewoJaWYgcyA9PSAiIiB7CgkJcmV0dXJuIFtdc3RyaW5neyIifQoJfQoKCXJlc3VsdCA6PSBtYWtlKFtdc3RyaW5nLCAwLCBieXRlcy5Db3VudChbXWJ5dGUocyksIFtdYnl0ZXtzZXB9KSsxKQoJc3RhcnQgOj0gMAoJZm9yIGkgOj0gcmFuZ2UgcyB7CgkJaWYgc1tpXSA9PSBzZXAgewoJCQlyZXN1bHQgPSBhcHBlbmQocmVzdWx0LCBzW3N0YXJ0OmldKQoJCQlzdGFydCA9IGkgKyAxCgkJfQoJfQoJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgc1tzdGFydDpdKQoJcmV0dXJuIHJlc3VsdAp9CgovLyBwYXJzZVBvb2xQYXRoc0J5Um91dGVQYXRoQXJyIHBhcnNlcyByb3V0ZSBwYXRoIGFycmF5IHN0cmluZyBhbmQgcmV0dXJucyBhIHNsaWNlIG9mIHBvb2wgcGF0aHMuCi8vIFRoaXMgZnVuY3Rpb24gY29udmVydHMgcm91dGUgcGF0aHMgKHdoaWNoIG1haW50YWluIHN3YXAgZGlyZWN0aW9uKSBpbnRvIGNhbm9uaWNhbCBwb29sIHBhdGhzCi8vICh3aGljaCB1c2UgYWxwaGFiZXRpY2FsIHRva2VuIG9yZGVyaW5nKS4KLy8KLy8gVGhlIGZ1bmN0aW9uIHByb2Nlc3NlcyBjb21tYS1zZXBhcmF0ZWQgcm91dGUgcGF0aHMgYW5kIGV4dHJhY3RzIGluZGl2aWR1YWwgcG9vbCBpbmZvcm1hdGlvbgovLyBmcm9tIGVhY2ggcm91dGUsIGVuc3VyaW5nIHRva2VucyBhcmUgb3JkZXJlZCBhbHBoYWJldGljYWxseSBmb3IgY29uc2lzdGVudCBwb29sIGlkZW50aWZpY2F0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcm91dGVQYXRoQXJyOiBjb21tYS1zZXBhcmF0ZWQgcm91dGUgcGF0aHMgc3RyaW5nIGNvbnRhaW5pbmcgc2luZ2xlIG9yIG11bHRpLWhvcCByb3V0ZXMKLy8gICAgIEZvcm1hdCBleGFtcGxlczoKLy8gICAtIFNpbmdsZSByb3V0ZTogInRva2VuQTp0b2tlbkI6NTAwIgovLyAgIC0gTXVsdGlwbGUgcm91dGVzOiAidG9rZW5BOnRva2VuQjo1MDAsdG9rZW5DOnRva2VuRDozMDAwIgovLyAgIC0gTXVsdGktaG9wIHJvdXRlczogInRva2VuQTp0b2tlbkI6NTAwKlBPT0wqdG9rZW5COnRva2VuQzozMDAwIgovLwovLyBSZXR1cm5zOgovLyAtIFtdc3RyaW5nOiBzbGljZSBvZiBjYW5vbmljYWwgcG9vbCBwYXRocyB3aXRoIGFscGhhYmV0aWNhbGx5IG9yZGVyZWQgdG9rZW5zCi8vIC0gZXJyb3I6IHBhcnNpbmcgZXJyb3IgaWYgYW55IHJvdXRlIHBhdGggaXMgaW52YWxpZAovLwovLyBFeGFtcGxlOgovLwovLwlpbnB1dDogImduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90Omduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOjUwMCxnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdDpnbm8ubGFuZC9yL2dub3N3YXAvZ25zLkdOUzozMDAwIgovLwlvdXRwdXQ6IFsiZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlM6Z25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3Q6NTAwIiwgImduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOmduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90OjMwMDAiXQpmdW5jIHBhcnNlUG9vbFBhdGhzQnlSb3V0ZVBhdGhBcnIocm91dGVQYXRoQXJyIHN0cmluZykgKFtdc3RyaW5nLCBlcnJvcikgewoJcG9vbFBhdGhzIDo9IG1ha2UoW11zdHJpbmcsIDApCgoJZm9yIF8sIHJvdXRlUGF0aHMgOj0gcmFuZ2Ugc3RyaW5ncy5TcGxpdChyb3V0ZVBhdGhBcnIsICIsIikgewoJCWZvciBfLCByb3V0ZVBhdGggOj0gcmFuZ2Ugc3RyaW5ncy5TcGxpdChyb3V0ZVBhdGhzLCBQT09MX1NFUEFSQVRPUikgewoJCQl0b2tlbjBQYXRoLCB0b2tlbjFQYXRoLCBmZWUsIGVyciA6PSBnZXREYXRhRm9yU2luZ2xlUGF0aFdpdGhFcnJvcihyb3V0ZVBhdGgpCgkJCWlmIGVyciAhPSBuaWwgewoJCQkJcmV0dXJuIFtdc3RyaW5ne30sIGVycgoJCQl9CgoJCQlpZiB0b2tlbjBQYXRoID4gdG9rZW4xUGF0aCB7CgkJCQl0b2tlbjBQYXRoLCB0b2tlbjFQYXRoID0gdG9rZW4xUGF0aCwgdG9rZW4wUGF0aAoJCQl9CgoJCQlwb29sUGF0aCA6PSBwb29sLkdldFBvb2xQYXRoKHRva2VuMFBhdGgsIHRva2VuMVBhdGgsIGZlZSkKCQkJcG9vbFBhdGhzID0gYXBwZW5kKHBvb2xQYXRocywgcG9vbFBhdGgpCgkJfQoJfQoKCXJldHVybiBwb29sUGF0aHMsIG5pbAp9CgovLyBCdWlsZFNpbmdsZUhvcFJvdXRlUGF0aCBmb3JtYXRzIG9uZSByb3V0ZS1kaXJlY3Rpb24gc2luZ2xlLWhvcCBwYXRoLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5BOiBpbnB1dCB0b2tlbiBjb250cmFjdCBwYXRoCi8vICAgLSB0b2tlbkI6IG91dHB1dCB0b2tlbiBjb250cmFjdCBwYXRoCi8vICAgLSBmZWU6IHBvb2wgZmVlIHRpZXIgYXBwZW5kZWQgYXMgYSBkZWNpbWFsIHZhbHVlCi8vCi8vIFJldHVybnM6Ci8vICAgLSByb3V0ZVBhdGg6IHRva2VuQTp0b2tlbkI6ZmVlIGZvcm1hdHRlZCByb3V0ZSBzdHJpbmc7IHBhbmljcyBmb3IgZW1wdHkgb3IgaWRlbnRpY2FsIHRva2VucwpmdW5jIEJ1aWxkU2luZ2xlSG9wUm91dGVQYXRoKHRva2VuQSwgdG9rZW5CIHN0cmluZywgZmVlIHVpbnQzMikgc3RyaW5nIHsKCWlmIHRva2VuQSA9PSAiIiB8fCB0b2tlbkIgPT0gIiIgewoJCXBhbmljKCJ0b2tlbiBhZGRyZXNzZXMgY2Fubm90IGJlIGVtcHR5IikKCX0KCWlmIHRva2VuQSA9PSB0b2tlbkIgewoJCXBhbmljKCJ0b2tlbkEgYW5kIHRva2VuQiBjYW5ub3QgYmUgdGhlIHNhbWUiKQoJfQoKCXJldHVybiB0b2tlbkEgKyAiOiIgKyB0b2tlbkIgKyAiOiIgKyB1dGlscy5Gb3JtYXRVaW50KGZlZSkKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwSEwjm6uqSARILMTUzOTY4dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDBJzVBMPi0jqizwud5so4H6Lp9Zc4oYF/2VGlIjXCuuESQLPCPmgsJdH17CyyOb1Yo5R28Nu6CWVBfgesW9H4BEDWWGsPmrZUEXappaJymTVtWHDTCOwINBWWbgMwSpVc2KwaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data