Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
F44B89E1F5B3E6E656422A82F5A9082D1F2E0D5071A72658D8154F6B14AD7733
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
160,395,000
Requested gas limit
GAS USED
71,176,044
Gas consumed
FEE
481185ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1manfred47kzduec920z88wfr64ylksmdcedlf523000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CsW/AwoML3ZtLm1fYWRkcGtnErO/AwooZzFtYW5mcmVkNDdremR1ZWM5MjB6ODh3ZnI2NHlsa3NtZGNlZGxmNRL2vgMKA2FydBIWZ25vLmxhbmQvcC9tb3VsL2FydC92MBrVLwoJUkVBRE1FLm1kEscvIyBgZ25vLmxhbmQvcC9tb3VsL2FydC92MGAKCkFTQ0lJLCBBTlNJIGFuZCBwaXhlbCBhcnQgcHJpbWl0aXZlcyBmb3IgYSByZWFsbTogaG9sZCBhIHBpY3R1cmUgb25jZSwgZW1pdCBpdAphcyBwbGFpbiB0ZXh0LCBhcyBBTlNJIHRydWVjb2xvdXIsIG9yIGFzIFNWRywgYW5kIGxldCB0aGUgY2FsbGVyIHBpY2sgYXQgcmVuZGVyCnRpbWUuCgpgUmVuZGVyYCByZXR1cm5zIG9uZSBzdHJpbmcgYW5kIG5vdGhpbmcgdGVsbHMgdGhlIGNhbGxlciB3aGF0IGtpbmQgb2Ygc3RyaW5nIGl0CmlzLCBzbyBldmVyeSByZWFsbSBwaWNrcyBtYXJrZG93biBhbmQgZXZlcnkgdGVybWluYWwgcmVhZGVyIGVhdHMgdGhlIHN5bnRheCBhcwpub2lzZS4gVGhpcyBwYWNrYWdlIG93bnMgdGhlIGhhbGYgb2YgdGhhdCBwcm9ibGVtIHRoYXQgaXMgYWJvdXQgcGljdHVyZXMuCgojIyBUd28gdHlwZXMsIHNlZW4gdHdpY2UKCnwgdHlwZSB8IGlzIHwgZm9yIHwKfC0tLXwtLS18LS0tfAp8IGBQaXhgIHwgYSB3aWR0aCwgYSBoZWlnaHQsIG9uZSBwYWxldHRlIGluZGV4IHBlciBwaXhlbCwgYSBgUGFsZXR0ZWAgb2YgaGV4IGNvbG91cnMgfCB3aGF0IGEgcGl4ZWwtYXJ0IE5GVCBhY3R1YWxseSBpcyB8CnwgYENhbnZhc2AgfCBhIGdyaWQgb2YgYENlbGxgLCBlYWNoIGEgcnVuZSBwbHVzIGEgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvdXIgfCB3aGF0IGEgdGVybWluYWwgYWN0dWFsbHkgaXMgfAoKYFBpeC5DYW52YXMobW9kZSlgIGdvZXMgZnJvbSBvbmUgdG8gdGhlIG90aGVyLiBgQ2FudmFzLlRleHQoKWAsIGBDYW52YXMuQU5TSSgpYAphbmQgYENhbnZhcy5TVkcoKWAgdGFrZSBpdCB0aGUgcmVzdCBvZiB0aGUgd2F5IG91dCwgYW5kIGBQaXguU1ZHKClgIHNraXBzIHRoZQpncmlkIGVudGlyZWx5IGZvciBhcnQgdGhhdCB3YXMgbmV2ZXIgY2hhcmFjdGVyLXNoYXBlZC4KCmBgYGdubwpwaXggOj0gJmFydC5QaXh7VzogOCwgSDogNiwgSWR4OiBpZHgsIFBhbDogYXJ0LlBhbGV0dGV7IiIsICIjZDY0NTUwIiwgIiNmN2E4YjAifX0KCnBsYWluIDo9IHBpeC5DYW52YXMoYXJ0LkdseXBocykuVGV4dCgpICAgICAgICAvLyBmb3IgYSBjb2RlIGZlbmNlLCBvciBhIHBpcGUKY29sb3VyIDo9IHBpeC5DYW52YXMoYXJ0LkhhbGZCbG9jaykuQU5TSSgpICAgIC8vIGZvciBhIHRlcm1pbmFsCndlYiA6PSBwaXguU1ZHKDgpLlJlbmRlcigiYSBoZWFydCIpICAgICAgICAgICAvLyBtYXJrZG93biBpbWFnZSwgZGF0YSBVUkksIG5vIGhvc3QKYGBgCgojIyBVc2UgYEdseXBoc2AgZm9yIHNwcml0ZXMsIGBSYW1wYCBmb3IgcGhvdG9zCgpUaGUgb2J2aW91cyBjb252ZXJzaW9uLCBhIGx1bWluYW5jZSByYW1wLCBwcm9kdWNlcyBtdXNoIGZvciBwaXhlbCBhcnQuIFR3bwpwYWxldHRlIGVudHJpZXMgYSBzcHJpdGUgbWlnaHQgZ2VudWluZWx5IGNhcnJ5LCBzYW5kIGAjZThkY2M4YCBhbmQgYm9uZQpgI2Q5ZDlkOWAsIHNpdCBhdCBsdW1pbmFuY2UgMjIxIGFuZCAyMTcgb3V0IG9mIDI1NS4gQSB0ZW4tc3RlcCByYW1wIGRyb3BzIGJvdGgKaW4gYnVja2V0IDggYW5kIHRoZSBzaGFwZSBiZXR3ZWVuIHRoZW0gZGlzYXBwZWFycy4KCkluZGV4ZWQgYXJ0IGFscmVhZHkgY2FycmllcyBpdHMgb3duIHNlZ21lbnRhdGlvbiwgaW4gdGhlIHBhbGV0dGUuIFNvIHRoZSBydWxlCmZvciBhIHNwcml0ZSBpcyAqKm9uZSBnbHlwaCBwZXIgcGFsZXR0ZSBpbmRleCoqLCBub3Qgb25lIGdseXBoIHBlciBicmlnaHRuZXNzLgpgUmFtcGAgaXMga2VwdCBiZWNhdXNlIGl0IGlzIHJpZ2h0IGZvciBhIHBob3RvZ3JhcGgsIHdoZXJlIHRoZXJlIGlzIG5vCm1lYW5pbmdmdWwgcGFsZXR0ZSB0byBrZXkgb24uCgpNZWFzdXJlZCBvbiByZWFsIGFydCByYXRoZXIgdGhhbiBvbiBhIGZpeHR1cmUgcGlja2VkIHRvIHNob3cgaXQuIFNldHRsZXIgIzI1Cihgci9nMTdraHHigKYvc2V0dGxlcnMvbmZ0OnRva2VuLzI1YCwgcmVhZCBmcm9tIG1haW5uZXQgMjAyNi0wOS0yOSwgMzJ4MzIsIENDMCkKY2FycmllcyAqKjIwIHBhbGV0dGUgZW50cmllcyoqOgoKfCBrZXllZCBvbiB8IGNvbG91cnMgdGhhdCBzdXJ2aXZlIGludG8gdGhlIHRleHQgfAp8LS0tfC0tLXwKfCBwYWxldHRlIGluZGV4IChgR2x5cGhzYCkgfCAyMCBvZiAyMCB8CnwgbHVtaW5hbmNlIChgUmFtcGAsIHRlbiBzdGVwcykgfCA5IG9mIDIwIHwKCkVsZXZlbiBvZiB0aGUgYXJ0aXN0J3MgdHdlbnR5IGNvbG91cnMgc3RvcCBleGlzdGluZywgYW5kIHRoZSBzaGFwZXMgYmV0d2VlbiB0aGVtCmdvIHdpdGggdGhlbS4KClRoZSBjb2xsaXNpb25zIGFyZSBub3QgYmV0d2VlbiBuZWFyLWlkZW50aWNhbCBzaGFkZXMgZWl0aGVyLCB3aGljaCBpcyB0aGUgcGFydAp0aGF0IGlzIGVhc3kgdG8gbWlzczogdGhlIG9yYW5nZSBoYXQgKGAjZjA4YTJhYCwgbHVtaW5hbmNlIDE1MikgYW5kIHRoZSBza3ktYmx1ZQp0dW5pYyAoYCMzZjhmZDFgLCBsdW1pbmFuY2UgMTMwKSBmYWxsIGluIHRoZSBzYW1lIGJ1Y2tldCBhbmQgY29tZSBvdXQgYXMgdGhlCnNhbWUgY2hhcmFjdGVyLiBMdW1pbmFuY2UgY2Fubm90IHRlbGwgYSBodWUgZnJvbSBhIGh1ZS4KCmBzZXR0bGVyX3Rlc3QuZ25vYCBwaW5zIGJvdGgsIGFuZCBgVGVzdFJhbXBDb2xsYXBzZXNXaGF0R2x5cGhzS2VlcHNBcGFydGAgcGlucwp0aGUgbWVjaGFuaXNtIG9uIGEgdHdvLWNvbG91ciBjYXNlIHNtYWxsIGVub3VnaCB0byByZWFkLgoKIyMgVGhlIGZpdmUgbW9kZXMKCnwgbW9kZSB8IHBhY2tzIHwgY29sb3VyIHwgZ29vZCBmb3IgfAp8LS0tfC0tLXwtLS18LS0tfAp8IGBHbHlwaHNgIHwgMSBwaXhlbCB0byAxIGNlbGwgKDIgYnkgZGVmYXVsdCwgZm9yIGFzcGVjdCkgfCBvcHRpb25hbCB8IHNwcml0ZXMsIGFuZCBhbnl0aGluZyB0aGF0IGhhcyB0byBzdXJ2aXZlIHdpdGhvdXQgY29sb3VyIHwKfCBgUmFtcGAgfCBzYW1lIHwgb3B0aW9uYWwgfCBwaG90b2dyYXBocyB8CnwgYEhhbGZCbG9ja2AgfCAyIHZlcnRpY2FsIHBpeGVscyB0byAxIGNlbGwsIHdpdGggYOKWgGAgfCBmdWxsIHwgdGhlIGJlc3QtbG9va2luZyB0ZXJtaW5hbCBvdXRwdXQgfAp8IGBRdWFkcmFudGAgfCAyeDIgdG8gMSBjZWxsIHwgMiBjb2xvdXJzIHBlciBjZWxsIHwgZGVuc2l0eSwgYXQgdGhlIGNvc3Qgb2YgdHdvIGNvbG91cnMgcGVyIGJsb2NrIHwKfCBgQnJhaWxsZWAgfCAyeDQgdG8gMSBjZWxsIHwgbm9uZSB8IHRoZSBkZW5zZXN0IG1vZGU7IGEgcGl4ZWwgaXMgb24gaWYgaXRzIGluZGV4IGlzIG5vdCAwIHwKCkluZGV4IDAgaXMgdGhlIGJhY2tncm91bmQgYnkgY29udmVudGlvbjogYEJyYWlsbGVgIGtleXMgb24gaXQgZGlyZWN0bHksIHRoZQpkZWZhdWx0IGdseXBoIHNldCBnaXZlcyBpdCBhIHNwYWNlLCBhbmQgYSB0aWUgaW4gYFF1YWRyYW50YCdzIHR3by1jb2xvdXIgc3BsaXQKZ29lcyB0byB0aGUgbG93ZXIgaW5kZXggc28gdGhhdCBpbmsgZG9lcyBub3QgZW5kIHVwIGluIHRoZSBiYWNrZ3JvdW5kLgoKIyMgQU5TSSBpcyB0ZXJtaW5hbC1vbmx5LCBieSBjb25zdHJ1Y3Rpb24KCmBDYW52YXMuQU5TSSgpYCBlbWl0cyBTR1IgZXNjYXBlcywgd2hpY2ggY2Fubm90IHJlYWNoIGdub3dlYjogYHAvbnQvbWFya2Rvd24vc2FuaXRpemVgCnN0cmlwcyBjb250cm9sIGJ5dGVzLCBhbmQgcmF3IEVTQyBpbiBhIGNvZGUgZmVuY2UgaXMgZ2FyYmFnZSBpbiBIVE1MIGFueXdheS4KClRoYXQgaXMgbm90IGEgZ2FwIHRvIGNsb3NlIGxhdGVyLiBJdCBpcyB0aGUgcmVhc29uIHRoZSB0YXJnZXQgaXMgYSBwYXJhbWV0ZXIKcmF0aGVyIHRoYW4gYSBkZWNpc2lvbi4gV2hlbiBjb2xvdXIgaGFzIHRvIHN1cnZpdmUgdGhlIHdlYiwgYENhbnZhcy5TVkcoKWAKY2FycmllcyB0aGUgc2FtZSB0d28gY29sb3VycyBwZXIgY2VsbCB0aHJvdWdoIGEgbWVkaXVtIHRoZSB3ZWIgY2FuIHNob3cuCgojIyBOb3RlcwoKLSBDb2xvdXJzIGFyZSBwYWNrZWQgYDB4UlJHR0JCYCBpbnRzLCBvciBgRGVmYXVsdGAgKC0xKSBtZWFuaW5nICJ3aGF0ZXZlciB0aGUKICBjb25zdW1lcidzIGRlZmF1bHQgaXMiLiBgUGFyc2VIZXhgIHJlYWRzIGAjcnJnZ2JiYCBhbmQgYCNyZ2JgOyBgI2FiY2AgZXhwYW5kcwogIGJ5IGR1cGxpY2F0aW9uIHRvIGAjYWFiYmNjYCwgbm90IGJ5IHplcm8tcGFkZGluZy4KLSBFdmVyeSBoZWxwZXIgKipjbGlwcyoqIHJhdGhlciB0aGFuIHBhbmlja2luZy4gQXJ0IGlzIGRyYXduIGJ5IGFyaXRobWV0aWMsIGFuZAogIGEgbGluZSBvbmUgY2VsbCBvZmYgdGhlIGVkZ2UgaXMgbm90IHdvcnRoIGFib3J0aW5nIGEgYFJlbmRlcmAgb3Zlci4KLSBgQ2FudmFzLlRleHQoKWAgdHJpbXMgdHJhaWxpbmcgc3BhY2VzOyBgQ2FudmFzLkFOU0koKWAgZG9lcyBub3QsIGJlY2F1c2UgYQogIHRyYWlsaW5nIGNlbGwgY2FuIGNhcnJ5IGEgYmFja2dyb3VuZCBjb2xvdXIgYW5kIHRyaW1taW5nIGl0IHdvdWxkIHB1bmNoIGEgaG9sZQogIGluIHRoZSBwaWN0dXJlLgotIGBQaXguU1ZHKClgIGVtaXRzICoqb25lIGA8cGF0aD5gIHBlciBjb2xvdXIqKiwgcnVuLWxlbmd0aCBlbmNvZGVkLCBpbiBwaXhlbAogIGNvb3JkaW5hdGVzIHdpdGggdGhlIHNjYWxlIG9uIHRoZSB2aWV3Qm94LiBPbiBTZXR0bGVyICMyNSB0aGF0IGlzIDQsNTMyIGJ5dGVzCiAgYWdhaW5zdCAyMCw2MjUgZm9yIG9uZSBgPHJlY3Q+YCBwZXIgcnVuLCA0LjV4LCBhbmQgc2NhbGluZyB1cCBjb3N0cyAyIGJ5dGVzCiAgdG90YWwuIEEgcmVhbG0gcGF5cyBmb3IgdGhvc2UgYnl0ZXMgaW4gZ2FzIGFuZCB0aGUgcmVhZGVyIHBheXMgaW4gcGFnZSB3ZWlnaHQuCi0gYENhbnZhcy5TVkcoKWAgZW1pdHMgb25lIGA8dGV4dD5gIHBlciBub24tYmxhbmsgY2VsbCByYXRoZXIgdGhhbiBvbmUgcGVyIHJ1bjoKICBhIHJ1biB3b3VsZCBoYXZlIHRvIGFzc3VtZSB0aGUgZm9udCdzIGFkdmFuY2Ugd2lkdGgsIGFuZCBhIHJlbmRlcmVyIHRoYXQKICBkaXNhZ3JlZWQgd291bGQgc2hlYXIgdGhlIHBpY3R1cmUuIERlbnNlIGFydCBiZWxvbmdzIGluIGBQaXguU1ZHKClgLCB3aGljaCBoYXMKICBubyBmb250IHRvIGdldCB3cm9uZy4KLSBUZXh0IGhhbmRlZCB0byBTVkcgaXMgWE1MLWVzY2FwZWQgaGVyZSwgYmVjYXVzZSBgcC9tb3VsL3N2Z2AncyBgVGV4dGAKICBpbnRlcnBvbGF0ZXMgaXRzIGNvbnRlbnQgaW50byB0aGUgZG9jdW1lbnQgdW5lc2NhcGVkLgoKIyMgTm90IGluIHRoaXMgcGFja2FnZQoKVGhlIGRvY3VtZW50IG1vZGVsLiBUdXJuaW5nIGEgd2hvbGUgYFJlbmRlcmAgaW50byBtYXJrZG93biAqb3IqIHBsYWluIHRleHQKKGxpbmtzIGFzIGZvb3Rub3RlcywgdGFibGVzIHdpdGggcGFkZGVkIGNvbHVtbnMsIGhlYWRpbmdzIHVuZGVybGluZWQgaW5zdGVhZCBvZgpgI2AtcHJlZml4ZWQpIGlzIGEgc2VwYXJhdGUgY29uY2VybiBhbmQgYSBzZXBhcmF0ZSBwYWNrYWdlLiBUaGlzIG9uZSBvbmx5IGtub3dzCmFib3V0IHBpY3R1cmVzLgoKPCEtLSBCRUdJTiBHTk9DT05UUkFDVFMgRk9PVEVSIChnZW5lcmF0ZWQgYnkgYG1ha2UgcmVhZG1lc2A7IGRvIG5vdCBlZGl0IGJlbG93KSAtLT4KCi0tLQoKUGFydCBvZiAqKlttb3VsL2duby1jb250cmFjdHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3VsL2duby1jb250cmFjdHMpKiog4oCUIG1vdWwncyB2ZXJzaW9uZWQgZ25vLmxhbmQgY29udHJhY3RzLiBTZWUgdGhlIHJlcG9zaXRvcnkgZm9yIHRoZSBmdWxsIGNhdGFsb2csIGJ1aWxkL3Rlc3QgdG9vbGluZywgYW5kIHVzYWdlLgoKKipEZXBlbmRlbmN5IGdyYXBoOioqCgohW2duby5sYW5kL3AvbW91bC9hcnQvdjAgZGVwZW5kZW5jeSBncmFwaF0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL21vdWwvZ25vLWNvbnRyYWN0cy9tYWluL19hc3NldHMvZ25vLmxhbmQvcC9tb3VsL2FydC92MC9kZXBzLnBuZykKCj4g4pqg77iPICoqRGlzY2xhaW1lcjoqKiBwcm92aWRlZCBhcy1pcywgd2l0aG91dCB3YXJyYW50eTsgbm90IHNlY3VyaXR5LWF1ZGl0ZWQuIEZ1bGwgZGlzY2xhaW1lcjogW0RJU0NMQUlNRVJdKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3VsL2duby1jb250cmFjdHMvYmxvYi9tYWluL0RJU0NMQUlNRVIubWQpLgoKPCEtLSBFTkQgR05PQ09OVFJBQ1RTIEZPT1RFUiAtLT4KGvcRCgdib3guZ25vEusRcGFja2FnZSBhcnQKCi8vIEJveFN0eWxlIGlzIHRoZSBzaXggcnVuZXMgYSByZWN0YW5ndWxhciBib3JkZXIgbmVlZHMuCnR5cGUgQm94U3R5bGUgc3RydWN0IHsKCVRMLCBUUiwgQkwsIEJSIHJ1bmUKCUgsIFYgICAgICAgICAgIHJ1bmUKfQoKLy8gVGhlIGJvcmRlciBzdHlsZXMgd29ydGggaGF2aW5nLiBBU0NJSSBpcyB0aGUgb25lIHRoYXQgc3Vydml2ZXMgYSBjb25zdW1lcgovLyB3aXRoIG5vIFVuaWNvZGU6IGV2ZXJ5dGhpbmcgZWxzZSBoZXJlIGlzIGJveC1kcmF3aW5nLCB3aGljaCBpcyBmaW5lIGluIGEKLy8gdGVybWluYWwgYW5kIGluIGEgbWFya2Rvd24gY29kZSBmZW5jZSBidXQgbm90IGluLCBzYXksIGEgcGxhaW4tQVNDSUkgbG9nLgp2YXIgKAoJTGlnaHQgID0gQm94U3R5bGV7VEw6ICfilIwnLCBUUjogJ+KUkCcsIEJMOiAn4pSUJywgQlI6ICfilJgnLCBIOiAn4pSAJywgVjogJ+KUgid9CglIZWF2eSAgPSBCb3hTdHlsZXtUTDogJ+KUjycsIFRSOiAn4pSTJywgQkw6ICfilJcnLCBCUjogJ+KUmycsIEg6ICfilIEnLCBWOiAn4pSDJ30KCURvdWJsZSA9IEJveFN0eWxle1RMOiAn4pWUJywgVFI6ICfilZcnLCBCTDogJ+KVmicsIEJSOiAn4pWdJywgSDogJ+KVkCcsIFY6ICfilZEnfQoJUm91bmQgID0gQm94U3R5bGV7VEw6ICfila0nLCBUUjogJ+KVricsIEJMOiAn4pWwJywgQlI6ICfila8nLCBIOiAn4pSAJywgVjogJ+KUgid9CglBU0NJSSAgPSBCb3hTdHlsZXtUTDogJysnLCBUUjogJysnLCBCTDogJysnLCBCUjogJysnLCBIOiAnLScsIFY6ICd8J30KKQoKLy8gQm94IGRyYXdzIGEgdyBieSBoIGJvcmRlciBpbiB0aGUgcGVuJ3MgY29sb3VycywgbGVhdmluZyB0aGUgaW50ZXJpb3IKLy8gdW50b3VjaGVkLiB3IG9yIGggdW5kZXIgMiBkcmF3cyBub3RoaW5nOiB0aGVyZSBpcyBubyBib3JkZXIgd2l0aCBubyBpbnNpZGUuCmZ1bmMgKGMgKkNhbnZhcykgQm94KHgsIHksIHcsIGggaW50LCBzIEJveFN0eWxlKSB7CglpZiB3IDwgMiB8fCBoIDwgMiB7CgkJcmV0dXJuCgl9CgljLkhMaW5lKHgrMSwgeSwgdy0yLCBzLkgpCgljLkhMaW5lKHgrMSwgeStoLTEsIHctMiwgcy5IKQoJYy5WTGluZSh4LCB5KzEsIGgtMiwgcy5WKQoJYy5WTGluZSh4K3ctMSwgeSsxLCBoLTIsIHMuVikKCWMuUHV0KHgsIHksIHMuVEwpCgljLlB1dCh4K3ctMSwgeSwgcy5UUikKCWMuUHV0KHgsIHkraC0xLCBzLkJMKQoJYy5QdXQoeCt3LTEsIHkraC0xLCBzLkJSKQp9CgovLyBGcmFtZSByZXR1cm5zIGEgTkVXIGNhbnZhcyB0d28gY2VsbHMgd2lkZXIgYW5kIHRhbGxlciB0aGFuIGMsIHdpdGggYyBibGl0dGVkCi8vIGludG8gdGhlIG1pZGRsZSBhbmQgYSBib3JkZXIgYXJvdW5kIGl0LiBBIG5vbi1lbXB0eSB0aXRsZSBpcyB3cml0dGVuIGludG8gdGhlCi8vIHRvcCBlZGdlIHN0YXJ0aW5nIHR3byBjZWxscyBpbiwgYW5kIGlzIHRydW5jYXRlZCByYXRoZXIgdGhhbiBhbGxvd2VkIHRvIHJ1bgovLyBvdmVyIHRoZSBjb3JuZXIuCi8vCi8vIEl0IHJldHVybnMgYSBuZXcgY2FudmFzIHJhdGhlciB0aGFuIGdyb3dpbmcgdGhpcyBvbmUgYmVjYXVzZSBhIENhbnZhcyBoYXMgYQovLyBmaXhlZCBzaXplIGJ5IGRlc2lnbjogZXZlcnkgaW5kZXggaW4gdGhpcyBwYWNrYWdlIGlzIGNvbXB1dGVkIGZyb20gVywgYW5kIGEKLy8gcmVzaXplIGluIHBsYWNlIHdvdWxkIGludmFsaWRhdGUgYW55IG9mZnNldCBhIGNhbGxlciB3YXMgaG9sZGluZy4KZnVuYyAoYyAqQ2FudmFzKSBGcmFtZSh0aXRsZSBzdHJpbmcsIHMgQm94U3R5bGUpICpDYW52YXMgewoJb3V0IDo9IE5ld0NhbnZhcyhjLlcrMiwgYy5IKzIpCglvdXQuRkcsIG91dC5CRyA9IGMuRkcsIGMuQkcKCW91dC5Cb3goMCwgMCwgb3V0LlcsIG91dC5ILCBzKQoJb3V0LkJsaXQoMSwgMSwgYykKCWlmIHRpdGxlICE9ICIiIHsKCQkvLyBUaGUgdG9wIGVkZ2UgaGFzIFctMiB1c2FibGUgY2VsbHMgYW5kIHRoZSB0aXRsZSBzdGFydHMgYXQgeD0yLCBzbyBpdAoJCS8vIGdldHMgVy00IG9mIHRoZW0uIEFueXRoaW5nIGxlc3MgdGhhbiBvbmUgY2VsbCBtZWFucyBubyByb29tIGF0IGFsbC4KCQlyb29tIDo9IG91dC5XIC0gNAoJCWlmIHJvb20gPiAwIHsKCQkJb3V0LldyaXRlKDIsIDAsIHRydW5jUnVuZXModGl0bGUsIHJvb20pKQoJCX0KCX0KCXJldHVybiBvdXQKfQoKZnVuYyB0cnVuY1J1bmVzKHMgc3RyaW5nLCBuIGludCkgc3RyaW5nIHsKCWkgOj0gMAoJZm9yIGlkeCA6PSByYW5nZSBzIHsKCQlpZiBpID09IG4gewoJCQlyZXR1cm4gc1s6aWR4XQoJCX0KCQlpKysKCX0KCXJldHVybiBzCn0KGugtCgpjYW52YXMuZ25vEtktcGFja2FnZSBhcnQKCmltcG9ydCAic3RyaW5ncyIKCi8vIENlbGwgaXMgb25lIGNoYXJhY3RlciBjZWxsOiBhIHJ1bmUgYW5kIGl0cyB0d28gY29sb3Vycy4gRkcgYW5kIEJHIGFyZSBwYWNrZWQKLy8gMHhSUkdHQkIgdmFsdWVzLCBvciBbRGVmYXVsdF0uCnR5cGUgQ2VsbCBzdHJ1Y3QgewoJUiAgICAgIHJ1bmUKCUZHLCBCRyBpbnQKfQoKLy8gQ2FudmFzIGlzIGEgZml4ZWQgZ3JpZCBvZiBjZWxscywgYWRkcmVzc2VkICh4LCB5KSBmcm9tIHRoZSB0b3AgbGVmdC4KLy8KLy8gRkcgYW5kIEJHIGFyZSB0aGUgcGVuOiB0aGUgY29sb3VycyB0aGUgZHJhd2luZyBoZWxwZXJzIChbV3JpdGVdLCBbSExpbmVdLAovLyBbQm94XSBhbmQgdGhlIHJlc3QpIGFwcGx5IHRvIGV2ZXJ5IGNlbGwgdGhleSB0b3VjaC4gVGhleSBzdGFydCBhdCBbRGVmYXVsdF0uCi8vIFNldCB0aGVtIHdpdGggW0NhbnZhcy5QZW5dOyBhIGNhbGxlciB0aGF0IG9ubHkgd2FudHMgc2hhcGVzIGNhbiBpZ25vcmUgdGhlbQovLyBlbnRpcmVseS4KdHlwZSBDYW52YXMgc3RydWN0IHsKCVcsIEggICBpbnQKCUNlbGxzICBbXUNlbGwKCUZHLCBCRyBpbnQKfQoKLy8gQmxhbmsgaXMgdGhlIGNlbGwgYSBuZXcgY2FudmFzIGlzIGZpbGxlZCB3aXRoLgp2YXIgQmxhbmsgPSBDZWxse1I6ICcgJywgRkc6IERlZmF1bHQsIEJHOiBEZWZhdWx0fQoKLy8gTmV3Q2FudmFzIHJldHVybnMgYSB3IGJ5IGggY2FudmFzIG9mIGJsYW5rIGNlbGxzLiBOZWdhdGl2ZSBkaW1lbnNpb25zIGFyZQovLyB0cmVhdGVkIGFzIHplcm8sIHNvIGEgY2FudmFzIGJ1aWx0IGZyb20gYXJpdGhtZXRpYyB0aGF0IHVuZGVyZmxvd2VkIGlzIGVtcHR5Ci8vIHJhdGhlciB0aGFuIGEgcGFuaWMgaGFsZndheSB0aHJvdWdoIGEgUmVuZGVyLgpmdW5jIE5ld0NhbnZhcyh3LCBoIGludCkgKkNhbnZhcyB7CglpZiB3IDwgMCB7CgkJdyA9IDAKCX0KCWlmIGggPCAwIHsKCQloID0gMAoJfQoJY2VsbHMgOj0gbWFrZShbXUNlbGwsIHcqaCkKCWZvciBpIDo9IDA7IGkgPCBsZW4oY2VsbHMpOyBpKysgewoJCWNlbGxzW2ldID0gQmxhbmsKCX0KCXJldHVybiAmQ2FudmFze1c6IHcsIEg6IGgsIENlbGxzOiBjZWxscywgRkc6IERlZmF1bHQsIEJHOiBEZWZhdWx0fQp9CgovLyBQZW4gc2V0cyB0aGUgY29sb3VycyB0aGUgZHJhd2luZyBoZWxwZXJzIHdpbGwgYXBwbHksIGFuZCByZXR1cm5zIHRoZSBjYW52YXMKLy8gc28gY2FsbHMgY2FuIGJlIGNoYWluZWQuCmZ1bmMgKGMgKkNhbnZhcykgUGVuKGZnLCBiZyBpbnQpICpDYW52YXMgewoJYy5GRywgYy5CRyA9IGZnLCBiZwoJcmV0dXJuIGMKfQoKLy8gSW4gcmVwb3J0cyB3aGV0aGVyICh4LCB5KSBpcyBvbiB0aGUgY2FudmFzLiBFdmVyeSBoZWxwZXIgaW4gdGhpcyBwYWNrYWdlCi8vIGNsaXBzIHNpbGVudGx5IHJhdGhlciB0aGFuIHBhbmlja2luZzogYXJ0IGlzIGRyYXduIGJ5IGFyaXRobWV0aWMgYW5kIGEKLy8gb25lLW9mZi10aGUtZWRnZSBsaW5lIGlzIG5vdCB3b3J0aCBhYm9ydGluZyBhIFJlbmRlciBvdmVyLgpmdW5jIChjICpDYW52YXMpIEluKHgsIHkgaW50KSBib29sIHsKCXJldHVybiB4ID49IDAgJiYgeSA+PSAwICYmIHggPCBjLlcgJiYgeSA8IGMuSAp9CgovLyBBdCByZXR1cm5zIHRoZSBjZWxsIGF0ICh4LCB5KSwgb3IgW0JsYW5rXSBpZiB0aGF0IGlzIG9mZiB0aGUgY2FudmFzLgpmdW5jIChjICpDYW52YXMpIEF0KHgsIHkgaW50KSBDZWxsIHsKCWlmICFjLkluKHgsIHkpIHsKCQlyZXR1cm4gQmxhbmsKCX0KCXJldHVybiBjLkNlbGxzW3kqYy5XK3hdCn0KCi8vIFNldCB3cml0ZXMgYSB3aG9sZSBjZWxsLCBjb2xvdXJzIGluY2x1ZGVkLCBpZ25vcmluZyB0aGUgcGVuLgpmdW5jIChjICpDYW52YXMpIFNldCh4LCB5IGludCwgY2VsbCBDZWxsKSB7CglpZiAhYy5Jbih4LCB5KSB7CgkJcmV0dXJuCgl9CgljLkNlbGxzW3kqYy5XK3hdID0gY2VsbAp9CgovLyBQdXQgd3JpdGVzIG9uZSBydW5lIGluIHRoZSBwZW4ncyBjb2xvdXJzLgpmdW5jIChjICpDYW52YXMpIFB1dCh4LCB5IGludCwgciBydW5lKSB7CgljLlNldCh4LCB5LCBDZWxse1I6IHIsIEZHOiBjLkZHLCBCRzogYy5CR30pCn0KCi8vIEZpbGwgc2V0cyBldmVyeSBjZWxsIG9uIHRoZSBjYW52YXMgdG8gY2VsbC4KZnVuYyAoYyAqQ2FudmFzKSBGaWxsKGNlbGwgQ2VsbCkgewoJZm9yIGkgOj0gMDsgaSA8IGxlbihjLkNlbGxzKTsgaSsrIHsKCQljLkNlbGxzW2ldID0gY2VsbAoJfQp9CgovLyBXcml0ZSBkcmF3cyBzIGxlZnQgdG8gcmlnaHQgZnJvbSAoeCwgeSkgaW4gdGhlIHBlbidzIGNvbG91cnMuIEl0IGRvZXMgbm90Ci8vIHdyYXA6IGFueXRoaW5nIHBhc3QgdGhlIHJpZ2h0IGVkZ2UgaXMgY2xpcHBlZC4gQSAnXG4nIG1vdmVzIHRvIHRoZSBuZXh0IHJvdywKLy8gYmFjayBhdCB0aGUgc3RhcnRpbmcgY29sdW1uLCB3aGljaCBpcyB3aGF0IG1ha2VzIGEgbXVsdGktbGluZSBsaXRlcmFsIGJsaXQKLy8gdGhlIHdheSBpdCByZWFkcyBpbiBzb3VyY2UuCmZ1bmMgKGMgKkNhbnZhcykgV3JpdGUoeCwgeSBpbnQsIHMgc3RyaW5nKSB7CgljeCwgY3kgOj0geCwgeQoJZm9yIF8sIHIgOj0gcmFuZ2UgcyB7CgkJaWYgciA9PSAnXG4nIHsKCQkJY3gsIGN5ID0geCwgY3krMQoJCQljb250aW51ZQoJCX0KCQljLlB1dChjeCwgY3ksIHIpCgkJY3grKwoJfQp9CgovLyBITGluZSBkcmF3cyBuIHJ1bmVzIHJpZ2h0d2FyZHMgZnJvbSAoeCwgeSkuCmZ1bmMgKGMgKkNhbnZhcykgSExpbmUoeCwgeSwgbiBpbnQsIHIgcnVuZSkgewoJZm9yIGkgOj0gMDsgaSA8IG47IGkrKyB7CgkJYy5QdXQoeCtpLCB5LCByKQoJfQp9CgovLyBWTGluZSBkcmF3cyBuIHJ1bmVzIGRvd253YXJkcyBmcm9tICh4LCB5KS4KZnVuYyAoYyAqQ2FudmFzKSBWTGluZSh4LCB5LCBuIGludCwgciBydW5lKSB7Cglmb3IgaSA6PSAwOyBpIDwgbjsgaSsrIHsKCQljLlB1dCh4LCB5K2ksIHIpCgl9Cn0KCi8vIFJlY3QgZmlsbHMgYSB3IGJ5IGggYXJlYSB3aXRoIHIuCmZ1bmMgKGMgKkNhbnZhcykgUmVjdCh4LCB5LCB3LCBoIGludCwgciBydW5lKSB7Cglmb3IgaiA6PSAwOyBqIDwgaDsgaisrIHsKCQljLkhMaW5lKHgsIHkraiwgdywgcikKCX0KfQoKLy8gQmxpdCBjb3BpZXMgc3JjIG9udG8gYyB3aXRoIHNyYydzIHRvcCBsZWZ0IGF0ICh4LCB5KSwgY29sb3VycyBhbmQgYWxsLgovLyBDZWxscyBsYW5kaW5nIG9mZiB0aGUgZWRnZSBhcmUgZHJvcHBlZC4KZnVuYyAoYyAqQ2FudmFzKSBCbGl0KHgsIHkgaW50LCBzcmMgKkNhbnZhcykgewoJaWYgc3JjID09IG5pbCB7CgkJcmV0dXJuCgl9Cglmb3IgaiA6PSAwOyBqIDwgc3JjLkg7IGorKyB7CgkJZm9yIGkgOj0gMDsgaSA8IHNyYy5XOyBpKysgewoJCQljLlNldCh4K2ksIHkraiwgc3JjLkNlbGxzW2oqc3JjLlcraV0pCgkJfQoJfQp9CgovLyBUZXh0IGVtaXRzIHRoZSBjYW52YXMgYXMgcGxhaW4gdGV4dDogcnVuZXMgb25seSwgb25lIGxpbmUgcGVyIHJvdywgdHJhaWxpbmcKLy8gc3BhY2VzIHRyaW1tZWQuIFRoaXMgaXMgdGhlIGZvcm0gdGhhdCBiZWxvbmdzIGluc2lkZSBhIHRyaXBsZS1iYWNrdGljayBmZW5jZSwKLy8gYW5kIHRoZSBmb3JtIGEgY2FsbGVyIGNhbiBwaXBlLgovLwovLyBDb2xvdXJzIGFyZSBkcm9wcGVkLCB3aGljaCBpcyB0aGUgd2hvbGUgcG9pbnQ6IGEgY29uc3VtZXIgYXNraW5nIGZvciB0ZXh0IGhhcwovLyBzYWlkIGl0IGNhbm5vdCBzaG93IHRoZW0uCmZ1bmMgKGMgQ2FudmFzKSBUZXh0KCkgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJZm9yIHkgOj0gMDsgeSA8IGMuSDsgeSsrIHsKCQl2YXIgbGluZSBzdHJpbmdzLkJ1aWxkZXIKCQlmb3IgeCA6PSAwOyB4IDwgYy5XOyB4KysgewoJCQlsaW5lLldyaXRlUnVuZShjLkNlbGxzW3kqYy5XK3hdLlIpCgkJfQoJCWIuV3JpdGVTdHJpbmcoc3RyaW5ncy5UcmltUmlnaHQobGluZS5TdHJpbmcoKSwgIiAiKSkKCQlpZiB5IDwgYy5ILTEgewoJCQliLldyaXRlU3RyaW5nKCJcbiIpCgkJfQoJfQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKLy8gU3RyaW5nIGlzIFtDYW52YXMuVGV4dF0sIHNvIGEgY2FudmFzIGNhbiBiZSBwcmludGVkIGRpcmVjdGx5LgpmdW5jIChjIENhbnZhcykgU3RyaW5nKCkgc3RyaW5nIHsgcmV0dXJuIGMuVGV4dCgpIH0KCi8vIEFOU0kgZW1pdHMgdGhlIGNhbnZhcyB3aXRoIFNHUiB0cnVlY29sb3VyIGVzY2FwZXMsIG9uZSByZXNldCBhdCB0aGUgZW5kIG9mCi8vIGV2ZXJ5IGNvbG91cmVkIHJvdy4gVHJhaWxpbmcgc3BhY2VzIGFyZSBOT1QgdHJpbW1lZCBoZXJlOiBhIHRyYWlsaW5nIGNlbGwgbWF5Ci8vIGNhcnJ5IGEgYmFja2dyb3VuZCBjb2xvdXIsIGFuZCB0cmltbWluZyBpdCB3b3VsZCBwdXQgYSBob2xlIGluIHRoZSBwaWN0dXJlLgovLwovLyBUaGlzIG91dHB1dCBjYW5ub3QgcmVhY2ggZ25vd2ViLiBTZWUgdGhlIHBhY2thZ2UgZG9jLgpmdW5jIChjIENhbnZhcykgQU5TSSgpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWZvciB5IDo9IDA7IHkgPCBjLkg7IHkrKyB7CgkJZmcsIGJnIDo9IERlZmF1bHQsIERlZmF1bHQKCQlmb3IgeCA6PSAwOyB4IDwgYy5XOyB4KysgewoJCQljbCA6PSBjLkNlbGxzW3kqYy5XK3hdCgkJCWlmIGNsLkZHICE9IGZnIHx8IGNsLkJHICE9IGJnIHsKCQkJCWIuV3JpdGVTdHJpbmcoc2dyKGNsLkZHLCBjbC5CRykpCgkJCQlmZywgYmcgPSBjbC5GRywgY2wuQkcKCQkJfQoJCQliLldyaXRlUnVuZShjbC5SKQoJCX0KCQlpZiBmZyAhPSBEZWZhdWx0IHx8IGJnICE9IERlZmF1bHQgewoJCQliLldyaXRlU3RyaW5nKHJlc2V0KQoJCX0KCQlpZiB5IDwgYy5ILTEgewoJCQliLldyaXRlU3RyaW5nKCJcbiIpCgkJfQoJfQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKLy8gRXNjYXBlIGlzIHRoZSBieXRlIHRoYXQgc3RhcnRzIGV2ZXJ5IFNHUiBzZXF1ZW5jZS4gRXhwb3J0ZWQgc28gYSBjb25zdW1lciBjYW4KLy8gc3RyaXAgQU5TSSB3aXRob3V0IGhhcmQtY29kaW5nICJceDFiIi4KY29uc3QgRXNjYXBlID0gJ1x4MWInCgpjb25zdCByZXNldCA9ICJceDFiWzBtIgoKZnVuYyBzZ3IoZmcsIGJnIGludCkgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiXHgxYlsiKQoJaWYgZmcgPT0gRGVmYXVsdCB7CgkJYi5Xcml0ZVN0cmluZygiMzkiKQoJfSBlbHNlIHsKCQlyLCBnLCBibCA6PSBTcGxpdChmZykKCQliLldyaXRlU3RyaW5nKCIzODsyOyIpCgkJd3JpdGVJbnQoJmIsIHIpCgkJYi5Xcml0ZUJ5dGUoJzsnKQoJCXdyaXRlSW50KCZiLCBnKQoJCWIuV3JpdGVCeXRlKCc7JykKCQl3cml0ZUludCgmYiwgYmwpCgl9CgliLldyaXRlQnl0ZSgnOycpCglpZiBiZyA9PSBEZWZhdWx0IHsKCQliLldyaXRlU3RyaW5nKCI0OSIpCgl9IGVsc2UgewoJCXIsIGcsIGJsIDo9IFNwbGl0KGJnKQoJCWIuV3JpdGVTdHJpbmcoIjQ4OzI7IikKCQl3cml0ZUludCgmYiwgcikKCQliLldyaXRlQnl0ZSgnOycpCgkJd3JpdGVJbnQoJmIsIGcpCgkJYi5Xcml0ZUJ5dGUoJzsnKQoJCXdyaXRlSW50KCZiLCBibCkKCX0KCWIuV3JpdGVCeXRlKCdtJykKCXJldHVybiBiLlN0cmluZygpCn0KCi8vIHdyaXRlSW50IHdyaXRlcyBhIDAtMjU1IHZhbHVlIHdpdGhvdXQgc3RyY29udiwgd2hpY2ggdGhpcyBwYWNrYWdlIHdvdWxkCi8vIG90aGVyd2lzZSBpbXBvcnQgZm9yIHRocmVlIGNhbGwgc2l0ZXMuCmZ1bmMgd3JpdGVJbnQoYiAqc3RyaW5ncy5CdWlsZGVyLCB2IGludCkgewoJaWYgdiA+PSAxMDAgewoJCWIuV3JpdGVCeXRlKGJ5dGUoJzAnICsgdi8xMDApKQoJfQoJaWYgdiA+PSAxMCB7CgkJYi5Xcml0ZUJ5dGUoYnl0ZSgnMCcgKyAodi8xMCklMTApKQoJfQoJYi5Xcml0ZUJ5dGUoYnl0ZSgnMCcgKyB2JTEwKSkKfQoagCIKD2NhbnZhc190ZXN0LmdubxLsIXBhY2thZ2UgYXJ0CgppbXBvcnQgKAoJInN0cmluZ3MiCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgopCgpmdW5jIFRlc3ROZXdDYW52YXNJc0JsYW5rKHQgKnRlc3RpbmcuVCkgewoJYyA6PSBOZXdDYW52YXMoMywgMikKCXVhc3NlcnQuRXF1YWwodCwgNiwgbGVuKGMuQ2VsbHMpLCAiY2VsbCBjb3VudCIpCgl1YXNzZXJ0LkVxdWFsKHQsICJcbiIsIGMuVGV4dCgpLCAidHdvIGVtcHR5IHJvd3MsIGJvdGggdHJpbW1lZCB0byBub3RoaW5nIikKCgkvLyBOZWdhdGl2ZSBkaW1lbnNpb25zIG11c3Qgbm90IHBhbmljIHBhcnR3YXkgdGhyb3VnaCBhIFJlbmRlci4KCWVtcHR5IDo9IE5ld0NhbnZhcygtNCwgLTQpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIGVtcHR5LlcsICJuZWdhdGl2ZSB3aWR0aCBjbGFtcHMgdG8gMCIpCgl1YXNzZXJ0LkVxdWFsKHQsICIiLCBlbXB0eS5UZXh0KCksICJlbXB0eSBjYW52YXMgaXMgdGhlIGVtcHR5IHN0cmluZyIpCn0KCmZ1bmMgVGVzdFdyaXRlQW5kQ2xpcCh0ICp0ZXN0aW5nLlQpIHsKCWNhc2VzIDo9IFtdc3RydWN0IHsKCQluYW1lIHN0cmluZwoJCXgsIHkgaW50CgkJaW4gICBzdHJpbmcKCQl3YW50IHN0cmluZwoJfXsKCQl7ImZpdHMiLCAwLCAwLCAiYWJjIiwgImFiY1xuXG4ifSwKCQl7Im9mZnNldCIsIDEsIDEsICJ4eSIsICJcbiB4eVxuIn0sCgkJeyJjbGlwcGVkIGF0IHRoZSByaWdodCBlZGdlIiwgMiwgMCwgImFiY2RlIiwgIiAgYWJjXG5cbiJ9LAoJCXsibmVnYXRpdmUgeCBkcm9wcyB0aGUgbGVhZGluZyBydW5lcyIsIC0yLCAwLCAiYWJjZGUiLCAiY2RlXG5cbiJ9LAoJCXsibmV3bGluZSByZXR1cm5zIHRvIHRoZSBzdGFydCBjb2x1bW4iLCAxLCAwLCAiYWJcbmNkIiwgIiBhYlxuIGNkXG4ifSwKCQl7Im9mZiB0aGUgYm90dG9tIGlzIGRyb3BwZWQgZW50aXJlbHkiLCAwLCA5LCAiYWJjIiwgIlxuXG4ifSwKCX0KCWZvciBfLCB0YyA6PSByYW5nZSBjYXNlcyB7CgkJYyA6PSBOZXdDYW52YXMoNSwgMykKCQljLldyaXRlKHRjLngsIHRjLnksIHRjLmluKQoJCXVhc3NlcnQuRXF1YWwodCwgdGMud2FudCwgYy5UZXh0KCksIHRjLm5hbWUpCgl9Cn0KCmZ1bmMgVGVzdFRleHRUcmltc1RyYWlsaW5nU3BhY2VBbmRBTlNJRG9lc05vdCh0ICp0ZXN0aW5nLlQpIHsKCWMgOj0gTmV3Q2FudmFzKDQsIDEpCgljLlBlbihEZWZhdWx0LCAweGZmMDAwMCkKCWMuUHV0KDAsIDAsICd4JykKCWMuUHV0KDMsIDAsICcgJykgLy8gYSB0cmFpbGluZyBzcGFjZSB0aGF0IGNhcnJpZXMgYSBiYWNrZ3JvdW5kIGNvbG91cgoKCXVhc3NlcnQuRXF1YWwodCwgIngiLCBjLlRleHQoKSwgInRleHQgZHJvcHMgdGhlIGNvbG91cmVkIHRyYWlsaW5nIHNwYWNlIikKCglhbnNpIDo9IGMuQU5TSSgpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5IYXNTdWZmaXgoYW5zaSwgcmVzZXQpLCAiYSBjb2xvdXJlZCByb3cgZW5kcyBpbiBhIHJlc2V0IikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGFuc2ksICI0ODsyOzI1NTswOzAiKSwgInRoZSByZWQgYmFja2dyb3VuZCBpcyBlbWl0dGVkIikKCS8vIFRyaW1taW5nIGhlcmUgd291bGQgcHVuY2ggYSBob2xlIGluIHRoZSBwaWN0dXJlLCBzbyB0aGUgY2VsbCBzdXJ2aXZlcy4KCXVhc3NlcnQuRXF1YWwodCwgInggICAiLCBzdHJpcFNHUihhbnNpKSwgImFsbCBmb3VyIGNlbGxzIHN1cnZpdmUgaW4gYW5zaSIpCn0KCmZ1bmMgVGVzdEFOU0lFbWl0c09uZUVzY2FwZVBlckNoYW5nZSh0ICp0ZXN0aW5nLlQpIHsKCWMgOj0gTmV3Q2FudmFzKDQsIDEpCgljLlBlbigweDAwZmYwMCwgRGVmYXVsdCkKCWMuV3JpdGUoMCwgMCwgImFhIikKCWMuUGVuKDB4MDAwMGZmLCBEZWZhdWx0KQoJYy5Xcml0ZSgyLCAwLCAiYmIiKQoKCWdvdCA6PSBjLkFOU0koKQoJLy8gVHdvIGNvbG91ciBjaGFuZ2VzIHBsdXMgdGhlIGVuZC1vZi1yb3cgcmVzZXQsIGFuZCBub3Qgb25lIHBlciBjZWxsLgoJdWFzc2VydC5FcXVhbCh0LCAzLCBzdHJpbmdzLkNvdW50KGdvdCwgIlx4MWJbIiksICJlc2NhcGUgY291bnQiKQoJdWFzc2VydC5FcXVhbCh0LCAiYWFiYiIsIHN0cmlwU0dSKGdvdCksICJ0aGUgcnVuZXMgc3Vydml2ZSBpbnRhY3QiKQp9CgpmdW5jIFRlc3RBTlNJVW5jb2xvdXJlZFJvd0hhc05vRXNjYXBlcyh0ICp0ZXN0aW5nLlQpIHsKCWMgOj0gTmV3Q2FudmFzKDMsIDEpCgljLldyaXRlKDAsIDAsICJhYmMiKQoJdWFzc2VydC5FcXVhbCh0LCAiYWJjIiwgYy5BTlNJKCksICJubyBjb2xvdXIgbWVhbnMgbm8gZXNjYXBlcyBhbmQgbm8gcmVzZXQiKQp9CgpmdW5jIFRlc3RCbGl0KHQgKnRlc3RpbmcuVCkgewoJc3JjIDo9IE5ld0NhbnZhcygyLCAyKQoJc3JjLldyaXRlKDAsIDAsICJhYlxuY2QiKQoKCWRzdCA6PSBOZXdDYW52YXMoNCwgNCkKCWRzdC5CbGl0KDEsIDEsIHNyYykKCXVhc3NlcnQuRXF1YWwodCwgIlxuIGFiXG4gY2RcbiIsIGRzdC5UZXh0KCksICJwbGFjZWQgYXQgdGhlIG9mZnNldCIpCgoJLy8gUGFydGx5IG9mZiB0aGUgZWRnZSBrZWVwcyB3aGF0IGZpdHMgYW5kIGRyb3BzIHRoZSByZXN0LgoJZWRnZSA6PSBOZXdDYW52YXMoNCwgNCkKCWVkZ2UuQmxpdCgzLCAzLCBzcmMpCgl1YXNzZXJ0LkVxdWFsKHQsICJcblxuXG4gICBhIiwgZWRnZS5UZXh0KCksICJvbmx5IHRoZSB0b3AtbGVmdCBjZWxsIGxhbmRzIikKCgkvLyBBIG5pbCBzb3VyY2UgaXMgYSBuby1vcCByYXRoZXIgdGhhbiBhIHBhbmljLgoJZWRnZS5CbGl0KDAsIDAsIG5pbCkKfQoKZnVuYyBUZXN0Qm94QW5kRnJhbWUodCAqdGVzdGluZy5UKSB7CgljIDo9IE5ld0NhbnZhcyg1LCAzKQoJYy5Cb3goMCwgMCwgNSwgMywgQVNDSUkpCgl1YXNzZXJ0LkVxdWFsKHQsICIrLS0tK1xufCAgIHxcbistLS0rIiwgYy5UZXh0KCksICJhc2NpaSBib3JkZXIiKQoKCS8vIERlZ2VuZXJhdGUgYm94ZXMgZHJhdyBub3RoaW5nOiB0aGVyZSBpcyBubyBib3JkZXIgd2l0aCBubyBpbnNpZGUuCglzbWFsbCA6PSBOZXdDYW52YXMoNSwgMykKCXNtYWxsLkJveCgwLCAwLCAxLCAzLCBMaWdodCkKCXNtYWxsLkJveCgwLCAwLCA1LCAxLCBMaWdodCkKCXVhc3NlcnQuRXF1YWwodCwgIlxuXG4iLCBzbWFsbC5UZXh0KCksICJ3aWR0aCBvciBoZWlnaHQgdW5kZXIgMiBkcmF3cyBub3RoaW5nIikKCglpbm5lciA6PSBOZXdDYW52YXMoMywgMSkKCWlubmVyLldyaXRlKDAsIDAsICJoZXkiKQoJZnJhbWVkIDo9IGlubmVyLkZyYW1lKCIiLCBBU0NJSSkKCXVhc3NlcnQuRXF1YWwodCwgNSwgZnJhbWVkLlcsICJmcmFtZSBhZGRzIHR3byBjb2x1bW5zIikKCXVhc3NlcnQuRXF1YWwodCwgMywgZnJhbWVkLkgsICJmcmFtZSBhZGRzIHR3byByb3dzIikKCXVhc3NlcnQuRXF1YWwodCwgIistLS0rXG58aGV5fFxuKy0tLSsiLCBmcmFtZWQuVGV4dCgpLCAiY29udGVudCBjZW50cmVkIGluc2lkZSIpCn0KCmZ1bmMgVGVzdEZyYW1lVGl0bGVJc1RydW5jYXRlZE5vdE92ZXJydW4odCAqdGVzdGluZy5UKSB7Cglpbm5lciA6PSBOZXdDYW52YXMoNCwgMSkKCXRpdGxlZCA6PSBpbm5lci5GcmFtZSgic2V0dGxlcnMiLCBBU0NJSSkKCS8vIDYgY29sdW1ucyB3aWRlOiB0aGUgY29ybmVycyB0YWtlIDIgYW5kIHRoZSB0aXRsZSBzdGFydHMgYXQgeD0yLCBzbyBpdAoJLy8gZ2V0cyAyIGNlbGxzIGFuZCBtdXN0IG5vdCBlYXQgdGhlIHRvcC1yaWdodCBjb3JuZXIuCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5IYXNQcmVmaXgodGl0bGVkLlRleHQoKSwgIistc2UtK1xuIiksICJ0cnVuY2F0ZWQsIGNvcm5lciBzdXJ2aXZlcyIpCgoJLy8gQSBjYW52YXMgdG9vIG5hcnJvdyBmb3IgYW55IHRpdGxlIHN0aWxsIGZyYW1lcyBjbGVhbmx5LgoJdGlueSA6PSBOZXdDYW52YXMoMSwgMSkKCXVhc3NlcnQuRXF1YWwodCwgIistK1xufCB8XG4rLSsiLCB0aW55LkZyYW1lKCJub3BlIiwgQVNDSUkpLlRleHQoKSwgIm5vIHJvb20sIG5vIHRpdGxlIikKfQoKLy8gc3RyaXBTR1IgcmVtb3ZlcyBldmVyeSBTR1Igc2VxdWVuY2UsIHNvIGEgdGVzdCBjYW4gYXNzZXJ0IG9uIHRoZSBydW5lcyBhbmQgb24KLy8gdGhlIGVzY2FwZXMgc2VwYXJhdGVseSBpbnN0ZWFkIG9mIHBpbm5pbmcgb25lIGxvbmcgb3BhcXVlIHN0cmluZy4KZnVuYyBzdHJpcFNHUihzIHN0cmluZykgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJaW4gOj0gZmFsc2UKCWZvciBfLCByIDo9IHJhbmdlIHMgewoJCXN3aXRjaCB7CgkJY2FzZSByID09IEVzY2FwZToKCQkJaW4gPSB0cnVlCgkJY2FzZSBpbiAmJiByID09ICdtJzoKCQkJaW4gPSBmYWxzZQoJCWNhc2UgaW46CgkJZGVmYXVsdDoKCQkJYi5Xcml0ZVJ1bmUocikKCQl9Cgl9CglyZXR1cm4gYi5TdHJpbmcoKQp9ChqtGAoJY29sb3IuZ25vEp8YcGFja2FnZSBhcnQKCmltcG9ydCAic3RyaW5ncyIKCi8vIERlZmF1bHQgaXMgdGhlIGNvbG91ciB0aGF0IG1lYW5zICJsZXQgdGhlIGNvbnN1bWVyIGRlY2lkZSI6IHRoZSB0ZXJtaW5hbCdzCi8vIG93biBmb3JlZ3JvdW5kIG9yIGJhY2tncm91bmQgaW4gQU5TSSwgYW5kIHRyYW5zcGFyZW50IGluIFNWRy4KY29uc3QgRGVmYXVsdCA9IC0xCgovLyBSR0IgcGFja3MgdGhyZWUgMC0yNTUgY29tcG9uZW50cyBpbnRvIHRoZSAweFJSR0dCQiBmb3JtIHRoaXMgcGFja2FnZSB1c2VzLgovLyBDb21wb25lbnRzIG91dHNpZGUgMC0yNTUgYXJlIGNsYW1wZWQgcmF0aGVyIHRoYW4gd3JhcHBlZCwgc28gYSBjb21wdXRlZAovLyBjaGFubmVsIGNhbm5vdCBzaWxlbnRseSBhbGlhcyBvbnRvIGEgbmVpZ2hib3VyaW5nIG9uZS4KZnVuYyBSR0IociwgZywgYiBpbnQpIGludCB7CglyZXR1cm4gY2xhbXA4KHIpPDwxNiB8IGNsYW1wOChnKTw8OCB8IGNsYW1wOChiKQp9CgovLyBTcGxpdCByZXR1cm5zIHRoZSB0aHJlZSAwLTI1NSBjb21wb25lbnRzIG9mIGEgcGFja2VkIGNvbG91ci4gRGVmYXVsdCBzcGxpdHMKLy8gdG8gemVyb2VzLCBzbyBjYWxsZXJzIG11c3QgdGVzdCBmb3IgRGVmYXVsdCBiZWZvcmUgY2FsbGluZyBpdCByYXRoZXIgdGhhbgovLyBhZnRlci4KZnVuYyBTcGxpdChjIGludCkgKHIsIGcsIGIgaW50KSB7CglpZiBjIDwgMCB7CgkJcmV0dXJuIDAsIDAsIDAKCX0KCXJldHVybiAoYyA+PiAxNikgJiAweGZmLCAoYyA+PiA4KSAmIDB4ZmYsIGMgJiAweGZmCn0KCi8vIFBhcnNlSGV4IHJlYWRzICIjcnJnZ2JiIiwgIiNyZ2IiLCBvciBlaXRoZXIgd2l0aG91dCB0aGUgbGVhZGluZyAnIycsIGFuZAovLyByZXBvcnRzIHdoZXRoZXIgaXQgdW5kZXJzdG9vZCB0aGUgc3RyaW5nLiBBbiBlbXB0eSBzdHJpbmcgaXMgbm90IGFuIGVycm9yIGJ1dAovLyBpdCBpcyBub3QgYSBjb2xvdXIgZWl0aGVyOiBpdCByZXBvcnRzIERlZmF1bHQsIGZhbHNlLCB3aGljaCBpcyBob3cgYSBwYWxldHRlCi8vIG1hcmtzIGEgdHJhbnNwYXJlbnQgZW50cnkuCmZ1bmMgUGFyc2VIZXgocyBzdHJpbmcpIChpbnQsIGJvb2wpIHsKCXMgPSBzdHJpbmdzLlRyaW1TcGFjZShzKQoJcyA9IHN0cmluZ3MuVHJpbVByZWZpeChzLCAiIyIpCglzd2l0Y2ggbGVuKHMpIHsKCWNhc2UgMzoKCQlyLCBvazEgOj0gaGV4RGlnaXQoc1swXSkKCQlnLCBvazIgOj0gaGV4RGlnaXQoc1sxXSkKCQliLCBvazMgOj0gaGV4RGlnaXQoc1syXSkKCQlpZiAhb2sxIHx8ICFvazIgfHwgIW9rMyB7CgkJCXJldHVybiBEZWZhdWx0LCBmYWxzZQoJCX0KCQkvLyAjYWJjIGlzICNhYWJiY2MsIG5vdCAjMGEwYjBjLgoJCXJldHVybiBSR0IocioxNywgZyoxNywgYioxNyksIHRydWUKCWNhc2UgNjoKCQlyLCBvazEgOj0gaGV4Qnl0ZShzWzBdLCBzWzFdKQoJCWcsIG9rMiA6PSBoZXhCeXRlKHNbMl0sIHNbM10pCgkJYiwgb2szIDo9IGhleEJ5dGUoc1s0XSwgc1s1XSkKCQlpZiAhb2sxIHx8ICFvazIgfHwgIW9rMyB7CgkJCXJldHVybiBEZWZhdWx0LCBmYWxzZQoJCX0KCQlyZXR1cm4gUkdCKHIsIGcsIGIpLCB0cnVlCgl9CglyZXR1cm4gRGVmYXVsdCwgZmFsc2UKfQoKLy8gSGV4IGlzIHRoZSBpbnZlcnNlIG9mIFBhcnNlSGV4LiBEZWZhdWx0IHJlbmRlcnMgYXMgdGhlIGVtcHR5IHN0cmluZywgYmVjYXVzZQovLyB0aGVyZSBpcyBubyBoZXggc3BlbGxpbmcgb2YgInRoZSBjb25zdW1lcidzIGRlZmF1bHQiLgpmdW5jIEhleChjIGludCkgc3RyaW5nIHsKCWlmIGMgPCAwIHsKCQlyZXR1cm4gIiIKCX0KCXIsIGcsIGIgOj0gU3BsaXQoYykKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCXNiLldyaXRlQnl0ZSgnIycpCgl3cml0ZUhleEJ5dGUoJnNiLCByKQoJd3JpdGVIZXhCeXRlKCZzYiwgZykKCXdyaXRlSGV4Qnl0ZSgmc2IsIGIpCglyZXR1cm4gc2IuU3RyaW5nKCkKfQoKLy8gTHVtaW5hbmNlIHJldHVybnMgcGVyY2VpdmVkIGJyaWdodG5lc3Mgb24gMC0yNTUsIHVzaW5nIHRoZSBSZWMuIDcwOSB3ZWlnaHRzCi8vICgwLjIxMjYgUiwgMC43MTUyIEcsIDAuMDcyMiBCKSBpbiBpbnRlZ2VyIGFyaXRobWV0aWMuIERlZmF1bHQgaXMgdHJlYXRlZCBhcwovLyBibGFjaywgc28gYW4gdW5zZXQgY29sb3VyIHJhbXBzIHRvIHRoZSBkYXJrZXN0IGdseXBoIHJhdGhlciB0aGFuIHRvIGEKLy8gbWlkcG9pbnQgdGhhdCB3b3VsZCByZWFkIGFzIHJlYWwgY29udGVudC4KLy8KLy8gVGhpcyBpcyB0aGUgZnVuY3Rpb24gW1JhbXBdIGtleXMgb24sIGFuZCB0aGUgcGFja2FnZSBkb2MgZXhwbGFpbnMgd2h5IGtleWluZwovLyBvbiBpdCBpcyB0aGUgd3JvbmcgZGVmYXVsdCBmb3IgYSBzcHJpdGUuCmZ1bmMgTHVtaW5hbmNlKGMgaW50KSBpbnQgewoJaWYgYyA8IDAgewoJCXJldHVybiAwCgl9CglyLCBnLCBiIDo9IFNwbGl0KGMpCglyZXR1cm4gKDIxMjYqciArIDcxNTIqZyArIDcyMipiKSAvIDEwMDAwCn0KCmZ1bmMgY2xhbXA4KHYgaW50KSBpbnQgewoJaWYgdiA8IDAgewoJCXJldHVybiAwCgl9CglpZiB2ID4gMjU1IHsKCQlyZXR1cm4gMjU1Cgl9CglyZXR1cm4gdgp9CgpmdW5jIGhleERpZ2l0KGMgYnl0ZSkgKGludCwgYm9vbCkgewoJc3dpdGNoIHsKCWNhc2UgYyA+PSAnMCcgJiYgYyA8PSAnOSc6CgkJcmV0dXJuIGludChjIC0gJzAnKSwgdHJ1ZQoJY2FzZSBjID49ICdhJyAmJiBjIDw9ICdmJzoKCQlyZXR1cm4gaW50KGMtJ2EnKSArIDEwLCB0cnVlCgljYXNlIGMgPj0gJ0EnICYmIGMgPD0gJ0YnOgoJCXJldHVybiBpbnQoYy0nQScpICsgMTAsIHRydWUKCX0KCXJldHVybiAwLCBmYWxzZQp9CgpmdW5jIGhleEJ5dGUoaGksIGxvIGJ5dGUpIChpbnQsIGJvb2wpIHsKCWgsIG9rMSA6PSBoZXhEaWdpdChoaSkKCWwsIG9rMiA6PSBoZXhEaWdpdChsbykKCWlmICFvazEgfHwgIW9rMiB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglyZXR1cm4gaCoxNiArIGwsIHRydWUKfQoKY29uc3QgaGV4RGlnaXRzID0gIjAxMjM0NTY3ODlhYmNkZWYiCgpmdW5jIHdyaXRlSGV4Qnl0ZShzYiAqc3RyaW5ncy5CdWlsZGVyLCB2IGludCkgewoJc2IuV3JpdGVCeXRlKGhleERpZ2l0c1sodj4+NCkmMHhmXSkKCXNiLldyaXRlQnl0ZShoZXhEaWdpdHNbdiYweGZdKQp9Chq8EAoOY29sb3JfdGVzdC5nbm8SqRBwYWNrYWdlIGFydAoKaW1wb3J0ICgKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCikKCmZ1bmMgVGVzdFBhcnNlSGV4KHQgKnRlc3RpbmcuVCkgewoJY2FzZXMgOj0gW11zdHJ1Y3QgewoJCW5hbWUgc3RyaW5nCgkJaW4gICBzdHJpbmcKCQl3YW50IGludAoJCW9rICAgYm9vbAoJfXsKCQl7InNpeCB3aXRoIGhhc2giLCAiI2U4YzM5ZSIsIDB4ZThjMzllLCB0cnVlfSwKCQl7InNpeCB3aXRob3V0IGhhc2giLCAiZThjMzllIiwgMHhlOGMzOWUsIHRydWV9LAoJCXsidXBwZXJjYXNlIiwgIiNFOEMzOUUiLCAweGU4YzM5ZSwgdHJ1ZX0sCgkJeyJzaG9ydCBleHBhbmRzIGJ5IGR1cGxpY2F0aW9uIiwgIiNhYmMiLCAweGFhYmJjYywgdHJ1ZX0sCgkJeyJzaG9ydCBpcyBub3QgemVybyBwYWRkZWQiLCAiI2FiYyIsIDB4MGEwYjBjLCBmYWxzZX0sCgkJeyJzdXJyb3VuZGluZyBzcGFjZSIsICIgICMwMDAwMDAgIiwgMHgwMDAwMDAsIHRydWV9LAoJCXsid2hpdGUiLCAiI2ZmZmZmZiIsIDB4ZmZmZmZmLCB0cnVlfSwKCQl7ImVtcHR5IGlzIG5vdCBhIGNvbG91ciIsICIiLCBEZWZhdWx0LCBmYWxzZX0sCgkJeyJmb3VyIGRpZ2l0cyIsICIjYWJjZCIsIERlZmF1bHQsIGZhbHNlfSwKCQl7Im5vbiBoZXggZGlnaXQiLCAiI2dnZ2dnZyIsIERlZmF1bHQsIGZhbHNlfSwKCX0KCWZvciBfLCB0YyA6PSByYW5nZSBjYXNlcyB7CgkJZ290LCBvayA6PSBQYXJzZUhleCh0Yy5pbikKCQlpZiAhdGMub2sgewoJCQkvLyBFaXRoZXIgaXQgZmFpbGVkIHRvIHBhcnNlLCBvciBpdCBwYXJzZWQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4KCQkJLy8gdGhlIHZhbHVlIHRoaXMgY2FzZSBzYXlzIGl0IG11c3Qgbm90IHByb2R1Y2UuCgkJCXVhc3NlcnQuRmFsc2UodCwgb2sgJiYgZ290ID09IHRjLndhbnQsIHRjLm5hbWUpCgkJCWNvbnRpbnVlCgkJfQoJCXVhc3NlcnQuVHJ1ZSh0LCBvaywgdGMubmFtZSsiOiBwYXJzZWQiKQoJCXVhc3NlcnQuRXF1YWwodCwgdGMud2FudCwgZ290LCB0Yy5uYW1lKQoJfQp9CgpmdW5jIFRlc3RIZXhSb3VuZFRyaXAodCAqdGVzdGluZy5UKSB7Cglmb3IgXywgcyA6PSByYW5nZSBbXXN0cmluZ3siIzAwMDAwMCIsICIjZmZmZmZmIiwgIiNlOGMzOWUiLCAiIzBhMGIwYyJ9IHsKCQljLCBvayA6PSBQYXJzZUhleChzKQoJCXVhc3NlcnQuVHJ1ZSh0LCBvaywgcykKCQl1YXNzZXJ0LkVxdWFsKHQsIHMsIEhleChjKSwgcykKCX0KCXVhc3NlcnQuRXF1YWwodCwgIiIsIEhleChEZWZhdWx0KSwgIkRlZmF1bHQgaGFzIG5vIGhleCBzcGVsbGluZyIpCn0KCmZ1bmMgVGVzdFJHQkNsYW1wcyh0ICp0ZXN0aW5nLlQpIHsKCXVhc3NlcnQuRXF1YWwodCwgMHhmZmZmZmYsIFJHQigzMDAsIDMwMCwgMzAwKSwgIm92ZXIgcmFuZ2UgY2xhbXBzIHRvIGZmIikKCXVhc3NlcnQuRXF1YWwodCwgMHgwMDAwMDAsIFJHQigtNSwgLTUsIC01KSwgInVuZGVyIHJhbmdlIGNsYW1wcyB0byAwMCIpCgkvLyBUaGUgcG9pbnQgb2YgY2xhbXBpbmcgcmF0aGVyIHRoYW4gbWFza2luZzogMjU2IG11c3Qgbm90IGFsaWFzIHRvIDAgYW5kCgkvLyBjYXJyeSBhIGJpdCBpbnRvIHRoZSBuZXh0IGNoYW5uZWwuCgl1YXNzZXJ0LkVxdWFsKHQsIDB4MDBmZjAwLCBSR0IoMCwgMjU2LCAwKSwgIjI1NiBkb2VzIG5vdCBjYXJyeSBpbnRvIHJlZCIpCn0KCmZ1bmMgVGVzdEx1bWluYW5jZSh0ICp0ZXN0aW5nLlQpIHsKCWNhc2VzIDo9IFtdc3RydWN0IHsKCQluYW1lIHN0cmluZwoJCWluICAgaW50CgkJd2FudCBpbnQKCX17CgkJeyJibGFjayIsIDB4MDAwMDAwLCAwfSwKCQl7IndoaXRlIiwgMHhmZmZmZmYsIDI1NX0sCgkJeyJwdXJlIGdyZWVuIGlzIHRoZSBicmlnaHRlc3QgcHJpbWFyeSIsIDB4MDBmZjAwLCAxODJ9LAoJCXsicHVyZSBibHVlIGlzIHRoZSBkYXJrZXN0IHByaW1hcnkiLCAweDAwMDBmZiwgMTh9LAoJCXsicHVyZSByZWQiLCAweGZmMDAwMCwgNTR9LAoJCXsiRGVmYXVsdCByZWFkcyBhcyBibGFjayIsIERlZmF1bHQsIDB9LAoJfQoJZm9yIF8sIHRjIDo9IHJhbmdlIGNhc2VzIHsKCQl1YXNzZXJ0LkVxdWFsKHQsIHRjLndhbnQsIEx1bWluYW5jZSh0Yy5pbiksIHRjLm5hbWUpCgl9Cn0KGuYUCgdkb2MuZ25vEtoULy8gUGFja2FnZSBhcnQgaXMgdGhlIHByaW1pdGl2ZSBsYXllciBmb3IgQVNDSUksIEFOU0kgYW5kIHBpeGVsIGFydCBpbiBhIHJlYWxtLgovLwovLyBBIHJlYWxtJ3MgUmVuZGVyIHJldHVybnMgb25lIHN0cmluZyBhbmQgbm90aGluZyB0ZWxscyB0aGUgY2FsbGVyIHdoYXQga2luZCBvZgovLyBzdHJpbmcgaXQgaXMsIHNvIGV2ZXJ5IHJlYWxtIHBpY2tzIG1hcmtkb3duIGFuZCBldmVyeSB0ZXJtaW5hbCByZWFkZXIgZWF0cyB0aGUKLy8gc3ludGF4IGFzIG5vaXNlLiBUaGlzIHBhY2thZ2Ugb3ducyB0aGUgaGFsZiBvZiB0aGF0IHByb2JsZW0gdGhhdCBpcyBhYm91dAovLyBwaWN0dXJlczogaXQgaG9sZHMgYXJ0IGluIGEgZm9ybSB0aGF0IGNhbiBiZSBlbWl0dGVkIGFzIHBsYWluIHRleHQsIGFzIEFOU0kKLy8gdHJ1ZWNvbG91ciwgb3IgYXMgU1ZHLCBhbmQgbGV0cyB0aGUgY2FsbGVyIGNob29zZSBhdCByZW5kZXIgdGltZS4KLy8KLy8gIyBUd28gdHlwZXMsIHNlZW4gdHdpY2UKLy8KLy8gW1BpeF0gaXMgYW4gaW5kZXhlZCBiaXRtYXA6IGEgd2lkdGgsIGEgaGVpZ2h0LCBvbmUgcGFsZXR0ZSBpbmRleCBwZXIgcGl4ZWwsCi8vIGFuZCBhIFtQYWxldHRlXSBvZiBoZXggY29sb3Vycy4gSXQgaXMgd2hhdCBhIHBpeGVsLWFydCBORlQgYWN0dWFsbHkgaXMuCi8vCi8vIFtDYW52YXNdIGlzIGEgZ3JpZCBvZiBbQ2VsbF0sIGVhY2ggY2FycnlpbmcgYSBydW5lIGFuZCBhIGZvcmVncm91bmQgYW5kCi8vIGJhY2tncm91bmQgY29sb3VyLiBJdCBpcyB3aGF0IGEgdGVybWluYWwgYWN0dWFsbHkgaXMuCi8vCi8vIFRoZSBjb252ZXJzaW9uIGJldHdlZW4gdGhlbSBpcyB0aGUgcG9pbnQgb2YgdGhlIHBhY2thZ2UuIFtQaXguQ2FudmFzXSB0YWtlcyBhCi8vIFtNb2RlXSBhbmQgcHJvZHVjZXMgYSBDYW52YXM7IFtDYW52YXMuVGV4dF0sIFtDYW52YXMuQU5TSV0gYW5kIFtDYW52YXMuU1ZHXQovLyB0YWtlIGl0IHRoZSByZXN0IG9mIHRoZSB3YXkgb3V0LgovLwovLyAjIFVzZSBHbHlwaHMgZm9yIHNwcml0ZXMsIFJhbXAgZm9yIHBob3RvcwovLwovLyBUaGUgb2J2aW91cyBjb252ZXJzaW9uLCBhIGx1bWluYW5jZSByYW1wLCBwcm9kdWNlcyBtdXNoIGZvciBwaXhlbCBhcnQuCi8vCi8vIE1lYXN1cmVkIG9uIFNldHRsZXIgIzI1LCBhIDMyeDMyIHNwcml0ZSBvbiBtYWlubmV0IHdpdGggMjAgcGFsZXR0ZSBjb2xvdXJzOiBhCi8vIHRlbi1zdGVwIGx1bWluYW5jZSByYW1wIHJlc29sdmVzIHRob3NlIDIwIHRvIDksIHNvIGVsZXZlbiBvZiB0aGUgYXJ0aXN0J3MKLy8gY29sb3VycyBzdG9wIGV4aXN0aW5nLiBUaGUgY29sbGlzaW9ucyBhcmUgbm90IGJldHdlZW4gbmVhci1pZGVudGljYWwgc2hhZGVzCi8vIGVpdGhlci4gVGhlIG9yYW5nZSBoYXQgKCNmMDhhMmEsIGx1bWluYW5jZSAxNTIpIGFuZCB0aGUgc2t5LWJsdWUgdHVuaWMKLy8gKCMzZjhmZDEsIGx1bWluYW5jZSAxMzApIGxhbmQgaW4gdGhlIHNhbWUgYnVja2V0IGFuZCBjb21lIG91dCBhcyB0aGUgc2FtZQovLyBjaGFyYWN0ZXIsIGJlY2F1c2UgbHVtaW5hbmNlIGNhbm5vdCB0ZWxsIGEgaHVlIGZyb20gYSBodWUuCi8vCi8vIEluZGV4ZWQgYXJ0IGFscmVhZHkgY2FycmllcyBpdHMgb3duIHNlZ21lbnRhdGlvbiwgaW4gdGhlIHBhbGV0dGUuIFNvIHRoZSByaWdodAovLyBydWxlIGZvciBhIHNwcml0ZSBpcyBvbmUgZ2x5cGggcGVyIHBhbGV0dGUgaW5kZXggKFtHbHlwaHNdKSwgbm90IG9uZSBnbHlwaCBwZXIKLy8gYnJpZ2h0bmVzcyAoW1JhbXBdKS4gUmFtcCBpcyBrZXB0IGJlY2F1c2UgaXQgaXMgcmlnaHQgZm9yIGEgcGhvdG9ncmFwaCwgd2hlcmUKLy8gdGhlcmUgaXMgbm8gbWVhbmluZ2Z1bCBwYWxldHRlIHRvIGtleSBvbi4KLy8KLy8gIyBBTlNJIGlzIGEgdGVybWluYWwtb25seSB0YXJnZXQsIGJ5IGNvbnN0cnVjdGlvbgovLwovLyBbQ2FudmFzLkFOU0ldIGVtaXRzIFNHUiBlc2NhcGUgc2VxdWVuY2VzLiBUaG9zZSBjYW5ub3QgcmVhY2ggZ25vd2ViOiByYXcgRVNDCi8vIGluIGEgY29kZSBmZW5jZSBpcyBnYXJiYWdlIGluIEhUTUwsIGFuZCBnbm8ubGFuZC9wL250L21hcmtkb3duL3Nhbml0aXplIHN0cmlwcwovLyBjb250cm9sIGJ5dGVzIGFueXdheS4gVGhhdCBpcyBub3QgYSBnYXAgdG8gY2xvc2UgbGF0ZXIsIGl0IGlzIHRoZSByZWFzb24gdGhlCi8vIHRhcmdldCBpcyBhIHBhcmFtZXRlciBpbnN0ZWFkIG9mIGEgZGVjaXNpb24uIFdoZW4gY29sb3VyIGhhcyB0byBzdXJ2aXZlIHRoZQovLyB3ZWIsIHVzZSBbQ2FudmFzLlNWR10gb3IgW1BpeC5TVkddLCB3aGljaCBjYXJyeSB0aGUgc2FtZSBjb2xvdXJzIHRocm91Z2ggYQovLyBtZWRpdW0gZ25vd2ViIGNhbiBhY3R1YWxseSBzaG93LgovLwovLyAjIENvbG91cnMgYXJlIHBhY2tlZCBpbnRzCi8vCi8vIEEgY29sb3VyIGlzIGFuIGludCBob2xkaW5nIDB4UlJHR0JCLCBvciBbRGVmYXVsdF0gKC0xKSBtZWFuaW5nICJ3aGF0ZXZlciB0aGUKLy8gY29uc3VtZXIncyBkZWZhdWx0IGlzIjogdGhlIHRlcm1pbmFsJ3MgZGVmYXVsdCBmb3JlZ3JvdW5kIGZvciBhbiBGRywgYW5kCi8vIHRyYW5zcGFyZW50IGZvciBhIGJhY2tncm91bmQgaW4gU1ZHLiBbUGFyc2VIZXhdIHR1cm5zICIjcnJnZ2JiIiBvciAiI3JnYiIKLy8gaW50byBvbmUuCnBhY2thZ2UgYXJ0Chq0DgoQZXhhbXBsZV90ZXN0LmdubxKfDnBhY2thZ2UgYXJ0CgovLyBoZWFydCBpcyBhbiA4eDYgaW5kZXhlZCBzcHJpdGU6IDAgYmFja2dyb3VuZCwgMSBib2R5LCAyIGhpZ2hsaWdodC4KdmFyICgKCWhlYXJ0UGFsID0gUGFsZXR0ZXsiIiwgIiNkNjQ1NTAiLCAiI2Y3YThiMCJ9CgloZWFydElkeCA9IFtddWludDh7CgkJMCwgMSwgMSwgMCwgMCwgMSwgMSwgMCwKCQkxLCAxLCAxLCAyLCAyLCAxLCAxLCAxLAoJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCgkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMCwKCQkwLCAwLCAxLCAxLCAxLCAxLCAwLCAwLAoJCTAsIDAsIDAsIDEsIDEsIDAsIDAsIDAsCgl9CikKCmZ1bmMgaGVhcnQoKSAqUGl4IHsKCXJldHVybiAmUGl4e1c6IDgsIEg6IDYsIElkeDogaGVhcnRJZHgsIFBhbDogaGVhcnRQYWx9Cn0KCi8vIE9uZSBnbHlwaCBwZXIgcGFsZXR0ZSBpbmRleCwgZWFjaCBwaXhlbCB0d28gY2VsbHMgd2lkZSBzbyB0aGUgc3ByaXRlIGtlZXBzCi8vIGl0cyBwcm9wb3J0aW9ucyBpbiBhIHRlcm1pbmFsLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciBpbmRleGVkIGFydC4KZnVuYyBFeGFtcGxlUGl4X0NhbnZhc19nbHlwaHMoKSB7CglwcmludGxuKGhlYXJ0KCkuQ2FudmFzKEdseXBocykuVGV4dCgpKQoJLy8gT3V0cHV0OgoJLy8gICAjIyMjICAgICMjIyMKCS8vICMjIyMjI0BAQEAjIyMjIyMKCS8vICMjIyMjIyMjIyMjIyMjIyMKCS8vICAgIyMjIyMjIyMjIyMjCgkvLyAgICAgIyMjIyMjIyMKCS8vICAgICAgICMjIyMKfQoKLy8gVGhlIHNhbWUgc3ByaXRlIGF0IGZvdXIgdGltZXMgdGhlIGRlbnNpdHksIGluIEJyYWlsbGUuIE1vbm9jaHJvbWUgYnkKLy8gY29uc3RydWN0aW9uOiBhIEJyYWlsbGUgY2VsbCBoYXMgZWlnaHQgZG90cyBhbmQgbm8gY29sb3Vycywgc28gYSBwaXhlbCBpcwovLyBvbmx5IG9uIG9yIG9mZi4KZnVuYyBFeGFtcGxlUGl4X0NhbnZhc19icmFpbGxlKCkgewoJcHJpbnRsbihoZWFydCgpLkNhbnZhcyhCcmFpbGxlKS5UZXh0KCkpCgkvLyBPdXRwdXQ6CgkvLyDior7io7fio77iobcKCS8vIOKggOKgmeKgi+KggAp9CgovLyBRdWFkcmFudHMgcGFjayAyeDIgaW50byBvbmUgY2VsbC4gQXNrZWQgZm9yIG5vIGNvbG91ciwgdGhlIG1vZGUgaGFzIG5vdGhpbmcKLy8gbGVmdCB0byBzYXkgd2l0aCB0d28gY29sb3VycyBhbmQgZGVncmFkZXMgdG8gYSBkZW5zaXR5IG1hcCwgd2hpY2ggaXMgc3RpbGwKLy8gdGhlIGRlbnNlc3QgdGhpbmcgYSBwbGFpbi10ZXh0IGNvbnN1bWVyIGNhbiBiZSBoYW5kZWQuCmZ1bmMgRXhhbXBsZVBpeF9DYW52YXNfcXVhZHJhbnQoKSB7CglwcmludGxuKGhlYXJ0KCkuQ2FudmFzT3B0cyhPcHRze01vZGU6IFF1YWRyYW50fSkuVGV4dCgpKQoJLy8gT3V0cHV0OgoJLy8g4paf4paZ4paf4paZCgkvLyDilpzilojilojilpsKCS8vICDilpzilpsKfQoKLy8gRHJhd2luZyBvbiBhIENhbnZhcyBkaXJlY3RseSwgd2l0aCBhIGJvcmRlciBhcm91bmQgaXQuCmZ1bmMgRXhhbXBsZUNhbnZhc19GcmFtZSgpIHsKCWMgOj0gTmV3Q2FudmFzKDExLCAzKQoJYy5Xcml0ZSgwLCAwLCAiZ25vLmxhbmQiKQoJYy5ITGluZSgwLCAxLCAxMSwgJ+KUgCcpCgljLldyaXRlKDAsIDIsICJhc2NpaSBhcnQiKQoJcHJpbnRsbihjLkZyYW1lKCJhcnQiLCBSb3VuZCkuVGV4dCgpKQoJLy8gT3V0cHV0OgoJLy8g4pWt4pSAYXJ04pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWuCgkvLyDilIJnbm8ubGFuZCAgIOKUggoJLy8g4pSC4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSCCgkvLyDilIJhc2NpaSBhcnQgIOKUggoJLy8g4pWw4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWvCn0KGj0KC2dub21vZC50b21sEi5tb2R1bGUgPSAiZ25vLmxhbmQvcC9tb3VsL2FydC92MCIKZ25vID0gIjAuOSIKGuVaCgdwaXguZ25vEtlacGFja2FnZSBhcnQKCmltcG9ydCAoCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9tb3VsL3N2Zy92MCIKKQoKLy8gUGFsZXR0ZSBtYXBzIGEgcGl4ZWwncyBpbmRleCB0byBhIGNvbG91ciwgYXMgYSBoZXggc3RyaW5nICgiI2U4YzM5ZSIsICIjYWJjIiwKLy8gd2l0aCBvciB3aXRob3V0IHRoZSAnIycpLiBBbiBlbXB0eSBlbnRyeSBpcyB0cmFuc3BhcmVudDogW1BpeC5TVkddIGVtaXRzIG5vCi8vIHJlY3RhbmdsZSBmb3IgaXQgYW5kIHRoZSBjb2xvdXIgbW9kZXMgZ2l2ZSBpdCBbRGVmYXVsdF0uCi8vCi8vIEJ5IGNvbnZlbnRpb24gaW5kZXggMCBpcyB0aGUgYmFja2dyb3VuZC4gW0JyYWlsbGVdIGtleXMgb24gdGhhdCBjb252ZW50aW9uCi8vIGRpcmVjdGx5LCBhbmQgdGhlIGRlZmF1bHQgZ2x5cGggc2V0IGdpdmVzIGluZGV4IDAgYSBzcGFjZS4KdHlwZSBQYWxldHRlIFtdc3RyaW5nCgovLyBDb2xvciByZXR1cm5zIHRoZSBwYWNrZWQgY29sb3VyIG9mIGEgcGFsZXR0ZSBpbmRleCwgb3IgW0RlZmF1bHRdIGlmIHRoZSBpbmRleAovLyBpcyBvdXQgb2YgcmFuZ2Ugb3IgdGhlIGVudHJ5IGlzIGVtcHR5IG9yIHVucGFyc2VhYmxlLgpmdW5jIChwIFBhbGV0dGUpIENvbG9yKGkgdWludDgpIGludCB7CglpZiBpbnQoaSkgPj0gbGVuKHApIHsKCQlyZXR1cm4gRGVmYXVsdAoJfQoJYywgb2sgOj0gUGFyc2VIZXgocFtpXSkKCWlmICFvayB7CgkJcmV0dXJuIERlZmF1bHQKCX0KCXJldHVybiBjCn0KCi8vIFBpeCBpcyBhbiBpbmRleGVkIGJpdG1hcDogb25lIHBhbGV0dGUgaW5kZXggcGVyIHBpeGVsLCByb3ctbWFqb3IgZnJvbSB0aGUgdG9wCi8vIGxlZnQuIFRoaXMgaXMgdGhlIHNoYXBlIHBpeGVsIGFydCBhY3R1YWxseSBoYXMgb24gY2hhaW4sIGFuZCB0aGUgcmVhc29uCi8vIFtHbHlwaHNdIGJlYXRzIFtSYW1wXSBmb3IgaXQuCnR5cGUgUGl4IHN0cnVjdCB7CglXLCBIIGludAoJSWR4ICBbXXVpbnQ4CglQYWwgIFBhbGV0dGUKfQoKLy8gTmV3UGl4IHJldHVybnMgYSB3IGJ5IGggYml0bWFwIHdpdGggZXZlcnkgcGl4ZWwgYXQgaW5kZXggMC4KZnVuYyBOZXdQaXgodywgaCBpbnQsIHBhbCBQYWxldHRlKSAqUGl4IHsKCWlmIHcgPCAwIHsKCQl3ID0gMAoJfQoJaWYgaCA8IDAgewoJCWggPSAwCgl9CglyZXR1cm4gJlBpeHtXOiB3LCBIOiBoLCBJZHg6IG1ha2UoW111aW50OCwgdypoKSwgUGFsOiBwYWx9Cn0KCi8vIEF0IHJldHVybnMgdGhlIHBhbGV0dGUgaW5kZXggYXQgKHgsIHkpLCBvciAwIG9mZiB0aGUgYml0bWFwLiBPZmYtYml0bWFwCi8vIHJlYWRpbmcgYXMgYmFja2dyb3VuZCBpcyB3aGF0IGxldHMgdGhlIGNvbnZlcnNpb25zIGJlbG93IHJ1biBwYXN0IHRoZSBlZGdlIG9mCi8vIGFuIG9kZC1zaXplZCBpbWFnZSB3aXRob3V0IGEgYm91bmRzIGNoZWNrIGF0IGV2ZXJ5IHBpeGVsLgpmdW5jIChwICpQaXgpIEF0KHgsIHkgaW50KSB1aW50OCB7CglpZiB4IDwgMCB8fCB5IDwgMCB8fCB4ID49IHAuVyB8fCB5ID49IHAuSCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBwLklkeFt5KnAuVyt4XQp9CgovLyBTZXQgd3JpdGVzIGEgcGFsZXR0ZSBpbmRleCwgY2xpcHBpbmcgc2lsZW50bHkgb2ZmIHRoZSBiaXRtYXAuCmZ1bmMgKHAgKlBpeCkgU2V0KHgsIHkgaW50LCBpIHVpbnQ4KSB7CglpZiB4IDwgMCB8fCB5IDwgMCB8fCB4ID49IHAuVyB8fCB5ID49IHAuSCB7CgkJcmV0dXJuCgl9CglwLklkeFt5KnAuVyt4XSA9IGkKfQoKLy8gQ29sb3IgcmV0dXJucyB0aGUgcGFja2VkIGNvbG91ciBhdCAoeCwgeSkuCmZ1bmMgKHAgKlBpeCkgQ29sb3IoeCwgeSBpbnQpIGludCB7IHJldHVybiBwLlBhbC5Db2xvcihwLkF0KHgsIHkpKSB9CgovLyBNb2RlIGlzIGhvdyBhIFtQaXhdIGJlY29tZXMgYSBbQ2FudmFzXS4gVGhleSBhcmUgbm90IGNvc21ldGljIHZhcmlhbnRzIG9mCi8vIGVhY2ggb3RoZXI6IHRoZXkgdHJhZGUgcmVzb2x1dGlvbiwgY29sb3VyIGFuZCBjb25zdW1lciBhZ2FpbnN0IG9uZSBhbm90aGVyLAovLyBhbmQgdGhlIHBhY2thZ2UgZG9jIHNheXMgd2hpY2ggdG8gcmVhY2ggZm9yLgp0eXBlIE1vZGUgaW50Cgpjb25zdCAoCgkvLyBHbHlwaHMgZ2l2ZXMgZXZlcnkgcGFsZXR0ZSBpbmRleCBpdHMgb3duIHJ1bmUuIFRoZSByaWdodCBkZWZhdWx0IGZvcgoJLy8gc3ByaXRlcyBhbmQgYW55dGhpbmcgZWxzZSB3aXRoIGEgc21hbGwgaW5kZXhlZCBwYWxldHRlLgoJR2x5cGhzIE1vZGUgPSBpb3RhCgoJLy8gUmFtcCBwaWNrcyBhIHJ1bmUgYnkgbHVtaW5hbmNlLiBSaWdodCBmb3IgYSBwaG90b2dyYXBoLCB3cm9uZyBmb3IgYQoJLy8gc3ByaXRlLCBhbmQgdGhlIHBhY2thZ2UgZG9jIGhhcyB0aGUgbWVhc3VyZW1lbnQuCglSYW1wCgoJLy8gSGFsZkJsb2NrIHBhY2tzIHR3byB2ZXJ0aWNhbCBwaXhlbHMgaW50byBvbmUgY2VsbCB3aXRoICfiloAnLCBmb3JlZ3JvdW5kCgkvLyBmb3IgdGhlIHRvcCBwaXhlbCBhbmQgYmFja2dyb3VuZCBmb3IgdGhlIGJvdHRvbS4gRnVsbCBjb2xvdXIsIHNxdWFyZQoJLy8gYXNwZWN0LCBoYWxmIHRoZSByb3dzLiBUaGUgYmVzdC1sb29raW5nIG1vZGUsIGFuZCB0ZXJtaW5hbC1vbmx5LgoJSGFsZkJsb2NrCgoJLy8gUXVhZHJhbnQgcGFja3MgYSAyeDIgYmxvY2sgaW50byBvbmUgY2VsbC4gVHdpY2UgSGFsZkJsb2NrJ3MgZGVuc2l0eSwKCS8vIGJ1dCBhIGNlbGwgY2FycmllcyBvbmx5IHR3byBjb2xvdXJzLCBzbyBhIGZvdXItY29sb3VyIGJsb2NrIGxvc2VzIHR3by4KCVF1YWRyYW50CgoJLy8gQnJhaWxsZSBwYWNrcyBhIDJ4NCBibG9jayBpbnRvIG9uZSBCcmFpbGxlIGNlbGwuIFRoZSBkZW5zZXN0IG1vZGUgYW5kCgkvLyB0aGUgb25seSBtb25vY2hyb21lIG9uZTogYSBwaXhlbCBpcyBvbiBpZiBpdHMgaW5kZXggaXMgbm90IDAuCglCcmFpbGxlCikKCi8vIERlZmF1bHRHbHlwaHMgaXMgb25lIHZpc3VhbGx5IGRpc3RpbmN0IHJ1bmUgcGVyIHBhbGV0dGUgaW5kZXgsIG9yZGVyZWQgc28KLy8gdGhhdCBuZWlnaGJvdXJpbmcgaW5kaWNlcyBzdGF5IGFwYXJ0IG9uIHNjcmVlbi4gSW5kZXggMCBpcyBhIHNwYWNlLCBtYXRjaGluZwovLyB0aGUgYmFja2dyb3VuZCBjb252ZW50aW9uLgovLwovLyBBIHBhbGV0dGUgbG9uZ2VyIHRoYW4gdGhpcyB3cmFwcywgd2hpY2ggaXMgYSByZWFsIGNvbGxpc2lvbjogcGFzcyB5b3VyIG93bgovLyBzZXQgdGhyb3VnaCBbT3B0c10gd2hlbiB0aGF0IG1hdHRlcnMuCnZhciBEZWZhdWx0R2x5cGhzID0gW11ydW5leycgJywgJyMnLCAnQCcsICclJywgJyonLCAnKycsICc9JywgJ34nLCAnLScsICc6JywgJy4nLCAnbycsICdPJywgJ3gnLCAnWCcsICd3JywgJ1cnLCAnbScsICdNJywgJzgnfQoKLy8gRGVmYXVsdFJhbXAgcnVucyBkYXJrZXN0IHRvIGxpZ2h0ZXN0LCBmb3IgYSB0ZXJtaW5hbCB3aXRoIGEgZGFyayBiYWNrZ3JvdW5kLgovLyBJbnZlcnQgaXQgZm9yIGEgbGlnaHQgb25lLgp2YXIgRGVmYXVsdFJhbXAgPSBbXXJ1bmV7JyAnLCAnLicsICc6JywgJy0nLCAnPScsICcrJywgJyonLCAnIycsICclJywgJ0AnfQoKLy8gUXVhZHJhbnRzIGlzIGluZGV4ZWQgYnkgYSA0LWJpdCBtYXNrOiBiaXQgMCB0b3AtbGVmdCwgMSB0b3AtcmlnaHQsIDIKLy8gYm90dG9tLWxlZnQsIDMgYm90dG9tLXJpZ2h0Lgp2YXIgUXVhZHJhbnRzID0gW11ydW5leycgJywgJ+KWmCcsICfilp0nLCAn4paAJywgJ+KWlicsICfilownLCAn4paeJywgJ+KWmycsICfilpcnLCAn4paaJywgJ+KWkCcsICfilpwnLCAn4paEJywgJ+KWmScsICfilp8nLCAn4paIJ30KCi8vIE9wdHMgaXMgdGhlIGZ1bGwgZm9ybSBvZiBbUGl4LkNhbnZhc10sIGZvciBjYWxsZXJzIHdobyB3YW50IHRvIG92ZXJyaWRlIGEKLy8gbW9kZSdzIGRlZmF1bHRzLgp0eXBlIE9wdHMgc3RydWN0IHsKCU1vZGUgTW9kZQoKCS8vIEdseXBocyBvdmVycmlkZXMgW0RlZmF1bHRHbHlwaHNdIGZvciBbR2x5cGhzXSBhbmQgW0RlZmF1bHRSYW1wXSBmb3IKCS8vIFtSYW1wXS4gSWdub3JlZCBieSB0aGUgYmxvY2sgbW9kZXMuCglHbHlwaHMgW11ydW5lCgoJLy8gQ29sb3IgY2FycmllcyBwYWxldHRlIGNvbG91cnMgaW50byB0aGUgY2FudmFzLiBUaGUgYmxvY2sgbW9kZXMgbmVlZCBpdAoJLy8gYW5kIHNldCBpdCBieSBkZWZhdWx0OyB0aGUgZ2x5cGggbW9kZXMgZGVmYXVsdCB0byBvZmYsIGJlY2F1c2UgdGhlaXIKCS8vIHdob2xlIGpvYiBpcyB0byBiZSByZWFkYWJsZSB3aXRob3V0IGNvbG91ci4KCUNvbG9yIGJvb2wKCgkvLyBXaWRlIGVtaXRzIGVhY2ggcGl4ZWwgYXMgdHdvIGNlbGxzIHNpZGUgYnkgc2lkZS4gQSB0ZXJtaW5hbCBjZWxsIGlzCgkvLyBhYm91dCB0d2ljZSBhcyB0YWxsIGFzIGl0IGlzIHdpZGUsIHNvIGEgc3ByaXRlIHJlbmRlcmVkIG9uZSBjZWxsIHBlcgoJLy8gcGl4ZWwgY29tZXMgb3V0IHNxdWFzaGVkIHRvIGhhbGYgaGVpZ2h0LiBPbiBieSBkZWZhdWx0IGZvciB0aGUgZ2x5cGgKCS8vIG1vZGVzOyBtZWFuaW5nbGVzcyBmb3IgdGhlIGJsb2NrIG1vZGVzLCB3aGljaCBjb3JyZWN0IGFzcGVjdCBieSBwYWNraW5nLgoJV2lkZSBib29sCn0KCi8vIENhbnZhcyBjb252ZXJ0cyB0aGUgYml0bWFwIHVzaW5nIGEgbW9kZSdzIGRlZmF1bHRzOiBbR2x5cGhzXSBhbmQgW1JhbXBdIGNvbWUKLy8gb3V0IHdpZGUgYW5kIG1vbm9jaHJvbWUsIHRoZSBibG9jayBtb2RlcyBjb21lIG91dCBjb2xvdXJlZC4KZnVuYyAocCAqUGl4KSBDYW52YXMobSBNb2RlKSAqQ2FudmFzIHsKCW8gOj0gT3B0c3tNb2RlOiBtfQoJc3dpdGNoIG0gewoJY2FzZSBHbHlwaHMsIFJhbXA6CgkJby5XaWRlID0gdHJ1ZQoJZGVmYXVsdDoKCQlvLkNvbG9yID0gdHJ1ZQoJfQoJcmV0dXJuIHAuQ2FudmFzT3B0cyhvKQp9CgovLyBDYW52YXNPcHRzIGNvbnZlcnRzIHRoZSBiaXRtYXAgd2l0aCB0aGUgb3B0aW9ucyBzcGVsbGVkIG91dC4KZnVuYyAocCAqUGl4KSBDYW52YXNPcHRzKG8gT3B0cykgKkNhbnZhcyB7Cglzd2l0Y2ggby5Nb2RlIHsKCWNhc2UgSGFsZkJsb2NrOgoJCXJldHVybiBwLmhhbGZCbG9jayhvKQoJY2FzZSBRdWFkcmFudDoKCQlyZXR1cm4gcC5xdWFkcmFudChvKQoJY2FzZSBCcmFpbGxlOgoJCXJldHVybiBwLmJyYWlsbGUobykKCWNhc2UgUmFtcDoKCQlyZXR1cm4gcC5nbHlwaEdyaWQobywgcGlja1JhbXAoby5HbHlwaHMpKQoJZGVmYXVsdDoKCQlyZXR1cm4gcC5nbHlwaEdyaWQobywgcGlja0dseXBocyhvLkdseXBocykpCgl9Cn0KCmZ1bmMgcGlja0dseXBocyhnIFtdcnVuZSkgW11ydW5lIHsKCWlmIGxlbihnKSA9PSAwIHsKCQlyZXR1cm4gRGVmYXVsdEdseXBocwoJfQoJcmV0dXJuIGcKfQoKZnVuYyBwaWNrUmFtcChnIFtdcnVuZSkgW11ydW5lIHsKCWlmIGxlbihnKSA9PSAwIHsKCQlyZXR1cm4gRGVmYXVsdFJhbXAKCX0KCXJldHVybiBnCn0KCi8vIGdseXBoR3JpZCBjb3ZlcnMgYm90aCBHbHlwaHMgYW5kIFJhbXA6IHRoZXkgZGlmZmVyIG9ubHkgaW4gd2hhdCB0aGV5IGtleSB0aGUKLy8gcnVuZSBsb29rdXAgb24sIHdoaWNoIGlzIGV4YWN0bHkgdGhlIGZpbmRpbmcgdGhlIHBhY2thZ2UgZG9jIHJlY29yZHMuCmZ1bmMgKHAgKlBpeCkgZ2x5cGhHcmlkKG8gT3B0cywgc2V0IFtdcnVuZSkgKkNhbnZhcyB7CglzdGVwIDo9IDEKCWlmIG8uV2lkZSB7CgkJc3RlcCA9IDIKCX0KCW91dCA6PSBOZXdDYW52YXMocC5XKnN0ZXAsIHAuSCkKCWZvciB5IDo9IDA7IHkgPCBwLkg7IHkrKyB7CgkJZm9yIHggOj0gMDsgeCA8IHAuVzsgeCsrIHsKCQkJaWR4IDo9IHAuQXQoeCwgeSkKCQkJY29sIDo9IHAuUGFsLkNvbG9yKGlkeCkKCgkJCXZhciByIHJ1bmUKCQkJaWYgby5Nb2RlID09IFJhbXAgewoJCQkJciA9IHNldFtMdW1pbmFuY2UoY29sKSpsZW4oc2V0KS8yNTZdCgkJCX0gZWxzZSB7CgkJCQlyID0gc2V0W2ludChpZHgpJWxlbihzZXQpXQoJCQl9CgoJCQljZWxsIDo9IENlbGx7UjogciwgRkc6IERlZmF1bHQsIEJHOiBEZWZhdWx0fQoJCQlpZiBvLkNvbG9yIHsKCQkJCWNlbGwuRkcgPSBjb2wKCQkJfQoJCQlmb3IgayA6PSAwOyBrIDwgc3RlcDsgaysrIHsKCQkJCW91dC5TZXQoeCpzdGVwK2ssIHksIGNlbGwpCgkJCX0KCQl9Cgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgKHAgKlBpeCkgaGFsZkJsb2NrKG8gT3B0cykgKkNhbnZhcyB7CglvdXQgOj0gTmV3Q2FudmFzKHAuVywgKHAuSCsxKS8yKQoJZm9yIHkgOj0gMDsgeSA8IG91dC5IOyB5KysgewoJCWZvciB4IDo9IDA7IHggPCBwLlc7IHgrKyB7CgkJCXRvcCA6PSBwLkNvbG9yKHgsIHkqMikKCQkJYm90IDo9IERlZmF1bHQKCQkJaWYgeSoyKzEgPCBwLkggewoJCQkJYm90ID0gcC5Db2xvcih4LCB5KjIrMSkKCQkJfQoJCQlpZiAhby5Db2xvciB7CgkJCQkvLyBXaXRob3V0IGNvbG91ciB0aGUgdXBwZXIgaGFsZiBibG9jayBzYXlzIG5vdGhpbmcsIHNvIGZhbGwKCQkJCS8vIGJhY2sgdG8gImlzIHRoZXJlIGluayBoZXJlIjogZnVsbCwgaGFsZiwgb3IgZW1wdHkuCgkJCQlvdXQuU2V0KHgsIHksIENlbGx7UjogbW9ub0hhbGYocC5BdCh4LCB5KjIpLCBwLkF0KHgsIHkqMisxKSksIEZHOiBEZWZhdWx0LCBCRzogRGVmYXVsdH0pCgkJCQljb250aW51ZQoJCQl9CgkJCW91dC5TZXQoeCwgeSwgQ2VsbHtSOiAn4paAJywgRkc6IHRvcCwgQkc6IGJvdH0pCgkJfQoJfQoJcmV0dXJuIG91dAp9CgpmdW5jIG1vbm9IYWxmKHRvcCwgYm90IHVpbnQ4KSBydW5lIHsKCXN3aXRjaCB7CgljYXNlIHRvcCAhPSAwICYmIGJvdCAhPSAwOgoJCXJldHVybiAn4paIJwoJY2FzZSB0b3AgIT0gMDoKCQlyZXR1cm4gJ+KWgCcKCWNhc2UgYm90ICE9IDA6CgkJcmV0dXJuICfiloQnCgl9CglyZXR1cm4gJyAnCn0KCmZ1bmMgKHAgKlBpeCkgcXVhZHJhbnQobyBPcHRzKSAqQ2FudmFzIHsKCW91dCA6PSBOZXdDYW52YXMoKHAuVysxKS8yLCAocC5IKzEpLzIpCglmb3IgeSA6PSAwOyB5IDwgb3V0Lkg7IHkrKyB7CgkJZm9yIHggOj0gMDsgeCA8IG91dC5XOyB4KysgewoJCQl2YXIgaWR4IFs0XXVpbnQ4CgkJCWlkeFswXSA9IHAuQXQoeCoyLCB5KjIpCgkJCWlkeFsxXSA9IHAuQXQoeCoyKzEsIHkqMikKCQkJaWR4WzJdID0gcC5BdCh4KjIsIHkqMisxKQoJCQlpZHhbM10gPSBwLkF0KHgqMisxLCB5KjIrMSkKCgkJCWlmICFvLkNvbG9yIHsKCQkJCW1hc2sgOj0gMAoJCQkJZm9yIGsgOj0gMDsgayA8IDQ7IGsrKyB7CgkJCQkJaWYgaWR4W2tdICE9IDAgewoJCQkJCQltYXNrIHw9IDEgPDwgdWludChrKQoJCQkJCX0KCQkJCX0KCQkJCW91dC5TZXQoeCwgeSwgQ2VsbHtSOiBRdWFkcmFudHNbbWFza10sIEZHOiBEZWZhdWx0LCBCRzogRGVmYXVsdH0pCgkJCQljb250aW51ZQoJCQl9CgoJCQliZ0lkeCwgZmdJZHgsIHNwbGl0IDo9IHR3b1dheVNwbGl0KGlkeCkKCQkJbWFzayA6PSAwCgkJCWlmIHNwbGl0IHsKCQkJCWZvciBrIDo9IDA7IGsgPCA0OyBrKysgewoJCQkJCWlmIGlkeFtrXSA9PSBmZ0lkeCB7CgkJCQkJCW1hc2sgfD0gMSA8PCB1aW50KGspCgkJCQkJfQoJCQkJfQoJCQl9CgkJCWZnIDo9IERlZmF1bHQKCQkJaWYgc3BsaXQgewoJCQkJZmcgPSBwLlBhbC5Db2xvcihmZ0lkeCkKCQkJfQoJCQlvdXQuU2V0KHgsIHksIENlbGx7UjogUXVhZHJhbnRzW21hc2tdLCBGRzogZmcsIEJHOiBwLlBhbC5Db2xvcihiZ0lkeCl9KQoJCX0KCX0KCXJldHVybiBvdXQKfQoKLy8gdHdvV2F5U3BsaXQgcGlja3MgdGhlIHR3byBwYWxldHRlIGluZGljZXMgYSAyeDIgYmxvY2sgaXMgZHJhd24gd2l0aDogdGhlIG1vc3QKLy8gY29tbW9uIGJlY29tZXMgdGhlIGJhY2tncm91bmQsIHRoZSBtb3N0IGNvbW1vbiBvZiB0aGUgcmVzdCB0aGUgZm9yZWdyb3VuZC4KLy8gSXQgcmVwb3J0cyBmYWxzZSB3aGVuIGV2ZXJ5IHBpeGVsIGFncmVlcywgaW4gd2hpY2ggY2FzZSB0aGVyZSBpcyBubwovLyBmb3JlZ3JvdW5kIGFuZCB0aGUgY2VsbCBpcyBhIHNvbGlkIGJhY2tncm91bmQuCi8vCi8vIEEgdGllIGdvZXMgdG8gdGhlIExPV0VSIHBhbGV0dGUgaW5kZXgsIHdoaWNoIGlzIHdoYXQgbWFrZXMgaW5kZXggMCBiZWhhdmUgYXMKLy8gdGhlIGJhY2tncm91bmQgdGhlIHBhY2thZ2UgZG9jdW1lbnRzIGl0IHRvIGJlLiBUaWUtYnJlYWtpbmcgb24gcGl4ZWwgb3JkZXIKLy8gaW5zdGVhZCBwdXQgdGhlIGluayBpbiB0aGUgYmFja2dyb3VuZCBoYWxmIHRoZSB0aW1lOiBhIHR3by1jb2xvdXIgYmxvY2sgc3BsaXQKLy8gZG93biB0aGUgbWlkZGxlIGNhbWUgb3V0IGFzIHRoZSBtaXJyb3IgaW1hZ2Ugb2YgaXRzZWxmLCBiZWNhdXNlIHdoaWNoZXZlcgovLyBzaWRlIGhhcHBlbmVkIHRvIGJlIHNjYW5uZWQgZmlyc3Qgd29uLgpmdW5jIHR3b1dheVNwbGl0KGlkeCBbNF11aW50OCkgKGJnLCBmZyB1aW50OCwgc3BsaXQgYm9vbCkgewoJYmcgPSBtb3N0Q29tbW9uKGlkeCwgZmFsc2UsIDApCglmZyA9IG1vc3RDb21tb24oaWR4LCB0cnVlLCBiZykKCWlmIGZnID09IGJnIHsKCQlyZXR1cm4gYmcsIGJnLCBmYWxzZQoJfQoJcmV0dXJuIGJnLCBmZywgdHJ1ZQp9CgpmdW5jIG1vc3RDb21tb24oaWR4IFs0XXVpbnQ4LCBza2lwIGJvb2wsIHNraXBwZWQgdWludDgpIHVpbnQ4IHsKCWJlc3QsIGJlc3ROIDo9IHVpbnQ4KDApLCAwCglmb3IgayA6PSAwOyBrIDwgNDsgaysrIHsKCQlpZiBza2lwICYmIGlkeFtrXSA9PSBza2lwcGVkIHsKCQkJY29udGludWUKCQl9CgkJbiA6PSAwCgkJZm9yIGogOj0gMDsgaiA8IDQ7IGorKyB7CgkJCWlmIGlkeFtqXSA9PSBpZHhba10gewoJCQkJbisrCgkJCX0KCQl9CgkJaWYgbiA+IGJlc3ROIHx8IChuID09IGJlc3ROICYmIGJlc3ROID4gMCAmJiBpZHhba10gPCBiZXN0KSB7CgkJCWJlc3QsIGJlc3ROID0gaWR4W2tdLCBuCgkJfQoJfQoJaWYgYmVzdE4gPT0gMCB7CgkJcmV0dXJuIHNraXBwZWQKCX0KCXJldHVybiBiZXN0Cn0KCi8vIGJyYWlsbGVCaXRzIG1hcHMgKGNvbCwgcm93KSBpbnNpZGUgYSAyeDQgYmxvY2sgdG8gaXRzIGJpdCBpbiBVKzI4MDAuIFRoZQovLyBsYXlvdXQgaXMgbm90IHNlcXVlbnRpYWw6IHRoZSBmb3VydGggcm93IHdhcyBhZGRlZCB0byB0aGUgc3RhbmRhcmQgbGF0ZSBhbmQKLy8gdG9vayB0aGUgdHdvIGhpZ2ggYml0cy4KdmFyIGJyYWlsbGVCaXRzID0gWzJdWzRddWludHsKCXswLCAxLCAyLCA2fSwKCXszLCA0LCA1LCA3fSwKfQoKZnVuYyAocCAqUGl4KSBicmFpbGxlKG8gT3B0cykgKkNhbnZhcyB7CglvdXQgOj0gTmV3Q2FudmFzKChwLlcrMSkvMiwgKHAuSCszKS80KQoJZm9yIHkgOj0gMDsgeSA8IG91dC5IOyB5KysgewoJCWZvciB4IDo9IDA7IHggPCBvdXQuVzsgeCsrIHsKCQkJYml0cyA6PSAwCgkJCWZnIDo9IERlZmF1bHQKCQkJZm9yIGNvbCA6PSAwOyBjb2wgPCAyOyBjb2wrKyB7CgkJCQlmb3Igcm93IDo9IDA7IHJvdyA8IDQ7IHJvdysrIHsKCQkJCQlpZiBwLkF0KHgqMitjb2wsIHkqNCtyb3cpID09IDAgewoJCQkJCQljb250aW51ZQoJCQkJCX0KCQkJCQliaXRzIHw9IDEgPDwgYnJhaWxsZUJpdHNbY29sXVtyb3ddCgkJCQkJaWYgby5Db2xvciAmJiBmZyA9PSBEZWZhdWx0IHsKCQkJCQkJZmcgPSBwLkNvbG9yKHgqMitjb2wsIHkqNCtyb3cpCgkJCQkJfQoJCQkJfQoJCQl9CgkJCW91dC5TZXQoeCwgeSwgQ2VsbHtSOiBydW5lKDB4MjgwMCArIGJpdHMpLCBGRzogZmcsIEJHOiBEZWZhdWx0fSkKCQl9Cgl9CglyZXR1cm4gb3V0Cn0KCi8vIFNWRyByZW5kZXJzIHRoZSBiaXRtYXAgYXMgb25lIDxwYXRoPiBwZXIgcGFsZXR0ZSBjb2xvdXIsIGVhY2ggcGF0aCBhCi8vIHJ1bi1sZW5ndGggY2hhaW4gb2YgIk08eD4gPHk+aDx3PnYxaC08dz56IiBwaXhlbCBydW5zLiBUcmFuc3BhcmVudCBwYWxldHRlCi8vIGVudHJpZXMgZW1pdCBub3RoaW5nLgovLwovLyBUaGUgcGF0aCBsaXZlcyBpbiBwaXhlbCBjb29yZGluYXRlcyBhbmQgc2NhbGUgZ29lcyBvbiB0aGUgY2FudmFzIGFzIGEgdmlld0JveCwKLy8gc28gc2NhbGluZyB1cCBjb3N0cyBubyBleHRyYSBieXRlcyBhdCBhbGwuCi8vCi8vIE9uZSBwYXRoIHBlciBjb2xvdXIgcmF0aGVyIHRoYW4gb25lIDxyZWN0PiBwZXIgcnVuIGlzIHdvcnRoIHRoZSBsb29wOgovLyBtZWFzdXJlZCBvbiBTZXR0bGVyICMyNSAoMzJ4MzIsIDIwIGNvbG91cnMsIHJlYWQgZnJvbSBtYWlubmV0IDIwMjYtMDktMjkpLAovLyByZWN0YW5nbGVzIGNhbWUgdG8gMjAsNjI1IGJ5dGVzIGFnYWluc3QgMyw1NjUgZm9yIHBhdGhzLCA1Ljh4LiBBIHJlYWxtIHBheXMKLy8gZm9yIHRob3NlIGJ5dGVzIGluIGdhcyBhbmQgdGhlIHJlYWRlciBwYXlzIGZvciB0aGVtIGluIHBhZ2Ugd2VpZ2h0LCBhbmQgdGhlCi8vIHNldHRsZXJzIHJlYWxtIGl0c2VsZiBlbWl0cyBwYXRocyBmb3IgdGhlIHNhbWUgcmVhc29uLgovLwovLyBVc2UgQ2FudmFzLlJlbmRlciBvciBDYW52YXMuU3RyaW5nIGZyb20gcC9tb3VsL3N2ZyB0byBnZXQgdGhlIG1hcmtkb3duIGltYWdlCi8vIG9yIHRoZSByYXcgZG9jdW1lbnQuCmZ1bmMgKHAgKlBpeCkgU1ZHKHNjYWxlIGludCkgKnN2Zy5DYW52YXMgewoJaWYgc2NhbGUgPCAxIHsKCQlzY2FsZSA9IDEKCX0KCW91dCA6PSBzdmcuTmV3Q2FudmFzKHAuVypzY2FsZSwgcC5IKnNjYWxlKQoJb3V0LldpdGhWaWV3Qm94KDAsIDAsIHAuVywgcC5IKQoJb3V0LkFkZFN0eWxlKCJwYXRoIiwgInNoYXBlLXJlbmRlcmluZzpjcmlzcEVkZ2VzIikKCglmb3IgaSA6PSAwOyBpIDwgbGVuKHAuUGFsKTsgaSsrIHsKCQloZXggOj0gcC5QYWwuaGV4KHVpbnQ4KGkpKQoJCWlmIGhleCA9PSAiIiB7CgkJCWNvbnRpbnVlCgkJfQoJCXZhciBkIHN0cmluZ3MuQnVpbGRlcgoJCWZvciB5IDo9IDA7IHkgPCBwLkg7IHkrKyB7CgkJCXggOj0gMAoJCQlmb3IgeCA8IHAuVyB7CgkJCQlpZiBwLkF0KHgsIHkpICE9IHVpbnQ4KGkpIHsKCQkJCQl4KysKCQkJCQljb250aW51ZQoJCQkJfQoJCQkJcnVuIDo9IDEKCQkJCWZvciB4K3J1biA8IHAuVyAmJiBwLkF0KHgrcnVuLCB5KSA9PSB1aW50OChpKSB7CgkJCQkJcnVuKysKCQkJCX0KCQkJCWQuV3JpdGVCeXRlKCdNJykKCQkJCWQuV3JpdGVTdHJpbmcoaXRvYSh4KSkKCQkJCWQuV3JpdGVCeXRlKCcgJykKCQkJCWQuV3JpdGVTdHJpbmcoaXRvYSh5KSkKCQkJCWQuV3JpdGVCeXRlKCdoJykKCQkJCWQuV3JpdGVTdHJpbmcoaXRvYShydW4pKQoJCQkJZC5Xcml0ZVN0cmluZygidjFoLSIpCgkJCQlkLldyaXRlU3RyaW5nKGl0b2EocnVuKSkKCQkJCWQuV3JpdGVCeXRlKCd6JykKCQkJCXggKz0gcnVuCgkJCX0KCQl9CgkJaWYgZC5MZW4oKSA+IDAgewoJCQlvdXQuQXBwZW5kKHN2Zy5OZXdQYXRoKGQuU3RyaW5nKCksIGhleCkpCgkJfQoJfQoJcmV0dXJuIG91dAp9CgovLyBoZXggcmV0dXJucyBhIHBhbGV0dGUgZW50cnkgbm9ybWFsaXNlZCB0byAiI3JyZ2diYiIsIG9yICIiIGZvciBhIHRyYW5zcGFyZW50Ci8vIG9yIHVucGFyc2VhYmxlIG9uZS4gTm9ybWFsaXNpbmcgcmF0aGVyIHRoYW4gcGFzc2luZyB0aGUgcmF3IHN0cmluZyB0aHJvdWdoIGlzCi8vIHdoYXQga2VlcHMgYW4gZW50cnkgYSBjYWxsZXIgdHlwZWQgb3V0IG9mIHRoZSBTVkcgZG9jdW1lbnQgdW5lc2NhcGVkLgpmdW5jIChwIFBhbGV0dGUpIGhleChpIHVpbnQ4KSBzdHJpbmcgewoJaWYgaW50KGkpID49IGxlbihwKSB7CgkJcmV0dXJuICIiCgl9CgljLCBvayA6PSBQYXJzZUhleChwW2ldKQoJaWYgIW9rIHsKCQlyZXR1cm4gIiIKCX0KCXJldHVybiBIZXgoYykKfQoavzoKDHBpeF90ZXN0LmdubxKuOnBhY2thZ2UgYXJ0CgppbXBvcnQgKAoJInN0cmluZ3MiCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgopCgovLyBzcHJpdGUgYnVpbGRzIGEgc21hbGwgaW5kZXhlZCBiaXRtYXAgZnJvbSBhIHJ1bmUtcGVyLXBpeGVsIGxpdGVyYWwsIHNvIGEgdGVzdAovLyBjYW4gc2hvdyB0aGUgaW5wdXQgaW5zdGVhZCBvZiBsaXN0aW5nIGluZGljZXMuCmZ1bmMgc3ByaXRlKHBhbCBQYWxldHRlLCByb3dzIC4uLnN0cmluZykgKlBpeCB7Cgl3IDo9IDAKCWZvciBfLCByIDo9IHJhbmdlIHJvd3MgewoJCWlmIG4gOj0gbGVuKFtdcnVuZShyKSk7IG4gPiB3IHsKCQkJdyA9IG4KCQl9Cgl9CglwIDo9IE5ld1BpeCh3LCBsZW4ocm93cyksIHBhbCkKCWZvciB5LCByb3cgOj0gcmFuZ2Ugcm93cyB7CgkJZm9yIHgsIHIgOj0gcmFuZ2UgW11ydW5lKHJvdykgewoJCQlpZiByID09ICcuJyB7CgkJCQljb250aW51ZQoJCQl9CgkJCXAuU2V0KHgsIHksIHVpbnQ4KHItJzAnKSkKCQl9Cgl9CglyZXR1cm4gcAp9CgovLyBUZXN0UmFtcENvbGxhcHNlc1doYXRHbHlwaHNLZWVwc0FwYXJ0IGlzIHRoZSBmaW5kaW5nIHRoZSB3aG9sZSBwYWNrYWdlIHR1cm5zCi8vIG9uOiBhIGx1bWluYW5jZSByYW1wIGlzIHRoZSB3cm9uZyBjb252ZXJzaW9uIGZvciBpbmRleGVkIGFydC4KLy8KLy8gU2FuZCAoI2U4ZGNjOCkgYW5kIGJvbmUgKCNkOWQ5ZDkpIGFyZSB0d28gZGlzdGluY3QgcGFsZXR0ZSBlbnRyaWVzIGFueSBzcHJpdGUKLy8gbWlnaHQgY2FycnkuIFRoZWlyIGx1bWluYW5jZXMgYXJlIDIyMSBhbmQgMjE3LCBmb3VyIHN0ZXBzIGFwYXJ0IG91dCBvZiAyNTUsCi8vIHNvIGEgdGVuLXN0ZXAgcmFtcCBkcm9wcyBib3RoIGludG8gYnVja2V0IDggYW5kIHRoZSBzaGFwZSBiZXR3ZWVuIHRoZW0KLy8gZGlzYXBwZWFycy4gS2V5aW5nIG9uIHRoZSBwYWxldHRlIGluZGV4IGluc3RlYWQgY2Fubm90IGRvIHRoYXQsIGJlY2F1c2UgdGhlCi8vIGluZGV4IElTIHRoZSBhcnRpc3QncyBvd24gc2VnbWVudGF0aW9uLgpmdW5jIFRlc3RSYW1wQ29sbGFwc2VzV2hhdEdseXBoc0tlZXBzQXBhcnQodCAqdGVzdGluZy5UKSB7CglwYWwgOj0gUGFsZXR0ZXsiIzAwMDAwMCIsICIjZThkY2M4IiwgIiNkOWQ5ZDkifQoJdWFzc2VydC5FcXVhbCh0LCAyMjEsIEx1bWluYW5jZSgweGU4ZGNjOCksICJzYW5kIikKCXVhc3NlcnQuRXF1YWwodCwgMjE3LCBMdW1pbmFuY2UoMHhkOWQ5ZDkpLCAiYm9uZSIpCgoJcCA6PSBzcHJpdGUocGFsLCAiMDExMiIpCgoJcmFtcCA6PSBwLkNhbnZhc09wdHMoT3B0c3tNb2RlOiBSYW1wfSkuVGV4dCgpCglnbHlwaCA6PSBwLkNhbnZhc09wdHMoT3B0c3tNb2RlOiBHbHlwaHN9KS5UZXh0KCkKCgkvLyBCb3RoIG5vbi1iYWNrZ3JvdW5kIGVudHJpZXMgbGFuZCBvbiB0aGUgc2FtZSByYW1wIHJ1bmUsIHNvIHRoZSB0d28KCS8vIHJlZ2lvbnMgbWVyZ2UgaW50byBvbmUgYmxvYi4KCXVhc3NlcnQuRXF1YWwodCwgIiAlJSUiLCByYW1wLCAicmFtcCBtZXJnZXMgc2FuZCBhbmQgYm9uZSIpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIGRpc3RpbmN0UnVuZXMocmFtcCksICJyYW1wIHNob3dzIHR3byBkaXN0aW5jdCBydW5lcyIpCgoJLy8gR2x5cGhzIGtlZXBzIHRocmVlLCBvbmUgcGVyIHBhbGV0dGUgaW5kZXguCgl1YXNzZXJ0LkVxdWFsKHQsICIgIyNAIiwgZ2x5cGgsICJnbHlwaHMga2VlcCBldmVyeSBpbmRleCBhcGFydCIpCgl1YXNzZXJ0LkVxdWFsKHQsIDMsIGRpc3RpbmN0UnVuZXMoZ2x5cGgpLCAiZ2x5cGhzIHNob3cgdGhyZWUgZGlzdGluY3QgcnVuZXMiKQp9CgpmdW5jIFRlc3RHbHlwaERlZmF1bHRzQXJlV2lkZUFuZE1vbm9jaHJvbWUodCAqdGVzdGluZy5UKSB7CglwIDo9IHNwcml0ZShQYWxldHRleyIiLCAiI2ZmMDAwMCJ9LCAiMDEiKQoKCS8vIEEgdGVybWluYWwgY2VsbCBpcyBhYm91dCB0d2ljZSBhcyB0YWxsIGFzIGl0IGlzIHdpZGUsIHNvIG9uZSBjZWxsIHBlcgoJLy8gcGl4ZWwgd291bGQgc3F1YXNoIGEgc3ByaXRlIHRvIGhhbGYgaGVpZ2h0LgoJd2lkZSA6PSBwLkNhbnZhcyhHbHlwaHMpCgl1YXNzZXJ0LkVxdWFsKHQsIDQsIHdpZGUuVywgImRlZmF1bHQgZG91YmxlcyB0aGUgd2lkdGgiKQoJdWFzc2VydC5FcXVhbCh0LCAiICAjIyIsIHdpZGUuVGV4dCgpLCAiZWFjaCBwaXhlbCBpcyB0d28gY2VsbHMiKQoJdWFzc2VydC5FcXVhbCh0LCBEZWZhdWx0LCB3aWRlLkF0KDIsIDApLkZHLCAibm8gY29sb3VyIGJ5IGRlZmF1bHQiKQoKCW5hcnJvdyA6PSBwLkNhbnZhc09wdHMoT3B0c3tNb2RlOiBHbHlwaHMsIENvbG9yOiB0cnVlfSkKCXVhc3NlcnQuRXF1YWwodCwgMiwgbmFycm93LlcsICJXaWRlIG9mZiBtZWFucyBvbmUgY2VsbCBwZXIgcGl4ZWwiKQoJdWFzc2VydC5FcXVhbCh0LCAweGZmMDAwMCwgbmFycm93LkF0KDEsIDApLkZHLCAiQ29sb3Igb24gY2FycmllcyB0aGUgcGFsZXR0ZSB0aHJvdWdoIikKfQoKZnVuYyBUZXN0Q3VzdG9tR2x5cGhzQW5kV3JhcHBpbmcodCAqdGVzdGluZy5UKSB7CglwIDo9IHNwcml0ZShQYWxldHRleyIiLCAiIiwgIiJ9LCAiMDEyIikKCWdvdCA6PSBwLkNhbnZhc09wdHMoT3B0c3tNb2RlOiBHbHlwaHMsIEdseXBoczogW11ydW5leydhJywgJ2InfX0pLlRleHQoKQoJLy8gVHdvIGdseXBocyBmb3IgdGhyZWUgaW5kaWNlczogaW5kZXggMiB3cmFwcyBiYWNrIG9udG8gJ2EnLiBBIHJlYWwKCS8vIGNvbGxpc2lvbiwgd2hpY2ggaXMgd2h5IHRoZSBkb2MgdGVsbHMgeW91IHRvIHBhc3MgeW91ciBvd24gc2V0LgoJdWFzc2VydC5FcXVhbCh0LCAiYWJhIiwgZ290LCAiYSBzaG9ydCBnbHlwaCBzZXQgd3JhcHMiKQp9CgpmdW5jIFRlc3RIYWxmQmxvY2sodCAqdGVzdGluZy5UKSB7CglwYWwgOj0gUGFsZXR0ZXsiIiwgIiNmZjAwMDAiLCAiIzAwMDBmZiJ9CglwIDo9IHNwcml0ZShwYWwsICIxMSIsICIyMiIsICIxMSIpCgoJYyA6PSBwLkNhbnZhcyhIYWxmQmxvY2spCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIGMuVywgIndpZHRoIGlzIHVuY2hhbmdlZCIpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIGMuSCwgInRocmVlIHJvd3MgcGFjayBpbnRvIHR3byBjZWxscyIpCgoJdG9wIDo9IGMuQXQoMCwgMCkKCXVhc3NlcnQuRXF1YWwodCwgJ+KWgCcsIHRvcC5SLCAidXBwZXIgaGFsZiBibG9jayIpCgl1YXNzZXJ0LkVxdWFsKHQsIDB4ZmYwMDAwLCB0b3AuRkcsICJmb3JlZ3JvdW5kIGlzIHRoZSB0b3AgcGl4ZWwiKQoJdWFzc2VydC5FcXVhbCh0LCAweDAwMDBmZiwgdG9wLkJHLCAiYmFja2dyb3VuZCBpcyB0aGUgYm90dG9tIHBpeGVsIikKCgkvLyBUaGUgb2RkIGxhc3Qgcm93IGhhcyBubyBwYXJ0bmVyLCBzbyBpdHMgYmFja2dyb3VuZCBmYWxscyB0byBEZWZhdWx0CgkvLyByYXRoZXIgdGhhbiByZWFkaW5nIGEgcGl4ZWwgdGhhdCBpcyBub3QgdGhlcmUuCgl1YXNzZXJ0LkVxdWFsKHQsIERlZmF1bHQsIGMuQXQoMCwgMSkuQkcsICJvZGQgaGVpZ2h0IGxlYXZlcyB0aGUgbGFzdCBiYWNrZ3JvdW5kIHVuc2V0IikKfQoKZnVuYyBUZXN0SGFsZkJsb2NrTW9ub2Nocm9tZUZhbGxzQmFja1RvSW5rKHQgKnRlc3RpbmcuVCkgewoJcCA6PSBzcHJpdGUoUGFsZXR0ZXsiIiwgIiNmZmZmZmYifSwgIjEwIiwgIjAxIikKCS8vIFdpdGhvdXQgY29sb3VyLCAn4paAJyBldmVyeXdoZXJlIHdvdWxkIHNheSBub3RoaW5nIGF0IGFsbCwgc28gdGhlIG1vZGUKCS8vIHJlcG9ydHMgd2hpY2ggaGFsdmVzIGNhcnJ5IGluayBpbnN0ZWFkLgoJdWFzc2VydC5FcXVhbCh0LCAi4paA4paEIiwgcC5DYW52YXNPcHRzKE9wdHN7TW9kZTogSGFsZkJsb2NrfSkuVGV4dCgpLCAiaW5rIG1hcCIpCn0KCmZ1bmMgVGVzdFF1YWRyYW50KHQgKnRlc3RpbmcuVCkgewoJcGFsIDo9IFBhbGV0dGV7IiMwMDAwMDAiLCAiI2ZmMDAwMCJ9CgoJLy8gQSBzb2xpZCAyeDIgYmxvY2sgb2Ygb25lIGluZGV4IGhhcyBubyBmb3JlZ3JvdW5kIGF0IGFsbC4KCXNvbGlkIDo9IHNwcml0ZShwYWwsICIxMSIsICIxMSIpLkNhbnZhcyhRdWFkcmFudCkKCXVhc3NlcnQuRXF1YWwodCwgJyAnLCBzb2xpZC5BdCgwLCAwKS5SLCAib25lIGNvbG91ciBtZWFucyBhIGJsYW5rIGNlbGwgb24gYSBzb2xpZCBiYWNrZ3JvdW5kIikKCXVhc3NlcnQuRXF1YWwodCwgMHhmZjAwMDAsIHNvbGlkLkF0KDAsIDApLkJHLCAiYW5kIHRoYXQgY29sb3VyIGlzIHRoZSBiYWNrZ3JvdW5kIikKCXVhc3NlcnQuRXF1YWwodCwgRGVmYXVsdCwgc29saWQuQXQoMCwgMCkuRkcsICJ3aXRoIG5vIGZvcmVncm91bmQiKQoKCS8vIFRocmVlIGJhY2tncm91bmQgcGl4ZWxzIGFuZCBvbmUgZm9yZWdyb3VuZDogdGhlIG1pbm9yaXR5IGJlY29tZXMgdGhlCgkvLyBnbHlwaC4gQml0IDAgaXMgdG9wLWxlZnQuCgljb3JuZXIgOj0gc3ByaXRlKHBhbCwgIjEwIiwgIjAwIikuQ2FudmFzKFF1YWRyYW50KQoJdWFzc2VydC5FcXVhbCh0LCAn4paYJywgY29ybmVyLkF0KDAsIDApLlIsICJ0b3AtbGVmdCBxdWFkcmFudCIpCgl1YXNzZXJ0LkVxdWFsKHQsIDB4ZmYwMDAwLCBjb3JuZXIuQXQoMCwgMCkuRkcsICJ0aGUgbWlub3JpdHkgaW5kZXggaXMgdGhlIGZvcmVncm91bmQiKQoKCWxlZnQgOj0gc3ByaXRlKHBhbCwgIjEwIiwgIjEwIikuQ2FudmFzKFF1YWRyYW50KQoJdWFzc2VydC5FcXVhbCh0LCAn4paMJywgbGVmdC5BdCgwLCAwKS5SLCAibGVmdCBoYWxmIikKfQoKZnVuYyBUZXN0UXVhZHJhbnRQYWNrc0ZvdXJUb09uZSh0ICp0ZXN0aW5nLlQpIHsKCXAgOj0gc3ByaXRlKFBhbGV0dGV7IiIsICIjZmZmIn0sICIxMTExIiwgIjExMTEiLCAiMTExMSIsICIxMTExIikKCWMgOj0gcC5DYW52YXMoUXVhZHJhbnQpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIGMuVywgImhhbGYgdGhlIGNvbHVtbnMiKQoJdWFzc2VydC5FcXVhbCh0LCAyLCBjLkgsICJoYWxmIHRoZSByb3dzIikKfQoKZnVuYyBUZXN0QnJhaWxsZSh0ICp0ZXN0aW5nLlQpIHsKCXAgOj0gc3ByaXRlKFBhbGV0dGV7IiIsICIjZmZmZmZmIn0sICIxMCIsICIwMCIsICIwMCIsICIwMCIpCgljIDo9IHAuQ2FudmFzKEJyYWlsbGUpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIGMuVywgIjIgY29sdW1ucyBwYWNrIGludG8gMSIpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIGMuSCwgIjQgcm93cyBwYWNrIGludG8gMSIpCgl1YXNzZXJ0LkVxdWFsKHQsIHJ1bmUoMHgyODAxKSwgYy5BdCgwLCAwKS5SLCAidG9wLWxlZnQgZG90IGlzIGJpdCAwIikKCgkvLyBUaGUgZm91cnRoIHJvdyB0b29rIHRoZSBoaWdoIGJpdHMgd2hlbiBpdCB3YXMgYWRkZWQgdG8gdGhlIHN0YW5kYXJkLAoJLy8gd2hpY2ggaXMgdGhlIG9uZSB0aGluZyBhYm91dCBCcmFpbGxlIHRoYXQgaXMgbm90IHNlcXVlbnRpYWwuCglsb3cgOj0gc3ByaXRlKFBhbGV0dGV7IiIsICIjZmZmZmZmIn0sICIwMCIsICIwMCIsICIwMCIsICIxMCIpLkNhbnZhcyhCcmFpbGxlKQoJdWFzc2VydC5FcXVhbCh0LCBydW5lKDB4Mjg0MCksIGxvdy5BdCgwLCAwKS5SLCAiYm90dG9tLWxlZnQgZG90IGlzIGJpdCA2IikKCglmdWxsIDo9IHNwcml0ZShQYWxldHRleyIiLCAiI2ZmZmZmZiJ9LCAiMTEiLCAiMTEiLCAiMTEiLCAiMTEiKS5DYW52YXMoQnJhaWxsZSkKCXVhc3NlcnQuRXF1YWwodCwgcnVuZSgweDI4ZmYpLCBmdWxsLkF0KDAsIDApLlIsICJhbGwgZWlnaHQgZG90cyIpCgoJZW1wdHkgOj0gc3ByaXRlKFBhbGV0dGV7IiIsICIjZmZmZmZmIn0sICIwMCIpLkNhbnZhcyhCcmFpbGxlKQoJdWFzc2VydC5FcXVhbCh0LCBydW5lKDB4MjgwMCksIGVtcHR5LkF0KDAsIDApLlIsICJibGFuayBicmFpbGxlLCBub3QgYSBzcGFjZSIpCn0KCmZ1bmMgVGVzdFBpeFNWR1J1bkxlbmd0aCh0ICp0ZXN0aW5nLlQpIHsKCXBhbCA6PSBQYWxldHRleyIiLCAiI2ZmMDAwMCJ9CglwIDo9IHNwcml0ZShwYWwsICIwMTExIiwgIjAwMDAiKQoKCWRvYyA6PSBwLlNWRyg0KS5TdHJpbmcoKQoJLy8gSW5kZXggMCBpcyB0cmFuc3BhcmVudCwgc28gaXQgZW1pdHMgbm90aGluZzsgdGhlIHRocmVlIHJlZCBwaXhlbHMgYmVjb21lCgkvLyBPTkUgcnVuIGluIE9ORSBwYXRoLCBub3QgdGhyZWUgcmVjdGFuZ2xlcy4KCXVhc3NlcnQuRXF1YWwodCwgMSwgc3RyaW5ncy5Db3VudChkb2MsICI8cGF0aCIpLCAib25lIHBhdGggcGVyIGNvbG91ciIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhkb2MsIGBkPSJNMSAwaDN2MWgtM3oiYCksICJvbmUgcnVuLCBpbiBwaXhlbCBjb29yZGluYXRlcyIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhkb2MsIGBmaWxsPSIjZmYwMDAwImApLCAicnVuIGNvbG91ciIpCgkvLyBTY2FsZSBnb2VzIG9uIHRoZSBjYW52YXMsIG5vdCBpbnRvIHRoZSBwYXRoLCBzbyBzY2FsaW5nIGNvc3RzIG5vIGJ5dGVzLgoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoZG9jLCBgd2lkdGg9IjE2IiBoZWlnaHQ9IjgiYCksICJjYW52YXMgaXMgc2NhbGVkIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGRvYywgYHZpZXdCb3g9IjAgMCA0IDIiYCksICJ2aWV3Qm94IHN0YXlzIGluIHBpeGVsIHVuaXRzIikKfQoKZnVuYyBUZXN0UGl4U1ZHTm9ybWFsaXNlc0NvbG91cih0ICp0ZXN0aW5nLlQpIHsKCS8vIEEgc2hvcnQtZm9ybSBlbnRyeSBpcyBleHBhbmRlZCByYXRoZXIgdGhhbiBwYXNzZWQgdGhyb3VnaCwgd2hpY2ggaXMgd2hhdAoJLy8ga2VlcHMgYW4gdW5wYXJzZWFibGUgc3RyaW5nIGEgY2FsbGVyIHR5cGVkIG91dCBvZiB0aGUgZG9jdW1lbnQuCglwIDo9IHNwcml0ZShQYWxldHRleyIjYWJjIn0sICIwIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHAuU1ZHKDEpLlN0cmluZygpLCBgZmlsbD0iI2FhYmJjYyJgKSwgInNob3J0IGZvcm0gZXhwYW5kZWQiKQoKCWp1bmsgOj0gc3ByaXRlKFBhbGV0dGV7YCIgb25sb2FkPSJ4YH0sICIwIikKCXVhc3NlcnQuRXF1YWwodCwgMCwgc3RyaW5ncy5Db3VudChqdW5rLlNWRygxKS5TdHJpbmcoKSwgIjxwYXRoIiksICJhbiB1bnBhcnNlYWJsZSBlbnRyeSBlbWl0cyBub3RoaW5nIikKfQoKZnVuYyBUZXN0UGFsZXR0ZUNvbG9yT3V0T2ZSYW5nZSh0ICp0ZXN0aW5nLlQpIHsKCXBhbCA6PSBQYWxldHRleyIjMDAwMDAwIn0KCXVhc3NlcnQuRXF1YWwodCwgRGVmYXVsdCwgcGFsLkNvbG9yKDcpLCAicGFzdCB0aGUgZW5kIGlzIERlZmF1bHQsIG5vdCBhIHBhbmljIikKCXVhc3NlcnQuRXF1YWwodCwgRGVmYXVsdCwgUGFsZXR0ZXsiIn0uQ29sb3IoMCksICJhbiBlbXB0eSBlbnRyeSBpcyB0cmFuc3BhcmVudCIpCn0KCmZ1bmMgZGlzdGluY3RSdW5lcyhzIHN0cmluZykgaW50IHsKCXZhciBzZWVuIFtdcnVuZQoJZm9yIF8sIHIgOj0gcmFuZ2UgcyB7CgkJZm91bmQgOj0gZmFsc2UKCQlmb3IgXywgbyA6PSByYW5nZSBzZWVuIHsKCQkJaWYgbyA9PSByIHsKCQkJCWZvdW5kID0gdHJ1ZQoJCQkJYnJlYWsKCQkJfQoJCX0KCQlpZiAhZm91bmQgewoJCQlzZWVuID0gYXBwZW5kKHNlZW4sIHIpCgkJfQoJfQoJcmV0dXJuIGxlbihzZWVuKQp9ChrlLgoQc2V0dGxlcl90ZXN0LmdubxLQLnBhY2thZ2UgYXJ0CgppbXBvcnQgKAoJInN0cmluZ3MiCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgopCgovLyBTZXR0bGVyICMyNSwgcmVhZCBmcm9tIG1haW5uZXQgb24gMjAyNi0wOS0yOSBhbmQgdHJhbnNjcmliZWQgb25lIGNoYXJhY3RlcgovLyBwZXIgcGFsZXR0ZSBpbmRleCAoMC05IHRoZW4gYS1qKS4gMzJ4MzIsIDIwIGNvbG91cnMuCi8vCi8vIEl0IGlzIGhlcmUgYmVjYXVzZSB0aGUgcGFja2FnZSdzIGNlbnRyYWwgY2xhaW0gaXMgYWJvdXQgcmVhbCBpbmRleGVkIGFydCBhbmQKLy8gYSBzeW50aGV0aWMgdHdvLWNvbG91ciBmaXh0dXJlIGNhbm5vdCB0ZXN0IGl0OiB0aGUgaW50ZXJlc3RpbmcgdGhpbmcgYWJvdXQgYQovLyBzcHJpdGUgaXMgaG93IG1hbnkgbmVhci1sdW1pbmFuY2UgY29sb3VycyBpdCBjYXJyaWVzLCBhbmQgdGhhdCBpcyBhIHByb3BlcnR5Ci8vIG9mIGFydCBzb21lYm9keSBkcmV3LgovLwovLyBnbm8ubGFuZC9yL2cxN2tocXB1a2VlczQyMzdkdG4zYXN0emFwbXA0NjJ2amhzejZzdDQvc2V0dGxlcnMvbmZ0OnRva2VuLzI1Ci8vIFRoZSBTZXR0bGVycyBhcnQgaXMgZGVkaWNhdGVkIHRvIHRoZSBwdWJsaWMgZG9tYWluIHVuZGVyIENDMCAxLjAuCnZhciBzZXR0bGVyMjVQYWwgPSBQYWxldHRleyIjZjNlM2M5IiwgIiMyYTFhMmUiLCAiI2ZmYjQ1YSIsICIjYjU2MDFjIiwgIiNmMDhhMmEiLCAiI2I1NzY1MCIsICIjZDk5YTZjIiwgIiM3ZjUyMzQiLCAiIzFiMTYyNiIsICIjZjA4YzdjIiwgIiNmZmIwYTAiLCAiI2M4NjQ1YSIsICIjYTg3NDRlIiwgIiM1NzM2MjIiLCAiIzVmYjBlOCIsICIjMmI2NDlhIiwgIiMzZjhmZDEiLCAiIzZiM2YyMiIsICIjNmE0MTI2IiwgIiM0NjI3MWEifQoKdmFyIHNldHRsZXIyNVJvd3MgPSBbXXN0cmluZ3sKCSIwMDAwMDAwMDAwMDAwMDAxMTAwMDAwMDAwMDAwMDAwMCIsCgkiMDAwMDAwMDAwMDAwMDAxMjMxMDAwMDAwMDAwMDAwMDAiLAoJIjAwMDAwMDAwMDAwMDAwMTQ0MTAwMDAwMDAwMDAwMDAwIiwKCSIwMDAwMDAwMDAwMDAwMTI0NDMxMDAwMDAwMDAwMDAwMCIsCgkiMDAwMDAwMDAwMDAwMDE0NDQ0MTAwMDAwMDAwMDAwMDAiLAoJIjAwMDAwMDAwMDAwMDEyNDQ0NDMxMDAwMDAwMDAwMDAwIiwKCSIwMDAwMDAwMDAwMDAxNDQ0NDQ0MTAwMDAwMDAwMDAwMCIsCgkiMDAwMDAwMDAwMDAxMjQ0NDQ0NDMxMDAwMDAwMDAwMDAiLAoJIjAwMDAwMDAwMDAwMTQ0NDQ0NDQ0MTAwMDAwMDAwMDAwIiwKCSIwMDAwMDAwMDAwMTI0NDQ0NDQ0NDMxMDAwMDAwMDAwMCIsCgkiMDAwMDAwMDAwMDE0NDQ0NDQ0NDQ0MTAwMDAwMDAwMDAiLAoJIjAwMDAwMDAwMTI0NDQ0NDQ0NDQ0NDQzMTAwMDAwMDAwIiwKCSIwMDAwMDAwMDEzMzMzMzMzMzMzMzMzMzEwMDAwMDAwMCIsCgkiMDAwMDAwMDAwMDE1NTU1NTU1NTU1MTAwMDAwMDAwMDAiLAoJIjAwMDAwMDAwMDAxNjc3NzY2Nzc3NjEwMDAwMDAwMDAwIiwKCSIwMDAwMDAwMDAxNjY4NjY2NjY2ODY2MTAwMDAwMDAwMCIsCgkiMDAwMDAwMDAxNTY2ODY2OTk2Njg2NjUxMDAwMDAwMDAiLAoJIjAwMDAwMDAwMDAxNjY2YTk5YjY2NjEwMDAwMDAwMDAwIiwKCSIwMDAwMDAwMDAxYzc3N2JiYmI3NzdkMTAwMDAwMDAwMCIsCgkiMDAwMDAwMDAxMWM3Nzc3Nzc3Nzc3ZDExMDAwMDAwMDAiLAoJIjAwMDAwMDAxZTFjNzc3ZDc3ZDc3N2QxZjEwMDAwMDAwIiwKCSIwMDAwMDAwMWVnMWM3N2Q3N2Q3N2QxZ2YxMDAwMDAwMCIsCgkiMDAwMDAwMDFlZzFjN2Q3Nzc3ZDdkMWdmMTAwMDAwMDAiLAoJIjAwMDAwMDE2ZWdnMWM3ZDc3ZDdkMWdnZjYxMDAwMDAwIiwKCSIwMDAwMDAxNWVnZzFjNzc3Nzc3ZDFnZ2Y1MTAwMDAwMCIsCgkiMDAwMDAwMDFoaGhoMWM3ZGQ3ZDFoaGhoMTAwMDAwMDAiLAoJIjAwMDAwMDAxZWdnZ2cxYzc3ZDFnZ2dnZjEwMDAwMDAwIiwKCSIwMDAwMDAwMWZmZmZmZjFjZDFmZmZmZmYxMDAwMDAwMCIsCgkiMDAwMDAwMDAwMWlpaWlpMTFpaWlpaTEwMDAwMDAwMDAiLAoJIjAwMDAwMDAwMDFpaWlpaTExaWlpaWkxMDAwMDAwMDAwIiwKCSIwMDAwMDAwMDAxampqamoxMWpqampqMTAwMDAwMDAwMCIsCgkiMDAwMDAwMDAwMTExMTExMTExMTExMTEwMDAwMDAwMDAiLAp9CgpmdW5jIHNldHRsZXIyNSgpICpQaXggewoJcCA6PSBOZXdQaXgobGVuKHNldHRsZXIyNVJvd3NbMF0pLCBsZW4oc2V0dGxlcjI1Um93cyksIHNldHRsZXIyNVBhbCkKCWZvciB5LCByb3cgOj0gcmFuZ2Ugc2V0dGxlcjI1Um93cyB7CgkJZm9yIHgsIHIgOj0gcmFuZ2Ugcm93IHsKCQkJdmFyIGkgaW50CgkJCWlmIHIgPj0gJzAnICYmIHIgPD0gJzknIHsKCQkJCWkgPSBpbnQociAtICcwJykKCQkJfSBlbHNlIHsKCQkJCWkgPSBpbnQoci0nYScpICsgMTAKCQkJfQoJCQlwLlNldCh4LCB5LCB1aW50OChpKSkKCQl9Cgl9CglyZXR1cm4gcAp9CgovLyBUZXN0U2V0dGxlcjI1IGlzIHRoZSBmaW5kaW5nIG1lYXN1cmVkIG9uIHJlYWwgYXJ0IHJhdGhlciB0aGFuIG9uIGEgZml4dHVyZQovLyBjaG9zZW4gdG8gc2hvdyBpdC4KLy8KLy8gU2V0dGxlciAjMjUgY2FycmllcyAyMCBwYWxldHRlIGVudHJpZXMuIEtleWVkIG9uIHRoZSBwYWxldHRlIGluZGV4LCBhbGwgMjAKLy8gc3Vydml2ZSBpbnRvIHRoZSB0ZXh0LiBLZXllZCBvbiBsdW1pbmFuY2UsIGEgdGVuLXN0ZXAgcmFtcCByZXNvbHZlcyB0aGVtIHRvCi8vIDk6IGVsZXZlbiBvZiB0aGUgYXJ0aXN0J3MgdHdlbnR5IGNvbG91cnMgc3RvcCBleGlzdGluZywgYW5kIHRoZSBzaGFwZXMKLy8gYmV0d2VlbiB0aGVtIGdvIHdpdGggaXQuCi8vCi8vIFRoYXQgaXMgdGhlIHdob2xlIGFyZ3VtZW50IGZvciBHbHlwaHMgYmVpbmcgdGhlIGRlZmF1bHQgYW5kIFJhbXAgYmVpbmcgdGhlCi8vIHRoaW5nIHlvdSBhc2sgZm9yLgpmdW5jIFRlc3RTZXR0bGVyMjVQYWxldHRlQmVhdHNMdW1pbmFuY2UodCAqdGVzdGluZy5UKSB7CglnbHlwaHMgOj0gc2V0dGxlcjI1KCkuQ2FudmFzKEdseXBocykuVGV4dCgpCglyYW1wIDo9IHNldHRsZXIyNSgpLkNhbnZhcyhSYW1wKS5UZXh0KCkKCgkvLyBkaXN0aW5jdFJ1bmVzIGNvdW50cyB0aGUgbmV3bGluZSB0b28sIHNvIGJvdGggZmlndXJlcyBhcmUgY29sb3VycyArIDEuCgl1YXNzZXJ0LkVxdWFsKHQsIDIxLCBkaXN0aW5jdFJ1bmVzKGdseXBocyksICJldmVyeSBwYWxldHRlIGVudHJ5IHN1cnZpdmVzIikKCXVhc3NlcnQuRXF1YWwodCwgMTAsIGRpc3RpbmN0UnVuZXMocmFtcCksICJ0aGUgcmFtcCByZXNvbHZlcyAyMCBjb2xvdXJzIHRvIDkiKQoJdWFzc2VydC5UcnVlKHQsIGRpc3RpbmN0UnVuZXMoZ2x5cGhzKSA+IGRpc3RpbmN0UnVuZXMocmFtcCksICJnbHlwaHMgc3RyaWN0bHkgZmluZXIiKQp9CgovLyBUZXN0U2V0dGxlcjI1U1ZHSXNPbmVQYXRoUGVyQ29sb3VyIHBpbnMgdGhlIGVuY29kaW5nIHRoYXQga2VlcHMgYSBzcHJpdGUKLy8gc21hbGwgZW5vdWdoIGZvciBhIHJlYWxtIHRvIGVtaXQuIDIwIGNvbG91cnMsIDIwIHBhdGhzLCBhbmQgNCw1MzIgYnl0ZXMgd2hlcmUKLy8gb25lIHJlY3RhbmdsZSBwZXIgcnVuIGNvc3QgMjAsNjI1LgpmdW5jIFRlc3RTZXR0bGVyMjVTVkdJc09uZVBhdGhQZXJDb2xvdXIodCAqdGVzdGluZy5UKSB7Cglkb2MgOj0gc2V0dGxlcjI1KCkuU1ZHKDgpLlN0cmluZygpCgl1YXNzZXJ0LkVxdWFsKHQsIDIwLCBzdHJpbmdzLkNvdW50KGRvYywgIjxwYXRoIiksICJvbmUgcGF0aCBwZXIgcGFsZXR0ZSBlbnRyeSIpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIHN0cmluZ3MuQ291bnQoZG9jLCAiPHJlY3QiKSwgIm5vIHJlY3RhbmdsZXMgYXQgYWxsIikKCXVhc3NlcnQuVHJ1ZSh0LCBsZW4oZG9jKSA8IDYwMDAsICJhIDMyeDMyIHNwcml0ZSBzdGF5cyB3ZWxsIHVuZGVyIDYgS0IiKQoJLy8gU2NhbGluZyBpcyBhIHZpZXdCb3ggY2hhbmdlLCBzbyB0aGUgcGF0aCBkYXRhLCB3aGljaCBpcyBhbGwgb2YgdGhlIHNpemUsCgkvLyBpcyBieXRlLWlkZW50aWNhbCBhdCBhbnkgc2NhbGUuIE9ubHkgdGhlIGNhbnZhcyB3aWR0aCBhbmQgaGVpZ2h0IG1vdmUsCgkvLyBhbmQgaGVyZSB0aGF0IGlzIG9uZSBkaWdpdCBlYWNoIGJldHdlZW4gIjMyIiBhbmQgIjI1NiIuCglvbmUgOj0gc2V0dGxlcjI1KCkuU1ZHKDEpLlN0cmluZygpCgl1YXNzZXJ0LkVxdWFsKHQsIHBhdGhzKG9uZSksIHBhdGhzKGRvYyksICJwYXRoIGRhdGEgaXMgaWRlbnRpY2FsIGF0IGFueSBzY2FsZSIpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIGxlbihkb2MpLWxlbihvbmUpLCAib25seSB0aGUgY2FudmFzIGRpbWVuc2lvbnMgZ3JvdyIpCn0KCi8vIHBhdGhzIHJldHVybnMgdGhlIGRvY3VtZW50IGZyb20gaXRzIGZpcnN0IDxwYXRoPiBvbiwgd2hpY2ggaXMgZXZlcnl0aGluZwovLyBzY2FsZSBjYW5ub3QgYWZmZWN0LgpmdW5jIHBhdGhzKGRvYyBzdHJpbmcpIHN0cmluZyB7CglpIDo9IHN0cmluZ3MuSW5kZXgoZG9jLCAiPHBhdGgiKQoJaWYgaSA8IDAgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuIGRvY1tpOl0KfQoKLy8gVGVzdFNldHRsZXIyNVRleHRJc1NtYWxsZXJUaGFuSXRzUGljdHVyZSBpcyB0aGUgcmVhc29uIGEgdGV4dCB0YXJnZXQgaXMgd29ydGgKLy8gaGF2aW5nIGF0IGFsbCwgYmV5b25kIHJlYWRhYmlsaXR5OiB0aGUgQVNDSUkgZm9ybSBvZiB0aGlzIE5GVCBpcyBhIHRoaXJkIG9mCi8vIHRoZSBTVkcuCmZ1bmMgVGVzdFNldHRsZXIyNVRleHRJc1NtYWxsZXJUaGFuSXRzUGljdHVyZSh0ICp0ZXN0aW5nLlQpIHsKCXRleHQgOj0gc2V0dGxlcjI1KCkuQ2FudmFzKEdseXBocykuVGV4dCgpCgl1YXNzZXJ0LkVxdWFsKHQsIDE0NjksIGxlbih0ZXh0KSwgImdseXBoIHRleHQgc2l6ZSIpCgl1YXNzZXJ0LlRydWUodCwgbGVuKHRleHQpIDwgbGVuKHNldHRsZXIyNSgpLlNWRyg4KS5TdHJpbmcoKSksICJ0ZXh0IGlzIHRoZSBjaGVhcGVyIGZvcm0iKQp9CgovLyBUZXN0U2V0dGxlcjI1UmFtcENvbmZ1c2VzSHVlRm9yQnJpZ2h0bmVzcyBpcyB0aGUgcGFydCBvZiB0aGUgZmluZGluZyB0aGF0IGlzCi8vIGVhc3kgdG8gbWlzczogdGhlIHJhbXAncyBjb2xsaXNpb25zIGFyZSBub3QgYmV0d2VlbiBuZWFyLWlkZW50aWNhbCBzaGFkZXMuCi8vIFR3byBjb2xvdXJzIGEgaHVtYW4gd291bGQgbmV2ZXIgY29uZnVzZSwgYW4gb3JhbmdlIGhhdCBhbmQgYSBza3ktYmx1ZSB0dW5pYywKLy8gY29tZSBvdXQgYXMgdGhlIHNhbWUgY2hhcmFjdGVyLCBiZWNhdXNlIGx1bWluYW5jZSBjYW5ub3QgdGVsbCBhIGh1ZSBmcm9tIGEKLy8gaHVlLgpmdW5jIFRlc3RTZXR0bGVyMjVSYW1wQ29uZnVzZXNIdWVGb3JCcmlnaHRuZXNzKHQgKnRlc3RpbmcuVCkgewoJb3JhbmdlIDo9IHNldHRsZXIyNVBhbC5Db2xvcig0KSAvLyAjZjA4YTJhLCB0aGUgaGF0CglibHVlIDo9IHNldHRsZXIyNVBhbC5Db2xvcigxNikgIC8vICMzZjhmZDEsIHRoZSB0dW5pYwoKCXVhc3NlcnQuRXF1YWwodCwgMTUyLCBMdW1pbmFuY2Uob3JhbmdlKSwgIm9yYW5nZSBoYXQiKQoJdWFzc2VydC5FcXVhbCh0LCAxMzAsIEx1bWluYW5jZShibHVlKSwgInNreSB0dW5pYyIpCgl1YXNzZXJ0Lk5vdEVxdWFsKHQsIG9yYW5nZSwgYmx1ZSwgInRoZXkgYXJlIGRpZmZlcmVudCBjb2xvdXJzIikKCXVhc3NlcnQuRXF1YWwodCwgcmFtcEdseXBoKG9yYW5nZSksIHJhbXBHbHlwaChibHVlKSwgImFuZCB0aGUgc2FtZSByYW1wIGdseXBoIikKCgkvLyBLZXllZCBvbiB0aGUgcGFsZXR0ZSBpbmRleCBpbnN0ZWFkLCB0aGV5IGNhbm5vdCBjb2xsaWRlOiB0aGUgaW5kaWNlcyBhcmUKCS8vIGRpZmZlcmVudCwgc28gdGhlIGdseXBocyBhcmUuCgl1YXNzZXJ0Lk5vdEVxdWFsKHQsCgkJRGVmYXVsdEdseXBoc1s0JWxlbihEZWZhdWx0R2x5cGhzKV0sCgkJRGVmYXVsdEdseXBoc1sxNiVsZW4oRGVmYXVsdEdseXBocyldLAoJCSJnbHlwaHMga2VlcCB0aGVtIGFwYXJ0IikKfQoKZnVuYyByYW1wR2x5cGgoYyBpbnQpIHJ1bmUgewoJcmV0dXJuIERlZmF1bHRSYW1wW0x1bWluYW5jZShjKSpsZW4oRGVmYXVsdFJhbXApLzI1Nl0KfQoathwKB3N2Zy5nbm8SqhxwYWNrYWdlIGFydAoKaW1wb3J0ICgKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL21vdWwvc3ZnL3YwIgopCgovLyBTVkdPcHRzIGNvbmZpZ3VyZXMgW0NhbnZhcy5TVkddLiBUaGUgemVybyB2YWx1ZSBpcyB1c2FibGU6IGV2ZXJ5IGZpZWxkIGZhbGxzCi8vIGJhY2sgdG8gdGhlIGNvbnN0YW50IGJlc2lkZSBpdC4KdHlwZSBTVkdPcHRzIHN0cnVjdCB7CglDZWxsVywgQ2VsbEggaW50ICAgIC8vIGNlbGwgc2l6ZSBpbiBTVkcgdW5pdHM7IDAgbWVhbnMgOCBhbmQgMTYKCUZHLCBCRyAgICAgICBpbnQgICAgLy8gd2hhdCBhIGNlbGwncyBEZWZhdWx0IHJlc29sdmVzIHRvOyBEZWZhdWx0IHN0YXlzIHVuc2V0CglGb250ICAgICAgICAgc3RyaW5nIC8vIGZvbnQtZmFtaWx5OyAiIiBtZWFucyBhIG1vbm9zcGFjZSBzdGFjawp9CgovLyBEZWZhdWx0cyBmb3IgW1NWR09wdHNdLiA4eDE2IGlzIHRoZSB1c3VhbCB0ZXJtaW5hbCBjZWxsIHJhdGlvLCBzbyBhcnQgbGFpZAovLyBvdXQgZm9yIGEgdGVybWluYWwga2VlcHMgaXRzIHByb3BvcnRpb25zLgpjb25zdCAoCglEZWZhdWx0Q2VsbFcgPSA4CglEZWZhdWx0Q2VsbEggPSAxNgoJRGVmYXVsdEZvbnQgID0gInVpLW1vbm9zcGFjZSxTRk1vbm8tUmVndWxhcixNZW5sbyxDb25zb2xhcyxtb25vc3BhY2UiCikKCi8vIFNWRyByZW5kZXJzIHRoZSBjYW52YXMgYXMgYW4gU1ZHIGRvY3VtZW50OiBiYWNrZ3JvdW5kIGNvbG91cnMgYXMgcnVuLWxlbmd0aAovLyByZWN0YW5nbGVzLCBhbmQgb25lIDx0ZXh0PiBlbGVtZW50IHBlciBub24tYmxhbmsgY2VsbCwgY2VudHJlZCBpbiBpdHMgY2VsbCBzbwovLyB0aGUgZ3JpZCBzdGF5cyBhbGlnbmVkIHdoYXRldmVyIHRoZSByZW5kZXJlcidzIGlkZWEgb2YgYSBtb25vc3BhY2UgYWR2YW5jZQovLyB3aWR0aCBpcy4KLy8KLy8gVGhpcyBpcyBob3cgY29sb3VyIHJlYWNoZXMgZ25vd2ViLiBbQ2FudmFzLkFOU0ldIGNhbm5vdDogcmF3IEVTQyBieXRlcyBhcmUKLy8gc3RyaXBwZWQgYnkgcC9udC9tYXJrZG93bi9zYW5pdGl6ZSBhbmQgYXJlIGdhcmJhZ2UgaW4gSFRNTCByZWdhcmRsZXNzLiBBbgovLyBTVkcgY2FycmllcyB0aGUgc2FtZSB0d28gY29sb3VycyBwZXIgY2VsbCB0aHJvdWdoIGEgbWVkaXVtIHRoZSB3ZWIgY2FuIHNob3csCi8vIHdoaWNoIGlzIHRoZSB3aG9sZSBhcmd1bWVudCBmb3IgbWFraW5nIHRoZSB0YXJnZXQgYSBwYXJhbWV0ZXIuCi8vCi8vIE9uZSBlbGVtZW50IHBlciBjZWxsIHJhdGhlciB0aGFuIG9uZSBwZXIgcnVuIGlzIGRlbGliZXJhdGU6IGEgcnVuIG9mIHRleHQKLy8gd291bGQgaGF2ZSB0byBhc3N1bWUgdGhlIGZvbnQncyBhZHZhbmNlIHdpZHRoLCBhbmQgYSByZW5kZXJlciB0aGF0IGRpc2FncmVlZAovLyB3b3VsZCBzaGVhciB0aGUgcGljdHVyZS4gRGVuc2UgcGl4ZWwgYXJ0IHNob3VsZCBnbyB0aHJvdWdoIFtQaXguU1ZHXSBpbnN0ZWFkLAovLyB3aGljaCBpcyBydW4tbGVuZ3RoIGFuZCBoYXMgbm8gZm9udCB0byBnZXQgd3JvbmcuCmZ1bmMgKGMgQ2FudmFzKSBTVkcobyBTVkdPcHRzKSAqc3ZnLkNhbnZhcyB7CgljdywgY2ggOj0gby5DZWxsVywgby5DZWxsSAoJaWYgY3cgPD0gMCB7CgkJY3cgPSBEZWZhdWx0Q2VsbFcKCX0KCWlmIGNoIDw9IDAgewoJCWNoID0gRGVmYXVsdENlbGxICgl9Cglmb250IDo9IG8uRm9udAoJaWYgZm9udCA9PSAiIiB7CgkJZm9udCA9IERlZmF1bHRGb250Cgl9CgoJb3V0IDo9IHN2Zy5OZXdDYW52YXMoYy5XKmN3LCBjLkgqY2gpCglvdXQuV2l0aFZpZXdCb3goMCwgMCwgYy5XKmN3LCBjLkgqY2gpCglvdXQuQWRkU3R5bGUoInRleHQiLCAiZm9udC1mYW1pbHk6Iitmb250KyI7Zm9udC1zaXplOiIraXRvYShjaCkrInB4O3RleHQtYW5jaG9yOm1pZGRsZTtkb21pbmFudC1iYXNlbGluZTpjZW50cmFsIikKCW91dC5BZGRTdHlsZSgicmVjdCIsICJzaGFwZS1yZW5kZXJpbmc6Y3Jpc3BFZGdlcyIpCgoJLy8gQmFja2dyb3VuZHMgZmlyc3QsIGFzIGhvcml6b250YWwgcnVucywgc28gdGhleSBzaXQgdW5kZXIgdGhlIGdseXBocy4KCWZvciB5IDo9IDA7IHkgPCBjLkg7IHkrKyB7CgkJeCA6PSAwCgkJZm9yIHggPCBjLlcgewoJCQliZyA6PSBjLmJnQXQoeCwgeSwgby5CRykKCQkJcnVuIDo9IDEKCQkJZm9yIHgrcnVuIDwgYy5XICYmIGMuYmdBdCh4K3J1biwgeSwgby5CRykgPT0gYmcgewoJCQkJcnVuKysKCQkJfQoJCQlpZiBiZyAhPSBEZWZhdWx0IHsKCQkJCW91dC5BcHBlbmQoc3ZnLk5ld1JlY3RhbmdsZSh4KmN3LCB5KmNoLCBydW4qY3csIGNoLCBIZXgoYmcpKSkKCQkJfQoJCQl4ICs9IHJ1bgoJCX0KCX0KCglmb3IgeSA6PSAwOyB5IDwgYy5IOyB5KysgewoJCWZvciB4IDo9IDA7IHggPCBjLlc7IHgrKyB7CgkJCWNlbGwgOj0gYy5DZWxsc1t5KmMuVyt4XQoJCQlpZiBjZWxsLlIgPT0gJyAnIHx8IGNlbGwuUiA9PSAwIHsKCQkJCWNvbnRpbnVlCgkJCX0KCQkJZmcgOj0gY2VsbC5GRwoJCQlpZiBmZyA9PSBEZWZhdWx0IHsKCQkJCWZnID0gby5GRwoJCQl9CgkJCWZpbGwgOj0gSGV4KGZnKQoJCQlpZiBmaWxsID09ICIiIHsKCQkJCWZpbGwgPSAiY3VycmVudENvbG9yIgoJCQl9CgkJCW91dC5BcHBlbmQoc3ZnLk5ld1RleHQoeCpjdytjdy8yLCB5KmNoK2NoLzIsIGVzY2FwZVhNTChzdHJpbmcoY2VsbC5SKSksIGZpbGwpKQoJCX0KCX0KCXJldHVybiBvdXQKfQoKZnVuYyAoYyBDYW52YXMpIGJnQXQoeCwgeSwgZmFsbGJhY2sgaW50KSBpbnQgewoJYmcgOj0gYy5DZWxsc1t5KmMuVyt4XS5CRwoJaWYgYmcgPT0gRGVmYXVsdCB7CgkJcmV0dXJuIGZhbGxiYWNrCgl9CglyZXR1cm4gYmcKfQoKLy8gZXNjYXBlWE1MIGlzIGhlcmUgYW5kIG5vdCBpbiBwL21vdWwvc3ZnIGJlY2F1c2Ugc3ZnLlRleHQgaW50ZXJwb2xhdGVzIGl0cwovLyBjb250ZW50IHN0cmFpZ2h0IGludG8gdGhlIGRvY3VtZW50OiBhIHJ1bmUgdGhpcyBwYWNrYWdlIGNhbiBsZWdpdGltYXRlbHkKLy8gcHJvZHVjZSwgb3IgYSB0aXRsZSBhIGNhbGxlciB0eXBlZCwgd291bGQgb3RoZXJ3aXNlIGNsb3NlIHRoZSBlbGVtZW50LgpmdW5jIGVzY2FwZVhNTChzIHN0cmluZykgc3RyaW5nIHsKCWlmICFzdHJpbmdzLkNvbnRhaW5zQW55KHMsICImPD5cIiIpIHsKCQlyZXR1cm4gcwoJfQoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCglmb3IgXywgciA6PSByYW5nZSBzIHsKCQlzd2l0Y2ggciB7CgkJY2FzZSAnJic6CgkJCWIuV3JpdGVTdHJpbmcoIiZhbXA7IikKCQljYXNlICc8JzoKCQkJYi5Xcml0ZVN0cmluZygiJmx0OyIpCgkJY2FzZSAnPic6CgkJCWIuV3JpdGVTdHJpbmcoIiZndDsiKQoJCWNhc2UgJyInOgoJCQliLldyaXRlU3RyaW5nKCImcXVvdDsiKQoJCWRlZmF1bHQ6CgkJCWIuV3JpdGVSdW5lKHIpCgkJfQoJfQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKZnVuYyBpdG9hKHYgaW50KSBzdHJpbmcgewoJaWYgdiA9PSAwIHsKCQlyZXR1cm4gIjAiCgl9CgluZWcgOj0gdiA8IDAKCWlmIG5lZyB7CgkJdiA9IC12Cgl9Cgl2YXIgYnVmIFsyMF1ieXRlCglpIDo9IGxlbihidWYpCglmb3IgdiA+IDAgewoJCWktLQoJCWJ1ZltpXSA9IGJ5dGUoJzAnICsgdiUxMCkKCQl2IC89IDEwCgl9CglpZiBuZWcgewoJCWktLQoJCWJ1ZltpXSA9ICctJwoJfQoJcmV0dXJuIHN0cmluZyhidWZbaTpdKQp9CiINMjMwMDAwMDB1Z25vdBITCPC7+5gBEgs0ODExODV1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQIAUko/jSwAOonEP0X+r2647UW246Nfe75rO0n/ni2DyBJAScvNEmBKDndCFt7Sd9SfH7xCW5BMKp3ldage1jNK+iRRu90DV7rYDbc4DgHexSiMp4Uzindw68fxbZSEy/aS4BooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==