Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
34B3EBB4D638E71488B4E4271CA2C5FDFAFAAE0FE8BE78554A5F987362458121
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
152,846,996
Requested gas limit
GAS USED
127,372,546
Gas consumed
FEE
152847ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1q5tjjv3kkslzwf2na9y9wk7e5a8ugph8xfsk04
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CoOyBgoML3ZtLm1fYWRkcGtnEvGxBgooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBLDsQYKBnJvdXRlchIcZ25vLmxhbmQvci9nbm9zd2FwL3JvdXRlci92MRqHRwoJUkVBRE1FLm1kEvlGIyBSb3V0ZXIKClN3YXAgcm91dGluZyBlbmdpbmUgZm9yIG9wdGltYWwgdHJhZGUgZXhlY3V0aW9uIGFjcm9zcyBwb29scy4KCiMjIE92ZXJ2aWV3CgpSb3V0ZXIgaGFuZGxlcyBzd2FwIGV4ZWN1dGlvbiBhY3Jvc3MgbXVsdGlwbGUgcG9vbHMsIGZpbmRpbmcgb3B0aW1hbCBwYXRocyBhbmQgbWFuYWdpbmcgc2xpcHBhZ2UgcHJvdGVjdGlvbiBmb3IgdHJhZGVycy4KCiMjIENvbmZpZ3VyYXRpb24KCi0gKipSb3V0ZXIgRmVlKio6IDE1IGJwcyAoMC4xNSUpIGJ5IGRlZmF1bHQgb24gb3V0cHV0IHRva2VuczsgY29uZmlndXJhYmxlIGJ5CiAgYWRtaW4vZ292ZXJuYW5jZSBmcm9tIDAgdGhyb3VnaCAxMDAwIGJwcyAoMOKAkzEwJSkKLSAqKk1heCBIb3BzKio6IDMgcG9vbHMgcGVyIHJvdXRlCi0gKipEZWFkbGluZSBCdWZmZXIqKjogNS0zMCBtaW51dGVzIHJlY29tbWVuZGVkIGZvciBsaXZlIHN3YXBzCgojIyBDb3JlIEZ1bmN0aW9ucwoKIyMjIGBFeGFjdEluU3dhcFJvdXRlYAoKU3dhcHMgYW4gZXhhY3QgaW5wdXQgYW1vdW50IGZvciBvdXRwdXQsIHN1YmplY3QgdG8gYSBtaW5pbXVtIG5ldCBvdXRwdXQuCgotIEZpeGVkIGlucHV0LCB2YXJpYWJsZSBvdXRwdXQKLSBUaGUgcmV0dXJuZWQgb3V0cHV0IGlzIGFmdGVyIHRoZSByb3V0ZXIgZmVlCi0gUmV2ZXJ0cyBpZiBvdXRwdXQgPCBhbW91bnRPdXRNaW4KLSBTdXBwb3J0cyBtdWx0aS1ob3Agcm91dGluZwoKIyMjIGBFeGFjdE91dFN3YXBSb3V0ZWAKClN3YXBzIGZvciBhIHJlcXVlc3RlZCBmaW5hbCB1c2VyIG91dHB1dCBhbW91bnQgd2l0aCBtYXhpbXVtIGlucHV0LiBUaGUKYGFtb3VudE91dGAgdGFyZ2V0IGlzIHBvc3Qtcm91dGVyLWZlZTogdGhlIHJvdXRlciByZXF1ZXN0cyB0aGUgY29ycmVzcG9uZGluZwpncm9zcyBwb29sIG91dHB1dCwgZGVkdWN0cyB0aGUgZmVlLCB0aGVuIHZhbGlkYXRlcyBhbmQgdHJhbnNmZXJzIHRoZSBuZXQgb3V0cHV0LgoKLSBXaXRoIG5vIHNpbmdsZS1ob3AgcHJpY2UgbGltaXQsIHRhcmdldHMgdGhlIHJlcXVlc3RlZCBwb3N0LWZlZSBvdXRwdXQgd2l0aGluCiAgdGhlIGltcGxlbWVudGF0aW9uJ3Mgc21hbGwgcGVyLWhvcCByb3VuZGluZyB0b2xlcmFuY2UKLSBBIG5vbnplcm8gc2luZ2xlLWhvcCBwcmljZSBsaW1pdCBtYXkgc3RvcCBlYXJseSBhbmQgcmV0dXJuIGEgcGFydGlhbCBvdXRwdXQKLSBSZXZlcnRzIGlmIGlucHV0ID4gYW1vdW50SW5NYXgKLSBDYWxjdWxhdGVzIHBhdGggYmFja3dhcmRzCgojIyMgYERyeVN3YXBSb3V0ZWAKClNpbXVsYXRlcyBhIHN3YXAgd2l0aG91dCBleGVjdXRpb24uCgotIEZyb250ZW5kIHByaWNlIHF1b3RlcwotIFNsaXBwYWdlIGNhbGN1bGF0aW9uCi0gUGF0aCB2YWxpZGF0aW9uCi0gTm8gZGVhZGxpbmUgY2hlY2sgb3IgdG9rZW4gdHJhbnNmZXIKCiMjIFRlY2huaWNhbCBEZXRhaWxzCgojIyMgUm91dGUgRm9ybWF0IHZzIFBvb2wgRm9ybWF0IC0gSU1QT1JUQU5UIERJU1RJTkNUSU9OCgojIyMjIFJvdXRlIEZvcm1hdCAoU3dhcCBEaXJlY3Rpb24pCgpSb3V0ZXMgaW4gdGhlIHJvdXRlciBmb2xsb3cgKipzd2FwIGRpcmVjdGlvbiBvcmRlcmluZyoqOiBgdG9rZW5Jbjp0b2tlbk91dDpmZWVgCgotIEZpcnN0IHRva2VuID0gSW5wdXQgdG9rZW4gKHdoYXQgeW91J3JlIHN3YXBwaW5nIEZST00pCi0gU2Vjb25kIHRva2VuID0gT3V0cHV0IHRva2VuICh3aGF0IHlvdSdyZSBzd2FwcGluZyBUTykKLSBUaGlzIHJlcHJlc2VudHMgdGhlIGFjdHVhbCBmbG93IG9mIHRoZSBzd2FwCgpFeGFtcGxlIGZvciBzd2FwcGluZyBHTlMgdG8gV1VHTk9UOgoKYGBgCmduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOmduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90OjMwMDAKYGBgCgojIyMjIFBvb2wgRm9ybWF0IChBbHBoYWJldGljYWwpCgpQb29scyBhcmUgaWRlbnRpZmllZCB1c2luZyAqKmFscGhhYmV0aWNhbCBvcmRlcmluZyoqOiBgdG9rZW4wOnRva2VuMTpmZWVgCgotIHRva2VuMCA8IHRva2VuMSAobGV4aWNvZ3JhcGhpY2FsbHkgc29ydGVkKQotIFRoaXMgaXMgdGhlIGNhbm9uaWNhbCBwb29sIGlkZW50aWZpZXIKCkV4YW1wbGUgcG9vbCBpZGVudGlmaWVyIChzYW1lIHBvb2wgYXMgYWJvdmUpOgoKYGBgCmduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90Omduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOjMwMDAgICMgZ25vbGFuZC93dWdub3QgPCBnbm9zd2FwL2ducyBhbHBoYWJldGljYWxseQpgYGAKCiMjIyMgS2V5IERpZmZlcmVuY2UKCi0gKipSb3V0ZXIgcm91dGVzKio6IEZvbGxvdyB5b3VyIHN3YXAgZGlyZWN0aW9uIChCQVLihpJCQVogbWVhbnMgYmFyOmJheiBpbiByb3V0ZSkKLSAqKlBvb2wgaWRlbnRpZmllcnMqKjogQWx3YXlzIGFscGhhYmV0aWNhbGx5IHNvcnRlZCAobWlnaHQgYmUgYmFyOmJheiBvciBiYXo6YmFyKQotIFRoZSByb3V0ZXIgYXV0b21hdGljYWxseSBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIGJldHdlZW4gdGhlc2UgZm9ybWF0cwoKIyMjIyBOYXRpdmUgVG9rZW4gUm91dGUgU3BlY2lmaWNhdGlvbgoKKipJTVBPUlRBTlQqKjogUm91dGVyIHN3YXAgZnVuY3Rpb25zIGRvICoqbm90KiogYWNjZXB0IG5hdGl2ZSBgdWdub3RgIGRpcmVjdGx5LgoKLSAqKlRva2VuIFBhcmFtZXRlcnMqKjogVXNlIHRva2VuIGtleXMgKGBwa2dQYXRoLlNZTUJPTGApIHN1Y2ggYXMgYCJnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdCJgCi0gKipSb3V0ZSBQYXRocyoqOiBBbHNvIHVzZSB0b2tlbiBrZXlzIChgcGtnUGF0aC5TWU1CT0xgKSBzdWNoIGFzIGAiZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3QiYAoKVGhpcyBtYXRjaGVzIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uOgoKLSBQb29scyBvcGVyYXRlIG9uIHRva2VuIGNvbnRyYWN0IHBhdGhzLCBpbmNsdWRpbmcgd3JhcHBlZCBHTk9UIChgd3Vnbm90YCkKLSBSb3V0ZXIgc3dhcCBlbnRyeXBvaW50cyByZWplY3QgbmF0aXZlLWNvaW4gaGFuZGxpbmcKLSBOYXRpdmUtdG9rZW4gcmVmdW5kIGFuZCB1bndyYXAgZmxvd3MgYXJlIG5vdCBwYXJ0IG9mIHRoZSBjdXJyZW50IHJvdXRlciBpbXBsZW1lbnRhdGlvbgoKIyMjIyBSb3V0ZSBTdHJpbmcgRm9ybWF0CgpTaW5nbGUtaG9wIGZvcm1hdDoKCmBgYAp0b2tlbkluOnRva2VuT3V0OmZlZQpgYGAKCk11bHRpLWhvcCBmb3JtYXQgKHVzaW5nIF9QT09MXyBzZXBhcmF0b3IpOgoKYGBgCnRva2VuSW46dG9rZW5COmZlZTEqUE9PTCp0b2tlbkI6dG9rZW5DOmZlZTIqUE9PTCp0b2tlbkM6dG9rZW5PdXQ6ZmVlMwpgYGAKClNpbmdsZS1ob3AgZXhhbXBsZToKCmBgYAojIFN3YXBwaW5nIEdOUyB0byBXVUdOT1QKUm91dGU6IGduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOmduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90OjMwMDAKIyBSb3V0ZXIgaW50ZXJwcmV0czogdG9rZW5Jbj1nbnMsIHRva2VuT3V0PXd1Z25vdCwgZmVlPTMwMDAKYGBgCgpNdWx0aS1ob3AgZXhhbXBsZSAoR05TIOKGkiBXVUdOT1Qg4oaSIFRPS0VOX0MpOgoKYGBgCiMgRWFjaCBzZWdtZW50IGZvbGxvd3Mgc3dhcCBkaXJlY3Rpb24sIGNvbm5lY3RlZCBieSAqUE9PTCoKZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlM6Z25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3Q6MzAwMCpQT09MKmduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90Omduby5sYW5kL3IvPG5hbWVzcGFjZT4vdG9rZW5fYy5UT0tFTl9DOjUwMApgYGAKCiMjIyBRdW90ZSBEaXN0cmlidXRpb24KClNwbGl0IGxhcmdlIHRyYWRlcyBhY3Jvc3Mgcm91dGVzIHRvIG1pbmltaXplIGltcGFjdDoKCi0gYHF1b3RlQXJyYDogcG9zaXRpdmUgcGVyY2VudGFnZSBwZXIgcm91dGUsIHdpdGggb25lIHF1b3RlIGZvciBlYWNoIHJvdXRlCi0gUXVvdGVzIG11c3Qgc3VtIHRvIDEwMDsgYXQgbW9zdCA3IHJvdXRlcyBhcmUgYWNjZXB0ZWQKLSBFeGFtcGxlOiAiMzAsNzAiID0gMzAlIHJvdXRlMSwgNzAlIHJvdXRlMgoKIyMjIE5hdGl2ZSBUb2tlbiBIYW5kbGluZwoKVGhlIGN1cnJlbnQgcm91dGVyIGltcGxlbWVudGF0aW9uIGRvZXMgKipub3QqKiBoYW5kbGUgbmF0aXZlIGB1Z25vdGAgZGlyZWN0bHkuIEl0IHJlamVjdHMgbmF0aXZlLWNvaW4gaGFuZGxpbmcgYW5kIHJvdXRlcyBzd2FwcyBvbmx5IHRocm91Z2ggdG9rZW4ga2V5cyAoYHBrZ1BhdGguU1lNQk9MYCkgc3VjaCBhcyB3cmFwcGVkIEdOT1QgKGB3dWdub3RgKS4KCiMjIyMgVG9rZW4gSWRlbnRpZmllciBSZXF1aXJlbWVudHMKCi0gVXNlIHRva2VuIGtleXMgKGBwa2dQYXRoLlNZTUJPTGApIHN1Y2ggYXMgYGduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90YCBmb3IgYm90aCBpbnB1dHMvb3V0cHV0cyBhbmQgcm91dGUgc3BlY2lmaWNhdGlvbnMuCi0gRG8gbm90IHBhc3MgYCJ1Z25vdCJgIGFzIGBpbnB1dFRva2VuYCBvciBgb3V0cHV0VG9rZW5gIHRvIHJvdXRlciBzd2FwIGZ1bmN0aW9ucy4KCiMjIyMgQXBwcm92YWwgYW5kIFRyYW5zZmVyIFJlcXVpcmVtZW50cwoKLSBBcHByb3ZlIHRoZSByb3V0ZXIgdG8gc3BlbmQgdGhlIHRva2VuIGNvbnRyYWN0IHlvdSBhcmUgc3dhcHBpbmcgZnJvbS4KLSBJZiB5b3Ugd2FudCB3cmFwcGVkIEdOT1QgZXhwb3N1cmUsIHVzZSB0aGUgYHd1Z25vdGAgdG9rZW4gY29udHJhY3QgcGF0aCBkaXJlY3RseS4KLSBOYXRpdmUtdG9rZW4gcmVmdW5kIGFuZCB1bndyYXAgZmxvd3MgYXJlIG5vdCBwYXJ0IG9mIHRoZSBjdXJyZW50IHJvdXRlciBpbXBsZW1lbnRhdGlvbi4KCkZvciBsaXZlIGxpcXVpZGl0eS1jaGFuZ2luZyBzd2FwczoKCi0gU2V0IGBhbW91bnRPdXRNaW4gPSBleHBlY3RlZCAqICgxIC0gc2xpcHBhZ2UlKWAKLSAwLjUtMSUgZm9yIHN0YWJsZSBwYWlycwotIDEtMyUgZm9yIHZvbGF0aWxlIHBhaXJzCi0gUmV2ZXJ0cyBpZiB0aGUgbmV0IG91dHB1dCBpcyBiZWxvdyB0aGUgbWluaW11bQoKIyMgVXNhZ2UKClRoZXNlIHNuaXBwZXRzIGNhbGwgdGhlIHB1YmxpYyBkb21haW4gcHJveHkgZnJvbSBhIHJlYWxtIGZ1bmN0aW9uIHdpdGggYSBjdXJyZW50IGBjdXJgIHRva2VuLgpJbXBvcnQgdGhlIHByb3h5IHBhY2thZ2UgYW5kIHF1YWxpZnkgaXRzIGZ1bmN0aW9uIG5hbWVzIGluIGludGVncmF0aW5nIGNvZGUuCgojIyMgQmFzaWMgVG9rZW4gU3dhcHMKCmBgYGdvCi8vIFNpbXBsZSBleGFjdCBpbnB1dCBzd2FwCmFtb3VudEluLCBhbW91bnRPdXQgOj0gRXhhY3RJblN3YXBSb3V0ZSgKICAgIGNyb3NzKGN1ciksCiAgICAiZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlMiLCAgICAgICAvLyBpbnB1dCB0b2tlbgogICAgImduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90IiwgLy8gb3V0cHV0IHRva2VuCiAgICAiMTAwMDAwMCIsICAgICAgICAgICAgICAgICAvLyBhbW91bnQgKDYgZGVjaW1hbHMpCiAgICAiZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlM6Z25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3Q6MzAwMCIsIC8vIHJvdXRlCiAgICAiMTAwIiwgICAgICAgICAgICAgICAgICAgICAvLyAxMDAlIHRocm91Z2ggcm91dGUKICAgICI5NTAwMDAiLCAgICAgICAgICAgICAgICAgIC8vIG1pbiBvdXRwdXQKICAgIHRpbWUuTm93KCkuVW5peCgpICsgMzAwLCAgIC8vIGRlYWRsaW5lCiAgICAiZzFyZWZlcnJlci4uLiIsICAgICAgICAgICAvLyByZWZlcnJhbAopCgovLyBNdWx0aS1ob3Agc3dhcApFeGFjdEluU3dhcFJvdXRlKAogICAgY3Jvc3MoY3VyKSwKICAgICJnbm8ubGFuZC9yL2dub3N3YXAvZ25zLkdOUyIsCiAgICAiZ25vLmxhbmQvci88bmFtZXNwYWNlPi90b2tlbl9jLlRPS0VOX0MiLAogICAgIjEwMDAwMDAiLAogICAgImduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOmduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90OjMwMDAqUE9PTCpnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdDpnbm8ubGFuZC9yLzxuYW1lc3BhY2U+L3Rva2VuX2MuVE9LRU5fQzozMDAwIiwKICAgICIxMDAiLAogICAgIjkwMDAwMCIsCiAgICBkZWFkbGluZSwKICAgICIiLAopCgovLyBTcGxpdCByb3V0ZSBmb3IgbGFyZ2UgdHJhZGVzCkV4YWN0SW5Td2FwUm91dGUoCiAgICBjcm9zcyhjdXIpLAogICAgImduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TIiwKICAgICJnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdCIsCiAgICAiMTAwMDAwMDAwMDAiLAogICAgImduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOmduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90OjUwMCxnbm8ubGFuZC9yL2dub3N3YXAvZ25zLkdOUzpnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdDozMDAwIiwKICAgICI2MCw0MCIsICAvLyA2MCUgdGhyb3VnaCAwLjA1JSwgNDAlIHRocm91Z2ggMC4zJQogICAgIjk1MDAwMDAwMDAiLAogICAgZGVhZGxpbmUsCiAgICAiIiwKKQpgYGAKClNpbmdsZS1ob3AgZnVuY3Rpb25zIHN1cHBvcnQgcGFydGlhbCBleGVjdXRpb24gdGhyb3VnaCBhIG5vbnplcm8KYHNxcnRQcmljZUxpbWl0WDk2YDoKCmBgYGdvCi8vIFBhcnRpYWwgc3dhcCB3aXRoIHByaWNlIGxpbWl0IC0gbWF5IG5vdCBjb25zdW1lIGZ1bGwgaW5wdXQgYW1vdW50CmFtb3VudEluLCBhbW91bnRPdXQgOj0gRXhhY3RJblNpbmdsZVN3YXBSb3V0ZSgKICAgIGNyb3NzKGN1ciksCiAgICAiZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlMiLCAgICAgICAvLyBpbnB1dCB0b2tlbgogICAgImduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90IiwgLy8gb3V0cHV0IHRva2VuCiAgICAiMTAwMDAwMCIsICAgICAgICAgICAgICAgICAvLyBtYXggYW1vdW50IHRvIHN3YXAKICAgICJnbm8ubGFuZC9yL2dub3N3YXAvZ25zLkdOUzpnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdDozMDAwIiwgLy8gc2luZ2xlIHJvdXRlCiAgICAiOTUwMDAwIiwgICAgICAgICAgICAgICAgICAvLyBtaW4gb3V0cHV0CiAgICAiMTAwMDAwMDAwMDAwMDAwMDAwMCIsICAgICAvLyBzcXJ0UHJpY2VMaW1pdFg5NiAocHJpY2UgbGltaXQpCiAgICBkZWFkbGluZSwKICAgICIiLAopCi8vIElmIHRoZSBwcmljZSBsaW1pdCBpcyByZWFjaGVkLCBvbmx5IGEgcGFydGlhbCBhbW91bnQgaXMgc3dhcHBlZC4gRm9yIGV4YWN0LWluCi8vIHRoaXMgY2FuIGNvbnN1bWUgbGVzcyBpbnB1dDsgZXhhY3Qtb3V0IGNhbiBkZWxpdmVyIGxlc3MgdGhhbiBpdHMgdGFyZ2V0LgovLyBhbW91bnRPdXRNaW4gb3IgYW1vdW50SW5NYXggcmVtYWlucyBlbmZvcmNlZCwgcmVzcGVjdGl2ZWx5LgpgYGAKCiMjIEltcG9ydGFudCBEZXZlbG9wZXIgTm90ZXMKCiMjIyBDb21tb24gSW50ZWdyYXRpb24gUGl0ZmFsbHMKCjEuICoqTmF0aXZlIFRva2VuIEFzc3VtcHRpb25zKio6IFBhc3NpbmcgYCJ1Z25vdCJgIHRvIHJvdXRlciBzd2FwIGZ1bmN0aW9ucyB3aWxsIGZhaWwgYmVjYXVzZSByb3V0ZXIgZW50cnlwb2ludHMgcmVqZWN0IG5hdGl2ZS1jb2luIGhhbmRsaW5nLgoKMi4gKipSb3V0ZSB2cyBUb2tlbiBJZGVudGlmaWVyIENvbmZ1c2lvbioqOiBVc2luZyBgInVnbm90ImAgaW4gcm91dGUgc3RyaW5ncyBpbnN0ZWFkIG9mIGAiZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3QiYCB3aWxsIGNhdXNlIHRyYW5zYWN0aW9ucyB0byBmYWlsIHNpbmNlIG5vIHBvb2xzIGV4aXN0IGZvciB0aGUgYCJ1Z25vdCJgIGlkZW50aWZpZXIuCgozLiAqKldyb25nIFRva2VuIFBhdGgqKjoKCiAgIC0gVXNlIGBnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdGAgd2hlbiBzd2FwcGluZyB3cmFwcGVkIEdOT1QKICAgLSBEbyBub3QgcGFzcyBuYXRpdmUgYHVnbm90YCB0byByb3V0ZXIgc3dhcCBmdW5jdGlvbnMKICAgLSBSb3V0ZSBzdHJpbmdzIG11c3Qgc3RheSBpbiBzd2FwLWRpcmVjdGlvbiBvcmRlciBhbmQgdXNlIHRva2VuIGNvbnRyYWN0IHBhdGhzCgojIyMgRnJvbnRlbmQgSW50ZWdyYXRpb24gQ2hlY2tsaXN0CgotIFsgXSBJbXBsZW1lbnQgV1VHTk9UIGFwcHJvdmFsIGJlZm9yZSB3cmFwcGVkLUdOT1Qgc3dhcHMKLSBbIF0gVXNlIHRva2VuIGtleXMgKGBwa2dQYXRoLlNZTUJPTGApIHN1Y2ggYXMgYCJnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdCJgIGZvciBib3RoIHBhcmFtZXRlcnMgYW5kIHJvdXRlcwotIFsgXSBUZXN0IGJvdGggcGFydGlhbCBhbmQgZnVsbCBzd2FwIHNjZW5hcmlvcwotIFsgXSBJbXBsZW1lbnQgcHJvcGVyIGVycm9yIGhhbmRsaW5nIGZvciBmYWlsZWQgYXBwcm92YWxzCgpCb3RoIHNpbmdsZS1ob3AgZnVuY3Rpb25zIHN1cHBvcnQgcGFydGlhbCBleGVjdXRpb24gd2hlbgpgc3FydFByaWNlTGltaXRYOTZgIGlzIG5vbnplcm86CgotIEV4YWN0LWluIG1heSBjb25zdW1lIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkIGlucHV0IGFtb3VudAotIEV4YWN0LW91dCBtYXkgZGVsaXZlciBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBwb3N0LWZlZSBvdXRwdXQKLSBUaGUgcmVsZXZhbnQgYW1vdW50IGxpbWl0IChgYW1vdW50T3V0TWluYCBvciBgYW1vdW50SW5NYXhgKSBzdGlsbCBhcHBsaWVzCi0gUmVtYWluaW5nIGlucHV0IHRva2VucyBzdGF5IHdpdGggdGhlIHVzZXIgYmVjYXVzZSB0aGUgcm91dGVyIHVzZXMgdG9rZW4KICBjb250cmFjdCB0cmFuc2ZlcnMKLSBBIHplcm8gbGltaXQgdXNlcyB0aGUgZ2xvYmFsIHRpY2stbWF0aCBib3VuZGFyeSBhbmQgcHJlc2VydmVzIGZ1bGwgZXhhY3QKICBzZW1hbnRpY3MKCiMjIFNlY3VyaXR5CgotIFBhdGggdmFsaWRhdGlvbiBjaGVja3Mgc3ludGF4LCBlbmRwb2ludHMsIGhvcCBjb250aW51aXR5LCBhbmQgcG9vbCBleGlzdGVuY2U7CiAgaXQgZG9lcyBub3QgcmVqZWN0IGNpcmN1bGFyIHJvdXRlcwotIERlYWRsaW5lIHByZXZlbnRzIHN0YWxlIGxpdmUgdHJhbnNhY3Rpb25zCi0gU2xpcHBhZ2UgbGltaXRzIHByb3RlY3QgYWdhaW5zdCB1bmZhdm9yYWJsZSBleGVjdXRpb24KLSBUaGUgcm91dGVyIGZlZSByYXRlIGlzIGNvbmZpZ3VyYWJsZTsgdGhlIGN1cnJlbnQgcmF0ZSBpcyBmaXhlZCBkdXJpbmcgb25lCiAgZXhlY3V0aW9uCi0gV1VHTk9UIGFwcHJvdmFsIHJlcXVpcmVtZW50IHByZXZlbnRzIHVuYXV0aG9yaXplZCB0b2tlbiB0cmFuc2ZlcnMKGusXCgphc3NlcnQuZ25vEtwXcGFja2FnZSByb3V0ZXIKCmltcG9ydCAoCgkiZXJyb3JzIgoJInN0cmluZ3MiCgkidGltZSIKCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCgoJImduby5sYW5kL3IvZ25vc3dhcC9wb29sIgoKCSJnbm8ubGFuZC9yL2dub3N3YXAvY29tbW9uIgopCgovLyBhc3NlcnRJc05vdEV4cGlyZWQgZW5zdXJlcyB0aGUgdHJhbnNhY3Rpb24gZGVhZGxpbmUgaGFzIG5vdCBwYXNzZWQuCmZ1bmMgYXNzZXJ0SXNOb3RFeHBpcmVkKGRlYWRsaW5lIGludDY0KSB7Cglub3cgOj0gdGltZS5Ob3coKS5Vbml4KCkKCglpZiBub3cgPiBkZWFkbGluZSB7CgkJcGFuaWMobWFrZUVycm9yV2l0aERldGFpbHMoCgkJCWVyckV4cGlyZWQsCgkJCXVmbXQuU3ByaW50ZigidHJhbnNhY3Rpb24gdG9vIG9sZCwgbm93KCVkKSA+IGRlYWRsaW5lKCVkKSIsIG5vdywgZGVhZGxpbmUpLAoJCSkpCgl9Cn0KCmZ1bmMgYXNzZXJ0U2luZ2xlU3dhcChwICpTaW5nbGVTd2FwUGFyYW1zKSB7CglpZiBwLnRva2VuSW4gPT0gcC50b2tlbk91dCB7CgkJcGFuaWMoZXJyb3JzLk5ldyhlcnJTYW1lVG9rZW5Td2FwKSkKCX0KCgljb21tb24uTXVzdFJlZ2lzdGVyZWQocC50b2tlbkluLCBwLnRva2VuT3V0KQp9CgpmdW5jIGFzc2VydElzVmFsaWRTcXJ0UHJpY2VMaW1pdFg5NihzcXJ0UHJpY2VMaW1pdFg5NiBzdHJpbmcpIHsKCWlmIHNxcnRQcmljZUxpbWl0WDk2ID09ICIiIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW52YWxpZElucHV0LAoJCQl1Zm10LlNwcmludGYoImludmFsaWQgc3FydFByaWNlTGltaXRYOTY6ICVzIiwgc3FydFByaWNlTGltaXRYOTYpLAoJCSkpCgl9CgoJXywgZXJyIDo9IHUyNTYuRnJvbURlY2ltYWwoc3FydFByaWNlTGltaXRYOTYpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW52YWxpZElucHV0LAoJCQl1Zm10LlNwcmludGYoImludmFsaWQgc3FydFByaWNlTGltaXRYOTY6ICVzIiwgc3FydFByaWNlTGltaXRYOTYpLAoJCSkpCgl9Cn0KCmZ1bmMgYXNzZXJ0SXNWYWxpZFNpbmdsZVN3YXBSb3V0ZUFyclBhdGgocm91dGVQYXRocywgaW5wdXRUb2tlbiwgb3V0cHV0VG9rZW4gc3RyaW5nKSB7CglpZiByb3V0ZVBhdGhzID09ICIiIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW52YWxpZElucHV0LAoJCQl1Zm10LlNwcmludGYoImludmFsaWQgcm91dGU6ICVzIiwgcm91dGVQYXRocyksCgkJKSkKCX0KCglpZiBzdHJpbmdzLkNvdW50KHJvdXRlUGF0aHMsICIsIikgPiAwIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW52YWxpZElucHV0LAoJCQl1Zm10LlNwcmludGYoImludmFsaWQgcm91dGVQYXRoczogJXMiLCByb3V0ZVBhdGhzKSwKCQkpKQoJfQoKCWlmIHN0cmluZ3MuQ291bnQocm91dGVQYXRocywgUE9PTF9TRVBBUkFUT1IpID4gMCB7CgkJcGFuaWMobWFrZUVycm9yV2l0aERldGFpbHMoCgkJCWVyckludmFsaWRJbnB1dCwKCQkJdWZtdC5TcHJpbnRmKCJpbnZhbGlkIHJvdXRlUGF0aHM6ICVzIiwgcm91dGVQYXRocyksCgkJKSkKCX0KCglhc3NlcnRJc1ZhbGlkUm91dGVQYXRocyhyb3V0ZVBhdGhzLCBpbnB1dFRva2VuLCBvdXRwdXRUb2tlbikKfQoKZnVuYyBhc3NlcnRJc1ZhbGlkUm91dGVQYXRocyhyb3V0ZVBhdGhzLCBpbnB1dFRva2VuLCBvdXRwdXRUb2tlbiBzdHJpbmcpIHsKCWVyciA6PSB2YWxpZGF0ZVJvdXRlUGF0aHMocm91dGVQYXRocywgaW5wdXRUb2tlbiwgb3V0cHV0VG9rZW4pCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cn0KCmZ1bmMgYXNzZXJ0SXNFeGlzdHNQb29scyhyb3V0ZVBhdGhBcnIgc3RyaW5nKSB7Cglwb29sUGF0aHMsIGVyciA6PSBwYXJzZVBvb2xQYXRoc0J5Um91dGVQYXRoQXJyKHJvdXRlUGF0aEFycikKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglmb3IgXywgcG9vbFBhdGggOj0gcmFuZ2UgcG9vbFBhdGhzIHsKCQlpZiAhcG9vbC5FeGlzdHNQb29sUGF0aChwb29sUGF0aCkgewoJCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJCWVyckludmFsaWRJbnB1dCwKCQkJCXVmbXQuU3ByaW50ZigicG9vbCBkb2VzIG5vdCBleGlzdDogJXMiLCBwb29sUGF0aCksCgkJCSkpCgkJfQoJfQp9CgpmdW5jIGFzc2VydElzUm91dGVySW1wbGVtZW50YXRpb24oY2FsbGVyIGFkZHJlc3MpIHsKCWlmIGNhbGxlciAhPSByb3V0ZXJJbXBsQWRkciB7CgkJcGFuaWMobWFrZUVycm9yV2l0aERldGFpbHMoCgkJCWVyclVuQXV0aG9yaXplZENhbGxlciwKCQkJdWZtdC5TcHJpbnRmKCJjYWxsZXIgJXMgaXMgbm90IHJvdXRlciBpbXBsZW1lbnRhdGlvbiglcykiLCBjYWxsZXIsIHJvdXRlckltcGxBZGRyKSwKCQkpKQoJfQp9CgovLyBhc3NlcnRIb3BGdWxseUNvbnN1bWVkIHJldmVydHMgd2hlbiBhbiBleGFjdC1pbiBob3AgY29uc3VtZWQgbGVzcyBpbnB1dCB0aGFuIHNwZWNpZmllZC4KZnVuYyBhc3NlcnRIb3BGdWxseUNvbnN1bWVkKGhvcEluZGV4IGludCwgc3BlY2lmaWVkQW1vdW50LCBjb25zdW1lZEFtb3VudCBpbnQ2NCkgewoJZXJyIDo9IHZhbGlkYXRlSG9wRnVsbHlDb25zdW1lZChob3BJbmRleCwgc3BlY2lmaWVkQW1vdW50LCBjb25zdW1lZEFtb3VudCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KfQoKZnVuYyB2YWxpZGF0ZUhvcEZ1bGx5Q29uc3VtZWQoaG9wSW5kZXggaW50LCBzcGVjaWZpZWRBbW91bnQsIGNvbnN1bWVkQW1vdW50IGludDY0KSBlcnJvciB7CglpZiBjb25zdW1lZEFtb3VudCAhPSBzcGVjaWZpZWRBbW91bnQgewoJCXJldHVybiBtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW5zdWZmaWNpZW50TGlxdWlkaXR5LAoJCQl1Zm10LlNwcmludGYoInBhcnRpYWwgZmlsbCBvbiBob3AoJWQpOiByZXF1ZXN0ZWQ9JWQsIGNvbnN1bWVkPSVkIiwgaG9wSW5kZXgsIHNwZWNpZmllZEFtb3VudCwgY29uc3VtZWRBbW91bnQpLAoJCSkKCX0KCglyZXR1cm4gbmlsCn0KGr1DCghiYXNlLmdubxKwQ3BhY2thZ2Ugcm91dGVyCgppbXBvcnQgKAoJImVycm9ycyIKCSJzdHJpbmdzIgoKCWduc21hdGggImduby5sYW5kL3AvZ25vc3dhcC9nbnNtYXRoL3YxIgoJcHJiYWMgImduby5sYW5kL3AvZ25vc3dhcC9yYmFjL3YxIgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCgoJImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCikKCmNvbnN0ICgKCVNJTkdMRV9IT1BfUk9VVEUgaW50ID0gMQopCgovLyBzd2FwIGNhbiBiZSBkb25lIGJ5IG11bHRpcGxlIHBvb2xzCi8vIHRvIHNlcGFyYXRlIGVhY2ggcG9vbCwgd2UgdXNlIFBPT0xfU0VQQVJBVE9SCmNvbnN0ICgKCVBPT0xfU0VQQVJBVE9SID0gIipQT09MKiIKKQoKdHlwZSBSb3V0ZXJPcGVyYXRpb24gaW50ZXJmYWNlIHsKCS8vIFZhbGlkYXRlIGNoZWNrcyBvcGVyYXRpb24gcGFyYW1ldGVycyBiZWZvcmUgcHJvY2Vzc2luZy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogbmlsIHdoZW4gb3BlcmF0aW9uIGlucHV0IGlzIHZhbGlkOyB2YWxpZGF0aW9uIGVycm9yIG90aGVyd2lzZQoJVmFsaWRhdGUoKSBlcnJvcgoJLy8gUHJvY2VzcyBleGVjdXRlcyB0aGUgb3BlcmF0aW9uIGluIHRoZSBwcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIG9wZXJhdGlvbiBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQgdXNlZCBmb3IgcG9vbCBpbnRlcmFjdGlvbgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gcmVzdWx0OiBzd2FwIGFtb3VudHMgYW5kIHJvdXRlIG1ldGFkYXRhLCBvciBuaWwgd2hlbiBwcm9jZXNzaW5nIGZhaWxzCgkvLyAgIC0gZXJyOiBuaWwgb24gc3VjY2VzczsgZXhlY3V0aW9uIGVycm9yIG90aGVyd2lzZQoJUHJvY2VzcyhfIGludCwgcmxtIHJlYWxtKSAoKlN3YXBSZXN1bHQsIGVycm9yKQp9CgovLyBleGVjdXRlU3dhcE9wZXJhdGlvbiB2YWxpZGF0ZXMgYW5kIHByb2Nlc3NlcyBhIHN3YXAgb3BlcmF0aW9uLgpmdW5jIGV4ZWN1dGVTd2FwT3BlcmF0aW9uKF8gaW50LCBybG0gcmVhbG0sIG9wIFJvdXRlck9wZXJhdGlvbikgKCpTd2FwUmVzdWx0LCBlcnJvcikgewoJaWYgZXJyIDo9IG9wLlZhbGlkYXRlKCk7IGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoKCXJlc3VsdCwgZXJyIDo9IG9wLlByb2Nlc3MoMCwgcmxtKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIG5pbCwgZXJyCgl9CgoJcmV0dXJuIHJlc3VsdCwgbmlsCn0KCnR5cGUgQmFzZVN3YXBQYXJhbXMgc3RydWN0IHsKCUlucHV0VG9rZW4gICAgICAgIHN0cmluZwoJT3V0cHV0VG9rZW4gICAgICAgc3RyaW5nCglSb3V0ZUFyciAgICAgICAgICBzdHJpbmcKCVF1b3RlQXJyICAgICAgICAgIHN0cmluZwoJU3FydFByaWNlTGltaXRYOTYgKnUyNTYuVWludAoJRGVhZGxpbmUgICAgICAgICAgaW50NjQKfQoKLy8gY29tbW9uIHN3YXAgb3BlcmF0aW9uCnR5cGUgYmFzZVN3YXBPcGVyYXRpb24gc3RydWN0IHsKCXNxcnRQcmljZUxpbWl0WDk2ICp1MjU2LlVpbnQKCXJvdXRlcyAgICAgICAgICAgIFtdc3RyaW5nCglxdW90ZXMgICAgICAgICAgICBbXXN0cmluZwoJYW1vdW50U3BlY2lmaWVkICAgaW50NjQKfQoKLy8gcHJvY2Vzc1JvdXRlcyBwcm9jZXNzZXMgYWxsIHN3YXAgcm91dGVzIGFuZCByZXR1cm5zIHRvdGFsIGFtb3VudHMuCmZ1bmMgKG9wICpiYXNlU3dhcE9wZXJhdGlvbikgcHJvY2Vzc1JvdXRlcyhfIGludCwgcmxtIHJlYWxtLCByICpyb3V0ZXJWMSwgc3dhcFR5cGUgU3dhcFR5cGUpIChpbnQ2NCwgaW50NjQsIGVycm9yKSB7CglyZXN1bHRBbW91bnRJbiwgcmVzdWx0QW1vdW50T3V0IDo9IGludDY0KDApLCBpbnQ2NCgwKQoJcmVtYWluUmVxdWVzdEFtb3VudCA6PSBvcC5hbW91bnRTcGVjaWZpZWQKCglmb3IgaSwgcm91dGUgOj0gcmFuZ2Ugb3Aucm91dGVzIHsKCQl0b1N3YXBBbW91bnQgOj0gaW50NjQoMCkKCgkJLy8gaWYgaXQncyB0aGUgbGFzdCByb3V0ZSwgdXNlIHRoZSByZW1haW5pbmcgYW1vdW50CgkJaXNMYXN0Um91dGUgOj0gaSA9PSBsZW4ob3Aucm91dGVzKS0xCgkJaWYgIWlzTGFzdFJvdXRlIHsKCQkJLy8gY2FsY3VsYXRlIHRoZSBhbW91bnQgdG8gc3dhcCBmb3IgdGhpcyByb3V0ZQoJCQlzd2FwQW1vdW50LCBlcnIgOj0gY2FsY3VsYXRlU3dhcEFtb3VudEJ5UXVvdGUob3AuYW1vdW50U3BlY2lmaWVkLCBvcC5xdW90ZXNbaV0pCgkJCWlmIGVyciAhPSBuaWwgewoJCQkJcmV0dXJuIDAsIDAsIGVycgoJCQl9CgoJCQkvLyB1cGRhdGUgdGhlIHJlbWFpbmluZyBhbW91bnQKCQkJcmVtYWluUmVxdWVzdEFtb3VudCA9IGduc21hdGguU2FmZVN1YkludDY0KHJlbWFpblJlcXVlc3RBbW91bnQsIHN3YXBBbW91bnQpCgkJCXRvU3dhcEFtb3VudCA9IHN3YXBBbW91bnQKCQl9IGVsc2UgewoJCQl0b1N3YXBBbW91bnQgPSByZW1haW5SZXF1ZXN0QW1vdW50CgkJfQoKCQlhbW91bnRJbiwgYW1vdW50T3V0LCBlcnIgOj0gb3AucHJvY2Vzc1JvdXRlKDAsIHJsbSwgciwgcm91dGUsIHRvU3dhcEFtb3VudCwgc3dhcFR5cGUpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiAwLCAwLCBlcnIKCQl9CgoJCXJlc3VsdEFtb3VudEluID0gZ25zbWF0aC5TYWZlQWRkSW50NjQocmVzdWx0QW1vdW50SW4sIGFtb3VudEluKQoJCXJlc3VsdEFtb3VudE91dCA9IGduc21hdGguU2FmZUFkZEludDY0KHJlc3VsdEFtb3VudE91dCwgYW1vdW50T3V0KQoJfQoKCXJldHVybiByZXN1bHRBbW91bnRJbiwgcmVzdWx0QW1vdW50T3V0LCBuaWwKfQoKLy8gcHJvY2Vzc1JvdXRlIHByb2Nlc3NlcyBhIHNpbmdsZSByb3V0ZSB3aXRoIHNwZWNpZmllZCBzd2FwIGFtb3VudC4KZnVuYyAob3AgKmJhc2VTd2FwT3BlcmF0aW9uKSBwcm9jZXNzUm91dGUoCglfIGludCwKCXJsbSByZWFsbSwKCXIgKnJvdXRlclYxLAoJcm91dGUgc3RyaW5nLAoJdG9Td2FwIGludDY0LAoJc3dhcFR5cGUgU3dhcFR5cGUsCikgKGFtb3VudEluLCBhbW91bnRPdXQgaW50NjQsIGVyciBlcnJvcikgewoJbnVtSG9wcyA6PSBzdHJpbmdzLkNvdW50KHJvdXRlLCBQT09MX1NFUEFSQVRPUikgKyAxCglhc3NlcnRIb3BzSW5SYW5nZShudW1Ib3BzKQoKCXN3aXRjaCBudW1Ib3BzIHsKCWNhc2UgU0lOR0xFX0hPUF9ST1VURToKCQlhbW91bnRJbiwgYW1vdW50T3V0ID0gci5oYW5kbGVTaW5nbGVTd2FwKDAsIHJsbSwgcm91dGUsIHRvU3dhcCwgb3Auc3FydFByaWNlTGltaXRYOTYpCglkZWZhdWx0OgoJCWFtb3VudEluLCBhbW91bnRPdXQgPSByLmhhbmRsZU11bHRpU3dhcCgwLCBybG0sIHN3YXBUeXBlLCByb3V0ZSwgbnVtSG9wcywgdG9Td2FwKQoJfQoKCXJldHVybiBhbW91bnRJbiwgYW1vdW50T3V0LCBuaWwKfQoKLy8gaGFuZGxlU2luZ2xlU3dhcCBleGVjdXRlcyBhIHNpbmdsZS1ob3Agc3dhcCB3aXRoIHRoZSBzcGVjaWZpZWQgYW1vdW50LgpmdW5jIChyICpyb3V0ZXJWMSkgaGFuZGxlU2luZ2xlU3dhcChfIGludCwgcmxtIHJlYWxtLCByb3V0ZSBzdHJpbmcsIGFtb3VudFNwZWNpZmllZCBpbnQ2NCwgc3FydFByaWNlTGltaXRYOTYgKnUyNTYuVWludCkgKGludDY0LCBpbnQ2NCkgewoJaW5wdXQsIG91dHB1dCwgZmVlIDo9IGdldERhdGFGb3JTaW5nbGVQYXRoKHJvdXRlKQoJc2luZ2xlUGFyYW1zIDo9IFNpbmdsZVN3YXBQYXJhbXN7CgkJdG9rZW5JbjogICAgICAgICAgIGlucHV0LAoJCXRva2VuT3V0OiAgICAgICAgICBvdXRwdXQsCgkJZmVlOiAgICAgICAgICAgICAgIGZlZSwKCQlhbW91bnRTcGVjaWZpZWQ6ICAgYW1vdW50U3BlY2lmaWVkLAoJCXNxcnRQcmljZUxpbWl0WDk2OiBzcXJ0UHJpY2VMaW1pdFg5NiwKCX0KCglyZXR1cm4gci5zaW5nbGVTd2FwKDAsIHJsbSwgJnNpbmdsZVBhcmFtcykKfQoKLy8gaGFuZGxlTXVsdGlTd2FwIHByb2Nlc3NlcyBtdWx0aS1ob3Agc3dhcHMgYWNyb3NzIG11bHRpcGxlIHBvb2xzLgpmdW5jIChyICpyb3V0ZXJWMSkgaGFuZGxlTXVsdGlTd2FwKAoJXyBpbnQsCglybG0gcmVhbG0sCglzd2FwVHlwZSBTd2FwVHlwZSwKCXJvdXRlIHN0cmluZywKCW51bUhvcHMgaW50LAoJYW1vdW50U3BlY2lmaWVkIGludDY0LAopIChpbnQ2NCwgaW50NjQpIHsKCXJlY2lwaWVudCA6PSBhY2Nlc3MuTXVzdEdldEFkZHJlc3MocHJiYWMuUk9MRV9ST1VURVIuU3RyaW5nKCkpCgoJc3dpdGNoIHN3YXBUeXBlIHsKCWNhc2UgRXhhY3RJbjoKCQlpbnB1dCwgb3V0cHV0LCBmZWUgOj0gZ2V0RGF0YUZvck11bHRpUGF0aChyb3V0ZSwgMCkgLy8gZmlyc3QgZGF0YQoJCXNwIDo9IG5ld1N3YXBQYXJhbXMoaW5wdXQsIG91dHB1dCwgZmVlLCByZWNpcGllbnQsIGFtb3VudFNwZWNpZmllZCkKCQlyZXR1cm4gci5tdWx0aVN3YXAoMCwgcmxtLCAqc3AsIG51bUhvcHMsIHJvdXRlKQoJY2FzZSBFeGFjdE91dDoKCQlpbnB1dCwgb3V0cHV0LCBmZWUgOj0gZ2V0RGF0YUZvck11bHRpUGF0aChyb3V0ZSwgbnVtSG9wcy0xKSAvLyBsYXN0IGRhdGEKCQlzcCA6PSBuZXdTd2FwUGFyYW1zKGlucHV0LCBvdXRwdXQsIGZlZSwgcmVjaXBpZW50LCBhbW91bnRTcGVjaWZpZWQpCgkJcmV0dXJuIHIubXVsdGlTd2FwTmVnYXRpdmUoMCwgcmxtLCAqc3AsIG51bUhvcHMsIHJvdXRlKQoJZGVmYXVsdDoKCQlwYW5pYyhlcnJvcnMuTmV3KGVyckludmFsaWRTd2FwVHlwZSkpCgl9Cn0KCi8vIFN3YXBSb3V0ZVBhcmFtcyBjb250YWlucyBhbGwgcGFyYW1ldGVycyBuZWVkZWQgZm9yIHN3YXAgcm91dGUgZXhlY3V0aW9uCnR5cGUgU3dhcFJvdXRlUGFyYW1zIHN0cnVjdCB7CglpbnB1dFRva2VuICAgICAgICBzdHJpbmcKCW91dHB1dFRva2VuICAgICAgIHN0cmluZwoJcm91dGVBcnIgICAgICAgICAgc3RyaW5nCglxdW90ZUFyciAgICAgICAgICBzdHJpbmcKCWRlYWRsaW5lICAgICAgICAgIGludDY0Cgl0eXAgICAgICAgICAgICAgICBTd2FwVHlwZQoJZXhhY3RBbW91bnQgICAgICAgaW50NjQgICAgICAvLyBhbW91bnRJbiBmb3IgRXhhY3RJbiwgYW1vdW50T3V0IGZvciBFeGFjdE91dAoJbGltaXRBbW91bnQgICAgICAgaW50NjQgICAgICAvLyBhbW91bnRPdXRNaW4gZm9yIEV4YWN0SW4sIGFtb3VudEluTWF4IGZvciBFeGFjdE91dAoJc3FydFByaWNlTGltaXRYOTYgKnUyNTYuVWludCAvLyBpZiBzcXJ0UHJpY2VMaW1pdFg5NiBpcyB6ZXJvIHN0cmluZywgaXQgd2lsbCBiZSBzZXQgdG8gTUlOX1BSSUNFIG9yIE1BWF9QUklDRQp9CgovLyBFeGFjdEFtb3VudCByZXR1cm5zIHRoZSByZXF1ZXN0ZWQgZXhhY3QgaW5wdXQgb3Igb3V0cHV0IGFtb3VudC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogZXhhY3RBbW91bnQgY29uZmlndXJlZCBmb3IgdGhlIHJvdXRlCmZ1bmMgKHAgKlN3YXBSb3V0ZVBhcmFtcykgRXhhY3RBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gcC5leGFjdEFtb3VudAp9CgovLyBFeHBlY3RlZEV4YWN0QW1vdW50QnlGZWUgcmV0dXJucyB0aGUgYW1vdW50IG5lZWRlZCBieSBwb29sIGV4ZWN1dGlvbiBhZnRlciByb3V0ZXItZmVlIGFkanVzdG1lbnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBmZWVCcHM6IHJvdXRlciBmZWUgaW4gYmFzaXMgcG9pbnRzCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IGV4YWN0IGlucHV0IGFtb3VudCBmb3IgRXhhY3RJbiwgb3IgZ3Jvc3MgcG9vbCBhbW91bnQgZm9yIEV4YWN0T3V0CmZ1bmMgKHAgKlN3YXBSb3V0ZVBhcmFtcykgRXhwZWN0ZWRFeGFjdEFtb3VudEJ5RmVlKGZlZUJwcyB1aW50NjQpIGludDY0IHsKCWlmIHAudHlwID09IEV4YWN0SW4gewoJCXJldHVybiBwLmV4YWN0QW1vdW50Cgl9CgoJcmV0dXJuIGNhbGN1bGF0ZUV4YWN0T3V0V2l0aFJvdXRlckZlZShwLmV4YWN0QW1vdW50LCBmZWVCcHMpCn0KCi8vIFN3YXBDb3VudCBjb3VudHMgcG9vbCBob3BzIGFjcm9zcyBhbGwgY29tbWEtc2VwYXJhdGVkIHJvdXRlcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGNvdW50OiB0b3RhbCBudW1iZXIgb2YgcG9vbCBzd2FwcyByZXByZXNlbnRlZCBieSByb3V0ZUFycgpmdW5jIChwICpTd2FwUm91dGVQYXJhbXMpIFN3YXBDb3VudCgpIGludDY0IHsKCXN3YXBDb3VudCA6PSBpbnQ2NCgwKQoKCWZvciBfLCByb3V0ZSA6PSByYW5nZSBzdHJpbmdzLlNwbGl0KHAucm91dGVBcnIsICIsIikgewoJCXN3YXBDb3VudCArPSBpbnQ2NChzdHJpbmdzLkNvdW50KHJvdXRlLCBQT09MX1NFUEFSQVRPUikgKyAxKQoJfQoKCXJldHVybiBzd2FwQ291bnQKfQoKZnVuYyBidWlsZFJvdXRlRXZlbnRBdHRycyhyb3V0ZUFyciBzdHJpbmcpIFtdc3RyaW5nIHsKCXJvdXRlcyA6PSBzdHJpbmdzLlNwbGl0KHJvdXRlQXJyLCAiLCIpCglyb3V0ZUV2ZW50QXR0cnMgOj0gbWFrZShbXXN0cmluZywgMCwgbGVuKHJvdXRlcykqMikKCglmb3IgaW5kZXgsIHJvdXRlIDo9IHJhbmdlIHJvdXRlcyB7CgkJcm91dGVFdmVudEF0dHJzID0gYXBwZW5kKHJvdXRlRXZlbnRBdHRycywgdWZtdC5TcHJpbnRmKCJyb3V0ZXNbJWRdIiwgaW5kZXgpKQoJCXJvdXRlRXZlbnRBdHRycyA9IGFwcGVuZChyb3V0ZUV2ZW50QXR0cnMsIHJvdXRlKQoJfQoKCXJldHVybiByb3V0ZUV2ZW50QXR0cnMKfQoKLy8gSXNTZXRTcXJ0UHJpY2VMaW1pdFg5NiByZXBvcnRzIHdoZXRoZXIgYSBub256ZXJvIGNhbGxlciBwcmljZSBsaW1pdCBpcyBjb25maWd1cmVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc2V0OiB0cnVlIHdoZW4gc3FydFByaWNlTGltaXRYOTYgaXMgbm9uLW5pbCBhbmQgbm9uemVybwpmdW5jIChwICpTd2FwUm91dGVQYXJhbXMpIElzU2V0U3FydFByaWNlTGltaXRYOTYoKSBib29sIHsKCXJldHVybiBwLnNxcnRQcmljZUxpbWl0WDk2ICE9IG5pbCAmJiAhcC5zcXJ0UHJpY2VMaW1pdFg5Ni5Jc1plcm8oKQp9CgovLyBjcmVhdGVTd2FwT3BlcmF0aW9uIGNyZWF0ZXMgdGhlIGFwcHJvcHJpYXRlIHN3YXAgb3BlcmF0aW9uIGJhc2VkIG9uIHN3YXAgdHlwZS4KZnVuYyBjcmVhdGVTd2FwT3BlcmF0aW9uKHIgKnJvdXRlclYxLCBwYXJhbXMgU3dhcFJvdXRlUGFyYW1zKSAoUm91dGVyT3BlcmF0aW9uLCBlcnJvcikgewoJYmFzZVBhcmFtcyA6PSBCYXNlU3dhcFBhcmFtc3sKCQlJbnB1dFRva2VuOiAgICAgICAgcGFyYW1zLmlucHV0VG9rZW4sCgkJT3V0cHV0VG9rZW46ICAgICAgIHBhcmFtcy5vdXRwdXRUb2tlbiwKCQlSb3V0ZUFycjogICAgICAgICAgcGFyYW1zLnJvdXRlQXJyLAoJCVF1b3RlQXJyOiAgICAgICAgICBwYXJhbXMucXVvdGVBcnIsCgkJU3FydFByaWNlTGltaXRYOTY6IHBhcmFtcy5zcXJ0UHJpY2VMaW1pdFg5NiwKCQlEZWFkbGluZTogICAgICAgICAgcGFyYW1zLmRlYWRsaW5lLAoJfQoKCXN3aXRjaCBwYXJhbXMudHlwIHsKCWNhc2UgRXhhY3RJbjoKCQlwcCA6PSBOZXdFeGFjdEluUGFyYW1zKGJhc2VQYXJhbXMsIHBhcmFtcy5FeGFjdEFtb3VudCgpLCBwYXJhbXMubGltaXRBbW91bnQpCgkJcmV0dXJuIE5ld0V4YWN0SW5Td2FwT3BlcmF0aW9uKHIsIHBwKSwgbmlsCgljYXNlIEV4YWN0T3V0OgoJCXJvdXRlckZlZSA6PSByLnN0b3JlLkdldFN3YXBGZWUoKQoJCXBwIDo9IE5ld0V4YWN0T3V0UGFyYW1zKGJhc2VQYXJhbXMsIHBhcmFtcy5FeHBlY3RlZEV4YWN0QW1vdW50QnlGZWUocm91dGVyRmVlKSwgcGFyYW1zLmxpbWl0QW1vdW50KQoJCXJldHVybiBOZXdFeGFjdE91dFN3YXBPcGVyYXRpb24ociwgcHApLCBuaWwKCWRlZmF1bHQ6CgkJbXNnIDo9IGFkZERldGFpbFRvRXJyb3IoZXJySW52YWxpZFN3YXBUeXBlLCAidW5rbm93biBzd2FwIHR5cGUiKQoJCXJldHVybiBuaWwsIGVycm9ycy5OZXcobXNnKQoJfQp9CgovLyBjb21tb25Td2FwUm91dGUgaGFuZGxlcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIEV4YWN0SW4gYW5kIEV4YWN0T3V0IHN3YXBzLgpmdW5jIChyICpyb3V0ZXJWMSkgY29tbW9uU3dhcFJvdXRlKF8gaW50LCBybG0gcmVhbG0sIHBhcmFtcyBTd2FwUm91dGVQYXJhbXMpIChpbnQ2NCwgaW50NjQsIGVycm9yKSB7CglvcCwgZXJyIDo9IGNyZWF0ZVN3YXBPcGVyYXRpb24ociwgcGFyYW1zKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIDAsIGVycgoJfQoKCXJlc3VsdCwgZXJyIDo9IGV4ZWN1dGVTd2FwT3BlcmF0aW9uKDAsIHJsbSwgb3ApCglpZiBlcnIgIT0gbmlsIHsKCQltc2cgOj0gYWRkRGV0YWlsVG9FcnJvcigKCQkJZXJySW52YWxpZElucHV0LAoJCQl1Zm10LlNwcmludGYoImludmFsaWQgJXMgU3dhcE9wZXJhdGlvbjogJXMiLCBwYXJhbXMudHlwLlN0cmluZygpLCBlcnIuRXJyb3IoKSksCgkJKQoJCXJldHVybiAwLCAwLCBlcnJvcnMuTmV3KG1zZykKCX0KCglpbnB1dEFtb3VudCwgb3V0cHV0QW1vdW50IDo9IHIuZmluYWxpemVTd2FwKAoJCTAsCgkJcmxtLAoJCXBhcmFtcy5pbnB1dFRva2VuLAoJCXBhcmFtcy5vdXRwdXRUb2tlbiwKCQlyZXN1bHQuQW1vdW50SW4sCgkJcmVzdWx0LkFtb3VudE91dCwKCQlwYXJhbXMudHlwLAoJCXBhcmFtcy5saW1pdEFtb3VudCwKCQlwYXJhbXMuRXhhY3RBbW91bnQoKSwKCQlwYXJhbXMuU3dhcENvdW50KCksCgkJcGFyYW1zLklzU2V0U3FydFByaWNlTGltaXRYOTYoKSwKCSkKCglyZXR1cm4gaW5wdXRBbW91bnQsIG91dHB1dEFtb3VudCwgbmlsCn0KGnMKCmNvbnN0cy5nbm8SZXBhY2thZ2Ugcm91dGVyCgp2YXIgcm91dGVySW1wbEFkZHIgYWRkcmVzcwoKZnVuYyBpbml0KGN1ciByZWFsbSkgewoJcm91dGVySW1wbEFkZHIgPSBjdXIuQWRkcmVzcygpCn0KGrwDCgdkb2MuZ25vErADLy8gcGFja2FnZSByb3V0ZXIgaGFuZGxlcyB0b2tlbiBzd2FwcyB0aHJvdWdoIEdub1N3YXAgbGlxdWlkaXR5IHBvb2xzLgovLwovLyBUaGUgcm91dGVyIHByb3ZpZGVzIHVzZXItZmFjaW5nIHN3YXAgZnVuY3Rpb25zIHdpdGggc2xpcHBhZ2UgcHJvdGVjdGlvbiwKLy8gbXVsdGktaG9wIHJvdXRpbmcsIGFuZCBib3RoIGV4YWN0LWlucHV0IGFuZCBleGFjdC1vdXRwdXQgc3dhcCBtb2Rlcy4KLy8KLy8gTGl2ZSBleGFjdC1pbnB1dCBjYWxscyBlbmZvcmNlIGEgbWluaW11bSBvdXRwdXQgYW5kIGRlYWRsaW5lLiBMaXZlCi8vIGV4YWN0LW91dHB1dCBjYWxscyBlbmZvcmNlIGEgbWF4aW11bSBpbnB1dCBhbmQgZGVhZGxpbmUuIERyeVN3YXBSb3V0ZSBpcwovLyByZWFkLW9ubHkgYW5kIGhhcyBubyBkZWFkbGluZSBvciB0cmFuc2Zlci4KcGFja2FnZSByb3V0ZXIKGvAOCgplcnJvcnMuZ25vEuEOcGFja2FnZSByb3V0ZXIKCmltcG9ydCAoCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCmNvbnN0ICgKCWVyclNsaXBwYWdlICAgICAgICAgICAgICAgPSAiW0dOT1NXQVAtUk9VVEVSLTAwMV0gc2xpcHBhZ2UgY2hlY2sgZmFpbGVkIgoJZXJySW52YWxpZFJvdXRlc0FuZFF1b3RlcyA9ICJbR05PU1dBUC1ST1VURVItMDAyXSBpbnZhbGlkIHJvdXRlcyBhbmQgcXVvdGVzIgoJZXJyRXhwaXJlZCAgICAgICAgICAgICAgICA9ICJbR05PU1dBUC1ST1VURVItMDAzXSB0cmFuc2FjdGlvbiBleHBpcmVkIgoJZXJySW52YWxpZElucHV0ICAgICAgICAgICA9ICJbR05PU1dBUC1ST1VURVItMDA0XSBpbnZhbGlkIGlucHV0IGRhdGEiCgllcnJJbnZhbGlkUG9vbEZlZVRpZXIgICAgID0gIltHTk9TV0FQLVJPVVRFUi0wMDVdIGludmFsaWQgcG9vbCBmZWUgdGllciIKCWVyckludmFsaWRTd2FwRmVlICAgICAgICAgPSAiW0dOT1NXQVAtUk9VVEVSLTAwNl0gaW52YWxpZCBzd2FwIGZlZSIKCWVyckludmFsaWRTd2FwVHlwZSAgICAgICAgPSAiW0dOT1NXQVAtUk9VVEVSLTAwN10gaW52YWxpZCBzd2FwIHR5cGUiCgllcnJJbnZhbGlkUG9vbFBhdGggICAgICAgID0gIltHTk9TV0FQLVJPVVRFUi0wMDhdIGludmFsaWQgcG9vbCBwYXRoIgoJZXJyVW5BdXRob3JpemVkQ2FsbGVyICAgICA9ICJbR05PU1dBUC1ST1VURVItMDA5XSB1bmF1dGhvcml6ZWQgY2FsbGVyIgoJZXJySG9wc091dE9mUmFuZ2UgICAgICAgICA9ICJbR05PU1dBUC1ST1VURVItMDEwXSBudW1iZXIgb2YgaG9wcyBtdXN0IGJlIDF+MyIKCWVyclNhbWVUb2tlblN3YXAgICAgICAgICAgPSAiW0dOT1NXQVAtUk9VVEVSLTAxMV0gY2Fubm90IHN3YXAgc2FtZSB0b2tlbiIKCWVyckludmFsaWRSb3V0ZVBhdGggICAgICAgPSAiW0dOT1NXQVAtUk9VVEVSLTAxM10gaW52YWxpZCByb3V0ZSBwYXRoIgoJZXJySW52YWxpZFJvdXRlRmlyc3RUb2tlbiA9ICJbR05PU1dBUC1ST1VURVItMDE0XSBpbnZhbGlkIHJvdXRlIGZpcnN0IHRva2VuIgoJZXJySW52YWxpZFJvdXRlTGFzdFRva2VuICA9ICJbR05PU1dBUC1ST1VURVItMDE1XSBpbnZhbGlkIHJvdXRlIGxhc3QgdG9rZW4iCgllcnJJbnZhbGlkU3dhcEFtb3VudCAgICAgID0gIltHTk9TV0FQLVJPVVRFUi0wMTZdIGludmFsaWQgc3dhcCBhbW91bnQiCgllcnJSb3V0ZUhvcERpc2Nvbm5lY3RlZCAgID0gIltHTk9TV0FQLVJPVVRFUi0wMTddIHJvdXRlIGhvcCBkaXNjb25uZWN0ZWQiCgllcnJJbnN1ZmZpY2llbnRCYWxhbmNlICAgID0gIltHTk9TV0FQLVJPVVRFUi0wMThdIGluc3VmZmljaWVudCBiYWxhbmNlIGZvciBzd2FwIgoJZXJyU3Bvb2ZlZFJlYWxtICAgICAgICAgICA9ICJbR05PU1dBUC1ST1VURVItMDE5XSBybG0gZG9lcyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQgY3Jvc3NpbmcgZnJhbWUiCgllcnJJbnN1ZmZpY2llbnRMaXF1aWRpdHkgID0gIltHTk9TV0FQLVJPVVRFUi0wMjBdIGluc3VmZmljaWVudCBsaXF1aWRpdHkgZm9yIHN3YXAiCikKCi8vIGFkZERldGFpbFRvRXJyb3IgYWRkcyBkZXRhaWwgdG8gYW4gZXJyb3IgbWVzc2FnZS4KZnVuYyBhZGREZXRhaWxUb0Vycm9yKG1lc3NhZ2Ugc3RyaW5nLCBkZXRhaWwgc3RyaW5nKSBzdHJpbmcgewoJZmluYWxFcnIgOj0gdWZtdC5FcnJvcmYoIiVzIHx8ICVzIiwgbWVzc2FnZSwgZGV0YWlsKQoJcmV0dXJuIGZpbmFsRXJyLkVycm9yKCkKfQoKLy8gbWFrZUVycm9yV2l0aERldGFpbHMgY3JlYXRlcyBhbiBlcnJvciB3aXRoIGFkZGl0aW9uYWwgY29udGV4dC4KZnVuYyBtYWtlRXJyb3JXaXRoRGV0YWlscyhtZXNzYWdlIHN0cmluZywgZGV0YWlsIHN0cmluZykgZXJyb3IgewoJcmV0dXJuIHVmbXQuRXJyb3JmKCIlcyB8fCAlcyIsIG1lc3NhZ2UsIGRldGFpbCkKfQoap0QKDGV4YWN0X2luLmdubxKWRHBhY2thZ2Ugcm91dGVyCgppbXBvcnQgKAoJImNoYWluIgoKCSJnbm8ubGFuZC9yL2dub3N3YXAvYWNjZXNzL3YxIgoKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKCSJnbm8ubGFuZC9wL2dub3N3YXAvdXRpbHMvdjEiCgoJImduby5sYW5kL3IvZ25vc3dhcC9jb21tb24iCgkiZ25vLmxhbmQvci9nbm9zd2FwL2VtaXNzaW9uIgoJImduby5sYW5kL3IvZ25vc3dhcC9oYWx0L3YxIgoJImduby5sYW5kL3IvZ25vc3dhcC9yZWZlcnJhbC92MSIKKQoKLy8gRXhhY3RJblN3YXBSb3V0ZSBzd2FwcyBhbiBleGFjdCBhbW91bnQgb2YgaW5wdXQgdG9rZW5zIGZvciBvdXRwdXQgdG9rZW5zLgovLwovLyBFeGVjdXRlcyBtdWx0aS1ob3Agc3dhcHMgdGhyb3VnaCBzcGVjaWZpZWQgcm91dGUuCi8vIFN1cHBvcnRzIHNwbGl0dGluZyBhY3Jvc3MgbXVsdGlwbGUgcGF0aHMgZm9yIHByaWNlIG9wdGltaXphdGlvbi4KLy8gQXBwbGllcyBzbGlwcGFnZSBwcm90ZWN0aW9uIHZpYSBtaW5pbXVtIG91dHB1dCBhbW91bnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIGltcGxlbWVudGF0aW9uIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0OyB0aGlzIGltcGxlbWVudGF0aW9uIHZhbGlkYXRlcyBhbmQgZm9yd2FyZHMgaXQKLy8gICAtIGlucHV0VG9rZW46IElucHV0IHRva2VuIGNvbnRyYWN0IHBhdGgKLy8gICAtIG91dHB1dFRva2VuOiBPdXRwdXQgdG9rZW4gY29udHJhY3QgcGF0aAovLyAgIC0gYW1vdW50SW46IEV4YWN0IGlucHV0IGFtb3VudCB0byBzd2FwCi8vICAgLSByb3V0ZUFycjogU3dhcCByb3V0ZSAobWF4IDMgaG9wcyBwZXIgcGF0aCwgbXVsdGlwbGUgcGF0aHMgc2VwYXJhdGVkIGJ5IGNvbW1hKQovLyAgIC0gcXVvdGVBcnI6IFNwbGl0IHBlcmNlbnRhZ2VzICI3MCwzMCIgKG11c3Qgc3VtIHRvIDEwMCkKLy8gICAtIGFtb3VudE91dE1pbjogTWluaW11bSBhY2NlcHRhYmxlIG91dHB1dCAoc2xpcHBhZ2UgcHJvdGVjdGlvbikKLy8gICAtIGRlYWRsaW5lOiBVbml4IHRpbWVzdGFtcCBmb3IgZXhwaXJhdGlvbgovLyAgIC0gcmVmZXJyZXI6IE9wdGlvbmFsIHJlZmVycmFsIGFkZHJlc3MKLy8KLy8gUm91dGUgZm9ybWF0OgovLyAgIC0gU2luZ2xlLWhvcDogIlRPS0VOMDpUT0tFTjE6RkVFIgovLyAgIC0gTXVsdGktaG9wOiAiVE9LRU4wOlRPS0VOMTpGRUUqUE9PTCpUT0tFTjE6VE9LRU4yOkZFRSIgKHVzZSAqUE9PTCogc2VwYXJhdG9yKQovLyAgIC0gTXVsdGktcGF0aDogInJvdXRlMSxyb3V0ZTIiICh1c2UgY29tbWEgc2VwYXJhdG9yIGJldHdlZW4gZGlmZmVyZW50IHJvdXRlcykKLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudEluOiBBY3R1YWwgaW5wdXQgY29uc3VtZWQKLy8gICAtIGFtb3VudE91dDogQWN0dWFsIG91dHB1dCByZWNlaXZlZCBhZnRlciB0aGUgcm91dGVyIGZlZQovLwovLyBSZXZlcnRzIGlmIG91dHB1dCA8IGFtb3VudE91dE1pbiBvciBkZWFkbGluZSBwYXNzZWQuCmZ1bmMgKHIgKnJvdXRlclYxKSBFeGFjdEluU3dhcFJvdXRlKAoJXyBpbnQsCglybG0gcmVhbG0sCglpbnB1dFRva2VuIHN0cmluZywKCW91dHB1dFRva2VuIHN0cmluZywKCWFtb3VudEluIHN0cmluZywKCXJvdXRlQXJyIHN0cmluZywKCXF1b3RlQXJyIHN0cmluZywKCWFtb3VudE91dE1pbiBzdHJpbmcsCglkZWFkbGluZSBpbnQ2NCwKCXJlZmVycmVyIHN0cmluZywKKSAoc3RyaW5nLCBzdHJpbmcpIHsKCWFjY2Vzcy5Bc3NlcnRJc1JsbUN1cnJlbnQoMCwgcmxtKQoKCWhhbHQuQXNzZXJ0SXNOb3RIYWx0ZWRSb3V0ZXIoKQoKCWNvbW1vbi5Bc3NlcnRJc05vdEhhbmRsZU5hdGl2ZUNvaW4oKQoKCWFzc2VydElzVmFsaWRSb3V0ZVBhdGhzKHJvdXRlQXJyLCBpbnB1dFRva2VuLCBvdXRwdXRUb2tlbikKCWFzc2VydElzTm90RXhwaXJlZChkZWFkbGluZSkKCWFzc2VydElzRXhpc3RzUG9vbHMocm91dGVBcnIpCgoJZW1pc3Npb24uTWludEFuZERpc3RyaWJ1dGVHbnMoY3Jvc3MocmxtKSkKCglwYXJhbXMgOj0gU3dhcFJvdXRlUGFyYW1zewoJCWlucHV0VG9rZW46ICAgICAgICBpbnB1dFRva2VuLAoJCW91dHB1dFRva2VuOiAgICAgICBvdXRwdXRUb2tlbiwKCQlyb3V0ZUFycjogICAgICAgICAgcm91dGVBcnIsCgkJcXVvdGVBcnI6ICAgICAgICAgIHF1b3RlQXJyLAoJCWRlYWRsaW5lOiAgICAgICAgICBkZWFkbGluZSwKCQl0eXA6ICAgICAgICAgICAgICAgRXhhY3RJbiwKCQlleGFjdEFtb3VudDogICAgICAgdXRpbHMuU2FmZVBhcnNlSW50NjQoYW1vdW50SW4pLAoJCWxpbWl0QW1vdW50OiAgICAgICB1dGlscy5TYWZlUGFyc2VJbnQ2NChhbW91bnRPdXRNaW4pLAoJCXNxcnRQcmljZUxpbWl0WDk2OiB1MjU2Llplcm8oKSwgLy8gbXVsdGktaG9wIHN3YXAgaXMgbm90IGFsbG93ZWQgdG8gc2V0IHNxcnRQcmljZUxpbWl0WDk2Cgl9CgoJaW5wdXRBbW91bnQsIG91dHB1dEFtb3VudCA6PSByLmV4YWN0SW5Td2FwUm91dGUoMCwgcmxtLCBwYXJhbXMsIHJlZmVycmVyKQoKCXJldHVybiB1dGlscy5Gb3JtYXRJbnQoaW5wdXRBbW91bnQpLCB1dGlscy5Gb3JtYXRJbnQob3V0cHV0QW1vdW50KQp9CgovLyBFeGFjdEluU2luZ2xlU3dhcFJvdXRlIHN3YXBzIGFuIGV4YWN0IGFtb3VudCBvZiBpbnB1dCB0b2tlbnMgZm9yIG91dHB1dCB0b2tlbnMgdGhyb3VnaCBhIHNpbmdsZSByb3V0ZS4KLy8KLy8gRXhlY3V0ZXMgYSBzaW5nbGUtaG9wIHN3YXAgdGhyb3VnaCBhIHNpbmdsZSBzcGVjaWZpZWQgcm91dGUuCi8vIEFsbG93cyBwcmljZSBsaW1pdCBjb250cm9sIHZpYSBzcXJ0UHJpY2VMaW1pdFg5NiBwYXJhbWV0ZXIuCi8vIEFwcGxpZXMgc2xpcHBhZ2UgcHJvdGVjdGlvbiB2aWEgbWluaW11bSBvdXRwdXQgYW1vdW50LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogbGVhZGluZyBpbXBsZW1lbnRhdGlvbiBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dDsgdGhpcyBpbXBsZW1lbnRhdGlvbiB2YWxpZGF0ZXMgYW5kIGZvcndhcmRzIGl0Ci8vICAgLSBpbnB1dFRva2VuOiBJbnB1dCB0b2tlbiBjb250cmFjdCBwYXRoCi8vICAgLSBvdXRwdXRUb2tlbjogT3V0cHV0IHRva2VuIGNvbnRyYWN0IHBhdGgKLy8gICAtIGFtb3VudEluOiBFeGFjdCBpbnB1dCBhbW91bnQgdG8gc3dhcAovLyAgIC0gcm91dGVBcnI6IFNpbmdsZS1ob3Agcm91dGUgcGF0aAovLyAgIC0gYW1vdW50T3V0TWluOiBNaW5pbXVtIGFjY2VwdGFibGUgb3V0cHV0IChzbGlwcGFnZSBwcm90ZWN0aW9uKQovLyAgIC0gc3FydFByaWNlTGltaXRYOTY6IFByaWNlIGxpbWl0IGZvciBzd2FwIGV4ZWN1dGlvbiAoMCBmb3Igbm8gbGltaXQpCi8vICAgLSBkZWFkbGluZTogVW5peCB0aW1lc3RhbXAgZm9yIGV4cGlyYXRpb24KLy8gICAtIHJlZmVycmVyOiBPcHRpb25hbCByZWZlcnJhbCBhZGRyZXNzCi8vCi8vIFJvdXRlIGZvcm1hdDoKLy8gICAtIFNpbmdsZS1ob3A6ICJJTlBVVF9UT0tFTjpPVVRQVVRfVE9LRU46RkVFIgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50SW46IEFjdHVhbCBpbnB1dCBjb25zdW1lZAovLyAgIC0gYW1vdW50T3V0OiBBY3R1YWwgb3V0cHV0IHJlY2VpdmVkIGFmdGVyIHRoZSByb3V0ZXIgZmVlCi8vCi8vIFdpdGggYSBub256ZXJvIHByaWNlIGxpbWl0LCB0aGUgc3dhcCBtYXkgc3RvcCBhdCB0aGUgbGltaXQgYWZ0ZXIgY29uc3VtaW5nCi8vIGxlc3MgdGhhbiBhbW91bnRJbjsgYW1vdW50T3V0TWluIGFuZCB0aGUgZGVhZGxpbmUgYXJlIHN0aWxsIGVuZm9yY2VkLgpmdW5jIChyICpyb3V0ZXJWMSkgRXhhY3RJblNpbmdsZVN3YXBSb3V0ZSgKCV8gaW50LAoJcmxtIHJlYWxtLAoJaW5wdXRUb2tlbiBzdHJpbmcsCglvdXRwdXRUb2tlbiBzdHJpbmcsCglhbW91bnRJbiBzdHJpbmcsCglyb3V0ZUFyciBzdHJpbmcsCglhbW91bnRPdXRNaW4gc3RyaW5nLAoJc3FydFByaWNlTGltaXRYOTYgc3RyaW5nLAoJZGVhZGxpbmUgaW50NjQsCglyZWZlcnJlciBzdHJpbmcsCikgKHN0cmluZywgc3RyaW5nKSB7CglhY2Nlc3MuQXNzZXJ0SXNSbG1DdXJyZW50KDAsIHJsbSkKCgloYWx0LkFzc2VydElzTm90SGFsdGVkUm91dGVyKCkKCgljb21tb24uQXNzZXJ0SXNOb3RIYW5kbGVOYXRpdmVDb2luKCkKCglhc3NlcnRJc1ZhbGlkU2luZ2xlU3dhcFJvdXRlQXJyUGF0aChyb3V0ZUFyciwgaW5wdXRUb2tlbiwgb3V0cHV0VG9rZW4pCglhc3NlcnRJc1ZhbGlkU3FydFByaWNlTGltaXRYOTYoc3FydFByaWNlTGltaXRYOTYpCglhc3NlcnRJc05vdEV4cGlyZWQoZGVhZGxpbmUpCglhc3NlcnRJc0V4aXN0c1Bvb2xzKHJvdXRlQXJyKQoKCWVtaXNzaW9uLk1pbnRBbmREaXN0cmlidXRlR25zKGNyb3NzKHJsbSkpCgoJcGFyYW1zIDo9IFN3YXBSb3V0ZVBhcmFtc3sKCQlpbnB1dFRva2VuOiAgICAgICAgaW5wdXRUb2tlbiwKCQlvdXRwdXRUb2tlbjogICAgICAgb3V0cHV0VG9rZW4sCgkJcm91dGVBcnI6ICAgICAgICAgIHJvdXRlQXJyLAoJCXF1b3RlQXJyOiAgICAgICAgICAiMTAwIiwKCQlkZWFkbGluZTogICAgICAgICAgZGVhZGxpbmUsCgkJdHlwOiAgICAgICAgICAgICAgIEV4YWN0SW4sCgkJZXhhY3RBbW91bnQ6ICAgICAgIHV0aWxzLlNhZmVQYXJzZUludDY0KGFtb3VudEluKSwKCQlsaW1pdEFtb3VudDogICAgICAgdXRpbHMuU2FmZVBhcnNlSW50NjQoYW1vdW50T3V0TWluKSwKCQlzcXJ0UHJpY2VMaW1pdFg5NjogdTI1Ni5NdXN0RnJvbURlY2ltYWwoc3FydFByaWNlTGltaXRYOTYpLCAvLyBzaW5nbGUgc3dhcCBpcyBhbGxvd2VkIHRvIHNldCBzcXJ0UHJpY2VMaW1pdFg5NgoJfQoKCWlucHV0QW1vdW50LCBvdXRwdXRBbW91bnQgOj0gci5leGFjdEluU3dhcFJvdXRlKDAsIHJsbSwgcGFyYW1zLCByZWZlcnJlcikKCglyZXR1cm4gdXRpbHMuRm9ybWF0SW50KGlucHV0QW1vdW50KSwgdXRpbHMuRm9ybWF0SW50KG91dHB1dEFtb3VudCkKfQoKLy8gZXhhY3RJblN3YXBSb3V0ZSBleGVjdXRlcyB0aGUgc3dhcCBvcGVyYXRpb24gYW5kIGhhbmRsZXMgdG9rZW4gdHJhbnNmZXJzIGFuZCByZWZlcnJhbCByZWdpc3RyYXRpb24uCi8vCi8vIFBlcmZvcm1zIHRoZSBhY3R1YWwgc3dhcCBvcGVyYXRpb24gdXNpbmcgY29tbW9uU3dhcFJvdXRlIGFuZCBoYW5kbGVzOgovLyAtIFNhZmUgdG9rZW4gdHJhbnNmZXJzIHRvIHRoZSBjYWxsZXIKLy8gLSBSZWZlcnJhbCByZWdpc3RyYXRpb24gYW5kIHRyYWNraW5nCi8vIC0gRXZlbnQgZW1pc3Npb24gZm9yIHN3YXAgY29tcGxldGlvbgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcGFyYW1zOiBTd2FwUm91dGVQYXJhbXMgY29udGFpbmluZyBhbGwgc3dhcCBjb25maWd1cmF0aW9uCi8vICAgLSByZWZlcnJlcjogUmVmZXJyYWwgYWRkcmVzcyBmb3IgcmVnaXN0cmF0aW9uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnB1dEFtb3VudDogQWN0dWFsIGlucHV0IGFtb3VudCBjb25zdW1lZCBhcyBzdHJpbmcKLy8gICAtIG91dHB1dEFtb3VudDogQWN0dWFsIG91dHB1dCBhbW91bnQgcmVjZWl2ZWQgYXMgc3RyaW5nCi8vCi8vIFBhbmljcyBpZiBzd2FwIGV4ZWN1dGlvbiBmYWlscyBvciB0b2tlbiB0cmFuc2ZlciBmYWlscy4KZnVuYyAociAqcm91dGVyVjEpIGV4YWN0SW5Td2FwUm91dGUoCglfIGludCwKCXJsbSByZWFsbSwKCXBhcmFtcyBTd2FwUm91dGVQYXJhbXMsCglyZWZlcnJlciBzdHJpbmcsCikgKGludDY0LCBpbnQ2NCkgewoJaW5wdXRBbW91bnQsIG91dHB1dEFtb3VudCwgZXJyIDo9IHIuY29tbW9uU3dhcFJvdXRlKDAsIHJsbSwgcGFyYW1zKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXByZXZpb3VzUmVhbG0gOj0gcmxtLlByZXZpb3VzKCkKCWNhbGxlciA6PSBwcmV2aW91c1JlYWxtLkFkZHJlc3MoKQoKCWNvbW1vbi5TYWZlR1JDMjBUcmFuc2ZlcigwLCBybG0sIHBhcmFtcy5vdXRwdXRUb2tlbiwgY2FsbGVyLCBvdXRwdXRBbW91bnQpCgoJLy8gaGFuZGxlIHJlZmVycmFsIHJlZ2lzdHJhdGlvbgoJYWN0dWFsUmVmZXJyZXIgOj0gcmVmZXJyYWwuVHJ5UmVnaXN0ZXIoY3Jvc3MocmxtKSwgY2FsbGVyLCByZWZlcnJlcikKCglldmVudEF0dHJzIDo9IGFwcGVuZChbXXN0cmluZ3sKCQkicHJldkFkZHIiLCBjYWxsZXIuU3RyaW5nKCksCgkJInByZXZSZWFsbSIsIHByZXZpb3VzUmVhbG0uUGtnUGF0aCgpLAoJCSJpbnB1dCIsIHBhcmFtcy5pbnB1dFRva2VuLAoJCSJvdXRwdXQiLCBwYXJhbXMub3V0cHV0VG9rZW4sCgkJImV4YWN0QW1vdW50IiwgdXRpbHMuRm9ybWF0SW50KHBhcmFtcy5leGFjdEFtb3VudCksCgkJInF1b3RlIiwgcGFyYW1zLnF1b3RlQXJyLAoJCSJyZXN1bHRJbnB1dEFtb3VudCIsIHV0aWxzLkZvcm1hdEludChpbnB1dEFtb3VudCksCgkJInJlc3VsdE91dHB1dEFtb3VudCIsIHV0aWxzLkZvcm1hdEludChvdXRwdXRBbW91bnQpLAoJCSJyZWZlcnJlciIsIGFjdHVhbFJlZmVycmVyLAoJfSwgYnVpbGRSb3V0ZUV2ZW50QXR0cnMocGFyYW1zLnJvdXRlQXJyKS4uLikKCgljaGFpbi5FbWl0KAoJCSJFeGFjdEluU3dhcCIsCgkJZXZlbnRBdHRycy4uLiwKCSkKCglyZXR1cm4gaW5wdXRBbW91bnQsIG91dHB1dEFtb3VudAp9Cgp0eXBlIEV4YWN0SW5Td2FwT3BlcmF0aW9uIHN0cnVjdCB7CgliYXNlU3dhcE9wZXJhdGlvbgoJcGFyYW1zIEV4YWN0SW5QYXJhbXMKCXJvdXRlciAqcm91dGVyVjEKfQoKLy8gTmV3RXhhY3RJblN3YXBPcGVyYXRpb24gY3JlYXRlcyBhbiBleGFjdC1pbnB1dCBvcGVyYXRpb24gZm9yIHJvdXRlciBleGVjdXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSByOiByb3V0ZXIgaW1wbGVtZW50YXRpb24gdXNlZCB0byBleGVjdXRlIHBvb2wgc3dhcHMKLy8gICAtIHBwOiBleGFjdC1pbnB1dCBhbW91bnQgYW5kIHJvdXRlIHNldHRpbmdzCi8vCi8vIFJldHVybnM6Ci8vICAgLSBvcGVyYXRpb246IGluaXRpYWxpemVkIEV4YWN0SW5Td2FwT3BlcmF0aW9uCmZ1bmMgTmV3RXhhY3RJblN3YXBPcGVyYXRpb24ociAqcm91dGVyVjEsIHBwIEV4YWN0SW5QYXJhbXMpICpFeGFjdEluU3dhcE9wZXJhdGlvbiB7CglyZXR1cm4gJkV4YWN0SW5Td2FwT3BlcmF0aW9uewoJCXJvdXRlcjogciwKCQlwYXJhbXM6IHBwLAoJCWJhc2VTd2FwT3BlcmF0aW9uOiBiYXNlU3dhcE9wZXJhdGlvbnsKCQkJc3FydFByaWNlTGltaXRYOTY6IHBwLlNxcnRQcmljZUxpbWl0WDk2LAoJCX0sCgl9Cn0KCi8vIFZhbGlkYXRlIGNoZWNrcyB0aGUgZXhhY3QtaW5wdXQgYW1vdW50IGFuZCBwYXJzZXMgcm91dGUvcXVvdGUgYWxsb2NhdGlvbnMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IG5pbCB3aGVuIGFtb3VudCwgcm91dGVzLCBhbmQgcXVvdGVzIGFyZSB2YWxpZDsgdmFsaWRhdGlvbiBlcnJvciBvdGhlcndpc2UKZnVuYyAob3AgKkV4YWN0SW5Td2FwT3BlcmF0aW9uKSBWYWxpZGF0ZSgpIGVycm9yIHsKCWFtb3VudEluIDo9IG9wLnBhcmFtcy5BbW91bnRJbgoKCWlmIGFtb3VudEluIDw9IDAgewoJCXJldHVybiB1Zm10LkVycm9yZigiaW52YWxpZCBhbW91bnRJbiglZCksIG11c3QgYmUgcG9zaXRpdmUiLCBhbW91bnRJbikKCX0KCgkvLyB3aGVuIGBTd2FwVHlwZWAgaXMgYEV4YWN0SW5gLCBhc3NpZ24gYGFtb3VudFNwZWNpZmllZGAgdGhlIGBhbW91bnRJbmAKCS8vIG9idGFpbmVkIGZyb20gYWJvdmUuCglvcC5hbW91bnRTcGVjaWZpZWQgPSBhbW91bnRJbgoKCXJvdXRlcywgcXVvdGVzLCBlcnIgOj0gdmFsaWRhdGVSb3V0ZXNBbmRRdW90ZXMob3AucGFyYW1zLlJvdXRlQXJyLCBvcC5wYXJhbXMuUXVvdGVBcnIpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJb3Aucm91dGVzID0gcm91dGVzCglvcC5xdW90ZXMgPSBxdW90ZXMKCglyZXR1cm4gbmlsCn0KCi8vIFByb2Nlc3MgZXhlY3V0ZXMgdGhlIHZhbGlkYXRlZCBleGFjdC1pbnB1dCBvcGVyYXRpb24gaW4gdGhlIHByb3BhZ2F0ZWQgcmVhbG0uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIG9wZXJhdGlvbiBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dCB1c2VkIGZvciBwb29sIHN3YXBzCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXN1bHQ6IGFnZ3JlZ2F0ZSBzd2FwIGFtb3VudHMgYW5kIHJvdXRlIG1ldGFkYXRhLCBvciBuaWwgb24gcHJvY2Vzc2luZyBlcnJvcgovLyAgIC0gZXJyOiBuaWwgb24gc3VjY2VzczsgcG9vbCBvciByb3V0ZSBleGVjdXRpb24gZXJyb3Igb3RoZXJ3aXNlCmZ1bmMgKG9wICpFeGFjdEluU3dhcE9wZXJhdGlvbikgUHJvY2VzcyhfIGludCwgcmxtIHJlYWxtKSAoKlN3YXBSZXN1bHQsIGVycm9yKSB7CglyZXN1bHRBbW91bnRJbiwgcmVzdWx0QW1vdW50T3V0LCBlcnIgOj0gb3AucHJvY2Vzc1JvdXRlcygwLCBybG0sIG9wLnJvdXRlciwgRXhhY3RJbikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoKCXJldHVybiAmU3dhcFJlc3VsdHsKCQlBbW91bnRJbjogICAgICAgIHJlc3VsdEFtb3VudEluLAoJCUFtb3VudE91dDogICAgICAgcmVzdWx0QW1vdW50T3V0LAoJCVJvdXRlczogICAgICAgICAgb3Aucm91dGVzLAoJCVF1b3RlczogICAgICAgICAgb3AucXVvdGVzLAoJCUFtb3VudFNwZWNpZmllZDogb3AuYW1vdW50U3BlY2lmaWVkLAoJfSwgbmlsCn0KGqxECg1leGFjdF9vdXQuZ25vEppEcGFja2FnZSByb3V0ZXIKCmltcG9ydCAoCgkiY2hhaW4iCgoJImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoKCXUyNTYgImduby5sYW5kL3AvZ25vc3dhcC91aW50MjU2L3YxIgoJImduby5sYW5kL3AvZ25vc3dhcC91dGlscy92MSIKCgkiZ25vLmxhbmQvci9nbm9zd2FwL2NvbW1vbiIKCSJnbm8ubGFuZC9yL2dub3N3YXAvZW1pc3Npb24iCgkiZ25vLmxhbmQvci9nbm9zd2FwL2hhbHQvdjEiCgkiZ25vLmxhbmQvci9nbm9zd2FwL3JlZmVycmFsL3YxIgopCgovLyBFeGFjdE91dFN3YXBSb3V0ZSBzd2FwcyB0b2tlbnMgZm9yIGEgcmVxdWVzdGVkIHBvc3Qtcm91dGVyLWZlZSBvdXRwdXQgdGFyZ2V0LgovLwovLyBFeGVjdXRlcyBhIHN3YXAgdG8gcmVjZWl2ZSB0aGUgcmVxdWVzdGVkIG5ldCBvdXRwdXQgdG9rZW5zLgovLyBDYWxjdWxhdGVzIHRoZSByZXF1aXJlZCBncm9zcyBwb29sIG91dHB1dCBhbmQgaW5wdXQgd29ya2luZyBiYWNrd2FyZHMKLy8gdGhyb3VnaCB0aGUgcm91dGUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIGltcGxlbWVudGF0aW9uIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0OyB0aGlzIGltcGxlbWVudGF0aW9uIHZhbGlkYXRlcyBhbmQgZm9yd2FyZHMgaXQKLy8gICAtIGlucHV0VG9rZW46IElucHV0IHRva2VuIGNvbnRyYWN0IHBhdGgKLy8gICAtIG91dHB1dFRva2VuOiBPdXRwdXQgdG9rZW4gY29udHJhY3QgcGF0aAovLyAgIC0gYW1vdW50T3V0OiBSZXF1ZXN0ZWQgbmV0IG91dHB1dCB0YXJnZXQKLy8gICAtIHJvdXRlQXJyOiBTd2FwIHJvdXRlcyBzZXBhcmF0ZWQgYnkgY29tbWE7IGVhY2ggcm91dGUgbWF5IGNvbnRhaW4gdXAgdG8gMyBob3BzIGpvaW5lZCBieSAqUE9PTCoKLy8gICAtIHF1b3RlQXJyOiBTcGxpdCBwZXJjZW50YWdlcyAiNzAsMzAiIChtdXN0IHN1bSB0byAxMDApCi8vICAgLSBhbW91bnRJbk1heDogTWF4aW11bSBpbnB1dCB0byBzcGVuZCAoc2xpcHBhZ2UgcHJvdGVjdGlvbikKLy8gICAtIGRlYWRsaW5lOiBVbml4IHRpbWVzdGFtcCBmb3IgZXhwaXJhdGlvbgovLyAgIC0gcmVmZXJyZXI6IE9wdGlvbmFsIHJlZmVycmFsIGFkZHJlc3MKLy8KLy8gUm91dGUgY2FsY3VsYXRpb246Ci8vICAgLSBXb3JrcyBiYWNrd2FyZHMgZnJvbSBvdXRwdXQgdG8gaW5wdXQKLy8gICAtIEVhY2ggaG9wIGluY3JlYXNlcyByZXF1aXJlZCBpbnB1dAovLyAgIC0gTXVsdGktcGF0aCBhZ2dyZWdhdGVzIHRvdGFsIGlucHV0Ci8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnRJbjogQWN0dWFsIGlucHV0IGNvbnN1bWVkCi8vICAgLSBhbW91bnRPdXQ6IE5ldCBvdXRwdXQgZGVsaXZlcmVkIGFmdGVyIHRoZSByb3V0ZXIgZmVlCi8vCi8vIFJldmVydHMgaWYgaW5wdXQgPiBhbW91bnRJbk1heCBvciBkZWFkbGluZSBwYXNzZWQuCmZ1bmMgKHIgKnJvdXRlclYxKSBFeGFjdE91dFN3YXBSb3V0ZSgKCV8gaW50LAoJcmxtIHJlYWxtLAoJaW5wdXRUb2tlbiBzdHJpbmcsCglvdXRwdXRUb2tlbiBzdHJpbmcsCglhbW91bnRPdXQgc3RyaW5nLAoJcm91dGVBcnIgc3RyaW5nLAoJcXVvdGVBcnIgc3RyaW5nLAoJYW1vdW50SW5NYXggc3RyaW5nLAoJZGVhZGxpbmUgaW50NjQsCglyZWZlcnJlciBzdHJpbmcsCikgKHN0cmluZywgc3RyaW5nKSB7CglhY2Nlc3MuQXNzZXJ0SXNSbG1DdXJyZW50KDAsIHJsbSkKCgloYWx0LkFzc2VydElzTm90SGFsdGVkUm91dGVyKCkKCgljb21tb24uQXNzZXJ0SXNOb3RIYW5kbGVOYXRpdmVDb2luKCkKCglhc3NlcnRJc1ZhbGlkUm91dGVQYXRocyhyb3V0ZUFyciwgaW5wdXRUb2tlbiwgb3V0cHV0VG9rZW4pCglhc3NlcnRJc05vdEV4cGlyZWQoZGVhZGxpbmUpCglhc3NlcnRJc0V4aXN0c1Bvb2xzKHJvdXRlQXJyKQoKCWVtaXNzaW9uLk1pbnRBbmREaXN0cmlidXRlR25zKGNyb3NzKHJsbSkpCgoJcGFyYW1zIDo9IFN3YXBSb3V0ZVBhcmFtc3sKCQlpbnB1dFRva2VuOiAgICAgICAgaW5wdXRUb2tlbiwKCQlvdXRwdXRUb2tlbjogICAgICAgb3V0cHV0VG9rZW4sCgkJcm91dGVBcnI6ICAgICAgICAgIHJvdXRlQXJyLAoJCXF1b3RlQXJyOiAgICAgICAgICBxdW90ZUFyciwKCQlkZWFkbGluZTogICAgICAgICAgZGVhZGxpbmUsCgkJdHlwOiAgICAgICAgICAgICAgIEV4YWN0T3V0LAoJCWV4YWN0QW1vdW50OiAgICAgICB1dGlscy5TYWZlUGFyc2VJbnQ2NChhbW91bnRPdXQpLAoJCWxpbWl0QW1vdW50OiAgICAgICB1dGlscy5TYWZlUGFyc2VJbnQ2NChhbW91bnRJbk1heCksCgkJc3FydFByaWNlTGltaXRYOTY6IHUyNTYuWmVybygpLCAvLyBtdWx0aS1ob3Agc3dhcCBpcyBub3QgYWxsb3dlZCB0byBzZXQgc3FydFByaWNlTGltaXRYOTYKCX0KCglpbnB1dEFtb3VudCwgb3V0cHV0QW1vdW50IDo9IHIuZXhhY3RPdXRTd2FwUm91dGUoMCwgcmxtLCBwYXJhbXMsIHJlZmVycmVyKQoKCXJldHVybiB1dGlscy5Gb3JtYXRJbnQoaW5wdXRBbW91bnQpLCB1dGlscy5Gb3JtYXRJbnQob3V0cHV0QW1vdW50KQp9CgovLyBFeGFjdE91dFNpbmdsZVN3YXBSb3V0ZSBzd2FwcyB0b2tlbnMgZm9yIGEgcmVxdWVzdGVkIHBvc3Qtcm91dGVyLWZlZSBvdXRwdXQKLy8gdGFyZ2V0IHRocm91Z2ggYSBzaW5nbGUgcm91dGUuCi8vCi8vIEV4ZWN1dGVzIGEgc2luZ2xlLWhvcCBzd2FwIHRocm91Z2ggYSBzaW5nbGUgc3BlY2lmaWVkIHJvdXRlLgovLyBBbGxvd3MgcHJpY2UgbGltaXQgY29udHJvbCB2aWEgc3FydFByaWNlTGltaXRYOTYuCi8vIEFwcGxpZXMgc2xpcHBhZ2UgcHJvdGVjdGlvbiB2aWEgbWF4aW11bSBpbnB1dCBhbW91bnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIGltcGxlbWVudGF0aW9uIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0OyB0aGlzIGltcGxlbWVudGF0aW9uIHZhbGlkYXRlcyBhbmQgZm9yd2FyZHMgaXQKLy8gICAtIGlucHV0VG9rZW46IElucHV0IHRva2VuIGNvbnRyYWN0IHBhdGgKLy8gICAtIG91dHB1dFRva2VuOiBPdXRwdXQgdG9rZW4gY29udHJhY3QgcGF0aAovLyAgIC0gYW1vdW50T3V0OiBSZXF1ZXN0ZWQgbmV0IG91dHB1dCB0YXJnZXQKLy8gICAtIHJvdXRlQXJyOiBTaW5nbGUtaG9wIHJvdXRlIHBhdGgKLy8gICAtIGFtb3VudEluTWF4OiBNYXhpbXVtIGlucHV0IHRvIHNwZW5kIChzbGlwcGFnZSBwcm90ZWN0aW9uKQovLyAgIC0gc3FydFByaWNlTGltaXRYOTY6IFByaWNlIGxpbWl0IGZvciBzd2FwIGV4ZWN1dGlvbiAoMCBmb3Igbm8gbGltaXQpCi8vICAgLSBkZWFkbGluZTogVW5peCB0aW1lc3RhbXAgZm9yIGV4cGlyYXRpb24KLy8gICAtIHJlZmVycmVyOiBPcHRpb25hbCByZWZlcnJhbCBhZGRyZXNzCi8vCi8vIFJvdXRlIGZvcm1hdDoKLy8gICAtIFNpbmdsZS1ob3A6ICJJTlBVVF9UT0tFTjpPVVRQVVRfVE9LRU46RkVFIgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50SW46IEFjdHVhbCBpbnB1dCBjb25zdW1lZAovLyAgIC0gYW1vdW50T3V0OiBOZXQgb3V0cHV0IGRlbGl2ZXJlZCBhZnRlciB0aGUgcm91dGVyIGZlZQovLwovLyBXaXRoIGEgbm9uemVybyBwcmljZSBsaW1pdCwgdGhlIHN3YXAgbWF5IHN0b3AgYXQgdGhlIGxpbWl0IGFuZCBkZWxpdmVyIGxlc3MKLy8gdGhhbiBhbW91bnRPdXQ7IGFtb3VudEluTWF4IGFuZCB0aGUgZGVhZGxpbmUgYXJlIHN0aWxsIGVuZm9yY2VkLgpmdW5jIChyICpyb3V0ZXJWMSkgRXhhY3RPdXRTaW5nbGVTd2FwUm91dGUoCglfIGludCwKCXJsbSByZWFsbSwKCWlucHV0VG9rZW4gc3RyaW5nLAoJb3V0cHV0VG9rZW4gc3RyaW5nLAoJYW1vdW50T3V0IHN0cmluZywKCXJvdXRlQXJyIHN0cmluZywKCWFtb3VudEluTWF4IHN0cmluZywKCXNxcnRQcmljZUxpbWl0WDk2IHN0cmluZywKCWRlYWRsaW5lIGludDY0LAoJcmVmZXJyZXIgc3RyaW5nLAopIChzdHJpbmcsIHN0cmluZykgewoJYWNjZXNzLkFzc2VydElzUmxtQ3VycmVudCgwLCBybG0pCgoJaGFsdC5Bc3NlcnRJc05vdEhhbHRlZFJvdXRlcigpCgoJY29tbW9uLkFzc2VydElzTm90SGFuZGxlTmF0aXZlQ29pbigpCgoJYXNzZXJ0SXNWYWxpZFNpbmdsZVN3YXBSb3V0ZUFyclBhdGgocm91dGVBcnIsIGlucHV0VG9rZW4sIG91dHB1dFRva2VuKQoJYXNzZXJ0SXNWYWxpZFNxcnRQcmljZUxpbWl0WDk2KHNxcnRQcmljZUxpbWl0WDk2KQoJYXNzZXJ0SXNOb3RFeHBpcmVkKGRlYWRsaW5lKQoJYXNzZXJ0SXNFeGlzdHNQb29scyhyb3V0ZUFycikKCgllbWlzc2lvbi5NaW50QW5kRGlzdHJpYnV0ZUducyhjcm9zcyhybG0pKQoKCXBhcmFtcyA6PSBTd2FwUm91dGVQYXJhbXN7CgkJaW5wdXRUb2tlbjogICAgICAgIGlucHV0VG9rZW4sCgkJb3V0cHV0VG9rZW46ICAgICAgIG91dHB1dFRva2VuLAoJCXJvdXRlQXJyOiAgICAgICAgICByb3V0ZUFyciwKCQlxdW90ZUFycjogICAgICAgICAgIjEwMCIsCgkJZGVhZGxpbmU6ICAgICAgICAgIGRlYWRsaW5lLAoJCXR5cDogICAgICAgICAgICAgICBFeGFjdE91dCwKCQlleGFjdEFtb3VudDogICAgICAgdXRpbHMuU2FmZVBhcnNlSW50NjQoYW1vdW50T3V0KSwKCQlsaW1pdEFtb3VudDogICAgICAgdXRpbHMuU2FmZVBhcnNlSW50NjQoYW1vdW50SW5NYXgpLAoJCXNxcnRQcmljZUxpbWl0WDk2OiB1MjU2Lk11c3RGcm9tRGVjaW1hbChzcXJ0UHJpY2VMaW1pdFg5NiksIC8vIHNpbmdsZSBzd2FwIGlzIGFsbG93ZWQgdG8gc2V0IHNxcnRQcmljZUxpbWl0WDk2Cgl9CgoJaW5wdXRBbW91bnQsIG91dHB1dEFtb3VudCA6PSByLmV4YWN0T3V0U3dhcFJvdXRlKDAsIHJsbSwgcGFyYW1zLCByZWZlcnJlcikKCglyZXR1cm4gdXRpbHMuRm9ybWF0SW50KGlucHV0QW1vdW50KSwgdXRpbHMuRm9ybWF0SW50KG91dHB1dEFtb3VudCkKfQoKLy8gZXhhY3RPdXRTd2FwUm91dGUgZXhlY3V0ZXMgdGhlIHN3YXAgb3BlcmF0aW9uIGFuZCBoYW5kbGVzIHRva2VuIHRyYW5zZmVycyBhbmQgcmVmZXJyYWwgcmVnaXN0cmF0aW9uLgovLwovLyBQZXJmb3JtcyB0aGUgYWN0dWFsIHN3YXAgb3BlcmF0aW9uIHVzaW5nIGNvbW1vblN3YXBSb3V0ZSBhbmQgaGFuZGxlczoKLy8gLSBTYWZlIHRva2VuIHRyYW5zZmVycyB0byB0aGUgY2FsbGVyCi8vIC0gUmVmZXJyYWwgcmVnaXN0cmF0aW9uIGFuZCB0cmFja2luZwovLyAtIEV2ZW50IGVtaXNzaW9uIGZvciBzd2FwIGNvbXBsZXRpb24KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBhcmFtczogU3dhcFJvdXRlUGFyYW1zIGNvbnRhaW5pbmcgYWxsIHN3YXAgY29uZmlndXJhdGlvbgovLyAgIC0gcmVmZXJyZXI6IFJlZmVycmFsIGFkZHJlc3MgZm9yIHJlZ2lzdHJhdGlvbgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW5wdXRBbW91bnQ6IEFjdHVhbCBpbnB1dCBhbW91bnQgY29uc3VtZWQgYXMgc3RyaW5nCi8vICAgLSBvdXRwdXRBbW91bnQ6IEFjdHVhbCBvdXRwdXQgYW1vdW50IHJlY2VpdmVkIGFzIHN0cmluZwovLwovLyBQYW5pY3MgaWYgc3dhcCBleGVjdXRpb24gZmFpbHMgb3IgdG9rZW4gdHJhbnNmZXIgZmFpbHMuCmZ1bmMgKHIgKnJvdXRlclYxKSBleGFjdE91dFN3YXBSb3V0ZSgKCV8gaW50LAoJcmxtIHJlYWxtLAoJcGFyYW1zIFN3YXBSb3V0ZVBhcmFtcywKCXJlZmVycmVyIHN0cmluZywKKSAoaW50NjQsIGludDY0KSB7CglpbnB1dEFtb3VudCwgb3V0cHV0QW1vdW50LCBlcnIgOj0gci5jb21tb25Td2FwUm91dGUoMCwgcmxtLCBwYXJhbXMpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJcHJldmlvdXNSZWFsbSA6PSBybG0uUHJldmlvdXMoKQoJY2FsbGVyIDo9IHByZXZpb3VzUmVhbG0uQWRkcmVzcygpCgoJY29tbW9uLlNhZmVHUkMyMFRyYW5zZmVyKDAsIHJsbSwgcGFyYW1zLm91dHB1dFRva2VuLCBjYWxsZXIsIG91dHB1dEFtb3VudCkKCgkvLyBoYW5kbGUgcmVmZXJyYWwgcmVnaXN0cmF0aW9uCglhY3R1YWxSZWZlcnJlciA6PSByZWZlcnJhbC5UcnlSZWdpc3Rlcihjcm9zcyhybG0pLCBjYWxsZXIsIHJlZmVycmVyKQoKCWV2ZW50QXR0cnMgOj0gYXBwZW5kKFtdc3RyaW5newoJCSJwcmV2QWRkciIsIGNhbGxlci5TdHJpbmcoKSwKCQkicHJldlJlYWxtIiwgcHJldmlvdXNSZWFsbS5Qa2dQYXRoKCksCgkJImlucHV0IiwgcGFyYW1zLmlucHV0VG9rZW4sCgkJIm91dHB1dCIsIHBhcmFtcy5vdXRwdXRUb2tlbiwKCQkiZXhhY3RBbW91bnQiLCB1dGlscy5Gb3JtYXRJbnQocGFyYW1zLmV4YWN0QW1vdW50KSwKCQkicXVvdGUiLCBwYXJhbXMucXVvdGVBcnIsCgkJInJlc3VsdElucHV0QW1vdW50IiwgdXRpbHMuRm9ybWF0SW50KGlucHV0QW1vdW50KSwKCQkicmVzdWx0T3V0cHV0QW1vdW50IiwgdXRpbHMuRm9ybWF0SW50KG91dHB1dEFtb3VudCksCgkJInJlZmVycmVyIiwgYWN0dWFsUmVmZXJyZXIsCgl9LCBidWlsZFJvdXRlRXZlbnRBdHRycyhwYXJhbXMucm91dGVBcnIpLi4uKQoKCWNoYWluLkVtaXQoCgkJIkV4YWN0T3V0U3dhcCIsCgkJZXZlbnRBdHRycy4uLiwKCSkKCglyZXR1cm4gaW5wdXRBbW91bnQsIG91dHB1dEFtb3VudAp9CgovLyBFeGFjdE91dFN3YXBPcGVyYXRpb24gaGFuZGxlcyBzd2FwcyB3aGVyZSB0aGUgb3V0cHV0IGFtb3VudCBpcyBzcGVjaWZpZWQuCnR5cGUgRXhhY3RPdXRTd2FwT3BlcmF0aW9uIHN0cnVjdCB7Cglyb3V0ZXIgKnJvdXRlclYxCgliYXNlU3dhcE9wZXJhdGlvbgoJcGFyYW1zIEV4YWN0T3V0UGFyYW1zCn0KCi8vIE5ld0V4YWN0T3V0U3dhcE9wZXJhdGlvbiBjcmVhdGVzIGFuIGV4YWN0LW91dHB1dCBvcGVyYXRpb24gZm9yIHJvdXRlciBleGVjdXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSByOiByb3V0ZXIgaW1wbGVtZW50YXRpb24gdXNlZCB0byBleGVjdXRlIHBvb2wgc3dhcHMKLy8gICAtIHBwOiBleGFjdC1vdXRwdXQgYW1vdW50IGFuZCByb3V0ZSBzZXR0aW5ncwovLwovLyBSZXR1cm5zOgovLyAgIC0gb3BlcmF0aW9uOiBpbml0aWFsaXplZCBFeGFjdE91dFN3YXBPcGVyYXRpb24KZnVuYyBOZXdFeGFjdE91dFN3YXBPcGVyYXRpb24ociAqcm91dGVyVjEsIHBwIEV4YWN0T3V0UGFyYW1zKSAqRXhhY3RPdXRTd2FwT3BlcmF0aW9uIHsKCXJldHVybiAmRXhhY3RPdXRTd2FwT3BlcmF0aW9uewoJCXJvdXRlcjogciwKCQlwYXJhbXM6IHBwLAoJCWJhc2VTd2FwT3BlcmF0aW9uOiBiYXNlU3dhcE9wZXJhdGlvbnsKCQkJc3FydFByaWNlTGltaXRYOTY6IHBwLlNxcnRQcmljZUxpbWl0WDk2LAoJCX0sCgl9Cn0KCi8vIFZhbGlkYXRlIGNoZWNrcyB0aGUgZXhhY3Qtb3V0cHV0IGFtb3VudCBhbmQgcGFyc2VzIHJvdXRlL3F1b3RlIGFsbG9jYXRpb25zLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBuaWwgd2hlbiBhbW91bnQsIHJvdXRlcywgYW5kIHF1b3RlcyBhcmUgdmFsaWQ7IHZhbGlkYXRpb24gZXJyb3Igb3RoZXJ3aXNlCmZ1bmMgKG9wICpFeGFjdE91dFN3YXBPcGVyYXRpb24pIFZhbGlkYXRlKCkgZXJyb3IgewoJYW1vdW50T3V0IDo9IG9wLnBhcmFtcy5BbW91bnRPdXQKCWlmIGFtb3VudE91dCA8PSAwIHsKCQlyZXR1cm4gdWZtdC5FcnJvcmYoImludmFsaWQgYW1vdW50T3V0KCVkKSwgbXVzdCBiZSBwb3NpdGl2ZSIsIGFtb3VudE91dCkKCX0KCgkvLyBhc3NpZ24gYSBzaWduZWQgcmV2ZXJzZWQgYGFtb3VudE91dGAgdG8gYGFtb3VudFNwZWNpZmllZGAKCS8vIHdoZW4gaXQncyBhbiBFeGFjdE91dAoJb3AuYW1vdW50U3BlY2lmaWVkID0gLWFtb3VudE91dAoKCXJvdXRlcywgcXVvdGVzLCBlcnIgOj0gdmFsaWRhdGVSb3V0ZXNBbmRRdW90ZXMob3AucGFyYW1zLlJvdXRlQXJyLCBvcC5wYXJhbXMuUXVvdGVBcnIpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJb3Aucm91dGVzID0gcm91dGVzCglvcC5xdW90ZXMgPSBxdW90ZXMKCglyZXR1cm4gbmlsCn0KCi8vIFByb2Nlc3MgZXhlY3V0ZXMgdGhlIHZhbGlkYXRlZCBleGFjdC1vdXRwdXQgb3BlcmF0aW9uIGluIHRoZSBwcm9wYWdhdGVkIHJlYWxtLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogbGVhZGluZyBvcGVyYXRpb24gZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQgdXNlZCBmb3IgcG9vbCBzd2FwcwovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVzdWx0OiBhZ2dyZWdhdGUgc3dhcCBhbW91bnRzIGFuZCByb3V0ZSBtZXRhZGF0YSwgb3IgbmlsIG9uIHByb2Nlc3NpbmcgZXJyb3IKLy8gICAtIGVycjogbmlsIG9uIHN1Y2Nlc3M7IHBvb2wgb3Igcm91dGUgZXhlY3V0aW9uIGVycm9yIG90aGVyd2lzZQpmdW5jIChvcCAqRXhhY3RPdXRTd2FwT3BlcmF0aW9uKSBQcm9jZXNzKF8gaW50LCBybG0gcmVhbG0pICgqU3dhcFJlc3VsdCwgZXJyb3IpIHsKCXJlc3VsdEFtb3VudEluLCByZXN1bHRBbW91bnRPdXQsIGVyciA6PSBvcC5wcm9jZXNzUm91dGVzKDAsIHJsbSwgb3Aucm91dGVyLCBFeGFjdE91dCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoKCXJldHVybiAmU3dhcFJlc3VsdHsKCQlBbW91bnRJbjogICAgICAgIHJlc3VsdEFtb3VudEluLAoJCUFtb3VudE91dDogICAgICAgcmVzdWx0QW1vdW50T3V0LAoJCVJvdXRlczogICAgICAgICAgb3Aucm91dGVzLAoJCVF1b3RlczogICAgICAgICAgb3AucXVvdGVzLAoJCUFtb3VudFNwZWNpZmllZDogb3AuYW1vdW50U3BlY2lmaWVkLAoJfSwgbmlsCn0KGkMKC2dub21vZC50b21sEjRtb2R1bGUgPSAiZ25vLmxhbmQvci9nbm9zd2FwL3JvdXRlci92MSIKZ25vID0gIjAuOSIKGqIHCghpbml0LmdubxKVB3BhY2thZ2Ugcm91dGVyCgppbXBvcnQgKAoJImduby5sYW5kL3IvZ25vc3dhcC9yb3V0ZXIiCikKCmNvbnN0ICgKCWRlZmF1bHRTd2FwRmVlQlBTID0gdWludDY0KDE1KSAvLyAwLjE1JQopCgpmdW5jIGluaXQoY3VyIHJlYWxtKSB7CglyZWdpc3RlclJvdXRlclYxKGN1cikKfQoKZnVuYyByZWdpc3RlclJvdXRlclYxKGN1ciByZWFsbSkgewoJcm91dGVyLlJlZ2lzdGVySW5pdGlhbGl6ZXIoY3Jvc3MoY3VyKSwgZnVuYyhfIGludCwgcmxtIHJlYWxtLCByb3V0ZXJTdG9yZSByb3V0ZXIuSVJvdXRlclN0b3JlKSByb3V0ZXIuSVJvdXRlciB7CgkJZXJyIDo9IGluaXRTdG9yZURhdGEoMCwgcmxtLCByb3V0ZXJTdG9yZSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcGFuaWMoZXJyKQoJCX0KCgkJcmV0dXJuIE5ld1JvdXRlclYxKHJvdXRlclN0b3JlKQoJfSkKfQoKZnVuYyBpbml0U3RvcmVEYXRhKF8gaW50LCBybG0gcmVhbG0sIHJvdXRlclN0b3JlIHJvdXRlci5JUm91dGVyU3RvcmUpIGVycm9yIHsKCWlmICFyb3V0ZXJTdG9yZS5IYXNTd2FwRmVlS2V5KCkgewoJCWVyciA6PSByb3V0ZXJTdG9yZS5TZXRTd2FwRmVlKDAsIHJsbSwgZGVmYXVsdFN3YXBGZWVCUFMpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBlcnIKCQl9Cgl9CgoJcGVuZGluZ1Byb3RvY29sRmVlcyA6PSBtYWtlKG1hcFtzdHJpbmddaW50NjQpCglpZiByb3V0ZXJTdG9yZS5IYXNQZW5kaW5nUHJvdG9jb2xGZWVzS2V5KCkgewoJCXBlbmRpbmdQcm90b2NvbEZlZXMgPSByb3V0ZXJTdG9yZS5HZXRQZW5kaW5nUHJvdG9jb2xGZWVzKCkKCX0KCWlmIGVyciA6PSByb3V0ZXJTdG9yZS5TZXRQZW5kaW5nUHJvdG9jb2xGZWVzKDAsIHJsbSwgcGVuZGluZ1Byb3RvY29sRmVlcyk7IGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCglyZXR1cm4gbmlsCn0KGpkECgxpbnN0YW5jZS5nbm8SiARwYWNrYWdlIHJvdXRlcgoKaW1wb3J0ICgKCSJnbm8ubGFuZC9yL2dub3N3YXAvcm91dGVyIgopCgp0eXBlIHJvdXRlclYxIHN0cnVjdCB7CglzdG9yZSByb3V0ZXIuSVJvdXRlclN0b3JlCn0KCi8vIE5ld1JvdXRlclYxIGNyZWF0ZXMgYSByb3V0ZXIgdjEgaW1wbGVtZW50YXRpb24gYmFja2VkIGJ5IHJvdXRlclN0b3JlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcm91dGVyU3RvcmU6IHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gdXNlZCBmb3Igc3dhcC1mZWUgYW5kIHBlbmRpbmcgcHJvdG9jb2wtZmVlIHN0YXRlCi8vCi8vIFJldHVybnM6Ci8vICAgLSByb3V0ZXI6IGluaXRpYWxpemVkIElSb3V0ZXIgaW1wbGVtZW50YXRpb24gYmFja2VkIGJ5IHJvdXRlclN0b3JlCmZ1bmMgTmV3Um91dGVyVjEoCglyb3V0ZXJTdG9yZSByb3V0ZXIuSVJvdXRlclN0b3JlLAopIHJvdXRlci5JUm91dGVyIHsKCWluc3RhbmNlIDo9ICZyb3V0ZXJWMXsKCQlzdG9yZTogcm91dGVyU3RvcmUsCgl9CgoJcmV0dXJuIGluc3RhbmNlCn0KGpItChVwcm90b2NvbF9mZWVfc3dhcC5nbm8S+CxwYWNrYWdlIHJvdXRlcgoKaW1wb3J0ICgKCSJjaGFpbiIKCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCgoJZ25zbWF0aCAiZ25vLmxhbmQvcC9nbm9zd2FwL2duc21hdGgvdjEiCglwcmJhYyAiZ25vLmxhbmQvcC9nbm9zd2FwL3JiYWMvdjEiCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKCSJnbm8ubGFuZC9wL2dub3N3YXAvdXRpbHMvdjEiCgoJImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCgkiZ25vLmxhbmQvci9nbm9zd2FwL2NvbW1vbiIKCSJnbm8ubGFuZC9yL2dub3N3YXAvaGFsdC92MSIKCglwZiAiZ25vLmxhbmQvci9nbm9zd2FwL3Byb3RvY29sX2ZlZSIKCV8gImduby5sYW5kL3IvZ25vc3dhcC9wcm90b2NvbF9mZWUvdjEiCikKCi8vIEdldFN3YXBGZWUgcmV0dXJucyB0aGUgY3VycmVudCByb3V0ZXIgZmVlIHJhdGUgaW4gYmFzaXMgcG9pbnRzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZmVlOiBjb25maWd1cmVkIHJvdXRlciBmZWUgaW4gYmFzaXMgcG9pbnRzCmZ1bmMgKHIgKnJvdXRlclYxKSBHZXRTd2FwRmVlKCkgdWludDY0IHsKCXJldHVybiByLnN0b3JlLkdldFN3YXBGZWUoKQp9CgovLyBTZXRTd2FwRmVlIHNldHMgdGhlIHByb3RvY29sIHN3YXAgZmVlIHJhdGUuCi8vCi8vIEZlZSBpcyBkZWR1Y3RlZCBmcm9tIHN3YXAgb3V0cHV0IGFuZCBzZW50IHRvIHByb3RvY29sIGZlZSBjb250cmFjdC4KLy8gT25seSBjYWxsYWJsZSBieSBhZG1pbiBvciBnb3Zlcm5hbmNlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogbGVhZGluZyBjYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgZm9yIHRoZSBhdXRob3JpemVkIHN0b3JhZ2Ugd3JpdGUKLy8gICAtIGZlZTogbmV3IHByb3RvY29sIGZlZSByYXRlIGluIGJhc2lzIHBvaW50cywgYm91bmRlZCB0byAwIHRocm91Z2ggMTAwMAovLwovLyBBY2Nlc3M6Ci8vICAgLSBSZXF1aXJlczogQWRtaW4gb3IgR292ZXJuYW5jZSByb2xlCi8vICAgLSBIYWx0IGNoZWNrOiBSb3V0ZXIgYW5kIFByb3RvY29sRmVlIG11c3Qgbm90IGJlIGhhbHRlZAovLwovLyBFdmVudHM6Ci8vICAgLSBTZXRTd2FwRmVlOiBFbWl0cyBwcmV2aW91cyBhbmQgbmV3IGZlZSB2YWx1ZXMKLy8KLy8gUmV2ZXJ0cyBpZjoKLy8gICAtIENhbGxlciBpcyBub3QgYWRtaW4vZ292ZXJuYW5jZQovLyAgIC0gRmVlID4gMTAwMCBicHMgKDEwJSkKLy8gICAtIFJvdXRlciBvciBQcm90b2NvbEZlZSBpcyBoYWx0ZWQKZnVuYyAociAqcm91dGVyVjEpIFNldFN3YXBGZWUoXyBpbnQsIHJsbSByZWFsbSwgZmVlIHVpbnQ2NCkgewoJYWNjZXNzLkFzc2VydElzUmxtQ3VycmVudCgwLCBybG0pCgoJaGFsdC5Bc3NlcnRJc05vdEhhbHRlZFJvdXRlcigpCgloYWx0LkFzc2VydElzTm90SGFsdGVkUHJvdG9jb2xGZWUoKQoKCXByZXZpb3VzUmVhbG0gOj0gcmxtLlByZXZpb3VzKCkKCWNhbGxlciA6PSBwcmV2aW91c1JlYWxtLkFkZHJlc3MoKQoJYWNjZXNzLkFzc2VydElzQWRtaW5PckdvdmVybmFuY2UoY2FsbGVyKQoKCS8vIG1heCBzd2FwIGZlZSBpcyAxMDAwIChicHMpCglpZiBmZWUgPiAxMDAwIHsKCQlwYW5pYyh1Zm10LkVycm9yZigKCQkJIiVzOiBmZWUgbXVzdCBiZSBpbiByYW5nZSAwIHRvIDEwMDAgKDEwJSkuIGdvdCAlZCIsCgkJCWVyckludmFsaWRTd2FwRmVlLCBmZWUsCgkJKSkKCX0KCglwcmV2U3dhcEZlZSA6PSByLnN0b3JlLkdldFN3YXBGZWUoKQoJaWYgZXJyIDo9IHIuc3RvcmUuU2V0U3dhcEZlZSgwLCBybG0sIGZlZSk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgljaGFpbi5FbWl0KAoJCSJTZXRTd2FwRmVlIiwKCQkicHJldkFkZHIiLCBwcmV2aW91c1JlYWxtLkFkZHJlc3MoKS5TdHJpbmcoKSwKCQkicHJldlJlYWxtIiwgcHJldmlvdXNSZWFsbS5Qa2dQYXRoKCksCgkJIm5ld0ZlZSIsIHV0aWxzLkZvcm1hdFVpbnQoZmVlKSwKCQkicHJldkZlZSIsIHV0aWxzLkZvcm1hdFVpbnQocHJldlN3YXBGZWUpLAoJKQp9CgovLyBoYW5kbGVTd2FwRmVlIGRlZHVjdHMgdGhlIHByb3RvY29sIGZlZSBmcm9tIHRoZSBzd2FwIGFtb3VudCBhbmQgdHJhbnNmZXJzIGl0IHRvIHRoZSBwcm90b2NvbCBmZWUgY29udHJhY3QuCmZ1bmMgKHIgKnJvdXRlclYxKSBoYW5kbGVTd2FwRmVlKAoJXyBpbnQsCglybG0gcmVhbG0sCglvdXRwdXRUb2tlbiBzdHJpbmcsCglhbW91bnQgaW50NjQsCikgaW50NjQgewoJY3VycmVudFRva2VuUGF0aCA6PSBvdXRwdXRUb2tlbgoKCXN3YXBGZWUgOj0gci5zdG9yZS5HZXRTd2FwRmVlKCkKCWlmIHN3YXBGZWUgPD0gMCB7CgkJci5zZXR0bGVQcm90b2NvbEZlZSgwLCBybG0sIGN1cnJlbnRUb2tlblBhdGgsIDApCgkJcmV0dXJuIGFtb3VudAoJfQoKCWZlZUFtb3VudEludDY0IDo9IGNhbGN1bGF0ZVJvdXRlckZlZShhbW91bnQsIHN3YXBGZWUpCglyLnNldHRsZVByb3RvY29sRmVlKDAsIHJsbSwgY3VycmVudFRva2VuUGF0aCwgZmVlQW1vdW50SW50NjQpCgoJcHJldmlvdXNSZWFsbSA6PSBybG0uUHJldmlvdXMoKQoJY2hhaW4uRW1pdCgKCQkiU3dhcFJvdXRlRmVlIiwKCQkicHJldkFkZHIiLCBwcmV2aW91c1JlYWxtLkFkZHJlc3MoKS5TdHJpbmcoKSwKCQkicHJldlJlYWxtIiwgcHJldmlvdXNSZWFsbS5Qa2dQYXRoKCksCgkJInRva2VuUGF0aCIsIGN1cnJlbnRUb2tlblBhdGgsCgkJImFtb3VudCIsIHV0aWxzLkZvcm1hdEludChmZWVBbW91bnRJbnQ2NCksCgkpCgoJcmV0dXJuIGduc21hdGguU2FmZVN1YkludDY0KGFtb3VudCwgZmVlQW1vdW50SW50NjQpCn0KCi8vIEdldFBlbmRpbmdQcm90b2NvbEZlZXMgcmV0dXJucyBwZW5kaW5nIHByb3RvY29sIGZlZSBhbW91bnRzIGtleWVkIGJ5IHRva2VuIHBhdGguCi8vCi8vIFJldHVybnM6Ci8vICAgLSBmZWVzOiB0b2tlbi1wYXRoIHRvIHBlbmRpbmcgYW1vdW50IG1hcCBoZWxkIGJ5IHRoZSByb3V0ZXIKZnVuYyAociAqcm91dGVyVjEpIEdldFBlbmRpbmdQcm90b2NvbEZlZXMoKSBtYXBbc3RyaW5nXWludDY0IHsKCXJldHVybiByLnN0b3JlLkdldFBlbmRpbmdQcm90b2NvbEZlZXMoKQp9CgpmdW5jIChyICpyb3V0ZXJWMSkgYWRkUGVuZGluZ1Byb3RvY29sRmVlKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcsIGFtb3VudCBpbnQ2NCkgewoJaWYgYW1vdW50IDw9IDAgewoJCXJldHVybgoJfQoKCXBlbmRpbmdBbW91bnQgOj0gZ25zbWF0aC5TYWZlQWRkSW50NjQoci5zdG9yZS5HZXRQZW5kaW5nUHJvdG9jb2xGZWUodG9rZW5QYXRoKSwgYW1vdW50KQoJaWYgZXJyIDo9IHIuc3RvcmUuU2V0UGVuZGluZ1Byb3RvY29sRmVlKDAsIHJsbSwgdG9rZW5QYXRoLCBwZW5kaW5nQW1vdW50KTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQp9CgovLyBzZXR0bGVQcm90b2NvbEZlZSBmb3J3YXJkcyBhbW91bnQsIHBsdXMgYW55dGhpbmcgYWxyZWFkeSBwZW5kaW5nIGZvciB0b2tlblBhdGgsIHRvCi8vIHRoZSBwcm90b2NvbCBmZWUgcmVhbG0uIFdoZW4gY29sbGVjdGlvbiBpcyBoYWx0ZWQgb3IgdGhlIHRyYW5zZmVyIGZhaWxzLCB0aGUgYW1vdW50Ci8vIGlzIHJlY29yZGVkIGFzIHBlbmRpbmcgaW5zdGVhZCBhbmQgc2V0dGxlZCBieSBhIGxhdGVyIGNhbGwgZm9yIHRoZSBzYW1lIHRva2VuLCB3aGljaAovLyBldmVyeSBmZWUgcGF0aCBtYWtlcyBldmVuIHdoZW4gdGhlIGZlZSBpcyB6ZXJvLgovLwovLyBPbmx5IHRva2VuUGF0aCBpcyB0b3VjaGVkLCBzbyBhbiB1bnJlbGF0ZWQgdG9rZW4gY2FuIG5ldmVyIGJsb2NrIHNldHRsZW1lbnQuIFRoZQovLyBwZW5kaW5nIGVudHJ5IGlzIHdyaXR0ZW4gb25seSB3aGVuIHRoZSBmZWUgY2Fubm90IGJlIGZvcndhcmRlZCwgc28gdGhlIGNvbW1vbiBwYXRoCi8vIHBlcmZvcm1zIG5vIHN0b3JlIHdyaXRlIGF0IGFsbC4KZnVuYyAociAqcm91dGVyVjEpIHNldHRsZVByb3RvY29sRmVlKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcsIGFtb3VudCBpbnQ2NCkgewoJaWYgaGFsdC5Jc0hhbHRlZFByb3RvY29sRmVlKCkgewoJCXIuYWRkUGVuZGluZ1Byb3RvY29sRmVlKDAsIHJsbSwgdG9rZW5QYXRoLCBhbW91bnQpCgkJcmV0dXJuCgl9CgoJcGVuZGluZ0Ftb3VudCA6PSByLnN0b3JlLkdldFBlbmRpbmdQcm90b2NvbEZlZSh0b2tlblBhdGgpCgl0b3RhbEFtb3VudCA6PSBnbnNtYXRoLlNhZmVBZGRJbnQ2NChwZW5kaW5nQW1vdW50LCBhbW91bnQpCgoJaWYgdG90YWxBbW91bnQgPiAwIHsKCQlwcm90b2NvbEZlZUFkZHIgOj0gYWNjZXNzLk11c3RHZXRBZGRyZXNzKHByYmFjLlJPTEVfUFJPVE9DT0xfRkVFLlN0cmluZygpKQoJCWNvbW1vbi5TYWZlR1JDMjBBcHByb3ZlKDAsIHJsbSwgdG9rZW5QYXRoLCBwcm90b2NvbEZlZUFkZHIsIHRvdGFsQW1vdW50KQoKCQkvLyBBZGRUb1Byb3RvY29sRmVlIG9ubHkgcmVwb3J0cyBhbiBlcnJvciBmb3IgYSBoYWx0ZWQgcmVhbG0sIHdoaWNoIGlzIGhhbmRsZWQKCQkvLyBhYm92ZS4gVGhlIGJyYW5jaCBrZWVwcyB0aGUgYW1vdW50IHBlbmRpbmcgc2hvdWxkIHRoYXQgZXZlciBjaGFuZ2UsIGFuZAoJCS8vIHdpdGhkcmF3cyB0aGUgYXBwcm92YWwgc28gbm8gdW5zcGVudCBhbGxvd2FuY2Ugb3V0bGl2ZXMgdGhlIGNhbGwuCgkJaWYgZXJyIDo9IHBmLkFkZFRvUHJvdG9jb2xGZWUoY3Jvc3MocmxtKSwgdG9rZW5QYXRoLCB0b3RhbEFtb3VudCk7IGVyciAhPSBuaWwgewoJCQljb21tb24uU2FmZUdSQzIwQXBwcm92ZSgwLCBybG0sIHRva2VuUGF0aCwgcHJvdG9jb2xGZWVBZGRyLCAwKQoJCQlyLmFkZFBlbmRpbmdQcm90b2NvbEZlZSgwLCBybG0sIHRva2VuUGF0aCwgYW1vdW50KQoJCQlyZXR1cm4KCQl9Cgl9CgoJaWYgZXJyIDo9IHIuc3RvcmUuUmVtb3ZlUGVuZGluZ1Byb3RvY29sRmVlKDAsIHJsbSwgdG9rZW5QYXRoKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQp9CgpmdW5jIGNhbGN1bGF0ZVJvdXRlckZlZShhbW91bnQgaW50NjQsIHN3YXBGZWUgdWludDY0KSBpbnQ2NCB7CglpZiBzd2FwRmVlIDw9IDAgewoJCXJldHVybiAwCgl9CgoJZmVlQW1vdW50IDo9IHUyNTYuTXVsRGl2KHUyNTYuTmV3VWludEZyb21JbnQ2NChhbW91bnQpLCB1MjU2Lk5ld1VpbnQoc3dhcEZlZSksIHUyNTYuTmV3VWludCgxMDAwMCkpCglyZXR1cm4gZ25zbWF0aC5TYWZlQ29udmVydFRvSW50NjQoZmVlQW1vdW50KQp9CgovLyBjYWxjdWxhdGUgYW1vdW50IHRvIGZldGNoIGZyb20gcG9vbCBpbmNsdWRpbmcgcm91dGVyIGZlZQovLyBwb29sQW1vdW50ID0gdXNlckFtb3VudCAvICgxIC0gZmVlUmF0ZSkKLy8gPSB1c2VyQW1vdW50ICogMTAwMDAgLyAoMTAwMDAgLSBzd2FwRmVlQlBTKQpmdW5jIGNhbGN1bGF0ZUV4YWN0T3V0V2l0aFJvdXRlckZlZShhbW91bnQgaW50NjQsIHN3YXBGZWUgdWludDY0KSBpbnQ2NCB7CglpZiBhbW91bnQgPT0gMCB7CgkJcmV0dXJuIGFtb3VudAoJfQoKCWlmIHN3YXBGZWUgPiAwIHsKCQkvLyBVc2UgTXVsRGl2IHRvIHByZXZlbnQgb3ZlcmZsb3cgYW5kIG1haW50YWluIHByZWNpc2lvbgoJCXBvb2xBbW91bnQgOj0gdTI1Ni5NdWxEaXYoCgkJCXUyNTYuTmV3VWludEZyb21JbnQ2NChhbW91bnQpLAoJCQl1MjU2Lk5ld1VpbnQoMTAwMDApLAoJCQl1MjU2Lk5ld1VpbnQoMTAwMDAtc3dhcEZlZSksCgkJKQoKCQlyZXR1cm4gZ25zbWF0aC5TYWZlQ29udmVydFRvSW50NjQocG9vbEFtb3VudCkKCX0KCglyZXR1cm4gYW1vdW50Cn0KGo0zCgpyZW5kZXIuZ25vEv4ycGFja2FnZSByb3V0ZXIKCmltcG9ydCAoCgkiY2hhaW4iCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9tb3VsL21kL3YwIgoJImduby5sYW5kL3AvbW91bC9tZHRhYmxlL3YwIgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoKCSJnbm8ubGFuZC9yL2dub3N3YXAvaGFsdC92MSIKCSJnbm8ubGFuZC9yL2dub3N3YXAvcm91dGVyIgopCgpjb25zdCBtYXhTd2FwRmVlQlBTIHVpbnQ2NCA9IDEwMDAKCmZ1bmMgKHIgKnJvdXRlclYxKSBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7Cgl2YXIgYWN0aW9uIHN0cmluZwoJc3dpdGNoIHBhdGggewoJY2FzZSAiIjoKCQlhY3Rpb24gPSBtZC5IMygiRXhhY3QtaW5wdXQgc2luZ2xlLXJvdXRlIHN3YXAiKSArICJcbiIgKwoJCQkiPGduby1mb3JtIGV4ZWM9XCJFeGFjdEluU2luZ2xlU3dhcFJvdXRlXCI+XG4iICsKCQkJIiAgPGduby1pbnB1dCBuYW1lPVwiaW5wdXRUb2tlblwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJBcHByb3ZlZCBpbnB1dDogZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3RcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cIm91dHB1dFRva2VuXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk91dHB1dDogZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlNcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cImFtb3VudEluXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkV4YWN0IGlucHV0IGFtb3VudCAoYmFzZSB1bml0cylcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cInJvdXRlQXJyXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlJvdXRlOiBpbnB1dFRva2VuOm91dHB1dFRva2VuOjUwMFwiIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4iICsKCQkJIiAgPGduby1pbnB1dCBuYW1lPVwiYW1vdW50T3V0TWluXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk1pbmltdW0gb3V0cHV0IGFtb3VudCAoYmFzZSB1bml0cylcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cInNxcnRQcmljZUxpbWl0WDk2XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlE2NC45NiBzcXJ0LXByaWNlIGxpbWl0ICgwID0gbm8gbGltaXQpXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJkZWFkbGluZVwiIHR5cGU9XCJudW1iZXJcIiBwbGFjZWhvbGRlcj1cIkZ1dHVyZSBVbml4IHRpbWVzdGFtcCAoc2Vjb25kcylcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cInJlZmVycmVyXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk9wdGlvbmFsIHJlZmVycmVyIGFkZHJlc3NcIiAvPlxuIiArCgkJCSI8L2duby1mb3JtPlxuIgoJY2FzZSAic3dhcC9leGFjdC1pbiI6CgkJYWN0aW9uID0gbWQuSDMoIkV4YWN0LWlucHV0IG11bHRpLXJvdXRlIHN3YXAiKSArICJcbiIgKwoJCQkiPGduby1mb3JtIGV4ZWM9XCJFeGFjdEluU3dhcFJvdXRlXCI+XG4iICsKCQkJIiAgPGduby1pbnB1dCBuYW1lPVwiaW5wdXRUb2tlblwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJBcHByb3ZlZCBpbnB1dDogZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3RcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cIm91dHB1dFRva2VuXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk91dHB1dDogZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlNcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cImFtb3VudEluXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkV4YWN0IGlucHV0IGFtb3VudCAoYmFzZSB1bml0cylcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cInJvdXRlQXJyXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlJvdXRlczogQTpDOjUwMCxBOkI6NTAwKlBPT0wqQjpDOjMwMDAgKEEvQi9DID0gdG9rZW4ga2V5cylcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cInF1b3RlQXJyXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlJvdXRlIHBlcmNlbnRhZ2VzOiAxMDAgb3IgNzAsMzAgKHRvdGFsIDEwMClcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cImFtb3VudE91dE1pblwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJNaW5pbXVtIG91dHB1dCBhbW91bnQgKGJhc2UgdW5pdHMpXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJkZWFkbGluZVwiIHR5cGU9XCJudW1iZXJcIiBwbGFjZWhvbGRlcj1cIkZ1dHVyZSBVbml4IHRpbWVzdGFtcCAoc2Vjb25kcylcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cInJlZmVycmVyXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk9wdGlvbmFsIHJlZmVycmVyIGFkZHJlc3NcIiAvPlxuIiArCgkJCSI8L2duby1mb3JtPlxuIgoJY2FzZSAic3dhcC9leGFjdC1vdXQiOgoJCWFjdGlvbiA9IG1kLkgzKCJFeGFjdC1vdXRwdXQgbXVsdGktcm91dGUgc3dhcCIpICsgIlxuIiArCgkJCSI8Z25vLWZvcm0gZXhlYz1cIkV4YWN0T3V0U3dhcFJvdXRlXCI+XG4iICsKCQkJIiAgPGduby1pbnB1dCBuYW1lPVwiaW5wdXRUb2tlblwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJBcHByb3ZlZCBpbnB1dDogZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3RcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cIm91dHB1dFRva2VuXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk91dHB1dDogZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlNcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cImFtb3VudE91dFwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFeGFjdCBvdXRwdXQgYW1vdW50IChiYXNlIHVuaXRzKVwiIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4iICsKCQkJIiAgPGduby1pbnB1dCBuYW1lPVwicm91dGVBcnJcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiUm91dGVzOiBBOkM6NTAwLEE6Qjo1MDAqUE9PTCpCOkM6MzAwMCAoQS9CL0MgPSB0b2tlbiBrZXlzKVwiIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4iICsKCQkJIiAgPGduby1pbnB1dCBuYW1lPVwicXVvdGVBcnJcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiUm91dGUgcGVyY2VudGFnZXM6IDEwMCBvciA3MCwzMCAodG90YWwgMTAwKVwiIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4iICsKCQkJIiAgPGduby1pbnB1dCBuYW1lPVwiYW1vdW50SW5NYXhcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiTWF4aW11bSBpbnB1dCBhbW91bnQgKGJhc2UgdW5pdHMpXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJkZWFkbGluZVwiIHR5cGU9XCJudW1iZXJcIiBwbGFjZWhvbGRlcj1cIkZ1dHVyZSBVbml4IHRpbWVzdGFtcCAoc2Vjb25kcylcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cInJlZmVycmVyXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk9wdGlvbmFsIHJlZmVycmVyIGFkZHJlc3NcIiAvPlxuIiArCgkJCSI8L2duby1mb3JtPlxuIgoJY2FzZSAic3dhcC9leGFjdC1vdXQtc2luZ2xlIjoKCQlhY3Rpb24gPSBtZC5IMygiRXhhY3Qtb3V0cHV0IHNpbmdsZS1yb3V0ZSBzd2FwIikgKyAiXG4iICsKCQkJIjxnbm8tZm9ybSBleGVjPVwiRXhhY3RPdXRTaW5nbGVTd2FwUm91dGVcIj5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJpbnB1dFRva2VuXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkFwcHJvdmVkIGlucHV0OiBnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdFwiIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4iICsKCQkJIiAgPGduby1pbnB1dCBuYW1lPVwib3V0cHV0VG9rZW5cIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiT3V0cHV0OiBnbm8ubGFuZC9yL2dub3N3YXAvZ25zLkdOU1wiIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4iICsKCQkJIiAgPGduby1pbnB1dCBuYW1lPVwiYW1vdW50T3V0XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkV4YWN0IG91dHB1dCBhbW91bnQgKGJhc2UgdW5pdHMpXCIgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiIgKwoJCQkiICA8Z25vLWlucHV0IG5hbWU9XCJyb3V0ZUFyclwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJSb3V0ZTogaW5wdXRUb2tlbjpvdXRwdXRUb2tlbjo1MDBcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cImFtb3VudEluTWF4XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIk1heGltdW0gaW5wdXQgYW1vdW50IChiYXNlIHVuaXRzKVwiIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4iICsKCQkJIiAgPGduby1pbnB1dCBuYW1lPVwic3FydFByaWNlTGltaXRYOTZcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiUTY0Ljk2IHNxcnQtcHJpY2UgbGltaXQgKDAgPSBubyBsaW1pdClcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuIiArCgkJCSIgIDxnbm8taW5wdXQgbmFtZT1cImRlYWRsaW5lXCIgdHlwZT1cIm51bWJlclwiIHBsYWNlaG9sZGVyPVwiRnV0dXJlIFVuaXggdGltZXN0YW1wIChzZWNvbmRzKVwiIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4iICsKCQkJIiAgPGduby1pbnB1dCBuYW1lPVwicmVmZXJyZXJcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiT3B0aW9uYWwgcmVmZXJyZXIgYWRkcmVzc1wiIC8+XG4iICsKCQkJIjwvZ25vLWZvcm0+XG4iCglkZWZhdWx0OgoJCXJldHVybiAiNDA0XG4iCgl9CgoJc3dhcEZlZSA6PSByLkdldFN3YXBGZWUoKQoJaW1wbGVtZW50YXRpb24gOj0gcm91dGVyLkdldEltcGxlbWVudGF0aW9uUGFja2FnZVBhdGgoKQoJc3RhdHVzVGFibGUgOj0gbWR0YWJsZS5UYWJsZXsKCQlIZWFkZXJzOiBbXXN0cmluZ3siRmllbGQiLCAiVmFsdWUifSwKCQlSb3dzOiBbXVtdc3RyaW5newoJCQl7IlJvdXRlciBwYWNrYWdlIiwgbWQuTGluaygiZ25vLmxhbmQvci9nbm9zd2FwL3JvdXRlciIsICIvci9nbm9zd2FwL3JvdXRlciIpfSwKCQkJeyJSZWFsbSBhZGRyZXNzIiwgbWQuSW5saW5lQ29kZShjaGFpbi5QYWNrYWdlQWRkcmVzcygiZ25vLmxhbmQvci9nbm9zd2FwL3JvdXRlciIpLlN0cmluZygpKX0sCgkJCXsiQWN0aXZlIGltcGxlbWVudGF0aW9uIiwgbWQuTGluayhpbXBsZW1lbnRhdGlvbiwgc3RyaW5ncy5UcmltUHJlZml4KGltcGxlbWVudGF0aW9uLCAiZ25vLmxhbmQiKSl9LAoJCQl7IlJvdXRlciBoYWx0ZWQiLCB1Zm10LlNwcmludGYoIiV0IiwgaGFsdC5Jc0hhbHRlZFJvdXRlcigpKX0sCgkJfSwKCX0KCWZlZVRhYmxlIDo9IG1kdGFibGUuVGFibGV7CgkJSGVhZGVyczogW11zdHJpbmd7IkZpZWxkIiwgIlZhbHVlIn0sCgkJUm93czogW11bXXN0cmluZ3sKCQkJeyJTd2FwIGZlZSIsIHVmbXQuU3ByaW50ZigiJWQgYnBzIiwgc3dhcEZlZSl9LAoJCQl7Ik1heGltdW0gc3dhcCBmZWUiLCB1Zm10LlNwcmludGYoIiVkIGJwcyAoMTAlJSkiLCBtYXhTd2FwRmVlQlBTKX0sCgkJCXsiRmVlIHVuaXQiLCAiMSBicHMgPSAwLjAxJSBvZiB0aGUgb3V0cHV0LXRva2VuIGFtb3VudCJ9LAoJCQl7IkFtb3VudCB1bml0IiwgIkludGVnZXIgdG9rZW4gYmFzZSB1bml0czsgZGVjaW1hbHMgYXJlIHRva2VuLXNwZWNpZmljIn0sCgkJfSwKCX0KCglvdXQgOj0gbWQuSDEoIkdub3N3YXAgUm91dGVyIikgKyAiXG4iCglvdXQgKz0gbWQuSDIoIlJvdXRlciBzdGF0dXMiKSArICJcbiIKCW91dCArPSBzdGF0dXNUYWJsZS5TdHJpbmcoKSArICJcbiIKCW91dCArPSBtZC5IMigiU3dhcCBmZWUgY29uZmlndXJhdGlvbiIpICsgIlxuIgoJb3V0ICs9IGZlZVRhYmxlLlN0cmluZygpICsgIlxuIgoJb3V0ICs9IG1kLkgyKCJTd2FwIikgKyAiXG4iCglvdXQgKz0gbWQuUGFyYWdyYXBoKAoJCW1kLkxpbmsoIkV4YWN0IGlucHV0OiBzaW5nbGUgcm91dGUiLCAiL3IvZ25vc3dhcC9yb3V0ZXIiKSArICIgwrcgIiArCgkJCW1kLkxpbmsoIkV4YWN0IGlucHV0OiBtdWx0aXBsZSByb3V0ZXMiLCAiL3IvZ25vc3dhcC9yb3V0ZXI6c3dhcC9leGFjdC1pbiIpICsgIiDCtyAiICsKCQkJbWQuTGluaygiRXhhY3Qgb3V0cHV0OiBzaW5nbGUgcm91dGUiLCAiL3IvZ25vc3dhcC9yb3V0ZXI6c3dhcC9leGFjdC1vdXQtc2luZ2xlIikgKyAiIMK3ICIgKwoJCQltZC5MaW5rKCJFeGFjdCBvdXRwdXQ6IG11bHRpcGxlIHJvdXRlcyIsICIvci9nbm9zd2FwL3JvdXRlcjpzd2FwL2V4YWN0LW91dCIpLAoJKQoJb3V0ICs9IGFjdGlvbgoJcmV0dXJuIG91dAp9ChrhOwoKcm91dGVyLmdubxLSO3BhY2thZ2Ugcm91dGVyCgppbXBvcnQgKAoJImVycm9ycyIKCSJzdHJjb252IgoKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKLy8gRXJyb3JNZXNzYWdlcyBkZWZpbmUgYWxsIGVycm9yIG1lc3NhZ2UgdGVtcGxhdGVzIHVzZWQgdGhyb3VnaG91dCB0aGUgcm91dGVyCmNvbnN0ICgKCS8vIHNsaXBwYWdlIHZhbGlkYXRpb24KCWVyckV4YWN0SW5BbW91bnRNaXNtYXRjaCAgPSAiY29uc3VtZWQgaW5wdXQgZG9lcyBub3QgbWF0Y2ggcmVxdWVzdGVkIChyZXF1ZXN0ZWQ9JWQsIGNvbnN1bWVkPSVkKSIKCWVyckV4YWN0T3V0QW1vdW50RXhjZWVkZWQgPSAicmVjZWl2ZWQgbW9yZSB0aGFuIHJlcXVlc3RlZCBpbiByZXF1ZXN0ZWQ9JWQsIGFjdHVhbD0lZCIKCgkvLyByb3V0ZSB2YWxpZGF0aW9uCgllcnJJbnZhbGlkUm91dGVMZW5ndGggPSAicm91dGUgbGVuZ3RoKCVkKSBtdXN0IGJlIDF+NyIKCgkvLyBxdW90ZSB2YWxpZGF0aW9uCgllcnJSb3V0ZXNRdW90ZXNNaXNtYXRjaCA9ICJtaXNtYXRjaCBiZXR3ZWVuIHJvdXRlcyglZCkgYW5kIHF1b3RlcyglZCkgbGVuZ3RoIgoJZXJySW52YWxpZFF1b3RlICAgICAgICAgPSAiaW52YWxpZCBxdW90ZSglcykgYXQgaW5kZXgoJWQpIgoJZXJySW52YWxpZFF1b3RlVmFsdWUgICAgPSAicXVvdGUoJXMpIGF0IGluZGV4KCVkKSBtdXN0IGJlIHBvc2l0aXZlIHZhbHVlIgoJZXJyUXVvdGVFeGNlZWRzTWF4ICAgICAgPSAicXVvdGUoJXMpIGF0IGluZGV4KCVkKSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlZCIKCWVyclF1b3RlU3VtRXhjZWVkc01heCAgID0gInF1b3RlIHN1bSBleGNlZWRzIDEwMCBhdCBpbmRleCglZCkiCgllcnJJbnZhbGlkUXVvdGVTdW0gICAgICA9ICJxdW90ZSBzdW0oJWQpIG11c3QgYmUgMTAwIgoKCS8vIHN3YXAgdHlwZSB2YWxpZGF0aW9uCgllcnJFeGFjdEluVG9vRmV3UmVjZWl2ZWQgPSAiRXhhY3RJbjogdG9vIGZldyByZWNlaXZlZCAobWluOiVkLCBnb3Q6JWQpIgoJZXJyRXhhY3RPdXRUb29NdWNoU3BlbnQgID0gIkV4YWN0T3V0OiB0b28gbXVjaCBzcGVudCAobWF4OiVkLCB1c2VkOiVkKSIKCgkvLyByb3V0ZSBwYXJzaW5nIHZhbGlkYXRpb24KCWVyckVtcHR5Um91dGVzID0gInJvdXRlcyBjYW5ub3QgYmUgZW1wdHkiCikKCi8vIFN3YXBWYWxpZGF0b3IgcHJvdmlkZXMgdmFsaWRhdGlvbiBtZXRob2RzIGZvciBzd2FwIG9wZXJhdGlvbnMKdHlwZSBTd2FwVmFsaWRhdG9yIHN0cnVjdHt9CgovLyBleGFjdE91dEFtb3VudCBjaGVja3MgaWYgb3V0cHV0IGFtb3VudCBtZWV0cyBzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLgovLyBGb3IgZXhhY3Qtb3V0IHN3YXBzLCB0aGUgb3V0cHV0IG11c3QgYmUgZXhhY3RseSB0aGUgc3BlY2lmaWVkIGFtb3VudCB3aXRoIHRvbGVyYW5jZSB1cCB0byBzd2FwQ291bnQgdW5pdHMgZm9yIHJvdW5kaW5nLgpmdW5jICh2ICpTd2FwVmFsaWRhdG9yKSBleGFjdE91dEFtb3VudChyZXN1bHRBbW91bnQsIHNwZWNpZmllZEFtb3VudCBpbnQ2NCwgc3dhcENvdW50IGludDY0KSBlcnJvciB7CglkaWZmIDo9IGludDY0KDApCgoJaWYgcmVzdWx0QW1vdW50ID49IHNwZWNpZmllZEFtb3VudCB7CgkJZGlmZiA9IHJlc3VsdEFtb3VudCAtIHNwZWNpZmllZEFtb3VudAoJfSBlbHNlIHsKCQlkaWZmID0gc3BlY2lmaWVkQW1vdW50IC0gcmVzdWx0QW1vdW50Cgl9CgoJaWYgZGlmZiA+IHN3YXBDb3VudCB7CgkJcmV0dXJuIHVmbXQuRXJyb3JmKGVyckV4YWN0T3V0QW1vdW50RXhjZWVkZWQsIHNwZWNpZmllZEFtb3VudCwgcmVzdWx0QW1vdW50KQoJfQoKCXJldHVybiBuaWwKfQoKLy8gZXhhY3RJbkFtb3VudCBjaGVja3MgdGhhdCB0aGUgc3dhcCBjb25zdW1lZCBleGFjdGx5IHRoZSByZXF1ZXN0ZWQgaW5wdXQgYW1vdW50LgpmdW5jICh2ICpTd2FwVmFsaWRhdG9yKSBleGFjdEluQW1vdW50KHJlc3VsdEFtb3VudCwgc3BlY2lmaWVkQW1vdW50IGludDY0KSBlcnJvciB7CglpZiByZXN1bHRBbW91bnQgIT0gc3BlY2lmaWVkQW1vdW50IHsKCQlyZXR1cm4gdWZtdC5FcnJvcmYoZXJyRXhhY3RJbkFtb3VudE1pc21hdGNoLCBzcGVjaWZpZWRBbW91bnQsIHJlc3VsdEFtb3VudCkKCX0KCglyZXR1cm4gbmlsCn0KCi8vIHNsaXBwYWdlIGVuc3VyZXMgc3dhcCBhbW91bnRzIG1lZXQgc2xpcHBhZ2UgcmVxdWlyZW1lbnRzLgpmdW5jICh2ICpTd2FwVmFsaWRhdG9yKSBzbGlwcGFnZShzd2FwVHlwZSBTd2FwVHlwZSwgYW1vdW50SW4sIGFtb3VudE91dCwgbGltaXQgaW50NjQpIGVycm9yIHsKCXN3aXRjaCBzd2FwVHlwZSB7CgljYXNlIEV4YWN0SW46CgkJaWYgYW1vdW50T3V0IDwgbGltaXQgewoJCQlyZXR1cm4gdWZtdC5FcnJvcmYoZXJyRXhhY3RJblRvb0Zld1JlY2VpdmVkLCBsaW1pdCwgYW1vdW50T3V0KQoJCX0KCWNhc2UgRXhhY3RPdXQ6CgkJaWYgYW1vdW50SW4gPiBsaW1pdCB7CgkJCXJldHVybiB1Zm10LkVycm9yZihlcnJFeGFjdE91dFRvb011Y2hTcGVudCwgbGltaXQsIGFtb3VudEluKQoJCX0KCWRlZmF1bHQ6CgkJcmV0dXJuIGVycm9ycy5OZXcoZXJySW52YWxpZFN3YXBUeXBlKQoJfQoJcmV0dXJuIG5pbAp9CgovLyBzd2FwVHlwZSBlbnN1cmVzIHRoZSBzd2FwIHR5cGUgc3RyaW5nIGlzIHZhbGlkLgpmdW5jICh2ICpTd2FwVmFsaWRhdG9yKSBzd2FwVHlwZShzd2FwVHlwZVN0ciBzdHJpbmcpIChTd2FwVHlwZSwgZXJyb3IpIHsKCXN3YXBUeXBlLCBlcnIgOj0gdHJ5U3dhcFR5cGVGcm9tU3RyKHN3YXBUeXBlU3RyKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIFVua25vd24sIGVycm9ycy5OZXcoZXJySW52YWxpZFN3YXBUeXBlKQoJfQoJcmV0dXJuIHN3YXBUeXBlLCBuaWwKfQoKLy8gYW1vdW50IGVuc3VyZXMgdGhlIGFtb3VudCBpcyBwcm9wZXJseSBmb3JtYXR0ZWQgYW5kIHBvc2l0aXZlLgpmdW5jICh2ICpTd2FwVmFsaWRhdG9yKSBhbW91bnQoYW1vdW50IGludDY0KSAoaW50NjQsIGVycm9yKSB7CglpZiBhbW91bnQgPD0gMCB7CgkJcmV0dXJuIDAsIHVmbXQuRXJyb3JmKEVyckludmFsaWRQb3NpdGl2ZUFtb3VudCwgYW1vdW50KQoJfQoJcmV0dXJuIGFtb3VudCwgbmlsCn0KCi8vIFJvdXRlUGFyc2VyIGhhbmRsZXMgcGFyc2luZyBhbmQgdmFsaWRhdGlvbiBvZiByb3V0ZXMgYW5kIHF1b3Rlcwp0eXBlIFJvdXRlUGFyc2VyIHN0cnVjdHt9CgovLyBOZXdSb3V0ZVBhcnNlciBjcmVhdGVzIGEgcGFyc2VyIGZvciBjb21tYS1zZXBhcmF0ZWQgcm91dGUgYW5kIHF1b3RlIHN0cmluZ3MuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwYXJzZXI6IG5ldyBSb3V0ZVBhcnNlciBpbnN0YW5jZQpmdW5jIE5ld1JvdXRlUGFyc2VyKCkgKlJvdXRlUGFyc2VyIHsKCXJldHVybiAmUm91dGVQYXJzZXJ7fQp9CgovLyBQYXJzZVJvdXRlcyBzcGxpdHMgcm91dGUgYW5kIHF1b3RlIHN0cmluZ3MgYW5kIHZhbGlkYXRlcyB0aGVpciBwYWlyaW5nLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcm91dGVzOiBjb21tYS1zZXBhcmF0ZWQgcm91dGUgcGF0aHMKLy8gICAtIHF1b3RlczogY29tbWEtc2VwYXJhdGVkIHJvdXRlIGFsbG9jYXRpb24gcGVyY2VudGFnZXMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHJvdXRlUGF0aHM6IHBhcnNlZCByb3V0ZSBwYXRoIHN0cmluZ3MKLy8gICAtIHF1b3RlVmFsdWVzOiBwYXJzZWQgcXVvdGUgc3RyaW5ncyBjb3JyZXNwb25kaW5nIG9uZS10by1vbmUgd2l0aCByb3V0ZVBhdGhzCi8vICAgLSBlcnI6IG5pbCB3aGVuIHJvdXRlcywgY291bnRzLCBhbmQgcXVvdGUgc3VtIGFyZSB2YWxpZDsgdmFsaWRhdGlvbiBlcnJvciBvdGhlcndpc2UKZnVuYyAocCAqUm91dGVQYXJzZXIpIFBhcnNlUm91dGVzKHJvdXRlcywgcXVvdGVzIHN0cmluZykgKFtdc3RyaW5nLCBbXXN0cmluZywgZXJyb3IpIHsKCS8vIENoZWNrIGZvciBlbXB0eSByb3V0ZXMKCWlmIHJvdXRlcyA9PSAiIiB8fCBxdW90ZXMgPT0gIiIgewoJCXJldHVybiBuaWwsIG5pbCwgZXJyb3JzLk5ldyhlcnJFbXB0eVJvdXRlcykKCX0KCglyb3V0ZXNBcnIgOj0gc3BsaXRTaW5nbGVDaGFyKHJvdXRlcywgJywnKQoJcXVvdGVzQXJyIDo9IHNwbGl0U2luZ2xlQ2hhcihxdW90ZXMsICcsJykKCglpZiBlcnIgOj0gcC5WYWxpZGF0ZVJvdXRlc0FuZFF1b3Rlcyhyb3V0ZXNBcnIsIHF1b3Rlc0Fycik7IGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIG5pbCwgZXJyCgl9CgoJcmV0dXJuIHJvdXRlc0FyciwgcXVvdGVzQXJyLCBuaWwKfQoKLy8gVmFsaWRhdGVSb3V0ZXNBbmRRdW90ZXMgY2hlY2tzIHJvdXRlIGNvdW50LCByb3V0ZS9xdW90ZSBjYXJkaW5hbGl0eSwgYW5kIHF1b3RlIHN1bS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHJvdXRlczogcGFyc2VkIHJvdXRlIHBhdGggc3RyaW5ncwovLyAgIC0gcXVvdGVzOiBwYXJzZWQgcXVvdGUgcGVyY2VudGFnZSBzdHJpbmdzCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IG5pbCB3aGVuIG9uZSB0byBzZXZlbiByb3V0ZXMgbWF0Y2ggcXVvdGUgY291bnQgYW5kIHF1b3RlcyBzdW0gdG8gMTAwOyB2YWxpZGF0aW9uIGVycm9yIG90aGVyd2lzZQpmdW5jIChwICpSb3V0ZVBhcnNlcikgVmFsaWRhdGVSb3V0ZXNBbmRRdW90ZXMocm91dGVzLCBxdW90ZXMgW11zdHJpbmcpIGVycm9yIHsKCXJyIDo9IGxlbihyb3V0ZXMpCglxcSA6PSBsZW4ocXVvdGVzKQoKCWlmIHJyIDwgMSB8fCByciA+IDcgewoJCXJldHVybiB1Zm10LkVycm9yZihlcnJJbnZhbGlkUm91dGVMZW5ndGgsIHJyKQoJfQoKCWlmIHJyICE9IHFxIHsKCQlyZXR1cm4gdWZtdC5FcnJvcmYoZXJyUm91dGVzUXVvdGVzTWlzbWF0Y2gsIHJyLCBxcSkKCX0KCglyZXR1cm4gcC5WYWxpZGF0ZVF1b3RlU3VtKHF1b3RlcykKfQoKLy8gVmFsaWRhdGVRdW90ZVN1bSB2ZXJpZmllcyB0aGF0IGVhY2ggcXVvdGUgaXMgcG9zaXRpdmUsIGF0IG1vc3QgMTAwLCBhbmQgdG90YWxzIDEwMC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHF1b3Rlczogcm91dGUgYWxsb2NhdGlvbiBwZXJjZW50YWdlIHN0cmluZ3MKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogbmlsIHdoZW4gYWxsIHF1b3RlcyBwYXJzZSBhbmQgdG90YWwgMTAwOyBpbnZhbGlkIHZhbHVlIG9yIHN1bSBlcnJvciBvdGhlcndpc2UKZnVuYyAocCAqUm91dGVQYXJzZXIpIFZhbGlkYXRlUXVvdGVTdW0ocXVvdGVzIFtdc3RyaW5nKSBlcnJvciB7Cgljb25zdCAoCgkJbWF4UXVvdGUgaW50OCA9IDEwMAoJCW1pblF1b3RlIGludDggPSAwCgkpCgoJdmFyIHN1bSBpbnQ4CgoJZm9yIGksIHF1b3RlIDo9IHJhbmdlIHF1b3RlcyB7CgkJcXQsIGVyciA6PSBzdHJjb252LlBhcnNlSW50KHF1b3RlLCAxMCwgOCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIHVmbXQuRXJyb3JmKGVyckludmFsaWRRdW90ZSwgcXVvdGUsIGkpCgkJfQoJCWludFF1b3RlIDo9IGludDgocXQpCgoJCS8vIFF1b3RlIG11c3QgYmUgcG9zaXRpdmUgKD4gMCkgYXMgZWFjaCByb3V0ZSBuZWVkcyBhIG5vbi16ZXJvIGFsbG9jYXRpb24uCgkJLy8gQSBxdW90ZSBvZiAwIHdvdWxkIG1lYW4gbm8gc3dhcCB0aHJvdWdoIHRoYXQgcm91dGUsIHdoaWNoIGlzIGludmFsaWQuCgkJaWYgaW50UXVvdGUgPD0gbWluUXVvdGUgeyAvLyBtaW5RdW90ZSA9IDAsIHNvIHRoaXMgcmVqZWN0cyBxdW90ZSA9IDAKCQkJcmV0dXJuIHVmbXQuRXJyb3JmKGVyckludmFsaWRRdW90ZVZhbHVlLCBxdW90ZSwgaSkKCQl9CgoJCWlmIGludFF1b3RlID4gbWF4UXVvdGUgewoJCQlyZXR1cm4gdWZtdC5FcnJvcmYoZXJyUXVvdGVFeGNlZWRzTWF4LCBxdW90ZSwgaSwgbWF4UXVvdGUpCgkJfQoKCQlpZiBzdW0gPiBtYXhRdW90ZS1pbnRRdW90ZSB7CgkJCXJldHVybiB1Zm10LkVycm9yZihlcnJRdW90ZVN1bUV4Y2VlZHNNYXgsIGkpCgkJfQoKCQlzdW0gKz0gaW50UXVvdGUKCX0KCglpZiBzdW0gIT0gbWF4UXVvdGUgewoJCXJldHVybiB1Zm10LkVycm9yZihlcnJJbnZhbGlkUXVvdGVTdW0sIHN1bSkKCX0KCglyZXR1cm4gbmlsCn0KCi8vIGZpbmFsaXplU3dhcCBoYW5kbGVzIHBvc3Qtc3dhcCBvcGVyYXRpb25zIGFuZCB2YWxpZGF0aW9ucy4KZnVuYyAociAqcm91dGVyVjEpIGZpbmFsaXplU3dhcCgKCV8gaW50LAoJcmxtIHJlYWxtLAoJaW5wdXRUb2tlbiwgb3V0cHV0VG9rZW4gc3RyaW5nLAoJcmVzdWx0QW1vdW50SW4sIHJlc3VsdEFtb3VudE91dCBpbnQ2NCwKCXN3YXBUeXBlIFN3YXBUeXBlLAoJdG9rZW5BbW91bnRMaW1pdCBpbnQ2NCwKCWFtb3VudFNwZWNpZmllZCBpbnQ2NCwKCXN3YXBDb3VudCBpbnQ2NCwKCWlzU2V0U3FydFByaWNlTGltaXRYOTYgYm9vbCwKKSAoaW50NjQsIGludDY0KSB7Cgl2YWxpZGF0b3IgOj0gJlN3YXBWYWxpZGF0b3J7fQoKCS8vIEhhbmRsZSBzd2FwIGZlZQoJcmVzdWx0QW1vdW50T3V0V2l0aG91dEZlZSA6PSByLmhhbmRsZVN3YXBGZWUoMCwgcmxtLCBvdXRwdXRUb2tlbiwgcmVzdWx0QW1vdW50T3V0KQoKCS8vIFZhbGlkYXRlIHRoZSBleGFjdC1vdXQgdGFyZ2V0IHdoZW4gbm8gY2FsbGVyIHByaWNlIGxpbWl0IGlzIHNldC4gQQoJLy8gbm9uemVybyBzaW5nbGUtaG9wIGxpbWl0IHBlcm1pdHMgcGFydGlhbCBvdXRwdXQsIHNvIG9ubHkgdGhlIG1heC1pbnB1dAoJLy8gc2xpcHBhZ2UgY2hlY2sgYmVsb3cgcmVtYWlucyBhcHBsaWNhYmxlLgoJaWYgc3dhcFR5cGUgPT0gRXhhY3RPdXQgJiYgIWlzU2V0U3FydFByaWNlTGltaXRYOTYgewoJCWlmIGVyciA6PSB2YWxpZGF0b3IuZXhhY3RPdXRBbW91bnQocmVzdWx0QW1vdW50T3V0V2l0aG91dEZlZSwgYW1vdW50U3BlY2lmaWVkLCBzd2FwQ291bnQpOyBlcnIgIT0gbmlsIHsKCQkJcGFuaWMoYWRkRGV0YWlsVG9FcnJvcihlcnJTbGlwcGFnZSwgZXJyLkVycm9yKCkpKQoJCX0KCX0KCgkvLyBWYWxpZGF0ZSBleGFjdCBpbiBhbW91bnQgaWYgYXBwbGljYWJsZQoJLy8gSWYgc3FydFByaWNlTGltaXRYOTYgaXMgc2V0LCBwYXJ0aWFsIGNvbnN1bXB0aW9uIHVwIHRvIHRoZSBwcmljZSBsaW1pdCBpcyBpbnRlbmRlZAoJaWYgc3dhcFR5cGUgPT0gRXhhY3RJbiAmJiAhaXNTZXRTcXJ0UHJpY2VMaW1pdFg5NiB7CgkJaWYgZXJyIDo9IHZhbGlkYXRvci5leGFjdEluQW1vdW50KHJlc3VsdEFtb3VudEluLCBhbW91bnRTcGVjaWZpZWQpOyBlcnIgIT0gbmlsIHsKCQkJcGFuaWMoYWRkRGV0YWlsVG9FcnJvcihlcnJJbnN1ZmZpY2llbnRMaXF1aWRpdHksIGVyci5FcnJvcigpKSkKCQl9Cgl9CgoJaWYgZXJyIDo9IHZhbGlkYXRvci5zbGlwcGFnZShzd2FwVHlwZSwgcmVzdWx0QW1vdW50SW4sIHJlc3VsdEFtb3VudE91dFdpdGhvdXRGZWUsIHRva2VuQW1vdW50TGltaXQpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhhZGREZXRhaWxUb0Vycm9yKGVyclNsaXBwYWdlLCBlcnIuRXJyb3IoKSkpCgl9CgoJcmV0dXJuIHJlc3VsdEFtb3VudEluLCByZXN1bHRBbW91bnRPdXRXaXRob3V0RmVlCn0KCi8vIHZhbGlkYXRlUm91dGVzQW5kUXVvdGVzIGlzIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBwYXJzZXMgYW5kIHZhbGlkYXRlcyByb3V0ZXMgaW4gb25lIGNhbGwuCmZ1bmMgdmFsaWRhdGVSb3V0ZXNBbmRRdW90ZXMocm91dGVzLCBxdW90ZXMgc3RyaW5nKSAoW11zdHJpbmcsIFtdc3RyaW5nLCBlcnJvcikgewoJcmV0dXJuIE5ld1JvdXRlUGFyc2VyKCkuUGFyc2VSb3V0ZXMocm91dGVzLCBxdW90ZXMpCn0KGt9TCg5yb3V0ZXJfZHJ5LmdubxLMU3BhY2thZ2Ugcm91dGVyCgppbXBvcnQgKAoJImVycm9ycyIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL2dub3N3YXAvZ25zbWF0aC92MSIKCSJnbm8ubGFuZC9wL2dub3N3YXAvdXRpbHMvdjEiCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCgoJImduby5sYW5kL3IvZ25vc3dhcC9jb21tb24iCikKCi8vIFF1b3RlQ29uc3RyYWludHMgZGVmaW5lcyB0aGUgdmFsaWQgcmFuZ2UgZm9yIHN3YXAgcXVvdGUgcGVyY2VudGFnZXMKY29uc3QgKAoJTWF4UXVvdGVQZXJjZW50YWdlICAgICA9IDEwMAoJTWluUXVvdGVQZXJjZW50YWdlICAgICA9IDAKCVBFUkNFTlRBR0VfREVOT01JTkFUT1IgPSBpbnQ2NCgxMDApCikKCi8vIEVycm9yTWVzc2FnZXMgZm9yIERyeVN3YXBSb3V0ZSBvcGVyYXRpb25zCmNvbnN0ICgKCUVyclVua25vd25Td2FwVHlwZSAgICAgICA9ICJ1bmtub3duIHN3YXBUeXBlKCVzKSIKCUVyckludmFsaWRQb3NpdGl2ZUFtb3VudCA9ICJpbnZhbGlkIGFtb3VudCglcyksIG11c3QgYmUgcG9zaXRpdmUiCglFcnJJbnZhbGlkUXVvdGVSYW5nZSAgICAgPSAicXVvdGUoJWQpIG11c3QgYmUgJWR+JWQiCikKCi8vIFN3YXBQcm9jZXNzb3IgaGFuZGxlcyB0aGUgZXhlY3V0aW9uIG9mIHN3YXAgb3BlcmF0aW9ucwp0eXBlIFN3YXBQcm9jZXNzb3Igc3RydWN0IHsKCXJvdXRlciAqcm91dGVyVjEKfQoKLy8gUHJvY2Vzc1NpbmdsZVN3YXAgc2ltdWxhdGVzIG9uZSBwb29sIGhvcCB3aXRob3V0IGV4ZWN1dGluZyB0cmFuc2ZlcnMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSByb3V0ZTogc2luZ2xlIHBvb2wgcGF0aCBmb3JtYXR0ZWQgYXMgVE9LRU4wOlRPS0VOMTpGRUUKLy8gICAtIGFtb3VudFNwZWNpZmllZDogc2lnbmVkIGlucHV0IG9yIG91dHB1dCBhbW91bnQgZm9yIHRoZSBob3AKLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudEluOiBpbnB1dCBhbW91bnQgdGhlIHBvb2wgd291bGQgcmVjZWl2ZQovLyAgIC0gYW1vdW50T3V0OiBvdXRwdXQgYW1vdW50IHRoZSBwb29sIHdvdWxkIHNlbmQKLy8gICAtIGVycjogYWx3YXlzIG5pbCB3aGVuIHRoZSBkcnkgcG9vbCBjYWxsIHJldHVybnM7IG1hbGZvcm1lZCBwYXRocyBvciBwb29sIGZhaWx1cmVzIHBhbmljIGluIHRoZSB1bmRlcmx5aW5nIGhlbHBlcnMKZnVuYyAocCAqU3dhcFByb2Nlc3NvcikgUHJvY2Vzc1NpbmdsZVN3YXAocm91dGUgc3RyaW5nLCBhbW91bnRTcGVjaWZpZWQgaW50NjQpIChhbW91bnRJbiwgYW1vdW50T3V0IGludDY0LCBlcnIgZXJyb3IpIHsKCWlucHV0LCBvdXRwdXQsIGZlZSA6PSBnZXREYXRhRm9yU2luZ2xlUGF0aChyb3V0ZSkKCXNpbmdsZVBhcmFtcyA6PSBTaW5nbGVTd2FwUGFyYW1zewoJCXRva2VuSW46ICAgICAgICAgaW5wdXQsCgkJdG9rZW5PdXQ6ICAgICAgICBvdXRwdXQsCgkJZmVlOiAgICAgICAgICAgICBmZWUsCgkJYW1vdW50U3BlY2lmaWVkOiBhbW91bnRTcGVjaWZpZWQsCgl9CgoJYW1vdW50SW4sIGFtb3VudE91dCA9IHAucm91dGVyLnNpbmdsZURyeVN3YXAoJnNpbmdsZVBhcmFtcykKCXJldHVybiBhbW91bnRJbiwgYW1vdW50T3V0LCBuaWwKfQoKLy8gUHJvY2Vzc011bHRpU3dhcCBzaW11bGF0ZXMgYSBtdWx0aS1ob3Agcm91dGUgaW4gdGhlIHJlcXVlc3RlZCBkaXJlY3Rpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzd2FwVHlwZTogRXhhY3RJbiBmb3IgZm9yd2FyZCBleGVjdXRpb24gb3IgRXhhY3RPdXQgZm9yIGJhY2t3YXJkIHF1b3RpbmcKLy8gICAtIHJvdXRlOiBtdWx0aS1ob3AgcGF0aCB3aXRoIFBPT0xfU0VQQVJBVE9SIGJldHdlZW4gaG9wcwovLyAgIC0gbnVtSG9wczogbnVtYmVyIG9mIHBvb2xzIGluIHJvdXRlCi8vICAgLSBhbW91bnRTcGVjaWZpZWQ6IHNpZ25lZCBpbnB1dCBvciBvdXRwdXQgYW1vdW50IGZvciB0aGUgcm91dGUKLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudEluOiBpbnB1dCBhbW91bnQgdGhlIHJvdXRlIHdvdWxkIGNvbnN1bWUKLy8gICAtIGFtb3VudE91dDogb3V0cHV0IGFtb3VudCB0aGUgcm91dGUgd291bGQgcHJvZHVjZQovLyAgIC0gZXJyOiBuaWwgb24gc3VjY2Vzc2Z1bCBzaW11bGF0aW9uOyBpbnZhbGlkIHN3YXAtdHlwZSBlcnJvciBvciBkb3duc3RyZWFtIGRyeS1zd2FwIHZhbGlkYXRpb24gZXJyb3Igb3RoZXJ3aXNlIChwb29sIHF1ZXJ5IGZhaWx1cmVzIHBhbmljKQpmdW5jIChwICpTd2FwUHJvY2Vzc29yKSBQcm9jZXNzTXVsdGlTd2FwKAoJc3dhcFR5cGUgU3dhcFR5cGUsCglyb3V0ZSBzdHJpbmcsCgludW1Ib3BzIGludCwKCWFtb3VudFNwZWNpZmllZCBpbnQ2NCwKKSAoaW50NjQsIGludDY0LCBlcnJvcikgewoJcGF0aEluZGV4IDo9IGdldFBhdGhJbmRleChzd2FwVHlwZSwgbnVtSG9wcykKCglpbnB1dCwgb3V0cHV0LCBmZWUgOj0gZ2V0RGF0YUZvck11bHRpUGF0aChyb3V0ZSwgcGF0aEluZGV4KQoJc2luZ2xlUGFyYW1zIDo9IFNpbmdsZVN3YXBQYXJhbXN7CgkJdG9rZW5JbjogICAgICAgICBpbnB1dCwKCQl0b2tlbk91dDogICAgICAgIG91dHB1dCwKCQlmZWU6ICAgICAgICAgICAgIGZlZSwKCQlhbW91bnRTcGVjaWZpZWQ6IGFtb3VudFNwZWNpZmllZCwKCX0KCglzd2l0Y2ggc3dhcFR5cGUgewoJY2FzZSBFeGFjdEluOgoJCXJldHVybiBwLnJvdXRlci5tdWx0aURyeVN3YXAoc2luZ2xlUGFyYW1zLCBudW1Ib3BzLCByb3V0ZSkKCWNhc2UgRXhhY3RPdXQ6CgkJcmV0dXJuIHAucm91dGVyLm11bHRpRHJ5U3dhcE5lZ2F0aXZlKHNpbmdsZVBhcmFtcywgbnVtSG9wcywgcm91dGUpCglkZWZhdWx0OgoJCXJldHVybiAwLCAwLCB1Zm10LkVycm9yZihFcnJVbmtub3duU3dhcFR5cGUsIHN3YXBUeXBlKQoJfQp9CgovLyBWYWxpZGF0ZVN3YXBSZXN1bHRzIGNoZWNrcyBzaW11bGF0ZWQgYW1vdW50cyBhZ2FpbnN0IGV4YWN0bmVzcyBhbmQgc2xpcHBhZ2UgY29uc3RyYWludHMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzd2FwVHlwZTogRXhhY3RJbiBvciBFeGFjdE91dCB2YWxpZGF0aW9uIGRpcmVjdGlvbgovLyAgIC0gcmVzdWx0QW1vdW50SW46IHNpbXVsYXRlZCBhZ2dyZWdhdGUgaW5wdXQgYW1vdW50Ci8vICAgLSByZXN1bHRBbW91bnRPdXQ6IHNpbXVsYXRlZCBhZ2dyZWdhdGUgb3V0cHV0IGFtb3VudCBhZnRlciByb3V0ZXIgZmVlCi8vICAgLSBhbW91bnRTcGVjaWZpZWQ6IGNhbGxlcidzIGV4YWN0IGlucHV0IG9yIG91dHB1dCB0YXJnZXQKLy8gICAtIGFtb3VudExpbWl0OiBtaW5pbXVtIG91dHB1dCBvciBtYXhpbXVtIGlucHV0IHNsaXBwYWdlIGJvdW5kCi8vICAgLSBzd2FwQ291bnQ6IG51bWJlciBvZiBwb29sIGhvcHMgdXNlZCBmb3IgZXhhY3Qtb3V0cHV0IHRvbGVyYW5jZQovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50SW46IHJlc3VsdEFtb3VudEluIHdoZW4gdmFsaWRhdGlvbiByZWFjaGVzIHRoZSByZXR1cm4gcGF0aAovLyAgIC0gYW1vdW50T3V0OiByZXN1bHRBbW91bnRPdXQgd2hlbiB2YWxpZGF0aW9uIHJlYWNoZXMgdGhlIHJldHVybiBwYXRoCi8vICAgLSBlcnI6IG5pbCB3aGVuIGxpcXVpZGl0eSwgZXhhY3RuZXNzLCBhbmQgc2xpcHBhZ2UgY2hlY2tzIHBhc3M7IHJlbGV2YW50IHZhbGlkYXRpb24gZXJyb3Igb3RoZXJ3aXNlCmZ1bmMgKHAgKlN3YXBQcm9jZXNzb3IpIFZhbGlkYXRlU3dhcFJlc3VsdHMoCglzd2FwVHlwZSBTd2FwVHlwZSwKCXJlc3VsdEFtb3VudEluLCByZXN1bHRBbW91bnRPdXQgaW50NjQsCglhbW91bnRTcGVjaWZpZWQsIGFtb3VudExpbWl0IGludDY0LAoJc3dhcENvdW50IGludDY0LAopIChhbW91bnRJbiwgYW1vdW50T3V0IGludDY0LCBlcnIgZXJyb3IpIHsKCWlmIHJlc3VsdEFtb3VudEluID09IDAgfHwgcmVzdWx0QW1vdW50T3V0ID09IDAgewoJCXJldHVybiAwLCAwLCBlcnJvcnMuTmV3KGVyckluc3VmZmljaWVudExpcXVpZGl0eSkKCX0KCgl2YWxpZGF0b3IgOj0gJlN3YXBWYWxpZGF0b3J7fQoKCWlmIHN3YXBUeXBlID09IEV4YWN0T3V0IHsKCQlhYnNTcGVjaWZpZWQgOj0gZ25zbWF0aC5TYWZlQWJzSW50NjQoYW1vdW50U3BlY2lmaWVkKQoKCQlpZiBlcnIgOj0gdmFsaWRhdG9yLmV4YWN0T3V0QW1vdW50KHJlc3VsdEFtb3VudE91dCwgYWJzU3BlY2lmaWVkLCBzd2FwQ291bnQpOyBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIHJlc3VsdEFtb3VudEluLCByZXN1bHRBbW91bnRPdXQsIGVycgoJCX0KCX0KCglpZiBzd2FwVHlwZSA9PSBFeGFjdEluIHsKCQlpZiBlcnIgOj0gdmFsaWRhdG9yLmV4YWN0SW5BbW91bnQocmVzdWx0QW1vdW50SW4sIGFtb3VudFNwZWNpZmllZCk7IGVyciAhPSBuaWwgewoJCQlyZXR1cm4gcmVzdWx0QW1vdW50SW4sIHJlc3VsdEFtb3VudE91dCwgZXJyCgkJfQoJfQoKCWlmIGVyciA6PSB2YWxpZGF0b3Iuc2xpcHBhZ2Uoc3dhcFR5cGUsIHJlc3VsdEFtb3VudEluLCByZXN1bHRBbW91bnRPdXQsIGFtb3VudExpbWl0KTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIHJlc3VsdEFtb3VudEluLCByZXN1bHRBbW91bnRPdXQsIGVycgoJfQoKCXJldHVybiByZXN1bHRBbW91bnRJbiwgcmVzdWx0QW1vdW50T3V0LCBuaWwKfQoKLy8gQWRkU3dhcFJlc3VsdHMgYWRkcyBvbmUgcm91dGUncyBhbW91bnRzIHRvIGFjY3VtdWxhdGVkIHRvdGFscyB1c2luZyBvdmVyZmxvdy1zYWZlIGFyaXRobWV0aWMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSByZXN1bHRBbW91bnRJbjogYWNjdW11bGF0ZWQgaW5wdXQgYmVmb3JlIHRoaXMgcm91dGUKLy8gICAtIHJlc3VsdEFtb3VudE91dDogYWNjdW11bGF0ZWQgb3V0cHV0IGJlZm9yZSB0aGlzIHJvdXRlCi8vICAgLSBhbW91bnRJbjogY3VycmVudCByb3V0ZSBpbnB1dCBhbW91bnQKLy8gICAtIGFtb3VudE91dDogY3VycmVudCByb3V0ZSBvdXRwdXQgYW1vdW50Ci8vCi8vIFJldHVybnM6Ci8vICAgLSBuZXdBbW91bnRJbjogYWNjdW11bGF0ZWQgaW5wdXQgYWZ0ZXIgYWRkaW5nIGFtb3VudEluCi8vICAgLSBuZXdBbW91bnRPdXQ6IGFjY3VtdWxhdGVkIG91dHB1dCBhZnRlciBhZGRpbmcgYW1vdW50T3V0Ci8vICAgLSBlcnI6IGFsd2F5cyBuaWw7IG92ZXJmbG93IGlzIHJhaXNlZCBieSBzYWZlIGFyaXRobWV0aWMgcmF0aGVyIHRoYW4gcmV0dXJuZWQKZnVuYyAocCAqU3dhcFByb2Nlc3NvcikgQWRkU3dhcFJlc3VsdHMoCglyZXN1bHRBbW91bnRJbiwgcmVzdWx0QW1vdW50T3V0LCBhbW91bnRJbiwgYW1vdW50T3V0IGludDY0LAopIChpbnQ2NCwgaW50NjQsIGVycm9yKSB7CgluZXdBbW91bnRJbiA6PSBnbnNtYXRoLlNhZmVBZGRJbnQ2NChyZXN1bHRBbW91bnRJbiwgYW1vdW50SW4pCgluZXdBbW91bnRPdXQgOj0gZ25zbWF0aC5TYWZlQWRkSW50NjQocmVzdWx0QW1vdW50T3V0LCBhbW91bnRPdXQpCgoJcmV0dXJuIG5ld0Ftb3VudEluLCBuZXdBbW91bnRPdXQsIG5pbAp9CgovLyBEcnlTd2FwUm91dGUgc2ltdWxhdGVzIGEgdG9rZW4gc3dhcCByb3V0ZSB3aXRob3V0IGV4ZWN1dGluZyB0cmFuc2ZlcnMgb3IgY2hhbmdpbmcgc3RhdGUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbnB1dFRva2VuOiBpbnB1dCB0b2tlbiBjb250cmFjdCBwYXRoCi8vICAgLSBvdXRwdXRUb2tlbjogb3V0cHV0IHRva2VuIGNvbnRyYWN0IHBhdGgKLy8gICAtIHNwZWNpZmllZEFtb3VudDogZXhhY3QgaW5wdXQgYW1vdW50IGZvciBFWEFDVF9JTiBvciBleGFjdCBvdXRwdXQgYW1vdW50IGZvciBFWEFDVF9PVVQKLy8gICAtIHN3YXBUeXBlU3RyOiBFWEFDVF9JTiBvciBFWEFDVF9PVVQKLy8gICAtIHN0clJvdXRlQXJyOiBjb21tYS1zZXBhcmF0ZWQgcm91dGUgcGF0aHMsIHdpdGggYXQgbW9zdCBzZXZlbiByb3V0ZSBlbnRyaWVzCi8vICAgLSBxdW90ZUFycjogY29tbWEtc2VwYXJhdGVkIHJvdXRlIGFsbG9jYXRpb24gcGVyY2VudGFnZXMgc3VtbWluZyB0byAxMDAKLy8gICAtIHRva2VuQW1vdW50TGltaXQ6IG1pbmltdW0gb3V0cHV0IGZvciBFWEFDVF9JTiBvciBtYXhpbXVtIGlucHV0IGZvciBFWEFDVF9PVVQKLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudEluOiBzaW11bGF0ZWQgaW5wdXQgYW1vdW50IGVuY29kZWQgYXMgYSBkZWNpbWFsIHN0cmluZwovLyAgIC0gYW1vdW50T3V0OiBzaW11bGF0ZWQgbmV0IG91dHB1dCBhbW91bnQgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nCi8vICAgLSBlcnI6IG5pbCBvbiBzdWNjZXNzOyB2YWxpZGF0aW9uLCBsaXF1aWRpdHksIHBhcnNpbmcsIG9yIHNsaXBwYWdlIGVycm9yIG90aGVyd2lzZQpmdW5jIChyICpyb3V0ZXJWMSkgRHJ5U3dhcFJvdXRlKAoJaW5wdXRUb2tlbiwgb3V0cHV0VG9rZW4gc3RyaW5nLAoJc3BlY2lmaWVkQW1vdW50IHN0cmluZywKCXN3YXBUeXBlU3RyIHN0cmluZywKCXN0clJvdXRlQXJyLCBxdW90ZUFyciBzdHJpbmcsCgl0b2tlbkFtb3VudExpbWl0IHN0cmluZywKKSAoYW1vdW50SW4sIGFtb3VudE91dCBzdHJpbmcsIGVyciBlcnJvcikgewoJZGVmZXIgZnVuYygpIHsKCQlpZiByIDo9IHJlY292ZXIoKTsgciAhPSBuaWwgewoJCQlhbW91bnRJbiA9ICIwIgoJCQlhbW91bnRPdXQgPSAiMCIKCQkJaWYgcmVjb3ZlcmVkRXJyLCBvayA6PSByLihlcnJvcik7IG9rIHsKCQkJCWVyciA9IHJlY292ZXJlZEVycgoJCQl9IGVsc2UgewoJCQkJZXJyID0gdWZtdC5FcnJvcmYoIiV2IiwgcikKCQkJfQoJCX0KCX0oKQoKCWlucHV0QW1vdW50LCBvdXRwdXRBbW91bnQsIGVyciA6PSByLmRyeVN3YXBSb3V0ZSgKCQlpbnB1dFRva2VuLAoJCW91dHB1dFRva2VuLAoJCXV0aWxzLlNhZmVQYXJzZUludDY0KHNwZWNpZmllZEFtb3VudCksCgkJc3dhcFR5cGVTdHIsCgkJc3RyUm91dGVBcnIsCgkJcXVvdGVBcnIsCgkJdXRpbHMuU2FmZVBhcnNlSW50NjQodG9rZW5BbW91bnRMaW1pdCksCgkpCglyZXR1cm4gdXRpbHMuRm9ybWF0SW50KGlucHV0QW1vdW50KSwgdXRpbHMuRm9ybWF0SW50KG91dHB1dEFtb3VudCksIGVycgp9CgovLyBkcnlTd2FwUm91dGUgaXMgdGhlIGludGVybmFsIGRyeS1ydW4gc3dhcCBzaW11bGF0aW9uIHRoYXQgcmV0dXJucyBlcnJvcnMKLy8gaW5zdGVhZCBvZiBwYW5pY2tpbmcgb24gdmFsaWRhdGlvbiBvciBsaXF1aWRpdHkgZmFpbHVyZXMuCmZ1bmMgKHIgKnJvdXRlclYxKSBkcnlTd2FwUm91dGUoCglpbnB1dFRva2VuLCBvdXRwdXRUb2tlbiBzdHJpbmcsCglzcGVjaWZpZWRBbW91bnQgaW50NjQsCglzd2FwVHlwZVN0ciBzdHJpbmcsCglzdHJSb3V0ZUFyciwgcXVvdGVBcnIgc3RyaW5nLAoJdG9rZW5BbW91bnRMaW1pdCBpbnQ2NCwKKSAoaW50NjQsIGludDY0LCBlcnJvcikgewoJaWYgZXJyIDo9IGNvbW1vbi5WYWxpZGF0ZVJlZ2lzdGVyZWQoaW5wdXRUb2tlbiwgb3V0cHV0VG9rZW4pOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgMCwgZXJyCgl9CgoJYXNzZXJ0SXNWYWxpZFJvdXRlUGF0aHMoc3RyUm91dGVBcnIsIGlucHV0VG9rZW4sIG91dHB1dFRva2VuKQoJYXNzZXJ0SXNFeGlzdHNQb29scyhzdHJSb3V0ZUFycikKCgkvLyBpbml0aWFsaXplIGNvbXBvbmVudHMKCXZhbGlkYXRvciA6PSAmU3dhcFZhbGlkYXRvcnt9Cglwcm9jZXNzb3IgOj0gJlN3YXBQcm9jZXNzb3J7cm91dGVyOiByfQoKCS8vIHZhbGlkYXRlIGFuZCBwYXJzZSBpbnB1dHMKCXN3YXBUeXBlLCBlcnIgOj0gdmFsaWRhdG9yLnN3YXBUeXBlKHN3YXBUeXBlU3RyKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIDAsIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRTd2FwVHlwZSwgZXJyLkVycm9yKCkpCgl9CgoJYW1vdW50U3BlY2lmaWVkLCBlcnIgOj0gdmFsaWRhdG9yLmFtb3VudChzcGVjaWZpZWRBbW91bnQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgMCwgbWFrZUVycm9yV2l0aERldGFpbHMoZXJySW52YWxpZElucHV0LCBlcnIuRXJyb3IoKSkKCX0KCglyb3V0ZXMsIHF1b3RlcywgZXJyIDo9IE5ld1JvdXRlUGFyc2VyKCkuUGFyc2VSb3V0ZXMoc3RyUm91dGVBcnIsIHF1b3RlQXJyKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIDAsIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRSb3V0ZXNBbmRRdW90ZXMsIGVyci5FcnJvcigpKQoJfQoKCXN3YXBGZWUgOj0gci5zdG9yZS5HZXRTd2FwRmVlKCkKCgkvLyBTdG9yZSBvcmlnaW5hbCBhbW91bnQgZm9yIHZhbGlkYXRpb24gKGJlZm9yZSByb3V0ZXIgZmVlIGFkanVzdG1lbnQpCglvcmlnaW5hbEFtb3VudFNwZWNpZmllZCA6PSBhbW91bnRTcGVjaWZpZWQKCgkvLyBhZGp1c3QgYW1vdW50IHNpZ24gZm9yIGV4YWN0IG91dCBzd2FwcwoJaWYgc3dhcFR5cGUgPT0gRXhhY3RPdXQgewoJCWFic1NwZWNpZmllZCA6PSBnbnNtYXRoLlNhZmVBYnNJbnQ2NChhbW91bnRTcGVjaWZpZWQpCgkJYW1vdW50U3BlY2lmaWVkV2l0aFJvdXRlckZlZSA6PSBjYWxjdWxhdGVFeGFjdE91dFdpdGhSb3V0ZXJGZWUoYWJzU3BlY2lmaWVkLCBzd2FwRmVlKQoJCWFtb3VudFNwZWNpZmllZCA9IC1hbW91bnRTcGVjaWZpZWRXaXRoUm91dGVyRmVlCgl9CgoJLy8gaW5pdGlhbGl6ZSBhY2N1bXVsYXRvcnMgZm9yIHN3YXAgcmVzdWx0cwoJcmVzdWx0QW1vdW50SW4sIHJlc3VsdEFtb3VudE91dCA6PSBpbnQ2NCgwKSwgaW50NjQoMCkKCXJlbWFpblJlcXVlc3RBbW91bnQgOj0gYW1vdW50U3BlY2lmaWVkCglzd2FwQ291bnQgOj0gaW50NjQoMCkKCgkvLyBQcm9jZXNzIGVhY2ggcm91dGUKCWZvciBpLCByb3V0ZSA6PSByYW5nZSByb3V0ZXMgewoJCXRvU3dhcEFtb3VudCA6PSBpbnQ2NCgwKQoKCQkvLyBpZiBpdCdzIHRoZSBsYXN0IHJvdXRlLCB1c2UgdGhlIHJlbWFpbmluZyBhbW91bnQKCQlpc0xhc3RSb3V0ZSA6PSBpID09IGxlbihyb3V0ZXMpLTEKCQlpZiAhaXNMYXN0Um91dGUgewoJCQkvLyBjYWxjdWxhdGUgdGhlIGFtb3VudCB0byBzd2FwIGZvciB0aGlzIHJvdXRlCgkJCXN3YXBBbW91bnQsIGVyciA6PSBjYWxjdWxhdGVTd2FwQW1vdW50QnlRdW90ZShhbW91bnRTcGVjaWZpZWQsIHF1b3Rlc1tpXSkKCQkJaWYgZXJyICE9IG5pbCB7CgkJCQlyZXR1cm4gMCwgMCwgZXJyCgkJCX0KCgkJCS8vIHVwZGF0ZSB0aGUgcmVtYWluaW5nIGFtb3VudAoJCQlyZXN1bHRSZW1haW5SZXF1ZXN0QW1vdW50IDo9IGduc21hdGguU2FmZVN1YkludDY0KHJlbWFpblJlcXVlc3RBbW91bnQsIHN3YXBBbW91bnQpCgoJCQlyZW1haW5SZXF1ZXN0QW1vdW50ID0gcmVzdWx0UmVtYWluUmVxdWVzdEFtb3VudAoJCQl0b1N3YXBBbW91bnQgPSBzd2FwQW1vdW50CgkJfSBlbHNlIHsKCQkJdG9Td2FwQW1vdW50ID0gcmVtYWluUmVxdWVzdEFtb3VudAoJCX0KCgkJLy8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgaG9wcyBhbmQgdmFsaWRhdGUKCQludW1Ib3BzIDo9IHN0cmluZ3MuQ291bnQocm91dGUsIFBPT0xfU0VQQVJBVE9SKSArIDEKCQlhc3NlcnRIb3BzSW5SYW5nZShudW1Ib3BzKQoKCQkvLyBhY2N1bXVsYXRlIHRvdGFsIHN3YXAgY291bnQgZm9yIHZhbGlkYXRpb24KCQlzd2FwQ291bnQgKz0gaW50NjQobnVtSG9wcykKCgkJLy8gZXhlY3V0ZSB0aGUgYXBwcm9wcmlhdGUgc3dhcCB0eXBlCgkJdmFyIGFtb3VudEluLCBhbW91bnRPdXQgaW50NjQKCQlpZiBudW1Ib3BzID09IDEgewoJCQlhbW91bnRJbiwgYW1vdW50T3V0LCBlcnIgPSBwcm9jZXNzb3IuUHJvY2Vzc1NpbmdsZVN3YXAocm91dGUsIHRvU3dhcEFtb3VudCkKCQl9IGVsc2UgewoJCQlhbW91bnRJbiwgYW1vdW50T3V0LCBlcnIgPSBwcm9jZXNzb3IuUHJvY2Vzc011bHRpU3dhcChzd2FwVHlwZSwgcm91dGUsIG51bUhvcHMsIHRvU3dhcEFtb3VudCkKCQl9CgoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gMCwgMCwgZXJyCgkJfQoKCQlpZiBhbW91bnRJbiA9PSAwIHx8IGFtb3VudE91dCA9PSAwIHsKCQkJcmV0dXJuIDAsIDAsIGVycm9ycy5OZXcoZXJySW5zdWZmaWNpZW50TGlxdWlkaXR5KQoJCX0KCgkJLy8gdXBkYXRlIGFjY3VtdWxhdGVkIHJlc3VsdHMKCQlyZXN1bHRBbW91bnRJbiwgcmVzdWx0QW1vdW50T3V0LCBlcnIgPSBwcm9jZXNzb3IuQWRkU3dhcFJlc3VsdHMocmVzdWx0QW1vdW50SW4sIHJlc3VsdEFtb3VudE91dCwgYW1vdW50SW4sIGFtb3VudE91dCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIDAsIDAsIGVycgoJCX0KCX0KCgkvLyBzaW11bGF0ZSBkZWR1Y3Qgcm91dGVyIGZlZQoJZmVlQW1vdW50SW50NjQgOj0gY2FsY3VsYXRlUm91dGVyRmVlKHJlc3VsdEFtb3VudE91dCwgc3dhcEZlZSkKCglyZXN1bHRBbW91bnRPdXQgPSBnbnNtYXRoLlNhZmVTdWJJbnQ2NChyZXN1bHRBbW91bnRPdXQsIGZlZUFtb3VudEludDY0KQoKCXJldHVybiBwcm9jZXNzb3IuVmFsaWRhdGVTd2FwUmVzdWx0cyhzd2FwVHlwZSwgcmVzdWx0QW1vdW50SW4sIHJlc3VsdEFtb3VudE91dCwgb3JpZ2luYWxBbW91bnRTcGVjaWZpZWQsIHRva2VuQW1vdW50TGltaXQsIHN3YXBDb3VudCkKfQoKLy8gZ2V0UGF0aEluZGV4IHJldHVybnMgdGhlIHBhdGggaW5kZXggYmFzZWQgb24gc3dhcCB0eXBlIGFuZCBudW1iZXIgb2YgaG9wcy4KZnVuYyBnZXRQYXRoSW5kZXgoc3dhcFR5cGUgU3dhcFR5cGUsIG51bUhvcHMgaW50KSBpbnQgewoJc3dpdGNoIHN3YXBUeXBlIHsKCWNhc2UgRXhhY3RJbjoKCQkvLyBmaXJzdCBkYXRhIGZvciBleGFjdCBpbnB1dCBzd2FwcwoJCXJldHVybiAwCgljYXNlIEV4YWN0T3V0OgoJCS8vIGxhc3QgZGF0YSBmb3IgZXhhY3Qgb3V0cHV0IHN3YXBzCgkJcmV0dXJuIG51bUhvcHMgLSAxCglkZWZhdWx0OgoJCXBhbmljKCJzaG91bGQgbm90IGhhcHBlbiIpCgl9Cn0KGvEWChFzd2FwX2NhbGxiYWNrLmdubxLbFnBhY2thZ2Ugcm91dGVyCgppbXBvcnQgKAoJImVycm9ycyIKCglwcmJhYyAiZ25vLmxhbmQvcC9nbm9zd2FwL3JiYWMvdjEiCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKCgkiZ25vLmxhbmQvci9nbm9zd2FwL2FjY2Vzcy92MSIKCSJnbm8ubGFuZC9yL2dub3N3YXAvY29tbW9uIgoJImduby5sYW5kL3IvZ25vc3dhcC9oYWx0L3YxIgopCgovLyBTd2FwQ2FsbGJhY2sgaW1wbGVtZW50cyB0aGUgcG9vbCdzIFN3YXBDYWxsYmFjayBpbnRlcmZhY2UuCi8vIFRoZSBwb29sIGludm9rZXMgaXQgYWZ0ZXIgc2VuZGluZyBvdXRwdXQgdG9rZW5zOyB0aGUgcm91dGVyIHRoZW4gdHJhbnNmZXJzIHRoZQovLyBwb3NpdGl2ZSBpbnB1dCBkZWx0YSB0byB0aGUgcG9vbC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGxlYWRpbmcgY2FsbGJhY2sgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IG11c3QgcmVtYWluIHRoZSBjdXJyZW50IGNyb3NzaW5nIGZyYW1lCi8vICAgLSB0b2tlbjBQYXRoOiB0b2tlbi0wIGNvbnRyYWN0IHBhdGggaW4gY2Fub25pY2FsIHBvb2wgb3JkZXIKLy8gICAtIHRva2VuMVBhdGg6IHRva2VuLTEgY29udHJhY3QgcGF0aCBpbiBjYW5vbmljYWwgcG9vbCBvcmRlcgovLyAgIC0gYW1vdW50MERlbHRhOiBzaWduZWQgdG9rZW4tMCBkZWx0YTsgcG9zaXRpdmUgbWVhbnMgdGhlIHBvb2wgaXMgb3dlZCB0aGlzIGFtb3VudAovLyAgIC0gYW1vdW50MURlbHRhOiBzaWduZWQgdG9rZW4tMSBkZWx0YTsgcG9zaXRpdmUgbWVhbnMgdGhlIHBvb2wgaXMgb3dlZCB0aGlzIGFtb3VudAovLyAgIC0gcGF5ZXI6IGFkZHJlc3Mgd2hvc2UgYmFsYW5jZSBzdXBwbGllcyB0aGUgcG9zaXRpdmUgaW5wdXQgZGVsdGEKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogbmlsIGFmdGVyIHRoZSBvd2VkIGlucHV0IHRyYW5zZmVyOyBhbiBlcnJvciBmb3Igc3Bvb2ZlZCByZWFsbSwgaW52YWxpZCBsaXF1aWRpdHkgZGVsdGEsIG9yIGZhaWxlZCBwYXltZW50Ci8vCi8vIFBvc2l0aXZlIGRlbHRhcyBhcmUgdG9rZW5zIHRoZSBwb29sIG11c3QgcmVjZWl2ZTsgbmVnYXRpdmUgZGVsdGFzIGFyZSB0b2tlbnMKLy8gdGhlIHBvb2wgaGFzIHNlbnQgdG8gdGhlIHJlY2lwaWVudC4KZnVuYyAociAqcm91dGVyVjEpIFN3YXBDYWxsYmFjaygKCV8gaW50LAoJcmxtIHJlYWxtLAoJdG9rZW4wUGF0aCwgdG9rZW4xUGF0aCBzdHJpbmcsCglhbW91bnQwRGVsdGEsIGFtb3VudDFEZWx0YSBpbnQ2NCwKCXBheWVyIGFkZHJlc3MsCikgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoZXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCWlmIGFtb3VudDBEZWx0YSA8PSAwICYmIGFtb3VudDFEZWx0YSA8PSAwIHsKCQlyZXR1cm4gbWFrZUVycm9yV2l0aERldGFpbHMoCgkJCWVyckluc3VmZmljaWVudExpcXVpZGl0eSwKCQkJInN3YXAgZW50aXJlbHkgd2l0aGluIDAtbGlxdWlkaXR5IHJlZ2lvbiIsCgkJKQoJfQoKCWhhbHQuQXNzZXJ0SXNOb3RIYWx0ZWRSb3V0ZXIoKQoKCWNhbGxlciA6PSBybG0uUHJldmlvdXMoKS5BZGRyZXNzKCkKCWFzc2VydElzUm91dGVySW1wbGVtZW50YXRpb24oY2FsbGVyKQoKCXZhciB0b2tlblRvUGF5IHN0cmluZwoJdmFyIGFtb3VudFRvUGF5IGludDY0CgoJLy8gYW1vdW50MERlbHRhID4gMCBtZWFucyBwb29sIHdhbnRzIHRva2VuMAoJLy8gYW1vdW50MURlbHRhID4gMCBtZWFucyBwb29sIHdhbnRzIHRva2VuMQoJaWYgYW1vdW50MERlbHRhID4gMCB7CgkJYW1vdW50VG9QYXkgPSBhbW91bnQwRGVsdGEKCQl0b2tlblRvUGF5ID0gdG9rZW4wUGF0aAoJfSBlbHNlIHsKCQlhbW91bnRUb1BheSA9IGFtb3VudDFEZWx0YQoJCXRva2VuVG9QYXkgPSB0b2tlbjFQYXRoCgl9CgoJLy8gVHJhbnNmZXIgdG9rZW5zIGZyb20gcm91dGVyIHRvIHBvb2wKCS8vIFRoZSByb3V0ZXIgc2hvdWxkIGFscmVhZHkgaGF2ZSB0aGUgdG9rZW5zIGZyb20gdGhlIHVzZXIKCXIudHJhbnNmZXJUb1Bvb2woMCwgcmxtLCB0b2tlblRvUGF5LCB1MjU2Lk5ld1VpbnRGcm9tSW50NjQoYW1vdW50VG9QYXkpLCBwYXllcikKCglyZXR1cm4gbmlsCn0KCi8vIHRyYW5zZmVyVG9Qb29sIHRyYW5zZmVycyB0b2tlbnMgZnJvbSByb3V0ZXIgdG8gcG9vbApmdW5jIChyICpyb3V0ZXJWMSkgdHJhbnNmZXJUb1Bvb2woXyBpbnQsIHJsbSByZWFsbSwgdG9rZW4gc3RyaW5nLCBhbW91bnQgKnUyNTYuVWludCwgcGF5ZXIgYWRkcmVzcykgewoJYmFsYW5jZSA6PSBjb21tb24uQmFsYW5jZU9mKHRva2VuLCBwYXllcikKCglpZiB1MjU2Lk5ld1VpbnRGcm9tSW50NjQoYmFsYW5jZSkuTHQoYW1vdW50KSB7CgkJcGFuaWMobWFrZUVycm9yV2l0aERldGFpbHMoCgkJCWVyckluc3VmZmljaWVudEJhbGFuY2UsCgkJCXVmbXQuU3ByaW50ZigidG9rZW49JXMsIHJlcXVpcmVkPSVkLCBhdmFpbGFibGU9JWQsIHBheWVyPSVzIiwgdG9rZW4sIGFtb3VudC5JbnQ2NCgpLCBiYWxhbmNlLCBwYXllci5TdHJpbmcoKSksCgkJKSkKCX0KCglwb29sQWRkciA6PSBhY2Nlc3MuTXVzdEdldEFkZHJlc3MocHJiYWMuUk9MRV9QT09MLlN0cmluZygpKQoJcm91dGVyQWRkciA6PSBhY2Nlc3MuTXVzdEdldEFkZHJlc3MocHJiYWMuUk9MRV9ST1VURVIuU3RyaW5nKCkpCgoJaWYgcGF5ZXIgPT0gcm91dGVyQWRkciB7CgkJY29tbW9uLlNhZmVHUkMyMFRyYW5zZmVyKDAsIHJsbSwgdG9rZW4sIHBvb2xBZGRyLCBhbW91bnQuSW50NjQoKSkKCX0gZWxzZSB7CgkJY29tbW9uLlNhZmVHUkMyMFRyYW5zZmVyRnJvbSgwLCBybG0sIHRva2VuLCBwYXllciwgcG9vbEFkZHIsIGFtb3VudC5JbnQ2NCgpKQoJfQp9Chr7GQoOc3dhcF9pbm5lci5nbm8S6BlwYWNrYWdlIHJvdXRlcgoKaW1wb3J0ICgKCSJnbm8ubGFuZC9yL2dub3N3YXAvYWNjZXNzL3YxIgoJImduby5sYW5kL3IvZ25vc3dhcC9yb3V0ZXIiCgoJaTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL2ludDI1Ni92MSIKCXUyNTYgImduby5sYW5kL3AvZ25vc3dhcC91aW50MjU2L3YxIgoJImduby5sYW5kL3AvZ25vc3dhcC91dGlscy92MSIKCglwbCAiZ25vLmxhbmQvci9nbm9zd2FwL3Bvb2wiCikKCmNvbnN0ICgKCU1JTl9TUVJUX1JBVElPX1BMVVNfT05FICBzdHJpbmcgPSAiNDI5NTEyODc0MCIKCU1BWF9TUVJUX1JBVElPX01JTlVTX09ORSBzdHJpbmcgPSAiMTQ2MTQ0NjcwMzQ4NTIxMDEwMzI4NzI3MzA1MjIwMzk4ODgyMjM3ODcyMzk3MDM0MSIKKQoKLy8gc3dhcElubmVyIGV4ZWN1dGVzIHRoZSBjb3JlIHN3YXAgbG9naWMgYnkgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgcG9vbCBjb250cmFjdC4KLy8gUmV0dXJucyBwb29sUmVjdiAodG9rZW5zIHJlY2VpdmVkIGJ5IHBvb2wpIGFuZCBwb29sT3V0ICh0b2tlbnMgc2VudCBieSBwb29sKS4KZnVuYyAociAqcm91dGVyVjEpIHN3YXBJbm5lcigKCV8gaW50LAoJcmxtIHJlYWxtLAoJYW1vdW50U3BlY2lmaWVkIGludDY0LAoJcmVjaXBpZW50IGFkZHJlc3MsCglzcXJ0UHJpY2VMaW1pdFg5NiAqdTI1Ni5VaW50LAoJZGF0YSBTd2FwQ2FsbGJhY2tEYXRhLAopIChpbnQ2NCwgaW50NjQpIHsKCXRva2VuMFBhdGgsIHRva2VuMVBhdGggOj0gZGF0YS50b2tlbkluLCBkYXRhLnRva2VuT3V0Cgl6ZXJvRm9yT25lIDo9IGRhdGEudG9rZW5JbiA8IGRhdGEudG9rZW5PdXQKCglpZiAhemVyb0Zvck9uZSB7CgkJdG9rZW4wUGF0aCwgdG9rZW4xUGF0aCA9IHRva2VuMVBhdGgsIHRva2VuMFBhdGgKCX0KCglzcXJ0UHJpY2VMaW1pdFN0ciA6PSBjYWxjdWxhdGVTcXJ0UHJpY2VMaW1pdFRvU3RyKHplcm9Gb3JPbmUsIHNxcnRQcmljZUxpbWl0WDk2KQoKCWFtb3VudDBTdHIsIGFtb3VudDFTdHIgOj0gcGwuU3dhcCgKCQljcm9zcyhybG0pLAoJCXRva2VuMFBhdGgsCgkJdG9rZW4xUGF0aCwKCQlkYXRhLmZlZSwKCQlyZWNpcGllbnQsCgkJemVyb0Zvck9uZSwKCQl1dGlscy5Gb3JtYXRJbnQoYW1vdW50U3BlY2lmaWVkKSwKCQlzcXJ0UHJpY2VMaW1pdFN0ciwKCQlmdW5jKGN1ciByZWFsbSwgYW1vdW50MERlbHRhLCBhbW91bnQxRGVsdGEgaW50NjQsIF8gKnBsLkNhbGxiYWNrTWFya2VyKSBlcnJvciB7CgkJCS8vIGFzc2VydCBpcyBwb29sIHRvIHByZXZlbnQgdW5hdXRob3JpemVkIGNhbGxiYWNrCgkJCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCQkJYWNjZXNzLkFzc2VydElzUG9vbChjYWxsZXIpCgoJCQlyZXR1cm4gcm91dGVyLlN3YXBDYWxsYmFjayhjcm9zcyhjdXIpLCB0b2tlbjBQYXRoLCB0b2tlbjFQYXRoLCBhbW91bnQwRGVsdGEsIGFtb3VudDFEZWx0YSwgZGF0YS5wYXllcikKCQl9LAoJKQoKCWFtb3VudDAgOj0gaTI1Ni5NdXN0RnJvbURlY2ltYWwoYW1vdW50MFN0cikKCWFtb3VudDEgOj0gaTI1Ni5NdXN0RnJvbURlY2ltYWwoYW1vdW50MVN0cikKCglwb29sT3V0LCBwb29sUmVjdiA6PSBpMjU2TWluTWF4KGFtb3VudDAsIGFtb3VudDEpCglpZiBwb29sUmVjdi5Jc092ZXJmbG93KCkgfHwgcG9vbE91dC5Jc092ZXJmbG93KCkgewoJCXBhbmljKCJvdmVyZmxvdyBpbiBzd2FwSW5uZXIiKQoJfQoKCXJldHVybiBwb29sUmVjdi5JbnQ2NCgpLCBwb29sT3V0LkludDY0KCkKfQoKLy8gc3dhcERyeUlubmVyIHBlcmZvcm1zIGEgZHJ5LXJ1biBvZiBhIHN3YXAgb3BlcmF0aW9uIHdpdGhvdXQgZXhlY3V0aW5nIGl0LgpmdW5jIChyICpyb3V0ZXJWMSkgc3dhcERyeUlubmVyKAoJYW1vdW50U3BlY2lmaWVkIGludDY0LAoJc3FydFByaWNlTGltaXRYOTYgKnUyNTYuVWludCwKCWRhdGEgU3dhcENhbGxiYWNrRGF0YSwKKSAoaW50NjQsIGludDY0KSB7Cgl0b2tlbjBQYXRoLCB0b2tlbjFQYXRoIDo9IGRhdGEudG9rZW5JbiwgZGF0YS50b2tlbk91dAoJemVyb0Zvck9uZSA6PSBkYXRhLnRva2VuSW4gPCBkYXRhLnRva2VuT3V0CgoJaWYgIXplcm9Gb3JPbmUgewoJCXRva2VuMFBhdGgsIHRva2VuMVBhdGggPSB0b2tlbjFQYXRoLCB0b2tlbjBQYXRoCgl9CgoJc3FydFByaWNlTGltaXRTdHIgOj0gY2FsY3VsYXRlU3FydFByaWNlTGltaXRUb1N0cih6ZXJvRm9yT25lLCBzcXJ0UHJpY2VMaW1pdFg5NikKCgkvLyBjaGVjayBwb3NzaWJsZQoJYW1vdW50MFN0ciwgYW1vdW50MVN0ciwgZXJyIDo9IHBsLkRyeVN3YXAoCgkJdG9rZW4wUGF0aCwKCQl0b2tlbjFQYXRoLAoJCWRhdGEuZmVlLAoJCXplcm9Gb3JPbmUsCgkJdXRpbHMuRm9ybWF0SW50KGFtb3VudFNwZWNpZmllZCksCgkJc3FydFByaWNlTGltaXRTdHIsCgkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJYW1vdW50MCA6PSBpMjU2Lk11c3RGcm9tRGVjaW1hbChhbW91bnQwU3RyKQoJYW1vdW50MSA6PSBpMjU2Lk11c3RGcm9tRGVjaW1hbChhbW91bnQxU3RyKQoJaWYgYW1vdW50MC5TaWduKCkgPD0gMCAmJiBhbW91bnQxLlNpZ24oKSA8PSAwIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW5zdWZmaWNpZW50TGlxdWlkaXR5LAoJCQkic3dhcCBlbnRpcmVseSB3aXRoaW4gMC1saXF1aWRpdHkgcmVnaW9uIiwKCQkpKQoJfQoKCXBvb2xPdXQsIHBvb2xSZWN2IDo9IGkyNTZNaW5NYXgoYW1vdW50MCwgYW1vdW50MSkKCWlmIHBvb2xSZWN2LklzT3ZlcmZsb3coKSB8fCBwb29sT3V0LklzT3ZlcmZsb3coKSB7CgkJcGFuaWMoIm92ZXJmbG93IGluIHN3YXBEcnlJbm5lciIpCgl9CgoJcmV0dXJuIHBvb2xSZWN2LkludDY0KCksIHBvb2xPdXQuSW50NjQoKQp9CgovLyBjYWxjdWxhdGVTcXJ0UHJpY2VMaW1pdFRvU3RyIHJldHVybnMgdGhlIHByaWNlLWxpbWl0IHN0cmluZyBmb3IgYSBzd2FwIG9wZXJhdGlvbi4KLy8gQSBub24temVybyBjYWxsZXIgbGltaXQgaXMgZm9ybWF0dGVkIGFzLWlzOyBhIHplcm8gbGltaXQgdXNlcyB0aGUgZ2xvYmFsCi8vIFRpY2tNYXRoIGJvdW5kYXJ5IGZvciB0aGUgc3dhcCBkaXJlY3Rpb24uCmZ1bmMgY2FsY3VsYXRlU3FydFByaWNlTGltaXRUb1N0cih6ZXJvRm9yT25lIGJvb2wsIHNxcnRQcmljZUxpbWl0WDk2ICp1MjU2LlVpbnQpIHN0cmluZyB7CglpZiAhc3FydFByaWNlTGltaXRYOTYuSXNaZXJvKCkgewoJCXJldHVybiBzcXJ0UHJpY2VMaW1pdFg5Ni5Ub1N0cmluZygpCgl9CgoJaWYgemVyb0Zvck9uZSB7CgkJcmV0dXJuIE1JTl9TUVJUX1JBVElPX1BMVVNfT05FCgl9CglyZXR1cm4gTUFYX1NRUlRfUkFUSU9fTUlOVVNfT05FCn0KGowtCg5zd2FwX211bHRpLmdubxL5LHBhY2thZ2Ugcm91dGVyCgppbXBvcnQgKAoJcHJiYWMgImduby5sYW5kL3AvZ25vc3dhcC9yYmFjL3YxIgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCgoJImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCikKCi8vIG11bHRpU3dhcCBwZXJmb3JtcyBhIG11bHRpLWhvcCBleGFjdC1pbnB1dCBzd2FwIGluIGZvcndhcmQgb3JkZXIuCmZ1bmMgKHIgKnJvdXRlclYxKSBtdWx0aVN3YXAoXyBpbnQsIHJsbSByZWFsbSwgc3AgU3dhcFBhcmFtcywgbnVtUG9vbHMgaW50LCBzd2FwUGF0aCBzdHJpbmcpIChpbnQ2NCwgaW50NjQpIHsKCXBheWVyIDo9IHJsbS5QcmV2aW91cygpLkFkZHJlc3MoKQoJcm91dGVyQWRkciA6PSBhY2Nlc3MuTXVzdEdldEFkZHJlc3MocHJiYWMuUk9MRV9ST1VURVIuU3RyaW5nKCkpCglmaXJzdEFtb3VudEluIDo9IGludDY0KDApCgoJZm9yIGN1cnJlbnRQb29sSW5kZXggOj0gMDsgOyBjdXJyZW50UG9vbEluZGV4KysgewoJCWNhbGxiYWNrRGF0YSA6PSBuZXdTd2FwQ2FsbGJhY2tEYXRhKHNwLCBwYXllcikKCQlhbW91bnRJbiwgYW1vdW50T3V0IDo9IHIuc3dhcElubmVyKAoJCQkwLAoJCQlybG0sCgkJCXNwLmFtb3VudFNwZWNpZmllZCwKCQkJc3AucmVjaXBpZW50LAoJCQl1MjU2Llplcm8oKSwKCQkJY2FsbGJhY2tEYXRhLAoJCSkKCgkJLy8gZXZlcnkgaG9wIG9mIGEgZm9yd2FyZCBtdWx0aS1ob3Agc3dhcCBpcyBleGFjdC1pbgoJCWFzc2VydEhvcEZ1bGx5Q29uc3VtZWQoY3VycmVudFBvb2xJbmRleCwgc3AuYW1vdW50U3BlY2lmaWVkLCBhbW91bnRJbikKCgkJaWYgY3VycmVudFBvb2xJbmRleCA9PSAwIHsKCQkJZmlyc3RBbW91bnRJbiA9IGFtb3VudEluCgkJfQoKCQluZXh0UG9vbEluZGV4IDo9IGN1cnJlbnRQb29sSW5kZXggKyAxCgkJaWYgbmV4dFBvb2xJbmRleCA+PSBudW1Qb29scyB7CgkJCXJldHVybiBmaXJzdEFtb3VudEluLCBhbW91bnRPdXQKCQl9CgoJCXBheWVyID0gcm91dGVyQWRkcgoJCW5leHRJbnB1dCwgbmV4dE91dHB1dCwgbmV4dEZlZSA6PSBnZXREYXRhRm9yTXVsdGlQYXRoKHN3YXBQYXRoLCBuZXh0UG9vbEluZGV4KQoJCXNwLnRva2VuSW4gPSBuZXh0SW5wdXQKCQlzcC50b2tlbk91dCA9IG5leHRPdXRwdXQKCQlzcC5mZWUgPSBuZXh0RmVlCgkJc3AuYW1vdW50U3BlY2lmaWVkID0gYW1vdW50T3V0Cgl9Cn0KCi8vIG11bHRpU3dhcE5lZ2F0aXZlIHBlcmZvcm1zIGEgbXVsdGktaG9wIGV4YWN0LW91dHB1dCBzd2FwLiBJdCBmaXJzdCBxdW90ZXMKLy8gZXZlcnkgaG9wIGJhY2t3YXJkLCB0aGVuIGV4ZWN1dGVzIHRoZSBjb2xsZWN0ZWQgc3dhcHMgZm9yd2FyZC4KZnVuYyAociAqcm91dGVyVjEpIG11bHRpU3dhcE5lZ2F0aXZlKF8gaW50LCBybG0gcmVhbG0sIHNwIFN3YXBQYXJhbXMsIG51bVBvb2xzIGludCwgc3dhcFBhdGggc3RyaW5nKSAoaW50NjQsIGludDY0KSB7Cglzd2FwSW5mbyA6PSByLmNvbGxlY3RCYWNrd2FyZERyeVN3YXBJbmZvKHNwLlNpbmdsZVN3YXBQYXJhbXMsIG51bVBvb2xzLCBzd2FwUGF0aCkKCXJldHVybiByLmV4ZWN1dGVDb2xsZWN0ZWRTd2FwcygwLCBybG0sIHN3YXBJbmZvLCBzcC5yZWNpcGllbnQpCn0KCi8vIG11bHRpRHJ5U3dhcCBzaW11bGF0ZXMgYSBtdWx0aS1ob3AgZXhhY3QtaW5wdXQgc3dhcCBpbiBmb3J3YXJkIG9yZGVyLgpmdW5jIChyICpyb3V0ZXJWMSkgbXVsdGlEcnlTd2FwKHNwIFNpbmdsZVN3YXBQYXJhbXMsIG51bVBvb2xzIGludCwgc3dhcFBhdGggc3RyaW5nKSAoaW50NjQsIGludDY0LCBlcnJvcikgewoJZmlyc3RBbW91bnRJbiA6PSBpbnQ2NCgwKQoKCWZvciBjdXJyZW50UG9vbEluZGV4IDo9IDA7IDsgY3VycmVudFBvb2xJbmRleCsrIHsKCQlhbW91bnRJbiwgYW1vdW50T3V0IDo9IHIuc3dhcERyeUlubmVyKAoJCQlzcC5hbW91bnRTcGVjaWZpZWQsCgkJCXUyNTYuWmVybygpLAoJCQluZXdEcnlTd2FwQ2FsbGJhY2tEYXRhKHNwKSwKCQkpCgoJCS8vIG1pcnJvciB0aGUgcmVhbC1zd2FwIGZ1bGwtY29uc3VtcHRpb24gZ3VhcmQgc28gZHJ5IHJ1bnMgcHJlZGljdCByZXZlcnRzCgkJZXJyIDo9IHZhbGlkYXRlSG9wRnVsbHlDb25zdW1lZChjdXJyZW50UG9vbEluZGV4LCBzcC5hbW91bnRTcGVjaWZpZWQsIGFtb3VudEluKQoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gMCwgMCwgZXJyCgkJfQoKCQlpZiBjdXJyZW50UG9vbEluZGV4ID09IDAgewoJCQlmaXJzdEFtb3VudEluID0gYW1vdW50SW4KCQl9CgoJCW5leHRQb29sSW5kZXggOj0gY3VycmVudFBvb2xJbmRleCArIDEKCQlpZiBuZXh0UG9vbEluZGV4ID49IG51bVBvb2xzIHsKCQkJcmV0dXJuIGZpcnN0QW1vdW50SW4sIGFtb3VudE91dCwgbmlsCgkJfQoKCQluZXh0SW5wdXQsIG5leHRPdXRwdXQsIG5leHRGZWUgOj0gZ2V0RGF0YUZvck11bHRpUGF0aChzd2FwUGF0aCwgbmV4dFBvb2xJbmRleCkKCQlzcC50b2tlbkluID0gbmV4dElucHV0CgkJc3AudG9rZW5PdXQgPSBuZXh0T3V0cHV0CgkJc3AuZmVlID0gbmV4dEZlZQoJCXNwLmFtb3VudFNwZWNpZmllZCA9IGFtb3VudE91dAoJfQp9CgovLyBtdWx0aURyeVN3YXBOZWdhdGl2ZSBzaW11bGF0ZXMgYSBtdWx0aS1ob3AgZXhhY3Qtb3V0cHV0IHN3YXAuCi8vIEl0IGZpcnN0IHF1b3RlcyBldmVyeSBob3AgYmFja3dhcmQsIHRoZW4gc2ltdWxhdGVzIHRoZSBjb2xsZWN0ZWQgc3dhcHMgZm9yd2FyZC4KZnVuYyAociAqcm91dGVyVjEpIG11bHRpRHJ5U3dhcE5lZ2F0aXZlKHNwIFNpbmdsZVN3YXBQYXJhbXMsIG51bVBvb2xzIGludCwgc3dhcFBhdGggc3RyaW5nKSAoaW50NjQsIGludDY0LCBlcnJvcikgewoJc3dhcEluZm8gOj0gci5jb2xsZWN0QmFja3dhcmREcnlTd2FwSW5mbyhzcCwgbnVtUG9vbHMsIHN3YXBQYXRoKQoJcmV0dXJuIHIuZXhlY3V0ZUNvbGxlY3RlZERyeVN3YXBzKHN3YXBJbmZvKQp9CgovLyBjb2xsZWN0QmFja3dhcmREcnlTd2FwSW5mbyBxdW90ZXMgYW4gZXhhY3Qtb3V0cHV0IHJvdXRlIGJhY2t3YXJkIGJlZm9yZSByZWFsIGV4ZWN1dGlvbi4KZnVuYyAociAqcm91dGVyVjEpIGNvbGxlY3RCYWNrd2FyZERyeVN3YXBJbmZvKHNwIFNpbmdsZVN3YXBQYXJhbXMsIG51bVBvb2xzIGludCwgc3dhcFBhdGggc3RyaW5nKSBbXVNpbmdsZVN3YXBQYXJhbXMgewoJc3dhcEluZm8gOj0gbWFrZShbXVNpbmdsZVN3YXBQYXJhbXMsIDAsIG51bVBvb2xzKQoKCWZvciBjdXJyZW50UG9vbEluZGV4IDo9IG51bVBvb2xzIC0gMTsgY3VycmVudFBvb2xJbmRleCA+PSAwOyBjdXJyZW50UG9vbEluZGV4LS0gewoJCWFtb3VudEluLCBfIDo9IHIuc2luZ2xlRHJ5U3dhcCgmc3ApCgkJc3dhcEluZm8gPSBhcHBlbmQoc3dhcEluZm8sIHNwKQoKCQlpZiBjdXJyZW50UG9vbEluZGV4ID09IDAgewoJCQlicmVhawoJCX0KCgkJbmV4dFBvb2xJbmRleCA6PSBjdXJyZW50UG9vbEluZGV4IC0gMQoJCW5leHRJbnB1dCwgbmV4dE91dHB1dCwgbmV4dEZlZSA6PSBnZXREYXRhRm9yTXVsdGlQYXRoKHN3YXBQYXRoLCBuZXh0UG9vbEluZGV4KQoJCXNwLnRva2VuSW4gPSBuZXh0SW5wdXQKCQlzcC50b2tlbk91dCA9IG5leHRPdXRwdXQKCQlzcC5mZWUgPSBuZXh0RmVlCgkJc3AuYW1vdW50U3BlY2lmaWVkID0gLWFtb3VudEluCgl9CgoJcmV0dXJuIHN3YXBJbmZvCn0KCi8vIGV4ZWN1dGVDb2xsZWN0ZWRTd2FwcyBleGVjdXRlcyB0aGUgYmFja3dhcmQtcXVvdGVkIGV4YWN0LW91dHB1dCBzd2FwcyBpbiBmb3J3YXJkIG9yZGVyLgpmdW5jIChyICpyb3V0ZXJWMSkgZXhlY3V0ZUNvbGxlY3RlZFN3YXBzKF8gaW50LCBybG0gcmVhbG0sIHN3YXBJbmZvIFtdU2luZ2xlU3dhcFBhcmFtcywgcmVjaXBpZW50IGFkZHJlc3MpIChpbnQ2NCwgaW50NjQpIHsKCXBheWVyIDo9IHJsbS5QcmV2aW91cygpLkFkZHJlc3MoKQoJcm91dGVyQWRkciA6PSBhY2Nlc3MuTXVzdEdldEFkZHJlc3MocHJiYWMuUk9MRV9ST1VURVIuU3RyaW5nKCkpCglmaXJzdEFtb3VudEluIDo9IGludDY0KDApCgoJZm9yIGN1cnJlbnRQb29sSW5kZXggOj0gbGVuKHN3YXBJbmZvKSAtIDE7IGN1cnJlbnRQb29sSW5kZXggPj0gMDsgY3VycmVudFBvb2xJbmRleC0tIHsKCQlhbW91bnRJbiwgYW1vdW50T3V0IDo9IHIuc3dhcElubmVyKAoJCQkwLAoJCQlybG0sCgkJCXN3YXBJbmZvW2N1cnJlbnRQb29sSW5kZXhdLmFtb3VudFNwZWNpZmllZCwKCQkJcmVjaXBpZW50LAoJCQl1MjU2Llplcm8oKSwKCQkJbmV3U3dhcENhbGxiYWNrRGF0YShzd2FwSW5mb1tjdXJyZW50UG9vbEluZGV4XSwgcGF5ZXIpLAoJCSkKCgkJLy8gaG9wcyByZS1zcGVjaWZpZWQgZnJvbSB0aGUgcHJldmlvdXMgaG9wJ3MgYWN0dWFsIG91dHB1dCBydW4gYXMgZXhhY3QtaW4KCQkvLyAocG9zaXRpdmUgYW1vdW50U3BlY2lmaWVkKSBhbmQgbXVzdCBjb25zdW1lIHRoYXQgYW1vdW50IGVudGlyZWx5CgkJaWYgc3BlYyA6PSBzd2FwSW5mb1tjdXJyZW50UG9vbEluZGV4XS5hbW91bnRTcGVjaWZpZWQ7IHNwZWMgPiAwIHsKCQkJYXNzZXJ0SG9wRnVsbHlDb25zdW1lZChjdXJyZW50UG9vbEluZGV4LCBzcGVjLCBhbW91bnRJbikKCQl9CgoJCWlmIGN1cnJlbnRQb29sSW5kZXggPT0gbGVuKHN3YXBJbmZvKS0xIHsKCQkJZmlyc3RBbW91bnRJbiA9IGFtb3VudEluCgkJfQoKCQlpZiBjdXJyZW50UG9vbEluZGV4ID09IDAgewoJCQlyZXR1cm4gZmlyc3RBbW91bnRJbiwgYW1vdW50T3V0CgkJfQoKCQluZXh0UG9vbEluZGV4IDo9IGN1cnJlbnRQb29sSW5kZXggLSAxCgkJc3dhcEluZm9bbmV4dFBvb2xJbmRleF0uYW1vdW50U3BlY2lmaWVkID0gYW1vdW50T3V0CgkJcGF5ZXIgPSByb3V0ZXJBZGRyCgl9CgoJcmV0dXJuIGZpcnN0QW1vdW50SW4sIDAKfQoKZnVuYyAociAqcm91dGVyVjEpIGV4ZWN1dGVDb2xsZWN0ZWREcnlTd2Fwcyhzd2FwSW5mbyBbXVNpbmdsZVN3YXBQYXJhbXMpIChpbnQ2NCwgaW50NjQsIGVycm9yKSB7CglmaXJzdEFtb3VudEluIDo9IGludDY0KDApCgoJZm9yIGN1cnJlbnRQb29sSW5kZXggOj0gbGVuKHN3YXBJbmZvKSAtIDE7IGN1cnJlbnRQb29sSW5kZXggPj0gMDsgY3VycmVudFBvb2xJbmRleC0tIHsKCQlhbW91bnRJbiwgYW1vdW50T3V0IDo9IHIuc3dhcERyeUlubmVyKAoJCQlzd2FwSW5mb1tjdXJyZW50UG9vbEluZGV4XS5hbW91bnRTcGVjaWZpZWQsCgkJCXUyNTYuWmVybygpLAoJCQluZXdEcnlTd2FwQ2FsbGJhY2tEYXRhKHN3YXBJbmZvW2N1cnJlbnRQb29sSW5kZXhdKSwKCQkpCgoJCS8vIG1pcnJvciB0aGUgcmVhbC1zd2FwIGZ1bGwtY29uc3VtcHRpb24gZ3VhcmQgc28gZHJ5IHJ1bnMgcHJlZGljdCByZXZlcnRzCgkJaWYgc3BlYyA6PSBzd2FwSW5mb1tjdXJyZW50UG9vbEluZGV4XS5hbW91bnRTcGVjaWZpZWQ7IHNwZWMgPiAwIHsKCQkJZXJyIDo9IHZhbGlkYXRlSG9wRnVsbHlDb25zdW1lZChjdXJyZW50UG9vbEluZGV4LCBzcGVjLCBhbW91bnRJbikKCQkJaWYgZXJyICE9IG5pbCB7CgkJCQlyZXR1cm4gMCwgMCwgZXJyCgkJCX0KCQl9CgoJCWlmIGN1cnJlbnRQb29sSW5kZXggPT0gbGVuKHN3YXBJbmZvKS0xIHsKCQkJZmlyc3RBbW91bnRJbiA9IGFtb3VudEluCgkJfQoKCQlpZiBjdXJyZW50UG9vbEluZGV4ID09IDAgewoJCQlyZXR1cm4gZmlyc3RBbW91bnRJbiwgYW1vdW50T3V0LCBuaWwKCQl9CgoJCW5leHRQb29sSW5kZXggOj0gY3VycmVudFBvb2xJbmRleCAtIDEKCQlzd2FwSW5mb1tuZXh0UG9vbEluZGV4XS5hbW91bnRTcGVjaWZpZWQgPSBhbW91bnRPdXQKCX0KCglyZXR1cm4gZmlyc3RBbW91bnRJbiwgMCwgbmlsCn0KGtYHCg9zd2FwX3NpbmdsZS5nbm8SwgdwYWNrYWdlIHJvdXRlcgoKaW1wb3J0ICgKCXByYmFjICJnbm8ubGFuZC9wL2dub3N3YXAvcmJhYy92MSIKCXUyNTYgImduby5sYW5kL3AvZ25vc3dhcC91aW50MjU2L3YxIgoKCSJnbm8ubGFuZC9yL2dub3N3YXAvYWNjZXNzL3YxIgopCgovLyBzaW5nbGVTd2FwIGV4ZWN1dGVzIGEgc3dhcCB3aXRoaW4gYSBzaW5nbGUgcG9vbCB1c2luZyB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy4KLy8gSXQgcHJvY2Vzc2VzIGEgdG9rZW4gc3dhcCB3aXRoaW4gdHdvIGFzc2V0cyB1c2luZyBhIHNwZWNpZmljIGZlZSB0aWVyIGFuZAovLyBhdXRvbWF0aWNhbGx5IHNldHMgdGhlIHJlY2lwaWVudCB0byB0aGUgY2FsbGVyJ3MgYWRkcmVzcy4KZnVuYyAociAqcm91dGVyVjEpIHNpbmdsZVN3YXAoXyBpbnQsIHJsbSByZWFsbSwgcCAqU2luZ2xlU3dhcFBhcmFtcykgKGludDY0LCBpbnQ2NCkgewoJYXNzZXJ0U2luZ2xlU3dhcChwKQoKCWNhbGxlciA6PSBybG0uUHJldmlvdXMoKS5BZGRyZXNzKCkKCXJlY2lwaWVudCA6PSBhY2Nlc3MuTXVzdEdldEFkZHJlc3MocHJiYWMuUk9MRV9ST1VURVIuU3RyaW5nKCkpCgoJcmV0dXJuIHIuc3dhcElubmVyKAoJCTAsCgkJcmxtLAoJCXAuYW1vdW50U3BlY2lmaWVkLAoJCXJlY2lwaWVudCwKCQlwLlNxcnRQcmljZUxpbWl0WDk2KCksCgkJbmV3U3dhcENhbGxiYWNrRGF0YShwLCBjYWxsZXIpLAoJKQp9CgovLyBzaW5nbGVEcnlTd2FwIHNpbXVsYXRlcyBhIHNpbmdsZS10b2tlbiBzd2FwIG9wZXJhdGlvbiB3aXRob3V0IGV4ZWN1dGluZyBpdC4KZnVuYyAociAqcm91dGVyVjEpIHNpbmdsZURyeVN3YXAocCAqU2luZ2xlU3dhcFBhcmFtcykgKGludDY0LCBpbnQ2NCkgewoJYXNzZXJ0U2luZ2xlU3dhcChwKQoKCXJldHVybiByLnN3YXBEcnlJbm5lcigKCQlwLmFtb3VudFNwZWNpZmllZCwKCQl1MjU2Llplcm8oKSwKCQluZXdEcnlTd2FwQ2FsbGJhY2tEYXRhKHApLAoJKQp9ChquPAoIdHlwZS5nbm8SoTxwYWNrYWdlIHJvdXRlcgoKaW1wb3J0ICgKCXUyNTYgImduby5sYW5kL3AvZ25vc3dhcC91aW50MjU2L3YxIgoKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKY29uc3QgKAoJcmF3VW5rbm93biAgPSAiVU5LTk9XTiIKCXJhd0V4YWN0SW4gID0gIkVYQUNUX0lOIgoJcmF3RXhhY3RPdXQgPSAiRVhBQ1RfT1VUIgoKCXplcm9BZGRyZXNzID0gYWRkcmVzcygiIikKKQoKdHlwZSBTd2FwVHlwZSBzdHJpbmcKCmNvbnN0ICgKCVVua25vd24gU3dhcFR5cGUgPSByYXdVbmtub3duCgkvLyBFeGFjdEluIHJlcHJlc2VudHMgYSBzd2FwIHR5cGUgd2hlcmUgdGhlIGlucHV0IGFtb3VudCBpcyBleGFjdCBhbmQgdGhlIG91dHB1dCBhbW91bnQgbWF5IHZhcnkuCgkvLyBVc2VkIHdoZW4gYSB1c2VyIHdhbnRzIHRvIHN3YXAgYSBzcGVjaWZpYyBhbW91bnQgb2YgaW5wdXQgdG9rZW5zLgoJRXhhY3RJbiBTd2FwVHlwZSA9IHJhd0V4YWN0SW4KCgkvLyBFeGFjdE91dCByZXByZXNlbnRzIGEgc3dhcCB0eXBlIHdoZXJlIHRoZSBvdXRwdXQgYW1vdW50IGlzIGV4YWN0IGFuZCB0aGUgaW5wdXQgYW1vdW50IG1heSB2YXJ5LgoJLy8gVXNlZCB3aGVuIGEgdXNlciB3YW50cyB0byBzd2FwIGEgc3BlY2lmaWMgYW1vdW50IG9mIG91dHB1dCB0b2tlbnMuCglFeGFjdE91dCBTd2FwVHlwZSA9IHJhd0V4YWN0T3V0CikKCi8vIHRyeVN3YXBUeXBlRnJvbVN0ciBhdHRlbXB0cyB0byBjb252ZXJ0IGEgc3RyaW5nIGludG8gYSBTd2FwVHlwZS4KLy8gSXQgdmFsaWRhdGVzIGFuZCBjb252ZXJ0cyBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIHN3YXAgdHlwZXMgaW50byB0aGVpciBjb3JyZXNwb25kaW5nIGVudW0gdmFsdWVzLgpmdW5jIHRyeVN3YXBUeXBlRnJvbVN0cihzd2FwVHlwZSBzdHJpbmcpIChTd2FwVHlwZSwgZXJyb3IpIHsKCXN3aXRjaCBzd2FwVHlwZSB7CgljYXNlIHJhd0V4YWN0SW46CgkJcmV0dXJuIEV4YWN0SW4sIG5pbAoJY2FzZSByYXdFeGFjdE91dDoKCQlyZXR1cm4gRXhhY3RPdXQsIG5pbAoJZGVmYXVsdDoKCQlyZXR1cm4gIiIsIHVmbXQuRXJyb3JmKCJ1bmtub3duIHN3YXBUeXBlOiBleHBlY3RlZCBFeGFjdEluIG9yIEV4YWN0T3V0LCBnb3QgJXMiLCBzd2FwVHlwZSkKCX0KfQoKLy8gU3RyaW5nIHJldHVybnMgdGhlIHdpcmUtZm9ybWF0IHN0cmluZyBmb3IgYSBTd2FwVHlwZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN3YXBUeXBlOiBFWEFDVF9JTiBvciBFWEFDVF9PVVQgZm9yIGtub3duIHZhbHVlcywgb3IgYW4gZW1wdHkgc3RyaW5nIGZvciBVbmtub3duCmZ1bmMgKHMgU3dhcFR5cGUpIFN0cmluZygpIHN0cmluZyB7Cglzd2l0Y2ggcyB7CgljYXNlIEV4YWN0SW46CgkJcmV0dXJuIHJhd0V4YWN0SW4KCWNhc2UgRXhhY3RPdXQ6CgkJcmV0dXJuIHJhd0V4YWN0T3V0CglkZWZhdWx0OgoJCXJldHVybiAiIgoJfQp9CgovLyBTaW5nbGVTd2FwUGFyYW1zIGNvbnRhaW5zIHBhcmFtZXRlcnMgZm9yIGV4ZWN1dGluZyBhIHNpbmdsZSBwb29sIHN3YXAuCi8vIEl0IHJlcHJlc2VudHMgdGhlIHNpbXBsZXN0IGZvcm0gb2Ygc3dhcCB0aGF0IG9jY3VycyB3aXRoaW4gYSBzaW5nbGUgbGlxdWlkaXR5IHBvb2wuCnR5cGUgU2luZ2xlU3dhcFBhcmFtcyBzdHJ1Y3QgewoJdG9rZW5JbiAgc3RyaW5nIC8vIHRva2VuIHRvIHNwZW5kCgl0b2tlbk91dCBzdHJpbmcgLy8gdG9rZW4gdG8gcmVjZWl2ZQoJZmVlICAgICAgdWludDMyIC8vIGZlZSBvZiB0aGUgcG9vbCB1c2VkIHRvIHN3YXAKCgkvLyBBbW91bnQgc3BlY2lmaWVkIGZvciB0aGUgc3dhcDoKCS8vICAtIFBvc2l0aXZlOiBleGFjdCBpbnB1dCBhbW91bnQgKHRva2VuSW4pCgkvLyAgLSBOZWdhdGl2ZTogZXhhY3Qgb3V0cHV0IGFtb3VudCAodG9rZW5PdXQpCglhbW91bnRTcGVjaWZpZWQgaW50NjQKCglzcXJ0UHJpY2VMaW1pdFg5NiAqdTI1Ni5VaW50IC8vIHNxcnRQcmljZUxpbWl0WDk2IGZvciB0aGUgc3dhcCwgZW1wdHkgc3RyaW5nIG9yIHplcm8gc3RyaW5nIG1lYW5zIG5vIGxpbWl0Cn0KCi8vIFRva2VuSW4gcmV0dXJucyB0aGUgaW5wdXQgdG9rZW4gY29udHJhY3QgcGF0aC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRva2VuSW46IHRva2VuIHNwZW50IGJ5IHRoaXMgc2luZ2xlLXBvb2wgc3dhcApmdW5jIChwIFNpbmdsZVN3YXBQYXJhbXMpIFRva2VuSW4oKSBzdHJpbmcgeyByZXR1cm4gcC50b2tlbkluIH0KCi8vIFRva2VuT3V0IHJldHVybnMgdGhlIG91dHB1dCB0b2tlbiBjb250cmFjdCBwYXRoLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdG9rZW5PdXQ6IHRva2VuIHJlY2VpdmVkIGJ5IHRoaXMgc2luZ2xlLXBvb2wgc3dhcApmdW5jIChwIFNpbmdsZVN3YXBQYXJhbXMpIFRva2VuT3V0KCkgc3RyaW5nIHsgcmV0dXJuIHAudG9rZW5PdXQgfQoKLy8gRmVlIHJldHVybnMgdGhlIHBvb2wgZmVlIHRpZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBmZWU6IGZlZSB0aWVyIGVuY29kZWQgYXMgdGhlIHBvb2wncyB1aW50MzIgZmVlIHZhbHVlCmZ1bmMgKHAgU2luZ2xlU3dhcFBhcmFtcykgRmVlKCkgdWludDMyIHsgcmV0dXJuIHAuZmVlIH0KCi8vIFNxcnRQcmljZUxpbWl0WDk2IHJldHVybnMgdGhlIG9wdGlvbmFsIFE2NC45NiBzcXVhcmUtcm9vdCBwcmljZSBsaW1pdC4KLy8gQSBuaWwgc3RvcmVkIGxpbWl0IGlzIG5vcm1hbGl6ZWQgdG8gdGhlIHplcm8gdmFsdWUsIHdoaWNoIGNhbGxlcnMgaW50ZXJwcmV0IGFzIG5vIGV4cGxpY2l0IGxpbWl0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gbGltaXQ6IGNvbmZpZ3VyZWQgUTY0Ljk2IHByaWNlIGxpbWl0LCBvciBhIHplcm8gdWludCB3aGVuIG5vIGxpbWl0IHdhcyBzdXBwbGllZApmdW5jIChwIFNpbmdsZVN3YXBQYXJhbXMpIFNxcnRQcmljZUxpbWl0WDk2KCkgKnUyNTYuVWludCB7CglpZiBwLnNxcnRQcmljZUxpbWl0WDk2ID09IG5pbCB7CgkJcmV0dXJuIHUyNTYuWmVybygpCgl9CgoJcmV0dXJuIHAuc3FydFByaWNlTGltaXRYOTYKfQoKLy8gU3dhcFBhcmFtcyBjb250YWlucyBwYXJhbWV0ZXJzIGZvciBleGVjdXRpbmcgYSBtdWx0aS1ob3Agc3dhcCBvcGVyYXRpb24uCnR5cGUgU3dhcFBhcmFtcyBzdHJ1Y3QgewoJU2luZ2xlU3dhcFBhcmFtcwoJcmVjaXBpZW50IGFkZHJlc3MgLy8gYWRkcmVzcyB0byByZWNlaXZlIHRoZSB0b2tlbgp9CgovLyBUb2tlbkluIHJldHVybnMgdGhlIGlucHV0IHRva2VuIGNvbnRyYWN0IHBhdGguCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0b2tlbkluOiB0b2tlbiBzcGVudCBieSB0aGlzIG11bHRpLWhvcCBzd2FwIHBhcmFtZXRlcnMgb2JqZWN0CmZ1bmMgKHAgU3dhcFBhcmFtcykgVG9rZW5JbigpIHN0cmluZyB7IHJldHVybiBwLnRva2VuSW4gfQoKLy8gVG9rZW5PdXQgcmV0dXJucyB0aGUgb3V0cHV0IHRva2VuIGNvbnRyYWN0IHBhdGguCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0b2tlbk91dDogdG9rZW4gcmVjZWl2ZWQgYnkgdGhpcyBtdWx0aS1ob3Agc3dhcCBwYXJhbWV0ZXJzIG9iamVjdApmdW5jIChwIFN3YXBQYXJhbXMpIFRva2VuT3V0KCkgc3RyaW5nIHsgcmV0dXJuIHAudG9rZW5PdXQgfQoKLy8gRmVlIHJldHVybnMgdGhlIHBvb2wgZmVlIHRpZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBmZWU6IGZlZSB0aWVyIGVuY29kZWQgYXMgdGhlIHBvb2wncyB1aW50MzIgZmVlIHZhbHVlCmZ1bmMgKHAgU3dhcFBhcmFtcykgRmVlKCkgdWludDMyIHsgcmV0dXJuIHAuZmVlIH0KCi8vIFJlY2lwaWVudCByZXR1cm5zIHRoZSBhZGRyZXNzIHRoYXQgcmVjZWl2ZXMgc3dhcCBvdXRwdXQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZWNpcGllbnQ6IGNvbmZpZ3VyZWQgb3V0cHV0IHJlY2lwaWVudCBhZGRyZXNzCmZ1bmMgKHAgU3dhcFBhcmFtcykgUmVjaXBpZW50KCkgYWRkcmVzcyB7IHJldHVybiBwLnJlY2lwaWVudCB9CgovLyBuZXdTd2FwUGFyYW1zIGNyZWF0ZXMgYSBuZXcgU3dhcFBhcmFtcyBpbnN0YW5jZSB3aXRoIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLgpmdW5jIG5ld1N3YXBQYXJhbXModG9rZW5JbiwgdG9rZW5PdXQgc3RyaW5nLCBmZWUgdWludDMyLCByZWNpcGllbnQgYWRkcmVzcywgYW1vdW50U3BlY2lmaWVkIGludDY0KSAqU3dhcFBhcmFtcyB7CglyZXR1cm4gJlN3YXBQYXJhbXN7CgkJU2luZ2xlU3dhcFBhcmFtczogU2luZ2xlU3dhcFBhcmFtc3sKCQkJdG9rZW5JbjogICAgICAgICB0b2tlbkluLAoJCQl0b2tlbk91dDogICAgICAgIHRva2VuT3V0LAoJCQlmZWU6ICAgICAgICAgICAgIGZlZSwKCQkJYW1vdW50U3BlY2lmaWVkOiBhbW91bnRTcGVjaWZpZWQsCgkJfSwKCQlyZWNpcGllbnQ6IHJlY2lwaWVudCwKCX0KfQoKLy8gU3dhcFJlc3VsdCBlbmNhcHN1bGF0ZXMgdGhlIG91dGNvbWUgb2YgYSBzd2FwIG9wZXJhdGlvbi4KdHlwZSBTd2FwUmVzdWx0IHN0cnVjdCB7CglSb3V0ZXMgICAgICAgICAgW11zdHJpbmcKCVF1b3RlcyAgICAgICAgICBbXXN0cmluZwoJQW1vdW50SW4gICAgICAgIGludDY0CglBbW91bnRPdXQgICAgICAgaW50NjQKCUFtb3VudFNwZWNpZmllZCBpbnQ2NAp9CgovLyBTd2FwUGFyYW1zSSBkZWZpbmVzIHRoZSBjb21tb24gaW50ZXJmYWNlIGZvciBzd2FwIHBhcmFtZXRlcnMuCnR5cGUgU3dhcFBhcmFtc0kgaW50ZXJmYWNlIHsKCS8vIFRva2VuSW4gcmV0dXJucyB0aGUgaW5wdXQgdG9rZW4gcGF0aCByZXF1aXJlZCBieSBzd2FwIHByb2Nlc3NpbmcuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0b2tlbkluOiB0b2tlbiBzcGVudCBieSB0aGUgc3dhcAoJVG9rZW5JbigpIHN0cmluZwoJLy8gVG9rZW5PdXQgcmV0dXJucyB0aGUgb3V0cHV0IHRva2VuIHBhdGggcmVxdWlyZWQgYnkgc3dhcCBwcm9jZXNzaW5nLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdG9rZW5PdXQ6IHRva2VuIHJlY2VpdmVkIGJ5IHRoZSBzd2FwCglUb2tlbk91dCgpIHN0cmluZwoJLy8gRmVlIHJldHVybnMgdGhlIHBvb2wgZmVlIHRpZXIgcmVxdWlyZWQgYnkgc3dhcCBwcm9jZXNzaW5nLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZmVlOiBwb29sIGZlZSB0aWVyCglGZWUoKSB1aW50MzIKfQoKLy8gU3dhcENhbGxiYWNrRGF0YSBjb250YWlucyB0aGUgY2FsbGJhY2sgZGF0YSByZXF1aXJlZCBmb3Igc3dhcCBleGVjdXRpb24uCi8vIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHBhc3MgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGR1cmluZyB0aGUgc3dhcCBjYWxsYmFjayBwcm9jZXNzLAovLyBlbnN1cmluZyBwcm9wZXIgdG9rZW4gdHJhbnNmZXJzIGFuZCBwb29sIGRhdGEgdXBkYXRlcy4KdHlwZSBTd2FwQ2FsbGJhY2tEYXRhIHN0cnVjdCB7Cgl0b2tlbkluICBzdHJpbmcgIC8vIHRva2VuIHRvIHNwZW5kCgl0b2tlbk91dCBzdHJpbmcgIC8vIHRva2VuIHRvIHJlY2VpdmUKCWZlZSAgICAgIHVpbnQzMiAgLy8gZmVlIG9mIHRoZSBwb29sIHVzZWQgdG8gc3dhcAoJcGF5ZXIgICAgYWRkcmVzcyAvLyBhZGRyZXNzIHRvIHNwZW5kIHRoZSB0b2tlbgp9CgovLyBuZXdTd2FwQ2FsbGJhY2tEYXRhIGNyZWF0ZXMgYSBuZXcgU3dhcENhbGxiYWNrRGF0YSBmcm9tIGEgU3dhcFBhcmFtc0kuCmZ1bmMgbmV3U3dhcENhbGxiYWNrRGF0YShwYXJhbXMgU3dhcFBhcmFtc0ksIHBheWVyIGFkZHJlc3MpIFN3YXBDYWxsYmFja0RhdGEgewoJcmV0dXJuIFN3YXBDYWxsYmFja0RhdGF7CgkJdG9rZW5JbjogIHBhcmFtcy5Ub2tlbkluKCksCgkJdG9rZW5PdXQ6IHBhcmFtcy5Ub2tlbk91dCgpLAoJCWZlZTogICAgICBwYXJhbXMuRmVlKCksCgkJcGF5ZXI6ICAgIHBheWVyLAoJfQp9CgovLyBuZXdEcnlTd2FwQ2FsbGJhY2tEYXRhIGNyZWF0ZXMgY2FsbGJhY2sgZGF0YSBmb3IgYSBkcnkgc3dhcC4gVGhlIHBheWVyIGlzCi8vIGRlbGliZXJhdGVseSB0aGUgemVybyBhZGRyZXNzIGJlY2F1c2UgZHJ5IHN3YXBzIGRvIG5vdCBleGVjdXRlIGNhbGxiYWNrcyBvcgovLyB0b2tlbiB0cmFuc2ZlcnMuCmZ1bmMgbmV3RHJ5U3dhcENhbGxiYWNrRGF0YShwYXJhbXMgU3dhcFBhcmFtc0kpIFN3YXBDYWxsYmFja0RhdGEgewoJcmV0dXJuIFN3YXBDYWxsYmFja0RhdGF7CgkJdG9rZW5JbjogIHBhcmFtcy5Ub2tlbkluKCksCgkJdG9rZW5PdXQ6IHBhcmFtcy5Ub2tlbk91dCgpLAoJCWZlZTogICAgICBwYXJhbXMuRmVlKCksCgkJcGF5ZXI6ICAgIHplcm9BZGRyZXNzLAoJfQp9CgovLyBFeGFjdEluUGFyYW1zIGNvbnRhaW5zIHBhcmFtZXRlcnMgZm9yIGV4YWN0IGlucHV0IHN3YXBzLgp0eXBlIEV4YWN0SW5QYXJhbXMgc3RydWN0IHsKCUJhc2VTd2FwUGFyYW1zCglBbW91bnRJbiAgICAgaW50NjQKCUFtb3VudE91dE1pbiBpbnQ2NAp9CgovLyBOZXdFeGFjdEluUGFyYW1zIGNyZWF0ZXMgcGFyYW1ldGVycyBmb3IgYW4gZXhhY3QtaW5wdXQgc3dhcC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGJhc2VQYXJhbXM6IHNoYXJlZCB0b2tlbiwgcm91dGUsIHF1b3RlLCBwcmljZS1saW1pdCwgYW5kIGRlYWRsaW5lIHNldHRpbmdzCi8vICAgLSBhbW91bnRJbjogZXhhY3QgaW5wdXQgYW1vdW50IGluIHRva2VuIHVuaXRzOyBtdXN0IGJlIHBvc2l0aXZlIGJlZm9yZSBleGVjdXRpb24KLy8gICAtIGFtb3VudE91dE1pbjogbWluaW11bSBhY2NlcHRhYmxlIG91dHB1dCBhbW91bnQgaW4gdG9rZW4gdW5pdHMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHBhcmFtczogZXhhY3QtaW5wdXQgcGFyYW1ldGVycyBjb21iaW5pbmcgYmFzZVBhcmFtcyBhbmQgYW1vdW50IGxpbWl0cwpmdW5jIE5ld0V4YWN0SW5QYXJhbXMoCgliYXNlUGFyYW1zIEJhc2VTd2FwUGFyYW1zLAoJYW1vdW50SW4gaW50NjQsCglhbW91bnRPdXRNaW4gaW50NjQsCikgRXhhY3RJblBhcmFtcyB7CglyZXR1cm4gRXhhY3RJblBhcmFtc3sKCQlCYXNlU3dhcFBhcmFtczogYmFzZVBhcmFtcywKCQlBbW91bnRJbjogICAgICAgYW1vdW50SW4sCgkJQW1vdW50T3V0TWluOiAgIGFtb3VudE91dE1pbiwKCX0KfQoKLy8gRXhhY3RPdXRQYXJhbXMgY29udGFpbnMgcGFyYW1ldGVycyBmb3IgZXhhY3Qgb3V0cHV0IHN3YXBzLgp0eXBlIEV4YWN0T3V0UGFyYW1zIHN0cnVjdCB7CglCYXNlU3dhcFBhcmFtcwoJQW1vdW50T3V0ICAgaW50NjQKCUFtb3VudEluTWF4IGludDY0Cn0KCi8vIE5ld0V4YWN0T3V0UGFyYW1zIGNyZWF0ZXMgcGFyYW1ldGVycyBmb3IgYW4gZXhhY3Qtb3V0cHV0IHN3YXAuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBiYXNlUGFyYW1zOiBzaGFyZWQgdG9rZW4sIHJvdXRlLCBxdW90ZSwgcHJpY2UtbGltaXQsIGFuZCBkZWFkbGluZSBzZXR0aW5ncwovLyAgIC0gYW1vdW50T3V0OiByZXF1ZXN0ZWQgb3V0cHV0IGFtb3VudCBpbiB0b2tlbiB1bml0czsgbXVzdCBiZSBwb3NpdGl2ZSBiZWZvcmUgZXhlY3V0aW9uCi8vICAgLSBhbW91bnRJbk1heDogbWF4aW11bSBhY2NlcHRhYmxlIGlucHV0IGFtb3VudCBpbiB0b2tlbiB1bml0cwovLwovLyBSZXR1cm5zOgovLyAgIC0gcGFyYW1zOiBleGFjdC1vdXRwdXQgcGFyYW1ldGVycyBjb21iaW5pbmcgYmFzZVBhcmFtcyBhbmQgYW1vdW50IGxpbWl0cwpmdW5jIE5ld0V4YWN0T3V0UGFyYW1zKAoJYmFzZVBhcmFtcyBCYXNlU3dhcFBhcmFtcywKCWFtb3VudE91dCBpbnQ2NCwKCWFtb3VudEluTWF4IGludDY0LAopIEV4YWN0T3V0UGFyYW1zIHsKCXJldHVybiBFeGFjdE91dFBhcmFtc3sKCQlCYXNlU3dhcFBhcmFtczogYmFzZVBhcmFtcywKCQlBbW91bnRPdXQ6ICAgICAgYW1vdW50T3V0LAoJCUFtb3VudEluTWF4OiAgICBhbW91bnRJbk1heCwKCX0KfQoawlQKCXV0aWxzLmdubxK0VHBhY2thZ2Ugcm91dGVyCgppbXBvcnQgKAoJImJ5dGVzIgoJImVycm9ycyIKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJZ25zbWF0aCAiZ25vLmxhbmQvcC9nbm9zd2FwL2duc21hdGgvdjEiCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3V0aWxzL3YxIgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoJImduby5sYW5kL3IvZ25vc3dhcC9wb29sIgoKCWkyNTYgImduby5sYW5kL3AvZ25vc3dhcC9pbnQyNTYvdjEiCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKKQoKLy8gY2FsY3VsYXRlU3dhcEFtb3VudEJ5UXVvdGUgY2FsY3VsYXRlcyBzd2FwIGFtb3VudCBiYXNlZCBvbiBxdW90ZSBwZXJjZW50YWdlLgpmdW5jIGNhbGN1bGF0ZVN3YXBBbW91bnRCeVF1b3RlKGFtb3VudFNwZWNpZmllZCBpbnQ2NCwgcXVvdGUgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CglxdW90ZUludCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQocXVvdGUsIDEwLCA2NCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwLCB1Zm10LkVycm9yZigiaW52YWxpZCBxdW90ZSglcykiLCBxdW90ZSkKCX0KCglpZiBxdW90ZUludCA8IE1pblF1b3RlUGVyY2VudGFnZSB8fCBxdW90ZUludCA+IE1heFF1b3RlUGVyY2VudGFnZSB7CgkJcmV0dXJuIDAsIHVmbXQuRXJyb3JmKEVyckludmFsaWRRdW90ZVJhbmdlLCBxdW90ZUludCwgTWluUXVvdGVQZXJjZW50YWdlLCBNYXhRdW90ZVBlcmNlbnRhZ2UpCgl9CgoJdG9Td2FwIDo9IGduc21hdGguU2FmZU11bERpdkludDY0KGFtb3VudFNwZWNpZmllZCwgcXVvdGVJbnQsIFBFUkNFTlRBR0VfREVOT01JTkFUT1IpCglpZiB0b1N3YXAgPT0gMCB7CgkJcmV0dXJuIDAsIGVycm9ycy5OZXcoZXJySW52YWxpZFN3YXBBbW91bnQpCgl9CgoJcmV0dXJuIHRvU3dhcCwgbmlsCn0KCi8vIGFzc2VydEhvcHNJblJhbmdlIGVuc3VyZXMgdGhlIG51bWJlciBvZiBob3BzIGlzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgMS0zLgpmdW5jIGFzc2VydEhvcHNJblJhbmdlKGhvcHMgaW50KSB7Cglzd2l0Y2ggaG9wcyB7CgljYXNlIDEsIDIsIDM6CgkJcmV0dXJuCglkZWZhdWx0OgoJCXBhbmljKGVycm9ycy5OZXcoZXJySG9wc091dE9mUmFuZ2UpKQoJfQp9CgovLyBnZXREYXRhRm9yU2luZ2xlUGF0aCBleHRyYWN0cyB0b2tlbiBhZGRyZXNzZXMgYW5kIGZlZSBmcm9tIGEgc2luZ2xlIHBvb2wgcGF0aC4KLy8KLy8gSU1QT1JUQU5UOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdG9rZW5zIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgcm91dGUgc3RyaW5nLAovLyB3aGljaCByZXByZXNlbnRzIHRoZSBzd2FwIGRpcmVjdGlvbiAodG9rZW5Jbjp0b2tlbk91dDpmZWUpLCBOT1QgdGhlIGNhbm9uaWNhbCBwb29sIG9yZGVyaW5nLgpmdW5jIGdldERhdGFGb3JTaW5nbGVQYXRoKHBvb2xQYXRoIHN0cmluZykgKHRva2VuMCwgdG9rZW4xIHN0cmluZywgZmVlIHVpbnQzMikgewoJdG9rZW4wLCB0b2tlbjEsIGZlZSwgZXJyIDo9IGdldERhdGFGb3JTaW5nbGVQYXRoV2l0aEVycm9yKHBvb2xQYXRoKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXJldHVybiB0b2tlbjAsIHRva2VuMSwgZmVlCn0KCi8vIGdldERhdGFGb3JTaW5nbGVQYXRoV2l0aEVycm9yIGV4dHJhY3RzIHRva2VuIGFkZHJlc3NlcyBhbmQgZmVlIGZyb20gYSBzaW5nbGUgcG9vbCBwYXRoIHdpdGggZXJyb3IgaGFuZGxpbmcuCmZ1bmMgZ2V0RGF0YUZvclNpbmdsZVBhdGhXaXRoRXJyb3IocG9vbFBhdGggc3RyaW5nKSAoc3RyaW5nLCBzdHJpbmcsIHVpbnQzMiwgZXJyb3IpIHsKCXBvb2xQYXRoU3BsaXQgOj0gc3RyaW5ncy5TcGxpdChwb29sUGF0aCwgIjoiKQoJaWYgbGVuKHBvb2xQYXRoU3BsaXQpICE9IDMgewoJCXJldHVybiAiIiwgIiIsIDAsIG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQllcnJJbnZhbGlkUG9vbFBhdGgsCgkJCXVmbXQuU3ByaW50ZigibGVuKHBvb2xQYXRoU3BsaXQpICE9IDMsIHBvb2xQYXRoOiAlcyIsIHBvb2xQYXRoKSwKCQkpCgl9CgoJcG9vbFBhdGhTcGxpdFswXSA9IHN0cmluZ3MuVHJpbVNwYWNlKHBvb2xQYXRoU3BsaXRbMF0pCglwb29sUGF0aFNwbGl0WzFdID0gc3RyaW5ncy5UcmltU3BhY2UocG9vbFBhdGhTcGxpdFsxXSkKCglpZiBwb29sUGF0aFNwbGl0WzBdID09ICIiIHx8IHBvb2xQYXRoU3BsaXRbMV0gPT0gIiIgewoJCXJldHVybiAiIiwgIiIsIDAsIG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQllcnJJbnZhbGlkUG9vbFBhdGgsCgkJCXVmbXQuU3ByaW50ZigidG9rZW4gYWRkcmVzc2VzIGNhbm5vdCBiZSBlbXB0eTogJXMiLCBwb29sUGF0aCksCgkJKQoJfQoKCWYsIGVyciA6PSBzdHJjb252LkF0b2kocG9vbFBhdGhTcGxpdFsyXSkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiIiwgIiIsIDAsIG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQllcnJJbnZhbGlkUG9vbFBhdGgsCgkJCXVmbXQuU3ByaW50ZigiaW52YWxpZCBmZWU6ICVzIiwgcG9vbFBhdGhTcGxpdFsyXSksCgkJKQoJfQoKCXJldHVybiBwb29sUGF0aFNwbGl0WzBdLCBwb29sUGF0aFNwbGl0WzFdLCB1aW50MzIoZiksIG5pbAp9CgovLyBnZXREYXRhRm9yTXVsdGlQYXRoIGV4dHJhY3RzIHRva2VuIGFkZHJlc3NlcyBhbmQgZmVlIGZyb20gYSBtdWx0aS1ob3AgcGF0aCBhdCBzcGVjaWZpZWQgaW5kZXguCmZ1bmMgZ2V0RGF0YUZvck11bHRpUGF0aChwb3NzaWJsZVBhdGggc3RyaW5nLCBwb29sSWR4IGludCkgKHRva2VuMCwgdG9rZW4xIHN0cmluZywgZmVlIHVpbnQzMikgewoJcG9vbHMgOj0gc3RyaW5ncy5TcGxpdChwb3NzaWJsZVBhdGgsIFBPT0xfU0VQQVJBVE9SKQoKCXN3aXRjaCBwb29sSWR4IHsKCWNhc2UgMDoKCQlyZXR1cm4gZ2V0RGF0YUZvclNpbmdsZVBhdGgocG9vbHNbMF0pCgljYXNlIDE6CgkJcmV0dXJuIGdldERhdGFGb3JTaW5nbGVQYXRoKHBvb2xzWzFdKQoJY2FzZSAyOgoJCXJldHVybiBnZXREYXRhRm9yU2luZ2xlUGF0aChwb29sc1syXSkKCWRlZmF1bHQ6CgkJcmV0dXJuICIiLCAiIiwgdWludDMyKDApCgl9Cn0KCi8vIGkyNTZNaW5NYXggcmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWVzIG9mIHggYW5kIHkgaW4gbWluLW1heCBvcmRlci4KZnVuYyBpMjU2TWluTWF4KHgsIHkgKmkyNTYuSW50KSAobWluLCBtYXggKnUyNTYuVWludCkgewoJaWYgeC5MdCh5KSB8fCB4LkVxKHkpIHsKCQlyZXR1cm4geC5BYnMoKSwgeS5BYnMoKQoJfQoJcmV0dXJuIHkuQWJzKCksIHguQWJzKCkKfQoKLy8gdmFsaWRhdGVSb3V0ZVBhdGhzIHZhbGlkYXRlcyBtdWx0aXBsZSByb3V0ZSBwYXRocyB0byBlbnN1cmUgdGhleSBhbGwgc3RhcnQgd2l0aCBpbnB1dFRva2VuIGFuZCBlbmQgd2l0aCBvdXRwdXRUb2tlbi4KLy8gVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgY29tbWEtc2VwYXJhdGVkIHJvdXRlIHBhdGhzIGFuZCB2YWxpZGF0ZXMgZWFjaCBwYXRoIGluZGl2aWR1YWxseS4KLy8KLy8gVmFsaWRhdGVzOgovLyAtIEVhY2ggcm91dGUgcGF0aCBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIGlucHV0VG9rZW4KLy8gLSBFYWNoIHJvdXRlIHBhdGggZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgb3V0cHV0VG9rZW4KLy8gLSBSb3V0ZSBwYXRoIGZvcm1hdCBjb25zaXN0ZW5jeSAocHJldmVudHMgc3dhcC1kaXJlY3Rpb24gdnMgYWxwaGFiZXRpY2FsIHBvb2wgb3JkZXJpbmcgY29uZnVzaW9uKQovLwovLyBQYXJhbWV0ZXJzOgovLyAtIHJvdXRlUGF0aEFyclN0cmluZzogY29tbWEtc2VwYXJhdGVkIHJvdXRlIHBhdGhzIChlLmcuLCAiZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3Q6Z25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlM6NTAwLGduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90Omduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOjMwMDAiKQovLyAtIGlucHV0VG9rZW46IGV4cGVjdGVkIGZpcnN0IHRva2VuIGluIGFsbCByb3V0ZSBwYXRocwovLyAtIG91dHB1dFRva2VuOiBleHBlY3RlZCBsYXN0IHRva2VuIGluIGFsbCByb3V0ZSBwYXRocwovLwovLyBFeGFtcGxlczoKLy8gLSBTaW5nbGUgcm91dGU6ICJ0b2tlbkE6dG9rZW5COjUwMCIgd2l0aCBpbnB1dFRva2VuPSJ0b2tlbkEiLCBvdXRwdXRUb2tlbj0idG9rZW5CIgovLyAtIE11bHRpLXJvdXRlOiAidG9rZW5BOnRva2VuQjo1MDAsdG9rZW5BOnRva2VuQzozMDAwKlBPT0wqdG9rZW5DOnRva2VuQjo1MDAiIHdpdGggaW5wdXRUb2tlbj0idG9rZW5BIiwgb3V0cHV0VG9rZW49InRva2VuQiIKLy8KLy8gUmV0dXJucyBlcnJvciBpZiBhbnkgcm91dGUgcGF0aCB2YWxpZGF0aW9uIGZhaWxzLgpmdW5jIHZhbGlkYXRlUm91dGVQYXRocyhyb3V0ZVBhdGhBcnJTdHJpbmcsIGlucHV0VG9rZW4sIG91dHB1dFRva2VuIHN0cmluZykgZXJyb3IgewoJcm91dGVQYXRocyA6PSBzdHJpbmdzLlNwbGl0KHJvdXRlUGF0aEFyclN0cmluZywgIiwiKQoKCWZvciBfLCByb3V0ZVBhdGggOj0gcmFuZ2Ugcm91dGVQYXRocyB7CgkJaWYgZXJyIDo9IHZhbGlkYXRlUm91dGVQYXRoKHJvdXRlUGF0aCwgaW5wdXRUb2tlbiwgb3V0cHV0VG9rZW4pOyBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIGVycgoJCX0KCX0KCglyZXR1cm4gbmlsCn0KCi8vIHZhbGlkYXRlUm91dGVQYXRoIHZhbGlkYXRlcyBhIHNpbmdsZSByb3V0ZSBwYXRoIHRvIGVuc3VyZSBpdCBzdGFydHMgd2l0aCBpbnB1dFRva2VuIGFuZCBlbmRzIHdpdGggb3V0cHV0VG9rZW4uCi8vIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBib3RoIHNpbmdsZS1ob3AgYW5kIG11bHRpLWhvcCByb3V0ZSBwYXRocy4KLy8KLy8gVmFsaWRhdGVzOgovLyAtIFJvdXRlIHBhdGggc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBpbnB1dFRva2VuCi8vIC0gUm91dGUgcGF0aCBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCBvdXRwdXRUb2tlbgovLyAtIFByb3BlciB0b2tlbiBvcmRlcmluZyBpbiBzd2FwIGRpcmVjdGlvbiAobm90IGFscGhhYmV0aWNhbCBwb29sIG9yZGVyaW5nKQovLwovLyBSb3V0ZSBQYXRoIEZvcm1hdHM6Ci8vIC0gc2luZ2xlLWhvcDogInRva2VuQTp0b2tlbkI6ZmVlIiAoZGlyZWN0IHN3YXAgYmV0d2VlbiB0d28gdG9rZW5zKQovLyAtIG11bHRpLWhvcDogInRva2VuQTp0b2tlbkI6ZmVlMSpQT09MKnRva2VuQjp0b2tlbkM6ZmVlMiIgKHN3YXAgdGhyb3VnaCBpbnRlcm1lZGlhdGUgdG9rZW5zKQovLwovLyBQYXJhbWV0ZXJzOgovLyAtIHJvdXRlUGF0aDogc2luZ2xlIHJvdXRlIHBhdGggc3RyaW5nIChlLmcuLCAiZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3Q6Z25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlM6NTAwIikKLy8gLSBpbnB1dFRva2VuOiBleHBlY3RlZCBmaXJzdCB0b2tlbiBpbiB0aGUgcm91dGUgcGF0aAovLyAtIG91dHB1dFRva2VuOiBleHBlY3RlZCBsYXN0IHRva2VuIGluIHRoZSByb3V0ZSBwYXRoCi8vCi8vIEV4YW1wbGVzOgovLyAtIHNpbmdsZS1ob3A6ICJ0b2tlbkE6dG9rZW5COjUwMCIgd2l0aCBpbnB1dFRva2VuPSJ0b2tlbkEiLCBvdXRwdXRUb2tlbj0idG9rZW5CIgovLyAtIG11bHRpLWhvcDogInRva2VuQTp0b2tlbkI6MzAwMCpQT09MKnRva2VuQjp0b2tlbkM6NTAwIiB3aXRoIGlucHV0VG9rZW49InRva2VuQSIsIG91dHB1dFRva2VuPSJ0b2tlbkMiCi8vCi8vIFJldHVybnMgZXJyb3Igd2l0aCBzcGVjaWZpYyBkZXRhaWxzIGlmIHZhbGlkYXRpb24gZmFpbHMuCmZ1bmMgdmFsaWRhdGVSb3V0ZVBhdGgocm91dGVQYXRoLCBpbnB1dFRva2VuLCBvdXRwdXRUb2tlbiBzdHJpbmcpIGVycm9yIHsKCS8vIEV4dHJhY3QgZmlyc3QgYW5kIGxhc3QgdG9rZW5zIGZyb20gdGhlIHJvdXRlUGF0aAoJdmFyICgKCQlmaXJzdFRva2VuLCBsYXN0VG9rZW4gc3RyaW5nCgkJZXJyICAgICAgICAgICAgICAgICAgIGVycm9yCgkpCgoJLy8gbXVsdGktaG9wIHJvdXRlUGF0aAoJaWYgc3RyaW5ncy5Db250YWlucyhyb3V0ZVBhdGgsIFBPT0xfU0VQQVJBVE9SKSB7CgkJcG9vbHMgOj0gc3RyaW5ncy5TcGxpdChyb3V0ZVBhdGgsIFBPT0xfU0VQQVJBVE9SKQoKCQkvLyBHZXQgZmlyc3QgdG9rZW4gZnJvbSBmaXJzdCBwb29sCgkJZmlyc3RQb29sIDo9IHBvb2xzWzBdCgkJZmlyc3RUb2tlbiwgXywgXywgZXJyID0gZ2V0RGF0YUZvclNpbmdsZVBhdGhXaXRoRXJyb3IoZmlyc3RQb29sKQoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gZXJyCgkJfQoKCQkvLyBWYWxpZGF0ZSBob3AtdG8taG9wIGNvbnRpbnVpdHk6IG91dHB1dCB0b2tlbiBvZiBob3AgTiBtdXN0IGVxdWFsIGlucHV0IHRva2VuIG9mIGhvcCBOKzEKCQllcnIgPSB2YWxpZGF0ZVBvb2xQYXRoSG9wQ29udGludWl0eShwb29scykKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIGVycgoJCX0KCgkJLy8gR2V0IGxhc3QgdG9rZW4gZnJvbSBsYXN0IHBvb2wKCQlsYXN0UG9vbCA6PSBwb29sc1tsZW4ocG9vbHMpLTFdCgkJXywgbGFzdFRva2VuLCBfLCBlcnIgPSBnZXREYXRhRm9yU2luZ2xlUGF0aFdpdGhFcnJvcihsYXN0UG9vbCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIGVycgoJCX0KCX0gZWxzZSB7CgkJLy8gc2luZ2xlLWhvcCByb3V0ZVBhdGgKCQlmaXJzdFRva2VuLCBsYXN0VG9rZW4sIF8sIGVyciA9IGdldERhdGFGb3JTaW5nbGVQYXRoV2l0aEVycm9yKHJvdXRlUGF0aCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIGVycgoJCX0KCX0KCglpZiBmaXJzdFRva2VuID09ICIiIHx8IGxhc3RUb2tlbiA9PSAiIiB7CgkJcmV0dXJuIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRSb3V0ZVBhdGgsIHVmbXQuU3ByaW50ZigiZmlyc3RUb2tlbjogJXMsIGxhc3RUb2tlbjogJXMiLCBmaXJzdFRva2VuLCBsYXN0VG9rZW4pKQoJfQoKCS8vIFZhbGlkYXRlIGNvbnNpc3RlbmN5CglpZiBmaXJzdFRva2VuICE9IGlucHV0VG9rZW4gewoJCXJldHVybiBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJJbnZhbGlkUm91dGVGaXJzdFRva2VuLCB1Zm10LlNwcmludGYoImZpcnN0VG9rZW46ICVzLCBpbnB1dFRva2VuOiAlcyIsIGZpcnN0VG9rZW4sIGlucHV0VG9rZW4pKQoJfQoKCWlmIGxhc3RUb2tlbiAhPSBvdXRwdXRUb2tlbiB7CgkJcmV0dXJuIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRSb3V0ZUxhc3RUb2tlbiwgdWZtdC5TcHJpbnRmKCJsYXN0VG9rZW46ICVzLCBvdXRwdXRUb2tlbjogJXMiLCBsYXN0VG9rZW4sIG91dHB1dFRva2VuKSkKCX0KCglyZXR1cm4gbmlsCn0KCmZ1bmMgdmFsaWRhdGVQb29sUGF0aEhvcENvbnRpbnVpdHkocm91dGVQb29sUGF0aHMgW11zdHJpbmcpIGVycm9yIHsKCWlmIGxlbihyb3V0ZVBvb2xQYXRocykgPCAyIHsKCQlyZXR1cm4gbmlsCgl9CgoJXywgcHJldmlvdXNPdXQsIF8sIHBFcnIgOj0gZ2V0RGF0YUZvclNpbmdsZVBhdGhXaXRoRXJyb3Iocm91dGVQb29sUGF0aHNbMF0pCglpZiBwRXJyICE9IG5pbCB7CgkJcmV0dXJuIHBFcnIKCX0KCglmb3IgaSA6PSAxOyBpIDwgbGVuKHJvdXRlUG9vbFBhdGhzKTsgaSsrIHsKCQluZXh0SW4sIG5leHRPdXQsIF8sIG5FcnIgOj0gZ2V0RGF0YUZvclNpbmdsZVBhdGhXaXRoRXJyb3Iocm91dGVQb29sUGF0aHNbaV0pCgkJaWYgbkVyciAhPSBuaWwgewoJCQlyZXR1cm4gbkVycgoJCX0KCgkJaWYgcHJldmlvdXNPdXQgIT0gbmV4dEluIHsKCQkJcmV0dXJuIG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQkJZXJyUm91dGVIb3BEaXNjb25uZWN0ZWQsCgkJCQl1Zm10LlNwcmludGYoImhvcCAlZCBvdXRwdXQoJXMpICE9IGhvcCAlZCBpbnB1dCglcykiLCBpLTEsIHByZXZpb3VzT3V0LCBpLCBuZXh0SW4pLAoJCQkpCgkJfQoKCQlwcmV2aW91c091dCA9IG5leHRPdXQKCX0KCglyZXR1cm4gbmlsCn0KCi8vIHNwbGl0U2luZ2xlQ2hhciBzcGxpdHMgYSBzdHJpbmcgYnkgYSBzaW5nbGUgY2hhcmFjdGVyIHNlcGFyYXRvci4KLy8gVGhpcyBmdW5jdGlvbiBpcyBvcHRpbWl6ZWQgZm9yIHNwbGl0dGluZyBzdHJpbmdzIHdpdGggYSBzaW5nbGUtYnl0ZSBzZXBhcmF0b3IKLy8gYW5kIGlzIG1vcmUgbWVtb3J5IGVmZmljaWVudCB0aGFuIHN0cmluZ3MuU3BsaXQgZm9yIHRoaXMgdXNlIGNhc2UuCmZ1bmMgc3BsaXRTaW5nbGVDaGFyKHMgc3RyaW5nLCBzZXAgYnl0ZSkgW11zdHJpbmcgewoJaWYgcyA9PSAiIiB7CgkJcmV0dXJuIFtdc3RyaW5neyIifQoJfQoKCXJlc3VsdCA6PSBtYWtlKFtdc3RyaW5nLCAwLCBieXRlcy5Db3VudChbXWJ5dGUocyksIFtdYnl0ZXtzZXB9KSsxKQoJc3RhcnQgOj0gMAoJZm9yIGkgOj0gcmFuZ2UgcyB7CgkJaWYgc1tpXSA9PSBzZXAgewoJCQlyZXN1bHQgPSBhcHBlbmQocmVzdWx0LCBzW3N0YXJ0OmldKQoJCQlzdGFydCA9IGkgKyAxCgkJfQoJfQoJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgc1tzdGFydDpdKQoJcmV0dXJuIHJlc3VsdAp9CgovLyBwYXJzZVBvb2xQYXRoc0J5Um91dGVQYXRoQXJyIHBhcnNlcyByb3V0ZSBwYXRoIGFycmF5IHN0cmluZyBhbmQgcmV0dXJucyBhIHNsaWNlIG9mIHBvb2wgcGF0aHMuCi8vIFRoaXMgZnVuY3Rpb24gY29udmVydHMgcm91dGUgcGF0aHMgKHdoaWNoIG1haW50YWluIHN3YXAgZGlyZWN0aW9uKSBpbnRvIGNhbm9uaWNhbCBwb29sIHBhdGhzCi8vICh3aGljaCB1c2UgYWxwaGFiZXRpY2FsIHRva2VuIG9yZGVyaW5nKS4KLy8KLy8gVGhlIGZ1bmN0aW9uIHByb2Nlc3NlcyBjb21tYS1zZXBhcmF0ZWQgcm91dGUgcGF0aHMgYW5kIGV4dHJhY3RzIGluZGl2aWR1YWwgcG9vbCBpbmZvcm1hdGlvbgovLyBmcm9tIGVhY2ggcm91dGUsIGVuc3VyaW5nIHRva2VucyBhcmUgb3JkZXJlZCBhbHBoYWJldGljYWxseSBmb3IgY29uc2lzdGVudCBwb29sIGlkZW50aWZpY2F0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcm91dGVQYXRoQXJyOiBjb21tYS1zZXBhcmF0ZWQgcm91dGUgcGF0aHMgc3RyaW5nIGNvbnRhaW5pbmcgc2luZ2xlIG9yIG11bHRpLWhvcCByb3V0ZXMKLy8gICAgIEZvcm1hdCBleGFtcGxlczoKLy8gICAtIFNpbmdsZSByb3V0ZTogInRva2VuQTp0b2tlbkI6NTAwIgovLyAgIC0gTXVsdGlwbGUgcm91dGVzOiAidG9rZW5BOnRva2VuQjo1MDAsdG9rZW5DOnRva2VuRDozMDAwIgovLyAgIC0gTXVsdGktaG9wIHJvdXRlczogInRva2VuQTp0b2tlbkI6NTAwKlBPT0wqdG9rZW5COnRva2VuQzozMDAwIgovLwovLyBSZXR1cm5zOgovLyAtIFtdc3RyaW5nOiBzbGljZSBvZiBjYW5vbmljYWwgcG9vbCBwYXRocyB3aXRoIGFscGhhYmV0aWNhbGx5IG9yZGVyZWQgdG9rZW5zCi8vIC0gZXJyb3I6IHBhcnNpbmcgZXJyb3IgaWYgYW55IHJvdXRlIHBhdGggaXMgaW52YWxpZAovLwovLyBFeGFtcGxlOgovLwovLwlpbnB1dDogImduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90Omduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOjUwMCxnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdDpnbm8ubGFuZC9yL2dub3N3YXAvZ25zLkdOUzozMDAwIgovLwlvdXRwdXQ6IFsiZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlM6Z25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3Q6NTAwIiwgImduby5sYW5kL3IvZ25vc3dhcC9nbnMuR05TOmduby5sYW5kL3IvZ25vbGFuZC93dWdub3Qud3Vnbm90OjMwMDAiXQpmdW5jIHBhcnNlUG9vbFBhdGhzQnlSb3V0ZVBhdGhBcnIocm91dGVQYXRoQXJyIHN0cmluZykgKFtdc3RyaW5nLCBlcnJvcikgewoJcG9vbFBhdGhzIDo9IG1ha2UoW11zdHJpbmcsIDApCgoJZm9yIF8sIHJvdXRlUGF0aHMgOj0gcmFuZ2Ugc3RyaW5ncy5TcGxpdChyb3V0ZVBhdGhBcnIsICIsIikgewoJCWZvciBfLCByb3V0ZVBhdGggOj0gcmFuZ2Ugc3RyaW5ncy5TcGxpdChyb3V0ZVBhdGhzLCBQT09MX1NFUEFSQVRPUikgewoJCQl0b2tlbjBQYXRoLCB0b2tlbjFQYXRoLCBmZWUsIGVyciA6PSBnZXREYXRhRm9yU2luZ2xlUGF0aFdpdGhFcnJvcihyb3V0ZVBhdGgpCgkJCWlmIGVyciAhPSBuaWwgewoJCQkJcmV0dXJuIFtdc3RyaW5ne30sIGVycgoJCQl9CgoJCQlpZiB0b2tlbjBQYXRoID4gdG9rZW4xUGF0aCB7CgkJCQl0b2tlbjBQYXRoLCB0b2tlbjFQYXRoID0gdG9rZW4xUGF0aCwgdG9rZW4wUGF0aAoJCQl9CgoJCQlwb29sUGF0aCA6PSBwb29sLkdldFBvb2xQYXRoKHRva2VuMFBhdGgsIHRva2VuMVBhdGgsIGZlZSkKCQkJcG9vbFBhdGhzID0gYXBwZW5kKHBvb2xQYXRocywgcG9vbFBhdGgpCgkJfQoJfQoKCXJldHVybiBwb29sUGF0aHMsIG5pbAp9CgovLyBCdWlsZFNpbmdsZUhvcFJvdXRlUGF0aCBmb3JtYXRzIG9uZSByb3V0ZS1kaXJlY3Rpb24gc2luZ2xlLWhvcCBwYXRoLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5BOiBpbnB1dCB0b2tlbiBjb250cmFjdCBwYXRoCi8vICAgLSB0b2tlbkI6IG91dHB1dCB0b2tlbiBjb250cmFjdCBwYXRoCi8vICAgLSBmZWU6IHBvb2wgZmVlIHRpZXIgYXBwZW5kZWQgYXMgYSBkZWNpbWFsIHZhbHVlCi8vCi8vIFJldHVybnM6Ci8vICAgLSByb3V0ZVBhdGg6IHRva2VuQTp0b2tlbkI6ZmVlIGZvcm1hdHRlZCByb3V0ZSBzdHJpbmc7IHBhbmljcyBmb3IgZW1wdHkgb3IgaWRlbnRpY2FsIHRva2VucwpmdW5jIEJ1aWxkU2luZ2xlSG9wUm91dGVQYXRoKHRva2VuQSwgdG9rZW5CIHN0cmluZywgZmVlIHVpbnQzMikgc3RyaW5nIHsKCWlmIHRva2VuQSA9PSAiIiB8fCB0b2tlbkIgPT0gIiIgewoJCXBhbmljKCJ0b2tlbiBhZGRyZXNzZXMgY2Fubm90IGJlIGVtcHR5IikKCX0KCWlmIHRva2VuQSA9PSB0b2tlbkIgewoJCXBhbmljKCJ0b2tlbkEgYW5kIHRva2VuQiBjYW5ub3QgYmUgdGhlIHNhbWUiKQoJfQoKCXJldHVybiB0b2tlbkEgKyAiOiIgKyB0b2tlbkIgKyAiOiIgKyB1dGlscy5Gb3JtYXRVaW50KGZlZSkKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwSEwioiuKRARILMTUyODQ3dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDBJzVBMPi0jqizwud5so4H6Lp9Zc4oYF/2VGlIjXCuuESQOzAnmGcXgJiGO6HvBlJGLbpC//B4896/AkN621AZ1J6QAh7NyM04vUk+3wnvf1bgcJrGn4A4ZM+mY3BTH/2CQMaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=