Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@道长仓库Pro@eyJsYXN0X2NoYXB0ZXJfcnVsZSI6IiIsInRpdGxlIjoi6YGT6ZW/5LuT5bqTUHJvIiwiYXV0aG9yIjoiQExveURnSWsiLCJ1cmwiOiJoaWtlcjovL2VtcHR5IiwidmVyc2lvbiI6MTM5LCJjb2xfdHlwZSI6Imljb25fMl9yb3VuZCIsImNsYXNzX25hbWUiOiIiLCJ0eXBlIjoidG9vbCIsImNsYXNzX3VybCI6IiIsImFyZWFfbmFtZSI6IiIsImFyZWFfdXJsIjoiIiwic29ydF9uYW1lIjoiIiwieWVhcl9uYW1lIjoiIiwic29ydF91cmwiOiIiLCJ5ZWFyX3VybCI6IiIsImZpbmRfcnVsZSI6ImpzOlxuICAgIGNvbnN0IHtcbiAgICAgICAgZ2V0QXBpLFxuICAgICAgICBjb2xvcixcbiAgICAgICAgc21hbGwsXG4gICAgICAgIGdldEZpbGUsXG4gICAgICAgIGh0bWxUYWcsXG4gICAgICAgIGFwaSxcbiAgICAgICAgbWRcbiAgICB9ID0gJC5yZXF1aXJlKFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVwiKTtcblxuY29uc3QgbHNnPSQucmVxdWlyZShcImhpa2VyOi8vcGFnZS9sb2NhbFN0b3JhZ2U/cnVsZT3pgZPplb/ku5PlupNQcm9cIik7XG5sZXQgY2xhc3NBID0gZ2V0VmFyKFwiV2FyZWhvdXNlLmNsYXNzXCIsIFwiMFwiKTtcbmxldCBsaXN0VXJsID0gZ2V0QXBpKFwidXNlcnNVcmxcIikgKyBjbGFzc0EsXG4gICAgbXlVcmwgPSBnZXRBcGkoXCJkZXZTZWxmXCIpO1xuICAgIC8vIG15VXJsID0gZ2V0QXBpKFwicnVsZXNBbGxVcmxcIik7XG5wdXRWYXIoXCJXYXJlaG91c2UuZmlsdGVyXCIsIFwiXCIpO1xudmFyIG5vV2FpdD10cnVlOy8v5peg6ZyA6YeN6K+VXG52YXIgdGltZW91dD01MDA7XG52YXIgdG1wX2hlYWRlcnM9e1xuICAgIHRpbWVvdXQ6dGltZW91dFxufTtcbnRyeXtcbnZhciB1c2VyTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChsaXN0VXJsLHRtcF9oZWFkZXJzKSkucmVzdWx0LFxuICAgIG5vd0NvbiA9IDAsXG4gICAgcnVsZUNvdW50ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcInJ1bGVDb3VudFVybFwiKSx0bXBfaGVhZGVycykpLnJlc3VsdDtcbn1jYXRjaChlKXtcbiAgICBub1dhaXQ9ZmFsc2U7XG4gICAgc2V0UmVzdWx0KFt7XG4gICAgICAgIHRpdGxlOifku5PlupPlkIzml7borr/pl67ph4/ov4flpKfmiJbnvZHnu5zlt67vvIznuYHlv5nkuK0uLi5cXG7or7fogJDlv4PnrYnlvoXnqI3lkI7lho3or5UnLFxuICAgICAgICBkZXNjOifngrnlh7vlsJ3or5Xph43mlrDorr/pl64nLFxuICAgICAgICBjb2xfdHlwZTondGV4dF8xJyxcbiAgICAgICAgdXJsOiQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKCk9PntcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lt7LliLfmlrAnXG4gICAgICAgIH0pXG4gICAgfV0pO1xufVxuaWYobm9XYWl0KXtcbmxldCBkYXRhID0gW107XG5sZXQgY2xhc3NUYWIgPSBbXG4gICAgW1wi5LiK5qyh5rS76LeDXCIsIFwiMFwiXSxcbiAgICBbXCLop4TliJnmlbBcIiwgXCIxXCJdLFxuICAgIFtcIuazqOWGjOaXtumXtFwiLCBcIi0xXCJdXG5dXG5mb3IgKGxldCBpdGVtIG9mIGNsYXNzVGFiKSB7XG4gICAgZGF0YS5wdXNoKHtcbiAgICAgICAgdGl0bGU6IGl0ZW1bMV0gPT09IGNsYXNzQSA/IFwi4oCc4oCcXCIgKyBpdGVtWzBdICsgXCLigJ3igJ1cIiA6IGl0ZW1bMF0sXG4gICAgICAgIHVybDogJChcIiNub0xvYWRpbmcjXCIpLmxhenlSdWxlKChrZXkpID0+IHtcbiAgICAgICAgICAgIHB1dFZhcihcIldhcmVob3VzZS5jbGFzc1wiLCBrZXkpO1xuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIFwiaGlrZXI6Ly9lbXB0eVwiO1xuICAgICAgICB9LCBpdGVtWzFdKSxcbiAgICAgICAgY29sX3R5cGU6IFwic2Nyb2xsX2J1dHRvblwiXG4gICAgfSk7XG59XG5kYXRhLnB1c2goe1xuICAgIHRpdGxlOiBcIuWFqOmDqOinhOWImVwiLFxuICAgIHVybDogXCJoaWtlcjovL3BhZ2UvQWxsUHVibGljUnVsZT91cmw9aGlrZXI6Ly9lbXB0eSNmeXBhZ2Ujbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXCIsXG4gICAgY29sX3R5cGU6IFwic2Nyb2xsX2J1dHRvblwiXG59KTtcbmRhdGEucHVzaCh7XG4gICAgdGl0bGU6IFwi5Yi35paw5L6d6LWWXCIsXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChqc29uVXJsKT0+e1xuICAgICAgICBqc29uVXJsID0ganNvblVybCsnMjUwNSc7XG4gICAgICAgIC8vIGxvZyhqc29uVXJsKTtcbiAgICAgICAgbGV0IHRleHQgPSByZXF1ZXN0KGpzb25VcmwpO1xuICAgICAgICBpZighL3ZlcnNpb24vLnRlc3QodGV4dCkpe1xuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+acjeWKoeWZqOato+W/mSzor7fnqI3lgJnlho3or5UuLi4nXG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlQ2FjaGUoanNvblVybCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXF1aXJlKGpzb25VcmwpO1xuICAgICAgICAgICAgY29uZmlybSh7dGl0bGU6J+WIt+aWsOaIkOWKn+aPkOekuicsY29udGVudDpcInRvYXN0Oi8v5bey5Yi35pawLOW9k+WJjeeJiOacrOS/oeaBrzpcXG5cIitKU09OLnN0cmluZ2lmeSh2ZXJzaW9uKX0pXG4gICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXG4gICAgICAgIH1jYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+ezn+ezle+8jOacrOWcsOe8k+WtmOaPkuS7tuiiq+a4hemZpOS6hu+8jOS9huaYr+acjeWKoeWZqOmAmuiur+Wksei0pSEnXG4gICAgICAgIH1cbiAgICB9LGdldEFwaShcImltcG9ydFVybFwiKSksXG4gICAgY29sX3R5cGU6IFwic2Nyb2xsX2J1dHRvblwiXG59KTtcbmRhdGEucHVzaCh7XG4gICAgdGl0bGU6XCLpgJrlhY06XCIrY29sb3IobHNnLmdldEl0ZW0oXCLpgJrlhY1cIixcIlg1XCIpLFwiI2ZmNzAwMFwiKSxcbiAgICBjb2xfdHlwZTpcInNjcm9sbF9idXR0b25cIixcbiAgICB1cmw6JCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKT0+e1xuICAgICAgICBjb25zdCBsc2c9JC5yZXF1aXJlKFwiaGlrZXI6Ly9wYWdlL2xvY2FsU3RvcmFnZT9ydWxlPemBk+mVv+S7k+W6k1Byb1wiKTtcbiAgICAgICAgaWYobHNnLmdldEl0ZW0oXCLpgJrlhY1cIixcIlg1XCIpPT1cIlg1XCIpe1xuICAgICAgICAgICAgbHNnLnNldEl0ZW0oXCLpgJrlhY1cIixcIldFQlwiKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBsc2cuc2V0SXRlbShcIumAmuWFjVwiLFwiWDVcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xuICAgICAgICByZXR1cm4gXCJ0b2FzdDovL+W3suiuvue9ruS7k+W6k+mAmuWFjeaooeW8j+S4ujpcIitsc2cuZ2V0SXRlbShcIumAmuWFjVwiKTtcbiAgICB9KVxufSk7XG5kYXRhLnB1c2goe1xuICAgIHRpdGxlOmNvbG9yKFwi5LuT5bqT5YWs5ZGKXCIsXCIjZmY3MDAwXCIpLFxuICAgIGNvbF90eXBlOlwic2Nyb2xsX2J1dHRvblwiLFxuICAgIHVybDokKCdoaWtlcjovL2VtcHR5I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5IycpLnJ1bGUoKG1kKT0+e1xuICAgICAgICByZXF1aXJlKG1kKTtcbiAgICAgICAgbGV0IGQgPSBbXTtcbiAgICAgICAgbGV0IOS7k+W6k+WFrOWRij1cIuaaguaXoOWFrOWRilwiO1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICDku5PlupPlhazlkYo9ZmV0Y2goJ2h0dHBzOi8vaGpkaG54LmNvZGluZy5uZXQvcC9oaWtlci9kL2RyL2dpdC9yYXcvbWFzdGVyL2pzL+S7k+W6k+WFrOWRii5tZCcpO1xuICAgICAgICB9Y2F0Y2goZSl7fVxuICAgICAgICBpZijku5PlupPlhazlkYopIHtcbiAgICAgICAgICAgIGQucHVzaCh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IG1hcmtlZC5wYXJzZSjku5PlupPlhazlkYopLFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcbiAgICAgICAgICAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5J1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UmVzdWx0KGQpO1xuICAgIH0sbWQpXG59KTtcblxuZGF0YS5wdXNoKHtcbiAgICB0aXRsZTpjb2xvcihcIuWNh+e6p+S7k+W6k1wiLFwiIzE1YWIyMVwiKSxcbiAgICBjb2xfdHlwZTpcInNjcm9sbF9idXR0b25cIixcbiAgICB1cmw6JCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKT0+e1xuICAgICAgICBjb25zdCB7Z2V0QXBpfSA9ICQucmVxdWlyZShcImhpa2VyOi8vcGFnZS91dGlsaXlcIik7XG4gICAgICAgIGxldCBydWxlSGVhZCA9ICfmtbfpmJTop4bnlYzpppbpobXpopHpgZPop4TliJnjgJDpgZPplb/ku5PlupNQcm/jgJHvv6Vob21lX3J1bGVfdXJs77+lJztcbiAgICAgICAgbGV0IHVybCA9IGdldEFwaSgnaW1wb3J0VXJsJykrXCIxMDk0XCI7XG4gICAgICAgIGxldCBpbXBvcnRVcmwgPSAncnVsZTovLycrYmFzZTY0RW5jb2RlKHJ1bGVIZWFkK3VybCk7XG4gICAgICAgIHJldHVybiBpbXBvcnRVcmxcbiAgICB9KVxufSk7XG5cbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XG4gICAgY2xlYXJWYXIoXCJXYXJlaG91c2UuY2xhc3NcIik7XG59KSk7XG5sZXQge1xuICAgIHVzZXJuYW1lLFxuICAgIHBhc3N3b3JkLFxuICAgIHVzZXJcbn0gPSBnZXRGaWxlKCk7XG5cbmxldCBpc19sb2dpbiA9IGZhbHNlO1xubGV0IGlzX21hbmFnZXIgPSBmYWxzZTtcbmlmICh1c2VybmFtZSAhPT0gdm9pZCAwICYmIHBhc3N3b3JkICE9PSB2b2lkIDApIHtcbiAgICBteVVybCArPSAnP3FxPScgKyB1c2VybmFtZSArICcmcGFzc3dvcmQ9JyArIHBhc3N3b3JkO1xuICAgIGxldCBjb2RlX3N0ciA9IHJlcXVlc3QobXlVcmwsdG1wX2hlYWRlcnMpO1xuICAgIGxldCBjb2RlID0ge307XG4gICAgdHJ5e1xuICAgICAgICBjb2RlPUpTT04ucGFyc2UoY29kZV9zdHIpO1xuICAgIH1jYXRjaChlKXt9XG4gICAgaWYgKGNvZGUuc3RhdHVzID09PSAwJiYgY29kZS5yZXN1bHQuYWN0aXZlKSB7XG4gICAgICAgIGlzX2xvZ2luID0gdHJ1ZTtcbiAgICAgICAgaWYoY29kZS5yZXN1bHQuaXNfbWFuYWdlcil7XG4gICAgICAgICAgICBpc19tYW5hZ2VyID0gdHJ1ZTtcbiAgICAgICAgICAgIHB1dFZhcignaG91c2UuaXNfbWFuYWdlcicsJ+ecnycpO1xuICAgICAgICAgICAgcHV0VmFyKCdob3VzZS51c2VybmFtZScsdXNlcm5hbWUpO1xuICAgICAgICAgICAgcHV0VmFyKCdob3VzZS5wYXNzd29yZCcscGFzc3dvcmQpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHB1dFZhcignaG91c2UuaXNfbWFuYWdlcicsJycpO1xuICAgICAgICAgICAgY2xlYXJWYXIoJ2hvdXNlLnVzZXJuYW1lJyk7XG4gICAgICAgICAgICBjbGVhclZhcignaG91c2UucGFzc3dvcmQnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmlmIChpc19sb2dpbikge1xuICAgIHRyeXtcbiAgICBub3dDb24gPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFwibm93Q29uVXJsXCIpLHRtcF9oZWFkZXJzKSkucmVzdWx0O1xuICAgIH1jYXRjaChlKXtcbiAgICAgICAgbm93Q29uPSfmnKrnn6UnO1xuICAgIH1cbiAgICBsZXQgZGV2RGF0YSA9IHVzZXJMaXN0LmZpbmQoaXRlbSA9PiBpdGVtLnFxID09PSB1c2VybmFtZSk7XG4gICAgZGF0YS5wdXNoKHtcbiAgICAgICAgdGl0bGU6ICc8c3Ryb25nPjxzcGFuIHN0eWxlPVwiY29sb3I6ICNmZjcwMDBcIj4nICsgZGV2RGF0YS5uYW1lICsgJzwvc3Bhbj48L3N0cm9uZz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8c21hbGw+PHU+6KeE5YiZ566h55CGID48L3U+PC9zbWFsbD4nLFxuICAgICAgICBwaWNfdXJsOiBkZXZEYXRhLmF2YXRhcixcbiAgICAgICAgY29sX3R5cGU6IFwiYXZhdGFyXCIsXG4gICAgICAgIHVybDogXCJoaWtlcjovL3BhZ2UvZGV2TWFuYWdlI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1wiLFxuICAgICAgICBleHRyYToge1xuICAgICAgICAgICAgLy91c2VybmFtZTogdXNlcm5hbWUsXG4gICAgICAgICAgICAvL3Bhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgICAgICAgIGRldjogZGV2RGF0YVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgZGF0YS5wdXNoKHtcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzEnLFxuICAgICAgICB0aXRsZTogc21hbGwoXCLnjrDmnIkgXCIgKyBjb2xvcih1c2VyTGlzdC5sZW5ndGgsIFwiI2ZmNzAwMFwiKSArIFwiIOWQjeW8gOWPkeiAhe+8jFwiICsgY29sb3IocnVsZUNvdW50WzBdLCBcIiNmZjcwMDBcIikgKyBcIiDmnaHlhazlvIDop4TliJnvvIxcIiArIGNvbG9yKHJ1bGVDb3VudFsxXSwgXCIjZmY3MDAwXCIpICsgXCIg5p2h6ZuG6Iqz6ZiB6KeE5YiZ44CC5Zyo57q/OlwiK2NvbG9yKG5vd0NvbiwgXCIjZmY3MDAwXCIpKSxcbiAgICAgICAgdXJsOiBcInRvYXN0Oi8v5Za15Za15Za1P1wiLFxuICAgIH0pO1xufSBlbHNlIHtcbiAgICBkYXRhLnB1c2goe1xuICAgICAgICB0aXRsZTogc21hbGwoY29sb3IoXCLlvIDlj5HogIXnmbvlvZVcIiwgXCIjMDBCRkZGXCIpKSxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcbiAgICAgICAgZGVzYzogc21hbGwoXCLnjrDmnIlcIiArIGNvbG9yKHVzZXJMaXN0Lmxlbmd0aCwgXCIjZmY3MDAwXCIpICsgXCLlkI3lvIDlj5HogIXvvIxcIiArIGNvbG9yKHJ1bGVDb3VudFswXSwgXCIjZmY3MDAwXCIpICsgXCLmnaHlhazlvIDop4TliJnvvIxcIiArIGNvbG9yKDAsIFwiI2ZmNzAwMFwiKSArIFwi5p2h6ZuG6Iqz6ZiB6KeE5YiZ44CCXCIpLFxuICAgICAgICB1cmw6IFwiaGlrZXI6Ly9wYWdlL2RldkxvZ2luXCJcbiAgICB9KTtcbn1cbmlmIChBcnJheS5pc0FycmF5KHVzZXIpICYmIHVzZXIubGVuZ3RoID09PSAyKSB7XG4gICAgbGV0IHVzZXJsb2dpbiA9IHJlcXVlc3QoYXBpLmRpc19sb2dpbiwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IHtcbiAgICAgICAgICAgICAgICBcInFxXCI6IHVzZXJbMF0sXG4gICAgICAgICAgICAgICAgXCJhdXRoX2NvZGVcIjogdXNlclsxXVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIHRpbWVvdXQ6dGltZW91dFxuICAgIH0pO1xuICAgIHVzZXJsb2dpbiA9IEpTT04ucGFyc2UodXNlcmxvZ2luKS5yZXN1bHQ7XG4gICAgaWYgKHVzZXJsb2dpbi5zdGF0dXMgPT09IDApIHtcbiAgICAgICAgdXNlcmxvZ2luID0gdXNlcmxvZ2luLnJlc3VsdFxuICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgdGl0bGU6IHVzZXJsb2dpbi5uYW1lICsgXCImbmJzcDsmbmJzcDtcIiArIHVzZXJsb2dpbi5xcSArIFwiJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PHNtYWxsPjx1PuabtOaNoui0puWPtyA+PC91Pjwvc21hbGw+XCIsXG4gICAgICAgICAgICBjb2xfdHlwZTogJ2F2YXRhcicsXG4gICAgICAgICAgICBwaWNfdXJsOiB1c2VybG9naW4uYXZhdGFyX3VybCxcbiAgICAgICAgICAgIHVybDogXCJoaWtlcjovL3BhZ2UvVXNlcnJlZ2lzdHJhdGlvblwiXG4gICAgICAgIH0pO1xuICAgICAgICBkYXRhLnNwbGljZSgzLDAse1xuICAgICAgICAgICAgdGl0bGU6IHVzZXJsb2dpbi5oYXNfcmVwbHk/XCLwn4aV5Zue5aSNXCI6XCLwn5SU5Zue5aSNXCIsXG4gICAgICAgICAgICB1cmw6IFwiaGlrZXI6Ly9wYWdlL015UmVwbHk/dXJsPWhpa2VyOi8vZW1wdHkjZnlwYWdlI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1wiLFxuICAgICAgICAgICAgY29sX3R5cGU6IFwic2Nyb2xsX2J1dHRvblwiLFxuICAgICAgICAgICAgZXh0cmE6e1xuICAgICAgICAgICAgICAgIGF1dGhfY29kZTp1c2VyWzFdLFxuICAgICAgICAgICAgICAgIHFxOnVzZXJbMF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiB1c2VybG9naW4uZGV0YWlsLFxuICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcbiAgICAgICAgICAgIGRlc2M6IFwi4oCc4oCc4oCd4oCdPHNtYWxsPjx1PumHjeaWsOiOt+WPlumqjOivgeeggSA+PC91Pjwvc21hbGw+XCIsXG4gICAgICAgICAgICB1cmw6IFwiaGlrZXI6Ly9wYWdlL1VzZXJyZWdpc3RyYXRpb25cIlxuICAgICAgICB9KTtcbiAgICB9XG59IGVsc2Uge1xuICAgIGRhdGEucHVzaCh7XG4gICAgICAgIHRpdGxlOiBcIuivhOiuuueZu+W9lS/ms6jlhoxcIixcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcbiAgICAgICAgZGVzYzogXCJcIixcbiAgICAgICAgdXJsOiBcImhpa2VyOi8vcGFnZS9Vc2VycmVnaXN0cmF0aW9uXCJcbiAgICB9KTtcbn1cbmZvciAodmFyIGl0ZW0gb2YgdXNlckxpc3QpIHtcbiAgICBkYXRhLnB1c2goe1xuICAgICAgICB0aXRsZTogaXRlbS5uYW1lICsgXCIoXCIgKyBpdGVtLnJ1bGVfbnVtICsgXCIpXCIsXG4gICAgICAgIGRlc2M6IGl0ZW0uaWQgKyAnOicgKyBpdGVtLm5pY2tfbmFtZSxcbiAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXIsXG4gICAgICAgIHVybDogXCJoaWtlcjovL3BhZ2UvcnVsZXMjbm9IaXN0b3J5I1wiLFxuICAgICAgICBleHRyYToge1xuICAgICAgICAgICAgYXZhdGFyVXJsOiBpdGVtLmF2YXRhcixcbiAgICAgICAgICAgIHFxOiBpdGVtLnFxLFxuICAgICAgICAgICAgaWQ6aXRlbS5pZCxcbiAgICAgICAgICAgIGNhbl91cGxvYWQ6aXRlbS5jYW5fdXBsb2FkXG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZGF0YS5wdXNoKHtcbiAgICBjb2xfdHlwZTogJ2xvbmdfdGV4dCdcbn0pO1xuc2V0UmVzdWx0KGRhdGEpO1xubGV0IGltZyA9IFtcbiAgICBbXG4gICAgICAgIFwiaGlrZXI6Ly9maWxlcy9pY29uL+i1ni5zdmdcIiwgXCJodHRwczovL2JhZnliZWlhZWV0d2JjM3Rob3kyMnk1emQ3YWw2cm5kZXFicmJ3aHN6cWI2b2l0bmY3YTV6dnN6NXBlLmlwZnMuY2YtaXBmcy5jb20vXCJcbiAgICBdLFxuICAgIFtcbiAgICAgICAgXCJoaWtlcjovL2ZpbGVzL2ljb24v6LipLnN2Z1wiLCBcImh0dHBzOi8vYmFmeWJlaWVoeHlucGhhYWZlNG11a2Fjczd3ZTRkNmxyYjM1a3BwZGlmZmp2NHZ3bnNxMjJuZnFubDQuaXBmcy5jZi1pcGZzLmNvbS9cIlxuICAgIF0sXG4gICAgW1xuICAgICAgICBcImhpa2VyOi8vZmlsZXMvaWNvbi/or4Torrouc3ZnXCIsIFwiaHR0cHM6Ly9iYWZ5YmVpZmh4aTVyZG54cTV4bHk3cjRxZGJ3aWNvMjM0M3NtZWx4ZHFveXRhbGd1Y3RnYzJvanNkeS5pcGZzLmNmLWlwZnMuY29tL1wiXG4gICAgXVxuXVxuZm9yIChsZXQgaXRlbSBvZiBpbWcpIHtcbiAgICBpZiAoIWZpbGVFeGlzdChpdGVtWzBdKSkge1xuICAgICAgICB3cml0ZUZpbGUoaXRlbVswXSwgcmVxdWVzdChpdGVtWzFdKSk7XG4gICAgfVxufVxufSIsInNlYXJjaF91cmwiOiJoaWtlcjovL2VtcHR5IyoqIiwiZ3JvdXAiOiIj77iP4oOj6L275Li76aG1Iiwic2VhcmNoRmluZCI6ImpzOlxudmFyIGQgPSBbXTtcbmNvbnN0IHtcbiAgICBhcGksXG4gICAgZ2V0QXBpLFxuICAgIGxvY2FsUnVsZVZlciAgICBcbn0gPSAkLnJlcXVpcmUoXCJoaWtlcjovL3BhZ2UvdXRpbGl5XCIpO1xudmFyIGh0bWwgPSByZXF1ZXN0KGdldEFwaShcInNlYXJjaFwiKSArIFwiP2tleT1cIiArIE1ZX1VSTC5yZXBsYWNlKFwiaGlrZXI6Ly9lbXB0eSNcIiwgXCJcIikpOyAvLyDojrflj5bmupDnoIFcbnZhciBydWxlX2xpc3QgPSBKU09OLnBhcnNlKGh0bWwpLnJlc3VsdDtcbmxldCBmaWx0ZXIgPSBnZXRWYXIoXCJXYXJlaG91c2UuZmlsdGVyXCIsIFwiXCIpO1xuaWYgKGZpbHRlciAhPT0gXCJcIikge1xuICAgIHJ1bGVfbGlzdCA9IHJ1bGVfbGlzdC5maWx0ZXIoaXRlbSA9PiBpdGVtLmF1dGhvciA9PT0gZmlsdGVyKTtcbn1cbmlmIChydWxlX2xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgZC5wdXNoKHtcbiAgICAgICAgdGl0bGU6ICflhbHmkJzntKLliLAnICsgcnVsZV9saXN0Lmxlbmd0aCArIFwi5p2h6K6w5b2VXCIsXG4gICAgICAgIGRlc2M6ICfor6bmg4Xor7fmib7pgZPplb8scXEgNDM0ODU3MDA1JyxcbiAgICAgICAgdXJsOiBcImhpa2VyOi8vZW1wdHlcIixcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xuICAgIH0pO1xufVxubGV0IGhvbWVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5ob21lKSk7XG5cbmZvciAobGV0IGl0ZW0gb2YgcnVsZV9saXN0KSB7XG4gICAgLy9sZXQgbHZlcj1sb2NhbFJ1bGVWZXIoaG9tZUxpc3QsIGl0ZW0pO1xuICAgIGxldCBsYWJlbCA9IFwiXCIsXG4gICAgICAgIGx2ZXIgPSAtMjtcbiAgICBpZiAoaXRlbS5kYXRhX3R5cGUgPT09IFwiaG9tZV9ydWxlX3VybFwiKSB7XG4gICAgICAgIGx2ZXIgPSBsb2NhbFJ1bGVWZXIoaG9tZUxpc3QsIGl0ZW0pO1xuICAgICAgICBpZiAobHZlciA9PT0gLTEpIHtcbiAgICAgICAgICAgIGxhYmVsID0gXCLwn4aVXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobHZlciA8IGl0ZW0udmVyKSB7XG4gICAgICAgICAgICBsYWJlbCA9IFwi8J+GmVwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIGQucHVzaCh7XG4gICAgICAgIHRpdGxlOiBsYWJlbCtpdGVtLm5hbWUsXG4gICAgICAgIGRlc2M6IGl0ZW0udHlwZSxcbiAgICAgICAgY29udGVudDogaXRlbS5hdXRob3IvKitcIlxcbuacrOWcsOeJiOacrDpcIitsdmVyK1wiXFx0XFx05LqR56uv54mI5pysOlwiK2l0ZW0udmVyKi8rICdcXG7mm7TmlrDkuo46JyArIGl0ZW0ubGFzdF91cGRhdGUsXG4gICAgICAgIHVybDogXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcIixcbiAgICAgICAgZXh0cmE6IHtcbiAgICAgICAgICAgIGx2ZXI6IGx2ZXIsXG4gICAgICAgICAgICBpZDogaXRlbS5pZFxuICAgICAgICB9LFxuICAgICAgICBwaWNfdXJsOiBpdGVtLnBpY191cmxcbiAgICB9KTtcblxufVxuXG5zZXRSZXN1bHQoZCk7IiwiZGV0YWlsX2NvbF90eXBlIjoidGV4dF8xIiwiZGV0YWlsX2ZpbmRfcnVsZSI6IiIsInNkZXRhaWxfY29sX3R5cGUiOiJ0ZXh0XzEiLCJzZGV0YWlsX2ZpbmRfcnVsZSI6IiIsInVhIjoibW9iaWxlIiwicHJlUnVsZSI6IiIsInBhZ2VzIjoiW3tcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlt6XlhbdcIixcInBhdGhcIjpcInV0aWxpeVwiLFwicnVsZVwiOlwianM6XFxubGV0IGhvc3QgPSBcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzXFxcIjtcXG4vL2xldCBob3N0ID0gXFxcImh0dHA6Ly8xOTIuMTY4LjMuOTQ6ODA3OVxcXCI7XFxubGV0IGhvbWUgPSBiYXNlNjREZWNvZGUoXFxcImFHbHJaWEk2THk5b2IyMWxcXFwiKTtcXG52YXIgYXBpID0ge1xcbiAgICBob3N0OiBob3N0K1xcXCIvaGlrZXJ1bGVcXFwiLFxcbiAgICB1c2Vyc1VybDogXFxcIi9kZXYvdXNlcnM/b3JkZXI9XFxcIiwgLy/nlKjmiLfliJfooahcXG4gICAgcnVsZUNvdW50VXJsOiBcXFwiL2Rldi9ydWxlY291bnRcXFwiLCAvL+iOt+WPluinhOWImeaVsOmHj1xcbiAgICBydWxlc1VybDogXFxcIi9kZXYvZ2V0XFxcIiwgLy/nlKjmiLflr7nlupTnmoTop4TliJnliJfooajku4Xku4Xojrflj5blhazlvIBcXG4gICAgcnVsZXNBbGxVcmw6IFxcXCIvZGV2L2dldGFsbFxcXCIsIC8v5byA5Y+R6ICF5a+55bqU55qE6KeE5YiZ5YiX6KGo5Y+v6I635Y+W56eB5pyJXFxuICAgIGRldlNlbGY6Jy9kZXYvZ2V0c2VsZicsLy/ojrflj5blvIDlj5HogIXkv6Hmga9cXG4gICAgbWFuQ2FuVXBsb2FkOicvc2V0X2Nhbl91cGxvYWQvJywvL+i2heeuoeiuvue9ruW8gOWPkeiAheaYr+WQpuWPr+S4iuS8oFxcbiAgICBtYW5SdWxlU2FmZTonL3NldF9ydWxlX3NhZmUvJywvL+i2heeuoeiuvue9ruinhOWImeWuieWFqOaAp1xcbiAgICBtYW5SdWxlR29vZDonL3NldF9ydWxlX2dvb2QvJywvL+i2heeuoeiuvue9ruinhOWImeS8mOi0qOaAp1xcbiAgICBpbXBvcnRVcmw6IFxcXCIvcnVsZWxpc3QuanNvbj9pZD1cXFwiLCAvL+inhOWImeivpuaDheWPr+WvvOWFpVxcbiAgICBpbmZvU2V0VXJsOiBcXFwiL2Rldi9zZXRfaW5mb1xcXCIsXFxuICAgIG5vd0NvblVybDogXFxcIi9zcWxfaW5mby9nZXRfbm93X2NvblxcXCIsXFxuICAgIGluZm9HZXRVcmw6IFxcXCIvZGV2L2dldF9pbmZvP25hbWU9XFxcIixcXG4gICAgc2V0dGluZ3NHZXRVcmw6IFxcXCIvZGV2L2dldF9zZXR0aW5ncz9uYW1lPVxcXCIsXFxuICAgIGd1cGxvYWQ6IFxcXCIvZGV2L2d1cGxvYWRcXFwiLFxcbiAgICBndGltZW92ZXI6IFxcXCIvZGV2L2d0aW1lb3ZlclxcXCIsXFxuICAgIGdldGJ5aWQ6IFxcXCIvZGV2L2dldGJ5aWRcXFwiLFxcbiAgICBydWxlTGlzdEpzb246IFxcXCIvcnVsZWxpc3QuanNvblxcXCIsXFxuICAgIGF1dGg6IFxcXCIvZGV2L2dldF9hdXRoXFxcIixcXG4gICAgdGltZW92ZXI6IFxcXCIvZGV2L3RpbWVvdmVyXFxcIixcXG4gICAgc2hhcmU6IFxcXCIvZGV2L3NoYXJlXFxcIixcXG4gICAgZ2VuQXV0aDogXFxcIi9kZXYvZ2VuX2F1dGhcXFwiLFxcbiAgICBkZWxldGVVcmw6IFxcXCIvZGV2L2RlbGV0ZVxcXCIsXFxuICAgIGpzb25MaXN0OiBcXFwiL2Rldi9qc29uX2xpc3RcXFwiLFxcbiAgICBzZWFyY2g6IFxcXCIvZGV2L3NlYXJjaFxcXCIsXFxuICAgIG5ld19kZXY6IFxcXCIvZGV2X3JlZ2lzdC9uZXdcXFwiLFxcbiAgICBuZXdfZ2V0SWQ6IFxcXCIvZGV2X3JlZ2lzdC9nZXRfaWRcXFwiLFxcbiAgICBuZXdfY29uZmlybTogXFxcIi9kZXZfcmVnaXN0L2NvbmZpcm1cXFwiLFxcbiAgICBtb2RpZnlfcHdkOiBcXFwiL21vZGlmeS9wYXNzd29yZFxcXCIsXFxuICAgIG1vZGlmeV9uYW1lOiBcXFwiL21vZGlmeS9uYW1lXFxcIixcXG4gICAgbW9kaWZ5X2F2YTogXFxcIi9tb2RpZnkvYXZhdGFyXFxcIixcXG4gICAgdXNlcjogXFxcIi9kZXYvdXNlci9cXFwiLFxcbiAgICBnZXRfcnVsZV9ub3RlOiBcXFwiL21vZGlmeS9nZXRfcnVsZV9ub3RlL1xcXCIsXFxuICAgIHNldF9ydWxlX3BpYzogXFxcIi9tb2RpZnkvcnVsZV9waWMvXFxcIixcXG4gICAgc2V0X3J1bGVfbm90ZTogXFxcIi9tb2RpZnkvcnVsZV9ub3RlL1xcXCJcXG59XFxuJC5leHBvcnRzLnJhbmdlID0gZnVuY3Rpb24obSwgbikge1xcbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG0gLSBuICsgMSkgKyBuKTtcXG59XFxuJC5leHBvcnRzLm1hcENvbFR5cGUgPSBmdW5jdGlvbih0YXJnZXQsIHR5cGUsIG4pIHtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcXG4gICAgICAgIHRhcmdldC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogdHlwZVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxudmFyIGdldEFwaSA9IGZ1bmN0aW9uKGspIHtcXG4gICAgcmV0dXJuIGFwaS5ob3N0ICsgYXBpW2tdO1xcbn07XFxuJC5leHBvcnRzLmdldEFwaT1nZXRBcGk7XFxuJC5leHBvcnRzLm1kPWdldEFwaSgnaW1wb3J0VXJsJykrXFxcIjMxODdcXFwiO1xcbiQuZXhwb3J0cy5sb2NhbFJ1bGVWZXIgPSBmdW5jdGlvbihsb2NhbFJ1bGVMaXN0LCBydWxlKSB7XFxuICAgIGxldCBsb2NhbFJ1bGU7XFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxSdWxlTGlzdC5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgbGV0IGl0ZW0gPSBsb2NhbFJ1bGVMaXN0W2ldO1xcbiAgICAgICAgbGV0IGF1ID0gaXRlbS5hdXRob3IgfHwgXFxcIlxcXCI7XFxuICAgICAgICBsZXQgc2FtZUF1PWF1Lmxlbmd0aCA+IDAgJiYgcnVsZS5hdXRob3IuaW5jbHVkZXMoYXUpO1xcbiAgICAgICAgc2FtZUF1PXRydWU7Ly/kuI3liKTmlq3kvZzogIXpu5jorqTkuLp0cnVlXFxuICAgICAgICBpZiAoaXRlbS50aXRsZSA9PT0gcnVsZS5uYW1lICYmIHNhbWVBdSkge1xcbiAgICAgICAgICAgIGxvY2FsUnVsZSA9IGl0ZW07XFxuICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaWYgKGxvY2FsUnVsZSA9PT0gdm9pZCAwKSB7XFxuICAgICAgICByZXR1cm4gLTE7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gbG9jYWxSdWxlLnZlcnNpb247XFxuICAgIH1cXG59XFxuJC5leHBvcnRzLmNvbG9yID0gZnVuY3Rpb24odGV4dCwgY29sb3IpIHtcXG4gICAgdGV4dCArPSBcXFwiXFxcIjtcXG4gICAgaWYgKHRleHQuaW5kZXhPZihcXFwi4oCc4oCc4oCd4oCdXFxcIikgPT09IDApIHtcXG4gICAgICAgIHRleHQucmVwbGFjZShcXFwi4oCc4oCc4oCd4oCdXFxcIiwgXFxcIlxcXCIpO1xcbiAgICB9XFxuICAgIHJldHVybiBcXFwi4oCc4oCc4oCd4oCdPGZvbnQgY29sb3I9J1xcXCIgKyBjb2xvciArIFxcXCInPlxcXCIgKyB0ZXh0ICsgXFxcIjwvZm9udD5cXFwiO1xcbn1cXG5cXG5mdW5jdGlvbiBodG1sVGFnKHRhZywgdGV4dCkge1xcbiAgICB0ZXh0ICs9IFxcXCJcXFwiO1xcbiAgICBpZiAodGV4dC5pbmRleE9mKFxcXCLigJzigJzigJ3igJ1cXFwiKSA9PT0gMCkge1xcbiAgICAgICAgdGV4dC5yZXBsYWNlKFxcXCLigJzigJzigJ3igJ1cXFwiLCBcXFwiXFxcIik7XFxuICAgIH1cXG4gICAgcmV0dXJuIFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIjxcXFwiICsgdGFnICsgXFxcIj5cXFwiICsgdGV4dCArIFxcXCI8L1xcXCIgKyB0YWcgKyBcXFwiPlxcXCI7XFxuXFxufVxcblxcbmZ1bmN0aW9uIGdldE5vd0Zvcm1hdERhdGUoKSB7XFxuICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpO1xcbiAgICAgICAgICAgIGxldCBzZXBlcmF0b3IxID0gXFxcIi1cXFwiO1xcbiAgICAgICAgICAgIGxldCBzZXBlcmF0b3IyID0gXFxcIjpcXFwiO1xcbiAgICAgICAgICAgIGxldCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDE7XFxuICAgICAgICAgICAgbGV0IHN0ckRhdGUgPSBkYXRlLmdldERhdGUoKTtcXG4gICAgICAgICAgICBsZXQgc3RySG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XFxuICAgICAgICAgICAgbGV0IHN0ck1pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKTtcXG4gICAgICAgICAgICBsZXQgc3RyU2Vjb25kcyA9IGRhdGUuZ2V0U2Vjb25kcygpKzE7XFxuICAgICAgICAgICAgaWYgKG1vbnRoID49IDEgJiYgbW9udGggPD0gOSkge1xcbiAgICAgICAgICAgICAgICBtb250aCA9IFxcXCIwXFxcIiArIG1vbnRoXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChzdHJEYXRlID49IDAgJiYgc3RyRGF0ZSA8PSA5KSB7XFxuICAgICAgICAgICAgICAgIHN0ckRhdGUgPSBcXFwiMFxcXCIgKyBzdHJEYXRlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChzdHJIb3VycyA+PSAwICYmIHN0ckhvdXJzIDw9IDkpIHtcXG4gICAgICAgICAgICAgICAgc3RySG91cnMgPSBcXFwiMFxcXCIgKyBzdHJIb3Vyc1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoc3RyTWludXRlcyA+PSAwICYmIHN0ck1pbnV0ZXMgPD0gOSkge1xcbiAgICAgICAgICAgICAgICBzdHJNaW51dGVzID0gXFxcIjBcXFwiICsgc3RyTWludXRlc1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoc3RyU2Vjb25kcyA+PSAwICYmIHN0clNlY29uZHMgPD0gOSkge1xcbiAgICAgICAgICAgICAgICBzdHJTZWNvbmRzID0gXFxcIjBcXFwiICsgc3RyU2Vjb25kc1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAvL2xldCBjdXJyZW50ZGF0ZSA9IGRhdGUuZ2V0RnVsbFllYXIoKSArIHNlcGVyYXRvcjEgKyBtb250aCArIHNlcGVyYXRvcjEgKyBzdHJEYXRlICsgXFxcIiBcXFwiICsgc3RySG91cnMgKyBzZXBlcmF0b3IyICsgc3RyTWludXRlcyArIHNlcGVyYXRvcjIgKyBzdHJTZWNvbmRzO1xcbiAgICAgICAgICAgIGxldCBjdXJyZW50ZGF0ZSA9IChkYXRlLmdldEZ1bGxZZWFyKCktMjAyMCkrJycrIG1vbnRoICsnJysgc3RyRGF0ZSArJycrIHN0ckhvdXJzKycnICsgc3RyTWludXRlcyArJycrIE1hdGguY2VpbChzdHJTZWNvbmRzLzcpO1xcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChjdXJyZW50ZGF0ZSlcXG4gICAgICAgIH1cXG4kLmV4cG9ydHMuZ2V0Tm93Rm9ybWF0RGF0ZSA9IGdldE5vd0Zvcm1hdERhdGU7XFxuJC5leHBvcnRzLmh0bWxUYWcgPSBodG1sVGFnO1xcbiQuZXhwb3J0cy5zbWFsbCA9IGZ1bmN0aW9uKHRleHQpIHtcXG4gICAgcmV0dXJuIGh0bWxUYWcoXFxcInNtYWxsXFxcIiwgdGV4dCk7XFxufVxcbiQuZXhwb3J0cy5nZXRGaWxlID0gZnVuY3Rpb24oKSB7XFxuICAgIHZhciBGaWxlID0gcmVxdWVzdChcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFwiKSB8fCBcXFwie31cXFwiO1xcbiAgICB0cnkge1xcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoRmlsZSk7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFwiLCBcXFwie31cXFwiKTtcXG4gICAgICAgIHJldHVybiB7fTtcXG4gICAgfVxcbn1cXG4kLmV4cG9ydHMuZ2V0VXNlckRhdGUgPWZ1bmN0aW9uKCl7XFxuICAgIHZhciBGaWxlID0gcmVxdWVzdChcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSQS5qc29uXFxcIikgfHwgXFxcIltdXFxcIjtcXG4gICAgdHJ5IHtcXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEZpbGUpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUkEuanNvblxcXCIsIFxcXCJbXVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIFtdO1xcbiAgICB9XFxufVxcbiQuZXhwb3J0cy5leGlzdEZpbGUgPSBmdW5jdGlvbihzcGF0aCwgaXBhdGgsIGhlYWRlcnMpIHtcXG4gICAgbGV0IHNjb2RlID0gcmVxdWVzdChzcGF0aCk7XFxuICAgIGlmICghc2NvZGUpIHtcXG4gICAgICAgIHdyaXRlRmlsZShzcGF0aCwgcmVxdWVzdChpcGF0aCwgaGVhZGVycykpO1xcbiAgICB9XFxufVxcblxcbmxldCBuZXdBcGkgPSB7XFxuICAgIFxcXCJkaXNfbmV3XFxcIjogXFxcIi9oaWtlcnVsZS9uZXdfcnVsZV9kaXNjdXNzL1xcXCIsXFxuICAgIFxcXCJkaXNfdmVyaWZ5XFxcIjogXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvZ2V0X3l6bVxcXCIsXFxuICAgIFxcXCJkaXNfZ2V0XFxcIjogXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvXFxcIixcXG4gICAgXFxcImRpc19zZXRcXFwiOiBcXFwiL2hpa2VydWxlL21vZGlmeS9jYW5fZGlzY3Vzcy9cXFwiLFxcbiAgICBcXFwiZGlzX25ld191c2VyXFxcIjogXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvbmV3X3VzZXJcXFwiLFxcbiAgICBcXFwiZGlzX2xvZ2luXFxcIjpcXFwiL2hpa2VydWxlL3J1bGVfZGlzY3Vzcy91c2VyX2xvZ2luXFxcIixcXG4gICAgXFxcImRpc19kZXZfZGlzY3Vzc1xcXCI6XFxcIi9oaWtlcnVsZS9tb2RpZnkvZGV2X2Nhbl9kaXNjdXNzXFxcIixcXG4gICAgXFxcImRpc19kZXZfY29udHJvbFxcXCI6XFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvcmVtb3ZlL1xcXCIsXFxuICAgIFxcXCJhbGxfcnVsZVxcXCI6XFxcIi9oaWtlcnVsZS9nZXRfcnVsZXNcXFwiLFxcbiAgICBcXFwiZGlzX2dldF9yZXBseVxcXCI6XFxcIi9oaWtlcnVsZS9nZXRfcmVwbHlfcnVsZV9kaXNjdXNzXFxcIixcXG4gICAgXFxcImRpc19yZXBseVxcXCI6XFxcIi9oaWtlcnVsZS9kZXZfbmV3X3J1bGVfZGlzY3Vzcy9cXFwiLFxcbn1cXG5cXG5mdW5jdGlvbiBzZXRBcGkob2JqZWN0KSB7XFxuICAgIGxldCB0YXJnZXQgPSB7fTtcXG4gICAgZm9yIChsZXQga2V5IGluIG9iamVjdCkge1xcbiAgICAgICAgdGFyZ2V0W2tleV09aG9zdCtvYmplY3Rba2V5XVxcbiAgICB9XFxuICAgIHJldHVybiB0YXJnZXQ7XFxufVxcblxcbiQuZXhwb3J0cy5hcGkgPSBzZXRBcGkobmV3QXBpKTtcXG4kLmV4cG9ydHMuYXBpLmhvc3Q9aG9zdDtcXG4kLmV4cG9ydHMuYXBpLmhvbWU9aG9tZTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW8gOWPkeiAheeZu+W9lVwiLFwicGF0aFwiOlwiZGV2TG9naW5cIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi5byA5Y+R6ICF55m75b2VXFxcIik7XFxuY29uc3Qge1xcbiAgICBnZXRBcGksXFxuICAgIGh0bWxUYWcsXFxuICAgIG1hcENvbFR5cGUsXFxuICAgIHNtYWxsLFxcbmdldEZpbGVcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxudmFyIGRhdGEgPSBbXTtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCk9PntcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZVVzZXJuYW1lXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2VQYXNzd29yZFxcXCIpO1xcbn0pKVxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn6LSm5Y+3JyxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlVXNlcm5hbWUnLCcnKSxcXG4gICAgICAgIHR5cGU6XFxcIm51bWJlclxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlVXNlcm5hbWVcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0sIHtcXG4gICAgdGl0bGU6ICflr4bnoIEnLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2VQYXNzd29yZCcsICcnKSxcXG4gICAgICAgIHR5cGU6IFxcXCJwYXNzd29yZFxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlUGFzc3dvcmRcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0pO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCImbmJzcDsmbmJzcDs8YSBocmVmPSdoaWtlcjovL3BhZ2UvUmVnaXN0ZXInPuazqOWGjDwvYT5cXFwiLFxcbiAgICBjb2xfdHlwZTpcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbm1hcENvbFR5cGUoZGF0YSwgXFxcImxpbmVfYmxhbmtcXFwiLCAxKTtcXG5sZXQgdXNlciA9IGdldEZpbGUoKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYlxcXCIsIFxcXCLnmbvlvZVcXFwiKSxcXG4gICAgdXJsOiAkKCkubGF6eVJ1bGUoKHVybCwgZik9PiB7XFxuICAgICAgICBsZXQgdXNlcm5hbWUgPSBnZXRWYXIoJ1dhcmVob3VzZVVzZXJuYW1lJywgJycpLFxcbiAgICAgICAgICAgIHBhc3N3b3JkID0gZ2V0VmFyKCdXYXJlaG91c2VQYXNzd29yZCcsICcnKTtcXG4gICAgICAgIGlmKHVzZXJuYW1lID09PSBcXFwiXFxcIiAmJiBwYXNzd29yZCA9PT1cXFwiXFxcIil7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+i0puWPt+WSjOWvhueggeS4jeiDveS4uuepulxcXCJcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBteVVybCA9IHVybCArICc/cXE9JyArIHVzZXJuYW1lICsgJyZwYXNzd29yZD0nICsgcGFzc3dvcmQ7XFxuICAgICAgICBsZXQgY29kZV9zdHIgPSByZXF1ZXN0KG15VXJsKTtcXG4gICAgICAgIGxldCBjb2RlID0gSlNPTi5wYXJzZShjb2RlX3N0cik7XFxuICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT0gMCkge1xcbiAgICAgICAgICAgIGYudXNlcm5hbWU9dXNlcm5hbWU7XFxuICAgICAgICAgICAgZi5wYXNzd29yZD1wYXNzd29yZFxcbiAgICAgICAgICAgIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb24nLCBKU09OLnN0cmluZ2lmeShmKSk7XFxuICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/nmbvlvZXmiJDlip9cXFwiO1xcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+i0puWPt+aIluWvhueggemUmeivr1xcXCI7XFxuICAgICAgICB9XFxuICAgIH0sIGdldEFwaShcXFwicnVsZXNBbGxVcmxcXFwiKSx1c2VyKSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbn0pO1xcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcImljb25fMl9yb3VuZFwiLFwibmFtZVwiOlwi5byA5Y+R6ICF566h55CGXCIsXCJwYXRoXCI6XCJkZXZNYW5hZ2VcIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi6KeE5YiZ566h55CGXFxcIik7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAnY2xlYXJWYXIoXFxcIldhcmVob3VzZS5iYWNrXFxcIixcXFwiXFxcIik7Jyk7XFxuaWYgKGdldFZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiKSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgIGJhY2soKTtcXG59XFxuY29uc3Qge1xcbiAgICBnZXRBcGksXFxuICAgIGNvbG9yLFxcbiAgICBzbWFsbCxcXG4gICAgZ2V0RmlsZSxcXG4gICAgZXhpc3RGaWxlLFxcbiAgICBtYXBDb2xUeXBlLFxcbiAgICBhcGlcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgZGV2XFxufSA9IE1ZX1BBUkFNUztcXG5sZXQge1xcbiAgICB1c2VybmFtZSxcXG4gICAgcGFzc3dvcmQsXFxufSA9IGdldEZpbGUoKTtcXG4vL2V4aXN0RmlsZShcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwv5byA5Y+R6ICF5YiG5LqrLmh0bWxcXFwiLCBcXFwiaHR0cHM6Ly9lcnAuc2N3aW5iYW8uY29tL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTM5XFxcIik7XFxubGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwicnVsZXNBbGxVcmxcXFwiKSArICc/cXE9JyArIHVzZXJuYW1lICsgJyZwYXNzd29yZD0nICsgcGFzc3dvcmQpKS5yZXN1bHQ7XFxubGV0IE1PQklMRV9VQSA9ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNS4wOyBTTS1HOTAwUCBCdWlsZC9MUlgyMVQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OC4wLjQzMjQuMTQ2IE1vYmlsZSBTYWZhcmkvNTM3LjM2JztcXG5sZXQgaW5mb1NldFVybCA9IGdldEFwaShcXFwiaW5mb1NldFVybFxcXCIpO1xcbmxldCBpbmZvR2V0VXJsID0gZ2V0QXBpKFxcXCJpbmZvR2V0VXJsXFxcIikgKyB1c2VybmFtZTtcXG5sZXQgc2V0dGluZ3NHZXRVcmwgPSBnZXRBcGkoXFxcInNldHRpbmdzR2V0VXJsXFxcIikgKyB1c2VybmFtZTtcXG5wdXRNeVZhcihcXFwiZGV2X3NldF9pbmZvXFxcIiwgW3VzZXJuYW1lLCBwYXNzd29yZCwgaW5mb1NldFVybCwgTU9CSUxFX1VBLCBpbmZvR2V0VXJsXS5qb2luKFxcXCIkJFxcXCIpKTtcXG5sZXQgZGF0YSA9IFtdO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGJpZz7ku5PlupPorr7nva48L2JpZz4mbmJzcDsmbmJzcDsmbmJzcDs8c21hbGw+PHU+77yIIOS4quS6uui1hOaWmSA+77yJPC91Pjwvc21hbGw+JyxcXG4gICAgZGVzYzogJ+KAnOKAnOKAneKAneaCqOWFseaciSA8c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPicgKyBydWxlTGlzdC5sZW5ndGggKyAnPC9zcGFuPicgKyBcXFwiIOadoeinhOWImeOAglxcXFxu54K55Ye76KeE5YiZ5Y+v6L+b6KGM5YiG5Lqr44CB5Yig6Zmk44CB5a+85YWl5pON5L2c5Y+K5p+l55yL6K+m5oOFXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1BlcnNvbmFsRGF0YSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYTp7aWQ6ZGV2LmlkfSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnXFxufSk7XFxubWFwQ29sVHlwZShkYXRhLCBcXFwibGluZVxcXCIsIDIpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBzbWFsbChjb2xvcihcXFwi5pu05pS55YWs5ZGK4pyNXFxcIiwgXFxcIiMzNGIxZmZcXFwiKSksXFxuICAgIC8vIHVybDogXFxcIng1Oi8vZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvcnVsZXMvZHpIb3VzZS9odG1sL2Rldl9pbmZvX2VkaXQuaHRtbFxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9kZXZJbmZvRWRpdFxcXCIsXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBzbWFsbChjb2xvcihcXFwi5pu05aSa5YiG5Lqr8J+TslxcXCIsIFxcXCIjMzRiMWZmXFxcIikpLFxcbiAgICAvL3VybDogXFxcIng1Oi8vZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvcnVsZXMvZHpIb3VzZS9odG1sL+W8gOWPkeiAheWIhuS6qy5odG1sXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL21vcmVTaGFyZVxcXCIsXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBzbWFsbChjb2xvcihcXFwi5Y2H57qn5L6d6LWW8J+TpVxcXCIsIFxcXCIjMzRiMWZmXFxcIikpLFxcbiAgICB1cmw6ICQoXFxcIuWNh+e6p+S8mumHjeaWsOS7juS7k+W6k+aLieWPluebuOWFs+eahOmdmeaAgemhtemdouWIsOacrOWcsFxcXFxu56Gu6K6k5Y2H57qn5ZCXP1xcXCIpLmNvbmZpcm0oKGhvc3QpID0+IHtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwv5byA5Y+R6ICF5YiG5LqrLmh0bWxcXFwiLCByZXF1ZXN0KGhvc3QrJy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUzOScpKTtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwvZGV2X2luZm9fZWRpdC5odG1sXFxcIiwgcmVxdWVzdChob3N0KycvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD00MDInKSk7XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9odG1sL2Rldl9pbmZvX2dldC5odG1sXFxcIiwgcmVxdWVzdChob3N0KycvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD00MDQnKSk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey6YeN572u5byA5Y+R6ICF5YiG5LqrLOeugOS7i+afpeeciyznroDku4vnvJbovpHnrYnpnZnmgIHmlofku7ZcXFwiO1xcbiAgICB9LGFwaS5ob3N0KSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzMnXFxufSk7XFxubGV0IGRldlNldEJhY2s7XFxudHJ5IHtcXG4gICAgZGV2U2V0QmFjayA9IEpTT04ucGFyc2UocmVxdWVzdChzZXR0aW5nc0dldFVybCkpO1xcbn0gY2F0Y2ggKGUpIHtcXG4gICAgZGV2U2V0QmFjayA9IHt9O1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRTZXR0aW5nSXRlbShiYXNpYykge1xcbiAgICBsZXQgdGVtcCA9IHtcXG4gICAgICAgIHRpdGxlOiBiYXNpYy50aXRsZSxcXG4gICAgICAgIGNvbF90eXBlOiBiYXNpYy5jb2xfdHlwZSxcXG4gICAgICAgIHVybDogJChiYXNpYy5jb25maXJtKS5jb25maXJtKCh1cmwsIG1zZykgPT4ge1xcbiAgICAgICAgICAgIGxldCBiYWNrID0gcmVxdWVzdCh1cmwpO1xcbiAgICAgICAgICAgIGxldCByZXQgPSBKU09OLnBhcnNlKGJhY2spO1xcbiAgICAgICAgICAgIGlmIChyZXQuc3RhdHVzID09IDApIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgbXNnWzBdO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBtc2dbMV0gKyBcXFwiXFxcXG5cXFwiICsgcmV0LmRldGFpbDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBiYXNpYy51cmwsIGJhc2ljLm1zZylcXG4gICAgfTtcXG4gICAgcmV0dXJuIHRlbXA7XFxufVxcbmlmIChkZXZTZXRCYWNrLnN0YXR1cyA9PSAwKSB7XFxuICAgIGxldCBkZXZTZXR0aW5ncyA9IGRldlNldEJhY2sucmVzdWx0O1xcbiAgICBsZXQgc2hhcmUgPSB7XFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG4gICAgfTtcXG4gICAgaWYgKGRldlNldHRpbmdzLnNoYXJlX3B1YmxpYykge1xcbiAgICAgICAgc2hhcmUudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi5YWs5byA5LiK5LygXFxcIiwgXFxcImdyZWVuXFxcIikgKyBjb2xvcihcXFwiKOengeiXjylcXFwiLCBcXFwiIzAwYmZmZlxcXCIpKTtcXG4gICAgICAgIHNoYXJlLnVybCA9IGdldEFwaShcXFwiZ3VwbG9hZFxcXCIpICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZCArIFxcXCImZmxhZz0xXFxcIjtcXG4gICAgICAgIHNoYXJlLmNvbmZpcm0gPSBcXFwi5piv5ZCm56Gu6K6k56eB6JeP5Lul5ZCO5o+Q5Lqk55qE6KeE5YiZP1xcXCI7XFxuICAgICAgICBzaGFyZS5tc2cgPSBbXFxcIuW3suengeiXj1xcXCIsIFxcXCLnp4Hol4/lpLHotKVcXFwiXTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHNoYXJlLnRpdGxlID0gc21hbGwoY29sb3IoXFxcIuengeWvhuS4iuS8oFxcXCIsIFxcXCJyZWRcXFwiKSArIGNvbG9yKFxcXCIo5YWs5byAKVxcXCIsIFxcXCIjYWRmZjJmXFxcIikpO1xcbiAgICAgICAgc2hhcmUudXJsID0gZ2V0QXBpKFxcXCJndXBsb2FkXFxcIikgKyBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkO1xcbiAgICAgICAgc2hhcmUuY29uZmlybSA9IFxcXCLmmK/lkKbnoa7orqTlhazlvIDku6XlkI7mj5DkuqTnmoTop4TliJk/XFxcIjtcXG4gICAgICAgIHNoYXJlLm1zZyA9IFtcXFwi5bey5YWs5byAXFxcIiwgXFxcIuWFrOW8gOWksei0pVxcXCJdO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaChzZXRTZXR0aW5nSXRlbShzaGFyZSkpO1xcbiAgICBsZXQgdGltZU92ZXIgPSB7XFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG4gICAgfTtcXG4gICAgaWYgKGRldlNldHRpbmdzLnRpbWVfb3Zlcikge1xcbiAgICAgICAgdGltZU92ZXIudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi55+t5pe256eY6ZKlXFxcIiwgXFxcImdyZWVuXFxcIikgKyBjb2xvcihcXFwiKOawuOS5hSlcXFwiLCBcXFwiIzAwYmZmZlxcXCIpKTtcXG4gICAgICAgIHRpbWVPdmVyLnVybCA9IGdldEFwaShcXFwiZ3RpbWVvdmVyXFxcIikgKyBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkICsgXFxcIiZmbGFnPTFcXFwiO1xcbiAgICAgICAgdGltZU92ZXIuY29uZmlybSA9IFxcXCLmmK/lkKbnoa7orqTku6XlkI7nmoTnp4Hol4/op4TliJnliIbkuqvkuI3ov4fmnJ8/XFxcIjtcXG4gICAgICAgIHRpbWVPdmVyLm1zZyA9IFtcXFwi5bey6K6+5Li65rC45LmFXFxcIiwgXFxcIuiuvuS4uuawuOS5heWksei0pVxcXCJdO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgdGltZU92ZXIudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi5rC45LmF56eY6ZKlXFxcIiwgXFxcInJlZFxcXCIpICsgY29sb3IoXFxcIijov4fmnJ8pXFxcIiwgXFxcIiNhZGZmMmZcXFwiKSk7XFxuICAgICAgICB0aW1lT3Zlci51cmwgPSBnZXRBcGkoXFxcImd0aW1lb3ZlclxcXCIpICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZDtcXG4gICAgICAgIHRpbWVPdmVyLmNvbmZpcm0gPSBcXFwi56Gu6K6k6KaB5Lul5ZCO5YiG5Lqr55qE56eB6JeP6KeE5YiZ6Ieq5Yqo5Yiw5pyfP1xcXCI7XFxuICAgICAgICB0aW1lT3Zlci5tc2cgPSBbXFxcIuW3suiuvuS4uui/h+acn1xcXCIsIFxcXCLorr7kuLrov4fmnJ/lpLHotKVcXFwiXTtcXG4gICAgfVxcbiAgICBkYXRhLnB1c2goc2V0U2V0dGluZ0l0ZW0odGltZU92ZXIpKTtcXG4gICAgbGV0IGRpc2N1c3MgPSB7XFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG4gICAgfTtcXG4gICAgaWYgKGRldlNldHRpbmdzLmNhbl9kaXNjdXNzKSB7XFxuICAgICAgICBkaXNjdXNzLnRpdGxlID0gc21hbGwoY29sb3IoXFxcIuWFgeiuuOivhOiuulxcXCIsIFxcXCJyZWRcXFwiKSArIGNvbG9yKFxcXCIo5LiN6K64KVxcXCIsIFxcXCIjYWRmZjJmXFxcIikpO1xcbiAgICAgICAgZGlzY3Vzcy51cmwgPSBhcGkuZGlzX2Rldl9kaXNjdXNzICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZCsgXFxcIiZmbGFnPTFcXFwiO1xcbiAgICAgICAgZGlzY3Vzcy5jb25maXJtID0gXFxcIuaYr+WQpuehruiupOS7peWQjuS4iuS8oOeahOinhOWImeWFgeiuuOivhOiuuj9cXFwiO1xcbiAgICAgICAgZGlzY3Vzcy5tc2cgPSBbXFxcIuW3suiuvuS4uuS4jeiuuFxcXCIsIFxcXCLorr7nva7lpLHotKVcXFwiXTtcXG5cXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGRpc2N1c3MudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi5LiN6K646K+E6K66XFxcIiwgXFxcImdyZWVuXFxcIikgKyBjb2xvcihcXFwiKOWFgeiuuClcXFwiLCBcXFwiIzAwYmZmZlxcXCIpKTtcXG4gICAgICAgIGRpc2N1c3MudXJsID0gYXBpLmRpc19kZXZfZGlzY3VzcyArIFxcXCI/cXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQ7XFxuICAgICAgICBkaXNjdXNzLmNvbmZpcm0gPSBcXFwi5piv5ZCm56Gu6K6k5Lul5ZCO5LiK5Lyg55qE6KeE5YiZ5YWB6K646K+E6K66P1xcXCI7XFxuICAgICAgICBkaXNjdXNzLm1zZyA9IFtcXFwi5bey6K6+5Li65YWB6K64XFxcIiwgXFxcIuiuvue9ruWksei0pVxcXCJdO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaChzZXRTZXR0aW5nSXRlbShkaXNjdXNzKSk7XFxufVxcbm1hcENvbFR5cGUoZGF0YSwgXFxcImxpbmVcXFwiLCAyKTtcXG5mb3IgKGxldCBpdGVtIG9mIHJ1bGVMaXN0KSB7XFxuICAgIGxldCBteV90X2V4Y29kZTEgPSAnJztcXG4gICAgbGV0IG15X3RfZXhjb2RlMiA9ICcnO1xcbiAgICBpZiAoaXRlbS5zdGF0ZSAhPSAncHVibGljJykge1xcbiAgICAgICAgbXlfdF9leGNvZGUxICs9ICfjipnvuI8nO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgbXlfdF9leGNvZGUxICs9ICcnO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogbXlfdF9leGNvZGUxICsgaXRlbS5uYW1lICsgbXlfdF9leGNvZGUyLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL21hbmFnZVJ1bGUjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IGl0ZW0uaWQsXFxuICAgICAgICAgICAgLy91c2VybmFtZTogdXNlcm5hbWUsXFxuICAgICAgICAgICAgLy9wYXNzd29yZDogcGFzc3dvcmRcXG4gICAgICAgIH0sXFxuICAgICAgICBwaWNfdXJsOiBpdGVtLnBpYyxcXG4gICAgfSlcXG59XFxuaWYgKHJ1bGVMaXN0Lmxlbmd0aCA9PT0gMCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCI8aDUgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz7lv6vmnaXkuIrkvKDkvaDnmoTnrKzkuIDmnaHop4TliJnlkKfvvIE8L2g1PlxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSk7XFxufVxcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuinhOWImeivpue7hi1kZXZcIixcInBhdGhcIjpcIm1hbmFnZVJ1bGVcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IHtcXG4gICAgZ2V0QXBpLFxcbiAgICBjb2xvcixcXG4gICAgc21hbGwsXFxuICAgIGdldEZpbGUsXFxuICAgIGV4aXN0RmlsZSxcXG4gICAgbWFwQ29sVHlwZSxcXG4gICAgaHRtbFRhZyxcXG4gICAgYXBpXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGlkXFxufSA9IE1ZX1BBUkFNUztcXG5sZXQge1xcbiAgICB1c2VybmFtZSxcXG4gICAgcGFzc3dvcmQsXFxufSA9IGdldEZpbGUoKTtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxufSkpO1xcbmxldCBkYXRhSXRlbSA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcImdldGJ5aWRcXFwiKSArIFxcXCI/aWQ9XFxcIiArIGlkKSkucmVzdWx0O1xcbnNldFBhZ2VUaXRsZShcXFwi57yW6L6R44CMXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwi44CNXFxcIik7XFxubGV0IHJlcUJ5R2V0ID0gXFxcIj9pZD1cXFwiICsgZGF0YUl0ZW0uaWQgKyBcXFwiJnFxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkO1xcbmxldCBydWxlTGlzdEpzb24gPSBnZXRBcGkoXFxcInJ1bGVMaXN0SnNvblxcXCIpICsgXFxcIj9pZD1cXFwiO1xcbmxldCBkYXRhID0gW107XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLniYjmnKxcXFwiKSxcXG4gICAgZGVzYzogXFxcIuKAnOKAnOKAneKAneS6keerr+eJiOacrDpcXFwiICsgY29sb3IoZGF0YUl0ZW0udmVyLCBcXFwiIzVjZmYyY1xcXCIpICsgXFxcIlxcXFxu5LiK5qyh5o+Q5Lqk5LqOOiBbXFxcIiArIGNvbG9yKGRhdGFJdGVtLmxhc3RfdXBkYXRlLCBcXFwiI2ZmNzAwMFxcXCIpICsgXFxcIl1cXFwiLFxcbiAgICB1cmw6ICQoXFxcIjzlvIDlj5HogIU+XFxcXG5cXFwiICsgZGF0YUl0ZW0uYXV0aG9yICsgXFxcIlxcXFxuPOWQjeensD5cXFxcblxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcIlxcXFxuPOS6keerr+eJiOacrD5cXFxcblxcXCIgKyBkYXRhSXRlbS52ZXIgKyBcXFwiXFxcXG485pu05paw5pe26Ze0PlxcXFxuW1xcXCIgKyBkYXRhSXRlbS5sYXN0X3VwZGF0ZSArIFxcXCJdXFxcIikuY29uZmlybSgoKSA9PiB7fSksXFxuICAgIGNvbF90eXBlOiAndGV4dF8xJ1xcbn0pO1xcbmxldCBkYXRhVHlwZSA9IHtcXG4gICAgaG9tZV9ydWxlX3VybDogJ+mmlumhteS6keinhOWImScsXFxuICAgIHB1Ymxpc2g6ICfmj5DkuqTkupHku5PlupPop4TliJknLFxcbiAgICBqc191cmw6ICfnvZHpobXmj5Lku7bop4TliJknLFxcbiAgICBodG1sOiAn6Z2Z5oCB6aG16Z2iJyxcXG4gICAgY29uZmlnOiAn5Li76aG16YWN572uJ1xcbn07XFxuXFxubGV0IGJhc2ljID0ge1xcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxufTtcXG5sZXQgZGF0YVR5cGVUaXBzID0gZGF0YVR5cGVbZGF0YUl0ZW0uZGF0YV90eXBlXSB8fCAn5pyq55+l6KeE5YiZOicgKyBkYXRhSXRlbS5kYXRhX3R5cGU7XFxuXFxuYmFzaWMudGl0bGUgPSBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi57G75Z6LXFxcIikgKyBcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIHNtYWxsKFxcXCIoaWQ6XFxcIiArIGRhdGFJdGVtLmlkICsgXFxcIilcXFwiKTtcXG5iYXNpYy5kZXNjID0gXFxcIuaVsOaNruexu+Wei++8mlxcXCIgKyBjb2xvcihkYXRhVHlwZVRpcHMsIFxcXCIjY2I1NGZmXFxcIikgKyBcXFwiXFxcXG7liIbkuqvnirbmgIHkuLrvvJpcXFwiICsgZGF0YUl0ZW0uc3RhdGU7XFxuaWYgKFtcXFwiaHRtbFxcXCIsIFxcXCJjb25maWdcXFwiLCBcXFwianNfdXJsXFxcIl0uaW5jbHVkZXMoZGF0YUl0ZW0uZGF0YV90eXBlKSkge1xcbiAgICBiYXNpYy5kZXNjICs9IFxcXCJcXFxcbuKAnOKAnOKAneKAnSA9PlxcXCIgKyBzbWFsbChcXFwi54K55q2k6aKE6KeIXFxcIik7XFxuICAgIGJhc2ljLnVybCA9IHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcbn1cXG5sZXQgYXV0aCA9IFxcXCJcXFwiO1xcbmlmIChkYXRhSXRlbS5zdGF0ZSA9PSBcXFwicHJpdmF0ZVxcXCIpIHtcXG4gICAgbGV0IGF1dGhfYmFjayA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcImF1dGhcXFwiKSArIHJlcUJ5R2V0KSk7XFxuICAgIGJhc2ljLnRpdGxlID0gYmFzaWMudGl0bGUgKyBcXFwiXFxcXG5cXFwiICsgc21hbGwoY29sb3IoYXV0aF9iYWNrLnJlc3VsdCwgXFxcImdyZXlcXFwiKSk7XFxuICAgIGF1dGggPSAnJmF1dGg9JyArIGF1dGhfYmFjay5yZXN1bHQ7XFxuICAgIGJhc2ljLnVybCA9IGJhc2ljLnVybCA9PT0gXFxcImhpa2VyOi8vZW1wdHlcXFwiID8gYmFzaWMudXJsIDogYmFzaWMudXJsICsgYXV0aDtcXG59XFxuZGF0YS5wdXNoKGJhc2ljKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuaTjeS9nFxcXCIpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcInRvYXN0Oi8v5L2g5omN5piv5pyA5biF55qE6YKj5Liq5Lq677yBXFxcIlxcbn0pO1xcbmxldCBpbXBvcnRVcmwsIHJ1bGVDb2RlLCBzaGFyZVVybCwgYmFja0NvZGUgPSBcXFwiXFxcIjtcXG5pZiAoIWRhdGFJdGVtLmlzX2pzb24pIHtcXG4gICAgYmFja0NvZGUgPSByZXF1ZXN0KHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgYXV0aCk7XFxufVxcbnN3aXRjaCAoZGF0YUl0ZW0uZGF0YV90eXBlKSB7XFxuICAgIGNhc2UgXFxcImhvbWVfcnVsZV91cmxcXFwiOlxcbiAgICAgICAgcnVsZUNvZGUgPSBcXFwi5rW36ZiU6KeG55WM6aaW6aG16aKR6YGT6KeE5YiZ44CQXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwi44CR77+laG9tZV9ydWxlX3VybO+/pVxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArIGF1dGg7XFxuICAgICAgICBpbXBvcnRVcmwgPSBcXFwicnVsZTovL1xcXCIgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpXFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAncHVibGlzaCc6XFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJonICsgZGF0YUl0ZW0ubmFtZSArICfvv6VwdWJsaXNo77+lJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgJ2pzX3VybCc6XFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJrnvZHpobXmj5Lku7bvv6Vqc191cmzvv6UnICsgZGF0YUl0ZW0ubmFtZSArICdAYmFzZTY0Oi8vJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgJ2h0bWwnOlxcbiAgICAgICAgbGV0IGZpbGVfdG1wID0gZGF0YUl0ZW0ubmFtZS5zcGxpdCgnLicpO1xcbiAgICAgICAgbGV0IGZpbGVfcGF0aCA9IGZpbGVfdG1wLmxlbmd0aCA+IDEgPyBmaWxlX3RtcFtmaWxlX3RtcC5sZW5ndGggLSAxXSArIFxcXCIvXFxcIiArIGRhdGFJdGVtLm5hbWUgOiBkYXRhSXRlbS5uYW1lO1xcbiAgICAgICAgcnVsZUNvZGUgPSBcXFwi5rW36ZiU6KeG55WM5pys5Zyw5paH5Lu25YiG5Lqr77+lZmlsZV91cmzvv6VoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvXFxcIiArIGZpbGVfcGF0aCArIFxcXCJAXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgYXV0aDtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVha1xcbiAgICBjYXNlIFxcXCJjb25maWdcXFwiOlxcbiAgICAgICAgaW1wb3J0VXJsID0gJCgpLnJ1bGUocGFzc3dvcmQgPT4ge1xcbiAgICAgICAgICAgIGV2YWwoZmV0Y2goXFxcImhpa2VyOi8vYXNzZXRzL2hvbWUuanNcXFwiKSk7XFxuICAgICAgICAgICAgSGlrZXJIb21lLmxvYWQoXFxcImltcG9ydFxcXCIsIHBhc3N3b3JkKTtcXG4gICAgICAgIH0sIGJhY2tDb2RlKTtcXG4gICAgICAgIGJyZWFrO1xcbn1cXG5sZXQgbXlfY29sX3R5cGUgPSBcXFwidGV4dF8yXFxcIjtcXG5pZiAoaW1wb3J0VXJsKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWvvOWFpeinhOWImVxcXCIsXFxuICAgICAgICB1cmw6IGltcG9ydFVybCxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KTtcXG59XFxuaWYgKHJ1bGVDb2RlKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWIhuS6q+inhOWImVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJjb3B5Oi8vXFxcIiArIHJ1bGVDb2RlLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRTZXR0aW5nSXRlbShiYXNpYywgcGF0dGVybikge1xcbiAgICBsZXQgdGVtcCA9IHtcXG4gICAgICAgIHRpdGxlOiBiYXNpYy50aXRsZSxcXG4gICAgICAgIGNvbF90eXBlOiBiYXNpYy5jb2xfdHlwZSxcXG4gICAgICAgIHVybDogJChiYXNpYy5jb25maXJtKS5jb25maXJtKCh1cmwsIG1zZywgcGF0dGVybikgPT4ge1xcbiAgICAgICAgICAgIGxldCBiYWNrQSA9IHJlcXVlc3QodXJsKTtcXG4gICAgICAgICAgICBsZXQgcmV0ID0gSlNPTi5wYXJzZShiYWNrQSk7XFxuICAgICAgICAgICAgaWYgKHJldC5zdGF0dXMgPT0gMCkge1xcbiAgICAgICAgICAgICAgICBwYXR0ZXJuID8gYmFjaygpIDogcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIG1zZ1swXTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBwYXR0ZXJuID8gYmFjaygpIDogcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIG1zZ1sxXSArIFxcXCJcXFxcblxcXCIgKyByZXQuZGV0YWlsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGJhc2ljLnVybCwgYmFzaWMubXNnLCBwYXR0ZXJuKVxcbiAgICB9O1xcbiAgICByZXR1cm4gdGVtcDtcXG59XFxuaWYgKGRhdGFJdGVtLnN0YXRlID09ICdwcml2YXRlJykge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLorr7kuLrlhazlvIBcXFwiLFxcbiAgICAgICAgdXJsOiAkKGdldEFwaShcXFwic2hhcmVcXFwiKSArIHJlcUJ5R2V0ICsgXFxcIiZmbGFnXFxcIiArIFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICByZXF1ZXN0KGlucHV0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suiuvuS4uuWFrOW8gFxcXCI7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9LCB7XFxuICAgICAgICB0aXRsZTogXFxcIumaj+acuuWvhumSpVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGUsXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXCJnZW5BdXRoXFxcIikgKyByZXFCeUdldCArIFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICBsZXQgYmFjayA9IHJlcXVlc3QoaW5wdXQpO1xcbiAgICAgICAgICAgIGxldCByZXQgPSBKU09OLnBhcnNlKGJhY2spO1xcbiAgICAgICAgICAgIGlmIChyZXQuc3RhdHVzID09IDApIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey55Sf5oiQ6ZqP5py65a+G56CBXFxcXG5cXFwiICsgcmV0LnJlc3VsdFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6ZqP5py65a+G56CB55Sf5oiQ5aSx6LSlXFxcIlxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgIH0pO1xcbiAgICBsZXQgdGltZU92ZXIgPSB7XFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfTtcXG4gICAgaWYgKGRhdGFJdGVtLnRpbWVfb3Zlcikge1xcbiAgICAgICAgdGltZU92ZXIudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi55+t5pe25a+G6ZKlXFxcIiwgXFxcImdyZWVuXFxcIikgKyBjb2xvcihcXFwiKOKGkuawuOS5hSlcXFwiLCBcXFwicmVkXFxcIikpO1xcbiAgICAgICAgdGltZU92ZXIudXJsID0gZ2V0QXBpKFxcXCJ0aW1lb3ZlclxcXCIpICsgcmVxQnlHZXQgKyBcXFwiJmZsYWc9MVxcXCI7XFxuICAgICAgICB0aW1lT3Zlci5jb25maXJtID0gXFxcIuaYr+WQpuehruiupOS7peWQjueahOengeiXj+inhOWImeWIhuS6q+S4jei/h+acnz9cXFwiO1xcbiAgICAgICAgdGltZU92ZXIubXNnID0gW1xcXCLlt7Lorr7kuLrmsLjkuYVcXFwiLCBcXFwi6K6+5Li65rC45LmF5aSx6LSlXFxcIl07XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICB0aW1lT3Zlci50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXCLmsLjkuYXlr4bpkqVcXFwiLCBcXFwicmVkXFxcIikgKyBjb2xvcihcXFwiKOKGkuefreaXtilcXFwiLCBcXFwiZ3JlZW5cXFwiKSk7XFxuICAgICAgICB0aW1lT3Zlci51cmwgPSBnZXRBcGkoXFxcInRpbWVvdmVyXFxcIikgKyByZXFCeUdldDtcXG4gICAgICAgIHRpbWVPdmVyLmNvbmZpcm0gPSBcXFwi56Gu6K6k6KaB5Lul5ZCO5YiG5Lqr55qE56eB6JeP6KeE5YiZ6Ieq5Yqo5Yiw5pyfP1xcXCI7XFxuICAgICAgICB0aW1lT3Zlci5tc2cgPSBbXFxcIuW3suiuvuS4uui/h+acn1xcXCIsIFxcXCLorr7kuLrov4fmnJ/lpLHotKVcXFwiXTtcXG4gICAgfVxcbiAgICBkYXRhLnB1c2goc2V0U2V0dGluZ0l0ZW0odGltZU92ZXIpKTtcXG59IGVsc2UgaWYgKGRhdGFJdGVtLnN0YXRlID09ICdwdWJsaWMnKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuiuvuS4uuengeaciVxcXCIsXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXCJzaGFyZVxcXCIpICsgcmVxQnlHZXQgKyBcXFwiJmZsYWc9MSNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIHJlcXVlc3QoaW5wdXQpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey6K6+5Li656eB5pyJXFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5kYXRhLnB1c2goc2V0U2V0dGluZ0l0ZW0oe1xcbiAgICB0aXRsZTogXFxcIuWIoOmZpOaVsOaNrlxcXCIsXFxuICAgIGNvbmZpcm06IFxcXCLmmK/lkKbnoa7orqTliKDpmaRcXFwiLFxcbiAgICBtc2c6IFtcXFwi5bey5Yig6ZmkXFxcIiwgXFxcIuWIoOmZpOWksei0pVxcXCJdLFxcbiAgICB1cmw6IGdldEFwaShcXFwiZGVsZXRlVXJsXFxcIikgKyByZXFCeUdldCxcXG4gICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxufSwgdHJ1ZSkpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6K6+572u5Zu+5qCHXFxcIixcXG4gICAgdXJsOiAkKGRhdGFJdGVtLnBpY191cmwsIFxcXCLovpPlhaXlm77moIflnLDlnYBcXFwiKS5pbnB1dChhcGkgPT4ge1xcbiAgICAgICAgaWYgKGlucHV0ID09PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kvaDlnKjpgJfmiJHpk77mjqXlk6o/XFxcIlxcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoYXBpICsgXFxcIiZydWxlX3BpYz1cXFwiICsgaW5wdXQpO1xcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcIjtcXG4gICAgfSwgZ2V0QXBpKFxcXCJzZXRfcnVsZV9waWNcXFwiKSArIGRhdGFJdGVtLmlkICsgcmVxQnlHZXQpLFxcbiAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG59KTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogZGF0YUl0ZW0uY2FuX2Rpc2N1c3MgPyBcXFwi56aB5q2i6K+E6K66XFxcIiA6IFxcXCLlvIDlkK/or4TorrpcXFwiLFxcbiAgICB1cmw6ICQoYXBpLmRpc19zZXQgKyBkYXRhSXRlbS5pZCArIHJlcUJ5R2V0ICsgXFxcIiZzdGF0ZT1cXFwiICsgKGRhdGFJdGVtLmNhbl9kaXNjdXNzID8gXFxcIlxcXCIgOiAxKSkubGF6eVJ1bGUoKGNhbl9kaXNjdXNzKSA9PiB7XFxuICAgICAgICByZXF1ZXN0KGlucHV0KTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBjYW5fZGlzY3VzcyA/IFxcXCJ0b2FzdDovL+W3suemgeatouivhOiuulxcXCIgOiBcXFwidG9hc3Q6Ly/lt7LlvIDlkK/or4TorrpcXFwiO1xcbiAgICB9LCBkYXRhSXRlbS5jYW5fZGlzY3VzcyksXFxuICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbn0pO1xcbk1ZX1BBUkFNUy5uYW1lID0gZGF0YUl0ZW0ubmFtZTtcXG5NWV9QQVJBTVMudXNlcm5hbWU9dXNlcm5hbWU7XFxuTVlfUEFSQU1TLnBhc3N3b3JkPXBhc3N3b3JkO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6K6+572u5aSH5rOoXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL3NldF9ydWxlX25vdGVzXFxcIixcXG4gICAgZXh0cmE6IE1ZX1BBUkFNUyxcXG4gICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxufSk7XFxuaWYgKGRhdGFJdGVtLmlzX2pzb24gJiYgZGF0YUl0ZW0uZGF0YV90eXBlID09PSBcXFwiaG9tZV9ydWxlX3VybFxcXCIgJiYgIWRhdGFJdGVtLmlzX2pzb25fbGlzdCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfov5vlhaXpopHpgZMnLFxcbiAgICAgICAgdXJsOiAkKCAvKlxcXCIjbm9Mb2FkaW5nI1xcXCIqLyApLmxhenlSdWxlKChuYW1lLGhvbWUpID0+IHtcXG4gICAgICAgICAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoaG9tZSkpO1xcbiAgICAgICAgICAgIGxldCBoYXNSdWxlID0gcnVsZUxpc3Quc29tZShpdGVtID0+IGl0ZW0udGl0bGUgPT09IG5hbWUpO1xcbiAgICAgICAgICAgIGlmIChoYXNSdWxlKSB7XFxuICAgICAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBob21lK1xcXCJzQFxcXCIgKyBuYW1lO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mnKrlronoo4VcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGRhdGFJdGVtLm5hbWUsYXBpLmhvbWUpLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmdvb2RfbnVtLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+i1ni5zdmdcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfM1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmJhZF9udW0sXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6LipLnN2Z1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF8zXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuivhOiuulxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6K+E6K66LnN2Z1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF8zXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1JlcGx5I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBydWxlSWQ6IGRhdGFJdGVtLmlkLFxcbiAgICAgICAgbmFtZTogZGF0YUl0ZW0uYXV0aG9yLFxcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxcbiAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lXFxuICAgIH1cXG59KTtcXG5sZXQgdG90YWxTdW0gPSBkYXRhSXRlbS5nb29kX251bSArIGRhdGFJdGVtLmJhZF9udW07XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLor4TorrooXFxcIiArIHRvdGFsU3VtICsgXFxcIilcXFwiKSArIFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoaHRtbFRhZyhcXFwidVxcXCIsIFxcXCLmn6XnnIvlhajpg6jor4Torroo5o6n6K+EKSA+XFxcIikpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9Db21tZW50XFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHkjZnlwYWdlI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICB0b3RhbFN1bTogdG90YWxTdW0sXFxuICAgICAgICBub19hY3RpdmU6IHRydWUsXFxuICAgICAgICB1c2VybmFtZTogdXNlcm5hbWUsXFxuICAgICAgICBwYXNzd29yZDogcGFzc3dvcmRcXG4gICAgfVxcbn0pO1xcbi8vY29uc3QgbG9uZ2VzdFN1bT0xMjA7XFxubGV0IGljb24gPSB7XFxuICAgIFxcXCJnb29kXFxcIjogXFxcIvCfkY1cXFwiLFxcbiAgICBcXFwiYmFkXFxcIjogXFxcIvCfkY5cXFwiLFxcbiAgICBcXFwicmVwbHlcXFwiOiBcXFwi5byA5Y+R6ICF8J+Xo1xcXCJcXG59XFxuaWYgKHRvdGFsU3VtID09PSAwKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuS4gOadoeivhOiuuuS5n+ayoeacie+8jOW/q+adpeaKouaymeWPkeWQp++8gTwvaDU+XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICB9KTtcXG59IGVsc2Uge1xcbiAgICBsZXQgY29tbWVudExpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmRpc19nZXQgKyBkYXRhSXRlbS5pZCArIFxcXCI/bGltaXQ9NVxcXCIpKS5yZXN1bHQ7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXG4gICAgICAgIGxldCBSZXBseSA9IGl0ZW0uZGlzY3Vzc190eXBlPT09XFxcInJlcGx5XFxcIiYmaXRlbS5yZXBseV90b19uYW1lIT09ZmFsc2UmJml0ZW0ucmVwbHlfdG9faWQhPT1mYWxzZT9cXFwi4oCY4oCY5Zue5aSNQFxcXCIraXRlbS5yZXBseV90b19uYW1lK1xcXCIgI1xcXCIraXRlbS5kaXNjdXNzX2lkK1xcXCLigJnigJlcXFxcblxcXCI6XFxcIlxcXCI7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUgKyBcXFwiJm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9J2dyYXknPjxzbWFsbD4jXFxcIiArIGl0ZW0uaWQgKyBcXFwiPC9zbWFsbD48Zm9udD5cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvUmVwbHlcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgICAgICAgcnVsZUlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXFxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcXG4gICAgICAgICAgICAgICAgcmVwbHlJZDppdGVtLmlkXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5kaXNjdXNzX3RleHQsXFxuICAgICAgICAgICAgZGVzYzogUmVwbHkraXRlbS5jcmVhdGVfZGF0ZSArIFxcXCLCt1xcXCIgKyBpY29uW2l0ZW0uZGlzY3Vzc190eXBlXSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcXG4gICAgICAgICAgICAgICAgdHlwZTogXFxcImxvbmdfdGV4dFxcXCIsXFxuICAgICAgICAgICAgICAgIHRleHQ6IGl0ZW0uZGlzY3Vzc190ZXh0XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJpY29uXzJfcm91bmRcIixcIm5hbWVcIjpcIuinhOWImeWIl+ihqFwiLFwicGF0aFwiOlwicnVsZXNcIixcInJ1bGVcIjpcImpzOlxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywkLnRvU3RyaW5nKCgpPT57XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLmZpbHRlclxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLnR5cGVcXFwiKTtcXG4gICAgaWYoZ2V0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcsJycpKXtcXG4gICAgICAgIGxvZygn5pON5L2c6L+H56aB5q2i5LiK5LygOicrZ2V0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcpKTtcXG4gICAgICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuY2FuX3VwbG9hZFxcXCIpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgIH1cXG59KSk7XFxuXFxuaWYgKGdldFZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiKSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgIGJhY2soZmFsc2UpO1xcbn1cXG5cXG5jb25zdCB7XFxuICAgIGdldEFwaSxcXG4gICAgYXBpLFxcbiAgICBjb2xvcixcXG4gICAgc21hbGwsXFxuICAgIGxvY2FsUnVsZVZlcixcXG4gICAgaHRtbFRhZyxcXG4gICAgbWRcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxuY29uc3QgeyBtZXJnZVNvcnQgfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3NvcnRcXFwiKTtcXG5sZXQge1xcbiAgICBhdmF0YXJVcmwsXFxuICAgIHFxLFxcbiAgICBpZCxcXG4gICAgY2FuX3VwbG9hZFxcbn0gPSBNWV9QQVJBTVM7XFxubGV0IGRhdGFUeXBlID0gZ2V0VmFyKFxcXCJXYXJlaG91c2UudHlwZVxcXCIsXFxcIlxcXCIpO1xcbmxldCBiYWNrQ29kZSA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcInJ1bGVzVXJsXFxcIikgKyBcXFwiP25hbWU9XFxcIiArIHFxK1xcXCImZGF0YV90eXBlPVxcXCIrZGF0YVR5cGUpKTtcXG5sZXQgZGV2TmFtZSA9IGJhY2tDb2RlLmRldl9uYW1lO1xcbnB1dFZhcihcXFwiV2FyZWhvdXNlLmZpbHRlclxcXCIsIGRldk5hbWUpO1xcbmxldCBydWxlTGlzdCA9IGJhY2tDb2RlLnJlc3VsdDtcXG5sZXQgc3ViVXJsID0gZ2V0QXBpKFxcXCJqc29uTGlzdFxcXCIpICsgXFxcIj9uYW1lPVxcXCIgKyBxcTtcXG5sZXQgaGFzU3ViID0gaGFzSG9tZVN1YihzdWJVcmwpO1xcbmxldCBkZXZJbmZvID0gXFxcIui/meS4quS6uuW+iOaHkizku4DkuYjpg73msqHlhpnlk6Z+XFxcIjtcXG5sZXQgdG1wSnNvbiA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcImluZm9HZXRVcmxcXFwiKSArIHFxKSk7XFxuaWYgKHRtcEpzb24uc3RhdHVzID09IDApIHtcXG4gICAgZGV2SW5mbyA9IHRtcEpzb24ucmVzdWx0IHx8IGRldkluZm87XFxufVxcbmxldCBzdWJGbGFnID0gaGFzU3ViID8gJ/CfhpcnIDogJ/Cfk6EnO1xcbmxldCBkYXRhID0gW107XFxucmVxdWlyZShtZCk7XFxuZGV2SW5mbz1tYXJrZWQucGFyc2UoZGV2SW5mbyk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgZGV2TmFtZSArIFxcXCJcXFxcblxcXFxuXFxcIiArIHNtYWxsKGh0bWxUYWcoXFxcInVcXFwiLCBcXFwi54K55Ye75p+l55yL5a6M5pW05YWs5ZGKXFxcIikpLFxcbiAgICBkZXNjOiBzbWFsbChkZXZJbmZvKSxcXG4gICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2luZm8nLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGV4dDogZGV2SW5mbyxcXG4gICAgICAgIG5hbWU6IGRldk5hbWUsXFxuICAgICAgICB0eXBlOlxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0sXFxuICAgIHBpY191cmw6IGF2YXRhclVybCxcXG4gICAgY29sX3R5cGU6ICdtb3ZpZV8xX3ZlcnRpY2FsX3BpYydcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIjxiaWc+6K6i6ZiF566h55CGPC9iaWc+Jm5ic3A7Jm5ic3A7PHNtYWxsPijlvZPliY1cXFwiICsgKGhhc1N1YiA/IFxcXCLlt7LorqLpmIVcXFwiIDogXFxcIuacquiuoumYhVxcXCIpICsgXFxcIik8L3NtYWxsPlxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcblxcbmxldCBzdWJfY29kZSA9ICfmtbfpmJTop4bnlYzlkIjpm4bop4TliJnorqLpmIXvv6Vob21lX3N1Yu+/pScgKyBkZXZOYW1lICsgXFxcIuWQiOmbhkBAXFxcIiArIHN1YlVybDtcXG5sZXQgcnVsZXNDb2RlID0gJ+a1t+mYlOinhueVjOWQiOmbhuinhOWIme+/pWhvbWVfcnVsZV91cmzvv6UnICsgc3ViVXJsO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY3MDAwXFxcIj7kuIDplK7orqLpmIU8L3NwYW4+JyxcXG4gICAgZGVzYzogJ+iuoumYheKAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjogIzVjZmYyY1xcXCI+JyArIGRldk5hbWUgKyAnPC9zcGFuPueahOaJgOacieWNleinhOWIme+8jOWQiOmbhumcgOWNleeLrOiuoumYhScsXFxuICAgIHVybDogc3ViX2NvZGUsXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY3MDAwXFxcIj7lr7zlhaXlhajpg6g8L3NwYW4+JyxcXG4gICAgdXJsOiBydWxlc0NvZGUsXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY3MDAwXFxcIj7lr7zlhaXovbvlkIjpm4Y8L3NwYW4+JyxcXG4gICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRldk5hbWUsc3ViVXJsLGF2YXRhclVybCk9PntcXG4gICAgICAgIGNvbnN0IHtnZW5SdWxlfT0kLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9nZW5BcGlcXFwiKTtcXG4gICAgICAgIGxvZyhcXFwi6L275ZCI6ZuG5Zu+5qCH6ZO+5o6lOlxcXCIrYXZhdGFyVXJsKTtcXG4gICAgICAgIGxldCBpbXBvcnRfcnVsZT1nZW5SdWxlKFxcXCLovbvlkIjpm4YuXFxcIitkZXZOYW1lLHN1YlVybCxhdmF0YXJVcmwpO1xcbiAgICAgICAgLy9jb3B5KGltcG9ydF9ydWxlKTtcXG4gICAgICAgIGxldCBydWxlQ29kZT1wYXJzZVBhc3RlKGltcG9ydF9ydWxlLnNwbGl0KFxcXCJcXFxcblxcXCIpWzBdKTtcXG4gICAgICAgIC8vcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIHJldHVybiBpbXBvcnRVcmxcXG4gICAgfSxkZXZOYW1lLHN1YlVybCxhdmF0YXJVcmwpLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMydcXG59KTtcXG5sZXQgY2FuX3VwbG9hZF9hcGkgPSBnZXRBcGkoXFxcIm1hbkNhblVwbG9hZFxcXCIpK2lkO1xcbmlmKGdldFZhcignaG91c2UuaXNfbWFuYWdlcicpKXtcXG4gICAgbGV0IHRpcHMgPSBjYW5fdXBsb2FkPyfog70nOiflkKYnO1xcbiAgICAvLyBsb2coJ3RpcHM6Jyt0aXBzKTtcXG4gICAgLy8gbG9nKCdjYW5fdXBsb2FkOicrY2FuX3VwbG9hZCk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon4pqg6IO95ZCm5LiK5LygOicrKGdldFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnKXx8dGlwcyksXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICB1cmw6J2hpa2VyOi8vZW1wdHknXFxuICAgIH0pO1xcbiAgICBmdW5jdGlvbiBzZXRVcGxvYWQoZmxhZyxjYW5fdXBsb2FkX2FwaSkge1xcbiAgICAgICAgZmxhZyA9IGZsYWcgfHwgJyc7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBjb2RlID0gZmV0Y2goY2FuX3VwbG9hZF9hcGksIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXCJVc2VyLUFnZW50XFxcIjogTU9CSUxFX1VBfSxcXG4gICAgICAgICAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwidXNlcm5hbWVcXFwiOiBnZXRWYXIoJ2hvdXNlLnVzZXJuYW1lJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IGdldFZhcignaG91c2UucGFzc3dvcmQnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImNhbl91cGxvYWRcXFwiOiAhIWZsYWdcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBjb2RlID0gSlNPTi5wYXJzZShjb2RlKS5yZXN1bHQ7XFxuICAgICAgICAgICAgaWYgKGNvZGUuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgZS5tZXNzYWdlXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifwn5qr56aB5q2i5LiK5LygJyxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDokKCfnpoHmraLor6XlvIDlj5HogIXkuIrkvKDop4TliJk/5L2g55qE5pON5L2c5bCG6KKr57O757uf6K6w5b2VJykuY29uZmlybSgoaWQsY2FuX3VwbG9hZF9hcGksc2V0VXBsb2FkKT0+e1xcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRVcGxvYWQoZmFsc2UsY2FuX3VwbG9hZF9hcGkpO1xcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcbiAgICAgICAgICAgICAgICBwdXRWYXIoJ1dhcmVob3VzZS5jYW5fdXBsb2FkJywn5ZCmJyk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxuICAgICAgICB9LGlkLGNhbl91cGxvYWRfYXBpLHNldFVwbG9hZClcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon4pyF5YWB6K645LiK5LygJyxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDokKCflhYHorrjor6XlvIDlj5HogIXkuIrkvKDop4TliJk/5L2g55qE5pON5L2c5bCG6KKr57O757uf6K6w5b2VJykuY29uZmlybSgoaWQsY2FuX3VwbG9hZF9hcGksc2V0VXBsb2FkKT0+e1xcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRVcGxvYWQodHJ1ZSxjYW5fdXBsb2FkX2FwaSk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHB1dFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnLCfmmK8nKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0saWQsY2FuX3VwbG9hZF9hcGksc2V0VXBsb2FkKVxcbiAgICB9KTtcXG59XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCI8c21hbGw+5o+Q56S677ya5byA5Y+R6ICF5Y2V54us5YiG5Lqr55qE5ZCI6ZuG5paH5Lu25Y+q6IO95Y2V54us5a+85YWl44CCPC9zbWFsbD5cXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIjxiaWc+6KeE5YiZ5YiX6KGoPC9iaWc+Jm5ic3A7Jm5ic3A7PHNtYWxsPijlhbFcXFwiICsgcnVsZUxpc3QubGVuZ3RoICsgXFxcIuadoSk8L3NtYWxsPlxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbmxldCBkYXRhVHlwZUxpc3QgPSB7XFxuICAgIFxcXCJcXFwiOlxcXCLlhajpg6hcXFwiLFxcbiAgICBcXFwiaG9tZV9ydWxlX3VybFxcXCI6ICflsI/nqIvluo8nLFxcbiAgICAvL1xcXCJwdWJsaXNoXFxcIjogJ+aPkOS6pOS6keS7k+W6k+inhOWImScsXFxuICAgIFxcXCJqc191cmxcXFwiOiAn572R6aG15o+S5Lu2JyxcXG4gICAgXFxcImh0bWxcXFwiOiAn6Z2Z5oCB6aG16Z2iJyxcXG4gICAgXFxcImNvbmZpZ1xcXCI6ICfkuLvpopgnXFxufTtcXG5mb3IobGV0IGtleSBpbiBkYXRhVHlwZUxpc3Qpe1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ZGF0YVR5cGU9PT1rZXk/XFxcIuKAnOKAnFxcXCIrZGF0YVR5cGVMaXN0W2tleV0rXFxcIuKAneKAnVxcXCI6ZGF0YVR5cGVMaXN0W2tleV0sXFxuICAgICAgICB1cmw6JChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoa2V5KT0+e1xcbiAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLnR5cGVcXFwiLGtleSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LGtleSksXFxuICAgICAgICBjb2xfdHlwZTpcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG4gICAgfSk7XFxufVxcbmlmIChydWxlTGlzdC5sZW5ndGggPiAyMCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLmkJzntKJcXFwiLFxcbiAgICAgICAgdXJsOiAkLnRvU3RyaW5nKG5hbWUgPT4gXFxcImhpa2VyOi8vc2VhcmNoP3M9XFxcIiArIGlucHV0ICsgXFxcIiZydWxlPVxcXCIgKyBuYW1lLCBNWV9SVUxFLnRpdGxlKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICAgICAgZGVzYzogXFxcIuaQnOe0ouW9k+WJjeW8gOWPkeiAheeahOinhOWImVxcXCJcXG4gICAgfSk7XFxufVxcbmxldCBob21lTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuaG9tZSkpO1xcbmxldCBtUnVsZUxpc3QgPSBbXTtcXG5mb3IgKHZhciBpdGVtIG9mIHJ1bGVMaXN0KSB7XFxuICAgIHZhciBuYW1lID0gaXRlbS5uYW1lO1xcbiAgICBpZiAoaXRlbS5pc190YXApIHtcXG4gICAgICAgIGxldCBsb2NhdGlvbiA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcInJ1bGVMaXN0SnNvblxcXCIpICsgXFxcIj9pZD1cXFwiICsgaXRlbS5pZCkpO1xcbiAgICAgICAgaXRlbS5pZCA9IGxvY2F0aW9uLmlkO1xcbiAgICAgICAgaXRlbS5uYW1lID0gbG9jYXRpb24ubmFtZTtcXG4gICAgICAgIGl0ZW0uYXV0aG9yID0gbG9jYXRpb24uYXV0aG9yO1xcbiAgICAgICAgaXRlbS5kYXRhX3R5cGUgPSBsb2NhdGlvbi5kYXRhX3R5cGU7XFxuICAgICAgICBpdGVtLnZlciA9IGxvY2F0aW9uLnZlclxcbiAgICB9XFxuICAgIGl0ZW0udmVyc2lvbiA9IGl0ZW0udmVyO1xcbiAgICBsZXQgbGFiZWwgPSBcXFwiXFxcIixcXG4gICAgICAgIGx2ZXIgPSAtMjtcXG4gICAgaWYgKGl0ZW0uaXNfanNvbiAmJiBpdGVtLmRhdGFfdHlwZSA9PT0gXFxcImhvbWVfcnVsZV91cmxcXFwiKSB7XFxuICAgICAgICBsdmVyID0gbG9jYWxSdWxlVmVyKGhvbWVMaXN0LCBpdGVtKTtcXG4gICAgICAgIGlmIChsdmVyID09PSAtMSkge1xcbiAgICAgICAgICAgIGxhYmVsID0gXFxcIvCfhpVcXFwiO1xcbiAgICAgICAgfSBlbHNlIGlmIChsdmVyIDwgaXRlbS52ZXIpIHtcXG4gICAgICAgICAgICBsYWJlbCA9IFxcXCLwn4aZXFxcIjtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBtUnVsZUxpc3QucHVzaCh7XFxuICAgICAgICB0aXRsZTogbGFiZWwgKyBuYW1lLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVEZXRhaWwjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgbHZlcjogbHZlcixcXG4gICAgICAgICAgICBpZDogaXRlbS5pZFxcbiAgICAgICAgfSxcXG4gICAgICAgIHBpY191cmw6IGl0ZW0ucGljLFxcbiAgICB9KTtcXG59XFxuLyog5b2S5bm25o6S5bqPIFN0YXJ0ICovXFxubVJ1bGVMaXN0ID0gbWVyZ2VTb3J0KG1SdWxlTGlzdCk7XFxuLyog5b2S5bm25o6S5bqPIEVuZCAqL1xcbmRhdGEucHVzaC5hcHBseShkYXRhLCBtUnVsZUxpc3QpXFxuc2V0UmVzdWx0KGRhdGEpO1xcblwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6KeE5YiZ6K+m57uGLXVzZXJcIixcInBhdGhcIjpcInJ1bGVEZXRhaWxcIixcInJ1bGVcIjpcImpzOlxcbiAgICBjb25zdCB7XFxuICAgICAgICBnZXRBcGksXFxuICAgICAgICBjb2xvcixcXG4gICAgICAgIHNtYWxsLFxcbiAgICAgICAgaHRtbFRhZyxcXG4gICAgICAgIGFwaSxcXG4gICAgICAgIG1kXFxuICAgIH0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5sZXQge1xcbiAgICBpZCxcXG4gICAgbHZlcixcXG4gICAgaXNBbGxcXG59ID0gTVlfUEFSQU1TO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoaXNBbGwpID0+IHtcXG4gICAgaWYoIWlzQWxsKXtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgfVxcbn0saXNBbGwpKTtcXG5sZXQgZGF0YUl0ZW0gPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXCJnZXRieWlkXFxcIikgKyBcXFwiP2lkPVxcXCIgKyBpZCkpLnJlc3VsdDtcXG5zZXRQYWdlVGl0bGUoXFxcIuOAjFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcIuOAjVxcXCIpXFxubGV0IHJ1bGVMaXN0SnNvbiA9IGdldEFwaShcXFwicnVsZUxpc3RKc29uXFxcIikgKyBcXFwiP2lkPVxcXCI7XFxubGV0IGRhdGEgPSBbXTtcXG52YXIgaGFzU3ViID0gZmFsc2U7XFxuXFxuaWYgKGRhdGFJdGVtLmlzX2pzb25fbGlzdCkge1xcbiAgICBoYXNTdWIgPSBoYXNIb21lU3ViKHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkKTtcXG59IGVsc2UgaWYgKCFkYXRhSXRlbS5pc19qc29uX2xpc3QgJiYgZGF0YUl0ZW0uZGF0YV90eXBlID09ICdob21lX3J1bGVfdXJsJykge1xcbiAgICBoYXNTdWIgPSBoYXNIb21lU3ViKHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgJyZkZWJ1Zz10cnVlJyk7XFxufVxcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi54mI5pysXFxcIiksXFxuICAgIGRlc2M6IFxcXCLigJzigJzigJ3igJ3lvIDlj5HogIXvvJpcXFwiICsgY29sb3IoZGF0YUl0ZW0uYXV0aG9yLCBcXFwiIzIyOEJFNlxcXCIpICsgXFxcIlxcXFxu5LqR56uv54mI5pys77yaXFxcIiArIGNvbG9yKGRhdGFJdGVtLnZlciwgXFxcIiM1Y2ZmMmNcXFwiKSArIFxcXCJcXFxcdFxcXFx05pys5Zyw54mI5pys77yaXFxcIiArIGNvbG9yKGx2ZXIsIFxcXCIjNWNmZjJjXFxcIikgKyBcXFwiXFxcXG7mm7TmlrDkuo46IFtcXFwiICsgY29sb3IoZGF0YUl0ZW0ubGFzdF91cGRhdGUsIFxcXCIjZmY3MDAwXFxcIikgKyBcXFwiXVxcXCIsXFxuICAgIHVybDogJChcXFwiPOW8gOWPkeiAhT5cXFxcblxcXCIgKyBkYXRhSXRlbS5hdXRob3IgKyBcXFwiXFxcXG485ZCN56ewPlxcXFxuXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwiXFxcXG485LqR56uv54mI5pysPlxcXFxuXFxcIiArIGRhdGFJdGVtLnZlciArIFxcXCJcXFxcbjzmnKzlnLDniYjmnKw+XFxcXG5cXFwiICsgbHZlciArIFxcXCJcXFxcbjzmm7TmlrDml7bpl7Q+XFxcXG5bXFxcIiArIGRhdGFJdGVtLmxhc3RfdXBkYXRlICsgXFxcIl1cXFwiKS5jb25maXJtKCgpID0+IHt9KSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnXFxufSk7XFxubGV0IGRhdGFUeXBlID0ge1xcbiAgICBob21lX3J1bGVfdXJsOiAn6aaW6aG15LqR6KeE5YiZJyxcXG4gICAgcHVibGlzaDogJ+aPkOS6pOS6keS7k+W6k+inhOWImScsXFxuICAgIGpzX3VybDogJ+e9kemhteaPkuS7tuinhOWImScsXFxuICAgIGh0bWw6ICfpnZnmgIHpobXpnaInLFxcbiAgICBjb25maWc6ICfkuLvpobXphY3nva4nXFxufTtcXG5cXG5sZXQgYmFzaWMgPSB7XFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG59O1xcbmxldCBkYXRhVHlwZVRpcHMgPSBkYXRhVHlwZVtkYXRhSXRlbS5kYXRhX3R5cGVdIHx8ICfmnKrnn6Xop4TliJnvvJonICsgZGF0YUl0ZW0uZGF0YV90eXBlO1xcblxcbmxldCBzYWZlX3RpcD1kYXRhSXRlbS5pc19zYWZlP1xcXCLlronlhahcXFwiOlxcXCLljbHpmalcXFwiO1xcbmxldCBnb29kX3RpcCA9IGRhdGFJdGVtLmlzX2dvb2Q/c21hbGwoY29sb3IoXFxcIuOAkOS8mOi0qOinhOWImeOAkVxcXCIsJyNmZjcwMDAnKSk6XFxcIlxcXCI7XFxubGV0IG5vdF9zYWZlX25vdGU9ZGF0YUl0ZW0ubm90X3NhZmVfbm90ZTtcXG5iYXNpYy50aXRsZSA9IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLnsbvlnotcXFwiKSArIFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoXFxcIihpZDpcXFwiICsgZGF0YUl0ZW0uaWQgKyBcXFwiKVxcXCIpK1xcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoXFxcIijpo47pmanmo4DmtYs6XFxcIiArc2FmZV90aXArXFxcIilcXFwiKStnb29kX3RpcDtcXG5iYXNpYy5kZXNjID0gXFxcIuaVsOaNruexu+Wei++8mlxcXCIgKyBjb2xvcihkYXRhVHlwZVRpcHMsIFxcXCIjY2I1NGZmXFxcIikgKyBcXFwiXFxcXG7liIbkuqvnirbmgIHkuLrvvJpcXFwiICsgZGF0YUl0ZW0uc3RhdGU7XFxuaWYgKFtcXFwiaHRtbFxcXCIsIFxcXCJjb25maWdcXFwiLCBcXFwianNfdXJsXFxcIl0uaW5jbHVkZXMoZGF0YUl0ZW0uZGF0YV90eXBlKSkge1xcbiAgICBiYXNpYy5kZXNjICs9IFxcXCJcXFxcbuKAnOKAnOKAneKAnSA9PlxcXCIgKyBzbWFsbChcXFwi54K55q2k6aKE6KeIXFxcIik7XFxuICAgIGJhc2ljLnVybCA9IHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcbn1cXG5cXG5kYXRhLnB1c2goYmFzaWMpO1xcbmxldCBoYXNTdWJzID0gXFxcIlxcXCI7XFxuaWYgKGhhc1N1Yikge1xcbiAgICBoYXNTdWJzID0gXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChcXFwi5bey6K6i6ZiFXFxcIilcXG59XFxuXFxubGV0IG5vdGVzID0gcmVxdWVzdChnZXRBcGkoXFxcImdldF9ydWxlX25vdGVcXFwiKSArIGlkKTtcXG5ub3RlcyA9IEpTT04ucGFyc2Uobm90ZXMpLnJlc3VsdDtcXG5yZXF1aXJlKG1kKTtcXG5sZXQgbm90ZXNIdG1sPVxcXCJcXFwiXFxudHJ5e1xcbiAgICBub3Rlc0h0bWw9bWFya2VkLnBhcnNlKG5vdGVzKTtcXG59Y2F0Y2goZSl7fVxcblxcbmlmIChub3RlcyAhPT0gZmFsc2UpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi5aSH5rOoXFxcIikgKyBcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIHNtYWxsKGh0bWxUYWcoXFxcInVcXFwiLCBcXFwi5p+l55yL5a6M5pW05YWs5ZGKID5cXFwiKSksXFxuICAgICAgICBkZXNjOiBub3RlcyxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgdGV4dDogbm90ZXNIdG1sLFxcbiAgICAgICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWUsXFxuICAgICAgICAgICAgLy8gdHlwZTogXFxcImxvbmdfdGV4dFxcXCJcXG4gICAgICAgICAgICB0eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICAgICAgfVxcbiAgICB9KTtcXG59XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLmk43kvZxcXFwiKSArIGhhc1N1YnMsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwidG9hc3Q6Ly/kvaDmiY3mmK/mnIDluIXnmoTpgqPkuKrkurrvvIFcXFwiXFxufSk7XFxubGV0IGltcG9ydFVybCwgcnVsZUNvZGUsIHNoYXJlVXJsLCBiYWNrQ29kZSA9IFxcXCJcXFwiO1xcbmlmICghZGF0YUl0ZW0uaXNfanNvbikge1xcbiAgICBiYWNrQ29kZSA9IHJlcXVlc3QocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpO1xcbn1cXG5zd2l0Y2ggKGRhdGFJdGVtLmRhdGFfdHlwZSkge1xcbiAgICBjYXNlIFxcXCJob21lX3J1bGVfdXJsXFxcIjpcXG4gICAgICAgIHJ1bGVDb2RlID0gXFxcIua1t+mYlOinhueVjOmmlumhtemikemBk+inhOWImeOAkFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcIuOAke+/pWhvbWVfcnVsZV91cmzvv6VcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxuICAgICAgICBpbXBvcnRVcmwgPSBcXFwicnVsZTovL1xcXCIgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpXFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAncHVibGlzaCc6XFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJonICsgZGF0YUl0ZW0ubmFtZSArICfvv6VwdWJsaXNo77+lJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgJ2pzX3VybCc6XFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJrnvZHpobXmj5Lku7bvv6Vqc191cmzvv6UnICsgZGF0YUl0ZW0ubmFtZSArICdAYmFzZTY0Oi8vJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgJ2h0bWwnOlxcbiAgICAgICAgbGV0IGZpbGVfdG1wID0gZGF0YUl0ZW0ubmFtZS5zcGxpdCgnLicpO1xcbiAgICAgICAgbGV0IGZpbGVfcGF0aCA9IGZpbGVfdG1wLmxlbmd0aCA+IDEgPyBmaWxlX3RtcFtmaWxlX3RtcC5sZW5ndGggLSAxXSArIFxcXCIvXFxcIiArIGRhdGFJdGVtLm5hbWUgOiBkYXRhSXRlbS5uYW1lO1xcbiAgICAgICAgcnVsZUNvZGUgPSBcXFwi5rW36ZiU6KeG55WM5pys5Zyw5paH5Lu25YiG5Lqr77+lZmlsZV91cmzvv6VoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvXFxcIiArIGZpbGVfcGF0aCArIFxcXCJAXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIGJyZWFrXFxuICAgIGNhc2UgXFxcImNvbmZpZ1xcXCI6XFxuICAgICAgICBpbXBvcnRVcmwgPSAkKCkucnVsZShwYXNzd29yZCA9PiB7XFxuICAgICAgICAgICAgZXZhbChmZXRjaChcXFwiaGlrZXI6Ly9hc3NldHMvaG9tZS5qc1xcXCIpKTtcXG4gICAgICAgICAgICBIaWtlckhvbWUubG9hZChcXFwiaW1wb3J0XFxcIiwgcGFzc3dvcmQpO1xcbiAgICAgICAgfSwgYmFja0NvZGUpO1xcbiAgICAgICAgYnJlYWs7XFxufVxcbmxldCBteV9jb2xfdHlwZSA9IFxcXCJ0ZXh0XzJcXFwiO1xcbmlmIChpbXBvcnRVcmwpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5a+85YWl6KeE5YiZXFxcIixcXG4gICAgICAgIHVybDogZGF0YUl0ZW0uaXNfc2FmZT9pbXBvcnRVcmw6J3RvYXN0Oi8v6aOO6Zmp6KeE5YiZ56aB5q2i5a+85YWlISEhJyxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KTtcXG59XFxuaWYgKHJ1bGVDb2RlKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWIhuS6q+WPo+S7pFxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJjb3B5Oi8vXFxcIiArIHJ1bGVDb2RlLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5cXG5pZiAoaW1wb3J0VXJsKSB7XFxuICAgIGlmIChkYXRhSXRlbS5pc19qc29uX2xpc3QgJiYgIWhhc1N1Yikge1xcbiAgICAgICAgbGV0IHN1Yl9ydWxlX2NvZGUgPSAn5rW36ZiU6KeG55WM5ZCI6ZuG6KeE5YiZ6K6i6ZiF77+laG9tZV9zdWLvv6UnICsgZGF0YUl0ZW0ubmFtZSArIFxcXCJAQFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG4gICAgICAgIGxldCBzdWJfdXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHN1Yl9ydWxlX2NvZGUpO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+iuoumYheWQiOmbhicsXFxuICAgICAgICAgICAgdXJsOiBzdWJfdXJsLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY3MDAwXFxcIj7lr7zlhaXovbvlkIjpm4Y8L3NwYW4+JyxcXG4gICAgICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZGF0YUl0ZW0sc3ViVXJsKT0+e1xcbiAgICAgICAgICAgICAgICBjb25zdCB7Z2VuUnVsZX09JC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvZ2VuQXBpXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBpbXBvcnRfcnVsZT1nZW5SdWxlKGRhdGFJdGVtLm5hbWUrXFxcIi5cXFwiK2RhdGFJdGVtLmF1dGhvcixzdWJVcmwpO1xcbiAgICAgICAgICAgICAgICAvL2NvcHkoaW1wb3J0X3J1bGUpO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZUNvZGU9cGFyc2VQYXN0ZShpbXBvcnRfcnVsZS5zcGxpdChcXFwiXFxcXG5cXFwiKVswXSk7XFxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gaW1wb3J0VXJsXFxuICAgICAgICAgICAgfSxkYXRhSXRlbSxydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCksXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCI8c21hbGw+5o+Q56S677ya5byA5Y+R6ICF5Y2V54us5YiG5Lqr55qE5ZCI6ZuG5paH5Lu25Y+q6IO95Y2V54us5a+85YWl44CCPC9zbWFsbD5cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH0gZWxzZSBpZiAoIWRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiAhaGFzU3ViICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PSAnaG9tZV9ydWxlX3VybCcpIHtcXG4gICAgICAgIGxldCBzdWJfcnVsZV9jb2RlID0gJ+a1t+mYlOinhueVjOWNleinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lJyArIGRhdGFJdGVtLm5hbWUgKyBcXFwiQEBcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyAnJmRlYnVnPXRydWUnO1xcbiAgICAgICAgbGV0IHN1Yl91cmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUoc3ViX3J1bGVfY29kZSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn6K6i6ZiF6KeE5YiZJyxcXG4gICAgICAgICAgICB1cmw6IHN1Yl91cmwsXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgICAgICB9KVxcbiAgICB9XFxufVxcbmlmIChkYXRhSXRlbS5pc19qc29uICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PT0gXFxcImhvbWVfcnVsZV91cmxcXFwiICYmICFkYXRhSXRlbS5pc19qc29uX2xpc3QpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn6L+b5YWl6aKR6YGTJyxcXG4gICAgICAgIHVybDogJCggLypcXFwiI25vTG9hZGluZyNcXFwiKi8gKS5sYXp5UnVsZSgobmFtZSxob21lKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGhvbWUpKTtcXG4gICAgICAgICAgICBsZXQgaGFzUnVsZSA9IHJ1bGVMaXN0LnNvbWUoaXRlbSA9PiBpdGVtLnRpdGxlID09PSBuYW1lKTtcXG4gICAgICAgICAgICBpZiAoaGFzUnVsZSkge1xcbiAgICAgICAgICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5iYWNrXFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gaG9tZStcXFwic0BcXFwiICsgbmFtZTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pyq5a6J6KOFXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBkYXRhSXRlbS5uYW1lLGFwaS5ob21lKSxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KVxcbn1cXG5sZXQgbWFuX3J1bGVfc2FmZSA9IGdldEFwaShcXFwibWFuUnVsZVNhZmVcXFwiKStkYXRhSXRlbS5pZDtcXG5sZXQgbWFuX3J1bGVfZ29vZCA9IGdldEFwaShcXFwibWFuUnVsZUdvb2RcXFwiKStkYXRhSXRlbS5pZDtcXG4vLyBkYXRhSXRlbS5pc19zYWZlO1xcbmlmKGdldFZhcignaG91c2UuaXNfbWFuYWdlcicpKXtcXG4gICAgZnVuY3Rpb24gc2V0SXNTYWZlKGZsYWcsbWFuX3J1bGVfc2FmZSkge1xcbiAgICAgICAgZmxhZyA9IGZsYWcgfHwgJyc7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBjb2RlID0gZmV0Y2gobWFuX3J1bGVfc2FmZSwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcIlVzZXItQWdlbnRcXFwiOiBNT0JJTEVfVUF9LFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1c2VybmFtZVxcXCI6IGdldFZhcignaG91c2UudXNlcm5hbWUnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogZ2V0VmFyKCdob3VzZS5wYXNzd29yZCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiaXNfc2FmZVxcXCI6ICEhZmxhZ1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGNvZGUgPSBKU09OLnBhcnNlKGNvZGUpLnJlc3VsdDtcXG4gICAgICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBlLm1lc3NhZ2VcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBmdW5jdGlvbiBzZXRJc0dvb2QoZmxhZyxtYW5fcnVsZV9nb29kKSB7XFxuICAgICAgICBmbGFnID0gZmxhZyB8fCAnJztcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IGNvZGUgPSBmZXRjaChtYW5fcnVsZV9nb29kLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFwiVXNlci1BZ2VudFxcXCI6IE1PQklMRV9VQX0sXFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInVzZXJuYW1lXFxcIjogZ2V0VmFyKCdob3VzZS51c2VybmFtZScpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBnZXRWYXIoJ2hvdXNlLnBhc3N3b3JkJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJpc19nb29kXFxcIjogISFmbGFnXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgY29kZSA9IEpTT04ucGFyc2UoY29kZSkucmVzdWx0O1xcbiAgICAgICAgICAgIGlmIChjb2RlLnN0YXR1cyA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZS5kZXRhaWxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgY29kZS5kZXRhaWxcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGUubWVzc2FnZVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon8J+aq+mjjumZqScsXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICB1cmw6JCgn5qCH6K6w6K+l6KeE5YiZ5Li66aOO6ZmpP+mjjumZqeinhOWImeaXoOazleiiq+WvvOWFpScpLmNvbmZpcm0oKGlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKT0+e1xcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc1NhZmUoZmFsc2UsbWFuX3J1bGVfc2FmZSk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifinIXmraPluLgnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uuato+W4uD8nKS5jb25maXJtKChpZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSk9PntcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNTYWZlKHRydWUsbWFuX3J1bGVfc2FmZSk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifimaXpnZ7kvJjotKgnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uumdnuS8mOi0qD8nKS5jb25maXJtKChpZCxtYW5fcnVsZV9nb29kLHNldElzR29vZCk9PntcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNHb29kKGZhbHNlLG1hbl9ydWxlX2dvb2QpO1xcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9nb29kLHNldElzR29vZClcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon8J+SluS8mOi0qCcsXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICB1cmw6JCgn5qCH6K6w6K+l6KeE5YiZ5Li65LyY6LSoPycpLmNvbmZpcm0oKGlkLG1hbl9ydWxlX2dvb2Qsc2V0SXNHb29kKT0+e1xcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc0dvb2QodHJ1ZSxtYW5fcnVsZV9nb29kKTtcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0sZGF0YUl0ZW0uaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpXFxuICAgIH0pO1xcbn1cXG5cXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmdvb2RfbnVtLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+i1ni5zdmdcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfM1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9NYWtlQWNvbW1lbnQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWVcXG4gICAgfVxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBkYXRhSXRlbS5iYWRfbnVtLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+i4qS5zdmdcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfM1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9NYWtlQWNvbW1lbnQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWUsXFxuICAgICAgICBkZWZhdWx0VHlwZTpcXFwiYmFkXFxcIlxcbiAgICB9XFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLor4TorrpcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+ivhOiuui5zdmdcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfM1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9NYWtlQWNvbW1lbnQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWVcXG4gICAgfVxcbn0pO1xcbmxldCB0b3RhbFN1bSA9IGRhdGFJdGVtLmdvb2RfbnVtICsgZGF0YUl0ZW0uYmFkX251bTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuivhOiuuihcXFwiICsgdG90YWxTdW0gKyBcXFwiKVxcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChodG1sVGFnKFxcXCJ1XFxcIiwgXFxcIuafpeeci+WFqOmDqOivhOiuuiA+XFxcIikpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9Db21tZW50XFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHkjZnlwYWdlI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICB0b3RhbFN1bTogdG90YWxTdW0sXFxuICAgICAgICBub19hY3RpdmU6IGZhbHNlXFxuICAgIH1cXG59KTtcXG4vL2NvbnN0IGxvbmdlc3RTdW09MTIwO1xcbmxldCBpY29uID0ge1xcbiAgICBcXFwiZ29vZFxcXCI6IFxcXCLwn5GNXFxcIixcXG4gICAgXFxcImJhZFxcXCI6IFxcXCLwn5GOXFxcIixcXG4gICAgXFxcInJlcGx5XFxcIjpcXFwi5byA5Y+R6ICF8J+Xo1xcXCJcXG59XFxuaWYgKHRvdGFsU3VtID09PSAwKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuS4gOadoeivhOiuuuS5n+ayoeacie+8jOW/q+adpeaKouaymeWPkeWQp++8gTwvaDU+XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICB9KTtcXG59IGVsc2Uge1xcbiAgICBsZXQgY29tbWVudExpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmRpc19nZXQgKyBkYXRhSXRlbS5pZCArIFxcXCI/bGltaXQ9NVxcXCIpKS5yZXN1bHQ7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXG4gICAgICAgIGxldCBSZXBseSA9IGl0ZW0uZGlzY3Vzc190eXBlPT09XFxcInJlcGx5XFxcIiYmaXRlbS5yZXBseV90b19uYW1lIT09ZmFsc2UmJml0ZW0ucmVwbHlfdG9faWQhPT1mYWxzZT9cXFwi4oCY4oCY5Zue5aSNQFxcXCIraXRlbS5yZXBseV90b19uYW1lK1xcXCIgI1xcXCIraXRlbS5kaXNjdXNzX2lkK1xcXCLigJnigJlcXFxcblxcXCI6XFxcIlxcXCI7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUgKyBcXFwiJm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9J2dyYXknPjxzbWFsbD4jXFxcIiArIGl0ZW0uaWQgKyBcXFwiPC9zbWFsbD48Zm9udD5cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgICAgICAvL3VybDogXFxcInRvYXN0Oi8vXFxcIiArIGl0ZW0ucXEsXFxuICAgICAgICAgICAgdXJsOlxcXCJtcXF3cGE6Ly9pbS9jaGF0P2NoYXRfdHlwZT13cGEmdWluPVxcXCIraXRlbS5xcSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5kaXNjdXNzX3RleHQsXFxuICAgICAgICAgICAgZGVzYzogUmVwbHkraXRlbS5jcmVhdGVfZGF0ZSArIFxcXCLCt1xcXCIgKyBpY29uW2l0ZW0uZGlzY3Vzc190eXBlXSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgICAgICAgbmFtZTppdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgIHR5cGU6XFxcImxvbmdfdGV4dFxcXCIsXFxuICAgICAgICAgICAgICAgIHRleHQ6aXRlbS5kaXNjdXNzX3RleHRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxufVxcblxcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcInJpY2hfdGV4dFwiLFwibmFtZVwiOlwi5p+l55yLXCIsXCJwYXRoXCI6XCJpbmZvXCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuafpeeci+OAjFxcXCIrTVlfUEFSQU1TLm5hbWUrXFxcIuOAjVxcXCIpXFxuc2V0UmVzdWx0KFt7XFxuICAgIHRpdGxlOiBNWV9QQVJBTVMudGV4dCxcXG4gICAgY29sX3R5cGU6TVlfUEFSQU1TLnR5cGVcXG59XSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlvIDlj5HogIXms6jlhoxcIixcInBhdGhcIjpcIlJlZ2lzdGVyXCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuW8gOWPkeiAheazqOWGjFxcXCIpO1xcbmNvbnN0IHtcXG4gICAgZ2V0QXBpLFxcbiAgICBodG1sVGFnLFxcbiAgICBtYXBDb2xUeXBlLFxcbiAgICBzbWFsbFxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG52YXIgZGF0YSA9IFtdO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuUGFzc3dvcmRcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5Vc2VybmFtZVxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLkRlc2NyaXB0aW9uXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuVXNlckFkZHJlc3NcXFwiKTtcXG59KSk7XFxuYWRkTGlzdGVuZXIoJ29uUmVmcmVzaCcsICQudG9TdHJpbmcoKCk9PntcXG4gICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuV2FpdFxcXCIsIFxcXCJcXFwiKTtcXG59KSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfotKblj7cnLFxcbiAgICBkZXNjOiBcXFwi6K+36L6T5YWl6LSm5Y+3KOW/heWhqylcXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UuVXNlcm5hbWUnLCAnJyksXFxuICAgICAgICB0eXBlOiBcXFwibnVtYmVyXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UuVXNlcm5hbWVcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0sIHtcXG4gICAgdGl0bGU6ICflr4bnoIEnLFxcbiAgICBkZXNjOiBcXFwi6K+36L6T5YWl5a+G56CBKOW/heWhqylcXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UuUGFzc3dvcmQnLCAnJyksXFxuICAgICAgICB0eXBlOiBcXFwicGFzc3dvcmRcXFwiLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5QYXNzd29yZFxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSk7XFxubWFwQ29sVHlwZShkYXRhLCBcXFwibGluZV9ibGFua1xcXCIsIDEpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn5pi156ewJyxcXG4gICAgZGVzYzogXFxcIuivt+i+k+WFpeaYteensCjlv4XloaspXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLlVzZXJBZGRyZXNzJywgJycpLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5Vc2VyQWRkcmVzc1xcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSwge1xcbiAgICB0aXRsZTogJ+aPj+i/sCcsXFxuICAgIGRlc2M6IFxcXCLor7Tor7TkuLrku4DkuYjopoHms6jlhozlkKdcXFxcbijlj6/ku6Xlop7liqDpgJrov4fmpoLnjocs6YCJ5aGrKVxcXCIsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5EZXNjcmlwdGlvbicsICcnKSxcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLkRlc2NyaXB0aW9uXFxcIixpbnB1dCknXFxuICAgIH1cXG59KVxcblxcbm1hcENvbFR5cGUoZGF0YSwgXFxcImxpbmVfYmxhbmtcXFwiLCAxKTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYlxcXCIsIFxcXCLms6jlhoxcXFwiKSxcXG4gICAgdXJsOiAkKGdldEFwaShcXFwibmV3X2RldlxcXCIpK1xcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChnZXRJZCwgY29uZmlybSkgPT4ge1xcbiAgICAgICAgbGV0IHVzZXJuYW1lID0gZ2V0VmFyKCdXYXJlaG91c2UuVXNlcm5hbWUnLCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgcGFzc3dvcmQgPSBnZXRWYXIoJ1dhcmVob3VzZS5QYXNzd29yZCcsIFxcXCJcXFwiKSxcXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGdldFZhcignV2FyZWhvdXNlLkRlc2NyaXB0aW9uJywgXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIG5hbWUgPSBnZXRWYXIoXFxcIldhcmVob3VzZS5Vc2VyQWRkcmVzc1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGlmIChbdXNlcm5hbWUsIHBhc3N3b3JkLCBuYW1lXS5pbmNsdWRlcyhcXFwiXFxcIikpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6LSm5Y+3LOWvhueggeWSjOaYteensOS4jeiDveS4uuepulxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBzaG93TG9hZGluZyhcXFwi5q2j5Zyo5o+Q5Lqk55Sz6K+36KGoXFxcIik7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCwge1xcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInJlYXNvblxcXCI6IGRlc2NyaXB0aW9uLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIm5hbWVcXFwiOiBuYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogcGFzc3dvcmQsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicXFcXFwiOiB1c2VybmFtZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgbWV0aG9kOiAncG9zdCdcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG4gICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBpZHJlc3VsdCA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRJZCArIFxcXCI/cXE9XFxcIiArIHVzZXJuYW1lKSk7XFxuICAgICAgICBpZiAoaWRyZXN1bHQuc3RhdHVzICE9PSAwKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBpZHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICB9XFxuICAgICAgICBcXG4gICAgICAgIHJldHVybiAkKFxcXCJcXFwiLCBcXFwi6L6T5YWl6YKu566x6aqM6K+B56CBXFxcXG5cXFwiICsgcmVzdWx0LmRldGFpbCkuaW5wdXQoKGNvbmZpcm0sIGlkLCBhY2NvdW50KSA9PiB7XFxuICAgICAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuivt+iAkOW/g+etieW+hVxcXCIpO1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGNvbmZpcm0sIHtcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJyZWdpc3RfaWRcXFwiOiBpZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInl6bVxcXCI6IGlucHV0XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZVVzZXJuYW1lXFxcIiwgYWNjb3VudFswXSk7XFxuICAgICAgICAgICAgICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZVBhc3N3b3JkXFxcIiwgYWNjb3VudFsxXSk7XFxuICAgICAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aIkOWKn+aPkOS6pOazqOWGjOazqOWGjFxcXFxuXFxcIityZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Ye66ZSZ5LqG5ZGQXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBjb25maXJtLCBpZHJlc3VsdC5yZXN1bHQsIFt1c2VybmFtZSwgcGFzc3dvcmRdKTtcXG4gICAgfSwgZ2V0QXBpKFxcXCJuZXdfZ2V0SWRcXFwiKSwgZ2V0QXBpKFxcXCJuZXdfY29uZmlybVxcXCIpKSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbn0pO1xcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcInRleHRfMVwiLFwibmFtZVwiOlwi5Liq5Lq66LWE5paZXCIsXCJwYXRoXCI6XCJQZXJzb25hbERhdGFcIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi5Liq5Lq66LWE5paZXFxcIik7XFxudmFyIGRhdGE9W107XFxuY29uc3Qge1xcbiAgICBnZXRBcGksXFxuICAgIGdldEZpbGUsXFxuICAgIGFwaVxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTpcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5cXG5sZXQge3VzZXJuYW1lLHBhc3N3b3JkfSA9IGdldEZpbGUoKTtcXG5sZXQgZGV2ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwidXNlclxcXCIpK01ZX1BBUkFNUy5pZCkpLnJlc3VsdDtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi5aS05YOPXFxcIixcXG4gICAgZGVzYzpkZXYuYXZhdGFyLFxcbiAgICB1cmw6XFxcImhpa2VyOi8vcGFnZS9tb2RpZnlfUGVyc29uYWxEYXRhI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOntcXG4gICAgICAgIGRldjpkZXYsXFxuICAgICAgICB1c2VybmFtZTp1c2VybmFtZSxcXG4gICAgICAgIHBhc3N3b3JkOnBhc3N3b3JkLFxcbiAgICAgICAgUGF0dGVybjowXFxuICAgIH0sXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuXFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIuaYteensFxcXCIsXFxuICAgIGRlc2M6ZGV2Lm5hbWUsXFxuICAgIHVybDpcXFwiaGlrZXI6Ly9wYWdlL21vZGlmeV9QZXJzb25hbERhdGEjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6e1xcbiAgICAgICAgZGV2OmRldixcXG4gICAgICAgIHVzZXJuYW1lOnVzZXJuYW1lLFxcbiAgICAgICAgcGFzc3dvcmQ6cGFzc3dvcmQsXFxuICAgICAgICBQYXR0ZXJuOjFcXG4gICAgfSxcXG4gICAgY29sX3R5cGU6XFxcInRleHRfMVxcXCJcXG59KTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi5a+G56CBXFxcIixcXG4gICAgdXJsOlxcXCJoaWtlcjovL3BhZ2UvbW9kaWZ5X1BlcnNvbmFsRGF0YSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYTp7XFxuICAgICAgICBkZXY6ZGV2LFxcbiAgICAgICAgdXNlcm5hbWU6dXNlcm5hbWUsXFxuICAgICAgICBwYXNzd29yZDpwYXNzd29yZCxcXG4gICAgICAgIFBhdHRlcm46MlxcbiAgICB9LFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOlxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLotKblj7fvvJpcXFwiK3VzZXJuYW1lLFxcbiAgICB1cmw6XFxcImNvcHk6Ly9cXFwiK3VzZXJuYW1lLFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCJVSUTvvJpcXFwiK2Rldi5pZCxcXG4gICAgdXJsOlxcXCJjb3B5Oi8vXFxcIitkZXYuaWQsXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6XFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIuaPkOS6pOS6keS7k+W6k+inhOWImVxcXCIsXFxuICAgIHVybDokKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChob3N0KT0+e1xcbiAgICAgICAgbGV0IGNvZGU9cmVxdWVzdChob3N0K1xcXCIvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD0xNDVcXFwiKTtcXG4gICAgICAgIGxldCB3b3JkPVxcXCLvv6VwdWJsaXNo77+lXFxcIitiYXNlNjRFbmNvZGUoY29kZSk7XFxuICAgICAgICByZXR1cm4gXFxcInJ1bGU6Ly9cXFwiK2Jhc2U2NEVuY29kZSh3b3JkKTtcXG4gICAgfSxhcGkuaG9zdCksXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIuWQjOatpeaPkOS6pOS6keS7k+W6k+i0puWPt+WvhueggVxcXCIsXFxuICAgIHVybDpcXFwicnVsZTovL1xcXCIrYmFzZTY0RW5jb2RlKFxcXCLvv6VwdWJsaXNoX2FjY291bnTvv6VcXFwiK3VzZXJuYW1lK1xcXCJAXFxcIitwYXNzd29yZCksXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6XFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIuS9oOS4gOWFseWPkeW4g+S6huOAjFxcXCIrZGV2LnJ1bGVfbnVtK1xcXCLjgI3mnaHop4TliJlcXFwiLFxcbiAgICB1cmw6XFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOlxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmxldCB1c2VyID0gZ2V0RmlsZSgpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLms6jplIDnmbvlvZVcXFwiLFxcbiAgICB1cmw6JChcXFwi56Gu6K6k5rOo6ZSA55m75b2VP1xcXCIpLmNvbmZpcm0oZiA9PiB7XFxuICAgICAgICBmLnVzZXJuYW1lPVxcXCJcXFwiO1xcbiAgICAgICAgZi5wYXNzd29yZD1cXFwiXFxcIjtcXG4gICAgICAgIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb24nLCBKU09OLnN0cmluZ2lmeShmKSk7XFxuICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5iYWNrXFxcIixcXFwiMVxcXCIpO1xcbiAgICAgICAgYmFjaygpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suazqOmUgFxcXCI7XFxuICAgIH0sdXNlciksXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbn0pO1xcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuabtOaUueS4quS6uui1hOaWmVwiLFwicGF0aFwiOlwibW9kaWZ5X1BlcnNvbmFsRGF0YVwiLFwicnVsZVwiOlwianM6XFxuY29uc3Qge1xcbiAgICBnZXRBcGksXFxuICAgIGNvbG9yLFxcbiAgICBzbWFsbCxcXG4gICAgZ2V0RmlsZSxcXG4gICAgaHRtbFRhZ1xcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5sZXQge1xcbiAgICBkZXYsXFxuICAgIHVzZXJuYW1lLFxcbiAgICBwYXNzd29yZCxcXG4gICAgUGF0dGVyblxcbn0gPSBNWV9QQVJBTVM7XFxudmFyIGRhdGEgPSBbXTtcXG5sZXQgcGF0aCA9IFxcXCI/cXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQ7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5tLnBldE5hbWVcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5tLmF2YXRhclxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQuY1xcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQueFxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQueVxcXCIpO1xcbn0pKTtcXG5mdW5jdGlvbiBtX3BldE5hbWUoKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgICAgICBkZXNjOiBcXFwi6K+36L6T5YWl5paw5pi156ewXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0ucGV0TmFtZScsICcnKXx8ZGV2Lm5hbWUsXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5tLnBldE5hbWVcXFwiLGlucHV0KSdcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLkv53lrZhcXFwiLFxcbiAgICAgICAgdXJsOiAkKGdldEFwaShcXFwibW9kaWZ5X25hbWVcXFwiKSArIHBhdGgpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICBsZXQgbmV3UGV0TmFtZSA9IGdldFZhcignV2FyZWhvdXNlLm0ucGV0TmFtZScsICcnKTtcXG4gICAgICAgICAgICBpZiAobmV3UGV0TmFtZSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L2g6L+Y5LuA5LmI6YO95rKh5aGr5ZWKIVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0ICsgXFxcIiZuYW1lPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQobmV3UGV0TmFtZSkpO1xcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG4gICAgfSk7XFxufVxcblxcbmZ1bmN0aW9uIG1fYXZhdGFyKCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICAgICAgZGVzYzogXFxcIuivt+i+k+WFpeaWsOeahOWktOWDj+mTvuaOpVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLmF2YXRhcicsICcnKSB8fCBkZXYuYXZhdGFyLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UubS5hdmF0YXJcXFwiLGlucHV0KSdcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLkv53lrZhcXFwiLFxcbiAgICAgICAgdXJsOiAkKGdldEFwaShcXFwibW9kaWZ5X2F2YVxcXCIpICsgcGF0aCkubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBuZXdBdmF0YXIgPSBnZXRWYXIoJ1dhcmVob3VzZS5tLmF2YXRhcicsICcnKTtcXG4gICAgICAgICAgICBcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCArIFxcXCImYXZhdGFyX3VybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG5ld0F2YXRhcikpO1xcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG4gICAgfSk7XFxufVxcblxcbmZ1bmN0aW9uIG1fcHdkKCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOlxcXCLljp/lr4bnoIFcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgICAgICBkZXNjOiBcXFwi6K+36L6T5YWl5Y6f5a+G56CBXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgdHlwZTpcXFwicGFzc3dvcmRcXFwiLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC55JywgJycpLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC55XFxcIixpbnB1dCknXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOlxcXCLmlrDlr4bnoIFcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgICAgICBkZXNjOiBcXFwi6K+36L6T5YWl5paw5a+G56CBXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgdHlwZTpcXFwicGFzc3dvcmRcXFwiLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC54JywgJycpLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC54XFxcIixpbnB1dCknXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6XFxcIumHjeWkjeaWsOWvhueggVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgICAgIGRlc2M6IFxcXCLor7fph43lpI3mlrDlr4bnoIFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0eXBlOlxcXCJwYXNzd29yZFxcXCIsXFxuICAgICAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQuYycsICcnKSxcXG4gICAgICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQuY1xcXCIsaW5wdXQpJ1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuS/neWtmFxcXCIsXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXCJtb2RpZnlfcHdkXFxcIikrcGF0aCkubGF6eVJ1bGUoKHBhc3N3b3JkLHVzZXJuYW1lKSA9PiB7XFxuICAgICAgICAgICAgbGV0IG9sZF9wYXNzd29yZCA9IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQueScsICcnKTtcXG4gICAgICAgICAgICBsZXQgbmV3X3Bhc3N3b3JkID0gZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC54JywgJycpO1xcbiAgICAgICAgICAgIGxldCBuZXdfcGFzc3dvcmRfYWdhaW4gPSBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLmMnLCAnJyk7XFxuICAgICAgICAgICAgaWYgKG9sZF9wYXNzd29yZCE9PXBhc3N3b3JkKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/ljp/lr4bnoIHplJnor69cXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZihuZXdfcGFzc3dvcmQ9PT1cXFwiXFxcIil7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/or7fovpPlhaXmlrDlr4bnoIFcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZihuZXdfcGFzc3dvcmQhPT1uZXdfcGFzc3dvcmRfYWdhaW4pe1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Lik5qyh5a+G56CB5LiN5ZCMXFxcIlxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCArIFxcXCImbmV3X3Bhc3N3b3JkPVxcXCIgKyBuZXdfcGFzc3dvcmQrXFxcIiZuZXdfcGFzc3dvcmRfcmU9XFxcIituZXdfcGFzc3dvcmRfYWdhaW4pO1xcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcIixKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgICAgICB1c2VybmFtZTp1c2VybmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkOm5ld19wYXNzd29yZFxcbiAgICAgICAgICAgICAgICB9KSk7XFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0scGFzc3dvcmQsdXNlcm5hbWUpLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbiAgICB9KTtcXG59XFxuXFxuc3dpdGNoIChQYXR0ZXJuKSB7XFxuICAgIGNhc2UgMDpcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFwi5L+u5pS55aS05YOPXFxcIik7XFxuICAgICAgICBtX2F2YXRhcigpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgMTpcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFwi5L+u5pS55pi156ewXFxcIik7XFxuICAgICAgICBtX3BldE5hbWUoKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlIDI6XFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcIuS/ruaUueWvhueggVxcXCIpO1xcbiAgICAgICAgbV9wd2QoKTtcXG4gICAgICAgIGJyZWFrO1xcbn1cXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLnvJbovpHop4TliJnlpIfms6hcIixcInBhdGhcIjpcInNldF9ydWxlX25vdGVzXCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZGF0YSA9IFtdO1xcbmNvbnN0IHtcXG4gICAgZ2V0QXBpXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGlkLFxcbiAgICB1c2VybmFtZSxcXG4gICAgcGFzc3dvcmQsXFxuICAgIG5hbWVcXG59ID0gTVlfUEFSQU1TO1xcbnNldFBhZ2VUaXRsZShcXFwi5aSH5rOo44CMXFxcIituYW1lK1xcXCLjgI1cXFwiKTtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsXFxcImNsZWFyVmFyKCdXYXJlaG91c2UucnVsZS5ub3RlcycsICcnKVxcXCIpO1xcbmxldCBub3Rlcz1yZXF1ZXN0KGdldEFwaShcXFwiZ2V0X3J1bGVfbm90ZVxcXCIpK2lkKTtcXG5ub3Rlcz1KU09OLnBhcnNlKG5vdGVzKS5yZXN1bHQ7XFxuZGF0YS5wdXNoKHtcXG4gICAgZGVzYzogXFxcIuinhOWImeWkh+azqC4uLi4uLlxcXCIsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UucnVsZS5ub3RlcycsICcnKXx8bm90ZXN8fFxcXCJcXFwiLFxcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDotMSxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UucnVsZS5ub3Rlc1xcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLkv53lrZhcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB1cmw6ICQoZ2V0QXBpKFxcXCJzZXRfcnVsZV9ub3RlXFxcIikgKyBpZCkubGF6eVJ1bGUoKHVzZXJuYW1lLCBwYXNzd29yZCkgPT4ge1xcbiAgICAgICAgbGV0IG5vdGVzID0gZ2V0VmFyKCdXYXJlaG91c2UucnVsZS5ub3RlcycsICcnKTtcXG4gICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0LCB7XFxuICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicXFcXFwiOiB1c2VybmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IHBhc3N3b3JkLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIm5vdGVcXFwiOm5vdGVzXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgfSk7XFxuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICB9XFxuICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbiAgICB9LCB1c2VybmFtZSwgcGFzc3dvcmQpXFxufSk7XFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwibGluZVwiLFwibmFtZVwiOlwi6K+E6K665YiX6KGoXCIsXCJwYXRoXCI6XCJDb21tZW50XCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuivhOiuuuWIl+ihqFxcXCIpO1xcbmNvbnN0IHtcXG4gICAgYXBpXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCBkYXRhID0gW107XFxubGV0IHtcXG4gICAgdG90YWxTdW0sXFxuICAgIGlkLFxcbiAgICBub19hY3RpdmUsXFxuICAgIHVzZXJuYW1lLFxcbiAgICBwYXNzd29yZFxcbn0gPSBNWV9QQVJBTVM7XFxubGV0IHBhZ2UgPSBwYXJzZUludChNWV9VUkwuc3BsaXQoXFxcIiNcXFwiKVsxXSk7XFxubGV0IGRpc2N1c3NfdHlwZSA9IGdldFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcIiwgXFxcIlxcXCIpO1xcbmlmIChwYWdlID09PSAxKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBhZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFwiLCBcXFwiXFxcIik7XFxuICAgIH0pKTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5YWo6YOoXFxcIiArIChkaXNjdXNzX3R5cGUgPT09IFxcXCJcXFwiID8gXFxcIuKXiVxcXCIgOiBcXFwi4peLXFxcIiksXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzQnXFxuXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLwn5GN6LWeXFxcIiArIChkaXNjdXNzX3R5cGUgPT09IFxcXCJnb29kXFxcIiA/IFxcXCLil4lcXFwiIDogXFxcIuKXi1xcXCIpLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXCIsIFxcXCJnb29kXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfNCdcXG5cXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIvCfkY7ouKlcXFwiICsgKGRpc2N1c3NfdHlwZSA9PT0gXFxcImJhZFxcXCIgPyBcXFwi4peJXFxcIiA6IFxcXCLil4tcXFwiKSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFwiLCBcXFwiYmFkXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfNCdcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWbnuWkjVxcXCIgKyAoZGlzY3Vzc190eXBlID09PSBcXFwicmVwbHlcXFwiID8gXFxcIuKXiVxcXCIgOiBcXFwi4peLXFxcIiksXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcIiwgXFxcInJlcGx5XFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfNCdcXG4gICAgfSk7XFxufVxcblxcblxcbmxldCBpY29uID0ge1xcbiAgICBcXFwiZ29vZFxcXCI6IFxcXCLwn5GNXFxcIixcXG4gICAgXFxcImJhZFxcXCI6IFxcXCLwn5GOXFxcIixcXG4gICAgXFxcInJlcGx5XFxcIjpcXFwi5byA5Y+R6ICF8J+Xo1xcXCJcXG59XFxubGV0IGNvbnRyb2w9KHBpZCxhY3RpdmUpPT52b2lkIDA7XFxuaWYobm9fYWN0aXZlKXtcXG4gICAgY29udHJvbD1mdW5jdGlvbihwaWQsYWN0aXZlKXtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6YWN0aXZlP1xcXCLpmpDol4/or4TorrpcXFwiOlxcXCLlsZXnpLror4TorrpcXFwiLFxcbiAgICAgICAgICAgIHVybDokKGFwaS5kaXNfZGV2X2NvbnRyb2wrcGlkK1xcXCI/cXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQrXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCk9PntcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdD1KU09OLnBhcnNlKHJlcXVlc3QoaW5wdXQpKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiK3Jlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgY29sX3R5cGU6XFxcInRleHRfMlxcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTpcXFwi5Yig6Zmk6K+E6K66XFxcIixcXG4gICAgICAgICAgICB1cmw6JChcXFwi56Gu6K6k5Yig6Zmk6K+l6K+E6K66P1xcXCIpLmNvbmZpcm0oKGlucHV0KT0+e1xcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0PUpTT04ucGFyc2UocmVxdWVzdChpbnB1dCkpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIrcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICB9LGFwaS5kaXNfZGV2X2NvbnRyb2wrcGlkK1xcXCI/cXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQrXFxcIiZkZWxldGU9MVxcXCIpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzJcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6XFxcImxpbmVcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6XFxcImxpbmVcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5pZiAodG90YWxTdW0gPT09IDApIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5LiA5p2h6K+E6K665Lmf5rKh5pyJ77yM5b+r5p2l5oqi5rKZ5Y+R5ZCn77yBPC9oNT5cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0pO1xcbn0gZWxzZSB7XFxuICAgIGxldCBjb21tZW50TGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuZGlzX2dldCArIGlkICsgXFxcIj9saW1pdD01JnBhZ2U9XFxcIiArIHBhZ2UgKyBcXFwiJm5vX2FjdGl2ZT1cXFwiICsgbm9fYWN0aXZlICsgXFxcIiZkaXNjdXNzX3R5cGU9XFxcIiArIGRpc2N1c3NfdHlwZSkpLnJlc3VsdDtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjb21tZW50TGlzdCkge1xcbiAgICAgICAgbGV0IFJlcGx5ID0gaXRlbS5kaXNjdXNzX3R5cGU9PT1cXFwicmVwbHlcXFwiJiZpdGVtLnJlcGx5X3RvX25hbWUhPT1mYWxzZSYmaXRlbS5yZXBseV90b19pZCE9PWZhbHNlP1xcXCLigJjigJjlm57lpI1AXFxcIitpdGVtLnJlcGx5X3RvX25hbWUrXFxcIiAjXFxcIitpdGVtLmRpc2N1c3NfaWQrXFxcIuKAmeKAmVxcXFxuXFxcIjpcXFwiXFxcIjtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSArIFxcXCImbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0nZ3JheSc+PHNtYWxsPiNcXFwiICsgaXRlbS5pZCArIFxcXCI8L3NtYWxsPjxmb250PlxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgICAgIC8vdXJsOiBub19hY3RpdmU/XFxcImhpa2VyOi8vcGFnZS9SZXBseVxcXCI6XFxcInRvYXN0Oi8vXFxcIiArIGl0ZW0ucXEsXFxuXFx0XFx0ICAgICAgIHVybDpub19hY3RpdmU/XFxcImhpa2VyOi8vcGFnZS9SZXBseVxcXCI6XFxcIm1xcXdwYTovL2ltL2NoYXQ/Y2hhdF90eXBlPXdwYSZ1aW49XFxcIitpdGVtLnFxLFxcbiAgICAgICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgICAgICAgcnVsZUlkOiBpZCxcXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXFxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcXG4gICAgICAgICAgICAgICAgcmVwbHlJZDppdGVtLmlkXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5kaXNjdXNzX3RleHQsXFxuICAgICAgICAgICAgZGVzYzogUmVwbHkraXRlbS5jcmVhdGVfZGF0ZSArIFxcXCLCt1xcXCIgKyBpY29uW2l0ZW0uZGlzY3Vzc190eXBlXSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgICAgICAgbmFtZTppdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgIHR5cGU6XFxcImxvbmdfdGV4dFxcXCIsXFxuICAgICAgICAgICAgICAgIHRleHQ6aXRlbS5kaXNjdXNzX3RleHRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgICAgICBjb250cm9sKGl0ZW0uaWQsaXRlbS5hY3RpdmUpO1xcbiAgICB9XFxuICAgIGlmIChjb21tZW50TGlzdC5sZW5ndGggPT09IDApIHtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxuXFxuc2V0UmVzdWx0KGRhdGEpXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlj5Hooajor4TorrpcIixcInBhdGhcIjpcIk1ha2VBY29tbWVudFwiLFwicnVsZVwiOlwianM6XFxubGV0IGRhdGEgPSBbXTtcXG5jb25zdCB7XFxuICAgIGFwaSxcXG4gICAgZ2V0RmlsZVxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5sZXQge1xcbiAgICBpZCxcXG4gICAgbmFtZSxcXG4gICAgZGVmYXVsdFR5cGVcXG59ID0gTVlfUEFSQU1TO1xcbmxldCB1c2VyPWdldEZpbGUoKS51c2VyfHxbXFxcIlxcXCIsXFxcIlxcXCJdO1xcblxcbnNldFBhZ2VUaXRsZShcXFwi6K+E6K66KFxcXCIgKyBuYW1lICsgXFxcIilcXFwiKTtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudHlwZVxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudGV4dFxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQucXFcXFwiKTtcXG4gICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbn0pKTtcXG5sZXQgdHlwZSA9IGdldFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudHlwZVxcXCIpIHx8IGRlZmF1bHRUeXBlfHxcXFwiZ29vZFxcXCI7XFxuZGF0YS5wdXNoKHtcXG4gICAgZGVzYzogXFxcIuivhOiuui4uLi4uLlxcXCIsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UuY29tbWVudC50ZXh0JywgJycpLFxcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDo3LFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnRleHRcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLotKblj7fvvJpcXFwiKyh1c2VyWzBdfHxcXFwiXFxcIiksXFxuICAgIGRlc2M6XFxcIumqjOivgeegge+8mlxcXCIrKHVzZXJbMV18fFxcXCJcXFwiKSxcXG4gICAgdXJsOlxcXCJoaWtlcjovL3BhZ2UvVXNlcnJlZ2lzdHJhdGlvblxcXCIsXFxuICAgIGNvbF90eXBlOiAndGV4dF8xJyxcXG4gICAgXFxufSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICAodHlwZSA9PT0gXFxcImdvb2RcXFwiID8gXFxcIuKXiVxcXCIgOiBcXFwi4peLXFxcIikrXFxcIiDwn5GNXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudHlwZVxcXCIsIFxcXCJnb29kXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiAndGV4dF8yJ1xcblxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAgKHR5cGUgPT09IFxcXCJiYWRcXFwiID8gXFxcIuKXiVxcXCIgOiBcXFwi4peLXFxcIikrXFxcIiDwn5GOXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudHlwZVxcXCIsIFxcXCJiYWRcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxufSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmj5DkuqRcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB1cmw6ICQoYXBpLmRpc19uZXcgKyBpZCkubGF6eVJ1bGUoKEFjY291bnQpID0+IHtcXG4gICAgICAgIGxldCB0ZXh0ID0gZ2V0VmFyKCdXYXJlaG91c2UuY29tbWVudC50ZXh0JywgJycpO1xcbiAgICAgICAgbGV0IFtxcSxhdXRoX2NvZGVdID0gQWNjb3VudDtcXG4gICAgICAgIGxldCB0eXBlID0gZ2V0VmFyKCdXYXJlaG91c2UuY29tbWVudC50eXBlJykgfHwgJ2dvb2QnO1xcbiAgICAgICAgcXE9cXF8fFxcXCJcXFwiO1xcbiAgICAgICAgYXV0aF9jb2RlPWF1dGhfY29kZXx8XFxcIlxcXCI7XFxuICAgICAgICBpZihxcT09XFxcIlxcXCJ8fGF1dGhfY29kZT09XFxcIlxcXCIpe1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mnKrnmbvlvZXotKblj7dcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYodGV4dD09XFxcIlxcXCIpe1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHlhpnllYpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgZnVuY3Rpb24gcihwKSB7XFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwKSxcXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBwID0ge1xcbiAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgIFxcXCJkaXNjdXNzX3RleHRcXFwiOiB0ZXh0LFxcbiAgICAgICAgICAgICAgICBcXFwicXFcXFwiOiBxcSxcXG4gICAgICAgICAgICAgICAgXFxcImRpc2N1c3NfdHlwZVxcXCI6IHR5cGUsXFxuICAgICAgICAgICAgICAgIFxcXCJhdXRoX2NvZGVcXFwiOiBhdXRoX2NvZGVcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcmVzdWx0ID0gcihwKTtcXG4gICAgICAgIGlmKHJlc3VsdC5zdGF0dXM9PT0wKXtcXG4gICAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiK3Jlc3VsdC5kZXRhaWw7XFxuXFxuICAgIH0sdXNlcilcXG59KTtcXG5cXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLkvKrnlKjmiLfms6jlhoxcIixcInBhdGhcIjpcIlVzZXJyZWdpc3RyYXRpb25cIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IHtcXG4gICAgYXBpLFxcbiAgICBnZXRGaWxlLFxcbiAgICBnZXRVc2VyRGF0ZVxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5sZXQgZGF0YSA9IFtdO1xcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5zZXRQYWdlVGl0bGUoXFxcIueUqOaIt+WIl+ihqOeuoeeQhlxcXCIpO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UubS5xcVxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLm0ueXptXFxcIik7XFxufSkpO1xcbmxldCB1c2VyID0gZ2V0RmlsZSgpO1xcbmxldCB1c2VyTmFtZSA9IHVzZXIudXNlciB8fCBbXFxcIlxcXCJdO1xcbnVzZXJOYW1lID0gdXNlck5hbWVbMF07XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ08YmlnPijmt7vliqAv6aqM6K+BKei0puWPtzwvYmlnPlxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG59KTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuiOt+WPllxcXCIsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBkZXNjOiBcXFwi6K+36L6T5YWlcXFcXFwiLFxcbiAgICB1cmw6ICQudG9TdHJpbmcoKGEsIGIpID0+IHtcXG4gICAgICAgIGxldCBxcSA9IGlucHV0O1xcbiAgICAgICAgaWYgKHFxID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S9oOi/mOS7gOS5iOmDveayoeWhq+WViiFcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuiOt+WPluS4rS4uLlxcXCIpXFxuICAgICAgICByZXR1cm4gJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgocXEsIGEsIGIpID0+IHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoYSwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcInFxXFxcIjogcXFcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdDIgPSBKU09OLnBhcnNlKHJlcXVlc3QoYiArIFxcXCI/cXE9XFxcIiArIHFxKSk7XFxuICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0Mi5kZXRhaWw7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgdGhyb3cgZTtcXG4gICAgICAgIH1cXG4gICAgICAgIH0sIHFxLCBhLCBiKTtcXG5cXG4gICAgfSwgYXBpLmRpc19uZXdfdXNlciwgYXBpLmRpc192ZXJpZnkpLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdHlwZTogXFxcIm51bWJlclxcXCIsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0ucXEnLCAnJykgfHwgdXNlck5hbWUsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLm0ucXFcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0pO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBkZXNjOiBcXFwi6K+36L6T5YWl6aqM6K+B56CBXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0ueXptJywgJycpLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5tLnl6bVxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6ICdyaWNoX3RleHQnLFxcbiAgICB0aXRsZTogXFxcIjxzbWFsbD7mj5DnpLrvvJoxLuavj+WkqeWPquiDveiOt+WPljXmrKHpqozor4HnoIEuPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzIuPHM+6aqM6K+B56CB5pyJ5pWI5pyf5oyB57ut5LiA5ZGo5bem5Y+zPC9zPijmmoLml7bkuI3kvJrvvIzlv5jorrDpqozor4HnoIHlj6/pgJrov4dRUeWPt+iOt+WPlik8L3NtYWxsPlxcXCJcXG59KTtcXG5cXG5sZXQgdXNlckxpc3QgPSBnZXRVc2VyRGF0ZSgpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6aqM6K+BL+eZu+W9lVxcXCIsXFxuICAgIHVybDogJChcXFwi56Gu5a6a5L+d5a2Y77yM6aqM6K+B56CB5aGr6ZSZ77yM5peg5rOV6K+E6K665ZOmXFxcIikuY29uZmlybSgoZiwgbCwgbG9naW4pID0+IHtcXG4gICAgICAgIGxldCBxcSA9IGdldFZhcignV2FyZWhvdXNlLm0ucXEnLCAnJyk7XFxuICAgICAgICBsZXQgeXptID0gZ2V0VmFyKCdXYXJlaG91c2UubS55em0nLCAnJyk7XFxuICAgICAgICBpZiAocXEgPT0gXFxcIlxcXCIgfHwgeXptID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL3Fx5oiW6aqM6K+B56CB5Li656m6XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGxvZ2luLCB7XFxuICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicXFcXFwiOiBxcSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJhdXRoX2NvZGVcXFwiOiB5em1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcbiAgICAgICAgICAgIGYudXNlciA9IFtxcSwgeXptXTtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoZikpO1xcbiAgICAgICAgICAgIGxldCBpbmRleCA9IGwuZmluZEluZGV4KGl0ZW0gPT4gaXRlbVswXSA9PT0gcXEpO1xcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XFxuICAgICAgICAgICAgICAgIGwuc3BsaWNlKGluZGV4LCAxLCBbcXEsIHl6bV0pO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobC5sZW5ndGggPCA2KSB7XFxuICAgICAgICAgICAgICAgIGwucHVzaChbcXEsIHl6bV0pO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGwuc3BsaWNlKDAsIDEpO1xcbiAgICAgICAgICAgICAgICBsLnB1c2goW3FxLCB5em1dKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVJBLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShsKSk7XFxuICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/pqozor4HmiJDlip9cXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICB9LCB1c2VyLCB1c2VyTGlzdCwgYXBpLmRpc19sb2dpbiksXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ08YmlnPui0puWPt+WIl+ihqDwvYmlnPlxcXFx0XFxcXHRcXFxcdDxzbWFsbD4o5L+d55WZNeadoeiusOW9lSk8L3NtYWxsPlxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG59KTtcXG51c2VyTGlzdC5yZXZlcnNlKCk7XFxuXFxuZm9yIChsZXQgaXRlbSBvZiB1c2VyTGlzdCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLotKblj7fvvJpcXFwiICsgaXRlbVswXSArICh1c2VyTmFtZSA9PT0gaXRlbVswXSA/IFxcXCJcXFxcdFxcXFx0XFxcXHTigJzigJxb5b2T5YmN6LSm5Y+3XeKAneKAnVxcXCIgOiBcXFwiXFxcIiksXFxuICAgICAgICBkZXNjOiBcXFwi6aqM6K+B56CB77yaXFxcIiArIGl0ZW1bMV0sXFxuICAgICAgICB1cmw6ICQoXFxcIuaYr+WQpuWIh+aNouS4uuivpVtcXFwiICsgaXRlbVswXSArIFxcXCJd6LSm5Y+3XFxcIikuY29uZmlybSgoZiwgaXRlbSkgPT4ge1xcbiAgICAgICAgICAgIGYudXNlciA9IGl0ZW07XFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGYpKTtcXG4gICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIh+aNouaIkOWKn1xcXCI7XFxuICAgICAgICB9LCB1c2VyLCBpdGVtKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbiAgICB9KTtcXG59XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6YCA5Ye66LSm5Y+3XFxcIixcXG4gICAgdXJsOiAkKFxcXCLnoa7orqTpgIDlh7rnmbvlvZXnirbmgIFcXFwiKS5jb25maXJtKChmKSA9PiB7XFxuICAgICAgICBmLnVzZXIgPSBbXTtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShmKSk7XFxuICAgICAgICBiYWNrKCk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6YCA5Ye65oiQ5YqfXFxcIjtcXG4gICAgfSwgdXNlciksXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG59KTtcXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLliJfooajmjpLluo/nrpfms5VcIixcInBhdGhcIjpcInNvcnRcIixcInJ1bGVcIjpcImpzOlxcbi8qIOinhOWImeWIl+ihqOaOkuW6jyBbIFVQ44CBTkVX44CB5peg5pu05pawIF0g6aG65bqPICovXFxuLyog5b2S5bm25o6S5bqPIFN0YXJ0ICovXFxuZnVuY3Rpb24gbWVyZ2VTb3J0KGFycikge1xcbiAgICB2YXIgbGVuID0gYXJyLmxlbmd0aDtcXG4gICAgaWYgKGxlbiA8IDIpIHtcXG4gICAgICAgIHJldHVybiBhcnI7XFxuICAgIH1cXG4gICAgdmFyIG1pZGRsZSA9IE1hdGguZmxvb3IobGVuIC8gMiksXFxuICAgICAgICBsZWZ0ID0gYXJyLnNsaWNlKDAsIG1pZGRsZSksXFxuICAgICAgICByaWdodCA9IGFyci5zbGljZShtaWRkbGUpO1xcbiAgICByZXR1cm4gbWVyZ2UobWVyZ2VTb3J0KGxlZnQpLCBtZXJnZVNvcnQocmlnaHQpKTtcXG59XFxuZnVuY3Rpb24gbWVyZ2UobGVmdCwgcmlnaHQpIHtcXG4gICAgdmFyIHJlc3VsdCA9IFtdO1xcbiAgICB2YXIgaXNUaGlzVmVyc2lvbkxpc3QgPSBbXTtcXG5cXG4gICAgd2hpbGUgKGxlZnQubGVuZ3RoID4gMCAmJiByaWdodC5sZW5ndGggPiAwKSB7XFxuICAgICAgICBpZiAobGVmdFswXS50aXRsZS5pbmNsdWRlcyhcXFwi8J+GmVxcXCIpKSB7XFxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobGVmdC5zaGlmdCgpKTtcXG4gICAgICAgIH0gZWxzZSBpZiAocmlnaHRbMF0udGl0bGUuaW5jbHVkZXMoXFxcIvCfhplcXFwiKSkge1xcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJpZ2h0LnNoaWZ0KCkpO1xcbiAgICAgICAgfSBlbHNlIGlmIChsZWZ0WzBdLnRpdGxlLmluY2x1ZGVzKFxcXCLwn4aVXFxcIikpIHtcXG4gICAgICAgICAgICByZXN1bHQucHVzaChsZWZ0LnNoaWZ0KCkpO1xcbiAgICAgICAgfSBlbHNlIGlmIChyaWdodFswXS50aXRsZS5pbmNsdWRlcyhcXFwi8J+GlVxcXCIpKSB7XFxuICAgICAgICAgICAgcmVzdWx0LnB1c2gocmlnaHQuc2hpZnQoKSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGlzVGhpc1ZlcnNpb25MaXN0LnB1c2gobGVmdC5zaGlmdCgpKTtcXG4gICAgICAgICAgICBpc1RoaXNWZXJzaW9uTGlzdC5wdXNoKHJpZ2h0LnNoaWZ0KCkpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuXFxuICAgIHdoaWxlIChpc1RoaXNWZXJzaW9uTGlzdC5sZW5ndGgpIHJlc3VsdC5wdXNoKGlzVGhpc1ZlcnNpb25MaXN0LnNoaWZ0KCkpO1xcblxcbiAgICB3aGlsZSAobGVmdC5sZW5ndGgpXFxuICAgICAgICByZXN1bHQucHVzaChsZWZ0LnNoaWZ0KCkpO1xcblxcbiAgICB3aGlsZSAocmlnaHQubGVuZ3RoKVxcbiAgICAgICAgcmVzdWx0LnB1c2gocmlnaHQuc2hpZnQoKSk7XFxuXFxuICAgIHJldHVybiByZXN1bHQ7XFxufVxcbiQuZXhwb3J0cy5tZXJnZVNvcnQgPSBtZXJnZVNvcnQ7XFxuLyog5b2S5bm25o6S5bqPIEVuZCAqL1wifSx7XCJjb2xfdHlwZVwiOlwiaWNvbl8yX3JvdW5kXCIsXCJuYW1lXCI6XCLlhajpg6jlhazlvIDop4TliJlcIixcInBhdGhcIjpcIkFsbFB1YmxpY1J1bGVcIixcInJ1bGVcIjpcImpzOlxcbiAgICBjb25zdCB7XFxuICAgICAgICBhcGksXFxuICAgICAgICBsb2NhbFJ1bGVWZXIsXFxuICAgICAgICBnZXRBcGlcXG4gICAgfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmNvbnN0IHtcXG4gICAgbWVyZ2VTb3J0XFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3NvcnRcXFwiKTtcXG5sZXQgZGF0YVR5cGUgPSBnZXRWYXIoXFxcIldhcmVob3VzZS50eXBlXFxcIiwgXFxcIlxcXCIpO1xcbmxldCBvcmRlciA9IGdldFZhcihcXFwiV2FyZWhvdXNlLm9yZGVyXFxcIiwgXFxcIjBcXFwiKTtcXG5sZXQgc29ydCA9IGdldFZhcihcXFwiV2FyZWhvdXNlLnNvcnRcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCBnb29kID0gZ2V0VmFyKFxcXCJXYXJlaG91c2UuZ29vZFxcXCIsIFxcXCJcXFwiKTtcXG5sZXQgcGFnZSA9IE1ZX1VSTC5zcGxpdChcXFwiI1xcXCIpWzFdIHx8IDE7XFxubGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5hbGxfcnVsZSArIFxcXCI/ZGF0YV90eXBlPVxcXCIgKyBkYXRhVHlwZSArIFxcXCImcGFnZT1cXFwiICsgcGFnZSArIFxcXCImbGltaXQ9MjAmb3JkZXI9XFxcIiArIG9yZGVyICsgXFxcIiZzb3J0PVxcXCIgKyBzb3J0KyBcXFwiJmlzX2dvb2Q9XFxcIiArIGdvb2QpKS5yZXN1bHQ7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS50eXBlXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2Uub3JkZXJcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5zb3J0XFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuZ29vZFxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiKTtcXG59KSk7XFxubGV0IGRhdGEgPSBbXTtcXG5pZiAoZ2V0VmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIpID09PSBcXFwiMVxcXCIpIHtcXG4gICAgYmFjaygpO1xcbn1cXG5mdW5jdGlvbiB0YWIoYXJyLCB0eXBlLCBjb250cmFzdCkge1xcbiAgICBmb3IgKGxldCBpdGVtIG9mIGFycikge1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbVsxXSA9PT0gY29udHJhc3QgPyBcXFwi4oCc4oCcXFxcIiArIGl0ZW1bMF0gKyBcXFwi4oCd4oCdXFxcIiA6IGl0ZW1bMF0sXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChrZXksIHR5cGUpID0+IHtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKHR5cGUsIGtleSk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICB9LCBpdGVtWzFdLCB0eXBlKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCJcXG4gICAgfSk7XFxufVxcbmlmIChwYWdlID09PSBcXFwiMVxcXCIpIHtcXG4gICAgdGFiKFtcXG4gICAgICAgIFtcXFwi5YWo6YOoXFxcIiwgXFxcIlxcXCJdLFxcbiAgICAgICAgW1xcXCLlsI/nqIvluo9cXFwiLCBcXFwiaG9tZV9ydWxlX3VybFxcXCJdLFxcbiAgICAgICAgW1xcXCLmj5DkuqTkupHku5PlupPop4TliJlcXFwiLCBcXFwicHVibGlzaFxcXCJdLFxcbiAgICAgICAgW1xcXCLnvZHpobXmj5Lku7ZcXFwiLCBcXFwianNfdXJsXFxcIl0sXFxuICAgICAgICBbXFxcIumdmeaAgemhtemdolxcXCIsIFxcXCJodG1sXFxcIl0sXFxuICAgICAgICBbXFxcIuS4u+mimFxcXCIsIFxcXCJjb25maWdcXFwiXVxcbiAgICBdLCBcXFwiV2FyZWhvdXNlLnR5cGVcXFwiLCBkYXRhVHlwZSk7XFxuICAgIHRhYihbXFxuICAgICAgICBbXFxcIuaXtumXtFxcXCIsIFxcXCIwXFxcIl0sXFxuICAgICAgICBbXFxcIklEXFxcIiwgXFxcIjFcXFwiXSxcXG4gICAgICAgIFtcXFwi5aW96K+E5bqmXFxcIiwgXFxcIjJcXFwiXSxcXG4gICAgICAgIFtcXFwi5beu6K+E5bqmXFxcIiwgXFxcIjNcXFwiXSxcXG4gICAgICAgIFtcXFwi5Zue5aSN5pWwXFxcIiwgXFxcIjRcXFwiXVxcbiAgICBdLCBcXFwiV2FyZWhvdXNlLm9yZGVyXFxcIiwgb3JkZXIpO1xcbiAgICB0YWIoW1xcbiAgICAgICAgW1xcXCLlgJLluo9cXFwiLCBcXFwiMFxcXCJdLFxcbiAgICAgICAgW1xcXCLmraPluo9cXFwiLCBcXFwiMVxcXCJdXFxuICAgIF0sIFxcXCJXYXJlaG91c2Uuc29ydFxcXCIsIHNvcnQpO1xcbiAgICB0YWIoW1xcbiAgICAgICAgW1xcXCLkuI3orrpcXFwiLCBcXFwiXFxcIl0sXFxuICAgICAgICBbXFxcIuS8mOi0qFxcXCIsIFxcXCIxXFxcIl1cXG4gICAgXSwgXFxcIldhcmVob3VzZS5nb29kXFxcIiwgZ29vZCk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuaQnOe0olxcXCIsXFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcobmFtZSA9PiBcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFwiICsgaW5wdXQgKyBcXFwiJnJ1bGU9XFxcIiArIG5hbWUsIE1ZX1JVTEUudGl0bGUpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICBkZXNjOiBcXFwi5pCc57Si5YWo6YOo6KeE5YiZXFxcIlxcbiAgICB9KTtcXG59XFxuXFxubGV0IGhvbWVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5ob21lKSk7XFxubGV0IG1SdWxlTGlzdCA9IFtdO1xcbmZvciAodmFyIGl0ZW0gb2YgcnVsZUxpc3QpIHtcXG4gICAgdmFyIG5hbWUgPSBpdGVtLm5hbWU7XFxuICAgIGlmIChpdGVtLmlzX3RhcCkge1xcbiAgICAgICAgbGV0IGxvY2F0aW9uID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwicnVsZUxpc3RKc29uXFxcIikgKyBcXFwiP2lkPVxcXCIgKyBpdGVtLmlkKSk7XFxuICAgICAgICBpdGVtLmlkID0gbG9jYXRpb24uaWQ7XFxuICAgICAgICBpdGVtLm5hbWUgPSBsb2NhdGlvbi5uYW1lO1xcbiAgICAgICAgaXRlbS5hdXRob3IgPSBsb2NhdGlvbi5hdXRob3I7XFxuICAgICAgICBpdGVtLmRhdGFfdHlwZSA9IGxvY2F0aW9uLmRhdGFfdHlwZTtcXG4gICAgICAgIGl0ZW0udmVyID0gbG9jYXRpb24udmVyXFxuICAgIH1cXG4gICAgaXRlbS52ZXJzaW9uID0gaXRlbS52ZXI7XFxuICAgIGxldCBsYWJlbCA9IFxcXCJcXFwiLFxcbiAgICAgICAgbHZlciA9IC0yO1xcbiAgICBpZiAoaXRlbS5pc19qc29uICYmIGl0ZW0uZGF0YV90eXBlID09PSBcXFwiaG9tZV9ydWxlX3VybFxcXCIpIHtcXG4gICAgICAgIGx2ZXIgPSBsb2NhbFJ1bGVWZXIoaG9tZUxpc3QsIGl0ZW0pO1xcbiAgICAgICAgaWYgKGx2ZXIgPT09IC0xKSB7XFxuICAgICAgICAgICAgbGFiZWwgPSBcXFwi8J+GlVxcXCI7XFxuICAgICAgICB9IGVsc2UgaWYgKGx2ZXIgPCBpdGVtLnZlcikge1xcbiAgICAgICAgICAgIGxhYmVsID0gXFxcIvCfhplcXFwiO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIG1SdWxlTGlzdC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBsYWJlbCArIG5hbWUsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBsdmVyOiBsdmVyLFxcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkLFxcbiAgICAgICAgICAgIGlzQWxsOnRydWVcXG4gICAgICAgIH0sXFxuICAgICAgICBwaWNfdXJsOiBpdGVtLnBpYyxcXG4gICAgfSlcXG59XFxuLyog5b2S5bm25o6S5bqPIFN0YXJ0ICovXFxuLy9tUnVsZUxpc3QgPSBtZXJnZVNvcnQobVJ1bGVMaXN0KTtcXG4vKiDlvZLlubbmjpLluo8gRW5kICovXFxuZGF0YS5wdXNoLmFwcGx5KGRhdGEsIG1SdWxlTGlzdClcXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlm57lpI1cIixcInBhdGhcIjpcIlJlcGx5XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZGF0YSA9IFtdO1xcbmNvbnN0IHtcXG4gICAgYXBpXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIHJlcGx5SWQsXFxuICAgIHJ1bGVJZCxcXG4gICAgbmFtZSxcXG4gICAgcGFzc3dvcmQsXFxuICAgIHVzZXJuYW1lXFxufSA9IE1ZX1BBUkFNUztcXG5cXG5cXG5zZXRQYWdlVGl0bGUoXFxcIuWbnuWkjShcXFwiICsgbmFtZSArIFxcXCIpXFxcIik7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnRleHRcXFwiKTtcXG4gICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbn0pKTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICBkZXNjOiBcXFwi5Zue5aSNLi4uLi4uXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnRleHQnLCAnJyksXFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0OjcsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudGV4dFxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSk7XFxuXFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmj5DkuqRcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB1cmw6ICQoYXBpLmRpc19yZXBseSArIHJ1bGVJZCkubGF6eVJ1bGUoKHBhc3N3b3JkLCB1c2VybmFtZSwgcnVsZUlkKSA9PiB7XFxuICAgICAgICBsZXQgdGV4dCA9IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudGV4dCcsICcnKTtcXG4gICAgICAgIGlmIChwYXNzd29yZCA9PSBcXFwiXFxcIiB8fCB1c2VybmFtZSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mnKrnmbvlvZXotKblj7dcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHRleHQgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L2g6L+Y5LuA5LmI6YO95rKh5YaZ5ZWKXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0LCB7XFxuICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiZGlzY3Vzc190ZXh0XFxcIjogdGV4dCxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJxcVxcXCI6IHVzZXJuYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogcGFzc3dvcmQsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiZGlzY3Vzc19pZFxcXCI6IHJ1bGVJZFxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuXFxuICAgIH0sIHBhc3N3b3JkLCB1c2VybmFtZSwgcmVwbHlJZClcXG59KTtcXG5cXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmiJHnmoTlm57lpI1cIixcInBhdGhcIjpcIk15UmVwbHlcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IHtcXG4gICAgYXBpXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGF1dGhfY29kZSxcXG4gICAgcXFcXG59ID0gTVlfUEFSQU1TO1xcbmxldCBwYWdlID0gcGFyc2VJbnQoTVlfVVJMLnNwbGl0KFxcXCIjXFxcIilbMV0pO1xcbmxldCBkYXRhPVtdO1xcbmxldCBjb21tZW50TGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuZGlzX2dldF9yZXBseSArIFxcXCI/bGltaXQ9NSZwYWdlPVxcXCIgKyBwYWdlICsgXFxcIiZxcT1cXFwiICsgcXEgKyBcXFwiJmF1dGhfY29kZT1cXFwiICsgYXV0aF9jb2RlKSkucmVzdWx0O1xcbmlmIChjb21tZW50TGlzdC5sZW5ndGggPT09IDApIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5Yir5ouJ5LqG5LiA5p2h5Lmf5LiN5Ymp5LqGPC9oNT5cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0pO1xcbn0gZWxzZSB7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSArIFxcXCImbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0nZ3JheSc+PHNtYWxsPiNcXFwiICsgaXRlbS5pZCArIFxcXCI8L3NtYWxsPjxmb250PlxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbHZlcjogXFxcIuWbnuWkjei/m+WFpeS4jeaUr+aMgeafpeeci1xcXCIsXFxuICAgICAgICAgICAgICAgIGlkOiBpdGVtLnJ1bGVfaWRbMF1cXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXG4gICAgICAgICAgICBkZXNjOiBpdGVtLmNyZWF0ZV9kYXRlICsgXFxcIsK3XFxcIitpdGVtLnJ1bGVfaWRbMV0rXFxcIsK3XFxcIitcXFwi5byA5Y+R6ICF8J+Xo1xcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcIixcXG4gICAgICAgICAgICBleHRyYTp7XFxuICAgICAgICAgICAgICAgIG5hbWU6aXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICB0eXBlOlxcXCJsb25nX3RleHRcXFwiLFxcbiAgICAgICAgICAgICAgICB0ZXh0Oml0ZW0uZGlzY3Vzc190ZXh0XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIFxcbn1cXG5zZXRSZXN1bHQoZGF0YSk7XFxuXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmm7TlpJrliIbkuqtcIixcInBhdGhcIjpcIm1vcmVTaGFyZVwiLFwicnVsZVwiOlwianM6XFxuICAgIGFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKT0+e1xcbiAgICAgICAgY2xlYXJWYXIoXFxcImhvdXNlLnVwbG9hZF9jb2RlXFxcIik7XFxuICAgIH0pKTtcXG5jb25zdCB7Y29sb3Isc21hbGwsYXBpLCBnZXRGaWxlfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXG5sZXQgcHV0X3VybCA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvZGV2L3B1dCc7XFxuaWYoIWhvdXNlRmlsZSl7XFxuICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcbn1cXG5sZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcbi8vIGxvZyhob3VzZV9kYXRhLnVzZXJuYW1lKyctJytob3VzZV9kYXRhLnBhc3N3b3JkKTtcXG52YXIgY2FudXAgPSBob3VzZV9kYXRhLnVzZXJuYW1lLmxlbmd0aCA+PSA2ICYmIGhvdXNlX2RhdGEucGFzc3dvcmQubGVuZ3RoID4gMjtcXG5sb2coJ+WPr+S7peS4iuS8oD8nK2NhbnVwKTtcXG5sZXQgZCA9IFtdO1xcbmxldCBmaWxlX3R5cGUgPSBbe25hbWU6J+mdmeaAgeaWh+S7ticsdmFsdWU6J2h0bWwnfSx7bmFtZTon572R6aG15o+S5Lu2Jyx2YWx1ZTonanNfdXJsJ30se25hbWU6J+S4u+mhtemFjee9ricsdmFsdWU6J2NvbmZpZyd9XTsgLy/kuIrkvKDnsbvlnotcXG5sZXQgZmlsZV9yZWRpcmVjdCA9IFt7bmFtZTon5pys5ZywJyx2YWx1ZTonZmFsc2UnfSx7bmFtZTon55u06ZO+MzAyJyx2YWx1ZTondHJ1ZSd9XTsgLy/mmK/lkKbph43lrprlkJFcXG5sZXQgZmlsZV91YSA9IFt7bmFtZTon55S16ISRJyx2YWx1ZToncGMnfSx7bmFtZTon5omL5py6Jyx2YWx1ZTonbW9iaWxlJ31dO1xcbmxldCBmaWxlX3R5cGVfdGl0bGUgPSBmaWxlX3R5cGUubWFwKChpdGVtKSA9PiB7XFxuICAgIGxldCBuYW1lID0gZ2V0SXRlbSgnaG91c2UuZmlsZV90eXBlJywn6Z2Z5oCB5paH5Lu2Jyk7XFxuICAgIGlmKGl0ZW0ubmFtZT09PW5hbWUpe1xcbiAgICAgICAgcmV0dXJuICfwn5GJJytpdGVtLm5hbWU7XFxuICAgIH1lbHNle1xcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZTtcXG4gICAgfVxcbn0pO1xcbmxldCBmaWxlX3JlZGlyZWN0X3RpdGxlID0gZmlsZV9yZWRpcmVjdC5tYXAoKGl0ZW0pID0+IHtcXG4gICAgbGV0IG5hbWUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3JlZGlyZWN0Jywn5pys5ZywJyk7XFxuICAgIGlmKGl0ZW0ubmFtZT09PW5hbWUpe1xcbiAgICAgICAgcmV0dXJuICfwn5GJJytpdGVtLm5hbWU7XFxuICAgIH1lbHNle1xcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZTtcXG4gICAgfVxcbn0pO1xcbmxldCBmaWxlX3VhX3RpdGxlID0gZmlsZV91YS5tYXAoKGl0ZW0pID0+IHtcXG4gICAgbGV0IG5hbWUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJywn55S16ISRJyk7XFxuICAgIGlmKGl0ZW0ubmFtZT09PW5hbWUpe1xcbiAgICAgICAgcmV0dXJuICfwn5GJJytpdGVtLm5hbWU7XFxuICAgIH1lbHNle1xcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZTtcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7Y29sX3R5cGU6ICd4NV93ZWJ2aWV3X3NpbmdsZScsIGV4dHJhOiB7anM6ICdjb25zb2xlLmxvZyhcXFwi5oiR5Yqg6L295LqGXFxcIiknfX0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAn6I635Y+WJyxcXG4gICAgZGVzYzogXFxcIuaWh+S7tui3r+W+hCzmlK/mjIFoaWtlcixmaWxlLGh0dHAs5Li76aKYXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIG9uQ2hhbmdlOiBcXFwicHV0VmFyKCdob3VzZS53ZWJfdXJsJyxpbnB1dClcXFwiLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiB0cnVlLFxcbiAgICAgICAgaWQ6J2ZpbGVQYXRoJyxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTpnZXRWYXIoJ2hvdXNlLndlYl91cmwnKVxcbiAgICB9LFxcbiAgICB1cmw6JC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBsZXQgaW5wdXQgPSBnZXRWYXIoJ2hvdXNlLndlYl91cmwnLCcnKTtcXG4gICAgICAgIGlmKGlucHV0Lmxlbmd0aDwyKXtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZO+5o6l5LiN5Y+v5Lul5Li656m6J1xcbiAgICAgICAgfSBlbHNlIGlmKC9eaGlrZXI6fF5maWxlOnxeaHR0cDp8Xmh0dHBzOnxeXFxcXC9zdG9yYWdlXFxcXC98XlxcXFwvc2RjYXJkXFxcXC8vLnRlc3QoaW5wdXQpKXtcXG4gICAgICAgICAgICBpZigvXlxcXFwvc3RvcmFnZVxcXFwvfF5cXFxcL3NkY2FyZFxcXFwvLy50ZXN0KGlucHV0KSl7XFxuICAgICAgICAgICAgICAgIGlucHV0ID0gJ2ZpbGU6Ly8nK2lucHV0O1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsb2coJ+ato+W4uOmTvuaOpTonK2lucHV0KTtcXG4gICAgICAgICAgICBsZXQgdWEgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJyk9PT0n55S16ISRJz8nTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg4LjAuNDMyNC4xNDYgU2FmYXJpLzUzNy4zNic6J01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA5OyBNSSA2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODkuMC40Mzg5LjkwIE1vYmlsZSBTYWZhcmkvNTM3LjM2JztcXG4gICAgICAgICAgICBsZXQgd2ViX3VybF9hcnIgPSBpbnB1dC5zcGxpdCgnOycpO1xcbiAgICAgICAgICAgIGxldCB3ZWJfdXJsID0gd2ViX3VybF9hcnJbMF07XFxuICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSB7XFxuICAgICAgICAgICAgICAgICdSZWZlcmVyJzonaHR0cHM6Ly9ibG9nLmNzZG4ubmV0JyxcXG4gICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOnVhLFxcbiAgICAgICAgICAgICAgICAnQWNjZXB0JzonYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0LCAqLyo7IHE9MC4wMScsXFxuICAgICAgICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOid6aC1DTicsXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBpZih3ZWJfdXJsX2Fyci5sZW5ndGg+PTMmJndlYl91cmxfYXJyWzJdLmxlbmd0aD4yKXsgLy/orr7nva7nvJbnoIFcXG4gICAgICAgICAgICAgICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSAnY2hhcnNldD0nK3dlYl91cmxfYXJyWzJdLnRvVXBwZXJDYXNlKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7aGVhZGVyczpoZWFkZXJzLHdpdGhIZWFkZXJzOmZhbHNlLHJlZGlyZWN0OmZhbHNlfTtcXG4gICAgICAgICAgICBpZih3ZWJfdXJsX2Fyci5sZW5ndGg+PTImJndlYl91cmxfYXJyWzFdLmxlbmd0aD4yKXsgLy8g6K6+572u6K+35rGC5pa55rOVXFxuICAgICAgICAgICAgICAgIHBhcmFtc1snbWV0aG9kJ10gPSB3ZWJfdXJsX2FyclsxXS50b1VwcGVyQ2FzZSgpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsb2coJ+W8gOWni+iOt+WPlua6kOeggScpO1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIC8qXFxuICAgICAgICAgICAgICAgIHJlcXVlc3RBc3luYyh3ZWJfdXJsLHBhcmFtcyxmdW5jdGlvbiAoa2V5LGNvZGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBiYWNrX2NvZGUgPSBjb2RlO1xcbiAgICAgICAgICAgICAgICAgICAgaWYoYmFja19jb2RlLmxlbmd0aD4yMCl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0VmFyKCdob3VzZS51cGxvYWRfY29kZScsYmFja19jb2RlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5bey6I635Y+WLOW5tumDqOWIhuaPkuWFpeWIsOaWh+acrOWMuuWfnydcXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/plJnor6/vvIzmnKzmrKHojrflj5bliLDnqbrmlofmnKzvvIznlpHkvLzkvaDmsqHmnInmraTmlofku7YhJztcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgICAgIGxldCBiYWNrX2NvZGUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJyk9PT0n55S16ISRJz9mZXRjaCh3ZWJfdXJsLHBhcmFtcyk6cmVxdWVzdCh3ZWJfdXJsLHBhcmFtcyk7XFxuICAgICAgICAgICAgICAgIGlmKGJhY2tfY29kZS5sZW5ndGg+MjApe1xcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKCdob3VzZS51cGxvYWRfY29kZScsYmFja19jb2RlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+a6kOeggeW3suiOt+WPlizlubbpg6jliIbmj5LlhaXliLDmlofmnKzljLrln58nXFxuICAgICAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOacrOasoeiOt+WPluWIsOepuuaWh+acrO+8jOeWkeS8vOS9oOayoeacieatpOaWh+S7tiEnO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5Y+R55Sf5LqG6ZSZ6K+vOlxcXFxuJytlLm1lc3NhZ2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfWVsc2UgaWYoL+S4u+mimO+/pXzlhYPntKDvv6UvLnRlc3QoaW5wdXQpKXtcXG4gICAgICAgICAgICBsb2coJ+S4u+mimOmTvuaOpScpO1xcbiAgICAgICAgICAgIGxldCB3ZWJfdXJsX2FyciA9IGlucHV0LnNwbGl0KCfvv6UnKTtcXG4gICAgICAgICAgICBsZXQgd2ViX3VybCA9IHdlYl91cmxfYXJyW3dlYl91cmxfYXJyLmxlbmd0aC0xXTtcXG4gICAgICAgICAgICBsZXQgYmFja19jb2RlID0gcGFyc2VQYXN0ZSh3ZWJfdXJsKTtcXG4gICAgICAgICAgICBpZihiYWNrX2NvZGUubGVuZ3RoPjIwKSB7XFxuICAgICAgICAgICAgICAgIHB1dFZhcignaG91c2UudXBsb2FkX2NvZGUnLGJhY2tfY29kZSk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5bey6I635Y+WLOW5tumDqOWIhuaPkuWFpeWIsOaWh+acrOWMuuWfnydcXG4gICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOacrOasoeiOt+WPlui/lOWbnuS4ujpcXFxcbicrYmFja19jb2RlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/pnZ7ms5Xpk77mjqU6XFxcXG4nK2dldFZhcignaG91c2Uud2ViX3VybCcpO1xcbiAgICAgICAgfVxcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqeaWh+S7tui3r+W+hFxcXCIsXFxuICAgIHVybDokKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCgpPT57XFxuICAgICAgICBsZXQgZiA9IHJlcXVpcmUoXFxcImh0dHBzOi8vaGpkaG54LmNvZGluZy5uZXQvcC9oaWtlci9kL2RyL2dpdC9yYXcvbWFzdGVyL2pzL2ZpbGVTZWxlY3QuanNcXFwiKTtcXG4gICAgICAgIHJldHVybiBmLmZpbGVTZWxlY3Rpb25Vcmkoe1xcbiAgICAgICAgICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGZpbmRJdGVtKFxcXCJmaWxlUGF0aFxcXCIpLmV4dHJhO1xcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKFxcXCJmaWxlUGF0aFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHRhcmdldCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogUEFUSFxcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIHB1dFZhcignaG91c2Uud2ViX3VybCcsUEFUSCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIGZpbGVUeXBlOiBcXFwiXFxcIixcXG4gICAgICAgICAgICBwYXR0ZXJuOiAwXFxuICAgICAgICB9KTtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J+S4iuS8oOexu+WeiycsXFxuICAgIGRlc2M6J+S4iuS8oOaWh+S7tueahOexu+WeiyzlvZPliY3kuLo6Jytjb2xvcihnZXRJdGVtKCdob3VzZS5maWxlX3R5cGUnLCfpnZnmgIHmlofku7YnKSwnI2ZmNzAwMCcpLFxcbiAgICBjb2xfdHlwZTondGV4dF8xJyxcXG4gICAgdXJsOiQoZmlsZV90eXBlX3RpdGxlLDIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICBzZXRJdGVtKCdob3VzZS5maWxlX3R5cGUnLGlucHV0LnJlcGxhY2UoJ/CfkYknLCcnKSk7XFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly/kvaDpgInmi6nkuoY6JytpbnB1dDtcXG4gICAgfSlcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTon5paH5Lu25a6a5L2NJyxcXG4gICAgZGVzYzon5paH5Lu25piv5ZCm5bGe5LqO6YeN5a6a5ZCRLOW9k+WJjeS4ujonK2NvbG9yKGdldEl0ZW0oJ2hvdXNlLmZpbGVfcmVkaXJlY3QnLCfmnKzlnLAnKSwnI2ZmNzAwMCcpLFxcbiAgICBjb2xfdHlwZTondGV4dF8xJyxcXG4gICAgdXJsOiQoZmlsZV9yZWRpcmVjdF90aXRsZSwyKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgc2V0SXRlbSgnaG91c2UuZmlsZV9yZWRpcmVjdCcsaW5wdXQucmVwbGFjZSgn8J+RiScsJycpKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+S9oOmAieaLqeS6hjonK2lucHV0O1xcbiAgICB9KVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiforr7lpIdVQScsXFxuICAgIGRlc2M6J+WPkei1t+e9kemhteivt+axguWktOagh+ivhizlvZPliY3kuLo6Jytjb2xvcihnZXRJdGVtKCdob3VzZS5maWxlX3VhJywn55S16ISRJyksJyNmZjcwMDAnKSxcXG4gICAgY29sX3R5cGU6J3RleHRfMScsXFxuICAgIHVybDokKGZpbGVfdWFfdGl0bGUsMikuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgIHNldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnLGlucHV0LnJlcGxhY2UoJ/CfkYknLCcnKSk7XFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly/kvaDpgInmi6nkuoY6JytpbnB1dDtcXG4gICAgfSlcXG59KTtcXG5mdW5jdGlvbiBjb21wYXJlKG5hbWUpIHtcXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGl0ZW0pIHtcXG4gICAgICAgIHJldHVybiBpdGVtLm5hbWUgPT09IG5hbWU7XFxuICAgIH1cXG59XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J/Cfl4TvuI/njq/looMnLFxcbiAgICBjb2xfdHlwZTonZmxleF9idXR0b24nLFxcbiAgICB1cmw6JCgpLmxhenlSdWxlKChmaWxlX3R5cGUsY29tcGFyZSk9PntcXG4gICAgICAgIGxvZygn5p+l55yL546v5aKD5Y+Y6YePJyk7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCB1cF9jb2RlID0gZ2V0VmFyKCdob3VzZS51cGxvYWRfY29kZScsJycpO1xcbiAgICAgICAgICAgIGxldCBmdHlwZSA9ICBmaWxlX3R5cGUuZmlsdGVyKGNvbXBhcmUoZ2V0SXRlbSgnaG91c2UuZmlsZV90eXBlJywn6Z2Z5oCB5paH5Lu2JykpKVswXS52YWx1ZTtcXG4gICAgICAgICAgICBsZXQgcmVkaXJlY3QgPSBnZXRJdGVtKCdob3VzZS5maWxlX3JlZGlyZWN0Jywn5pys5ZywJykhPT0n5pys5ZywJztcXG4gICAgICAgICAgICBsZXQgY29kZSA9ICFyZWRpcmVjdD91cF9jb2RlOmlucHV0O1xcbiAgICAgICAgICAgIGxldCBlbnYgPSB7XFxuICAgICAgICAgICAgICAgIHdlYl91cmw6Z2V0VmFyKCdob3VzZS53ZWJfdXJsJywnJyksXFxuICAgICAgICAgICAgICAgIGRldmljZTpnZXRJdGVtKCdob3VzZS5maWxlX3VhJywn55S16ISRJyksXFxuICAgICAgICAgICAgICAgIGZ0eXBlOmZ0eXBlfHxcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgcmVkaXJlY3Q6cmVkaXJlY3QsXFxuICAgICAgICAgICAgICAgIGNvZGU6Y29kZS5zdWJzdHJpbmcoMCw0MCl8fFxcXCJcXFwiLFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsb2coZW52KTtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytKU09OLnN0cmluZ2lmeShlbnYpO1xcbiAgICAgICAgICAgIC8vIGFsZXJ0KEpTT04uc3RyaW5naWZ5KGVudikpO1xcbiAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrZS5tZXNzYWdlO1xcbiAgICAgICAgICAgIC8vIGFsZXJ0KGUubWVzc2FnZSk7XFxuICAgICAgICB9XFxuICAgIH0sZmlsZV90eXBlLGNvbXBhcmUpXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J/Cfk4PmlZnnqIsnLFxcbiAgICBjb2xfdHlwZTonZmxleF9idXR0b24nLFxcbiAgICB1cmw6JCgpLng1UnVsZSgoKT0+e1xcbiAgICAgICAgbGV0IG1zZyA9ICfmrKLov47kvb/nlKjlvIDlj5HogIXmm7TlpJrliIbkuqvlt6XlhbdcXFxcbjEu6L6T5YWl572R5Z2A5Li65pys5Zyw5paH5Lu26Lev5b6ELGhpa2VyOi8v5oiW6ICFZmlsZTovL+W8gOWktFxcXFxuMi7ngrnlh7vnvZHlnYDovpPlhaXmoI/lkI7pnaLnmoTmjInpkq5cXFxcbjMu55yL5paH5pys6aKE6KeI5Yy65piv5ZCm5q2j56GuXFxcXG40LueCueWHu+S4iuS8oOaMiemSruaPkOS6pOWIsOS7k+W6kyc7XFxuICAgICAgICBhbGVydChtc2cpO1xcbiAgICB9KVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOifwn5eR77iP5riF56m6JyxcXG4gICAgY29sX3R5cGU6J2ZsZXhfYnV0dG9uJyxcXG4gICAgdXJsOiQoKS5sYXp5UnVsZSgoKT0+e1xcbiAgICAgICAgY2xlYXJWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJyk7XFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly/lt7LmuIXpmaTpooTop4jljLrln5/lhoXlrrknXFxuICAgIH0pXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J/Cfk7LnpLrkvosnLFxcbiAgICBjb2xfdHlwZTonZmxleF9idXR0b24nLFxcbiAgICB1cmw6JCgpLmxhenlSdWxlKCgpPT57XFxuICAgICAgICBsZXQgZGVtb19jb2RlID0gZ2V0SXRlbSgnaG91c2UuZGVtbycsJzAnKTtcXG4gICAgICAgIGlmKGRlbW9fY29kZT09JzAnKXtcXG4gICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLndlYl91cmwnLCdoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvaHRtbC/otYTmupDnvZHkuabnrb4uaHRtbCcpO1xcbiAgICAgICAgICAgIGRlbW9fY29kZSA9IHBhcnNlSW50KGRlbW9fY29kZSkrMTtcXG4gICAgICAgICAgICBzZXRJdGVtKCdob3VzZS5kZW1vJyxkZW1vX2NvZGUrJycpO1xcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcHV0VmFyKCdob3VzZS53ZWJfdXJsJywnZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvcnVsZXMvZHpIb3VzZS9odG1sL+i1hOa6kOe9keS5puetvi5odG1sJyk7XFxuICAgICAgICAgICAgc2V0SXRlbSgnaG91c2UuZGVtbycsJzAnKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+W3suiuvue9ruekuuS+i+WcsOWdgCdcXG4gICAgfSlcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTon8J+TpOS4iuS8oCcsXFxuICAgIGNvbF90eXBlOidmbGV4X2J1dHRvbicsXFxuICAgIHVybDokKCkubGF6eVJ1bGUoKGNhbnVwLGhvdXNlX2RhdGEscHV0X3VybCxmaWxlX3R5cGUpID0+e1xcbiAgICAgICAgZnVuY3Rpb24gY29tcGFyZShuYW1lKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGl0ZW0pIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZSA9PT0gbmFtZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBjb25zdCB7Z2V0Tm93Rm9ybWF0RGF0ZX09JC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxuICAgICAgICBsZXQgdXBfY29kZSA9IGdldFZhcignaG91c2UudXBsb2FkX2NvZGUnLCcnKTtcXG4gICAgICAgIGlmKHVwX2NvZGUubGVuZ3RoIDwgMil7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+a6kOeggeWMuuaXoOWGheWuue+8jOivt+WFiOiuv+mXruS4gOS4qumdmeaAgemhtemdoidcXG4gICAgICAgIH1cXG4gICAgICAgIGlmKCFjYW51cCl7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+S9oOS4jeaYr+W8gOWPkeiAhe+8jOayoeacieaPkOS6pOWIsOS7k+W6k+eahOadg+WIqSEnXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgaW5wdXQgPSBnZXRWYXIoJ2hvdXNlLndlYl91cmwnLCcnKTtcXG4gICAgICAgIGxldCB3ZWJfdXJsID0gaW5wdXQuc3BsaXQoJzsnKVswXTtcXG4gICAgICAgIGxldCBmaWxlTmFtZSA9ICcnO1xcbiAgICAgICAgaWYoL15oaWtlcjp8XmZpbGU6fF5odHRwOnxeaHR0cHM6fF5cXFxcL3N0b3JhZ2VcXFxcL3xeXFxcXC9zZGNhcmRcXFxcLy8udGVzdCh3ZWJfdXJsKSl7XFxuICAgICAgICAgICAgZmlsZU5hbWUgPSB3ZWJfdXJsLnNwbGl0KCcvJylbd2ViX3VybC5zcGxpdCgnLycpLmxlbmd0aC0xXTtcXG4gICAgICAgIH1lbHNlIGlmKC/kuLvpopjvv6V85YWD57Sg77+lLy50ZXN0KGlucHV0KSl7XFxuICAgICAgICAgICAgbGV0IGJrYXJyID0gdXBfY29kZS5zcGxpdCgn77+lJyk7XFxuICAgICAgICAgICAgaWYoYmthcnIubGVuZ3RoPDMpe1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5LqR5Ymq6LS05p2/5YaF5a655pyJ6K+vJ1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBzd2l0Y2ggKGJrYXJyWzFdKSB7XFxuICAgICAgICAgICAgICAgIGNhc2UgJ215X2hvbWVfdGhlbWUnOlxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSB1cF9jb2RlLnNwbGl0KCfjgIwnKVsxXS5zcGxpdCgn44CNJylbMF07XFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgY2FzZSAnbXlfaG9tZV9zaW5nbGUnOlxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSB1cF9jb2RlLnNwbGl0KCfjgIwnKVsxXS5zcGxpdCgn44CNJylbMF07XFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgY2FzZSAnanNfdXJsJzpcXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gdXBfY29kZS5zcGxpdCgn77+lJylbMl0uc3BsaXQoJ0AnKVswXTtcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/plJnor6/vvIznvZHpobXpk77mjqXml6DlhoXlrrkhJztcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCB1YSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnKT09PSfnlLXohJEnPydNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODguMC40MzI0LjE0NiBTYWZhcmkvNTM3LjM2JzonTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDk7IE1JIDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OS4wLjQzODkuOTAgTW9iaWxlIFNhZmFyaS81MzcuMzYnO1xcbiAgICAgICAgbGV0IGhlYWRlcnMgPSB7XFxuICAgICAgICAgICAgJ1JlZmVyZXInOidodHRwczovL2Jsb2cuY3Nkbi5uZXQnLFxcbiAgICAgICAgICAgIFxcXCJjb250ZW50LXR5cGVcXFwiOiBcXFwiYXBwbGljYXRpb24vanNvblxcXCIsXFxuICAgICAgICAgICAgJ1VzZXItQWdlbnQnOnVhLFxcbiAgICAgICAgICAgICdBY2NlcHQnOidhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQsICovKjsgcT0wLjAxJyxcXG4gICAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJzonemgtQ04nLFxcbiAgICAgICAgfTtcXG4gICAgICAgIGxldCB0b0NvbXBhcmUgPSAnJztcXG4gICAgICAgIGlmKGZpbGVOYW1lLmVuZHNXaXRoKCcuaHRtbCcpKXtcXG4gICAgICAgICAgICB0b0NvbXBhcmUgPSAn6Z2Z5oCB5paH5Lu2JztcXG4gICAgICAgIH1lbHNlIGlmKC/kuLvpopgvLnRlc3QoZmlsZU5hbWUpKXtcXG4gICAgICAgICAgICB0b0NvbXBhcmUgPSAn5Li76aG16YWN572uJ1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGZ0eXBlID0gIGZpbGVfdHlwZS5maWx0ZXIoY29tcGFyZSh0b0NvbXBhcmV8fGdldEl0ZW0oJ2hvdXNlLmZpbGVfdHlwZScsJ+mdmeaAgeaWh+S7ticpKSlbMF0udmFsdWU7XFxuICAgICAgICBsZXQgcmVkaXJlY3QgPSBnZXRJdGVtKCdob3VzZS5maWxlX3JlZGlyZWN0Jywn5pys5ZywJykhPT0n5pys5ZywJztcXG4gICAgICAgIGlmKHJlZGlyZWN0JiYhd2ViX3VybC5zdGFydHNXaXRoKCdodHRwJykpe1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/nm7Tpk74zMDLph43lrprlkJHnvZHlnYDpk77mjqXlv4XpobtodHRw5byA5aS0JztcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBjb2RlID0gIXJlZGlyZWN0P3VwX2NvZGU6d2ViX3VybDtcXG4gICAgICAgIGxldCBkYXRhID0ge1xcXCJwYXJhbXNcXFwiOlxcbiAgICAgICAgICAgICAgICB7XFxcImRhdGFcXFwiOiB7cnVsZV9uYW1lOiBmaWxlTmFtZSwgXFxcInJ1bGVfdHlwZVxcXCI6ICfmm7TlpJrliIbkuqsnLCBcXFwidmVyc2lvblxcXCI6Z2V0Tm93Rm9ybWF0RGF0ZSgpLFxcXCJydWxlX3ZhbHVlXFxcIjogY29kZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3R5cGU6ZnR5cGUsIGlzX3JlZGlyZWN0OnJlZGlyZWN0LGRldmljZVVhOmdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnKSxcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICBcXFwibmFtZVxcXCI6IGhvdXNlX2RhdGEudXNlcm5hbWUsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBob3VzZV9kYXRhLnBhc3N3b3JkfVxcbiAgICAgICAgfTtcXG4gICAgICAgIGxldCB1cHBhcmFtcyA9IHtoZWFkZXJzOmhlYWRlcnMsYm9keTpKU09OLnN0cmluZ2lmeShkYXRhKSx3aXRoSGVhZGVyczpmYWxzZSxyZWRpcmVjdDpmYWxzZSxtZXRob2Q6J1BPU1QnfTtcXG4gICAgICAgIGxldCBiYWNrbXNnID0gZ2V0SXRlbSgnaG91c2UuZmlsZV91YScpPT09J+eUteiEkSc/ZmV0Y2gocHV0X3VybCx1cHBhcmFtcyk6cmVxdWVzdChwdXRfdXJsLHVwcGFyYW1zKTtcXG4gICAgICAgIHRyeXtcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gSlNPTi5wYXJzZShiYWNrbXNnKS5yZXN1bHQ7XFxuICAgICAgICAgICAgbGV0IGRldGFpbCA9IHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrZGV0YWlsO1xcbiAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+WPkeeUn+S6humUmeivr1xcXFxuJytlLm1lc3NhZ2U7XFxuICAgICAgICB9XFxuICAgIH0sY2FudXAsaG91c2VfZGF0YSxwdXRfdXJsLGZpbGVfdHlwZSlcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTon6ZW/5paH5pys6aKE6KeI5Yy65Z+fJyxcXG4gICAgY29sX3R5cGU6J3RleHRfMScsXFxuICAgIHVybDonaGlrZXI6Ly9lbXB0eScsXFxuICAgIGV4dHJhOiB7dGV4dFNpemU6IDExLGxpbmVWaXNpYmxlOmZhbHNlfVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOmdldFZhcignaG91c2UudXBsb2FkX2NvZGUnLCcnKS5zdWJzdHJpbmcoMCwxMDI0MCksXFxuICAgIGNvbF90eXBlOidsb25nX3RleHQnLFxcbiAgICBleHRyYToge3RleHRTaXplOiAxMX1cXG59KTtcXG5zZXRQYWdlVGl0bGUoXFxcIuabtOWkmuWIhuS6q1xcXCIpO1xcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIui9u+WQiOmbhueUn+aIkOaOpeWPo1wiLFwicGF0aFwiOlwiZ2VuQXBpXCIsXCJydWxlXCI6XCJqczpcXG5mdW5jdGlvbiBnZW5SdWxlKG5hbWUsdXJsLGljb24pe1xcbiAgICBpY29uPWljb258fCdodHRwczovL3ozLmF4MXguY29tLzIwMjEvMTEvMTYvSVdKaHhmLnBuZyc7XFxuICAgIGNvbnN0IHtnZXROb3dGb3JtYXREYXRlLGFwaSxnZXRBcGl9PSQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGwgPSBmdW5jdGlvbihvbGQsbmV3X3N0cil7XFxuICAgICAgICByZXR1cm4gdGhpcy5zcGxpdChvbGQpLmpvaW4obmV3X3N0cik7XFxuICAgIH07XFxuICAgIGxldCBtdWJhbiA9IGdldEFwaSgnaW1wb3J0VXJsJykrXFxcIjE2OTBcXFwiO1xcbiAgICBsZXQgbXViYW5fd29yZD17bmFtZTpcXFwiQOi9u+WQiOmbhlxcXCIsdXJsOlxcXCJA5Zyw5Z2AXFxcIix2ZXI6XFxcIkDniYjmnKxcXFwiLGljb246XFxcIkDlm77moIdcXFwifTtcXG4gICAgbGV0IG11YmFuX2NvZGUgPSBmZXRjaChtdWJhbik7XFxuICAgIG11YmFuX2NvZGU9bXViYW5fY29kZS5yZXBsYWNlQWxsKG11YmFuX3dvcmQubmFtZSxuYW1lKS5yZXBsYWNlQWxsKG11YmFuX3dvcmQudmVyLGdldE5vd0Zvcm1hdERhdGUoKSkucmVwbGFjZUFsbChtdWJhbl93b3JkLnVybCx1cmwpLnJlcGxhY2VBbGwobXViYW5fd29yZC5pY29uLGljb24pO1xcbiAgICBsZXQgaW1wb3J0X2NvZGU9XFxcIua1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8muWwj+eoi+W6j++8jOaXoOagueagke+8jOiKseato+a4he+8jOS4jeaWreiNpOiFpeS4jeaIkua3q++/pWhvbWVfcnVsZV92Mu+/pWJhc2U2NDovL0BcXFwiK25hbWUrXFxcIkBcXFwiK2Jhc2U2NEVuY29kZShtdWJhbl9jb2RlKTtcXG4gICAgdmFyIHBhc3RlcyA9IGdldFBhc3RlcygpO1xcbiAgICB2YXIgdXJsID0gc2hhcmVQYXN0ZShpbXBvcnRfY29kZSxwYXN0ZXMuc2xpY2UoLTEpWzBdKTtcXG4gICAgbGV0IGltcG9ydF9ydWxlPSB1cmwrXFxcIlxcXFxuXFxcXG7lsI/nqIvluo/vvJpcXFwiK25hbWU7XFxuICAgIHJldHVybiBpbXBvcnRfcnVsZTtcXG59XFxuJC5leHBvcnRzLmdlblJ1bGU9Z2VuUnVsZTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWFqOWxgOino+aekOWFjeWXhVwiLFwicGF0aFwiOlwiZ2xvYmFsUGFyc2VcIixcInJ1bGVcIjpcImpzOlxcbiAgICBmdW5jdGlvbiBnZXRIZWFkZXJzKHBsYXlVcmwpe1xcbiAgICAgICAgbGV0IGhlYWRlcnMgPSB7fTtcXG4gICAgICAgIGxldCByZWZlcj1wbGF5VXJsLnNwbGl0KFxcXCIvL1xcXCIpWzBdK1xcXCIvL1xcXCIrcGxheVVybC5zcGxpdChcXFwiLy9cXFwiKVsxXS5zcGxpdChcXFwiL1xcXCIpWzBdO1xcbiAgICAgICAgaWYoL2xlY2xvdWRcXFxcLmNvbXxiaWxpdmlkZW9cXFxcLmNvbS8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgaGVhZGVycyA9IHtcXFwiUmVmZXJlclxcXCI6ICdodHRwczovL3d3dy5iaWxpYmlsaS5jb20vJyxcXFwiVXNlci1BZ2VudFxcXCI6XFxcIk1vemlsbGEvNS4wXFxcIn1cXG4gICAgICAgIH1lbHNlIGlmKC9tZ3R2XFxcXC5jb20vLnRlc3QocGxheVVybCkpe1xcbiAgICAgICAgICAgIGhlYWRlcnMgPSB7XFxcIlJlZmVyZXJcXFwiOiByZWZlcixcXFwiVXNlci1BZ2VudFxcXCI6XFxcIk1vemlsbGEvNS4wXFxcIn1cXG4gICAgICAgIH1lbHNlIGlmKC9peGlndWFcXFxcLmNvbS8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgaGVhZGVycyA9IHtcXFwiUmVmZXJlclxcXCI6ICdodHRwczovL3d3dy5peGlndWEuY29tLycsXFxcIlVzZXItQWdlbnRcXFwiOlxcXCJNb3ppbGxhLzUuMFxcXCJ9XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICBoZWFkZXJzID0ge1xcXCJSZWZlcmVyXFxcIjogcmVmZXIsJ1VzZXItQWdlbnQnOidEYXJ0LzIuMTMgKGRhcnQ6aW8pJ31cXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBoZWFkZXJzXFxuICAgIH1cXG5mdW5jdGlvbiBpc1BpYyhzdHIpe1xcbiAgICByZXR1cm4gL1xcXFwuKGdpZnxqcGd8anBlZ3xwbmd8R0lGfEpQR3xQTkcpJC8udGVzdChzdHIpO1xcbn1cXG5mdW5jdGlvbiBpc1ZpZGVvKHBsYXlVcmwscmVjaGFuZ2Upe1xcbiAgICAvL+azqOaEjy5waHDkuI3lj6/ku6XooqvmjpLpmaTlkKbliJnono3lhbTop6PmnpDkuI3kuoYgfC5waHAkXFxuICAgIC8v5aaC5p6c5piv5pKt5pS+5Zyw5Z2A5bCx55u05o6l6L+U5Zue5Zyw5Z2A5Yqg5LiKVUHvvIzkuI3mmK/nmoTor53lsLHov5Tlm55mYWxzZVxcbiAgICAvLyBsZXQgdDEgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcXG4gICAgbGV0IGNhY2hlUmVneCA9IG5ldyBSZWdFeHAoJ2ZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8oLio/KVxcXFxcXFxcLm0zdTh8aGlrZXI6Ly9maWxlcy8oLio/KVxcXFxcXFxcLm0zdTgnKTtcXG4gICAgaWYoY2FjaGVSZWd4LnRlc3QocGxheVVybCkpe1xcbiAgICAgICAgcmV0dXJuIHBsYXlVcmxcXG4gICAgfVxcbiAgICBmdW5jdGlvbiBnZXRIb3N0KHVybCl7XFxuICAgICAgICAvLyBmYmHnmoRwYXJzZUxhennlpKrmhaLkuobljYPkuIfliKvnlKhcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgcmV0dXJuIHVybC5tYXRjaCgvXmh0dHAocyk/OlxcXFwvXFxcXC8oLio/KVxcXFwvLylbMF0uc2xpY2UoMCwtMSk7XFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcXG4gICAgICAgIH1cXG4gICAgICAgIC8qXFxuICAgICAgICBpZih0eXBlb2YobG9nKT09PSd1bmRlZmluZWQnKXtcXG4gICAgICAgICAgICByZXR1cm4gIGZiYS5wYXJzZUxhenlSdWxlKCQkJCgpLmxhenlSdWxlKCh1cmwpPT57XFxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRIb21lKHVybClcXG4gICAgICAgICAgICB9LHVybCkpXFxuICAgICAgICB9ZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIGdldEhvbWUodXJsKVxcbiAgICAgICAgfVxcbiAgICAgICAgKi9cXG4gICAgfVxcbiAgICBsZXQgcFVybD1wbGF5VXJsLnNwbGl0KFxcXCI7XFxcIilbMF07Ly/ojrflj5bmiqDmjonmtbfpmJR1YeetieWPguaVsOeahOe9kemhteaSreaUvumTvuaOpVxcbiAgICBsZXQgaG9zdCA9IGdldEhvc3QocFVybCk7IC8vIOiOt+WPluWfn+WQjVxcbiAgICBpZighaG9zdCl7Ly/liKTmlq3ml6Dln5/lkI3nm7TmjqXkuI3mmK/op4bpopFcXG4gICAgICAgIHJldHVybiBmYWxzZVxcbiAgICB9XFxuICAgIGZ1bmN0aW9uIHByaW50KGRhdGEpe1xcbiAgICAgICAgaWYodHlwZW9mKGxvZyk9PT0ndW5kZWZpbmVkJyl7XFxuICAgICAgICAgICAgcmV0dXJuICBmYmEubG9nKGRhdGEpXFxuICAgICAgICB9ZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIGxvZyhkYXRhKVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHJlY2hhbmdlPXR5cGVvZihyZWNoYW5nZSk9PT1cXFwiZnVuY3Rpb25cXFwiP3JlY2hhbmdlOmZ1bmN0aW9uKHBsYXlVcmwpe3JldHVybiBwbGF5VXJsfTtcXG4gICAgbGV0IGV4Y2VwdFdvcmRzID0gJy5qcyR8LmNzcyR8LnRzJHwuaHRtbCR8Lmh0bSR8LmdpZiR8LmpwZyR8LmpwZWckfC5wbmckfC5pY28kfC5zdmckfC50eHQkJy5zcGxpdCgnfCcpLm1hcChpdD0+J1xcXFxcXFxcJytpdCkuam9pbignfCcpO1xcbiAgICB2YXIgZXhjZXB0S2V5cyA9IG5ldyBSZWdFeHAoZXhjZXB0V29yZHMpO1xcbiAgICBsZXQgZXhjZXB0V29yZHMxID0gJ3JlZmVyZXI9fHVybD0nLnNwbGl0KCd8JykubWFwKGl0PT5pdCkuam9pbignfCcpO1xcbiAgICB2YXIgZXhjZXB0S2V5czEgPSBuZXcgUmVnRXhwKGV4Y2VwdFdvcmRzMSk7XFxuICAgIGxldCByZXBsYWNlV29yZHMgPSAncGxheW0zdTh8bTN1OFxcXFwudHYnLnNwbGl0KCd8JykubWFwKGl0PT5pdCkuam9pbignfCcpO1xcbiAgICBsZXQgcmVwbGFjZUtleXMgPSBuZXcgUmVnRXhwKHJlcGxhY2VXb3JkcywnZycpO1xcbiAgICBsZXQgdmlkZW9Xb3JkcyA9IFxcXCIvdmlkZW8vdG9zfC5tcDQkfC5tM3U4JHwuZmx2JHwuYXZpJHwuM2dwJHwubXBlZyR8LndtdiR8Lm1vdiR8cm12YnwuZGF0JHwubXAzJHwubTRhJHxxcUJGZG93bmxvYWR8bWltZT12aWRlbyUyRnxtaW1lX3R5cGU9dmlkZW9ffHR5cGU9bTN1OHxwdD1tM3U4XFxcIi5zcGxpdCgnfCcpLm1hcCgoaXQpPT57XFxuICAgICAgICAvL3R5cGU9bXA0XFxuICAgICAgICBpZihpdC5zdGFydHNXaXRoKFxcXCIuXFxcIikpe1xcbiAgICAgICAgICAgIHJldHVybiAnXFxcXFxcXFwnK2l0XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICByZXR1cm4gaXRcXG4gICAgICAgIH1cXG4gICAgfSkuam9pbihcXFwifFxcXCIpO1xcbiAgICBsZXQgdmlkZW9LZXlzID0gbmV3IFJlZ0V4cCh2aWRlb1dvcmRzKTtcXG4gICAgbGV0IHJVcmwgPSBwVXJsLnJlcGxhY2UoaG9zdCwnJyk7Ly/ojrflj5bpmaTlvIDln5/lkI3nmoTliankvZnpk77mjqVcXG4gICAgbGV0IHBVcmwyPXBVcmwuc3BsaXQoXFxcIiZcXFwiKVswXS5zcGxpdChcXFwiP1xcXCIpWzBdOy8v6I635Y+W5LiN5bim5Y+C5pWw55qE572R6aG16ZO+5o6lXFxuICAgIGxldCBydXJsMiA9IHBVcmwyLnJlcGxhY2UoaG9zdCwnJyk7Ly/ojrflj5bpmaTlvIDln5/lkI3nmoTliankvZnkuI3luKblj4LmlbDpk77mjqVcXG4gICAgbGV0IGhhc0tleSA9IHZpZGVvS2V5cy50ZXN0KHJVcmwpfHx2aWRlb0tleXMudGVzdChydXJsMik7XFxuICAgIGxldCBwYXJVcmwgPSBwVXJsLnJlcGxhY2UocFVybC5zcGxpdChcXFwiP1xcXCIpWzBdLCcnKTsgLy8g5YiG5Ymy6Zeu5Y+35ZCO5Ymp5L2Z5Y+C5pWw55qE5a6M5pW06ZO+5o6lXFxuICAgIGxldCBleGNLZXkgPSBleGNlcHRLZXlzMS50ZXN0KHBhclVybCk7XFxuICAgIGlmKHJVcmwuc3BsaXQoJz8nKS5sZW5ndGg+Mil7XFxuICAgICAgICBsZXQgclVybDM9clVybC5zcGxpdChcXFwiP1xcXCIpWzFdOy8v6I635Y+WP+WIhuWJsuWQjueahOesrOS4gOautVxcbiAgICAgICAgaGFzS2V5ID0gaGFzS2V5fHx2aWRlb0tleXMudGVzdChyVXJsMyk7XFxuICAgIH1cXG4gICAgaWYoaGFzS2V5JiYhZXhjS2V5KXtcXG4gICAgICAgIGxldCB0aXBzID0gJ+ajgOa1i+WIsOeWkeS8vOWkmuWqkuS9k+eahOWcsOWdgDonO1xcbiAgICAgICAgcHJpbnQoXFxcImpz5LitXFxcIit0aXBzK3BVcmwpO1xcbiAgICAgICAgcHJpbnQoXFxcIuWIhuWJsumXruWPt+WQjjpcXFwiK3BhclVybCk7XFxuICAgIH1cXG4gICAgLy8gbG9nKCcxOicrKHZpZGVvS2V5cy50ZXN0KHBVcmwpfHx2aWRlb0tleXMudGVzdChwVXJsMil8fHZpZGVvS2V5cy50ZXN0KHBVcmwucmVwbGFjZShyZXBsYWNlS2V5cyxcXFwiXFxcIikuc3BsaXQoXFxcIiZcXFwiKVswXS5zcGxpdChcXFwiP1xcXCIpWzBdKSkpO1xcbiAgICAvLyBsb2coJzI6JyshZXhjZXB0S2V5cy50ZXN0KHBVcmwuc3BsaXQoXFxcIj9cXFwiKVswXS5zcGxpdCgnJicpWzBdKSk7XFxuICAgIC8vIGxvZygnMzonKyFleGNlcHRLZXlzMS50ZXN0KHBVcmwucmVwbGFjZShwVXJsLnNwbGl0KFxcXCI/XFxcIilbMF0sJycpKSk7XFxuICAgIGlmICgoaGFzS2V5fHx2aWRlb0tleXMudGVzdChyVXJsLnJlcGxhY2UocmVwbGFjZUtleXMsXFxcIlxcXCIpLnNwbGl0KFxcXCImXFxcIilbMF0uc3BsaXQoXFxcIj9cXFwiKVswXSkgKSYmICFleGNlcHRLZXlzLnRlc3QocFVybDIpJiYhZXhjZXB0S2V5czEudGVzdChwVXJsMikpIHtcXG4gICAgICAgIGlmKCEoL1VzZXItQWdlbnR8UmVmZXJlckAvLnRlc3QocGxheVVybCkpKXtcXG4gICAgICAgICAgICBpZigvbGVjbG91ZFxcXFwuY29tfGJpbGl2aWRlby8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgICAgIHBsYXlVcmwrPVxcXCI7e1JlZmVyZXJAaHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tLyYmVXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFwiO1xcbiAgICAgICAgICAgIH1lbHNlIGlmKC9peGlndWFcXFxcLmNvbS8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgICAgIHBsYXlVcmwrPVxcXCIjaXN2aWRlbz10cnVlIzt7UmVmZXJlckBodHRwczovL3d3dy5peGlndWEuY29tLyYmVXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBlbHNlIGlmKC9tZ3R2XFxcXC5jb218Ynl0ZWFtb25lLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICAgICAgcGxheVVybCs9XFxcIjt7VXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFwiO1xcbiAgICAgICAgICAgIH1lbHNlIGlmKC9wdHdvXFxcXC53a2ZpbGVcXFxcLmNvbS8udGVzdChwbGF5VXJsKSYmL3VybD0vLnRlc3QocGxheVVybCkpe1xcbiAgICAgICAgICAgICAgICBwbGF5VXJsPXBsYXlVcmwuc3BsaXQoXFxcInVybD1cXFwiKVsxXStcXFwiO3tSZWZlcmVyQGh0dHBzOi8vZmFudHVhbi50dn1cXFwiXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIC8vIOWkhOeQhuWkp+W4iOWFhOS5i+exu+eahGFwcFxcbiAgICAgICAgICAgIC8vIGVsc2V7XFxuICAgICAgICAgICAgLy8gICAgIHBsYXlVcmwrPVxcXCI7e1VzZXItQWdlbnRATW96aWxsYS81LjB9XFxcIjtcXG4gICAgICAgICAgICAvLyB9XFxuICAgICAgICB9XFxuICAgICAgICBwbGF5VXJsPXJlY2hhbmdlKHBsYXlVcmwpO1xcbiAgICAgICAgaWYoIS8jaXNWaWRlbz10cnVlIy8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgcGxheVVybCs9XFxcIiNpc1ZpZGVvPXRydWUjXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIC8vIGxldCB0MiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbiAgICAgICAgLy8gcHJpbnQoJ+WIpOaWrWlzVmlkZW/ogJfml7Y6JysodDItdDEpKTtcXG4gICAgICAgIHJldHVybiBwbGF5VXJsO1xcbiAgICB9ZWxzZXtcXG4gICAgICAgIC8vIGxldCB0MiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbiAgICAgICAgLy8gcHJpbnQoJ+WIpOaWrWlzVmlkZW/ogJfml7Y6JysodDItdDEpKTtcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgfVxcbn1cXG5mdW5jdGlvbiBjb21QYXJzZShwYXJTdHIsZWosb25seWJhY2ssaHRtbCl7XFxuICAgIC8v5YiX6KGo77yM5qCH6aKY77yM5Zu+54mH77yM5o+P6L+w77yM6ZO+5o6l77yM5YaF5a65XFxuICAgIGVqID0gZWp8fGZhbHNlOy8v5pyJ5LqM57qnXFxuICAgIG9ubHliYWNrPW9ubHliYWNrfHxmYWxzZTsvL+WPqui/lOWbnuaVsOaNrlxcbiAgICBodG1sID0gaHRtbHx8Z2V0UmVzQ29kZSgpO1xcbiAgICBodG1sID0gdHlwZW9mKGh0bWwpPT09J3N0cmluZyc/aHRtbDpodG1sLmh0bWw7XFxuICAgIHJldHVybiAkLnRvU3RyaW5nKChwYXJTdHIsZWosb25seWJhY2ssaHRtbCxpc1BpYyk9PntcXG4gICAgICAgIGxldCB0PXBhclN0ci5zcGxpdChcXFwiO1xcXCIpO1xcbiAgICAgICAgbGV0IGQ9W107XFxuICAgICAgICAvLyBsZXQgbGlzdD1wZGZhKGdldFJlc0NvZGUoKSx0WzBdKTtcXG4gICAgICAgIGxldCBsaXN0PXBkZmEoaHRtbCx0WzBdKTtcXG4gICAgICAgIGxldCBsYXp5ID0gJCgnJykubGF6eVJ1bGUoKCk9PntcXG4gICAgICAgICAgICBjb25zdCB7bGF6eVBhcnNlfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2dsb2JhbFBhcnNlP3J1bGU96YGT6ZW/5LuT5bqTUHJvJyk7XFxuICAgICAgICAgICAgcmV0dXJuIGxhenlQYXJzZShpbnB1dClcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZm9yKGxldCBpIGluIGxpc3Qpe1xcbiAgICAgICAgICAgIGxldCBfcGljID0gdFsyXT9wZChsaXN0W2ldLHRbMl0pOicnO1xcbiAgICAgICAgICAgIGlmKGlzUGljKF9waWMpJiYhL0BSZWZlcmVyPS8udGVzdChfcGljKSl7XFxuICAgICAgICAgICAgICAgIF9waWMrPSdAUmVmZXJlcj0nXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBpdD17XFxuICAgICAgICAgICAgICAgIHRpdGxlOnBkZmgobGlzdFtpXSx0WzFdKSxcXG4gICAgICAgICAgICAgICAgcGljX3VybDpfcGljLFxcbiAgICAgICAgICAgICAgICBkZXNjOnBkZmgobGlzdFtpXSx0WzNdKSxcXG4gICAgICAgICAgICAgICAgdXJsOmVqP3BkKGxpc3RbaV0sdFs0XSk6cGQobGlzdFtpXSx0WzRdKStsYXp5XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBpZih0Lmxlbmd0aD41KXsvL+WGheWuue+8jOeUqOS6juaQnOe0olxcbiAgICAgICAgICAgICAgICBpdC5jb250ZW50PXBkZmgobGlzdFtpXSx0WzVdKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBkLnB1c2goaXQpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYob25seWJhY2spe1xcbiAgICAgICAgICAgIHJldHVybiBkXFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICBzZXRSZXN1bHQoZClcXG4gICAgICAgIH1cXG4gICAgfSxwYXJTdHIsZWosb25seWJhY2ssaHRtbCxpc1BpYylcXG59XFxuXFxuZnVuY3Rpb24gaXNCYWRWaWRlbyh2aWRlb1VybCkgey8v5piv5Z2P55qE6KeG6aKRXFxuICAgIGxldCBkbVBhdGggPSAnaGlrZXI6Ly9maWxlcy9jYWNoZS9kaWFvbWFvLnR4dCc7Ly/lkIrmr5vmqKHlvI/ov4fmu6Tmlofku7bot6/lvoRcXG4gICAgbGV0IGRtVXJscztcXG4gICAgdHJ5IHtcXG4gICAgICAgIGRtVXJscyA9IHJlcXVlc3QoZG1QYXRoKS50cmltKCkuc3BsaXQoJ1xcXFxuJykuZmlsdGVyKGl0ID0+IGl0ICYmICFpdC5zdGFydHNXaXRoKCcvLycpKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgZG1VcmxzID0gW107XFxuICAgIH1cXG5cXG4gICAgZnVuY3Rpb24gaGFzRG0odmlkZW9VcmwsIGRtVXJscykgey8v5pKt5pS+5Zyw5Z2A5piv5ZCm5Li65ZCK5q+b6KeG6aKRXFxuICAgICAgICBpZiAoZG1VcmxzLmxlbmd0aCA8IDEpIHtcXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcXG4gICAgICAgIH1cXG4gICAgICAgIGZ1bmN0aW9uIHByaW50KHN0cil7XFxuICAgICAgICAgICAgaWYodHlwZW9mKGxvZykhPT0ndW5kZWZpbmVkJyl7XFxuICAgICAgICAgICAgICAgIGxvZyhzdHIpO1xcbiAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICBmYmEubG9nKHN0cik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgZm9yIChsZXQgZG1Vcmwgb2YgZG1VcmxzKSB7XFxuICAgICAgICAgICAgaWYgKChuZXcgUmVnRXhwKGRtVXJsKSkudGVzdCh2aWRlb1VybCkpIHsvL+aSreaUvuWcsOWdgOWMheWQq+WQiuavm+agh+W/l+eahOWcsOWdgFxcbiAgICAgICAgICAgICAgICBwcmludCgn5ZCK5q+b6KeG6aKRLOiHquWKqOi/h+a7pDonK3ZpZGVvVXJsKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBwcmludCgn6Z2e5ZCK5q+b6KeG6aKRLOWPr+aSreaUvjonK3ZpZGVvVXJsKTtcXG4gICAgICAgIHJldHVybiBmYWxzZVxcbiAgICB9XFxuXFxuICAgIGZ1bmN0aW9uIGlzRG0ocmV0KSB7XFxuICAgICAgICBpZiAoIXJldCkge1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlXFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gaGFzRG0ocmV0LnNwbGl0KCcjJylbMF0uc3BsaXQoJzsnKVswXSwgZG1VcmxzKVxcbiAgICB9XFxuICAgIHJldHVybiBpc0RtKHZpZGVvVXJsKVxcbn1cXG5cXG5mdW5jdGlvbiBsYXp5UGFyc2UocGxheVVybCxtcyx0bSxyZWNoYW5nZSl7XFxuICAgIC8vIGxvZygn6LCD55So5LuT5bqT5YWN5ZeF5o6i5Lyg5Y+C6LaF5pe25Li6OicrbXMpO1xcbiAgICB0bSA9IHBhcnNlSW50KHRtKXx8NTAwMDtcXG4gICAgY29uc3Qge2lzVmlkZW8sZ2V0SGVhZGVycyxpc0JhZFZpZGVvfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2dsb2JhbFBhcnNlP3J1bGU96YGT6ZW/5LuT5bqTUHJvJyk7XFxuICAgIGxldCByZWFsVXJsID0gaXNWaWRlbyhwbGF5VXJsLHJlY2hhbmdlKTtcXG4gICAgLy9sb2cocmVhbFVybCk7XFxuICAgIGlmKHR5cGVvZihyZWFsVXJsKT09J3N0cmluZycpey8vYm9vbOWAvOWwseaYr+Wksei0pVxcbiAgICAgICAgdHJ5e1xcbiAgICAgICAgICAgIGxldCBydXJsPXJlYWxVcmwuc3BsaXQoXFxcIjtcXFwiKVswXS5zcGxpdChcXFwiI1xcXCIpWzBdO1xcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlcXVlc3QocnVybCx7dGltZW91dDp0bX0pKS51cmxcXG4gICAgICAgIH1jYXRjaChlKXtcXG4gICAgICAgICAgICByZXR1cm4gcmVhbFVybFxcbiAgICAgICAgfVxcbiAgICAgICAgLy9yZXR1cm4gcmVhbFVybFxcbiAgICB9XFxuXFxuICAgIC8vbG9nKFxcXCLorr/pl67otoXml7Y6XFxcIit0bSk7XFxuICAgIGxvZyhcXFwi5bCd6K+V6YGT6ZW/5LuT5bqTeDXlhY3ll4U6XFxcIitwbGF5VXJsKTtcXG4gICAgY2xlYXJWYXIoXFxcIl94NWp4VXJsXFxcIik7XFxuICAgIGxldCBiYWQ9JChcXFwi572R57uc5LiN5L2z5oiW6ICF55aR5Ly85a+55pa5572R56uZ5oyC5LqG77yM5L2g6KaB5p+l55yL5YW2572R6aG15ZCX77yfXFxcIikuY29uZmlybSgocGxheVVybCk9PntcXG4gICAgICAgIGxvZyhcXFwi572R56uZ55yL6LW35p2l5oyC5LqGOlxcXCIrcGxheVVybCk7XFxuICAgICAgICByZXR1cm4gcGxheVVybFxcbiAgICB9LHBsYXlVcmwpO1xcbiAgICB0cnl7XFxuICAgICAgICB2YXIgYmFjaz1yZXF1ZXN0KHBsYXlVcmwse2hlYWRlcnM6IGdldEhlYWRlcnMocGxheVVybCksdGltZW91dDp0bX0pO1xcbiAgICAgICAgLy92YXIgYmFjaz1mZXRjaChwbGF5VXJsLHtoZWFkZXJzOiB7J1VzZXItQWdlbnQnOiBQQ19VQX19KTtcXG4gICAgICAgIGlmKCFiYWNrKXtcXG4gICAgICAgICAgICBsb2coXFxcIue9keermVxcXCIrcGxheVVybCtcXFwi56Gu5a6e5ZWl5Lmf5rKh6L+U5ZueXFxcIik7XFxuICAgICAgICAgICAgcmV0dXJuIGJhZFxcbiAgICAgICAgfWVsc2UgaWYoLyNFWFRJTkYvLnRlc3QoYmFjaykpe1xcbiAgICAgICAgICAgIC8vbGV0IGxjYWNoZT1cXFwiL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9jYWNoZS92aWRlby5tM3U4XFxcIjtcXG4gICAgICAgICAgICAvL3dyaXRlRmlsZShsY2FjaGUsYmFjayk7XFxuICAgICAgICAgICAgLy9yZXR1cm4gbGNhY2hlK1xcXCIjI1xcXCIrcGxheVVybCtcXFwiI2lzVmlkZW89dHJ1ZSNcXFwiXFxuICAgICAgICAgICAgcGxheVVybD1jYWNoZU0zdTgocGxheVVybCk7XFxuICAgICAgICAgICAgcmV0dXJuIHBsYXlVcmxcXG4gICAgICAgIH1lbHNlIGlmKCghL+inpuWPkeS6humYsuebl+mTvnzmnKrmjojmnYN85o6l5Y+j6Ziy55uXLy50ZXN0KGJhY2spKSYmKCEvaHR0cHx1cmwvLnRlc3QoYmFjaykpJiYoIS9tc2d8Y29kZXxodG1sLy50ZXN0KGJhY2spKSl7XFxuICAgICAgICAgICAgbG9nKGJhY2spO1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/nlpHkvLzlr7nmlrnmlbDmja7liqDlr4bkuobvvIzlhbfkvZPmlbDmja7nnIvml6Xlv5cnXFxuICAgICAgICB9XFxuICAgIH1jYXRjaChlKXtcXG4gICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgcmV0dXJuIGJhZFxcbiAgICB9XFxuICAgIHRyeSB7XFxuICAgICAgICBiYWNrPUpTT04ucGFyc2UoYmFjayk7XFxuICAgICAgICBsZXQgcmVhbFVybD1iYWNrLnVybDtcXG4gICAgICAgIGlmKHR5cGVvZihyZWFsVXJsKT09XFxcInVuZGVmaW5lZFxcXCJ8fCFyZWFsVXJsKXtcXG4gICAgICAgICAgICBsb2coYmFjayk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+mBk+mVv+S7k+W6k+ino+aekOWksei0pe+8gei/lOWbnuaSreaUvuWcsOWdgOS4uuepulxcXCJcXG4gICAgICAgIH0gZWxzZSBpZih0eXBlb2YoaXNWaWRlbyhyZWFsVXJsLHJlY2hhbmdlKSk9PSdzdHJpbmcnKXtcXG4gICAgICAgICAgICByZXR1cm4gaXNWaWRlbyhyZWFsVXJsLHJlY2hhbmdlKTtcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiByZWFsVXJsK1xcXCIjaXNWaWRlbz10cnVlI1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICAvL2Vsc2V7XFxuICAgICAgICAvL3JlYWxVcmwrPVxcXCI7e1VzZXItQWdlbnRATW96aWxsYS81LjB9XFxcIjtcXG4gICAgICAgIC8vIH1cXG4gICAgfWNhdGNoIChlKSB7XFxuICAgICAgICBsb2coXFxcIuajgOa1i+WIsOino+aekOWPo+mdnmpzb27plJnor686XFxcIitlLm1lc3NhZ2UrJyzlvIDlp4t4NeWFjeWXheaOoicpO1xcbiAgICAgICAgLy8gcmVxdWlyZSgnaHR0cHM6Ly9oamRobnguY29kaW5nLm5ldC9wL2hpa2VyL2QvZHIvZ2l0L3Jhdy9tYXN0ZXIvanMvbHNnLmpzJyk7Ly/lvJXnlKjmnKzlnLDlgqjlrZjmj5Lku7ZcXG4gICAgICAgIGNvbnN0IGxzZz0kLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9sb2NhbFN0b3JhZ2U/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTsvL+W8leeUqOWtkOmhtemdouacrOWcsOWCqOWtmOaPkuS7tlxcbiAgICAgICAgbGV0IGxvY2FsX21zID0gbHNnLmdldEl0ZW0oJ3RpbWVvdXQnKTtcXG4gICAgICAgIGxldCBtcyA9IHBhcnNlSW50KG1zKXx8cGFyc2VJbnQobG9jYWxfbXMpfHw1MDAwO1xcbiAgICAgICAgbGV0IG1heF9jb3VudD1NYXRoLmNlaWwobXMvMjUwKTtcXG4gICAgICAgIGxvZyhcXFwi5pys5qyh5ZeF5o6i6LaF5pe2OlxcXCIrbXMrXFxcIuWFseiuoeW+heaKk+WMhTpcXFwiK21heF9jb3VudCtcXFwi5qyhXFxcIik7XFxuICAgICAgICBzaG93TG9hZGluZygn5ZeF5o6i5Lit77yM6Iul5aSx6LSl5bCx5YiH5o2id2Vi5ZeF5o6iLi4uJyk7XFxuICAgICAgICBsZXQgX3g1ID0gJC50b1N0cmluZygoaXNWaWRlbyxyZWNoYW5nZSxwbGF5VXJsLG1heF9jb3VudCxQQ19VQSxpc0JhZFZpZGVvKT0+e1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGlmKHR5cGVvZihmYmEpPT0ndW5kZWZpbmVkJ3x8IWZiYSl7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgZmJhID0gZnlfYnJpZGdlX2FwcDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mKHJlcXVlc3QpPT0ndW5kZWZpbmVkJ3x8IXJlcXVlc3Qpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwoZmJhLmdldEludGVybmFsSnMoKSk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGZiYS5wdXRWYXIoXFxcIl94NWp4VXJsXFxcIixwbGF5VXJsKTtcXG4gICAgICAgICAgICAgICAgaWYod2luZG93LmNvdW50ID09IG51bGwpe1xcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmNvdW50PTE7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbGV0IHRleHQ9Jyc7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICB0ZXh0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXFxcImJvZHlcXFwiKS5pbm5lclRleHQ7XFxuICAgICAgICAgICAgICAgIH1jYXRjaCAoZSkge2ZiYS5sb2coZS5tZXNzYWdlKX1cXG4gICAgICAgICAgICAgICAgaWYoL+inpuWPkeS6humYsuebl+mTvnzmnKrmjojmnYN85o6l5Y+j6Ziy55uXLy50ZXN0KHRleHQpJiZ3aW5kb3cuY291bnQ9PT0xKXtcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcIuajgOa1i+WIsOacieaOiOadg++8jOW8gOWni+i/h+aOiOadg1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgLy9sb2NhdGlvbi5yZWxvYWQoKTtcXG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWY9ZmJhLmdldFZhcihcXFwiX3g1anhVcmxcXFwiKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB3aW5kb3cuY291bnQrKztcXG4gICAgICAgICAgICAgICAgLy8gZmJhLmxvZygnY291bnQ6Jyt3aW5kb3cuY291bnQrJyxtYXhfY291bnQ6JyttYXhfY291bnQpO1xcbiAgICAgICAgICAgICAgICBpZiggd2luZG93LmNvdW50ID49IG1heF9jb3VudCl7XFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCLotoXov4dcXFwiK21heF9jb3VudCoyNTArXFxcIuavq+enkuacquiOt+WPluWIsOi1hOa6kOWcsOWdgO+8jOi3s+WIsOa6kOe9kemhtSzku6XkuIvmmK/liqDovb3ov4fnmoTlnLDlnYBcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXFwiYm9keVxcXCIpLmlubmVyVGV4dDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYmEubG9nKHRleHQpO1xcbiAgICAgICAgICAgICAgICAgICAgfWNhdGNoIChlKSB7ZmJhLmxvZyhlLm1lc3NhZ2UpfVxcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhKU09OLnN0cmluZ2lmeShfZ2V0VXJscygpKSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmJhLmdldFZhcihcXFwiX3g1anhVcmxcXFwiKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtdXRlTWUoZWxlbSkge1xcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnBhdXNlKCk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHZhciB2aWRlb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCJ2aWRlb1xcXCIpLCBhdWRpb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCJhdWRpb1xcXCIpLCB2MiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcImVtYmVkXFxcIiksIHYzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwiI3BsYXllclxcXCIpO1xcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHZpZGVvcywgZnVuY3Rpb24gKHZpZGVvKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKHZpZGVvKTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKGF1ZGlvcywgZnVuY3Rpb24gKGF1ZGlvKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKGF1ZGlvKTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHYyLCBmdW5jdGlvbiAodikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGVNZSh2KTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHYzLCBmdW5jdGlvbiAodikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGVNZSh2KTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgICAgICB2YXIgdXJscyA9IF9nZXRVcmxzKCk7XFxuICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coSlNPTi5zdHJpbmdpZnkodXJscykpO1xcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHVybHMpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdT11cmxzW2ldO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeXt1PWRlY29kZVVSSUNvbXBvbmVudCh1KTt9Y2F0Y2goZSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU9dW5lc2NhcGUodSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoL3VybD1odHRwLy50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IHUuc3BsaXQoXFxcInVybD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coXFxcInVybOWIhuWJsjpcXFwiK3UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKC91cmw9XFxcXC8vLnRlc3QodSkmJi9cXFxcLm0zdTgvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdCA9IHUubWF0Y2goLyguKilcXFxcL1xcXFwvKC4qPylcXFxcLy8pWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gaG9zdCt1LnNwbGl0KFxcXCJ1cmw9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYmEubG9nKFxcXCJ1cmzliIblibI6XFxcIit1KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigvdmlkPWh0dHAvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gdS5zcGxpdChcXFwidmlkPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwidmlk5YiG5YmyOlxcXCIrdSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoL3ZpZD1cXFxcLy8udGVzdCh1KSYmL1xcXFwubTN1OC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3N0ID0gdS5tYXRjaCgvKC4qKVxcXFwvXFxcXC8oLio/KVxcXFwvLylbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBob3N0K3Uuc3BsaXQoXFxcInZpZD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcInZpZOWIhuWJsjpcXFwiK3UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC9cXFxcPyguKik9aHR0cC8udGVzdCh1KSYmL1xcXFwubTN1OC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBcXFwiaHR0cFxcXCIrdS5zcGxpdCgvXFxcXD8oLiopPWh0dHAvKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcIuWFtuS7luWIhuWJsjpcXFwiK3UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3xpbmRleFxcXFwubTN1OCRcXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC9cXFxcLzFcXFxcLm0zdTgvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgdT11LnJlcGxhY2UoLyZmcm9tPS4qfCZuZXh0PS4qfCZqdW1wPS4qLywnJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlYWxVcmwgPSBpc1ZpZGVvKHUscmVjaGFuZ2UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZihyZWFsVXJsKT09J3N0cmluZycmJiFpc0JhZFZpZGVvKHUpKXsvL+i/h+a7pOWQiuavm+inhumikVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Z5X2JyaWRnZV9hcHAuc2V0V2ViVWEoUENfVUEpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YoZmJhLmdldEhlYWRlclVybCkhPT0ndW5kZWZpbmVkJyYmdHlwZW9mKHJlY2hhbmdlKSE9PSdmdW5jdGlvbicpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGJhY2tVcmwgPSBmYmEuZ2V0SGVhZGVyVXJsKHUucmVwbGFjZShcXFwiO3tcXFwiLFxcXCIjaXNWaWRlbz10cnVlIzt7XFxcIikpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tVcmwgPSBmYmEuZ2V0SGVhZGVyVXJsKHVybHNbaV0pLnJlcGxhY2UoJzt7JywnI2lnbm9yZUltZz10cnVlIyNpc1ZpZGVvPXRydWUjO3snKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1MSA9IGJhY2tVcmwuc3BsaXQoJyNpZ25vcmVJbWcnKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1MiA9ICcjaWdub3JlSW1nJytiYWNrVXJsLnNwbGl0KCcjaWdub3JlSW1nJylbMV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IHUxLnJlcGxhY2UoLyZmcm9tPS4qfCZuZXh0PS4qfCZqdW1wPS4qLywnJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigvdXJsPWh0dHAvLnRlc3QodTEpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IHUxLnNwbGl0KFxcXCJ1cmw9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoL3VybD1cXFxcLy8udGVzdCh1MSkmJi9cXFxcLm0zdTgvLnRlc3QodTEpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdDEgPSB1MS5tYXRjaCgvKC4qKVxcXFwvXFxcXC8oLio/KVxcXFwvLylbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEgPSBob3N0MSt1MS5zcGxpdChcXFwidXJsPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYmEubG9nKFxcXCJ1cmzliIblibI6XFxcIit1KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoL3ZpZD1odHRwLy50ZXN0KHUxKSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEgPSB1MS5zcGxpdChcXFwidmlkPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKC92aWQ9XFxcXC8vLnRlc3QodTEpJiYvXFxcXC5tM3U4Ly50ZXN0KHUxKSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvc3QxID0gdTEubWF0Y2goLyguKilcXFxcL1xcXFwvKC4qPylcXFxcLy8pWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxID0gaG9zdDErdTEuc3BsaXQoXFxcInZpZD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC9cXFxcPyguKik9aHR0cC8udGVzdCh1MSkmJi9cXFxcLm0zdTgvLnRlc3QodTEpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IFxcXCJodHRwXFxcIit1MS5zcGxpdCgvXFxcXD8oLiopPWh0dHAvKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrVXJsID0gdTEgKyB1MjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coJ+i/lOWbnuiHquWKqOWKoGNvb2tpZemTvuaOpTonK2JhY2tVcmwpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZygn6L+U5Zue6ZO+5o6lOicrdSsn5bm26Ieq5Yqo5Yqg5LqGY29va2llLOWFt+S9k2Nvb2tpZeWcqOinhumikeaSreaUvuWkhOafpeeciycpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhY2tVcmw7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcIui/lOWbnuS7k+W6k3g15YWN5ZeF57uT5p6cOlxcXCIrcmVhbFVybCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbFVybFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgIC8vIGZ5X2JyaWRnZV9hcHAubG9nKCd4NeWkp+iMg+WbtOmUmeivrzonK2UubWVzc2FnZSk7XFxuICAgICAgICAgICAgICAgIGFsZXJ0KCd4NeWkp+iMg+WbtOmUmeivrzonK2UubWVzc2FnZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/miqXplJnnu5PmnZ94NSdcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LGlzVmlkZW8scmVjaGFuZ2UscGxheVVybCxtYXhfY291bnQsUENfVUEsaXNCYWRWaWRlbyk7XFxuICAgICAgICBsZXQgdXNlV2ViPWxzZy5nZXRJdGVtKFxcXCLpgJrlhY1cXFwiLFxcXCJYNVxcXCIpPT09XFxcIldFQlxcXCI7XFxuICAgICAgICAvL2xvZyhcXFwi5LuT5bqT5L2/55Sod2Vi6YCa5YWN5pu/5LujeDU6XFxcIit1c2VXZWIpO1xcbiAgICAgICAgbGV0IHJ1bGVIZWFkPXVzZVdlYiYmcGFyc2VJbnQoZ2V0QXBwVmVyc2lvbigpKT49MjMzOT9cXFwid2ViUnVsZTovL1xcXCI6XFxcIng1UnVsZTovL1xcXCI7XFxuICAgICAgICBsZXQgeDVVcmwgPSBydWxlSGVhZCtwbGF5VXJsKyAnQCcgK194NTtcXG4gICAgICAgIHJldHVybiB4NVVybFxcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIHg1UGFyc2VQcm8oeDVsaXN0LHg1VGltZW91dCxpc1ZpZGVvKXtcXG4gICAgbGV0IGJwYXRoID0gJ2ZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL3J1bGVzL2R6SG91c2UvaHRtbC/mtbfpmJTll4XmjqLlmaguaHRtbCc7XFxuICAgIGxldCBiY29kZSA9IGZldGNoKGJwYXRoKTtcXG4gICAgaWYoIWJjb2RlfHwhL2Z5X2JyaWRnZV9hcHAvLnRlc3QoYmNvZGUpKXtcXG4gICAgICAgIGxvZygn5pys5Zyw5pyq5a6J6KOF5ZeF5o6i5Zmo77yM5byA5aeL5a6J6KOFJyk7XFxuICAgICAgICBjb25zdCB7YXBpfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICAgICAgbGV0IGh0bWwgPSBmZXRjaChhcGkuaG9zdCsnL3J1bGVsaXN0Lmpzb24/aWQ9MjA1NScpO1xcbiAgICAgICAgaWYoL+a1t+mYlOinhueVjC8udGVzdChodG1sKSl7XFxuICAgICAgICAgICAgd3JpdGVGaWxlKGJwYXRoLGh0bWwpO1xcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgd3JpdGVGaWxlKGJwYXRoLGZldGNoKCdodHRwczovL2hqZGhueC5jb2RpbmcubmV0L3AvaGlrZXIvZC9kci9naXQvcmF3L21hc3Rlci9odG1sL2dldFZpZGVvLmh0bWwnKSlcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICB4NVRpbWVvdXQgPSBwYXJzZUludCh4NVRpbWVvdXQpfHw1MDAwO1xcbiAgICBsZXQgbWF4X2NvdW50PSh4NVRpbWVvdXQvMjUwKTsgLy/moLnmja7otoXml7boh6rliqjorqHnrpfkuoblj6/miafooYznmoTmrKHmlbBcXG4gICAgcHV0VmFyKCd4NUxpc3QnLEpTT04uc3RyaW5naWZ5KHg1bGlzdCkpO1xcbiAgICBsZXQgX3g1ID0gJC50b1N0cmluZygoaXNWaWRlbywgbWF4X2NvdW50LHg1VGltZW91dCxpc0JhZFZpZGVvKSA9PiB7XFxuICAgICAgICAvL+WIneWni+WMlmZiYeWSjHJlcXVzdFxcbiAgICAgICAgaWYgKHR5cGVvZiAoZmJhKSA9PSAndW5kZWZpbmVkJyB8fCAhZmJhKSB7XFxuICAgICAgICAgICAgdmFyIGZiYSA9IGZ5X2JyaWRnZV9hcHA7XFxuICAgICAgICB9XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJlcXVlc3QpID09ICd1bmRlZmluZWQnIHx8ICFyZXF1ZXN0KSB7XFxuICAgICAgICAgICAgICAgIGV2YWwoZmJhLmdldEludGVybmFsSnMoKSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKTtcXG4gICAgICAgIH1cXG4gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tXFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGlmICh3aW5kb3cuY291bnQgPT0gbnVsbCkge1xcbiAgICAgICAgICAgICAgICB3aW5kb3cuY291bnQgPSAxO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgdGV4dD0nJztcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICB0ZXh0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXFxcImJvZHlcXFwiKS5pbm5lclRleHQ7XFxuICAgICAgICAgICAgfWNhdGNoIChlKSB7ZmJhLmxvZyhlLm1lc3NhZ2UpfVxcbiAgICAgICAgICAgIGlmKC/op6blj5HkuobpmLLnm5fpk7585pyq5o6I5p2DfOaOpeWPo+mYsuebly8udGVzdCh0ZXh0KSYmd2luZG93LmNvdW50PT0xKXtcXG4gICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XFxuICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcIuajgOa1i+WIsOacieaOiOadg++8jOW8gOWni+i/h+aOiOadg1xcXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB3aW5kb3cuY291bnQrKztcXG4gICAgICAgICAgICAvLyBmYmEubG9nKCdjb3VudDonICsgd2luZG93LmNvdW50ICsgJyxtYXhfY291bnQ6JyArIG1heF9jb3VudCk7XFxuICAgICAgICAgICAgaWYgKHdpbmRvdy5jb3VudCA+PSBtYXhfY291bnQpIHtcXG4gICAgICAgICAgICAgICAgZmJhLmNsZWFyVmFyKCd4NUxpc3QnKTtcXG4gICAgICAgICAgICAgICAgZmJhLmhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgICAgIGxldCBmbXNnID0gJ+mBk+mVv+S7k+W6k+mAmuWFjeino+aekOWksei0pSzljp/lm6A66LaF5pe2Jyt4NVRpbWVvdXQrJ+avq+enkic7XFxuICAgICAgICAgICAgICAgIGZiYS5sb2coZm1zZyk7XFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK2Ztc2c7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgZnVuY3Rpb24gbXV0ZU1lKGVsZW0pIHtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBlbGVtLnBhdXNlKCk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG5cXG4gICAgICAgIHZhciB2aWRlb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCJ2aWRlb1xcXCIpLCBhdWRpb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCJhdWRpb1xcXCIpLFxcbiAgICAgICAgICAgIHYyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwiZW1iZWRcXFwiKSwgdjMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCIjcGxheWVyXFxcIik7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2aWRlb3MsIGZ1bmN0aW9uICh2aWRlbykge1xcbiAgICAgICAgICAgICAgICBtdXRlTWUodmlkZW8pO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwoYXVkaW9zLCBmdW5jdGlvbiAoYXVkaW8pIHtcXG4gICAgICAgICAgICAgICAgbXV0ZU1lKGF1ZGlvKTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHYyLCBmdW5jdGlvbiAodikge1xcbiAgICAgICAgICAgICAgICBtdXRlTWUodik7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB9XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2MywgZnVuY3Rpb24gKHYpIHtcXG4gICAgICAgICAgICAgICAgbXV0ZU1lKHYpO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgfVxcbiAgICAgICAgdmFyIHVybHMgPSBfZ2V0VXJscygpO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBmb3IgKGxldCBpIGluIHVybHMpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHU9dXJsc1tpXTtcXG4gICAgICAgICAgICAgICAgLy91PWRlY29kZVVSSUNvbXBvbmVudCh1KTtcXG4gICAgICAgICAgICAgICAgdHJ5e3U9ZGVjb2RlVVJJQ29tcG9uZW50KHUpO31jYXRjaChlKXtcXG4gICAgICAgICAgICAgICAgICAgIHU9dW5lc2NhcGUodSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYoL3VybD1odHRwLy50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgIHUgPSB1LnNwbGl0KFxcXCJ1cmw9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZigvdmlkPWh0dHAvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgdSA9IHUuc3BsaXQoXFxcInZpZD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKC9cXFxcPyguKik9aHR0cC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICB1ID0gXFxcImh0dHBcXFwiK3Uuc3BsaXQoL1xcXFw/KC4qKT1odHRwLykuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgLy9mYmEubG9nKFxcXCLlhbbku5bliIblibI6XFxcIit1KTtcXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoL1xcXFwvMVxcXFwubTN1OCQvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgdT11LnJlcGxhY2UoLyZmcm9tPS4qfCZuZXh0PS4qfCZqdW1wPS4qLywnJyk7XFxuICAgICAgICAgICAgICAgIGxldCByZWFsVXJsID0gaXNWaWRlbyh1KTtcXG4gICAgICAgICAgICAgICAgaWYgKHJlYWxVcmwmJiFpc0JhZFZpZGVvKHUpKSB7Ly/ov4fmu6TlkIrmr5tcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcIuS7k+W6k3g15YWN5ZeF57uT5p6cOlxcXCIgKyByZWFsVXJsKTtcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5jbGVhclZhcigneDVMaXN0Jyk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbFVybFxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKVxcbiAgICAgICAgfVxcbiAgICB9LCBpc1ZpZGVvLCBtYXhfY291bnQseDVUaW1lb3V0LGlzQmFkVmlkZW8pO1xcbiAgICBjb25zdCBsc2c9JC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbG9jYWxTdG9yYWdlP3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIGxldCB1c2VXZWI9bHNnLmdldEl0ZW0oXFxcIumAmuWFjVxcXCIsXFxcIlg1XFxcIik9PT1cXFwiV0VCXFxcIjtcXG4gICAgLy9sb2coXFxcIuS7k+W6k+S9v+eUqHdlYumAmuWFjeabv+S7o3g1OlxcXCIrdXNlV2ViKTtcXG4gICAgbGV0IHJ1bGVIZWFkPXVzZVdlYiYmcGFyc2VJbnQoZ2V0QXBwVmVyc2lvbigpKT49MjMzOT9cXFwid2ViUnVsZTovL1xcXCI6XFxcIng1UnVsZTovL1xcXCI7XFxuICAgIHJldHVybiBydWxlSGVhZCticGF0aCsnQCcgKyBfeDU7XFxufVxcblxcbmZ1bmN0aW9uIExhenlQYXJzZUZhc3QocGxheVVybExpc3QsZ2V0VGltZW91dCx4NVRpbWVvdXQpe1xcbiAgICBjb25zdCB7aXNWaWRlbyxnZXRIZWFkZXJzLHg1UGFyc2VQcm99ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZ2xvYmFsUGFyc2U/cnVsZT3pgZPplb/ku5PlupNQcm8nKTtcXG4gICAgLy8gbG9nKCflvIDlp4vmiafooYwnK3BsYXlVcmxMaXN0Lmxlbmd0aCsn5Liq5Zyw5Z2A55qE5om56YeP5ZeF5o6iOicrcGxheVVybExpc3QpO1xcbiAgICBsb2coJ+W8gOWni+aJp+ihjCcrcGxheVVybExpc3QubGVuZ3RoKyfkuKrlnLDlnYDnmoTmibnph4/ll4XmjqInKTtcXG4gICAgbGV0IHBsYXlVcmxzID0gcGxheVVybExpc3QubWFwKChpdCk9PntcXG4gICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgdXJsOml0LnNwbGl0KFxcXCI7XFxcIilbMF0sXFxuICAgICAgICAgICAgb3B0aW9uczoge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAvL1xcXCJVc2VyLUFnZW50XFxcIjogXFxcIkRhcnQvMi4xMyAoZGFydDppbylcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOlxcXCJNb3ppbGxhLzUuMFxcXCJcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgdGltZW91dDogZ2V0VGltZW91dFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGxldCBiaHRtbCA9IGJhdGNoRmV0Y2gocGxheVVybHMpO1xcbiAgICBsZXQgdmlkZW9zID0gW107XFxuICAgIGxldCB4NWxpc3QgPSBbXTtcXG4gICAgZm9yKGxldCBpIGluIGJodG1sKXtcXG4gICAgICAgIGxldCBvcmRlciA9IHBhcnNlSW50KGkpKzE7XFxuICAgICAgICBsZXQgdG5hbWU9b3JkZXIrJ+WPt+ino+aekOe9keWdgDonO1xcbiAgICAgICAgLy9sb2codG5hbWUpO1xcbiAgICAgICAgbGV0IHR1cmw9cGxheVVybExpc3RbaV0uc3BsaXQoXFxcIjtcXFwiKVswXTtcXG4gICAgICAgIGxldCBqbmFtZT1wbGF5VXJsTGlzdFtpXS5zcGxpdChcXFwiO1xcXCIpLmxlbmd0aD4xP3BsYXlVcmxMaXN0W2ldLnNwbGl0KFxcXCI7XFxcIilbMV06XFxcIlxcXCI7XFxuICAgICAgICB0bmFtZSs9am5hbWU7XFxuICAgICAgICBsZXQgYmFja2NvZGUgPSBiaHRtbFtpXTtcXG4gICAgICAgIGlmKCghL3VybHxodHRwLy50ZXN0KGJhY2tjb2RlKSkmJighLyNFWFRJTkYvLnRlc3QoYmFja2NvZGUpKSl7XFxuICAgICAgICAgICAgbG9nKHRuYW1lK3R1cmwrJ+aciemXrumimCzlj6/og73liqDlr4bmiJbogIXmjILkuoYnKTtcXG4gICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgIH1lbHNlIGlmKC8jRVhUSU5GLy50ZXN0KGJhY2tjb2RlKSl7XFxuICAgICAgICAgICAgLy9sZXQgbGNhY2hlPVxcXCIvc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL2NhY2hlL3ZpZGVvX1xcXCIrdG5hbWUrXFxcIi5tM3U4XFxcIjtcXG4gICAgICAgICAgICAvL3dyaXRlRmlsZShsY2FjaGUsYmFja2NvZGUpO1xcbiAgICAgICAgICAgIC8vdmlkZW9zLnB1c2gobGNhY2hlKTtcXG4gICAgICAgICAgICBsZXQgcFVybD1jYWNoZU0zdTgodHVybCk7XFxuICAgICAgICAgICAgdmlkZW9zLnB1c2gocFVybCk7XFxuICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICB9XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBKU09OLnBhcnNlKGJhY2tjb2RlKS51cmw7XFxuICAgICAgICAgICAgaWYoL15odHRwLy50ZXN0KHVybCkpe1xcbiAgICAgICAgICAgICAgICBsZXQgcmVhbFZpZGVvID0gaXNWaWRlbyh1cmwpO1xcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YocmVhbFZpZGVvKT09J3N0cmluZycpe1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKHRuYW1lKyflt7Lop6PmnpDlh7rop4bpopE6JytyZWFsVmlkZW8pO1xcbiAgICAgICAgICAgICAgICAgICAgaWYoam5hbWUpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxWaWRlbys9XFxcIuKYhVxcXCIram5hbWVcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvcy5wdXNoKHJlYWxWaWRlbyk7XFxuICAgICAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKHRuYW1lKyfop6PmnpDlh7rkuI3nn6XpgZPku4DkuYjkuJzopb86Jyt1cmwpO1xcbiAgICAgICAgICAgICAgICAgICAgdXJsKz1cXFwiI2lzVmlkZW89dHJ1ZSNcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgaWYoam5hbWUpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCs9XFxcIuKYhVxcXCIram5hbWVcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvcy5wdXNoKHVybCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgbG9nKHRuYW1lKyfkuLpqc29u5o6l5Y+j5LiU5peg6L+U5Zue6KeG6aKR5Zyw5Z2A5pWw5o2uOicrcGxheVVybExpc3RbaV0rJ1xcXFxuJytiYWNrY29kZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKHRuYW1lKyfkuLp4NeaOpeWPoyzliqDlhaV4NeWXheaOouWIl+ihqCcpO1xcbiAgICAgICAgICAgIHg1bGlzdC5wdXNoKHBsYXlVcmxMaXN0W2ldKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICAvLyBsb2codmlkZW9zKTtcXG4gICAgaWYodmlkZW9zLmxlbmd0aD4wKXtcXG4gICAgICAgIGlmKGdldFZhcignZHAuY2FjaGVWaWRlbycsJ3RydWUnKT09PSd0cnVlJyYmcGFyc2VJbnQoZ2V0QXBwVmVyc2lvbigpKT49MjI1NSlcXG4gICAgICAgIHtcXG4gICAgICAgICAgICBsb2coXFxcIuWwiuaVrOeahOmtlOaWreeUqOaIt++8jOinhumikee8k+WtmOW3suWQr+eUqO+8jOivt+WwveaDheS6q+WPl+eci+WJp+aXtuWFiVxcXCIpO1xcbiAgICAgICAgICAgIGxldCB2aWRlb3NDYWNoZT12aWRlb3MubWFwKChpdCk9PntcXG4gICAgICAgICAgICAgICAgbGV0IGhlYWRlcnM9e307XFxuICAgICAgICAgICAgICAgIGlmKGl0LnNwbGl0KFxcXCI7XFxcIikubGVuZ3RoPjEpe1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhlYWQgPSBpdC5zcGxpdCgnOycpWzFdO1xcbiAgICAgICAgICAgICAgICAgICAgaWYoL0AvLnRlc3QoaGVhZCkmJi97fH0vLnRlc3QoaGVhZCkpe1xcbi8vaGVhZCA9IGhlYWQucmVwbGFjZSgve3x9L2csJycpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQgPSBoZWFkLnNwbGl0KFxcXCJ7XFxcIilbMV0uc3BsaXQoXFxcIn1cXFwiKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkID0gaGVhZC5zcGxpdCgnJiYnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gaGVhZCl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSBoZWFkW2ldLnNwbGl0KCdAJylbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9aGVhZFtpXS5zcGxpdCgnQCcpWzFdLnJlcGxhY2UoLzsvLCfvvJvvvJsnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1trZXldID0gdmFsdWU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgICAgICB1cmw6aXQuc3BsaXQoXFxcIjtcXFwiKVswXS5zcGxpdChcXFwi4piFXFxcIilbMF0sXFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOntcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOmhlYWRlcnNcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHZhciBkYXRhPWJhdGNoQ2FjaGVNM3U4KHZpZGVvc0NhY2hlKTtcXG4gICAgICAgICAgICBkYXRhPWRhdGEubWFwKChpdCxpZCk9PntcXG4gICAgICAgICAgICAgICAgbGV0IGV4dHJhPVxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICBpZih2aWRlb3NbaWRdLnNwbGl0KFxcXCI7XFxcIikubGVuZ3RoPjEpe1xcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE9XFxcIjtcXFwiK3ZpZGVvc1tpZF0uc3BsaXQoXFxcIjtcXFwiKVsxXTtcXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYodmlkZW9zW2lkXS5zcGxpdChcXFwi4piFXFxcIikubGVuZ3RoPjEpe1xcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE9XFxcIuKYhVxcXCIrdmlkZW9zW2lkXS5zcGxpdChcXFwi4piFXFxcIilbMV07XFxuICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgICAgaWYoaXQrXFxcIlxcXCIhPVxcXCJudWxsXFxcIil7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQrZXh0cmFcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlkZW9zW2lkXVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgLy9sb2coZGF0YSk7XFxuICAgICAgICAgICAgcmV0dXJuIGRhdGFcXG4gICAgICAgICAgICAvL3JldHVybiB2aWRlb3NcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiB2aWRlb3NcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBsb2coJ+WFseaciScreDVsaXN0Lmxlbmd0aCsn5LiqeDXlnLDlnYDov5vooYzova7mtYHll4XmjqInKTtcXG4gICAgLy/msqHmnInnmoTor53lsLHlvIDlp4vkvp3mrKF4NeWXheaOolxcbiAgICBzaG93TG9hZGluZygn5ZeF5o6i5Lit77yM6Iul5aSx6LSl5bCx5YiH5o2id2Vi5ZeF5o6iLi4uJyk7XFxuICAgIHJldHVybiB4NVBhcnNlUHJvKHg1bGlzdCx4NVRpbWVvdXQsaXNWaWRlbyk7XFxufVxcbnZhciBsYXp5PSQoJycpLmxhenlSdWxlKCgpPT57XFxuICAgIHRyeXtcXG4gICAgICAgIHJlYWxVcmw9aW5wdXQ7XFxuICAgICAgICBldmFsKFxcXCJ2YXIgY29uZmlnX2RwID1cXFwiICsgZmV0Y2goXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvTXlQYXJzZVNldC5qc29uXFxcIikpO1xcbiAgICAgICAgZXZhbChmZXRjaChjb25maWdfZHAuY2opKTtcXG4gICAgICAgIGxvZyhpbnB1dCsnLT7mraPlnKjmlq3mj5LprZTmlLnniYjop6PmnpAuLi4nKTtcXG4gICAgICAgIC8vIOWKoOWFpei2heaXtuiuvue9ru+8jOW7uuiuruWcqOmmlumhteiuvue9rlxcbiAgICAgICAgcmV0dXJuIGF5dG1QYXJzZShyZWFsVXJsKVxcbiAgICB9Y2F0Y2goZSl7XFxuICAgICAgICByZXR1cm4gaW5wdXRcXG4gICAgfVxcbn0pO1xcbiQuZXhwb3J0cy5pc1BpYz1pc1BpYztcXG4kLmV4cG9ydHMuaXNWaWRlbz1pc1ZpZGVvO1xcbiQuZXhwb3J0cy5pc0JhZFZpZGVvPWlzQmFkVmlkZW87XFxuJC5leHBvcnRzLmNvbVBhcnNlPWNvbVBhcnNlO1xcbiQuZXhwb3J0cy5nZXRIZWFkZXJzPWdldEhlYWRlcnM7XFxuJC5leHBvcnRzLmxhenlQYXJzZT1sYXp5UGFyc2U7XFxuJC5leHBvcnRzLng1UGFyc2VQcm89eDVQYXJzZVBybztcXG4kLmV4cG9ydHMuTGF6eVBhcnNlRmFzdD1MYXp5UGFyc2VGYXN0O1xcbiQuZXhwb3J0cy5sYXp5PWxhenk7XCJ9LHtcIm5hbWVcIjpcIuS7u+WKoeS7k+W6k+aOpeWPo1wiLFwicGF0aFwiOlwidGFza0NhbGxcIixcInJ1bGVcIjpcImpzOlxcblN0cmluZy5wcm90b3R5cGUuc3RyaXAgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnJlcGxhY2UoLyheXFxcXHMqKXwoXFxcXHMqJCkvZywgXFxcIlxcXCIpOyB9O1xcbmZ1bmN0aW9uIHRhc2tfcmVxKHRhc2tfYXBpLHRhc2spIHsgLy8g6YCa55So5Y+R6YCB5LuT5bqTcG9zdOiwg+eUqOS7u+WKoeivt+axglxcbiAgICBjb25zdCB7Z2V0RmlsZX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgbGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcbiAgICBpZighaG91c2VGaWxlKXtcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcbiAgICB9XFxuICAgIGxldCBob3VzZV9kYXRhID0gaG91c2VGaWxlKCk7XFxuICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KHRhc2tfYXBpLCB7XFxuICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcbiAgICAgICAgfSxcXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICBcXFwicGFyYW1zXFxcIjoge1xcbiAgICAgICAgICAgICAgICBcXFwiZGF0YVxcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJ0eXBlXFxcIjogdGFzay5tb2RlfHwncnVuJyxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJmdW5jXFxcIjogdGFzay5mdW5jfHwnJyxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB0YXNrLnBhcmFtc3x8W11cXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgXFxcImF1dGhcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwibmFtZVxcXCI6IGhvdXNlX2RhdGEudXNlcm5hbWV8fFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogaG91c2VfZGF0YS5wYXNzd29yZHx8XFxcIlxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pLFxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgfSk7XFxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbn1cXG5cXG5mdW5jdGlvbiB0YXNrX3VwbG9hZCh0YXNrKXsgLy8g6YCa55So5Lu75Yqh5Y+R5biD5paw5aKe5Y+K5L+u5pS55Yqf6IO9XFxuICAgIGNvbnN0IHthcGksZ2V0RmlsZX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgbGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcbiAgICBpZighaG91c2VGaWxlKXtcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcbiAgICB9XFxuICAgIGxldCBhcGlfdXJsID0gYXBpLmhvc3QrJy9oaWtlcnVsZS90YXNrL2FkZCc7XFxuICAgIGxldCBob3VzZV9kYXRhID0gaG91c2VGaWxlKCk7XFxuICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGFwaV91cmwsIHtcXG4gICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICB9LFxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgIFxcXCJkYXRhXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIm5hbWVcXFwiOiB0YXNrLm5hbWUsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicHljb2RlXFxcIjogdGFzay5weWNvZGUsXFxuICAgICAgICAgICAgICAgICAgICBcXFwibm90ZVxcXCI6IHRhc2subm90ZSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJ0ZXN0X2NvZGVcXFwiOiB0YXNrLnRlc3RfY29kZSxcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgXFxcImF1dGhcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwibmFtZVxcXCI6IGhvdXNlX2RhdGEudXNlcm5hbWV8fFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogaG91c2VfZGF0YS5wYXNzd29yZHx8XFxcIlxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pLFxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgfSk7XFxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbn1cXG5cXG5mdW5jdGlvbiB0YXNrX2NhbGwoaWQsZnVuYyxwYXJhbXMpe1xcbiAgICBjb25zdCB7YXBpfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICBsZXQgdGFza19hcGkgPSBhcGkuaG9zdCsnL2hpa2VydWxlL3Rhc2svcnVuLycraWQ7XFxuICAgIGxldCB0YXNrID0ge1xcbiAgICAgICAgbW9kZTonY2FsbCcsXFxuICAgICAgICBmdW5jOmZ1bmMsXFxuICAgICAgICBwYXJhbXM6cGFyYW1zfHxbXVxcbiAgICB9O1xcbiAgICByZXR1cm4gdGFza19yZXEodGFza19hcGksdGFzayk7XFxufVxcblxcbmZ1bmN0aW9uIHRhc2tfcmVuYW1lKGlkLG5ld190YXNrX25hbWUpe1xcbiAgICBjb25zdCB7YXBpLGdldEZpbGV9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIGxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXG4gICAgaWYoIWhvdXNlRmlsZSl7XFxuICAgICAgICBzZXRJdGVtKCdpc19ob3VzZV92aXAnLCAnZmFsc2UnKTtcXG4gICAgfVxcbiAgICBsZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcbiAgICBsZXQgdGFza19hcGkgPSBhcGkuaG9zdCsnL2hpa2VydWxlL3Rhc2svcmVuYW1lLycraWQ7XFxuICAgIHRhc2tfYXBpID0gdGFza19hcGkrJz9uYW1lPScraG91c2VfZGF0YS51c2VybmFtZSsnJnBhc3N3b3JkPScraG91c2VfZGF0YS5wYXNzd29yZCsnJnRhc2tfbmFtZT0nK25ld190YXNrX25hbWU7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gSlNPTi5wYXJzZShmZXRjaCh0YXNrX2FwaSx7fSkpO1xcbiAgICAgICAgaWYocmVzdWx0LnN0YXR1cz09MCl7XFxuICAgICAgICAgICAgcmV0dXJuICByZXN1bHQuZGV0YWlsXFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCsnJytyZXN1bHQuZGV0YWlsXFxuICAgICAgICB9XFxuICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxuICAgICAgICByZXR1cm4gJycrZS5tZXNzYWdlXFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gdGFza19jaGFuZ2Vfc3RhdGUoaWQpe1xcbiAgICBjb25zdCB7YXBpLGdldEZpbGV9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIGxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXG4gICAgaWYoIWhvdXNlRmlsZSl7XFxuICAgICAgICBzZXRJdGVtKCdpc19ob3VzZV92aXAnLCAnZmFsc2UnKTtcXG4gICAgfVxcbiAgICBsZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcbiAgICBsZXQgdGFza19hcGkgPSBhcGkuaG9zdCsnL2hpa2VydWxlL3Rhc2svY2hhbmdlX3N0YXRlLycraWQ7XFxuICAgIHRhc2tfYXBpID0gdGFza19hcGkrJz9uYW1lPScraG91c2VfZGF0YS51c2VybmFtZSsnJnBhc3N3b3JkPScraG91c2VfZGF0YS5wYXNzd29yZDtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKGZldGNoKHRhc2tfYXBpLHt9KSk7XFxuICAgICAgICBpZihyZXN1bHQuc3RhdHVzPT0wKXtcXG4gICAgICAgICAgICByZXR1cm4gIHJlc3VsdC5kZXRhaWxcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0KycnK3Jlc3VsdC5kZXRhaWxcXG4gICAgICAgIH1cXG4gICAgfWNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS5tZXNzYWdlKTtcXG4gICAgICAgIHJldHVybiAnJytlLm1lc3NhZ2VcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiB0YXNrX3J1bihpZCl7XFxuICAgIGNvbnN0IHthcGl9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIGxldCB0YXNrX2FwaSA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9ydW4vJytpZDtcXG4gICAgbGV0IHRhc2sgPSB7fTtcXG4gICAgcmV0dXJuIHRhc2tfcmVxKHRhc2tfYXBpLHRhc2spO1xcbn1cXG5cXG4kLmV4cG9ydHMudGFza0NhbGwgPSB0YXNrX2NhbGw7XFxuJC5leHBvcnRzLnRhc2tSdW4gPSB0YXNrX3J1bjtcXG4kLmV4cG9ydHMudGFza1JlcSA9IHRhc2tfcmVxO1xcbiQuZXhwb3J0cy50YXNrVXBsb2FkID0gdGFza191cGxvYWQ7XFxuJC5leHBvcnRzLnRhc2tSZW5hbWUgPSB0YXNrX3JlbmFtZTtcXG4kLmV4cG9ydHMudGFza0NoYW5nZVN0YXRlID0gdGFza19jaGFuZ2Vfc3RhdGU7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlhajlsYDlgqjlrZhcIixcInBhdGhcIjpcImxvY2FsU3RvcmFnZVwiLFwicnVsZVwiOlwibGV0IGxvY2FsU3RvcmFnZSA9IChmdW5jdGlvbigpIHtcXG4gICAgZXZhbFByaXZhdGVKUyhcXFwiandVS3dOVGlQR2NXU0xDWEI1WHRBWHdiNkxRYlZ5SEQrMFhKN2wwN2NlMD1cXFwiKTtcXG4gICAgLy9wYXRodG89dW5kZWZpbmVkO1xcbiAgICBldmFsUHJpdmF0ZUpTKFxcXCI0QzBZeFJZbkdDWWtnRlJYdHBsL0N6NXpMNWhoNGpDQ3p0YituZytXb2t5bVE4b1VyelM5bEE4eXhDNWFGYWRuU0VteUhLTWJyYWZsUnFYQ25OUkhEbGs2dWU4eUhUTzE2bEJQcnB3Z3M1amYwUGhyQXRvVEpJRTBaSG45bUthUTRKZDJlcnFiNEk1NWJlV0lldWdLc0RzMjExU3pJTlE1eUpnU2gxZFZ1Tnp6eFJHSmc0MEZtVHVWbVhWZk4xeGcyV0lHSEJFbWtWbkd4bU9SaFBPTkErUTVWd1BtZHA0MS9oemUzZUlzVXZobzdWQ0JnSzRyYUptUGFsSVJCQlZsQ1ZnbjhGa1dtZktxWm8rVlcrb0JjSDdocmNyc1NsQ1NqQmFuZ1QvN3N5V0h4S1loZWhVMGthTVlqbldGZzFFbTBjbU5SdG9tQ3NIejFCOHEzMk9lUUhvYXdkV3h6S09hTUhPWERCalJvakE4RS9haDBXUk95emlxUlN4bC9tOGRoQmQwZjlwaFl6LzVTVS96SkQ1MlgvOUVDMTZXVlZkcFNXMzNha1JIUnNsUHBSbFRXRjkrQXlSbVJ3MGVaT0VzMW85UU1QQVFVZkF4Yll5RkhnenR3L08yZEpScEh5VG1pQmlhYXFUY2l2eDZ2OXp5dkJ6MDR3STFBYVNDdWkrZFR1VTNsdTV4ZEV0M0FqdDZaM2lEWE9WY0VQMEVERjc0NzRQUVU2SkVadXdlOTdTY2g0Ymkxd0IxWEhaU2ZJdGRsWVlvR2VkM0xMcGJtREFJUmNpdjByQW9wOFZtUWNUdDJLM0xmaDFSRFlZMFl0dlJjSDQ5T3ZwRFJIL3hhNUZjOE1ZM0RyRm9BN3Fjb0Y0ZUNnaVZCZkJnSlI2OCtMcFFLN3RPa2c4azllYyszTlN4SlRoY2w4ZDZ5Tnd4VDlUazE3emVKZ2Q2TW95WVpJcFdRTGxGNll2Yk9kRVdoam1uQTc4d0MwaFd6K1htNmhRTVNxdEZ3K2JoRmY3Y0JHVTNhYXRQRm1kQ1kyRWRYZmgwSVlXODV3ZE95TWZpd1c3L3ZWVHA5aUUwMEkzRjA5d0dIa0dLaFZiTHVlQWtZZTd6ekpYUjd0aGFGb3I2SDdxTG1KamJSUWs5ZXZOdEJRWE5SN0RpZmlYdVFmMmx0N25PSDgwU1dtMWZESEh6am1Qc05JcHMyVFhHVCtpd1ZWNjlnL3RXaXBWUTZEOEJUeCtjQ1FwNDdubVRJclkrcU40a2gyRlloNUxsd1hkZ0l5eTFWSXVDM3gwNTNld0FJSVVtbFk5bmlFcHFZdCsxZkZQWE9DdENHdFliU2QzN3ZWUjFFT2oyazVHdS8rOUpXZzJxdndsMXR3ZWxnMUowdHhhcklpNGtUYlRydnJuRkxOOTJwb2ZwWlFVZm9XbzRjZTdIV05kYnU0SktFcmFMUVVmZGZHRVBkMVRJdWZ1dVJWYTM5ZXE5R1p5U0R1Qkw2ME1QZGxkeEt3MXpvK2ZCNVpZK1lNajNMTDJnR3REYnM5OCtBc1JWOUxKV21VbXN4OTFobUp0RlVNV0QzeG5qOEhNWldzME5QbENGVXI5NDg1S3FUcG81a1J6R2ZGK2svTmwySnpydjVjdmtxdFVuTGdLcFhFT2ovc2Uvb0R6T0FyUUtJNVROVWJ2WXdjd2NkampNU2ZqSzY4S3J3aHMrbjZTbVdaNFpkZ1JIZ0FLNU1vRmkzWG1MVjQ3UDN2U1JXdTV6eUVzTWs0eTN1dUNGaXVSUFJsdTRRNXBKdnVPZW03SDdVTGlJaENlbXY1RGdrR3RETDFjR0w0RVFoWVJCNklTelZ2c2IyRWFQOXdRRTZEVlJuTTdPK3BuU3pldDZsenAzcEZkR25ib3gxTFJmQzYwdXRYWitDakltNGlFTW10YkIyTjV6RFNoR2JlTTNYVWJKUWRDQmlzOFhJcmhoMmJpQjVoQkNWd24zWTNldHQ3R0RQVnRvaTFHUmp6K0piZ00rWVI5MjhLYmRXUzV0RmFNTTNLajNYdjZvdEl4ek1CbkRDOXVXM2QrSVh4NnZMUEowSlJ1aDN5UDdwVGxhNmMzaVI0cDluV1lEcUorWlNtcHJIRm5ET3pzTFdtRmphcGplL01xd01KZDZUazNuQVd3aWNNT1B1WXBNeXFJRjA0Zmw0bXFndHNITFNNV1JSTkhQWmpFVFE5Z1JtZURZZTZhUnRsVzAycUwyb2xERU5xTFFNdEFkb2lyTldSY1A5VkwzVGQ4SGFVTzZmU2xHTmFiTWFrSkQvMDBYQ2hPU1VPSVArN2ZNN1YwL2wxYkxXUHRFejFpN0x5Z1RWN3BkR29EbnRxU0NFbkpyQnloQkF6TFJnNVFJYzk0MzhJaEtteWZuMC8zYXdvRDFJcjc4MGV5cC9YY0k2eE5jdzZUdi9FVGZIZzBlN2lZQzBVWWNKSUU1UVVYdjBzK1lvR0lFcTVHSXpLdWI4SE5qU1RVcHN2bmtWeCtkYmUyalJuM1liOVc3SkNaNVlTNkY1TXlVVnNwak1EN05ZYytEV2pVTDJiMnNWeUFmZVlwQzhVaGFoOXR1bWF2YkJ2N2EzYTlrZ0ZicTU4bHJIeHpZN2lKUVZpZ3pxM2UxYTJCU2IwUGNXMWFKOEJEN05rTnBoS1lheVR4eWtnd2lsRVJMOGpxcUJFbmlIVmRCeERKWUxiK1h3M2FsTG1sdHVURVY2S0d0Qm50QlgreXozNlJQRE15R0lLZSszZnpjeGZuQ0RuMjBNb2RWVmtWTm96UHFNWFowRzVMNGFMVEFRYWtZS1Vqc1ZNUWpBaFFrVGxIQmVPL2FMUHg5c3hsKytqMVo1ckxnRzEyVE40WEoxZWljdnc0QVZFNThMb3JhcTBRaUUwY1M3UEgxcGJyWldyZnQ3TFlHaXlCU2hvcjcrMGppb1VoMXBkV3EycU1ZTHFlTUVldUNST1F0NTdtRnJPanlQSDQ5cXA5N2NXT3JnZWcyV3lmV1NER1FQamU1K1AweVFvQ3BEL0QzUkFNdVdtYjl3bEJ0Y3EyajhXSlB0OTFFM2tLYXd1UUl5dmQycjJVang0K0hUTnRWS2I5a01MT084NUk2NWJOR0JIKzRpclN5NWdRWWxFMjZBMmNTR0ljTEtRUmx2Sm9NbmE3TC85d3lyeTRIek9yemtyQXZMZGdzU05sWWpwSFFFUmlPSTgwc0o1ak5DQ25mdzAxM0YrQStzQWZMbXlTL0JETE5RMXFhUTNwNmg4L0pxQWZoWDVPR0hnU2lSVk9DRWp1YURCL013Wk5DdTNRTDllaGhvQWo3dU9mOFBrcjNtSWpiaGg5SGlqc2p4MTkxKzBlMkpRckZhMDFBVkpLRVZ0dVB0SWMyaC8xcFBLTXZ5ZW54alRPMk94UG5qanQrODRuSUtLaHhESi9naFB0N2l2OFBtVEowbEtLeVBSc3NsOGYvUWRIZHh1cGI2alRzSTZVS216OVk0NlBNQnVENlAzd2g4cXAzNk82b2liTkRpUWQxc0UxMHZKaDl6MUZ5c0tJZThFcU1wbk5kRW1HMlRmRUJ4UnBtUXJoS0VxZWUwcDYrYTZzUW84Y1ZsUkprS1FBWUthd2NhTkVTNVhjNmRRWTVucWVpcThzVWl6ZjFzcGZIZUhlbER1MU02QlJYdUNqRmFmWGh6OGkzbFBXZ1lxVnBmeDEzaWdWQ1JmNDdVSDY1MnlMbnNtZXBDQldneUJUV0FjT3lGMVF4OFlHdFpub2IxVE4rNnhFd3pwY1dWeTdRTzlQOTJzS0E5U0srL05Ic3FmMTNDT3QwSkhDdFRWMU9sVFFXK0pBS3l4ZTFIbDcrczk1ejNLQ2dGS1FTKzNBczFKVjdOYStnK0xDUjJJZXZ1OGQ1RDBMN0d3b0RyZVV2NDM3NExSYUZrTnNIT3FXYlU5bmhRamRNVnI3YS9pOE8vNGhicHRhU3pxcWtnWUZpTkZVL29tVzVxd0l6N3NwNG5zY0lUUkUzZ3VhNmJ6a2xNWjhFQ24xaXFBV3QwYTZnZWtpNURhTDhxWWFwVENDaGpsV3NFeHFGdXhpV1AzNVRVQ2RkRWQ4QUNiTUdzK2dRRnlET296ZkJERzE3ZFpPMG1Dd1crUHpDTDJqYklDRE5haTUvam0xUXI2TUw1Nmp6VWFJRHowR0xQVFNhZXgxVUREd2tROW83bVhXQzBSN2pXbnpia0hSV2NvbVZiV21HcUwxcmpkb2Fjcy9SOXVqcVV1QkE2QTVWTC9xa1ExeEhMNDJFWG9vcHJDOHdycmZSNjh6TU1GeE93VTdDWUhKN2JoRy9RNHJOc1hEQmNNbzFBZGlxOUxYYlhtL1FKajB1L2pnWkdzc3owbm5LS1VGSmN4enVBTks5NnpXd2YxRFhhc1VjT29FdUVhdG0xcm1QNXdyQkptVy9ad1Q2YUJCaVIyT1NKMHhyOHRRNk9ibWRLanliKzFlRVhiMTQzN1IySWRoRFVkazVQUnp0SDJZRnQycG11TDQvTG1JTEZBdlBkaXlNdERITmorS2g0c1Y0TWxYYldQcnJJOTdZQk9GcEZsWCtnbmV3S0tmRlprSEU3ZGl0eTM0ZFVRMkduZTZzQUd4MXp4eWpadjVLQk0yNmxSSEY0NVhxRk5KMVJRM2hNeW1KSHN5WU5zTU80MUJXckd2MTlQQTQ2OGVjdzlIY1JOMHdoalVUZ25zOFpWYUM0aGlKc2dZMDdhQUVCSG05MC91aGhqTy9XbWI3d3VWYWRobDlSbkhlUWpweDRnd0NyTHo1aTVzNUl0MXNCd2ZEYjBGZStQQ3BMa2Mrd0lJTksyWTg2a1B0aFI2Z0p3Vzc1enVvTjVDMENBaUR3ZlU3M3ZhQVphaHpmNFZMTmxNMFUwNE90SFlCaTEzWWdQb05tR0hSZWxaVkV5Mkt1S1ZaZ2hEMTR2U2xZK0pyTUJEZG0yeTJ0aEZWK0JyaWhMNytmUTV3Y1lueEdlbGF3RHVvU1I1K2JERGtyNlJMNDBMNHh5ZkFoeGxyT24wdUEyOGdoR2VXZ3VhV0tFdjVuQnJydmV1MXVlVnkxTXZHVVlCWStJbEVyOE5kRE5SZG1Felh0MzlrR2xkODZ4T2ZBSC94TDFWbXVnYVhPR2FQQjJxYzdXRFJrVzZrNUY2bjNQa0l6ZFBYeU9OS3AxRGtPZzNvY1NNWk1UczZHS2o5QzN2T0RaNlpRcHdORFlMTVQrQ21FTDE4R1JqWE5jWmxQL0xuaGlBSXNjWVRMMStpSFdEWXZSbXZQTXd0T0hoQ25FWElVM0ZUYlArNlFSR0E2cXlkYm5uZXFWaFhvd2NMbWJNSXoxNklDMWt3aFpqNzUvTTUzc0tZWDJ6UmdPU1RBZk5TRC81bFpZU05VeEpmS1REZ2lhRkVnZ3JDcmQrM0NjK2NoenNsSTN6RFhFS1RydmxjWDJJbkM5dUgrZnN5cHlIdytBdlkyT21CR1FNSUljOGZFM3ROTzBnQlRWcVhzZHNFNzZZd0hyMjlkelFja3VzdXlKc0JmU1ZjbHJ2c05DWjFQUURMOEgzY1JzM0hFOW5Va3g1YmJKWVdzUHhiODI1Z25FcFdVOVo5S3R6dnNsaTcvaGVPbERLcEh4SmIxdUNyV3FmOGdSbldtcTN6ZlNTclVYQkhTTHU2Mk1ya1hUaldnYXBVVnhNR2tybnpSMEU0UE15MWJGY3lEcEVRZTE1VGF5V0JNMUI2anJJRyswRFJSOU9hQ1VQd0Q3ZXhObWpaYjlNODF1cytBSVJmeXpKUFpHbWZIdVQ5U056RmZOdVFkRlp5aVpWdGFZYW92V3VOMmlySTN6UWF0S0NEblFJWHByMFZoRzBHb3A4Yy96cm9XQm9OL2FWS21uOHNrU0Z2QURPam9aQWl4ZzZLMXk5d0ZpOHBlQ21pbUZaM1p6Q1ZzRzZFVTlTdmxicTUrd243RDZ5K2RBWWRhUG1zNGd3Q3JMejVpNXM1SXQxc0J3ZkRiejRYNFZ4cUlwY1RDOU5hWUtxQTdHS0srYVRyWldVd3dOMjFRT3RyOGVxeFNnSjFVOWVDT2NXWFFkK3AzNkd5NGZZK3Q5YzJDc1ZOYk5sMWdoeGE5Ykk4VTZlNkZUZC92dkJhcTlqcktkaXRxNG1OQ2Fpb2dtZlBLNk00OFVZSThqWk1DZGQvOUM4QnF2VWo0YllVNWJ5V0FTRUc2QkJHZEs4S2xmaS9hNExXdDNpdkM0dTlRQlRmYi92Q21OSmkvUUFmYWJjUEcrVXNXbXNZTlJLK2c4aE1jc3VCbWhoNDhOcGhSdmViVlFxcTZuY0t4YzFuRkhXTVc1TTZvZit6OGMxSGRkbmllRFA5R2FCc3EreXNsaktzbFlydDk4OVBZOXhzYm1rcjNYL29DZmlGVTROZmNPaGVlKytuZ1cwWHBaQVZ0MUkyUW5jMWFsd2Jub05xTU1oWElCOTVpa0x4U0ZxSDIyNlpxOXNHL3RyZHIyU0FWdXJueVdzZkhOanVJbEJXS0RPcmQ3VnJZRkp2UTl4YlZvbUtxUWp1aDlkemYybnZWckJ6YkVGMENaWTZpemtZL1JRWTVyOWs5My95Mk5HN28wN25NWWpPdFpZWWVOVW9pazdHYksvSHpRbDFTN3MvRkNobnQ5TTZmRTBVeXVQbXR0Tzk4aHF6eFFidGVNYWxNdFNjZTJXTGNqeVhWR2ZwcWRCa1l5bTRnWkJ5Y2NTNmFudHQ0b0xkbHVXU1NKc0hYMUljWGhReTZvSitBaGp3OWhGWXdYTEhQTG9DbzNqRWxpVUFLNDE3OXd0WXRIc08wYWJMeDQraG10TTVGejd3VVZhaEJBOXN1cE9UZi9GRDRzaVpNTW9mNVczdm01RGVkaHFHQU5saHQzbUk2Um1JaHY0OFFWdG5lTXNVellDNE5EaFpENE01UjZwN0dYQnFjcHUzRmFFRi8wSTBlM0xjZVgxSE4raURxS1JQdUd6dnBhYy8xdHNHUEl0ZUFEeHU5T1lvYXAyejNGMUN6U2cvVXVhOGwvS0V6dEFLRGN2YmhOVS9ZVWMybGhneGdmZGI0ZStQOVRaN1JhWDgyczYyN3UwQ2JGc2ZHRS8xaExwYjVNYzJ2azF1REdyZEljYldBNnhocFlBSFloRVlVbDljNzVZL1IvMGdsNnI5K202Y0kwQnZCWTVBYTVOQlJjNlVNdnNPL1BPdzVDY3I3OXNKemljZWFWM1l3cllFa2pwNktpK09Zckd1OTU0QUErZEo5V3N2TkdCRkdNcktBZlE5VlVDL0FUa0pmVGxvTWx0RGVWNUFvOXprYWF5M2RLQWE1L1B4QUdSREFVY1FMREY3dVZYYkQxdkZnRS8rUlhpd3pTNU43Y3IzYUZCZFJZN1hBbUZ6L2ZiMC9LU3BSOENRL2xva3BtTTJtbHRKOXZHUGdpcWI1blpsOUt1N2QyR2xnQWRpRVJoU1gxenZsajlIL1NCdWpCUG9PMWZwb091NUYzNWNkSGE1a1NGdkFET2pvWkFpeGc2SzF5OXdGbGowRXo1a3NVVzNXVTYzRTdlNHF0RFVDS1d3ampVNWYwRmQ1N1Z5VnpwQzZDZENTY0JqWVN6VDlyWkxWc2txNjFhT1dyRERVTktxQVEzK25YL0JCVzNjUVRFY09WZGMxNW5nVlhjU1MvYUsyUUZNZGlLUWxxbTE1ZkVySmR3cXllemE3aGZsS1RpQ3pVZHU1VkdsRlc5cUN0OHN5SG9vc0EyTnpmb3NKZFRkTjhiV0hub0RyNU4yNWV0K3AvbnZqak96WlJhTFlvWS9mci9rNWhxcHRPaz1cXFwiKTtcXG4gICAgcmV0dXJuICQuZXhwb3J0cztcXG59KSgpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi57yW6L6R5YWs5ZGKXCIsXCJwYXRoXCI6XCJkZXZJbmZvRWRpdFwiLFwicnVsZVwiOlwianM6XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpPT57XFxuICAgIHB1dE15VmFyKFxcXCJkZXZJbmZvXFxcIiwnJyk7IC8v5riF6Zmk5Y6G5Y+y5YWs5ZGKXFxufSkpO1xcbnNldFBhZ2VUaXRsZSgn57yW6L6R5YWs5ZGKJyk7XFxuLy8gbGV0IHtub3dKeCxNeUppZXhpLGp4c1JvdXRlfSA9IE1ZX1BBUkFNUztcXG5jb25zdCB7Y29sb3Isc21hbGwsYXBpLCBnZXRGaWxlLGdldEFwaX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG4vLyBsZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxudmFyIGRldl9pbmZvX3VybCA9IGdldEFwaSgnaW5mb0dldFVybCcpO1xcbi8vIGxvZyhkZXZfaW5mb191cmwpO1xcbnZhciBnZXRfaW5mbyA9IGZ1bmN0aW9uKHFxKXtcXG4gICAgcXEgPSBxcXx8JzQzNDg1NzAwNSc7XFxuICAgIGxldCBkZXZfaW5mb191cmwgPSBkZXZfaW5mb191cmwrcXE7XFxuICAgIGxldCBiYWNrX2NvZGUgPSBKU09OLnBhcnNlKHJlcXVlc3QoZGV2X2luZm9fdXJsKSk7XFxuICAgIGxldCBkZXZfaW5mbz1iYWNrX2NvZGUucmVzdWx0fHxiYWNrX2NvZGUuZGV0YWlsO1xcbiAgICByZXR1cm4gZGV2X2luZm87XFxufTtcXG52YXIgYmVmb3JlX3JlZnJlc2ggPSBmdW5jdGlvbigpe1xcbiAgICBsZXQgZGV2X3NldF9pbmZvID0gZ2V0TXlWYXIoXFxcImRldl9zZXRfaW5mb1xcXCIpLnNwbGl0KCckJCcpO1xcbiAgICBsZXQgZGV2X2luZm9fdXJsID0gZGV2X3NldF9pbmZvLnNsaWNlKC0xKVswXTtcXG4gICAgbGV0IGJhY2tfY29kZSA9IEpTT04ucGFyc2UocmVxdWVzdChkZXZfaW5mb191cmwpKTtcXG4gICAgbGV0IGRldl9pbmZvPWJhY2tfY29kZS5yZXN1bHR8fGJhY2tfY29kZS5kZXRhaWw7XFxuICAgIHB1dE15VmFyKFxcXCJkZXZJbmZvXFxcIixkZXZfaW5mbyk7XFxuICAgIHJldHVybiBkZXZfaW5mb1xcbn07XFxubGV0IGQgPSBbXTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTon57yW6L6R5YWs5ZGKJyxcXG4gICAgZGVzYzon5pSv5oyBbWTor63ms5Us54K55Ye76L+b5YWl5a2m5LmgTWTor63ms5VcXFxcbuS/neWtmOWFrOWRiuaMiemSruWcqOaWh+acrOahhuacgOS4i+mdoicsXFxuICAgIGNvbF90eXBlOid0ZXh0XzEnLFxcbiAgICB1cmw6J2h0dHBzOi8vd3d3LnJ1bm9vYi5jb20vbWFya2Rvd24vbWQtdHV0b3JpYWwuaHRtbCdcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTon6L+U5ZueJyxcXG4gICAgY29sX3R5cGU6J3RleHRfMicsXFxuICAgIHVybDokKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCgpPT57XFxuICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgfSlcXG59KTtcXG5pZighZ2V0TXlWYXIoJ2RldkluZm8nKSl7XFxuICAgIGJlZm9yZV9yZWZyZXNoKCk7XFxufVxcbmxldCBlbXB0eSA9ICdoaWtlcjovL2VtcHR5JztcXG5kLnB1c2goe1xcbiAgICB0aXRsZTon6ZiF6KeI5p+l6ZiFJyxcXG4gICAgY29sX3R5cGU6J3RleHRfMicsXFxuICAgIC8vIHVybDokKGdldE15VmFyKCdkZXZJbmZvJykpLmNvbmZpcm0oKVxcbiAgICB1cmw6JChlbXB0eSkucnVsZSgoKT0+e1xcbiAgICAgICAgcmVxdWlyZShcXFwiaHR0cHM6Ly9naXRsYWIuY29tL2hqZGhueC9oaWtlci8tL3Jhdy9tYWluL2pzL21hcmtlZC5taW4uanNcXFwiKTtcXG4gICAgICAgbGV0IGRldkluZm89XFxcIlxcXCI7XFxuICAgICAgIHRyeXtcXG4gICAgICAgICAgZGV2SW5mbz1tYXJrZWQucGFyc2UoZ2V0TXlWYXIoJ2RldkluZm8nKSk7XFxuICAgICAgIH1jYXRjaChlKXt9XFxuICAgICAgICBzZXRSZXN1bHQoW1xcbiAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6ZGV2SW5mbyxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6J3JpY2hfdGV4dCcsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgXSk7XFxuICAgIH0pXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgZGVzYzogXFxcIuW/q+adpee8lui+keS9oOeahOWFrOWRiuWQp35cXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKCdkZXZJbmZvJywgJycpfHxcXFwiXFxcIixcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6LTEsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dE15VmFyKFxcXCJkZXZJbmZvXFxcIixpbnB1dCknXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi5L+d5a2Y5YWs5ZGKXFxcIixcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXG4gICAgdXJsOiQoJ+ehruiupOS/neWtmOWFrOWRiuWQl++8n+WwhuS8muS4jumBk+mVv+S7k+W6k+acjeWKoeWZqOmAmuiurycpLmNvbmZpcm0oKCk9PntcXG4gICAgICAgIGxldCBkZXZfc2V0X2luZm8gPSBnZXRNeVZhcihcXFwiZGV2X3NldF9pbmZvXFxcIikuc3BsaXQoJyQkJyk7XFxuICAgICAgICBsZXQgaW5wdXRfdGV4dCA9IGdldE15VmFyKCdkZXZJbmZvJywgJycpO1xcbiAgICAgICAgaWYoaW5wdXRfdGV4dC5sZW5ndGggPj0gNCl7XFxuICAgICAgICAgICAgbGV0IGluZm9fc2V0X3VybD0gZGV2X3NldF9pbmZvWzJdO1xcbiAgICAgICAgICAgIGxldCBzZW5kX2RhdGEgPSB7XFxcInBhcmFtc1xcXCI6XFxuICAgICAgICAgICAgICAgICAgICB7XFxcImRhdGFcXFwiOiB7XFxcImluZm9cXFwiOiBpbnB1dF90ZXh0fSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwibmFtZVxcXCI6IGRldl9zZXRfaW5mb1swXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBkZXZfc2V0X2luZm9bMV19XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAvLyBsb2coc2VuZF9kYXRhKTtcXG4gICAgICAgICAgICBsZXQgcGFyMiA9IHtoZWFkZXJzOnsnY29udGVudC10eXBlJzonYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywnVXNlci1BZ2VudCc6ZGV2X3NldF9pbmZvWzNdfSxib2R5OkpTT04uc3RyaW5naWZ5KHNlbmRfZGF0YSksbWV0aG9kOidQT1NUJ307XFxuICAgICAgICAgICAgLy8gcGFyMiA9IEpTT04uc3RyaW5naWZ5KHBhcjIpOyAvL3g16YeM6Z2i6K+35rGC5omN6ZyA6KaB57yW56CBXFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgbGV0IGJhY2tfcmV0ID0gcmVxdWVzdChpbmZvX3NldF91cmwsIHBhcjIpO1xcbiAgICAgICAgICAgICAgICBiYWNrX3JldCA9IEpTT04ucGFyc2UoYmFja19yZXQpLnJlc3VsdDtcXG4gICAgICAgICAgICAgICAgaWYoYmFja19yZXQuc3RhdHVzPT09MCl7XFxuICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+S/neWtmOaIkOWKn1xcXFxuJytiYWNrX3JldC5kZXRhaWw7XFxuICAgICAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+S/neWtmOWksei0pVxcXFxuJytiYWNrX3JldC5kZXRhaWw7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr1xcXFxuJytlLm1lc3NhZ2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgY29uZmlybSh7dGl0bGU6J+mBk+mVv+aPkOekuicsY29udGVudDon6Jm954S25L2g5b6I5oeS77yM5L2G5piv5YWs5ZGK6Iez5bCR5YaZNOS4quWtl+WQp++8gSd9KTtcXG4gICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgICAgICB9XFxuICAgIH0pXFxufSk7XFxuXFxuc2V0UmVzdWx0KGQpO1wifV0iLCJpY29uIjoiaHR0cHM6Ly9sYW5tZWlndW9qaWFuZy5jb20vdHViaWFvL290aGVyLzMwLnN2ZyIsInByb3h5IjoiIn0=
Add Comment
Please, Sign In to add comment