Advertisement
xiaomianao666

邀您一起看:声荐(原鲨鱼听书)

Nov 10th, 2023
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥声荐(原鲨鱼听书)@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImdtdE1vZGlmaWVkXCI6MCxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJcIixcImxpc3RUb0NsZWFyQXNzb2NpYXRlZEZLXCI6W10sXCJsaXN0VG9DbGVhclNlbGZGS1wiOltdLFwicGFnZUxpc3RcIjpbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuinhOWImeWkhOeQhlwiLFwicGF0aFwiOlwiZGF0YVwiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gZG91YmxlVHJlYXRpbmcob3Blbk1vZGUsIGZpbmRBbGlVcmwsIHRpdGxlKSB7XFxuICAgIGxldCBhbGlVcmwgPSBpbnB1dDtcXG4gICAgbGV0IHNoYXJlUHdkO1xcbiAgICBpZiAoZmluZEFsaVVybCkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZpbmRBbGlVcmwoYWxpVXJsKTtcXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcXFwic3RyaW5nXFxcIilcXG4gICAgICAgICAgICBhbGlVcmwgPSByZXN1bHQ7XFxuICAgICAgICBlbHNlXFxuICAgICAgICAgICAgYWxpVXJsID0gcmVzdWx0LmFsaVVybCwgc2hhcmVQd2QgPSByZXN1bHQuc2hhcmVQd2Q7XFxuICAgIH1cXG4gICAgaWYgKGFsaVVybC5pbmNsdWRlcyhcXFwid3d3LmFsaXl1bmRyaXZlLmNvbS9zL1xcXCIpKSB7XFxuICAgICAgICBpZiAob3Blbk1vZGUgPT09IFxcXCLmnKzlnLDovaznoIFcXFwiKSB7XFxuICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL3BhZ2UvYWxpeXVuP3BhZ2U9ZnlwYWdlJnJ1bGU9JyArIHRpdGxlICsgJyZyZWFsdXJsPScgKyBlbmNvZGVVUklDb21wb25lbnQoYWxpVXJsKSArIFxcXCImc2hhcmVQd2Q9XFxcIiArIChzaGFyZVB3ZCB8fCBcXFwiXFxcIik7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHNoYXJlSWQgPSBhbGlVcmwuc3BsaXQoXFxcIi9cXFwiKVs0XTtcXG4gICAgICAgICAgICByZXR1cm4gJ3NtYXJ0ZHJpdmU6Ly9zaGFyZS9icm93c2U/c2hhcmVJZD0nICsgc2hhcmVJZCArICcmc2hhcmVQd2Q9JyArIChzaGFyZVB3ZCB8fCBcXFwiXFxcIik7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSBpZiAoYWxpVXJsLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgICAgcmV0dXJuIFxcXCJ3ZWI6Ly9cXFwiICsgYWxpVXJsO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmV0dXJuIGFsaVVybDtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBnZXRNb2RlVXJsKGFsaVVybCwgc2hhcmVQd2QsIG9wZW5Nb2RlKSB7XFxuICAgIGlmIChhbGlVcmwuaW5jbHVkZXMoXFxcInd3dy5hbGl5dW5kcml2ZS5jb20vcy9cXFwiKSkge1xcbiAgICAgICAgaWYgKG9wZW5Nb2RlID09PSBcXFwi5pys5Zyw6L2s56CBXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9wYWdlL2FsaXl1bj9wYWdlPWZ5cGFnZSZydWxlPScgKyBNWV9SVUxFLnRpdGxlICsgJyZyZWFsdXJsPScgKyBlbmNvZGVVUklDb21wb25lbnQoYWxpVXJsKSArIFxcXCImc2hhcmVQd2Q9XFxcIiArIChzaGFyZVB3ZCB8fCBcXFwiXFxcIik7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHNoYXJlSWQgPSBhbGlVcmwuc3BsaXQoXFxcIi9cXFwiKVs0XTtcXG4gICAgICAgICAgICByZXR1cm4gJ3NtYXJ0ZHJpdmU6Ly9zaGFyZS9icm93c2U/c2hhcmVJZD0nICsgc2hhcmVJZCArICcmc2hhcmVQd2Q9JyArIChzaGFyZVB3ZCB8fCBcXFwiXFxcIik7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSBpZiAoYWxpVXJsLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgICAgcmV0dXJuIFxcXCJ3ZWI6Ly9cXFwiICsgYWxpVXJsO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmV0dXJuIGFsaVVybDtcXG4gICAgfVxcbn1cXG5cXG4kLmV4cG9ydHMuY2FycnlSdWxlID0gZnVuY3Rpb24ocnVsZSwgcywgcGFnZSwgc2VhcmNoTW9kZSwgb3Blbk1vZGUpIHtcXG4gICAgbGV0IGxpc3QgPSBydWxlLmZpbmQocywgcGFnZSk7XFxuICAgIGlmICghbGlzdCkgcmV0dXJuIFtdO1xcbiAgICBsZXQgdXJsTGF6eSA9ICQoXFxcIlxcXCIpLmxhenlSdWxlKGRvdWJsZVRyZWF0aW5nLCBvcGVuTW9kZSwgcnVsZS5maW5kQWxpVXJsLCBNWV9SVUxFLnRpdGxlKTtcXG4gICAgbGV0IGRlc2NUaXBzID0gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBydWxlLm5hbWUuZm9udGNvbG9yKFxcXCIjZjEzYjY2YVxcXCIpICsgXFxcIiZuYnNwO1xcXCI7XFxuICAgIGxldCByZXNMaXN0ID0gW107XFxuXFxuICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcXG4gICAgICAgIGlmIChpdC5za2lwKSB7XFxuICAgICAgICAgICAgcmVzTGlzdC5wdXNoKGl0KTtcXG4gICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChzZWFyY2hNb2RlICYmICFzZWFyY2hDb250YWlucyhpdC50aXRsZSwgcywgdHJ1ZSkpIGNvbnRpbnVlO1xcbiAgICAgICAgaXQudXJsID0gcnVsZS5maW5kQWxpVXJsID8gaXQudXJsICsgdXJsTGF6eSA6IGdldE1vZGVVcmwoaXQudXJsLCBpdC5zaGFyZVB3ZCB8fCBcXFwiXFxcIiwgb3Blbk1vZGUpO1xcbiAgICAgICAgcmVzTGlzdC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXQudGl0bGUuaW5jbHVkZXMoXFxcIuKAnOKAnOKAneKAnVxcXCIpID8gaXQudGl0bGUgOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIGl0LnRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cChcXFwiPGVtPnw8L2VtPlxcXCIsIFxcXCJnXFxcIiksIFxcXCJcXFwiKS5yZXBsYWNlKG5ldyBSZWdFeHAocywgXFxcImdcXFwiKSwgXFxcIjxzdHJvbmc+PHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogIzFFOTBGRlxcXFxcXFwiPlxcXCIgKyBzICsgXFxcIjwvc3Bhbj48L3N0cm9uZz5cXFwiKSxcXG4gICAgICAgICAgICBkZXNjOiBkZXNjVGlwcyArIChpdC5kZXNjfHxcXFwiXFxcIiksXFxuICAgICAgICAgICAgdXJsOiBpdC51cmwsXFxuICAgICAgICAgICAgcGljX3VybDogaXQucGljX3VybCxcXG4gICAgICAgICAgICBjb2xfdHlwZTogaXQucGljX3VybCA/ICdtb3ZpZV8xX3ZlcnRpY2FsX3BpYycgOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih7XFxuICAgICAgICAgICAgICAgIGluaGVyaXRUaXRsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgIG5vUGljOiB0cnVlXFxuICAgICAgICAgICAgfSwgaXQuZXh0cmEpXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICByZXR1cm4gcmVzTGlzdDtcXG59XFxubGV0IHNpemUgPSAxMDtcXG5cXG5sZXQgcnVsZXMgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9ydWxlc1xcXCIpO1xcbmxldCBmb3JiaWRkZW4gPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJmb3JiaWRkZW5cXFwiLCBbXSk7XFxucnVsZXM9cnVsZXMuZmlsdGVyKHYgPT4gIWZvcmJpZGRlbi5pbmNsdWRlcyh2Lm5hbWUpKTtcXG5cXG4kLmV4cG9ydHMuZ2V0RGF0YSA9IGZ1bmN0aW9uKHBhZ2UsIHJ1bGUpIHtcXG4gICAgaWYgKCFwYWdlICYmICFydWxlKSB7XFxuICAgICAgICByZXR1cm4gcnVsZXMubWFwKGl0ID0+IGl0Lm5hbWUpO1xcbiAgICB9XFxuICAgIGlmIChydWxlICE9IG51bGwpIHtcXG4gICAgICAgIGlmIChwYWdlICE9IG51bGwgJiYgcGFnZSA+IDEpIHtcXG4gICAgICAgICAgICByZXR1cm4gcnVsZXMuZmlsdGVyKGkgPT4gaS5uYW1lID09IHJ1bGUgJiYgaS5wYWdlKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBydWxlcy5maWx0ZXIoaSA9PiBpLm5hbWUgPT0gcnVsZSk7XFxuICAgIH1cXG4gICAgbGV0IHN0YXJ0ID0gKHBhZ2UgLSAxKSAqIHNpemU7XFxuICAgIGlmIChydWxlcy5sZW5ndGggPCBzdGFydCArIDEpIHtcXG4gICAgICAgIHJldHVybiBbXTtcXG4gICAgfVxcbiAgICBsZXQgbGVuID0gc2l6ZTtcXG4gICAgaWYgKHJ1bGVzLmxlbmd0aCA8IHBhZ2UgKiBzaXplKSB7XFxuICAgICAgICBsZW4gPSBydWxlcy5sZW5ndGggLSBzdGFydFxcbiAgICB9XFxuICAgIHJldHVybiBydWxlcy5zbGljZShzdGFydCwgc3RhcnQgKyBsZW4pO1xcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuaQnOe0oumhtemdolwiLFwicGF0aFwiOlwic291XCIsXCJydWxlXCI6XCJqczpcXG5mdW5jdGlvbiBzZXRDbGlwKCkge1xcbiAgICBmdW5jdGlvbiBnZXRDb3B5KCkge1xcbiAgICAgICAgY29uc3QgQ29udGV4dCA9IGFuZHJvaWQuY29udGVudC5Db250ZXh0O1xcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNvbS5leGFtcGxlLmhpa2Vydmlldy51aS5BcHBsaWNhdGlvbigpLmdldENvbnRleHQoKTtcXG4gICAgICAgIC8vIOiOt+WPluezu+e7n+WJqui0tOadv1xcbiAgICAgICAgbGV0IGNsaXBib2FyZCA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNMSVBCT0FSRF9TRVJWSUNFKTtcXG4gICAgICAgIC8vIOi/lOWbnuaVsOaNrlxcbiAgICAgICAgbGV0IGNsaXBEYXRhID0gY2xpcGJvYXJkLmdldFByaW1hcnlDbGlwKCk7XFxuICAgICAgICBpZiAoY2xpcERhdGEgIT0gbnVsbCAmJiBjbGlwRGF0YS5nZXRJdGVtQ291bnQoKSA+IDApIHtcXG4gICAgICAgICAgICAvLyDku47mlbDmja7pm4bkuK3ojrflj5bvvIjnspjotLTvvInnrKzkuIDmnaHmlofmnKzmlbDmja5cXG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKGNsaXBEYXRhLmdldEl0ZW1BdCgwKS5nZXRUZXh0KCkudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gbnVsbDtcXG4gICAgfVxcbiAgICBsZXQgdGV4dCA9IGdldENvcHkoKSB8fCBcXFwiXFxcIjtcXG4gICAgbGV0IHVybCA9IHRleHQubWF0Y2goL2h0dHAuKj93d3cuYWxpeXVuZHJpdmUuY29tXFxcXC9zXFxcXC9bYS16QS1aMC05XXsxMX0oXFxcXC9mb2xkZXJcXFxcL1thLXowLTldezQwfSk/Lyk7XFxuICAgIHVybCA9IEFycmF5LmlzQXJyYXkodXJsKSAmJiB1cmxbMF07XFxuICAgIGlmICh1cmwpIHtcXG4gICAgICAgIGxldCBjYWNoZSA9IGdldEl0ZW0oXFxcImNsaXBib2FyZENhY2hlXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgaWYgKHVybCAhPT0gY2FjaGUpIHtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxmb250IGNvbG9yPVxcXCIjMTNCNjFCXFxcIj7ilpAgPC9mb250PjxiPua4qemmqOaPkOekujxiPicsXFxuICAgICAgICAgICAgICAgIGRlc2M6IFxcXCLmo4DmtYvliLDliarotLTmnb/lkKvmnInpmL/ph4zpk77mjqXmmK/lkKbmiZPlvIA/XFxcXG5cXFwiICsgdXJsLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlucHV0LCBpZCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbShpZCArIFxcXCJjbGlwYm9hcmRcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2FsaXl1bj9wYWdlVGl0bGU95omT5byA6ZO+5o6lJnBhZ2U9ZnlwYWdlJnJlYWx1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChpbnB1dCk7XFxuICAgICAgICAgICAgICAgIH0sIHVybCwgaWQpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogaWQgKyBcXFwiY2xpcGJvYXJkXFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwiY2xpcGJvYXJkQ2FjaGVcXFwiLCB1cmwpO1xcbiAgICAgICAgfVxcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIHNldEhlYWQoKSB7XFxuICAgIGlmIChvcGVuTW9kZSA9PSBcXFwi5pys5Zyw6L2s56CBXFxcIikge1xcbiAgICAgICAgbGV0IGFsaVRva2Vuc0ZpbGVwYXRoID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdG9rZW5QYXRoXFxcIikuYWxpVG9rZW5zRmlsZXBhdGg7XFxuICAgICAgICBsZXQgYSA9IGZldGNoKGFsaVRva2Vuc0ZpbGVwYXRoKTtcXG4gICAgICAgIGlmICghYSB8fCBhID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICc8Zm9udCBjb2xvcj1cXFwiIzEzQjYxQlxcXCI+4paQIDwvZm9udD48Yj7muKnppqjmj5DnpLo8Yj4nLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLmnKrmo4DmtYvliLDnmbvlvZXkv6Hmga/vvIzngrnmiJHot7PovaznmbvlvZXotKblj7fpobXpnaLvvIznmbvlvZXpmL/ph4zkupHnm5jotKblj7flkI7mlrnlj6/kvb/nlKjmnKzlnLDovaznoIHmqKHlvI9cXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBcXFwi55m75b2V6Zi/6YeM5LqR55uYXFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcInNcXFwiKTtcXG4gICAgfSkpO1xcbiAgICBhZGRMaXN0ZW5lcihcXFwib25SZWZyZXNoXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBpZiAoIWdldE15VmFyKFxcXCJyZWZzXFxcIiwgXFxcIlxcXCIpKSB7XFxuICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwic1xcXCIpO1xcbiAgICAgICAgfVxcbiAgICB9KSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuaQnOe0ou+8mlxcXCIgKyBbXFxcIum7mOiupFxcXCIsIFxcXCLnsr7lh4ZcXFwiXVtzZWFyY2hNb2RlXSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgc2V0U2VhcmNoTW9kZShnZXRTZWFyY2hNb2RlKCkgPyAwIDogMSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzJfcm91bmRcXFwiLFxcbiAgICAgICAgZGVzYzogXFxcIlxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9zZWFyY2g2XFxcIlxcbiAgICB9KTtcXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5qih5byP77yaXFxcIiArIG9wZW5Nb2RlLFxcbiAgICAgICAgdXJsOiBcXFwic2VsZWN0Oi8vXFxcIiArIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIumAieaLqeaooeW8j1xcXCIsXFxuICAgICAgICAgICAgb3B0aW9uczogW1xcXCLmqKHlvI/vvJrmnKzlnLDovaznoIFcXFwiLCBcXFwi5qih5byP77ya5a6Y5pa5QVBQXFxcIiwgXFxcIueZu+W9lei0puWPtzFcXFwiLCBcXFwi55m75b2V6LSm5Y+3MlxcXCIsIFxcXCJUb2tlbueZu+W9lVxcXCIsIFxcXCLnmbvlvZXkv6Hmga9cXFwiLCBcXFwi6KeE5YiZ56aB55SoXFxcIiwgXFxcIuaUr+aMgeS9nOiAhVxcXCJdLFxcbiAgICAgICAgICAgIGNvbDogMSxcXG4gICAgICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGlmIChcXFwi55m75b2V6LSm5Y+3MVxcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9wYWdlVGl0bGU955m75b2V6Zi/6YeM5LqR55uYXFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChcXFwi55m75b2V6LSm5Y+3MlxcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9pbmRleD0wJnBhZ2VUaXRsZT3nmbvlvZXpmL/ph4zkupHnm5hcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKFxcXCLop4TliJnnpoHnlKhcXFwiID09IGlucHV0KSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9SdWxlRGlzYWJsZSNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChcXFwi5pSv5oyB5L2c6ICFXFxcIiA9PSBpbnB1dCkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvRG9uYXRlLnYjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAoXFxcIlRva2Vu55m75b2VXFxcIiA9PSBpbnB1dCkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIlxcXCIsIFxcXCLovpPlhaVUb2tlblxcXCIpLmlucHV0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWxpVG9rZW5zRmlsZXBhdGggPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS90b2tlblBhdGhcXFwiKS5hbGlUb2tlbnNGaWxlcGF0aDtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWxpVG9rZW4gPSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IGlucHV0LnRyaW0oKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVGaWxlKGFsaVRva2Vuc0ZpbGVwYXRoLCBKU09OLnN0cmluZ2lmeShhbGlUb2tlbikpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAoXFxcIueZu+W9leS/oeaBr1xcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuVG9rZW5zRmlsZXBhdGgsXFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpVG9rZW5zRmlsZXBhdGhcXG4gICAgICAgICAgICAgICAgICAgIH0gPSAkLnJlcXVpcmUoXFxcInRva2VuUGF0aFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlRXhpc3QoYWxpVG9rZW5zRmlsZXBhdGgpKSByZXR1cm4gXFxcInRvYXN0Oi8v6L+Y5pyq55m76ZmGXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBhbGkgPSByZXF1ZXN0KGFsaVRva2Vuc0ZpbGVwYXRoKTtcXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpID0gSlNPTi5wYXJzZShhbGkpO1xcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGUoYWxpVG9rZW5zRmlsZXBhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/ojrflj5blpLHotKVcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfnmbvlvZXkv6Hmga8nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFxcXCLnlKjmiLc6XFxcIiArIChhbGkubmlja19uYW1lIHx8IGFsaS51c2VyX25hbWUgfHwgXFxcIlRva2Vu55m75b2VXFxcIikgKyBcXFwiXFxcXG5Ub2tlbjpcXFwiICsgYWxpLnJlZnJlc2hfdG9rZW4gKyBcXFwiXFxcXG4o5Y+W5raI77ya5rOo6ZSA55m75b2V77yb56Gu5a6a77ya5aSN5Yi2VG9rZW4pXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtOiAkLnRvU3RyaW5nKCh0b2tlbikgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgdG9rZW47XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgYWxpLnJlZnJlc2hfdG9rZW4pLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbDogJC50b1N0cmluZygocGF0aDEsIHBhdGgyKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLnoa7orqTms6jplIDnmbvlvZVcXFwiKS5jb25maXJtKChwYXRoMSwgcGF0aDIpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGUocGF0aDEpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlRmlsZShwYXRoMik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suaIkOWKn+mAgOWHuueZu+mZhlxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHBhdGgxLCBwYXRoMik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgYWxpVG9rZW5zRmlsZXBhdGgsIG9wZW5Ub2tlbnNGaWxlcGF0aClcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZShcXFwi5qih5byP77yaXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJvcGVuTW9kZVxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID09IFxcXCLlrpjmlrlBUFBcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5Yqf77yM6K+356Gu5L+d5omL5py65pyJ5a6J6KOF6Zi/6YeM5LqR55uY5a6Y5pa5QVBQXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl8yX3JvdW5kXFxcIixcXG4gICAgICAgIGRlc2M6IFxcXCJcXFwiLFxcbiAgICAgICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fbWVudTZcXFwiXFxuICAgIH0pO1xcblxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfmkJzntKInLFxcbiAgICAgICAgZGVzYzogJ+ivt+i+k+WFpeWFs+mUruivjS/pk77mjqUnLFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIGlucHV0ID0gaW5wdXQudHJpbSgpO1xcbiAgICAgICAgICAgIGlmIChpbnB1dC5zdGFydHNXaXRoKFxcXCJodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy9cXFwiKSkge1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJzXFxcIik7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2FsaXl1bj9wYWdlVGl0bGU95omT5byA6ZO+5o6lJnBhZ2U9ZnlwYWdlJnJlYWx1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChpbnB1dCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHB1dE15VmFyKCdzJywgaW5wdXQpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICAgICAgfSksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBcXFwicHV0TXlWYXIoJ3JlZnMnLGlucHV0KVxcXCIsXFxuICAgICAgICAgICAgaWQ6IGlkICsgXFxcInNzXFxcIixcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHNcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2RhdGFcXFwiKS5nZXREYXRhKCk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIvCfjJ9cXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9jb2xsZWN0aW9uP3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGUsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiLFxcbiAgICB9LCB7XFxuICAgICAgICB0aXRsZTogXFxcIlxcXCIgPT0gciA/IFxcXCLigJzigJzlhajpg6jigJ3igJ1cXFwiIDogXFxcIuWFqOmDqFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHMsIGlkKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHFyID0gZ2V0SXRlbShcXFwicnVsZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBjbGVhckl0ZW0oXFxcInJ1bGVcXFwiKTtcXG4gICAgICAgICAgICBpZiAocykge1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcIuWFqOmDqFxcXCIgKyBpZCwge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzlhajpg6jigJ3igJ1cXFwiXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBpZiAocXIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oaWQgKyBxciwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBxclxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgfSwgcywgaWQpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IFxcXCLlhajpg6hcXFwiICsgaWRcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGZvciAobGV0IGl0IG9mIHJ1bGVzKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdCA9PSByID8gXFxcIuKAnOKAnFxcXCIgKyBpdCArIFxcXCLigJ3igJ1cXFwiIDogaXQsXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChyLCBzLCBpZCkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgcXIgPSBnZXRJdGVtKFxcXCJydWxlXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJydWxlXFxcIiwgcik7XFxuICAgICAgICAgICAgICAgIGlmIChzKSB7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbShxciA/IChpZCArIHFyKSA6IChcXFwi5YWo6YOoXFxcIiArIGlkKSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBxciB8fCBcXFwi5YWo6YOoXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKGlkICsgciwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCcXFxcIiArIHIgKyBcXFwi4oCd4oCdXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgIH0sIGl0LCBzLCBpZCksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgICAgICBkZXNjOiBcXFwiXFxcIixcXG4gICAgICAgICAgICBwaWNfdXJsOiBcXFwiXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogaWQgKyBpdFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9XFxuXFxufVxcblxcbmZ1bmN0aW9uIHJlY29yZCgpIHtcXG4gICAgbGV0IGhpc3RvcnkgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJzZWFyY2hIaXN0b3J5XFxcIiwgW10pO1xcbiAgICBsZXQgaWkgPSBoaXN0b3J5LmluZGV4T2Yocyk7XFxuICAgIGlmIChpaSA+IC0xKSB7XFxuICAgICAgICBoaXN0b3J5LnNwbGljZShpaSwgMSk7XFxuICAgIH1cXG4gICAgaWYgKGhpc3RvcnkubGVuZ3RoID4gMjApIHtcXG4gICAgICAgIGhpc3Rvcnkuc3BsaWNlKGhpc3RvcnkubGVuZ3RoIC0gMSwgMSk7XFxuICAgIH1cXG4gICAgaGlzdG9yeS51bnNoaWZ0KHMpO1xcbiAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJzZWFyY2hIaXN0b3J5XFxcIiwgaGlzdG9yeSk7XFxufVxcblxcbmZ1bmN0aW9uIHNlYXJjaEVuZCgpIHtcXG4gICAgbGV0IHAgPSBNWV9QQUdFO1xcbiAgICBsZXQgZGF0YSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2RhdGFcXFwiKS5nZXREYXRhKHAsIHIgIT0gXFxcIlxcXCIgPyByIDogbnVsbCk7XFxuICAgIGxldCBwYWdlaWQgPSBpZCArIFxcXCJ5cGotcGFnZVxcXCIgKyBwO1xcbiAgICBpZiAoZGF0YS5sZW5ndGggPiAwKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5Yqg6L2956ysXFxcIiArIHAgKyBcXFwi6aG15Lit77yM6L+b5bqm77yaMS9cXFwiICsgZGF0YS5sZW5ndGgsXFxuICAgICAgICAgICAgdXJsOiBcXFwiXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIGRlc2M6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIHBpY191cmw6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBwYWdlaWRcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBzZXRSZXN1bHQoZCk7XFxuICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcXG4gICAgICAgIC8v5aSa57q/56iL5Yqg6L29ICAgICAgICBcXG4gICAgICAgIGxldCByZWFsUGFnZSA9IFxcXCJcXFwiID09IHIgPyAxIDogcDtcXG4gICAgICAgIGxldCB0YXNrcyA9IGRhdGEubWFwKGl0ID0+IHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jdGlvbihydWxlKSB7XFxuICAgICAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImRhdGFcXFwiKS5jYXJyeVJ1bGUocnVsZSwgcywgcmVhbFBhZ2UsIHNlYXJjaE1vZGUsIG9wZW5Nb2RlKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2cocnVsZS5uYW1lICsgXFxcIjpcXFwiICsgZS50b1N0cmluZygpKVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gcnVsZS5maW5kKHMsIHJlYWxQYWdlKTtcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgcGFyYW06IGl0LFxcbiAgICAgICAgICAgICAgICBpZDogXFxcInJ1bGVAXFxcIiArIGl0Lm5hbWVcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG5cXG4gICAgICAgIGJhdGNoRXhlY3V0ZSh0YXNrcywge1xcbiAgICAgICAgICAgIGZ1bmM6IGZ1bmN0aW9uKHBhcmFtLCBpZCwgZXJyb3IsIHJlc3VsdCkge1xcbiAgICAgICAgICAgICAgICBwYXJhbS5pICs9IDE7XFxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW0oXFxcIl9ub3RoYXZlXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBhZGRJdGVtQmVmb3JlKHBhZ2VpZCwgcmVzdWx0KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAocGFyYW0uaSA9PT0gcGFyYW0uYWxsKSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0Lmxlbmd0aCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW0oXFxcIl9ub3RoYXZlXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkSXRlbUJlZm9yZShwYWdlaWQsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCJ+fn7ku4DkuYjotYTmupDpg73msqHmnInlk6Z+fn5cXFwiLmZvbnRjb2xvcihcXFwiR3JheVxcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFxcXCJfbm90aGF2ZVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbShwYWdlaWQpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbShwYWdlaWQsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWKoOi9veesrFxcXCIgKyBNWV9QQUdFICsgXFxcIumhteS4re+8jOi/m+W6pu+8mlxcXCIgKyAocGFyYW0uaSArIDEpICsgXFxcIi9cXFwiICsgcGFyYW0uYWxsLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwYXJhbToge1xcbiAgICAgICAgICAgICAgICBhbGw6IGRhdGEubGVuZ3RoLFxcbiAgICAgICAgICAgICAgICBpOiAwLFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gc2V0SGlzdG9yeSgpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcImNvbG9yOiNmZjY2MDFcXFwiPjxiPuWOhuWPsuiusOW9lTwvYj48L3NwYW4+JyxcXG4gICAgICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2Nsb2NrXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgIHVybDogJChbXFxcIua4hemZpOaQnOe0ouiusOW9lVxcXCIsIFxcXCLmiZPlvIDop4LnnIvorrDlvZVcXFwiXSkuc2VsZWN0KChpZCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gXFxcIua4hemZpOaQnOe0ouiusOW9lVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIuehruWumua4hemZpOWFqOmDqOaQnOe0ouiusOW9le+8n1xcXCIpLmNvbmZpcm0oKGlkKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBjbGVhckl0ZW0oXFxcInNlYXJjaEhpc3RvcnlcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW1CeUNscyhpZCArIFxcXCI6a2V5XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBhZGRJdGVtQWZ0ZXIoaWQgKyBcXFwiOnNlYXJjaEhpc3RvcnlcXFwiLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwifn5+5LuA5LmI6YO95rKh5pyJ5ZOmfn5+XFxcIi5mb250Y29sb3IoXFxcIkdyYXlcXFwiKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcIjprZXlcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSwgaWQpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9oaXN0b3J5P3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgaWQpLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogaWQgKyBcXFwiOnNlYXJjaEhpc3RvcnlcXFwiLFxcbiAgICAgICAgfVxcbiAgICB9KTtcXG5cXG4gICAgbGV0IGhpc3RvcnkgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJzZWFyY2hIaXN0b3J5XFxcIiwgW10pO1xcbiAgICBsZXQgaSA9IDA7XFxuICAgIGZvciAobGV0IGtleSBvZiBoaXN0b3J5KSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBrZXksXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpZCwga2V5KSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBleHRyYSA9IGZpbmRJdGVtKGlkICsgXFxcInNzXFxcIikuZXh0cmE7XFxuICAgICAgICAgICAgICAgIGV4dHJhLmRlZmF1bHRWYWx1ZSA9IGtleTtcXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgICAgICBleHRyYTogZXh0cmFcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgfSwgaWQsIGtleSksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJmbGV4X2J1dHRvblxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IGlkICsgXFxcIjprZXk6XFxcIiArIGtleSxcXG4gICAgICAgICAgICAgICAgY2xzOiBpZCArIFxcXCI6a2V5XFxcIixcXG4gICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLliKDpmaTlhbPplK7or406XFxcIiArIGtleSxcXG4gICAgICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChpZCwga2V5LCBpKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhpc3RvcnkgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJzZWFyY2hIaXN0b3J5XFxcIiwgW10pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpc3Rvcnkuc3BsaWNlKGksIDEpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcInNlYXJjaEhpc3RvcnlcXFwiLCBoaXN0b3J5KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVJdGVtKGlkICsgXFxcIjprZXk6XFxcIiArIGtleSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgLy90b2FzdCgpO1xcbiAgICAgICAgICAgICAgICAgICAgfSwgaWQsIGtleSwgaSlcXG4gICAgICAgICAgICAgICAgfV1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGkrKztcXG4gICAgfVxcbiAgICBpZiAoaGlzdG9yeS5sZW5ndGggPT09IDApIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwifn5+5LuA5LmI6YO95rKh5pyJ5ZOmfn5+XFxcIi5mb250Y29sb3IoXFxcIkdyYXlcXFwiKSxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcIjprZXlcXFwiLFxcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBzZXRUcmVuZGluZ1RhYkVuZCgpIHtcXG4gICAgbGV0IGhvdENsYXNzID0ge1xcbiAgICAgICAgXFxcIueZvuW6plxcXCI6IHtcXG4gICAgICAgICAgICBcXFwi55S16KeG5YmnXFxcIjogXFxcInRlbGVwbGF5XFxcIixcXG4gICAgICAgICAgICBcXFwi55S15b2xXFxcIjogXFxcIm1vdmllXFxcIlxcbiAgICAgICAgfSxcXG4gICAgICAgIFxcXCLlpLjlhYtcXFwiOiB7XFxuICAgICAgICAgICAgXFxcIueUteinhuWJp1xcXCI6IFxcXCLnlLXop4bliadcXFwiLFxcbiAgICAgICAgICAgIFxcXCLnlLXlvbFcXFwiOiBcXFwi55S15b2xXFxcIixcXG4gICAgICAgICAgICBcXFwi5Yqo5ryrXFxcIjogXFxcIuWKqOa8q1xcXCIsXFxuICAgICAgICAgICAgXFxcIue7vOiJulxcXCI6IFxcXCLnu7zoibpcXFwiXFxuICAgICAgICB9XFxuICAgIH07XFxuICAgIGxldCBkYXRhU291cmNlID0gT2JqZWN0LmtleXMoaG90Q2xhc3MpO1xcbiAgICBsZXQgc2VsZWN0c291cmNlID0gZ2V0SXRlbShcXFwiZGF0YVNvdXJjZVxcXCIsIGRhdGFTb3VyY2VbMF0pO1xcbiAgICBsZXQgaG90a2V5cyA9IE9iamVjdC5rZXlzKGhvdENsYXNzW3NlbGVjdHNvdXJjZV0pO1xcbiAgICBsZXQgc2VsZWN0a2V5ID0gZ2V0SXRlbShcXFwiaG90a2V5XFxcIiwgaG90a2V5c1swXSk7XFxuICAgIGxldCB0YWJrZXkgPSBob3RDbGFzc1tzZWxlY3Rzb3VyY2VdW3NlbGVjdGtleV07XFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJzxzcGFuIHN0eWxlPVxcXCJjb2xvcjojZmY2NjAxXFxcIj48Yj4nICsgc2VsZWN0c291cmNlICsgc2VsZWN0a2V5ICsgJ+eDreaQnDwvYj48L3NwYW4+JyxcXG4gICAgICAgIHVybDogJChob3RrZXlzLCAxLCBcXFwi5YiH5o2i54Ot5pCcXFxcIikuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJob3RrZXlcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LliIfmjaLkuLpcXFwiICsgaW5wdXQ7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2ZpcmVcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5YiH5o2i5pWw5o2u5rqQXFxcIixcXG4gICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKGRhdGFTb3VyY2UpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkKGRhdGFTb3VyY2UsIDEsIFxcXCLliIfmjaLmlbDmja7mupBcXFwiKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcImRhdGFTb3VyY2VcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJdGVtKFxcXCJob3RrZXlcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suWIh+aNouS4ulxcXCIgKyBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9LCBkYXRhU291cmNlKVxcbiAgICAgICAgICAgIH1dXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLmraPlnKjliqDovb0uLi5cXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogaWQgKyBcXFwiOmhvdGtleVxcXCIsXFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBzZXRSZXN1bHQoZCk7XFxuICAgIGxldCBzZCA9IFtdO1xcbiAgICBsZXQgc2V0U2VhcmNoS2V5ID0gbmFtZSA9PiB7XFxuICAgICAgICBwdXRNeVZhcigncycsIG5hbWUpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgfTtcXG5cXG4gICAgbGV0IGdldFRpdGxlID0gKGksIG5hbWUpID0+IHtcXG4gICAgICAgIGxldCBjb2xvcjtcXG4gICAgICAgIHN3aXRjaCAoaSkge1xcbiAgICAgICAgICAgIGNhc2UgMDpcXG4gICAgICAgICAgICAgICAgY29sb3IgPSBcXFwiI2ZmMzMwMFxcXCI7XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIGNhc2UgMTpcXG4gICAgICAgICAgICAgICAgY29sb3IgPSBcXFwiI2ZmNjYwMFxcXCI7XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIGNhc2UgMjpcXG4gICAgICAgICAgICAgICAgY29sb3IgPSBcXFwiI2ZmOTkwMFxcXCJcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgZGVmYXVsdDpcXG4gICAgICAgICAgICAgICAgY29sb3IgPSBcXFwiYmxhY2tcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIFxcXCLigJzigJzigJ3igJ1cXFwiICsgU3RyaW5nKGkgKyAxKS5mb250Y29sb3IoY29sb3IpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBuYW1lO1xcbiAgICB9XFxuICAgIHRyeSB7XFxuICAgICAgICBzd2l0Y2ggKHNlbGVjdHNvdXJjZSkge1xcbiAgICAgICAgICAgIGNhc2UgXFxcIueZvuW6plxcXCI6XFxuICAgICAgICAgICAgICAgIHZhciBqc29uID0gcmVxdWVzdCgnaHR0cHM6Ly90b3AuYmFpZHUuY29tL2FwaS9ib2FyZD9wbGF0Zm9ybT13aXNlJnRhYj0nICsgdGFia2V5ICsgJyZ0YWc9JTdCJTIyY2F0ZWdvcnklMjI6JTIyJUU1JTg1JUE4JUU5JTgzJUE4JUU3JUIxJUJCJUU1JTlFJThCJTIyJTdEJywge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA2LjA7IE5leHVzIDUgQnVpbGQvTVJBNThOKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvOTkuMC40ODQ0LjUxIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnSG9zdCc6ICd0b3AuYmFpZHUuY29tJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0FjY2VwdC1MYW5ndWFnZSc6ICd6aC1DTix6aDtxPTAuOSxlbi1VUztxPTAuOCxlbjtxPTAuNycsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0FjY2VwdC1FbmNvZGluZyc6ICdnemlwLCBkZWZsYXRlLCBicicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly90b3AuYmFpZHUuY29tL2JvYXJkP3RhYj1ub3ZlbCcsXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAvL3ZhciBzID0gRGF0ZS5ub3coKTtcXG4gICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBKU09OLnBhcnNlKGpzb24pLmRhdGEuY2FyZHNbMF0uY29udGVudDtcXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IGxpc3RbaV07XFxuICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGl0ZW0ud29yZCArICcgKCcgKyBpdGVtLnNob3dbMl0gKyAnKSc7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgZGVzID0gaXRlbS5kZXNjO1xcbiAgICAgICAgICAgICAgICAgICAgc2QucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGdldFRpdGxlKGksIG5hbWUpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZShzZXRTZWFyY2hLZXksIGl0ZW0ud29yZCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogZGVzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZzogaXRlbS5pbWcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJtb3ZpZV8xX3ZlcnRpY2FsX3BpY1xcXCJcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIGNhc2UgXFxcIuWkuOWFi1xcXCI6XFxuICAgICAgICAgICAgICAgIHZhciBqc29uID0gcmVxdWVzdChcXFwiaHR0cHM6Ly9uZXdzLm15cXVhcmsuY24vdjIvdG9wbGlzdC9tb3ZpZT8mY2hhbm5lbD1cXFwiICsgdGFia2V5ICsgXFxcIiZyYW5rX3R5cGU9JUU2JTlDJTgwJUU3JTgzJUFEXFxcIik7XFxuICAgICAgICAgICAgICAgIHZhciB4bWxEYXRhID0gKEpTT04ucGFyc2UoanNvbikuZGF0YSB8fCBcXFwiXFxcIikucmVwbGFjZSgvdGl0bGU+L2csIFxcXCJoX3RpdGxlPlxcXCIpLnJlcGxhY2UoL3NyYz4vZywgXFxcImhfc3JjPlxcXCIpLnJlcGxhY2UoL2FyZWE+L2csIFxcXCJoX2FyZWFcXFwiKTtcXG4gICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBwZGZhKHhtbERhdGEsIFxcXCJib2R5JiZpdGVtXFxcIik7XFxuICAgICAgICAgICAgICAgIHZhciBnZXRUZXh0ID0gdCA9PiB0O1xcbiAgICAgICAgICAgICAgICB2YXIgdHJlbmQgPSBbXFxcIuOEp1xcXCIsIFxcXCLihpFcXFwiLCBcXFwi4oaTXFxcIl07XFxuICAgICAgICAgICAgICAgIC8vdmFyIHMgPSBEYXRlLm5vdygpO1xcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtID0gbGlzdFtpXTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gcGRmaChpdGVtLCBcXFwiaF90aXRsZSYmVGV4dFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRlcyA9IFxcXCLng63luqbvvJpcXFwiICsgcGRmaChpdGVtLCBcXFwiaG90X3Njb3JlJiZUZXh0XFxcIikgKyBcXFwiIFxcXCIgKyB0cmVuZC5hdChwZGZoKGl0ZW0sIFxcXCJob3RfdHJlbmQmJlRleHRcXFwiKSkgK1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJcXFxcbuivhOWIhu+8mlxcXCIgKyBwZGZoKGl0ZW0sIFxcXCJzY29yZV9hdmcmJlRleHRcXFwiKS5yZXBsYWNlKC9eMCQvLCBcXFwi5pqC5peg6K+E5YiGXFxcIikgK1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJcXFxcblxcXCIgKyBwZGZoKGl0ZW0sIFxcXCJ5ZWFyJiZUZXh0XFxcIikgKyBcXFwiwrdcXFwiICsgcGRmaChpdGVtLCBcXFwiaF9hcmVhJiZUZXh0XFxcIikgKyBcXFwiwrdcXFwiICsgcGRmaChpdGVtLCBcXFwiY2F0ZWdvcnkmJlRleHRcXFwiKS5yZXBsYWNlKFxcXCIsXFxcIiwgXFxcIsK3XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBzZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogZ2V0VGl0bGUoaSwgbmFtZSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKHNldFNlYXJjaEtleSwgbmFtZSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogZGVzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZzogcGRmaChpdGVtLCBcXFwiaF9zcmMmJlRleHRcXFwiKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcIm1vdmllXzFfdmVydGljYWxfcGljXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICB9XFxuICAgICAgICBhZGRJdGVtQWZ0ZXIoaWQgKyBcXFwiOmhvdGtleVxcXCIsIHNkKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgIH0gZmluYWxseSB7XFxuICAgICAgICBkZWxldGVJdGVtKGlkICsgXFxcIjpob3RrZXlcXFwiKTtcXG4gICAgfVxcbn1cXG5sZXQgciA9IGdldEl0ZW0oXFxcInJ1bGVcXFwiLCBcXFwiXFxcIik7XFxubGV0IHMgPSBnZXRNeVZhcigncycsICcnKSB8fCBNWV9QQVJBTVMuc2VhcmNoVGVybXMgfHwgZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJzZWFyY2hUZXJtc1xcXCIsIFxcXCJcXFwiKSk7XFxubGV0IHNlYXJjaE1vZGUgPSBnZXRTZWFyY2hNb2RlKCk7XFxubGV0IG9wZW5Nb2RlID0gZ2V0SXRlbShcXFwib3Blbk1vZGVcXFwiLCBcXFwi5pys5Zyw6L2s56CBXFxcIik7XFxubGV0IGlkID0gRGF0ZS5ub3coKSArIE1ZX1JVTEUudGl0bGU7XFxubGV0IGQgPSBbXTtcXG5pZiAoTVlfUEFHRSA9PT0gMSkge1xcbiAgICBzZXRDbGlwKCk7XFxuICAgIHNldEhlYWQoKTtcXG4gICAgaWYgKCFzKSB7XFxuICAgICAgICBzZXRIaXN0b3J5KCk7XFxuICAgIH1cXG59XFxuaWYgKHMpIHtcXG4gICAgcmVjb3JkKCk7XFxuICAgIHNlYXJjaEVuZCgpO1xcbn0gZWxzZSBpZiAoTVlfUEFHRSA9PT0gMSkge1xcbiAgICBzZXRUcmVuZGluZ1RhYkVuZCgpO1xcbn0gZWxzZSB7XFxuICAgIHNldFJlc3VsdChbXSk7XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi572R6aG15rWP6KeIXCIsXCJwYXRoXCI6XCJ5c2Z4XCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcblxcbmxldCBvcGVuTW9kZSA9IGdldEl0ZW0oXFxcIm9wZW5Nb2RlXFxcIik7XFxubGV0IHJ1bGUgPSBNWV9SVUxFLnRpdGxlO1xcbmxldCB1cmwgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcIndlYlVybFxcXCIsXFxcIlxcXCIpKTtcXG5cXG5mdW5jdGlvbiBpbnRlcmNlcHQocnVsZSwgb3JpZ2luLCBvcGVuTW9kZSkge1xcbiAgICBsZXQgaG9zdCA9IG9yaWdpbi5yZXBsYWNlKG5ldyBSZWdFeHAoXFxcImh0dHA6Ly98aHR0cHM6Ly9cXFwiKSwgXFxcIlxcXCIpLnNwbGl0KFxcXCIvXFxcIilbMF07XFxuICAgIGxldCBob3N0cyA9IGhvc3Quc3BsaXQoXFxcIi5cXFwiKTtcXG4gICAgaWYgKGhvc3RzLmxlbmd0aCA+IDIpIHtcXG4gICAgICAgIGhvc3QgPSBob3N0c1tob3N0cy5sZW5ndGggLSAyXSArIFxcXCIuXFxcIiArIGhvc3RzW2hvc3RzLmxlbmd0aCAtIDFdO1xcbiAgICB9XFxuICAgIGlmIChpbnB1dC5zdGFydHNXaXRoKFxcXCJtYWduZXRcXFwiKSkge1xcbiAgICAgICAgY29uZmlybSh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLmuKnppqjmj5DnpLpcXFwiLFxcbiAgICAgICAgICAgIGNvbnRlbnQ6IFxcXCLmo4DmtYvliLDmlrDnmoTno4Hpk77lnLDlnYDvvIzngrnlh7vnoa7lrprmjInpkq7ljbPlj6/mkq3mlL7vvIzngrnlh7vlj5bmtojmjInpkq7lj6/ku6XlpI3liLbpk77mjqVcXFwiLFxcbiAgICAgICAgICAgIGNvbmZpcm06ICQudG9TdHJpbmcoKG1hZykgPT4ge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFnO1xcbiAgICAgICAgICAgIH0sIGlucHV0KSxcXG4gICAgICAgICAgICBjYW5jZWw6ICQudG9TdHJpbmcoKG1hZykgPT4ge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgbWFnXFxuICAgICAgICAgICAgfSwgaW5wdXQpXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICB9IGVsc2UgaWYgKGlucHV0LmluY2x1ZGVzKFxcXCJhbGl5dW5kcml2ZS5jb21cXFwiKSAmJiBvcGVuTW9kZSAhPSBcXFwi5a6Y5pa5QVBQXFxcIikge1xcbiAgICAgICAgbG9nKGlucHV0KTtcXG4gICAgICAgIGlmIChpbnB1dC5pbmNsdWRlcygnY2hlY2t1cmw/dXJsPScpICYmIGlucHV0LmluY2x1ZGVzKCcmdXJscmVmZXInKSkge1xcbiAgICAgICAgICAgIGlucHV0ID0gZGVjb2RlVVJJQ29tcG9uZW50KGlucHV0LnNwbGl0KCcmdXJscmVmZXInKVswXS5zcGxpdCgnY2hlY2t1cmw/dXJsPScpWzFdKTtcXG4gICAgICAgICAgICAvL2xvZygn6LS05ZCnJytpbnB1dCk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gJC50b1N0cmluZygodXJsLCBydWxlKSA9PiB7XFxuICAgICAgICAgICAgZnlfYnJpZGdlX2FwcC5vcGVuKEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLpmL/ph4zkupHnm5hcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvYWxpeXVuP3BhZ2U9ZnlwYWdlJnJlYWx1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudCh1cmwpICsgXFxcIiZydWxlPVxcXCIgKyBydWxlLFxcbiAgICAgICAgICAgIH0pKVxcbiAgICAgICAgfSwgaW5wdXQsIHJ1bGUpO1xcbiAgICB9IGVsc2UgaWYgKC9cXFxcLihtcDN8ZmxhY3xtNGEpJC8udGVzdChpbnB1dCkpIHtcXG4gICAgICAgIGxvZyhpbnB1dCk7XFxuICAgICAgICByZXR1cm4gJC50b1N0cmluZygodXJsLCBydWxlKSA9PiB7XFxuICAgICAgICAgICAgZnlfYnJpZGdlX2FwcC5wbGF5VmlkZW8odXJsKTtcXG4gICAgICAgIH0sIGlucHV0LCBydWxlKTtcXG4gICAgfSBlbHNlIGlmICghaW5wdXQuaW5jbHVkZXMoaG9zdCkgJiYgaW5wdXQuc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICBsb2coaW5wdXQpO1xcbiAgICAgICAgcmV0dXJuICQudG9TdHJpbmcoKHVybCwgcnVsZSkgPT4ge1xcbiAgICAgICAgICAgIGZ5X2JyaWRnZV9hcHAub3BlbihKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi6K+m5oOFXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL3lzZng/d2ViVXJsPVxcXCIrZW5jb2RlVVJJQ29tcG9uZW50KHVybCkrXFxcIiZydWxlPVxcXCIrcnVsZSxcXG4gICAgICAgICAgICB9KSlcXG4gICAgICAgIH0sIGlucHV0LCBydWxlKTtcXG4gICAgfSBlbHNlIGlmICghaW5wdXQuc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICBsb2coaW5wdXQpO1xcbiAgICAgICAgLy/og73llKTotbdBUFDnmoTnmb3lkI3ljZVcXG4gICAgICAgIGxldCB3aGl0ZSA9IFtcXG4gICAgICAgICAgICBcXFwicWtsaW5rXFxcIixcXG4gICAgICAgICAgICBcXFwiYmRuZXRkaXNrXFxcIixcXG4gICAgICAgICAgICBcXFwieHVubGVpYXBwXFxcIixcXG4gICAgICAgICAgICBcXFwic21hcnRkcml2ZVxcXCJcXG4gICAgICAgIF07XFxuICAgICAgICBsZXQgaW5XaGl0ZSA9IHdoaXRlLmZpbHRlcihpdCA9PiBpbnB1dC5zdGFydHNXaXRoKGl0KSkubGVuZ3RoID4gMDtcXG4gICAgICAgIGlmICghaW5XaGl0ZSkge1xcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiAkLnRvU3RyaW5nKCh1cmwsIHJ1bGUpID0+IHtcXG4gICAgICAgICAgICBmeV9icmlkZ2VfYXBwLm9wZW5UaGlyZEFwcCAmJiBmeV9icmlkZ2VfYXBwLm9wZW5UaGlyZEFwcCh1cmwpO1xcbiAgICAgICAgfSwgaW5wdXQsIHJ1bGUpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGxvYWRKcygpIHtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGlmIChkb2N1bWVudC50aXRsZSAmJiBkb2N1bWVudC50aXRsZS5sZW5ndGgpIHtcXG4gICAgICAgICAgICBsZXQgciA9ICQkJCgpLmxhenlSdWxlKCh0KSA9PiB7XFxuICAgICAgICAgICAgICAgIHNldFBhZ2VUaXRsZSh0KTtcXG4gICAgICAgICAgICB9LCBkb2N1bWVudC50aXRsZSk7XFxuICAgICAgICAgICAgZnlfYnJpZGdlX2FwcC5wYXJzZUxhenlSdWxlKHIpO1xcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBmeV9icmlkZ2VfYXBwLmxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICB9XFxufVxcblxcbmQucHVzaCh7XFxuICAgIHVybDogdXJsLFxcbiAgICBjb2xfdHlwZTogXFxcIng1X3dlYnZpZXdfc2luZ2xlXFxcIixcXG4gICAgZGVzYzogXFxcIjEwMCUmJmZsb2F0XFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHVybEludGVyY2VwdG9yOiAkLnRvU3RyaW5nKGludGVyY2VwdCwgcnVsZSwgZ2V0SG9tZSh1cmwpLCBvcGVuTW9kZSksXFxuICAgICAgICBqczogJC50b1N0cmluZyhsb2FkSnMpLFxcbiAgICAgICAgY2FuQmFjazogdHJ1ZSxcXG4gICAgICAgIGpzTG9hZGluZ0luamVjdDogdHJ1ZSxcXG4gICAgICAgIGZsb2F0VmlkZW86IHRydWVcXG4gICAgfVxcbn0pO1xcblxcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIumYv+mHjExhenlcIixcInBhdGhcIjpcImFsaWxhenlcIixcInJ1bGVcIjpcImNvbnN0IEFsaUFjY2Vzc0FwaSA9ICQucmVxdWlyZShcXFwiYWxpUGxheUFwaVxcXCIpO1xcbmNvbnN0IHtcXG4gICAgb3BlblRva2Vuc0ZpbGVwYXRoLFxcbiAgICBhbGlUb2tlbnNGaWxlcGF0aFxcbn0gPSAkLnJlcXVpcmUoXFxcInRva2VuUGF0aFxcXCIpO1xcblxcbmZ1bmN0aW9uIGFsaU0zdThQcm94eShmaWxlSWQsIHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCBhbGlUb2tlbiwgdGl0bGUpIHtcXG4gICAgZnVuY3Rpb24gZ2V0QWxpUGxheVVybChmaWxlSWQsIGxpbmUpIHtcXG4gICAgICAgIGxldCBhbGl1cmw7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGNvbnN0IEFsaUFjY2Vzc0FwaSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2FsaVBsYXlBcGk/cnVsZT1cXFwiICsgdGl0bGUpO1xcbiAgICAgICAgICAgIGxldCBhbGlBY2Nlc3NBcGkgPSBBbGlBY2Nlc3NBcGkuY3JlYXRlRGVmYXVsdChzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVUb2tlbiwgYWxpVG9rZW4sIG51bGwsIHRpdGxlKTtcXG4gICAgICAgICAgICBsZXQgcGxheVVybExpc3QgPSBhbGlBY2Nlc3NBcGkuZ2V0U2hhcmVWaWRlb1ByZXZpZXcoZmlsZUlkKSB8fCBbXTtcXG4gICAgICAgICAgICBwbGF5VXJsTGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgICAgIGlmIChpdGVtLnRlbXBsYXRlX2lkID09IGxpbmUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGFsaXVybCA9IGl0ZW0udXJsO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICAgICAgdGhyb3cgZTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBhbGl1cmw7XFxuICAgIH1cXG5cXG4gICAgZnVuY3Rpb24gZ2V0TTN1OENvbnRlbnQocGxheXVybCkge1xcblxcbiAgICAgICAgLy9sb2coXFxcIuaIkeWcqOS7o+eQhlxcXCIgKyBwbGF5dXJsKTtcXG4gICAgICAgIGxldCBob21lID0gcGxheXVybC5zcGxpdCgnbWVkaWEubTN1OCcpWzBdO1xcbiAgICAgICAgbGV0IGYgPSBmZXRjaChwbGF5dXJsLCB7XFxuICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJ1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgdGltZW91dDogMzAwMFxcbiAgICAgICAgfSkuc3BsaXQoXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICBsZXQgZmYgPSBmLm1hcChpdCA9PiB7XFxuICAgICAgICAgICAgaWYgKGl0LnN0YXJ0c1dpdGgoXFxcIm1lZGlhLVxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiL3Byb3h5P3VybD1cXFwiICsgYmFzZTY0RW5jb2RlKGhvbWUgKyBpdCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBpdDtcXG4gICAgICAgIH0pLmpvaW4oXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICAvL2xvZygndWZpZC0nICsgZmlsZWlkKTtcXG4gICAgICAgIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9fY2FjaGUvJyArIGZpbGVJZCArICcubTN1OCcsIGZmKTtcXG4gICAgICAgIHJldHVybiBmZjtcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiB1cGRhdGVUc1VybCh1cmwpIHtcXG4gICAgICAgIGxldCBmaWQgPSB1cmwuc3BsaXQoJyZmPScpWzFdLnNwbGl0KCcmJylbMF07XFxuICAgICAgICAvL2xvZygnc2ZpZC0nICsgZmlkKTtcXG4gICAgICAgIGxldCBmID0gZmV0Y2goJ2hpa2VyOi8vZmlsZXMvX2NhY2hlLycgKyBmaWQgKyAnLm0zdTgnKS5zcGxpdChcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgIGYuZm9yRWFjaChpdCA9PiB7XFxuICAgICAgICAgICAgaWYgKGl0ICYmIGl0LnN0YXJ0c1dpdGgoJy9wcm94eT91cmw9JykpIHtcXG4gICAgICAgICAgICAgICAgbGV0IGZ1cmwgPSBiYXNlNjREZWNvZGUoaXQucmVwbGFjZSgnL3Byb3h5P3VybD0nLCAnJykpO1xcbiAgICAgICAgICAgICAgICBpZiAodXJsLnN1YnN0cih1cmwuaW5kZXhPZignL21lZGlhLScpLCB1cmwuaW5kZXhPZignLnRzJykpID09IGZ1cmwuc3Vic3RyKGZ1cmwuaW5kZXhPZignL21lZGlhLScpLCBmdXJsLmluZGV4T2YoJy50cycpKSkge1xcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gZnVybDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgICAgICBsZXQgZXhwaXJlcyA9IHVybC5zcGxpdCgneC1vc3MtZXhwaXJlcz0nKVsxXS5zcGxpdCgnJicpWzBdO1xcbiAgICAgICAgY29uc3QgbGFzdHRpbWUgPSBwYXJzZUludChleHBpcmVzKSAtIERhdGUubm93KCkgLyAxMDAwO1xcbiAgICAgICAgaWYgKGxhc3R0aW1lIDwgNjApIHtcXG4gICAgICAgICAgICAvL2xvZygn6L+H5pyf5pu05pawJylcXG4gICAgICAgICAgICBsZXQgbGluZSA9IHVybC5zcGxpdCgnL21lZGlhJylbMF07IC8v5Y+W5LmL5YmN5pKt5pS+55qEdHPmrrXnur/ot69cXG4gICAgICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcobGluZS5sYXN0SW5kZXhPZignLycpICsgMSk7XFxuICAgICAgICAgICAgbGV0IGYgPSBnZXRNM3U4Q29udGVudChnZXRBbGlQbGF5VXJsKGZpZCwgbGluZSkpLnNwbGl0KFxcXCJcXFxcblxcXCIpO1xcbiAgICAgICAgICAgIGYuZm9yRWFjaChpdCA9PiB7XFxuICAgICAgICAgICAgICAgIGlmIChpdCAmJiBpdC5zdGFydHNXaXRoKCcvcHJveHk/dXJsPScpKSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgZnVybCA9IGJhc2U2NERlY29kZShpdC5yZXBsYWNlKCcvcHJveHk/dXJsPScsICcnKSk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAodXJsLnN1YnN0cih1cmwuaW5kZXhPZignL21lZGlhLScpLCB1cmwuaW5kZXhPZignLnRzJykpID09IGZ1cmwuc3Vic3RyKGZ1cmwuaW5kZXhPZignL21lZGlhLScpLCBmdXJsLmluZGV4T2YoJy50cycpKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IGZ1cmw7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KVxcblxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHVybDtcXG4gICAgfVxcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IHVybCA9IGJhc2U2NERlY29kZShNWV9QQVJBTVMudXJsKTtcXG4gICAgICAgIGlmICh1cmwuaW5jbHVkZXMoXFxcIi50c1xcXCIpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogMzAyLFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiTG9jYXRpb25cXFwiOiB1cGRhdGVUc1VybCh1cmwpLFxcbiAgICAgICAgICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tLydcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAvL2xvZyh1cmwpO1xcbiAgICAgICAgICAgIGxldCBmZiA9IGdldE0zdThDb250ZW50KGdldEFsaVBsYXlVcmwoZmlsZUlkLCBNWV9QQVJBTVMudGVtcGxhdGVJZCkpO1xcbiAgICAgICAgICAgIHJldHVybiBmZjtcXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKFxcXCLku6PnkIbmkq3mlL7lpLHotKUjXFxcXG7plJnor6/kv6Hmga8+XFxcIiArIGUudG9TdHJpbmcoKSArIFxcXCJcXFxcbumUmeivr+ihjD5cXFwiICsgZS5saW5lTnVtYmVyKTtcXG4gICAgfVxcbn1cXG5cXG5cXG5mdW5jdGlvbiBnZXRWaWRlbyhhbGlBY2Nlc3NBcGksIGZpbGVJZCkge1xcblxcbiAgICBsZXQgcGxheVVybExpc3QgPSBhbGlBY2Nlc3NBcGkuZ2V0U2hhcmVWaWRlb1ByZXZpZXcoZmlsZUlkKSB8fCBbXTtcXG5cXG4gICAgbGV0IHNlcnZlckFkZHJlc3MgPSBzdGFydFByb3h5U2VydmVyKCQudG9TdHJpbmcoYWxpTTN1OFByb3h5LCBmaWxlSWQsIGFsaUFjY2Vzc0FwaS5zaGFyZUlkLCBhbGlBY2Nlc3NBcGkuc2hhcmVQd2QsIGFsaUFjY2Vzc0FwaS5zaGFyZVRva2VuLCBhbGlBY2Nlc3NBcGkuYWxpVG9rZW4sIE1ZX1JVTEUudGl0bGUpKTtcXG4gICAgbGV0IHRyYW5zY29kaW5nID0ge1xcbiAgICAgICAgVUhEOiBcXFwiNEsg6LaF5riFXFxcIixcXG4gICAgICAgIFFIRDogXFxcIjJLIOi2hea4hVxcXCIsXFxuICAgICAgICBGSEQ6IFxcXCIxMDgwIOWFqOmrmOa4hVxcXCIsXFxuICAgICAgICBIRDogXFxcIjcyMCDpq5jmuIVcXFwiLFxcbiAgICAgICAgU0Q6IFxcXCI1NDAg5qCH5riFXFxcIixcXG4gICAgICAgIExEOiBcXFwiMzYwIOa1geeVhVxcXCJcXG4gICAgfTtcXG5cXG4gICAgaWYgKHBsYXlVcmxMaXN0Lmxlbmd0aCA+IDApIHtcXG4gICAgICAgIGxldCB1cmxzID0gW10sXFxuICAgICAgICAgICAgbmFtZXMgPSBbXTtcXG4gICAgICAgIHBsYXlVcmxMaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcXG4gICAgICAgICAgICB1cmxzLnB1c2goc2VydmVyQWRkcmVzcyArIFxcXCI/dXJsPVxcXCIgKyBiYXNlNjRFbmNvZGUoaXRlbS51cmwpICsgXFxcIiZ0ZW1wbGF0ZUlkPVxcXCIgKyBpdGVtLnRlbXBsYXRlX2lkICsgXFxcIiMubTN1OFxcXCIpO1xcbiAgICAgICAgICAgIG5hbWVzLnB1c2godHJhbnNjb2RpbmdbaXRlbS50ZW1wbGF0ZV9pZF0gPyB0cmFuc2NvZGluZ1tpdGVtLnRlbXBsYXRlX2lkXSA6IGl0ZW0udGVtcGxhdGVfaGVpZ2h0KTtcXG4gICAgICAgIH0pO1xcbiAgICAgICAgbGV0IGhlYWRzID0gbmV3IEFycmF5KHBsYXlVcmxMaXN0Lmxlbmd0aCkuZmlsbCh7XFxuICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tLydcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICB1cmxzOiB1cmxzLFxcbiAgICAgICAgICAgIG5hbWVzOiBuYW1lcyxcXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkcyxcXG4gICAgICAgIH07XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4ge307XFxuICAgIH1cXG5cXG59O1xcblxcblxcbmZ1bmN0aW9uIGdldE9yaVZpZGVvKGFsaUFjY2Vzc0FwaSwgZmlsZUlkKSB7XFxuICAgIHJldHVybiB7XFxuICAgICAgICBuYW1lczogW1xcXCLljp/nlLtcXFwiXSxcXG4gICAgICAgIHVybHM6IFthbGlBY2Nlc3NBcGkuZ2V0VmlkZW9UZW1QbGF5VXJsKGZpbGVJZCkgKyBcXFwiI2lzVmlkZW89dHJ1ZSNcXFwiXSxcXG4gICAgICAgIGhlYWRlcnM6IFt7XFxuICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tLydcXG4gICAgICAgIH1dXFxuICAgIH07XFxufVxcbiQuZXhwb3J0cyA9IGZ1bmN0aW9uKHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCBmaWxlSWQsIGNhdGUsIHppbXUpIHtcXG4gICAgaWYgKCFmaWxlRXhpc3QoYWxpVG9rZW5zRmlsZXBhdGgpKSB7XFxuICAgICAgICB0b2FzdChcXFwi6K+35YWI55m76ZmG55m75b2V6LSm5Y+3XFxcIik7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/bm9SZWZyZXNoPTFcXFwiO1xcbiAgICB9XFxuICAgIGxldCBhbGlUb2tlbiA9ICQucmVxdWlyZShhbGlUb2tlbnNGaWxlcGF0aCk7XFxuICAgIGlmIChjYXRlID09PSBcXFwidmlkZW9cXFwiKSB7XFxuICAgICAgICBsZXQgcGxheUxpc3QgPSBbXTtcXG4gICAgICAgIGxldCBhbGlBY2Nlc3NBcGk7XFxuICAgICAgICBsZXQgcGxheU1vZGUgPSBnZXRJdGVtKFxcXCJhbGl5dW5fcGxheU1vZGVcXFwiLCBcXFwi6L2s56CBXFxcIik7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGFsaUFjY2Vzc0FwaSA9IEFsaUFjY2Vzc0FwaS5jcmVhdGVEZWZhdWx0KHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCBhbGlUb2tlbik7XFxuICAgICAgICAgICAgaWYgKHBsYXlNb2RlID09PSBcXFwi6L2s56CBXFxcIikge1xcbiAgICAgICAgICAgICAgICBwbGF5TGlzdCA9IGdldFZpZGVvKGFsaUFjY2Vzc0FwaSwgZmlsZUlkKSB8fCB7fTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBwbGF5TGlzdCA9IGdldE9yaVZpZGVvKGFsaUFjY2Vzc0FwaSwgZmlsZUlkKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKFxcXCIjXFxcIiArIHBsYXlNb2RlICsgXFxcIuaSreaUvuWksei0pSNcXFxcbumUmeivr+S/oeaBrz5cXFwiICsgZS50b1N0cmluZygpICsgXFxcIlxcXFxu6ZSZ6K+v6KGMPlxcXCIgKyBlLmxpbmVOdW1iZXIpO1xcbiAgICAgICAgICAgIGlmIChlLmNvZGUgPT09IFxcXCJJbnZhbGlkUGFyYW1ldGVyLlJlZnJlc2hUb2tlblxcXCIpIHtcXG4gICAgICAgICAgICAgICAgdG9hc3QoXFxcIueZu+mZhui/h+acn++8jOivt+mHjeaWsOeZu+mZhlxcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/bm9SZWZyZXNoPTFcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5jb2RlID09PSBcXFwiUXVvdGFFeGhhdXN0ZWQuRHJpdmVcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/nvZHnm5jnqbrpl7TkuI3otrPvvIzml6Dms5Xmkq3mlL7or7fmuIXnkIbjgIJcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgZXJyb3JDb3VudCA9IE51bWJlcihnZXRNeVZhcihcXFwiZXJyb3JDb3VudFxcXCIsIFxcXCIwXFxcIikpO1xcbiAgICAgICAgICAgIGlmICgrK2Vycm9yQ291bnQgPj0gNCkge1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJlcnJvckNvdW50XFxcIik7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLmo4DmtYvliLDmkq3mlL7ov57nu63lpLHotKXvvIzmmK/lkKbov5vlhaXph43nva7lvJXlr7zjgIJcXFxcbiPov5nkuI3mmK/nmb7liIbnmb7op6PlhrPpl67popgjXFxcIikuY29uZmlybSgoKT0+XFxcImhpa2VyOi8vcGFnZS9Cb290UmVzZXQjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIik7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcImVycm9yQ291bnRcXFwiLCBlcnJvckNvdW50ICsgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pKt5pS+5aSx6LSl77yM6ZSZ6K+v5L+h5oGv5bey5omT5Y2w44CCXFxcXG7or7fmn6XnnIvml6Xlv5coTE9HKVxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBjbGVhck15VmFyKFxcXCJlcnJvckNvdW50XFxcIik7XFxuICAgICAgICBsZXQgbW91bnRzdWIgPSBzdG9yYWdlMC5nZXRNeVZhcignbW91bnR6aW11Jywge30pO1xcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1vdW50c3ViKS5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgemltdSA9IG1vdW50c3ViO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHN1YnRpdGxlO1xcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHppbXUgfHwge30pLmxlbmd0aCA+IDAgJiYgcGxheUxpc3QgJiYgcGxheUxpc3QudXJscyAmJiBwbGF5TGlzdC51cmxzLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKDEwMCk7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgdmFyIHptdXJsID0gYWxpQWNjZXNzQXBpLmdldEZpbGVUb0Rvd25VcmwoemltdS5maWxlX2lkKTtcXG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSAnaGlrZXI6Ly9maWxlcy9jYWNoZS/kupHnm5jlkJsvc3ViLicgKyB6aW11LmV4dDtcXG4gICAgICAgICAgICAgICAgZG93bmxvYWRGaWxlKHptdXJsLCBwYXRoLCB7XFxuICAgICAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJ1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgc3VidGl0bGUgPSBnZXRQYXRoKHBhdGgpO1xcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgdG9hc3QoXFxcIuWtl+W5leWKoOi9veWksei0pVxcXCIpO1xcbiAgICAgICAgICAgICAgICBsb2coZS5tZXNzYWdlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgZG1saXN0ID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImRtbGlzdFxcXCIsIFtdKTtcXG4gICAgICAgIGxldCBkbWxpc3RfY2FjaGUgPSBnZXRNeVZhcihcXFwiZG1saXN0X2NhY2hlXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgaWYgKGRtbGlzdF9jYWNoZSAmJiBkbWxpc3RfY2FjaGUuc3RhcnRzV2l0aChmaWxlSWQgKyBcXFwiI1xcXCIpKSB7XFxuICAgICAgICAgICAgcGxheUxpc3QuZGFubXUgPSBkbWxpc3RfY2FjaGUucmVwbGFjZShmaWxlSWQgKyBcXFwiI1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoZG1saXN0Lmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICBwbGF5TGlzdC5kYW5tdSA9IFxcXCJoaWtlcjovL2ZpbGVzL2NhY2hlL2Rhbm11L1xcXCIgKyBkbWxpc3Quc3BsaWNlKDAsIDEpWzBdO1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJkbWxpc3RfY2FjaGVcXFwiLCBmaWxlSWQgKyBcXFwiI1xcXCIgKyBwbGF5TGlzdC5kYW5tdSk7XFxuICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcImRtbGlzdFxcXCIsIGRtbGlzdCk7XFxuICAgICAgICAgICAgaWYgKGRtbGlzdC5sZW5ndGggPT09IDApIHtcXG4gICAgICAgICAgICAgICAgdG9hc3QoXFxcIuW8ueW5leWIl+ihqOW3suWFqOmDqOaMgui9vVxcXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcGxheUxpc3QuZGFubXUgPSBnZXRWYXIoXFxcImRtX3NoYXJlXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcGxheUxpc3Quc3VidGl0bGUgPSBzdWJ0aXRsZTtcXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwbGF5TGlzdCk7XFxuICAgIH1cXG5cXG4gICAgbGV0IGFsaUFjY2Vzc0FwaSA9IEFsaUFjY2Vzc0FwaS5jcmVhdGVEZWZhdWx0KHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCBhbGlUb2tlbiwgbnVsbCk7XFxuICAgIGxldCB1cmwgPSBhbGlBY2Nlc3NBcGkuZ2V0RmlsZVRvRG93blVybChmaWxlSWQpO1xcblxcbiAgICBpZiAoY2F0ZSA9PT0gXFxcImltYWdlXFxcIikge1xcbiAgICAgICAgcmV0dXJuIHVybCArIFxcXCIjLmpwZ1xcXCI7XFxuICAgIH0gZWxzZSBpZiAoY2F0ZSA9PT0gXFxcImF1ZGlvXFxcIikge1xcbiAgICAgICAgcmV0dXJuIHVybCArIFxcXCIjaXNNdXNpYz10cnVlI1xcXCI7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gXFxcImRvd25sb2FkOi8vXFxcIiArIHVybDtcXG4gICAgfVxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIumYv+mHjOWIl+ihqFwiLFwicGF0aFwiOlwiYWxpeXVuXCIsXCJydWxlXCI6XCJqczpcXG4vL0BhdXRob3IgTG95RGdJa1xcbmNvbnN0IEFsaVNoYXJlQXBpID0gJC5yZXF1aXJlKFxcXCJBbGlBcGlcXFwiKTtcXG5cXG5sZXQgcmVhbHVybCA9IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwicmVhbHVybFxcXCIsIFxcXCJcXFwiKSkuc3BsaXQoXFxcIj9cXFwiKVswXTtcXG5sZXQgdXJsRGF0YSA9IHJlYWx1cmwuc3BsaXQoXFxcIi9cXFwiKTtcXG4vL2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zL3tzaGFyZUlkfS9mb2xkZXIve2ZpbGVJZH0/O1xcblxcbmxldCBzaGFyZUlkID0gTVlfUEFSQU1TLnNoYXJlSWQgfHwgdXJsRGF0YVs0XTtcXG5sZXQgc2hhcmVQd2QgPSBnZXRQYXJhbShcXFwic2hhcmVQd2RcXFwiLCBNWV9QQVJBTVMuc2hhcmVQd2QgfHwgXFxcIlxcXCIpO1xcbmxldCBzaGFyZVRva2VuID0gZ2V0UGFyYW0oXFxcInNoYXJlVG9rZW5cXFwiLCBNWV9QQVJBTVMuc2hhcmVUb2tlbik7XFxuXFxubGV0IGZpbGVJZCA9ICh1cmxEYXRhWzVdID09PSBcXFwiZm9sZGVyXFxcIiA/IHVybERhdGFbNl0gOiB2b2lkIDApIHx8IE1ZX1BBUkFNUy5maWxlSWQ7XFxubGV0IHNlYXJjaEtleSA9IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwic2VhcmNoS2V5XFxcIiwgXFxcIlxcXCIpKSB8fCB1bmRlZmluZWQ7XFxubGV0IGlzU2VhcmNoID0gISFzZWFyY2hLZXk7XFxuXFxubGV0IHBhZ2VJZCA9IFN0cmluZyhEYXRlLm5vdygpKS5zbGljZSg2KTtcXG5cXG5mdW5jdGlvbiBmb3JtYXREYXRlKF9kYXRlLCBmbXQpIHtcXG4gICAgbGV0IGRhdGUgPSAhaXNOYU4oX2RhdGUpID8gbmV3IERhdGUoX2RhdGUgKiAxMDAwKSA6IG5ldyBEYXRlKF9kYXRlKTtcXG4gICAgcmV0dXJuICQuZGF0ZUZvcm1hdChkYXRlLCBmbXQgfHwgXFxcInl5eXktTU0tZGQgSEg6bW06c3NcXFwiKVxcbn1cXG5cXG5mdW5jdGlvbiBmb3JtYXRTaXplKHNpemUpIHtcXG4gICAgaWYgKCFzaXplKSB7XFxuICAgICAgICByZXR1cm4gJyc7XFxuICAgIH1cXG4gICAgY29uc3QgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXTtcXG4gICAgbGV0IGkgPSAwO1xcbiAgICB3aGlsZSAoc2l6ZSA+PSAxMDI0KSB7XFxuICAgICAgICBzaXplIC89IDEwMjQ7XFxuICAgICAgICBpKys7XFxuICAgIH1cXG4gICAgc2l6ZSA9IGkgPyBOdW1iZXIoc2l6ZS50b0ZpeGVkKDIpKSA6IHNpemU7XFxuICAgIHJldHVybiBgJHtzaXplfSAke3VuaXRzW2ldfWA7XFxufVxcblxcbmZ1bmN0aW9uIHNldE15UGFDYWNoZShrZXksIHZhbHVlKSB7XFxuICAgIE1ZX1BBUkFNU1trZXldID0gdmFsdWU7XFxufVxcblxcbmZ1bmN0aW9uIHNhdmVNeVBhQ2FjaGUoKSB7XFxuICAgIHNldFBhZ2VQYXJhbXMoTVlfUEFSQU1TKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0TWFya2VyKG1hcmtlcikge1xcbiAgICBzZXRNeVBhQ2FjaGUoXFxcIm1hcmtlclxcXCIsIG1hcmtlcik7XFxufVxcblxcbmZ1bmN0aW9uIHNldFRva2VuKHNoYXJlVG9rZW4pIHtcXG4gICAgc2V0TXlQYUNhY2hlKFxcXCJzaGFyZVRva2VuXFxcIiwgc2hhcmVUb2tlbik7XFxufVxcbmlmKE1ZX1BBUkFNUy5ub1BpYyl7XFxuICAgIHNldFBhZ2VQaWNVcmwoKTtcXG4gICAgc2V0TXlQYUNhY2hlKFxcXCJub1BpY1xcXCIsIGZhbHNlKTtcXG59XFxuLypcXG5mdW5jdGlvbiBzZXRWaWRlb0l0ZW1DYWNoZSh2aWRlb0l0ZW1DYWNoZSkge1xcbiAgICBzZXRNeVBhQ2FjaGUoXFxcInZpZGVvSXRlbUNhY2hlXFxcIiwgdmlkZW9JdGVtQ2FjaGUpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRTdWJ0aXRsZUNhY2hlKHN1YnRpdGxlQ2FjaGUpIHtcXG4gICAgc2V0TXlQYUNhY2hlKFxcXCJzdWJ0aXRsZUNhY2hlXFxcIiwgc3VidGl0bGVDYWNoZSk7XFxufSovXFxuXFxubGV0IGljb25UeXBlID0gXFxcImFpfGFwa3xhdml8Y3NzfGRtZ3xleGV8Zmx2fGdpZnxoaWtlcnxodG1sfGlzb3xqcGd8anN8anNvbnxsb2d8bW92fG1wM3xtcDR8b3RmfHBocHxwbmd8cHB0fHBzZHx0YWJsZXx0eHR8d2F2fHhsc3x6aXB8Y3NzfGRvY3xlcHVifGV4Y3xodG18eGxzeFxcXCIuc3BsaXQoJ3wnKTtcXG5cXG5mdW5jdGlvbiBnZXRJY29uKGV4dCwgdHlwZSkge1xcbiAgICBsZXQgcm9vdCA9IFxcXCJodHRwczovL2dpdGNvZGUubmV0L3FxXzMyMzk0MzUxL2RyLy0vcmF3L21hc3Rlci9pbWcv5paH5Lu257G75Z6LMi9cXFwiO1xcbiAgICBpZiAodHlwZSA9PT0gXFxcImZvbGRlclxcXCIpIHtcXG4gICAgICAgIHJldHVybiByb290ICsgXFxcIuaWh+S7tuWkuS5zdmdcXFwiO1xcbiAgICB9XFxuICAgIGlmIChpY29uVHlwZS5pbmNsdWRlcygoZXh0IHx8IFxcXCJcXFwiKS50b0xvd2VyQ2FzZSgpKSkge1xcbiAgICAgICAgcmV0dXJuIHJvb3QgKyBleHQgKyBcXFwiLnN2Z1xcXCI7XFxuICAgIH1cXG4gICAgcmV0dXJuIHJvb3QgKyBcXFwi5paH5Lu2LnN2Z1xcXCI7XFxuXFxufVxcblxcbmZ1bmN0aW9uIGxvYWQoaXRlbXMpIHtcXG4gICAgbGV0IGFsaVNoYXJlQXBpID0gbmV3IEFsaVNoYXJlQXBpKHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCAoc2hhcmVUb2tlbikgPT4ge1xcbiAgICAgICAgc2V0VG9rZW4oc2hhcmVUb2tlbik7XFxuICAgICAgICBNWV9QQVJBTVMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW47XFxuICAgIH0pO1xcbiAgICBsZXQgb3JkZXJzID0ge1xcbiAgICAgICAgXFxcIuWQjeensOato+W6j1xcXCI6IFxcXCJuYW1lI0FTQ1xcXCIsXFxuICAgICAgICBcXFwi5ZCN56ew5YCS5bqPXFxcIjogXFxcIm5hbWUjREVTQ1xcXCIsXFxuICAgICAgICBcXFwi5pe26Ze05q2j5bqPXFxcIjogXFxcInVwZGF0ZWRfYXQjQVNDXFxcIixcXG4gICAgICAgIFxcXCLml7bpl7TlgJLluo9cXFwiOiBcXFwidXBkYXRlZF9hdCNERVNDXFxcIixcXG4gICAgICAgIFxcXCLlpKflsI/mraPluo9cXFwiOiBcXFwic2l6ZSNBU0NcXFwiLFxcbiAgICAgICAgXFxcIuWkp+Wwj+WAkuW6j1xcXCI6IFxcXCJzaXplI0RFU0NcXFwiXFxuICAgIH07XFxuICAgIGxldCBvcmRlcnNLZXlzID0gT2JqZWN0LmtleXMob3JkZXJzKTtcXG4gICAgbGV0IG9yZGVyTmFtZSA9IGdldEl0ZW0oXFxcImFsaXl1bl9vcmRlclxcXCIsIG9yZGVyc0tleXNbMF0pO1xcbiAgICBsZXQgb3JkZXIgPSBvcmRlcnNbb3JkZXJOYW1lXS5zcGxpdChcXFwiI1xcXCIpO1xcbiAgICBsZXQgc3R5bGVzID0gW1xcXCJ0ZXh0XzFcXFwiLCBcXFwibW92aWVfMlxcXCIsIFxcXCJjYXJkX3BpY18zXFxcIiwgXFxcImF2YXRhclxcXCIsIFxcXCLov73liadcXFwiXTtcXG4gICAgbGV0IHN0eWxlID0gZ2V0SXRlbShcXFwiYWxpeXVuX3N0eWxlXFxcIiwgc3R5bGVzWzBdKTtcXG4gICAgaWYgKE1ZX1BBR0UgPT09IDEpIHtcXG4gICAgICAgIGlmICghZ2V0TXlWYXIoXFxcIm1vdW50emltdVxcXCIsIFxcXCJcXFwiKSkge1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJtb3VudHppbXVcXFwiLCB7fSk7XFxuICAgICAgICAgICAgYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwibW91bnR6aW11XFxcIik7XFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcImFsaVNoYXJlVG9rZW5cXFwiKTtcXG4gICAgICAgICAgICAgICAgY2xlYXJWYXIoXFxcImRtX3NoYXJlXFxcIik7XFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcImRtbGlzdFxcXCIpO1xcbiAgICAgICAgICAgIH0pKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHNldE1hcmtlcigpO1xcbiAgICAgICAgaWYgKHJlYWx1cmwgJiYgIWlzU2VhcmNoKSB7XFxuICAgICAgICAgICAgbGV0IHNoYXJlSW5mbyA9IGFsaVNoYXJlQXBpLmdldFNoYXJlSW5mbygpO1xcblxcbiAgICAgICAgICAgIGxldCBmaWxlSW5mbyA9IHNoYXJlSW5mby5maWxlX2luZm9zO1xcbiAgICAgICAgICAgIGlmIChmaWxlSW5mby5sZW5ndGggPT09IDEgJiYgZmlsZUluZm9bMF0udHlwZSA9PT0gXFxcImZvbGRlclxcXCIgJiYgIWZpbGVJZCkge1xcbiAgICAgICAgICAgICAgICBmaWxlSWQgPSBmaWxlSW5mb1swXS5maWxlX2lkO1xcbiAgICAgICAgICAgICAgICBzZXRQYWdlVGl0bGUoZmlsZUluZm9bMF0uZmlsZV9uYW1lKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBzZXRQYWdlVGl0bGUoc2hhcmVJbmZvLnNoYXJlX25hbWUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgZGVhZGxpbmUgPSBcXFwi5rC45LmF5pyJ5pWIXFxcIjtcXG5cXG4gICAgICAgICAgICBpZiAoc2hhcmVJbmZvLmV4cGlyYXRpb24pIHtcXG4gICAgICAgICAgICAgICAgZGVhZGxpbmUgPSBcXFwi5pyJ5pWI6Iez77yaXFxcIiArIGZvcm1hdERhdGUoc2hhcmVJbmZvLmV4cGlyYXRpb24pO1xcbiAgICAgICAgICAgICAgICAvL3NoYXJlSW5mby51cGRhdGVkX2F0XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogKHNoYXJlSW5mby5jcmVhdG9yX25hbWUgfHwgc2hhcmVJbmZvLmNyZWF0b3JfcGhvbmUpICsgXFxcIiZuYnNwOyZuYnNwO1xcXCIgKyBkZWFkbGluZS5zbWFsbCgpLFxcbiAgICAgICAgICAgICAgICB1cmw6IHJlYWx1cmwgKyBcXFwiI25vSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgICAgICAgICBpbWc6IHNoYXJlSW5mby5hdmF0YXJ8fFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX3Vua25vd25cXFwiLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICghaXNTZWFyY2gpIHtcXG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLmkJzntKJcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC50cmltKCk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gXFxcInRvYXN0Oi8v6K+36L6T5YWl5YWz6ZSu6K+NXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2FsaXl1biNub0hpc3RvcnkjI2Z1bGxUaGVtZSM/cGFnZT1meXBhZ2Umc2VhcmNoS2V5PVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogc2hhcmVQd2QsXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZUlkOiBzaGFyZUlkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVUb2tlbjogc2hhcmVUb2tlblxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnFxcXCIgKyBzZWFyY2hLZXkgKyBcXFwi4oCd4oCd55qE5pCc57Si57uT5p6cXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGZ1blN0eWxlID0gaXNTZWFyY2ggPyBcXFwiaWNvbl9zbWFsbF8zXFxcIiA6IFxcXCJpY29uX3JvdW5kX3NtYWxsXzRcXFwiO1xcbiAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IHN0eWxlLFxcbiAgICAgICAgICAgIHVybDogJChzdHlsZXMsIDEsIFxcXCLmjpLluIPmoLflvI9cXFwiKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJhbGl5dW5fc3R5bGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LliIfmjaJcXFwiO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBmdW5TdHlsZSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9hbGlfaWNvbi5zdmdcXFwiXFxuICAgICAgICB9LCB7XFxuICAgICAgICAgICAgdGl0bGU6IG9yZGVyTmFtZSxcXG4gICAgICAgICAgICB1cmw6ICQob3JkZXJzS2V5cywgMiwgXFxcIuaOkuW6j+aWueW8j1xcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcImFsaXl1bl9vcmRlclxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIh+aNouaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgY29sX3R5cGU6IGZ1blN0eWxlLFxcbiAgICAgICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2FsaV9zb3J0LnN2Z1xcXCJcXG4gICAgICAgIH0sIHtcXG4gICAgICAgICAgICB0aXRsZTogZ2V0SXRlbShcXFwiYWxpeXVuX3BsYXlNb2RlXFxcIiwgXFxcIui9rOeggVxcXCIpLFxcbiAgICAgICAgICAgIHVybDogJChbXFxcIui9rOeggVxcXCIsIFxcXCLljp/nlLtcXFwiXSwgMiwgXFxcIuaSreaUvuaooeW8j1xcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcImFsaXl1bl9wbGF5TW9kZVxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIh+aNouaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgY29sX3R5cGU6IGZ1blN0eWxlLFxcbiAgICAgICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2FsaV9wbGF5LnN2Z1xcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgaWYgKCFpc1NlYXJjaCkge1xcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWKn+iDvVxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogJChbXFxcIui9rOWtmOS6keebmFxcXCIsIFxcXCLnmbvpmYbotKblj7dcXFwiLCBcXFwi5aSN5Yi25YiG5Lqr6ZO+5o6lXFxcIiwgXFxcIuafpeeci+aJi+WKqOaMgui9veWtl+W5lVxcXCIsIFxcXCLojrflj5blvLnluZXmkJzntKLop4TliJlcXFwiLCBcXFwi5om56YeP5oyC6L295pys5Zyw5by55bmVXFxcIiwgXFxcIuaOqOmAgeWIsFRWQm94XFxcIiwgXFxcIuiuvue9ruaUtuiXj+WwgemdolxcXCJdLCAyLCBcXFwi5pu05aSa5Yqf6IO9XFxcIikuc2VsZWN0KChzaGFyZUlkLCBzaGFyZVB3ZCwgZmlsZUlkKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGlucHV0KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwi6L2s5a2Y5LqR55uYXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBzbWFydGRyaXZlOi8vc2hhcmUvYnJvd3NlP3NoYXJlSWQ9JHtzaGFyZUlkfSZzaGFyZVB3ZD0ke3NoYXJlUHdkfHxcXFwiXFxcIn1gO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIueZu+mZhui0puWPt1xcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwi5aSN5Yi25YiG5Lqr6ZO+5o6lXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoW1xcXCLlpI3liLbpk77mjqVcXFwiLCBcXFwi5aSN5Yi25rW36ZiU5Y+j5LukXFxcIl0sIDEsIFxcXCLliIbkuqvmlrnlvI9cXFwiKS5zZWxlY3QoKHVybCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi5aSN5Yi26ZO+5o6lXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyB1cmw7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL+mYv+mHjOS6keebmOWIhuS6q+WPo+S7pOOAjFxcXCIgKyBnZXRQYWdlVGl0bGUoKSArIFxcXCLjgI1cXFxcblxcXCIgKyB1cmwgKyBcXFwiIEBpbXBvcnQ9anM6YGhpa2VyOi8vcGFnZS9hbGl5dW4/cmVhbHVybD0ke2lucHV0LnRyaW0oKX0mcnVsZT3kupHnm5jlkJsu566AYDtcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvXFxcIiArIHNoYXJlSWQgKyAoZmlsZUlkID8gXFxcIi9mb2xkZXIvXFxcIiArIGZpbGVJZCA6IFxcXCJcXFwiKSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwi5om56YeP5oyC6L295pys5Zyw5by55bmVXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvZG1Nb3VudCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIuafpeeci+aJi+WKqOaMgui9veWtl+W5lVxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6bSA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJtb3VudHppbXVcXFwiLCB7fSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXAgPSB6bS5uYW1lID8gXFxcIuW9k+WJjeWtl+W5leaWh+S7tlxcXFxuXFxcIiArIHptLm5hbWUgKyBcXFwiLlxcXCIgKyB6bS5leHQgOiBcXFwi6L+Y5pyq5omL5Yqo5oyC6L295a2X5bmVXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+aJi+WKqOaMgui9veWtl+W5lScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB0aXAgKyBcXFwiXFxcXG4o54K55Ye75Y+W5raI5Y+v5Lul5riF6Zmk5oyC6L295a2X5bmVKVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWw6ICgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJtb3VudHppbXVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5riF6Zmk5omL5Yqo5oyC6L295a2X5bmVXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCLojrflj5blvLnluZXmkJzntKLop4TliJlcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJqc1xcXCI6IEpTT04uc3RyaW5naWZ5KFxcXCJoaWtlcjovL3BhZ2UvbG9hZERtP3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiJnRpdGxlPVxcXCIpICsgXFxcIitlbmNvZGVVUklDb21wb25lbnQocGxheWRhdGEudGl0bGUuc3BsaXQoJy0nKVswXSk7XFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogTVlfUlVMRS50aXRsZSArIFxcXCLlvLnluZXmkJzntKJcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwicnVsZTovL1xcXCIgKyBiYXNlNjRFbmNvZGUoXFxcIu+/pXByb2plY3Rpb25fc2NyZWVu77+lXFxcIiArIEpTT04uc3RyaW5naWZ5KHJ1bGUpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCLmjqjpgIHliLBUVkJveFxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3R2Ym94UHVzaCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIuiuvue9ruaUtuiXj+WwgemdolxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFtcXFwi6K6+572u5bCB6Z2i5Zyw5Z2AXFxcIiwgXFxcIuaQnOe0ouWwgemdolxcXCJdLCAxKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi6K6+572u5bCB6Z2i5Zyw5Z2AXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCJcXFwiLCBcXFwi6K+36L6T5YWl5Zu+54mH5Zyw5Z2AXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0LnRyaW0oKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+i+k+WFpeWcsOWdgFxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhZ2VQaWNVcmwoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvZnJvbnRDb3ZlciNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSwgc2hhcmVJZCwgc2hhcmVQd2QsIGZpbGVJZCksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl9yb3VuZF9zbWFsbF80XFxcIixcXG4gICAgICAgICAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvYWxpX2ZpbGVpbnRvLnN2Z1xcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBwYWdlSWQ6IHBhZ2VJZCxcXG4gICAgICAgICAgICAgICAgICAgIGZpbGVJZDogZmlsZUlkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVJZDogc2hhcmVJZCxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlVG9rZW46IHNoYXJlVG9rZW4sXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogc2hhcmVQd2QsXFxuICAgICAgICAgICAgICAgICAgICBmb2xkZXJOYW1lOiBnZXRQYWdlVGl0bGUoKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBsZXQgcmVzY29kID0ge307XFxuICAgIGxldCBtYXJrZXIgPSBNWV9QQVJBTVMubWFya2VyO1xcbiAgICBpZiAoaXNTZWFyY2gpIHtcXG4gICAgICAgIHJlc2NvZCA9IGFsaVNoYXJlQXBpLmdldFNlYXJjaExpc3RGaWxlKHNlYXJjaEtleSwgbWFya2VyLCBvcmRlclswXSwgb3JkZXJbMV0pO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmVzY29kID0gYWxpU2hhcmVBcGkuZ2V0TGlzdEZpbGUoZmlsZUlkLCBtYXJrZXIsIG9yZGVyWzBdLCBvcmRlclsxXSk7XFxuICAgIH1cXG4gICAgaWYgKHJlc2NvZC5uZXh0X21hcmtlcikge1xcbiAgICAgICAgc2V0TWFya2VyKHJlc2NvZC5uZXh0X21hcmtlcik7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBzZXRNYXJrZXIoKTtcXG4gICAgfVxcblxcbiAgICB2YXIgY29udHMgPSByZXNjb2QuaXRlbXM7XFxuICAgIC8v5a2X5bmV5Yy56YWN5YeG5aSHXFxuICAgIGxldCBzdWJFeHRzID0gW1xcXCJ2dHRcXFwiLCBcXFwic3J0XFxcIiwgXFxcImFzc1xcXCJdO1xcbiAgICB2YXIgemltdWxpc3QgPSBbXTtcXG4gICAgY29udHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgaWYgKHN1YkV4dHMuaW5jbHVkZXMoaXRlbS5maWxlX2V4dGVuc2lvbiAmJiBpdGVtLmZpbGVfZXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCkpKSB7XFxuICAgICAgICAgICAgbGV0IG5hbWUgPSBpdGVtLm5hbWUucmVwbGFjZSgnLicgKyBpdGVtLmZpbGVfZXh0ZW5zaW9uLCAnJyk7XFxuICAgICAgICAgICAgemltdWxpc3QucHVzaCh7XFxuICAgICAgICAgICAgICAgIGV4dDogaXRlbS5maWxlX2V4dGVuc2lvbixcXG4gICAgICAgICAgICAgICAgZmlsZV9pZDogaXRlbS5maWxlX2lkLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBuYW1lXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICAvL+WkhOeQhuWkuOmhteWMuemFjeWtl+W5lVxcbiAgICAvKlxcbiAgICBsZXQgaGFzU3ViID0gemltdWxpc3QubGVuZ3RoID4gMDtcXG4gICAgaWYgKGhhc1N1YiYmcmVzY29kLm5leHRfbWFya2VyKSB7XFxuICAgICAgICBpZiAoemltdWxpc3QubGVuZ3RoID4gNCkge1xcbiAgICAgICAgICAgIHNldFN1YnRpdGxlQ2FjaGUoemltdWxpc3Quc2xpY2UoLTQpKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgc2V0U3VidGl0bGVDYWNoZSh6aW11bGlzdCk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgbGV0IGxhc3RJdGVtID0gY29udHMuYXQoLTEpO1xcbiAgICBpZiAoaGFzU3ViJiZsYXN0SXRlbSYmbGFzdEl0ZW0uY2F0ZWdvcnkgPT09IFxcXCJ2aWRlb1xcXCIpIHtcXG4gICAgICAgIHNldFZpZGVvSXRlbUNhY2hlKGNvbnRzLnNwbGljZShjb250cy5sZW5ndGgtMSwxKSk7XFxuICAgIH1cXG4gICAgaWYgKE1ZX1BBR0UgPiAxKSB7XFxuICAgICAgICBsZXQgc3VidGl0bGVDYWNoZSA9IE1ZX1BBUkFNUy5zdWJ0aXRsZUNhY2hlIHx8IFtdO1xcbiAgICAgICAgemltdWxpc3QgPSB6aW11bGlzdC5jb25jYXQoc3VidGl0bGVDYWNoZSk7XFxuICAgICAgICBsZXQgdmlkZW9JdGVtQ2FjaGUgPSBNWV9QQVJBTVMudmlkZW9JdGVtQ2FjaGUgfHwgW107XFxuICAgICAgICBjb250cyA9IHZpZGVvSXRlbUNhY2hlLmNvbmNhdChjb250cyk7XFxuICAgICAgICBzZXRTdWJ0aXRsZUNhY2hlKCk7XFxuICAgICAgICBzZXRWaWRlb0l0ZW1DYWNoZSgpO1xcbiAgICB9Ki9cXG4gICAgLy/nroDkvZPkvJjlhYhcXG4gICAgemltdWxpc3Quc29ydCgoYSwgYikgPT4gKGIubmFtZS5lbmRzV2l0aChcXFwiLnNjXFxcIikgfHwgYi5uYW1lLmVuZHNXaXRoKFxcXCIuY2hzXFxcIikpIC0gKGEubmFtZS5lbmRzV2l0aChcXFwiLnNjXFxcIikgfHwgYS5uYW1lLmVuZHNXaXRoKFxcXCIuY2hzXFxcIikpKTtcXG4gICAgLy9lbmRcXG4gICAgbGV0IHRpdGxlSGVhZCA9IHtcXG4gICAgICAgIHZpZGVvOiBcXFwi8J+OrFxcXCIsXFxuICAgICAgICBhdWRpbzogXFxcIvCfjrVcXFwiLFxcbiAgICAgICAgZG9jOiBcXFwi8J+TkVxcXCIsXFxuICAgICAgICBpbWFnZTogXFxcIvCflrxcXFwiLFxcbiAgICAgICAgemlwOiBcXFwi8J+TplxcXCIsXFxuICAgICAgICBmb2xkZXI6IFxcXCLwn5OCXFxcIlxcbiAgICB9O1xcblxcbiAgICBmdW5jdGlvbiBnZXRIZWFkKHR5cGUsIGV4dCkge1xcbiAgICAgICAgbGV0IGhlYWQgPSB0aXRsZUhlYWRbdHlwZV07XFxuICAgICAgICBpZiAoc3ViRXh0cy5pbmNsdWRlcyhleHQpKSB7XFxuICAgICAgICAgICAgaGVhZCA9IFxcXCLwn5W4XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBoZWFkIHx8IFxcXCLinZNcXFwiO1xcbiAgICB9XFxuICAgIGxldCBmb2xkZXJTdHlsZSwgZmlsZVN0eWxlLCBpc1dhdGNoaW5nID0gc3R5bGUgPT09IFxcXCLov73liadcXFwiO1xcbiAgICBpZiAoaXNXYXRjaGluZykge1xcbiAgICAgICAgZm9sZGVyU3R5bGUgPSBcXFwiYXZhdGFyXFxcIjtcXG4gICAgICAgIGZpbGVTdHlsZSA9IFxcXCJtb3ZpZV8yXFxcIjtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGZvbGRlclN0eWxlID0gZmlsZVN0eWxlID0gc3R5bGU7XFxuICAgIH1cXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250cy5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgbGV0IGZpbGVJdGVtID0gY29udHNbaV07XFxuICAgICAgICBsZXQgY2F0ZSA9IGZpbGVJdGVtLmNhdGVnb3J5O1xcbiAgICAgICAgbGV0IGRlc2MgPSBmb3JtYXREYXRlKGZpbGVJdGVtLnVwZGF0ZWRfYXQpO1xcbiAgICAgICAgbGV0IHBpY191cmwgPSBnZXRJY29uKGZpbGVJdGVtLmZpbGVfZXh0ZW5zaW9uLCBmaWxlSXRlbS50eXBlKTtcXG5cXG4gICAgICAgIGlmIChmaWxlSXRlbS50eXBlID09PSBcXFwiZm9sZGVyXFxcIikge1xcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IChmb2xkZXJTdHlsZSA9PT0gXFxcInRleHRfMVxcXCIgPyB0aXRsZUhlYWQuZm9sZGVyIDogXFxcIlxcXCIpICsgZmlsZUl0ZW0ubmFtZTtcXG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICB1cmw6ICdoaWtlcjovL3BhZ2UvYWxpeXVuP3BhZ2U9ZnlwYWdlJyxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IGZvbGRlclN0eWxlLFxcbiAgICAgICAgICAgICAgICBkZXNjOiBmb3JtYXREYXRlKGZpbGVJdGVtLnVwZGF0ZWRfYXQpLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBwaWNfdXJsLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVJZDogc2hhcmVJZCxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlVG9rZW46IE1ZX1BBUkFNUy5zaGFyZVRva2VuLFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBmaWxlSXRlbS5maWxlX2lkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkLFxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBmaWxlSXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgbm9QaWM6IHRydWVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsZXQgc3VidGl0bGUsIGxvbmdjLCBjbHM7XFxuICAgICAgICAgICAgbGV0IHRpdGxlID0gKGZpbGVTdHlsZSA9PT0gXFxcInRleHRfMVxcXCIgPyBnZXRIZWFkKGNhdGUsIGZpbGVJdGVtLmZpbGVfZXh0ZW5zaW9uKSA6IFxcXCJcXFwiKSArIGZpbGVJdGVtLm5hbWU7XFxuICAgICAgICAgICAgbGV0IG5hbWVOb3RFeHQgPSBmaWxlSXRlbS5uYW1lLnJlcGxhY2UoJy4nICsgZmlsZUl0ZW0uZmlsZV9leHRlbnNpb24sICcnKTtcXG4gICAgICAgICAgICBpZiAoc3ViRXh0cy5pbmNsdWRlcyhmaWxlSXRlbS5maWxlX2V4dGVuc2lvbikpIHtcXG4gICAgICAgICAgICAgICAgbG9uZ2MgPSBbe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLmjILovb3lrZfluZVcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHptKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoJ21vdW50emltdScsIHptKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5oyC6L295a6M5oiQ77yM5b2T5YmN5a2X5bmV5paH5Lu2OiAnICsgem0ubmFtZSArICcuJyArIHptLmV4dDtcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBleHQ6IGZpbGVJdGVtLmZpbGVfZXh0ZW5zaW9uLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfaWQ6IGZpbGVJdGVtLmZpbGVfaWQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZU5vdEV4dFxcbiAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgIH1dO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoY2F0ZSA9PT0gXFxcInZpZGVvXFxcIikge1xcbiAgICAgICAgICAgICAgICBpZiAoemltdWxpc3QubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHppbXVsaXN0LmZpbmQodiA9PiB2Lm5hbWUuaW5jbHVkZXMobmFtZU5vdEV4dCkpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGNscyA9IFxcXCJwbGF5bGlzdCB2XFxcIiArIHBhZ2VJZDtcXG4gICAgICAgICAgICAgICAgcGljX3VybCA9IGZpbGVJdGVtLnRodW1ibmFpbCB8fCBwaWNfdXJsO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNXYXRjaGluZykge1xcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgaWYgKGZpbGVTdHlsZSA9PT0gXFxcInRleHRfMVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgZGVzYyArPSBcXFwiXFxcXHRcXFxcdFxcXCIgKyBmb3JtYXRTaXplKGZpbGVJdGVtLnNpemUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub1ByZSNcXFwiKS5sYXp5UnVsZSgoc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIGZpbGVJZCwgY2F0ZSwgc3VidGl0bGUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9hbGlsYXp5XFxcIikoc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIGZpbGVJZCwgY2F0ZSwgc3VidGl0bGUpO1xcbiAgICAgICAgICAgICAgICB9LCBzaGFyZUlkLCBzaGFyZVB3ZCwgTVlfUEFSQU1TLnNoYXJlVG9rZW4sIGZpbGVJdGVtLmZpbGVfaWQsIGNhdGUsIHN1YnRpdGxlKSxcXG4gICAgICAgICAgICAgICAgZGVzYzogZGVzYyxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogcGljX3VybCxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBmaWxlSXRlbS5maWxlX2lkLFxcbiAgICAgICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBsb25nYyxcXG4gICAgICAgICAgICAgICAgICAgIGNsczogY2xzLFxcbiAgICAgICAgICAgICAgICAgICAgLy9pbmhlcml0VGl0bGU6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBmaWxlSXRlbS5uYW1lXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBmaWxlU3R5bGVcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBpZiAoY29udHMubGVuZ3RoID09PSAwKSB7XFxuICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCJ+fn7ku4DkuYjpg73msqHmnInkuoblk6Z+fn5cXFwiLmZvbnRjb2xvcihcXFwiR3JheVxcXCIpLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5cXG5sZXQgaXRlbXMgPSBbXTtcXG50cnkge1xcbiAgICBpZiAoTVlfUEFHRSA+IDEgJiYgIU1ZX1BBUkFNUy5tYXJrZXIpIHtcXG4gICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIn5+fuS7gOS5iOmDveayoeacieS6huWTpn5+flxcXCIuZm9udGNvbG9yKFxcXCJHcmF5XFxcIiksXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgbG9hZChpdGVtcyk7XFxuICAgIH1cXG59IGNhdGNoIChlKSB7XFxuICAgIGlmIChlLm5hbWUgPT09IFxcXCJBbGlFcnJvclxcXCIpIHtcXG4gICAgICAgIGlmIChlLmNvZGUgPT09IFxcXCJJbnZhbGlkUmVzb3VyY2UuU2hhcmVQd2RcXFwiKSB7XFxuICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi6K+36L6T5YWl5o+Q5Y+W56CBXFxcIixcXG4gICAgICAgICAgICAgICAgZGVzYzogc2hhcmVQd2QgPyBcXFwi4oCc4oCc5o+Q5Y+W56CB6ZSZ6K+v4oCd4oCdXFxcIiA6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoKS5pbnB1dCgoTVlfUEFSQU1TKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBzZXRQYWdlUGFyYW1zKE9iamVjdC5hc3NpZ24oe30sIE1ZX1BBUkFNUywge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkOiBpbnB1dFxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgfSwgTVlfUEFSQU1TKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBpZiAoZS5zaWduaWZpY2FuY2UgPT09IDEpIHtcXG4gICAgICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBlLm1lc3NhZ2UuYmlnKCkuYmlnKCkuZm9udGNvbG9yKFxcXCJyZWRcXFwiKSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChlLnNpZ25pZmljYW5jZSA9PT0gMykge1xcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIGUubWVzc2FnZS5iaWcoKS5mb250Y29sb3IoXFxcImdyZWVuXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcblxcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgbG9nKFxcXCLliJfooajliqDovb3lpLHotKUjXFxcXG7plJnor6/kv6Hmga8+XFxcIiArIGUudG9TdHJpbmcoKSArIFxcXCJcXFxcbumUmeivr+ihjD5cXFwiICsgZS5saW5lTnVtYmVyKTtcXG4gICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn5qyn5qyn77yM5oql6ZSZ5LqG44CC5Zyo5Yi35paw5Yeg5qyh77yf5oiW6ICF5pu05o2i5paH5Lu25aS544CCJyxcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBkZXNjOiBlLnRvU3RyaW5nKCksXFxuICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbiAgICAgICAgfSk7XFxuICAgICAgICAvL3Rocm93IGU7XFxuICAgIH1cXG59XFxuc2F2ZU15UGFDYWNoZSgpO1xcbnNldFJlc3VsdChpdGVtcyk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLnmbvlvZXotKblj7dcIixcInBhdGhcIjpcImxvZ2luXCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcbnNldFBhZ2VUaXRsZShcXFwi55m75b2V6Zi/6YeM5LqR55uYXFxcIik7XFxubGV0IGxvZ2luVXJscyA9IFtcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3NpZ25cXFwiLCBcXFwiaHR0cHM6Ly9hdXRoLmFsaXl1bmRyaXZlLmNvbS92Mi9vYXV0aC9hdXRob3JpemU/bG9naW5fdHlwZT1jdXN0b20mcmVzcG9uc2VfdHlwZT1jb2RlJnJlZGlyZWN0X3VyaT1odHRwcyUzQSUyRiUyRnd3dy5hbGl5dW5kcml2ZS5jb20lMkZzaWduJTJGY2FsbGJhY2smY2xpZW50X2lkPTI1ZHpYM3ZiWXFrdFZ4eVgmc3RhdGU9JTdCJTIyb3JpZ2luJTIyJTNBJTIyKiUyMiU3RCMvbG9naW5cXFwiXTtcXG5sZXQgaW5kZXggPSBOdW1iZXIoZ2V0UGFyYW0oXFxcImluZGV4XFxcIiwgXFxcIjFcXFwiKSk7XFxuaWYgKE51bWJlci5pc05hTihpbmRleCkpIHtcXG4gICAgaW5kZXggPSAxO1xcbn1cXG5sZXQgdXJsID0gbG9naW5VcmxzW2luZGV4XTtcXG5sZXQgaXNSZWZyZXNoID0gIWdldFBhcmFtKFxcXCJub1JlZnJlc2hcXFwiKTtcXG5sZXQgYWxpVG9rZW5zRmlsZXBhdGg9ICQucmVxdWlyZShcXFwidG9rZW5QYXRoXFxcIikuYWxpVG9rZW5zRmlsZXBhdGg7XFxuXFxudmFyIGpzID0gJC50b1N0cmluZygoaXNSZWZyZXNoLCBhbGlUb2tlbnNGaWxlcGF0aCkgPT4ge1xcbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XFxuICAgICAgICB2YXIgdG9rZW4gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2tlbicpKTtcXG4gICAgICAgIGlmICh0b2tlbiAmJiB0b2tlbi51c2VyX2lkKSB7XFxuICAgICAgICAgICAgbGV0IHRva2VuX3VybCA9IGFsaVRva2Vuc0ZpbGVwYXRoO1xcbiAgICAgICAgICAgIGZ5X2JyaWRnZV9hcHAud3JpdGVGaWxlKHRva2VuX3VybCwgSlNPTi5zdHJpbmdpZnkodG9rZW4pKTtcXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcXG4gICAgICAgICAgICBmeV9icmlkZ2VfYXBwLmJhY2soaXNSZWZyZXNoKTtcXG4gICAgICAgICAgICBmeV9icmlkZ2VfYXBwLnRvYXN0KCdUT0tFTuiOt+WPluaIkOWKn++8jOivt+WLv+azhOa8j+S4quS6uumakOenge+8ge+8ge+8gScpO1xcbiAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgIH1cXG4gICAgfSwgMzAwKTtcXG59LCBpc1JlZnJlc2gsIGFsaVRva2Vuc0ZpbGVwYXRoKTtcXG5cXG5kLnB1c2goe1xcbiAgICB1cmw6IHVybCxcXG4gICAgY29sX3R5cGU6ICd4NV93ZWJ2aWV3X3NpbmdsZScsXFxuICAgIGRlc2M6ICcxMDAlJiZmbG9hdCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBjYW5CYWNrOiBmYWxzZSxcXG4gICAgICAgIGpzOiBqcyxcXG4gICAgICAgIHVybEludGVyY2VwdG9yOiAkLnRvU3RyaW5nKCgpID0+IHRydWUpXFxuICAgIH1cXG59KTtcXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLpmL/ph4zliJfooahBUElcIixcInBhdGhcIjpcIkFsaUFwaVwiLFwicnVsZVwiOlwianM6XFxuLy9AYXV0aG9yIExveURnSWtcXG5mdW5jdGlvbiBBbGlFcnJvcihlcnJvckNvZGUsIG1lc3NhZ2UsIHNpZ25pZmljYW5jZSkge1xcbiAgICBsZXQgZXJyb3JUeXBlID0gQWxpRXJyb3IuZXJyb3JDb2RlTWFwLmdldChlcnJvckNvZGUpIHx8IFtdO1xcbiAgICB0aGlzLmNvZGUgPSBlcnJvckNvZGU7XFxuICAgIHRoaXMubWVzc2FnZSA9IGVycm9yVHlwZVswXSB8fCBtZXNzYWdlIHx8IFxcXCJcXFwiO1xcbiAgICB0aGlzLm5hbWUgPSBcXFwiQWxpRXJyb3JcXFwiO1xcbiAgICB0aGlzLnNpZ25pZmljYW5jZSA9IGVycm9yVHlwZVsxXSB8fCBzaWduaWZpY2FuY2UgfHwgMTtcXG59XFxuQWxpRXJyb3IuZXJyb3JDb2RlTWFwID0gbmV3IE1hcChbXFxuICAgIFtcXFwiU2hhcmVMaW5rLkNhbmNlbGxlZFxcXCIsIFtcXFwi5YiG5Lqr6ZO+5o6l5bey5aSx5pWIXFxcIl1dLFxcbiAgICBbXFxcIlNoYXJlTGluay5Gb3JiaWRkZW5cXFwiLCBbXFxcIui/neinhOi1hOa6kOW3suiiq+WwgeemgVxcXCJdXSxcXG4gICAgW1xcXCJOb3RGb3VuZC5TaGFyZUxpbmtcXFwiLCBbXFxcIuS4jeWtmOWcqOivpemTvuaOpeivt+aguOWvuVxcXCJdXSxcXG4gICAgW1xcXCJBY2Nlc3NUb2tlbkludmFsaWRcXFwiLCBbXFxcIuiuv+mXruS7pOeJjOWkseaViO+8jOivt+mHjeaWsOeZu+mZhlxcXCJdXSxcXG4gICAgW1xcXCJTaGFyZUxpbmtUb2tlbkludmFsaWRcXFwiLCBbXFxcIuWIhuS6q+S7pOeJjOWkseaViFxcXCJdXSxcXG4gICAgW1xcXCJQYXJhbUZsb3dFeGNlcHRpb25cXFwiLCBbXFxcIuiuv+mXrui/h+S6jumikee5ge+8jOivt+eojeWQjuWGjeivlVxcXCIsIDNdXVxcbl0pO1xcblxcbkFsaUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCksIHtcXG4gICAgY29uc3RydWN0b3I6IEFsaUVycm9yXFxufSk7XFxuXFxuZnVuY3Rpb24gcG9zdEFwaShhcGksIGJvZHksIGhlYWRlcnMpIHtcXG4gICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoJ2h0dHBzOi8vYXBpLmFsaXl1bmRyaXZlLmNvbScgKyBhcGksIHtcXG4gICAgICAgIGhlYWRlcnM6IE9iamVjdC5hc3NpZ24oe1xcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXFxuICAgICAgICB9LCBoZWFkZXJzKSxcXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgfSk7XFxuICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXG4gICAgaWYgKHJlc3VsdC5jb2RlKSB7XFxuICAgICAgICB0aHJvdyBuZXcgQWxpRXJyb3IocmVzdWx0LmNvZGUsIHJlc3VsdC5tZXNzYWdlKTtcXG4gICAgfVxcbiAgICByZXR1cm4gcmVzdWx0O1xcbn1cXG5cXG5mdW5jdGlvbiBBbGlTaGFyZUFwaShzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVUb2tlbiwgcmVmcmVzaENhbGxCYWNrKSB7XFxuICAgIHRoaXMuc2hhcmVJZCA9IHNoYXJlSWQ7XFxuICAgIHRoaXMuc2hhcmVQd2QgPSBzaGFyZVB3ZDtcXG4gICAgdGhpcy5yZWZyZXNoQ2FsbEJhY2sgPSByZWZyZXNoQ2FsbEJhY2sgfHwgKCgpID0+IHZvaWQgMCk7XFxuICAgIHRoaXMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW4gfHwgdGhpcy5nZXRTaGFyZVRva2VuKCk7XFxufVxcbk9iamVjdC5hc3NpZ24oQWxpU2hhcmVBcGkucHJvdG90eXBlLCB7XFxuICAgIGdldFNoYXJlVG9rZW4oKSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gcG9zdEFwaShcXFwiL3YyL3NoYXJlX2xpbmsvZ2V0X3NoYXJlX3Rva2VuXFxcIiwge1xcbiAgICAgICAgICAgIFxcXCJzaGFyZV9pZFxcXCI6IHRoaXMuc2hhcmVJZCxcXG4gICAgICAgICAgICBcXFwic2hhcmVfcHdkXFxcIjogdGhpcy5zaGFyZVB3ZCxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgdGhpcy5zaGFyZVRva2VuID0gcmVzdWx0LnNoYXJlX3Rva2VuO1xcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2FsbEJhY2socmVzdWx0LnNoYXJlX3Rva2VuLCB0aGlzKTtcXG4gICAgICAgIHJldHVybiByZXN1bHQuc2hhcmVfdG9rZW47XFxuICAgIH0sXFxuICAgIHBvc3RUb2tlbkFwaShhcGksIGJvZHksIGhlYWRlcnMsIGlzUmV0cnkpIHtcXG4gICAgICAgIGxldCByZXN1bHQ7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIHJlc3VsdCA9IHBvc3RBcGkoYXBpLCBib2R5LCBPYmplY3QuYXNzaWduKHtcXG4gICAgICAgICAgICAgICAgXFxcIlgtU2hhcmUtVG9rZW5cXFwiOiB0aGlzLnNoYXJlVG9rZW4gfHwgdGhpcy5nZXRTaGFyZVRva2VuKClcXG4gICAgICAgICAgICB9LCBoZWFkZXJzKSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgaWYgKChlLmNvZGUgPT09IFxcXCJBY2Nlc3NUb2tlbkludmFsaWRcXFwiIHx8IGUuY29kZSA9PT0gXFxcIlNoYXJlTGlua1Rva2VuSW52YWxpZFxcXCIpICYmICFpc1JldHJ5KSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2hhcmVUb2tlbigpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wb3N0VG9rZW5BcGkoYXBpLCBib2R5LCBoZWFkZXJzLCB0cnVlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdGhyb3cgZTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICAgIGdldExpc3RGaWxlKGZpbGVJZCwgbWFya2VyLCBvcmRlckJ5LCBvcmRlckRpcmVjdGlvbikge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucG9zdFRva2VuQXBpKFxcXCIvYWRyaXZlL3YzL2ZpbGUvbGlzdFxcXCIsIHtcXG4gICAgICAgICAgICBcXFwic2hhcmVfaWRcXFwiOiB0aGlzLnNoYXJlSWQsXFxuICAgICAgICAgICAgXFxcInBhcmVudF9maWxlX2lkXFxcIjogZmlsZUlkIHx8IFxcXCJyb290XFxcIixcXG4gICAgICAgICAgICBcXFwibGltaXRcXFwiOiAxMDAsXFxuICAgICAgICAgICAgXFxcImltYWdlX3RodW1ibmFpbF9wcm9jZXNzXFxcIjogXFxcImltYWdlL3Jlc2l6ZSx3XzE2MC9mb3JtYXQsanBlZ1xcXCIsXFxuICAgICAgICAgICAgXFxcImltYWdlX3VybF9wcm9jZXNzXFxcIjogXFxcImltYWdlXFxcXC9yZXNpemUsd18xOTIwL2Zvcm1hdCxqcGVnXFxcIixcXG4gICAgICAgICAgICBcXFwidmlkZW9fdGh1bWJuYWlsX3Byb2Nlc3NcXFwiOiBcXFwidmlkZW8vc25hcHNob3QsdF8xMDAwLGZfanBnLGFyX2F1dG8sd18zMDBcXFwiLFxcbiAgICAgICAgICAgIFxcXCJvcmRlcl9ieVxcXCI6IG9yZGVyQnkgfHwgXFxcIm5hbWVcXFwiLFxcbiAgICAgICAgICAgIFxcXCJvcmRlcl9kaXJlY3Rpb25cXFwiOiBvcmRlckRpcmVjdGlvbiB8fCBcXFwiQVNDXFxcIixcXG4gICAgICAgICAgICBcXFwibWFya2VyXFxcIjogbWFya2VyXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICAgIGdldFNoYXJlSW5mbygpIHtcXG4gICAgICAgIGxldCByZXN1bHQgPSBwb3N0QXBpKFxcXCIvYWRyaXZlL3YzL3NoYXJlX2xpbmsvZ2V0X3NoYXJlX2J5X2Fub255bW91cz9zaGFyZV9pZD1cXFwiICsgdGhpcy5zaGFyZUlkLCB7XFxuICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogdGhpcy5zaGFyZUlkXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICAgIGdldFNlYXJjaExpc3RGaWxlKGtleSwgbWFya2VyLCBvcmRlckJ5LCBvcmRlckRpcmVjdGlvbikge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucG9zdFRva2VuQXBpKFxcXCIvcmVjb21tZW5kL3YxL3NoYXJlTGluay9zZWFyY2hcXFwiLCB7XFxuICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogdGhpcy5zaGFyZUlkLFxcbiAgICAgICAgICAgIFxcXCJrZXl3b3JkXFxcIjoga2V5LFxcbiAgICAgICAgICAgIFxcXCJsaW1pdFxcXCI6IDEwMCxcXG4gICAgICAgICAgICBcXFwib3JkZXJfYnlcXFwiOiBvcmRlckJ5ICsgXFxcIiBcXFwiICsgb3JkZXJEaXJlY3Rpb24sXFxuICAgICAgICAgICAgXFxcIm1hcmtlclxcXCI6IG1hcmtlciB8fCB1bmRlZmluZWRcXG4gICAgICAgIH0pO1xcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID09PSAwKSB7XFxuICAgICAgICAgICAgcmVzdWx0Lml0ZW1zID0gW107XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICB9XFxufSk7XFxuJC5leHBvcnRzID0gQWxpU2hhcmVBcGk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLpmL/ph4zmkq3mlL5BUElcIixcInBhdGhcIjpcImFsaVBsYXlBcGlcIixcInJ1bGVcIjpcIi8vQGF1dGhvciBMb3lEZ0lrXFxuZnVuY3Rpb24gcG9zdEFwaShhcGksIGJvZHksIGhlYWRlcnMsIGFnYWluVHJ5LCB0cnlGcmUpIHtcXG4gICAgbGV0IHJlc3VsdDtcXG4gICAgdHJ5IHtcXG4gICAgICAgIHJlc3VsdCA9IHJlcXVlc3QoYXBpLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSA/IGFwaSA6ICdodHRwczovL2FwaS5hbGl5dW5kcml2ZS5jb20nICsgYXBpLCB7XFxuICAgICAgICAgICAgaGVhZGVyczogT2JqZWN0LmFzc2lnbih7XFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXFxuICAgICAgICAgICAgfSwgaGVhZGVycyksXFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xcbiAgICAgICAgaWYgKHJlc3VsdC5jb2RlKSB7XFxuICAgICAgICAgICAgbGV0IG1zZyA9IHJlc3VsdC5kaXNwbGF5X21lc3NhZ2UgfHwgcmVzdWx0Lm1lc3NhZ2U7XFxuICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGFwaSArIFxcXCI9PlxcXCIgKyByZXN1bHQuY29kZSArIFxcXCI6XFxcIiArIG1zZyk7XFxuICAgICAgICAgICAgZXJyb3IuY29kZSA9IHJlc3VsdC5jb2RlO1xcbiAgICAgICAgICAgIGVycm9yLmp1ZGdlTXNnID0gbXNnXFxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcmJvZHkgPSByZXN1bHQgJiYgcmVzdWx0LnJlc3BvbnNlcyAmJiByZXN1bHQucmVzcG9uc2VzWzBdICYmIHJlc3VsdC5yZXNwb25zZXNbMF0uYm9keSB8fCB7fTtcXG4gICAgICAgIGlmIChyYm9keS5jb2RlKSB7XFxuICAgICAgICAgICAgbGV0IG1zZyA9IHJib2R5LmRpc3BsYXlfbWVzc2FnZSB8fCByYm9keS5tZXNzYWdlO1xcbiAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihhcGkgKyBcXFwiPT5cXFwiICsgcmJvZHkuY29kZSArIFxcXCI6XFxcIiArIG1zZyk7XFxuICAgICAgICAgICAgZXJyb3IuY29kZSA9IHJib2R5LmNvZGU7XFxuICAgICAgICAgICAgZXJyb3IuanVkZ2VNc2cgPSBtc2c7XFxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIHRyeUZyZSA9IHRyeUZyZSA9PT0gdW5kZWZpbmVkID8gMSA6IHRyeUZyZTtcXG4gICAgICAgIGlmIChhZ2FpblRyeSAmJiB0cnlGcmUgPiAwKSB7XFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhZ2FpblRyeSA9PT0gXFxcImZ1bmN0aW9uXFxcIikge1xcbiAgICAgICAgICAgICAgICBsZXQgbmV3RGF0YSA9IGFnYWluVHJ5KGUsIHJlc3VsdCwgYm9keSwgaGVhZGVycywgdHJ5RnJlKTtcXG4gICAgICAgICAgICAgICAgaWYgKG5ld0RhdGEpIHtcXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYm9keSwgbmV3RGF0YS5ib2R5KTtcXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaGVhZGVycywgbmV3RGF0YS5oZWFkZXJzKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gcG9zdEFwaShhcGksIGJvZHksIGhlYWRlcnMsIGFnYWluVHJ5LCB0cnlGcmUgLSAxKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHRocm93IGU7XFxuICAgIH1cXG4gICAgcmV0dXJuIHJlc3VsdDtcXG59XFxuXFxuZnVuY3Rpb24gQWxpQWNjZXNzQXBpKHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCBhbGlUb2tlbnMsIG9wZW5Ub2tlbnMsIHJlZnJlc2hTaGFyZUNhbGxCYWNrLCByZWZyZXNoQWNjZXNzQ2FsbEJhY2ssIHJlZnJlc2hPcGVuQ2FsbEJhY2spIHtcXG4gICAgdGhpcy5zaGFyZUlkID0gc2hhcmVJZDtcXG4gICAgdGhpcy5zaGFyZVB3ZCA9IHNoYXJlUHdkO1xcbiAgICB0aGlzLnJlZnJlc2hTaGFyZUNhbGxCYWNrID0gcmVmcmVzaFNoYXJlQ2FsbEJhY2sgfHwgKCgpID0+IHZvaWQgMCk7XFxuICAgIHRoaXMucmVmcmVzaEFjY2Vzc0NhbGxCYWNrID0gcmVmcmVzaEFjY2Vzc0NhbGxCYWNrIHx8ICgoKSA9PiB2b2lkIDApO1xcbiAgICB0aGlzLnJlZnJlc2hPcGVuQ2FsbEJhY2sgPSByZWZyZXNoT3BlbkNhbGxCYWNrIHx8ICgoKSA9PiB2b2lkIDApO1xcbiAgICB0aGlzLnNoYXJlVG9rZW4gPSBzaGFyZVRva2VuIHx8IHRoaXMuZ2V0U2hhcmVUb2tlbigpO1xcbiAgICB0aGlzLmFsaVRva2VucyA9IGFsaVRva2VucyB8fCB7fTtcXG4gICAgaWYgKCF0aGlzLmFsaVRva2Vucy5yZWZyZXNoX3Rva2VuKSB7XFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuacqueZu+mZhlxcXCIpO1xcbiAgICB9XFxuICAgIGlmICghdGhpcy5hbGlUb2tlbnMuYWNjZXNzX3Rva2VuKSB7XFxuICAgICAgICB0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpO1xcbiAgICB9XFxuICAgIHRoaXMuZGVmRHJpdmVJZCA9IHRoaXMuYWxpVG9rZW5zLnJlc291cmNlX2RyaXZlX2lkIHx8IHRoaXMuYWxpVG9rZW5zLmRlZmF1bHRfZHJpdmVfaWQ7XFxuICAgIHRoaXMucmVhY2Nlc3NUayA9ICh0aGlzLmFsaVRva2Vucy50b2tlbl90eXBlIHx8IFxcXCJCZWFyZXJcXFwiKSArICcgJyArIHRoaXMuYWxpVG9rZW5zLmFjY2Vzc190b2tlbjtcXG4gICAgdGhpcy5vcGVuVG9rZW5zID0gb3BlblRva2VucyB8fCB7XFxuICAgICAgICAnUmVmcmVzaFRva2VuT3Blbic6ICcnLFxcbiAgICAgICAgJ0FjY2Vzc1Rva2VuT3Blbic6ICcnLFxcbiAgICAgICAgJ0JpbmRSZWZyZXNoVG9rZW4nOiAnJyxcXG4gICAgfTtcXG4gICAgaWYgKG9wZW5Ub2tlbnMgIT09IG51bGwgJiYgIXRoaXMub3BlblRva2Vucy5BY2Nlc3NUb2tlbk9wZW4pIHtcXG4gICAgICAgIHRoaXMucmVmcmVzaE9wZW5Ub2tlbigpO1xcbiAgICB9XFxufVxcbk9iamVjdC5hc3NpZ24oQWxpQWNjZXNzQXBpLnByb3RvdHlwZSwge1xcbiAgICB3YWl0U2xlZXAodGltZSkge1xcbiAgICAgICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCh0aW1lIHx8IDYwMCk7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgdHJ5U29sdmUoZSkge1xcbiAgICAgICAgaWYgKGUuY29kZSA9PT0gXFxcIlNoYXJlTGlua1Rva2VuSW52YWxpZFxcXCIgfHwgZS5jb2RlID09PSBcXFwiSW52YWxpZFBhcmFtZXRlck5vdE1hdGNoLlNoYXJlSWRcXFwiKSB7XFxuICAgICAgICAgICAgdGhpcy53YWl0U2xlZXAoMjApLmdldFNoYXJlVG9rZW4oKTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0gZWxzZSBpZiAoZS5jb2RlID09PSBcXFwiQWNjZXNzVG9rZW5JbnZhbGlkXFxcIiB8fCBlLmNvZGUgPT09IFxcXCJBY2Nlc3NUb2tlbkV4cGlyZWRcXFwiKSB7XFxuICAgICAgICAgICAgdGhpcy53YWl0U2xlZXAoMjApLnJlZnJlc2hBY2Nlc3NUb2tlbigpO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfSBlbHNlIGlmIChlLmNvZGUgPT09IFxcXCJGb3JiaWRkZW5Ob1Blcm1pc3Npb24uRmlsZVxcXCIgfHwgKGUuY29kZSA9PT0gXFxcIkJhZFJlcXVlc3RcXFwiICYmIGUuanVkZ2VNc2cgPT09IFxcXCLku4Xlj6/kv53lrZjliLDovazlrZjnqbrpl7RcXFwiKSkge1xcbiAgICAgICAgICAgIHRoaXMuYWxpVG9rZW5zLnJlc291cmNlX2RyaXZlX2lkID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgfSxcXG4gICAgZ2V0U2hhcmVUb2tlbigpIHtcXG4gICAgICAgIGxldCByZXN1bHQgPSBwb3N0QXBpKFxcXCIvdjIvc2hhcmVfbGluay9nZXRfc2hhcmVfdG9rZW5cXFwiLCB7XFxuICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogdGhpcy5zaGFyZUlkLFxcbiAgICAgICAgICAgIFxcXCJzaGFyZV9wd2RcXFwiOiB0aGlzLnNoYXJlUHdkLFxcbiAgICAgICAgfSk7XFxuICAgICAgICB0aGlzLnNoYXJlVG9rZW4gPSByZXN1bHQuc2hhcmVfdG9rZW47XFxuICAgICAgICB0aGlzLnJlZnJlc2hTaGFyZUNhbGxCYWNrKHJlc3VsdC5zaGFyZV90b2tlbiwgdGhpcyk7XFxuICAgICAgICByZXR1cm4gcmVzdWx0LnNoYXJlX3Rva2VuO1xcbiAgICB9LFxcbiAgICByZWZyZXNoQWNjZXNzVG9rZW4oKSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gcG9zdEFwaShcXFwiaHR0cHM6Ly9hdXRoLmFsaXl1bmRyaXZlLmNvbS92Mi9hY2NvdW50L3Rva2VuXFxcIiwge1xcbiAgICAgICAgICAgIFxcXCJncmFudF90eXBlXFxcIjogXFxcInJlZnJlc2hfdG9rZW5cXFwiLFxcbiAgICAgICAgICAgIFxcXCJyZWZyZXNoX3Rva2VuXFxcIjogdGhpcy5hbGlUb2tlbnMucmVmcmVzaF90b2tlbixcXG4gICAgICAgIH0sIHtcXG4gICAgICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6IFBDX1VBLFxcbiAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9cXFwiXFxuICAgICAgICB9LCAoZSkgPT4ge1xcbiAgICAgICAgICAgIGlmIChlLmNvZGUgPT09IFxcXCJJbnZhbGlkUGFyYW1ldGVyLlJlZnJlc2hUb2tlblxcXCIpIHtcXG4gICAgICAgICAgICAgICAgZS5tZXNzYWdlID0gXFxcIiPnmbvpmYbov4fmnJ/or7fph43mlrDnmbvpmYYjXFxcXG5cXFwiICsgZS5tZXNzYWdlO1xcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGVsZXRlIHJlc3VsdC51c2VyX2RhdGE7XFxuICAgICAgICBsZXQgb3JpZ2luRGVmZERyaXZlSWQgPSB0aGlzLmFsaVRva2Vucy5kZWZhdWx0X2RyaXZlX2lkO1xcbiAgICAgICAgdGhpcy5hbGlUb2tlbnMgPSBPYmplY3QuYXNzaWduKHRoaXMuYWxpVG9rZW5zLCByZXN1bHQpO1xcbiAgICAgICAgdGhpcy5yZWFjY2Vzc1RrID0gdGhpcy5hbGlUb2tlbnMudG9rZW5fdHlwZSArICcgJyArIHRoaXMuYWxpVG9rZW5zLmFjY2Vzc190b2tlbjtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgaWYgKChvcmlnaW5EZWZkRHJpdmVJZCAhPT0gdGhpcy5hbGlUb2tlbnMuZGVmYXVsdF9kcml2ZV9pZCkgfHwgdGhpcy5hbGlUb2tlbnMucmVzb3VyY2VfZHJpdmVfaWQgPT09IHVuZGVmaW5lZCkge1xcbiAgICAgICAgICAgICAgICBsZXQgcmVzb3VyY2VfZHJpdmVfaWQgPSB0aGlzLmdldFVzZXJJbmZvKCkucmVzb3VyY2VfZHJpdmVfaWQ7XFxuICAgICAgICAgICAgICAgIHRoaXMuYWxpVG9rZW5zLnJlc291cmNlX2RyaXZlX2lkID0gcmVzb3VyY2VfZHJpdmVfaWQ7XFxuICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZV9kcml2ZV9pZCkge1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZEcml2ZUlkID0gcmVzb3VyY2VfZHJpdmVfaWQ7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZkRyaXZlSWQgPSB0aGlzLmFsaVRva2Vucy5kZWZhdWx0X2RyaXZlX2lkO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhcXFwi55So5oi35L+h5oGv6I635Y+W5aSx6LSl77yaXFxcIiArIGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgICAgICB0aGlzLnJlZnJlc2hBY2Nlc3NDYWxsQmFjayhyZXN1bHQsIHRoaXMpO1xcbiAgICAgICAgcmV0dXJuIHRoaXMuYWxpVG9rZW5zO1xcbiAgICB9LFxcbiAgICBnZXRVc2VySW5mbygpIHtcXG4gICAgICAgIGxldCBpbmZvID0gcG9zdEFwaShcXFwiaHR0cHM6Ly91c2VyLmFsaXl1bmRyaXZlLmNvbS92Mi91c2VyL2dldFxcXCIsIHt9LCB7XFxuICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBQQ19VQSxcXG4gICAgICAgICAgICBcXFwiYXV0aG9yaXphdGlvblxcXCI6IHRoaXMucmVhY2Nlc3NUayxcXG4gICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vXFxcIlxcbiAgICAgICAgfSwgKGUpID0+IHtcXG4gICAgICAgICAgICB0aGlzLnRyeVNvbHZlKGUpO1xcbiAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICdhdXRob3JpemF0aW9uJzogdGhpcy5yZWFjY2Vzc1RrXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiBpbmZvO1xcbiAgICB9LFxcbiAgICBfZ2V0T3BlblRva2VuKGNvZGUpIHtcXG4gICAgICAgIGxldCBib2R5ID0ge30sXFxuICAgICAgICAgICAgaGVhZGVycyA9IHtcXG4gICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiBQQ19VQSxcXG4gICAgICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tLydcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgaWYgKGNvZGUpIHtcXG4gICAgICAgICAgICBib2R5ID0ge1xcbiAgICAgICAgICAgICAgICBjb2RlOiBjb2RlLFxcbiAgICAgICAgICAgICAgICBncmFudF90eXBlOiBcXFwiYXV0aG9yaXphdGlvbl9jb2RlXFxcIlxcbiAgICAgICAgICAgIH07XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGJvZHkgPSB7XFxuICAgICAgICAgICAgICAgIGdyYW50X3R5cGU6IFxcXCJyZWZyZXNoX3Rva2VuXFxcIixcXG4gICAgICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogdGhpcy5vcGVuVG9rZW5zLlJlZnJlc2hUb2tlbk9wZW4sXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGpzb24gPSBwb3N0KCdodHRwczovL2FwaS54aG9mZS50b3AvYWxpc3QvYWxpX29wZW4vY29kZScsIHtcXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxcbiAgICAgICAgfSk7XFxuICAgICAgICBpZiAoIWpzb24pIHtcXG4gICAgICAgICAgICBqc29uID0gcG9zdCgnaHR0cHM6Ly9hcGktY2Yubm4uY2kvYWxpc3QvYWxpX29wZW4vY29kZScsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoanNvbi5pbmNsdWRlcygnVG9vIE1hbnkgUmVxdWVzdHMnKSB8fCBqc29uLmluY2x1ZGVzKFxcXCI1MDIgQmFkIEdhdGV3YXlcXFwiKSkge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6aKR57mB6K+35rGC5pqC5pe26KKr5bCB56aBXFxcXG5cXFwiICsganNvbik7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGxldCBvcGVuUmVzdWx0ID0gSlNPTi5wYXJzZShqc29uKTtcXG4gICAgICAgICAgICBpZiAob3BlblJlc3VsdC5yZWZyZXNoX3Rva2VuKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMub3BlblRva2Vucy5SZWZyZXNoVG9rZW5PcGVuID0gb3BlblJlc3VsdC5yZWZyZXNoX3Rva2VuO1xcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5Ub2tlbnMuQWNjZXNzVG9rZW5PcGVuID0gb3BlblJlc3VsdC50b2tlbl90eXBlICsgXFxcIiBcXFwiICsgb3BlblJlc3VsdC5hY2Nlc3NfdG9rZW47XFxuICAgICAgICAgICAgICAgIHRoaXMub3BlblRva2Vucy5CaW5kUmVmcmVzaFRva2VuID0gdGhpcy5hbGlUb2tlbnMucmVmcmVzaF90b2tlbjtcXG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoT3BlbkNhbGxCYWNrKG9wZW5SZXN1bHQsIHRoaXMpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuVG9rZW5zO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGlmICghY29kZSkge1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndhaXRTbGVlcCg1MCkuY2FjaGVPcGVuVG9rZW4oKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwib3BlblRva2Vu6I635Y+W5aSx6LSlXFxcXG5cXFwiICsganNvbik7XFxuICAgIH0sXFxuICAgIGNhY2hlT3BlblRva2VuKCkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHBvc3RBcGkoJ2h0dHBzOi8vb3Blbi5hbGl5dW5kcml2ZS5jb20vb2F1dGgvdXNlcnMvYXV0aG9yaXplP2NsaWVudF9pZD0nICsgJzc2OTE3Y2NjY2Q0NDQxYzM5NDU3YTA0ZjYwODRmYjJmJyArICcmcmVkaXJlY3RfdXJpPWh0dHBzOi8vYWxpc3Qubm4uY2kvdG9vbC9hbGl5dW5kcml2ZS9jYWxsYmFjayZzY29wZT11c2VyOmJhc2UsZmlsZTphbGw6cmVhZCxmaWxlOmFsbDp3cml0ZSZzdGF0ZT0nLCB7XFxuICAgICAgICAgICAgXFxcImF1dGhvcml6ZVxcXCI6IDEsXFxuICAgICAgICAgICAgXFxcInNjb3BlXFxcIjogXFxcInVzZXI6YmFzZSxmaWxlOmFsbDpyZWFkLGZpbGU6YWxsOndyaXRlXFxcIlxcbiAgICAgICAgfSwge1xcbiAgICAgICAgICAgICdVc2VyLUFnZW50JzogUENfVUEsXFxuICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tLycsXFxuICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLnJlYWNjZXNzVGssIC8vZ2V0QWNjZXNzVG9rZW5cXG4gICAgICAgICAgICAneC1jYW5hcnknOiAnY2xpZW50PXdlYixhcHA9c2hhcmUsdmVyc2lvbj12Mi4zLjEnLFxcbiAgICAgICAgICAgICd4LXNoYXJlLXRva2VuJzogdGhpcy5zaGFyZVRva2VuXFxuICAgICAgICB9LCAoZSkgPT4ge1xcbiAgICAgICAgICAgIHRoaXMudHJ5U29sdmUoZSk7XFxuICAgICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLnJlYWNjZXNzVGssXFxuICAgICAgICAgICAgICAgICAgICAneC1zaGFyZS10b2tlbic6IHRoaXMuc2hhcmVUb2tlblxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBsZXQgY29kZSA9IHJlc3VsdC5yZWRpcmVjdFVyaS5zcGxpdChcXFwiY29kZT1cXFwiKVsxXTtcXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcGVuVG9rZW4oY29kZSk7XFxuICAgIH0sXFxuICAgIHJlZnJlc2hPcGVuVG9rZW4oKSB7XFxuICAgICAgICBpZiAodGhpcy5vcGVuVG9rZW5zLlJlZnJlc2hUb2tlbk9wZW4gJiYgdGhpcy5vcGVuVG9rZW5zLkJpbmRSZWZyZXNoVG9rZW4gPT09IHRoaXMuYWxpVG9rZW5zLnJlZnJlc2hfdG9rZW4pIHtcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3BlblRva2VuKCk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlT3BlblRva2VuKCk7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIF9jbG91ZEZpbGVPcGVyYXRlKGJvZHksIGNsb3VkRmlsZUlkLCBvcGVyYXRlVXJsKSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gcG9zdEFwaSgnaHR0cHM6Ly9hcGkuYWxpeXVuZHJpdmUuY29tL2Fkcml2ZS92Mi9iYXRjaCcsIHtcXG4gICAgICAgICAgICBcXFwicmVxdWVzdHNcXFwiOiBbe1xcbiAgICAgICAgICAgICAgICBcXFwiYm9keVxcXCI6IGJvZHksXFxuICAgICAgICAgICAgICAgIFxcXCJoZWFkZXJzXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIkNvbnRlbnQtVHlwZVxcXCI6IFxcXCJhcHBsaWNhdGlvbi9qc29uXFxcIlxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBcXFwiaWRcXFwiOiBjbG91ZEZpbGVJZCB8fCBcXFwiMFxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJtZXRob2RcXFwiOiBcXFwiUE9TVFxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJ1cmxcXFwiOiBvcGVyYXRlVXJsXFxuICAgICAgICAgICAgfV0sXFxuICAgICAgICAgICAgXFxcInJlc291cmNlXFxcIjogXFxcImZpbGVcXFwiXFxuICAgICAgICB9LCB7XFxuICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiBQQ19VQSxcXG4gICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJyxcXG4gICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMucmVhY2Nlc3NUayxcXG4gICAgICAgICAgICAvL2dldEFjY2Vzc1Rva2VuXFxuICAgICAgICAgICAgJ3gtY2FuYXJ5JzogJ2NsaWVudD13ZWIsYXBwPXNoYXJlLHZlcnNpb249djIuMy4xJyxcXG4gICAgICAgICAgICAneC1zaGFyZS10b2tlbic6IHRoaXMuc2hhcmVUb2tlblxcblxcbiAgICAgICAgfSwgKGUsIHIsIGIpID0+IHtcXG4gICAgICAgICAgICBpZiAoZS5jb2RlID09PSBcXFwiUXVvdGFFeGhhdXN0ZWQuRHJpdmVcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHRocm93IGU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICghdGhpcy50cnlTb2x2ZShlKSkge1xcbiAgICAgICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgyMCkucmVmcmVzaEFjY2Vzc1Rva2VuKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBib2R5ID0gYi5yZXF1ZXN0c1swXS5ib2R5O1xcbiAgICAgICAgICAgIGlmIChib2R5LmRyaXZlX2lkKSB7XFxuICAgICAgICAgICAgICAgIGJvZHkuZHJpdmVfaWQgPSB0aGlzLmRlZkRyaXZlSWRcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKGJvZHkudG9fZHJpdmVfaWQpIHtcXG4gICAgICAgICAgICAgICAgYm9keS50b19kcml2ZV9pZCA9IHRoaXMuZGVmRHJpdmVJZFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBib2R5OiBiLFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMucmVhY2Nlc3NUayxcXG4gICAgICAgICAgICAgICAgICAgICd4LXNoYXJlLXRva2VuJzogdGhpcy5zaGFyZVRva2VuXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICB9LFxcbiAgICBjb3B5RmlsZVRvQ2xvdWRGaWxlKGZpbGVJZCwgcmV0cnkpIHtcXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9jbG91ZEZpbGVPcGVyYXRlKHtcXG4gICAgICAgICAgICBcXFwiZmlsZV9pZFxcXCI6IGZpbGVJZCxcXG4gICAgICAgICAgICBcXFwic2hhcmVfaWRcXFwiOiB0aGlzLnNoYXJlSWQsXFxuICAgICAgICAgICAgXFxcImF1dG9fcmVuYW1lXFxcIjogdHJ1ZSxcXG4gICAgICAgICAgICBcXFwidG9fcGFyZW50X2ZpbGVfaWRcXFwiOiBcXFwicm9vdFxcXCIsXFxuICAgICAgICAgICAgXFxcInRvX2RyaXZlX2lkXFxcIjogdGhpcy5kZWZEcml2ZUlkXFxuICAgICAgICB9LCBcXFwiMFxcXCIsIFxcXCIvZmlsZS9jb3B5XFxcIik7XFxuICAgICAgICBsZXQgYm9keSA9IHJlc3VsdCAmJiByZXN1bHQucmVzcG9uc2VzICYmIHJlc3VsdC5yZXNwb25zZXNbMF0gJiYgcmVzdWx0LnJlc3BvbnNlc1swXS5ib2R5IHx8IHt9O1xcbiAgICAgICAgaWYgKCFib2R5LmZpbGVfaWQgJiYgIXJldHJ5KSB7XFxuICAgICAgICAgICAgdGhpcy53YWl0U2xlZXAoMjApLmdldFNoYXJlVG9rZW4oKTtcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgyMCkucmVmcmVzaEFjY2Vzc1Rva2VuKCk7XFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2FpdFNsZWVwKDIwKS5jb3B5RmlsZVRvQ2xvdWRGaWxlKGZpbGVJZCwgdHJ1ZSk7XFxuICAgICAgICB9IGVsc2UgaWYgKCFib2R5LmZpbGVfaWQpIHtcXG4gICAgICAgICAgICBsZXQgZSA9IG5ldyBFcnJvcihcXFwi5paH5Lu25aSN5Yi25aSx6LSlOlxcXFxuXFxcIiArIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpO1xcbiAgICAgICAgICAgIGUuY29kZSA9IGJvZHkuY29kZTtcXG4gICAgICAgICAgICB0aHJvdyBlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXNwb25zZXNbMF0uYm9keS5maWxlX2lkO1xcbiAgICB9LFxcbiAgICBvcGVuQ2xvdWRGaWxlVG9Eb3duVXJsKGNsb3VkRmlsZUlkKSB7XFxuICAgICAgICBsZXQgZmlsZUluZm8gPSBwb3N0QXBpKCdodHRwczovL29wZW4uYWxpeXVuZHJpdmUuY29tL2Fkcml2ZS92MS4wL29wZW5GaWxlL2dldERvd25sb2FkVXJsJywge1xcbiAgICAgICAgICAgICdmaWxlX2lkJzogY2xvdWRGaWxlSWQsXFxuICAgICAgICAgICAgJ2RyaXZlX2lkJzogdGhpcy5kZWZEcml2ZUlkXFxuICAgICAgICB9LCB7XFxuICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiBQQ19VQSxcXG4gICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJyxcXG4gICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMub3BlblRva2Vucy5BY2Nlc3NUb2tlbk9wZW5cXG4gICAgICAgIH0sIChlKSA9PiB7XFxuICAgICAgICAgICAgdGhpcy53YWl0U2xlZXAoMzApLnRyeVNvbHZlKGUpO1xcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDMwKS5yZWZyZXNoT3BlblRva2VuKCk7XFxuICAgICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgICAgICAgICAgJ2RyaXZlX2lkJzogdGhpcy5kZWZEcml2ZUlkLFxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMub3BlblRva2Vucy5BY2Nlc3NUb2tlbk9wZW5cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH07XFxuICAgICAgICB9LCAyKTtcXG4gICAgICAgIGlmICghZmlsZUluZm8udXJsIHx8IGZpbGVJbmZvLmNvZGUpIHRocm93IG5ldyBFcnJvcihcXFwi5LiL6L296ZO+5o6l6I635Y+W5aSx6LSlXFxcXG5cXFwiICsgZmlsZUluZm8uY29kZSArIFxcXCI6XFxcIiArIGZpbGVJbmZvLm1lc3NhZ2UpO1xcbiAgICAgICAgcmV0dXJuIGZpbGVJbmZvLnVybDtcXG4gICAgfSxcXG4gICAgZGVsZXRlZUNsb3VkRmlsZShjbG91ZEZpbGVJZCkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX2Nsb3VkRmlsZU9wZXJhdGUoe1xcbiAgICAgICAgICAgIFxcXCJkcml2ZV9pZFxcXCI6IHRoaXMuZGVmRHJpdmVJZCxcXG4gICAgICAgICAgICBcXFwiZmlsZV9pZFxcXCI6IGNsb3VkRmlsZUlkXFxuICAgICAgICB9LCBjbG91ZEZpbGVJZCwgXFxcIi9maWxlL2RlbGV0ZVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfSxcXG4gICAgZ2V0VmlkZW9UZW1QbGF5VXJsKGZpbGVJZCkge1xcbiAgICAgICAgbGV0IGNsb3VkRmlsZUlkID0gdGhpcy5jb3B5RmlsZVRvQ2xvdWRGaWxlKGZpbGVJZCk7XFxuICAgICAgICB0aGlzLndhaXRTbGVlcCgyMCk7XFxuICAgICAgICBsZXQgcGxheVVybCA9IHRoaXMub3BlbkNsb3VkRmlsZVRvRG93blVybChjbG91ZEZpbGVJZCk7XFxuICAgICAgICB0aGlzLndhaXRTbGVlcCg1MCk7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlZUNsb3VkRmlsZShjbG91ZEZpbGVJZCk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKFxcXCIj5paH5Lu25Yig6Zmk5aSx6LSlI1xcXFxu6ZSZ6K+v5L+h5oGvPlxcXCIgKyBlLnRvU3RyaW5nKCkgKyBcXFwiXFxcXG7plJnor6/ooYw+XFxcIiArIGUubGluZU51bWJlcik7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gcGxheVVybDtcXG4gICAgfSxcXG4gICAgZ2V0RmlsZVRvRG93blVybChmaWxlSWQpIHtcXG4gICAgICAgIGxldCBkb3dubG9hZEluZm8gPSBwb3N0QXBpKFxcXCIvdjIvZmlsZS9nZXRfc2hhcmVfbGlua19kb3dubG9hZF91cmxcXFwiLCB7XFxuICAgICAgICAgICAgXFxcImV4cGlyZV9zZWNcXFwiOiA2MDAsXFxuICAgICAgICAgICAgXFxcImZpbGVfaWRcXFwiOiBmaWxlSWQsXFxuICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogdGhpcy5zaGFyZUlkXFxuICAgICAgICB9LCB7XFxuICAgICAgICAgICAgXFxcIlgtU2hhcmUtVG9rZW5cXFwiOiB0aGlzLnNoYXJlVG9rZW4sXFxuICAgICAgICAgICAgXFxcImF1dGhvcml6YXRpb25cXFwiOiB0aGlzLmFsaVRva2Vucy5hY2Nlc3NfdG9rZW5cXG4gICAgICAgIH0sIChlKSA9PiB7XFxuICAgICAgICAgICAgdGhpcy50cnlTb2x2ZShlKTtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiWC1TaGFyZS1Ub2tlblxcXCI6IHRoaXMuc2hhcmVUb2tlbixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJhdXRob3JpemF0aW9uXFxcIjogdGhpcy5hbGlUb2tlbnMuYWNjZXNzX3Rva2VuXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gZG93bmxvYWRJbmZvLmRvd25sb2FkX3VybDtcXG4gICAgfSxcXG4gICAgZ2V0U2lnbigpIHtcXG4gICAgICAgIGlmICghdGhpcy5hbGlUb2tlbnMuZGV2aWNlX2lkKSB7XFxuICAgICAgICAgICAgdGhpcy53YWl0U2xlZXAoMjApLnJlZnJlc2hBY2Nlc3NUb2tlbigpO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGNhbGN1bGF0ZU5ld1NpZ24gPSAoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHNpZ24gPSBqdXN0VGVzdFNpZ24oXFxcIjVkZGU0ZTFiZGY5ZTQ5NjZiMzg3YmE1OGY0YjNmZGMzXFxcIiwgdGhpcy5hbGlUb2tlbnMuZGV2aWNlX2lkLCB0aGlzLmFsaVRva2Vucy51c2VyX2lkKS5zcGxpdChcXFwiIyNcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBzaWduYXR1cmU6IHNpZ24uYXQoMCksXFxuICAgICAgICAgICAgICAgIHB1YktleTogc2lnbi5hdCgtMSlcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgfTtcXG4gICAgICAgIGxldCBuZXdTaWduID0gY2FsY3VsYXRlTmV3U2lnbigpO1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHBvc3RBcGkoJy91c2Vycy92MS91c2Vycy9kZXZpY2UvY3JlYXRlX3Nlc3Npb24nLCB7XFxuICAgICAgICAgICAgXFxcImRldmljZU5hbWVcXFwiOiBcXFwiRWRnZea1j+iniOWZqFxcXCIsXFxuICAgICAgICAgICAgXFxcIm1vZGVsTmFtZVxcXCI6IFxcXCJXaW5kb3dz572R6aG154mIXFxcIixcXG4gICAgICAgICAgICBcXFwicHViS2V5XFxcIjogbmV3U2lnbi5wdWJLZXksXFxuICAgICAgICB9LCB7XFxuICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiBQQ19VQSxcXG4gICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20nLFxcbiAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogdGhpcy5yZWFjY2Vzc1RrLFxcbiAgICAgICAgICAgICdYLVNoYXJlLVRva2VuJzogdGhpcy5zaGFyZVRva2VuLFxcbiAgICAgICAgICAgICd4LWRldmljZS1pZCc6IHRoaXMuYWxpVG9rZW5zLmRldmljZV9pZCxcXG4gICAgICAgICAgICAneC1zaWduYXR1cmUnOiBuZXdTaWduLnNpZ25hdHVyZVxcbiAgICAgICAgfSwgKGUpID0+IHtcXG4gICAgICAgICAgICBpZiAoZS5tZXNzYWdlID09PSBcXFwieC1kZXZpY2UtaWQgZW1wdHlcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdGhpcy50cnlTb2x2ZShlKTtcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCg1MCk7XFxuICAgICAgICAgICAgbmV3U2lnbiA9IGNhbGN1bGF0ZU5ld1NpZ24oKTtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicHViS2V5XFxcIjogbmV3U2lnbi5wdWJLZXlcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiB0aGlzLnJlYWNjZXNzVGssXFxuICAgICAgICAgICAgICAgICAgICAnWC1TaGFyZS1Ub2tlbic6IHRoaXMuc2hhcmVUb2tlbixcXG4gICAgICAgICAgICAgICAgICAgICd4LWRldmljZS1pZCc6IHRoaXMuYWxpVG9rZW5zLmRldmljZV9pZCxcXG4gICAgICAgICAgICAgICAgICAgICd4LXNpZ25hdHVyZSc6IG5ld1NpZ24uc2lnbmF0dXJlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCAzKTtcXG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xcbiAgICAgICAgICAgIHJldHVybiBuZXdTaWduO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIlNpZ27ojrflj5blpLHotKXvvIzor7fph43or5XjgIJcXFxcbmNvZGU6XFxcIiArIChyZXN1bHQuY29kZSB8fCBcXFwiXFxcIikgKyBcXFwiXFxcXG5tZXNzYWdlOlxcXCIgKyAocmVzdWx0Lm1lc3NhZ2UgfHwgXFxcIlxcXCIpKTtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAgZ2V0U2hhcmVWaWRlb1ByZXZpZXcoZmlsZUlkKSB7XFxuICAgICAgICBsZXQgc2lnbiA9IHRoaXMuZ2V0U2lnbigpO1xcbiAgICAgICAgbGV0IGpzb24gPSBwb3N0QXBpKCdodHRwczovL2FwaS5hbGl5dW5kcml2ZS5jb20vdjIvZmlsZS9nZXRfc2hhcmVfbGlua192aWRlb19wcmV2aWV3X3BsYXlfaW5mbycse1xcbiAgICAgICAgICAgIFxcXCJjYXRlZ29yeVxcXCI6IFxcXCJsaXZlX3RyYW5zY29kaW5nXFxcIixcXG4gICAgICAgICAgICBcXFwiZmlsZV9pZFxcXCI6IGZpbGVJZCxcXG4gICAgICAgICAgICBcXFwiZ2V0X3ByZXZpZXdfdXJsXFxcIjogdHJ1ZSxcXG4gICAgICAgICAgICBcXFwic2hhcmVfaWRcXFwiOiB0aGlzLnNoYXJlSWQsXFxuICAgICAgICAgICAgXFxcInRlbXBsYXRlX2lkXFxcIjogXFxcIlxcXCIsXFxuICAgICAgICAgICAgXFxcImdldF9zdWJ0aXRsZV9pbmZvXFxcIjogdHJ1ZVxcbiAgICAgICAgfSwge1xcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JyxcXG4gICAgICAgICAgICBcXFwib3JpZ2luXFxcIjogXFxcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbVxcXCIsXFxuICAgICAgICAgICAgXFxcInJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL1xcXCIsXFxuICAgICAgICAgICAgXFxcInVzZXItYWdlbnRcXFwiOiBcXFwiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExMC4wLjAuMCBTYWZhcmkvNTM3LjM2IEVkZy8xMTAuMC4xNTg3LjQxXFxcIixcXG4gICAgICAgICAgICBcXFwieC1jYW5hcnlcXFwiOiBcXFwiY2xpZW50PXdlYixhcHA9YWRyaXZlLHZlcnNpb249djMuMS4wXFxcIixcXG4gICAgICAgICAgICBcXFwieC1zaGFyZS10b2tlblxcXCI6IHRoaXMuc2hhcmVUb2tlbixcXG4gICAgICAgICAgICBcXFwiZmlsZWlkXFxcIjogdGhpcy5hbGlUb2tlbnMudXNlcl9pZCxcXG4gICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IHRoaXMucmVhY2Nlc3NUayxcXG4gICAgICAgICAgICAneC1kZXZpY2UtaWQnOiB0aGlzLmFsaVRva2Vucy5kZXZpY2VfaWQsXFxuICAgICAgICAgICAgJ3gtc2lnbmF0dXJlJzogc2lnbi5zaWduYXR1cmVcXG4gICAgICAgIH0sIChlKSA9PiB7XFxuICAgICAgICAgICAgdGhpcy50cnlTb2x2ZShlKTtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IHRoaXMucmVhY2Nlc3NUayxcXG4gICAgICAgICAgICAgICAgICAgICdYLXNoYXJlLXRva2VuJzogdGhpcy5zaGFyZVRva2VuLFxcbiAgICAgICAgICAgICAgICAgICAgJ3gtZGV2aWNlLWlkJzogdGhpcy5hbGlUb2tlbnMuZGV2aWNlX2lkLFxcbiAgICAgICAgICAgICAgICAgICAgJ3gtc2lnbmF0dXJlJzogc2lnbi5zaWduYXR1cmVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcblxcbiAgICAgICAgcmV0dXJuIGpzb24udmlkZW9fcHJldmlld19wbGF5X2luZm8ubGl2ZV90cmFuc2NvZGluZ190YXNrX2xpc3QucmV2ZXJzZSgpO1xcbiAgICB9XFxufSk7XFxuXFxuQWxpQWNjZXNzQXBpLmNyZWF0ZURlZmF1bHQgPSBmdW5jdGlvbihzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVUb2tlbiwgYWxpVG9rZW4sIG9wZW5Ub2tlbiwgTVlfVElUTEUpIHtcXG4gICAgY29uc3Qge1xcbiAgICAgICAgb3BlblRva2Vuc0ZpbGVwYXRoLFxcbiAgICAgICAgYWxpVG9rZW5zRmlsZXBhdGhcXG4gICAgfSA9ICQucmVxdWlyZShcXFwidG9rZW5QYXRoXFxcIiArIChNWV9USVRMRSA/IFxcXCI/cnVsZT1cXFwiICsgTVlfVElUTEUgOiBcXFwiXFxcIikpO1xcblxcbiAgICBmdW5jdGlvbiBzYXZlQWxpVG9rZW4ocmVzdWx0LCBhcGkpIHtcXG4gICAgICAgIHdyaXRlRmlsZShhbGlUb2tlbnNGaWxlcGF0aCwgSlNPTi5zdHJpbmdpZnkoYXBpLmFsaVRva2VucykpO1xcbiAgICB9XFxuXFxuICAgIGZ1bmN0aW9uIHNhdmVPcGVuVG9rZW4ocmVzdWx0LCBhcGkpIHtcXG4gICAgICAgIHdyaXRlRmlsZShvcGVuVG9rZW5zRmlsZXBhdGgsIEpTT04uc3RyaW5naWZ5KGFwaS5vcGVuVG9rZW5zKSk7XFxuICAgIH1cXG5cXG4gICAgZnVuY3Rpb24gcHV0U2hhcmVUb2tlbihyZXN1bHQpIHtcXG4gICAgICAgIGlmIChNWV9USVRMRSkge1xcbiAgICAgICAgICAgIHNoYXJlVG9rZW4gPSBwdXRWYXIoTVlfVElUTEUgKyBcXFwiQFxcXCIgKyBcXFwiYWxpU2hhcmVUb2tlblxcXCIsIHJlc3VsdCk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHNoYXJlVG9rZW4gPSBwdXRNeVZhcihcXFwiYWxpU2hhcmVUb2tlblxcXCIsIHJlc3VsdCk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaWYgKCFvcGVuVG9rZW4gJiYgb3BlblRva2VuICE9PSBudWxsICYmIGZpbGVFeGlzdChvcGVuVG9rZW5zRmlsZXBhdGgpKSB7XFxuICAgICAgICBvcGVuVG9rZW4gPSAkLnJlcXVpcmUob3BlblRva2Vuc0ZpbGVwYXRoKTtcXG4gICAgfVxcbiAgICBpZiAoIWFsaVRva2VuICYmIGZpbGVFeGlzdChhbGlUb2tlbnNGaWxlcGF0aCkpIHtcXG4gICAgICAgIGFsaVRva2VuID0gJC5yZXF1aXJlKGFsaVRva2Vuc0ZpbGVwYXRoKTtcXG4gICAgfVxcbiAgICBpZiAoTVlfVElUTEUpIHtcXG4gICAgICAgIHNoYXJlVG9rZW4gPSBnZXRWYXIoTVlfVElUTEUgKyBcXFwiQFxcXCIgKyBcXFwiYWxpU2hhcmVUb2tlblxcXCIsIHNoYXJlVG9rZW4pO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgc2hhcmVUb2tlbiA9IGdldE15VmFyKFxcXCJhbGlTaGFyZVRva2VuXFxcIiwgc2hhcmVUb2tlbik7XFxuICAgIH1cXG4gICAgcmV0dXJuIG5ldyBBbGlBY2Nlc3NBcGkoc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIGFsaVRva2VuLCBvcGVuVG9rZW4sIHB1dFNoYXJlVG9rZW4sIHNhdmVBbGlUb2tlbiwgc2F2ZU9wZW5Ub2tlbik7XFxufVxcbiQuZXhwb3J0cyA9IEFsaUFjY2Vzc0FwaTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIlRva2Vu6Lev5b6EXCIsXCJwYXRoXCI6XCJ0b2tlblBhdGhcIixcInJ1bGVcIjpcIiQuZXhwb3J0cz17XFxuICAgIFxcXCJvcGVuVG9rZW5zRmlsZXBhdGhcXFwiOiBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9Mb3lEZ0lrL2FsaU9wZW5Ub2tlbi5qc29uXFxcIixcXG4gICAgXFxcImFsaVRva2Vuc0ZpbGVwYXRoXFxcIjogXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvTG95RGdJay9hbGlUb2tlbi5qc29uXFxcIlxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW8ueW5leW3peWFt1wiLFwicGF0aFwiOlwiZGFubXVcIixcInJ1bGVcIjpcImpzOlxcbmxldCBiYXNpY1VybCA9IFxcXCJodHRwczovL2FwaS5kYW5kYW5wbGF5Lm5ldC9cXFwiO1xcbmxldCBzZXZlUGF0aCA9IFxcXCJoaWtlcjovL2ZpbGVzL2NhY2hlL2Rhbm11L1xcXCI7XFxuJC5leHBvcnRzLmdldERhbk11ID0gZnVuY3Rpb24oa2V5KSB7XFxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlcXVlc3QoYmFzaWNVcmwgKyBcXFwiYXBpL3YyL3NlYXJjaC9lcGlzb2Rlcz9hbmltZT1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGRlY29kZVVSSUNvbXBvbmVudChrZXkpKSkpO1xcbn1cXG5cXG5mdW5jdGlvbiBlbmNvZGVIdG1sKHMpIHtcXG4gICAgbGV0IFJFR1hfSFRNTF9FTkNPREUgPSAv4oCcfCZ84oCZfFxcXFx1MDAzQ3w+fFtcXFxceDAwLVxcXFx4MjBdfFtcXFxceDdGLVxcXFx4RkZdfFtcXFxcdTAxMDAtXFxcXHUyNzAwXS9nO1xcbiAgICByZXR1cm4gcy5yZXBsYWNlKFJFR1hfSFRNTF9FTkNPREUsIGZ1bmN0aW9uKCQwKSB7XFxuICAgICAgICB2YXIgYyA9ICQwLmNoYXJDb2RlQXQoMCksXFxuICAgICAgICAgICAgciA9IFtcXFwiJiNcXFwiXTtcXG4gICAgICAgIGMgPSAoYyA9PSAweDIwKSA/IDB4QTAgOiBjO1xcbiAgICAgICAgci5wdXNoKGMpO1xcbiAgICAgICAgci5wdXNoKFxcXCI7XFxcIik7XFxuICAgICAgICByZXR1cm4gci5qb2luKFxcXCJcXFwiKTtcXG4gICAgfSk7XFxufVxcblxcblxcblxcbi8vMOm7mOiupCAx566A5L2TIDLnuYHkvZNcXG4kLmV4cG9ydHMuZG93bmxvYWREYW5NdSA9IGZ1bmN0aW9uKGVwaXNvZGVJZCwgbmFtZSkge1xcbiAgICBsZXQgZGFuTXVEYXRhID0gSlNPTi5wYXJzZShyZXF1ZXN0KGJ1aWxkVXJsKGJhc2ljVXJsICsgXFxcIi9hcGkvdjIvY29tbWVudC9cXFwiICsgZXBpc29kZUlkLCB7XFxuICAgICAgICB3aXRoUmVsYXRlZDogdHJ1ZSxcXG4gICAgICAgIGNoQ29udmVydDogMVxcbiAgICB9KSkpO1xcbiAgICBsZXQgZE1jb250ZXh0ID0gXFxcIlxcXCI7XFxuICAgIGZvciAobGV0IGNvbW1lbnQgb2YgZGFuTXVEYXRhLmNvbW1lbnRzKSB7XFxuICAgICAgICAvL2RNY29udGV4dCArPSBgPGQgcD1cXFwiJHtNYXRoLnJvdW5kKHRpbWVwb2ludCl9LCR7Y3R9LCR7c2l6ZX0sJHtjb2xvcn0sMFxcXCI+JHtjb250ZW50fTwvZD5cXFxcbmA7XFxuICAgICAgICBsZXQgcGFyYW1UZXh0ID0gY29tbWVudC5wO1xcbiAgICAgICAgbGV0IGNvbW1lbnRUZXh0ID0gY29tbWVudC5tO1xcbiAgICAgICAgaWYgKHBhcmFtVGV4dCA9PSBudWxsIHx8IGNvbW1lbnRUZXh0ID09IG51bGwpIGNvbnRpbnVlO1xcbiAgICAgICAgbGV0IHBhcmFtcyA9IHBhcmFtVGV4dC5zcGxpdChcXFwiLFxcXCIpO1xcbiAgICAgICAgbGV0IHBhcmFtc1QgPSBbXTtcXG4gICAgICAgIGZvciAobGV0IGkgaW4gcGFyYW1zKSB7XFxuICAgICAgICAgICAgaWYgKGkgPT0gMykge1xcbiAgICAgICAgICAgICAgICAvL+minOiJsuWAvOS4ujDml7bvvIzpu5jorqTorr7nva7kuLrnmb3oibJcXG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtc1tpXSA9PSBcXFwiMFxcXCIgfHwgcGFyYW1zW2ldID09IFxcXCItMVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1QucHVzaChcXFwiMTY3NzcyMTVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXFxuICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKGkgPT0gMikge1xcbiAgICAgICAgICAgICAgICBwYXJhbXNULnB1c2goXFxcIjI1XFxcIik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHBhcmFtc1QucHVzaChwYXJhbXNbaV0pO1xcblxcbiAgICAgICAgfVxcbiAgICAgICAgcGFyYW1zVC5wdXNoKFxcXCIwXFxcIiwgXFxcIjBcXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgZE1jb250ZXh0ICs9IGA8ZCBwPVxcXCIke3BhcmFtc1Quam9pbignLCcpfVxcXCI+JHtlbmNvZGVIdG1sKGNvbW1lbnRUZXh0KX08L2Q+XFxcXG5gO1xcbiAgICB9XFxuICAgIGlmICghZE1jb250ZXh0KSByZXR1cm47XFxuICAgIGRNY29udGV4dCA9IGA8P3htbCB2ZXJzaW9uPVxcXCIxLjBcXFwiIGVuY29kaW5nPVxcXCJVVEYtOFxcXCI/PjxpPlxcXFxuJHtkTWNvbnRleHR9PC9pPmA7XFxuICAgIGxldCBwYXRoID0gc2V2ZVBhdGggKyBuYW1lLnJlcGxhY2UoL1xcXFwvL2csXFxcIl9cXFwiKSArIFxcXCJfXFxcIiArIGVwaXNvZGVJZCArIFxcXCIueG1sXFxcIjtcXG4gICAgd3JpdGVGaWxlKHBhdGgsIGRNY29udGV4dCk7XFxuICAgIHJldHVybiBwYXRoO1xcbn1cXG4kLmV4cG9ydHMuZ2V0TG9jYWxEYW5NdSA9IGZ1bmN0aW9uKGVwaXNvZGVJZCwgbmFtZSkge1xcbiAgICBsZXQgcGF0aCA9IHNldmVQYXRoICsgbmFtZS5yZXBsYWNlKC9cXFxcLy9nLFxcXCJfXFxcIikgKyBcXFwiX1xcXCIgKyBlcGlzb2RlSWQgKyBcXFwiLnhtbFxcXCI7XFxuICAgIGlmIChmaWxlRXhpc3QocGF0aCkpIHtcXG4gICAgICAgIHJldHVybiBwYXRoO1xcbiAgICB9XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5by55bmV5pCc57SiJuWKoOi9vVwiLFwicGF0aFwiOlwibG9hZERtXCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZCA9IFtdO1xcbmxldCBvbmx5RG93bmxvYWQgPSAhIU1ZX1BBUkFNUy5vbmx5RG93bmxvYWQ7XFxuaWYgKG9ubHlEb3dubG9hZCkge1xcbiAgICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgfSk7XFxufVxcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIixcXG4gICAgdGl0bGU6IFxcXCI8Zm9udCBjb2xvcj0nR3JheSc+4p2X5YWz5LqOPGJyPjxzbWFsbD4g5YaF572u5by55bmV5pCc57Si5pWw5o2u5p2l5rqQ5LqOW+W8ueW8uXBsYXldPC9zbWFsbD48L2ZvbnQ+XFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG59KTtcXG5sZXQga2V5ID0gTVlfUEFSQU1TLm5hbWUgfHwgZ2V0TXlWYXIoXFxcInNcXFwiKSB8fCBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInRpdGxlXFxcIiwgXFxcIlxcXCIpKSB8fCBcXFwiXFxcIjtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWGhee9ruaQnOe0ouW8ueW5lVxcXCIsXFxuICAgIHVybDogJChrZXksIFxcXCLor7fmkJzntKLnlarliaflkI3np7BcXFwiKS5pbnB1dCgoTVlfUEFSQU1TKSA9PiB7XFxuICAgICAgICBzZXRQYWdlUGFyYW1zKE9iamVjdC5hc3NpZ24oTVlfUEFSQU1TLCB7XFxuICAgICAgICAgICAgbmFtZTogaW5wdXRcXG4gICAgICAgIH0pKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgIH0sIE1ZX1BBUkFNUyksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiZG3nm5LlrZDmkJzntKLlvLnluZVcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGtleSwgb25seURvd25sb2FkKSA9PiB7XFxuICAgICAgICBsZXQgZG0gPSBnZXRWYXIoXFxcImRtX3NoYXJlXFxcIik7XFxuICAgICAgICBpZiAoZG0gJiYgIW9ubHlEb3dubG9hZCkge1xcbiAgICAgICAgICAgIGNsZWFyVmFyKFxcXCJkbV9zaGFyZVxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hWaWRlb1VybCh7XFxuICAgICAgICAgICAgICAgIGRhbm11OiBkbVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liqDovb3lrozmiJBcXFwiO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gJChrZXksIFxcXCJkbeebkuWtkOaQnOe0olxcXCIpLmlucHV0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgdG9hc3QoXFxcIuS4i+i9veWujOaIkOW8ueW5leWQjuivt+mHjeaWsOeCueWHu+aQnOe0olxcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vc2VhcmNoP3J1bGU9ZG3nm5LlrZAmcz1cXFwiICsgaW5wdXQ7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH0sIGtleSwgb25seURvd25sb2FkKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxufSk7XFxuXFxuZnVuY3Rpb24gc2VhcmNoKGQsIG5hbWUpIHtcXG4gICAgY29uc3QgZGFubXUgPSAkLnJlcXVpcmUoXFxcImRhbm11XFxcIik7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG4gICAgfSk7XFxuICAgIGxldCBkbUxpc3QgPSBkYW5tdS5nZXREYW5NdShuYW1lKTtcXG5cXG4gICAgZm9yIChsZXQgYW5pbWUgb2YgZG1MaXN0LmFuaW1lcykge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogYW5pbWUuYW5pbWVUaXRsZSxcXG4gICAgICAgICAgICBkZXNjOiBhbmltZS50eXBlRGVzY3JpcHRpb24sXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgICAgIHVybDogJChcXFwiXFxcIiwgXFxcIuivt+i+k+WFpeS4i+i9veiMg+WbtCgxLFxcXCIgKyBhbmltZS5lcGlzb2Rlcy5sZW5ndGggKyBcXFwiKVxcXCIpLmlucHV0KChhbmltZVRpdGxlLCBlcGlzb2RlcykgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgW2EsIGJdID0gaW5wdXQuc3BsaXQoLyx877yMLyk7XFxuICAgICAgICAgICAgICAgIGEgPSBOdW1iZXIoYSksIGIgPSBOdW1iZXIoYik7XFxuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4oYSkgfHwgTnVtYmVyLmlzTmFOKGIpKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K+35oyJ5qC85byP6L6T5YWl5pWw5a2XXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAoYSA8IDEgfHwgYiA+IGVwaXNvZGVzLmxlbmd0aCkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+i+k+WFpeinhOWumuiMg+WbtOWGheeahOaVsOWtl1xcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgY29uc3QgZGFubXUgPSAkLnJlcXVpcmUoXFxcImRhbm11XFxcIik7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gYSAtIDEsIGogPSAxOyBpIDwgYjsgaSsrLCBqKyspIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXBpc29kZSA9IGVwaXNvZGVzW2ldO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkbVRpdGxlID0gYW5pbWVUaXRsZSArIFxcXCJfXFxcIiArIGVwaXNvZGUuZXBpc29kZVRpdGxlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dMb2FkaW5nKFxcXCLmraPlnKjkuIvovb3vvJpcXFwiICsgZXBpc29kZS5lcGlzb2RlVGl0bGUgKyBcXFwiXFxcXHQoXFxcIiArIGogKyBcXFwiL1xcXCIgKyAoYiAtIGEgKyAxKSArIFxcXCIpXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZGFubXUuZG93bmxvYWREYW5NdShlcGlzb2RlLmVwaXNvZGVJZCwgZG1UaXRsZSk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lk6blk6bkuIvovb3lpLHotKUuLi5cXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kuIvovb3lrozmiJBcXFwiO1xcbiAgICAgICAgICAgIH0sIGFuaW1lLmFuaW1lVGl0bGUsIGFuaW1lLmVwaXNvZGVzKSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9tb3ZpZS8xNC5zdmdcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBmb3IgKGxldCBlcGlzb2RlIG9mIGFuaW1lLmVwaXNvZGVzKSB7XFxuICAgICAgICAgICAgbGV0IGRtVGl0bGUgPSBhbmltZS5hbmltZVRpdGxlICsgXFxcIl9cXFwiICsgZXBpc29kZS5lcGlzb2RlVGl0bGU7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGVwaXNvZGUuZXBpc29kZVRpdGxlLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoZXBpc29kZS5lcGlzb2RlSWQpLmxhenlSdWxlKCh1cmwsIHRpdGxlLCBvbmx5RG93bmxvYWQpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhbm11ID0gJC5yZXF1aXJlKFxcXCJkYW5tdVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBkYW5tdS5nZXRMb2NhbERhbk11KGlucHV0LCB0aXRsZSkgfHwgZGFubXUuZG93bmxvYWREYW5NdShpbnB1dCwgdGl0bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9ubHlEb3dubG9hZCkgcmV0dXJuIFxcXCJ0b2FzdDovL+S4i+i9veWujOaIkFxcXCI7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgZGFubXVUZXh0ID0gZmV0Y2gocGF0aCk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhbm11VGV4dCkgcmV0dXJuIFxcXCJ0b2FzdDovL+i/mOayoeacieW8ueW5leWTn35cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFZpZGVvVXJsKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBkYW5tdTogcGF0aFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liqDovb3lrozmiJBcXFwiO1xcbiAgICAgICAgICAgICAgICB9LCBNWV9QQVJBTVMuZHVybCwgZG1UaXRsZSwgb25seURvd25sb2FkKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5by65Yi25LiL6L29XFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoZXBpc29kZVRpdGxlLCBlcGlzb2RlSWQpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuivt+etieW+hVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYW5tdSA9ICQucmVxdWlyZShcXFwiZGFubXVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFubXUuZG93bmxvYWREYW5NdShlcGlzb2RlSWQsIGVwaXNvZGVUaXRsZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/ph43mlrDkuIvovb3lrozmiJDvvIzljZXlh7vmjILovb3jgIJcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGRtVGl0bGUsIGVwaXNvZGUuZXBpc29kZUlkKVxcbiAgICAgICAgICAgICAgICAgICAgfV1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBpZiAoIWRtTGlzdC5hbmltZXMubGVuZ3RoKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5rKh5pyJ5om+5Yiw5LiOW1xcXCIgKyBuYW1lICsgXFxcIl3nm7jlhbPnmoTlvLnluZVcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIGRlc2M6IFxcXCLmkJzkuI3liLDmgI7kuYjlip7vvJ9cXFxcbuajgOafpeWQjeensOaYr+WQpuato+ehru+8m+WPr+S7peWwneivleWIoOmZpOmDqOWIhumZkOWumuivje+8jOWmguesrOS4gOWto+etie+8m+iAjOS4lOWPquiDveaQnOe0oueVquWJp+WTpu+8geWFtuS7luW8ueW5leWPr+eUqGRt55uS5a2Q44CCXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5sZXQgbmFtZSA9IGdldFBhcmFtKFxcXCJuYW1lXFxcIiwgTVlfUEFSQU1TLm5hbWUpO1xcbmlmIChuYW1lKSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBzZWFyY2goZCwgbmFtZSk7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJxFUlJPUuKAneKAnVxcXCIsXFxuICAgICAgICAgICAgZGVzYzogZS50b1N0cmluZygpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6KeE5YiZ5YiX6KGoXCIsXCJwYXRoXCI6XCJydWxlc1wiLFwicnVsZVwiOlwianM6XFxuJC5leHBvcnRzID0gW3tcXG4gICAgICAgIG5hbWU6IFxcXCLlsI/kupFcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBiYXNpY1VybCA9IFxcXCJodHRwczovL3d3dy55dW5zby5uZXRcXFwiO1xcbiAgICAgICAgICAgIGxldCBhcGkgPSBcXFwiL2FwaS92YWxpZGF0ZS9zZWFyY2g/d2Q9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChzKSArIFxcXCImbW9kZT05MDAwMSZzdHlwZT0yMDEwMCZ1az0mcGFnZT1cXFwiICsgcGFnZSArIFxcXCImbGltaXQ9MjAmc2NyZWVuX2ZpbGV0eXBlPXVuZGVmaW5lZFxcXCI7XFxuICAgICAgICAgICAgbGV0IGpzb24gPSBwb3N0KGJhc2ljVXJsICsgYXBpLCB7XFxuICAgICAgICAgICAgICAgIGJvZHk6IFxcXCJkYXRhPVxcXCIgKyBhcGksXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFJlZmVyZXI6IFxcXCJodHRwczovL3d3dy55dW5zby5uZXQvaW5kZXgvdXNlci9zP3dkPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQocylcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gSlNPTi5wYXJzZShqc29uKS5kYXRhO1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0gcGRmYShodG1sLCBcXFwiYm9keSYmLmxheXVpLWNhcmQ6aGFzKGEpXFxcIik7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIGxpc3QpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcGRmaChpdGVtLCBcXFwiYSYmVGV4dFxcXCIpLnJlcGxhY2UoXFxcIiPmlofku7blpLkgXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICAvL2xldCB0aW1lID0gL1xcXFxkezR9KC1cXFxcZHsyfSl7Mn0gXFxcXGR7Mn0oXFxcXDpcXFxcZHsyfSl7Mn0vLmV4ZWMocGRmaChpdGVtLCBcXFwiLmxheXVpLWNhcmQtYm9keSYmVGV4dFxcXCIpKSB8fCBbXTtcXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIC8vZGVzYzogdGltZVswXSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogYmFzZTY0RGVjb2RlKHBkZmgoaXRlbSwgXFxcImEmJnVybFxcXCIpKVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9XFxuICAgIH0sIHtcXG4gICAgICAgIG5hbWU6IFxcXCLmt7flkIjnm5hcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBcXFwiaHR0cHM6Ly9hcGkuaHVuaGVwYW4uY29tL3YxL3NlYXJjaFxcXCI7XFxuICAgICAgICAgICAgbGV0IGpzb24gPSBwb3N0KHVybCwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBSZWZlcmVyOiBcXFwiaHR0cHM6Ly9odW5oZXBhbi5jb20vXFxcIlxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicVxcXCI6IHMsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFnZVxcXCI6IHBhZ2UsXFxuICAgICAgICAgICAgICAgICAgICBcXFwic2l6ZVxcXCI6IDE1XFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBqc29uLmRhdGEubGlzdDtcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBsaXN0W2ldO1xcbiAgICAgICAgICAgICAgICBpZiAoaXQuZGlza190eXBlICE9PSBcXFwiQUxZXFxcIiB8fCBpdC5zaGFyZV91c2VyID09PSBcXFwi5Li2Kioq5Li2XFxcIikgY29udGludWU7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXQuZGlza19uYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgcGljX3VybDogcGQoaXQsIFxcXCJpbWcmJnNyY1xcXCIsIHVybCksXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGl0LmxpbmssXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBpdC51cGRhdGVfdGltZSArIFxcXCJcXFxcblxcXCIgKyBpdC5saW5rLFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9XFxuICAgIH0sIHtcXG4gICAgICAgIG5hbWU6IFxcXCLotYTmupDluK5cXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQocywgcGFnZSkge1xcbiAgICAgICAgICAgIGZ1bmN0aW9uIHNlYXJjaCgpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJ0bkxpc3QgPSBbXTtcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3AgPSByZXF1ZXN0KFxcXCJodHRwczovL3p5Yi51cHl1bnNvLmNvbS92MTUvc2VhcmNoP2tleXdvcmQ9XFxcIiArIGVuX2FlcyhzKSArIFxcXCImc190eXBlPTImcGFnZT1cXFwiICsgcGFnZSArIFxcXCImYXRrPSZkaWQ9XFxcIiArIGdlbmVyYXRlUmFuZG9tSGV4U3RyaW5nKDY0KSwge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1c2VyLWFnZW50XFxcIjogXFxcIk1vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCAxMDsgUmVkbWkgTm90ZSA3IEJ1aWxkL1FLUTEuMTkwOTEwLjAwMjsgd3YpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS84MS4wLjQwNDQuMTM4IE1vYmlsZSBTYWZhcmkvNTM3LjM2IHVuaS1hcHAgSHRtbDVQbHVzLzEuMCAoSW1tZXJzZWQvMjkuMDkwOTEpXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBsZXQgcmVzcERhdGEgPSBkZV9hZXMocmVzcCk7XFxuICAgICAgICAgICAgICAgIGxldCBqc29uRGF0YSA9IEpTT04ucGFyc2UocmVzcERhdGEpIHx8IHt9O1xcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0ganNvbkRhdGEucmVzdWx0IHx8IHt9O1xcbiAgICAgICAgICAgICAgICBsZXQgaXRlbXMgPSByZXN1bHQuaXRlbXMgfHwgW107XFxuICAgICAgICAgICAgICAgIFxcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IGl0ZW1zW2ldO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBpdGVtLmNvbnRlbnQgfHwgW107XFxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5sZW5ndGggPT0gMHx8IWl0ZW0ucGFnZV91cmwpIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGRlX2FlcyhpdGVtLnBhZ2VfdXJsKSB8fCBcXFwiXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghdXJsKSBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgICAgIHJ0bkxpc3QucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IChpdGVtLnRpdGxlLmxlbmd0aD4zMD9pdGVtLnRpdGxlLnNsaWNlKDAsMjcpK1xcXCIuLi5cXFwiOml0ZW0udGl0bGUpIHx8IFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IFxcXCLliIbkuqvml7bpl7TvvJpcXFwiK2l0ZW0uaW5zZXJ0X3RpbWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgICAgIHJldHVybiBydG5MaXN0O1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBmdW5jdGlvbiBnZW5lcmF0ZVJhbmRvbUhleFN0cmluZyhsZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyYWN0ZXJzID0gXFxcIjAxMjM0NTY3ODlhYmNkZWZcXFwiO1xcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyYWN0ZXJzTGVuZ3RoID0gY2hhcmFjdGVycy5sZW5ndGg7XFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjaGFyYWN0ZXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFyYWN0ZXJzTGVuZ3RoKSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGFsaVV0aWwgPSAkLnJlcXVpcmUoXFxcImFsaVV0aWxcXFwiKTtcXG4gICAgICAgICAgICBsZXQgQ3J5cHRvSlMgPSBhbGlVdGlsLmdldENyeXB0b0pTKCk7XFxuXFxuICAgICAgICAgICAgZnVuY3Rpb24gZW5fYWVzKGUpIHtcXG4gICAgICAgICAgICAgICAgbGV0IGkgPSBcXFwicXExOTIwNTIwNDYwcXF6elxcXCI7XFxuICAgICAgICAgICAgICAgIC8vIGVuX2Flc1xcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoaSk7XFxuICAgICAgICAgICAgICAgIHZhciB0ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoZSksXFxuICAgICAgICAgICAgICAgICAgICByID0gQ3J5cHRvSlMuQUVTLmVuY3J5cHQodCwga2V5LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaXY6IGtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQyxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gci5jaXBoZXJ0ZXh0LnRvU3RyaW5nKCk7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGZ1bmN0aW9uIGRlX2Flcyh2dikge1xcbiAgICAgICAgICAgICAgICBsZXQgaSA9IFxcXCJxcTE5MjA1MjA0NjBxcXp6XFxcIjtcXG4gICAgICAgICAgICAgICAgLy8gZGVfYWVzXFxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShpKTtcXG4gICAgICAgICAgICAgICAgbGV0IGhleFZhbCA9IENyeXB0b0pTLmVuYy5IZXgucGFyc2UodnYpLFxcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gQ3J5cHRvSlMuZW5jLkJhc2U2NC5zdHJpbmdpZnkoaGV4VmFsKSxcXG4gICAgICAgICAgICAgICAgICAgIGRlY3J5cHRlZCA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KHZhbCwga2V5LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaXY6IGtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQyxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVjcnlwdGVkLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIHNlYXJjaCgpO1xcbiAgICAgICAgfVxcbiAgICB9LCB7XFxuICAgICAgICBuYW1lOiBcXFwi5LqR55uY6LWE5rqQXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IFxcXCJodHRwczovL3Jlcy55dW5wYW4ud2luLz9QYWdlSW5kZXg9XFxcIiArIHBhZ2UgKyBcXFwiJlBhZ2VTaXplPTEyJktleXdvcmQ9XFxcIiArIHMgKyBcXFwiJlR5cGU9JlRhZz1cXFwiO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCh1cmwsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly9yZXMueXVucGFuLndpbi9cXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICBsZXQgYXJyID0gcGRmYShodG1sLCBcXFwibWFpbiYmLmNhcmRcXFwiKTtcXG4gICAgICAgICAgICAvL2xvZyhhcnIpO1xcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcbiAgICAgICAgICAgICAgICBsZXQgdSA9IHBkZmgoaXQsIFxcXCIuY2FyZC1saW5rLDEmJm9uY2xpY2tcXFwiKS5tYXRjaCgvaHR0cHM6XFxcXC9cXFxcLyh3d3dcXFxcLmFsaXl1bmRyaXZlXFxcXC5jb21cXFxcL3N8YWx5d3BcXFxcLm5ldClcXFxcL1xcXFx3Ki9nKSB8fCBbXTtcXG4gICAgICAgICAgICAgICAgdSA9IHUubGVuZ3RoID4gMCA/IHVbMF0gOiB1cmw7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChpdCwgXFxcIi5jYXJkLXRpdGxlJiZUZXh0XFxcIiksXFxuICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiBwZChpdCwgXFxcImltZyYmc3JjXFxcIiwgdXJsKSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogdSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IHBkZmgoaXQsIFxcXCIuY2FyZC10ZXh0LC0xJiZUZXh0XFxcIikgKyBcXFwiXFxcXG5cXFwiICsgdSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwiVVDkupHmkJxcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gXFxcImh0dHBzOi8vYXBpLnVweXVuc28yLmNvbS9zZWFyY2g/a2V5d29yZD1cXFwiICsgcyArIFxcXCImcGFnZT1cXFwiICsgcGFnZSArIFxcXCImc190eXBlPTFcXFwiO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCh1cmwsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly93d3cudXB5dW5zby5jb21cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIkNvb2tpZVxcXCI6IFxcXCJjb2RlPTE5MTlcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAvL2xvZyhiYXNlNjREZWNvZGUoaHRtbCkpO1xcbiAgICAgICAgICAgIGxldCBhcnIgPSBKU09OLnBhcnNlKGJhc2U2NERlY29kZShodG1sKSkucmVzdWx0Lml0ZW1zO1xcbiAgICAgICAgICAgIC8vbG9nKGFycik7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBpZiAoIWFycikgcmV0dXJuIFtdO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGFycltpXTtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBpdC5wYWdlX3VybDtcXG4gICAgICAgICAgICAgICAgLy91ID0gdS5sZW5ndGggPiAwID8gdVswXSA6IHVybDtcXG4gICAgICAgICAgICAgICAgaWYgKCF1LmluY2x1ZGVzKFxcXCJhbGl5dW5kcml2ZVxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0LnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1LFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcIlxcXFxuXFxcIiArICh1KSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi54yr54u455uY5pCcXFxcIixcXG4gICAgICAgIHBhZ2U6IGZhbHNlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChcXFwiaHR0cHM6Ly93d3cuYWxpcGFuc291LmNvbS9zZWFyY2g/az1cXFwiICsgcywge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL3d3dy5hbGlwYW5zb3UuY29tL3NlYXJjaD9rPVxcXCIgKyBzXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBsZXQgYXJyID0gcGRmYShodG1sLCBcXFwiI2FwcCYmYVxcXCIpO1xcbiAgICAgICAgICAgIC8vbG9nKGFycik7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBcXFwiPGRpdj5cXFwiICsgYXJyW2ldICsgXFxcIjwvZGl2PlxcXCI7XFxuICAgICAgICAgICAgICAgIGxldCB1ID0gcGRmaChpdCwgXFxcImEmJmhyZWZcXFwiKTtcXG4gICAgICAgICAgICAgICAgLy9sb2codSk7XFxuICAgICAgICAgICAgICAgIGlmICghdS5pbmNsdWRlcyhcXFwiL3MvXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHUgPSBcXFwiaHR0cHM6Ly93d3cuYWxpcGFuc291LmNvbVxcXCIgKyB1LnJlcGxhY2UoXFxcIi9zL1xcXCIsIFxcXCIvY3YvXFxcIik7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChpdCwgXFxcInRlbXBsYXRlJiZUZXh0XFxcIiksXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBwZGZoKGl0LCBcXFwidGVtcGxhdGUsMSYmVGV4dFxcXCIpLFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9LFxcbiAgICAgICAgZmluZEFsaVVybChpbnB1dCkge1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChpbnB1dCwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiQ29va2llXFxcIjogXFxcIm5vX3Nob3dfZG9uYXRlPTFcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBpbnB1dC5yZXBsYWNlKFxcXCIvY3YvXFxcIiwgXFxcIi9zL1xcXCIpXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0OiBmYWxzZVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGh0bWwgPSBwYXJzZURvbUZvckh0bWwoaHRtbCwgJ2EmJmhyZWYnKTtcXG4gICAgICAgICAgICBpZiAoaHRtbC5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBodG1sO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6IFxcXCLmmJPmkJxcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgYWxpVXRpbCA9ICQucmVxdWlyZShcXFwiYWxpVXRpbFxcXCIpO1xcbiAgICAgICAgICAgIGxldCBDcnlwdG9KUyA9IGFsaVV0aWwuZ2V0Q3J5cHRvSlMoKTtcXG5cXG4gICAgICAgICAgICBmdW5jdGlvbiBrZXllbihzdHIpIHtcXG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKFxcXCI0T1RvU2NVRk9hZVZUckhFXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICBpdiA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKFxcXCI5Q0xHYW8xdkhLcW0xN096XFxcIik7XFxuICAgICAgICAgICAgICAgIHZhciBlbmNyeXB0ZWQgPSBDcnlwdG9KUy5BRVMuZGVjcnlwdCh7XFxuICAgICAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0OiBDcnlwdG9KUy5lbmMuQmFzZTY0LnBhcnNlKHN0cilcXG4gICAgICAgICAgICAgICAgfSwga2V5LCB7XFxuICAgICAgICAgICAgICAgICAgICBpdjogaXYsXFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQyxcXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IENyeXB0b0pTLnBhZC5Qa2NzN1xcbiAgICAgICAgICAgICAgICB9KS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBlbmNyeXB0ZWQ7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChcXFwiaHR0cHM6Ly95aXNvLmZ1bi9hcGkvc2VhcmNoP25hbWU9XFxcIiArIHMgKyBcXFwiJnBhZ2VObz1cXFwiICsgcGFnZSwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL3lpc28uZnVuL2luZm8/c2VhcmNoS2V5PVxcXCIgKyBzLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIkNvb2tpZVxcXCI6IGdldEl0ZW0oJ3lpc291Y29va2UnLCAnJylcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIC8vbG9nKGh0bWwpO1xcbiAgICAgICAgICAgIGlmIChodG1sLmluY2x1ZGVzKCfnmbvlvZXnlKjmiLfml6DpmZDliLYnKSkge1xcbiAgICAgICAgICAgICAgICB2YXIgaSA9IDA7XFxuICAgICAgICAgICAgICAgIGRvIHtcXG4gICAgICAgICAgICAgICAgICAgIHZhciB0eWltZ2xpbiA9ICdodHRwczovL3lpc28uZnVuL2FwaS91c2VyL2xvZ2luL2NhcHRjaGE/dD0nICsgcGFyc2VJbnQobmV3IERhdGUoKS5nZXRUaW1lKCkpICsgJyc7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgaW1nID0gY29udmVydEJhc2U2NEltYWdlKHR5aW1nbGluKS5zcGxpdCgnLCcpWzFdO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvZCA9IHJlcXVlc3QoJ2h0dHBzOi8vYXBpLnhob2ZlLnRvcC9vY3IvYjY0L3RleHQnLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW4nXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBpbWcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZlciA9IEpTT04ucGFyc2UocmVxdWVzdCgnaHR0cHM6Ly95aXNvLmZ1bi9hcGkvdXNlci9sb2dpbicsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZWZlcmVyJzogJ2h0dHBzOi8veWlzby5mdW4vbG9naW4nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29va2llJzogZ2V0Q29va2llKHR5aW1nbGluKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwidXNlck5hbWVcXFwiOiBcXFwidHZib3gyMDIzXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogXFxcIlR2Ym94MjAyM1xcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJjb2RlXFxcIjogY29kXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZlci5jb2RlID09IDIwMCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygn5piT5pCc55m75YWl6aqM6K+B5oiQ5YqfJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXRlbSgneWlzb3Vjb29rZScsIGdldENvb2tpZSgnaHR0cHM6Ly95aXNvLmZ1bicpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sID0gcmVxdWVzdChcXFwiaHR0cHM6Ly95aXNvLmZ1bi9hcGkvc2VhcmNoP25hbWU9XFxcIiArIHMgKyBcXFwiJnBhZ2VObz1cXFwiICsgcGFnZSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL3lpc28uZnVuL2luZm8/c2VhcmNoS2V5PVxcXCIgKyBzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcIkNvb2tpZVxcXCI6IGdldEl0ZW0oJ3lpc291Y29va2UnLCAnJylcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChpIDwgNCk7XFxuXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBhcnIgPSBKU09OLnBhcnNlKGh0bWwpLmRhdGEubGlzdDtcXG4gICAgICAgICAgICAvL2xvZyhhcnIpO1xcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcbiAgICAgICAgICAgICAgICBsZXQgdSA9IGtleWVuKGl0LnVybCk7XFxuICAgICAgICAgICAgICAgIC8vbG9nKHUpO1xcbiAgICAgICAgICAgICAgICBpZiAodSA9PSBudWxsIHx8ICF1LmluY2x1ZGVzKFxcXCJhbGl5dW5cXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpdC5uYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1LFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogKGl0LmdtdFNoYXJlIHx8IGl0LmdtdENyZWF0ZSkgKyBcXFwiXFxcXG5cXFwiICsgKHUpLFxcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6IFxcXCLmib7otYTmupBcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRodG1sKCkge1xcbiAgICAgICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoXFxcImh0dHBzOi8vemhhb3ppeXVhbi5tZS9zbz9maWxlbmFtZT1cXFwiICsgcyArIFxcXCImcGFnZT1cXFwiICsgcGFnZSwge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vemhhb3ppeXVhbi5tZS9zdG9wLmh0bWxcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJvcmlnaW5cXFwiOiBcXFwiaHR0cHM6Ly96aGFveml5dWFuLm1lXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwiQ29va2llXFxcIjogZ2V0SXRlbShcXFwienp5Y29va2VcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcInVwZ3JhZGUtaW5zZWN1cmUtcmVxdWVzdHNcXFwiOiBcXFwiMVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcImNvbnRlbnQtdHlwZVxcXCI6IFxcXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDtcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIHZhciBodG1sID0gZ2V0aHRtbCgpO1xcbiAgICAgICAgICAgIGlmICghaHRtbC5pbmNsdWRlcyhcXFwic2VhcmNoX2JveFxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIGxldCB1c2VyID0gJ2RYTmxjbTVoYldVOWVYQnFNakF5TXlad1lYTnpkMjl5WkQxNWNHb3lNREl6JztcXG4gICAgICAgICAgICAgICAgbGV0IGNvb2sgPSBKU09OLnBhcnNlKGZldGNoQ29va2llKCdodHRwczovL3poYW96aXl1YW4ubWUvbG9naXUuaHRtbCcsIHtcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6IE1PQklMRV9VQSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ09yaWdpbic6ICdodHRwczovL3poYW96aXl1YW4ubWUnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vemhhb3ppeXVhbi5tZS9sb2dpbi5odG1sJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwidXBncmFkZS1pbnNlY3VyZS1yZXF1ZXN0c1xcXCI6IFxcXCIxXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IGJhc2U2NERlY29kZSh1c2VyKSxcXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxcbiAgICAgICAgICAgICAgICAgICAgb25seUhlYWRlcnM6IHRydWUsXFxuICAgICAgICAgICAgICAgICAgICB3aXRoSGVhZGVyczogdHJ1ZVxcbiAgICAgICAgICAgICAgICB9KSkuam9pbignOycpO1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJ6enljb29rZVxcXCIsIGNvb2spO1xcbiAgICAgICAgICAgICAgICBsb2coXFxcIuaJvui1hOa6kOeZu+WFpVxcXCIpO1xcbiAgICAgICAgICAgICAgICBodG1sID0gZ2V0aHRtbCgpO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBsZXQgYXJyID0gcGRmYShodG1sLCBcXFwiYm9keSYmLm5ld3NMaXN0JiZsaTpub3QoOmZpcnN0LWNoaWxkKVxcXCIpO1xcbiAgICAgICAgICAgIC8vbG9nKGFycik7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIGxldCB1ID0gcGRmaChpdCwgXFxcImEmJmhyZWZcXFwiKTtcXG4gICAgICAgICAgICAgICAgaWYgKHUgPT0gbnVsbCkge1xcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgdSA9IFxcXCJodHRwczovL3poYW96aXl1YW4ubWUvXFxcIiArIHU7XFxuICAgICAgICAgICAgICAgIC8vbG9nKHUpO1xcbiAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBwZGZoKGl0LCBcXFwiLm5ld3NfdGV4dCYmaDMmJlRleHRcXFwiKTtcXG4gICAgICAgICAgICAgICAgaWYgKCF0aXRsZSkgY29udGludWU7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBwZGZoKGl0LCBcXFwiLm5ld3NfdGV4dCYmcCYmVGV4dFxcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZDtcXG4gICAgICAgIH0sXFxuICAgICAgICBmaW5kQWxpVXJsKGlucHV0KSB7XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KGlucHV0KTtcXG4gICAgICAgICAgICB2YXIgX2xpbmtzID0gaHRtbC5tYXRjaCgvaHR0cHM6XFxcXC9cXFxcLyh3d3dcXFxcLmFsaXl1bmRyaXZlXFxcXC5jb21cXFxcL3N8YWx5d3BcXFxcLm5ldClcXFxcL1xcXFx3Ki9nKSB8fCBbXTtcXG5cXG4gICAgICAgICAgICBpZiAoX2xpbmtzLmxlbmd0aCA+IDApIHtcXG5cXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9saW5rc1swXTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi5bCP57q45p2hXFxcIixcXG4gICAgICAgIHBhZ2U6IGZhbHNlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBhbGlVdGlsID0gJC5yZXF1aXJlKFxcXCJhbGlVdGlsXFxcIik7XFxuXFxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0dG9rZW4oKSB7XFxuICAgICAgICAgICAgICAgIGlmIChnZXRNeVZhcigneHp5dG9rZW4nLCAnJykubGVuZ3RoID09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0b2tlbiA9IEpTT04ucGFyc2UocG9zdCgnaHR0cHM6Ly9naXRjYWZlLm5ldC90b29sL2FsaXBhcGVyLycsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vdS5naXRjYWZlLmluay8nXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2dldF90b2tlbidcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KSkuZGF0YTtcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKCd4enR0b2tlbicsIHRva2VuKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TXlWYXIoJ3h6dHRva2VuJywgJycpO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBmdW5jdGlvbiBjYXRfY29kZShhKSB7XFxuICAgICAgICAgICAgICAgIHZhciBkLCBlLCBiID0gW1xcXCLljY7or63nlLXop4ZcXFwiLCBcXFwi5pel6Z+p55S16KeGXFxcIiwgXFxcIuasp+e+jueUteinhlxcXCIsIFxcXCLlhbbku5bnlLXop4ZcXFwiLCBcXFwi5Y2O6K+t55S15b2xXFxcIiwgXFxcIuaXpemfqeeUteW9sVxcXCIsIFxcXCLmrKfnvo7nlLXlvbFcXFwiLCBcXFwi5YW25LuW55S15b2xXFxcIiwgXFxcIuWNjuivreWKqOa8q1xcXCIsIFxcXCLml6Xpn6nliqjmvKtcXFwiLCBcXFwi5qyn576O5Yqo5ryrXFxcIiwgXFxcIue6quW9leeJh1xcXCIsIFxcXCLnu7zoibrniYdcXFwiLCBcXFwi5pWZ6IKy5Z+56K6tXFxcIiwgXFxcIuWFtuS7luinhumikVxcXCIsIFxcXCLljY7or63pn7PkuZBcXFwiLCBcXFwi5pel6Z+p6Z+z5LmQXFxcIiwgXFxcIuasp+e+jumfs+S5kFxcXCIsIFxcXCLlhbbku5bpn7PkuZBcXFwiLCBcXFwi5aix5LmQ6L2v5Lu2XFxcIiwgXFxcIuezu+e7n+i9r+S7tlxcXCIsIFxcXCLnvZHnu5zova/ku7ZcXFwiLCBcXFwi5Yqe5YWs6L2v5Lu2XFxcIiwgXFxcIuWFtuS7lui9r+S7tlxcXCIsIFxcXCLmvKvnlLtcXFwiLCBcXFwi5bCP6K+0XFxcIiwgXFxcIuWHuueJiOS5plxcXCIsIFxcXCLnn6Xor4bln7norq1cXFwiLCBcXFwi5YW25LuW5paH5qGjXFxcIiwgXFxcIuWjgee6uFxcXCIsIFxcXCLkurrnialcXFwiLCBcXFwi6aOO5pmvXFxcIiwgXFxcIuWFtuS7luWbvueJh1xcXCIsIFxcXCLlhbbku5ZcXFwiXSxcXG4gICAgICAgICAgICAgICAgICAgIGMgPSBbXFxcImh5ZHNcXFwiLCBcXFwicmhkc1xcXCIsIFxcXCJvbWRzXFxcIiwgXFxcInF0ZHNcXFwiLCBcXFwiaHlkeVxcXCIsIFxcXCJyaGR5XFxcIiwgXFxcIm9tZHlcXFwiLCBcXFwicXRkeVxcXCIsIFxcXCJoeWRtXFxcIiwgXFxcInJoZG1cXFwiLCBcXFwib21kbVxcXCIsIFxcXCJqbHBcXFwiLCBcXFwienlwXFxcIiwgXFxcImp5cHhcXFwiLCBcXFwicXRzcFxcXCIsIFxcXCJoeXl5XFxcIiwgXFxcInJoeXlcXFwiLCBcXFwib215eVxcXCIsIFxcXCJxdHl5XFxcIiwgXFxcImtmcmpcXFwiLCBcXFwieHRyalxcXCIsIFxcXCJ3bHJqXFxcIiwgXFxcImJncmpcXFwiLCBcXFwicXRyalxcXCIsIFxcXCJtaFxcXCIsIFxcXCJ4c1xcXCIsIFxcXCJjYnNcXFwiLCBcXFwienNweFxcXCIsIFxcXCJxdHdkXFxcIiwgXFxcImJ6XFxcIiwgXFxcInJ3XFxcIiwgXFxcImZqXFxcIiwgXFxcInF0dHBcXFwiLCBcXFwicXRcXFwiXTtcXG4gICAgICAgICAgICAgICAgZm9yIChkID0gMCwgZSA9IGMubGVuZ3RoOyBlID4gZDsgZCsrKVxcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNbZF0gPT0gYSkgcmV0dXJuIGJbZF07XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSBwb3N0KFxcXCJodHRwczovL2dpdGNhZmUubmV0L3Rvb2wvYWxpcGFwZXIvXFxcIiwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3UuZ2l0Y2FmZS5pbmsvJ1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFxcXCJzZWFyY2hcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogXFxcIndlYlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICB0b2tlbjogZ2V0dG9rZW4oKSxcXG4gICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6IHNcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBKU09OLnBhcnNlKGh0bWwpO1xcbiAgICAgICAgICAgIGlmIChsaXN0LmRhdGEpIHtcXG4gICAgICAgICAgICAgICAgbGlzdCA9IGxpc3QuZGF0YTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGxpc3RbaV1cXG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gaXQudGl0bGU7XFxuICAgICAgICAgICAgICAgIGxldCBtdXJsID0gJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zLycgKyBpdC5hbGlrZXlcXG4gICAgICAgICAgICAgICAgaWYgKCFhbGlVdGlsLmNoZWNrYWxpKG11cmwpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAodGl0bGUuaW5jbHVkZXMocykpIHtcXG4gICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLiiJogXFxcIiArIHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IGNhdF9jb2RlKGl0LmNhdCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzOiBpdC5kZXNcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogbXVybFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6IFxcXCLnjqnlgbblk6Xlk6VcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gXFxcImh0dHA6Ly93b2dnLnh5ei9pbmRleC5waHAvdm9kc2VhcmNoL1xcXCIgKyBzICsgXFxcIi0tLS0tLS0tLS1cXFwiICsgcGFnZSArIFxcXCItLS0uaHRtbFxcXCI7XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KHVybCwge30pO1xcbiAgICAgICAgICAgIGxldCBhcnIgPSBwYXJzZURvbUZvckFycmF5KGh0bWwsICcubW9kdWxlLWl0ZW1zJiYubW9kdWxlLXNlYXJjaC1pdGVtJyk7XFxuICAgICAgICAgICAgLy9sb2coYXJyKTtcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGxldCBiZXQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIGxldCB1dGl0bGUgPSBwYXJzZURvbUZvckh0bWwoaXQsICdoMyYmYSYmVGV4dCcpO1xcbiAgICAgICAgICAgICAgICBsZXQgdXNlcmlhbCA9IHBhcnNlRG9tRm9ySHRtbChpdCwgJy52aWRlby1zZXJpYWwmJlRleHQnKTtcXG4gICAgICAgICAgICAgICAgbGV0IHVpbWFnZSA9IHBhcnNlRG9tKGl0LCAnLmxhenlsb2FkJiZkYXRhLXNyYycsICdodHRwOi8vd29nZy54eXovJyk7XFxuICAgICAgICAgICAgICAgIGxldCB1ID0gcGFyc2VEb20oaXQsICdoMyYmYSYmaHJlZicsICdodHRwOi8vd29nZy54eXovJyk7XFxuICAgICAgICAgICAgICAgIC8vbGV0IGRldCA9IHJlcXVlc3QodSwge30pO1xcbiAgICAgICAgICAgICAgICBiZXQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdXRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1LFxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IHVpbWFnZSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IHVzZXJpYWxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChiZXQubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgICBsZXQgYmV0aCA9IGJhdGNoRmV0Y2goYmV0KTtcXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiZXRoLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdCA9IHBhcnNlRG9tRm9yQXJyYXkoYmV0aFtpXSwgJy5tb2R1bGUtcGxheWVyLWxpc3QmJnAnKVxcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaXN0Lmxlbmd0aDsgaisrKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBwYXJzZURvbUZvckh0bWwobGlzdFtqXSwgJ3AmJlRleHQnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXUuaW5jbHVkZXMoXFxcIi9zL1xcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYmV0W2ldLnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiBiZXRbaV0uaW1hZ2UsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogYmV0W2ldLmRlc2MgKyAnXFxcXG4nICsgdSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZDtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgbmFtZTogXFxcIumYv+mHjOS6keebmOe9kVxcXCIsXFxuICAgICAgICBwYWdlOiB0cnVlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBcXFwiaHR0cHM6Ly93d3cuYWx5cHcuY24vc2VhcmNoLnBocD9xPVxcXCIgKyBzICsgXFxcIiZwYWdlPVxcXCIgKyBwYWdlO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCh1cmwsIHt9KTtcXG4gICAgICAgICAgICBsZXQgYXJyID0gcGFyc2VEb21Gb3JBcnJheShodG1sLCAnLmxpc3QmJmxpJyk7XFxuICAgICAgICAgICAgLy9sb2coYXJyKTtcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGxldCBiZXQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIGxldCB1dGl0bGUgPSBwYXJzZURvbUZvckh0bWwoaXQsICdhJiZ0aXRsZScpO1xcbiAgICAgICAgICAgICAgICBsZXQgdXNlcmlhbCA9IHBhcnNlRG9tRm9ySHRtbChpdCwgJy5mYS1jbG9jay1vJiZUZXh0Jyk7XFxuICAgICAgICAgICAgICAgIGxldCB1aW1hZ2UgPSBwYXJzZURvbShpdCwgJ2ltZyYmc3JjJywgJ2h0dHBzOi8vd3d3LmFseXB3LmNuLycpO1xcbiAgICAgICAgICAgICAgICBsZXQgdSA9IHBhcnNlRG9tKGl0LCAnYSYmaHJlZicsICdodHRwczovL3d3dy5hbHlwdy5jbi8nKTtcXG4gICAgICAgICAgICAgICAgLy9sZXQgZGV0ID0gcmVxdWVzdCh1LCB7fSk7XFxuICAgICAgICAgICAgICAgIGlmICghdXRpdGxlLmluY2x1ZGVzKHMpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBiZXQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdXRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1LFxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IHVpbWFnZSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IHVzZXJpYWxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIC8vbG9nKGJldCk7XFxuICAgICAgICAgICAgaWYgKGJldC5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgIGxldCBiZXRoID0gYmF0Y2hGZXRjaChiZXQpO1xcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJldGgubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBsaXN0ID0gcGFyc2VEb21Gb3JBcnJheShiZXRoW2ldLCAnYm9keSYmYVtocmVmXj1odHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy9dJylcXG4gICAgICAgICAgICAgICAgICAgIC8vbG9nKGxpc3QpO1xcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaXN0Lmxlbmd0aDsgaisrKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBwYXJzZURvbUZvckh0bWwobGlzdFtqXSwgJ2EmJmhyZWYnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYmV0W2ldLnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiBiZXRbaV0uaW1hZ2UsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogYmV0W2ldLmRlc2MgKyAnXFxcXG4nICsgdSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZDtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgbmFtZTogXFxcIuWcn+aLqOm8oFxcXCIsXFxuICAgICAgICBwYWdlOiBmYWxzZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IGZldGNoKCdodHRwczovL3d3dy50YnNkeS5jb20vc2VhcmNoLmh0bWw/a2V5d29yZD0nICsgcyArICcmY2F0ZWdvcnk9OTgzOTIwJmRhdGFfdHlwZT05ODc5MTAnLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogUENfVUFcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgICAgIGxldCBhcnIgPSBwYXJzZURvbUZvckFycmF5KGh0bWwsICcuc2VhcmNoX3Jlc3VsdF9uZXRkaXNrX2xpc3QmJmEnKTtcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGFycltpXTtcXG4gICAgICAgICAgICAgICAgLy9sb2coaXQpO1xcbiAgICAgICAgICAgICAgICBsZXQgdSA9IHBhcnNlRG9tRm9ySHRtbChpdCwgJ2EmJmhyZWYnKTtcXG4gICAgICAgICAgICAgICAgbGV0IHRpdCA9IHBhcnNlRG9tRm9ySHRtbChpdCwgJy5uZXRkaXNrX2l0ZW1fZGV0YWlsX25hbWUmJlRleHQnKTtcXG4gICAgICAgICAgICAgICAgaWYgKCF0aXQuaW5jbHVkZXMocykpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIC8vbG9nKHUpO1xcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdCxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogdSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IFxcXCJcXFxcblxcXCIgKyB1LFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6IFxcXCLpmL/ph4zmkJxcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCgnaHR0cHM6Ly9hbGlzby5jYy9zLycgKyBzICsgJy0nICsgcGFnZSArICctMC5odG1sJywge30pO1xcblxcbiAgICAgICAgICAgIGxldCBsaXN0ID0gcGFyc2VEb21Gb3JBcnJheShodG1sLCAnLnNlYXJjaC1yZXN1bHQmJi5yZXNvdXJjZS1pdGVtJyk7XFxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaXN0Lmxlbmd0aDsgaisrKSB7XFxuICAgICAgICAgICAgICAgIGxldCB1ID0gbGlzdFtqXTtcXG4gICAgICAgICAgICAgICAgbGV0IHRpdCA9IHBhcnNlRG9tRm9ySHRtbCh1LCAnaDMmJlRleHQnKTtcXG4gICAgICAgICAgICAgICAgaWYgKCF0aXQuaW5jbHVkZXMocykpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0LFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBwYXJzZURvbSh1LCAnaDMmJmEmJmhyZWYnLCAnaHR0cHM6Ly9hbGlzby5jYy8nKSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IHBhcnNlRG9tRm9ySHRtbCh1LCAnLnRpbWUmJlRleHQnKSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfSxcXG4gICAgICAgIGZpbmRBbGlVcmwoaW5wdXQpIHtcXG4gICAgICAgICAgICBldmFsKGdldENyeXB0b0pTKCkpO1xcblxcbiAgICAgICAgICAgIGZ1bmN0aW9uIGRlY3J5KHN0cikge1xcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoXFxcIjlFQjIwRERGRDZBRkJENjhcXFwiKTtcXG4gICAgICAgICAgICAgICAgdmFyIGVuY3J5cHRlZCA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KHN0ciwga2V5LCB7XFxuICAgICAgICAgICAgICAgICAgICBpdjoga2V5LFxcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogQ3J5cHRvSlMubW9kZS5DQkMsXFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBDcnlwdG9KUy5wYWQuUGtjczdcXG4gICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5jcnlwdGVkO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoaW5wdXQpO1xcbiAgICAgICAgICAgIGxldCBidXQgPSBwYXJzZURvbShodG1sLCAnLmJ1dHRvbiYmaHJlZicsICdodHRwczovL2FsaXNvLmNjLycpO1xcbiAgICAgICAgICAgIC8vbG9nKGJ1dCk7XFxuICAgICAgICAgICAgbGV0IGdvdCA9IHJlcXVlc3QoYnV0KTtcXG4gICAgICAgICAgICAvL2xvZyhnb3QpO1xcbiAgICAgICAgICAgIGV2YWwocGFyc2VEb21Gb3JIdG1sKGdvdCwgJ2hlYWQmJnNjcmlwdCwxJiZIdG1sJykpO1xcbiAgICAgICAgICAgIHJldHVybiBkZWNyeShiYXNlNjQuc3BsaXQoJyEnKVswXSk7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6IFxcXCLkupHnm5jliIbkuqvnpL5cXFwiLFxcbiAgICAgICAgcGFnZTogZmFsc2UsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IGFsaVV0aWwgPSAkLnJlcXVpcmUoXFxcImFsaVV0aWxcXFwiKTtcXG4gICAgICAgICAgICBsZXQgQ3J5cHRvSlMgPSBhbGlVdGlsLmdldENyeXB0b0pTKCk7XFxuXFxuICAgICAgICAgICAgZnVuY3Rpb24gZGVjcnkoc3RyKSB7XFxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShcXFwiNUY2QjJBSzMzREFTRDEyM1xcXCIpO1xcbiAgICAgICAgICAgICAgICB2YXIgZW5jcnlwdGVkID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoc3RyLCBrZXksIHtcXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6IENyeXB0b0pTLm1vZGUuRUNCLFxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3XFxuICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY3J5cHRlZDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KCdodHRwczovL3d3dy55dW5wYW5mZW54aWFuZy5jbi9hcGkvYmJzL2FwaS9nZXRkYXRhP2tleT0nICsgcyArICcmdHlwZT12aWRlbycsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly93d3cueXVucGFuZmVueGlhbmcuY24vXFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgbGV0IGpzb24gPSBkZWNyeShKU09OLnBhcnNlKGh0bWwpLmRhdGEpO1xcbiAgICAgICAgICAgIC8vbG9nKGpzb24pO1xcbiAgICAgICAgICAgIGxldCBhcnIgPSBKU09OLnBhcnNlKGpzb24pOyAvL1swXS5yZXN1bHQuaXRlbXM7XFxuICAgICAgICAgICAgLy9sb2coYXJyKTtcXG5cXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGxldCBiZXQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIGxldCB1cmwgPSBpdC5waWQ7XFxuICAgICAgICAgICAgICAgIGJldC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vd3d3Lnl1bnBhbmZlbnhpYW5nLmNuL2FwaS9iYnMvYXBpL2dldGFydGljbGU/aWQ9JyArIHVybCxcXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vd3d3Lnl1bnBhbmZlbnhpYW5nLmNuL1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAvL2xvZyh1KTtcXG4gICAgICAgICAgICBsZXQgYmV0aCA9IGJhdGNoRmV0Y2goYmV0KTtcXG5cXG4gICAgICAgICAgICAvL2xvZyhhcnRpY2xlKTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJldGgubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGJldGhbaV0pLmRhdGE7XFxuICAgICAgICAgICAgICAgIC8vbG9nKGpzb24pO1xcbiAgICAgICAgICAgICAgICBsZXQgbGlzdCA9IGpzb24uZG93bmxvYWQuc3BsaXQoJ0AnKTtcXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaXN0Lmxlbmd0aDsgaisrKSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IGxpc3Rbal07XFxuICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBqc29uLnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zLycgKyB1LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IGpzb24uY3JlYXRldGltZSArIFxcXCJcXFxcblxcXCIgKyAnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvJyArIHUsXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICByZXR1cm4gZDtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgbmFtZTogXFxcIuebmOaQnFxcXCIsXFxuICAgICAgICBwYWdlOiB0cnVlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIHBhZ2UgPSAocGFnZSAtIDEpICogMTA7XFxuICAgICAgICAgICAgbGV0IHVybCA9IFxcXCJodHRwczovL3d3dy5wYW5zZWFyY2gubWUvc2VhcmNoP2tleXdvcmQ9XFxcIiArIHMgKyBcXFwiJm9mZnNldD1cXFwiICsgcGFnZSArIFxcXCImcGFuPWFsaXl1bmRyaXZlXFxcIjtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QodXJsLCB7fSk7XFxuXFxuICAgICAgICAgICAgbGV0IGFyciA9IHBhcnNlRG9tRm9yQXJyYXkoaHRtbCwgJy5ncmlkJiYuc2hhZG93OmhhcyhhW2hyZWZePWh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zL10pJyk7XFxuICAgICAgICAgICAgLy9sb2coYXJyKTtcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGFycltpXTtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBwYXJzZURvbUZvckh0bWwoaXQsICdhW2hyZWZePWh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zL10mJmhyZWYnKTtcXG4gICAgICAgICAgICAgICAgbGV0IHBpY191cmwgPSBwYXJzZURvbUZvckh0bWwoaXQsICdpbWcmJnNyYycpO1xcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHBhcnNlRG9tRm9ySHRtbChpdCwgJy5icmVhay1hbGwmJlRleHQnKS5zcGxpdCgnaHR0cCcpWzBdLFxcbiAgICAgICAgICAgICAgICAgICAgcGljX3VybDogcGljX3VybCA9PT0gXFxcIi9mYXZpY29uLnBuZ1xcXCIgPyBcXFwiaHR0cHM6Ly93d3cucGFuc2VhcmNoLm1lL1xcXCIgKyBwaWNfdXJsIDogcGljX3VybCxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogdSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IHBhcnNlRG9tRm9ySHRtbChpdCwgJ3AmJlRleHQnKSArIFxcXCJcXFxcblxcXCIgKyB1LFxcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6IFxcXCJET1ZY5pCcXFxcIixcXG4gICAgICAgIHBhZ2U6IGZhbHNlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBcXFwiaHR0cHM6Ly9hcGkuZG92eC50ay9hbGkvc2VhcmNoP3dkPVxcXCIgKyBzO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCh1cmwpO1xcbiAgICAgICAgICAgIGxldCBhcnIgPSBKU09OLnBhcnNlKGh0bWwpLmxpc3Q7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBsZXQgYWxpVXRpbCA9ICQucmVxdWlyZShcXFwiYWxpVXRpbFxcXCIpO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGFycltpXTtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBpdC52b2RfY29udGVudDtcXG4gICAgICAgICAgICAgICAgaWYgKCF1LmluY2x1ZGVzKFxcXCJhbGl5dW5kcml2ZVxcXCIpIHx8ICFhbGlVdGlsLmNoZWNrYWxpKHUpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLiiJogXFxcIiArIGl0LnZvZF9uYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgcGljX3VybDogaXQudm9kX3BpYyxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogdSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IFxcXCJcXFxcblxcXCIgKyB1LFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6IFxcXCLlv4XlupRcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gXFxcImh0dHBzOi8vY24uYmluZy5jb20vc2VhcmNoP3E9XFxcIiArIHMgKyBcXFwiK2FsaXl1bmRyaXZlJnFzPWRzJmZvcm09UUJSRVxcXCI7XFxuICAgICAgICAgICAgaWYgKHBhZ2UgIT0gMSkge1xcbiAgICAgICAgICAgICAgICB1cmwgPSBnZXRNeVZhcihcXFwiYmluZ1xcXCIsIHVybCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCh1cmwsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly9jbi5iaW5nLmNvbS9cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgLy9cXFwiWC1SZXF1ZXN0ZWQtV2l0aFxcXCI6IFxcXCJjb20uZXhhbXBsZS5oaWtlcnZpZXdcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIkFjY2VwdFxcXCI6IFxcXCJ0ZXh0L2h0bWwsYXBwbGljYXRpb24veGh0bWwreG1sLGFwcGxpY2F0aW9uL3htbDtxPTAuOSxpbWFnZS9hdmlmLGltYWdlL3dlYnAsaW1hZ2UvYXBuZywqLyo7cT0wLjgsYXBwbGljYXRpb24vc2lnbmVkLWV4Y2hhbmdlO3Y9YjM7cT0wLjlcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBsZXQgYXJyID0gcGRmYShodG1sLCBcXFwiYm9keSYmYVxcXCIpO1xcbiAgICAgICAgICAgIC8vbG9nKGFycik7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIGxldCB1ID0gcGQoaXQsIFxcXCJhJiZocmVmXFxcIiwgdXJsKTtcXG4gICAgICAgICAgICAgICAgbGV0IHQgPSBwZGZoKGl0LCBcXFwiYSYmVGV4dFxcXCIpO1xcbiAgICAgICAgICAgICAgICBpZiAoaXQuaW5jbHVkZXMoXFxcIk5leHQgcGFnZVxcXCIpIHx8IGl0LmluY2x1ZGVzKFxcXCLkuIvkuIDpobVcXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUyID0gcGQoaXQsIFxcXCJhJiZocmVmXFxcIiwgdXJsKTtcXG4gICAgICAgICAgICAgICAgICAgIC8vbG9nKFxcXCJuZXh0IHBhZ2VcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIC8vbG9nKHUyKTtcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJiaW5nXFxcIiwgdTIpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmICh1ID09IG51bGwgfHwgdCA9PSBudWxsIHx8ICFpdC5pbmNsdWRlcyhzKSkge1xcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKCFpdC5pbmNsdWRlcyhcXFwi572R55uYXFxcIikgJiYgIWl0LmluY2x1ZGVzKFxcXCLkupHnm5hcXFwiKSAmJlxcbiAgICAgICAgICAgICAgICAgICAgIWl0LmluY2x1ZGVzKFxcXCJhbGl5dW5kcml2ZVxcXCIpICYmICFpdC5pbmNsdWRlcyhcXFwieXVucGFuXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmICh1LnN0YXJ0c1dpdGgoXFxcImh0dHBzOi8vY24uYmluZy5jb20vXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGxldCBkb20gPSBnZXRIb21lKHUpLnJlcGxhY2UoXFxcImh0dHA6Ly9cXFwiLCBcXFwiXFxcIikucmVwbGFjZShcXFwiaHR0cHM6Ly9cXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBfbGlua3MgPSB0Lm1hdGNoKC9odHRwczpcXFxcL1xcXFwvKHd3d1xcXFwuYWxpeXVuZHJpdmVcXFxcLmNvbVxcXFwvc3xhbHl3cFxcXFwubmV0KVxcXFwvXFxcXHcqL2cpIHx8IFtdO1xcbiAgICAgICAgICAgICAgICBsZXQgYyA9IG51bGw7XFxuICAgICAgICAgICAgICAgIGlmIChfbGlua3MubGVuZ3RoID4gMSAmJiBfbGlua3NbMV0ucmVwbGFjZShfbGlua3NbMF0sIFxcXCJcXFwiKS5yZXBsYWNlKC9bYS16QS1aMC05XSsvZywgXFxcIlxcXCIpID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICBjID0gX2xpbmtzWzFdO1xcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9saW5rcy5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgICAgICBjID0gX2xpbmtzWzBdO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdCxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IGRvbSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogYyAhPSBudWxsID8gYyA6IHUsXFxuICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLov5vlhaXnvZHnq5lcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqczogSlNPTi5zdHJpbmdpZnkoXFxcImhpa2VyOi8vcGFnZS95c2Z4P3dlYlVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHUpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1dXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZDtcXG4gICAgICAgIH0sXFxuICAgICAgICBmaW5kQWxpVXJsKGlucHV0KSB7XFxuICAgICAgICAgICAgaWYgKGlucHV0LmluY2x1ZGVzKFxcXCJhbGl5dW5kcml2ZVxcXCIpKSByZXR1cm4gaW5wdXQ7XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KGlucHV0KTtcXG4gICAgICAgICAgICB2YXIgX2xpbmtzID0gaHRtbC5tYXRjaCgvaHR0cHM6XFxcXC9cXFxcLyh3d3dcXFxcLmFsaXl1bmRyaXZlXFxcXC5jb21cXFxcL3N8YWx5d3BcXFxcLm5ldClcXFxcL1xcXFx3Ki9nKSB8fCBbXTtcXG4gICAgICAgICAgICBpZiAoX2xpbmtzLmxlbmd0aCA+IDEgJiYgX2xpbmtzWzFdLnJlcGxhY2UoX2xpbmtzWzBdLCBcXFwiXFxcIikucmVwbGFjZSgvW2EtekEtWjAtOV0rL2csIFxcXCJcXFwiKSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gX2xpbmtzWzFdO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoX2xpbmtzLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9saW5rc1swXTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS95c2Z4P3dlYlVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGlucHV0KTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6ICdDQ09GJyxcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXVxcbiAgICAgICAgICAgIGxldCBhbGlVdGlsID0gJC5yZXF1aXJlKFxcXCJhbGlVdGlsXFxcIik7XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSBmZXRjaCgnaHR0cHM6Ly9wYW4uY2NvZi5jYy9hcGkvc2VhcmNoJywge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiY29udGVudC10eXBlXFxcIjogJ2FwcGxpY2F0aW9uL2pzb24nLFxcbiAgICAgICAgICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly9wYW4uY2NvZi5jYy9zZWFyY2g/a2V5d29yZD0nICsgc1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFnZVNpemVcXFwiOiAyMCxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYWdlTnVtXFxcIjogcGFnZSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJrZXl3b3JkXFxcIjogcyxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJmcm9tTW9iaWxlXFxcIjogdHJ1ZVxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBKU09OLnBhcnNlKGh0bWwpXFxuICAgICAgICAgICAgICAgIC5kYXRhLnJvd3NcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gbGlzdFtpXTtcXG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gaXQuZmlsZU5hbWVcXG4gICAgICAgICAgICAgICAgbGV0IG11cmwgPSBpdC51cmxcXG4gICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBpdC50eXBlLnJlcGxhY2UoL2ZvbGRlci8sICfmlofku7blpLknKS5yZXBsYWNlKC9maWxlLywgJ+aWh+S7ticpXFxuICAgICAgICAgICAgICAgIGlmICh0aXRsZS5pbmNsdWRlcyhzKSkge1xcbiAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogJ+aWh+S7tuexu+Wei++8micgKyB0eXBlICsgJ++8jOaWh+S7tuWkp+Wwj++8micgKyBhbGlVdGlsLmJ5dGVzVG9TaXplKGl0LnNpemUpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogbXVybFxcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZFxcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiAn6Zi/6YeM5bCP56uZJyxcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IGhvbWUgPSBcXFwiaHR0cHM6Ly9wYW42NjYubmV0XFxcIjtcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChidWlsZFVybChob21lICsgXFxcIi9hcGkvZGlzY3Vzc2lvbnNcXFwiLCB7XFxuICAgICAgICAgICAgICAgIFxcXCJpbmNsdWRlXFxcIjogXFxcInVzZXIsbGFzdFBvc3RlZFVzZXIsbW9zdFJlbGV2YW50UG9zdCxtb3N0UmVsZXZhbnRQb3N0LnVzZXIsdGFncyx0YWdzLnBhcmVudCxmaXJzdFBvc3RcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiZmlsdGVyW3FdXFxcIjogcyAvKiArIFxcXCIgdGFnOnZpZGVvLGNvbWljXFxcIiovICxcXG4gICAgICAgICAgICAgICAgLy9cXFwiZmlsdGVyW3RhZ11cXFwiOiBcXFwidmlkZW8sY29taWNcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwicGFnZVtvZmZzZXRdXFxcIjogMjAgKiAocGFnZSAtIDEpXFxuICAgICAgICAgICAgfSksIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcImNvbnRlbnQtdHlwZVxcXCI6IFxcXCJhcHBsaWNhdGlvbi9qc29uXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vcGFuNjY2Lm5ldC8/cT1cXFwiICsgc1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBKU09OLnBhcnNlKGh0bWwpLmRhdGE7XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdGVtID0gbGlzdFtpXS5hdHRyaWJ1dGVzO1xcbiAgICAgICAgICAgICAgICBsZXQgdXJsID0gaG9tZSArIFxcXCIvZC9cXFwiICsgaXRlbS5zbHVnO1xcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0ZW0udGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiAn5Y+R5biD5pe26Ze077yaJyArICQuZGF0ZUZvcm1hdChuZXcgRGF0ZShpdGVtLmNyZWF0ZWRBdCksIFxcXCJ5eXl5LU1NLWRkIEhIOm1tOnNzXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIui/m+WFpeW4luWtkFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzOiBKU09OLnN0cmluZ2lmeShcXFwiaGlrZXI6Ly9wYWdlL3lzZng/d2ViVXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQodXJsKSlcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9LFxcbiAgICAgICAgZmluZEFsaVVybChpbnB1dCkge1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcGRmaChyZXF1ZXN0KGlucHV0KSwgXFxcIlRleHRcXFwiKTtcXG4gICAgICAgICAgICBsZXQgX2xpbmtzID0gaHRtbC5tYXRjaCgvaHR0cHM6XFxcXC9cXFxcLyh3d3dcXFxcLmFsaXl1bmRyaXZlXFxcXC5jb21cXFxcL3N8YWx5d3BcXFxcLm5ldClcXFxcL1xcXFx3Ki9nKSB8fCBbXTtcXG4gICAgICAgICAgICBsZXQgc2hhcmVQd2QgPSBodG1sLm1hdGNoKC/mj5Dlj5bnoIFbOu+8ml1cXFxccyo/KFxcXFx3ezR9KS8pO1xcbiAgICAgICAgICAgIHNoYXJlUHdkID0gQXJyYXkuaXNBcnJheShzaGFyZVB3ZCkgJiYgc2hhcmVQd2QubGVuZ3RoID4gMCA/IHNoYXJlUHdkWzFdIDogXFxcIlxcXCI7XFxuICAgICAgICAgICAgaWYgKF9saW5rcy5sZW5ndGggPiAxICYmIF9saW5rc1sxXS5yZXBsYWNlKF9saW5rc1swXSwgXFxcIlxcXCIpLnJlcGxhY2UoL1thLXpBLVowLTldKy9nLCBcXFwiXFxcIikgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICAgICAgICAgIGFsaVVybDogX2xpbmtzWzFdLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkXFxuICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChfbGlua3MubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICAgICAgYWxpVXJsOiBfbGlua3NbMF0sXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogc2hhcmVQd2RcXG4gICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS95c2Z4P3dlYlVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGlucHV0KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6ICfkupHnm5jliIbkuqvnpL7ljLonLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgaG9tZSA9IFxcXCJodHRwczovL3l1bnBhbjEuY2NcXFwiO1xcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KGJ1aWxkVXJsKGhvbWUgKyBcXFwiL2FwaS9kaXNjdXNzaW9uc1xcXCIsIHtcXG4gICAgICAgICAgICAgICAgXFxcImluY2x1ZGVcXFwiOiBcXFwidXNlcixsYXN0UG9zdGVkVXNlcixtb3N0UmVsZXZhbnRQb3N0LG1vc3RSZWxldmFudFBvc3QudXNlcix0YWdzLHRhZ3MucGFyZW50LGZpcnN0UG9zdFxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJmaWx0ZXJbcV1cXFwiOiBzIC8qICsgXFxcIiB0YWc6dmlkZW8sY29taWNcXFwiKi8gLFxcbiAgICAgICAgICAgICAgICAvL1xcXCJmaWx0ZXJbdGFnXVxcXCI6IFxcXCJ2aWRlbyxjb21pY1xcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJwYWdlW29mZnNldF1cXFwiOiAyMCAqIChwYWdlIC0gMSlcXG4gICAgICAgICAgICB9KSwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiY29udGVudC10eXBlXFxcIjogXFxcImFwcGxpY2F0aW9uL2pzb25cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly9wYW42NjYubmV0Lz9xPVxcXCIgKyBzXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBsZXQgbGlzdCA9IEpTT04ucGFyc2UoaHRtbCkuZGF0YTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBsaXN0W2ldLmF0dHJpYnV0ZXM7XFxuICAgICAgICAgICAgICAgIGxldCB1cmwgPSBob21lICsgXFxcIi9kL1xcXCIgKyBpdGVtLnNsdWc7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXRlbS50aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6ICflj5HluIPml7bpl7TvvJonICsgJC5kYXRlRm9ybWF0KG5ldyBEYXRlKGl0ZW0uY3JlYXRlZEF0KSwgXFxcInl5eXktTU0tZGQgSEg6bW06c3NcXFwiKSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi6L+b5YWl5biW5a2QXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganM6IEpTT04uc3RyaW5naWZ5KFxcXCJoaWtlcjovL3BhZ2UveXNmeD93ZWJVcmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudCh1cmwpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1dXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZDtcXG4gICAgICAgIH0sXFxuICAgICAgICBmaW5kQWxpVXJsKGlucHV0KSB7XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSBwZGZoKHJlcXVlc3QoaW5wdXQpLCBcXFwiVGV4dFxcXCIpO1xcbiAgICAgICAgICAgIGxldCBfbGlua3MgPSBodG1sLm1hdGNoKC9odHRwczpcXFxcL1xcXFwvKHd3d1xcXFwuYWxpeXVuZHJpdmVcXFxcLmNvbVxcXFwvc3xhbHl3cFxcXFwubmV0KVxcXFwvXFxcXHcqL2cpIHx8IFtdO1xcbiAgICAgICAgICAgIGxldCBzaGFyZVB3ZCA9IGh0bWwubWF0Y2goL+aPkOWPlueggVs677yaXVxcXFxzKj8oXFxcXHd7NH0pLyk7XFxuICAgICAgICAgICAgc2hhcmVQd2QgPSBBcnJheS5pc0FycmF5KHNoYXJlUHdkKSAmJiBzaGFyZVB3ZC5sZW5ndGggPiAwID8gc2hhcmVQd2RbMV0gOiBcXFwiXFxcIjtcXG4gICAgICAgICAgICBpZiAoX2xpbmtzLmxlbmd0aCA+IDEgJiYgX2xpbmtzWzFdLnJlcGxhY2UoX2xpbmtzWzBdLCBcXFwiXFxcIikucmVwbGFjZSgvW2EtekEtWjAtOV0rL2csIFxcXCJcXFwiKSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICAgICAgYWxpVXJsOiBfbGlua3NbMV0sXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogc2hhcmVQd2RcXG4gICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKF9saW5rcy5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgICAgICBhbGlVcmw6IF9saW5rc1swXSxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkOiBzaGFyZVB3ZFxcbiAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3lzZng/d2ViVXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoaW5wdXQpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICAvKixcXG4gICAgICAgIHtcXG4gICAgICAgICAgICBuYW1lOiBcXFwi5aWH5aaZ5pCc57SiXFxcIixcXG4gICAgICAgICAgICBwYWdlOiB0cnVlLFxcbiAgICAgICAgICAgIGZpbmQocywgcGFnZSkge1xcbiAgICAgICAgICAgICAgICBsZXQgdXJsO1xcbiAgICAgICAgICAgICAgICBpZiAocGFnZSA9PT0gMSkge1xcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gYnVpbGRVcmwoXFxcImh0dHBzOi8vd3d3Lm1hZ2ljYWxzZWFyY2gudG9wL2FwaS9wc2hvdS9nZXREYXRhXFxcIiwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQ6IHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXFxcIumYv+mHjOe9keebmFxcXCJcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gYnVpbGRVcmwoXFxcImh0dHBzOi8vd3d3Lm1hZ2ljYWxzZWFyY2gudG9wL2FwaS9wc2hvdS9nZXROZXh0UGFnZVxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXCJodHRwczovL2FwaS51cHl1bnNvMi5jb20vc2VhcmNoP3NfdHlwZT0yQHBhZ2U9XFxcIiArIHBhZ2UgKyBcXFwiQGtleXdvcmQ9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChzKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB3ZWJzaXRlOiBcXFwi6Zi/6YeM572R55uYXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QodXJsLCB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlcjogYnVpbGRVcmwoXFxcImh0dHBzOi8vd3d3Lm1hZ2ljYWxzZWFyY2gudG9wL3NlYXJjaFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZDogcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BhZ2U6IDBcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3VsdCkpO1xcbiAgICAgICAgICAgICAgICBsZXQgbGlzdCA9IHJlc3VsdC5yZXN1bHQuaXRlbXM7XFxuICAgICAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdC5pZCA9PSAtMSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXQudGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcIuaXpeacn++8mlxcXCIgKyBpdC5pbnNlcnRfdGltZSArIFxcXCJcXFxcbui3r+W+hO+8mlxcXCIgKyBpdC5wYXRoLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogaXQucGFnZV91cmxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0qL1xcbl07XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlt6XlhbdcIixcInBhdGhcIjpcImFsaVV0aWxcIixcInJ1bGVcIjpcIiQuZXhwb3J0cyA9IHtcXG4gICAgY2hlY2thbGkocmVhbHVybCkge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBpZiAocmVhbHVybC5pbmNsdWRlcyhcXFwiY29tL3MvXFxcIikgJiYgcmVhbHVybCAhPSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgICBsZXQgc2hhcmVJZCA9IHJlYWx1cmwuc3BsaXQoXFxcIj9cXFwiKVswXS5zcGxpdChcXFwiL1xcXCIpWzRdO1xcbiAgICAgICAgICAgICAgICBsZXQgc2hhcmUgPSBmZXRjaChcXFwiaHR0cHM6Ly9hcGkuYWxpeXVuZHJpdmUuY29tL2Fkcml2ZS92My9zaGFyZV9saW5rL2dldF9zaGFyZV9ieV9hbm9ueW1vdXNcXFwiLCB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6IFBDX1VBLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9cXFwiXFxuICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJzaGFyZV9pZFxcXCI6IHNoYXJlSWRcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgaWYgKHNoYXJlLmluY2x1ZGVzKFxcXCJzaGFyZV9saW5rIGlzXFxcIikgfHwgc2hhcmUuaW5jbHVkZXMoXFxcInNoYXJlX2xpbmsgY2Fubm90XFxcIikpIHJldHVybiBmYWxzZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgIH0sXFxuICAgIGJ5dGVzVG9TaXplKHNpemUpIHtcXG4gICAgICAgIGlmICghc2l6ZSkge1xcbiAgICAgICAgICAgIHJldHVybiAnMCc7XFxuICAgICAgICB9XFxuICAgICAgICBjb25zdCB1bml0cyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQicsICdQQicsICdFQicsICdaQicsICdZQiddO1xcbiAgICAgICAgbGV0IGkgPSAwO1xcbiAgICAgICAgd2hpbGUgKHNpemUgPj0gMTAyNCkge1xcbiAgICAgICAgICAgIHNpemUgLz0gMTAyNDtcXG4gICAgICAgICAgICBpKys7XFxuICAgICAgICB9XFxuICAgICAgICBzaXplID0gaSA/IE51bWJlcihzaXplLnRvRml4ZWQoMikpIDogc2l6ZTtcXG4gICAgICAgIHJldHVybiBgJHtzaXplfSAke3VuaXRzW2ldfWA7XFxuICAgIH0sXFxuICAgIGdldENyeXB0b0pTKCkge1xcbiAgICAgICAgaWYgKHR5cGVvZiBDcnlwdG9KUyA9PT0gXFxcInVuZGVmaW5lZFxcXCIpIHtcXG4gICAgICAgICAgICBldmFsKGdldENyeXB0b0pTKCkpO1xcbiAgICAgICAgICAgIHJldHVybiBDcnlwdG9KUztcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBDcnlwdG9KUztcXG4gICAgfSxcXG4gICAgZ2V0TmFtZXNTb3J0KCkge1xcbiAgICAgICAgbGV0IGNobk51bUNoYXIgPSB7XFxuICAgICAgICAgICAg6Zu2OiAwLFxcbiAgICAgICAgICAgIOS4gDogMSxcXG4gICAgICAgICAgICDkuow6IDIsXFxuICAgICAgICAgICAg5LiJOiAzLFxcbiAgICAgICAgICAgIOWbmzogNCxcXG4gICAgICAgICAgICDkupQ6IDUsXFxuICAgICAgICAgICAg5YWtOiA2LFxcbiAgICAgICAgICAgIOS4gzogNyxcXG4gICAgICAgICAgICDlhas6IDgsXFxuICAgICAgICAgICAg5LmdOiA5XFxuICAgICAgICB9O1xcblxcbiAgICAgICAgbGV0IGNobk5hbWVWYWx1ZSA9IHtcXG4gICAgICAgICAgICDljYE6IHtcXG4gICAgICAgICAgICAgICAgdmFsdWU6IDEwLFxcbiAgICAgICAgICAgICAgICBzZWNVbml0OiBmYWxzZVxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAg55m+OiB7XFxuICAgICAgICAgICAgICAgIHZhbHVlOiAxMDAsXFxuICAgICAgICAgICAgICAgIHNlY1VuaXQ6IGZhbHNlXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICDljYM6IHtcXG4gICAgICAgICAgICAgICAgdmFsdWU6IDEwMDAsXFxuICAgICAgICAgICAgICAgIHNlY1VuaXQ6IGZhbHNlXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICDkuIc6IHtcXG4gICAgICAgICAgICAgICAgdmFsdWU6IDEwMDAwLFxcbiAgICAgICAgICAgICAgICBzZWNVbml0OiB0cnVlXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICDkur86IHtcXG4gICAgICAgICAgICAgICAgdmFsdWU6IDEwMDAwMDAwMCxcXG4gICAgICAgICAgICAgICAgc2VjVW5pdDogdHJ1ZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGZ1bmN0aW9uIENoaW5lc2VUb051bWJlcihjaG5TdHIpIHtcXG4gICAgICAgICAgICBsZXQgcnRuID0gMDtcXG4gICAgICAgICAgICBsZXQgc2VjdGlvbiA9IDA7XFxuICAgICAgICAgICAgbGV0IG51bWJlciA9IDA7XFxuICAgICAgICAgICAgbGV0IHNlY1VuaXQgPSBmYWxzZTtcXG4gICAgICAgICAgICBsZXQgc3RyID0gY2huU3RyLnNwbGl0KCcnKTtcXG5cXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgbnVtID0gY2huTnVtQ2hhcltzdHJbaV1dO1xcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG51bSAhPT0gJ3VuZGVmaW5lZCcpIHtcXG4gICAgICAgICAgICAgICAgICAgIG51bWJlciA9IG51bTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBzdHIubGVuZ3RoIC0gMSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gbnVtYmVyO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVuaXQgPSBjaG5OYW1lVmFsdWVbc3RyW2ldXS52YWx1ZTtcXG4gICAgICAgICAgICAgICAgICAgIHNlY1VuaXQgPSBjaG5OYW1lVmFsdWVbc3RyW2ldXS5zZWNVbml0O1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlY1VuaXQpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uID0gKHNlY3Rpb24gKyBudW1iZXIpICogdW5pdDtcXG4gICAgICAgICAgICAgICAgICAgICAgICBydG4gKz0gc2VjdGlvbjtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uID0gMDtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiArPSAobnVtYmVyICogdW5pdCk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBudW1iZXIgPSAwO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBydG4gKyBzZWN0aW9uO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgZnVuY3Rpb24gbmFtZUNvbXBhcmUoYSwgYikge1xcbiAgICAgICAgICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKVxcbiAgICAgICAgICAgICAgICByZXR1cm4gYSA9PSBudWxsID8gYiA9PSBudWxsID8gMCA6IC0xIDogMTtcXG5cXG4gICAgICAgICAgICBhID0gYS5yZXBsYWNlKC8oW+mbtuS4gOS6jOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+S6v10pL2csIGZ1bmN0aW9uKG1hdGNoLCBwMSwgcDIsIHAzLCBvZmZzZXQsIHN0cmluZykge1xcbiAgICAgICAgICAgICAgICAvLyBwMSBpcyBub25kaWdpdHMsIHAyIGRpZ2l0cywgYW5kIHAzIG5vbi1hbHBoYW51bWVyaWNzXFxuICAgICAgICAgICAgICAgIHJldHVybiBDaGluZXNlVG9OdW1iZXIocDEpO1xcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgYiA9IGIucmVwbGFjZSgvKFvpm7bkuIDkuozkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIfkur9dKS9nLCBmdW5jdGlvbihtYXRjaCwgcDEsIHAyLCBwMywgb2Zmc2V0LCBzdHJpbmcpIHtcXG4gICAgICAgICAgICAgICAgLy8gcDEgaXMgbm9uZGlnaXRzLCBwMiBkaWdpdHMsIGFuZCBwMyBub24tYWxwaGFudW1lcmljc1xcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2hpbmVzZVRvTnVtYmVyKHAxKTtcXG4gICAgICAgICAgICB9KVxcblxcbiAgICAgICAgICAgIGxldCBOVU1CRVJTID0gamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4uY29tcGlsZShcXFwiKD88PVxcXFxcXFxcRCkoPz1cXFxcXFxcXGQpfCg/PD1cXFxcXFxcXGQpKD89XFxcXFxcXFxEKVxcXCIpXFxuICAgICAgICAgICAgbGV0IHNwbGl0MSA9IE5VTUJFUlMuc3BsaXQobmV3IGphdmEubGFuZy5TdHJpbmcoYSkpO1xcbiAgICAgICAgICAgIGxldCBzcGxpdDIgPSBOVU1CRVJTLnNwbGl0KG5ldyBqYXZhLmxhbmcuU3RyaW5nKGIpKTtcXG5cXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKHNwbGl0MS5sZW5ndGgsIHNwbGl0Mi5sZW5ndGgpOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGMxID0gc3BsaXQxW2ldLmNoYXJDb2RlQXQoMCk7XFxuICAgICAgICAgICAgICAgIGxldCBjMiA9IHNwbGl0MltpXS5jaGFyQ29kZUF0KDApO1xcbiAgICAgICAgICAgICAgICBsZXQgY21wID0gMDtcXG4gICAgICAgICAgICAgICAgbGV0IHplcm9DaGFyQ29kZSA9ICcwJy5jaGFyQ29kZUF0KDApO1xcbiAgICAgICAgICAgICAgICBsZXQgbmluZUNoYXJDb2RlID0gJzknLmNoYXJDb2RlQXQoMCk7XFxuXFxuICAgICAgICAgICAgICAgIGlmIChjMSA+PSB6ZXJvQ2hhckNvZGUgJiYgYzEgPD0gbmluZUNoYXJDb2RlICYmIGMyID49IHplcm9DaGFyQ29kZSAmJiBjMiA8PSBuaW5lQ2hhckNvZGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNtcCA9IG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcihzcGxpdDFbaV0pLmNvbXBhcmVUbyhuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoc3BsaXQyW2ldKSk7XFxuICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgICAgaWYgKGNtcCA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ2V4ID0gL1thLXpBLVowLTldL1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHMxID0gU3RyaW5nKHNwbGl0MVtpXSlcXG4gICAgICAgICAgICAgICAgICAgIGxldCBzMiA9IFN0cmluZyhzcGxpdDJbaV0pXFxuICAgICAgICAgICAgICAgICAgICBpZiAocmVnZXgudGVzdChzMSkgfHwgcmVnZXgudGVzdChzMikpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbXAgPSBuZXcgamF2YS5sYW5nLlN0cmluZyhzcGxpdDFbaV0pLmNvbXBhcmVUbyhuZXcgamF2YS5sYW5nLlN0cmluZyhzcGxpdDJbaV0pKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbXAgPSBzMS5sb2NhbGVDb21wYXJlKHMyLCAnZW4nKVxcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbXAgPSBzMS5sb2NhbGVDb21wYXJlKHMyLCAnemgnKVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgICAgIGlmIChjbXAgIT09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbXA7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGxlbmd0aENtcCA9IHNwbGl0MS5sZW5ndGggLSBzcGxpdDIubGVuZ3RoO1xcbiAgICAgICAgICAgIC8vIGlmIChsZW5ndGhDbXAgIT09IDApIGxlbmd0aENtcCA9IGxlbmd0aENtcCA+IDAgPyAtMSA6IDE7XFxuICAgICAgICAgICAgcmV0dXJuIGxlbmd0aENtcDtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBuYW1lQ29tcGFyZTtcXG4gICAgfVxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW8ueW5leaJuemHj+aMgui9vVwiLFwicGF0aFwiOlwiZG1Nb3VudFwiLFwicnVsZVwiOlwianM6XFxubGV0IGQgPSBbXTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcImRsbGFzdFRpbWVcXFwiKSk7XFxuc2V0UGFnZVRpdGxlKFxcXCLlvLnluZXmjILovb06XFxcIisoTVlfUEFSQU1TLmZvbGRlck5hbWV8fFxcXCI/XFxcIikpO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5riF56m65oyC6L295YiX6KGoXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcImRtbGlzdFxcXCIpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIixcXG59KTtcXG5pZighTVlfUEFSQU1TLmF1dG9tYXRpY2FkZCl7XFxuICAgIE1ZX1BBUkFNUy5hdXRvbWF0aWNhZGQgPSBnZXRJdGVtKFxcXCJhdXRvbWF0aWNhZGRcXFwiLFxcXCIxXFxcIik7XFxuICAgIHNldFBhZ2VQYXJhbXMoTVlfUEFSQU1TKTtcXG59XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmo4DmtYvmlrDlop46XFxcIitbXFxcIuWFs+mXrVxcXCIsXFxcIuW8gOWQr1xcXCJdW01ZX1BBUkFNUy5hdXRvbWF0aWNhZGR8fFxcXCIwXFxcIl0sXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgodikgPT4ge1xcbiAgICAgICBzZXRJdGVtKFxcXCJhdXRvbWF0aWNhZGRcXFwiLCB2LmF1dG9tYXRpY2FkZD09PVxcXCIxXFxcIj9cXFwiMFxcXCI6XFxcIjFcXFwiKTtcXG4gICAgICAgdi5hdXRvbWF0aWNhZGQgPSB1bmRlZmluZWQ7XFxuICAgICAgIHNldFBhZ2VQYXJhbXModik7XFxuICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgTVlfUEFSQU1TKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5LiL6L295by55bmVXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvbG9hZERtI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBvbmx5RG93bmxvYWQ6IHRydWVcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi5bey5oyC6L29XFxcIi5iaWcoKSxcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIGxldCBkbWxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiZG1saXN0XFxcIiwgW10pO1xcbiAgICAgICAgbGV0IGFsaVV0aWwgPSAkLnJlcXVpcmUoXFxcImFsaVV0aWxcXFwiKTtcXG4gICAgICAgIGxldCBuYW1lQ29tcGFyZSA9IGFsaVV0aWwuZ2V0TmFtZXNTb3J0KCk7XFxuICAgICAgICBkbWxpc3Quc29ydCgoYSwgYikgPT4gbmFtZUNvbXBhcmUoYSwgYikpO1xcbiAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcImRtbGlzdFxcXCIsIGRtbGlzdCk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5o6S5bqP5a6M5oiQXFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG59KTtcXG5sZXQgZmlsZSA9ICQucmVxdWlyZShcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3dlaXN5ci9qcy9maWxlLmpzP3Y9MVxcXCIpO1xcbmxldCBkbWxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiZG1saXN0XFxcIiwgW10pO1xcblxcbmZvciAobGV0IGkgPSAwOyBpIDwgZG1saXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgIGxldCBkbW5hbWUgPSBkbWxpc3RbaV07XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIltcXFwiICsgKGkgKyAxKSArIFxcXCJdXFxcXHRcXFwiICsgZG1uYW1lLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGRtbGlzdCA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJkbWxpc3RcXFwiLCBbXSk7XFxuICAgICAgICAgICAgZG1saXN0LnNwbGljZShpLCAxKTtcXG4gICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwiZG1saXN0XFxcIiwgZG1saXN0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIGkpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxuICAgIH0pO1xcbn1cXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIuacrOWcsOacquaMgui9vVxcXCIuYmlnKCksXFxuICAgIHVybDogJChcXFwi5piv5ZCm5riF6Zmk5omA5pyJ5pys5Zyw5by55bmV5paH5Lu2P1xcXFxuKOW8ueW5leaWh+S7tuavj+S4ieWkqeS8muiHquWKqOa4hemZpClcXFwiKS5jb25maXJtKCgpID0+IHtcXG4gICAgICAgIGxldCBmaWxlID0gJC5yZXF1aXJlKFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vd2Vpc3lyL2pzL2ZpbGUuanM/dj0xXFxcIik7XFxuICAgICAgICBmaWxlLmRlbGV0ZUZpbGVzKGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvZGFubXUvXFxcIikuc2xpY2UoNykpO1xcbiAgICAgICAgY2xlYXJNeVZhcihcXFwiZG1saXN0XFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5Yig6ZmkXFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG59KTtcXG5sZXQgZG1MaXN0UGF0aCA9IGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvZGFubXUvXFxcIikuc2xpY2UoNyk7XFxubGV0IGZpbGVMaXN0ID0gZmlsZS5nZXRGaWxlUGF0aChkbUxpc3RQYXRoLCBcXFwiZmlsZVxcXCIsIFxcXCIueG1sXFxcIik7XFxubGV0IGxhc3RUaW1lID0gMDtcXG5cXG5mb3IgKGxldCBpID0gMDsgaSA8IGZpbGVMaXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgIGxldCBkbWZpbGUgPSBmaWxlTGlzdFtpXTtcXG4gICAgbGFzdFRpbWUgPSBNYXRoLm1heChsYXN0VGltZSwgZG1maWxlLmxhc3RNb2RpZmllZCk7XFxuICAgIGlmIChkbWxpc3QuaW5jbHVkZXMoZG1maWxlLm5hbWUpKSBjb250aW51ZTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBkbWZpbGUubmFtZSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgobmFtZSkgPT4ge1xcbiAgICAgICAgICAgIGxldCBkbWxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiZG1saXN0XFxcIiwgW10pO1xcbiAgICAgICAgICAgIGlmICghZG1saXN0LmluY2x1ZGVzKG5hbWUpKSB7XFxuICAgICAgICAgICAgICAgIGRtbGlzdC5wdXNoKG5hbWUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwiZG1saXN0XFxcIiwgZG1saXN0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIGRtZmlsZS5uYW1lKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbiAgICB9KTtcXG59XFxubGV0IGxhc3RSZWNvcmQgPSBOdW1iZXIoZ2V0TXlWYXIoXFxcImRsbGFzdFRpbWVcXFwiLCBcXFwiLTFcXFwiKSk7XFxuXFxuaWYgKE1ZX1BBUkFNUy5hdXRvbWF0aWNhZGQ9PT1cXFwiMVxcXCImJmxhc3RSZWNvcmQhPS0xJiZsYXN0UmVjb3JkIDwgbGFzdFRpbWUpIHtcXG4gICAgY29uZmlybSh7XFxuICAgICAgICB0aXRsZTogXFxcIuaWsOW8ueW5leaWh+S7tlxcXCIsXFxuICAgICAgICBjb250ZW50OiBcXFwi5qOA5p+l5Yiw5paw5LiL6L2955qE5by55bmV5piv5ZCm5YWo6YOo5oyC6L2977yfXFxcIixcXG4gICAgICAgIGNvbmZpcm06ICQudG9TdHJpbmcoKGxhc3RSZWNvcmQsIGRtTGlzdFBhdGgpID0+IHtcXG4gICAgICAgICAgICBsZXQgZmlsZSA9ICQucmVxdWlyZShcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3dlaXN5ci9qcy9maWxlLmpzP3Y9MVxcXCIpO1xcbiAgICAgICAgICAgIGxldCBmaWxlTGlzdCA9IGZpbGUuZ2V0RmlsZVBhdGgoZG1MaXN0UGF0aCwgXFxcImZpbGVcXFwiLCBcXFwiLnhtbFxcXCIpO1xcbiAgICAgICAgICAgIGxldCBkbWxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiZG1saXN0XFxcIiwgW10pO1xcbiAgICAgICAgICAgIGZpbGVMaXN0LmZvckVhY2godiA9PiB7XFxuICAgICAgICAgICAgICAgIGlmICghZG1saXN0LmluY2x1ZGVzKHYubmFtZSkmJnYubGFzdE1vZGlmaWVkID4gbGFzdFJlY29yZCkge1xcbiAgICAgICAgICAgICAgICAgICAgZG1saXN0LnB1c2godi5uYW1lKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJkbWxpc3RcXFwiLCBkbWxpc3QpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5oyC6L295oiQ5Yqf44CCXFxcIjtcXG4gICAgICAgIH0sIGxhc3RSZWNvcmQsIGRtTGlzdFBhdGgpLFxcbiAgICB9KTtcXG59XFxuaWYobGFzdFRpbWU+PTApe1xcbiAgICBwdXRNeVZhcihcXFwiZGxsYXN0VGltZVxcXCIsIFxcXCJcXFwiICsgbGFzdFRpbWUpO1xcbn1cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLkuLvpobXlpITnkIZcIixcInBhdGhcIjpcIk1haW5cIixcInJ1bGVcIjpcImlmIChnZXRJdGVtKFxcXCJmaXJzdFxcXCIpID09IE1ZX1JVTEUudmVyc2lvbikge1xcbiAgICAkLnJlcXVpcmUoXFxcInNvdVxcXCIpO1xcbn0gZWxzZSBpZiAoTVlfUEFHRSA9PT0gMSkge1xcbiAgICBsZXQgZCA9IFtdXFxuICAgIGxldCB0aW1lID0gMjA7XFxuICAgIGxldCBpZCA9IERhdGUubm93KCk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnTxzdHJvbmc+5L2/55So5YmN6aG755+lPC9zdHJvbmc+XFxcIi5iaWcoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCIxLiDmnKzlsI/nqIvluo/miYDmnInku6PnoIHlhajpg6jlvIDmupDvvIzkuJTmnKzop4TliJnkuLrlrabkuaDnm67nmoTvvIzor7fkuo7lr7zlhaUyNOWwj+aXtuWGheWIoOmZpO+8ge+8ge+8gTxicj4yLiDmnKzlsI/nqIvluo88Yj7lrozlhajlhY3otLk8L2I+77yM5aaC5p6c5L2g5piv5LuY6LS56LSt5Lmw55qE5oGt5Zac5L2g6KKr6aqX5LqG44CCPGJyPuW9k+eEtuWmguaenOacieiDveWKm+aDs+m8k+WKseS9nOiAheeahOWPr+S7pTxhIGhyZWY9J2hpa2VyOi8vcGFnZS9Eb25hdGUudiNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSMnPuaUr+aMgeS4gOS4izwvYT4oPHNtYWxsPueCueWHu+WPr+i/m+WFpeaNkOi1oO+8jOWPr+WcqOS4u+mhteiPnOWNlei/m+WFpTwvc21hbGw+KeOAgjxicj4zLiDmnKzlsI/nqIvluo/mmK/lnKjljp/niYjjgIzkupHnm5jlkJvjgI3nmoTln7rnoYDov5vooYznmoTkuozmrKHkv67mlLnvvIzor7fmlK/mjIHljp/niYjjgII8YnI+PGJyPjxiPuW8gOWni+S9v+eUqOacrOinhOWImeWNs+S7o+ihqOmBteWuiOinhOWImTwvYj48YnI+5b2T5YmN54mI5pys77yaXFxcIiArIE1ZX1JVTEUudmVyc2lvbixcXG4gICAgICAgIFxcXCJjb2xfdHlwZVxcXCI6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0sIHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG4gICAgfSwge1xcbiAgICAgICAgdGl0bGU6IHRpbWUgKyBcXFwi56eS5ZCO57un57utXFxcIixcXG4gICAgICAgIHVybDogXFxcInRvYXN0Oi8v6K+36K6k55yf6ZiF6K+75Lul5LiK5YaF5a65XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBpZCArIFxcXCJ0aW1lclxcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIHNldFJlc3VsdChkKTtcXG4gICAgd2hpbGUgKHRpbWUgIT0gMCkge1xcbiAgICAgICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCgxMDAwKTtcXG4gICAgICAgIHRpbWUgLT0gMTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oaWQgKyBcXFwidGltZXJcXFwiLCB7XFxuICAgICAgICAgICAgdGl0bGU6IHRpbWUgKyBcXFwi56eS5ZCO57un57utXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgdXBkYXRlSXRlbShpZCArIFxcXCJ0aW1lclxcXCIsIHtcXG4gICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc5oiR5ZCM5oSP5Lul5LiK6KaB5rGC4oCd4oCdXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgodikgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcImZpcnN0XFxcIiwgU3RyaW5nKHYpKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mhJ/osKLmgqjnmoTnkIbop6NcXFwiO1xcbiAgICAgICAgfSwgTVlfUlVMRS52ZXJzaW9uKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG4gICAgfSk7XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5o2Q6LWgXCIsXCJwYXRoXCI6XCJEb25hdGUudlwiLFwicnVsZVwiOlwianM6XFxubGV0IGQgPSBbXTtcXG5zZXRQYWdlVGl0bGUoXFxcIuaNkOi1oC/mlK/mjIFcXFwiKTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaNkOi1oC/mlK/mjIFcXFwiLFxcbiAgICBkZXNjOiBcXFwi6L+Z5Liq5o2Q6LWg5LiN6IO95Li65L2g5bim5p2l54m55p2D77yM5L2G5oKo55qE5pSv5oyB5piv5oiR5pu05paw5Yib5L2c55qE5Yqo5Yqb44CCXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiBcXFwidG9hc3Q6Ly/mhJ/osKLmgqjnmoTmlK/mjIFcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJwaWNfMV9mdWxsXFxcIixcXG4gICAgdXJsOiBcXFwiaHR0cHM6Ly9naXRlZS5jb20vTG95RGdJay9Mb3lEZ0lrX1J1bGUvcmF3L21hc3Rlci82N2Q4ZjAxODdmMDE4NmMxLnBuZ1xcXCIsXFxuICAgIHBpY191cmw6IFxcXCJodHRwczovL2dpdGVlLmNvbS9Mb3lEZ0lrL0xveURnSWtfUnVsZS9yYXcvbWFzdGVyLzY3ZDhmMDE4N2YwMTg2YzEucG5nXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLlm77niYfliqDovb3nvJPmhaLor7fnqI3nrYlcXFwiLnNtYWxsKCkuZm9udGNvbG9yKFxcXCJHcmF5XFxcIiksXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgIH1cXG59KTtcXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJ0ZXh0X2ljb25cIixcIm5hbWVcIjpcIuinhOWImeemgeeUqFwiLFwicGF0aFwiOlwiUnVsZURpc2FibGVcIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi56aB55So6KeE5YiZXFxcIik7XFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCgpPT5yZWZyZXNoUGFnZSgpKTtcXG5sZXQgZGF0YSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3J1bGVzXFxcIikubWFwKHY9PnYubmFtZSk7XFxubGV0IGQgPSBbXTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWFqOmDqOWPlua2iOemgeeUqFxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBjbGVhckl0ZW0oXFxcImZvcmJpZGRlblxcXCIpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG59KTtcXG5sZXQgZm9yYmlkZGVuID0gc3RvcmFnZTAuZ2V0SXRlbShcXFwiZm9yYmlkZGVuXFxcIiwgW10pO1xcbmxldCBxaWQgPSBTdHJpbmcoRGF0ZS5ub3coKSk7XFxuZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XFxuICAgIGxldCBpdCA9IGRhdGFbaV07XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogaXQsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGl0LCBpZCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBmb3JiaWRkZW4gPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJmb3JiaWRkZW5cXFwiLCBbXSk7XFxuICAgICAgICAgICAgbGV0IGluZGV4ID0gZm9yYmlkZGVuLmluZGV4T2YoaXQpO1xcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XFxuICAgICAgICAgICAgICAgIGZvcmJpZGRlbi5zcGxpY2UoaW5kZXgsIDEpO1xcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKGlkLCB7XFxuICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9yZWN0XFxcIlxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBmb3JiaWRkZW4ucHVzaChpdCk7XFxuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oaWQsIHtcXG4gICAgICAgICAgICAgICAgICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX3JlY3RfZmlsbFxcXCJcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcImZvcmJpZGRlblxcXCIsIGZvcmJpZGRlbik7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIGl0LCBxaWQgKyBpKSxcXG4gICAgICAgIHBpY191cmw6IGZvcmJpZGRlbi5pbmNsdWRlcyhpdCkgPyBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9yZWN0X2ZpbGxcXFwiIDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fcmVjdFxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBxaWQgKyBpXFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJUVkJPWOaOqOmAgVwiLFwicGF0aFwiOlwidHZib3hQdXNoXCIsXCJydWxlXCI6XCJqczpcXG4oZnVuY3Rpb24oKSB7XFxuICAgIGxldCBkID0gW107XFxuICAgIGNvbnN0IHtcXG4gICAgICAgIHBhZ2VJZCxcXG4gICAgICAgIHNoYXJlSWQsXFxuICAgICAgICBmb2xkZXJOYW1lLFxcbiAgICAgICAgZmlsZUlkXFxuICAgIH0gPSBNWV9QQVJBTVM7XFxuICAgIHNldFBhZ2VUaXRsZShcXFwidHZCb3jmjqjpgIE6XFxcIiArIGZvbGRlck5hbWUpO1xcbiAgICBjb25zdCB7XFxuICAgICAgICBhbGlUb2tlbnNGaWxlcGF0aFxcbiAgICB9ID0gJC5yZXF1aXJlKFxcXCJ0b2tlblBhdGhcXFwiKTtcXG4gICAgbGV0IHJlZnJlc2hUb2tlbiA9IFxcXCJcXFwiO1xcbiAgICBpZiAoIWZpbGVFeGlzdChhbGlUb2tlbnNGaWxlcGF0aCkpIHtcXG4gICAgICAgIHRvYXN0KFxcXCLor7flhYjnmbvpmYbnmbvlvZXotKblj7dcXFwiKTtcXG4gICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmVmcmVzaFRva2VuID0gJC5yZXF1aXJlKGFsaVRva2Vuc0ZpbGVwYXRoKS5yZWZyZXNoX3Rva2VuO1xcbiAgICB9XFxuXFxuICAgIGZ1bmN0aW9uIGdldFB1c2gobmFtZSwgdXJsKSB7XFxuICAgICAgICBsZXQgcHVzaCA9IHtcXG4gICAgICAgICAgICBcXFwic2hhcmVfaWRcXFwiOiBzaGFyZUlkLFxcbiAgICAgICAgICAgIFxcXCJyZWZyZXNoX3Rva2VuXFxcIjogcmVmcmVzaFRva2VuLFxcbiAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogbmFtZSxcXG4gICAgICAgICAgICBcXFwidXJsXFxcIjogdXJsXFxuICAgICAgICB9O1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcHVzaCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSM/cnVsZT1YWVHmjqjpgIEmcHVzaHVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHB1c2gpKTtcXG4gICAgfVxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLmjqjpgIHpmL/ph4zliIbkuqvpk77mjqVcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL3B1c2gjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjP3J1bGU9WFlR5o6o6YCBJnB1c2h1cmw9XFxcIitlbmNvZGVVUklDb21wb25lbnQoXFxcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zL1xcXCIgKyBzaGFyZUlkICsgKGZpbGVJZCA/IFxcXCIvZm9sZGVyL1xcXCIgKyBmaWxlSWQgOiBcXFwiXFxcIikpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpbmhlcml0VGl0bGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBsZXQgYWxsID0ge1xcbiAgICAgICAgdGl0bGU6IFxcXCLmjqjpgIHlhajpg6jlt7LliqDovb3op4bpopFcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGluaGVyaXRUaXRsZTogZmFsc2VcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBkLnB1c2goYWxsKTtcXG4gICAgbGV0IGFsbFVybHMgPSBbXTtcXG4gICAgbGV0IGxpc3QgPSBmaW5kSXRlbXNCeUNscyhcXFwidlxcXCIgKyBwYWdlSWQpO1xcbiAgICBpZighQXJyYXkuaXNBcnJheShsaXN0KXx8bGlzdC5sZW5ndGg9PT0wKXtcXG4gICAgICAgIHRvYXN0KFxcXCLov5jmsqHmnInliqDovb3lrozmiJDnmoTop4bpopFcXFwiKTtcXG4gICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuO1xcbiAgICB9XFxuICAgIGxpc3QuZm9yRWFjaCh2ID0+IHtcXG4gICAgICAgIHYuY29sX3R5cGUgPSB2LnR5cGU7XFxuICAgICAgICBsZXQgbmFtZSA9IHYuZXh0cmEucGFnZVRpdGxlO1xcbiAgICAgICAgbGV0IHVybCA9IG5hbWUucmVwbGFjZSgvXFxcXCMvZywgJ18nKS5yZXBsYWNlKC9cXFxcJC9nLCAnXycpICsgXFxcIiR2aWRlb3xcXFwiICsgdi5leHRyYS5pZDtcXG4gICAgICAgIGFsbFVybHMucHVzaCh1cmwpO1xcbiAgICAgICAgdi51cmwgPSBnZXRQdXNoKG5hbWUsIHVybCk7XFxuICAgICAgICB2LmV4dHJhLmNscyA9IHYuZXh0cmEuaWQgPSB1bmRlZmluZWQ7XFxuICAgICAgICBkLnB1c2godik7XFxuICAgIH0pO1xcbiAgICBhbGwudXJsID0gZ2V0UHVzaChmb2xkZXJOYW1lLCBhbGxVcmxzLmpvaW4oXFxcIiNcXFwiKSk7XFxuICAgIHNldFJlc3VsdChkKTtcXG59KSgpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5bCB6Z2i5pCc57SiXCIsXCJwYXRoXCI6XCJmcm9udENvdmVyXCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZCA9IFtdO1xcbmxldCBrZXkgPSBnZXRNeVZhcihcXFwiZnJvbnRjb3ZlcmtleVxcXCIsIFxcXCJcXFwiKTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaQnOe0olxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcImZyb250Y292ZXJrZXlcXFwiLCBpbnB1dC50cmltKCkpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICB9KSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZToga2V5IHx8IGdldE15VmFyKFxcXCJzXFxcIiwgXFxcIlxcXCIpXFxuICAgIH1cXG59KTtcXG5pZiAoa2V5KSB7XFxuICAgIGxldCByID0gcmVxdWVzdCgnaHR0cHM6Ly9tLmRvdWJhbi5jb20vc2VhcmNoLz9xdWVyeT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGtleSkpXFxuICAgIGxldCBsaXN0ID0gcGRmYShyLCBcXFwiLnNlYXJjaC1yZXN1bHRzJiZpbWdcXFwiKTtcXG4gICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xcbiAgICAgICAgbGV0IHBpYyA9IHBkZmgoaXQsIFxcXCJpbWcmJnNyY1xcXCIpO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBwaWNfdXJsOiBwaWMsXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwaWMpID0+IHtcXG4gICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcImZyb250Y292ZXJwaWNcXFwiLCBwaWMpO1xcbiAgICAgICAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSwgcGljKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInBpY18yX2NhcmRcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcblxcbn1cXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gICAgbGV0IHBpYyA9IGdldE15VmFyKFxcXCJmcm9udGNvdmVycGljXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcImZyb250Y292ZXJwaWNcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiZnJvbnRjb3ZlcmtleVxcXCIpO1xcbiAgICBzZXRQYWdlUGljVXJsKHBpYyk7XFxufSk7XFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6YeN572u5byV5a+8XCIsXCJwYXRoXCI6XCJCb290UmVzZXRcIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi6YeN572u5byV5a+8XFxcIik7XFxubGV0IGQgPSBbXTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuesrOS4gOatpVxcXCIuYmlnKCksXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5bCG572R57uc5YiH5o2i5Li656e75Yqo572R57uc77yM5bm25byA5YWz6aOe6KGM5qih5byPXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi56ys5LqM5q2lXFxcIi5iaWcoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLngrnmiJHph43nva7nmbvpmYbnirbmgIHjgIJcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBjb25zdCB7XFxuICAgICAgICAgICAgb3BlblRva2Vuc0ZpbGVwYXRoLFxcbiAgICAgICAgICAgIGFsaVRva2Vuc0ZpbGVwYXRoXFxuICAgICAgICB9ID0gJC5yZXF1aXJlKFxcXCJ0b2tlblBhdGhcXFwiKTtcXG4gICAgICAgIGRlbGV0ZUZpbGUob3BlblRva2Vuc0ZpbGVwYXRoKTtcXG4gICAgICAgIGRlbGV0ZUZpbGUoYWxpVG9rZW5zRmlsZXBhdGgpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOWujOaIkFxcXCI7XFxuICAgIH0pXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLnrKzkuInmraVcXFwiLmJpZygpLFxcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIueCueaIkei/m+WFpemHjeaWsOeZu+mZhlxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9ub1JlZnJlc2g9MVxcXCJcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAgOWHuuW5tuWIt+aWsFxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKT0+e1xcbiAgICAgICAgYmFjayh0cnVlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0pXFxufSk7XFxuc2V0UmVzdWx0KGQpO1wifV0sXCJwYXJhbXNcIjpcIntcXFwibGluZVZpc2libGVcXFwiOmZhbHNlLFxcXCJzaGFyZVRva2VuXFxcIjpcXFwiZXlKaGJHY2lPaUpTVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SmpkWE4wYjIxS2MyOXVJam9pZTF3aVpHOXRZV2x1WDJsa1hDSTZYQ0ppYWpJNVhDSXNYQ0p6YUdGeVpWOXBaRndpT2x3aWVIRnBaamxUWmxVeE4zVmNJaXhjSW1OeVpXRjBiM0pjSWpwY0lqaGlOVEppTTJGallUTXdNelJqWmpOaE1HSTJZbVF5TVRKaVlXRTBZems0WENJc1hDSjFjMlZ5WDJsa1hDSTZYQ0poYm05dWVXMXZkWE5jSW4waUxDSmpkWE4wYjIxVWVYQmxJam9pYzJoaGNtVmZiR2x1YXlJc0ltVjRjQ0k2TVRZNU9UWXhORFl4TUN3aWFXRjBJam94TmprNU5qQTNNelV3ZlEuYWFpQWxheWlOWTlzb0t5Z2dPMkIwZW5nZzBMSGczLVFMUHRxZXNzOHNDVGVfc3VYRlctbUthdUtlVXBSYUhkMU5sdndGb1RTOTduVFhXU185R2I4a0MtMEF5blVsV1RRMWJCRTNyZ2J3U1hVeERPdkp2R0tRX0h6RkZnSWVZWGU2Z3NabV81ajRYQ1pjSkZkd0YzR1F6Wl9KcVZic3VwZk5CLTFIRjRMNks0XFxcIn1cIixcInNhdmVkXCI6ZmFsc2UsXCJ0aXRsZVwiOlwi5LqR55uY5ZCbLueugFwiLFwidmVyc2lvblwiOjAsXCJ1cmxcIjpcImhpa2VyOi8vcGFnZS9hbGl5dW4/cnVsZT3kupHnm5jlkJsu566AJnBhZ2U9ZnlwYWdlJnJlYWx1cmw9aHR0cHMlM0ElMkYlMkZ3d3cuYWxpeXVuZHJpdmUuY29tJTJGcyUyRnhxaWY5U2ZVMTd1XCIsXCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwiZmluZF9ydWxlXCI6XCJqczpcXG4vL0BhdXRob3IgTG95RGdJa1xcbmNvbnN0IEFsaVNoYXJlQXBpID0gJC5yZXF1aXJlKFxcXCJBbGlBcGlcXFwiKTtcXG5cXG5sZXQgcmVhbHVybCA9IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwicmVhbHVybFxcXCIsIFxcXCJcXFwiKSkuc3BsaXQoXFxcIj9cXFwiKVswXTtcXG5sZXQgdXJsRGF0YSA9IHJlYWx1cmwuc3BsaXQoXFxcIi9cXFwiKTtcXG4vL2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zL3tzaGFyZUlkfS9mb2xkZXIve2ZpbGVJZH0/O1xcblxcbmxldCBzaGFyZUlkID0gTVlfUEFSQU1TLnNoYXJlSWQgfHwgdXJsRGF0YVs0XTtcXG5sZXQgc2hhcmVQd2QgPSBnZXRQYXJhbShcXFwic2hhcmVQd2RcXFwiLCBNWV9QQVJBTVMuc2hhcmVQd2QgfHwgXFxcIlxcXCIpO1xcbmxldCBzaGFyZVRva2VuID0gZ2V0UGFyYW0oXFxcInNoYXJlVG9rZW5cXFwiLCBNWV9QQVJBTVMuc2hhcmVUb2tlbik7XFxuXFxubGV0IGZpbGVJZCA9ICh1cmxEYXRhWzVdID09PSBcXFwiZm9sZGVyXFxcIiA/IHVybERhdGFbNl0gOiB2b2lkIDApIHx8IE1ZX1BBUkFNUy5maWxlSWQ7XFxubGV0IHNlYXJjaEtleSA9IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwic2VhcmNoS2V5XFxcIiwgXFxcIlxcXCIpKSB8fCB1bmRlZmluZWQ7XFxubGV0IGlzU2VhcmNoID0gISFzZWFyY2hLZXk7XFxuXFxubGV0IHBhZ2VJZCA9IFN0cmluZyhEYXRlLm5vdygpKS5zbGljZSg2KTtcXG5cXG5mdW5jdGlvbiBmb3JtYXREYXRlKF9kYXRlLCBmbXQpIHtcXG4gICAgbGV0IGRhdGUgPSAhaXNOYU4oX2RhdGUpID8gbmV3IERhdGUoX2RhdGUgKiAxMDAwKSA6IG5ldyBEYXRlKF9kYXRlKTtcXG4gICAgcmV0dXJuICQuZGF0ZUZvcm1hdChkYXRlLCBmbXQgfHwgXFxcInl5eXktTU0tZGQgSEg6bW06c3NcXFwiKVxcbn1cXG5cXG5mdW5jdGlvbiBmb3JtYXRTaXplKHNpemUpIHtcXG4gICAgaWYgKCFzaXplKSB7XFxuICAgICAgICByZXR1cm4gJyc7XFxuICAgIH1cXG4gICAgY29uc3QgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXTtcXG4gICAgbGV0IGkgPSAwO1xcbiAgICB3aGlsZSAoc2l6ZSA+PSAxMDI0KSB7XFxuICAgICAgICBzaXplIC89IDEwMjQ7XFxuICAgICAgICBpKys7XFxuICAgIH1cXG4gICAgc2l6ZSA9IGkgPyBOdW1iZXIoc2l6ZS50b0ZpeGVkKDIpKSA6IHNpemU7XFxuICAgIHJldHVybiBgJHtzaXplfSAke3VuaXRzW2ldfWA7XFxufVxcblxcbmZ1bmN0aW9uIHNldE15UGFDYWNoZShrZXksIHZhbHVlKSB7XFxuICAgIE1ZX1BBUkFNU1trZXldID0gdmFsdWU7XFxufVxcblxcbmZ1bmN0aW9uIHNhdmVNeVBhQ2FjaGUoKSB7XFxuICAgIHNldFBhZ2VQYXJhbXMoTVlfUEFSQU1TKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0TWFya2VyKG1hcmtlcikge1xcbiAgICBzZXRNeVBhQ2FjaGUoXFxcIm1hcmtlclxcXCIsIG1hcmtlcik7XFxufVxcblxcbmZ1bmN0aW9uIHNldFRva2VuKHNoYXJlVG9rZW4pIHtcXG4gICAgc2V0TXlQYUNhY2hlKFxcXCJzaGFyZVRva2VuXFxcIiwgc2hhcmVUb2tlbik7XFxufVxcbmlmKE1ZX1BBUkFNUy5ub1BpYyl7XFxuICAgIHNldFBhZ2VQaWNVcmwoKTtcXG4gICAgc2V0TXlQYUNhY2hlKFxcXCJub1BpY1xcXCIsIGZhbHNlKTtcXG59XFxuLypcXG5mdW5jdGlvbiBzZXRWaWRlb0l0ZW1DYWNoZSh2aWRlb0l0ZW1DYWNoZSkge1xcbiAgICBzZXRNeVBhQ2FjaGUoXFxcInZpZGVvSXRlbUNhY2hlXFxcIiwgdmlkZW9JdGVtQ2FjaGUpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRTdWJ0aXRsZUNhY2hlKHN1YnRpdGxlQ2FjaGUpIHtcXG4gICAgc2V0TXlQYUNhY2hlKFxcXCJzdWJ0aXRsZUNhY2hlXFxcIiwgc3VidGl0bGVDYWNoZSk7XFxufSovXFxuXFxubGV0IGljb25UeXBlID0gXFxcImFpfGFwa3xhdml8Y3NzfGRtZ3xleGV8Zmx2fGdpZnxoaWtlcnxodG1sfGlzb3xqcGd8anN8anNvbnxsb2d8bW92fG1wM3xtcDR8b3RmfHBocHxwbmd8cHB0fHBzZHx0YWJsZXx0eHR8d2F2fHhsc3x6aXB8Y3NzfGRvY3xlcHVifGV4Y3xodG18eGxzeFxcXCIuc3BsaXQoJ3wnKTtcXG5cXG5mdW5jdGlvbiBnZXRJY29uKGV4dCwgdHlwZSkge1xcbiAgICBsZXQgcm9vdCA9IFxcXCJodHRwczovL2dpdGNvZGUubmV0L3FxXzMyMzk0MzUxL2RyLy0vcmF3L21hc3Rlci9pbWcv5paH5Lu257G75Z6LMi9cXFwiO1xcbiAgICBpZiAodHlwZSA9PT0gXFxcImZvbGRlclxcXCIpIHtcXG4gICAgICAgIHJldHVybiByb290ICsgXFxcIuaWh+S7tuWkuS5zdmdcXFwiO1xcbiAgICB9XFxuICAgIGlmIChpY29uVHlwZS5pbmNsdWRlcygoZXh0IHx8IFxcXCJcXFwiKS50b0xvd2VyQ2FzZSgpKSkge1xcbiAgICAgICAgcmV0dXJuIHJvb3QgKyBleHQgKyBcXFwiLnN2Z1xcXCI7XFxuICAgIH1cXG4gICAgcmV0dXJuIHJvb3QgKyBcXFwi5paH5Lu2LnN2Z1xcXCI7XFxuXFxufVxcblxcbmZ1bmN0aW9uIGxvYWQoaXRlbXMpIHtcXG4gICAgbGV0IGFsaVNoYXJlQXBpID0gbmV3IEFsaVNoYXJlQXBpKHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCAoc2hhcmVUb2tlbikgPT4ge1xcbiAgICAgICAgc2V0VG9rZW4oc2hhcmVUb2tlbik7XFxuICAgICAgICBNWV9QQVJBTVMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW47XFxuICAgIH0pO1xcbiAgICBsZXQgb3JkZXJzID0ge1xcbiAgICAgICAgXFxcIuWQjeensOato+W6j1xcXCI6IFxcXCJuYW1lI0FTQ1xcXCIsXFxuICAgICAgICBcXFwi5ZCN56ew5YCS5bqPXFxcIjogXFxcIm5hbWUjREVTQ1xcXCIsXFxuICAgICAgICBcXFwi5pe26Ze05q2j5bqPXFxcIjogXFxcInVwZGF0ZWRfYXQjQVNDXFxcIixcXG4gICAgICAgIFxcXCLml7bpl7TlgJLluo9cXFwiOiBcXFwidXBkYXRlZF9hdCNERVNDXFxcIixcXG4gICAgICAgIFxcXCLlpKflsI/mraPluo9cXFwiOiBcXFwic2l6ZSNBU0NcXFwiLFxcbiAgICAgICAgXFxcIuWkp+Wwj+WAkuW6j1xcXCI6IFxcXCJzaXplI0RFU0NcXFwiXFxuICAgIH07XFxuICAgIGxldCBvcmRlcnNLZXlzID0gT2JqZWN0LmtleXMob3JkZXJzKTtcXG4gICAgbGV0IG9yZGVyTmFtZSA9IGdldEl0ZW0oXFxcImFsaXl1bl9vcmRlclxcXCIsIG9yZGVyc0tleXNbMF0pO1xcbiAgICBsZXQgb3JkZXIgPSBvcmRlcnNbb3JkZXJOYW1lXS5zcGxpdChcXFwiI1xcXCIpO1xcbiAgICBsZXQgc3R5bGVzID0gW1xcXCJ0ZXh0XzFcXFwiLCBcXFwibW92aWVfMlxcXCIsIFxcXCJjYXJkX3BpY18zXFxcIiwgXFxcImF2YXRhclxcXCIsIFxcXCLov73liadcXFwiXTtcXG4gICAgbGV0IHN0eWxlID0gZ2V0SXRlbShcXFwiYWxpeXVuX3N0eWxlXFxcIiwgc3R5bGVzWzBdKTtcXG4gICAgaWYgKE1ZX1BBR0UgPT09IDEpIHtcXG4gICAgICAgIGlmICghZ2V0TXlWYXIoXFxcIm1vdW50emltdVxcXCIsIFxcXCJcXFwiKSkge1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJtb3VudHppbXVcXFwiLCB7fSk7XFxuICAgICAgICAgICAgYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwibW91bnR6aW11XFxcIik7XFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcImFsaVNoYXJlVG9rZW5cXFwiKTtcXG4gICAgICAgICAgICAgICAgY2xlYXJWYXIoXFxcImRtX3NoYXJlXFxcIik7XFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcImRtbGlzdFxcXCIpO1xcbiAgICAgICAgICAgIH0pKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHNldE1hcmtlcigpO1xcbiAgICAgICAgaWYgKHJlYWx1cmwgJiYgIWlzU2VhcmNoKSB7XFxuICAgICAgICAgICAgbGV0IHNoYXJlSW5mbyA9IGFsaVNoYXJlQXBpLmdldFNoYXJlSW5mbygpO1xcblxcbiAgICAgICAgICAgIGxldCBmaWxlSW5mbyA9IHNoYXJlSW5mby5maWxlX2luZm9zO1xcbiAgICAgICAgICAgIGlmIChmaWxlSW5mby5sZW5ndGggPT09IDEgJiYgZmlsZUluZm9bMF0udHlwZSA9PT0gXFxcImZvbGRlclxcXCIgJiYgIWZpbGVJZCkge1xcbiAgICAgICAgICAgICAgICBmaWxlSWQgPSBmaWxlSW5mb1swXS5maWxlX2lkO1xcbiAgICAgICAgICAgICAgICBzZXRQYWdlVGl0bGUoZmlsZUluZm9bMF0uZmlsZV9uYW1lKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBzZXRQYWdlVGl0bGUoc2hhcmVJbmZvLnNoYXJlX25hbWUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgZGVhZGxpbmUgPSBcXFwi5rC45LmF5pyJ5pWIXFxcIjtcXG5cXG4gICAgICAgICAgICBpZiAoc2hhcmVJbmZvLmV4cGlyYXRpb24pIHtcXG4gICAgICAgICAgICAgICAgZGVhZGxpbmUgPSBcXFwi5pyJ5pWI6Iez77yaXFxcIiArIGZvcm1hdERhdGUoc2hhcmVJbmZvLmV4cGlyYXRpb24pO1xcbiAgICAgICAgICAgICAgICAvL3NoYXJlSW5mby51cGRhdGVkX2F0XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogKHNoYXJlSW5mby5jcmVhdG9yX25hbWUgfHwgc2hhcmVJbmZvLmNyZWF0b3JfcGhvbmUpICsgXFxcIiZuYnNwOyZuYnNwO1xcXCIgKyBkZWFkbGluZS5zbWFsbCgpLFxcbiAgICAgICAgICAgICAgICB1cmw6IHJlYWx1cmwgKyBcXFwiI25vSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgICAgICAgICBpbWc6IHNoYXJlSW5mby5hdmF0YXJ8fFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX3Vua25vd25cXFwiLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICghaXNTZWFyY2gpIHtcXG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLmkJzntKJcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC50cmltKCk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gXFxcInRvYXN0Oi8v6K+36L6T5YWl5YWz6ZSu6K+NXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2FsaXl1biNub0hpc3RvcnkjI2Z1bGxUaGVtZSM/cGFnZT1meXBhZ2Umc2VhcmNoS2V5PVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogc2hhcmVQd2QsXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZUlkOiBzaGFyZUlkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVUb2tlbjogc2hhcmVUb2tlblxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnFxcXCIgKyBzZWFyY2hLZXkgKyBcXFwi4oCd4oCd55qE5pCc57Si57uT5p6cXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGZ1blN0eWxlID0gaXNTZWFyY2ggPyBcXFwiaWNvbl9zbWFsbF8zXFxcIiA6IFxcXCJpY29uX3JvdW5kX3NtYWxsXzRcXFwiO1xcbiAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IHN0eWxlLFxcbiAgICAgICAgICAgIHVybDogJChzdHlsZXMsIDEsIFxcXCLmjpLluIPmoLflvI9cXFwiKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJhbGl5dW5fc3R5bGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LliIfmjaJcXFwiO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBmdW5TdHlsZSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9hbGlfaWNvbi5zdmdcXFwiXFxuICAgICAgICB9LCB7XFxuICAgICAgICAgICAgdGl0bGU6IG9yZGVyTmFtZSxcXG4gICAgICAgICAgICB1cmw6ICQob3JkZXJzS2V5cywgMiwgXFxcIuaOkuW6j+aWueW8j1xcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcImFsaXl1bl9vcmRlclxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIh+aNouaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgY29sX3R5cGU6IGZ1blN0eWxlLFxcbiAgICAgICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2FsaV9zb3J0LnN2Z1xcXCJcXG4gICAgICAgIH0sIHtcXG4gICAgICAgICAgICB0aXRsZTogZ2V0SXRlbShcXFwiYWxpeXVuX3BsYXlNb2RlXFxcIiwgXFxcIui9rOeggVxcXCIpLFxcbiAgICAgICAgICAgIHVybDogJChbXFxcIui9rOeggVxcXCIsIFxcXCLljp/nlLtcXFwiXSwgMiwgXFxcIuaSreaUvuaooeW8j1xcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcImFsaXl1bl9wbGF5TW9kZVxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIh+aNouaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgY29sX3R5cGU6IGZ1blN0eWxlLFxcbiAgICAgICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2FsaV9wbGF5LnN2Z1xcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgaWYgKCFpc1NlYXJjaCkge1xcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWKn+iDvVxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogJChbXFxcIui9rOWtmOS6keebmFxcXCIsIFxcXCLnmbvpmYbotKblj7dcXFwiLCBcXFwi5aSN5Yi25YiG5Lqr6ZO+5o6lXFxcIiwgXFxcIuafpeeci+aJi+WKqOaMgui9veWtl+W5lVxcXCIsIFxcXCLojrflj5blvLnluZXmkJzntKLop4TliJlcXFwiLCBcXFwi5om56YeP5oyC6L295pys5Zyw5by55bmVXFxcIiwgXFxcIuaOqOmAgeWIsFRWQm94XFxcIiwgXFxcIuiuvue9ruaUtuiXj+WwgemdolxcXCJdLCAyLCBcXFwi5pu05aSa5Yqf6IO9XFxcIikuc2VsZWN0KChzaGFyZUlkLCBzaGFyZVB3ZCwgZmlsZUlkKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGlucHV0KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwi6L2s5a2Y5LqR55uYXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBzbWFydGRyaXZlOi8vc2hhcmUvYnJvd3NlP3NoYXJlSWQ9JHtzaGFyZUlkfSZzaGFyZVB3ZD0ke3NoYXJlUHdkfHxcXFwiXFxcIn1gO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIueZu+mZhui0puWPt1xcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwi5aSN5Yi25YiG5Lqr6ZO+5o6lXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoW1xcXCLlpI3liLbpk77mjqVcXFwiLCBcXFwi5aSN5Yi25rW36ZiU5Y+j5LukXFxcIl0sIDEsIFxcXCLliIbkuqvmlrnlvI9cXFwiKS5zZWxlY3QoKHVybCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi5aSN5Yi26ZO+5o6lXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyB1cmw7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL+mYv+mHjOS6keebmOWIhuS6q+WPo+S7pOOAjFxcXCIgKyBnZXRQYWdlVGl0bGUoKSArIFxcXCLjgI1cXFxcblxcXCIgKyB1cmwgKyBcXFwiIEBpbXBvcnQ9anM6YGhpa2VyOi8vcGFnZS9hbGl5dW4/cmVhbHVybD0ke2lucHV0LnRyaW0oKX0mcnVsZT3kupHnm5jlkJsu566AYDtcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvXFxcIiArIHNoYXJlSWQgKyAoZmlsZUlkID8gXFxcIi9mb2xkZXIvXFxcIiArIGZpbGVJZCA6IFxcXCJcXFwiKSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwi5om56YeP5oyC6L295pys5Zyw5by55bmVXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvZG1Nb3VudCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIuafpeeci+aJi+WKqOaMgui9veWtl+W5lVxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6bSA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJtb3VudHppbXVcXFwiLCB7fSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXAgPSB6bS5uYW1lID8gXFxcIuW9k+WJjeWtl+W5leaWh+S7tlxcXFxuXFxcIiArIHptLm5hbWUgKyBcXFwiLlxcXCIgKyB6bS5leHQgOiBcXFwi6L+Y5pyq5omL5Yqo5oyC6L295a2X5bmVXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+aJi+WKqOaMgui9veWtl+W5lScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB0aXAgKyBcXFwiXFxcXG4o54K55Ye75Y+W5raI5Y+v5Lul5riF6Zmk5oyC6L295a2X5bmVKVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWw6ICgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJtb3VudHppbXVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5riF6Zmk5omL5Yqo5oyC6L295a2X5bmVXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCLojrflj5blvLnluZXmkJzntKLop4TliJlcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJqc1xcXCI6IEpTT04uc3RyaW5naWZ5KFxcXCJoaWtlcjovL3BhZ2UvbG9hZERtP3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiJnRpdGxlPVxcXCIpICsgXFxcIitlbmNvZGVVUklDb21wb25lbnQocGxheWRhdGEudGl0bGUuc3BsaXQoJy0nKVswXSk7XFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogTVlfUlVMRS50aXRsZSArIFxcXCLlvLnluZXmkJzntKJcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwicnVsZTovL1xcXCIgKyBiYXNlNjRFbmNvZGUoXFxcIu+/pXByb2plY3Rpb25fc2NyZWVu77+lXFxcIiArIEpTT04uc3RyaW5naWZ5KHJ1bGUpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCLmjqjpgIHliLBUVkJveFxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3R2Ym94UHVzaCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIuiuvue9ruaUtuiXj+WwgemdolxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFtcXFwi6K6+572u5bCB6Z2i5Zyw5Z2AXFxcIiwgXFxcIuaQnOe0ouWwgemdolxcXCJdLCAxKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi6K6+572u5bCB6Z2i5Zyw5Z2AXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCJcXFwiLCBcXFwi6K+36L6T5YWl5Zu+54mH5Zyw5Z2AXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0LnRyaW0oKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+i+k+WFpeWcsOWdgFxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhZ2VQaWNVcmwoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvZnJvbnRDb3ZlciNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSwgc2hhcmVJZCwgc2hhcmVQd2QsIGZpbGVJZCksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl9yb3VuZF9zbWFsbF80XFxcIixcXG4gICAgICAgICAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvYWxpX2ZpbGVpbnRvLnN2Z1xcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBwYWdlSWQ6IHBhZ2VJZCxcXG4gICAgICAgICAgICAgICAgICAgIGZpbGVJZDogZmlsZUlkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVJZDogc2hhcmVJZCxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlVG9rZW46IHNoYXJlVG9rZW4sXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogc2hhcmVQd2QsXFxuICAgICAgICAgICAgICAgICAgICBmb2xkZXJOYW1lOiBnZXRQYWdlVGl0bGUoKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBsZXQgcmVzY29kID0ge307XFxuICAgIGxldCBtYXJrZXIgPSBNWV9QQVJBTVMubWFya2VyO1xcbiAgICBpZiAoaXNTZWFyY2gpIHtcXG4gICAgICAgIHJlc2NvZCA9IGFsaVNoYXJlQXBpLmdldFNlYXJjaExpc3RGaWxlKHNlYXJjaEtleSwgbWFya2VyLCBvcmRlclswXSwgb3JkZXJbMV0pO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmVzY29kID0gYWxpU2hhcmVBcGkuZ2V0TGlzdEZpbGUoZmlsZUlkLCBtYXJrZXIsIG9yZGVyWzBdLCBvcmRlclsxXSk7XFxuICAgIH1cXG4gICAgaWYgKHJlc2NvZC5uZXh0X21hcmtlcikge1xcbiAgICAgICAgc2V0TWFya2VyKHJlc2NvZC5uZXh0X21hcmtlcik7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBzZXRNYXJrZXIoKTtcXG4gICAgfVxcblxcbiAgICB2YXIgY29udHMgPSByZXNjb2QuaXRlbXM7XFxuICAgIC8v5a2X5bmV5Yy56YWN5YeG5aSHXFxuICAgIGxldCBzdWJFeHRzID0gW1xcXCJ2dHRcXFwiLCBcXFwic3J0XFxcIiwgXFxcImFzc1xcXCJdO1xcbiAgICB2YXIgemltdWxpc3QgPSBbXTtcXG4gICAgY29udHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgaWYgKHN1YkV4dHMuaW5jbHVkZXMoaXRlbS5maWxlX2V4dGVuc2lvbiAmJiBpdGVtLmZpbGVfZXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCkpKSB7XFxuICAgICAgICAgICAgbGV0IG5hbWUgPSBpdGVtLm5hbWUucmVwbGFjZSgnLicgKyBpdGVtLmZpbGVfZXh0ZW5zaW9uLCAnJyk7XFxuICAgICAgICAgICAgemltdWxpc3QucHVzaCh7XFxuICAgICAgICAgICAgICAgIGV4dDogaXRlbS5maWxlX2V4dGVuc2lvbixcXG4gICAgICAgICAgICAgICAgZmlsZV9pZDogaXRlbS5maWxlX2lkLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBuYW1lXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICAvL+WkhOeQhuWkuOmhteWMuemFjeWtl+W5lVxcbiAgICAvKlxcbiAgICBsZXQgaGFzU3ViID0gemltdWxpc3QubGVuZ3RoID4gMDtcXG4gICAgaWYgKGhhc1N1YiYmcmVzY29kLm5leHRfbWFya2VyKSB7XFxuICAgICAgICBpZiAoemltdWxpc3QubGVuZ3RoID4gNCkge1xcbiAgICAgICAgICAgIHNldFN1YnRpdGxlQ2FjaGUoemltdWxpc3Quc2xpY2UoLTQpKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgc2V0U3VidGl0bGVDYWNoZSh6aW11bGlzdCk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgbGV0IGxhc3RJdGVtID0gY29udHMuYXQoLTEpO1xcbiAgICBpZiAoaGFzU3ViJiZsYXN0SXRlbSYmbGFzdEl0ZW0uY2F0ZWdvcnkgPT09IFxcXCJ2aWRlb1xcXCIpIHtcXG4gICAgICAgIHNldFZpZGVvSXRlbUNhY2hlKGNvbnRzLnNwbGljZShjb250cy5sZW5ndGgtMSwxKSk7XFxuICAgIH1cXG4gICAgaWYgKE1ZX1BBR0UgPiAxKSB7XFxuICAgICAgICBsZXQgc3VidGl0bGVDYWNoZSA9IE1ZX1BBUkFNUy5zdWJ0aXRsZUNhY2hlIHx8IFtdO1xcbiAgICAgICAgemltdWxpc3QgPSB6aW11bGlzdC5jb25jYXQoc3VidGl0bGVDYWNoZSk7XFxuICAgICAgICBsZXQgdmlkZW9JdGVtQ2FjaGUgPSBNWV9QQVJBTVMudmlkZW9JdGVtQ2FjaGUgfHwgW107XFxuICAgICAgICBjb250cyA9IHZpZGVvSXRlbUNhY2hlLmNvbmNhdChjb250cyk7XFxuICAgICAgICBzZXRTdWJ0aXRsZUNhY2hlKCk7XFxuICAgICAgICBzZXRWaWRlb0l0ZW1DYWNoZSgpO1xcbiAgICB9Ki9cXG4gICAgLy/nroDkvZPkvJjlhYhcXG4gICAgemltdWxpc3Quc29ydCgoYSwgYikgPT4gKGIubmFtZS5lbmRzV2l0aChcXFwiLnNjXFxcIikgfHwgYi5uYW1lLmVuZHNXaXRoKFxcXCIuY2hzXFxcIikpIC0gKGEubmFtZS5lbmRzV2l0aChcXFwiLnNjXFxcIikgfHwgYS5uYW1lLmVuZHNXaXRoKFxcXCIuY2hzXFxcIikpKTtcXG4gICAgLy9lbmRcXG4gICAgbGV0IHRpdGxlSGVhZCA9IHtcXG4gICAgICAgIHZpZGVvOiBcXFwi8J+OrFxcXCIsXFxuICAgICAgICBhdWRpbzogXFxcIvCfjrVcXFwiLFxcbiAgICAgICAgZG9jOiBcXFwi8J+TkVxcXCIsXFxuICAgICAgICBpbWFnZTogXFxcIvCflrxcXFwiLFxcbiAgICAgICAgemlwOiBcXFwi8J+TplxcXCIsXFxuICAgICAgICBmb2xkZXI6IFxcXCLwn5OCXFxcIlxcbiAgICB9O1xcblxcbiAgICBmdW5jdGlvbiBnZXRIZWFkKHR5cGUsIGV4dCkge1xcbiAgICAgICAgbGV0IGhlYWQgPSB0aXRsZUhlYWRbdHlwZV07XFxuICAgICAgICBpZiAoc3ViRXh0cy5pbmNsdWRlcyhleHQpKSB7XFxuICAgICAgICAgICAgaGVhZCA9IFxcXCLwn5W4XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBoZWFkIHx8IFxcXCLinZNcXFwiO1xcbiAgICB9XFxuICAgIGxldCBmb2xkZXJTdHlsZSwgZmlsZVN0eWxlLCBpc1dhdGNoaW5nID0gc3R5bGUgPT09IFxcXCLov73liadcXFwiO1xcbiAgICBpZiAoaXNXYXRjaGluZykge1xcbiAgICAgICAgZm9sZGVyU3R5bGUgPSBcXFwiYXZhdGFyXFxcIjtcXG4gICAgICAgIGZpbGVTdHlsZSA9IFxcXCJtb3ZpZV8yXFxcIjtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGZvbGRlclN0eWxlID0gZmlsZVN0eWxlID0gc3R5bGU7XFxuICAgIH1cXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250cy5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgbGV0IGZpbGVJdGVtID0gY29udHNbaV07XFxuICAgICAgICBsZXQgY2F0ZSA9IGZpbGVJdGVtLmNhdGVnb3J5O1xcbiAgICAgICAgbGV0IGRlc2MgPSBmb3JtYXREYXRlKGZpbGVJdGVtLnVwZGF0ZWRfYXQpO1xcbiAgICAgICAgbGV0IHBpY191cmwgPSBnZXRJY29uKGZpbGVJdGVtLmZpbGVfZXh0ZW5zaW9uLCBmaWxlSXRlbS50eXBlKTtcXG5cXG4gICAgICAgIGlmIChmaWxlSXRlbS50eXBlID09PSBcXFwiZm9sZGVyXFxcIikge1xcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IChmb2xkZXJTdHlsZSA9PT0gXFxcInRleHRfMVxcXCIgPyB0aXRsZUhlYWQuZm9sZGVyIDogXFxcIlxcXCIpICsgZmlsZUl0ZW0ubmFtZTtcXG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICB1cmw6ICdoaWtlcjovL3BhZ2UvYWxpeXVuP3BhZ2U9ZnlwYWdlJyxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IGZvbGRlclN0eWxlLFxcbiAgICAgICAgICAgICAgICBkZXNjOiBmb3JtYXREYXRlKGZpbGVJdGVtLnVwZGF0ZWRfYXQpLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBwaWNfdXJsLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVJZDogc2hhcmVJZCxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlVG9rZW46IE1ZX1BBUkFNUy5zaGFyZVRva2VuLFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBmaWxlSXRlbS5maWxlX2lkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkLFxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBmaWxlSXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgbm9QaWM6IHRydWVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsZXQgc3VidGl0bGUsIGxvbmdjLCBjbHM7XFxuICAgICAgICAgICAgbGV0IHRpdGxlID0gKGZpbGVTdHlsZSA9PT0gXFxcInRleHRfMVxcXCIgPyBnZXRIZWFkKGNhdGUsIGZpbGVJdGVtLmZpbGVfZXh0ZW5zaW9uKSA6IFxcXCJcXFwiKSArIGZpbGVJdGVtLm5hbWU7XFxuICAgICAgICAgICAgbGV0IG5hbWVOb3RFeHQgPSBmaWxlSXRlbS5uYW1lLnJlcGxhY2UoJy4nICsgZmlsZUl0ZW0uZmlsZV9leHRlbnNpb24sICcnKTtcXG4gICAgICAgICAgICBpZiAoc3ViRXh0cy5pbmNsdWRlcyhmaWxlSXRlbS5maWxlX2V4dGVuc2lvbikpIHtcXG4gICAgICAgICAgICAgICAgbG9uZ2MgPSBbe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLmjILovb3lrZfluZVcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHptKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoJ21vdW50emltdScsIHptKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5oyC6L295a6M5oiQ77yM5b2T5YmN5a2X5bmV5paH5Lu2OiAnICsgem0ubmFtZSArICcuJyArIHptLmV4dDtcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBleHQ6IGZpbGVJdGVtLmZpbGVfZXh0ZW5zaW9uLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfaWQ6IGZpbGVJdGVtLmZpbGVfaWQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZU5vdEV4dFxcbiAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgIH1dO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoY2F0ZSA9PT0gXFxcInZpZGVvXFxcIikge1xcbiAgICAgICAgICAgICAgICBpZiAoemltdWxpc3QubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHppbXVsaXN0LmZpbmQodiA9PiB2Lm5hbWUuaW5jbHVkZXMobmFtZU5vdEV4dCkpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGNscyA9IFxcXCJwbGF5bGlzdCB2XFxcIiArIHBhZ2VJZDtcXG4gICAgICAgICAgICAgICAgcGljX3VybCA9IGZpbGVJdGVtLnRodW1ibmFpbCB8fCBwaWNfdXJsO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNXYXRjaGluZykge1xcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgaWYgKGZpbGVTdHlsZSA9PT0gXFxcInRleHRfMVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgZGVzYyArPSBcXFwiXFxcXHRcXFxcdFxcXCIgKyBmb3JtYXRTaXplKGZpbGVJdGVtLnNpemUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub1ByZSNcXFwiKS5sYXp5UnVsZSgoc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIGZpbGVJZCwgY2F0ZSwgc3VidGl0bGUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9hbGlsYXp5XFxcIikoc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIGZpbGVJZCwgY2F0ZSwgc3VidGl0bGUpO1xcbiAgICAgICAgICAgICAgICB9LCBzaGFyZUlkLCBzaGFyZVB3ZCwgTVlfUEFSQU1TLnNoYXJlVG9rZW4sIGZpbGVJdGVtLmZpbGVfaWQsIGNhdGUsIHN1YnRpdGxlKSxcXG4gICAgICAgICAgICAgICAgZGVzYzogZGVzYyxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogcGljX3VybCxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBmaWxlSXRlbS5maWxlX2lkLFxcbiAgICAgICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBsb25nYyxcXG4gICAgICAgICAgICAgICAgICAgIGNsczogY2xzLFxcbiAgICAgICAgICAgICAgICAgICAgLy9pbmhlcml0VGl0bGU6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBmaWxlSXRlbS5uYW1lXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBmaWxlU3R5bGVcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBpZiAoY29udHMubGVuZ3RoID09PSAwKSB7XFxuICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCJ+fn7ku4DkuYjpg73msqHmnInkuoblk6Z+fn5cXFwiLmZvbnRjb2xvcihcXFwiR3JheVxcXCIpLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5cXG5sZXQgaXRlbXMgPSBbXTtcXG50cnkge1xcbiAgICBpZiAoTVlfUEFHRSA+IDEgJiYgIU1ZX1BBUkFNUy5tYXJrZXIpIHtcXG4gICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIn5+fuS7gOS5iOmDveayoeacieS6huWTpn5+flxcXCIuZm9udGNvbG9yKFxcXCJHcmF5XFxcIiksXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgbG9hZChpdGVtcyk7XFxuICAgIH1cXG59IGNhdGNoIChlKSB7XFxuICAgIGlmIChlLm5hbWUgPT09IFxcXCJBbGlFcnJvclxcXCIpIHtcXG4gICAgICAgIGlmIChlLmNvZGUgPT09IFxcXCJJbnZhbGlkUmVzb3VyY2UuU2hhcmVQd2RcXFwiKSB7XFxuICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi6K+36L6T5YWl5o+Q5Y+W56CBXFxcIixcXG4gICAgICAgICAgICAgICAgZGVzYzogc2hhcmVQd2QgPyBcXFwi4oCc4oCc5o+Q5Y+W56CB6ZSZ6K+v4oCd4oCdXFxcIiA6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoKS5pbnB1dCgoTVlfUEFSQU1TKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBzZXRQYWdlUGFyYW1zKE9iamVjdC5hc3NpZ24oe30sIE1ZX1BBUkFNUywge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkOiBpbnB1dFxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgfSwgTVlfUEFSQU1TKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBpZiAoZS5zaWduaWZpY2FuY2UgPT09IDEpIHtcXG4gICAgICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBlLm1lc3NhZ2UuYmlnKCkuYmlnKCkuZm9udGNvbG9yKFxcXCJyZWRcXFwiKSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChlLnNpZ25pZmljYW5jZSA9PT0gMykge1xcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIGUubWVzc2FnZS5iaWcoKS5mb250Y29sb3IoXFxcImdyZWVuXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcblxcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgbG9nKFxcXCLliJfooajliqDovb3lpLHotKUjXFxcXG7plJnor6/kv6Hmga8+XFxcIiArIGUudG9TdHJpbmcoKSArIFxcXCJcXFxcbumUmeivr+ihjD5cXFwiICsgZS5saW5lTnVtYmVyKTtcXG4gICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn5qyn5qyn77yM5oql6ZSZ5LqG44CC5Zyo5Yi35paw5Yeg5qyh77yf5oiW6ICF5pu05o2i5paH5Lu25aS544CCJyxcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBkZXNjOiBlLnRvU3RyaW5nKCksXFxuICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbiAgICAgICAgfSk7XFxuICAgICAgICAvL3Rocm93IGU7XFxuICAgIH1cXG59XFxuc2F2ZU15UGFDYWNoZSgpO1xcbnNldFJlc3VsdChpdGVtcyk7XCIsXCJncm91cFwiOlwi8J+TuuW9seinhlwiLFwidWFcIjpcIm1vYmlsZVwiLFwicHJlUnVsZVwiOlwiXCIsXCJwYWdlc1wiOlwiW3tcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuinhOWImeWkhOeQhlxcXCIsXFxcInBhdGhcXFwiOlxcXCJkYXRhXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuZnVuY3Rpb24gZG91YmxlVHJlYXRpbmcob3Blbk1vZGUsIGZpbmRBbGlVcmwsIHRpdGxlKSB7XFxcXG4gICAgbGV0IGFsaVVybCA9IGlucHV0O1xcXFxuICAgIGxldCBzaGFyZVB3ZDtcXFxcbiAgICBpZiAoZmluZEFsaVVybCkge1xcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gZmluZEFsaVVybChhbGlVcmwpO1xcXFxuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXFxcXFxcXCJzdHJpbmdcXFxcXFxcIilcXFxcbiAgICAgICAgICAgIGFsaVVybCA9IHJlc3VsdDtcXFxcbiAgICAgICAgZWxzZVxcXFxuICAgICAgICAgICAgYWxpVXJsID0gcmVzdWx0LmFsaVVybCwgc2hhcmVQd2QgPSByZXN1bHQuc2hhcmVQd2Q7XFxcXG4gICAgfVxcXFxuICAgIGlmIChhbGlVcmwuaW5jbHVkZXMoXFxcXFxcXCJ3d3cuYWxpeXVuZHJpdmUuY29tL3MvXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgIGlmIChvcGVuTW9kZSA9PT0gXFxcXFxcXCLmnKzlnLDovaznoIFcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL3BhZ2UvYWxpeXVuP3BhZ2U9ZnlwYWdlJnJ1bGU9JyArIHRpdGxlICsgJyZyZWFsdXJsPScgKyBlbmNvZGVVUklDb21wb25lbnQoYWxpVXJsKSArIFxcXFxcXFwiJnNoYXJlUHdkPVxcXFxcXFwiICsgKHNoYXJlUHdkIHx8IFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgc2hhcmVJZCA9IGFsaVVybC5zcGxpdChcXFxcXFxcIi9cXFxcXFxcIilbNF07XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3NtYXJ0ZHJpdmU6Ly9zaGFyZS9icm93c2U/c2hhcmVJZD0nICsgc2hhcmVJZCArICcmc2hhcmVQd2Q9JyArIChzaGFyZVB3ZCB8fCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0gZWxzZSBpZiAoYWxpVXJsLnN0YXJ0c1dpdGgoXFxcXFxcXCJodHRwXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcIndlYjovL1xcXFxcXFwiICsgYWxpVXJsO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIHJldHVybiBhbGlVcmw7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXRNb2RlVXJsKGFsaVVybCwgc2hhcmVQd2QsIG9wZW5Nb2RlKSB7XFxcXG4gICAgaWYgKGFsaVVybC5pbmNsdWRlcyhcXFxcXFxcInd3dy5hbGl5dW5kcml2ZS5jb20vcy9cXFxcXFxcIikpIHtcXFxcbiAgICAgICAgaWYgKG9wZW5Nb2RlID09PSBcXFxcXFxcIuacrOWcsOi9rOeggVxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vcGFnZS9hbGl5dW4/cGFnZT1meXBhZ2UmcnVsZT0nICsgTVlfUlVMRS50aXRsZSArICcmcmVhbHVybD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFsaVVybCkgKyBcXFxcXFxcIiZzaGFyZVB3ZD1cXFxcXFxcIiArIChzaGFyZVB3ZCB8fCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHNoYXJlSWQgPSBhbGlVcmwuc3BsaXQoXFxcXFxcXCIvXFxcXFxcXCIpWzRdO1xcXFxuICAgICAgICAgICAgcmV0dXJuICdzbWFydGRyaXZlOi8vc2hhcmUvYnJvd3NlP3NoYXJlSWQ9JyArIHNoYXJlSWQgKyAnJnNoYXJlUHdkPScgKyAoc2hhcmVQd2QgfHwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9IGVsc2UgaWYgKGFsaVVybC5zdGFydHNXaXRoKFxcXFxcXFwiaHR0cFxcXFxcXFwiKSkge1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ3ZWI6Ly9cXFxcXFxcIiArIGFsaVVybDtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICByZXR1cm4gYWxpVXJsO1xcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxuJC5leHBvcnRzLmNhcnJ5UnVsZSA9IGZ1bmN0aW9uKHJ1bGUsIHMsIHBhZ2UsIHNlYXJjaE1vZGUsIG9wZW5Nb2RlKSB7XFxcXG4gICAgbGV0IGxpc3QgPSBydWxlLmZpbmQocywgcGFnZSk7XFxcXG4gICAgaWYgKCFsaXN0KSByZXR1cm4gW107XFxcXG4gICAgbGV0IHVybExhenkgPSAkKFxcXFxcXFwiXFxcXFxcXCIpLmxhenlSdWxlKGRvdWJsZVRyZWF0aW5nLCBvcGVuTW9kZSwgcnVsZS5maW5kQWxpVXJsLCBNWV9SVUxFLnRpdGxlKTtcXFxcbiAgICBsZXQgZGVzY1RpcHMgPSBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgcnVsZS5uYW1lLmZvbnRjb2xvcihcXFxcXFxcIiNmMTNiNjZhXFxcXFxcXCIpICsgXFxcXFxcXCImbmJzcDtcXFxcXFxcIjtcXFxcbiAgICBsZXQgcmVzTGlzdCA9IFtdO1xcXFxuXFxcXG4gICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xcXFxuICAgICAgICBpZiAoaXQuc2tpcCkge1xcXFxuICAgICAgICAgICAgcmVzTGlzdC5wdXNoKGl0KTtcXFxcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmIChzZWFyY2hNb2RlICYmICFzZWFyY2hDb250YWlucyhpdC50aXRsZSwgcywgdHJ1ZSkpIGNvbnRpbnVlO1xcXFxuICAgICAgICBpdC51cmwgPSBydWxlLmZpbmRBbGlVcmwgPyBpdC51cmwgKyB1cmxMYXp5IDogZ2V0TW9kZVVybChpdC51cmwsIGl0LnNoYXJlUHdkIHx8IFxcXFxcXFwiXFxcXFxcXCIsIG9wZW5Nb2RlKTtcXFxcbiAgICAgICAgcmVzTGlzdC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBpdC50aXRsZS5pbmNsdWRlcyhcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiKSA/IGl0LnRpdGxlIDogXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIGl0LnRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cChcXFxcXFxcIjxlbT58PC9lbT5cXFxcXFxcIiwgXFxcXFxcXCJnXFxcXFxcXCIpLCBcXFxcXFxcIlxcXFxcXFwiKS5yZXBsYWNlKG5ldyBSZWdFeHAocywgXFxcXFxcXCJnXFxcXFxcXCIpLCBcXFxcXFxcIjxzdHJvbmc+PHNwYW4gc3R5bGU9XFxcXFxcXFxcXFxcXFxcImNvbG9yOiAjMUU5MEZGXFxcXFxcXFxcXFxcXFxcIj5cXFxcXFxcIiArIHMgKyBcXFxcXFxcIjwvc3Bhbj48L3N0cm9uZz5cXFxcXFxcIiksXFxcXG4gICAgICAgICAgICBkZXNjOiBkZXNjVGlwcyArIChpdC5kZXNjfHxcXFxcXFxcIlxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgIHVybDogaXQudXJsLFxcXFxuICAgICAgICAgICAgcGljX3VybDogaXQucGljX3VybCxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBpdC5waWNfdXJsID8gJ21vdmllXzFfdmVydGljYWxfcGljJyA6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih7XFxcXG4gICAgICAgICAgICAgICAgaW5oZXJpdFRpdGxlOiBmYWxzZSxcXFxcbiAgICAgICAgICAgICAgICBub1BpYzogdHJ1ZVxcXFxuICAgICAgICAgICAgfSwgaXQuZXh0cmEpXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gcmVzTGlzdDtcXFxcbn1cXFxcbmxldCBzaXplID0gMTA7XFxcXG5cXFxcbmxldCBydWxlcyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9ydWxlc1xcXFxcXFwiKTtcXFxcbmxldCBmb3JiaWRkZW4gPSBzdG9yYWdlMC5nZXRJdGVtKFxcXFxcXFwiZm9yYmlkZGVuXFxcXFxcXCIsIFtdKTtcXFxcbnJ1bGVzPXJ1bGVzLmZpbHRlcih2ID0+ICFmb3JiaWRkZW4uaW5jbHVkZXModi5uYW1lKSk7XFxcXG5cXFxcbiQuZXhwb3J0cy5nZXREYXRhID0gZnVuY3Rpb24ocGFnZSwgcnVsZSkge1xcXFxuICAgIGlmICghcGFnZSAmJiAhcnVsZSkge1xcXFxuICAgICAgICByZXR1cm4gcnVsZXMubWFwKGl0ID0+IGl0Lm5hbWUpO1xcXFxuICAgIH1cXFxcbiAgICBpZiAocnVsZSAhPSBudWxsKSB7XFxcXG4gICAgICAgIGlmIChwYWdlICE9IG51bGwgJiYgcGFnZSA+IDEpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBydWxlcy5maWx0ZXIoaSA9PiBpLm5hbWUgPT0gcnVsZSAmJiBpLnBhZ2UpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBydWxlcy5maWx0ZXIoaSA9PiBpLm5hbWUgPT0gcnVsZSk7XFxcXG4gICAgfVxcXFxuICAgIGxldCBzdGFydCA9IChwYWdlIC0gMSkgKiBzaXplO1xcXFxuICAgIGlmIChydWxlcy5sZW5ndGggPCBzdGFydCArIDEpIHtcXFxcbiAgICAgICAgcmV0dXJuIFtdO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgbGVuID0gc2l6ZTtcXFxcbiAgICBpZiAocnVsZXMubGVuZ3RoIDwgcGFnZSAqIHNpemUpIHtcXFxcbiAgICAgICAgbGVuID0gcnVsZXMubGVuZ3RoIC0gc3RhcnRcXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIHJ1bGVzLnNsaWNlKHN0YXJ0LCBzdGFydCArIGxlbik7XFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5pCc57Si6aG16Z2iXFxcIixcXFwicGF0aFxcXCI6XFxcInNvdVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmZ1bmN0aW9uIHNldENsaXAoKSB7XFxcXG4gICAgZnVuY3Rpb24gZ2V0Q29weSgpIHtcXFxcbiAgICAgICAgY29uc3QgQ29udGV4dCA9IGFuZHJvaWQuY29udGVudC5Db250ZXh0O1xcXFxuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29tLmV4YW1wbGUuaGlrZXJ2aWV3LnVpLkFwcGxpY2F0aW9uKCkuZ2V0Q29udGV4dCgpO1xcXFxuICAgICAgICAvLyDojrflj5bns7vnu5/liarotLTmnb9cXFxcbiAgICAgICAgbGV0IGNsaXBib2FyZCA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNMSVBCT0FSRF9TRVJWSUNFKTtcXFxcbiAgICAgICAgLy8g6L+U5Zue5pWw5o2uXFxcXG4gICAgICAgIGxldCBjbGlwRGF0YSA9IGNsaXBib2FyZC5nZXRQcmltYXJ5Q2xpcCgpO1xcXFxuICAgICAgICBpZiAoY2xpcERhdGEgIT0gbnVsbCAmJiBjbGlwRGF0YS5nZXRJdGVtQ291bnQoKSA+IDApIHtcXFxcbiAgICAgICAgICAgIC8vIOS7juaVsOaNrumbhuS4reiOt+WPlu+8iOeymOi0tO+8ieesrOS4gOadoeaWh+acrOaVsOaNrlxcXFxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhjbGlwRGF0YS5nZXRJdGVtQXQoMCkuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBudWxsO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgdGV4dCA9IGdldENvcHkoKSB8fCBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIGxldCB1cmwgPSB0ZXh0Lm1hdGNoKC9odHRwLio/d3d3LmFsaXl1bmRyaXZlLmNvbVxcXFxcXFxcL3NcXFxcXFxcXC9bYS16QS1aMC05XXsxMX0oXFxcXFxcXFwvZm9sZGVyXFxcXFxcXFwvW2EtejAtOV17NDB9KT8vKTtcXFxcbiAgICB1cmwgPSBBcnJheS5pc0FycmF5KHVybCkgJiYgdXJsWzBdO1xcXFxuICAgIGlmICh1cmwpIHtcXFxcbiAgICAgICAgbGV0IGNhY2hlID0gZ2V0SXRlbShcXFxcXFxcImNsaXBib2FyZENhY2hlXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAodXJsICE9PSBjYWNoZSkge1xcXFxuICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxmb250IGNvbG9yPVxcXFxcXFwiIzEzQjYxQlxcXFxcXFwiPuKWkCA8L2ZvbnQ+PGI+5rip6aao5o+Q56S6PGI+JyxcXFxcbiAgICAgICAgICAgICAgICBkZXNjOiBcXFxcXFxcIuajgOa1i+WIsOWJqui0tOadv+WQq+aciemYv+mHjOmTvuaOpeaYr+WQpuaJk+W8gD9cXFxcXFxcXG5cXFxcXFxcIiArIHVybCxcXFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoaW5wdXQsIGlkKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW0oaWQgKyBcXFxcXFxcImNsaXBib2FyZFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2FsaXl1bj9wYWdlVGl0bGU95omT5byA6ZO+5o6lJnBhZ2U9ZnlwYWdlJnJlYWx1cmw9XFxcXFxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoaW5wdXQpO1xcXFxuICAgICAgICAgICAgICAgIH0sIHVybCwgaWQpLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBpZCArIFxcXFxcXFwiY2xpcGJvYXJkXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJjbGlwYm9hcmRDYWNoZVxcXFxcXFwiLCB1cmwpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBzZXRIZWFkKCkge1xcXFxuICAgIGlmIChvcGVuTW9kZSA9PSBcXFxcXFxcIuacrOWcsOi9rOeggVxcXFxcXFwiKSB7XFxcXG4gICAgICAgIGxldCBhbGlUb2tlbnNGaWxlcGF0aCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS90b2tlblBhdGhcXFxcXFxcIikuYWxpVG9rZW5zRmlsZXBhdGg7XFxcXG4gICAgICAgIGxldCBhID0gZmV0Y2goYWxpVG9rZW5zRmlsZXBhdGgpO1xcXFxuICAgICAgICBpZiAoIWEgfHwgYSA9PSBcXFxcXFxcIlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnPGZvbnQgY29sb3I9XFxcXFxcXCIjMTNCNjFCXFxcXFxcXCI+4paQIDwvZm9udD48Yj7muKnppqjmj5DnpLo8Yj4nLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvbG9naW4jbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5pyq5qOA5rWL5Yiw55m75b2V5L+h5oGv77yM54K55oiR6Lez6L2s55m75b2V6LSm5Y+36aG16Z2i77yM55m75b2V6Zi/6YeM5LqR55uY6LSm5Y+35ZCO5pa55Y+v5L2/55So5pys5Zyw6L2s56CB5qih5byPXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBcXFxcXFxcIueZu+W9lemYv+mHjOS6keebmFxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgICAgICBjbGVhck15VmFyKFxcXFxcXFwic1xcXFxcXFwiKTtcXFxcbiAgICB9KSk7XFxcXG4gICAgYWRkTGlzdGVuZXIoXFxcXFxcXCJvblJlZnJlc2hcXFxcXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgIGlmICghZ2V0TXlWYXIoXFxcXFxcXCJyZWZzXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXFxcXFwic1xcXFxcXFwiKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pKTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLmkJzntKLvvJpcXFxcXFxcIiArIFtcXFxcXFxcIum7mOiupFxcXFxcXFwiLCBcXFxcXFxcIueyvuWHhlxcXFxcXFwiXVtzZWFyY2hNb2RlXSxcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICAgICAgc2V0U2VhcmNoTW9kZShnZXRTZWFyY2hNb2RlKCkgPyAwIDogMSk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fMl9yb3VuZFxcXFxcXFwiLFxcXFxuICAgICAgICBkZXNjOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fc2VhcmNoNlxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG5cXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLmqKHlvI/vvJpcXFxcXFxcIiArIG9wZW5Nb2RlLFxcXFxuICAgICAgICB1cmw6IFxcXFxcXFwic2VsZWN0Oi8vXFxcXFxcXCIgKyBKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLpgInmi6nmqKHlvI9cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcXFxcXFxcIuaooeW8j++8muacrOWcsOi9rOeggVxcXFxcXFwiLCBcXFxcXFxcIuaooeW8j++8muWumOaWuUFQUFxcXFxcXFwiLCBcXFxcXFxcIueZu+W9lei0puWPtzFcXFxcXFxcIiwgXFxcXFxcXCLnmbvlvZXotKblj7cyXFxcXFxcXCIsIFxcXFxcXFwiVG9rZW7nmbvlvZVcXFxcXFxcIiwgXFxcXFxcXCLnmbvlvZXkv6Hmga9cXFxcXFxcIiwgXFxcXFxcXCLop4TliJnnpoHnlKhcXFxcXFxcIiwgXFxcXFxcXCLmlK/mjIHkvZzogIVcXFxcXFxcIl0sXFxcXG4gICAgICAgICAgICBjb2w6IDEsXFxcXG4gICAgICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgaWYgKFxcXFxcXFwi55m75b2V6LSm5Y+3MVxcXFxcXFwiID09IGlucHV0KSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/cGFnZVRpdGxlPeeZu+W9lemYv+mHjOS6keebmFxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGlmIChcXFxcXFxcIueZu+W9lei0puWPtzJcXFxcXFxcIiA9PSBpbnB1dCkge1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL3BhZ2UvbG9naW4jbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP2luZGV4PTAmcGFnZVRpdGxlPeeZu+W9lemYv+mHjOS6keebmFxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGlmIChcXFxcXFxcIuinhOWImeemgeeUqFxcXFxcXFwiID09IGlucHV0KSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vcGFnZS9SdWxlRGlzYWJsZSNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgaWYgKFxcXFxcXFwi5pSv5oyB5L2c6ICFXFxcXFxcXCIgPT0gaW5wdXQpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0RvbmF0ZS52I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBpZiAoXFxcXFxcXCJUb2tlbueZu+W9lVxcXFxcXFwiID09IGlucHV0KSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXFxcXFwiXFxcXFxcXCIsIFxcXFxcXFwi6L6T5YWlVG9rZW5cXFxcXFxcIikuaW5wdXQoKCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFsaVRva2Vuc0ZpbGVwYXRoID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3Rva2VuUGF0aFxcXFxcXFwiKS5hbGlUb2tlbnNGaWxlcGF0aDtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbGlUb2tlbiA9IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3Rva2VuOiBpbnB1dC50cmltKClcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGUoYWxpVG9rZW5zRmlsZXBhdGgsIEpTT04uc3RyaW5naWZ5KGFsaVRva2VuKSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgaWYgKFxcXFxcXFwi55m75b2V5L+h5oGvXFxcXFxcXCIgPT0gaW5wdXQpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgb3BlblRva2Vuc0ZpbGVwYXRoLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpVG9rZW5zRmlsZXBhdGhcXFxcbiAgICAgICAgICAgICAgICAgICAgfSA9ICQucmVxdWlyZShcXFxcXFxcInRva2VuUGF0aFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlRXhpc3QoYWxpVG9rZW5zRmlsZXBhdGgpKSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+i/mOacqueZu+mZhlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgYWxpID0gcmVxdWVzdChhbGlUb2tlbnNGaWxlcGF0aCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGkgPSBKU09OLnBhcnNlKGFsaSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGUoYWxpVG9rZW5zRmlsZXBhdGgpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/ojrflj5blpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICBjb25maXJtKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn55m75b2V5L+h5oGvJyxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFxcXFxcXFwi55So5oi3OlxcXFxcXFwiICsgKGFsaS5uaWNrX25hbWUgfHwgYWxpLnVzZXJfbmFtZSB8fCBcXFxcXFxcIlRva2Vu55m75b2VXFxcXFxcXCIpICsgXFxcXFxcXCJcXFxcXFxcXG5Ub2tlbjpcXFxcXFxcIiArIGFsaS5yZWZyZXNoX3Rva2VuICsgXFxcXFxcXCJcXFxcXFxcXG4o5Y+W5raI77ya5rOo6ZSA55m75b2V77yb56Gu5a6a77ya5aSN5Yi2VG9rZW4pXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtOiAkLnRvU3RyaW5nKCh0b2tlbikgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImNvcHk6Ly9cXFxcXFxcIiArIHRva2VuO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgYWxpLnJlZnJlc2hfdG9rZW4pLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsOiAkLnRvU3RyaW5nKChwYXRoMSwgcGF0aDIpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChcXFxcXFxcIuehruiupOazqOmUgOeZu+W9lVxcXFxcXFwiKS5jb25maXJtKChwYXRoMSwgcGF0aDIpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlRmlsZShwYXRoMSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGUocGF0aDIpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+W3suaIkOWKn+mAgOWHuueZu+mZhlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHBhdGgxLCBwYXRoMik7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBhbGlUb2tlbnNGaWxlcGF0aCwgb3BlblRva2Vuc0ZpbGVwYXRoKVxcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoXFxcXFxcXCLmqKHlvI/vvJpcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcIm9wZW5Nb2RlXFxcXFxcXCIsIGlucHV0KTtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PSBcXFxcXFxcIuWumOaWuUFQUFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5L+u5pS55oiQ5Yqf77yM6K+356Gu5L+d5omL5py65pyJ5a6J6KOF6Zi/6YeM5LqR55uY5a6Y5pa5QVBQXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fMl9yb3VuZFxcXFxcXFwiLFxcXFxuICAgICAgICBkZXNjOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fbWVudTZcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuXFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6ICfmkJzntKInLFxcXFxuICAgICAgICBkZXNjOiAn6K+36L6T5YWl5YWz6ZSu6K+NL+mTvuaOpScsXFxcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC50cmltKCk7XFxcXG4gICAgICAgICAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChcXFxcXFxcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zL1xcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vcGFnZS9hbGl5dW4/cGFnZVRpdGxlPeaJk+W8gOmTvuaOpSZwYWdlPWZ5cGFnZSZyZWFsdXJsPVxcXFxcXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGlucHV0KTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHB1dE15VmFyKCdzJywgaW5wdXQpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBvbkNoYW5nZTogXFxcXFxcXCJwdXRNeVZhcigncmVmcycsaW5wdXQpXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBpZDogaWQgKyBcXFxcXFxcInNzXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHNcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9kYXRhXFxcXFxcXCIpLmdldERhdGEoKTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLwn4yfXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2NvbGxlY3Rpb24/cnVsZT1cXFxcXFxcIiArIE1ZX1JVTEUudGl0bGUsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIixcXFxcbiAgICB9LCB7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIlxcXFxcXFwiID09IHIgPyBcXFxcXFxcIuKAnOKAnOWFqOmDqOKAneKAnVxcXFxcXFwiIDogXFxcXFxcXCLlhajpg6hcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKHMsIGlkKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgcXIgPSBnZXRJdGVtKFxcXFxcXFwicnVsZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGNsZWFySXRlbShcXFxcXFxcInJ1bGVcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBpZiAocykge1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcXFxcXCLlhajpg6hcXFxcXFxcIiArIGlkLCB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOWFqOmDqOKAneKAnVxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgaWYgKHFyKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oaWQgKyBxciwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHFyXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgICAgICB9LCBzLCBpZCksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGlkOiBcXFxcXFxcIuWFqOmDqFxcXFxcXFwiICsgaWRcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGZvciAobGV0IGl0IG9mIHJ1bGVzKSB7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXQgPT0gciA/IFxcXFxcXFwi4oCc4oCcXFxcXFxcXCIgKyBpdCArIFxcXFxcXFwi4oCd4oCdXFxcXFxcXCIgOiBpdCxcXFxcbiAgICAgICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChyLCBzLCBpZCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGxldCBxciA9IGdldEl0ZW0oXFxcXFxcXCJydWxlXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJydWxlXFxcXFxcXCIsIHIpO1xcXFxuICAgICAgICAgICAgICAgIGlmIChzKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbShxciA/IChpZCArIHFyKSA6IChcXFxcXFxcIuWFqOmDqFxcXFxcXFwiICsgaWQpLCB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogcXIgfHwgXFxcXFxcXCLlhajpg6hcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbShpZCArIHIsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnFxcXFxcXFwiICsgciArIFxcXFxcXFwi4oCd4oCdXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgICAgICAgICAgfSwgaXQsIHMsIGlkKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGRlc2M6IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDogaWQgKyBpdFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG5cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gcmVjb3JkKCkge1xcXFxuICAgIGxldCBoaXN0b3J5ID0gc3RvcmFnZTAuZ2V0SXRlbShcXFxcXFxcInNlYXJjaEhpc3RvcnlcXFxcXFxcIiwgW10pO1xcXFxuICAgIGxldCBpaSA9IGhpc3RvcnkuaW5kZXhPZihzKTtcXFxcbiAgICBpZiAoaWkgPiAtMSkge1xcXFxuICAgICAgICBoaXN0b3J5LnNwbGljZShpaSwgMSk7XFxcXG4gICAgfVxcXFxuICAgIGlmIChoaXN0b3J5Lmxlbmd0aCA+IDIwKSB7XFxcXG4gICAgICAgIGhpc3Rvcnkuc3BsaWNlKGhpc3RvcnkubGVuZ3RoIC0gMSwgMSk7XFxcXG4gICAgfVxcXFxuICAgIGhpc3RvcnkudW5zaGlmdChzKTtcXFxcbiAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXFxcXFwic2VhcmNoSGlzdG9yeVxcXFxcXFwiLCBoaXN0b3J5KTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gc2VhcmNoRW5kKCkge1xcXFxuICAgIGxldCBwID0gTVlfUEFHRTtcXFxcbiAgICBsZXQgZGF0YSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9kYXRhXFxcXFxcXCIpLmdldERhdGEocCwgciAhPSBcXFxcXFxcIlxcXFxcXFwiID8gciA6IG51bGwpO1xcXFxuICAgIGxldCBwYWdlaWQgPSBpZCArIFxcXFxcXFwieXBqLXBhZ2VcXFxcXFxcIiArIHA7XFxcXG4gICAgaWYgKGRhdGEubGVuZ3RoID4gMCkge1xcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Yqg6L2956ysXFxcXFxcXCIgKyBwICsgXFxcXFxcXCLpobXkuK3vvIzov5vluqbvvJoxL1xcXFxcXFwiICsgZGF0YS5sZW5ndGgsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBkZXNjOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgcGljX3VybDogXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgaWQ6IHBhZ2VpZFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgc2V0UmVzdWx0KGQpO1xcXFxuICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcXFxcbiAgICAgICAgLy/lpJrnur/nqIvliqDovb0gICAgICAgIFxcXFxuICAgICAgICBsZXQgcmVhbFBhZ2UgPSBcXFxcXFxcIlxcXFxcXFwiID09IHIgPyAxIDogcDtcXFxcbiAgICAgICAgbGV0IHRhc2tzID0gZGF0YS5tYXAoaXQgPT4ge1xcXFxuICAgICAgICAgICAgcmV0dXJuIHtcXFxcbiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jdGlvbihydWxlKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXFxcXFwiZGF0YVxcXFxcXFwiKS5jYXJyeVJ1bGUocnVsZSwgcywgcmVhbFBhZ2UsIHNlYXJjaE1vZGUsIG9wZW5Nb2RlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHJ1bGUubmFtZSArIFxcXFxcXFwiOlxcXFxcXFwiICsgZS50b1N0cmluZygpKVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIHJ1bGUuZmluZChzLCByZWFsUGFnZSk7XFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICBwYXJhbTogaXQsXFxcXG4gICAgICAgICAgICAgICAgaWQ6IFxcXFxcXFwicnVsZUBcXFxcXFxcIiArIGl0Lm5hbWVcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG5cXFxcbiAgICAgICAgYmF0Y2hFeGVjdXRlKHRhc2tzLCB7XFxcXG4gICAgICAgICAgICBmdW5jOiBmdW5jdGlvbihwYXJhbSwgaWQsIGVycm9yLCByZXN1bHQpIHtcXFxcbiAgICAgICAgICAgICAgICBwYXJhbS5pICs9IDE7XFxcXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVJdGVtKFxcXFxcXFwiX25vdGhhdmVcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIGFkZEl0ZW1CZWZvcmUocGFnZWlkLCByZXN1bHQpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBpZiAocGFyYW0uaSA9PT0gcGFyYW0uYWxsKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQubGVuZ3RoKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVJdGVtKFxcXFxcXFwiX25vdGhhdmVcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJdGVtQmVmb3JlKHBhZ2VpZCwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgXFxcXFxcXCJ+fn7ku4DkuYjotYTmupDpg73msqHmnInlk6Z+fn5cXFxcXFxcIi5mb250Y29sb3IoXFxcXFxcXCJHcmF5XFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFxcXFxcXFwiX25vdGhhdmVcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW0ocGFnZWlkKTtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHBhZ2VpZCwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Yqg6L2956ysXFxcXFxcXCIgKyBNWV9QQUdFICsgXFxcXFxcXCLpobXkuK3vvIzov5vluqbvvJpcXFxcXFxcIiArIChwYXJhbS5pICsgMSkgKyBcXFxcXFxcIi9cXFxcXFxcIiArIHBhcmFtLmFsbCxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHBhcmFtOiB7XFxcXG4gICAgICAgICAgICAgICAgYWxsOiBkYXRhLmxlbmd0aCxcXFxcbiAgICAgICAgICAgICAgICBpOiAwLFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KVxcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gc2V0SGlzdG9yeSgpIHtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogJzxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6I2ZmNjYwMVxcXFxcXFwiPjxiPuWOhuWPsuiusOW9lTwvYj48L3NwYW4+JyxcXFxcbiAgICAgICAgcGljX3VybDogXFxcXFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2Nsb2NrXFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImF2YXRhclxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoW1xcXFxcXFwi5riF6Zmk5pCc57Si6K6w5b2VXFxcXFxcXCIsIFxcXFxcXFwi5omT5byA6KeC55yL6K6w5b2VXFxcXFxcXCJdKS5zZWxlY3QoKGlkKSA9PiB7XFxcXG4gICAgICAgICAgICBpZiAoaW5wdXQgPT09IFxcXFxcXFwi5riF6Zmk5pCc57Si6K6w5b2VXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJChcXFxcXFxcIuehruWumua4hemZpOWFqOmDqOaQnOe0ouiusOW9le+8n1xcXFxcXFwiKS5jb25maXJtKChpZCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBjbGVhckl0ZW0oXFxcXFxcXCJzZWFyY2hIaXN0b3J5XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVJdGVtQnlDbHMoaWQgKyBcXFxcXFxcIjprZXlcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIGFkZEl0ZW1BZnRlcihpZCArIFxcXFxcXFwiOnNlYXJjaEhpc3RvcnlcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgXFxcXFxcXCJ+fn7ku4DkuYjpg73msqHmnInlk6Z+fn5cXFxcXFxcIi5mb250Y29sb3IoXFxcXFxcXCJHcmF5XFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcXFxcXCI6a2V5XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIH0sIGlkKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9oaXN0b3J5P3J1bGU9XFxcXFxcXCIgKyBNWV9SVUxFLnRpdGxlO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9LCBpZCksXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpZDogaWQgKyBcXFxcXFxcIjpzZWFyY2hIaXN0b3J5XFxcXFxcXCIsXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcblxcXFxuICAgIGxldCBoaXN0b3J5ID0gc3RvcmFnZTAuZ2V0SXRlbShcXFxcXFxcInNlYXJjaEhpc3RvcnlcXFxcXFxcIiwgW10pO1xcXFxuICAgIGxldCBpID0gMDtcXFxcbiAgICBmb3IgKGxldCBrZXkgb2YgaGlzdG9yeSkge1xcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGtleSxcXFxcbiAgICAgICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChpZCwga2V5KSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGV4dHJhID0gZmluZEl0ZW0oaWQgKyBcXFxcXFxcInNzXFxcXFxcXCIpLmV4dHJhO1xcXFxuICAgICAgICAgICAgICAgIGV4dHJhLmRlZmF1bHRWYWx1ZSA9IGtleTtcXFxcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IGV4dHJhXFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfSwgaWQsIGtleSksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJmbGV4X2J1dHRvblxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDogaWQgKyBcXFxcXFxcIjprZXk6XFxcXFxcXCIgKyBrZXksXFxcXG4gICAgICAgICAgICAgICAgY2xzOiBpZCArIFxcXFxcXFwiOmtleVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Yig6Zmk5YWz6ZSu6K+NOlxcXFxcXFwiICsga2V5LFxcXFxuICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoaWQsIGtleSwgaSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhpc3RvcnkgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXFxcXFwic2VhcmNoSGlzdG9yeVxcXFxcXFwiLCBbXSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBoaXN0b3J5LnNwbGljZShpLCAxKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcXFxcXCJzZWFyY2hIaXN0b3J5XFxcXFxcXCIsIGhpc3RvcnkpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbShpZCArIFxcXFxcXFwiOmtleTpcXFxcXFxcIiArIGtleSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3RvYXN0KCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0sIGlkLCBrZXksIGkpXFxcXG4gICAgICAgICAgICAgICAgfV1cXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGkrKztcXFxcbiAgICB9XFxcXG4gICAgaWYgKGhpc3RvcnkubGVuZ3RoID09PSAwKSB7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBcXFxcXFxcIn5+fuS7gOS5iOmDveayoeacieWTpn5+flxcXFxcXFwiLmZvbnRjb2xvcihcXFxcXFxcIkdyYXlcXFxcXFxcIiksXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGNsczogaWQgKyBcXFxcXFxcIjprZXlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBzZXRUcmVuZGluZ1RhYkVuZCgpIHtcXFxcbiAgICBsZXQgaG90Q2xhc3MgPSB7XFxcXG4gICAgICAgIFxcXFxcXFwi55m+5bqmXFxcXFxcXCI6IHtcXFxcbiAgICAgICAgICAgIFxcXFxcXFwi55S16KeG5YmnXFxcXFxcXCI6IFxcXFxcXFwidGVsZXBsYXlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIFxcXFxcXFwi55S15b2xXFxcXFxcXCI6IFxcXFxcXFwibW92aWVcXFxcXFxcIlxcXFxuICAgICAgICB9LFxcXFxuICAgICAgICBcXFxcXFxcIuWkuOWFi1xcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICBcXFxcXFxcIueUteinhuWJp1xcXFxcXFwiOiBcXFxcXFxcIueUteinhuWJp1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCLnlLXlvbFcXFxcXFxcIjogXFxcXFxcXCLnlLXlvbFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIFxcXFxcXFwi5Yqo5ryrXFxcXFxcXCI6IFxcXFxcXFwi5Yqo5ryrXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBcXFxcXFxcIue7vOiJulxcXFxcXFwiOiBcXFxcXFxcIue7vOiJulxcXFxcXFwiXFxcXG4gICAgICAgIH1cXFxcbiAgICB9O1xcXFxuICAgIGxldCBkYXRhU291cmNlID0gT2JqZWN0LmtleXMoaG90Q2xhc3MpO1xcXFxuICAgIGxldCBzZWxlY3Rzb3VyY2UgPSBnZXRJdGVtKFxcXFxcXFwiZGF0YVNvdXJjZVxcXFxcXFwiLCBkYXRhU291cmNlWzBdKTtcXFxcbiAgICBsZXQgaG90a2V5cyA9IE9iamVjdC5rZXlzKGhvdENsYXNzW3NlbGVjdHNvdXJjZV0pO1xcXFxuICAgIGxldCBzZWxlY3RrZXkgPSBnZXRJdGVtKFxcXFxcXFwiaG90a2V5XFxcXFxcXCIsIGhvdGtleXNbMF0pO1xcXFxuICAgIGxldCB0YWJrZXkgPSBob3RDbGFzc1tzZWxlY3Rzb3VyY2VdW3NlbGVjdGtleV07XFxcXG5cXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogJzxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6I2ZmNjYwMVxcXFxcXFwiPjxiPicgKyBzZWxlY3Rzb3VyY2UgKyBzZWxlY3RrZXkgKyAn54Ot5pCcPC9iPjwvc3Bhbj4nLFxcXFxuICAgICAgICB1cmw6ICQoaG90a2V5cywgMSwgXFxcXFxcXCLliIfmjaLng63mkJxcXFxcXFxcIikuc2VsZWN0KCgpID0+IHtcXFxcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJob3RrZXlcXFxcXFxcIiwgaW5wdXQpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7LliIfmjaLkuLpcXFxcXFxcIiArIGlucHV0O1xcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYXZhdGFyXFxcXFxcXCIsXFxcXG4gICAgICAgIHBpY191cmw6IFxcXFxcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9maXJlXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5YiH5o2i5pWw5o2u5rqQXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKGRhdGFTb3VyY2UpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoZGF0YVNvdXJjZSwgMSwgXFxcXFxcXCLliIfmjaLmlbDmja7mupBcXFxcXFxcIikuc2VsZWN0KCgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJkYXRhU291cmNlXFxcXFxcXCIsIGlucHV0KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySXRlbShcXFxcXFxcImhvdGtleVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey5YiH5o2i5Li6XFxcXFxcXCIgKyBpbnB1dDtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfSwgZGF0YVNvdXJjZSlcXFxcbiAgICAgICAgICAgIH1dXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLmraPlnKjliqDovb0uLi5cXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgaWQ6IGlkICsgXFxcXFxcXCI6aG90a2V5XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIHNldFJlc3VsdChkKTtcXFxcbiAgICBsZXQgc2QgPSBbXTtcXFxcbiAgICBsZXQgc2V0U2VhcmNoS2V5ID0gbmFtZSA9PiB7XFxcXG4gICAgICAgIHB1dE15VmFyKCdzJywgbmFtZSk7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICB9O1xcXFxuXFxcXG4gICAgbGV0IGdldFRpdGxlID0gKGksIG5hbWUpID0+IHtcXFxcbiAgICAgICAgbGV0IGNvbG9yO1xcXFxuICAgICAgICBzd2l0Y2ggKGkpIHtcXFxcbiAgICAgICAgICAgIGNhc2UgMDpcXFxcbiAgICAgICAgICAgICAgICBjb2xvciA9IFxcXFxcXFwiI2ZmMzMwMFxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgY2FzZSAxOlxcXFxuICAgICAgICAgICAgICAgIGNvbG9yID0gXFxcXFxcXCIjZmY2NjAwXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICBjYXNlIDI6XFxcXG4gICAgICAgICAgICAgICAgY29sb3IgPSBcXFxcXFxcIiNmZjk5MDBcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgZGVmYXVsdDpcXFxcbiAgICAgICAgICAgICAgICBjb2xvciA9IFxcXFxcXFwiYmxhY2tcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIFN0cmluZyhpICsgMSkuZm9udGNvbG9yKGNvbG9yKSArIFxcXFxcXFwiXFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXCIgKyBuYW1lO1xcXFxuICAgIH1cXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBzd2l0Y2ggKHNlbGVjdHNvdXJjZSkge1xcXFxuICAgICAgICAgICAgY2FzZSBcXFxcXFxcIueZvuW6plxcXFxcXFwiOlxcXFxuICAgICAgICAgICAgICAgIHZhciBqc29uID0gcmVxdWVzdCgnaHR0cHM6Ly90b3AuYmFpZHUuY29tL2FwaS9ib2FyZD9wbGF0Zm9ybT13aXNlJnRhYj0nICsgdGFia2V5ICsgJyZ0YWc9JTdCJTIyY2F0ZWdvcnklMjI6JTIyJUU1JTg1JUE4JUU5JTgzJUE4JUU3JUIxJUJCJUU1JTlFJThCJTIyJTdEJywge1xcXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNi4wOyBOZXh1cyA1IEJ1aWxkL01SQTU4TikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuNDg0NC41MSBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnSG9zdCc6ICd0b3AuYmFpZHUuY29tJyxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJyxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiAnemgtQ04semg7cT0wLjksZW4tVVM7cT0wLjgsZW47cT0wLjcnLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0FjY2VwdC1FbmNvZGluZyc6ICdnemlwLCBkZWZsYXRlLCBicicsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3RvcC5iYWlkdS5jb20vYm9hcmQ/dGFiPW5vdmVsJyxcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIC8vdmFyIHMgPSBEYXRlLm5vdygpO1xcXFxuICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gSlNPTi5wYXJzZShqc29uKS5kYXRhLmNhcmRzWzBdLmNvbnRlbnQ7XFxcXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtID0gbGlzdFtpXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBpdGVtLndvcmQgKyAnICgnICsgaXRlbS5zaG93WzJdICsgJyknO1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgZGVzID0gaXRlbS5kZXNjO1xcXFxuICAgICAgICAgICAgICAgICAgICBzZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBnZXRUaXRsZShpLCBuYW1lKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZShzZXRTZWFyY2hLZXksIGl0ZW0ud29yZCksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBkZXMsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWc6IGl0ZW0uaW1nLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibW92aWVfMV92ZXJ0aWNhbF9waWNcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICBjYXNlIFxcXFxcXFwi5aS45YWLXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAgICAgdmFyIGpzb24gPSByZXF1ZXN0KFxcXFxcXFwiaHR0cHM6Ly9uZXdzLm15cXVhcmsuY24vdjIvdG9wbGlzdC9tb3ZpZT8mY2hhbm5lbD1cXFxcXFxcIiArIHRhYmtleSArIFxcXFxcXFwiJnJhbmtfdHlwZT0lRTYlOUMlODAlRTclODMlQURcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgdmFyIHhtbERhdGEgPSAoSlNPTi5wYXJzZShqc29uKS5kYXRhIHx8IFxcXFxcXFwiXFxcXFxcXCIpLnJlcGxhY2UoL3RpdGxlPi9nLCBcXFxcXFxcImhfdGl0bGU+XFxcXFxcXCIpLnJlcGxhY2UoL3NyYz4vZywgXFxcXFxcXCJoX3NyYz5cXFxcXFxcIikucmVwbGFjZSgvYXJlYT4vZywgXFxcXFxcXCJoX2FyZWFcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBwZGZhKHhtbERhdGEsIFxcXFxcXFwiYm9keSYmaXRlbVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICB2YXIgZ2V0VGV4dCA9IHQgPT4gdDtcXFxcbiAgICAgICAgICAgICAgICB2YXIgdHJlbmQgPSBbXFxcXFxcXCLjhKdcXFxcXFxcIiwgXFxcXFxcXCLihpFcXFxcXFxcIiwgXFxcXFxcXCLihpNcXFxcXFxcIl07XFxcXG4gICAgICAgICAgICAgICAgLy92YXIgcyA9IERhdGUubm93KCk7XFxcXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtID0gbGlzdFtpXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBwZGZoKGl0ZW0sIFxcXFxcXFwiaF90aXRsZSYmVGV4dFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRlcyA9IFxcXFxcXFwi54Ot5bqm77yaXFxcXFxcXCIgKyBwZGZoKGl0ZW0sIFxcXFxcXFwiaG90X3Njb3JlJiZUZXh0XFxcXFxcXCIpICsgXFxcXFxcXCIgXFxcXFxcXCIgKyB0cmVuZC5hdChwZGZoKGl0ZW0sIFxcXFxcXFwiaG90X3RyZW5kJiZUZXh0XFxcXFxcXCIpKSArXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIlxcXFxcXFxcbuivhOWIhu+8mlxcXFxcXFwiICsgcGRmaChpdGVtLCBcXFxcXFxcInNjb3JlX2F2ZyYmVGV4dFxcXFxcXFwiKS5yZXBsYWNlKC9eMCQvLCBcXFxcXFxcIuaaguaXoOivhOWIhlxcXFxcXFwiKSArXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiICsgcGRmaChpdGVtLCBcXFxcXFxcInllYXImJlRleHRcXFxcXFxcIikgKyBcXFxcXFxcIsK3XFxcXFxcXCIgKyBwZGZoKGl0ZW0sIFxcXFxcXFwiaF9hcmVhJiZUZXh0XFxcXFxcXCIpICsgXFxcXFxcXCLCt1xcXFxcXFwiICsgcGRmaChpdGVtLCBcXFxcXFxcImNhdGVnb3J5JiZUZXh0XFxcXFxcXCIpLnJlcGxhY2UoXFxcXFxcXCIsXFxcXFxcXCIsIFxcXFxcXFwiwrdcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIHNkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGdldFRpdGxlKGksIG5hbWUpLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKHNldFNlYXJjaEtleSwgbmFtZSksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBkZXMsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWc6IHBkZmgoaXRlbSwgXFxcXFxcXCJoX3NyYyYmVGV4dFxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcIm1vdmllXzFfdmVydGljYWxfcGljXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGFkZEl0ZW1BZnRlcihpZCArIFxcXFxcXFwiOmhvdGtleVxcXFxcXFwiLCBzZCk7XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXFxcbiAgICB9IGZpbmFsbHkge1xcXFxuICAgICAgICBkZWxldGVJdGVtKGlkICsgXFxcXFxcXCI6aG90a2V5XFxcXFxcXCIpO1xcXFxuICAgIH1cXFxcbn1cXFxcbmxldCByID0gZ2V0SXRlbShcXFxcXFxcInJ1bGVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG5sZXQgcyA9IGdldE15VmFyKCdzJywgJycpIHx8IE1ZX1BBUkFNUy5zZWFyY2hUZXJtcyB8fCBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcXFxcXCJzZWFyY2hUZXJtc1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSk7XFxcXG5sZXQgc2VhcmNoTW9kZSA9IGdldFNlYXJjaE1vZGUoKTtcXFxcbmxldCBvcGVuTW9kZSA9IGdldEl0ZW0oXFxcXFxcXCJvcGVuTW9kZVxcXFxcXFwiLCBcXFxcXFxcIuacrOWcsOi9rOeggVxcXFxcXFwiKTtcXFxcbmxldCBpZCA9IERhdGUubm93KCkgKyBNWV9SVUxFLnRpdGxlO1xcXFxubGV0IGQgPSBbXTtcXFxcbmlmIChNWV9QQUdFID09PSAxKSB7XFxcXG4gICAgc2V0Q2xpcCgpO1xcXFxuICAgIHNldEhlYWQoKTtcXFxcbiAgICBpZiAoIXMpIHtcXFxcbiAgICAgICAgc2V0SGlzdG9yeSgpO1xcXFxuICAgIH1cXFxcbn1cXFxcbmlmIChzKSB7XFxcXG4gICAgcmVjb3JkKCk7XFxcXG4gICAgc2VhcmNoRW5kKCk7XFxcXG59IGVsc2UgaWYgKE1ZX1BBR0UgPT09IDEpIHtcXFxcbiAgICBzZXRUcmVuZGluZ1RhYkVuZCgpO1xcXFxufSBlbHNlIHtcXFxcbiAgICBzZXRSZXN1bHQoW10pO1xcXFxufVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIue9kemhtea1j+iniFxcXCIsXFxcInBhdGhcXFwiOlxcXCJ5c2Z4XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxudmFyIGQgPSBbXTtcXFxcblxcXFxubGV0IG9wZW5Nb2RlID0gZ2V0SXRlbShcXFxcXFxcIm9wZW5Nb2RlXFxcXFxcXCIpO1xcXFxubGV0IHJ1bGUgPSBNWV9SVUxFLnRpdGxlO1xcXFxubGV0IHVybCA9IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFxcXFxcIndlYlVybFxcXFxcXFwiLFxcXFxcXFwiXFxcXFxcXCIpKTtcXFxcblxcXFxuZnVuY3Rpb24gaW50ZXJjZXB0KHJ1bGUsIG9yaWdpbiwgb3Blbk1vZGUpIHtcXFxcbiAgICBsZXQgaG9zdCA9IG9yaWdpbi5yZXBsYWNlKG5ldyBSZWdFeHAoXFxcXFxcXCJodHRwOi8vfGh0dHBzOi8vXFxcXFxcXCIpLCBcXFxcXFxcIlxcXFxcXFwiKS5zcGxpdChcXFxcXFxcIi9cXFxcXFxcIilbMF07XFxcXG4gICAgbGV0IGhvc3RzID0gaG9zdC5zcGxpdChcXFxcXFxcIi5cXFxcXFxcIik7XFxcXG4gICAgaWYgKGhvc3RzLmxlbmd0aCA+IDIpIHtcXFxcbiAgICAgICAgaG9zdCA9IGhvc3RzW2hvc3RzLmxlbmd0aCAtIDJdICsgXFxcXFxcXCIuXFxcXFxcXCIgKyBob3N0c1tob3N0cy5sZW5ndGggLSAxXTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoXFxcXFxcXCJtYWduZXRcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgY29uZmlybSh7XFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLmuKnppqjmj5DnpLpcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGNvbnRlbnQ6IFxcXFxcXFwi5qOA5rWL5Yiw5paw55qE56OB6ZO+5Zyw5Z2A77yM54K55Ye756Gu5a6a5oyJ6ZKu5Y2z5Y+v5pKt5pS+77yM54K55Ye75Y+W5raI5oyJ6ZKu5Y+v5Lul5aSN5Yi26ZO+5o6lXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb25maXJtOiAkLnRvU3RyaW5nKChtYWcpID0+IHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFnO1xcXFxuICAgICAgICAgICAgfSwgaW5wdXQpLFxcXFxuICAgICAgICAgICAgY2FuY2VsOiAkLnRvU3RyaW5nKChtYWcpID0+IHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJjb3B5Oi8vXFxcXFxcXCIgKyBtYWdcXFxcbiAgICAgICAgICAgIH0sIGlucHV0KVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmV0dXJuIHRydWU7XFxcXG4gICAgfSBlbHNlIGlmIChpbnB1dC5pbmNsdWRlcyhcXFxcXFxcImFsaXl1bmRyaXZlLmNvbVxcXFxcXFwiKSAmJiBvcGVuTW9kZSAhPSBcXFxcXFxcIuWumOaWuUFQUFxcXFxcXFwiKSB7XFxcXG4gICAgICAgIGxvZyhpbnB1dCk7XFxcXG4gICAgICAgIGlmIChpbnB1dC5pbmNsdWRlcygnY2hlY2t1cmw/dXJsPScpICYmIGlucHV0LmluY2x1ZGVzKCcmdXJscmVmZXInKSkge1xcXFxuICAgICAgICAgICAgaW5wdXQgPSBkZWNvZGVVUklDb21wb25lbnQoaW5wdXQuc3BsaXQoJyZ1cmxyZWZlcicpWzBdLnNwbGl0KCdjaGVja3VybD91cmw9JylbMV0pO1xcXFxuICAgICAgICAgICAgLy9sb2coJ+i0tOWQpycraW5wdXQpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiAkLnRvU3RyaW5nKCh1cmwsIHJ1bGUpID0+IHtcXFxcbiAgICAgICAgICAgIGZ5X2JyaWRnZV9hcHAub3BlbihKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi6Zi/6YeM5LqR55uYXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9hbGl5dW4/cGFnZT1meXBhZ2UmcmVhbHVybD1cXFxcXFxcIiArIGVuY29kZVVSSUNvbXBvbmVudCh1cmwpICsgXFxcXFxcXCImcnVsZT1cXFxcXFxcIiArIHJ1bGUsXFxcXG4gICAgICAgICAgICB9KSlcXFxcbiAgICAgICAgfSwgaW5wdXQsIHJ1bGUpO1xcXFxuICAgIH0gZWxzZSBpZiAoL1xcXFxcXFxcLihtcDN8ZmxhY3xtNGEpJC8udGVzdChpbnB1dCkpIHtcXFxcbiAgICAgICAgbG9nKGlucHV0KTtcXFxcbiAgICAgICAgcmV0dXJuICQudG9TdHJpbmcoKHVybCwgcnVsZSkgPT4ge1xcXFxuICAgICAgICAgICAgZnlfYnJpZGdlX2FwcC5wbGF5VmlkZW8odXJsKTtcXFxcbiAgICAgICAgfSwgaW5wdXQsIHJ1bGUpO1xcXFxuICAgIH0gZWxzZSBpZiAoIWlucHV0LmluY2x1ZGVzKGhvc3QpICYmIGlucHV0LnN0YXJ0c1dpdGgoXFxcXFxcXCJodHRwXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgIGxvZyhpbnB1dCk7XFxcXG4gICAgICAgIHJldHVybiAkLnRvU3RyaW5nKCh1cmwsIHJ1bGUpID0+IHtcXFxcbiAgICAgICAgICAgIGZ5X2JyaWRnZV9hcHAub3BlbihKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi6K+m5oOFXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS95c2Z4P3dlYlVybD1cXFxcXFxcIitlbmNvZGVVUklDb21wb25lbnQodXJsKStcXFxcXFxcIiZydWxlPVxcXFxcXFwiK3J1bGUsXFxcXG4gICAgICAgICAgICB9KSlcXFxcbiAgICAgICAgfSwgaW5wdXQsIHJ1bGUpO1xcXFxuICAgIH0gZWxzZSBpZiAoIWlucHV0LnN0YXJ0c1dpdGgoXFxcXFxcXCJodHRwXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgIGxvZyhpbnB1dCk7XFxcXG4gICAgICAgIC8v6IO95ZSk6LW3QVBQ55qE55m95ZCN5Y2VXFxcXG4gICAgICAgIGxldCB3aGl0ZSA9IFtcXFxcbiAgICAgICAgICAgIFxcXFxcXFwicWtsaW5rXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBcXFxcXFxcImJkbmV0ZGlza1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJ4dW5sZWlhcHBcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIFxcXFxcXFwic21hcnRkcml2ZVxcXFxcXFwiXFxcXG4gICAgICAgIF07XFxcXG4gICAgICAgIGxldCBpbldoaXRlID0gd2hpdGUuZmlsdGVyKGl0ID0+IGlucHV0LnN0YXJ0c1dpdGgoaXQpKS5sZW5ndGggPiAwO1xcXFxuICAgICAgICBpZiAoIWluV2hpdGUpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gJC50b1N0cmluZygodXJsLCBydWxlKSA9PiB7XFxcXG4gICAgICAgICAgICBmeV9icmlkZ2VfYXBwLm9wZW5UaGlyZEFwcCAmJiBmeV9icmlkZ2VfYXBwLm9wZW5UaGlyZEFwcCh1cmwpO1xcXFxuICAgICAgICB9LCBpbnB1dCwgcnVsZSk7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBsb2FkSnMoKSB7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgaWYgKGRvY3VtZW50LnRpdGxlICYmIGRvY3VtZW50LnRpdGxlLmxlbmd0aCkge1xcXFxuICAgICAgICAgICAgbGV0IHIgPSAkJCQoKS5sYXp5UnVsZSgodCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHNldFBhZ2VUaXRsZSh0KTtcXFxcbiAgICAgICAgICAgIH0sIGRvY3VtZW50LnRpdGxlKTtcXFxcbiAgICAgICAgICAgIGZ5X2JyaWRnZV9hcHAucGFyc2VMYXp5UnVsZShyKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgZnlfYnJpZGdlX2FwcC5sb2coZS50b1N0cmluZygpKTtcXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgdXJsOiB1cmwsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwieDVfd2Vidmlld19zaW5nbGVcXFxcXFxcIixcXFxcbiAgICBkZXNjOiBcXFxcXFxcIjEwMCUmJmZsb2F0XFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdXJsSW50ZXJjZXB0b3I6ICQudG9TdHJpbmcoaW50ZXJjZXB0LCBydWxlLCBnZXRIb21lKHVybCksIG9wZW5Nb2RlKSxcXFxcbiAgICAgICAganM6ICQudG9TdHJpbmcobG9hZEpzKSxcXFxcbiAgICAgICAgY2FuQmFjazogdHJ1ZSxcXFxcbiAgICAgICAganNMb2FkaW5nSW5qZWN0OiB0cnVlLFxcXFxuICAgICAgICBmbG9hdFZpZGVvOiB0cnVlXFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcbnNldFJlc3VsdChkKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLpmL/ph4xMYXp5XFxcIixcXFwicGF0aFxcXCI6XFxcImFsaWxhenlcXFwiLFxcXCJydWxlXFxcIjpcXFwiY29uc3QgQWxpQWNjZXNzQXBpID0gJC5yZXF1aXJlKFxcXFxcXFwiYWxpUGxheUFwaVxcXFxcXFwiKTtcXFxcbmNvbnN0IHtcXFxcbiAgICBvcGVuVG9rZW5zRmlsZXBhdGgsXFxcXG4gICAgYWxpVG9rZW5zRmlsZXBhdGhcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJ0b2tlblBhdGhcXFxcXFxcIik7XFxcXG5cXFxcbmZ1bmN0aW9uIGFsaU0zdThQcm94eShmaWxlSWQsIHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCBhbGlUb2tlbiwgdGl0bGUpIHtcXFxcbiAgICBmdW5jdGlvbiBnZXRBbGlQbGF5VXJsKGZpbGVJZCwgbGluZSkge1xcXFxuICAgICAgICBsZXQgYWxpdXJsO1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgY29uc3QgQWxpQWNjZXNzQXBpID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2FsaVBsYXlBcGk/cnVsZT1cXFxcXFxcIiArIHRpdGxlKTtcXFxcbiAgICAgICAgICAgIGxldCBhbGlBY2Nlc3NBcGkgPSBBbGlBY2Nlc3NBcGkuY3JlYXRlRGVmYXVsdChzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVUb2tlbiwgYWxpVG9rZW4sIG51bGwsIHRpdGxlKTtcXFxcbiAgICAgICAgICAgIGxldCBwbGF5VXJsTGlzdCA9IGFsaUFjY2Vzc0FwaS5nZXRTaGFyZVZpZGVvUHJldmlldyhmaWxlSWQpIHx8IFtdO1xcXFxuICAgICAgICAgICAgcGxheVVybExpc3QuZm9yRWFjaCgoaXRlbSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGlmIChpdGVtLnRlbXBsYXRlX2lkID09IGxpbmUpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgYWxpdXJsID0gaXRlbS51cmw7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcXFxuICAgICAgICAgICAgdGhyb3cgZTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gYWxpdXJsO1xcXFxuICAgIH1cXFxcblxcXFxuICAgIGZ1bmN0aW9uIGdldE0zdThDb250ZW50KHBsYXl1cmwpIHtcXFxcblxcXFxuICAgICAgICAvL2xvZyhcXFxcXFxcIuaIkeWcqOS7o+eQhlxcXFxcXFwiICsgcGxheXVybCk7XFxcXG4gICAgICAgIGxldCBob21lID0gcGxheXVybC5zcGxpdCgnbWVkaWEubTN1OCcpWzBdO1xcXFxuICAgICAgICBsZXQgZiA9IGZldGNoKHBsYXl1cmwsIHtcXFxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJ1xcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHRpbWVvdXQ6IDMwMDBcXFxcbiAgICAgICAgfSkuc3BsaXQoXFxcXFxcXCJcXFxcXFxcXG5cXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCBmZiA9IGYubWFwKGl0ID0+IHtcXFxcbiAgICAgICAgICAgIGlmIChpdC5zdGFydHNXaXRoKFxcXFxcXFwibWVkaWEtXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiL3Byb3h5P3VybD1cXFxcXFxcIiArIGJhc2U2NEVuY29kZShob21lICsgaXQpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuIGl0O1xcXFxuICAgICAgICB9KS5qb2luKFxcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXCIpO1xcXFxuICAgICAgICAvL2xvZygndWZpZC0nICsgZmlsZWlkKTtcXFxcbiAgICAgICAgd3JpdGVGaWxlKCdoaWtlcjovL2ZpbGVzL19jYWNoZS8nICsgZmlsZUlkICsgJy5tM3U4JywgZmYpO1xcXFxuICAgICAgICByZXR1cm4gZmY7XFxcXG4gICAgfVxcXFxuXFxcXG4gICAgZnVuY3Rpb24gdXBkYXRlVHNVcmwodXJsKSB7XFxcXG4gICAgICAgIGxldCBmaWQgPSB1cmwuc3BsaXQoJyZmPScpWzFdLnNwbGl0KCcmJylbMF07XFxcXG4gICAgICAgIC8vbG9nKCdzZmlkLScgKyBmaWQpO1xcXFxuICAgICAgICBsZXQgZiA9IGZldGNoKCdoaWtlcjovL2ZpbGVzL19jYWNoZS8nICsgZmlkICsgJy5tM3U4Jykuc3BsaXQoXFxcXFxcXCJcXFxcXFxcXG5cXFxcXFxcIik7XFxcXG4gICAgICAgIGYuZm9yRWFjaChpdCA9PiB7XFxcXG4gICAgICAgICAgICBpZiAoaXQgJiYgaXQuc3RhcnRzV2l0aCgnL3Byb3h5P3VybD0nKSkge1xcXFxuICAgICAgICAgICAgICAgIGxldCBmdXJsID0gYmFzZTY0RGVjb2RlKGl0LnJlcGxhY2UoJy9wcm94eT91cmw9JywgJycpKTtcXFxcbiAgICAgICAgICAgICAgICBpZiAodXJsLnN1YnN0cih1cmwuaW5kZXhPZignL21lZGlhLScpLCB1cmwuaW5kZXhPZignLnRzJykpID09IGZ1cmwuc3Vic3RyKGZ1cmwuaW5kZXhPZignL21lZGlhLScpLCBmdXJsLmluZGV4T2YoJy50cycpKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICB1cmwgPSBmdXJsO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSlcXFxcbiAgICAgICAgbGV0IGV4cGlyZXMgPSB1cmwuc3BsaXQoJ3gtb3NzLWV4cGlyZXM9JylbMV0uc3BsaXQoJyYnKVswXTtcXFxcbiAgICAgICAgY29uc3QgbGFzdHRpbWUgPSBwYXJzZUludChleHBpcmVzKSAtIERhdGUubm93KCkgLyAxMDAwO1xcXFxuICAgICAgICBpZiAobGFzdHRpbWUgPCA2MCkge1xcXFxuICAgICAgICAgICAgLy9sb2coJ+i/h+acn+abtOaWsCcpXFxcXG4gICAgICAgICAgICBsZXQgbGluZSA9IHVybC5zcGxpdCgnL21lZGlhJylbMF07IC8v5Y+W5LmL5YmN5pKt5pS+55qEdHPmrrXnur/ot69cXFxcbiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZyhsaW5lLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcXFxcbiAgICAgICAgICAgIGxldCBmID0gZ2V0TTN1OENvbnRlbnQoZ2V0QWxpUGxheVVybChmaWQsIGxpbmUpKS5zcGxpdChcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGYuZm9yRWFjaChpdCA9PiB7XFxcXG4gICAgICAgICAgICAgICAgaWYgKGl0ICYmIGl0LnN0YXJ0c1dpdGgoJy9wcm94eT91cmw9JykpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZ1cmwgPSBiYXNlNjREZWNvZGUoaXQucmVwbGFjZSgnL3Byb3h5P3VybD0nLCAnJykpO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAodXJsLnN1YnN0cih1cmwuaW5kZXhPZignL21lZGlhLScpLCB1cmwuaW5kZXhPZignLnRzJykpID09IGZ1cmwuc3Vic3RyKGZ1cmwuaW5kZXhPZignL21lZGlhLScpLCBmdXJsLmluZGV4T2YoJy50cycpKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gZnVybDtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pXFxcXG5cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gdXJsO1xcXFxuICAgIH1cXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBsZXQgdXJsID0gYmFzZTY0RGVjb2RlKE1ZX1BBUkFNUy51cmwpO1xcXFxuICAgICAgICBpZiAodXJsLmluY2x1ZGVzKFxcXFxcXFwiLnRzXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xcXFxuICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDMwMixcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiTG9jYXRpb25cXFxcXFxcIjogdXBkYXRlVHNVcmwodXJsKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tLydcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIC8vbG9nKHVybCk7XFxcXG4gICAgICAgICAgICBsZXQgZmYgPSBnZXRNM3U4Q29udGVudChnZXRBbGlQbGF5VXJsKGZpbGVJZCwgTVlfUEFSQU1TLnRlbXBsYXRlSWQpKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBmZjtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgbG9nKFxcXFxcXFwi5Luj55CG5pKt5pS+5aSx6LSlI1xcXFxcXFxcbumUmeivr+S/oeaBrz5cXFxcXFxcIiArIGUudG9TdHJpbmcoKSArIFxcXFxcXFwiXFxcXFxcXFxu6ZSZ6K+v6KGMPlxcXFxcXFwiICsgZS5saW5lTnVtYmVyKTtcXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcblxcXFxuZnVuY3Rpb24gZ2V0VmlkZW8oYWxpQWNjZXNzQXBpLCBmaWxlSWQpIHtcXFxcblxcXFxuICAgIGxldCBwbGF5VXJsTGlzdCA9IGFsaUFjY2Vzc0FwaS5nZXRTaGFyZVZpZGVvUHJldmlldyhmaWxlSWQpIHx8IFtdO1xcXFxuXFxcXG4gICAgbGV0IHNlcnZlckFkZHJlc3MgPSBzdGFydFByb3h5U2VydmVyKCQudG9TdHJpbmcoYWxpTTN1OFByb3h5LCBmaWxlSWQsIGFsaUFjY2Vzc0FwaS5zaGFyZUlkLCBhbGlBY2Nlc3NBcGkuc2hhcmVQd2QsIGFsaUFjY2Vzc0FwaS5zaGFyZVRva2VuLCBhbGlBY2Nlc3NBcGkuYWxpVG9rZW4sIE1ZX1JVTEUudGl0bGUpKTtcXFxcbiAgICBsZXQgdHJhbnNjb2RpbmcgPSB7XFxcXG4gICAgICAgIFVIRDogXFxcXFxcXCI0SyDotoXmuIVcXFxcXFxcIixcXFxcbiAgICAgICAgUUhEOiBcXFxcXFxcIjJLIOi2hea4hVxcXFxcXFwiLFxcXFxuICAgICAgICBGSEQ6IFxcXFxcXFwiMTA4MCDlhajpq5jmuIVcXFxcXFxcIixcXFxcbiAgICAgICAgSEQ6IFxcXFxcXFwiNzIwIOmrmOa4hVxcXFxcXFwiLFxcXFxuICAgICAgICBTRDogXFxcXFxcXCI1NDAg5qCH5riFXFxcXFxcXCIsXFxcXG4gICAgICAgIExEOiBcXFxcXFxcIjM2MCDmtYHnlYVcXFxcXFxcIlxcXFxuICAgIH07XFxcXG5cXFxcbiAgICBpZiAocGxheVVybExpc3QubGVuZ3RoID4gMCkge1xcXFxuICAgICAgICBsZXQgdXJscyA9IFtdLFxcXFxuICAgICAgICAgICAgbmFtZXMgPSBbXTtcXFxcbiAgICAgICAgcGxheVVybExpc3QuZm9yRWFjaCgoaXRlbSkgPT4ge1xcXFxuICAgICAgICAgICAgdXJscy5wdXNoKHNlcnZlckFkZHJlc3MgKyBcXFxcXFxcIj91cmw9XFxcXFxcXCIgKyBiYXNlNjRFbmNvZGUoaXRlbS51cmwpICsgXFxcXFxcXCImdGVtcGxhdGVJZD1cXFxcXFxcIiArIGl0ZW0udGVtcGxhdGVfaWQgKyBcXFxcXFxcIiMubTN1OFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIG5hbWVzLnB1c2godHJhbnNjb2RpbmdbaXRlbS50ZW1wbGF0ZV9pZF0gPyB0cmFuc2NvZGluZ1tpdGVtLnRlbXBsYXRlX2lkXSA6IGl0ZW0udGVtcGxhdGVfaGVpZ2h0KTtcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGxldCBoZWFkcyA9IG5ldyBBcnJheShwbGF5VXJsTGlzdC5sZW5ndGgpLmZpbGwoe1xcXFxuICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tLydcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIHJldHVybiB7XFxcXG4gICAgICAgICAgICB1cmxzOiB1cmxzLFxcXFxuICAgICAgICAgICAgbmFtZXM6IG5hbWVzLFxcXFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZHMsXFxcXG4gICAgICAgIH07XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgcmV0dXJuIHt9O1xcXFxuICAgIH1cXFxcblxcXFxufTtcXFxcblxcXFxuXFxcXG5mdW5jdGlvbiBnZXRPcmlWaWRlbyhhbGlBY2Nlc3NBcGksIGZpbGVJZCkge1xcXFxuICAgIHJldHVybiB7XFxcXG4gICAgICAgIG5hbWVzOiBbXFxcXFxcXCLljp/nlLtcXFxcXFxcIl0sXFxcXG4gICAgICAgIHVybHM6IFthbGlBY2Nlc3NBcGkuZ2V0VmlkZW9UZW1QbGF5VXJsKGZpbGVJZCkgKyBcXFxcXFxcIiNpc1ZpZGVvPXRydWUjXFxcXFxcXCJdLFxcXFxuICAgICAgICBoZWFkZXJzOiBbe1xcXFxuICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tLydcXFxcbiAgICAgICAgfV1cXFxcbiAgICB9O1xcXFxufVxcXFxuJC5leHBvcnRzID0gZnVuY3Rpb24oc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIGZpbGVJZCwgY2F0ZSwgemltdSkge1xcXFxuICAgIGlmICghZmlsZUV4aXN0KGFsaVRva2Vuc0ZpbGVwYXRoKSkge1xcXFxuICAgICAgICB0b2FzdChcXFxcXFxcIuivt+WFiOeZu+mZhueZu+W9lei0puWPt1xcXFxcXFwiKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9ub1JlZnJlc2g9MVxcXFxcXFwiO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgYWxpVG9rZW4gPSAkLnJlcXVpcmUoYWxpVG9rZW5zRmlsZXBhdGgpO1xcXFxuICAgIGlmIChjYXRlID09PSBcXFxcXFxcInZpZGVvXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgbGV0IHBsYXlMaXN0ID0gW107XFxcXG4gICAgICAgIGxldCBhbGlBY2Nlc3NBcGk7XFxcXG4gICAgICAgIGxldCBwbGF5TW9kZSA9IGdldEl0ZW0oXFxcXFxcXCJhbGl5dW5fcGxheU1vZGVcXFxcXFxcIiwgXFxcXFxcXCLovaznoIFcXFxcXFxcIik7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBhbGlBY2Nlc3NBcGkgPSBBbGlBY2Nlc3NBcGkuY3JlYXRlRGVmYXVsdChzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVUb2tlbiwgYWxpVG9rZW4pO1xcXFxuICAgICAgICAgICAgaWYgKHBsYXlNb2RlID09PSBcXFxcXFxcIui9rOeggVxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgcGxheUxpc3QgPSBnZXRWaWRlbyhhbGlBY2Nlc3NBcGksIGZpbGVJZCkgfHwge307XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHBsYXlMaXN0ID0gZ2V0T3JpVmlkZW8oYWxpQWNjZXNzQXBpLCBmaWxlSWQpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBsb2coXFxcXFxcXCIjXFxcXFxcXCIgKyBwbGF5TW9kZSArIFxcXFxcXFwi5pKt5pS+5aSx6LSlI1xcXFxcXFxcbumUmeivr+S/oeaBrz5cXFxcXFxcIiArIGUudG9TdHJpbmcoKSArIFxcXFxcXFwiXFxcXFxcXFxu6ZSZ6K+v6KGMPlxcXFxcXFwiICsgZS5saW5lTnVtYmVyKTtcXFxcbiAgICAgICAgICAgIGlmIChlLmNvZGUgPT09IFxcXFxcXFwiSW52YWxpZFBhcmFtZXRlci5SZWZyZXNoVG9rZW5cXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIHRvYXN0KFxcXFxcXFwi55m76ZmG6L+H5pyf77yM6K+36YeN5paw55m76ZmGXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/bm9SZWZyZXNoPTFcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5jb2RlID09PSBcXFxcXFxcIlF1b3RhRXhoYXVzdGVkLkRyaXZlXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+e9keebmOepuumXtOS4jei2s++8jOaXoOazleaSreaUvuivt+a4heeQhuOAglxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbGV0IGVycm9yQ291bnQgPSBOdW1iZXIoZ2V0TXlWYXIoXFxcXFxcXCJlcnJvckNvdW50XFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKSk7XFxcXG4gICAgICAgICAgICBpZiAoKytlcnJvckNvdW50ID49IDQpIHtcXFxcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXFxcXFwiZXJyb3JDb3VudFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJChcXFxcXFxcIuajgOa1i+WIsOaSreaUvui/nue7reWksei0pe+8jOaYr+WQpui/m+WFpemHjee9ruW8leWvvOOAglxcXFxcXFxcbiPov5nkuI3mmK/nmb7liIbnmb7op6PlhrPpl67popgjXFxcXFxcXCIpLmNvbmZpcm0oKCk9PlxcXFxcXFwiaGlrZXI6Ly9wYWdlL0Jvb3RSZXNldCNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiZXJyb3JDb3VudFxcXFxcXFwiLCBlcnJvckNvdW50ICsgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+aSreaUvuWksei0pe+8jOmUmeivr+S/oeaBr+W3suaJk+WNsOOAglxcXFxcXFxcbuivt+afpeeci+aXpeW/lyhMT0cpXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgY2xlYXJNeVZhcihcXFxcXFxcImVycm9yQ291bnRcXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCBtb3VudHN1YiA9IHN0b3JhZ2UwLmdldE15VmFyKCdtb3VudHppbXUnLCB7fSk7XFxcXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhtb3VudHN1YikubGVuZ3RoID4gMCkge1xcXFxuICAgICAgICAgICAgemltdSA9IG1vdW50c3ViO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBzdWJ0aXRsZTtcXFxcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHppbXUgfHwge30pLmxlbmd0aCA+IDAgJiYgcGxheUxpc3QgJiYgcGxheUxpc3QudXJscyAmJiBwbGF5TGlzdC51cmxzLmxlbmd0aCA+IDApIHtcXFxcbiAgICAgICAgICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAoMTAwKTtcXFxcbiAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgdmFyIHptdXJsID0gYWxpQWNjZXNzQXBpLmdldEZpbGVUb0Rvd25VcmwoemltdS5maWxlX2lkKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcGF0aCA9ICdoaWtlcjovL2ZpbGVzL2NhY2hlL+S6keebmOWQmy9zdWIuJyArIHppbXUuZXh0O1xcXFxuICAgICAgICAgICAgICAgIGRvd25sb2FkRmlsZSh6bXVybCwgcGF0aCwge1xcXFxuICAgICAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJ1xcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gZ2V0UGF0aChwYXRoKTtcXFxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICB0b2FzdChcXFxcXFxcIuWtl+W5leWKoOi9veWksei0pVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBsb2coZS5tZXNzYWdlKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgZG1saXN0ID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcXFxcXCJkbWxpc3RcXFxcXFxcIiwgW10pO1xcXFxuICAgICAgICBsZXQgZG1saXN0X2NhY2hlID0gZ2V0TXlWYXIoXFxcXFxcXCJkbWxpc3RfY2FjaGVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgIGlmIChkbWxpc3RfY2FjaGUgJiYgZG1saXN0X2NhY2hlLnN0YXJ0c1dpdGgoZmlsZUlkICsgXFxcXFxcXCIjXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICBwbGF5TGlzdC5kYW5tdSA9IGRtbGlzdF9jYWNoZS5yZXBsYWNlKGZpbGVJZCArIFxcXFxcXFwiI1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChkbWxpc3QubGVuZ3RoID4gMCkge1xcXFxuICAgICAgICAgICAgcGxheUxpc3QuZGFubXUgPSBcXFxcXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvZGFubXUvXFxcXFxcXCIgKyBkbWxpc3Quc3BsaWNlKDAsIDEpWzBdO1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCJkbWxpc3RfY2FjaGVcXFxcXFxcIiwgZmlsZUlkICsgXFxcXFxcXCIjXFxcXFxcXCIgKyBwbGF5TGlzdC5kYW5tdSk7XFxcXG4gICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFxcXFxcImRtbGlzdFxcXFxcXFwiLCBkbWxpc3QpO1xcXFxuICAgICAgICAgICAgaWYgKGRtbGlzdC5sZW5ndGggPT09IDApIHtcXFxcbiAgICAgICAgICAgICAgICB0b2FzdChcXFxcXFxcIuW8ueW5leWIl+ihqOW3suWFqOmDqOaMgui9vVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHBsYXlMaXN0LmRhbm11ID0gZ2V0VmFyKFxcXFxcXFwiZG1fc2hhcmVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcGxheUxpc3Quc3VidGl0bGUgPSBzdWJ0aXRsZTtcXFxcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlMaXN0KTtcXFxcbiAgICB9XFxcXG5cXFxcbiAgICBsZXQgYWxpQWNjZXNzQXBpID0gQWxpQWNjZXNzQXBpLmNyZWF0ZURlZmF1bHQoc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIGFsaVRva2VuLCBudWxsKTtcXFxcbiAgICBsZXQgdXJsID0gYWxpQWNjZXNzQXBpLmdldEZpbGVUb0Rvd25VcmwoZmlsZUlkKTtcXFxcblxcXFxuICAgIGlmIChjYXRlID09PSBcXFxcXFxcImltYWdlXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgcmV0dXJuIHVybCArIFxcXFxcXFwiIy5qcGdcXFxcXFxcIjtcXFxcbiAgICB9IGVsc2UgaWYgKGNhdGUgPT09IFxcXFxcXFwiYXVkaW9cXFxcXFxcIikge1xcXFxuICAgICAgICByZXR1cm4gdXJsICsgXFxcXFxcXCIjaXNNdXNpYz10cnVlI1xcXFxcXFwiO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImRvd25sb2FkOi8vXFxcXFxcXCIgKyB1cmw7XFxcXG4gICAgfVxcXFxufVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIumYv+mHjOWIl+ihqFxcXCIsXFxcInBhdGhcXFwiOlxcXCJhbGl5dW5cXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG4vL0BhdXRob3IgTG95RGdJa1xcXFxuY29uc3QgQWxpU2hhcmVBcGkgPSAkLnJlcXVpcmUoXFxcXFxcXCJBbGlBcGlcXFxcXFxcIik7XFxcXG5cXFxcbmxldCByZWFsdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXFxcXFwicmVhbHVybFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSkuc3BsaXQoXFxcXFxcXCI/XFxcXFxcXCIpWzBdO1xcXFxubGV0IHVybERhdGEgPSByZWFsdXJsLnNwbGl0KFxcXFxcXFwiL1xcXFxcXFwiKTtcXFxcbi8vaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3Mve3NoYXJlSWR9L2ZvbGRlci97ZmlsZUlkfT87XFxcXG5cXFxcbmxldCBzaGFyZUlkID0gTVlfUEFSQU1TLnNoYXJlSWQgfHwgdXJsRGF0YVs0XTtcXFxcbmxldCBzaGFyZVB3ZCA9IGdldFBhcmFtKFxcXFxcXFwic2hhcmVQd2RcXFxcXFxcIiwgTVlfUEFSQU1TLnNoYXJlUHdkIHx8IFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxubGV0IHNoYXJlVG9rZW4gPSBnZXRQYXJhbShcXFxcXFxcInNoYXJlVG9rZW5cXFxcXFxcIiwgTVlfUEFSQU1TLnNoYXJlVG9rZW4pO1xcXFxuXFxcXG5sZXQgZmlsZUlkID0gKHVybERhdGFbNV0gPT09IFxcXFxcXFwiZm9sZGVyXFxcXFxcXCIgPyB1cmxEYXRhWzZdIDogdm9pZCAwKSB8fCBNWV9QQVJBTVMuZmlsZUlkO1xcXFxubGV0IHNlYXJjaEtleSA9IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFxcXFxcInNlYXJjaEtleVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSkgfHwgdW5kZWZpbmVkO1xcXFxubGV0IGlzU2VhcmNoID0gISFzZWFyY2hLZXk7XFxcXG5cXFxcbmxldCBwYWdlSWQgPSBTdHJpbmcoRGF0ZS5ub3coKSkuc2xpY2UoNik7XFxcXG5cXFxcbmZ1bmN0aW9uIGZvcm1hdERhdGUoX2RhdGUsIGZtdCkge1xcXFxuICAgIGxldCBkYXRlID0gIWlzTmFOKF9kYXRlKSA/IG5ldyBEYXRlKF9kYXRlICogMTAwMCkgOiBuZXcgRGF0ZShfZGF0ZSk7XFxcXG4gICAgcmV0dXJuICQuZGF0ZUZvcm1hdChkYXRlLCBmbXQgfHwgXFxcXFxcXCJ5eXl5LU1NLWRkIEhIOm1tOnNzXFxcXFxcXCIpXFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGZvcm1hdFNpemUoc2l6ZSkge1xcXFxuICAgIGlmICghc2l6ZSkge1xcXFxuICAgICAgICByZXR1cm4gJyc7XFxcXG4gICAgfVxcXFxuICAgIGNvbnN0IHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJywgJ1BCJywgJ0VCJywgJ1pCJywgJ1lCJ107XFxcXG4gICAgbGV0IGkgPSAwO1xcXFxuICAgIHdoaWxlIChzaXplID49IDEwMjQpIHtcXFxcbiAgICAgICAgc2l6ZSAvPSAxMDI0O1xcXFxuICAgICAgICBpKys7XFxcXG4gICAgfVxcXFxuICAgIHNpemUgPSBpID8gTnVtYmVyKHNpemUudG9GaXhlZCgyKSkgOiBzaXplO1xcXFxuICAgIHJldHVybiBgJHtzaXplfSAke3VuaXRzW2ldfWA7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHNldE15UGFDYWNoZShrZXksIHZhbHVlKSB7XFxcXG4gICAgTVlfUEFSQU1TW2tleV0gPSB2YWx1ZTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gc2F2ZU15UGFDYWNoZSgpIHtcXFxcbiAgICBzZXRQYWdlUGFyYW1zKE1ZX1BBUkFNUyk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHNldE1hcmtlcihtYXJrZXIpIHtcXFxcbiAgICBzZXRNeVBhQ2FjaGUoXFxcXFxcXCJtYXJrZXJcXFxcXFxcIiwgbWFya2VyKTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gc2V0VG9rZW4oc2hhcmVUb2tlbikge1xcXFxuICAgIHNldE15UGFDYWNoZShcXFxcXFxcInNoYXJlVG9rZW5cXFxcXFxcIiwgc2hhcmVUb2tlbik7XFxcXG59XFxcXG5pZihNWV9QQVJBTVMubm9QaWMpe1xcXFxuICAgIHNldFBhZ2VQaWNVcmwoKTtcXFxcbiAgICBzZXRNeVBhQ2FjaGUoXFxcXFxcXCJub1BpY1xcXFxcXFwiLCBmYWxzZSk7XFxcXG59XFxcXG4vKlxcXFxuZnVuY3Rpb24gc2V0VmlkZW9JdGVtQ2FjaGUodmlkZW9JdGVtQ2FjaGUpIHtcXFxcbiAgICBzZXRNeVBhQ2FjaGUoXFxcXFxcXCJ2aWRlb0l0ZW1DYWNoZVxcXFxcXFwiLCB2aWRlb0l0ZW1DYWNoZSk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHNldFN1YnRpdGxlQ2FjaGUoc3VidGl0bGVDYWNoZSkge1xcXFxuICAgIHNldE15UGFDYWNoZShcXFxcXFxcInN1YnRpdGxlQ2FjaGVcXFxcXFxcIiwgc3VidGl0bGVDYWNoZSk7XFxcXG59Ki9cXFxcblxcXFxubGV0IGljb25UeXBlID0gXFxcXFxcXCJhaXxhcGt8YXZpfGNzc3xkbWd8ZXhlfGZsdnxnaWZ8aGlrZXJ8aHRtbHxpc298anBnfGpzfGpzb258bG9nfG1vdnxtcDN8bXA0fG90ZnxwaHB8cG5nfHBwdHxwc2R8dGFibGV8dHh0fHdhdnx4bHN8emlwfGNzc3xkb2N8ZXB1YnxleGN8aHRtfHhsc3hcXFxcXFxcIi5zcGxpdCgnfCcpO1xcXFxuXFxcXG5mdW5jdGlvbiBnZXRJY29uKGV4dCwgdHlwZSkge1xcXFxuICAgIGxldCByb290ID0gXFxcXFxcXCJodHRwczovL2dpdGNvZGUubmV0L3FxXzMyMzk0MzUxL2RyLy0vcmF3L21hc3Rlci9pbWcv5paH5Lu257G75Z6LMi9cXFxcXFxcIjtcXFxcbiAgICBpZiAodHlwZSA9PT0gXFxcXFxcXCJmb2xkZXJcXFxcXFxcIikge1xcXFxuICAgICAgICByZXR1cm4gcm9vdCArIFxcXFxcXFwi5paH5Lu25aS5LnN2Z1xcXFxcXFwiO1xcXFxuICAgIH1cXFxcbiAgICBpZiAoaWNvblR5cGUuaW5jbHVkZXMoKGV4dCB8fCBcXFxcXFxcIlxcXFxcXFwiKS50b0xvd2VyQ2FzZSgpKSkge1xcXFxuICAgICAgICByZXR1cm4gcm9vdCArIGV4dCArIFxcXFxcXFwiLnN2Z1xcXFxcXFwiO1xcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gcm9vdCArIFxcXFxcXFwi5paH5Lu2LnN2Z1xcXFxcXFwiO1xcXFxuXFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGxvYWQoaXRlbXMpIHtcXFxcbiAgICBsZXQgYWxpU2hhcmVBcGkgPSBuZXcgQWxpU2hhcmVBcGkoc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIChzaGFyZVRva2VuKSA9PiB7XFxcXG4gICAgICAgIHNldFRva2VuKHNoYXJlVG9rZW4pO1xcXFxuICAgICAgICBNWV9QQVJBTVMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW47XFxcXG4gICAgfSk7XFxcXG4gICAgbGV0IG9yZGVycyA9IHtcXFxcbiAgICAgICAgXFxcXFxcXCLlkI3np7DmraPluo9cXFxcXFxcIjogXFxcXFxcXCJuYW1lI0FTQ1xcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcIuWQjeensOWAkuW6j1xcXFxcXFwiOiBcXFxcXFxcIm5hbWUjREVTQ1xcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcIuaXtumXtOato+W6j1xcXFxcXFwiOiBcXFxcXFxcInVwZGF0ZWRfYXQjQVNDXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwi5pe26Ze05YCS5bqPXFxcXFxcXCI6IFxcXFxcXFwidXBkYXRlZF9hdCNERVNDXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwi5aSn5bCP5q2j5bqPXFxcXFxcXCI6IFxcXFxcXFwic2l6ZSNBU0NcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCLlpKflsI/lgJLluo9cXFxcXFxcIjogXFxcXFxcXCJzaXplI0RFU0NcXFxcXFxcIlxcXFxuICAgIH07XFxcXG4gICAgbGV0IG9yZGVyc0tleXMgPSBPYmplY3Qua2V5cyhvcmRlcnMpO1xcXFxuICAgIGxldCBvcmRlck5hbWUgPSBnZXRJdGVtKFxcXFxcXFwiYWxpeXVuX29yZGVyXFxcXFxcXCIsIG9yZGVyc0tleXNbMF0pO1xcXFxuICAgIGxldCBvcmRlciA9IG9yZGVyc1tvcmRlck5hbWVdLnNwbGl0KFxcXFxcXFwiI1xcXFxcXFwiKTtcXFxcbiAgICBsZXQgc3R5bGVzID0gW1xcXFxcXFwidGV4dF8xXFxcXFxcXCIsIFxcXFxcXFwibW92aWVfMlxcXFxcXFwiLCBcXFxcXFxcImNhcmRfcGljXzNcXFxcXFxcIiwgXFxcXFxcXCJhdmF0YXJcXFxcXFxcIiwgXFxcXFxcXCLov73liadcXFxcXFxcIl07XFxcXG4gICAgbGV0IHN0eWxlID0gZ2V0SXRlbShcXFxcXFxcImFsaXl1bl9zdHlsZVxcXFxcXFwiLCBzdHlsZXNbMF0pO1xcXFxuICAgIGlmIChNWV9QQUdFID09PSAxKSB7XFxcXG4gICAgICAgIGlmICghZ2V0TXlWYXIoXFxcXFxcXCJtb3VudHppbXVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXFxcXFwibW91bnR6aW11XFxcXFxcXCIsIHt9KTtcXFxcbiAgICAgICAgICAgIGFkZExpc3RlbmVyKFxcXFxcXFwib25DbG9zZVxcXFxcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXFxcXFwibW91bnR6aW11XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJhbGlTaGFyZVRva2VuXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGNsZWFyVmFyKFxcXFxcXFwiZG1fc2hhcmVcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgY2xlYXJNeVZhcihcXFxcXFxcImRtbGlzdFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIH0pKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBzZXRNYXJrZXIoKTtcXFxcbiAgICAgICAgaWYgKHJlYWx1cmwgJiYgIWlzU2VhcmNoKSB7XFxcXG4gICAgICAgICAgICBsZXQgc2hhcmVJbmZvID0gYWxpU2hhcmVBcGkuZ2V0U2hhcmVJbmZvKCk7XFxcXG5cXFxcbiAgICAgICAgICAgIGxldCBmaWxlSW5mbyA9IHNoYXJlSW5mby5maWxlX2luZm9zO1xcXFxuICAgICAgICAgICAgaWYgKGZpbGVJbmZvLmxlbmd0aCA9PT0gMSAmJiBmaWxlSW5mb1swXS50eXBlID09PSBcXFxcXFxcImZvbGRlclxcXFxcXFwiICYmICFmaWxlSWQpIHtcXFxcbiAgICAgICAgICAgICAgICBmaWxlSWQgPSBmaWxlSW5mb1swXS5maWxlX2lkO1xcXFxuICAgICAgICAgICAgICAgIHNldFBhZ2VUaXRsZShmaWxlSW5mb1swXS5maWxlX25hbWUpO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICBzZXRQYWdlVGl0bGUoc2hhcmVJbmZvLnNoYXJlX25hbWUpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbGV0IGRlYWRsaW5lID0gXFxcXFxcXCLmsLjkuYXmnInmlYhcXFxcXFxcIjtcXFxcblxcXFxuICAgICAgICAgICAgaWYgKHNoYXJlSW5mby5leHBpcmF0aW9uKSB7XFxcXG4gICAgICAgICAgICAgICAgZGVhZGxpbmUgPSBcXFxcXFxcIuacieaViOiHs++8mlxcXFxcXFwiICsgZm9ybWF0RGF0ZShzaGFyZUluZm8uZXhwaXJhdGlvbik7XFxcXG4gICAgICAgICAgICAgICAgLy9zaGFyZUluZm8udXBkYXRlZF9hdFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IChzaGFyZUluZm8uY3JlYXRvcl9uYW1lIHx8IHNoYXJlSW5mby5jcmVhdG9yX3Bob25lKSArIFxcXFxcXFwiJm5ic3A7Jm5ic3A7XFxcXFxcXCIgKyBkZWFkbGluZS5zbWFsbCgpLFxcXFxuICAgICAgICAgICAgICAgIHVybDogcmVhbHVybCArIFxcXFxcXFwiI25vSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBpbWc6IHNoYXJlSW5mby5hdmF0YXJ8fFxcXFxcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl91bmtub3duXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYXZhdGFyXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmICghaXNTZWFyY2gpIHtcXFxcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuaQnOe0olxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHVybDogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQudHJpbSgpO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ivt+i+k+WFpeWFs+mUruivjVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL3BhZ2UvYWxpeXVuI25vSGlzdG9yeSMjZnVsbFRoZW1lIz9wYWdlPWZ5cGFnZSZzZWFyY2hLZXk9XFxcXFxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoaW5wdXQpO1xcXFxuICAgICAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkLFxcXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZUlkOiBzaGFyZUlkLFxcXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVRva2VuOiBzaGFyZVRva2VuXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLigJzigJxcXFxcXFxcIiArIHNlYXJjaEtleSArIFxcXFxcXFwi4oCd4oCd55qE5pCc57Si57uT5p6cXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IGZ1blN0eWxlID0gaXNTZWFyY2ggPyBcXFxcXFxcImljb25fc21hbGxfM1xcXFxcXFwiIDogXFxcXFxcXCJpY29uX3JvdW5kX3NtYWxsXzRcXFxcXFxcIjtcXFxcbiAgICAgICAgaXRlbXMucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogc3R5bGUsXFxcXG4gICAgICAgICAgICB1cmw6ICQoc3R5bGVzLCAxLCBcXFxcXFxcIuaOkuW4g+agt+W8j1xcXFxcXFwiKS5zZWxlY3QoKCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJhbGl5dW5fc3R5bGVcXFxcXFxcIiwgaW5wdXQpO1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7LliIfmjaJcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IGZ1blN0eWxlLFxcXFxuICAgICAgICAgICAgcGljX3VybDogXFxcXFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2FsaV9pY29uLnN2Z1xcXFxcXFwiXFxcXG4gICAgICAgIH0sIHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBvcmRlck5hbWUsXFxcXG4gICAgICAgICAgICB1cmw6ICQob3JkZXJzS2V5cywgMiwgXFxcXFxcXCLmjpLluo/mlrnlvI9cXFxcXFxcIikuc2VsZWN0KCgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwiYWxpeXVuX29yZGVyXFxcXFxcXCIsIGlucHV0KTtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5YiH5o2i5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBmdW5TdHlsZSxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9hbGlfc29ydC5zdmdcXFxcXFxcIlxcXFxuICAgICAgICB9LCB7XFxcXG4gICAgICAgICAgICB0aXRsZTogZ2V0SXRlbShcXFxcXFxcImFsaXl1bl9wbGF5TW9kZVxcXFxcXFwiLCBcXFxcXFxcIui9rOeggVxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgIHVybDogJChbXFxcXFxcXCLovaznoIFcXFxcXFxcIiwgXFxcXFxcXCLljp/nlLtcXFxcXFxcIl0sIDIsIFxcXFxcXFwi5pKt5pS+5qih5byPXFxcXFxcXCIpLnNlbGVjdCgoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcImFsaXl1bl9wbGF5TW9kZVxcXFxcXFwiLCBpbnB1dCk7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIh+aNouaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogZnVuU3R5bGUsXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvYWxpX3BsYXkuc3ZnXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGlmICghaXNTZWFyY2gpIHtcXFxcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuWKn+iDvVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHVybDogJChbXFxcXFxcXCLovazlrZjkupHnm5hcXFxcXFxcIiwgXFxcXFxcXCLnmbvpmYbotKblj7dcXFxcXFxcIiwgXFxcXFxcXCLlpI3liLbliIbkuqvpk77mjqVcXFxcXFxcIiwgXFxcXFxcXCLmn6XnnIvmiYvliqjmjILovb3lrZfluZVcXFxcXFxcIiwgXFxcXFxcXCLojrflj5blvLnluZXmkJzntKLop4TliJlcXFxcXFxcIiwgXFxcXFxcXCLmibnph4/mjILovb3mnKzlnLDlvLnluZVcXFxcXFxcIiwgXFxcXFxcXCLmjqjpgIHliLBUVkJveFxcXFxcXFwiLCBcXFxcXFxcIuiuvue9ruaUtuiXj+WwgemdolxcXFxcXFwiXSwgMiwgXFxcXFxcXCLmm7TlpJrlip/og71cXFxcXFxcIikuc2VsZWN0KChzaGFyZUlkLCBzaGFyZVB3ZCwgZmlsZUlkKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5wdXQpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcXFxcXCLovazlrZjkupHnm5hcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYHNtYXJ0ZHJpdmU6Ly9zaGFyZS9icm93c2U/c2hhcmVJZD0ke3NoYXJlSWR9JnNoYXJlUHdkPSR7c2hhcmVQd2R8fFxcXFxcXFwiXFxcXFxcXCJ9YDtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcXFxcXCLnmbvpmYbotKblj7dcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL3BhZ2UvbG9naW4jbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXFxcXFwi5aSN5Yi25YiG5Lqr6ZO+5o6lXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoW1xcXFxcXFwi5aSN5Yi26ZO+5o6lXFxcXFxcXCIsIFxcXFxcXFwi5aSN5Yi25rW36ZiU5Y+j5LukXFxcXFxcXCJdLCAxLCBcXFxcXFxcIuWIhuS6q+aWueW8j1xcXFxcXFwiKS5zZWxlY3QoKHVybCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT09IFxcXFxcXFwi5aSN5Yi26ZO+5o6lXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImNvcHk6Ly9cXFxcXFxcIiArIHVybDtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImNvcHk6Ly/pmL/ph4zkupHnm5jliIbkuqvlj6Pku6TjgIxcXFxcXFxcIiArIGdldFBhZ2VUaXRsZSgpICsgXFxcXFxcXCLjgI1cXFxcXFxcXG5cXFxcXFxcIiArIHVybCArIFxcXFxcXFwiIEBpbXBvcnQ9anM6YGhpa2VyOi8vcGFnZS9hbGl5dW4/cmVhbHVybD0ke2lucHV0LnRyaW0oKX0mcnVsZT3kupHnm5jlkJsu566AYDtcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFxcXFxcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvXFxcXFxcXCIgKyBzaGFyZUlkICsgKGZpbGVJZCA/IFxcXFxcXFwiL2ZvbGRlci9cXFxcXFxcIiArIGZpbGVJZCA6IFxcXFxcXFwiXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcXFxcXCLmibnph4/mjILovb3mnKzlnLDlvLnluZVcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL3BhZ2UvZG1Nb3VudCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcXFxcXCLmn6XnnIvmiYvliqjmjILovb3lrZfluZVcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgem0gPSBzdG9yYWdlMC5nZXRNeVZhcihcXFxcXFxcIm1vdW50emltdVxcXFxcXFwiLCB7fSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpcCA9IHptLm5hbWUgPyBcXFxcXFxcIuW9k+WJjeWtl+W5leaWh+S7tlxcXFxcXFxcblxcXFxcXFwiICsgem0ubmFtZSArIFxcXFxcXFwiLlxcXFxcXFwiICsgem0uZXh0IDogXFxcXFxcXCLov5jmnKrmiYvliqjmjILovb3lrZfluZVcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfmiYvliqjmjILovb3lrZfluZUnLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB0aXAgKyBcXFxcXFxcIlxcXFxcXFxcbijngrnlh7vlj5bmtojlj6/ku6XmuIXpmaTmjILovb3lrZfluZUpXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbDogKCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihcXFxcXFxcIm1vdW50emltdVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey5riF6Zmk5omL5Yqo5oyC6L295a2X5bmVXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXFxcXFwi6I635Y+W5by55bmV5pCc57Si6KeE5YiZXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwianNcXFxcXFxcIjogSlNPTi5zdHJpbmdpZnkoXFxcXFxcXCJoaWtlcjovL3BhZ2UvbG9hZERtP3J1bGU9XFxcXFxcXCIgKyBNWV9SVUxFLnRpdGxlICsgXFxcXFxcXCImdGl0bGU9XFxcXFxcXCIpICsgXFxcXFxcXCIrZW5jb2RlVVJJQ29tcG9uZW50KHBsYXlkYXRhLnRpdGxlLnNwbGl0KCctJylbMF0pO1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogTVlfUlVMRS50aXRsZSArIFxcXFxcXFwi5by55bmV5pCc57SiXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInJ1bGU6Ly9cXFxcXFxcIiArIGJhc2U2NEVuY29kZShcXFxcXFxcIu+/pXByb2plY3Rpb25fc2NyZWVu77+lXFxcXFxcXCIgKyBKU09OLnN0cmluZ2lmeShydWxlKSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXFxcXFwi5o6o6YCB5YiwVFZCb3hcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL3BhZ2UvdHZib3hQdXNoI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFxcXFxcIuiuvue9ruaUtuiXj+WwgemdolxcXFxcXFwiOlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFtcXFxcXFxcIuiuvue9ruWwgemdouWcsOWdgFxcXFxcXFwiLCBcXFxcXFxcIuaQnOe0ouWwgemdolxcXFxcXFwiXSwgMSkuc2VsZWN0KCgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFxcXFxcIuiuvue9ruWwgemdouWcsOWdgFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChcXFxcXFxcIlxcXFxcXFwiLCBcXFxcXFxcIuivt+i+k+WFpeWbvueJh+WcsOWdgFxcXFxcXFwiKS5pbnB1dCgoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC50cmltKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/or7fovpPlhaXlnLDlnYBcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQYWdlUGljVXJsKGlucHV0KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL3BhZ2UvZnJvbnRDb3ZlciNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSwgc2hhcmVJZCwgc2hhcmVQd2QsIGZpbGVJZCksXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl9yb3VuZF9zbWFsbF80XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogXFxcXFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2FsaV9maWxlaW50by5zdmdcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBwYWdlSWQ6IHBhZ2VJZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBmaWxlSWQsXFxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlSWQ6IHNoYXJlSWQsXFxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlVG9rZW46IHNoYXJlVG9rZW4sXFxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkOiBzaGFyZVB3ZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgZm9sZGVyTmFtZTogZ2V0UGFnZVRpdGxlKClcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpdGVtcy5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgbGV0IHJlc2NvZCA9IHt9O1xcXFxuICAgIGxldCBtYXJrZXIgPSBNWV9QQVJBTVMubWFya2VyO1xcXFxuICAgIGlmIChpc1NlYXJjaCkge1xcXFxuICAgICAgICByZXNjb2QgPSBhbGlTaGFyZUFwaS5nZXRTZWFyY2hMaXN0RmlsZShzZWFyY2hLZXksIG1hcmtlciwgb3JkZXJbMF0sIG9yZGVyWzFdKTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICByZXNjb2QgPSBhbGlTaGFyZUFwaS5nZXRMaXN0RmlsZShmaWxlSWQsIG1hcmtlciwgb3JkZXJbMF0sIG9yZGVyWzFdKTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKHJlc2NvZC5uZXh0X21hcmtlcikge1xcXFxuICAgICAgICBzZXRNYXJrZXIocmVzY29kLm5leHRfbWFya2VyKTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICBzZXRNYXJrZXIoKTtcXFxcbiAgICB9XFxcXG5cXFxcbiAgICB2YXIgY29udHMgPSByZXNjb2QuaXRlbXM7XFxcXG4gICAgLy/lrZfluZXljLnphY3lh4blpIdcXFxcbiAgICBsZXQgc3ViRXh0cyA9IFtcXFxcXFxcInZ0dFxcXFxcXFwiLCBcXFxcXFxcInNydFxcXFxcXFwiLCBcXFxcXFxcImFzc1xcXFxcXFwiXTtcXFxcbiAgICB2YXIgemltdWxpc3QgPSBbXTtcXFxcbiAgICBjb250cy5mb3JFYWNoKChpdGVtKSA9PiB7XFxcXG4gICAgICAgIGlmIChzdWJFeHRzLmluY2x1ZGVzKGl0ZW0uZmlsZV9leHRlbnNpb24gJiYgaXRlbS5maWxlX2V4dGVuc2lvbi50b0xvd2VyQ2FzZSgpKSkge1xcXFxuICAgICAgICAgICAgbGV0IG5hbWUgPSBpdGVtLm5hbWUucmVwbGFjZSgnLicgKyBpdGVtLmZpbGVfZXh0ZW5zaW9uLCAnJyk7XFxcXG4gICAgICAgICAgICB6aW11bGlzdC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICBleHQ6IGl0ZW0uZmlsZV9leHRlbnNpb24sXFxcXG4gICAgICAgICAgICAgICAgZmlsZV9pZDogaXRlbS5maWxlX2lkLFxcXFxuICAgICAgICAgICAgICAgIG5hbWU6IG5hbWVcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgLy/lpITnkIblpLjpobXljLnphY3lrZfluZVcXFxcbiAgICAvKlxcXFxuICAgIGxldCBoYXNTdWIgPSB6aW11bGlzdC5sZW5ndGggPiAwO1xcXFxuICAgIGlmIChoYXNTdWImJnJlc2NvZC5uZXh0X21hcmtlcikge1xcXFxuICAgICAgICBpZiAoemltdWxpc3QubGVuZ3RoID4gNCkge1xcXFxuICAgICAgICAgICAgc2V0U3VidGl0bGVDYWNoZSh6aW11bGlzdC5zbGljZSgtNCkpO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgc2V0U3VidGl0bGVDYWNoZSh6aW11bGlzdCk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgbGV0IGxhc3RJdGVtID0gY29udHMuYXQoLTEpO1xcXFxuICAgIGlmIChoYXNTdWImJmxhc3RJdGVtJiZsYXN0SXRlbS5jYXRlZ29yeSA9PT0gXFxcXFxcXCJ2aWRlb1xcXFxcXFwiKSB7XFxcXG4gICAgICAgIHNldFZpZGVvSXRlbUNhY2hlKGNvbnRzLnNwbGljZShjb250cy5sZW5ndGgtMSwxKSk7XFxcXG4gICAgfVxcXFxuICAgIGlmIChNWV9QQUdFID4gMSkge1xcXFxuICAgICAgICBsZXQgc3VidGl0bGVDYWNoZSA9IE1ZX1BBUkFNUy5zdWJ0aXRsZUNhY2hlIHx8IFtdO1xcXFxuICAgICAgICB6aW11bGlzdCA9IHppbXVsaXN0LmNvbmNhdChzdWJ0aXRsZUNhY2hlKTtcXFxcbiAgICAgICAgbGV0IHZpZGVvSXRlbUNhY2hlID0gTVlfUEFSQU1TLnZpZGVvSXRlbUNhY2hlIHx8IFtdO1xcXFxuICAgICAgICBjb250cyA9IHZpZGVvSXRlbUNhY2hlLmNvbmNhdChjb250cyk7XFxcXG4gICAgICAgIHNldFN1YnRpdGxlQ2FjaGUoKTtcXFxcbiAgICAgICAgc2V0VmlkZW9JdGVtQ2FjaGUoKTtcXFxcbiAgICB9Ki9cXFxcbiAgICAvL+eugOS9k+S8mOWFiFxcXFxuICAgIHppbXVsaXN0LnNvcnQoKGEsIGIpID0+IChiLm5hbWUuZW5kc1dpdGgoXFxcXFxcXCIuc2NcXFxcXFxcIikgfHwgYi5uYW1lLmVuZHNXaXRoKFxcXFxcXFwiLmNoc1xcXFxcXFwiKSkgLSAoYS5uYW1lLmVuZHNXaXRoKFxcXFxcXFwiLnNjXFxcXFxcXCIpIHx8IGEubmFtZS5lbmRzV2l0aChcXFxcXFxcIi5jaHNcXFxcXFxcIikpKTtcXFxcbiAgICAvL2VuZFxcXFxuICAgIGxldCB0aXRsZUhlYWQgPSB7XFxcXG4gICAgICAgIHZpZGVvOiBcXFxcXFxcIvCfjqxcXFxcXFxcIixcXFxcbiAgICAgICAgYXVkaW86IFxcXFxcXFwi8J+OtVxcXFxcXFwiLFxcXFxuICAgICAgICBkb2M6IFxcXFxcXFwi8J+TkVxcXFxcXFwiLFxcXFxuICAgICAgICBpbWFnZTogXFxcXFxcXCLwn5a8XFxcXFxcXCIsXFxcXG4gICAgICAgIHppcDogXFxcXFxcXCLwn5OmXFxcXFxcXCIsXFxcXG4gICAgICAgIGZvbGRlcjogXFxcXFxcXCLwn5OCXFxcXFxcXCJcXFxcbiAgICB9O1xcXFxuXFxcXG4gICAgZnVuY3Rpb24gZ2V0SGVhZCh0eXBlLCBleHQpIHtcXFxcbiAgICAgICAgbGV0IGhlYWQgPSB0aXRsZUhlYWRbdHlwZV07XFxcXG4gICAgICAgIGlmIChzdWJFeHRzLmluY2x1ZGVzKGV4dCkpIHtcXFxcbiAgICAgICAgICAgIGhlYWQgPSBcXFxcXFxcIvCflbhcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gaGVhZCB8fCBcXFxcXFxcIuKdk1xcXFxcXFwiO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgZm9sZGVyU3R5bGUsIGZpbGVTdHlsZSwgaXNXYXRjaGluZyA9IHN0eWxlID09PSBcXFxcXFxcIui/veWJp1xcXFxcXFwiO1xcXFxuICAgIGlmIChpc1dhdGNoaW5nKSB7XFxcXG4gICAgICAgIGZvbGRlclN0eWxlID0gXFxcXFxcXCJhdmF0YXJcXFxcXFxcIjtcXFxcbiAgICAgICAgZmlsZVN0eWxlID0gXFxcXFxcXCJtb3ZpZV8yXFxcXFxcXCI7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgZm9sZGVyU3R5bGUgPSBmaWxlU3R5bGUgPSBzdHlsZTtcXFxcbiAgICB9XFxcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250cy5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgICBsZXQgZmlsZUl0ZW0gPSBjb250c1tpXTtcXFxcbiAgICAgICAgbGV0IGNhdGUgPSBmaWxlSXRlbS5jYXRlZ29yeTtcXFxcbiAgICAgICAgbGV0IGRlc2MgPSBmb3JtYXREYXRlKGZpbGVJdGVtLnVwZGF0ZWRfYXQpO1xcXFxuICAgICAgICBsZXQgcGljX3VybCA9IGdldEljb24oZmlsZUl0ZW0uZmlsZV9leHRlbnNpb24sIGZpbGVJdGVtLnR5cGUpO1xcXFxuXFxcXG4gICAgICAgIGlmIChmaWxlSXRlbS50eXBlID09PSBcXFxcXFxcImZvbGRlclxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSAoZm9sZGVyU3R5bGUgPT09IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIgPyB0aXRsZUhlYWQuZm9sZGVyIDogXFxcXFxcXCJcXFxcXFxcIikgKyBmaWxlSXRlbS5uYW1lO1xcXFxuICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcXFxuICAgICAgICAgICAgICAgIHVybDogJ2hpa2VyOi8vcGFnZS9hbGl5dW4/cGFnZT1meXBhZ2UnLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBmb2xkZXJTdHlsZSxcXFxcbiAgICAgICAgICAgICAgICBkZXNjOiBmb3JtYXREYXRlKGZpbGVJdGVtLnVwZGF0ZWRfYXQpLFxcXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IHBpY191cmwsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVJZDogc2hhcmVJZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVUb2tlbjogTVlfUEFSQU1TLnNoYXJlVG9rZW4sXFxcXG4gICAgICAgICAgICAgICAgICAgIGZpbGVJZDogZmlsZUl0ZW0uZmlsZV9pZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkLFxcXFxuICAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IGZpbGVJdGVtLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgICAgIG5vUGljOiB0cnVlXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBsZXQgc3VidGl0bGUsIGxvbmdjLCBjbHM7XFxcXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSAoZmlsZVN0eWxlID09PSBcXFxcXFxcInRleHRfMVxcXFxcXFwiID8gZ2V0SGVhZChjYXRlLCBmaWxlSXRlbS5maWxlX2V4dGVuc2lvbikgOiBcXFxcXFxcIlxcXFxcXFwiKSArIGZpbGVJdGVtLm5hbWU7XFxcXG4gICAgICAgICAgICBsZXQgbmFtZU5vdEV4dCA9IGZpbGVJdGVtLm5hbWUucmVwbGFjZSgnLicgKyBmaWxlSXRlbS5maWxlX2V4dGVuc2lvbiwgJycpO1xcXFxuICAgICAgICAgICAgaWYgKHN1YkV4dHMuaW5jbHVkZXMoZmlsZUl0ZW0uZmlsZV9leHRlbnNpb24pKSB7XFxcXG4gICAgICAgICAgICAgICAgbG9uZ2MgPSBbe1xcXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLmjILovb3lrZfluZVcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHptKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcignbW91bnR6aW11Jywgem0pO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+aMgui9veWujOaIkO+8jOW9k+WJjeWtl+W5leaWh+S7tjogJyArIHptLm5hbWUgKyAnLicgKyB6bS5leHQ7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dDogZmlsZUl0ZW0uZmlsZV9leHRlbnNpb24sXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2lkOiBmaWxlSXRlbS5maWxlX2lkLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZU5vdEV4dFxcXFxuICAgICAgICAgICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgICAgICB9XTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlmIChjYXRlID09PSBcXFxcXFxcInZpZGVvXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICBpZiAoemltdWxpc3QubGVuZ3RoKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gemltdWxpc3QuZmluZCh2ID0+IHYubmFtZS5pbmNsdWRlcyhuYW1lTm90RXh0KSk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGNscyA9IFxcXFxcXFwicGxheWxpc3QgdlxcXFxcXFwiICsgcGFnZUlkO1xcXFxuICAgICAgICAgICAgICAgIHBpY191cmwgPSBmaWxlSXRlbS50aHVtYm5haWwgfHwgcGljX3VybDtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNXYXRjaGluZykge1xcXFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgICAgICBpZiAoZmlsZVN0eWxlID09PSBcXFxcXFxcInRleHRfMVxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgZGVzYyArPSBcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFwiICsgZm9ybWF0U2l6ZShmaWxlSXRlbS5zaXplKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9QcmUjXFxcXFxcXCIpLmxhenlSdWxlKChzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVUb2tlbiwgZmlsZUlkLCBjYXRlLCBzdWJ0aXRsZSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2FsaWxhenlcXFxcXFxcIikoc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIGZpbGVJZCwgY2F0ZSwgc3VidGl0bGUpO1xcXFxuICAgICAgICAgICAgICAgIH0sIHNoYXJlSWQsIHNoYXJlUHdkLCBNWV9QQVJBTVMuc2hhcmVUb2tlbiwgZmlsZUl0ZW0uZmlsZV9pZCwgY2F0ZSwgc3VidGl0bGUpLFxcXFxuICAgICAgICAgICAgICAgIGRlc2M6IGRlc2MsXFxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogcGljX3VybCxcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZDogZmlsZUl0ZW0uZmlsZV9pZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBsb25nYyxcXFxcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBjbHMsXFxcXG4gICAgICAgICAgICAgICAgICAgIC8vaW5oZXJpdFRpdGxlOiBmYWxzZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBmaWxlSXRlbS5uYW1lXFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogZmlsZVN0eWxlXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBpZiAoY29udHMubGVuZ3RoID09PSAwKSB7XFxcXG4gICAgICAgIGl0ZW1zLnB1c2goe1xcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgXFxcXFxcXCJ+fn7ku4DkuYjpg73msqHmnInkuoblk6Z+fn5cXFxcXFxcIi5mb250Y29sb3IoXFxcXFxcXCJHcmF5XFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxubGV0IGl0ZW1zID0gW107XFxcXG50cnkge1xcXFxuICAgIGlmIChNWV9QQUdFID4gMSAmJiAhTVlfUEFSQU1TLm1hcmtlcikge1xcXFxuICAgICAgICBpdGVtcy5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIFxcXFxcXFwifn5+5LuA5LmI6YO95rKh5pyJ5LqG5ZOmfn5+XFxcXFxcXCIuZm9udGNvbG9yKFxcXFxcXFwiR3JheVxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICBsb2FkKGl0ZW1zKTtcXFxcbiAgICB9XFxcXG59IGNhdGNoIChlKSB7XFxcXG4gICAgaWYgKGUubmFtZSA9PT0gXFxcXFxcXCJBbGlFcnJvclxcXFxcXFwiKSB7XFxcXG4gICAgICAgIGlmIChlLmNvZGUgPT09IFxcXFxcXFwiSW52YWxpZFJlc291cmNlLlNoYXJlUHdkXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuivt+i+k+WFpeaPkOWPlueggVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGRlc2M6IHNoYXJlUHdkID8gXFxcXFxcXCLigJzigJzmj5Dlj5bnoIHplJnor6/igJ3igJ1cXFxcXFxcIiA6IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKCkuaW5wdXQoKE1ZX1BBUkFNUykgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBzZXRQYWdlUGFyYW1zKE9iamVjdC5hc3NpZ24oe30sIE1ZX1BBUkFNUywge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IGlucHV0XFxcXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICB9LCBNWV9QQVJBTVMpLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIlxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBpZiAoZS5zaWduaWZpY2FuY2UgPT09IDEpIHtcXFxcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBlLm1lc3NhZ2UuYmlnKCkuYmlnKCkuZm9udGNvbG9yKFxcXFxcXFwicmVkXFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChlLnNpZ25pZmljYW5jZSA9PT0gMykge1xcXFxuICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIGUubWVzc2FnZS5iaWcoKS5mb250Y29sb3IoXFxcXFxcXCJncmVlblxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG5cXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICBsb2coXFxcXFxcXCLliJfooajliqDovb3lpLHotKUjXFxcXFxcXFxu6ZSZ6K+v5L+h5oGvPlxcXFxcXFwiICsgZS50b1N0cmluZygpICsgXFxcXFxcXCJcXFxcXFxcXG7plJnor6/ooYw+XFxcXFxcXCIgKyBlLmxpbmVOdW1iZXIpO1xcXFxuICAgICAgICBpdGVtcy5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiAn5qyn5qyn77yM5oql6ZSZ5LqG44CC5Zyo5Yi35paw5Yeg5qyh77yf5oiW6ICF5pu05o2i5paH5Lu25aS544CCJyxcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBkZXNjOiBlLnRvU3RyaW5nKCksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICAvL3Rocm93IGU7XFxcXG4gICAgfVxcXFxufVxcXFxuc2F2ZU15UGFDYWNoZSgpO1xcXFxuc2V0UmVzdWx0KGl0ZW1zKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLnmbvlvZXotKblj7dcXFwiLFxcXCJwYXRoXFxcIjpcXFwibG9naW5cXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG52YXIgZCA9IFtdO1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi55m75b2V6Zi/6YeM5LqR55uYXFxcXFxcXCIpO1xcXFxubGV0IGxvZ2luVXJscyA9IFtcXFxcXFxcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zaWduXFxcXFxcXCIsIFxcXFxcXFwiaHR0cHM6Ly9hdXRoLmFsaXl1bmRyaXZlLmNvbS92Mi9vYXV0aC9hdXRob3JpemU/bG9naW5fdHlwZT1jdXN0b20mcmVzcG9uc2VfdHlwZT1jb2RlJnJlZGlyZWN0X3VyaT1odHRwcyUzQSUyRiUyRnd3dy5hbGl5dW5kcml2ZS5jb20lMkZzaWduJTJGY2FsbGJhY2smY2xpZW50X2lkPTI1ZHpYM3ZiWXFrdFZ4eVgmc3RhdGU9JTdCJTIyb3JpZ2luJTIyJTNBJTIyKiUyMiU3RCMvbG9naW5cXFxcXFxcIl07XFxcXG5sZXQgaW5kZXggPSBOdW1iZXIoZ2V0UGFyYW0oXFxcXFxcXCJpbmRleFxcXFxcXFwiLCBcXFxcXFxcIjFcXFxcXFxcIikpO1xcXFxuaWYgKE51bWJlci5pc05hTihpbmRleCkpIHtcXFxcbiAgICBpbmRleCA9IDE7XFxcXG59XFxcXG5sZXQgdXJsID0gbG9naW5VcmxzW2luZGV4XTtcXFxcbmxldCBpc1JlZnJlc2ggPSAhZ2V0UGFyYW0oXFxcXFxcXCJub1JlZnJlc2hcXFxcXFxcIik7XFxcXG5sZXQgYWxpVG9rZW5zRmlsZXBhdGg9ICQucmVxdWlyZShcXFxcXFxcInRva2VuUGF0aFxcXFxcXFwiKS5hbGlUb2tlbnNGaWxlcGF0aDtcXFxcblxcXFxudmFyIGpzID0gJC50b1N0cmluZygoaXNSZWZyZXNoLCBhbGlUb2tlbnNGaWxlcGF0aCkgPT4ge1xcXFxuICAgIHNldEludGVydmFsKCgpID0+IHtcXFxcbiAgICAgICAgdmFyIHRva2VuID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9rZW4nKSk7XFxcXG4gICAgICAgIGlmICh0b2tlbiAmJiB0b2tlbi51c2VyX2lkKSB7XFxcXG4gICAgICAgICAgICBsZXQgdG9rZW5fdXJsID0gYWxpVG9rZW5zRmlsZXBhdGg7XFxcXG4gICAgICAgICAgICBmeV9icmlkZ2VfYXBwLndyaXRlRmlsZSh0b2tlbl91cmwsIEpTT04uc3RyaW5naWZ5KHRva2VuKSk7XFxcXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcXFxcbiAgICAgICAgICAgIGZ5X2JyaWRnZV9hcHAuYmFjayhpc1JlZnJlc2gpO1xcXFxuICAgICAgICAgICAgZnlfYnJpZGdlX2FwcC50b2FzdCgnVE9LRU7ojrflj5bmiJDlip/vvIzor7fli7/ms4TmvI/kuKrkurrpmpDnp4HvvIHvvIHvvIEnKTtcXFxcbiAgICAgICAgICAgIHJldHVybjtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sIDMwMCk7XFxcXG59LCBpc1JlZnJlc2gsIGFsaVRva2Vuc0ZpbGVwYXRoKTtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICB1cmw6IHVybCxcXFxcbiAgICBjb2xfdHlwZTogJ3g1X3dlYnZpZXdfc2luZ2xlJyxcXFxcbiAgICBkZXNjOiAnMTAwJSYmZmxvYXQnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGNhbkJhY2s6IGZhbHNlLFxcXFxuICAgICAgICBqczoganMsXFxcXG4gICAgICAgIHVybEludGVyY2VwdG9yOiAkLnRvU3RyaW5nKCgpID0+IHRydWUpXFxcXG4gICAgfVxcXFxufSk7XFxcXG5zZXRSZXN1bHQoZCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi6Zi/6YeM5YiX6KGoQVBJXFxcIixcXFwicGF0aFxcXCI6XFxcIkFsaUFwaVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbi8vQGF1dGhvciBMb3lEZ0lrXFxcXG5mdW5jdGlvbiBBbGlFcnJvcihlcnJvckNvZGUsIG1lc3NhZ2UsIHNpZ25pZmljYW5jZSkge1xcXFxuICAgIGxldCBlcnJvclR5cGUgPSBBbGlFcnJvci5lcnJvckNvZGVNYXAuZ2V0KGVycm9yQ29kZSkgfHwgW107XFxcXG4gICAgdGhpcy5jb2RlID0gZXJyb3JDb2RlO1xcXFxuICAgIHRoaXMubWVzc2FnZSA9IGVycm9yVHlwZVswXSB8fCBtZXNzYWdlIHx8IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgdGhpcy5uYW1lID0gXFxcXFxcXCJBbGlFcnJvclxcXFxcXFwiO1xcXFxuICAgIHRoaXMuc2lnbmlmaWNhbmNlID0gZXJyb3JUeXBlWzFdIHx8IHNpZ25pZmljYW5jZSB8fCAxO1xcXFxufVxcXFxuQWxpRXJyb3IuZXJyb3JDb2RlTWFwID0gbmV3IE1hcChbXFxcXG4gICAgW1xcXFxcXFwiU2hhcmVMaW5rLkNhbmNlbGxlZFxcXFxcXFwiLCBbXFxcXFxcXCLliIbkuqvpk77mjqXlt7LlpLHmlYhcXFxcXFxcIl1dLFxcXFxuICAgIFtcXFxcXFxcIlNoYXJlTGluay5Gb3JiaWRkZW5cXFxcXFxcIiwgW1xcXFxcXFwi6L+d6KeE6LWE5rqQ5bey6KKr5bCB56aBXFxcXFxcXCJdXSxcXFxcbiAgICBbXFxcXFxcXCJOb3RGb3VuZC5TaGFyZUxpbmtcXFxcXFxcIiwgW1xcXFxcXFwi5LiN5a2Y5Zyo6K+l6ZO+5o6l6K+35qC45a+5XFxcXFxcXCJdXSxcXFxcbiAgICBbXFxcXFxcXCJBY2Nlc3NUb2tlbkludmFsaWRcXFxcXFxcIiwgW1xcXFxcXFwi6K6/6Zeu5Luk54mM5aSx5pWI77yM6K+36YeN5paw55m76ZmGXFxcXFxcXCJdXSxcXFxcbiAgICBbXFxcXFxcXCJTaGFyZUxpbmtUb2tlbkludmFsaWRcXFxcXFxcIiwgW1xcXFxcXFwi5YiG5Lqr5Luk54mM5aSx5pWIXFxcXFxcXCJdXSxcXFxcbiAgICBbXFxcXFxcXCJQYXJhbUZsb3dFeGNlcHRpb25cXFxcXFxcIiwgW1xcXFxcXFwi6K6/6Zeu6L+H5LqO6aKR57mB77yM6K+356iN5ZCO5YaN6K+VXFxcXFxcXCIsIDNdXVxcXFxuXSk7XFxcXG5cXFxcbkFsaUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCksIHtcXFxcbiAgICBjb25zdHJ1Y3RvcjogQWxpRXJyb3JcXFxcbn0pO1xcXFxuXFxcXG5mdW5jdGlvbiBwb3N0QXBpKGFwaSwgYm9keSwgaGVhZGVycykge1xcXFxuICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KCdodHRwczovL2FwaS5hbGl5dW5kcml2ZS5jb20nICsgYXBpLCB7XFxcXG4gICAgICAgIGhlYWRlcnM6IE9iamVjdC5hc3NpZ24oe1xcXFxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcXFxcbiAgICAgICAgfSwgaGVhZGVycyksXFxcXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxcXFxuICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcXFxuICAgIH0pO1xcXFxuICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXFxcbiAgICBpZiAocmVzdWx0LmNvZGUpIHtcXFxcbiAgICAgICAgdGhyb3cgbmV3IEFsaUVycm9yKHJlc3VsdC5jb2RlLCByZXN1bHQubWVzc2FnZSk7XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiByZXN1bHQ7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIEFsaVNoYXJlQXBpKHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCByZWZyZXNoQ2FsbEJhY2spIHtcXFxcbiAgICB0aGlzLnNoYXJlSWQgPSBzaGFyZUlkO1xcXFxuICAgIHRoaXMuc2hhcmVQd2QgPSBzaGFyZVB3ZDtcXFxcbiAgICB0aGlzLnJlZnJlc2hDYWxsQmFjayA9IHJlZnJlc2hDYWxsQmFjayB8fCAoKCkgPT4gdm9pZCAwKTtcXFxcbiAgICB0aGlzLnNoYXJlVG9rZW4gPSBzaGFyZVRva2VuIHx8IHRoaXMuZ2V0U2hhcmVUb2tlbigpO1xcXFxufVxcXFxuT2JqZWN0LmFzc2lnbihBbGlTaGFyZUFwaS5wcm90b3R5cGUsIHtcXFxcbiAgICBnZXRTaGFyZVRva2VuKCkge1xcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gcG9zdEFwaShcXFxcXFxcIi92Mi9zaGFyZV9saW5rL2dldF9zaGFyZV90b2tlblxcXFxcXFwiLCB7XFxcXG4gICAgICAgICAgICBcXFxcXFxcInNoYXJlX2lkXFxcXFxcXCI6IHRoaXMuc2hhcmVJZCxcXFxcbiAgICAgICAgICAgIFxcXFxcXFwic2hhcmVfcHdkXFxcXFxcXCI6IHRoaXMuc2hhcmVQd2QsXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICB0aGlzLnNoYXJlVG9rZW4gPSByZXN1bHQuc2hhcmVfdG9rZW47XFxcXG4gICAgICAgIHRoaXMucmVmcmVzaENhbGxCYWNrKHJlc3VsdC5zaGFyZV90b2tlbiwgdGhpcyk7XFxcXG4gICAgICAgIHJldHVybiByZXN1bHQuc2hhcmVfdG9rZW47XFxcXG4gICAgfSxcXFxcbiAgICBwb3N0VG9rZW5BcGkoYXBpLCBib2R5LCBoZWFkZXJzLCBpc1JldHJ5KSB7XFxcXG4gICAgICAgIGxldCByZXN1bHQ7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICByZXN1bHQgPSBwb3N0QXBpKGFwaSwgYm9keSwgT2JqZWN0LmFzc2lnbih7XFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJYLVNoYXJlLVRva2VuXFxcXFxcXCI6IHRoaXMuc2hhcmVUb2tlbiB8fCB0aGlzLmdldFNoYXJlVG9rZW4oKVxcXFxuICAgICAgICAgICAgfSwgaGVhZGVycykpO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBpZiAoKGUuY29kZSA9PT0gXFxcXFxcXCJBY2Nlc3NUb2tlbkludmFsaWRcXFxcXFxcIiB8fCBlLmNvZGUgPT09IFxcXFxcXFwiU2hhcmVMaW5rVG9rZW5JbnZhbGlkXFxcXFxcXCIpICYmICFpc1JldHJ5KSB7XFxcXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRTaGFyZVRva2VuKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zdFRva2VuQXBpKGFwaSwgYm9keSwgaGVhZGVycywgdHJ1ZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB0aHJvdyBlO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxcXG4gICAgfSxcXFxcbiAgICBnZXRMaXN0RmlsZShmaWxlSWQsIG1hcmtlciwgb3JkZXJCeSwgb3JkZXJEaXJlY3Rpb24pIHtcXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucG9zdFRva2VuQXBpKFxcXFxcXFwiL2Fkcml2ZS92My9maWxlL2xpc3RcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgXFxcXFxcXCJzaGFyZV9pZFxcXFxcXFwiOiB0aGlzLnNoYXJlSWQsXFxcXG4gICAgICAgICAgICBcXFxcXFxcInBhcmVudF9maWxlX2lkXFxcXFxcXCI6IGZpbGVJZCB8fCBcXFxcXFxcInJvb3RcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIFxcXFxcXFwibGltaXRcXFxcXFxcIjogMTAwLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJpbWFnZV90aHVtYm5haWxfcHJvY2Vzc1xcXFxcXFwiOiBcXFxcXFxcImltYWdlL3Jlc2l6ZSx3XzE2MC9mb3JtYXQsanBlZ1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJpbWFnZV91cmxfcHJvY2Vzc1xcXFxcXFwiOiBcXFxcXFxcImltYWdlXFxcXFxcXFwvcmVzaXplLHdfMTkyMC9mb3JtYXQsanBlZ1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJ2aWRlb190aHVtYm5haWxfcHJvY2Vzc1xcXFxcXFwiOiBcXFxcXFxcInZpZGVvL3NuYXBzaG90LHRfMTAwMCxmX2pwZyxhcl9hdXRvLHdfMzAwXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBcXFxcXFxcIm9yZGVyX2J5XFxcXFxcXCI6IG9yZGVyQnkgfHwgXFxcXFxcXCJuYW1lXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBcXFxcXFxcIm9yZGVyX2RpcmVjdGlvblxcXFxcXFwiOiBvcmRlckRpcmVjdGlvbiB8fCBcXFxcXFxcIkFTQ1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJtYXJrZXJcXFxcXFxcIjogbWFya2VyXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcXFxuICAgIH0sXFxcXG4gICAgZ2V0U2hhcmVJbmZvKCkge1xcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gcG9zdEFwaShcXFxcXFxcIi9hZHJpdmUvdjMvc2hhcmVfbGluay9nZXRfc2hhcmVfYnlfYW5vbnltb3VzP3NoYXJlX2lkPVxcXFxcXFwiICsgdGhpcy5zaGFyZUlkLCB7XFxcXG4gICAgICAgICAgICBcXFxcXFxcInNoYXJlX2lkXFxcXFxcXCI6IHRoaXMuc2hhcmVJZFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXFxcbiAgICB9LFxcXFxuICAgIGdldFNlYXJjaExpc3RGaWxlKGtleSwgbWFya2VyLCBvcmRlckJ5LCBvcmRlckRpcmVjdGlvbikge1xcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5wb3N0VG9rZW5BcGkoXFxcXFxcXCIvcmVjb21tZW5kL3YxL3NoYXJlTGluay9zZWFyY2hcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgXFxcXFxcXCJzaGFyZV9pZFxcXFxcXFwiOiB0aGlzLnNoYXJlSWQsXFxcXG4gICAgICAgICAgICBcXFxcXFxcImtleXdvcmRcXFxcXFxcIjoga2V5LFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJsaW1pdFxcXFxcXFwiOiAxMDAsXFxcXG4gICAgICAgICAgICBcXFxcXFxcIm9yZGVyX2J5XFxcXFxcXCI6IG9yZGVyQnkgKyBcXFxcXFxcIiBcXFxcXFxcIiArIG9yZGVyRGlyZWN0aW9uLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJtYXJrZXJcXFxcXFxcIjogbWFya2VyIHx8IHVuZGVmaW5lZFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID09PSAwKSB7XFxcXG4gICAgICAgICAgICByZXN1bHQuaXRlbXMgPSBbXTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuJC5leHBvcnRzID0gQWxpU2hhcmVBcGk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi6Zi/6YeM5pKt5pS+QVBJXFxcIixcXFwicGF0aFxcXCI6XFxcImFsaVBsYXlBcGlcXFwiLFxcXCJydWxlXFxcIjpcXFwiLy9AYXV0aG9yIExveURnSWtcXFxcbmZ1bmN0aW9uIHBvc3RBcGkoYXBpLCBib2R5LCBoZWFkZXJzLCBhZ2FpblRyeSwgdHJ5RnJlKSB7XFxcXG4gICAgbGV0IHJlc3VsdDtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICByZXN1bHQgPSByZXF1ZXN0KGFwaS5zdGFydHNXaXRoKFxcXFxcXFwiaHR0cFxcXFxcXFwiKSA/IGFwaSA6ICdodHRwczovL2FwaS5hbGl5dW5kcml2ZS5jb20nICsgYXBpLCB7XFxcXG4gICAgICAgICAgICBoZWFkZXJzOiBPYmplY3QuYXNzaWduKHtcXFxcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxcXFxuICAgICAgICAgICAgfSwgaGVhZGVycyksXFxcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcXFxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XFxcXG4gICAgICAgIGlmIChyZXN1bHQuY29kZSkge1xcXFxuICAgICAgICAgICAgbGV0IG1zZyA9IHJlc3VsdC5kaXNwbGF5X21lc3NhZ2UgfHwgcmVzdWx0Lm1lc3NhZ2U7XFxcXG4gICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYXBpICsgXFxcXFxcXCI9PlxcXFxcXFwiICsgcmVzdWx0LmNvZGUgKyBcXFxcXFxcIjpcXFxcXFxcIiArIG1zZyk7XFxcXG4gICAgICAgICAgICBlcnJvci5jb2RlID0gcmVzdWx0LmNvZGU7XFxcXG4gICAgICAgICAgICBlcnJvci5qdWRnZU1zZyA9IG1zZ1xcXFxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IHJib2R5ID0gcmVzdWx0ICYmIHJlc3VsdC5yZXNwb25zZXMgJiYgcmVzdWx0LnJlc3BvbnNlc1swXSAmJiByZXN1bHQucmVzcG9uc2VzWzBdLmJvZHkgfHwge307XFxcXG4gICAgICAgIGlmIChyYm9keS5jb2RlKSB7XFxcXG4gICAgICAgICAgICBsZXQgbXNnID0gcmJvZHkuZGlzcGxheV9tZXNzYWdlIHx8IHJib2R5Lm1lc3NhZ2U7XFxcXG4gICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYXBpICsgXFxcXFxcXCI9PlxcXFxcXFwiICsgcmJvZHkuY29kZSArIFxcXFxcXFwiOlxcXFxcXFwiICsgbXNnKTtcXFxcbiAgICAgICAgICAgIGVycm9yLmNvZGUgPSByYm9keS5jb2RlO1xcXFxuICAgICAgICAgICAgZXJyb3IuanVkZ2VNc2cgPSBtc2c7XFxcXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgdHJ5RnJlID0gdHJ5RnJlID09PSB1bmRlZmluZWQgPyAxIDogdHJ5RnJlO1xcXFxuICAgICAgICBpZiAoYWdhaW5UcnkgJiYgdHJ5RnJlID4gMCkge1xcXFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhZ2FpblRyeSA9PT0gXFxcXFxcXCJmdW5jdGlvblxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IG5ld0RhdGEgPSBhZ2FpblRyeShlLCByZXN1bHQsIGJvZHksIGhlYWRlcnMsIHRyeUZyZSk7XFxcXG4gICAgICAgICAgICAgICAgaWYgKG5ld0RhdGEpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihib2R5LCBuZXdEYXRhLmJvZHkpO1xcXFxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGhlYWRlcnMsIG5ld0RhdGEuaGVhZGVycyk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuIHBvc3RBcGkoYXBpLCBib2R5LCBoZWFkZXJzLCBhZ2FpblRyeSwgdHJ5RnJlIC0gMSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdGhyb3cgZTtcXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIHJlc3VsdDtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gQWxpQWNjZXNzQXBpKHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCBhbGlUb2tlbnMsIG9wZW5Ub2tlbnMsIHJlZnJlc2hTaGFyZUNhbGxCYWNrLCByZWZyZXNoQWNjZXNzQ2FsbEJhY2ssIHJlZnJlc2hPcGVuQ2FsbEJhY2spIHtcXFxcbiAgICB0aGlzLnNoYXJlSWQgPSBzaGFyZUlkO1xcXFxuICAgIHRoaXMuc2hhcmVQd2QgPSBzaGFyZVB3ZDtcXFxcbiAgICB0aGlzLnJlZnJlc2hTaGFyZUNhbGxCYWNrID0gcmVmcmVzaFNoYXJlQ2FsbEJhY2sgfHwgKCgpID0+IHZvaWQgMCk7XFxcXG4gICAgdGhpcy5yZWZyZXNoQWNjZXNzQ2FsbEJhY2sgPSByZWZyZXNoQWNjZXNzQ2FsbEJhY2sgfHwgKCgpID0+IHZvaWQgMCk7XFxcXG4gICAgdGhpcy5yZWZyZXNoT3BlbkNhbGxCYWNrID0gcmVmcmVzaE9wZW5DYWxsQmFjayB8fCAoKCkgPT4gdm9pZCAwKTtcXFxcbiAgICB0aGlzLnNoYXJlVG9rZW4gPSBzaGFyZVRva2VuIHx8IHRoaXMuZ2V0U2hhcmVUb2tlbigpO1xcXFxuICAgIHRoaXMuYWxpVG9rZW5zID0gYWxpVG9rZW5zIHx8IHt9O1xcXFxuICAgIGlmICghdGhpcy5hbGlUb2tlbnMucmVmcmVzaF90b2tlbikge1xcXFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLmnKrnmbvpmYZcXFxcXFxcIik7XFxcXG4gICAgfVxcXFxuICAgIGlmICghdGhpcy5hbGlUb2tlbnMuYWNjZXNzX3Rva2VuKSB7XFxcXG4gICAgICAgIHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuKCk7XFxcXG4gICAgfVxcXFxuICAgIHRoaXMuZGVmRHJpdmVJZCA9IHRoaXMuYWxpVG9rZW5zLnJlc291cmNlX2RyaXZlX2lkIHx8IHRoaXMuYWxpVG9rZW5zLmRlZmF1bHRfZHJpdmVfaWQ7XFxcXG4gICAgdGhpcy5yZWFjY2Vzc1RrID0gKHRoaXMuYWxpVG9rZW5zLnRva2VuX3R5cGUgfHwgXFxcXFxcXCJCZWFyZXJcXFxcXFxcIikgKyAnICcgKyB0aGlzLmFsaVRva2Vucy5hY2Nlc3NfdG9rZW47XFxcXG4gICAgdGhpcy5vcGVuVG9rZW5zID0gb3BlblRva2VucyB8fCB7XFxcXG4gICAgICAgICdSZWZyZXNoVG9rZW5PcGVuJzogJycsXFxcXG4gICAgICAgICdBY2Nlc3NUb2tlbk9wZW4nOiAnJyxcXFxcbiAgICAgICAgJ0JpbmRSZWZyZXNoVG9rZW4nOiAnJyxcXFxcbiAgICB9O1xcXFxuICAgIGlmIChvcGVuVG9rZW5zICE9PSBudWxsICYmICF0aGlzLm9wZW5Ub2tlbnMuQWNjZXNzVG9rZW5PcGVuKSB7XFxcXG4gICAgICAgIHRoaXMucmVmcmVzaE9wZW5Ub2tlbigpO1xcXFxuICAgIH1cXFxcbn1cXFxcbk9iamVjdC5hc3NpZ24oQWxpQWNjZXNzQXBpLnByb3RvdHlwZSwge1xcXFxuICAgIHdhaXRTbGVlcCh0aW1lKSB7XFxcXG4gICAgICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAodGltZSB8fCA2MDApO1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIHRyeVNvbHZlKGUpIHtcXFxcbiAgICAgICAgaWYgKGUuY29kZSA9PT0gXFxcXFxcXCJTaGFyZUxpbmtUb2tlbkludmFsaWRcXFxcXFxcIiB8fCBlLmNvZGUgPT09IFxcXFxcXFwiSW52YWxpZFBhcmFtZXRlck5vdE1hdGNoLlNoYXJlSWRcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgdGhpcy53YWl0U2xlZXAoMjApLmdldFNoYXJlVG9rZW4oKTtcXFxcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKGUuY29kZSA9PT0gXFxcXFxcXCJBY2Nlc3NUb2tlbkludmFsaWRcXFxcXFxcIiB8fCBlLmNvZGUgPT09IFxcXFxcXFwiQWNjZXNzVG9rZW5FeHBpcmVkXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcXFxcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKGUuY29kZSA9PT0gXFxcXFxcXCJGb3JiaWRkZW5Ob1Blcm1pc3Npb24uRmlsZVxcXFxcXFwiIHx8IChlLmNvZGUgPT09IFxcXFxcXFwiQmFkUmVxdWVzdFxcXFxcXFwiICYmIGUuanVkZ2VNc2cgPT09IFxcXFxcXFwi5LuF5Y+v5L+d5a2Y5Yiw6L2s5a2Y56m66Ze0XFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICB0aGlzLmFsaVRva2Vucy5yZXNvdXJjZV9kcml2ZV9pZCA9IHVuZGVmaW5lZDtcXFxcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcXFxcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXFxcbiAgICB9LFxcXFxuICAgIGdldFNoYXJlVG9rZW4oKSB7XFxcXG4gICAgICAgIGxldCByZXN1bHQgPSBwb3N0QXBpKFxcXFxcXFwiL3YyL3NoYXJlX2xpbmsvZ2V0X3NoYXJlX3Rva2VuXFxcXFxcXCIsIHtcXFxcbiAgICAgICAgICAgIFxcXFxcXFwic2hhcmVfaWRcXFxcXFxcIjogdGhpcy5zaGFyZUlkLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJzaGFyZV9wd2RcXFxcXFxcIjogdGhpcy5zaGFyZVB3ZCxcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIHRoaXMuc2hhcmVUb2tlbiA9IHJlc3VsdC5zaGFyZV90b2tlbjtcXFxcbiAgICAgICAgdGhpcy5yZWZyZXNoU2hhcmVDYWxsQmFjayhyZXN1bHQuc2hhcmVfdG9rZW4sIHRoaXMpO1xcXFxuICAgICAgICByZXR1cm4gcmVzdWx0LnNoYXJlX3Rva2VuO1xcXFxuICAgIH0sXFxcXG4gICAgcmVmcmVzaEFjY2Vzc1Rva2VuKCkge1xcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gcG9zdEFwaShcXFxcXFxcImh0dHBzOi8vYXV0aC5hbGl5dW5kcml2ZS5jb20vdjIvYWNjb3VudC90b2tlblxcXFxcXFwiLCB7XFxcXG4gICAgICAgICAgICBcXFxcXFxcImdyYW50X3R5cGVcXFxcXFxcIjogXFxcXFxcXCJyZWZyZXNoX3Rva2VuXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBcXFxcXFxcInJlZnJlc2hfdG9rZW5cXFxcXFxcIjogdGhpcy5hbGlUb2tlbnMucmVmcmVzaF90b2tlbixcXFxcbiAgICAgICAgfSwge1xcXFxuICAgICAgICAgICAgXFxcXFxcXCJVc2VyLUFnZW50XFxcXFxcXCI6IFBDX1VBLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJSZWZlcmVyXFxcXFxcXCI6IFxcXFxcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL1xcXFxcXFwiXFxcXG4gICAgICAgIH0sIChlKSA9PiB7XFxcXG4gICAgICAgICAgICBpZiAoZS5jb2RlID09PSBcXFxcXFxcIkludmFsaWRQYXJhbWV0ZXIuUmVmcmVzaFRva2VuXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICBlLm1lc3NhZ2UgPSBcXFxcXFxcIiPnmbvpmYbov4fmnJ/or7fph43mlrDnmbvpmYYjXFxcXFxcXFxuXFxcXFxcXCIgKyBlLm1lc3NhZ2U7XFxcXG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGRlbGV0ZSByZXN1bHQudXNlcl9kYXRhO1xcXFxuICAgICAgICBsZXQgb3JpZ2luRGVmZERyaXZlSWQgPSB0aGlzLmFsaVRva2Vucy5kZWZhdWx0X2RyaXZlX2lkO1xcXFxuICAgICAgICB0aGlzLmFsaVRva2VucyA9IE9iamVjdC5hc3NpZ24odGhpcy5hbGlUb2tlbnMsIHJlc3VsdCk7XFxcXG4gICAgICAgIHRoaXMucmVhY2Nlc3NUayA9IHRoaXMuYWxpVG9rZW5zLnRva2VuX3R5cGUgKyAnICcgKyB0aGlzLmFsaVRva2Vucy5hY2Nlc3NfdG9rZW47XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBpZiAoKG9yaWdpbkRlZmREcml2ZUlkICE9PSB0aGlzLmFsaVRva2Vucy5kZWZhdWx0X2RyaXZlX2lkKSB8fCB0aGlzLmFsaVRva2Vucy5yZXNvdXJjZV9kcml2ZV9pZCA9PT0gdW5kZWZpbmVkKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJlc291cmNlX2RyaXZlX2lkID0gdGhpcy5nZXRVc2VySW5mbygpLnJlc291cmNlX2RyaXZlX2lkO1xcXFxuICAgICAgICAgICAgICAgIHRoaXMuYWxpVG9rZW5zLnJlc291cmNlX2RyaXZlX2lkID0gcmVzb3VyY2VfZHJpdmVfaWQ7XFxcXG4gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlX2RyaXZlX2lkKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmRHJpdmVJZCA9IHJlc291cmNlX2RyaXZlX2lkO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmRHJpdmVJZCA9IHRoaXMuYWxpVG9rZW5zLmRlZmF1bHRfZHJpdmVfaWQ7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBsb2coXFxcXFxcXCLnlKjmiLfkv6Hmga/ojrflj5blpLHotKXvvJpcXFxcXFxcIiArIGUudG9TdHJpbmcoKSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdGhpcy5yZWZyZXNoQWNjZXNzQ2FsbEJhY2socmVzdWx0LCB0aGlzKTtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuYWxpVG9rZW5zO1xcXFxuICAgIH0sXFxcXG4gICAgZ2V0VXNlckluZm8oKSB7XFxcXG4gICAgICAgIGxldCBpbmZvID0gcG9zdEFwaShcXFxcXFxcImh0dHBzOi8vdXNlci5hbGl5dW5kcml2ZS5jb20vdjIvdXNlci9nZXRcXFxcXFxcIiwge30sIHtcXFxcbiAgICAgICAgICAgIFxcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOiBQQ19VQSxcXFxcbiAgICAgICAgICAgIFxcXFxcXFwiYXV0aG9yaXphdGlvblxcXFxcXFwiOiB0aGlzLnJlYWNjZXNzVGssXFxcXG4gICAgICAgICAgICBcXFxcXFxcIlJlZmVyZXJcXFxcXFxcIjogXFxcXFxcXCJodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vXFxcXFxcXCJcXFxcbiAgICAgICAgfSwgKGUpID0+IHtcXFxcbiAgICAgICAgICAgIHRoaXMudHJ5U29sdmUoZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4ge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLnJlYWNjZXNzVGtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICByZXR1cm4gaW5mbztcXFxcbiAgICB9LFxcXFxuICAgIF9nZXRPcGVuVG9rZW4oY29kZSkge1xcXFxuICAgICAgICBsZXQgYm9keSA9IHt9LFxcXFxuICAgICAgICAgICAgaGVhZGVycyA9IHtcXFxcbiAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6IFBDX1VBLFxcXFxuICAgICAgICAgICAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS8nXFxcXG4gICAgICAgICAgICB9O1xcXFxuICAgICAgICBpZiAoY29kZSkge1xcXFxuICAgICAgICAgICAgYm9keSA9IHtcXFxcbiAgICAgICAgICAgICAgICBjb2RlOiBjb2RlLFxcXFxuICAgICAgICAgICAgICAgIGdyYW50X3R5cGU6IFxcXFxcXFwiYXV0aG9yaXphdGlvbl9jb2RlXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH07XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBib2R5ID0ge1xcXFxuICAgICAgICAgICAgICAgIGdyYW50X3R5cGU6IFxcXFxcXFwicmVmcmVzaF90b2tlblxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IHRoaXMub3BlblRva2Vucy5SZWZyZXNoVG9rZW5PcGVuLFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBqc29uID0gcG9zdCgnaHR0cHM6Ly9hcGkueGhvZmUudG9wL2FsaXN0L2FsaV9vcGVuL2NvZGUnLCB7XFxcXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxcXFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBpZiAoIWpzb24pIHtcXFxcbiAgICAgICAgICAgIGpzb24gPSBwb3N0KCdodHRwczovL2FwaS1jZi5ubi5jaS9hbGlzdC9hbGlfb3Blbi9jb2RlJywge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXFxcXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoanNvbi5pbmNsdWRlcygnVG9vIE1hbnkgUmVxdWVzdHMnKSB8fCBqc29uLmluY2x1ZGVzKFxcXFxcXFwiNTAyIEJhZCBHYXRld2F5XFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLpopHnuYHor7fmsYLmmoLml7booqvlsIHnpoFcXFxcXFxcXG5cXFxcXFxcIiArIGpzb24pO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgbGV0IG9wZW5SZXN1bHQgPSBKU09OLnBhcnNlKGpzb24pO1xcXFxuICAgICAgICAgICAgaWYgKG9wZW5SZXN1bHQucmVmcmVzaF90b2tlbikge1xcXFxuICAgICAgICAgICAgICAgIHRoaXMub3BlblRva2Vucy5SZWZyZXNoVG9rZW5PcGVuID0gb3BlblJlc3VsdC5yZWZyZXNoX3Rva2VuO1xcXFxuICAgICAgICAgICAgICAgIHRoaXMub3BlblRva2Vucy5BY2Nlc3NUb2tlbk9wZW4gPSBvcGVuUmVzdWx0LnRva2VuX3R5cGUgKyBcXFxcXFxcIiBcXFxcXFxcIiArIG9wZW5SZXN1bHQuYWNjZXNzX3Rva2VuO1xcXFxuICAgICAgICAgICAgICAgIHRoaXMub3BlblRva2Vucy5CaW5kUmVmcmVzaFRva2VuID0gdGhpcy5hbGlUb2tlbnMucmVmcmVzaF90b2tlbjtcXFxcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hPcGVuQ2FsbEJhY2sob3BlblJlc3VsdCwgdGhpcyk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlblRva2VucztcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoIWNvZGUpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndhaXRTbGVlcCg1MCkuY2FjaGVPcGVuVG9rZW4oKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCJvcGVuVG9rZW7ojrflj5blpLHotKVcXFxcXFxcXG5cXFxcXFxcIiArIGpzb24pO1xcXFxuICAgIH0sXFxcXG4gICAgY2FjaGVPcGVuVG9rZW4oKSB7XFxcXG4gICAgICAgIGxldCByZXN1bHQgPSBwb3N0QXBpKCdodHRwczovL29wZW4uYWxpeXVuZHJpdmUuY29tL29hdXRoL3VzZXJzL2F1dGhvcml6ZT9jbGllbnRfaWQ9JyArICc3NjkxN2NjY2NkNDQ0MWMzOTQ1N2EwNGY2MDg0ZmIyZicgKyAnJnJlZGlyZWN0X3VyaT1odHRwczovL2FsaXN0Lm5uLmNpL3Rvb2wvYWxpeXVuZHJpdmUvY2FsbGJhY2smc2NvcGU9dXNlcjpiYXNlLGZpbGU6YWxsOnJlYWQsZmlsZTphbGw6d3JpdGUmc3RhdGU9Jywge1xcXFxuICAgICAgICAgICAgXFxcXFxcXCJhdXRob3JpemVcXFxcXFxcIjogMSxcXFxcbiAgICAgICAgICAgIFxcXFxcXFwic2NvcGVcXFxcXFxcIjogXFxcXFxcXCJ1c2VyOmJhc2UsZmlsZTphbGw6cmVhZCxmaWxlOmFsbDp3cml0ZVxcXFxcXFwiXFxcXG4gICAgICAgIH0sIHtcXFxcbiAgICAgICAgICAgICdVc2VyLUFnZW50JzogUENfVUEsXFxcXG4gICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJyxcXFxcbiAgICAgICAgICAgICdhdXRob3JpemF0aW9uJzogdGhpcy5yZWFjY2Vzc1RrLCAvL2dldEFjY2Vzc1Rva2VuXFxcXG4gICAgICAgICAgICAneC1jYW5hcnknOiAnY2xpZW50PXdlYixhcHA9c2hhcmUsdmVyc2lvbj12Mi4zLjEnLFxcXFxuICAgICAgICAgICAgJ3gtc2hhcmUtdG9rZW4nOiB0aGlzLnNoYXJlVG9rZW5cXFxcbiAgICAgICAgfSwgKGUpID0+IHtcXFxcbiAgICAgICAgICAgIHRoaXMudHJ5U29sdmUoZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4ge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLnJlYWNjZXNzVGssXFxcXG4gICAgICAgICAgICAgICAgICAgICd4LXNoYXJlLXRva2VuJzogdGhpcy5zaGFyZVRva2VuXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgbGV0IGNvZGUgPSByZXN1bHQucmVkaXJlY3RVcmkuc3BsaXQoXFxcXFxcXCJjb2RlPVxcXFxcXFwiKVsxXTtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wZW5Ub2tlbihjb2RlKTtcXFxcbiAgICB9LFxcXFxuICAgIHJlZnJlc2hPcGVuVG9rZW4oKSB7XFxcXG4gICAgICAgIGlmICh0aGlzLm9wZW5Ub2tlbnMuUmVmcmVzaFRva2VuT3BlbiAmJiB0aGlzLm9wZW5Ub2tlbnMuQmluZFJlZnJlc2hUb2tlbiA9PT0gdGhpcy5hbGlUb2tlbnMucmVmcmVzaF90b2tlbikge1xcXFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wZW5Ub2tlbigpO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVPcGVuVG9rZW4oKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sXFxcXG4gICAgX2Nsb3VkRmlsZU9wZXJhdGUoYm9keSwgY2xvdWRGaWxlSWQsIG9wZXJhdGVVcmwpIHtcXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHBvc3RBcGkoJ2h0dHBzOi8vYXBpLmFsaXl1bmRyaXZlLmNvbS9hZHJpdmUvdjIvYmF0Y2gnLCB7XFxcXG4gICAgICAgICAgICBcXFxcXFxcInJlcXVlc3RzXFxcXFxcXCI6IFt7XFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJib2R5XFxcXFxcXCI6IGJvZHksXFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJoZWFkZXJzXFxcXFxcXCI6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJDb250ZW50LVR5cGVcXFxcXFxcIjogXFxcXFxcXCJhcHBsaWNhdGlvbi9qc29uXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwiaWRcXFxcXFxcIjogY2xvdWRGaWxlSWQgfHwgXFxcXFxcXCIwXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJtZXRob2RcXFxcXFxcIjogXFxcXFxcXCJQT1NUXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJ1cmxcXFxcXFxcIjogb3BlcmF0ZVVybFxcXFxuICAgICAgICAgICAgfV0sXFxcXG4gICAgICAgICAgICBcXFxcXFxcInJlc291cmNlXFxcXFxcXCI6IFxcXFxcXFwiZmlsZVxcXFxcXFwiXFxcXG4gICAgICAgIH0sIHtcXFxcbiAgICAgICAgICAgICdVc2VyLUFnZW50JzogUENfVUEsXFxcXG4gICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJyxcXFxcbiAgICAgICAgICAgICdhdXRob3JpemF0aW9uJzogdGhpcy5yZWFjY2Vzc1RrLFxcXFxuICAgICAgICAgICAgLy9nZXRBY2Nlc3NUb2tlblxcXFxuICAgICAgICAgICAgJ3gtY2FuYXJ5JzogJ2NsaWVudD13ZWIsYXBwPXNoYXJlLHZlcnNpb249djIuMy4xJyxcXFxcbiAgICAgICAgICAgICd4LXNoYXJlLXRva2VuJzogdGhpcy5zaGFyZVRva2VuXFxcXG5cXFxcbiAgICAgICAgfSwgKGUsIHIsIGIpID0+IHtcXFxcbiAgICAgICAgICAgIGlmIChlLmNvZGUgPT09IFxcXFxcXFwiUXVvdGFFeGhhdXN0ZWQuRHJpdmVcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIHRocm93IGU7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZiAoIXRoaXMudHJ5U29sdmUoZSkpIHtcXFxcbiAgICAgICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgyMCkucmVmcmVzaEFjY2Vzc1Rva2VuKCk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsZXQgYm9keSA9IGIucmVxdWVzdHNbMF0uYm9keTtcXFxcbiAgICAgICAgICAgIGlmIChib2R5LmRyaXZlX2lkKSB7XFxcXG4gICAgICAgICAgICAgICAgYm9keS5kcml2ZV9pZCA9IHRoaXMuZGVmRHJpdmVJZFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYgKGJvZHkudG9fZHJpdmVfaWQpIHtcXFxcbiAgICAgICAgICAgICAgICBib2R5LnRvX2RyaXZlX2lkID0gdGhpcy5kZWZEcml2ZUlkXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4ge1xcXFxuICAgICAgICAgICAgICAgIGJvZHk6IGIsXFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMucmVhY2Nlc3NUayxcXFxcbiAgICAgICAgICAgICAgICAgICAgJ3gtc2hhcmUtdG9rZW4nOiB0aGlzLnNoYXJlVG9rZW5cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9O1xcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXFxcbiAgICB9LFxcXFxuICAgIGNvcHlGaWxlVG9DbG91ZEZpbGUoZmlsZUlkLCByZXRyeSkge1xcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fY2xvdWRGaWxlT3BlcmF0ZSh7XFxcXG4gICAgICAgICAgICBcXFxcXFxcImZpbGVfaWRcXFxcXFxcIjogZmlsZUlkLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJzaGFyZV9pZFxcXFxcXFwiOiB0aGlzLnNoYXJlSWQsXFxcXG4gICAgICAgICAgICBcXFxcXFxcImF1dG9fcmVuYW1lXFxcXFxcXCI6IHRydWUsXFxcXG4gICAgICAgICAgICBcXFxcXFxcInRvX3BhcmVudF9maWxlX2lkXFxcXFxcXCI6IFxcXFxcXFwicm9vdFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJ0b19kcml2ZV9pZFxcXFxcXFwiOiB0aGlzLmRlZkRyaXZlSWRcXFxcbiAgICAgICAgfSwgXFxcXFxcXCIwXFxcXFxcXCIsIFxcXFxcXFwiL2ZpbGUvY29weVxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IGJvZHkgPSByZXN1bHQgJiYgcmVzdWx0LnJlc3BvbnNlcyAmJiByZXN1bHQucmVzcG9uc2VzWzBdICYmIHJlc3VsdC5yZXNwb25zZXNbMF0uYm9keSB8fCB7fTtcXFxcbiAgICAgICAgaWYgKCFib2R5LmZpbGVfaWQgJiYgIXJldHJ5KSB7XFxcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgyMCkuZ2V0U2hhcmVUb2tlbigpO1xcXFxuICAgICAgICAgICAgdGhpcy53YWl0U2xlZXAoMjApLnJlZnJlc2hBY2Nlc3NUb2tlbigpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2FpdFNsZWVwKDIwKS5jb3B5RmlsZVRvQ2xvdWRGaWxlKGZpbGVJZCwgdHJ1ZSk7XFxcXG4gICAgICAgIH0gZWxzZSBpZiAoIWJvZHkuZmlsZV9pZCkge1xcXFxuICAgICAgICAgICAgbGV0IGUgPSBuZXcgRXJyb3IoXFxcXFxcXCLmlofku7blpI3liLblpLHotKU6XFxcXFxcXFxuXFxcXFxcXCIgKyBKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcXFxcbiAgICAgICAgICAgIGUuY29kZSA9IGJvZHkuY29kZTtcXFxcbiAgICAgICAgICAgIHRocm93IGU7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXNwb25zZXNbMF0uYm9keS5maWxlX2lkO1xcXFxuICAgIH0sXFxcXG4gICAgb3BlbkNsb3VkRmlsZVRvRG93blVybChjbG91ZEZpbGVJZCkge1xcXFxuICAgICAgICBsZXQgZmlsZUluZm8gPSBwb3N0QXBpKCdodHRwczovL29wZW4uYWxpeXVuZHJpdmUuY29tL2Fkcml2ZS92MS4wL29wZW5GaWxlL2dldERvd25sb2FkVXJsJywge1xcXFxuICAgICAgICAgICAgJ2ZpbGVfaWQnOiBjbG91ZEZpbGVJZCxcXFxcbiAgICAgICAgICAgICdkcml2ZV9pZCc6IHRoaXMuZGVmRHJpdmVJZFxcXFxuICAgICAgICB9LCB7XFxcXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6IFBDX1VBLFxcXFxuICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tLycsXFxcXG4gICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMub3BlblRva2Vucy5BY2Nlc3NUb2tlbk9wZW5cXFxcbiAgICAgICAgfSwgKGUpID0+IHtcXFxcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDMwKS50cnlTb2x2ZShlKTtcXFxcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDMwKS5yZWZyZXNoT3BlblRva2VuKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4ge1xcXFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgJ2RyaXZlX2lkJzogdGhpcy5kZWZEcml2ZUlkLFxcXFxuICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMub3BlblRva2Vucy5BY2Nlc3NUb2tlbk9wZW5cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9O1xcXFxuICAgICAgICB9LCAyKTtcXFxcbiAgICAgICAgaWYgKCFmaWxlSW5mby51cmwgfHwgZmlsZUluZm8uY29kZSkgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwi5LiL6L296ZO+5o6l6I635Y+W5aSx6LSlXFxcXFxcXFxuXFxcXFxcXCIgKyBmaWxlSW5mby5jb2RlICsgXFxcXFxcXCI6XFxcXFxcXCIgKyBmaWxlSW5mby5tZXNzYWdlKTtcXFxcbiAgICAgICAgcmV0dXJuIGZpbGVJbmZvLnVybDtcXFxcbiAgICB9LFxcXFxuICAgIGRlbGV0ZWVDbG91ZEZpbGUoY2xvdWRGaWxlSWQpIHtcXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX2Nsb3VkRmlsZU9wZXJhdGUoe1xcXFxuICAgICAgICAgICAgXFxcXFxcXCJkcml2ZV9pZFxcXFxcXFwiOiB0aGlzLmRlZkRyaXZlSWQsXFxcXG4gICAgICAgICAgICBcXFxcXFxcImZpbGVfaWRcXFxcXFxcIjogY2xvdWRGaWxlSWRcXFxcbiAgICAgICAgfSwgY2xvdWRGaWxlSWQsIFxcXFxcXFwiL2ZpbGUvZGVsZXRlXFxcXFxcXCIpO1xcXFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcXFxuICAgIH0sXFxcXG4gICAgZ2V0VmlkZW9UZW1QbGF5VXJsKGZpbGVJZCkge1xcXFxuICAgICAgICBsZXQgY2xvdWRGaWxlSWQgPSB0aGlzLmNvcHlGaWxlVG9DbG91ZEZpbGUoZmlsZUlkKTtcXFxcbiAgICAgICAgdGhpcy53YWl0U2xlZXAoMjApO1xcXFxuICAgICAgICBsZXQgcGxheVVybCA9IHRoaXMub3BlbkNsb3VkRmlsZVRvRG93blVybChjbG91ZEZpbGVJZCk7XFxcXG4gICAgICAgIHRoaXMud2FpdFNsZWVwKDUwKTtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlZUNsb3VkRmlsZShjbG91ZEZpbGVJZCk7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIGxvZyhcXFxcXFxcIiPmlofku7bliKDpmaTlpLHotKUjXFxcXFxcXFxu6ZSZ6K+v5L+h5oGvPlxcXFxcXFwiICsgZS50b1N0cmluZygpICsgXFxcXFxcXCJcXFxcXFxcXG7plJnor6/ooYw+XFxcXFxcXCIgKyBlLmxpbmVOdW1iZXIpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBwbGF5VXJsO1xcXFxuICAgIH0sXFxcXG4gICAgZ2V0RmlsZVRvRG93blVybChmaWxlSWQpIHtcXFxcbiAgICAgICAgbGV0IGRvd25sb2FkSW5mbyA9IHBvc3RBcGkoXFxcXFxcXCIvdjIvZmlsZS9nZXRfc2hhcmVfbGlua19kb3dubG9hZF91cmxcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgXFxcXFxcXCJleHBpcmVfc2VjXFxcXFxcXCI6IDYwMCxcXFxcbiAgICAgICAgICAgIFxcXFxcXFwiZmlsZV9pZFxcXFxcXFwiOiBmaWxlSWQsXFxcXG4gICAgICAgICAgICBcXFxcXFxcInNoYXJlX2lkXFxcXFxcXCI6IHRoaXMuc2hhcmVJZFxcXFxuICAgICAgICB9LCB7XFxcXG4gICAgICAgICAgICBcXFxcXFxcIlgtU2hhcmUtVG9rZW5cXFxcXFxcIjogdGhpcy5zaGFyZVRva2VuLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJhdXRob3JpemF0aW9uXFxcXFxcXCI6IHRoaXMuYWxpVG9rZW5zLmFjY2Vzc190b2tlblxcXFxuICAgICAgICB9LCAoZSkgPT4ge1xcXFxuICAgICAgICAgICAgdGhpcy50cnlTb2x2ZShlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiB7XFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIlgtU2hhcmUtVG9rZW5cXFxcXFxcIjogdGhpcy5zaGFyZVRva2VuLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcImF1dGhvcml6YXRpb25cXFxcXFxcIjogdGhpcy5hbGlUb2tlbnMuYWNjZXNzX3Rva2VuXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfTtcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIHJldHVybiBkb3dubG9hZEluZm8uZG93bmxvYWRfdXJsO1xcXFxuICAgIH0sXFxcXG4gICAgZ2V0U2lnbigpIHtcXFxcbiAgICAgICAgaWYgKCF0aGlzLmFsaVRva2Vucy5kZXZpY2VfaWQpIHtcXFxcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgY2FsY3VsYXRlTmV3U2lnbiA9ICgpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBzaWduID0ganVzdFRlc3RTaWduKFxcXFxcXFwiNWRkZTRlMWJkZjllNDk2NmIzODdiYTU4ZjRiM2ZkYzNcXFxcXFxcIiwgdGhpcy5hbGlUb2tlbnMuZGV2aWNlX2lkLCB0aGlzLmFsaVRva2Vucy51c2VyX2lkKS5zcGxpdChcXFxcXFxcIiMjXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIHtcXFxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmU6IHNpZ24uYXQoMCksXFxcXG4gICAgICAgICAgICAgICAgcHViS2V5OiBzaWduLmF0KC0xKVxcXFxuICAgICAgICAgICAgfTtcXFxcbiAgICAgICAgfTtcXFxcbiAgICAgICAgbGV0IG5ld1NpZ24gPSBjYWxjdWxhdGVOZXdTaWduKCk7XFxcXG4gICAgICAgIGxldCByZXN1bHQgPSBwb3N0QXBpKCcvdXNlcnMvdjEvdXNlcnMvZGV2aWNlL2NyZWF0ZV9zZXNzaW9uJywge1xcXFxuICAgICAgICAgICAgXFxcXFxcXCJkZXZpY2VOYW1lXFxcXFxcXCI6IFxcXFxcXFwiRWRnZea1j+iniOWZqFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJtb2RlbE5hbWVcXFxcXFxcIjogXFxcXFxcXCJXaW5kb3dz572R6aG154mIXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBcXFxcXFxcInB1YktleVxcXFxcXFwiOiBuZXdTaWduLnB1YktleSxcXFxcbiAgICAgICAgfSwge1xcXFxuICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiBQQ19VQSxcXFxcbiAgICAgICAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbScsXFxcXG4gICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IHRoaXMucmVhY2Nlc3NUayxcXFxcbiAgICAgICAgICAgICdYLVNoYXJlLVRva2VuJzogdGhpcy5zaGFyZVRva2VuLFxcXFxuICAgICAgICAgICAgJ3gtZGV2aWNlLWlkJzogdGhpcy5hbGlUb2tlbnMuZGV2aWNlX2lkLFxcXFxuICAgICAgICAgICAgJ3gtc2lnbmF0dXJlJzogbmV3U2lnbi5zaWduYXR1cmVcXFxcbiAgICAgICAgfSwgKGUpID0+IHtcXFxcbiAgICAgICAgICAgIGlmIChlLm1lc3NhZ2UgPT09IFxcXFxcXFwieC1kZXZpY2UtaWQgZW1wdHlcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHRoaXMudHJ5U29sdmUoZSk7XFxcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCg1MCk7XFxcXG4gICAgICAgICAgICBuZXdTaWduID0gY2FsY3VsYXRlTmV3U2lnbigpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIHtcXFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicHViS2V5XFxcXFxcXCI6IG5ld1NpZ24ucHViS2V5XFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogdGhpcy5yZWFjY2Vzc1RrLFxcXFxuICAgICAgICAgICAgICAgICAgICAnWC1TaGFyZS1Ub2tlbic6IHRoaXMuc2hhcmVUb2tlbixcXFxcbiAgICAgICAgICAgICAgICAgICAgJ3gtZGV2aWNlLWlkJzogdGhpcy5hbGlUb2tlbnMuZGV2aWNlX2lkLFxcXFxuICAgICAgICAgICAgICAgICAgICAneC1zaWduYXR1cmUnOiBuZXdTaWduLnNpZ25hdHVyZVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSwgMyk7XFxcXG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xcXFxuICAgICAgICAgICAgcmV0dXJuIG5ld1NpZ247XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCJTaWdu6I635Y+W5aSx6LSl77yM6K+36YeN6K+V44CCXFxcXFxcXFxuY29kZTpcXFxcXFxcIiArIChyZXN1bHQuY29kZSB8fCBcXFxcXFxcIlxcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFxubWVzc2FnZTpcXFxcXFxcIiArIChyZXN1bHQubWVzc2FnZSB8fCBcXFxcXFxcIlxcXFxcXFwiKSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIGdldFNoYXJlVmlkZW9QcmV2aWV3KGZpbGVJZCkge1xcXFxuICAgICAgICBsZXQgc2lnbiA9IHRoaXMuZ2V0U2lnbigpO1xcXFxuICAgICAgICBsZXQganNvbiA9IHBvc3RBcGkoJ2h0dHBzOi8vYXBpLmFsaXl1bmRyaXZlLmNvbS92Mi9maWxlL2dldF9zaGFyZV9saW5rX3ZpZGVvX3ByZXZpZXdfcGxheV9pbmZvJyx7XFxcXG4gICAgICAgICAgICBcXFxcXFxcImNhdGVnb3J5XFxcXFxcXCI6IFxcXFxcXFwibGl2ZV90cmFuc2NvZGluZ1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJmaWxlX2lkXFxcXFxcXCI6IGZpbGVJZCxcXFxcbiAgICAgICAgICAgIFxcXFxcXFwiZ2V0X3ByZXZpZXdfdXJsXFxcXFxcXCI6IHRydWUsXFxcXG4gICAgICAgICAgICBcXFxcXFxcInNoYXJlX2lkXFxcXFxcXCI6IHRoaXMuc2hhcmVJZCxcXFxcbiAgICAgICAgICAgIFxcXFxcXFwidGVtcGxhdGVfaWRcXFxcXFxcIjogXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIFxcXFxcXFwiZ2V0X3N1YnRpdGxlX2luZm9cXFxcXFxcIjogdHJ1ZVxcXFxuICAgICAgICB9LCB7XFxcXG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsXFxcXG4gICAgICAgICAgICBcXFxcXFxcIm9yaWdpblxcXFxcXFwiOiBcXFxcXFxcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJyZWZlcmVyXFxcXFxcXCI6IFxcXFxcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJ1c2VyLWFnZW50XFxcXFxcXCI6IFxcXFxcXFwiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExMC4wLjAuMCBTYWZhcmkvNTM3LjM2IEVkZy8xMTAuMC4xNTg3LjQxXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBcXFxcXFxcIngtY2FuYXJ5XFxcXFxcXCI6IFxcXFxcXFwiY2xpZW50PXdlYixhcHA9YWRyaXZlLHZlcnNpb249djMuMS4wXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBcXFxcXFxcIngtc2hhcmUtdG9rZW5cXFxcXFxcIjogdGhpcy5zaGFyZVRva2VuLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJmaWxlaWRcXFxcXFxcIjogdGhpcy5hbGlUb2tlbnMudXNlcl9pZCxcXFxcbiAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogdGhpcy5yZWFjY2Vzc1RrLFxcXFxuICAgICAgICAgICAgJ3gtZGV2aWNlLWlkJzogdGhpcy5hbGlUb2tlbnMuZGV2aWNlX2lkLFxcXFxuICAgICAgICAgICAgJ3gtc2lnbmF0dXJlJzogc2lnbi5zaWduYXR1cmVcXFxcbiAgICAgICAgfSwgKGUpID0+IHtcXFxcbiAgICAgICAgICAgIHRoaXMudHJ5U29sdmUoZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4ge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiB0aGlzLnJlYWNjZXNzVGssXFxcXG4gICAgICAgICAgICAgICAgICAgICdYLXNoYXJlLXRva2VuJzogdGhpcy5zaGFyZVRva2VuLFxcXFxuICAgICAgICAgICAgICAgICAgICAneC1kZXZpY2UtaWQnOiB0aGlzLmFsaVRva2Vucy5kZXZpY2VfaWQsXFxcXG4gICAgICAgICAgICAgICAgICAgICd4LXNpZ25hdHVyZSc6IHNpZ24uc2lnbmF0dXJlXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcblxcXFxuICAgICAgICByZXR1cm4ganNvbi52aWRlb19wcmV2aWV3X3BsYXlfaW5mby5saXZlX3RyYW5zY29kaW5nX3Rhc2tfbGlzdC5yZXZlcnNlKCk7XFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcbkFsaUFjY2Vzc0FwaS5jcmVhdGVEZWZhdWx0ID0gZnVuY3Rpb24oc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIGFsaVRva2VuLCBvcGVuVG9rZW4sIE1ZX1RJVExFKSB7XFxcXG4gICAgY29uc3Qge1xcXFxuICAgICAgICBvcGVuVG9rZW5zRmlsZXBhdGgsXFxcXG4gICAgICAgIGFsaVRva2Vuc0ZpbGVwYXRoXFxcXG4gICAgfSA9ICQucmVxdWlyZShcXFxcXFxcInRva2VuUGF0aFxcXFxcXFwiICsgKE1ZX1RJVExFID8gXFxcXFxcXCI/cnVsZT1cXFxcXFxcIiArIE1ZX1RJVExFIDogXFxcXFxcXCJcXFxcXFxcIikpO1xcXFxuXFxcXG4gICAgZnVuY3Rpb24gc2F2ZUFsaVRva2VuKHJlc3VsdCwgYXBpKSB7XFxcXG4gICAgICAgIHdyaXRlRmlsZShhbGlUb2tlbnNGaWxlcGF0aCwgSlNPTi5zdHJpbmdpZnkoYXBpLmFsaVRva2VucykpO1xcXFxuICAgIH1cXFxcblxcXFxuICAgIGZ1bmN0aW9uIHNhdmVPcGVuVG9rZW4ocmVzdWx0LCBhcGkpIHtcXFxcbiAgICAgICAgd3JpdGVGaWxlKG9wZW5Ub2tlbnNGaWxlcGF0aCwgSlNPTi5zdHJpbmdpZnkoYXBpLm9wZW5Ub2tlbnMpKTtcXFxcbiAgICB9XFxcXG5cXFxcbiAgICBmdW5jdGlvbiBwdXRTaGFyZVRva2VuKHJlc3VsdCkge1xcXFxuICAgICAgICBpZiAoTVlfVElUTEUpIHtcXFxcbiAgICAgICAgICAgIHNoYXJlVG9rZW4gPSBwdXRWYXIoTVlfVElUTEUgKyBcXFxcXFxcIkBcXFxcXFxcIiArIFxcXFxcXFwiYWxpU2hhcmVUb2tlblxcXFxcXFwiLCByZXN1bHQpO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgc2hhcmVUb2tlbiA9IHB1dE15VmFyKFxcXFxcXFwiYWxpU2hhcmVUb2tlblxcXFxcXFwiLCByZXN1bHQpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIGlmICghb3BlblRva2VuICYmIG9wZW5Ub2tlbiAhPT0gbnVsbCAmJiBmaWxlRXhpc3Qob3BlblRva2Vuc0ZpbGVwYXRoKSkge1xcXFxuICAgICAgICBvcGVuVG9rZW4gPSAkLnJlcXVpcmUob3BlblRva2Vuc0ZpbGVwYXRoKTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKCFhbGlUb2tlbiAmJiBmaWxlRXhpc3QoYWxpVG9rZW5zRmlsZXBhdGgpKSB7XFxcXG4gICAgICAgIGFsaVRva2VuID0gJC5yZXF1aXJlKGFsaVRva2Vuc0ZpbGVwYXRoKTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKE1ZX1RJVExFKSB7XFxcXG4gICAgICAgIHNoYXJlVG9rZW4gPSBnZXRWYXIoTVlfVElUTEUgKyBcXFxcXFxcIkBcXFxcXFxcIiArIFxcXFxcXFwiYWxpU2hhcmVUb2tlblxcXFxcXFwiLCBzaGFyZVRva2VuKTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICBzaGFyZVRva2VuID0gZ2V0TXlWYXIoXFxcXFxcXCJhbGlTaGFyZVRva2VuXFxcXFxcXCIsIHNoYXJlVG9rZW4pO1xcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gbmV3IEFsaUFjY2Vzc0FwaShzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVUb2tlbiwgYWxpVG9rZW4sIG9wZW5Ub2tlbiwgcHV0U2hhcmVUb2tlbiwgc2F2ZUFsaVRva2VuLCBzYXZlT3BlblRva2VuKTtcXFxcbn1cXFxcbiQuZXhwb3J0cyA9IEFsaUFjY2Vzc0FwaTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJUb2tlbui3r+W+hFxcXCIsXFxcInBhdGhcXFwiOlxcXCJ0b2tlblBhdGhcXFwiLFxcXCJydWxlXFxcIjpcXFwiJC5leHBvcnRzPXtcXFxcbiAgICBcXFxcXFxcIm9wZW5Ub2tlbnNGaWxlcGF0aFxcXFxcXFwiOiBcXFxcXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvTG95RGdJay9hbGlPcGVuVG9rZW4uanNvblxcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiYWxpVG9rZW5zRmlsZXBhdGhcXFxcXFxcIjogXFxcXFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0xveURnSWsvYWxpVG9rZW4uanNvblxcXFxcXFwiXFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5by55bmV5bel5YW3XFxcIixcXFwicGF0aFxcXCI6XFxcImRhbm11XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IGJhc2ljVXJsID0gXFxcXFxcXCJodHRwczovL2FwaS5kYW5kYW5wbGF5Lm5ldC9cXFxcXFxcIjtcXFxcbmxldCBzZXZlUGF0aCA9IFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9jYWNoZS9kYW5tdS9cXFxcXFxcIjtcXFxcbiQuZXhwb3J0cy5nZXREYW5NdSA9IGZ1bmN0aW9uKGtleSkge1xcXFxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlcXVlc3QoYmFzaWNVcmwgKyBcXFxcXFxcImFwaS92Mi9zZWFyY2gvZXBpc29kZXM/YW5pbWU9XFxcXFxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoZGVjb2RlVVJJQ29tcG9uZW50KGtleSkpKSk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGVuY29kZUh0bWwocykge1xcXFxuICAgIGxldCBSRUdYX0hUTUxfRU5DT0RFID0gL+KAnHwmfOKAmXxcXFxcXFxcXHUwMDNDfD58W1xcXFxcXFxceDAwLVxcXFxcXFxceDIwXXxbXFxcXFxcXFx4N0YtXFxcXFxcXFx4RkZdfFtcXFxcXFxcXHUwMTAwLVxcXFxcXFxcdTI3MDBdL2c7XFxcXG4gICAgcmV0dXJuIHMucmVwbGFjZShSRUdYX0hUTUxfRU5DT0RFLCBmdW5jdGlvbigkMCkge1xcXFxuICAgICAgICB2YXIgYyA9ICQwLmNoYXJDb2RlQXQoMCksXFxcXG4gICAgICAgICAgICByID0gW1xcXFxcXFwiJiNcXFxcXFxcIl07XFxcXG4gICAgICAgIGMgPSAoYyA9PSAweDIwKSA/IDB4QTAgOiBjO1xcXFxuICAgICAgICByLnB1c2goYyk7XFxcXG4gICAgICAgIHIucHVzaChcXFxcXFxcIjtcXFxcXFxcIik7XFxcXG4gICAgICAgIHJldHVybiByLmpvaW4oXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgfSk7XFxcXG59XFxcXG5cXFxcblxcXFxuXFxcXG4vLzDpu5jorqQgMeeugOS9kyAy57mB5L2TXFxcXG4kLmV4cG9ydHMuZG93bmxvYWREYW5NdSA9IGZ1bmN0aW9uKGVwaXNvZGVJZCwgbmFtZSkge1xcXFxuICAgIGxldCBkYW5NdURhdGEgPSBKU09OLnBhcnNlKHJlcXVlc3QoYnVpbGRVcmwoYmFzaWNVcmwgKyBcXFxcXFxcIi9hcGkvdjIvY29tbWVudC9cXFxcXFxcIiArIGVwaXNvZGVJZCwge1xcXFxuICAgICAgICB3aXRoUmVsYXRlZDogdHJ1ZSxcXFxcbiAgICAgICAgY2hDb252ZXJ0OiAxXFxcXG4gICAgfSkpKTtcXFxcbiAgICBsZXQgZE1jb250ZXh0ID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICBmb3IgKGxldCBjb21tZW50IG9mIGRhbk11RGF0YS5jb21tZW50cykge1xcXFxuICAgICAgICAvL2RNY29udGV4dCArPSBgPGQgcD1cXFxcXFxcIiR7TWF0aC5yb3VuZCh0aW1lcG9pbnQpfSwke2N0fSwke3NpemV9LCR7Y29sb3J9LDBcXFxcXFxcIj4ke2NvbnRlbnR9PC9kPlxcXFxcXFxcbmA7XFxcXG4gICAgICAgIGxldCBwYXJhbVRleHQgPSBjb21tZW50LnA7XFxcXG4gICAgICAgIGxldCBjb21tZW50VGV4dCA9IGNvbW1lbnQubTtcXFxcbiAgICAgICAgaWYgKHBhcmFtVGV4dCA9PSBudWxsIHx8IGNvbW1lbnRUZXh0ID09IG51bGwpIGNvbnRpbnVlO1xcXFxuICAgICAgICBsZXQgcGFyYW1zID0gcGFyYW1UZXh0LnNwbGl0KFxcXFxcXFwiLFxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IHBhcmFtc1QgPSBbXTtcXFxcbiAgICAgICAgZm9yIChsZXQgaSBpbiBwYXJhbXMpIHtcXFxcbiAgICAgICAgICAgIGlmIChpID09IDMpIHtcXFxcbiAgICAgICAgICAgICAgICAvL+minOiJsuWAvOS4ujDml7bvvIzpu5jorqTorr7nva7kuLrnmb3oibJcXFxcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zW2ldID09IFxcXFxcXFwiMFxcXFxcXFwiIHx8IHBhcmFtc1tpXSA9PSBcXFxcXFxcIi0xXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zVC5wdXNoKFxcXFxcXFwiMTY3NzcyMTVcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZiAoaSA9PSAyKSB7XFxcXG4gICAgICAgICAgICAgICAgcGFyYW1zVC5wdXNoKFxcXFxcXFwiMjVcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBwYXJhbXNULnB1c2gocGFyYW1zW2ldKTtcXFxcblxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHBhcmFtc1QucHVzaChcXFxcXFxcIjBcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICAgICAgZE1jb250ZXh0ICs9IGA8ZCBwPVxcXFxcXFwiJHtwYXJhbXNULmpvaW4oJywnKX1cXFxcXFxcIj4ke2VuY29kZUh0bWwoY29tbWVudFRleHQpfTwvZD5cXFxcXFxcXG5gO1xcXFxuICAgIH1cXFxcbiAgICBpZiAoIWRNY29udGV4dCkgcmV0dXJuO1xcXFxuICAgIGRNY29udGV4dCA9IGA8P3htbCB2ZXJzaW9uPVxcXFxcXFwiMS4wXFxcXFxcXCIgZW5jb2Rpbmc9XFxcXFxcXCJVVEYtOFxcXFxcXFwiPz48aT5cXFxcXFxcXG4ke2RNY29udGV4dH08L2k+YDtcXFxcbiAgICBsZXQgcGF0aCA9IHNldmVQYXRoICsgbmFtZS5yZXBsYWNlKC9cXFxcXFxcXC8vZyxcXFxcXFxcIl9cXFxcXFxcIikgKyBcXFxcXFxcIl9cXFxcXFxcIiArIGVwaXNvZGVJZCArIFxcXFxcXFwiLnhtbFxcXFxcXFwiO1xcXFxuICAgIHdyaXRlRmlsZShwYXRoLCBkTWNvbnRleHQpO1xcXFxuICAgIHJldHVybiBwYXRoO1xcXFxufVxcXFxuJC5leHBvcnRzLmdldExvY2FsRGFuTXUgPSBmdW5jdGlvbihlcGlzb2RlSWQsIG5hbWUpIHtcXFxcbiAgICBsZXQgcGF0aCA9IHNldmVQYXRoICsgbmFtZS5yZXBsYWNlKC9cXFxcXFxcXC8vZyxcXFxcXFxcIl9cXFxcXFxcIikgKyBcXFxcXFxcIl9cXFxcXFxcIiArIGVwaXNvZGVJZCArIFxcXFxcXFwiLnhtbFxcXFxcXFwiO1xcXFxuICAgIGlmIChmaWxlRXhpc3QocGF0aCkpIHtcXFxcbiAgICAgICAgcmV0dXJuIHBhdGg7XFxcXG4gICAgfVxcXFxufVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuW8ueW5leaQnOe0oibliqDovb1cXFwiLFxcXCJwYXRoXFxcIjpcXFwibG9hZERtXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IGQgPSBbXTtcXFxcbmxldCBvbmx5RG93bmxvYWQgPSAhIU1ZX1BBUkFNUy5vbmx5RG93bmxvYWQ7XFxcXG5pZiAob25seURvd25sb2FkKSB7XFxcXG4gICAgYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICgpID0+IHtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgIH0pO1xcXFxufVxcXFxuZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIixcXFxcbiAgICB0aXRsZTogXFxcXFxcXCI8Zm9udCBjb2xvcj0nR3JheSc+4p2X5YWz5LqOPGJyPjxzbWFsbD4g5YaF572u5by55bmV5pCc57Si5pWw5o2u5p2l5rqQ5LqOW+W8ueW8uXBsYXldPC9zbWFsbD48L2ZvbnQ+XFxcXFxcXCJcXFxcbn0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lXFxcXFxcXCJcXFxcbn0pO1xcXFxubGV0IGtleSA9IE1ZX1BBUkFNUy5uYW1lIHx8IGdldE15VmFyKFxcXFxcXFwic1xcXFxcXFwiKSB8fCBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcXFxcXCJ0aXRsZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSkgfHwgXFxcXFxcXCJcXFxcXFxcIjtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5YaF572u5pCc57Si5by55bmVXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKGtleSwgXFxcXFxcXCLor7fmkJzntKLnlarliaflkI3np7BcXFxcXFxcIikuaW5wdXQoKE1ZX1BBUkFNUykgPT4ge1xcXFxuICAgICAgICBzZXRQYWdlUGFyYW1zKE9iamVjdC5hc3NpZ24oTVlfUEFSQU1TLCB7XFxcXG4gICAgICAgICAgICBuYW1lOiBpbnB1dFxcXFxuICAgICAgICB9KSk7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgfSwgTVlfUEFSQU1TKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcImRt55uS5a2Q5pCc57Si5by55bmVXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGtleSwgb25seURvd25sb2FkKSA9PiB7XFxcXG4gICAgICAgIGxldCBkbSA9IGdldFZhcihcXFxcXFxcImRtX3NoYXJlXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoZG0gJiYgIW9ubHlEb3dubG9hZCkge1xcXFxuICAgICAgICAgICAgY2xlYXJWYXIoXFxcXFxcXCJkbV9zaGFyZVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hWaWRlb1VybCh7XFxcXG4gICAgICAgICAgICAgICAgZGFubXU6IGRtXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIGJhY2soZmFsc2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liqDovb3lrozmiJBcXFxcXFxcIjtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiAkKGtleSwgXFxcXFxcXCJkbeebkuWtkOaQnOe0olxcXFxcXFwiKS5pbnB1dCgoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgdG9hc3QoXFxcXFxcXCLkuIvovb3lrozmiJDlvLnluZXlkI7or7fph43mlrDngrnlh7vmkJzntKJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9zZWFyY2g/cnVsZT1kbeebkuWtkCZzPVxcXFxcXFwiICsgaW5wdXQ7XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sIGtleSwgb25seURvd25sb2FkKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmZ1bmN0aW9uIHNlYXJjaChkLCBuYW1lKSB7XFxcXG4gICAgY29uc3QgZGFubXUgPSAkLnJlcXVpcmUoXFxcXFxcXCJkYW5tdVxcXFxcXFwiKTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBsZXQgZG1MaXN0ID0gZGFubXUuZ2V0RGFuTXUobmFtZSk7XFxcXG5cXFxcbiAgICBmb3IgKGxldCBhbmltZSBvZiBkbUxpc3QuYW5pbWVzKSB7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogYW5pbWUuYW5pbWVUaXRsZSxcXFxcbiAgICAgICAgICAgIGRlc2M6IGFuaW1lLnR5cGVEZXNjcmlwdGlvbixcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImF2YXRhclxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiXFxcXFxcXCIsIFxcXFxcXFwi6K+36L6T5YWl5LiL6L296IyD5Zu0KDEsXFxcXFxcXCIgKyBhbmltZS5lcGlzb2Rlcy5sZW5ndGggKyBcXFxcXFxcIilcXFxcXFxcIikuaW5wdXQoKGFuaW1lVGl0bGUsIGVwaXNvZGVzKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IFthLCBiXSA9IGlucHV0LnNwbGl0KC8sfO+8jC8pO1xcXFxuICAgICAgICAgICAgICAgIGEgPSBOdW1iZXIoYSksIGIgPSBOdW1iZXIoYik7XFxcXG4gICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihhKSB8fCBOdW1iZXIuaXNOYU4oYikpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/or7fmjInmoLzlvI/ovpPlhaXmlbDlrZdcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgaWYgKGEgPCAxIHx8IGIgPiBlcGlzb2Rlcy5sZW5ndGgpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/or7fovpPlhaXop4TlrprojIPlm7TlhoXnmoTmlbDlrZdcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgY29uc3QgZGFubXUgPSAkLnJlcXVpcmUoXFxcXFxcXCJkYW5tdVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gYSAtIDEsIGogPSAxOyBpIDwgYjsgaSsrLCBqKyspIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcGlzb2RlID0gZXBpc29kZXNbaV07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG1UaXRsZSA9IGFuaW1lVGl0bGUgKyBcXFxcXFxcIl9cXFxcXFxcIiArIGVwaXNvZGUuZXBpc29kZVRpdGxlO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0xvYWRpbmcoXFxcXFxcXCLmraPlnKjkuIvovb3vvJpcXFxcXFxcIiArIGVwaXNvZGUuZXBpc29kZVRpdGxlICsgXFxcXFxcXCJcXFxcXFxcXHQoXFxcXFxcXCIgKyBqICsgXFxcXFxcXCIvXFxcXFxcXCIgKyAoYiAtIGEgKyAxKSArIFxcXFxcXFwiKVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhbm11LmRvd25sb2FkRGFuTXUoZXBpc29kZS5lcGlzb2RlSWQsIGRtVGl0bGUpO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lk6blk6bkuIvovb3lpLHotKUuLi5cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S4i+i9veWujOaIkFxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfSwgYW5pbWUuYW5pbWVUaXRsZSwgYW5pbWUuZXBpc29kZXMpLFxcXFxuICAgICAgICAgICAgcGljX3VybDogXFxcXFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL21vdmllLzE0LnN2Z1xcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZVxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBmb3IgKGxldCBlcGlzb2RlIG9mIGFuaW1lLmVwaXNvZGVzKSB7XFxcXG4gICAgICAgICAgICBsZXQgZG1UaXRsZSA9IGFuaW1lLmFuaW1lVGl0bGUgKyBcXFxcXFxcIl9cXFxcXFxcIiArIGVwaXNvZGUuZXBpc29kZVRpdGxlO1xcXFxuICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogZXBpc29kZS5lcGlzb2RlVGl0bGUsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKGVwaXNvZGUuZXBpc29kZUlkKS5sYXp5UnVsZSgodXJsLCB0aXRsZSwgb25seURvd25sb2FkKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhbm11ID0gJC5yZXF1aXJlKFxcXFxcXFwiZGFubXVcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gZGFubXUuZ2V0TG9jYWxEYW5NdShpbnB1dCwgdGl0bGUpIHx8IGRhbm11LmRvd25sb2FkRGFuTXUoaW5wdXQsIHRpdGxlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9ubHlEb3dubG9hZCkgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kuIvovb3lrozmiJBcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhbm11VGV4dCA9IGZldGNoKHBhdGgpO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhbm11VGV4dCkgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/ov5jmsqHmnInlvLnluZXlk59+XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hWaWRlb1VybCh7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkYW5tdTogcGF0aFxcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgYmFjayhmYWxzZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Yqg6L295a6M5oiQXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfSwgTVlfUEFSQU1TLmR1cmwsIGRtVGl0bGUsIG9ubHlEb3dubG9hZCksXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5by65Yi25LiL6L29XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoZXBpc29kZVRpdGxlLCBlcGlzb2RlSWQpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93TG9hZGluZyhcXFxcXFxcIuivt+etieW+hVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYW5tdSA9ICQucmVxdWlyZShcXFxcXFxcImRhbm11XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhbm11LmRvd25sb2FkRGFuTXUoZXBpc29kZUlkLCBlcGlzb2RlVGl0bGUpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/ph43mlrDkuIvovb3lrozmiJDvvIzljZXlh7vmjILovb3jgIJcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGRtVGl0bGUsIGVwaXNvZGUuZXBpc29kZUlkKVxcXFxuICAgICAgICAgICAgICAgICAgICB9XVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxuICAgIGlmICghZG1MaXN0LmFuaW1lcy5sZW5ndGgpIHtcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuayoeacieaJvuWIsOS4jltcXFxcXFxcIiArIG5hbWUgKyBcXFxcXFxcIl3nm7jlhbPnmoTlvLnluZVcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBkZXNjOiBcXFxcXFxcIuaQnOS4jeWIsOaAjuS5iOWKnu+8n1xcXFxcXFxcbuajgOafpeWQjeensOaYr+WQpuato+ehru+8m+WPr+S7peWwneivleWIoOmZpOmDqOWIhumZkOWumuivje+8jOWmguesrOS4gOWto+etie+8m+iAjOS4lOWPquiDveaQnOe0oueVquWJp+WTpu+8geWFtuS7luW8ueW5leWPr+eUqGRt55uS5a2Q44CCXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxufVxcXFxubGV0IG5hbWUgPSBnZXRQYXJhbShcXFxcXFxcIm5hbWVcXFxcXFxcIiwgTVlfUEFSQU1TLm5hbWUpO1xcXFxuaWYgKG5hbWUpIHtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBzZWFyY2goZCwgbmFtZSk7XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCcRVJST1LigJ3igJ1cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGRlc2M6IGUudG9TdHJpbmcoKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbn1cXFxcbnNldFJlc3VsdChkKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLop4TliJnliJfooahcXFwiLFxcXCJwYXRoXFxcIjpcXFwicnVsZXNcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG4kLmV4cG9ydHMgPSBbe1xcXFxuICAgICAgICBuYW1lOiBcXFxcXFxcIuWwj+S6kVxcXFxcXFwiLFxcXFxuICAgICAgICBwYWdlOiB0cnVlLFxcXFxuICAgICAgICBmaW5kKHMsIHBhZ2UpIHtcXFxcbiAgICAgICAgICAgIGxldCBiYXNpY1VybCA9IFxcXFxcXFwiaHR0cHM6Ly93d3cueXVuc28ubmV0XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBsZXQgYXBpID0gXFxcXFxcXCIvYXBpL3ZhbGlkYXRlL3NlYXJjaD93ZD1cXFxcXFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChzKSArIFxcXFxcXFwiJm1vZGU9OTAwMDEmc3R5cGU9MjAxMDAmdWs9JnBhZ2U9XFxcXFxcXCIgKyBwYWdlICsgXFxcXFxcXCImbGltaXQ9MjAmc2NyZWVuX2ZpbGV0eXBlPXVuZGVmaW5lZFxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgbGV0IGpzb24gPSBwb3N0KGJhc2ljVXJsICsgYXBpLCB7XFxcXG4gICAgICAgICAgICAgICAgYm9keTogXFxcXFxcXCJkYXRhPVxcXFxcXFwiICsgYXBpLFxcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgUmVmZXJlcjogXFxcXFxcXCJodHRwczovL3d3dy55dW5zby5uZXQvaW5kZXgvdXNlci9zP3dkPVxcXFxcXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHMpXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IEpTT04ucGFyc2UoanNvbikuZGF0YTtcXFxcbiAgICAgICAgICAgIGxldCBsaXN0ID0gcGRmYShodG1sLCBcXFxcXFxcImJvZHkmJi5sYXl1aS1jYXJkOmhhcyhhKVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGxldCBkID0gW107XFxcXG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIGxpc3QpIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBwZGZoKGl0ZW0sIFxcXFxcXFwiYSYmVGV4dFxcXFxcXFwiKS5yZXBsYWNlKFxcXFxcXFwiI+aWh+S7tuWkuSBcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgLy9sZXQgdGltZSA9IC9cXFxcXFxcXGR7NH0oLVxcXFxcXFxcZHsyfSl7Mn0gXFxcXFxcXFxkezJ9KFxcXFxcXFxcOlxcXFxcXFxcZHsyfSl7Mn0vLmV4ZWMocGRmaChpdGVtLCBcXFxcXFxcIi5sYXl1aS1jYXJkLWJvZHkmJlRleHRcXFxcXFxcIikpIHx8IFtdO1xcXFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgLy9kZXNjOiB0aW1lWzBdLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGJhc2U2NERlY29kZShwZGZoKGl0ZW0sIFxcXFxcXFwiYSYmdXJsXFxcXFxcXCIpKVxcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LCB7XFxcXG4gICAgICAgIG5hbWU6IFxcXFxcXFwi5re35ZCI55uYXFxcXFxcXCIsXFxcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxcXG4gICAgICAgIGZpbmQocywgcGFnZSkge1xcXFxuICAgICAgICAgICAgbGV0IHVybCA9IFxcXFxcXFwiaHR0cHM6Ly9hcGkuaHVuaGVwYW4uY29tL3YxL3NlYXJjaFxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgbGV0IGpzb24gPSBwb3N0KHVybCwge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgUmVmZXJlcjogXFxcXFxcXCJodHRwczovL2h1bmhlcGFuLmNvbS9cXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInFcXFxcXFxcIjogcyxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYWdlXFxcXFxcXCI6IHBhZ2UsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwic2l6ZVxcXFxcXFwiOiAxNVxcXFxuICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIGpzb24gPSBKU09OLnBhcnNlKGpzb24pO1xcXFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBqc29uLmRhdGEubGlzdDtcXFxcbiAgICAgICAgICAgIGxldCBkID0gW107XFxcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBsaXN0W2ldO1xcXFxuICAgICAgICAgICAgICAgIGlmIChpdC5kaXNrX3R5cGUgIT09IFxcXFxcXFwiQUxZXFxcXFxcXCIgfHwgaXQuc2hhcmVfdXNlciA9PT0gXFxcXFxcXCLkuLYqKirkuLZcXFxcXFxcIikgY29udGludWU7XFxcXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0LmRpc2tfbmFtZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgcGljX3VybDogcGQoaXQsIFxcXFxcXFwiaW1nJiZzcmNcXFxcXFxcIiwgdXJsKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBpdC5saW5rLFxcXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBpdC51cGRhdGVfdGltZSArIFxcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXCIgKyBpdC5saW5rLFxcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LCB7XFxcXG4gICAgICAgIG5hbWU6IFxcXFxcXFwi6LWE5rqQ5biuXFxcXFxcXCIsXFxcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxcXG4gICAgICAgIGZpbmQocywgcGFnZSkge1xcXFxuICAgICAgICAgICAgZnVuY3Rpb24gc2VhcmNoKCkge1xcXFxuICAgICAgICAgICAgICAgIGxldCBydG5MaXN0ID0gW107XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3AgPSByZXF1ZXN0KFxcXFxcXFwiaHR0cHM6Ly96eWIudXB5dW5zby5jb20vdjE1L3NlYXJjaD9rZXl3b3JkPVxcXFxcXFwiICsgZW5fYWVzKHMpICsgXFxcXFxcXCImc190eXBlPTImcGFnZT1cXFxcXFxcIiArIHBhZ2UgKyBcXFxcXFxcIiZhdGs9JmRpZD1cXFxcXFxcIiArIGdlbmVyYXRlUmFuZG9tSGV4U3RyaW5nKDY0KSwge1xcXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInVzZXItYWdlbnRcXFxcXFxcIjogXFxcXFxcXCJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IFJlZG1pIE5vdGUgNyBCdWlsZC9RS1ExLjE5MDkxMC4wMDI7IHd2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvODEuMC40MDQ0LjEzOCBNb2JpbGUgU2FmYXJpLzUzNy4zNiB1bmktYXBwIEh0bWw1UGx1cy8xLjAgKEltbWVyc2VkLzI5LjA5MDkxKVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIGxldCByZXNwRGF0YSA9IGRlX2FlcyhyZXNwKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQganNvbkRhdGEgPSBKU09OLnBhcnNlKHJlc3BEYXRhKSB8fCB7fTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0ganNvbkRhdGEucmVzdWx0IHx8IHt9O1xcXFxuICAgICAgICAgICAgICAgIGxldCBpdGVtcyA9IHJlc3VsdC5pdGVtcyB8fCBbXTtcXFxcbiAgICAgICAgICAgICAgICBcXFxcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtID0gaXRlbXNbaV07XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gaXRlbS5jb250ZW50IHx8IFtdO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5sZW5ndGggPT0gMHx8IWl0ZW0ucGFnZV91cmwpIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gZGVfYWVzKGl0ZW0ucGFnZV91cmwpIHx8IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmICghdXJsKSBjb250aW51ZTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcnRuTGlzdC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAoaXRlbS50aXRsZS5sZW5ndGg+MzA/aXRlbS50aXRsZS5zbGljZSgwLDI3KStcXFxcXFxcIi4uLlxcXFxcXFwiOml0ZW0udGl0bGUpIHx8IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBcXFxcXFxcIuWIhuS6q+aXtumXtO+8mlxcXFxcXFwiK2l0ZW0uaW5zZXJ0X3RpbWUsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHVybFxcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gcnRuTGlzdDtcXFxcbiAgICAgICAgICAgIH1cXFxcblxcXFxuICAgICAgICAgICAgZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21IZXhTdHJpbmcobGVuZ3RoKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgY29uc3QgY2hhcmFjdGVycyA9IFxcXFxcXFwiMDEyMzQ1Njc4OWFiY2RlZlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJhY3RlcnNMZW5ndGggPSBjaGFyYWN0ZXJzLmxlbmd0aDtcXFxcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjaGFyYWN0ZXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFyYWN0ZXJzTGVuZ3RoKSk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsZXQgYWxpVXRpbCA9ICQucmVxdWlyZShcXFxcXFxcImFsaVV0aWxcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBsZXQgQ3J5cHRvSlMgPSBhbGlVdGlsLmdldENyeXB0b0pTKCk7XFxcXG5cXFxcbiAgICAgICAgICAgIGZ1bmN0aW9uIGVuX2FlcyhlKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGkgPSBcXFxcXFxcInFxMTkyMDUyMDQ2MHFxenpcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAvLyBlbl9hZXNcXFxcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoaSk7XFxcXG4gICAgICAgICAgICAgICAgdmFyIHQgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShlKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgciA9IENyeXB0b0pTLkFFUy5lbmNyeXB0KHQsIGtleSwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgaXY6IGtleSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6IENyeXB0b0pTLm1vZGUuQ0JDLFxcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gci5jaXBoZXJ0ZXh0LnRvU3RyaW5nKCk7XFxcXG4gICAgICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgICAgIGZ1bmN0aW9uIGRlX2Flcyh2dikge1xcXFxuICAgICAgICAgICAgICAgIGxldCBpID0gXFxcXFxcXCJxcTE5MjA1MjA0NjBxcXp6XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgLy8gZGVfYWVzXFxcXG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKGkpO1xcXFxuICAgICAgICAgICAgICAgIGxldCBoZXhWYWwgPSBDcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHZ2KSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gQ3J5cHRvSlMuZW5jLkJhc2U2NC5zdHJpbmdpZnkoaGV4VmFsKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgZGVjcnlwdGVkID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQodmFsLCBrZXksIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl2OiBrZXksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQyxcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlY3J5cHRlZC50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gc2VhcmNoKCk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LCB7XFxcXG4gICAgICAgIG5hbWU6IFxcXFxcXFwi5LqR55uY6LWE5rqQXFxcXFxcXCIsXFxcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXFxcbiAgICAgICAgICAgIGxldCB1cmwgPSBcXFxcXFxcImh0dHBzOi8vcmVzLnl1bnBhbi53aW4vP1BhZ2VJbmRleD1cXFxcXFxcIiArIHBhZ2UgKyBcXFxcXFxcIiZQYWdlU2l6ZT0xMiZLZXl3b3JkPVxcXFxcXFwiICsgcyArIFxcXFxcXFwiJlR5cGU9JlRhZz1cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCh1cmwsIHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiUmVmZXJlclxcXFxcXFwiOiBcXFxcXFxcImh0dHBzOi8vcmVzLnl1bnBhbi53aW4vXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcblxcXFxuICAgICAgICAgICAgbGV0IGFyciA9IHBkZmEoaHRtbCwgXFxcXFxcXCJtYWluJiYuY2FyZFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIC8vbG9nKGFycik7XFxcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcXFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBwZGZoKGl0LCBcXFxcXFxcIi5jYXJkLWxpbmssMSYmb25jbGlja1xcXFxcXFwiKS5tYXRjaCgvaHR0cHM6XFxcXFxcXFwvXFxcXFxcXFwvKHd3d1xcXFxcXFxcLmFsaXl1bmRyaXZlXFxcXFxcXFwuY29tXFxcXFxcXFwvc3xhbHl3cFxcXFxcXFxcLm5ldClcXFxcXFxcXC9cXFxcXFxcXHcqL2cpIHx8IFtdO1xcXFxuICAgICAgICAgICAgICAgIHUgPSB1Lmxlbmd0aCA+IDAgPyB1WzBdIDogdXJsO1xcXFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBwZGZoKGl0LCBcXFxcXFxcIi5jYXJkLXRpdGxlJiZUZXh0XFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiBwZChpdCwgXFxcXFxcXCJpbWcmJnNyY1xcXFxcXFwiLCB1cmwpLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IHBkZmgoaXQsIFxcXFxcXFwiLmNhcmQtdGV4dCwtMSYmVGV4dFxcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXCIgKyB1LFxcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIHtcXFxcbiAgICAgICAgbmFtZTogXFxcXFxcXCJVUOS6keaQnFxcXFxcXFwiLFxcXFxuICAgICAgICBwYWdlOiB0cnVlLFxcXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxcXG4gICAgICAgICAgICBsZXQgdXJsID0gXFxcXFxcXCJodHRwczovL2FwaS51cHl1bnNvMi5jb20vc2VhcmNoP2tleXdvcmQ9XFxcXFxcXCIgKyBzICsgXFxcXFxcXCImcGFnZT1cXFxcXFxcIiArIHBhZ2UgKyBcXFxcXFxcIiZzX3R5cGU9MVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KHVybCwge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJSZWZlcmVyXFxcXFxcXCI6IFxcXFxcXFwiaHR0cHM6Ly93d3cudXB5dW5zby5jb21cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJDb29raWVcXFxcXFxcIjogXFxcXFxcXCJjb2RlPTE5MTlcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgLy9sb2coYmFzZTY0RGVjb2RlKGh0bWwpKTtcXFxcbiAgICAgICAgICAgIGxldCBhcnIgPSBKU09OLnBhcnNlKGJhc2U2NERlY29kZShodG1sKSkucmVzdWx0Lml0ZW1zO1xcXFxuICAgICAgICAgICAgLy9sb2coYXJyKTtcXFxcbiAgICAgICAgICAgIGxldCBkID0gW107XFxcXG4gICAgICAgICAgICBpZiAoIWFycikgcmV0dXJuIFtdO1xcXFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBpdC5wYWdlX3VybDtcXFxcbiAgICAgICAgICAgICAgICAvL3UgPSB1Lmxlbmd0aCA+IDAgPyB1WzBdIDogdXJsO1xcXFxuICAgICAgICAgICAgICAgIGlmICghdS5pbmNsdWRlcyhcXFxcXFxcImFsaXl1bmRyaXZlXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXQudGl0bGUsXFxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogdSxcXFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcXFxcXCJcXFxcXFxcXG5cXFxcXFxcIiArICh1KSxcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcblxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIHtcXFxcbiAgICAgICAgbmFtZTogXFxcXFxcXCLnjKvni7jnm5jmkJxcXFxcXFxcIixcXFxcbiAgICAgICAgcGFnZTogZmFsc2UsXFxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXFxcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChcXFxcXFxcImh0dHBzOi8vd3d3LmFsaXBhbnNvdS5jb20vc2VhcmNoP2s9XFxcXFxcXCIgKyBzLCB7XFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIlJlZmVyZXJcXFxcXFxcIjogXFxcXFxcXCJodHRwczovL3d3dy5hbGlwYW5zb3UuY29tL3NlYXJjaD9rPVxcXFxcXFwiICsgc1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgbGV0IGFyciA9IHBkZmEoaHRtbCwgXFxcXFxcXCIjYXBwJiZhXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgLy9sb2coYXJyKTtcXFxcbiAgICAgICAgICAgIGxldCBkID0gW107XFxcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IFxcXFxcXFwiPGRpdj5cXFxcXFxcIiArIGFycltpXSArIFxcXFxcXFwiPC9kaXY+XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBwZGZoKGl0LCBcXFxcXFxcImEmJmhyZWZcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgLy9sb2codSk7XFxcXG4gICAgICAgICAgICAgICAgaWYgKCF1LmluY2x1ZGVzKFxcXFxcXFwiL3MvXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB1ID0gXFxcXFxcXCJodHRwczovL3d3dy5hbGlwYW5zb3UuY29tXFxcXFxcXCIgKyB1LnJlcGxhY2UoXFxcXFxcXCIvcy9cXFxcXFxcIiwgXFxcXFxcXCIvY3YvXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBwZGZoKGl0LCBcXFxcXFxcInRlbXBsYXRlJiZUZXh0XFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IHBkZmgoaXQsIFxcXFxcXFwidGVtcGxhdGUsMSYmVGV4dFxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJldHVybiBkO1xcXFxuICAgICAgICB9LFxcXFxuICAgICAgICBmaW5kQWxpVXJsKGlucHV0KSB7XFxcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoaW5wdXQsIHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiQ29va2llXFxcXFxcXCI6IFxcXFxcXFwibm9fc2hvd19kb25hdGU9MVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIlJlZmVyZXJcXFxcXFxcIjogaW5wdXQucmVwbGFjZShcXFxcXFxcIi9jdi9cXFxcXFxcIiwgXFxcXFxcXCIvcy9cXFxcXFxcIilcXFxcbiAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0OiBmYWxzZVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICBodG1sID0gcGFyc2VEb21Gb3JIdG1sKGh0bWwsICdhJiZocmVmJyk7XFxcXG4gICAgICAgICAgICBpZiAoaHRtbC5sZW5ndGggPiAwKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWw7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBuYW1lOiBcXFxcXFxcIuaYk+aQnFxcXFxcXFwiLFxcXFxuICAgICAgICBwYWdlOiB0cnVlLFxcXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxcXG4gICAgICAgICAgICBsZXQgYWxpVXRpbCA9ICQucmVxdWlyZShcXFxcXFxcImFsaVV0aWxcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBsZXQgQ3J5cHRvSlMgPSBhbGlVdGlsLmdldENyeXB0b0pTKCk7XFxcXG5cXFxcbiAgICAgICAgICAgIGZ1bmN0aW9uIGtleWVuKHN0cikge1xcXFxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShcXFxcXFxcIjRPVG9TY1VGT2FlVlRySEVcXFxcXFxcIiksXFxcXG4gICAgICAgICAgICAgICAgICAgIGl2ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoXFxcXFxcXCI5Q0xHYW8xdkhLcW0xN096XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIHZhciBlbmNyeXB0ZWQgPSBDcnlwdG9KUy5BRVMuZGVjcnlwdCh7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNpcGhlcnRleHQ6IENyeXB0b0pTLmVuYy5CYXNlNjQucGFyc2Uoc3RyKVxcXFxuICAgICAgICAgICAgICAgIH0sIGtleSwge1xcXFxuICAgICAgICAgICAgICAgICAgICBpdjogaXYsXFxcXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6IENyeXB0b0pTLm1vZGUuQ0JDLFxcXFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBDcnlwdG9KUy5wYWQuUGtjczdcXFxcbiAgICAgICAgICAgICAgICB9KS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY3J5cHRlZDtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChcXFxcXFxcImh0dHBzOi8veWlzby5mdW4vYXBpL3NlYXJjaD9uYW1lPVxcXFxcXFwiICsgcyArIFxcXFxcXFwiJnBhZ2VObz1cXFxcXFxcIiArIHBhZ2UsIHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiUmVmZXJlclxcXFxcXFwiOiBcXFxcXFxcImh0dHBzOi8veWlzby5mdW4vaW5mbz9zZWFyY2hLZXk9XFxcXFxcXCIgKyBzLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIkNvb2tpZVxcXFxcXFwiOiBnZXRJdGVtKCd5aXNvdWNvb2tlJywgJycpXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAvL2xvZyhodG1sKTtcXFxcbiAgICAgICAgICAgIGlmIChodG1sLmluY2x1ZGVzKCfnmbvlvZXnlKjmiLfml6DpmZDliLYnKSkge1xcXFxuICAgICAgICAgICAgICAgIHZhciBpID0gMDtcXFxcbiAgICAgICAgICAgICAgICBkbyB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHZhciB0eWltZ2xpbiA9ICdodHRwczovL3lpc28uZnVuL2FwaS91c2VyL2xvZ2luL2NhcHRjaGE/dD0nICsgcGFyc2VJbnQobmV3IERhdGUoKS5nZXRUaW1lKCkpICsgJyc7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbWcgPSBjb252ZXJ0QmFzZTY0SW1hZ2UodHlpbWdsaW4pLnNwbGl0KCcsJylbMV07XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb2QgPSByZXF1ZXN0KCdodHRwczovL2FwaS54aG9mZS50b3Avb2NyL2I2NC90ZXh0Jywge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAndGV4dC9wbGFpbidcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBpbWcsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZlciA9IEpTT04ucGFyc2UocmVxdWVzdCgnaHR0cHM6Ly95aXNvLmZ1bi9hcGkvdXNlci9sb2dpbicsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZWZlcmVyJzogJ2h0dHBzOi8veWlzby5mdW4vbG9naW4nLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb29raWUnOiBnZXRDb29raWUodHlpbWdsaW4pXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keToge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwidXNlck5hbWVcXFxcXFxcIjogXFxcXFxcXCJ0dmJveDIwMjNcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCI6IFxcXFxcXFwiVHZib3gyMDIzXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJjb2RlXFxcXFxcXCI6IGNvZFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZlci5jb2RlID09IDIwMCkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCfmmJPmkJznmbvlhaXpqozor4HmiJDlip8nKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oJ3lpc291Y29va2UnLCBnZXRDb29raWUoJ2h0dHBzOi8veWlzby5mdW4nKSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sID0gcmVxdWVzdChcXFxcXFxcImh0dHBzOi8veWlzby5mdW4vYXBpL3NlYXJjaD9uYW1lPVxcXFxcXFwiICsgcyArIFxcXFxcXFwiJnBhZ2VObz1cXFxcXFxcIiArIHBhZ2UsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiUmVmZXJlclxcXFxcXFwiOiBcXFxcXFxcImh0dHBzOi8veWlzby5mdW4vaW5mbz9zZWFyY2hLZXk9XFxcXFxcXCIgKyBzLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIkNvb2tpZVxcXFxcXFwiOiBnZXRJdGVtKCd5aXNvdWNvb2tlJywgJycpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICBpKys7XFxcXG4gICAgICAgICAgICAgICAgfSB3aGlsZSAoaSA8IDQpO1xcXFxuXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsZXQgYXJyID0gSlNPTi5wYXJzZShodG1sKS5kYXRhLmxpc3Q7XFxcXG4gICAgICAgICAgICAvL2xvZyhhcnIpO1xcXFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXFxcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcXFxuICAgICAgICAgICAgICAgIGxldCB1ID0ga2V5ZW4oaXQudXJsKTtcXFxcbiAgICAgICAgICAgICAgICAvL2xvZyh1KTtcXFxcbiAgICAgICAgICAgICAgICBpZiAodSA9PSBudWxsIHx8ICF1LmluY2x1ZGVzKFxcXFxcXFwiYWxpeXVuXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXQubmFtZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1LFxcXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiAoaXQuZ210U2hhcmUgfHwgaXQuZ210Q3JlYXRlKSArIFxcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXCIgKyAodSksXFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG5cXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJldHVybiBkO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSxcXFxcbiAgICB7XFxcXG4gICAgICAgIG5hbWU6IFxcXFxcXFwi5om+6LWE5rqQXFxcXFxcXCIsXFxcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXFxcbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldGh0bWwoKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KFxcXFxcXFwiaHR0cHM6Ly96aGFveml5dWFuLm1lL3NvP2ZpbGVuYW1lPVxcXFxcXFwiICsgcyArIFxcXFxcXFwiJnBhZ2U9XFxcXFxcXCIgKyBwYWdlLCB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiUmVmZXJlclxcXFxcXFwiOiBcXFxcXFxcImh0dHBzOi8vemhhb3ppeXVhbi5tZS9zdG9wLmh0bWxcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwib3JpZ2luXFxcXFxcXCI6IFxcXFxcXFwiaHR0cHM6Ly96aGFveml5dWFuLm1lXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIkNvb2tpZVxcXFxcXFwiOiBnZXRJdGVtKFxcXFxcXFwienp5Y29va2VcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInVwZ3JhZGUtaW5zZWN1cmUtcmVxdWVzdHNcXFxcXFxcIjogXFxcXFxcXCIxXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcImNvbnRlbnQtdHlwZVxcXFxcXFwiOiBcXFxcXFxcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDtcXFxcbiAgICAgICAgICAgIH07XFxcXG4gICAgICAgICAgICB2YXIgaHRtbCA9IGdldGh0bWwoKTtcXFxcbiAgICAgICAgICAgIGlmICghaHRtbC5pbmNsdWRlcyhcXFxcXFxcInNlYXJjaF9ib3hcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdXNlciA9ICdkWE5sY201aGJXVTllWEJxTWpBeU15WndZWE56ZDI5eVpEMTVjR295TURJeic7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGNvb2sgPSBKU09OLnBhcnNlKGZldGNoQ29va2llKCdodHRwczovL3poYW96aXl1YW4ubWUvbG9naXUuaHRtbCcsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiBNT0JJTEVfVUEsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnT3JpZ2luJzogJ2h0dHBzOi8vemhhb3ppeXVhbi5tZScsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3poYW96aXl1YW4ubWUvbG9naW4uaHRtbCcsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInVwZ3JhZGUtaW5zZWN1cmUtcmVxdWVzdHNcXFxcXFxcIjogXFxcXFxcXCIxXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogYmFzZTY0RGVjb2RlKHVzZXIpLFxcXFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcXFxcbiAgICAgICAgICAgICAgICAgICAgb25seUhlYWRlcnM6IHRydWUsXFxcXG4gICAgICAgICAgICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlXFxcXG4gICAgICAgICAgICAgICAgfSkpLmpvaW4oJzsnKTtcXFxcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwienp5Y29va2VcXFxcXFxcIiwgY29vayk7XFxcXG4gICAgICAgICAgICAgICAgbG9nKFxcXFxcXFwi5om+6LWE5rqQ55m75YWlXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGh0bWwgPSBnZXRodG1sKCk7XFxcXG4gICAgICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgICAgIGxldCBhcnIgPSBwZGZhKGh0bWwsIFxcXFxcXFwiYm9keSYmLm5ld3NMaXN0JiZsaTpub3QoOmZpcnN0LWNoaWxkKVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIC8vbG9nKGFycik7XFxcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcXFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBwZGZoKGl0LCBcXFxcXFxcImEmJmhyZWZcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgaWYgKHUgPT0gbnVsbCkge1xcXFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgdSA9IFxcXFxcXFwiaHR0cHM6Ly96aGFveml5dWFuLm1lL1xcXFxcXFwiICsgdTtcXFxcbiAgICAgICAgICAgICAgICAvL2xvZyh1KTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBwZGZoKGl0LCBcXFxcXFxcIi5uZXdzX3RleHQmJmgzJiZUZXh0XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGlmICghdGl0bGUpIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogcGRmaChpdCwgXFxcXFxcXCIubmV3c190ZXh0JiZwJiZUZXh0XFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJldHVybiBkO1xcXFxuICAgICAgICB9LFxcXFxuICAgICAgICBmaW5kQWxpVXJsKGlucHV0KSB7XFxcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoaW5wdXQpO1xcXFxuICAgICAgICAgICAgdmFyIF9saW5rcyA9IGh0bWwubWF0Y2goL2h0dHBzOlxcXFxcXFxcL1xcXFxcXFxcLyh3d3dcXFxcXFxcXC5hbGl5dW5kcml2ZVxcXFxcXFxcLmNvbVxcXFxcXFxcL3N8YWx5d3BcXFxcXFxcXC5uZXQpXFxcXFxcXFwvXFxcXFxcXFx3Ki9nKSB8fCBbXTtcXFxcblxcXFxuICAgICAgICAgICAgaWYgKF9saW5rcy5sZW5ndGggPiAwKSB7XFxcXG5cXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gX2xpbmtzWzBdO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIHtcXFxcbiAgICAgICAgbmFtZTogXFxcXFxcXCLlsI/nurjmnaFcXFxcXFxcIixcXFxcbiAgICAgICAgcGFnZTogZmFsc2UsXFxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXFxcbiAgICAgICAgICAgIGxldCBhbGlVdGlsID0gJC5yZXF1aXJlKFxcXFxcXFwiYWxpVXRpbFxcXFxcXFwiKTtcXFxcblxcXFxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0dG9rZW4oKSB7XFxcXG4gICAgICAgICAgICAgICAgaWYgKGdldE15VmFyKCd4enl0b2tlbicsICcnKS5sZW5ndGggPT0gMCkge1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgdG9rZW4gPSBKU09OLnBhcnNlKHBvc3QoJ2h0dHBzOi8vZ2l0Y2FmZS5uZXQvdG9vbC9hbGlwYXBlci8nLCB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly91LmdpdGNhZmUuaW5rLydcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnZ2V0X3Rva2VuJ1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICB9KSkuZGF0YTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoJ3h6dHRva2VuJywgdG9rZW4pO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TXlWYXIoJ3h6dHRva2VuJywgJycpO1xcXFxuICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgICAgICBmdW5jdGlvbiBjYXRfY29kZShhKSB7XFxcXG4gICAgICAgICAgICAgICAgdmFyIGQsIGUsIGIgPSBbXFxcXFxcXCLljY7or63nlLXop4ZcXFxcXFxcIiwgXFxcXFxcXCLml6Xpn6nnlLXop4ZcXFxcXFxcIiwgXFxcXFxcXCLmrKfnvo7nlLXop4ZcXFxcXFxcIiwgXFxcXFxcXCLlhbbku5bnlLXop4ZcXFxcXFxcIiwgXFxcXFxcXCLljY7or63nlLXlvbFcXFxcXFxcIiwgXFxcXFxcXCLml6Xpn6nnlLXlvbFcXFxcXFxcIiwgXFxcXFxcXCLmrKfnvo7nlLXlvbFcXFxcXFxcIiwgXFxcXFxcXCLlhbbku5bnlLXlvbFcXFxcXFxcIiwgXFxcXFxcXCLljY7or63liqjmvKtcXFxcXFxcIiwgXFxcXFxcXCLml6Xpn6nliqjmvKtcXFxcXFxcIiwgXFxcXFxcXCLmrKfnvo7liqjmvKtcXFxcXFxcIiwgXFxcXFxcXCLnuqrlvZXniYdcXFxcXFxcIiwgXFxcXFxcXCLnu7zoibrniYdcXFxcXFxcIiwgXFxcXFxcXCLmlZnogrLln7norq1cXFxcXFxcIiwgXFxcXFxcXCLlhbbku5bop4bpopFcXFxcXFxcIiwgXFxcXFxcXCLljY7or63pn7PkuZBcXFxcXFxcIiwgXFxcXFxcXCLml6Xpn6npn7PkuZBcXFxcXFxcIiwgXFxcXFxcXCLmrKfnvo7pn7PkuZBcXFxcXFxcIiwgXFxcXFxcXCLlhbbku5bpn7PkuZBcXFxcXFxcIiwgXFxcXFxcXCLlqLHkuZDova/ku7ZcXFxcXFxcIiwgXFxcXFxcXCLns7vnu5/ova/ku7ZcXFxcXFxcIiwgXFxcXFxcXCLnvZHnu5zova/ku7ZcXFxcXFxcIiwgXFxcXFxcXCLlip7lhazova/ku7ZcXFxcXFxcIiwgXFxcXFxcXCLlhbbku5bova/ku7ZcXFxcXFxcIiwgXFxcXFxcXCLmvKvnlLtcXFxcXFxcIiwgXFxcXFxcXCLlsI/or7RcXFxcXFxcIiwgXFxcXFxcXCLlh7rniYjkuaZcXFxcXFxcIiwgXFxcXFxcXCLnn6Xor4bln7norq1cXFxcXFxcIiwgXFxcXFxcXCLlhbbku5bmlofmoaNcXFxcXFxcIiwgXFxcXFxcXCLlo4HnurhcXFxcXFxcIiwgXFxcXFxcXCLkurrnialcXFxcXFxcIiwgXFxcXFxcXCLpo47mma9cXFxcXFxcIiwgXFxcXFxcXCLlhbbku5blm77niYdcXFxcXFxcIiwgXFxcXFxcXCLlhbbku5ZcXFxcXFxcIl0sXFxcXG4gICAgICAgICAgICAgICAgICAgIGMgPSBbXFxcXFxcXCJoeWRzXFxcXFxcXCIsIFxcXFxcXFwicmhkc1xcXFxcXFwiLCBcXFxcXFxcIm9tZHNcXFxcXFxcIiwgXFxcXFxcXCJxdGRzXFxcXFxcXCIsIFxcXFxcXFwiaHlkeVxcXFxcXFwiLCBcXFxcXFxcInJoZHlcXFxcXFxcIiwgXFxcXFxcXCJvbWR5XFxcXFxcXCIsIFxcXFxcXFwicXRkeVxcXFxcXFwiLCBcXFxcXFxcImh5ZG1cXFxcXFxcIiwgXFxcXFxcXCJyaGRtXFxcXFxcXCIsIFxcXFxcXFwib21kbVxcXFxcXFwiLCBcXFxcXFxcImpscFxcXFxcXFwiLCBcXFxcXFxcInp5cFxcXFxcXFwiLCBcXFxcXFxcImp5cHhcXFxcXFxcIiwgXFxcXFxcXCJxdHNwXFxcXFxcXCIsIFxcXFxcXFwiaHl5eVxcXFxcXFwiLCBcXFxcXFxcInJoeXlcXFxcXFxcIiwgXFxcXFxcXCJvbXl5XFxcXFxcXCIsIFxcXFxcXFwicXR5eVxcXFxcXFwiLCBcXFxcXFxcImtmcmpcXFxcXFxcIiwgXFxcXFxcXCJ4dHJqXFxcXFxcXCIsIFxcXFxcXFwid2xyalxcXFxcXFwiLCBcXFxcXFxcImJncmpcXFxcXFxcIiwgXFxcXFxcXCJxdHJqXFxcXFxcXCIsIFxcXFxcXFwibWhcXFxcXFxcIiwgXFxcXFxcXCJ4c1xcXFxcXFwiLCBcXFxcXFxcImNic1xcXFxcXFwiLCBcXFxcXFxcInpzcHhcXFxcXFxcIiwgXFxcXFxcXCJxdHdkXFxcXFxcXCIsIFxcXFxcXFwiYnpcXFxcXFxcIiwgXFxcXFxcXCJyd1xcXFxcXFwiLCBcXFxcXFxcImZqXFxcXFxcXCIsIFxcXFxcXFwicXR0cFxcXFxcXFwiLCBcXFxcXFxcInF0XFxcXFxcXCJdO1xcXFxuICAgICAgICAgICAgICAgIGZvciAoZCA9IDAsIGUgPSBjLmxlbmd0aDsgZSA+IGQ7IGQrKylcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNbZF0gPT0gYSkgcmV0dXJuIGJbZF07XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcXFxuICAgICAgICAgICAgbGV0IGh0bWwgPSBwb3N0KFxcXFxcXFwiaHR0cHM6Ly9naXRjYWZlLm5ldC90b29sL2FsaXBhcGVyL1xcXFxcXFwiLCB7XFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3UuZ2l0Y2FmZS5pbmsvJ1xcXFxuICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgYm9keToge1xcXFxuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFxcXFxcXFwic2VhcmNoXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgIGZyb206IFxcXFxcXFwid2ViXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgIHRva2VuOiBnZXR0b2tlbigpLFxcXFxuICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiBzXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgIGxldCBsaXN0ID0gSlNPTi5wYXJzZShodG1sKTtcXFxcbiAgICAgICAgICAgIGlmIChsaXN0LmRhdGEpIHtcXFxcbiAgICAgICAgICAgICAgICBsaXN0ID0gbGlzdC5kYXRhO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gbGlzdFtpXVxcXFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGl0LnRpdGxlO1xcXFxuICAgICAgICAgICAgICAgIGxldCBtdXJsID0gJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zLycgKyBpdC5hbGlrZXlcXFxcbiAgICAgICAgICAgICAgICBpZiAoIWFsaVV0aWwuY2hlY2thbGkobXVybCkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGlmICh0aXRsZS5pbmNsdWRlcyhzKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oiaIFxcXFxcXFwiICsgdGl0bGUsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBjYXRfY29kZShpdC5jYXQpLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXM6IGl0LmRlc1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogbXVybFxcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gZDtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBuYW1lOiBcXFxcXFxcIueOqeWBtuWTpeWTpVxcXFxcXFwiLFxcXFxuICAgICAgICBwYWdlOiB0cnVlLFxcXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxcXG4gICAgICAgICAgICBsZXQgdXJsID0gXFxcXFxcXCJodHRwOi8vd29nZy54eXovaW5kZXgucGhwL3ZvZHNlYXJjaC9cXFxcXFxcIiArIHMgKyBcXFxcXFxcIi0tLS0tLS0tLS1cXFxcXFxcIiArIHBhZ2UgKyBcXFxcXFxcIi0tLS5odG1sXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QodXJsLCB7fSk7XFxcXG4gICAgICAgICAgICBsZXQgYXJyID0gcGFyc2VEb21Gb3JBcnJheShodG1sLCAnLm1vZHVsZS1pdGVtcyYmLm1vZHVsZS1zZWFyY2gtaXRlbScpO1xcXFxuICAgICAgICAgICAgLy9sb2coYXJyKTtcXFxcbiAgICAgICAgICAgIGxldCBkID0gW107XFxcXG4gICAgICAgICAgICBsZXQgYmV0ID0gW107XFxcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGFycltpXTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdXRpdGxlID0gcGFyc2VEb21Gb3JIdG1sKGl0LCAnaDMmJmEmJlRleHQnKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdXNlcmlhbCA9IHBhcnNlRG9tRm9ySHRtbChpdCwgJy52aWRlby1zZXJpYWwmJlRleHQnKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdWltYWdlID0gcGFyc2VEb20oaXQsICcubGF6eWxvYWQmJmRhdGEtc3JjJywgJ2h0dHA6Ly93b2dnLnh5ei8nKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdSA9IHBhcnNlRG9tKGl0LCAnaDMmJmEmJmhyZWYnLCAnaHR0cDovL3dvZ2cueHl6LycpO1xcXFxuICAgICAgICAgICAgICAgIC8vbGV0IGRldCA9IHJlcXVlc3QodSwge30pO1xcXFxuICAgICAgICAgICAgICAgIGJldC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHV0aXRsZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1LFxcXFxuICAgICAgICAgICAgICAgICAgICBpbWFnZTogdWltYWdlLFxcXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiB1c2VyaWFsXFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZiAoYmV0Lmxlbmd0aCA+IDApIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgYmV0aCA9IGJhdGNoRmV0Y2goYmV0KTtcXFxcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJldGgubGVuZ3RoOyBpKyspIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3QgPSBwYXJzZURvbUZvckFycmF5KGJldGhbaV0sICcubW9kdWxlLXBsYXllci1saXN0JiZwJylcXFxcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaXN0Lmxlbmd0aDsgaisrKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IHBhcnNlRG9tRm9ySHRtbChsaXN0W2pdLCAncCYmVGV4dCcpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1LmluY2x1ZGVzKFxcXFxcXFwiL3MvXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBiZXRbaV0udGl0bGUsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljX3VybDogYmV0W2ldLmltYWdlLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBiZXRbaV0uZGVzYyArICdcXFxcXFxcXG4nICsgdSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuXFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gZDtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBuYW1lOiBcXFxcXFxcIumYv+mHjOS6keebmOe9kVxcXFxcXFwiLFxcXFxuICAgICAgICBwYWdlOiB0cnVlLFxcXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxcXG4gICAgICAgICAgICBsZXQgdXJsID0gXFxcXFxcXCJodHRwczovL3d3dy5hbHlwdy5jbi9zZWFyY2gucGhwP3E9XFxcXFxcXCIgKyBzICsgXFxcXFxcXCImcGFnZT1cXFxcXFxcIiArIHBhZ2U7XFxcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QodXJsLCB7fSk7XFxcXG4gICAgICAgICAgICBsZXQgYXJyID0gcGFyc2VEb21Gb3JBcnJheShodG1sLCAnLmxpc3QmJmxpJyk7XFxcXG4gICAgICAgICAgICAvL2xvZyhhcnIpO1xcXFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXFxcbiAgICAgICAgICAgIGxldCBiZXQgPSBbXTtcXFxcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcXFxuICAgICAgICAgICAgICAgIGxldCB1dGl0bGUgPSBwYXJzZURvbUZvckh0bWwoaXQsICdhJiZ0aXRsZScpO1xcXFxuICAgICAgICAgICAgICAgIGxldCB1c2VyaWFsID0gcGFyc2VEb21Gb3JIdG1sKGl0LCAnLmZhLWNsb2NrLW8mJlRleHQnKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdWltYWdlID0gcGFyc2VEb20oaXQsICdpbWcmJnNyYycsICdodHRwczovL3d3dy5hbHlwdy5jbi8nKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdSA9IHBhcnNlRG9tKGl0LCAnYSYmaHJlZicsICdodHRwczovL3d3dy5hbHlwdy5jbi8nKTtcXFxcbiAgICAgICAgICAgICAgICAvL2xldCBkZXQgPSByZXF1ZXN0KHUsIHt9KTtcXFxcbiAgICAgICAgICAgICAgICBpZiAoIXV0aXRsZS5pbmNsdWRlcyhzKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgYmV0LnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdXRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxcXG4gICAgICAgICAgICAgICAgICAgIGltYWdlOiB1aW1hZ2UsXFxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IHVzZXJpYWxcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIC8vbG9nKGJldCk7XFxcXG4gICAgICAgICAgICBpZiAoYmV0Lmxlbmd0aCA+IDApIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgYmV0aCA9IGJhdGNoRmV0Y2goYmV0KTtcXFxcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJldGgubGVuZ3RoOyBpKyspIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3QgPSBwYXJzZURvbUZvckFycmF5KGJldGhbaV0sICdib2R5JiZhW2hyZWZePWh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zL10nKVxcXFxuICAgICAgICAgICAgICAgICAgICAvL2xvZyhsaXN0KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaXN0Lmxlbmd0aDsgaisrKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IHBhcnNlRG9tRm9ySHRtbChsaXN0W2pdLCAnYSYmaHJlZicpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYmV0W2ldLnRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY191cmw6IGJldFtpXS5pbWFnZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogYmV0W2ldLmRlc2MgKyAnXFxcXFxcXFxuJyArIHUsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXFxcblxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIHtcXFxcbiAgICAgICAgbmFtZTogXFxcXFxcXCLlnJ/mi6jpvKBcXFxcXFxcIixcXFxcbiAgICAgICAgcGFnZTogZmFsc2UsXFxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXFxcbiAgICAgICAgICAgIGxldCBodG1sID0gZmV0Y2goJ2h0dHBzOi8vd3d3LnRic2R5LmNvbS9zZWFyY2guaHRtbD9rZXl3b3JkPScgKyBzICsgJyZjYXRlZ29yeT05ODM5MjAmZGF0YV90eXBlPTk4NzkxMCcsIHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogUENfVUFcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcblxcXFxuICAgICAgICAgICAgbGV0IGFyciA9IHBhcnNlRG9tRm9yQXJyYXkoaHRtbCwgJy5zZWFyY2hfcmVzdWx0X25ldGRpc2tfbGlzdCYmYScpO1xcXFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXFxcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcXFxuICAgICAgICAgICAgICAgIC8vbG9nKGl0KTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdSA9IHBhcnNlRG9tRm9ySHRtbChpdCwgJ2EmJmhyZWYnKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdGl0ID0gcGFyc2VEb21Gb3JIdG1sKGl0LCAnLm5ldGRpc2tfaXRlbV9kZXRhaWxfbmFtZSYmVGV4dCcpO1xcXFxuICAgICAgICAgICAgICAgIGlmICghdGl0LmluY2x1ZGVzKHMpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAvL2xvZyh1KTtcXFxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0LFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IFxcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXCIgKyB1LFxcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIHtcXFxcbiAgICAgICAgbmFtZTogXFxcXFxcXCLpmL/ph4zmkJxcXFxcXFxcIixcXFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcXFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXFxcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCgnaHR0cHM6Ly9hbGlzby5jYy9zLycgKyBzICsgJy0nICsgcGFnZSArICctMC5odG1sJywge30pO1xcXFxuXFxcXG4gICAgICAgICAgICBsZXQgbGlzdCA9IHBhcnNlRG9tRm9yQXJyYXkoaHRtbCwgJy5zZWFyY2gtcmVzdWx0JiYucmVzb3VyY2UtaXRlbScpO1xcXFxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaXN0Lmxlbmd0aDsgaisrKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBsaXN0W2pdO1xcXFxuICAgICAgICAgICAgICAgIGxldCB0aXQgPSBwYXJzZURvbUZvckh0bWwodSwgJ2gzJiZUZXh0Jyk7XFxcXG4gICAgICAgICAgICAgICAgaWYgKCF0aXQuaW5jbHVkZXMocykpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXQsXFxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogcGFyc2VEb20odSwgJ2gzJiZhJiZocmVmJywgJ2h0dHBzOi8vYWxpc28uY2MvJyksXFxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IHBhcnNlRG9tRm9ySHRtbCh1LCAnLnRpbWUmJlRleHQnKSxcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcblxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxcXG4gICAgICAgIH0sXFxcXG4gICAgICAgIGZpbmRBbGlVcmwoaW5wdXQpIHtcXFxcbiAgICAgICAgICAgIGV2YWwoZ2V0Q3J5cHRvSlMoKSk7XFxcXG5cXFxcbiAgICAgICAgICAgIGZ1bmN0aW9uIGRlY3J5KHN0cikge1xcXFxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShcXFxcXFxcIjlFQjIwRERGRDZBRkJENjhcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgdmFyIGVuY3J5cHRlZCA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KHN0ciwga2V5LCB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGl2OiBrZXksXFxcXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6IENyeXB0b0pTLm1vZGUuQ0JDLFxcXFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBDcnlwdG9KUy5wYWQuUGtjczdcXFxcbiAgICAgICAgICAgICAgICB9KS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY3J5cHRlZDtcXFxcbiAgICAgICAgICAgIH1cXFxcblxcXFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KGlucHV0KTtcXFxcbiAgICAgICAgICAgIGxldCBidXQgPSBwYXJzZURvbShodG1sLCAnLmJ1dHRvbiYmaHJlZicsICdodHRwczovL2FsaXNvLmNjLycpO1xcXFxuICAgICAgICAgICAgLy9sb2coYnV0KTtcXFxcbiAgICAgICAgICAgIGxldCBnb3QgPSByZXF1ZXN0KGJ1dCk7XFxcXG4gICAgICAgICAgICAvL2xvZyhnb3QpO1xcXFxuICAgICAgICAgICAgZXZhbChwYXJzZURvbUZvckh0bWwoZ290LCAnaGVhZCYmc2NyaXB0LDEmJkh0bWwnKSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gZGVjcnkoYmFzZTY0LnNwbGl0KCchJylbMF0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSxcXFxcbiAgICB7XFxcXG4gICAgICAgIG5hbWU6IFxcXFxcXFwi5LqR55uY5YiG5Lqr56S+XFxcXFxcXCIsXFxcXG4gICAgICAgIHBhZ2U6IGZhbHNlLFxcXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxcXG4gICAgICAgICAgICBsZXQgYWxpVXRpbCA9ICQucmVxdWlyZShcXFxcXFxcImFsaVV0aWxcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBsZXQgQ3J5cHRvSlMgPSBhbGlVdGlsLmdldENyeXB0b0pTKCk7XFxcXG5cXFxcbiAgICAgICAgICAgIGZ1bmN0aW9uIGRlY3J5KHN0cikge1xcXFxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShcXFxcXFxcIjVGNkIyQUszM0RBU0QxMjNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgdmFyIGVuY3J5cHRlZCA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KHN0ciwga2V5LCB7XFxcXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6IENyeXB0b0pTLm1vZGUuRUNCLFxcXFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBDcnlwdG9KUy5wYWQuUGtjczdcXFxcbiAgICAgICAgICAgICAgICB9KS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY3J5cHRlZDtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCgnaHR0cHM6Ly93d3cueXVucGFuZmVueGlhbmcuY24vYXBpL2Jicy9hcGkvZ2V0ZGF0YT9rZXk9JyArIHMgKyAnJnR5cGU9dmlkZW8nLCB7XFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIlJlZmVyZXJcXFxcXFxcIjogXFxcXFxcXCJodHRwczovL3d3dy55dW5wYW5mZW54aWFuZy5jbi9cXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgbGV0IGpzb24gPSBkZWNyeShKU09OLnBhcnNlKGh0bWwpLmRhdGEpO1xcXFxuICAgICAgICAgICAgLy9sb2coanNvbik7XFxcXG4gICAgICAgICAgICBsZXQgYXJyID0gSlNPTi5wYXJzZShqc29uKTsgLy9bMF0ucmVzdWx0Lml0ZW1zO1xcXFxuICAgICAgICAgICAgLy9sb2coYXJyKTtcXFxcblxcXFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXFxcbiAgICAgICAgICAgIGxldCBiZXQgPSBbXTtcXFxcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcXFxuICAgICAgICAgICAgICAgIGxldCB1cmwgPSBpdC5waWQ7XFxcXG4gICAgICAgICAgICAgICAgYmV0LnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL3d3dy55dW5wYW5mZW54aWFuZy5jbi9hcGkvYmJzL2FwaS9nZXRhcnRpY2xlP2lkPScgKyB1cmwsXFxcXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIlJlZmVyZXJcXFxcXFxcIjogXFxcXFxcXCJodHRwczovL3d3dy55dW5wYW5mZW54aWFuZy5jbi9cXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAvL2xvZyh1KTtcXFxcbiAgICAgICAgICAgIGxldCBiZXRoID0gYmF0Y2hGZXRjaChiZXQpO1xcXFxuXFxcXG4gICAgICAgICAgICAvL2xvZyhhcnRpY2xlKTtcXFxcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmV0aC5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShiZXRoW2ldKS5kYXRhO1xcXFxuICAgICAgICAgICAgICAgIC8vbG9nKGpzb24pO1xcXFxuICAgICAgICAgICAgICAgIGxldCBsaXN0ID0ganNvbi5kb3dubG9hZC5zcGxpdCgnQCcpO1xcXFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGlzdC5sZW5ndGg7IGorKykge1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IGxpc3Rbal07XFxcXG4gICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZToganNvbi50aXRsZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zLycgKyB1LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzoganNvbi5jcmVhdGV0aW1lICsgXFxcXFxcXCJcXFxcXFxcXG5cXFxcXFxcIiArICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy8nICsgdSxcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgICAgICByZXR1cm4gZDtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBuYW1lOiBcXFxcXFxcIuebmOaQnFxcXFxcXFwiLFxcXFxuICAgICAgICBwYWdlOiB0cnVlLFxcXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxcXG4gICAgICAgICAgICBwYWdlID0gKHBhZ2UgLSAxKSAqIDEwO1xcXFxuICAgICAgICAgICAgbGV0IHVybCA9IFxcXFxcXFwiaHR0cHM6Ly93d3cucGFuc2VhcmNoLm1lL3NlYXJjaD9rZXl3b3JkPVxcXFxcXFwiICsgcyArIFxcXFxcXFwiJm9mZnNldD1cXFxcXFxcIiArIHBhZ2UgKyBcXFxcXFxcIiZwYW49YWxpeXVuZHJpdmVcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCh1cmwsIHt9KTtcXFxcblxcXFxuICAgICAgICAgICAgbGV0IGFyciA9IHBhcnNlRG9tRm9yQXJyYXkoaHRtbCwgJy5ncmlkJiYuc2hhZG93OmhhcyhhW2hyZWZePWh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zL10pJyk7XFxcXG4gICAgICAgICAgICAvL2xvZyhhcnIpO1xcXFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXFxcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcXFxuICAgICAgICAgICAgICAgIGxldCB1ID0gcGFyc2VEb21Gb3JIdG1sKGl0LCAnYVtocmVmXj1odHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy9dJiZocmVmJyk7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHBpY191cmwgPSBwYXJzZURvbUZvckh0bWwoaXQsICdpbWcmJnNyYycpO1xcXFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBwYXJzZURvbUZvckh0bWwoaXQsICcuYnJlYWstYWxsJiZUZXh0Jykuc3BsaXQoJ2h0dHAnKVswXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgcGljX3VybDogcGljX3VybCA9PT0gXFxcXFxcXCIvZmF2aWNvbi5wbmdcXFxcXFxcIiA/IFxcXFxcXFwiaHR0cHM6Ly93d3cucGFuc2VhcmNoLm1lL1xcXFxcXFwiICsgcGljX3VybCA6IHBpY191cmwsXFxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogdSxcXFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogcGFyc2VEb21Gb3JIdG1sKGl0LCAncCYmVGV4dCcpICsgXFxcXFxcXCJcXFxcXFxcXG5cXFxcXFxcIiArIHUsXFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG5cXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJldHVybiBkO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSxcXFxcbiAgICB7XFxcXG4gICAgICAgIG5hbWU6IFxcXFxcXFwiRE9WWOaQnFxcXFxcXFwiLFxcXFxuICAgICAgICBwYWdlOiBmYWxzZSxcXFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcXFxuICAgICAgICAgICAgbGV0IHVybCA9IFxcXFxcXFwiaHR0cHM6Ly9hcGkuZG92eC50ay9hbGkvc2VhcmNoP3dkPVxcXFxcXFwiICsgcztcXFxcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCh1cmwpO1xcXFxuICAgICAgICAgICAgbGV0IGFyciA9IEpTT04ucGFyc2UoaHRtbCkubGlzdDtcXFxcbiAgICAgICAgICAgIGxldCBkID0gW107XFxcXG4gICAgICAgICAgICBsZXQgYWxpVXRpbCA9ICQucmVxdWlyZShcXFxcXFxcImFsaVV0aWxcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGFycltpXTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdSA9IGl0LnZvZF9jb250ZW50O1xcXFxuICAgICAgICAgICAgICAgIGlmICghdS5pbmNsdWRlcyhcXFxcXFxcImFsaXl1bmRyaXZlXFxcXFxcXCIpIHx8ICFhbGlVdGlsLmNoZWNrYWxpKHUpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLiiJogXFxcXFxcXCIgKyBpdC52b2RfbmFtZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgcGljX3VybDogaXQudm9kX3BpYyxcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1LFxcXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiICsgdSxcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJldHVybiBkO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSxcXFxcbiAgICB7XFxcXG4gICAgICAgIG5hbWU6IFxcXFxcXFwi5b+F5bqUXFxcXFxcXCIsXFxcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXFxcbiAgICAgICAgICAgIGxldCB1cmwgPSBcXFxcXFxcImh0dHBzOi8vY24uYmluZy5jb20vc2VhcmNoP3E9XFxcXFxcXCIgKyBzICsgXFxcXFxcXCIrYWxpeXVuZHJpdmUmcXM9ZHMmZm9ybT1RQlJFXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBpZiAocGFnZSAhPSAxKSB7XFxcXG4gICAgICAgICAgICAgICAgdXJsID0gZ2V0TXlWYXIoXFxcXFxcXCJiaW5nXFxcXFxcXCIsIHVybCk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QodXJsLCB7XFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIlJlZmVyZXJcXFxcXFxcIjogXFxcXFxcXCJodHRwczovL2NuLmJpbmcuY29tL1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICAvL1xcXFxcXFwiWC1SZXF1ZXN0ZWQtV2l0aFxcXFxcXFwiOiBcXFxcXFxcImNvbS5leGFtcGxlLmhpa2Vydmlld1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIkFjY2VwdFxcXFxcXFwiOiBcXFxcXFxcInRleHQvaHRtbCxhcHBsaWNhdGlvbi94aHRtbCt4bWwsYXBwbGljYXRpb24veG1sO3E9MC45LGltYWdlL2F2aWYsaW1hZ2Uvd2VicCxpbWFnZS9hcG5nLCovKjtxPTAuOCxhcHBsaWNhdGlvbi9zaWduZWQtZXhjaGFuZ2U7dj1iMztxPTAuOVxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICBsZXQgYXJyID0gcGRmYShodG1sLCBcXFxcXFxcImJvZHkmJmFcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAvL2xvZyhhcnIpO1xcXFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXFxcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcXFxuICAgICAgICAgICAgICAgIGxldCB1ID0gcGQoaXQsIFxcXFxcXFwiYSYmaHJlZlxcXFxcXFwiLCB1cmwpO1xcXFxuICAgICAgICAgICAgICAgIGxldCB0ID0gcGRmaChpdCwgXFxcXFxcXCJhJiZUZXh0XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGlmIChpdC5pbmNsdWRlcyhcXFxcXFxcIk5leHQgcGFnZVxcXFxcXFwiKSB8fCBpdC5pbmNsdWRlcyhcXFxcXFxcIuS4i+S4gOmhtVxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgdTIgPSBwZChpdCwgXFxcXFxcXCJhJiZocmVmXFxcXFxcXCIsIHVybCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIC8vbG9nKFxcXFxcXFwibmV4dCBwYWdlXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICAvL2xvZyh1Mik7XFxcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiYmluZ1xcXFxcXFwiLCB1Mik7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGlmICh1ID09IG51bGwgfHwgdCA9PSBudWxsIHx8ICFpdC5pbmNsdWRlcyhzKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgaWYgKCFpdC5pbmNsdWRlcyhcXFxcXFxcIue9keebmFxcXFxcXFwiKSAmJiAhaXQuaW5jbHVkZXMoXFxcXFxcXCLkupHnm5hcXFxcXFxcIikgJiZcXFxcbiAgICAgICAgICAgICAgICAgICAgIWl0LmluY2x1ZGVzKFxcXFxcXFwiYWxpeXVuZHJpdmVcXFxcXFxcIikgJiYgIWl0LmluY2x1ZGVzKFxcXFxcXFwieXVucGFuXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBpZiAodS5zdGFydHNXaXRoKFxcXFxcXFwiaHR0cHM6Ly9jbi5iaW5nLmNvbS9cXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGxldCBkb20gPSBnZXRIb21lKHUpLnJlcGxhY2UoXFxcXFxcXCJodHRwOi8vXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpLnJlcGxhY2UoXFxcXFxcXCJodHRwczovL1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgX2xpbmtzID0gdC5tYXRjaCgvaHR0cHM6XFxcXFxcXFwvXFxcXFxcXFwvKHd3d1xcXFxcXFxcLmFsaXl1bmRyaXZlXFxcXFxcXFwuY29tXFxcXFxcXFwvc3xhbHl3cFxcXFxcXFxcLm5ldClcXFxcXFxcXC9cXFxcXFxcXHcqL2cpIHx8IFtdO1xcXFxuICAgICAgICAgICAgICAgIGxldCBjID0gbnVsbDtcXFxcbiAgICAgICAgICAgICAgICBpZiAoX2xpbmtzLmxlbmd0aCA+IDEgJiYgX2xpbmtzWzFdLnJlcGxhY2UoX2xpbmtzWzBdLCBcXFxcXFxcIlxcXFxcXFwiKS5yZXBsYWNlKC9bYS16QS1aMC05XSsvZywgXFxcXFxcXCJcXFxcXFxcIikgPT0gXFxcXFxcXCJcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgICAgICBjID0gX2xpbmtzWzFdO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX2xpbmtzLmxlbmd0aCA+IDApIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgYyA9IF9saW5rc1swXTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHQsXFxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IGRvbSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBjICE9IG51bGwgPyBjIDogdSxcXFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLov5vlhaXnvZHnq5lcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqczogSlNPTi5zdHJpbmdpZnkoXFxcXFxcXCJoaWtlcjovL3BhZ2UveXNmeD93ZWJVcmw9XFxcXFxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQodSkpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gZDtcXFxcbiAgICAgICAgfSxcXFxcbiAgICAgICAgZmluZEFsaVVybChpbnB1dCkge1xcXFxuICAgICAgICAgICAgaWYgKGlucHV0LmluY2x1ZGVzKFxcXFxcXFwiYWxpeXVuZHJpdmVcXFxcXFxcIikpIHJldHVybiBpbnB1dDtcXFxcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChpbnB1dCk7XFxcXG4gICAgICAgICAgICB2YXIgX2xpbmtzID0gaHRtbC5tYXRjaCgvaHR0cHM6XFxcXFxcXFwvXFxcXFxcXFwvKHd3d1xcXFxcXFxcLmFsaXl1bmRyaXZlXFxcXFxcXFwuY29tXFxcXFxcXFwvc3xhbHl3cFxcXFxcXFxcLm5ldClcXFxcXFxcXC9cXFxcXFxcXHcqL2cpIHx8IFtdO1xcXFxuICAgICAgICAgICAgaWYgKF9saW5rcy5sZW5ndGggPiAxICYmIF9saW5rc1sxXS5yZXBsYWNlKF9saW5rc1swXSwgXFxcXFxcXCJcXFxcXFxcIikucmVwbGFjZSgvW2EtekEtWjAtOV0rL2csIFxcXFxcXFwiXFxcXFxcXCIpID09IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gX2xpbmtzWzFdO1xcXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChfbGlua3MubGVuZ3RoID4gMCkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBfbGlua3NbMF07XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vcGFnZS95c2Z4P3dlYlVybD1cXFxcXFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChpbnB1dCk7XFxcXG4gICAgICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgfVxcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBuYW1lOiAnQ0NPRicsXFxcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXFxcbiAgICAgICAgICAgIGxldCBkID0gW11cXFxcbiAgICAgICAgICAgIGxldCBhbGlVdGlsID0gJC5yZXF1aXJlKFxcXFxcXFwiYWxpVXRpbFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGxldCBodG1sID0gZmV0Y2goJ2h0dHBzOi8vcGFuLmNjb2YuY2MvYXBpL3NlYXJjaCcsIHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiY29udGVudC10eXBlXFxcXFxcXCI6ICdhcHBsaWNhdGlvbi9qc29uJyxcXFxcbiAgICAgICAgICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly9wYW4uY2NvZi5jYy9zZWFyY2g/a2V5d29yZD0nICsgc1xcXFxuICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgYm9keToge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhZ2VTaXplXFxcXFxcXCI6IDIwLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhZ2VOdW1cXFxcXFxcIjogcGFnZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJrZXl3b3JkXFxcXFxcXCI6IHMsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiZnJvbU1vYmlsZVxcXFxcXFwiOiB0cnVlXFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcXFxuICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgIGxldCBsaXN0ID0gSlNPTi5wYXJzZShodG1sKVxcXFxuICAgICAgICAgICAgICAgIC5kYXRhLnJvd3NcXFxcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGxpc3RbaV07XFxcXG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gaXQuZmlsZU5hbWVcXFxcbiAgICAgICAgICAgICAgICBsZXQgbXVybCA9IGl0LnVybFxcXFxuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gaXQudHlwZS5yZXBsYWNlKC9mb2xkZXIvLCAn5paH5Lu25aS5JykucmVwbGFjZSgvZmlsZS8sICfmlofku7YnKVxcXFxuICAgICAgICAgICAgICAgIGlmICh0aXRsZS5pbmNsdWRlcyhzKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogJ+aWh+S7tuexu+Wei++8micgKyB0eXBlICsgJ++8jOaWh+S7tuWkp+Wwj++8micgKyBhbGlVdGlsLmJ5dGVzVG9TaXplKGl0LnNpemUpLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBtdXJsXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuIGRcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBuYW1lOiAn6Zi/6YeM5bCP56uZJyxcXFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcXFxuICAgICAgICAgICAgbGV0IGhvbWUgPSBcXFxcXFxcImh0dHBzOi8vcGFuNjY2Lm5ldFxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXFxcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChidWlsZFVybChob21lICsgXFxcXFxcXCIvYXBpL2Rpc2N1c3Npb25zXFxcXFxcXCIsIHtcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcImluY2x1ZGVcXFxcXFxcIjogXFxcXFxcXCJ1c2VyLGxhc3RQb3N0ZWRVc2VyLG1vc3RSZWxldmFudFBvc3QsbW9zdFJlbGV2YW50UG9zdC51c2VyLHRhZ3MsdGFncy5wYXJlbnQsZmlyc3RQb3N0XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJmaWx0ZXJbcV1cXFxcXFxcIjogcyAvKiArIFxcXFxcXFwiIHRhZzp2aWRlbyxjb21pY1xcXFxcXFwiKi8gLFxcXFxuICAgICAgICAgICAgICAgIC8vXFxcXFxcXCJmaWx0ZXJbdGFnXVxcXFxcXFwiOiBcXFxcXFxcInZpZGVvLGNvbWljXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJwYWdlW29mZnNldF1cXFxcXFxcIjogMjAgKiAocGFnZSAtIDEpXFxcXG4gICAgICAgICAgICB9KSwge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJjb250ZW50LXR5cGVcXFxcXFxcIjogXFxcXFxcXCJhcHBsaWNhdGlvbi9qc29uXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiUmVmZXJlclxcXFxcXFwiOiBcXFxcXFxcImh0dHBzOi8vcGFuNjY2Lm5ldC8/cT1cXFxcXFxcIiArIHNcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIGxldCBsaXN0ID0gSlNPTi5wYXJzZShodG1sKS5kYXRhO1xcXFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBsaXN0W2ldLmF0dHJpYnV0ZXM7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGhvbWUgKyBcXFxcXFxcIi9kL1xcXFxcXFwiICsgaXRlbS5zbHVnO1xcXFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiAn5Y+R5biD5pe26Ze077yaJyArICQuZGF0ZUZvcm1hdChuZXcgRGF0ZShpdGVtLmNyZWF0ZWRBdCksIFxcXFxcXFwieXl5eS1NTS1kZCBISDptbTpzc1xcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXFxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi6L+b5YWl5biW5a2QXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganM6IEpTT04uc3RyaW5naWZ5KFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3lzZng/d2ViVXJsPVxcXFxcXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHVybCkpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gZDtcXFxcbiAgICAgICAgfSxcXFxcbiAgICAgICAgZmluZEFsaVVybChpbnB1dCkge1xcXFxuICAgICAgICAgICAgbGV0IGh0bWwgPSBwZGZoKHJlcXVlc3QoaW5wdXQpLCBcXFxcXFxcIlRleHRcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBsZXQgX2xpbmtzID0gaHRtbC5tYXRjaCgvaHR0cHM6XFxcXFxcXFwvXFxcXFxcXFwvKHd3d1xcXFxcXFxcLmFsaXl1bmRyaXZlXFxcXFxcXFwuY29tXFxcXFxcXFwvc3xhbHl3cFxcXFxcXFxcLm5ldClcXFxcXFxcXC9cXFxcXFxcXHcqL2cpIHx8IFtdO1xcXFxuICAgICAgICAgICAgbGV0IHNoYXJlUHdkID0gaHRtbC5tYXRjaCgv5o+Q5Y+W56CBWzrvvJpdXFxcXFxcXFxzKj8oXFxcXFxcXFx3ezR9KS8pO1xcXFxuICAgICAgICAgICAgc2hhcmVQd2QgPSBBcnJheS5pc0FycmF5KHNoYXJlUHdkKSAmJiBzaGFyZVB3ZC5sZW5ndGggPiAwID8gc2hhcmVQd2RbMV0gOiBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgaWYgKF9saW5rcy5sZW5ndGggPiAxICYmIF9saW5rc1sxXS5yZXBsYWNlKF9saW5rc1swXSwgXFxcXFxcXCJcXFxcXFxcIikucmVwbGFjZSgvW2EtekEtWjAtOV0rL2csIFxcXFxcXFwiXFxcXFxcXCIpID09IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBhbGlVcmw6IF9saW5rc1sxXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkXFxcXG4gICAgICAgICAgICAgICAgfTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoX2xpbmtzLmxlbmd0aCA+IDApIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBhbGlVcmw6IF9saW5rc1swXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkXFxcXG4gICAgICAgICAgICAgICAgfTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3lzZng/d2ViVXJsPVxcXFxcXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGlucHV0KTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBuYW1lOiAn5LqR55uY5YiG5Lqr56S+5Yy6JyxcXFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcXFxuICAgICAgICAgICAgbGV0IGhvbWUgPSBcXFxcXFxcImh0dHBzOi8veXVucGFuMS5jY1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXFxcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChidWlsZFVybChob21lICsgXFxcXFxcXCIvYXBpL2Rpc2N1c3Npb25zXFxcXFxcXCIsIHtcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcImluY2x1ZGVcXFxcXFxcIjogXFxcXFxcXCJ1c2VyLGxhc3RQb3N0ZWRVc2VyLG1vc3RSZWxldmFudFBvc3QsbW9zdFJlbGV2YW50UG9zdC51c2VyLHRhZ3MsdGFncy5wYXJlbnQsZmlyc3RQb3N0XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJmaWx0ZXJbcV1cXFxcXFxcIjogcyAvKiArIFxcXFxcXFwiIHRhZzp2aWRlbyxjb21pY1xcXFxcXFwiKi8gLFxcXFxuICAgICAgICAgICAgICAgIC8vXFxcXFxcXCJmaWx0ZXJbdGFnXVxcXFxcXFwiOiBcXFxcXFxcInZpZGVvLGNvbWljXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJwYWdlW29mZnNldF1cXFxcXFxcIjogMjAgKiAocGFnZSAtIDEpXFxcXG4gICAgICAgICAgICB9KSwge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJjb250ZW50LXR5cGVcXFxcXFxcIjogXFxcXFxcXCJhcHBsaWNhdGlvbi9qc29uXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiUmVmZXJlclxcXFxcXFwiOiBcXFxcXFxcImh0dHBzOi8vcGFuNjY2Lm5ldC8/cT1cXFxcXFxcIiArIHNcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIGxldCBsaXN0ID0gSlNPTi5wYXJzZShodG1sKS5kYXRhO1xcXFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBsaXN0W2ldLmF0dHJpYnV0ZXM7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGhvbWUgKyBcXFxcXFxcIi9kL1xcXFxcXFwiICsgaXRlbS5zbHVnO1xcXFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiAn5Y+R5biD5pe26Ze077yaJyArICQuZGF0ZUZvcm1hdChuZXcgRGF0ZShpdGVtLmNyZWF0ZWRBdCksIFxcXFxcXFwieXl5eS1NTS1kZCBISDptbTpzc1xcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXFxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi6L+b5YWl5biW5a2QXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganM6IEpTT04uc3RyaW5naWZ5KFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3lzZng/d2ViVXJsPVxcXFxcXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHVybCkpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gZDtcXFxcbiAgICAgICAgfSxcXFxcbiAgICAgICAgZmluZEFsaVVybChpbnB1dCkge1xcXFxuICAgICAgICAgICAgbGV0IGh0bWwgPSBwZGZoKHJlcXVlc3QoaW5wdXQpLCBcXFxcXFxcIlRleHRcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBsZXQgX2xpbmtzID0gaHRtbC5tYXRjaCgvaHR0cHM6XFxcXFxcXFwvXFxcXFxcXFwvKHd3d1xcXFxcXFxcLmFsaXl1bmRyaXZlXFxcXFxcXFwuY29tXFxcXFxcXFwvc3xhbHl3cFxcXFxcXFxcLm5ldClcXFxcXFxcXC9cXFxcXFxcXHcqL2cpIHx8IFtdO1xcXFxuICAgICAgICAgICAgbGV0IHNoYXJlUHdkID0gaHRtbC5tYXRjaCgv5o+Q5Y+W56CBWzrvvJpdXFxcXFxcXFxzKj8oXFxcXFxcXFx3ezR9KS8pO1xcXFxuICAgICAgICAgICAgc2hhcmVQd2QgPSBBcnJheS5pc0FycmF5KHNoYXJlUHdkKSAmJiBzaGFyZVB3ZC5sZW5ndGggPiAwID8gc2hhcmVQd2RbMV0gOiBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgaWYgKF9saW5rcy5sZW5ndGggPiAxICYmIF9saW5rc1sxXS5yZXBsYWNlKF9saW5rc1swXSwgXFxcXFxcXCJcXFxcXFxcIikucmVwbGFjZSgvW2EtekEtWjAtOV0rL2csIFxcXFxcXFwiXFxcXFxcXCIpID09IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBhbGlVcmw6IF9saW5rc1sxXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkXFxcXG4gICAgICAgICAgICAgICAgfTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoX2xpbmtzLmxlbmd0aCA+IDApIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBhbGlVcmw6IF9saW5rc1swXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkXFxcXG4gICAgICAgICAgICAgICAgfTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3lzZng/d2ViVXJsPVxcXFxcXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGlucHV0KTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICAvKixcXFxcbiAgICAgICAge1xcXFxuICAgICAgICAgICAgbmFtZTogXFxcXFxcXCLlpYflppnmkJzntKJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHBhZ2U6IHRydWUsXFxcXG4gICAgICAgICAgICBmaW5kKHMsIHBhZ2UpIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdXJsO1xcXFxuICAgICAgICAgICAgICAgIGlmIChwYWdlID09PSAxKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHVybCA9IGJ1aWxkVXJsKFxcXFxcXFwiaHR0cHM6Ly93d3cubWFnaWNhbHNlYXJjaC50b3AvYXBpL3BzaG91L2dldERhdGFcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgd29yZDogcyxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFxcXFxcXFwi6Zi/6YeM572R55uYXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gYnVpbGRVcmwoXFxcXFxcXCJodHRwczovL3d3dy5tYWdpY2Fsc2VhcmNoLnRvcC9hcGkvcHNob3UvZ2V0TmV4dFBhZ2VcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBcXFxcXFxcImh0dHBzOi8vYXBpLnVweXVuc28yLmNvbS9zZWFyY2g/c190eXBlPTJAcGFnZT1cXFxcXFxcIiArIHBhZ2UgKyBcXFxcXFxcIkBrZXl3b3JkPVxcXFxcXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHMpLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgd2Vic2l0ZTogXFxcXFxcXCLpmL/ph4znvZHnm5hcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QodXJsLCB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZXI6IGJ1aWxkVXJsKFxcXFxcXFwiaHR0cHM6Ly93d3cubWFnaWNhbHNlYXJjaC50b3Avc2VhcmNoXFxcXFxcXCIsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkOiBzLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwYWdlOiAwXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3VsdCkpO1xcXFxuICAgICAgICAgICAgICAgIGxldCBsaXN0ID0gcmVzdWx0LnJlc3VsdC5pdGVtcztcXFxcbiAgICAgICAgICAgICAgICBsZXQgZCA9IFtdO1xcXFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0LmlkID09IC0xKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0LnRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcXFxcXCLml6XmnJ/vvJpcXFxcXFxcIiArIGl0Lmluc2VydF90aW1lICsgXFxcXFxcXCJcXFxcXFxcXG7ot6/lvoTvvJpcXFxcXFxcIiArIGl0LnBhdGgsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGl0LnBhZ2VfdXJsXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gZDtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSovXFxcXG5dO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuW3peWFt1xcXCIsXFxcInBhdGhcXFwiOlxcXCJhbGlVdGlsXFxcIixcXFwicnVsZVxcXCI6XFxcIiQuZXhwb3J0cyA9IHtcXFxcbiAgICBjaGVja2FsaShyZWFsdXJsKSB7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBpZiAocmVhbHVybC5pbmNsdWRlcyhcXFxcXFxcImNvbS9zL1xcXFxcXFwiKSAmJiByZWFsdXJsICE9IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgc2hhcmVJZCA9IHJlYWx1cmwuc3BsaXQoXFxcXFxcXCI/XFxcXFxcXCIpWzBdLnNwbGl0KFxcXFxcXFwiL1xcXFxcXFwiKVs0XTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgc2hhcmUgPSBmZXRjaChcXFxcXFxcImh0dHBzOi8vYXBpLmFsaXl1bmRyaXZlLmNvbS9hZHJpdmUvdjMvc2hhcmVfbGluay9nZXRfc2hhcmVfYnlfYW5vbnltb3VzXFxcXFxcXCIsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOiBQQ19VQSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiUmVmZXJlclxcXFxcXFwiOiBcXFxcXFxcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9cXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgICAgICBib2R5OiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInNoYXJlX2lkXFxcXFxcXCI6IHNoYXJlSWRcXFxcbiAgICAgICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICBpZiAoc2hhcmUuaW5jbHVkZXMoXFxcXFxcXCJzaGFyZV9saW5rIGlzXFxcXFxcXCIpIHx8IHNoYXJlLmluY2x1ZGVzKFxcXFxcXFwic2hhcmVfbGluayBjYW5ub3RcXFxcXFxcIikpIHJldHVybiBmYWxzZTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge31cXFxcbiAgICAgICAgcmV0dXJuIHRydWU7XFxcXG4gICAgfSxcXFxcbiAgICBieXRlc1RvU2l6ZShzaXplKSB7XFxcXG4gICAgICAgIGlmICghc2l6ZSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuICcwJztcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBjb25zdCB1bml0cyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQicsICdQQicsICdFQicsICdaQicsICdZQiddO1xcXFxuICAgICAgICBsZXQgaSA9IDA7XFxcXG4gICAgICAgIHdoaWxlIChzaXplID49IDEwMjQpIHtcXFxcbiAgICAgICAgICAgIHNpemUgLz0gMTAyNDtcXFxcbiAgICAgICAgICAgIGkrKztcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBzaXplID0gaSA/IE51bWJlcihzaXplLnRvRml4ZWQoMikpIDogc2l6ZTtcXFxcbiAgICAgICAgcmV0dXJuIGAke3NpemV9ICR7dW5pdHNbaV19YDtcXFxcbiAgICB9LFxcXFxuICAgIGdldENyeXB0b0pTKCkge1xcXFxuICAgICAgICBpZiAodHlwZW9mIENyeXB0b0pTID09PSBcXFxcXFxcInVuZGVmaW5lZFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBldmFsKGdldENyeXB0b0pTKCkpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIENyeXB0b0pTO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBDcnlwdG9KUztcXFxcbiAgICB9LFxcXFxuICAgIGdldE5hbWVzU29ydCgpIHtcXFxcbiAgICAgICAgbGV0IGNobk51bUNoYXIgPSB7XFxcXG4gICAgICAgICAgICDpm7Y6IDAsXFxcXG4gICAgICAgICAgICDkuIA6IDEsXFxcXG4gICAgICAgICAgICDkuow6IDIsXFxcXG4gICAgICAgICAgICDkuIk6IDMsXFxcXG4gICAgICAgICAgICDlm5s6IDQsXFxcXG4gICAgICAgICAgICDkupQ6IDUsXFxcXG4gICAgICAgICAgICDlha06IDYsXFxcXG4gICAgICAgICAgICDkuIM6IDcsXFxcXG4gICAgICAgICAgICDlhas6IDgsXFxcXG4gICAgICAgICAgICDkuZ06IDlcXFxcbiAgICAgICAgfTtcXFxcblxcXFxuICAgICAgICBsZXQgY2huTmFtZVZhbHVlID0ge1xcXFxuICAgICAgICAgICAg5Y2BOiB7XFxcXG4gICAgICAgICAgICAgICAgdmFsdWU6IDEwLFxcXFxuICAgICAgICAgICAgICAgIHNlY1VuaXQ6IGZhbHNlXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAg55m+OiB7XFxcXG4gICAgICAgICAgICAgICAgdmFsdWU6IDEwMCxcXFxcbiAgICAgICAgICAgICAgICBzZWNVbml0OiBmYWxzZVxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIOWNgzoge1xcXFxuICAgICAgICAgICAgICAgIHZhbHVlOiAxMDAwLFxcXFxuICAgICAgICAgICAgICAgIHNlY1VuaXQ6IGZhbHNlXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAg5LiHOiB7XFxcXG4gICAgICAgICAgICAgICAgdmFsdWU6IDEwMDAwLFxcXFxuICAgICAgICAgICAgICAgIHNlY1VuaXQ6IHRydWVcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICDkur86IHtcXFxcbiAgICAgICAgICAgICAgICB2YWx1ZTogMTAwMDAwMDAwLFxcXFxuICAgICAgICAgICAgICAgIHNlY1VuaXQ6IHRydWVcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgIGZ1bmN0aW9uIENoaW5lc2VUb051bWJlcihjaG5TdHIpIHtcXFxcbiAgICAgICAgICAgIGxldCBydG4gPSAwO1xcXFxuICAgICAgICAgICAgbGV0IHNlY3Rpb24gPSAwO1xcXFxuICAgICAgICAgICAgbGV0IG51bWJlciA9IDA7XFxcXG4gICAgICAgICAgICBsZXQgc2VjVW5pdCA9IGZhbHNlO1xcXFxuICAgICAgICAgICAgbGV0IHN0ciA9IGNoblN0ci5zcGxpdCgnJyk7XFxcXG5cXFxcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IG51bSA9IGNobk51bUNoYXJbc3RyW2ldXTtcXFxcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG51bSAhPT0gJ3VuZGVmaW5lZCcpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyID0gbnVtO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gc3RyLmxlbmd0aCAtIDEpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gbnVtYmVyO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVuaXQgPSBjaG5OYW1lVmFsdWVbc3RyW2ldXS52YWx1ZTtcXFxcbiAgICAgICAgICAgICAgICAgICAgc2VjVW5pdCA9IGNobk5hbWVWYWx1ZVtzdHJbaV1dLnNlY1VuaXQ7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWNVbml0KSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uID0gKHNlY3Rpb24gKyBudW1iZXIpICogdW5pdDtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ0biArPSBzZWN0aW9uO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiA9IDA7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uICs9IChudW1iZXIgKiB1bml0KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICBudW1iZXIgPSAwO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJldHVybiBydG4gKyBzZWN0aW9uO1xcXFxuICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgZnVuY3Rpb24gbmFtZUNvbXBhcmUoYSwgYikge1xcXFxuICAgICAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpXFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGEgPT0gbnVsbCA/IGIgPT0gbnVsbCA/IDAgOiAtMSA6IDE7XFxcXG5cXFxcbiAgICAgICAgICAgIGEgPSBhLnJlcGxhY2UoLyhb6Zu25LiA5LqM5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5Lq/XSkvZywgZnVuY3Rpb24obWF0Y2gsIHAxLCBwMiwgcDMsIG9mZnNldCwgc3RyaW5nKSB7XFxcXG4gICAgICAgICAgICAgICAgLy8gcDEgaXMgbm9uZGlnaXRzLCBwMiBkaWdpdHMsIGFuZCBwMyBub24tYWxwaGFudW1lcmljc1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBDaGluZXNlVG9OdW1iZXIocDEpO1xcXFxuICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgIGIgPSBiLnJlcGxhY2UoLyhb6Zu25LiA5LqM5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5Lq/XSkvZywgZnVuY3Rpb24obWF0Y2gsIHAxLCBwMiwgcDMsIG9mZnNldCwgc3RyaW5nKSB7XFxcXG4gICAgICAgICAgICAgICAgLy8gcDEgaXMgbm9uZGlnaXRzLCBwMiBkaWdpdHMsIGFuZCBwMyBub24tYWxwaGFudW1lcmljc1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBDaGluZXNlVG9OdW1iZXIocDEpO1xcXFxuICAgICAgICAgICAgfSlcXFxcblxcXFxuICAgICAgICAgICAgbGV0IE5VTUJFUlMgPSBqYXZhLnV0aWwucmVnZXguUGF0dGVybi5jb21waWxlKFxcXFxcXFwiKD88PVxcXFxcXFxcXFxcXFxcXFxEKSg/PVxcXFxcXFxcXFxcXFxcXFxkKXwoPzw9XFxcXFxcXFxcXFxcXFxcXGQpKD89XFxcXFxcXFxcXFxcXFxcXEQpXFxcXFxcXCIpXFxcXG4gICAgICAgICAgICBsZXQgc3BsaXQxID0gTlVNQkVSUy5zcGxpdChuZXcgamF2YS5sYW5nLlN0cmluZyhhKSk7XFxcXG4gICAgICAgICAgICBsZXQgc3BsaXQyID0gTlVNQkVSUy5zcGxpdChuZXcgamF2YS5sYW5nLlN0cmluZyhiKSk7XFxcXG5cXFxcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4oc3BsaXQxLmxlbmd0aCwgc3BsaXQyLmxlbmd0aCk7IGkrKykge1xcXFxuICAgICAgICAgICAgICAgIGxldCBjMSA9IHNwbGl0MVtpXS5jaGFyQ29kZUF0KDApO1xcXFxuICAgICAgICAgICAgICAgIGxldCBjMiA9IHNwbGl0MltpXS5jaGFyQ29kZUF0KDApO1xcXFxuICAgICAgICAgICAgICAgIGxldCBjbXAgPSAwO1xcXFxuICAgICAgICAgICAgICAgIGxldCB6ZXJvQ2hhckNvZGUgPSAnMCcuY2hhckNvZGVBdCgwKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgbmluZUNoYXJDb2RlID0gJzknLmNoYXJDb2RlQXQoMCk7XFxcXG5cXFxcbiAgICAgICAgICAgICAgICBpZiAoYzEgPj0gemVyb0NoYXJDb2RlICYmIGMxIDw9IG5pbmVDaGFyQ29kZSAmJiBjMiA+PSB6ZXJvQ2hhckNvZGUgJiYgYzIgPD0gbmluZUNoYXJDb2RlKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNtcCA9IG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcihzcGxpdDFbaV0pLmNvbXBhcmVUbyhuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoc3BsaXQyW2ldKSk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgICAgICAgICAgaWYgKGNtcCA9PT0gMCkge1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVnZXggPSAvW2EtekEtWjAtOV0vXFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBzMSA9IFN0cmluZyhzcGxpdDFbaV0pXFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBzMiA9IFN0cmluZyhzcGxpdDJbaV0pXFxcXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWdleC50ZXN0KHMxKSB8fCByZWdleC50ZXN0KHMyKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY21wID0gbmV3IGphdmEubGFuZy5TdHJpbmcoc3BsaXQxW2ldKS5jb21wYXJlVG8obmV3IGphdmEubGFuZy5TdHJpbmcoc3BsaXQyW2ldKSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbXAgPSBzMS5sb2NhbGVDb21wYXJlKHMyLCAnZW4nKVxcXFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY21wID0gczEubG9jYWxlQ29tcGFyZShzMiwgJ3poJylcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcblxcXFxuICAgICAgICAgICAgICAgIGlmIChjbXAgIT09IDApIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNtcDtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsZXQgbGVuZ3RoQ21wID0gc3BsaXQxLmxlbmd0aCAtIHNwbGl0Mi5sZW5ndGg7XFxcXG4gICAgICAgICAgICAvLyBpZiAobGVuZ3RoQ21wICE9PSAwKSBsZW5ndGhDbXAgPSBsZW5ndGhDbXAgPiAwID8gLTEgOiAxO1xcXFxuICAgICAgICAgICAgcmV0dXJuIGxlbmd0aENtcDtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gbmFtZUNvbXBhcmU7XFxcXG4gICAgfVxcXFxufVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuW8ueW5leaJuemHj+aMgui9vVxcXCIsXFxcInBhdGhcXFwiOlxcXCJkbU1vdW50XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IGQgPSBbXTtcXFxcbmFkZExpc3RlbmVyKFxcXFxcXFwib25DbG9zZVxcXFxcXFwiLCAoKSA9PiBjbGVhck15VmFyKFxcXFxcXFwiZGxsYXN0VGltZVxcXFxcXFwiKSk7XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLlvLnluZXmjILovb06XFxcXFxcXCIrKE1ZX1BBUkFNUy5mb2xkZXJOYW1lfHxcXFxcXFxcIj9cXFxcXFxcIikpO1xcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmuIXnqbrmjILovb3liJfooahcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJkbWxpc3RcXFxcXFxcIik7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0pLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfM1xcXFxcXFwiLFxcXFxufSk7XFxcXG5pZighTVlfUEFSQU1TLmF1dG9tYXRpY2FkZCl7XFxcXG4gICAgTVlfUEFSQU1TLmF1dG9tYXRpY2FkZCA9IGdldEl0ZW0oXFxcXFxcXCJhdXRvbWF0aWNhZGRcXFxcXFxcIixcXFxcXFxcIjFcXFxcXFxcIik7XFxcXG4gICAgc2V0UGFnZVBhcmFtcyhNWV9QQVJBTVMpO1xcXFxufVxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmo4DmtYvmlrDlop46XFxcXFxcXCIrW1xcXFxcXFwi5YWz6ZetXFxcXFxcXCIsXFxcXFxcXCLlvIDlkK9cXFxcXFxcIl1bTVlfUEFSQU1TLmF1dG9tYXRpY2FkZHx8XFxcXFxcXCIwXFxcXFxcXCJdLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCh2KSA9PiB7XFxcXG4gICAgICAgc2V0SXRlbShcXFxcXFxcImF1dG9tYXRpY2FkZFxcXFxcXFwiLCB2LmF1dG9tYXRpY2FkZD09PVxcXFxcXFwiMVxcXFxcXFwiP1xcXFxcXFwiMFxcXFxcXFwiOlxcXFxcXFwiMVxcXFxcXFwiKTtcXFxcbiAgICAgICB2LmF1dG9tYXRpY2FkZCA9IHVuZGVmaW5lZDtcXFxcbiAgICAgICBzZXRQYWdlUGFyYW1zKHYpO1xcXFxuICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgfSwgTVlfUEFSQU1TKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIixcXFxcbn0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLkuIvovb3lvLnluZVcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2xvYWREbSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBvbmx5RG93bmxvYWQ6IHRydWVcXFxcbiAgICB9XFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBcXFxcXFxcIuW3suaMgui9vVxcXFxcXFwiLmJpZygpLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgbGV0IGRtbGlzdCA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXFxcXFwiZG1saXN0XFxcXFxcXCIsIFtdKTtcXFxcbiAgICAgICAgbGV0IGFsaVV0aWwgPSAkLnJlcXVpcmUoXFxcXFxcXCJhbGlVdGlsXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgbmFtZUNvbXBhcmUgPSBhbGlVdGlsLmdldE5hbWVzU29ydCgpO1xcXFxuICAgICAgICBkbWxpc3Quc29ydCgoYSwgYikgPT4gbmFtZUNvbXBhcmUoYSwgYikpO1xcXFxuICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFxcXFxcImRtbGlzdFxcXFxcXFwiLCBkbWxpc3QpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5o6S5bqP5a6M5oiQXFxcXFxcXCI7XFxcXG4gICAgfSksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmxldCBmaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3dlaXN5ci9qcy9maWxlLmpzP3Y9MVxcXFxcXFwiKTtcXFxcbmxldCBkbWxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFxcXFxcImRtbGlzdFxcXFxcXFwiLCBbXSk7XFxcXG5cXFxcbmZvciAobGV0IGkgPSAwOyBpIDwgZG1saXN0Lmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgbGV0IGRtbmFtZSA9IGRtbGlzdFtpXTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCJbXFxcXFxcXCIgKyAoaSArIDEpICsgXFxcXFxcXCJdXFxcXFxcXFx0XFxcXFxcXCIgKyBkbW5hbWUsXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChpKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgZG1saXN0ID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcXFxcXCJkbWxpc3RcXFxcXFxcIiwgW10pO1xcXFxuICAgICAgICAgICAgZG1saXN0LnNwbGljZShpLCAxKTtcXFxcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXFxcXFwiZG1saXN0XFxcXFxcXCIsIGRtbGlzdCk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgIH0sIGkpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufVxcXFxuZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIFxcXFxcXFwi5pys5Zyw5pyq5oyC6L29XFxcXFxcXCIuYmlnKCksXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwi5piv5ZCm5riF6Zmk5omA5pyJ5pys5Zyw5by55bmV5paH5Lu2P1xcXFxcXFxcbijlvLnluZXmlofku7bmr4/kuInlpKnkvJroh6rliqjmuIXpmaQpXFxcXFxcXCIpLmNvbmZpcm0oKCkgPT4ge1xcXFxuICAgICAgICBsZXQgZmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS93ZWlzeXIvanMvZmlsZS5qcz92PTFcXFxcXFxcIik7XFxcXG4gICAgICAgIGZpbGUuZGVsZXRlRmlsZXMoZ2V0UGF0aChcXFxcXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvZGFubXUvXFxcXFxcXCIpLnNsaWNlKDcpKTtcXFxcbiAgICAgICAgY2xlYXJNeVZhcihcXFxcXFxcImRtbGlzdFxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+W3suWIoOmZpFxcXFxcXFwiO1xcXFxuICAgIH0pLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIlxcXFxufSk7XFxcXG5sZXQgZG1MaXN0UGF0aCA9IGdldFBhdGgoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL2NhY2hlL2Rhbm11L1xcXFxcXFwiKS5zbGljZSg3KTtcXFxcbmxldCBmaWxlTGlzdCA9IGZpbGUuZ2V0RmlsZVBhdGgoZG1MaXN0UGF0aCwgXFxcXFxcXCJmaWxlXFxcXFxcXCIsIFxcXFxcXFwiLnhtbFxcXFxcXFwiKTtcXFxcbmxldCBsYXN0VGltZSA9IDA7XFxcXG5cXFxcbmZvciAobGV0IGkgPSAwOyBpIDwgZmlsZUxpc3QubGVuZ3RoOyBpKyspIHtcXFxcbiAgICBsZXQgZG1maWxlID0gZmlsZUxpc3RbaV07XFxcXG4gICAgbGFzdFRpbWUgPSBNYXRoLm1heChsYXN0VGltZSwgZG1maWxlLmxhc3RNb2RpZmllZCk7XFxcXG4gICAgaWYgKGRtbGlzdC5pbmNsdWRlcyhkbWZpbGUubmFtZSkpIGNvbnRpbnVlO1xcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBkbWZpbGUubmFtZSxcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKG5hbWUpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBkbWxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFxcXFxcImRtbGlzdFxcXFxcXFwiLCBbXSk7XFxcXG4gICAgICAgICAgICBpZiAoIWRtbGlzdC5pbmNsdWRlcyhuYW1lKSkge1xcXFxuICAgICAgICAgICAgICAgIGRtbGlzdC5wdXNoKG5hbWUpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcXFxcXCJkbWxpc3RcXFxcXFxcIiwgZG1saXN0KTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgZG1maWxlLm5hbWUpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufVxcXFxubGV0IGxhc3RSZWNvcmQgPSBOdW1iZXIoZ2V0TXlWYXIoXFxcXFxcXCJkbGxhc3RUaW1lXFxcXFxcXCIsIFxcXFxcXFwiLTFcXFxcXFxcIikpO1xcXFxuXFxcXG5pZiAoTVlfUEFSQU1TLmF1dG9tYXRpY2FkZD09PVxcXFxcXFwiMVxcXFxcXFwiJiZsYXN0UmVjb3JkIT0tMSYmbGFzdFJlY29yZCA8IGxhc3RUaW1lKSB7XFxcXG4gICAgY29uZmlybSh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuaWsOW8ueW5leaWh+S7tlxcXFxcXFwiLFxcXFxuICAgICAgICBjb250ZW50OiBcXFxcXFxcIuajgOafpeWIsOaWsOS4i+i9veeahOW8ueW5leaYr+WQpuWFqOmDqOaMgui9ve+8n1xcXFxcXFwiLFxcXFxuICAgICAgICBjb25maXJtOiAkLnRvU3RyaW5nKChsYXN0UmVjb3JkLCBkbUxpc3RQYXRoKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgZmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS93ZWlzeXIvanMvZmlsZS5qcz92PTFcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBsZXQgZmlsZUxpc3QgPSBmaWxlLmdldEZpbGVQYXRoKGRtTGlzdFBhdGgsIFxcXFxcXFwiZmlsZVxcXFxcXFwiLCBcXFxcXFxcIi54bWxcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBsZXQgZG1saXN0ID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcXFxcXCJkbWxpc3RcXFxcXFxcIiwgW10pO1xcXFxuICAgICAgICAgICAgZmlsZUxpc3QuZm9yRWFjaCh2ID0+IHtcXFxcbiAgICAgICAgICAgICAgICBpZiAoIWRtbGlzdC5pbmNsdWRlcyh2Lm5hbWUpJiZ2Lmxhc3RNb2RpZmllZCA+IGxhc3RSZWNvcmQpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgZG1saXN0LnB1c2godi5uYW1lKTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXFxcXFwiZG1saXN0XFxcXFxcXCIsIGRtbGlzdCk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+aMgui9veaIkOWKn+OAglxcXFxcXFwiO1xcXFxuICAgICAgICB9LCBsYXN0UmVjb3JkLCBkbUxpc3RQYXRoKSxcXFxcbiAgICB9KTtcXFxcbn1cXFxcbmlmKGxhc3RUaW1lPj0wKXtcXFxcbiAgICBwdXRNeVZhcihcXFxcXFxcImRsbGFzdFRpbWVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiArIGxhc3RUaW1lKTtcXFxcbn1cXFxcbnNldFJlc3VsdChkKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLkuLvpobXlpITnkIZcXFwiLFxcXCJwYXRoXFxcIjpcXFwiTWFpblxcXCIsXFxcInJ1bGVcXFwiOlxcXCJpZiAoZ2V0SXRlbShcXFxcXFxcImZpcnN0XFxcXFxcXCIpID09IE1ZX1JVTEUudmVyc2lvbikge1xcXFxuICAgICQucmVxdWlyZShcXFxcXFxcInNvdVxcXFxcXFwiKTtcXFxcbn0gZWxzZSBpZiAoTVlfUEFHRSA9PT0gMSkge1xcXFxuICAgIGxldCBkID0gW11cXFxcbiAgICBsZXQgdGltZSA9IDIwO1xcXFxuICAgIGxldCBpZCA9IERhdGUubm93KCk7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc4oCd4oCdPHN0cm9uZz7kvb/nlKjliY3pobvnn6U8L3N0cm9uZz5cXFxcXFxcIi5iaWcoKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCIxLiDmnKzlsI/nqIvluo/miYDmnInku6PnoIHlhajpg6jlvIDmupDvvIzkuJTmnKzop4TliJnkuLrlrabkuaDnm67nmoTvvIzor7fkuo7lr7zlhaUyNOWwj+aXtuWGheWIoOmZpO+8ge+8ge+8gTxicj4yLiDmnKzlsI/nqIvluo88Yj7lrozlhajlhY3otLk8L2I+77yM5aaC5p6c5L2g5piv5LuY6LS56LSt5Lmw55qE5oGt5Zac5L2g6KKr6aqX5LqG44CCPGJyPuW9k+eEtuWmguaenOacieiDveWKm+aDs+m8k+WKseS9nOiAheeahOWPr+S7pTxhIGhyZWY9J2hpa2VyOi8vcGFnZS9Eb25hdGUudiNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSMnPuaUr+aMgeS4gOS4izwvYT4oPHNtYWxsPueCueWHu+WPr+i/m+WFpeaNkOi1oO+8jOWPr+WcqOS4u+mhteiPnOWNlei/m+WFpTwvc21hbGw+KeOAgjxicj4zLiDmnKzlsI/nqIvluo/mmK/lnKjljp/niYjjgIzkupHnm5jlkJvjgI3nmoTln7rnoYDov5vooYznmoTkuozmrKHkv67mlLnvvIzor7fmlK/mjIHljp/niYjjgII8YnI+PGJyPjxiPuW8gOWni+S9v+eUqOacrOinhOWImeWNs+S7o+ihqOmBteWuiOinhOWImTwvYj48YnI+5b2T5YmN54mI5pys77yaXFxcXFxcXCIgKyBNWV9SVUxFLnZlcnNpb24sXFxcXG4gICAgICAgIFxcXFxcXFwiY29sX3R5cGVcXFxcXFxcIjogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxuICAgIH0sIHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZVxcXFxcXFwiXFxcXG4gICAgfSwge1xcXFxuICAgICAgICB0aXRsZTogdGltZSArIFxcXFxcXFwi56eS5ZCO57un57utXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJ0b2FzdDovL+ivt+iupOecn+mYheivu+S7peS4iuWGheWuuVxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpZDogaWQgKyBcXFxcXFxcInRpbWVyXFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIHNldFJlc3VsdChkKTtcXFxcbiAgICB3aGlsZSAodGltZSAhPSAwKSB7XFxcXG4gICAgICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAoMTAwMCk7XFxcXG4gICAgICAgIHRpbWUgLT0gMTtcXFxcbiAgICAgICAgdXBkYXRlSXRlbShpZCArIFxcXFxcXFwidGltZXJcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgdGl0bGU6IHRpbWUgKyBcXFxcXFxcIuenkuWQjue7p+e7rVxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbiAgICB1cGRhdGVJdGVtKGlkICsgXFxcXFxcXCJ0aW1lclxcXFxcXFwiLCB7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOaIkeWQjOaEj+S7peS4iuimgeaxguKAneKAnVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgodikgPT4ge1xcXFxuICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcImZpcnN0XFxcXFxcXCIsIFN0cmluZyh2KSk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mhJ/osKLmgqjnmoTnkIbop6NcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgTVlfUlVMRS52ZXJzaW9uKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5o2Q6LWgXFxcIixcXFwicGF0aFxcXCI6XFxcIkRvbmF0ZS52XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IGQgPSBbXTtcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuaNkOi1oC/mlK/mjIFcXFxcXFxcIik7XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuaNkOi1oC/mlK/mjIFcXFxcXFxcIixcXFxcbiAgICBkZXNjOiBcXFxcXFxcIui/meS4quaNkOi1oOS4jeiDveS4uuS9oOW4puadpeeJueadg++8jOS9huaCqOeahOaUr+aMgeaYr+aIkeabtOaWsOWIm+S9nOeahOWKqOWKm+OAglxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwidG9hc3Q6Ly/mhJ/osKLmgqjnmoTmlK/mjIFcXFxcXFxcIlxcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInBpY18xX2Z1bGxcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaHR0cHM6Ly9naXRlZS5jb20vTG95RGdJay9Mb3lEZ0lrX1J1bGUvcmF3L21hc3Rlci82N2Q4ZjAxODdmMDE4NmMxLnBuZ1xcXFxcXFwiLFxcXFxuICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cHM6Ly9naXRlZS5jb20vTG95RGdJay9Mb3lEZ0lrX1J1bGUvcmF3L21hc3Rlci82N2Q4ZjAxODdmMDE4NmMxLnBuZ1xcXFxcXFwiXFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgXFxcXFxcXCLlm77niYfliqDovb3nvJPmhaLor7fnqI3nrYlcXFxcXFxcIi5zbWFsbCgpLmZvbnRjb2xvcihcXFxcXFxcIkdyYXlcXFxcXFxcIiksXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXFxcbiAgICB9XFxcXG59KTtcXFxcbnNldFJlc3VsdChkKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwidGV4dF9pY29uXFxcIixcXFwibmFtZVxcXCI6XFxcIuinhOWImeemgeeUqFxcXCIsXFxcInBhdGhcXFwiOlxcXCJSdWxlRGlzYWJsZVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuemgeeUqOinhOWImVxcXFxcXFwiKTtcXFxcbmFkZExpc3RlbmVyKFxcXFxcXFwib25DbG9zZVxcXFxcXFwiLCgpPT5yZWZyZXNoUGFnZSgpKTtcXFxcbmxldCBkYXRhID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3J1bGVzXFxcXFxcXCIpLm1hcCh2PT52Lm5hbWUpO1xcXFxubGV0IGQgPSBbXTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5YWo6YOo5Y+W5raI56aB55SoXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICBjbGVhckl0ZW0oXFxcXFxcXCJmb3JiaWRkZW5cXFxcXFxcIik7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0pLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIlxcXFxufSk7XFxcXG5sZXQgZm9yYmlkZGVuID0gc3RvcmFnZTAuZ2V0SXRlbShcXFxcXFxcImZvcmJpZGRlblxcXFxcXFwiLCBbXSk7XFxcXG5sZXQgcWlkID0gU3RyaW5nKERhdGUubm93KCkpO1xcXFxuZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgbGV0IGl0ID0gZGF0YVtpXTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogaXQsXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChpdCwgaWQpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBmb3JiaWRkZW4gPSBzdG9yYWdlMC5nZXRJdGVtKFxcXFxcXFwiZm9yYmlkZGVuXFxcXFxcXCIsIFtdKTtcXFxcbiAgICAgICAgICAgIGxldCBpbmRleCA9IGZvcmJpZGRlbi5pbmRleE9mKGl0KTtcXFxcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XFxcXG4gICAgICAgICAgICAgICAgZm9yYmlkZGVuLnNwbGljZShpbmRleCwgMSk7XFxcXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbShpZCwge1xcXFxuICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fcmVjdFxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIGZvcmJpZGRlbi5wdXNoKGl0KTtcXFxcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKGlkLCB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHBpY191cmw6IFxcXFxcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9yZWN0X2ZpbGxcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFxcXFxcImZvcmJpZGRlblxcXFxcXFwiLCBmb3JiaWRkZW4pO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9LCBpdCwgcWlkICsgaSksXFxcXG4gICAgICAgIHBpY191cmw6IGZvcmJpZGRlbi5pbmNsdWRlcyhpdCkgPyBcXFxcXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fcmVjdF9maWxsXFxcXFxcXCIgOiBcXFxcXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fcmVjdFxcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgaWQ6IHFpZCArIGlcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxufVxcXFxuc2V0UmVzdWx0KGQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIlRWQk9Y5o6o6YCBXFxcIixcXFwicGF0aFxcXCI6XFxcInR2Ym94UHVzaFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbihmdW5jdGlvbigpIHtcXFxcbiAgICBsZXQgZCA9IFtdO1xcXFxuICAgIGNvbnN0IHtcXFxcbiAgICAgICAgcGFnZUlkLFxcXFxuICAgICAgICBzaGFyZUlkLFxcXFxuICAgICAgICBmb2xkZXJOYW1lLFxcXFxuICAgICAgICBmaWxlSWRcXFxcbiAgICB9ID0gTVlfUEFSQU1TO1xcXFxuICAgIHNldFBhZ2VUaXRsZShcXFxcXFxcInR2Qm945o6o6YCBOlxcXFxcXFwiICsgZm9sZGVyTmFtZSk7XFxcXG4gICAgY29uc3Qge1xcXFxuICAgICAgICBhbGlUb2tlbnNGaWxlcGF0aFxcXFxuICAgIH0gPSAkLnJlcXVpcmUoXFxcXFxcXCJ0b2tlblBhdGhcXFxcXFxcIik7XFxcXG4gICAgbGV0IHJlZnJlc2hUb2tlbiA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgaWYgKCFmaWxlRXhpc3QoYWxpVG9rZW5zRmlsZXBhdGgpKSB7XFxcXG4gICAgICAgIHRvYXN0KFxcXFxcXFwi6K+35YWI55m76ZmG55m75b2V6LSm5Y+3XFxcXFxcXCIpO1xcXFxuICAgICAgICBiYWNrKGZhbHNlKTtcXFxcbiAgICAgICAgcmV0dXJuO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIHJlZnJlc2hUb2tlbiA9ICQucmVxdWlyZShhbGlUb2tlbnNGaWxlcGF0aCkucmVmcmVzaF90b2tlbjtcXFxcbiAgICB9XFxcXG5cXFxcbiAgICBmdW5jdGlvbiBnZXRQdXNoKG5hbWUsIHVybCkge1xcXFxuICAgICAgICBsZXQgcHVzaCA9IHtcXFxcbiAgICAgICAgICAgIFxcXFxcXFwic2hhcmVfaWRcXFxcXFxcIjogc2hhcmVJZCxcXFxcbiAgICAgICAgICAgIFxcXFxcXFwicmVmcmVzaF90b2tlblxcXFxcXFwiOiByZWZyZXNoVG9rZW4sXFxcXG4gICAgICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogbmFtZSxcXFxcbiAgICAgICAgICAgIFxcXFxcXFwidXJsXFxcXFxcXCI6IHVybFxcXFxuICAgICAgICB9O1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL3BhZ2UvcHVzaCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSM/cnVsZT1YWVHmjqjpgIEmcHVzaHVybD1cXFxcXFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShwdXNoKSk7XFxcXG4gICAgfVxcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuaOqOmAgemYv+mHjOWIhuS6q+mTvuaOpVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3B1c2gjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjP3J1bGU9WFlR5o6o6YCBJnB1c2h1cmw9XFxcXFxcXCIrZW5jb2RlVVJJQ29tcG9uZW50KFxcXFxcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvXFxcXFxcXCIgKyBzaGFyZUlkICsgKGZpbGVJZCA/IFxcXFxcXFwiL2ZvbGRlci9cXFxcXFxcIiArIGZpbGVJZCA6IFxcXFxcXFwiXFxcXFxcXCIpKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpbmhlcml0VGl0bGU6IGZhbHNlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbiAgICBsZXQgYWxsID0ge1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLmjqjpgIHlhajpg6jlt7LliqDovb3op4bpopFcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpbmhlcml0VGl0bGU6IGZhbHNlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgZC5wdXNoKGFsbCk7XFxcXG4gICAgbGV0IGFsbFVybHMgPSBbXTtcXFxcbiAgICBsZXQgbGlzdCA9IGZpbmRJdGVtc0J5Q2xzKFxcXFxcXFwidlxcXFxcXFwiICsgcGFnZUlkKTtcXFxcbiAgICBpZighQXJyYXkuaXNBcnJheShsaXN0KXx8bGlzdC5sZW5ndGg9PT0wKXtcXFxcbiAgICAgICAgdG9hc3QoXFxcXFxcXCLov5jmsqHmnInliqDovb3lrozmiJDnmoTop4bpopFcXFxcXFxcIik7XFxcXG4gICAgICAgIGJhY2soZmFsc2UpO1xcXFxuICAgICAgICByZXR1cm47XFxcXG4gICAgfVxcXFxuICAgIGxpc3QuZm9yRWFjaCh2ID0+IHtcXFxcbiAgICAgICAgdi5jb2xfdHlwZSA9IHYudHlwZTtcXFxcbiAgICAgICAgbGV0IG5hbWUgPSB2LmV4dHJhLnBhZ2VUaXRsZTtcXFxcbiAgICAgICAgbGV0IHVybCA9IG5hbWUucmVwbGFjZSgvXFxcXFxcXFwjL2csICdfJykucmVwbGFjZSgvXFxcXFxcXFwkL2csICdfJykgKyBcXFxcXFxcIiR2aWRlb3xcXFxcXFxcIiArIHYuZXh0cmEuaWQ7XFxcXG4gICAgICAgIGFsbFVybHMucHVzaCh1cmwpO1xcXFxuICAgICAgICB2LnVybCA9IGdldFB1c2gobmFtZSwgdXJsKTtcXFxcbiAgICAgICAgdi5leHRyYS5jbHMgPSB2LmV4dHJhLmlkID0gdW5kZWZpbmVkO1xcXFxuICAgICAgICBkLnB1c2godik7XFxcXG4gICAgfSk7XFxcXG4gICAgYWxsLnVybCA9IGdldFB1c2goZm9sZGVyTmFtZSwgYWxsVXJscy5qb2luKFxcXFxcXFwiI1xcXFxcXFwiKSk7XFxcXG4gICAgc2V0UmVzdWx0KGQpO1xcXFxufSkoKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlsIHpnaLmkJzntKJcXFwiLFxcXCJwYXRoXFxcIjpcXFwiZnJvbnRDb3ZlclxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmxldCBkID0gW107XFxcXG5sZXQga2V5ID0gZ2V0TXlWYXIoXFxcXFxcXCJmcm9udGNvdmVya2V5XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmkJzntKJcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgIHVybDogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgIHB1dE15VmFyKFxcXFxcXFwiZnJvbnRjb3ZlcmtleVxcXFxcXFwiLCBpbnB1dC50cmltKCkpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgfSksXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBrZXkgfHwgZ2V0TXlWYXIoXFxcXFxcXCJzXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpXFxcXG4gICAgfVxcXFxufSk7XFxcXG5pZiAoa2V5KSB7XFxcXG4gICAgbGV0IHIgPSByZXF1ZXN0KCdodHRwczovL20uZG91YmFuLmNvbS9zZWFyY2gvP3F1ZXJ5PScgKyBlbmNvZGVVUklDb21wb25lbnQoa2V5KSlcXFxcbiAgICBsZXQgbGlzdCA9IHBkZmEociwgXFxcXFxcXCIuc2VhcmNoLXJlc3VsdHMmJmltZ1xcXFxcXFwiKTtcXFxcbiAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XFxcXG4gICAgICAgIGxldCBwaWMgPSBwZGZoKGl0LCBcXFxcXFxcImltZyYmc3JjXFxcXFxcXCIpO1xcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgcGljX3VybDogcGljLFxcXFxuICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKHBpYykgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiZnJvbnRjb3ZlcnBpY1xcXFxcXFwiLCBwaWMpO1xcXFxuICAgICAgICAgICAgICAgIGJhY2soZmFsc2UpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9LCBwaWMpLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicGljXzJfY2FyZFxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcblxcXFxufVxcXFxuYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICgpID0+IHtcXFxcbiAgICBsZXQgcGljID0gZ2V0TXlWYXIoXFxcXFxcXCJmcm9udGNvdmVycGljXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJmcm9udGNvdmVycGljXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJmcm9udGNvdmVya2V5XFxcXFxcXCIpO1xcXFxuICAgIHNldFBhZ2VQaWNVcmwocGljKTtcXFxcbn0pO1xcXFxuc2V0UmVzdWx0KGQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIumHjee9ruW8leWvvFxcXCIsXFxcInBhdGhcXFwiOlxcXCJCb290UmVzZXRcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLph43nva7lvJXlr7xcXFxcXFxcIik7XFxcXG5sZXQgZCA9IFtdO1xcXFxuXFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuesrOS4gOatpVxcXFxcXFwiLmJpZygpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5bCG572R57uc5YiH5o2i5Li656e75Yqo572R57uc77yM5bm25byA5YWz6aOe6KGM5qih5byPXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuesrOS6jOatpVxcXFxcXFwiLmJpZygpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi54K55oiR6YeN572u55m76ZmG54q25oCB44CCXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICBjb25zdCB7XFxcXG4gICAgICAgICAgICBvcGVuVG9rZW5zRmlsZXBhdGgsXFxcXG4gICAgICAgICAgICBhbGlUb2tlbnNGaWxlcGF0aFxcXFxuICAgICAgICB9ID0gJC5yZXF1aXJlKFxcXFxcXFwidG9rZW5QYXRoXFxcXFxcXCIpO1xcXFxuICAgICAgICBkZWxldGVGaWxlKG9wZW5Ub2tlbnNGaWxlcGF0aCk7XFxcXG4gICAgICAgIGRlbGV0ZUZpbGUoYWxpVG9rZW5zRmlsZXBhdGgpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOWujOaIkFxcXFxcXFwiO1xcXFxuICAgIH0pXFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi56ys5LiJ5q2lXFxcXFxcXCIuYmlnKCksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbn0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLngrnmiJHov5vlhaXph43mlrDnmbvpmYZcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9ub1JlZnJlc2g9MVxcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLpgIDlh7rlubbliLfmlrBcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCk9PntcXFxcbiAgICAgICAgYmFjayh0cnVlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0pXFxcXG59KTtcXFxcbnNldFJlc3VsdChkKTtcXFwifV1cIixcInByb3h5XCI6XCJcIn0iLCJwaWNVcmwiOiJodHRwczovL2docHJveHkuY29tL2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9sczEyNTc4MTAwMy90dWJpYW8vbWFpbi9zeXN0ZW0vMTIucG5nIiwidGl0bGUiOiLlo7DojZDvvIjljp/psqjpsbzlkKzkuabvvIkifQ==
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement