{"md5":"36085499a539d4543b1ec0f59f1ad0c7","b64content":"PD9waHAKLyoqCiAqIFNpdGVHdWFyZGluZyB0b29scyBpbnN0YWxsZXIgZm9yIGN1c3RvbWVyJ3MgcGFuZWwKICoKICogaHR0cHM6Ly93d3cuc2l0ZWd1YXJkaW5nLmNvbQogKiBEbyBub3QgZGlzdHJpYnV0ZSBvciBzaGFyZS4KICogCiAqIHZlci46IDIuNAogKiBEYXRlOiAwOCBBcHJpbCAyMDI2CiAqLwokYWxsb3dlZF9JUHMgPSBhcnJheSgKICAgICcxOTguNy41OS4xNjcnLAogICAgJzE5OC43LjU5LjE2OCcsCik7CgpkZWZpbmUoJ1ZFUlNJT04nLCAnMi40Jyk7CgpkZWZpbmUoJ0RFQlVHX01PREUnLCBmYWxzZSk7CgpkZWZpbmUoJ1NJVEVHVUFSRElOR19TRVJWRVInLCAnaHR0cDovL3d3dy5zaXRlZ3VhcmRpbmcuY29tL2V4dC9wYW5lbF9hcGkvaW5kZXgucGhwJyk7CgokcHJpdmF0ZV9wZ3Bfa2V5ID0gJy0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLQpNSUlCVndJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0FVRXdnZ0U5QWdFQUFrRUFwdncvaXgzazIvRC95TWxoCnU5TGhucFA2cG5hLzkxSitWNGowSGVBaUNtUXU4d3FuYVF0WEJVSUxVWWs2anF1K0tlbXVNTnpvY2ZBN3J4RVcKUFdUQ3JRSURBUUFCQWtFQWhKdTdwckhseGxoNytLc2NaemxRSFV2cytIZERlWmhVWnhXR3I1Y0gwWEYzZU5vYwo4dFJGOWtWb0l3Y0FPY3BNOHMxbmdrdjgzd1E5b2tEOXRZeHdqUUloQU5LemVrbVJwZHAwZE94dytJY3RrV3VHCmgwaEE1STV2VWNic005UTg2dHpiQWlFQXl1TEF0RzE3dWNESmxqNjRlbHRBY3lwMm1TZFM5eHpHMWg4enhTeWYKTVJjQ0lRQ0h0SFVVb1N3ek1VS0ZicFdEYXdQNFB5TXVsQzBnMSszUnN4d0duRjJnZFFJaEFNa0lDZjQrQmJ5MwpKSWcxT2NJenJSYndXbmZER1ZnMk1XZDFuMnllbkZhZEFpRUF6bERWVkdONEZuLzBWTTBwV0Q3MWhLdzlUSzNYCmJTNHhwa3lRbERLQzk2Yz0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLSc7CgoKJHNjYW5fcGF0aCA9IGRpcm5hbWUoX19GSUxFX18pOwppZiAoIWRlZmluZWQoJ0RJUlNFUCcpKQp7CiAgICBpZiAoc3RydG91cHBlcihzdWJzdHIoUEhQX09TLCAwLCAzKSkgPT09ICdXSU4nKSBkZWZpbmUoJ0RJUlNFUCcsICdcXCcpOwogICAgZWxzZSBkZWZpbmUoJ0RJUlNFUCcsICcvJyk7Cn0KZGVmaW5lKCdXRUJTSVRFX1JPT1QnLCBkaXJuYW1lKF9fRklMRV9fKS5ESVJTRVApOwoKCi8vIEluaXQKZGF0ZV9kZWZhdWx0X3RpbWV6b25lX3NldCgnRXVyb3BlL0xvbmRvbicpOwppZ25vcmVfdXNlcl9hYm9ydCh0cnVlKTsKZXJyb3JfcmVwb3J0aW5nKCAwICk7CmluaV9zZXQoJ2Vycm9yX2xvZycsICcnKTsKaW5pX3NldCgnbG9nX2Vycm9ycycsIDApOwppbmlfc2V0KCdtYXhfZXhlY3V0aW9uX3RpbWUnLCA3MjAwKTsKc2V0X3RpbWVfbGltaXQoIDcyMDAgKTsKaW5pX3NldCgnbWVtb3J5X2xpbWl0JywgJzEwMjRNJyk7CgoKLyoqCiAqIFN0YXJ0CiAqLwokaXBfYWRkcmVzcyA9IGlzc2V0KCRfU0VSVkVSWyJSRU1PVEVfQUREUiJdKSA\/ICRfU0VSVkVSWyJSRU1PVEVfQUREUiJdIDogJzEyNy4wLjAuMSc7CgovLyBGb3J3YXJkZWQgaGVhZGVycyBhcmUgb25seSB0cnVzdGVkIHdoZW4gdGhlIHJlYWwgVENQIGNvbm5lY3Rpb24gKFJFTU9URV9BRERSKQovLyBjb21lcyBmcm9tIGEga25vd24gcmV2ZXJzZS1wcm94eSByYW5nZSAoQ2xvdWRmbGFyZSwgaW50ZXJuYWwgbG9hZC1iYWxhbmNlcnMsIGV0Yy4pLgovLyBBY2NlcHRpbmcgdGhlbSBmcm9tIGFyYml0cmFyeSBjbGllbnRzIGFsbG93cyB0cml2aWFsIElQLXdoaXRlbGlzdCBieXBhc3MuCiR0cnVzdGVkX3Byb3hpZXMgPSBhcnJheSgnMTI3LjAuMC4xJywgJzo6MScpOwppZiAoaW5fYXJyYXkoJGlwX2FkZHJlc3MsICR0cnVzdGVkX3Byb3hpZXMsIHRydWUpKSB7CiAgICBpZiAoaXNzZXQoJF9TRVJWRVJbIkhUVFBfQ0ZfQ09OTkVDVElOR19JUCJdKSAmJiAkX1NFUlZFUlsiSFRUUF9DRl9DT05ORUNUSU5HX0lQIl0gIT09ICcnKSB7CiAgICAgICAgJGlwX2FkZHJlc3MgPSB0cmltKCRfU0VSVkVSWyJIVFRQX0NGX0NPTk5FQ1RJTkdfSVAiXSk7CiAgICB9IGVsc2VpZiAoaXNzZXQoJF9TRVJWRVJbIkhUVFBfWF9SRUFMX0lQIl0pICYmICRfU0VSVkVSWyJIVFRQX1hfUkVBTF9JUCJdICE9PSAnJykgewogICAgICAgICRpcF9hZGRyZXNzID0gdHJpbSgkX1NFUlZFUlsiSFRUUF9YX1JFQUxfSVAiXSk7CiAgICB9IGVsc2VpZiAoaXNzZXQoJF9TRVJWRVJbIkhUVFBfWF9GT1JXQVJERURfRk9SIl0pICYmICRfU0VSVkVSWyJIVFRQX1hfRk9SV0FSREVEX0ZPUiJdICE9PSAnJykgewogICAgICAgIC8vIFgtRm9yd2FyZGVkLUZvciBtYXkgY29udGFpbiBhIGNvbW1hLXNlcGFyYXRlZCBjaGFpbjsgdGhlIGxlZnRtb3N0IGlzIHRoZSBjbGllbnQKICAgICAgICAkeGZmID0gZXhwbG9kZSgnLCcsICRfU0VSVkVSWyJIVFRQX1hfRk9SV0FSREVEX0ZPUiJdKTsKICAgICAgICAkaXBfYWRkcmVzcyA9IHRyaW0oJHhmZlswXSk7CiAgICB9Cn0KCmlmIChERUJVR19NT0RFKSBTYXZlTG9nKCdTdGFydCBzZXNzaW9uIGZvciAnLiRpcF9hZGRyZXNzKTsKJHRhc2tfaWQgPSAnJzsKaWYgKGlzc2V0KCRfUkVRVUVTVFsndGFza19pZCddKSAmJiAkX1JFUVVFU1RbJ3Rhc2tfaWQnXSAhPT0gbnVsbCkgJHRhc2tfaWQgPSB0cmltKCRfUkVRVUVTVFsndGFza19pZCddKTsKaWYgKCR0YXNrX2lkID09ICcnICYmIGlzc2V0KCRfUE9TVFsndGFza19pZCddKSAmJiAkX1BPU1RbJ3Rhc2tfaWQnXSAhPT0gbnVsbCkgJHRhc2tfaWQgPSB0cmltKCRfUE9TVFsndGFza19pZCddKTsKaWYgKCR0YXNrX2lkID09ICcnKSBkaWUoJ3NpdGVndWFyZGluZ190b29scy5waHAgaXMgb2sgKHZlci4gJy5WRVJTSU9OLicpJy5DaGVja0Vycm9yKCkpOwoKJHJlbW90ZV9tZDUgPSBpc3NldCgkX1JFUVVFU1RbJ2xhdGVzdF9tZDUnXSkgJiYgJF9SRVFVRVNUWydsYXRlc3RfbWQ1J10gIT09IG51bGwgPyB0cmltKCRfUkVRVUVTVFsnbGF0ZXN0X21kNSddKSA6ICcnOyAKJGxhdGVzdF92ZXIgPSBpc3NldCgkX1JFUVVFU1RbJ2xhdGVzdF92ZXInXSkgJiYgJF9SRVFVRVNUWydsYXRlc3RfdmVyJ10gIT09IG51bGwgPyB0cmltKCRfUkVRVUVTVFsnbGF0ZXN0X3ZlciddKSA6ICcnOyAKCgovKioKICogQWN0aW9ucyB3aXRob3V0IGF1dGhvcml6YXRpb24KICovCgoKCi8vIENoZWNrIGlmIHJlcXVlc3QgY2FtZSBmcm9tIGFsbG93ZWQgSVAgYWRkcmVzcwokaXNfYWxsb3dlZF9zZXNzaW9uID0gZmFsc2U7CmZvcmVhY2ggKCRhbGxvd2VkX0lQcyBhcyAkaXApCnsKICAgIGlmICgkaXBfYWRkcmVzcyA9PSB0cmltKCRpcCkpCiAgICB7CiAgICAgICAgJGlzX2FsbG93ZWRfc2Vzc2lvbiA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICB9Cn0KCmlmIChERUJVR19NT0RFKSBTYXZlTG9nKCdTZXNzaW9uIGlzICcudmFyX2V4cG9ydCgkaXNfYWxsb3dlZF9zZXNzaW9uLCB0cnVlKSk7CgovLyBDaGVjayBieSBob3N0CmlmICgkaXNfYWxsb3dlZF9zZXNzaW9uID09PSBmYWxzZSkKewogICAgJGhvc3QgPSBnZXRob3N0YnlhZGRyKCRpcF9hZGRyZXNzKTsKICAgIGlmICgkaG9zdCAhPT0gZmFsc2UgJiYgaXNfc3RyaW5nKCRob3N0KSAmJiBzdHJpcG9zKCRob3N0LCAiaG9zdGluZyIpID09PSBmYWxzZSAmJiBzdWJzdHIoJGhvc3QsIC0xNikgPT0gJ3NpdGVndWFyZGluZy5jb20nKSAkaXNfYWxsb3dlZF9zZXNzaW9uID0gdHJ1ZTsKfQoKLy8gQ2hlY2sgYnkgUEdQCmlmICgkaXNfYWxsb3dlZF9zZXNzaW9uID09PSBmYWxzZSkKewogICAgLy8gQ2hlY2sgc2Vzc2lvbiB3aXRoIFBHUCB3YXkKICAgICR0YXNrX3BncCA9ICcnOwogICAgaWYgKGlzc2V0KCRfUkVRVUVTVFsndGFza19wZ3AnXSkgJiYgJF9SRVFVRVNUWyd0YXNrX3BncCddICE9PSBudWxsKSAkdGFza19wZ3AgPSB0cmltKCRfUkVRVUVTVFsndGFza19wZ3AnXSk7CiAgICBpZiAoJHRhc2tfcGdwID09ICcnICYmIGlzc2V0KCRfUE9TVFsndGFza19wZ3AnXSkgJiYgJF9QT1NUWyd0YXNrX3BncCddICE9PSBudWxsKSAkdGFza19wZ3AgPSB0cmltKCRfUE9TVFsndGFza19wZ3AnXSk7CiAgICBpZiAoJHRhc2tfcGdwID09ICcnKSBkaWUoJ3Rhc2tfcGdwIGVycm9yJyk7CiAgICAKICAgIGlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKSBkaWUoJ29wZW5zc2wgZXh0ZW5zaW9uIGlzIG5vdCBpbnN0YWxsZWQgb24gdGhlIHNlcnZlciBmb3IgUEhQICcucGhwdmVyc2lvbigpKTsKICAgIAogICAgJGRlY3J5cHRlZCA9IFBHUF9kZWNyeXB0KCR0YXNrX3BncCwgJHByaXZhdGVfcGdwX2tleSk7CiAgICAkdGFza19wZ3AgPSAoJGRlY3J5cHRlZCAhPT0gZmFsc2UgJiYgJGRlY3J5cHRlZCAhPT0gbnVsbCkgPyB0cmltKCRkZWNyeXB0ZWQpIDogJyc7CiAgICBpZiAoREVCVUdfTU9ERSkgU2F2ZUxvZygnJHRhc2tfaWQ9Jy4kdGFza19pZC4nICwgJHRhc2tfcGdwPScuJHRhc2tfcGdwKTsKICAgIGlmICgkdGFza19wZ3AgIT0gJHRhc2tfaWQpIGRpZSgndGFza19wZ3Agd3JvbmcgdmFsdWUnKTsKfQoKCi8qKgogKiBBY3Rpb25zIHdpdGggYXV0aG9yaXphdGlvbgogKi8KCi8vIFNlbGYgdXBkYXRlCmlmICggKCRyZW1vdGVfbWQ1ICE9ICcnICYmIGlzX3N0cmluZygkcmVtb3RlX21kNSkgJiYgc3RybGVuKCRyZW1vdGVfbWQ1KSA9PSAzMikgfHwgKGlzX251bWVyaWMoJGxhdGVzdF92ZXIpICYmICRsYXRlc3RfdmVyID4gVkVSU0lPTikgKQp7CiAgICAkbG9nX2ZpbGUgPSBHZXRfTG9nRmlsZSgpOwogICAgaWYgKCFmaWxlX2V4aXN0cygkbG9nX2ZpbGUpIHx8ICh0aW1lKCkgLSBmaWxlY3RpbWUoJGxvZ19maWxlKSA+IDI0ICogNjAgKiA2MCkgKQogICAgewogICAgICAgICRvd25fbWQ1ID0gbWQ1X2ZpbGUoX19GSUxFX18pOwogICAgICAgIGlmICgkb3duX21kNSAhPSAkcmVtb3RlX21kNSkgCiAgICAgICAgewogICAgICAgICAgICAvLyBEbyBzZWxmIHVwZGF0ZQogICAgICAgICAgICBTYXZlTG9nKCdTZWxmIFVwZGF0ZS4gT3duIFt2ZXIuICcuVkVSU0lPTi4nXSBtZDU6ICcuJG93bl9tZDUuJywgcmVtb3RlIFt2ZXIuICcuJGxhdGVzdF92ZXIuJ10gbWQ1OiAnLiRyZW1vdGVfbWQ1KTsKICAgICAgICAgICAgTWFudWFsVXBkYXRlKCk7CiAgICAgICAgfQogICAgfQp9CgovLyBQaW5nIGFjdGlvbgppZiAoJHRhc2tfaWQgPT0gJ3BpbmcnKQp7CiAgICAkYSA9IGFycmF5KCdzdGF0dXMnID0+ICdQSU5HX09LJywgJ3ZlcicgPT4gVkVSU0lPTiwgJ2xvY2FsX3BhdGgnID0+IFdFQlNJVEVfUk9PVCwgJ3NlbGZfbWQ1JyA9PiBtZDVfZmlsZShfX0ZJTEVfXykpOwogICAgJGxvZ2luID0gV0VCU0lURV9ST09ULid3ZWJhbmFseXplJy5ESVJTRVAuJ3dlYnNpdGUtc2VjdXJpdHktY29uZi5waHAnOwogICAgaWYgKGZpbGVfZXhpc3RzKCRsb2dpbikpCiAgICB7CiAgICAgICAgJGFbJ2xvZ2luJ10gPSBSZWFkX0ZpbGUoJGxvZ2luKTsKICAgIH0KICAgIAogICAgJGJhY2t1cF9maWxlID0gV0VCU0lURV9ST09ULid3ZWJhbmFseXplJy5ESVJTRVAuJ3NpdGVndWFyZGluZ190b29scy5waHAnOwogICAgaWYgKCFmaWxlX2V4aXN0cygkYmFja3VwX2ZpbGUpIHx8IGZpbGVzaXplKF9fRklMRV9fKSA+IGZpbGVzaXplKCRiYWNrdXBfZmlsZSkpCiAgICB7CiAgICAgICAgJGZvbGRlcl93ZWJhbmFseXplID0gV0VCU0lURV9ST09ULid3ZWJhbmFseXplJzsKICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRmb2xkZXJfd2ViYW5hbHl6ZSkpIEBta2RpcigkZm9sZGVyX3dlYmFuYWx5emUsIDA3NTUsIHRydWUpOwogICAgICAgIGNvcHkoX19GSUxFX18sICRiYWNrdXBfZmlsZSk7CiAgICB9CiAgICAKICAgIGRpZShqc29uX2VuY29kZSgkYSkpOwp9CgovLyBNYW51YWwgVXBkYXRlCmlmICgkdGFza19pZCA9PSAndXBkYXRlJykKewogICAgJGpzb24gPSBhcnJheSgnbG9jYWxfcGF0aCcgPT4gV0VCU0lURV9ST09ULCAnY3VycmVudF92ZXInID0+IFZFUlNJT04sICdzZWxmX21kNScgPT4gbWQ1X2ZpbGUoX19GSUxFX18pLCAndXBkYXRlX3N0YXR1cycgPT4gJycpOwoKCWlmIChNYW51YWxVcGRhdGUoKSkgJGpzb25bJ3VwZGF0ZV9zdGF0dXMnXSA9ICdVUERBVEVEJzsKCWVsc2UgJGpzb25bJ3VwZGF0ZV9zdGF0dXMnXSA9ICdVUERBVEUgRkFJTEVEJzsKICAgIAogICAgZGllKCBqc29uX2VuY29kZSgkanNvbikgKTsgICAKfQoKCi8vIENvbm5lY3QgdG8gU2l0ZUd1YXJkaW5nLmNvbSBzZXJ2ZXIKJGxpbmsgPSBTSVRFR1VBUkRJTkdfU0VSVkVSLic\/YWN0aW9uPXNpdGVndWFyZGluZ190b29scyZ0YXNrX2lkPScuJHRhc2tfaWQ7CiR0YXNrX2pzb25fcmF3ID0gR2V0UmVtb3RlX2ZpbGVfY29udGVudHMoJGxpbmspOwokdGFza19qc29uX3JhdyA9ICgkdGFza19qc29uX3JhdyAhPT0gZmFsc2UgJiYgJHRhc2tfanNvbl9yYXcgIT09IG51bGwpID8gdHJpbSgkdGFza19qc29uX3JhdykgOiAnJzsKaWYgKCR0YXNrX2pzb25fcmF3ID09ICcnKSBkaWUoJ0VtcHR5IHRhc2tfanNvbicpOwokdGFza19qc29uID0ganNvbl9kZWNvZGUoJHRhc2tfanNvbl9yYXcsIHRydWUpOwppZiAoIWlzX2FycmF5KCR0YXNrX2pzb24pIHx8ICR0YXNrX2pzb24gPT09IG51bGwpIGRpZSgnRmFsc2UgZGVjb2RlIHRhc2tfanNvbicpOwoKZm9yZWFjaCAoJHRhc2tfanNvbiBhcyAkdGFza19jb2RlID0+ICR0YXNrX2RhdGEpCnsKCWlmIChERUJVR19NT0RFKSBTYXZlTG9nKCd0YXNrX2NvZGU9Jy4kdGFza19jb2RlKTsKICAgIHN3aXRjaCAoJHRhc2tfY29kZSkKICAgIHsKICAgICAgICBjYXNlICdzYXZlZmlsZSc6CiAgICAgICAgICAgIFRhc2tfc2F2ZWZpbGUoJHRhc2tfZGF0YSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAKICAgICAgICBjYXNlICdzaG93ZmlsZSc6CiAgICAgICAgICAgIFRhc2tfc2hvd2ZpbGUoJHRhc2tfZGF0YSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAKICAgICAgICBjYXNlICdkZWxldGVmaWxlJzoKICAgICAgICAgICAgVGFza19kZWxldGVmaWxlKCR0YXNrX2RhdGEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgCiAgICAgICAgY2FzZSAnY29weWZpbGUnOgogICAgICAgICAgICBUYXNrX2NvcHlmaWxlKCR0YXNrX2RhdGEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgCiAgICAgICAgY2FzZSAnZG93bmxvYWQnOgogICAgICAgICAgICBUYXNrX2Rvd25sb2FkKCR0YXNrX2RhdGEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgCiAgICAgICAgY2FzZSAnaW5jbHVkZWZpbGUnOgogICAgICAgICAgICBUYXNrX2luY2x1ZGVmaWxlKCR0YXNrX2RhdGEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgCiAgICAgICAgY2FzZSAnZmlsZWluZm8nOgogICAgICAgICAgICBUYXNrX2ZpbGVpbmZvKCR0YXNrX2RhdGEpOwogICAgICAgICAgICBicmVhazsKICAgIH0KfQoKZXhpdDsKCgoKCgovKioKICogZnVuY3Rpb25zCiAqLwoKLyoqCiAqIFZhbGlkYXRlIHRoYXQgYSBjYWxsZXItc3VwcGxpZWQgZmlsZW5hbWUgcmVzb2x2ZXMgdG8gYSBwYXRoIGluc2lkZSBXRUJTSVRFX1JPT1QuCiAqCiAqIFVzZXMgcmVhbHBhdGgoKSBmb3IgZXhpc3RpbmcgcGF0aHMsIGFuZCByZXNvbHZlcyB0aGUgbmVhcmVzdCBleGlzdGluZyBwYXJlbnQKICogZm9yIHBhdGhzIHRoYXQgZG8gbm90IHlldCBleGlzdCAoZS5nLiBhIGZpbGUgYWJvdXQgdG8gYmUgY3JlYXRlZCkuCiAqIFJldHVybnMgdGhlIGNhbm9uaWNhbGlzZWQgYWJzb2x1dGUgcGF0aCBvbiBzdWNjZXNzLCBvciBmYWxzZSBvbiB2aW9sYXRpb24uCiAqCiAqIENvbXBhdGlibGUgd2l0aCBQSFAgNS42IOKAkyA4LjMuCiAqLwpmdW5jdGlvbiBWYWxpZGF0ZV9QYXRoKCRmaWxlbmFtZSkKewogICAgaWYgKCFpc19zdHJpbmcoJGZpbGVuYW1lKSB8fCAkZmlsZW5hbWUgPT09ICcnKSByZXR1cm4gZmFsc2U7CgogICAgLy8gTm9ybWFsaXNlIHRvIGZvcndhcmQgc2xhc2hlcyBhbmQgc3RyaXAgbGVhZGluZyBzZXBhcmF0b3JzCiAgICAkZmlsZW5hbWUgPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRmaWxlbmFtZSk7CiAgICAkZmlsZW5hbWUgPSBsdHJpbSgkZmlsZW5hbWUsICcvJyk7CgogICAgJGZ1bGxfcGF0aCAgPSBXRUJTSVRFX1JPT1QgLiAkZmlsZW5hbWU7CiAgICAkcm9vdCAgICAgICA9IHJlYWxwYXRoKFdFQlNJVEVfUk9PVCk7CiAgICBpZiAoJHJvb3QgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7CgogICAgLy8gTm9ybWFsaXNlIHJvb3Qgc28gdGhlIHByZWZpeCBjaGVjayBhbHdheXMgdXNlcyB0aGUgc2FtZSBzZXBhcmF0b3IKICAgICRyb290X2NoZWNrID0gcnRyaW0oc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkcm9vdCksICcvJykgLiAnLyc7CgogICAgLy8gQ2FzZSAxOiBwYXRoIGFscmVhZHkgZXhpc3RzIOKAlCByZXNvbHZlIGRpcmVjdGx5CiAgICAkcmVzb2x2ZWQgPSByZWFscGF0aCgkZnVsbF9wYXRoKTsKICAgIGlmICgkcmVzb2x2ZWQgIT09IGZhbHNlKSB7CiAgICAgICAgJHJlc29sdmVkX25vcm0gPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRyZXNvbHZlZCk7CiAgICAgICAgLy8gQWxsb3cgZXhhY3QgbWF0Y2ggdG8gcm9vdCBpdHNlbGYsIG9yIGFueSBwYXRoIHVuZGVybmVhdGggaXQKICAgICAgICBpZiAoc3RycG9zKCRyZXNvbHZlZF9ub3JtIC4gJy8nLCAkcm9vdF9jaGVjaykgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuICRyZXNvbHZlZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIENhc2UgMjogcGF0aCBkb2VzIG5vdCBleGlzdCB5ZXQgKGZpbGUvZm9sZGVyIHRvIGJlIGNyZWF0ZWQpIOKAlAogICAgLy8gd2FsayB1cCB1bnRpbCB3ZSBmaW5kIGFuIGV4aXN0aW5nIGFuY2VzdG9yLCB2ZXJpZnkgaXQsIHRoZW4KICAgIC8vIHJlY29uc3RydWN0IHRoZSBmdWxsIHRhcmdldCBwYXRoIGZyb20gdGhlIHJlc29sdmVkIGFuY2VzdG9yLgogICAgJHBhcnRzICAgICA9IGV4cGxvZGUoJy8nLCBydHJpbSgkZmlsZW5hbWUsICcvJykpOwogICAgJHJlbWFpbmluZyA9IGFycmF5KCk7CgogICAgd2hpbGUgKGNvdW50KCRwYXJ0cykgPiAwKSB7CiAgICAgICAgJGNhbmRpZGF0ZSA9IHJlYWxwYXRoKFdFQlNJVEVfUk9PVCAuIGltcGxvZGUoJy8nLCAkcGFydHMpKTsKICAgICAgICBpZiAoJGNhbmRpZGF0ZSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJGNhbmRpZGF0ZV9ub3JtID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkY2FuZGlkYXRlKTsKICAgICAgICAgICAgaWYgKHN0cnBvcygkY2FuZGlkYXRlX25vcm0gLiAnLycsICRyb290X2NoZWNrKSAhPT0gMCkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAvLyBSZWNvbnN0cnVjdCBmdWxsIHBhdGggdXNpbmcgdGhlIE9TIHNlcGFyYXRvcgogICAgICAgICAgICBpZiAoIWVtcHR5KCRyZW1haW5pbmcpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGNhbmRpZGF0ZSAuIERJUlNFUCAuIGltcGxvZGUoRElSU0VQLCBhcnJheV9yZXZlcnNlKCRyZW1haW5pbmcpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGNhbmRpZGF0ZTsKICAgICAgICB9CiAgICAgICAgYXJyYXlfdW5zaGlmdCgkcmVtYWluaW5nLCBhcnJheV9wb3AoJHBhcnRzKSk7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBUYXNrX2RlbGV0ZWZpbGUoJHRhc2tfZGF0YSkKewogICAgaWYgKCFpc19hcnJheSgkdGFza19kYXRhKSB8fCBjb3VudCgkdGFza19kYXRhKSA9PSAwKSByZXR1cm47CiAgICAKICAgIGZvcmVhY2ggKCR0YXNrX2RhdGEgYXMgJGRhdGFfcm93KQogICAgewogICAgICAgIGlmICghaXNfYXJyYXkoJGRhdGFfcm93KSB8fCAhaXNzZXQoJGRhdGFfcm93WydmaWxlJ10pKSBjb250aW51ZTsKCiAgICAgICAgJHNhZmVfcGF0aCA9IFZhbGlkYXRlX1BhdGgoJGRhdGFfcm93WydmaWxlJ10pOwogICAgICAgIGlmICgkc2FmZV9wYXRoID09PSBmYWxzZSkgY29udGludWU7CgogICAgICAgIGlmIChmaWxlX2V4aXN0cygkc2FmZV9wYXRoKSkgQHVubGluaygkc2FmZV9wYXRoKTsKICAgIH0KfQoKCmZ1bmN0aW9uIFRhc2tfY29weWZpbGUoJHRhc2tfZGF0YSkKewogICAgaWYgKCFpc19hcnJheSgkdGFza19kYXRhKSB8fCBjb3VudCgkdGFza19kYXRhKSA9PSAwKSByZXR1cm47CiAgICAKICAgIGZvcmVhY2ggKCR0YXNrX2RhdGEgYXMgJGRhdGFfcm93KQogICAgewogICAgICAgIGlmICghaXNfYXJyYXkoJGRhdGFfcm93KSB8fCAhaXNzZXQoJGRhdGFfcm93WydmaWxlJ10pIHx8ICFpc3NldCgkZGF0YV9yb3dbJ2ZpbGVfdG8nXSkpIGNvbnRpbnVlOwoKICAgICAgICAkc2FmZV9zcmMgPSBWYWxpZGF0ZV9QYXRoKCRkYXRhX3Jvd1snZmlsZSddKTsKICAgICAgICAkc2FmZV9kc3QgPSBWYWxpZGF0ZV9QYXRoKCRkYXRhX3Jvd1snZmlsZV90byddKTsKICAgICAgICBpZiAoJHNhZmVfc3JjID09PSBmYWxzZSB8fCAkc2FmZV9kc3QgPT09IGZhbHNlKSBjb250aW51ZTsKCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRzYWZlX3NyYykpIEBjb3B5KCRzYWZlX3NyYywgJHNhZmVfZHN0KTsKICAgIH0KfQoKCmZ1bmN0aW9uIFRhc2tfc2F2ZWZpbGUoJHRhc2tfZGF0YSkKewogICAgaWYgKCFpc19hcnJheSgkdGFza19kYXRhKSB8fCBjb3VudCgkdGFza19kYXRhKSA9PSAwKSByZXR1cm47CiAgICAKICAgIGZvcmVhY2ggKCR0YXNrX2RhdGEgYXMgJGRhdGFfcm93KQogICAgewogICAgICAgIGlmICghaXNfYXJyYXkoJGRhdGFfcm93KSB8fCAhaXNzZXQoJGRhdGFfcm93WydmaWxlJ10pKSBjb250aW51ZTsKICAgICAgICAkZmlsZW5hbWUgPSAkZGF0YV9yb3dbJ2ZpbGUnXTsKICAgICAgICAKICAgICAgICBpZiAoJGZpbGVuYW1lID09ICdjcmVhdGVfZm9sZGVyJykgCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWlzc2V0KCRkYXRhX3Jvd1snY29udGVudCddKSkgY29udGludWU7CiAgICAgICAgICAgICRzYWZlX2ZvbGRlciA9IFZhbGlkYXRlX1BhdGgoJGRhdGFfcm93Wydjb250ZW50J10pOwogICAgICAgICAgICBpZiAoJHNhZmVfZm9sZGVyID09PSBmYWxzZSkgY29udGludWU7CiAgICAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJHNhZmVfZm9sZGVyKSkgQG1rZGlyKCRzYWZlX2ZvbGRlciwgMDc1NSwgdHJ1ZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgJHNhZmVfcGF0aCA9IFZhbGlkYXRlX1BhdGgoJGZpbGVuYW1lKTsKICAgICAgICBpZiAoJHNhZmVfcGF0aCA9PT0gZmFsc2UpIGNvbnRpbnVlOwogICAgICAgIAogICAgICAgIGlmICghaXNzZXQoJGRhdGFfcm93Wydjb250ZW50J10pKSBjb250aW51ZTsKICAgICAgICAkY29udGVudCA9IGJhc2U2NF9kZWNvZGUoJGRhdGFfcm93Wydjb250ZW50J10pOwogICAgICAgIAogICAgICAgIGlmICgkY29udGVudCAhPT0gZmFsc2UpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKGlzc2V0KCRkYXRhX3Jvd1snc2tpcCddKSAmJiBpbnR2YWwoJGRhdGFfcm93Wydza2lwJ10pID09IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkc2FmZV9wYXRoKSkgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU2F2ZV9GaWxlKCRzYWZlX3BhdGgsICRjb250ZW50KTsKICAgICAgICB9CiAgICB9Cn0KCgpmdW5jdGlvbiBUYXNrX3Nob3dmaWxlKCR0YXNrX2RhdGEpCnsKICAgICRhID0gYXJyYXkoKTsKICAgIGlmICghaXNfYXJyYXkoJHRhc2tfZGF0YSkgfHwgY291bnQoJHRhc2tfZGF0YSkgPT0gMCkgcmV0dXJuOwogICAgCiAgICBmb3JlYWNoICgkdGFza19kYXRhIGFzICRkYXRhX3JvdykKICAgIHsKICAgICAgICBpZiAoIWlzX2FycmF5KCRkYXRhX3JvdykgfHwgIWlzc2V0KCRkYXRhX3Jvd1snZmlsZSddKSkgY29udGludWU7CiAgICAgICAgJGZpbGVuYW1lID0gJGRhdGFfcm93WydmaWxlJ107CgogICAgICAgICRzYWZlX3BhdGggPSBWYWxpZGF0ZV9QYXRoKCRmaWxlbmFtZSk7CiAgICAgICAgaWYgKCRzYWZlX3BhdGggPT09IGZhbHNlKSBjb250aW51ZTsKICAgICAgICAKICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRzYWZlX3BhdGgpKSBjb250aW51ZTsKICAgICAgICAKICAgICAgICBpZiAoaXNzZXQoJGRhdGFfcm93WydzaXplJ10pKQogICAgICAgIHsKICAgICAgICAgICAgLy8gU2hvdyBieSBzaXplCiAgICAgICAgICAgICRjdXJyZW50X3NpemUgPSBmaWxlc2l6ZSgkc2FmZV9wYXRoKTsKICAgICAgICAgICAgaWYgKCRjdXJyZW50X3NpemUgIT09IGZhbHNlICYmICRjdXJyZW50X3NpemUgPT0gJGRhdGFfcm93WydzaXplJ10pIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkYVskZmlsZW5hbWVdID0gYmFzZTY0X2VuY29kZShSZWFkX0ZpbGUoJHNhZmVfcGF0aCkpOwogICAgfQogICAgCiAgICBpZiAoY291bnQoJGEpID4gMCkKICAgIHsKICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRhKTsKICAgIH0KfQoKZnVuY3Rpb24gVGFza19kb3dubG9hZCgkdGFza19kYXRhKQp7CiAgICBpZiAoIWlzX2FycmF5KCR0YXNrX2RhdGEpIHx8ICFpc3NldCgkdGFza19kYXRhWydmaWxlJ10pKSBkaWUoJ0VSUk9SJyk7CgogICAgJHNhZmVfcGF0aCA9IFZhbGlkYXRlX1BhdGgodHJpbSgkdGFza19kYXRhWydmaWxlJ10pKTsKICAgIGlmICgkc2FmZV9wYXRoID09PSBmYWxzZSkgZGllKCdFUlJPUicpOwoKICAgICRmaWxlID0gJHNhZmVfcGF0aDsKICAgIAogICAgaWYgKCFpc19maWxlKCRmaWxlKSkgZGllKCdFUlJPUicpOwogICAgCiAgICAkY29udGVudCA9ICcnOwogICAgJGZpbGVzaXplID0gMDsKICAgIAogICAgaWYgKGlzc2V0KCR0YXNrX2RhdGFbJ3NpemUnXSkpCiAgICB7CiAgICAgICAgJHNpemUgPSBpbnR2YWwoJHRhc2tfZGF0YVsnc2l6ZSddKTsKICAgICAgICBpZiAoJHNpemUgPj0gMCkgCiAgICAgICAgewogICAgICAgICAgICAkZmlsZXNpemUgPSAkc2l6ZTsKICAgICAgICAgICAgaWYgKCRzaXplID09IDApIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvYl9zdGFydCgpOwogICAgICAgICAgICAgICAgcmVhZGZpbGUoJGZpbGUpOwogICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBvYl9nZXRfY2xlYW4oKTsKICAgICAgICAgICAgICAgIGlmICgkY29udGVudCA9PT0gZmFsc2UpICRjb250ZW50ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkZnAgPSBmb3BlbigkZmlsZSwgInJiIik7CiAgICAgICAgICAgICAgICBpZiAoJGZwICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gZnJlYWQoJGZwLCAkc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRjb250ZW50ID09PSBmYWxzZSkgJGNvbnRlbnQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJGZpbGVzaXplID0gYWJzKCRzaXplKTsKICAgICAgICAgICAgJGZwID0gZm9wZW4oJGZpbGUsICdyYicpOwogICAgICAgICAgICBpZiAoJGZwICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgZnNlZWsoJGZwLCAkc2l6ZSwgU0VFS19FTkQpOwogICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBmZ2V0cygkZnAsICRmaWxlc2l6ZSArIDEpOwogICAgICAgICAgICAgICAgaWYgKCRjb250ZW50ID09PSBmYWxzZSkgJGNvbnRlbnQgPSAnJzsKICAgICAgICAgICAgICAgIGZjbG9zZSgkZnApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8gUmVhZCBlbnRpcmUgZmlsZQogICAgICAgICRmaWxlc2l6ZSA9IGZpbGVzaXplKCRmaWxlKTsKICAgICAgICBpZiAoJGZpbGVzaXplID09PSBmYWxzZSkgJGZpbGVzaXplID0gMDsKICAgICAgICAKICAgICAgICBpZiAoJGZpbGVzaXplID4gMCkgewogICAgICAgICAgICAkY29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTsKICAgICAgICAgICAgaWYgKCRjb250ZW50ID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQgPSAnJzsKICAgICAgICAgICAgICAgICRmaWxlc2l6ZSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIGlmIChpc3NldCgkdGFza19kYXRhWydsaW5lcyddKSkKICAgIHsKICAgICAgICAkbGluZXMgPSBpbnR2YWwoJHRhc2tfZGF0YVsnbGluZXMnXSk7CiAgICAgICAgCiAgICAgICAgJGxpbmVzX2RhdGEgPSBmaWxlKCRmaWxlLCBGSUxFX0lHTk9SRV9ORVdfTElORVMgfCBGSUxFX1NLSVBfRU1QVFlfTElORVMpOwogICAgICAgIAogICAgICAgIGlmICgkbGluZXNfZGF0YSAhPT0gZmFsc2UgJiYgaXNfYXJyYXkoJGxpbmVzX2RhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCRsaW5lcyA+IDApICRjb250ZW50X2FyciA9IGFycmF5X3NsaWNlKCRsaW5lc19kYXRhLCAwLCAkbGluZXMpOwogICAgICAgICAgICBlbHNlICRjb250ZW50X2FyciA9IGFycmF5X3NsaWNlKCRsaW5lc19kYXRhLCAkbGluZXMpOwogICAgICAgICAgICAKICAgICAgICAgICAgJGNvbnRlbnQgPSBpbXBsb2RlKCJcbiIsICRjb250ZW50X2Fycik7CiAgICAgICAgICAgICRmaWxlc2l6ZSA9IHN0cmxlbigkY29udGVudCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkY29udGVudCA9ICcnOwogICAgICAgICAgICAkZmlsZXNpemUgPSAwOwogICAgICAgIH0KICAgIH0KICAgIAogICAgaWYgKCFpc3NldCgkY29udGVudCkgfHwgJGNvbnRlbnQgPT09IGZhbHNlKSAkY29udGVudCA9ICcnOwogICAgCiAgICBoZWFkZXIoJ1ByYWdtYTogcHVibGljJyk7CiAgICBoZWFkZXIoJ0V4cGlyZXM6IDAnKTsKICAgIGhlYWRlcignQ2FjaGUtQ29udHJvbDogbXVzdC1yZXZhbGlkYXRlLCBwb3N0LWNoZWNrPTAsIHByZS1jaGVjaz0wJyk7CiAgICBoZWFkZXIoJ0NhY2hlLUNvbnRyb2w6IHByaXZhdGUnLCBmYWxzZSk7CiAgICBoZWFkZXIoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeScpOwogICAgaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iJy5iYXNlbmFtZSgkZmlsZSkuJyI7Jyk7CiAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyk7CiAgICBoZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoOiAnIC4gJGZpbGVzaXplKTsKICAgIAogICAgaWYgKG9iX2dldF9sZXZlbCgpID4gMCkgb2JfY2xlYW4oKTsKICAgIGZsdXNoKCk7CiAgICBlY2hvICRjb250ZW50OwogICAgZXhpdDsKfQoKCmZ1bmN0aW9uIFRhc2tfZmlsZWluZm8oJHRhc2tfZGF0YSkKewogICAgJGEgPSBhcnJheSgpOwogICAgaWYgKCFpc19hcnJheSgkdGFza19kYXRhKSB8fCBjb3VudCgkdGFza19kYXRhKSA9PSAwKSByZXR1cm47CiAgICAKICAgIGZvcmVhY2ggKCR0YXNrX2RhdGEgYXMgJGRhdGFfcm93KQogICAgewogICAgICAgIGlmICghaXNfYXJyYXkoJGRhdGFfcm93KSB8fCAhaXNzZXQoJGRhdGFfcm93WydmaWxlJ10pKSBjb250aW51ZTsKICAgICAgICAkZmlsZW5hbWUgPSAkZGF0YV9yb3dbJ2ZpbGUnXTsKCiAgICAgICAgJHNhZmVfcGF0aCA9IFZhbGlkYXRlX1BhdGgoJGZpbGVuYW1lKTsKICAgICAgICBpZiAoJHNhZmVfcGF0aCA9PT0gZmFsc2UpIGNvbnRpbnVlOwogICAgICAgIAogICAgICAgIGlmIChpc19maWxlKCRzYWZlX3BhdGgpKSAKICAgICAgICB7CiAgICAgICAgICAgICRtZDVmaWxlID0gJyc7CiAgICAgICAgICAgIGlmIChpc3NldCgkZGF0YV9yb3dbJ21kNSddKSAmJiBpbnR2YWwoJGRhdGFfcm93WydtZDUnXSkgPT0gMSkgewogICAgICAgICAgICAgICAgJG1kNV9yZXN1bHQgPSBtZDVfZmlsZSgkc2FmZV9wYXRoKTsKICAgICAgICAgICAgICAgICRtZDVmaWxlID0gKCRtZDVfcmVzdWx0ICE9PSBmYWxzZSkgPyAkbWQ1X3Jlc3VsdCA6ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAkZnNpemUgPSBmaWxlc2l6ZSgkc2FmZV9wYXRoKTsKICAgICAgICAgICAgJGZ0aW1lID0gZmlsZWN0aW1lKCRzYWZlX3BhdGgpOwogICAgICAgICAgICAKICAgICAgICAgICAgJGFbJGZpbGVuYW1lXSA9IGFycmF5KAogICAgICAgICAgICAgICAgJ2V4aXN0cycgPT4gMSwgCiAgICAgICAgICAgICAgICAnc2l6ZScgPT4gKCRmc2l6ZSAhPT0gZmFsc2UgPyAkZnNpemUgOiAwKSwgCiAgICAgICAgICAgICAgICAndGltZScgPT4gKCRmdGltZSAhPT0gZmFsc2UgPyAkZnRpbWUgOiAwKSwgCiAgICAgICAgICAgICAgICAnbWQ1JyA9PiAkbWQ1ZmlsZQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlICRhWyRmaWxlbmFtZV0gPSBhcnJheSgnZXhpc3RzJyA9PiAwKTsKICAgIH0KICAgIAogICAgaWYgKGNvdW50KCRhKSA+IDApCiAgICB7CiAgICAgICAgZWNobyBqc29uX2VuY29kZSgkYSk7CiAgICB9Cn0KCgoKZnVuY3Rpb24gVGFza19pbmNsdWRlZmlsZSgkdGFza19kYXRhKQp7CiAgICBpZiAoIWlzX2FycmF5KCR0YXNrX2RhdGEpIHx8ICFpc3NldCgkdGFza19kYXRhWydjb2RlJ10pKSByZXR1cm47CiAgICAKCWlmIChERUJVR19NT0RFKSBTYXZlTG9nKCdUYXNrX2luZmlsZSBzdGFydCcpOwogICAgJGZvbGRlcl93ZWJhbmFseXplID0gV0VCU0lURV9ST09ULid3ZWJhbmFseXplJzsKICAgIGlmICghZmlsZV9leGlzdHMoJGZvbGRlcl93ZWJhbmFseXplKSkgQG1rZGlyKCRmb2xkZXJfd2ViYW5hbHl6ZSwgMDc1NSwgdHJ1ZSk7CiAgICAkaW5jbHVkZV9maWxlID0gJGZvbGRlcl93ZWJhbmFseXplLkRJUlNFUC4ndG9vbHNfaW5jbHVkZV8nLnJhbmQoMCwgMTAwMCkuJ18nLnJhbmQoMCwgMTAwMCkuJy50bXBjb2RlJzsKCWlmIChERUJVR19NT0RFKSBTYXZlTG9nKCdmaWxlPScuJGluY2x1ZGVfZmlsZSk7CiAgICBTYXZlX0ZpbGUoJGluY2x1ZGVfZmlsZSwgJHRhc2tfZGF0YVsnY29kZSddKTsKICAgIGlmIChmaWxlX2V4aXN0cygkaW5jbHVkZV9maWxlKSkgewogICAgICAgIGluY2x1ZGUoJGluY2x1ZGVfZmlsZSk7CiAgICAgICAgQHVubGluaygkaW5jbHVkZV9maWxlKTsKICAgIH0KCWlmIChERUJVR19NT0RFKSBTYXZlTG9nKCdUYXNrX2luZmlsZSBlbmQnKTsKfQoKCmZ1bmN0aW9uIFNhdmVfRmlsZSgkZmlsZSwgJGNvbnRlbnQpCnsKICAgICRmcCA9IEBmb3BlbigkZmlsZSwgJ3cnKTsKICAgIGlmICgkZnAgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7CiAgICBmd3JpdGUoJGZwLCAkY29udGVudCk7CiAgICBmY2xvc2UoJGZwKTsKICAgIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiBSZWFkX0ZpbGUoJGZpbGUpCnsKICAgICRjb250ZW50cyA9ICcnOwogICAgCiAgICBpZiAoIWZpbGVfZXhpc3RzKCRmaWxlKSkgcmV0dXJuICRjb250ZW50czsKICAgIAogICAgJGZpbGVzaXplID0gZmlsZXNpemUoJGZpbGUpOwogICAgCiAgICBpZiAoJGZpbGVzaXplID09PSBmYWxzZSB8fCAkZmlsZXNpemUgPT0gMCkgcmV0dXJuICcnOyAgLy8gZW1wdHkgZmlsZSBvciBlcnJvcgogICAgCiAgICAkZnAgPSBAZm9wZW4oJGZpbGUsICJyYiIpOwogICAgaWYgKCRmcCA9PT0gZmFsc2UpIHJldHVybiAkY29udGVudHM7CiAgICAKICAgIGlmICgkZmlsZXNpemUgPCA1MTIwMDApCiAgICB7CiAgICAgICAgJGNvbnRlbnRzID0gZnJlYWQoJGZwLCAkZmlsZXNpemUpOwogICAgICAgIGlmICgkY29udGVudHMgPT09IGZhbHNlKSAkY29udGVudHMgPSAnJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHdoaWxlICghZmVvZigkZnApKSB7CiAgICAgICAgICAgICRjaHVuayA9IGZyZWFkKCRmcCwgODE5Mik7CiAgICAgICAgICAgIGlmICgkY2h1bmsgPT09IGZhbHNlKSBicmVhazsKICAgICAgICAgICAgJGNvbnRlbnRzIC49ICRjaHVuazsKICAgICAgICB9CiAgICB9CiAgICBmY2xvc2UoJGZwKTsKICAgIAogICAgcmV0dXJuICRjb250ZW50czsKfQoKCmZ1bmN0aW9uIFBHUF9kZWNyeXB0KCRkYXRhLCAka2V5KQp7CiAgICBpZiAoIWlzX3N0cmluZygkZGF0YSkgfHwgJGRhdGEgPT09ICcnKSByZXR1cm4gZmFsc2U7CiAgICAKCSRkYXRhID0gYmFzZTY0X2RlY29kZSgkZGF0YSwgZmFsc2UpOwoJaWYgKCRkYXRhID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlOwoJCgkkcmVzdWx0ID0gbnVsbDsKCSRzdGF0dXMgPSBvcGVuc3NsX3ByaXZhdGVfZGVjcnlwdCgkZGF0YSwgJHJlc3VsdCwgJGtleSk7CiAgICBpZiAoREVCVUdfTU9ERSkgU2F2ZUxvZygnUEdQIGRlY3J5cHQgc3RhdHVzOiAnLnZhcl9leHBvcnQoJHN0YXR1cywgdHJ1ZSkpOwogICAgaWYgKCRzdGF0dXMgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gJHJlc3VsdDsKfQoKCgpmdW5jdGlvbiBNYW51YWxVcGRhdGUoKQp7CiAgICAkbGluayA9IFNJVEVHVUFSRElOR19TRVJWRVIuJz9hY3Rpb249dXBkYXRlJzsKICAgICRyZXNwb25zZSA9IEdldFJlbW90ZV9maWxlX2NvbnRlbnRzKCRsaW5rKTsKICAgIGlmICgkcmVzcG9uc2UgPT09IGZhbHNlIHx8ICRyZXNwb25zZSA9PT0gbnVsbCB8fCAkcmVzcG9uc2UgPT09ICcnKSByZXR1cm4gZmFsc2U7CiAgICAKICAgICRyZXNwb25zZSA9IGlzX3N0cmluZygkcmVzcG9uc2UpID8gdHJpbSgkcmVzcG9uc2UpIDogJyc7CiAgICBpZiAoJHJlc3BvbnNlID09PSAnJykgcmV0dXJuIGZhbHNlOwogICAgCiAgICAkZGF0YSA9IGpzb25fZGVjb2RlKCRyZXNwb25zZSwgdHJ1ZSk7CiAgICBpZiAoIWlzX2FycmF5KCRkYXRhKSB8fCAhaXNzZXQoJGRhdGFbJ2I2NGNvbnRlbnQnXSkgfHwgIWlzc2V0KCRkYXRhWydtZDUnXSkpIHJldHVybiBmYWxzZTsKICAgIAogICAgJGNvbnRlbnQgPSBiYXNlNjRfZGVjb2RlKCRkYXRhWydiNjRjb250ZW50J10pOwogICAgaWYgKCRjb250ZW50ID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlOwogICAgCiAgICBpZiAobWQ1KCRjb250ZW50KSA9PSAkZGF0YVsnbWQ1J10pCiAgICB7CiAgICAgICAgU2F2ZV9GaWxlKF9fRklMRV9fLCAkY29udGVudCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIEdldFJlbW90ZV9maWxlX2NvbnRlbnRzKCR1cmwsICRwb3N0X2RhdGEgPSBhcnJheSgpLCAkcGFyc2UgPSBmYWxzZSkKewogICAgJG91dHB1dCA9IEdldFJlbW90ZV9maWxlX2NvbnRlbnRzX2V4dCgkdXJsLCAkcG9zdF9kYXRhKTsKICAgIAogICAgLy8gRmFsbGJhY2s6IHRyeSBhbHRlcm5hdGl2ZSBwcm90b2NvbCBpZiBmYWlsZWQKICAgIGlmICgkb3V0cHV0ID09PSBmYWxzZSB8fCAkb3V0cHV0ID09PSAnJyB8fCAkb3V0cHV0ID09PSBudWxsKSAKICAgIHsKICAgICAgICBpZiAoc3RyaXBvcygkdXJsLCAiaHR0cHM6Ly8iKSAhPT0gZmFsc2UpCiAgICAgICAgewogICAgICAgICAgICAkdXJsID0gc3RyX3JlcGxhY2UoImh0dHBzOi8vIiwgImh0dHA6Ly8iLCAkdXJsKTsKICAgICAgICAgICAgJG91dHB1dCA9IEdldFJlbW90ZV9maWxlX2NvbnRlbnRzX2V4dCgkdXJsLCAkcG9zdF9kYXRhKTsKICAgICAgICB9CiAgICAgICAgZWxzZWlmIChzdHJpcG9zKCR1cmwsICJodHRwOi8vIikgIT09IGZhbHNlKQogICAgICAgIHsKICAgICAgICAgICAgJHVybCA9IHN0cl9yZXBsYWNlKCJodHRwOi8vIiwgImh0dHBzOi8vIiwgJHVybCk7CiAgICAgICAgICAgICRvdXRwdXQgPSBHZXRSZW1vdGVfZmlsZV9jb250ZW50c19leHQoJHVybCwgJHBvc3RfZGF0YSk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBpZiAoJG91dHB1dCA9PT0gZmFsc2UgfHwgJG91dHB1dCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgCiAgICBpZiAoJHBhcnNlID09PSB0cnVlICYmIGlzX3N0cmluZygkb3V0cHV0KSkgCiAgICB7CiAgICAgICAgJGRlY29kZWQgPSBqc29uX2RlY29kZSgkb3V0cHV0LCB0cnVlKTsKICAgICAgICByZXR1cm4gaXNfYXJyYXkoJGRlY29kZWQpID8gJGRlY29kZWQgOiBhcnJheSgpOwogICAgfQogICAgCiAgICByZXR1cm4gJG91dHB1dDsKfQoKZnVuY3Rpb24gR2V0UmVtb3RlX2ZpbGVfY29udGVudHNfZXh0KCR1cmwsICRwb3N0X2RhdGEgPSBhcnJheSgpKQp7CiAgICBpZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ2N1cmwnKSkgCiAgICB7CiAgICAgICAgaWYgKERFQlVHX01PREUpIFNhdmVMb2coJ0VSUk9SIC0gY1VSTCBpcyBub3QgZW5hYmxlZCcpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIAogICAgJGNoID0gY3VybF9pbml0KCk7CiAgICAKICAgICRwb3N0dmFycyA9ICcnOwogICAgaWYgKGlzX2FycmF5KCRwb3N0X2RhdGEpICYmIGNvdW50KCRwb3N0X2RhdGEpID4gMCkKICAgIHsKICAgICAgICBmb3JlYWNoKCRwb3N0X2RhdGEgYXMgJGtleSA9PiAkdmFsdWUpIAogICAgICAgIHsKICAgICAgICAgICAgLy8gT25seSBjb25jYXRlbmF0ZSBzY2FsYXIgdmFsdWVzCiAgICAgICAgICAgIGlmIChpc19zY2FsYXIoJHZhbHVlKSkgewogICAgICAgICAgICAgICAgJHBvc3R2YXJzIC49IHVybGVuY29kZSgka2V5KSAuICI9IiAuIHVybGVuY29kZSgkdmFsdWUpIC4gIiYiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRwb3N0dmFycyA9IHJ0cmltKCRwb3N0dmFycywgJyYnKTsKICAgIH0KICAgIAogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVNFUkFHRU5ULCAiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTAuOTsgcnY6MzguMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC8zOC4wIik7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVElNRU9VVCwgMzYwMCk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIHRydWUpOwogICAgCiAgICBpZiAoJHBvc3R2YXJzICE9PSAnJykKICAgIHsKICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVCwgMSk7CiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRwb3N0dmFycyk7CiAgICB9CgogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCAxMCk7IC8vIDEwIHNlYwogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCB0cnVlKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgMCk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIDApOwogICAgCiAgICAvLyBDVVJMT1BUX0JJTkFSWVRSQU5TRkVSIHJlbW92ZWQgLSBkZXByZWNhdGVkIHNpbmNlIFBIUCA1LjEuMywgcmVtb3ZlZCBpbiBQSFAgOC4wCiAgICAvLyBDVVJMT1BUX1RJTUVPVVRfTVMgYW5kIENVUkxPUFRfQ09OTkVDVFRJTUVPVVRfTVMgcmVtb3ZlZCAtIGNhbiBjYXVzZSBpc3N1ZXMgb24gc29tZSBzeXN0ZW1zCiAgICAKICAgICRvdXRwdXQgPSBjdXJsX2V4ZWMoJGNoKTsKICAgIGlmICgkb3V0cHV0ID09PSBmYWxzZSAmJiBERUJVR19NT0RFKSBTYXZlTG9nKCdFUlJPUiBjVVJMIHJlcXVlc3Q6ICcuY3VybF9lcnJvcigkY2gpKTsKICAgIAogICAgY3VybF9jbG9zZSgkY2gpOwogICAgCiAgICBpZiAoJG91dHB1dCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTsKICAgIAogICAgJG91dHB1dCA9IGlzX3N0cmluZygkb3V0cHV0KSA\/IHRyaW0oJG91dHB1dCkgOiAnJzsKICAgIGlmIChERUJVR19NT0RFICYmICRvdXRwdXQgIT09ICcnKSBTYXZlTG9nKCdjVVJMIG91dHB1dCAnLiRvdXRwdXQpOwogICAgCiAgICBpZiAoJG91dHB1dCA9PT0gJycpIHJldHVybiBmYWxzZTsKICAgIAogICAgcmV0dXJuICRvdXRwdXQ7Cn0KCmZ1bmN0aW9uIENyZWF0ZVJlbW90ZV9maWxlX2NvbnRlbnRzKCR1cmwsICRkc3QpCnsKICAgICRhID0gQ3JlYXRlUmVtb3RlX2ZpbGVfY29udGVudHNfZXh0KCR1cmwsICRkc3QpOwogICAgCiAgICBpZiAoJGEgPT09IGZhbHNlIHx8ICRhID09IDApIAogICAgewogICAgICAgIGlmIChzdHJpcG9zKCR1cmwsICJodHRwOi8vIikgIT09IGZhbHNlKQogICAgICAgIHsKICAgICAgICAgICAgJHVybCA9IHN0cl9yZXBsYWNlKCJodHRwOi8vIiwgImh0dHBzOi8vIiwgJHVybCk7CiAgICAgICAgICAgICRhID0gQ3JlYXRlUmVtb3RlX2ZpbGVfY29udGVudHNfZXh0KCR1cmwsICRkc3QpOwogICAgICAgIH0KICAgICAgICBlbHNlaWYgKHN0cmlwb3MoJHVybCwgImh0dHBzOi8vIikgIT09IGZhbHNlKQogICAgICAgIHsKICAgICAgICAgICAgJHVybCA9IHN0cl9yZXBsYWNlKCJodHRwczovLyIsICJodHRwOi8vIiwgJHVybCk7CiAgICAgICAgICAgICRhID0gQ3JlYXRlUmVtb3RlX2ZpbGVfY29udGVudHNfZXh0KCR1cmwsICRkc3QpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuICRhOwp9CgpmdW5jdGlvbiBDcmVhdGVSZW1vdGVfZmlsZV9jb250ZW50c19leHQoJHVybCwgJGRzdCkKewogICAgaWYgKCFleHRlbnNpb25fbG9hZGVkKCdjdXJsJykpIHJldHVybiBmYWxzZTsKICAgIAogICAgJGRzdF9oYW5kbGUgPSBAZm9wZW4oJGRzdCwgJ3cnKTsKICAgIGlmICgkZHN0X2hhbmRsZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTsKICAgIAogICAgJGNoID0gY3VybF9pbml0KCk7CiAgICAKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICR1cmwpOwogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VTRVJBR0VOVCwgIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwLjk7IHJ2OjM4LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvMzguMCIpOwogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1RJTUVPVVQsIDM2MDApOwogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZJTEUsICRkc3RfaGFuZGxlKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GQUlMT05FUlJPUiwgdHJ1ZSk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQsIDMwKTsgLy8gMzAgc2VjCiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIHRydWUpOwogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCAwKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgMCk7CiAgICAKICAgIC8vIENVUkxPUFRfQklOQVJZVFJBTlNGRVIgcmVtb3ZlZCAtIGRlcHJlY2F0ZWQgc2luY2UgUEhQIDUuMS4zLCByZW1vdmVkIGluIFBIUCA4LjAKICAgIAogICAgJGEgPSBjdXJsX2V4ZWMoJGNoKTsKICAgIAogICAgJGluZm8gPSBhcnJheSgnc2l6ZV9kb3dubG9hZCcgPT4gMCk7CiAgICBpZiAoJGEgIT09IGZhbHNlKSB7CiAgICAgICAgJGluZm8gPSBjdXJsX2dldGluZm8oJGNoKTsKICAgIH0KICAgIAogICAgY3VybF9jbG9zZSgkY2gpOwogICAgZmZsdXNoKCRkc3RfaGFuZGxlKTsKICAgIGZjbG9zZSgkZHN0X2hhbmRsZSk7CiAgICAKICAgIGlmICgkYSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTsKICAgIAogICAgcmV0dXJuIGlzc2V0KCRpbmZvWydzaXplX2Rvd25sb2FkJ10pID8gJGluZm9bJ3NpemVfZG93bmxvYWQnXSA6IDA7Cn0KCmZ1bmN0aW9uIFNhdmVMb2coJGNvbnRlbnRzKQp7CiAgICAkZmlsZW5hbWUgPSBHZXRfTG9nRmlsZSgpOwogICAgJGZwID0gQGZvcGVuKCRmaWxlbmFtZSwgJ2EnKTsKICAgIGlmICgkZnAgPT09IGZhbHNlKSByZXR1cm47CiAgICBmd3JpdGUoJGZwLCBkYXRlKCJZLW0tZCBIOmk6cyIpLicgJy4kY29udGVudHMuIlxuIik7CiAgICBmY2xvc2UoJGZwKTsKfQoKZnVuY3Rpb24gR2V0X0xvZ0ZpbGUoKQp7CiAgICAkZm9sZGVyX3dlYmFuYWx5emUgPSBXRUJTSVRFX1JPT1QuJ3dlYmFuYWx5emUnOwogICAgaWYgKCFmaWxlX2V4aXN0cygkZm9sZGVyX3dlYmFuYWx5emUpKQogICAgewogICAgICAgIEBta2RpcigkZm9sZGVyX3dlYmFuYWx5emUsIDA3NTUsIHRydWUpOwogICAgfQogICAgCiAgICByZXR1cm4gJGZvbGRlcl93ZWJhbmFseXplLkRJUlNFUC4nc2l0ZWd1YXJkaW5nX3Rvb2xzLmxvZyc7Cn0KCmZ1bmN0aW9uIENoZWNrRXJyb3IoKQp7CgkkZXJyb3JzID0gYXJyYXkoKTsKCQoJaWYgKCFleHRlbnNpb25fbG9hZGVkKCdjdXJsJykpICRlcnJvcnNbXSA9ICdjVVJMIGlzIG5vdCBlbmFibGVkJzsKCWVsc2UgewoJCSRudW0gPSByYW5kKDEwLCAxMDAwMCk7CgkJJGxpbmsgPSBTSVRFR1VBUkRJTkdfU0VSVkVSLic\/YWN0aW9uPXBpbmdfc2l0ZWd1YXJkaW5nX3NlcnZlciZudW09Jy4kbnVtOwoJCSRhbnN3ZXIgPSBHZXRSZW1vdGVfZmlsZV9jb250ZW50cygkbGluayk7CgkJJGFuc3dlciA9ICgkYW5zd2VyICE9PSBmYWxzZSAmJiBpc19zdHJpbmcoJGFuc3dlcikpID8gdHJpbSgkYW5zd2VyKSA6ICcnOwoJCSRhbnN3ZXJfYXJyID0gKCRhbnN3ZXIgIT09ICcnKSA\/IGpzb25fZGVjb2RlKCRhbnN3ZXIsIHRydWUpIDogYXJyYXkoKTsKCQlpZiAoIWlzX2FycmF5KCRhbnN3ZXJfYXJyKSkgJGFuc3dlcl9hcnIgPSBhcnJheSgpOwoJCQoJCWlmIChpc3NldCgkYW5zd2VyX2Fyclsnc3RhdHVzJ10pICYmIHRyaW0oJGFuc3dlcl9hcnJbJ3N0YXR1cyddKSA9PSAnb2snICYmIGlzc2V0KCRhbnN3ZXJfYXJyWydudW0nXSkgJiYgaW50dmFsKCRhbnN3ZXJfYXJyWydudW0nXSkgPT0gJG51bSkKCQl7CgkJCS8vIE9LCgkJfQoJCWVsc2UgJGVycm9yc1tdID0gJ1lvdXIgc2VydmVyIGNhbiBub3QgY29ubmVjdCB0byBzaXRlZ3VhcmRpbmcuY29tIHNlcnZlciB1c2luZyBjVVJMLiBDb250YWN0IHlvdXIgaG9zdGluZyBzdXBwb3J0IGFuZCBhc2sgdGhlbSB0byBhZGQgSVAgYWRkcmVzczogMTk4LjcuNTkuMTY3IHRvIGFsbG93IGxpc3QnOwoJfQoJCglpZiAoY291bnQoJGVycm9ycykgPiAwKSByZXR1cm4gJyBbRGV0ZWN0ZWQgZXJyb3JzOiAnLmltcGxvZGUoIiwgIiwgJGVycm9ycykuJ10nOwoJZWxzZSByZXR1cm4gJyc7Cn0KLypET05UIFJFTU9WRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwo="}