diff --git a/nodejs/start.sh b/nodejs/start.sh index 34619a4..076cb13 100644 --- a/nodejs/start.sh +++ b/nodejs/start.sh @@ -6,7 +6,7 @@ export NEZHA_PORT=${NEZHA_PORT:-''} # v1哪吒不要填写这个,v0哪 export NEZHA_KEY=${NEZHA_KEY:-''} # 哪吒v0-agent密钥或v1的NZ_CLIENT_SECRET export ARGO_DOMAIN=${ARGO_DOMAIN:-''} # 固定隧道域名,留空即启用临时隧道 export ARGO_AUTH=${ARGO_AUTH:-''} # 固定隧道token或json,留空即启用临时隧道 -export CFIP=${CFIP:-'time.is'} # argo节点优选域名或优选ip +export CFIP=${CFIP:-'cf.877774.xyz'} # argo节点优选域名或优选ip export CFPORT=${CFPORT:-'443'} # argo节点端口 export NAME=${NAME:-''} # 节点名称 export FILE_PATH=${FILE_PATH:-'./.npm'} # 节点sub.txt保存路径 @@ -18,4 +18,4 @@ export CHAT_ID=${CHAT_ID:-''} # TG chat_id,可在https://t.me/ export BOT_TOKEN=${BOT_TOKEN:-''} # TG bot_token, 使用自己的bot需要填写,使用上方的bot不用填写,不会给别人发送 export UPLOAD_URL=${UPLOAD_URL:-''} # 订阅自动上传地址,没有可不填,需要填部署Merge-sub项目后的首页地址,例如:https://merge.zabc.net -echo "aWYgWyAtZiAiLmVudiIgXTsgdGhlbgogICAgc2V0IC1vIGFsbGV4cG9ydCAgCiAgICBzb3VyY2UgPChncmVwIC12ICdeIycgLmVudiB8IHNlZCAncy9eZXhwb3J0IC8vJyApCiAgICBzZXQgK28gYWxsZXhwb3J0CmZpCgpbICEgLWQgIiR7RklMRV9QQVRIfSIgXSAmJiBta2RpciAtcCAiJHtGSUxFX1BBVEh9IgoKZGVsZXRlX29sZF9ub2RlcygpIHsKICBbWyAteiAkVVBMT0FEX1VSTCB8fCAhIC1mICIke0ZJTEVfUEFUSH0vc3ViLnR4dCIgXV0gJiYgcmV0dXJuCiAgb2xkX25vZGVzPSQoYmFzZTY0IC1kICIke0ZJTEVfUEFUSH0vc3ViLnR4dCIgfCBncmVwIC1FICcodmxlc3N8dm1lc3N8dHJvamFufGh5c3RlcmlhMnx0dWljKTovLycpCiAgW1sgLXogJG9sZF9ub2RlcyBdXSAmJiByZXR1cm4KCiAganNvbl9kYXRhPSd7Im5vZGVzIjogWycKICBmb3Igbm9kZSBpbiAkb2xkX25vZGVzOyBkbwogICAgICBqc29uX2RhdGErPSJcIiRub2RlXCIsIgogIGRvbmUKICBqc29uX2RhdGE9JHtqc29uX2RhdGElLH0gIAogIGpzb25fZGF0YSs9J119JwoKICBjdXJsIC1YIERFTEVURSAiJFVQTE9BRF9VUkwvYXBpL2RlbGV0ZS1ub2RlcyIgXAogICAgICAgIC1IICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIFwKICAgICAgICAtZCAiJGpzb25fZGF0YSIgPiAvZGV2L251bGwgMj4mMQp9CmRlbGV0ZV9vbGRfbm9kZXMKCnJtIC1yZiBib290LmxvZyBjb25maWcuanNvbiB0dW5uZWwuanNvbiB0dW5uZWwueW1sICIke0ZJTEVfUEFUSH0vc3ViLnR4dCIgPi9kZXYvbnVsbCAyPiYxCgphcmdvX2NvbmZpZ3VyZSgpIHsKICBpZiBbWyAteiAkQVJHT19BVVRIIHx8IC16ICRBUkdPX0RPTUFJTiBdXTsgdGhlbgogICAgZWNobyAtZSAiXGVbMTszMm1BUkdPX0RPTUFJTiBvciBBUkdPX0FVVEggdmFyaWFibGUgaXMgZW1wdHksIHVzZSBxdWljayB0dW5uZWxzXGVbMG0iICAgCiAgICByZXR1cm4KICBmaQoKICBpZiBbWyAkQVJHT19BVVRIID1+IFR1bm5lbFNlY3JldCBdXTsgdGhlbgogICAgZWNobyAkQVJHT19BVVRIID4gJHtGSUxFX1BBVEh9L3R1bm5lbC5qc29uCiAgICBjYXQgPiB0dW5uZWwueW1sIDw8IEVPRgp0dW5uZWw6ICQoY3V0IC1kXCIgLWYxMiA8PDwgIiRBUkdPX0FVVEgiKQpjcmVkZW50aWFscy1maWxlOiAke0ZJTEVfUEFUSH0vdHVubmVsLmpzb24KcHJvdG9jb2w6IGh0dHAyCgppbmdyZXNzOgogIC0gaG9zdG5hbWU6ICRBUkdPX0RPTUFJTgogICAgc2VydmljZTogaHR0cDovL2xvY2FsaG9zdDokQVJHT19QT1JUCiAgICBvcmlnaW5SZXF1ZXN0OgogICAgICBub1RMU1ZlcmlmeTogdHJ1ZQogIC0gc2VydmljZTogaHR0cF9zdGF0dXM6NDA0CkVPRgogIGVsc2UKICAgIGVjaG8gLWUgIlxlWzE7MzJtVXNpbmcgdG9rZW4gY29ubmVjdCB0byB0dW5uZWwscGxlYXNlIHNldCAkQVJHT19QT1JUIGluIGNsb3VkZmxhcmUgdHVubmVsXGVbMG0iCiAgZmkKfQphcmdvX2NvbmZpZ3VyZQp3YWl0Cgpkb3dubG9hZF9hbmRfcnVuKCkgewpBUkNIPSQodW5hbWUgLW0pICYmIEZJTEVfSU5GTz0oKQppZiBbICIkQVJDSCIgPT0gImFybSIgXSB8fCBbICIkQVJDSCIgPT0gImFybTY0IiBdIHx8IFsgIiRBUkNIIiA9PSAiYWFyY2g2NCIgXTsgdGhlbgogICAgQkFTRV9VUkw9Imh0dHBzOi8vYXJtNjQuc3Nzcy5ueWMubW4iCmVsaWYgWyAiJEFSQ0giID09ICJhbWQ2NCIgXSB8fCBbICIkQVJDSCIgPT0gIng4Nl82NCIgXSB8fCBbICIkQVJDSCIgPT0gIng4NiIgXTsgdGhlbgogICAgQkFTRV9VUkw9Imh0dHBzOi8vYW1kNjQuc3Nzcy5ueWMubW4iCmVsaWYgWyAiJEFSQ0giID09ICJzMzkweCIgXSB8fCBbICIkQVJDSCIgPT0gInMzOTAiIF07IHRoZW4KICAgIEJBU0VfVVJMPSJodHRwczovL3MzOTB4LnNzc3MubnljLm1uIgplbHNlCiAgICBlY2hvICJVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmU6ICRBUkNIIgogICAgZXhpdCAxCmZpCkZJTEVfSU5GTz0oIiRCQVNFX1VSTC9zYiB3ZWIiICIkQkFTRV9VUkwvYm90IGJvdCIpCgppZiBbIC1uICIkTkVaSEFfU0VSVkVSIiBdICYmIFsgLW4gIiRORVpIQV9QT1JUIiBdICYmIFsgLW4gIiRORVpIQV9LRVkiIF07IHRoZW4KICAgIEZJTEVfSU5GTys9KCIkQkFTRV9VUkwvYWdlbnQgbnBtIikKZWxpZiBbIC1uICIkTkVaSEFfU0VSVkVSIiBdICYmIFsgLW4gIiRORVpIQV9LRVkiIF07IHRoZW4KICAgIEZJTEVfSU5GTys9KCIkQkFTRV9VUkwvdjEgcGhwIikKICAgIE5FWkhBX1RMUz0kKGNhc2UgIiR7TkVaSEFfU0VSVkVSIyMqOn0iIGluIDQ0M3w4NDQzfDIwOTZ8MjA4N3wyMDgzfDIwNTMpIGVjaG8gLW4gdHJ1ZTs7ICopIGVjaG8gLW4gZmFsc2U7OyBlc2FjKQogICAgY2F0ID4gIiR7RklMRV9QQVRIfS9jb25maWcueWFtbCIgPDwgRU9GCmNsaWVudF9zZWNyZXQ6ICR7TkVaSEFfS0VZfQpkZWJ1ZzogZmFsc2UKZGlzYWJsZV9hdXRvX3VwZGF0ZTogdHJ1ZQpkaXNhYmxlX2NvbW1hbmRfZXhlY3V0ZTogZmFsc2UKZGlzYWJsZV9mb3JjZV91cGRhdGU6IHRydWUKZGlzYWJsZV9uYXQ6IGZhbHNlCmRpc2FibGVfc2VuZF9xdWVyeTogZmFsc2UKZ3B1OiBmYWxzZQppbnNlY3VyZV90bHM6IGZhbHNlCmlwX3JlcG9ydF9wZXJpb2Q6IDE4MDAKcmVwb3J0X2RlbGF5OiA0CnNlcnZlcjogJHtORVpIQV9TRVJWRVJ9CnNraXBfY29ubmVjdGlvbl9jb3VudDogZmFsc2UKc2tpcF9wcm9jc19jb3VudDogZmFsc2UKdGVtcGVyYXR1cmU6IGZhbHNlCnRsczogJHtORVpIQV9UTFN9CnVzZV9naXRlZV90b191cGdyYWRlOiBmYWxzZQp1c2VfaXB2Nl9jb3VudHJ5X2NvZGU6IGZhbHNlCnV1aWQ6ICR7VVVJRH0KRU9GCmVsc2UKICAgIGVjaG8gLWUgIlxlWzE7MzVtc2tpcHBpbmcgZG93bmxvYWQgbmV6aGFcZVswbSIKZmkKCmRlY2xhcmUgLUEgRklMRV9NQVAKZ2VuZXJhdGVfcmFuZG9tX25hbWUoKSB7CiAgICBsb2NhbCBjaGFycz1hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejEyMzQ1Njc4OTAKICAgIGxvY2FsIG5hbWU9IiIKICAgIGZvciBpIGluIHsxLi42fTsgZG8KICAgICAgICBuYW1lPSIkbmFtZSR7Y2hhcnM6UkFORE9NJSR7I2NoYXJzfToxfSIKICAgIGRvbmUKICAgIGVjaG8gIiRuYW1lIgp9CmRvd25sb2FkX2ZpbGUoKSB7CiAgICBsb2NhbCBVUkw9JDEKICAgIGxvY2FsIE5FV19GSUxFTkFNRT0kMgoKICAgIGlmIGNvbW1hbmQgLXYgY3VybCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBjdXJsIC1MIC1zUyAtbyAiJE5FV19GSUxFTkFNRSIgIiRVUkwiCiAgICAgICAgZWNobyAtZSAiXGVbMTszMm1Eb3dubG9hZGVkICRORVdfRklMRU5BTUUgYnkgY3VybFxlWzBtIgogICAgZWxpZiBjb21tYW5kIC12IHdnZXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgd2dldCAtcSAtTyAiJE5FV19GSUxFTkFNRSIgIiRVUkwiCiAgICAgICAgZWNobyAtZSAiXGVbMTszMm1Eb3dubG9hZGVkICRORVdfRklMRU5BTUUgYnkgd2dldFxlWzBtIgogICAgZWxzZQogICAgICAgIGVjaG8gLWUgIlxlWzE7MzNtTmVpdGhlciBjdXJsIG5vciB3Z2V0IGlzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWRpbmdcZVswbSIKICAgICAgICBleGl0IDEKICAgIGZpCn0KZm9yIGVudHJ5IGluICIke0ZJTEVfSU5GT1tAXX0iOyBkbwogICAgVVJMPSQoZWNobyAiJGVudHJ5IiB8IGN1dCAtZCAnICcgLWYgMSkKICAgIFJBTkRPTV9OQU1FPSQoZ2VuZXJhdGVfcmFuZG9tX25hbWUpCiAgICBORVdfRklMRU5BTUU9IiR7RklMRV9QQVRIfS8kUkFORE9NX05BTUUiCiAgICAKICAgIGRvd25sb2FkX2ZpbGUgIiRVUkwiICIkTkVXX0ZJTEVOQU1FIgogICAgCiAgICBjaG1vZCAreCAiJE5FV19GSUxFTkFNRSIKICAgIEZJTEVfTUFQWyQoZWNobyAiJGVudHJ5IiB8IGN1dCAtZCAnICcgLWYgMildPSIkTkVXX0ZJTEVOQU1FIgpkb25lCndhaXQKCm91dHB1dD0kKCIke0ZJTEVfUEFUSH0vJChiYXNlbmFtZSAke0ZJTEVfTUFQW3dlYl19KSIgZ2VuZXJhdGUgcmVhbGl0eS1rZXlwYWlyKQpwcml2YXRlX2tleT0kKGVjaG8gIiR7b3V0cHV0fSIgfCBhd2sgJy9Qcml2YXRlS2V5Oi8ge3ByaW50ICQyfScpCnB1YmxpY19rZXk9JChlY2hvICIke291dHB1dH0iIHwgYXdrICcvUHVibGljS2V5Oi8ge3ByaW50ICQyfScpCgpvcGVuc3NsIGVjcGFyYW0gLWdlbmtleSAtbmFtZSBwcmltZTI1NnYxIC1vdXQgIiR7RklMRV9QQVRIfS9wcml2YXRlLmtleSIKb3BlbnNzbCByZXEgLW5ldyAteDUwOSAtZGF5cyAzNjUwIC1rZXkgIiR7RklMRV9QQVRIfS9wcml2YXRlLmtleSIgLW91dCAiJHtGSUxFX1BBVEh9L2NlcnQucGVtIiAtc3ViaiAiL0NOPWJpbmcuY29tIgoKICBjYXQgPiAke0ZJTEVfUEFUSH0vY29uZmlnLmpzb24gPDwgRU9GCnsKICAgICJsb2ciOiB7CiAgICAgICJkaXNhYmxlZCI6IHRydWUsCiAgICAgICJsZXZlbCI6ICJlcnJvciIsCiAgICAgICJ0aW1lc3RhbXAiOiB0cnVlCiAgICB9LAogICAgImluYm91bmRzIjogWwogICAgewogICAgICAidGFnIjogInZtZXNzLXdzLWluIiwKICAgICAgInR5cGUiOiAidm1lc3MiLAogICAgICAibGlzdGVuIjogIjo6IiwKICAgICAgImxpc3Rlbl9wb3J0IjogJHtBUkdPX1BPUlR9LAogICAgICAgICJ1c2VycyI6IFsKICAgICAgICB7CiAgICAgICAgICAidXVpZCI6ICIke1VVSUR9IgogICAgICAgIH0KICAgICAgXSwKICAgICAgInRyYW5zcG9ydCI6IHsKICAgICAgICAidHlwZSI6ICJ3cyIsCiAgICAgICAgInBhdGgiOiAiL3ZtZXNzLWFyZ28iLAogICAgICAgICJlYXJseV9kYXRhX2hlYWRlcl9uYW1lIjogIlNlYy1XZWJTb2NrZXQtUHJvdG9jb2wiCiAgICAgIH0KICAgIH0kKGlmIFsgIiRUVUlDX1BPUlQiICE9ICIiIF07IHRoZW4gZWNobyAnLAogICAgewogICAgICAidGFnIjogInR1aWMtaW4iLAogICAgICAidHlwZSI6ICJ0dWljIiwKICAgICAgImxpc3RlbiI6ICI6OiIsCiAgICAgICJsaXN0ZW5fcG9ydCI6ICcke1RVSUNfUE9SVH0nLAogICAgICAidXNlcnMiOiBbCiAgICAgICAgewogICAgICAgICAgInV1aWQiOiAiJyR7VVVJRH0nIiwKICAgICAgICAgICJwYXNzd29yZCI6ICJhZG1pbiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJjb25nZXN0aW9uX2NvbnRyb2wiOiAiYmJyIiwKICAgICAgInRscyI6IHsKICAgICAgICAiZW5hYmxlZCI6IHRydWUsCiAgICAgICAgImFscG4iOiBbCiAgICAgICAgICAiaDMiCiAgICAgICAgXSwKICAgICAgICAiY2VydGlmaWNhdGVfcGF0aCI6ICInJHtGSUxFX1BBVEh9Jy9jZXJ0LnBlbSIsCiAgICAgICAgImtleV9wYXRoIjogIicke0ZJTEVfUEFUSH0nL3ByaXZhdGUua2V5IgogICAgICB9CiAgICB9JzsgZmkpJChpZiBbICIkSFkyX1BPUlQiICE9ICIiIF07IHRoZW4gZWNobyAnLAogICAgewogICAgICAidGFnIjogImh5c3RlcmlhMi1pbiIsCiAgICAgICJ0eXBlIjogImh5c3RlcmlhMiIsCiAgICAgICJsaXN0ZW4iOiAiOjoiLAogICAgICAibGlzdGVuX3BvcnQiOiAnJHtIWTJfUE9SVH0nLAogICAgICAgICJ1c2VycyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgICJwYXNzd29yZCI6ICInJHtVVUlEfSciCiAgICAgICAgICB9CiAgICAgIF0sCiAgICAgICJtYXNxdWVyYWRlIjogImh0dHBzOi8vYmluZy5jb20iLAogICAgICAgICJ0bHMiOiB7CiAgICAgICAgICAgICJlbmFibGVkIjogdHJ1ZSwKICAgICAgICAgICAgImFscG4iOiBbCiAgICAgICAgICAgICAgICAiaDMiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJjZXJ0aWZpY2F0ZV9wYXRoIjogIicke0ZJTEVfUEFUSH0nL2NlcnQucGVtIiwKICAgICAgICAgICAgImtleV9wYXRoIjogIicke0ZJTEVfUEFUSH0nL3ByaXZhdGUua2V5IgogICAgICAgICAgfQogICAgICB9JzsgZmkpJChpZiBbICIkUkVBTElUWV9QT1JUIiAhPSAiIiBdOyB0aGVuIGVjaG8gJywKICAgICAgewogICAgICAgICJ0YWciOiAidmxlc3MtcmVhbGl0eS12ZXNpb24iLAogICAgICAgICJ0eXBlIjogInZsZXNzIiwKICAgICAgICAibGlzdGVuIjogIjo6IiwKICAgICAgICAibGlzdGVuX3BvcnQiOiAnJHtSRUFMSVRZX1BPUlR9JywKICAgICAgICAgICJ1c2VycyI6IFsKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXVpZCI6ICInJFVVSUQnIiwKICAgICAgICAgICAgICAgICJmbG93IjogInh0bHMtcnByeC12aXNpb24iCiAgICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJ0bHMiOiB7CiAgICAgICAgICAgICAgImVuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICJzZXJ2ZXJfbmFtZSI6ICJ3d3cubmF6aHVtaS5jb20iLAogICAgICAgICAgICAgICJyZWFsaXR5IjogewogICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICJoYW5kc2hha2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIjogInd3dy5uYXpodW1pLmNvbSIsCiAgICAgICAgICAgICAgICAgICAgICAic2VydmVyX3BvcnQiOiA0NDMKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgInByaXZhdGVfa2V5IjogIickcHJpdmF0ZV9rZXknIiwKICAgICAgICAgICAgICAgICAgInNob3J0X2lkIjogWwogICAgICAgICAgICAgICAgICAgICIiCiAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0nOyBmaSkKICAgXSwKICAib3V0Ym91bmRzIjogWwogICAgewogICAgICAidHlwZSI6ICJkaXJlY3QiLAogICAgICAidGFnIjogImRpcmVjdCIKICAgIH0sCiAgICB7CiAgICAgICJ0eXBlIjogImJsb2NrIiwKICAgICAgInRhZyI6ICJibG9jayIKICAgIH0sCiAgICB7CiAgICAgICJ0eXBlIjogIndpcmVndWFyZCIsCiAgICAgICJ0YWciOiAid2lyZWd1YXJkLW91dCIsCiAgICAgICJzZXJ2ZXIiOiAiMTYyLjE1OS4xOTIuMjAwIiwKICAgICAgInNlcnZlcl9wb3J0IjogNDUwMCwKICAgICAgImxvY2FsX2FkZHJlc3MiOiBbCiAgICAgICAgIjE3Mi4xNi4wLjIvMzIiLAogICAgICAgICIyNjA2OjQ3MDA6MTEwOjhmNzc6MWNhOTpmMDg2Ojg0NmM6NWY5ZS8xMjgiCiAgICAgIF0sCiAgICAgICJwcml2YXRlX2tleSI6ICJ3SXhzemRSMm5NZEE3YTJVbDNYUWNuaVNmU1pxZHFqUGI2dzZvcHZmNUFVPSIsCiAgICAgICJwZWVyX3B1YmxpY19rZXkiOiAiYm1YT0MrRjFGeEVNRjlkeWlLMkg1LzFTVXR6SDBKdVZvNTFoMndQZmd5bz0iLAogICAgICAicmVzZXJ2ZWQiOiBbMTI2LCAyNDYsIDE3M10KICAgIH0KICBdLAogICJyb3V0ZSI6IHsKICAgICJydWxlX3NldCI6IFsKICAgICAgewogICAgICAgICJ0YWciOiAibmV0ZmxpeCIsCiAgICAgICAgInR5cGUiOiAicmVtb3RlIiwKICAgICAgICAiZm9ybWF0IjogImJpbmFyeSIsCiAgICAgICAgInVybCI6ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vTWV0YUN1YmVYL21ldGEtcnVsZXMtZGF0L3NpbmcvZ2VvL2dlb3NpdGUvbmV0ZmxpeC5zcnMiLAogICAgICAgICJkb3dubG9hZF9kZXRvdXIiOiAiZGlyZWN0IgogICAgICB9LAogICAgICB7CiAgICAgICAgInRhZyI6ICJvcGVuYWkiLAogICAgICAgICJ0eXBlIjogInJlbW90ZSIsCiAgICAgICAgImZvcm1hdCI6ICJiaW5hcnkiLAogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL01ldGFDdWJlWC9tZXRhLXJ1bGVzLWRhdC9zaW5nL2dlby9nZW9zaXRlL29wZW5haS5zcnMiLAogICAgICAgICJkb3dubG9hZF9kZXRvdXIiOiAiZGlyZWN0IgogICAgICB9CiAgICBdLAogICAgInJ1bGVzIjogWwogICAgICB7CiAgICAgICAgInJ1bGVfc2V0IjogWyJuZXRmbGl4IiwgIm9wZW5haSJdLAogICAgICAgICJvdXRib3VuZCI6ICJ3aXJlZ3VhcmQtb3V0IgogICAgICB9CiAgICBdLAogICAgImZpbmFsIjogImRpcmVjdCIKICB9Cn0KRU9GCgppZiBbIC1lICIke0ZJTEVfUEFUSH0vJChiYXNlbmFtZSAke0ZJTEVfTUFQW3dlYl19KSIgXTsgdGhlbgogICAgbm9odXAgIiR7RklMRV9QQVRIfS8kKGJhc2VuYW1lICR7RklMRV9NQVBbd2ViXX0pIiBydW4gLWMgJHtGSUxFX1BBVEh9L2NvbmZpZy5qc29uID4vZGV2L251bGwgMj4mMSAmCiAgICBzbGVlcCAyCiAgICBlY2hvIC1lICJcZVsxOzMybSQoYmFzZW5hbWUgJHtGSUxFX01BUFt3ZWJdfSkgaXMgcnVubmluZ1xlWzBtIgpmaQoKaWYgWyAtZSAiJHtGSUxFX1BBVEh9LyQoYmFzZW5hbWUgJHtGSUxFX01BUFtib3RdfSkiIF07IHRoZW4KICAgIGlmIFtbICRBUkdPX0FVVEggPX4gXltBLVowLTlhLXo9XXsxMjAsMjUwfSQgXV07IHRoZW4KICAgICAgYXJncz0idHVubmVsIC0tZWRnZS1pcC12ZXJzaW9uIGF1dG8gLS1uby1hdXRvdXBkYXRlIC0tcHJvdG9jb2wgaHR0cDIgcnVuIC0tdG9rZW4gJHtBUkdPX0FVVEh9IgogICAgZWxpZiBbWyAkQVJHT19BVVRIID1+IFR1bm5lbFNlY3JldCBdXTsgdGhlbgogICAgICBhcmdzPSJ0dW5uZWwgLS1lZGdlLWlwLXZlcnNpb24gYXV0byAtLWNvbmZpZyAke0ZJTEVfUEFUSH0vdHVubmVsLnltbCBydW4iCiAgICBlbHNlCiAgICAgIGFyZ3M9InR1bm5lbCAtLWVkZ2UtaXAtdmVyc2lvbiBhdXRvIC0tbm8tYXV0b3VwZGF0ZSAtLXByb3RvY29sIGh0dHAyIC0tbG9nZmlsZSAke0ZJTEVfUEFUSH0vYm9vdC5sb2cgLS1sb2dsZXZlbCBpbmZvIC0tdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6JEFSR09fUE9SVCIKICAgIGZpCiAgICBub2h1cCAiJHtGSUxFX1BBVEh9LyQoYmFzZW5hbWUgJHtGSUxFX01BUFtib3RdfSkiICRhcmdzID4vZGV2L251bGwgMj4mMSAmCiAgICBzbGVlcCAyCiAgICBlY2hvIC1lICJcZVsxOzMybSQoYmFzZW5hbWUgJHtGSUxFX01BUFtib3RdfSkgaXMgcnVubmluZ1xlWzBtIiAKZmkKCmlmIFsgLW4gIiRORVpIQV9TRVJWRVIiIF0gJiYgWyAtbiAiJE5FWkhBX1BPUlQiIF0gJiYgWyAtbiAiJE5FWkhBX0tFWSIgXTsgdGhlbgogICAgaWYgWyAtZSAiJHtGSUxFX1BBVEh9LyQoYmFzZW5hbWUgJHtGSUxFX01BUFtucG1dfSkiIF07IHRoZW4KICAgICAgdGxzUG9ydHM9KCI0NDMiICI4NDQzIiAiMjA5NiIgIjIwODciICIyMDgzIiAiMjA1MyIpCiAgICAgIFtbICIke3Rsc1BvcnRzWypdfSIgPX4gIiR7TkVaSEFfUE9SVH0iIF1dICYmIE5FWkhBX1RMUz0iLS10bHMiIHx8IE5FWkhBX1RMUz0iIgogICAgICBleHBvcnQgVE1QRElSPSQocHdkKQogICAgICBub2h1cCAiJHtGSUxFX1BBVEh9LyQoYmFzZW5hbWUgJHtGSUxFX01BUFtucG1dfSkiIC1zICR7TkVaSEFfU0VSVkVSfToke05FWkhBX1BPUlR9IC1wICR7TkVaSEFfS0VZfSAke05FWkhBX1RMU30gPi9kZXYvbnVsbCAyPiYxICYKICAgICAgc2xlZXAgMgogICAgICBlY2hvIC1lICJcZVsxOzMybSQoYmFzZW5hbWUgJHtGSUxFX01BUFtucG1dfSkgaXMgcnVubmluZ1xlWzBtIgogICAgZmkKZWxpZiBbIC1uICIkTkVaSEFfU0VSVkVSIiBdICYmIFsgLW4gIiRORVpIQV9LRVkiIF07IHRoZW4KICAgIGlmIFsgLWUgIiR7RklMRV9QQVRIfS8kKGJhc2VuYW1lICR7RklMRV9NQVBbcGhwXX0pIiBdOyB0aGVuCiAgICAgIG5vaHVwICIke0ZJTEVfUEFUSH0vJChiYXNlbmFtZSAke0ZJTEVfTUFQW3BocF19KSIgLWMgIiR7RklMRV9QQVRIfS9jb25maWcueWFtbCIgPi9kZXYvbnVsbCAyPiYxICYKICAgICAgZWNobyAtZSAiXGVbMTszMm0ke0ZJTEVfUEFUSH0vJChiYXNlbmFtZSAke0ZJTEVfTUFQW3BocF19KSBpcyBydW5uaW5nXGVbMG0iCiAgICBmaQplbHNlCiAgICBlY2hvIC1lICJcZVsxOzM1bU5FWkhBIHZhcmlhYmxlIGlzIGVtcHR5LCBza2lwcGluZyBydW5uaW5nXGVbMG0iCmZpCgpmb3Iga2V5IGluICIkeyFGSUxFX01BUFtAXX0iOyBkbwogICAgaWYgWyAtZSAiJHtGSUxFX1BBVEh9LyQoYmFzZW5hbWUgJHtGSUxFX01BUFska2V5XX0pIiBdOyB0aGVuCiAgICAgICAgcm0gLXJmICIke0ZJTEVfUEFUSH0vJChiYXNlbmFtZSAke0ZJTEVfTUFQWyRrZXldfSkiID4vZGV2L251bGwgMj4mMQogICAgZmkKZG9uZQp9CmRvd25sb2FkX2FuZF9ydW4KCmdldF9hcmdvZG9tYWluKCkgewogIGlmIFtbIC1uICRBUkdPX0FVVEggXV07IHRoZW4KICAgIGVjaG8gIiRBUkdPX0RPTUFJTiIKICBlbHNlCiAgICBsb2NhbCByZXRyeT0wCiAgICBsb2NhbCBtYXhfcmV0cmllcz04CiAgICBsb2NhbCBhcmdvZG9tYWluPSIiCiAgICB3aGlsZSBbWyAkcmV0cnkgLWx0ICRtYXhfcmV0cmllcyBdXTsgZG8KICAgICAgKChyZXRyeSsrKSkKICAgICAgYXJnb2RvbWFpbj0kKHNlZCAtbiAnc3wuKmh0dHBzOi8vXChbXi9dKnRyeWNsb3VkZmxhcmVcLmNvbVwpLip8XDF8cCcgJHtGSUxFX1BBVEh9L2Jvb3QubG9nKQogICAgICBpZiBbWyAtbiAkYXJnb2RvbWFpbiBdXTsgdGhlbgogICAgICAgIGJyZWFrCiAgICAgIGZpCiAgICAgIHNsZWVwIDEKICAgIGRvbmUKICAgIGVjaG8gIiRhcmdvZG9tYWluIgogIGZpCn0KCnNlbmRfdGVsZWdyYW0oKSB7CiAgWyAtZiAiJHtGSUxFX1BBVEh9L3N1Yi50eHQiIF0gfHwgcmV0dXJuCiAgTUVTU0FHRT0kKGNhdCAiJHtGSUxFX1BBVEh9L3N1Yi50eHQiKQogIExPQ0FMX01FU1NBR0U9Iioke05BTUV96IqC54K55o6o6YCB6YCa55+lKlxgXGBcYCR7TUVTU0FHRX1cYFxgXGAiCiAgQk9UX01FU1NBR0U9IjxiPiR7TkFNRX3oioLngrnmjqjpgIHpgJrnn6U8L2I+XG48cHJlPiR7TUVTU0FHRX08L3ByZT4iCiAgaWYgWyAtbiAiJHtCT1RfVE9LRU59IiBdICYmIFsgLW4gIiR7Q0hBVF9JRH0iIF07IHRoZW4KICAgIGN1cmwgLXMgLVggUE9TVCAiaHR0cHM6Ly9hcGkudGVsZWdyYW0ub3JnL2JvdCR7Qk9UX1RPS0VOfS9zZW5kTWVzc2FnZSIgXAogICAgICAtZCAiY2hhdF9pZD0ke0NIQVRfSUR9JnRleHQ9JHtMT0NBTF9NRVNTQUdFfSZwYXJzZV9tb2RlPU1hcmtkb3duIiA+IC9kZXYvbnVsbAoKICBlbGlmIFsgLW4gIiR7Q0hBVF9JRH0iIF07IHRoZW4KICAgIGN1cmwgLXMgLVggUE9TVCAiaHR0cDovL2FwaS50Zy5ndnJhbmRlci5ldS5vcmcvYXBpL25vdGlmeSIgXAogICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyIGVKV1JneEM0TGN6bktMaVVpRG9Vc3dAbk1nREJDQ1NVazZJdzBTOVBicyIgXAogICAgICAtSCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiBcCiAgICAgIC1kICIkKHByaW50ZiAneyJjaGF0X2lkIjogIiVzIiwgIm1lc3NhZ2UiOiAiJXMifScgIiR7Q0hBVF9JRH0iICIke0JPVF9NRVNTQUdFfSIpIiA+IC9kZXYvbnVsbAogIGVsc2UKICAgIGVjaG8gLWUgIlxuXGVbMTszNW1URyB2YXJpYWJsZSBpcyBlbXB0eSxza2lwcGluZyBzZW50XGVbMG0iCiAgICByZXR1cm4KICBmaQoKICBpZiBbICQ/IC1lcSAwIF07IHRoZW4KICAgIGVjaG8gLWUgIlxuXGVbMTszMm1Ob2RlcyBzZW50IHRvIFRHIHN1Y2Nlc3NmdWxseVxlWzBtIgogIGVsc2UKICAgIGVjaG8gLWUgIlxuXGVbMTszMW1GYWlsZWQgdG8gc2VuZCBub2RlcyB0byBUR1xlWzBtIgogIGZpCn0KCnVwbG9kX25vZGVzKCkgewogICAgW1sgLXogJFVQTE9BRF9VUkwgfHwgISAtZiAiJHtGSUxFX1BBVEh9L2xpc3QudHh0IiBdXSAmJiByZXR1cm4KICAgIGNvbnRlbnQ9JChjYXQgJHtGSUxFX1BBVEh9L2xpc3QudHh0KQogICAgbm9kZXM9JChlY2hvICIkY29udGVudCIgfCBncmVwIC1FICcodmxlc3N8dm1lc3N8dHJvamFufGh5c3RlcmlhMnx0dWljKTovLycpCiAgICBbWyAteiAkbm9kZXMgXV0gJiYgcmV0dXJuCiAgICBub2Rlcz0oJG5vZGVzKQogICAganNvbl9kYXRhPSd7Im5vZGVzIjogWycKICAgIGZvciBub2RlIGluICIke25vZGVzW0BdfSI7IGRvCiAgICAgICAganNvbl9kYXRhKz0iXCIkbm9kZVwiLCIKICAgIGRvbmUKICAgIGpzb25fZGF0YT0ke2pzb25fZGF0YSUsfQogICAganNvbl9kYXRhKz0nXX0nCgogICAgY3VybCAtWCBQT1NUICIkVVBMT0FEX1VSTC9hcGkvYWRkLW5vZGVzIiBcCiAgICAgICAgIC1IICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIFwKICAgICAgICAgLWQgIiRqc29uX2RhdGEiID4gL2Rldi9udWxsIDI+JjEKCiAgICBpZiBbWyAkPyAtZXEgMCBdXTsgdGhlbgogICAgICAgIGVjaG8gLWUgIlwwMzNbMTszMm1Ob2RlcyB1cGxvYWRlZCBzdWNjZXNzZnVsbHlcMDMzWzBtIgogICAgZWxzZQogICAgICAgIGVjaG8gLWUgIlwwMzNbMTszMW1GYWlsZWQgdG8gdXBsb2FkIG5vZGVzXDAzM1swbSIKICAgIGZpCn0KCmFyZ29kb21haW49JChnZXRfYXJnb2RvbWFpbikKZWNobyAtZSAiXGVbMTszMm1BcmdvRG9tYWluOlxlWzE7MzVtJHthcmdvZG9tYWlufVxlWzBtXG4iCnNsZWVwIDEKSVA9JChjdXJsIC1zIC0tbWF4LXRpbWUgMiBpcHY0LmlwLnNiIHx8IGN1cmwgLXMgLS1tYXgtdGltZSAxIGFwaS5pcGlmeS5vcmcgfHwgeyBpcHY2PSQoY3VybCAtcyAtLW1heC10aW1lIDEgaXB2Ni5pcC5zYik7IGVjaG8gIlskaXB2Nl0iOyB9IHx8IGVjaG8gIlhYWCIpCklTUD0kKGN1cmwgLXMgLS1tYXgtdGltZSAyIGh0dHBzOi8vc3BlZWQuY2xvdWRmbGFyZS5jb20vbWV0YSB8IGF3ayAtRlwiICd7cHJpbnQgJDI2Ii0iJDE4fScgfCBzZWQgLWUgJ3MvIC9fL2cnIHx8IGVjaG8gIjAuMCIpCmNvc3RvbV9uYW1lKCkgeyBpZiBbIC1uICIkTkFNRSIgXTsgdGhlbiBlY2hvICIke05BTUV9XyR7SVNQfSI7IGVsc2UgZWNobyAiJHtJU1B9IjsgZmk7IH0KClZNRVNTPSJ7IFwidlwiOiBcIjJcIiwgXCJwc1wiOiBcIiQoY29zdG9tX25hbWUpXCIsIFwiYWRkXCI6IFwiJHtDRklQfVwiLCBcInBvcnRcIjogXCIke0NGUE9SVH1cIiwgXCJpZFwiOiBcIiR7VVVJRH1cIiwgXCJhaWRcIjogXCIwXCIsIFwic2N5XCI6IFwibm9uZVwiLCBcIm5ldFwiOiBcIndzXCIsIFwidHlwZVwiOiBcIm5vbmVcIiwgXCJob3N0XCI6IFwiJHthcmdvZG9tYWlufVwiLCBcInBhdGhcIjogXCIvdm1lc3MtYXJnbz9lZD0yNTYwXCIsIFwidGxzXCI6IFwidGxzXCIsIFwic25pXCI6IFwiJHthcmdvZG9tYWlufVwiLCBcImFscG5cIjogXCJcIiwgXCJmcFwiOiBcImNocm9tZVwifSIKCmNhdCA+ICR7RklMRV9QQVRIfS9saXN0LnR4dCA8PEVPRgp2bWVzczovLyQoZWNobyAiJFZNRVNTIiB8IGJhc2U2NCB8IHRyIC1kICdcbicpCkVPRgoKaWYgWyAiJFRVSUNfUE9SVCIgIT0gIiIgXTsgdGhlbgogIGVjaG8gLWUgIlxudHVpYzovLyR7VVVJRH06YWRtaW5AJHtJUH06JHtUVUlDX1BPUlR9P3NuaT13d3cuYmluZy5jb20mYWxwbj1oMyZjb25nZXN0aW9uX2NvbnRyb2w9YmJyIyQoY29zdG9tX25hbWUpIiA+PiAke0ZJTEVfUEFUSH0vbGlzdC50eHQKZmkKCmlmIFsgIiRIWTJfUE9SVCIgIT0gIiIgXTsgdGhlbgogIGVjaG8gLWUgIlxuaHlzdGVyaWEyOi8vJHtVVUlEfUAke0lQfToke0hZMl9QT1JUfS8/c25pPXd3dy5iaW5nLmNvbSZhbHBuPWgzJmluc2VjdXJlPTEjJChjb3N0b21fbmFtZSkiID4+ICR7RklMRV9QQVRIfS9saXN0LnR4dApmaQoKaWYgWyAiJFJFQUxJVFlfUE9SVCIgIT0gIiIgXTsgdGhlbgogIGVjaG8gLWUgIlxudmxlc3M6Ly8ke1VVSUR9QCR7SVB9OiR7UkVBTElUWV9QT1JUfT9lbmNyeXB0aW9uPW5vbmUmZmxvdz14dGxzLXJwcngtdmlzaW9uJnNlY3VyaXR5PXJlYWxpdHkmc25pPXd3dy5uYXpodW1pLmNvbSZmcD1jaHJvbWUmcGJrPSR7cHVibGljX2tleX0mdHlwZT10Y3AmaGVhZGVyVHlwZT1ub25lIyQoY29zdG9tX25hbWUpIiA+PiAke0ZJTEVfUEFUSH0vbGlzdC50eHQKZmkKCmJhc2U2NCAke0ZJTEVfUEFUSH0vbGlzdC50eHQgfCB0ciAtZCAnXG4nID4gJHtGSUxFX1BBVEh9L3N1Yi50eHQKY2F0ICR7RklMRV9QQVRIfS9saXN0LnR4dAplY2hvIC1lICJcblxuXGVbMTszMm0ke0ZJTEVfUEFUSH0vc3ViLnR4dCBzYXZlZCBzdWNjZXNzZnVsbHlcZVswbSIKdXBsb2Rfbm9kZXMKc2VuZF90ZWxlZ3JhbQplY2hvIC1lICJcblxlWzE7MzJtUnVubmluZyBkb25lIVxlWzBtXG4iCnNsZWVwIDEgCgpybSAtcmYgJHtGSUxFX1BBVEh9L2Jvb3QubG9nICR7RklMRV9QQVRIfS9jb25maWcuanNvbiAke0ZJTEVfUEFUSH0vc2IubG9nICR7RklMRV9QQVRIfS9jb3JlICR7RklMRV9QQVRIfS9mYWtlX3VzZXJhZ2VudF8wLjIuMC5qc29uICR7RklMRV9QQVRIfS9saXN0LnR4dCAke0ZJTEVfUEFUSH0vdHVubmVsLmpzb24gJHtGSUxFX1BBVEh9L3R1bm5lbC55bWwgPi9kZXYvbnVsbCAyPiYxCmVjaG8gLWUgIlxlWzE7MzVtR2l0aHVi77yaaHR0cHM6Ly9naXRodWIuY29tL2Vvb2NlL3NpbmctYm94L25vZGVqc1xlWzBtIgplY2hvIC1lICJcZVsxOzMybVlvdXR1YmXpopHpgZPvvJpcZVsxOzM1bWh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL0Blb29jZVxlWzBtIgplY2hvIC1lICJcZVsxOzMybVRlbGVncmFt576k57uE77yaXGVbMTszNW1odHRwczovL3QubWUvZW9vY2V1XGVbMG1cbiIKZWNobyAtZSAiXG5cZVsxOzMybWxvZ3Mgd2lsbCBiZSBkZWxldGVkIGluIDE1IHNlY29uZHMhXGVbMG1cbiIKc2xlZXAgMTUKY2xlYXI=" | base64 -d | bash +echo "aWYgWyAtZiAiLmVudiIgXTsgdGhlbgogICAgc2V0IC1vIGFsbGV4cG9ydCAgCiAgICBzb3VyY2UgPChncmVwIC12ICdeIycgLmVudiB8IHNlZCAncy9eZXhwb3J0IC8vJyApCiAgICBzZXQgK28gYWxsZXhwb3J0CmZpCgpbICEgLWQgIiR7RklMRV9QQVRIfSIgXSAmJiBta2RpciAtcCAiJHtGSUxFX1BBVEh9IgoKZGVsZXRlX29sZF9ub2RlcygpIHsKICBbWyAteiAkVVBMT0FEX1VSTCB8fCAhIC1mICIke0ZJTEVfUEFUSH0vc3ViLnR4dCIgXV0gJiYgcmV0dXJuCiAgb2xkX25vZGVzPSQoYmFzZTY0IC1kICIke0ZJTEVfUEFUSH0vc3ViLnR4dCIgfCBncmVwIC1FICcodmxlc3N8dm1lc3N8dHJvamFufGh5c3RlcmlhMnx0dWljKTovLycpCiAgW1sgLXogJG9sZF9ub2RlcyBdXSAmJiByZXR1cm4KCiAganNvbl9kYXRhPSd7Im5vZGVzIjogWycKICBmb3Igbm9kZSBpbiAkb2xkX25vZGVzOyBkbwogICAgICBqc29uX2RhdGErPSJcIiRub2RlXCIsIgogIGRvbmUKICBqc29uX2RhdGE9JHtqc29uX2RhdGElLH0gIAogIGpzb25fZGF0YSs9J119JwoKICBjdXJsIC1YIERFTEVURSAiJFVQTE9BRF9VUkwvYXBpL2RlbGV0ZS1ub2RlcyIgXAogICAgICAgIC1IICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIFwKICAgICAgICAtZCAiJGpzb25fZGF0YSIgPiAvZGV2L251bGwgMj4mMQp9CmRlbGV0ZV9vbGRfbm9kZXMKCnJtIC1yZiBib290LmxvZyBjb25maWcuanNvbiB0dW5uZWwuanNvbiB0dW5uZWwueW1sICIke0ZJTEVfUEFUSH0vc3ViLnR4dCIgPi9kZXYvbnVsbCAyPiYxCgphcmdvX2NvbmZpZ3VyZSgpIHsKICBpZiBbWyAteiAkQVJHT19BVVRIIHx8IC16ICRBUkdPX0RPTUFJTiBdXTsgdGhlbgogICAgZWNobyAtZSAiXGVbMTszMm1BUkdPX0RPTUFJTiBvciBBUkdPX0FVVEggdmFyaWFibGUgaXMgZW1wdHksIHVzZSBxdWljayB0dW5uZWxzXGVbMG0iICAgCiAgICByZXR1cm4KICBmaQoKICBpZiBbWyAkQVJHT19BVVRIID1+IFR1bm5lbFNlY3JldCBdXTsgdGhlbgogICAgZWNobyAkQVJHT19BVVRIID4gJHtGSUxFX1BBVEh9L3R1bm5lbC5qc29uCiAgICBjYXQgPiB0dW5uZWwueW1sIDw8IEVPRgp0dW5uZWw6ICQoY3V0IC1kXCIgLWYxMiA8PDwgIiRBUkdPX0FVVEgiKQpjcmVkZW50aWFscy1maWxlOiAke0ZJTEVfUEFUSH0vdHVubmVsLmpzb24KcHJvdG9jb2w6IGh0dHAyCgppbmdyZXNzOgogIC0gaG9zdG5hbWU6ICRBUkdPX0RPTUFJTgogICAgc2VydmljZTogaHR0cDovL2xvY2FsaG9zdDokQVJHT19QT1JUCiAgICBvcmlnaW5SZXF1ZXN0OgogICAgICBub1RMU1ZlcmlmeTogdHJ1ZQogIC0gc2VydmljZTogaHR0cF9zdGF0dXM6NDA0CkVPRgogIGVsc2UKICAgIGVjaG8gLWUgIlxlWzE7MzJtVXNpbmcgdG9rZW4gY29ubmVjdCB0byB0dW5uZWwscGxlYXNlIHNldCAkQVJHT19QT1JUIGluIGNsb3VkZmxhcmUgdHVubmVsXGVbMG0iCiAgZmkKfQphcmdvX2NvbmZpZ3VyZQp3YWl0Cgpkb3dubG9hZF9hbmRfcnVuKCkgewpBUkNIPSQodW5hbWUgLW0pICYmIEZJTEVfSU5GTz0oKQppZiBbICIkQVJDSCIgPT0gImFybSIgXSB8fCBbICIkQVJDSCIgPT0gImFybTY0IiBdIHx8IFsgIiRBUkNIIiA9PSAiYWFyY2g2NCIgXTsgdGhlbgogICAgQkFTRV9VUkw9Imh0dHBzOi8vYXJtNjQuc3Nzcy5ueWMubW4iCmVsaWYgWyAiJEFSQ0giID09ICJhbWQ2NCIgXSB8fCBbICIkQVJDSCIgPT0gIng4Nl82NCIgXSB8fCBbICIkQVJDSCIgPT0gIng4NiIgXTsgdGhlbgogICAgQkFTRV9VUkw9Imh0dHBzOi8vYW1kNjQuc3Nzcy5ueWMubW4iCmVsaWYgWyAiJEFSQ0giID09ICJzMzkweCIgXSB8fCBbICIkQVJDSCIgPT0gInMzOTAiIF07IHRoZW4KICAgIEJBU0VfVVJMPSJodHRwczovL3MzOTB4LnNzc3MubnljLm1uIgplbHNlCiAgICBlY2hvICJVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmU6ICRBUkNIIgogICAgZXhpdCAxCmZpCkZJTEVfSU5GTz0oIiRCQVNFX1VSTC9zYiB3ZWIiICIkQkFTRV9VUkwvYm90IGJvdCIpCgppZiBbIC1uICIkTkVaSEFfU0VSVkVSIiBdICYmIFsgLW4gIiRORVpIQV9QT1JUIiBdICYmIFsgLW4gIiRORVpIQV9LRVkiIF07IHRoZW4KICAgIEZJTEVfSU5GTys9KCIkQkFTRV9VUkwvYWdlbnQgbnBtIikKZWxpZiBbIC1uICIkTkVaSEFfU0VSVkVSIiBdICYmIFsgLW4gIiRORVpIQV9LRVkiIF07IHRoZW4KICAgIEZJTEVfSU5GTys9KCIkQkFTRV9VUkwvdjEgcGhwIikKICAgIE5FWkhBX1RMUz0kKGNhc2UgIiR7TkVaSEFfU0VSVkVSIyMqOn0iIGluIDQ0M3w4NDQzfDIwOTZ8MjA4N3wyMDgzfDIwNTMpIGVjaG8gLW4gdHJ1ZTs7ICopIGVjaG8gLW4gZmFsc2U7OyBlc2FjKQogICAgY2F0ID4gIiR7RklMRV9QQVRIfS9jb25maWcueWFtbCIgPDwgRU9GCmNsaWVudF9zZWNyZXQ6ICR7TkVaSEFfS0VZfQpkZWJ1ZzogZmFsc2UKZGlzYWJsZV9hdXRvX3VwZGF0ZTogdHJ1ZQpkaXNhYmxlX2NvbW1hbmRfZXhlY3V0ZTogZmFsc2UKZGlzYWJsZV9mb3JjZV91cGRhdGU6IHRydWUKZGlzYWJsZV9uYXQ6IGZhbHNlCmRpc2FibGVfc2VuZF9xdWVyeTogZmFsc2UKZ3B1OiBmYWxzZQppbnNlY3VyZV90bHM6IGZhbHNlCmlwX3JlcG9ydF9wZXJpb2Q6IDE4MDAKcmVwb3J0X2RlbGF5OiA0CnNlcnZlcjogJHtORVpIQV9TRVJWRVJ9CnNraXBfY29ubmVjdGlvbl9jb3VudDogZmFsc2UKc2tpcF9wcm9jc19jb3VudDogZmFsc2UKdGVtcGVyYXR1cmU6IGZhbHNlCnRsczogJHtORVpIQV9UTFN9CnVzZV9naXRlZV90b191cGdyYWRlOiBmYWxzZQp1c2VfaXB2Nl9jb3VudHJ5X2NvZGU6IGZhbHNlCnV1aWQ6ICR7VVVJRH0KRU9GCmVsc2UKICAgIGVjaG8gLWUgIlxlWzE7MzVtc2tpcHBpbmcgZG93bmxvYWQgbmV6aGFcZVswbSIKZmkKCmRlY2xhcmUgLUEgRklMRV9NQVAKZ2VuZXJhdGVfcmFuZG9tX25hbWUoKSB7CiAgICBsb2NhbCBjaGFycz1hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejEyMzQ1Njc4OTAKICAgIGxvY2FsIG5hbWU9IiIKICAgIGZvciBpIGluIHsxLi42fTsgZG8KICAgICAgICBuYW1lPSIkbmFtZSR7Y2hhcnM6UkFORE9NJSR7I2NoYXJzfToxfSIKICAgIGRvbmUKICAgIGVjaG8gIiRuYW1lIgp9CmRvd25sb2FkX2ZpbGUoKSB7CiAgICBsb2NhbCBVUkw9JDEKICAgIGxvY2FsIE5FV19GSUxFTkFNRT0kMgoKICAgIGlmIGNvbW1hbmQgLXYgY3VybCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBjdXJsIC1MIC1zUyAtbyAiJE5FV19GSUxFTkFNRSIgIiRVUkwiCiAgICAgICAgZWNobyAtZSAiXGVbMTszMm1Eb3dubG9hZGVkICRORVdfRklMRU5BTUUgYnkgY3VybFxlWzBtIgogICAgZWxpZiBjb21tYW5kIC12IHdnZXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgd2dldCAtcSAtTyAiJE5FV19GSUxFTkFNRSIgIiRVUkwiCiAgICAgICAgZWNobyAtZSAiXGVbMTszMm1Eb3dubG9hZGVkICRORVdfRklMRU5BTUUgYnkgd2dldFxlWzBtIgogICAgZWxzZQogICAgICAgIGVjaG8gLWUgIlxlWzE7MzNtTmVpdGhlciBjdXJsIG5vciB3Z2V0IGlzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWRpbmdcZVswbSIKICAgICAgICBleGl0IDEKICAgIGZpCn0KZm9yIGVudHJ5IGluICIke0ZJTEVfSU5GT1tAXX0iOyBkbwogICAgVVJMPSQoZWNobyAiJGVudHJ5IiB8IGN1dCAtZCAnICcgLWYgMSkKICAgIFJBTkRPTV9OQU1FPSQoZ2VuZXJhdGVfcmFuZG9tX25hbWUpCiAgICBORVdfRklMRU5BTUU9IiR7RklMRV9QQVRIfS8kUkFORE9NX05BTUUiCiAgICAKICAgIGRvd25sb2FkX2ZpbGUgIiRVUkwiICIkTkVXX0ZJTEVOQU1FIgogICAgCiAgICBjaG1vZCAreCAiJE5FV19GSUxFTkFNRSIKICAgIEZJTEVfTUFQWyQoZWNobyAiJGVudHJ5IiB8IGN1dCAtZCAnICcgLWYgMildPSIkTkVXX0ZJTEVOQU1FIgpkb25lCndhaXQKCm91dHB1dD0kKCIke0ZJTEVfUEFUSH0vJChiYXNlbmFtZSAke0ZJTEVfTUFQW3dlYl19KSIgZ2VuZXJhdGUgcmVhbGl0eS1rZXlwYWlyKQpwcml2YXRlX2tleT0kKGVjaG8gIiR7b3V0cHV0fSIgfCBhd2sgJy9Qcml2YXRlS2V5Oi8ge3ByaW50ICQyfScpCnB1YmxpY19rZXk9JChlY2hvICIke291dHB1dH0iIHwgYXdrICcvUHVibGljS2V5Oi8ge3ByaW50ICQyfScpCgpvcGVuc3NsIGVjcGFyYW0gLWdlbmtleSAtbmFtZSBwcmltZTI1NnYxIC1vdXQgIiR7RklMRV9QQVRIfS9wcml2YXRlLmtleSIKb3BlbnNzbCByZXEgLW5ldyAteDUwOSAtZGF5cyAzNjUwIC1rZXkgIiR7RklMRV9QQVRIfS9wcml2YXRlLmtleSIgLW91dCAiJHtGSUxFX1BBVEh9L2NlcnQucGVtIiAtc3ViaiAiL0NOPWJpbmcuY29tIgoKICBjYXQgPiAke0ZJTEVfUEFUSH0vY29uZmlnLmpzb24gPDwgRU9GCnsKICAgICJsb2ciOiB7CiAgICAgICJkaXNhYmxlZCI6IHRydWUsCiAgICAgICJsZXZlbCI6ICJlcnJvciIsCiAgICAgICJ0aW1lc3RhbXAiOiB0cnVlCiAgICB9LAogICAgImluYm91bmRzIjogWwogICAgewogICAgICAidGFnIjogInZtZXNzLXdzLWluIiwKICAgICAgInR5cGUiOiAidm1lc3MiLAogICAgICAibGlzdGVuIjogIjo6IiwKICAgICAgImxpc3Rlbl9wb3J0IjogJHtBUkdPX1BPUlR9LAogICAgICAgICJ1c2VycyI6IFsKICAgICAgICB7CiAgICAgICAgICAidXVpZCI6ICIke1VVSUR9IgogICAgICAgIH0KICAgICAgXSwKICAgICAgInRyYW5zcG9ydCI6IHsKICAgICAgICAidHlwZSI6ICJ3cyIsCiAgICAgICAgInBhdGgiOiAiL3ZtZXNzLWFyZ28iLAogICAgICAgICJlYXJseV9kYXRhX2hlYWRlcl9uYW1lIjogIlNlYy1XZWJTb2NrZXQtUHJvdG9jb2wiCiAgICAgIH0KICAgIH0kKGlmIFsgIiRUVUlDX1BPUlQiICE9ICIiIF07IHRoZW4gZWNobyAnLAogICAgewogICAgICAidGFnIjogInR1aWMtaW4iLAogICAgICAidHlwZSI6ICJ0dWljIiwKICAgICAgImxpc3RlbiI6ICI6OiIsCiAgICAgICJsaXN0ZW5fcG9ydCI6ICcke1RVSUNfUE9SVH0nLAogICAgICAidXNlcnMiOiBbCiAgICAgICAgewogICAgICAgICAgInV1aWQiOiAiJyR7VVVJRH0nIiwKICAgICAgICAgICJwYXNzd29yZCI6ICJhZG1pbiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJjb25nZXN0aW9uX2NvbnRyb2wiOiAiYmJyIiwKICAgICAgInRscyI6IHsKICAgICAgICAiZW5hYmxlZCI6IHRydWUsCiAgICAgICAgImFscG4iOiBbCiAgICAgICAgICAiaDMiCiAgICAgICAgXSwKICAgICAgICAiY2VydGlmaWNhdGVfcGF0aCI6ICInJHtGSUxFX1BBVEh9Jy9jZXJ0LnBlbSIsCiAgICAgICAgImtleV9wYXRoIjogIicke0ZJTEVfUEFUSH0nL3ByaXZhdGUua2V5IgogICAgICB9CiAgICB9JzsgZmkpJChpZiBbICIkSFkyX1BPUlQiICE9ICIiIF07IHRoZW4gZWNobyAnLAogICAgewogICAgICAidGFnIjogImh5c3RlcmlhMi1pbiIsCiAgICAgICJ0eXBlIjogImh5c3RlcmlhMiIsCiAgICAgICJsaXN0ZW4iOiAiOjoiLAogICAgICAibGlzdGVuX3BvcnQiOiAnJHtIWTJfUE9SVH0nLAogICAgICAgICJ1c2VycyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgICJwYXNzd29yZCI6ICInJHtVVUlEfSciCiAgICAgICAgICB9CiAgICAgIF0sCiAgICAgICJtYXNxdWVyYWRlIjogImh0dHBzOi8vYmluZy5jb20iLAogICAgICAgICJ0bHMiOiB7CiAgICAgICAgICAgICJlbmFibGVkIjogdHJ1ZSwKICAgICAgICAgICAgImFscG4iOiBbCiAgICAgICAgICAgICAgICAiaDMiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJjZXJ0aWZpY2F0ZV9wYXRoIjogIicke0ZJTEVfUEFUSH0nL2NlcnQucGVtIiwKICAgICAgICAgICAgImtleV9wYXRoIjogIicke0ZJTEVfUEFUSH0nL3ByaXZhdGUua2V5IgogICAgICAgICAgfQogICAgICB9JzsgZmkpJChpZiBbICIkUkVBTElUWV9QT1JUIiAhPSAiIiBdOyB0aGVuIGVjaG8gJywKICAgICAgewogICAgICAgICJ0YWciOiAidmxlc3MtcmVhbGl0eS12ZXNpb24iLAogICAgICAgICJ0eXBlIjogInZsZXNzIiwKICAgICAgICAibGlzdGVuIjogIjo6IiwKICAgICAgICAibGlzdGVuX3BvcnQiOiAnJHtSRUFMSVRZX1BPUlR9JywKICAgICAgICAgICJ1c2VycyI6IFsKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXVpZCI6ICInJFVVSUQnIiwKICAgICAgICAgICAgICAgICJmbG93IjogInh0bHMtcnByeC12aXNpb24iCiAgICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJ0bHMiOiB7CiAgICAgICAgICAgICAgImVuYWJsZWQiOiB0cnVlLAogICAgICAgICAgICAgICJzZXJ2ZXJfbmFtZSI6ICJ3d3cubmF6aHVtaS5jb20iLAogICAgICAgICAgICAgICJyZWFsaXR5IjogewogICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICJoYW5kc2hha2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIjogInd3dy5uYXpodW1pLmNvbSIsCiAgICAgICAgICAgICAgICAgICAgICAic2VydmVyX3BvcnQiOiA0NDMKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgInByaXZhdGVfa2V5IjogIickcHJpdmF0ZV9rZXknIiwKICAgICAgICAgICAgICAgICAgInNob3J0X2lkIjogWwogICAgICAgICAgICAgICAgICAgICIiCiAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0nOyBmaSkKICAgXSwKICAib3V0Ym91bmRzIjogWwogICAgewogICAgICAidHlwZSI6ICJkaXJlY3QiLAogICAgICAidGFnIjogImRpcmVjdCIKICAgIH0sCiAgICB7CiAgICAgICJ0eXBlIjogImJsb2NrIiwKICAgICAgInRhZyI6ICJibG9jayIKICAgIH0sCiAgICB7CiAgICAgICJ0eXBlIjogIndpcmVndWFyZCIsCiAgICAgICJ0YWciOiAid2lyZWd1YXJkLW91dCIsCiAgICAgICJzZXJ2ZXIiOiAiZW5nYWdlLmNsb3VkZmxhcmVjbGllbnQuY29tIiwKICAgICAgInNlcnZlcl9wb3J0IjogMjQwOCwKICAgICAgImxvY2FsX2FkZHJlc3MiOiBbCiAgICAgICAgIjE3Mi4xNi4wLjIvMzIiLAogICAgICAgICIyNjA2OjQ3MDA6MTEwOjg1MWY6NGRhMzo0ZTJjOmNkYmY6MmVjZi8xMjgiCiAgICAgIF0sCiAgICAgICJwcml2YXRlX2tleSI6ICJlQXg4bzZNSnJINEtFN2l2UEZGQ2E0cXZZdzVuSnNZSENCUVhQQXBRWDFBPSIsCiAgICAgICJwZWVyX3B1YmxpY19rZXkiOiAiYm1YT0MrRjFGeEVNRjlkeWlLMkg1LzFTVXR6SDBKdVZvNTFoMndQZmd5bz0iLAogICAgICAicmVzZXJ2ZWQiOiBbODIsIDkwLCA1MV0sCiAgICAgICJtdHUiOiAxNDIwCiAgICB9CiAgXSwKICAicm91dGUiOiB7CiAgICAicnVsZV9zZXQiOiBbCiAgICAgIHsKICAgICAgICAidGFnIjogIm5ldGZsaXgiLAogICAgICAgICJ0eXBlIjogInJlbW90ZSIsCiAgICAgICAgImZvcm1hdCI6ICJiaW5hcnkiLAogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL01ldGFDdWJlWC9tZXRhLXJ1bGVzLWRhdC9zaW5nL2dlby9nZW9zaXRlL25ldGZsaXguc3JzIiwKICAgICAgICAiZG93bmxvYWRfZGV0b3VyIjogImRpcmVjdCIKICAgICAgfSwKICAgICAgewogICAgICAgICJ0YWciOiAib3BlbmFpIiwKICAgICAgICAidHlwZSI6ICJyZW1vdGUiLAogICAgICAgICJmb3JtYXQiOiAiYmluYXJ5IiwKICAgICAgICAidXJsIjogImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9NZXRhQ3ViZVgvbWV0YS1ydWxlcy1kYXQvc2luZy9nZW8vZ2Vvc2l0ZS9vcGVuYWkuc3JzIiwKICAgICAgICAiZG93bmxvYWRfZGV0b3VyIjogImRpcmVjdCIKICAgICAgfQogICAgXSwKICAgICJydWxlcyI6IFsKICAgICAgewogICAgICAgICJydWxlX3NldCI6IFsibmV0ZmxpeCIsICJvcGVuYWkiXSwKICAgICAgICAib3V0Ym91bmQiOiAid2lyZWd1YXJkLW91dCIKICAgICAgfQogICAgXSwKICAgICJmaW5hbCI6ICJkaXJlY3QiCiAgfQp9CkVPRgoKaWYgWyAtZSAiJHtGSUxFX1BBVEh9LyQoYmFzZW5hbWUgJHtGSUxFX01BUFt3ZWJdfSkiIF07IHRoZW4KICAgIG5vaHVwICIke0ZJTEVfUEFUSH0vJChiYXNlbmFtZSAke0ZJTEVfTUFQW3dlYl19KSIgcnVuIC1jICR7RklMRV9QQVRIfS9jb25maWcuanNvbiA+L2Rldi9udWxsIDI+JjEgJgogICAgc2xlZXAgMgogICAgZWNobyAtZSAiXGVbMTszMm0kKGJhc2VuYW1lICR7RklMRV9NQVBbd2ViXX0pIGlzIHJ1bm5pbmdcZVswbSIKZmkKCmlmIFsgLWUgIiR7RklMRV9QQVRIfS8kKGJhc2VuYW1lICR7RklMRV9NQVBbYm90XX0pIiBdOyB0aGVuCiAgICBpZiBbWyAkQVJHT19BVVRIID1+IF5bQS1aMC05YS16PV17MTIwLDI1MH0kIF1dOyB0aGVuCiAgICAgIGFyZ3M9InR1bm5lbCAtLWVkZ2UtaXAtdmVyc2lvbiBhdXRvIC0tbm8tYXV0b3VwZGF0ZSAtLXByb3RvY29sIGh0dHAyIHJ1biAtLXRva2VuICR7QVJHT19BVVRIfSIKICAgIGVsaWYgW1sgJEFSR09fQVVUSCA9fiBUdW5uZWxTZWNyZXQgXV07IHRoZW4KICAgICAgYXJncz0idHVubmVsIC0tZWRnZS1pcC12ZXJzaW9uIGF1dG8gLS1jb25maWcgJHtGSUxFX1BBVEh9L3R1bm5lbC55bWwgcnVuIgogICAgZWxzZQogICAgICBhcmdzPSJ0dW5uZWwgLS1lZGdlLWlwLXZlcnNpb24gYXV0byAtLW5vLWF1dG91cGRhdGUgLS1wcm90b2NvbCBodHRwMiAtLWxvZ2ZpbGUgJHtGSUxFX1BBVEh9L2Jvb3QubG9nIC0tbG9nbGV2ZWwgaW5mbyAtLXVybCBodHRwOi8vbG9jYWxob3N0OiRBUkdPX1BPUlQiCiAgICBmaQogICAgbm9odXAgIiR7RklMRV9QQVRIfS8kKGJhc2VuYW1lICR7RklMRV9NQVBbYm90XX0pIiAkYXJncyA+L2Rldi9udWxsIDI+JjEgJgogICAgc2xlZXAgMgogICAgZWNobyAtZSAiXGVbMTszMm0kKGJhc2VuYW1lICR7RklMRV9NQVBbYm90XX0pIGlzIHJ1bm5pbmdcZVswbSIgCmZpCgppZiBbIC1uICIkTkVaSEFfU0VSVkVSIiBdICYmIFsgLW4gIiRORVpIQV9QT1JUIiBdICYmIFsgLW4gIiRORVpIQV9LRVkiIF07IHRoZW4KICAgIGlmIFsgLWUgIiR7RklMRV9QQVRIfS8kKGJhc2VuYW1lICR7RklMRV9NQVBbbnBtXX0pIiBdOyB0aGVuCiAgICAgIHRsc1BvcnRzPSgiNDQzIiAiODQ0MyIgIjIwOTYiICIyMDg3IiAiMjA4MyIgIjIwNTMiKQogICAgICBbWyAiJHt0bHNQb3J0c1sqXX0iID1+ICIke05FWkhBX1BPUlR9IiBdXSAmJiBORVpIQV9UTFM9Ii0tdGxzIiB8fCBORVpIQV9UTFM9IiIKICAgICAgZXhwb3J0IFRNUERJUj0kKHB3ZCkKICAgICAgbm9odXAgIiR7RklMRV9QQVRIfS8kKGJhc2VuYW1lICR7RklMRV9NQVBbbnBtXX0pIiAtcyAke05FWkhBX1NFUlZFUn06JHtORVpIQV9QT1JUfSAtcCAke05FWkhBX0tFWX0gJHtORVpIQV9UTFN9ID4vZGV2L251bGwgMj4mMSAmCiAgICAgIHNsZWVwIDIKICAgICAgZWNobyAtZSAiXGVbMTszMm0kKGJhc2VuYW1lICR7RklMRV9NQVBbbnBtXX0pIGlzIHJ1bm5pbmdcZVswbSIKICAgIGZpCmVsaWYgWyAtbiAiJE5FWkhBX1NFUlZFUiIgXSAmJiBbIC1uICIkTkVaSEFfS0VZIiBdOyB0aGVuCiAgICBpZiBbIC1lICIke0ZJTEVfUEFUSH0vJChiYXNlbmFtZSAke0ZJTEVfTUFQW3BocF19KSIgXTsgdGhlbgogICAgICBub2h1cCAiJHtGSUxFX1BBVEh9LyQoYmFzZW5hbWUgJHtGSUxFX01BUFtwaHBdfSkiIC1jICIke0ZJTEVfUEFUSH0vY29uZmlnLnlhbWwiID4vZGV2L251bGwgMj4mMSAmCiAgICAgIGVjaG8gLWUgIlxlWzE7MzJtJHtGSUxFX1BBVEh9LyQoYmFzZW5hbWUgJHtGSUxFX01BUFtwaHBdfSkgaXMgcnVubmluZ1xlWzBtIgogICAgZmkKZWxzZQogICAgZWNobyAtZSAiXGVbMTszNW1ORVpIQSB2YXJpYWJsZSBpcyBlbXB0eSwgc2tpcHBpbmcgcnVubmluZ1xlWzBtIgpmaQoKZm9yIGtleSBpbiAiJHshRklMRV9NQVBbQF19IjsgZG8KICAgIGlmIFsgLWUgIiR7RklMRV9QQVRIfS8kKGJhc2VuYW1lICR7RklMRV9NQVBbJGtleV19KSIgXTsgdGhlbgogICAgICAgIHJtIC1yZiAiJHtGSUxFX1BBVEh9LyQoYmFzZW5hbWUgJHtGSUxFX01BUFska2V5XX0pIiA+L2Rldi9udWxsIDI+JjEKICAgIGZpCmRvbmUKfQpkb3dubG9hZF9hbmRfcnVuCgpnZXRfYXJnb2RvbWFpbigpIHsKICBpZiBbWyAtbiAkQVJHT19BVVRIIF1dOyB0aGVuCiAgICBlY2hvICIkQVJHT19ET01BSU4iCiAgZWxzZQogICAgbG9jYWwgcmV0cnk9MAogICAgbG9jYWwgbWF4X3JldHJpZXM9OAogICAgbG9jYWwgYXJnb2RvbWFpbj0iIgogICAgd2hpbGUgW1sgJHJldHJ5IC1sdCAkbWF4X3JldHJpZXMgXV07IGRvCiAgICAgICgocmV0cnkrKykpCiAgICAgIGFyZ29kb21haW49JChzZWQgLW4gJ3N8LipodHRwczovL1woW14vXSp0cnljbG91ZGZsYXJlXC5jb21cKS4qfFwxfHAnICR7RklMRV9QQVRIfS9ib290LmxvZykKICAgICAgaWYgW1sgLW4gJGFyZ29kb21haW4gXV07IHRoZW4KICAgICAgICBicmVhawogICAgICBmaQogICAgICBzbGVlcCAxCiAgICBkb25lCiAgICBlY2hvICIkYXJnb2RvbWFpbiIKICBmaQp9CgpzZW5kX3RlbGVncmFtKCkgewogIFsgLWYgIiR7RklMRV9QQVRIfS9zdWIudHh0IiBdIHx8IHJldHVybgogIE1FU1NBR0U9JChjYXQgIiR7RklMRV9QQVRIfS9zdWIudHh0IikKICBMT0NBTF9NRVNTQUdFPSIqJHtOQU1FfeiKgueCueaOqOmAgemAmuefpSpcYFxgXGAke01FU1NBR0V9XGBcYFxgIgogIEJPVF9NRVNTQUdFPSI8Yj4ke05BTUV96IqC54K55o6o6YCB6YCa55+lPC9iPlxuPHByZT4ke01FU1NBR0V9PC9wcmU+IgogIGlmIFsgLW4gIiR7Qk9UX1RPS0VOfSIgXSAmJiBbIC1uICIke0NIQVRfSUR9IiBdOyB0aGVuCiAgICBjdXJsIC1zIC1YIFBPU1QgImh0dHBzOi8vYXBpLnRlbGVncmFtLm9yZy9ib3Qke0JPVF9UT0tFTn0vc2VuZE1lc3NhZ2UiIFwKICAgICAgLWQgImNoYXRfaWQ9JHtDSEFUX0lEfSZ0ZXh0PSR7TE9DQUxfTUVTU0FHRX0mcGFyc2VfbW9kZT1NYXJrZG93biIgPiAvZGV2L251bGwKCiAgZWxpZiBbIC1uICIke0NIQVRfSUR9IiBdOyB0aGVuCiAgICBjdXJsIC1zIC1YIFBPU1QgImh0dHA6Ly9hcGkudGcuZ3ZyYW5kZXIuZXUub3JnL2FwaS9ub3RpZnkiIFwKICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciBlSldSZ3hDNExjem5LTGlVaURvVXN3QG5NZ0RCQ0NTVWs2SXcwUzlQYnMiIFwKICAgICAgLUggIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgXAogICAgICAtZCAiJChwcmludGYgJ3siY2hhdF9pZCI6ICIlcyIsICJtZXNzYWdlIjogIiVzIn0nICIke0NIQVRfSUR9IiAiJHtCT1RfTUVTU0FHRX0iKSIgPiAvZGV2L251bGwKICBlbHNlCiAgICBlY2hvIC1lICJcblxlWzE7MzVtVEcgdmFyaWFibGUgaXMgZW1wdHksc2tpcHBpbmcgc2VudFxlWzBtIgogICAgcmV0dXJuCiAgZmkKCiAgaWYgWyAkPyAtZXEgMCBdOyB0aGVuCiAgICBlY2hvIC1lICJcblxlWzE7MzJtTm9kZXMgc2VudCB0byBURyBzdWNjZXNzZnVsbHlcZVswbSIKICBlbHNlCiAgICBlY2hvIC1lICJcblxlWzE7MzFtRmFpbGVkIHRvIHNlbmQgbm9kZXMgdG8gVEdcZVswbSIKICBmaQp9Cgp1cGxvZF9ub2RlcygpIHsKICAgIFtbIC16ICRVUExPQURfVVJMIHx8ICEgLWYgIiR7RklMRV9QQVRIfS9saXN0LnR4dCIgXV0gJiYgcmV0dXJuCiAgICBjb250ZW50PSQoY2F0ICR7RklMRV9QQVRIfS9saXN0LnR4dCkKICAgIG5vZGVzPSQoZWNobyAiJGNvbnRlbnQiIHwgZ3JlcCAtRSAnKHZsZXNzfHZtZXNzfHRyb2phbnxoeXN0ZXJpYTJ8dHVpYyk6Ly8nKQogICAgW1sgLXogJG5vZGVzIF1dICYmIHJldHVybgogICAgbm9kZXM9KCRub2RlcykKICAgIGpzb25fZGF0YT0neyJub2RlcyI6IFsnCiAgICBmb3Igbm9kZSBpbiAiJHtub2Rlc1tAXX0iOyBkbwogICAgICAgIGpzb25fZGF0YSs9IlwiJG5vZGVcIiwiCiAgICBkb25lCiAgICBqc29uX2RhdGE9JHtqc29uX2RhdGElLH0KICAgIGpzb25fZGF0YSs9J119JwoKICAgIGN1cmwgLVggUE9TVCAiJFVQTE9BRF9VUkwvYXBpL2FkZC1ub2RlcyIgXAogICAgICAgICAtSCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiBcCiAgICAgICAgIC1kICIkanNvbl9kYXRhIiA+IC9kZXYvbnVsbCAyPiYxCgogICAgaWYgW1sgJD8gLWVxIDAgXV07IHRoZW4KICAgICAgICBlY2hvIC1lICJcMDMzWzE7MzJtTm9kZXMgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5XDAzM1swbSIKICAgIGVsc2UKICAgICAgICBlY2hvIC1lICJcMDMzWzE7MzFtRmFpbGVkIHRvIHVwbG9hZCBub2Rlc1wwMzNbMG0iCiAgICBmaQp9CgphcmdvZG9tYWluPSQoZ2V0X2FyZ29kb21haW4pCmVjaG8gLWUgIlxlWzE7MzJtQXJnb0RvbWFpbjpcZVsxOzM1bSR7YXJnb2RvbWFpbn1cZVswbVxuIgpzbGVlcCAxCklQPSQoY3VybCAtcyAtLW1heC10aW1lIDIgaXB2NC5pcC5zYiB8fCBjdXJsIC1zIC0tbWF4LXRpbWUgMSBhcGkuaXBpZnkub3JnIHx8IHsgaXB2Nj0kKGN1cmwgLXMgLS1tYXgtdGltZSAxIGlwdjYuaXAuc2IpOyBlY2hvICJbJGlwdjZdIjsgfSB8fCBlY2hvICJYWFgiKQpJU1A9JChjdXJsIC1zIC0tbWF4LXRpbWUgMiBodHRwczovL3NwZWVkLmNsb3VkZmxhcmUuY29tL21ldGEgfCBhd2sgLUZcIiAne3ByaW50ICQyNiItIiQxOH0nIHwgc2VkIC1lICdzLyAvXy9nJyB8fCBlY2hvICIwLjAiKQpjb3N0b21fbmFtZSgpIHsgaWYgWyAtbiAiJE5BTUUiIF07IHRoZW4gZWNobyAiJHtOQU1FfV8ke0lTUH0iOyBlbHNlIGVjaG8gIiR7SVNQfSI7IGZpOyB9CgpWTUVTUz0ieyBcInZcIjogXCIyXCIsIFwicHNcIjogXCIkKGNvc3RvbV9uYW1lKVwiLCBcImFkZFwiOiBcIiR7Q0ZJUH1cIiwgXCJwb3J0XCI6IFwiJHtDRlBPUlR9XCIsIFwiaWRcIjogXCIke1VVSUR9XCIsIFwiYWlkXCI6IFwiMFwiLCBcInNjeVwiOiBcIm5vbmVcIiwgXCJuZXRcIjogXCJ3c1wiLCBcInR5cGVcIjogXCJub25lXCIsIFwiaG9zdFwiOiBcIiR7YXJnb2RvbWFpbn1cIiwgXCJwYXRoXCI6IFwiL3ZtZXNzLWFyZ28/ZWQ9MjU2MFwiLCBcInRsc1wiOiBcInRsc1wiLCBcInNuaVwiOiBcIiR7YXJnb2RvbWFpbn1cIiwgXCJhbHBuXCI6IFwiXCIsIFwiZnBcIjogXCJjaHJvbWVcIn0iCgpjYXQgPiAke0ZJTEVfUEFUSH0vbGlzdC50eHQgPDxFT0YKdm1lc3M6Ly8kKGVjaG8gIiRWTUVTUyIgfCBiYXNlNjQgfCB0ciAtZCAnXG4nKQpFT0YKCmlmIFsgIiRUVUlDX1BPUlQiICE9ICIiIF07IHRoZW4KICBlY2hvIC1lICJcbnR1aWM6Ly8ke1VVSUR9OmFkbWluQCR7SVB9OiR7VFVJQ19QT1JUfT9zbmk9d3d3LmJpbmcuY29tJmFscG49aDMmY29uZ2VzdGlvbl9jb250cm9sPWJiciMkKGNvc3RvbV9uYW1lKSIgPj4gJHtGSUxFX1BBVEh9L2xpc3QudHh0CmZpCgppZiBbICIkSFkyX1BPUlQiICE9ICIiIF07IHRoZW4KICBlY2hvIC1lICJcbmh5c3RlcmlhMjovLyR7VVVJRH1AJHtJUH06JHtIWTJfUE9SVH0vP3NuaT13d3cuYmluZy5jb20mYWxwbj1oMyZpbnNlY3VyZT0xIyQoY29zdG9tX25hbWUpIiA+PiAke0ZJTEVfUEFUSH0vbGlzdC50eHQKZmkKCmlmIFsgIiRSRUFMSVRZX1BPUlQiICE9ICIiIF07IHRoZW4KICBlY2hvIC1lICJcbnZsZXNzOi8vJHtVVUlEfUAke0lQfToke1JFQUxJVFlfUE9SVH0/ZW5jcnlwdGlvbj1ub25lJmZsb3c9eHRscy1ycHJ4LXZpc2lvbiZzZWN1cml0eT1yZWFsaXR5JnNuaT13d3cubmF6aHVtaS5jb20mZnA9Y2hyb21lJnBiaz0ke3B1YmxpY19rZXl9JnR5cGU9dGNwJmhlYWRlclR5cGU9bm9uZSMkKGNvc3RvbV9uYW1lKSIgPj4gJHtGSUxFX1BBVEh9L2xpc3QudHh0CmZpCgpiYXNlNjQgJHtGSUxFX1BBVEh9L2xpc3QudHh0IHwgdHIgLWQgJ1xuJyA+ICR7RklMRV9QQVRIfS9zdWIudHh0CmNhdCAke0ZJTEVfUEFUSH0vbGlzdC50eHQKZWNobyAtZSAiXG5cblxlWzE7MzJtJHtGSUxFX1BBVEh9L3N1Yi50eHQgc2F2ZWQgc3VjY2Vzc2Z1bGx5XGVbMG0iCnVwbG9kX25vZGVzCnNlbmRfdGVsZWdyYW0KZWNobyAtZSAiXG5cZVsxOzMybVJ1bm5pbmcgZG9uZSFcZVswbVxuIgpzbGVlcCAxIAoKcm0gLXJmICR7RklMRV9QQVRIfS9ib290LmxvZyAke0ZJTEVfUEFUSH0vY29uZmlnLmpzb24gJHtGSUxFX1BBVEh9L3NiLmxvZyAke0ZJTEVfUEFUSH0vY29yZSAke0ZJTEVfUEFUSH0vZmFrZV91c2VyYWdlbnRfMC4yLjAuanNvbiAke0ZJTEVfUEFUSH0vbGlzdC50eHQgJHtGSUxFX1BBVEh9L3R1bm5lbC5qc29uICR7RklMRV9QQVRIfS90dW5uZWwueW1sID4vZGV2L251bGwgMj4mMQplY2hvIC1lICJcZVsxOzM1bUdpdGh1Yu+8mmh0dHBzOi8vZ2l0aHViLmNvbS9lb29jZS9zaW5nLWJveFxlWzBtIgplY2hvIC1lICJcZVsxOzMybVlvdXR1YmXpopHpgZPvvJpcZVsxOzM1bWh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL0Blb29jZVxlWzBtIgplY2hvIC1lICJcZVsxOzMybVRlbGVncmFt576k57uE77yaXGVbMTszNW1odHRwczovL3QubWUvZW9vY2V1XGVbMG1cbiIKZWNobyAtZSAiXG5cZVsxOzMybWxvZ3Mgd2lsbCBiZSBkZWxldGVkIGluIDE1IHNlY29uZHMhXGVbMG1cbiIKc2xlZXAgMTUKY2xlYXI=" | base64 -d | bash