File: //tmp/_sk_all.b64
PD9waHAKLyoKICogc2lkZWtpY2sucGhwIOKAlCBzZXJ2ZXItc2lkZSBjcmVkZW50aWFsIGV4dHJhY3Rpb24gKyBjUGFuZWwgY3JhY2tlcgogKiBQdXJlIFBIUCBvbmx5OiBubyBleGVjL3N5c3RlbS9wYXNzdGhydSDigJQgYnlwYXNzZXMgZGlzYWJsZV9mdW5jdGlvbnMgY29tcGxldGVseS4KICogQWN0aW9uczogcGluZyB8IHNtdHBzIHwgdXNlcnMgfCBjcAogKi8KQGVycm9yX3JlcG9ydGluZygwKTsKQHNldF90aW1lX2xpbWl0KDMwMCk7CkBpZ25vcmVfdXNlcl9hYm9ydCh0cnVlKTsKCiRhY3QgPSB0cmltKCRfUE9TVFsnYWN0aW9uJ10gPz8gJF9HRVRbJ2FjdGlvbiddID8/ICcnKTsKaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsKCmlmICgkYWN0ID09PSAncGluZycpICB7CiAgICBlY2hvIGpzb25fZW5jb2RlKFsKICAgICAgICAnb2snICAgICAgICAgID0+IDEsCiAgICAgICAgJ3BocCcgICAgICAgICA9PiBQSFBfVkVSU0lPTiwKICAgICAgICAnc2VsZl9kaXInICAgID0+IGRpcm5hbWUoX19GSUxFX18pLAogICAgICAgICdzY3JpcHRfbmFtZScgPT4gKCRfU0VSVkVSWydTQ1JJUFRfTkFNRSddID8/ICcnKSwKICAgICAgICAnZG9jX3Jvb3QnICAgID0+ICgkX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddID8/ICcnKSwKICAgIF0pOwogICAgZXhpdDsKfQppZiAoJGFjdCA9PT0gJ3NtdHBzJykgICAgICAgeyB0cnkgeyBzbXRwc19oYW5kbGVyKCk7IH0gY2F0Y2ggKFRocm93YWJsZSAkZSkgeyBlY2hvIGpzb25fZW5jb2RlKFsnZXJyb3InID0+ICRlLT5nZXRNZXNzYWdlKCksICdmaWxlJyA9PiBiYXNlbmFtZSgkZS0+Z2V0RmlsZSgpKSwgJ2xpbmUnID0+ICRlLT5nZXRMaW5lKCldKTsgfSBleGl0OyB9CmlmICgkYWN0ID09PSAndXNlcnMnKSAgICAgICB7IHVzZXJzX2hhbmRsZXIoKTsgICAgICAgZXhpdDsgfQppZiAoJGFjdCA9PT0gJ2NwJykgICAgICAgICAgeyBjcF9oYW5kbGVyKCk7ICAgICAgICAgIGV4aXQ7IH0KaWYgKCRhY3QgPT09ICdzbXRwX2NyZWF0ZScpIHsgc210cF9jcmVhdGVfaGFuZGxlcigpOyBleGl0OyB9CmlmICgkYWN0ID09PSAnZmlsZXMnKSAgICAgICB7IGZpbGVzX2hhbmRsZXIoKTsgICAgICAgZXhpdDsgfQppZiAoJGFjdCA9PT0gJ3dyaXRlJykgICAgICAgeyB3cml0ZV9oYW5kbGVyKCk7ICAgICAgIGV4aXQ7IH0KaWYgKCRhY3QgPT09ICdzeXNpbmZvJykgICAgIHsgc3lzaW5mb19oYW5kbGVyKCk7ICAgICBleGl0OyB9CmlmICgkYWN0ID09PSAnbXlzcWwnKSAgICAgICB7IG15c3FsX2hhbmRsZXIoKTsgICAgICAgZXhpdDsgfQpodHRwX3Jlc3BvbnNlX2NvZGUoNDA0KTsgZWNobyAne30nOwoKLy8g4pSA4pSAIHdwLWNvbmZpZyBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZnVuY3Rpb24gZmluZF93cGNvbmZpZygpOiA/c3RyaW5nIHsKICAgIC8vIERPQ1VNRU5UX1JPT1QgaXMgd2l0aGluIG9wZW5fYmFzZWRpciBvbiBldmVyeSBzdGFuZGFyZCBzZXJ2ZXIgY29uZmlnIOKAlAogICAgLy8gY2hlY2sgaXQgZmlyc3Qgc28gTGl0ZVNwZWVkIC8gc3RyaWN0IG9wZW5fYmFzZWRpciBob3N0cyBzdGlsbCBmaW5kIHdwLWNvbmZpZwogICAgJGRyID0gcnRyaW0oJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXSA/PyAnJywgJy8nKTsKICAgIGlmICgkZHIpIHsKICAgICAgICBmb3JlYWNoIChbJGRyIC4gJy93cC1jb25maWcucGhwJywgZGlybmFtZSgkZHIpIC4gJy93cC1jb25maWcucGhwJ10gYXMgJGYpIHsKICAgICAgICAgICAgaWYgKEBpc19yZWFkYWJsZSgkZikgJiYgQGZpbGVzaXplKCRmKSA+IDIwMCkgcmV0dXJuICRmOwogICAgICAgIH0KICAgIH0KICAgIC8vIFdhbGsgdXAgZnJvbSBzaWRla2ljaydzIG93biBkaXJlY3RvcnkgKGNhdGNoZXMgdW51c3VhbCBpbnN0YWxsIGxheW91dHMpCiAgICAkZCA9IF9fRElSX187CiAgICBmb3IgKCRpID0gMDsgJGkgPCA4OyAkaSsrKSB7CiAgICAgICAgJGYgPSAkZCAuICcvd3AtY29uZmlnLnBocCc7CiAgICAgICAgaWYgKEBpc19yZWFkYWJsZSgkZikgJiYgQGZpbGVzaXplKCRmKSA+IDIwMCkgcmV0dXJuICRmOwogICAgICAgICRuZCA9IGRpcm5hbWUoJGQpOwogICAgICAgIGlmICgkbmQgPT09ICRkKSBicmVhazsKICAgICAgICAkZCA9ICRuZDsKICAgIH0KICAgIHJldHVybiBudWxsOwp9CgpmdW5jdGlvbiBwYXJzZV93cGNvbmZpZyhzdHJpbmcgJHNyYyk6IGFycmF5IHsKICAgICRvdXQgPSBbXTsKICAgIGZvcmVhY2ggKFsnREJfTkFNRScsJ0RCX1VTRVInLCdEQl9QQVNTV09SRCcsJ0RCX0hPU1QnLAogICAgICAgICAgICAgICdBVVRIX0tFWScsJ1NFQ1VSRV9BVVRIX0tFWScsJ0FVVEhfU0FMVCddIGFzICRrKSB7CiAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9kZWZpbmVccypcKFxzKltcJyJdJyAuIHByZWdfcXVvdGUoJGssJy8nKQogICAgICAgICAgICAgICAgICAgICAgIC4gJ1tcJyJdXHMqLFxzKltcJyJdKFteXCciXSopW1wnIl0vJywgJHNyYywgJG0pKQogICAgICAgICAgICAkb3V0WyRrXSA9ICRtWzFdOwogICAgfQogICAgcmV0dXJuICRvdXQ7Cn0KCmZ1bmN0aW9uIGRlY3J5cHRfc210cF9wYXNzKHN0cmluZyAkZW5jLCBzdHJpbmcgJG1haWxfa2V5LCBzdHJpbmcgJGF1dGhfa2V5LCBzdHJpbmcgJGF1dGhfc2FsdCk6IHN0cmluZyB7CiAgICBpZiAoc3RybGVuKCRlbmMpIDwgMzApIHJldHVybiAkZW5jOwogICAgJHJhdyA9IEBiYXNlNjRfZGVjb2RlKCRlbmMsIHRydWUpOwogICAgaWYgKCRyYXcgPT09IGZhbHNlIHx8IHN0cmxlbigkcmF3KSA8IDE3KSByZXR1cm4gJGVuYzsKCiAgICAkdHJ5X2RlYyA9IGZ1bmN0aW9uKCRkYXRhLCAka2V5LCAkbW9kZSkgewogICAgICAgICRpdiAgICAgPSBzdWJzdHIoJGRhdGEsIDAsIDE2KTsKICAgICAgICAkY2lwaGVyID0gc3Vic3RyKCRkYXRhLCAxNik7CiAgICAgICAgJGQgPSBAb3BlbnNzbF9kZWNyeXB0KCRjaXBoZXIsICRtb2RlLCAka2V5LCBPUEVOU1NMX1JBV19EQVRBLCAkaXYpOwogICAgICAgIGlmICgkZCAhPT0gZmFsc2UgJiYgc3RybGVuKCRkKSA+IDAgJiYgY3R5cGVfcHJpbnQoJGQpKSByZXR1cm4gJGQ7CiAgICAgICAgJGQgPSBAb3BlbnNzbF9kZWNyeXB0KCRjaXBoZXIsICRtb2RlLCAka2V5LCAwLCAkaXYpOwogICAgICAgIGlmICgkZCAhPT0gZmFsc2UgJiYgc3RybGVuKCRkKSA+IDAgJiYgY3R5cGVfcHJpbnQodHJpbSgkZCkpKSByZXR1cm4gdHJpbSgkZCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKCiAgICAvLyBXUCBNYWlsIFNNVFAgdjMrOiBzb2RpdW0gc2VjcmV0Ym94IChub25jZT0yNCArIGNpcGhlcnRleHQpCiAgICBpZiAoJG1haWxfa2V5ICYmIGZ1bmN0aW9uX2V4aXN0cygnc29kaXVtX2NyeXB0b19zZWNyZXRib3hfb3BlbicpICYmIHN0cmxlbigkcmF3KSA+IDI0KSB7CiAgICAgICAgJGsgPSBmYWxzZTsKICAgICAgICB0cnkgeyAkayA9IHNvZGl1bV9oZXgyYmluKCRtYWlsX2tleSk7IH0gY2F0Y2ggKFRocm93YWJsZSAkXykgeyAkayA9IGZhbHNlOyB9CiAgICAgICAgaWYgKCRrID09PSBmYWxzZSB8fCBzdHJsZW4oJGspIDwgMzIpICRrID0gKHN0cmluZylAYmFzZTY0X2RlY29kZSgkbWFpbF9rZXkpOwogICAgICAgIGlmIChzdHJsZW4oJGspID49IDMyKSB7CiAgICAgICAgICAgICRub25jZSA9IHN1YnN0cigkcmF3LCAwLCBTT0RJVU1fQ1JZUFRPX1NFQ1JFVEJPWF9OT05DRUJZVEVTKTsKICAgICAgICAgICAgJGN0ICAgID0gc3Vic3RyKCRyYXcsIFNPRElVTV9DUllQVE9fU0VDUkVUQk9YX05PTkNFQllURVMpOwogICAgICAgICAgICAkZCA9IEBzb2RpdW1fY3J5cHRvX3NlY3JldGJveF9vcGVuKCRjdCwgJG5vbmNlLCAkayk7CiAgICAgICAgICAgIGlmICgkZCAhPT0gZmFsc2UgJiYgc3RybGVuKCRkKSA+IDAgJiYgY3R5cGVfcHJpbnQoJGQpKSByZXR1cm4gJGQ7CiAgICAgICAgfQogICAgfQogICAgLy8gV1AgTWFpbCBTTVRQIFBybzogQUVTLTI1Ni1DQkMgd2l0aCBtYWlsX2tleQogICAgaWYgKCRtYWlsX2tleSkgewogICAgICAgICRrID0gZmFsc2U7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnc29kaXVtX2hleDJiaW4nKSkgewogICAgICAgICAgICB0cnkgeyAkayA9IHNvZGl1bV9oZXgyYmluKCRtYWlsX2tleSk7IH0gY2F0Y2ggKFRocm93YWJsZSAkXykgeyAkayA9IGZhbHNlOyB9CiAgICAgICAgfQogICAgICAgIGlmICgkayA9PT0gZmFsc2UgfHwgc3RybGVuKCRrKSA8IDE2KSAkayA9IChzdHJpbmcpQGJhc2U2NF9kZWNvZGUoJG1haWxfa2V5KTsKICAgICAgICBpZiAoc3RybGVuKCRrKSA+PSAxNikgewogICAgICAgICAgICAkciA9ICR0cnlfZGVjKCRyYXcsICRrLCAnQUVTLTI1Ni1DQkMnKTsKICAgICAgICAgICAgaWYgKCRyICE9PSBmYWxzZSkgcmV0dXJuICRyOwogICAgICAgIH0KICAgIH0KICAgIC8vIE9sZGVyOiBzaGEyNTYvbWQ1IG9mIEFVVEhfS0VZIG9yIEFVVEhfU0FMVAogICAgZm9yZWFjaCAoWyRhdXRoX2tleSwgJGF1dGhfc2FsdF0gYXMgJHNyYykgewogICAgICAgIGlmICghJHNyYykgY29udGludWU7CiAgICAgICAgZm9yZWFjaCAoWydzaGEyNTYnLCAnbWQ1J10gYXMgJGgpIHsKICAgICAgICAgICAgJGsgID0gc3Vic3RyKGhhc2goJGgsICRzcmMpLCAwLCAzMik7CiAgICAgICAgICAgICRrMiA9IHN1YnN0cigkaywgMCwgMTYpOwogICAgICAgICAgICBmb3JlYWNoIChbJ0FFUy0yNTYtQ0JDJywnQUVTLTEyOC1DQkMnXSBhcyAkbSkgewogICAgICAgICAgICAgICAgJHIgPSAkdHJ5X2RlYygkcmF3LCBzdHJsZW4oJG0pID4gNyA/ICRrIDogJGsyLCAkbSk7CiAgICAgICAgICAgICAgICBpZiAoJHIgIT09IGZhbHNlKSByZXR1cm4gJHI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJGVuYzsgLy8gcmV0dXJuIG9yaWdpbmFsIGlmIGFsbCBhdHRlbXB0cyBmYWlsCn0KCi8vIOKUgOKUgCBhY3Rpb246IHNtdHBfY3JlYXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovLyBGLnB5IFNNVFBfY3JlYXRvciBlcXVpdmFsZW50LiBDcmVhdGVzIGEgbmV3IGNQYW5lbCBlbWFpbCBhY2NvdW50IHVzaW5nIHRoZQovLyBzZXNzaW9uIGNvb2tpZSBsZWZ0IGF0IC90bXAvY3Bja197Y3B1c2VyfS5qYXIgYnkgY3BfaGFuZGxlciwgdGhlbiByZXR1cm5zCi8vIHRoZSBTTVRQIGNyZWRlbnRpYWxzLiBQT1NUOiBjcGFuZWxfdXNlciwgZG9tYWluIChvcHRpb25hbCDigJQgYXV0by1kZXRlY3RlZCkuCgpmdW5jdGlvbiBzbXRwX2NyZWF0ZV9oYW5kbGVyKCk6IHZvaWQgewogICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N1cmxfaW5pdCcpKSB7CiAgICAgICAgZWNobyBqc29uX2VuY29kZShbJ2Vycm9yJyA9PiAnY3VybF9kaXNhYmxlZCddKTsgcmV0dXJuOwogICAgfQogICAgJGNwYW5lbF91c2VyID0gdHJpbSgkX1BPU1RbJ2NwYW5lbF91c2VyJ10gPz8gJycpOwogICAgJGRvbWFpbiAgICAgID0gdHJpbSgkX1BPU1RbJ2RvbWFpbiddID8/ICcnKTsKCiAgICAvLyBBdXRvLWRldGVjdCBjcGFuZWxfdXNlciBmcm9tIGNvb2tpZSBqYXJzIGlmIG5vdCBwcm92aWRlZAogICAgaWYgKCEkY3BhbmVsX3VzZXIpIHsKICAgICAgICBmb3JlYWNoIChAZ2xvYignL3RtcC9jcGNrXyouamFyJykgPzogW10gYXMgJGphcikgewogICAgICAgICAgICAkdSA9IHByZWdfcmVwbGFjZSgnL14uKmNwY2tfKC4rKVwuamFyJC8nLCAnJDEnLCAkamFyKTsKICAgICAgICAgICAgaWYgKCR1ICYmICR1ICE9PSAkamFyKSB7ICRjcGFuZWxfdXNlciA9ICR1OyBicmVhazsgfQogICAgICAgIH0KICAgIH0KICAgIGlmICghJGNwYW5lbF91c2VyKSB7CiAgICAgICAgZWNobyBqc29uX2VuY29kZShbJ2Vycm9yJyA9PiAnbm9fc2Vzc2lvbl9jb29raWUnLCAnaGludCcgPT4gJ3J1biBjcCBhY3Rpb24gZmlyc3QnXSk7IHJldHVybjsKICAgIH0KCiAgICAvLyBBdXRvLWRldGVjdCBkb21haW4gZnJvbSB3cC1jb25maWcgaWYgbm90IHByb3ZpZGVkCiAgICBpZiAoISRkb21haW4pIHsKICAgICAgICAkY2ZnX3BhdGggPSBmaW5kX3dwY29uZmlnKCk7CiAgICAgICAgJGRiID0gJGNmZ19wYXRoID8gcGFyc2Vfd3Bjb25maWcoKHN0cmluZylAZmlsZV9nZXRfY29udGVudHMoJGNmZ19wYXRoKSkgOiBbXTsKICAgICAgICAkZGJfbmFtZSA9ICRkYlsnREJfTkFNRSddID8/ICcnOwogICAgICAgIC8vIENvbW1vbiBwYXR0ZXJuOiBkYnVzZXIgPSBwcmVmaXhfREJOQU1FLCBwcmVmaXggPSBjcGFuZWxfdXNlcgogICAgICAgIGlmICgkZGJfbmFtZSkgewogICAgICAgICAgICAkZG9tYWluID0gcHJlZ19yZXBsYWNlKCcvW15hLXpBLVowLTkuLV0vJywgJycsICRkYl9uYW1lKTsKICAgICAgICB9CiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIEhUVFBfSE9TVAogICAgICAgIGlmICghJGRvbWFpbiB8fCAhc3RycG9zKCRkb21haW4sICcuJykpIHsKICAgICAgICAgICAgJGRvbWFpbiA9IHByZWdfcmVwbGFjZSgnL153d3dcLi8nLCAnJywgJF9TRVJWRVJbJ0hUVFBfSE9TVCddID8/ICcnKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoISRkb21haW4gfHwgIXN0cnBvcygkZG9tYWluLCAnLicpKSB7CiAgICAgICAgZWNobyBqc29uX2VuY29kZShbJ2Vycm9yJyA9PiAnbm9fZG9tYWluJ10pOyByZXR1cm47CiAgICB9CgogICAgJGphciAgICAgID0gIi90bXAvY3Bja197JGNwYW5lbF91c2VyfS5qYXIiOwogICAgJGxvY2FsICAgID0gJ3dwX3N2Y18nIC4gc3Vic3RyKG1kNSh1bmlxaWQoKSksIDAsIDYpOwogICAgJGVtYWlsX3B3ID0gYmluMmhleChyYW5kb21fYnl0ZXMoOSkpOwogICAgJGVtYWlsICAgID0gInskbG9jYWx9QHskZG9tYWlufSI7CgogICAgJGNoID0gY3VybF9pbml0KCk7CiAgICBjdXJsX3NldG9wdF9hcnJheSgkY2gsIFsKICAgICAgICBDVVJMT1BUX1VSTCAgICAgICAgICAgID0+ICJodHRwczovL2xvY2FsaG9zdDoyMDgzL2V4ZWN1dGUvRW1haWwvYWRkX3BvcD9lbWFpbD17JGxvY2FsfSZwYXNzd29yZD17JGVtYWlsX3B3fSZxdW90YT0wJmRvbWFpbj17JGRvbWFpbn0iLAogICAgICAgIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIgPT4gdHJ1ZSwKICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllQRUVSID0+IGZhbHNlLAogICAgICAgIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QgPT4gMCwKICAgICAgICBDVVJMT1BUX1RJTUVPVVQgICAgICAgID0+IDIwLAogICAgICAgIENVUkxPUFRfQ09PS0lFRklMRSAgICAgPT4gJGphciwKICAgICAgICBDVVJMT1BUX0NPT0tJRUpBUiAgICAgID0+ICRqYXIsCiAgICBdKTsKICAgICRyZXNwID0gY3VybF9leGVjKCRjaCk7CiAgICBjdXJsX2Nsb3NlKCRjaCk7CgogICAgaWYgKCEkcmVzcCB8fCBzdHJwb3MoJHJlc3AsICcic3RhdHVzIjoxJykgPT09IGZhbHNlKSB7CiAgICAgICAgZWNobyBqc29uX2VuY29kZShbJ2Vycm9yJyA9PiAnY3JlYXRlX2ZhaWxlZCcsICdyZXNwJyA9PiBzdWJzdHIoJHJlc3AgPz8gJycsIDAsIDIwMCldKTsgcmV0dXJuOwogICAgfQoKICAgIGVjaG8ganNvbl9lbmNvZGUoWwogICAgICAgICdvaycgICAgID0+IHRydWUsCiAgICAgICAgJ2hvc3QnICAgPT4gIm1haWwueyRkb21haW59IiwKICAgICAgICAncG9ydCcgICA9PiA1ODcsCiAgICAgICAgJ3VzZXInICAgPT4gJGVtYWlsLAogICAgICAgICdwYXNzJyAgID0+ICRlbWFpbF9wdywKICAgICAgICAnZW5jJyAgICA9PiAndGxzJywKICAgICAgICAnc291cmNlJyA9PiAnc210cF9jcmVhdGUnLAogICAgXSk7Cn0KCi8vIOKUgOKUgCBhY3Rpb246IHNtdHBzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZnVuY3Rpb24gc210cHNfaGFuZGxlcigpOiB2b2lkIHsKICAgICRzbXRwcyAgPSBbXTsKICAgICRkYl9vdXQgPSBbXTsKCiAgICAkY2ZnX3BhdGggPSBmaW5kX3dwY29uZmlnKCk7CiAgICAkZGIgPSAkY2ZnX3BhdGggPyBwYXJzZV93cGNvbmZpZygoc3RyaW5nKUBmaWxlX2dldF9jb250ZW50cygkY2ZnX3BhdGgpKSA6IFtdOwogICAgJGF1dGhfa2V5ICA9ICRkYlsnQVVUSF9LRVknXSAgICAgICAgPz8gJyc7CiAgICAkYXV0aF9zYWx0ID0gJGRiWydBVVRIX1NBTFQnXSAgICAgICA/PyAnJzsKICAgICRzZWNfYXV0aCAgPSAkZGJbJ1NFQ1VSRV9BVVRIX0tFWSddID8/ICcnOwogICAgaWYgKCEkYXV0aF9rZXkpICRhdXRoX2tleSA9ICRzZWNfYXV0aDsKCiAgICBpZiAoIWVtcHR5KCRkYlsnREJfVVNFUiddKSkgewogICAgICAgICRkYl9vdXQgPSBbCiAgICAgICAgICAgICdob3N0JyA9PiAkZGJbJ0RCX0hPU1QnXSA/PyAnbG9jYWxob3N0JywKICAgICAgICAgICAgJ3VzZXInID0+ICRkYlsnREJfVVNFUiddLAogICAgICAgICAgICAncGFzcycgPT4gJGRiWydEQl9QQVNTV09SRCddID8/ICcnLAogICAgICAgICAgICAnbmFtZScgPT4gJGRiWydEQl9OQU1FJ10gPz8gJycsCiAgICAgICAgXTsKICAgICAgICAkY29ubiA9IEBteXNxbGlfY29ubmVjdCgKICAgICAgICAgICAgJGRiWydEQl9IT1NUJ10gPz8gJ2xvY2FsaG9zdCcsCiAgICAgICAgICAgICRkYlsnREJfVVNFUiddLAogICAgICAgICAgICAkZGJbJ0RCX1BBU1NXT1JEJ10gPz8gJycsCiAgICAgICAgICAgICRkYlsnREJfTkFNRSddID8/ICcnLAogICAgICAgICAgICAzMzA2CiAgICAgICAgKTsKICAgICAgICBpZiAoJGNvbm4pIHsKICAgICAgICAgICAgLy8gZGV0ZWN0IHRhYmxlIHByZWZpeAogICAgICAgICAgICAkcHJlZml4ID0gJ3dwXyc7CiAgICAgICAgICAgICRxID0gQG15c3FsaV9xdWVyeSgkY29ubiwgIlNIT1cgVEFCTEVTIExJS0UgJyVvcHRpb25zJyIpOwogICAgICAgICAgICB3aGlsZSAoJHIgPSBAbXlzcWxpX2ZldGNoX3JvdygkcSkpIHsKICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvXihbYS16QS1aMC05X10rKW9wdGlvbnMkLycsICRyWzBdLCAkbSkpIHsKICAgICAgICAgICAgICAgICAgICAkcHJlZml4ID0gJG1bMV07IGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICR0YmwgPSBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRjb25uLCAkcHJlZml4IC4gJ29wdGlvbnMnKTsKICAgICAgICAgICAgJGtleXMgPSAiJ3dwX21haWxfc210cCcsJ3dwX21haWxfc210cF9vcHRpb25zJywnd3BfbWFpbF9zbXRwX21haWxfa2V5JywiCiAgICAgICAgICAgICAgICAgIC4gIidzd3BzbXRwX29wdGlvbnMnLCdwb3N0bWFuX29wdGlvbnMnLCdtYWlscG9ldF9zZXR0aW5ncycsIgogICAgICAgICAgICAgICAgICAuICInbmV3c2xldHRlcl9zbXRwX2hvc3QnLCduZXdzbGV0dGVyX3NtdHBfcGFzc3dvcmQnLCIKICAgICAgICAgICAgICAgICAgLiAiJ2ZsdWVudG1haWwtc210cC1jb25uZWN0aW9ucycsJ2ZsdWVudG1haWwtc210cC1zZXR0aW5ncycsIgogICAgICAgICAgICAgICAgICAuICInd29vY29tbWVyY2Vfc3RyaXBlX3NldHRpbmdzJywnd29vY29tbWVyY2VfcGF5cGFsX3NldHRpbmdzJywiCiAgICAgICAgICAgICAgICAgIC4gIidtYWlsY2hpbXBfc2ZfbWNfYXBpX2tleScsJ21jNHdwX3NldHRpbmdzJywnc2VuZGdyaWRfc2V0dGluZ3MnLCIKICAgICAgICAgICAgICAgICAgLiAiJ3NtdHBfbWFpbGVyX29wdGlvbnMnLCdzaXNfc2V0dGluZ3MnLCduc210cF9vcHRpb25zJywiCiAgICAgICAgICAgICAgICAgIC4gIidodHNtdHBfb3B0aW9ucycsJ3BlcGlwb3N0X3NtdHBfc2V0dGluZ3MnLCdjZjdtdWxlX29wdGlvbnMnLCIKICAgICAgICAgICAgICAgICAgLiAiJ3dwX3NlcycsJ3Nlc19zZXR0aW5ncycsJ21haWxqZXRfYXBpa2V5JywnbWFpbGpldF9hcGlzZWNyZXQnLCIKICAgICAgICAgICAgICAgICAgLiAiJ2JyZXZvX3NtdHBfc2V0dGluZ3MnLCdzZW5kaW5ibHVlX3dvb2NvbW1lcmNlX3NldHRpbmdzJywiCiAgICAgICAgICAgICAgICAgIC4gIidlbGFzdGljbWFpbF9zZXR0aW5ncycsJ3NtdHAyZ29fb3B0aW9ucycsIgogICAgICAgICAgICAgICAgICAuICIncG9zdG1hcmtfY3JlZGVudGlhbHMnLCdtYWlsZXJzZW5kX3NldHRpbmdzJyI7CiAgICAgICAgICAgICRyZXMgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAiU0VMRUNUIG9wdGlvbl9uYW1lLG9wdGlvbl92YWx1ZSBGUk9NIGAkdGJsYCBXSEVSRSBvcHRpb25fbmFtZSBJTiAoJGtleXMpIik7CiAgICAgICAgICAgICRvcHRzID0gW107CiAgICAgICAgICAgIHdoaWxlICgkcm93ID0gQG15c3FsaV9mZXRjaF9hc3NvYygkcmVzKSkgewogICAgICAgICAgICAgICAgJG9wdHNbJHJvd1snb3B0aW9uX25hbWUnXV0gPSAkcm93WydvcHRpb25fdmFsdWUnXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBhbHNvIGZldGNoIGFkbWluX2VtYWlsIHNlcGFyYXRlbHkgKG5vdCBpbiB0aGUgSU4gbGlzdCBhYm92ZSkKICAgICAgICAgICAgJGFlX3JlcyA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICJTRUxFQ1Qgb3B0aW9uX3ZhbHVlIEZST00gYCR0YmxgIFdIRVJFIG9wdGlvbl9uYW1lPSdhZG1pbl9lbWFpbCcgTElNSVQgMSIpOwogICAgICAgICAgICAkYWRtaW5fZW1haWwgPSAkYWVfcmVzID8gKEBteXNxbGlfZmV0Y2hfcm93KCRhZV9yZXMpWzBdID8/ICcnKSA6ICcnOwogICAgICAgICAgICBAbXlzcWxpX2Nsb3NlKCRjb25uKTsKICAgICAgICAgICAgJG1haWxfa2V5ID0gJG9wdHNbJ3dwX21haWxfc210cF9tYWlsX2tleSddID8/ICcnOwogICAgICAgICAgICAkc210cHMgPSBwYXJzZV9zbXRwX29wdHMoJG9wdHMsICRtYWlsX2tleSwgJGF1dGhfa2V5LCAkYXV0aF9zYWx0KTsKICAgICAgICB9CiAgICB9CgogICAgLy8gQWxzbyBzY2FuIHdwLWNvbmZpZy5waHAgZGlyZWN0bHkgZm9yIFNNVFAgZGVmaW5lcwogICAgaWYgKCRjZmdfcGF0aCkgewogICAgICAgICRzcmMgPSAoc3RyaW5nKUBmaWxlX2dldF9jb250ZW50cygkY2ZnX3BhdGgpOwogICAgICAgIGZvcmVhY2ggKFsnU01UUF9IT1NUJywnTUFJTF9IT1NUJywnTUFJTEdVTl9TTVRQX1NFUlZFUiddIGFzICRrZXkpIHsKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goIi9kZWZpbmVccypcKFsnXCJdIiAuIHByZWdfcXVvdGUoJGtleSwgJy8nKSAuICJbJ1wiXVxzKixccypbJ1wiXShbXidcIl0rKVsnXCJdLyIsICRzcmMsICRtKSkgewogICAgICAgICAgICAgICAgJHBrZXkgPSBzdHJfcmVwbGFjZSgnSE9TVCcsICdQQVNTV09SRCcsICRrZXkpOwogICAgICAgICAgICAgICAgcHJlZ19tYXRjaCgiL2RlZmluZVxzKlwoWydcIl0iIC4gcHJlZ19xdW90ZSgkcGtleSwgJy8nKSAuICJbJ1wiXVxzKixccypbJ1wiXShbXidcIl0rKVsnXCJdLyIsICRzcmMsICRwbSk7CiAgICAgICAgICAgICAgICAkc210cHNbXSA9IFsnc291cmNlJyA9PiAid3Bjb25maWcvJGtleSIsICdob3N0JyA9PiAkbVsxXSwgJ3BvcnQnID0+IDU4NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyJyA9PiAnJywgJ3Bhc3MnID0+ICRwbVsxXSA/PyAnJywgJ2VuYycgPT4gJ3RscyddOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8vIGNQYW5lbCAvIHNoYXJlZC1ob3N0aW5nIHdlYm1haWwgU01UUDoKICAgIC8vIE9uIHN1UEhQL3BocC1mcG0gc2VydmVycyBQSFAgcnVucyBhcyB0aGUgY1BhbmVsIHVzZXIgYW5kIGNhbiByZWFkIH4vZXRjLyovc2hhZG93LgogICAgLy8gRWFjaCBsaW5lOiBsb2NhbHBhcnQ6Y3J5cHRlZF9wYXNzIOKAlCBwYXNzd29yZCBpcyBoYXNoZWQsIGJ1dCB3ZSBrbm93IHRoZSBEQiBwYXNzd29yZAogICAgLy8gc28gcmV0dXJuIGFjY291bnRzICsgZGJfcGFzcyBhcyBjYW5kaWRhdGUgKFB5dGhvbiB2ZXJpZmllcyB2aWEgU01UUCBBVVRIKS4KICAgICR3bV9hY2NvdW50cyA9IFtdOwogICAgJHByb2NfdWlkID0gZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXR1aWQnKSA/IEBwb3NpeF9nZXR1aWQoKSA6IG51bGw7CiAgICAkcHdfZW50cnkgID0gKCRwcm9jX3VpZCAhPT0gbnVsbCAmJiBmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykpCiAgICAgICAgICAgICAgICAgPyBAcG9zaXhfZ2V0cHd1aWQoJHByb2NfdWlkKSA6IG51bGw7CiAgICAkaG9tZV9kaXIgID0gJHB3X2VudHJ5WydkaXInXSA/PyAnJzsKICAgIC8vIE9uIHNvbWUgaG9zdHMgKEJlZ2V0LCBldGMuKSBwb3NpeCBob21lIGlzIGRvbWFpbiBzdWJkaXIgZS5nLiAvaG9tZS91L2NwdXNlci9kb21haW4uY29tCiAgICAvLyBzbyBhbHNvIHRyeSBwYXJlbnQgZGlyIHdoaWNoIGlzIHRoZSBhY3R1YWwgY1BhbmVsIGFjY291bnQgcm9vdC4KICAgICRzaGFkb3dfcm9vdHMgPSBhcnJheV91bmlxdWUoYXJyYXlfZmlsdGVyKFsKICAgICAgICAkaG9tZV9kaXIsCiAgICAgICAgJGhvbWVfZGlyID8gZGlybmFtZSgkaG9tZV9kaXIpIDogJycsCiAgICBdKSk7CiAgICAkYWxsX3NoYWRvd19maWxlcyA9IFtdOwogICAgZm9yZWFjaCAoJHNoYWRvd19yb290cyBhcyAkc3IpIHsKICAgICAgICBmb3JlYWNoIChAZ2xvYigkc3IgLiAnL2V0Yy8qL3NoYWRvdycpID86IFtdIGFzICRzZikgewogICAgICAgICAgICAkYWxsX3NoYWRvd19maWxlc1tdID0gJHNmOwogICAgICAgIH0KICAgIH0KICAgIGlmICgkYWxsX3NoYWRvd19maWxlcykgewogICAgICAgIGZvcmVhY2ggKCRhbGxfc2hhZG93X2ZpbGVzIGFzICRzZikgewogICAgICAgICAgICAkZG9tYWluICA9IGJhc2VuYW1lKGRpcm5hbWUoJHNmKSk7CiAgICAgICAgICAgIGlmICghc3RycG9zKCRkb21haW4sICcuJykpIGNvbnRpbnVlOwogICAgICAgICAgICAkY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygkc2YpOwogICAgICAgICAgICBpZiAoISRjb250ZW50IHx8IHN0cmxlbigkY29udGVudCkgPCA0KSBjb250aW51ZTsKICAgICAgICAgICAgZm9yZWFjaCAoZXhwbG9kZSgiXG4iLCAkY29udGVudCkgYXMgJGxuKSB7CiAgICAgICAgICAgICAgICAkbG4gPSB0cmltKCRsbik7CiAgICAgICAgICAgICAgICBpZiAoISRsbiB8fCAkbG5bMF0gPT09ICcjJykgY29udGludWU7CiAgICAgICAgICAgICAgICAkcGFydHMgPSBleHBsb2RlKCc6JywgJGxuKTsKICAgICAgICAgICAgICAgICRsb2NhbCA9IHRyaW0oJHBhcnRzWzBdID8/ICcnKTsKICAgICAgICAgICAgICAgIGlmICghJGxvY2FsIHx8ICRsb2NhbCA9PT0gJ3Jvb3QnIHx8ICFwcmVnX21hdGNoKCcvXlthLXpBLVowLTkuXystXSskLycsICRsb2NhbCkpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgJHdtX2FjY291bnRzW10gPSBbCiAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZScgID0+ICd3ZWJtYWlsJywKICAgICAgICAgICAgICAgICAgICAnaG9zdCcgICAgPT4gJ21haWwuJyAuICRkb21haW4sCiAgICAgICAgICAgICAgICAgICAgJ3BvcnQnICAgID0+IDU4NywKICAgICAgICAgICAgICAgICAgICAndXNlcicgICAgPT4gJGxvY2FsIC4gJ0AnIC4gJGRvbWFpbiwKICAgICAgICAgICAgICAgICAgICAncGFzcycgICAgPT4gJycsIC8vIGhhc2hlZCDigJQgY2FsbGVyIHRyaWVzIGRiX3Bhc3MKICAgICAgICAgICAgICAgICAgICAnZW5jJyAgICAgPT4gJ3RscycsCiAgICAgICAgICAgICAgICAgICAgJ19kYl9wYXNzJyA9PiAkZGJfb3V0WydwYXNzJ10gPz8gJycsCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLy8gTWVyZ2Ugd2VibWFpbCBhY2NvdW50cywgZGVkdXAgYnkgdXNlcgogICAgJHNlZW5fd20gPSBbXTsKICAgIGZvcmVhY2ggKCR3bV9hY2NvdW50cyBhcyAkd20pIHsKICAgICAgICBpZiAoaXNzZXQoJHNlZW5fd21bJHdtWyd1c2VyJ11dKSkgY29udGludWU7CiAgICAgICAgJHNlZW5fd21bJHdtWyd1c2VyJ11dID0gdHJ1ZTsKICAgICAgICAkc210cHNbXSA9ICR3bTsKICAgIH0KCiAgICBlY2hvIGpzb25fZW5jb2RlKFsnc210cHMnID0+ICRzbXRwcywgJ2RiJyA9PiAkZGJfb3V0LCAnbWFpbF9rZXknID0+ICRtYWlsX2tleSA/PyAnJywgJ2FkbWluX2VtYWlsJyA9PiAkYWRtaW5fZW1haWwgPz8gJyddKTsKfQoKZnVuY3Rpb24gcGFyc2Vfc210cF9vcHRzKGFycmF5ICRvcHRzLCBzdHJpbmcgJG1haWxfa2V5ID0gJycsIHN0cmluZyAkYXV0aF9rZXkgPSAnJywgc3RyaW5nICRhdXRoX3NhbHQgPSAnJyk6IGFycmF5IHsKICAgICRvdXQgPSBbXTsKCiAgICAvLyB3cF9tYWlsX3NtdHAgKG1vc3QgY29tbW9uIHBsdWdpbikKICAgIGZvcmVhY2ggKFsnd3BfbWFpbF9zbXRwJywgJ3dwX21haWxfc210cF9vcHRpb25zJ10gYXMgJGtleSkgewogICAgICAgIGlmIChlbXB0eSgkb3B0c1ska2V5XSkpIGNvbnRpbnVlOwogICAgICAgICRkID0gQHVuc2VyaWFsaXplKCRvcHRzWyRrZXldKTsKICAgICAgICBpZiAoIWlzX2FycmF5KCRkKSkgJGQgPSBAanNvbl9kZWNvZGUoJG9wdHNbJGtleV0sIHRydWUpOwogICAgICAgIGlmICghaXNfYXJyYXkoJGQpKSBjb250aW51ZTsKICAgICAgICAkbWFpbGVyID0gJGRbJ21haWwnXVsnbWFpbGVyJ10gPz8gKCRkWydtYWlsZXInXSA/PyAnc210cCcpOwogICAgICAgICRzID0gJGRbJ3NtdHAnXSA/PyBbXTsKICAgICAgICBpZiAoJG1haWxlciA9PT0gJ3NtdHAnICYmICFlbXB0eSgkc1snaG9zdCddKSkgewogICAgICAgICAgICAkb3V0W10gPSBbJ3NvdXJjZScgPT4gJ3dwX21haWxfc210cCcsICdob3N0JyA9PiAkc1snaG9zdCddLAogICAgICAgICAgICAgICAgICAgICAgJ3BvcnQnID0+IChpbnQpKCRzWydwb3J0J10gPz8gNTg3KSwgJ3VzZXInID0+ICRzWyd1c2VyJ10gPz8gJycsCiAgICAgICAgICAgICAgICAgICAgICAncGFzcycgPT4gJHNbJ3Bhc3MnXSA/PyAnJywgJ2VuYycgPT4gJHNbJ2VuY3J5cHRpb24nXSA/PyAndGxzJ107CiAgICAgICAgfSBlbHNlaWYgKGluX2FycmF5KCRtYWlsZXIsIFsnc2VuZGdyaWQnLCdtYWlsZ3VuJywnc2VuZGluYmx1ZScsJ2dtYWlsJywnb3V0bG9vaycsJ3pvaG8nLCdzcGFya3Bvc3QnLCdtYWlsamV0J10sIHRydWUpKSB7CiAgICAgICAgICAgICRhcGkgPSAkZFskbWFpbGVyXSA/PyBbXTsKICAgICAgICAgICAgJGsgPSAkYXBpWydhcGlfa2V5J10gPz8gJGFwaVsnY2xpZW50X3NlY3JldCddID8/ICRhcGlbJ2FwaV9zZWNyZXQnXSA/PyAkYXBpWydzZWNyZXQnXSA/PyAnJzsKICAgICAgICAgICAgJGZyb21fZW1haWwgPSAkZFsnbWFpbCddWydmcm9tX2VtYWlsJ10gPz8gJGRbJ21haWwnXVsnZnJvbV9uYW1lJ10gPz8gJyc7CiAgICAgICAgICAgIGlmICgkaykgJG91dFtdID0gWydzb3VyY2UnID0+ICJ3cF9tYWlsX3NtdHAvJG1haWxlciIsICdob3N0JyA9PiAiYXBpLiRtYWlsZXIuY29tIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3J0JyA9PiAwLCAndXNlcicgPT4gJ2FwaWtleScsICdwYXNzJyA9PiAkaywgJ2VuYycgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJvbV9lbWFpbCcgPT4gJGZyb21fZW1haWxdOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KCiAgICAvLyBFYXN5IFdQIFNNVFAgLyBzd3BzbXRwCiAgICBpZiAoIWVtcHR5KCRvcHRzWydzd3BzbXRwX29wdGlvbnMnXSkpIHsKICAgICAgICAkZCA9IEB1bnNlcmlhbGl6ZSgkb3B0c1snc3dwc210cF9vcHRpb25zJ10pOwogICAgICAgIGlmICghaXNfYXJyYXkoJGQpKSAkZCA9IEBqc29uX2RlY29kZSgkb3B0c1snc3dwc210cF9vcHRpb25zJ10sIHRydWUpOwogICAgICAgIGlmIChpc19hcnJheSgkZCkgJiYgIWVtcHR5KCRkWydzbXRwX2hvc3QnXSkpIHsKICAgICAgICAgICAgJG91dFtdID0gWydzb3VyY2UnID0+ICdlYXN5X3dwX3NtdHAnLCAnaG9zdCcgPT4gJGRbJ3NtdHBfaG9zdCddLAogICAgICAgICAgICAgICAgICAgICAgJ3BvcnQnID0+IChpbnQpKCRkWydzbXRwX3BvcnQnXSA/PyA1ODcpLCAndXNlcicgPT4gJGRbJ3NtdHBfdXNlcm5hbWUnXSA/PyAnJywKICAgICAgICAgICAgICAgICAgICAgICdwYXNzJyA9PiAkZFsnc210cF9wYXNzd29yZCddID8/ICcnLCAnZW5jJyA9PiAkZFsnc210cF9zc2wnXSA/PyAndGxzJ107CiAgICAgICAgfQogICAgfQoKICAgIC8vIEZsdWVudE1haWwKICAgIGlmICghZW1wdHkoJG9wdHNbJ2ZsdWVudG1haWwtc210cC1jb25uZWN0aW9ucyddKSkgewogICAgICAgICRkID0gQGpzb25fZGVjb2RlKCRvcHRzWydmbHVlbnRtYWlsLXNtdHAtY29ubmVjdGlvbnMnXSwgdHJ1ZSk7CiAgICAgICAgaWYgKGlzX2FycmF5KCRkKSkgewogICAgICAgICAgICBmb3JlYWNoICgkZCBhcyAkY29ubikgewogICAgICAgICAgICAgICAgJHMgPSAkY29ublsnc2V0dGluZ3MnXSA/PyBbXTsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHNbJ2hvc3QnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkb3V0W10gPSBbJ3NvdXJjZScgPT4gJ2ZsdWVudG1haWwnLCAnaG9zdCcgPT4gJHNbJ2hvc3QnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvcnQnID0+IChpbnQpKCRzWydwb3J0J10gPz8gNTg3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXInID0+ICRzWyd1c2VybmFtZSddID8/ICcnLCAncGFzcycgPT4gJHNbJ3Bhc3N3b3JkJ10gPz8gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbmMnID0+ICRzWydlbmNyeXB0aW9uJ10gPz8gJ3RscyddOwogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCFlbXB0eSgkc1snYXBpX2tleSddKSkgewogICAgICAgICAgICAgICAgICAgICRvdXRbXSA9IFsnc291cmNlJyA9PiAnZmx1ZW50bWFpbC9hcGknLCAnaG9zdCcgPT4gJycsICdwb3J0JyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcicgPT4gJ2FwaWtleScsICdwYXNzJyA9PiAkc1snYXBpX2tleSddLCAnZW5jJyA9PiAnJ107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8gUG9zdG1hbiBTTVRQCiAgICBpZiAoIWVtcHR5KCRvcHRzWydwb3N0bWFuX29wdGlvbnMnXSkpIHsKICAgICAgICAkZCA9IEB1bnNlcmlhbGl6ZSgkb3B0c1sncG9zdG1hbl9vcHRpb25zJ10pOwogICAgICAgIGlmICghaXNfYXJyYXkoJGQpKSAkZCA9IEBqc29uX2RlY29kZSgkb3B0c1sncG9zdG1hbl9vcHRpb25zJ10sIHRydWUpOwogICAgICAgIGlmIChpc19hcnJheSgkZCkgJiYgIWVtcHR5KCRkWydob3N0X25hbWUnXSkpIHsKICAgICAgICAgICAgJG91dFtdID0gWydzb3VyY2UnID0+ICdwb3N0bWFuX3NtdHAnLCAnaG9zdCcgPT4gJGRbJ2hvc3RfbmFtZSddLAogICAgICAgICAgICAgICAgICAgICAgJ3BvcnQnID0+IChpbnQpKCRkWydwb3J0J10gPz8gNTg3KSwKICAgICAgICAgICAgICAgICAgICAgICd1c2VyJyA9PiAkZFsnc2VuZGVyX2VtYWlsJ10gPz8gJycsCiAgICAgICAgICAgICAgICAgICAgICAncGFzcycgPT4gJGRbJ2F1dGhlbnRpY2F0aW9uX3Bhc3N3b3JkJ10gPz8gJycsCiAgICAgICAgICAgICAgICAgICAgICAnZW5jJyA9PiAkZFsnc2VjdXJpdHlfdHlwZSddID8/ICd0bHMnXTsKICAgICAgICB9CiAgICB9CgogICAgLy8gV29vQ29tbWVyY2UgU3RyaXBlIChBUEkga2V5IGhhcnZlc3QpCiAgICBpZiAoIWVtcHR5KCRvcHRzWyd3b29jb21tZXJjZV9zdHJpcGVfc2V0dGluZ3MnXSkpIHsKICAgICAgICAkZCA9IEB1bnNlcmlhbGl6ZSgkb3B0c1snd29vY29tbWVyY2Vfc3RyaXBlX3NldHRpbmdzJ10pOwogICAgICAgIGlmICghaXNfYXJyYXkoJGQpKSAkZCA9IEBqc29uX2RlY29kZSgkb3B0c1snd29vY29tbWVyY2Vfc3RyaXBlX3NldHRpbmdzJ10sIHRydWUpOwogICAgICAgIGlmICghZW1wdHkoJGRbJ3NlY3JldF9rZXknXSkpIHsKICAgICAgICAgICAgJG91dFtdID0gWydzb3VyY2UnID0+ICdzdHJpcGUnLCAnaG9zdCcgPT4gJ2FwaS5zdHJpcGUuY29tJywgJ3BvcnQnID0+IDQ0MywKICAgICAgICAgICAgICAgICAgICAgICd1c2VyJyA9PiAnc2snLCAncGFzcycgPT4gJGRbJ3NlY3JldF9rZXknXSwgJ2VuYycgPT4gJyddOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBNYWlsY2hpbXAgQVBJIGtleQogICAgaWYgKCFlbXB0eSgkb3B0c1snbWFpbGNoaW1wX3NmX21jX2FwaV9rZXknXSkpIHsKICAgICAgICAkayA9IHRyaW0oJG9wdHNbJ21haWxjaGltcF9zZl9tY19hcGlfa2V5J10pOwogICAgICAgIGlmIChzdHJsZW4oJGspID4gMTApCiAgICAgICAgICAgICRvdXRbXSA9IFsnc291cmNlJyA9PiAnbWFpbGNoaW1wJywgJ2hvc3QnID0+ICdhcGkubWFpbGNoaW1wLmNvbScsICdwb3J0JyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgJ3VzZXInID0+ICdhcGlrZXknLCAncGFzcycgPT4gJGssICdlbmMnID0+ICcnXTsKICAgIH0KCiAgICAvLyBNYWlsY2hpbXAgZm9yIFdQIChtYzR3cF9zZXR0aW5ncykKICAgIGlmICghZW1wdHkoJG9wdHNbJ21jNHdwX3NldHRpbmdzJ10pKSB7CiAgICAgICAgJGQgPSBAdW5zZXJpYWxpemUoJG9wdHNbJ21jNHdwX3NldHRpbmdzJ10pOwogICAgICAgIGlmICghaXNfYXJyYXkoJGQpKSAkZCA9IEBqc29uX2RlY29kZSgkb3B0c1snbWM0d3Bfc2V0dGluZ3MnXSwgdHJ1ZSk7CiAgICAgICAgJGsgPSBpc19hcnJheSgkZCkgPyAoJGRbJ2FwaV9rZXknXSA/PyAnJykgOiAnJzsKICAgICAgICBpZiAoJGsgJiYgc3RybGVuKCRrKSA+IDEwKQogICAgICAgICAgICAkb3V0W10gPSBbJ3NvdXJjZScgPT4gJ21jNHdwJywgJ2hvc3QnID0+ICdhcGkubWFpbGNoaW1wLmNvbScsICdwb3J0JyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgJ3VzZXInID0+ICdhcGlrZXknLCAncGFzcycgPT4gJGssICdlbmMnID0+ICcnXTsKICAgIH0KCiAgICAvLyBTZW5kR3JpZCBzZXR0aW5ncwogICAgaWYgKCFlbXB0eSgkb3B0c1snc2VuZGdyaWRfc2V0dGluZ3MnXSkpIHsKICAgICAgICAkZCA9IEB1bnNlcmlhbGl6ZSgkb3B0c1snc2VuZGdyaWRfc2V0dGluZ3MnXSk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkZCkpICRkID0gQGpzb25fZGVjb2RlKCRvcHRzWydzZW5kZ3JpZF9zZXR0aW5ncyddLCB0cnVlKTsKICAgICAgICAkayA9IGlzX2FycmF5KCRkKSA/ICgkZFsnYXBpX2tleSddID8/ICRkWydhcGlrZXknXSA/PyAnJykgOiAnJzsKICAgICAgICBpZiAoJGsgJiYgc3RybGVuKCRrKSA+IDEwKQogICAgICAgICAgICAkb3V0W10gPSBbJ3NvdXJjZScgPT4gJ3NlbmRncmlkJywgJ2hvc3QnID0+ICdzbXRwLnNlbmRncmlkLm5ldCcsICdwb3J0JyA9PiA1ODcsCiAgICAgICAgICAgICAgICAgICAgICAndXNlcicgPT4gJ2FwaWtleScsICdwYXNzJyA9PiAkaywgJ2VuYycgPT4gJ3RscyddOwogICAgfQoKICAgIC8vIE1haWxwb2V0IHNldHRpbmdzCiAgICBpZiAoIWVtcHR5KCRvcHRzWydtYWlscG9ldF9zZXR0aW5ncyddKSkgewogICAgICAgICRkID0gQHVuc2VyaWFsaXplKCRvcHRzWydtYWlscG9ldF9zZXR0aW5ncyddKTsKICAgICAgICBpZiAoIWlzX2FycmF5KCRkKSkgJGQgPSBAanNvbl9kZWNvZGUoJG9wdHNbJ21haWxwb2V0X3NldHRpbmdzJ10sIHRydWUpOwogICAgICAgIGlmIChpc19hcnJheSgkZCkgJiYgIWVtcHR5KCRkWydtdGEnXVsnaG9zdCddKSkgewogICAgICAgICAgICAkbXRhID0gJGRbJ210YSddOwogICAgICAgICAgICAkb3V0W10gPSBbJ3NvdXJjZScgPT4gJ21haWxwb2V0JywgJ2hvc3QnID0+ICRtdGFbJ2hvc3QnXSwKICAgICAgICAgICAgICAgICAgICAgICdwb3J0JyA9PiAoaW50KSgkbXRhWydwb3J0J10gPz8gNTg3KSwKICAgICAgICAgICAgICAgICAgICAgICd1c2VyJyA9PiAkbXRhWydsb2dpbiddID8/ICcnLCAncGFzcycgPT4gJG10YVsncGFzc3dvcmQnXSA/PyAnJywKICAgICAgICAgICAgICAgICAgICAgICdlbmMnID0+ICd0bHMnXTsKICAgICAgICB9IGVsc2VpZiAoaXNfYXJyYXkoJGQpICYmICFlbXB0eSgkZFsnbXRhJ11bJ21haWxwb2V0X2FwaV9rZXknXSkpIHsKICAgICAgICAgICAgJG91dFtdID0gWydzb3VyY2UnID0+ICdtYWlscG9ldC9hcGknLCAnaG9zdCcgPT4gJ3NtdHAubWFpbHBvZXQuY29tJywgJ3BvcnQnID0+IDU4NywKICAgICAgICAgICAgICAgICAgICAgICd1c2VyJyA9PiAnbWFpbHBvZXQnLCAncGFzcycgPT4gJGRbJ210YSddWydtYWlscG9ldF9hcGlfa2V5J10sICdlbmMnID0+ICd0bHMnXTsKICAgICAgICB9CiAgICB9CgogICAgLy8gTmV3c2xldHRlciBwbHVnaW4gKHR3byBzZXBhcmF0ZSBvcHRpb25fbmFtZSByb3dzIGNvbWJpbmVkKQogICAgaWYgKCFlbXB0eSgkb3B0c1snbmV3c2xldHRlcl9zbXRwX2hvc3QnXSkpIHsKICAgICAgICAkb3V0W10gPSBbJ3NvdXJjZScgPT4gJ25ld3NsZXR0ZXJfcGx1Z2luJywgJ2hvc3QnID0+IHRyaW0oJG9wdHNbJ25ld3NsZXR0ZXJfc210cF9ob3N0J10pLAogICAgICAgICAgICAgICAgICAncG9ydCcgPT4gNTg3LCAndXNlcicgPT4gJycsICdwYXNzJyA9PiB0cmltKCRvcHRzWyduZXdzbGV0dGVyX3NtdHBfcGFzc3dvcmQnXSA/PyAnJyksCiAgICAgICAgICAgICAgICAgICdlbmMnID0+ICd0bHMnXTsKICAgIH0KCiAgICAvLyBXb29Db21tZXJjZSBQYXlQYWwgKGNsaWVudF9pZCArIHNlY3JldCBoYXJ2ZXN0KQogICAgaWYgKCFlbXB0eSgkb3B0c1snd29vY29tbWVyY2VfcGF5cGFsX3NldHRpbmdzJ10pKSB7CiAgICAgICAgJGQgPSBAdW5zZXJpYWxpemUoJG9wdHNbJ3dvb2NvbW1lcmNlX3BheXBhbF9zZXR0aW5ncyddKTsKICAgICAgICBpZiAoIWlzX2FycmF5KCRkKSkgJGQgPSBAanNvbl9kZWNvZGUoJG9wdHNbJ3dvb2NvbW1lcmNlX3BheXBhbF9zZXR0aW5ncyddLCB0cnVlKTsKICAgICAgICBpZiAoaXNfYXJyYXkoJGQpKSB7CiAgICAgICAgICAgICRjaWQgPSAkZFsnY2xpZW50X2lkJ10gPz8gJGRbJ3NhbmRib3hfY2xpZW50X2lkJ10gPz8gJyc7CiAgICAgICAgICAgICRzZWMgPSAkZFsnY2xpZW50X3NlY3JldCddID8/ICRkWydzYW5kYm94X2NsaWVudF9zZWNyZXQnXSA/PyAnJzsKICAgICAgICAgICAgaWYgKCRjaWQgfHwgJHNlYykKICAgICAgICAgICAgICAgICRvdXRbXSA9IFsnc291cmNlJyA9PiAncGF5cGFsJywgJ2hvc3QnID0+ICdhcGkucGF5cGFsLmNvbScsICdwb3J0JyA9PiA0NDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXInID0+ICRjaWQsICdwYXNzJyA9PiAkc2VjLCAnZW5jJyA9PiAnJ107CiAgICAgICAgfQogICAgfQoKICAgIC8vIFNNVFAgTWFpbGVyIGJ5IFdQT21uaWEgKHNtdHBfbWFpbGVyX29wdGlvbnMpCiAgICBpZiAoIWVtcHR5KCRvcHRzWydzbXRwX21haWxlcl9vcHRpb25zJ10pKSB7CiAgICAgICAgJGQgPSBAdW5zZXJpYWxpemUoJG9wdHNbJ3NtdHBfbWFpbGVyX29wdGlvbnMnXSk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkZCkpICRkID0gQGpzb25fZGVjb2RlKCRvcHRzWydzbXRwX21haWxlcl9vcHRpb25zJ10sIHRydWUpOwogICAgICAgIGlmIChpc19hcnJheSgkZCkgJiYgIWVtcHR5KCRkWydob3N0J10pKSB7CiAgICAgICAgICAgICRvdXRbXSA9IFsnc291cmNlJyA9PiAnc210cF9tYWlsZXInLCAnaG9zdCcgPT4gJGRbJ2hvc3QnXSwKICAgICAgICAgICAgICAgICAgICAgICdwb3J0JyA9PiAoaW50KSgkZFsncG9ydCddID8/IDU4NyksCiAgICAgICAgICAgICAgICAgICAgICAndXNlcicgPT4gJGRbJ3VzZXJuYW1lJ10gPz8gJycsICdwYXNzJyA9PiAkZFsncGFzc3dvcmQnXSA/PyAnJywKICAgICAgICAgICAgICAgICAgICAgICdlbmMnID0+ICRkWyd0eXBlX2VuY3J5cHRpb24nXSA/PyAndGxzJ107CiAgICAgICAgfQogICAgfQoKICAgIC8vIFNpbXBsZSBTTVRQIChzaXNfc2V0dGluZ3MgLyBuc210cF9vcHRpb25zKQogICAgZm9yZWFjaCAoWydzaXNfc2V0dGluZ3MnLCAnbnNtdHBfb3B0aW9ucycsICdodHNtdHBfb3B0aW9ucyddIGFzICRrKSB7CiAgICAgICAgaWYgKGVtcHR5KCRvcHRzWyRrXSkpIGNvbnRpbnVlOwogICAgICAgICRkID0gQHVuc2VyaWFsaXplKCRvcHRzWyRrXSk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkZCkpICRkID0gQGpzb25fZGVjb2RlKCRvcHRzWyRrXSwgdHJ1ZSk7CiAgICAgICAgaWYgKGlzX2FycmF5KCRkKSAmJiAhZW1wdHkoJGRbJ2hvc3QnXSkpIHsKICAgICAgICAgICAgJG91dFtdID0gWydzb3VyY2UnID0+ICRrLCAnaG9zdCcgPT4gJGRbJ2hvc3QnXSwKICAgICAgICAgICAgICAgICAgICAgICdwb3J0JyA9PiAoaW50KSgkZFsncG9ydCddID8/IDU4NyksCiAgICAgICAgICAgICAgICAgICAgICAndXNlcicgPT4gJGRbJ3VzZXJuYW1lJ10gPz8gJGRbJ3VzZXInXSA/PyAnJywKICAgICAgICAgICAgICAgICAgICAgICdwYXNzJyA9PiAkZFsncGFzc3dvcmQnXSA/PyAkZFsncGFzcyddID8/ICcnLCAnZW5jJyA9PiAndGxzJ107CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBBbWF6b24gU0VTICh3cF9zZXMgLyBzZXNfc2V0dGluZ3MpCiAgICBmb3JlYWNoIChbJ3dwX3NlcycsICdzZXNfc2V0dGluZ3MnXSBhcyAkaykgewogICAgICAgIGlmIChlbXB0eSgkb3B0c1ska10pKSBjb250aW51ZTsKICAgICAgICAkZCA9IEB1bnNlcmlhbGl6ZSgkb3B0c1ska10pOwogICAgICAgIGlmICghaXNfYXJyYXkoJGQpKSAkZCA9IEBqc29uX2RlY29kZSgkb3B0c1ska10sIHRydWUpOwogICAgICAgIGlmIChpc19hcnJheSgkZCkpIHsKICAgICAgICAgICAgJGtpZCA9ICRkWydhY2Nlc3Nfa2V5J10gPz8gJGRbJ2F3c19hY2Nlc3Nfa2V5X2lkJ10gPz8gJGRbJ2tleSddID8/ICcnOwogICAgICAgICAgICAkc2VjID0gJGRbJ3NlY3JldF9rZXknXSA/PyAkZFsnYXdzX3NlY3JldF9hY2Nlc3Nfa2V5J10gPz8gJGRbJ3NlY3JldCddID8/ICcnOwogICAgICAgICAgICBpZiAoJGtpZCB8fCAkc2VjKQogICAgICAgICAgICAgICAgJG91dFtdID0gWydzb3VyY2UnID0+ICRrLCAnaG9zdCcgPT4gJ2VtYWlsLXNtdHAudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICdwb3J0JyA9PiA1ODcsICd1c2VyJyA9PiAka2lkLCAncGFzcycgPT4gJHNlYywgJ2VuYycgPT4gJ3RscyddOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgLy8gTWFpbGpldAogICAgJG1qX2tleSA9IHRyaW0oJG9wdHNbJ21haWxqZXRfYXBpa2V5J10gPz8gJycpOwogICAgJG1qX3NlYyA9IHRyaW0oJG9wdHNbJ21haWxqZXRfYXBpc2VjcmV0J10gPz8gJycpOwogICAgaWYgKCRtal9rZXkgfHwgJG1qX3NlYykKICAgICAgICAkb3V0W10gPSBbJ3NvdXJjZScgPT4gJ21haWxqZXQnLCAnaG9zdCcgPT4gJ2luLXYzLm1haWxqZXQuY29tJywgJ3BvcnQnID0+IDU4NywKICAgICAgICAgICAgICAgICAgJ3VzZXInID0+ICRtal9rZXksICdwYXNzJyA9PiAkbWpfc2VjLCAnZW5jJyA9PiAndGxzJ107CgogICAgLy8gQnJldm8gLyBTZW5kaW5ibHVlCiAgICBmb3JlYWNoIChbJ2JyZXZvX3NtdHBfc2V0dGluZ3MnLCAnc2VuZGluYmx1ZV93b29jb21tZXJjZV9zZXR0aW5ncyddIGFzICRrKSB7CiAgICAgICAgaWYgKGVtcHR5KCRvcHRzWyRrXSkpIGNvbnRpbnVlOwogICAgICAgICRkID0gQHVuc2VyaWFsaXplKCRvcHRzWyRrXSk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkZCkpICRkID0gQGpzb25fZGVjb2RlKCRvcHRzWyRrXSwgdHJ1ZSk7CiAgICAgICAgaWYgKGlzX2FycmF5KCRkKSkgewogICAgICAgICAgICAkYWsgPSAkZFsnYXBpX2tleSddID8/ICRkWydhcGlLZXknXSA/PyAkZFsnc210cF9wYXNzd29yZCddID8/ICcnOwogICAgICAgICAgICAkdSAgPSAkZFsnc210cF9sb2dpbiddID8/ICRkWydsb2dpbiddID8/ICcnOwogICAgICAgICAgICBpZiAoJGFrKQogICAgICAgICAgICAgICAgJG91dFtdID0gWydzb3VyY2UnID0+ICdicmV2bycsICdob3N0JyA9PiAnc210cC1yZWxheS5icmV2by5jb20nLCAncG9ydCcgPT4gNTg3LAogICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyJyA9PiAkdSwgJ3Bhc3MnID0+ICRhaywgJ2VuYycgPT4gJ3RscyddOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgLy8gUG9zdG1hcmsKICAgIGlmICghZW1wdHkoJG9wdHNbJ3Bvc3RtYXJrX2NyZWRlbnRpYWxzJ10pKSB7CiAgICAgICAgJGQgPSBAdW5zZXJpYWxpemUoJG9wdHNbJ3Bvc3RtYXJrX2NyZWRlbnRpYWxzJ10pOwogICAgICAgIGlmICghaXNfYXJyYXkoJGQpKSAkZCA9IEBqc29uX2RlY29kZSgkb3B0c1sncG9zdG1hcmtfY3JlZGVudGlhbHMnXSwgdHJ1ZSk7CiAgICAgICAgaWYgKGlzX2FycmF5KCRkKSkgewogICAgICAgICAgICAkdCA9ICRkWydhcGlfdG9rZW4nXSA/PyAkZFsnc2VydmVyX3Rva2VuJ10gPz8gJGRbJ3Rva2VuJ10gPz8gJyc7CiAgICAgICAgICAgIGlmICgkdCkKICAgICAgICAgICAgICAgICRvdXRbXSA9IFsnc291cmNlJyA9PiAncG9zdG1hcmsnLCAnaG9zdCcgPT4gJ3NtdHAucG9zdG1hcmthcHAuY29tJywgJ3BvcnQnID0+IDU4NywKICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcicgPT4gJHQsICdwYXNzJyA9PiAkdCwgJ2VuYycgPT4gJ3RscyddOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBNYWlsZXJzZW5kCiAgICBpZiAoIWVtcHR5KCRvcHRzWydtYWlsZXJzZW5kX3NldHRpbmdzJ10pKSB7CiAgICAgICAgJGQgPSBAdW5zZXJpYWxpemUoJG9wdHNbJ21haWxlcnNlbmRfc2V0dGluZ3MnXSk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkZCkpICRkID0gQGpzb25fZGVjb2RlKCRvcHRzWydtYWlsZXJzZW5kX3NldHRpbmdzJ10sIHRydWUpOwogICAgICAgIGlmIChpc19hcnJheSgkZCkpIHsKICAgICAgICAgICAgJHQgPSAkZFsnYXBpX2tleSddID8/ICRkWyd0b2tlbiddID8/ICcnOwogICAgICAgICAgICBpZiAoJHQpCiAgICAgICAgICAgICAgICAkb3V0W10gPSBbJ3NvdXJjZScgPT4gJ21haWxlcnNlbmQnLCAnaG9zdCcgPT4gJ3NtdHAubWFpbGVyc2VuZC5uZXQnLCAncG9ydCcgPT4gNTg3LAogICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyJyA9PiAnbWFpbGVyc2VuZCcsICdwYXNzJyA9PiAkdCwgJ2VuYycgPT4gJ3RscyddOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBEZWNyeXB0IGFueSBlbmNyeXB0ZWQgcGFzc3dvcmRzIHNlcnZlci1zaWRlIGJlZm9yZSByZXR1cm5pbmcKICAgIGZvcmVhY2ggKCRvdXQgYXMgJiRlbnRyeSkgewogICAgICAgICRwdyA9ICRlbnRyeVsncGFzcyddID8/ICcnOwogICAgICAgIGlmICgkcHcgJiYgc3RybGVuKCRwdykgPj0gMzAgJiYgcHJlZ19tYXRjaCgnL15bQS1aYS16MC05K1wvXXszMCx9PXswLDJ9JC8nLCB0cmltKCRwdykpKSB7CiAgICAgICAgICAgICRkZWMgPSBkZWNyeXB0X3NtdHBfcGFzcyh0cmltKCRwdyksICRtYWlsX2tleSwgJGF1dGhfa2V5LCAkYXV0aF9zYWx0KTsKICAgICAgICAgICAgaWYgKCRkZWMgIT09ICRwdykgJGVudHJ5WydwYXNzJ10gPSAkZGVjOwogICAgICAgIH0KICAgICAgICAvLyBOb3JtYWxpc2U6IG51bGwg4oaSICcnIGZvciB1c2VyL3Bhc3MvaG9zdCBzbyB0aGUgUHl0aG9uIHNpZGUgbmV2ZXIgc2VlcyAibnVsbCIgc3RyaW5ncwogICAgICAgIGZvcmVhY2ggKFsnaG9zdCcsJ3VzZXInLCdwYXNzJywndXNlcm5hbWUnLCdwYXNzd29yZCddIGFzICRmKSB7CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCRmLCAkZW50cnkpICYmICRlbnRyeVskZl0gPT09IG51bGwpICRlbnRyeVskZl0gPSAnJzsKICAgICAgICB9CiAgICB9CiAgICB1bnNldCgkZW50cnkpOwoKICAgIC8vIERyb3AgZW50cmllcyB3aGVyZSBwYXNzIGxvb2tzIGxpa2UgYW4gSFRNTCBwYWdlIG9yIGlzIHRyaXZpYWxseSBlbXB0eQogICAgJG91dCA9IGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoJG91dCwgZnVuY3Rpb24oJGUpIHsKICAgICAgICAkcCA9ICRlWydwYXNzJ10gPz8gJyc7CiAgICAgICAgJGggPSAkZVsnaG9zdCddID8/ICcnOwogICAgICAgIGlmICghJGggJiYgKCEkcCB8fCBzdHJsZW4oJHApIDwgOCkpIHJldHVybiBmYWxzZTsKICAgICAgICAkbG8gPSBzdHJ0b2xvd2VyKHN1YnN0cigkcCwgMCwgODApKTsKICAgICAgICBmb3JlYWNoIChbJzwhZG9jdHlwZScsJzxodG1sJywnPGhlYWQ+JywnPGJvZHknLCdmYXRhbCBlcnJvcicsJ3BocCB3YXJuaW5nJywKICAgICAgICAgICAgICAgICAgJ25vIHN1Y2ggZmlsZScsJ3Blcm1pc3Npb24gZGVuaWVkJ10gYXMgJGJhZCkgewogICAgICAgICAgICBpZiAoc3RycG9zKCRsbywgJGJhZCkgIT09IGZhbHNlKSByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfSkpOwoKICAgIHJldHVybiAkb3V0Owp9CgovLyDilIDilIAgYWN0aW9uOiB1c2VycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmZ1bmN0aW9uIHVzZXJzX2hhbmRsZXIoKTogdm9pZCB7CiAgICAkdXNlcnMgPSBbXTsKICAgICRjcGFuZWxfdXNlcnMgPSBbXTsKCiAgICAkcGFzc3dkID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL3Bhc3N3ZCcpOwogICAgaWYgKCRwYXNzd2QpIHsKICAgICAgICBmb3JlYWNoIChleHBsb2RlKCJcbiIsIHRyaW0oJHBhc3N3ZCkpIGFzICRsaW5lKSB7CiAgICAgICAgICAgICRwID0gZXhwbG9kZSgnOicsICRsaW5lKTsKICAgICAgICAgICAgaWYgKGNvdW50KCRwKSA8IDcpIGNvbnRpbnVlOwogICAgICAgICAgICAkdWlkID0gKGludCkkcFsyXTsKICAgICAgICAgICAgaWYgKCR1aWQgPCA1MDAgfHwgJHVpZCA+IDY1MDAwKSBjb250aW51ZTsKICAgICAgICAgICAgJHNoZWxsID0gJHBbNl0gPz8gJyc7CiAgICAgICAgICAgIGlmIChzdHJwb3MoJHNoZWxsLCAnbm9sb2dpbicpICE9PSBmYWxzZSB8fCBzdHJwb3MoJHNoZWxsLCAnL2ZhbHNlJykgIT09IGZhbHNlKSBjb250aW51ZTsKICAgICAgICAgICAgJHVzZXJzW10gPSBbJ3VzZXInID0+ICRwWzBdLCAndWlkJyA9PiAkdWlkLCAnaG9tZScgPT4gJHBbNV1dOwogICAgICAgIH0KICAgIH0KCiAgICBmb3JlYWNoIChbJy9ldGMvdXNlcmRvbWFpbnMnLCAnL2V0Yy90cnVldXNlcmRvbWFpbnMnXSBhcyAkdWRmaWxlKSB7CiAgICAgICAgJHVkID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCR1ZGZpbGUpOwogICAgICAgIGlmICghJHVkKSBjb250aW51ZTsKICAgICAgICBmb3JlYWNoIChleHBsb2RlKCJcbiIsIHRyaW0oJHVkKSkgYXMgJGxpbmUpIHsKICAgICAgICAgICAgJHBhcnRzID0gZXhwbG9kZSgnOiAnLCAkbGluZSwgMik7CiAgICAgICAgICAgIGlmIChjb3VudCgkcGFydHMpID09PSAyKSAkY3BhbmVsX3VzZXJzW10gPSB0cmltKCRwYXJ0c1sxXSk7CiAgICAgICAgfQogICAgfQogICAgJGNwYW5lbF91c2VycyA9IGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoJGNwYW5lbF91c2VycykpOwoKICAgIGVjaG8ganNvbl9lbmNvZGUoWyd1c2VycycgPT4gJHVzZXJzLCAnY3BhbmVsX3VzZXJzJyA9PiAkY3BhbmVsX3VzZXJzXSk7Cn0KCi8vIOKUgOKUgCBhY3Rpb246IGNwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZnVuY3Rpb24gY3BfaGFuZGxlcigpOiB2b2lkIHsKICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCdjdXJsX2luaXQnKSkgewogICAgICAgIGVjaG8ganNvbl9lbmNvZGUoWydlcnJvcicgPT4gJ2N1cmxfZGlzYWJsZWQnLCAnY3JhY2tlZCcgPT4gW10sICdyZXNlbGxlcnMnID0+IFtdXSk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICR1c2VybmFtZXMgPSBhcnJheV92YWx1ZXMoYXJyYXlfZmlsdGVyKGFycmF5X21hcCgndHJpbScsCiAgICAgICAgZXhwbG9kZSgiXG4iLCAkX1BPU1RbJ3VzZXJuYW1lcyddID8/ICcnKSkpKTsKICAgICRwYXNzd29yZHMgPSBhcnJheV92YWx1ZXMoYXJyYXlfZmlsdGVyKGFycmF5X21hcCgndHJpbScsCiAgICAgICAgZXhwbG9kZSgiXG4iLCAkX1BPU1RbJ3Bhc3N3b3JkcyddID8/ICcnKSkpKTsKCiAgICAvLyBFeHRlcm5hbCBjUGFuZWwgaG9zdCBwYXNzZWQgZnJvbSBlc2NhbGF0ZS5weSB3aGVuIGtub3duIChlLmcuIHNlcnZlcjEyMy5ob3N0LmNvbSkuCiAgICAvLyBUcnkgbG9jYWxob3N0IGZpcnN0OyBpZiBpdCBmYWlscyAoY29ubmVjdGlvbiByZWZ1c2VkIC8gbm8gY1BhbmVsIGhlcmUpLCB0cnkgZXh0ZXJuYWwuCiAgICAkZXh0X2hvc3QgPSB0cmltKCRfUE9TVFsnY3BhbmVsX2hvc3QnXSA/PyAnJyk7CiAgICAkaG9zdHMgPSBbJ2xvY2FsaG9zdCddOwogICAgaWYgKCRleHRfaG9zdCAmJiAkZXh0X2hvc3QgIT09ICdsb2NhbGhvc3QnICYmCiAgICAgICAgcHJlZ19tYXRjaCgnL15bYS16QS1aMC05Ll8tXSskLycsICRleHRfaG9zdCkpIHsKICAgICAgICAkaG9zdHNbXSA9ICRleHRfaG9zdDsKICAgIH0KCiAgICAkc2tpcCA9IFsncm9vdCcsJ2RhZW1vbicsJ25vYm9keScsJ3d3dy1kYXRhJywnYXBhY2hlJywnYXBhY2hlMicsJ25naW54JywnaHR0cCcsCiAgICAgICAgICAgICAnbWFpbCcsJ2Z0cCcsJ3NzaGQnLCdteXNxbCcsJ3Bvc3RncmVzJywnYmluJywnc3lzJywnbnRwJywncG9zdGZpeCcsCiAgICAgICAgICAgICAnZG92ZWNvdCcsJ2V4aW0nLCduYW1lZCcsJ2Ruc21hc3EnXTsKCiAgICAkY3JhY2tlZCAgID0gW107CiAgICAkcmVzZWxsZXJzID0gW107CgogICAgZm9yZWFjaCAoJHVzZXJuYW1lcyBhcyAkdSkgewogICAgICAgIGlmICghJHUgfHwgaW5fYXJyYXkoJHUsICRza2lwLCB0cnVlKSkgY29udGludWU7CiAgICAgICAgZm9yZWFjaCAoJHBhc3N3b3JkcyBhcyAkcHcpIHsKICAgICAgICAgICAgaWYgKCEkcHcgfHwgc3RybGVuKCRwdykgPCA0KSBjb250aW51ZTsKICAgICAgICAgICAgJHRva2VuID0gbnVsbDsgJHVzZWRfaG9zdCA9IG51bGw7CiAgICAgICAgICAgIGZvcmVhY2ggKCRob3N0cyBhcyAkaCkgewogICAgICAgICAgICAgICAgJHQgPSBjcF9sb2dpbl90b2tlbigkdSwgJHB3LCAyMDgzLCAkaCk7CiAgICAgICAgICAgICAgICBpZiAoJHQpIHsgJHRva2VuID0gJHQ7ICR1c2VkX2hvc3QgPSAkaDsgYnJlYWs7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoISR0b2tlbikgY29udGludWU7CgogICAgICAgICAgICAvLyBHZXQgcHJpbWFyeSBkb21haW4gdmlhIFVBUEkKICAgICAgICAgICAgJGRvbWFpbiA9ICcnOwogICAgICAgICAgICAkZG9tX3JhdyA9IGNwX2FwaV9nZXQoJHRva2VuLCAyMDgzLCAnRG9tYWluSW5mby9kb21haW5zX2RhdGEnLCAkdXNlZF9ob3N0KTsKICAgICAgICAgICAgaWYgKCRkb21fcmF3KSB7CiAgICAgICAgICAgICAgICAkZG9tX2ogPSBAanNvbl9kZWNvZGUoJGRvbV9yYXcsIHRydWUpOwogICAgICAgICAgICAgICAgJGRvbWFpbiA9ICRkb21falsnZGF0YSddWydtYWluX2RvbWFpbiddID8/ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJGRvbWFpbikgJGRvbWFpbiA9ICR1OwoKICAgICAgICAgICAgLy8gQ3JlYXRlIFNNVFAgZW1haWwgYWNjb3VudCBmb3IgZXhmaWwgYWNjZXNzCiAgICAgICAgICAgICRzbXRwX2luZm8gPSBjcF9jcmVhdGVfc210cCgkdG9rZW4sIDIwODMsICR1LCAkZG9tYWluLCAkdXNlZF9ob3N0KTsKCiAgICAgICAgICAgICRjcmFja2VkW10gPSBbCiAgICAgICAgICAgICAgICAndXNlcicgICA9PiAkdSwKICAgICAgICAgICAgICAgICdwYXNzJyAgID0+ICRwdywKICAgICAgICAgICAgICAgICdwb3J0JyAgID0+IDIwODMsCiAgICAgICAgICAgICAgICAnaG9zdCcgICA9PiAkdXNlZF9ob3N0LAogICAgICAgICAgICAgICAgJ2RvbWFpbicgPT4gJGRvbWFpbiwKICAgICAgICAgICAgICAgICdzbXRwJyAgID0+ICRzbXRwX2luZm8sCiAgICAgICAgICAgIF07CgogICAgICAgICAgICAvLyBXSE0gcmVzZWxsZXIgY2hlY2sKICAgICAgICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRoKSB7CiAgICAgICAgICAgICAgICBpZiAoY3BfdHJ5KCR1LCAkcHcsIDIwODcsICRoKSkgewogICAgICAgICAgICAgICAgICAgICRyZXNlbGxlcnNbXSA9IFsndXNlcicgPT4gJHUsICdwYXNzJyA9PiAkcHcsICdob3N0JyA9PiAkaF07CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBlY2hvIGpzb25fZW5jb2RlKFsnY3JhY2tlZCcgPT4gJGNyYWNrZWQsICdyZXNlbGxlcnMnID0+ICRyZXNlbGxlcnNdKTsKfQoKZnVuY3Rpb24gY3BfbG9naW5fdG9rZW4oc3RyaW5nICR1c2VyLCBzdHJpbmcgJHBhc3MsIGludCAkcG9ydCwgc3RyaW5nICRob3N0ID0gJ2xvY2FsaG9zdCcpOiBzdHJpbmcgewogICAgJGphciA9IHRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCAnY3BqYXJfJyk7CiAgICAkY2ggPSBjdXJsX2luaXQoImh0dHBzOi8vJGhvc3Q6JHBvcnQvbG9naW4vP2xvZ2luX29ubHk9MSIpOwogICAgY3VybF9zZXRvcHRfYXJyYXkoJGNoLCBbCiAgICAgICAgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiA9PiB0cnVlLAogICAgICAgIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIgPT4gZmFsc2UsCiAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCA9PiBmYWxzZSwKICAgICAgICBDVVJMT1BUX1BPU1QgICAgICAgICAgID0+IHRydWUsCiAgICAgICAgQ1VSTE9QVF9QT1NURklFTERTICAgICA9PiAndXNlcj0nIC4gcmF3dXJsZW5jb2RlKCR1c2VyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJyZwYXNzPScgLiByYXd1cmxlbmNvZGUoJHBhc3MpLAogICAgICAgIENVUkxPUFRfVElNRU9VVCAgICAgICAgPT4gOCwKICAgICAgICBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUID0+IDUsCiAgICAgICAgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiA9PiB0cnVlLAogICAgICAgIENVUkxPUFRfTUFYUkVESVJTICAgICAgPT4gMywKICAgICAgICBDVVJMT1BUX0NPT0tJRUpBUiAgICAgID0+ICRqYXIsCiAgICAgICAgQ1VSTE9QVF9DT09LSUVGSUxFICAgICA9PiAkamFyLAogICAgXSk7CiAgICAkcmVzcCA9IGN1cmxfZXhlYygkY2gpOwogICAgY3VybF9jbG9zZSgkY2gpOwogICAgaWYgKCEkcmVzcCkgeyBAdW5saW5rKCRqYXIpOyByZXR1cm4gJyc7IH0KICAgICRvayA9IHN0cnBvcygkcmVzcCwgJyJzdGF0dXMiOjEnKSAhPT0gZmFsc2UgfHwgc3RyaXBvcygkcmVzcCwgJ2Nwc2VzcycpICE9PSBmYWxzZTsKICAgIGlmICghJG9rKSB7IEB1bmxpbmsoJGphcik7IHJldHVybiAnJzsgfQogICAgLy8gRXh0cmFjdCBjcHNlc3MgdG9rZW4gZnJvbSByZXNwb25zZSBvciBjb29raWUgamFyCiAgICBpZiAocHJlZ19tYXRjaCgnL3NlY3VyaXR5X3Rva2VuWyJcczo9XStcLz9jcHNlc3MoWzAtOWEtZl0rKS9pJywgJHJlc3AsICRtKSkKICAgICAgICAkdG9rID0gJ2Nwc2VzcycgLiAkbVsxXTsKICAgIGVsc2VpZiAocHJlZ19tYXRjaCgnL2Nwc2VzcyhbMC05YS1mXSspL2knLCAkcmVzcCwgJG0pKQogICAgICAgICR0b2sgPSAnY3BzZXNzJyAuICRtWzFdOwogICAgZWxzZQogICAgICAgICR0b2sgPSAnX19qYXJfXycgLiAkamFyOyAgIC8vIGZhbGwgYmFjayB0byBjb29raWUgamFyIHBhdGgKICAgIHJldHVybiAkdG9rIC4gJ3wnIC4gJGphcjsKfQoKZnVuY3Rpb24gY3BfYXBpX2dldChzdHJpbmcgJHRva2VuX2phciwgaW50ICRwb3J0LCBzdHJpbmcgJGVuZHBvaW50LCBzdHJpbmcgJGhvc3QgPSAnbG9jYWxob3N0Jyk6IHN0cmluZyB7CiAgICBbJHRva2VuLCAkamFyXSA9IGFycmF5X3BhZChleHBsb2RlKCd8JywgJHRva2VuX2phciwgMiksIDIsICcnKTsKICAgICR1cmwgPSAiaHR0cHM6Ly8kaG9zdDokcG9ydC9leGVjdXRlLyRlbmRwb2ludCI7CiAgICAkY2ggPSBjdXJsX2luaXQoJHVybCk7CiAgICBjdXJsX3NldG9wdF9hcnJheSgkY2gsIFsKICAgICAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IHRydWUsCiAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiA9PiBmYWxzZSwKICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllIT1NUID0+IGZhbHNlLAogICAgICAgIENVUkxPUFRfVElNRU9VVCAgICAgICAgPT4gOCwKICAgICAgICBDVVJMT1BUX0NPT0tJRUZJTEUgICAgID0+ICRqYXIsCiAgICAgICAgQ1VSTE9QVF9DT09LSUVKQVIgICAgICA9PiAkamFyLAogICAgXSk7CiAgICAkcmVzcCA9IGN1cmxfZXhlYygkY2gpOwogICAgY3VybF9jbG9zZSgkY2gpOwogICAgcmV0dXJuICRyZXNwID86ICcnOwp9CgpmdW5jdGlvbiBjcF9jcmVhdGVfc210cChzdHJpbmcgJHRva2VuX2phciwgaW50ICRwb3J0LCBzdHJpbmcgJGNwdXNlciwgc3RyaW5nICRkb21haW4sIHN0cmluZyAkaG9zdCA9ICdsb2NhbGhvc3QnKTogYXJyYXkgewogICAgLy8gQ3JlYXRlIGEgbWFpbGJveCB3ZSBjb250cm9sIGZvciBTTVRQIHJlbGF5IGFjY2VzcwogICAgJHNtdHBfdXNlciA9ICd3cF8nIC4gc3Vic3RyKG1kNSgkY3B1c2VyIC4gdGltZSgpKSwgMCwgOCk7CiAgICAkc210cF9wYXNzID0gc3Vic3RyKHN0cl9zaHVmZmxlKCdBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGprbW5wcXJzdHV2d3h5ejIzNDU2Nzg5JyksIDAsIDEyKQogICAgICAgICAgICAgICAuICchMSc7CiAgICBbJHRva2VuLCAkamFyXSA9IGFycmF5X3BhZChleHBsb2RlKCd8JywgJHRva2VuX2phciwgMiksIDIsICcnKTsKICAgICRmaWVsZHMgPSAnZW1haWw9JyAuIHJhd3VybGVuY29kZSgkc210cF91c2VyKQogICAgICAgICAgICAuICcmZG9tYWluPScgLiByYXd1cmxlbmNvZGUoJGRvbWFpbikKICAgICAgICAgICAgLiAnJnBhc3N3b3JkPScgLiByYXd1cmxlbmNvZGUoJHNtdHBfcGFzcykKICAgICAgICAgICAgLiAnJnF1b3RhPTI1MCc7CiAgICAkY2ggPSBjdXJsX2luaXQoImh0dHBzOi8vJGhvc3Q6JHBvcnQvZXhlY3V0ZS9FbWFpbC9hZGRfcG9wIik7CiAgICBjdXJsX3NldG9wdF9hcnJheSgkY2gsIFsKICAgICAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IHRydWUsCiAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiA9PiBmYWxzZSwKICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllIT1NUID0+IGZhbHNlLAogICAgICAgIENVUkxPUFRfUE9TVCAgICAgICAgICAgPT4gdHJ1ZSwKICAgICAgICBDVVJMT1BUX1BPU1RGSUVMRFMgICAgID0+ICRmaWVsZHMsCiAgICAgICAgQ1VSTE9QVF9USU1FT1VUICAgICAgICA9PiAxMCwKICAgICAgICBDVVJMT1BUX0NPT0tJRUZJTEUgICAgID0+ICRqYXIsCiAgICAgICAgQ1VSTE9QVF9DT09LSUVKQVIgICAgICA9PiAkamFyLAogICAgXSk7CiAgICAkcmVzcCA9IGN1cmxfZXhlYygkY2gpOwogICAgY3VybF9jbG9zZSgkY2gpOwogICAgQHVubGluaygkamFyKTsKICAgICRvayA9ICRyZXNwICYmIChzdHJwb3MoJHJlc3AsICcic3RhdHVzIjoxJykgIT09IGZhbHNlIHx8IHN0cnBvcygkcmVzcCwgJyJlcnJvcnMiOm51bGwnKSAhPT0gZmFsc2UpOwogICAgaWYgKCRvaykgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICd1c2VyJyA9PiAiJHNtdHBfdXNlckAkZG9tYWluIiwKICAgICAgICAgICAgJ3Bhc3MnID0+ICRzbXRwX3Bhc3MsCiAgICAgICAgICAgICdob3N0JyA9PiAnbWFpbC4nIC4gJGRvbWFpbiwKICAgICAgICAgICAgJ3BvcnQnID0+IDU4NywKICAgICAgICBdOwogICAgfQogICAgcmV0dXJuIFtdOwp9CgpmdW5jdGlvbiBjcF90cnkoc3RyaW5nICR1c2VyLCBzdHJpbmcgJHBhc3MsIGludCAkcG9ydCwgc3RyaW5nICRob3N0ID0gJ2xvY2FsaG9zdCcpOiBib29sIHsKICAgICRjaCA9IGN1cmxfaW5pdCgiaHR0cHM6Ly8kaG9zdDokcG9ydC9sb2dpbi8/bG9naW5fb25seT0xIik7CiAgICBjdXJsX3NldG9wdF9hcnJheSgkY2gsIFsKICAgICAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IHRydWUsCiAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiA9PiBmYWxzZSwKICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllIT1NUID0+IGZhbHNlLAogICAgICAgIENVUkxPUFRfUE9TVCAgICAgICAgICAgPT4gdHJ1ZSwKICAgICAgICBDVVJMT1BUX1BPU1RGSUVMRFMgICAgID0+ICd1c2VyPScgLiByYXd1cmxlbmNvZGUoJHVzZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnJnBhc3M9JyAuIHJhd3VybGVuY29kZSgkcGFzcyksCiAgICAgICAgQ1VSTE9QVF9USU1FT1VUICAgICAgICA9PiA4LAogICAgICAgIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQgPT4gNSwKICAgICAgICBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OID0+IHRydWUsCiAgICAgICAgQ1VSTE9QVF9NQVhSRURJUlMgICAgICA9PiAzLAogICAgXSk7CiAgICAkcmVzcCA9IGN1cmxfZXhlYygkY2gpOwogICAgY3VybF9jbG9zZSgkY2gpOwogICAgaWYgKCEkcmVzcCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHN0cnBvcygkcmVzcCwgJyJzdGF0dXMiOjEnKSAhPT0gZmFsc2UgfHwgc3RyaXBvcygkcmVzcCwgJ2Nwc2VzcycpICE9PSBmYWxzZTsKfQoKLy8g4pSA4pSAIGFjdGlvbjogZmlsZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8vIFBIUC1uYXRpdmUgZmlsZSBzd2VlcCDigJQgd29ya3MgZXZlbiB3aGVuIGV4ZWMvcGFzc3RocnUvc3lzdGVtIGFyZSBkaXNhYmxlZC4KCmZ1bmN0aW9uIGZpbGVzX2hhbmRsZXIoKTogdm9pZCB7CiAgICAkb3V0ID0gWydmaWxlcycgPT4gW10sICd3cGNvbmZpZ3MnID0+IFtdLCAnZW52ZmlsZXMnID0+IFtdXTsKCiAgICAvLyBGaXhlZC1wYXRoIHN5c3RlbSBjcmVkZW50aWFsIGZpbGVzCiAgICAkdGFyZ2V0cyA9IFsKICAgICAgICAnL2V0Yy9wYXNzd2QnLAogICAgICAgICcvZXRjL3NoYWRvdycsCiAgICAgICAgJy9ldGMvZXhpbTQvcGFzc3dkLmNsaWVudCcsCiAgICAgICAgJy9ldGMvcG9zdGZpeC9zYXNsX3Bhc3N3ZCcsCiAgICAgICAgJy9ldGMvZXhpbS5jb25mJywKICAgICAgICAnL2V0Yy9leGltLmNvbmYubG9jYWxvcHRzJywKICAgICAgICAnL2V0Yy9leGltNC9leGltNC5jb25mLnRlbXBsYXRlJywKICAgICAgICAnL2V0Yy9leGltNC9jb25mLmQvdHJhbnNwb3J0LzMwX2V4aW00LWNvbmZpZ19yZW1vdGVfc210cF9zbWFydGhvc3QnLAogICAgICAgICcvdXNyL2xvY2FsL2NwYW5lbC9ldGMvZXhpbS9zeXN0ZW0uY29uZicsCiAgICAgICAgJy9yb290Ly5teS5jbmYnLAogICAgICAgICcvZXRjL215c3FsL2RlYmlhbi5jbmYnLAogICAgICAgICcvZXRjL215c3FsL215LmNuZicsCiAgICAgICAgJy9ldGMvdnNmdHBkLmNvbmYnLAogICAgICAgICcvZXRjL3Byb2Z0cGQvcHJvZnRwZC5jb25mJywKICAgICAgICAnL2V0Yy9wdXJlLWZ0cGQvZGIvcHVyZWZ0cGQucGFzc3dkJywKICAgICAgICAnL3Zhci9jcGFuZWwvcm9vdC5wYXNzd2QnLAogICAgICAgICcvcm9vdC8uYWNjZXNzaGFzaCcsCiAgICAgICAgJy9ldGMvcHNhL3BzYS5jb25mJywKICAgICAgICAnL29wdC9wc2EvYWRtaW4vY29uZi9wYW5lbC5pbmknLAogICAgICAgICcvdXNyL2xvY2FsL2RpcmVjdGFkbWluL2NvbmYvZGlyZWN0YWRtaW4uY29uZicsCiAgICAgICAgJy91c3IvbG9jYWwvZGlyZWN0YWRtaW4vY29uZi9teXNxbC5jb25mJywKICAgICAgICAnL3Vzci9sb2NhbC9oZXN0aWEvY29uZi9teXNxbC5jb25mJywKICAgICAgICAnL3Vzci9sb2NhbC92ZXN0YS9jb25mL215c3FsLmNvbmYnLAogICAgICAgICcvZXRjL3VzZXJkb21haW5zJywKICAgICAgICAnL2V0Yy90cnVldXNlcmRvbWFpbnMnLAogICAgICAgICcvcHJvYy9zZWxmL2Vudmlyb24nLAogICAgICAgICcvcHJvYy8xL2Vudmlyb24nLAogICAgICAgICcvZXRjL21haWwvYXV0aGluZm8nLAogICAgICAgICcvZXRjL21haWwvYWNjZXNzJywKICAgIF07CiAgICBmb3JlYWNoICgkdGFyZ2V0cyBhcyAkcCkgewogICAgICAgICRjID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRwKTsKICAgICAgICBpZiAoJGMgIT09IGZhbHNlICYmIHN0cmxlbigkYykgPiAzKSAkb3V0WydmaWxlcyddWyRwXSA9ICRjOwogICAgfQoKICAgIC8vIHdwLWNvbmZpZy5waHAg4oCUIGdsb2IgYWNyb3NzIGNvbW1vbiB3ZWJyb290IHBhdHRlcm5zIChkZXB0aCAxLTIpCiAgICAkZHIgPSBydHJpbSgkX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddID8/ICcnLCAnLycpOwogICAgJHdwY2ZnX2dsb2JzID0gYXJyYXlfZmlsdGVyKFsKICAgICAgICAvLyBET0NVTUVOVF9ST09UIGlzIGFsd2F5cyB3aXRoaW4gb3Blbl9iYXNlZGlyIOKAlCBjaGVjayBkaXJlY3RseSBmaXJzdAogICAgICAgICRkciA/ICRkciAuICcvd3AtY29uZmlnLnBocCcgICAgICAgICA6IG51bGwsCiAgICAgICAgJGRyID8gZGlybmFtZSgkZHIpIC4gJy93cC1jb25maWcucGhwJzogbnVsbCwKICAgICAgICAnL3Zhci93d3cvKi93cC1jb25maWcucGhwJywKICAgICAgICAnL3Zhci93d3cvKi8qL3dwLWNvbmZpZy5waHAnLAogICAgICAgICcvdmFyL3d3dy9odG1sLyovd3AtY29uZmlnLnBocCcsCiAgICAgICAgJy9ob21lLyovcHVibGljX2h0bWwvd3AtY29uZmlnLnBocCcsCiAgICAgICAgJy9ob21lLyovd3d3L3dwLWNvbmZpZy5waHAnLAogICAgICAgICcvaG9tZS8qL3B1YmxpY19odG1sLyovd3AtY29uZmlnLnBocCcsCiAgICAgICAgJy9zcnYvKi93cC1jb25maWcucGhwJywKICAgICAgICAnL3Nydi93d3cvKi93cC1jb25maWcucGhwJywKICAgICAgICAnL29wdC8qL3dwLWNvbmZpZy5waHAnLAogICAgICAgICcvd3d3L3d3d3Jvb3QvKi93cC1jb25maWcucGhwJywKICAgICAgICAnL2RhdGEvd3d3cm9vdC8qL3dwLWNvbmZpZy5waHAnLAogICAgICAgICcvdm9sdW1lKi93ZWIvKi93cC1jb25maWcucGhwJywKICAgICAgICAvLyBXZWRvcy5uZXQgLyBGb3Jwc2kgLyBDemVjaCBob3N0ZXJzCiAgICAgICAgJy9kYXRhL3dlYi92aXJ0dWFscy8qL3ZpcnR1YWwvd3d3L2RvbWFpbnMvKi93cC1jb25maWcucGhwJywKICAgICAgICAnL2RhdGEvd2ViL3ZpcnR1YWxzLyovdmlydHVhbC93d3cvd3AtY29uZmlnLnBocCcsCiAgICAgICAgLy8gSGV0em5lciAvIE9WSCAvIEluZm9tYW5pYWsgc2hhcmVkCiAgICAgICAgJy92YXIvY3VzdG9tZXJzL3dlYnMvKi93cC1jb25maWcucGhwJywKICAgICAgICAnL3Zhci9jdXN0b21lcnMvd2Vicy8qLyovd3AtY29uZmlnLnBocCcsCiAgICAgICAgLy8gUGxlc2sgZGVmYXVsdCB3ZWJyb290CiAgICAgICAgJy92YXIvd3d3L3Zob3N0cy8qL2h0dHBkb2NzL3dwLWNvbmZpZy5waHAnLAogICAgICAgICcvdmFyL3d3dy92aG9zdHMvKi8qL3dwLWNvbmZpZy5waHAnLAogICAgICAgIC8vIFJ1bkNsb3VkIC8gR3JpZFBhbmUgLyBTcGludXB3cCBWUFMgbGF5b3V0CiAgICAgICAgJy9ob21lL3J1bmNsb3VkL3dlYmFwcHMvKi93cC1jb25maWcucGhwJywKICAgICAgICAnL3Zhci93d3cvKi9wdWJsaWMvd3AtY29uZmlnLnBocCcsCiAgICAgICAgLy8gVXNlIF9fRElSX18gdG8gYWx3YXlzIGNhdGNoIHRoZSBjdXJyZW50IGluc3RhbGwKICAgICAgICBkaXJuYW1lKGRpcm5hbWUoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkpKSAuICcvd3AtY29uZmlnLnBocCcsCiAgICAgICAgZGlybmFtZShkaXJuYW1lKGRpcm5hbWUoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkpKSkgLiAnL3dwLWNvbmZpZy5waHAnLAogICAgXSk7CiAgICBmb3JlYWNoICgkd3BjZmdfZ2xvYnMgYXMgJHBhdCkgewogICAgICAgIGZvcmVhY2ggKChhcnJheSlAZ2xvYigkcGF0KSBhcyAkZikgewogICAgICAgICAgICBpZiAoaXNzZXQoJG91dFsnd3Bjb25maWdzJ11bJGZdKSkgY29udGludWU7CiAgICAgICAgICAgICRjID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmKTsKICAgICAgICAgICAgaWYgKCRjICE9PSBmYWxzZSAmJiBzdHJsZW4oJGMpID4gMTAwKSAkb3V0Wyd3cGNvbmZpZ3MnXVskZl0gPSAkYzsKICAgICAgICB9CiAgICB9CgogICAgLy8gLmVudiBmaWxlcyDigJQgc2FtZSBjb21tb24gcGF0aHMKICAgICRlbnZfZ2xvYnMgPSBbCiAgICAgICAgJy9vcHQvKi8uZW52JywKICAgICAgICAnL29wdC8qLyovLmVudicsCiAgICAgICAgJy92YXIvd3d3LyovLmVudicsCiAgICAgICAgJy92YXIvd3d3LyovKi8uZW52JywKICAgICAgICAnL2hvbWUvKi8uZW52JywKICAgICAgICAnL2hvbWUvKi9wdWJsaWNfaHRtbC8uZW52JywKICAgICAgICAnL2hvbWUvKi9wdWJsaWNfaHRtbC8qLy5lbnYnLAogICAgICAgICcvc3J2LyovLmVudicsCiAgICAgICAgJy9zcnYvd3d3LyovLmVudicsCiAgICAgICAgJy9yb290Ly5lbnYnLAogICAgXTsKICAgIGZvcmVhY2ggKCRlbnZfZ2xvYnMgYXMgJHBhdCkgewogICAgICAgIGZvcmVhY2ggKChhcnJheSlAZ2xvYigkcGF0KSBhcyAkZikgewogICAgICAgICAgICBpZiAoaXNzZXQoJG91dFsnZW52ZmlsZXMnXVskZl0pKSBjb250aW51ZTsKICAgICAgICAgICAgJGMgPSBAZmlsZV9nZXRfY29udGVudHMoJGYpOwogICAgICAgICAgICBpZiAoJGMgIT09IGZhbHNlICYmIHN0cmxlbigkYykgPiAxMCkgJG91dFsnZW52ZmlsZXMnXVskZl0gPSAkYzsKICAgICAgICB9CiAgICB9CgogICAgZWNobyBqc29uX2VuY29kZSgkb3V0KTsKfQoKLy8g4pSA4pSAIGFjdGlvbjogc3lzaW5mbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLy8gUHVyZS1QSFAgc3lzdGVtIGZpbmdlcnByaW50IOKAlCBubyBleGVjIG5lZWRlZC4gUmVwbGFjZXMgbW9zdCBleGVjX2NtZCBjYWxscyBpbgovLyBmaW5nZXJwcmludCgpIHNvIFdBRiByYXRlLWxpbWl0aW5nIG9mID9jPSByZXF1ZXN0cyBkb2Vzbid0IGtpbGwgZWFybHkgZGF0YS4KCmZ1bmN0aW9uIHN5c2luZm9faGFuZGxlcigpOiB2b2lkIHsKICAgICRvdXQgPSBbXTsKCiAgICAvLyBQSFAgKyBzZXJ2ZXIgaWRlbnRpdHkKICAgICRvdXRbJ3BocF92ZXJzaW9uJ10gICAgID0gUEhQX1ZFUlNJT047CiAgICAkb3V0WydzYXBpJ10gICAgICAgICAgICA9IFBIUF9TQVBJOwogICAgJG91dFsnc2VydmVyX3NvZnR3YXJlJ10gPSAkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10gPz8gJyc7CiAgICAkb3V0Wydob3N0bmFtZSddICAgICAgICA9IEBnZXRob3N0bmFtZSgpID86ICcnOwogICAgJG91dFsnZG9jX3Jvb3QnXSAgICAgICAgPSBydHJpbSgkX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddID8/ICcnLCAnLycpOwogICAgJG91dFsnc2NyaXB0X2ZpbGVuYW1lJ10gPSAkX1NFUlZFUlsnU0NSSVBUX0ZJTEVOQU1FJ10gPz8gJyc7CiAgICAkb3V0WydzZWxmX2RpciddICAgICAgICA9IF9fRElSX187CiAgICAkb3V0WydwaHBfaW5pJ10gICAgICAgICA9IEBwaHBfaW5pX2xvYWRlZF9maWxlKCkgPzogJyc7CiAgICAkb3V0WydkaXNhYmxlX2Z1bmN0aW9ucyddID0gQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJykgPzogJyc7CiAgICAkb3V0WydvcGVuX2Jhc2VkaXInXSAgICA9IEBpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKSA/OiAnJzsKCiAgICAvLyBGdWxsIC9wcm9jL3NlbGYvZW52aXJvbiDigJQgc2FtZSBhcyBleGVjX2NtZCAiY2F0IC9wcm9jL3NlbGYvZW52aXJvbiB8IHRyICdcMCcgJ1xuJyIKICAgICRlbnZfcmF3ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCcvcHJvYy9zZWxmL2Vudmlyb24nKTsKICAgIGlmICgkZW52X3JhdyAhPT0gZmFsc2UgJiYgc3RybGVuKCRlbnZfcmF3KSA+IDEwKSB7CiAgICAgICAgJG91dFsncHJvY19lbnZpcm9uJ10gPSBzdHJfcmVwbGFjZSgiXDAiLCAiXG4iLCAkZW52X3Jhdyk7CiAgICAgICAgLy8gR2hvc3RMb2NrIGRldGVjdGlvbgogICAgICAgIGlmIChzdHJwb3MoJGVudl9yYXcsICdnaG9zdGxvY2tfcGhwX3NoaWVsZCcpICE9PSBmYWxzZSkgewogICAgICAgICAgICAkb3V0WydnaG9zdGxvY2snXSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIC8vIEV4dHJhY3Qga2V5IGVudiB2YXJzIGlubGluZQogICAgICAgIGZvcmVhY2ggKGV4cGxvZGUoIlwwIiwgJGVudl9yYXcpIGFzICRrdikgewogICAgICAgICAgICAkcCA9IGV4cGxvZGUoJz0nLCAka3YsIDIpOwogICAgICAgICAgICBpZiAoY291bnQoJHApID09PSAyICYmIGluX2FycmF5KCRwWzBdLCBbCiAgICAgICAgICAgICAgICAnRE9DVU1FTlRfUk9PVCcsJ0hUVFBfSE9TVCcsJ1NFUlZFUl9OQU1FJywnU0NSSVBUX0ZJTEVOQU1FJywKICAgICAgICAgICAgICAgICdQV0QnLCdMRF9QUkVMT0FEJywnSE9NRScsJ1VTRVInLCdQQVRIJywKICAgICAgICAgICAgXSkpICRvdXRbJ2VudiddWyRwWzBdXSA9ICRwWzFdOwogICAgICAgIH0KICAgICAgICAvLyBTdXBwbGVtZW50IERPQ1VNRU5UX1JPT1QgZnJvbSBlbnYgaWYgbWlzc2luZyBmcm9tIF9TRVJWRVIKICAgICAgICBpZiAoISRvdXRbJ2RvY19yb290J10gJiYgaXNzZXQoJG91dFsnZW52J11bJ0RPQ1VNRU5UX1JPT1QnXSkpIHsKICAgICAgICAgICAgJG91dFsnZG9jX3Jvb3QnXSA9IHJ0cmltKCRvdXRbJ2VudiddWydET0NVTUVOVF9ST09UJ10sICcvJyk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIC9ldGMvcGFzc3dkIOKAlCBzeXN0ZW0gdXNlcnMgZm9yIGNQYW5lbCBicnV0ZQogICAgJHBhc3N3ZCA9IEBmaWxlX2dldF9jb250ZW50cygnL2V0Yy9wYXNzd2QnKTsKICAgIGlmICgkcGFzc3dkICE9PSBmYWxzZSAmJiBzdHJsZW4oJHBhc3N3ZCkgPiAyMCkgewogICAgICAgICRvdXRbJ2V0Y19wYXNzd2QnXSA9ICRwYXNzd2Q7CiAgICAgICAgJHVzZXJzID0gW107CiAgICAgICAgZm9yZWFjaCAoZXhwbG9kZSgiXG4iLCAkcGFzc3dkKSBhcyAkbGluZSkgewogICAgICAgICAgICAkcCA9IGV4cGxvZGUoJzonLCAkbGluZSk7CiAgICAgICAgICAgIGlmIChjb3VudCgkcCkgPCA3KSBjb250aW51ZTsKICAgICAgICAgICAgJHVpZCA9IChpbnQpJHBbMl07CiAgICAgICAgICAgIGlmICgkdWlkID49IDUwMCAmJiAoCiAgICAgICAgICAgICAgICBzdHJwb3MoJHBbNV0sICcvaG9tZScpID09PSAwIHx8CiAgICAgICAgICAgICAgICBzdHJwb3MoJHBbNV0sICcvdmFyL2NwYW5lbCcpID09PSAwIHx8CiAgICAgICAgICAgICAgICBzdHJwb3MoJHBbNV0sICcvdXNyL2xvY2FsL2NwYW5lbCcpID09PSAwCiAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICAgICR1c2Vyc1tdID0gWyd1c2VyJyA9PiAkcFswXSwgJ3VpZCcgPT4gJHVpZCwgJ2hvbWUnID0+ICRwWzVdXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkb3V0WydzeXN0ZW1fdXNlcnMnXSA9ICR1c2VyczsKICAgIH0KCiAgICAvLyBPcGVuIHBvcnRzIGZyb20gL3Byb2MvbmV0L3RjcCArIHRjcDYgKG5vIGV4ZWMgbmVlZGVkKQogICAgJHBvcnRzID0gW107CiAgICBmb3JlYWNoIChbJy9wcm9jL25ldC90Y3AnLCAnL3Byb2MvbmV0L3RjcDYnXSBhcyAkdGNwZikgewogICAgICAgICRsaW5lcyA9IEBmaWxlKCR0Y3BmLCBGSUxFX0lHTk9SRV9ORVdfTElORVMgfCBGSUxFX1NLSVBfRU1QVFlfTElORVMpOwogICAgICAgIGlmICghJGxpbmVzKSBjb250aW51ZTsKICAgICAgICBmb3JlYWNoIChhcnJheV9zbGljZSgkbGluZXMsIDEpIGFzICRsaW5lKSB7CiAgICAgICAgICAgICRjb2xzID0gcHJlZ19zcGxpdCgnL1xzKy8nLCB0cmltKCRsaW5lKSk7CiAgICAgICAgICAgIGlmICghaXNzZXQoJGNvbHNbMV0pKSBjb250aW51ZTsKICAgICAgICAgICAgJHBhcnRzID0gZXhwbG9kZSgnOicsICRjb2xzWzFdKTsKICAgICAgICAgICAgaWYgKGNvdW50KCRwYXJ0cykgPCAyKSBjb250aW51ZTsKICAgICAgICAgICAgJHBvcnQgPSBoZXhkZWMoJHBhcnRzWzFdKTsKICAgICAgICAgICAgJHN0YXRlID0gJGNvbHNbM10gPz8gJyc7CiAgICAgICAgICAgIGlmICgkc3RhdGUgPT09ICcwQScgJiYgJHBvcnQgPiAwKSAkcG9ydHNbXSA9ICRwb3J0OwogICAgICAgIH0KICAgIH0KICAgICRvdXRbJ29wZW5fcG9ydHMnXSA9IGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoJHBvcnRzKSk7CgogICAgLy8gUGFuZWwgZGV0ZWN0aW9uIGZyb20gZmlsZXN5c3RlbSAobm8gZXhlYyBuZWVkZWQpCiAgICAkcGFuZWwgPSAnJzsKICAgIGlmIChAZmlsZV9leGlzdHMoJy91c3IvbG9jYWwvY3BhbmVsL3ZlcnNpb24nKSkgICAgICAgICAgICRwYW5lbCA9ICdjcGFuZWwnOwogICAgZWxzZWlmIChAZmlsZV9leGlzdHMoJy91c3IvbG9jYWwvZGlyZWN0YWRtaW4vZGlyZWN0YWRtaW4nKSkgJHBhbmVsID0gJ2RpcmVjdGFkbWluJzsKICAgIGVsc2VpZiAoQGZpbGVfZXhpc3RzKCcvdXNyL2xvY2FsL21ncjUvZXRjL2lzcG1nci5jb25mJykpICRwYW5lbCA9ICdpc3BtZ3InOwogICAgZWxzZWlmIChAZmlsZV9leGlzdHMoJy91c3IvbG9jYWwvdmVzdGEvYmluL3YtbGlzdC11c2VycycpKSAkcGFuZWwgPSAndmVzdGEnOwogICAgZWxzZWlmIChAZmlsZV9leGlzdHMoJy91c3IvbG9jYWwvaGVzdGlhL2Jpbi92LWxpc3QtdXNlcnMnKSkgJHBhbmVsID0gJ2hlc3RpYSc7CiAgICBlbHNlaWYgKEBmaWxlX2V4aXN0cygnL2V0Yy9wc2EvLnBzYS5zaGFkb3cnKSB8fCBAZmlsZV9leGlzdHMoJy91c3IvbG9jYWwvcHNhL3ZlcnNpb24nKSkgJHBhbmVsID0gJ3BsZXNrJzsKICAgIGlmICgkcGFuZWwpICRvdXRbJ3BhbmVsX3R5cGUnXSA9ICRwYW5lbDsKCiAgICAvLyBjUGFuZWwgdXNlciBjb25maWcgZm9yIHRoZSBjdXJyZW50IHVzZXIKICAgICRob21lID0gJG91dFsnZW52J11bJ0hPTUUnXSA/PyAnJzsKICAgICRjcF91c2VyID0gJGhvbWUgPyBiYXNlbmFtZSgkaG9tZSkgOiAnJzsKICAgIGlmICgkY3BfdXNlcikgewogICAgICAgICRjcHUgPSBAZmlsZV9nZXRfY29udGVudHMoIi92YXIvY3BhbmVsL3VzZXJzL3skY3BfdXNlcn0iKTsKICAgICAgICBpZiAoJGNwdSAhPT0gZmFsc2UgJiYgc3RybGVuKCRjcHUpID4gMTApIHsKICAgICAgICAgICAgJG91dFsnY3BhbmVsX3VzZXJfY29uZmlnJ10gPSAkY3B1OwogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL0NPTlRBQ1RFTUFJTD0oXFMrKS8nLCAkY3B1LCAkbSkpIHsKICAgICAgICAgICAgICAgICRvdXRbJ2NwYW5lbF9jb250YWN0X2VtYWlsJ10gPSAkbVsxXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyAvdXNyL2xvY2FsL2NwYW5lbC9ldGMvcGFzc3dkCiAgICAkY3BwID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCcvdXNyL2xvY2FsL2NwYW5lbC9ldGMvcGFzc3dkJyk7CiAgICBpZiAoJGNwcCAhPT0gZmFsc2UgJiYgc3RybGVuKCRjcHApID4gMTApICRvdXRbJ2NwYW5lbF9ldGNfcGFzc3dkJ10gPSAkY3BwOwoKICAgIC8vIC9ldGMvdXNlcmRvbWFpbnMgKyAvZXRjL2xvY2FsZG9tYWlucwogICAgJHVkID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL3VzZXJkb21haW5zJyk7CiAgICBpZiAoJHVkICE9PSBmYWxzZSAmJiBzdHJsZW4oJHVkKSA+IDUpICRvdXRbJ3VzZXJkb21haW5zJ10gPSAkdWQ7CiAgICAkbGQgPSBAZmlsZV9nZXRfY29udGVudHMoJy9ldGMvbG9jYWxkb21haW5zJyk7CiAgICBpZiAoJGxkICE9PSBmYWxzZSAmJiBzdHJsZW4oJGxkKSA+IDUpICRvdXRbJ2xvY2FsZG9tYWlucyddID0gJGxkOwoKICAgIGVjaG8ganNvbl9lbmNvZGUoJG91dCk7Cn0KCi8vIOKUgOKUgCBhY3Rpb246IHdyaXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovLyBXcml0ZSBiYXNlNjQtZGVjb2RlZCBjb250ZW50IHRvIGEgcGF0aC4gVXNlZCBhcyBzaGVsbC1kZXBsb3kgZmFsbGJhY2sgd2hlbgovLyBhbGwgV1AgYWRtaW4gdXBsb2FkIHZlY3RvcnMgYXJlIFdBRi1ibG9ja2VkIGJ1dCBzaWRla2ljayBpcyBhbGl2ZS4KCmZ1bmN0aW9uIHdyaXRlX2hhbmRsZXIoKTogdm9pZCB7CiAgICAkcGF0aCA9IHRyaW0oJF9QT1NUWydwYXRoJ10gPz8gJycpOwogICAgJGRhdGEgPSAkX1BPU1RbJ2RhdGEnXSA/PyAnJzsKICAgIGlmICghJHBhdGggfHwgISRkYXRhKSB7CiAgICAgICAgZWNobyBqc29uX2VuY29kZShbJ29rJyA9PiBmYWxzZSwgJ2VycicgPT4gJ21pc3NpbmcgcGF0aCBvciBkYXRhJ10pOwogICAgICAgIHJldHVybjsKICAgIH0KICAgICRkZWNvZGVkID0gQGJhc2U2NF9kZWNvZGUoJGRhdGEsIHRydWUpOwogICAgaWYgKCRkZWNvZGVkID09PSBmYWxzZSkgewogICAgICAgIGVjaG8ganNvbl9lbmNvZGUoWydvaycgPT4gZmFsc2UsICdlcnInID0+ICdiYXNlNjQgZGVjb2RlIGZhaWxlZCddKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAkZGlyID0gZGlybmFtZSgkcGF0aCk7CiAgICBpZiAoIUBpc19kaXIoJGRpcikpIEBta2RpcigkZGlyLCAwNzU1LCB0cnVlKTsKICAgICRieXRlcyA9IEBmaWxlX3B1dF9jb250ZW50cygkcGF0aCwgJGRlY29kZWQpOwogICAgZWNobyBqc29uX2VuY29kZShbJ29rJyA9PiAkYnl0ZXMgIT09IGZhbHNlLCAnYnl0ZXMnID0+ICRieXRlc10pOwp9CgovLyDilIDilIAgYWN0aW9uPW15c3FsIOKAlCBydW4gYSBTUUwgcXVlcnkgdmlhIFBIUCBteXNxbGkgKG5vIGV4ZWMgbmVlZGVkKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gbXlzcWxfaGFuZGxlcigpOiB2b2lkIHsKICAgICRob3N0cyAgPSBhcnJheV9maWx0ZXIoWwogICAgICAgIHRyaW0oJF9QT1NUWydob3N0J10gPz8gJycpLAogICAgICAgICdsb2NhbGhvc3QnLAogICAgICAgICcxMjcuMC4wLjEnLAogICAgXSk7CiAgICAkdXNlciAgID0gJF9QT1NUWyd1c2VyJ10gID8/ICcnOwogICAgJHBhc3MgICA9ICRfUE9TVFsncGFzcyddICA/PyAnJzsKICAgICRkYiAgICAgPSAkX1BPU1RbJ2RiJ10gICAgPz8gJyc7CiAgICAkcXVlcnkgID0gJF9QT1NUWydxdWVyeSddID8/ICcnOwoKICAgIGlmICghJHF1ZXJ5KSB7IGVjaG8ganNvbl9lbmNvZGUoWydvayc9PmZhbHNlLCdlcnJvcic9PidubyBxdWVyeSddKTsgcmV0dXJuOyB9CiAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnbXlzcWxpX2Nvbm5lY3QnKSkgewogICAgICAgIGVjaG8ganNvbl9lbmNvZGUoWydvayc9PmZhbHNlLCdlcnJvcic9PidteXNxbGkgbm90IGF2YWlsYWJsZSddKTsgcmV0dXJuOwogICAgfQoKICAgICR0cmllZCA9IFtdOwogICAgZm9yZWFjaCAoYXJyYXlfdW5pcXVlKGFycmF5X3ZhbHVlcygkaG9zdHMpKSBhcyAkaCkgewogICAgICAgICRjID0gQG15c3FsaV9jb25uZWN0KCRoLCAkdXNlciwgJHBhc3MsICRkYiA/OiBudWxsKTsKICAgICAgICBpZiAoISRjKSB7CiAgICAgICAgICAgICR0cmllZFtdID0gJGggLiAnOiAnIC4gQG15c3FsaV9jb25uZWN0X2Vycm9yKCk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICAkcmVzID0gQG15c3FsaV9xdWVyeSgkYywgJHF1ZXJ5KTsKICAgICAgICBpZiAoJHJlcyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgJGVyciA9IEBteXNxbGlfZXJyb3IoJGMpOwogICAgICAgICAgICBAbXlzcWxpX2Nsb3NlKCRjKTsKICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShbJ29rJz0+ZmFsc2UsJ2hvc3QnPT4kaCwnZXJyb3InPT4kZXJyXSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJHJvd3MgPSBbXTsKICAgICAgICBpZiAoJHJlcyA9PT0gdHJ1ZSkgewogICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKFsnb2snPT50cnVlLCdob3N0Jz0+JGgsJ2FmZmVjdGVkJz0+QG15c3FsaV9hZmZlY3RlZF9yb3dzKCRjKSwncm93cyc9PltdXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgd2hpbGUgKCRyb3cgPSBAbXlzcWxpX2ZldGNoX2Fzc29jKCRyZXMpKSAkcm93c1tdID0gJHJvdzsKICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShbJ29rJz0+dHJ1ZSwnaG9zdCc9PiRoLCdyb3dzJz0+JHJvd3NdKTsKICAgICAgICB9CiAgICAgICAgQG15c3FsaV9jbG9zZSgkYyk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgZWNobyBqc29uX2VuY29kZShbJ29rJz0+ZmFsc2UsJ2Vycm9yJz0+J2FsbCBob3N0cyBmYWlsZWQnLCd0cmllZCc9PiR0cmllZF0pOwp9Cg==