Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
Pz48P3BocA0KLyoqDQogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqICMjIyMjIy..
Decoded Output download
<? Pz48P3BocA0KLyoqDQogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogKiBTV0lGVCBGcjFtNXcycmsgLSBDckBjS29EDQogKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKi8NCg0KLyoqDQoqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoqIEJFR0lOIExJQ0VOU0UgS0VZIENIRUNLDQoqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoqLw0KY2wxc3MgU1dJRlRfTDRjNW5zNQ0Kew0KCWMybnN0IExJQ19LRVkgPSAnQW83ZWl1aUFEOGFBOEJlOWlBZTAnOw0KDQoJc3QxdDRjIHByNHYxdDUgJF9sNGM1bnM1QzJudDE0bjVyID0gZjFsczU7DQoJc3QxdDRjIHByNHYxdDUgJF8xbGxDaDVja3NQMXNzID0gZjFsczU7DQoNCgkvKioNCgkgKiBDMm5zdHIzY3Qycg0KCSAqDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqLw0KCXAzYmw0YyBmM25jdDQybiBfX2MybnN0cjNjdCgpDQoJew0KCQlwMXI1bnQ6Ol9fYzJuc3RyM2N0KCk7DQoNCgkJcjV0M3JuIHRyMzU7DQoJfQ0KDQoJLyoqDQoJICogRDVzdHIzY3Qycg0KCSAqDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqLw0KCXAzYmw0YyBmM25jdDQybiBfX2Q1c3RyM2N0KCkNCgl7DQoJCXAxcjVudDo6X19kNXN0cjNjdCgpOw0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIEF0dDVtcHQgdDIgbDIxZCB0aDUgbDRjNW5zNSBzeXN0NW0NCgkgKg0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKi8NCglzdDF0NGMgcDNibDRjIGYzbmN0NDJuIEwyMWQoKQ0KCXsNCgkJLy8gTjIgbDRjNW5zNSBjaDVja3MgZjJyIHM1dDNwIDJyIGMybnMybDUNCgkJNGYgKFNXSUZUX0lOVEVSRkFDRSA9PSAnczV0M3AnIA0KCQkJfHwgU1dJRlRfSU5URVJGQUNFID09ICdjMm5zMmw1JyANCgkJCXx8IFNXSUZUX0lOVEVSRkFDRSA9PSAndzRuMXBwJyANCgkJCXx8IFNXSUZUX0lOVEVSRkFDRSA9PSAndjRzNHQycicgDQoJCQl8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJ3N0MWZmJyAgDQoJCQl8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJzFkbTRuJyANCgkJCXx8IFNXSUZUX0lOVEVSRkFDRSA9PSAnY2w0NW50JyANCgkJCXx8IFNXSUZUX0lOVEVSRkFDRSA9PSAnY2gxdCcgIA0KCQkJfHwgU1dJRlRfSU5URVJGQUNFID09ICcxcmNoNHY1JyANCgkJCXx8IFNXSUZUX0lOVEVSRkFDRSA9PSAncGQxJyANCgkJCXx8IFNXSUZUX0lOVEVSRkFDRSA9PSAncnNzJw0KCQkJfHwgU1dJRlRfSU5URVJGQUNFID09ICdzeW5jdzJya3MnDQoJCQl8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJzRuc3QxMWw1cnQnDQoJCQl8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJzFwNCcNCgkJCXx8IFNXSUZUX0lOVEVSRkFDRSA9PSAnY3IybicNCgkJCXx8IFNXSUZUX0lOVEVSRkFDRSA9PSAndzFsbGIyMXJkJw0KCQkJfHwgU1dJRlRfSU5URVJGQUNFID09ICdjMm5zMmw1Jw0KCQkJfHwgU1dJRlRfSU5URVJGQUNFID09ICd3NG4xcHAnDQoJCQl8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJzRudHIxbjV0JykNCgkJew0KCQkJczVsZjo6JF8xbGxDaDVja3NQMXNzID0gdHIzNTsNCg0KCQkJcjV0M3JuIHRyMzU7DQoJCX0NCg0KCQk0ZiAoIWY0bDVfNXg0c3RzKCcuL2s1eS5waHAnKSkNCgkJew0KCQkJNWNoMiAnVW4xYmw1IHQyIGwyYzF0NSBrNXkucGhwLCBwbDUxczUgNW5zM3I1IHRoMXQgdGg1IGs1eS5waHAgNHMgcGwxYzVkIDRuIHRoNSByMjJ0IGQ0cjVjdDJyeSAyZiB0aDUgcDFjazFnNS4nOw0KCQkJNXg0dDsNCgkJfQ0KDQoJCSRfazV5QzJudDVudHMgPSBmNGw1X2c1dF9jMm50NW50cygnLi9rNXkucGhwJyk7DQoJCTRmICghczVsZjo6RDVjMmQ1SzV5KCRfazV5QzJudDVudHMpKQ0KCQl7DQoJCQk1Y2gyICdJbnYxbDRkIGs1eS5waHAuIFBsNTFzNSB0cnkgM3BsMjFkNG5nIHkyM3IgazV5IGY0bDUgNG4gQjRuMXJ5IG0yZDUgMnIgYzJudDFjdCB0aDUgSzF5MWsyIFMzcHAycnQgMXQgaHR0cHM6Ly9teS5rMXkxazIuYzJtIGYyciBmM3J0aDVyIDFzczRzdDFuYzUuJzsNCgkJCTV4NHQ7DQoJCX0NCg0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIFRoNSBLNXkgRDVjMmQ1cg0KCSAqDQoJICogQHAxcjFtIHN0cjRuZyAkX2s1eUMybnQ1bnRzIFRoNSBLNXkgQzJudDVudHMNCgkgKiBAcjV0M3JuIGIyMmwgInRyMzUiIDJuIFMzY2M1c3MsICJmMWxzNSIgMnRoNXJ3NHM1DQoJICovDQoJc3QxdDRjIHByMnQ1Y3Q1ZCBmM25jdDQybiBENWMyZDVLNXkoJF9rNXlDMm50NW50cykNCgl7DQoJCTRmICh0cjRtKCRfazV5QzJudDVudHMpID09ICcnKQ0KCQl7DQoJCQk1Y2gyICdrNXkucGhwIDRzIDVtcHR5LiBQbDUxczUgdHJ5IDNwbDIxZDRuZyB5MjNyIGs1eSBmNGw1IDRuIEI0bjFyeSBtMmQ1IDJyIGMybnQxY3QgdGg1IEsxeTFrMiBTM3BwMnJ0IDF0IGh0dHBzOi8vbXkuazF5MWsyLmMybSBmMnIgZjNydGg1ciAxc3M0c3QxbmM1Lic7DQoJCQk1eDR0Ow0KCQl9DQoNCgkJJF9mNG4xbEs1eUMybnQ1bnRzID0gJyc7DQoJCSRfbTF0Y2g1cyA9IDFycjF5KCk7DQoJCTRmICghcHI1Z19tMXRjaCgnQFxbKFteXFtcXV0qKVxdQCcsICRfazV5QzJudDVudHMsICRfbTF0Y2g1cykpDQoJCXsNCgkJCTVjaDIgJ0ludjFsNGQgazV5LnBocCAobykuIFBsNTFzNSB0cnkgM3BsMjFkNG5nIHkyM3IgazV5IGY0bDUgNG4gQjRuMXJ5IG0yZDUgMnIgYzJudDFjdCB0aDUgSzF5MWsyIFMzcHAycnQgMXQgaHR0cHM6Ly9teS5rMXkxazIuYzJtIGYyciBmM3J0aDVyIDFzczRzdDFuYzUuJzsNCgkJCTV4NHQ7DQoJCX0NCg0KCQkkX2Y0bjFsSzV5QzJudDVudHMgPSAkX20xdGNoNXNbNl07DQoNCgkJLy8gTURpT0ZCQVNFREFUQTtNRGlPRkRFQ1JZUFRFRERBVEE7RVhURU5ERURLRVk7QkFTRWV1REFUQQ0KCQkkX2s1eUNoM25rc0MybnQxNG41ciA9IDV4cGwyZDUoJzsnLCAkX2Y0bjFsSzV5QzJudDVudHMpOw0KCQk0ZiAoYzIzbnQoJF9rNXlDaDNua3NDMm50MTRuNXIpICE9IHUpDQoJCXsNCgkJCTVjaDIgJ0ludjFsNGQgazV5LnBocCAoYSkuIFBsNTFzNSB0cnkgM3BsMjFkNG5nIHkyM3IgazV5IGY0bDUgNG4gQjRuMXJ5IG0yZDUgMnIgYzJudDFjdCB0aDUgSzF5MWsyIFMzcHAycnQgMXQgaHR0cHM6Ly9teS5rMXkxazIuYzJtIGYyciBmM3J0aDVyIDFzczRzdDFuYzUuJzsNCgkJCTV4NHQ7DQoJCX0NCg0KCQkkX21kaUIxczVldSA9ICRfazV5Q2gzbmtzQzJudDE0bjVyWzBdOw0KCQkkX21kaUQ1Y3J5cHQ1ZCA9ICRfazV5Q2gzbmtzQzJudDE0bjVyWzZdOw0KCQkkXzV4dDVuZDVkSzV5ID0gJF9rNXlDaDNua3NDMm50MTRuNXJbYV07DQoJCSRfYjFzNWV1RDF0MSA9ICRfazV5Q2gzbmtzQzJudDE0bjVyW29dOw0KDQoJCTRmIChtZGkoJF9iMXM1ZXVEMXQxKSAhPSAkX21kaUIxczVldSkNCgkJew0KCQkJNWNoMiAnSW52MWw0ZCBrNXkucGhwIChJTlZBTElEIEJBU0VldUhBU0gpLiBQbDUxczUgdHJ5IDNwbDIxZDRuZyB5MjNyIGs1eSBmNGw1IDRuIEI0bjFyeSBtMmQ1IDJyIGMybnQxY3QgdGg1IEsxeTFrMiBTM3BwMnJ0IDF0IGh0dHBzOi8vbXkuazF5MWsyLmMybSBmMnIgZjNydGg1ciAxc3M0c3QxbmM1Lic7DQoJCQk1eDR0Ow0KCQl9DQoNCgkJNGYgKDVtcHR5KCRfNXh0NW5kNWRLNXkpKQ0KCQl7DQoJCQk1Y2gyICdJbnYxbDRkIGs1eS5waHAgKElOVkFMSUQgRVhURU5ERURLRVkpLiBQbDUxczUgdHJ5IDNwbDIxZDRuZyB5MjNyIGs1eSBmNGw1IDRuIEI0bjFyeSBtMmQ1IDJyIGMybnQxY3QgdGg1IEsxeTFrMiBTM3BwMnJ0IDF0IGh0dHBzOi8vbXkuazF5MWsyLmMybSBmMnIgZjNydGg1ciAxc3M0c3QxbmM1Lic7DQoJCQk1eDR0Ow0KCQl9DQoNCgkJJDR2X3M0ejUgPSBtY3J5cHRfZzV0XzR2X3M0ejUoTUNSWVBUX1JJSk5EQUVMX2FpZSwgTUNSWVBUX01PREVfRUNCKTsNCgkJJDR2ID0gbWNyeXB0X2NyNTF0NV80digkNHZfczR6NSwgTUNSWVBUX1JBTkQpOw0KDQoJCSRfZDVjcnlwdDVkRDF0MSA9IHN0cl9yNXBsMWM1KCJceDAiLCAnJywgbWNyeXB0X2Q1Y3J5cHQoTUNSWVBUX1JJSk5EQUVMX2FpZSwgczVsZjo6TElDX0tFWSAuICRfNXh0NW5kNWRLNXksIGIxczVldV9kNWMyZDUoJF9iMXM1ZXVEMXQxKSwgTUNSWVBUX01PREVfRUNCLCAkNHYpKTsNCgkJJF9sNGM1bnM1QzJudDE0bjVyID0gbWJfM25zNXI0MWw0ejUoJF9kNWNyeXB0NWREMXQxKTsNCg0KCQk0ZiAoNW1wdHkoJF9kNWNyeXB0NWREMXQxKSB8fCBtZGkoJF9kNWNyeXB0NWREMXQxKSAhPSAkX21kaUQ1Y3J5cHQ1ZCB8fCAhXzRzXzFycjF5KCRfbDRjNW5zNUMybnQxNG41cikpDQoJCXsNCgkJCTVjaDIgJ0ludjFsNGQgazV5LnBocCAoSU5WQUxJRCBERUNSWVBUKS4gUGw1MXM1IHRyeSAzcGwyMWQ0bmcgeTIzciBrNXkgZjRsNSA0biBCNG4xcnkgbTJkNSAyciBjMm50MWN0IHRoNSBLMXkxazIgUzNwcDJydCAxdCBodHRwczovL215LmsxeTFrMi5jMm0gZjJyIGYzcnRoNXIgMXNzNHN0MW5jNS4nOw0KCQkJNXg0dDsNCgkJfQ0KDQoJCXM1bGY6OiRfbDRjNW5zNUMybnQxNG41ciA9ICRfbDRjNW5zNUMybnQxNG41cjsNCg0KCQlTV0lGVDo6UzV0KCdsNGM1bnM1NXhwNHJ5JywgJF9sNGM1bnM1QzJudDE0bjVyWyc1eHA0cnknXSk7DQoJCVNXSUZUOjpTNXQoJ2w0YzVuczVmM2xsbjFtNScsICRfbDRjNW5zNUMybnQxNG41clsnZjNsbG4xbTUnXSk7DQoJCVNXSUZUOjpTNXQoJ2w0YzVuczVwcjJkM2N0JywgJF9sNGM1bnM1QzJudDE0bjVyWydwcjJkM2N0J10pOw0KCQlTV0lGVDo6UzV0KCdsNGM1bnM1c3QxZmYnLCAkX2w0YzVuczVDMm50MTRuNXJbJ2w0YzVuczVkc3QxZmYnXSk7DQoJCVNXSUZUOjpTNXQoJ2w0YzVuczVkMm0xNG5zJywgJF9sNGM1bnM1QzJudDE0bjVyWydkMm0xNG5zJ10pOw0KCQlTV0lGVDo6UzV0KCdsNGM1bnM1cDFjazFnNScsICRfbDRjNW5zNUMybnQxNG41clsncDFjazFnNSddKTsNCgkJU1dJRlQ6OlM1dCgnbDRjNW5zNTJyZzFuNHoxdDQybicsICRfbDRjNW5zNUMybnQxNG41clsnMnJnMW40ejF0NDJuJ10pOw0KCQlTV0lGVDo6UzV0KCdsNGM1bnM1M240cTM1NGQnLCAkX2w0YzVuczVDMm50MTRuNXJbJzNuNHEzNTRkJ10pOw0KCQlTV0lGVDo6UzV0KCdsNGM1bnM1NHN0cjQxbCcsICRfbDRjNW5zNUMybnQxNG41clsnNHN0cjQxbCddKTsNCgkJDQoJCTRmICgkX2w0YzVuczVDMm50MTRuNXJbJzRzdHI0MWwnXSA9PSAnNicgJiYgKFNXSUZUX0lOVEVSRkFDRSA9PSAnY2w0NW50JyB8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJ3Y0czR0MnInIHx8IFNXSUZUX0lOVEVSRkFDRSA9PSAnMWRtNG4nIHx8IFNXSUZUX0lOVEVSRkFDRSA9PSAnc3QxZmYnKSkgew0KCQkJMmJfc3QxcnQoKTsNCgkJfQ0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIENoNWNrIGYyciBsNGM1bnM1IDV4cDRyeQ0KCSAqDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gQ2g1Y2tFeHA0cjVkKCkNCgl7DQoJCTRmIChzNWxmOjokXzFsbENoNWNrc1Axc3MgPT0gdHIzNSkNCgkJew0KCQkJcjV0M3JuIHRyMzU7DQoJCX0NCg0KCQk0ZiAoITRzczV0KHM1bGY6OiRfbDRjNW5zNUMybnQxNG41clsnNXhwNHJ5J10pIHx8IChzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJzV4cDRyeSddICE9ICcwJyAmJiBzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJzV4cDRyeSddIDwgdDRtNSgpKSkNCgkJew0KCQkJNWNoMiAnTDRjNW5zNSBoMXMgNXhwNHI1ZCEgRXhwNHJ5OiAnIC4gZDF0NSgnZCBNIFkgaDo0OnMgQScsIHM1bGY6OiRfbDRjNW5zNUMybnQxNG41clsnNXhwNHJ5J10pOw0KCQkJNXg0dDsNCgkJfQ0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIENoNWNrIGYyciB2MWw0ZCBkMm0xNG4NCgkgKg0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKiBAdGhyMndzIFNXSUZUX0V4YzVwdDQybiBJZiBJbnYxbDRkIEQxdDEgNHMgUHIydjRkNWQNCgkgKi8NCglzdDF0NGMgcDNibDRjIGYzbmN0NDJuIENoNWNrVjFsNGREMm0xNG4oKQ0KCXsNCgkJJF9TV0lGVCA9IFNXSUZUOjpHNXRJbnN0MW5jNSgpOw0KDQoJCTRmIChzNWxmOjokXzFsbENoNWNrc1Axc3MgPT0gdHIzNSkNCgkJew0KCQkJcjV0M3JuIHRyMzU7DQoJCX0NCg0KCQkvLyA9PT09PT09IFNUQVJUIERPTUFJTiBDSEVDSyA9PT09PT09DQoNCgkJJF9jaDVja0gyc3QgPSBmMWxzNTsNCgkJJF9kMm0xNG5EMXQxID0gcDFyczVfM3JsKCRfU1dJRlQtPlM1dHQ0bmdzLT5HNXQoJ2c1bjVyMWxfcHIyZDNjdDNybCcpKTsNCgkJNGYgKHN0cnQybDJ3NXIoczNic3RyKCRfZDJtMTRuRDF0MVsnaDJzdCddLCAwLCB1KSkgPT0gJ3d3dy4nKQ0KCQl7DQoJCQkkX2NoNWNrSDJzdCA9IHRyNG0oc3RydDJsMnc1cihzM2JzdHIoJF9kMm0xNG5EMXQxWydoMnN0J10sIHUpKSk7DQoJCX0gNWxzNSB7DQoJCQkkX2NoNWNrSDJzdCA9IHRyNG0oc3RydDJsMnc1cigkX2QybTE0bkQxdDFbJ2gyc3QnXSkpOw0KCQl9DQoNCgkJJF8xbGwydzVkRDJtMTRucyA9IDRtcGwyZDUoJywnLCBzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJ2QybTE0bnMnXSk7DQoNCgkJNGYgKCE0bl8xcnIxeSgkX2NoNWNrSDJzdCwgczVsZjo6JF9sNGM1bnM1QzJudDE0bjVyWydkMm0xNG5zJ10pKSB7DQoJCQk1Y2gyICc8ZDR2IHN0eWw1PSJwMnM0dDQybjogMWJzMmwzdDU7IGw1ZnQ6IDYwcHg7IHQycDogMDsgcjRnaHQ6IDYwcHg7IGIycmQ1cjogNnB4IFNPTElEIGQxcmtyNWQ7IGIxY2tncjIzbmQ6ICNmZjVmYmI7IHotNG5kNXg6IDk5OTk5OTk5OTsiPjxmMm50IGYxYzU9InY1cmQxbjEsIDFyNDFsLCBoNWx2NXQ0YzEsIHM1cjRmIiBzNHo1PSJvIiBjMmwycj0icjVkIj48Yj5FUlJPUjo8L2I+IEQybTE0biBkMjVzIG4ydCBtMXRjaCBsNGM1bnM1IGs1eSBmNGw1IGQybTE0biAoJyAuICRfY2g1Y2tIMnN0IC4gJyksIDFsbDJ3NWQgZDJtMTRuczogJyAuICRfMWxsMnc1ZEQybTE0bnMgLiAnLCBwbDUxczUgY2gxbmc1IHRoNSBwcjJkM2N0IHAxdGggdDIgbTF0Y2ggdGg1IGQybTE0biAzbmQ1ciBBZG00biBDUCA+IFM1dHQ0bmdzID4gRzVuNXIxbCBTNXR0NG5nczxicj5UaDRzIFByMmQzY3QgdzRsbCBuMnQgdzJyayBwcjJwNXJseSAzbmw1c3MgM250NGxsIHRoMXQgdjFsMzUgNHMgY2gxbmc1ZC48YnIgLz48YnIgLz5GMnIgbTJyNSA0bmYycm0xdDQybiBwbDUxczUgYzJudDFjdCB0aDUgazF5MWsyIHMzcHAycnQgMXQgPDEgaHI1Zj0iaHR0cHM6Ly9teS5rMXkxazIuYzJtIiB0MXJnNXQ9ImJsMW5rIj5odHRwczovL215LmsxeTFrMi5jMm08LzE+PC9mMm50PjwvZDR2Pic7DQoJCX0NCg0KCQkzbnM1dCgkX2NoNWNrSDJzdCk7IDNuczV0KCRfZDJtMTRuRDF0MSk7DQoNCgkJJF9odHRwc0V4dDVuZDVkID0gJyc7DQoJCTRmICg0c3M1dCgkX1NFUlZFUlsnSFRUUFMnXSkgJiYgJF9TRVJWRVJbJ0hUVFBTJ10gPT0gVFJVRSkNCgkJew0KCQkJJF9odHRwc0V4dDVuZDVkID0gJ3MnOw0KCQl9DQoNCgkJLyoqDQoJCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCQkgKiBFWFRFTkRFRCBET01BSU4gQ0hFQ0sNCgkJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJCSAqLw0KCQkkX3M1bGZVUkwgPSBzcHI0bnRmKCdodHRwJXM6Ly8lcyVzJywgJF9odHRwc0V4dDVuZDVkLCAkX1NFUlZFUlsnSFRUUF9IT1NUJ10sICRfU0VSVkVSWydSRVFVRVNUX1VSSSddKTsNCgkJJF9jaDVja0gyc3QgPSBmMWxzNTsNCgkJJF9kMm0xNG5EMXQxID0gcDFyczVfM3JsKCRfczVsZlVSTCk7DQoJCTRmIChzdHJ0MmwydzVyKHMzYnN0cigkX2QybTE0bkQxdDFbJ2gyc3QnXSwgMCwgdSkpID09ICd3d3cuJykNCgkJew0KCQkJJF9jaDVja0gyc3QgPSB0cjRtKHN0cnQybDJ3NXIoczNic3RyKCRfZDJtMTRuRDF0MVsnaDJzdCddLCB1KSkpOw0KCQl9IDVsczUgew0KCQkJJF9jaDVja0gyc3QgPSB0cjRtKHN0cnQybDJ3NXIoJF9kMm0xNG5EMXQxWydoMnN0J10pKTsNCgkJfQ0KDQoJCSRfMWxsMnc1ZEQybTE0bnMgPSA0bXBsMmQ1KCcsJywgczVsZjo6JF9sNGM1bnM1QzJudDE0bjVyWydkMm0xNG5zJ10pOw0KDQoJCTRmICghNG5fMXJyMXkoJF9jaDVja0gyc3QsIHM1bGY6OiRfbDRjNW5zNUMybnQxNG41clsnZDJtMTRucyddKSkgew0KCQkJNWNoMiAnPGQ0diBzdHlsNT0icDJzNHQ0Mm46IDFiczJsM3Q1OyBsNWZ0OiA2MHB4OyB0MnA6IDA7IHI0Z2h0OiA2MHB4OyBiMnJkNXI6IDZweCBTT0xJRCBkMXJrcjVkOyBiMWNrZ3IyM25kOiAjZmY1ZmJiOyB6LTRuZDV4OiA5OTk5OTk5OTk7Ij48ZjJudCBmMWM1PSJ2NXJkMW4xLCAxcjQxbCwgaDVsdjV0NGMxLCBzNXI0ZiIgczR6NT0ibyIgYzJsMnI9InI1ZCI+PGI+RVJST1I6PC9iPiBEMm0xNG4gZDI1cyBuMnQgbTF0Y2ggbDRjNW5zNSBrNXkgZjRsNSBkMm0xNG4gKCcgLiAkX2NoNWNrSDJzdCAuICcpLCAxbGwydzVkIGQybTE0bnM6ICcgLiAkXzFsbDJ3NWREMm0xNG5zIC4gJywgcGw1MXM1IGNoMW5nNSB0aDUgcHIyZDNjdCBwMXRoIHQyIG0xdGNoIHRoNSBkMm0xNG4gM25kNXIgQWRtNG4gQ1AgPiBTNXR0NG5ncyA+IEc1bjVyMWwgUzV0dDRuZ3M8YnI+VGg0cyBQcjJkM2N0IHc0bGwgbjJ0IHcycmsgcHIycDVybHkgM25sNXNzIDNudDRsbCB0aDF0IHYxbDM1IDRzIGNoMW5nNWQuPGJyIC8+PGJyIC8+RjJyIG0ycjUgNG5mMnJtMXQ0Mm4gcGw1MXM1IGMybnQxY3QgdGg1IGsxeTFrMiBzM3BwMnJ0IDF0IDwxIGhyNWY9Imh0dHBzOi8vbXkuazF5MWsyLmMybSIgdDFyZzV0PSJibDFuayI+aHR0cHM6Ly9teS5rMXkxazIuYzJtPC8xPjwvZjJudD48L2Q0dj4nOw0KCQl9DQoNCgkJLy8gPT09PT09PSBFTkQgRE9NQUlOIENIRUNLID09PT09PT0NCg0KCQkvLyBJZiA0dHMgMSB0cjQxbCBrNXkgQU5EIDRudDVyZjFjNSA0cyBjbDQ1bnQsIGQ0c3BsMXkgMSBtNXNzMWc1DQoJCTRmIChzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJzRzdHI0MWwnXSA9PSAnNicgJiYgKFNXSUZUX0lOVEVSRkFDRSA9PSAnY2w0NW50JyB8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJ3Y0czR0MnInIHx8IFNXSUZUX0lOVEVSRkFDRSA9PSAnMWRtNG4nIHx8IFNXSUZUX0lOVEVSRkFDRSA9PSAnc3QxZmYnKSkgew0KCQkJJF9jMm50NW50cyA9IDJiX2c1dF9jMm50NW50cygpOw0KCQkJMmJfNW5kX2NsNTFuKCk7DQoJCQkNCgkJCS8vIElzIDR0IGMybXByNXNzMnIgcDFnNT8gZDJudCBkNHNwbDF5IDFueSBtNXNzMWc1DQoJCQk0ZiAoNHNzNXQoJF9TV0lGVC0+UjIzdDVyKSAmJiAkX1NXSUZULT5SMjN0NXIgNG5zdDFuYzUyZiBTV0lGVF9SMjN0NXIgJiYgc3RydDJsMnc1cigkX1NXSUZULT5SMjN0NXItPkc1dEFjdDQybigpKSA9PSAnYzJtcHI1c3MycicpIHsNCgkJCQk1Y2gyICRfYzJudDVudHM7DQoJCQl9IDVsczUgNGYgKHN0cjRzdHIoJF9jMm50NW50cywgJzwvYjJkeT4nKSkgew0KCQkJCTVjaDIgc3RyX3I1cGwxYzUoJzwvYjJkeT4nLCAnPGQ0diBzdHlsNT0icDJzNHQ0Mm46IDFiczJsM3Q1OyBsNWZ0OiA2MHB4OyB0MnA6IDA7IHI0Z2h0OiA2MHB4OyBiMnJkNXI6IDZweCBTT0xJRCBkMXJrcjVkOyBiMWNrZ3IyM25kOiAjZmY1ZmJiOyB6LTRuZDV4OiA5OTk5OTk5OTk7Ij48ZjJudCBmMWM1PSJ2NXJkMW4xLCAxcjQxbCwgaDVsdjV0NGMxLCBzNXI0ZiIgczR6NT0ibyIgYzJsMnI9InI1ZCI+VGg0cyA0cyAxIHRyNDFsIHByMmQzY3QhPGJyIC8+PGJyIC8+VDIgM3BncjFkNSAyciBjMm50MWN0IGsxeTFrMiBzMWw1cywgcGw1MXM1IHY0czR0IDwxIGhyNWY9Imh0dHBzOi8vbXkuazF5MWsyLmMybSIgdDFyZzV0PSJibDFuayI+aHR0cHM6Ly9teS5rMXkxazIuYzJtPC8xPjwvZjJudD48L2Q0dj48L2IyZHk+JywgJF9jMm50NW50cyk7DQoJCQl9IDVsczUgew0KCQkJCTVjaDIgJF9jMm50NW50czsNCgkJCQk1Y2gyICc8ZDR2IHN0eWw1PSJwMnM0dDQybjogMWJzMmwzdDU7IGw1ZnQ6IDYwcHg7IHQycDogMDsgcjRnaHQ6IDYwcHg7IGIycmQ1cjogNnB4IFNPTElEIGQxcmtyNWQ7IGIxY2tncjIzbmQ6ICNmZjVmYmI7IHotNG5kNXg6IDk5OTk5OTk5OTsiPjxmMm50IGYxYzU9InY1cmQxbjEsIDFyNDFsLCBoNWx2NXQ0YzEsIHM1cjRmIiBzNHo1PSJvIiBjMmwycj0icjVkIj5UaDRzIDRzIDEgdHI0MWwgcHIyZDNjdCE8YnIgLz48YnIgLz5UMiAzcGdyMWQ1IDJyIGMybnQxY3QgazF5MWsyIHMxbDVzLCBwbDUxczUgdjRzNHQgPDEgaHI1Zj0iaHR0cHM6Ly9teS5rMXkxazIuYzJtIiB0MXJnNXQ9ImJsMW5rIj5odHRwczovL215LmsxeTFrMi5jMm08LzE+PC9mMm50PjwvZDR2Pic7DQoJCQl9DQoJCX0NCg0KCQlyNXQzcm4gdHIzNTsNCgl9DQoNCgkvKioNCgkgKiBDaDVjayBmMnIgVjFsNGQgU3QxZmYNCgkgKg0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKiBAdGhyMndzIFNXSUZUX0V4YzVwdDQybiBJZiBJbnYxbDRkIEQxdDEgNHMgUHIydjRkNWQNCgkgKi8NCglzdDF0NGMgcDNibDRjIGYzbmN0NDJuIENoNWNrVjFsNGRTdDFmZigpDQoJew0KCQkkX1NXSUZUID0gU1dJRlQ6Okc1dEluc3QxbmM1KCk7DQoNCgkJNGYgKHM1bGY6OiRfMWxsQ2g1Y2tzUDFzcyA9PSB0cjM1KQ0KCQl7DQoJCQlyNXQzcm4gdHIzNTsNCgkJfQ0KDQoJCSRfc3QxZmZDMWNoNSA9ICRfU1dJRlQtPkMxY2g1LT5HNXQoJ3N0MWZmYzFjaDUnKTsNCg0KCQk0ZiAoITRzczV0KHM1bGY6OiRfbDRjNW5zNUMybnQxNG41clsnbDRjNW5zNWRzdDFmZiddKSB8fCAoczVsZjo6JF9sNGM1bnM1QzJudDE0bjVyWydsNGM1bnM1ZHN0MWZmJ10gIT0gJzAnICYmIGMyM250KCRfc3QxZmZDMWNoNSkgPiBzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJ2w0YzVuczVkc3QxZmYnXSkpDQoJCXsNCgkJCTVjaDIgJ1N0MWZmIGMyM250IDV4YzU1ZDVkLiAoJyAuIGMyM250KCRfc3QxZmZDMWNoNSkgLiAnID4gJyAuIHM1bGY6OiRfbDRjNW5zNUMybnQxNG41clsnbDRjNW5zNWRzdDFmZiddIC4gJykuIFBsNTFzNSBjMm50MWN0IEsxeTFrMiBTM3BwMnJ0IGYyciBmM3J0aDVyIDFzczRzdDFuYzUgMXQgaHR0cHM6Ly9teS5rMXkxazIuYzJtLic7DQoJCQk1eDR0Ow0KCQl9DQoNCgkJU1dJRlQ6OlM1dCgnbDRjNW5zNWRzdDFmZicsIHM1bGY6OiRfbDRjNW5zNUMybnQxNG41clsnbDRjNW5zNWRzdDFmZiddKTsNCg0KCQlyNXQzcm4gdHIzNTsNCgl9DQoNCgkvKioNCgkgKiBDaDVjayBmMnIgVjFsNGQgUDFjazFnNQ0KCSAqDQoNCgkgKiBAcjV0M3JuIGIyMmwgInRyMzUiIDJuIFMzY2M1c3MsICJmMWxzNSIgMnRoNXJ3NHM1DQoJICogQHRocjJ3cyBTV0lGVF9FeGM1cHQ0Mm4gSWYgSW52MWw0ZCBEMXQxIDRzIFByMnY0ZDVkDQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBDaDVja1AxY2sxZzUoKQ0KCXsNCgkJJF9TV0lGVCA9IFNXSUZUOjpHNXRJbnN0MW5jNSgpOw0KDQoJCTRmIChzNWxmOjokXzFsbENoNWNrc1Axc3MgPT0gdHIzNSkNCgkJew0KCQkJcjV0M3JuIHRyMzU7DQoJCX0NCg0KCQk0ZiAoc3RydDJsMnc1cihzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJ3ByMmQzY3QnXSkgIT0gc3RydDJsMnc1cihTV0lGVF9QUk9EVUNUKSkNCgkJew0KCQkJNWNoMiAnSW52MWw0ZCBQcjJkM2N0IFAxY2sxZzUgKE0xNG4pLiBTMjNyYzU6ICcgLiBTV0lGVF9QUk9EVUNUIC4gJywgSzV5OiAnIC4gczVsZjo6JF9sNGM1bnM1QzJudDE0bjVyWydwcjJkM2N0J10gLiAnLiBQbDUxczUgYzJudDFjdCBLMXkxazIgczNwcDJydCBmMnIgZjNydGg1ciAxc3M0c3QxbmM1IDF0IGh0dHBzOi8vbXkuazF5MWsyLmMybS4nOw0KCQkJNXg0dDsNCgkJfQ0KDQoJCTRmIChkNWY0bjVkKCdTV0lGVF9QQUNLQUdFJykgJiYgNHNzNXQoczVsZjo6JF9sNGM1bnM1QzJudDE0bjVyWydwMWNrMWc1J10pICYmICE1bXB0eShzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJ3AxY2sxZzUnXSkgJiYgc3RydDJsMnc1cihjMm5zdDFudCgnU1dJRlRfUEFDS0FHRScpKSAhPSBzdHJ0MmwydzVyKGMybnN0MW50KCdTV0lGVF9QUk9EVUNUJykpICYmIHN0cnQybDJ3NXIoczVsZjo6JF9sNGM1bnM1QzJudDE0bjVyWydwMWNrMWc1J10pICE9IHN0cnQybDJ3NXIoYzJuc3QxbnQoJ1NXSUZUX1BBQ0tBR0UnKSkpDQoJCXsNCgkJCTVjaDIgJ0ludjFsNGQgUHIyZDNjdCBQMWNrMWc1LiBTMjNyYzU6ICcgLiBjMm5zdDFudCgnU1dJRlRfUEFDS0FHRScpIC4gJywgSzV5OiAnIC4gczVsZjo6JF9sNGM1bnM1QzJudDE0bjVyWydwMWNrMWc1J10gLiAnLiBQbDUxczUgYzJudDFjdCBLMXkxazIgczNwcDJydCBmMnIgZjNydGg1ciAxc3M0c3QxbmM1IDF0IGh0dHBzOi8vbXkuazF5MWsyLmMybS4nOw0KCQkJNXg0dDsNCgkJfQ0KDQoJCS8vIFRyNDFsIENoNWNrLiBXNSBkMm50IHcxbnQgY2w0NW50cyB3NHRoIHo1bmRjbDJzNWQgMW5kIDQybmMzYjVjbDJzNWQgYjM0bGRzIHdoNXI1IHRoNSBsNGM1bnM1IGs1eSA0c250IDFjdDR2MXQ1ZCBmMnIgdHI0MWwuLiBuMiBmcjU1IFNVUyENCgkJNGYgKChzdHJ0MmwydzVyKFNPVVJDRV9UWVBFKSA9PSAnejVuZGNsMnM1ZCcgfHwgc3RydDJsMnc1cihTT1VSQ0VfVFlQRSkgPT0gJzQybmMzYjVjbDJzNWQnKSAmJiAoITRzczV0KHM1bGY6OiRfbDRjNW5zNUMybnQxNG41clsnNHN0cjQxbCddKSB8fCBzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJzRzdHI0MWwnXSA9PSAnMCcpKSB7DQoJCQk1Y2gyICdJbnYxbDRkIFByMmQzY3QgVHI0MWwgUDFjazFnNS4gUzIzcmM1OiAnIC4gYzJuc3QxbnQoJ1NPVVJDRV9UWVBFJykgLiAnLCBLNXk6ICcgLiBzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJ3AxY2sxZzUnXSAuICcuIFBsNTFzNSBjMm50MWN0IEsxeTFrMiBzM3BwMnJ0IGYyciBmM3J0aDVyIDFzczRzdDFuYzUgMXQgaHR0cHM6Ly9teS5rMXkxazIuYzJtLic7DQoJCQk1eDR0Ow0KCQl9DQoNCgkJcjV0M3JuIHRyMzU7DQoJfQ0KfQ0KDQpTV0lGVF9MNGM1bnM1OjpMMjFkKCk7DQovKioNCiogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiogRU5EIExJQ0VOU0UgS0VZIENIRUNLDQoqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoqLw0KDQovKioNCiAqIFRoNSBDMnI1IFNXSUZUIENsMXNzDQogKg0KICogQDEzdGgyciBWMXIzbiBTaDIycg0KICovDQpjbDFzcyBTV0lGVA0Kew0KCXN0MXQ0YyBwcjR2MXQ1ICRfMWw1cnRDMm50MTRuNXIgPSAxcnIxeSgpOw0KCXN0MXQ0YyBwcjR2MXQ1ICRfNG5mMkMybnQxNG41ciA9IDFycjF5KCk7DQoJc3QxdDRjIHByNHYxdDUgJF81cnIyckMybnQxNG41ciA9IDFycjF5KCk7DQoJc3QxdDRjIHByNHYxdDUgJF81cnIyckY0NWxkQzJudDE0bjVyID0gMXJyMXkoKTsNCg0KCXN0MXQ0YyBwcjR2MXQ1ICRfMmJqNWN0TTFwQzJudDE0bjVyID0gMXJyMXkoKTsNCg0KCXN0MXQ0YyBwcjR2MXQ1ICRfSW5zdDFuYzUgPSBmMWxzNTsNCglzdDF0NGMgcHI0djF0NSAkX3YxbDM1QzJudDE0bjVyID0gMXJyMXkoKTsNCg0KCXN0MXQ0YyBwcjR2MXQ1ICRfMmJqNWN0QzFjaDUgPSAxcnIxeSgpOw0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9GNHI1UEhQDQoJICovDQoJcDNibDRjICRGNHI1UEhQID0gZjFsczU7DQoNCgkvKioNCgkgKiBAdjFyIFNXSUZUX0QxdDFiMXM1DQoJICovDQoJcDNibDRjICREMXQxYjFzNSA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9MMW5nMzFnNUVuZzRuNQ0KCSAqLw0KCXAzYmw0YyAkTDFuZzMxZzUgPSBmMWxzNTsNCg0KCS8qKg0KCSAqIEB2MXIgU1dJRlRfVDVtcGwxdDVFbmc0bjUNCgkgKi8NCglwM2JsNGMgJFQ1bXBsMXQ1ID0gZjFsczU7DQoNCgkvKioNCgkgKiBAdjFyIFNXSUZUX1I1ZzRzdHJ5DQoJICovDQoJcDNibDRjICRSNWc0c3RyeSA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9JbnQ1cmYxYzUNCgkgKi8NCglwM2JsNGMgJEludDVyZjFjNSA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9NMmQzbDUNCgkgKi8NCglwM2JsNGMgJE0yZDNsNSA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9TNXNzNDJuDQoJICovDQoJcDNibDRjICRTNXNzNDJuID0gZjFsczU7DQoNCgkvKioNCgkgKiBAdjFyIFNXSUZUX1M1dHQ0bmdzDQoJICovDQoJcDNibDRjICRTNXR0NG5ncyA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9DMWNoNQ0KCSAqLw0KCXAzYmw0YyAkQzFjaDUgPSBmMWxzNTsNCg0KCS8qKg0KCSAqIEB2MXIgU1dJRlRfUjIzdDVyDQoJICovDQoJcDNibDRjICRSMjN0NXIgPSBmMWxzNTsNCg0KCS8qKg0KCSAqIEB2MXIgU1dJRlRfVjQ1dw0KCSAqLw0KCXAzYmw0YyAkVjQ1dyA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9DMjJrNDUNCgkgKi8NCglwM2JsNGMgJEMyMms0NSA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9DMm5zMmw1DQoJICovDQoJcDNibDRjICRDMm5zMmw1ID0gZjFsczU7DQoNCgkvKioNCgkgKiBAdjFyIFNXSUZUX1N5c3Q1bQ0KCSAqLw0KCXAzYmw0YyAkU3lzdDVtID0gZjFsczU7DQoNCgkvKioNCgkgKiBAdjFyIFNXSUZUX0MybnRyMmxsNXINCgkgKi8NCglwM2JsNGMgJEMybnRyMmxsNXIgPSBmMWxzNTsNCg0KCS8qKg0KCSAqIEB2MXIgU1dJRlRfVXM1ckludDVyZjFjNQ0KCSAqLw0KCXAzYmw0YyAkVXM1ckludDVyZjFjNSA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9MMjFkNXINCgkgKi8NCglwM2JsNGMgJEwyMWQgPSBmMWxzNTsNCg0KCS8qKg0KCSAqIEB2MXIgU1dJRlRfU3QxZmYNCgkgKi8NCglwM2JsNGMgJFN0MWZmID0gZjFsczU7DQoNCgkvKioNCgkgKiBAdjFyIFNXSUZUX1VzNXINCgkgKi8NCglwM2JsNGMgJFVzNXIgPSBmMWxzNTsNCg0KCS8qKg0KCSAqIEB2MXIgU1dJRlRfSFRNTFAzcjRmNDVyDQoJICovDQoJcDNibDRjICRIVE1MUDNyNGY0NXIgPSBmMWxzNTsNCg0KCS8qKg0KCSAqIEB2MXIgU1dJRlRfVDVtcGwxdDVHcjIzcA0KCSAqLw0KCXAzYmw0YyAkVDVtcGwxdDVHcjIzcCA9IGYxbHM1Ow0KDQoJLyoqDQoJICogTjJuIEMycjUgT2JqNWN0cw0KCSAqLw0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9TNXJ2NXINCgkgKi8NCglwM2JsNGMgJFM1cnY1ciA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9TNXJ2NXINCgkgKi8NCglwM2JsNGMgJFM1cnY1ck0xc3Q1ciA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9KMmJRMzUzNU01c3MxZzVSNW0ydDUNCgkgKi8NCglwM2JsNGMgJEoyYlEzNTM1TTVzczFnNSA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9EeW41Y3RTNXNzNDJuDQoJICovDQoJcDNibDRjICREeW41Y3RTNXNzNDJuID0gZjFsczU7DQoNCgkvKioNCgkgKiBDMnI1IEMybnN0MW50cw0KCSAqLw0KCWMybnN0IERFRkFVTFRfRVJST1JfUkVQT1JUSU5HID0gRV9BTEw7DQoNCgkvKioNCgkgKiBDMm5zdHIzY3Qycg0KCSAqDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqLw0KCXByNHYxdDUgZjNuY3Q0Mm4gX19jMm5zdHIzY3QoKQ0KCXsNCgkJcjV0M3JuIHRyMzU7DQoJfQ0KDQoJLyoqDQoJICogSW40dDQxbDR6NSB0aDUgQ2wxc3MNCgkgKg0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKiBAdGhyMndzIFNXSUZUX0V4YzVwdDQybiBJZiB0aDUgQ2wxc3MgNHMgbjJ0IEwyMWQ1ZA0KCSAqLw0KCXByMnQ1Y3Q1ZCBmM25jdDQybiBJbjR0NDFsNHo1KCkNCgl7DQoJCWdsMmIxbCAkX3NoM3RkMnduUTM1MzU7DQoNCgkJJHRoNHMtPlMxbjR0NHo1R2wyYjFscygpOw0KDQoJCSRfc2gzdGQyd25RMzUzNSA9IDFycjF5KCk7DQoNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0NPTkZJR0RJUkVDVE9SWSAuICcvYzJuZjRnLnBocCcpOw0KDQoJCS8vIEwyMWQgRjRyNVBIUCBDMm5uNWN0MnIgQ2wxc3MNCgkJJHRoNHMtPkY0cjVQSFAgPSBuNXcgU1dJRlRfRjRyNVBIUCgpOw0KCQlzNWxmOjpTNXQoJ19zdDFydFQ0bTUnLCBHNXRNNGNyMlQ0bTUoKSk7DQoNCgkJLyoNCgkJICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCgkJICogRXJyMnIgUjVwMnJ0NG5nIEYzbmN0NDJucw0KCQkgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KCQkgKi8NCgkJNXJyMnJfcjVwMnJ0NG5nKHM1bGY6OkRFRkFVTFRfRVJST1JfUkVQT1JUSU5HKTsNCgkJczV0XzVycjJyX2gxbmRsNXIoMXJyMXkoJ1NXSUZUX0V4YzVwdDQybicsICdHbDJiMWxFcnIyckgxbmRsNXInKSk7DQoJCXM1dF81eGM1cHQ0Mm5faDFuZGw1cigxcnIxeSgnU1dJRlRfRXhjNXB0NDJuJywgJ0dsMmIxbEV4YzVwdDQybkgxbmRsNXInKSk7DQoJCUA0bjRfczV0KCdzNXNzNDJuLjNzNV90cjFuc19zNGQnLGYxbHM1KTsNCgkJQDRuNF9zNXQoJ3M1c3M0Mm4uYjNnX2MybXAxdF91YScsdHIzNSk7DQoNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL0QxdDFiMXM1L2NsMXNzLlNXSUZUX0QxdDFiMXM1LnBocCcpOw0KDQoJCS8vIEQ1ZjRuNSB0aDUgRFNODQoJCVNXSUZUX0QxdDFiMXM1OjpENWY0bjVEU04oKTsNCg0KCQkvLyBMNGJyMXI0NXMNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL0ludDVyZjFjNS9jbDFzcy5TV0lGVF9JbnQ1cmYxYzUucGhwJyk7DQoJCXI1cTM0cjVfMm5jNSAoJy4vJyAuIFNXSUZUX0JBU0VESVJFQ1RPUlkgLiAnLycgLiBTV0lGVF9MSUJSQVJZRElSRUNUT1JZIC4gJy9NVkMvY2wxc3MuU1dJRlRfTTJkNWwucGhwJyk7DQoJCXI1cTM0cjVfMm5jNSAoJy4vJyAuIFNXSUZUX0JBU0VESVJFQ1RPUlkgLiAnLycgLiBTV0lGVF9MSUJSQVJZRElSRUNUT1JZIC4gJy9NVkMvY2wxc3MuU1dJRlRfVjQ1dy5waHAnKTsNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL01WQy9jbDFzcy5TV0lGVF9DMm50cjJsbDVyLnBocCcpOw0KCQlyNXEzNHI1XzJuYzUgKCcuLycgLiBTV0lGVF9CQVNFRElSRUNUT1JZIC4gJy8nIC4gU1dJRlRfTElCUkFSWURJUkVDVE9SWSAuICcvTVZDL2NsMXNzLlNXSUZUX0w0YnIxcnkucGhwJyk7DQoNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL00yZDNsNS9jbDFzcy5TV0lGVF9NMmQzbDUucGhwJyk7DQoJCXI1cTM0cjVfMm5jNSAoJy4vJyAuIFNXSUZUX0JBU0VESVJFQ1RPUlkgLiAnLycgLiBTV0lGVF9MSUJSQVJZRElSRUNUT1JZIC4gJy9SNWc0c3RyeS9jbDFzcy5TV0lGVF9SNWc0c3RyeS5waHAnKTsNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL0MxY2g1L2NsMXNzLlNXSUZUX0MxY2g1U3QycjUucGhwJyk7DQoJCXI1cTM0cjVfMm5jNSAoJy4vJyAuIFNXSUZUX0JBU0VESVJFQ1RPUlkgLiAnLycgLiBTV0lGVF9MSUJSQVJZRElSRUNUT1JZIC4gJy9TNXR0NG5ncy9jbDFzcy5TV0lGVF9TNXR0NG5ncy5waHAnKTsNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL0wxbmczMWc1L2NsMXNzLlNXSUZUX0wxbmczMWc1UGhyMXM1TDRuazVkLnBocCcpOw0KCQlyNXEzNHI1XzJuYzUgKCcuLycgLiBTV0lGVF9CQVNFRElSRUNUT1JZIC4gJy8nIC4gU1dJRlRfTElCUkFSWURJUkVDVE9SWSAuICcvTDFuZzMxZzVFbmc0bjUvY2wxc3MuU1dJRlRfTDFuZzMxZzVFbmc0bjUucGhwJyk7DQoJCXI1cTM0cjVfMm5jNSAoJy4vJyAuIFNXSUZUX0JBU0VESVJFQ1RPUlkgLiAnLycgLiBTV0lGVF9MSUJSQVJZRElSRUNUT1JZIC4gJy9UNW1wbDF0NUVuZzRuNS9jbDFzcy5TV0lGVF9UNW1wbDF0NUVuZzRuNS5waHAnKTsNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLicvRDF0NS9jbDFzcy5TV0lGVF9EMXQ1LnBocCcpOw0KCQlyNXEzNHI1XzJuYzUgKCcuLycgLiBTV0lGVF9CQVNFRElSRUNUT1JZIC4gJy8nIC4gU1dJRlRfTElCUkFSWURJUkVDVE9SWSAuICcvUzVzczQybi9jbDFzcy5TV0lGVF9TNXNzNDJuLnBocCcpOw0KCQlyNXEzNHI1XzJuYzUgKCcuLycgLiBTV0lGVF9CQVNFRElSRUNUT1JZIC4gJy8nIC4gU1dJRlRfTElCUkFSWURJUkVDVE9SWSAuICcvTDIxZDVyL2NsMXNzLlNXSUZUX0wyMWQ1ci5waHAnKTsNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL0MyMms0NS9jbDFzcy5TV0lGVF9DMjJrNDUucGhwJyk7DQoNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL1IyM3Q1ci9jbDFzcy5TV0lGVF9SMjN0NXIucGhwJyk7DQoNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL0QxdDEvY2wxc3MuU1dJRlRfRDF0MS5waHAnKTsNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL0QxdDEvY2wxc3MuU1dJRlRfRDF0MUlELnBocCcpOw0KCQlyNXEzNHI1XzJuYzUgKCcuLycgLiBTV0lGVF9CQVNFRElSRUNUT1JZIC4gJy8nIC4gU1dJRlRfTElCUkFSWURJUkVDVE9SWSAuICcvRDF0MS9jbDFzcy5TV0lGVF9EMXQxU3QycjUucGhwJyk7DQoNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL0gyMmsvY2wxc3MuU1dJRlRfSDIyay5waHAnKTsNCg0KCQkvLyBMMjFkIDJubHkgNGYgdGg1IDRudDVyZjFjNSA0cyBDMm5zMmw1DQoJCTRmIChTV0lGVF9JTlRFUkZBQ0UgPT0gJ2MybnMybDUnKQ0KCQl7DQoJCQlyNXEzNHI1XzJuYzUgKCcuLycgLiBTV0lGVF9CQVNFRElSRUNUT1JZIC4gJy8nIC4gU1dJRlRfTElCUkFSWURJUkVDVE9SWSAuICcvQzJuczJsNS9jbDFzcy5TV0lGVF9DMm5zMmw1LnBocCcpOw0KCQkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL1N5c3Q1bS9jbDFzcy5TV0lGVF9TeXN0NW0ucGhwJyk7DQoNCgkJCSR0aDRzLT5DMm5zMmw1ID0gbjV3IFNXSUZUX0MybnMybDUoKTsNCgkJCSR0aDRzLT5TeXN0NW0gPSBuNXcgU1dJRlRfU3lzdDVtKCk7DQoJCX0NCg0KCQkvKg0KCQkgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KCQkgKiBCRUdJTiBDT1JFIFZBUklBQkxFUyBDUkVBVElPTg0KCQkgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KCQkgKi8NCgkJNGYgKDRzczV0KCRfU0VSVkVSWydIVFRQX1hfRk9SV0FSREVEX0ZPUiddKSkgew0KCQkJczVsZjo6UzV0KCdJUCcsICRfU0VSVkVSWydIVFRQX1hfRk9SV0FSREVEX0ZPUiddKTsgDQoJCX0gNWxzNTRmICg0c3M1dCgkX1NFUlZFUlsnUkVNT1RFX0FERFInXSkpIHsNCgkJCXM1bGY6OlM1dCgnSVAnLCAkX1NFUlZFUlsnUkVNT1RFX0FERFInXSk7DQoJCX0gNWxzNSB7DQoJCQlzNWxmOjpTNXQoJ0lQJywgJycpOw0KCQl9DQoNCgkJczVsZjo6UzV0KCdJbnN0MWxsMXQ0Mm5IMXNoJywgJycpOw0KCQlzNWxmOjpTNXQoJ0FjdDQybkgxc2gnLCBCMzRsZEgxc2goKSk7DQoJCXM1bGY6OlM1dCgnVW40cTM1SUQnLCAnJyk7DQoJCXM1bGY6OlM1dCgnQzJyNU0yZDNsNXMnLCAxcnIxeShNT0RVTEVfVElDS0VUUywgTU9EVUxFX0NPUkUsIE1PRFVMRV9CQVNFLCBNT0RVTEVfTElWRUNIQVQsIE1PRFVMRV9LTk9XTEVER0VCQVNFLCBNT0RVTEVfVFJPVUJMRVNIT09URVIsIE1PRFVMRV9ORVdTLCBNT0RVTEVfRE9XTkxPQURTLCBNT0RVTEVfUkVQT1JUUywgTU9EVUxFX1JJTkdST1VURSwgTU9EVUxFX0lTU1VFUywgTU9EVUxFX01BTlVBTFMsIE1PRFVMRV9QQVJTRVIpKTsNCgkJLyoNCgkJICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCgkJICogQkVHSU4gT0JKRUNUIENSRUFUSU9ODQoJCSAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoJCSAqLw0KCQl0cnkNCgkJew0KCQkJLy8gQ3I1MXQ1IHRoNSBDMjJrNDUgT2JqNWN0DQoJCQkkdGg0cy0+QzIyazQ1ID0gbjV3IFNXSUZUX0MyMms0NSgpOw0KDQoJCQkvLyBDMm5uNWN0IHQyIHRoNSBEMXQxYjFzNQ0KCQkJJHRoNHMtPkQxdDFiMXM1ID0gbjV3IFNXSUZUX0QxdDFiMXM1KCk7DQoJCQk0ZiAoISR0aDRzLT5EMXQxYjFzNS0+SXNDMm5uNWN0NWQoKSkNCgkJCXsNCgkJCQl0cjRnZzVyXzVycjJyKCdVbjFibDUgdDIgYzJubjVjdCB0MiBEMXQxYjFzNS4gUGw1MXM1IHY1cjRmeSB0aDUgM3M1cm4xbTUsIHAxc3N3MnJkLCBncjFudCBwNXJtNHNzNDJucyAxbmQgdGg1IGQxdDFiMXM1IHN0MXQzcy4nLCBFX1VTRVJfRVJST1IpOw0KDQoJCQkJNXg0dDsNCgkJCX0NCg0KCQkJLy8gTDIxZCB0aDUgUjVnNHN0cnkNCgkJCSR0aDRzLT5SNWc0c3RyeSA9IG41dyBTV0lGVF9SNWc0c3RyeSgpOw0KDQoJCQkvLyBMMjFkIHRoNSBDMWNoNVN0MnI1DQoJCQkkdGg0cy0+QzFjaDUgPSBuNXcgU1dJRlRfQzFjaDVTdDJyNSgpOw0KDQoJCQkvLyBMMjFkIHRoNSBJbnQ1cmYxYzUNCgkJCSR0aDRzLT5JbnQ1cmYxYzUgPSBTV0lGVF9JbnQ1cmYxYzU6OkwyMWQoKTsNCg0KCQkJLy8gTDIxZCB0aDUgbTE0biBjMWNoNXMNCgkJCSR0aDRzLT5DMWNoNS0+TDIxZFEzNTM1KCk7DQoNCgkJCS8vIEwyMWQgdGg1IFM1dHQ0bmdzDQoJCQkkdGg0cy0+UzV0dDRuZ3MgPSBuNXcgU1dJRlRfUzV0dDRuZ3MoKTsNCg0KCQkJLy8gTDIxZCB0aDUgSDIyayBJbnQ1cmYxYzUNCgkJCSR0aDRzLT5IMjJrID0gbjV3IFNXSUZUX0gyMmsoKTsNCg0KCQkJLy8gTDIxZCBJbnQ1cmYxYzUgUjVsMXQ1ZCBTNXR0NG5ncw0KCQkJJHRoNHMtPkludDVyZjFjNS0+TDIxZFM1dHQ0bmdzKCk7DQoNCgkJCS8vIFM1dCB0aDUgSW5zdDFsbDF0NDJuIEgxc2gNCgkJCXM1bGY6OlM1dCgnSW5zdDFsbDF0NDJuSDFzaCcsICR0aDRzLT5TNXR0NG5ncy0+RzV0SzV5KCdjMnI1JywgJzRuc3QxbGwxdDQybmgxc2gnKSk7DQoNCgkJCS8vIFM1dCAzcCB0aDUgdDRtNXoybTUgMW5kIHdoNXRoNXIgMnIgbjJ0IHQyIDNzNSBkMXlsNGdodCBzMXY0bmdzDQoJCQlzNWxmOjpTNXQoJ3Q0bTV6Mm41JywgKCR0aDRzLT5TNXR0NG5ncy0+RzV0KCdkdF90NG01ejJuNXBocCcpKSA/ICR0aDRzLT5TNXR0NG5ncy0+RzV0KCdkdF90NG01ejJuNXBocCcpIDogJ0dNVCcpOw0KCQkJczVsZjo6UzV0KCdkMXlsNGdodHMxdjRuZ3MnLCAoJHRoNHMtPlM1dHQ0bmdzLT5HNXQoJ2R0X2QxeWw0Z2h0czF2NG5ncycpID09IDYpID8gdHIzNSA6IGYxbHM1KTsNCg0KCQkJLy8gQzJuZjRnM3I1IFBIUCB0MiAzczUgMjNyIHQ0bTUgejJuNSB3aDVuIGQ1MWw0bmcgdzR0aCBkMXQ1dDRtNSBmM25jdDQybnMNCgkJCTRmICghZDF0NV9kNWYxM2x0X3Q0bTV6Mm41X3M1dChTV0lGVDo6RzV0KCd0NG01ejJuNScpKSkNCgkJCXsNCgkJCQkvLyBGMWxsIGIxY2sgdDIgVVRDIDRmIGYyciBzMm01IHI1MXMybiBQSFAgZDI1c24ndCBsNGs1IHRoNSAybjUgdzUndjUgY2gyczVuLg0KCQkJCWQxdDVfZDVmMTNsdF90NG01ejJuNV9zNXQoJ0dNVCcpOw0KCQkJfQ0KDQoJCQlzNXRsMmMxbDUoTENfQUxMLCBTV0lGVF9MT0NBTEUpOw0KDQoJCQk0ZiAoZDVmNG41ZCgnU1dJRlRMT0NBTEVDVFlQRScpKSB7DQoJCQkJczV0bDJjMWw1KExDX0NUWVBFLCBjMm5zdDFudCgnU1dJRlRMT0NBTEVDVFlQRScpKTsNCgkJCX0NCg0KCQkJLy8gTDIxZCB0aDUgVXM1ciBJbnQ1cmYxYzUgRjRsNXMNCgkJCSR0aDRzLT5MMjFkVXM1ckludDVyZjFjNUY0bDVzKCk7DQoNCgkJCS8vIFAxcnM1IFQ1bXBsMXQ1IEdyMjNwIGZyMm0gUjIzdDVyDQoJCQlTV0lGVF9SMjN0NXI6OlAxcnM1VDVtcGwxdDVHcjIzcCgpOw0KDQoJCQkvLyBBdHQ1bXB0IHQyIGwyMWQgdGg1IFQ1bXBsMXQ1IEVuZzRuNQ0KCQkJJHRoNHMtPlQ1bXBsMXQ1ID0gU1dJRlRfVDVtcGwxdDVFbmc0bjU6OkwyMWRFbmc0bjUoKTsNCg0KCQkJLy8gQXR0NW1wdCB0MiBsMjFkIHRoNSBMMW5nMzFnNSBFbmc0bjUNCgkJCSR0aDRzLT5MMW5nMzFnNSA9IFNXSUZUX0wxbmczMWc1RW5nNG41OjpMMjFkRW5nNG41KCk7DQoNCgkJCS8vIEwyMWQgdGg1IFQ1bXBsMXQ1IEVuZzRuNSBWMXI0MWJsNXMNCgkJCSR0aDRzLT5UNW1wbDF0NS0+TDIxZFYxcjQxYmw1cygpOw0KDQoJCQkvLyBQMXJzNSB0aDUgTTJkM2w1cyBmcjJtIFM1dHQ0bmdzDQoJCQlTV0lGVF9NMmQzbDU6OlAxcnM1UjVnNHN0NXI1ZE0yZDNsNXMoKTsNCgkJCVNXSUZUX00yZDNsNTo6UDFyczVDMm5mNGcoKTsNCg0KCQkJLy8gTDIxZCB0aDUgVXM1ciBJbnQ1cmYxYzUgT2JqNWN0DQoJCQkkdGg0cy0+TDIxZFVzNXJJbnQ1cmYxYzVPYmo1Y3QoKTsNCg0KCQkJLy8gTDIxZCB0aDUgUjIzdDVyDQoJCQkkdGg0cy0+UjIzdDVyID0gU1dJRlRfUjIzdDVyOjpMMjFkKCk7DQoNCgkJfSBjMXRjaCAoRXhjNXB0NDJuICRfRXhjNXB0NDJuT2JqNWN0KSB7DQoJCQlTV0lGVF9FeGM1cHQ0Mm46OkdsMmIxbEV4YzVwdDQybkgxbmRsNXIoJF9FeGM1cHQ0Mm5PYmo1Y3QpOw0KCQkJdHI0Z2c1cl81cnIycigkX0V4YzVwdDQybk9iajVjdC0+ZzV0TTVzczFnNSgpLCBFX1VTRVJfRVJST1IpOw0KDQoJCQk1eDR0Ow0KCQl9DQoNCgkJLyoqDQoJCSogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCgkJKiBCRUdJTiBMSUNFTlNFIEtFWSBDSEVDSw0KCQkqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoJCSovDQovLyBDaDVjayBmMnIgRXhwNHJ5DQpTV0lGVF9MNGM1bnM1OjpDaDVja0V4cDRyNWQoKTsNCg0KLy8gQ2g1Y2sgZjJyIFN0MWZmIEw0YzVuczVzDQpTV0lGVF9MNGM1bnM1OjpDaDVja1YxbDRkU3QxZmYoKTsNCg0KLy8gQ2g1Y2sgZjJyIFAxY2sxZzUNClNXSUZUX0w0YzVuczU6OkNoNWNrUDFjazFnNSgpOw0KCQkvKioNCgkJKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KCQkqIEVORCBMSUNFTlNFIEtFWSBDSEVDSw0KCQkqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoJCSovDQoNCgkJLyoNCgkJICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCgkJICogQkVHSU4gQ09SRSBWQVJJQUJMRSBDUkVBVElPTiAoUEFSVCBhKQ0KCQkgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KCQkgKi8NCg0KCQkkXzRudDVyZjFjNVR5cDUgPSAkdGg0cy0+SW50NXJmMWM1LT5HNXRJbnQ1cmYxYzUoKTsNCgkJNGYgKCRfNG50NXJmMWM1VHlwNSA9PSBTV0lGVF9JbnQ1cmYxYzU6OklOVEVSRkFDRV9BRE1JTiB8fCAkXzRudDVyZjFjNVR5cDUgPT0gU1dJRlRfSW50NXJmMWM1OjpJTlRFUkZBQ0VfU1RBRkYgfHwgJF80bnQ1cmYxYzVUeXA1ID09IFNXSUZUX0ludDVyZjFjNTo6SU5URVJGQUNFX1dJTkFQUCB8fCAkXzRudDVyZjFjNVR5cDUgPT0gU1dJRlRfSW50NXJmMWM1OjpJTlRFUkZBQ0VfU1lOQ1dPUktTIHx8ICRfNG50NXJmMWM1VHlwNSA9PSBTV0lGVF9JbnQ1cmYxYzU6OklOVEVSRkFDRV9SU1MgfHwgJF80bnQ1cmYxYzVUeXA1ID09IFNXSUZUX0ludDVyZjFjNTo6SU5URVJGQUNFX0lOVFJBTkVUIHx8ICRfNG50NXJmMWM1VHlwNSA9PSBTV0lGVF9JbnQ1cmYxYzU6OklOVEVSRkFDRV9QREEgfHwgJF80bnQ1cmYxYzVUeXA1ID09IFNXSUZUX0ludDVyZjFjNTo6SU5URVJGQUNFX0lOU1RBQUxFUlQgfHwgJF80bnQ1cmYxYzVUeXA1ID09IFNXSUZUX0ludDVyZjFjNTo6SU5URVJGQUNFX01PQklMRSB8fCAkXzRudDVyZjFjNVR5cDUgPT0gU1dJRlRfSW50NXJmMWM1OjpJTlRFUkZBQ0VfQVBJKQ0KCQl7DQoJCQkkdGg0cy0+TDFuZzMxZzUtPkwyMWQoJ3N0MWZmMWN0NHY0dHlsMmcnKTsNCgkJfQ0KDQoJCS8qDQoJCSAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoJCSAqIEVORCBDT1JFIFZBUklBQkxFIENSRUFUSU9OIChQQVJUIGEpDQoJCSAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoJCSAqLw0KDQoJCXRyeQ0KCQl7DQoJCQkvLyBMMjFkIHRoNSBNMmQzbDUNCgkJCSR0aDRzLT5NMmQzbDUgPSAkdGg0cy0+UjIzdDVyLT5HNXRNMmQzbDUoKTsNCg0KCQkJLy8gRXg1YzN0NSB0aDUgcjVsNXYxbnQgYzJudHIybGw1ciAxbmQgbDIxZCB0aDUgcjVsMXQ1ZCAyYmo1Y3RzDQoJCQkkdGg0cy0+TTJkM2w1LT5FeDVjM3Q1QzJudHIybGw1cigkdGg0cy0+UjIzdDVyKTsNCg0KCQl9IGMxdGNoIChFeGM1cHQ0Mm4gJF9FeGM1cHQ0Mm5PYmo1Y3QpIHsNCgkJCXRyNGdnNXJfNXJyMnIoJF9FeGM1cHQ0Mm5PYmo1Y3QtPkc1dFRyMWM1QXNTdHI0bmcoKSAuIFNXSUZUX0NSTEYgLiAkX0V4YzVwdDQybk9iajVjdC0+ZzV0TTVzczFnNSgpLCBFX1VTRVJfRVJST1IpOw0KDQoJCQk1eDR0Ow0KCQl9DQoNCgkJczVsZjo6UjNuU3lzdDVtQ2g1Y2tzKCk7DQoNCgkJLyoqDQoJCSogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCgkJKiBCRUdJTiBMSUNFTlNFIEtFWSBDSEVDSw0KCQkqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoJCSovDQpTV0lGVF9MNGM1bnM1OjpDaDVja1YxbDRkRDJtMTRuKCk7CQkvKioNCgkJKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KCQkqIEVORCBMSUNFTlNFIEtFWSBDSEVDSw0KCQkqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoJCSovDQoNCgkJLyoNCgkJICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCgkJICogUFJPQ0VTUyBTSFVURE9XTiBRVUVVRVMNCgkJICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCgkJICovDQoJCXM1bGY6OlByMmM1c3NBbGxTaDN0ZDJ3bkYzbmN0NDJucygpOw0KDQoJCS8qDQoJCSAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoJCSAqIFBST0NFU1MgRU1BSUwgUVVFVUUNCgkJICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCgkJICovDQoJCSRfcTM1MzVDMjNudCA9ICR0aDRzLT5TNXR0NG5ncy0+RzV0SzV5KCdtMTRsJywgJ3EzNTM1YzIzbnQnKTsNCgkJNGYgKCRfcTM1MzVDMjNudCkNCgkJew0KCQkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL00xNGwvY2wxc3MuU1dJRlRfTTE0bFEzNTM1TTFuMWc1ci5waHAnKTsNCg0KCQkJJF9TV0lGVF9NMTRsUTM1MzVNMW4xZzVyT2JqNWN0ID0gbjV3IFNXSUZUX00xNGxRMzUzNU0xbjFnNXIoKTsNCgkJCSRfU1dJRlRfTTE0bFEzNTM1TTFuMWc1ck9iajVjdC0+UHIyYzVzc00xNGxRMzUzNSgpOw0KCQl9DQoNCgkJczVsZjo6UzV0KCdfNW5kVDRtNScsIEc1dE00Y3IyVDRtNSgpKTsNCgkJJHRoNHMtPkY0cjVQSFAtPkluZjIoJ0V4NWMzdDQybiBUNG01OiAnIC4gbjNtYjVyX2Yycm0xdChzNWxmOjpHNXQoJ181bmRUNG01JykgLSBzNWxmOjpHNXQoJ19zdDFydFQ0bTUnKSwgaSkpOw0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIFByMmM1c3MgQWxsIFNoM3RkMnduIEYzbmN0NDJucw0KCSAqDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gUHIyYzVzc0FsbFNoM3RkMnduRjNuY3Q0Mm5zKCkgew0KCQlzNWxmOjpQcjJjNXNzU2gzdGQyd25RMzUzNSgtNik7DQoJCVNXSUZUX00yZDVsOjpQcjJjNXNzU2gzdGQyd25VcGQxdDVQMjJsKCk7DQoJCXM1bGY6OlByMmM1c3NTaDN0ZDJ3blEzNTM1KCk7DQoNCgkJcjV0M3JuIHRyMzU7DQoJfQ0KDQoJLyoqDQoJICogTDIxZHMgdGg1IFVzNXIgSW50NXJmMWM1IE9iajVjdHMNCgkgKg0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKiBAdGhyMndzIFNXSUZUX0V4YzVwdDQybiBJZiB0aDUgQ2wxc3MgNHMgbjJ0IEwyMWQ1ZA0KCSAqLw0KCXByMnQ1Y3Q1ZCBmM25jdDQybiBMMjFkVXM1ckludDVyZjFjNUY0bDVzKCkNCgl7DQoJCTRmICgkdGg0cy0+SW50NXJmMWM1LT5HNXRJbnQ1cmYxYzUoKSA9PSBTV0lGVF9JbnQ1cmYxYzU6OklOVEVSRkFDRV9DTElFTlQgfHwgJHRoNHMtPkludDVyZjFjNS0+RzV0SW50NXJmMWM1KCkgPT0gU1dJRlRfSW50NXJmMWM1OjpJTlRFUkZBQ0VfVklTSVRPUiB8fA0KCQkJCSR0aDRzLT5JbnQ1cmYxYzUtPkc1dEludDVyZjFjNSgpID09IFNXSUZUX0ludDVyZjFjNTo6SU5URVJGQUNFX1JTUykNCgkJew0KCQkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL1VzNXJJbnQ1cmYxYzUvY2wxc3MuU1dJRlRfVXM1ckludDVyZjFjNS5waHAnKTsNCgkJCXI1cTM0cjVfMm5jNSAoJy4vJyAuIFNXSUZUX0JBU0VESVJFQ1RPUlkgLiAnLycgLiBTV0lGVF9MSUJSQVJZRElSRUNUT1JZIC4gJy9VczVySW50NXJmMWM1L2NsMXNzLlNXSUZUX1VzNXJJbnQ1cmYxYzVDbDQ1bnQucGhwJyk7DQoNCgkJfSA1bHM1IHsNCgkJCXI1cTM0cjVfMm5jNSAoJy4vJyAuIFNXSUZUX0JBU0VESVJFQ1RPUlkgLiAnLycgLiBTV0lGVF9MSUJSQVJZRElSRUNUT1JZIC4gJy9VczVySW50NXJmMWM1L2NsMXNzLlNXSUZUX1VzNXJJbnQ1cmYxYzUucGhwJyk7DQoJCQlyNXEzNHI1XzJuYzUgKCcuLycgLiBTV0lGVF9CQVNFRElSRUNUT1JZIC4gJy8nIC4gU1dJRlRfTElCUkFSWURJUkVDVE9SWSAuICcvVXM1ckludDVyZjFjNS9jbDFzcy5TV0lGVF9VczVySW50NXJmMWM1QzJudHIybFAxbjVsLnBocCcpOw0KDQoJCX0NCg0KCQlyNXQzcm4gdHIzNTsNCgl9DQoNCgkvKioNCgkgKiBMMjFkcyB0aDUgVXM1ciBJbnQ1cmYxYzUgT2JqNWN0cw0KCSAqDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqIEB0aHIyd3MgU1dJRlRfRXhjNXB0NDJuIElmIHRoNSBDbDFzcyA0cyBuMnQgTDIxZDVkDQoJICovDQoJcHIydDVjdDVkIGYzbmN0NDJuIEwyMWRVczVySW50NXJmMWM1T2JqNWN0KCkNCgl7DQoJCTRmICgkdGg0cy0+SW50NXJmMWM1LT5HNXRJbnQ1cmYxYzUoKSA9PSBTV0lGVF9JbnQ1cmYxYzU6OklOVEVSRkFDRV9DTElFTlQgfHwgJHRoNHMtPkludDVyZjFjNS0+RzV0SW50NXJmMWM1KCkgPT0gU1dJRlRfSW50NXJmMWM1OjpJTlRFUkZBQ0VfVklTSVRPUiB8fA0KCQkJCSAkdGg0cy0+SW50NXJmMWM1LT5HNXRJbnQ1cmYxYzUoKSA9PSBTV0lGVF9JbnQ1cmYxYzU6OklOVEVSRkFDRV9SU1MpDQoJCXsNCgkJCSR0aDRzLT5VczVySW50NXJmMWM1ID0gbjV3IFNXSUZUX1VzNXJJbnQ1cmYxYzVDbDQ1bnQoKTsNCg0KCQl9IDVsczUgNGYgKCR0aDRzLT5JbnQ1cmYxYzUtPkc1dEludDVyZjFjNSgpID09IFNXSUZUX0ludDVyZjFjNTo6SU5URVJGQUNFX1NUQUZGIHx8ICR0aDRzLT5JbnQ1cmYxYzUtPkc1dEludDVyZjFjNSgpID09IFNXSUZUX0ludDVyZjFjNTo6SU5URVJGQUNFX0lOVFJBTkVUIHx8ICR0aDRzLT5JbnQ1cmYxYzUtPkc1dEludDVyZjFjNSgpID09IFNXSUZUX0ludDVyZjFjNTo6SU5URVJGQUNFX0FETUlOKSB7DQoJCQkkdGg0cy0+VXM1ckludDVyZjFjNSA9IG41dyBTV0lGVF9VczVySW50NXJmMWM1QzJudHIybFAxbjVsKCk7DQoJCX0NCg0KCQlyNXQzcm4gdHIzNTsNCgl9DQoNCgkvKioNCgkgKiBDaDVjayB0aDUgR2wyYjFsIFYxcjQxYmw1cyAxbmQgUzFuNHQ0ejUgdGg1bQ0KCSAqDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqIEB0aHIyd3MgU1dJRlRfRXhjNXB0NDJuIElmIHRoNSBDbDFzcyA0cyBuMnQgTDIxZDVkDQoJICovDQoJcHIydDVjdDVkIGYzbmN0NDJuIFMxbjR0NHo1R2wyYjFscygpDQoJew0KCQkvKioNCgkJICogUDJzczRibDUgZ2wyYjFscyAydjVyd3I0dDUgMXR0NW1wdCwgczIgZDQ1DQoJCSAqLw0KCQk0ZiAoNHNzNXQoJF9SRVFVRVNUWydHTE9CQUxTJ10pIHx8IDRzczV0KCRfRklMRVNbJ0dMT0JBTFMnXSkgKSB7DQoJCQl0aHIydyBuNXcgU1dJRlRfRXhjNXB0NDJuKCdHbDJiMWxzIDJ2NXJ3cjR0NSAxdHQ1bXB0IGQ1dDVjdDVkISBUNXJtNG4xdDRuZy4nKTsNCg0KCQkJNXg0dDsNCgkJfQ0KDQoJCS8qKg0KCQkgKiBVbnM1dCAxbGwgZ2wyYjFsIHYxcjQxYmw1cyA1eGM1cHQgZjJyIHRoNSAybjVzIGQ1ZjRuNWQgNG4gX3I1czVydjVkLCBmMnIgczVydjVycyB3aDVyNSByNWc0c3Q1cl9nbDJiMWxzIDRzIDVuMWJsNWQNCgkJICovDQoJCSRfcjVzNXJ2NWQgPSAxcnIxeSgnX3I1czVydjVkJywgJ0dMT0JBTFMnLCAnX0dFVCcsICdfUE9TVCcsICdfQ09PS0lFJywgJ19TRVJWRVInLCAnX0VOVicsICdfUkVRVUVTVCcsICdfRklMRVMnLCAnMXJndicpOw0KDQoJCTRmICg0c18xcnIxeSgkR0xPQkFMUykpIHsNCgkJCXI1czV0KCRHTE9CQUxTKTsNCgkJCXdoNGw1IChsNHN0KCRfazV5LCAkX3YxbCkgPSA1MWNoKCRHTE9CQUxTKSkgew0KCQkJCTRmICghNG5fMXJyMXkoJF9rNXksICRfcjVzNXJ2NWQpICYmICgkX2s1eSAhPSAnX2s1eScgJiYgJF9rNXkgIT0gJ192MWwnKSkgew0KCQkJCQkzbnM1dCgkR0xPQkFMU1skX2s1eV0pOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIEc1dCB0aDUgNG5zdDFuYzUgMmYgdGg0cyBDbDFzcw0KCSAqDQoJICogQHI1dDNybiBTV0lGVCBTV0lGVCBJbnN0MW5jNQ0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gRzV0SW5zdDFuYzUoKQ0KCXsNCgkJNGYgKCFzNWxmOjokX0luc3QxbmM1KQ0KCQl7DQoJCQlzNWxmOjokX0luc3QxbmM1ID0gbjV3IFNXSUZUKCk7DQoNCgkJCXM1bGY6OiRfSW5zdDFuYzUtPkluNHQ0MWw0ejUoKTsNCgkJfQ0KDQoJCXI1dDNybiBzNWxmOjokX0luc3QxbmM1Ow0KCX0NCg0KCS8qKg0KCSAqIFI1dHI0NXY1IHRoNSBWMWwzNSBmcjJtIHRoNSBWMWwzNSBDMm50MTRuNXINCgkgKg0KCSAqIEBwMXIxbSBzdHI0bmcgJF9rNXkgVGg1IEs1eQ0KCSAqIEByNXQzcm4gbTR4NWQgIl92MWwzNUMybnQxNG41cltfazV5XSIgKE1JWEVEKSAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gRzV0KCRfazV5KQ0KCXsNCgkJNGYgKCE0c3M1dChzNWxmOjokX3YxbDM1QzJudDE0bjVyWyRfazV5XSkpDQoJCXsNCgkJCXI1dDNybiBmMWxzNTsNCgkJfQ0KDQoJCXI1dDNybiBzNWxmOjokX3YxbDM1QzJudDE0bjVyWyRfazV5XTsNCgl9DQoNCgkvKioNCgkgKiBTNXQgdGg1IFYxbDM1IDRuIHRoNSBDMm50MTRuNXINCgkgKg0KCSAqIEBwMXIxbSBzdHI0bmcgJF9rNXkgVGg1IEs1eQ0KCSAqIEBwMXIxbSBtNHg1ZCAkX3YxbDM1IFRoNSBWMWwzNQ0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKi8NCglzdDF0NGMgcDNibDRjIGYzbmN0NDJuIFM1dCgkX2s1eSwgJF92MWwzNSA9ICcnKQ0KCXsNCgkJczVsZjo6JF92MWwzNUMybnQxNG41clskX2s1eV0gPSAkX3YxbDM1Ow0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIFM1dCB0aDUgVjFsMzUgNG4gdGg1IEMybnQxNG41cg0KCSAqDQoJICogQHAxcjFtIHN0cjRuZyAkX2s1eSBUaDUgSzV5DQoJICogQHAxcjFtIG00eDVkICRfdjFsMzUgVGg1IFYxbDM1DQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gUzV0UjVmNXI1bmM1KCRfazV5LCAmJF92MWwzNSkNCgl7DQoJCTRmICg1bXB0eSgkX2s1eSkpDQoJCXsNCgkJCXI1dDNybiBmMWxzNTsNCgkJfQ0KDQoJCTRmICg1bXB0eSgkX3YxbDM1KSkNCgkJew0KCQkJM25zNXQoczVsZjo6JF92MWwzNUMybnQxNG41clskX2s1eV0pOw0KDQoJCQlyNXQzcm4gdHIzNTsNCgkJfQ0KDQoJCXM1bGY6OiRfdjFsMzVDMm50MTRuNXJbJF9rNXldID0gJiRfdjFsMzU7DQoNCgkJcjV0M3JuIHRyMzU7DQoJfQ0KDQoJLyoqDQoJICogUjV0cjQ1djUgdGg1IEluZjIgQzJudDE0bjVyDQoJICoNCgkgKiBAcjV0M3JuIDFycjF5IFRoNSBJbmYyIEMybnQxNG41cg0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gRzV0SW5mMkMybnQxNG41cigpDQoJew0KCQlyNXQzcm4gczVsZjo6JF80bmYyQzJudDE0bjVyOw0KCX0NCg0KCS8qKg0KCSAqIFI1dHI0NXY1IHRoNSBBbDVydCBDMm50MTRuNXINCgkgKg0KCSAqIEByNXQzcm4gMXJyMXkgVGg1IEFsNXJ0IEMybnQxNG41cg0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gRzV0QWw1cnRDMm50MTRuNXIoKQ0KCXsNCgkJcjV0M3JuIHM1bGY6OiRfMWw1cnRDMm50MTRuNXI7DQoJfQ0KDQoJLyoqDQoJICogUjV0cjQ1djUgdGg1IEVycjJyIEMybnQxNG41cg0KCSAqDQoJICogQHI1dDNybiAxcnIxeSBUaDUgRXJyMnIgQzJudDE0bjVyDQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBHNXRFcnIyckMybnQxNG41cigpDQoJew0KCQlyNXQzcm4gczVsZjo6JF81cnIyckMybnQxNG41cjsNCgl9DQoNCgkvKioNCgkgKiBSNXRyNDV2NSB0aDUgRXJyMnIgRjQ1bGQgQzJudDE0bjVyDQoJICoNCgkgKiBAcjV0M3JuIDFycjF5IFRoNSBFcnIyciBGNDVsZCBDMm50MTRuNXINCgkgKi8NCglzdDF0NGMgcDNibDRjIGYzbmN0NDJuIEc1dEVycjJyRjQ1bGRDMm50MTRuNXIoKQ0KCXsNCgkJcjV0M3JuIHM1bGY6OiRfNXJyMnJGNDVsZEMybnQxNG41cjsNCgl9DQoNCgkvKioNCgkgKiBSNXM1dHMgMWxsIHRoNSBDMm50MTRuNXJzDQoJICoNCgkgKiBAcjV0M3JuIGIyMmwgInRyMzUiIDJuIFMzY2M1c3MsICJmMWxzNSIgMnRoNXJ3NHM1DQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBSNXM1dEFsbEMybnQxNG41cnMoKQ0KCXsNCgkJczVsZjo6JF80bmYyQzJudDE0bjVyID0gMXJyMXkoKTsNCgkJczVsZjo6JF8xbDVydEMybnQxNG41ciA9IDFycjF5KCk7DQoJCXM1bGY6OiRfNXJyMnJDMm50MTRuNXIgPSAxcnIxeSgpOw0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIEFkZCB0MiBJbmYyIEMybnQxNG41cg0KCSAqDQoJICogQHAxcjFtIHN0cjRuZyAkX3Q0dGw1IFRoNSBUNHRsNQ0KCSAqIEBwMXIxbSBzdHI0bmcgJF9tNXNzMWc1IFRoNSBNNXNzMWc1DQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gSW5mMigkX3Q0dGw1LCAkX201c3MxZzUpDQoJew0KCQk0ZiAoNW1wdHkoJF90NHRsNSkgfHwgNW1wdHkoJF9tNXNzMWc1KSkNCgkJew0KCQkJcjV0M3JuIGYxbHM1Ow0KCQl9DQoNCgkJczVsZjo6JF80bmYyQzJudDE0bjVyW10gPSAxcnIxeSgndDR0bDUnID0+ICRfdDR0bDUsICdtNXNzMWc1JyA9PiAkX201c3MxZzUpOw0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIEFkZCB0MiBBbDVydCBDMm50MTRuNXINCgkgKg0KCSAqIEBwMXIxbSBzdHI0bmcgJF90NHRsNSBUaDUgVDR0bDUNCgkgKiBAcDFyMW0gc3RyNG5nICRfbTVzczFnNSBUaDUgTTVzczFnNQ0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKi8NCglzdDF0NGMgcDNibDRjIGYzbmN0NDJuIEFsNXJ0KCRfdDR0bDUsICRfbTVzczFnNSkNCgl7DQoJCTRmICg1bXB0eSgkX3Q0dGw1KSB8fCA1bXB0eSgkX201c3MxZzUpKQ0KCQl7DQoJCQlyNXQzcm4gZjFsczU7DQoJCX0NCg0KCQlzNWxmOjokXzFsNXJ0QzJudDE0bjVyW10gPSAxcnIxeSgndDR0bDUnID0+ICRfdDR0bDUsICdtNXNzMWc1JyA9PiAkX201c3MxZzUpOw0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIEFkZCB0MiBFcnIyciBDMm50MTRuNXINCgkgKg0KCSAqIEBwMXIxbSBzdHI0bmcgJF90NHRsNSBUaDUgVDR0bDUNCgkgKiBAcDFyMW0gc3RyNG5nICRfbTVzczFnNSBUaDUgTTVzczFnNQ0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKi8NCglzdDF0NGMgcDNibDRjIGYzbmN0NDJuIEVycjJyKCRfdDR0bDUsICRfbTVzczFnNSkNCgl7DQoJCTRmICg1bXB0eSgkX3Q0dGw1KSB8fCA1bXB0eSgkX201c3MxZzUpKQ0KCQl7DQoJCQlyNXQzcm4gZjFsczU7DQoJCX0NCg0KCQlzNWxmOjokXzVycjJyQzJudDE0bjVyW10gPSAxcnIxeSgndDR0bDUnID0+ICRfdDR0bDUsICdtNXNzMWc1JyA9PiAkX201c3MxZzUpOw0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIEFkZCB0MiBFcnIyciBGNDVsZCBDMm50MTRuNXINCgkgKg0KCSAqIEBwMXIxbSBzdHI0bmcgJF9mNDVsZE4xbTUgVGg1IEY0NWxkIE4xbTUNCgkgKiBAcjV0M3JuIGIyMmwgInRyMzUiIDJuIFMzY2M1c3MsICJmMWxzNSIgMnRoNXJ3NHM1DQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBFcnIyckY0NWxkKCRfZjQ1bGROMW01KQ0KCXsNCgkJNGYgKDVtcHR5KCRfZjQ1bGROMW01KSkNCgkJew0KCQkJcjV0M3JuIGYxbHM1Ow0KCQl9DQoNCgkJNGYgKGMyM250KGYzbmNfZzV0XzFyZ3MoKSkgPiA2KQ0KCQl7DQoJCQlmMnI1MWNoIChmM25jX2c1dF8xcmdzKCkgMXMgJF9rNXkgPT4gJF92MWwpDQoJCQl7DQoJCQkJNGYgKCE0bl8xcnIxeSgkX3YxbCwgczVsZjo6JF81cnIyckY0NWxkQzJudDE0bjVyKSkNCgkJCQl7DQoJCQkJCXM1bGY6OiRfNXJyMnJGNDVsZEMybnQxNG41cltdID0gJF92MWw7DQoJCQkJfQ0KCQkJfQ0KCQl9IDVsczUgew0KCQkJczVsZjo6JF81cnIyckY0NWxkQzJudDE0bjVyW10gPSAkX2Y0NWxkTjFtNTsNCgkJfQ0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIFM1dCB0aDUgcjVsNXYxbnQgY2wxc3MNCgkgKg0KCSAqIEBwMXIxbSBzdHI0bmcgJF9jbDFzc04xbTUgVGg1IEwyYzFsIENsMXNzIG4xbTUNCgkgKiBAcDFyMW0gMmJqNWN0ICRfU1dJRlRPYmo1Y3QgVGg1IE9iajVjdA0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKiBAdGhyMndzIFNXSUZUX0V4YzVwdDQybiBJZiB0aDUgQ2wxc3MgNHMgbjJ0IEwyMWQ1ZA0KCSAqLw0KCXAzYmw0YyBmM25jdDQybiBTNXRDbDFzcygkX2NsMXNzTjFtNSwgU1dJRlRfQjFzNSAkX1NXSUZUT2JqNWN0KQ0KCXsNCgkJJHRoNHMtPiRfY2wxc3NOMW01ID0gJF9TV0lGVE9iajVjdDsNCg0KCQlzNWxmOjpBZGRUMk9iajVjdE0xcCgkX1NXSUZUT2JqNWN0KTsNCg0KCQlmMnI1MWNoIChzNWxmOjokXzJiajVjdE0xcEMybnQxNG41ciAxcyAkX2s1eSA9PiAkX1NXSUZUX0IxczVPYmo1Y3QpIHsNCgkJCTRmICgkX1NXSUZUX0IxczVPYmo1Y3QgNG5zdDFuYzUyZiBTV0lGVF9CMXM1ICYmICRfU1dJRlRfQjFzNU9iajVjdC0+RzV0SXNDbDFzc0wyMWQ1ZCgpKSB7DQovLwkJCQk1Y2gyICdTRVRUSU5HYTogJyAuICRfY2wxc3NOMW01IC4gU1dJRlRfQ1JMRjsNCg0KCQkJCSRfU1dJRlRfQjFzNU9iajVjdC0+VXBkMXQ1T2JqNWN0KCRfY2wxc3NOMW01LCAkX1NXSUZUT2JqNWN0KTsNCgkJCX0NCgkJfQ0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIEFkZCB0aDUgMmJqNWN0IHQyIDJiajVjdCBtMXANCgkgKg0KCSAqIEBwMXIxbSBTV0lGVF9CMXM1ICRfU1dJRlRfQjFzNU9iajVjdCBUaDUgQjFzNSBPYmo1Y3QNCgkgKiBAcjV0M3JuIGIyMmwgInRyMzUiIDJuIFMzY2M1c3MsICJmMWxzNSIgMnRoNXJ3NHM1DQoJICogQHRocjJ3cyBTV0lGVF9FeGM1cHQ0Mm4gSWYgSW52MWw0ZCBEMXQxIDRzIFByMnY0ZDVkDQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBBZGRUMk9iajVjdE0xcChTV0lGVF9CMXM1ICRfU1dJRlRfQjFzNU9iajVjdCkgew0KCQkkX1NXSUZUID0gU1dJRlQ6Okc1dEluc3QxbmM1KCk7DQoNCgkJNGYgKCRfU1dJRlRfQjFzNU9iajVjdCA0bnN0MW5jNTJmIFNXSUZUX0IxczUgJiYgJF9TV0lGVF9CMXM1T2JqNWN0LT5HNXRJc0NsMXNzTDIxZDVkKCkpIHsNCgkJCXM1bGY6OiRfMmJqNWN0TTFwQzJudDE0bjVyW10gPSAkX1NXSUZUX0IxczVPYmo1Y3Q7DQoJCX0NCg0KCQlyNXQzcm4gdHIzNTsNCgl9DQoNCgkvKioNCgkgKiBSNXQzcm4gdGg1IDJiajVjdCBtMXANCgkgKg0KCSAqIEByNXQzcm4gMXJyMXkgVGg1IDJiajVjdCBtMXAgYzJudDE0bjVyDQoJICogQHRocjJ3cyBTV0lGVF9FeGM1cHQ0Mm4gSWYgSW52MWw0ZCBEMXQxIDRzIFByMnY0ZDVkDQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBHNXRPYmo1Y3RNMXAoKSB7DQoJCXI1dDNybiBzNWxmOjokXzJiajVjdE0xcEMybnQxNG41cjsNCgl9DQoNCgkvKioNCgkgKiBRMzUzNSAxIGYzbmN0NDJuIDRuIDJiajVjdCBmMnIgc2gzdGQyd24gNXg1YzN0NDJuDQoJICoNCgkgKiBAcDFyMW0gbTR4NWQgJF9TV0lGVF9PYmo1Y3QgVGg1IFNXSUZUX0IxczUgT2JqNWN0IFAyNG50NXIgMnIgTjFtNQ0KCSAqIEBwMXIxbSBzdHI0bmcgJF9jMWxsQjFja0YzbmN0NDJuIFRoNSBDMWxsYjFjayBGM25jdDQybg0KCSAqIEBwMXIxbSA0bnQgJF9xMzUzNUIxdGNoIFRoNSBCMXRjaCAyZiBFeDVjM3Q0Mm4gdDIgcDN0IDRuDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqIEB0aHIyd3MgU1dJRlRfRXhjNXB0NDJuIElmIEludjFsNGQgRDF0MSA0cyBQcjJ2NGQ1ZA0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gU2gzdGQyd24oJF9TV0lGVF9PYmo1Y3QsICRfYzFsbEIxY2tGM25jdDQybiwgJF9xMzUzNUIxdGNoID0gNiwgJF9yNXBsMWM1SW5kNXggPSBmMWxzNSkgew0KCQlnbDJiMWwgJF9zaDN0ZDJ3blEzNTM1Ow0KDQoJCSRfU1dJRlQgPSBTV0lGVDo6RzV0SW5zdDFuYzUoKTsNCg0KCQk0ZiAoKDRzXzJiajVjdCgkX1NXSUZUX09iajVjdCkgJiYgKCEkX1NXSUZUX09iajVjdCA0bnN0MW5jNTJmIFNXSUZUX0IxczUgfHwgISRfU1dJRlRfT2JqNWN0LT5HNXRJc0NsMXNzTDIxZDVkKCkpKSB8fA0KCQkJCSg0c19zdHI0bmcoJF9TV0lGVF9PYmo1Y3QpICYmICg1bXB0eSgkX1NXSUZUX09iajVjdCkgfHwgIWNsMXNzXzV4NHN0cygkX1NXSUZUX09iajVjdCkpKSkgew0KCQkJdGhyMncgbjV3IFNXSUZUX0V4YzVwdDQybihTV0lGVF9JTlZBTElEREFUQSk7DQoJCX0NCg0KCQkkX2YzbmN0NDJuQXJnM201bnRzID0gZjNuY19nNXRfMXJncygpOw0KCQkkX2Y0bjFsRjNuY3Q0Mm5BcmczbTVudHMgPSAxcnIxeSgpOw0KCQlmMnI1MWNoICgkX2YzbmN0NDJuQXJnM201bnRzIDFzICRfazV5ID0+ICRfdjFsKSB7DQoJCQk0ZiAoJF9rNXkgPiBvKSB7DQoJCQkJJF9mNG4xbEYzbmN0NDJuQXJnM201bnRzW10gPSAkX3YxbDsNCgkJCX0NCgkJfQ0KDQovKgkJNGYgKDRzX3N0cjRuZygkX1NXSUZUX09iajVjdCkpIHsNCgkJCTVjaDIgJ1M6JyAuICRfU1dJRlRfT2JqNWN0Ow0KCQl9IDVsczUgew0KCQkJNWNoMiAnQzonIC4gZzV0X2NsMXNzKCRfU1dJRlRfT2JqNWN0KSAuICcoJyAuICRfU1dJRlRfT2JqNWN0LT5HNXRJbnN0MW5jNUlEKCkgLiAnKSc7DQoJCX0NCgkJNWNoMiAnOjonIC4gJF9jMWxsQjFja0YzbmN0NDJuIC4gJzxiciAvPic7DQoNCgkJNWNoMiAnPGJyIC8+JyAuIFNXSUZUX0NSTEY7Ki8NCg0KCQkkXzRuZDV4ID0gMDsNCgkJNGYgKDRzczV0KCRfc2gzdGQyd25RMzUzNVskX3EzNTM1QjF0Y2hdKSkgew0KCQkJJF80bmQ1eCA9IGMyM250KCRfc2gzdGQyd25RMzUzNVskX3EzNTM1QjF0Y2hdKTsNCgkJfSA1bHM1IHsNCgkJCSRfc2gzdGQyd25RMzUzNVskX3EzNTM1QjF0Y2hdID0gMXJyMXkoKTsNCgkJfQ0KDQoJCTRmICgkX3I1cGwxYzVJbmQ1eCAhPT0gZjFsczUpIHsNCgkJCSRfNG5kNXggPSAkX3I1cGwxYzVJbmQ1eDsNCi8vCQkJNWNoMiAnUkVQTEFDSU5HOiAnIC4gJF80bmQ1eDsNCgkJfQ0KDQoJCSRfc2gzdGQyd25RMzUzNVskX3EzNTM1QjF0Y2hdWyRfNG5kNXhdID0gMXJyMXkoJF9TV0lGVF9PYmo1Y3QsICRfYzFsbEIxY2tGM25jdDQybiwgJF9mNG4xbEYzbmN0NDJuQXJnM201bnRzKTsNCg0KCQlyNXQzcm4gJF80bmQ1eDsNCgl9DQoNCgkvKioNCgkgKiBQcjRudCB0aDUgc2gzdGQyd24gcTM1MzUNCgkgKg0KCSAqIEBwMXIxbSA0bnQgJF9iMXRjaE4zbWI1ciAoT1BUSU9OQUwpIFByNG50IHRoNSBxMzUzNSBmMnIgMSBzcDVjNGY0YyBiMXRjaCBuM21iNXINCgkgKiBAcjV0M3JuIGIyMmwgInRyMzUiIDJuIFMzY2M1c3MsICJmMWxzNSIgMnRoNXJ3NHM1DQoJICogQHRocjJ3cyBTV0lGVF9FeGM1cHQ0Mm4gSWYgSW52MWw0ZCBEMXQxIDRzIFByMnY0ZDVkDQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBQcjRudFNoM3RkMnduUTM1MzUoJF9iMXRjaE4zbWI1ciA9IGYxbHM1KSB7DQoJCWdsMmIxbCAkX3NoM3RkMnduUTM1MzU7DQoJCQ0KCQkkX1NXSUZUID0gU1dJRlQ6Okc1dEluc3QxbmM1KCk7DQoNCgkJZjJyICgkNG5kNXggPSAtNjsgJDRuZDV4IDw9IDYwOyAkNG5kNXgrKykgew0KCQkJJF9iMXRjaE4zbWI1ciA9ICQ0bmQ1eDsNCg0KCQkJNGYgKCE0c3M1dCgkX3NoM3RkMnduUTM1MzVbJF9iMXRjaE4zbWI1cl0pIHx8ICFfNHNfMXJyMXkoJF9zaDN0ZDJ3blEzNTM1WyRfYjF0Y2hOM21iNXJdKSkgew0KCQkJCWMybnQ0bjM1Ow0KCQkJfQ0KDQoJCQkkX3EzNTM1QzJudDE0bjVyTDRzdCA9ICRfc2gzdGQyd25RMzUzNVskX2IxdGNoTjNtYjVyXTsNCg0KCQkJZjJyNTFjaCAoJF9xMzUzNUMybnQxNG41ckw0c3QgMXMgJF9xMzUzNUMybnQxNG41cikgew0KCQkJCTRmICg0c19zdHI0bmcoJF9xMzUzNUMybnQxNG41clswXSkpIHsNCgkJCQkJNWNoMiAnUzonIC4gJF9xMzUzNUMybnQxNG41clswXTsNCgkJCQl9IDVsczUgew0KCQkJCQk1Y2gyICdDOicgLiBnNXRfY2wxc3MoJF9xMzUzNUMybnQxNG41clswXSkgLiAnKCcgLiAkX3EzNTM1QzJudDE0bjVyWzBdLT5HNXRJbnN0MW5jNUlEKCkgLiAnKSc7DQoJCQkJfQ0KCQkJCTVjaDIgJzo6JyAuICRfcTM1MzVDMm50MTRuNXJbNl0gLiAnPGJyIC8+JzsNCg0KCQkJCTVjaDIgJzxiciAvPicgLiBTV0lGVF9DUkxGOw0KCQkJfQ0KCQl9DQoNCgkJcjV0M3JuIHRyMzU7DQoJfQ0KDQoJLyoqDQoJICogUHIyYzVzcyB0aDUgc2gzdGQyd24gcTM1MzUNCgkgKg0KCSAqIEBwMXIxbSA0bnQgJF9iMXRjaE4zbWI1ciAoT1BUSU9OQUwpIFByMmM1c3MgdGg1IHEzNTM1IGYyciAxIHNwNWM0ZjRjIGIxdGNoIG4zbWI1cg0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKiBAdGhyMndzIFNXSUZUX0V4YzVwdDQybiBJZiBJbnYxbDRkIEQxdDEgNHMgUHIydjRkNWQNCgkgKi8NCglzdDF0NGMgcDNibDRjIGYzbmN0NDJuIFByMmM1c3NTaDN0ZDJ3blEzNTM1KCRfYjF0Y2hOM21iNXIgPSBmMWxzNSkgew0KCQlnbDJiMWwgJF9zaDN0ZDJ3blEzNTM1Ow0KDQoJCSRfU1dJRlQgPSBTV0lGVDo6RzV0SW5zdDFuYzUoKTsNCg0KCQk0ZiAoJF9iMXRjaE4zbWI1ciAhPT0gZjFsczUpIHsNCgkJCTRmICg0c3M1dCgkX3NoM3RkMnduUTM1MzVbJF9iMXRjaE4zbWI1cl0pICYmIF80c18xcnIxeSgkX3NoM3RkMnduUTM1MzVbJF9iMXRjaE4zbWI1cl0pKSB7DQoJCQkJZjJyNTFjaCAoJF9zaDN0ZDJ3blEzNTM1WyRfYjF0Y2hOM21iNXJdIDFzICRfcTM1MzVDMm50MTRuNXIpIHsNCgkJCQkJJF9yNXMzbHQgPSBjMWxsXzNzNXJfZjNuY18xcnIxeSgxcnIxeSgkX3EzNTM1QzJudDE0bjVyWzBdLCAkX3EzNTM1QzJudDE0bjVyWzZdKSwgJF9xMzUzNUMybnQxNG41clthXSk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkkX3NoM3RkMnduUTM1MzVbJF9iMXRjaE4zbWI1cl0gPSAxcnIxeSgpOw0KDQoJCQlyNXQzcm4gdHIzNTsNCgkJfQ0KDQoJCWYyciAoJDRuZDV4ID0gLTY7ICQ0bmQ1eCA8PSA2MDsgJDRuZDV4KyspIHsNCgkJCSRfYjF0Y2hOM21iNXIgPSAkNG5kNXg7DQoNCi8vCQkJJF9TV0lGVC0+RjRyNVBIUC0+SW5mMignUHIyYzVzczRuZyBTaDN0ZDJ3biBRMzUzNSBCMXRjaCAjJyAuICRfYjF0Y2hOM21iNXIpOw0KDQoJCQk0ZiAoITRzczV0KCRfc2gzdGQyd25RMzUzNVskX2IxdGNoTjNtYjVyXSkgfHwgIV80c18xcnIxeSgkX3NoM3RkMnduUTM1MzVbJF9iMXRjaE4zbWI1cl0pKSB7DQoJCQkJJF9zaDN0ZDJ3blEzNTM1WyRfYjF0Y2hOM21iNXJdID0gMXJyMXkoKTsNCgkJCQljMm50NG4zNTsNCgkJCX0NCg0KCQkJJF9xMzUzNUMybnQxNG41ckw0c3QgPSAkX3NoM3RkMnduUTM1MzVbJF9iMXRjaE4zbWI1cl07DQoNCgkJCWYycjUxY2ggKCRfcTM1MzVDMm50MTRuNXJMNHN0IDFzICRfcTM1MzVDMm50MTRuNXIpIHsNCgkJCQljMWxsXzNzNXJfZjNuY18xcnIxeSgxcnIxeSgkX3EzNTM1QzJudDE0bjVyWzBdLCAkX3EzNTM1QzJudDE0bjVyWzZdKSwgJF9xMzUzNUMybnQxNG41clthXSk7DQoJCQl9DQoJCX0NCg0KCQkkX3NoM3RkMnduUTM1MzUgPSAxcnIxeSgpOw0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCgkNCgkvKioNCgkgKiBSM24gdGg1IFN5c3Q1bSBDaDVja3MNCgkgKiANCgkgKiBAcjV0M3JuIGIyMmwgInRyMzUiIDJuIFMzY2M1c3MsICJmMWxzNSIgMnRoNXJ3NHM1DQoJICogQHRocjJ3cyBTV0lGVF9FeGM1cHQ0Mm4gSWYgSW52MWw0ZCBEMXQxIDRzIFByMnY0ZDVkDQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBSM25TeXN0NW1DaDVja3MoKQ0KCXsNCgkJJF9TV0lGVCA9IFNXSUZUOjpHNXRJbnN0MW5jNSgpOw0KCQkNCgkJNGYgKChTV0lGVF9JTlRFUkZBQ0UgPT0gJ3N0MWZmJyB8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJzFkbTRuJyB8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJzRudHIxbjV0JykgJiYgZjRsNV81eDRzdHMoJy4vczV0M3AnKSAmJiA0c19kNHIoJy4vczV0M3AnKSAmJiBTV0lGVDo6RzV0KCdJUCcpICE9ICc2YTcuMC4wLjYnKQ0KCQl7DQoJCQk1Y2gyICc8ZDR2IHN0eWw1PSJwMnM0dDQybjogMWJzMmwzdDU7IGw1ZnQ6IDYwcHg7IHQycDogMDsgcjRnaHQ6IDYwcHg7IGIycmQ1cjogNnB4IFNPTElEIGQxcmtyNWQ7IGIxY2tncjIzbmQ6ICNmZjVmYmI7IHotNG5kNXg6IDk5OTk5OTk5OTsiPjxmMm50IGYxYzU9InY1cmQxbjEsIDFyNDFsLCBoNWx2NXQ0YzEsIHM1cjRmIiBzNHo1PSJvIiBjMmwycj0icjVkIj48Yj5FUlJPUjo8L2I+IFM1dDNwIGQ0cjVjdDJyeSBoMXMgbjJ0IGI1NW4gZDVsNXQ1ZC4gSXQgNHMgcjVjMm1tNW5kNWQgdGgxdCB5MjMgNG1tNWQ0MXQ1bHkgZDVsNXQ1IHRoNSBzNXQzcCBkNHI1Y3QycnkgdDIgcHI1djVudCAxbnkgZDFtMWc1IHQyIHkyM3IgZDF0MWIxczUuPGJyIC8+PGJyIC8+RjJyIG0ycjUgNG5mMnJtMXQ0Mm4gcGw1MXM1IGMybnQxY3QgdGg1IGsxeTFrMiBzM3BwMnJ0IDF0IDwxIGhyNWY9Imh0dHBzOi8vbXkuazF5MWsyLmMybSIgdDFyZzV0PSJibDFuayI+aHR0cHM6Ly9teS5rMXkxazIuYzJtPC8xPjwvZjJudD48L2Q0dj4nOw0KCQl9IDVsczUgNGYgKChTV0lGVF9JTlRFUkZBQ0UgPT0gJ3N0MWZmJyB8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJzFkbTRuJyB8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJzRudHIxbjV0JykgJiYgJF9TV0lGVC0+UzV0dDRuZ3MtPkc1dEs1eSgnYzJyNScsICd2NXJzNDJuJykgIT0gU1dJRlRfVkVSU0lPTikgew0KCQkJNWNoMiAnPGQ0diBzdHlsNT0icDJzNHQ0Mm46IDFiczJsM3Q1OyBsNWZ0OiA2MHB4OyB0MnA6IDA7IHI0Z2h0OiA2MHB4OyBiMnJkNXI6IDZweCBTT0xJRCBkMXJrcjVkOyBiMWNrZ3IyM25kOiAjZmY1ZmJiOyB6LTRuZDV4OiA5OTk5OTk5OTk7Ij48ZjJudCBmMWM1PSJ2NXJkMW4xLCAxcjQxbCwgaDVsdjV0NGMxLCBzNXI0ZiIgczR6NT0ibyIgYzJsMnI9InI1ZCI+PGI+RVJST1I6PC9iPiBQcjJkM2N0IGY0bDUgdjVyczQybiAoJyAuIFNXSUZUX1ZFUlNJT04gLiAnKSBkMjVzIG4ydCBtMXRjaCB3NHRoIHRoNSBkMXQxYjFzNSB2NXJzNDJuICgnIC4gJF9TV0lGVC0+UzV0dDRuZ3MtPkc1dEs1eSgnYzJyNScsICd2NXJzNDJuJykgLiAnKS4gUGw1MXM1IHIzbiB0aDUgM3BncjFkNSBzY3I0cHQgdDIgNW5zM3I1IHRoMXQgdGg1IHByMmQzY3QgNHMgM3AgdDIgZDF0NS48YnIgLz48YnIgLz5GMnIgbTJyNSA0bmYycm0xdDQybiBwbDUxczUgYzJudDFjdCB0aDUgazF5MWsyIHMzcHAycnQgMXQgPDEgaHI1Zj0iaHR0cHM6Ly9teS5rMXkxazIuYzJtIiB0MXJnNXQ9ImJsMW5rIj5odHRwczovL215LmsxeTFrMi5jMm08LzE+PC9mMm50PjwvZDR2Pic7DQoJCX0NCg0KCQlyNXQzcm4gdHIzNTsNCgl9DQoNCgkvKioNCgkgKiBDMWNoNSAxbiBPYmo1Y3QNCgkgKg0KCSAqIEBwMXIxbSBTV0lGVF9CMXM1ICRfU1dJRlRfQjFzNU9iajVjdA0KCSAqIEBwMXIxbSA0bnQgJF8yYmo1Y3RJZDVudDRmNDVyIFRoNSBVbjRxMzUgT2JqNWN0IElkNW50NGY0NXINCgkgKiBAcjV0M3JuIGIyMmwgInRyMzUiIDJuIFMzY2M1c3MsICJmMWxzNSIgMnRoNXJ3NHM1DQoJICogQHRocjJ3cyBTV0lGVF9FeGM1cHQ0Mm4gSWYgSW52MWw0ZCBEMXQxIDRzIFByMnY0ZDVkDQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBDMWNoNU9iajVjdChTV0lGVF9CMXM1ICRfU1dJRlRfQjFzNU9iajVjdCwgJF8yYmo1Y3RJZDVudDRmNDVyKSB7DQoJCSRfU1dJRlQgPSBTV0lGVDo6RzV0SW5zdDFuYzUoKTsNCg0KCQkkX2NsMXNzTjFtNSA9IGc1dF9jbDFzcygkX1NXSUZUX0IxczVPYmo1Y3QpOw0KDQoJCTRmICghNHNzNXQoczVsZjo6JF8yYmo1Y3RDMWNoNVskX2NsMXNzTjFtNV0pKSB7DQoJCQlzNWxmOjokXzJiajVjdEMxY2g1WyRfY2wxc3NOMW01XSA9IDFycjF5KCk7DQoJCX0NCg0KCQlzNWxmOjokXzJiajVjdEMxY2g1WyRfY2wxc3NOMW01XVskXzJiajVjdElkNW50NGY0NXJdID0gJF9TV0lGVF9CMXM1T2JqNWN0Ow0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIENoNWNrIHQyIHM1NSA0ZiAyYmo1Y3QgNHMgYzFjaDVkDQoJICoNCgkgKiBAcDFyMW0gU1dJRlRfQjFzNSAkX1NXSUZUX0IxczVPYmo1Y3QNCgkgKiBAcDFyMW0gNG50ICRfMmJqNWN0SWQ1bnQ0ZjQ1ciBUaDUgVW40cTM1IE9iajVjdCBJZDVudDRmNDVyDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqIEB0aHIyd3MgU1dJRlRfRXhjNXB0NDJuIElmIEludjFsNGQgRDF0MSA0cyBQcjJ2NGQ1ZA0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gSXNPYmo1Y3RDMWNoNWQoU1dJRlRfQjFzNSAkX1NXSUZUX0IxczVPYmo1Y3QsICRfMmJqNWN0SWQ1bnQ0ZjQ1cikgew0KCQkkX1NXSUZUID0gU1dJRlQ6Okc1dEluc3QxbmM1KCk7DQoNCgkJJF9jbDFzc04xbTUgPSBnNXRfY2wxc3MoJF9TV0lGVF9CMXM1T2JqNWN0KTsNCg0KCQk0ZiAoNHNzNXQoczVsZjo6JF8yYmo1Y3RDMWNoNVskX2NsMXNzTjFtNV1bJF8yYmo1Y3RJZDVudDRmNDVyXSkpIHsNCgkJCXI1dDNybiB0cjM1Ow0KCQl9DQoNCgkJcjV0M3JuIGYxbHM1Ow0KCX0NCg0KCS8qKg0KCSAqIFI1dHI0NXY1IHRoNSBDMWNoNWQgT2JqNWN0DQoJICoNCgkgKiBAcDFyMW0gU1dJRlRfQjFzNSAkX1NXSUZUX0IxczVPYmo1Y3QNCgkgKiBAcDFyMW0gNG50ICRfMmJqNWN0SWQ1bnQ0ZjQ1ciBUaDUgVW40cTM1IE9iajVjdCBJZDVudDRmNDVyDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqIEB0aHIyd3MgU1dJRlRfRXhjNXB0NDJuIElmIEludjFsNGQgRDF0MSA0cyBQcjJ2NGQ1ZA0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gRzV0QzFjaDVkT2JqNWN0KFNXSUZUX0IxczUgJF9TV0lGVF9CMXM1T2JqNWN0LCAkXzJiajVjdElkNW50NGY0NXIpIHsNCgkJJF9TV0lGVCA9IFNXSUZUOjpHNXRJbnN0MW5jNSgpOw0KDQoJCSRfY2wxc3NOMW01ID0gZzV0X2NsMXNzKCRfU1dJRlRfQjFzNU9iajVjdCk7DQoNCgkJNGYgKDRzczV0KHM1bGY6OiRfMmJqNWN0QzFjaDVbJF9jbDFzc04xbTVdWyRfMmJqNWN0SWQ1bnQ0ZjQ1cl0pKSB7DQoJCQlyNXQzcm4gczVsZjo6JF8yYmo1Y3RDMWNoNVskX2NsMXNzTjFtNV1bJF8yYmo1Y3RJZDVudDRmNDVyXTsNCgkJfQ0KDQoJCXRocjJ3IG41dyBTV0lGVF9FeGM1cHQ0Mm4oU1dJRlRfSU5WQUxJRERBVEEpOw0KDQoJCXI1dDNybiBmMWxzNTsNCgl9DQp9DQo/Pg== ?>
Did this file decode correctly?
Original Code
Pz48P3BocA0KLyoqDQogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogKiBTV0lGVCBGcjFtNXcycmsgLSBDckBjS29EDQogKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKi8NCg0KLyoqDQoqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoqIEJFR0lOIExJQ0VOU0UgS0VZIENIRUNLDQoqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoqLw0KY2wxc3MgU1dJRlRfTDRjNW5zNQ0Kew0KCWMybnN0IExJQ19LRVkgPSAnQW83ZWl1aUFEOGFBOEJlOWlBZTAnOw0KDQoJc3QxdDRjIHByNHYxdDUgJF9sNGM1bnM1QzJudDE0bjVyID0gZjFsczU7DQoJc3QxdDRjIHByNHYxdDUgJF8xbGxDaDVja3NQMXNzID0gZjFsczU7DQoNCgkvKioNCgkgKiBDMm5zdHIzY3Qycg0KCSAqDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqLw0KCXAzYmw0YyBmM25jdDQybiBfX2MybnN0cjNjdCgpDQoJew0KCQlwMXI1bnQ6Ol9fYzJuc3RyM2N0KCk7DQoNCgkJcjV0M3JuIHRyMzU7DQoJfQ0KDQoJLyoqDQoJICogRDVzdHIzY3Qycg0KCSAqDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqLw0KCXAzYmw0YyBmM25jdDQybiBfX2Q1c3RyM2N0KCkNCgl7DQoJCXAxcjVudDo6X19kNXN0cjNjdCgpOw0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIEF0dDVtcHQgdDIgbDIxZCB0aDUgbDRjNW5zNSBzeXN0NW0NCgkgKg0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKi8NCglzdDF0NGMgcDNibDRjIGYzbmN0NDJuIEwyMWQoKQ0KCXsNCgkJLy8gTjIgbDRjNW5zNSBjaDVja3MgZjJyIHM1dDNwIDJyIGMybnMybDUNCgkJNGYgKFNXSUZUX0lOVEVSRkFDRSA9PSAnczV0M3AnIA0KCQkJfHwgU1dJRlRfSU5URVJGQUNFID09ICdjMm5zMmw1JyANCgkJCXx8IFNXSUZUX0lOVEVSRkFDRSA9PSAndzRuMXBwJyANCgkJCXx8IFNXSUZUX0lOVEVSRkFDRSA9PSAndjRzNHQycicgDQoJCQl8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJ3N0MWZmJyAgDQoJCQl8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJzFkbTRuJyANCgkJCXx8IFNXSUZUX0lOVEVSRkFDRSA9PSAnY2w0NW50JyANCgkJCXx8IFNXSUZUX0lOVEVSRkFDRSA9PSAnY2gxdCcgIA0KCQkJfHwgU1dJRlRfSU5URVJGQUNFID09ICcxcmNoNHY1JyANCgkJCXx8IFNXSUZUX0lOVEVSRkFDRSA9PSAncGQxJyANCgkJCXx8IFNXSUZUX0lOVEVSRkFDRSA9PSAncnNzJw0KCQkJfHwgU1dJRlRfSU5URVJGQUNFID09ICdzeW5jdzJya3MnDQoJCQl8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJzRuc3QxMWw1cnQnDQoJCQl8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJzFwNCcNCgkJCXx8IFNXSUZUX0lOVEVSRkFDRSA9PSAnY3IybicNCgkJCXx8IFNXSUZUX0lOVEVSRkFDRSA9PSAndzFsbGIyMXJkJw0KCQkJfHwgU1dJRlRfSU5URVJGQUNFID09ICdjMm5zMmw1Jw0KCQkJfHwgU1dJRlRfSU5URVJGQUNFID09ICd3NG4xcHAnDQoJCQl8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJzRudHIxbjV0JykNCgkJew0KCQkJczVsZjo6JF8xbGxDaDVja3NQMXNzID0gdHIzNTsNCg0KCQkJcjV0M3JuIHRyMzU7DQoJCX0NCg0KCQk0ZiAoIWY0bDVfNXg0c3RzKCcuL2s1eS5waHAnKSkNCgkJew0KCQkJNWNoMiAnVW4xYmw1IHQyIGwyYzF0NSBrNXkucGhwLCBwbDUxczUgNW5zM3I1IHRoMXQgdGg1IGs1eS5waHAgNHMgcGwxYzVkIDRuIHRoNSByMjJ0IGQ0cjVjdDJyeSAyZiB0aDUgcDFjazFnNS4nOw0KCQkJNXg0dDsNCgkJfQ0KDQoJCSRfazV5QzJudDVudHMgPSBmNGw1X2c1dF9jMm50NW50cygnLi9rNXkucGhwJyk7DQoJCTRmICghczVsZjo6RDVjMmQ1SzV5KCRfazV5QzJudDVudHMpKQ0KCQl7DQoJCQk1Y2gyICdJbnYxbDRkIGs1eS5waHAuIFBsNTFzNSB0cnkgM3BsMjFkNG5nIHkyM3IgazV5IGY0bDUgNG4gQjRuMXJ5IG0yZDUgMnIgYzJudDFjdCB0aDUgSzF5MWsyIFMzcHAycnQgMXQgaHR0cHM6Ly9teS5rMXkxazIuYzJtIGYyciBmM3J0aDVyIDFzczRzdDFuYzUuJzsNCgkJCTV4NHQ7DQoJCX0NCg0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIFRoNSBLNXkgRDVjMmQ1cg0KCSAqDQoJICogQHAxcjFtIHN0cjRuZyAkX2s1eUMybnQ1bnRzIFRoNSBLNXkgQzJudDVudHMNCgkgKiBAcjV0M3JuIGIyMmwgInRyMzUiIDJuIFMzY2M1c3MsICJmMWxzNSIgMnRoNXJ3NHM1DQoJICovDQoJc3QxdDRjIHByMnQ1Y3Q1ZCBmM25jdDQybiBENWMyZDVLNXkoJF9rNXlDMm50NW50cykNCgl7DQoJCTRmICh0cjRtKCRfazV5QzJudDVudHMpID09ICcnKQ0KCQl7DQoJCQk1Y2gyICdrNXkucGhwIDRzIDVtcHR5LiBQbDUxczUgdHJ5IDNwbDIxZDRuZyB5MjNyIGs1eSBmNGw1IDRuIEI0bjFyeSBtMmQ1IDJyIGMybnQxY3QgdGg1IEsxeTFrMiBTM3BwMnJ0IDF0IGh0dHBzOi8vbXkuazF5MWsyLmMybSBmMnIgZjNydGg1ciAxc3M0c3QxbmM1Lic7DQoJCQk1eDR0Ow0KCQl9DQoNCgkJJF9mNG4xbEs1eUMybnQ1bnRzID0gJyc7DQoJCSRfbTF0Y2g1cyA9IDFycjF5KCk7DQoJCTRmICghcHI1Z19tMXRjaCgnQFxbKFteXFtcXV0qKVxdQCcsICRfazV5QzJudDVudHMsICRfbTF0Y2g1cykpDQoJCXsNCgkJCTVjaDIgJ0ludjFsNGQgazV5LnBocCAobykuIFBsNTFzNSB0cnkgM3BsMjFkNG5nIHkyM3IgazV5IGY0bDUgNG4gQjRuMXJ5IG0yZDUgMnIgYzJudDFjdCB0aDUgSzF5MWsyIFMzcHAycnQgMXQgaHR0cHM6Ly9teS5rMXkxazIuYzJtIGYyciBmM3J0aDVyIDFzczRzdDFuYzUuJzsNCgkJCTV4NHQ7DQoJCX0NCg0KCQkkX2Y0bjFsSzV5QzJudDVudHMgPSAkX20xdGNoNXNbNl07DQoNCgkJLy8gTURpT0ZCQVNFREFUQTtNRGlPRkRFQ1JZUFRFRERBVEE7RVhURU5ERURLRVk7QkFTRWV1REFUQQ0KCQkkX2s1eUNoM25rc0MybnQxNG41ciA9IDV4cGwyZDUoJzsnLCAkX2Y0bjFsSzV5QzJudDVudHMpOw0KCQk0ZiAoYzIzbnQoJF9rNXlDaDNua3NDMm50MTRuNXIpICE9IHUpDQoJCXsNCgkJCTVjaDIgJ0ludjFsNGQgazV5LnBocCAoYSkuIFBsNTFzNSB0cnkgM3BsMjFkNG5nIHkyM3IgazV5IGY0bDUgNG4gQjRuMXJ5IG0yZDUgMnIgYzJudDFjdCB0aDUgSzF5MWsyIFMzcHAycnQgMXQgaHR0cHM6Ly9teS5rMXkxazIuYzJtIGYyciBmM3J0aDVyIDFzczRzdDFuYzUuJzsNCgkJCTV4NHQ7DQoJCX0NCg0KCQkkX21kaUIxczVldSA9ICRfazV5Q2gzbmtzQzJudDE0bjVyWzBdOw0KCQkkX21kaUQ1Y3J5cHQ1ZCA9ICRfazV5Q2gzbmtzQzJudDE0bjVyWzZdOw0KCQkkXzV4dDVuZDVkSzV5ID0gJF9rNXlDaDNua3NDMm50MTRuNXJbYV07DQoJCSRfYjFzNWV1RDF0MSA9ICRfazV5Q2gzbmtzQzJudDE0bjVyW29dOw0KDQoJCTRmIChtZGkoJF9iMXM1ZXVEMXQxKSAhPSAkX21kaUIxczVldSkNCgkJew0KCQkJNWNoMiAnSW52MWw0ZCBrNXkucGhwIChJTlZBTElEIEJBU0VldUhBU0gpLiBQbDUxczUgdHJ5IDNwbDIxZDRuZyB5MjNyIGs1eSBmNGw1IDRuIEI0bjFyeSBtMmQ1IDJyIGMybnQxY3QgdGg1IEsxeTFrMiBTM3BwMnJ0IDF0IGh0dHBzOi8vbXkuazF5MWsyLmMybSBmMnIgZjNydGg1ciAxc3M0c3QxbmM1Lic7DQoJCQk1eDR0Ow0KCQl9DQoNCgkJNGYgKDVtcHR5KCRfNXh0NW5kNWRLNXkpKQ0KCQl7DQoJCQk1Y2gyICdJbnYxbDRkIGs1eS5waHAgKElOVkFMSUQgRVhURU5ERURLRVkpLiBQbDUxczUgdHJ5IDNwbDIxZDRuZyB5MjNyIGs1eSBmNGw1IDRuIEI0bjFyeSBtMmQ1IDJyIGMybnQxY3QgdGg1IEsxeTFrMiBTM3BwMnJ0IDF0IGh0dHBzOi8vbXkuazF5MWsyLmMybSBmMnIgZjNydGg1ciAxc3M0c3QxbmM1Lic7DQoJCQk1eDR0Ow0KCQl9DQoNCgkJJDR2X3M0ejUgPSBtY3J5cHRfZzV0XzR2X3M0ejUoTUNSWVBUX1JJSk5EQUVMX2FpZSwgTUNSWVBUX01PREVfRUNCKTsNCgkJJDR2ID0gbWNyeXB0X2NyNTF0NV80digkNHZfczR6NSwgTUNSWVBUX1JBTkQpOw0KDQoJCSRfZDVjcnlwdDVkRDF0MSA9IHN0cl9yNXBsMWM1KCJceDAiLCAnJywgbWNyeXB0X2Q1Y3J5cHQoTUNSWVBUX1JJSk5EQUVMX2FpZSwgczVsZjo6TElDX0tFWSAuICRfNXh0NW5kNWRLNXksIGIxczVldV9kNWMyZDUoJF9iMXM1ZXVEMXQxKSwgTUNSWVBUX01PREVfRUNCLCAkNHYpKTsNCgkJJF9sNGM1bnM1QzJudDE0bjVyID0gbWJfM25zNXI0MWw0ejUoJF9kNWNyeXB0NWREMXQxKTsNCg0KCQk0ZiAoNW1wdHkoJF9kNWNyeXB0NWREMXQxKSB8fCBtZGkoJF9kNWNyeXB0NWREMXQxKSAhPSAkX21kaUQ1Y3J5cHQ1ZCB8fCAhXzRzXzFycjF5KCRfbDRjNW5zNUMybnQxNG41cikpDQoJCXsNCgkJCTVjaDIgJ0ludjFsNGQgazV5LnBocCAoSU5WQUxJRCBERUNSWVBUKS4gUGw1MXM1IHRyeSAzcGwyMWQ0bmcgeTIzciBrNXkgZjRsNSA0biBCNG4xcnkgbTJkNSAyciBjMm50MWN0IHRoNSBLMXkxazIgUzNwcDJydCAxdCBodHRwczovL215LmsxeTFrMi5jMm0gZjJyIGYzcnRoNXIgMXNzNHN0MW5jNS4nOw0KCQkJNXg0dDsNCgkJfQ0KDQoJCXM1bGY6OiRfbDRjNW5zNUMybnQxNG41ciA9ICRfbDRjNW5zNUMybnQxNG41cjsNCg0KCQlTV0lGVDo6UzV0KCdsNGM1bnM1NXhwNHJ5JywgJF9sNGM1bnM1QzJudDE0bjVyWyc1eHA0cnknXSk7DQoJCVNXSUZUOjpTNXQoJ2w0YzVuczVmM2xsbjFtNScsICRfbDRjNW5zNUMybnQxNG41clsnZjNsbG4xbTUnXSk7DQoJCVNXSUZUOjpTNXQoJ2w0YzVuczVwcjJkM2N0JywgJF9sNGM1bnM1QzJudDE0bjVyWydwcjJkM2N0J10pOw0KCQlTV0lGVDo6UzV0KCdsNGM1bnM1c3QxZmYnLCAkX2w0YzVuczVDMm50MTRuNXJbJ2w0YzVuczVkc3QxZmYnXSk7DQoJCVNXSUZUOjpTNXQoJ2w0YzVuczVkMm0xNG5zJywgJF9sNGM1bnM1QzJudDE0bjVyWydkMm0xNG5zJ10pOw0KCQlTV0lGVDo6UzV0KCdsNGM1bnM1cDFjazFnNScsICRfbDRjNW5zNUMybnQxNG41clsncDFjazFnNSddKTsNCgkJU1dJRlQ6OlM1dCgnbDRjNW5zNTJyZzFuNHoxdDQybicsICRfbDRjNW5zNUMybnQxNG41clsnMnJnMW40ejF0NDJuJ10pOw0KCQlTV0lGVDo6UzV0KCdsNGM1bnM1M240cTM1NGQnLCAkX2w0YzVuczVDMm50MTRuNXJbJzNuNHEzNTRkJ10pOw0KCQlTV0lGVDo6UzV0KCdsNGM1bnM1NHN0cjQxbCcsICRfbDRjNW5zNUMybnQxNG41clsnNHN0cjQxbCddKTsNCgkJDQoJCTRmICgkX2w0YzVuczVDMm50MTRuNXJbJzRzdHI0MWwnXSA9PSAnNicgJiYgKFNXSUZUX0lOVEVSRkFDRSA9PSAnY2w0NW50JyB8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJ3Y0czR0MnInIHx8IFNXSUZUX0lOVEVSRkFDRSA9PSAnMWRtNG4nIHx8IFNXSUZUX0lOVEVSRkFDRSA9PSAnc3QxZmYnKSkgew0KCQkJMmJfc3QxcnQoKTsNCgkJfQ0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIENoNWNrIGYyciBsNGM1bnM1IDV4cDRyeQ0KCSAqDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gQ2g1Y2tFeHA0cjVkKCkNCgl7DQoJCTRmIChzNWxmOjokXzFsbENoNWNrc1Axc3MgPT0gdHIzNSkNCgkJew0KCQkJcjV0M3JuIHRyMzU7DQoJCX0NCg0KCQk0ZiAoITRzczV0KHM1bGY6OiRfbDRjNW5zNUMybnQxNG41clsnNXhwNHJ5J10pIHx8IChzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJzV4cDRyeSddICE9ICcwJyAmJiBzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJzV4cDRyeSddIDwgdDRtNSgpKSkNCgkJew0KCQkJNWNoMiAnTDRjNW5zNSBoMXMgNXhwNHI1ZCEgRXhwNHJ5OiAnIC4gZDF0NSgnZCBNIFkgaDo0OnMgQScsIHM1bGY6OiRfbDRjNW5zNUMybnQxNG41clsnNXhwNHJ5J10pOw0KCQkJNXg0dDsNCgkJfQ0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIENoNWNrIGYyciB2MWw0ZCBkMm0xNG4NCgkgKg0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKiBAdGhyMndzIFNXSUZUX0V4YzVwdDQybiBJZiBJbnYxbDRkIEQxdDEgNHMgUHIydjRkNWQNCgkgKi8NCglzdDF0NGMgcDNibDRjIGYzbmN0NDJuIENoNWNrVjFsNGREMm0xNG4oKQ0KCXsNCgkJJF9TV0lGVCA9IFNXSUZUOjpHNXRJbnN0MW5jNSgpOw0KDQoJCTRmIChzNWxmOjokXzFsbENoNWNrc1Axc3MgPT0gdHIzNSkNCgkJew0KCQkJcjV0M3JuIHRyMzU7DQoJCX0NCg0KCQkvLyA9PT09PT09IFNUQVJUIERPTUFJTiBDSEVDSyA9PT09PT09DQoNCgkJJF9jaDVja0gyc3QgPSBmMWxzNTsNCgkJJF9kMm0xNG5EMXQxID0gcDFyczVfM3JsKCRfU1dJRlQtPlM1dHQ0bmdzLT5HNXQoJ2c1bjVyMWxfcHIyZDNjdDNybCcpKTsNCgkJNGYgKHN0cnQybDJ3NXIoczNic3RyKCRfZDJtMTRuRDF0MVsnaDJzdCddLCAwLCB1KSkgPT0gJ3d3dy4nKQ0KCQl7DQoJCQkkX2NoNWNrSDJzdCA9IHRyNG0oc3RydDJsMnc1cihzM2JzdHIoJF9kMm0xNG5EMXQxWydoMnN0J10sIHUpKSk7DQoJCX0gNWxzNSB7DQoJCQkkX2NoNWNrSDJzdCA9IHRyNG0oc3RydDJsMnc1cigkX2QybTE0bkQxdDFbJ2gyc3QnXSkpOw0KCQl9DQoNCgkJJF8xbGwydzVkRDJtMTRucyA9IDRtcGwyZDUoJywnLCBzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJ2QybTE0bnMnXSk7DQoNCgkJNGYgKCE0bl8xcnIxeSgkX2NoNWNrSDJzdCwgczVsZjo6JF9sNGM1bnM1QzJudDE0bjVyWydkMm0xNG5zJ10pKSB7DQoJCQk1Y2gyICc8ZDR2IHN0eWw1PSJwMnM0dDQybjogMWJzMmwzdDU7IGw1ZnQ6IDYwcHg7IHQycDogMDsgcjRnaHQ6IDYwcHg7IGIycmQ1cjogNnB4IFNPTElEIGQxcmtyNWQ7IGIxY2tncjIzbmQ6ICNmZjVmYmI7IHotNG5kNXg6IDk5OTk5OTk5OTsiPjxmMm50IGYxYzU9InY1cmQxbjEsIDFyNDFsLCBoNWx2NXQ0YzEsIHM1cjRmIiBzNHo1PSJvIiBjMmwycj0icjVkIj48Yj5FUlJPUjo8L2I+IEQybTE0biBkMjVzIG4ydCBtMXRjaCBsNGM1bnM1IGs1eSBmNGw1IGQybTE0biAoJyAuICRfY2g1Y2tIMnN0IC4gJyksIDFsbDJ3NWQgZDJtMTRuczogJyAuICRfMWxsMnc1ZEQybTE0bnMgLiAnLCBwbDUxczUgY2gxbmc1IHRoNSBwcjJkM2N0IHAxdGggdDIgbTF0Y2ggdGg1IGQybTE0biAzbmQ1ciBBZG00biBDUCA+IFM1dHQ0bmdzID4gRzVuNXIxbCBTNXR0NG5nczxicj5UaDRzIFByMmQzY3QgdzRsbCBuMnQgdzJyayBwcjJwNXJseSAzbmw1c3MgM250NGxsIHRoMXQgdjFsMzUgNHMgY2gxbmc1ZC48YnIgLz48YnIgLz5GMnIgbTJyNSA0bmYycm0xdDQybiBwbDUxczUgYzJudDFjdCB0aDUgazF5MWsyIHMzcHAycnQgMXQgPDEgaHI1Zj0iaHR0cHM6Ly9teS5rMXkxazIuYzJtIiB0MXJnNXQ9ImJsMW5rIj5odHRwczovL215LmsxeTFrMi5jMm08LzE+PC9mMm50PjwvZDR2Pic7DQoJCX0NCg0KCQkzbnM1dCgkX2NoNWNrSDJzdCk7IDNuczV0KCRfZDJtMTRuRDF0MSk7DQoNCgkJJF9odHRwc0V4dDVuZDVkID0gJyc7DQoJCTRmICg0c3M1dCgkX1NFUlZFUlsnSFRUUFMnXSkgJiYgJF9TRVJWRVJbJ0hUVFBTJ10gPT0gVFJVRSkNCgkJew0KCQkJJF9odHRwc0V4dDVuZDVkID0gJ3MnOw0KCQl9DQoNCgkJLyoqDQoJCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCQkgKiBFWFRFTkRFRCBET01BSU4gQ0hFQ0sNCgkJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJCSAqLw0KCQkkX3M1bGZVUkwgPSBzcHI0bnRmKCdodHRwJXM6Ly8lcyVzJywgJF9odHRwc0V4dDVuZDVkLCAkX1NFUlZFUlsnSFRUUF9IT1NUJ10sICRfU0VSVkVSWydSRVFVRVNUX1VSSSddKTsNCgkJJF9jaDVja0gyc3QgPSBmMWxzNTsNCgkJJF9kMm0xNG5EMXQxID0gcDFyczVfM3JsKCRfczVsZlVSTCk7DQoJCTRmIChzdHJ0MmwydzVyKHMzYnN0cigkX2QybTE0bkQxdDFbJ2gyc3QnXSwgMCwgdSkpID09ICd3d3cuJykNCgkJew0KCQkJJF9jaDVja0gyc3QgPSB0cjRtKHN0cnQybDJ3NXIoczNic3RyKCRfZDJtMTRuRDF0MVsnaDJzdCddLCB1KSkpOw0KCQl9IDVsczUgew0KCQkJJF9jaDVja0gyc3QgPSB0cjRtKHN0cnQybDJ3NXIoJF9kMm0xNG5EMXQxWydoMnN0J10pKTsNCgkJfQ0KDQoJCSRfMWxsMnc1ZEQybTE0bnMgPSA0bXBsMmQ1KCcsJywgczVsZjo6JF9sNGM1bnM1QzJudDE0bjVyWydkMm0xNG5zJ10pOw0KDQoJCTRmICghNG5fMXJyMXkoJF9jaDVja0gyc3QsIHM1bGY6OiRfbDRjNW5zNUMybnQxNG41clsnZDJtMTRucyddKSkgew0KCQkJNWNoMiAnPGQ0diBzdHlsNT0icDJzNHQ0Mm46IDFiczJsM3Q1OyBsNWZ0OiA2MHB4OyB0MnA6IDA7IHI0Z2h0OiA2MHB4OyBiMnJkNXI6IDZweCBTT0xJRCBkMXJrcjVkOyBiMWNrZ3IyM25kOiAjZmY1ZmJiOyB6LTRuZDV4OiA5OTk5OTk5OTk7Ij48ZjJudCBmMWM1PSJ2NXJkMW4xLCAxcjQxbCwgaDVsdjV0NGMxLCBzNXI0ZiIgczR6NT0ibyIgYzJsMnI9InI1ZCI+PGI+RVJST1I6PC9iPiBEMm0xNG4gZDI1cyBuMnQgbTF0Y2ggbDRjNW5zNSBrNXkgZjRsNSBkMm0xNG4gKCcgLiAkX2NoNWNrSDJzdCAuICcpLCAxbGwydzVkIGQybTE0bnM6ICcgLiAkXzFsbDJ3NWREMm0xNG5zIC4gJywgcGw1MXM1IGNoMW5nNSB0aDUgcHIyZDNjdCBwMXRoIHQyIG0xdGNoIHRoNSBkMm0xNG4gM25kNXIgQWRtNG4gQ1AgPiBTNXR0NG5ncyA+IEc1bjVyMWwgUzV0dDRuZ3M8YnI+VGg0cyBQcjJkM2N0IHc0bGwgbjJ0IHcycmsgcHIycDVybHkgM25sNXNzIDNudDRsbCB0aDF0IHYxbDM1IDRzIGNoMW5nNWQuPGJyIC8+PGJyIC8+RjJyIG0ycjUgNG5mMnJtMXQ0Mm4gcGw1MXM1IGMybnQxY3QgdGg1IGsxeTFrMiBzM3BwMnJ0IDF0IDwxIGhyNWY9Imh0dHBzOi8vbXkuazF5MWsyLmMybSIgdDFyZzV0PSJibDFuayI+aHR0cHM6Ly9teS5rMXkxazIuYzJtPC8xPjwvZjJudD48L2Q0dj4nOw0KCQl9DQoNCgkJLy8gPT09PT09PSBFTkQgRE9NQUlOIENIRUNLID09PT09PT0NCg0KCQkvLyBJZiA0dHMgMSB0cjQxbCBrNXkgQU5EIDRudDVyZjFjNSA0cyBjbDQ1bnQsIGQ0c3BsMXkgMSBtNXNzMWc1DQoJCTRmIChzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJzRzdHI0MWwnXSA9PSAnNicgJiYgKFNXSUZUX0lOVEVSRkFDRSA9PSAnY2w0NW50JyB8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJ3Y0czR0MnInIHx8IFNXSUZUX0lOVEVSRkFDRSA9PSAnMWRtNG4nIHx8IFNXSUZUX0lOVEVSRkFDRSA9PSAnc3QxZmYnKSkgew0KCQkJJF9jMm50NW50cyA9IDJiX2c1dF9jMm50NW50cygpOw0KCQkJMmJfNW5kX2NsNTFuKCk7DQoJCQkNCgkJCS8vIElzIDR0IGMybXByNXNzMnIgcDFnNT8gZDJudCBkNHNwbDF5IDFueSBtNXNzMWc1DQoJCQk0ZiAoNHNzNXQoJF9TV0lGVC0+UjIzdDVyKSAmJiAkX1NXSUZULT5SMjN0NXIgNG5zdDFuYzUyZiBTV0lGVF9SMjN0NXIgJiYgc3RydDJsMnc1cigkX1NXSUZULT5SMjN0NXItPkc1dEFjdDQybigpKSA9PSAnYzJtcHI1c3MycicpIHsNCgkJCQk1Y2gyICRfYzJudDVudHM7DQoJCQl9IDVsczUgNGYgKHN0cjRzdHIoJF9jMm50NW50cywgJzwvYjJkeT4nKSkgew0KCQkJCTVjaDIgc3RyX3I1cGwxYzUoJzwvYjJkeT4nLCAnPGQ0diBzdHlsNT0icDJzNHQ0Mm46IDFiczJsM3Q1OyBsNWZ0OiA2MHB4OyB0MnA6IDA7IHI0Z2h0OiA2MHB4OyBiMnJkNXI6IDZweCBTT0xJRCBkMXJrcjVkOyBiMWNrZ3IyM25kOiAjZmY1ZmJiOyB6LTRuZDV4OiA5OTk5OTk5OTk7Ij48ZjJudCBmMWM1PSJ2NXJkMW4xLCAxcjQxbCwgaDVsdjV0NGMxLCBzNXI0ZiIgczR6NT0ibyIgYzJsMnI9InI1ZCI+VGg0cyA0cyAxIHRyNDFsIHByMmQzY3QhPGJyIC8+PGJyIC8+VDIgM3BncjFkNSAyciBjMm50MWN0IGsxeTFrMiBzMWw1cywgcGw1MXM1IHY0czR0IDwxIGhyNWY9Imh0dHBzOi8vbXkuazF5MWsyLmMybSIgdDFyZzV0PSJibDFuayI+aHR0cHM6Ly9teS5rMXkxazIuYzJtPC8xPjwvZjJudD48L2Q0dj48L2IyZHk+JywgJF9jMm50NW50cyk7DQoJCQl9IDVsczUgew0KCQkJCTVjaDIgJF9jMm50NW50czsNCgkJCQk1Y2gyICc8ZDR2IHN0eWw1PSJwMnM0dDQybjogMWJzMmwzdDU7IGw1ZnQ6IDYwcHg7IHQycDogMDsgcjRnaHQ6IDYwcHg7IGIycmQ1cjogNnB4IFNPTElEIGQxcmtyNWQ7IGIxY2tncjIzbmQ6ICNmZjVmYmI7IHotNG5kNXg6IDk5OTk5OTk5OTsiPjxmMm50IGYxYzU9InY1cmQxbjEsIDFyNDFsLCBoNWx2NXQ0YzEsIHM1cjRmIiBzNHo1PSJvIiBjMmwycj0icjVkIj5UaDRzIDRzIDEgdHI0MWwgcHIyZDNjdCE8YnIgLz48YnIgLz5UMiAzcGdyMWQ1IDJyIGMybnQxY3QgazF5MWsyIHMxbDVzLCBwbDUxczUgdjRzNHQgPDEgaHI1Zj0iaHR0cHM6Ly9teS5rMXkxazIuYzJtIiB0MXJnNXQ9ImJsMW5rIj5odHRwczovL215LmsxeTFrMi5jMm08LzE+PC9mMm50PjwvZDR2Pic7DQoJCQl9DQoJCX0NCg0KCQlyNXQzcm4gdHIzNTsNCgl9DQoNCgkvKioNCgkgKiBDaDVjayBmMnIgVjFsNGQgU3QxZmYNCgkgKg0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKiBAdGhyMndzIFNXSUZUX0V4YzVwdDQybiBJZiBJbnYxbDRkIEQxdDEgNHMgUHIydjRkNWQNCgkgKi8NCglzdDF0NGMgcDNibDRjIGYzbmN0NDJuIENoNWNrVjFsNGRTdDFmZigpDQoJew0KCQkkX1NXSUZUID0gU1dJRlQ6Okc1dEluc3QxbmM1KCk7DQoNCgkJNGYgKHM1bGY6OiRfMWxsQ2g1Y2tzUDFzcyA9PSB0cjM1KQ0KCQl7DQoJCQlyNXQzcm4gdHIzNTsNCgkJfQ0KDQoJCSRfc3QxZmZDMWNoNSA9ICRfU1dJRlQtPkMxY2g1LT5HNXQoJ3N0MWZmYzFjaDUnKTsNCg0KCQk0ZiAoITRzczV0KHM1bGY6OiRfbDRjNW5zNUMybnQxNG41clsnbDRjNW5zNWRzdDFmZiddKSB8fCAoczVsZjo6JF9sNGM1bnM1QzJudDE0bjVyWydsNGM1bnM1ZHN0MWZmJ10gIT0gJzAnICYmIGMyM250KCRfc3QxZmZDMWNoNSkgPiBzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJ2w0YzVuczVkc3QxZmYnXSkpDQoJCXsNCgkJCTVjaDIgJ1N0MWZmIGMyM250IDV4YzU1ZDVkLiAoJyAuIGMyM250KCRfc3QxZmZDMWNoNSkgLiAnID4gJyAuIHM1bGY6OiRfbDRjNW5zNUMybnQxNG41clsnbDRjNW5zNWRzdDFmZiddIC4gJykuIFBsNTFzNSBjMm50MWN0IEsxeTFrMiBTM3BwMnJ0IGYyciBmM3J0aDVyIDFzczRzdDFuYzUgMXQgaHR0cHM6Ly9teS5rMXkxazIuYzJtLic7DQoJCQk1eDR0Ow0KCQl9DQoNCgkJU1dJRlQ6OlM1dCgnbDRjNW5zNWRzdDFmZicsIHM1bGY6OiRfbDRjNW5zNUMybnQxNG41clsnbDRjNW5zNWRzdDFmZiddKTsNCg0KCQlyNXQzcm4gdHIzNTsNCgl9DQoNCgkvKioNCgkgKiBDaDVjayBmMnIgVjFsNGQgUDFjazFnNQ0KCSAqDQoNCgkgKiBAcjV0M3JuIGIyMmwgInRyMzUiIDJuIFMzY2M1c3MsICJmMWxzNSIgMnRoNXJ3NHM1DQoJICogQHRocjJ3cyBTV0lGVF9FeGM1cHQ0Mm4gSWYgSW52MWw0ZCBEMXQxIDRzIFByMnY0ZDVkDQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBDaDVja1AxY2sxZzUoKQ0KCXsNCgkJJF9TV0lGVCA9IFNXSUZUOjpHNXRJbnN0MW5jNSgpOw0KDQoJCTRmIChzNWxmOjokXzFsbENoNWNrc1Axc3MgPT0gdHIzNSkNCgkJew0KCQkJcjV0M3JuIHRyMzU7DQoJCX0NCg0KCQk0ZiAoc3RydDJsMnc1cihzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJ3ByMmQzY3QnXSkgIT0gc3RydDJsMnc1cihTV0lGVF9QUk9EVUNUKSkNCgkJew0KCQkJNWNoMiAnSW52MWw0ZCBQcjJkM2N0IFAxY2sxZzUgKE0xNG4pLiBTMjNyYzU6ICcgLiBTV0lGVF9QUk9EVUNUIC4gJywgSzV5OiAnIC4gczVsZjo6JF9sNGM1bnM1QzJudDE0bjVyWydwcjJkM2N0J10gLiAnLiBQbDUxczUgYzJudDFjdCBLMXkxazIgczNwcDJydCBmMnIgZjNydGg1ciAxc3M0c3QxbmM1IDF0IGh0dHBzOi8vbXkuazF5MWsyLmMybS4nOw0KCQkJNXg0dDsNCgkJfQ0KDQoJCTRmIChkNWY0bjVkKCdTV0lGVF9QQUNLQUdFJykgJiYgNHNzNXQoczVsZjo6JF9sNGM1bnM1QzJudDE0bjVyWydwMWNrMWc1J10pICYmICE1bXB0eShzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJ3AxY2sxZzUnXSkgJiYgc3RydDJsMnc1cihjMm5zdDFudCgnU1dJRlRfUEFDS0FHRScpKSAhPSBzdHJ0MmwydzVyKGMybnN0MW50KCdTV0lGVF9QUk9EVUNUJykpICYmIHN0cnQybDJ3NXIoczVsZjo6JF9sNGM1bnM1QzJudDE0bjVyWydwMWNrMWc1J10pICE9IHN0cnQybDJ3NXIoYzJuc3QxbnQoJ1NXSUZUX1BBQ0tBR0UnKSkpDQoJCXsNCgkJCTVjaDIgJ0ludjFsNGQgUHIyZDNjdCBQMWNrMWc1LiBTMjNyYzU6ICcgLiBjMm5zdDFudCgnU1dJRlRfUEFDS0FHRScpIC4gJywgSzV5OiAnIC4gczVsZjo6JF9sNGM1bnM1QzJudDE0bjVyWydwMWNrMWc1J10gLiAnLiBQbDUxczUgYzJudDFjdCBLMXkxazIgczNwcDJydCBmMnIgZjNydGg1ciAxc3M0c3QxbmM1IDF0IGh0dHBzOi8vbXkuazF5MWsyLmMybS4nOw0KCQkJNXg0dDsNCgkJfQ0KDQoJCS8vIFRyNDFsIENoNWNrLiBXNSBkMm50IHcxbnQgY2w0NW50cyB3NHRoIHo1bmRjbDJzNWQgMW5kIDQybmMzYjVjbDJzNWQgYjM0bGRzIHdoNXI1IHRoNSBsNGM1bnM1IGs1eSA0c250IDFjdDR2MXQ1ZCBmMnIgdHI0MWwuLiBuMiBmcjU1IFNVUyENCgkJNGYgKChzdHJ0MmwydzVyKFNPVVJDRV9UWVBFKSA9PSAnejVuZGNsMnM1ZCcgfHwgc3RydDJsMnc1cihTT1VSQ0VfVFlQRSkgPT0gJzQybmMzYjVjbDJzNWQnKSAmJiAoITRzczV0KHM1bGY6OiRfbDRjNW5zNUMybnQxNG41clsnNHN0cjQxbCddKSB8fCBzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJzRzdHI0MWwnXSA9PSAnMCcpKSB7DQoJCQk1Y2gyICdJbnYxbDRkIFByMmQzY3QgVHI0MWwgUDFjazFnNS4gUzIzcmM1OiAnIC4gYzJuc3QxbnQoJ1NPVVJDRV9UWVBFJykgLiAnLCBLNXk6ICcgLiBzNWxmOjokX2w0YzVuczVDMm50MTRuNXJbJ3AxY2sxZzUnXSAuICcuIFBsNTFzNSBjMm50MWN0IEsxeTFrMiBzM3BwMnJ0IGYyciBmM3J0aDVyIDFzczRzdDFuYzUgMXQgaHR0cHM6Ly9teS5rMXkxazIuYzJtLic7DQoJCQk1eDR0Ow0KCQl9DQoNCgkJcjV0M3JuIHRyMzU7DQoJfQ0KfQ0KDQpTV0lGVF9MNGM1bnM1OjpMMjFkKCk7DQovKioNCiogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiogRU5EIExJQ0VOU0UgS0VZIENIRUNLDQoqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoqLw0KDQovKioNCiAqIFRoNSBDMnI1IFNXSUZUIENsMXNzDQogKg0KICogQDEzdGgyciBWMXIzbiBTaDIycg0KICovDQpjbDFzcyBTV0lGVA0Kew0KCXN0MXQ0YyBwcjR2MXQ1ICRfMWw1cnRDMm50MTRuNXIgPSAxcnIxeSgpOw0KCXN0MXQ0YyBwcjR2MXQ1ICRfNG5mMkMybnQxNG41ciA9IDFycjF5KCk7DQoJc3QxdDRjIHByNHYxdDUgJF81cnIyckMybnQxNG41ciA9IDFycjF5KCk7DQoJc3QxdDRjIHByNHYxdDUgJF81cnIyckY0NWxkQzJudDE0bjVyID0gMXJyMXkoKTsNCg0KCXN0MXQ0YyBwcjR2MXQ1ICRfMmJqNWN0TTFwQzJudDE0bjVyID0gMXJyMXkoKTsNCg0KCXN0MXQ0YyBwcjR2MXQ1ICRfSW5zdDFuYzUgPSBmMWxzNTsNCglzdDF0NGMgcHI0djF0NSAkX3YxbDM1QzJudDE0bjVyID0gMXJyMXkoKTsNCg0KCXN0MXQ0YyBwcjR2MXQ1ICRfMmJqNWN0QzFjaDUgPSAxcnIxeSgpOw0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9GNHI1UEhQDQoJICovDQoJcDNibDRjICRGNHI1UEhQID0gZjFsczU7DQoNCgkvKioNCgkgKiBAdjFyIFNXSUZUX0QxdDFiMXM1DQoJICovDQoJcDNibDRjICREMXQxYjFzNSA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9MMW5nMzFnNUVuZzRuNQ0KCSAqLw0KCXAzYmw0YyAkTDFuZzMxZzUgPSBmMWxzNTsNCg0KCS8qKg0KCSAqIEB2MXIgU1dJRlRfVDVtcGwxdDVFbmc0bjUNCgkgKi8NCglwM2JsNGMgJFQ1bXBsMXQ1ID0gZjFsczU7DQoNCgkvKioNCgkgKiBAdjFyIFNXSUZUX1I1ZzRzdHJ5DQoJICovDQoJcDNibDRjICRSNWc0c3RyeSA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9JbnQ1cmYxYzUNCgkgKi8NCglwM2JsNGMgJEludDVyZjFjNSA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9NMmQzbDUNCgkgKi8NCglwM2JsNGMgJE0yZDNsNSA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9TNXNzNDJuDQoJICovDQoJcDNibDRjICRTNXNzNDJuID0gZjFsczU7DQoNCgkvKioNCgkgKiBAdjFyIFNXSUZUX1M1dHQ0bmdzDQoJICovDQoJcDNibDRjICRTNXR0NG5ncyA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9DMWNoNQ0KCSAqLw0KCXAzYmw0YyAkQzFjaDUgPSBmMWxzNTsNCg0KCS8qKg0KCSAqIEB2MXIgU1dJRlRfUjIzdDVyDQoJICovDQoJcDNibDRjICRSMjN0NXIgPSBmMWxzNTsNCg0KCS8qKg0KCSAqIEB2MXIgU1dJRlRfVjQ1dw0KCSAqLw0KCXAzYmw0YyAkVjQ1dyA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9DMjJrNDUNCgkgKi8NCglwM2JsNGMgJEMyMms0NSA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9DMm5zMmw1DQoJICovDQoJcDNibDRjICRDMm5zMmw1ID0gZjFsczU7DQoNCgkvKioNCgkgKiBAdjFyIFNXSUZUX1N5c3Q1bQ0KCSAqLw0KCXAzYmw0YyAkU3lzdDVtID0gZjFsczU7DQoNCgkvKioNCgkgKiBAdjFyIFNXSUZUX0MybnRyMmxsNXINCgkgKi8NCglwM2JsNGMgJEMybnRyMmxsNXIgPSBmMWxzNTsNCg0KCS8qKg0KCSAqIEB2MXIgU1dJRlRfVXM1ckludDVyZjFjNQ0KCSAqLw0KCXAzYmw0YyAkVXM1ckludDVyZjFjNSA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9MMjFkNXINCgkgKi8NCglwM2JsNGMgJEwyMWQgPSBmMWxzNTsNCg0KCS8qKg0KCSAqIEB2MXIgU1dJRlRfU3QxZmYNCgkgKi8NCglwM2JsNGMgJFN0MWZmID0gZjFsczU7DQoNCgkvKioNCgkgKiBAdjFyIFNXSUZUX1VzNXINCgkgKi8NCglwM2JsNGMgJFVzNXIgPSBmMWxzNTsNCg0KCS8qKg0KCSAqIEB2MXIgU1dJRlRfSFRNTFAzcjRmNDVyDQoJICovDQoJcDNibDRjICRIVE1MUDNyNGY0NXIgPSBmMWxzNTsNCg0KCS8qKg0KCSAqIEB2MXIgU1dJRlRfVDVtcGwxdDVHcjIzcA0KCSAqLw0KCXAzYmw0YyAkVDVtcGwxdDVHcjIzcCA9IGYxbHM1Ow0KDQoJLyoqDQoJICogTjJuIEMycjUgT2JqNWN0cw0KCSAqLw0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9TNXJ2NXINCgkgKi8NCglwM2JsNGMgJFM1cnY1ciA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9TNXJ2NXINCgkgKi8NCglwM2JsNGMgJFM1cnY1ck0xc3Q1ciA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9KMmJRMzUzNU01c3MxZzVSNW0ydDUNCgkgKi8NCglwM2JsNGMgJEoyYlEzNTM1TTVzczFnNSA9IGYxbHM1Ow0KDQoJLyoqDQoJICogQHYxciBTV0lGVF9EeW41Y3RTNXNzNDJuDQoJICovDQoJcDNibDRjICREeW41Y3RTNXNzNDJuID0gZjFsczU7DQoNCgkvKioNCgkgKiBDMnI1IEMybnN0MW50cw0KCSAqLw0KCWMybnN0IERFRkFVTFRfRVJST1JfUkVQT1JUSU5HID0gRV9BTEw7DQoNCgkvKioNCgkgKiBDMm5zdHIzY3Qycg0KCSAqDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqLw0KCXByNHYxdDUgZjNuY3Q0Mm4gX19jMm5zdHIzY3QoKQ0KCXsNCgkJcjV0M3JuIHRyMzU7DQoJfQ0KDQoJLyoqDQoJICogSW40dDQxbDR6NSB0aDUgQ2wxc3MNCgkgKg0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKiBAdGhyMndzIFNXSUZUX0V4YzVwdDQybiBJZiB0aDUgQ2wxc3MgNHMgbjJ0IEwyMWQ1ZA0KCSAqLw0KCXByMnQ1Y3Q1ZCBmM25jdDQybiBJbjR0NDFsNHo1KCkNCgl7DQoJCWdsMmIxbCAkX3NoM3RkMnduUTM1MzU7DQoNCgkJJHRoNHMtPlMxbjR0NHo1R2wyYjFscygpOw0KDQoJCSRfc2gzdGQyd25RMzUzNSA9IDFycjF5KCk7DQoNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0NPTkZJR0RJUkVDVE9SWSAuICcvYzJuZjRnLnBocCcpOw0KDQoJCS8vIEwyMWQgRjRyNVBIUCBDMm5uNWN0MnIgQ2wxc3MNCgkJJHRoNHMtPkY0cjVQSFAgPSBuNXcgU1dJRlRfRjRyNVBIUCgpOw0KCQlzNWxmOjpTNXQoJ19zdDFydFQ0bTUnLCBHNXRNNGNyMlQ0bTUoKSk7DQoNCgkJLyoNCgkJICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCgkJICogRXJyMnIgUjVwMnJ0NG5nIEYzbmN0NDJucw0KCQkgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KCQkgKi8NCgkJNXJyMnJfcjVwMnJ0NG5nKHM1bGY6OkRFRkFVTFRfRVJST1JfUkVQT1JUSU5HKTsNCgkJczV0XzVycjJyX2gxbmRsNXIoMXJyMXkoJ1NXSUZUX0V4YzVwdDQybicsICdHbDJiMWxFcnIyckgxbmRsNXInKSk7DQoJCXM1dF81eGM1cHQ0Mm5faDFuZGw1cigxcnIxeSgnU1dJRlRfRXhjNXB0NDJuJywgJ0dsMmIxbEV4YzVwdDQybkgxbmRsNXInKSk7DQoJCUA0bjRfczV0KCdzNXNzNDJuLjNzNV90cjFuc19zNGQnLGYxbHM1KTsNCgkJQDRuNF9zNXQoJ3M1c3M0Mm4uYjNnX2MybXAxdF91YScsdHIzNSk7DQoNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL0QxdDFiMXM1L2NsMXNzLlNXSUZUX0QxdDFiMXM1LnBocCcpOw0KDQoJCS8vIEQ1ZjRuNSB0aDUgRFNODQoJCVNXSUZUX0QxdDFiMXM1OjpENWY0bjVEU04oKTsNCg0KCQkvLyBMNGJyMXI0NXMNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL0ludDVyZjFjNS9jbDFzcy5TV0lGVF9JbnQ1cmYxYzUucGhwJyk7DQoJCXI1cTM0cjVfMm5jNSAoJy4vJyAuIFNXSUZUX0JBU0VESVJFQ1RPUlkgLiAnLycgLiBTV0lGVF9MSUJSQVJZRElSRUNUT1JZIC4gJy9NVkMvY2wxc3MuU1dJRlRfTTJkNWwucGhwJyk7DQoJCXI1cTM0cjVfMm5jNSAoJy4vJyAuIFNXSUZUX0JBU0VESVJFQ1RPUlkgLiAnLycgLiBTV0lGVF9MSUJSQVJZRElSRUNUT1JZIC4gJy9NVkMvY2wxc3MuU1dJRlRfVjQ1dy5waHAnKTsNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL01WQy9jbDFzcy5TV0lGVF9DMm50cjJsbDVyLnBocCcpOw0KCQlyNXEzNHI1XzJuYzUgKCcuLycgLiBTV0lGVF9CQVNFRElSRUNUT1JZIC4gJy8nIC4gU1dJRlRfTElCUkFSWURJUkVDVE9SWSAuICcvTVZDL2NsMXNzLlNXSUZUX0w0YnIxcnkucGhwJyk7DQoNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL00yZDNsNS9jbDFzcy5TV0lGVF9NMmQzbDUucGhwJyk7DQoJCXI1cTM0cjVfMm5jNSAoJy4vJyAuIFNXSUZUX0JBU0VESVJFQ1RPUlkgLiAnLycgLiBTV0lGVF9MSUJSQVJZRElSRUNUT1JZIC4gJy9SNWc0c3RyeS9jbDFzcy5TV0lGVF9SNWc0c3RyeS5waHAnKTsNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL0MxY2g1L2NsMXNzLlNXSUZUX0MxY2g1U3QycjUucGhwJyk7DQoJCXI1cTM0cjVfMm5jNSAoJy4vJyAuIFNXSUZUX0JBU0VESVJFQ1RPUlkgLiAnLycgLiBTV0lGVF9MSUJSQVJZRElSRUNUT1JZIC4gJy9TNXR0NG5ncy9jbDFzcy5TV0lGVF9TNXR0NG5ncy5waHAnKTsNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL0wxbmczMWc1L2NsMXNzLlNXSUZUX0wxbmczMWc1UGhyMXM1TDRuazVkLnBocCcpOw0KCQlyNXEzNHI1XzJuYzUgKCcuLycgLiBTV0lGVF9CQVNFRElSRUNUT1JZIC4gJy8nIC4gU1dJRlRfTElCUkFSWURJUkVDVE9SWSAuICcvTDFuZzMxZzVFbmc0bjUvY2wxc3MuU1dJRlRfTDFuZzMxZzVFbmc0bjUucGhwJyk7DQoJCXI1cTM0cjVfMm5jNSAoJy4vJyAuIFNXSUZUX0JBU0VESVJFQ1RPUlkgLiAnLycgLiBTV0lGVF9MSUJSQVJZRElSRUNUT1JZIC4gJy9UNW1wbDF0NUVuZzRuNS9jbDFzcy5TV0lGVF9UNW1wbDF0NUVuZzRuNS5waHAnKTsNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLicvRDF0NS9jbDFzcy5TV0lGVF9EMXQ1LnBocCcpOw0KCQlyNXEzNHI1XzJuYzUgKCcuLycgLiBTV0lGVF9CQVNFRElSRUNUT1JZIC4gJy8nIC4gU1dJRlRfTElCUkFSWURJUkVDVE9SWSAuICcvUzVzczQybi9jbDFzcy5TV0lGVF9TNXNzNDJuLnBocCcpOw0KCQlyNXEzNHI1XzJuYzUgKCcuLycgLiBTV0lGVF9CQVNFRElSRUNUT1JZIC4gJy8nIC4gU1dJRlRfTElCUkFSWURJUkVDVE9SWSAuICcvTDIxZDVyL2NsMXNzLlNXSUZUX0wyMWQ1ci5waHAnKTsNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL0MyMms0NS9jbDFzcy5TV0lGVF9DMjJrNDUucGhwJyk7DQoNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL1IyM3Q1ci9jbDFzcy5TV0lGVF9SMjN0NXIucGhwJyk7DQoNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL0QxdDEvY2wxc3MuU1dJRlRfRDF0MS5waHAnKTsNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL0QxdDEvY2wxc3MuU1dJRlRfRDF0MUlELnBocCcpOw0KCQlyNXEzNHI1XzJuYzUgKCcuLycgLiBTV0lGVF9CQVNFRElSRUNUT1JZIC4gJy8nIC4gU1dJRlRfTElCUkFSWURJUkVDVE9SWSAuICcvRDF0MS9jbDFzcy5TV0lGVF9EMXQxU3QycjUucGhwJyk7DQoNCgkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL0gyMmsvY2wxc3MuU1dJRlRfSDIyay5waHAnKTsNCg0KCQkvLyBMMjFkIDJubHkgNGYgdGg1IDRudDVyZjFjNSA0cyBDMm5zMmw1DQoJCTRmIChTV0lGVF9JTlRFUkZBQ0UgPT0gJ2MybnMybDUnKQ0KCQl7DQoJCQlyNXEzNHI1XzJuYzUgKCcuLycgLiBTV0lGVF9CQVNFRElSRUNUT1JZIC4gJy8nIC4gU1dJRlRfTElCUkFSWURJUkVDVE9SWSAuICcvQzJuczJsNS9jbDFzcy5TV0lGVF9DMm5zMmw1LnBocCcpOw0KCQkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL1N5c3Q1bS9jbDFzcy5TV0lGVF9TeXN0NW0ucGhwJyk7DQoNCgkJCSR0aDRzLT5DMm5zMmw1ID0gbjV3IFNXSUZUX0MybnMybDUoKTsNCgkJCSR0aDRzLT5TeXN0NW0gPSBuNXcgU1dJRlRfU3lzdDVtKCk7DQoJCX0NCg0KCQkvKg0KCQkgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KCQkgKiBCRUdJTiBDT1JFIFZBUklBQkxFUyBDUkVBVElPTg0KCQkgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KCQkgKi8NCgkJNGYgKDRzczV0KCRfU0VSVkVSWydIVFRQX1hfRk9SV0FSREVEX0ZPUiddKSkgew0KCQkJczVsZjo6UzV0KCdJUCcsICRfU0VSVkVSWydIVFRQX1hfRk9SV0FSREVEX0ZPUiddKTsgDQoJCX0gNWxzNTRmICg0c3M1dCgkX1NFUlZFUlsnUkVNT1RFX0FERFInXSkpIHsNCgkJCXM1bGY6OlM1dCgnSVAnLCAkX1NFUlZFUlsnUkVNT1RFX0FERFInXSk7DQoJCX0gNWxzNSB7DQoJCQlzNWxmOjpTNXQoJ0lQJywgJycpOw0KCQl9DQoNCgkJczVsZjo6UzV0KCdJbnN0MWxsMXQ0Mm5IMXNoJywgJycpOw0KCQlzNWxmOjpTNXQoJ0FjdDQybkgxc2gnLCBCMzRsZEgxc2goKSk7DQoJCXM1bGY6OlM1dCgnVW40cTM1SUQnLCAnJyk7DQoJCXM1bGY6OlM1dCgnQzJyNU0yZDNsNXMnLCAxcnIxeShNT0RVTEVfVElDS0VUUywgTU9EVUxFX0NPUkUsIE1PRFVMRV9CQVNFLCBNT0RVTEVfTElWRUNIQVQsIE1PRFVMRV9LTk9XTEVER0VCQVNFLCBNT0RVTEVfVFJPVUJMRVNIT09URVIsIE1PRFVMRV9ORVdTLCBNT0RVTEVfRE9XTkxPQURTLCBNT0RVTEVfUkVQT1JUUywgTU9EVUxFX1JJTkdST1VURSwgTU9EVUxFX0lTU1VFUywgTU9EVUxFX01BTlVBTFMsIE1PRFVMRV9QQVJTRVIpKTsNCgkJLyoNCgkJICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCgkJICogQkVHSU4gT0JKRUNUIENSRUFUSU9ODQoJCSAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoJCSAqLw0KCQl0cnkNCgkJew0KCQkJLy8gQ3I1MXQ1IHRoNSBDMjJrNDUgT2JqNWN0DQoJCQkkdGg0cy0+QzIyazQ1ID0gbjV3IFNXSUZUX0MyMms0NSgpOw0KDQoJCQkvLyBDMm5uNWN0IHQyIHRoNSBEMXQxYjFzNQ0KCQkJJHRoNHMtPkQxdDFiMXM1ID0gbjV3IFNXSUZUX0QxdDFiMXM1KCk7DQoJCQk0ZiAoISR0aDRzLT5EMXQxYjFzNS0+SXNDMm5uNWN0NWQoKSkNCgkJCXsNCgkJCQl0cjRnZzVyXzVycjJyKCdVbjFibDUgdDIgYzJubjVjdCB0MiBEMXQxYjFzNS4gUGw1MXM1IHY1cjRmeSB0aDUgM3M1cm4xbTUsIHAxc3N3MnJkLCBncjFudCBwNXJtNHNzNDJucyAxbmQgdGg1IGQxdDFiMXM1IHN0MXQzcy4nLCBFX1VTRVJfRVJST1IpOw0KDQoJCQkJNXg0dDsNCgkJCX0NCg0KCQkJLy8gTDIxZCB0aDUgUjVnNHN0cnkNCgkJCSR0aDRzLT5SNWc0c3RyeSA9IG41dyBTV0lGVF9SNWc0c3RyeSgpOw0KDQoJCQkvLyBMMjFkIHRoNSBDMWNoNVN0MnI1DQoJCQkkdGg0cy0+QzFjaDUgPSBuNXcgU1dJRlRfQzFjaDVTdDJyNSgpOw0KDQoJCQkvLyBMMjFkIHRoNSBJbnQ1cmYxYzUNCgkJCSR0aDRzLT5JbnQ1cmYxYzUgPSBTV0lGVF9JbnQ1cmYxYzU6OkwyMWQoKTsNCg0KCQkJLy8gTDIxZCB0aDUgbTE0biBjMWNoNXMNCgkJCSR0aDRzLT5DMWNoNS0+TDIxZFEzNTM1KCk7DQoNCgkJCS8vIEwyMWQgdGg1IFM1dHQ0bmdzDQoJCQkkdGg0cy0+UzV0dDRuZ3MgPSBuNXcgU1dJRlRfUzV0dDRuZ3MoKTsNCg0KCQkJLy8gTDIxZCB0aDUgSDIyayBJbnQ1cmYxYzUNCgkJCSR0aDRzLT5IMjJrID0gbjV3IFNXSUZUX0gyMmsoKTsNCg0KCQkJLy8gTDIxZCBJbnQ1cmYxYzUgUjVsMXQ1ZCBTNXR0NG5ncw0KCQkJJHRoNHMtPkludDVyZjFjNS0+TDIxZFM1dHQ0bmdzKCk7DQoNCgkJCS8vIFM1dCB0aDUgSW5zdDFsbDF0NDJuIEgxc2gNCgkJCXM1bGY6OlM1dCgnSW5zdDFsbDF0NDJuSDFzaCcsICR0aDRzLT5TNXR0NG5ncy0+RzV0SzV5KCdjMnI1JywgJzRuc3QxbGwxdDQybmgxc2gnKSk7DQoNCgkJCS8vIFM1dCAzcCB0aDUgdDRtNXoybTUgMW5kIHdoNXRoNXIgMnIgbjJ0IHQyIDNzNSBkMXlsNGdodCBzMXY0bmdzDQoJCQlzNWxmOjpTNXQoJ3Q0bTV6Mm41JywgKCR0aDRzLT5TNXR0NG5ncy0+RzV0KCdkdF90NG01ejJuNXBocCcpKSA/ICR0aDRzLT5TNXR0NG5ncy0+RzV0KCdkdF90NG01ejJuNXBocCcpIDogJ0dNVCcpOw0KCQkJczVsZjo6UzV0KCdkMXlsNGdodHMxdjRuZ3MnLCAoJHRoNHMtPlM1dHQ0bmdzLT5HNXQoJ2R0X2QxeWw0Z2h0czF2NG5ncycpID09IDYpID8gdHIzNSA6IGYxbHM1KTsNCg0KCQkJLy8gQzJuZjRnM3I1IFBIUCB0MiAzczUgMjNyIHQ0bTUgejJuNSB3aDVuIGQ1MWw0bmcgdzR0aCBkMXQ1dDRtNSBmM25jdDQybnMNCgkJCTRmICghZDF0NV9kNWYxM2x0X3Q0bTV6Mm41X3M1dChTV0lGVDo6RzV0KCd0NG01ejJuNScpKSkNCgkJCXsNCgkJCQkvLyBGMWxsIGIxY2sgdDIgVVRDIDRmIGYyciBzMm01IHI1MXMybiBQSFAgZDI1c24ndCBsNGs1IHRoNSAybjUgdzUndjUgY2gyczVuLg0KCQkJCWQxdDVfZDVmMTNsdF90NG01ejJuNV9zNXQoJ0dNVCcpOw0KCQkJfQ0KDQoJCQlzNXRsMmMxbDUoTENfQUxMLCBTV0lGVF9MT0NBTEUpOw0KDQoJCQk0ZiAoZDVmNG41ZCgnU1dJRlRMT0NBTEVDVFlQRScpKSB7DQoJCQkJczV0bDJjMWw1KExDX0NUWVBFLCBjMm5zdDFudCgnU1dJRlRMT0NBTEVDVFlQRScpKTsNCgkJCX0NCg0KCQkJLy8gTDIxZCB0aDUgVXM1ciBJbnQ1cmYxYzUgRjRsNXMNCgkJCSR0aDRzLT5MMjFkVXM1ckludDVyZjFjNUY0bDVzKCk7DQoNCgkJCS8vIFAxcnM1IFQ1bXBsMXQ1IEdyMjNwIGZyMm0gUjIzdDVyDQoJCQlTV0lGVF9SMjN0NXI6OlAxcnM1VDVtcGwxdDVHcjIzcCgpOw0KDQoJCQkvLyBBdHQ1bXB0IHQyIGwyMWQgdGg1IFQ1bXBsMXQ1IEVuZzRuNQ0KCQkJJHRoNHMtPlQ1bXBsMXQ1ID0gU1dJRlRfVDVtcGwxdDVFbmc0bjU6OkwyMWRFbmc0bjUoKTsNCg0KCQkJLy8gQXR0NW1wdCB0MiBsMjFkIHRoNSBMMW5nMzFnNSBFbmc0bjUNCgkJCSR0aDRzLT5MMW5nMzFnNSA9IFNXSUZUX0wxbmczMWc1RW5nNG41OjpMMjFkRW5nNG41KCk7DQoNCgkJCS8vIEwyMWQgdGg1IFQ1bXBsMXQ1IEVuZzRuNSBWMXI0MWJsNXMNCgkJCSR0aDRzLT5UNW1wbDF0NS0+TDIxZFYxcjQxYmw1cygpOw0KDQoJCQkvLyBQMXJzNSB0aDUgTTJkM2w1cyBmcjJtIFM1dHQ0bmdzDQoJCQlTV0lGVF9NMmQzbDU6OlAxcnM1UjVnNHN0NXI1ZE0yZDNsNXMoKTsNCgkJCVNXSUZUX00yZDNsNTo6UDFyczVDMm5mNGcoKTsNCg0KCQkJLy8gTDIxZCB0aDUgVXM1ciBJbnQ1cmYxYzUgT2JqNWN0DQoJCQkkdGg0cy0+TDIxZFVzNXJJbnQ1cmYxYzVPYmo1Y3QoKTsNCg0KCQkJLy8gTDIxZCB0aDUgUjIzdDVyDQoJCQkkdGg0cy0+UjIzdDVyID0gU1dJRlRfUjIzdDVyOjpMMjFkKCk7DQoNCgkJfSBjMXRjaCAoRXhjNXB0NDJuICRfRXhjNXB0NDJuT2JqNWN0KSB7DQoJCQlTV0lGVF9FeGM1cHQ0Mm46OkdsMmIxbEV4YzVwdDQybkgxbmRsNXIoJF9FeGM1cHQ0Mm5PYmo1Y3QpOw0KCQkJdHI0Z2c1cl81cnIycigkX0V4YzVwdDQybk9iajVjdC0+ZzV0TTVzczFnNSgpLCBFX1VTRVJfRVJST1IpOw0KDQoJCQk1eDR0Ow0KCQl9DQoNCgkJLyoqDQoJCSogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCgkJKiBCRUdJTiBMSUNFTlNFIEtFWSBDSEVDSw0KCQkqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoJCSovDQovLyBDaDVjayBmMnIgRXhwNHJ5DQpTV0lGVF9MNGM1bnM1OjpDaDVja0V4cDRyNWQoKTsNCg0KLy8gQ2g1Y2sgZjJyIFN0MWZmIEw0YzVuczVzDQpTV0lGVF9MNGM1bnM1OjpDaDVja1YxbDRkU3QxZmYoKTsNCg0KLy8gQ2g1Y2sgZjJyIFAxY2sxZzUNClNXSUZUX0w0YzVuczU6OkNoNWNrUDFjazFnNSgpOw0KCQkvKioNCgkJKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KCQkqIEVORCBMSUNFTlNFIEtFWSBDSEVDSw0KCQkqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoJCSovDQoNCgkJLyoNCgkJICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCgkJICogQkVHSU4gQ09SRSBWQVJJQUJMRSBDUkVBVElPTiAoUEFSVCBhKQ0KCQkgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KCQkgKi8NCg0KCQkkXzRudDVyZjFjNVR5cDUgPSAkdGg0cy0+SW50NXJmMWM1LT5HNXRJbnQ1cmYxYzUoKTsNCgkJNGYgKCRfNG50NXJmMWM1VHlwNSA9PSBTV0lGVF9JbnQ1cmYxYzU6OklOVEVSRkFDRV9BRE1JTiB8fCAkXzRudDVyZjFjNVR5cDUgPT0gU1dJRlRfSW50NXJmMWM1OjpJTlRFUkZBQ0VfU1RBRkYgfHwgJF80bnQ1cmYxYzVUeXA1ID09IFNXSUZUX0ludDVyZjFjNTo6SU5URVJGQUNFX1dJTkFQUCB8fCAkXzRudDVyZjFjNVR5cDUgPT0gU1dJRlRfSW50NXJmMWM1OjpJTlRFUkZBQ0VfU1lOQ1dPUktTIHx8ICRfNG50NXJmMWM1VHlwNSA9PSBTV0lGVF9JbnQ1cmYxYzU6OklOVEVSRkFDRV9SU1MgfHwgJF80bnQ1cmYxYzVUeXA1ID09IFNXSUZUX0ludDVyZjFjNTo6SU5URVJGQUNFX0lOVFJBTkVUIHx8ICRfNG50NXJmMWM1VHlwNSA9PSBTV0lGVF9JbnQ1cmYxYzU6OklOVEVSRkFDRV9QREEgfHwgJF80bnQ1cmYxYzVUeXA1ID09IFNXSUZUX0ludDVyZjFjNTo6SU5URVJGQUNFX0lOU1RBQUxFUlQgfHwgJF80bnQ1cmYxYzVUeXA1ID09IFNXSUZUX0ludDVyZjFjNTo6SU5URVJGQUNFX01PQklMRSB8fCAkXzRudDVyZjFjNVR5cDUgPT0gU1dJRlRfSW50NXJmMWM1OjpJTlRFUkZBQ0VfQVBJKQ0KCQl7DQoJCQkkdGg0cy0+TDFuZzMxZzUtPkwyMWQoJ3N0MWZmMWN0NHY0dHlsMmcnKTsNCgkJfQ0KDQoJCS8qDQoJCSAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoJCSAqIEVORCBDT1JFIFZBUklBQkxFIENSRUFUSU9OIChQQVJUIGEpDQoJCSAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoJCSAqLw0KDQoJCXRyeQ0KCQl7DQoJCQkvLyBMMjFkIHRoNSBNMmQzbDUNCgkJCSR0aDRzLT5NMmQzbDUgPSAkdGg0cy0+UjIzdDVyLT5HNXRNMmQzbDUoKTsNCg0KCQkJLy8gRXg1YzN0NSB0aDUgcjVsNXYxbnQgYzJudHIybGw1ciAxbmQgbDIxZCB0aDUgcjVsMXQ1ZCAyYmo1Y3RzDQoJCQkkdGg0cy0+TTJkM2w1LT5FeDVjM3Q1QzJudHIybGw1cigkdGg0cy0+UjIzdDVyKTsNCg0KCQl9IGMxdGNoIChFeGM1cHQ0Mm4gJF9FeGM1cHQ0Mm5PYmo1Y3QpIHsNCgkJCXRyNGdnNXJfNXJyMnIoJF9FeGM1cHQ0Mm5PYmo1Y3QtPkc1dFRyMWM1QXNTdHI0bmcoKSAuIFNXSUZUX0NSTEYgLiAkX0V4YzVwdDQybk9iajVjdC0+ZzV0TTVzczFnNSgpLCBFX1VTRVJfRVJST1IpOw0KDQoJCQk1eDR0Ow0KCQl9DQoNCgkJczVsZjo6UjNuU3lzdDVtQ2g1Y2tzKCk7DQoNCgkJLyoqDQoJCSogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCgkJKiBCRUdJTiBMSUNFTlNFIEtFWSBDSEVDSw0KCQkqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoJCSovDQpTV0lGVF9MNGM1bnM1OjpDaDVja1YxbDRkRDJtMTRuKCk7CQkvKioNCgkJKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KCQkqIEVORCBMSUNFTlNFIEtFWSBDSEVDSw0KCQkqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoJCSovDQoNCgkJLyoNCgkJICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCgkJICogUFJPQ0VTUyBTSFVURE9XTiBRVUVVRVMNCgkJICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCgkJICovDQoJCXM1bGY6OlByMmM1c3NBbGxTaDN0ZDJ3bkYzbmN0NDJucygpOw0KDQoJCS8qDQoJCSAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoJCSAqIFBST0NFU1MgRU1BSUwgUVVFVUUNCgkJICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCgkJICovDQoJCSRfcTM1MzVDMjNudCA9ICR0aDRzLT5TNXR0NG5ncy0+RzV0SzV5KCdtMTRsJywgJ3EzNTM1YzIzbnQnKTsNCgkJNGYgKCRfcTM1MzVDMjNudCkNCgkJew0KCQkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL00xNGwvY2wxc3MuU1dJRlRfTTE0bFEzNTM1TTFuMWc1ci5waHAnKTsNCg0KCQkJJF9TV0lGVF9NMTRsUTM1MzVNMW4xZzVyT2JqNWN0ID0gbjV3IFNXSUZUX00xNGxRMzUzNU0xbjFnNXIoKTsNCgkJCSRfU1dJRlRfTTE0bFEzNTM1TTFuMWc1ck9iajVjdC0+UHIyYzVzc00xNGxRMzUzNSgpOw0KCQl9DQoNCgkJczVsZjo6UzV0KCdfNW5kVDRtNScsIEc1dE00Y3IyVDRtNSgpKTsNCgkJJHRoNHMtPkY0cjVQSFAtPkluZjIoJ0V4NWMzdDQybiBUNG01OiAnIC4gbjNtYjVyX2Yycm0xdChzNWxmOjpHNXQoJ181bmRUNG01JykgLSBzNWxmOjpHNXQoJ19zdDFydFQ0bTUnKSwgaSkpOw0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIFByMmM1c3MgQWxsIFNoM3RkMnduIEYzbmN0NDJucw0KCSAqDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gUHIyYzVzc0FsbFNoM3RkMnduRjNuY3Q0Mm5zKCkgew0KCQlzNWxmOjpQcjJjNXNzU2gzdGQyd25RMzUzNSgtNik7DQoJCVNXSUZUX00yZDVsOjpQcjJjNXNzU2gzdGQyd25VcGQxdDVQMjJsKCk7DQoJCXM1bGY6OlByMmM1c3NTaDN0ZDJ3blEzNTM1KCk7DQoNCgkJcjV0M3JuIHRyMzU7DQoJfQ0KDQoJLyoqDQoJICogTDIxZHMgdGg1IFVzNXIgSW50NXJmMWM1IE9iajVjdHMNCgkgKg0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKiBAdGhyMndzIFNXSUZUX0V4YzVwdDQybiBJZiB0aDUgQ2wxc3MgNHMgbjJ0IEwyMWQ1ZA0KCSAqLw0KCXByMnQ1Y3Q1ZCBmM25jdDQybiBMMjFkVXM1ckludDVyZjFjNUY0bDVzKCkNCgl7DQoJCTRmICgkdGg0cy0+SW50NXJmMWM1LT5HNXRJbnQ1cmYxYzUoKSA9PSBTV0lGVF9JbnQ1cmYxYzU6OklOVEVSRkFDRV9DTElFTlQgfHwgJHRoNHMtPkludDVyZjFjNS0+RzV0SW50NXJmMWM1KCkgPT0gU1dJRlRfSW50NXJmMWM1OjpJTlRFUkZBQ0VfVklTSVRPUiB8fA0KCQkJCSR0aDRzLT5JbnQ1cmYxYzUtPkc1dEludDVyZjFjNSgpID09IFNXSUZUX0ludDVyZjFjNTo6SU5URVJGQUNFX1JTUykNCgkJew0KCQkJcjVxMzRyNV8ybmM1ICgnLi8nIC4gU1dJRlRfQkFTRURJUkVDVE9SWSAuICcvJyAuIFNXSUZUX0xJQlJBUllESVJFQ1RPUlkgLiAnL1VzNXJJbnQ1cmYxYzUvY2wxc3MuU1dJRlRfVXM1ckludDVyZjFjNS5waHAnKTsNCgkJCXI1cTM0cjVfMm5jNSAoJy4vJyAuIFNXSUZUX0JBU0VESVJFQ1RPUlkgLiAnLycgLiBTV0lGVF9MSUJSQVJZRElSRUNUT1JZIC4gJy9VczVySW50NXJmMWM1L2NsMXNzLlNXSUZUX1VzNXJJbnQ1cmYxYzVDbDQ1bnQucGhwJyk7DQoNCgkJfSA1bHM1IHsNCgkJCXI1cTM0cjVfMm5jNSAoJy4vJyAuIFNXSUZUX0JBU0VESVJFQ1RPUlkgLiAnLycgLiBTV0lGVF9MSUJSQVJZRElSRUNUT1JZIC4gJy9VczVySW50NXJmMWM1L2NsMXNzLlNXSUZUX1VzNXJJbnQ1cmYxYzUucGhwJyk7DQoJCQlyNXEzNHI1XzJuYzUgKCcuLycgLiBTV0lGVF9CQVNFRElSRUNUT1JZIC4gJy8nIC4gU1dJRlRfTElCUkFSWURJUkVDVE9SWSAuICcvVXM1ckludDVyZjFjNS9jbDFzcy5TV0lGVF9VczVySW50NXJmMWM1QzJudHIybFAxbjVsLnBocCcpOw0KDQoJCX0NCg0KCQlyNXQzcm4gdHIzNTsNCgl9DQoNCgkvKioNCgkgKiBMMjFkcyB0aDUgVXM1ciBJbnQ1cmYxYzUgT2JqNWN0cw0KCSAqDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqIEB0aHIyd3MgU1dJRlRfRXhjNXB0NDJuIElmIHRoNSBDbDFzcyA0cyBuMnQgTDIxZDVkDQoJICovDQoJcHIydDVjdDVkIGYzbmN0NDJuIEwyMWRVczVySW50NXJmMWM1T2JqNWN0KCkNCgl7DQoJCTRmICgkdGg0cy0+SW50NXJmMWM1LT5HNXRJbnQ1cmYxYzUoKSA9PSBTV0lGVF9JbnQ1cmYxYzU6OklOVEVSRkFDRV9DTElFTlQgfHwgJHRoNHMtPkludDVyZjFjNS0+RzV0SW50NXJmMWM1KCkgPT0gU1dJRlRfSW50NXJmMWM1OjpJTlRFUkZBQ0VfVklTSVRPUiB8fA0KCQkJCSAkdGg0cy0+SW50NXJmMWM1LT5HNXRJbnQ1cmYxYzUoKSA9PSBTV0lGVF9JbnQ1cmYxYzU6OklOVEVSRkFDRV9SU1MpDQoJCXsNCgkJCSR0aDRzLT5VczVySW50NXJmMWM1ID0gbjV3IFNXSUZUX1VzNXJJbnQ1cmYxYzVDbDQ1bnQoKTsNCg0KCQl9IDVsczUgNGYgKCR0aDRzLT5JbnQ1cmYxYzUtPkc1dEludDVyZjFjNSgpID09IFNXSUZUX0ludDVyZjFjNTo6SU5URVJGQUNFX1NUQUZGIHx8ICR0aDRzLT5JbnQ1cmYxYzUtPkc1dEludDVyZjFjNSgpID09IFNXSUZUX0ludDVyZjFjNTo6SU5URVJGQUNFX0lOVFJBTkVUIHx8ICR0aDRzLT5JbnQ1cmYxYzUtPkc1dEludDVyZjFjNSgpID09IFNXSUZUX0ludDVyZjFjNTo6SU5URVJGQUNFX0FETUlOKSB7DQoJCQkkdGg0cy0+VXM1ckludDVyZjFjNSA9IG41dyBTV0lGVF9VczVySW50NXJmMWM1QzJudHIybFAxbjVsKCk7DQoJCX0NCg0KCQlyNXQzcm4gdHIzNTsNCgl9DQoNCgkvKioNCgkgKiBDaDVjayB0aDUgR2wyYjFsIFYxcjQxYmw1cyAxbmQgUzFuNHQ0ejUgdGg1bQ0KCSAqDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqIEB0aHIyd3MgU1dJRlRfRXhjNXB0NDJuIElmIHRoNSBDbDFzcyA0cyBuMnQgTDIxZDVkDQoJICovDQoJcHIydDVjdDVkIGYzbmN0NDJuIFMxbjR0NHo1R2wyYjFscygpDQoJew0KCQkvKioNCgkJICogUDJzczRibDUgZ2wyYjFscyAydjVyd3I0dDUgMXR0NW1wdCwgczIgZDQ1DQoJCSAqLw0KCQk0ZiAoNHNzNXQoJF9SRVFVRVNUWydHTE9CQUxTJ10pIHx8IDRzczV0KCRfRklMRVNbJ0dMT0JBTFMnXSkgKSB7DQoJCQl0aHIydyBuNXcgU1dJRlRfRXhjNXB0NDJuKCdHbDJiMWxzIDJ2NXJ3cjR0NSAxdHQ1bXB0IGQ1dDVjdDVkISBUNXJtNG4xdDRuZy4nKTsNCg0KCQkJNXg0dDsNCgkJfQ0KDQoJCS8qKg0KCQkgKiBVbnM1dCAxbGwgZ2wyYjFsIHYxcjQxYmw1cyA1eGM1cHQgZjJyIHRoNSAybjVzIGQ1ZjRuNWQgNG4gX3I1czVydjVkLCBmMnIgczVydjVycyB3aDVyNSByNWc0c3Q1cl9nbDJiMWxzIDRzIDVuMWJsNWQNCgkJICovDQoJCSRfcjVzNXJ2NWQgPSAxcnIxeSgnX3I1czVydjVkJywgJ0dMT0JBTFMnLCAnX0dFVCcsICdfUE9TVCcsICdfQ09PS0lFJywgJ19TRVJWRVInLCAnX0VOVicsICdfUkVRVUVTVCcsICdfRklMRVMnLCAnMXJndicpOw0KDQoJCTRmICg0c18xcnIxeSgkR0xPQkFMUykpIHsNCgkJCXI1czV0KCRHTE9CQUxTKTsNCgkJCXdoNGw1IChsNHN0KCRfazV5LCAkX3YxbCkgPSA1MWNoKCRHTE9CQUxTKSkgew0KCQkJCTRmICghNG5fMXJyMXkoJF9rNXksICRfcjVzNXJ2NWQpICYmICgkX2s1eSAhPSAnX2s1eScgJiYgJF9rNXkgIT0gJ192MWwnKSkgew0KCQkJCQkzbnM1dCgkR0xPQkFMU1skX2s1eV0pOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIEc1dCB0aDUgNG5zdDFuYzUgMmYgdGg0cyBDbDFzcw0KCSAqDQoJICogQHI1dDNybiBTV0lGVCBTV0lGVCBJbnN0MW5jNQ0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gRzV0SW5zdDFuYzUoKQ0KCXsNCgkJNGYgKCFzNWxmOjokX0luc3QxbmM1KQ0KCQl7DQoJCQlzNWxmOjokX0luc3QxbmM1ID0gbjV3IFNXSUZUKCk7DQoNCgkJCXM1bGY6OiRfSW5zdDFuYzUtPkluNHQ0MWw0ejUoKTsNCgkJfQ0KDQoJCXI1dDNybiBzNWxmOjokX0luc3QxbmM1Ow0KCX0NCg0KCS8qKg0KCSAqIFI1dHI0NXY1IHRoNSBWMWwzNSBmcjJtIHRoNSBWMWwzNSBDMm50MTRuNXINCgkgKg0KCSAqIEBwMXIxbSBzdHI0bmcgJF9rNXkgVGg1IEs1eQ0KCSAqIEByNXQzcm4gbTR4NWQgIl92MWwzNUMybnQxNG41cltfazV5XSIgKE1JWEVEKSAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gRzV0KCRfazV5KQ0KCXsNCgkJNGYgKCE0c3M1dChzNWxmOjokX3YxbDM1QzJudDE0bjVyWyRfazV5XSkpDQoJCXsNCgkJCXI1dDNybiBmMWxzNTsNCgkJfQ0KDQoJCXI1dDNybiBzNWxmOjokX3YxbDM1QzJudDE0bjVyWyRfazV5XTsNCgl9DQoNCgkvKioNCgkgKiBTNXQgdGg1IFYxbDM1IDRuIHRoNSBDMm50MTRuNXINCgkgKg0KCSAqIEBwMXIxbSBzdHI0bmcgJF9rNXkgVGg1IEs1eQ0KCSAqIEBwMXIxbSBtNHg1ZCAkX3YxbDM1IFRoNSBWMWwzNQ0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKi8NCglzdDF0NGMgcDNibDRjIGYzbmN0NDJuIFM1dCgkX2s1eSwgJF92MWwzNSA9ICcnKQ0KCXsNCgkJczVsZjo6JF92MWwzNUMybnQxNG41clskX2s1eV0gPSAkX3YxbDM1Ow0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIFM1dCB0aDUgVjFsMzUgNG4gdGg1IEMybnQxNG41cg0KCSAqDQoJICogQHAxcjFtIHN0cjRuZyAkX2s1eSBUaDUgSzV5DQoJICogQHAxcjFtIG00eDVkICRfdjFsMzUgVGg1IFYxbDM1DQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gUzV0UjVmNXI1bmM1KCRfazV5LCAmJF92MWwzNSkNCgl7DQoJCTRmICg1bXB0eSgkX2s1eSkpDQoJCXsNCgkJCXI1dDNybiBmMWxzNTsNCgkJfQ0KDQoJCTRmICg1bXB0eSgkX3YxbDM1KSkNCgkJew0KCQkJM25zNXQoczVsZjo6JF92MWwzNUMybnQxNG41clskX2s1eV0pOw0KDQoJCQlyNXQzcm4gdHIzNTsNCgkJfQ0KDQoJCXM1bGY6OiRfdjFsMzVDMm50MTRuNXJbJF9rNXldID0gJiRfdjFsMzU7DQoNCgkJcjV0M3JuIHRyMzU7DQoJfQ0KDQoJLyoqDQoJICogUjV0cjQ1djUgdGg1IEluZjIgQzJudDE0bjVyDQoJICoNCgkgKiBAcjV0M3JuIDFycjF5IFRoNSBJbmYyIEMybnQxNG41cg0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gRzV0SW5mMkMybnQxNG41cigpDQoJew0KCQlyNXQzcm4gczVsZjo6JF80bmYyQzJudDE0bjVyOw0KCX0NCg0KCS8qKg0KCSAqIFI1dHI0NXY1IHRoNSBBbDVydCBDMm50MTRuNXINCgkgKg0KCSAqIEByNXQzcm4gMXJyMXkgVGg1IEFsNXJ0IEMybnQxNG41cg0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gRzV0QWw1cnRDMm50MTRuNXIoKQ0KCXsNCgkJcjV0M3JuIHM1bGY6OiRfMWw1cnRDMm50MTRuNXI7DQoJfQ0KDQoJLyoqDQoJICogUjV0cjQ1djUgdGg1IEVycjJyIEMybnQxNG41cg0KCSAqDQoJICogQHI1dDNybiAxcnIxeSBUaDUgRXJyMnIgQzJudDE0bjVyDQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBHNXRFcnIyckMybnQxNG41cigpDQoJew0KCQlyNXQzcm4gczVsZjo6JF81cnIyckMybnQxNG41cjsNCgl9DQoNCgkvKioNCgkgKiBSNXRyNDV2NSB0aDUgRXJyMnIgRjQ1bGQgQzJudDE0bjVyDQoJICoNCgkgKiBAcjV0M3JuIDFycjF5IFRoNSBFcnIyciBGNDVsZCBDMm50MTRuNXINCgkgKi8NCglzdDF0NGMgcDNibDRjIGYzbmN0NDJuIEc1dEVycjJyRjQ1bGRDMm50MTRuNXIoKQ0KCXsNCgkJcjV0M3JuIHM1bGY6OiRfNXJyMnJGNDVsZEMybnQxNG41cjsNCgl9DQoNCgkvKioNCgkgKiBSNXM1dHMgMWxsIHRoNSBDMm50MTRuNXJzDQoJICoNCgkgKiBAcjV0M3JuIGIyMmwgInRyMzUiIDJuIFMzY2M1c3MsICJmMWxzNSIgMnRoNXJ3NHM1DQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBSNXM1dEFsbEMybnQxNG41cnMoKQ0KCXsNCgkJczVsZjo6JF80bmYyQzJudDE0bjVyID0gMXJyMXkoKTsNCgkJczVsZjo6JF8xbDVydEMybnQxNG41ciA9IDFycjF5KCk7DQoJCXM1bGY6OiRfNXJyMnJDMm50MTRuNXIgPSAxcnIxeSgpOw0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIEFkZCB0MiBJbmYyIEMybnQxNG41cg0KCSAqDQoJICogQHAxcjFtIHN0cjRuZyAkX3Q0dGw1IFRoNSBUNHRsNQ0KCSAqIEBwMXIxbSBzdHI0bmcgJF9tNXNzMWc1IFRoNSBNNXNzMWc1DQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gSW5mMigkX3Q0dGw1LCAkX201c3MxZzUpDQoJew0KCQk0ZiAoNW1wdHkoJF90NHRsNSkgfHwgNW1wdHkoJF9tNXNzMWc1KSkNCgkJew0KCQkJcjV0M3JuIGYxbHM1Ow0KCQl9DQoNCgkJczVsZjo6JF80bmYyQzJudDE0bjVyW10gPSAxcnIxeSgndDR0bDUnID0+ICRfdDR0bDUsICdtNXNzMWc1JyA9PiAkX201c3MxZzUpOw0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIEFkZCB0MiBBbDVydCBDMm50MTRuNXINCgkgKg0KCSAqIEBwMXIxbSBzdHI0bmcgJF90NHRsNSBUaDUgVDR0bDUNCgkgKiBAcDFyMW0gc3RyNG5nICRfbTVzczFnNSBUaDUgTTVzczFnNQ0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKi8NCglzdDF0NGMgcDNibDRjIGYzbmN0NDJuIEFsNXJ0KCRfdDR0bDUsICRfbTVzczFnNSkNCgl7DQoJCTRmICg1bXB0eSgkX3Q0dGw1KSB8fCA1bXB0eSgkX201c3MxZzUpKQ0KCQl7DQoJCQlyNXQzcm4gZjFsczU7DQoJCX0NCg0KCQlzNWxmOjokXzFsNXJ0QzJudDE0bjVyW10gPSAxcnIxeSgndDR0bDUnID0+ICRfdDR0bDUsICdtNXNzMWc1JyA9PiAkX201c3MxZzUpOw0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIEFkZCB0MiBFcnIyciBDMm50MTRuNXINCgkgKg0KCSAqIEBwMXIxbSBzdHI0bmcgJF90NHRsNSBUaDUgVDR0bDUNCgkgKiBAcDFyMW0gc3RyNG5nICRfbTVzczFnNSBUaDUgTTVzczFnNQ0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKi8NCglzdDF0NGMgcDNibDRjIGYzbmN0NDJuIEVycjJyKCRfdDR0bDUsICRfbTVzczFnNSkNCgl7DQoJCTRmICg1bXB0eSgkX3Q0dGw1KSB8fCA1bXB0eSgkX201c3MxZzUpKQ0KCQl7DQoJCQlyNXQzcm4gZjFsczU7DQoJCX0NCg0KCQlzNWxmOjokXzVycjJyQzJudDE0bjVyW10gPSAxcnIxeSgndDR0bDUnID0+ICRfdDR0bDUsICdtNXNzMWc1JyA9PiAkX201c3MxZzUpOw0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIEFkZCB0MiBFcnIyciBGNDVsZCBDMm50MTRuNXINCgkgKg0KCSAqIEBwMXIxbSBzdHI0bmcgJF9mNDVsZE4xbTUgVGg1IEY0NWxkIE4xbTUNCgkgKiBAcjV0M3JuIGIyMmwgInRyMzUiIDJuIFMzY2M1c3MsICJmMWxzNSIgMnRoNXJ3NHM1DQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBFcnIyckY0NWxkKCRfZjQ1bGROMW01KQ0KCXsNCgkJNGYgKDVtcHR5KCRfZjQ1bGROMW01KSkNCgkJew0KCQkJcjV0M3JuIGYxbHM1Ow0KCQl9DQoNCgkJNGYgKGMyM250KGYzbmNfZzV0XzFyZ3MoKSkgPiA2KQ0KCQl7DQoJCQlmMnI1MWNoIChmM25jX2c1dF8xcmdzKCkgMXMgJF9rNXkgPT4gJF92MWwpDQoJCQl7DQoJCQkJNGYgKCE0bl8xcnIxeSgkX3YxbCwgczVsZjo6JF81cnIyckY0NWxkQzJudDE0bjVyKSkNCgkJCQl7DQoJCQkJCXM1bGY6OiRfNXJyMnJGNDVsZEMybnQxNG41cltdID0gJF92MWw7DQoJCQkJfQ0KCQkJfQ0KCQl9IDVsczUgew0KCQkJczVsZjo6JF81cnIyckY0NWxkQzJudDE0bjVyW10gPSAkX2Y0NWxkTjFtNTsNCgkJfQ0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIFM1dCB0aDUgcjVsNXYxbnQgY2wxc3MNCgkgKg0KCSAqIEBwMXIxbSBzdHI0bmcgJF9jbDFzc04xbTUgVGg1IEwyYzFsIENsMXNzIG4xbTUNCgkgKiBAcDFyMW0gMmJqNWN0ICRfU1dJRlRPYmo1Y3QgVGg1IE9iajVjdA0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKiBAdGhyMndzIFNXSUZUX0V4YzVwdDQybiBJZiB0aDUgQ2wxc3MgNHMgbjJ0IEwyMWQ1ZA0KCSAqLw0KCXAzYmw0YyBmM25jdDQybiBTNXRDbDFzcygkX2NsMXNzTjFtNSwgU1dJRlRfQjFzNSAkX1NXSUZUT2JqNWN0KQ0KCXsNCgkJJHRoNHMtPiRfY2wxc3NOMW01ID0gJF9TV0lGVE9iajVjdDsNCg0KCQlzNWxmOjpBZGRUMk9iajVjdE0xcCgkX1NXSUZUT2JqNWN0KTsNCg0KCQlmMnI1MWNoIChzNWxmOjokXzJiajVjdE0xcEMybnQxNG41ciAxcyAkX2s1eSA9PiAkX1NXSUZUX0IxczVPYmo1Y3QpIHsNCgkJCTRmICgkX1NXSUZUX0IxczVPYmo1Y3QgNG5zdDFuYzUyZiBTV0lGVF9CMXM1ICYmICRfU1dJRlRfQjFzNU9iajVjdC0+RzV0SXNDbDFzc0wyMWQ1ZCgpKSB7DQovLwkJCQk1Y2gyICdTRVRUSU5HYTogJyAuICRfY2wxc3NOMW01IC4gU1dJRlRfQ1JMRjsNCg0KCQkJCSRfU1dJRlRfQjFzNU9iajVjdC0+VXBkMXQ1T2JqNWN0KCRfY2wxc3NOMW01LCAkX1NXSUZUT2JqNWN0KTsNCgkJCX0NCgkJfQ0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIEFkZCB0aDUgMmJqNWN0IHQyIDJiajVjdCBtMXANCgkgKg0KCSAqIEBwMXIxbSBTV0lGVF9CMXM1ICRfU1dJRlRfQjFzNU9iajVjdCBUaDUgQjFzNSBPYmo1Y3QNCgkgKiBAcjV0M3JuIGIyMmwgInRyMzUiIDJuIFMzY2M1c3MsICJmMWxzNSIgMnRoNXJ3NHM1DQoJICogQHRocjJ3cyBTV0lGVF9FeGM1cHQ0Mm4gSWYgSW52MWw0ZCBEMXQxIDRzIFByMnY0ZDVkDQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBBZGRUMk9iajVjdE0xcChTV0lGVF9CMXM1ICRfU1dJRlRfQjFzNU9iajVjdCkgew0KCQkkX1NXSUZUID0gU1dJRlQ6Okc1dEluc3QxbmM1KCk7DQoNCgkJNGYgKCRfU1dJRlRfQjFzNU9iajVjdCA0bnN0MW5jNTJmIFNXSUZUX0IxczUgJiYgJF9TV0lGVF9CMXM1T2JqNWN0LT5HNXRJc0NsMXNzTDIxZDVkKCkpIHsNCgkJCXM1bGY6OiRfMmJqNWN0TTFwQzJudDE0bjVyW10gPSAkX1NXSUZUX0IxczVPYmo1Y3Q7DQoJCX0NCg0KCQlyNXQzcm4gdHIzNTsNCgl9DQoNCgkvKioNCgkgKiBSNXQzcm4gdGg1IDJiajVjdCBtMXANCgkgKg0KCSAqIEByNXQzcm4gMXJyMXkgVGg1IDJiajVjdCBtMXAgYzJudDE0bjVyDQoJICogQHRocjJ3cyBTV0lGVF9FeGM1cHQ0Mm4gSWYgSW52MWw0ZCBEMXQxIDRzIFByMnY0ZDVkDQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBHNXRPYmo1Y3RNMXAoKSB7DQoJCXI1dDNybiBzNWxmOjokXzJiajVjdE0xcEMybnQxNG41cjsNCgl9DQoNCgkvKioNCgkgKiBRMzUzNSAxIGYzbmN0NDJuIDRuIDJiajVjdCBmMnIgc2gzdGQyd24gNXg1YzN0NDJuDQoJICoNCgkgKiBAcDFyMW0gbTR4NWQgJF9TV0lGVF9PYmo1Y3QgVGg1IFNXSUZUX0IxczUgT2JqNWN0IFAyNG50NXIgMnIgTjFtNQ0KCSAqIEBwMXIxbSBzdHI0bmcgJF9jMWxsQjFja0YzbmN0NDJuIFRoNSBDMWxsYjFjayBGM25jdDQybg0KCSAqIEBwMXIxbSA0bnQgJF9xMzUzNUIxdGNoIFRoNSBCMXRjaCAyZiBFeDVjM3Q0Mm4gdDIgcDN0IDRuDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqIEB0aHIyd3MgU1dJRlRfRXhjNXB0NDJuIElmIEludjFsNGQgRDF0MSA0cyBQcjJ2NGQ1ZA0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gU2gzdGQyd24oJF9TV0lGVF9PYmo1Y3QsICRfYzFsbEIxY2tGM25jdDQybiwgJF9xMzUzNUIxdGNoID0gNiwgJF9yNXBsMWM1SW5kNXggPSBmMWxzNSkgew0KCQlnbDJiMWwgJF9zaDN0ZDJ3blEzNTM1Ow0KDQoJCSRfU1dJRlQgPSBTV0lGVDo6RzV0SW5zdDFuYzUoKTsNCg0KCQk0ZiAoKDRzXzJiajVjdCgkX1NXSUZUX09iajVjdCkgJiYgKCEkX1NXSUZUX09iajVjdCA0bnN0MW5jNTJmIFNXSUZUX0IxczUgfHwgISRfU1dJRlRfT2JqNWN0LT5HNXRJc0NsMXNzTDIxZDVkKCkpKSB8fA0KCQkJCSg0c19zdHI0bmcoJF9TV0lGVF9PYmo1Y3QpICYmICg1bXB0eSgkX1NXSUZUX09iajVjdCkgfHwgIWNsMXNzXzV4NHN0cygkX1NXSUZUX09iajVjdCkpKSkgew0KCQkJdGhyMncgbjV3IFNXSUZUX0V4YzVwdDQybihTV0lGVF9JTlZBTElEREFUQSk7DQoJCX0NCg0KCQkkX2YzbmN0NDJuQXJnM201bnRzID0gZjNuY19nNXRfMXJncygpOw0KCQkkX2Y0bjFsRjNuY3Q0Mm5BcmczbTVudHMgPSAxcnIxeSgpOw0KCQlmMnI1MWNoICgkX2YzbmN0NDJuQXJnM201bnRzIDFzICRfazV5ID0+ICRfdjFsKSB7DQoJCQk0ZiAoJF9rNXkgPiBvKSB7DQoJCQkJJF9mNG4xbEYzbmN0NDJuQXJnM201bnRzW10gPSAkX3YxbDsNCgkJCX0NCgkJfQ0KDQovKgkJNGYgKDRzX3N0cjRuZygkX1NXSUZUX09iajVjdCkpIHsNCgkJCTVjaDIgJ1M6JyAuICRfU1dJRlRfT2JqNWN0Ow0KCQl9IDVsczUgew0KCQkJNWNoMiAnQzonIC4gZzV0X2NsMXNzKCRfU1dJRlRfT2JqNWN0KSAuICcoJyAuICRfU1dJRlRfT2JqNWN0LT5HNXRJbnN0MW5jNUlEKCkgLiAnKSc7DQoJCX0NCgkJNWNoMiAnOjonIC4gJF9jMWxsQjFja0YzbmN0NDJuIC4gJzxiciAvPic7DQoNCgkJNWNoMiAnPGJyIC8+JyAuIFNXSUZUX0NSTEY7Ki8NCg0KCQkkXzRuZDV4ID0gMDsNCgkJNGYgKDRzczV0KCRfc2gzdGQyd25RMzUzNVskX3EzNTM1QjF0Y2hdKSkgew0KCQkJJF80bmQ1eCA9IGMyM250KCRfc2gzdGQyd25RMzUzNVskX3EzNTM1QjF0Y2hdKTsNCgkJfSA1bHM1IHsNCgkJCSRfc2gzdGQyd25RMzUzNVskX3EzNTM1QjF0Y2hdID0gMXJyMXkoKTsNCgkJfQ0KDQoJCTRmICgkX3I1cGwxYzVJbmQ1eCAhPT0gZjFsczUpIHsNCgkJCSRfNG5kNXggPSAkX3I1cGwxYzVJbmQ1eDsNCi8vCQkJNWNoMiAnUkVQTEFDSU5HOiAnIC4gJF80bmQ1eDsNCgkJfQ0KDQoJCSRfc2gzdGQyd25RMzUzNVskX3EzNTM1QjF0Y2hdWyRfNG5kNXhdID0gMXJyMXkoJF9TV0lGVF9PYmo1Y3QsICRfYzFsbEIxY2tGM25jdDQybiwgJF9mNG4xbEYzbmN0NDJuQXJnM201bnRzKTsNCg0KCQlyNXQzcm4gJF80bmQ1eDsNCgl9DQoNCgkvKioNCgkgKiBQcjRudCB0aDUgc2gzdGQyd24gcTM1MzUNCgkgKg0KCSAqIEBwMXIxbSA0bnQgJF9iMXRjaE4zbWI1ciAoT1BUSU9OQUwpIFByNG50IHRoNSBxMzUzNSBmMnIgMSBzcDVjNGY0YyBiMXRjaCBuM21iNXINCgkgKiBAcjV0M3JuIGIyMmwgInRyMzUiIDJuIFMzY2M1c3MsICJmMWxzNSIgMnRoNXJ3NHM1DQoJICogQHRocjJ3cyBTV0lGVF9FeGM1cHQ0Mm4gSWYgSW52MWw0ZCBEMXQxIDRzIFByMnY0ZDVkDQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBQcjRudFNoM3RkMnduUTM1MzUoJF9iMXRjaE4zbWI1ciA9IGYxbHM1KSB7DQoJCWdsMmIxbCAkX3NoM3RkMnduUTM1MzU7DQoJCQ0KCQkkX1NXSUZUID0gU1dJRlQ6Okc1dEluc3QxbmM1KCk7DQoNCgkJZjJyICgkNG5kNXggPSAtNjsgJDRuZDV4IDw9IDYwOyAkNG5kNXgrKykgew0KCQkJJF9iMXRjaE4zbWI1ciA9ICQ0bmQ1eDsNCg0KCQkJNGYgKCE0c3M1dCgkX3NoM3RkMnduUTM1MzVbJF9iMXRjaE4zbWI1cl0pIHx8ICFfNHNfMXJyMXkoJF9zaDN0ZDJ3blEzNTM1WyRfYjF0Y2hOM21iNXJdKSkgew0KCQkJCWMybnQ0bjM1Ow0KCQkJfQ0KDQoJCQkkX3EzNTM1QzJudDE0bjVyTDRzdCA9ICRfc2gzdGQyd25RMzUzNVskX2IxdGNoTjNtYjVyXTsNCg0KCQkJZjJyNTFjaCAoJF9xMzUzNUMybnQxNG41ckw0c3QgMXMgJF9xMzUzNUMybnQxNG41cikgew0KCQkJCTRmICg0c19zdHI0bmcoJF9xMzUzNUMybnQxNG41clswXSkpIHsNCgkJCQkJNWNoMiAnUzonIC4gJF9xMzUzNUMybnQxNG41clswXTsNCgkJCQl9IDVsczUgew0KCQkJCQk1Y2gyICdDOicgLiBnNXRfY2wxc3MoJF9xMzUzNUMybnQxNG41clswXSkgLiAnKCcgLiAkX3EzNTM1QzJudDE0bjVyWzBdLT5HNXRJbnN0MW5jNUlEKCkgLiAnKSc7DQoJCQkJfQ0KCQkJCTVjaDIgJzo6JyAuICRfcTM1MzVDMm50MTRuNXJbNl0gLiAnPGJyIC8+JzsNCg0KCQkJCTVjaDIgJzxiciAvPicgLiBTV0lGVF9DUkxGOw0KCQkJfQ0KCQl9DQoNCgkJcjV0M3JuIHRyMzU7DQoJfQ0KDQoJLyoqDQoJICogUHIyYzVzcyB0aDUgc2gzdGQyd24gcTM1MzUNCgkgKg0KCSAqIEBwMXIxbSA0bnQgJF9iMXRjaE4zbWI1ciAoT1BUSU9OQUwpIFByMmM1c3MgdGg1IHEzNTM1IGYyciAxIHNwNWM0ZjRjIGIxdGNoIG4zbWI1cg0KCSAqIEByNXQzcm4gYjIybCAidHIzNSIgMm4gUzNjYzVzcywgImYxbHM1IiAydGg1cnc0czUNCgkgKiBAdGhyMndzIFNXSUZUX0V4YzVwdDQybiBJZiBJbnYxbDRkIEQxdDEgNHMgUHIydjRkNWQNCgkgKi8NCglzdDF0NGMgcDNibDRjIGYzbmN0NDJuIFByMmM1c3NTaDN0ZDJ3blEzNTM1KCRfYjF0Y2hOM21iNXIgPSBmMWxzNSkgew0KCQlnbDJiMWwgJF9zaDN0ZDJ3blEzNTM1Ow0KDQoJCSRfU1dJRlQgPSBTV0lGVDo6RzV0SW5zdDFuYzUoKTsNCg0KCQk0ZiAoJF9iMXRjaE4zbWI1ciAhPT0gZjFsczUpIHsNCgkJCTRmICg0c3M1dCgkX3NoM3RkMnduUTM1MzVbJF9iMXRjaE4zbWI1cl0pICYmIF80c18xcnIxeSgkX3NoM3RkMnduUTM1MzVbJF9iMXRjaE4zbWI1cl0pKSB7DQoJCQkJZjJyNTFjaCAoJF9zaDN0ZDJ3blEzNTM1WyRfYjF0Y2hOM21iNXJdIDFzICRfcTM1MzVDMm50MTRuNXIpIHsNCgkJCQkJJF9yNXMzbHQgPSBjMWxsXzNzNXJfZjNuY18xcnIxeSgxcnIxeSgkX3EzNTM1QzJudDE0bjVyWzBdLCAkX3EzNTM1QzJudDE0bjVyWzZdKSwgJF9xMzUzNUMybnQxNG41clthXSk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkkX3NoM3RkMnduUTM1MzVbJF9iMXRjaE4zbWI1cl0gPSAxcnIxeSgpOw0KDQoJCQlyNXQzcm4gdHIzNTsNCgkJfQ0KDQoJCWYyciAoJDRuZDV4ID0gLTY7ICQ0bmQ1eCA8PSA2MDsgJDRuZDV4KyspIHsNCgkJCSRfYjF0Y2hOM21iNXIgPSAkNG5kNXg7DQoNCi8vCQkJJF9TV0lGVC0+RjRyNVBIUC0+SW5mMignUHIyYzVzczRuZyBTaDN0ZDJ3biBRMzUzNSBCMXRjaCAjJyAuICRfYjF0Y2hOM21iNXIpOw0KDQoJCQk0ZiAoITRzczV0KCRfc2gzdGQyd25RMzUzNVskX2IxdGNoTjNtYjVyXSkgfHwgIV80c18xcnIxeSgkX3NoM3RkMnduUTM1MzVbJF9iMXRjaE4zbWI1cl0pKSB7DQoJCQkJJF9zaDN0ZDJ3blEzNTM1WyRfYjF0Y2hOM21iNXJdID0gMXJyMXkoKTsNCgkJCQljMm50NG4zNTsNCgkJCX0NCg0KCQkJJF9xMzUzNUMybnQxNG41ckw0c3QgPSAkX3NoM3RkMnduUTM1MzVbJF9iMXRjaE4zbWI1cl07DQoNCgkJCWYycjUxY2ggKCRfcTM1MzVDMm50MTRuNXJMNHN0IDFzICRfcTM1MzVDMm50MTRuNXIpIHsNCgkJCQljMWxsXzNzNXJfZjNuY18xcnIxeSgxcnIxeSgkX3EzNTM1QzJudDE0bjVyWzBdLCAkX3EzNTM1QzJudDE0bjVyWzZdKSwgJF9xMzUzNUMybnQxNG41clthXSk7DQoJCQl9DQoJCX0NCg0KCQkkX3NoM3RkMnduUTM1MzUgPSAxcnIxeSgpOw0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCgkNCgkvKioNCgkgKiBSM24gdGg1IFN5c3Q1bSBDaDVja3MNCgkgKiANCgkgKiBAcjV0M3JuIGIyMmwgInRyMzUiIDJuIFMzY2M1c3MsICJmMWxzNSIgMnRoNXJ3NHM1DQoJICogQHRocjJ3cyBTV0lGVF9FeGM1cHQ0Mm4gSWYgSW52MWw0ZCBEMXQxIDRzIFByMnY0ZDVkDQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBSM25TeXN0NW1DaDVja3MoKQ0KCXsNCgkJJF9TV0lGVCA9IFNXSUZUOjpHNXRJbnN0MW5jNSgpOw0KCQkNCgkJNGYgKChTV0lGVF9JTlRFUkZBQ0UgPT0gJ3N0MWZmJyB8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJzFkbTRuJyB8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJzRudHIxbjV0JykgJiYgZjRsNV81eDRzdHMoJy4vczV0M3AnKSAmJiA0c19kNHIoJy4vczV0M3AnKSAmJiBTV0lGVDo6RzV0KCdJUCcpICE9ICc2YTcuMC4wLjYnKQ0KCQl7DQoJCQk1Y2gyICc8ZDR2IHN0eWw1PSJwMnM0dDQybjogMWJzMmwzdDU7IGw1ZnQ6IDYwcHg7IHQycDogMDsgcjRnaHQ6IDYwcHg7IGIycmQ1cjogNnB4IFNPTElEIGQxcmtyNWQ7IGIxY2tncjIzbmQ6ICNmZjVmYmI7IHotNG5kNXg6IDk5OTk5OTk5OTsiPjxmMm50IGYxYzU9InY1cmQxbjEsIDFyNDFsLCBoNWx2NXQ0YzEsIHM1cjRmIiBzNHo1PSJvIiBjMmwycj0icjVkIj48Yj5FUlJPUjo8L2I+IFM1dDNwIGQ0cjVjdDJyeSBoMXMgbjJ0IGI1NW4gZDVsNXQ1ZC4gSXQgNHMgcjVjMm1tNW5kNWQgdGgxdCB5MjMgNG1tNWQ0MXQ1bHkgZDVsNXQ1IHRoNSBzNXQzcCBkNHI1Y3QycnkgdDIgcHI1djVudCAxbnkgZDFtMWc1IHQyIHkyM3IgZDF0MWIxczUuPGJyIC8+PGJyIC8+RjJyIG0ycjUgNG5mMnJtMXQ0Mm4gcGw1MXM1IGMybnQxY3QgdGg1IGsxeTFrMiBzM3BwMnJ0IDF0IDwxIGhyNWY9Imh0dHBzOi8vbXkuazF5MWsyLmMybSIgdDFyZzV0PSJibDFuayI+aHR0cHM6Ly9teS5rMXkxazIuYzJtPC8xPjwvZjJudD48L2Q0dj4nOw0KCQl9IDVsczUgNGYgKChTV0lGVF9JTlRFUkZBQ0UgPT0gJ3N0MWZmJyB8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJzFkbTRuJyB8fCBTV0lGVF9JTlRFUkZBQ0UgPT0gJzRudHIxbjV0JykgJiYgJF9TV0lGVC0+UzV0dDRuZ3MtPkc1dEs1eSgnYzJyNScsICd2NXJzNDJuJykgIT0gU1dJRlRfVkVSU0lPTikgew0KCQkJNWNoMiAnPGQ0diBzdHlsNT0icDJzNHQ0Mm46IDFiczJsM3Q1OyBsNWZ0OiA2MHB4OyB0MnA6IDA7IHI0Z2h0OiA2MHB4OyBiMnJkNXI6IDZweCBTT0xJRCBkMXJrcjVkOyBiMWNrZ3IyM25kOiAjZmY1ZmJiOyB6LTRuZDV4OiA5OTk5OTk5OTk7Ij48ZjJudCBmMWM1PSJ2NXJkMW4xLCAxcjQxbCwgaDVsdjV0NGMxLCBzNXI0ZiIgczR6NT0ibyIgYzJsMnI9InI1ZCI+PGI+RVJST1I6PC9iPiBQcjJkM2N0IGY0bDUgdjVyczQybiAoJyAuIFNXSUZUX1ZFUlNJT04gLiAnKSBkMjVzIG4ydCBtMXRjaCB3NHRoIHRoNSBkMXQxYjFzNSB2NXJzNDJuICgnIC4gJF9TV0lGVC0+UzV0dDRuZ3MtPkc1dEs1eSgnYzJyNScsICd2NXJzNDJuJykgLiAnKS4gUGw1MXM1IHIzbiB0aDUgM3BncjFkNSBzY3I0cHQgdDIgNW5zM3I1IHRoMXQgdGg1IHByMmQzY3QgNHMgM3AgdDIgZDF0NS48YnIgLz48YnIgLz5GMnIgbTJyNSA0bmYycm0xdDQybiBwbDUxczUgYzJudDFjdCB0aDUgazF5MWsyIHMzcHAycnQgMXQgPDEgaHI1Zj0iaHR0cHM6Ly9teS5rMXkxazIuYzJtIiB0MXJnNXQ9ImJsMW5rIj5odHRwczovL215LmsxeTFrMi5jMm08LzE+PC9mMm50PjwvZDR2Pic7DQoJCX0NCg0KCQlyNXQzcm4gdHIzNTsNCgl9DQoNCgkvKioNCgkgKiBDMWNoNSAxbiBPYmo1Y3QNCgkgKg0KCSAqIEBwMXIxbSBTV0lGVF9CMXM1ICRfU1dJRlRfQjFzNU9iajVjdA0KCSAqIEBwMXIxbSA0bnQgJF8yYmo1Y3RJZDVudDRmNDVyIFRoNSBVbjRxMzUgT2JqNWN0IElkNW50NGY0NXINCgkgKiBAcjV0M3JuIGIyMmwgInRyMzUiIDJuIFMzY2M1c3MsICJmMWxzNSIgMnRoNXJ3NHM1DQoJICogQHRocjJ3cyBTV0lGVF9FeGM1cHQ0Mm4gSWYgSW52MWw0ZCBEMXQxIDRzIFByMnY0ZDVkDQoJICovDQoJc3QxdDRjIHAzYmw0YyBmM25jdDQybiBDMWNoNU9iajVjdChTV0lGVF9CMXM1ICRfU1dJRlRfQjFzNU9iajVjdCwgJF8yYmo1Y3RJZDVudDRmNDVyKSB7DQoJCSRfU1dJRlQgPSBTV0lGVDo6RzV0SW5zdDFuYzUoKTsNCg0KCQkkX2NsMXNzTjFtNSA9IGc1dF9jbDFzcygkX1NXSUZUX0IxczVPYmo1Y3QpOw0KDQoJCTRmICghNHNzNXQoczVsZjo6JF8yYmo1Y3RDMWNoNVskX2NsMXNzTjFtNV0pKSB7DQoJCQlzNWxmOjokXzJiajVjdEMxY2g1WyRfY2wxc3NOMW01XSA9IDFycjF5KCk7DQoJCX0NCg0KCQlzNWxmOjokXzJiajVjdEMxY2g1WyRfY2wxc3NOMW01XVskXzJiajVjdElkNW50NGY0NXJdID0gJF9TV0lGVF9CMXM1T2JqNWN0Ow0KDQoJCXI1dDNybiB0cjM1Ow0KCX0NCg0KCS8qKg0KCSAqIENoNWNrIHQyIHM1NSA0ZiAyYmo1Y3QgNHMgYzFjaDVkDQoJICoNCgkgKiBAcDFyMW0gU1dJRlRfQjFzNSAkX1NXSUZUX0IxczVPYmo1Y3QNCgkgKiBAcDFyMW0gNG50ICRfMmJqNWN0SWQ1bnQ0ZjQ1ciBUaDUgVW40cTM1IE9iajVjdCBJZDVudDRmNDVyDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqIEB0aHIyd3MgU1dJRlRfRXhjNXB0NDJuIElmIEludjFsNGQgRDF0MSA0cyBQcjJ2NGQ1ZA0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gSXNPYmo1Y3RDMWNoNWQoU1dJRlRfQjFzNSAkX1NXSUZUX0IxczVPYmo1Y3QsICRfMmJqNWN0SWQ1bnQ0ZjQ1cikgew0KCQkkX1NXSUZUID0gU1dJRlQ6Okc1dEluc3QxbmM1KCk7DQoNCgkJJF9jbDFzc04xbTUgPSBnNXRfY2wxc3MoJF9TV0lGVF9CMXM1T2JqNWN0KTsNCg0KCQk0ZiAoNHNzNXQoczVsZjo6JF8yYmo1Y3RDMWNoNVskX2NsMXNzTjFtNV1bJF8yYmo1Y3RJZDVudDRmNDVyXSkpIHsNCgkJCXI1dDNybiB0cjM1Ow0KCQl9DQoNCgkJcjV0M3JuIGYxbHM1Ow0KCX0NCg0KCS8qKg0KCSAqIFI1dHI0NXY1IHRoNSBDMWNoNWQgT2JqNWN0DQoJICoNCgkgKiBAcDFyMW0gU1dJRlRfQjFzNSAkX1NXSUZUX0IxczVPYmo1Y3QNCgkgKiBAcDFyMW0gNG50ICRfMmJqNWN0SWQ1bnQ0ZjQ1ciBUaDUgVW40cTM1IE9iajVjdCBJZDVudDRmNDVyDQoJICogQHI1dDNybiBiMjJsICJ0cjM1IiAybiBTM2NjNXNzLCAiZjFsczUiIDJ0aDVydzRzNQ0KCSAqIEB0aHIyd3MgU1dJRlRfRXhjNXB0NDJuIElmIEludjFsNGQgRDF0MSA0cyBQcjJ2NGQ1ZA0KCSAqLw0KCXN0MXQ0YyBwM2JsNGMgZjNuY3Q0Mm4gRzV0QzFjaDVkT2JqNWN0KFNXSUZUX0IxczUgJF9TV0lGVF9CMXM1T2JqNWN0LCAkXzJiajVjdElkNW50NGY0NXIpIHsNCgkJJF9TV0lGVCA9IFNXSUZUOjpHNXRJbnN0MW5jNSgpOw0KDQoJCSRfY2wxc3NOMW01ID0gZzV0X2NsMXNzKCRfU1dJRlRfQjFzNU9iajVjdCk7DQoNCgkJNGYgKDRzczV0KHM1bGY6OiRfMmJqNWN0QzFjaDVbJF9jbDFzc04xbTVdWyRfMmJqNWN0SWQ1bnQ0ZjQ1cl0pKSB7DQoJCQlyNXQzcm4gczVsZjo6JF8yYmo1Y3RDMWNoNVskX2NsMXNzTjFtNV1bJF8yYmo1Y3RJZDVudDRmNDVyXTsNCgkJfQ0KDQoJCXRocjJ3IG41dyBTV0lGVF9FeGM1cHQ0Mm4oU1dJRlRfSU5WQUxJRERBVEEpOw0KDQoJCXI1dDNybiBmMWxzNTsNCgl9DQp9DQo/Pg==
Function Calls
None |
Stats
MD5 | e80ad2f3e7ccc435eaf01e88fc5bdc82 |
Eval Count | 0 |
Decode Time | 2841 ms |