Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@云盘君.简@eyJmaXJzdEhlYWRlciI6ImNsYXNzIiwibGFzdF9jaGFwdGVyX3J1bGUiOiIiLCJ0aXRsZSI6IuS6keebmOWQmy7nroAiLCJhdXRob3IiOiLlsI/mo4noooTwn4yeJkBMb3lEZ0lrIiwidXJsIjoiaGlrZXI6Ly9lbXB0eSMjZnlwYWdlIiwidmVyc2lvbiI6MTM3LCJjb2xfdHlwZSI6Im1vdmllXzMiLCJjbGFzc19uYW1lIjoiIiwidHlwZSI6ImFsbCIsImNsYXNzX3VybCI6IiIsImFyZWFfbmFtZSI6IiIsImFyZWFfdXJsIjoiIiwic29ydF9uYW1lIjoiIiwieWVhcl9uYW1lIjoiIiwic29ydF91cmwiOiIiLCJ5ZWFyX3VybCI6IiIsImZpbmRfcnVsZSI6ImpzOiQucmVxdWlyZShcIk1haW5cIik7Iiwic2VhcmNoX3VybCI6Imhpa2VyOi8vZW1wdHk/c2VhcmNoVGVybXM9KioiLCJncm91cCI6IuKRoee9keebmCIsInNlYXJjaEZpbmQiOiJqczpcbmNsZWFyUHVibGljSXRlbShcIuS6keebmOWQmy7nroDot7PovaxcIik7XG5sZXQga2V5ID0gZ2V0UGFyYW0oXCJzZWFyY2hUZXJtc1wiKTtcbnNldFJlc3VsdChbe1xuICAgIHRpdGxlOiBcIueCueaIkeW8gOWni+iBmuWQiOaQnOe0olwiICsga2V5LFxuICAgIHVybDogXCJoaWtlcjovL3BhZ2Uvc291I25vSGlzdG9yeSM/cD1meXBhZ2VcIixcbiAgICBleHRyYToge1xuICAgICAgICBwYWdlVGl0bGU6IFwi5pCc57SiXCIgKyBrZXksXG4gICAgICAgIHNlYXJjaFRlcm1zOiBrZXksXG4gICAgICAgIGhpZGVTZXR0aW5nOiB0cnVlXG4gICAgfVxufV0pOyIsImRldGFpbF9jb2xfdHlwZSI6Im1vdmllXzEiLCJkZXRhaWxfZmluZF9ydWxlIjoiIiwic2RldGFpbF9jb2xfdHlwZSI6Im1vdmllXzEiLCJzZGV0YWlsX2ZpbmRfcnVsZSI6IiIsInVhIjoibW9iaWxlIiwicHJlUnVsZSI6IiIsInBhZ2VzIjoiW3tcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop4TliJnlpITnkIZcIixcInBhdGhcIjpcImRhdGFcIixcInJ1bGVcIjpcImpzOlxcbmZ1bmN0aW9uIGRvdWJsZVRyZWF0aW5nKGNvbmZpZywgZ2V0TW9kZVVybCkge1xcbiAgICBsZXQge1xcbiAgICAgICAgb3Blbk1vZGUsXFxuICAgICAgICBmaW5kQWxpVXJsLFxcbiAgICAgICAgYmFzaWNVcmwsXFxuICAgICAgICBuYW1lXFxuICAgIH0gPSBjb25maWc7XFxuICAgIGxldCBhbGlVcmwgPSBpbnB1dDtcXG4gICAgbGV0IHNoYXJlUHdkO1xcbiAgICBpZiAoZmluZEFsaVVybCkge1xcbiAgICAgICAgbGV0IHJlc3VsdDtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgcmVzdWx0ID0gZmluZEFsaVVybChhbGlVcmwsIGJhc2ljVXJsKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gJChcXFwi5pCc57Si5byV5pOO44CMXFxcIiArIG5hbWUgKyBcXFwi44CN5aSx5pWI6K+36IGU57O75pCc57Si5byV5pOO5L2c6ICF5L+u5aSN5oiW5Yig6ZmkXFxcXG5cXFxcbuW8leaTjuS9nOiAheWPr+S7peWOu+WumOaWuemikemBk+ivoumXrlxcXFxu54K55Ye756Gu5a6a5b+r6YCf5Yig6ZmkXFxcIikuY29uZmlybSgobmFtZSkgPT4ge1xcbiAgICAgICAgICAgICAgICBjb25maXJtKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5rip6aao5o+Q56S6XFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFxcXCLnoa7lrpropoHliKDpmaRcXFwiICsgbmFtZSArIFxcXCLlkJfvvJ/ms6jmhI/liKDpmaTlkI7ml6Dms5XmgaLlpI1cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybTogJC50b1N0cmluZygobmFtZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gYXJyLmZpbmRJbmRleCh2ID0+IHYubmFtZSA9PT0gbmFtZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnNwbGljZShpbmRleCwgMSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24oYXJyKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhckl0ZW0oXFxcInJ1bGVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIH0sIG5hbWUpXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0sIG5hbWUpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiByZXN1bHQubGVuZ3RoID09PSAxKSB7XFxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0WzBdO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFxcXCJzdHJpbmdcXFwiKSB7XFxuICAgICAgICAgICAgYWxpVXJsID0gcmVzdWx0O1xcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0Lmxlbmd0aCkge1xcbiAgICAgICAgICAgIGxldCBpc1N0ciA9IHR5cGVvZihyZXN1bHRbMF0pID09PSBcXFwic3RyaW5nXFxcIjtcXG4gICAgICAgICAgICBsZXQgc2VsZWN0ID0gcmVzdWx0O1xcbiAgICAgICAgICAgIGlmICghaXNTdHIpIHtcXG4gICAgICAgICAgICAgICAgc2VsZWN0ID0gcmVzdWx0Lm1hcCh2ID0+IHYuYWxpVXJsKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgc2VsZWN0ID0gc2VsZWN0Lm1hcCh2ID0+IHYucmVwbGFjZSgvaHR0cC4qP1xcXFwvc1xcXFwvLywgXFxcIlxcXCIpKTtcXG4gICAgICAgICAgICByZXR1cm4gJChzZWxlY3QpLnNlbGVjdCgoY29uZmlnLCBnZXRNb2RlVXJsLCBpc1N0ciwgcmVzdWx0KSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBhbGlVcmw7XFxuICAgICAgICAgICAgICAgIGxldCBzaGFyZVB3ZDtcXG4gICAgICAgICAgICAgICAgaWYgKCFpc1N0cikge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHIgPSByZXN1bHQuZmluZCh2ID0+IHYuYWxpVXJsLmluY2x1ZGVzKGlucHV0KSk7XFxuICAgICAgICAgICAgICAgICAgICBhbGlVcmwgPSByLmFsaVVybDtcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkID0gci5zaGFyZVB3ZDtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGFsaVVybCA9IHJlc3VsdC5maW5kKHYgPT4gdi5pbmNsdWRlcyhpbnB1dCkpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRNb2RlVXJsKGFsaVVybCwgc2hhcmVQd2QsIGNvbmZpZy5vcGVuTW9kZSk7XFxuICAgICAgICAgICAgfSwgY29uZmlnLCBnZXRNb2RlVXJsLCBpc1N0ciwgcmVzdWx0KTtcXG4gICAgICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiB0eXBlb2YocmVzdWx0KSA9PT0gXFxcIm9iamVjdFxcXCIpIHtcXG4gICAgICAgICAgICBhbGlVcmwgPSByZXN1bHQuYWxpVXJsLCBzaGFyZVB3ZCA9IHJlc3VsdC5zaGFyZVB3ZDtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICByZXR1cm4gZ2V0TW9kZVVybChhbGlVcmwsIHNoYXJlUHdkLCBvcGVuTW9kZSk7XFxufVxcblxcbmZ1bmN0aW9uIGdldE1vZGVVcmwoYWxpVXJsLCBzaGFyZVB3ZCwgb3Blbk1vZGUpIHtcXG4gICAgaWYgKCQucmVxdWlyZShcXFwiYWxpdGVzdFxcXCIpLnRlc3QoYWxpVXJsKSkge1xcbiAgICAgICAgaWYgKG9wZW5Nb2RlID09PSBcXFwi5pys5Zyw6L2s56CBXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2FsaXl1bj9wYWdlPWZ5cGFnZSZyZWFsdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoYWxpVXJsKSArIFxcXCImc2hhcmVQd2Q9XFxcIiArIChzaGFyZVB3ZCB8fCBcXFwiXFxcIik7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHNoYXJlSWQgPSBhbGlVcmwuc3BsaXQoXFxcIi9cXFwiKVs0XTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInNtYXJ0ZHJpdmU6Ly9zaGFyZS9icm93c2U/c2hhcmVJZD1cXFwiICsgc2hhcmVJZCArIFxcXCImc2hhcmVQd2Q9XFxcIiArIChzaGFyZVB3ZCB8fCBcXFwiXFxcIik7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSBpZiAoYWxpVXJsLmluY2x1ZGVzKFxcXCJwYW4ucXVhcmsuY24vcy9cXFwiKSkge1xcbiAgICAgICAgbGV0IGhhcyA9IGZldGNoKFxcXCJoaWtlcjovL2hvbWVAUXVhcmsu566AXFxcIikhPVxcXCJudWxsXFxcIjtcXG4gICAgICAgIGlmIChoYXMpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9xdWFya0xpc3Q/cnVsZT1RdWFyay7nroAmcmVhbHVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGFsaVVybCkgKyBcXFwiJnNoYXJlUHdkPVxcXCIgKyAoc2hhcmVQd2QgfHwgXFxcIlxcXCIpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gYWxpVXJsO1xcbiAgICAgICAgfVxcbiAgICB9IGVsc2UgaWYgKGFsaVVybC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgIHJldHVybiBcXFwid2ViOi8vXFxcIiArIGFsaVVybDtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiBhbGlVcmw7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gZ2V0Q29tcGxldGVSdWxlKHJ1bGUpIHtcXG4gICAgbGV0IGZpbmQgPSBuZXcgRnVuY3Rpb24oXFxcInNcXFwiLCBcXFwicGFnZVxcXCIsIFxcXCJ1c2VyXFxcIiwgXFxcImJhc2ljVXJsXFxcIiwgcnVsZS5maW5kKTtcXG4gICAgcnVsZS5maW5kID0gKHMsIHBhZ2UpID0+IGZpbmQocywgcGFnZSwgcnVsZS51c2VyIHx8IHt9LCBydWxlLmJhc2ljVXJsIHx8IFxcXCJcXFwiKTtcXG4gICAgaWYgKHJ1bGUuZmluZEFsaVVybCkge1xcbiAgICAgICAgcnVsZS5maW5kQWxpVXJsID0gbmV3IEZ1bmN0aW9uKFxcXCJpbnB1dFxcXCIsIFxcXCJiYXNpY1VybFxcXCIsIHJ1bGUuZmluZEFsaVVybCk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHJ1bGU7XFxufVxcbiQuZXhwb3J0cy5jYXJyeVJ1bGUgPSBmdW5jdGlvbihydWxlLCBzLCBwYWdlLCBzZWFyY2hNb2RlLCBvcGVuTW9kZSkge1xcbiAgICBydWxlID0gZ2V0Q29tcGxldGVSdWxlKHJ1bGUpO1xcbiAgICBsZXQgbGlzdCA9IHJ1bGUuZmluZChzLCBwYWdlKTtcXG4gICAgaWYgKCFsaXN0KSByZXR1cm4gW107XFxuICAgIGxldCB1cmxMYXp5ID0gJChcXFwiXFxcIikubGF6eVJ1bGUoZG91YmxlVHJlYXRpbmcsIHtcXG4gICAgICAgIG9wZW5Nb2RlOiBvcGVuTW9kZSxcXG4gICAgICAgIGZpbmRBbGlVcmw6IHJ1bGUuZmluZEFsaVVybCxcXG4gICAgICAgIGJhc2ljVXJsOiBydWxlLmJhc2ljVXJsLFxcbiAgICAgICAgbmFtZTogcnVsZS5uYW1lXFxuICAgIH0sIGdldE1vZGVVcmwpO1xcbiAgICBsZXQgZGVzY1RpcHMgPSBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIHJ1bGUubmFtZS5mb250Y29sb3IoXFxcIiNmMTNiNjZhXFxcIikgKyBcXFwiJm5ic3A7XFxcIjtcXG4gICAgbGV0IHJlc0xpc3QgPSBbXTtcXG5cXG4gICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xcbiAgICAgICAgaWYgKGl0LnNraXApIHtcXG4gICAgICAgICAgICByZXNMaXN0LnB1c2goaXQpO1xcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHNlYXJjaE1vZGUgJiYgIXNlYXJjaENvbnRhaW5zKGl0LnRpdGxlLCBzLCB0cnVlKSkgY29udGludWU7XFxuICAgICAgICBpdC51cmwgPSBydWxlLmZpbmRBbGlVcmwgPyBpdC51cmwgKyB1cmxMYXp5IDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShnZXRNb2RlVXJsLCBpdC51cmwsIGl0LnNoYXJlUHdkIHx8IFxcXCJcXFwiLCBvcGVuTW9kZSk7XFxuICAgICAgICByZXNMaXN0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdC50aXRsZS5pbmNsdWRlcyhcXFwi4oCc4oCc4oCd4oCdXFxcIikgPyBpdC50aXRsZSA6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgaXQudGl0bGUucmVwbGFjZShuZXcgUmVnRXhwKFxcXCI8ZW0+fDwvZW0+XFxcIiwgXFxcImdcXFwiKSwgXFxcIlxcXCIpLnJlcGxhY2UobmV3IFJlZ0V4cChzLCBcXFwiZ1xcXCIpLCBcXFwiPHN0cm9uZz48c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAjMUU5MEZGXFxcXFxcXCI+XFxcIiArIHMgKyBcXFwiPC9zcGFuPjwvc3Ryb25nPlxcXCIpLFxcbiAgICAgICAgICAgIGRlc2M6IGRlc2NUaXBzICsgKGl0LmRlc2MgfHwgXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIHVybDogaXQudXJsLFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0LnBpY191cmwsXFxuICAgICAgICAgICAgY29sX3R5cGU6IGl0LnBpY191cmwgPyAnbW92aWVfMV92ZXJ0aWNhbF9waWMnIDogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24oe1xcbiAgICAgICAgICAgICAgICBpbmhlcml0VGl0bGU6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICBub1BpYzogdHJ1ZVxcbiAgICAgICAgICAgIH0sIGl0LmV4dHJhKVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHJlc0xpc3Q7XFxufVxcbmxldCBzaXplID0gMTA7XFxuXFxubGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0VXNlZnVsSnNvbigpO1xcblxcbiQuZXhwb3J0cy5nZXREYXRhID0gZnVuY3Rpb24ocGFnZSwgcnVsZSkge1xcbiAgICBpZiAoIXBhZ2UgJiYgIXJ1bGUpIHtcXG4gICAgICAgIHJldHVybiBydWxlcy5tYXAoaXQgPT4gaXQubmFtZSk7XFxuICAgIH1cXG4gICAgaWYgKHBhZ2UgPT09IC0xKSB7XFxuICAgICAgICByZXR1cm4gcnVsZXMubWFwKGl0ID0+IFtpdC5uYW1lLCBpdC5iYXNpY1VybF0pO1xcbiAgICB9XFxuICAgIGlmIChydWxlICE9IG51bGwpIHtcXG4gICAgICAgIGlmIChwYWdlICE9IG51bGwgJiYgcGFnZSA+IDEpIHtcXG4gICAgICAgICAgICByZXR1cm4gcnVsZXMuZmlsdGVyKGkgPT4gaS5uYW1lID09IHJ1bGUgJiYgaS5wYWdlKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBydWxlcy5maWx0ZXIoaSA9PiBpLm5hbWUgPT0gcnVsZSk7XFxuICAgIH1cXG4gICAgbGV0IHN0YXJ0ID0gKHBhZ2UgLSAxKSAqIHNpemU7XFxuICAgIGlmIChydWxlcy5sZW5ndGggPCBzdGFydCArIDEpIHtcXG4gICAgICAgIHJldHVybiBbXTtcXG4gICAgfVxcbiAgICBsZXQgbGVuID0gc2l6ZTtcXG4gICAgaWYgKHJ1bGVzLmxlbmd0aCA8IHBhZ2UgKiBzaXplKSB7XFxuICAgICAgICBsZW4gPSBydWxlcy5sZW5ndGggLSBzdGFydDtcXG4gICAgfVxcbiAgICByZXR1cm4gcnVsZXMuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgbGVuKTtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmkJzntKLpobXpnaJcIixcInBhdGhcIjpcInNvdVwiLFwicnVsZVwiOlwianM6XFxuY29uc3QgYWxpdGVzdCA9ICQucmVxdWlyZShcXFwiYWxpdGVzdFxcXCIpO1xcblxcbmZ1bmN0aW9uIHNldENsaXAoKSB7XFxuICAgIGZ1bmN0aW9uIGdldENvcHkoKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGNvbnN0IENvbnRleHQgPSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDtcXG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gY29tLmV4YW1wbGUuaGlrZXJ2aWV3LnVpLkFwcGxpY2F0aW9uKCkuZ2V0Q29udGV4dCgpO1xcbiAgICAgICAgICAgIC8vIOiOt+WPluezu+e7n+WJqui0tOadv1xcbiAgICAgICAgICAgIGxldCBjbGlwYm9hcmQgPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DTElQQk9BUkRfU0VSVklDRSk7XFxuICAgICAgICAgICAgLy8g6L+U5Zue5pWw5o2uXFxuICAgICAgICAgICAgbGV0IGNsaXBEYXRhID0gY2xpcGJvYXJkLmdldFByaW1hcnlDbGlwKCk7XFxuICAgICAgICAgICAgaWYgKGNsaXBEYXRhICE9IG51bGwgJiYgY2xpcERhdGEuZ2V0SXRlbUNvdW50KCkgPiAwKSB7XFxuICAgICAgICAgICAgICAgIC8vIOS7juaVsOaNrumbhuS4reiOt+WPlu+8iOeymOi0tO+8ieesrOS4gOadoeaWh+acrOaVsOaNrlxcbiAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IGNsaXBEYXRhLmdldEl0ZW1BdCgwKS5nZXRUZXh0KCk7XFxuICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodGV4dC50b1N0cmluZygpKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBsZXQgdGV4dCA9IGdldENvcHkoKSB8fCBcXFwiXFxcIjtcXG4gICAgbGV0IHVybCA9IGFsaXRlc3QubWF0Y2hBbGlVcmwodGV4dCk7XFxuICAgIGlmICh1cmwpIHtcXG4gICAgICAgIGxldCBjYWNoZSA9IGdldEl0ZW0oXFxcImNsaXBib2FyZENhY2hlXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgaWYgKHVybCAhPT0gY2FjaGUpIHtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxmb250IGNvbG9yPVxcXCIjMTNCNjFCXFxcIj7ilpAgPC9mb250PjxiPua4qemmqOaPkOekujxiPicsXFxuICAgICAgICAgICAgICAgIGRlc2M6IFxcXCLmo4DmtYvliLDliarotLTmnb/lkKvmnInpmL/ph4zpk77mjqXmmK/lkKbmiZPlvIA/XFxcXG5cXFwiICsgdXJsLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlucHV0LCBpZCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbShpZCArIFxcXCJjbGlwYm9hcmRcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2FsaXl1bj9wYWdlPWZ5cGFnZSZyZWFsdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoaW5wdXQpICsgXFxcIiZzaGFyZVB3ZD1cXFwiO1xcbiAgICAgICAgICAgICAgICB9LCB1cmwsIGlkKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGlkICsgXFxcImNsaXBib2FyZFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IFxcXCLmiZPlvIDpk77mjqVcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJjbGlwYm9hcmRDYWNoZVxcXCIsIHVybCk7XFxuICAgICAgICB9XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gc2V0UHJlcG9zZSgpIHtcXG4gICAgaWYgKG9wZW5Nb2RlID09IFxcXCLmnKzlnLDovaznoIFcXFwiKSB7XFxuICAgICAgICBsZXQgYWxpVG9rZW5zRmlsZXBhdGggPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS90b2tlblBhdGhcXFwiKS5hbGlUb2tlbnNGaWxlcGF0aDtcXG4gICAgICAgIGxldCBhID0gZmV0Y2goYWxpVG9rZW5zRmlsZXBhdGgpO1xcbiAgICAgICAgaWYgKCFhIHx8IGEgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJzxmb250IGNvbG9yPVxcXCIjMTNCNjFCXFxcIj7ilpAgPC9mb250PjxiPua4qemmqOaPkOekujxiPicsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIixcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4gJC5yZXF1aXJlKFxcXCJsb2dpbk1vZGVcXFwiKSksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLmnKrmo4DmtYvliLDnmbvlvZXkv6Hmga/vvIzngrnmiJHot7PovaznmbvlvZXotKblj7fpobXpnaLvvIznmbvlvZXpmL/ph4zkupHnm5jotKblj7flkI7mlrnlj6/kvb/nlKjmnKzlnLDovaznoIHmqKHlvI9cXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBcXFwi55m75b2V6Zi/6YeM5LqR55uYXFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcInNcXFwiKTtcXG4gICAgfSkpO1xcbiAgICBhZGRMaXN0ZW5lcihcXFwib25SZWZyZXNoXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBpZiAoIWdldE15VmFyKFxcXCJyZWZzXFxcIiwgXFxcIlxcXCIpKSB7XFxuICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwic1xcXCIpO1xcbiAgICAgICAgfVxcbiAgICB9KSk7XFxufVxcblxcbmZ1bmN0aW9uIHNldEhlYWQoKSB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuaQnOe0ou+8mlxcXCIgKyBbXFxcIum7mOiupFxcXCIsIFxcXCLnsr7lh4ZcXFwiXVtzZWFyY2hNb2RlXSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgc2V0U2VhcmNoTW9kZShnZXRTZWFyY2hNb2RlKCkgPyAwIDogMSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzJfcm91bmRcXFwiLFxcbiAgICAgICAgZGVzYzogXFxcIlxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9zZWFyY2g2XFxcIlxcbiAgICB9KTtcXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5qih5byP77yaXFxcIiArIG9wZW5Nb2RlLFxcbiAgICAgICAgdXJsOiBcXFwic2VsZWN0Oi8vXFxcIiArIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuS6keeugOiuvue9rlxcXCIsXFxuICAgICAgICAgICAgb3B0aW9uczogW1xcXCLmqKHlvI/vvJrmnKzlnLDovaznoIFcXFwiLCBcXFwi5qih5byP77ya5a6Y5pa5QVBQXFxcIiwgXFxcIueZu+W9lemYv+mHjOi0puWPt1xcXCIsIFxcXCLnmbvlvZXkv6Hmga9cXFwiLCBcXFwi6KeE5YiZ566h55CGXFxcIiwgXFxcIuaUr+aMgeS9nOiAhVxcXCJdLFxcbiAgICAgICAgICAgIGNvbDogMSxcXG4gICAgICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuXFxuICAgICAgICAgICAgICAgIGlmIChcXFwi6KeE5YiZ566h55CGXFxcIiA9PSBpbnB1dCkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcnVsZU1hbmFnZSNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChcXFwi5pSv5oyB5L2c6ICFXFxcIiA9PSBpbnB1dCkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvRG9uYXRlLnYjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAoXFxcIueZu+W9lemYv+mHjOi0puWPt1xcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImxvZ2luTW9kZVxcXCIpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChcXFwi55m75b2V5L+h5oGvXFxcIiA9PSBpbnB1dCkge1xcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5Ub2tlbnNGaWxlcGF0aCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlUb2tlbnNGaWxlcGF0aFxcbiAgICAgICAgICAgICAgICAgICAgfSA9ICQucmVxdWlyZShcXFwidG9rZW5QYXRoXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGVFeGlzdChhbGlUb2tlbnNGaWxlcGF0aCkpIHJldHVybiBcXFwidG9hc3Q6Ly/ov5jmnKrnmbvpmYZcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaSA9IHJlcXVlc3QoYWxpVG9rZW5zRmlsZXBhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGkgPSBKU09OLnBhcnNlKGFsaSk7XFxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlRmlsZShhbGlUb2tlbnNGaWxlcGF0aCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iOt+WPluWksei0pVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBjb25maXJtKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+eZu+W9leS/oeaBrycsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogXFxcIueUqOaItzpcXFwiICsgKGFsaS5uaWNrX25hbWUgfHwgYWxpLnVzZXJfbmFtZSB8fCBcXFwiVG9rZW7nmbvlvZVcXFwiKSArIFxcXCJcXFxcblRva2VuOlxcXCIgKyBhbGkucmVmcmVzaF90b2tlbiArIFxcXCJcXFxcbijlj5bmtojvvJrms6jplIDnmbvlvZXvvJvnoa7lrprvvJrlpI3liLZUb2tlbilcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm06ICQudG9TdHJpbmcoKHRva2VuKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyB0b2tlbjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBhbGkucmVmcmVzaF90b2tlbiksXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsOiAkLnRvU3RyaW5nKChwYXRoMSwgcGF0aDIpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIuehruiupOazqOmUgOeZu+W9lVxcXCIpLmNvbmZpcm0oKHBhdGgxLCBwYXRoMikgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlRmlsZShwYXRoMSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVGaWxlKHBhdGgyKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5oiQ5Yqf6YCA5Ye655m76ZmGXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcGF0aDEsIHBhdGgyKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBhbGlUb2tlbnNGaWxlcGF0aCwgb3BlblRva2Vuc0ZpbGVwYXRoKVxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKFxcXCLmqKHlvI/vvJpcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcIm9wZW5Nb2RlXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT0gXFxcIuWumOaWuUFQUFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip/vvIzor7fnoa7kv53miYvmnLrmnInlronoo4XpmL/ph4zkupHnm5jlrpjmlrlBUFBcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzJfcm91bmRcXFwiLFxcbiAgICAgICAgZGVzYzogXFxcIlxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9tZW51NlxcXCJcXG4gICAgfSk7XFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+aQnOe0oicsXFxuICAgICAgICBkZXNjOiAn6K+36L6T5YWl5YWz6ZSu6K+NL+mTvuaOpScsXFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgICAgIHVybDogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC50cmltKCk7XFxuICAgICAgICAgICAgaWYgKCQucmVxdWlyZShcXFwiYWxpdGVzdFxcXCIpLnRlc3QoaW5wdXQpKSB7XFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcInNcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvYWxpeXVuP3BhZ2U9ZnlwYWdlJnJlYWx1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChpbnB1dCkgKyBcXFwiJnNoYXJlUHdkPVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHB1dE15VmFyKCdzJywgaW5wdXQpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICAgICAgfSksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBcXFwicHV0TXlWYXIoJ3JlZnMnLGlucHV0KVxcXCIsXFxuICAgICAgICAgICAgaWQ6IGlkICsgXFxcInNzXFxcIixcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHMsXFxuICAgICAgICAgICAgcGFnZVRpdGxlOiBcXFwi5omT5byA6ZO+5o6lXFxcIlxcbiAgICAgICAgfVxcbiAgICB9KTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0UnVsZUl0ZW0oKSB7XFxuICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2RhdGFcXFwiKS5nZXREYXRhKC0xKTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi8J+Mn1xcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2NvbGxlY3Rpb24/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgIH0sIHtcXG4gICAgICAgIHRpdGxlOiBcXFwiXFxcIiA9PSByID8gXFxcIuKAnOKAnOWFqOmDqOKAneKAnVxcXCIgOiBcXFwi5YWo6YOoXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgocywgaWQpID0+IHtcXG4gICAgICAgICAgICBsZXQgcXIgPSBnZXRJdGVtKFxcXCJydWxlXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGNsZWFySXRlbShcXFwicnVsZVxcXCIpO1xcbiAgICAgICAgICAgIGlmIChzKSB7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbShcXFwi5YWo6YOoXFxcIiArIGlkLCB7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOWFqOmDqOKAneKAnVxcXCJcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIGlmIChxcikge1xcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbShpZCArIHFyLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHFyXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICB9LCBzLCBpZCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogXFxcIuWFqOmDqFxcXCIgKyBpZFxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgZm9yIChsZXQgW2l0LCBiYXNpY1VybF0gb2YgcnVsZXMpIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ID09IHIgPyBcXFwi4oCc4oCcXFxcIiArIGl0ICsgXFxcIuKAneKAnVxcXCIgOiBpdCxcXG4gICAgICAgICAgICB1cmw6ICQoKGJhc2ljVXJsIHx8IFxcXCJcXFwiKSArIFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChyLCBzLCBpZCkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgcXIgPSBnZXRJdGVtKFxcXCJydWxlXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJydWxlXFxcIiwgcik7XFxuICAgICAgICAgICAgICAgIGlmIChzKSB7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbShxciA/IChpZCArIHFyKSA6IChcXFwi5YWo6YOoXFxcIiArIGlkKSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBxciB8fCBcXFwi5YWo6YOoXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKGlkICsgciwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCcXFxcIiArIHIgKyBcXFwi4oCd4oCdXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgIH0sIGl0LCBzLCBpZCksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgICAgICBkZXNjOiBcXFwiXFxcIixcXG4gICAgICAgICAgICBwaWNfdXJsOiBcXFwiXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogaWQgKyBpdFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9XFxuXFxufVxcblxcbmZ1bmN0aW9uIHJlY29yZCgpIHtcXG4gICAgbGV0IGhpc3RvcnkgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJzZWFyY2hIaXN0b3J5XFxcIiwgW10pO1xcbiAgICBsZXQgaWkgPSBoaXN0b3J5LmluZGV4T2Yocyk7XFxuICAgIGlmIChpaSA+IC0xKSB7XFxuICAgICAgICBoaXN0b3J5LnNwbGljZShpaSwgMSk7XFxuICAgIH1cXG4gICAgaWYgKGhpc3RvcnkubGVuZ3RoID4gMjApIHtcXG4gICAgICAgIGhpc3Rvcnkuc3BsaWNlKGhpc3RvcnkubGVuZ3RoIC0gMSwgMSk7XFxuICAgIH1cXG4gICAgaGlzdG9yeS51bnNoaWZ0KHMpO1xcbiAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJzZWFyY2hIaXN0b3J5XFxcIiwgaGlzdG9yeSk7XFxufVxcblxcbmZ1bmN0aW9uIHNlYXJjaEVuZCgpIHtcXG4gICAgbGV0IHAgPSBNWV9QQUdFO1xcbiAgICBsZXQgZGF0YSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2RhdGFcXFwiKS5nZXREYXRhKHAsIHIgIT0gXFxcIlxcXCIgPyByIDogbnVsbCk7XFxuICAgIGxldCBwYWdlaWQgPSBpZCArIFxcXCJ5cGotcGFnZVxcXCIgKyBwO1xcbiAgICBpZiAoZGF0YS5sZW5ndGggPiAwKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5Yqg6L2956ysXFxcIiArIHAgKyBcXFwi6aG15Lit77yM6L+b5bqm77yaMS9cXFwiICsgZGF0YS5sZW5ndGgsXFxuICAgICAgICAgICAgdXJsOiBcXFwiXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIGRlc2M6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIHBpY191cmw6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBwYWdlaWRcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBzZXRSZXN1bHQoZCk7XFxuICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcXG4gICAgICAgIC8v5aSa57q/56iL5Yqg6L29ICAgICAgICBcXG4gICAgICAgIGxldCByZWFsUGFnZSA9IFxcXCJcXFwiID09IHIgPyAxIDogcDtcXG4gICAgICAgIGxldCB0YXNrcyA9IGRhdGEubWFwKGl0ID0+IHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jdGlvbihydWxlKSB7XFxuICAgICAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImRhdGFcXFwiKS5jYXJyeVJ1bGUocnVsZSwgcywgcmVhbFBhZ2UsIHNlYXJjaE1vZGUsIG9wZW5Nb2RlKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2cocnVsZS5uYW1lICsgXFxcIjpcXFwiICsgZS50b1N0cmluZygpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvKmlmKGRhdGEubGVuZ3RoPT09MSYmcD09PTEpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3tcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOlxcXCLigJzigJxcXFwiK3J1bGUubmFtZStcXFwiIEVSUk9S4oCd4oCdXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IGUudG9TdHJpbmcoKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOlxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDpcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYTp7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0qL1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gcnVsZS5maW5kKHMsIHJlYWxQYWdlKTtcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgcGFyYW06IGl0LFxcbiAgICAgICAgICAgICAgICBpZDogXFxcInJ1bGVAXFxcIiArIGl0Lm5hbWVcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG5cXG4gICAgICAgIGJhdGNoRXhlY3V0ZSh0YXNrcywge1xcbiAgICAgICAgICAgIGZ1bmM6IGZ1bmN0aW9uKHBhcmFtLCBpZCwgZXJyb3IsIHJlc3VsdCkge1xcbiAgICAgICAgICAgICAgICBwYXJhbS5pICs9IDE7XFxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW0oXFxcIl9ub3RoYXZlXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBhZGRJdGVtQmVmb3JlKHBhZ2VpZCwgcmVzdWx0KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAocGFyYW0uaSA9PT0gcGFyYW0uYWxsKSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0Lmxlbmd0aCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW0oXFxcIl9ub3RoYXZlXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkSXRlbUJlZm9yZShwYWdlaWQsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCJ+fn7ku4DkuYjotYTmupDpg73msqHmnInlk6Z+fn5cXFwiLmZvbnRjb2xvcihcXFwiR3JheVxcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFxcXCJfbm90aGF2ZVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbShwYWdlaWQpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbShwYWdlaWQsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWKoOi9veesrFxcXCIgKyBNWV9QQUdFICsgXFxcIumhteS4re+8jOi/m+W6pu+8mlxcXCIgKyAocGFyYW0uaSArIDEpICsgXFxcIi9cXFwiICsgcGFyYW0uYWxsLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwYXJhbToge1xcbiAgICAgICAgICAgICAgICBhbGw6IGRhdGEubGVuZ3RoLFxcbiAgICAgICAgICAgICAgICBpOiAwLFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gc2V0SGlzdG9yeSgpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcImNvbG9yOiNmZjY2MDFcXFwiPjxiPuWOhuWPsuiusOW9lTwvYj48L3NwYW4+JyxcXG4gICAgICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2Nsb2NrXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgIHVybDogJChbXFxcIua4hemZpOaQnOe0ouiusOW9lVxcXCIsIFxcXCLmiZPlvIDop4LnnIvorrDlvZVcXFwiXSkuc2VsZWN0KChpZCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gXFxcIua4hemZpOaQnOe0ouiusOW9lVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIuehruWumua4hemZpOWFqOmDqOaQnOe0ouiusOW9le+8n1xcXCIpLmNvbmZpcm0oKGlkKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBjbGVhckl0ZW0oXFxcInNlYXJjaEhpc3RvcnlcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW1CeUNscyhpZCArIFxcXCI6a2V5XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBhZGRJdGVtQWZ0ZXIoaWQgKyBcXFwiOnNlYXJjaEhpc3RvcnlcXFwiLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwifn5+5LuA5LmI6YO95rKh5pyJ5ZOmfn5+XFxcIi5mb250Y29sb3IoXFxcIkdyYXlcXFwiKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcIjprZXlcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSwgaWQpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9oaXN0b3J5P3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgaWQpLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogaWQgKyBcXFwiOnNlYXJjaEhpc3RvcnlcXFwiLFxcbiAgICAgICAgfVxcbiAgICB9KTtcXG5cXG4gICAgbGV0IGhpc3RvcnkgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJzZWFyY2hIaXN0b3J5XFxcIiwgW10pO1xcbiAgICBsZXQgaSA9IDA7XFxuICAgIGZvciAobGV0IGtleSBvZiBoaXN0b3J5KSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBrZXksXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpZCwga2V5KSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBleHRyYSA9IGZpbmRJdGVtKGlkICsgXFxcInNzXFxcIikuZXh0cmE7XFxuICAgICAgICAgICAgICAgIGV4dHJhLmRlZmF1bHRWYWx1ZSA9IGtleTtcXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgICAgICBleHRyYTogZXh0cmFcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgfSwgaWQsIGtleSksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJmbGV4X2J1dHRvblxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IGlkICsgXFxcIjprZXk6XFxcIiArIGtleSxcXG4gICAgICAgICAgICAgICAgY2xzOiBpZCArIFxcXCI6a2V5XFxcIixcXG4gICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLliKDpmaTlhbPplK7or406XFxcIiArIGtleSxcXG4gICAgICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChpZCwga2V5LCBpKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhpc3RvcnkgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJzZWFyY2hIaXN0b3J5XFxcIiwgW10pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpc3Rvcnkuc3BsaWNlKGksIDEpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcInNlYXJjaEhpc3RvcnlcXFwiLCBoaXN0b3J5KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVJdGVtKGlkICsgXFxcIjprZXk6XFxcIiArIGtleSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgLy90b2FzdCgpO1xcbiAgICAgICAgICAgICAgICAgICAgfSwgaWQsIGtleSwgaSlcXG4gICAgICAgICAgICAgICAgfV1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGkrKztcXG4gICAgfVxcbiAgICBpZiAoaGlzdG9yeS5sZW5ndGggPT09IDApIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwifn5+5LuA5LmI6YO95rKh5pyJ5ZOmfn5+XFxcIi5mb250Y29sb3IoXFxcIkdyYXlcXFwiKSxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcIjprZXlcXFwiLFxcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBzZXRUcmVuZGluZ1RhYkVuZCgpIHtcXG4gICAgbGV0IGhvdENsYXNzID0ge1xcbiAgICAgICAgXFxcIueZvuW6plxcXCI6IHtcXG4gICAgICAgICAgICBcXFwi55S16KeG5YmnXFxcIjogXFxcInRlbGVwbGF5XFxcIixcXG4gICAgICAgICAgICBcXFwi55S15b2xXFxcIjogXFxcIm1vdmllXFxcIlxcbiAgICAgICAgfSxcXG4gICAgICAgIFxcXCLlpLjlhYtcXFwiOiB7XFxuICAgICAgICAgICAgXFxcIueUteinhuWJp1xcXCI6IFxcXCLnlLXop4bliadcXFwiLFxcbiAgICAgICAgICAgIFxcXCLnlLXlvbFcXFwiOiBcXFwi55S15b2xXFxcIixcXG4gICAgICAgICAgICBcXFwi5Yqo5ryrXFxcIjogXFxcIuWKqOa8q1xcXCIsXFxuICAgICAgICAgICAgXFxcIue7vOiJulxcXCI6IFxcXCLnu7zoibpcXFwiXFxuICAgICAgICB9XFxuICAgIH07XFxuICAgIGxldCBkYXRhU291cmNlID0gT2JqZWN0LmtleXMoaG90Q2xhc3MpO1xcbiAgICBsZXQgc2VsZWN0c291cmNlID0gZ2V0SXRlbShcXFwiZGF0YVNvdXJjZVxcXCIsIGRhdGFTb3VyY2VbMF0pO1xcbiAgICBsZXQgaG90a2V5cyA9IE9iamVjdC5rZXlzKGhvdENsYXNzW3NlbGVjdHNvdXJjZV0pO1xcbiAgICBsZXQgc2VsZWN0a2V5ID0gZ2V0SXRlbShcXFwiaG90a2V5XFxcIiwgaG90a2V5c1swXSk7XFxuICAgIGxldCB0YWJrZXkgPSBob3RDbGFzc1tzZWxlY3Rzb3VyY2VdW3NlbGVjdGtleV07XFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJzxzcGFuIHN0eWxlPVxcXCJjb2xvcjojZmY2NjAxXFxcIj48Yj4nICsgc2VsZWN0c291cmNlICsgc2VsZWN0a2V5ICsgJ+eDreaQnDwvYj48L3NwYW4+JyxcXG4gICAgICAgIHVybDogJChob3RrZXlzLCAxLCBcXFwi5YiH5o2i54Ot5pCcXFxcIikuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJob3RrZXlcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LliIfmjaLkuLpcXFwiICsgaW5wdXQ7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2ZpcmVcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5YiH5o2i5pWw5o2u5rqQXFxcIixcXG4gICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKGRhdGFTb3VyY2UpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkKGRhdGFTb3VyY2UsIDEsIFxcXCLliIfmjaLmlbDmja7mupBcXFwiKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcImRhdGFTb3VyY2VcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJdGVtKFxcXCJob3RrZXlcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suWIh+aNouS4ulxcXCIgKyBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9LCBkYXRhU291cmNlKVxcbiAgICAgICAgICAgIH1dXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLmraPlnKjliqDovb0uLi5cXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogaWQgKyBcXFwiOmhvdGtleVxcXCIsXFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBzZXRSZXN1bHQoZCk7XFxuICAgIGxldCBzZCA9IFtdO1xcbiAgICBsZXQgc2V0U2VhcmNoS2V5ID0gbmFtZSA9PiB7XFxuICAgICAgICBwdXRNeVZhcigncycsIG5hbWUpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgfTtcXG5cXG4gICAgbGV0IGdldFRpdGxlID0gKGksIG5hbWUpID0+IHtcXG4gICAgICAgIGxldCBjb2xvcjtcXG4gICAgICAgIHN3aXRjaCAoaSkge1xcbiAgICAgICAgICAgIGNhc2UgMDpcXG4gICAgICAgICAgICAgICAgY29sb3IgPSBcXFwiI2ZmMzMwMFxcXCI7XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIGNhc2UgMTpcXG4gICAgICAgICAgICAgICAgY29sb3IgPSBcXFwiI2ZmNjYwMFxcXCI7XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIGNhc2UgMjpcXG4gICAgICAgICAgICAgICAgY29sb3IgPSBcXFwiI2ZmOTkwMFxcXCJcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgZGVmYXVsdDpcXG4gICAgICAgICAgICAgICAgY29sb3IgPSBcXFwiYmxhY2tcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIFxcXCLigJzigJzigJ3igJ1cXFwiICsgU3RyaW5nKGkgKyAxKS5mb250Y29sb3IoY29sb3IpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBuYW1lO1xcbiAgICB9XFxuICAgIHRyeSB7XFxuICAgICAgICBzd2l0Y2ggKHNlbGVjdHNvdXJjZSkge1xcbiAgICAgICAgICAgIGNhc2UgXFxcIueZvuW6plxcXCI6XFxuICAgICAgICAgICAgICAgIHZhciBqc29uID0gcmVxdWVzdCgnaHR0cHM6Ly90b3AuYmFpZHUuY29tL2FwaS9ib2FyZD9wbGF0Zm9ybT13aXNlJnRhYj0nICsgdGFia2V5ICsgJyZ0YWc9JTdCJTIyY2F0ZWdvcnklMjI6JTIyJUU1JTg1JUE4JUU5JTgzJUE4JUU3JUIxJUJCJUU1JTlFJThCJTIyJTdEJywge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA2LjA7IE5leHVzIDUgQnVpbGQvTVJBNThOKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvOTkuMC40ODQ0LjUxIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnSG9zdCc6ICd0b3AuYmFpZHUuY29tJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0FjY2VwdC1MYW5ndWFnZSc6ICd6aC1DTix6aDtxPTAuOSxlbi1VUztxPTAuOCxlbjtxPTAuNycsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0FjY2VwdC1FbmNvZGluZyc6ICdnemlwLCBkZWZsYXRlLCBicicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly90b3AuYmFpZHUuY29tL2JvYXJkP3RhYj1ub3ZlbCcsXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAvL3ZhciBzID0gRGF0ZS5ub3coKTtcXG4gICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBKU09OLnBhcnNlKGpzb24pLmRhdGEuY2FyZHNbMF0uY29udGVudDtcXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IGxpc3RbaV07XFxuICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGl0ZW0ud29yZCArICcgKCcgKyBpdGVtLnNob3dbMl0gKyAnKSc7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgZGVzID0gaXRlbS5kZXNjO1xcbiAgICAgICAgICAgICAgICAgICAgc2QucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGdldFRpdGxlKGksIG5hbWUpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZShzZXRTZWFyY2hLZXksIGl0ZW0ud29yZCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogZGVzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZzogaXRlbS5pbWcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJtb3ZpZV8xX3ZlcnRpY2FsX3BpY1xcXCJcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIGNhc2UgXFxcIuWkuOWFi1xcXCI6XFxuICAgICAgICAgICAgICAgIHZhciBqc29uID0gcmVxdWVzdChcXFwiaHR0cHM6Ly9uZXdzLm15cXVhcmsuY24vdjIvdG9wbGlzdC9tb3ZpZT8mY2hhbm5lbD1cXFwiICsgdGFia2V5ICsgXFxcIiZyYW5rX3R5cGU9JUU2JTlDJTgwJUU3JTgzJUFEXFxcIik7XFxuICAgICAgICAgICAgICAgIHZhciB4bWxEYXRhID0gKEpTT04ucGFyc2UoanNvbikuZGF0YSB8fCBcXFwiXFxcIikucmVwbGFjZSgvdGl0bGU+L2csIFxcXCJoX3RpdGxlPlxcXCIpLnJlcGxhY2UoL3NyYz4vZywgXFxcImhfc3JjPlxcXCIpLnJlcGxhY2UoL2FyZWE+L2csIFxcXCJoX2FyZWFcXFwiKTtcXG4gICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBwZGZhKHhtbERhdGEsIFxcXCJib2R5JiZpdGVtXFxcIik7XFxuICAgICAgICAgICAgICAgIHZhciBnZXRUZXh0ID0gdCA9PiB0O1xcbiAgICAgICAgICAgICAgICB2YXIgdHJlbmQgPSBbXFxcIuOEp1xcXCIsIFxcXCLihpFcXFwiLCBcXFwi4oaTXFxcIl07XFxuICAgICAgICAgICAgICAgIC8vdmFyIHMgPSBEYXRlLm5vdygpO1xcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtID0gbGlzdFtpXTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gcGRmaChpdGVtLCBcXFwiaF90aXRsZSYmVGV4dFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRlcyA9IFxcXCLng63luqbvvJpcXFwiICsgcGRmaChpdGVtLCBcXFwiaG90X3Njb3JlJiZUZXh0XFxcIikgKyBcXFwiIFxcXCIgKyB0cmVuZC5hdChwZGZoKGl0ZW0sIFxcXCJob3RfdHJlbmQmJlRleHRcXFwiKSkgK1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJcXFxcbuivhOWIhu+8mlxcXCIgKyBwZGZoKGl0ZW0sIFxcXCJzY29yZV9hdmcmJlRleHRcXFwiKS5yZXBsYWNlKC9eMCQvLCBcXFwi5pqC5peg6K+E5YiGXFxcIikgK1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJcXFxcblxcXCIgKyBwZGZoKGl0ZW0sIFxcXCJ5ZWFyJiZUZXh0XFxcIikgKyBcXFwiwrdcXFwiICsgcGRmaChpdGVtLCBcXFwiaF9hcmVhJiZUZXh0XFxcIikgKyBcXFwiwrdcXFwiICsgcGRmaChpdGVtLCBcXFwiY2F0ZWdvcnkmJlRleHRcXFwiKS5yZXBsYWNlKFxcXCIsXFxcIiwgXFxcIsK3XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBzZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogZ2V0VGl0bGUoaSwgbmFtZSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKHNldFNlYXJjaEtleSwgbmFtZSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogZGVzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZzogcGRmaChpdGVtLCBcXFwiaF9zcmMmJlRleHRcXFwiKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcIm1vdmllXzFfdmVydGljYWxfcGljXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICB9XFxuICAgICAgICBhZGRJdGVtQWZ0ZXIoaWQgKyBcXFwiOmhvdGtleVxcXCIsIHNkKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgIH0gZmluYWxseSB7XFxuICAgICAgICBkZWxldGVJdGVtKGlkICsgXFxcIjpob3RrZXlcXFwiKTtcXG4gICAgfVxcbn1cXG5sZXQgciA9IGdldEl0ZW0oXFxcInJ1bGVcXFwiLCBcXFwiXFxcIik7XFxubGV0IGhpZGVTZXR0aW5nID0gTVlfUEFSQU1TLmhpZGVTZXR0aW5nIHx8IGdldFBhcmFtKFxcXCJzZWFyY2hUZXJtc1xcXCIsIFxcXCJcXFwiKSA9PT0gXFxcInRydWVcXFwiO1xcbmxldCBzID0gZ2V0TXlWYXIoJ3MnLCAnJykgfHwgTVlfUEFSQU1TLnNlYXJjaFRlcm1zIHx8IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwic2VhcmNoVGVybXNcXFwiLCBcXFwiXFxcIikpO1xcbmxldCBzZWFyY2hNb2RlID0gZ2V0U2VhcmNoTW9kZSgpO1xcbmxldCBvcGVuTW9kZSA9IGdldEl0ZW0oXFxcIm9wZW5Nb2RlXFxcIiwgXFxcIuacrOWcsOi9rOeggVxcXCIpO1xcbmxldCBpZCA9IERhdGUubm93KCkgKyBNWV9SVUxFLnRpdGxlO1xcbmxldCBkID0gW107XFxuaWYgKE1ZX1BBR0UgPT09IDEpIHtcXG4gICAgc2V0UHJlcG9zZSgpO1xcbiAgICBpZiAoIWhpZGVTZXR0aW5nKSB7XFxuICAgICAgICBzZXRDbGlwKCk7XFxuICAgICAgICBzZXRIZWFkKCk7XFxuICAgIH1cXG4gICAgc2V0UnVsZUl0ZW0oKTtcXG4gICAgaWYgKCFzKSB7XFxuICAgICAgICBzZXRIaXN0b3J5KCk7XFxuICAgIH1cXG59XFxuaWYgKHMpIHtcXG4gICAgcmVjb3JkKCk7XFxuICAgIHNlYXJjaEVuZCgpO1xcbn0gZWxzZSBpZiAoTVlfUEFHRSA9PT0gMSkge1xcbiAgICBzZXRUcmVuZGluZ1RhYkVuZCgpO1xcbn0gZWxzZSB7XFxuICAgIHNldFJlc3VsdChbXSk7XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi572R6aG15rWP6KeIXCIsXCJwYXRoXCI6XCJ5c2Z4XCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcblxcbmxldCBvcGVuTW9kZSA9IGdldEl0ZW0oXFxcIm9wZW5Nb2RlXFxcIik7XFxubGV0IHJ1bGUgPSBNWV9SVUxFLnRpdGxlO1xcbmxldCB1cmwgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcIndlYlVybFxcXCIsXFxcIlxcXCIpKTtcXG5cXG5mdW5jdGlvbiBpbnRlcmNlcHQocnVsZSwgb3JpZ2luLCBvcGVuTW9kZSkge1xcbiAgICBsZXQgaG9zdCA9IG9yaWdpbi5yZXBsYWNlKG5ldyBSZWdFeHAoXFxcImh0dHA6Ly98aHR0cHM6Ly9cXFwiKSwgXFxcIlxcXCIpLnNwbGl0KFxcXCIvXFxcIilbMF07XFxuICAgIGxldCBob3N0cyA9IGhvc3Quc3BsaXQoXFxcIi5cXFwiKTtcXG4gICAgaWYgKGhvc3RzLmxlbmd0aCA+IDIpIHtcXG4gICAgICAgIGhvc3QgPSBob3N0c1tob3N0cy5sZW5ndGggLSAyXSArIFxcXCIuXFxcIiArIGhvc3RzW2hvc3RzLmxlbmd0aCAtIDFdO1xcbiAgICB9XFxuICAgIGlmIChpbnB1dC5zdGFydHNXaXRoKFxcXCJtYWduZXRcXFwiKSkge1xcbiAgICAgICAgY29uZmlybSh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLmuKnppqjmj5DnpLpcXFwiLFxcbiAgICAgICAgICAgIGNvbnRlbnQ6IFxcXCLmo4DmtYvliLDmlrDnmoTno4Hpk77lnLDlnYDvvIzngrnlh7vnoa7lrprmjInpkq7ljbPlj6/mkq3mlL7vvIzngrnlh7vlj5bmtojmjInpkq7lj6/ku6XlpI3liLbpk77mjqVcXFwiLFxcbiAgICAgICAgICAgIGNvbmZpcm06ICQudG9TdHJpbmcoKG1hZykgPT4ge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFnO1xcbiAgICAgICAgICAgIH0sIGlucHV0KSxcXG4gICAgICAgICAgICBjYW5jZWw6ICQudG9TdHJpbmcoKG1hZykgPT4ge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgbWFnXFxuICAgICAgICAgICAgfSwgaW5wdXQpXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICB9IGVsc2UgaWYgKCQucmVxdWlyZShcXFwiYWxpdGVzdD9ydWxlPVxcXCIrcnVsZSkudGVzdChpbnB1dCkgJiYgb3Blbk1vZGUgIT0gXFxcIuWumOaWuUFQUFxcXCIpIHtcXG4gICAgICAgIGxvZyhpbnB1dCk7XFxuICAgICAgICBpZiAoaW5wdXQuaW5jbHVkZXMoJ2NoZWNrdXJsP3VybD0nKSAmJiBpbnB1dC5pbmNsdWRlcygnJnVybHJlZmVyJykpIHtcXG4gICAgICAgICAgICBpbnB1dCA9IGRlY29kZVVSSUNvbXBvbmVudChpbnB1dC5zcGxpdCgnJnVybHJlZmVyJylbMF0uc3BsaXQoJ2NoZWNrdXJsP3VybD0nKVsxXSk7XFxuICAgICAgICAgICAgLy9sb2coJ+i0tOWQpycraW5wdXQpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuICQudG9TdHJpbmcoKHVybCwgcnVsZSkgPT4ge1xcbiAgICAgICAgICAgIGZ5X2JyaWRnZV9hcHAub3BlbihKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi6Zi/6YeM5LqR55uYXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2FsaXl1bj9wYWdlPWZ5cGFnZSZyZWFsdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQodXJsKSArIFxcXCImcnVsZT1cXFwiICsgcnVsZSxcXG4gICAgICAgICAgICB9KSlcXG4gICAgICAgIH0sIGlucHV0LCBydWxlKTtcXG4gICAgfSBlbHNlIGlmICgvXFxcXC4obXAzfGZsYWN8bTRhKSQvLnRlc3QoaW5wdXQpKSB7XFxuICAgICAgICBsb2coaW5wdXQpO1xcbiAgICAgICAgcmV0dXJuICQudG9TdHJpbmcoKHVybCwgcnVsZSkgPT4ge1xcbiAgICAgICAgICAgIGZ5X2JyaWRnZV9hcHAucGxheVZpZGVvKHVybCk7XFxuICAgICAgICB9LCBpbnB1dCwgcnVsZSk7XFxuICAgIH0gZWxzZSBpZiAoIWlucHV0LmluY2x1ZGVzKGhvc3QpICYmIGlucHV0LnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgICAgbG9nKGlucHV0KTtcXG4gICAgICAgIHJldHVybiAkLnRvU3RyaW5nKCh1cmwsIHJ1bGUpID0+IHtcXG4gICAgICAgICAgICBmeV9icmlkZ2VfYXBwLm9wZW4oSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuivpuaDhVxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS95c2Z4P3dlYlVybD1cXFwiK2VuY29kZVVSSUNvbXBvbmVudCh1cmwpK1xcXCImcnVsZT1cXFwiK3J1bGUsXFxuICAgICAgICAgICAgfSkpXFxuICAgICAgICB9LCBpbnB1dCwgcnVsZSk7XFxuICAgIH0gZWxzZSBpZiAoIWlucHV0LnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgICAgbG9nKGlucHV0KTtcXG4gICAgICAgIC8v6IO95ZSk6LW3QVBQ55qE55m95ZCN5Y2VXFxuICAgICAgICBsZXQgd2hpdGUgPSBbXFxuICAgICAgICAgICAgXFxcInFrbGlua1xcXCIsXFxuICAgICAgICAgICAgXFxcImJkbmV0ZGlza1xcXCIsXFxuICAgICAgICAgICAgXFxcInh1bmxlaWFwcFxcXCIsXFxuICAgICAgICAgICAgXFxcInNtYXJ0ZHJpdmVcXFwiXFxuICAgICAgICBdO1xcbiAgICAgICAgbGV0IGluV2hpdGUgPSB3aGl0ZS5maWx0ZXIoaXQgPT4gaW5wdXQuc3RhcnRzV2l0aChpdCkpLmxlbmd0aCA+IDA7XFxuICAgICAgICBpZiAoIWluV2hpdGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gJC50b1N0cmluZygodXJsLCBydWxlKSA9PiB7XFxuICAgICAgICAgICAgZnlfYnJpZGdlX2FwcC5vcGVuVGhpcmRBcHAgJiYgZnlfYnJpZGdlX2FwcC5vcGVuVGhpcmRBcHAodXJsKTtcXG4gICAgICAgIH0sIGlucHV0LCBydWxlKTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBsb2FkSnMoKSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBpZiAoZG9jdW1lbnQudGl0bGUgJiYgZG9jdW1lbnQudGl0bGUubGVuZ3RoKSB7XFxuICAgICAgICAgICAgbGV0IHIgPSAkJCQoKS5sYXp5UnVsZSgodCkgPT4ge1xcbiAgICAgICAgICAgICAgICBzZXRQYWdlVGl0bGUodCk7XFxuICAgICAgICAgICAgfSwgZG9jdW1lbnQudGl0bGUpO1xcbiAgICAgICAgICAgIGZ5X2JyaWRnZV9hcHAucGFyc2VMYXp5UnVsZShyKTtcXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgZnlfYnJpZGdlX2FwcC5sb2coZS50b1N0cmluZygpKTtcXG4gICAgfVxcbn1cXG5cXG5kLnB1c2goe1xcbiAgICB1cmw6IHVybCxcXG4gICAgY29sX3R5cGU6IFxcXCJ4NV93ZWJ2aWV3X3NpbmdsZVxcXCIsXFxuICAgIGRlc2M6IFxcXCIxMDAlJiZmbG9hdFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB1cmxJbnRlcmNlcHRvcjogJC50b1N0cmluZyhpbnRlcmNlcHQsIHJ1bGUsIGdldEhvbWUodXJsKSwgb3Blbk1vZGUpLFxcbiAgICAgICAganM6ICQudG9TdHJpbmcobG9hZEpzKSxcXG4gICAgICAgIGNhbkJhY2s6IHRydWUsXFxuICAgICAgICBqc0xvYWRpbmdJbmplY3Q6IHRydWUsXFxuICAgICAgICBmbG9hdFZpZGVvOiB0cnVlXFxuICAgIH1cXG59KTtcXG5cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLpmL/ph4xMYXp5XCIsXCJwYXRoXCI6XCJhbGlsYXp5XCIsXCJydWxlXCI6XCJjb25zdCBBbGlBY2Nlc3NBcGkgPSAkLnJlcXVpcmUoXFxcImFsaVBsYXlBcGlcXFwiKTtcXG5jb25zdCB7XFxuICAgIG9wZW5Ub2tlbnNGaWxlcGF0aCxcXG4gICAgYWxpVG9rZW5zRmlsZXBhdGhcXG59ID0gJC5yZXF1aXJlKFxcXCJ0b2tlblBhdGhcXFwiKTtcXG5cXG5mdW5jdGlvbiBhbGlNM3U4UHJveHkoZmlsZUlkLCBzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVUb2tlbiwgYWxpVG9rZW4sIHRpdGxlKSB7XFxuICAgIC8v6L+H5pyf6I635Y+W5pKt5pS+5Y6f5aeL6ZO+5o6lXFxuICAgIGZ1bmN0aW9uIGdldEFsaVBsYXlVcmwoZmlsZUlkLCBsaW5lKSB7XFxuICAgICAgICBsZXQgYWxpdXJsO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBjb25zdCBBbGlBY2Nlc3NBcGkgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9hbGlQbGF5QXBpP3J1bGU9XFxcIiArIHRpdGxlKTtcXG4gICAgICAgICAgICBsZXQgYWxpQWNjZXNzQXBpID0gQWxpQWNjZXNzQXBpLmNyZWF0ZURlZmF1bHQoc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIGFsaVRva2VuLCBudWxsLCB0aXRsZSk7XFxuICAgICAgICAgICAgbGV0IHBsYXlVcmxMaXN0ID0gYWxpQWNjZXNzQXBpLmdldFNoYXJlVmlkZW9QcmV2aWV3KGZpbGVJZCkgfHwgW107XFxuICAgICAgICAgICAgYWxpdXJsID0gcGxheVVybExpc3QuZmluZCh2PT52LnRlbXBsYXRlX2lkID09IGxpbmUpLnVybDtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgICAgICB0aHJvdyBlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGFsaXVybDtcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBnZXRNM3U4Q29udGVudChwbGF5dXJsKSB7XFxuXFxuICAgICAgICAvL2xvZyhcXFwi5oiR5Zyo5Luj55CGXFxcIiArIHBsYXl1cmwpO1xcbiAgICAgICAgbGV0IGhvbWUgPSBwbGF5dXJsLnNwbGl0KFxcXCJtZWRpYS5tM3U4XFxcIilbMF07XFxuICAgICAgICBsZXQgZiA9IGZldGNoKHBsYXl1cmwsIHtcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogUENfVUEsXFxuICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9cXFwiXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICB0aW1lb3V0OiAzMDAwXFxuICAgICAgICB9KS5zcGxpdChcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgIGxldCBmZiA9IGYubWFwKGl0ID0+IHtcXG4gICAgICAgICAgICBpZiAoaXQuc3RhcnRzV2l0aChcXFwibWVkaWEtXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCIvcHJveHk/dXJsPVxcXCIgKyBiYXNlNjRFbmNvZGUoaG9tZSArIGl0KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGl0O1xcbiAgICAgICAgfSkuam9pbihcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgIC8vbG9nKCd1ZmlkLScgKyBmaWxlaWQpO1xcbiAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS9cXFwiICsgZmlsZUlkICsgXFxcIi5tM3U4XFxcIiwgZmYpO1xcbiAgICAgICAgcmV0dXJuIGZmO1xcbiAgICB9XFxuXFxuICAgIGZ1bmN0aW9uIHVwZGF0ZVRzVXJsKHVybCkge1xcbiAgICAgICAgbGV0IGZpZCA9IHVybC5zcGxpdCgnJmY9JylbMV0uc3BsaXQoJyYnKVswXTtcXG4gICAgICAgIC8vbG9nKCdzZmlkLScgKyBmaWQpO1xcbiAgICAgICAgbGV0IGYgPSBmZXRjaCgnaGlrZXI6Ly9maWxlcy9fY2FjaGUvJyArIGZpZCArICcubTN1OCcpLnNwbGl0KFxcXCJcXFxcblxcXCIpO1xcbiAgICAgICAgZi5mb3JFYWNoKGl0ID0+IHtcXG4gICAgICAgICAgICBpZiAoaXQgJiYgaXQuc3RhcnRzV2l0aCgnL3Byb3h5P3VybD0nKSkge1xcbiAgICAgICAgICAgICAgICBsZXQgZnVybCA9IGJhc2U2NERlY29kZShpdC5yZXBsYWNlKCcvcHJveHk/dXJsPScsICcnKSk7XFxuICAgICAgICAgICAgICAgIGlmICh1cmwuc3Vic3RyKHVybC5pbmRleE9mKCcvbWVkaWEtJyksIHVybC5pbmRleE9mKCcudHMnKSkgPT0gZnVybC5zdWJzdHIoZnVybC5pbmRleE9mKCcvbWVkaWEtJyksIGZ1cmwuaW5kZXhPZignLnRzJykpKSB7XFxuICAgICAgICAgICAgICAgICAgICB1cmwgPSBmdXJsO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgICAgIGxldCBleHBpcmVzID0gdXJsLnNwbGl0KCd4LW9zcy1leHBpcmVzPScpWzFdLnNwbGl0KCcmJylbMF07XFxuICAgICAgICBjb25zdCBsYXN0dGltZSA9IHBhcnNlSW50KGV4cGlyZXMpIC0gRGF0ZS5ub3coKSAvIDEwMDA7XFxuICAgICAgICBpZiAobGFzdHRpbWUgPCA2MCkge1xcbiAgICAgICAgICAgIC8vbG9nKCfov4fmnJ/mm7TmlrAnKVxcbiAgICAgICAgICAgIGxldCBsaW5lID0gdXJsLnNwbGl0KCcvbWVkaWEnKVswXTsgLy/lj5bkuYvliY3mkq3mlL7nmoR0c+autee6v+i3r1xcbiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZyhsaW5lLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcXG4gICAgICAgICAgICBsZXQgZiA9IGdldE0zdThDb250ZW50KGdldEFsaVBsYXlVcmwoZmlkLCBsaW5lKSkuc3BsaXQoXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICAgICAgZi5mb3JFYWNoKGl0ID0+IHtcXG4gICAgICAgICAgICAgICAgaWYgKGl0ICYmIGl0LnN0YXJ0c1dpdGgoJy9wcm94eT91cmw9JykpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBmdXJsID0gYmFzZTY0RGVjb2RlKGl0LnJlcGxhY2UoJy9wcm94eT91cmw9JywgJycpKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh1cmwuc3Vic3RyKHVybC5pbmRleE9mKCcvbWVkaWEtJyksIHVybC5pbmRleE9mKCcudHMnKSkgPT0gZnVybC5zdWJzdHIoZnVybC5pbmRleE9mKCcvbWVkaWEtJyksIGZ1cmwuaW5kZXhPZignLnRzJykpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gZnVybDtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pXFxuXFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gdXJsO1xcbiAgICB9XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgdXJsID0gYmFzZTY0RGVjb2RlKE1ZX1BBUkFNUy51cmxbMF0pO1xcbiAgICAgICAgaWYgKHVybC5pbmNsdWRlcyhcXFwiLnRzXFxcIikpIHtcXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAzMDIsXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJMb2NhdGlvblxcXCI6IHVwZGF0ZVRzVXJsKHVybCksXFxuICAgICAgICAgICAgICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6IFBDX1VBLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL1xcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsZXQgdGVtcGxhdGVJZCA9IE1ZX1BBUkFNUy50ZW1wbGF0ZUlkWzBdO1xcbiAgICAgICAgICAgIGxldCBmZiA9IGdldE0zdThDb250ZW50KGdldEFsaVBsYXlVcmwoZmlsZUlkLCB0ZW1wbGF0ZUlkKSk7XFxuICAgICAgICAgICAgcmV0dXJuIGZmO1xcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coXFxcIuS7o+eQhuaSreaUvuWksei0pSNcXFxcbumUmeivr+S/oeaBrz5cXFwiICsgZS50b1N0cmluZygpICsgXFxcIlxcXFxu6ZSZ6K+v6KGMPlxcXCIgKyBlLmxpbmVOdW1iZXIpO1xcbiAgICB9XFxufVxcblxcblxcbmZ1bmN0aW9uIGdldFZpZGVvKGFsaUFjY2Vzc0FwaSwgZmlsZUlkKSB7XFxuXFxuICAgIGxldCBwbGF5VXJsTGlzdCA9IGFsaUFjY2Vzc0FwaS5nZXRTaGFyZVZpZGVvUHJldmlldyhmaWxlSWQpIHx8IFtdO1xcblxcbiAgICBsZXQgc2VydmVyQWRkcmVzcyA9IHN0YXJ0UHJveHlTZXJ2ZXIoJC50b1N0cmluZyhhbGlNM3U4UHJveHksIGZpbGVJZCwgYWxpQWNjZXNzQXBpLnNoYXJlSWQsIGFsaUFjY2Vzc0FwaS5zaGFyZVB3ZCwgYWxpQWNjZXNzQXBpLnNoYXJlVG9rZW4sIGFsaUFjY2Vzc0FwaS5hbGlUb2tlbiwgTVlfUlVMRS50aXRsZSkpO1xcbiAgICBsZXQgdHJhbnNjb2RpbmcgPSB7XFxuICAgICAgICBVSEQ6IFxcXCI0SyDotoXmuIVcXFwiLFxcbiAgICAgICAgUUhEOiBcXFwiMksg6LaF5riFXFxcIixcXG4gICAgICAgIEZIRDogXFxcIjEwODAg5YWo6auY5riFXFxcIixcXG4gICAgICAgIEhEOiBcXFwiNzIwIOmrmOa4hVxcXCIsXFxuICAgICAgICBTRDogXFxcIjU0MCDmoIfmuIVcXFwiLFxcbiAgICAgICAgTEQ6IFxcXCIzNjAg5rWB55WFXFxcIlxcbiAgICB9O1xcblxcbiAgICBpZiAocGxheVVybExpc3QubGVuZ3RoID4gMCkge1xcbiAgICAgICAgbGV0IHVybHMgPSBbXSxcXG4gICAgICAgICAgICBuYW1lcyA9IFtdO1xcbiAgICAgICAgcGxheVVybExpc3QuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgIHVybHMucHVzaChzZXJ2ZXJBZGRyZXNzICsgXFxcIj91cmw9XFxcIiArIGJhc2U2NEVuY29kZShpdGVtLnVybCkgKyBcXFwiJnRlbXBsYXRlSWQ9XFxcIiArIGl0ZW0udGVtcGxhdGVfaWQgKyBcXFwiIy5tM3U4XFxcIik7XFxuICAgICAgICAgICAgbmFtZXMucHVzaCh0cmFuc2NvZGluZ1tpdGVtLnRlbXBsYXRlX2lkXSA/IHRyYW5zY29kaW5nW2l0ZW0udGVtcGxhdGVfaWRdIDogaXRlbS50ZW1wbGF0ZV9oZWlnaHQpO1xcbiAgICAgICAgfSk7XFxuICAgICAgICBsZXQgaGVhZHMgPSBuZXcgQXJyYXkocGxheVVybExpc3QubGVuZ3RoKS5maWxsKHtcXG4gICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJ1xcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgIHVybHM6IHVybHMsXFxuICAgICAgICAgICAgbmFtZXM6IG5hbWVzLFxcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRzLFxcbiAgICAgICAgfTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiB7fTtcXG4gICAgfVxcblxcbn07XFxuZnVuY3Rpb24gZ2V0UGxheUZvcm1hdChwbGF5VXJsLCB0aXRsZSl7XFxuICAgIHJldHVybiB7XFxuICAgICAgICBuYW1lczogW3RpdGxlXSxcXG4gICAgICAgIHVybHM6IFtwbGF5VXJsICsgXFxcIiNpc1ZpZGVvPXRydWUjI2lnbm9yZU11c2ljPXRydWUjXFxcIl0sXFxuICAgICAgICBoZWFkZXJzOiBbe1xcbiAgICAgICAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS8nLFxcbiAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjpcXFwiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExNy4wLjAuMCBTYWZhcmkvNTM3LjM2XFxcIlxcbiAgICAgICAgfV1cXG4gICAgfTtcXG59XFxuXFxuXFxuJC5leHBvcnRzID0gZnVuY3Rpb24oc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIGZpbGVJZCwgY2F0ZSwgemltdSkge1xcbiAgICBpZiAoIWZpbGVFeGlzdChhbGlUb2tlbnNGaWxlcGF0aCkpIHtcXG4gICAgICAgIHRvYXN0KFxcXCLor7flhYjnmbvpmYbnmbvlvZXotKblj7dcXFwiKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9ub1JlZnJlc2g9MVxcXCI7XFxuICAgIH1cXG4gICAgbGV0IGFsaVRva2VuID0gJC5yZXF1aXJlKGFsaVRva2Vuc0ZpbGVwYXRoKTtcXG4gICAgaWYgKGNhdGUgPT09IFxcXCJ2aWRlb1xcXCIpIHtcXG4gICAgICAgIGxldCBwbGF5TGlzdCA9IFtdO1xcbiAgICAgICAgbGV0IGFsaUFjY2Vzc0FwaTtcXG4gICAgICAgIGxldCBwbGF5TW9kZSA9IGdldEl0ZW0oXFxcImFsaXl1bl9wbGF5TW9kZVxcXCIsIFxcXCLovaznoIFcXFwiKTtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgYWxpQWNjZXNzQXBpID0gQWxpQWNjZXNzQXBpLmNyZWF0ZURlZmF1bHQoc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIGFsaVRva2VuKTtcXG4gICAgICAgICAgICBpZiAocGxheU1vZGUgPT09IFxcXCLovaznoIFcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHBsYXlMaXN0ID0gZ2V0VmlkZW8oYWxpQWNjZXNzQXBpLCBmaWxlSWQpIHx8IHt9O1xcbiAgICAgICAgICAgIH0gZWxzZSBpZihwbGF5TW9kZSA9PT0gXFxcIuWOn+eUu1xcXCIpe1xcbiAgICAgICAgICAgICAgICBwbGF5TGlzdCA9IGdldFBsYXlGb3JtYXQoYWxpQWNjZXNzQXBpLmdldFZpZGVvVGVtUGxheVVybChmaWxlSWQpLCBwbGF5TW9kZSk7XFxuICAgICAgICAgICAgfSBlbHNle1xcbiAgICAgICAgICAgICAgICBwbGF5TGlzdCA9IGdldFBsYXlGb3JtYXQoYWxpQWNjZXNzQXBpLmdldEZpbGVUb0Rvd25VcmwoZmlsZUlkKSwgcGxheU1vZGUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coXFxcIiNcXFwiICsgcGxheU1vZGUgKyBcXFwi5pKt5pS+5aSx6LSlI1xcXFxu6ZSZ6K+v5L+h5oGvPlxcXCIgKyBlLnRvU3RyaW5nKCkgKyBcXFwiXFxcXG7plJnor6/ooYw+XFxcIiArIGUubGluZU51bWJlcik7XFxuICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gXFxcIkludmFsaWRQYXJhbWV0ZXIuUmVmcmVzaFRva2VuXFxcIikge1xcbiAgICAgICAgICAgICAgICB0b2FzdChcXFwi55m76ZmG6L+H5pyf77yM6K+36YeN5paw55m76ZmGXFxcIik7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9ub1JlZnJlc2g9MVxcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChlLmNvZGUgPT09IFxcXCJRdW90YUV4aGF1c3RlZC5Ecml2ZVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+e9keebmOepuumXtOS4jei2s++8jOaXoOazleaSreaUvuivt+a4heeQhuOAglxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mkq3mlL7lpLHotKXvvIzplJnor6/kv6Hmga/lt7LmiZPljbDjgIJcXFxcbuivt+afpeeci+aXpeW/lyhMT0cpXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBtb3VudHN1YiA9IHN0b3JhZ2UwLmdldE15VmFyKCdtb3VudHppbXUnLCB7fSk7XFxuICAgICAgICBpZiAoT2JqZWN0LmtleXMobW91bnRzdWIpLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICB6aW11ID0gbW91bnRzdWI7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgc3VidGl0bGU7XFxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoemltdSB8fCB7fSkubGVuZ3RoID4gMCAmJiBwbGF5TGlzdCAmJiBwbGF5TGlzdC51cmxzICYmIHBsYXlMaXN0LnVybHMubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAoMTAwKTtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICB2YXIgem11cmwgPSBhbGlBY2Nlc3NBcGkuZ2V0RmlsZVRvRG93blVybCh6aW11LmZpbGVfaWQpO1xcbiAgICAgICAgICAgICAgICBsZXQgcGF0aCA9ICdoaWtlcjovL2ZpbGVzL2NhY2hlL+S6keebmOWQmy9zdWIuJyArIHppbXUuZXh0O1xcbiAgICAgICAgICAgICAgICBkb3dubG9hZEZpbGUoem11cmwsIHBhdGgsIHtcXG4gICAgICAgICAgICAgICAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS8nXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IGdldFBhdGgocGF0aCk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICB0b2FzdChcXFwi5a2X5bmV5Yqg6L295aSx6LSlXFxcIik7XFxuICAgICAgICAgICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBkbWxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiZG1saXN0XFxcIiwgW10pO1xcbiAgICAgICAgbGV0IGRtbGlzdF9jYWNoZSA9IGdldE15VmFyKFxcXCJkbWxpc3RfY2FjaGVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoZG1saXN0X2NhY2hlICYmIGRtbGlzdF9jYWNoZS5zdGFydHNXaXRoKGZpbGVJZCArIFxcXCIjXFxcIikpIHtcXG4gICAgICAgICAgICBwbGF5TGlzdC5kYW5tdSA9IGRtbGlzdF9jYWNoZS5yZXBsYWNlKGZpbGVJZCArIFxcXCIjXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgfSBlbHNlIGlmIChkbWxpc3QubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgIHBsYXlMaXN0LmRhbm11ID0gXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvZGFubXUvXFxcIiArIGRtbGlzdC5zcGxpY2UoMCwgMSlbMF07XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcImRtbGlzdF9jYWNoZVxcXCIsIGZpbGVJZCArIFxcXCIjXFxcIiArIHBsYXlMaXN0LmRhbm11KTtcXG4gICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwiZG1saXN0XFxcIiwgZG1saXN0KTtcXG4gICAgICAgICAgICBpZiAoZG1saXN0Lmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICB0b2FzdChcXFwi5by55bmV5YiX6KGo5bey5YWo6YOo5oyC6L29XFxcIik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBwbGF5TGlzdC5kYW5tdSA9IGdldFZhcihcXFwiZG1fc2hhcmVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICB9XFxuICAgICAgICBwbGF5TGlzdC5zdWJ0aXRsZSA9IHN1YnRpdGxlO1xcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlMaXN0KTtcXG4gICAgfVxcblxcbiAgICBsZXQgYWxpQWNjZXNzQXBpID0gQWxpQWNjZXNzQXBpLmNyZWF0ZURlZmF1bHQoc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIGFsaVRva2VuLCBudWxsKTtcXG4gICAgbGV0IHVybCA9IGFsaUFjY2Vzc0FwaS5nZXRGaWxlVG9Eb3duVXJsKGZpbGVJZCk7XFxuXFxuICAgIGlmIChjYXRlID09PSBcXFwiaW1hZ2VcXFwiKSB7XFxuICAgICAgICByZXR1cm4gdXJsICsgXFxcIiMuanBnXFxcIjtcXG4gICAgfSBlbHNlIGlmIChjYXRlID09PSBcXFwiYXVkaW9cXFwiKSB7XFxuICAgICAgICByZXR1cm4gdXJsICsgXFxcIiNpc011c2ljPXRydWUjXFxcIjtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiBcXFwiZG93bmxvYWQ6Ly9cXFwiICsgdXJsO1xcbiAgICB9XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Zi/6YeM5YiX6KGoXCIsXCJwYXRoXCI6XCJhbGl5dW5cIixcInJ1bGVcIjpcImpzOlxcbi8vQGF1dGhvciBMb3lEZ0lrXFxuY29uc3QgQWxpU2hhcmVBcGkgPSAkLnJlcXVpcmUoXFxcIkFsaUFwaVxcXCIpO1xcblxcblxcbmxldCBvcGVuQVBJTGlzdCA9IFtcXFwiYWxpc3RcXFwiLCBcXFwiZHJpdmVcXFwiLCBcXFwidHZib3hcXFwiLCBcXFwiWEJZXFxcIl07XFxuXFxubGV0IHJlYWx1cmwgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInJlYWx1cmxcXFwiLCBcXFwiXFxcIikpLnNwbGl0KFxcXCI/XFxcIilbMF07XFxubGV0IHVybERhdGEgPSByZWFsdXJsLnNwbGl0KFxcXCIvXFxcIik7XFxuLy9odHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy97c2hhcmVJZH0vZm9sZGVyL3tmaWxlSWR9PztcXG5cXG5sZXQgc2hhcmVJZCA9IE1ZX1BBUkFNUy5zaGFyZUlkIHx8IHVybERhdGFbNF07XFxubGV0IHNoYXJlUHdkID0gZ2V0UGFyYW0oXFxcInNoYXJlUHdkXFxcIiwgTVlfUEFSQU1TLnNoYXJlUHdkIHx8IFxcXCJcXFwiKTtcXG5sZXQgc2hhcmVUb2tlbiA9IGdldFBhcmFtKFxcXCJzaGFyZVRva2VuXFxcIiwgTVlfUEFSQU1TLnNoYXJlVG9rZW4pO1xcblxcbmxldCBmaWxlSWQgPSAodXJsRGF0YVs1XSA9PT0gXFxcImZvbGRlclxcXCIgPyB1cmxEYXRhWzZdIDogdm9pZCAwKSB8fCBNWV9QQVJBTVMuZmlsZUlkO1xcbmxldCBzZWFyY2hLZXkgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInNlYXJjaEtleVxcXCIsIFxcXCJcXFwiKSkgfHwgdW5kZWZpbmVkO1xcbmxldCBpc1NlYXJjaCA9ICEhc2VhcmNoS2V5O1xcblxcbmxldCBwYWdlSWQgPSBTdHJpbmcoRGF0ZS5ub3coKSkuc2xpY2UoNik7XFxuXFxuZnVuY3Rpb24gZm9ybWF0RGF0ZShfZGF0ZSwgZm10KSB7XFxuICAgIGxldCBkYXRlID0gIWlzTmFOKF9kYXRlKSA/IG5ldyBEYXRlKF9kYXRlICogMTAwMCkgOiBuZXcgRGF0ZShfZGF0ZSk7XFxuICAgIHJldHVybiAkLmRhdGVGb3JtYXQoZGF0ZSwgZm10IHx8IFxcXCJ5eXl5LU1NLWRkIEhIOm1tOnNzXFxcIilcXG59XFxuXFxuZnVuY3Rpb24gZm9ybWF0U2l6ZShzaXplKSB7XFxuICAgIGlmICghc2l6ZSkge1xcbiAgICAgICAgcmV0dXJuICcnO1xcbiAgICB9XFxuICAgIGNvbnN0IHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJywgJ1BCJywgJ0VCJywgJ1pCJywgJ1lCJ107XFxuICAgIGxldCBpID0gMDtcXG4gICAgd2hpbGUgKHNpemUgPj0gMTAyNCkge1xcbiAgICAgICAgc2l6ZSAvPSAxMDI0O1xcbiAgICAgICAgaSsrO1xcbiAgICB9XFxuICAgIHNpemUgPSBpID8gTnVtYmVyKHNpemUudG9GaXhlZCgyKSkgOiBzaXplO1xcbiAgICByZXR1cm4gYCR7c2l6ZX0gJHt1bml0c1tpXX1gO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRNeVBhQ2FjaGUoa2V5LCB2YWx1ZSkge1xcbiAgICBNWV9QQVJBTVNba2V5XSA9IHZhbHVlO1xcbn1cXG5cXG5mdW5jdGlvbiBzYXZlTXlQYUNhY2hlKCkge1xcbiAgICBzZXRQYWdlUGFyYW1zKE1ZX1BBUkFNUyk7XFxufVxcblxcbmZ1bmN0aW9uIHNldE1hcmtlcihtYXJrZXIpIHtcXG4gICAgc2V0TXlQYUNhY2hlKFxcXCJtYXJrZXJcXFwiLCBtYXJrZXIpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRUb2tlbihzaGFyZVRva2VuKSB7XFxuICAgIHNldE15UGFDYWNoZShcXFwic2hhcmVUb2tlblxcXCIsIHNoYXJlVG9rZW4pO1xcbn1cXG5pZiAoTVlfUEFSQU1TLm5vUGljKSB7XFxuICAgIHNldFBhZ2VQaWNVcmwoKTtcXG4gICAgc2V0TXlQYUNhY2hlKFxcXCJub1BpY1xcXCIsIGZhbHNlKTtcXG59XFxuLypcXG5mdW5jdGlvbiBzZXRWaWRlb0l0ZW1DYWNoZSh2aWRlb0l0ZW1DYWNoZSkge1xcbiAgICBzZXRNeVBhQ2FjaGUoXFxcInZpZGVvSXRlbUNhY2hlXFxcIiwgdmlkZW9JdGVtQ2FjaGUpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRTdWJ0aXRsZUNhY2hlKHN1YnRpdGxlQ2FjaGUpIHtcXG4gICAgc2V0TXlQYUNhY2hlKFxcXCJzdWJ0aXRsZUNhY2hlXFxcIiwgc3VidGl0bGVDYWNoZSk7XFxufSovXFxuXFxubGV0IGljb25UeXBlID0gXFxcImFpfGFwa3xhdml8Y3NzfGRtZ3xleGV8Zmx2fGdpZnxoaWtlcnxodG1sfGlzb3xqcGd8anN8anNvbnxsb2d8bW92fG1wM3xtcDR8b3RmfHBocHxwbmd8cHB0fHBzZHx0YWJsZXx0eHR8d2F2fHhsc3x6aXB8Y3NzfGRvY3xlcHVifGV4Y3xodG18eGxzeFxcXCIuc3BsaXQoJ3wnKTtcXG5cXG5mdW5jdGlvbiBnZXRJY29uKGV4dCwgdHlwZSkge1xcbiAgICBsZXQgcm9vdCA9IFxcXCJodHRwczovL2dpdGNvZGUubmV0L3FxXzMyMzk0MzUxL2RyLy0vcmF3L21hc3Rlci9pbWcv5paH5Lu257G75Z6LMi9cXFwiO1xcbiAgICBpZiAodHlwZSA9PT0gXFxcImZvbGRlclxcXCIpIHtcXG4gICAgICAgIHJldHVybiByb290ICsgXFxcIuaWh+S7tuWkuS5zdmdcXFwiO1xcbiAgICB9XFxuICAgIGlmIChpY29uVHlwZS5pbmNsdWRlcygoZXh0IHx8IFxcXCJcXFwiKS50b0xvd2VyQ2FzZSgpKSkge1xcbiAgICAgICAgcmV0dXJuIHJvb3QgKyBleHQgKyBcXFwiLnN2Z1xcXCI7XFxuICAgIH1cXG4gICAgcmV0dXJuIHJvb3QgKyBcXFwi5paH5Lu2LnN2Z1xcXCI7XFxuXFxufVxcblxcbmZ1bmN0aW9uIGxvYWQoaXRlbXMpIHtcXG4gICAgbGV0IGFsaVNoYXJlQXBpID0gbmV3IEFsaVNoYXJlQXBpKHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCAoc2hhcmVUb2tlbikgPT4ge1xcbiAgICAgICAgc2V0VG9rZW4oc2hhcmVUb2tlbik7XFxuICAgICAgICBNWV9QQVJBTVMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW47XFxuICAgIH0pO1xcbiAgICBsZXQgb3JkZXJzID0ge1xcbiAgICAgICAgXFxcIuWQjeensOato+W6j1xcXCI6IFxcXCJuYW1lI0FTQ1xcXCIsXFxuICAgICAgICBcXFwi5ZCN56ew5YCS5bqPXFxcIjogXFxcIm5hbWUjREVTQ1xcXCIsXFxuICAgICAgICBcXFwi5pe26Ze05q2j5bqPXFxcIjogXFxcInVwZGF0ZWRfYXQjQVNDXFxcIixcXG4gICAgICAgIFxcXCLml7bpl7TlgJLluo9cXFwiOiBcXFwidXBkYXRlZF9hdCNERVNDXFxcIixcXG4gICAgICAgIFxcXCLlpKflsI/mraPluo9cXFwiOiBcXFwic2l6ZSNBU0NcXFwiLFxcbiAgICAgICAgXFxcIuWkp+Wwj+WAkuW6j1xcXCI6IFxcXCJzaXplI0RFU0NcXFwiXFxuICAgIH07XFxuICAgIGxldCBwbGF5TW9kZSA9IGdldEl0ZW0oXFxcImFsaXl1bl9wbGF5TW9kZVxcXCIsIFxcXCLovaznoIFcXFwiKTtcXG4gICAgbGV0IG9yZGVyc0tleXMgPSBPYmplY3Qua2V5cyhvcmRlcnMpO1xcbiAgICBsZXQgb3JkZXJOYW1lID0gZ2V0SXRlbShcXFwiYWxpeXVuX29yZGVyXFxcIiwgb3JkZXJzS2V5c1swXSk7XFxuICAgIGxldCBvcmRlciA9IG9yZGVyc1tvcmRlck5hbWVdLnNwbGl0KFxcXCIjXFxcIik7XFxuICAgIGxldCBzdHlsZXMgPSBbXFxcInRleHRfMVxcXCIsIFxcXCJtb3ZpZV8yXFxcIiwgXFxcImNhcmRfcGljXzNcXFwiLCBcXFwiYXZhdGFyXFxcIiwgXFxcIui/veWJp1xcXCIsIFxcXCLnnIvlm75cXFwiXTtcXG4gICAgbGV0IHN0eWxlID0gZ2V0SXRlbShcXFwiYWxpeXVuX3N0eWxlXFxcIiwgc3R5bGVzWzBdKTtcXG4gICAgaWYgKE1ZX1BBR0UgPT09IDEpIHtcXG4gICAgICAgIGlmICghZ2V0TXlWYXIoXFxcIm1vdW50emltdVxcXCIsIFxcXCJcXFwiKSkge1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJtb3VudHppbXVcXFwiLCB7fSk7XFxuICAgICAgICAgICAgYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwibW91bnR6aW11XFxcIik7XFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcImFsaVNoYXJlVG9rZW5cXFwiKTtcXG4gICAgICAgICAgICAgICAgY2xlYXJWYXIoXFxcImRtX3NoYXJlXFxcIik7XFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcImRtbGlzdFxcXCIpO1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJsaXN0U2VhcmNoS2V5XFxcIik7XFxuICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgc2V0TWFya2VyKCk7XFxuICAgICAgICBpZiAocmVhbHVybCAmJiAhaXNTZWFyY2gpIHtcXG4gICAgICAgICAgICBsZXQgc2hhcmVJbmZvID0gYWxpU2hhcmVBcGkuZ2V0U2hhcmVJbmZvKCk7XFxuICAgICAgICAgICAgbGV0IGZpbGVJbmZvID0gc2hhcmVJbmZvLmZpbGVfaW5mb3MgfHwgW107XFxuICAgICAgICAgICAgaWYgKGZpbGVJbmZvLmxlbmd0aCA9PT0gMSAmJiBmaWxlSW5mb1swXS50eXBlID09PSBcXFwiZm9sZGVyXFxcIiAmJiAhZmlsZUlkKSB7XFxuICAgICAgICAgICAgICAgIGZpbGVJZCA9IGZpbGVJbmZvWzBdLmZpbGVfaWQ7XFxuICAgICAgICAgICAgICAgIHNldFBhZ2VUaXRsZShmaWxlSW5mb1swXS5maWxlX25hbWUpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHNldFBhZ2VUaXRsZShzaGFyZUluZm8uc2hhcmVfbmFtZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBkZWFkbGluZSA9IFxcXCLmsLjkuYXmnInmlYhcXFwiO1xcblxcbiAgICAgICAgICAgIGlmIChzaGFyZUluZm8uZXhwaXJhdGlvbikge1xcbiAgICAgICAgICAgICAgICBkZWFkbGluZSA9IFxcXCLmnInmlYjoh7PvvJpcXFwiICsgZm9ybWF0RGF0ZShzaGFyZUluZm8uZXhwaXJhdGlvbik7XFxuICAgICAgICAgICAgICAgIC8vc2hhcmVJbmZvLnVwZGF0ZWRfYXRcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiAoc2hhcmVJbmZvLmNyZWF0b3JfbmFtZSB8fCBzaGFyZUluZm8uY3JlYXRvcl9waG9uZSkgKyBcXFwiJm5ic3A7Jm5ic3A7XFxcIiArIGRlYWRsaW5lLnNtYWxsKCksXFxuICAgICAgICAgICAgICAgIHVybDogcmVhbHVybCArIFxcXCIjbm9IaXN0b3J5I1xcXCIsXFxuICAgICAgICAgICAgICAgIGltZzogc2hhcmVJbmZvLmF2YXRhciB8fCBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl91bmtub3duXFxcIixcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoIWlzU2VhcmNoKSB7XFxuICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5pCc57SiXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQudHJpbSgpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+i+k+WFpeWFs+mUruivjVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9hbGl5dW4jbm9IaXN0b3J5IyNmdWxsVGhlbWUjP3BhZ2U9ZnlwYWdlJnNlYXJjaEtleT1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGlucHV0KTtcXG4gICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U6IFxcXCJwdXRNeVZhcignbGlzdFNlYXJjaEtleScsaW5wdXQpXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkOiBzaGFyZVB3ZCxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlSWQ6IHNoYXJlSWQsXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVRva2VuOiBzaGFyZVRva2VuXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCcXFxcIiArIHNlYXJjaEtleSArIFxcXCLigJ3igJ3nmoTmkJzntKLnu5PmnpxcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgZnVuY0l0ZW1zID0gW107XFxuICAgICAgICBmdW5jSXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IHN0eWxlLFxcbiAgICAgICAgICAgIHVybDogJChzdHlsZXMsIDEsIFxcXCLmjpLluIPmoLflvI9cXFwiKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJhbGl5dW5fc3R5bGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LliIfmjaJcXFwiO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2FsaV9pY29uLnN2Z1xcXCJcXG4gICAgICAgIH0sIHtcXG4gICAgICAgICAgICB0aXRsZTogb3JkZXJOYW1lLFxcbiAgICAgICAgICAgIHVybDogJChvcmRlcnNLZXlzLCAyLCBcXFwi5o6S5bqP5pa55byPXFxcIikuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgc2V0SXRlbShcXFwiYWxpeXVuX29yZGVyXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5YiH5o2i5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9hbGlfc29ydC5zdmdcXFwiXFxuICAgICAgICB9LCB7XFxuICAgICAgICAgICAgdGl0bGU6IHBsYXlNb2RlLFxcbiAgICAgICAgICAgIHVybDogJChbXFxcIui9rOeggVxcXCIsIFxcXCLljp/nlLtcXFwiLCBcXFwi5YiG5Lqr5Y6f55S7XFxcIl0sIDIsIFxcXCLmkq3mlL7mqKHlvI9cXFwiKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJhbGl5dW5fcGxheU1vZGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liIfmjaLmiJDlip9cXFwiO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2FsaV9wbGF5LnN2Z1xcXCIsXFxuICAgICAgICB9KTtcXG4gICAgICAgIGlmIChwbGF5TW9kZSA9PT0gXFxcIuWOn+eUu1xcXCIpIHtcXG4gICAgICAgICAgICBmdW5jSXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBvcGVuQVBJTGlzdFtnZXRJdGVtKFxcXCJvcGVuQXBpTW9kZVxcXCIsIFxcXCIwXFxcIildLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQob3BlbkFQSUxpc3QsIDEsIFxcXCLljp/nlLtBUEko5LiN6KaB6aKR57mB5YiH5o2iKVxcXCIpLnNlbGVjdCgob3BlbkFQSUxpc3QpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcIm9wZW5BcGlNb2RlXFxcIiwgU3RyaW5nKG9wZW5BUElMaXN0LmluZGV4T2YoaW5wdXQpKSk7XFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVGaWxlKCQucmVxdWlyZShcXFwidG9rZW5QYXRoXFxcIikub3BlblRva2Vuc0ZpbGVwYXRoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LliIfmjaLkuLpcXFwiICsgaW5wdXQ7XFxuICAgICAgICAgICAgICAgIH0sIG9wZW5BUElMaXN0KSxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvYWxpX2FwaS5zdmdcXFwiLFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKCFpc1NlYXJjaCkge1xcbiAgICAgICAgICAgIGZ1bmNJdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLlip/og71cXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoW1xcXCLovazlrZjkupHnm5hcXFwiLCBcXFwi55m76ZmG6LSm5Y+3XFxcIiwgXFxcIuWkjeWItuWIhuS6q+mTvuaOpVxcXCIsIFxcXCLmn6XnnIvmiYvliqjmjILovb3lrZfluZVcXFwiLCBcXFwi6I635Y+W5by55bmV5pCc57Si6KeE5YiZXFxcIiwgXFxcIuaJuemHj+aMgui9veacrOWcsOW8ueW5lVxcXCIsIFxcXCLmjqjpgIHliLBUVkJveFxcXCIsIFxcXCLorr7nva7mlLbol4/lsIHpnaJcXFwiLCBcXFwi6I635Y+W5oqV5bGPSVBcXFwiXSwgMiwgXFxcIuabtOWkmuWKn+iDvVxcXCIpLnNlbGVjdCgoc2hhcmVJZCwgc2hhcmVQd2QsIGZpbGVJZCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpbnB1dCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIui9rOWtmOS6keebmFxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgc21hcnRkcml2ZTovL3NoYXJlL2Jyb3dzZT9zaGFyZUlkPSR7c2hhcmVJZH0mc2hhcmVQd2Q9JHtzaGFyZVB3ZHx8XFxcIlxcXCJ9YDtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCLnmbvpmYbotKblj7dcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIuWkjeWItuWIhuS6q+mTvuaOpVxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFtcXFwi5aSN5Yi26ZO+5o6lXFxcIiwgXFxcIuWkjeWItua1t+mYlOWPo+S7pFxcXCJdLCAxLCBcXFwi5YiG5Lqr5pa55byPXFxcIikuc2VsZWN0KCh1cmwpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gXFxcIuWkjeWItumTvuaOpVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgdXJsO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly/pmL/ph4zkupHnm5jliIbkuqvlj6Pku6TjgIxcXFwiICsgZ2V0UGFnZVRpdGxlKCkgKyBcXFwi44CNXFxcXG5cXFwiICsgdXJsICsgXFxcIiBAaW1wb3J0PWpzOmBoaWtlcjovL3BhZ2UvYWxpeXVuP3JlYWx1cmw9JHtpbnB1dC50cmltKCl9JnJ1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiYDtcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvXFxcIiArIHNoYXJlSWQgKyAoZmlsZUlkID8gXFxcIi9mb2xkZXIvXFxcIiArIGZpbGVJZCA6IFxcXCJcXFwiKSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwi5om56YeP5oyC6L295pys5Zyw5by55bmVXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvZG1Nb3VudCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIuafpeeci+aJi+WKqOaMgui9veWtl+W5lVxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6bSA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJtb3VudHppbXVcXFwiLCB7fSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXAgPSB6bS5uYW1lID8gXFxcIuW9k+WJjeWtl+W5leaWh+S7tlxcXFxuXFxcIiArIHptLm5hbWUgKyBcXFwiLlxcXCIgKyB6bS5leHQgOiBcXFwi6L+Y5pyq5omL5Yqo5oyC6L295a2X5bmVXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+aJi+WKqOaMgui9veWtl+W5lScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB0aXAgKyBcXFwiXFxcXG4o54K55Ye75Y+W5raI5Y+v5Lul5riF6Zmk5oyC6L295a2X5bmVKVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWw6ICgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJtb3VudHppbXVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5riF6Zmk5omL5Yqo5oyC6L295a2X5bmVXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCLojrflj5blvLnluZXmkJzntKLop4TliJlcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJqc1xcXCI6IEpTT04uc3RyaW5naWZ5KFxcXCJoaWtlcjovL3BhZ2UvbG9hZERtP3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiJnRpdGxlPVxcXCIpICsgXFxcIitlbmNvZGVVUklDb21wb25lbnQocGxheWRhdGEudGl0bGUuc3BsaXQoJy0nKVswXSk7XFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogTVlfUlVMRS50aXRsZSArIFxcXCLlvLnluZXmkJzntKJcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwicnVsZTovL1xcXCIgKyBiYXNlNjRFbmNvZGUoXFxcIu+/pXByb2plY3Rpb25fc2NyZWVu77+lXFxcIiArIEpTT04uc3RyaW5naWZ5KHJ1bGUpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCLmjqjpgIHliLBUVkJveFxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3R2Ym94UHVzaCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIuiuvue9ruaUtuiXj+WwgemdolxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFtcXFwi6K6+572u5bCB6Z2i5Zyw5Z2AXFxcIiwgXFxcIuaQnOe0ouWwgemdolxcXCJdLCAxKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi6K6+572u5bCB6Z2i5Zyw5Z2AXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCJcXFwiLCBcXFwi6K+36L6T5YWl5Zu+54mH5Zyw5Z2AXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0LnRyaW0oKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+i+k+WFpeWcsOWdgFxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhZ2VQaWNVcmwoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvZnJvbnRDb3ZlciNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCLojrflj5bmipXlsY9JUFxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpcCA9ICQucmVxdWlyZShcXFwiYWxpVXRpbFxcXCIpLmdldElQdjRBZGRyZXNzKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcC5zdGFydHNXaXRoKFxcXCIxOTIuMTY4LlxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChpcCArIFxcXCJcXFxcbuivpUlQ6YCC55So5LqO5rWB6YePK+eDreeCueeahOaKleWxj1xcXFxu6K+35pu/5o2i6ZO+5o6l5Lit55qEMC4wLjAuMFxcXCIpLmNvbmZpcm0oKGlwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIGlwO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaXApO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QoXFxcIuiOt+WPluWksei0pemdnueos+WumklQLOivt+W8gOWQr+eDreeCueWGjeS9v+eUqFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0sIHNoYXJlSWQsIHNoYXJlUHdkLCBmaWxlSWQpLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9hbGlfZmlsZWludG8uc3ZnXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VJZDogcGFnZUlkLFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBmaWxlSWQsXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZUlkOiBzaGFyZUlkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVUb2tlbjogc2hhcmVUb2tlbixcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkOiBzaGFyZVB3ZCxcXG4gICAgICAgICAgICAgICAgICAgIGZvbGRlck5hbWU6IGdldFBhZ2VUaXRsZSgpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBmdW5TdHlsZSA9IFtcXFwiXFxcIiwgXFxcIlxcXCIsIFxcXCJcXFwiLCBcXFwiaWNvbl9zbWFsbF8zXFxcIiwgXFxcImljb25fcm91bmRfc21hbGxfNFxcXCIsIFxcXCJpY29uXzVcXFwiXVtmdW5jSXRlbXMubGVuZ3RoXTtcXG4gICAgICAgIGl0ZW1zLnB1c2guYXBwbHkoaXRlbXMsIGZ1bmNJdGVtcy5tYXAodiA9PiAodi5jb2xfdHlwZSA9IGZ1blN0eWxlKSAmJiB2KSk7XFxuICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBsZXQgcmVzY29kID0ge307XFxuICAgIGxldCBtYXJrZXIgPSBNWV9QQVJBTVMubWFya2VyO1xcbiAgICBpZiAoaXNTZWFyY2gpIHtcXG4gICAgICAgIHJlc2NvZCA9IGFsaVNoYXJlQXBpLmdldFNlYXJjaExpc3RGaWxlKHNlYXJjaEtleSwgbWFya2VyLCBvcmRlclswXSwgb3JkZXJbMV0pO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmVzY29kID0gYWxpU2hhcmVBcGkuZ2V0TGlzdEZpbGUoZmlsZUlkLCBtYXJrZXIsIG9yZGVyWzBdLCBvcmRlclsxXSk7XFxuICAgIH1cXG4gICAgaWYgKHJlc2NvZC5uZXh0X21hcmtlcikge1xcbiAgICAgICAgc2V0TWFya2VyKHJlc2NvZC5uZXh0X21hcmtlcik7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBzZXRNYXJrZXIoKTtcXG4gICAgfVxcblxcbiAgICB2YXIgY29udHMgPSByZXNjb2QuaXRlbXM7XFxuICAgIC8v5a2X5bmV5Yy56YWN5YeG5aSHXFxuICAgIGxldCBzdWJFeHRzID0gW1xcXCJ2dHRcXFwiLCBcXFwic3J0XFxcIiwgXFxcImFzc1xcXCJdO1xcbiAgICB2YXIgemltdWxpc3QgPSBbXTtcXG4gICAgY29udHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgaWYgKHN1YkV4dHMuaW5jbHVkZXMoaXRlbS5maWxlX2V4dGVuc2lvbiAmJiBpdGVtLmZpbGVfZXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCkpKSB7XFxuICAgICAgICAgICAgbGV0IG5hbWUgPSBpdGVtLm5hbWUucmVwbGFjZSgnLicgKyBpdGVtLmZpbGVfZXh0ZW5zaW9uLCAnJyk7XFxuICAgICAgICAgICAgemltdWxpc3QucHVzaCh7XFxuICAgICAgICAgICAgICAgIGV4dDogaXRlbS5maWxlX2V4dGVuc2lvbixcXG4gICAgICAgICAgICAgICAgZmlsZV9pZDogaXRlbS5maWxlX2lkLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBuYW1lXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICAvL+WkhOeQhuWkuOmhteWMuemFjeWtl+W5lVxcbiAgICAvKlxcbiAgICBsZXQgaGFzU3ViID0gemltdWxpc3QubGVuZ3RoID4gMDtcXG4gICAgaWYgKGhhc1N1YiYmcmVzY29kLm5leHRfbWFya2VyKSB7XFxuICAgICAgICBpZiAoemltdWxpc3QubGVuZ3RoID4gNCkge1xcbiAgICAgICAgICAgIHNldFN1YnRpdGxlQ2FjaGUoemltdWxpc3Quc2xpY2UoLTQpKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgc2V0U3VidGl0bGVDYWNoZSh6aW11bGlzdCk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgbGV0IGxhc3RJdGVtID0gY29udHMuYXQoLTEpO1xcbiAgICBpZiAoaGFzU3ViJiZsYXN0SXRlbSYmbGFzdEl0ZW0uY2F0ZWdvcnkgPT09IFxcXCJ2aWRlb1xcXCIpIHtcXG4gICAgICAgIHNldFZpZGVvSXRlbUNhY2hlKGNvbnRzLnNwbGljZShjb250cy5sZW5ndGgtMSwxKSk7XFxuICAgIH1cXG4gICAgaWYgKE1ZX1BBR0UgPiAxKSB7XFxuICAgICAgICBsZXQgc3VidGl0bGVDYWNoZSA9IE1ZX1BBUkFNUy5zdWJ0aXRsZUNhY2hlIHx8IFtdO1xcbiAgICAgICAgemltdWxpc3QgPSB6aW11bGlzdC5jb25jYXQoc3VidGl0bGVDYWNoZSk7XFxuICAgICAgICBsZXQgdmlkZW9JdGVtQ2FjaGUgPSBNWV9QQVJBTVMudmlkZW9JdGVtQ2FjaGUgfHwgW107XFxuICAgICAgICBjb250cyA9IHZpZGVvSXRlbUNhY2hlLmNvbmNhdChjb250cyk7XFxuICAgICAgICBzZXRTdWJ0aXRsZUNhY2hlKCk7XFxuICAgICAgICBzZXRWaWRlb0l0ZW1DYWNoZSgpO1xcbiAgICB9Ki9cXG4gICAgLy/nroDkvZPkvJjlhYhcXG4gICAgemltdWxpc3Quc29ydCgoYSwgYikgPT4gKGIubmFtZS5lbmRzV2l0aChcXFwiLnNjXFxcIikgfHwgYi5uYW1lLmVuZHNXaXRoKFxcXCIuY2hzXFxcIikpIC0gKGEubmFtZS5lbmRzV2l0aChcXFwiLnNjXFxcIikgfHwgYS5uYW1lLmVuZHNXaXRoKFxcXCIuY2hzXFxcIikpKTtcXG4gICAgLy9lbmRcXG4gICAgbGV0IHRpdGxlSGVhZCA9IHtcXG4gICAgICAgIHZpZGVvOiBcXFwi8J+OrFxcXCIsXFxuICAgICAgICBhdWRpbzogXFxcIvCfjrVcXFwiLFxcbiAgICAgICAgZG9jOiBcXFwi8J+TkVxcXCIsXFxuICAgICAgICBpbWFnZTogXFxcIvCflrxcXFwiLFxcbiAgICAgICAgemlwOiBcXFwi8J+TplxcXCIsXFxuICAgICAgICBmb2xkZXI6IFxcXCLwn5OCXFxcIlxcbiAgICB9O1xcblxcbiAgICBmdW5jdGlvbiBnZXRIZWFkKHR5cGUsIGV4dCkge1xcbiAgICAgICAgbGV0IGhlYWQgPSB0aXRsZUhlYWRbdHlwZV07XFxuICAgICAgICBpZiAoc3ViRXh0cy5pbmNsdWRlcyhleHQpKSB7XFxuICAgICAgICAgICAgaGVhZCA9IFxcXCLwn5W4XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBoZWFkIHx8IFxcXCLinZNcXFwiO1xcbiAgICB9XFxuXFxuICAgIGZ1bmN0aW9uIGdldFByZXZpZXdQaWMoZmlsZUl0ZW0pIHtcXG4gICAgICAgIGlmIChmaWxlSXRlbS50aHVtYm5haWwpIHtcXG4gICAgICAgICAgICByZXR1cm4gJChcXFwiaHR0cHM6Ly9lbXB0eT9cXFwiICsgZmlsZUl0ZW0uZmlsZV9pZCkuaW1hZ2UoKHBpYykgPT4ge1xcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoKHBpYywge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtOiB0cnVlXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9LCBmaWxlSXRlbS50aHVtYm5haWwpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGxldCBmb2xkZXJTdHlsZSwgZmlsZVN0eWxlO1xcbiAgICBsZXQgZmlsdGVyVHlwZSA9IFtdO1xcbiAgICBpZiAoc3R5bGUgPT09IFxcXCLov73liadcXFwiKSB7XFxuICAgICAgICBmb2xkZXJTdHlsZSA9IFxcXCJhdmF0YXJcXFwiO1xcbiAgICAgICAgZmlsZVN0eWxlID0gXFxcIm1vdmllXzJcXFwiO1xcbiAgICAgICAgZmlsdGVyVHlwZS5wdXNoKFxcXCJ2aWRlb1xcXCIpO1xcbiAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIui/veWJp+aooeW8j+WPquaYvuekuuaWh+S7tuWkueWSjOinhumikVxcXCIuc21hbGwoKS5mb250Y29sb3IoXFxcImdyZXlcXFwiKSxcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9IGVsc2UgaWYgKHN0eWxlID09PSBcXFwi55yL5Zu+XFxcIikge1xcbiAgICAgICAgZm9sZGVyU3R5bGUgPSBcXFwiYXZhdGFyXFxcIjtcXG4gICAgICAgIGZpbGVTdHlsZSA9IFxcXCJjYXJkX3BpY18zXFxcIjtcXG4gICAgICAgIGZpbHRlclR5cGUucHVzaChcXFwiaW1hZ2VcXFwiKTtcXG4gICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLnnIvlm77mqKHlvI/lj6rmmL7npLrmlofku7blpLnlkozlm77niYdcXFwiLnNtYWxsKCkuZm9udGNvbG9yKFxcXCJncmV5XFxcIiksXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGZvbGRlclN0eWxlID0gZmlsZVN0eWxlID0gc3R5bGU7XFxuICAgIH1cXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250cy5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgbGV0IGZpbGVJdGVtID0gY29udHNbaV07XFxuICAgICAgICBsZXQgY2F0ZSA9IGZpbGVJdGVtLmNhdGVnb3J5O1xcbiAgICAgICAgbGV0IGRlc2MgPSBmb3JtYXREYXRlKGZpbGVJdGVtLnVwZGF0ZWRfYXQpO1xcbiAgICAgICAgbGV0IHBpY191cmwgPSBnZXRJY29uKGZpbGVJdGVtLmZpbGVfZXh0ZW5zaW9uLCBmaWxlSXRlbS50eXBlKTtcXG5cXG4gICAgICAgIGlmIChmaWxlSXRlbS50eXBlID09PSBcXFwiZm9sZGVyXFxcIikge1xcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IChmb2xkZXJTdHlsZSA9PT0gXFxcInRleHRfMVxcXCIgPyB0aXRsZUhlYWQuZm9sZGVyIDogXFxcIlxcXCIpICsgZmlsZUl0ZW0ubmFtZTtcXG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICB1cmw6ICdoaWtlcjovL3BhZ2UvYWxpeXVuP3BhZ2U9ZnlwYWdlJyxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IGZvbGRlclN0eWxlLFxcbiAgICAgICAgICAgICAgICBkZXNjOiBmb3JtYXREYXRlKGZpbGVJdGVtLnVwZGF0ZWRfYXQpLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBwaWNfdXJsLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVJZDogc2hhcmVJZCxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlVG9rZW46IE1ZX1BBUkFNUy5zaGFyZVRva2VuLFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBmaWxlSXRlbS5maWxlX2lkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkLFxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBmaWxlSXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgbm9QaWM6IHRydWVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBpZiAoZmlsdGVyVHlwZS5sZW5ndGggPiAwICYmICFmaWx0ZXJUeXBlLmluY2x1ZGVzKGNhdGUpKSB7XFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgc3VidGl0bGUsIGxvbmdjLCBjbHM7XFxuICAgICAgICAgICAgbGV0IHRpdGxlID0gZmlsZUl0ZW0ubmFtZTtcXG4gICAgICAgICAgICBsZXQgbmFtZU5vdEV4dCA9IGZpbGVJdGVtLm5hbWUucmVwbGFjZSgnLicgKyBmaWxlSXRlbS5maWxlX2V4dGVuc2lvbiwgJycpO1xcbiAgICAgICAgICAgIGlmIChzdWJFeHRzLmluY2x1ZGVzKGZpbGVJdGVtLmZpbGVfZXh0ZW5zaW9uKSkge1xcbiAgICAgICAgICAgICAgICBsb25nYyA9IFt7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuaMgui9veWtl+W5lVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoem0pID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcignbW91bnR6aW11Jywgem0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/mjILovb3lrozmiJDvvIzlvZPliY3lrZfluZXmlofku7Y6ICcgKyB6bS5uYW1lICsgJy4nICsgem0uZXh0O1xcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dDogZmlsZUl0ZW0uZmlsZV9leHRlbnNpb24sXFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9pZDogZmlsZUl0ZW0uZmlsZV9pZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lTm90RXh0XFxuICAgICAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgfV07XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChjYXRlID09PSBcXFwidmlkZW9cXFwiKSB7XFxuICAgICAgICAgICAgICAgIGlmICh6aW11bGlzdC5sZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gemltdWxpc3QuZmluZCh2ID0+IHYubmFtZS5pbmNsdWRlcyhuYW1lTm90RXh0KSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgY2xzID0gXFxcInBsYXlsaXN0IHZcXFwiICsgcGFnZUlkO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoZmlsZVN0eWxlID09PSBcXFwidGV4dF8xXFxcIikge1xcbiAgICAgICAgICAgICAgICBkZXNjICs9IFxcXCJcXFxcdFxcXFx0XFxcIiArIGZvcm1hdFNpemUoZmlsZUl0ZW0uc2l6ZSk7XFxuICAgICAgICAgICAgICAgIHRpdGxlID0gZ2V0SGVhZChjYXRlLCBmaWxlSXRlbS5maWxlX2V4dGVuc2lvbikgKyB0aXRsZTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFtcXFwidmlkZW9cXFwiLCBcXFwiaW1hZ2VcXFwiXS5pbmNsdWRlcyhjYXRlKSkge1xcbiAgICAgICAgICAgICAgICBwaWNfdXJsID0gZ2V0UHJldmlld1BpYyhmaWxlSXRlbSkgfHwgcGljX3VybDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9QcmUjXFxcIikubGF6eVJ1bGUoKHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCBmaWxlSWQsIGNhdGUsIHN1YnRpdGxlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvYWxpbGF6eVxcXCIpKHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCBmaWxlSWQsIGNhdGUsIHN1YnRpdGxlKTtcXG4gICAgICAgICAgICAgICAgfSwgc2hhcmVJZCwgc2hhcmVQd2QsIE1ZX1BBUkFNUy5zaGFyZVRva2VuLCBmaWxlSXRlbS5maWxlX2lkLCBjYXRlLCBzdWJ0aXRsZSksXFxuICAgICAgICAgICAgICAgIGRlc2M6IGRlc2MsXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IHBpY191cmwsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogZmlsZUl0ZW0uZmlsZV9pZCxcXG4gICAgICAgICAgICAgICAgICAgIGxvbmdDbGljazogbG9uZ2MsXFxuICAgICAgICAgICAgICAgICAgICBjbHM6IGNscyxcXG4gICAgICAgICAgICAgICAgICAgIC8vaW5oZXJpdFRpdGxlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogZmlsZUl0ZW0ubmFtZVxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogZmlsZVN0eWxlXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaWYgKGNvbnRzLmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwifn5+5LuA5LmI6YO95rKh5pyJ5LqG5ZOmfn5+XFxcIi5mb250Y29sb3IoXFxcIkdyYXlcXFwiKSxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxuXFxubGV0IGl0ZW1zID0gW107XFxudHJ5IHtcXG4gICAgaWYgKE1ZX1BBR0UgPiAxICYmICFNWV9QQVJBTVMubWFya2VyKSB7XFxuICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCJ+fn7ku4DkuYjpg73msqHmnInkuoblk6Z+fn5cXFwiLmZvbnRjb2xvcihcXFwiR3JheVxcXCIpLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGxvYWQoaXRlbXMpO1xcbiAgICB9XFxufSBjYXRjaCAoZSkge1xcbiAgICBpZiAoZS5uYW1lID09PSBcXFwiQWxpRXJyb3JcXFwiKSB7XFxuICAgICAgICBpZiAoZS5jb2RlID09PSBcXFwiSW52YWxpZFJlc291cmNlLlNoYXJlUHdkXFxcIikge1xcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuivt+i+k+WFpeaPkOWPlueggVxcXCIsXFxuICAgICAgICAgICAgICAgIGRlc2M6IHNoYXJlUHdkID8gXFxcIuKAnOKAnOaPkOWPlueggemUmeivr+KAneKAnVxcXCIgOiBcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkKCkuaW5wdXQoKE1ZX1BBUkFNUykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgc2V0UGFnZVBhcmFtcyhPYmplY3QuYXNzaWduKHt9LCBNWV9QQVJBTVMsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogaW5wdXRcXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIH0sIE1ZX1BBUkFNUyksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaWYgKGUuc2lnbmlmaWNhbmNlID09PSAxKSB7XFxuICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgZS5tZXNzYWdlLmJpZygpLmJpZygpLmZvbnRjb2xvcihcXFwicmVkXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5zaWduaWZpY2FuY2UgPT09IDMpIHtcXG4gICAgICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBlLm1lc3NhZ2UuYmlnKCkuZm9udGNvbG9yKFxcXCJncmVlblxcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG5cXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGxvZyhcXFwi5YiX6KGo5Yqg6L295aSx6LSlI1xcXFxu6ZSZ6K+v5L+h5oGvPlxcXCIgKyBlLnRvU3RyaW5nKCkgKyBcXFwiXFxcXG7plJnor6/ooYw+XFxcIiArIGUubGluZU51bWJlcik7XFxuICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+asp+asp++8jOaKpemUmeS6huOAguWcqOWIt+aWsOWHoOasoe+8n+aIluiAheabtOaNouaWh+S7tuWkueOAgicsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgZGVzYzogZS50b1N0cmluZygpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG4gICAgICAgIH0pO1xcbiAgICAgICAgLy90aHJvdyBlO1xcbiAgICB9XFxufVxcbnNhdmVNeVBhQ2FjaGUoKTtcXG5zZXRSZXN1bHQoaXRlbXMpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi55m75b2V6LSm5Y+3XCIsXCJwYXRoXCI6XCJsb2dpblwiLFwicnVsZVwiOlwianM6XFxudmFyIGQgPSBbXTtcXG5zZXRQYWdlVGl0bGUoXFxcIueZu+W9lemYv+mHjOS6keebmFxcXCIpO1xcbmxldCBpbmRleCA9IE51bWJlcihnZXRQYXJhbShcXFwiaW5kZXhcXFwiLCBcXFwiMVxcXCIpKTtcXG5pZiAoTnVtYmVyLmlzTmFOKGluZGV4KSkge1xcbiAgICBpbmRleCA9IDE7XFxufVxcblxcblxcbmZ1bmN0aW9uIGdldFFSQ29kZSgpIHtcXG4gICAgbGV0IGpzb24gPSBmZXRjaChcXFwiaHR0cHM6Ly9wYXNzcG9ydC5hbGl5dW5kcml2ZS5jb20vbmV3bG9naW4vcXJjb2RlL2dlbmVyYXRlLmRvP2FwcE5hbWU9YWxpeXVuX2RyaXZlJmZyb21TaXRlPTUyJmFwcE5hbWU9YWxpeXVuX2RyaXZlJmFwcEVudHJhbmNlPXdlYiZpc01vYmlsZT1mYWxzZSZsYW5nPXpoX0NOJnJldHVyblVybD0mYml6UGFyYW1zPSZfYngtdj0yLjIuM1xcXCIpO1xcbiAgICBsZXQgcXIgPSBKU09OLnBhcnNlKGpzb24pO1xcbiAgICBpZiAoIW9wZW5BcHBJbnRlbnQoJ2NvbS5hbGljbG91ZC5kYXRhYm94JywgJ2NvbS50YW9iYW8ubG9naW40YW5kcm9pZC5zY2FuLlFyU2NhbkFjdGl2aXR5Jywge1xcbiAgICAgICAgICAgIFxcXCJrZXlfc2NhblBhcmFtXFxcIjoganNvblxcbiAgICAgICAgfSkpIHtcXG4gICAgICAgIGNyZWF0ZVFSQ29kZShxci5jb250ZW50LmRhdGEuY29kZUNvbnRlbnQsIGZhbHNlKTtcXG4gICAgfVxcbiAgICByZXR1cm4gcXI7XFxufVxcblxcbmZ1bmN0aW9uIGJhY2tIb21lKHQsIGkpIHtcXG4gICAgYmFjayhpKTtcXG4gICAgdG9hc3QodCk7XFxufVxcblxcbmZ1bmN0aW9uIGZyb21BcHBHZXRUb2tlbihxcikge1xcbiAgICBsZXQgcXIgPSBnZXRRUkNvZGUoKTtcXG4gICAgaWYgKCFxcikgcmV0dXJuIGJhY2tIb21lKFxcXCLojrflj5blpLHotKVcXFwiKTtcXG4gICAgbGV0IGNrayA9IHFyLmNvbnRlbnQuZGF0YTtcXG4gICAgbGV0IGJvZHkgPSB7XFxuICAgICAgICBjazogY2trLmNrLFxcbiAgICAgICAgdDogY2trLnQgKyBcXFwiXFxcIixcXG4gICAgICAgIGFwcE5hbWU6IFxcXCJhbGl5dW5fZHJpdmVcXFwiLFxcbiAgICAgICAgYXBwRW50cmFuY2U6IFxcXCJ3ZWJcXFwiLFxcbiAgICAgICAgaXNNb2JpbGU6IGZhbHNlLFxcbiAgICAgICAgbGFuZzogXFxcInpoX0NOXFxcIixcXG4gICAgICAgIG5hdlBsYXRmb3JtOiBcXFwiTWFjSW50ZWxcXFwiLFxcbiAgICAgICAgcmV0dXJuVXJsOiBcXFwiXFxcIixcXG4gICAgICAgIG5hdmxhbmd1YWdlOiBcXFwiemgtQ05cXFwiLFxcbiAgICAgICAgZnJvbVNpdGU6IDUyLFxcbiAgICAgICAgYml6UGFyYW1zOiBcXFwiXFxcIlxcblxcbiAgICB9O1xcbiAgICAvKlxcbiAgICAge1xcbiAgICAgICAgTkVXOiBcXFwi5b6F5omr5o+PXFxcIixcXG4gICAgICAgIENBTkNFTEVEOiBcXFwi5Y+W5raIXFxcIixcXG4gICAgICAgIFNDQU5FRDpcXFwi5bey5omr5o+PXFxcIixcXG4gICAgICAgIENBTkNFTEVEOiBcXFwi5a6M5oiQXFxcIlxcbiAgICB9Ki9cXG4gICAgbGV0IGVycm9yQ291bnQgPSAwO1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMwOyBpKyspIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UocG9zdChcXFwiaHR0cHM6Ly9wYXNzcG9ydC5hbGl5dW5kcml2ZS5jb20vbmV3bG9naW4vcXJjb2RlL3F1ZXJ5LmRvP2FwcE5hbWU9YWxpeXVuX2RyaXZlJmZyb21TaXRlPTUyJl9ieC12PTIuMi4zXFxcIiwge1xcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5XFxuICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgIGxldCBxckNvZGVTdGF0dXMgPSByZXN1bHQuY29udGVudC5kYXRhLnFyQ29kZVN0YXR1cztcXG5cXG4gICAgICAgICAgICBpZiAocXJDb2RlU3RhdHVzID09PSBcXFwiQ09ORklSTUVEXFxcIikge1xcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNvbnRlbnQuZGF0YS5iaXpFeHQpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmZvID0gSlNPTi5wYXJzZShiYXNlNjREZWNvZGUocmVzdWx0LmNvbnRlbnQuZGF0YS5iaXpFeHQpKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBhbGlUb2tlbnNGaWxlcGF0aCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3Rva2VuUGF0aFxcXCIpLmFsaVRva2Vuc0ZpbGVwYXRoO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaVRva2VuID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IGluZm8ucGRzX2xvZ2luX3Jlc3VsdC5yZWZyZXNoVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGUoYWxpVG9rZW5zRmlsZXBhdGgsIEpTT04uc3RyaW5naWZ5KGFsaVRva2VuKSk7XFxuICAgICAgICAgICAgICAgICAgICBhZGRJdGVtQWZ0ZXIoXFxcImxvZ2lueVxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIueZu+W9leaIkOWKnyjngrnlh7vov5Tlm54pXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICBiYWNrSG9tZShcXFwi55m75b2V5oiQ5YqfXFxcIiwgdHJ1ZSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBiYWNrSG9tZShcXFwi55m75b2V5aSx6LSlLOivt+WwneivleWFtuS7lueahOaWueazlVxcXCIpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHFyQ29kZVN0YXR1cyA9PT0gXFxcIkNBTkNFTEVEXFxcIikge1xcbiAgICAgICAgICAgICAgICBiYWNrSG9tZShcXFwi5Y+W5raI55m75b2V5o6I5p2DXFxcIik7XFxuICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKFtcXFwiTkVXXFxcIiwgXFxcIlNDQU5FRFxcXCJdLmluY2x1ZGVzKHFyQ29kZVN0YXR1cykpIHtcXG4gICAgICAgICAgICAgICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCgyNTAwKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBiYWNrSG9tZShcXFwi6LaF5pe2XFxcIik7XFxuICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgZXJyb3JDb3VudCsrO1xcbiAgICAgICAgICAgIGlmIChlcnJvckNvdW50ID4gNCkge1xcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcblxcbn1cXG5pZiAoaW5kZXggPiAtMSkge1xcbiAgICBsZXQgbG9naW5VcmxzID0gW1xcXCJodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vc2lnblxcXCIsIFxcXCJodHRwczovL2F1dGguYWxpeXVuZHJpdmUuY29tL3YyL29hdXRoL2F1dGhvcml6ZT9sb2dpbl90eXBlPWN1c3RvbSZyZXNwb25zZV90eXBlPWNvZGUmcmVkaXJlY3RfdXJpPWh0dHBzJTNBJTJGJTJGd3d3LmFsaXl1bmRyaXZlLmNvbSUyRnNpZ24lMkZjYWxsYmFjayZjbGllbnRfaWQ9MjVkelgzdmJZcWt0Vnh5WCZzdGF0ZT0lN0IlMjJvcmlnaW4lMjIlM0ElMjIqJTIyJTdEIy9sb2dpblxcXCJdO1xcbiAgICBsZXQgdXJsID0gbG9naW5VcmxzW2luZGV4XTtcXG4gICAgbGV0IGlzUmVmcmVzaCA9ICFnZXRQYXJhbShcXFwibm9SZWZyZXNoXFxcIik7XFxuICAgIGxldCBhbGlUb2tlbnNGaWxlcGF0aCA9ICQucmVxdWlyZShcXFwidG9rZW5QYXRoXFxcIikuYWxpVG9rZW5zRmlsZXBhdGg7XFxuXFxuICAgIHZhciBqcyA9ICQudG9TdHJpbmcoKGlzUmVmcmVzaCwgYWxpVG9rZW5zRmlsZXBhdGgpID0+IHtcXG4gICAgICAgIHNldEludGVydmFsKCgpID0+IHtcXG4gICAgICAgICAgICB2YXIgdG9rZW4gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2tlbicpKTtcXG4gICAgICAgICAgICBpZiAodG9rZW4gJiYgdG9rZW4udXNlcl9pZCkge1xcbiAgICAgICAgICAgICAgICBsZXQgdG9rZW5fdXJsID0gYWxpVG9rZW5zRmlsZXBhdGg7XFxuICAgICAgICAgICAgICAgIGZ5X2JyaWRnZV9hcHAud3JpdGVGaWxlKHRva2VuX3VybCwgSlNPTi5zdHJpbmdpZnkodG9rZW4pKTtcXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XFxuICAgICAgICAgICAgICAgIGZ5X2JyaWRnZV9hcHAuYmFjayhpc1JlZnJlc2gpO1xcbiAgICAgICAgICAgICAgICBmeV9icmlkZ2VfYXBwLnRvYXN0KCdUT0tFTuiOt+WPluaIkOWKn++8jOivt+WLv+azhOa8j+S4quS6uumakOenge+8ge+8ge+8gScpO1xcbiAgICAgICAgICAgICAgICByZXR1cm47XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgMzAwKTtcXG4gICAgfSwgaXNSZWZyZXNoLCBhbGlUb2tlbnNGaWxlcGF0aCk7XFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB1cmw6IHVybCxcXG4gICAgICAgIGNvbF90eXBlOiAneDVfd2Vidmlld19zaW5nbGUnLFxcbiAgICAgICAgZGVzYzogJzEwMCUmJmZsb2F0JyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgY2FuQmFjazogZmFsc2UsXFxuICAgICAgICAgICAganM6IGpzLFxcbiAgICAgICAgICAgIHVybEludGVyY2VwdG9yOiAkLnRvU3RyaW5nKCgpID0+IHRydWUpXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBzZXRSZXN1bHQoZCk7XFxufSBlbHNlIHtcXG4gICAgXFxuICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIuetieW+heaOiOadgy4uLlxcXCIuYmlnKCkuYmlnKCksXFxuICAgICAgICBkZXNjOiBcXFwi5aaC5p6c5Y2H57qn5LqG5a6Y5pa5QXBw77yM5peg5rOV6Ieq5Yqo6LCD6LW35o6I5p2D77yM6K+35omr56CB55m75b2VXFxcIixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogXFxcImxvZ2lueVxcXCIsXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBzZXRSZXN1bHQoZCk7XFxuICAgIHRyeSB7XFxuICAgICAgICBmcm9tQXBwR2V0VG9rZW4oKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgYmFja0hvbWUoXFxcIuWGhemDqOmUmeivrzpcXFwiICsgZS50b1N0cmluZygpKTtcXG4gICAgfVxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIumYv+mHjOWIl+ihqEFQSVwiLFwicGF0aFwiOlwiQWxpQXBpXCIsXCJydWxlXCI6XCJqczpcXG4vL0BhdXRob3IgTG95RGdJa1xcbmZ1bmN0aW9uIEFsaUVycm9yKGVycm9yQ29kZSwgbWVzc2FnZSwgc2lnbmlmaWNhbmNlKSB7XFxuICAgIGxldCBlcnJvclR5cGUgPSBBbGlFcnJvci5lcnJvckNvZGVNYXAuZ2V0KGVycm9yQ29kZSkgfHwgW107XFxuICAgIHRoaXMuY29kZSA9IGVycm9yQ29kZTtcXG4gICAgdGhpcy5tZXNzYWdlID0gZXJyb3JUeXBlWzBdIHx8IG1lc3NhZ2UgfHwgXFxcIlxcXCI7XFxuICAgIHRoaXMubmFtZSA9IFxcXCJBbGlFcnJvclxcXCI7XFxuICAgIHRoaXMuc2lnbmlmaWNhbmNlID0gZXJyb3JUeXBlWzFdIHx8IHNpZ25pZmljYW5jZSB8fCAxO1xcbn1cXG5BbGlFcnJvci5lcnJvckNvZGVNYXAgPSBuZXcgTWFwKFtcXG4gICAgW1xcXCJTaGFyZUxpbmsuQ2FuY2VsbGVkXFxcIiwgW1xcXCLliIbkuqvpk77mjqXlt7LlpLHmlYhcXFwiXV0sXFxuICAgIFtcXFwiU2hhcmVMaW5rLkZvcmJpZGRlblxcXCIsIFtcXFwi6L+d6KeE6LWE5rqQ5bey6KKr5bCB56aBXFxcIl1dLFxcbiAgICBbXFxcIk5vdEZvdW5kLlNoYXJlTGlua1xcXCIsIFtcXFwi5LiN5a2Y5Zyo6K+l6ZO+5o6l6K+35qC45a+5XFxcIl1dLFxcbiAgICBbXFxcIkFjY2Vzc1Rva2VuSW52YWxpZFxcXCIsIFtcXFwi6K6/6Zeu5Luk54mM5aSx5pWI77yM6K+36YeN5paw55m76ZmGXFxcIl1dLFxcbiAgICBbXFxcIlNoYXJlTGlua1Rva2VuSW52YWxpZFxcXCIsIFtcXFwi5YiG5Lqr5Luk54mM5aSx5pWIXFxcIl1dLFxcbiAgICBbXFxcIlBhcmFtRmxvd0V4Y2VwdGlvblxcXCIsIFtcXFwi6K6/6Zeu6L+H5LqO6aKR57mB77yM6K+356iN5ZCO5YaN6K+VXFxcIiwgM11dXFxuXSk7XFxuXFxuQWxpRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoKSwge1xcbiAgICBjb25zdHJ1Y3RvcjogQWxpRXJyb3JcXG59KTtcXG5cXG5mdW5jdGlvbiBwb3N0QXBpKGFwaSwgYm9keSwgaGVhZGVycykge1xcbiAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdCgnaHR0cHM6Ly9hcGkuYWxpeXVuZHJpdmUuY29tJyArIGFwaSwge1xcbiAgICAgICAgaGVhZGVyczogT2JqZWN0LmFzc2lnbih7XFxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcXG4gICAgICAgIH0sIGhlYWRlcnMpLFxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXFxuICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICB9KTtcXG4gICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xcbiAgICBpZiAocmVzdWx0LmNvZGUpIHtcXG4gICAgICAgIHRocm93IG5ldyBBbGlFcnJvcihyZXN1bHQuY29kZSwgcmVzdWx0Lm1lc3NhZ2UpO1xcbiAgICB9XFxuICAgIHJldHVybiByZXN1bHQ7XFxufVxcblxcbmZ1bmN0aW9uIEFsaVNoYXJlQXBpKHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCByZWZyZXNoQ2FsbEJhY2spIHtcXG4gICAgdGhpcy5zaGFyZUlkID0gc2hhcmVJZDtcXG4gICAgdGhpcy5zaGFyZVB3ZCA9IHNoYXJlUHdkO1xcbiAgICB0aGlzLnJlZnJlc2hDYWxsQmFjayA9IHJlZnJlc2hDYWxsQmFjayB8fCAoKCkgPT4gdm9pZCAwKTtcXG4gICAgdGhpcy5zaGFyZVRva2VuID0gc2hhcmVUb2tlbiB8fCB0aGlzLmdldFNoYXJlVG9rZW4oKTtcXG59XFxuT2JqZWN0LmFzc2lnbihBbGlTaGFyZUFwaS5wcm90b3R5cGUsIHtcXG4gICAgZ2V0U2hhcmVUb2tlbigpIHtcXG4gICAgICAgIGxldCByZXN1bHQgPSBwb3N0QXBpKFxcXCIvdjIvc2hhcmVfbGluay9nZXRfc2hhcmVfdG9rZW5cXFwiLCB7XFxuICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogdGhpcy5zaGFyZUlkLFxcbiAgICAgICAgICAgIFxcXCJzaGFyZV9wd2RcXFwiOiB0aGlzLnNoYXJlUHdkLFxcbiAgICAgICAgfSk7XFxuICAgICAgICB0aGlzLnNoYXJlVG9rZW4gPSByZXN1bHQuc2hhcmVfdG9rZW47XFxuICAgICAgICB0aGlzLnJlZnJlc2hDYWxsQmFjayhyZXN1bHQuc2hhcmVfdG9rZW4sIHRoaXMpO1xcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5zaGFyZV90b2tlbjtcXG4gICAgfSxcXG4gICAgcG9zdFRva2VuQXBpKGFwaSwgYm9keSwgaGVhZGVycywgaXNSZXRyeSkge1xcbiAgICAgICAgbGV0IHJlc3VsdDtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgcmVzdWx0ID0gcG9zdEFwaShhcGksIGJvZHksIE9iamVjdC5hc3NpZ24oe1xcbiAgICAgICAgICAgICAgICBcXFwiWC1TaGFyZS1Ub2tlblxcXCI6IHRoaXMuc2hhcmVUb2tlbiB8fCB0aGlzLmdldFNoYXJlVG9rZW4oKVxcbiAgICAgICAgICAgIH0sIGhlYWRlcnMpKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBpZiAoKGUuY29kZSA9PT0gXFxcIkFjY2Vzc1Rva2VuSW52YWxpZFxcXCIgfHwgZS5jb2RlID09PSBcXFwiU2hhcmVMaW5rVG9rZW5JbnZhbGlkXFxcIikgJiYgIWlzUmV0cnkpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRTaGFyZVRva2VuKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc3RUb2tlbkFwaShhcGksIGJvZHksIGhlYWRlcnMsIHRydWUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aHJvdyBlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfSxcXG4gICAgZ2V0TGlzdEZpbGUoZmlsZUlkLCBtYXJrZXIsIG9yZGVyQnksIG9yZGVyRGlyZWN0aW9uKSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5wb3N0VG9rZW5BcGkoXFxcIi9hZHJpdmUvdjMvZmlsZS9saXN0XFxcIiwge1xcbiAgICAgICAgICAgIFxcXCJzaGFyZV9pZFxcXCI6IHRoaXMuc2hhcmVJZCxcXG4gICAgICAgICAgICBcXFwicGFyZW50X2ZpbGVfaWRcXFwiOiBmaWxlSWQgfHwgXFxcInJvb3RcXFwiLFxcbiAgICAgICAgICAgIFxcXCJsaW1pdFxcXCI6IDEwMCxcXG4gICAgICAgICAgICBcXFwiaW1hZ2VfdGh1bWJuYWlsX3Byb2Nlc3NcXFwiOiBcXFwiaW1hZ2UvcmVzaXplLHdfMTYwL2Zvcm1hdCxqcGVnXFxcIixcXG4gICAgICAgICAgICBcXFwiaW1hZ2VfdXJsX3Byb2Nlc3NcXFwiOiBcXFwiaW1hZ2VcXFxcL3Jlc2l6ZSx3XzE5MjAvZm9ybWF0LGpwZWdcXFwiLFxcbiAgICAgICAgICAgIFxcXCJ2aWRlb190aHVtYm5haWxfcHJvY2Vzc1xcXCI6IFxcXCJ2aWRlby9zbmFwc2hvdCx0XzEwMDAsZl9qcGcsYXJfYXV0byx3XzMwMFxcXCIsXFxuICAgICAgICAgICAgXFxcIm9yZGVyX2J5XFxcIjogb3JkZXJCeSB8fCBcXFwibmFtZVxcXCIsXFxuICAgICAgICAgICAgXFxcIm9yZGVyX2RpcmVjdGlvblxcXCI6IG9yZGVyRGlyZWN0aW9uIHx8IFxcXCJBU0NcXFwiLFxcbiAgICAgICAgICAgIFxcXCJtYXJrZXJcXFwiOiBtYXJrZXJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfSxcXG4gICAgZ2V0U2hhcmVJbmZvKCkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHBvc3RBcGkoXFxcIi9hZHJpdmUvdjMvc2hhcmVfbGluay9nZXRfc2hhcmVfYnlfYW5vbnltb3VzP3NoYXJlX2lkPVxcXCIgKyB0aGlzLnNoYXJlSWQsIHtcXG4gICAgICAgICAgICBcXFwic2hhcmVfaWRcXFwiOiB0aGlzLnNoYXJlSWQsXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICAgIGdldFNlYXJjaExpc3RGaWxlKGtleSwgbWFya2VyLCBvcmRlckJ5LCBvcmRlckRpcmVjdGlvbikge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucG9zdFRva2VuQXBpKFxcXCIvcmVjb21tZW5kL3YxL3NoYXJlTGluay9zZWFyY2hcXFwiLCB7XFxuICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogdGhpcy5zaGFyZUlkLFxcbiAgICAgICAgICAgIFxcXCJrZXl3b3JkXFxcIjoga2V5LFxcbiAgICAgICAgICAgIFxcXCJsaW1pdFxcXCI6IDEwMCxcXG4gICAgICAgICAgICBcXFwib3JkZXJfYnlcXFwiOiBvcmRlckJ5ICsgXFxcIiBcXFwiICsgb3JkZXJEaXJlY3Rpb24sXFxuICAgICAgICAgICAgXFxcIm1hcmtlclxcXCI6IG1hcmtlciB8fCB1bmRlZmluZWRcXG4gICAgICAgIH0pO1xcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID09PSAwKSB7XFxuICAgICAgICAgICAgcmVzdWx0Lml0ZW1zID0gW107XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICB9XFxufSk7XFxuJC5leHBvcnRzID0gQWxpU2hhcmVBcGk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLpmL/ph4zmkq3mlL5BUElcIixcInBhdGhcIjpcImFsaVBsYXlBcGlcIixcInJ1bGVcIjpcIi8vQGF1dGhvciBMb3lEZ0lrXFxuXFxuZnVuY3Rpb24gQWxpQWNjZXNzQXBpKHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCBhbGlUb2tlbnMsIG9wZW5Ub2tlbnMsIHJlZnJlc2hTaGFyZUNhbGxCYWNrLCByZWZyZXNoQWNjZXNzQ2FsbEJhY2ssIHJlZnJlc2hPcGVuQ2FsbEJhY2spIHtcXG4gICAgdGhpcy5zaGFyZUlkID0gc2hhcmVJZDtcXG4gICAgdGhpcy5zaGFyZVB3ZCA9IHNoYXJlUHdkO1xcbiAgICB0aGlzLnJlZnJlc2hTaGFyZUNhbGxCYWNrID0gcmVmcmVzaFNoYXJlQ2FsbEJhY2sgfHwgKCgpID0+IHZvaWQgMCk7XFxuICAgIHRoaXMucmVmcmVzaEFjY2Vzc0NhbGxCYWNrID0gcmVmcmVzaEFjY2Vzc0NhbGxCYWNrIHx8ICgoKSA9PiB2b2lkIDApO1xcbiAgICB0aGlzLnJlZnJlc2hPcGVuQ2FsbEJhY2sgPSByZWZyZXNoT3BlbkNhbGxCYWNrIHx8ICgoKSA9PiB2b2lkIDApO1xcbiAgICB0aGlzLnNoYXJlVG9rZW4gPSBzaGFyZVRva2VuIHx8IHRoaXMuZ2V0U2hhcmVUb2tlbigpO1xcbiAgICB0aGlzLmFsaVRva2VucyA9IGFsaVRva2VucyB8fCB7fTtcXG4gICAgaWYgKCF0aGlzLmFsaVRva2Vucy5yZWZyZXNoX3Rva2VuKSB7XFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuacqueZu+mZhlxcXCIpO1xcbiAgICB9XFxuICAgIGlmICghdGhpcy5hbGlUb2tlbnMuYWNjZXNzX3Rva2VuKSB7XFxuICAgICAgICB0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpO1xcbiAgICB9XFxuICAgIHRoaXMuZGVmRHJpdmVJZCA9IHRoaXMuYWxpVG9rZW5zLnJlc291cmNlX2RyaXZlX2lkIHx8IHRoaXMuYWxpVG9rZW5zLmRlZmF1bHRfZHJpdmVfaWQ7XFxuICAgIHRoaXMucmVhY2Nlc3NUayA9ICh0aGlzLmFsaVRva2Vucy50b2tlbl90eXBlIHx8IFxcXCJCZWFyZXJcXFwiKSArICcgJyArIHRoaXMuYWxpVG9rZW5zLmFjY2Vzc190b2tlbjtcXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFxcXCJvcGVuVG9vbHNcXFwiLCB7XFxuICAgICAgICBnZXQ6ICgpID0+IHtcXG4gICAgICAgICAgICBpZiAodGhpcy5fb3BlblRvb2xzKSByZXR1cm4gX29wZW5Ub29scztcXG4gICAgICAgICAgICBsZXQgT3BlbkFwaVRvb2xzO1xcbiAgICAgICAgICAgIHN3aXRjaCAoZ2V0SXRlbShcXFwib3BlbkFwaU1vZGVcXFwiLCBcXFwiMFxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIGNhc2UgXFxcIjFcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgT3BlbkFwaVRvb2xzID0gJC5yZXF1aXJlKFxcXCJvcGVuQXBpX2FsaXl1bmRyaXZlXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgY2FzZSBcXFwiMlxcXCI6XFxuICAgICAgICAgICAgICAgICAgICBPcGVuQXBpVG9vbHMgPSAkLnJlcXVpcmUoXFxcIm9wZW5BcGlfdHZib3hcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICBjYXNlIFxcXCIzXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgIE9wZW5BcGlUb29scyA9ICQucmVxdWlyZShcXFwib3BlbkFwaV9YQllcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICBjYXNlIFxcXCIwXFxcIjpcXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcXG4gICAgICAgICAgICAgICAgICAgIE9wZW5BcGlUb29scyA9ICQucmVxdWlyZShcXFwib3BlbkFwaV9hbGlzdFxcXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aGlzLl9vcGVuVG9vbHMgPSBuZXcgT3BlbkFwaVRvb2xzKHRoaXMpO1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcGVuVG9vbHM7XFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXFxcIm9wZW5Ub2tlbnNcXFwiLCB7XFxuICAgICAgICBnZXQ6ICgpID0+IHtcXG4gICAgICAgICAgICBpZiAodGhpcy5fb3BlblRva2VucykgcmV0dXJuIHRoaXMuX29wZW5Ub2tlbnM7XFxuICAgICAgICAgICAgdGhpcy5fb3BlblRva2VucyA9IE9iamVjdC5hc3NpZ24oe1xcbiAgICAgICAgICAgICAgICAnUmVmcmVzaFRva2VuT3Blbic6ICcnLFxcbiAgICAgICAgICAgICAgICAnQWNjZXNzVG9rZW5PcGVuJzogJycsXFxuICAgICAgICAgICAgICAgICdCaW5kUmVmcmVzaFRva2VuJzogJycsXFxuICAgICAgICAgICAgfSwgb3BlblRva2Vucyk7XFxuICAgICAgICAgICAgaWYgKG9wZW5Ub2tlbnMgIT09IG51bGwgJiYgIXRoaXMuX29wZW5Ub2tlbnMuQWNjZXNzVG9rZW5PcGVuKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaE9wZW5Ub2tlbigpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fb3BlblRva2VucztcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufVxcbk9iamVjdC5hc3NpZ24oQWxpQWNjZXNzQXBpLnByb3RvdHlwZSwge1xcbiAgICB3YWl0U2xlZXAodGltZSkge1xcbiAgICAgICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCh0aW1lIHx8IDYwMCk7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgcG9zdEFwaShhcGkpIHtcXG4gICAgICAgIHJldHVybiBodHRwUmVxdWVzdC5wb3N0KGFwaS5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikgPyBhcGkgOiAnaHR0cHM6Ly9hcGkuYWxpeXVuZHJpdmUuY29tJyArIGFwaSkuYm9keVRvU3RyaW5nKHRydWUpLmVycm9yKChlcnIpID0+IHtcXG4gICAgICAgICAgICB0aHJvdyBlcnI7XFxuICAgICAgICB9KS5lcnJvclR5cGUoKGVyciwgcmVzKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHt9O1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzLmJvZHkpO1xcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHJib2R5ID0gKHJlc3VsdC5jb2RlID8gcmVzdWx0IDogKHJlc3VsdCAmJiByZXN1bHQucmVzcG9uc2VzICYmIHJlc3VsdC5yZXNwb25zZXNbMF0gJiYgcmVzdWx0LnJlc3BvbnNlc1swXS5ib2R5KSkgfHwge307XFxuICAgICAgICAgICAgaWYgKHJib2R5LmNvZGUpIHtcXG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9IHJib2R5LmRpc3BsYXlfbWVzc2FnZSB8fCByYm9keS5tZXNzYWdlO1xcbiAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYXBpICsgXFxcIj0+XFxcIiArIHJib2R5LmNvZGUgKyBcXFwiOlxcXCIgKyBtc2cpO1xcbiAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gcmJvZHkuY29kZTtcXG4gICAgICAgICAgICAgICAgZXJyb3IuanVkZ2VNc2cgPSBtc2c7XFxuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGVycjtcXG4gICAgICAgIH0pO1xcbiAgICB9LFxcblxcbiAgICB0cnlTb2x2ZShlKSB7XFxuICAgICAgICBpZiAoZS5jb2RlID09PSBcXFwiU2hhcmVMaW5rVG9rZW5JbnZhbGlkXFxcIiB8fCBlLmNvZGUgPT09IFxcXCJJbnZhbGlkUGFyYW1ldGVyTm90TWF0Y2guU2hhcmVJZFxcXCIpIHtcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgyMCkuZ2V0U2hhcmVUb2tlbigpO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfSBlbHNlIGlmIChlLmNvZGUgPT09IFxcXCJBY2Nlc3NUb2tlbkludmFsaWRcXFwiIHx8IGUuY29kZSA9PT0gXFxcIkFjY2Vzc1Rva2VuRXhwaXJlZFxcXCIpIHtcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgyMCkucmVmcmVzaEFjY2Vzc1Rva2VuKCk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9IGVsc2UgaWYgKGUuY29kZSA9PT0gXFxcIkZvcmJpZGRlbk5vUGVybWlzc2lvbi5GaWxlXFxcIiB8fCAoZS5jb2RlID09PSBcXFwiQmFkUmVxdWVzdFxcXCIgJiYgZS5qdWRnZU1zZyA9PT0gXFxcIuS7heWPr+S/neWtmOWIsOi9rOWtmOepuumXtFxcXCIpKSB7XFxuICAgICAgICAgICAgdGhpcy5hbGlUb2tlbnMucmVzb3VyY2VfZHJpdmVfaWQgPSB1bmRlZmluZWQ7XFxuICAgICAgICAgICAgdGhpcy53YWl0U2xlZXAoMjApLnJlZnJlc2hBY2Nlc3NUb2tlbigpO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9LFxcbiAgICB0cnlPcGVuQXBpU29sdmUoZSkge1xcbiAgICAgICAgaWYgKGUuY29kZSA9PT0gXFxcIkFjY2Vzc1Rva2VuSW52YWxpZFxcXCIgfHwgZS5jb2RlID09PSBcXFwiQWNjZXNzVG9rZW5FeHBpcmVkXFxcIikge1xcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5yZWZyZXNoT3BlblRva2VuKCk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgyMCkucmVmcmVzaE9wZW5Ub2tlbigpO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9LFxcbiAgICBnZXRTaGFyZVRva2VuKCkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucG9zdEFwaShcXFwiL3YyL3NoYXJlX2xpbmsvZ2V0X3NoYXJlX3Rva2VuXFxcIikuYm9keSh7XFxuICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogdGhpcy5zaGFyZUlkLFxcbiAgICAgICAgICAgIFxcXCJzaGFyZV9wd2RcXFwiOiB0aGlzLnNoYXJlUHdkLFxcbiAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICB0aGlzLnNoYXJlVG9rZW4gPSByZXN1bHQuc2hhcmVfdG9rZW47XFxuICAgICAgICB0aGlzLnJlZnJlc2hTaGFyZUNhbGxCYWNrKHJlc3VsdC5zaGFyZV90b2tlbiwgdGhpcyk7XFxuICAgICAgICByZXR1cm4gcmVzdWx0LnNoYXJlX3Rva2VuO1xcbiAgICB9LFxcbiAgICByZWZyZXNoQWNjZXNzVG9rZW4oKSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5wb3N0QXBpKFxcXCJodHRwczovL2F1dGguYWxpeXVuZHJpdmUuY29tL3YyL2FjY291bnQvdG9rZW5cXFwiKVxcbiAgICAgICAgICAgIC5ib2R5KHtcXG4gICAgICAgICAgICAgICAgXFxcImdyYW50X3R5cGVcXFwiOiBcXFwicmVmcmVzaF90b2tlblxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJyZWZyZXNoX3Rva2VuXFxcIjogdGhpcy5hbGlUb2tlbnMucmVmcmVzaF90b2tlbixcXG4gICAgICAgICAgICB9KS5oZWFkZXJzKHtcXG4gICAgICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBQQ19VQSxcXG4gICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL1xcXCJcXG4gICAgICAgICAgICB9KS5lcnJvcigoZSkgPT4ge1xcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlID09PSBcXFwiSW52YWxpZFBhcmFtZXRlci5SZWZyZXNoVG9rZW5cXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICBlLm1lc3NhZ2UgPSBcXFwiI+eZu+mZhui/h+acn+ivt+mHjeaWsOeZu+mZhiNcXFxcblxcXCIgKyBlLm1lc3NhZ2U7XFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICBkZWxldGUgcmVzdWx0LnVzZXJfZGF0YTtcXG4gICAgICAgIGxldCBvcmlnaW5EZWZkRHJpdmVJZCA9IHRoaXMuYWxpVG9rZW5zLmRlZmF1bHRfZHJpdmVfaWQ7XFxuICAgICAgICB0aGlzLmFsaVRva2VucyA9IE9iamVjdC5hc3NpZ24odGhpcy5hbGlUb2tlbnMsIHJlc3VsdCk7XFxuICAgICAgICB0aGlzLnJlYWNjZXNzVGsgPSB0aGlzLmFsaVRva2Vucy50b2tlbl90eXBlICsgJyAnICsgdGhpcy5hbGlUb2tlbnMuYWNjZXNzX3Rva2VuO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBpZiAoKG9yaWdpbkRlZmREcml2ZUlkICE9PSB0aGlzLmFsaVRva2Vucy5kZWZhdWx0X2RyaXZlX2lkKSB8fCB0aGlzLmFsaVRva2Vucy5yZXNvdXJjZV9kcml2ZV9pZCA9PT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgICAgIGxldCByZXNvdXJjZV9kcml2ZV9pZCA9IHRoaXMuZ2V0VXNlckluZm8oKS5yZXNvdXJjZV9kcml2ZV9pZDtcXG4gICAgICAgICAgICAgICAgdGhpcy5hbGlUb2tlbnMucmVzb3VyY2VfZHJpdmVfaWQgPSByZXNvdXJjZV9kcml2ZV9pZDtcXG4gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlX2RyaXZlX2lkKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZkRyaXZlSWQgPSByZXNvdXJjZV9kcml2ZV9pZDtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmRHJpdmVJZCA9IHRoaXMuYWxpVG9rZW5zLmRlZmF1bHRfZHJpdmVfaWQ7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKFxcXCLnlKjmiLfkv6Hmga/ojrflj5blpLHotKXvvJpcXFwiICsgZS50b1N0cmluZygpKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHRoaXMucmVmcmVzaEFjY2Vzc0NhbGxCYWNrKHJlc3VsdCwgdGhpcyk7XFxuICAgICAgICByZXR1cm4gdGhpcy5hbGlUb2tlbnM7XFxuICAgIH0sXFxuICAgIGdldFVzZXJJbmZvKCkge1xcbiAgICAgICAgbGV0IGluZm8gPSB0aGlzLnBvc3RBcGkoXFxcImh0dHBzOi8vdXNlci5hbGl5dW5kcml2ZS5jb20vdjIvdXNlci9nZXRcXFwiKS5oZWFkZXJzKHtcXG4gICAgICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6IFBDX1VBLFxcbiAgICAgICAgICAgIFxcXCJhdXRob3JpemF0aW9uXFxcIjogdGhpcy5yZWFjY2Vzc1RrLFxcbiAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9cXFwiXFxuICAgICAgICB9KS5lcnJvcldpdGhSZXRyeSgoZSwgXywgaHR0cCkgPT4ge1xcbiAgICAgICAgICAgIHRoaXMudHJ5U29sdmUoZSk7XFxuICAgICAgICAgICAgaHR0cC5tZXJnZUhlYWRBbmRCb2R5KHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLnJlYWNjZXNzVGtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gaW5mbztcXG4gICAgfSxcXG4gICAgY2FjaGVPcGVuVG9rZW4ob3BlblJlc3VsdCkge1xcbiAgICAgICAgdGhpcy5vcGVuVG9rZW5zLlJlZnJlc2hUb2tlbk9wZW4gPSBvcGVuUmVzdWx0LnJlZnJlc2hfdG9rZW47XFxuICAgICAgICB0aGlzLm9wZW5Ub2tlbnMuQWNjZXNzVG9rZW5PcGVuID0gb3BlblJlc3VsdC50b2tlbl90eXBlICsgXFxcIiBcXFwiICsgb3BlblJlc3VsdC5hY2Nlc3NfdG9rZW47XFxuICAgICAgICB0aGlzLm9wZW5Ub2tlbnMuQmluZFJlZnJlc2hUb2tlbiA9IHRoaXMuYWxpVG9rZW5zLnJlZnJlc2hfdG9rZW47XFxuICAgICAgICB0aGlzLnJlZnJlc2hPcGVuQ2FsbEJhY2sob3BlblJlc3VsdCwgdGhpcyk7XFxuICAgIH0sXFxuICAgIHJlZnJlc2hPcGVuVG9rZW4oKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBvcGVuUmVzdWx0O1xcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZW5Ub2tlbnMuUmVmcmVzaFRva2VuT3BlbiAmJiB0aGlzLm9wZW5Ub2tlbnMuQmluZFJlZnJlc2hUb2tlbiA9PT0gdGhpcy5hbGlUb2tlbnMucmVmcmVzaF90b2tlbikge1xcbiAgICAgICAgICAgICAgICBvcGVuUmVzdWx0ID0gdGhpcy5vcGVuVG9vbHMucmVmcmVzaE9wZW5Ub2tlbigpIHx8IHt9O1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIG9wZW5SZXN1bHQgPSB0aGlzLm9wZW5Ub29scy5nZXRPcGVuVG9rZW4oKSB8fCB7fTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKG9wZW5SZXN1bHQucmVmcmVzaF90b2tlbikge1xcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlT3BlblRva2VuKG9wZW5SZXN1bHQpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuVG9rZW5zO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6L+U5Zue57uT5p6c5pegVG9rZW5cXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCJPcGVuVG9rZW7ojrflj5blpLHotKU6XFxcIiArIGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIF9jbG91ZEZpbGVPcGVyYXRlKGJvZHksIGNsb3VkRmlsZUlkLCBvcGVyYXRlVXJsKSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5wb3N0QXBpKCdodHRwczovL2FwaS5hbGl5dW5kcml2ZS5jb20vYWRyaXZlL3YyL2JhdGNoJykuYm9keSh7XFxuICAgICAgICAgICAgXFxcInJlcXVlc3RzXFxcIjogW3tcXG4gICAgICAgICAgICAgICAgXFxcImJvZHlcXFwiOiBib2R5LFxcbiAgICAgICAgICAgICAgICBcXFwiaGVhZGVyc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJDb250ZW50LVR5cGVcXFwiOiBcXFwiYXBwbGljYXRpb24vanNvblxcXCJcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgXFxcImlkXFxcIjogY2xvdWRGaWxlSWQgfHwgXFxcIjBcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwibWV0aG9kXFxcIjogXFxcIlBPU1RcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwidXJsXFxcIjogb3BlcmF0ZVVybFxcbiAgICAgICAgICAgIH1dLFxcbiAgICAgICAgICAgIFxcXCJyZXNvdXJjZVxcXCI6IFxcXCJmaWxlXFxcIlxcbiAgICAgICAgfSkuaGVhZGVycyh7XFxuICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiBQQ19VQSxcXG4gICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJyxcXG4gICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMucmVhY2Nlc3NUayxcXG4gICAgICAgICAgICAvL2dldEFjY2Vzc1Rva2VuXFxuICAgICAgICAgICAgJ3gtY2FuYXJ5JzogJ2NsaWVudD13ZWIsYXBwPXNoYXJlLHZlcnNpb249djIuMy4xJyxcXG4gICAgICAgICAgICAneC1zaGFyZS10b2tlbic6IHRoaXMuc2hhcmVUb2tlblxcbiAgICAgICAgfSkuZXJyb3JXaXRoUmV0cnkoKGUsIF8sIGh0dHApID0+IHtcXG4gICAgICAgICAgICBpZiAoZS5jb2RlID09PSBcXFwiUXVvdGFFeGhhdXN0ZWQuRHJpdmVcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHRocm93IGU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIFxcbiAgICAgICAgICAgIGlmICghdGhpcy50cnlTb2x2ZShlKSkge1xcbiAgICAgICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgyMCkucmVmcmVzaEFjY2Vzc1Rva2VuKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBib2R5ID0gaHR0cC5vcHRpb25zLmJvZHkucmVxdWVzdHNbMF0uYm9keTtcXG4gICAgICAgICAgICBpZiAoYm9keS5kcml2ZV9pZCkge1xcbiAgICAgICAgICAgICAgICBib2R5LmRyaXZlX2lkID0gdGhpcy5kZWZEcml2ZUlkXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChib2R5LnRvX2RyaXZlX2lkKSB7XFxuICAgICAgICAgICAgICAgIGJvZHkudG9fZHJpdmVfaWQgPSB0aGlzLmRlZkRyaXZlSWRcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaHR0cC5tZXJnZUhlYWRBbmRCb2R5KHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLnJlYWNjZXNzVGssXFxuICAgICAgICAgICAgICAgICAgICAneC1zaGFyZS10b2tlbic6IHRoaXMuc2hhcmVUb2tlblxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9KS5zdGFydCh0cnVlKTtcXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICAgIGNvcHlGaWxlVG9DbG91ZEZpbGUoZmlsZUlkLCByZXRyeSkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX2Nsb3VkRmlsZU9wZXJhdGUoe1xcbiAgICAgICAgICAgIFxcXCJmaWxlX2lkXFxcIjogZmlsZUlkLFxcbiAgICAgICAgICAgIFxcXCJzaGFyZV9pZFxcXCI6IHRoaXMuc2hhcmVJZCxcXG4gICAgICAgICAgICBcXFwiYXV0b19yZW5hbWVcXFwiOiB0cnVlLFxcbiAgICAgICAgICAgIFxcXCJ0b19wYXJlbnRfZmlsZV9pZFxcXCI6IFxcXCJyb290XFxcIixcXG4gICAgICAgICAgICBcXFwidG9fZHJpdmVfaWRcXFwiOiB0aGlzLmRlZkRyaXZlSWRcXG4gICAgICAgIH0sIFxcXCIwXFxcIiwgXFxcIi9maWxlL2NvcHlcXFwiKTtcXG4gICAgICAgIGxldCBib2R5ID0gcmVzdWx0ICYmIHJlc3VsdC5yZXNwb25zZXMgJiYgcmVzdWx0LnJlc3BvbnNlc1swXSAmJiByZXN1bHQucmVzcG9uc2VzWzBdLmJvZHkgfHwge307XFxuICAgICAgICBpZiAoIWJvZHkuZmlsZV9pZCAmJiAhcmV0cnkpIHtcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgyMCkuZ2V0U2hhcmVUb2tlbigpO1xcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy53YWl0U2xlZXAoMjApLmNvcHlGaWxlVG9DbG91ZEZpbGUoZmlsZUlkLCB0cnVlKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoIWJvZHkuZmlsZV9pZCkge1xcbiAgICAgICAgICAgIGxldCBlID0gbmV3IEVycm9yKFxcXCLmlofku7blpI3liLblpLHotKU6XFxcXG5cXFwiICsgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XFxuICAgICAgICAgICAgZS5jb2RlID0gYm9keS5jb2RlO1xcbiAgICAgICAgICAgIHRocm93IGU7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3BvbnNlc1swXS5ib2R5LmZpbGVfaWQ7XFxuICAgIH0sXFxuICAgIG9wZW5DbG91ZEZpbGVUb0Rvd25VcmwoY2xvdWRGaWxlSWQpIHtcXG4gICAgICAgIGxldCBmaWxlSW5mbyA9IHRoaXMucG9zdEFwaSgnaHR0cHM6Ly9vcGVuLmFsaXl1bmRyaXZlLmNvbS9hZHJpdmUvdjEuMC9vcGVuRmlsZS9nZXREb3dubG9hZFVybCcpLmJvZHkoe1xcbiAgICAgICAgICAgICdmaWxlX2lkJzogY2xvdWRGaWxlSWQsXFxuICAgICAgICAgICAgJ2RyaXZlX2lkJzogdGhpcy5kZWZEcml2ZUlkXFxuICAgICAgICB9KS5oZWFkZXJzKHtcXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6IFBDX1VBLFxcbiAgICAgICAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS8nLFxcbiAgICAgICAgICAgICdhdXRob3JpemF0aW9uJzogdGhpcy5vcGVuVG9rZW5zLkFjY2Vzc1Rva2VuT3BlblxcbiAgICAgICAgfSkuZXJyb3JXaXRoUmV0cnkoMiwgKGUsIF8sIGh0dHApID0+IHtcXG4gICAgICAgICAgICAvL3RoaXMud2FpdFNsZWVwKDMwKS50cnlTb2x2ZShlKTtcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgzMCkudHJ5T3BlbkFwaVNvbHZlKGUpO1xcbiAgICAgICAgICAgIGh0dHAubWVyZ2VIZWFkQW5kQm9keSh7XFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcXG4gICAgICAgICAgICAgICAgICAgICdkcml2ZV9pZCc6IHRoaXMuZGVmRHJpdmVJZCxcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLm9wZW5Ub2tlbnMuQWNjZXNzVG9rZW5PcGVuXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcbiAgICAgICAgaWYgKCFmaWxlSW5mby51cmwgfHwgZmlsZUluZm8uY29kZSkgdGhyb3cgbmV3IEVycm9yKFxcXCLkuIvovb3pk77mjqXojrflj5blpLHotKVcXFxcblxcXCIgKyBmaWxlSW5mby5jb2RlICsgXFxcIjpcXFwiICsgZmlsZUluZm8ubWVzc2FnZSk7XFxuICAgICAgICByZXR1cm4gZmlsZUluZm8udXJsO1xcbiAgICB9LFxcbiAgICBkZWxldGVlQ2xvdWRGaWxlKGNsb3VkRmlsZUlkKSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fY2xvdWRGaWxlT3BlcmF0ZSh7XFxuICAgICAgICAgICAgXFxcImRyaXZlX2lkXFxcIjogdGhpcy5kZWZEcml2ZUlkLFxcbiAgICAgICAgICAgIFxcXCJmaWxlX2lkXFxcIjogY2xvdWRGaWxlSWRcXG4gICAgICAgIH0sIGNsb3VkRmlsZUlkLCBcXFwiL2ZpbGUvZGVsZXRlXFxcIik7XFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICB9LFxcbiAgICBnZXRWaWRlb1RlbVBsYXlVcmwoZmlsZUlkKSB7XFxuICAgICAgICBsZXQgY2xvdWRGaWxlSWQgPSB0aGlzLmNvcHlGaWxlVG9DbG91ZEZpbGUoZmlsZUlkKTtcXG4gICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKTtcXG4gICAgICAgIGxldCBwbGF5VXJsID0gdGhpcy5vcGVuQ2xvdWRGaWxlVG9Eb3duVXJsKGNsb3VkRmlsZUlkKTtcXG4gICAgICAgIHRoaXMud2FpdFNsZWVwKDUwKTtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgdGhpcy5kZWxldGVlQ2xvdWRGaWxlKGNsb3VkRmlsZUlkKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coXFxcIiPmlofku7bliKDpmaTlpLHotKUjXFxcXG7plJnor6/kv6Hmga8+XFxcIiArIGUudG9TdHJpbmcoKSArIFxcXCJcXFxcbumUmeivr+ihjD5cXFwiICsgZS5saW5lTnVtYmVyKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBwbGF5VXJsO1xcbiAgICB9LFxcbiAgICBnZXRGaWxlVG9Eb3duVXJsKGZpbGVJZCkge1xcbiAgICAgICAgbGV0IGRvd25sb2FkSW5mbyA9IHRoaXMucG9zdEFwaShcXFwiL3YyL2ZpbGUvZ2V0X3NoYXJlX2xpbmtfZG93bmxvYWRfdXJsXFxcIikuYm9keSh7XFxuICAgICAgICAgICAgXFxcImV4cGlyZV9zZWNcXFwiOiA2MDAsXFxuICAgICAgICAgICAgXFxcImZpbGVfaWRcXFwiOiBmaWxlSWQsXFxuICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogdGhpcy5zaGFyZUlkXFxuICAgICAgICB9KS5oZWFkZXJzKHtcXG4gICAgICAgICAgICBcXFwiWC1TaGFyZS1Ub2tlblxcXCI6IHRoaXMuc2hhcmVUb2tlbixcXG4gICAgICAgICAgICBcXFwiYXV0aG9yaXphdGlvblxcXCI6IHRoaXMuYWxpVG9rZW5zLmFjY2Vzc190b2tlblxcbiAgICAgICAgfSkuZXJyb3JXaXRoUmV0cnkoKGUsIF8sIGh0dHApID0+IHtcXG4gICAgICAgICAgICB0aGlzLnRyeVNvbHZlKGUpO1xcbiAgICAgICAgICAgIGh0dHAubWVyZ2VIZWFkQW5kQm9keSh7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJYLVNoYXJlLVRva2VuXFxcIjogdGhpcy5zaGFyZVRva2VuLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcImF1dGhvcml6YXRpb25cXFwiOiB0aGlzLmFsaVRva2Vucy5hY2Nlc3NfdG9rZW5cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gZG93bmxvYWRJbmZvLmRvd25sb2FkX3VybDtcXG4gICAgfSxcXG4gICAgZ2V0U2lnbigpIHtcXG4gICAgICAgIGlmICghdGhpcy5hbGlUb2tlbnMuZGV2aWNlX2lkKSB7XFxuICAgICAgICAgICAgdGhpcy53YWl0U2xlZXAoMjApLnJlZnJlc2hBY2Nlc3NUb2tlbigpO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGNhbGN1bGF0ZU5ld1NpZ24gPSAoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHNpZ24gPSBqdXN0VGVzdFNpZ24oXFxcIjVkZGU0ZTFiZGY5ZTQ5NjZiMzg3YmE1OGY0YjNmZGMzXFxcIiwgdGhpcy5hbGlUb2tlbnMuZGV2aWNlX2lkLCB0aGlzLmFsaVRva2Vucy51c2VyX2lkKS5zcGxpdChcXFwiIyNcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBzaWduYXR1cmU6IHNpZ24uYXQoMCksXFxuICAgICAgICAgICAgICAgIHB1YktleTogc2lnbi5hdCgtMSlcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgfTtcXG4gICAgICAgIGxldCBuZXdTaWduID0gY2FsY3VsYXRlTmV3U2lnbigpO1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucG9zdEFwaSgnL3VzZXJzL3YxL3VzZXJzL2RldmljZS9jcmVhdGVfc2Vzc2lvbicpLmJvZHkoe1xcbiAgICAgICAgICAgIFxcXCJkZXZpY2VOYW1lXFxcIjogXFxcIkVkZ2XmtY/op4jlmahcXFwiLFxcbiAgICAgICAgICAgIFxcXCJtb2RlbE5hbWVcXFwiOiBcXFwiV2luZG93c+e9kemhteeJiFxcXCIsXFxuICAgICAgICAgICAgXFxcInB1YktleVxcXCI6IG5ld1NpZ24ucHViS2V5LFxcbiAgICAgICAgfSkuaGVhZGVycyh7XFxuICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiBQQ19VQSxcXG4gICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20nLFxcbiAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogdGhpcy5yZWFjY2Vzc1RrLFxcbiAgICAgICAgICAgICdYLVNoYXJlLVRva2VuJzogdGhpcy5zaGFyZVRva2VuLFxcbiAgICAgICAgICAgICd4LWRldmljZS1pZCc6IHRoaXMuYWxpVG9rZW5zLmRldmljZV9pZCxcXG4gICAgICAgICAgICAneC1zaWduYXR1cmUnOiBuZXdTaWduLnNpZ25hdHVyZVxcbiAgICAgICAgfSkuZXJyb3JXaXRoUmV0cnkoMywgKGUsIF8sIGh0dHApID0+IHtcXG4gICAgICAgICAgICBpZiAoZS5tZXNzYWdlID09PSBcXFwieC1kZXZpY2UtaWQgZW1wdHlcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdGhpcy50cnlTb2x2ZShlKTtcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCg1MCk7XFxuICAgICAgICAgICAgbmV3U2lnbiA9IGNhbGN1bGF0ZU5ld1NpZ24oKTtcXG4gICAgICAgICAgICBodHRwLm1lcmdlSGVhZEFuZEJvZHkoe1xcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicHViS2V5XFxcIjogbmV3U2lnbi5wdWJLZXlcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiB0aGlzLnJlYWNjZXNzVGssXFxuICAgICAgICAgICAgICAgICAgICAnWC1TaGFyZS1Ub2tlbic6IHRoaXMuc2hhcmVUb2tlbixcXG4gICAgICAgICAgICAgICAgICAgICd4LWRldmljZS1pZCc6IHRoaXMuYWxpVG9rZW5zLmRldmljZV9pZCxcXG4gICAgICAgICAgICAgICAgICAgICd4LXNpZ25hdHVyZSc6IG5ld1NpZ24uc2lnbmF0dXJlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0pLmVycm9yKChlcnIsIHJlcykgPT4ge1xcbiAgICAgICAgICAgIHJldHVybiB7fTtcXG4gICAgICAgIH0pLnN1Y2Nlc3MoKGJvZHkpID0+IHtcXG4gICAgICAgICAgICByZXR1cm4gYm9keTtcXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XFxuICAgICAgICAgICAgcmV0dXJuIG5ld1NpZ247XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwiU2lnbuiOt+WPluWksei0pe+8jOivt+mHjeivleOAglxcXFxuY29kZTpcXFwiICsgKHJlc3VsdC5jb2RlIHx8IFxcXCJcXFwiKSArIFxcXCJcXFxcbm1lc3NhZ2U6XFxcIiArIChyZXN1bHQubWVzc2FnZSB8fCBcXFwiXFxcIikpO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICBnZXRTaGFyZVZpZGVvUHJldmlldyhmaWxlSWQpIHtcXG4gICAgICAgIGxldCBzaWduID0gdGhpcy5nZXRTaWduKCk7XFxuICAgICAgICBsZXQganNvbiA9IHRoaXMucG9zdEFwaSgnaHR0cHM6Ly9hcGkuYWxpeXVuZHJpdmUuY29tL3YyL2ZpbGUvZ2V0X3NoYXJlX2xpbmtfdmlkZW9fcHJldmlld19wbGF5X2luZm8nKS5ib2R5KHtcXG4gICAgICAgICAgICBcXFwiY2F0ZWdvcnlcXFwiOiBcXFwibGl2ZV90cmFuc2NvZGluZ1xcXCIsXFxuICAgICAgICAgICAgXFxcImZpbGVfaWRcXFwiOiBmaWxlSWQsXFxuICAgICAgICAgICAgXFxcImdldF9wcmV2aWV3X3VybFxcXCI6IHRydWUsXFxuICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogdGhpcy5zaGFyZUlkLFxcbiAgICAgICAgICAgIFxcXCJ0ZW1wbGF0ZV9pZFxcXCI6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIFxcXCJnZXRfc3VidGl0bGVfaW5mb1xcXCI6IHRydWVcXG4gICAgICAgIH0pLmhlYWRlcnMoe1xcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JyxcXG4gICAgICAgICAgICBcXFwib3JpZ2luXFxcIjogXFxcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbVxcXCIsXFxuICAgICAgICAgICAgXFxcInJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL1xcXCIsXFxuICAgICAgICAgICAgXFxcInVzZXItYWdlbnRcXFwiOiBcXFwiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExMC4wLjAuMCBTYWZhcmkvNTM3LjM2IEVkZy8xMTAuMC4xNTg3LjQxXFxcIixcXG4gICAgICAgICAgICBcXFwieC1jYW5hcnlcXFwiOiBcXFwiY2xpZW50PXdlYixhcHA9YWRyaXZlLHZlcnNpb249djMuMS4wXFxcIixcXG4gICAgICAgICAgICBcXFwieC1zaGFyZS10b2tlblxcXCI6IHRoaXMuc2hhcmVUb2tlbixcXG4gICAgICAgICAgICBcXFwiZmlsZWlkXFxcIjogdGhpcy5hbGlUb2tlbnMudXNlcl9pZCxcXG4gICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IHRoaXMucmVhY2Nlc3NUayxcXG4gICAgICAgICAgICAneC1kZXZpY2UtaWQnOiB0aGlzLmFsaVRva2Vucy5kZXZpY2VfaWQsXFxuICAgICAgICAgICAgJ3gtc2lnbmF0dXJlJzogc2lnbi5zaWduYXR1cmVcXG4gICAgICAgIH0pLmVycm9yV2l0aFJldHJ5KChlLCBfLCBodHRwKSA9PiB7XFxuICAgICAgICAgICAgdGhpcy50cnlTb2x2ZShlKTtcXG4gICAgICAgICAgICBodHRwLm1lcmdlSGVhZEFuZEJvZHkoe1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IHRoaXMucmVhY2Nlc3NUayxcXG4gICAgICAgICAgICAgICAgICAgICdYLXNoYXJlLXRva2VuJzogdGhpcy5zaGFyZVRva2VuLFxcbiAgICAgICAgICAgICAgICAgICAgJ3gtZGV2aWNlLWlkJzogdGhpcy5hbGlUb2tlbnMuZGV2aWNlX2lkLFxcbiAgICAgICAgICAgICAgICAgICAgJ3gtc2lnbmF0dXJlJzogc2lnbi5zaWduYXR1cmVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICByZXR1cm4ganNvbi52aWRlb19wcmV2aWV3X3BsYXlfaW5mby5saXZlX3RyYW5zY29kaW5nX3Rhc2tfbGlzdC5yZXZlcnNlKCk7XFxuICAgIH1cXG59KTtcXG5cXG5BbGlBY2Nlc3NBcGkuY3JlYXRlRGVmYXVsdCA9IGZ1bmN0aW9uKHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCBhbGlUb2tlbiwgb3BlblRva2VuLCBNWV9USVRMRSkge1xcbiAgICBjb25zdCB7XFxuICAgICAgICBvcGVuVG9rZW5zRmlsZXBhdGgsXFxuICAgICAgICBhbGlUb2tlbnNGaWxlcGF0aFxcbiAgICB9ID0gJC5yZXF1aXJlKFxcXCJ0b2tlblBhdGhcXFwiICsgKE1ZX1RJVExFID8gXFxcIj9ydWxlPVxcXCIgKyBNWV9USVRMRSA6IFxcXCJcXFwiKSk7XFxuXFxuICAgIGZ1bmN0aW9uIHNhdmVBbGlUb2tlbihyZXN1bHQsIGFwaSkge1xcbiAgICAgICAgd3JpdGVGaWxlKGFsaVRva2Vuc0ZpbGVwYXRoLCBKU09OLnN0cmluZ2lmeShhcGkuYWxpVG9rZW5zKSk7XFxuICAgIH1cXG5cXG4gICAgZnVuY3Rpb24gc2F2ZU9wZW5Ub2tlbihyZXN1bHQsIGFwaSkge1xcbiAgICAgICAgd3JpdGVGaWxlKG9wZW5Ub2tlbnNGaWxlcGF0aCwgSlNPTi5zdHJpbmdpZnkoYXBpLm9wZW5Ub2tlbnMpKTtcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBwdXRTaGFyZVRva2VuKHJlc3VsdCkge1xcbiAgICAgICAgaWYgKE1ZX1RJVExFKSB7XFxuICAgICAgICAgICAgc2hhcmVUb2tlbiA9IHB1dFZhcihNWV9USVRMRSArIFxcXCJAXFxcIiArIFxcXCJhbGlTaGFyZVRva2VuXFxcIiwgcmVzdWx0KTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgc2hhcmVUb2tlbiA9IHB1dE15VmFyKFxcXCJhbGlTaGFyZVRva2VuXFxcIiwgcmVzdWx0KTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBpZiAoIW9wZW5Ub2tlbiAmJiBvcGVuVG9rZW4gIT09IG51bGwgJiYgZmlsZUV4aXN0KG9wZW5Ub2tlbnNGaWxlcGF0aCkpIHtcXG4gICAgICAgIG9wZW5Ub2tlbiA9ICQucmVxdWlyZShvcGVuVG9rZW5zRmlsZXBhdGgpO1xcbiAgICB9XFxuICAgIGlmICghYWxpVG9rZW4gJiYgZmlsZUV4aXN0KGFsaVRva2Vuc0ZpbGVwYXRoKSkge1xcbiAgICAgICAgYWxpVG9rZW4gPSAkLnJlcXVpcmUoYWxpVG9rZW5zRmlsZXBhdGgpO1xcbiAgICB9XFxuICAgIGlmIChNWV9USVRMRSkge1xcbiAgICAgICAgc2hhcmVUb2tlbiA9IGdldFZhcihNWV9USVRMRSArIFxcXCJAXFxcIiArIFxcXCJhbGlTaGFyZVRva2VuXFxcIiwgc2hhcmVUb2tlbik7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBzaGFyZVRva2VuID0gZ2V0TXlWYXIoXFxcImFsaVNoYXJlVG9rZW5cXFwiLCBzaGFyZVRva2VuKTtcXG4gICAgfVxcbiAgICByZXR1cm4gbmV3IEFsaUFjY2Vzc0FwaShzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVUb2tlbiwgYWxpVG9rZW4sIG9wZW5Ub2tlbiwgcHV0U2hhcmVUb2tlbiwgc2F2ZUFsaVRva2VuLCBzYXZlT3BlblRva2VuKTtcXG59XFxuJC5leHBvcnRzID0gQWxpQWNjZXNzQXBpO1xcblxcbmZ1bmN0aW9uIGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcbiAgICB0aGlzLnJldHJ5Q291bnQgPSAwO1xcbiAgICB0aGlzLnVybCA9IHVybDtcXG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xcbiAgICAgICAgd2l0aEhlYWRlcnM6IHRydWVcXG4gICAgfSk7XFxuICAgIHRoaXMuZXJyb3JDYWxsYmFjayA9IChlcnIsIHJlcykgPT4ge3Rocm93IGVycn07XFxuICAgIHRoaXMuZXJyb3JDYWxsYmFja1dpdGhSZXRyeSA9IChlcnIsIHJlcywgdHJ5UmVzdGFydCkgPT4gZmFsc2U7XFxuICAgIHRoaXMuc3VjY2Vzc0NhbGxiYWNrID0gKGJvZHksIHJlcykgPT4gYm9keTtcXG4gICAgdGhpcy5lcnJvclR5cGVDYWxsYmFjayA9IChlcnIsIHJlcykgPT4gZXJyO1xcbiAgICB0aGlzLnN0YXJ0UmVxdWVzdCA9IGZldGNoO1xcbiAgICB0aGlzLl9ib2R5VG9TdHJpbmcgPSBmYWxzZTtcXG59XFxuXFxuT2JqZWN0LmFzc2lnbihodHRwUmVxdWVzdC5wcm90b3R5cGUsIHtcXG4gICAgYm9keVRvU3RyaW5nKGZsYWcpIHtcXG4gICAgICAgIHRoaXMuX2JvZHlUb1N0cmluZyA9ICEhZmxhZztcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBib2R5KGJvZHkpIHtcXG4gICAgICAgIHRoaXMub3B0aW9ucy5ib2R5ID0gYm9keSB8fCB2b2lkIDA7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgc2V0U3RhcnRSZXF1ZXN0RnVuYyhmdW5jKSB7XFxuICAgICAgICB0aGlzLnN0YXJ0UmVxdWVzdCA9IGZ1bmM7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgaGVhZGVycyhoZWFkZXJzKSB7XFxuICAgICAgICB0aGlzLm9wdGlvbnMuaGVhZGVycyA9IGhlYWRlcnMgfHwgdm9pZCAwO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIHN1Y2Nlc3Moc3VjY2Vzc0NhbGxiYWNrKSB7XFxuICAgICAgICBpZiAodHlwZW9mIHN1Y2Nlc3NDYWxsYmFjayAhPT0gXFxcImZ1bmN0aW9uXFxcIikgcmV0dXJuIHRoaXM7XFxuICAgICAgICB0aGlzLnN1Y2Nlc3NDYWxsYmFjayA9IHN1Y2Nlc3NDYWxsYmFjaztcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBlcnJvcihlcnJvckNhbGxiYWNrKSB7XFxuICAgICAgICBpZiAodHlwZW9mIGVycm9yQ2FsbGJhY2sgIT09IFxcXCJmdW5jdGlvblxcXCIpIHJldHVybiB0aGlzO1xcbiAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjaztcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBlcnJvclR5cGUoZXJyb3JUeXBlQ2FsbGJhY2spIHtcXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JUeXBlQ2FsbGJhY2sgIT09IFxcXCJmdW5jdGlvblxcXCIpIHJldHVybiB0aGlzO1xcbiAgICAgICAgdGhpcy5lcnJvclR5cGVDYWxsYmFjayA9IGVycm9yVHlwZUNhbGxiYWNrO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIGVycm9yV2l0aFJldHJ5KHJldHJ5Q291bnQsIGVycm9yQ2FsbGJhY2tXaXRoUmV0cnkpIHtcXG4gICAgICAgIGlmICh0eXBlb2YgcmV0cnlDb3VudCA9PT0gXFxcImZ1bmN0aW9uXFxcIiAmJiB0eXBlb2YgZXJyb3JDYWxsYmFja1dpdGhSZXRyeSA9PT0gXFxcInVuZGVmaW5lZFxcXCIpIHtcXG4gICAgICAgICAgICBlcnJvckNhbGxiYWNrV2l0aFJldHJ5ID0gcmV0cnlDb3VudDtcXG4gICAgICAgICAgICByZXRyeUNvdW50ID0gMTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JDYWxsYmFja1dpdGhSZXRyeSAhPT0gXFxcImZ1bmN0aW9uXFxcIil7XFxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgICB9XFxuICAgICAgICB0aGlzLnJldHJ5Q291bnQgPSBOdW1iZXIocmV0cnlDb3VudCk7XFxuICAgICAgICB0aGlzLmVycm9yQ2FsbGJhY2tXaXRoUmV0cnkgPSBlcnJvckNhbGxiYWNrV2l0aFJldHJ5O1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIHN0YXJ0KHRvSnNvbikge1xcbiAgICAgICAgbGV0IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMpO1xcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmJvZHkgPT09IFxcXCJvYmplY3RcXFwiICYmIHRoaXMuX2JvZHlUb1N0cmluZykge1xcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuYm9keSk7XFxuICAgICAgICB9XFxuICAgICAgICB2YXIgcmVzID0gSlNPTi5wYXJzZSh0aGlzLnN0YXJ0UmVxdWVzdCh0aGlzLnVybCwgb3B0aW9ucykpO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlcy5zdGF0dXNDb2RlIDw9IDMwMCkge1xcbiAgICAgICAgICAgICAgICBsZXQgYm9keSA9IHJlcy5ib2R5O1xcbiAgICAgICAgICAgICAgICBpZiAodG9Kc29uKSB7XFxuICAgICAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdWNjZXNzQ2FsbGJhY2soYm9keSwgcmVzKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoU3RyaW5nKHJlcy5zdGF0dXNDb2RlKSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgZXJyID0gdGhpcy5lcnJvclR5cGVDYWxsYmFjayhlcnIsIHJlcyk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcblxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAodGhpcy5yZXRyeUNvdW50KSB7XFxuICAgICAgICAgICAgICAgIFxcbiAgICAgICAgICAgICAgICBsZXQgdHJ5UmVzdWx0ID0gdGhpcy5lcnJvckNhbGxiYWNrV2l0aFJldHJ5KGVyciwgcmVzLCB0aGlzKTtcXG4gICAgICAgICAgICAgICAgaWYgKHRyeVJlc3VsdCkge1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXRyeUNvdW50LS07XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydCh0b0pzb24pO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXRyeUNvdW50ID0gMDtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yQ2FsbGJhY2soZXJyLCByZXMpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JDYWxsYmFjayhlcnIsIHJlcyk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICBzZXRPcHRpb25zKG9wdGlvbnMpIHtcXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHtcXG4gICAgICAgICAgICB3aXRoSGVhZGVyczogdHJ1ZVxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgbWVyZ2VIZWFkQW5kQm9keShvcHRpb25zKSB7XFxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcXG4gICAgICAgIHRoaXMub3B0aW9ucy5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMuaGVhZGVycywgb3B0aW9ucy5oZWFkZXJzKTtcXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmJvZHkgPT09IFxcXCJvYmplY3RcXFwiICYmIHR5cGVvZiBvcHRpb25zLmJvZHkgPT09IFxcXCJvYmplY3RcXFwiKSB7XFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJvZHkgPSBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucy5ib2R5LCBvcHRpb25zLmJvZHkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH1cXG59KTtcXG5cXG5PYmplY3QuYXNzaWduKGh0dHBSZXF1ZXN0LCB7XFxuICAgIGZldGNoKHVybCwgb3B0aW9ucykge1xcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpO1xcbiAgICB9LFxcbiAgICBwb3N0KHVybCwgb3B0aW9ucykge1xcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCk7XFxuICAgIH0sXFxuICAgIHJlcXVlc3QodXJsLCBvcHRpb25zKSB7XFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykuc2V0U3RhcnRSZXF1ZXN0RnVuYyhyZXF1ZXN0KTtcXG4gICAgfSxcXG4gICAgcG9zdFJlcXVlc3QodXJsLCBvcHRpb25zKSB7XFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0UmVxdWVzdCk7XFxuICAgIH0sXFxuICAgIGZldGNoQ29va2llKHVybCwgb3B0aW9ucykge1xcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMoZmV0Y2hDb29raWUpO1xcbiAgICB9XFxufSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJUb2tlbui3r+W+hFwiLFwicGF0aFwiOlwidG9rZW5QYXRoXCIsXCJydWxlXCI6XCIkLmV4cG9ydHM9e1xcbiAgICBcXFwib3BlblRva2Vuc0ZpbGVwYXRoXFxcIjogXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvTG95RGdJay9hbGlPcGVuVG9rZW4uanNvblxcXCIsXFxuICAgIFxcXCJhbGlUb2tlbnNGaWxlcGF0aFxcXCI6IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0xveURnSWsvYWxpVG9rZW4uanNvblxcXCJcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlvLnlvLlwbGF55bel5YW3XCIsXCJwYXRoXCI6XCJkYW5tdVwiLFwicnVsZVwiOlwianM6XFxubGV0IGJhc2ljVXJsID0gXFxcImh0dHBzOi8vYXBpLmRhbmRhbnBsYXkubmV0L1xcXCI7XFxubGV0IHNldmVQYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvZGFubXUvXFxcIjtcXG4kLmV4cG9ydHMuZ2V0RGFuTXUgPSBmdW5jdGlvbihrZXkpIHtcXG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmVxdWVzdChiYXNpY1VybCArIFxcXCJhcGkvdjIvc2VhcmNoL2VwaXNvZGVzP2FuaW1lPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoZGVjb2RlVVJJQ29tcG9uZW50KGtleSkpKSk7XFxufVxcblxcbmZ1bmN0aW9uIGVuY29kZUh0bWwocykge1xcbiAgICBsZXQgUkVHWF9IVE1MX0VOQ09ERSA9IC/igJx8JnzigJl8XFxcXHUwMDNDfD58W1xcXFx4MDAtXFxcXHgyMF18W1xcXFx4N0YtXFxcXHhGRl18W1xcXFx1MDEwMC1cXFxcdTI3MDBdL2c7XFxuICAgIHJldHVybiBzLnJlcGxhY2UoUkVHWF9IVE1MX0VOQ09ERSwgZnVuY3Rpb24oJDApIHtcXG4gICAgICAgIHZhciBjID0gJDAuY2hhckNvZGVBdCgwKSxcXG4gICAgICAgICAgICByID0gW1xcXCImI1xcXCJdO1xcbiAgICAgICAgYyA9IChjID09IDB4MjApID8gMHhBMCA6IGM7XFxuICAgICAgICByLnB1c2goYyk7XFxuICAgICAgICByLnB1c2goXFxcIjtcXFwiKTtcXG4gICAgICAgIHJldHVybiByLmpvaW4oXFxcIlxcXCIpO1xcbiAgICB9KTtcXG59XFxuXFxuXFxuXFxuLy8w6buY6K6kIDHnroDkvZMgMue5geS9k1xcbiQuZXhwb3J0cy5kb3dubG9hZERhbk11ID0gZnVuY3Rpb24oZXBpc29kZUlkLCBuYW1lKSB7XFxuICAgIGxldCBkYW5NdURhdGEgPSBKU09OLnBhcnNlKHJlcXVlc3QoYnVpbGRVcmwoYmFzaWNVcmwgKyBcXFwiYXBpL3YyL2NvbW1lbnQvXFxcIiArIGVwaXNvZGVJZCwge1xcbiAgICAgICAgd2l0aFJlbGF0ZWQ6IHRydWUsXFxuICAgICAgICBjaENvbnZlcnQ6IDFcXG4gICAgfSkpKTtcXG4gICAgbGV0IGRNY29udGV4dCA9IFxcXCJcXFwiO1xcbiAgICBmb3IgKGxldCBjb21tZW50IG9mIGRhbk11RGF0YS5jb21tZW50cykge1xcbiAgICAgICAgLy9kTWNvbnRleHQgKz0gYDxkIHA9XFxcIiR7TWF0aC5yb3VuZCh0aW1lcG9pbnQpfSwke2N0fSwke3NpemV9LCR7Y29sb3J9LDBcXFwiPiR7Y29udGVudH08L2Q+XFxcXG5gO1xcbiAgICAgICAgbGV0IHBhcmFtVGV4dCA9IGNvbW1lbnQucDtcXG4gICAgICAgIGxldCBjb21tZW50VGV4dCA9IGNvbW1lbnQubTtcXG4gICAgICAgIGlmIChwYXJhbVRleHQgPT0gbnVsbCB8fCBjb21tZW50VGV4dCA9PSBudWxsKSBjb250aW51ZTtcXG4gICAgICAgIGxldCBwYXJhbXMgPSBwYXJhbVRleHQuc3BsaXQoXFxcIixcXFwiKTtcXG4gICAgICAgIGxldCBwYXJhbXNUID0gW107XFxuICAgICAgICBmb3IgKGxldCBpIGluIHBhcmFtcykge1xcbiAgICAgICAgICAgIGlmIChpID09IDMpIHtcXG4gICAgICAgICAgICAgICAgLy/popzoibLlgLzkuLow5pe277yM6buY6K6k6K6+572u5Li655m96ImyXFxuICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbaV0gPT0gXFxcIjBcXFwiIHx8IHBhcmFtc1tpXSA9PSBcXFwiLTFcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNULnB1c2goXFxcIjE2Nzc3MjE1XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxcbiAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChpID09IDIpIHtcXG4gICAgICAgICAgICAgICAgcGFyYW1zVC5wdXNoKFxcXCIyNVxcXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBwYXJhbXNULnB1c2gocGFyYW1zW2ldKTtcXG5cXG4gICAgICAgIH1cXG4gICAgICAgIHBhcmFtc1QucHVzaChcXFwiMFxcXCIsIFxcXCIwXFxcIiwgXFxcIjBcXFwiKTtcXG4gICAgICAgIGRNY29udGV4dCArPSBgPGQgcD1cXFwiJHtwYXJhbXNULmpvaW4oJywnKX1cXFwiPiR7ZW5jb2RlSHRtbChjb21tZW50VGV4dCl9PC9kPlxcXFxuYDtcXG4gICAgfVxcbiAgICBpZiAoIWRNY29udGV4dCkgcmV0dXJuO1xcbiAgICBkTWNvbnRleHQgPSBgPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIiBlbmNvZGluZz1cXFwiVVRGLThcXFwiPz48aT5cXFxcbiR7ZE1jb250ZXh0fTwvaT5gO1xcbiAgICBsZXQgcGF0aCA9IHNldmVQYXRoICsgbmFtZS5yZXBsYWNlKC9cXFxcLy9nLFxcXCJfXFxcIikgKyBcXFwiX1xcXCIgKyBlcGlzb2RlSWQgKyBcXFwiLnhtbFxcXCI7XFxuICAgIHdyaXRlRmlsZShwYXRoLCBkTWNvbnRleHQpO1xcbiAgICByZXR1cm4gcGF0aDtcXG59XFxuJC5leHBvcnRzLmdldExvY2FsRGFuTXUgPSBmdW5jdGlvbihlcGlzb2RlSWQsIG5hbWUpIHtcXG4gICAgbGV0IHBhdGggPSBzZXZlUGF0aCArIG5hbWUucmVwbGFjZSgvXFxcXC8vZyxcXFwiX1xcXCIpICsgXFxcIl9cXFwiICsgZXBpc29kZUlkICsgXFxcIi54bWxcXFwiO1xcbiAgICBpZiAoZmlsZUV4aXN0KHBhdGgpKSB7XFxuICAgICAgICByZXR1cm4gcGF0aDtcXG4gICAgfVxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW8ueW5leaQnOe0oibliqDovb1cIixcInBhdGhcIjpcImxvYWREbVwiLFwicnVsZVwiOlwianM6XFxubGV0IGQgPSBbXTtcXG5sZXQgb25seURvd25sb2FkID0gISFNWV9QQVJBTVMub25seURvd25sb2FkO1xcbmlmIChvbmx5RG93bmxvYWQpIHtcXG4gICAgYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiB7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgIH0pO1xcbn1cXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxuICAgIHRpdGxlOiBcXFwiPGZvbnQgY29sb3I9J0dyYXknPuKdl+WFs+S6jjxicj48c21hbGw+IOWGhee9ruaQnOe0olDmlbDmja7mnaXmupDkuo5b5by55by5cGxheV08L3NtYWxsPjwvZm9udD5cXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcbmxldCBrZXkgPSBNWV9QQVJBTVMubmFtZSB8fCBnZXRNeVZhcihcXFwic1xcXCIpIHx8IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwidGl0bGVcXFwiLCBcXFwiXFxcIikpIHx8IFxcXCJcXFwiO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5YaF572u5pCc57SiUFxcXCIsXFxuICAgIHVybDogJChrZXksIFxcXCLor7fmkJzntKLnlarliaflkI3np7BcXFwiKS5pbnB1dCgoTVlfUEFSQU1TKSA9PiB7XFxuICAgICAgICBzZXRQYWdlUGFyYW1zKE9iamVjdC5hc3NpZ24oTVlfUEFSQU1TLCB7XFxuICAgICAgICAgICAgbmFtZTogaW5wdXQsXFxuICAgICAgICB9KSk7XFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICB9LCBNWV9QQVJBTVMpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWGhee9ruaQnOe0olRcXFwiLFxcbiAgICB1cmw6ICQoa2V5LCBcXFwi5qC85byP77ya5pCc57Si5YWz6ZSu6K+NW+Wbnui9pl3pm4bmlbBcXFwiKS5pbnB1dCgob25seURvd25sb2FkKSA9PiB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIHNob3dMb2FkaW5nKFxcXCLmraPlnKjmkJzntKLlubbkuIvovb0uLi5cXFwiKTtcXG4gICAgICAgICAgICBsZXQgW25hbWUsIHBvc10gPSBpbnB1dC5zcGxpdChcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgICAgICBpZiAoIW5hbWUgfHwgIXBvcykge1xcbiAgICAgICAgICAgICAgICB0aHJvdyBcXFwi5qC85byP6ZSZ6K+vXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHVybEluZm8gPSBmZXRjaChidWlsZFVybChcXFwiaHR0cHM6Ly9henVyZS5sZXVzZS50b3Avc2VhcmNoZG1cXFwiLCB7XFxuICAgICAgICAgICAgICAgIHBhcmFtczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIm5hbWVcXFwiOiBuYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBvc1xcXCI6IHBvc1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgIHVybEluZm8gPSBKU09OLnBhcnNlKHVybEluZm8pO1xcbiAgICAgICAgICAgIGlmICghdXJsSW5mby51cmwpIHRocm93IFxcXCLmmoLml7bmsqHmnInmib7liLDor6Xop4bpopHnmoTlvLnluZVcXFwiO1xcbiAgICAgICAgICAgIGxldCB4bWwgPSBmZXRjaChidWlsZFVybChcXFwiaHR0cHM6Ly9henVyZS5sZXVzZS50b3AvZGFubXVcXFwiLCB7XFxuICAgICAgICAgICAgICAgIHBhcmFtczogdXJsSW5mb1xcbiAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgIGlmICgheG1sKSB7XFxuICAgICAgICAgICAgICAgIHRocm93IFxcXCLov5jmsqHmnInlvLnluZXlk59+XFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHBhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9jYWNoZS9kYW5tdS9cXFwiICsgdXJsSW5mby5wbGF0Zm9ybSArIFxcXCJfXFxcIiArIG5hbWUgKyBcXFwiX1xcXCIgKyBwb3MgKyBcXFwiLnhtbFxcXCI7XFxuICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGgsICc8P3htbCB2ZXJzaW9uPVxcXCIxLjBcXFwiIGVuY29kaW5nPVxcXCJVVEYtOFxcXCI/PlxcXFxuJyArIHhtbCk7XFxuICAgICAgICAgICAgaWYgKG9ubHlEb3dubG9hZCkgcmV0dXJuIFxcXCJ0b2FzdDovL+S4i+i9veWujOaIkFxcXCI7XFxuICAgICAgICAgICAgcmVmcmVzaFZpZGVvVXJsKHtcXG4gICAgICAgICAgICAgICAgZGFubXU6IHBhdGhcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yqg6L295a6M5oiQXFxcIjtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgZS50b1N0cmluZygpO1xcbiAgICAgICAgfVxcbiAgICB9LCBvbmx5RG93bmxvYWQpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcImRt55uS5a2Q5pCc57SiXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChrZXksIG9ubHlEb3dubG9hZCkgPT4ge1xcbiAgICAgICAgbGV0IGRtID0gZ2V0VmFyKFxcXCJkbV9zaGFyZVxcXCIpO1xcbiAgICAgICAgaWYgKGRtICYmICFvbmx5RG93bmxvYWQpIHtcXG4gICAgICAgICAgICBjbGVhclZhcihcXFwiZG1fc2hhcmVcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoVmlkZW9Vcmwoe1xcbiAgICAgICAgICAgICAgICBkYW5tdTogZG1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yqg6L295a6M5oiQXFxcIjtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuICQoa2V5LCBcXFwiZG3nm5LlrZDmkJzntKJcXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLkuIvovb3lrozmiJDlvLnluZXlkI7or7fph43mlrDngrnlh7vmkJzntKJcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3NlYXJjaD9ydWxlPWRt55uS5a2QJnM9XFxcIiArIGlucHV0O1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICB9LCBrZXksIG9ubHlEb3dubG9hZCksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIlxcbn0pO1xcblxcbmZ1bmN0aW9uIHNlYXJjaChkLCBuYW1lKSB7XFxuICAgIGNvbnN0IGRhbm11ID0gJC5yZXF1aXJlKFxcXCJkYW5tdVxcXCIpO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxuICAgIH0pO1xcbiAgICBsZXQgZG1MaXN0ID0gZGFubXUuZ2V0RGFuTXUobmFtZSk7XFxuXFxuICAgIGZvciAobGV0IGFuaW1lIG9mIGRtTGlzdC5hbmltZXMpIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGFuaW1lLmFuaW1lVGl0bGUsXFxuICAgICAgICAgICAgZGVzYzogYW5pbWUudHlwZURlc2NyaXB0aW9uLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIlxcXCIsIFxcXCLor7fovpPlhaXkuIvovb3ojIPlm7QoMSxcXFwiICsgYW5pbWUuZXBpc29kZXMubGVuZ3RoICsgXFxcIilcXFwiKS5pbnB1dCgoYW5pbWVUaXRsZSwgZXBpc29kZXMpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IFthLCBiXSA9IGlucHV0LnNwbGl0KC8sfO+8jC8pO1xcbiAgICAgICAgICAgICAgICBhID0gTnVtYmVyKGEpLCBiID0gTnVtYmVyKGIpO1xcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGEpIHx8IE51bWJlci5pc05hTihiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+aMieagvOW8j+i+k+WFpeaVsOWtl1xcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKGEgPCAxIHx8IGIgPiBlcGlzb2Rlcy5sZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/or7fovpPlhaXop4TlrprojIPlm7TlhoXnmoTmlbDlrZdcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGNvbnN0IGRhbm11ID0gJC5yZXF1aXJlKFxcXCJkYW5tdVxcXCIpO1xcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGEgLSAxLCBqID0gMTsgaSA8IGI7IGkrKywgaisrKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVwaXNvZGUgPSBlcGlzb2Rlc1tpXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG1UaXRsZSA9IGFuaW1lVGl0bGUgKyBcXFwiX1xcXCIgKyBlcGlzb2RlLmVwaXNvZGVUaXRsZTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93TG9hZGluZyhcXFwi5q2j5Zyo5LiL6L2977yaXFxcIiArIGVwaXNvZGUuZXBpc29kZVRpdGxlICsgXFxcIlxcXFx0KFxcXCIgKyBqICsgXFxcIi9cXFwiICsgKGIgLSBhICsgMSkgKyBcXFwiKVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhbm11LmRvd25sb2FkRGFuTXUoZXBpc29kZS5lcGlzb2RlSWQsIGRtVGl0bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5ZOm5ZOm5LiL6L295aSx6LSlLi4uXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LiL6L295a6M5oiQXFxcIjtcXG4gICAgICAgICAgICB9LCBhbmltZS5hbmltZVRpdGxlLCBhbmltZS5lcGlzb2RlcyksXFxuICAgICAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vbW92aWUvMTQuc3ZnXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZm9yIChsZXQgZXBpc29kZSBvZiBhbmltZS5lcGlzb2Rlcykge1xcbiAgICAgICAgICAgIGxldCBkbVRpdGxlID0gYW5pbWUuYW5pbWVUaXRsZSArIFxcXCJfXFxcIiArIGVwaXNvZGUuZXBpc29kZVRpdGxlO1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBlcGlzb2RlLmVwaXNvZGVUaXRsZSxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKGVwaXNvZGUuZXBpc29kZUlkKS5sYXp5UnVsZSgodXJsLCB0aXRsZSwgb25seURvd25sb2FkKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYW5tdSA9ICQucmVxdWlyZShcXFwiZGFubXVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gZGFubXUuZ2V0TG9jYWxEYW5NdShpbnB1dCwgdGl0bGUpIHx8IGRhbm11LmRvd25sb2FkRGFuTXUoaW5wdXQsIHRpdGxlKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChvbmx5RG93bmxvYWQpIHJldHVybiBcXFwidG9hc3Q6Ly/kuIvovb3lrozmiJBcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhbm11VGV4dCA9IGZldGNoKHBhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYW5tdVRleHQpIHJldHVybiBcXFwidG9hc3Q6Ly/ov5jmsqHmnInlvLnluZXlk59+XFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hWaWRlb1VybCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZGFubXU6IHBhdGhcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yqg6L295a6M5oiQXFxcIjtcXG4gICAgICAgICAgICAgICAgfSwgTVlfUEFSQU1TLmR1cmwsIGRtVGl0bGUsIG9ubHlEb3dubG9hZCksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuW8uuWItuS4i+i9vVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKGVwaXNvZGVUaXRsZSwgZXBpc29kZUlkKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dMb2FkaW5nKFxcXCLor7fnrYnlvoVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGFubXUgPSAkLnJlcXVpcmUoXFxcImRhbm11XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhbm11LmRvd25sb2FkRGFuTXUoZXBpc29kZUlkLCBlcGlzb2RlVGl0bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6YeN5paw5LiL6L295a6M5oiQ77yM5Y2V5Ye75oyC6L2944CCXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBkbVRpdGxlLCBlcGlzb2RlLmVwaXNvZGVJZClcXG4gICAgICAgICAgICAgICAgICAgIH1dXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgaWYgKCFkbUxpc3QuYW5pbWVzLmxlbmd0aCkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuayoeacieaJvuWIsOS4jltcXFwiICsgbmFtZSArIFxcXCJd55u45YWz55qE5by55bmVXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBkZXNjOiBcXFwi5pCc5LiN5Yiw5oCO5LmI5Yqe77yfXFxcXG7mo4Dmn6XlkI3np7DmmK/lkKbmraPnoa7vvJvlj6/ku6XlsJ3or5XliKDpmaTpg6jliIbpmZDlrpror43vvIzlpoLnrKzkuIDlraPnrYnvvJvogIzkuJTlj6rog73mkJzntKLnlarliaflk6bvvIHlhbbku5blvLnluZXlj6/nlKhkbeebkuWtkOOAglxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxubGV0IG5hbWUgPSBnZXRQYXJhbShcXFwibmFtZVxcXCIsIE1ZX1BBUkFNUy5uYW1lKTtcXG5pZiAobmFtZSkge1xcbiAgICB0cnkge1xcbiAgICAgICAgc2VhcmNoKGQsIG5hbWUpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCcRVJST1LigJ3igJ1cXFwiLFxcbiAgICAgICAgICAgIGRlc2M6IGUudG9TdHJpbmcoKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWFrOW8gOW3peWFt1wiLFwicGF0aFwiOlwiYWxpVXRpbFwiLFwicnVsZVwiOlwiLy/mj5Dkvpvnu5nop4TliJnkvb/nlKjnmoTluLjnlKjlh73mlbBcXG4kLmV4cG9ydHMgPSB7XFxuICAgIGNoZWNrYWxpKHJlYWx1cmwpIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgaWYgKHJlYWx1cmwuaW5jbHVkZXMoXFxcImNvbS9zL1xcXCIpICYmIHJlYWx1cmwgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHNoYXJlSWQgPSByZWFsdXJsLnNwbGl0KFxcXCI/XFxcIilbMF0uc3BsaXQoXFxcIi9cXFwiKVs0XTtcXG4gICAgICAgICAgICAgICAgbGV0IHNoYXJlID0gZmV0Y2goXFxcImh0dHBzOi8vYXBpLmFsaXl1bmRyaXZlLmNvbS9hZHJpdmUvdjMvc2hhcmVfbGluay9nZXRfc2hhcmVfYnlfYW5vbnltb3VzXFxcIiwge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBQQ19VQSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwic2hhcmVfaWRcXFwiOiBzaGFyZUlkXFxuICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIGlmIChzaGFyZS5pbmNsdWRlcyhcXFwic2hhcmVfbGluayBpc1xcXCIpIHx8IHNoYXJlLmluY2x1ZGVzKFxcXCJzaGFyZV9saW5rIGNhbm5vdFxcXCIpKSByZXR1cm4gZmFsc2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge31cXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICB9LFxcbiAgICBieXRlc1RvU2l6ZShzaXplKSB7XFxuICAgICAgICBpZiAoIXNpemUpIHtcXG4gICAgICAgICAgICByZXR1cm4gJzAnO1xcbiAgICAgICAgfVxcbiAgICAgICAgY29uc3QgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXTtcXG4gICAgICAgIGxldCBpID0gMDtcXG4gICAgICAgIHdoaWxlIChzaXplID49IDEwMjQpIHtcXG4gICAgICAgICAgICBzaXplIC89IDEwMjQ7XFxuICAgICAgICAgICAgaSsrO1xcbiAgICAgICAgfVxcbiAgICAgICAgc2l6ZSA9IGkgPyBOdW1iZXIoc2l6ZS50b0ZpeGVkKDIpKSA6IHNpemU7XFxuICAgICAgICByZXR1cm4gYCR7c2l6ZX0gJHt1bml0c1tpXX1gO1xcbiAgICB9LFxcbiAgICBnZXRDcnlwdG9KUygpIHtcXG4gICAgICAgIGlmICh0eXBlb2YgQ3J5cHRvSlMgPT09IFxcXCJ1bmRlZmluZWRcXFwiKSB7XFxuICAgICAgICAgICAgZXZhbChnZXRDcnlwdG9KUygpKTtcXG4gICAgICAgICAgICByZXR1cm4gQ3J5cHRvSlM7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gQ3J5cHRvSlM7XFxuICAgIH0sXFxuICAgIG1hdGNoQWxpVXJsKHRleHQsIGlzRykge1xcbiAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiYWxpdGVzdFxcXCIpLm1hdGNoQWxpVXJsKHRleHQsIGlzRyk7XFxuICAgIH0sXFxuICAgIGdldElQdjRBZGRyZXNzKCkge1xcbiAgICAgICAgY29uc3QgTmV0d29ya0ludGVyZmFjZSA9IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGZvciAobGV0IGVuID0gTmV0d29ya0ludGVyZmFjZS5nZXROZXR3b3JrSW50ZXJmYWNlcygpOyBlbi5oYXNNb3JlRWxlbWVudHMoKTspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGludGYgPSBlbi5uZXh0RWxlbWVudCgpO1xcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBlbnVtSXBBZGRyID0gaW50Zi5nZXRJbmV0QWRkcmVzc2VzKCk7IGVudW1JcEFkZHIuaGFzTW9yZUVsZW1lbnRzKCk7KSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgaW5ldEFkZHJlc3MgPSBlbnVtSXBBZGRyLm5leHRFbGVtZW50KCk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWluZXRBZGRyZXNzLmlzTG9vcGJhY2tBZGRyZXNzKCkgJiYgaW5ldEFkZHJlc3MgaW5zdGFuY2VvZiBqYXZhLm5ldC5JbmV0NEFkZHJlc3MpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGluZXRBZGRyZXNzLmdldEhvc3RBZGRyZXNzKCkpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcXG4gICAgICAgICAgICBsb2coZXgudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcIjAuMC4wLjBcXFwiO1xcbiAgICB9XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5by55bmV5om56YeP5oyC6L29XCIsXCJwYXRoXCI6XCJkbU1vdW50XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZCA9IFtdO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgKCkgPT4gY2xlYXJNeVZhcihcXFwiZGxsYXN0VGltZVxcXCIpKTtcXG5zZXRQYWdlVGl0bGUoXFxcIuW8ueW5leaMgui9vTpcXFwiKyhNWV9QQVJBTVMuZm9sZGVyTmFtZXx8XFxcIj9cXFwiKSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmuIXnqbrmjILovb3liJfooahcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgY2xlYXJNeVZhcihcXFwiZG1saXN0XFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbn0pO1xcbmlmKCFNWV9QQVJBTVMuYXV0b21hdGljYWRkKXtcXG4gICAgTVlfUEFSQU1TLmF1dG9tYXRpY2FkZCA9IGdldEl0ZW0oXFxcImF1dG9tYXRpY2FkZFxcXCIsXFxcIjFcXFwiKTtcXG4gICAgc2V0UGFnZVBhcmFtcyhNWV9QQVJBTVMpO1xcbn1cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuajgOa1i+aWsOWinjpcXFwiK1tcXFwi5YWz6ZetXFxcIixcXFwi5byA5ZCvXFxcIl1bTVlfUEFSQU1TLmF1dG9tYXRpY2FkZHx8XFxcIjBcXFwiXSxcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCh2KSA9PiB7XFxuICAgICAgIHNldEl0ZW0oXFxcImF1dG9tYXRpY2FkZFxcXCIsIHYuYXV0b21hdGljYWRkPT09XFxcIjFcXFwiP1xcXCIwXFxcIjpcXFwiMVxcXCIpO1xcbiAgICAgICB2LmF1dG9tYXRpY2FkZCA9IHVuZGVmaW5lZDtcXG4gICAgICAgc2V0UGFnZVBhcmFtcyh2KTtcXG4gICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCBNWV9QQVJBTVMpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLkuIvovb3lvLnluZVcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9sb2FkRG0jbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIG9ubHlEb3dubG9hZDogdHJ1ZVxcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLlt7LmjILovb1cXFwiLmJpZygpLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgbGV0IGRtbGlzdCA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJkbWxpc3RcXFwiLCBbXSk7XFxuICAgICAgICBsZXQgRmlsZVNvcnRpbmcgPSAkLnJlcXVpcmUoXFxcIkZpbGVTb3J0aW5nXFxcIik7XFxuICAgICAgICBkbWxpc3Quc29ydCgoYSwgYikgPT4gRmlsZVNvcnRpbmcubmFtZUNvbXBhcmUoYSwgYikpO1xcbiAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcImRtbGlzdFxcXCIsIGRtbGlzdCk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5o6S5bqP5a6M5oiQXFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG59KTtcXG5sZXQgZmlsZSA9ICQucmVxdWlyZShcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3dlaXN5ci9qcy9maWxlLmpzP3Y9MVxcXCIpO1xcbmxldCBkbWxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiZG1saXN0XFxcIiwgW10pO1xcblxcbmZvciAobGV0IGkgPSAwOyBpIDwgZG1saXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgIGxldCBkbW5hbWUgPSBkbWxpc3RbaV07XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIltcXFwiICsgKGkgKyAxKSArIFxcXCJdXFxcXHRcXFwiICsgZG1uYW1lLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGRtbGlzdCA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJkbWxpc3RcXFwiLCBbXSk7XFxuICAgICAgICAgICAgZG1saXN0LnNwbGljZShpLCAxKTtcXG4gICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwiZG1saXN0XFxcIiwgZG1saXN0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIGkpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxuICAgIH0pO1xcbn1cXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIuacrOWcsOacquaMgui9vVxcXCIuYmlnKCksXFxuICAgIHVybDogJChcXFwi5piv5ZCm5riF6Zmk5omA5pyJ5pys5Zyw5by55bmV5paH5Lu2P1xcXFxuKOW8ueW5leaWh+S7tuavj+S4ieWkqeS8muiHquWKqOa4hemZpClcXFwiKS5jb25maXJtKCgpID0+IHtcXG4gICAgICAgIGxldCBmaWxlID0gJC5yZXF1aXJlKFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vd2Vpc3lyL2pzL2ZpbGUuanM/dj0xXFxcIik7XFxuICAgICAgICBmaWxlLmRlbGV0ZUZpbGVzKGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvZGFubXUvXFxcIikuc2xpY2UoNykpO1xcbiAgICAgICAgY2xlYXJNeVZhcihcXFwiZG1saXN0XFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5Yig6ZmkXFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG59KTtcXG5sZXQgZG1MaXN0UGF0aCA9IGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvZGFubXUvXFxcIikuc2xpY2UoNyk7XFxubGV0IGZpbGVMaXN0ID0gZmlsZS5nZXRGaWxlUGF0aChkbUxpc3RQYXRoLCBcXFwiZmlsZVxcXCIsIFxcXCIueG1sXFxcIik7XFxubGV0IGxhc3RUaW1lID0gMDtcXG5cXG5mb3IgKGxldCBpID0gMDsgaSA8IGZpbGVMaXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgIGxldCBkbWZpbGUgPSBmaWxlTGlzdFtpXTtcXG4gICAgbGFzdFRpbWUgPSBNYXRoLm1heChsYXN0VGltZSwgZG1maWxlLmxhc3RNb2RpZmllZCk7XFxuICAgIGlmIChkbWxpc3QuaW5jbHVkZXMoZG1maWxlLm5hbWUpKSBjb250aW51ZTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBkbWZpbGUubmFtZSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgobmFtZSkgPT4ge1xcbiAgICAgICAgICAgIGxldCBkbWxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiZG1saXN0XFxcIiwgW10pO1xcbiAgICAgICAgICAgIGlmICghZG1saXN0LmluY2x1ZGVzKG5hbWUpKSB7XFxuICAgICAgICAgICAgICAgIGRtbGlzdC5wdXNoKG5hbWUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwiZG1saXN0XFxcIiwgZG1saXN0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIGRtZmlsZS5uYW1lKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbiAgICB9KTtcXG59XFxubGV0IGxhc3RSZWNvcmQgPSBOdW1iZXIoZ2V0TXlWYXIoXFxcImRsbGFzdFRpbWVcXFwiLCBcXFwiLTFcXFwiKSk7XFxuXFxuaWYgKE1ZX1BBUkFNUy5hdXRvbWF0aWNhZGQ9PT1cXFwiMVxcXCImJmxhc3RSZWNvcmQhPS0xJiZsYXN0UmVjb3JkIDwgbGFzdFRpbWUpIHtcXG4gICAgY29uZmlybSh7XFxuICAgICAgICB0aXRsZTogXFxcIuaWsOW8ueW5leaWh+S7tlxcXCIsXFxuICAgICAgICBjb250ZW50OiBcXFwi5qOA5p+l5Yiw5paw5LiL6L2955qE5by55bmV5piv5ZCm5YWo6YOo5oyC6L2977yfXFxcIixcXG4gICAgICAgIGNvbmZpcm06ICQudG9TdHJpbmcoKGxhc3RSZWNvcmQsIGRtTGlzdFBhdGgpID0+IHtcXG4gICAgICAgICAgICBsZXQgZmlsZSA9ICQucmVxdWlyZShcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3dlaXN5ci9qcy9maWxlLmpzP3Y9MVxcXCIpO1xcbiAgICAgICAgICAgIGxldCBmaWxlTGlzdCA9IGZpbGUuZ2V0RmlsZVBhdGgoZG1MaXN0UGF0aCwgXFxcImZpbGVcXFwiLCBcXFwiLnhtbFxcXCIpO1xcbiAgICAgICAgICAgIGxldCBkbWxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiZG1saXN0XFxcIiwgW10pO1xcbiAgICAgICAgICAgIGZpbGVMaXN0LmZvckVhY2godiA9PiB7XFxuICAgICAgICAgICAgICAgIGlmICghZG1saXN0LmluY2x1ZGVzKHYubmFtZSkmJnYubGFzdE1vZGlmaWVkID4gbGFzdFJlY29yZCkge1xcbiAgICAgICAgICAgICAgICAgICAgZG1saXN0LnB1c2godi5uYW1lKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJkbWxpc3RcXFwiLCBkbWxpc3QpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5oyC6L295oiQ5Yqf44CCXFxcIjtcXG4gICAgICAgIH0sIGxhc3RSZWNvcmQsIGRtTGlzdFBhdGgpLFxcbiAgICB9KTtcXG59XFxuaWYobGFzdFRpbWU+PTApe1xcbiAgICBwdXRNeVZhcihcXFwiZGxsYXN0VGltZVxcXCIsIFxcXCJcXFwiICsgbGFzdFRpbWUpO1xcbn1cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLkuLvpobXlpITnkIZcIixcInBhdGhcIjpcIk1haW5cIixcInJ1bGVcIjpcImlmIChnZXRJdGVtKFxcXCJmaXJzdFxcXCIpID09IE1ZX1JVTEUudmVyc2lvbikge1xcbiAgICAkLnJlcXVpcmUoXFxcInNvdVxcXCIpO1xcbn0gZWxzZSBpZiAoTVlfUEFHRSA9PT0gMSkge1xcbiAgICBsZXQgZCA9IFtdXFxuICAgIGxldCB0aW1lID0gZ2V0SXRlbShcXFwiZmlyc3RcXFwiLCBcXFwiXFxcIikgPyA2IDogMjA7XFxuICAgIGxldCBpZCA9IERhdGUubm93KCk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnTxzdHJvbmc+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+NC4g6K+344CM5LqR55uY5ZCbLueugOOAjeeahOS6jOasoeS/ruaUueWwiumHjeS4gOS4i+WOn+eJiO+8jOiwouiwouOAgjxicj48YnI+PGI+5byA5aeL5L2/55So5pys6KeE5YiZ5Y2z5Luj6KGo6YG15a6I6KeE5YiZ5p2h5L6LPC9iPjxicj7lvZPliY3niYjmnKzvvJpcXFwiICsgTVlfUlVMRS52ZXJzaW9uLFxcbiAgICAgICAgXFxcImNvbF90eXBlXFxcIjogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSwge1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbiAgICB9LCB7XFxuICAgICAgICB0aXRsZTogdGltZSArIFxcXCLnp5LlkI7nu6fnu61cXFwiLFxcbiAgICAgICAgdXJsOiBcXFwidG9hc3Q6Ly/or7forqTnnJ/pmIXor7vku6XkuIrlhoXlrrlcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IGlkICsgXFxcInRpbWVyXFxcIlxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgc2V0UmVzdWx0KGQpO1xcbiAgICB3aGlsZSAodGltZSAhPSAwKSB7XFxuICAgICAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKDEwMDApO1xcbiAgICAgICAgdGltZSAtPSAxO1xcbiAgICAgICAgdXBkYXRlSXRlbShpZCArIFxcXCJ0aW1lclxcXCIsIHtcXG4gICAgICAgICAgICB0aXRsZTogdGltZSArIFxcXCLnp5LlkI7nu6fnu61cXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICB1cGRhdGVJdGVtKGlkICsgXFxcInRpbWVyXFxcIiwge1xcbiAgICAgICAgdGl0bGU6IFxcXCLigJzigJzmiJHlkIzmhI/ku6XkuIropoHmsYLigJ3igJ1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCh2KSA9PiB7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwiZmlyc3RcXFwiLCBTdHJpbmcodikpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aEn+iwouaCqOeahOeQhuino1xcXCI7XFxuICAgICAgICB9LCBNWV9SVUxFLnZlcnNpb24pLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbiAgICB9KTtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmjZDotaBcIixcInBhdGhcIjpcIkRvbmF0ZS52XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZCA9IFtdO1xcbnNldFBhZ2VUaXRsZShcXFwi5o2Q6LWgL+aUr+aMgVxcXCIpO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5o2Q6LWgL+aUr+aMgVxcXCIsXFxuICAgIGRlc2M6IFxcXCLov5nkuKrmjZDotaDkuI3og73kuLrkvaDluKbmnaXnibnmnYPvvIzkvYbmgqjnmoTmlK/mjIHmmK/miJHmm7TmlrDliJvkvZznmoTliqjlipvjgIJcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB1cmw6IFxcXCJ0b2FzdDovL+aEn+iwouaCqOeahOaUr+aMgVxcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcInBpY18xX2Z1bGxcXFwiLFxcbiAgICB1cmw6IFxcXCJodHRwczovL2dpdGVlLmNvbS9Mb3lEZ0lrL0xveURnSWtfUnVsZS9yYXcvbWFzdGVyLzY3ZDhmMDE4N2YwMTg2YzEucG5nXFxcIixcXG4gICAgcGljX3VybDogXFxcImh0dHBzOi8vZ2l0ZWUuY29tL0xveURnSWsvTG95RGdJa19SdWxlL3Jhdy9tYXN0ZXIvNjdkOGYwMTg3ZjAxODZjMS5wbmdcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIuWbvueJh+WKoOi9vee8k+aFouivt+eojeetiVxcXCIuc21hbGwoKS5mb250Y29sb3IoXFxcIkdyYXlcXFwiKSxcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgfVxcbn0pO1xcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIlRWQk9Y5o6o6YCBXCIsXCJwYXRoXCI6XCJ0dmJveFB1c2hcIixcInJ1bGVcIjpcImpzOlxcbihmdW5jdGlvbigpIHtcXG4gICAgbGV0IGQgPSBbXTtcXG4gICAgY29uc3Qge1xcbiAgICAgICAgcGFnZUlkLFxcbiAgICAgICAgc2hhcmVJZCxcXG4gICAgICAgIGZvbGRlck5hbWUsXFxuICAgICAgICBmaWxlSWRcXG4gICAgfSA9IE1ZX1BBUkFNUztcXG4gICAgc2V0UGFnZVRpdGxlKFxcXCJUVkJPWOaOqOmAgTpcXFwiICsgZm9sZGVyTmFtZSk7XFxuICAgIGNvbnN0IHtcXG4gICAgICAgIGFsaVRva2Vuc0ZpbGVwYXRoXFxuICAgIH0gPSAkLnJlcXVpcmUoXFxcInRva2VuUGF0aFxcXCIpO1xcbiAgICBsZXQgcmVmcmVzaFRva2VuID0gXFxcIlxcXCI7XFxuICAgIGlmICghZmlsZUV4aXN0KGFsaVRva2Vuc0ZpbGVwYXRoKSkge1xcbiAgICAgICAgdG9hc3QoXFxcIuivt+WFiOeZu+mZhueZu+W9lei0puWPt1xcXCIpO1xcbiAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICByZXR1cm47XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZWZyZXNoVG9rZW4gPSAkLnJlcXVpcmUoYWxpVG9rZW5zRmlsZXBhdGgpLnJlZnJlc2hfdG9rZW47XFxuICAgIH1cXG5cXG4gICAgZnVuY3Rpb24gZ2V0UHVzaChuYW1lLCB1cmwpIHtcXG4gICAgICAgIGxldCBwdXNoID0ge1xcbiAgICAgICAgICAgIFxcXCJzaGFyZV9pZFxcXCI6IHNoYXJlSWQsXFxuICAgICAgICAgICAgXFxcInJlZnJlc2hfdG9rZW5cXFwiOiByZWZyZXNoVG9rZW4sXFxuICAgICAgICAgICAgXFxcIm5hbWVcXFwiOiBuYW1lLFxcbiAgICAgICAgICAgIFxcXCJ1cmxcXFwiOiB1cmxcXG4gICAgICAgIH07XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9wdXNoI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5Iz9ydWxlPVhZUeaOqOmAgSZwdXNodXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkocHVzaCkpO1xcbiAgICB9XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuaOqOmAgemYv+mHjOWIhuS6q+mTvuaOpVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcHVzaCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSM/cnVsZT1YWVHmjqjpgIEmcHVzaHVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFxcXCJodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy9cXFwiICsgc2hhcmVJZCArIChmaWxlSWQgPyBcXFwiL2ZvbGRlci9cXFwiICsgZmlsZUlkIDogXFxcIlxcXCIpKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaW5oZXJpdFRpdGxlOiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgbGV0IGFsbCA9IHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5o6o6YCB5YWo6YOo5bey5Yqg6L296KeG6aKRXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpbmhlcml0VGl0bGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgZC5wdXNoKGFsbCk7XFxuICAgIGxldCBhbGxVcmxzID0gW107XFxuICAgIGxldCBsaXN0ID0gZmluZEl0ZW1zQnlDbHMoXFxcInZcXFwiICsgcGFnZUlkKTtcXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpIHx8IGxpc3QubGVuZ3RoID09PSAwKSB7XFxuICAgICAgICAvKnRvYXN0KFxcXCLov5jmsqHmnInliqDovb3lrozmiJDnmoTop4bpopFcXFwiKTtcXG4gICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuOyovXFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCJ+fn7ov5jmnKjmnInop4bpopHlk6Z+fn5cXFwiLmZvbnRjb2xvcihcXFwiZ3JleVxcXCIpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBhbGwudXJsID0gXFxcInRvYXN0Oi8v5rKh5pyJ6KeG6aKR5peg5rOV5o6o6YCBXFxcIjtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGxpc3QuZm9yRWFjaCh2ID0+IHtcXG4gICAgICAgICAgICB2LmNvbF90eXBlID0gdi50eXBlO1xcbiAgICAgICAgICAgIGxldCBuYW1lID0gdi5leHRyYS5wYWdlVGl0bGU7XFxuICAgICAgICAgICAgbGV0IHVybCA9IG5hbWUucmVwbGFjZSgvXFxcXCMvZywgJ18nKS5yZXBsYWNlKC9cXFxcJC9nLCAnXycpICsgXFxcIiR2aWRlb3xcXFwiICsgdi5leHRyYS5pZDtcXG4gICAgICAgICAgICBhbGxVcmxzLnB1c2godXJsKTtcXG4gICAgICAgICAgICB2LnVybCA9IGdldFB1c2gobmFtZSwgdXJsKTtcXG4gICAgICAgICAgICB2LmV4dHJhLmNscyA9IHYuZXh0cmEuaWQgPSB1bmRlZmluZWQ7XFxuICAgICAgICAgICAgZC5wdXNoKHYpO1xcbiAgICAgICAgfSk7XFxuICAgICAgICBhbGwudXJsID0gZ2V0UHVzaChmb2xkZXJOYW1lLCBhbGxVcmxzLmpvaW4oXFxcIiNcXFwiKSk7XFxuICAgIH1cXG4gICAgc2V0UmVzdWx0KGQpO1xcbn0pKCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlsIHpnaLmkJzntKJcIixcInBhdGhcIjpcImZyb250Q292ZXJcIixcInJ1bGVcIjpcImpzOlxcbmxldCBkID0gW107XFxubGV0IGtleSA9IGdldE15VmFyKFxcXCJmcm9udGNvdmVya2V5XFxcIiwgXFxcIlxcXCIpO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5pCc57SiXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIHVybDogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihcXFwiZnJvbnRjb3ZlcmtleVxcXCIsIGlucHV0LnRyaW0oKSk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgIH0pLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBrZXkgfHwgZ2V0TXlWYXIoXFxcInNcXFwiLCBcXFwiXFxcIilcXG4gICAgfVxcbn0pO1xcbmlmIChrZXkpIHtcXG4gICAgbGV0IHIgPSByZXF1ZXN0KCdodHRwczovL20uZG91YmFuLmNvbS9zZWFyY2gvP3F1ZXJ5PScgKyBlbmNvZGVVUklDb21wb25lbnQoa2V5KSlcXG4gICAgbGV0IGxpc3QgPSBwZGZhKHIsIFxcXCIuc2VhcmNoLXJlc3VsdHMmJmltZ1xcXCIpO1xcbiAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XFxuICAgICAgICBsZXQgcGljID0gcGRmaChpdCwgXFxcImltZyYmc3JjXFxcIik7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHBpY191cmw6IHBpYyxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHBpYykgPT4ge1xcbiAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiZnJvbnRjb3ZlcnBpY1xcXCIsIHBpYyk7XFxuICAgICAgICAgICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9LCBwaWMpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwicGljXzJfY2FyZFxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuXFxufVxcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgKCkgPT4ge1xcbiAgICBsZXQgcGljID0gZ2V0TXlWYXIoXFxcImZyb250Y292ZXJwaWNcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiZnJvbnRjb3ZlcnBpY1xcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJmcm9udGNvdmVya2V5XFxcIik7XFxuICAgIHNldFBhZ2VQaWNVcmwocGljKTtcXG59KTtcXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop4TliJnmlofku7ZcIixcInBhdGhcIjpcImNvbmZpZ3NcIixcInJ1bGVcIjpcImNvbnN0IHBhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9Mb3lEZ0lrL2FsaVNpbXBsZVJ1bGVzLmpzb25cXFwiO1xcblxcblxcbmZ1bmN0aW9uIGdldEpzb24oKSB7XFxuICAgIHRyeSB7XFxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZWFkRmlsZShwYXRoKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgZGVsZXRlRmlsZShwYXRoKTtcXG4gICAgICAgIHJldHVybiBbXTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBzYXZlSnNvbihqc29uKSB7XFxuICAgIHNhdmVGaWxlKHBhdGgsIEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0VXNlZnVsSnNvbigpIHtcXG4gICAgcmV0dXJuIGdldEpzb24oKS5maWx0ZXIodiA9PiAhdi5mb3JiaWRkZW4pO1xcbn1cXG5mdW5jdGlvbiBnZXRGb3JiaWRkZW5Kc29uKCl7XFxuICAgIHJldHVybiBnZXRKc29uKCkuZmlsdGVyKHYgPT4gdi5mb3JiaWRkZW4pO1xcbn1cXG5pZighZmlsZUV4aXN0KHBhdGgpJiZNWV9SVUxFKXtcXG4gICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJydWxlc1xcXCIpO1xcbiAgICAkLmhpa2VyLndpbmRvdyA9IHt9O1xcbiAgICBldmFsLmNhbGwobnVsbCwgZmV0Y2goJ2hpa2VyOi8vYXNzZXRzL2JlYXV0aWZ5LmpzJykpO1xcbiAgICBydWxlcyA9IHJ1bGVzLm1hcCgodik9PntcXG4gICAgICAgIHYuZmluZCA9IHdpbmRvdy5qc19iZWF1dGlmeSh2LmZpbmQudG9TdHJpbmcoKS5yZXBsYWNlKC9mdW5jdGlvbi4qP1xcXFwocy4qP3BhZ2VcXFxcKS4qP1xcXFx7LywgXFxcIlxcXCIpLnJlcGxhY2UoLyhcXFxcfVtcXFxcc1xcXFxTXS4qPykkLyxcXFwiXFxcIikpO1xcbiAgICAgICAgaWYodi5maW5kQWxpVXJsKXtcXG4gICAgICAgICAgICB2LmZpbmRBbGlVcmwgPSB3aW5kb3cuanNfYmVhdXRpZnkodi5maW5kQWxpVXJsLnRvU3RyaW5nKCkucmVwbGFjZSgvZnVuY3Rpb24uKj9cXFxcKGlucHV0XFxcXCkuKj9cXFxcey8sIFxcXCJcXFwiKS5yZXBsYWNlKC8oXFxcXH1bXFxcXHNcXFxcU10uKj8pJC8sXFxcIlxcXCIpKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB2O1xcbiAgICB9KTtcXG4gICAgc2F2ZUpzb24ocnVsZXMpO1xcbiAgICB0b2FzdChcXFwi5bey5Yid5aeL5YyWXFxcIik7XFxufVxcbiQuZXhwb3J0cyA9IHtcXG4gICAgZ2V0SnNvbjogZ2V0SnNvbixcXG4gICAgc2F2ZUpzb246IHNhdmVKc29uLFxcbiAgICBnZXRVc2VmdWxKc29uOiBnZXRVc2VmdWxKc29uLFxcbiAgICBnZXRGb3JiaWRkZW5Kc29uOiBnZXRGb3JiaWRkZW5Kc29uLFxcbiAgICBwYXRoOiBwYXRoXFxufTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuinhOWImeeuoeeQhlwiLFwicGF0aFwiOlwicnVsZU1hbmFnZVwiLFwicnVsZVwiOlwianM6XFxudmFyIGQgPSBbXTtcXG5zZXRQYWdlVGl0bGUoXFxcIuinhOWImeeuoeeQhlxcXCIpO1xcbmxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxubGV0IGxlbmd0aCA9IGFyci5sZW5ndGg7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmlrDlop5cXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcnVsZUVkaXQjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3JvdW5kX3NtYWxsXzRcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9kb21haW5fY29uZmlnXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHBhZ2VUaXRsZTogXFxcIuaWsOWinuinhOWImVxcXCJcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5YiG5LqrXFxcIixcXG4gICAgdXJsOiAkKFxcXCItMVxcXCIsIFxcXCLovpPlhaXkvaDopoHliIbkuqvop4TliJnnmoTluo/lj7dcXFxcbi0x5YWo6YOo77yMLTLlt7LlkK/nlKjnmoTvvIwtM+W3suemgeeUqOeahO+8jOWkmuS4queUqCfvvIwn6ZqU5byAXFxcIikuaW5wdXQoKGxlbmd0aCkgPT4ge1xcbiAgICAgICAgbGV0IGluZGV4YyA9IGlucHV0LnNwbGl0KC8sfO+8jC8pO1xcbiAgICAgICAgbGV0IGluZGV4cyA9IFtdO1xcbiAgICAgICAgbGV0IG1vID0gcGFyc2VJbnQoaW5kZXhjWzBdKTtcXG4gICAgICAgIGlmICghKGluZGV4Yy5sZW5ndGggPT09IDEgJiYgbW8gPCAwICYmIG1vID4gLTQpKSB7XFxuICAgICAgICAgICAgZm9yIChsZXQgaXQgb2YgaW5kZXhjKSB7XFxuICAgICAgICAgICAgICAgIGxldCBudW0gPSBwYXJzZUludChpdCk7XFxuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4obnVtKSB8fCBudW0gPj0gbGVuZ3RoIHx8IG51bSA8IDApIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mlbDlrZfkuI3lkIjms5VcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGluZGV4cy5wdXNoKG51bSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuICQoW1xcXCJISUtFUlxcXCIsIFxcXCJUWFRcXFwiXS5jb25jYXQoZ2V0UGFzdGVzKCkpLCAyLCBcXFwi5YiG5Lqr5pa55byPXFxcIikuc2VsZWN0KChtbywgaW5kZXhzKSA9PiB7XFxuICAgICAgICAgICAgZnVuY3Rpb24gdXAocnVsZXMpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGViNjQgPSBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkocnVsZXMpKTtcXG4gICAgICAgICAgICAgICAgbGV0IGdldFBhc3MgPSAobGVuZ3RoLCBydWxlLCB0eXBlKSA9PiBcXFwi5rW36ZiU6KeG55WM5LqR566A5pCc57Si5byV5pOO77yM5YWx44CMXFxcIiArIGxlbmd0aCArIFxcXCLjgI3mnaHvvIzlpI3liLbmlbTmnaHlj6Pku6TmiZPlvIDova/ku7blsLHkvJroh6rliqjlr7zlhaUkXFxcIiArIHJ1bGUgKyBcXFwiJFxcXCIgKyB0eXBlICsgXFxcIkBpbXBvcnQ9anM6JC5yZXF1aXJlKCdpbXBvcnQ/cnVsZT0nK1xcXCIgKyBKU09OLnN0cmluZ2lmeShNWV9SVUxFLnRpdGxlKSArIFxcXCIpKGlucHV0KVxcXCI7XFxuICAgICAgICAgICAgICAgIGlmIChnZXRQYXN0ZXMoKS5pbmNsdWRlcyhpbnB1dCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gc2hhcmVQYXN0ZShydWxlYjY0LCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgZ2V0UGFzcyhydWxlcy5sZW5ndGgsIHUsIFxcXCJiXFxcIik7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0xveURnSWsvc2hhcmUv5LqR566A5pCc57Si5byV5pOO6KeE5YiZ44CMXFxcIiArIHJ1bGVzLmxlbmd0aCArIFxcXCLjgI3mnaEuXFxcIiArIChpbnB1dCA9PT0gXFxcIkhJS0VSXFxcIiA/IFxcXCJoaWtlclxcXCIgOiBcXFwidHh0XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGUocGF0aCwgZ2V0UGFzcyhydWxlcy5sZW5ndGgsIHJ1bGViNjQsIFxcXCJhXFxcIikpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJzaGFyZTovL1xcXCIgKyBwYXRoO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBydWxlcztcXG4gICAgICAgICAgICBpZiAobW8gPT09IC0xKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW8gPT09IC0yKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0VXNlZnVsSnNvbigpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW8gPT09IC0zKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0Rm9yYmlkZGVuSnNvbigpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpLmZpbHRlcigodiwgaSkgPT4gaW5kZXhzLmluY2x1ZGVzKGkpKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcnVsZXMgPSBydWxlcy5tYXAoKHYpID0+IHtcXG4gICAgICAgICAgICAgICAgdi51c2VyID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgICAgICB2LmZvcmJpZGRlbiA9IHVuZGVmaW5lZDtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHY7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHVwKHJ1bGVzKTtcXG4gICAgICAgIH0sIG1vLCBpbmRleHMpO1xcblxcbiAgICB9LCBsZW5ndGgpLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fcm91bmRfc21hbGxfNFxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX3NoYXJlX2dyZWVuXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6YeN572uXFxcIixcXG4gICAgdXJsOiAkKFxcXCLkvaDnoa7lrprph43nva7vvJ9cXFxcbuivpeaTjeS9nOS8muWIoOmZpOeOsOacieinhOWIme+8jOaBouWkjeiHquW4puinhOWImeOAglxcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXG4gICAgICAgIGRlbGV0ZUZpbGUocGF0aCk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5wYXRoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3JvdW5kX3NtYWxsXzRcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9yZWZyZXNoXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5riF56m6XFxcIixcXG4gICAgdXJsOiAkKFxcXCLkvaDnoa7lrprlhajpg6jliKDpmaTvvJ9cXFxcbuivpeaTjeS9nOS8muWIoOmZpOeOsOacieinhOWImeOAglxcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXG4gICAgICAgIHdyaXRlRmlsZShwYXRoLCBcXFwiW11cXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnBhdGgpLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fcm91bmRfc21hbGxfNFxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2NvZGVfdmlld1xcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogJzxmb250IGNvbG9yPVxcXCIjMTNCNjFCXFxcIj7ilpAgPC9mb250PjxiPuinhOWImeWIl+ihqDxiPiAoJyArIFN0cmluZyhsZW5ndGgpLmZvbnRjb2xvcihcXFwiI2ZmNjYwMVxcXCIpICsgXFxcIilcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxufSk7XFxuXFxuZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xcbiAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgIGxldCB1c2VyID0gaXQudXNlciB8fCB7fTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdWycgKyBpICsgJ108Yj4gICcgKyBpdC5uYW1lICsgJzxiPicgKyAoaXQuZm9yYmlkZGVuID8gXFxcIiAj4oCc4oCc56aB55So4oCd4oCdXFxcIi5zbWFsbCgpIDogXFxcIlxcXCIpICsgKGl0LnJlZ2lzdGVyVXJsICYmICEodXNlci5wYXNzd29yZCB8fCB1c2VyLmFjY291bnQgfHwgdXNlci5leHRyYSkgPyBcXFwiICPpnIDopoHnmbvlvZVcXFwiLnNtYWxsKCkgOiBcXFwiXFxcIiksXFxuICAgICAgICB1cmw6ICQoW1xcXCLnvJbovpFcXFwiLCBcXFwi6LSm5Y+3XFxcIiwgXFxcIuWIhuS6q1xcXCIsIFxcXCLnpoHnlKgv5ZCv55SoXFxcIiwgXFxcIuenu+WKqFxcXCIsIFxcXCLnva7pobZcXFwiXSwgMSwgXFxcIuaTjeS9nO+8mlxcXCIgKyBpdC5uYW1lKS5zZWxlY3QoKGluZGV4LCBsZW5ndGgpID0+IHtcXG4gICAgICAgICAgICBpZiAoaW5wdXQgPT09IFxcXCLnvJbovpFcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVFZGl0I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIui0puWPt1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcGFzc3dvcmQjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5YiG5LqrXFxcIikge1xcbiAgICAgICAgICAgICAgICBsZXQgb3BzID0gZ2V0UGFzdGVzKCk7XFxuICAgICAgICAgICAgICAgIG9wcy51bnNoaWZ0KFxcXCLlrozmlbTlj6Pku6RcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQob3BzLCAyLCBcXFwi5YiG5Lqr5pa55byPXFxcIikuc2VsZWN0KChpbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKClbaW5kZXhdO1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZS51c2VyID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZS5mb3JiaWRkZW4gPSB1bmRlZmluZWQ7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZWI2NCA9IGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShydWxlKSk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgZ2V0UGFzcyA9IChuYW1lLCBydWxlLCB0eXBlKSA9PiBcXFwi5rW36ZiU6KeG55WM77yM44CMXFxcIiArIG5hbWUgKyBcXFwi44CN5LqR566A5pCc57Si5byV5pOO77yM5aSN5Yi25pW05p2h5Y+j5Luk5omT5byA6L2v5Lu25bCx5Lya6Ieq5Yqo5a+85YWlJFxcXCIgKyBydWxlICsgXFxcIiRcXFwiICsgdHlwZSArIFxcXCJAaW1wb3J0PWpzOiQucmVxdWlyZSgnaW1wb3J0P3J1bGU9JytcXFwiICsgSlNPTi5zdHJpbmdpZnkoTVlfUlVMRS50aXRsZSkgKyBcXFwiKShpbnB1dClcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0ID09IFxcXCLlrozmlbTlj6Pku6RcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIGdldFBhc3MocnVsZS5uYW1lLCBydWxlYjY0LCBcXFwiYVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IHNoYXJlUGFzdGUocnVsZWI2NCwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBnZXRQYXNzKHJ1bGUubmFtZSwgdSwgXFxcImJcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSwgaW5kZXgpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLnp7vliqhcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKGluZGV4ICsgXFxcIlxcXCIsIFxcXCLovpPlhaXkvY3nva5cXFwiKS5pbnB1dCgoaW5kZXgsIGxlbmd0aCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0luZGV4ID0gTnVtYmVyKGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4obmV3SW5kZXgpIHx8IG5ld0luZGV4ID49IGxlbmd0aCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kuI3lkozop4TnmoTkvY3nva5cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBydWxlcy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZXMuc3BsaWNlKG5ld0luZGV4LCAwLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKHJ1bGVzKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgfSwgaW5kZXgsIGxlbmd0aCk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIue9rumhtlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgbGV0IG5ld0luZGV4ID0gMDtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IHJ1bGVzLnNwbGljZShpbmRleCwgMSlbMF07XFxuICAgICAgICAgICAgICAgIHJ1bGVzLnNwbGljZShuZXdJbmRleCwgMCwgcnVsZSk7XFxuICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKHJ1bGVzKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlID0gYXJyW2luZGV4XTtcXG4gICAgICAgICAgICAgICAgcnVsZS5mb3JiaWRkZW4gPSAhcnVsZS5mb3JiaWRkZW47XFxuICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKGFycik7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIChydWxlLmZvcmJpZGRlbiA/IFxcXCLnpoHnlKhcXFwiIDogXFxcIuWQr+eUqFxcXCIpICsgcnVsZS5uYW1lO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGksIGxlbmd0aCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGk6IGksXFxuICAgICAgICAgICAgcGFnZVRpdGxlOiBpdC5uYW1lXFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop4TliJnnvJbovpFcIixcInBhdGhcIjpcInJ1bGVFZGl0XCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcblxcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX25hbWVcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfZmluZFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19maW5kQWxpVXJsXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX3BhZ2VcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfcmVnaXN0ZXJVcmxcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfYmFzaWNVcmxcXFwiKTtcXG59KSk7XFxubGV0IHVybEluZGV4ID0gcGFyc2VJbnQoZ2V0UGFyYW0oXFxcImluZGV4XFxcIiwgXFxcIlxcXCIpKTtcXG51cmxJbmRleCA9IE51bWJlci5pc05hTih1cmxJbmRleCkgPyB2b2lkKDApIDogdXJsSW5kZXg7XFxubGV0IGluZGV4ID0gdm9pZCgwKSA9PT0gdXJsSW5kZXggPyBNWV9QQVJBTVMuaSA6IHVybEluZGV4O1xcblxcbmxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxubGV0IG9iajtcXG5pZiAoZ2V0UGFyYW0oXFxcImlzSW1wb3J0XFxcIiwgXFxcIlxcXCIpKSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBvYmogPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL3l1blNpbXBsZUltcG9ydC5qc29uXFxcIik7XFxuICAgICAgICBsZXQgdGlwID0gaW5kZXggIT09IHZvaWQoMCkgPyBcXFwi5pu05paw6KeE5YiZXFxcIiA6IFxcXCLlr7zlhaXop4TliJlcXFwiO1xcbiAgICAgICAgc2V0UGFnZVRpdGxlKHRpcCArIFxcXCI6XFxcIiArIG9iai5uYW1lKTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJjigJhcXFwiICsgdGlwICsgXFxcIuKAmeKAmVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG5cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgb2JqID0ge307XFxuICAgICAgICBiYWNrKCk7XFxuICAgICAgICB0b2FzdChcXFwi5a+85YWl6ZSZ6K+vXFxcIik7XFxuICAgIH1cXG59IGVsc2UgaWYgKGluZGV4ICE9PSB2b2lkKDApKSB7XFxuICAgIG9iaiA9IGFycltpbmRleF07XFxuICAgIHNldFBhZ2VUaXRsZShcXFwi57yW6L6R6KeE5YiZOlxcXCIgKyBvYmoubmFtZSk7XFxuICAgIGlmIChvYmoubGFzdE1vZGlmeSkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuS4iuasoeS/ruaUue+8mlxcXCIgKyAkLmRhdGVGb3JtYXQob2JqLmxhc3RNb2RpZnksIFxcXCJ5eXl5LU1NLWRkwqBISDptbTpzc1xcXCIpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59IGVsc2Uge1xcbiAgICBvYmogPSB7XFxuICAgICAgICBwYWdlOiB0cnVlXFxuICAgIH07XFxuICAgIHNldFBhZ2VUaXRsZShcXFwi5paw5bu66KeE5YiZXFxcIik7XFxufVxcblxcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5ZCN5a2XKOW/heWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19uYW1lXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5uYW1lLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLmkJzntKLop4TliJko5b+F5aGrKVxcXFxu5YaF572u5Y+Y6YeP77yac+aQnOe0ouWFs+mUruivje+8jHBhZ2XpobXmlbDvvIxiYXNpY1VybOWfuuacrOmTvuaOpe+8jHVzZXLnlKjmiLfotKblj7fkv6Hmga8odXNlci5hY2NvdW50LHVzZXIucGFzc3dvcmQpXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6IDMsXFxuICAgICAgICBoaWdobGlnaHQ6IHRydWUsXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX2ZpbmRcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLmZpbmQsXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCJVUkzop4TliJko6YCJ5aGrKVxcXFxu5YaF572u5Y+Y6YeP77yaaW5wdXTpk77mjqXvvIxiYXNpY1VybOWfuuacrOmTvuaOpVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0OiAzLFxcbiAgICAgICAgaGlnaGxpZ2h0OiB0cnVlLFxcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19maW5kQWxpVXJsXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5maW5kQWxpVXJsLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5Z+65pys6ZO+5o6lKOmAieWhqykg5Luj56CB5Lit55SoYmFzaWNVcmzlvJXnlKhcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19iYXNpY1VybFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBvYmouYmFzaWNVcmwsXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLms6jlhozlnLDlnYAo6YCJ5aGrKVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX3JlZ2lzdGVyVXJsXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5yZWdpc3RlclVybCxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaYr+WQpuWPr+S7pee/u+mhte+8mlxcXCIgKyBvYmoucGFnZSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHBhZ2UpID0+IHtcXG4gICAgICAgIGxldCBpc1BhZ2UgPSAhIWdldE15VmFyKFxcXCJwc19wYWdlXFxcIiwgcGFnZSA/IFxcXCIxXFxcIiA6IFxcXCJcXFwiKTtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJwc19wYWdlXFxcIiwgaXNQYWdlID8gXFxcIlxcXCIgOiBcXFwiMVxcXCIpO1xcbiAgICAgICAgdXBkYXRlSXRlbShcXFwicnVsZWVkcHNfcGFnZVxcXCIsIHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuaYr+WQpuWPr+S7pee/u+mhte+8mlxcXCIgKyAhaXNQYWdlXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sIG9iai5wYWdlKSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBcXFwicnVsZWVkcHNfcGFnZVxcXCJcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5Yig6ZmkXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpbmRleCwgdXJsSW5kZXgpID0+IHtcXG4gICAgICAgIGlmIChpbmRleCA9PT0gdm9pZCgwKSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mraTpobnml6Dms5XliKDpmaRcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHVybEluZGV4ICE9PSB2b2lkKDApKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ato+WcqOabtOaWsOinhOWIme+8jOWIoOmZpOivt+S7juinhOWImeeuoeeQhui/m+WFpVxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBjb25maXJtKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIua4qemmqOaPkOekulxcXCIsXFxuICAgICAgICAgICAgY29udGVudDogXFxcIuehruWumuimgeWIoOmZpOatpOinhOWImeWQl++8n+azqOaEj+WIoOmZpOWQjuaXoOazleaBouWkjVxcXCIsXFxuICAgICAgICAgICAgY29uZmlybTogJC50b1N0cmluZygoaW5kZXgpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgYXJyLnNwbGljZShpbmRleCwgMSk7XFxuICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKGFycik7XFxuICAgICAgICAgICAgICAgIGJhY2sodHJ1ZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFwiO1xcbiAgICAgICAgICAgIH0sIGluZGV4KVxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgIH0sIGluZGV4LCB1cmxJbmRleCksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuS/neWtmFxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaW5kZXgsIHBhZ2UpID0+IHtcXG4gICAgICAgIGxldCBuYW1lID0gZ2V0TXlWYXIoXFxcInBzX25hbWVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAobmFtZSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lkI3lrZflvpfmnInkuIDkuKrlkKdcXFwiXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgZmluZCA9IGdldE15VmFyKFxcXCJwc19maW5kXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgaWYgKGZpbmQgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pCc57Si6KeE5YiZ5LiN6IO95Li656m6XFxcIlxcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgIGxldCBvYmoxID0ge1xcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXFxuICAgICAgICAgICAgZmluZDogZmluZCxcXG4gICAgICAgICAgICBiYXNpY1VybDogZ2V0TXlWYXIoXFxcInBzX2Jhc2ljVXJsXFxcIiwgXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIGZpbmRBbGlVcmw6IGdldE15VmFyKFxcXCJwc19maW5kQWxpVXJsXFxcIiwgXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIHBhZ2U6ICEhZ2V0TXlWYXIoXFxcInBzX3BhZ2VcXFwiLCBwYWdlID8gXFxcIjFcXFwiIDogXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIHJlZ2lzdGVyVXJsOiBnZXRNeVZhcihcXFwicHNfcmVnaXN0ZXJVcmxcXFwiLCBcXFwiXFxcIikgfHwgdW5kZWZpbmVkLFxcbiAgICAgICAgICAgIGxhc3RNb2RpZnk6IERhdGUubm93KClcXG4gICAgICAgIH07XFxuICAgICAgICBpZiAoaW5kZXggPT09IHZvaWQoMCkpIHtcXG4gICAgICAgICAgICBpZiAoYXJyLnNvbWUodiA9PiB2Lm5hbWUgPT09IG5hbWUpKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lnu4/lrZjlnKjor6Xop4TliJlcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBhcnIudW5zaGlmdChvYmoxKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IG5hbWV5ID0gYXJyW2luZGV4XS5uYW1lO1xcbiAgICAgICAgICAgIGlmIChuYW1lICE9PSBuYW1leSkge1xcbiAgICAgICAgICAgICAgICBpZiAoYXJyLnNvbWUodiA9PiB2Lm5hbWUgPT09IG5hbWUpKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey57uP5a2Y5Zyo6K+l6KeE5YiZXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBvYmoxID0gT2JqZWN0LmFzc2lnbihhcnJbaW5kZXhdLCBvYmoxKTtcXG4gICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxLCBvYmoxKTtcXG4gICAgICAgIH1cXG4gICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKGFycik7XFxuICAgICAgICBiYWNrKHRydWUpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/neWtmOaIkOWKn1xcXCI7XFxuICAgIH0sIGluZGV4LCBvYmoucGFnZSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG59KTtcXG5cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop4TliJnotKblj7dcIixcInBhdGhcIjpcInBhc3N3b3JkXCIsXCJydWxlXCI6XCJqczpcXG4oZnVuY3Rpb24oKSB7XFxuICAgIHZhciBkID0gW107XFxuICAgIGFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBjbGVhck15VmFyKFxcXCJwc19hY2NvdW50XFxcIik7XFxuICAgICAgICBjbGVhck15VmFyKFxcXCJwc19wYXNzd29yZFxcXCIpO1xcbiAgICAgICAgY2xlYXJNeVZhcihcXFwicHNfZXh0cmFcXFwiKTtcXG4gICAgfSkpO1xcbiAgICBsZXQgaW5kZXggPSBNWV9QQVJBTVMuaTtcXG4gICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgbGV0IG9iaiA9IGFycltpbmRleF0gfHwge307XFxuICAgIHNldFBhZ2VUaXRsZShcXFwi6K6+572u6LSm5Y+3OlxcXCIgKyBvYmoubmFtZSk7XFxuICAgIGxldCByZWdpc3RlclVybCA9IG9iai5yZWdpc3RlclVybDtcXG4gICAgaWYgKHJlZ2lzdGVyVXJsKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLliY3lvoDms6jlhoxcXFwiLFxcbiAgICAgICAgICAgIHVybDogJChcXFwiaGlrZXI6Ly9lbXB0eSNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiKS5ydWxlKChyZWdpc3RlclVybCk9PntcXG4gICAgICAgICAgICAgICAgc2V0UmVzdWx0KFt7XFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTpcXFwieDVfd2Vidmlld19zaW5nbGVcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOnJlZ2lzdGVyVXJsLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzpcXFwiZmxvYXQmJjEwMCVcXFwiXFxuICAgICAgICAgICAgICAgIH1dKTtcXG4gICAgICAgICAgICB9LCByZWdpc3RlclVybCksXFxuICAgICAgICAgICAgZXh0cmE6e1xcbiAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IFxcXCLms6jlhozotKblj7c6XFxcIiArIG9iai5uYW1lXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgb2JqID0gb2JqLnVzZXIgfHwge307XFxuICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICAgIGRlc2M6IFxcXCLnlKjmiLflkI1cXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19hY2NvdW50XFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLmFjY291bnQsXFxuICAgICAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICAgICAgZGVzYzogXFxcIuWvhueggVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHR5cGU6IFxcXCJwYXNzd29yZFxcXCIsXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfcGFzc3dvcmRcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBvYmoucGFzc3dvcmQsXFxuICAgICAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICAgIGRlc2M6IFxcXCLpop3lpJZcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX2V4dHJhXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLmV4dHJhLFxcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgaGVpZ2h0OiAtMVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5L+d5a2YXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaW5kZXgpID0+IHtcXG4gICAgICAgICAgICBsZXQgYWNjb3VudCA9IGdldE15VmFyKFxcXCJwc19hY2NvdW50XFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGxldCBwYXNzd29yZCA9IGdldE15VmFyKFxcXCJwc19wYXNzd29yZFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBsZXQgZXh0cmEgPSBnZXRNeVZhcihcXFwicHNfZXh0cmFcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgLyppZiAoIShhY2NvdW50fHxwYXNzd29yZHx8ZXh0cmEpKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kuI3og73lhajpg6jkuLrnqbpcXFwiO1xcbiAgICAgICAgICAgIH0qL1xcbiAgICAgICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgbGV0IGl0ZW0gPSBhcnJbaW5kZXhdO1xcbiAgICAgICAgICAgIGl0ZW0udXNlciA9IHt9O1xcbiAgICAgICAgICAgIGl0ZW0udXNlci5hY2NvdW50ID0gYWNjb3VudFxcbiAgICAgICAgICAgIGl0ZW0udXNlci5wYXNzd29yZCA9IHBhc3N3b3JkO1xcbiAgICAgICAgICAgIGl0ZW0udXNlci5leHRyYSA9IGV4dHJhO1xcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdm9pZCgwKSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vaWTplJnor69cXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDEsIGl0ZW0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgICAgIGJhY2sodHJ1ZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/neWtmOaIkOWKn1xcXCI7XFxuICAgICAgICB9LCBpbmRleCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB9KTtcXG4gICAgc2V0UmVzdWx0KGQpO1xcbn0pKClcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuinhOWImeWvvOWFpVwiLFwicGF0aFwiOlwiaW1wb3J0XCIsXCJydWxlXCI6XCJqczpcXG5mdW5jdGlvbiBzYXZlQ2FjaGUoanNvbikge1xcbiAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL3l1blNpbXBsZUltcG9ydC5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoanNvbikpO1xcbn1cXG4kLmV4cG9ydHMgPSBmdW5jdGlvbihwYXNzKSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgW18sIHJ1bGUsIHR5cGVdID0gcGFzcy5zcGxpdChcXFwiJFxcXCIpO1xcbiAgICAgICAgaWYgKHR5cGUgPT09IFxcXCJiXFxcIikge1xcbiAgICAgICAgICAgIHJ1bGUgPSBwYXJzZVBhc3RlKHJ1bGUpO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJ1bGVzID0gSlNPTi5wYXJzZShiYXNlNjREZWNvZGUocnVsZSkpO1xcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJ1bGVzKSkge1xcbiAgICAgICAgICAgIHJ1bGVzID0gW3J1bGVzXTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJ1bGVzLnJldmVyc2UoKTtcXG4gICAgICAgIE1ZX1VSTCA9IG1vZHVsZS5pZDtcXG4gICAgICAgIGxldCBydWxlVGl0bGUgPSBnZXRQYXJhbShcXFwicnVsZVxcXCIpO1xcbiAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlncz9ydWxlPVxcXCIgKyBydWxlVGl0bGUpLmdldEpzb24oKTtcXG4gICAgICAgIGxldCBuZXdJID0gMDtcXG4gICAgICAgIGZvciAobGV0IHJ1bGUgb2YgcnVsZXMpIHtcXG4gICAgICAgICAgICBsZXQgaW5kZXggPSBhcnIuZmluZEluZGV4KHYgPT4gdi5uYW1lID09PSBydWxlLm5hbWUpO1xcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGUgPSBPYmplY3QuYXNzaWduKGFycltpbmRleF0sIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgaWYgKHJ1bGVzLmxlbmd0aCA9PT0gMSkge1xcbiAgICAgICAgICAgICAgICAgICAgc2F2ZUNhY2hlKHJ1bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcnVsZUVkaXQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjP2lzSW1wb3J0PXRydWUmaW5kZXg9XFxcIiArIGluZGV4ICsgXFxcIiZydWxlPVxcXCIgKyBydWxlVGl0bGU7XFxuICAgICAgICAgICAgICAgICAgICAvL3RvYXN0KFxcXCLlt7Lmm7TmlrDop4TliJnvvJpcXFwiICsgcnVsZS5uYW1lKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhcXFwi5bey5pu05paw6KeE5YiZ77yaXFxcIiArIHJ1bGUubmFtZSlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIG5ld0krKztcXG4gICAgICAgICAgICAgICAgYXJyLnVuc2hpZnQocnVsZSk7XFxuICAgICAgICAgICAgICAgIGlmIChydWxlcy5sZW5ndGggPT09IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHNhdmVDYWNoZShydWxlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVFZGl0I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5Iz9pc0ltcG9ydD10cnVlJnJ1bGU9XFxcIiArIHJ1bGVUaXRsZTtcXG4gICAgICAgICAgICAgICAgICAgIC8vdG9hc3QoXFxcIuW3suWvvOWFpeinhOWIme+8mlxcXCIgKyBydWxlLm5hbWUpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKFxcXCLlt7Llr7zlhaXop4TliJnvvJpcXFwiICsgcnVsZS5uYW1lKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHJ1bGVzLmxlbmd0aCA+IDEpIHtcXG4gICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3M/cnVsZT1cXFwiICsgcnVsZVRpdGxlKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLmlrDlop7vvJpcXFwiICsgbmV3SSArIFxcXCIg6KaG55uW5pu05paw77yaXFxcIiArIChydWxlcy5sZW5ndGggLSBuZXdJKSk7XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgdG9hc3QoXFxcIuWvvOWFpeWksei0pVxcXCIpO1xcbiAgICB9XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6KeE5YiZ5YiX6KGoXCIsXCJwYXRoXCI6XCJydWxlc1wiLFwicnVsZVwiOlwianM6XFxuJC5leHBvcnRzID0gW3tcXG4gICAgICAgIG5hbWU6IFxcXCLlsI/kupFcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBiYXNpY1VybCA9IFxcXCJodHRwczovL3d3dy55dW5zby5uZXRcXFwiO1xcbiAgICAgICAgICAgIGxldCBhcGkgPSBcXFwiL2FwaS92YWxpZGF0ZS9zZWFyY2g/d2Q9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChzKSArIFxcXCImbW9kZT05MDAwMSZzdHlwZT0yMDEwMCZ1az0mcGFnZT1cXFwiICsgcGFnZSArIFxcXCImbGltaXQ9MjAmc2NyZWVuX2ZpbGV0eXBlPXVuZGVmaW5lZFxcXCI7XFxuICAgICAgICAgICAgbGV0IGpzb24gPSBwb3N0KGJhc2ljVXJsICsgYXBpLCB7XFxuICAgICAgICAgICAgICAgIGJvZHk6IFxcXCJkYXRhPVxcXCIgKyBhcGksXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFJlZmVyZXI6IFxcXCJodHRwczovL3d3dy55dW5zby5uZXQvaW5kZXgvdXNlci9zP3dkPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQocylcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gSlNPTi5wYXJzZShqc29uKS5kYXRhO1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0gcGRmYShodG1sLCBcXFwiYm9keSYmLmxheXVpLWNhcmQ6aGFzKGEpXFxcIik7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIGxpc3QpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcGRmaChpdGVtLCBcXFwiYSYmVGV4dFxcXCIpLnJlcGxhY2UoXFxcIiPmlofku7blpLkgXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICAvL2xldCB0aW1lID0gL1xcXFxkezR9KC1cXFxcZHsyfSl7Mn0gXFxcXGR7Mn0oXFxcXDpcXFxcZHsyfSl7Mn0vLmV4ZWMocGRmaChpdGVtLCBcXFwiLmxheXVpLWNhcmQtYm9keSYmVGV4dFxcXCIpKSB8fCBbXTtcXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIC8vZGVzYzogdGltZVswXSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogYmFzZTY0RGVjb2RlKHBkZmgoaXRlbSwgXFxcImEmJnVybFxcXCIpKVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9XFxuICAgIH0sIHtcXG4gICAgICAgIG5hbWU6IFxcXCLmt7flkIjnm5hcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBcXFwiaHR0cHM6Ly9hcGkuaHVuaGVwYW4uY29tL3YxL3NlYXJjaFxcXCI7XFxuICAgICAgICAgICAgbGV0IGpzb24gPSBwb3N0KHVybCwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBSZWZlcmVyOiBcXFwiaHR0cHM6Ly9odW5oZXBhbi5jb20vXFxcIlxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicVxcXCI6IHMsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFnZVxcXCI6IHBhZ2UsXFxuICAgICAgICAgICAgICAgICAgICBcXFwic2l6ZVxcXCI6IDE1XFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBqc29uLmRhdGEubGlzdDtcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBsaXN0W2ldO1xcbiAgICAgICAgICAgICAgICBpZiAoaXQuZGlza190eXBlICE9PSBcXFwiQUxZXFxcIiB8fCBpdC5zaGFyZV91c2VyID09PSBcXFwi5Li2Kioq5Li2XFxcIikgY29udGludWU7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXQuZGlza19uYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgcGljX3VybDogcGQoaXQsIFxcXCJpbWcmJnNyY1xcXCIsIHVybCksXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGl0LmxpbmssXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBpdC51cGRhdGVfdGltZSArIFxcXCJcXFxcblxcXCIgKyBpdC5saW5rLFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9XFxuICAgIH0sIHtcXG4gICAgICAgIG5hbWU6IFxcXCLotYTmupDluK5cXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQocywgcGFnZSkge1xcbiAgICAgICAgICAgIGZ1bmN0aW9uIHNlYXJjaCgpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJ0bkxpc3QgPSBbXTtcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3AgPSByZXF1ZXN0KFxcXCJodHRwczovL3p5Yi51cHl1bnNvLmNvbS92MTUvc2VhcmNoP2tleXdvcmQ9XFxcIiArIGVuX2FlcyhzKSArIFxcXCImc190eXBlPTImcGFnZT1cXFwiICsgcGFnZSArIFxcXCImYXRrPSZkaWQ9XFxcIiArIGdlbmVyYXRlUmFuZG9tSGV4U3RyaW5nKDY0KSwge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1c2VyLWFnZW50XFxcIjogXFxcIk1vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCAxMDsgUmVkbWkgTm90ZSA3IEJ1aWxkL1FLUTEuMTkwOTEwLjAwMjsgd3YpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS84MS4wLjQwNDQuMTM4IE1vYmlsZSBTYWZhcmkvNTM3LjM2IHVuaS1hcHAgSHRtbDVQbHVzLzEuMCAoSW1tZXJzZWQvMjkuMDkwOTEpXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBsZXQgcmVzcERhdGEgPSBkZV9hZXMocmVzcCk7XFxuICAgICAgICAgICAgICAgIGxldCBqc29uRGF0YSA9IEpTT04ucGFyc2UocmVzcERhdGEpIHx8IHt9O1xcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0ganNvbkRhdGEucmVzdWx0IHx8IHt9O1xcbiAgICAgICAgICAgICAgICBsZXQgaXRlbXMgPSByZXN1bHQuaXRlbXMgfHwgW107XFxuXFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtID0gaXRlbXNbaV07XFxuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGl0ZW0uY29udGVudCB8fCBbXTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA9PSAwIHx8ICFpdGVtLnBhZ2VfdXJsKSBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBkZV9hZXMoaXRlbS5wYWdlX3VybCkgfHwgXFxcIlxcXCI7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXVybCkgY29udGludWU7XFxuICAgICAgICAgICAgICAgICAgICBydG5MaXN0LnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAoaXRlbS50aXRsZS5sZW5ndGggPiAzMCA/IGl0ZW0udGl0bGUuc2xpY2UoMCwgMjcpICsgXFxcIi4uLlxcXCIgOiBpdGVtLnRpdGxlKSB8fCBcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBcXFwi5YiG5Lqr5pe26Ze077yaXFxcIiArIGl0ZW0uaW5zZXJ0X3RpbWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgICAgIHJldHVybiBydG5MaXN0O1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBmdW5jdGlvbiBnZW5lcmF0ZVJhbmRvbUhleFN0cmluZyhsZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyYWN0ZXJzID0gXFxcIjAxMjM0NTY3ODlhYmNkZWZcXFwiO1xcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyYWN0ZXJzTGVuZ3RoID0gY2hhcmFjdGVycy5sZW5ndGg7XFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjaGFyYWN0ZXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFyYWN0ZXJzTGVuZ3RoKSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGFsaVV0aWwgPSAkLnJlcXVpcmUoXFxcImFsaVV0aWxcXFwiKTtcXG4gICAgICAgICAgICBsZXQgQ3J5cHRvSlMgPSBhbGlVdGlsLmdldENyeXB0b0pTKCk7XFxuXFxuICAgICAgICAgICAgZnVuY3Rpb24gZW5fYWVzKGUpIHtcXG4gICAgICAgICAgICAgICAgbGV0IGkgPSBcXFwicXExOTIwNTIwNDYwcXF6elxcXCI7XFxuICAgICAgICAgICAgICAgIC8vIGVuX2Flc1xcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoaSk7XFxuICAgICAgICAgICAgICAgIHZhciB0ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoZSksXFxuICAgICAgICAgICAgICAgICAgICByID0gQ3J5cHRvSlMuQUVTLmVuY3J5cHQodCwga2V5LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaXY6IGtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQyxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gci5jaXBoZXJ0ZXh0LnRvU3RyaW5nKCk7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGZ1bmN0aW9uIGRlX2Flcyh2dikge1xcbiAgICAgICAgICAgICAgICBsZXQgaSA9IFxcXCJxcTE5MjA1MjA0NjBxcXp6XFxcIjtcXG4gICAgICAgICAgICAgICAgLy8gZGVfYWVzXFxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShpKTtcXG4gICAgICAgICAgICAgICAgbGV0IGhleFZhbCA9IENyeXB0b0pTLmVuYy5IZXgucGFyc2UodnYpLFxcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gQ3J5cHRvSlMuZW5jLkJhc2U2NC5zdHJpbmdpZnkoaGV4VmFsKSxcXG4gICAgICAgICAgICAgICAgICAgIGRlY3J5cHRlZCA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KHZhbCwga2V5LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaXY6IGtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQyxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVjcnlwdGVkLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIHNlYXJjaCgpO1xcbiAgICAgICAgfVxcbiAgICB9LCB7XFxuICAgICAgICBuYW1lOiBcXFwi5LqR55uY6LWE5rqQXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IFxcXCJodHRwczovL3Jlcy55dW5wYW4ud2luLz9QYWdlSW5kZXg9XFxcIiArIHBhZ2UgKyBcXFwiJlBhZ2VTaXplPTEyJktleXdvcmQ9XFxcIiArIHMgKyBcXFwiJlR5cGU9JlRhZz1cXFwiO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCh1cmwsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly9yZXMueXVucGFuLndpbi9cXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICBsZXQgYXJyID0gcGRmYShodG1sLCBcXFwibWFpbiYmLmNhcmRcXFwiKTtcXG4gICAgICAgICAgICAvL2xvZyhhcnIpO1xcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcbiAgICAgICAgICAgICAgICBsZXQgdSA9IHBkZmgoaXQsIFxcXCIuY2FyZC1saW5rLDEmJm9uY2xpY2tcXFwiKS5tYXRjaCgvaHR0cHM6XFxcXC9cXFxcLyh3d3dcXFxcLmFsaXl1bmRyaXZlXFxcXC5jb21cXFxcL3N8YWx5d3BcXFxcLm5ldClcXFxcL1xcXFx3Ki9nKSB8fCBbXTtcXG4gICAgICAgICAgICAgICAgdSA9IHUubGVuZ3RoID4gMCA/IHVbMF0gOiB1cmw7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChpdCwgXFxcIi5jYXJkLXRpdGxlJiZUZXh0XFxcIiksXFxuICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiBwZChpdCwgXFxcImltZyYmc3JjXFxcIiwgdXJsKSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogdSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IHBkZmgoaXQsIFxcXCIuY2FyZC10ZXh0LC0xJiZUZXh0XFxcIikgKyBcXFwiXFxcXG5cXFwiICsgdSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwiVVDkupHmkJxcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gXFxcImh0dHBzOi8vYXBpLnVweXVuc28yLmNvbS9zZWFyY2g/a2V5d29yZD1cXFwiICsgcyArIFxcXCImcGFnZT1cXFwiICsgcGFnZSArIFxcXCImc190eXBlPTFcXFwiO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCh1cmwsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly93d3cudXB5dW5zby5jb21cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIkNvb2tpZVxcXCI6IFxcXCJjb2RlPTE5MTlcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAvL2xvZyhiYXNlNjREZWNvZGUoaHRtbCkpO1xcbiAgICAgICAgICAgIGxldCBhcnIgPSBKU09OLnBhcnNlKGJhc2U2NERlY29kZShodG1sKSkucmVzdWx0Lml0ZW1zO1xcbiAgICAgICAgICAgIC8vbG9nKGFycik7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBpZiAoIWFycikgcmV0dXJuIFtdO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGFycltpXTtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBpdC5wYWdlX3VybDtcXG4gICAgICAgICAgICAgICAgLy91ID0gdS5sZW5ndGggPiAwID8gdVswXSA6IHVybDtcXG4gICAgICAgICAgICAgICAgaWYgKCF1LmluY2x1ZGVzKFxcXCJhbGl5dW5kcml2ZVxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0LnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1LFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcIlxcXFxuXFxcIiArICh1KSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi54yr54u455uY5pCcXFxcIixcXG4gICAgICAgIHBhZ2U6IGZhbHNlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChcXFwiaHR0cHM6Ly93d3cuYWxpcGFuc291LmNvbS9zZWFyY2g/az1cXFwiICsgcywge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL3d3dy5hbGlwYW5zb3UuY29tL3NlYXJjaD9rPVxcXCIgKyBzXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBsZXQgYXJyID0gcGRmYShodG1sLCBcXFwiI2FwcCYmYVxcXCIpO1xcbiAgICAgICAgICAgIC8vbG9nKGFycik7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBcXFwiPGRpdj5cXFwiICsgYXJyW2ldICsgXFxcIjwvZGl2PlxcXCI7XFxuICAgICAgICAgICAgICAgIGxldCB1ID0gcGRmaChpdCwgXFxcImEmJmhyZWZcXFwiKTtcXG4gICAgICAgICAgICAgICAgLy9sb2codSk7XFxuICAgICAgICAgICAgICAgIGlmICghdS5pbmNsdWRlcyhcXFwiL3MvXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHUgPSBcXFwiaHR0cHM6Ly93d3cuYWxpcGFuc291LmNvbVxcXCIgKyB1LnJlcGxhY2UoXFxcIi9zL1xcXCIsIFxcXCIvY3YvXFxcIik7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChpdCwgXFxcInRlbXBsYXRlJiZUZXh0XFxcIiksXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBwZGZoKGl0LCBcXFwidGVtcGxhdGUsMSYmVGV4dFxcXCIpLFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9LFxcbiAgICAgICAgZmluZEFsaVVybChpbnB1dCkge1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChpbnB1dCwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiQ29va2llXFxcIjogXFxcIm5vX3Nob3dfZG9uYXRlPTFcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBpbnB1dC5yZXBsYWNlKFxcXCIvY3YvXFxcIiwgXFxcIi9zL1xcXCIpXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0OiBmYWxzZVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGh0bWwgPSBwYXJzZURvbUZvckh0bWwoaHRtbCwgJ2EmJmhyZWYnKTtcXG4gICAgICAgICAgICBpZiAoaHRtbC5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBodG1sO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6IFxcXCLmmJPmkJxcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIHJlZ2lzdGVyVXJsOiBcXFwiaHR0cHM6Ly95aXNvLmZ1blxcXCIsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IGFsaVV0aWwgPSAkLnJlcXVpcmUoXFxcImFsaVV0aWxcXFwiKTtcXG4gICAgICAgICAgICBsZXQgQ3J5cHRvSlMgPSBhbGlVdGlsLmdldENyeXB0b0pTKCk7XFxuXFxuICAgICAgICAgICAgZnVuY3Rpb24ga2V5ZW4oc3RyKSB7XFxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShcXFwiNE9Ub1NjVUZPYWVWVHJIRVxcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgaXYgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShcXFwiOUNMR2FvMXZIS3FtMTdPelxcXCIpO1xcbiAgICAgICAgICAgICAgICB2YXIgZW5jcnlwdGVkID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoe1xcbiAgICAgICAgICAgICAgICAgICAgY2lwaGVydGV4dDogQ3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShzdHIpXFxuICAgICAgICAgICAgICAgIH0sIGtleSwge1xcbiAgICAgICAgICAgICAgICAgICAgaXY6IGl2LFxcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogQ3J5cHRvSlMubW9kZS5DQkMsXFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBDcnlwdG9KUy5wYWQuUGtjczdcXG4gICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5jcnlwdGVkO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoXFxcImh0dHBzOi8veWlzby5mdW4vYXBpL3NlYXJjaD9uYW1lPVxcXCIgKyBzICsgXFxcIiZwYWdlTm89XFxcIiArIHBhZ2UsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly95aXNvLmZ1bi9pbmZvP3NlYXJjaEtleT1cXFwiICsgcyxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJDb29raWVcXFwiOiBnZXRJdGVtKCd5aXNvdWNvb2tlJywgJycpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAvL2xvZyhodG1sKTtcXG4gICAgICAgICAgICBpZiAoaHRtbC5pbmNsdWRlcygn55m75b2V55So5oi35peg6ZmQ5Yi2JykpIHtcXG4gICAgICAgICAgICAgICAgdmFyIGkgPSAwO1xcbiAgICAgICAgICAgICAgICBkbyB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgdHlpbWdsaW4gPSAnaHR0cHM6Ly95aXNvLmZ1bi9hcGkvdXNlci9sb2dpbi9jYXB0Y2hhP3Q9JyArIHBhcnNlSW50KG5ldyBEYXRlKCkuZ2V0VGltZSgpKSArICcnO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGltZyA9IGNvbnZlcnRCYXNlNjRJbWFnZSh0eWltZ2xpbikuc3BsaXQoJywnKVsxXTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb2QgPSByZXF1ZXN0KCdodHRwczovL2FwaS54aG9mZS50b3Avb2NyL2I2NC90ZXh0Jywge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogaW1nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIHZhciB2ZXIgPSBKU09OLnBhcnNlKHJlcXVlc3QoJ2h0dHBzOi8veWlzby5mdW4vYXBpL3VzZXIvbG9naW4nLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVmZXJlcic6ICdodHRwczovL3lpc28uZnVuL2xvZ2luJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Nvb2tpZSc6IGdldENvb2tpZSh0eWltZ2xpbilcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInVzZXJOYW1lXFxcIjogdXNlci5hY2NvdW50LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiB1c2VyLnBhc3N3b3JkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiY29kZVxcXCI6IGNvZFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh2ZXIuY29kZSA9PSAyMDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ+aYk+aQnOeZu+WFpemqjOivgeaIkOWKnycpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oJ3lpc291Y29va2UnLCBnZXRDb29raWUoJ2h0dHBzOi8veWlzby5mdW4nKSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCA9IHJlcXVlc3QoXFxcImh0dHBzOi8veWlzby5mdW4vYXBpL3NlYXJjaD9uYW1lPVxcXCIgKyBzICsgXFxcIiZwYWdlTm89XFxcIiArIHBhZ2UsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly95aXNvLmZ1bi9pbmZvP3NlYXJjaEtleT1cXFwiICsgcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJDb29raWVcXFwiOiBnZXRJdGVtKCd5aXNvdWNvb2tlJywgJycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGkrKztcXG4gICAgICAgICAgICAgICAgfSB3aGlsZSAoaSA8IDQpO1xcblxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgYXJyID0gSlNPTi5wYXJzZShodG1sKS5kYXRhLmxpc3Q7XFxuICAgICAgICAgICAgLy9sb2coYXJyKTtcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGFycltpXTtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBrZXllbihpdC51cmwpO1xcbiAgICAgICAgICAgICAgICAvL2xvZyh1KTtcXG4gICAgICAgICAgICAgICAgaWYgKHUgPT0gbnVsbCB8fCAhdS5pbmNsdWRlcyhcXFwiYWxpeXVuXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXQubmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogdSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IChpdC5nbXRTaGFyZSB8fCBpdC5nbXRDcmVhdGUpICsgXFxcIlxcXFxuXFxcIiArICh1KSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi5bCP57q45p2hXFxcIixcXG4gICAgICAgIHBhZ2U6IGZhbHNlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBhbGlVdGlsID0gJC5yZXF1aXJlKFxcXCJhbGlVdGlsXFxcIik7XFxuXFxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0dG9rZW4oKSB7XFxuICAgICAgICAgICAgICAgIGlmIChnZXRNeVZhcigneHp5dG9rZW4nLCAnJykubGVuZ3RoID09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0b2tlbiA9IEpTT04ucGFyc2UocG9zdCgnaHR0cHM6Ly9naXRjYWZlLm5ldC90b29sL2FsaXBhcGVyLycsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vdS5naXRjYWZlLmluay8nXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2dldF90b2tlbidcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KSkuZGF0YTtcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKCd4enR0b2tlbicsIHRva2VuKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TXlWYXIoJ3h6dHRva2VuJywgJycpO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBmdW5jdGlvbiBjYXRfY29kZShhKSB7XFxuICAgICAgICAgICAgICAgIHZhciBkLCBlLCBiID0gW1xcXCLljY7or63nlLXop4ZcXFwiLCBcXFwi5pel6Z+p55S16KeGXFxcIiwgXFxcIuasp+e+jueUteinhlxcXCIsIFxcXCLlhbbku5bnlLXop4ZcXFwiLCBcXFwi5Y2O6K+t55S15b2xXFxcIiwgXFxcIuaXpemfqeeUteW9sVxcXCIsIFxcXCLmrKfnvo7nlLXlvbFcXFwiLCBcXFwi5YW25LuW55S15b2xXFxcIiwgXFxcIuWNjuivreWKqOa8q1xcXCIsIFxcXCLml6Xpn6nliqjmvKtcXFwiLCBcXFwi5qyn576O5Yqo5ryrXFxcIiwgXFxcIue6quW9leeJh1xcXCIsIFxcXCLnu7zoibrniYdcXFwiLCBcXFwi5pWZ6IKy5Z+56K6tXFxcIiwgXFxcIuWFtuS7luinhumikVxcXCIsIFxcXCLljY7or63pn7PkuZBcXFwiLCBcXFwi5pel6Z+p6Z+z5LmQXFxcIiwgXFxcIuasp+e+jumfs+S5kFxcXCIsIFxcXCLlhbbku5bpn7PkuZBcXFwiLCBcXFwi5aix5LmQ6L2v5Lu2XFxcIiwgXFxcIuezu+e7n+i9r+S7tlxcXCIsIFxcXCLnvZHnu5zova/ku7ZcXFwiLCBcXFwi5Yqe5YWs6L2v5Lu2XFxcIiwgXFxcIuWFtuS7lui9r+S7tlxcXCIsIFxcXCLmvKvnlLtcXFwiLCBcXFwi5bCP6K+0XFxcIiwgXFxcIuWHuueJiOS5plxcXCIsIFxcXCLnn6Xor4bln7norq1cXFwiLCBcXFwi5YW25LuW5paH5qGjXFxcIiwgXFxcIuWjgee6uFxcXCIsIFxcXCLkurrnialcXFwiLCBcXFwi6aOO5pmvXFxcIiwgXFxcIuWFtuS7luWbvueJh1xcXCIsIFxcXCLlhbbku5ZcXFwiXSxcXG4gICAgICAgICAgICAgICAgICAgIGMgPSBbXFxcImh5ZHNcXFwiLCBcXFwicmhkc1xcXCIsIFxcXCJvbWRzXFxcIiwgXFxcInF0ZHNcXFwiLCBcXFwiaHlkeVxcXCIsIFxcXCJyaGR5XFxcIiwgXFxcIm9tZHlcXFwiLCBcXFwicXRkeVxcXCIsIFxcXCJoeWRtXFxcIiwgXFxcInJoZG1cXFwiLCBcXFwib21kbVxcXCIsIFxcXCJqbHBcXFwiLCBcXFwienlwXFxcIiwgXFxcImp5cHhcXFwiLCBcXFwicXRzcFxcXCIsIFxcXCJoeXl5XFxcIiwgXFxcInJoeXlcXFwiLCBcXFwib215eVxcXCIsIFxcXCJxdHl5XFxcIiwgXFxcImtmcmpcXFwiLCBcXFwieHRyalxcXCIsIFxcXCJ3bHJqXFxcIiwgXFxcImJncmpcXFwiLCBcXFwicXRyalxcXCIsIFxcXCJtaFxcXCIsIFxcXCJ4c1xcXCIsIFxcXCJjYnNcXFwiLCBcXFwienNweFxcXCIsIFxcXCJxdHdkXFxcIiwgXFxcImJ6XFxcIiwgXFxcInJ3XFxcIiwgXFxcImZqXFxcIiwgXFxcInF0dHBcXFwiLCBcXFwicXRcXFwiXTtcXG4gICAgICAgICAgICAgICAgZm9yIChkID0gMCwgZSA9IGMubGVuZ3RoOyBlID4gZDsgZCsrKVxcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNbZF0gPT0gYSkgcmV0dXJuIGJbZF07XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSBwb3N0KFxcXCJodHRwczovL2dpdGNhZmUubmV0L3Rvb2wvYWxpcGFwZXIvXFxcIiwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3UuZ2l0Y2FmZS5pbmsvJ1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFxcXCJzZWFyY2hcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogXFxcIndlYlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICB0b2tlbjogZ2V0dG9rZW4oKSxcXG4gICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6IHNcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBKU09OLnBhcnNlKGh0bWwpO1xcbiAgICAgICAgICAgIGlmIChsaXN0LmRhdGEpIHtcXG4gICAgICAgICAgICAgICAgbGlzdCA9IGxpc3QuZGF0YTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGxpc3RbaV1cXG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gaXQudGl0bGU7XFxuICAgICAgICAgICAgICAgIGxldCBtdXJsID0gJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zLycgKyBpdC5hbGlrZXlcXG4gICAgICAgICAgICAgICAgaWYgKCFhbGlVdGlsLmNoZWNrYWxpKG11cmwpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAodGl0bGUuaW5jbHVkZXMocykpIHtcXG4gICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLiiJogXFxcIiArIHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IGNhdF9jb2RlKGl0LmNhdCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzOiBpdC5kZXNcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogbXVybFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6IFxcXCLnjqnlgbblk6Xlk6VcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGJhc2ljVXJsOiBcXFwiaHR0cDovL3dvZ2cueHl6XFxcIixcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gYmFzaWNVcmwgKyBcXFwiL2luZGV4LnBocC92b2RzZWFyY2gvXFxcIiArIHMgKyBcXFwiLS0tLS0tLS0tLVxcXCIgKyBwYWdlICsgXFxcIi0tLS5odG1sXFxcIjtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QodXJsKTtcXG4gICAgICAgICAgICBsZXQgYXJyID0gcGFyc2VEb21Gb3JBcnJheShodG1sLCBcXFwiLm1vZHVsZS1pdGVtcyYmLm1vZHVsZS1zZWFyY2gtaXRlbVxcXCIpO1xcblxcbiAgICAgICAgICAgIGxldCBiZXQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIGxldCB1dGl0bGUgPSBwZGZoKGl0LCBcXFwiaDMmJmEmJlRleHRcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHVzZXJpYWwgPSBwZGZoKGl0LCBcXFwiLnZpZGVvLXNlcmlhbCYmVGV4dFxcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgdWltYWdlID0gcGRmaChpdCwgXFxcImltZyYmZGF0YS1zcmNcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBwZChpdCwgXFxcImgzJiZhJiZocmVmXFxcIiwgYmFzaWNVcmwpO1xcbiAgICAgICAgICAgICAgICBiZXQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdXRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1LFxcbiAgICAgICAgICAgICAgICAgICAgcGljX3VybDogdWltYWdlLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogdXNlcmlhbFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgcmV0dXJuIGJldDtcXG4gICAgICAgIH0sXFxuICAgICAgICBmaW5kQWxpVXJsKGlucHV0KSB7XFxuICAgICAgICAgICAgcmV0dXJuIHBkZmEocmVxdWVzdChpbnB1dCksIFxcXCJib2R5JiYubW9kdWxlLXJvdy10ZXh0LmNvcHlcXFwiKS5tYXAodiA9PiBwZGZoKHYsIFxcXCJhJiZkYXRhLWNsaXBib2FyZC10ZXh0XFxcIikpO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi6Zi/6YeM5LqR55uY572RXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBiYXNpY1VybDogXFxcImh0dHBzOi8vd3d3LmFseXB3LmNuXFxcIixcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gYmFzaWNVcmwgKyBcXFwiL3NlYXJjaC5waHA/cT1cXFwiICsgcyArIFxcXCImcGFnZT1cXFwiICsgcGFnZTtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QodXJsLCB7fSk7XFxuICAgICAgICAgICAgbGV0IGFyciA9IHBkZmEoaHRtbCwgXFxcIi5saXN0JiZsaVxcXCIpO1xcbiAgICAgICAgICAgIGxldCBiZXQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIGxldCB1dGl0bGUgPSBwZGZoKGl0LCBcXFwiYSYmdGl0bGVcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHVzZXJpYWwgPSBwZGZoKGl0LCBcXFwiLmZhLWNsb2NrLW8mJlRleHRcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHVpbWFnZSA9IHBkZmgoaXQsIFxcXCJpbWcmJnNyY1xcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgdSA9IHBkKGl0LCBcXFwiYSYmaHJlZlxcXCIsIGJhc2ljVXJsKTtcXG4gICAgICAgICAgICAgICAgaWYgKCF1dGl0bGUuaW5jbHVkZXMocykpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGJldC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB1dGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxuICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiB1aW1hZ2UsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiB1c2VyaWFsXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICByZXR1cm4gYmV0O1xcbiAgICAgICAgfSxcXG4gICAgICAgIGZpbmRBbGlVcmwoaW5wdXQpIHtcXG4gICAgICAgICAgICByZXR1cm4gcGRmYShyZXF1ZXN0KGlucHV0KSwgXFxcImJvZHkmJmFbaHJlZl49aHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvXVxcXCIpLm1hcCh2ID0+IHBkZmgodiwgXFxcImEmJmhyZWZcXFwiKSk7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6IFxcXCLlnJ/mi6jpvKBcXFwiLFxcbiAgICAgICAgcGFnZTogZmFsc2UsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSBmZXRjaCgnaHR0cHM6Ly93d3cudGJzZHkuY29tL3NlYXJjaC5odG1sP2tleXdvcmQ9JyArIHMgKyAnJmNhdGVnb3J5PTk4MzkyMCZkYXRhX3R5cGU9OTg3OTEwJywge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6IFBDX1VBXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICBsZXQgYXJyID0gcGFyc2VEb21Gb3JBcnJheShodG1sLCAnLnNlYXJjaF9yZXN1bHRfbmV0ZGlza19saXN0JiZhJyk7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIC8vbG9nKGl0KTtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBwYXJzZURvbUZvckh0bWwoaXQsICdhJiZocmVmJyk7XFxuICAgICAgICAgICAgICAgIGxldCB0aXQgPSBwYXJzZURvbUZvckh0bWwoaXQsICcubmV0ZGlza19pdGVtX2RldGFpbF9uYW1lJiZUZXh0Jyk7XFxuICAgICAgICAgICAgICAgIGlmICghdGl0LmluY2x1ZGVzKHMpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAvL2xvZyh1KTtcXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXQsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBcXFwiXFxcXG5cXFwiICsgdSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi6Zi/6YeM5pCcXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoJ2h0dHBzOi8vYWxpc28uY2Mvcy8nICsgcyArICctJyArIHBhZ2UgKyAnLTAuaHRtbCcsIHt9KTtcXG5cXG4gICAgICAgICAgICBsZXQgbGlzdCA9IHBhcnNlRG9tRm9yQXJyYXkoaHRtbCwgJy5zZWFyY2gtcmVzdWx0JiYucmVzb3VyY2UtaXRlbScpO1xcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGlzdC5sZW5ndGg7IGorKykge1xcbiAgICAgICAgICAgICAgICBsZXQgdSA9IGxpc3Rbal07XFxuICAgICAgICAgICAgICAgIGxldCB0aXQgPSBwYXJzZURvbUZvckh0bWwodSwgJ2gzJiZUZXh0Jyk7XFxuICAgICAgICAgICAgICAgIGlmICghdGl0LmluY2x1ZGVzKHMpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdCxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogcGFyc2VEb20odSwgJ2gzJiZhJiZocmVmJywgJ2h0dHBzOi8vYWxpc28uY2MvJyksXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBwYXJzZURvbUZvckh0bWwodSwgJy50aW1lJiZUZXh0JyksXFxuICAgICAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZDtcXG4gICAgICAgIH0sXFxuICAgICAgICBmaW5kQWxpVXJsKGlucHV0KSB7XFxuICAgICAgICAgICAgZXZhbChnZXRDcnlwdG9KUygpKTtcXG5cXG4gICAgICAgICAgICBmdW5jdGlvbiBkZWNyeShzdHIpIHtcXG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKFxcXCI5RUIyMERERkQ2QUZCRDY4XFxcIik7XFxuICAgICAgICAgICAgICAgIHZhciBlbmNyeXB0ZWQgPSBDcnlwdG9KUy5BRVMuZGVjcnlwdChzdHIsIGtleSwge1xcbiAgICAgICAgICAgICAgICAgICAgaXY6IGtleSxcXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6IENyeXB0b0pTLm1vZGUuQ0JDLFxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3XFxuICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY3J5cHRlZDtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KGlucHV0KTtcXG4gICAgICAgICAgICBsZXQgYnV0ID0gcGFyc2VEb20oaHRtbCwgJy5idXR0b24mJmhyZWYnLCAnaHR0cHM6Ly9hbGlzby5jYy8nKTtcXG4gICAgICAgICAgICAvL2xvZyhidXQpO1xcbiAgICAgICAgICAgIGxldCBnb3QgPSByZXF1ZXN0KGJ1dCk7XFxuICAgICAgICAgICAgLy9sb2coZ290KTtcXG4gICAgICAgICAgICBldmFsKHBhcnNlRG9tRm9ySHRtbChnb3QsICdoZWFkJiZzY3JpcHQsMSYmSHRtbCcpKTtcXG4gICAgICAgICAgICByZXR1cm4gZGVjcnkoYmFzZTY0LnNwbGl0KCchJylbMF0pO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi5LqR55uY5YiG5Lqr56S+XFxcIixcXG4gICAgICAgIHBhZ2U6IGZhbHNlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBhbGlVdGlsID0gJC5yZXF1aXJlKFxcXCJhbGlVdGlsXFxcIik7XFxuICAgICAgICAgICAgbGV0IENyeXB0b0pTID0gYWxpVXRpbC5nZXRDcnlwdG9KUygpO1xcblxcbiAgICAgICAgICAgIGZ1bmN0aW9uIGRlY3J5KHN0cikge1xcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoXFxcIjVGNkIyQUszM0RBU0QxMjNcXFwiKTtcXG4gICAgICAgICAgICAgICAgdmFyIGVuY3J5cHRlZCA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KHN0ciwga2V5LCB7XFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkVDQixcXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IENyeXB0b0pTLnBhZC5Qa2NzN1xcbiAgICAgICAgICAgICAgICB9KS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBlbmNyeXB0ZWQ7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChcXFwiaHR0cHM6Ly93d3cueXVucGFuZmVueGlhbmcuY24vYXBpL2Jicy9hcGkvZ2V0ZGF0YT9rZXk9XFxcIiArIHMgKyBcXFwiJnR5cGU9dmlkZW9cXFwiLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vd3d3Lnl1bnBhbmZlbnhpYW5nLmNuL1xcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGxldCBqc29uID0gZGVjcnkoSlNPTi5wYXJzZShodG1sKS5kYXRhKTtcXG4gICAgICAgICAgICBsZXQgYXJyID0gSlNPTi5wYXJzZShqc29uKTtcXG5cXG4gICAgICAgICAgICBsZXQgYmV0ID0gW107XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcbiAgICAgICAgICAgICAgICBsZXQgdXJsID0gaXQucGlkO1xcbiAgICAgICAgICAgICAgICBiZXQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXCJodHRwczovL3d3dy55dW5wYW5mZW54aWFuZy5jbi9hcGkvYmJzL2FwaS9nZXRhcnRpY2xlP2lkPVxcXCIgKyB1cmwsXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXQudGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBpdC5jcmVhdGV0aW1lXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICByZXR1cm4gYmV0O1xcbiAgICAgICAgfSxcXG4gICAgICAgIGZpbmRBbGlVcmwoaW5wdXQpIHtcXG4gICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UocmVxdWVzdChpbnB1dCwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL3d3dy55dW5wYW5mZW54aWFuZy5jbi9cXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KSkuZGF0YTtcXG4gICAgICAgICAgICBsZXQgbGlzdCA9IGpzb24uZG93bmxvYWQuc3BsaXQoXFxcIkBcXFwiKTtcXG4gICAgICAgICAgICBsZXQgYWxpc3QgPSBuZXcgU2V0KCk7XFxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaXN0Lmxlbmd0aDsgaisrKSB7XFxuICAgICAgICAgICAgICAgIGFsaXN0LmFkZChcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvXFxcIiArIGxpc3Rbal0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShhbGlzdCk7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6IFxcXCLnm5jmkJxcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBwYWdlID0gKHBhZ2UgLSAxKSAqIDEwO1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBcXFwiaHR0cHM6Ly93d3cucGFuc2VhcmNoLm1lL3NlYXJjaD9rZXl3b3JkPVxcXCIgKyBzICsgXFxcIiZvZmZzZXQ9XFxcIiArIHBhZ2UgKyBcXFwiJnBhbj1hbGl5dW5kcml2ZVxcXCI7XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KHVybCwge30pO1xcblxcbiAgICAgICAgICAgIGxldCBhcnIgPSBwYXJzZURvbUZvckFycmF5KGh0bWwsICcuZ3JpZCYmLnNoYWRvdzpoYXMoYVtocmVmXj1odHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy9dKScpO1xcbiAgICAgICAgICAgIC8vbG9nKGFycik7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIGxldCB1ID0gcGFyc2VEb21Gb3JIdG1sKGl0LCAnYVtocmVmXj1odHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy9dJiZocmVmJyk7XFxuICAgICAgICAgICAgICAgIGxldCBwaWNfdXJsID0gcGFyc2VEb21Gb3JIdG1sKGl0LCAnaW1nJiZzcmMnKTtcXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBwYXJzZURvbUZvckh0bWwoaXQsICcuYnJlYWstYWxsJiZUZXh0Jykuc3BsaXQoJ2h0dHAnKVswXSxcXG4gICAgICAgICAgICAgICAgICAgIHBpY191cmw6IHBpY191cmwgPT09IFxcXCIvZmF2aWNvbi5wbmdcXFwiID8gXFxcImh0dHBzOi8vd3d3LnBhbnNlYXJjaC5tZS9cXFwiICsgcGljX3VybCA6IHBpY191cmwsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBwYXJzZURvbUZvckh0bWwoaXQsICdwJiZUZXh0JykgKyBcXFwiXFxcXG5cXFwiICsgdSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwiRE9WWOaQnFxcXCIsXFxuICAgICAgICBwYWdlOiBmYWxzZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gXFxcImh0dHBzOi8vYXBpLmRvdngudGsvYWxpL3NlYXJjaD93ZD1cXFwiICsgcztcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QodXJsKTtcXG4gICAgICAgICAgICBsZXQgYXJyID0gSlNPTi5wYXJzZShodG1sKS5saXN0O1xcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgbGV0IGFsaVV0aWwgPSAkLnJlcXVpcmUoXFxcImFsaVV0aWxcXFwiKTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIGxldCB1ID0gaXQudm9kX2NvbnRlbnQ7XFxuICAgICAgICAgICAgICAgIGlmICghdS5pbmNsdWRlcyhcXFwiYWxpeXVuZHJpdmVcXFwiKSB8fCAhYWxpVXRpbC5jaGVja2FsaSh1KSkge1xcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oiaIFxcXCIgKyBpdC52b2RfbmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIHBpY191cmw6IGl0LnZvZF9waWMsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBcXFwiXFxcXG5cXFwiICsgdSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi5b+F5bqUXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IFxcXCJodHRwczovL2NuLmJpbmcuY29tL3NlYXJjaD9xPVxcXCIgKyBzICsgXFxcIithbGl5dW5kcml2ZSZxcz1kcyZmb3JtPVFCUkVcXFwiO1xcbiAgICAgICAgICAgIGlmIChwYWdlICE9IDEpIHtcXG4gICAgICAgICAgICAgICAgdXJsID0gZ2V0TXlWYXIoXFxcImJpbmdcXFwiLCB1cmwpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QodXJsLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vY24uYmluZy5jb20vXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIC8vXFxcIlgtUmVxdWVzdGVkLVdpdGhcXFwiOiBcXFwiY29tLmV4YW1wbGUuaGlrZXJ2aWV3XFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJBY2NlcHRcXFwiOiBcXFwidGV4dC9odG1sLGFwcGxpY2F0aW9uL3hodG1sK3htbCxhcHBsaWNhdGlvbi94bWw7cT0wLjksaW1hZ2UvYXZpZixpbWFnZS93ZWJwLGltYWdlL2FwbmcsKi8qO3E9MC44LGFwcGxpY2F0aW9uL3NpZ25lZC1leGNoYW5nZTt2PWIzO3E9MC45XFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgbGV0IGFyciA9IHBkZmEoaHRtbCwgXFxcImJvZHkmJmFcXFwiKTtcXG4gICAgICAgICAgICAvL2xvZyhhcnIpO1xcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcbiAgICAgICAgICAgICAgICBsZXQgdSA9IHBkKGl0LCBcXFwiYSYmaHJlZlxcXCIsIHVybCk7XFxuICAgICAgICAgICAgICAgIGxldCB0ID0gcGRmaChpdCwgXFxcImEmJlRleHRcXFwiKTtcXG4gICAgICAgICAgICAgICAgaWYgKGl0LmluY2x1ZGVzKFxcXCJOZXh0IHBhZ2VcXFwiKSB8fCBpdC5pbmNsdWRlcyhcXFwi5LiL5LiA6aG1XFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB1MiA9IHBkKGl0LCBcXFwiYSYmaHJlZlxcXCIsIHVybCk7XFxuICAgICAgICAgICAgICAgICAgICAvL2xvZyhcXFwibmV4dCBwYWdlXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAvL2xvZyh1Mik7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiYmluZ1xcXCIsIHUyKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAodSA9PSBudWxsIHx8IHQgPT0gbnVsbCB8fCAhaXQuaW5jbHVkZXMocykpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmICghaXQuaW5jbHVkZXMoXFxcIue9keebmFxcXCIpICYmICFpdC5pbmNsdWRlcyhcXFwi5LqR55uYXFxcIikgJiZcXG4gICAgICAgICAgICAgICAgICAgICFpdC5pbmNsdWRlcyhcXFwiYWxpeXVuZHJpdmVcXFwiKSAmJiAhaXQuaW5jbHVkZXMoXFxcInl1bnBhblxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAodS5zdGFydHNXaXRoKFxcXCJodHRwczovL2NuLmJpbmcuY29tL1xcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgZG9tID0gZ2V0SG9tZSh1KS5yZXBsYWNlKFxcXCJodHRwOi8vXFxcIiwgXFxcIlxcXCIpLnJlcGxhY2UoXFxcImh0dHBzOi8vXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgX2xpbmtzID0gdC5tYXRjaCgvaHR0cHM6XFxcXC9cXFxcLyh3d3dcXFxcLmFsaXl1bmRyaXZlXFxcXC5jb21cXFxcL3N8YWx5d3BcXFxcLm5ldClcXFxcL1xcXFx3Ki9nKSB8fCBbXTtcXG4gICAgICAgICAgICAgICAgbGV0IGMgPSBudWxsO1xcbiAgICAgICAgICAgICAgICBpZiAoX2xpbmtzLmxlbmd0aCA+IDEgJiYgX2xpbmtzWzFdLnJlcGxhY2UoX2xpbmtzWzBdLCBcXFwiXFxcIikucmVwbGFjZSgvW2EtekEtWjAtOV0rL2csIFxcXCJcXFwiKSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgYyA9IF9saW5rc1sxXTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChfbGlua3MubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgYyA9IF9saW5rc1swXTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHQsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBkb20sXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGMgIT0gbnVsbCA/IGMgOiB1LFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi6L+b5YWl572R56uZXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganM6IEpTT04uc3RyaW5naWZ5KFxcXCJoaWtlcjovL3BhZ2UveXNmeD93ZWJVcmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudCh1KSlcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9LFxcbiAgICAgICAgZmluZEFsaVVybChpbnB1dCkge1xcbiAgICAgICAgICAgIGlmIChpbnB1dC5pbmNsdWRlcyhcXFwiYWxpeXVuZHJpdmVcXFwiKSkgcmV0dXJuIGlucHV0O1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChpbnB1dCk7XFxuICAgICAgICAgICAgdmFyIF9saW5rcyA9IGh0bWwubWF0Y2goL2h0dHBzOlxcXFwvXFxcXC8od3d3XFxcXC5hbGl5dW5kcml2ZVxcXFwuY29tXFxcXC9zfGFseXdwXFxcXC5uZXQpXFxcXC9cXFxcdyovZykgfHwgW107XFxuICAgICAgICAgICAgaWYgKF9saW5rcy5sZW5ndGggPiAxICYmIF9saW5rc1sxXS5yZXBsYWNlKF9saW5rc1swXSwgXFxcIlxcXCIpLnJlcGxhY2UoL1thLXpBLVowLTldKy9nLCBcXFwiXFxcIikgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9saW5rc1sxXTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKF9saW5rcy5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBfbGlua3NbMF07XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UveXNmeD93ZWJVcmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChpbnB1dCk7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiAnQ0NPRicsXFxuICAgICAgICBwYWdlOiB0cnVlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBkID0gW11cXG4gICAgICAgICAgICBsZXQgYWxpVXRpbCA9ICQucmVxdWlyZShcXFwiYWxpVXRpbFxcXCIpO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gZmV0Y2goJ2h0dHBzOi8vcGFuLmNjb2YuY2MvYXBpL3NlYXJjaCcsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcImNvbnRlbnQtdHlwZVxcXCI6ICdhcHBsaWNhdGlvbi9qc29uJyxcXG4gICAgICAgICAgICAgICAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vcGFuLmNjb2YuY2Mvc2VhcmNoP2tleXdvcmQ9JyArIHNcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhZ2VTaXplXFxcIjogMjAsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFnZU51bVxcXCI6IHBhZ2UsXFxuICAgICAgICAgICAgICAgICAgICBcXFwia2V5d29yZFxcXCI6IHMsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiZnJvbU1vYmlsZVxcXCI6IHRydWVcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIGxldCBsaXN0ID0gSlNPTi5wYXJzZShodG1sKVxcbiAgICAgICAgICAgICAgICAuZGF0YS5yb3dzXFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGxpc3RbaV07XFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGl0LmZpbGVOYW1lXFxuICAgICAgICAgICAgICAgIGxldCBtdXJsID0gaXQudXJsXFxuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gaXQudHlwZS5yZXBsYWNlKC9mb2xkZXIvLCAn5paH5Lu25aS5JykucmVwbGFjZSgvZmlsZS8sICfmlofku7YnKVxcbiAgICAgICAgICAgICAgICBpZiAodGl0bGUuaW5jbHVkZXMocykpIHtcXG4gICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6ICfmlofku7bnsbvlnovvvJonICsgdHlwZSArICfvvIzmlofku7blpKflsI/vvJonICsgYWxpVXRpbC5ieXRlc1RvU2l6ZShpdC5zaXplKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6IG11cmxcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGRcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgbmFtZTogJ+mYv+mHjOWwj+ermScsXFxuICAgICAgICBwYWdlOiB0cnVlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBob21lID0gXFxcImh0dHBzOi8vcGFuNjY2Lm5ldFxcXCI7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoYnVpbGRVcmwoaG9tZSArIFxcXCIvYXBpL2Rpc2N1c3Npb25zXFxcIiwge1xcbiAgICAgICAgICAgICAgICBcXFwiaW5jbHVkZVxcXCI6IFxcXCJ1c2VyLGxhc3RQb3N0ZWRVc2VyLG1vc3RSZWxldmFudFBvc3QsbW9zdFJlbGV2YW50UG9zdC51c2VyLHRhZ3MsdGFncy5wYXJlbnQsZmlyc3RQb3N0XFxcIixcXG4gICAgICAgICAgICAgICAgXFxcImZpbHRlcltxXVxcXCI6IHMgLyogKyBcXFwiIHRhZzp2aWRlbyxjb21pY1xcXCIqLyAsXFxuICAgICAgICAgICAgICAgIC8vXFxcImZpbHRlclt0YWddXFxcIjogXFxcInZpZGVvLGNvbWljXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcInBhZ2Vbb2Zmc2V0XVxcXCI6IDIwICogKHBhZ2UgLSAxKVxcbiAgICAgICAgICAgIH0pLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJjb250ZW50LXR5cGVcXFwiOiBcXFwiYXBwbGljYXRpb24vanNvblxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL3BhbjY2Ni5uZXQvP3E9XFxcIiArIHNcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0gSlNPTi5wYXJzZShodG1sKS5kYXRhO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IGxpc3RbaV0uYXR0cmlidXRlcztcXG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGhvbWUgKyBcXFwiL2QvXFxcIiArIGl0ZW0uc2x1ZztcXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogJ+WPkeW4g+aXtumXtO+8micgKyAkLmRhdGVGb3JtYXQobmV3IERhdGUoaXRlbS5jcmVhdGVkQXQpLCBcXFwieXl5eS1NTS1kZCBISDptbTpzc1xcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXFxuICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLov5vlhaXluJblrZBcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqczogSlNPTi5zdHJpbmdpZnkoXFxcImhpa2VyOi8vcGFnZS95c2Z4P3dlYlVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHVybCkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgfV1cXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfSxcXG4gICAgICAgIGZpbmRBbGlVcmwoaW5wdXQpIHtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHBkZmgocmVxdWVzdChpbnB1dCksIFxcXCJUZXh0XFxcIik7XFxuICAgICAgICAgICAgbGV0IF9saW5rcyA9IGh0bWwubWF0Y2goL2h0dHBzOlxcXFwvXFxcXC8od3d3XFxcXC5hbGl5dW5kcml2ZVxcXFwuY29tXFxcXC9zfGFseXdwXFxcXC5uZXQpXFxcXC9cXFxcdyovZykgfHwgW107XFxuICAgICAgICAgICAgbGV0IHNoYXJlUHdkID0gaHRtbC5tYXRjaCgv5o+Q5Y+W56CBWzrvvJpdXFxcXHMqPyhcXFxcd3s0fSkvKTtcXG4gICAgICAgICAgICBzaGFyZVB3ZCA9IEFycmF5LmlzQXJyYXkoc2hhcmVQd2QpICYmIHNoYXJlUHdkLmxlbmd0aCA+IDAgPyBzaGFyZVB3ZFsxXSA6IFxcXCJcXFwiO1xcbiAgICAgICAgICAgIGlmIChfbGlua3MubGVuZ3RoID4gMSAmJiBfbGlua3NbMV0ucmVwbGFjZShfbGlua3NbMF0sIFxcXCJcXFwiKS5yZXBsYWNlKC9bYS16QS1aMC05XSsvZywgXFxcIlxcXCIpID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgICAgICBhbGlVcmw6IF9saW5rc1sxXSxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkOiBzaGFyZVB3ZFxcbiAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoX2xpbmtzLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICAgICAgICAgIGFsaVVybDogX2xpbmtzWzBdLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkXFxuICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UveXNmeD93ZWJVcmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChpbnB1dCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiAn5LqR55uY5YiG5Lqr56S+5Yy6JyxcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IGhvbWUgPSBcXFwiaHR0cHM6Ly95dW5wYW4xLmNjXFxcIjtcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChidWlsZFVybChob21lICsgXFxcIi9hcGkvZGlzY3Vzc2lvbnNcXFwiLCB7XFxuICAgICAgICAgICAgICAgIFxcXCJpbmNsdWRlXFxcIjogXFxcInVzZXIsbGFzdFBvc3RlZFVzZXIsbW9zdFJlbGV2YW50UG9zdCxtb3N0UmVsZXZhbnRQb3N0LnVzZXIsdGFncyx0YWdzLnBhcmVudCxmaXJzdFBvc3RcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiZmlsdGVyW3FdXFxcIjogcyAvKiArIFxcXCIgdGFnOnZpZGVvLGNvbWljXFxcIiovICxcXG4gICAgICAgICAgICAgICAgLy9cXFwiZmlsdGVyW3RhZ11cXFwiOiBcXFwidmlkZW8sY29taWNcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwicGFnZVtvZmZzZXRdXFxcIjogMjAgKiAocGFnZSAtIDEpXFxuICAgICAgICAgICAgfSksIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcImNvbnRlbnQtdHlwZVxcXCI6IFxcXCJhcHBsaWNhdGlvbi9qc29uXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vcGFuNjY2Lm5ldC8/cT1cXFwiICsgc1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBKU09OLnBhcnNlKGh0bWwpLmRhdGE7XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdGVtID0gbGlzdFtpXS5hdHRyaWJ1dGVzO1xcbiAgICAgICAgICAgICAgICBsZXQgdXJsID0gaG9tZSArIFxcXCIvZC9cXFwiICsgaXRlbS5zbHVnO1xcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0ZW0udGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiAn5Y+R5biD5pe26Ze077yaJyArICQuZGF0ZUZvcm1hdChuZXcgRGF0ZShpdGVtLmNyZWF0ZWRBdCksIFxcXCJ5eXl5LU1NLWRkIEhIOm1tOnNzXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIui/m+WFpeW4luWtkFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzOiBKU09OLnN0cmluZ2lmeShcXFwiaGlrZXI6Ly9wYWdlL3lzZng/d2ViVXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQodXJsKSlcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9LFxcbiAgICAgICAgZmluZEFsaVVybChpbnB1dCkge1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcGRmaChyZXF1ZXN0KGlucHV0KSwgXFxcIlRleHRcXFwiKTtcXG4gICAgICAgICAgICBsZXQgX2xpbmtzID0gaHRtbC5tYXRjaCgvaHR0cHM6XFxcXC9cXFxcLyh3d3dcXFxcLmFsaXl1bmRyaXZlXFxcXC5jb21cXFxcL3N8YWx5d3BcXFxcLm5ldClcXFxcL1xcXFx3Ki9nKSB8fCBbXTtcXG4gICAgICAgICAgICBsZXQgc2hhcmVQd2QgPSBodG1sLm1hdGNoKC/mj5Dlj5bnoIFbOu+8ml1cXFxccyo/KFxcXFx3ezR9KS8pO1xcbiAgICAgICAgICAgIHNoYXJlUHdkID0gQXJyYXkuaXNBcnJheShzaGFyZVB3ZCkgJiYgc2hhcmVQd2QubGVuZ3RoID4gMCA/IHNoYXJlUHdkWzFdIDogXFxcIlxcXCI7XFxuICAgICAgICAgICAgaWYgKF9saW5rcy5sZW5ndGggPiAxICYmIF9saW5rc1sxXS5yZXBsYWNlKF9saW5rc1swXSwgXFxcIlxcXCIpLnJlcGxhY2UoL1thLXpBLVowLTldKy9nLCBcXFwiXFxcIikgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICAgICAgICAgIGFsaVVybDogX2xpbmtzWzFdLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkXFxuICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChfbGlua3MubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICAgICAgYWxpVXJsOiBfbGlua3NbMF0sXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogc2hhcmVQd2RcXG4gICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS95c2Z4P3dlYlVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGlucHV0KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH0sIHtcXG4gICAgICAgIG5hbWU6IFxcXCLniLHnnIvnvo7liadcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gXFxcImh0dHBzOi8vd3d3LjJrbWouY24vc2VhcmNoLnBocD9xPVxcXCIgKyBzICsgXFxcIiZwYWdlL1xcXCIgKyBwYWdlICsgXFxcIi9cXFwiO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCh1cmwpO1xcbiAgICAgICAgICAgIGxldCBhcnIgPSBwYXJzZURvbUZvckFycmF5KGh0bWwsIFxcXCIubGlzdC1pdCYmbGlcXFwiKTtcXG5cXG4gICAgICAgICAgICBsZXQgYmV0ID0gW107XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcbiAgICAgICAgICAgICAgICBsZXQgdXRpdGxlID0gcGFyc2VEb21Gb3JIdG1sKGl0LCBcXFwiYSYmdGl0bGVcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHVzZXJpYWwgPSBwYXJzZURvbUZvckh0bWwoaXQsIFxcXCIuaW5mbyYmc3Bhbjpub3QoOmhhcyhhKSktLWkmJlRleHRcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHVpbWFnZSA9IHBhcnNlRG9tKGl0LCBcXFwiaW1nJiZzcmNcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBwYXJzZURvbShpdCwgXFxcImEmJmhyZWZcXFwiKTtcXG4gICAgICAgICAgICAgICAgYmV0LnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHV0aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogdSxcXG4gICAgICAgICAgICAgICAgICAgIHBpY191cmw6IHVpbWFnZSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IHVzZXJpYWxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIHJldHVybiBiZXQ7XFxuXFxuICAgICAgICB9LFxcbiAgICAgICAgZmluZEFsaVVybChpbnB1dCkge1xcbiAgICAgICAgICAgIHJldHVybiBwZGZhKHJlcXVlc3QoaW5wdXQpLCBcXFwiYm9keSYmI2Rvd25sb2FkXFxcIikubWFwKHYgPT4gcGRmaCh2LCBcXFwiLmRvd24mJmhyZWZcXFwiKSk7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6IFxcXCLlpYflppnmkJzntKJcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCB1cmw7XFxuICAgICAgICAgICAgaWYgKHBhZ2UgPT09IDEpIHtcXG4gICAgICAgICAgICAgICAgdXJsID0gYnVpbGRVcmwoXFxcImh0dHBzOi8vd3d3Lm1hZ2ljYWxzZWFyY2gudG9wL2FwaS9wc2hvdS9nZXREYXRhXFxcIiwge1xcbiAgICAgICAgICAgICAgICAgICAgd29yZDogcyxcXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFxcXCLpmL/ph4znvZHnm5hcXFwiXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IGJ1aWxkVXJsKFxcXCJodHRwczovL3d3dy5tYWdpY2Fsc2VhcmNoLnRvcC9hcGkvcHNob3UvZ2V0TmV4dFBhZ2VcXFwiLCB7XFxuICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXCJodHRwczovL2FwaS51cHl1bnNvMi5jb20vc2VhcmNoP3NfdHlwZT0yQHBhZ2U9XFxcIiArIHBhZ2UgKyBcXFwiQGtleXdvcmQ9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChzKSxcXG4gICAgICAgICAgICAgICAgICAgIHdlYnNpdGU6IFxcXCLpmL/ph4znvZHnm5hcXFwiXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdCh1cmwsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgUmVmZXJlcjogYnVpbGRVcmwoXFxcImh0dHBzOi8vd3d3Lm1hZ2ljYWxzZWFyY2gudG9wL3NlYXJjaFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JkOiBzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNwYWdlOiAwXFxuICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3VsdCkpO1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0gcmVzdWx0LnJlc3VsdC5pdGVtcztcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcXG4gICAgICAgICAgICAgICAgaWYgKGl0LmlkID09IC0xKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0LnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcIuaXpeacn++8mlxcXCIgKyBpdC5pbnNlcnRfdGltZSArIFxcXCJcXFxcbui3r+W+hO+8mlxcXCIgKyBpdC5wYXRoLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBpdC5wYWdlX3VybFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9XFxuICAgIH1cXG5dO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5paH5Lu25o6S5bqPXCIsXCJwYXRoXCI6XCJGaWxlU29ydGluZ1wiLFwicnVsZVwiOlwibGV0IGNobk51bUNoYXIgPSB7XFxuICAgIOmbtjogMCxcXG4gICAg5LiAOiAxLFxcbiAgICDkuow6IDIsXFxuICAgIOS4iTogMyxcXG4gICAg5ZubOiA0LFxcbiAgICDkupQ6IDUsXFxuICAgIOWFrTogNixcXG4gICAg5LiDOiA3LFxcbiAgICDlhas6IDgsXFxuICAgIOS5nTogOVxcbn07XFxuXFxubGV0IGNobk5hbWVWYWx1ZSA9IHtcXG4gICAg5Y2BOiB7XFxuICAgICAgICB2YWx1ZTogMTAsXFxuICAgICAgICBzZWNVbml0OiBmYWxzZVxcbiAgICB9LFxcbiAgICDnmb46IHtcXG4gICAgICAgIHZhbHVlOiAxMDAsXFxuICAgICAgICBzZWNVbml0OiBmYWxzZVxcbiAgICB9LFxcbiAgICDljYM6IHtcXG4gICAgICAgIHZhbHVlOiAxMDAwLFxcbiAgICAgICAgc2VjVW5pdDogZmFsc2VcXG4gICAgfSxcXG4gICAg5LiHOiB7XFxuICAgICAgICB2YWx1ZTogMTAwMDAsXFxuICAgICAgICBzZWNVbml0OiB0cnVlXFxuICAgIH0sXFxuICAgIOS6vzoge1xcbiAgICAgICAgdmFsdWU6IDEwMDAwMDAwMCxcXG4gICAgICAgIHNlY1VuaXQ6IHRydWVcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBDaGluZXNlVG9OdW1iZXIoY2huU3RyKSB7XFxuICAgIGxldCBydG4gPSAwO1xcbiAgICBsZXQgc2VjdGlvbiA9IDA7XFxuICAgIGxldCBudW1iZXIgPSAwO1xcbiAgICBsZXQgc2VjVW5pdCA9IGZhbHNlO1xcbiAgICBsZXQgc3RyID0gY2huU3RyLnNwbGl0KCcnKTtcXG5cXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgIGxldCBudW0gPSBjaG5OdW1DaGFyW3N0cltpXV07XFxuICAgICAgICBpZiAodHlwZW9mIG51bSAhPT0gJ3VuZGVmaW5lZCcpIHtcXG4gICAgICAgICAgICBudW1iZXIgPSBudW07XFxuICAgICAgICAgICAgaWYgKGkgPT09IHN0ci5sZW5ndGggLSAxKSB7XFxuICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gbnVtYmVyO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IHVuaXQgPSBjaG5OYW1lVmFsdWVbc3RyW2ldXS52YWx1ZTtcXG4gICAgICAgICAgICBzZWNVbml0ID0gY2huTmFtZVZhbHVlW3N0cltpXV0uc2VjVW5pdDtcXG4gICAgICAgICAgICBpZiAoc2VjVW5pdCkge1xcbiAgICAgICAgICAgICAgICBzZWN0aW9uID0gKHNlY3Rpb24gKyBudW1iZXIpICogdW5pdDtcXG4gICAgICAgICAgICAgICAgcnRuICs9IHNlY3Rpb247XFxuICAgICAgICAgICAgICAgIHNlY3Rpb24gPSAwO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gKG51bWJlciAqIHVuaXQpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBudW1iZXIgPSAwO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHJldHVybiBydG4gKyBzZWN0aW9uO1xcbn1cXG5cXG5mdW5jdGlvbiBuYW1lQ29tcGFyZShhLCBiKSB7XFxuICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKVxcbiAgICAgICAgcmV0dXJuIGEgPT0gbnVsbCA/IGIgPT0gbnVsbCA/IDAgOiAtMSA6IDE7XFxuXFxuICAgIGEgPSBhLnJlcGxhY2UoLyhb6Zu25LiA5LqM5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5Lq/XSkvZywgZnVuY3Rpb24obWF0Y2gsIHAxLCBwMiwgcDMsIG9mZnNldCwgc3RyaW5nKSB7XFxuICAgICAgICAvLyBwMSBpcyBub25kaWdpdHMsIHAyIGRpZ2l0cywgYW5kIHAzIG5vbi1hbHBoYW51bWVyaWNzXFxuICAgICAgICByZXR1cm4gQ2hpbmVzZVRvTnVtYmVyKHAxKTtcXG4gICAgfSlcXG4gICAgYiA9IGIucmVwbGFjZSgvKFvpm7bkuIDkuozkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIfkur9dKS9nLCBmdW5jdGlvbihtYXRjaCwgcDEsIHAyLCBwMywgb2Zmc2V0LCBzdHJpbmcpIHtcXG4gICAgICAgIC8vIHAxIGlzIG5vbmRpZ2l0cywgcDIgZGlnaXRzLCBhbmQgcDMgbm9uLWFscGhhbnVtZXJpY3NcXG4gICAgICAgIHJldHVybiBDaGluZXNlVG9OdW1iZXIocDEpO1xcbiAgICB9KVxcblxcbiAgICBsZXQgTlVNQkVSUyA9IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNvbXBpbGUoXFxcIig/PD1cXFxcXFxcXEQpKD89XFxcXFxcXFxkKXwoPzw9XFxcXFxcXFxkKSg/PVxcXFxcXFxcRClcXFwiKVxcbiAgICBsZXQgc3BsaXQxID0gTlVNQkVSUy5zcGxpdChuZXcgamF2YS5sYW5nLlN0cmluZyhhKSk7XFxuICAgIGxldCBzcGxpdDIgPSBOVU1CRVJTLnNwbGl0KG5ldyBqYXZhLmxhbmcuU3RyaW5nKGIpKTtcXG5cXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihzcGxpdDEubGVuZ3RoLCBzcGxpdDIubGVuZ3RoKTsgaSsrKSB7XFxuICAgICAgICBsZXQgYzEgPSBzcGxpdDFbaV0uY2hhckNvZGVBdCgwKTtcXG4gICAgICAgIGxldCBjMiA9IHNwbGl0MltpXS5jaGFyQ29kZUF0KDApO1xcbiAgICAgICAgbGV0IGNtcCA9IDA7XFxuICAgICAgICBsZXQgemVyb0NoYXJDb2RlID0gJzAnLmNoYXJDb2RlQXQoMCk7XFxuICAgICAgICBsZXQgbmluZUNoYXJDb2RlID0gJzknLmNoYXJDb2RlQXQoMCk7XFxuXFxuICAgICAgICBpZiAoYzEgPj0gemVyb0NoYXJDb2RlICYmIGMxIDw9IG5pbmVDaGFyQ29kZSAmJiBjMiA+PSB6ZXJvQ2hhckNvZGUgJiYgYzIgPD0gbmluZUNoYXJDb2RlKSB7XFxuICAgICAgICAgICAgY21wID0gbmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKHNwbGl0MVtpXSkuY29tcGFyZVRvKG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcihzcGxpdDJbaV0pKTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGlmIChjbXAgPT09IDApIHtcXG4gICAgICAgICAgICBsZXQgcmVnZXggPSAvW2EtekEtWjAtOV0vXFxuICAgICAgICAgICAgbGV0IHMxID0gU3RyaW5nKHNwbGl0MVtpXSlcXG4gICAgICAgICAgICBsZXQgczIgPSBTdHJpbmcoc3BsaXQyW2ldKVxcbiAgICAgICAgICAgIGlmIChyZWdleC50ZXN0KHMxKSB8fCByZWdleC50ZXN0KHMyKSkge1xcbiAgICAgICAgICAgICAgICBjbXAgPSBuZXcgamF2YS5sYW5nLlN0cmluZyhzcGxpdDFbaV0pLmNvbXBhcmVUbyhuZXcgamF2YS5sYW5nLlN0cmluZyhzcGxpdDJbaV0pKTtcXG4gICAgICAgICAgICAgICAgLy8gY21wID0gczEubG9jYWxlQ29tcGFyZShzMiwgJ2VuJylcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBjbXAgPSBzMS5sb2NhbGVDb21wYXJlKHMyLCAnemgnKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGlmIChjbXAgIT09IDApIHtcXG4gICAgICAgICAgICByZXR1cm4gY21wO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGxldCBsZW5ndGhDbXAgPSBzcGxpdDEubGVuZ3RoIC0gc3BsaXQyLmxlbmd0aDtcXG4gICAgLy8gaWYgKGxlbmd0aENtcCAhPT0gMCkgbGVuZ3RoQ21wID0gbGVuZ3RoQ21wID4gMCA/IC0xIDogMTtcXG4gICAgcmV0dXJuIGxlbmd0aENtcDtcXG59XFxuJC5leHBvcnRzLm5hbWVDb21wYXJlID0gbmFtZUNvbXBhcmU7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLnmbvlvZXmlrnlvI9cIixcInBhdGhcIjpcImxvZ2luTW9kZVwiLFwicnVsZVwiOlwiJC5leHBvcnRzID0gJChbXFxcIkFQUOaOiOadg+eZu+W9lVxcXCIsIFxcXCLnvZHpobXnmbvlvZXikaBcXFwiLCBcXFwi572R6aG155m75b2V4pGhXFxcIiwgXFxcIlRPS0VO55m75b2VXFxcIl0sIDEsIFxcXCLnmbvlvZXmlrnlvI9cXFwiKS5zZWxlY3QoKCkgPT4ge1xcbiAgICBpZiAoXFxcIue9kemhteeZu+W9leKRoFxcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9wYWdlVGl0bGU955m75b2V6Zi/6YeM5LqR55uYXFxcIlxcbiAgICB9XFxuICAgIGlmIChcXFwi572R6aG155m75b2V4pGhXFxcIiA9PSBpbnB1dCkge1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvbG9naW4jbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP2luZGV4PTAmcGFnZVRpdGxlPeeZu+W9lemYv+mHjOS6keebmFxcXCJcXG4gICAgfVxcbiAgICBpZiAoXFxcIkFQUOaOiOadg+eZu+W9lVxcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP2luZGV4PS0xJnBhZ2VUaXRsZT3nmbvlvZXpmL/ph4zkupHnm5hcXFwiXFxuICAgIH1cXG4gICAgaWYgKFxcXCJUT0tFTueZu+W9lVxcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgIHJldHVybiAkKFxcXCJcXFwiLCBcXFwi6L6T5YWlVE9LRU5cXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGFsaVRva2Vuc0ZpbGVwYXRoID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdG9rZW5QYXRoXFxcIikuYWxpVG9rZW5zRmlsZXBhdGg7XFxuICAgICAgICAgICAgbGV0IGFsaVRva2VuID0ge1xcbiAgICAgICAgICAgICAgICByZWZyZXNoX3Rva2VuOiBpbnB1dC50cmltKClcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShhbGlUb2tlbnNGaWxlcGF0aCwgSlNPTi5zdHJpbmdpZnkoYWxpVG9rZW4pKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgaWYgKFxcXCLljp/nlLvnmbvlvZVcXFwiID09IGlucHV0KSB7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9vcGVuQXBpTG9naW4jbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiO1xcbiAgICB9XFxufSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLpmL/ph4zpk77mjqXljLnphY1cIixcInBhdGhcIjpcImFsaXRlc3RcIixcInJ1bGVcIjpcImpzOlxcbmxldCBtYXRjaFJlZyA9IC9odHRwcz86XFxcXC9cXFxcL3d3dy5hbGkocGFufHl1bmRyaXZlKS5jb21cXFxcL3NcXFxcL1thLXpBLVowLTldezExfShcXFxcL2ZvbGRlclxcXFwvW2EtejAtOV17NDB9KT8vO1xcbmxldCBtYXRjaFJlZ0cgPSAvaHR0cHM/OlxcXFwvXFxcXC93d3cuYWxpKHBhbnx5dW5kcml2ZSkuY29tXFxcXC9zXFxcXC9bYS16QS1aMC05XXsxMX0oXFxcXC9mb2xkZXJcXFxcL1thLXowLTldezQwfSk/L2c7XFxubGV0IHRlc3RSZWcgPSAvd3d3LmFsaShwYW58eXVuZHJpdmUpLmNvbVxcXFwvc1xcXFwvLztcXG4kLmV4cG9ydHMgPSB7XFxuICAgIG1hdGNoQWxpVXJsKHRleHQsIGlzRykge1xcbiAgICAgICAgaWYgKGlzRykge1xcbiAgICAgICAgICAgIGxldCB1cmwgPSB0ZXh0Lm1hdGNoKG1hdGNoUmVnRyk7XFxuICAgICAgICAgICAgaWYgKHVybCkgcmV0dXJuIHVybDtcXG4gICAgICAgICAgICBlbHNlIHJldHVybiBbXTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IHRleHQubWF0Y2gobWF0Y2hSZWcpO1xcbiAgICAgICAgICAgIHJldHVybiB1cmwgPSB1cmwgJiYgdXJsWzBdIHx8IFxcXCJcXFwiO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB0ZXN0KHRleHQpe1xcbiAgICAgICAgcmV0dXJuIHRlc3RSZWcudGVzdCh0ZXh0KTtcXG4gICAgfVxcbn1cXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIm9wZW5BcGnnmbvlvZUt5bqf5byDXCIsXCJwYXRoXCI6XCJvcGVuQXBpTG9naW5cIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwib3BlbkFwaeeZu+W9lVxcXCIpO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgKCkgPT4gY2xlYXJNeVZhcihcXFwiTG9nZ2luZ2luXFxcIikpO1xcblxcbmxldCBkID0gW107XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLngrnlh7vojrflj5bmiavnoIHnmbvlvZXkuoznu7TnoIFcXFwiLFxcbiAgICBkZXNjOiBcXFwi54K55Ye75Zu+54mH5Y+v5Lul5L+d5a2YXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGNsczogXFxcImxvZ2luXFxcIixcXG4gICAgICAgIGlkOlxcXCJnZXRRQ1xcXCJcXG4gICAgfSxcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJMb2dnaW5naW5cXFwiLCBcXFwidHJ1ZVxcXCIpO1xcbiAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuato+WcqOiOt+WPluS6jOe7tOeggVxcXCIpO1xcblxcbiAgICAgICAgZnVuY3Rpb24gZ2V0X3FyY29kZV9zdGF0dXMoc2lkKSB7XFxuICAgICAgICAgICAgbGV0IHJlcyA9IGZldGNoKFxcXCJodHRwczovL29wZW5hcGkuYWxpeXVuZHJpdmUuY29tL29hdXRoL3FyY29kZS9cXFwiICsgc2lkICsgXFxcIi9zdGF0dXNcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXMpO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgZnVuY3Rpb24gZ2V0X3JlZnJlc2hfdG9rZW4oY29kZSkge1xcbiAgICAgICAgICAgIGxldCByZXMgPSBwb3N0KFxcXCJodHRwczovL2FsaXl1bmRyaXZlLW9hdXRoLm1lc3NlbnNlLm1lL29hdXRoL2FjY2Vzc190b2tlblxcXCIsIHtcXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICAgICAgXFxcImdyYW50X3R5cGVcXFwiOiBcXFwiYXV0aG9yaXphdGlvbl9jb2RlXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJjb2RlXFxcIjogY29kZSxcXG4gICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlcyk7XFxuICAgICAgICAgICAgcmV0dXJuIGRhdGFbXFxcInJlZnJlc2hfdG9rZW5cXFwiXTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCByZXMgPSBwb3N0KFxcXCJodHRwczovL2FsaXl1bmRyaXZlLW9hdXRoLm1lc3NlbnNlLm1lL29hdXRoL2F1dGhvcml6ZS9xcmNvZGVcXFwiLCB7XFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICBcXFwic2NvcGVzXFxcIjogW1xcXCJ1c2VyOmJhc2VcXFwiLCBcXFwiZmlsZTphbGw6cmVhZFxcXCIsIFxcXCJmaWxlOmFsbDp3cml0ZVxcXCJdLFxcbiAgICAgICAgICAgICAgICBcXFwid2lkdGhcXFwiOiAzMDAsXFxuICAgICAgICAgICAgICAgIFxcXCJoZWlnaHRcXFwiOiAzMDAsXFxuICAgICAgICAgICAgfSksXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXMpO1xcbiAgICAgICAgbGV0IHNpZCA9IGRhdGFbXFxcInNpZFxcXCJdO1xcbiAgICAgICAgbGV0IHFyY29kZV91cmwgPSBkYXRhW1xcXCJxckNvZGVVcmxcXFwiXTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oXFxcImluZm9PdXRwdXRcXFwiLCB7XFxuICAgICAgICAgICAgcGljX3VybDogcXJjb2RlX3VybCxcXG4gICAgICAgICAgICB1cmw6IHFyY29kZV91cmwgKyBcXFwiIy5qcGdcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwicGljXzFfZnVsbFxcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgYWRkSXRlbUFmdGVyKFxcXCJpbmZvT3V0cHV0XFxcIiwge1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCY4oCY4oCZ4oCZXFxcIiArIFxcXCLkvb/nlKjpmL/ph4zkupHnm5ggQXBwIOaJq+eggVxcXCIuZm9udGNvbG9yKFxcXCJncmV5XFxcIiksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBjbHM6IFxcXCJsb2dpblxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGRlbGV0ZUl0ZW0oXFxcImdldFFDXFxcIik7XFxuICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgbGV0IHJlZnJlc2hfdG9rZW47XFxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xcbiAgICAgICAgICAgIGxldCBkYXRhO1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGRhdGEgPSBnZXRfcXJjb2RlX3N0YXR1cyhzaWQpO1xcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+afpeivouaJq+eggee7k+aenOi2heaXtiwg5Y+v6IO95piv6Kem5Y+R5LqG6Zi/6YeM5LqR55uY5o6l5Y+j6ZmQ5Yi2LCDor7fnqI3lkI7lho3or5UuXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGRhdGFbXFxcInN0YXR1c1xcXCJdO1xcbiAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gXFxcIkxvZ2luU3VjY2Vzc1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaF90b2tlbiA9IGdldF9yZWZyZXNoX3Rva2VuKGRhdGFbXFxcImF1dGhDb2RlXFxcIl0pO1xcbiAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IFxcXCJRUkNvZGVFeHBpcmVkXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LqM57u056CB5bey6L+H5pyfLCDor7fliLfmlrDpobXpnaLlkI7ph43or5VcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoIWdldE15VmFyKFxcXCJMb2dnaW5naW5cXFwiLCBcXFwiXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL2NhbmNlbFxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAoMTUwMCk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAocmVmcmVzaF90b2tlbikge1xcbiAgICAgICAgICAgIGNvbnN0IHtcXG4gICAgICAgICAgICAgICAgb3BlblRva2Vuc0ZpbGVwYXRoLFxcbiAgICAgICAgICAgIH0gPSAkLnJlcXVpcmUoXFxcInRva2VuUGF0aFxcXCIpO1xcbiAgICAgICAgICAgIGxldCBvcGVuID0ge1xcbiAgICAgICAgICAgICAgICBSZWZyZXNoVG9rZW5PcGVuOiByZWZyZXNoX3Rva2VuLFxcbiAgICAgICAgICAgICAgICBpc1YyOiB0cnVlXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICB3cml0ZUZpbGUob3BlblRva2Vuc0ZpbGVwYXRoLCBKU09OLnN0cmluZ2lmeShvcGVuKSk7XFxuICAgICAgICAgICAgYWRkSXRlbUFmdGVyKFxcXCJpbmZvT3V0cHV0XFxcIiwge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIueZu+W9leaIkOWKnyjngrnlh7vov5Tlm54pXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCk9PntcXG4gICAgICAgICAgICAgICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKFxcXCJsb2dpblxcXCIpO1xcblxcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9zdWNjZXNzXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9mYWlsXFxcIjtcXG4gICAgfSlcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBcXFwiaW5mb091dHB1dFxcXCIsXFxuICAgICAgICBjbHM6IFxcXCJsb2dpblxcXCJcXG4gICAgfVxcbn0pO1xcblxcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIm9wZW5BcGk6YWxpc3RcIixcInBhdGhcIjpcIm9wZW5BcGlfYWxpc3RcIixcInJ1bGVcIjpcIlxcbmZ1bmN0aW9uIE9wZW5BcGlBbGlzdCgkdGhpcykge1xcbiAgICB0aGlzLiR0aGlzID0gJHRoaXM7XFxufVxcbk9iamVjdC5hc3NpZ24oT3BlbkFwaUFsaXN0LnByb3RvdHlwZSwge1xcbiAgICBnZXRPcGVuVG9rZW5Db2RlKCkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuJHRoaXMucG9zdEFwaSgnaHR0cHM6Ly9vcGVuLmFsaXl1bmRyaXZlLmNvbS9vYXV0aC91c2Vycy9hdXRob3JpemU/Y2xpZW50X2lkPScgKyAnNzY5MTdjY2NjZDQ0NDFjMzk0NTdhMDRmNjA4NGZiMmYnICsgJyZyZWRpcmVjdF91cmk9aHR0cHM6Ly9hbGlzdC5ubi5jaS90b29sL2FsaXl1bmRyaXZlL2NhbGxiYWNrJyArICcmc2NvcGU9dXNlcjpiYXNlLGZpbGU6YWxsOnJlYWQsZmlsZTphbGw6d3JpdGUmc3RhdGU9JykuYm9keSh7XFxuICAgICAgICAgICAgXFxcImF1dGhvcml6ZVxcXCI6IDEsXFxuICAgICAgICAgICAgXFxcInNjb3BlXFxcIjogXFxcInVzZXI6YmFzZSxmaWxlOmFsbDpyZWFkLGZpbGU6YWxsOndyaXRlXFxcIlxcbiAgICAgICAgfSkuaGVhZGVycyh7XFxuICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiBQQ19VQSxcXG4gICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJyxcXG4gICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMuJHRoaXMucmVhY2Nlc3NUaywgLy9nZXRBY2Nlc3NUb2tlblxcbiAgICAgICAgICAgICd4LWNhbmFyeSc6ICdjbGllbnQ9d2ViLGFwcD1zaGFyZSx2ZXJzaW9uPXYyLjMuMScsXFxuICAgICAgICAgICAgJ3gtc2hhcmUtdG9rZW4nOiB0aGlzLiR0aGlzLnNoYXJlVG9rZW5cXG4gICAgICAgIH0pLmVycm9yV2l0aFJldHJ5KChlLF8saHR0cCkgPT4ge1xcbiAgICAgICAgICAgIHRoaXMuJHRoaXMudHJ5U29sdmUoZSk7XFxuICAgICAgICAgICAgaHR0cC5tZXJnZUhlYWRBbmRCb2R5KHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLiR0aGlzLnJlYWNjZXNzVGssXFxuICAgICAgICAgICAgICAgICAgICAneC1zaGFyZS10b2tlbic6IHRoaXMuJHRoaXMuc2hhcmVUb2tlblxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9KS5zdGFydCh0cnVlKTtcXG4gICAgICAgIGxldCBjb2RlID0gcmVzdWx0LnJlZGlyZWN0VXJpLnNwbGl0KFxcXCJjb2RlPVxcXCIpWzFdO1xcbiAgICAgICAgcmV0dXJuIGNvZGU7XFxuICAgIH0sXFxuICAgIGdldFRva2VuKGJvZHkpIHtcXG4gICAgICAgIGxldCBqc29uID0gcG9zdCgnaHR0cHM6Ly9hcGkueGhvZmUudG9wL2FsaXN0L2FsaV9vcGVuL2NvZGUnLCB7XFxuICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6IFBDX1VBLFxcbiAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJ1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXFxuICAgICAgICB9KTtcXG4gICAgICAgIGlmICghanNvbikge1xcbiAgICAgICAgICAgIGpzb24gPSBwb3N0KCdodHRwczovL2FwaS1jZi5ubi5jaS9hbGlzdC9hbGlfb3Blbi9jb2RlJywge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChqc29uLmluY2x1ZGVzKCdUb28gTWFueSBSZXF1ZXN0cycpIHx8IGpzb24uaW5jbHVkZXMoXFxcIjUwMiBCYWQgR2F0ZXdheVxcXCIpKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLpopHnuYHor7fmsYLmmoLml7booqvlsIHnpoFcXFxcblxcXCIgKyBqc29uKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IG9wZW5SZXN1bHQgPSBKU09OLnBhcnNlKGpzb24pO1xcbiAgICAgICAgICAgIHJldHVybiBvcGVuUmVzdWx0O1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICBnZXRPcGVuVG9rZW4oKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbih7XFxuICAgICAgICAgICAgY29kZTogdGhpcy5nZXRPcGVuVG9rZW5Db2RlKCksXFxuICAgICAgICAgICAgZ3JhbnRfdHlwZTogXFxcImF1dGhvcml6YXRpb25fY29kZVxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9LFxcbiAgICByZWZyZXNoT3BlblRva2VuKCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW4oe1xcbiAgICAgICAgICAgIGdyYW50X3R5cGU6IFxcXCJyZWZyZXNoX3Rva2VuXFxcIixcXG4gICAgICAgICAgICByZWZyZXNoX3Rva2VuOiB0aGlzLiR0aGlzLm9wZW5Ub2tlbnMuUmVmcmVzaFRva2VuT3BlbixcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufSk7XFxuJC5leHBvcnRzID0gT3BlbkFwaUFsaXN0O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwib3BlbkFwaTphbGl5dW5kcml2ZVwiLFwicGF0aFwiOlwib3BlbkFwaV9hbGl5dW5kcml2ZVwiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gT3BlbkFwaSgkdGhpcywgcG9zdEFwaSkge1xcbiAgICB0aGlzLiR0aGlzID0gJHRoaXM7XFxufVxcblxcbk9iamVjdC5hc3NpZ24oT3BlbkFwaS5wcm90b3R5cGUsIHtcXG4gICAgZ2V0T3BlblRva2VuQ29kZSgpIHtcXG4gICAgICAgIGZ1bmN0aW9uIGdldF9xcmNvZGVfY29kZShzaWQpIHtcXG4gICAgICAgICAgICBsZXQgcmVzID0gZmV0Y2goXFxcImh0dHBzOi8vb3BlbmFwaS5hbGl5dW5kcml2ZS5jb20vb2F1dGgvcXJjb2RlL1xcXCIgKyBzaWQgKyBcXFwiL3N0YXR1c1xcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlcykuYXV0aENvZGU7XFxuICAgICAgICB9XFxuXFxuICAgICAgICBsZXQgcmVzID0gcG9zdChcXFwiaHR0cHM6Ly9hbGl5dW5kcml2ZS1vYXV0aC5tZXNzZW5zZS5tZS9vYXV0aC9hdXRob3JpemUvcXJjb2RlXFxcIiwge1xcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgXFxcInNjb3Blc1xcXCI6IFtcXFwidXNlcjpiYXNlXFxcIiwgXFxcImZpbGU6YWxsOnJlYWRcXFwiLCBcXFwiZmlsZTphbGw6d3JpdGVcXFwiXSxcXG4gICAgICAgICAgICAgICAgXFxcIndpZHRoXFxcIjogMzAwLFxcbiAgICAgICAgICAgICAgICBcXFwiaGVpZ2h0XFxcIjogMzAwLFxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgfSk7XFxuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzKTtcXG4gICAgICAgIGxldCBzaWQgPSBkYXRhW1xcXCJzaWRcXFwiXTtcXG4gICAgICAgIGxldCBib2R5ID0ge1xcbiAgICAgICAgICAgIFxcXCJhdXRob3JpemVcXFwiOiAxLFxcbiAgICAgICAgICAgIFxcXCJzY29wZVxcXCI6IFxcXCJ1c2VyOmJhc2UsZmlsZTphbGw6cmVhZCxmaWxlOmFsbDp3cml0ZVxcXCIsXFxuICAgICAgICAgICAgXFxcImRyaXZlc1xcXCI6IFtcXFwiYmFja3VwXFxcIiwgXFxcInJlc291cmNlXFxcIl0sXFxuICAgICAgICAgICAgXFxcInNjb3Blc1xcXCI6IFtcXFwidXNlcjpiYXNlXFxcIiwgXFxcImZpbGU6YWxsOnJlYWRcXFwiLCBcXFwiZmlsZTphbGw6d3JpdGVcXFwiXSxcXG4gICAgICAgICAgICBcXFwic2lkXFxcIjogc2lkXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgaGVhZGVycyA9IHtcXG4gICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMuJHRoaXMucmVhY2Nlc3NUa1xcbiAgICAgICAgfTtcXG4gICAgICAgIGxldCByZXMyID0gdGhpcy4kdGhpcy5wb3N0QXBpKFxcXCJodHRwczovL29wZW4uYWxpeXVuZHJpdmUuY29tL29hdXRoL3VzZXJzL3FyY29kZS9hdXRob3JpemU/c2lkPVxcXCIgKyBzaWQpLmJvZHkoYm9keSkuaGVhZGVycyhoZWFkZXJzKS5lcnJvcldpdGhSZXRyeSgoZSwgXywgaHR0cCkgPT4ge1xcbiAgICAgICAgICAgIHRoaXMuJHRoaXMudHJ5U29sdmUoZSk7XFxuICAgICAgICAgICAgaHR0cC5tZXJnZUhlYWRBbmRCb2R5KHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLiR0aGlzLnJlYWNjZXNzVGssXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcbiAgICAgICAgcmV0dXJuIGdldF9xcmNvZGVfY29kZShzaWQpO1xcbiAgICB9LFxcbiAgICBnZXRUb2tlbihib2R5KSB7XFxuICAgICAgICBsZXQgcmVzID0gcG9zdChcXFwiaHR0cHM6Ly9hbGl5dW5kcml2ZS1vYXV0aC5tZXNzZW5zZS5tZS9vYXV0aC9hY2Nlc3NfdG9rZW5cXFwiLCB7XFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXMpO1xcblxcbiAgICAgICAgcmV0dXJuIGRhdGE7XFxuICAgIH0sXFxuICAgIGdldE9wZW5Ub2tlbigpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmdldFRva2VuKHtcXG4gICAgICAgICAgICBjb2RlOiB0aGlzLmdldE9wZW5Ub2tlbkNvZGUoKSxcXG4gICAgICAgICAgICBncmFudF90eXBlOiBcXFwiYXV0aG9yaXphdGlvbl9jb2RlXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH0sXFxuICAgIHJlZnJlc2hPcGVuVG9rZW4oKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbih7XFxuICAgICAgICAgICAgZ3JhbnRfdHlwZTogXFxcInJlZnJlc2hfdG9rZW5cXFwiLFxcbiAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IHRoaXMuJHRoaXMub3BlblRva2Vucy5SZWZyZXNoVG9rZW5PcGVuLFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59KTtcXG4kLmV4cG9ydHMgPSBPcGVuQXBpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwib3BlbkFwaTp0dmJveFwiLFwicGF0aFwiOlwib3BlbkFwaV90dmJveFwiLFwicnVsZVwiOlwiZnVuY3Rpb24gT3BlbkFwaSgkdGhpcykge1xcbiAgICB0aGlzLiR0aGlzID0gJHRoaXM7XFxufVxcblxcbk9iamVjdC5hc3NpZ24oT3BlbkFwaS5wcm90b3R5cGUsIHtcXG4gICAgZ2V0T3BlblRva2VuQ29kZSgpIHtcXG4gICAgICAgIGZ1bmN0aW9uIGdldF9xcmNvZGVfY29kZShzaWQpIHtcXG4gICAgICAgICAgICBsZXQgcmVzID0gZmV0Y2goXFxcImh0dHBzOi8vb3BlbmFwaS5hbGl5dW5kcml2ZS5jb20vb2F1dGgvcXJjb2RlL1xcXCIgKyBzaWQgKyBcXFwiL3N0YXR1c1xcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlcykuYXV0aENvZGU7XFxuICAgICAgICB9XFxuXFxuICAgICAgICBsZXQgcmVzID0gZmV0Y2goXFxcImh0dHA6Ly8xNTkuNzUuMjA4LjQ3L2Nsb3VkaXNrL2FwaS9vYXV0aC9hdXRob3JpemUvcXJjb2RlXFxcIik7XFxuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzKTtcXG4gICAgICAgIGxldCBzaWQgPSBkYXRhW1xcXCJzaWRcXFwiXTtcXG4gICAgICAgIGxldCBib2R5ID0ge1xcbiAgICAgICAgICAgIFxcXCJhdXRob3JpemVcXFwiOiAxLFxcbiAgICAgICAgICAgIFxcXCJzY29wZVxcXCI6IFxcXCJ1c2VyOmJhc2UsZmlsZTphbGw6cmVhZCxmaWxlOmFsbDp3cml0ZVxcXCIsXFxuICAgICAgICAgICAgXFxcImRyaXZlc1xcXCI6IFtcXFwiYmFja3VwXFxcIiwgXFxcInJlc291cmNlXFxcIl0sXFxuICAgICAgICAgICAgXFxcInNjb3Blc1xcXCI6IFtcXFwidXNlcjpiYXNlXFxcIiwgXFxcImZpbGU6YWxsOnJlYWRcXFwiLCBcXFwiZmlsZTphbGw6d3JpdGVcXFwiXSxcXG4gICAgICAgICAgICBcXFwic2lkXFxcIjogc2lkXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgaGVhZGVycyA9IHtcXG4gICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMuJHRoaXMucmVhY2Nlc3NUa1xcbiAgICAgICAgfTtcXG4gICAgICAgIGxldCByZXMyID0gdGhpcy4kdGhpcy5wb3N0QXBpKFxcXCJodHRwczovL29wZW4uYWxpeXVuZHJpdmUuY29tL29hdXRoL3VzZXJzL3FyY29kZS9hdXRob3JpemU/c2lkPVxcXCIgKyBzaWQpLmJvZHkoYm9keSkuaGVhZGVycyhoZWFkZXJzKS5lcnJvcldpdGhSZXRyeSgoZSwgXywgaHR0cCkgPT4ge1xcbiAgICAgICAgICAgIHRoaXMuJHRoaXMudHJ5U29sdmUoZSk7XFxuICAgICAgICAgICAgaHR0cC5tZXJnZUhlYWRBbmRCb2R5KHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLiR0aGlzLnJlYWNjZXNzVGssXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcbiAgICAgICAgcmV0dXJuIGdldF9xcmNvZGVfY29kZShzaWQpO1xcbiAgICB9LFxcbiAgICBnZXRUb2tlbihib2R5KSB7XFxuICAgICAgICBsZXQgdXJsID0gXFxcIlxcXCI7XFxuICAgICAgICBpZiAoYm9keS5jb2RlKSB7XFxuICAgICAgICAgICAgdXJsID0gYnVpbGRVcmwoXFxcImh0dHA6Ly8xNTkuNzUuMjA4LjQ3L2Nsb3VkaXNrL2FwaS9vYXV0aC9hY2Nlc3NUb2tlblxcXCIsIHtcXG4gICAgICAgICAgICAgICAgYXV0aENvZGU6IGJvZHkuY29kZVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB1cmwgPSBidWlsZFVybChcXFwiaHR0cDovLzE1OS43NS4yMDguNDcvY2xvdWRpc2svYXBpL29hdXRoL2FjY2Vzc1Rva2VuXFxcIiwge1xcbiAgICAgICAgICAgICAgICByZWZyZXNoVG9rZW46IGJvZHkucmVmcmVzaF90b2tlblxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJlcyA9IGZldGNoKHVybCk7XFxuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzKTtcXG4gICAgICAgIGxldCByZXQgPSB7XFxuICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogZGF0YS5yZWZyZXNoVG9rZW4sXFxuICAgICAgICAgICAgdG9rZW5fdHlwZTogZGF0YS50b2tlblR5cGUsXFxuICAgICAgICAgICAgYWNjZXNzX3Rva2VuOiBkYXRhLmFjY2Vzc1Rva2VuXFxuICAgICAgICB9O1xcbiAgICAgICAgcmV0dXJuIHJldDtcXG4gICAgfSxcXG4gICAgZ2V0T3BlblRva2VuKCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW4oe1xcbiAgICAgICAgICAgIGNvZGU6IHRoaXMuZ2V0T3BlblRva2VuQ29kZSgpLFxcbiAgICAgICAgICAgIGdyYW50X3R5cGU6IFxcXCJhdXRob3JpemF0aW9uX2NvZGVcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfSxcXG4gICAgcmVmcmVzaE9wZW5Ub2tlbigpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmdldFRva2VuKHtcXG4gICAgICAgICAgICBncmFudF90eXBlOiBcXFwicmVmcmVzaF90b2tlblxcXCIsXFxuICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogdGhpcy4kdGhpcy5vcGVuVG9rZW5zLlJlZnJlc2hUb2tlbk9wZW4sXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn0pO1xcbiQuZXhwb3J0cyA9IE9wZW5BcGk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJvcGVuQXBpOlhCWVwiLFwicGF0aFwiOlwib3BlbkFwaV9YQllcIixcInJ1bGVcIjpcImpzOlxcbmZ1bmN0aW9uIE9wZW5BcGkoJHRoaXMsIHBvc3RBcGkpIHtcXG4gICAgdGhpcy4kdGhpcyA9ICR0aGlzO1xcbn1cXG5cXG5PYmplY3QuYXNzaWduKE9wZW5BcGkucHJvdG90eXBlLCB7XFxuICAgIGNsaWVudF9zZWNyZXQ6IFxcXCI2M2YwNmMzYzVjNWQ0ZTExOTZlMmMxM2U4NTg4YWUyOVxcXCIsXFxuICAgIGNsaWVudF9pZDogXFxcImRmNDNlMjJmMDIyZDRjMDRiNmUyOTk2NGYzYjhiNDZkXFxcIixcXG4gICAgZ2V0T3BlblRva2VuQ29kZSgpIHtcXG4gICAgICAgIGZ1bmN0aW9uIGdldF9xcmNvZGVfY29kZShzaWQpIHtcXG4gICAgICAgICAgICBsZXQgcmVzID0gZmV0Y2goXFxcImh0dHBzOi8vb3BlbmFwaS5hbGl5dW5kcml2ZS5jb20vb2F1dGgvcXJjb2RlL1xcXCIgKyBzaWQgKyBcXFwiL3N0YXR1c1xcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlcykuYXV0aENvZGU7XFxuICAgICAgICB9XFxuXFxuICAgICAgICBsZXQgcmVzID0gcG9zdChcXFwiaHR0cHM6Ly9vcGVuYXBpLmFsaXl1bmRyaXZlLmNvbS9vYXV0aC9hdXRob3JpemUvcXJjb2RlXFxcIiwge1xcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgXFxcInNjb3Blc1xcXCI6IFtcXFwidXNlcjpiYXNlXFxcIiwgXFxcImZpbGU6YWxsOnJlYWRcXFwiLCBcXFwiZmlsZTphbGw6d3JpdGVcXFwiXSxcXG4gICAgICAgICAgICAgICAgXFxcImNsaWVudF9zZWNyZXRcXFwiOiB0aGlzLmNsaWVudF9zZWNyZXQsXFxuICAgICAgICAgICAgICAgIFxcXCJjbGllbnRfaWRcXFwiOiB0aGlzLmNsaWVudF9pZCxcXG4gICAgICAgICAgICAgICAgXFxcIndpZHRoXFxcIjogMzUwLFxcbiAgICAgICAgICAgICAgICBcXFwiaGVpZ2h0XFxcIjogMzUwLFxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgfSk7XFxuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzKTtcXG4gICAgICAgIGxldCBzaWQgPSBkYXRhW1xcXCJzaWRcXFwiXTtcXG4gICAgICAgIGxldCBib2R5ID0ge1xcbiAgICAgICAgICAgIFxcXCJhdXRob3JpemVcXFwiOiAxLFxcbiAgICAgICAgICAgIFxcXCJzY29wZVxcXCI6IFxcXCJ1c2VyOmJhc2UsZmlsZTphbGw6cmVhZCxmaWxlOmFsbDp3cml0ZVxcXCIsXFxuICAgICAgICAgICAgXFxcImRyaXZlc1xcXCI6IFtcXFwiYmFja3VwXFxcIiwgXFxcInJlc291cmNlXFxcIl0sXFxuICAgICAgICAgICAgXFxcInNjb3Blc1xcXCI6IFtcXFwidXNlcjpiYXNlXFxcIiwgXFxcImZpbGU6YWxsOnJlYWRcXFwiLCBcXFwiZmlsZTphbGw6d3JpdGVcXFwiXSxcXG4gICAgICAgICAgICBcXFwic2lkXFxcIjogc2lkXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgaGVhZGVycyA9IHtcXG4gICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMuJHRoaXMucmVhY2Nlc3NUa1xcbiAgICAgICAgfTtcXG4gICAgICAgIGxldCByZXMyID0gdGhpcy4kdGhpcy5wb3N0QXBpKFxcXCJodHRwczovL29wZW4uYWxpeXVuZHJpdmUuY29tL29hdXRoL3VzZXJzL3FyY29kZS9hdXRob3JpemU/c2lkPVxcXCIgKyBzaWQpLmJvZHkoYm9keSkuaGVhZGVycyhoZWFkZXJzKS5lcnJvcldpdGhSZXRyeSgoZSwgXywgaHR0cCkgPT4ge1xcbiAgICAgICAgICAgIHRoaXMuJHRoaXMudHJ5U29sdmUoZSk7XFxuICAgICAgICAgICAgaHR0cC5tZXJnZUhlYWRBbmRCb2R5KHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLiR0aGlzLnJlYWNjZXNzVGssXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcbiAgICAgICAgcmV0dXJuIGdldF9xcmNvZGVfY29kZShzaWQpO1xcbiAgICB9LFxcbiAgICBnZXRUb2tlbihib2R5KSB7XFxuICAgICAgICBsZXQgcmVzID0gcG9zdChcXFwiaHR0cHM6Ly9vcGVuYXBpLmFsaXl1bmRyaXZlLmNvbS9vYXV0aC9hY2Nlc3NfdG9rZW5cXFwiLCB7XFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXMpO1xcblxcbiAgICAgICAgcmV0dXJuIGRhdGE7XFxuICAgIH0sXFxuICAgIGdldE9wZW5Ub2tlbigpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmdldFRva2VuKHtcXG4gICAgICAgICAgICBjb2RlOiB0aGlzLmdldE9wZW5Ub2tlbkNvZGUoKSxcXG4gICAgICAgICAgICBncmFudF90eXBlOiBcXFwiYXV0aG9yaXphdGlvbl9jb2RlXFxcIixcXG4gICAgICAgICAgICBjbGllbnRfc2VjcmV0OiB0aGlzLmNsaWVudF9zZWNyZXQsXFxuICAgICAgICAgICAgY2xpZW50X2lkOiB0aGlzLmNsaWVudF9pZCxcXG4gICAgICAgIH0pO1xcbiAgICB9LFxcbiAgICByZWZyZXNoT3BlblRva2VuKCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW4oe1xcbiAgICAgICAgICAgIGdyYW50X3R5cGU6IFxcXCJyZWZyZXNoX3Rva2VuXFxcIixcXG4gICAgICAgICAgICByZWZyZXNoX3Rva2VuOiB0aGlzLiR0aGlzLm9wZW5Ub2tlbnMuUmVmcmVzaFRva2VuT3BlbixcXG4gICAgICAgICAgICBjbGllbnRfc2VjcmV0OiB0aGlzLmNsaWVudF9zZWNyZXQsXFxuICAgICAgICAgICAgY2xpZW50X2lkOiB0aGlzLmNsaWVudF9pZCxcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufSk7XFxuJC5leHBvcnRzID0gT3BlbkFwaTtcIn1dIiwiaWNvbiI6IiIsInByb3h5IjoiIn0=
Add Comment
Please, Sign In to add comment