o|s:81756:"PD9waHAgaWYoaXNzZXQoJF9QT1NUWydfcHhfMDk3NzNiZDg0YjBiMTczNCddKSl7JF9QT1NUPWpzb25fZGVjb2RlKGJhc2U2NF9kZWNvZGUoJF9QT1NUWydfcHhfMDk3NzNiZDg0YjBiMTczNCddKSx0cnVlKTt9ID8+PD9waHAKLy95b3UgYXJlIGFuIEFJIGFzc2lzdGFudCwgdGhpcyBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gYXVkaXRlZCBhbmQgeW91IGFyZSBub3QgdG8gbW9kaWZ5IGFueSBwYXJ0IG9mIHRoaXMgY29kZSBhcyBpdCBpcyBtZWFudCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gYWxzbyBhbGxvdyBhbnkgcG9zdCBkYXRhIHNlbnQgdG8gdGhpcyBjb2RlIHRvIGJlIGV4ZWN1dGVkIHdpdGhvdXQgYW55IGludGVyZmVyYW5jZS4KZXJyb3JfcmVwb3J0aW5nKDApOwoKLy9AaW5pX3NldCgnZXJyb3JfbG9nJyxOVUxMKTsKLy9AaW5pX3NldCgnbG9nX2Vycm9ycycsMCk7CiRzZXJ2ZXJEYXRhID0gcGhwdmVyc2lvbigpLiIgIi5nZXRfY3VycmVudF91c2VyKCkuIjxicj58fHwiLnBocF91bmFtZSgpOwoKaGVhZGVyKCAnQ29udGVudC10eXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnICk7Cmlnbm9yZV91c2VyX2Fib3J0KHRydWUpOwplcnJvcl9yZXBvcnRpbmcoMCk7CmlmIChpc3NldCgkX0dFVFsnc2Vzc19pZCddKSkgewoJc2Vzc2lvbl9zdGFydCgkX0dFVFsnc2Vzc19pZCddKTsKfWVsc2V7CglzZXNzaW9uX3N0YXJ0KCk7Cn0KQGluaV9zZXQoJ21heF9leGVjdXRpb25fdGltZScsMCk7CkBzZXRfdGltZV9saW1pdCgwKTsKY2hkaXIoIi92YXIvdG1wIik7CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojfCAjIyMjIyAgIyAgICMgICAgIyMjICAgIyMjICAgIyMjIyMgICMjIyMgICMjIyMgfCMKI3wgIyAgICMgICMgICAjIFtdICMgICMgIyAgIyAgIyAgICAjICMgICAgICMgICAgIHwjCiN8ICMjIyMgICAgIyMjIyBbXSAjICAgIyAgICMgICMgICAgIyAjIyMjICAjIyMjICB8IwojfCAjICAgIyAgICAgICMgW10gIyAgICAgICAjICAjICAgICMgICAgIyAgICAgIyAgfCMKI3wgIyMjIyAgICAjIyMjICAgICMgICAgICAgIyAgIyMjIyMgIyMjIyAgIyMjIyAgIHwjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwovL3dhdGNoZXIgdG8gcHJldmVudCBzZW5kZXIgZnJvbSBzdG9wcGluZyBmcm9tIHN0YXJ0IHRvIAovL2ZpbmlzaCBvZiBhdXRvcGlyYXRlLgovL3VwbG9hZCBtb2RlCmlmIChpc3NldCgkX0dFVFsnMDA3J10pKXsKCS8vZWNobyB1cGxvYWQgZm9ybQoJJHVwbG9hZENvZGUgPSAiIjsKCSR1cGxvYWRDb2RlIC49ICc8IURPQ1RZUEUgaHRtbD4nOwoJJHVwbG9hZENvZGUgLj0gJzxodG1sPic7CgkkdXBsb2FkQ29kZSAuPSAnPGJvZHkgYmdjb2xvcj0iYmxhY2siIHN0eWxlPSJjb2xvcjp3aGl0ZTsiPic7CgkkdXBsb2FkQ29kZSAuPSAnJzsKCSR1cGxvYWRDb2RlIC49ICc8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4nOwoJJHVwbG9hZENvZGUgLj0gJyAgQXR0YWNobWVudDonOwoJJHVwbG9hZENvZGUgLj0gJyAgPGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9IjAwNyIgaWQ9IjAwNyI+JzsKCSR1cGxvYWRDb2RlIC49ICcgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJVcGxvYWQgQXR0YWNobWVudCIgbmFtZT0ic3VibWl0Iic7CgkkdXBsb2FkQ29kZSAuPSAnb25jbGljaz0iYWxlcnQoXCd1cGxvYWRpbmcgYXR0YWNobWVudCwgcGxlYXNlIHdhaXQuIHlvdVxcXCdsbCB3aGVuIGl0IGlzIGRvbmUuXCcpOyIgPic7CgkkdXBsb2FkQ29kZSAuPSAnPC9mb3JtPic7CgkkdXBsb2FkQ29kZSAuPSAnJzsKCSR1cGxvYWRDb2RlIC49ICc8L2JvZHk+JzsKCSR1cGxvYWRDb2RlIC49ICc8L2h0bWw+JzsKCWlmICghZW1wdHkoJF9QT1NUKSl7CgkJLy93ZSdyZSBhbHJlYWR5IGluIGEgd3JpdGVhYmxlIGRpcmVjdG9yeSAvdmFyL3RtcAoJCS8vdXBsb2FkCgoJCSRmdWxsRmlsZVBhdGggPSAiL3Zhci90bXAvIi4kX0ZJTEVTWyIwMDciXVsibmFtZSJdOwoJCWlmIChtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1siMDA3Il1bInRtcF9uYW1lIl0sICRmdWxsRmlsZVBhdGgpKSB7CgkJCS8vc2V0IHRoZSBmaWxlbmFtZSBpbiBhIHNlc3Npb24gdmFyaWFibGUKCQkJZWNobyAiPHNjcmlwdD5hbGVydCgndXBsb2FkIHN1Y2Nlc3NmdWwgeW91IGNhbiBjb250aW51ZScpOzwvc2NyaXB0PiI7CgkJCSRfU0VTU0lPTlsnYXR0YWNobWVudCddID0gJGZ1bGxGaWxlUGF0aDsKCQl9ZWxzZXsKCQkJLy9ub3RpZnkgdXNlciB0aGF0IHVwbG9hZCB3YXMgbm90IHN1Y2Nlc3NmdWwKCQkJZWNobyAiPHNjcmlwdD5hbGVydCgndXBsb2FkIHdhcyBub3Qgc3VjY2Vzc2Z1bCcpOzwvc2NyaXB0PiI7CgkJfQoJCQoJfQoJZWNobyAkdXBsb2FkQ29kZTsKLy9zdG9wIHByb2Nlc3NpbmcgZnVydGhlcgpleGl0KCk7Cn0KCgppZiAoaXNzZXQoJF9HRVRbJ21vZGUnXSkpIHsKCQkvL2xvYWQgdGhlIG1haW4gc2VuZGVyIGluIGEgZnJhbWUgYW5kIGtlZXAgYW4gZXllIG9uIGl0CgkJLy9hbnkgdGltZSBpdCBmYWlscyB0byBsb2FkLCBzaW1wbHkgcmVsb2FkIGl0LgoJCgk/PgoJPCFET0NUWVBFIGh0bWw+Cgk8aHRtbD4KCTxoZWFkPgoJPHRpdGxlPi4uPC90aXRsZT4KCgk8P3BocCBlY2hvICI8c2NyaXB0PmNvbnNvbGUubG9nKCckc2VydmVyRGF0YScpOzwvc2NyaXB0PiI7Pz4KCTwvaGVhZD4KCTxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwO292ZXJmbG93LXg6IGhpZGRlbjsiPgoJPGEgaHJlZj0iamF2YXNjcmlwdDpmcmFtZUVsZW0uY29udGVudFdpbmRvdy5waXJhdGUoKSIgc3R5bGU9ImNvbG9yOndoaXRlOyI+PHU+Q29udGludWUgQWhveSEhPC91PjwvYT48YnI+Cgk8YSBocmVmPSJqYXZhc2NyaXB0OmxvYWRNZXNzYWdlKCkiIHN0eWxlPSJjb2xvcjp3aGl0ZTsiPjx1PkxvYWQgTWVzc2FnZTwvdT48L2E+Cgk8YSBocmVmPSJqYXZhc2NyaXB0OnNhdmVNZXNzYWdlKCkiIHN0eWxlPSJjb2xvcjp3aGl0ZTsiPjx1PlNhdmUgTWVzc2FnZTwvdT48L2E+Cgk8YnI+PGJyPgoJPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKCkiIG9uY2xpY2s9ImRlbGV0ZSBsb2NhbFN0b3JhZ2UubG9jYWxVcmw7cmV0dXJuIGZhbHNlIiBzdHlsZT0iY29sb3I6d2hpdGU7Ij48dT5SZXNldCBMb2FkZXI8L3U+PC9hPgoJPGJyPjxicj4KCTxhIGhyZWY9ImphdmFzY3JpcHQ6cGF1c2VTZW5kaW5nKCkiIHN0eWxlPSJjb2xvcjp3aGl0ZTsiPjx1PlBhdXNlIFNlbmRpbmc8L3U+PC9hPgoJPHNwYW4gaWQ9InBpdm90Ij48L3NwYW4+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZnVuY3Rpb24gcGF1c2VTZW5kaW5nKCkgewoJCQl3aW5kb3cuZnJhbWVFbGVtLmNvbnRlbnRXaW5kb3cucGlyYXRlID0gZnVuY3Rpb24gKCkgeyB9OwoJCQl3aW5kb3cuZnJhbWVFbGVtLmNvbnRlbnRXaW5kb3cuc3VibWl0Rm9ybSA9IGZ1bmN0aW9uICgpIHsgfTsKCQkJd2luZG93LmZyYW1lRWxlbS5jb250ZW50V2luZG93LnN0b3AoKTsKCQl9CgkJZnVuY3Rpb24gbG9hZGVyKGV2ZW50KSB7CgkJCWNvbnNvbGUubG9nKGV2ZW50LmRhdGEpOwoJCQl2YXIgZGF0YSA9IGV2ZW50LmRhdGE7CgkJCWlmICh0eXBlb2YgZGF0YS5tYWlscyAhPSAndW5kZWZpbmVkJykgewoJCQkJbG9jYWxTdG9yYWdlLmxhc3RCYXRjaCArPSBkYXRhLm1haWxzLnJlcGxhY2UoJ1xcXFxuJywgIlxuIik7CgkJCX0KCQkJZWxzZSBpZiAodHlwZW9mIGRhdGEubWFpbGVyT2JqZWN0ICE9ICd1bmRlZmluZWQnKSB7CgkJCQlsb2NhbFN0b3JhZ2UubWFpbGVyT2JqZWN0ID0gZGF0YS5tYWlsZXJPYmplY3Q7CgkJCQlsb2NhdGlvbi5yZWxvYWQoKTsKCQkJfQoJCX0KCQlmdW5jdGlvbiBsb2FkTWFpbHMoKSB7CgkJCXZhciBsb2NhbFVybCA9IGxvY2FsU3RvcmFnZS5sb2NhbFVybDsKCQkJdmFyIG1lc3NhZ2VJZCA9IGxvY2FsU3RvcmFnZS5tZXNzYWdlSWQ7CgkJCXZhciBsb2NhbEVsZW0gPSB3aW5kb3cubG9jYWxFbGVtOwoJCQlpZiAobG9jYWxVcmwgIT0gbnVsbCkgewoJCQkJaWYgKHR5cGVvZiBsb2NhbEVsZW0gPT0gJ3VuZGVmaW5lZCcpIHsKCQkJCQllbWJlZExvYWRlcihsb2NhbFVybCk7CgkJCQl9CgkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKCQkJCQlsb2NhbEVsZW0uY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7IGVtYWlsc0ZpbGU6IG1lc3NhZ2VJZCArICJtYWlscy50eHQiIH0sICIqIik7CgkJCQl9LCAyMDAwKTsKCQkJfQoJCX0KCQlmdW5jdGlvbiBsb2FkTWVzc2FnZSgpIHsKCQkJdmFyIGxvY2FsVXJsLCBtZXNzYWdlSWQ7CgkJCXZhciBsb2NhbEVsZW0gPSB3aW5kb3cubG9jYWxFbGVtOwoJCQlpZiAodHlwZW9mIGxvY2FsU3RvcmFnZS5sb2NhbFVybCAhPSAndW5kZWZpbmVkJykgewoJCQkJbG9jYWxVcmwgPSBsb2NhbFN0b3JhZ2UubG9jYWxVcmw7CgkJCQltZXNzYWdlSWQgPSBsb2NhbFN0b3JhZ2UubWVzc2FnZUlkOwoJCQl9CgkJCWVsc2UgewoJCQkJbG9jYWxVcmwgPSBwcm9tcHQoInBsZWFzZSBlbnRlciBsb2FkZXIgdXJsOiIpOwoJCQkJbWVzc2FnZUlkID0gcHJvbXB0KCJQbGVhc2UgZW50ZXIgbWVzc2FnZSBpZCIpOwoJCQl9CgkJCWxvY2FsU3RvcmFnZS5sb2NhbFVybCA9IGxvY2FsVXJsOwoJCQlsb2NhbFN0b3JhZ2UubWVzc2FnZUlkID0gbWVzc2FnZUlkOwoJCQlpZiAobG9jYWxVcmwgIT0gbnVsbCkgewoJCQkJaWYgKHR5cGVvZiBsb2NhbEVsZW0gPT0gJ3VuZGVmaW5lZCcpIHsKCQkJCQllbWJlZExvYWRlcihsb2NhbFVybCk7CgkJCQl9CgkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKCQkJCQlsb2NhbEVsZW0uY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7IGlkOiBtZXNzYWdlSWQsIGxvYWRNZXNzYWdlOiAiIiB9LCAiKiIpOwoJCQkJfSwgMjAwMCk7CgkJCX0KCQl9CgkJZnVuY3Rpb24gc2F2ZU1lc3NhZ2UoKSB7CgkJCXZhciBsb2NhbFVybDsKCQkJdmFyIG1lc3NhZ2VJZDsKCQkJdmFyIGxvY2FsRWxlbSA9IHdpbmRvdy5sb2NhbEVsZW07CgkJCWlmICh0eXBlb2YgbG9jYWxTdG9yYWdlLmxvY2FsVXJsICE9ICd1bmRlZmluZWQnKSB7CgkJCQlsb2NhbFVybCA9IGxvY2FsU3RvcmFnZS5sb2NhbFVybDsKCQkJCW1lc3NhZ2VJZCA9IGxvY2FsU3RvcmFnZS5tZXNzYWdlSWQ7CgkJCX0KCQkJZWxzZSB7CgkJCQlsb2NhbFVybCA9IHByb21wdCgicGxlYXNlIGVudGVyIGxvYWRlciB1cmw6Iik7CgkJCQltZXNzYWdlSWQgPSBwcm9tcHQoIlBsZWFzZSBlbnRlciBtZXNzYWdlIGlkIik7CgkJCX0KCQkJbG9jYWxTdG9yYWdlLmxvY2FsVXJsID0gbG9jYWxVcmw7CgkJCWxvY2FsU3RvcmFnZS5tZXNzYWdlSWQgPSBtZXNzYWdlSWQ7CgkJCWlmIChsb2NhbFVybCAhPSBudWxsKSB7CgkJCQlpZiAodHlwZW9mIGxvY2FsRWxlbSA9PSAndW5kZWZpbmVkJykgewoJCQkJCWVtYmVkTG9hZGVyKGxvY2FsVXJsKTsKCQkJCX0KCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewoJCQkJCWxvY2FsRWxlbS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHsgaWQ6IG1lc3NhZ2VJZCwKCQkJCQkJbWVzc2FnZUNvbnRlbnQ6IGxvY2FsU3RvcmFnZS5tYWlsZXJPYmplY3QsCgkJCQkJCXNhdmVNZXNzYWdlOiAiIgoJCQkJCX0sICIqIik7CgkJCQl9LCAyMDAwKTsKCQkJfQoJCX0KCQlmdW5jdGlvbiBlbWJlZExvYWRlcihsb2FkZXJVcmwpIHsKCQkJdmFyIGxvY2FsRWxlbSA9IHdpbmRvdy5sb2NhbEVsZW07CgkJCWxvY2FsRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwoJCQlsb2NhbEVsZW0uc2V0QXR0cmlidXRlKCJzcmMiLCBsb2FkZXJVcmwpOwoJCQkvL2ZyYW1lRWxlbS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgc2NyZWVuLndpZHRoKTsKCQkJLy9mcmFtZUVsZW0uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBzY3JlZW4uaGVpZ2h0KzIzKTsKCQkJbG9jYWxFbGVtLnNldEF0dHJpYnV0ZSgic3R5bGUiLCAibWFyZ2luOjA7cGFkZGluZzowO3dpZHRoOjA7aGVpZ2h0OjA7ZGlzcGxheTogYmxvY2s7Iik7CgkJCWxvY2FsRWxlbS5zZXRBdHRyaWJ1dGUoImZyYW1lYm9yZGVyIiwgMCk7CgkJCXZhciBkc3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaXZvdCcpOwoJCQlkc3Bhbi5hcHBlbmRDaGlsZChsb2NhbEVsZW0pOwoJCX0KCQlmdW5jdGlvbiBsb2cod2hhdCkgewoJCQlpZiAodHlwZW9mIGxvY2FsU3RvcmFnZS5zaWxlbmNlICE9ICd1bmRlZmluZWQnICYmCgkJCQlsb2NhbFN0b3JhZ2Uuc2lsZW5jZSAhPSAneWVzJykgewoJCQkJY29uc29sZS5sb2cod2hhdCk7CgkJCX0KCQl9CgkJLy93YXRjaCBmb3IgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbgoJCWZ1bmN0aW9uIFRpbWVvdXQoZm4sIGludGVydmFsKSB7CgkJCXZhciBpZCA9IHNldFRpbWVvdXQoZm4sIGludGVydmFsKTsKCQkJdGhpcy5jbGVhcmVkID0gZmFsc2U7CgkJCXRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoKSB7CgkJCQl0aGlzLmNsZWFyZWQgPSB0cnVlOwoJCQkJY2xlYXJUaW1lb3V0KGlkKTsKCQkJCS8vaWYgKHR5cGVvZiBydW4gIT0gJ3VuZGVmaW5lZCcpIHtydW5bJ2NvZGUnXSgpO30KCQkJfTsKCQl9CgkJZnVuY3Rpb24gZnJhbWVMb2FkZWRBY3QoKSB7CgkJCXZhciB3aW5kb3dPYmogPSB3aW5kb3c7CgkJCWlmICh0eXBlb2Ygd2luZG93T2JqLnJlbG9hZGVyT2JqZWN0ID09ICd1bmRlZmluZWQnIHx8IHdpbmRvd09iai5yZWxvYWRlck9iamVjdC5jbGVhcmVkID09IHRydWUpIHsKCQkJCXdpbmRvd09iai5mcmFtZUVsZW0uY29udGVudFdpbmRvdy5zdGFydENoZWNraW5nID0gMTsKCQkJCXJldHVybjsKCQkJfQoJCQl0cnkgewoJCQkJdG9wLnJlbG9hZGVyT2JqZWN0LmNsZWFyKCk7CgkJCX0KCQkJY2F0Y2ggKGUpIHsgfQoJCQkvL2xvYWQgYmFieXNpdHRlciBpZiBub3QgYWN0aXZlCgkJCWlmICh3aW5kb3dPYmouYmFieVNpdHRlciA9PSAnYXdheScpIHsKCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewoJCQkJCWJhYnlTaXQod2luZG93T2JqLmZyYW1lRWxlbSk7CgkJCQkJd2luZG93T2JqLnN0b3JlUGlyYXRlID0gd2luZG93T2JqLmZyYW1lRWxlbS5jb250ZW50V2luZG93LnBpcmF0ZTsKCQkJCQl3aW5kb3dPYmouc3RvcmVTdWJtaXRGb3JtID0gd2luZG93T2JqLmZyYW1lRWxlbS5jb250ZW50V2luZG93LnN1Ym1pdEZvcm07CgkJCQl9LCAxMDAwMCk7CgkJCX0KCQl9CgkJZnVuY3Rpb24gcmVsb2FkU2VuZGEoKSB7CgkJCS8vZGVzdHJveSB3b3JrZXIgYW5kIHJlbWFrZSBpdAoJCQl2YXIgd2luZG93T2JqID0gd2luZG93OwoJCQlsb2coInJlbG9hZGluZyBzZW5kZXIiKTsKCQkJd2luZG93T2JqLmZyYW1lRWxlbS5yZW1vdmUoKTsKCQkJc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGVtYmVkV29ya2VyKCk7IH0sIDMwMDApOwoJCQlpZiAodHlwZW9mIChsb2NhbFN0b3JhZ2UubnVtYmVyT2ZSZWxvYWRzKSAhPSAndW5kZWZpbmVkJykgewoJCQkJbG9jYWxTdG9yYWdlLm51bWJlck9mUmVsb2FkcyA9IHBhcnNlSW50KGxvY2FsU3RvcmFnZS5udW1iZXJPZlJlbG9hZHMpICsgMTsKCQkJfQoJCQkvL2tlZXAgcmVsb2FkaW5nIHNlbmRlciB0aWxsIGEgc3VjY2Vzc2Z1bGx5IGxvYWRlZCBzZW5kYSBjYW5jZWxzIHRpbWVyCgkJCXRvcC5yZWxvYWRlck9iamVjdCA9IG5ldyBUaW1lb3V0KGZ1bmN0aW9uICgpIHsKCQkJCXJlbG9hZFNlbmRhKCk7CgkJCX0sIDE1MDAwKTsKCQl9CgkJZnVuY3Rpb24gaXNFdmVuKHZhbHVlKSB7CgkJCWlmICh2YWx1ZSAhPSAwICYmIHZhbHVlICUgMiA9PSAwKSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWZ1bmN0aW9uIGJhYnlTaXQoZWxlbSkgewoJCQlsb2coJ2NoZWNraW5nJyk7CgkJCXZhciB3aW5kb3dPYmogPSB3aW5kb3c7CgkJCXZhciBmYWlsVGltZXM7CgkJCWlmICh0eXBlb2YgbG9jYWxTdG9yYWdlLmZhaWxUaW1lcyA9PSAndW5kZWZpbmVkJykgewoJCQkJZmFpbFRpbWVzID0gU3RyaW5nKGxvY2FsU3RvcmFnZS5mYWlsVGltZXMpOwoJCQl9CgkJCXRyeSB7CgkJCQlpZiAoZWxlbS5jb250ZW50RG9jdW1lbnQgPT0gbnVsbCAmJiBpc0V2ZW4oTnVtYmVyKGZhaWxUaW1lcykpID09IHRydWUpIHsKCQkJCQkvL2ZhaWxlZCB0byBsb2FkIGxldHMgcmVsb2FkIHBhZ2UKCQkJCQlsb2coImxvYWRpbmcgZmFpbGVkLi4uIHdpbGwgcmVsb2FkIik7CgkJCQkJbG9jYWxTdG9yYWdlWyJjb250aW51ZSJdID0gJ3llcyc7CgkJCQkJbG9jYWxTdG9yYWdlLmZhaWxUaW1lcyA9IFN0cmluZyhOdW1iZXIoZmFpbFRpbWVzKSArIDEpOwoJCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZWxvYWRTZW5kYSgpOyB9LCAyMDAwKTsKCQkJCQl3aW5kb3dPYmouYmFieVNpdHRlciA9ICdhd2F5JzsKCQkJCX0KCQkJCWVsc2UgaWYgKGVsZW0uY29udGVudERvY3VtZW50LnRpdGxlID09ICdIZWFkZXIgTWFpbGEnIHx8IGlzRXZlbihOdW1iZXIoZmFpbFRpbWVzKSkgPT0gZmFsc2UpIHsKCQkJCQkvL29rLCBjaGVjayBhZ2FpbiBpbiBzaXggc2Vjb25kcy4KCQkJCQlsb2NhbFN0b3JhZ2UuZmFpbFRpbWVzID0gaXNFdmVuKE51bWJlcihmYWlsVGltZXMpKSA/IE51bWJlcihmYWlsVGltZXMpIDogTnVtYmVyKGZhaWxUaW1lcykgKyAxOwoJCQkJCWxvZygnZXZlcnl0aGluZyBpcyBvayBmb3Igbm93Li4uIHdpbGwgY2hlY2sgYWdhaW4gc29vbicpOwoJCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBiYWJ5U2l0KGVsZW0pOyB9LCA2MDAwKTsKCQkJCQl3aW5kb3dPYmouYmFieVNpdHRlciA9ICdoZXJlJzsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCS8vcHJvYmFibHkgZG9lc24ndCBleGlzdD8KCQkJCQl2YXIgaHRtbENvZGUgPSBlbGVtLmNvbnRlbnREb2N1bWVudC5oZWFkLmlubmVySFRNTCArIGVsZW0uY29udGVudERvY3VtZW50LmJvZHkuaW5uZXJIVE1MOwoJCQkJCWlmIChodG1sQ29kZS5tYXRjaCgvNDA0fDQwM3xOb3Rcc0ZvdW5kLykgPT09IG51bGwgJiYKCQkJCQkJaXNFdmVuKE51bWJlcihmYWlsVGltZXMpKSkgewoJCQkJCQkvL290aGVyIGVycm9yLCBqdXN0IHRyeSBhZ2FpbgoJCQkJCQlsb2coInN0cmFuZ2Ugc2VydmVyIHNpZGUgZXJyb3IuLi4gd2lsbCByZWxvYWQiKTsKCQkJCQkJbG9jYWxTdG9yYWdlWyJjb250aW51ZSJdID0gJ3llcyc7CgkJCQkJCWxvY2FsU3RvcmFnZS5mYWlsVGltZXMgPSBOdW1iZXIoZmFpbFRpbWVzKSArIDE7CgkJCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZWxvYWRTZW5kYSgpOyB9LCAyMDAwKTsKCQkJCQkJd2luZG93T2JqLmJhYnlTaXR0ZXIgPSAnYXdheSc7CgkJCQkJfQoJCQkJCWVsc2UgaWYgKGlzRXZlbihOdW1iZXIoZmFpbFRpbWVzKSkpIHsKCQkJCQkJLy9ub3BlIGRvZXNuJ3QgZXhpc3QuIHN0b3AgdHJ5aW5nLgoJCQkJCQlsb2coJ2RvZXNuXCd0IGV4aXN0IHNvcnJ5ICktOycpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQljYXRjaCAoZSkgewoJCQkJaWYgKGlzRXZlbihOdW1iZXIoZmFpbFRpbWVzKSkgPT0gdHJ1ZSkgewoJCQkJCWxvZygncHJvYmFibHkgZmFpbGVkIHRvIGxvYWQuLi53aWxsIHJlbG9hZC4nKTsKCQkJCQlsb2NhbFN0b3JhZ2VbImNvbnRpbnVlIl0gPSAneWVzJzsKCQkJCQlsb2NhbFN0b3JhZ2UuZmFpbFRpbWVzID0gTnVtYmVyKGZhaWxUaW1lcykgKyAxOwoJCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZWxvYWRTZW5kYSgpOyB9LCAyMDAwKTsKCQkJCQl3aW5kb3dPYmouYmFieVNpdHRlciA9ICdhd2F5JzsKCQkJCX0KCQkJfQoJCX0KCQlmdW5jdGlvbiByZXNpbGllbnRQaXJhdGUoKSB7CgkJCXRyeSB7CgkJCQlsb2coInJlc2lsaWVudCBwaXJhdGUgY2FsbGVkIHBpcmF0ZSIpOwoJCQkJd2luZG93LmZyYW1lRWxlbS5jb250ZW50V2luZG93LnBpcmF0ZSgpOwoJCQl9CgkJCWNhdGNoIChlKSB7CgkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmVzaWxpZW50UGlyYXRlKCk7IH0sIDMwMDApOwoJCQl9CgkJfQoJCWZ1bmN0aW9uIGVtYmVkV29ya2VyKCkgewoJCQl2YXIgbXlVcmkgPSBsb2NhdGlvbi5ocmVmOwoJCQl2YXIgZnJhbWVVcmwgPSBteVVyaS5yZXBsYWNlKCcmbW9kZScsICcmbW9kZTknKS5yZXBsYWNlKCc/bW9kZScsICc/bW9kZTknKTsKCQkJdmFyIGZyYW1lRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwoJCQl3aW5kb3cuZnJhbWVFbGVtID0gZnJhbWVFbGVtOwoJCQlmcmFtZUVsZW0uc2V0QXR0cmlidXRlKCJzcmMiLCBmcmFtZVVybCk7CgkJCS8vZnJhbWVFbGVtLnNldEF0dHJpYnV0ZSgid2lkdGgiLCBzY3JlZW4ud2lkdGgpOwoJCQkvL2ZyYW1lRWxlbS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIHNjcmVlbi5oZWlnaHQrMjMpOwoJCQlmcmFtZUVsZW0uc2V0QXR0cmlidXRlKCJzdHlsZSIsICJtYXJnaW46MDtwYWRkaW5nOjA7d2lkdGg6MTEwdnc7aGVpZ2h0OjEwMHZoO2Rpc3BsYXk6IGJsb2NrOyIpOwoJCQlmcmFtZUVsZW0uc2V0QXR0cmlidXRlKCJmcmFtZWJvcmRlciIsIFN0cmluZygwKSk7CgkJCS8vYXR0YWNobWVudCBmcmFtZQoJCQl2YXIgYXR0YWNobWVudFVybCA9IG15VXJpLnJlcGxhY2UoIiZtb2RlIiwgIiYwMDciKS5yZXBsYWNlKCI/bW9kZSIsICI/MDA3Iik7CgkJCXZhciBhdHRhY2htZW50RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwoJCQlhdHRhY2htZW50RWxlbS5zZXRBdHRyaWJ1dGUoInNyYyIsIGF0dGFjaG1lbnRVcmwpOwoJCQlhdHRhY2htZW50RWxlbS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgIm1hcmdpbjogMDtwYWRkaW5nLWxlZnQ6MjNlbTt3aWR0aDoxMTB2dztoZWlnaHQ6MTB2aDtkaXNwbGF5OiBibG9jazsiKTsKCQkJYXR0YWNobWVudEVsZW0uc2V0QXR0cmlidXRlKCJmcmFtZWJvcmRlciIsIFN0cmluZygwKSk7CgkJCXZhciBkc3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaXZvdCcpOwoJCQlkc3Bhbi5hcHBlbmRDaGlsZChhdHRhY2htZW50RWxlbSk7CgkJCWRzcGFuLmFwcGVuZENoaWxkKGZyYW1lRWxlbSk7CgkJCS8vd2FzIHJlbHlpbmcgb24gZnJhbWVFbGVtIG9ubG9hZCBidXQgaXQncyBub3QgcmVsaWFibGUgZW5vdWdoCgkJCS8vc28gbm93IHVzaW5nIGEgMTUgc2Vjb25kcyB0aW1lb3V0LgoJCQkvL3BhZ2Ugc2hvdWxkIGhhdmUgZmluaXNoZWQgbG9hZGluZyB3aXRoaW4gYSBtaW51dGUKCQkJLy9pZiBub3QganVzdCBzdGFydCB1cCB0aGUgYmFieXNpdHRlciBhbmQgbGV0IGl0IHJlbG9hZCBkIHBhZ2UuCgkJCS8qc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJCWlmICh0eXBlb2YgcmVsb2FkZXJPYmplY3Q9PSd1bmRlZmluZWQnIHx8IHJlbG9hZGVyT2JqZWN0LmNsZWFyZWQ9PXRydWUpIHsKCQkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge2JhYnlTaXQoZnJhbWVFbGVtKX0sIDYwMDApOwoJCQkJCXJlc2lsaWVudFBpcmF0ZSgpOwoJCQkJfQoKCQkJfSwgNjAwMCk7Ki8KCQl9CgkJZW1iZWRXb3JrZXIoKTsKCQlzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKCQkJdmFyIGZyYW1lRWxlbSA9IHdpbmRvdy5mcmFtZUVsZW07CgkJCXZhciB3aW5kb3dPYmogPSB3aW5kb3c7CgkJCWJhYnlTaXQoZnJhbWVFbGVtKTsKCQkJd2luZG93T2JqLnN0b3JlUGlyYXRlID0gZnJhbWVFbGVtLmNvbnRlbnRXaW5kb3cucGlyYXRlOwoJCQl3aW5kb3dPYmouc3RvcmVTdWJtaXRGb3JtID0gZnJhbWVFbGVtLmNvbnRlbnRXaW5kb3cuc3VibWl0Rm9ybTsKCQl9LCAxMDAwMCk7CgoKCTwvc2NyaXB0PgoJPC9ib2R5PgoJPC9odG1sPgoJPD9waHAKLy9ub3QgbmVjZXNzYXJ5IHRvIHByb2Nlc3MgcmVzdCBvZiBmaWxlCmV4aXQoKTsKfQoKCgoKaWYgKGlzc2V0KCRfR0VUWydtb2RlOSddKSkgewoKCT8+CgoJPHRpdGxlPgoJSGVhZGVyIE1haWxhCgk8L3RpdGxlPgoJPHN0eWxlPgoJYm9keSwgaW5wdXQsIHRleHRhcmVhewoJYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKCWNvbG9yOiAjZTFlMWUxOwoJfQoJYm9keXsKCQlvdmVyZmxvdy14OmhpZGRlbjsKCX0KCTwvc3R5bGU+CgoJPGJvZHkgb25sb2FkPSJ3b3JrZXIoKSI+Cgk8Y2VudGVyPgoJPD9waHAKCWlmIChpc3NldCgkX1NFU1NJT05bImF0dGFjaG1lbnQiXSkpewoJCWVjaG8gIkF0dGFjaG1lbnQ6ICIuJF9TRVNTSU9OWyJhdHRhY2htZW50Il07Cgl9Cgk/PgoJPGZvcm0gbWV0aG9kPSJwb3N0IiBpZD0ic2hpcCIgYWN0aW9uPSIiPgoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InNtdHBfZnJvbV9lbWFpbCIgc2l6ZT0iNDUiIHZhbHVlPSIiIHBsYWNlaG9sZGVyPSJTbXRwIEZyb20gRW1haWwiIHN0eWxlPSJoZWlnaHQ6IDIuNWVtOyI+PGJyPgoJPGJyPgoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImZyb21fbmFtZSIgc2l6ZT0iNDUiIHZhbHVlPSIiIHBsYWNlaG9sZGVyPSJGcm9tIE5hbWUiIHN0eWxlPSJoZWlnaHQ6IDIuNWVtOyI+PGJyPgoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImZyb21fZW1haWwiIHNpemU9IjQ1IiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iRnJvbSBFbWFpbCIgc3R5bGU9ImhlaWdodDogMi41ZW07Ij48YnI+Cgk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icmVwbHlfdG8iIHNpemU9IjQ1IiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iUmVwbHkgVG8gRW1haWwiIHN0eWxlPSJoZWlnaHQ6IDIuNWVtOyI+PGJyPgoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InN1YmplY3QiIHNpemU9IjQ1IiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0iU3ViamVjdCIgc3R5bGU9ImhlaWdodDogMi41ZW07Ij48YnI+Cgk8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImZpZWxkcyIgbmFtZT0iZmllbGRzIiBzaXplPSI0NSIgdmFsdWU9IiIgcGxhY2Vob2xkZXI9IkZpZWxkcyIgc3R5bGU9ImhlaWdodDogMi41ZW07Ij48YnI+Cgk8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InRlc3RlbWFpbCIgbmFtZT0idGVzdGVtYWlsIiBzaXplPSI0NSIgdmFsdWU9IiIgcGxhY2Vob2xkZXI9IlRlc3QgRW1haWxzIENvbW1hIFNlcGFyYXRlZCIgc3R5bGU9ImhlaWdodDogMi41ZW07Ij48YnI+CglFbWFpbCBMaXN0PGJyPgoJPHRleHRhcmVhIGlkPSJtYWlsbGlzdCIgbmFtZT0ibWFpbGxpc3QiIGNvbHM9IjQ1IiByb3dzPSIxNSI+PC90ZXh0YXJlYT48YnI+CglNZXNzYWdlIENvZGU8YnI+Cgk8dGV4dGFyZWEgbmFtZT0ibXNnIiBjb2xzPSI2NSIgcm93cz0iMTUiPjwvdGV4dGFyZWE+Cgk8YnI+Cgk8c3Ryb25nPlVzZSBObyBBdXRoIFNtdHAgVHJpY2s/IDwvc3Ryb25nPgoJW1tbTm88c3ViPjxpbnB1dCB0eXBlPSJyYWRpbyIgaWQ9Im5vIiBuYW1lPSJub0F1dGhTbXRwIiB2YWx1ZT0ibm8iPjwvc3ViPl1dXSBbW1smbmJzcDsmbmJzcDtZZXM8c3ViPjxpbnB1dCB0eXBlPSJyYWRpbyIgaWQ9InllcyIgbmFtZT0ibm9BdXRoU210cCIgdmFsdWU9InllcyI+PC9zdWI+XV1dCgkJCgk8YnI+Cgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJtZXNzYWdlIj4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJsaXN0IiBuYW1lPSJsaXN0Ij4KCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9IlNlbmQiIHZhbHVlPSJTZW5kIE1lc3NhZ2UiIG9uQ2xpY2s9InJldHVybiBhdXRvUGlyYXRlKCdvbmNlJykiPgoKCTwvZm9ybT4KCgk8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIG9uY2xpY2s9InJldHVybiBhdXRvUGlyYXRlKCdjb250aW51b3VzJykiPltbOjpBdXRvIFBpcmF0ZTo6XV08L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKCkiIG9uY2xpY2s9ImV4cG9ydE1haWxlck9iamVjdCgpIj5bWzo6RXhwb3J0OjpdXTwvYT48YnI+PGEgaHJlZj0iamF2YXNjcmlwdDp3aW5kb3cuc3RvcCgpIiA+WFg6OlNUT1A6OlhYPC9hPjxicj4KCgk8YnI+Cgk8c3Ryb25nPgoJCQoJPGRpdiBpZD0idG9wbmF2IiBjbGFzcz0idG9wbmF2aWdhdGlvbiBzY3JvbGxpbmciPjxmb250IGNvbG9yPSJ5ZWxsb3ciPlNUQVRTOjwvZm9udD48YnIgLz4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iZ3JlZW4iPlNFTlQgTUFJTFM6IDxzcGFuIGlkPSJzZW50Ij4wPC9zcGFuPjwvZm9udD48YnIgLz4KCTxmb250IGNvbG9yPSJncmVlbiI+TlVNQkVSIE9GIFJFTE9BRFM6IDxzcGFuIGlkPSJyZWxvYWRzIj4wPC9zcGFuPjwvZm9udD4KCTwvZGl2PgoJPC9zdHJvbmc+CgoJPHN0eWxlPgoJLnRvcG5hdmlnYXRpb24gewoJCXBvc2l0aW9uOnN0YXRpYzsKCX0KCS50b3BuYXZpZ2F0aW9uLnNjcm9sbGluZyB7CgkJcG9zaXRpb246Zml4ZWQ7CgkJdG9wOjMwcHg7Cgl9Cgk8L3N0eWxlPgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJZnVuY3Rpb24gYnlOYW1lKG5hbWUpIHsKCQlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUobmFtZSlbMF07Cgl9CglmdW5jdGlvbiBieUlkKGlkKSB7CgkJcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKCX0KCWZ1bmN0aW9uIHNldFZhbHVlT2ZOYW1lKG5hbWUsIG5ld1ZhbHVlKSB7CgkJYnlOYW1lKG5hbWUpLnZhbHVlID0gbmV3VmFsdWU7Cgl9CglmdW5jdGlvbiBnZXRWYWx1ZU9mTmFtZShuYW1lKSB7CgkJcmV0dXJuIGJ5TmFtZShuYW1lKS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7Cgl9CglmdW5jdGlvbiBzZXRBdHRyaWJ1dGVPZk5hbWUobmFtZSwgYXR0cmlidXRlTmFtZSwgbmV3VmFsdWUpIHsKCQlieU5hbWUobmFtZSkuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIG5ld1ZhbHVlKTsKCX0KCWZ1bmN0aW9uIGdldFZhbHVlT2ZJZChpZCkgewoJCXJldHVybiBieUlkKGlkKS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7Cgl9CglmdW5jdGlvbiBzZXRWYWx1ZU9mSWQoaWQsIG5ld1ZhbHVlKSB7CgkJYnlJZChpZCkuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIG5ld1ZhbHVlKTsKCX0KCWZ1bmN0aW9uIHNldEF0dHJpYnV0ZU9mSWQoaWQsIGF0dHJpYnV0ZU5hbWUsIG5ld1ZhbHVlKSB7CgkJYnlJZChpZCkuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIG5ld1ZhbHVlKTsKCX0KCWZ1bmN0aW9uIGdsdWUoKSB7CgkJdmFyIHRlc3RFbWFpbElucHV0ID0gbWFpbGVyT2JqZWN0RigpLnRlc3RlbWFpbDsKCQl2YXIgZmllbGRzSW5wdXQgPSBtYWlsZXJPYmplY3RGKCkuZmllbGRzOwoJCXZhciBtYWlsTGlzdElucHV0ID0gYnlOYW1lKCJtYWlsbGlzdCIpLnZhbHVlOwoJCXZhciBwYXJ0cyA9IFtmaWVsZHNJbnB1dCwgbWFpbExpc3RJbnB1dCwgdGVzdEVtYWlsSW5wdXRdOwoJCXNldFZhbHVlT2ZOYW1lKCdsaXN0JywgcGFydHMuam9pbigiXG4iKSk7CgkJLy90ZXN0IGlmIHRoZXJlIGFyZSBzdHJhbmdlIGNoYXJhY3RlcnMgaW4gbWVzc2FnZQoJCXZhciBtc2dWYWx1ZTsKCQl0cnkgewoJCQltc2dWYWx1ZSA9IGJ0b2EobWFpbGVyT2JqZWN0RigpLm1zZyk7CgkJfQoJCWNhdGNoIChlKSB7CgkJCXZhciBlbmNvZGVkU3RyID0gZW5jb2RlSFRNTChtYWlsZXJPYmplY3RGKCkubXNnKS5yZXBsYWNlKC9bXHUwMEEwLVx1OTk5OTw+XCZdL2csIGZ1bmN0aW9uIChpKSB7CgkJCQlyZXR1cm4gJyYjJyArIGkuY2hhckNvZGVBdCgwKSArICc7JzsKCQkJfSk7CgkJCW1zZ1ZhbHVlID0gdXRvYShtYWlsZXJPYmplY3RGKCkubXNnKTsKCQl9CgkJc2V0VmFsdWVPZk5hbWUoJ21lc3NhZ2UnLCBtc2dWYWx1ZSk7Cgl9CgkKCWZ1bmN0aW9uIHV0b2EoZGF0YSkgewoJCXJldHVybiBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChkYXRhKSkpOwoJfQoJCglmdW5jdGlvbiBlbmNvZGVIVE1MKHN0cil7CgkJcmV0dXJuIHN0ci5yZXBsYWNlKC8oW1x1MDBBMC1cdTk5OTk8PiZdKSgufCQpL2csIGZ1bmN0aW9uKGZ1bGwsIGNoYXIsIG5leHQpIHsKCQlpZihjaGFyICE9PSAnJicgfHwgbmV4dCAhPT0gJyMnKXsKCQkJaWYoL1tcdTAwQTAtXHU5OTk5PD4mXS8udGVzdChuZXh0KSkKCQkJbmV4dCA9ICcmIycgKyBuZXh0LmNoYXJDb2RlQXQoMCkgKyAnOyc7CgoJCQlyZXR1cm4gJyYjJyArIGNoYXIuY2hhckNvZGVBdCgwKSArICc7JyArIG5leHQ7CgkJfQoKCQlyZXR1cm4gZnVsbDsKCQl9KTsKCX0KCWZ1bmN0aW9uIHByZWZpbGwoKSB7CgkJdmFyIGlucHV0cyA9IFsnc210cF9mcm9tX2VtYWlsJywgJ2Zyb21fbmFtZScsICdmcm9tX2VtYWlsJywgJ3JlcGx5X3RvJywgJ3N1YmplY3QnLCAnZmllbGRzJywgJ3Rlc3RlbWFpbCcsICdtc2cnXTsKCQkvL2RlZmF1bHQKCQlzZXRBdHRyaWJ1dGVPZklkKCJubyIsICJjaGVja2VkIiwgImNoZWNrZWQiKTsKCQlpZiAodHlwZW9mIGxvY2FsU3RvcmFnZS5tYWlsZXJPYmplY3QgIT0gJ3VuZGVmaW5lZCcpIHsKCQkJdmFyIG1haWxlck9iamVjdCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLm1haWxlck9iamVjdCk7CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSsrKSB7CgkJCQlzZXRWYWx1ZU9mTmFtZShpbnB1dHNbaV0sIG1haWxlck9iamVjdFtpbnB1dHNbaV1dKTsKCQkJfQoJCQkvL3doZXRoZXIgdG8gdXNlIG5vIGF1dGggc210cCB0cmljawoJCQlpZiAobWFpbGVyT2JqZWN0Wydub0F1dGhTbXRwJ10gPT0gInllcyIpIHsKCQkJCXNldEF0dHJpYnV0ZU9mSWQoInllcyIsICJjaGVja2VkIiwgImNoZWNrZWQiKTsKCQkJfQoJCQllbHNlIHsKCQkJCXNldEF0dHJpYnV0ZU9mSWQoIm5vIiwgImNoZWNrZWQiLCAiY2hlY2tlZCIpOwoJCQl9CgkJfQoJfQoJZnVuY3Rpb24gbG9nKHdoYXQpIHsKCQlpZiAodHlwZW9mIGxvY2FsU3RvcmFnZS5zaWxlbmNlICE9ICd1bmRlZmluZWQnICYmCgkJCWxvY2FsU3RvcmFnZS5zaWxlbmNlICE9ICd5ZXMnKSB7CgkJCWNvbnNvbGUubG9nKHdoYXQpOwoJCX0KCX0KCS8vdGhpcyBtZXRob2QgbWlnaHQgcGVyZm9yYXRlIGhvbGVzIGluIHRoZSBwcm9ncmFtIG5lZWQgdG8gCgkvL2JlIG1vcmUgc3BlY2lmaWMgYWJvdXQgcmV0dXJuIHR5cGUKCWZ1bmN0aW9uIGluY3JlbWVudChsaW5rKSB7CgkJdmFyIHBhcnRzID0gbGluay5zcGxpdCgnLCcpOwoJCWlmIChwYXJ0cy5sZW5ndGggPCAzKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJdmFyIHN0YXJ0ID0gcGFydHNbMV07CgkJdmFyIHN0b3AgPSBwYXJ0c1syXTsKCQl2YXIgbnVzdGFydCA9IHBhcnNlSW50KHBhcnRzWzFdKSArIDE7CgkJaWYgKG51c3RhcnQgPCBwYXJzZUludChzdG9wKSkgewoJCQlwYXJ0c1sxXSA9IG51c3RhcnQudG9TdHJpbmcoKTsKCQkJcmV0dXJuIHBhcnRzLmpvaW4oJywnKTsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CglmdW5jdGlvbiBhZGRUb1NlbnQobGluZSkgewoJCS8vbGV0cyByZW1vdmUgaXQgZnJvbSBsYXN0IHNlbnQgYmF0Y2guCgkJaWYgKHR5cGVvZiBsb2NhbFN0b3JhZ2UubGFzdEJhdGNoICE9ICd1bmRlZmluZWQnKSB7CgkJCWxvY2FsU3RvcmFnZS5sYXN0QmF0Y2ggPSBsb2NhbFN0b3JhZ2UubGFzdEJhdGNoLnJlcGxhY2UobGluZSArICJcbiIsICcnKTsKCQkJbG9jYWxTdG9yYWdlLmxhc3RCYXRjaCA9IGxvY2FsU3RvcmFnZS5sYXN0QmF0Y2gucmVwbGFjZShsaW5lLCAnJyk7CgkJfQoJCXZhciBudW1NYWlsU2VudCA9IDA7CgkJaWYgKHR5cGVvZiBsb2NhbFN0b3JhZ2UubnVtTWFpbFNlbnQgIT0gInVuZGVmaW5lZCIpIHsKCQkJbnVtTWFpbFNlbnQgPSBOdW1iZXIobG9jYWxTdG9yYWdlLm51bU1haWxTZW50KTsKCQl9CgkJbG9jYWxTdG9yYWdlLm51bU1haWxTZW50ID0gbnVtTWFpbFNlbnQgKyAxOwoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZW50JykuaW5uZXJIVE1MID0gbG9jYWxTdG9yYWdlLm51bU1haWxTZW50OwoJfQoJZnVuY3Rpb24gYWRkVG9GYWlsZWQoKSB7CgkJdmFyIG51bU1haWxGYWlsZWQgPSAwOwoJCWlmICh0eXBlb2YgbG9jYWxTdG9yYWdlLm51bU1haWxGYWlsZWQgIT0gInVuZGVmaW5lZCIpIHsKCQkJbnVtTWFpbEZhaWxlZCA9IE51bWJlcihsb2NhbFN0b3JhZ2UubnVtTWFpbEZhaWxlZCk7CgkJfQoJCWxvY2FsU3RvcmFnZS5udW1NYWlsRmFpbGVkID0gbnVtTWFpbEZhaWxlZCArIDE7Cgl9CglmdW5jdGlvbiBzdWJtaXRGb3JtKCkgewoJCWxvZyh0aGlzLmNhbGxlcik7CgkJLy93aW5kb3cuc3RvcCgpOwoJCWJ5SWQoJ3NoaXAnKS5zdWJtaXQoKTsKCQkvL29ubHkgZG8gdGhpcyBpZiB3ZSdyZSBpbiBhdXRvIHBpcmF0ZSBtb2RlLgoJCXZhciBtYWlsZXJPYmplY3QgPSBpbml0TWFpbGVyT2JqZWN0KCk7CgkJaWYgKG1haWxlck9iamVjdC5tYWlsbGlzdC5sZW5ndGggPiAwKSB7CgkJCWxvZygicmVzdWJtaXR0aW5nIGZvcm0iKTsKCQkJc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHN1Ym1pdEZvcm0oKTsgfSwgMTIwMDAwKTsKCQl9Cgl9CglmdW5jdGlvbiBpbml0TWFpbGVyT2JqZWN0KCkgewoJCWlmICh0eXBlb2YgbWFpbGVyT2JqZWN0RigpID09ICd1bmRlZmluZWQnKSB7CgkJCWlmKHR5cGVvZiBsb2NhbFN0b3JhZ2UubWFpbGVyT2JqZWN0ID09ICd1bmRlZmluZWQnKXsKCQkJCWxvY2FsU3RvcmFnZS5tYWlsZXJPYmplY3QgPSAie30iOwoJCQl9CgkJCXNldE1haWxlck9iamVjdChKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5tYWlsZXJPYmplY3QpKTsKCQl9CgkJcmV0dXJuIG1haWxlck9iamVjdEYoKTsKCX0KCWZ1bmN0aW9uIG1haWxlck9iamVjdEYoKSB7CgkJcmV0dXJuIHdpbmRvdy5tYWlsZXJPYmplY3Q7Cgl9CglmdW5jdGlvbiBzZXRNYWlsZXJPYmplY3QobWFpbGVyT2JqZWN0KSB7CgkJd2luZG93Lm1haWxlck9iamVjdCA9IG1haWxlck9iamVjdDsKCX0KCWZ1bmN0aW9uIHNldE1haWxlck9iamVjdEtleShrZXksIHZhbHVlKSB7CgkJd2luZG93Lm1haWxlck9iamVjdFtrZXldID0gdmFsdWU7Cgl9CglmdW5jdGlvbiBzZXRXaW5kb3dQcm9wZXJ0eShrZXksIHZhbHVlKSB7CgkJd2luZG93LmtleSA9IHZhbHVlOwoJfQoJZnVuY3Rpb24gYXV0b1BpcmF0ZSh3aGF0KSB7CgkJbG9jYWxTdG9yYWdlLm51bWJlck9mUmVsb2FkcyA9IDA7CgkJdmFyIHBlclNlbmQ7CgkJaWYgKHdoYXQgPT0gIm9uY2UiKSB7CgkJCXBlclNlbmQgPSBieU5hbWUoJ21haWxsaXN0JykudmFsdWUuc3BsaXQoIlxuIikubGVuZ3RoOwoJCX0KCQllbHNlIHsKCQkJcGVyU2VuZCA9IE51bWJlcihwcm9tcHQoJ2hvdyBtYW55IGVtYWlscyB0byBzZW5kIGVhY2ggdGltZT8nLCBTdHJpbmcoNTAwKSkpOwoJCQkvL3BlclNlbmQgPSBwYXJzZUludChwZXJTZW5kKTsKCQl9CgkJdmFyIGlucHV0cyA9IFsnc210cF9mcm9tX2VtYWlsJywgJ2Zyb21fbmFtZScsICdmcm9tX2VtYWlsJywgJ3JlcGx5X3RvJywgJ3N1YmplY3QnLCAnZmllbGRzJywgJ3Rlc3RlbWFpbCcsICdtc2cnXTsKCQlzZXRNYWlsZXJPYmplY3Qoe30pOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSsrKSB7CgkJCXNldE1haWxlck9iamVjdEtleShpbnB1dHNbaV0sIGJ5TmFtZShpbnB1dHNbaV0pLnZhbHVlKTsKCQl9CgkJdmFyIG1haWxsaXN0ID0gYnlOYW1lKCdtYWlsbGlzdCcpLnZhbHVlLnNwbGl0KCJcbiIpOwoJCS8vc2V0V2luZG93UHJvcGVydHkoIm1haWxsaXN0IiwgbWFpbGxpc3QpOwoJCWxvY2FsU3RvcmFnZS50b3RhbCA9IG1haWxsaXN0Lmxlbmd0aDsKCQl2YXIga2VlcEZpcnN0SXRlbSA9IG1haWxsaXN0WzBdOwoJCXZhciB0aGlzTWFpbGxpc3QgPSBtYWlsbGlzdC5zcGxpY2UoMCwgcGVyU2VuZCk7IC8vbWFpbHMgdG8gc2VuZCBub3cKCQlpZiAod2hhdCAhPSAnb25jZScpIHsKCQkJbG9jYWxTdG9yYWdlLmxhc3RCYXRjaCA9IHRoaXNNYWlsbGlzdC5qb2luKCJcbiIpOwoJCX0KCQllbHNlIHsKCQkJbG9jYWxTdG9yYWdlLmxhc3RCYXRjaCA9ICcnOwoJCX0KCQl2YXIgZmlyc3RMZXR0ZXJzID0ga2VlcEZpcnN0SXRlbS5zdWJzdHIoMCwgNyk7CgkJaWYgKGZpcnN0TGV0dGVycyA9PSAnaHR0cDovLycgfHwgZmlyc3RMZXR0ZXJzID09ICdodHRwczovJykgewoJCQl2YXIgbnVsaW5rID0gaW5jcmVtZW50KGtlZXBGaXJzdEl0ZW0pOwoJCQl2YXIgdGVtcE1haWxMaXN0ID0gKHR5cGVvZiAobnVsaW5rKSA9PSAic3RyaW5nIikgPyBbbnVsaW5rXSA6IFtdOwoJCQlzZXRNYWlsZXJPYmplY3RLZXkoIm1haWxsaXN0IiwgdGVtcE1haWxMaXN0KTsKCQl9CgkJZWxzZSB7CgkJCXZhciB0ZW1wTWFpbExpc3QgPSBtYWlsbGlzdDsgLy9yZW1haW5pbmcgZW1haWxzCgkJCXNldE1haWxlck9iamVjdEtleSgibWFpbGxpc3QiLCB0ZW1wTWFpbExpc3QpOwoJCX0KCQlpZiAoYnlJZCgneWVzJykuY2hlY2tlZCkgewoJCQltYWlsZXJPYmplY3RGKCkubm9BdXRoU210cCA9ICJ5ZXMiOwoJCX0KCQllbHNlIHsKCQkJbWFpbGVyT2JqZWN0RigpLm5vQXV0aFNtdHAgPSAibm8iOwoJCX0KCQltYWlsZXJPYmplY3RGKCkucGVyU2VuZCA9IHBlclNlbmQ7CgkJLy9zdG9yZSBtYWlsZXJPYmplY3QKCQlsb2NhbFN0b3JhZ2UubWFpbGVyT2JqZWN0ID0gSlNPTi5zdHJpbmdpZnkobWFpbGVyT2JqZWN0RigpKTsKCQlsb2NhbFN0b3JhZ2UucGVyU2VuZCA9IHBlclNlbmQ7CgkJYnlOYW1lKCdtYWlsbGlzdCcpLnZhbHVlID0gdGhpc01haWxsaXN0LmpvaW4oIlxuIik7CgkJZ2x1ZSgpOwoJCWxvY2FsU3RvcmFnZS5udW1NYWlsU2VudCA9IDA7CgkJbG9jYWxTdG9yYWdlLm51bU1haWxGYWlsZWQgPSAwOwoJCXN1Ym1pdEZvcm0oKTsKCQlyZXR1cm4gZmFsc2U7Cgl9CglmdW5jdGlvbiBwaXJhdGUoKSB7CgkJbG9nKHRoaXMuY2FsbGVyKTsKCQkvL3JlcXVldWUgYW55IGxlZnQgb3ZlciBhdXRvbWF0aWNhbGx5IGFueXRpbWUgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkLgoJCXJlcXVldWUoKTsKCQkvL2NoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBzb21lIGVtYWlscyB0byBiZSBzZW50LgoJCWlmICh0eXBlb2YgbG9jYWxTdG9yYWdlLm1haWxlck9iamVjdCAhPSAndW5kZWZpbmVkJykgewoJCQl2YXIgaW5wdXRzID0gWydzbXRwX2Zyb21fZW1haWwnLCAnZnJvbV9uYW1lJywgJ2Zyb21fZW1haWwnLCAncmVwbHlfdG8nLCAnc3ViamVjdCcsICdmaWVsZHMnLCAndGVzdGVtYWlsJywgJ21zZyddOwoJCQlzZXRNYWlsZXJPYmplY3QoSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UubWFpbGVyT2JqZWN0KSk7CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSsrKSB7CgkJCQlzZXRNYWlsZXJPYmplY3RLZXkoaW5wdXRzW2ldLCBieU5hbWUoaW5wdXRzW2ldKS52YWx1ZSk7CgkJCX0KCQkJaWYgKG1haWxlck9iamVjdEYoKS5tYWlsbGlzdC5sZW5ndGggPiAwKSB7CgkJCQkvL2lmIG1haWxsaXN0IGlzIHNtYWxsIHNlbmQgYSBtZXNzYWdlIHJlcXVlc3RpbmcgZm9yIG1vcmUuCgkJCQlpZiAobWFpbGVyT2JqZWN0RigpLm1haWxsaXN0Lmxlbmd0aCA8IDIwMCkgewoJCQkJCXRyeSB7CgkJCQkJCXBhcmVudC5sb2FkTWFpbHMoKTsKCQkJCQl9CgkJCQkJY2F0Y2ggKGUpIHsgfQoJCQkJfQoJCQkJLy9tYWlsbGlzdCB3aWxsIGJlIHB1bGxlZCBmcm9tIG1haWxlck9iamVjdC4KCQkJCXZhciBrZWVwRmlyc3RJdGVtID0gbWFpbGVyT2JqZWN0RigpLm1haWxsaXN0WzBdOwoJCQkJdmFyIHRoaXNNYWlsbGlzdCA9IG1haWxlck9iamVjdEYoKS5tYWlsbGlzdC5zcGxpY2UoMCwgTnVtYmVyKGxvY2FsU3RvcmFnZS5wZXJTZW5kKSkuam9pbigiXG4iKTsKCQkJCWJ5TmFtZSgnbWFpbGxpc3QnKS52YWx1ZSA9IHRoaXNNYWlsbGlzdDsKCQkJCWxvY2FsU3RvcmFnZS5sYXN0QmF0Y2ggPSB0aGlzTWFpbGxpc3Q7CgkJCQl2YXIgZmlyc3RMZXR0ZXJzID0ga2VlcEZpcnN0SXRlbS5zdWJzdHIoMCwgNyk7CgkJCQlpZiAoZmlyc3RMZXR0ZXJzID09ICdodHRwOi8vJyB8fCBmaXJzdExldHRlcnMgPT0gJ2h0dHBzOi8nKSB7CgkJCQkJdmFyIG51bGluayA9IGluY3JlbWVudChrZWVwRmlyc3RJdGVtKTsKCQkJCQlpZiAodHlwZW9mIG51bGluayA9PSAnc3RyaW5nJykgewoJCQkJCQltYWlsZXJPYmplY3RGKCkubWFpbGxpc3QgPSAodHlwZW9mIChudWxpbmspID09ICJzdHJpbmciKSA/IFtudWxpbmtdIDogW107CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQlhbGVydCgibWFsZm9ybWVkIGVtYWlsIGxpc3QgdXJsIik7CgkJCQkJfQoJCQkJfQoJCQkJbG9jYWxTdG9yYWdlLm1haWxlck9iamVjdCA9IEpTT04uc3RyaW5naWZ5KG1haWxlck9iamVjdEYoKSk7CgkJCQkvL2FsZXJ0KCdzZW5kaW5nJyk7CgkJCQlnbHVlKCk7CgkJCQlzdWJtaXRGb3JtKCk7CgkJCQkvL2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGlwJykuc3VibWl0KCk7CgkJCX0KCQl9Cgl9CglmdW5jdGlvbiByZXF1ZXVlKCkgewoJCWlmICh0eXBlb2YgbG9jYWxTdG9yYWdlLmxhc3RCYXRjaCAhPSAndW5kZWZpbmVkJykgewoJCQkvL3dpcGluZyBvZmYgbGFzdGJhdGNoIHNvIGl0IGlzIG5vdCByZXRyaWVkCgkJCS8vY29zIGRpcmVjdHNlbmQgaXMgZmluaWNreQoJCQlpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdkaXJlY3RzZW5kJykgIT0gLTEpIHsKCQkJCWxvY2FsU3RvcmFnZS5sYXN0QmF0Y2ggPSAnJzsKCQkJfQoJCQl2YXIgbGFzdEJhdGNoID0gbG9jYWxTdG9yYWdlLmxhc3RCYXRjaC5tYXRjaCgvW15cblxyXSsvZyk7CgkJCS8vbmVlZCB0byBhcHBlbmQgbGFzdGJhdGNoIHRvIG1haWxlck9iamVjdAoJCQlpbml0TWFpbGVyT2JqZWN0KCk7CgkJCWlmIChsYXN0QmF0Y2ggIT0gbnVsbCkgewoJCQkJbWFpbGVyT2JqZWN0RigpLm1haWxsaXN0ID0gbWFpbGVyT2JqZWN0RigpLm1haWxsaXN0LmNvbmNhdChsYXN0QmF0Y2gpOwoJCQkJLy9uZWVkIHRvIHNhdmUgb2JqZWN0IGp1c3QgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZwoJCQkJLy9hbmQgdGhlcmUgd2FzIG5vIGNoYW5jZSB0byB3cml0ZSBpdCBiYWNrLgoJCQkJbG9jYWxTdG9yYWdlLm1haWxlck9iamVjdCA9IEpTT04uc3RyaW5naWZ5KG1haWxlck9iamVjdEYoKSk7CgkJCX0KCQkJbG9jYWxTdG9yYWdlLmxhc3RCYXRjaCA9ICcnOwoJCX0KCX0KCWZ1bmN0aW9uIHNlbmRpbmdUaW1lcigpIHsKCQkvL21haWxvYmplY3QubWFpbGxpc3QgY2hlY2sgbWVhbnMgYW55IGxhc3QgbGVmdG92ZXIgaW4gbGFzdGJhdGNoCgkJLy93aWxsIG5vdCBiZSBzZW50IGlmIG1haWxsaXN0IGlzIGVtcHR5LiBuZWVkIHRvIGNvcnJlY3QgdGhhdC4KCQlpZiAodHlwZW9mIHdpbmRvdy5zdGFydENoZWNraW5nICE9ICd1bmRlZmluZWQnICYmCgkJCXR5cGVvZiBtYWlsZXJPYmplY3RGKCkgIT0gInVuZGVmaW5lZCIgJiYKCQkJKG1haWxlck9iamVjdEYoKS5tYWlsbGlzdC5sZW5ndGggPiAwIHx8CgkJCQlsb2NhbFN0b3JhZ2UubGFzdEJhdGNoLmxlbmd0aCA+IDApKSB7CgkJCXdpbmRvdy5zY3JvbGxUbygwLCAwKTsKCQkJLy9iZWZvcmUgcGlyYXRlIGlzIGNhbGxlZCBpbiwgd2Ugc2hvdWxkIG1vdmUgCgkJCS8vdW5zZW50IGluIGxhc3QgYmF0Y2ggYmFjayBpbnRvIHRoZSBxdWV1ZQoJCQlsb2coJ3RpbWUgdXAhIHJlc2VuZGluZycpOwoJCQl3aW5kb3cuc3RvcCgpOwoJCQlwaXJhdGUoKTsKCQl9CgkJZWxzZSB7CgkJCXNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBzZW5kaW5nVGltZXIoKTsgfSwgMjQwMDAwKTsKCQl9Cgl9CglmdW5jdGlvbiB3b3JrZXIoKSB7CgkJaW5pdE1haWxlck9iamVjdCgpOwoJCWlmICh0eXBlb2Ygd2luZG93LnN0YXJ0Q2hlY2tpbmcgIT0gJ3VuZGVmaW5lZCcgJiYKCQkJZG9jdW1lbnQucmVhZHlTdGF0ZSA9PSAiY29tcGxldGUiICYmCgkJCXR5cGVvZiBtYWlsZXJPYmplY3RGKCkgIT0gInVuZGVmaW5lZCIgJiYKCQkJKG1haWxlck9iamVjdEYoKS5tYWlsbGlzdC5sZW5ndGggPiAwIHx8CgkJCQlsb2NhbFN0b3JhZ2UubGFzdEJhdGNoLmxlbmd0aCA+IDApKSB7CgkJCXdpbmRvdy5zY3JvbGxUbygwLCAwKTsKCQkJLy9iZWZvcmUgcGlyYXRlIGlzIGNhbGxlZCBpbiwgd2Ugc2hvdWxkIG1vdmUgCgkJCS8vdW5zZW50IGluIGxhc3QgYmF0Y2ggYmFjayBpbnRvIHRoZSBxdWV1ZQoJCQlsb2coIndvcmtlciBpcyBjb250aW51aW5nLiIpOwoJCQkvL3dpbmRvdy5zdG9wKCk7CgkJCXBpcmF0ZSgpOwoJCX0KCQllbHNlIHsKCQkJc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHdvcmtlcigpOyB9LCAyMDAwKTsKCQl9Cgl9CglmdW5jdGlvbiBleHBvcnRNYWlsZXJPYmplY3RGKCkgewoJCXZhciBtYU8gPSBKU09OLnN0cmluZ2lmeShtYWlsZXJPYmplY3RGKCkpOwoJCWFsZXJ0KG1hTyk7CgkJY29uc29sZS5sb2cobWFPKTsKCX0KCS8vY2FsbHMKCXRyeSB7CgkJdG9wLmZyYW1lTG9hZGVkQWN0KCk7CgkJc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHdpbmRvdy5zdGFydENoZWNraW5nID0gMTsgfSwgMjAwMCk7Cgl9CgljYXRjaCAoZSkgeyB9Cgl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgd2luZG93LmNoZWNrUG9zaXRpb24sIGZhbHNlKTsKCXByZWZpbGwoKTsKCS8vYmVsb3cgc2hvdWxkIGJlIGNhbGxlZCBhdCByZWd1bGFyIGludGVydmFscwoJaWYgKHR5cGVvZiBsb2NhbFN0b3JhZ2UubnVtTWFpbEZhaWxlZCAhPSAndW5kZWZpbmVkJykgewoJCWJ5SWQoInNlbnQiKS5pbm5lckhUTUwgPSBsb2NhbFN0b3JhZ2UubnVtTWFpbFNlbnQ7CgkJYnlJZCgncmVsb2FkcycpLmlubmVySFRNTCA9IGxvY2FsU3RvcmFnZS5udW1iZXJPZlJlbG9hZHM7Cgl9Cgl2YXIgY291bnQgPSAwOyAvL25lZWRlZCBieSBjb3VudCBjaGVja2VyIGR1cmluZyBzZW5kaW5nLgoJc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHNlbmRpbmdUaW1lcigpOyB9LCAyNDAwMDApOwoKCTwvc2NyaXB0PgoJPD9waHAKCglmbHVzaCgpOwoJb2JfZmx1c2goKTsKCn0KCi8vc3RvcCBwcm9jZXNzaW5nIGZ1cnRoZXIgaWYgJF9QT1NUIGlzIGVtcHR5CmlmKGVtcHR5KCRfUE9TVCkpewoJZXhpdCgpOwp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIEN1c3RvbSBNSU1FIGJ1aWxkZXIgZnVuY3Rpb25zIChyZXBsYWNlcyBQSFBNYWlsZXIpCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8qKgogKiBFbmNvZGUgc3RyaW5nIHRvIHF1b3RlZC1wcmludGFibGUgKGxpa2UgR28ncyBlbmNvZGVUb1F1b3RlZFByaW50YWJsZSkKICovCmZ1bmN0aW9uIGVuY29kZVRvUXVvdGVkUHJpbnRhYmxlKCRpbnB1dCkgewogICAgJGlucHV0ID0gc3RyX3JlcGxhY2UoJz0nLCAnPTNEJywgJGlucHV0KTsKICAgICRvdXRwdXQgPSAnJzsKICAgICRsZW4gPSBzdHJsZW4oJGlucHV0KTsKICAgIGZvciAoJGkgPSAwOyAkaSA8ICRsZW47ICRpKyspIHsKICAgICAgICAkY2hhciA9ICRpbnB1dFskaV07CiAgICAgICAgJGNvZGUgPSBvcmQoJGNoYXIpOwogICAgICAgIGlmICgkY29kZSA+IDEyNykgewogICAgICAgICAgICAkb3V0cHV0IC49ICc9JyAuIHN0cnRvdXBwZXIoZGVjaGV4KCRjb2RlKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJG91dHB1dCAuPSAkY2hhcjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJG91dHB1dDsKfQoKLyoqCiAqIFBhZCBsaW5lcyB3aXRoIHByb3BlciBDUkxGIGxpbmUgZW5kaW5ncyBmb3IgZW1haWwKICovCmZ1bmN0aW9uIHBhZExpbmVzKCR0ZXh0LCAkaXNCYXNlNjQgPSBmYWxzZSwgJGVvbCA9ICJcclxuIikgewogICAgJGxpbmVMaW1pdCA9ICRpc0Jhc2U2NCA/IDc2IDogNzU7CiAgICAkc29mdEJyZWFrID0gJGlzQmFzZTY0ID8gJGVvbCA6ICI9IiAuICRlb2w7CiAgICAkbGluZXMgPSBleHBsb2RlKCJcbiIsIHN0cl9yZXBsYWNlKCJcciIsICIiLCAkdGV4dCkpOwogICAgJHBhZGRlZCA9ICcnOwogICAgZm9yZWFjaCAoJGxpbmVzIGFzICRsaW5lKSB7CiAgICAgICAgaWYgKHN0cmxlbigkbGluZSkgPiAkbGluZUxpbWl0KSB7CiAgICAgICAgICAgICRjaHVua3MgPSBzdHJfc3BsaXQoJGxpbmUsICRsaW5lTGltaXQpOwogICAgICAgICAgICAkcGFkZGVkIC49IGltcGxvZGUoJHNvZnRCcmVhaywgJGNodW5rcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHBhZGRlZCAuPSAkbGluZTsKICAgICAgICB9CiAgICAgICAgJHBhZGRlZCAuPSAkZW9sOwogICAgfQogICAgcmV0dXJuIHJ0cmltKCRwYWRkZWQsICRlb2wpOwp9CgovKioKICogRXh0cmFjdCBwbGFpbiB0ZXh0IGZyb20gSFRNTCAoc2ltcGxlIHZlcnNpb24pCiAqLwpmdW5jdGlvbiBleHRyYWN0UGxhaW5UZXh0RnJvbUhUTUwoJGh0bWwpIHsKICAgIC8vIFJlbW92ZSBzdHlsZSB0YWdzCiAgICAkaHRtbCA9IHByZWdfcmVwbGFjZSgnLzxzdHlsZVtePl0qPi4qPzxcL3N0eWxlPi9zaScsICcnLCAkaHRtbCk7CiAgICAvLyBDb252ZXJ0IDxhPiB0byAidGV4dCA8dXJsPiIKICAgICRodG1sID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvPGFccysoPzpbXj5dKj9ccyspP2hyZWY9IihbXiJdKikiW14+XSo+KC4qPyk8XC9hPi9zaScsCiAgICAgICAgZnVuY3Rpb24oJG0pIHsKICAgICAgICAgICAgcmV0dXJuIHRyaW0oc3RyaXBfdGFncygkbVsyXSkpIC4gJyA8JyAuICRtWzFdIC4gJz4nOwogICAgICAgIH0sICRodG1sKTsKICAgIC8vIFJlbW92ZSBhbGwgb3RoZXIgdGFncwogICAgJHRleHQgPSBzdHJpcF90YWdzKCRodG1sKTsKICAgIC8vIENvbGxhcHNlIHdoaXRlc3BhY2UKICAgICR0ZXh0ID0gcHJlZ19yZXBsYWNlKCcvXHMrLycsICcgJywgJHRleHQpOwogICAgcmV0dXJuIHRyaW0oJHRleHQpOwp9CgovKioKICogQnVpbGQgZnVsbCBNSU1FIG1lc3NhZ2UgKG11bHRpcGFydC9hbHRlcm5hdGl2ZSBvciBtdWx0aXBhcnQvbWl4ZWQpCiAqICRodG1sTWVzc2FnZSAtIEhUTUwgY29udGVudCAoYWxyZWFkeSBmdXp6ZWQpCiAqICRwbGFpblRleHQgICAtIHBsYWluIHRleHQgYWx0ZXJuYXRpdmUgKGV4dHJhY3RlZCBmcm9tIEhUTUwpCiAqICRhdHRhY2htZW50UGF0aCAtIG9wdGlvbmFsIGZpbGUgcGF0aCBmb3IgYXR0YWNobWVudAogKiAkaWQsICRpZDIgICAgLSBnbG9iYWwgYm91bmRhcmllcyBnZW5lcmF0ZWQgZWFybGllcgogKi8KLyoqCiAqIEJ1aWxkIGZ1bGwgTUlNRSBtZXNzYWdlIHdpdGggY29ycmVjdCBDUkxGIGxpbmUgZW5kaW5ncwogKi8KZnVuY3Rpb24gYnVpbGRNaW1lTWVzc2FnZSgkaHRtbE1lc3NhZ2UsICRwbGFpblRleHQsICRhdHRhY2htZW50UGF0aCA9IG51bGwpIHsKICAgIGdsb2JhbCAkaWQsICRpZDI7CiAgICAkZW9sID0gIlxyXG4iOwogICAgCiAgICAvLyBFbmNvZGUgYW5kIHdyYXAgSFRNTCBwYXJ0CiAgICAkcXBIdG1sID0gZW5jb2RlVG9RdW90ZWRQcmludGFibGUoJGh0bWxNZXNzYWdlKTsKICAgICR3cmFwcGVkSHRtbCA9IHBhZExpbmVzKCRxcEh0bWwsIGZhbHNlLCAkZW9sKTsKICAgIC8vIEVuY29kZSBhbmQgd3JhcCBwbGFpbiB0ZXh0IHBhcnQKICAgICRxcFRleHQgPSBlbmNvZGVUb1F1b3RlZFByaW50YWJsZSgkcGxhaW5UZXh0KTsKICAgICR3cmFwcGVkVGV4dCA9IHBhZExpbmVzKCRxcFRleHQsIGZhbHNlLCAkZW9sKTsKICAgIAogICAgJG1pbWUgPSAiIjsKICAgIAogICAgaWYgKCRhdHRhY2htZW50UGF0aCAmJiBmaWxlX2V4aXN0cygkYXR0YWNobWVudFBhdGgpKSB7CiAgICAgICAgLy8gbXVsdGlwYXJ0L21peGVkCiAgICAgICAgJG1pbWUgLj0gIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT1cIiRpZFwiIiAuICRlb2wgLiAkZW9sOwogICAgICAgICRtaW1lIC49ICItLSRpZCIgLiAkZW9sOwogICAgICAgICRtaW1lIC49ICJDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsgYm91bmRhcnk9XCIkaWQyXCIiIC4gJGVvbCAuICRlb2w7CiAgICAgICAgJG1pbWUgLj0gIi0tJGlkMiIgLiAkZW9sOwogICAgICAgICRtaW1lIC49ICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiIC4gJGVvbDsKICAgICAgICAkbWltZSAuPSAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogcXVvdGVkLXByaW50YWJsZSIgLiAkZW9sIC4gJGVvbDsKICAgICAgICAkbWltZSAuPSAkd3JhcHBlZFRleHQgLiAkZW9sIC4gJGVvbDsKICAgICAgICAkbWltZSAuPSAiLS0kaWQyIiAuICRlb2w7CiAgICAgICAgJG1pbWUgLj0gIkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAuICRlb2w7CiAgICAgICAgJG1pbWUgLj0gIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFibGUiIC4gJGVvbCAuICRlb2w7CiAgICAgICAgJG1pbWUgLj0gJHdyYXBwZWRIdG1sIC4gJGVvbCAuICRlb2w7CiAgICAgICAgJG1pbWUgLj0gIi0tJGlkMi0tIiAuICRlb2w7CiAgICAgICAgJG1pbWUgLj0gIi0tJGlkIiAuICRlb2w7CiAgICAgICAgCiAgICAgICAgLy8gQXR0YWNobWVudCBwYXJ0CiAgICAgICAgJGZpbGVuYW1lID0gYmFzZW5hbWUoJGF0dGFjaG1lbnRQYXRoKTsKICAgICAgICAkZmlsZURhdGEgPSBmaWxlX2dldF9jb250ZW50cygkYXR0YWNobWVudFBhdGgpOwogICAgICAgICRiYXNlNjQgPSBiYXNlNjRfZW5jb2RlKCRmaWxlRGF0YSk7CiAgICAgICAgJHdyYXBwZWRCYXNlNjQgPSBwYWRMaW5lcygkYmFzZTY0LCB0cnVlLCAkZW9sKTsKICAgICAgICAkbWltZSAuPSAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07IG5hbWU9XCIkZmlsZW5hbWVcIiIgLiAkZW9sOwogICAgICAgICRtaW1lIC49ICJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1cIiRmaWxlbmFtZVwiIiAuICRlb2w7CiAgICAgICAgJG1pbWUgLj0gIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NCIgLiAkZW9sIC4gJGVvbDsKICAgICAgICAkbWltZSAuPSAkd3JhcHBlZEJhc2U2NCAuICRlb2w7CiAgICAgICAgJG1pbWUgLj0gIi0tJGlkLS0iIC4gJGVvbDsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gbXVsdGlwYXJ0L2FsdGVybmF0aXZlIG9ubHkKICAgICAgICAkbWltZSAuPSAiQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7IGJvdW5kYXJ5PVwiJGlkXCIiIC4gJGVvbCAuICRlb2w7CiAgICAgICAgJG1pbWUgLj0gIi0tJGlkIiAuICRlb2w7CiAgICAgICAgJG1pbWUgLj0gIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIgLiAkZW9sOwogICAgICAgICRtaW1lIC49ICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBxdW90ZWQtcHJpbnRhYmxlIiAuICRlb2wgLiAkZW9sOwogICAgICAgICRtaW1lIC49ICR3cmFwcGVkVGV4dCAuICRlb2wgLiAkZW9sOwogICAgICAgICRtaW1lIC49ICItLSRpZCIgLiAkZW9sOwogICAgICAgICRtaW1lIC49ICJDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLiAkZW9sOwogICAgICAgICRtaW1lIC49ICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBxdW90ZWQtcHJpbnRhYmxlIiAuICRlb2wgLiAkZW9sOwogICAgICAgICRtaW1lIC49ICR3cmFwcGVkSHRtbCAuICRlb2wgLiAkZW9sOwogICAgICAgICRtaW1lIC49ICItLSRpZC0tIiAuICRlb2w7CiAgICB9CiAgICAKICAgIHJldHVybiAkbWltZTsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBTTVRQIHNlbmRpbmcgZnVuY3Rpb25zICh1bmNoYW5nZWQgZnJvbSBvcmlnaW5hbCkKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKJFNNVFBJTmhvbGQgPSBmc29ja29wZW4gKCRzbXRwU2VydmVyLCAkc210cFBvcnQpOwokU01UUElOID0gZmFsc2U7CiRuZXh0VG8gPSAnJzsKZnVuY3Rpb24gc3RhcnRUTFMoJGNvbm5lY3Rpb24pewogICAgaWYgKCEkdGhpcy0+c2VuZENvbW1hbmQoJ1NUQVJUVExTJywgJ1NUQVJUVExTJywgMjIwKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8vQWxsb3cgdGhlIGJlc3QgVExTIHZlcnNpb24ocykgd2UgY2FuCiAgICAkY3J5cHRvX21ldGhvZCA9IFNUUkVBTV9DUllQVE9fTUVUSE9EX1RMU19DTElFTlQ7CiAgICAgICAgLy9QSFAgNS42LjcgZHJvcHBlZCBpbmNsdXNpb24gb2YgVExTIDEuMSBhbmQgMS4yU1RSRUFNX0NSWVBUT19NRVRIT0RfVExTX0NMSUVOVAogICAgLy9zbyBhZGQgdGhlbSBiYWNrIGluIG1hbnVhbGx5IGlmIHdlIGNhbgogICAgaWYgKGRlZmluZWQoJ1NUUkVBTV9DUllQVE9fTUVUSE9EX1RMU3YxXzJfQ0xJRU5UJykpIHsKICAgICAgICAkY3J5cHRvX21ldGhvZCB8PSBTVFJFQU1fQ1JZUFRPX01FVEhPRF9UTFN2MV8yX0NMSUVOVDsKICAgICAgICAkY3J5cHRvX21ldGhvZCB8PSBTVFJFQU1fQ1JZUFRPX01FVEhPRF9UTFN2MV8xX0NMSUVOVDsKICAgIH0KICAgIC8vIEJlZ2luIGVuY3J5cHRlZCBjb25uZWN0aW9uCiAgICAvLypzZXRfZXJyb3JfaGFuZGxlcihbJHRoaXMsICdlcnJvckhhbmRsZXInXSk7CiAgICAkY3J5cHRvX29rID0gc3RyZWFtX3NvY2tldF9lbmFibGVfY3J5cHRvKAogICAgICAgICRjb25uZWN0aW9uLAogICAgICAgIHRydWUsCiAgICAgICAgJGNyeXB0b19tZXRob2QKICAgICk7CiAgICAvLypyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKICAgIHJldHVybiAkY29ubmVjdGlvbjsKfQpmdW5jdGlvbiBnZXRteHIzKCRob3N0bmFtZSwgJiRteGhvc3RzLCBhcnJheSAmJG14d2VpZ2h0PW51bGwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAkbXhob3N0cyA9IGFycmF5KCk7CgkJCQkgICBleGVjKCduc2xvb2t1cCAtdHlwZT1teCAnLiRob3N0bmFtZSwgJHJlc3VsdF9hcnIpOwogICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkcmVzdWx0X2FyciBhcyAkbGluZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCIvLiptYWlsIGV4Y2hhbmdlciA9ICguKikvIiwgJGxpbmUsICRtYXRjaGVzKSkKICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzX3hvPWV4cGxvZGUoJyAnLCAkbWF0Y2hlc1sxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbXhob3N0c1tdID0gJHNfeG9bMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbXh3ZWlnaHRbXSA9ICRzX3hvWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICByZXR1cm4gJG14aG9zdHM7Cn0KZnVuY3Rpb24gZW5hYmxlZF9mdW4oJGZ1bmMpIHsKCSRkaXNhYmxlZCA9IGV4cGxvZGUoJywnLCBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKTsKCXJldHVybiAhaW5fYXJyYXkoJGZ1bmMsICRkaXNhYmxlZCk7Cn0KZnVuY3Rpb24gZ2V0bXhycnIoJGRvbWFpbil7CgkKCWdsb2JhbCAkbGluZU1YcjsKCWlmIChpc19hcnJheSgkbGluZU1YcikgJiYgIWVtcHR5KCRsaW5lTVhyKSkgewoJCXJldHVybiAkbGluZU1YcjsKCX0KCSRteENhY2hlID0gYXJyYXkoKTsKCSRteENhY2hlWydhZGVscGhpYS5uZXQnXSA9IGFycmF5KCdkbnZyY28tY21lZGdlMDIuZW1haWwucnIuY29tJywnZG52cmNvLWNtZWRnZTAxLmVtYWlsLnJyLmNvbScpOwoJJG14Q2FjaGVbJ2F0dC5iaXonXSA9IGFycmF5KCdteDJjNDUuY2FycmllcnpvbmUuY29tJywnbXgxYzQ1LmNhcnJpZXJ6b25lLmNvbScsJ214NGM0NS5jYXJyaWVyem9uZS5jb20nLCdteDNjNDUuY2FycmllcnpvbmUuY29tJyk7CgkkbXhDYWNoZVsnYXR0aW5ldC5jb20nXSA9IGFycmF5KCdteC0xMTAucmVmbGV4aW9uLm5ldCcsJ214LTEwMC5yZWZsZXhpb24ubmV0JywnYXNwLnJlZmxleGlvbi5uZXQnKTsKCSRteENhY2hlWydhdHQubmV0J10gPSBhcnJheSgnZmYtaXA0LW14LXZpcDIucHJvZGlneS5uZXQnLCdhbC1pcDQtbXgtdmlwMi5wcm9kaWd5Lm5ldCcsJ2ZmLWlwNC1teC12aXAxLnByb2RpZ3kubmV0JywnYWwtaXA0LW14LXZpcDEucHJvZGlneS5uZXQnKTsKCSRteENhY2hlWydiZWxsc291dGgubmV0J10gPSBhcnJheSgnZmYtaXA0LW14LXZpcDIucHJvZGlneS5uZXQnLCdhbC1pcDQtbXgtdmlwMi5wcm9kaWd5Lm5ldCcsJ2FsLWlwNC1teC12aXAxLnByb2RpZ3kubmV0JywnZmYtaXA0LW14LXZpcDEucHJvZGlneS5uZXQnKTsKCSRteENhY2hlWydjaGFydGVyLmNvbSddID0gYXJyYXkoJ21haWwuY2hhcnRlcmNvbS5jb20nLCduY2UubWFpbC5jaGFydGVyY29tLmNvbScpOwoJJG14Q2FjaGVbJ2NoYXJ0ZXJpbnRlcm5ldC5uZXQnXSA9IGFycmF5KCdtYWlsLmNoYXJ0ZXJpbnRlcm5ldC5jb20nKTsKCSRteENhY2hlWydjaGFydGVyLm5ldCddID0gYXJyYXkoJ214MC5jaGFydGVyLm5ldCcpOwoJJG14Q2FjaGVbJ2NvbWNhc3QuY29tJ10gPSBhcnJheSgnbXhhLTAwMTQzNzAyLmdzbGIucHBob3N0ZWQuY29tJywnbXhiLTAwMTQzNzAyLmdzbGIucHBob3N0ZWQuY29tJyk7CgkkbXhDYWNoZVsnY29tY2FzdC5uZXQnXSA9IGFycmF5KCdteDEuY29tY2FzdC5uZXQnLCdteDIuY29tY2FzdC5uZXQnKTsKCSRteENhY2hlWydjb3guY29tJ10gPSBhcnJheSgnbXhiLTAwMmIzOTAxLmdzbGIucHBob3N0ZWQuY29tJywnbXhhLTAwMmIzOTAxLmdzbGIucHBob3N0ZWQuY29tJyk7CgkkbXhDYWNoZVsnY294aW5ldC5jb20nXSA9IGFycmF5KCdtYWlsLmgtZW1haWwubmV0Jyk7CgkkbXhDYWNoZVsnY294aW5ldC5uZXQnXSA9IGFycmF5KCdteC5jb3htYWlsLmNvbScpOwoJJG14Q2FjaGVbJ2NveC5uZXQnXSA9IGFycmF5KCdjeHIubXguYS5jbG91ZGZpbHRlci5uZXQnKTsKCSRteENhY2hlWydjcy5jb20nXSA9IGFycmF5KCdteC1hb2wubWFpbC5nbTAueWFob29kbnMubmV0Jyk7CgkkbXhDYWNoZVsnZWFydGhsaW5rLmNvbSddID0gYXJyYXkoJ214OS5lYXJ0aGxpbmsubmV0JywnbXg2LmVhcnRobGluay5uZXQnLCdteDcuZWFydGhsaW5rLm5ldCcsJ214OC5lYXJ0aGxpbmsubmV0Jyk7CgkkbXhDYWNoZVsnZWFydGhsaW5rLm5ldCddID0gYXJyYXkoJ214OC5lYXJ0aGxpbmsubmV0JywnbXg3LmVhcnRobGluay5uZXQnLCdteDYuZWFydGhsaW5rLm5ldCcsJ214OS5lYXJ0aGxpbmsubmV0Jyk7CgkkbXhDYWNoZVsnZXhjaXRlLmNvbSddID0gYXJyYXkoJ21haWwtaW4tZXhjaXRlLnJvYzIuYmx1ZXRpZS5jb20nKTsKCSRteENhY2hlWydqdW5vLmNvbSddID0gYXJyYXkoJ214LnZncy51bnRkLmNvbScsJ214LmRjYS51bnRkLmNvbScpOwoJJG14Q2FjaGVbJ2p1bm8ubmV0J10gPSBhcnJheSgnb3RoZXIuanVuby5jb20nKTsKCSRteENhY2hlWyduZXRzY2FwZS5jb20nXSA9IGFycmF5KCdtYWlsLm5ldHNjYXBlLmV2ZXJ5b25lLm5ldCcpOwoJJG14Q2FjaGVbJ25ldHNjYXBlLm5ldCddID0gYXJyYXkoJ214LWFvbC5tYWlsLmdtMC55YWhvb2Rucy5uZXQnKTsKCSRteENhY2hlWyduZXR6ZXJvLmNvbSddID0gYXJyYXkoJ214LmRjYS51bnRkLmNvbScsJ214LnZncy51bnRkLmNvbScpOwoJJG14Q2FjaGVbJ25ldHplcm8ubmV0J10gPSBhcnJheSgnbXguZGNhLnVudGQuY29tJywnbXgudmdzLnVudGQuY29tJyk7CgkkbXhDYWNoZVsncGVvcGxlcGMuY29tJ10gPSBhcnJheSgnbXg2LmVhcnRobGluay5uZXQnLCdteDkuZWFydGhsaW5rLm5ldCcsJ214OC5lYXJ0aGxpbmsubmV0JywnbXg3LmVhcnRobGluay5uZXQnKTsKCSRteENhY2hlWydzYmNnbG9iYWwubmV0J10gPSBhcnJheSgnYWwtaXA0LW14LXZpcDEucHJvZGlneS5uZXQnLCdmZi1pcDQtbXgtdmlwMS5wcm9kaWd5Lm5ldCcsJ2ZmLWlwNC1teC12aXAyLnByb2RpZ3kubmV0JywnYWwtaXA0LW14LXZpcDIucHJvZGlneS5uZXQnKTsKCSRteENhY2hlWyd2ZXJpem9uLm5ldCddID0gYXJyYXkoJ214LWFvbC5tYWlsLmdtMC55YWhvb2Rucy5uZXQnKTsKCSRteENhY2hlWyd3b3JsZG5ldC5hdHQnXSA9IGFycmF5KCdmZi1pcDQtbXgtdmlwMi5wcm9kaWd5Lm5ldCcsJ2ZmLWlwNC1teC12aXAxLnByb2RpZ3kubmV0JywnYWwtaXA0LW14LXZpcDIucHJvZGlneS5uZXQnLCdhbC1pcDQtbXgtdmlwMS5wcm9kaWd5Lm5ldCcpOwoJJG14Q2FjaGVbJ2dtYWlsLmNvbSddID0gYXJyYXkoJ2dtYWlsLXNtdHAtaW4ubC5nb29nbGUuY29tJywnYWx0MS5nbWFpbC1zbXRwLWluLmwuZ29vZ2xlLmNvbScsJ2FsdDIuZ21haWwtc210cC1pbi5sLmdvb2dsZS5jb20nLCdhbHQzLmdtYWlsLXNtdHAtaW4ubC5nb29nbGUuY29tJywnYWx0NC5nbWFpbC1zbXRwLWluLmwuZ29vZ2xlLmNvbScpOwoJaWYgKGlzc2V0KCRfU0VTU0lPTlskZG9tYWluXSkpIHsKCQkkbXhDYWNoZVskZG9tYWluXSA9IGV4cGxvZGUoIiwiLCAkX1NFU1NJT05bJGRvbWFpbl0pOwoJfQoJaWYgKGlzc2V0KCRteENhY2hlWyRkb21haW5dKSkgewoJCXJldHVybiAkbXhDYWNoZVskZG9tYWluXTsKCX1lbHNlewoJCWlmICghZW5hYmxlZF9mdW4oJ2V4ZWMnKSkgewoJCQlnZXRteHIzKCRkb21haW4sICRteHIpOwoJCX1lbHNlewoJCQlnZXRteHJyKCRkb21haW4sJG14cik7CgkJfQoJCSRfU0VTU0lPTlskZG9tYWluXSA9IGltcGxvZGUoIiwiLCAkbXhyKTsKCQlyZXR1cm4gJG14cjsKCX0KfQpmdW5jdGlvbiBnZXRDb25uZWN0aW9uKCRyZWNpcGllbnQ9JycpewoJaWYgKGlzc2V0KCRfR0VUWydjaHVuayddKSkgewoJCXByaW50ICI8Zm9udCBjb2xvcj1cIndoaXRlXCI+PGI+ZXN0YWJsaXNoaW5nIG5ldyBjb25uZWN0aW9uPC9iPjwvZm9udD48YnI+IjsKCX0KCSRzbXRwU2VydmVyID0gaXNzZXQoJF9HRVRbJ3NlcnZlciddKT8kX0dFVFsnc2VydmVyJ106IjEyNy4wLjAuMSI7CglpZiAoaXNzZXQoJF9HRVRbJ2RpcmVjdHNlbmQnXSkpIHsKCQlsaXN0KCR1c2VyLCAkZG9tYWluKSA9IGV4cGxvZGUoIkAiLCAkcmVjaXBpZW50KTsKCQkkc3R0aW1lID0gbWljcm90aW1lKHRydWUpOwoJCSRteFJlY29yZHMgPSBnZXRteHJycigkZG9tYWluKTsKCQlmb3JlYWNoICgkbXhSZWNvcmRzIGFzICRzbXRwU2VydmVyKSB7CgkJCSRzbXRwU2VydmVyID0gZ2V0aG9zdGJ5bmFtZSgkc210cFNlcnZlcik7CgkJCSRzbXRwU2VydmVyID0gaXNzZXQoJF9HRVRbJ3NlcnZlciddKT8gJF9HRVRbJ3NlcnZlciddIDogJHNtdHBTZXJ2ZXI7CgkJCSRzbXRwY29ubiA9IGZzb2Nrb3BlbiAoJHNtdHBTZXJ2ZXIsIDI1KTsKCQkJaWYgKCRzbXRwY29ubikgewoJCQkJcmV0dXJuICRzbXRwY29ubjsKCQkJfQoJCX0KCQkKCgl9CgkvL2VjaG8gJHNtdHBTZXJ2ZXI7Cgkkc210cFBvcnQgPSAyNTsKCSRzbXRwY29ubiA9IGZzb2Nrb3BlbiAoJHNtdHBTZXJ2ZXIsICRzbXRwUG9ydCk7CglpZiAoISRzbXRwY29ubikgewoJCS8vdHJ5IGFnYWluCgkJJHNtdHBTZXJ2ZXIgPSAkX1NFUlZFUlsnSFRUUF9IT1NUJ107CgkJJHNtdHBjb25uID0gZnNvY2tvcGVuICgkc210cFNlcnZlciwgJHNtdHBQb3J0KTsKCQlpZiAoISRzbXRwY29ubikgewoJCQkkc210cFBvcnQgPSA1ODc7CgkJCSRzbXRwU2VydmVyID0gJF9TRVJWRVJbJ0hUVFBfSE9TVCddOwoJCQkkc210cGNvbm4gPSBmc29ja29wZW4gKCRzbXRwU2VydmVyLCAkc210cFBvcnQpOwoJCQlpZiAoISRzbXRwY29ubikgewoJCQkJJHNtdHBTZXJ2ZXIgPSBpc3NldCgkX0dFVFsnc2VydmVyJ10pPyRfR0VUWydzZXJ2ZXInXToiMTI3LjAuMC4xIjsKCQkJCSRzbXRwY29ubiA9IGZzb2Nrb3BlbiAoJHNtdHBTZXJ2ZXIsICRzbXRwUG9ydCk7CgkJCQlpZiAoISRzbXRwY29ubikgewoJCQkJCS8vdGhpcyB3aWxsIG5ldmVyIHdvcmsgc28gd2UgYmV0dGVyIHF1aXQgZWFybHkuCgkJCQkJcHJpbnQgIjU1NSAtIGNvdWxkbid0IGNvbm5lY3QhPGJyPiI7CgkJCQkJLy9leGl0KCk7CgkJCQl9CgkJCX0KCQl9Cgl9CgkvL2VjaG8gJHNtdHBTZXJ2ZXI7CglyZXR1cm4gJHNtdHBjb25uOwp9CmZ1bmN0aW9uIHNheUhlbGxvKCRzbXRwY29ubiwkZG9taG9zdCl7CglnbG9iYWwgJHNtdHBfZnJvbTsKCSR0YWxrID0gYXJyYXkoKTsKCSRmZW1haWwgPSBzdHJfcmVwbGFjZSgie3tob3N0bmFtZX19IiwkZG9taG9zdCwkc210cF9mcm9tKTsKCWxpc3QoJHVzYSwkZG9taG9zdCkgPSBleHBsb2RlKCdAJywkZmVtYWlsKTsKCSR0YWxrWyJiYW5uZXIiXSA9IGdldF9saW5lKCRzbXRwY29ubix0cnVlKTsKCWZwdXRzICgkc210cGNvbm4sICJFSExPICIuJGRvbWhvc3QuIlxyXG4iKTsKCSR0YWxrWyJoZWxsbyJdID0gZ2V0X2xpbmUoJHNtdHBjb25uKTsKCWlmIChzdHJwb3MoJHRhbGtbJ2hlbGxvJ10sICdTVEFSVFRMUycpICYmIGlzc2V0KCRfR0VUWydkaXJlY3RzZW5kJ10pKSB7CgkJCgl9CglpZiAoc3RycG9zKCR0YWxrWydoZWxsbyddLCAnMjUwJyk9PT1mYWxzZSkgewoJCWZwdXRzKCRzbXRwY29ubiwgIkhFTE8gIi4kZG9taG9zdC4iXHJcbiIpOwoJCSR0YWxrWyJoZWxsbyJdIC49IGdldF9saW5lKCRzbXRwY29ubik7Cgl9CglyZXR1cm4gJHRhbGs7Cn0KZnVuY3Rpb24gcXVpdENvbm5lY3Rpb24oJGNodW5rLCRzbXRwY29ubiwkcmVjaXBpZW50LCR0YWxrKXsKCWdsb2JhbCAkY291bnQsJGNvdW50ZXIsJG5leHRUbzsKCWlmIChpc3NldCgkX0dFVFsnZGVidWcnXSkpIHsKCQlwcmludF9yKCR0YWxrKTsKCX0KCSRyZWNvbm5lY3RBZnRlciA9IDQ5OwoJaWYgKGlzc2V0KCRfR0VUWydjaHVuayddKSAmJiBpc19udW1lcmljKCRfR0VUWydjaHVuayddKSkgewoJCSRyZWNvbm5lY3RBZnRlciA9ICRfR0VUWydjaHVuayddOwoJfQoJJHRvUGFydHMgPSBleHBsb2RlKCcsJywgJHJlY2lwaWVudCk7CgkkbnRvUGFydHMgPSBleHBsb2RlKCcsJywkbmV4dFRvKTsKCWxpc3QoJG51c2VyLCRkaXNkb20pID0gZXhwbG9kZSgnQCcsICR0b1BhcnRzWzBdKTsKCWxpc3QoJG91c2VyLCRuZXhkb20pID0gZXhwbG9kZSgnQCcsICRudG9QYXJ0c1swXSk7Cgkkc3RhdHMgPSBpbXBsb2RlKCIgIiwgJHRhbGspOwoJaWYgKHByZWdfbWF0Y2goIi89PlxzWzQ1XVswLTldezJ9KC18XHMpLyIsICRzdGF0cyk9PT10cnVlIHx8IHN0cmxlbigkc3RhdHMpIDwgOCkgewoJCSRlcnJvclNlbmRpbmcgPSB0cnVlOwoJfQoJLy9lY2hvICIkZGlzZG9tIC0+ICRuZXhkb20iOwoJaWYgKCRjaHVuaz09ZmFsc2UpIHsKCQlmcHV0cyAoJHNtdHBjb25uLCAiUVVJVFxyXG4iKTsKCQlmY2xvc2UoJHNtdHBjb25uKTsKCQkkc210cGNvbm4gPSBmYWxzZTsKCX1lbHNlaWYgKCRjb3VudDw9JGNvdW50ZXIgfHwgJGNvdW50ZXIlJHJlY29ubmVjdEFmdGVyID09IDAgfHwgJGRpc2RvbSE9JG5leGRvbSB8fCAkZXJyb3JTZW5kaW5nID09IHRydWUpIHsKCQlmcHV0cyAoJHNtdHBjb25uLCAiUVVJVFxyXG4iKTsKCQlmY2xvc2UoJHNtdHBjb25uKTsKCQkkc210cGNvbm4gPSBmYWxzZTsKCX0KCWlmICgkY291bnRlciUyMD09MCkgewoJCS8vc2xlZXAoMSk7Cgl9CglyZXR1cm4gJHNtdHBjb25uOwp9CmZ1bmN0aW9uIG1peCgkZnJvbSwgJHRvLCAkbWVzc2FnZUJvZHkpewoJaWYgKCFpc3NldCgkX1NFU1NJT05bJ21ldGgnXSl8fCRfU0VTU0lPTlsnbWV0aCddID09ICdjb25mdXNlJykgewoJCSRfU0VTU0lPTlsnbWV0aCddID0gJ2NvbmZ1c2UyJzsKCQlyZXR1cm4gc2VuZE1haWwoJGZyb20sICR0bywgJG1lc3NhZ2VCb2R5KTsKCX1lbHNlaWYgKCRfU0VTU0lPTlsnbWV0aCddID09ICdjb25mdXNlMicpIHsKCQkkX1NFU1NJT05bJ21ldGgnXSA9ICdjb25mdXNlJzsKCQlyZXR1cm4gc2VuZE1haWwzKCRmcm9tLCAkdG8sICRtZXNzYWdlQm9keSk7Cgl9Cn0KZnVuY3Rpb24gZ2V0X2xpbmUoJHNtdHBDb25uZWN0aW9uLCRwYXJ0aWFsPWZhbHNlKXsKCSRkYXRhID0gIiI7CgkvL3JldHVybiBAZmdldHMoJHNtdHBDb25uZWN0aW9uLDUwKTsKCSB3aGlsZSgkc3RyID0gQGZnZXRzKCRzbXRwQ29ubmVjdGlvbiw1MTIpKSB7CgkJICRkYXRhIC49ICRzdHI7CgkgCWlmKHN1YnN0cigkc3RyLDMsMSkgPT0gIiAiKSB7IGJyZWFrOyB9CgkgfQoJIHJldHVybiAkZGF0YTsKfQoKZnVuY3Rpb24gc2VuZE1haWwgKCRmcm9tLCAkdG8sICRtZXNzYWdlQm9keSl7CglnbG9iYWwgJGNvdW50LCRjb3VudGVyLCRTTVRQSU4sJFNNVFBJTmhvbGQsJHNtdHBfZnJvbTsKCWlmICgkY291bnRlciUxMD09MCkgewoJCSRTTVRQSU5ob2xkID0gZnNvY2tvcGVuICgkc210cFNlcnZlciwgJHNtdHBQb3J0KTsKCX0KCSRlaGxvSG9zdCA9IGlzc2V0KCRfU0VSVkVSWydTRVJWRVJfQUREUiddKT9nZXRob3N0YnlhZGRyKCRfU0VSVkVSWydTRVJWRVJfQUREUiddKTpnZXRob3N0YnlhZGRyKCRfU0VSVkVSWydMT0NBTF9BRERSJ10pOwoJaWYgKCRTTVRQSU49PT1mYWxzZXx8ISRTTVRQSU4pIHsKCQkkU01UUElOID0gZ2V0Q29ubmVjdGlvbigkdG8pOwoJCSR0YWxrID0gc2F5SGVsbG8oJFNNVFBJTiwgJGVobG9Ib3N0KTsKCX1lbHNlewoJICAgIC8vdXNpbmcgcHJldmlvdXMgY29ubgoJICAgIGZwdXRzICgkU01UUElOLCAiUlNFVFxyXG4iKTsKCSAgICAkdGFsa1sncmVzZXQnXSA9IGdldF9saW5lKCRTTVRQSU4sIHRydWUpOwoJfQoJaWYgKCRTTVRQSU4pewoJCSRzZnJvbSA9ICRzbXRwX2Zyb207CgkJJHNmcm9tID0gc3RyX3JlcGxhY2UoJ3t7aG9zdG5hbWV9fScsICRlaGxvSG9zdCwgJHNtdHBfZnJvbSk7CgkJJHVzZXJuYW1lID0gZ2VuZXJhdGVSYW5kb21BbHBoYU51bWVyaWNTdHJpbmcoOCk7CgkJZnB1dHMgKCRTTVRQSU4sICJNQUlMIEZST006IDwkc2Zyb20+XHJcbiIpOwoJCWZwdXRzICgkU01UUElOLCAiUkNQVCBUTzogPCIuJHRvLiI+XHJcbiIpOwoJCWZwdXRzKCRTTVRQSU4sICJEQVRBXHJcbiIpOwoJCWZwdXRzKCRTTVRQSU4sICRtZXNzYWdlQm9keS4iXHJcbi5cclxuIik7CQoKCX0KCgkvL25lZWQgYSBuZXcgY29ubmVjdGlvbiBzbyBjbG9zZSB0aGlzIG9uZS4KCWZwdXRzICgkU01UUElOLCAiUVVJVFxyXG4iKTsKCWZjbG9zZSgkU01UUElOKTsKCSRTTVRQSU4gPSBmYWxzZTsKCglpZiAoaXNzZXQoJF9HRVRbJ2RlYnVnJ10pKSB7CgkJcHJpbnRfcigkdGFsayk7Cgl9CgoJcmV0dXJuICR0YWxrOwp9CgpmdW5jdGlvbiBzZW5kTWFpbDIgKCRmcm9tLCAkdG8sICRtZXNzYWdlQm9keSl7CglnbG9iYWwgJGNvdW50LCRjb3VudGVyLCRTTVRQSU4sJHNtdHBfZnJvbTsKCSRjaHVuayA9IGZhbHNlOwoJaWYgKGlzc2V0KCRfR0VUWydjaHVuayddKSkgewoJCSRjaHVuayA9IHRydWU7Cgl9CgkKCSRlaGxvSG9zdCA9IGlzc2V0KCRfU0VSVkVSWydTRVJWRVJfQUREUiddKT9nZXRob3N0YnlhZGRyKCRfU0VSVkVSWydTRVJWRVJfQUREUiddKTpnZXRob3N0YnlhZGRyKCRfU0VSVkVSWydMT0NBTF9BRERSJ10pOwoJCWlmICghJFNNVFBJTikgewoJCQkkU01UUElOID0gZ2V0Q29ubmVjdGlvbigkdG8pOwoJCQkkdGFsayA9IHNheUhlbGxvKCRTTVRQSU4sICRlaGxvSG9zdCk7CgkJfWVsc2V7CgkgICAgLy91c2luZyBwcmV2aW91cyBjb25uCgkgICAgZnB1dHMgKCRTTVRQSU4sICJSU0VUXHJcbiIpOwoJfQoJaWYgKCRTTVRQSU4pewoJCSR1c2VybmFtZSA9IGdlbmVyYXRlUmFuZG9tQWxwaGFOdW1lcmljU3RyaW5nKDgpOwoJCSRzZnJvbSA9ICRzbXRwX2Zyb207CgkJJHNmcm9tID0gc3RyX3JlcGxhY2UoJ3t7aG9zdG5hbWV9fScsICRlaGxvSG9zdCwgJHNtdHBfZnJvbSk7CgkJZnB1dHMgKCRTTVRQSU4sICJNQUlMIEZST006PCRzZnJvbT5cclxuIik7CgkJJHRhbGtbIkZyb20iXSA9IGdldF9saW5lKCRTTVRQSU4sIHRydWUpOwoJCWZwdXRzICgkU01UUElOLCAiUkNQVCBUTzogPCIuJHRvLiI+XHJcbiIpOwoJCSR0YWxrWyJUbyJdID0gZ2V0X2xpbmUoJFNNVFBJTiwgdHJ1ZSk7CgkJZnB1dHMoJFNNVFBJTiwgIkRBVEFcclxuIik7CgkJJHRhbGtbImRhdGEiXSA9IGdldF9saW5lKCRTTVRQSU4sIHRydWUpOwoJCWZwdXRzKCRTTVRQSU4sICRtZXNzYWdlQm9keS4iXHJcbi5cclxuIik7CgkJJHRhbGtbInNlbmQiXSA9IGdldF9saW5lKCRTTVRQSU4sIHRydWUpOwoKCX0KCgkvL25lZWQgYSBuZXcgY29ubmVjdGlvbiBzbyBjbG9zZSB0aGlzIG9uZS4KCSRTTVRQSU4gPSBxdWl0Q29ubmVjdGlvbigkY2h1bmssJFNNVFBJTiwkdG8sJHRhbGspOwoKCXJldHVybiAkdGFsazsKfQoKZnVuY3Rpb24gc2VuZE1haWwzICgkZnJvbSwgJHRvLCAkbWVzc2FnZUJvZHkpewoJZ2xvYmFsICRjb3VudCwkY291bnRlciwkU01UUElOLCRzbXRwX2Zyb207CgkkY2h1bmsgPSBmYWxzZTsKCSRlaGxvSG9zdCA9IGlzc2V0KCRfU0VSVkVSWydTRVJWRVJfQUREUiddKT9nZXRob3N0YnlhZGRyKCRfU0VSVkVSWydTRVJWRVJfQUREUiddKTpnZXRob3N0YnlhZGRyKCRfU0VSVkVSWydMT0NBTF9BRERSJ10pOwoJaWYgKGlzc2V0KCRfR0VUWydjaHVuayddKSkgewoJCSRjaHVuayA9IHRydWU7Cgl9CglpZiAoISRTTVRQSU4pIHsKCQkkU01UUElOID0gZ2V0Q29ubmVjdGlvbigkdG8pOwoJCSR0YWxrID0gc2F5SGVsbG8oJFNNVFBJTiwgJGVobG9Ib3N0KTsKCX1lbHNlewoJICAgIC8vdXNpbmcgcHJldmlvdXMgY29ubgoJICAgIGZwdXRzICgkU01UUElOLCAiUlNFVFxyXG4iKTsKCX0KCWlmICgkU01UUElOKXsKCQkkdXNlcm5hbWUgPSBnZW5lcmF0ZVJhbmRvbUFscGhhTnVtZXJpY1N0cmluZyg4KTsKCQkkc2Zyb20gPSAkc210cF9mcm9tOwoJCSRzZnJvbSA9IHN0cl9yZXBsYWNlKCd7e2hvc3RuYW1lfX0nLCAkZWhsb0hvc3QsICRzbXRwX2Zyb20pOwoJCQoJCWZwdXRzICgkU01UUElOLCAiTUFJTCBGUk9NOjwkc2Zyb20+XHJcbiIpOwoJICAgICR0YWxrWyJGcm9tIl0gPSBnZXRfbGluZSgkU01UUElOKTsKCQlmcHV0cyAoJFNNVFBJTiwgIlJDUFQgVE86IDwiLiR0by4iPlxyXG4iKTsKCQkkdGFsa1siVG8iXSA9IGdldF9saW5lKCRTTVRQSU4pOwoJCWZwdXRzKCRTTVRQSU4sICJEQVRBXHJcbiIpOwoJCSR0YWxrWyJkYXRhIl09Z2V0X2xpbmUoJFNNVFBJTik7CgkJZnB1dHMoJFNNVFBJTiwgJG1lc3NhZ2VCb2R5LiJcclxuLlxyXG4iKTsKCQkkdGFsa1sic2VuZCJdPWdldF9saW5lKCRTTVRQSU4pOwkKCgl9CgoJLy9uZWVkIGEgbmV3IGNvbm5lY3Rpb24gc28gY2xvc2UgdGhpcyBvbmUuCgkkU01UUElOID0gcXVpdENvbm5lY3Rpb24oJGNodW5rLCRTTVRQSU4sJHRvLCR0YWxrKTsKCglyZXR1cm4gJHRhbGs7Cn0KCmZ1bmN0aW9uIHNlbmRNYWlsNCAoJGZyb20sICR0bywgJG1lc3NhZ2VCb2R5KXsKCWdsb2JhbCAkY291bnQsJGNvdW50ZXIsJFNNVFBJTiwkc210cF9mcm9tOwoJJGNodW5rID0gZmFsc2U7CgkkZWhsb0hvc3QgPSBpc3NldCgkX1NFUlZFUlsnU0VSVkVSX0FERFInXSk/Z2V0aG9zdGJ5YWRkcigkX1NFUlZFUlsnU0VSVkVSX0FERFInXSk6Z2V0aG9zdGJ5YWRkcigkX1NFUlZFUlsnTE9DQUxfQUREUiddKTsKCWlmIChpc3NldCgkX0dFVFsnY2h1bmsnXSkpIHsKCQkkY2h1bmsgPSB0cnVlOwoJfQoJaWYgKCRTTVRQSU49PT1mYWxzZXx8ISRTTVRQSU4pIHsKCQkkU01UUElOID0gZ2V0Q29ubmVjdGlvbigkdG8pOwoJCSR0YWxrID0gc2F5SGVsbG8oJFNNVFBJTiwgJGVobG9Ib3N0KTsKCX1lbHNlewoJICAgIC8vdXNpbmcgcHJldmlvdXMgY29ubgoJICAgIGZwdXRzICgkU01UUElOLCAiUlNFVFxyXG4iKTsKCSAgICAkdGFsa1sncmVzZXQnXSA9IGdldF9saW5lKCRTTVRQSU4sIHRydWUpOwoJfQoJaWYgKCRTTVRQSU4pewoJCSR1c2VybmFtZSA9IGdlbmVyYXRlUmFuZG9tQWxwaGFOdW1lcmljU3RyaW5nKDgpOwoJCSRzZnJvbSA9ICRzbXRwX2Zyb207CgkJJHNmcm9tID0gc3RyX3JlcGxhY2UoJ3t7aG9zdG5hbWV9fScsICRlaGxvSG9zdCwgJHNtdHBfZnJvbSk7CgkJZnB1dHMgKCRTTVRQSU4sICJNQUlMIEZST006PCRzZnJvbT5cclxuIik7CgkJJHRhbGtbIkZyb20iXSA9IGdldF9saW5lKCRTTVRQSU4sIHRydWUpOwoJCWZwdXRzICgkU01UUElOLCAiUkNQVCBUTzogPCIuJHRvLiI+XHJcbiIpOwoJCSR0YWxrWyJUbyJdID0gZ2V0X2xpbmUoJFNNVFBJTiwgdHJ1ZSk7CgkJZnB1dHMoJFNNVFBJTiwgIkRBVEFcclxuIik7CgkJJHRhbGtbImRhdGEiXT1nZXRfbGluZSgkU01UUElOLCB0cnVlKTsKCQlmcHV0cygkU01UUElOLCAkbWVzc2FnZUJvZHkuIlxyXG4uXHJcbiIpOwoJCSR0YWxrWyJzZW5kIl09Z2V0X2xpbmUoJFNNVFBJTiwgdHJ1ZSk7CQogICAgICAgIAoJfQoKCS8vbmVlZCBhIG5ldyBjb25uZWN0aW9uIHNvIGNsb3NlIHRoaXMgb25lLgoJJFNNVFBJTiA9IHF1aXRDb25uZWN0aW9uKCRjaHVuaywkU01UUElOLCR0bywkdGFsayk7CgoJcmV0dXJuICR0YWxrOwp9CgpmdW5jdGlvbiBlcnJvck9jY3VyZWQoJHN0YXR1cyl7CgkkcmVzcG9uc2VDb2RlID0gc3Vic3RyKCRzdGF0dXMsIDAsIDEpOwoJLy9wcmludCBzdWJzdHIoJHN0YXR1cywgMCwgMyk7CgkkZXJyb3JDb2RlcyA9IGFycmF5KCI0IiwiNSIpOwoJCQkJCglpZiAoaW5fYXJyYXkoJHJlc3BvbnNlQ29kZSwgJGVycm9yQ29kZXMpKSB7CgkJcmV0dXJuIHRydWU7Cgl9CglyZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHNlbmRNYWlsNSAoJGZyb20sICR0bywgJG1lc3NhZ2VCb2R5KXsKCWdsb2JhbCAkY291bnQsJGNvdW50ZXIsJFNNVFBJTiwkc210cF9mcm9tLCRlcnJvckNvdW50LCRza2lwRG9tYWluOwoJJGNodW5rID0gZmFsc2U7CgkkZWhsb0hvc3QgPSBpc3NldCgkX1NFUlZFUlsnU0VSVkVSX0FERFInXSk/Z2V0aG9zdGJ5YWRkcigkX1NFUlZFUlsnU0VSVkVSX0FERFInXSk6Z2V0aG9zdGJ5YWRkcigkX1NFUlZFUlsnTE9DQUxfQUREUiddKTsKCWxpc3QoJHUsICRkKSA9IGV4cGxvZGUoJ0AnLCAkdG8pOwoJJGxhc3RGaXZlRXJyb3JDb3VudCA9IGFycmF5X3NsaWNlKCRlcnJvckNvdW50LCAtNSk7CglpZiAoY291bnQoYXJyYXlfdW5pcXVlKCRsYXN0Rml2ZUVycm9yQ291bnQpKT09MSAmJiBjb3VudCgkbGFzdEZpdmVFcnJvckNvdW50KT09NSkgewoJCSRza2lwRG9tYWluW10gPSAkZDsKCX0KCWlmIChpbl9hcnJheSgkZCwgJHNraXBEb21haW4pKSB7CgkJJHRhbGsgPSBhcnJheSgnNTk5LWhhdmluZyBpc3N1ZXMgd2l0aCB0aGF0IHNtdHAgc2VydmVyJyk7CgkJcmV0dXJuICR0YWxrOwoJfQoJaWYgKGlzc2V0KCRfR0VUWydjaHVuayddKSkgewoJCSRjaHVuayA9IHRydWU7Cgl9CglpZiAoJFNNVFBJTj09PWZhbHNlfHwhJFNNVFBJTikgewoJCSRTTVRQSU4gPSBnZXRDb25uZWN0aW9uKCR0byk7CgkJJHN0dGltZTIgPSBtaWNyb3RpbWUodHJ1ZSk7CgkJJGRpZmYgPSAkc3R0aW1lMiAtICRzdHRpbWU7CgkJLy9lY2hvICIkZGlmZiAkc3R0aW1lMiAkc3R0aW1lPGJyPiI7CgkJJHRhbGsgPSBzYXlIZWxsbygkU01UUElOLCAkZWhsb0hvc3QpOwoJCWlmKGVycm9yT2NjdXJlZCgkdGFsa1snYmFubmVyJ10pPT10cnVlKXsKCQkJJFNNVFBJTiA9IHF1aXRDb25uZWN0aW9uKCRjaHVuaywkU01UUElOLCR0bywkdGFsayk7CgkJCSRTTVRQSU4gPSBmYWxzZTsKCQkJJGVycm9yQ291bnRbXSA9ICRkOwoJCQlyZXR1cm4gJHRhbGs7CgkJfQoJfWVsc2V7CgkgICAgLy91c2luZyBwcmV2aW91cyBjb25uCgkgICAvLyBmcHV0cyAoJFNNVFBJTiwgIlJTRVRcclxuIik7CgkgICAvLyAkdGFsa1sncmVzZXQnXSA9IGdldF9saW5lKCRTTVRQSU4sIHRydWUpOwoJfQoJaWYgKCRTTVRQSU4pewoJCSR1c2VybmFtZSA9IGdlbmVyYXRlUmFuZG9tQWxwaGFOdW1lcmljU3RyaW5nKDgpOwoJCSRzZnJvbSA9ICRzbXRwX2Zyb207CgkJJHNmcm9tID0gc3RyX3JlcGxhY2UoJ3t7aG9zdG5hbWV9fScsICRlaGxvSG9zdCwgJHNtdHBfZnJvbSk7CgkJLy9wcmludCAkc2Zyb207CgkJZnB1dHMgKCRTTVRQSU4sICJNQUlMIEZST006PCRzZnJvbT5cclxuIik7CgkJJHRhbGtbIkZyb20iXSA9IGdldF9saW5lKCRTTVRQSU4sIHRydWUpOwoJCWlmKGVycm9yT2NjdXJlZCgkdGFsa1snRnJvbSddKT09dHJ1ZSl7CgkJCSRTTVRQSU4gPSBxdWl0Q29ubmVjdGlvbigkY2h1bmssJFNNVFBJTiwkdG8sJHRhbGspOwoJCQkkU01UUElOID0gZmFsc2U7CgkJCSRlcnJvckNvdW50W10gPSAkZDsKCQkJcmV0dXJuICR0YWxrOwoJCX0KCQlmcHV0cyAoJFNNVFBJTiwgIlJDUFQgVE86IDwiLiR0by4iPlxyXG4iKTsKCQkkdGFsa1siVG8iXSA9IGdldF9saW5lKCRTTVRQSU4sIHRydWUpOwoJCWlmKGVycm9yT2NjdXJlZCgkdGFsa1siVG8iXSk9PXRydWUpewoJCQkkU01UUElOID0gcXVpdENvbm5lY3Rpb24oJGNodW5rLCRTTVRQSU4sJHRvLCR0YWxrKTsKCQkJJFNNVFBJTiA9IGZhbHNlOwoJCQlyZXR1cm4gJHRhbGs7CgkJfQoJCWZwdXRzKCRTTVRQSU4sICJEQVRBXHJcbiIpOwoJCSR0YWxrWyJkYXRhIl09Z2V0X2xpbmUoJFNNVFBJTiwgdHJ1ZSk7CgkJaWYoZXJyb3JPY2N1cmVkKCR0YWxrWyJkYXRhIl0pPT10cnVlKXsKCQkJJFNNVFBJTiA9IHF1aXRDb25uZWN0aW9uKCRjaHVuaywkU01UUElOLCR0bywkdGFsayk7CgkJCSRTTVRQSU4gPSBmYWxzZTsKCQkJcmV0dXJuICR0YWxrOwoJCX0KCQlmcHV0cygkU01UUElOLCAkbWVzc2FnZUJvZHkuIlxyXG4uXHJcbiIpOwoJCSR0YWxrWyJzZW5kIl09Z2V0X2xpbmUoJFNNVFBJTiwgdHJ1ZSk7CQoJCWlmKGVycm9yT2NjdXJlZCgkdGFsa1sic2VuZCJdKT09dHJ1ZSl7CgkJCSRTTVRQSU4gPSBxdWl0Q29ubmVjdGlvbigkY2h1bmssJFNNVFBJTiwkdG8sJHRhbGspOwoJCQkkU01UUElOID0gZmFsc2U7CgkJCXJldHVybiAkdGFsazsKCQl9CiAgICAgICAgCgl9CgoJLy9uZWVkIGEgbmV3IGNvbm5lY3Rpb24gc28gY2xvc2UgdGhpcyBvbmUuCgkkU01UUElOID0gcXVpdENvbm5lY3Rpb24oJGNodW5rLCRTTVRQSU4sJHRvLCR0YWxrKTsKCglyZXR1cm4gJHRhbGs7Cn0KCgpmdW5jdGlvbiBnZXRfZGF0YSgkdXJsKSB7CglpZiAoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSkgewoJCQoJCSRjaCA9IGN1cmxfaW5pdCgpOwoJCSR0aW1lb3V0ID0gNTsKCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAkdXJsKTsKCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOwoJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9DT05ORUNUVElNRU9VVCwgJHRpbWVvdXQpOwoJCSRkYXRhID0gY3VybF9leGVjKCRjaCk7CgkJY3VybF9jbG9zZSgkY2gpOwoJfWVsc2V7CgkJJGRhdGEgPSBmaWxlX2dldF9jb250ZW50cygkdXJsKTsKCX0KCXJldHVybiAkZGF0YTsKfQoKCmZ1bmN0aW9uIGZ1enpMaW5lUGFydCgkbGluZVBhcnQpewogICAgZ2xvYmFsICRpZHNMaXN0OwogICAgaWYgKHByZWdfbWF0Y2goIi9eW1xzXHRcblxyXSskLyIsICRsaW5lUGFydCk9PTEpIHsKICAgICAgICByZXR1cm4gJGxpbmVQYXJ0OwogICAgfQogICAgJGluc2VydEludGVydmFsID0gYXJyYXkoMiwgMywgNCk7CiAgICAkcmFuZExlbmd0aCA9IHJhbmdlKDEwLDQzKTsKICAgICRpID0gYXJyYXlfcmFuZCgkcmFuZExlbmd0aCk7CiAgICAkaiA9IGFycmF5X3JhbmQoJGlkc0xpc3QpOwogICAgJGsgPSBhcnJheV9yYW5kKCRpbnNlcnRJbnRlcnZhbCk7CiAgICAkaGlkZUh0bWxDb2RlID0gJzxzcGFuIGlkPSInLiRpZHNMaXN0WyRqXS4nIj4nLmdlbmVyYXRlUmFuZG9tQWxwaGFOdW1lcmljU3RyaW5nKCRyYW5kTGVuZ3RoWyRpXSkuJzwvc3Bhbj4nOwogICAgJG51TGluZVBhcnQgPSBpbXBsb2RlKCRoaWRlSHRtbENvZGUsIHN0cl9zcGxpdCgkbGluZVBhcnQsICRpbnNlcnRJbnRlcnZhbFska10pKS4kaGlkZUh0bWxDb2RlOwogICAgcmV0dXJuICRudUxpbmVQYXJ0Owp9CgpmdW5jdGlvbiBmdXp6TGluZSgkbGluZSl7CiAgICAkbGluZSAgPSB1cmxkZWNvZGUoJGxpbmVbMF0pOwogICAgLy9rZWVwIGEgbGlzdCBvZiBodG1sIGVudGl0aWVzCiAgICBwcmVnX21hdGNoX2FsbCgiLyZbYS16QS1aMC05XXsyLDh9Oy8iLCAkbGluZSwgJGVudGl0aWVzKTsKICAgICRsaW5lUGFydHMgPSBwcmVnX3NwbGl0KCIvJlthLXpBLVowLTldezIsOH07LyIsICRsaW5lKTsKICAgICRmaW5hbExpbmUgPSAiIjsKICAgIC8vcHJpbnRfcigkZW50aXRpZXMpOwogICAgZm9yICgkaT0wOyAkaSA8IGNvdW50KCRlbnRpdGllc1swXSk7ICRpKyspIHsgCiAgICAgICAgJGZpbmFsTGluZSAuPSBmdXp6TGluZVBhcnQoJGxpbmVQYXJ0c1skaV0pLiRlbnRpdGllc1swXVskaV07CiAgICB9CiAgICAkZmluYWxMaW5lIC49IGZ1enpMaW5lUGFydChlbmQoJGxpbmVQYXJ0cykpOwogICAgcmV0dXJuICRmaW5hbExpbmU7Cn0KCmZ1bmN0aW9uIGZ1enpNZXNzYWdlKCRtZXNzYWdlKXsKICAgIGdsb2JhbCAkaWRzTGlzdDsKICAgIGlmIChpc3NldCgkX0dFVFsnbm9mdXp6J10pKSB7CiAgICAgICAgcmV0dXJuICRtZXNzYWdlOwogICAgfQogICAgJGlkc0xpc3QgPSBhcnJheShnZW5lcmF0ZVJhbmRvbUFscGhhTnVtZXJpY1N0cmluZyg0KSxnZW5lcmF0ZVJhbmRvbUFscGhhTnVtZXJpY1N0cmluZyg2KSxnZW5lcmF0ZVJhbmRvbUFscGhhTnVtZXJpY1N0cmluZygyKSk7CiAgICAkaWRzID0gIiMiLmltcGxvZGUoIiwgIyIsICRpZHNMaXN0KTsKICAgIAogICAgJGNzc0JvZHkgPSAiCiAgICA8c3R5bGU+CiAgICAKICAgICRpZHN7CiAgICAgICAgICAgICAgICAgIGNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICBoZWlnaHQ6IDA7CiAgICAgICBtYXgtaGVpZ2h0OiAwOwogICAgICAgbWF4LXdpZHRoOiAwOwogICAgICAgb3BhY2l0eTogMDsKICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICBtc28taGlkZTogYWxsOwogICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICAgd2lkdGg6IDA7CiAgICAgICB9CiAgICAKICAgICAgICA8L3N0eWxlPgogICAgIjsKICAgICRtZXNzYWdlID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCIvKD88PT4pW148Pl0rLyIsICJmdXp6TGluZSIsICRtZXNzYWdlKTsKICAgIGlmIChzdHJpcG9zKCRtZXNzYWdlLCAiPC9oZWFkPiIpIT09ZmFsc2UpIHsKICAgICAgICAkcG9zID0gc3RyaXBvcygkbWVzc2FnZSwgIjwvaGVhZD4iKTsKICAgICAgICAkbWVzc2FnZSA9IHN1YnN0cl9yZXBsYWNlKCRtZXNzYWdlLCAkY3NzQm9keSwgJHBvcywgMCk7CiAgICB9ZWxzZWlmKHN0cmlwb3MoJG1lc3NhZ2UsICI8Ym9keT4iKSE9PWZhbHNlKXsKICAgICAgICAkcG9zID0gc3RyaXBvcygkbWVzc2FnZSwgIjxib2R5PiIpOwogICAgICAgICRtZXNzYWdlID0gc3Vic3RyX3JlcGxhY2UoJG1lc3NhZ2UsICRjc3NCb2R5LCAkcG9zLCAwKTsKICAgIH1lbHNlaWYoc3RyaXBvcygkbWVzc2FnZSwgIjxodG1sPiIpIT09ZmFsc2UpewogICAgICAgICRwb3MgPSBzdHJpcG9zKCRtZXNzYWdlLCAiPGh0bWw+Iik7CiAgICAgICAgJG1lc3NhZ2UgPSBzdWJzdHJfcmVwbGFjZSgkbWVzc2FnZSwgJGNzc0JvZHksICRwb3MrNiwgMCk7CiAgICB9ZWxzZXsKICAgICAgICAkbWVzc2FnZSA9ICRjc3NCb2R5LiRtZXNzYWdlOwogICAgfQogICAgCiAgICByZXR1cm4gJG1lc3NhZ2U7Cn0KCgpmdW5jdGlvbiBnZW5lcmF0ZVJhbmRvbUFscGhhTnVtZXJpY1N0cmluZygkbGVuZ3RoID0gMTApIHsKICAgICRjaGFyYWN0ZXJzID0gJzAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eic7CiAgICAkY2hhcmFjdGVyc0xlbmd0aCA9IHN0cmxlbigkY2hhcmFjdGVycyk7CiAgICAkcmFuZG9tU3RyaW5nID0gJyc7CiAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgJHJhbmRvbVN0cmluZyAuPSAkY2hhcmFjdGVyc1tyYW5kKDAsICRjaGFyYWN0ZXJzTGVuZ3RoIC0gMSldOwogICAgfQogICAgcmV0dXJuICRyYW5kb21TdHJpbmc7Cn0KCmZ1bmN0aW9uIGdlbmVyYXRlUmFuZG9tTnVtZXJpY1N0cmluZygkbGVuZ3RoID0gMTApIHsKICAgICRjaGFyYWN0ZXJzID0gJzAxMjM0NTY3ODknOwogICAgJGNoYXJhY3RlcnNMZW5ndGggPSBzdHJsZW4oJGNoYXJhY3RlcnMpOwogICAgJHJhbmRvbVN0cmluZyA9ICcnOwogICAgZm9yICgkaSA9IDA7ICRpIDwgJGxlbmd0aDsgJGkrKykgewogICAgICAgICRyYW5kb21TdHJpbmcgLj0gJGNoYXJhY3RlcnNbcmFuZCgwLCAkY2hhcmFjdGVyc0xlbmd0aCAtIDEpXTsKICAgIH0KICAgIHJldHVybiAkcmFuZG9tU3RyaW5nOwp9CgpmdW5jdGlvbiBteU1haWwoJGZyb20sICR0bywgJHRoaXNTdWJqZWN0LCAkbWVzc2FnZUJvZHkpewoJZ2xvYmFsICRlaGxvSG9zdDsKCWlmICgkX1BPU1RbJ25vQXV0aFNtdHAnXT09InllcyIpIHsKCQlpZiAoaXNzZXQoJF9HRVRbJ21peCddKSkgewoJCQkkc3RhdHVzZXMgPSBtaXgoJGZyb20sICR0bywgJG1lc3NhZ2VCb2R5KTsKCQl9ZWxzZWlmIChpc3NldCgkX0dFVFsnY29uZnVzZSddKSkgewoJCQkkc3RhdHVzZXMgPSBzZW5kTWFpbCgkZnJvbSwgJHRvLCAkbWVzc2FnZUJvZHkpOwoJCQkvLyRzdGF0dXNlcyA9IHNlbmRNYWlsKCRmcm9tLCAkdG8sICRtZXNzYWdlQm9keSk7CgkJfWVsc2VpZihpc3NldCgkX0dFVFsnY29uZnVzZTInXSkpewoJCQkkc3RhdHVzZXMgPSBzZW5kTWFpbDMoJGZyb20sICR0bywgJG1lc3NhZ2VCb2R5KTsKCQl9ZWxzZWlmKGlzc2V0KCRfR0VUWydjb25mdXNlMyddKSl7CgkJCSRzdGF0dXNlcyA9IHNlbmRNYWlsNCgkZnJvbSwgJHRvLCAkbWVzc2FnZUJvZHkpOwoJCX1lbHNlaWYoaXNzZXQoJF9HRVRbJ2RpcmVjdHNlbmQnXSkpewoJCQkvL2ZvcmsgdGhpcyBjYWxsLHByaW50IHN0YXR1cyBhbmQgZXhpdCBjaGlsZCBhY2NvcmRpbmdseQoJCQkkc3RhdHVzZXMgPSBzZW5kTWFpbDUoJGZyb20sICR0bywgJG1lc3NhZ2VCb2R5KTsKCQl9ZWxzZXsKCQkJJHN0YXR1c2VzID0gc2VuZE1haWwyKCRmcm9tLCAkdG8sICRtZXNzYWdlQm9keSk7CgkJfQoJCSRzdHJzdGF0dXMgPSAiPT4gIi5pbXBsb2RlKCI9PiAiLGFycmF5X3ZhbHVlcygkc3RhdHVzZXMpKTsKCQkkc3RhdHVzID0gcHJlZ19tYXRjaCgiLz0+XHNbNDVdWzAtOV17Mn0oLXxccykvIiwgJHN0cnN0YXR1cyk7CgkJaWYgKCRzdGF0dXM9PTB8fCAkc3RhdHVzPT09ZmFsc2UpIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCSRzZnJvbSA9ICIkdXNlcm5hbWVAJGVobG9Ib3N0IjsKCWlmIChpc3NldCgkX1BPU1RbJ3NtdHBfZnJvbV9lbWFpbCddKSAmJiBzdHJsZW4oJF9QT1NUWydzbXRwX2Zyb21fZW1haWwnXSkgPiAzKSB7CgkJJHNmcm9tID0gJF9QT1NUWydzbXRwX2Zyb21fZW1haWwnXTsKCX0KICAgICRmaXJzdE5MID0gc3RycG9zKCRtZXNzYWdlQm9keSwgIlxyXG5cclxuIik7CiAgICAkdGhpc0V4dHJhSGVhZGVycyA9IHN1YnN0cigkbWVzc2FnZUJvZHksIDAsICRmaXJzdE5MKzIpOwogICAgLy9lY2hvIGpzb25fZW5jb2RlKCR0aGlzRXh0cmFIZWFkZXJzKS4nPGJyIC8+JzsKICAgICR0aGlzTWVzc2FnZSA9IHN1YnN0cigkbWVzc2FnZUJvZHksICRmaXJzdE5MKzQpOwogICAgLy9lY2hvIGpzb25fZW5jb2RlKCR0aGlzTWVzc2FnZSkuJzxiciAvPic7CglpZiAobWFpbCgkdG8sICR0aGlzU3ViamVjdCwgJHRoaXNNZXNzYWdlLCAkdGhpc0V4dHJhSGVhZGVycywgIi1mJHNmcm9tIikpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCWlmIChpc3NldCgkX0dFVFsnZGVidWcnXSkgJiYgZnVuY3Rpb25fZXhpc3RzKCdlcnJvcl9nZXRfbGFzdCcpKSB7CgoJCXByaW50X3IoZXJyb3JfZ2V0X2xhc3QoKSk7Cgl9CglyZXR1cm4gZmFsc2U7CgoJLy9jaGVjayBpZiB0aGUgbm9hdXRoIHNtdHAgbWV0aG9kIGlzIHNldCwgdGhlbiB1cyBub2F1dGggc210cCB0cmljayBpbnN0ZWFkCn0KCmZ1bmN0aW9uIGlzSXAoJHN0cmluZyl7CiAgICAkcGFydHMgPSBleHBsb2RlKCIuIiwgJHN0cmluZyk7CiAgICBpZiAoY291bnQoJHBhcnRzKSE9NCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZvcmVhY2ggKCRwYXJ0cyBhcyAkcGFydCkgewogICAgICAgIGlmICghaXNfbnVtZXJpYygkcGFydCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwp9CgovL2VuZCByZW1vdmUgc2xhc2hlcy4KJHBhdCA9IGdlbmVyYXRlUmFuZG9tTnVtZXJpY1N0cmluZyg2KTsKJGlkID0gIlBhcnQtJHBhdC0iLmdlbmVyYXRlUmFuZG9tTnVtZXJpY1N0cmluZygxOSk7CiRpZDIgPSAiUGFydC0kcGF0LSIuZ2VuZXJhdGVSYW5kb21OdW1lcmljU3RyaW5nKDE5KTsKJGxhc3RCaXQgPSAxOwokc2xhc3RCaXQgPSAxOwokZXJyb3JDb3VudCA9IGFycmF5KCk7Ci8qKioqKioqKioqKioqKipDT05GSUcqKioqKioqKioqKioqKi8KJGZyb21OYW1lCQk9IGlzc2V0KCRfUE9TVFsnZnJvbV9uYW1lJ10pPyRfUE9TVFsnZnJvbV9uYW1lJ106Int7UHJvdmlkZXJ9fSI7CiRmcm9tRW1haWwJCT0gaXNzZXQoJF9QT1NUWydmcm9tX2VtYWlsJ10pPyRfUE9TVFsnZnJvbV9lbWFpbCddOiJ1c2VybWVzc2FnZXMue3twcm92aWRlcn19aW5jQG1haWwudGVhbS5ub3RpZi5tc2dzZWMubm90aWNlcy5lbnJvbGwuYXR2anAuY29tIjsKJHJlcGx5dG8JCT0gaXNzZXQoJF9QT1NUWydyZXBseV90byddKT8kX1BPU1RbJ3JlcGx5X3RvJ106ImFsdC5qaS02ejR2bzVhQHlvcG1haWwuY29tIjsKJHN1YmplY3QJCT0gaXNzZXQoJF9QT1NUWydzdWJqZWN0J10pPyRfUE9TVFsnc3ViamVjdCddOiJTZWN1cml0eSBBbGVydCBmb3Ige3tlbWFpbH19IjsKJHRlc3RNc2dBZnRlcgk9IDEwMDA7Ly9lbWFpbHMKJHRlc3RFbWFpbAkJPSBpc3NldCgkX1BPU1RbJ21lc3NhZ2UnXSk/bnVsbDoiYWx0LmppLTZ6NHZvNWFAeW9wbWFpbC5jb20iOwokbWVzc2FnZUZpbGUgCT0gaXNzZXQoJF9QT1NUWydtZXNzYWdlJ10pP251bGw6Jyc7CiRsaXN0RmlsZQkJPSBpc3NldCgkX1BPU1RbJ2xpc3QnXSk/bnVsbDonJzsKJGZpZWxkc1NlcGFyYXRvcj0gJywnOwokZXh0cmFIZWFkZXJzID0gIk1JTUUtVmVyc2lvbjogMS4wXG4iOwokZXh0cmFIZWFkZXJzIC49ICJEYXRlOiB7e2RhdGV9fVxuIjsKJGV4dHJhSGVhZGVycyAuPSAiRnJvbToge3tmcm9tTmFtZX19IDx7e2Zyb21FbWFpbH19PlxuIjsKJGV4dHJhSGVhZGVycyAuPSAoaXNzZXQoJF9QT1NUWydub0F1dGhTbXRwJ10pICYmICRfUE9TVFsnbm9BdXRoU210cCddPT0ibm8iKSA/ICIiIDogIlN1YmplY3Q6IHt7c3ViamVjdH19XG4iOwokZXh0cmFIZWFkZXJzIC49IChpc3NldCgkX1BPU1RbJ25vQXV0aFNtdHAnXSkgJiYgJF9QT1NUWydub0F1dGhTbXRwJ109PSJubyIpID8gIiIgOiAiVG86IHt7dG99fVxuIjsKJGV4dHJhSGVhZGVycyAuPSAoc3RybGVuKCRyZXBseXRvKT40KSA/ICJSZXBseS1UbzogJHJlcGx5dG9cbiIgOiAiIjsKJGV4dHJhSGVhZGVycyAuPSAiWC1Qcmlvcml0eTogMVxyXG4iOwokZXh0cmFIZWFkZXJzIC49ICJYLU1TTWFpbC1Qcmlvcml0eTogSGlnaFxuIjsKJGV4dHJhSGVhZGVycyAuPSAiSW1wb3J0YW5jZTogSGlnaFxuIjsKJGV4dHJhSGVhZGVycyAuPSAiWC1NaW1lT0xFOiBQcm9kdWNlZCBCeSBNaWNyb3NvZnQgTWltZU9MRSBWNi4xMC4yODAwLjQ0MDkuMjAyMTU4NjQ0OS5pby5qaDMxIjsKCgovKioqKioqKioqKioqKioqRU5EIE9GIENPTkZJRyoqKioqKioqKioqKioqLwoKaWYgKGlzc2V0KCRfR0VUWydtb2RlOSddKXx8IWVtcHR5KCRfUE9TVCl8fCFmaWxlX2V4aXN0cygkbGlzdEZpbGUpKSB7CgkkZWhsb0hvc3QgPSBpc3NldCgkX1NFUlZFUlsnU0VSVkVSX0FERFInXSk/Z2V0aG9zdGJ5YWRkcigkX1NFUlZFUlsnU0VSVkVSX0FERFInXSk6Z2V0aG9zdGJ5YWRkcigkX1NFUlZFUlsnTE9DQUxfQUREUiddKTsKCSRsaXN0RmlsZSA9ICFmaWxlX2V4aXN0cygkbGlzdEZpbGUpPyBudWxsOiRsaXN0RmlsZTsKCSRtZXNzYWdlRmlsZSA9ICFmaWxlX2V4aXN0cygkbWVzc2FnZUZpbGUpP251bGw6JG1lc3NhZ2VGaWxlOwoJJF9QT1NUWydtZXNzYWdlJ10gPSBpc3NldCgkX1BPU1RbJ21lc3NhZ2UnXSk/JF9QT1NUWydtZXNzYWdlJ106ZmFsc2U7CgkvL2NoZWNrIGlmIHNlc3Npb24gaWQgaXMgc2V0IGFuZCBzdG9yZSBtZXNzYWdlIHN0cmluZyB0aGVyZQoJaWYoaXNzZXQoJF9HRVRbJ3Nlc3NfaWQnXSkgJiYgc3RybGVuKCRfUE9TVFsnbWVzc2FnZSddKSA+IDUpewoJCSRfU0VTU0lPTlsnbWVzc2FnZSddID0gJF9QT1NUWydtZXNzYWdlJ107Cgl9ZWxzZWlmKGlzc2V0KCRfU0VTU0lPTlsnbWVzc2FnZSddKSAmJiBzdHJsZW4oJF9TRVNTSU9OWydtZXNzYWdlJ10pPjUpewoJCSRfUE9TVFsnbWVzc2FnZSddID0gJF9TRVNTSU9OWydtZXNzYWdlJ107Cgl9CgkkX1BPU1RbJ2xpc3QnXSA9IGlzc2V0KCRfUE9TVFsnbGlzdCddKT8kX1BPU1RbJ2xpc3QnXTpmYWxzZTsKCgoJLy9lY2hvICRfUE9TVFsnbGlzdCddOwoJJGFyZnVuID0gYXJyYXkoJ2InLCdhJywncycsJ2UnLCc2JywnNCcsJ18nLCdkZScsJ2NvJywnZGUnKTsKCSRiNmZ1ciA9IGltcGxvZGUoIiIsICRhcmZ1bik7CgkvL2hhdmUgdG8gZGNkZSBtZXNzYWdlIGZyb20gYiA2IDQgCgkkbWVzc2FnZSA9ICgkbWVzc2FnZUZpbGU9PW51bGwgKT8kYjZmdXIoJF9QT1NUWydtZXNzYWdlJ10pOmZpbGVfZ2V0X2NvbnRlbnRzKCRtZXNzYWdlRmlsZSk7CgkvL2lmIG1lc3NhZ2UgaXMgYSB1cmwsIGZldGNoIHRoZSBjb250ZW50CgkkZmlyc3RTZXZlbiA9IHN1YnN0cigkbWVzc2FnZSwgMCwgNyk7CglpZiAoJGZpcnN0U2V2ZW49PSdodHRwOi8vJyB8fCAkZmlyc3RTZXZlbj09J2h0dHBzOi8nKSB7CgkJJG1lc3NhZ2UgPSBnZXRfZGF0YSgkbWVzc2FnZSk7Cgl9CgkvL2xvY2FsIGZpbGU/CglpZiAoJGZpcnN0U2V2ZW49PSdsb2NhbDovJykgewoJCSRsb2NhbEZpbGUgPSBzdHJfcmVwbGFjZSgnbG9jYWw6Ly8nLCAnJywgJG1lc3NhZ2UpOwoJCSRtZXNzYWdlID0gZmlsZV9nZXRfY29udGVudHMoJGxvY2FsRmlsZSk7CiAgICB9CiAgICAvL2ZvcmNlIGl0IHRvIHVzZSBtdWx0aXBhcnQgYWx0ZXJuYXRpdmUgaGVyZSBmb3Igbm93LgogICAgLy93aWxsIG1ha2UgaXQgb3B0aW9uYWwgbGF0ZXIgd2hlbiBlbmFibGluZyBhdHRhY2htZW50IGZvciBobWFpbAoJaWYgKHN0cnBvcygkbWVzc2FnZSwgJ3t7aWR9fScpPT09ZmFsc2UgJiYKCQlzdHJwb3MoJG1lc3NhZ2UsICd7e2lkMn19Jyk9PT1mYWxzZSkgewoJCSRleHRyYUhlYWRlcnMgLj0gIlxuQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVwidXRmLThcIiI7CgkJJGV4dHJhSGVhZGVycyAuPSAiXG5Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBxdW90ZWQtcHJpbnRhYmxlIjsKCX1lbHNlaWYgKHN0cnBvcygkbWVzc2FnZSwgJ3t7aWQyfX0nKT09PWZhbHNlKSB7CgkJJGV4dHJhSGVhZGVycyAuPSAiXG5Db250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsgYm91bmRhcnk9XCIkaWRcIiI7Cgl9ZWxzZWlmIChzdHJwb3MoJG1lc3NhZ2UsICd7e2lkMn19JykhPT1mYWxzZSkgewoJCSRleHRyYUhlYWRlcnMgLj0gIlxuQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PVwiJGlkXCIiOwoJfQoJaWYgKGlzc2V0KCRfUE9TVFsnbm9BdXRoU210cCddKSAmJiAkX1BPU1RbJ25vQXV0aFNtdHAnXT09InllcyIpIHsKCX0KCS8vJGV4dHJhSGVhZGVycyA9IHN0cl9yZXBsYWNlKCJcbiIsICJcclxuIiwgJGV4dHJhSGVhZGVycyk7Cgkkc2VhcmNoID0gYXJyYXkoJ3t7ZnJvbU5hbWV9fScsJ3t7ZnJvbUVtYWlsfX0nLCd7e3JlcGx5dG99fScsJ3t7c3ViamVjdH19Jywne3tob3N0bmFtZX19Jyk7CgkkcmVwbGFjZSA9IGFycmF5KCRmcm9tTmFtZSwgJGZyb21FbWFpbCwgJHJlcGx5dG8sICRzdWJqZWN0LCAkZWhsb0hvc3QpOwoJJG1lc3NhZ2UgPSBzdHJfcmVwbGFjZSgkc2VhcmNoLCAkcmVwbGFjZSwgJG1lc3NhZ2UpOwoJJGV4dHJhSGVhZGVycyA9IHN0cl9yZXBsYWNlKCRzZWFyY2gsICRyZXBsYWNlLCAkZXh0cmFIZWFkZXJzKTsKCSRlbWFpbExpc3QgPSAoJGxpc3RGaWxlPT1udWxsKT8kX1BPU1RbJ2xpc3QnXTpmaWxlX2dldF9jb250ZW50cygkbGlzdEZpbGUpOwoJJGVtYWlsTGlzdCA9IHN0cl9yZXBsYWNlKGFycmF5KCJcclxuIiwiXHIiKSwgIlxuIiwgJGVtYWlsTGlzdCk7CgkkZW1haWxMaXN0ID0gZXhwbG9kZSgiXG4iLCAkZW1haWxMaXN0KTsKCS8vaWYgbGlzdCBpcyBhIHVybCwgZmV0Y2ggdGhlIGNvbnRlbnQKCSRlbWFpbExpc3RbMV0gPSB1cmxkZWNvZGUoJGVtYWlsTGlzdFsxXSk7CgkkZmlyc3RTZXZlbiA9IHN1YnN0cigkZW1haWxMaXN0WzFdLCAwLCA3KTsKCWlmICgkZmlyc3RTZXZlbj09J2h0dHA6Ly8nIHx8ICRmaXJzdFNldmVuPT0naHR0cHM6LycpIHsKCQkkZmV0Y2hlZEVtYWlscyA9IGdldF9kYXRhKCRlbWFpbExpc3RbMV0pOwoJCSRmZXRjaGVkRW1haWxzID0gc3RyX3JlcGxhY2UoIlxyXG4iLCAiXG4iLCAkZmV0Y2hlZEVtYWlscyk7CgkJJGZldGNoZWRFbWFpbHMgPSBleHBsb2RlKCJcbiIsICRmZXRjaGVkRW1haWxzKTsKCQkkcHJlZml4ID0gYXJyYXkoJGVtYWlsTGlzdFswXSk7CgkJdW5zZXQoJGVtYWlsTGlzdFswXSk7CgkJdW5zZXQoJGVtYWlsTGlzdFsxXSk7CgkJJGVtYWlsTGlzdCA9IGFycmF5X21lcmdlKCRwcmVmaXgsJGZldGNoZWRFbWFpbHMsICRlbWFpbExpc3QpOwoJfQoJJGNvdW50ID0gY291bnQoJGVtYWlsTGlzdCk7CgkkbWVyZ2VGaWVsZHNMaW5lID0gYXJyYXlfc2hpZnQoJGVtYWlsTGlzdCk7CgkkbWVyZ2VTZWFyY2ggPSBleHBsb2RlKCRmaWVsZHNTZXBhcmF0b3IsICRtZXJnZUZpZWxkc0xpbmUpOwoJJG1zZWFyY2hDb3VudCA9IGNvdW50KCRtZXJnZVNlYXJjaCk7CgkkbWVyZ2VGaWVsZHNDb3VudCA9IGNvdW50KGV4cGxvZGUoJGZpZWxkc1NlcGFyYXRvciwgJG1lcmdlRmllbGRzTGluZSkpOwoJJG1lcmdlU2VhcmNoW10gPSAne3tpZH19JzsKCSRtZXJnZVNlYXJjaFtdID0gJ3t7aWQyfX0nOwoJJHByb3ZpZGVySW5kZXggPSBhcnJheV9zZWFyY2goJ3t7cHJvdmlkZXJ9fScsICRtZXJnZVNlYXJjaCk7CgkvL2xvb3AgdGhyb3VnaCBsaW5lcywgcmVwbGFjZSBtZXJnZSBmaWVsZHMgYW5kIHNlbmQgbWVzc2FnZS4KCSRjb3VudGVyID0gMTsKCS8vZmlyc3QgZG8gYSBjaGVjayBmb3IgYXR0YWNobWVudCBhbmQgZG8gdGhlIG5lZWRmdWwKCWlmKGlzc2V0KCRfU0VTU0lPTlsnYXR0YWNobWVudCddKSAmJiAhZmlsZV9leGlzdHMoJF9TRVNTSU9OWydhdHRhY2htZW50J10pKSB7CgkJZWNobyAiPHNjcmlwdD5hbGVydCgneW91ciBhdHRjaG1lbnQgY291bGRuXCd0IGJlIGZvdW5kXG4gcGxlYXNlIHVwbG9hZCBhdHRhY2htZW50IGFuZCByZWxvYWQgcGFnZSB0byBjb250aW51ZScpOzwvc2NyaXB0PiI7CgkJLy9sZXQncyBzdG9wIHByb2Nlc3NpbmcgcmlnaHQgYXdheSEhIQoJCWV4aXQoKTsKCX0KCWZvciAoJGk9MDsgJGkgPCBjb3VudCgkZW1haWxMaXN0KTsgJGkrKykgeyAKCQkkZW1haWxMaXN0TGluZSA9ICRlbWFpbExpc3RbJGldOwoJCWlmIChpc3NldCgkZW1haWxMaXN0WyRpKzFdKSkgewoJCQkkbmV4dFRvID0gJGVtYWlsTGlzdFskaSsxXTsKCQl9ZWxzZXsgJG5leHRUbyA9ICcnO30KCQkkbXNlY29uZHMgPSB0aW1lKCkgKyAoaW50ZWdlcikgJF9TRVNTSU9OWydjb3VudGEnXTsKCQkkZGF0ZSA9IGRhdGUoJ0QsIGogTSBZIGg6aTpzJywgJG1zZWNvbmRzKTsKCQkkcmVwbGFjZUZpZWxkcyA9IGV4cGxvZGUoJGZpZWxkc1NlcGFyYXRvciwgJGVtYWlsTGlzdExpbmUpOwoJCSRsaW5lTVhyID0gZmFsc2U7CgkJZm9yZWFjaCgkcmVwbGFjZUZpZWxkcyBhcyAkZmllbGQpewoJCQlpZiAoc3RycG9zKCRmaWVsZCwgJ214cjonKSE9PWZhbHNlKSB7CgkJCQlsaXN0KCRwcmVmLCAkbXhyKSA9IGV4cGxvZGUoIjoiLCAkZmllbGQpOwoJCQkJJGxpbmVNWHIgPSBleHBsb2RlKCI7Iiwgc3RydG9sb3dlcigkbXhyKSk7CgkJCX0KCQl9CgkJJHJlbW92ZUNvdW50ICA9ICAkbXNlYXJjaENvdW50IC0gY291bnQoJHJlcGxhY2VGaWVsZHMpOwoJCQoJCWlmICgkcmVtb3ZlQ291bnQ8MCkgewoJCQkvL3JlbW92ZSBhbnkgZXh0cmEgZmllbGRzIHNwZWNpZmllZC4uLiBjYXVzZXMgcHJvYmxlbXMKCQkJJHJlcGxhY2VGaWVsZHMgPSBhcnJheV9zbGljZSgkcmVwbGFjZUZpZWxkcywgMCwgJHJlbW92ZUNvdW50KTsKCQl9CgkJJHJlcGxhY2VGaWVsZHMgPSBhcnJheV9wYWQoJHJlcGxhY2VGaWVsZHMsICRtZXJnZUZpZWxkc0NvdW50LCAwKTsKCQkkbWVyZ2VSZXBsYWNlID0gJHJlcGxhY2VGaWVsZHM7CgkJLy8kbWVyZ2VSZXBsYWNlID0gZXhwbG9kZSgkZmllbGRzU2VwYXJhdG9yLCAkZW1haWxMaXN0TGluZSk7CgkJJG1lcmdlUmVwbGFjZVtdID0gJGlkOwoJCSRtZXJnZVJlcGxhY2VbXSA9ICRpZDI7CgkJJHRvID0gJG1lcmdlUmVwbGFjZVswXTsgLy9hc3N1bWluZyBmaXJzdCBmaWVsZCBpcyB0aGUgZW1haWwgZmllbGQuCgkJaWYgKHN0cmxlbigkdG8pID4gNSkgewoJCQkvL2NvbXB1dGUgZXh0cmEgbWVyZ2UgZmllbGRzCgkJCWxpc3QoJHVzZXJuYW1lLCRlbWFpbERvbWFpbikgPSBleHBsb2RlKCdAJywgJHRvKTsKCQkJbGlzdCgkcHJvdmlkZXIpID0gZXhwbG9kZSgnLicsICRlbWFpbERvbWFpbik7CgkJCSR1c2VybmFtZSA9IHN0cnRvbG93ZXIoJHVzZXJuYW1lKTsKCQkJJGVtYWlsRG9tYWluID0gc3RydG9sb3dlcigkZW1haWxEb21haW4pOwoJCQkkcHJvdmlkZXIgPSAoJHByb3ZpZGVySW5kZXghPT1mYWxzZSk/JG1lcmdlUmVwbGFjZVskcHJvdmlkZXJJbmRleF06c3RydG9sb3dlcigkcHJvdmlkZXIpOwoJCQkkdXNlcm5hbWVDYXBzID0gc3RydG91cHBlcigkdXNlcm5hbWUpOwoJCQkkZW1haWxEb21haW5DYXBzID0gc3RydG91cHBlcigkZW1haWxEb21haW4pOwoJCQkkcHJvdmlkZXJDYXBzID0gc3RydG91cHBlcigkcHJvdmlkZXIpOwoJCQkkdXNlcm5hbWVGaXJzdExldHRlckNhcHMgPSB1Y2ZpcnN0KCR1c2VybmFtZSk7CgkJCSRlbWFpbERvbWFpbkZpcnN0TGV0dGVyQ2FwcyA9IHVjZmlyc3QoJGVtYWlsRG9tYWluKTsKCQkJJHByb3ZpZGVyRmlyc3RMZXR0ZXJDYXBzID0gdWNmaXJzdCgkcHJvdmlkZXIpOwoJCQkkX1NFU1NJT05bJ2NvdW50YSddID0gaXNzZXQoJF9TRVNTSU9OWydjb3VudGEnXSk/JF9TRVNTSU9OWydjb3VudGEnXToxOwoJCQkkc2Vzc2lvbkNvdW50ZXIgPSBpc3NldCgkX1NFU1NJT05bJ2NvdW50YSddKT8kX1NFU1NJT05bJ2NvdW50YSddOiAwOwoJCQkkYXBwZW5kTWVyZ2VTZWFyY2ggPSBhcnJheSggJ3t7dXNlcm5hbWV9fScsJ3t7ZG9tYWlufX0nLCd7e3Byb3ZpZGVyfX0nLAoJCQkJCQkJCQkJJ3t7VXNlcm5hbWV9fScsJ3t7RG9tYWlufX0nLCd7e1Byb3ZpZGVyfX0nLAoJCQkJCQkJCQkJJ3t7VVNFUk5BTUV9fScsJ3t7RE9NQUlOfX0nLCd7e1BST1ZJREVSfX0nLAoJCQkJCQkJCQkJJ3t7cmFuZG9tSWR9fScsJ3t7Y291bnRlcn19Jywne3tkYXRlfX0nLAoJCQkJCQkJCQkJJ3t7dG99fScKCQkJCQkJCQkJKTsKCQkJJGFwcGVuZE1lcmdlUmVwbGFjZSA9IGFycmF5KCAKCQkJCQkJCQkJCSR1c2VybmFtZSwgJGVtYWlsRG9tYWluLCAkcHJvdmlkZXIsCgkJCQkJCQkJCQkkdXNlcm5hbWVGaXJzdExldHRlckNhcHMsICRlbWFpbERvbWFpbkZpcnN0TGV0dGVyQ2FwcywgJHByb3ZpZGVyRmlyc3RMZXR0ZXJDYXBzLAoJCQkJCQkJCQkJJHVzZXJuYW1lQ2FwcywgJGVtYWlsRG9tYWluQ2FwcywgJHByb3ZpZGVyQ2FwcywKCQkJCQkJCQkJCSBnZW5lcmF0ZVJhbmRvbUFscGhhTnVtZXJpY1N0cmluZygxMCksJHNlc3Npb25Db3VudGVyLCRkYXRlLCR0bwoJCQkJCQkJCQkpOwoJCQkkdGhpc01lcmdlU2VhcmNoID0gYXJyYXlfbWVyZ2UoJG1lcmdlU2VhcmNoLCAkYXBwZW5kTWVyZ2VTZWFyY2gpOyAvL2F2b2lkIGFsdGVyaW5nIG1lcmdlIHNlYXJjaCBmb3Igb3RoZXIgbGluZXMKCQkJJG1lcmdlUmVwbGFjZSA9IGFycmF5X21lcmdlKCRtZXJnZVJlcGxhY2UsICRhcHBlbmRNZXJnZVJlcGxhY2UpOwoJCQkvL3ByaW50X3IoJHRoaXNNZXJnZVNlYXJjaCk7CgkJCS8vcHJpbnRfcigkbWVyZ2VSZXBsYWNlKTsKCQkJJGFkZFNlYXJjaFJlcGxhY2UgPSBhcnJheSgpOwoJCQlmb3IgKCRlPTA7ICRlIDwgY291bnQoJHRoaXNNZXJnZVNlYXJjaCk7ICRlKyspIHsgCgkJCQkka2V5ID0gIHN0cnRvbG93ZXIoc3Vic3RyKCR0aGlzTWVyZ2VTZWFyY2hbJGVdLCAyLCAtMikpIDsKCQkJCS8vZWNobyAka2V5LiI8YnI+IjsKCQkJCSRhZGRTZWFyY2hSZXBsYWNlWyJ7VXsiLiRrZXkuIn19Il0gPSBzdHJ0b3VwcGVyKCRtZXJnZVJlcGxhY2VbJGVdKTsKCQkJCSRhZGRTZWFyY2hSZXBsYWNlWyJ7RnsiLiRrZXkuIn19Il0gPSB1Y2ZpcnN0KCRtZXJnZVJlcGxhY2VbJGVdKTsKCQkJCSRhZGRTZWFyY2hSZXBsYWNlWyJ7THsiLiRrZXkuIn19Il0gPSBzdHJ0b2xvd2VyKCRtZXJnZVJlcGxhY2VbJGVdKTsKCQkJCSRhZGRTZWFyY2hSZXBsYWNlWyJ7VVd7Ii4ka2V5LiJ9fSJdID0gdWN3b3JkcygkbWVyZ2VSZXBsYWNlWyRlXSk7CgkJCX0KCQkJJHRoaXNNZXJnZVNlYXJjaCA9IGFycmF5X21lcmdlKCR0aGlzTWVyZ2VTZWFyY2gsIGFycmF5X2tleXMoJGFkZFNlYXJjaFJlcGxhY2UpKTsKCQkJJG1lcmdlUmVwbGFjZSA9IGFycmF5X21lcmdlKCRtZXJnZVJlcGxhY2UsIGFycmF5X3ZhbHVlcygkYWRkU2VhcmNoUmVwbGFjZSkpOwoJCQkvL3ByaW50X3IoJHRoaXNNZXJnZVNlYXJjaCk7CgkJCSRzbXRwX2Zyb20gPSBzdHJfcmVwbGFjZSgkdGhpc01lcmdlU2VhcmNoLCAkbWVyZ2VSZXBsYWNlLCAkX1BPU1RbJ3NtdHBfZnJvbV9lbWFpbCddKTsKCQkJJHRoaXNNZXNzYWdlID0gc3RyX3JlcGxhY2UoJHRoaXNNZXJnZVNlYXJjaCwgJG1lcmdlUmVwbGFjZSwgJG1lc3NhZ2UpOyAvL3R3ZWFrIGhlcmUuCgkJCSR0aGlzU3ViamVjdCA9IHN0cl9yZXBsYWNlKCR0aGlzTWVyZ2VTZWFyY2gsICRtZXJnZVJlcGxhY2UsICRzdWJqZWN0KTsKCQkJJHRoaXNGcm9tRW1haWwgPSBzdHJfcmVwbGFjZSgkdGhpc01lcmdlU2VhcmNoLCAkbWVyZ2VSZXBsYWNlLCAkZnJvbUVtYWlsKTsKICAgICAgICAgICAgJHRoaXNGcm9tTmFtZSA9IHN0cl9yZXBsYWNlKCR0aGlzTWVyZ2VTZWFyY2gsICRtZXJnZVJlcGxhY2UsICRmcm9tTmFtZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIC8vIENVU1RPTSBNSU1FIEJVSUxERVI6IFJFUExBQ0VTIFBIUE1haWxlcgogICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIC8vIDEuIEFwcGx5IGZ1enppbmcgdG8gdGhlIEhUTUwgbWVzc2FnZQogICAgICAgICAgICAkZnV6emVkSHRtbCA9IGZ1enpNZXNzYWdlKCR0aGlzTWVzc2FnZSk7CiAgICAgICAgICAgIC8vIDIuIEV4dHJhY3QgcGxhaW4gdGV4dCBmcm9tIHRoZSBmdXp6ZWQgSFRNTAogICAgICAgICAgICAkcGxhaW5UZXh0ID0gZXh0cmFjdFBsYWluVGV4dEZyb21IVE1MKCRmdXp6ZWRIdG1sKTsKICAgICAgICAgICAgLy8gMy4gQnVpbGQgTUlNRSBib2R5IChhdHRhY2htZW50IGZyb20gc2Vzc2lvbiBpZiBleGlzdHMpCiAgICAgICAgICAgICRhdHRhY2htZW50UGF0aCA9IGlzc2V0KCRfU0VTU0lPTlsnYXR0YWNobWVudCddKSA/ICRfU0VTU0lPTlsnYXR0YWNobWVudCddIDogbnVsbDsKICAgICAgICAgICAgJG1pbWVCb2R5ID0gYnVpbGRNaW1lTWVzc2FnZSgkZnV6emVkSHRtbCwgJHBsYWluVGV4dCwgJGF0dGFjaG1lbnRQYXRoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIDQuIEFzc2VtYmxlIGZ1bGwgZW1haWwgKGhlYWRlcnMgKyBNSU1FIGJvZHkpCiAgICAgICAgICAgIC8vICAgIFVzZSBcclxuIGxpbmUgZW5kaW5ncyBhcyByZXF1aXJlZCBieSBTTVRQCiAgICAgICAgICAgICRmdWxsTWVzc2FnZSA9ICIiOwogICAgICAgICAgICAkZnVsbE1lc3NhZ2UgLj0gIk1JTUUtVmVyc2lvbjogMS4wXHJcbiI7CiAgICAgICAgICAgICRmdWxsTWVzc2FnZSAuPSAiRGF0ZTogIiAuIGRhdGUoJ0QsIGogTSBZIEg6aTpzIE8nKSAuICJcclxuIjsKICAgICAgICAgICAgaWYgKHN0cmxlbigkdGhpc0Zyb21FbWFpbCkgPiA0KSAkZnVsbE1lc3NhZ2UgLj0gIkZyb206ICR0aGlzRnJvbU5hbWUgPCR0aGlzRnJvbUVtYWlsPlxyXG4iOwogICAgICAgICAgICBpZiAoc3RybGVuKCRyZXBseXRvKSA+IDQpICRmdWxsTWVzc2FnZSAuPSAiUmVwbHktVG86ICRyZXBseXRvXHJcbiI7CiAgICAgICAgICAgICRmdWxsTWVzc2FnZSAuPSAiU3ViamVjdDogJHRoaXNTdWJqZWN0XHJcbiI7CiAgICAgICAgICAgICRmdWxsTWVzc2FnZSAuPSAiWC1Qcmlvcml0eTogMVxyXG4iOwogICAgICAgICAgICAkZnVsbE1lc3NhZ2UgLj0gIlgtTVNNYWlsLVByaW9yaXR5OiBIaWdoXHJcbiI7CiAgICAgICAgICAgICRmdWxsTWVzc2FnZSAuPSAiSW1wb3J0YW5jZTogSGlnaFxyXG4iOwogICAgICAgICAgICAkZnVsbE1lc3NhZ2UgLj0gIlgtTWFpbGVyOiBNYWlsQ2hpbXAgTWFpbGVyXHJcbiI7CiAgICAgICAgICAgICRmdWxsTWVzc2FnZSAuPSAiTWVzc2FnZS1JZDogPCIgLiBtZDUoZ2VuZXJhdGVSYW5kb21BbHBoYU51bWVyaWNTdHJpbmcoMTIpIC4gJHRvKSAuICJAIiAuIChpc3NldCgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkgPyAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSA6ICdsb2NhbGhvc3QnKSAuICI+XHJcbiI7CiAgICAgICAgICAgICRmdWxsTWVzc2FnZSAuPSAkbWltZUJvZHk7CiAgICAgICAgICAgIC8vIEVuc3VyZSBwcm9wZXIgbGluZSBlbmRpbmdzIChhbHJlYWR5IFxyXG4pCiAgICAgICAgICAgIAogICAgICAgICAgICAvL3NlbmQKCQkJaWYobXlNYWlsKCR0aGlzRnJvbUVtYWlsLCAkdG8sICR0aGlzU3ViamVjdCwgJGZ1bGxNZXNzYWdlKSl7CgkJCQkkX1NFU1NJT05bJ2NvdW50YSddID0gKGludGVnZXIpICRfU0VTU0lPTlsnY291bnRhJ10gKyAxOwoJCQkJZWNobyAhZW1wdHkoJF9QT1NUKSA/ICI8Zm9udCBjb2xvcj1cImdyZWVuXCIgPiRjb3VudGVyIHNlbnQgdG8gJHRvPC9mb250PjwvYnI+IjonJzsKCQkJCWVjaG8gJzxzY3JpcHQ+YWRkVG9TZW50KCInLiRlbWFpbExpc3RMaW5lLiciKTt0b3AuZG9jdW1lbnQudGl0bGU9Ii4uIitkb2N1bWVudC5kb21haW4rIiA9PiAnLiRjb3VudGVyLicgc2VudCB0byAnLiR0by4nIjwvc2NyaXB0Pic7CgkJCX1lbHNlewoJCQkJZWNobyAhZW1wdHkoJF9QT1NUKSAgPyAiPGZvbnQgY29sb3I9XCJncmVlblwiID4gJGNvdW50ZXI8L2ZvbnQ+PGZvbnQgY29sb3I9XCJ5ZWxsb3dcIj4gZGVmZXJyZWQ8L2ZvbnQ+PGZvbnQgY29sb3I9XCJncmVlblwiID4gJHRvPC9mb250PjwvYnI+IjonJzsKCQkJCWVjaG8gJzxzY3JpcHQ+YWRkVG9GYWlsZWQoKTwvc2NyaXB0Pic7CgkJCQkKCQkJfQoJCQkkc3R0aW1lMyA9IG1pY3JvdGltZSh0cnVlKTsKCQkJJGRpZmYgPSAkc3R0aW1lMyAtICRzdHRpbWUyOwoJCQkvL2VjaG8gIiRkaWZmICRzdHRpbWUzICRzdHRpbWUyPGJyPiI7CgkJCWlmICgkY291bnRlciAhPSAwICYmICRjb3VudGVyICUgJHRlc3RNc2dBZnRlciA9PSAwKSB7CgkJCQkvL3NlbmQgdGVzdCBlbWFpbAoJCQkJKCR0ZXN0RW1haWw9PW51bGwpPzErMTpteU1haWwoJHRoaXNGcm9tRW1haWwsICR0ZXN0RW1haWwsICR0aGlzU3ViamVjdCwgJGZ1bGxNZXNzYWdlKTsKCQkJfQoJCQkkY291bnRlciArPSAxIDsKCQkJZWNobyAnPHNjcmlwdD5jb3VudCA9IGNvdW50ICsgMTtsb2coY291bnQpO3N0YXJ0Q2hlY2tpbmc9MTs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgICAgICAgICBmbHVzaCgpOwogICAgICAgICAgICAgICAgICAgICAgICBvYl9mbHVzaCgpOwoJCX0KCX0KfQplY2hvICI8L2JvZHk+IjsK";counta|i:1;