xiaomianao666

小程序:DrpyHiker

Jun 28th, 2024
403
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@DrpyHiker@eyJmaXJzdEhlYWRlciI6ImNsYXNzIiwibGFzdF9jaGFwdGVyX3J1bGUiOiIiLCJ0aXRsZSI6IkRycHlIaWtlciIsImF1dGhvciI6IkBMb3lEZ0lrJnpldGFscGhhIiwidXJsIjoiaGlrZXI6Ly9lbXB0eSMjZnlwYWdlIiwidmVyc2lvbiI6MTUsImNvbF90eXBlIjoibW92aWVfMyIsImNsYXNzX25hbWUiOiIiLCJ0eXBlIjoidmlkZW8iLCJjbGFzc191cmwiOiIiLCJhcmVhX25hbWUiOiIiLCJhcmVhX3VybCI6IiIsInNvcnRfbmFtZSI6IiIsInllYXJfbmFtZSI6IiIsInNvcnRfdXJsIjoiIiwieWVhcl91cmwiOiIiLCJmaW5kX3J1bGUiOiJqczpcbmZ1bmN0aW9uIGxvYWQoZCwgZHJweSwgc291cmNlLCBoYXNIYWVkKSB7XG4gICAgbGV0IHBhZ2UgPSBNWV9QQUdFO1xuICAgIGxldCBjYXRlZ29yeXMgPSAkLnJlcXVpcmUoXCJjYXRlZ29yeXNcIik7XG4gICAgY2F0ZWdvcnlzLmdldGNhdGVnb3J5cyhkLCBkcnB5LCBwYWdlLCBoYXNIYWVkKTtcbiAgICBsZXQge1xuICAgICAgICBjYXRlLFxuICAgICAgICBob21lbGlzdFxuICAgIH0gPSBjYXRlZ29yeXMuZ2V0Y2F0ZWxpc3QoKTtcbiAgICBpZiAoZ2V0TXlWYXIoXCJsaW5rc1wiLCBcIlwiKSA9PSBcIjFcIiAmJiAhaGFzSGFlZCkge1xuICAgICAgICBzZXRQcmVSZXN1bHQoZCk7XG4gICAgICAgIGQubGVuZ3RoID0gMDtcbiAgICB9XG4gICAgbGV0IGZsID0gY2F0ZWdvcnlzLmdldGZsKCk7XG4gICAgbGV0IGhvbWVMaXN0Q29sID0gZ2V0SXRlbShcImhvbWVMaXN0Q29sXCIsIFwibW92aWVfM19tYXJxdWVlXCIpO1xuXG4gICAgbGV0IGxpc3QgPSBbXTtcbiAgICBpZiAoY2F0ZSA9PSBcImhvbWVcIikge1xuICAgICAgICBpZiAocGFnZSA9PSAxKSB7XG4gICAgICAgICAgICBsaXN0ID0gaG9tZWxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGlzdCA9IFtdO1xuICAgICAgICAgICAgY2xlYXJNeVZhcihcImlzaG9tZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPiAwICYmICFsaXN0LmF0KDApLnZvZF9waWMgJiYgIWxpc3QuYXQoLTEpLnZvZF9waWMpIHtcbiAgICAgICAgICAgIGhvbWVMaXN0Q29sID0gXCJ0ZXh0XzFcIjtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxpc3QgPSBKU09OLnBhcnNlKGRycHkuY2F0ZWdvcnkoU3RyaW5nKGNhdGUpLCBwYWdlLCB0cnVlLCBmbCkpLmxpc3Q7XG4gICAgfVxuXG4gICAgaWYgKGxpc3QubGVuZ3RoKSB7XG4gICAgICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcbiAgICAgICAgICAgIGxldCBpZCA9IFN0cmluZyhpdC52b2RfaWQpO1xuICAgICAgICAgICAgLy9sb2coaXQpXG4gICAgICAgICAgICBsZXQgbmFtZSA9IGl0LnZvZF9uYW1lO1xuICAgICAgICAgICAgdXJsID0gXCJoaWtlcjovL3BhZ2UvZGV0YWlsZWQjaW1tZXJzaXZlVGhlbWUjXCI7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkID09PSBcInN0cmluZ1wiICYmIGlkLmluY2x1ZGVzKFwibXNlYXJjaDpcIikgfHwgaWQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gJChcIlwiKS5sYXp5UnVsZSgobmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcInRlbXNtb2RlXCIsIFwiMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiaGlrZXI6Ly9zZWFyY2g/cnVsZT1cIiArIE1ZX1JVTEUudGl0bGUgKyBcIiZzPVwiICsgbmFtZTtcbiAgICAgICAgICAgICAgICB9LCBuYW1lKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZC5wdXNoKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogbmFtZSxcbiAgICAgICAgICAgICAgICBkZXNjOiBpdC52b2RfcmVtYXJrcyxcbiAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBpdC52b2RfcGljLFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBob21lTGlzdENvbCxcbiAgICAgICAgICAgICAgICBleHRyYToge1xuICAgICAgICAgICAgICAgICAgICBpbWc6IGl0LnZvZF9waWMsXG4gICAgICAgICAgICAgICAgICAgIHZvZElkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgc25hbWU6IHNvdXJjZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBza2V5OiBzb3VyY2Uua2V5LFxuICAgICAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCLogZrlkIjmkJzntKJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzOiBcInB1dE15VmFyKCd0ZW1zbW9kZScsICcxJyk7J2hpa2VyOi8vc2VhcmNoP3J1bGU9JyArIE1ZX1JVTEUudGl0bGUgKyAnJnM9XCIgKyBuYW1lICsgXCInO1wiXG4gICAgICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlSXRlbShNWV9SVUxFLnRpdGxlICsgXCJsb2FkXCIpO1xufVxuXG5mdW5jdGlvbiBzZXREcnB5UGF0aChkKSB7XG4gICAgZC5wdXNoKHtcbiAgICAgICAgdGl0bGU6IFwi57y65bCR6L+Q6KGM5bqTXFxu6K+l5bCP56iL5bqP5LiN6IO96YCa6L+H5LqR5Ymq6LS05p2/5YiG5Lqr77yM5Y+q6IO96YCa6L+H5omT5YyF5YiG5LqrXCIsXG4gICAgICAgIGRlc2M6IFwi5bCG6L+Q6KGM5bqT5pS+5YWlXCIgKyBnZXRQYXRoKFwiaGlrZXI6Ly9maWxlcy9kYXRhL1wiICsgTVlfUlVMRS50aXRsZSArIFwiL2xpYnNfaGlrZXIvZHJweTIuanNcIiksXG4gICAgICAgIGNvbF90eXBlOiBcInRleHRfY2VudGVyXzFcIixcbiAgICAgICAgdXJsOiBcImhpa2VyOi8vZW1wdHlcIlxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBzZXRIaWVkKGQsIG5hbWUsIGNvbmZpZykge1xuICAgIGxldCBmaWxlU2VsZWN0ID0gJC5yZXF1aXJlKFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVwiKTtcbiAgICBkLnB1c2goe1xuICAgICAgICB0aXRsZTogbmFtZSB8fCBcIlwiLFxuICAgICAgICBjb2xfdHlwZTogJ2ljb25fcm91bmRfc21hbGxfNCcsXG4gICAgICAgIGltZzogJ2h0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vc3lzdGVtLzEzMC5wbmcnLFxuICAgICAgICB1cmw6ICQoXCIjbm9Mb2FkaW5nI1wiKS5sYXp5UnVsZSgoKSA9PiB7XG4gICAgICAgICAgICAkLnJlcXVpcmUoXCJDaGFuZ2VTb3VyY2VQb3BcIikuc2hvdygpO1xuICAgICAgICAgICAgcmV0dXJuIFwiaGlrZXI6Ly9lbXB0eVwiO1xuICAgICAgICB9KSxcbiAgICAgICAgZXh0cmE6IHtcbiAgICAgICAgICAgIGNwYXRoOiBjb25maWcucGF0aCxcbiAgICAgICAgICAgIGxvbmdDbGljazogW3tcbiAgICAgICAgICAgICAgICB0aXRsZTogXCLmm7TmjaLphY3nva5cIixcbiAgICAgICAgICAgICAgICBqczogSlNPTi5zdHJpbmdpZnkoXCJoaWtlcjovL3BhZ2UvY3JlYXRlQ29uZmlnI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1wiKVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHRpdGxlOiBcIuWIt+aWsOa6kFwiLFxuICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXCJydW50aW1lQ29uZmlnXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFwiRHJweU1hbmFnZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgRHJweU1hbmFnZS5nZXQoc291cmNlLmtleSkuaW5pdChydW50aW1lQ29uZmlnLmdldEFic29sdXRlUGF0aChzb3VyY2UuZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB0aXRsZTogXCLlrozlhajliLfmlrDmupBcIixcbiAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFwicnVudGltZUNvbmZpZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZSgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcIkRycHlNYW5hZ2VcIik7XG4gICAgICAgICAgICAgICAgICAgIERycHlNYW5hZ2UuZGVsKHNvdXJjZS5rZXkpO1xuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XS5jb25jYXQoY29uZmlnLnR5cGUgPT09IFwibG9jYWxEaXJcIiA/IFt7XG4gICAgICAgICAgICAgICAgdGl0bGU6IFwi5pys5Zyw566h55CGXCIsXG4gICAgICAgICAgICAgICAganM6IFwiJ2hpa2VyOi8vcGFnZS9Mb2NhbERpciNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMnXCJcbiAgICAgICAgICAgIH1dIDogW10pXG4gICAgICAgIH1cbiAgICB9KTtcblxuXG5cbiAgICBsZXQgc21vZGUgPSBOdW1iZXIoZ2V0SXRlbShcInNtb2RlXCIsIFwiMFwiKSk7XG4gICAgZC5wdXNoKHtcbiAgICAgICAgdGl0bGU6IFtcIuS7hemAieS4rVwiLCBcIuiBmuWQiFwiXVtzbW9kZV0sXG4gICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgc21vZGUgPSBOdW1iZXIoZ2V0SXRlbShcInNtb2RlXCIsIFwiMFwiKSk7XG4gICAgICAgICAgICByZXR1cm4gJChbXCLku4XpgInkuK1cIiwgXCLogZrlkIhcIl0sIDEsIFwi5pCc57Si5qih5byPXCIsIHNtb2RlKS5zZWxlY3QoKHQpID0+IHtcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFwic21vZGVcIiwgXCJcIiArIE1ZX0lOREVYKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHQgKyBcIkBzZWFyY2hfbW9kZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBbXCLku4XpgInkuK1cIiwgXCLogZrlkIhcIl1bTVlfSU5ERVhdLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaGlrZXI6Ly9lbXB0eVwiO1xuICAgICAgICAgICAgICAgIC8vcmVmcmVzaFBhZ2UoKTtcbiAgICAgICAgICAgIH0sIE1ZX1JVTEUudGl0bGUpXG4gICAgICAgIH0pLFxuICAgICAgICBwaWNfdXJsOiBcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vbWVzc3kvMjUuc3ZnXCIsXG4gICAgICAgIGNvbF90eXBlOiBcImljb25fcm91bmRfc21hbGxfNFwiLFxuICAgICAgICBleHRyYToge1xuICAgICAgICAgICAgaWQ6IE1ZX1JVTEUudGl0bGUgKyBcIkBzZWFyY2hfbW9kZVwiLFxuICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xuICAgICAgICAgICAgICAgIHRpdGxlOiBcIuaMh+WumuaQnOe0oua6kFwiLFxuICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFwiU2VhcmNoQWxsb3dQb3BcIikuc2hvdygpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgZC5wdXNoKHtcbiAgICAgICAgdGl0bGU6IFwi6K6+572uXCIsXG4gICAgICAgIHVybDogJChbXCLop6PmnpDnrqHnkIZcIiwgXCLlrpjmlrnlvLnluZVcIiwgXCJkcnB56LCD6K+V5pel5b+XOlwiICsgKGdldEl0ZW0oXCJ1c2VMb2dcIiwgXCJcIikgPT0gXCJcIiA/IFwi5YWz6ZetXCIgOiBcIuW8gOWQr1wiKSwgXCLliJvlu7rorqLpmIXlnLDlnYBcIiwgXCLliIfmjaLliJfooajmoLflvI9cIiwgXCLmm7TmjaLphY3nva5cIiwgXCLop4bpopHmupDpu5jorqTkv53lrZjot6/lvoRcIl0sIDEsIFwi6K6+572uXCIpLnNlbGVjdCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoXCLop6PmnpDnrqHnkIZcIiA9PSBpbnB1dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImhpa2VyOi8vcGFnZS9ydWxlTWFuYWdlI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1wiO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcIuWumOaWueW8ueW5lVwiID09PSBpbnB1dCkge1xuICAgICAgICAgICAgICAgIGxldCB1c2VEYW5tdSA9ICEhZ2V0SXRlbShcInVzZURhbm11XCIsIFwiXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiAkKFwi5b2T5Li65a6Y5rqQ5pe25Yy56YWN5by55bmVKOmcgOimgWRhbm1155uS5a2Q5pSv5oyBKVxcbuW9k+WJjTpcIiArIHVzZURhbm11ICsgXCJcXG7ngrnlh7vnoa7lrprljbPlj69cIiArICh1c2VEYW5tdSA/IFwi5YWz6ZetXCIgOiBcIuW8gOWQr1wiKSkuY29uZmlybSgodXNlRGFubXUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcInVzZURhbm11XCIsIHVzZURhbm11ID8gXCJcIiA6IFwiMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwidG9hc3Q6Ly9cIiArICh1c2VEYW5tdSA/IFwi5bey5YWz6ZetXCIgOiBcIuW3suW8gOWQr1wiKTtcbiAgICAgICAgICAgICAgICB9LCB1c2VEYW5tdSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0LmluY2x1ZGVzKFwiZHJweeiwg+ivleaXpeW/l1wiKSkge1xuICAgICAgICAgICAgICAgIGxldCB1c2VMb2cgPSAhIWdldEl0ZW0oXCJ1c2VMb2dcIiwgXCJcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICQoXCLlvIDlkK/ml6Xlv5fovoXliqnosIPor5XvvIzmma7pgJrkvb/nlKjkuI3pnIDopoHlvIDlkK9cXG7lvZPliY06XCIgKyB1c2VMb2cgKyBcIlxcbueCueWHu+ehruWumuWNs+WPr1wiICsgKHVzZUxvZyA/IFwi5YWz6ZetXCIgOiBcIuW8gOWQr1wiKSkuY29uZmlybSgodXNlTG9nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXCJ1c2VMb2dcIiwgdXNlTG9nID8gXCJcIiA6IFwiMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXCJydW50aW1lQ29uZmlnXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFwiRHJweU1hbmFnZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIERycHlNYW5hZ2UuZGVsKHNvdXJjZS5rZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcInRvYXN0Oi8vXCIgKyAodXNlTG9nID8gXCLlt7LlhbPpl61cIiA6IFwi5bey5byA5ZCvXCIpO1xuICAgICAgICAgICAgICAgIH0sIHVzZUxvZyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcIuWIm+W7uuiuoumYheWcsOWdgFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaGlrZXI6Ly9wYWdlL2NyZWF0ZVN1YnNjcmlwdGlvbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcIjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFwi5YiH5o2i5YiX6KGo5qC35byPXCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29sbGlzdCA9IFtcIm1vdmllXzNfbWFycXVlZVwiLCBcIm1vdmllXzNcIiwgXCJtb3ZpZV8yXCIsIFwibW92aWVfMVwiLCBcInRleHRfMVwiXTtcbiAgICAgICAgICAgICAgICBsZXQgaG9tZUxpc3RDb2wgPSBnZXRJdGVtKFwiaG9tZUxpc3RDb2xcIiwgXCJtb3ZpZV8zX21hcnF1ZWVcIik7XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gY29sbGlzdC5pbmRleE9mKGhvbWVMaXN0Q29sKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJChjb2xsaXN0LCAxLCBcIumAieaLqeagt+W8j1wiLCBpbmRleCkuc2VsZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcImhvbWVMaXN0Q29sXCIsIGlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFwi5pu05o2i6YWN572uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJoaWtlcjovL3BhZ2UvY3JlYXRlQ29uZmlnI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1wiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJoaWtlcjovL3BhZ2Uvc2hhcmVkZWZhdWx0cGF0aCNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIHBpY191cmw6IFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9tZXNzeS8zMC5zdmdcIixcbiAgICAgICAgY29sX3R5cGU6IFwiaWNvbl9yb3VuZF9zbWFsbF80XCIsXG4gICAgfSk7XG4gICAgZC5wdXNoKHtcbiAgICAgICAgdGl0bGU6IFwi5oiR55qEXCIsXG4gICAgICAgIHVybDogJChbe1xuICAgICAgICAgICAgdGl0bGU6IFwi5Y6G5Y+yXCIsXG4gICAgICAgICAgICBpY29uOiAnaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9zeXN0ZW0vMTM2LnBuZydcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgdGl0bGU6IFwi5pS26JePXCIsXG4gICAgICAgICAgICBpY29uOiAnaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9zeXN0ZW0vMTM5LnBuZydcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgdGl0bGU6IFwi5Lmm5p62LeWwj+ivtFwiLFxuICAgICAgICAgICAgaWNvbjogJ2h0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vcS8xMy5wbmcnXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHRpdGxlOiBcIuS5puaeti3mvKvnlLtcIixcbiAgICAgICAgICAgIGljb246ICdodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL3EvMzQucG5nJ1xuICAgICAgICB9XSwgMiwgXCLmiJHnmoRcIikuc2VsZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChNWV9JTkRFWCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImhpa2VyOi8vaGlzdG9yeT9ydWxlPVwiICsgTVlfUlVMRS50aXRsZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoTVlfSU5ERVggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJoaWtlcjovL2NvbGxlY3Rpb24/cnVsZT1cIiArIE1ZX1JVTEUudGl0bGU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKE1ZX0lOREVYID09PSAyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL3BhZ2UvQm9va3JhY2sudmlldyNub1JlY29yZEhpc3RvcnkjP3J1bGU95pys5Zyw6LWE5rqQ566h55CGJnR5cGU9bm92ZWwmcnVsZU5hbWU9JyArIE1ZX1JVTEUudGl0bGU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKE1ZX0lOREVYID09PSAzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL3BhZ2UvQm9va3JhY2sudmlldyNub1JlY29yZEhpc3RvcnkjP3J1bGU95pys5Zyw6LWE5rqQ566h55CGJnR5cGU9Y29taWMmcnVsZU5hbWU9JyArIE1ZX1JVTEUudGl0bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBwaWNfdXJsOiBcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vc3lzdGVtLzEzOS5wbmdcIixcbiAgICAgICAgY29sX3R5cGU6IFwiaWNvbl9yb3VuZF9zbWFsbF80XCIsXG5cbiAgICB9KTtcbiAgICBkLnB1c2goe1xuICAgICAgICB0aXRsZTogJ+aQnOe0oicsXG4gICAgICAgIC8vZGVzYzogJycsXG4gICAgICAgIGRlc2M6ICfopoHmkJzngrnku4DkuYgnLFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL3NlYXJjaD9ydWxlPScgKyBNWV9SVUxFLnRpdGxlICsgXCImcz1cIiArIGlucHV0O1xuICAgICAgICB9KSxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXG4gICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFwia2V5d29yZFwiLCBcIlwiKSxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcbiAgICAgICAgICAgICAgICBwdXRNeVZhcihcImtleXdvcmRcIiwgaW5wdXQpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSk7XG59XG5sZXQgZCA9IFtdO1xuXG5sZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcInJ1bnRpbWVDb25maWdcIik7XG5sZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcIkRycHlNYW5hZ2VcIik7XG5EcnB5TWFuYWdlLmluaXRQYWdlKFwiaG9tZVwiKTtcbmFkZExpc3RlbmVyKFwib25DbG9zZVwiLCAoKSA9PiB7XG4gICAgY2xlYXJNeVZhcihcImxpbmtzXCIpO1xufSk7XG50cnkge1xuICAgIGlmIChhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAzMCAmJiAhYW5kcm9pZC5vcy5FbnZpcm9ubWVudC5pc0V4dGVybmFsU3RvcmFnZU1hbmFnZXIoKSkge1xuICAgICAgICBkLnB1c2goe1xuICAgICAgICAgICAgdGl0bGU6IFwi4oCY4oCY5o+Q56S64oCZ4oCZXCIsXG4gICAgICAgICAgICBkZXNjOiBcIuW9k+WJjeayoeacieaWh+S7tueuoeeQhuadg+mZkOaXoOazleato+W4uOS9v+eUqOivt+aJk+W8gOa1t+mYlOiuvue9rj0+5pu05aSa6K6+572uPT7lhoXpg6jmlofku7bnrqHnkIY9PuWPs+S4iuinklwiLFxuICAgICAgICAgICAgdXJsOiBcImhpa2VyOi8vZW1wdHlcIixcbiAgICAgICAgICAgIGNvbF90eXBlOiBcInRleHRfY2VudGVyXzFcIlxuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCFydW50aW1lQ29uZmlnLmlzUHJlcGFyZWQoKSkge1xuICAgICAgICBkLnB1c2goe1xuICAgICAgICAgICAgdGl0bGU6IFwi6L+Y5rKh5pyJ6YWN572u6KeG6aKR5rqQXCIsXG4gICAgICAgICAgICB1cmw6IFwiaGlrZXI6Ly9wYWdlL2NyZWF0ZUNvbmZpZyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcIixcbiAgICAgICAgICAgIGNvbF90eXBlOiBcInRleHRfY2VudGVyXzFcIixcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChmaWxlRXhpc3QoXCJoaWtlcjovL2ZpbGVzL2RhdGEvXCIgKyBNWV9SVUxFLnRpdGxlICsgXCIvbGlic19oaWtlci9kcnB5Mi5qc1wiKSkge1xuICAgICAgICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCk7XG4gICAgICAgIGlmIChNWV9QQUdFID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHNldEhpZWQoZClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0SGllZChkLCBzb3VyY2UubmFtZSwgcnVudGltZUNvbmZpZy5nZXRDdXJyZW50Q29uZmlnKCkgfHwge30pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vbG9nKERycHlNYW5hZ2UuZ2V0KHNvdXJjZS5rZXkpKVxuICAgICAgICBsZXQgaGFzSGFlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoZ2V0TXlWYXIoXCJsaW5rc1wiLCBcIlwiKSA9PSBcIlwiKSB7XG4gICAgICAgICAgICBkLnB1c2goe1xuICAgICAgICAgICAgICAgIHRpdGxlOiAn5Yqg6L295LitLi4uJyxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxuICAgICAgICAgICAgICAgIHVybDogXCJoaWtlcjovL2VtcHR5XCIsXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfUlVMRS50aXRsZSArIFwibG9hZFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZXRQcmVSZXN1bHQoZCk7XG4gICAgICAgICAgICBkLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICBoYXNIYWVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBsb2FkKGQsIERycHlNYW5hZ2UuZ2V0KHNvdXJjZS5rZXkpLCBzb3VyY2UsIGhhc0hhZWQpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2V0RHJweVBhdGgoZCk7XG4gICAgfVxuXG59IGNhdGNoIChlKSB7XG5cbiAgICBkLnB1c2goe1xuICAgICAgICB0aXRsZTogXCLigJzigJxcIiArIGUudG9TdHJpbmcoKSArIFwi4oCd4oCdXCIsXG4gICAgICAgIGRlc2M6IGUubGluZU51bWJlcixcbiAgICAgICAgdXJsOiBcImhpa2VyOi8vZW1wdHlcIixcbiAgICAgICAgY29sX3R5cGU6IFwidGV4dF9jZW50ZXJfMVwiXG4gICAgfSk7XG4gICAgZC5wdXNoKHtcbiAgICAgICAgdGl0bGU6IFwi5pu05o2i6YWN572uXCIsXG4gICAgICAgIHVybDogXCJoaWtlcjovL3BhZ2UvY3JlYXRlQ29uZmlnI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1wiLFxuICAgICAgICBjb2xfdHlwZTogXCJ0ZXh0X2NlbnRlcl8xXCIsXG4gICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGRlbGV0ZUl0ZW0oTVlfUlVMRS50aXRsZSArIFwibG9hZFwiKTtcbn1cblxuc2V0UmVzdWx0KGQpOyIsInNlYXJjaF91cmwiOiJoaWtlcjovL2VtcHR5P3M9KiomcGFnZT1meXBhZ2UiLCJncm91cCI6IiMjIzHlvIDlj5HkuK3lv4MiLCJzZWFyY2hGaW5kIjoianM6XG4oZnVuY3Rpb24oKSB7XG4gIGxldCBzbW9kZSA9IE51bWJlcihnZXRJdGVtKFwic21vZGVcIiwgXCIwXCIpKTtcbiAgbGV0IHRlbXNtb2RlID0gZ2V0TXlWYXIoXCJ0ZW1zbW9kZVwiLCBcIlwiKTtcbiAgaWYgKHRlbXNtb2RlKSB7XG4gICAgICBzbW9kZSA9IE51bWJlcih0ZW1zbW9kZSk7XG4gICAgICBjbGVhck15VmFyKFwidGVtc21vZGVcIik7XG4gIH1cbiAgaWYgKCFmaWxlRXhpc3QoXCJoaWtlcjovL2ZpbGVzL2RhdGEvXCIgKyBNWV9SVUxFLnRpdGxlICsgXCIvbGlic19oaWtlci9kcnB5Mi5qc1wiKSkgcmV0dXJuIHNldFJlc3VsdChbe1xuICAgIHRpdGxlOiBcIuivt+WJjeW+gOWwj+eoi+W6j+S4u+mhteiuvue9rmRycHlQYXRoXCIsXG4gICAgdXJsOiBcImhpa2VyOi8vaG9tZUBcIiArIE1ZX1JVTEUudGl0bGVcbiAgfV0pO1xuICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcInJ1bnRpbWVDb25maWdcIik7XG4gIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFwiRHJweU1hbmFnZVwiKTtcbiAgaWYgKCFydW50aW1lQ29uZmlnLmlzUHJlcGFyZWQoKSkgcmV0dXJuIHNldFJlc3VsdChbe1xuICAgIHRpdGxlOiBcIuivt+WJjeW+gOWwj+eoi+W6j+S4u+mhteiuvue9rua6kFwiLFxuICAgIHVybDogXCJoaWtlcjovL2hvbWVAXCIgKyBNWV9SVUxFLnRpdGxlXG4gIH1dKTtcblxuICBpZiAoc21vZGUgPT09IDApIHtcbiAgICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCk7XG4gICAgaWYgKCFzb3VyY2Uuc2VhcmNoYWJsZSkgcmV0dXJuIHNldFJlc3VsdChbe1xuICAgICAgdGl0bGU6IFwi5b2T5YmN5rqQ5LiN5pSv5oyB5pCc57SiXCIsXG4gICAgICB1cmw6IFwiaGlrZXI6Ly9lbXB0eVwiXG4gICAgfV0pO1xuICAgIGxldCBkcnB5ID0gRHJweU1hbmFnZS5nZXQoc291cmNlLmtleSk7XG4gICAgbGV0IGhvbWVMaXN0ID0gW11cbiAgICB0cnkge1xuICAgICAgaG9tZUxpc3QgPSBKU09OLnBhcnNlKGRycHkuc2VhcmNoKE1ZX0tFWVdPUkQsIGZhbHNlLCBNWV9QQUdFKSkubGlzdCB8fCBbXTtcbiAgICB9IGNhdGNoIHt9XG4gICAgbGV0IGQgPSBbXTtcbiAgICBmb3IgKGxldCBpdCBvZiBob21lTGlzdCkge1xuICAgICAgZC5wdXNoKHtcbiAgICAgICAgdGl0bGU6IGl0LnZvZF9uYW1lLFxuICAgICAgICBkZXNjOiBpdC52b2RfcmVtYXJrcytcIsK3XCIrc291cmNlLm5hbWUsXG4gICAgICAgIGNvbnRlbnQ6IGl0LnZvZF9jb250ZW50LFxuICAgICAgICB1cmw6IFwiaGlrZXI6Ly9wYWdlL2RldGFpbGVkI2ltbWVyc2l2ZVRoZW1lI1wiLFxuICAgICAgICBwaWNfdXJsOiBpdC52b2RfcGljLFxuICAgICAgICBjb2xfdHlwZTogXCJtb3ZpZV8zXCIsXG4gICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgdm9kSWQ6IGl0LnZvZF9pZCxcbiAgICAgICAgICBpbWc6IGl0LnZvZF9waWMsXG4gICAgICAgICAgc25hbWU6IHNvdXJjZS5uYW1lLFxuICAgICAgICAgIHNrZXk6IHNvdXJjZS5rZXlcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHNldFJlc3VsdChkKTtcbiAgfSBlbHNlIHtcbiAgICBzZXRSZXN1bHQoW3tcbiAgICAgIHRpdGxlOiBcIueCueaIkeW8gOWni+iBmuWQiOaQnOe0olwiICsgTVlfS0VZV09SRCxcbiAgICAgIHVybDogXCJoaWtlcjovL3NlYXJjaD9zPVwiICsgTVlfS0VZV09SRCxcbiAgICAgIGV4dHJhOiB7XG4gICAgICAgIGRlbGVnYXRlT25seVNlYXJjaDogdHJ1ZSxcbiAgICAgICAgcnVsZXM6ICQudG9TdHJpbmcoKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcInJ1bnRpbWVDb25maWdcIiwgXCJydW50aW1lQ29uZmlnXCIpO1xuICAgICAgICAgICAgbGV0IGxpc3QgPSBydW50aW1lQ29uZmlnLmdldEFsbG93U2VhcmNoU291cmNlKCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2UoKTtcbiAgXG4gICAgICAgICAgICBsZXQgbGlzdGkgPSBsaXN0LmZpbmRJbmRleCh4ID0+IHgua2V5ID09IHNvdXJjZS5rZXkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoc291cmNlLnNlYXJjaGFibGUgJiYgbGlzdGkgIT0gLTEpIHtcbiAgICAgICAgICAgICAgbGlzdC5zcGxpY2UobGlzdC5pbmRleE9mKHNvdXJjZSksIDEpO1xuICAgICAgICAgICAgICBsaXN0LnVuc2hpZnQoc291cmNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJ1bGVzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XG4gICAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRpdGxlOiBpdC5uYW1lLFxuICAgICAgICAgICAgICAgIHNlYXJjaF91cmw6IFwiaGlrZXI6Ly9lbXB0eT9wYWdlPWZ5cGFnZSZzZWFyY2hUZXJtcz0qKlwiLFxuICAgICAgICAgICAgICAgIHNlYXJjaEZpbmQ6IFwianM6XCIgKyAkLnRvU3RyaW5nKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICBsZXQgZHJweSA9IEdNLmRlZmluZU1vZHVsZShcIkRycHlNYW5hZ2VcIikuZ2V0KGl0ZW0ua2V5KTtcblxuICAgICAgICAgICAgICAgICAgbGV0IGhvbWVMaXN0ID0gSlNPTi5wYXJzZShkcnB5LnNlYXJjaChNWV9LRVlXT1JELCBmYWxzZSwgTVlfUEFHRSkpLmxpc3QgfHwgW107XG4gICAgICAgICAgICAgICAgICBsZXQgZCA9IFtdO1xuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaXQgb2YgaG9tZUxpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXQudm9kX25hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgZGVzYzogaXQudm9kX3JlbWFya3MsXG4gICAgICAgICAgICAgICAgICAgICAgY29udGVudDogaXQudm9kX2NvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgdXJsOiBcImhpa2VyOi8vcGFnZS9kZXRhaWxlZCNpbW1lcnNpdmVUaGVtZSNcIixcbiAgICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiBpdC52b2RfcGljLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcIm1vdmllXzNcIixcbiAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xuICAgICAgICAgICAgICAgICAgICAgICAgdm9kSWQ6IGl0LnZvZF9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzUG9seW1lcml6ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZzogaXQudm9kX3BpYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNuYW1lOiBpdGVtLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBza2V5OiBpdGVtLmtleSxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0KGQpO1xuICAgICAgICAgICAgICAgIH0sIGl0KVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShydWxlcyk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1dKTtcbiAgfVxufSkoKSIsImRldGFpbF9jb2xfdHlwZSI6Im1vdmllXzEiLCJkZXRhaWxfZmluZF9ydWxlIjoiIiwic2RldGFpbF9jb2xfdHlwZSI6Im1vdmllXzEiLCJzZGV0YWlsX2ZpbmRfcnVsZSI6IiIsInVhIjoibW9iaWxlIiwicHJlUnVsZSI6Ii8qPCQ+XG5AaW5jbHVkZSBzdGFydFxuaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NjkxNiZhdXRoPTFkMzVlOGYwLTIyZTgtNTI3MC1hOWQxLTgyNmY1M2YxNzdhZFxuQGluY2x1ZGUgZW5kXG48JD4qL1xuIiwicGFnZXMiOiJbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcImRycHlcIixcInBhdGhcIjpcImRycHlcIixcInJ1bGVcIjpcImZ1bmN0aW9uIGluaXRIaWtlcigpIHtcXG4gICAgY29uc3QgaXNDbG9zZUxvZyA9ICFnZXRJdGVtKFxcXCJ1c2VMb2dcXFwiLCBcXFwiXFxcIik7XFxuICAgIGNvbnN0IGxvY2FsS2V5ID0gXFxcImRycHlcXFwiO1xcbiAgICBjb25zdCBDcnlwdG9VdGlsID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL2Fzc2V0cy9jcnlwdG8tamF2YS5qc1xcXCIpO1xcbiAgICBnbG9iYWxUaGlzLmxvY2FsID0ge1xcbiAgICAgICAgc2V0KHJ1bGVrZXksIGssIHYpIHtcXG4gICAgICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKGxvY2FsS2V5ICsgXFxcIkBcXFwiICsgcnVsZWtleSArIFxcXCJAXFxcIiArIGssIHYpO1xcbiAgICAgICAgfSxcXG4gICAgICAgIGdldChydWxla2V5LCBrLCB2KSB7XFxuICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2UwLmdldEl0ZW0obG9jYWxLZXkgKyBcXFwiQFxcXCIgKyBydWxla2V5ICsgXFxcIkBcXFwiICsgaywgXFxcIlxcXCIpIHx8IHY7XFxuICAgICAgICB9LFxcbiAgICAgICAgZGVsZXRlKHJ1bGVrZXksIGspIHtcXG4gICAgICAgICAgICBzdG9yYWdlMC5jbGVhckl0ZW0obG9jYWxLZXkgKyBcXFwiQFxcXCIgKyBydWxla2V5ICsgXFxcIkBcXFwiICsgayk7XFxuICAgICAgICB9XFxuICAgIH07XFxuICAgIGV2YWwoZ2V0Q3J5cHRvSlMoKSk7XFxuICAgIGdsb2JhbFRoaXMuQ3J5cHRvSlMgPSBDcnlwdG9KUztcXG5cXG4gICAgbGV0ICRyZXF1ZXN0ID0gcmVxdWVzdDtcXG4gICAgbGV0ICRwb3N0ID0gcG9zdDtcXG4gICAgZ2xvYmFsVGhpcy5yZXEgPSBmdW5jdGlvbiAodXJsLCBjb2JqKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCByZXMgPSB7fTtcXG4gICAgICAgICAgICBsZXQgb2JqID0gT2JqZWN0LmFzc2lnbih7fSwgY29iaik7XFxuICAgICAgICAgICAgaWYgKG9iai5kYXRhKSB7XFxuICAgICAgICAgICAgICAgIG9iai5ib2R5ID0gb2JqLmRhdGE7XFxuICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmouZGF0YTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShcXFwicmVkaXJlY3RcXFwiKSkgb2JqLnJlZGlyZWN0ID0gISFvYmoucmVkaXJlY3Q7XFxuICAgICAgICAgICAgaWYgKG9iai5idWZmZXIgPT09IDIpIHtcXG4gICAgICAgICAgICAgICAgb2JqLnRvSGV4ID0gdHJ1ZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgb2JqLmhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHtcXG4gICAgICAgICAgICAgICAgQ29va2llOiBcXFwiI25vQ29va2llI1xcXCJcXG4gICAgICAgICAgICB9LCBvYmouaGVhZGVycyk7XFxuICAgICAgICAgICAgaWYgKHVybCA9PT0gXFxcImh0dHBzOi8vYXBpLm5uLmNpL29jci9iNjQvdGV4dFxcXCIgJiYgb2JqLmhlYWRlcnMpIHtcXG4gICAgICAgICAgICAgICAgb2JqLmhlYWRlcnNbXFxcIkNvbnRlbnQtVHlwZVxcXCJdID0gXFxcInRleHQvcGxhaW5cXFwiO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoXFxcImZpbGU6Ly9cXFwiKSAmJiAodXJsLmluY2x1ZGVzKFxcXCI/dHlwZT1cXFwiKSB8fCB1cmwuaW5jbHVkZXMoXFxcIj9wYXJhbXM9XFxcIikpKSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IHVybC5zbGljZSgwLCB1cmwubGFzdEluZGV4T2YoXFxcIj9cXFwiKSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBvYmouaGVhZGVycykge1xcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9iai5oZWFkZXJzW2tleV0gIT09IFxcXCJzdHJpbmdcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICBvYmouaGVhZGVyc1trZXldID0gU3RyaW5nKG9iai5oZWFkZXJzW2tleV0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCByID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgLyogaWYgKFN0cmluZyhvYmoubWV0aG9kKS50b0xvd2VyQ2FzZSgpID09PSBcXFwicG9zdFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgIHIgPSAkcG9zdCh1cmwsIG9iaik7XFxuICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICByID0gJHJlcXVlc3QodXJsLCBvYmopO1xcbiAgICAgICAgICAgICB9Ki9cXG4gICAgICAgICAgICByID0gJHJlcXVlc3QodXJsLCBvYmopO1xcbiAgICAgICAgICAgIGlmIChvYmoud2l0aEhlYWRlcnMpIHtcXG4gICAgICAgICAgICAgICAgciA9IEpTT04ucGFyc2Uocik7XFxuICAgICAgICAgICAgICAgIHJlcy5jb250ZW50ID0gci5ib2R5O1xcbiAgICAgICAgICAgICAgICByZXMuaGVhZGVycyA9IHt9O1xcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoci5oZWFkZXJzIHx8IHt9KSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmVzLmhlYWRlcnNba10gPSB2WzBdO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmVzLmNvbnRlbnQgPSByO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAob2JqLmJ1ZmZlciA9PT0gMikge1xcbiAgICAgICAgICAgICAgICByZXMuY29udGVudCA9IENyeXB0b1V0aWwuRGF0YS5wYXJzZUhleChyZXMuY29udGVudCkudG9CYXNlNjQoX2Jhc2U2NC5OT19XUkFQKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIHJlcztcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coXFxcIkVycm9yXFxcIiArIGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgLypcXG4gICAgY29uc3QgSmluSmEgPSAkLnJlcXVpcmUoXFxcImh0dHBzOi8vY2RuLmJvb3RjZG4ubmV0L2FqYXgvbGlicy9tdXN0YWNoZS5qcy80LjEuMC9tdXN0YWNoZS5qc1xcXCIpO1xcbiAgXFxuICAgIGNvbnN0IEpQID0gJC5yZXF1aXJlKFxcXCJodHRwczovL2pzb25wYXRoLXBsdXMuZ2l0aHViLmlvL0pTT05QYXRoL2Rpc3QvaW5kZXgtYnJvd3Nlci11bWQuY2pzXFxcIik7XFxuICAgIGdsb2JhbFRoaXMuY2hlZXJpbyA9IHtcXG4gICAgICAgIGppbmphMih0ZW1wbGF0ZSwgb2JqKSB7XFxuICAgICAgICAgICAgXFxuICAgICAgICAgICAgcmV0dXJuICQubG9nKEppbkphLnJlbmRlcih0ZW1wbGF0ZSwgb2JqKSk7XFxuICAgICAgICB9LFxcbiAgICAgICAganAocGF0aCwganNvbikge1xcbiAgICAgICAgICAgIHJldHVybiBKUC5KU09OUGF0aCh7XFxuICAgICAgICAgICAgICAgIHBhdGgsXFxuICAgICAgICAgICAgICAgIGpzb25cXG4gICAgICAgICAgICB9KVswXTtcXG4gICAgICAgIH1cXG4gICAgfSovXFxuICAgIGdsb2JhbFRoaXMucGRmYSA9IF9wZGZhO1xcbiAgICBnbG9iYWxUaGlzLnBkID0gX3BkO1xcbiAgICBnbG9iYWxUaGlzLnBkZmggPSBfcGRmaDtcXG4gICAgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsID0gZnVuY3Rpb24gKHNlYXJjaCwgcmVwbGFjZW1lbnQpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLnNwbGl0KHNlYXJjaCkuam9pbihyZXBsYWNlbWVudCk7XFxuICAgIH07XFxuICAgIGxldCAkdG9TdHJpbmcgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XFxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcXG4gICAgICAgIHJldHVybiAkdG9TdHJpbmcuYXBwbHkodGhpcykudHJpbSgpO1xcbiAgICB9O1xcbiAgICBpZiAoaXNDbG9zZUxvZykge1xcbiAgICAgICAgLy8g6YeN5YaZY29uc29sZS5sb2flh73mlbBcXG4gICAgICAgIGNvbnNvbGUubG9nID0gZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgIC8vIOajgOafpeS8oOWFpeWPguaVsOeahOaVsOmHj1xcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xcbiAgICAgICAgICAgICAgICAvLyDlpoLmnpzlj4LmlbDmlbDph4/lpKfkuo4x77yM6LCD55So5Y6f5aeL55qEY29uc29sZS5sb2flh73mlbBcXG4gICAgICAgICAgICAgICAgLy9vcmlnaW5hbExvZy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgLy8g5aaC5p6c5Y+C5pWw5Y+q5pyJ5LiA5Liq77yM5YiZ5LiN5YGa5Lu75L2V5pON5L2cXFxuICAgICAgICB9O1xcbiAgICB9XFxufVxcbmluaXRIaWtlcigpO1xcbmNvbnN0IGRycHlQYXRoID0gZ2V0UGF0aChcXFwiaGlrZXI6Ly9maWxlcy9kYXRhL1xcXCIgKyBNWV9SVUxFLnRpdGxlICsgXFxcIi9saWJzX2hpa2VyL2RycHkyLmpzXFxcIik7XFxuXFxuaWYgKCFmaWxlRXhpc3QoZHJweVBhdGgpKSB7XFxuICAgIHRocm93IG5ldyBFcnJvcihcXFwi57y65bCRZHJweS5qc+i/kOihjOW6k1xcXCIpO1xcbn1cXG5sZXQgZHJweSA9ICQucmVxdWlyZShkcnB5UGF0aCk7XFxuLypcXG5sZXQgY3VycmVudFBhdGggPSBcXFwiXFxcIjtcXG5sZXQgJGluaXQgPSBkcnB5LmluaXQ7XFxuZHJweS5pbml0ID0gZnVuY3Rpb24oZXh0KSB7XFxuICAgIGlmIChleHQgPT09IGN1cnJlbnRQYXRoKSByZXR1cm47XFxuICAgICRpbml0LmNhbGwodGhpcywgZXh0KTtcXG4gICAgY3VycmVudFBhdGggPSBleHQ7XFxufSovXFxuJC5leHBvcnRzID0gZHJweTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzFfdmVydGljYWxfcGljX2JsdXJcIixcIm5hbWVcIjpcIuivpue7humhtemdolwiLFwicGF0aFwiOlwiZGV0YWlsZWRcIixcInJ1bGVcIjpcImpzOlxcbihmdW5jdGlvbigpIHtcXG4gICAgbGV0IGlkID0gTVlfUEFSQU1TLnZvZElkO1xcbiAgICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gICAgICAgIEdNLmNsZWFyKFxcXCJyZW5vdmF0ZUxpc3RcXFwiKTtcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcInNvcnRpXFxcIik7XFxuICAgICAgICBjbGVhck15VmFyKFxcXCJwYWdlbnVtXFxcIik7XFxuICAgIH0pO1xcbiAgICBhZGRMaXN0ZW5lcignb25SZWZyZXNoJywgJC50b1N0cmluZygoaWQpID0+IHtcXG4gICAgICAgIC8vY2xlYXJNeVZhcihpZCArIFxcXCJlcmluZm9cXFwiKVxcbiAgICB9LCBpZCkpXFxuXFxuICAgIC8v5pa55rOVXFxuICAgIGZ1bmN0aW9uIGZvbnRzdHlsZSh0ZXh0LCBwYXJhbXMpIHtcXG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB1bmRlZmluZWQ7XFxuICAgICAgICB2YXIgaCA9IHBhcmFtcy5oICE9PSBmYWxzZSA/ICfigJzigJzigJ3igJ0nIDogJyc7XFxuICAgICAgICB2YXIgdGFncyA9IHBhcmFtcy50YWdzIHx8IFxcXCJcXFwiO1xcbiAgICAgICAgaWYgKHBhcmFtcy5jICE9IHVuZGVmaW5lZCkge1xcbiAgICAgICAgICAgIHRleHQgPSB0ZXh0LmZvbnRjb2xvcihwYXJhbXMuYyk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAodGFncykge1xcbiAgICAgICAgICAgIHZhciB0YWdBcnJheSA9IHRhZ3Muc3BsaXQoJ3wnKS5maWx0ZXIoZSA9PiBlKTtcXG4gICAgICAgICAgICB2YXIgb3BlblRhZ3MgPSAnJztcXG4gICAgICAgICAgICB2YXIgY2xvc2VUYWdzID0gJyc7XFxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWdBcnJheS5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBvcGVuVGFncyArPSAnPCcgKyB0YWdBcnJheVtpXSArICc+JztcXG4gICAgICAgICAgICAgICAgY2xvc2VUYWdzID0gJzwvJyArIHRhZ0FycmF5W2ldICsgJz4nICsgY2xvc2VUYWdzO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0ZXh0ID0gb3BlblRhZ3MgKyB0ZXh0ICsgY2xvc2VUYWdzO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGggKyB0ZXh0O1xcbiAgICB9XFxuXFxuICAgIGZ1bmN0aW9uIGZpbmRMb25nZXN0RWxlbWVudChhcnIpIHtcXG4gICAgICAgIHJldHVybiBhcnIucmVkdWNlKChhLCBiKSA9PiBhLmxlbmd0aCA+IGIubGVuZ3RoID8gYSA6IGIpO1xcbiAgICB9XFxuXFxuICAgIGZ1bmN0aW9uIGNvdW50VG90YWxCeXRlcyh0ZXh0KSB7XFxuICAgICAgICB2YXIgY291bnQgPSAwO1xcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgdmFyIGNvZGUgPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XFxuICAgICAgICAgICAgaWYgKGNvZGUgPj0gMHgwMTAwKSB7IC8vIOWPjOWtl+iKguWtl+espueahCBVbmljb2RlIOe8lueggeWkp+S6jiAyNTVcXG4gICAgICAgICAgICAgICAgY291bnQgKz0gMjsgLy8g5Y+M5a2X6IqC5a2X56ym6K6h5pWw5Li6MlxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7IC8vIOWNleWtl+iKguWtl+espuiuoeaVsOS4ujFcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gY291bnQ7XFxuICAgIH1cXG5cXG4gICAgZnVuY3Rpb24gY2FjaGVTaG93VGlwcygpIHtcXG4gICAgICAgIC8qaWYgKHN0b3JhZ2UwLmdldE15VmFyKGlkICsgXFxcImVyaW5mb1xcXCIpKSB7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGZvbnRzdHlsZShcXFwi5b2T5YmN5Li657yT5a2YLOeCueaIkeWIt+aWsFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgIGM6IFxcXCJncmV5XFxcIixcXG4gICAgICAgICAgICAgICAgICAgIHRhZ3M6IFxcXCJzbWFsbFxcXCJcXG4gICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaWQpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoaWQgKyBcXFwiZXJpbmZvXFxcIilcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIGlkKSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH0qL1xcbiAgICB9XFxuXFxuICAgIGZ1bmN0aW9uIHN1YnN0cihzdHIsIG1heExlbmd0aCkge1xcbiAgICAgICAgbGV0IGxlbiA9IDA7XFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgIGlmIChzdHIuY2hhckNvZGVBdChpKSA+IDI1NSkge1xcbiAgICAgICAgICAgICAgICBsZW4gKz0gMjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBsZW4rKztcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKGxlbiA+IG1heExlbmd0aCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyLnNsaWNlKDAsIGkpICsgJy4uLic7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHN0cjtcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBzZXREZXNjKGRlc2MsIG51bSkge1xcbiAgICAgICAgaWYgKGRlc2MgPT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgfVxcbiAgICAgICAgZGVzYyA9IGRlc2MuY29uc3RydWN0b3IgPT0gQXJyYXkgPyBkZXNjLmpvaW4oJzxicj4nKSA6IGRlc2M7XFxuICAgICAgICBpZiAoZGVzYy5yZXBsYWNlKC8oPGJyPnxcXFxccyspL2csICcnKS5sZW5ndGggPT0gMCkge1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnYmlnX2JsYW5rX2Jsb2NrJ1xcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6ICdiaWdfYmxhbmtfYmxvY2snXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICByZXR1cm47XFxuICAgICAgICB9XFxuXFxuICAgICAgICBjb25zdCBtYXJrID0gJ2Rlc2MnO1xcbiAgICAgICAgbnVtID0gdHlwZW9mKG51bSkgPT0gJ3VuZGVmaW5lZCcgPyAxMDAgOiBudW1cXG4gICAgICAgIGRlc2MgPSBkZXNjLnN0YXJ0c1dpdGgoJ+OAgOOAgCcpID8gZGVzYyA6ICfjgIDjgIAnICsgZGVzYztcXG4gICAgICAgIGRlc2MgPSBkZXNjLnJlcGxhY2UoLycvZywgXFxcIiYjMzk7XFxcIik7XFxuICAgICAgICBkZXNjID0gZGVzYy5yZXBsYWNlKC9cXFxcclxcXFxuL2csIFxcXCI8YnI+XFxcIik7XFxuICAgICAgICBkZXNjID0gZGVzYy5yZXBsYWNlKC9cXFxcbi9nLCBcXFwiPGJyPlxcXCIpO1xcbiAgICAgICAgbGV0IHNkZXNjID0gc3Vic3RyKGRlc2MsIG51bSk7XFxuXFxuICAgICAgICB2YXIgY29sb3JzID0ge1xcbiAgICAgICAgICAgIHNob3c6IFxcXCJibGFja1xcXCIsXFxuICAgICAgICAgICAgaGlkZTogXFxcImdyZXlcXFwiXFxuICAgICAgICB9XFxuXFxuICAgICAgICB2YXIgbGF6eSA9ICQoYCNub0xvYWRpbmcjYCkubGF6eVJ1bGUoKGRjLCBzZGMsIG0sIGNzKSA9PiB7XFxuICAgICAgICAgICAgdmFyIHNob3cgPSBzdG9yYWdlMC5nZXRJdGVtKG0sICcwJyk7XFxuICAgICAgICAgICAgdmFyIHRpdGxlID0gZmluZEl0ZW0oJ2Rlc2MnKS50aXRsZTtcXG4gICAgICAgICAgICB2YXIgcmUgPSAvKDxcXFxcL3NtYWxsPjxicj4uKj8+KS4rL2c7XFxuICAgICAgICAgICAgdmFyIGV4cCA9ICflsZXlvIA6JztcXG4gICAgICAgICAgICB2YXIgcmV0ID0gJ+aUtui1tzonO1xcbiAgICAgICAgICAgIGlmIChzaG93ID09ICcxJykge1xcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKCdkZXNjJywge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UocmV0LCBleHApXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UocmUsICckMScgKyBzZGMgKyAnPC9zbWFsbD4nKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oPFxcXFwvc21hbGw+PGJyPlxcXFw8Zm9udCBjb2xvcj1cXFwiKS4qPyhcXFwiPikvLCAnJDEnICsgY3MuaGlkZSArICckMicpXFxuXFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0obSwgJzAnKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKCdkZXNjJywge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoZXhwLCByZXQpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UocmUsICckMScgKyBkYyArICc8L3NtYWxsPicpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyg8XFxcXC9zbWFsbD48YnI+XFxcXDxmb250IGNvbG9yPVxcXCIpLio/KFxcXCI+KS8sICckMScgKyBjcy5zaG93ICsgJyQyJylcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShtLCAnMScpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gYGhpa2VyOi8vZW1wdHlgXFxuICAgICAgICB9LCBkZXNjLCBzZGVzYywgbWFyaywgY29sb3JzKVxcbiAgICAgICAgdmFyIHNjID0gc3RvcmFnZTAuZ2V0SXRlbShtYXJrLCAnMCcpID09ICcwJyA/ICflsZXlvIA6JyA6ICfmlLbotbc6JztcXG4gICAgICAgIHZhciBkYyA9IHN0b3JhZ2UwLmdldEl0ZW0obWFyaywgJzAnKSA9PSAnMCcgPyBzZGVzYyA6IGRlc2M7XFxuICAgICAgICB2YXIgY3MgPSBzdG9yYWdlMC5nZXRJdGVtKG1hcmssICcwJykgPT0gJzAnID8gY29sb3JzLmhpZGUgOiBjb2xvcnMuc2hvdztcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICcnICsgJzxiPjxmb250IGNvbG9yPVxcXCIjMDk4QUMxXFxcIj7iiLfliafmg4XnroDku4tcXHQ8L2ZvbnQ+PC9iPicgKyBcXFwiPHNtYWxsPjxhIHN0eWxlPSd0ZXh0LWRlY29yYXRpb246IG5vbmU7JyBocmVmPSdcXFwiICsgbGF6eSArIFxcXCInPlxcXCIgKyBzYyArICc8L2E+PC9zbWFsbD48YnI+PGZvbnQgY29sb3I9XFxcIicgKyBjcyArICdcXFwiPicgKyBgJHtkY31gICsgJzwvc21hbGw+JyxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6ICdkZXNjJyxcXG4gICAgICAgICAgICAgICAgbGluZVNwYWNpbmc6IDYsXFxuICAgICAgICAgICAgICAgIHRleHRTaXplOiAxNSxcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IHRydWUsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgfVxcblxcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RyaW5nLnByb3RvdHlwZSwgJ1NwbGl0Jywge1xcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHMsIGUpIHtcXG4gICAgICAgICAgICBpZiAoZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zcGxpdChzKS5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSAnJyk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXQocyk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxcbiAgICB9KTtcXG5cXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQXJyYXkucHJvdG90eXBlLCB7XFxuICAgICAgICBleGNsdWRlS2V5czoge1xcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihrZXlzLCBleGNsdWRlLCByZW5hbWVDYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgICAvLyDnoa7lrprmmK/mjpLpmaTov5jmmK/lj6rkv53nlZnplK5cXG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkRXhjbHVkZSA9IHR5cGVvZiBleGNsdWRlID09PSAnYm9vbGVhbicgPyBleGNsdWRlIDogdHJ1ZTtcXG4gICAgICAgICAgICAgICAgY29uc3Qga2V5c1RvSGFuZGxlID0gQXJyYXkuaXNBcnJheShrZXlzKSA/IGtleXMgOiBbXTtcXG5cXG4gICAgICAgICAgICAgICAgLy8g5L2/55SoQXJyYXkucHJvdG90eXBlLm1hcOmBjeWOhuaVsOe7hOS4reeahOavj+S4quWFg+e0oFxcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXAoaXRlbSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAvLyDlpoLmnpzlhYPntKDmmK/kuIDkuKrmlbDnu4TvvIzpgJLlvZLosIPnlKhleGNsdWRlS2V5c1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5leGNsdWRlS2V5cyhleGNsdWRlLCBrZXlzLCByZW5hbWVDYWxsYmFjayk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiBpdGVtICE9PSBudWxsKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8g5aaC5p6c5YWD57Sg5piv5LiA5Liq5a+56LGh77yM5L2/55SoT2JqZWN0LmZyb21FbnRyaWVz5ZKMT2JqZWN0LmVudHJpZXPmnaXlpITnkIbplK5cXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoaXRlbSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkRW50cmllcyA9IGVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5aaC5p6c5pyJ6YeN5ZG95ZCN5Zue6LCD5Ye95pWw77yM5YiZ6LCD55So5a6DXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVuYW1lQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbcmVuYW1lQ2FsbGJhY2soa2V5LCB2YWx1ZSksIHZhbHVlXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgdmFsdWVdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkRW50cmllcyA9IHNob3VsZEV4Y2x1ZGUgP1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRFbnRyaWVzLmZpbHRlcigoW2tleV0pID0+ICFrZXlzVG9IYW5kbGUuaW5jbHVkZXMoa2V5KSkgOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRFbnRyaWVzLmZpbHRlcigoW2tleV0pID0+IGtleXNUb0hhbmRsZS5pbmNsdWRlcyhrZXkpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGZpbHRlcmVkRW50cmllcyk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWmguaenOWFg+e0oOS4jeaYr+WvueixoeaIluaVsOe7hO+8jOebtOaOpei/lOWbnlxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLCAvLyDorr7nva7kuLrkuI3lj6/mnprkuL5cXG4gICAgICAgIH0sXFxuICAgICAgICB0cmFuc2Zvcm1LZXlzOiB7XFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKGtleU1hcHBpbmcpIHtcXG4gICAgICAgICAgICAgICAgLy8g5L2/55SoQXJyYXkucHJvdG90eXBlLm1hcOmBjeWOhuaVsOe7hOS4reeahOavj+S4quWFg+e0oFxcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXAoaXRlbSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAvLyDlpoLmnpzlhYPntKDmmK/kuIDkuKrmlbDnu4TvvIzpgJLlvZLosIPnlKh0cmFuc2Zvcm1LZXlzXFxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnRyYW5zZm9ybUtleXMoa2V5TWFwcGluZyk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiBpdGVtICE9PSBudWxsKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8g5aaC5p6c5YWD57Sg5piv5LiA5Liq5a+56LGh77yM5L2/55SoT2JqZWN0LmZyb21FbnRyaWVz5ZKMT2JqZWN0LmVudHJpZXPmnaXlpITnkIbplK5cXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoaXRlbSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRFbnRyaWVzID0gZW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdLZXkgPSBrZXlNYXBwaW5nW2tleV0gfHwga2V5OyAvLyDlpoLmnpzplK7lnKjmmKDlsITkuK3vvIzkvb/nlKjmlrDplK7vvJvlkKbliJnkvb/nlKjljp/lp4vplK5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtuZXdLZXksIHZhbHVlXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRyYW5zZm9ybWVkRW50cmllcyk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWmguaenOWFg+e0oOS4jeaYr+WvueixoeaIluaVsOe7hO+8jOebtOaOpei/lOWbnlxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLCAvLyDorr7nva7kuLrkuI3lj6/mnprkuL5cXG4gICAgICAgIH1cXG4gICAgfSk7XFxuXFxuICAgIGxldCBzb3J0b2JqID0gW1xcbiAgICAgICAgZm9udHN0eWxlKFxcXCLmraPluo9cXFwiLCB7XFxuICAgICAgICAgICAgYzogXFxcIiMxQUFEMTlcXFwiLFxcbiAgICAgICAgICAgIHRhZ3M6IFxcXCJiXFxcIlxcbiAgICAgICAgfSksXFxuICAgICAgICBmb250c3R5bGUoXFxcIumAhuW6j1xcXCIsIHtcXG4gICAgICAgICAgICBjOiBcXFwiI0ZGMDAwMFxcXCIsXFxuICAgICAgICAgICAgdGFnczogXFxcImJcXFwiXFxuICAgICAgICB9KVxcbiAgICBdXFxuICAgIC8v5pa55rOVXFxuXFxuICAgIHZhciBzb3J0aSA9IGdldE15VmFyKFxcXCJzb3J0aVxcXCIsIFxcXCIwXFxcIik7XFxuXFxuICAgIC8vbG9nKHNvcnRvYmopXFxuICAgICQuZXh0ZW5kKHtcXG4gICAgICAgIHNwbGl0UGFnZSh0b3RhbEl0ZW1zLCBwYWdlU2l6ZSkge1xcbiAgICAgICAgICAgIHBhZ2VTaXplID0gcGFnZVNpemUgfHwgNTA7XFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRvdGFsSXRlbXM7IGkgKz0gcGFnZVNpemUpIHtcXG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IGkgKyBwYWdlU2l6ZSAtIDE7XFxuICAgICAgICAgICAgICAgIGlmIChlbmQgPiB0b3RhbEl0ZW1zKSB7XFxuICAgICAgICAgICAgICAgICAgICBlbmQgPSB0b3RhbEl0ZW1zO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGAke2l9LSR7ZW5kfWApO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICAgICAgfSxcXG4gICAgICAgIHNwbGl0QXJyYXlCeVJhbmdlcyhhcnJheSwgcmFuZ2VzKSB7XFxuICAgICAgICAgICAgLy8g5qC55o2u6IyD5Zu05ouG5YiG5pWw57uEXFxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJhbmdlcy5tYXAoZnVuY3Rpb24ocmFuZ2UpIHtcXG4gICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gcmFuZ2Uuc3BsaXQoJy0nKS5tYXAoTnVtYmVyKTtcXG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gcGFydHNbMF0gLSAxOyAvLyDlh48x5piv5Zug5Li65pWw57uE57Si5byV5LuOMOW8gOWni1xcbiAgICAgICAgICAgICAgICB2YXIgZW5kID0gcGFydHNbMV0gLSAxO1xcbiAgICAgICAgICAgICAgICAvLyDkvb/nlKhBcnJheS5wcm90b3R5cGUuc2xpY2XmnaXojrflj5blrZDmlbDnu4RcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5LnNsaWNlKHN0YXJ0LCBlbmQgKyAxKTsgLy8g5YyF5ous57uT5p2f57Si5byV77yM5omA5Lul5YqgMVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgICAgICB9LFxcbiAgICB9KVxcblxcbiAgICBsZXQgc291cmNlID0ge307XFxuICAgIGlmIChNWV9QQVJBTVMuc291cmNlKSB7XFxuICAgICAgICBzb3VyY2UgPSBNWV9QQVJBTVMuc291cmNlO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgY29uc3QgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgc291cmNlID0gcnVudGltZUNvbmZpZy5maW5kU291cmNlKE1ZX1BBUkFNUy5za2V5KTtcXG4gICAgICAgIE1ZX1BBUkFNUy5zb3VyY2UgPSBzb3VyY2U7XFxuICAgICAgICBzZXRQYWdlUGFyYW1zKE1ZX1BBUkFNUyk7XFxuICAgIH1cXG5cXG4gICAgY29uc3QgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpO1xcblxcbiAgICBEcnB5TWFuYWdlLmluaXRQYWdlKFxcXCJlclxcXCIpO1xcblxcbiAgICBsZXQgZHJweSA9IERycHlNYW5hZ2UuZ2V0QnlTb3VyY2Uoc291cmNlKTtcXG4gICAgbGV0IHN0eXBlID0gZHJweS5nZXRSdWxlKFxcXCLnsbvlnotcXFwiKTtcXG4vKlxcbiAgICBsZXQgaW5mbyA9IHN0b3JhZ2UwLmdldE15VmFyKGlkICsgXFxcImVyaW5mb1xcXCIsIFxcXCJcXFwiKTtcXG5cXG4gICAgaWYgKGluZm8gPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgIGluZm8gPSBKU09OLnBhcnNlKGRycHkuZGV0YWlsKFN0cmluZyhpZCkpKS5saXN0WzBdO1xcbiAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoaWQgKyBcXFwiZXJpbmZvXFxcIiwgaW5mbylcXG4gICAgfVxcbiovXFxuICAgIGxldCBpbmZvID0gSlNPTi5wYXJzZShkcnB5LmRldGFpbChTdHJpbmcoaWQpKSkubGlzdFswXTtcXG4gICAgbGV0IFvlr7zmvJQsIOS4u+a8lF0gPSBbaW5mby52b2RfZGlyZWN0b3IsIGluZm8udm9kX2FjdG9yXVxcblxcbiAgICBpZiAo5a+85ryUICE9IHVuZGVmaW5lZCAmJiDlr7zmvJQgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgIOWvvOa8lCA9IOWvvOa8lC5TcGxpdCgvXFxcXC8vZywgdHJ1ZSkuam9pbihcXFwiIFxcXCIpO1xcbiAgICAgICAg5a+85ryUID0gL1s677yaXS8udGVzdCjlr7zmvJQpID8g5a+85ryUIDogXFxcIuWvvOa8lDpcXFwiICsg5a+85ryUXFxuICAgIH1cXG4gICAgaWYgKOS4u+a8lCAhPSB1bmRlZmluZWQgJiYg5Li75ryUICE9IFxcXCJcXFwiKSB7XFxuICAgICAgICDkuLvmvJQgPSDkuLvmvJQuU3BsaXQoL1xcXFwvL2csIHRydWUpLmpvaW4oXFxcIiBcXFwiKTtcXG4gICAgICAgIOS4u+a8lCA9IC9bOu+8ml0vLnRlc3Qo5Li75ryUKSA/IOS4u+a8lCA6IFxcXCLkuLvmvJQ6XFxcIiArIOS4u+a8lFxcbiAgICB9XFxuICAgIGxldCBb5ZCN56ewLCDlpIfms6hdID0gW2luZm8udm9kX25hbWUsIGluZm8udm9kX3JlbWFya3NdXFxuICAgIGlmICjlpIfms6ggIT0gdW5kZWZpbmVkICYmIOWkh+azqCAhPSBcXFwiXFxcIikge1xcbiAgICAgICAg5aSH5rOoID0g5aSH5rOoLlNwbGl0KC9cXFxcLy9nLCB0cnVlKS5qb2luKFxcXCIgXFxcIik7XFxuICAgICAgICDlpIfms6ggPSAvWzrvvJpdLy50ZXN0KOWkh+azqCkgPyDlpIfms6ggOiBcXFwi5aSH5rOoOlxcXCIgKyDlpIfms6g7XFxuICAgIH1cXG4gICAgbGV0IHRpdGxlcyA9IFvlkI3np7AsIOWkh+azqF07XFxuICAgIGxldCBkZXNjcyA9IFvlr7zmvJQsIOS4u+a8lCwgaW5mby52b2RfYXJlYSwgaW5mby52b2RfeWVhcl1cXG5cXG4gICAgbGV0IGQgPSBbXTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiB0aXRsZXMuZmlsdGVyKGUgPT4gZSkubWFwKCh4LCBpKSA9PiBpID09IDEgPyBmb250c3R5bGUoeCwge1xcbiAgICAgICAgICAgIHRhZ3M6IFxcXCJzbWFsbFxcXCJcXG4gICAgICAgIH0pIDogeCkuam9pbihcXFwiXFxcXG5cXFwiKSxcXG4gICAgICAgIGRlc2M6IGRlc2NzLmZpbHRlcihlID0+IGUpLmpvaW4oXFxcIlxcXFxuXFxcIiksXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgIHBpY191cmw6IGluZm8udm9kX3BpYyB8fCBNWV9QQVJBTVMuaW1nLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBncmFkaWVudDogZmFsc2UsXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfmlbDmja7mnaXmupA6JyArIE1ZX1BBUkFNUy5zbmFtZSxcXG4gICAgICAgIC8vZGVzYzpcXFwiXFxcIitNWV9QQVJBTVMuc2tleStcXFwiXFxcXHRcXFwiLFxcbiAgICAgICAgaW1nOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9tZXNzeS83OC5zdmdcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCJcXG4gICAgfSlcXG4gICAgc2V0RGVzYyhpbmZvLnZvZF9jb250ZW50KVxcblxcbiAgICAvKlxcbiAgICBmdW5jdGlvbiBwYXJzZVF1ZXJ5KHF1ZXJ5KSB7XFxuICAgICAgdmFyIG9iaiA9IHt9O1xcbiAgICAgIHF1ZXJ5LnNwbGl0KFxcXCImXFxcIikuZmlsdGVyKGUgPT4gZSkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xcbiAgICAgICAgdmFyIHBhcnRzID0gaXRlbS5zcGxpdChcXFwiPVxcXCIpO1xcbiAgICAgICAgb2JqW3BhcnRzWzBdXSA9IHBhcnRzWzFdO1xcbiAgICAgIH0pO1xcbiAgICAgIHJldHVybiBvYmo7XFxuICAgIH1cXG5cXG4gICAgLy9qc+aJp+ihjFxcbiAgICBsZXQgcGFyc2Vfb2JqID0ge1xcbiAgICAgIGRlZlJ1bGVzOiBbXFxcIioubXA0XFxcIiwgXFxcIioubTN1OFxcXCJdLFxcbiAgICB9O1xcbiAgICB2YXIgZXh0cmEgPSB7XFxuICAgICAgXFxcInVhXFxcIjogTU9CSUxFX1VBXFxuICAgIH1cXG4gICAgbGV0IHBhcnNlID0gSlNPTi5wYXJzZShkcnB5LnBsYXkoKSk7XFxuICAgIC8vY29uc29sZS5sb2cocGFyc2UpO1xcbiAgICBpZiAocGFyc2UuaGFzT3duUHJvcGVydHkoXFxcInBhcnNlX2V4dHJhXFxcIikpIHtcXG4gICAgICBsZXQgcGFyc2VfZXh0cmEgPSBkZWNvZGVVUklDb21wb25lbnQocGFyc2UucGFyc2VfZXh0cmEpO1xcbiAgICAgIHBhcnNlX29iaiA9IE9iamVjdC5hc3NpZ24ocGFyc2Vfb2JqLCBwYXJzZVF1ZXJ5KHBhcnNlX2V4dHJhKSk7XFxuICAgICAgaWYgKHBhcnNlX29iai5oYXNPd25Qcm9wZXJ0eShcXFwiaW5pdF9zY3JpcHRcXFwiKSkge1xcbiAgICAgICAgcGFyc2Vfb2JqW1xcXCJpbml0X3NjcmlwdFxcXCJdID0gYmFzZTY0RGVjb2RlKHBhcnNlX29ialtcXFwiaW5pdF9zY3JpcHRcXFwiXSk7XFxuICAgICAgfVxcbiAgICB9XFxuICAgIGlmIChwYXJzZV9vYmouaGFzT3duUHJvcGVydHkoXFxcImlzX3BjXFxcIikgJiYgcGFyc2Vfb2JqW1xcXCJpc19wY1xcXCJdID09IFxcXCIxXFxcIikge1xcbiAgICAgIGV4dHJhW1xcXCJ1YVxcXCJdID0gUENfVUE7XFxuICAgIH1cXG4gICAgaWYgKHBhcnNlLmhhc093blByb3BlcnR5KFxcXCJoZWFkZXJcXFwiKSkge1xcbiAgICAgIGV4dHJhW1xcXCJ1YVxcXCJdID0gcGFyc2VbXFxcImhlYWRlclxcXCJdW1xcXCJVc2VyLUFnZW50XFxcIl07XFxuICAgICAgLy9leHRyYVtcXFwicmVkaXJlY3RcXFwiXT1mYWxzZTtcXG4gICAgICBleHRyYVtcXFwianNcXFwiXSA9ICQudG9TdHJpbmcoKGpzKSA9PiB7XFxuICAgICAgICBldmFsKGpzKVxcbiAgICAgICAgZmJhLmxvZyhuYXZpZ2F0b3IudXNlckFnZW50KVxcbiAgICAgICAgZmJhLmxvZyhsb2NhdGlvbi5ocmVmKVxcbiAgICAgIH0sICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5hdmlnYXRvciwgJ3VzZXJBZ2VudCcsIHtcXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XFxuICAgICAgICAgICAgcmV0dXJuICdNeS1DdXN0b20tVUEtU3RyaW5nJztcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgfSkpXFxuICAgIH1cXG4gICAgaWYgKHBhcnNlX29iai5oYXNPd25Qcm9wZXJ0eShcXFwiY3VzdG9tX3JlZ2V4XFxcIikpIHtcXG4gICAgICBsZXQgY3VycmVudCA9IHBhcnNlX29ialtcXFwiZGVmUnVsZXNcXFwiXTtcXG4gICAgICBleHRyYVtcXFwidmlkZW9SdWxlc1xcXCJdID0gY3VycmVudC5jb25jYXQocGFyc2Vfb2JqLmN1c3RvbV9yZWdleC5zcGxpdCgvXFxcXHwvZykuZmlsdGVyKGUgPT4gZSkpXFxuICAgIH1cXG4gICAgaWYgKHBhcnNlLmhhc093blByb3BlcnR5KFxcXCJqc1xcXCIpKSB7XFxuICAgICAgZXh0cmFbXFxcImpzXFxcIl0gPSAkLnRvU3RyaW5nKChqcywgcGFyc2UsIHQpID0+IHtcXG4gICAgICAgIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFwiaW5pdF9zY3JpcHRcXFwiKSkge1xcbiAgICAgICAgICBmYmEubG9nKHQgKyBcXFwiOuaJp+ihjGluaXRfc2NyaXB0XFxcIik7XFxuICAgICAgICAgIGV2YWwocGFyc2UuaW5pdF9zY3JpcHQpO1xcbiAgICAgICAgfVxcbiAgICAgICAgZmJhLmxvZyhuYXZpZ2F0b3IucGxhdGZvcm0pO1xcbiAgICAgICAgZmJhLmxvZyh0ICsgXFxcIjrmiafooYxqc+eCueWHu1xcXCIpXFxuICAgICAgICBldmFsKGpzKVxcbiAgICAgIH0sIHBhcnNlLmpzLCBwYXJzZV9vYmosIE1ZX1JVTEUudGl0bGUpXFxuICAgIH1cXG4gICAgLy9sb2coZXh0cmEpXFxuICAgICovXFxuICAgIGxldCBmcm9tID0gW107XFxuICAgIGlmIChpbmZvLnZvZF9wbGF5X2Zyb20gIT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICBmcm9tID0gaW5mby52b2RfcGxheV9mcm9tLnNwbGl0KFxcXCIkJCRcXFwiKTtcXG4gICAgICAgIC8qbGV0IHBsYXlMYXp5ID0gJChcXFwiXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICBmdW5jdGlvbiBpc29mZmljaWFsKHVybCkge1xcbiAgICAgICAgICAgIGxldCBmbGFnID0gbmV3IFJlZ0V4cCgncXFcXFxcLmNvbXxpcWl5aVxcXFwuY29tfHlvdWt1XFxcXC5jb218bWd0dlxcXFwuY29tfGJpbGliaWxpXFxcXC5jb218c29odVxcXFwuY29tfGl4aWd1YVxcXFwuY29tfHBwdHZcXFxcLmNvbXxtaWd1dmlkZW9cXFxcLmNvbXxsZVxcXFwuY29tfDE5MDVcXFxcLmNvbXxmdW5cXFxcLnR2Jyk7XFxuICAgICAgICAgICAgcmV0dXJuIGZsYWcudGVzdCh1cmwpO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGxldCBkcnB5ID0gR00uZGVmaW5lTW9kdWxlKFxcXCJkcnB5XFxcIiwgXFxcImRycHlcXFwiKTtcXG4gICAgICAgICAgaW5wdXQgPSBpbnB1dC5zcGxpdChcXFwiI1xcXCIpO1xcbiAgICAgICAgICBsZXQgcGxheSA9IEpTT04ucGFyc2UoZHJweS5wbGF5KGlucHV0WzFdLCBpbnB1dFswXS5yZXBsYWNlKFxcXCJ0dmJveC14ZzpcXFwiLCBcXFwiXFxcIiksIFtdKSk7XFxuICAgICAgICAgIGxvZyhwbGF5KVxcbiAgICAgICAgICBsb2coXFxcInBsYXkudXJsXFxcIilcXG4gICAgICAgICAgbGV0IHBhcnNlX29iaiA9IHtcXG4gICAgICAgICAgICBkZWZfcmVnZXg6IFN0cmluZy5yYXdgXFxcXC4obXA0fG0zdTgpfGNuL3Rvc2AsXFxuICAgICAgICAgIH07XFxuXFxuICAgICAgICAgIGlmIChwbGF5LnVybC5pbmNsdWRlcyhcXFwicHJveHk/ZG9cXFwiKSkge1xcbiAgICAgICAgICAgIE1ZX1VSTCA9IHBsYXkudXJsO1xcbiAgICAgICAgICAgIHBsYXkudXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJ1cmxcXFwiLCBcXFwiXFxcIikpO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJodHRwczovL3Bhbi5xdWFyay5jbi9cXFwiKSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFwiICsgcGxheS51cmwgKyBcXFwiJnJ1bGU9dWNra+S6kVxcXCJcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBpZiAocGxheS51cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvJykgfHwgcGxheS51cmwuc3RhcnRzV2l0aChcXFwiaHR0cHM6Ly93d3cuYWxpcGFuLmNvbS9zL1xcXCIpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvYWxpeXVuP3J1bGU95LqR55uY5ZCbLueugCZwYWdlPWZ5cGFnZSZyZWFsdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQocGxheS51cmwpO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGlmIChwbGF5LnBhcnNlID09PSAxKSB7XFxuICAgICAgICAgICAgaWYgKHBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcIm1hZ25ldDpcXFwiKSkge1xcbiAgICAgICAgICAgICAgcmV0dXJuIHBsYXkudXJsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoaXNvZmZpY2lhbChwbGF5LnVybCkpIHtcXG4gICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9tdWxQYXJzZT9ydWxlPemFjee9ruWKqeaJi1xcXCIpLm11bFBhcnNlKHBsYXkudXJsKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ2aWRlbzovL1xcXCIgKyBwbGF5LnVybDtcXG4gICAgICAgICAgfSBlbHNlIGlmIChwbGF5LnBhcnNlID09PSAwKSB7XFxuICAgICAgICAgICAgcmV0dXJuIHBsYXkudXJsO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9KTsqL1xcbiAgICB9XFxuXFxuICAgIGxldCBwbGF5TGF6eSA9ICQoXFxcIlxcXCIpLmxhenlSdWxlKChpZCwgc291cmNlKSA9PiB7XFxuICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJ2aWRlb1VybFxcXCIpLnBhcnNlKGlucHV0LCBpZCwgc291cmNlKTtcXG4gICAgfSwgXFxcImlkXFxcIiwgc291cmNlKTtcXG5cXG5cXG5cXG4gICAgbGV0IHBsYXlVcmxMaXN0ID0gW107XFxuICAgIC8vY29uc29sZS5sb2coaW5mby52b2RfcGxheV91cmwpO1xcbiAgICBsZXQgaXNOb3ZlbD1zdHlwZT09PVxcXCLlsI/or7RcXFwiO1xcbiAgICBsZXQgcGxheXBhZ2VzID0gW107XFxuICAgIGlmIChpbmZvLnZvZF9wbGF5X3VybCAmJiBpbmZvLnZvZF9wbGF5X3VybCAhPSBcXFwiXFxcIikge1xcbiAgICAgICAgbGV0IGNvbCA9IFxcXCJ0ZXh0XzRcXFwiO1xcbiAgICAgICAgbGV0IHRleHRhbGlnbiA9IFxcXCJcXFwiO1xcbiAgICAgICAgcGxheVVybExpc3QgPSBpbmZvLnZvZF9wbGF5X3VybC5zcGxpdChcXFwiJCQkXFxcIikubWFwKCh0LCBpKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGltZyA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgIGxldCB0cyA9IHQuc3BsaXQoXFxcIiNcXFwiKS5tYXAoKGspID0+IGsuc3BsaXQoXFxcIiRcXFwiKVswXSk7XFxuICAgICAgICAgICAgbGV0IHBhZ2VzID0gJC5zcGxpdFBhZ2UodHMubGVuZ3RoKVxcbiAgICAgICAgICAgIGxldCB0YyA9IGNvdW50VG90YWxCeXRlcyhmaW5kTG9uZ2VzdEVsZW1lbnQodHMpKTtcXG4gICAgICAgICAgICBpZiAodHMuZmlsdGVyKGUgPT4gZSAhPSBcXFwiXFxcIikubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgIHBsYXlwYWdlc1tpXSA9IHBhZ2VzO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAodGMgPiAyNCkge1xcbiAgICAgICAgICAgICAgICBjb2wgPSBcXFwidGV4dF8xXFxcIjtcXG4gICAgICAgICAgICAgICAgaW1nID0gXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vbW92aWUvMTQ2LnN2Z1xcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIGlmICh0YyA+PSAxMiAmJiB0YyA8IDE1KSB7XFxuICAgICAgICAgICAgICAgIGNvbCA9IFxcXCJ0ZXh0XzNcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGMgPj0gMTUpIHtcXG4gICAgICAgICAgICAgICAgY29sID0gXFxcInRleHRfMlxcXCI7XFxuICAgICAgICAgICAgICAgIHRleHRhbGlnbiA9IFxcXCJsZWZ0XFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHBsYXlvYmogPSB0LnNwbGl0KFxcXCIjXFxcIikubWFwKChqKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBrID0gai5zcGxpdChcXFwiJFxcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgdCA9IGtbMF07XFxuICAgICAgICAgICAgICAgIGxldCB1aWQgPSAoa1sxXSB8fCBrWzBdKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICAgICAgICAgIHN0aXRsZTogdCxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBmb250c3R5bGUodCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3M6IFxcXCJzbWFsbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICAgICAgc3VybDogdWlkICsgXFxcIiNcXFwiICsgZnJvbVtpXSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogaXNOb3ZlbD9cXFwiaGlrZXI6Ly9wYWdlL25vdmVsI2F1dG9QYWdlIyNyZWFkVGhlbWUjXFxcIjoodWlkICsgXFxcIiNcXFwiICsgZnJvbVtpXSArIHBsYXlMYXp5LnJlcGxhY2UoJ1xcXCJpZFxcXCInLCAnXFxcIicgKyB1aWQgKyAnXFxcIicpKSxcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBjb2wsXFxuICAgICAgICAgICAgICAgICAgICBpbWc6IGltZyxcXG4gICAgICAgICAgICAgICAgICAgIC8qZXh0cmE6IE9iamVjdC5hc3NpZ24oe30sIGV4dHJhLCB7XFxuICAgICAgICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogZGVjb2RlVVJJQ29tcG9uZW50KGtbMV0pLFxcbiAgICAgICAgICAgICAgICAgICAgICBpZDoga1sxXSxcXG4gICAgICAgICAgICAgICAgICAgICAgLy9saW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogdGV4dGFsaWduLFxcbiAgICAgICAgICAgICAgICAgICAgICBjbHM6IFxcXCJwbGF5bGlzdFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICB9KSovXFxuICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb206IGZyb21baV0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHVpZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBibG9ja1J1bGVzOiBbJ2JiLioucG5nJywgJy5qcGcnLCBcXFwiaG1cXFxcLmJhaWR1XFxcXC5jb21cXFxcL2htLmpzXFxcIl0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9FeGNsdWRlUnVsZXM6IFsnP3VybD0nXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiB0ZXh0YWxpZ24sXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xzOiBcXFwicGxheWxpc3RcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgICAgIGlmIChzdHlwZSA9PSBcXFwi5ryr55S7XFxcIiB8fCBzdHlwZSA9PSBcXFwi5bCP6K+0XFxcIikge1xcblxcbiAgICAgICAgICAgICAgICB2YXIgZG93bmxvYWRsYXp5ID0gJC50b1N0cmluZygoa2V5LCBza2V5LCB0aXRsZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBHTVxcbiAgICAgICAgICAgICAgICAgICAgfSA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NjkxNiZhdXRoPTFkMzVlOGYwLTIyZTgtNTI3MC1hOWQxLTgyNmY1M2YxNzdhZFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgR00uc2V0U2VsZktleShrZXkpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiLFxcXCJEcnB5TWFuYWdlP3J1bGU9XFxcIit0aXRsZSk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgZHJweSA9IERycHlNYW5hZ2UuZ2V0KHNrZXkpO1xcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5zcGxpdChcXFwiI1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UoZHJweS5wbGF5KGlucHV0WzFdLCBpbnB1dFswXSkpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC51cmwuc3RhcnRzV2l0aChcXFwicGljczovL1xcXCIpKSByZXR1cm4gcmVzdWx0LnVybDtcXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC51cmwuc3RhcnRzV2l0aChcXFwibm92ZWw6Ly9cXFwiKSkgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0LnVybC5yZXBsYWNlKFxcXCJub3ZlbDovL1xcXCIsIFxcXCJcXFwiKSkuY29udGVudDtcXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi5ryr55S75oiW5q2j5paH6I635Y+W5aSx6LSlXFxcIik7XFxuICAgICAgICAgICAgICAgIH0sIEdNLmdldFNlbGZLZXkoKSwgTVlfUEFSQU1TLnNrZXksIE1ZX1JVTEUudGl0bGUpO1xcblxcbiAgICAgICAgICAgICAgICBsZXQgY2hhcHRlckxpc3QgPSBwbGF5b2JqLmV4Y2x1ZGVLZXlzKFtcXFwic3VybFxcXCIsIFxcXCJzdGl0bGVcXFwiXSwgZmFsc2UpLnRyYW5zZm9ybUtleXMoe1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInN1cmxcXFwiOiBcXFwidXJsXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJzdGl0bGVcXFwiOiBcXFwidGl0bGVcXFwiXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL2RyX2Rvd19saXN0Lmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShjaGFwdGVyTGlzdCkpO1xcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLkuIvovb1cXFwiICsgc3R5cGUsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6ICdoaWtlcjovL3BhZ2UvZG93bmxvYWQudmlldyNub1JlY29yZEhpc3RvcnkjI25vUmVmcmVzaCM/cnVsZT3mnKzlnLDotYTmupDnrqHnkIYnLFxcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhcHRlckxpc3Q6IFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS9kcl9kb3dfbGlzdC5qc29uXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmZvOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2tOYW1lOiBpbmZvLnZvZF9uYW1lLCAvL+a8q+eUu+WQjeensCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU5hbWU6IE1ZX1JVTEUudGl0bGUgLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29rVG9wUGljOiBpbmZvLnZvZF9waWMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlQ29kZTogZG93bmxvYWRsYXp5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29rSWQ6IE1ZX1BBUkFNUy5zbmFtZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogc3R5cGUgPT09IFxcXCLmvKvnlLtcXFwiID8gXFxcImNvbWljXFxcIiA6IFxcXCJub3ZlbFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmlldzogXFxcIjFcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLmnKzlnLDkuabmnrZcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9wYWdlL0Jvb2tyYWNrLnZpZXcjbm9SZWNvcmRIaXN0b3J5Iz9ydWxlPeacrOWcsOi1hOa6kOeuoeeQhiZydWxlTmFtZT0nICsgTVlfUlVMRS50aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHN0eXBlID09PSBcXFwi5ryr55S7XFxcIiA/IFxcXCJjb21pY1xcXCIgOiBcXFwibm92ZWxcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ2JsYW5rX2Jsb2NrJ1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgcGxheW9iaiA9ICQuc3BsaXRBcnJheUJ5UmFuZ2VzKHBsYXlvYmosIHBhZ2VzKTtcXG4gICAgICAgICAgICByZXR1cm4gcGxheW9iajtcXG4gICAgICAgIH0pO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxuICAgICAgICB9LCB7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLmmoLml6Dmkq3mlL7mupDmiJbmkq3mlL7liJfooajlrprkvY3plJnor69cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBNWV9QQVJBTVMudm9kSWQsXFxuICAgICAgICB9KTtcXG4gICAgICAgIGNhY2hlU2hvd1RpcHMoKTtcXG4gICAgICAgIHNldFJlc3VsdChkKTtcXG4gICAgfVxcblxcblxcbiAgICBsZXQgY3VycmVudExvY2F0aW9uID0gMDtcXG5cXG4gICAgZnVuY3Rpb24gcmVub3ZhdGVMaXN0KGxvY2F0aW9uKSB7XFxuICAgICAgICAvL2RlbGV0ZUl0ZW1CeUNscyhcXFwicGxheXBhZ2VcXFwiKTtcXG4gICAgICAgIGRlbGV0ZUl0ZW1CeUNscyhcXFwicGxheWxpc3RcXFwiKTtcXG4gICAgICAgIGlmIChwbGF5VXJsTGlzdC5sZW5ndGggPT0gMCkge1xcbiAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBwYWdlbnVtID0gZ2V0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgbGV0IHBjb3VudCA9IHBsYXlVcmxMaXN0W2xvY2F0aW9uXS5sZW5ndGg7XFxuICAgICAgICBsZXQgbGlzdCA9IHBsYXlVcmxMaXN0W2xvY2F0aW9uXVtwYWdlbnVtXTtcXG4gICAgICAgIGlmICghbGlzdCkge1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwYWdlbnVtOyBpID49IDA7IGktLSkge1xcbiAgICAgICAgICAgICAgICBsaXN0ID0gcGxheVVybExpc3RbbG9jYXRpb25dW2ldO1xcbiAgICAgICAgICAgICAgICBpZiAobGlzdCkge1xcbiAgICAgICAgICAgICAgICAgICAgcGFnZW51bSA9IGk7XFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChnZXRNeVZhcihcXFwic29ydGlcXFwiLCBcXFwiMFxcXCIpID09IDEpIHtcXG4gICAgICAgICAgICBsaXN0LnJldmVyc2UoKTtcXG4gICAgICAgIH1cXG4gICAgICAgICQuZXh0ZW5kKHtcXG4gICAgICAgICAgICB0ZW1wX2xpc3Q6IHBsYXlVcmxMaXN0W2xvY2F0aW9uXSxcXG4gICAgICAgIH0pXFxuICAgICAgICBsZXQgcGxheXAgPSBwbGF5cGFnZXNbbG9jYXRpb25dO1xcblxcbiAgICAgICAgaWYgKHBsYXlwICYmIHBsYXlwLmxlbmd0aCA+IDEpIHtcXG4gICAgICAgICAgICBsZXQgdGVtcCA9IHtcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzEnLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBcXFwicGxheXBhZ2VcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHBhZ2VhcnIgPSBwbGF5cC5tYXAoKHgsIGkpID0+IGkgPT0gcGFnZW51bSA/ICfigJzigJzigJ3igJ0nICsgeC5mb250Y29sb3IoXFxcInJlZFxcXCIpIDogeCk7XFxuICAgICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKFxcXCJwbGF5cGFnZVxcXCIpXFxuICAgICAgICAgICAgYWRkSXRlbUFmdGVyKFxcXCJwbGF5cGFnZWxpbmVcXFwiLCBbe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+S4iuS4gOmhtScsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF80XFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChsb2NhdGlvbiwgcGNvdW50KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZW51bSA9IGdldE15VmFyKFxcXCJwYWdlbnVtXFxcIiwgXFxcIjBcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYWdlbnVtID09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlbnVtID0gcGNvdW50IC0gMTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZW51bS0tO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBTdHJpbmcocGFnZW51bSkpO1xcbiAgICAgICAgICAgICAgICAgICAgR00uZ2V0KFxcXCJyZW5vdmF0ZUxpc3RcXFwiLCAoKSA9PiB7fSkobG9jYXRpb24pO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgICAgfSwgbG9jYXRpb24sIHBjb3VudCksXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBjbHM6IFxcXCJwbGF5cGFnZVxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHBsYXlwW3BhZ2VudW1dLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogJChwYWdlYXJyLCAzKS5zZWxlY3QoKGxvY2F0aW9uKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFN0cmluZyhNWV9JTkRFWCkpO1xcbiAgICAgICAgICAgICAgICAgICAgR00uZ2V0KFxcXCJyZW5vdmF0ZUxpc3RcXFwiLCAoKSA9PiB7fSkobG9jYXRpb24pO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICAgICB9LCBsb2NhdGlvbiksXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBjbHM6IFxcXCJwbGF5cGFnZVxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICfkuIvkuIDpobUnLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfNFxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgobG9jYXRpb24sIHBjb3VudCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2VudW0gPSBnZXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBpZiAocGFnZW51bSA+PSBwY291bnQgLSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZW51bSA9IDA7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VudW0rKztcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwYWdlbnVtXFxcIiwgU3RyaW5nKHBhZ2VudW0pKTtcXG4gICAgICAgICAgICAgICAgICAgIEdNLmdldChcXFwicmVub3ZhdGVMaXN0XFxcIiwgKCkgPT4ge30pKGxvY2F0aW9uKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIGxvY2F0aW9uLCBwY291bnQpLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBcXFwicGxheXBhZ2VcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XSlcXG4gICAgICAgICAgICAvKnBsYXlwID0gcGxheXAubWFwKCh4LCBpKSA9PiB7XFxuICAgICAgICAgICAgICAgbGV0IG9iaiA9IE9iamVjdC5hc3NpZ24oe30sIHRlbXAsIHtcXG4gICAgICAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIChwYWdlbnVtID09IGkgPyB4LmZvbnRjb2xvcihcXFwicmVkXFxcIikgOiB4KSxcXG4gICAgICAgICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TXlWYXIoXFxcInBhZ2VudW1cXFwiKSA9PSBpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwYWdlbnVtXFxcIiwgU3RyaW5nKGkpKTtcXG4gICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKFxcXCJwbGF5bGlzdFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICBhZGRJdGVtQWZ0ZXIoXFxcInBsYXlsaXN0c1xcXCIsICQudGVtcF9saXN0W2ldKTtcXG4gICAgICAgICAgICAgICAgICAgZmluZEl0ZW1zQnlDbHMoXFxcInBsYXlwYWdlXFxcIikuZm9yRWFjaCgoeCwgaWkpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSB4LnRpdGxlLnJlcGxhY2UoL+KAmHzigJl84oCcfOKAnXw8W14+XSs+L2csIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICBpZiAoaWkgPT0gaSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAn4oCc4oCc4oCd4oCdJyArIHRpdGxlLmZvbnRjb2xvcihcXFwicmVkXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oeC5leHRyYS5pZCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgICB9LCBpKSxcXG4gICAgICAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHt9LCB0ZW1wLmV4dHJhLCB7XFxuICAgICAgICAgICAgICAgICAgIGlkOiBcXFwicGFnZW51bVxcXCIgKyBpLFxcbiAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgIHJldHVybiBvYmo7XFxuICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgIGFkZEl0ZW1BZnRlcihcXFwicGxheXBhZ2VsaW5lXFxcIiwgcGxheXApKi9cXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChsaXN0KSB7XFxuICAgICAgICAgICAgYWRkSXRlbUFmdGVyKFxcXCJwbGF5bGlzdHNcXFwiLCBsaXN0KTtcXG4gICAgICAgIH1cXG4gICAgICAgIHVwZGF0ZUl0ZW0oXFxcImxvY2F0aW9uQFxcXCIgKyBjdXJyZW50TG9jYXRpb24sIHtcXG4gICAgICAgICAgICB0aXRsZTogZnJvbVtjdXJyZW50TG9jYXRpb25dLFxcbiAgICAgICAgfSk7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJsb2NhdGlvbkBcXFwiICsgbG9jYXRpb24sIHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnFxcXCIgKyBmcm9tW2xvY2F0aW9uXSArIFxcXCLigJ3igJ1cXFwiLFxcbiAgICAgICAgfSk7XFxuICAgICAgICBjdXJyZW50TG9jYXRpb24gPSBsb2NhdGlvbjtcXG4gICAgfVxcblxcbiAgICBHTS5wdXQoXFxcInJlbm92YXRlTGlzdFxcXCIsIHJlbm92YXRlTGlzdCk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImJpZ19ibGFua19ibG9ja1xcXCJcXG4gICAgfSk7XFxuICAgIGlmIChmcm9tLmxlbmd0aCkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImJpZ19ibGFua19ibG9ja1xcXCIsXFxuICAgICAgICB9KVxcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogc29ydG9ialtzb3J0aV0sXFxuICAgICAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChzbykgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgc2kgPSBnZXRNeVZhcihcXFwic29ydGlcXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgaWkgPSAoc2kgPT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbShcXFwiQHNvcnRcXFwiLCB7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogc29baWldXFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgIHZhciBwbGF5cyA9IGZpbmRJdGVtc0J5Q2xzKFxcXCJwbGF5bGlzdFxcXCIpLnJldmVyc2UoKS5tYXAoeCA9PiB7XFxuICAgICAgICAgICAgICAgICAgICB4LmNvbF90eXBlID0geC50eXBlO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBkZWxldGVJdGVtQnlDbHMoXFxcInBsYXlsaXN0XFxcIik7XFxuICAgICAgICAgICAgICAgIGFkZEl0ZW1BZnRlcihcXFwicGxheWxpc3RzXFxcIiwgcGxheXMpO1xcblxcbiAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwic29ydGlcXFwiLCBpaSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgfSwgc29ydG9iaiksXFxuICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogXFxcIkBzb3J0XFxcIixcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KVxcbiAgICAgICAgZm9yIChsZXQgaSBpbiBmcm9tKSB7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGZyb21baV0sXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaSwgaWQpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChnZXRNeVZhcihpZCArIFxcXCJzb3VyY2VpXFxcIiwgXFxcIjBcXFwiKSA9PSBpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKGlkICsgXFxcInNvdXJjZWlcXFwiLCBTdHJpbmcoaSkpO1xcbiAgICAgICAgICAgICAgICAgICAgR00uZ2V0KFxcXCJyZW5vdmF0ZUxpc3RcXFwiLCAoKSA9PiB7fSkoaSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICB9LCBpLCBpZCksXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogXFxcImxvY2F0aW9uQFxcXCIgKyBpXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICAvL2NvbnNvbGUubG9nKHBsYXlVcmxMaXN0KTtcXG4gICAgLyppZiAocGxheVVybExpc3QubGVuZ3RoKSB7XFxuICAgICAgdmFyIGVqb2JqID0ge1xcbiAgICAgICAgXFxcImxpc3RcXFwiOiBwbGF5VXJsTGlzdCxcXG4gICAgICAgIFxcXCJ0YWJcXFwiOiBmcm9tLm1hcCgoeCwgaSkgPT4gZnJvbVtpXSlcXG4gICAgICB9O1xcbiAgICAgIOWIneWni+WMlihkLCBlam9iailcXG4gICAgfSBlbHNlIHtcXG4gICAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLmmoLml6Dmkq3mlL7mupBcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbiAgICAgICAgdXJsOiBNWV9QQVJBTVMudm9kSWQsXFxuICAgICAgfSk7XFxuICAgIH0qL1xcblxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBcXFwicGxheXBhZ2VsaW5lXFxcIlxcbiAgICAgICAgfVxcbiAgICB9KVxcblxcblxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IFxcXCJwbGF5bGlzdHNcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcblxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBcXFwicGxheWxpc3RzRU5EXFxcIlxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgY2FjaGVTaG93VGlwcygpO1xcbiAgICBzZXRSZXN1bHQoZCk7XFxuICAgIHJlbm92YXRlTGlzdChnZXRNeVZhcihpZCArIFxcXCJzb3VyY2VpXFxcIiwgXFxcIjBcXFwiKSk7XFxufSkoKVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Kej5p6Q5paH5Lu2XCIsXCJwYXRoXCI6XCJjb25maWdzXCIsXCJydWxlXCI6XCJjb25zdCBwYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvTG95RGdJay9wYXJzZXMuanNvblxcXCI7XFxubGV0IGRhdGE7XFxuXFxuZnVuY3Rpb24gZ2V0SnNvbigpIHtcXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcXG4gICAgICAgIHJldHVybiBkYXRhO1xcbiAgICB9XFxuICAgIHRyeSB7XFxuICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShyZWFkRmlsZShwYXRoKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgZGVsZXRlRmlsZShwYXRoKTtcXG4gICAgICAgIGRhdGEgPSBbXTtcXG4gICAgfVxcbiAgICByZXR1cm4gZGF0YTtcXG59XFxuXFxuZnVuY3Rpb24gc2F2ZUpzb24oanNvbikge1xcbiAgICBzYXZlRmlsZShwYXRoLCBKU09OLnN0cmluZ2lmeShqc29uKSk7XFxufVxcblxcbmZ1bmN0aW9uIGdldFVzZWZ1bEpzb24oKSB7XFxuICAgIHJldHVybiBnZXRKc29uKCkuZmlsdGVyKHYgPT4gIXYuZm9yYmlkZGVuKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0Rm9yYmlkZGVuSnNvbigpIHtcXG4gICAgcmV0dXJuIGdldEpzb24oKS5maWx0ZXIodiA9PiB2LmZvcmJpZGRlbik7XFxufVxcblxcbiQuZXhwb3J0cyA9IHtcXG4gICAgZ2V0SnNvbixcXG4gICAgc2F2ZUpzb24sXFxuICAgIGdldFVzZWZ1bEpzb24sXFxuICAgIGdldEZvcmJpZGRlbkpzb24sXFxuICAgIHBhdGgsXFxufTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuino+aekOeuoeeQhlwiLFwicGF0aFwiOlwicnVsZU1hbmFnZVwiLFwicnVsZVwiOlwianM6XFxudmFyIGQgPSBbXTtcXG5zZXRQYWdlVGl0bGUoXFxcIuino+aekOeuoeeQhlxcXCIpO1xcbmxldCBjb25maWdzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIik7XFxubGV0IGFyciA9IGNvbmZpZ3MuZ2V0SnNvbigpO1xcbmxldCBsZW5ndGggPSBhcnIubGVuZ3RoO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5paw5aKeXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVFZGl0I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9kb21haW5fY29uZmlnXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHBhZ2VUaXRsZTogXFxcIuaWsOWinuino+aekFxcXCJcXG4gICAgfVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5YiG5LqrXFxcIixcXG4gICAgdXJsOiAkKFxcXCItMVxcXCIsIFxcXCLovpPlhaXkvaDopoHliIbkuqvop6PmnpDnmoTluo/lj7dcXFxcbi0x5YWo6YOo77yMLTLlt7LlkK/nlKjnmoTvvIwtM+W3suemgeeUqOeahFxcXCIpLmlucHV0KChsZW5ndGgpID0+IHtcXG4gICAgICAgIGxldCBpbmRleGMgPSBpbnB1dC5zcGxpdCgvLHzvvIwvKTtcXG4gICAgICAgIGxldCBpbmRleHMgPSBbXTtcXG4gICAgICAgIGxldCBtbyA9IHBhcnNlSW50KGluZGV4Y1swXSk7XFxuICAgICAgICBpZiAoIShpbmRleGMubGVuZ3RoICE9PSAwICYmIG1vIDwgMCAmJiBtbyA+IC01KSkge1xcbiAgICAgICAgICAgIGZvciAobGV0IGl0IG9mIGluZGV4Yykge1xcbiAgICAgICAgICAgICAgICBsZXQgbnVtID0gcGFyc2VJbnQoaXQpO1xcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKG51bSkgfHwgbnVtID49IGxlbmd0aCB8fCBudW0gPCAwKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pWw5a2X5LiN5ZCI5rOVXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpbmRleHMucHVzaChudW0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiAkKFtcXFwiSElLRVJcXFwiLCBcXFwiVFhUXFxcIl0uY29uY2F0KGdldFBhc3RlcygpKSwgMiwgXFxcIuWIhuS6q+aWueW8j1xcXCIpLnNlbGVjdCgobW8sIGluZGV4cywgZXh0KSA9PiB7XFxuICAgICAgICAgICAgZnVuY3Rpb24gdXAocnVsZXMpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGViNjQgPSBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkocnVsZXMpKTtcXG4gICAgICAgICAgICAgICAgbGV0IGdldFBhc3MgPSAobGVuZ3RoLCBydWxlLCB0eXBlKSA9PiBcXFwi5rW36ZiU6KeG55WM77yMRFJQWeino+aekO+8jOWFseOAjFxcXCIgKyBsZW5ndGggKyBcXFwi44CN5p2h77yM5aSN5Yi25pW05p2h5Y+j5Luk5omT5byA6L2v5Lu25bCx5Lya6Ieq5Yqo5a+85YWlJFxcXCIgKyBydWxlICsgXFxcIiRcXFwiICsgdHlwZSArIFxcXCJAaW1wb3J0PWpzOiQucmVxdWlyZSgnaW1wb3J0P3J1bGU9JytcXFwiICsgSlNPTi5zdHJpbmdpZnkoTVlfUlVMRS50aXRsZSkgKyBcXFwiKShpbnB1dClcXFwiO1xcbiAgICAgICAgICAgICAgICBpZiAoZ2V0UGFzdGVzKCkuaW5jbHVkZXMoaW5wdXQpKSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IHNoYXJlUGFzdGUocnVsZWI2NCwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIGdldFBhc3MocnVsZXMubGVuZ3RoLCB1LCBcXFwiYlxcXCIpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9Mb3lEZ0lrL3NoYXJlL2RycHnop6PmnpDjgIxcXFwiICsgcnVsZXMubGVuZ3RoICsgXFxcIuOAjeadoS5cXFwiICsgKGlucHV0ID09PSBcXFwiSElLRVJcXFwiID8gXFxcImhpa2VyXFxcIiA6IFxcXCJ0eHRcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZShwYXRoLCBnZXRQYXNzKHJ1bGVzLmxlbmd0aCwgcnVsZWI2NCwgXFxcImFcXFwiKSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInNoYXJlOi8vXFxcIiArIHBhdGg7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHJ1bGVzO1xcbiAgICAgICAgICAgIGlmIChtbyA9PT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgcnVsZXMgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChtbyA9PT0gLTIpIHtcXG4gICAgICAgICAgICAgICAgcnVsZXMgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRVc2VmdWxKc29uKCk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChtbyA9PT0gLTMpIHtcXG4gICAgICAgICAgICAgICAgcnVsZXMgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRGb3JiaWRkZW5Kc29uKCk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcnVsZXMgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCkuZmlsdGVyKCh2LCBpKSA9PiBpbmRleHMuaW5jbHVkZXMoaSkpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBydWxlcyA9IHJ1bGVzLm1hcCgodikgPT4ge1xcbiAgICAgICAgICAgICAgICB2LmZvcmJpZGRlbiA9IHVuZGVmaW5lZDtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHY7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHVwKHJ1bGVzKTtcXG4gICAgICAgIH0sIG1vLCBpbmRleHMsIGluZGV4Y1sxXSk7XFxuXFxuICAgIH0sIGxlbmd0aCksXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fc2hhcmVfZ3JlZW5cXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLph43nva5cXFwiLFxcbiAgICB1cmw6ICQoXFxcIuS9oOehruWumumHjee9ru+8n1xcXFxu6K+l5pON5L2c5Lya5Yig6Zmk546w5pyJ6Kej5p6Q77yM5oGi5aSN6Ieq5bim6Kej5p6Q44CCXFxcIikuY29uZmlybSgocGF0aCkgPT4ge1xcbiAgICAgICAgZGVsZXRlRmlsZShwYXRoKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnBhdGgpLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX3JlZnJlc2hcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmuIXnqbpcXFwiLFxcbiAgICB1cmw6ICQoXFxcIuS9oOehruWumuWFqOmDqOWIoOmZpO+8n1xcXFxu6K+l5pON5L2c5Lya5Yig6Zmk546w5pyJ6Kej5p6Q44CCXFxcIikuY29uZmlybSgocGF0aCkgPT4ge1xcbiAgICAgICAgd3JpdGVGaWxlKHBhdGgsIFxcXCJbXVxcXCIpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikucGF0aCksXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fY29kZV92aWV3XFxcIlxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIC8vdGl0bGU6ICc8Zm9udCBjb2xvcj1cXFwiIzEzQjYxQlxcXCI+4paQIDwvZm9udD48Yj7op6PmnpDliJfooag8Yj4gKCcgKyBTdHJpbmcobGVuZ3RoKS5mb250Y29sb3IoXFxcIiNmZjY2MDFcXFwiKSArIFxcXCIpXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbn0pO1xcbmxldCBjb3VudFRpdGxlID0gZC5hdCgtMSk7XFxuXFxuXFxubGV0IGNvdW50ID0gZC5sZW5ndGg7XFxuXFxuZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xcbiAgICBsZXQgaXQgPSBhcnJbaV07XFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnVsnICsgaSArICddPGI+ICAnICsgaXQubmFtZSArIChpdC5mb3JiaWRkZW4gPyBcXFwiICPigJzigJznpoHnlKjigJ3igJ1cXFwiLnNtYWxsKCkgOiBcXFwiXFxcIiksXFxuICAgICAgICBkZXNjOiBpdC51cmwsXFxuICAgICAgICB1cmw6ICQoW1xcXCLnvJbovpFcXFwiLCBcXFwi5YiG5LqrXFxcIiwgXFxcIuemgeeUqC/lkK/nlKhcXFwiLCBcXFwi56e75YqoXFxcIiwgXFxcIue9rumhtlxcXCIsIFxcXCLliKDpmaRcXFwiXSwgMSwgXFxcIuaTjeS9nO+8mlxcXCIgKyBpdC5uYW1lKS5zZWxlY3QoKGluZGV4LCBsZW5ndGgpID0+IHtcXG4gICAgICAgICAgICBpZiAoaW5wdXQgPT09IFxcXCLnvJbovpFcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVFZGl0I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5YiG5LqrXFxcIikge1xcbiAgICAgICAgICAgICAgICBsZXQgb3BzID0gZ2V0UGFzdGVzKCk7XFxuICAgICAgICAgICAgICAgIG9wcy51bnNoaWZ0KFxcXCLlrozmlbTlj6Pku6RcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQob3BzLCAyLCBcXFwi5YiG5Lqr5pa55byPXFxcIikuc2VsZWN0KChpbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKClbaW5kZXhdO1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZS51c2VyID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZS5mb3JiaWRkZW4gPSB1bmRlZmluZWQ7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZWI2NCA9IGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShydWxlKSk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgZ2V0UGFzcyA9IChuYW1lLCBydWxlLCB0eXBlKSA9PiBcXFwi5rW36ZiU6KeG55WM77yM44CMXFxcIiArIG5hbWUgKyBcXFwi44CNRFJQWeino+aekO+8jOWkjeWItuaVtOadoeWPo+S7pOaJk+W8gOi9r+S7tuWwseS8muiHquWKqOWvvOWFpSRcXFwiICsgcnVsZSArIFxcXCIkXFxcIiArIHR5cGUgKyBcXFwiQGltcG9ydD1qczokLnJlcXVpcmUoJ2ltcG9ydD9ydWxlPScrXFxcIiArIEpTT04uc3RyaW5naWZ5KE1ZX1JVTEUudGl0bGUpICsgXFxcIikoaW5wdXQpXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PSBcXFwi5a6M5pW05Y+j5LukXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBnZXRQYXNzKHJ1bGUubmFtZSwgcnVsZWI2NCwgXFxcImFcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBzaGFyZVBhc3RlKHJ1bGViNjQsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgZ2V0UGFzcyhydWxlLm5hbWUsIHUsIFxcXCJiXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0sIGluZGV4KTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi56e75YqoXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChpbmRleCArIFxcXCJcXFwiLCBcXFwi6L6T5YWl5L2N572uXFxcIikuaW5wdXQoKGluZGV4LCBsZW5ndGgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdJbmRleCA9IE51bWJlcihpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKG5ld0luZGV4KSB8fCBuZXdJbmRleCA+PSBsZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LiN5ZKM6KeE55qE5L2N572uXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gcnVsZXMuc3BsaWNlKGluZGV4LCAxKVswXTtcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVzLnNwbGljZShuZXdJbmRleCwgMCwgcnVsZSk7XFxuICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihydWxlcyk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIH0sIGluZGV4LCBsZW5ndGgpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLnva7pobZcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGxldCBuZXdJbmRleCA9IDA7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBydWxlcy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xcbiAgICAgICAgICAgICAgICBydWxlcy5zcGxpY2UobmV3SW5kZXgsIDAsIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihydWxlcyk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5Yig6ZmkXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChcXFwi56Gu6K6k5Yig6Zmk77yfXFxcIikuY29uZmlybSgoaW5kZXgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gcnVsZXMuc3BsaWNlKGluZGV4LCAxKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKHJ1bGVzKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LliKDpmaRcXFwiICsgcnVsZS5uYW1lO1xcbiAgICAgICAgICAgICAgICB9LCBpbmRleCk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBhcnJbaW5kZXhdO1xcbiAgICAgICAgICAgICAgICBydWxlLmZvcmJpZGRlbiA9ICFydWxlLmZvcmJpZGRlbjtcXG4gICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24oYXJyKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAvL3JldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgKHJ1bGUuZm9yYmlkZGVuID8gXFxcIuemgeeUqFxcXCIgOiBcXFwi5ZCv55SoXFxcIikgKyBydWxlLm5hbWU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgaSwgbGVuZ3RoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaTogaSxcXG4gICAgICAgICAgICBwYWdlVGl0bGU6IGl0Lm5hbWVcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufVxcbmNvdW50VGl0bGUudGl0bGUgPSAnPGZvbnQgY29sb3I9XFxcIiMxM0I2MUJcXFwiPuKWkCA8L2ZvbnQ+PGI+6Kej5p6Q5YiX6KGoPGI+ICgnICsgKChkLmxlbmd0aCAtIGNvdW50KSArIFxcXCIvXFxcIiArIGxlbmd0aCkuZm9udGNvbG9yKFxcXCIjZmY2NjAxXFxcIikgKyBcXFwiKVxcXCI7XFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Kej5p6Q57yW6L6RXCIsXCJwYXRoXCI6XCJydWxlRWRpdFwiLFwicnVsZVwiOlwianM6XFxudmFyIGQgPSBbXTtcXG5cXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19uYW1lXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX3VybFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19mbGFnXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX2hlYWRlcnNcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfbWV0aG9kXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX3J1blR5cGVcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfanNvblBhdGhcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfanNcXFwiKTtcXG59KSk7XFxubGV0IHVybEluZGV4ID0gcGFyc2VJbnQoZ2V0UGFyYW0oXFxcImluZGV4XFxcIiwgXFxcIlxcXCIpKTtcXG51cmxJbmRleCA9IE51bWJlci5pc05hTih1cmxJbmRleCkgPyB2b2lkKDApIDogdXJsSW5kZXg7XFxubGV0IGluZGV4ID0gdm9pZCgwKSA9PT0gdXJsSW5kZXggPyBNWV9QQVJBTVMuaSA6IHVybEluZGV4O1xcbmxldCBpc0ltcG9ydCA9ICEhZ2V0UGFyYW0oXFxcImlzSW1wb3J0XFxcIiwgXFxcIlxcXCIpO1xcbmxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxubGV0IG9iajtcXG5pZiAoaXNJbXBvcnQpIHtcXG4gICAgdHJ5IHtcXG4gICAgICAgIG9iaiA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9maWxlcy9fY2FjaGUvamlleGlTaW1wbGVJbXBvcnQuanNvblxcXCIpO1xcbiAgICAgICAgbGV0IHRpcCA9IGluZGV4ICE9PSB2b2lkKDApID8gXFxcIuabtOaWsOino+aekFxcXCIgOiBcXFwi5a+85YWl6Kej5p6QXFxcIjtcXG4gICAgICAgIHNldFBhZ2VUaXRsZSh0aXAgKyBcXFwiOlxcXCIgKyBvYmoubmFtZSk7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCY4oCYXFxcIiArIHRpcCArIFxcXCLigJnigJlcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuXFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIG9iaiA9IHt9O1xcbiAgICAgICAgYmFjaygpO1xcbiAgICAgICAgdG9hc3QoXFxcIuWvvOWFpemUmeivr1xcXCIpO1xcbiAgICB9XFxufSBlbHNlIGlmIChpbmRleCAhPT0gdm9pZCgwKSkge1xcbiAgICBvYmogPSBhcnJbaW5kZXhdO1xcbiAgICBzZXRQYWdlVGl0bGUoXFxcIue8lui+keino+aekDpcXFwiICsgb2JqLm5hbWUpO1xcbn0gZWxzZSB7XFxuICAgIG9iaiA9IHtcXG4gICAgICAgIHJ1blR5cGU6IFxcXCJXRUJcXFwiLFxcbiAgICAgICAgbWV0aG9kOiBcXFwiR0VUXFxcIlxcbiAgICB9O1xcbiAgICBzZXRQYWdlVGl0bGUoXFxcIuaWsOW7uuino+aekFxcXCIpO1xcbn1cXG5cXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuWQjeWtlyjlv4XloaspXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfbmFtZVxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBvYmoubmFtZSxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2VcXG4gICAgfVxcbn0pO1xcblxcblxcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi6Kej5p6QdXJsKOW/heWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc191cmxcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLnVybCxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcImZsYWco5b+F5aGrKVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0OiAyLFxcbiAgICAgICAgaGlnaGxpZ2h0OiB0cnVlLFxcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19mbGFnXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXCJwc19mbGFnXFxcIixvYmouZmxhZ3x8XFxcInFpeWl8aW1nb3zniLHlpYfoibp85aWH6Im6fHFxfHFxIOmihOWRiuWPiuiKsee1rnzohb7orq98eW91a3V85LyY6YW3fHBwdHZ8UFBUVnxsZXR2fOS5kOinhnxsZXNoaXxtZ3R2fOiKkuaenHxzb2h1fHhpZ3VhfGZ1bnzpo47ooYxcXFwiKSxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcImhlYWRlcnMo6YCJ5aGrKVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0OiAyLFxcbiAgICAgICAgaGlnaGxpZ2h0OiB0cnVlLFxcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19oZWFkZXJzXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5oZWFkZXJzLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgfVxcbn0pO1xcblxcbnB1dE15VmFyKFxcXCJwc19ydW5UeXBlXFxcIiwgb2JqLnJ1blR5cGUgfHwgXFxcIlxcXCIpO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6Kej5p6Q5qih5byP77yaXFxcIiArIChvYmoucnVuVHlwZSB8fCBcXFwiV0VCXFxcIiksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogJChbXFxcIldFQlxcXCIsIFxcXCJKU09OXFxcIiwgXFxcIkpTXFxcIl0pLnNlbGVjdCgoKSA9PiB7XFxuXFxuICAgICAgICBwdXRNeVZhcihcXFwicHNfcnVuVHlwZVxcXCIsIGlucHV0KTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oXFxcInBzX3J1blR5cGVcXFwiLCB7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLop6PmnpDmqKHlvI/vvJpcXFwiICsgaW5wdXRcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSksXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogXFxcInBzX3J1blR5cGVcXFwiLFxcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgIH1cXG59KTtcXG5cXG5cXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCJqc29uUGF0aChKU09O6Kej5p6Q5qih5byP5b+F5aGrKVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX2pzb25QYXRoXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5qc29uUGF0aCxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgIH1cXG59KTtcXG5wdXRNeVZhcihcXFwicHNfbWV0aG9kXFxcIiwgb2JqLm1ldGhvZCB8fCBcXFwiXFxcIik7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCJKU09O6K+35rGC5qih5byP77yaXFxcIiArIChvYmoubWV0aG9kIHx8IFxcXCJHRVRcXFwiKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6ICQoW1xcXCJHRVRcXFwiLCBcXFwiUE9TVFxcXCJdKS5zZWxlY3QoKCkgPT4ge1xcblxcbiAgICAgICAgcHV0TXlWYXIoXFxcInBzX21ldGhvZFxcXCIsIGlucHV0KTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oXFxcInBzX21ldGhvZFxcXCIsIHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIkpTT07or7fmsYLmqKHlvI/vvJpcXFwiICsgaW5wdXRcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSksXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogXFxcInBzX21ldGhvZFxcXCIsXFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcImpzKEpT5qih5byP5b+F5aGrKVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0OiAzLFxcbiAgICAgICAgaGlnaGxpZ2h0OiB0cnVlLFxcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19qc1xcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBvYmouanMsXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5Yig6ZmkXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpbmRleCwgdXJsSW5kZXgpID0+IHtcXG4gICAgICAgIGlmIChpbmRleCA9PT0gdm9pZCgwKSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mraTpobnml6Dms5XliKDpmaRcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHVybEluZGV4ICE9PSB2b2lkKDApKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ato+WcqOabtOaWsOino+aekO+8jOWIoOmZpOivt+S7juino+aekOeuoeeQhui/m+WFpVxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBjb25maXJtKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIua4qemmqOaPkOekulxcXCIsXFxuICAgICAgICAgICAgY29udGVudDogXFxcIuehruWumuimgeWIoOmZpOatpOino+aekOWQl++8n+azqOaEj+WIoOmZpOWQjuaXoOazleaBouWkjVxcXCIsXFxuICAgICAgICAgICAgY29uZmlybTogJC50b1N0cmluZygoaW5kZXgpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgYXJyLnNwbGljZShpbmRleCwgMSk7XFxuICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKGFycik7XFxuICAgICAgICAgICAgICAgIGJhY2sodHJ1ZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFwiO1xcbiAgICAgICAgICAgIH0sIGluZGV4KVxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgIH0sIGluZGV4LCB1cmxJbmRleCksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIixcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIua1i+ivlVxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBsZXQgdGVzdEtleXdvcmQgPSBnZXRJdGVtKFxcXCJ0ZXN0VXJsXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgcmV0dXJuICQodGVzdEtleXdvcmQsIFxcXCLor7fovpPlhaXlvbHop4bnvZHnq5nlnLDlnYBcXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwidGVzdFVybFxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICBsZXQgdXJsID0gZ2V0TXlWYXIoXFxcInBzX3VybFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBsZXQgbmFtZSA9IGdldE15VmFyKFxcXCJwc19uYW1lXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGxldCBmbGFnID0gZ2V0TXlWYXIoXFxcInBzX2ZsYWdcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSBnZXRNeVZhcihcXFwicHNfaGVhZGVyc1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBsZXQgcnVuVHlwZSA9IGdldE15VmFyKFxcXCJwc19ydW5UeXBlXFxcIiwgXFxcIldFQlxcXCIpO1xcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBnZXRNeVZhcihcXFwicHNfbWV0aG9kXFxcIiwgXFxcIkdFVFxcXCIpO1xcbiAgICAgICAgICAgIGxldCBqc29uUGF0aCA9IGdldE15VmFyKFxcXCJwc19qc29uUGF0aFxcXCIsIFxcXCJcXFwiKS50cmltKCkgfHwgdm9pZCAwO1xcbiAgICAgICAgICAgIGxldCBqcyA9IGdldE15VmFyKFxcXCJwc19qc1xcXCIsIFxcXCJcXFwiKSB8fCB2b2lkIDA7XFxuICAgICAgICAgICAgaWYgKGhlYWRlcnMpIHtcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgPSBKU09OLnBhcnNlKGhlYWRlcnMpO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhlYWRlcnPmoLzlvI/plJnor686XFxcIiArIGUudG9TdHJpbmcoKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJ2aWRlb1VybFxcXCIpLnByZXBhcmVQYXJzZXMoW3tcXG4gICAgICAgICAgICAgICAgbmFtZSxcXG4gICAgICAgICAgICAgICAgdXJsLFxcbiAgICAgICAgICAgICAgICBmbGFnLFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzLFxcbiAgICAgICAgICAgICAgICBydW5UeXBlLFxcbiAgICAgICAgICAgICAgICBtZXRob2QsXFxuICAgICAgICAgICAgICAgIGpzb25QYXRoLFxcbiAgICAgICAgICAgICAgICBqc1xcbiAgICAgICAgICAgIH1dLCBpbnB1dCxudWxsLCB0cnVlKTtcXG4gICAgICAgIH0pO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5L+d5a2YXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpbmRleCwgaXNJbXBvcnQpID0+IHtcXG4gICAgICAgIGxldCBuYW1lID0gZ2V0TXlWYXIoXFxcInBzX25hbWVcXFwiLCBcXFwiXFxcIikudHJpbSgpO1xcbiAgICAgICAgaWYgKCFuYW1lKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WQjeWtl+W+l+acieS4gOS4quWQp1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgdXJsID0gZ2V0TXlWYXIoXFxcInBzX3VybFxcXCIsIFxcXCJcXFwiKS50cmltKCk7XFxuICAgICAgICBpZiAoIXVybCkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/op6PmnpDlnLDlnYDkuI3og73kuLrnqbpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGZsYWcgPSBnZXRNeVZhcihcXFwicHNfZmxhZ1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGlmICghZmxhZykge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/op6PmnpDlnLDlnYDmoIfor4bkuI3og73kuLrnqbpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGhlYWRlcnMgPSBnZXRNeVZhcihcXFwicHNfaGVhZGVyc1xcXCIsIFxcXCJcXFwiKS50cmltKCk7XFxuICAgICAgICBpZiAoaGVhZGVycykge1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnMgPSBKU09OLnBhcnNlKGhlYWRlcnMpO1xcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YgaGVhZGVycyE9PVxcXCJvYmplY3RcXFwiKSB0aHJvdyBuZXcgRXJyb3IoXFxcIumUmeivr+exu+Wei++8jOW/hemhu+S4uk9iamVjdFxcXCIpO1xcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoZWFkZXJz5qC85byP6ZSZ6K+vOlxcXCIgKyBlLnRvU3RyaW5nKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJ1blR5cGUgPSBnZXRNeVZhcihcXFwicHNfcnVuVHlwZVxcXCIsIFxcXCJXRUJcXFwiKTtcXG4gICAgICAgIGxldCBtZXRob2QgPSBnZXRNeVZhcihcXFwicHNfbWV0aG9kXFxcIiwgXFxcIkdFVFxcXCIpO1xcbiAgICAgICAgbGV0IGpzb25QYXRoID0gZ2V0TXlWYXIoXFxcInBzX2pzb25QYXRoXFxcIiwgXFxcIlxcXCIpLnRyaW0oKSB8fCB2b2lkIDA7XFxuICAgICAgICBsZXQganMgPSBnZXRNeVZhcihcXFwicHNfanNcXFwiLCBcXFwiXFxcIikgfHwgdm9pZCAwO1xcbiAgICAgICAgaWYgKHJ1blR5cGUgPT09IFxcXCJKU09OXFxcIiAmJiAhanNvblBhdGgpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vSlNPTuaooeW8j+S4i+W/hemhu+Whq2pzb25QYXRoXFxcIjtcXG4gICAgICAgIH0gZWxzZSBpZiAocnVuVHlwZSA9PT0gXFxcIkpTXFxcIiAmJiAhanMpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vSlPmqKHlvI/kuIvlv4Xpobvloatqc1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgYXJyID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgbGV0IG9iajEgPSB7XFxuICAgICAgICAgICAgbmFtZSxcXG4gICAgICAgICAgICB1cmwsXFxuICAgICAgICAgICAgZmxhZyxcXG4gICAgICAgICAgICBoZWFkZXJzLFxcbiAgICAgICAgICAgIHJ1blR5cGUsXFxuICAgICAgICAgICAgbWV0aG9kLFxcbiAgICAgICAgICAgIGpzb25QYXRoLFxcbiAgICAgICAgICAgIGpzXFxuICAgICAgICB9O1xcbiAgICAgICAgaWYgKGluZGV4ID09PSB2b2lkKDApKSB7XFxuICAgICAgICAgICAgaWYgKGFyci5zb21lKHYgPT4gdi5uYW1lID09PSBuYW1lKSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey57uP5a2Y5Zyo6K+l6Kej5p6QXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKG9iajEuZ3JvdXApIHtcXG4gICAgICAgICAgICAgICAgbGV0IGdyb3VwID0gb2JqMS5ncm91cDtcXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gYXJyLmZpbmRJbmRleCh2ID0+IHYuZ3JvdXAgPT09IGdyb3VwKTtcXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xcbiAgICAgICAgICAgICAgICAgICAgYXJyLnVuc2hpZnQob2JqMSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAwLCBvYmoxKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGlmIChpc0ltcG9ydCkge1xcbiAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2gob2JqMSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBhcnIudW5zaGlmdChvYmoxKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IG5hbWV5ID0gYXJyW2luZGV4XS5uYW1lO1xcbiAgICAgICAgICAgIGlmIChuYW1lICE9PSBuYW1leSkge1xcbiAgICAgICAgICAgICAgICBpZiAoYXJyLnNvbWUodiA9PiB2Lm5hbWUgPT09IG5hbWUpKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey57uP5a2Y5Zyo6K+l6Kej5p6QXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBvYmoxID0gT2JqZWN0LmFzc2lnbihhcnJbaW5kZXhdLCBvYmoxKTtcXG4gICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxLCBvYmoxKTtcXG4gICAgICAgIH1cXG4gICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKGFycik7XFxuICAgICAgICBiYWNrKHRydWUpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/neWtmOaIkOWKn1xcXCI7XFxuICAgIH0sIGluZGV4LCBpc0ltcG9ydCksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIixcXG59KTtcXG5cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop6PmnpDlr7zlhaVcIixcInBhdGhcIjpcImltcG9ydFwiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gc2F2ZUNhY2hlKGpzb24pIHtcXG4gICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS9qaWV4aVNpbXBsZUltcG9ydC5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoanNvbikpO1xcbn1cXG5cXG5mdW5jdGlvbiBpbXBvcnRQYXJzZShwYXNzKSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgW18sIHJ1bGUsIHR5cGVdID0gcGFzcy5zcGxpdChcXFwiJFxcXCIpO1xcbiAgICAgICAgaWYgKHR5cGUgPT09IFxcXCJiXFxcIikge1xcbiAgICAgICAgICAgIHJ1bGUgPSBwYXJzZVBhc3RlKHJ1bGUpO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJ1bGVzID0gSlNPTi5wYXJzZShiYXNlNjREZWNvZGUocnVsZSkpO1xcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJ1bGVzKSkge1xcbiAgICAgICAgICAgIHJ1bGVzID0gW3J1bGVzXTtcXG4gICAgICAgIH1cXG4gICAgICAgIC8vcnVsZXMucmV2ZXJzZSgpO1xcbiAgICAgICAgTVlfVVJMID0gbW9kdWxlLmlkO1xcbiAgICAgICAgbGV0IHJ1bGVUaXRsZSA9IGdldFBhcmFtKFxcXCJydWxlXFxcIik7XFxuICAgICAgICBsZXQgYXJyID0gJC5yZXF1aXJlKFxcXCJjb25maWdzP3J1bGU9XFxcIiArIHJ1bGVUaXRsZSkuZ2V0SnNvbigpO1xcbiAgICAgICAgbGV0IG5ld0kgPSAwO1xcbiAgICAgICAgZm9yIChsZXQgcnVsZSBvZiBydWxlcykge1xcbiAgICAgICAgICAgIGxldCBpbmRleCA9IGFyci5maW5kSW5kZXgodiA9PiB2Lm5hbWUgPT09IHJ1bGUubmFtZSk7XFxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcXG4gICAgICAgICAgICAgICAgcnVsZSA9IE9iamVjdC5hc3NpZ24oYXJyW2luZGV4XSwgcnVsZSk7XFxuICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDEsIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICBpZiAocnVsZXMubGVuZ3RoID09PSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICBzYXZlQ2FjaGUocnVsZSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9ydWxlRWRpdCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSM/aXNJbXBvcnQ9dHJ1ZSZpbmRleD1cXFwiICsgaW5kZXggKyBcXFwiJnJ1bGU9XFxcIiArIHJ1bGVUaXRsZTtcXG4gICAgICAgICAgICAgICAgICAgIC8vdG9hc3QoXFxcIuW3suabtOaWsOinhOWIme+8mlxcXCIgKyBydWxlLm5hbWUpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKFxcXCLlt7Lmm7TmlrDop4TliJnvvJpcXFwiICsgcnVsZS5uYW1lKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgbmV3SSsrO1xcbiAgICAgICAgICAgICAgICBhcnIucHVzaChydWxlKTtcXG4gICAgICAgICAgICAgICAgaWYgKHJ1bGVzLmxlbmd0aCA9PT0gMSkge1xcbiAgICAgICAgICAgICAgICAgICAgc2F2ZUNhY2hlKHJ1bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcnVsZUVkaXQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjP2lzSW1wb3J0PXRydWUmcnVsZT1cXFwiICsgcnVsZVRpdGxlO1xcbiAgICAgICAgICAgICAgICAgICAgLy90b2FzdChcXFwi5bey5a+85YWl6KeE5YiZ77yaXFxcIiArIHJ1bGUubmFtZSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBsb2coXFxcIuW3suWvvOWFpeinhOWIme+8mlxcXCIgKyBydWxlLm5hbWUpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBpZiAocnVsZXMubGVuZ3RoID4gMSkge1xcbiAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlncz9ydWxlPVxcXCIgKyBydWxlVGl0bGUpLnNhdmVKc29uKGFycik7XFxuICAgICAgICAgICAgdG9hc3QoXFxcIuaWsOWinu+8mlxcXCIgKyBuZXdJICsgXFxcIiDopobnm5bmm7TmlrDvvJpcXFwiICsgKHJ1bGVzLmxlbmd0aCAtIG5ld0kpKTtcXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB0b2FzdChcXFwi5a+85YWl5aSx6LSlXFxcIik7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gaW1wb3J0UnVsZShwYXNzKSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgW18sIHJ1bGUsIHBuYW1lXSA9IHBhc3Muc3BsaXQoXFxcIiRcXFwiKTtcXG4gICAgICAgIGxldCBwYXRoID0gZ2V0UHVibGljSXRlbShcXFwiRHJweUhpa2VyQGlucHV0X3BhdGhcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoIXBhdGgpIHtcXG4gICAgICAgICAgICBNWV9VUkwgPSBtb2R1bGUuaWQ7XFxuICAgICAgICAgICAgbGV0IHJ1bGVUaXRsZSA9IGdldFBhcmFtKFxcXCJydWxlXFxcIik7XFxuICAgICAgICAgICAgdG9hc3QoXFxcIuacquaMh+Wumum7mOiupOS/neWtmOebruW9le+8jOivt+WFiOiuvue9ruS/neWtmOebruW9lVxcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3NoYXJlZGVmYXVsdHBhdGgjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP3J1bGU9XFxcIitydWxlVGl0bGU7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcnVsZXMgPSBiYXNlNjREZWNvZGUocGFyc2VQYXN0ZShydWxlKSk7XFxuICAgICAgICBpZiAoIXJ1bGVzKSB0b2FzdChcXFwi5YaF5a655Li656m677yM5a+85YWl5aSx6LSlXFxcIik7XFxuICAgICAgICBwYXRoID0gcGF0aC5lbmRzV2l0aChcXFwiL1xcXCIpID8gcGF0aCA6IChwYXRoICsgXFxcIi9cXFwiKTtcXG4gICAgICAgIHdyaXRlRmlsZShwYXRoICsgcG5hbWUsIHJ1bGVzKTtcXG4gICAgICAgIHRvYXN0KFxcXCLlr7zlhaXmiJDlip/or7fliLfmlrDphY3nva5cXFwiKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgdG9hc3QoXFxcIuWvvOWFpeWksei0pTpcXFwiICsgZS50b1N0cmluZygpKVxcbiAgICB9XFxufVxcbiQuZXhwb3J0cyA9IGZ1bmN0aW9uKHBhc3MsIG1vZGUpIHtcXG4gICAgaWYgKG1vZGUpIHtcXG4gICAgICAgIHJldHVybiBpbXBvcnRSdWxlKHBhc3MpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmV0dXJuIGltcG9ydFBhcnNlKHBhc3MpO1xcbiAgICB9XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6KeG6aKR6Kej5p6QXCIsXCJwYXRoXCI6XCJ2aWRlb1VybFwiLFwicnVsZVwiOlwiZnVuY3Rpb24gaXNvZmZpY2lhbCh1cmwpIHtcXG4gICAgbGV0IGZsYWcgPSBuZXcgUmVnRXhwKCdxcVxcXFwuY29tfGlxaXlpXFxcXC5jb218eW91a3VcXFxcLmNvbXxtZ3R2XFxcXC5jb218YmlsaWJpbGlcXFxcLmNvbXxzb2h1XFxcXC5jb218aXhpZ3VhXFxcXC5jb218cHB0dlxcXFwuY29tfG1pZ3V2aWRlb1xcXFwuY29tfGxlXFxcXC5jb218MTkwNVxcXFwuY29tfGZ1blxcXFwudHYnKTtcXG4gICAgcmV0dXJuIGZsYWcudGVzdCh1cmwpO1xcbn1cXG5cXG5mdW5jdGlvbiBwcm94eSh0aXRsZSkge1xcbiAgICBmdW5jdGlvbiB0b1BhdGgodmFsdWUpIHtcXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFtdO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHBhdGggPSBbXTtcXG4gICAgICAgIGxldCBjdXJyZW50ID0gJyc7XFxuICAgICAgICBsZXQgaW5CcmFja2V0cyA9IGZhbHNlO1xcbiAgICAgICAgbGV0IGVzY2FwZSA9IGZhbHNlO1xcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgIGxldCBjaGFyID0gdmFsdWVbaV07XFxuICAgICAgICAgICAgaWYgKGVzY2FwZSkge1xcbiAgICAgICAgICAgICAgICBjdXJyZW50ICs9IGNoYXI7XFxuICAgICAgICAgICAgICAgIGVzY2FwZSA9IGZhbHNlO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1xcXFxcXFxcJykge1xcbiAgICAgICAgICAgICAgICBlc2NhcGUgPSB0cnVlO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJy4nICYmICFpbkJyYWNrZXRzKSB7XFxuICAgICAgICAgICAgICAgIHBhdGgucHVzaChjdXJyZW50KTtcXG4gICAgICAgICAgICAgICAgY3VycmVudCA9ICcnO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1snKSB7XFxuICAgICAgICAgICAgICAgIGluQnJhY2tldHMgPSB0cnVlO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ10nKSB7XFxuICAgICAgICAgICAgICAgIGluQnJhY2tldHMgPSBmYWxzZTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBjdXJyZW50ICs9IGNoYXI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGN1cnJlbnQpIHtcXG4gICAgICAgICAgICBwYXRoLnB1c2goY3VycmVudCk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gcGF0aDtcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBnZXRKc29uKG9iaiwgcGF0aCkge1xcbiAgICAgICAgaWYgKCFvYmogfHwgIUFycmF5LmlzQXJyYXkocGF0aCkpIHtcXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XFxuICAgICAgICAgICAgcmV0dXJuIG9iajtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBjdXJyZW50ID0gb2JqO1xcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgbGV0IGtleSA9IHBhdGhbaV07XFxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjdXJyZW50ICE9PSAnb2JqZWN0Jykge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBydW5UeXBlID0gTVlfUEFSQU1TLnJ1blR5cGVbMF07XFxuICAgICAgICBsZXQgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGJhc2U2NERlY29kZShNWV9QQVJBTVMudXJsWzBdKSk7XFxuICAgICAgICBpZiAocnVuVHlwZSA9PSBcXFwiSlNPTlxcXCIpIHtcXG5cXG4gICAgICAgICAgICBsZXQgcGFyYW0gPSBKU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudChiYXNlNjREZWNvZGUoTVlfUEFSQU1TLnBhcmFtWzBdKSkpO1xcbiAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShyZXF1ZXN0KHVybCwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBwYXJhbS5oZWFkZXJzIHx8IHt9LFxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHBhcmFtLm1ldGhvZCB8fCB2b2lkIDBcXG4gICAgICAgICAgICB9KSk7XFxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogMzAyLFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBPYmplY3QuYXNzaWduKHt9LCBwYXJhbS5oZWFkZXJzIHx8IHt9LCB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiTG9jYXRpb25cXFwiOiBnZXRKc29uKGpzb24sIHRvUGF0aChwYXJhbS5qc29uUGF0aCkpLFxcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIGlmIChydW5UeXBlID09IFxcXCJKU1xcXCIpIHtcXG5cXG4gICAgICAgICAgICBsZXQgcGFyc2U7XFxuICAgICAgICAgICAgaWYgKE1ZX1BBUkFNUy5pbmRleCkge1xcbiAgICAgICAgICAgICAgICBwYXJzZSA9ICQucmVxdWlyZShcXFwiY29uZmlncz9ydWxlPVxcXCIgKyB0aXRsZSkuZ2V0SnNvbigpW01ZX1BBUkFNUy5pbmRleFswXV07XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcGFyc2UgPSBKU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudChiYXNlNjREZWNvZGUoTVlfUEFSQU1TLnBhcmFtWzBdKSkpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgcmVzID0gbmV3IEZ1bmN0aW9uKFxcXCJ1cmxcXFwiLCBcXFwic2VsZlxcXCIsIHBhcnNlLmpzKSh1cmwsIHBhcnNlKTtcXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlcyA9PT0gXFxcInN0cmluZ1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDMwMixcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwiTG9jYXRpb25cXFwiOiByZXNcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmICgkLnR5cGUocmVzKSA9PT0gXFxcIm9iamVjdFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDMwMixcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIHByZXBhcmVQYXJzZXMocGFyc2VzLCB1cmwsIHBsYXlsaXN0LCBpc1Rlc3QpIHtcXG4gICAgcGxheWxpc3QgPSBwbGF5bGlzdCB8fCB7XFxuICAgICAgICB1cmxzOiBbXSxcXG4gICAgICAgIG5hbWVzOiBbXSxcXG4gICAgICAgIGhlYWRlcnM6IFtdLFxcbiAgICAgICAgaXM6IFxcXCIjaXNWaWRlbz10cnVlI1xcXCIsXFxuICAgIH07XFxuICAgIGxldCBwcm94eVVybCA9IHN0YXJ0UHJveHlTZXJ2ZXIoJC50b1N0cmluZyhwcm94eSwgTVlfUlVMRS50aXRsZSkpO1xcbiAgICBwYXJzZXMuZm9yRWFjaCgodiwgaSkgPT4ge1xcbiAgICAgICAgaWYgKHYuZm9yYmlkZGVuKSByZXR1cm47XFxuICAgICAgICBwbGF5bGlzdC5uYW1lcy5wdXNoKHYubmFtZSk7XFxuICAgICAgICBpZiAodi5oZWFkZXJzKSB7XFxuICAgICAgICAgICAgcGxheWxpc3QuaGVhZGVycy5wdXNoKHYuaGVhZGVycyk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAodi5ydW5UeXBlID09PSBcXFwiSlNPTlxcXCIpIHtcXG4gICAgICAgICAgICBsZXQgcGFyYW0gPSB7XFxuICAgICAgICAgICAgICAgIC8vdXJsOiB2LnVybCxcXG4gICAgICAgICAgICAgICAgbWV0aG9kOiB2Lm1ldGhvZCxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdi5oZWFkZXJzLFxcbiAgICAgICAgICAgICAgICBqc29uUGF0aDogdi5qc29uUGF0aFxcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgcGxheWxpc3QudXJscy5wdXNoKHByb3h5VXJsICsgXFxcIj9ydW5UeXBlPUpTT04mdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoYmFzZTY0RW5jb2RlKHYudXJsICsgdXJsKSkgKyBcXFwiJnBhcmFtPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHBhcmFtKSkpKTtcXG4gICAgICAgIH0gZWxzZSBpZiAodi5ydW5UeXBlID09PSBcXFwiSlNcXFwiKSB7XFxuICAgICAgICAgICAgcGxheWxpc3QudXJscy5wdXNoKHByb3h5VXJsICsgXFxcIj9ydW5UeXBlPUpTJnVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZSh1cmwpKSArIChpc1Rlc3QgPyBcXFwiJnBhcmFtPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHYpKSkgOiBcXFwiJmluZGV4PVxcXCIgKyBpKSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHBsYXlsaXN0LnVybHMucHVzaChcXFwidmlkZW86Ly9cXFwiICsgdi51cmwgKyB1cmwpO1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlsaXN0KTtcXG59XFxuXFxuZnVuY3Rpb24gdXNlUGFyc2VzKHVybCkge1xcbiAgICBsZXQgcGFyc2VzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICBpZiAoIXBhcnNlcy5sZW5ndGgpIHJldHVybiBcXFwid2ViOi8vXFxcIiArIHVybDtcXG4gICAgbGV0IHBsYXlsaXN0ID0ge1xcbiAgICAgICAgdXJsczogW10sXFxuICAgICAgICBuYW1lczogW10sXFxuICAgICAgICBoZWFkZXJzOiBbXSxcXG4gICAgICAgIGlzOiBcXFwiI2lzVmlkZW89dHJ1ZSNcXFwiLFxcbiAgICB9O1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IHVzZURhbm11ID0gISFnZXRJdGVtKFxcXCJ1c2VEYW5tdVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGlmICh1c2VEYW5tdSkge1xcbiAgICAgICAgICAgIHBsYXlsaXN0LmRhbm11ID0gJC5yZXF1aXJlKCdkbUZ1bj9ydWxlPWRt55uS5a2QJykuZG1Sb3V0ZSh1cmwpO1xcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIHt9XFxuICAgIHJldHVybiBwcmVwYXJlUGFyc2VzKHBhcnNlcywgdXJsLCBwbGF5bGlzdCk7XFxufVxcbiQuZXhwb3J0cy5wYXJzZSA9IGZ1bmN0aW9uKGlucHV0LCBpZCwgc291cmNlKSB7XFxuICAgIGxldCBkcnB5ID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIikuZ2V0QnlTb3VyY2Uoc291cmNlKTtcXG4gICAgaW5wdXQgPSBpbnB1dC5zcGxpdChcXFwiI1xcXCIpO1xcbiAgICBsZXQgcGxheSA9IEpTT04ucGFyc2UoZHJweS5wbGF5KGlucHV0WzFdLCBpbnB1dFswXS5yZXBsYWNlKFxcXCJ0dmJveC14ZzpcXFwiLCBcXFwiXFxcIiksIFtdKSk7XFxuICAgIC8vIGxvZyhwbGF5KVxcbiAgICAvLyBsb2coaWQpXFxuICAgIC8vbG9nKHBsYXkpXFxuICAgIGZ1bmN0aW9uIHBhcnNlUXVlcnkocXVlcnkpIHtcXG4gICAgICAgIHZhciBvYmogPSB7fTtcXG4gICAgICAgIHF1ZXJ5LnNwbGl0KFxcXCImXFxcIikuZmlsdGVyKGUgPT4gZSkuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XFxuICAgICAgICAgICAgdmFyIHBhcnRzID0gaXRlbS5zcGxpdChcXFwiPVxcXCIpO1xcbiAgICAgICAgICAgIG9ialtwYXJ0c1swXV0gPSBwYXJ0c1sxXTtcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIG9iajtcXG4gICAgfVxcbiAgICB2YXIgZXh0cmEgPSB7XFxuICAgICAgICBcXFwidWFcXFwiOiBNT0JJTEVfVUFcXG4gICAgfVxcbiAgICBsZXQgcGFyc2UgPSBwbGF5O1xcbiAgICBsZXQgcGFyc2Vfb2JqID0ge1xcbiAgICAgICAgZGVmUnVsZXM6IFtcXFwiKi5tcDRcXFwiLCBcXFwiKi5tM3U4XFxcIl0sXFxuICAgIH07XFxuICAgIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFwicGFyc2VfZXh0cmFcXFwiKSkge1xcbiAgICAgICAgbGV0IHBhcnNlX2V4dHJhID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhcnNlLnBhcnNlX2V4dHJhKTtcXG4gICAgICAgIHBhcnNlX29iaiA9IE9iamVjdC5hc3NpZ24ocGFyc2Vfb2JqLCBwYXJzZVF1ZXJ5KHBhcnNlX2V4dHJhKSk7XFxuICAgICAgICBpZiAocGFyc2Vfb2JqLmhhc093blByb3BlcnR5KFxcXCJpbml0X3NjcmlwdFxcXCIpKSB7XFxuICAgICAgICAgICAgcGFyc2Vfb2JqW1xcXCJpbml0X3NjcmlwdFxcXCJdID0gYmFzZTY0RGVjb2RlKHBhcnNlX29ialtcXFwiaW5pdF9zY3JpcHRcXFwiXSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaWYgKHBhcnNlX29iai5oYXNPd25Qcm9wZXJ0eShcXFwiaXNfcGNcXFwiKSAmJiBwYXJzZV9vYmpbXFxcImlzX3BjXFxcIl0gPT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICBleHRyYVtcXFwidWFcXFwiXSA9IFBDX1VBO1xcbiAgICB9XFxuICAgIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFwiaGVhZGVyXFxcIikpIHtcXG4gICAgICAgIGV4dHJhW1xcXCJ1YVxcXCJdID0gcGFyc2VbXFxcImhlYWRlclxcXCJdW1xcXCJVc2VyLUFnZW50XFxcIl07XFxuICAgICAgICAvL2V4dHJhW1xcXCJyZWRpcmVjdFxcXCJdPWZhbHNlO1xcbiAgICAgICAgLypleHRyYVtcXFwianNcXFwiXSA9ICQudG9TdHJpbmcoKGpzKSA9PiB7XFxuICAgICAgICAgIGV2YWwoanMpXFxuICAgICAgICAgIGZiYS5sb2cobmF2aWdhdG9yLnVzZXJBZ2VudClcXG4gICAgICAgICAgZmJhLmxvZyhsb2NhdGlvbi5ocmVmKVxcbiAgICAgICAgfSwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuYXZpZ2F0b3IsICd1c2VyQWdlbnQnLCB7XFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XFxuICAgICAgICAgICAgICByZXR1cm4gJ015LUN1c3RvbS1VQS1TdHJpbmcnO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfSk7XFxuICAgICAgICB9KSkqL1xcbiAgICB9XFxuICAgIGlmIChwYXJzZV9vYmouaGFzT3duUHJvcGVydHkoXFxcImN1c3RvbV9yZWdleFxcXCIpKSB7XFxuICAgICAgICBsZXQgY3VycmVudCA9IHBhcnNlX29ialtcXFwiZGVmUnVsZXNcXFwiXTtcXG4gICAgICAgIGV4dHJhW1xcXCJ2aWRlb1J1bGVzXFxcIl0gPSBjdXJyZW50LmNvbmNhdChwYXJzZV9vYmouY3VzdG9tX3JlZ2V4LnNwbGl0KC9cXFxcfC9nKS5maWx0ZXIoZSA9PiBlKSlcXG4gICAgfVxcbiAgICBpZiAocGFyc2UuaGFzT3duUHJvcGVydHkoXFxcImpzXFxcIikgJiYgcGFyc2UuanMgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgIGV4dHJhW1xcXCJqc1xcXCJdID0gJC50b1N0cmluZygoanMsIHBhcnNlLCB0KSA9PiB7XFxuICAgICAgICAgICAgaWYgKHBhcnNlLmhhc093blByb3BlcnR5KFxcXCJpbml0X3NjcmlwdFxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIGZiYS5sb2codCArIFxcXCI65omn6KGMaW5pdF9zY3JpcHRcXFwiKTtcXG4gICAgICAgICAgICAgICAgZXZhbChwYXJzZS5pbml0X3NjcmlwdCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGZiYS5sb2cobmF2aWdhdG9yLnBsYXRmb3JtKTtcXG4gICAgICAgICAgICBmYmEubG9nKHQgKyBcXFwiOuaJp+ihjGpz54K55Ye7XFxcIilcXG4gICAgICAgICAgICBldmFsKGpzKVxcbiAgICAgICAgfSwgcGFyc2UuanMsIHBhcnNlX29iaiwgTVlfUlVMRS50aXRsZSlcXG4gICAgfVxcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IGl0ZW0gPSBmaW5kSXRlbShpZCk7XFxuICAgICAgICB1cGRhdGVJdGVtKGlkLCB7XFxuICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0uZXh0cmEsIGV4dHJhKVxcbiAgICAgICAgfSlcXG4gICAgfSBjYXRjaCAoZSkge31cXG4gICAgaWYgKHBsYXkudXJsLmluY2x1ZGVzKFxcXCJwcm94eT9kb1xcXCIpKSB7XFxuICAgICAgICBNWV9VUkwgPSBwbGF5LnVybDtcXG4gICAgICAgIHBsYXkudXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJ1cmxcXFwiLCBcXFwiXFxcIikpO1xcbiAgICB9XFxuICAgIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJwdXNoOi8vXFxcIikpIHtcXG4gICAgICAgIHBsYXkudXJsID0gcGxheS51cmwucmVwbGFjZShcXFwicHVzaDovL1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgfVxcbiAgICBpZiAocGxheS51cmwuc3RhcnRzV2l0aChcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY24vXFxcIikpIHtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3F1YXJrTGlzdD9ydWxlPVF1YXJrLueugCZyZWFsdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQocGxheS51cmwpICsgXFxcIiZzaGFyZVB3ZD1cXFwiO1xcbiAgICB9XFxuICAgIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKCdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy8nKSB8fCBwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJodHRwczovL3d3dy5hbGlwYW4uY29tL3MvXFxcIikpIHtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2FsaXl1bj9ydWxlPeS6keebmOWQmy7nroAmcGFnZT1meXBhZ2UmcmVhbHVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBsYXkudXJsKTtcXG4gICAgfVxcbiAgICBpZiAocGxheS51cmwuc3RhcnRzV2l0aChcXFwicGljczovL1xcXCIpKSB7XFxuICAgICAgICByZXR1cm4gcGxheS51cmw7XFxuICAgIH1cXG4gICAgaWYgKHBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcIm5vdmVsOi8vXFxcIikpIHtcXG4gICAgICAgIHJldHVybiAkKFxcXCJoaWtlcjovL2VtcHR5I3JlYWRUaGVtZSNcXFwiKS5ydWxlKChkYXRhKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xcbiAgICAgICAgICAgIGxldCBsYXlvdXQgPSBbXTtcXG4gICAgICAgICAgICBsZXQgY29udGVudCA9IFxcXCLjgIDjgIBcXFwiICsgZGF0YS5jb250ZW50LnNwbGl0KC8oXFxcXG58XFxcXHIpKy8pLmZpbHRlcihpdCA9PiBpdC50cmltKCkubGVuZ3RoID4gMSkubWFwKGl0ID0+IGl0LnRyaW0oKSkuam9pbihcXFwiPGJyPuOAgOOAgFxcXCIpO1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICAgICAgICAgICAgICB0aXRsZTogKFxcXCI8c3Ryb25nPlxcXCIgKyBkYXRhLnRpdGxlICsgXFxcIjwvc3Ryb25nPlxcXCIpLmJpZygpLFxcbiAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGNvbnRlbnQsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIHRleHRTaXplOiAxOCxcXG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiB0cnVlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBzZXRSZXN1bHQobGF5b3V0KTtcXG4gICAgICAgIH0sIHBsYXkudXJsLnJlcGxhY2UoXFxcIm5vdmVsOi8vXFxcIixcXFwiXFxcIikpO1xcbiAgICB9XFxuICAgIGlmIChwbGF5LnBhcnNlID09PSAxKSB7XFxuICAgICAgICBpZiAocGxheS51cmwuc3RhcnRzV2l0aChcXFwibWFnbmV0OlxcXCIpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIHBsYXkudXJsO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGlzb2ZmaWNpYWwocGxheS51cmwpICYmIChwbGF5LmZsYWcgfHwgaW5wdXRbMV0pKSB7XFxuICAgICAgICAgICAgcmV0dXJuIHVzZVBhcnNlcyhwbGF5LnVybCk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcInZpZGVvOi8vXFxcIiArIHBsYXkudXJsO1xcbiAgICB9IGVsc2UgaWYgKHBsYXkucGFyc2UgPT09IDApIHtcXG4gICAgICAgIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJtYWduZXQ6XFxcIikpIHtcXG4gICAgICAgICAgICByZXR1cm4gcGxheS51cmw7XFxuICAgICAgICB9XFxuICAgICAgICAvL2xvZyhwbGF5KVxcbiAgICAgICAgdmFyIHBsYXlvYmogPSB7fTtcXG4gICAgICAgIHBsYXlvYmoudXJscyA9IFtwbGF5LnVybCArIFxcXCIjaXNWaWRlbz10cnVlI1xcXCJdO1xcbiAgICAgICAgaWYgKHBsYXkuaGFzT3duUHJvcGVydHkoXFxcImhlYWRlclxcXCIpKSB7XFxuICAgICAgICAgICAgcGxheW9ialtcXFwiaGVhZGVyc1xcXCJdID0gcGxheS5oZWFkZXI7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAocGxheS5oYXNPd25Qcm9wZXJ0eShcXFwiZGFubWFrdVxcXCIpKSB7XFxuICAgICAgICAgICAgcGxheW9ialtcXFwiZGFubXVcXFwiXSA9IHBsYXkuZGFubWFrdTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwbGF5b2JqKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiBwbGF5LnVybDtcXG4gICAgfVxcbn1cXG4kLmV4cG9ydHMucHJlcGFyZVBhcnNlcyA9IHByZXBhcmVQYXJzZXM7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLliJvlu7rorqLpmIVcIixcInBhdGhcIjpcImNyZWF0ZVN1YnNjcmlwdGlvblwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLliJvlu7rorqLpmIVcXFwiKTtcXG5sZXQgbGF5b3V0ID0gW107XFxubGV0IGYgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFwiKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gICAgY2xlYXJNeVZhcihcXFwiZHJweUhpa2VyX3N1Yl9pbnB1dFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJkcnB5SGlrZXJfc3VidXJsX2lucHV0XFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcImRycHlIaWtlcl9zdWJuYW1lX2lucHV0XFxcIik7XFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuiuoumYheWQjeensFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX3N1Ym5hbWVfaW5wdXRcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGlkOiBcXFwiZHJweUhpa2VyX3N1Ym5hbWVfaW5wdXRcXFwiXFxuICAgIH1cXG59KTtcXG5sZXQgcGF0aCA9IGpvaW5VcmwoZ2V0UGF0aChcXFwiaGlrZXI6Ly9maWxlcy9cXFwiKSwgXFxcIi4uL1xcXCIucmVwZWF0KDUpKS5zbGljZSg3KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6YCJ5oupXFxcIixcXG4gICAgdXJsOiBKU09OLnN0cmluZ2lmeShmLmZpbGVTZWxlY3Rpb25Vcmkoe1xcbiAgICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBmaW5kSXRlbShcXFwiZHJweUhpa2VyX3N1Yl9pbnB1dFxcXCIpLmV4dHJhO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcImRycHlIaWtlcl9zdWJfaW5wdXRcXFwiLCB7XFxuICAgICAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHRhcmdldCwge1xcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBQQVRIXFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9KSxcXG4gICAgICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcbiAgICAgICAgaW5pdGlhbFBhdGg6IHBhdGgsXFxuICAgICAgICBwYXR0ZXJuOiAxXFxuICAgIH0pKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLlgqjlrZjot6/lvoRcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX3N1Yl9pbnB1dFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfc3ViX2lucHV0XFxcIlxcbiAgICB9XFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuiuoumYheWcsOWdgFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX3N1YnVybF9pbnB1dFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfc3VidXJsX2lucHV0XFxcIlxcbiAgICB9XFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuehruiupFxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaWQpID0+IHtcXG4gICAgICAgIGxldCBwYXRoID0gZ2V0TXlWYXIoXFxcImRycHlIaWtlcl9zdWJfaW5wdXRcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBsZXQgdXJsID0gZ2V0TXlWYXIoXFxcImRycHlIaWtlcl9zdWJ1cmxfaW5wdXRcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBsZXQgbmFtZSA9IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfc3VibmFtZV9pbnB1dFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGlmICghKHBhdGggJiYgdXJsICYmIG5hbWUpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S4jeWPr+S4uuepulxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcnVsZSA9IGJhc2U2NEVuY29kZShcXFwi5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77ya5ZCI6ZuG6KeE5YiZ6K6i6ZiF77+laG9tZV9zdWLvv6VcXFwiICsgbmFtZSArIFxcXCJAQFxcXCIgKyB1cmwrYEBqcz0kLnJlcXVpcmUoJ3N1YnNjcmliZT9ydWxlPSR7TVlfUlVMRS50aXRsZX0nKS5wYXJzZVVybChpbnB1dCwgJyR7YmFzZTY0RW5jb2RlKHBhdGgpfScpYCk7XFxuICAgICAgICByZXR1cm4gXFxcInJ1bGU6Ly9cXFwiICsgcnVsZTtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxufSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop6PmnpDorqLpmIVcIixcInBhdGhcIjpcInN1YnNjcmliZVwiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gZ2VuZXJhdGVDb25maWdCeUdpdGh1Yih1cmwsIHBhdGgpIHtcXG4gICAgbGV0IHJvcGUgPSB1cmwuc3BsaXQoXFxcIi9cXFwiKS5zbGljZSgzLCA1KS5qb2luKFxcXCIvXFxcIik7XFxuICAgIGxldCBodG1sID0gZmV0Y2godXJsKTtcXG4gICAgXFxuICAgIGxldCBqc29uVGV4dCA9IHBkZmgoaHRtbCwgXFxcIiNyZXBvLWNvbnRlbnQtcGpheC1jb250YWluZXImJnNjcmlwdCYmSHRtbFxcXCIpO1xcbiAgICBcXG4gICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGpzb25UZXh0KTtcXG4gICAgbGV0IGxpc3QgPSBqc29uLnBheWxvYWQudHJlZS5pdGVtcztcXG4gICAgbGV0IHJ1bGVzID0gW107XFxuICAgIGxldCBjb3VudCA9IDA7XFxuICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IG5hbWUgPSBpdC5uYW1lO1xcbiAgICAgICAgICAgIGxldCBzcGF0aCA9IGl0LnBhdGg7XFxuICAgICAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFxcXCIuanNcXFwiKSkgY29udGludWU7XFxuICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sYXN0SW5kZXhPZihcXFwiLlxcXCIpKTtcXG4gICAgICAgICAgICBsZXQgcnVsZSA9IGZldGNoKGBodHRwczovL3Jhdy5naXRtaXJyb3IuY29tLyR7cm9wZX0vbWFzdGVyLyR7c3BhdGh9YCk7XFxuICAgICAgICAgICAgaWYgKCEoKCFydWxlIHx8ICFydWxlLmluY2x1ZGVzKFxcXCJydWxlXFxcIikpICYmICFmaWxlRXhpc3QocGF0aCArIGl0Lm5hbWUpKSkge1xcbiAgICAgICAgICAgICAgICB3cml0ZUZpbGUocGF0aCArIGl0Lm5hbWUsIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICBydWxlcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICdrZXknOiBgaGlweV9qc18ke25hbWV9YCxcXG4gICAgICAgICAgICAgICAgICAgICduYW1lJzogYCR7bmFtZX1gLFxcbiAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAzLFxcbiAgICAgICAgICAgICAgICAgICAgJ2FwaSc6Jy4uL2xpYnMvZHJweTIuanMnLFxcbiAgICAgICAgICAgICAgICAgICAgJ3NlYXJjaGFibGUnOiAxLFxcbiAgICAgICAgICAgICAgICAgICAgJ3F1aWNrU2VhcmNoJzogMSxcXG4gICAgICAgICAgICAgICAgICAgICdmaWx0ZXJhYmxlJzogMSxcXG4gICAgICAgICAgICAgICAgICAgICdleHQnOiBcXFwiLi9cXFwiICsgaXQubmFtZSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIGNvdW50Kys7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHdyaXRlRmlsZShwYXRoICsgXFxcImluZGV4Lmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeSh7c2l0ZXM6cnVsZXN9KSk7XFxuICAgIHJldHVybiBcXFwidG9hc3Q6Ly/miJDlip/mm7TmlrBcXFwiICsgY291bnQgKyBcXFwi5LiqXFxcIjs7XFxufVxcblxcbmZ1bmN0aW9uIGdlbmVyYXRlQ29uZmlnQnlJbmRleCh1cmwsIHBhdGgpIHtcXG4gICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKHRvQ29ycmVjdEpTT05TdHJpbmcocmVxdWVzdCh1cmwpKSk7XFxuICAgIGxldCBhcnIgPSBqc29uLnNpdGVzO1xcbiAgICBsZXQgY291bnQgPSAwO1xcbiAgICBsZXQgaSA9IDA7XFxuICAgIGZvciAobGV0IGl0IG9mIGFycikge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBpZiAoKFN0cmluZyhpdC5hcGkpLmluY2x1ZGVzKFxcXCJkcnB5Mi5taW4uanNcXFwiKSB8fCBTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIuanNcXFwiKSkpIHtcXG4gICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBpdC5leHQuZW5kc1dpdGgoXFxcIi5qc1xcXCIpID8gZGVjb2RlVVJJQ29tcG9uZW50KGl0LmV4dC5zcGxpdChcXFwiL1xcXCIpLmF0KC0xKSkgOiAoaXQubmFtZSArIFxcXCIuanNcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGU7XFxuICAgICAgICAgICAgICAgIGlmIChTdHJpbmcoaXQuZXh0KS5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGUgPSByZXF1ZXN0KGl0LmV4dCk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBydWxlID0gcmVxdWVzdChqb2luVXJsKHVybCwgaXQuZXh0KSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaXQuZXh0ID0gXFxcIi4vXFxcIiArIG5hbWU7XFxuICAgICAgICAgICAgICAgIGlmICghcnVsZSB8fCAhcnVsZS5pbmNsdWRlcyhcXFwicnVsZVxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGVFeGlzdChwYXRoICsgbmFtZSkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnNwbGljZShpLCAxKTtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICB3cml0ZUZpbGUocGF0aCArIG5hbWUsIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGkrKztcXG4gICAgfVxcbiAgICB3cml0ZUZpbGUocGF0aCArIFxcXCJpbmRleC5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoanNvbikpO1xcbiAgICByZXR1cm4gXFxcInRvYXN0Oi8v5oiQ5Yqf5pu05pawXFxcIiArIGNvdW50ICsgXFxcIuS4qlxcXCI7XFxufVxcbiQuZXhwb3J0cy5wYXJzZVVybCA9IGZ1bmN0aW9uKHVybCwgcGF0aCkge1xcbiAgICBwYXRoID0gYmFzZTY0RGVjb2RlKHBhdGgpO1xcbiAgICBwYXRoID0gcGF0aC5lbmRzV2l0aChcXFwiL1xcXCIpID8gcGF0aCA6IHBhdGggKyBcXFwiL1xcXCI7XFxuICAgIHRyeSB7XFxuICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoXFxcImh0dHBzOi8vZ2l0aHViLmNvbS9oamRobngvXFxcIikpIHtcXG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWdCeUdpdGh1Yih1cmwsIHBhdGgpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWdCeUluZGV4KHVybCwgcGF0aCk7XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJlcnJvcjpcXFwiICsgZS50b1N0cmluZygpO1xcbiAgICB9XFxufTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIui/kOihjOaXtumFjee9rueuoeeQhlwiLFwicGF0aFwiOlwicnVudGltZUNvbmZpZ1wiLFwicnVsZVwiOlwianM6XFxuY29uc3Qgc2VhcmNoQWxsb3dQYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvTG95RGdJay9EcnB5SGlrZXIvc2VhcmNoQWxsb3cuanNvblxcXCI7XFxubGV0IGlzUHJlcGFyZSA9IGZhbHNlO1xcbmxldCBjb25maWdzLCBjdXJyZW50Q29uZmlnID0ge30sXFxuICAgIHNvdXJjZUxpc3QsIGN1cnJlbnRTb3VyY2UsIHNlYXJjaEFsbG93ID0gW107XFxuXFxuZnVuY3Rpb24gaW5pdChjb25maWcpIHtcXG4gICAgaWYgKCFjb25maWcpIHJldHVybiBudWxsO1xcbiAgICBpZiAoIWNvbmZpZy5wYXRoKSByZXR1cm4gbnVsbDtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBmaWxlO1xcbiAgICAgICAgbGV0IHNvdXJjZUxpc3QgPSBbXTtcXG4gICAgICAgIGlmIChjb25maWcucGF0aC5zdGFydHNXaXRoKFxcXCJmaWxlOi8vXFxcIikgJiYgKGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGNvbmZpZy5wYXRoLnJlcGxhY2UoXFxcImZpbGU6Ly9cXFwiLCBcXFwiXFxcIikpKS5pc0RpcmVjdG9yeSgpKSB7XFxuICAgICAgICAgICAgc291cmNlTGlzdCA9IGdlbmVyYXRlQ29uZmlnQnlMb2NhbChmaWxlKTtcXG4gICAgICAgICAgICBjb25maWcudHlwZSA9IFxcXCJsb2NhbERpclxcXCI7XFxuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5wYXRoLnN0YXJ0c1dpdGgoXFxcImh0dHBzOi8vZ2l0aHViLmNvbVxcXCIpKSB7XFxuICAgICAgICAgICAgc291cmNlTGlzdCA9IGdlbmVyYXRlQ29uZmlnQnlHaXRodWIoY29uZmlnLnBhdGgpO1xcbiAgICAgICAgICAgIGNvbmZpZy50eXBlID0gXFxcImdpdGh1YkRpclxcXCI7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZSh0b0NvcnJlY3RKU09OU3RyaW5nKGZldGNoKGNvbmZpZy5wYXRoKSB8fCBcXFwie31cXFwiKSk7XFxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGpzb24uc2l0ZXMpIHx8ICFqc29uLnNpdGVzLmxlbmd0aCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgc291cmNlTGlzdCA9IGZpbHRlck90aGVyKGpzb24uc2l0ZXMpO1xcbiAgICAgICAgICAgIGNvbmZpZy50eXBlID0gXFxcImluZGV4XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGZpbGUgPSB2b2lkIDA7XFxuICAgICAgICBsZXQgY3VycmVudFNvdXJjZSwgc2VhcmNoQWxsb3c7XFxuICAgICAgICBpZiAoY29uZmlnLmNLZXkpIHtcXG4gICAgICAgICAgICBjdXJyZW50U291cmNlID0gc291cmNlTGlzdC5maW5kKHYgPT4gdi5rZXkgPT09IGNvbmZpZy5jS2V5KTtcXG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRTb3VyY2UpIHtcXG4gICAgICAgICAgICAgICAgY3VycmVudFNvdXJjZSA9IHNvdXJjZUxpc3RbMF07XFxuICAgICAgICAgICAgICAgIC8vY3VycmVudENvbmZpZy5jS2V5ID0gc291cmNlTGlzdFswXS5rZXk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBjdXJyZW50U291cmNlID0gc291cmNlTGlzdFswXTtcXG4gICAgICAgICAgICAvL2NvbmZpZy5jS2V5ID0gc291cmNlTGlzdFswXS5rZXk7XFxuICAgICAgICB9XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIHNlYXJjaEFsbG93ID0gSlNPTi5wYXJzZShmZXRjaChzZWFyY2hBbGxvd1BhdGgpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGRlbGV0ZUZpbGUoc2VhcmNoQWxsb3dQYXRoKTtcXG4gICAgICAgICAgICBzZWFyY2hBbGxvdyA9IFtdO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICBjdXJyZW50U291cmNlLFxcbiAgICAgICAgICAgIHNlYXJjaEFsbG93LFxcbiAgICAgICAgICAgIHNvdXJjZUxpc3RcXG4gICAgICAgIH07XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICB9XFxuICAgIHJldHVybiBudWxsO1xcbn1cXG5cXG5mdW5jdGlvbiBnZW5lcmF0ZUNvbmZpZ0J5TG9jYWwoZGlyRmlsZSkge1xcbiAgICBsZXQgbGlzdCA9IGRpckZpbGUubGlzdEZpbGVzKCk7XFxuICAgIGxldCBydWxlcyA9IFtdO1xcbiAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XFxuICAgICAgICBsZXQgbmFtZSA9IFN0cmluZyhpdC5nZXROYW1lKCkpO1xcbiAgICAgICAgbGV0IHBhdGggPSBpdC5nZXRQYXRoKCk7XFxuICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXFxcIi5qc1xcXCIpIHx8IGl0LmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xcbiAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sYXN0SW5kZXhPZihcXFwiLlxcXCIpKTtcXG4gICAgICAgIHJ1bGVzLnB1c2goe1xcbiAgICAgICAgICAgICdrZXknOiBgaGlweV9qc18ke25hbWV9YCxcXG4gICAgICAgICAgICAnbmFtZSc6IGAke25hbWV9YCxcXG4gICAgICAgICAgICAndHlwZSc6IDMsXFxuICAgICAgICAgICAgJ3NlYXJjaGFibGUnOiAxLFxcbiAgICAgICAgICAgICdxdWlja1NlYXJjaCc6IDEsXFxuICAgICAgICAgICAgJ2ZpbHRlcmFibGUnOiAxLFxcbiAgICAgICAgICAgICdleHQnOiBgJHtwYXRofWAsXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICByZXR1cm4gcnVsZXM7XFxufVxcblxcbmZ1bmN0aW9uIGdlbmVyYXRlQ29uZmlnQnlHaXRodWIodXJsKSB7XFxuICAgIC8vdXJsPXVybC5yZXBsYWNlKC8oI0dJVEhVQiMpJC8sXFxcIlxcXCIpO1xcbiAgICBsZXQgcm9wZSA9IHVybC5zcGxpdChcXFwiL1xcXCIpLnNsaWNlKDMsIDUpLmpvaW4oXFxcIi9cXFwiKTtcXG4gICAgbGV0IGh0bWwgPSBmZXRjaCh1cmwpO1xcbiAgICBsZXQganNvblRleHQgPSBwZGZoKGh0bWwsIFxcXCIjcmVwby1jb250ZW50LXBqYXgtY29udGFpbmVyJiZzY3JpcHQmJkh0bWxcXFwiKTtcXG4gICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGpzb25UZXh0KTtcXG4gICAgbGV0IGxpc3QgPSBqc29uLnBheWxvYWQudHJlZS5pdGVtcztcXG4gICAgbGV0IHJ1bGVzID0gW107XFxuICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcXG4gICAgICAgIGxldCBuYW1lID0gaXQubmFtZTtcXG4gICAgICAgIGxldCBwYXRoID0gaXQucGF0aDtcXG4gICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcXFwiLmpzXFxcIikpIGNvbnRpbnVlO1xcbiAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sYXN0SW5kZXhPZihcXFwiLlxcXCIpKTtcXG4gICAgICAgIHJ1bGVzLnB1c2goe1xcbiAgICAgICAgICAgICdrZXknOiBgaGlweV9qc18ke25hbWV9YCxcXG4gICAgICAgICAgICAnbmFtZSc6IGAke25hbWV9YCxcXG4gICAgICAgICAgICAndHlwZSc6IDMsXFxuICAgICAgICAgICAgJ3NlYXJjaGFibGUnOiAxLFxcbiAgICAgICAgICAgICdxdWlja1NlYXJjaCc6IDEsXFxuICAgICAgICAgICAgJ2ZpbHRlcmFibGUnOiAxLFxcbiAgICAgICAgICAgICdleHQnOiBgaHR0cHM6Ly9yYXcuZ2l0bWlycm9yLmNvbS8ke3JvcGV9L21hc3Rlci8ke3BhdGh9YCxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgLypcXG4gICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9oamRobngvaGlweS1zZXJ2ZXIvdHJlZS9tYXN0ZXIvYXBwL3Q0L2ZpbGVzL2RycHlfanNcXG4gICAgICAgIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9oamRobngvaGlweS1zZXJ2ZXIvbWFzdGVyL2FwcC90NC9maWxlcy9kcnB5X2pzLzM2MCVFNSVCRCVCMSVFOCVBNyU4NiU1QiVFNSVBRSU5OCU1RC5qcyovXFxuICAgIH1cXG4gICAgcmV0dXJuIHJ1bGVzO1xcbn1cXG5cXG5mdW5jdGlvbiBwcmVwYXJlKGNvbmZpZykge1xcbiAgICBsZXQgZGF0YSA9IGluaXQoY29uZmlnKTtcXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gZmFsc2U7XFxuICAgIGN1cnJlbnRTb3VyY2UgPSBkYXRhLmN1cnJlbnRTb3VyY2U7XFxuICAgIHNlYXJjaEFsbG93ID0gZGF0YS5zZWFyY2hBbGxvdztcXG4gICAgc291cmNlTGlzdCA9IGRhdGEuc291cmNlTGlzdDtcXG4gICAgY3VycmVudENvbmZpZyA9IGNvbmZpZztcXG4gICAgcmV0dXJuIHRydWU7XFxufVxcblxcbmZ1bmN0aW9uIGZpbHRlck90aGVyKGxpc3QpIHtcXG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKGl0ID0+IFN0cmluZyhpdC5hcGkpLmluY2x1ZGVzKFxcXCJkcnB5Mi5taW4uanNcXFwiKSB8fCBTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIuanNcXFwiKSlcXG59XFxuXFxuXFxuZnVuY3Rpb24gZ2V0Q3VycmVudENvbmZpZygpIHtcXG4gICAgcmV0dXJuIGN1cnJlbnRDb25maWcgfHwge307XFxufVxcblxcbmZ1bmN0aW9uIHNldEN1cnJlbnRDb25maWcoY29uZmlnKSB7XFxuICAgIGxldCBjcGF0aCA9IChjdXJyZW50Q29uZmlnIHx8IHt9KS5wYXRoO1xcbiAgICBpZiAocHJlcGFyZShjb25maWcpKSB7XFxuICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJjdXJyZW50Q29uZmlnXFxcIiwgY29uZmlnKTtcXG4gICAgICAgIGlmIChjcGF0aCAhPSBjb25maWcucGF0aCkge1xcbiAgICAgICAgICAgIGRlbGV0ZUZpbGUoc2VhcmNoQWxsb3dQYXRoKTtcXG4gICAgICAgICAgICBzZWFyY2hBbGxvdyA9IFtdO1xcbiAgICAgICAgfVxcbiAgICAgICAgaXNQcmVwYXJlID0gdHJ1ZTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGZpbmRTb3VyY2Uoa2V5KSB7XFxuICAgIGxldCBzID0gc291cmNlTGlzdC5maW5kKHYgPT4gdi5rZXkgPT09IGtleSk7XFxuICAgIGlmIChzKSB7XFxuICAgICAgICBzLmV4dCA9IGdldEFic29sdXRlUGF0aChTdHJpbmcocy5leHQpKTtcXG4gICAgfVxcbiAgICByZXR1cm4gcztcXG59XFxuXFxuZnVuY3Rpb24gZ2V0Q3VycmVudFNvdXJjZSgpIHtcXG4gICAgcmV0dXJuIGN1cnJlbnRTb3VyY2U7XFxufVxcblxcbmZ1bmN0aW9uIGdldEN1cnJlbnRTb3VyY2VQYXRoKCkge1xcbiAgICBsZXQgcGF0aCA9IFN0cmluZyhjdXJyZW50U291cmNlLmV4dCk7XFxuICAgIHJldHVybiBnZXRBYnNvbHV0ZVBhdGgocGF0aCk7XFxufVxcblxcbmZ1bmN0aW9uIGdldEFic29sdXRlUGF0aChwYXRoKSB7XFxuICAgIHBhdGggPSBTdHJpbmcocGF0aCk7XFxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSB8fCBwYXRoLnN0YXJ0c1dpdGgoXFxcImZpbGU6Ly9cXFwiKSkge1xcbiAgICAgICAgcmV0dXJuIHBhdGg7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gam9pblVybChjdXJyZW50Q29uZmlnLnBhdGgsIHBhdGgpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIHNldEN1cnJlbnRTb3VyY2Uoa2V5KSB7XFxuICAgIGxldCBzb3VyY2UgPSBzb3VyY2VMaXN0LmZpbmQodiA9PiB2LmtleSA9PT0ga2V5KTtcXG4gICAgaWYgKHNvdXJjZSkge1xcbiAgICAgICAgY3VycmVudENvbmZpZy5jS2V5ID0ga2V5O1xcbiAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwiY3VycmVudENvbmZpZ1xcXCIsIGN1cnJlbnRDb25maWcpO1xcbiAgICAgICAgY3VycmVudFNvdXJjZSA9IHNvdXJjZTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICB9XFxuICAgIHJldHVybiBmYWxzZTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0Q2FuU2VhcmNoU291cmNlKCkge1xcbiAgICByZXR1cm4gc291cmNlTGlzdC5maWx0ZXIodiA9PiB2LnNlYXJjaGFibGUgPT09IHVuZGVmaW5lZCB8fCB2LnNlYXJjaGFibGUpO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRBbGxTb3VyY2UoKSB7XFxuICAgIHJldHVybiBzb3VyY2VMaXN0LnNsaWNlKCk7XFxufVxcblxcbmZ1bmN0aW9uIGdldEFsbFNvdXJjZXMoKSB7XFxuICAgIHJldHVybiBzb3VyY2VMaXN0O1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRTZWFyY2hBbGxvdygpIHtcXG4gICAgcmV0dXJuIHNlYXJjaEFsbG93O1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRTZWFyY2hBbGxvdygpIHtcXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2VhcmNoQWxsb3cpKSB7XFxuICAgICAgICBzYXZlRmlsZShzZWFyY2hBbGxvd1BhdGgsIEpTT04uc3RyaW5naWZ5KHNlYXJjaEFsbG93KSk7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gZ2V0QWxsb3dTZWFyY2hTb3VyY2UoKSB7XFxuICAgIGxldCBzbGlzdDtcXG4gICAgaWYgKHNlYXJjaEFsbG93Lmxlbmd0aCkge1xcbiAgICAgICAgc2xpc3QgPSBzb3VyY2VMaXN0LmZpbHRlcih2ID0+IHNlYXJjaEFsbG93LmluY2x1ZGVzKHYua2V5KSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBzbGlzdCA9IHNvdXJjZUxpc3QuZmlsdGVyKHYgPT4gdi5zZWFyY2hhYmxlKTtcXG4gICAgfVxcbiAgICBpZiAoc2xpc3QubGVuZ3RoID09IDApIHtcXG4gICAgICAgIHNsaXN0ID0gc291cmNlTGlzdC5zbGljZSgpO1xcbiAgICB9XFxuICAgIHJldHVybiBzbGlzdDtcXG59XFxuXFxuZnVuY3Rpb24gaXNQcmVwYXJlZCgpIHtcXG4gICAgcmV0dXJuIGlzUHJlcGFyZTtcXG59XFxuXFxuaXNQcmVwYXJlID0gcHJlcGFyZShzdG9yYWdlMC5nZXRJdGVtKFxcXCJjdXJyZW50Q29uZmlnXFxcIiwge30pKTtcXG4kLmV4cG9ydHMgPSB7XFxuICAgIHByZXBhcmUsXFxuICAgIGdldEN1cnJlbnRDb25maWcsXFxuICAgIHNldEN1cnJlbnRDb25maWcsXFxuICAgIGdldEN1cnJlbnRTb3VyY2UsXFxuICAgIGdldEN1cnJlbnRTb3VyY2VQYXRoLFxcbiAgICBzZXRDdXJyZW50U291cmNlLFxcbiAgICBnZXRDYW5TZWFyY2hTb3VyY2UsXFxuICAgIGdldFNlYXJjaEFsbG93LFxcbiAgICBzZXRTZWFyY2hBbGxvdyxcXG4gICAgZ2V0QWxsU291cmNlLFxcbiAgICBnZXRBbGxvd1NlYXJjaFNvdXJjZSxcXG4gICAgaXNQcmVwYXJlZCxcXG4gICAgZ2V0QWJzb2x1dGVQYXRoLFxcbiAgICBnZXRBbGxTb3VyY2VzLFxcbiAgICBmaW5kU291cmNlXFxufTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIue8lui+kemFjee9rlwiLFwicGF0aFwiOlwiY3JlYXRlQ29uZmlnXCIsXCJydWxlXCI6XCJqczpcXG5sZXQgbGF5b3V0ID0gW107XFxuc2V0UGFnZVRpdGxlKFxcXCLliJvlu7rphY3nva5cXFwiKTtcXG5sZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbmxldCBjdXJyZW50Y29uZmlnID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50Q29uZmlnKCk7XFxubGV0IGYgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFwiKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gIGNsZWFyTXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfbmFtZVxcXCIpO1xcbiAgY2xlYXJNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIik7XFxufSk7XFxuXFxuLy/ljoblj7LphY3nva7orrDlvZVcXG5mdW5jdGlvbiB1bmlxdWVBcnJheUJ5UHJvcGVydHkoYXJyYXksIHByb3BlcnR5KSB7XFxuICBsZXQgdW5pcXVlID0gW107XFxuICBsZXQgbWFwID0gbmV3IE1hcCgpO1xcbiAgZm9yIChsZXQgaXRlbSBvZiBhcnJheSkge1xcbiAgICBsZXQga2V5ID0gaXRlbVtwcm9wZXJ0eV07XFxuICAgIGlmICghbWFwLmhhcyhrZXkpKSB7XFxuICAgICAgbWFwLnNldChrZXksIHRydWUpO1xcbiAgICAgIHVuaXF1ZS5wdXNoKGl0ZW0pO1xcbiAgICB9XFxuICB9XFxuICByZXR1cm4gdW5pcXVlO1xcbn1cXG5sZXQgY3BhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9jYWNoZS9cXFwiICsgXFxcImRycHljb25maWcuanNvblxcXCI7XFxubGV0IHBhdGhjb25maWdzID0gW107XFxudHJ5IHtcXG4gIHBhdGhjb25maWdzID0gSlNPTi5wYXJzZShyZWFkRmlsZShjcGF0aCkpIHx8IFtdO1xcbiAgLy9wdXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ3NcXFwiLHBhdGhjb25maWdzKTtcXG59IGNhdGNoIChlKSB7XFxuICBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpO1xcbn1cXG5wYXRoY29uZmlncyA9IHVuaXF1ZUFycmF5QnlQcm9wZXJ0eShwYXRoY29uZmlncywgXFxcInBhdGhcXFwiKTtcXG4vL2xvZyhwYXRoY29uZmlncylcXG5cXG5sZXQgY29uZmlnc19vYmogPSB7XFxuICBwYXRoOiBjcGF0aCxcXG4gIGNvbmZpZ3M6IHBhdGhjb25maWdzXFxufVxcbi8v5Y6G5Y+y6YWN572u6K6w5b2VXFxuXFxubGF5b3V0LnB1c2goe1xcbiAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICBkZXNjOiBcXFwi6YWN572u5ZCN56ewKOW/heWhqykgIOi3r+W+hOWSjOaWh+S7tuWkuemAieS6jOmAieS4gFxcXCIsXFxuICBleHRyYToge1xcbiAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX25hbWVcXFwiLCBcXFwiXFxcIiksXFxuICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19uYW1lXFxcIiwgaW5wdXQpO1xcbiAgICB9KSxcXG4gICAgaWQ6IFxcXCJkcnB5SGlrZXJfY29uZmlnX25hbWVcXFwiXFxuICB9XFxufSk7XFxuXFxubGV0IHNlbGVjdF9tb2RlID0gZ2V0SXRlbShcXFwic2VsZWN0X2NvbmZpZ19tb2RlXFxcIiwgXFxcIjBcXFwiKTtcXG5sZXQgbmF2ID0gW1xcXCLot6/lvoQvVVJMXFxcIiwgXFxcIuaWh+S7tuWkuVxcXCJdO1xcblxcbm5hdi5mb3JFYWNoKCh4LCBpKSA9PiB7XFxuICBsYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIChpID09IHNlbGVjdF9tb2RlID8geC5mb250Y29sb3IoXFxcIiMxNUI3NkNcXFwiKSA6IHgpLFxcbiAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGkpID0+IHtcXG4gICAgICBzZXRJdGVtKFxcXCJzZWxlY3RfY29uZmlnX21vZGVcXFwiLCBpICsgXFxcIlxcXCIpO1xcbiAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgaSksXFxuICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICB9KVxcbn0pXFxuXFxuXFxubGV0IHBhdGggPSBqb2luVXJsKGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvXFxcIiksIFxcXCIuLi9cXFwiLnJlcGVhdCg1KSkuc2xpY2UoNyk7XFxuXFxuaWYgKHNlbGVjdF9tb2RlID09IFxcXCIwXFxcIikge1xcbiAgbGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqVxcXCIsXFxuICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCIpLmV4dHJhO1xcbiAgICAgICAgdXBkYXRlSXRlbShcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIiwge1xcbiAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXG4gICAgICAgICAgfSlcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgfSksXFxuICAgICAgcm9vdERpclBhdGg6IHBhdGgsXFxuICAgICAgaW5pdGlhbFBhdGg6IHBhdGgsXFxuICAgICAgcGF0dGVybjogMCxcXG4gICAgICBmaWxlVHlwZTogXFxcIi5qc29uXFxcIixcXG4gICAgfSkpLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIumFjee9rui3r+W+hC9VUkwg5pys5Zyw6YCJ5oupaW5kZXguanNvblxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIiwgaW5wdXQpO1xcbiAgICAgIH0pLFxcbiAgICAgIGlkOiBcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIlxcbiAgICB9XFxuICB9KTtcXG59XFxuaWYgKHNlbGVjdF9tb2RlID09IFxcXCIxXFxcIikge1xcbiAgbGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqVxcXCIsXFxuICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oXFxcImRycHlIaWtlcl9jb25maWdfZm9sZGVyXFxcIikuZXh0cmE7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJkcnB5SGlrZXJfY29uZmlnX2ZvbGRlclxcXCIsIHtcXG4gICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBQQVRIXFxuICAgICAgICAgIH0pXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgIH0pLFxcbiAgICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcbiAgICAgIGluaXRpYWxQYXRoOiBwYXRoLFxcbiAgICAgIHBhdHRlcm46IDEsXFxuICAgICAgLy9maWxlVHlwZTogXFxcIi5qc29uXFxcIixcXG4gICAgfSkpLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIumFjee9ruaWh+S7tuWkuei3r+W+hCDpgInmi6lkcnB5X2pz55uu5b2VXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICBkZWZhdWx0VmFsdWU6IFxcXCJcXFwiLFxcbiAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFwiLCBpbnB1dCk7XFxuICAgICAgfSksXFxuICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfY29uZmlnX2ZvbGRlclxcXCJcXG4gICAgfVxcbiAgfSk7XFxufVxcbmxheW91dC5wdXNoKHtcXG4gIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICB0aXRsZTogXFxcIuehruiupFxcXCIsXFxuICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGNvYmopID0+IHtcXG4gICAgbGV0IHBhdGggPSBnZXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIiwgXFxcIlxcXCIpO1xcbiAgICBsZXQgbmFtZSA9IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX25hbWVcXFwiLCBcXFwiXFxcIik7XFxuICAgIGlmICghKHBhdGggJiYgbmFtZSkpIHtcXG4gICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LiN5Y+v5Li656m6XFxcIjtcXG4gICAgfVxcbiAgICBwYXRoID0gcGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikgPyBwYXRoIDogcGF0aC5zdGFydHNXaXRoKFxcXCIvXFxcIikgPyAoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCkgOiBwYXRoO1xcbiAgICAvL2xvZyhwYXRoKVxcbiAgICB0cnkge1xcbiAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICBzaG93TG9hZGluZyhcXFwi5q2j5Zyo5Yqg6L296YWN572uLi4uXFxcIik7XFxuICAgICAgfVxcblxcbiAgICAgIGlmIChydW50aW1lQ29uZmlnLnNldEN1cnJlbnRDb25maWcoe1xcbiAgICAgICAgcGF0aCxcXG4gICAgICAgIG5hbWUsXFxuICAgICAgfSkpIHtcXG4gICAgICAgIGNvYmouY29uZmlncy5wdXNoKHtcXG4gICAgICAgICAgcGF0aCxcXG4gICAgICAgICAgbmFtZSxcXG4gICAgICAgIH0pXFxuICAgICAgICBjbGVhckl0ZW0oXFxcIm5vX2xvYWRpbmdcXFwiKTtcXG4gICAgICAgIHNhdmVGaWxlKGNvYmoucGF0aCwgSlNPTi5zdHJpbmdpZnkoY29iai5jb25maWdzKSk7XFxuICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIik7XFxuICAgICAgICBEcnB5TWFuYWdlLmNsZWFyKCk7XFxuICAgICAgICAkLnJlcXVpcmUoXFxcIkNoYW5nZVNvdXJjZVBvcFxcXCIpLnNob3coMTAwKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgIH1cXG4gICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6YWN572u5paH5Lu25pyJ6K+vXFxcIjtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgZS50b1N0cmluZygpO1xcbiAgICB9IGZpbmFsbHkge1xcbiAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgIH1cXG4gIH0sIGNvbmZpZ3Nfb2JqKSxcXG4gIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxufSk7XFxuXFxuaWYgKHBhdGhjb25maWdzLmxlbmd0aCkge1xcbiAgbGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyBcXFwiPHNtYWxsPuWOhuWPsumFjee9ruiusOW9lSDngrnmiJHov5vooYzphY3nva7mo4Dpqow8L3NtYWxsPlxcXCIsXFxuICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgocCkgPT4ge1xcbiAgICAgIC8vbG9nKHApXFxuICAgICAgZnVuY3Rpb24gdW5pcXVlKGFycikge1xcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IE1hcCgpO1xcbiAgICAgICAgcmV0dXJuIGFyci5maWx0ZXIoKGEpID0+ICFyZXMuaGFzKGEpICYmIHJlcy5zZXQoYSwgMSkpXFxuICAgICAgfVxcbiAgICAgIHZhciByZXN1bHRzID0gW107XFxuICAgICAgaWYgKHAubGVuZ3RoID09IDApIHtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/ml6DlnLDlnYBcXFwiO1xcbiAgICAgIH1cXG4gICAgICBsaXN0ID0gcC5tYXAoeCA9PiB4LnBhdGgpO1xcbiAgICAgIHZhciB0YXNrID0gZnVuY3Rpb24ob2JqKSB7XFxuICAgICAgICBsZXQgcyA9IERhdGUubm93KCk7XFxuICAgICAgICBsZXQganNGaWxlcyA9IFtdO1xcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcXG5cXG4gICAgICAgIGZ1bmN0aW9uIGZpbHRlck90aGVyKGxpc3QpIHtcXG4gICAgICAgICAgcmV0dXJuIGxpc3QuZmlsdGVyKGl0ID0+IFN0cmluZyhpdC5hcGkpLmluY2x1ZGVzKFxcXCJkcnB5Mi5taW4uanNcXFwiKSB8fCBTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIuanNcXFwiKSlcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChvYmoudXJsLnN0YXJ0c1dpdGgoXFxcImZpbGU6XFxcIikpIHtcXG4gICAgICAgICAgbGV0IGNvZGUgPSBcXFwibm9cXFwiO1xcbiAgICAgICAgICBsZXQgcGF0aCA9IG9iai51cmwucmVwbGFjZShcXFwiZmlsZTovL1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgbGV0IGRpciA9IG5ldyBqYXZhLmlvLkZpbGUocGF0aCk7XFxuICAgICAgICAgIGlmIChkaXIuaXNEaXJlY3RvcnkoKSkge1xcbiAgICAgICAgICAgIGxldCBmbGlzdCA9IGRpci5saXN0RmlsZXMoKTtcXG4gICAgICAgICAgICBmb3IgKHZhciBmIG9mIGZsaXN0KSB7XFxuICAgICAgICAgICAgICAvLyDmo4Dmn6Xmlofku7blkI3mmK/lkKbku6UuanPnu5PlsL5cXG4gICAgICAgICAgICAgIGlmIChmLmlzRmlsZSgpICYmIGYuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoXFxcIi5qc1xcXCIpKSB7XFxuICAgICAgICAgICAgICAgIGpzRmlsZXMucHVzaChmKTtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKGRpci5pc0ZpbGUoKSAmJiBmaWxlRXhpc3Qob2JqLnVybCkpIHtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UocmVhZEZpbGUob2JqLnVybCkpO1xcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbi5zaXRlcykgfHwganNvbi5zaXRlcy5sZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgY291bnQgPSBmaWx0ZXJPdGhlcihqc29uLnNpdGVzKS5sZW5ndGg7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cXG4gICAgICAgICAgICBjb2RlID0gXFxcIm9rXFxcIjtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBpZiAoanNGaWxlcy5sZW5ndGggPj0gNSkge1xcbiAgICAgICAgICAgIGNvdW50ID0ganNGaWxlcy5sZW5ndGg7XFxuICAgICAgICAgICAgY29kZSA9IFxcXCJva1xcXCI7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICB0aW1lOiAoRGF0ZS5ub3coKSAtIHMpLFxcbiAgICAgICAgICAgIHVybDogb2JqLnVybCxcXG4gICAgICAgICAgICBjb3VudDogY291bnQsXFxuICAgICAgICAgICAgY29kZTogY29kZSxcXG4gICAgICAgICAgICBpbmRleDogb2JqLmlcXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgdmFyIGogPSBKU09OLnBhcnNlKGZldGNoKG9iai51cmwsIHtcXG4gICAgICAgICAgd2l0aEhlYWRlcnM6IHRydWUsXFxuICAgICAgICAgIHRpbWVvdXQ6IDUwMDAsXFxuICAgICAgICB9KSk7XFxuICAgICAgICBsZXQgZSA9IERhdGUubm93KCk7XFxuICAgICAgICBsZXQgYyA9IGUgLSBzO1xcbiAgICAgICAgaWYgKG9iai51cmwuaW5jbHVkZXMoXFxcImdpdGh1Yi5jb21cXFwiKSAmJiBqLnN0YXR1c0NvZGUgPT0gMjAwKSB7XFxuICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgdmFyIGh0bWwgPSBqLmJvZHk7XFxuICAgICAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHBkZmgoaHRtbCwgXFxcIiNyZXBvLWNvbnRlbnQtcGpheC1jb250YWluZXImJnNjcmlwdCYmSHRtbFxcXCIpKTtcXG4gICAgICAgICAgICBsZXQgbGlzdCA9IGpzb24ucGF5bG9hZC50cmVlLml0ZW1zO1xcbiAgICAgICAgICAgIGNvdW50ID0gbGlzdC5maWx0ZXIoeCA9PiB4Lm5hbWUuZW5kc1dpdGgoXFxcIi5qc1xcXCIpKS5sZW5ndGg7XFxuICAgICAgICAgIH0gY2F0Y2gge31cXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZSh0b0NvcnJlY3RKU09OU3RyaW5nKGouYm9keSkgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24uc2l0ZXMpIHx8IGpzb24uc2l0ZXMubGVuZ3RoKSB7XFxuICAgICAgICAgICAgY291bnQgPSBmaWx0ZXJPdGhlcihqc29uLnNpdGVzKS5sZW5ndGg7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuXFxuICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICB0aW1lOiBjLFxcbiAgICAgICAgICB1cmw6IGoudXJsLFxcbiAgICAgICAgICBjb3VudDogY291bnQsXFxuICAgICAgICAgIGNvZGU6IGouc3RhdHVzQ29kZSxcXG4gICAgICAgICAgaW5kZXg6IG9iai5pLFxcbiAgICAgICAgfVxcbiAgICAgIH07XFxuICAgICAgbGV0IHRhc2tzID0gbGlzdC5tYXAoKHgsIGkpID0+IHtcXG4gICAgICAgIGkgPSBpICsgMTtcXG4gICAgICAgIHJldHVybiB7XFxuICAgICAgICAgIGZ1bmM6IHRhc2ssXFxuICAgICAgICAgIHBhcmFtOiB7XFxuICAgICAgICAgICAgdXJsOiB4LFxcbiAgICAgICAgICAgIGk6IGkgLSAxLFxcbiAgICAgICAgICB9LFxcbiAgICAgICAgICBpZDogJ3Rhc2tpZCcgKyBpXFxuICAgICAgICB9XFxuICAgICAgfSk7XFxuICAgICAgdmFyIGNvdW50ID0gc3VjY2VzcyA9IHRhc2tzLmxlbmd0aDtcXG4gICAgICBiZSh0YXNrcywge1xcbiAgICAgICAgZnVuYzogZnVuY3Rpb24ob2JqLCBpZCwgZXJyb3IsIHRhc2tSZXN1bHQpIHtcXG4gICAgICAgICAgb2JqLnJlc3VsdHMucHVzaCh0YXNrUmVzdWx0KVxcbiAgICAgICAgICBjb3VudCA9IGNvdW50IC0gMTtcXG4gICAgICAgICAgaWYgKGNvdW50ID4gMCkge1xcbiAgICAgICAgICAgIHNob3dMb2FkaW5nKFxcXCLmo4DmtYvkuK0uLi7liankvZnlnLDlnYDvvJpcXFwiICsgY291bnQpXFxuICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSxcXG4gICAgICAgIHBhcmFtOiB7XFxuICAgICAgICAgIGhpOiAnY2NjJyxcXG4gICAgICAgICAgcmVzdWx0czogcmVzdWx0c1xcbiAgICAgICAgfVxcbiAgICAgIH0sIHN1Y2Nlc3MpO1xcbiAgICAgIC8vbG9nKHJlc3VsdHMpXFxuICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKGYgPT4gZik7XFxuICAgICAgcmVzdWx0cy5mb3JFYWNoKCh4LCBpKSA9PiB7XFxuICAgICAgICBsZXQgaXRlbSA9IGZpbmRJdGVtKFxcXCJwYXRoXFxcIiArIHguaW5kZXgpO1xcbiAgICAgICAgbGV0IHJlZ2V4ID0gLyjlkI3np7A6Lio/KShcXFxccyspP1xcXFxuL2c7XFxuICAgICAgICBsZXQgdGl0bGUgPSBcXFwi5ZCN56ewOlxcXCIgKyBwW3guaW5kZXhdLm5hbWUgKyBcXFwiIFxcXCI7XFxuICAgICAgICBsZXQgdXJsID0gcFt4LmluZGV4XS5wYXRoO1xcbiAgICAgICAgbGV0IG1zZyA9IFxcXCJcXFwiO1xcbiAgICAgICAgbGV0IGNvdW50ID0geC5jb3VudCAhPSAwID8gXFxcIiDmupDmlbDph486XFxcIiArIHguY291bnQgOiBcXFwiXFxcIjtcXG4gICAgICAgIGlmICgvbm8vLnRlc3QoeC5jb2RlKSkge1xcbiAgICAgICAgICBtc2cgPSBpdGVtLnRpdGxlLnJlcGxhY2UocmVnZXgsIHRpdGxlICsgXFxcIumFjee9ruacieivr1xcXCIuZm9udGNvbG9yKFxcXCJyZWRcXFwiKSArIFxcXCJcXFxcblxcXCIpO1xcbiAgICAgICAgfSBlbHNlIGlmICgvXigtMXwwfDQwNCkvLnRlc3QoeC5jb2RlKSkge1xcbiAgICAgICAgICBtc2cgPSBpdGVtLnRpdGxlLnJlcGxhY2UocmVnZXgsIHRpdGxlICsgXFxcIuaXoOazleiuv+mXrlxcXCIuZm9udGNvbG9yKFxcXCJyZWRcXFwiKSArIFxcXCJcXFxcblxcXCIpO1xcbiAgICAgICAgfSBlbHNlIGlmICgvXjIwMC8udGVzdCh4LmNvZGUpKSB7XFxuICAgICAgICAgIG1zZyA9IGl0ZW0udGl0bGUucmVwbGFjZShyZWdleCwgdGl0bGUgKyBcXFwi6YCa6K6v5q2j5bi4XFxcIi5mb250Y29sb3IoXFxcIiMzQ0IzNzFcXFwiKSArIFxcXCIgIOW7tui/nzpcXFwiICsgeC50aW1lICsgY291bnQgKyBcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgICAgLy91cmwgPSBpdGVtLnVybDtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIG1zZyA9IGl0ZW0udGl0bGUucmVwbGFjZShyZWdleCwgdGl0bGUgKyBcXFwi6YWN572u5q2j56GuXFxcIi5mb250Y29sb3IoXFxcIiMzQ0IzNzFcXFwiKSArIGNvdW50ICsgXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICAgIC8vdXJsID0gaXRlbS51cmw7XFxuICAgICAgICB9XFxuICAgICAgICB1cGRhdGVJdGVtKGl0ZW0uZXh0cmEuaWQsIHtcXG4gICAgICAgICAgdGl0bGU6IG1zZyxcXG4gICAgICAgICAgLy91cmw6IHVybCxcXG4gICAgICAgIH0pXFxuICAgICAgfSk7XFxuICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCBwYXRoY29uZmlncyksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG4gIH0pXFxuICBwYXRoY29uZmlncy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XFxuICAgIGxldCBsb25nQyA9IFt7XFxuICAgICAgdGl0bGU6IFxcXCLlkI3np7BcXFwiLFxcbiAgICAgIGpzOiAkLnRvU3RyaW5nKChpdGVtLCBwLCBjKSA9PiB7XFxuICAgICAgICBsZXQgaSA9IGMuZmluZEluZGV4KHggPT4geC5uYW1lID09IGl0ZW0ubmFtZSk7XFxuICAgICAgICBpZiAoaSAhPSAtMSkge1xcbiAgICAgICAgICByZXR1cm4gJChjW2ldLm5hbWUsIFxcXCLovpPlhaXmlrDlkI3np7BcXFwiKS5pbnB1dCgoYywgcCwgaSkgPT4ge1xcbiAgICAgICAgICAgIGNbaV0ubmFtZSA9IGlucHV0O1xcbiAgICAgICAgICAgIHNhdmVGaWxlKHAsIEpTT04uc3RyaW5naWZ5KGMpKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICB9LCBjLCBwLCBpKVxcbiAgICAgICAgfVxcbiAgICAgIH0sIGl0ZW0sIGNwYXRoLCBwYXRoY29uZmlncylcXG4gICAgfSwge1xcbiAgICAgIHRpdGxlOiBcXFwi6Lev5b6EXFxcIixcXG4gICAgICBqczogJC50b1N0cmluZygoaXRlbSwgcCwgYykgPT4ge1xcbiAgICAgICAgbGV0IGkgPSBjLmZpbmRJbmRleCh4ID0+IHgubmFtZSA9PSBpdGVtLm5hbWUpO1xcbiAgICAgICAgaWYgKGkgIT0gLTEpIHtcXG4gICAgICAgICAgcmV0dXJuICQoY1tpXS5wYXRoLCBcXFwi6L6T5YWl5paw6Lev5b6EXFxcIikuaW5wdXQoKGMsIHAsIGkpID0+IHtcXG4gICAgICAgICAgICBjW2ldLnBhdGggPSBpbnB1dDtcXG4gICAgICAgICAgICBzYXZlRmlsZShwLCBKU09OLnN0cmluZ2lmeShjKSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgfSwgYywgcCwgaSlcXG4gICAgICAgIH1cXG4gICAgICB9LCBpdGVtLCBjcGF0aCwgcGF0aGNvbmZpZ3MpXFxuICAgIH0sIHtcXG4gICAgICB0aXRsZTogXFxcIuWIoOmZpFxcXCIsXFxuICAgICAganM6ICQudG9TdHJpbmcoKGl0ZW0sIHAsIGMpID0+IHtcXG4gICAgICAgIGxldCBpID0gYy5maW5kSW5kZXgoeCA9PiB4Lm5hbWUgPT0gaXRlbS5uYW1lKTtcXG4gICAgICAgIGlmIChpICE9IC0xKSB7XFxuICAgICAgICAgIGMuc3BsaWNlKGksIDEpO1xcbiAgICAgICAgICBzYXZlRmlsZShwLCBKU09OLnN0cmluZ2lmeShjKSk7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICB9XFxuICAgICAgfSwgaXRlbSwgY3BhdGgsIHBhdGhjb25maWdzKVxcbiAgICB9XVxcbiAgICBpZiAoaXRlbS5wYXRoLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgIGxvbmdDLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLorr/pl65cXFwiLFxcbiAgICAgICAganM6ICQudG9TdHJpbmcoKGl0ZW0pID0+IHtcXG4gICAgICAgICAgaWYgKGl0ZW0ucGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcIndlYjovL1xcXCIgKyBpdGVtLnBhdGg7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH0sIGl0ZW0pXFxuICAgICAgfSlcXG4gICAgfVxcbiAgICBsZXQgY3VycmVudCA9IFxcXCJcXFwiO1xcbiAgICBpZiAoY3VycmVudGNvbmZpZyAmJiBjdXJyZW50Y29uZmlnLmhhc093blByb3BlcnR5KFxcXCJwYXRoXFxcIikpIHtcXG4gICAgICBpZiAoaXRlbS5wYXRoID09IGN1cnJlbnRjb25maWcucGF0aCkge1xcbiAgICAgICAgY3VycmVudCA9IFxcXCLinqHvuI9cXFwiO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgXFxcIjxzbWFsbD5cXFwiICsgY3VycmVudCArIFxcXCLlkI3np7A6XFxcIiArIGl0ZW0ubmFtZSArIFxcXCJcXFxcbui3r+W+hDpcXFwiICsgaXRlbS5wYXRoICsgXFxcIjwvc21hbGw+XFxcIixcXG4gICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoaXRlbSA9PiB7XFxuICAgICAgICBjbGVhckl0ZW0oXFxcIm5vX2xvYWRpbmdcXFwiKTtcXG4gICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICBsZXQge1xcbiAgICAgICAgICBwYXRoLFxcbiAgICAgICAgICBuYW1lXFxuICAgICAgICB9ID0gaXRlbTtcXG4gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgICAgICBzaG93TG9hZGluZyhcXFwi5q2j5Zyo5Yqg6L296YWN572uLi4uXFxcIik7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAocnVudGltZUNvbmZpZy5zZXRDdXJyZW50Q29uZmlnKHtcXG4gICAgICAgICAgcGF0aCxcXG4gICAgICAgICAgbmFtZSxcXG4gICAgICAgIH0pKSB7XFxuICAgICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpO1xcbiAgICAgICAgICBEcnB5TWFuYWdlLmNsZWFyKCk7XFxuICAgICAgICAgICQucmVxdWlyZShcXFwiQ2hhbmdlU291cmNlUG9wXFxcIikuc2hvdygxMDApO1xcbiAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIh+aNouWksei0pVxcXCI7XFxuICAgICAgICB9XFxuICAgICAgfSwgaXRlbSksXFxuICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogJ3BhdGgnICsgaSxcXG4gICAgICAgIGxvbmdDbGljazogbG9uZ0NcXG4gICAgICB9XFxuICAgIH0pXFxuICB9KVxcbn1cXG5cXG5cXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuaNoua6kOW8ueeql1wiLFwicGF0aFwiOlwiQ2hhbmdlU291cmNlUG9wXCIsXCJydWxlXCI6XCIkLmV4cG9ydHMuc2hvdyA9IGZ1bmN0aW9uICh0aW1lKSB7XFxuICBpZiAodGltZSkge1xcbiAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKHRpbWUpO1xcbiAgfVxcbiAgY29uc3QgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZSgpO1xcbiAgbGV0IG5hbWUgPSBzb3VyY2UgPyBzb3VyY2UubmFtZSA6IFxcXCJcXFwiO1xcbiAgY29uc3QgaGlrZXJQb3AgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTY5NjZcXFwiKTtcXG4gIGxldCBzb3VyY2VOYW1lTGlzdCA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlKCkubWFwKHYgPT4ge1xcbiAgICByZXR1cm4gdi5uYW1lID09IG5hbWUgPyBcXFwi4oCY4oCYXFxcIiArIHYubmFtZSArIFxcXCLigJnigJlcXFwiIDogdi5uYW1lO1xcbiAgfSk7XFxuICBoaWtlclBvcC5zZXRVc2VTdGFydEFjdGl2aXR5KGZhbHNlKTtcXG5cXG4gIGZ1bmN0aW9uIG5hdHVyYWxTb3J0KGEsIGIpIHtcXG4gICAgYSA9IGEucmVwbGFjZSgvW+KAmeKAmF0vZywgXFxcIlxcXCIpO1xcbiAgICBiID0gYi5yZXBsYWNlKC9b4oCZ4oCYXS9nLCBcXFwiXFxcIik7XFxuICAgIHJldHVybiBhLmxvY2FsZUNvbXBhcmUoYiwgdW5kZWZpbmVkLCB7XFxuICAgICAgbnVtZXJpYzogdHJ1ZSxcXG4gICAgICBzZW5zaXRpdml0eTogJ2Jhc2UnXFxuICAgIH0pO1xcbiAgfVxcblxcbiAgbGV0IHNwZW4gPSAzO1xcbiAgbGV0IGl0ZW1zID0gc291cmNlTmFtZUxpc3QubWFwKCh4LCBpKSA9PiB7XFxuICAgIHJldHVybiB7XFxuICAgICAgdGl0bGU6IHgsXFxuICAgICAgdXJsOiBpXFxuICAgIH1cXG4gIH0pXFxuXFxuICBsZXQgbmFtZXMgPSBpdGVtcy5tYXAodiA9PiB2LnRpdGxlKTtcXG4gIGxldCBzbmFtZSA9IG5hbWVzLnNsaWNlKCk7XFxuICBpZiAoZ2V0SXRlbShcXFwibmF0dXJhbFxcXCIsIFxcXCJcXFwiKSkge1xcbiAgICBuYW1lcyA9IG5hbWVzLnNvcnQobmF0dXJhbFNvcnQpO1xcbiAgfVxcbiAgbGV0IG1hbmFnZV9hbGwgPSBuYW1lcy5zbGljZSgpO1xcbiAgbGV0IHNlYXJjaEtleSA9IFxcXCJcXFwiO1xcbiAgbGV0IHBvcCA9IGhpa2VyUG9wLnNlbGVjdEJvdHRvbVJlcyh7XFxuICAgIG9wdGlvbnM6IG5hbWVzLFxcbiAgICBjb2x1bW5zOiBzcGVuLFxcbiAgICB0aXRsZTogXFxcIumAieaLqeinhumikea6kFxcXCIgKyBcXFwi5b2T5YmN5YWxOlxcXCIgKyBpdGVtcy5sZW5ndGggKyBcXFwi5Liq6KeG6aKR5rqQXFxcIixcXG4gICAgbm9BdXRvRGlzbWlzczogdHJ1ZSxcXG4gICAgcG9zaXRpb246IDEsXFxuICAgIGV4dHJhSW5wdXRCb3g6IG5ldyBoaWtlclBvcC5SZXNFeHRyYUlucHV0Qm94KHtcXG4gICAgICBoaW50OiBcXFwi5rqQ5YWz6ZSu5a2XXFxcIixcXG4gICAgICB0aXRsZTogXFxcIm9rXFxcIixcXG4gICAgICBvbkNoYW5nZSh0ZXh0LCBtYW5hZ2UpIHtcXG4gICAgICAgIC8vbG9nKFxcXCJvbkNoYW5nZTpcXFwiK3RleHQpXFxuICAgICAgICBsZXQgZmxpc3QgPSBuYW1lcy5maWx0ZXIoeCA9PiB4LmluY2x1ZGVzKHRleHQpKTtcXG4gICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuICAgICAgICBmbGlzdC5mb3JFYWNoKHggPT4ge1xcbiAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHgpO1xcbiAgICAgICAgfSk7XFxuICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgfSxcXG4gICAgICBkZWZhdWx0VmFsdWU6IFxcXCJcXFwiLFxcbiAgICAgIGNsaWNrKHMsIG1hbmFnZSkge1xcbiAgICAgICAgLy90b2FzdChzKTtcXG4gICAgICAgIC8vbG9nKG1hbmFnZS5saXN0KTtcXG4gICAgICB9LFxcbiAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2VcXG4gICAgfSksIFxcbiAgICBsb25nQ2xpY2socywgaSkge1xcbiAgICAgICAgICAgIHNob3dTZWxlY3RPcHRpb25zKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLliIbkuqvop4bpopHmupBcXFwiLFxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBbXFxcIkpT5paH5Lu25YiG5LqrXFxcIl0uY29uY2F0KGdldFBhc3RlcygpKSxcXG4gICAgICAgICAgICAgICAgY29sOiAyLFxcbiAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZyhuYW1lID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBzb3VyY2VzID0gcnVudGltZUNvbmZpZy5nZXRBbGxTb3VyY2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBzb3VyY2UgPSBzb3VyY2VzLmZpbmQodiA9PiB2Lm5hbWUgPT0gbmFtZSk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IHJ1bnRpbWVDb25maWcuZ2V0QWJzb2x1dGVQYXRoKHNvdXJjZS5leHQpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBuYW1lID0gcGF0aC5zcGxpdChcXFwiL1xcXCIpLmF0KC0xKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gZmV0Y2gocGF0aCk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJ1bGUpIHJldHVybiBcXFwidG9hc3Q6Ly/ojrflj5blpLHotKVcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKE1ZX0lOREVYID09PSAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS9cXFwiICsgcG5hbWUsIGZldGNoKHBhdGgpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInNoYXJlOi8vaGlrZXI6Ly9maWxlcy9fY2FjaGUvXFxcIiArIHBuYW1lO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gc2hhcmVQYXN0ZShiYXNlNjRFbmNvZGUocnVsZSksIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly/mtbfpmJTop4bnlYzvvIxEUlBZ6KeG6aKR5rqQ44CMXFxcIiArIG5hbWUgKyBcXFwi44CN5aSN5Yi25pW05p2h5Y+j5Luk5omT5byA6L2v5Lu25bCx5Lya6Ieq5Yqo5a+85YWlJFxcXCIgKyB1cmwgKyBcXFwiJFxcXCIgKyBwbmFtZSArIFxcXCJAaW1wb3J0PWpzOiQucmVxdWlyZSgnaW1wb3J0P3J1bGU9JytcXFwiICsgSlNPTi5zdHJpbmdpZnkoTVlfUlVMRS50aXRsZSkgKyBcXFwiKShpbnB1dCwgdHJ1ZSlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9LCBzLnJlcGxhY2UoL1vigJnigJhdL2csIFxcXCJcXFwiKSlcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0sXFxuICAgIGNsaWNrKHMsIGksIG1hbmFnZSkge1xcbiAgICAgIHBvcC5kaXNtaXNzKCk7ICAgICAgXFxuICAgICAgc2V0SXRlbShcXFwibm9fbG9hZGluZ1xcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgLy8gbWFuYWdlLmxpc3QuZm9yRWFjaCgodiwgaWkpID0+IChcXG4gICAgICAvLyAgIG1hbmFnZS5saXN0W2lpXSA9IGkgPT09IGlpID8gXFxcIuKAmOKAmFxcXCIgKyBuYW1lc1tpaV0gKyBcXFwi4oCZ4oCZXFxcIiA6IG5hbWVzW2lpXS5yZXBsYWNlKC9b4oCZ4oCYXS9nLCBcXFwiXFxcIilcXG4gICAgICAvLyApKTtcXG4gICAgICBsZXQgbmFtZSA9IG1hbmFnZS5saXN0W2ldLnJlcGxhY2UoL1vigJnigJhdL2csIFxcXCJcXFwiKTtcXG4gICAgICBpZiAobmFtZSA9PSBzb3VyY2UubmFtZSkge1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIHJldHVybjtcXG4gICAgICB9XFxuICAgICAgbGV0IHNvdXJjZXMgPSBydW50aW1lQ29uZmlnLmdldEFsbFNvdXJjZSgpO1xcbiAgICAgIGxldCBrZXkgPSBzb3VyY2VzLmZpbmQodiA9PiB2Lm5hbWUgPT0gbmFtZSkua2V5O1xcblxcbiAgICAgIC8vbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgIGxldCBzb3VyY2VOYW1lTGlzdCA9IHJ1bnRpbWVDb25maWcuc2V0Q3VycmVudFNvdXJjZShrZXkpO1xcbiAgICAgIGNsZWFyTXlWYXIoXFxcImNhdGVpXFxcIik7XFxuICAgICAgY2xlYXJNeVZhcihcXFwiY2F0ZV9vYmpcXFwiKTtcXG4gICAgICBjbGVhck15VmFyKFxcXCJpc2hvbWVcXFwiKTtcXG4gICAgICBjbGVhck15VmFyKFxcXCJsaW5rc1xcXCIpO1xcbiAgICAgIHJlZnJlc2hQYWdlKCk7XFxuXFxuICAgIH0sXFxuICAgIG1lbnVDbGljayhtYW5hZ2UpIHtcXG4gICAgICBoaWtlclBvcC5zZWxlY3RDZW50ZXIoe1xcbiAgICAgICAgb3B0aW9uczogW1xcXCLmlLnlj5jmoLflvI9cXFwiLCBcXFwi562b6YCJ5rqQXFxcIiwgXFxcIuiHqueEtuaOkuW6jzpcXFwiICsgKGdldEl0ZW0oXFxcIm5hdHVyYWxcXFwiLCBcXFwiXFxcIikgPT0gXFxcIlxcXCIgPyBcXFwi5YWz6ZetXFxcIiA6IFxcXCLlkK/nlKhcXFwiKSwgXFxcIuWAkuW6j1xcXCIsIFxcXCLliLfmlrDphY3nva5cXFwiXSxcXG4gICAgICAgIGNvbHVtbnM6IDIsXFxuICAgICAgICB0aXRsZTogXFxcIuivt+mAieaLqVxcXCIsXFxuICAgICAgICBjbGljayhzLCBpKSB7XFxuICAgICAgICAgIGlmIChpID09PSAwKSB7XFxuICAgICAgICAgICAgc3BlbiA9IHNwZW4gPT0gMyA/IDEgOiAzO1xcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2VDb2x1bW5zKHNwZW4pO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDEpIHtcXG4gICAgICAgICAgICBoaWtlclBvcC5pbnB1dENvbmZpcm0oe1xcbiAgICAgICAgICAgICAgY29udGVudDogXFxcIui+k+WFpeWFs+mUruWtlyDnqbrmmL7npLrlhajpg6hcXFwiLFxcbiAgICAgICAgICAgICAgdGl0bGU6IFxcXCLnrZvpgInmupBcXFwiLFxcbiAgICAgICAgICAgICAgaGludDogXFxcIua6kOWFs+mUruWtl1xcXCIsXFxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHNlYXJjaEtleSxcXG4gICAgICAgICAgICAgIHRleHRhcmVhOiBmYWxzZSwgLy/lpJrooYzmqKHlvI9cXG4gICAgICAgICAgICAgIG1heFRleHRhcmVhOiB0cnVlLFxcbiAgICAgICAgICAgICAgbm9BdXRvU29mdDogZmFsc2UsXFxuICAgICAgICAgICAgICAvL2hpZGVDYW5jZWw6IHRydWUsXFxuICAgICAgICAgICAgICBjb25maXJtKHRleHQpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiLCBcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgICAgICAgICBzZWFyY2hLZXkgPSB0ZXh0O1xcbiAgICAgICAgICAgICAgICBsZXQgbGlzdCA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlKCkubWFwKHggPT4geC5uYW1lKTtcXG4gICAgICAgICAgICAgICAgbGV0IGZsaXN0ID0gbGlzdC5maWx0ZXIoeCA9PiB4LmluY2x1ZGVzKHRleHQpKTtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICAgICAgZmxpc3QuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHgpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgICAgICAgICAvL3JldHVybiBcXFwidG9hc3Q6Ly/ovpPlhaXkuoZcXFwiICsgdGV4dDtcXG4gICAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMikge1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0gT2JqZWN0LmFzc2lnbihbXSwgbWFuYWdlLmxpc3QpO1xcbiAgICAgICAgICAgIGxldCBuYXR1cmFsID0gZ2V0SXRlbShcXFwibmF0dXJhbFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBpZiAobmF0dXJhbCA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICAgIGxpc3Quc29ydChuYXR1cmFsU29ydCkuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4KTtcXG4gICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgICAgc25hbWUuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4KTtcXG4gICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJuYXR1cmFsXFxcIiwgbmF0dXJhbCA/IFxcXCJcXFwiIDogXFxcIjFcXFwiKTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDMpIHtcXG4gICAgICAgICAgICBtYW5hZ2UubGlzdC5yZXZlcnNlKCk7XFxuICAgICAgICAgICAgbmFtZXMucmV2ZXJzZSgpO1xcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBmdW5jdGlvbiBhcnJheURpZmZlcmVuY2UoYXJyMSwgYXJyMikge1xcbiAgICAgICAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChhcnIyLm1hcChpdGVtID0+IFtpdGVtLmtleSwgaXRlbV0pKTtcXG4gICAgICAgICAgICAgIHJldHVybiBhcnIxLmZpbHRlcihpdGVtID0+ICFtYXAuaGFzKGl0ZW0ua2V5KSk7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIiwgXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgICAgICAgICBsZXQgbGlzdCA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlKCk7XFxuICAgICAgICAgICAgbGV0IENrZXkgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2UoKS5rZXk7XFxuICAgICAgICAgICAgLy9sb2coQ2tleSlcXG4gICAgICAgICAgICBsZXQgY2ZnID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50Q29uZmlnKClcXG4gICAgICAgICAgICBsZXQge1xcbiAgICAgICAgICAgICAgcGF0aCxcXG4gICAgICAgICAgICAgIG5hbWVcXG4gICAgICAgICAgICB9ID0gY2ZnO1xcbiAgICAgICAgICAgIHJ1bnRpbWVDb25maWcuc2V0Q3VycmVudENvbmZpZyh7XFxuICAgICAgICAgICAgICBwYXRoLFxcbiAgICAgICAgICAgICAgbmFtZSxcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBydW50aW1lQ29uZmlnLnNldEN1cnJlbnRTb3VyY2UoQ2tleSk7XFxuICAgICAgICAgICAgbGV0IG5zb3VyY2VzID0gcnVudGltZUNvbmZpZy5nZXRBbGxTb3VyY2UoKTtcXG5cXG4gICAgICAgICAgICBsZXQgYWxpc3QgPSBhcnJheURpZmZlcmVuY2UobnNvdXJjZXMsIGxpc3QpO1xcbiAgICAgICAgICAgIGxldCBkbGlzdCA9IGFycmF5RGlmZmVyZW5jZShsaXN0LCBuc291cmNlcyk7XFxuXFxuICAgICAgICAgICAgaWYgKGFsaXN0Lmxlbmd0aCA+IDAgfHwgZGxpc3QubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgbGV0IG1zZyA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgaWYgKGFsaXN0Lmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgYWxpc3QuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHgubmFtZSk7XFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgIGxvZyhcXFwi5paw5aKeOlxcXCIgKyBhbGlzdC5tYXAoayA9PiBrLm5hbWUpLmpvaW4oXFxcIixcXFwiKSlcXG4gICAgICAgICAgICAgICAgbXNnICs9IFxcXCLmlrDlop5cXFwiICsgYWxpc3QubGVuZ3RoICsgXFxcIuS4qua6kFxcXCI7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICBpZiAoZGxpc3QubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgICBkbGlzdC5mb3JFYWNoKHggPT4ge1xcbiAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnNwbGljZShtYW5hZ2UubGlzdC5pbmRleE9mKHgubmFtZSksIDEpO1xcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICBsb2coXFxcIuenu+mZpDpcXFwiICsgZGxpc3QubWFwKGsgPT4gay5uYW1lKS5qb2luKFxcXCIsXFxcIikpXFxuICAgICAgICAgICAgICAgIG1zZyArPSBcXFwiIOenu+mZpFxcXCIgKyBkbGlzdC5sZW5ndGggKyBcXFwi5Liq5rqQXFxcIjtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgICAgIHRvYXN0KG1zZyArIFxcXCIg5pu05aSa6K+m5oOF55yLbG9nXFxcIik7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgIHRvYXN0KFxcXCLlt7LliLfmlrBcXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuICAgICAgfSk7XFxuICAgIH1cXG4gIH0pO1xcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcImRycHnnrqHnkIZcIixcInBhdGhcIjpcIkRycHlNYW5hZ2VcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IEpTRW5naW5lID0gY29tLmV4YW1wbGUuaGlrZXJ2aWV3LnNlcnZpY2UucGFyc2VyLkpTRW5naW5lO1xcbmNvbnN0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG5jb25zdCBkcnB5TWFwID0gbmV3IE1hcCgpO1xcbmNvbnN0IEdNa2V5ID0gbW9kdWxlLmltcG9ydFBhcmFtO1xcbmxvZyhcXFwi5Yid5aeL5YyWRHJweU1hbmFnZVxcXCIpO1xcblxcbmZ1bmN0aW9uIGJ1aWxkSnNFbnYodGlja2V0KSB7XFxuICAgIGxldCBjb2RlID0gU3RyaW5nLnJhdyBgXFxuICAgIC8vIGNvbnN0IG15X3J1bGUgPSAnXFxuICAgIGNvbnN0IE1ZX1JVTEUgPSAke215X3J1bGV9O1xcbiAgICBjb25zdCBteV9ydWxlID0gSlNPTi5zdHJpbmdpZnkoTVlfUlVMRSk7XFxuICAgIGNvbnN0IE1ZX1RJQ0tFVCA9IFxcXCIke3RpY2tldHx8XFxcIlxcXCJ9XFxcIjtcXG4gICAgZXZhbChnZXRKc1BsdWdpbigpKTtcXG4gICAgZXZhbChnZXRKc0xhenlQbHVnaW4oKSk7XFxuICAgIGA7XFxuICAgIHJldHVybiBjb2RlO1xcbn1cXG5cXG5mdW5jdGlvbiBzeW5jKGZ1bmMsIHNwKSB7XFxuICAgIHJldHVybiBuZXcgb3JnLm1vemlsbGEuamF2YXNjcmlwdC5TeW5jaHJvbml6ZXIoZnVuYywgc3AgfHwge30pO1xcbn1cXG5cXG5mdW5jdGlvbiBjcmVhdGVEcnB5KGtleSkge1xcbiAgICBKU0VuZ2luZS5nZXRJbnN0YW5jZSgpLmV2YWxKUyhidWlsZEpzRW52KE1ZX1RJQ0tFVCkgKyBcXFwiXFxcXG4hXFxcIiArICQudG9TdHJpbmcoKGtleSwgR01rZXksIE1ZX1RJQ0tFVCkgPT4ge1xcbiAgICAgICAgbGV0IGRycHkgPSAkLnJlcXVpcmUoXFxcImRycHlcXFwiKTtcXG4gICAgICAgIEdNLmhhcyhHTWtleSwgKERycHlNYW5hZ2UpID0+IHtcXG4gICAgICAgICAgICBEcnB5TWFuYWdlLnB1dChrZXksIGRycHkpO1xcbiAgICAgICAgfSk7XFxuICAgIH0sIGtleSwgR01rZXksIE1ZX1RJQ0tFVCkgKyBcXFwiO1xcXFxuXFxcIiwgXFxcIlxcXCIsIGZhbHNlKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0KGtleSkge1xcbiAgcmV0dXJuIHN5bmMoKCkgPT4ge1xcbiAgICAvL2xvZyhkcnB5TWFwLnNpemUpXFxuICAgIGlmIChkcnB5TWFwLmhhcyhrZXkpKSB7XFxuICAgICAgcmV0dXJuIGRycHlNYXAuZ2V0KGtleSk7XFxuICAgIH1cXG4gICAgaWYgKGRycHlNYXAuc2l6ZSA+PSA1KSB7XFxuICAgICAgbG9nKFxcXCLor7fmsYI6XFxcIiArIGtleSlcXG4gICAgICBkZWwoQXJyYXkuZnJvbShkcnB5TWFwLmtleXMoKSkuYXQoMCkpO1xcbiAgICB9XFxuICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEFsbFNvdXJjZXMoKS5maW5kKHYgPT4gdi5rZXkgPT09IGtleSk7XFxuICAgIGNyZWF0ZURycHkoa2V5KTtcXG4gICAgbGV0IGRycHkgPSBkcnB5TWFwLmdldChrZXkpO1xcbiAgICBkcnB5LmluaXQocnVudGltZUNvbmZpZy5nZXRBYnNvbHV0ZVBhdGgoc291cmNlLmV4dCkpO1xcbiAgICByZXR1cm4gZHJweTtcXG4gIH0sIHRoaXMpLmNhbGwoKTtcXG59XFxuLy9zb3VyY2UuZXh05b+F6aG75Li657ud5a+56Lev5b6EXFxuZnVuY3Rpb24gZ2V0QnlTb3VyY2Uoc291cmNlKXtcXG4gICAgcmV0dXJuIHN5bmMoKCkgPT4ge1xcbiAgICAgICAgbGV0IGtleT1zb3VyY2Uua2V5O1xcbiAgICAgICAgLy9sb2coZHJweU1hcC5zaXplKVxcbiAgICAgICAgaWYgKGRycHlNYXAuaGFzKGtleSkpIHtcXG4gICAgICAgICAgICByZXR1cm4gZHJweU1hcC5nZXQoa2V5KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChkcnB5TWFwLnNpemUgPj0gNSkge1xcbiAgICAgICAgICAgIGxvZyhcXFwi6K+35rGCOlxcXCIgKyBrZXkpXFxuICAgICAgICAgICAgZGVsKEFycmF5LmZyb20oZHJweU1hcC5rZXlzKCkpLmF0KDApKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGNyZWF0ZURycHkoa2V5KTtcXG4gICAgICAgIGxldCBkcnB5ID0gZHJweU1hcC5nZXQoa2V5KTtcXG4gICAgICAgIGRycHkuaW5pdChzb3VyY2UuZXh0KTtcXG4gICAgICAgIHJldHVybiBkcnB5O1xcbiAgICB9LCB0aGlzKS5jYWxsKCk7XFxufVxcbmZ1bmN0aW9uIHB1dChrZXksIGRycHkpIHtcXG4gICAgc3luYygoKSA9PiBkcnB5TWFwLnNldChrZXksIGRycHkpLCB0aGlzKS5jYWxsKCk7XFxufVxcblxcbmZ1bmN0aW9uIGRlbChrZXkpIHtcXG4gICAgc3luYygoKSA9PiB7XFxuICAgICAgICBsb2coXFxcIuWIoOmZpFxcXCIgKyBrZXkpO1xcbiAgICAgICAgaWYgKGRycHlNYXAuaGFzKGtleSkpIHtcXG4gICAgICAgICAgICBkcnB5TWFwLmRlbGV0ZShrZXkpO1xcbiAgICAgICAgfVxcbiAgICB9LCB0aGlzKS5jYWxsKCk7XFxufVxcbmxldCBpc0luaXRIb21lID0gZmFsc2U7XFxuLy9sZXQgaXNJbml0U2VhcmNoID0gZmFsc2U7XFxubGV0IGlzSW5pdEVyUGFnZSA9IGZhbHNlO1xcblxcbmZ1bmN0aW9uIGluaXRQYWdlKHR5cGUpIHtcXG4gICAgc3dpdGNoICh0eXBlKSB7XFxuICAgICAgICBjYXNlIFxcXCJob21lXFxcIjpcXG4gICAgICAgICAgICBpc0luaXRIb21lID0gdHJ1ZTtcXG4gICAgICAgICAgICAvL2Nhc2UgXFxcInNlYXJjaFxcXCI6XFxuICAgICAgICAgICAgLy8gICAgaXNJbml0U2VhcmNoID0gdHJ1ZTtcXG4gICAgICAgIGNhc2UgXFxcImVyXFxcIjpcXG4gICAgICAgICAgICBpc0luaXRlclBhZ2UgPSB0cnVlO1xcbiAgICB9XFxuICAgIGFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoR01rZXksIHR5cGUpID0+IHtcXG4gICAgICAgIGxvZyhcXFwib25DbG9zZVxcXCIpO1xcbiAgICAgICAgR00uaGFzKEdNa2V5LCBEcnB5TWFuYWdlID0+IHtcXG4gICAgICAgICAgICBsb2coXFxcIuaciUdNa2V5XFxcIik7XFxuICAgICAgICAgICAgRHJweU1hbmFnZS5jbGVhcih0eXBlKTtcXG4gICAgICAgIH0pO1xcbiAgICB9LCBHTWtleSwgdHlwZSkpO1xcbn1cXG5cXG5mdW5jdGlvbiBjbGVhcih0eXBlKSB7XFxuICAgIHN3aXRjaCAodHlwZSkge1xcbiAgICAgICAgY2FzZSBcXFwiaG9tZVxcXCI6XFxuICAgICAgICAgICAgaXNJbml0SG9tZSA9IGZhbHNlO1xcbiAgICAgICAgLy9jYXNlIFxcXCJzZWFyY2hcXFwiOlxcbiAgICAgICAgLy8gICAgaXNJbml0U2VhcmNoID0gZmFsc2U7XFxuICAgICAgICBjYXNlIFxcXCJlclxcXCI6XFxuICAgICAgICAgICAgaXNJbml0ZXJQYWdlID0gZmFsc2U7XFxuICAgIH1cXG5cXG4gICAgaWYgKCFpc0luaXRIb21lICYmICFpc0luaXRFclBhZ2UpIHtcXG4gICAgICAgIGxvZyhcXFwi5byA5aeL5riF55CGXFxcIik7XFxuICAgICAgICBkcnB5TWFwLmNsZWFyKCk7XFxuICAgICAgICBHTS5jbGVhcihHTWtleSk7XFxuICAgIH1cXG59XFxuJC5leHBvcnRzID0ge1xcbiAgICBpbml0UGFnZSxcXG4gICAgZ2V0LFxcbiAgICBnZXRCeVNvdXJjZSxcXG4gICAgZGVsLFxcbiAgICBjbGVhcixcXG4gICAgcHV0XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5oyH5a6a5pCc57Si5by556qXXCIsXCJwYXRoXCI6XCJTZWFyY2hBbGxvd1BvcFwiLFwicnVsZVwiOlwianM6XFxuJC5leHBvcnRzLnNob3cgPSBmdW5jdGlvbiAoKSB7XFxuICBjb25zdCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIiwgXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gIGNvbnN0IGhpa2VyUG9wID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD02OTY2XFxcIik7XFxuICBsZXQgc2VhcmNoQWxsb3cgPSBydW50aW1lQ29uZmlnLmdldFNlYXJjaEFsbG93KCk7XFxuXFxuICBsZXQgY2FuU2VhcmNoU291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDYW5TZWFyY2hTb3VyY2UoKTtcXG4gIC8vbGV0IHNvdXJjZU5hbWVMaXN0ID0gY2FuU2VhcmNoU291cmNlLm1hcCh2PT52Lm5hbWUpO1xcbiAgbGV0IGdldE5hbWVzID0gKCkgPT4gZHluYW1pY1NvdXJjZS5tYXAodiA9PiBzZWFyY2hBbGxvdy5pbmNsdWRlcyh2LmtleSkgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArICh2Lm5hbWUgKyBcXFwiXFxcIikuZm9udGNvbG9yKFxcXCIjMDA5OTY2XFxcIikgOiB2Lm5hbWUpO1xcbiAgbGV0IHNwZW4gPSAzO1xcblxcbiAgLy9sZXQgZHluYW1pY05hbWVzID0gc291cmNlTmFtZUxpc3Quc2xpY2UoKTtcXG4gIGxldCBkeW5hbWljU291cmNlID0gY2FuU2VhcmNoU291cmNlLnNsaWNlKCk7XFxuICBsZXQgc2VhcmNob25jb3VudCA9IGR5bmFtaWNTb3VyY2UuZmlsdGVyKHYgPT4gc2VhcmNoQWxsb3cuaW5jbHVkZXModi5rZXkpKS5sZW5ndGg7XFxuICBpZiAoc2VhcmNob25jb3VudCA9PSAwKSB7XFxuICAgIHNlYXJjaG9uY291bnQgPSBjYW5TZWFyY2hTb3VyY2UubGVuZ3RoO1xcbiAgfVxcblxcbiAgbGV0IHNlYXJjaEtleSA9IFxcXCJcXFwiO1xcbiAgaGlrZXJQb3Auc2VsZWN0Qm90dG9tUmVzKHtcXG4gICAgb3B0aW9uczogZ2V0TmFtZXMoKSxcXG4gICAgY29sdW1uczogc3BlbixcXG4gICAgdGl0bGU6IFxcXCLlkK/nlKjmkJzntKLmupA6XFxcIiArIHNlYXJjaG9uY291bnQgKyBcXFwi5LiqIOWFsTpcXFwiICsgY2FuU2VhcmNoU291cmNlLmxlbmd0aCArIFxcXCLkuKrmkJzntKLmupBcXFwiLFxcbiAgICBub0F1dG9EaXNtaXNzOiB0cnVlLFxcbiAgICBwb3NpdGlvbjogMSxcXG4gICAgaGVpZ2h0OiAuOSxcXG4gICAgZXh0cmFJbnB1dEJveDogbmV3IGhpa2VyUG9wLlJlc0V4dHJhSW5wdXRCb3goe1xcbiAgICAgIGhpbnQ6IFxcXCLmupDlhbPplK7lrZcg5aSa5Liq55SofOmalOW8gFxcXCIsXFxuICAgICAgdGl0bGU6IFxcXCJva1xcXCIsXFxuICAgICAgb25DaGFuZ2UodGV4dCwgbWFuYWdlKSB7XFxuICAgICAgICAvL2xvZyhcXFwib25DaGFuZ2U6XFxcIit0ZXh0KVxcbiAgICAgICAgc2VhcmNoS2V5ID0gdGV4dDtcXG4gICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuICAgICAgICBkeW5hbWljU291cmNlLmxlbmd0aCA9IDA7XFxuICAgICAgICBpZiAodGV4dCkge1xcbiAgICAgICAgICBjYW5TZWFyY2hTb3VyY2UuZm9yRWFjaCgodiwgaSkgPT4ge1xcbiAgICAgICAgICAgIGlmICh0ZXh0LnNwbGl0KC9cXFxcfC8pLmZpbHRlcihmID0+IGYpLnNvbWUoeCA9PiB2Lm5hbWUuaW5jbHVkZXMoeCkpKSB7XFxuICAgICAgICAgICAgICBkeW5hbWljU291cmNlLnB1c2godik7XFxuICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHNlYXJjaEFsbG93LmluY2x1ZGVzKHYua2V5KSA/IFxcXCLigJzigJzigJ3igJ1cXFwiICsgKHYubmFtZSArIFxcXCJcXFwiKS5mb250Y29sb3IoXFxcIiMwMDk5NjZcXFwiKSA6IHYubmFtZSlcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgZHluYW1pY1NvdXJjZSA9IGNhblNlYXJjaFNvdXJjZS5zbGljZSgpO1xcbiAgICAgICAgICBPYmplY3QuYXNzaWduKG1hbmFnZS5saXN0LCBnZXROYW1lcygpKTtcXG5cXG4gICAgICAgIH1cXG4gICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICB9LFxcbiAgICAgIGRlZmF1bHRWYWx1ZTogXFxcIlxcXCIsXFxuICAgICAgY2xpY2socywgbWFuYWdlKSB7XFxuICAgICAgICAvL3RvYXN0KHMpO1xcbiAgICAgICAgLy9sb2cobWFuYWdlLmxpc3QpO1xcbiAgICAgIH0sXFxuICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZVxcbiAgICB9KSxcXG4gICAgY2xpY2socywgaSwgbWFuYWdlKSB7XFxuXFxuICAgICAgbGV0IGtleSA9IGR5bmFtaWNTb3VyY2VbaV0ua2V5O1xcbiAgICAgIGxldCBpbmRleCA9IC0xO1xcbiAgICAgIGlmICgoaW5kZXggPSBzZWFyY2hBbGxvdy5pbmRleE9mKGtleSkpICE9PSAtMSkge1xcbiAgICAgICAgbWFuYWdlLmxpc3RbaV0gPSBkeW5hbWljU291cmNlW2ldLm5hbWU7XFxuICAgICAgICBzZWFyY2hBbGxvdy5zcGxpY2UoaW5kZXgsIDEpO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICBtYW5hZ2UubGlzdFtpXSA9IFxcXCLigJzigJzigJ3igJ1cXFwiICsgKGR5bmFtaWNTb3VyY2VbaV0ubmFtZSArIFxcXCJcXFwiKS5mb250Y29sb3IoXFxcIiMwMDk5NjZcXFwiKTtcXG4gICAgICAgIHNlYXJjaEFsbG93LnB1c2goa2V5KTtcXG4gICAgICB9XFxuXFxuICAgICAgcnVudGltZUNvbmZpZy5zZXRTZWFyY2hBbGxvdygpO1xcbiAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgfSxcXG4gICAgbWVudUNsaWNrKG1hbmFnZSkge1xcbiAgICAgIGhpa2VyUG9wLnNlbGVjdENlbnRlcih7XFxuICAgICAgICBvcHRpb25zOiBbXFxcIuaUueWPmOagt+W8j1xcXCIsIFxcXCLnrZvpgInmupBcXFwiLCBcXFwi6Ieq54S25o6S5bqPXFxcIiwgXFxcIuWAkuW6j1xcXCIsIFxcXCLlhajpgIlcXFwiLCBcXFwi5Y+N6YCJXFxcIl0sXFxuICAgICAgICBjb2x1bW5zOiAyLFxcbiAgICAgICAgdGl0bGU6IFxcXCLor7fpgInmi6lcXFwiLFxcbiAgICAgICAgY2xpY2socywgaSkge1xcbiAgICAgICAgICBpZiAoaSA9PT0gMCkge1xcbiAgICAgICAgICAgIHNwZW4gPSBzcGVuID09IDMgPyAxIDogMztcXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlQ29sdW1ucyhzcGVuKTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09PSAxKSB7XFxuICAgICAgICAgICAgaGlrZXJQb3AuaW5wdXRDb25maXJtKHtcXG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFxcXCLovpPlhaXlhbPplK7lrZcg56m65pi+56S65YWo6YOoXFxcIixcXG4gICAgICAgICAgICAgIHRpdGxlOiBcXFwi562b6YCJ5rqQXFxcIixcXG4gICAgICAgICAgICAgIGhpbnQ6IFxcXCLmupDlhbPplK7lrZcg5aSa5Liq55SofOmalOW8gFxcXCIsXFxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHNlYXJjaEtleSxcXG4gICAgICAgICAgICAgIHRleHRhcmVhOiBmYWxzZSwgLy/lpJrooYzmqKHlvI9cXG4gICAgICAgICAgICAgIG1heFRleHRhcmVhOiB0cnVlLFxcbiAgICAgICAgICAgICAgbm9BdXRvU29mdDogZmFsc2UsXFxuICAgICAgICAgICAgICAvL2hpZGVDYW5jZWw6IHRydWUsXFxuICAgICAgICAgICAgICBjb25maXJtKHRleHQpIHtcXG4gICAgICAgICAgICAgICAgc2VhcmNoS2V5ID0gdGV4dDtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICAgICAgZHluYW1pY1NvdXJjZS5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgICAgICBpZiAodGV4dCkge1xcbiAgICAgICAgICAgICAgICAgIGNhblNlYXJjaFNvdXJjZS5mb3JFYWNoKCh2LCBpKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAodGV4dC5zcGxpdCgvXFxcXHwvKS5maWx0ZXIoZiA9PiBmKS5zb21lKHggPT4gdi5uYW1lLmluY2x1ZGVzKHgpKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljU291cmNlLnB1c2godik7XFxuICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goc2VhcmNoQWxsb3cuaW5jbHVkZXModi5rZXkpID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyAodi5uYW1lICsgXFxcIlxcXCIpLmZvbnRjb2xvcihcXFwiIzAwOTk2NlxcXCIpIDogdi5uYW1lKVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UgPSBjYW5TZWFyY2hTb3VyY2Uuc2xpY2UoKTtcXG4gICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKG1hbmFnZS5saXN0LCBnZXROYW1lcygpKTtcXG5cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFxcXCJ0b2FzdDovL+i+k+WFpeS6hlxcXCIgKyB0ZXh0O1xcbiAgICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09PSAyKSB7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBPYmplY3QuYXNzaWduKFtdLCBtYW5hZ2UubGlzdCk7XFxuICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG5cXG5cXG4gICAgICAgICAgICBkeW5hbWljU291cmNlLnNvcnQoKGEsIGIpID0+IHtcXG4gICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoYS5uYW1lKS5sb2NhbGVDb21wYXJlKFN0cmluZyhiLm5hbWUpLCB1bmRlZmluZWQsIHtcXG4gICAgICAgICAgICAgICAgbnVtZXJpYzogdHJ1ZSxcXG4gICAgICAgICAgICAgICAgc2Vuc2l0aXZpdHk6ICdiYXNlJ1xcbiAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtYW5hZ2UubGlzdCwgZ2V0TmFtZXMoKSk7XFxuICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMykge1xcbiAgICAgICAgICAgIG1hbmFnZS5saXN0LnJldmVyc2UoKTtcXG4gICAgICAgICAgICBkeW5hbWljU291cmNlLnJldmVyc2UoKTtcXG5cXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSA0KSB7XFxuICAgICAgICAgICAgZHluYW1pY1NvdXJjZS5mb3JFYWNoKHYgPT4ge1xcbiAgICAgICAgICAgICAgaWYgKCFzZWFyY2hBbGxvdy5pbmNsdWRlcyh2KSkge1xcbiAgICAgICAgICAgICAgICBzZWFyY2hBbGxvdy5wdXNoKHYua2V5KTtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1hbmFnZS5saXN0LCBnZXROYW1lcygpKTtcXG4gICAgICAgICAgICBydW50aW1lQ29uZmlnLnNldFNlYXJjaEFsbG93KCk7XFxuICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gNSkge1xcbiAgICAgICAgICAgIGxldCB0ZW1saXN0ID0gc2VhcmNoQWxsb3cuc2xpY2UoKTtcXG4gICAgICAgICAgICBzZWFyY2hBbGxvdy5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UuZm9yRWFjaCh2ID0+IHtcXG4gICAgICAgICAgICAgIGlmICh0ZW1saXN0LmluY2x1ZGVzKHYua2V5KSkgcmV0dXJuO1xcbiAgICAgICAgICAgICAgc2VhcmNoQWxsb3cucHVzaCh2LmtleSk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtYW5hZ2UubGlzdCwgZ2V0TmFtZXMoKSk7XFxuICAgICAgICAgICAgcnVudGltZUNvbmZpZy5zZXRTZWFyY2hBbGxvdygpO1xcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSxcXG4gICAgICB9KTtcXG4gICAgfVxcbiAgfSk7XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5YiG57G7XCIsXCJwYXRoXCI6XCJjYXRlZ29yeXNcIixcInJ1bGVcIjpcImpzOlxcbmxldCBmbCA9IHt9O1xcbmxldCByZXN1bHRzID0gW107XFxubGV0IGhvbWVsaXN0ID0gW107XFxubGV0IGNhdGUgPSBcXFwiXFxcIjtcXG5cXG5mdW5jdGlvbiBnZXRDYXRlZ29yeXMobGF5b3V0LGRycHksIHBhZ2UpIHtcXG4gIGxldCBydWxlPWRycHkucnVuTWFpbignZnVuY3Rpb24gbWFpbigpe3JldHVybiBydWxlfScpO1xcbiAgbGV0IGxvYWRpPWxheW91dC5maW5kSW5kZXgoeD0+eC5leHRyYSYmeC5leHRyYS5pZD09TVlfUlVMRS50aXRsZStcXFwibG9hZFxcXCIpO1xcbiAgaWYocnVsZS7kuIDnuqc9PVxcXCJcXFwifHxydWxlLuS4gOe6pz09dW5kZWZpbmVkKXtcXG4gICAgaWYgKGxvYWRpICE9IC0xKSB7XFxuICAgICAgbGF5b3V0LnNwbGljZShsb2FkaSwgMSlcXG4gICAgfVxcbiAgICBjbGVhck15VmFyKFxcXCJsaW5rc1xcXCIpO1xcbiAgICBsYXlvdXQubGVuZ3RoPTA7XFxuICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+l5rqQ5Li65pCc57Si5rqQ77yM5LuF6IO96YCa6L+H5pCc57Si6K6/6Zeu5pWw5o2uXFxcIilcXG4gIH1cXG4gIHZhciBnZXRSYW5nZUNvbG9ycyA9IGZ1bmN0aW9uICgpIHtcXG4gICAgcmV0dXJuICcjJyArICgnMDAwMDAnICsgKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAgPDwgMCkudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTYpO1xcbiAgfVxcbiAgbGV0IGNhdGVnb3J5cyA9IEpTT04ucGFyc2UoZHJweS5ob21lKCkpO1xcbiAgbGV0IGZpbHRlcnMgPSBjYXRlZ29yeXMuZmlsdGVycztcXG4gIGxldCBjYXRlcyA9IGNhdGVnb3J5cy5jbGFzcyB8fCBbXTtcXG4gIGlmIChwYWdlID09IDEpIHtcXG4gICAgaG9tZWxpc3QgPSBKU09OLnBhcnNlKGRycHkuaG9tZVZvZCgpKS5saXN0O1xcbiAgICBpZiAoaG9tZWxpc3QgIT0gdW5kZWZpbmVkICYmIGhvbWVsaXN0Lmxlbmd0aCkge1xcbiAgICAgIHB1dE15VmFyKFxcXCJpc2hvbWVcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICB9XFxuICB9XFxuICBpZiAoY2F0ZXMubGVuZ3RoID09IDAgJiYgKGhvbWVsaXN0ID09IHVuZGVmaW5lZCB8fCBob21lbGlzdC5sZW5ndGggPT0gMCkpIHtcXG4gICAgaWYgKGxvYWRpICE9IC0xKSB7XFxuICAgICAgbGF5b3V0LnNwbGljZShsb2FkaSwgMSlcXG4gICAgfVxcbiAgICBjbGVhck15VmFyKFxcXCJsaW5rc1xcXCIpO1xcbiAgICBsYXlvdXQubGVuZ3RoPTA7XFxuICAgIHRocm93IG5ldyBFcnJvcihcXFwi5YiG57G76I635Y+W5aSx6LSl5Y+v6IO9572R57uc6Zeu6aKYXFxcIik7XFxuICB9XFxuICBpZiAoZ2V0TXlWYXIoXFxcImlzaG9tZVxcXCIsIFxcXCIwXFxcIikgPT0gXFxcIjFcXFwiKSB7XFxuICAgIGNhdGVzLnVuc2hpZnQoe1xcbiAgICAgIHR5cGVfbmFtZTogJ+aOqOiNkCcsXFxuICAgICAgdHlwZV9pZDogJ2hvbWUnLFxcbiAgICB9KVxcbiAgfVxcbiAgaWYobG9hZGkhPS0xKXtcXG4gICAgICBsYXlvdXQuc3BsaWNlKGxvYWRpLDEpXFxuICB9XFxuICBwdXRNeVZhcihcXFwibGlua3NcXFwiLFxcXCIxXFxcIik7XFxuICBsZXQgY2F0ZWkgPSBnZXRNeVZhcihcXFwiY2F0ZWlcXFwiLCBcXFwiMFxcXCIpO1xcbiAgY2F0ZSA9IGNhdGVzW2NhdGVpXS50eXBlX2lkO1xcblxcbiAgdmFyIGZvbGQgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJmb2xkXFxcIiwgXFxcIjBcXFwiKTtcXG4gIGxldCBjb2xvciA9IGdldFJhbmdlQ29sb3JzKCk7XFxuXFxuICBpZiAocGFnZSA9PSAxKSB7XFxuICAgIGNhdGVzLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXG4gICAgICBsZXQgdCA9IGNhdGVpID09IGkgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCI8Yj5cXFwiK2l0ZW0udHlwZV9uYW1lLmZvbnRjb2xvcihjb2xvcikgK1xcXCI8L2I+XFxcIjogaXRlbS50eXBlX25hbWU7XFxuICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHQsXFxuICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGksIHRpZCkgPT4ge1xcbiAgICAgICAgICBwdXRNeVZhcihcXFwiY2F0ZWlcXFwiLCBpKTtcXG4gICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIGksIGl0ZW0udHlwZV9pZCksXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgdGlkOiBpdGVtLnR5cGVfaWQsXFxuICAgICAgICAgIGFjdGl2ZTogY2F0ZWkgPT0gaSA/IHRydWUgOiBmYWxzZSxcXG4gICAgICAgIH1cXG4gICAgICB9KVxcbiAgICB9KVxcbiAgfVxcblxcbiAgaWYgKGNhdGUgIT0gJ2hvbWUnICYmIHBhZ2UgPT0gMSkge1xcbiAgICBsZXQgaG9tZWkgPSBsYXlvdXQuZmluZEluZGV4KHggPT4ge1xcbiAgICAgIHJldHVybiB4LmV4dHJhICYmIHguZXh0cmEudGlkID09IFxcXCJob21lXFxcIlxcbiAgICB9KTtcXG4gICAgaWYgKGhvbWVpID09IC0xKSB7XFxuICAgICAgaG9tZWkgPSBsYXlvdXQuZmluZEluZGV4KHggPT4ge1xcbiAgICAgICAgcmV0dXJuIHguZXh0cmEgJiYgeC5leHRyYS50aWQ7XFxuICAgICAgfSkgLSAxO1xcbiAgICB9XFxuICAgIGlmIChmaWx0ZXJzICYmIGZpbHRlcnMuaGFzT3duUHJvcGVydHkoY2F0ZSkpIHtcXG4gICAgICBpZiAoaG9tZWkgIT0gLTEpIHtcXG4gICAgICAgIGxheW91dC5zcGxpY2UoaG9tZWkgKyAxLCAwLCB7XFxuICAgICAgICAgIHRpdGxlOiBmb2xkID09IFxcXCIwXFxcIiA/IFxcXCLigJzigJzigJ3igJ08Yj5cXFwiICsgXFxcIuKIp1xcXCIuZm9udGNvbG9yKFxcXCIjMWFhZDE5XFxcIikgKyBcXFwiPC9iPlxcXCIgOiBcXFwi4oCc4oCc4oCd4oCdPGI+XFxcIiArIFxcXCLiiKhcXFwiLmZvbnRjb2xvcihcXFwiI0ZGMDAwMFxcXCIpICsgXFxcIjwvYj5cXFwiLFxcbiAgICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiLFxcbiAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGZvbGQpID0+IHtcXG4gICAgICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJmb2xkXFxcIiwgZm9sZCA9PSBcXFwiMFxcXCIgPyBcXFwiMVxcXCIgOiBcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgfSwgZm9sZCksXFxuICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgICB9XFxuXFxuICAgICAgbGV0IGFjdGl2ZWkgPSBsYXlvdXQuZmluZEluZGV4KHggPT4geC5leHRyYSAmJiB4LmV4dHJhLmFjdGl2ZSk7XFxuICAgICAgaWYgKGFjdGl2ZWkgIT0gLTEpIHtcXG4gICAgICAgIGxheW91dC5zcGxpY2UoYWN0aXZlaSwgMCwge1xcbiAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyAn8J+MgCcsXFxuICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoYykgPT4ge1xcbiAgICAgICAgICAgIGxldCBjYXRlX29iaiA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJjYXRlX29ialxcXCIsIHt9KTtcXG4gICAgICAgICAgICBkZWxldGUgY2F0ZV9vYmpbY107XFxuICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcImNhdGVfb2JqXFxcIiwgY2F0ZV9vYmopO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+a4hemZpOWujOaIkFxcXCI7XFxuICAgICAgICAgIH0sIGNhdGUpXFxuICAgICAgICB9KVxcbiAgICAgIH1cXG5cXG4gICAgICBsZXQgY2xhc3NpZnkgPSBmaWx0ZXJzW2NhdGVdO1xcbiAgICAgIHZhciBpbml0X2NhdGUgPSBuZXcgQXJyYXkoY2xhc3NpZnkubGVuZ3RoKS5maWxsKFxcXCItMVxcXCIpO1xcbiAgICAgIGxldCBjYXRlX29iaiA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJjYXRlX29ialxcXCIsIHt9KTtcXG4gICAgICBjYXRlX29ialtjYXRlXSA9IGNhdGVfb2JqW2NhdGVdID8gY2F0ZV9vYmpbY2F0ZV0gOiBpbml0X2NhdGVcXG4gICAgICB2YXIgY2F0ZV90ZW1wID0gY2F0ZV9vYmpbY2F0ZV07XFxuICAgICAgLy92YXIgZmlsdGVyX2RlZj1zdG9yYWdlMC5nZXRJdGVtKFxcXCJmaWx0ZXJfZGVmXFxcIiwge30pO1xcbiAgICAgIGNsYXNzaWZ5LmZvckVhY2goKHgsIGluZGV4KSA9PiB7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgIGNvbF90eXBlOiAnYmxhbmtfYmxvY2snXFxuICAgICAgICB9KVxcbiAgICAgICAgeC52YWx1ZS5mb3JFYWNoKChpdCwgaSkgPT4ge1xcbiAgICAgICAgICBsZXQgdCA9IGl0Lm47XFxuICAgICAgICAgIGlmIChjYXRlX3RlbXBbaW5kZXhdID09IGkpIHtcXG4gICAgICAgICAgICB0ID0gXFxcIjxiPjxmb250IGNvbG9yPVxcXCIgKyBjb2xvciArIFxcXCI+XFxcIiArIHQgKyBcXFwiPC9mb250PjwvYj5cXFwiO1xcbiAgICAgICAgICAgIGZsW3gua2V5XSA9IGl0LnY7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKGNhdGVfdGVtcFtpbmRleF0gPT0gXFxcIi0xXFxcIikge1xcbiAgICAgICAgICAgIGZsW3gua2V5XSA9IFxcXCJ1bmRlZmluZWRcXFwiO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGlmIChmb2xkID09IDEpIHtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyB0LFxcbiAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChvKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBpID0gby5pO1xcbiAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwiaXNfZGVmXFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IGNhdGVfb2JqID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImNhdGVfb2JqXFxcIiwge30pO1xcblxcbiAgICAgICAgICAgICAgICBsZXQgY2F0ZV90ZW1wID0gby5jYXRlX3RlbXA7XFxuICAgICAgICAgICAgICAgIGlmIChjYXRlX3RlbXAuY29uc3RydWN0b3IgIT0gQXJyYXkpIHtcXG4gICAgICAgICAgICAgICAgICBjYXRlX3RlbXAgPSBbXTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBvLmluZGV4O1xcbiAgICAgICAgICAgICAgICBsZXQgYyA9IGNhdGVfdGVtcFtpbmRleF0gfHwgXFxcIi0xXFxcIjtcXG4gICAgICAgICAgICAgICAgLy9sb2coYylcXG4gICAgICAgICAgICAgICAgaWYgKGMgPT0gaSkge1xcbiAgICAgICAgICAgICAgICAgIG8uY2F0ZV90ZW1wW2luZGV4XSA9IFxcXCItMVxcXCI7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgby5jYXRlX3RlbXBbaW5kZXhdID0gaSArIFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGNhdGVfb2JqW28uY2F0ZV0gPSBjYXRlX3RlbXA7XFxuICAgICAgICAgICAgICAgIC8vbG9nKGNhdGVfdGVtcClcXG4gICAgICAgICAgICAgICAgLy9zdG9yYWdlMC5wdXRNeVZhcihcXFwiY2F0ZV90ZW1wXFxcIiwgY2F0ZV90ZW1wKTtcXG4gICAgICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcImNhdGVfb2JqXFxcIiwgY2F0ZV9vYmopO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXFxuICAgICAgICAgICAgICAgIGNhdGVfdGVtcDogY2F0ZV90ZW1wLFxcbiAgICAgICAgICAgICAgICBpOiBpLFxcbiAgICAgICAgICAgICAgICBjYXRlOiBjYXRlXFxuICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgICB9KVxcbiAgICB9XFxuICB9XFxufVxcblxcbmZ1bmN0aW9uIGdldEZsKCkge1xcbiAgZmwgPSBPYmplY3Qua2V5cyhmbCkuZmlsdGVyKGtleSA9PiBmbFtrZXldICE9PSBcXFwidW5kZWZpbmVkXFxcIikucmVkdWNlKChyZXMsIGtleSkgPT4ge1xcbiAgICByZXNba2V5XSA9IGZsW2tleV07XFxuICAgIHJldHVybiByZXM7XFxuICB9LCB7fSk7XFxuICByZXR1cm4gZmxcXG59XFxuXFxuZnVuY3Rpb24gZ2V0Q2F0ZUxpc3QoKSB7XFxuICByZXR1cm4ge1xcbiAgICBjYXRlLFxcbiAgICBob21lbGlzdFxcbiAgfVxcbn1cXG5cXG5cXG4kLmV4cG9ydHMgPSB7XFxuICBnZXRjYXRlbGlzdDogZ2V0Q2F0ZUxpc3QsXFxuICBnZXRjYXRlZ29yeXM6IGdldENhdGVnb3J5cyxcXG4gIGdldGZsOiBnZXRGbFxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuacrOWcsOinhOWImeeuoeeQhlwiLFwicGF0aFwiOlwiTG9jYWxEaXJcIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi5paH5Lu2566h55CGXFxcIik7XFxubGV0IHBhdGggPSBnZXRQYXRoKFN0cmluZyhNWV9QQVJBTVMuY3BhdGgpKS5yZXBsYWNlKFxcXCJmaWxlOi8vXFxcIiwgXFxcIlxcXCIpO1xcbmxldCBmaWxlU2VsZWN0ID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcIik7XFxuZmlsZVNlbGVjdC5maWxlU2VsZWN0aW9uKHtcXG4gICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgcmV0dXJuIFxcXCJlZGl0RmlsZTovL2ZpbGU6Ly9cXFwiICsgUEFUSDtcXG4gICAgfSksXFxuICAgIG1lbW9yeTogXFxcImZpbGVwYXRoXFxcIixcXG4gICAgZmlsZVR5cGU6IFxcXCIuanNcXFwiLFxcbiAgICBleGl0U2VhcmNoUmVmcmVzaDogdHJ1ZSxcXG4gICAgcGF0dGVybjogMCxcXG4gICAgcm9vdERpclBhdGg6IHBhdGgsXFxuICAgIGluaXRpYWxQYXRoOiBwYXRoLFxcbn0sIE1ZX1BBUkFNUy5uZXdXaW5kb3cgPyBbXSA6IFt7XFxuICAgIHRpdGxlOiBcXFwi5paw56qX5Y+j5omT5byAXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL0xvY2FsRGlyI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBjcGF0aDogTVlfUEFSQU1TLmNwYXRoLFxcbiAgICAgICAgbmV3V2luZG93OiB0cnVlLFxcbiAgICAgICAgd2luZG93SWQ6IE1ZX1JVTEUudGl0bGUgKyBcXFwiQGVkaXRmaWxlXFxcIixcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIHBhZ2VUaXRsZTogXFxcIuaWh+S7tueuoeeQhlxcXCJcXG4gICAgfVxcbn1dKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIum7mOiupOS/neWtmOmAieaLqVwiLFwicGF0aFwiOlwic2hhcmVkZWZhdWx0cGF0aFwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLkv53lrZjot6/lvoRcXFwiKTtcXG5sZXQgbGF5b3V0ID0gW107XFxubGV0IGYgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFwiKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gICAgY2xlYXJNeVZhcihcXFwiZHJweUhpa2VyX3NoYXJlX2lucHV0XFxcIik7XFxufSk7XFxuXFxubGV0IHBhdGggPSBqb2luVXJsKGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvXFxcIiksIFxcXCIuLi9cXFwiLnJlcGVhdCg1KSkuc2xpY2UoNyk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqVxcXCIsXFxuICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXCIpLmV4dHJhO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgcm9vdERpclBhdGg6IHBhdGgsXFxuICAgICAgICBpbml0aWFsUGF0aDogcGF0aCxcXG4gICAgICAgIHBhdHRlcm46IDFcXG4gICAgfSkpLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuWCqOWtmOi3r+W+hFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfc2hhcmVfaW5wdXRcXFwiLCBnZXRQdWJsaWNJdGVtKFxcXCJEcnB5SGlrZXJAaW5wdXRfcGF0aFxcXCIsIFxcXCJcXFwiKSksXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfc2hhcmVfaW5wdXRcXFwiXFxuICAgIH1cXG59KTtcXG5cXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi56Gu6K6kXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpZCkgPT4ge1xcbiAgICAgICAgbGV0IHBhdGggPSBnZXRNeVZhcihcXFwiZHJweUhpa2VyX3NoYXJlX2lucHV0XFxcIiwgXFxcIlxcXCIpO1xcblxcbiAgICAgICAgaWYgKCFwYXRoKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S4jeWPr+S4uuepulxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBzZXRQdWJsaWNJdGVtKFxcXCJEcnB5SGlrZXJAaW5wdXRfcGF0aFxcXCIsIHBhdGgpO1xcbiAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxufSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlsI/or7RcIixcInBhdGhcIjpcIm5vdmVsXCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZHJweSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpLmdldEJ5U291cmNlKE1ZX1BBUkFNUy5zb3VyY2UpO1xcbmxldCBwbGF5ID0gSlNPTi5wYXJzZShkcnB5LnBsYXkoTVlfUEFSQU1TLmZyb20sIE1ZX1BBUkFNUy5pZCwgW10pKTtcXG5cXG5sZXQgZGF0YSA9IEpTT04ucGFyc2UocGxheS51cmwucmVwbGFjZShcXFwibm92ZWw6Ly9cXFwiLCBcXFwiXFxcIikpO1xcbmxldCBsYXlvdXQgPSBbXTtcXG5sZXQgY29udGVudCA9IFxcXCLjgIDjgIBcXFwiICsgZGF0YS5jb250ZW50LnNwbGl0KC8oXFxcXG58XFxcXHIpKy8pLmZpbHRlcihpdCA9PiBpdC50cmltKCkubGVuZ3RoID4gMSkubWFwKGl0ID0+IGl0LnRyaW0oKSkuam9pbihcXFwiPGJyPuOAgOOAgFxcXCIpO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICB0aXRsZTogKFxcXCI8c3Ryb25nPlxcXCIgKyAoZGF0YS50aXRsZXx8Z2V0UGFnZVRpdGxlKCkpICsgXFxcIjwvc3Ryb25nPlxcXCIpLmJpZygpLFxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IGNvbnRlbnQsXFxuICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRleHRTaXplOiAxOCxcXG4gICAgICAgIGNsaWNrOiB0cnVlXFxuICAgIH1cXG59KTtcXG5zZXRSZXN1bHQobGF5b3V0KTtcIn1dIiwiaWNvbiI6IiIsInByb3h5IjoiIn0=
Add Comment
Please, Sign In to add comment