xiaomianao666

邀您一起看:gsfh 4K高码率

Feb 5th, 2025
491
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥gsfh 4K高码率@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImdtdE1vZGlmaWVkXCI6MCxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJcIixcImxpc3RUb0NsZWFyQXNzb2NpYXRlZEZLXCI6W10sXCJsaXN0VG9DbGVhclNlbGZGS1wiOltdLFwicGFnZUxpc3RcIjpbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWkuOWFi+WIl+ihqEFQSVwiLFwicGF0aFwiOlwiUXVhcmtTaGFyZUFwaVwiLFwicnVsZVwiOlwianM6XFxuLy9AYXV0aG9yIExveURnSWtcXG5sZXQgaHR0cFJlcXVlc3QgPSAkLnJlcXVpcmUoXFxcImh0dHBSZXF1ZXN0XFxcIik7XFxubGV0IENvb2tpZU1hbmFnZT0kLnJlcXVpcmUoXFxcIkNvb2tpZU1hbmFnZVxcXCIpO1xcbmxldCBmcm9tRHJpdmUgPSBtb2R1bGUuaW1wb3J0UGFyYW07XFxubGV0IHByLCBiYXNlVXJsLCBjb29raWU7XFxuaWYgKGZyb21Ecml2ZSA9PT0gXFxcInVjXFxcIikge1xcbiAgICBiYXNlVXJsID0gXFxcImh0dHBzOi8vcGMtYXBpLnVjLmNuXFxcIjtcXG4gICAgcHIgPSBcXFwiVUNCcm93c2VyXFxcIjtcXG4gICAgY29va2llID0gZ2V0SXRlbShcXFwidWNDb29raWVcXFwiLCBcXFwiXFxcIik7XFxufSBlbHNlIHtcXG4gICAgYmFzZVVybCA9IFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuXFxcIjtcXG4gICAgcHIgPSBcXFwidWNwcm9cXFwiO1xcbiAgICBjb29raWUgPSBnZXRJdGVtKFxcXCJxdWFya0Nvb2tpZVxcXCIsIFxcXCJcXFwiKTtcXG59XFxuXFxuY29uc3QgY29va2llTWFuYWdlID0gbmV3IENvb2tpZU1hbmFnZShjb29raWUpO1xcbmZ1bmN0aW9uIFF1YXJrU2hhcmVBcGkoc2hhcmVJZCwgc2hhcmVQd2QpIHtcXG4gICAgdGhpcy5zaGFyZUlkID0gc2hhcmVJZDtcXG4gICAgdGhpcy5zaGFyZVB3ZCA9IHNoYXJlUHdkO1xcbiAgICB0aGlzLnJlZnJlc2hDYWxsQmFjayA9ICgoKSA9PiB2b2lkIDApO1xcbiAgICAvL3RoaXMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW4gfHwgdGhpcy5nZXRTaGFyZVRva2VuKCk7XFxufVxcbk9iamVjdC5hc3NpZ24oUXVhcmtTaGFyZUFwaS5wcm90b3R5cGUsIHtcXG4gICAgc2V0UmVmcmVzaChyZWZyZXNoQ2FsbEJhY2spIHtcXG4gICAgICAgIHRoaXMucmVmcmVzaENhbGxCYWNrID0gcmVmcmVzaENhbGxCYWNrO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIHNldFRva2VuKHNoYXJlVG9rZW4pIHtcXG4gICAgICAgIHRoaXMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW47XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgcmVxdWVzdEh0dHAoYXBpKSB7XFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KGFwaS5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikgPyBhcGkgOiAoYmFzZVVybCArIGFwaSkpLnN1Y2Nlc3MoKGJvZHkscmVzKSA9PiB7XFxuICAgICAgICAgICAgaWYgKGJvZHkuc3RhdHVzICE9PSAyMDApIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJvZHkubWVzc2FnZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGNvb2tpZU1hbmFnZS5hZGQocmVzLmhlYWRlcnNbXFxcInNldC1jb29raWVcXFwiXSk7XFxuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XFxuICAgICAgICB9KS5oZWFkZXJzKHtcXG4gICAgICAgICAgICBcXFwiY29va2llXFxcIjogY29va2llTWFuYWdlLmdldCgpLFxcbiAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogXFxcIk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIHF1YXJrLWNsb3VkLWRyaXZlLzIuNS4yMCBDaHJvbWUvMTAwLjAuNDg5Ni4xNjAgRWxlY3Ryb24vMTguMy41LjQtYjQ3ODQ5MTEwMCBTYWZhcmkvNTM3LjM2IENoYW5uZWwvcGNra19vdGhlcl9jaFxcXCIsXFxuICAgICAgICAgICAgXFxcInJlZmVyZXJcXFwiOiBiYXNlVXJsXFxuICAgICAgICB9KTtcXG4gICAgfSxcXG4gICAgZ2V0VG9rZW4oKSB7XFxuICAgICAgICBpZiAodGhpcy5zaGFyZUlkICE9PSBcXFwic2VsZlxcXCIpIHtcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaGFyZVRva2VuIHx8IHRoaXMuZ2V0U2hhcmVUb2tlbigpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcIlxcXCI7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIGdldFBpY0Nvb2tpZSgpe1xcbiAgICAgICAgcmV0dXJuIGNvb2tpZU1hbmFnZS5nZXQoKTtcXG4gICAgICAgIFxcbiAgICB9LFxcbiAgICBnZXRTaGFyZVRva2VuKCkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucmVxdWVzdEh0dHAoXFxcIi8xL2Nsb3VkZHJpdmUvc2hhcmUvc2hhcmVwYWdlL3Rva2VuXFxcIikuYm9keSh7XFxuICAgICAgICAgICAgXFxcInB3ZF9pZFxcXCI6IHRoaXMuc2hhcmVJZCxcXG4gICAgICAgICAgICBcXFwicGFzc2NvZGVcXFwiOiB0aGlzLnNoYXJlUHdkLFxcbiAgICAgICAgfSkuYm9keVRvU3RyaW5nKHRydWUpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICB0aGlzLnNoYXJlVG9rZW4gPSByZXN1bHQuZGF0YS5zdG9rZW47XFxuICAgICAgICB0aGlzLnJlZnJlc2hDYWxsQmFjayhyZXN1bHQuZGF0YS5zdG9rZW4sIHRoaXMpO1xcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hhcmVUb2tlbjtcXG4gICAgfSxcXG4gICAgX2dldFNlbGZMaXN0RmlsZShmaWxlSWQsIHBhZ2UsIG9yZGVyQnkpIHtcXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnJlcXVlc3RIdHRwKFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuLzEvY2xvdWRkcml2ZS9maWxlL3NvcnQ/cHI9XFxcIiArIHByICsgXFxcIiZmcj1wY1xcXCIpLmJ1aWxkVXJsKHtcXG4gICAgICAgICAgICBwZGlyX2ZpZDogZmlsZUlkIHx8IFxcXCIwXFxcIixcXG4gICAgICAgICAgICBmb3JjZTogMCxcXG4gICAgICAgICAgICBfcGFnZTogcGFnZSxcXG4gICAgICAgICAgICBfc2l6ZTogMTAwLFxcbiAgICAgICAgICAgIHVjX3BhcmFtX3N0cjogXFxcIlxcXCIsXFxuICAgICAgICAgICAgX2ZldGNoX3RvdGFsOiAxLFxcbiAgICAgICAgICAgIF9mZXRjaF9zdWJfZGlyczogMCxcXG4gICAgICAgICAgICBfc29ydDogXFxcImZpbGVfdHlwZTphc2MsXFxcIiArIG9yZGVyQnlcXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfSxcXG4gICAgX2dldFNoYXJlTGlzdEZpbGUoZmlsZUlkLCBwYWdlLCBvcmRlckJ5KSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5yZXF1ZXN0SHR0cChcXFwiLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2UvZGV0YWlsP3ByPVxcXCIgKyBwciArIFxcXCImZnI9cGNcXFwiKS5idWlsZFVybCh7XFxuICAgICAgICAgICAgcHdkX2lkOiB0aGlzLnNoYXJlSWQgfHwgXFxcIlxcXCIsXFxuICAgICAgICAgICAgc3Rva2VuOiBlbmNvZGVVUklDb21wb25lbnQodGhpcy5nZXRUb2tlbigpIHx8IFxcXCJcXFwiKSxcXG4gICAgICAgICAgICBwZGlyX2ZpZDogZmlsZUlkIHx8IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIGZvcmNlOiAwLFxcbiAgICAgICAgICAgIF9wYWdlOiBwYWdlLFxcbiAgICAgICAgICAgIF9zaXplOiAxMDAsXFxuICAgICAgICAgICAgX2ZldGNoX2Jhbm5lcjogMSxcXG4gICAgICAgICAgICBfZmV0Y2hfc2hhcmU6IDEsXFxuICAgICAgICAgICAgX2ZldGNoX3RvdGFsOiAxLFxcbiAgICAgICAgICAgIF9zb3J0OiBcXFwiZmlsZV90eXBlOmFzYyxcXFwiICsgb3JkZXJCeVxcbiAgICAgICAgfSkuZXJyb3JXaXRoUmV0cnkoKGVyciwgcmVzLCBodHRwKSA9PiB7XFxuICAgICAgICAgICAgaWYgKEpTT04ucGFyc2UocmVzLmJvZHkpLm1lc3NhZ2UuaW5jbHVkZXMoJ3N0b2tlbicpKSB7XFxuICAgICAgICAgICAgICAgIGh0dHAubWVyZ2VIZWFkQW5kQm9keSh7XFxuICAgICAgICAgICAgICAgICAgICBidWlsZFVybDoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b2tlbjogZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZ2V0U2hhcmVUb2tlbigpIHx8IFxcXCJcXFwiKVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICB9LFxcbiAgICBnZXRMaXN0RmlsZShmaWxlSWQsIHBhZ2UsIG9yZGVyQnkpIHtcXG4gICAgICAgIGlmICh0aGlzLnNoYXJlSWQgIT09IFxcXCJzZWxmXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTaGFyZUxpc3RGaWxlKGZpbGVJZCwgcGFnZSwgb3JkZXJCeSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTZWxmTGlzdEZpbGUoZmlsZUlkLCBwYWdlLCBvcmRlckJ5KTtcXG4gICAgICAgIH1cXG4gICAgfVxcbn0pO1xcbiQuZXhwb3J0cyA9IFF1YXJrU2hhcmVBcGk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJodHRwUmVxdWVzdFwiLFwicGF0aFwiOlwiaHR0cFJlcXVlc3RcIixcInJ1bGVcIjpcImZ1bmN0aW9uIGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcbiAgICB0aGlzLnJldHJ5Q291bnQgPSAwO1xcbiAgICB0aGlzLnVybCA9IHVybDtcXG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xcbiAgICAgICAgd2l0aEhlYWRlcnM6IHRydWVcXG4gICAgfSk7XFxuICAgIHRoaXMuZXJyb3JDYWxsYmFjayA9IChlcnIsIHJlcykgPT4ge3Rocm93IGVycn07XFxuICAgIHRoaXMuZXJyb3JDYWxsYmFja1dpdGhSZXRyeSA9IChlcnIsIHJlcywgdHJ5UmVzdGFydCkgPT4gZmFsc2U7XFxuICAgIHRoaXMuc3VjY2Vzc0NhbGxiYWNrID0gKGJvZHksIHN0YXR1c0NvZGUsIGhlYWRlcnMpID0+IGJvZHk7XFxuICAgIHRoaXMuZXJyb3JUeXBlQ2FsbGJhY2sgPSAoZXJyLCByZXMpID0+IGVycjtcXG4gICAgdGhpcy5zdGFydFJlcXVlc3QgPSBmZXRjaDtcXG4gICAgdGhpcy5fYm9keVRvU3RyaW5nID0gZmFsc2U7XFxuICAgIHRoaXMuYnVpbGRQYXJhbSA9IHZvaWQoMCk7XFxufVxcblxcbk9iamVjdC5hc3NpZ24oaHR0cFJlcXVlc3QucHJvdG90eXBlLCB7XFxuICAgIGJvZHlUb1N0cmluZyhmbGFnKSB7XFxuICAgICAgICB0aGlzLl9ib2R5VG9TdHJpbmcgPSAhIWZsYWc7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgYm9keShib2R5KSB7XFxuICAgICAgICB0aGlzLm9wdGlvbnMuYm9keSA9IGJvZHkgfHwgdm9pZCAwO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIGJ1aWxkVXJsKGJ1aWxkUGFyYW0pIHtcXG4gICAgICAgIHRoaXMuYnVpbGRQYXJhbSA9IGJ1aWxkUGFyYW0gfHwge307XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgc2V0U3RhcnRSZXF1ZXN0RnVuYyhmdW5jKSB7XFxuICAgICAgICB0aGlzLnN0YXJ0UmVxdWVzdCA9IGZ1bmM7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgaGVhZGVycyhoZWFkZXJzKSB7XFxuICAgICAgICB0aGlzLm9wdGlvbnMuaGVhZGVycyA9IGhlYWRlcnMgfHwgdm9pZCAwO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIHN1Y2Nlc3Moc3VjY2Vzc0NhbGxiYWNrKSB7XFxuICAgICAgICBpZiAodHlwZW9mIHN1Y2Nlc3NDYWxsYmFjayAhPT0gXFxcImZ1bmN0aW9uXFxcIikgcmV0dXJuIHRoaXM7XFxuICAgICAgICB0aGlzLnN1Y2Nlc3NDYWxsYmFjayA9IHN1Y2Nlc3NDYWxsYmFjaztcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBlcnJvcihlcnJvckNhbGxiYWNrKSB7XFxuICAgICAgICBpZiAodHlwZW9mIGVycm9yQ2FsbGJhY2sgIT09IFxcXCJmdW5jdGlvblxcXCIpIHJldHVybiB0aGlzO1xcbiAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjaztcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBlcnJvclR5cGUoZXJyb3JUeXBlQ2FsbGJhY2spIHtcXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JUeXBlQ2FsbGJhY2sgIT09IFxcXCJmdW5jdGlvblxcXCIpIHJldHVybiB0aGlzO1xcbiAgICAgICAgdGhpcy5lcnJvclR5cGVDYWxsYmFjayA9IGVycm9yVHlwZUNhbGxiYWNrO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIGVycm9yV2l0aFJldHJ5KHJldHJ5Q291bnQsIGVycm9yQ2FsbGJhY2tXaXRoUmV0cnkpIHtcXG4gICAgICAgIGlmICh0eXBlb2YgcmV0cnlDb3VudCA9PT0gXFxcImZ1bmN0aW9uXFxcIiAmJiB0eXBlb2YgZXJyb3JDYWxsYmFja1dpdGhSZXRyeSA9PT0gXFxcInVuZGVmaW5lZFxcXCIpIHtcXG4gICAgICAgICAgICBlcnJvckNhbGxiYWNrV2l0aFJldHJ5ID0gcmV0cnlDb3VudDtcXG4gICAgICAgICAgICByZXRyeUNvdW50ID0gMTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JDYWxsYmFja1dpdGhSZXRyeSAhPT0gXFxcImZ1bmN0aW9uXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfVxcbiAgICAgICAgdGhpcy5yZXRyeUNvdW50ID0gTnVtYmVyKHJldHJ5Q291bnQpO1xcbiAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrV2l0aFJldHJ5ID0gZXJyb3JDYWxsYmFja1dpdGhSZXRyeTtcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBzdGFydCh0b0pzb24pIHtcXG4gICAgICAgIGxldCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zKTtcXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5ib2R5ID09PSBcXFwib2JqZWN0XFxcIiAmJiB0aGlzLl9ib2R5VG9TdHJpbmcpIHtcXG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmJvZHkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgdmFyIHJlcyA9IEpTT04ucGFyc2UodGhpcy5zdGFydFJlcXVlc3QodGhpcy5idWlsZFBhcmFtP2J1aWxkVXJsKHRoaXMudXJsLCB0aGlzLmJ1aWxkUGFyYW0pOnRoaXMudXJsLCBvcHRpb25zKSk7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVzLnN0YXR1c0NvZGUgPD0gMzAwKSB7XFxuICAgICAgICAgICAgICAgIGxldCBib2R5ID0gcmVzLmJvZHk7XFxuICAgICAgICAgICAgICAgIGlmICh0b0pzb24pIHtcXG4gICAgICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKGJvZHkpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1Y2Nlc3NDYWxsYmFjayhib2R5LCByZXMpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihTdHJpbmcocmVzLnN0YXR1c0NvZGUpKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBlcnIgPSB0aGlzLmVycm9yVHlwZUNhbGxiYWNrKGVyciwgcmVzKTtcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICh0aGlzLnJldHJ5Q291bnQpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHRyeVJlc3VsdCA9IHRoaXMuZXJyb3JDYWxsYmFja1dpdGhSZXRyeShlcnIsIHJlcywgdGhpcyk7XFxuICAgICAgICAgICAgICAgIGlmICh0cnlSZXN1bHQpIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV0cnlDb3VudC0tO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQodG9Kc29uKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV0cnlDb3VudCA9IDA7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvckNhbGxiYWNrKGVyciwgcmVzKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yQ2FsbGJhY2soZXJyLCByZXMpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAgc2V0T3B0aW9ucyhvcHRpb25zKSB7XFxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7XFxuICAgICAgICAgICAgd2l0aEhlYWRlcnM6IHRydWVcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIG1lcmdlSGVhZEFuZEJvZHkob3B0aW9ucykge1xcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XFxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucy5oZWFkZXJzfHx7fSwgb3B0aW9ucy5oZWFkZXJzKTtcXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmJvZHkgPT09IFxcXCJvYmplY3RcXFwiICYmIHR5cGVvZiBvcHRpb25zLmJvZHkgPT09IFxcXCJvYmplY3RcXFwiKSB7XFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMuYm9keXx8e30sIG9wdGlvbnMuYm9keSk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYnVpbGRVcmwgPT09IFxcXCJvYmplY3RcXFwiKSB7XFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmJ1aWxkUGFyYW18fHt9LCBvcHRpb25zLmJ1aWxkVXJsKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9XFxufSk7XFxuXFxuT2JqZWN0LmFzc2lnbihodHRwUmVxdWVzdCwge1xcbiAgICBmZXRjaCh1cmwsIG9wdGlvbnMpIHtcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKTtcXG4gICAgfSxcXG4gICAgcG9zdCh1cmwsIG9wdGlvbnMpIHtcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3QpO1xcbiAgICB9LFxcbiAgICByZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocmVxdWVzdCk7XFxuICAgIH0sXFxuICAgIHBvc3RSZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdFJlcXVlc3QpO1xcbiAgICB9LFxcbiAgICBmZXRjaENvb2tpZSh1cmwsIG9wdGlvbnMpIHtcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKS5zZXRTdGFydFJlcXVlc3RGdW5jKGZldGNoQ29va2llKTtcXG4gICAgfVxcbn0pO1xcbiQuZXhwb3J0cyA9IGh0dHBSZXF1ZXN0O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5aS45YWL5YiX6KGoXCIsXCJwYXRoXCI6XCJxdWFya0xpc3RcIixcInJ1bGVcIjpcImpzOlxcbmxldCBkID0gW107XFxuXFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiBjbGVhck15VmFyKFxcXCJwbGF5VXJsQ2FjaGVcXFwiKSk7XFxuYWRkTGlzdGVuZXIoXFxcIm9uUmVmcmVzaFxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcInBsYXlVcmxDYWNoZVxcXCIpKTtcXG5sZXQgc29VcmwgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInJlYWx1cmxcXFwiLCBcXFwiXFxcIikpO1xcbmxldCBmcm9tRHJpdmUgPSBNWV9QQVJBTVMuZnJvbURyaXZlIHx8IFxcXCJxdWFya1xcXCI7XFxuXFxuaWYgKHNvVXJsLmluY2x1ZGVzKFxcXCJkcml2ZS51Yy5jblxcXCIpKSB7XFxuICAgIGZyb21Ecml2ZSA9IFxcXCJ1Y1xcXCI7XFxufVxcbmxldCByZWFsdXJsID0gc29Vcmwuc3BsaXQoXFxcIj9cXFwiKVswXTtcXG5sZXQgdXJsRGF0YSA9IHJlYWx1cmwuc3BsaXQoXFxcIi9cXFwiKTtcXG5cXG5sZXQgc2hhcmVJZCA9IE1ZX1BBUkFNUy5zaGFyZUlkIHx8IHVybERhdGFbNF0ucmVwbGFjZShcXFwiI1xcXCIsIFxcXCJcXFwiKTtcXG5sZXQgc2hhcmVQd2QgPSBnZXRQYXJhbShcXFwic2hhcmVQd2RcXFwiLCBNWV9QQVJBTVMuc2hhcmVQd2QgfHwgZ2V0UGFyYW0oXFxcInBhc3Njb2RlXFxcIiwgXFxcIlxcXCIsIHNvVXJsKSB8fCBcXFwiXFxcIik7XFxubGV0IHNoYXJlVG9rZW4gPSBnZXRQYXJhbShcXFwic2hhcmVUb2tlblxcXCIsIE1ZX1BBUkFNUy5zaGFyZVRva2VuIHx8IFxcXCJcXFwiKTtcXG5cXG5sZXQgZmlsZUlkID0gTVlfUEFSQU1TLmZpbGVJZDtcXG5cXG5sZXQgc29ydCA9IHtcXG4gICAgXFxcIuWQjeensOato+W6j1xcXCI6IFxcXCJmaWxlX25hbWU6YXNjXFxcIixcXG4gICAgXFxcIuWQjeensOWAkuW6j1xcXCI6IFxcXCJmaWxlX25hbWU6ZGVzY1xcXCIsXFxuICAgIFxcXCLml7bpl7TmraPluo9cXFwiOiBcXFwidXBkYXRlZF9hdDphc2NcXFwiLFxcbiAgICBcXFwi5pe26Ze05YCS5bqPXFxcIjogXFxcInVwZGF0ZWRfYXQ6ZGVzY1xcXCJcXG59O1xcbmxldCBzdHlsZXMgPSBbXFxcInRleHRfMVxcXCIsIFxcXCJhdmF0YXJcXFwiXTtcXG5cXG5sZXQgc29ydFZhbHVlID0gc29ydFtnZXRJdGVtKFxcXCJzb3J0S2V5XFxcIiwgXFxcIuWQjeensOato+W6j1xcXCIpXTtcXG5sZXQgc3R5bGUgPSBnZXRJdGVtKFxcXCJzdHlsZVxcXCIsIHN0eWxlc1swXSk7XFxuaWYgKE1ZX1BBR0UgPT0gMSkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGZyb21Ecml2ZSA9PT0gXFxcInVjXFxcIiA/IFxcXCJVQ+e9keebmFxcXCIgOiBcXFwi5aS45YWL572R55uYXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl81XFxcIixcXG4gICAgICAgIHBpY191cmw6IGZyb21Ecml2ZSA9PT0gXFxcInVjXFxcIiA/IFxcXCJodHRwOi8vMTIzLjU2LjEwNS4xNDUvdHViaWFvL2VyZGkvMTQucG5nXFxcIiA6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2t1YWtlXFxcIixcXG4gICAgICAgIHVybDogJChcXFwi54K55Ye75Yqf6IO95oyJ6ZKuPT7kuKrkurrotKblj7fnrqHnkIbljbPlj6/nmbvlvZXotKblj7dcXFwiKS5jb25maXJtKCgpID0+IHt9KSxcXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogc3R5bGUsXFxuICAgICAgICB1cmw6ICQoc3R5bGVzLCAxLCAn6K+36YCJ5oupJykuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICBzZXRJdGVtKCdzdHlsZScsIGlucHV0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L2ltZy9hbGlfaWNvbi5zdmdcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiXFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGdldEl0ZW0oXFxcInNvcnRLZXlcXFwiLCBcXFwi5ZCN56ew5q2j5bqPXFxcIiksXFxuICAgICAgICB1cmw6ICQoT2JqZWN0LmtleXMoc29ydCksIDEsICfor7fpgInmi6knKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcInNvcnRLZXlcXFwiLCBpbnB1dClcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L2ltZy9hbGlfc29ydC5zdmdcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiXFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGdldEl0ZW0oXFxcInF1YXJrX3BsYXlNb2RlXFxcIiwgXFxcIui9rOeggVxcXCIpLFxcbiAgICAgICAgdXJsOiAkKFtcXFwi6L2s56CBXFxcIiwgXFxcIuWOn+eUu1xcXCIsIFxcXCLmma7pgJrljp/nlLtcXFwiXSwgMiwgXFxcIuaSreaUvuaooeW8j1xcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwicXVhcmtfcGxheU1vZGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5YiH5o2i5oiQ5YqfXFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS9pbWcvYWxpX3BsYXkuc3ZnXFxcIixcXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWKn+iDvVxcXCIsXFxuICAgICAgICB1cmw6ICQoW1xcXCLot7PovazlpLjlhYtBUFBcXFwiLCBcXFwi5aSN5Yi25YiG5Lqr6ZO+5o6lXFxcIiwgXFxcIuS4quS6uui0puWPt+euoeeQhlxcXCIsIFxcXCLljp/nlLvkuIvovb3nur/nqItcXFwiXSwgMikuc2VsZWN0KChzaGFyZUlkLCBzaGFyZVB3ZCwgZnJvbURyaXZlKSA9PiB7XFxuICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi6Lez6L2s5aS45YWLQVBQXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInFrbGluazovL3d3dy51Yy5jbi9iMjBiODRmZDczNWE4ZGQzZjc1NDExMjliYWNjNGU5YT9hY3Rpb249b3Blbl91cmwmdXJsPWh0dHBzOi8vcGFuLnF1YXJrLmNuL3MvXFxcIiArIHNoYXJlSWQ7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuS4quS6uui0puWPt+euoeeQhlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiYWNjb3VudFxcXCIpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLljp/nlLvkuIvovb3nur/nqItcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKGdldEl0ZW0oXFxcInNwZWVkVGhyZWFkXFxcIiwgXFxcIjEwXFxcIiksIFxcXCLor7fovpPlhaUzLTMy5LmL6Ze055qE5pW05pWwXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwZWVkVGhyZWFkID0gcGFyc2VJbnQoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWVkVGhyZWFkIDwgMyB8fCBzcGVlZFRocmVhZCA+IDMyKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruS4jeWQiOazlVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJzcGVlZFRocmVhZFxcXCIsIFN0cmluZyhzcGVlZFRocmVhZCkpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLlpI3liLbliIbkuqvpk77mjqVcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGlmIChmcm9tRHJpdmUgPT09IFxcXCJ1Y1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBidWlsZFVybChcXFwiaHR0cHM6Ly9kcml2ZS51Yy5jbi9zL1xcXCIgKyBzaGFyZUlkICsgXFxcIj9wdWJsaWM9MSMvbGlzdC9zaGFyZVxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogc2hhcmVQd2RcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIGJ1aWxkVXJsKFxcXCJodHRwczovL3Bhbi5xdWFyay5jbi9zL1xcXCIgKyBzaGFyZUlkLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2NvZGU6IHNoYXJlUHdkXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIHNoYXJlSWQsIHNoYXJlUHdkLCBmcm9tRHJpdmUpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS9pbWcvYWxpX2ZpbGVpbnRvLnN2Z1xcXCIsXFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6ICdsaW5lX2JsYW5rJ1xcbiAgICB9KTtcXG59XFxuXFxuXFxubGV0IFF1YXJrU2hhcmVBcGkgPSAkLnJlcXVpcmUoXFxcIlF1YXJrU2hhcmVBcGlcXFwiLCBmcm9tRHJpdmUpO1xcbmxldCBxdWFya1NoYXJlQXBpID0gbmV3IFF1YXJrU2hhcmVBcGkoc2hhcmVJZCwgc2hhcmVQd2QpLnNldFRva2VuKHNoYXJlVG9rZW4pLnNldFJlZnJlc2goKHNoYXJlVG9rZW4pID0+IHtcXG4gICAgTVlfUEFSQU1TLnNoYXJlVG9rZW4gPSBzaGFyZVRva2VuO1xcbiAgICBzZXRQYWdlUGFyYW1zKE1ZX1BBUkFNUyk7XFxufSk7XFxuXFxuZnVuY3Rpb24gZm9ybWF0U2l6ZShzaXplKSB7XFxuICAgIGlmICghc2l6ZSkge1xcbiAgICAgICAgcmV0dXJuICcnO1xcbiAgICB9XFxuICAgIGNvbnN0IHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJywgJ1BCJywgJ0VCJywgJ1pCJywgJ1lCJ107XFxuICAgIGxldCBpID0gMDtcXG4gICAgd2hpbGUgKHNpemUgPj0gMTAyNCkge1xcbiAgICAgICAgc2l6ZSAvPSAxMDI0O1xcbiAgICAgICAgaSsrO1xcbiAgICB9XFxuICAgIHNpemUgPSBpID8gTnVtYmVyKHNpemUudG9GaXhlZCgyKSkgOiBzaXplO1xcbiAgICByZXR1cm4gYCR7c2l6ZX0gJHt1bml0c1tpXX1gO1xcbn1cXG5cXG5sZXQgc3ViRXh0cyA9IFtcXFwidnR0XFxcIiwgXFxcInNydFxcXCIsIFxcXCJhc3NcXFwiXTtcXG5sZXQgdGl0bGVIZWFkID0ge1xcbiAgICB2aWRlbzogXFxcIvCfjqxcXFwiLFxcbiAgICBhdWRpbzogXFxcIvCfjrVcXFwiLFxcbiAgICBkb2M6IFxcXCLwn5ORXFxcIixcXG4gICAgaW1hZ2U6IFxcXCLwn5a8XFxcIixcXG4gICAgYXJjaGl2ZTogXFxcIvCfk6ZcXFwiLFxcbiAgICBcXFwiZGVmYXVsdFxcXCI6IFxcXCLinZNcXFwiXFxufTtcXG5cXG5mdW5jdGlvbiBnZXRIZWFkKHR5cGUsIGV4dCkge1xcbiAgICBsZXQgaGVhZCA9IHRpdGxlSGVhZFt0eXBlXTtcXG4gICAgLyppZiAoc3ViRXh0cy5pbmNsdWRlcyhleHQpKSB7XFxuICAgICAgICBoZWFkID0gXFxcIvCflbhcXFwiO1xcbiAgICB9Ki9cXG4gICAgcmV0dXJuIGhlYWQgfHwgXFxcIuKdk1xcXCI7XFxufVxcbnRyeSB7XFxuICAgIHZhciByZXMgPSBxdWFya1NoYXJlQXBpLmdldExpc3RGaWxlKGZpbGVJZCwgTVlfUEFHRSwgc29ydFZhbHVlKTtcXG4gICAgLy/orr7nva7moIfpophcXG4gICAgdmFyIGxpc3QgPSByZXMuZGF0YS5saXN0IHx8IFtdO1xcbiAgICBpZiAoc2hhcmVJZCAhPT0gXFxcInNlbGZcXFwiKSB7XFxuICAgICAgICBzZXRQYWdlVGl0bGUocmVzLmRhdGEuc2hhcmUudGl0bGUpO1xcblxcbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAwICYmICFmaWxlSWQpIHtcXG4gICAgICAgICAgICByZXMgPSBxdWFya1NoYXJlQXBpLmdldExpc3RGaWxlKHJlcy5kYXRhLnNoYXJlLmZpcnN0X2ZpZCwgTVlfUEFHRSwgc29ydFZhbHVlKTtcXG4gICAgICAgICAgICBzZXRQYWdlVGl0bGUocmVzLmRhdGEuc2hhcmUudGl0bGUpO1xcbiAgICAgICAgICAgIHZhciBsaXN0ID0gcmVzLmRhdGEubGlzdCB8fCBbXTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBsZXQgbmNvb2tpZT1xdWFya1NoYXJlQXBpLmdldFBpY0Nvb2tpZSgpO1xcbiAgICBsb2cobmNvb2tpZSlcXG4gICAgbGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xcbiAgICAgICAgLy/liKTmlq3mmK/lkKbmlofku7blpLlcXG4gICAgICAgIGlmIChpdGVtLmRpcikge1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi8J+TglxcXCIgKyBpdGVtLmZpbGVfbmFtZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogJC5kYXRlRm9ybWF0KGl0ZW0udXBkYXRlZF9hdCwgJ3l5eXktTU0tZGQnKSArICcgICcgKyBpdGVtLmluY2x1ZGVfaXRlbXMgKyAn6aG5ICAnLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L3R1Ymlhby9tZXNzeS8yNy5zdmdcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcXVhcmtMaXN0P3BhZ2U9ZnlwYWdlXFxcIixcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IHN0eWxlLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVJZCxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVUb2tlbjogcXVhcmtTaGFyZUFwaS5nZXRUb2tlbigpLFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBpdGVtLmZpZCxcXG4gICAgICAgICAgICAgICAgICAgIGluaGVyaXRUaXRsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgICAgICBmcm9tRHJpdmVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogZ2V0SGVhZChpdGVtLm9ial9jYXRlZ29yeSkgKyBpdGVtLmZpbGVfbmFtZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogJC5kYXRlRm9ybWF0KGl0ZW0udXBkYXRlZF9hdCwgJ3l5eXktTU0tZGQnKSArICcgICcgKyBmb3JtYXRTaXplKGl0ZW0uc2l6ZSksXFxuICAgICAgICAgICAgICAgIHBpY191cmw6ICQoaXRlbS50aHVtYm5haWwsIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvb2tpZTogbmNvb2tpZVxcbiAgICAgICAgICAgICAgICB9KS5pbWFnZSgpLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSwgZnJvbURyaXZlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVVybENhY2hlID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcInBsYXlVcmxDYWNoZVxcXCIsIHt9KTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChwbGF5VXJsQ2FjaGVbZmlkXSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5VXJsQ2FjaGVbZmlkXTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9ICQucmVxdWlyZShcXFwicGxheVxcXCIsIGZyb21Ecml2ZSkuZ2V0UGxheVVybChmaWQsIGZpZF90b2tlbiwgcHdkX2lkLCBzdG9rZW4sIGNhdGVnb3J5KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5VXJsQ2FjaGVbZmlkXSA9IHVybDtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwicGxheVVybENhY2hlXFxcIiwgcGxheVVybENhY2hlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJsO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9LCBpdGVtLmZpZCwgaXRlbS5zaGFyZV9maWRfdG9rZW4sIHNoYXJlSWQsIHF1YXJrU2hhcmVBcGkuZ2V0VG9rZW4oKSwgaXRlbS5vYmpfY2F0ZWdvcnksIGZyb21Ecml2ZSksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBzdHlsZSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBpdGVtLmZpZCxcXG4gICAgICAgICAgICAgICAgICAgIC8vaW5oZXJpdFRpdGxlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgICAgIGNsczogJ3BsYXlsaXN0ICcgKyBpdGVtLm9ial9jYXRlZ29yeVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH1cXG5cXG4gICAgfSk7XFxufSBjYXRjaCAoZSkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGUubWVzc2FnZSxcXG4gICAgICAgIHVybDogJ2hpa2VyOi8vZW1wdHknLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBpZiAoZS5tZXNzYWdlLmluY2x1ZGVzKFxcXCLmj5Dlj5bnoIFcXFwiKSkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIui+k+WFpeaPkOWPlueggVxcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKCkuaW5wdXQoKE1ZX1BBUkFNUykgPT4ge1xcbiAgICAgICAgICAgICAgICBzZXRQYWdlUGFyYW1zKE9iamVjdC5hc3NpZ24oe30sIE1ZX1BBUkFNUywge1xcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IGlucHV0XFxuICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICB9LCBNWV9QQVJBTVMpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcInBsYXlcIixcInBhdGhcIjpcInBsYXlcIixcInJ1bGVcIjpcImpzOlxcbmxldCBmcm9tRHJpdmUgPSBtb2R1bGUuaW1wb3J0UGFyYW07XFxubGV0IHByLCBob21lVXJsLCBhcGksIGNvb2tpZTtcXG5pZiAoZnJvbURyaXZlID09PSBcXFwidWNcXFwiKSB7XFxuICAgIGhvbWVVcmwgPSBcXFwiaHR0cHM6Ly9kcml2ZS51Yy5jbi9cXFwiO1xcbiAgICBwciA9IFxcXCJVQ0Jyb3dzZXJcXFwiO1xcbiAgICBhcGkgPSBcXFwiaHR0cHM6Ly9wYy1hcGkudWMuY25cXFwiO1xcbiAgICBjb29raWUgPSBnZXRJdGVtKFxcXCJ1Y0Nvb2tpZVxcXCIsIFxcXCJcXFwiKTtcXG59IGVsc2Uge1xcbiAgICBob21lVXJsID0gXFxcImh0dHBzOi8vZHJpdmUucXVhcmsuY24vXFxcIjtcXG4gICAgcHIgPSBcXFwidWNwcm9cXFwiO1xcbiAgICBhcGkgPSBcXFwiaHR0cHM6Ly9kcml2ZS5xdWFyay5jblxcXCI7XFxuICAgIGNvb2tpZSA9IGdldEl0ZW0oXFxcInF1YXJrQ29va2llXFxcIiwgXFxcIlxcXCIpO1xcbn1cXG5cXG5sZXQgQ29va2llTWFuYWdlPSQucmVxdWlyZShcXFwiQ29va2llTWFuYWdlXFxcIik7XFxuXFxuY29uc3QgY29va2llTWFuYWdlID0gbmV3IENvb2tpZU1hbmFnZShjb29raWUpO1xcbmxldCBodHRwUmVxdWVzdCA9ICQucmVxdWlyZShcXFwiaHR0cFJlcXVlc3RcXFwiKTtcXG5cXG5mdW5jdGlvbiB3YWl0U2xlZXAodGltZSkge1xcbiAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKHRpbWUgfHwgNjAwKTtcXG59XFxuXFxuZnVuY3Rpb24gcmVxdWVzdEh0dHAodXJsKSB7XFxuICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsKVxcbiAgICAgICAgLnN1Y2Nlc3MoKGJvZHksIHJlcykgPT4ge1xcbiAgICAgICAgICAgIGlmIChib2R5LnN0YXR1cyAhPT0gMjAwKSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihib2R5Lm1lc3NhZ2UpO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBjb29raWVNYW5hZ2UuYWRkKHJlcy5oZWFkZXJzW1xcXCJzZXQtY29va2llXFxcIl0pO1xcbiAgICAgICAgICAgIHJldHVybiBib2R5O1xcbiAgICAgICAgfSlcXG4gICAgICAgIC5lcnJvclR5cGUoKGVyciwgcmVzKSA9PiB7XFxuICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnBhcnNlKHJlcy5ib2R5KS5tZXNzYWdlKTtcXG4gICAgICAgIH0pXFxuICAgICAgICAuYm9keVRvU3RyaW5nKHRydWUpXFxuICAgICAgICAuaGVhZGVycyh7XFxuICAgICAgICAgICAgY29va2llOiBjb29raWVNYW5hZ2UuZ2V0KCksXFxuICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgcXVhcmstY2xvdWQtZHJpdmUvMi41LjIwIENocm9tZS8xMDAuMC40ODk2LjE2MCBFbGVjdHJvbi8xOC4zLjUuNC1iNDc4NDkxMTAwIFNhZmFyaS81MzcuMzYgQ2hhbm5lbC9wY2trX290aGVyX2NoXFxcIixcXG4gICAgICAgICAgICBcXFwicmVmZXJlclxcXCI6IGhvbWVVcmxcXG4gICAgICAgIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXREcml2ZUluZm8oKSB7XFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChhcGkgKyBcXFwiLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2UvZGlyP3ByPVxcXCIgKyBwciArIFxcXCImZnI9cGMmYXZlcj0xXFxcIikuc3RhcnQodHJ1ZSk7XFxufVxcblxcbmZ1bmN0aW9uIGNyZWF0ZVNhdmVUYXNrKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbikge1xcbiAgICBsZXQgZHJpdmVJbmZvID0gZ2V0RHJpdmVJbmZvKCk7XFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChhcGkgKyBcXFwiLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2Uvc2F2ZT9wcj1cXFwiICsgcHIgKyBcXFwiJmZyPXBjXFxcIikuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0KS5ib2R5KHtcXG4gICAgICAgIFxcXCJmaWRfbGlzdFxcXCI6IFtcXG4gICAgICAgICAgICBmaWRcXG4gICAgICAgIF0sXFxuICAgICAgICBcXFwiZmlkX3Rva2VuX2xpc3RcXFwiOiBbXFxuICAgICAgICAgICAgZmlkX3Rva2VuXFxuICAgICAgICBdLFxcbiAgICAgICAgXFxcInRvX3BkaXJfZmlkXFxcIjogZHJpdmVJbmZvLmRhdGEuZGlyLmZpZCxcXG4gICAgICAgIFxcXCJwd2RfaWRcXFwiOiBwd2RfaWQsXFxuICAgICAgICBcXFwic3Rva2VuXFxcIjogc3Rva2VuLFxcbiAgICAgICAgXFxcInBkaXJfZmlkXFxcIjogZHJpdmVJbmZvLmRhdGEuZGlyLnBkaXJfZmlkXFxuICAgIH0pLnN0YXJ0KHRydWUpO1xcbn1cXG5cXG5mdW5jdGlvbiBjcmVhdGVEZWxldGVUYXNrKGZpZCkge1xcbiAgICBsZXQgZHJpdmVJbmZvID0gZ2V0RHJpdmVJbmZvKCk7XFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChhcGkgKyBcXFwiLzEvY2xvdWRkcml2ZS9maWxlL2RlbGV0ZT9wcj1cXFwiICsgcHIgKyBcXFwiJmZyPXBjXFxcIikuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0KS5ib2R5KHtcXG4gICAgICAgIFxcXCJhY3Rpb25fdHlwZVxcXCI6IDIsXFxuICAgICAgICBcXFwiZmlsZWxpc3RcXFwiOiBbXFxuICAgICAgICAgICAgZmlkXFxuICAgICAgICBdLFxcbiAgICAgICAgXFxcImV4Y2x1ZGVfZmlkc1xcXCI6IFtdXFxuICAgIH0pLnN0YXJ0KHRydWUpO1xcbn1cXG5cXG5mdW5jdGlvbiB0YXNrKHRhc2tfaWQsIHJldHJ5X2luZGV4KSB7XFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChhcGkgKyBcXFwiLzEvY2xvdWRkcml2ZS90YXNrXFxcIikuYnVpbGRVcmwoe1xcbiAgICAgICAgcHI6IHByLFxcbiAgICAgICAgZnI6IFxcXCJwY1xcXCIsXFxuICAgICAgICB0YXNrX2lkOiB0YXNrX2lkLFxcbiAgICAgICAgcmV0cnlfaW5kZXg6IHJldHJ5X2luZGV4XFxuICAgIH0pLnN0YXJ0KHRydWUpO1xcbn1cXG5cXG5mdW5jdGlvbiBxdWVyeVRhc2sodGFza19pZCkge1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDk7IGkrKykge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcmVzID0gdGFzayh0YXNrX2lkLCBpICsgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGlmIChyZXMuZGF0YS5zdGF0dXMgPT09IDIpIHtcXG4gICAgICAgICAgICAgICAgd2FpdFNsZWVwKDEwMDApO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmRhdGEuc2F2ZV9hcy5zYXZlX2FzX3RvcF9maWRzWzBdO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB3YWl0U2xlZXAoMzAwICogKGkgKyAxKSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICB9XFxuICAgIHJldHVybiB2b2lkKDApO1xcbn1cXG5cXG5mdW5jdGlvbiBxdWVyeVRhc2tTdGF0dXModGFza19pZCkge1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcmVzID0gdGFzayh0YXNrX2lkLCBpICsgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGlmIChyZXMuZGF0YS5zdGF0dXMgPT09IDIpIHtcXG4gICAgICAgICAgICAgICAgd2FpdFNsZWVwKDEwMDApO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgd2FpdFNsZWVwKDMwMCk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICB9XFxuICAgIHJldHVybiBmYWxzZTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0UHJldmlld1ZpZGVvKGZpZCkge1xcbiAgICByZXR1cm4gcmVxdWVzdEh0dHAoYXBpICsgXFxcIi8xL2Nsb3VkZHJpdmUvZmlsZS92Mi9wbGF5P3ByPVxcXCIgKyBwciArIFxcXCImZnI9cGNcXFwiKS5ib2R5KHtcXG4gICAgICAgIFxcXCJmaWRcXFwiOiBmaWQsXFxuICAgICAgICBcXFwicmVzb2x1dGlvbnNcXFwiOiBcXFwibm9ybWFsLGxvdyxoaWdoLHN1cGVyLDJrLDRrXFxcIixcXG4gICAgICAgIFxcXCJzdXBwb3J0c1xcXCI6IFxcXCJmbXA0LG0zdThcXFwiXFxuICAgIH0pLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCkuc3RhcnQodHJ1ZSk7XFxufVxcblxcblxcblxcbmZ1bmN0aW9uIGdldERvd25sb2FkVXJsKGZpZCkge1xcbiAgICByZXR1cm4gcmVxdWVzdEh0dHAoYXBpICsgXFxcIi8xL2Nsb3VkZHJpdmUvZmlsZS9kb3dubG9hZD9wcj1cXFwiICsgcHIgKyBcXFwiJmZyPXBjXFxcIikuYm9keSh7XFxuICAgICAgICBcXFwiZmlkc1xcXCI6IFtmaWRdXFxuICAgIH0pLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCkuc3RhcnQodHJ1ZSk7XFxufVxcblxcbmZ1bmN0aW9uIGdldFBsYXlVcmwoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSkge1xcbiAgICBsZXQgaXNTaGFyZSA9IHB3ZF9pZCE9PVxcXCJzZWxmXFxcIjtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGlmICghY29va2llKSByZXR1cm4gXFxcInRvYXN0Oi8v6K+355m75b2V6LSm5Y+3XFxcIjtcXG4gICAgICAgIGxldCBhc2ZpZCA9IFxcXCJcXFwiO1xcbiAgICAgICAgaWYgKGlzU2hhcmUpIHtcXG4gICAgICAgICAgICBsZXQgdGFza0lkID0gY3JlYXRlU2F2ZVRhc2soZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuKS5kYXRhLnRhc2tfaWQ7XFxuICAgICAgICAgICAgYXNmaWQgPSBxdWVyeVRhc2sodGFza0lkKTtcXG4gICAgICAgICAgICBpZiAoIWFzZmlkKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/ojrflj5blpLHotKVcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgYXNmaWQgPSBmaWQ7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcGxheUNvb2tpZSA9IGNvb2tpZU1hbmFnZS5nZXQoKTtcXG4gICAgICAgIC8qaWYgKHByID09PSBcXFwiVUNCcm93c2VyXFxcIikge1xcbiAgICAgICAgICAgIHBsYXlDb29raWUgPSBjb29raWU7XFxuICAgICAgICB9Ki9cXG4gICAgICAgIGxldCBwbGF5SGVhZGVyID0ge1xcbiAgICAgICAgICAgIFJlZmVyZXI6IGhvbWVVcmwsXFxuICAgICAgICAgICAgY29va2llOiBwbGF5Q29va2llLFxcbiAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogXFxcIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS8xMDAuMC40ODk2LjU4IFVDQnJvd3Nlci8xNi41LjguMTMwOSBNb2JpbGUgU2FmYXJpLzUzNy4zNlxcXCJcXG4gICAgICAgIH07XFxuICAgICAgICBsZXQgcGxheUhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBwbGF5SGVhZGVyLCB7XFxuICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwiTG9nU3RhdGlzdGljXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gXFxcInZpZGVvXFxcIikge1xcbiAgICAgICAgICAgIGxldCBwbGF5TW9kZSA9IGdldEl0ZW0oXFxcInF1YXJrX3BsYXlNb2RlXFxcIiwgXFxcIui9rOeggVxcXCIpO1xcbiAgICAgICAgICAgIGlmIChwbGF5TW9kZSA9PT0gXFxcIui9rOeggVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHZpZGVvUmVzID0gZ2V0UHJldmlld1ZpZGVvKGFzZmlkKTtcXG5cXG4gICAgICAgICAgICAgICAgbGV0IHZpZGVvTGlzdCA9IHZpZGVvUmVzLmRhdGEudmlkZW9fbGlzdDtcXG4gICAgICAgICAgICAgICAgbGV0IHBsYXlMaXN0ID0ge1xcbiAgICAgICAgICAgICAgICAgICAgbmFtZXM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsczogW10sXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBbXVxcbiAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICB2aWRlb0xpc3QuZmlsdGVyKHYgPT4gdi5hY2Nlc3NhYmxlKS5mb3JFYWNoKHYgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgcGxheUxpc3QubmFtZXMucHVzaCh2LnJlc29sdXRpb24pO1xcbiAgICAgICAgICAgICAgICAgICAgcGxheUxpc3QudXJscy5wdXNoKHYudmlkZW9faW5mby51cmwgKyBcXFwiI2lzVmlkZW89dHJ1ZSNcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHBsYXlMaXN0LmhlYWRlcnMucHVzaChwbGF5SGVhZGVycyk7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBpc1NoYXJlICYmIGNyZWF0ZURlbGV0ZVRhc2soYXNmaWQpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGxheUxpc3QpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuXFxuICAgICAgICAgICAgICAgIGxldCBwbGF5VXJsID0gZ2V0RG93bmxvYWRVcmwoYXNmaWQpLmRhdGFbMF0uZG93bmxvYWRfdXJsO1xcbiAgICAgICAgICAgICAgICBwbGF5SGVhZGVycy5jb29raWUgPSBjb29raWVNYW5hZ2UuZ2V0KCk7XFxuICAgICAgICAgICAgICAgIGxldCBwbGF5TGlzdCA9IHtcXG4gICAgICAgICAgICAgICAgICAgIG5hbWVzOiBbcGxheU1vZGVdLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsczogW3BsYXlVcmwgKyBcXFwiI2lzVmlkZW89dHJ1ZSNcXFwiICsgKHBsYXlNb2RlID09PSBcXFwi5Y6f55S7XFxcIiA/IFxcXCIjZmFzdFBsYXlNb2RlIyN0aHJlYWRzPVxcXCIgKyBnZXRJdGVtKFxcXCJzcGVlZFRocmVhZFxcXCIsIFxcXCIxMFxcXCIpICsgXFxcIiNcXFwiIDogXFxcIlxcXCIpXSxcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IFtwbGF5SGVhZGVyc11cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpc1NoYXJlICYmY3JlYXRlRGVsZXRlVGFzayhhc2ZpZCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwbGF5TGlzdCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsZXQgcGxheVVybCA9IGdldERvd25sb2FkVXJsKGFzZmlkKS5kYXRhWzBdLmRvd25sb2FkX3VybDtcXG5cXG4gICAgICAgICAgICBpc1NoYXJlICYmIGNyZWF0ZURlbGV0ZVRhc2soYXNmaWQpO1xcbiAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PT0gJ2F1ZGlvJykge1xcbiAgICAgICAgICAgICAgICBsZXQgcGxheUxpc3QgPSB7XFxuICAgICAgICAgICAgICAgICAgICBuYW1lczogW1xcXCLpn7PpopFcXFwiXSxcXG4gICAgICAgICAgICAgICAgICAgIHVybHM6IFtwbGF5VXJsICsgXFxcIiNpc011c2ljPXRydWUjXFxcIl0sXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBbcGxheUhlYWRlcl0sXFxuICAgICAgICAgICAgICAgICAgICBseXJpYzogXFxcIlxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGxheUxpc3QpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2F0ZWdvcnkgPT09ICdpbWFnZScpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQocGxheVVybCwgcGxheUhlYWRlcikuaW1hZ2UoKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBwbGF5SGVhZGVyID0gT2JqZWN0LmtleXMocGxheUhlYWRlcikubWFwKGtleSA9PiBrZXkgKyBcXFwiQFxcXCIgKyBTdHJpbmcocGxheUhlYWRlcltrZXldKS5yZXBsYWNlKC87L2csIFxcXCLvvJvvvJtcXFwiKSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiZG93bmxvYWQ6Ly9cXFwiICsgcGxheVVybCArIFxcXCI7e1xcXCIgKyBwbGF5SGVhZGVyLmpvaW4oXFxcIiYmXFxcIikgKyBcXFwifVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBpZiAoZS5tZXNzYWdlLmluY2x1ZGVzKFxcXCJyZXF1aXJlIGxvZ2luXFxcIil8fGUubWVzc2FnZS5pbmNsdWRlcyhcXFwidG9rZW5cXFwiKXx8ZS5tZXNzYWdlLmluY2x1ZGVzKFxcXCJpbnZhbGlkXFxcIikpIHtcXG4gICAgICAgICAgICB0b2FzdChcXFwi5pyq55m75b2V5oiW55m75b2V6L+H5pyf77yM6K+36YeN5paw55m75b2VXFxcIik7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvbG9naW4jbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP2Zyb209XFxcIiArIGZyb21Ecml2ZTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgZS50b1N0cmluZygpO1xcbiAgICB9XFxufVxcblxcbiQuZXhwb3J0cyA9IHtcXG4gICAgZ2V0UGxheVVybFxcbn07XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLnmbvlvZXotKblj7dcIixcInBhdGhcIjpcImxvZ2luXCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZCA9IFtdO1xcbnNldFBhZ2VUaXRsZShcXFwi55m75b2V6LSm5Y+3XFxcIik7XFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiBjbGVhck15VmFyKFxcXCJjb29raWVcXFwiKSk7XFxubGV0IGZyb209Z2V0UGFyYW0oXFxcImZyb21cXFwiLFxcXCJcXFwiKTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuKAnOKAnOehruiupOeZu+W9leKAneKAnVxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoZnJvbSkgPT4ge1xcbiAgICAgICAgLy9sZXQgY20gPSBhbmRyb2lkLndlYmtpdC5Db29raWVNYW5hZ2VyLmdldEluc3RhbmNlKCk7XFxuICAgICAgICAvL2xldCBjbSA9IGNvbS50ZW5jZW50LnNtdHQuc2RrLkNvb2tpZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcXG4gICAgICAgIC8vbGV0IGNvb2tpZSA9IFN0cmluZyhjbS5nZXRDb29raWUoXFxcImh0dHBzOi8vcGFuLnF1YXJrLmNuXFxcIikgfHwgXFxcIlxcXCIpO1xcbiAgICAgICAgbGV0IGNvb2tpZSA9IGdldE15VmFyKFxcXCJjb29raWVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoJC5yZXF1aXJlKFxcXCJ0b29sXFxcIikuaXNMb2dpbkNvb2tpZShjb29raWUpKSB7XFxuICAgICAgICAgICAgaWYoZnJvbT09PVxcXCJ1Y1xcXCIpe1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJ1Y0Nvb2tpZVxcXCIsIGNvb2tpZSk7XFxuICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInF1YXJrQ29va2llXFxcIiwgY29va2llKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/nmbvlvZXmiJDlip9cXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acqueZu+W9lVxcXCI7XFxuICAgIH0sIGZyb20pLFxcbiAgICBkZXNjOiBcXFwi4oCc4oCc4oCd4oCdPHNtYWxsPueCueWHu+WktOWDj+WPr+S7pemAgOWHuui0puWPt+mHjeaWsOeZu+W9lTwvc21hbGw+XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5sZXQgZHVybD1mcm9tPT09XFxcInVjXFxcIj9cXFwiaHR0cHM6Ly9kcml2ZS51Yy5jblxcXCI6XFxcImh0dHBzOi8vcGFuLnF1YXJrLmNuXFxcIjtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcIng1X3dlYnZpZXdfc2luZ2xlXFxcIixcXG4gICAgdXJsOiBkdXJsLFxcbiAgICBkZXNjOiBcXFwibGlzdCYmc2NyZWVuLTE1MFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB1YTogUENfVUEsXFxuICAgICAgICBqczogJC50b1N0cmluZygodGl0bGUsIGR1cmwpID0+IHtcXG4gICAgICAgICAgICBsZXQgY29va2llID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICBjb29raWUgPSBmYmEuZ2V0Q29va2llKGR1cmwpO1xcbiAgICAgICAgICAgICAgICBmYmEucHV0VmFyKHRpdGxlICsgXFxcIkBjb29raWVcXFwiLCBjb29raWUpO1xcbiAgICAgICAgICAgIH0sIDIwMCk7XFxuICAgICAgICB9LCBNWV9SVUxFLnRpdGxlLCBkdXJsKVxcbiAgICB9XFxufSk7XFxuc2V0UmVzdWx0KGQpXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlt6XlhbdcIixcInBhdGhcIjpcInRvb2xcIixcInJ1bGVcIjpcImpzOlxcblxcbiQuZXhwb3J0cz17XFxuICAgIGlzTG9naW5Db29raWUoY29va2llKXtcXG4gICAgICAgIC8vcmV0dXJuIHRydWU7XFxuICAgICAgICByZXR1cm4gISEoY29va2llICAmJiBjb29raWUuaW5jbHVkZXMoXFxcIl9fdWlkPVxcXCIpICYmIGNvb2tpZS5pbmNsdWRlcyhcXFwiX19wdXM9XFxcIikpO1xcbiAgICB9XFxufTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuS4quS6uui0puWPt+iuvue9rlwiLFwicGF0aFwiOlwiYWNjb3VudFwiLFwicnVsZVwiOlwiJC5leHBvcnRzID0gJChbXFxcIuWkuOWFi+S6jOe7tOeggeeZu+W9lVxcXCIsIFxcXCJDb29raWXnmbvlvZVcXFwiLCBcXFwi572R6aG155m75b2VXFxcIiwgXFxcIuWkjeWItkNvb2tpZVxcXCIsIFxcXCLmuIXpmaRDb29raWVcXFwiLCBcXFwi6I635Y+W572R57uc5YWx5LqrS0tDb29raWVcXFwiLCBcXFwiVUPnvZHpobXnmbvlvZVcXFwiLCBcXFwiVUNDb29raWXnmbvlvZVcXFwiLCBcXFwi5aSN5Yi2VUNDb29raWVcXFwiLCBcXFwi5riF6ZmkVUNDb29raWVcXFwiXSkuc2VsZWN0KChpc3IpID0+IHtcXG4gICAgaWYgKGlucHV0ID09PSBcXFwi572R6aG155m75b2VXFxcIikge1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvbG9naW4jbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIjtcXG4gICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIkNvb2tpZeeZu+W9lVxcXCIpIHtcXG4gICAgICAgIHJldHVybiAkKFxcXCJcXFwiLCBcXFwi6K+36L6T5YWlQ29va2llXFxcIikuaW5wdXQoKGlzcikgPT4ge1xcbiAgICAgICAgICAgIGlmICgkLnJlcXVpcmUoXFxcInRvb2xcXFwiKS5pc0xvZ2luQ29va2llKGlucHV0KSkge1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJxdWFya0Nvb2tpZVxcXCIsIGlucHV0LnJlcGxhY2UoL1xcXFxzL2csIFxcXCJcXFwiKSk7XFxuICAgICAgICAgICAgICAgIGlzciAmJiByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vQ29va2ll5qC85byP6ZSZ6K+vXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBpc3IpO1xcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5LuOVFZCT1jojrflj5ZDb29raWVcXFwiKSB7XFxuICAgICAgICBsZXQgcGF0aCA9IFxcXCIvc3RvcmFnZS9lbXVsYXRlZC8wL1RWLy5xdWFya191c2VyXFxcIjtcXG4gICAgICAgIGlmIChmaWxlRXhpc3QoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCkpIHtcXG4gICAgICAgICAgICBpZiAoIW5ldyBqYXZhLmlvLkZpbGUocGF0aCkuY2FuUmVhZCgpKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLmsqHmnInmnYPpmZDor7vlj5ZDb29raWXmlofku7bvvIzor7fmiZPlvIDmiYDmnInmlofku7bmnYPpmZBcXFxcbua1t+mYlOiuvue9ri0+5pu05aSa5Yqf6IO9LT7lhoXpg6jmlofku7bnrqHnkIYtPuWPs+S4iuinklxcXCIpLmNvbmZpcm0oKCkgPT4ge30pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoZmV0Y2goXFxcImZpbGU6Ly9cXFwiICsgcGF0aCkpO1xcbiAgICAgICAgICAgICAgICBsZXQgY29va2llID0ganNvbi5jb29raWU7XFxuICAgICAgICAgICAgICAgIGlmICgkLnJlcXVpcmUoXFxcInRvb2xcXFwiKS5pc0xvZ2luQ29va2llKGNvb2tpZSkpIHtcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInF1YXJrQ29va2llXFxcIiwgY29va2llKTtcXG4gICAgICAgICAgICAgICAgICAgIGlzciAmJiByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vQ29va2ll5qC85byP6ZSZ6K+vXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iOt+WPluWksei0peWFseS6q+aWh+S7tuaNn+Wdj1xcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gJChcXFwi5pyq5qOA5rWL5YiwVFZCT1jnmoRDb29raWXmlofku7ZcXFxcbuivt+S9v+eUqOi/h+WQjuWGjeWwneivlVxcXCIpLmNvbmZpcm0oKCkgPT4ge30pO1xcbiAgICAgICAgfVxcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5aSN5Yi2Q29va2llXFxcIikge1xcbiAgICAgICAgbGV0IGNvb2tpZSA9IGdldEl0ZW0oXFxcInF1YXJrQ29va2llXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgaWYgKGNvb2tpZSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBjb29raWU7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mnKrnmbvlvZVcXFwiO1xcbiAgICAgICAgfVxcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5riF6ZmkQ29va2llXFxcIikge1xcbiAgICAgICAgY2xlYXJJdGVtKFxcXCJxdWFya0Nvb2tpZVxcXCIpO1xcbiAgICAgICAgaXNyICYmIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6YCA5Ye655m75b2VXFxcIjtcXG4gICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIlVD572R6aG155m75b2VXFxcIikge1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvbG9naW4jbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP2Zyb209dWNcXFwiO1xcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwiVUNDb29raWXnmbvlvZVcXFwiKSB7XFxuICAgICAgICByZXR1cm4gJChcXFwiXFxcIiwgXFxcIuivt+i+k+WFpUNvb2tpZVxcXCIpLmlucHV0KChpc3IpID0+IHtcXG4gICAgICAgICAgICBpZiAoJC5yZXF1aXJlKFxcXCJ0b29sXFxcIikuaXNMb2dpbkNvb2tpZShpbnB1dCkpIHtcXG4gICAgICAgICAgICAgICAgc2V0SXRlbShcXFwidWNDb29raWVcXFwiLCBpbnB1dC5yZXBsYWNlKC9cXFxccy9nLCBcXFwiXFxcIikpO1xcbiAgICAgICAgICAgICAgICBpc3IgJiYgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL0Nvb2tpZeagvOW8j+mUmeivr1xcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgaXNyKTtcXG4gICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuWkjeWItlVDQ29va2llXFxcIikge1xcbiAgICAgICAgbGV0IGNvb2tpZSA9IGdldEl0ZW0oXFxcInVjQ29va2llXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgaWYgKGNvb2tpZSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBjb29raWU7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mnKrnmbvlvZVcXFwiO1xcbiAgICAgICAgfVxcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5riF6ZmkVUNDb29raWVcXFwiKSB7XFxuICAgICAgICBjbGVhckl0ZW0oXFxcInVjQ29va2llXFxcIik7XFxuICAgICAgICBpc3IgJiYgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/pgIDlh7rnmbvlvZVcXFwiO1xcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi6I635Y+W572R57uc5YWx5LqrS0tDb29raWVcXFwiKSB7XFxuICAgICAgICBsZXQgaGhkID0ge1xcbiAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ0FwYWNoZS1IdHRwQ2xpZW50L1VOQVZBSUxBQkxFIChqYXZhIDEuNCknXFxuICAgICAgICB9wqBcXG4gICAgICAgIGxldCBkeGN1cmwgPSAnaHR0cDovL2FwaS52Nngud2h0LmRnd2h0LnRvcC90ZXh0LzNkZTg4ZDEwZDAxOTI5YmUvJ1xcbiAgICAgICAgbGV0IHhjZGF0YSA9IFsnYzk5ZDc0MTFjY2MyOWJjMSddXFxuICAgICAgICBsZXQgZHhjID0gW11cXG4gICAgICAgIGxldCB5c2Nvb2tpZSA9ICcnXFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhjZGF0YS5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgIGxldCBkYXRhID0gZmV0Y2goZHhjdXJsICsgeGNkYXRhW2ldLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhoZFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGlmICgkLnJlcXVpcmUoXFxcInRvb2xcXFwiKS5pc0xvZ2luQ29va2llKGRhdGEpKSB7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICB5c2Nvb2tpZSA9IGRhdGEuc3BsaXQoXFxcIuKRoFxcXCIpWzFdO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoeXNjb29raWUpIHtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJxdWFya0Nvb2tpZVxcXCIsIHlzY29va2llKTtcXG4gICAgICAgICAgICBpc3IgJiYgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcIjtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iOt+WPluWksei0pVxcXCI7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLlpLjlhYvkuoznu7TnoIHnmbvlvZVcXFwiKSB7XFxuICAgICAgICBmdW5jdGlvbiBnZW5lcmF0ZVJhbmRvbVVVSUQoKSB7XFxuICAgICAgICAgICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24oYykge1xcbiAgICAgICAgICAgICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsXFxuICAgICAgICAgICAgICAgICAgICB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcmVxdWVzdF9pZCA9IGdlbmVyYXRlUmFuZG9tVVVJRCgpO1xcbiAgICAgICAgICAgIGxldCBxY1Rva2VuID0gSlNPTi5wYXJzZShmZXRjaChidWlsZFVybChcXFwiaHR0cHM6Ly91b3AucXVhcmsuY24vY2FzL2FqYXgvZ2V0VG9rZW5Gb3JRcmNvZGVMb2dpblxcXCIsIHtcXG4gICAgICAgICAgICAgICAgcmVxdWVzdF9pZCxcXG4gICAgICAgICAgICAgICAgY2xpZW50X2lkOiBcXFwiNTMyXFxcIixcXG4gICAgICAgICAgICAgICAgdjogXFxcIjEuMlxcXCJcXG4gICAgICAgICAgICB9KSkpLmRhdGEubWVtYmVycy50b2tlbjtcXG4gICAgICAgICAgICBjcmVhdGVRUkNvZGUoYGh0dHBzOi8vc3UucXVhcmsuY24vNF9lTUhCSj90b2tlbj0ke3FjVG9rZW59JmNsaWVudF9pZD01MzImc3NiPXdlYmxvZ2luJnVjX3BhcmFtX3N0cj0mdWNfYml6X3N0cj1TJTNBY3VzdG9tJTdDT1BUJTNBU0FSRUElNDAwJTdDT1BUJTNBSU1NRVJTSVZFJTQwMSU3Q09QVCUzQUJBQ0tfQlROX1NUWUxFJTQwMGAsIGZhbHNlKTtcXG4gICAgICAgICAgICBsZXQgc2VydmljZV90aWNrZXQ9XFxcIlxcXCI7XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGVjID0gMDsgaSA8IDMwOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCgyMDAwKTtcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0aWNrZXQgPSBKU09OLnBhcnNlKGZldGNoKGJ1aWxkVXJsKFxcXCJodHRwczovL3VvcC5xdWFyay5jbi9jYXMvYWpheC9nZXRTZXJ2aWNlVGlja2V0QnlRcmNvZGVUb2tlblxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X2lkOmdlbmVyYXRlUmFuZG9tVVVJRCgpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZDogXFxcIjUzMlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdjogXFxcIjEuMlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IHFjVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgIH0pKSk7XFxuICAgICAgICAgICAgICAgICAgICAvL2xvZyh0aWNrZXQpXFxuICAgICAgICAgICAgICAgICAgICBpZih0aWNrZXQuc3RhdHVzID09IDIwMDAwMDApe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfdGlja2V0PXRpY2tldC5kYXRhLm1lbWJlcnMuc2VydmljZV90aWNrZXQ7XFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBpZiAodGlja2V0LnN0YXR1cyA9PSA1MDAwNDAwMSkgY29udGludWU7XFxuICAgICAgICAgICAgICAgICAgICBpZiAodGlja2V0LnN0YXR1cyA9PSA1MDAwNDAwMiB8fCBpID09PSAyOSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kuoznu7TnoIHov4fmnJ9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICBlYysrO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVjID49IDUpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5p+l6K+i5LqM57u056CB5Ye66ZSZXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZighc2VydmljZV90aWNrZXQpIHJldHVybiBcXFwidG9hc3Q6Ly90aWNrZXTojrflj5blpLHotKVcXFwiO1xcbiAgICAgICAgICAgIGxldCByZXM9SlNPTi5wYXJzZShmZXRjaChcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY24vYWNjb3VudC9pbmZvP3N0PVxcXCIrc2VydmljZV90aWNrZXQrXFxcIiZsdz1zY2FuXFxcIiwge1xcbiAgICAgICAgICAgICAgICB3aXRoSGVhZGVyczp0cnVlXFxuICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgIC8vbG9nKHJlcylcXG4gICAgICAgICAgICBpZighSlNPTi5wYXJzZShyZXMuYm9keSkuc3VjY2VzcykgcmV0dXJuIFxcXCJ0b2FzdDovL3RpY2tldOmqjOivgeWksei0pVxcXCI7XFxuICAgICAgICAgICAgbGV0IGNvb2tpZT1cXFwiXFxcIjtcXG4gICAgICAgICAgICBsZXQgaGVhZGVycz1yZXMuaGVhZGVycztcXG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIGhlYWRlcnNbXFxcInNldC1jb29raWVcXFwiXSl7XFxuICAgICAgICAgICAgICAgIGNvb2tpZSs9Yy5zcGxpdChcXFwiO1xcXCIpWzBdK1xcXCI7XFxcIjtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgbG9nKGNvb2tpZSk7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwicXVhcmtDb29raWVcXFwiLCBjb29raWUpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v55m75b2V5oiQ5YqfXFxcIjtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gKFxcXCJ0b2FzdDovL+eZu+W9leWksei0pe+8mlxcXCIgKyBlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgLy9odHRwczovL3N1LnF1YXJrLmNuLzRfZU1IQko/dG9rZW49c3Q5NmE2MzMzOTBueTl5emxrMGl2dW91YzdiOWdmbWomY2xpZW50X2lkPTUzMiZzc2I9d2VibG9naW4mdWNfcGFyYW1fc3RyPSZ1Y19iaXpfc3RyPVMlM0FjdXN0b20lN0NPUFQlM0FTQVJFQSU0MDAlN0NPUFQlM0FJTU1FUlNJVkUlNDAxJTdDT1BUJTNBQkFDS19CVE5fU1RZTEUlNDAwXFxuICAgIH1cXG59LCAkLmltcG9ydFBhcmFtKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIkNvb2tpZU1hbmFnZVwiLFwicGF0aFwiOlwiQ29va2llTWFuYWdlXCIsXCJydWxlXCI6XCJmdW5jdGlvbiBDb29raWVNYW5hZ2UoY29va2llKSB7XFxuICAgIHRoaXMuY29va2llID0ge307XFxuICAgIHRoaXMuYWRkKGNvb2tpZSk7XFxufVxcbk9iamVjdC5hc3NpZ24oQ29va2llTWFuYWdlLnByb3RvdHlwZSwge1xcbiAgICBhZGQoY29va2llKSB7XFxuICAgICAgICBsZXQgY29va2llcyA9IFtdO1xcbiAgICAgICAgaWYgKHR5cGVvZiBjb29raWUgPT09IFxcXCJzdHJpbmdcXFwiKSB7XFxuICAgICAgICAgICAgY29va2llcyA9IGNvb2tpZS5zcGxpdChcXFwiO1xcXCIpO1xcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvb2tpZSkpIHtcXG4gICAgICAgICAgICBjb29raWVzID0gY29va2llO1xcbiAgICAgICAgfVxcbiAgICAgICAgY29va2llcy5mb3JFYWNoKHYgPT4ge1xcbiAgICAgICAgICAgIHYgPSB2LnNwbGl0KFxcXCI9XFxcIik7XFxuICAgICAgICAgICAgaWYgKHYubGVuZ3RoIDwgMikgcmV0dXJuO1xcbiAgICAgICAgICAgIGxldCBrZXkgPSB2LnNoaWZ0KCkudHJpbSgpO1xcbiAgICAgICAgICAgIHRoaXMuY29va2llW2tleV0gPSB2LmpvaW4oXFxcIj1cXFwiKS50cmltKCk7XFxuICAgICAgICB9KTtcXG4gICAgfSxcXG4gICAgZ2V0KCkge1xcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuY29va2llKS5tYXAodiA9PiB2WzBdICsgXFxcIj1cXFwiICsgdlsxXSkuam9pbihcXFwiO1xcXCIpO1xcbiAgICB9XFxufSk7XFxuLy9jb25zdCBjb29raWVNYW5hZ2UgPSBuZXcgQ29va2llTWFuYWdlKGNvb2tpZSk7XFxuJC5leHBvcnRzPUNvb2tpZU1hbmFnZTtcIn1dLFwicGFyYW1zXCI6XCJ7XFxcImluaGVyaXRUaXRsZVxcXCI6ZmFsc2UsXFxcIm5vUGljXFxcIjp0cnVlLFxcXCJzaGFyZVRva2VuXFxcIjpcXFwiK0hCTlRWeFVOVm81d2R0UzhiekIxYTBoMGRZUDA2eDJmdlNWWXdpY3g1dz1cXFwifVwiLFwic2F2ZWRcIjpmYWxzZSxcInRpdGxlXCI6XCJRdWFyay7nroBcIixcInZlcnNpb25cIjowLFwidXJsXCI6XCJoaWtlcjovL3BhZ2UvcXVhcmtMaXN0P3J1bGU9UXVhcmsu566AJnJlYWx1cmw9aHR0cHMlM0ElMkYlMkZkcml2ZS51Yy5jbiUyRnMlMkYyNjg4OTQ0YTRmZGM0JTNGcHVibGljJTNEMSZzaGFyZVB3ZD1cIixcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJmaW5kX3J1bGVcIjpcImpzOlxcbmxldCBkID0gW107XFxuXFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiBjbGVhck15VmFyKFxcXCJwbGF5VXJsQ2FjaGVcXFwiKSk7XFxuYWRkTGlzdGVuZXIoXFxcIm9uUmVmcmVzaFxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcInBsYXlVcmxDYWNoZVxcXCIpKTtcXG5sZXQgc29VcmwgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInJlYWx1cmxcXFwiLCBcXFwiXFxcIikpO1xcbmxldCBmcm9tRHJpdmUgPSBNWV9QQVJBTVMuZnJvbURyaXZlIHx8IFxcXCJxdWFya1xcXCI7XFxuXFxuaWYgKHNvVXJsLmluY2x1ZGVzKFxcXCJkcml2ZS51Yy5jblxcXCIpKSB7XFxuICAgIGZyb21Ecml2ZSA9IFxcXCJ1Y1xcXCI7XFxufVxcbmxldCByZWFsdXJsID0gc29Vcmwuc3BsaXQoXFxcIj9cXFwiKVswXTtcXG5sZXQgdXJsRGF0YSA9IHJlYWx1cmwuc3BsaXQoXFxcIi9cXFwiKTtcXG5cXG5sZXQgc2hhcmVJZCA9IE1ZX1BBUkFNUy5zaGFyZUlkIHx8IHVybERhdGFbNF0ucmVwbGFjZShcXFwiI1xcXCIsIFxcXCJcXFwiKTtcXG5sZXQgc2hhcmVQd2QgPSBnZXRQYXJhbShcXFwic2hhcmVQd2RcXFwiLCBNWV9QQVJBTVMuc2hhcmVQd2QgfHwgZ2V0UGFyYW0oXFxcInBhc3Njb2RlXFxcIiwgXFxcIlxcXCIsIHNvVXJsKSB8fCBcXFwiXFxcIik7XFxubGV0IHNoYXJlVG9rZW4gPSBnZXRQYXJhbShcXFwic2hhcmVUb2tlblxcXCIsIE1ZX1BBUkFNUy5zaGFyZVRva2VuIHx8IFxcXCJcXFwiKTtcXG5cXG5sZXQgZmlsZUlkID0gTVlfUEFSQU1TLmZpbGVJZDtcXG5cXG5sZXQgc29ydCA9IHtcXG4gICAgXFxcIuWQjeensOato+W6j1xcXCI6IFxcXCJmaWxlX25hbWU6YXNjXFxcIixcXG4gICAgXFxcIuWQjeensOWAkuW6j1xcXCI6IFxcXCJmaWxlX25hbWU6ZGVzY1xcXCIsXFxuICAgIFxcXCLml7bpl7TmraPluo9cXFwiOiBcXFwidXBkYXRlZF9hdDphc2NcXFwiLFxcbiAgICBcXFwi5pe26Ze05YCS5bqPXFxcIjogXFxcInVwZGF0ZWRfYXQ6ZGVzY1xcXCJcXG59O1xcbmxldCBzdHlsZXMgPSBbXFxcInRleHRfMVxcXCIsIFxcXCJhdmF0YXJcXFwiXTtcXG5cXG5sZXQgc29ydFZhbHVlID0gc29ydFtnZXRJdGVtKFxcXCJzb3J0S2V5XFxcIiwgXFxcIuWQjeensOato+W6j1xcXCIpXTtcXG5sZXQgc3R5bGUgPSBnZXRJdGVtKFxcXCJzdHlsZVxcXCIsIHN0eWxlc1swXSk7XFxuaWYgKE1ZX1BBR0UgPT0gMSkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGZyb21Ecml2ZSA9PT0gXFxcInVjXFxcIiA/IFxcXCJVQ+e9keebmFxcXCIgOiBcXFwi5aS45YWL572R55uYXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl81XFxcIixcXG4gICAgICAgIHBpY191cmw6IGZyb21Ecml2ZSA9PT0gXFxcInVjXFxcIiA/IFxcXCJodHRwOi8vMTIzLjU2LjEwNS4xNDUvdHViaWFvL2VyZGkvMTQucG5nXFxcIiA6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2t1YWtlXFxcIixcXG4gICAgICAgIHVybDogJChcXFwi54K55Ye75Yqf6IO95oyJ6ZKuPT7kuKrkurrotKblj7fnrqHnkIbljbPlj6/nmbvlvZXotKblj7dcXFwiKS5jb25maXJtKCgpID0+IHt9KSxcXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogc3R5bGUsXFxuICAgICAgICB1cmw6ICQoc3R5bGVzLCAxLCAn6K+36YCJ5oupJykuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICBzZXRJdGVtKCdzdHlsZScsIGlucHV0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L2ltZy9hbGlfaWNvbi5zdmdcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiXFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGdldEl0ZW0oXFxcInNvcnRLZXlcXFwiLCBcXFwi5ZCN56ew5q2j5bqPXFxcIiksXFxuICAgICAgICB1cmw6ICQoT2JqZWN0LmtleXMoc29ydCksIDEsICfor7fpgInmi6knKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcInNvcnRLZXlcXFwiLCBpbnB1dClcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L2ltZy9hbGlfc29ydC5zdmdcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiXFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGdldEl0ZW0oXFxcInF1YXJrX3BsYXlNb2RlXFxcIiwgXFxcIui9rOeggVxcXCIpLFxcbiAgICAgICAgdXJsOiAkKFtcXFwi6L2s56CBXFxcIiwgXFxcIuWOn+eUu1xcXCIsIFxcXCLmma7pgJrljp/nlLtcXFwiXSwgMiwgXFxcIuaSreaUvuaooeW8j1xcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwicXVhcmtfcGxheU1vZGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5YiH5o2i5oiQ5YqfXFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS9pbWcvYWxpX3BsYXkuc3ZnXFxcIixcXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWKn+iDvVxcXCIsXFxuICAgICAgICB1cmw6ICQoW1xcXCLot7PovazlpLjlhYtBUFBcXFwiLCBcXFwi5aSN5Yi25YiG5Lqr6ZO+5o6lXFxcIiwgXFxcIuS4quS6uui0puWPt+euoeeQhlxcXCIsIFxcXCLljp/nlLvkuIvovb3nur/nqItcXFwiXSwgMikuc2VsZWN0KChzaGFyZUlkLCBzaGFyZVB3ZCwgZnJvbURyaXZlKSA9PiB7XFxuICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi6Lez6L2s5aS45YWLQVBQXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInFrbGluazovL3d3dy51Yy5jbi9iMjBiODRmZDczNWE4ZGQzZjc1NDExMjliYWNjNGU5YT9hY3Rpb249b3Blbl91cmwmdXJsPWh0dHBzOi8vcGFuLnF1YXJrLmNuL3MvXFxcIiArIHNoYXJlSWQ7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuS4quS6uui0puWPt+euoeeQhlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiYWNjb3VudFxcXCIpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLljp/nlLvkuIvovb3nur/nqItcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKGdldEl0ZW0oXFxcInNwZWVkVGhyZWFkXFxcIiwgXFxcIjEwXFxcIiksIFxcXCLor7fovpPlhaUzLTMy5LmL6Ze055qE5pW05pWwXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwZWVkVGhyZWFkID0gcGFyc2VJbnQoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWVkVGhyZWFkIDwgMyB8fCBzcGVlZFRocmVhZCA+IDMyKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruS4jeWQiOazlVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJzcGVlZFRocmVhZFxcXCIsIFN0cmluZyhzcGVlZFRocmVhZCkpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLlpI3liLbliIbkuqvpk77mjqVcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGlmIChmcm9tRHJpdmUgPT09IFxcXCJ1Y1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBidWlsZFVybChcXFwiaHR0cHM6Ly9kcml2ZS51Yy5jbi9zL1xcXCIgKyBzaGFyZUlkICsgXFxcIj9wdWJsaWM9MSMvbGlzdC9zaGFyZVxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogc2hhcmVQd2RcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIGJ1aWxkVXJsKFxcXCJodHRwczovL3Bhbi5xdWFyay5jbi9zL1xcXCIgKyBzaGFyZUlkLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2NvZGU6IHNoYXJlUHdkXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIHNoYXJlSWQsIHNoYXJlUHdkLCBmcm9tRHJpdmUpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS9pbWcvYWxpX2ZpbGVpbnRvLnN2Z1xcXCIsXFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6ICdsaW5lX2JsYW5rJ1xcbiAgICB9KTtcXG59XFxuXFxuXFxubGV0IFF1YXJrU2hhcmVBcGkgPSAkLnJlcXVpcmUoXFxcIlF1YXJrU2hhcmVBcGlcXFwiLCBmcm9tRHJpdmUpO1xcbmxldCBxdWFya1NoYXJlQXBpID0gbmV3IFF1YXJrU2hhcmVBcGkoc2hhcmVJZCwgc2hhcmVQd2QpLnNldFRva2VuKHNoYXJlVG9rZW4pLnNldFJlZnJlc2goKHNoYXJlVG9rZW4pID0+IHtcXG4gICAgTVlfUEFSQU1TLnNoYXJlVG9rZW4gPSBzaGFyZVRva2VuO1xcbiAgICBzZXRQYWdlUGFyYW1zKE1ZX1BBUkFNUyk7XFxufSk7XFxuXFxuZnVuY3Rpb24gZm9ybWF0U2l6ZShzaXplKSB7XFxuICAgIGlmICghc2l6ZSkge1xcbiAgICAgICAgcmV0dXJuICcnO1xcbiAgICB9XFxuICAgIGNvbnN0IHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJywgJ1BCJywgJ0VCJywgJ1pCJywgJ1lCJ107XFxuICAgIGxldCBpID0gMDtcXG4gICAgd2hpbGUgKHNpemUgPj0gMTAyNCkge1xcbiAgICAgICAgc2l6ZSAvPSAxMDI0O1xcbiAgICAgICAgaSsrO1xcbiAgICB9XFxuICAgIHNpemUgPSBpID8gTnVtYmVyKHNpemUudG9GaXhlZCgyKSkgOiBzaXplO1xcbiAgICByZXR1cm4gYCR7c2l6ZX0gJHt1bml0c1tpXX1gO1xcbn1cXG5cXG5sZXQgc3ViRXh0cyA9IFtcXFwidnR0XFxcIiwgXFxcInNydFxcXCIsIFxcXCJhc3NcXFwiXTtcXG5sZXQgdGl0bGVIZWFkID0ge1xcbiAgICB2aWRlbzogXFxcIvCfjqxcXFwiLFxcbiAgICBhdWRpbzogXFxcIvCfjrVcXFwiLFxcbiAgICBkb2M6IFxcXCLwn5ORXFxcIixcXG4gICAgaW1hZ2U6IFxcXCLwn5a8XFxcIixcXG4gICAgYXJjaGl2ZTogXFxcIvCfk6ZcXFwiLFxcbiAgICBcXFwiZGVmYXVsdFxcXCI6IFxcXCLinZNcXFwiXFxufTtcXG5cXG5mdW5jdGlvbiBnZXRIZWFkKHR5cGUsIGV4dCkge1xcbiAgICBsZXQgaGVhZCA9IHRpdGxlSGVhZFt0eXBlXTtcXG4gICAgLyppZiAoc3ViRXh0cy5pbmNsdWRlcyhleHQpKSB7XFxuICAgICAgICBoZWFkID0gXFxcIvCflbhcXFwiO1xcbiAgICB9Ki9cXG4gICAgcmV0dXJuIGhlYWQgfHwgXFxcIuKdk1xcXCI7XFxufVxcbnRyeSB7XFxuICAgIHZhciByZXMgPSBxdWFya1NoYXJlQXBpLmdldExpc3RGaWxlKGZpbGVJZCwgTVlfUEFHRSwgc29ydFZhbHVlKTtcXG4gICAgLy/orr7nva7moIfpophcXG4gICAgdmFyIGxpc3QgPSByZXMuZGF0YS5saXN0IHx8IFtdO1xcbiAgICBpZiAoc2hhcmVJZCAhPT0gXFxcInNlbGZcXFwiKSB7XFxuICAgICAgICBzZXRQYWdlVGl0bGUocmVzLmRhdGEuc2hhcmUudGl0bGUpO1xcblxcbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAwICYmICFmaWxlSWQpIHtcXG4gICAgICAgICAgICByZXMgPSBxdWFya1NoYXJlQXBpLmdldExpc3RGaWxlKHJlcy5kYXRhLnNoYXJlLmZpcnN0X2ZpZCwgTVlfUEFHRSwgc29ydFZhbHVlKTtcXG4gICAgICAgICAgICBzZXRQYWdlVGl0bGUocmVzLmRhdGEuc2hhcmUudGl0bGUpO1xcbiAgICAgICAgICAgIHZhciBsaXN0ID0gcmVzLmRhdGEubGlzdCB8fCBbXTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBsZXQgbmNvb2tpZT1xdWFya1NoYXJlQXBpLmdldFBpY0Nvb2tpZSgpO1xcbiAgICBsb2cobmNvb2tpZSlcXG4gICAgbGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xcbiAgICAgICAgLy/liKTmlq3mmK/lkKbmlofku7blpLlcXG4gICAgICAgIGlmIChpdGVtLmRpcikge1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi8J+TglxcXCIgKyBpdGVtLmZpbGVfbmFtZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogJC5kYXRlRm9ybWF0KGl0ZW0udXBkYXRlZF9hdCwgJ3l5eXktTU0tZGQnKSArICcgICcgKyBpdGVtLmluY2x1ZGVfaXRlbXMgKyAn6aG5ICAnLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L3R1Ymlhby9tZXNzeS8yNy5zdmdcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcXVhcmtMaXN0P3BhZ2U9ZnlwYWdlXFxcIixcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IHN0eWxlLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVJZCxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVUb2tlbjogcXVhcmtTaGFyZUFwaS5nZXRUb2tlbigpLFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBpdGVtLmZpZCxcXG4gICAgICAgICAgICAgICAgICAgIGluaGVyaXRUaXRsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgICAgICBmcm9tRHJpdmVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogZ2V0SGVhZChpdGVtLm9ial9jYXRlZ29yeSkgKyBpdGVtLmZpbGVfbmFtZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogJC5kYXRlRm9ybWF0KGl0ZW0udXBkYXRlZF9hdCwgJ3l5eXktTU0tZGQnKSArICcgICcgKyBmb3JtYXRTaXplKGl0ZW0uc2l6ZSksXFxuICAgICAgICAgICAgICAgIHBpY191cmw6ICQoaXRlbS50aHVtYm5haWwsIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvb2tpZTogbmNvb2tpZVxcbiAgICAgICAgICAgICAgICB9KS5pbWFnZSgpLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSwgZnJvbURyaXZlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVVybENhY2hlID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcInBsYXlVcmxDYWNoZVxcXCIsIHt9KTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChwbGF5VXJsQ2FjaGVbZmlkXSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5VXJsQ2FjaGVbZmlkXTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9ICQucmVxdWlyZShcXFwicGxheVxcXCIsIGZyb21Ecml2ZSkuZ2V0UGxheVVybChmaWQsIGZpZF90b2tlbiwgcHdkX2lkLCBzdG9rZW4sIGNhdGVnb3J5KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5VXJsQ2FjaGVbZmlkXSA9IHVybDtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwicGxheVVybENhY2hlXFxcIiwgcGxheVVybENhY2hlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJsO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9LCBpdGVtLmZpZCwgaXRlbS5zaGFyZV9maWRfdG9rZW4sIHNoYXJlSWQsIHF1YXJrU2hhcmVBcGkuZ2V0VG9rZW4oKSwgaXRlbS5vYmpfY2F0ZWdvcnksIGZyb21Ecml2ZSksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBzdHlsZSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBpdGVtLmZpZCxcXG4gICAgICAgICAgICAgICAgICAgIC8vaW5oZXJpdFRpdGxlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgICAgIGNsczogJ3BsYXlsaXN0ICcgKyBpdGVtLm9ial9jYXRlZ29yeVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH1cXG5cXG4gICAgfSk7XFxufSBjYXRjaCAoZSkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGUubWVzc2FnZSxcXG4gICAgICAgIHVybDogJ2hpa2VyOi8vZW1wdHknLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBpZiAoZS5tZXNzYWdlLmluY2x1ZGVzKFxcXCLmj5Dlj5bnoIFcXFwiKSkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIui+k+WFpeaPkOWPlueggVxcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKCkuaW5wdXQoKE1ZX1BBUkFNUykgPT4ge1xcbiAgICAgICAgICAgICAgICBzZXRQYWdlUGFyYW1zKE9iamVjdC5hc3NpZ24oe30sIE1ZX1BBUkFNUywge1xcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IGlucHV0XFxuICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICB9LCBNWV9QQVJBTVMpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbnNldFJlc3VsdChkKTtcIixcImdyb3VwXCI6XCLikaDnvZHnm5hcIixcInVhXCI6XCJtb2JpbGVcIixcInByZVJ1bGVcIjpcIlwiLFwicGFnZXNcIjpcIlt7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlpLjlhYvliJfooahBUElcXFwiLFxcXCJwYXRoXFxcIjpcXFwiUXVhcmtTaGFyZUFwaVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbi8vQGF1dGhvciBMb3lEZ0lrXFxcXG5sZXQgaHR0cFJlcXVlc3QgPSAkLnJlcXVpcmUoXFxcXFxcXCJodHRwUmVxdWVzdFxcXFxcXFwiKTtcXFxcbmxldCBDb29raWVNYW5hZ2U9JC5yZXF1aXJlKFxcXFxcXFwiQ29va2llTWFuYWdlXFxcXFxcXCIpO1xcXFxubGV0IGZyb21Ecml2ZSA9IG1vZHVsZS5pbXBvcnRQYXJhbTtcXFxcbmxldCBwciwgYmFzZVVybCwgY29va2llO1xcXFxuaWYgKGZyb21Ecml2ZSA9PT0gXFxcXFxcXCJ1Y1xcXFxcXFwiKSB7XFxcXG4gICAgYmFzZVVybCA9IFxcXFxcXFwiaHR0cHM6Ly9wYy1hcGkudWMuY25cXFxcXFxcIjtcXFxcbiAgICBwciA9IFxcXFxcXFwiVUNCcm93c2VyXFxcXFxcXCI7XFxcXG4gICAgY29va2llID0gZ2V0SXRlbShcXFxcXFxcInVjQ29va2llXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxufSBlbHNlIHtcXFxcbiAgICBiYXNlVXJsID0gXFxcXFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuXFxcXFxcXCI7XFxcXG4gICAgcHIgPSBcXFxcXFxcInVjcHJvXFxcXFxcXCI7XFxcXG4gICAgY29va2llID0gZ2V0SXRlbShcXFxcXFxcInF1YXJrQ29va2llXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxufVxcXFxuXFxcXG5jb25zdCBjb29raWVNYW5hZ2UgPSBuZXcgQ29va2llTWFuYWdlKGNvb2tpZSk7XFxcXG5mdW5jdGlvbiBRdWFya1NoYXJlQXBpKHNoYXJlSWQsIHNoYXJlUHdkKSB7XFxcXG4gICAgdGhpcy5zaGFyZUlkID0gc2hhcmVJZDtcXFxcbiAgICB0aGlzLnNoYXJlUHdkID0gc2hhcmVQd2Q7XFxcXG4gICAgdGhpcy5yZWZyZXNoQ2FsbEJhY2sgPSAoKCkgPT4gdm9pZCAwKTtcXFxcbiAgICAvL3RoaXMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW4gfHwgdGhpcy5nZXRTaGFyZVRva2VuKCk7XFxcXG59XFxcXG5PYmplY3QuYXNzaWduKFF1YXJrU2hhcmVBcGkucHJvdG90eXBlLCB7XFxcXG4gICAgc2V0UmVmcmVzaChyZWZyZXNoQ2FsbEJhY2spIHtcXFxcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2FsbEJhY2sgPSByZWZyZXNoQ2FsbEJhY2s7XFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgc2V0VG9rZW4oc2hhcmVUb2tlbikge1xcXFxuICAgICAgICB0aGlzLnNoYXJlVG9rZW4gPSBzaGFyZVRva2VuO1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIHJlcXVlc3RIdHRwKGFwaSkge1xcXFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KGFwaS5zdGFydHNXaXRoKFxcXFxcXFwiaHR0cFxcXFxcXFwiKSA/IGFwaSA6IChiYXNlVXJsICsgYXBpKSkuc3VjY2VzcygoYm9keSxyZXMpID0+IHtcXFxcbiAgICAgICAgICAgIGlmIChib2R5LnN0YXR1cyAhPT0gMjAwKSB7XFxcXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJvZHkubWVzc2FnZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBjb29raWVNYW5hZ2UuYWRkKHJlcy5oZWFkZXJzW1xcXFxcXFwic2V0LWNvb2tpZVxcXFxcXFwiXSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gYm9keTtcXFxcbiAgICAgICAgfSkuaGVhZGVycyh7XFxcXG4gICAgICAgICAgICBcXFxcXFxcImNvb2tpZVxcXFxcXFwiOiBjb29raWVNYW5hZ2UuZ2V0KCksXFxcXG4gICAgICAgICAgICBcXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjogXFxcXFxcXCJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBxdWFyay1jbG91ZC1kcml2ZS8yLjUuMjAgQ2hyb21lLzEwMC4wLjQ4OTYuMTYwIEVsZWN0cm9uLzE4LjMuNS40LWI0Nzg0OTExMDAgU2FmYXJpLzUzNy4zNiBDaGFubmVsL3Bja2tfb3RoZXJfY2hcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIFxcXFxcXFwicmVmZXJlclxcXFxcXFwiOiBiYXNlVXJsXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH0sXFxcXG4gICAgZ2V0VG9rZW4oKSB7XFxcXG4gICAgICAgIGlmICh0aGlzLnNoYXJlSWQgIT09IFxcXFxcXFwic2VsZlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaGFyZVRva2VuIHx8IHRoaXMuZ2V0U2hhcmVUb2tlbigpO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIGdldFBpY0Nvb2tpZSgpe1xcXFxuICAgICAgICByZXR1cm4gY29va2llTWFuYWdlLmdldCgpO1xcXFxuICAgICAgICBcXFxcbiAgICB9LFxcXFxuICAgIGdldFNoYXJlVG9rZW4oKSB7XFxcXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnJlcXVlc3RIdHRwKFxcXFxcXFwiLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2UvdG9rZW5cXFxcXFxcIikuYm9keSh7XFxcXG4gICAgICAgICAgICBcXFxcXFxcInB3ZF9pZFxcXFxcXFwiOiB0aGlzLnNoYXJlSWQsXFxcXG4gICAgICAgICAgICBcXFxcXFxcInBhc3Njb2RlXFxcXFxcXCI6IHRoaXMuc2hhcmVQd2QsXFxcXG4gICAgICAgIH0pLmJvZHlUb1N0cmluZyh0cnVlKS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3QpLnN0YXJ0KHRydWUpO1xcXFxuICAgICAgICB0aGlzLnNoYXJlVG9rZW4gPSByZXN1bHQuZGF0YS5zdG9rZW47XFxcXG4gICAgICAgIHRoaXMucmVmcmVzaENhbGxCYWNrKHJlc3VsdC5kYXRhLnN0b2tlbiwgdGhpcyk7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLnNoYXJlVG9rZW47XFxcXG4gICAgfSxcXFxcbiAgICBfZ2V0U2VsZkxpc3RGaWxlKGZpbGVJZCwgcGFnZSwgb3JkZXJCeSkge1xcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5yZXF1ZXN0SHR0cChcXFxcXFxcImh0dHBzOi8vZHJpdmUucXVhcmsuY24vMS9jbG91ZGRyaXZlL2ZpbGUvc29ydD9wcj1cXFxcXFxcIiArIHByICsgXFxcXFxcXCImZnI9cGNcXFxcXFxcIikuYnVpbGRVcmwoe1xcXFxuICAgICAgICAgICAgcGRpcl9maWQ6IGZpbGVJZCB8fCBcXFxcXFxcIjBcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGZvcmNlOiAwLFxcXFxuICAgICAgICAgICAgX3BhZ2U6IHBhZ2UsXFxcXG4gICAgICAgICAgICBfc2l6ZTogMTAwLFxcXFxuICAgICAgICAgICAgdWNfcGFyYW1fc3RyOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgX2ZldGNoX3RvdGFsOiAxLFxcXFxuICAgICAgICAgICAgX2ZldGNoX3N1Yl9kaXJzOiAwLFxcXFxuICAgICAgICAgICAgX3NvcnQ6IFxcXFxcXFwiZmlsZV90eXBlOmFzYyxcXFxcXFxcIiArIG9yZGVyQnlcXFxcbiAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxcXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxcXG4gICAgfSxcXFxcbiAgICBfZ2V0U2hhcmVMaXN0RmlsZShmaWxlSWQsIHBhZ2UsIG9yZGVyQnkpIHtcXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucmVxdWVzdEh0dHAoXFxcXFxcXCIvMS9jbG91ZGRyaXZlL3NoYXJlL3NoYXJlcGFnZS9kZXRhaWw/cHI9XFxcXFxcXCIgKyBwciArIFxcXFxcXFwiJmZyPXBjXFxcXFxcXCIpLmJ1aWxkVXJsKHtcXFxcbiAgICAgICAgICAgIHB3ZF9pZDogdGhpcy5zaGFyZUlkIHx8IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBzdG9rZW46IGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmdldFRva2VuKCkgfHwgXFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgICAgICAgICBwZGlyX2ZpZDogZmlsZUlkIHx8IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBmb3JjZTogMCxcXFxcbiAgICAgICAgICAgIF9wYWdlOiBwYWdlLFxcXFxuICAgICAgICAgICAgX3NpemU6IDEwMCxcXFxcbiAgICAgICAgICAgIF9mZXRjaF9iYW5uZXI6IDEsXFxcXG4gICAgICAgICAgICBfZmV0Y2hfc2hhcmU6IDEsXFxcXG4gICAgICAgICAgICBfZmV0Y2hfdG90YWw6IDEsXFxcXG4gICAgICAgICAgICBfc29ydDogXFxcXFxcXCJmaWxlX3R5cGU6YXNjLFxcXFxcXFwiICsgb3JkZXJCeVxcXFxuICAgICAgICB9KS5lcnJvcldpdGhSZXRyeSgoZXJyLCByZXMsIGh0dHApID0+IHtcXFxcbiAgICAgICAgICAgIGlmIChKU09OLnBhcnNlKHJlcy5ib2R5KS5tZXNzYWdlLmluY2x1ZGVzKCdzdG9rZW4nKSkge1xcXFxuICAgICAgICAgICAgICAgIGh0dHAubWVyZ2VIZWFkQW5kQm9keSh7XFxcXG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkVXJsOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9rZW46IGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmdldFNoYXJlVG9rZW4oKSB8fCBcXFxcXFxcIlxcXFxcXFwiKVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcXFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcXFxuICAgIH0sXFxcXG4gICAgZ2V0TGlzdEZpbGUoZmlsZUlkLCBwYWdlLCBvcmRlckJ5KSB7XFxcXG4gICAgICAgIGlmICh0aGlzLnNoYXJlSWQgIT09IFxcXFxcXFwic2VsZlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U2hhcmVMaXN0RmlsZShmaWxlSWQsIHBhZ2UsIG9yZGVyQnkpO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNlbGZMaXN0RmlsZShmaWxlSWQsIHBhZ2UsIG9yZGVyQnkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxufSk7XFxcXG4kLmV4cG9ydHMgPSBRdWFya1NoYXJlQXBpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcImh0dHBSZXF1ZXN0XFxcIixcXFwicGF0aFxcXCI6XFxcImh0dHBSZXF1ZXN0XFxcIixcXFwicnVsZVxcXCI6XFxcImZ1bmN0aW9uIGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcXFxuICAgIHRoaXMucmV0cnlDb3VudCA9IDA7XFxcXG4gICAgdGhpcy51cmwgPSB1cmw7XFxcXG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xcXFxuICAgICAgICB3aXRoSGVhZGVyczogdHJ1ZVxcXFxuICAgIH0pO1xcXFxuICAgIHRoaXMuZXJyb3JDYWxsYmFjayA9IChlcnIsIHJlcykgPT4ge3Rocm93IGVycn07XFxcXG4gICAgdGhpcy5lcnJvckNhbGxiYWNrV2l0aFJldHJ5ID0gKGVyciwgcmVzLCB0cnlSZXN0YXJ0KSA9PiBmYWxzZTtcXFxcbiAgICB0aGlzLnN1Y2Nlc3NDYWxsYmFjayA9IChib2R5LCBzdGF0dXNDb2RlLCBoZWFkZXJzKSA9PiBib2R5O1xcXFxuICAgIHRoaXMuZXJyb3JUeXBlQ2FsbGJhY2sgPSAoZXJyLCByZXMpID0+IGVycjtcXFxcbiAgICB0aGlzLnN0YXJ0UmVxdWVzdCA9IGZldGNoO1xcXFxuICAgIHRoaXMuX2JvZHlUb1N0cmluZyA9IGZhbHNlO1xcXFxuICAgIHRoaXMuYnVpbGRQYXJhbSA9IHZvaWQoMCk7XFxcXG59XFxcXG5cXFxcbk9iamVjdC5hc3NpZ24oaHR0cFJlcXVlc3QucHJvdG90eXBlLCB7XFxcXG4gICAgYm9keVRvU3RyaW5nKGZsYWcpIHtcXFxcbiAgICAgICAgdGhpcy5fYm9keVRvU3RyaW5nID0gISFmbGFnO1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIGJvZHkoYm9keSkge1xcXFxuICAgICAgICB0aGlzLm9wdGlvbnMuYm9keSA9IGJvZHkgfHwgdm9pZCAwO1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIGJ1aWxkVXJsKGJ1aWxkUGFyYW0pIHtcXFxcbiAgICAgICAgdGhpcy5idWlsZFBhcmFtID0gYnVpbGRQYXJhbSB8fCB7fTtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBzZXRTdGFydFJlcXVlc3RGdW5jKGZ1bmMpIHtcXFxcbiAgICAgICAgdGhpcy5zdGFydFJlcXVlc3QgPSBmdW5jO1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIGhlYWRlcnMoaGVhZGVycykge1xcXFxuICAgICAgICB0aGlzLm9wdGlvbnMuaGVhZGVycyA9IGhlYWRlcnMgfHwgdm9pZCAwO1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIHN1Y2Nlc3Moc3VjY2Vzc0NhbGxiYWNrKSB7XFxcXG4gICAgICAgIGlmICh0eXBlb2Ygc3VjY2Vzc0NhbGxiYWNrICE9PSBcXFxcXFxcImZ1bmN0aW9uXFxcXFxcXCIpIHJldHVybiB0aGlzO1xcXFxuICAgICAgICB0aGlzLnN1Y2Nlc3NDYWxsYmFjayA9IHN1Y2Nlc3NDYWxsYmFjaztcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBlcnJvcihlcnJvckNhbGxiYWNrKSB7XFxcXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JDYWxsYmFjayAhPT0gXFxcXFxcXCJmdW5jdGlvblxcXFxcXFwiKSByZXR1cm4gdGhpcztcXFxcbiAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjaztcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBlcnJvclR5cGUoZXJyb3JUeXBlQ2FsbGJhY2spIHtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiBlcnJvclR5cGVDYWxsYmFjayAhPT0gXFxcXFxcXCJmdW5jdGlvblxcXFxcXFwiKSByZXR1cm4gdGhpcztcXFxcbiAgICAgICAgdGhpcy5lcnJvclR5cGVDYWxsYmFjayA9IGVycm9yVHlwZUNhbGxiYWNrO1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIGVycm9yV2l0aFJldHJ5KHJldHJ5Q291bnQsIGVycm9yQ2FsbGJhY2tXaXRoUmV0cnkpIHtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiByZXRyeUNvdW50ID09PSBcXFxcXFxcImZ1bmN0aW9uXFxcXFxcXCIgJiYgdHlwZW9mIGVycm9yQ2FsbGJhY2tXaXRoUmV0cnkgPT09IFxcXFxcXFwidW5kZWZpbmVkXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2tXaXRoUmV0cnkgPSByZXRyeUNvdW50O1xcXFxuICAgICAgICAgICAgcmV0cnlDb3VudCA9IDE7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKHR5cGVvZiBlcnJvckNhbGxiYWNrV2l0aFJldHJ5ICE9PSBcXFxcXFxcImZ1bmN0aW9uXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRoaXMucmV0cnlDb3VudCA9IE51bWJlcihyZXRyeUNvdW50KTtcXFxcbiAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrV2l0aFJldHJ5ID0gZXJyb3JDYWxsYmFja1dpdGhSZXRyeTtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBzdGFydCh0b0pzb24pIHtcXFxcbiAgICAgICAgbGV0IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMpO1xcXFxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYm9keSA9PT0gXFxcXFxcXCJvYmplY3RcXFxcXFxcIiAmJiB0aGlzLl9ib2R5VG9TdHJpbmcpIHtcXFxcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuYm9keSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdmFyIHJlcyA9IEpTT04ucGFyc2UodGhpcy5zdGFydFJlcXVlc3QodGhpcy5idWlsZFBhcmFtP2J1aWxkVXJsKHRoaXMudXJsLCB0aGlzLmJ1aWxkUGFyYW0pOnRoaXMudXJsLCBvcHRpb25zKSk7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlcy5zdGF0dXNDb2RlIDw9IDMwMCkge1xcXFxuICAgICAgICAgICAgICAgIGxldCBib2R5ID0gcmVzLmJvZHk7XFxcXG4gICAgICAgICAgICAgICAgaWYgKHRvSnNvbikge1xcXFxuICAgICAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3VjY2Vzc0NhbGxiYWNrKGJvZHksIHJlcyk7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihTdHJpbmcocmVzLnN0YXR1c0NvZGUpKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgIGVyciA9IHRoaXMuZXJyb3JUeXBlQ2FsbGJhY2soZXJyLCByZXMpO1xcXFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZiAodGhpcy5yZXRyeUNvdW50KSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHRyeVJlc3VsdCA9IHRoaXMuZXJyb3JDYWxsYmFja1dpdGhSZXRyeShlcnIsIHJlcywgdGhpcyk7XFxcXG4gICAgICAgICAgICAgICAgaWYgKHRyeVJlc3VsdCkge1xcXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldHJ5Q291bnQtLTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQodG9Kc29uKTtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldHJ5Q291bnQgPSAwO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvckNhbGxiYWNrKGVyciwgcmVzKTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yQ2FsbGJhY2soZXJyLCByZXMpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgfSxcXFxcbiAgICBzZXRPcHRpb25zKG9wdGlvbnMpIHtcXFxcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xcXFxuICAgICAgICAgICAgd2l0aEhlYWRlcnM6IHRydWVcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgbWVyZ2VIZWFkQW5kQm9keShvcHRpb25zKSB7XFxcXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xcXFxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucy5oZWFkZXJzfHx7fSwgb3B0aW9ucy5oZWFkZXJzKTtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuYm9keSA9PT0gXFxcXFxcXCJvYmplY3RcXFxcXFxcIiAmJiB0eXBlb2Ygb3B0aW9ucy5ib2R5ID09PSBcXFxcXFxcIm9iamVjdFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucy5ib2R5fHx7fSwgb3B0aW9ucy5ib2R5KTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYnVpbGRVcmwgPT09IFxcXFxcXFwib2JqZWN0XFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5idWlsZFBhcmFtfHx7fSwgb3B0aW9ucy5idWlsZFVybCk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcbk9iamVjdC5hc3NpZ24oaHR0cFJlcXVlc3QsIHtcXFxcbiAgICBmZXRjaCh1cmwsIG9wdGlvbnMpIHtcXFxcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpO1xcXFxuICAgIH0sXFxcXG4gICAgcG9zdCh1cmwsIG9wdGlvbnMpIHtcXFxcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCk7XFxcXG4gICAgfSxcXFxcbiAgICByZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcXFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykuc2V0U3RhcnRSZXF1ZXN0RnVuYyhyZXF1ZXN0KTtcXFxcbiAgICB9LFxcXFxuICAgIHBvc3RSZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcXFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0UmVxdWVzdCk7XFxcXG4gICAgfSxcXFxcbiAgICBmZXRjaENvb2tpZSh1cmwsIG9wdGlvbnMpIHtcXFxcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMoZmV0Y2hDb29raWUpO1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuJC5leHBvcnRzID0gaHR0cFJlcXVlc3Q7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5aS45YWL5YiX6KGoXFxcIixcXFwicGF0aFxcXCI6XFxcInF1YXJrTGlzdFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmxldCBkID0gW107XFxcXG5cXFxcbmFkZExpc3RlbmVyKFxcXFxcXFwib25DbG9zZVxcXFxcXFwiLCAoKSA9PiBjbGVhck15VmFyKFxcXFxcXFwicGxheVVybENhY2hlXFxcXFxcXCIpKTtcXFxcbmFkZExpc3RlbmVyKFxcXFxcXFwib25SZWZyZXNoXFxcXFxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcXFxcXCJwbGF5VXJsQ2FjaGVcXFxcXFxcIikpO1xcXFxubGV0IHNvVXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXFxcXFwicmVhbHVybFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSk7XFxcXG5sZXQgZnJvbURyaXZlID0gTVlfUEFSQU1TLmZyb21Ecml2ZSB8fCBcXFxcXFxcInF1YXJrXFxcXFxcXCI7XFxcXG5cXFxcbmlmIChzb1VybC5pbmNsdWRlcyhcXFxcXFxcImRyaXZlLnVjLmNuXFxcXFxcXCIpKSB7XFxcXG4gICAgZnJvbURyaXZlID0gXFxcXFxcXCJ1Y1xcXFxcXFwiO1xcXFxufVxcXFxubGV0IHJlYWx1cmwgPSBzb1VybC5zcGxpdChcXFxcXFxcIj9cXFxcXFxcIilbMF07XFxcXG5sZXQgdXJsRGF0YSA9IHJlYWx1cmwuc3BsaXQoXFxcXFxcXCIvXFxcXFxcXCIpO1xcXFxuXFxcXG5sZXQgc2hhcmVJZCA9IE1ZX1BBUkFNUy5zaGFyZUlkIHx8IHVybERhdGFbNF0ucmVwbGFjZShcXFxcXFxcIiNcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG5sZXQgc2hhcmVQd2QgPSBnZXRQYXJhbShcXFxcXFxcInNoYXJlUHdkXFxcXFxcXCIsIE1ZX1BBUkFNUy5zaGFyZVB3ZCB8fCBnZXRQYXJhbShcXFxcXFxcInBhc3Njb2RlXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIsIHNvVXJsKSB8fCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbmxldCBzaGFyZVRva2VuID0gZ2V0UGFyYW0oXFxcXFxcXCJzaGFyZVRva2VuXFxcXFxcXCIsIE1ZX1BBUkFNUy5zaGFyZVRva2VuIHx8IFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuXFxcXG5sZXQgZmlsZUlkID0gTVlfUEFSQU1TLmZpbGVJZDtcXFxcblxcXFxubGV0IHNvcnQgPSB7XFxcXG4gICAgXFxcXFxcXCLlkI3np7DmraPluo9cXFxcXFxcIjogXFxcXFxcXCJmaWxlX25hbWU6YXNjXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCLlkI3np7DlgJLluo9cXFxcXFxcIjogXFxcXFxcXCJmaWxlX25hbWU6ZGVzY1xcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwi5pe26Ze05q2j5bqPXFxcXFxcXCI6IFxcXFxcXFwidXBkYXRlZF9hdDphc2NcXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcIuaXtumXtOWAkuW6j1xcXFxcXFwiOiBcXFxcXFxcInVwZGF0ZWRfYXQ6ZGVzY1xcXFxcXFwiXFxcXG59O1xcXFxubGV0IHN0eWxlcyA9IFtcXFxcXFxcInRleHRfMVxcXFxcXFwiLCBcXFxcXFxcImF2YXRhclxcXFxcXFwiXTtcXFxcblxcXFxubGV0IHNvcnRWYWx1ZSA9IHNvcnRbZ2V0SXRlbShcXFxcXFxcInNvcnRLZXlcXFxcXFxcIiwgXFxcXFxcXCLlkI3np7DmraPluo9cXFxcXFxcIildO1xcXFxubGV0IHN0eWxlID0gZ2V0SXRlbShcXFxcXFxcInN0eWxlXFxcXFxcXCIsIHN0eWxlc1swXSk7XFxcXG5pZiAoTVlfUEFHRSA9PSAxKSB7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGZyb21Ecml2ZSA9PT0gXFxcXFxcXCJ1Y1xcXFxcXFwiID8gXFxcXFxcXCJVQ+e9keebmFxcXFxcXFwiIDogXFxcXFxcXCLlpLjlhYvnvZHnm5hcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl81XFxcXFxcXCIsXFxcXG4gICAgICAgIHBpY191cmw6IGZyb21Ecml2ZSA9PT0gXFxcXFxcXCJ1Y1xcXFxcXFwiID8gXFxcXFxcXCJodHRwOi8vMTIzLjU2LjEwNS4xNDUvdHViaWFvL2VyZGkvMTQucG5nXFxcXFxcXCIgOiBcXFxcXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fa3Vha2VcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwi54K55Ye75Yqf6IO95oyJ6ZKuPT7kuKrkurrotKblj7fnrqHnkIbljbPlj6/nmbvlvZXotKblj7dcXFxcXFxcIikuY29uZmlybSgoKSA9PiB7fSksXFxcXG4gICAgfSk7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IHN0eWxlLFxcXFxuICAgICAgICB1cmw6ICQoc3R5bGVzLCAxLCAn6K+36YCJ5oupJykuc2VsZWN0KCgpID0+IHtcXFxcbiAgICAgICAgICAgIHNldEl0ZW0oJ3N0eWxlJywgaW5wdXQpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L2ltZy9hbGlfaWNvbi5zdmdcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl81XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogZ2V0SXRlbShcXFxcXFxcInNvcnRLZXlcXFxcXFxcIiwgXFxcXFxcXCLlkI3np7DmraPluo9cXFxcXFxcIiksXFxcXG4gICAgICAgIHVybDogJChPYmplY3Qua2V5cyhzb3J0KSwgMSwgJ+ivt+mAieaLqScpLnNlbGVjdCgoKSA9PiB7XFxcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwic29ydEtleVxcXFxcXFwiLCBpbnB1dClcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS9pbWcvYWxpX3NvcnQuc3ZnXFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fNVxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGdldEl0ZW0oXFxcXFxcXCJxdWFya19wbGF5TW9kZVxcXFxcXFwiLCBcXFxcXFxcIui9rOeggVxcXFxcXFwiKSxcXFxcbiAgICAgICAgdXJsOiAkKFtcXFxcXFxcIui9rOeggVxcXFxcXFwiLCBcXFxcXFxcIuWOn+eUu1xcXFxcXFwiLCBcXFxcXFxcIuaZrumAmuWOn+eUu1xcXFxcXFwiXSwgMiwgXFxcXFxcXCLmkq3mlL7mqKHlvI9cXFxcXFxcIikuc2VsZWN0KCgpID0+IHtcXFxcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJxdWFya19wbGF5TW9kZVxcXFxcXFwiLCBpbnB1dCk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liIfmjaLmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fNVxcXFxcXFwiLFxcXFxuICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS9pbWcvYWxpX3BsYXkuc3ZnXFxcXFxcXCIsXFxcXG4gICAgfSk7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Yqf6IO9XFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChbXFxcXFxcXCLot7PovazlpLjlhYtBUFBcXFxcXFxcIiwgXFxcXFxcXCLlpI3liLbliIbkuqvpk77mjqVcXFxcXFxcIiwgXFxcXFxcXCLkuKrkurrotKblj7fnrqHnkIZcXFxcXFxcIiwgXFxcXFxcXCLljp/nlLvkuIvovb3nur/nqItcXFxcXFxcIl0sIDIpLnNlbGVjdCgoc2hhcmVJZCwgc2hhcmVQd2QsIGZyb21Ecml2ZSkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFxcXFxcIui3s+i9rOWkuOWFi0FQUFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwicWtsaW5rOi8vd3d3LnVjLmNuL2IyMGI4NGZkNzM1YThkZDNmNzU0MTEyOWJhY2M0ZTlhP2FjdGlvbj1vcGVuX3VybCZ1cmw9aHR0cHM6Ly9wYW4ucXVhcmsuY24vcy9cXFxcXFxcIiArIHNoYXJlSWQ7XFxcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIuS4quS6uui0puWPt+euoeeQhlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFxcXFxcImFjY291bnRcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIuWOn+eUu+S4i+i9vee6v+eoi1xcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoZ2V0SXRlbShcXFxcXFxcInNwZWVkVGhyZWFkXFxcXFxcXCIsIFxcXFxcXFwiMTBcXFxcXFxcIiksIFxcXFxcXFwi6K+36L6T5YWlMy0zMuS5i+mXtOeahOaVtOaVsFxcXFxcXFwiKS5pbnB1dCgoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBzcGVlZFRocmVhZCA9IHBhcnNlSW50KGlucHV0KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWVkVGhyZWFkIDwgMyB8fCBzcGVlZFRocmVhZCA+IDMyKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+iuvue9ruS4jeWQiOazlVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJzcGVlZFRocmVhZFxcXFxcXFwiLCBTdHJpbmcoc3BlZWRUaHJlYWQpKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwi5aSN5Yi25YiG5Lqr6ZO+5o6lXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICBpZiAoZnJvbURyaXZlID09PSBcXFxcXFxcInVjXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiY29weTovL1xcXFxcXFwiICsgYnVpbGRVcmwoXFxcXFxcXCJodHRwczovL2RyaXZlLnVjLmNuL3MvXFxcXFxcXCIgKyBzaGFyZUlkICsgXFxcXFxcXCI/cHVibGljPTEjL2xpc3Qvc2hhcmVcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImNvcHk6Ly9cXFxcXFxcIiArIGJ1aWxkVXJsKFxcXFxcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY24vcy9cXFxcXFxcIiArIHNoYXJlSWQsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3Njb2RlOiBzaGFyZVB3ZFxcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0sIHNoYXJlSWQsIHNoYXJlUHdkLCBmcm9tRHJpdmUpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uXzVcXFxcXFxcIixcXFxcbiAgICAgICAgcGljX3VybDogXFxcXFxcXCJodHRwOi8vMTIzLjU2LjEwNS4xNDUvaW1nL2FsaV9maWxlaW50by5zdmdcXFxcXFxcIixcXFxcbiAgICB9KTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogJ2xpbmVfYmxhbmsnXFxcXG4gICAgfSk7XFxcXG59XFxcXG5cXFxcblxcXFxubGV0IFF1YXJrU2hhcmVBcGkgPSAkLnJlcXVpcmUoXFxcXFxcXCJRdWFya1NoYXJlQXBpXFxcXFxcXCIsIGZyb21Ecml2ZSk7XFxcXG5sZXQgcXVhcmtTaGFyZUFwaSA9IG5ldyBRdWFya1NoYXJlQXBpKHNoYXJlSWQsIHNoYXJlUHdkKS5zZXRUb2tlbihzaGFyZVRva2VuKS5zZXRSZWZyZXNoKChzaGFyZVRva2VuKSA9PiB7XFxcXG4gICAgTVlfUEFSQU1TLnNoYXJlVG9rZW4gPSBzaGFyZVRva2VuO1xcXFxuICAgIHNldFBhZ2VQYXJhbXMoTVlfUEFSQU1TKTtcXFxcbn0pO1xcXFxuXFxcXG5mdW5jdGlvbiBmb3JtYXRTaXplKHNpemUpIHtcXFxcbiAgICBpZiAoIXNpemUpIHtcXFxcbiAgICAgICAgcmV0dXJuICcnO1xcXFxuICAgIH1cXFxcbiAgICBjb25zdCB1bml0cyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQicsICdQQicsICdFQicsICdaQicsICdZQiddO1xcXFxuICAgIGxldCBpID0gMDtcXFxcbiAgICB3aGlsZSAoc2l6ZSA+PSAxMDI0KSB7XFxcXG4gICAgICAgIHNpemUgLz0gMTAyNDtcXFxcbiAgICAgICAgaSsrO1xcXFxuICAgIH1cXFxcbiAgICBzaXplID0gaSA/IE51bWJlcihzaXplLnRvRml4ZWQoMikpIDogc2l6ZTtcXFxcbiAgICByZXR1cm4gYCR7c2l6ZX0gJHt1bml0c1tpXX1gO1xcXFxufVxcXFxuXFxcXG5sZXQgc3ViRXh0cyA9IFtcXFxcXFxcInZ0dFxcXFxcXFwiLCBcXFxcXFxcInNydFxcXFxcXFwiLCBcXFxcXFxcImFzc1xcXFxcXFwiXTtcXFxcbmxldCB0aXRsZUhlYWQgPSB7XFxcXG4gICAgdmlkZW86IFxcXFxcXFwi8J+OrFxcXFxcXFwiLFxcXFxuICAgIGF1ZGlvOiBcXFxcXFxcIvCfjrVcXFxcXFxcIixcXFxcbiAgICBkb2M6IFxcXFxcXFwi8J+TkVxcXFxcXFwiLFxcXFxuICAgIGltYWdlOiBcXFxcXFxcIvCflrxcXFxcXFxcIixcXFxcbiAgICBhcmNoaXZlOiBcXFxcXFxcIvCfk6ZcXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImRlZmF1bHRcXFxcXFxcIjogXFxcXFxcXCLinZNcXFxcXFxcIlxcXFxufTtcXFxcblxcXFxuZnVuY3Rpb24gZ2V0SGVhZCh0eXBlLCBleHQpIHtcXFxcbiAgICBsZXQgaGVhZCA9IHRpdGxlSGVhZFt0eXBlXTtcXFxcbiAgICAvKmlmIChzdWJFeHRzLmluY2x1ZGVzKGV4dCkpIHtcXFxcbiAgICAgICAgaGVhZCA9IFxcXFxcXFwi8J+VuFxcXFxcXFwiO1xcXFxuICAgIH0qL1xcXFxuICAgIHJldHVybiBoZWFkIHx8IFxcXFxcXFwi4p2TXFxcXFxcXCI7XFxcXG59XFxcXG50cnkge1xcXFxuICAgIHZhciByZXMgPSBxdWFya1NoYXJlQXBpLmdldExpc3RGaWxlKGZpbGVJZCwgTVlfUEFHRSwgc29ydFZhbHVlKTtcXFxcbiAgICAvL+iuvue9ruagh+mimFxcXFxuICAgIHZhciBsaXN0ID0gcmVzLmRhdGEubGlzdCB8fCBbXTtcXFxcbiAgICBpZiAoc2hhcmVJZCAhPT0gXFxcXFxcXCJzZWxmXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgc2V0UGFnZVRpdGxlKHJlcy5kYXRhLnNoYXJlLnRpdGxlKTtcXFxcblxcXFxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDAgJiYgIWZpbGVJZCkge1xcXFxuICAgICAgICAgICAgcmVzID0gcXVhcmtTaGFyZUFwaS5nZXRMaXN0RmlsZShyZXMuZGF0YS5zaGFyZS5maXJzdF9maWQsIE1ZX1BBR0UsIHNvcnRWYWx1ZSk7XFxcXG4gICAgICAgICAgICBzZXRQYWdlVGl0bGUocmVzLmRhdGEuc2hhcmUudGl0bGUpO1xcXFxuICAgICAgICAgICAgdmFyIGxpc3QgPSByZXMuZGF0YS5saXN0IHx8IFtdO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIGxldCBuY29va2llPXF1YXJrU2hhcmVBcGkuZ2V0UGljQ29va2llKCk7XFxcXG4gICAgbG9nKG5jb29raWUpXFxcXG4gICAgbGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xcXFxuICAgICAgICAvL+WIpOaWreaYr+WQpuaWh+S7tuWkuVxcXFxuICAgICAgICBpZiAoaXRlbS5kaXIpIHtcXFxcbiAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi8J+TglxcXFxcXFwiICsgaXRlbS5maWxlX25hbWUsXFxcXG4gICAgICAgICAgICAgICAgZGVzYzogJC5kYXRlRm9ybWF0KGl0ZW0udXBkYXRlZF9hdCwgJ3l5eXktTU0tZGQnKSArICcgICcgKyBpdGVtLmluY2x1ZGVfaXRlbXMgKyAn6aG5ICAnLFxcXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L3R1Ymlhby9tZXNzeS8yNy5zdmdcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3F1YXJrTGlzdD9wYWdlPWZ5cGFnZVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBzdHlsZSxcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZUlkLFxcXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVUb2tlbjogcXVhcmtTaGFyZUFwaS5nZXRUb2tlbigpLFxcXFxuICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IGl0ZW0uZmlkLFxcXFxuICAgICAgICAgICAgICAgICAgICBpbmhlcml0VGl0bGU6IGZhbHNlLFxcXFxuICAgICAgICAgICAgICAgICAgICBmcm9tRHJpdmVcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGdldEhlYWQoaXRlbS5vYmpfY2F0ZWdvcnkpICsgaXRlbS5maWxlX25hbWUsXFxcXG4gICAgICAgICAgICAgICAgZGVzYzogJC5kYXRlRm9ybWF0KGl0ZW0udXBkYXRlZF9hdCwgJ3l5eXktTU0tZGQnKSArICcgICcgKyBmb3JtYXRTaXplKGl0ZW0uc2l6ZSksXFxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogJChpdGVtLnRodW1ibmFpbCwge1xcXFxuICAgICAgICAgICAgICAgICAgICBjb29raWU6IG5jb29raWVcXFxcbiAgICAgICAgICAgICAgICB9KS5pbWFnZSgpLFxcXFxuICAgICAgICAgICAgICAgIHVybDogJCgpLmxhenlSdWxlKChmaWQsIGZpZF90b2tlbiwgcHdkX2lkLCBzdG9rZW4sIGNhdGVnb3J5LCBmcm9tRHJpdmUpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlVcmxDYWNoZSA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXFxcXFwicGxheVVybENhY2hlXFxcXFxcXCIsIHt9KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXlVcmxDYWNoZVtmaWRdKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheVVybENhY2hlW2ZpZF07XFxcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gJC5yZXF1aXJlKFxcXFxcXFwicGxheVxcXFxcXFwiLCBmcm9tRHJpdmUpLmdldFBsYXlVcmwoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5VXJsQ2FjaGVbZmlkXSA9IHVybDtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXFxcXFwicGxheVVybENhY2hlXFxcXFxcXCIsIHBsYXlVcmxDYWNoZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJsO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSwgaXRlbS5maWQsIGl0ZW0uc2hhcmVfZmlkX3Rva2VuLCBzaGFyZUlkLCBxdWFya1NoYXJlQXBpLmdldFRva2VuKCksIGl0ZW0ub2JqX2NhdGVnb3J5LCBmcm9tRHJpdmUpLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBzdHlsZSxcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZDogaXRlbS5maWQsXFxcXG4gICAgICAgICAgICAgICAgICAgIC8vaW5oZXJpdFRpdGxlOiBmYWxzZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgY2xzOiAncGxheWxpc3QgJyArIGl0ZW0ub2JqX2NhdGVnb3J5XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgfVxcXFxuXFxcXG4gICAgfSk7XFxcXG59IGNhdGNoIChlKSB7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGUubWVzc2FnZSxcXFxcbiAgICAgICAgdXJsOiAnaGlrZXI6Ly9lbXB0eScsXFxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGlmIChlLm1lc3NhZ2UuaW5jbHVkZXMoXFxcXFxcXCLmj5Dlj5bnoIFcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIui+k+WFpeaPkOWPlueggVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiAkKCkuaW5wdXQoKE1ZX1BBUkFNUykgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHNldFBhZ2VQYXJhbXMoT2JqZWN0LmFzc2lnbih7fSwgTVlfUEFSQU1TLCB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkOiBpbnB1dFxcXFxuICAgICAgICAgICAgICAgIH0pKTtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgfSwgTVlfUEFSQU1TKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG59XFxcXG5zZXRSZXN1bHQoZCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwicGxheVxcXCIsXFxcInBhdGhcXFwiOlxcXCJwbGF5XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IGZyb21Ecml2ZSA9IG1vZHVsZS5pbXBvcnRQYXJhbTtcXFxcbmxldCBwciwgaG9tZVVybCwgYXBpLCBjb29raWU7XFxcXG5pZiAoZnJvbURyaXZlID09PSBcXFxcXFxcInVjXFxcXFxcXCIpIHtcXFxcbiAgICBob21lVXJsID0gXFxcXFxcXCJodHRwczovL2RyaXZlLnVjLmNuL1xcXFxcXFwiO1xcXFxuICAgIHByID0gXFxcXFxcXCJVQ0Jyb3dzZXJcXFxcXFxcIjtcXFxcbiAgICBhcGkgPSBcXFxcXFxcImh0dHBzOi8vcGMtYXBpLnVjLmNuXFxcXFxcXCI7XFxcXG4gICAgY29va2llID0gZ2V0SXRlbShcXFxcXFxcInVjQ29va2llXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxufSBlbHNlIHtcXFxcbiAgICBob21lVXJsID0gXFxcXFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuL1xcXFxcXFwiO1xcXFxuICAgIHByID0gXFxcXFxcXCJ1Y3Byb1xcXFxcXFwiO1xcXFxuICAgIGFwaSA9IFxcXFxcXFwiaHR0cHM6Ly9kcml2ZS5xdWFyay5jblxcXFxcXFwiO1xcXFxuICAgIGNvb2tpZSA9IGdldEl0ZW0oXFxcXFxcXCJxdWFya0Nvb2tpZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbn1cXFxcblxcXFxubGV0IENvb2tpZU1hbmFnZT0kLnJlcXVpcmUoXFxcXFxcXCJDb29raWVNYW5hZ2VcXFxcXFxcIik7XFxcXG5cXFxcbmNvbnN0IGNvb2tpZU1hbmFnZSA9IG5ldyBDb29raWVNYW5hZ2UoY29va2llKTtcXFxcbmxldCBodHRwUmVxdWVzdCA9ICQucmVxdWlyZShcXFxcXFxcImh0dHBSZXF1ZXN0XFxcXFxcXCIpO1xcXFxuXFxcXG5mdW5jdGlvbiB3YWl0U2xlZXAodGltZSkge1xcXFxuICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAodGltZSB8fCA2MDApO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiByZXF1ZXN0SHR0cCh1cmwpIHtcXFxcbiAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KHVybClcXFxcbiAgICAgICAgLnN1Y2Nlc3MoKGJvZHksIHJlcykgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKGJvZHkuc3RhdHVzICE9PSAyMDApIHtcXFxcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYm9keS5tZXNzYWdlKTtcXFxcbiAgICAgICAgICAgIH1cXFxcblxcXFxuICAgICAgICAgICAgY29va2llTWFuYWdlLmFkZChyZXMuaGVhZGVyc1tcXFxcXFxcInNldC1jb29raWVcXFxcXFxcIl0pO1xcXFxuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XFxcXG4gICAgICAgIH0pXFxcXG4gICAgICAgIC5lcnJvclR5cGUoKGVyciwgcmVzKSA9PiB7XFxcXG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKEpTT04ucGFyc2UocmVzLmJvZHkpLm1lc3NhZ2UpO1xcXFxuICAgICAgICB9KVxcXFxuICAgICAgICAuYm9keVRvU3RyaW5nKHRydWUpXFxcXG4gICAgICAgIC5oZWFkZXJzKHtcXFxcbiAgICAgICAgICAgIGNvb2tpZTogY29va2llTWFuYWdlLmdldCgpLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJVc2VyLUFnZW50XFxcXFxcXCI6IFxcXFxcXFwiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgcXVhcmstY2xvdWQtZHJpdmUvMi41LjIwIENocm9tZS8xMDAuMC40ODk2LjE2MCBFbGVjdHJvbi8xOC4zLjUuNC1iNDc4NDkxMTAwIFNhZmFyaS81MzcuMzYgQ2hhbm5lbC9wY2trX290aGVyX2NoXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBcXFxcXFxcInJlZmVyZXJcXFxcXFxcIjogaG9tZVVybFxcXFxuICAgICAgICB9KTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0RHJpdmVJbmZvKCkge1xcXFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChhcGkgKyBcXFxcXFxcIi8xL2Nsb3VkZHJpdmUvc2hhcmUvc2hhcmVwYWdlL2Rpcj9wcj1cXFxcXFxcIiArIHByICsgXFxcXFxcXCImZnI9cGMmYXZlcj0xXFxcXFxcXCIpLnN0YXJ0KHRydWUpO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBjcmVhdGVTYXZlVGFzayhmaWQsIGZpZF90b2tlbiwgcHdkX2lkLCBzdG9rZW4pIHtcXFxcbiAgICBsZXQgZHJpdmVJbmZvID0gZ2V0RHJpdmVJbmZvKCk7XFxcXG4gICAgcmV0dXJuIHJlcXVlc3RIdHRwKGFwaSArIFxcXFxcXFwiLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2Uvc2F2ZT9wcj1cXFxcXFxcIiArIHByICsgXFxcXFxcXCImZnI9cGNcXFxcXFxcIikuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0KS5ib2R5KHtcXFxcbiAgICAgICAgXFxcXFxcXCJmaWRfbGlzdFxcXFxcXFwiOiBbXFxcXG4gICAgICAgICAgICBmaWRcXFxcbiAgICAgICAgXSxcXFxcbiAgICAgICAgXFxcXFxcXCJmaWRfdG9rZW5fbGlzdFxcXFxcXFwiOiBbXFxcXG4gICAgICAgICAgICBmaWRfdG9rZW5cXFxcbiAgICAgICAgXSxcXFxcbiAgICAgICAgXFxcXFxcXCJ0b19wZGlyX2ZpZFxcXFxcXFwiOiBkcml2ZUluZm8uZGF0YS5kaXIuZmlkLFxcXFxuICAgICAgICBcXFxcXFxcInB3ZF9pZFxcXFxcXFwiOiBwd2RfaWQsXFxcXG4gICAgICAgIFxcXFxcXFwic3Rva2VuXFxcXFxcXCI6IHN0b2tlbixcXFxcbiAgICAgICAgXFxcXFxcXCJwZGlyX2ZpZFxcXFxcXFwiOiBkcml2ZUluZm8uZGF0YS5kaXIucGRpcl9maWRcXFxcbiAgICB9KS5zdGFydCh0cnVlKTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gY3JlYXRlRGVsZXRlVGFzayhmaWQpIHtcXFxcbiAgICBsZXQgZHJpdmVJbmZvID0gZ2V0RHJpdmVJbmZvKCk7XFxcXG4gICAgcmV0dXJuIHJlcXVlc3RIdHRwKGFwaSArIFxcXFxcXFwiLzEvY2xvdWRkcml2ZS9maWxlL2RlbGV0ZT9wcj1cXFxcXFxcIiArIHByICsgXFxcXFxcXCImZnI9cGNcXFxcXFxcIikuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0KS5ib2R5KHtcXFxcbiAgICAgICAgXFxcXFxcXCJhY3Rpb25fdHlwZVxcXFxcXFwiOiAyLFxcXFxuICAgICAgICBcXFxcXFxcImZpbGVsaXN0XFxcXFxcXCI6IFtcXFxcbiAgICAgICAgICAgIGZpZFxcXFxuICAgICAgICBdLFxcXFxuICAgICAgICBcXFxcXFxcImV4Y2x1ZGVfZmlkc1xcXFxcXFwiOiBbXVxcXFxuICAgIH0pLnN0YXJ0KHRydWUpO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiB0YXNrKHRhc2tfaWQsIHJldHJ5X2luZGV4KSB7XFxcXG4gICAgcmV0dXJuIHJlcXVlc3RIdHRwKGFwaSArIFxcXFxcXFwiLzEvY2xvdWRkcml2ZS90YXNrXFxcXFxcXCIpLmJ1aWxkVXJsKHtcXFxcbiAgICAgICAgcHI6IHByLFxcXFxuICAgICAgICBmcjogXFxcXFxcXCJwY1xcXFxcXFwiLFxcXFxuICAgICAgICB0YXNrX2lkOiB0YXNrX2lkLFxcXFxuICAgICAgICByZXRyeV9pbmRleDogcmV0cnlfaW5kZXhcXFxcbiAgICB9KS5zdGFydCh0cnVlKTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gcXVlcnlUYXNrKHRhc2tfaWQpIHtcXFxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDk7IGkrKykge1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IHJlcyA9IHRhc2sodGFza19pZCwgaSArIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgaWYgKHJlcy5kYXRhLnN0YXR1cyA9PT0gMikge1xcXFxuICAgICAgICAgICAgICAgIHdhaXRTbGVlcCgxMDAwKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmRhdGEuc2F2ZV9hcy5zYXZlX2FzX3RvcF9maWRzWzBdO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgd2FpdFNsZWVwKDMwMCAqIChpICsgMSkpO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gdm9pZCgwKTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gcXVlcnlUYXNrU3RhdHVzKHRhc2tfaWQpIHtcXFxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IHJlcyA9IHRhc2sodGFza19pZCwgaSArIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgaWYgKHJlcy5kYXRhLnN0YXR1cyA9PT0gMikge1xcXFxuICAgICAgICAgICAgICAgIHdhaXRTbGVlcCgxMDAwKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHdhaXRTbGVlcCgzMDApO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gZmFsc2U7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdldFByZXZpZXdWaWRlbyhmaWQpIHtcXFxcbiAgICByZXR1cm4gcmVxdWVzdEh0dHAoYXBpICsgXFxcXFxcXCIvMS9jbG91ZGRyaXZlL2ZpbGUvdjIvcGxheT9wcj1cXFxcXFxcIiArIHByICsgXFxcXFxcXCImZnI9cGNcXFxcXFxcIikuYm9keSh7XFxcXG4gICAgICAgIFxcXFxcXFwiZmlkXFxcXFxcXCI6IGZpZCxcXFxcbiAgICAgICAgXFxcXFxcXCJyZXNvbHV0aW9uc1xcXFxcXFwiOiBcXFxcXFxcIm5vcm1hbCxsb3csaGlnaCxzdXBlciwyayw0a1xcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInN1cHBvcnRzXFxcXFxcXCI6IFxcXFxcXFwiZm1wNCxtM3U4XFxcXFxcXCJcXFxcbiAgICB9KS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3QpLnN0YXJ0KHRydWUpO1xcXFxufVxcXFxuXFxcXG5cXFxcblxcXFxuZnVuY3Rpb24gZ2V0RG93bmxvYWRVcmwoZmlkKSB7XFxcXG4gICAgcmV0dXJuIHJlcXVlc3RIdHRwKGFwaSArIFxcXFxcXFwiLzEvY2xvdWRkcml2ZS9maWxlL2Rvd25sb2FkP3ByPVxcXFxcXFwiICsgcHIgKyBcXFxcXFxcIiZmcj1wY1xcXFxcXFwiKS5ib2R5KHtcXFxcbiAgICAgICAgXFxcXFxcXCJmaWRzXFxcXFxcXCI6IFtmaWRdXFxcXG4gICAgfSkuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0KS5zdGFydCh0cnVlKTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0UGxheVVybChmaWQsIGZpZF90b2tlbiwgcHdkX2lkLCBzdG9rZW4sIGNhdGVnb3J5KSB7XFxcXG4gICAgbGV0IGlzU2hhcmUgPSBwd2RfaWQhPT1cXFxcXFxcInNlbGZcXFxcXFxcIjtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBpZiAoIWNvb2tpZSkgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/or7fnmbvlvZXotKblj7dcXFxcXFxcIjtcXFxcbiAgICAgICAgbGV0IGFzZmlkID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgaWYgKGlzU2hhcmUpIHtcXFxcbiAgICAgICAgICAgIGxldCB0YXNrSWQgPSBjcmVhdGVTYXZlVGFzayhmaWQsIGZpZF90b2tlbiwgcHdkX2lkLCBzdG9rZW4pLmRhdGEudGFza19pZDtcXFxcbiAgICAgICAgICAgIGFzZmlkID0gcXVlcnlUYXNrKHRhc2tJZCk7XFxcXG4gICAgICAgICAgICBpZiAoIWFzZmlkKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/ojrflj5blpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGFzZmlkID0gZmlkO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBwbGF5Q29va2llID0gY29va2llTWFuYWdlLmdldCgpO1xcXFxuICAgICAgICAvKmlmIChwciA9PT0gXFxcXFxcXCJVQ0Jyb3dzZXJcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcGxheUNvb2tpZSA9IGNvb2tpZTtcXFxcbiAgICAgICAgfSovXFxcXG4gICAgICAgIGxldCBwbGF5SGVhZGVyID0ge1xcXFxuICAgICAgICAgICAgUmVmZXJlcjogaG9tZVVybCxcXFxcbiAgICAgICAgICAgIGNvb2tpZTogcGxheUNvb2tpZSxcXFxcbiAgICAgICAgICAgIFxcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOiBcXFxcXFxcIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS8xMDAuMC40ODk2LjU4IFVDQnJvd3Nlci8xNi41LjguMTMwOSBNb2JpbGUgU2FmYXJpLzUzNy4zNlxcXFxcXFwiXFxcXG4gICAgICAgIH07XFxcXG4gICAgICAgIGxldCBwbGF5SGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHBsYXlIZWFkZXIsIHtcXFxcbiAgICAgICAgICAgIFxcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOiBcXFxcXFxcIkxvZ1N0YXRpc3RpY1xcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gXFxcXFxcXCJ2aWRlb1xcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBsZXQgcGxheU1vZGUgPSBnZXRJdGVtKFxcXFxcXFwicXVhcmtfcGxheU1vZGVcXFxcXFxcIiwgXFxcXFxcXCLovaznoIFcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBpZiAocGxheU1vZGUgPT09IFxcXFxcXFwi6L2s56CBXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdmlkZW9SZXMgPSBnZXRQcmV2aWV3VmlkZW8oYXNmaWQpO1xcXFxuXFxcXG4gICAgICAgICAgICAgICAgbGV0IHZpZGVvTGlzdCA9IHZpZGVvUmVzLmRhdGEudmlkZW9fbGlzdDtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcGxheUxpc3QgPSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIG5hbWVzOiBbXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsczogW10sXFxcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IFtdXFxcXG4gICAgICAgICAgICAgICAgfTtcXFxcbiAgICAgICAgICAgICAgICB2aWRlb0xpc3QuZmlsdGVyKHYgPT4gdi5hY2Nlc3NhYmxlKS5mb3JFYWNoKHYgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBwbGF5TGlzdC5uYW1lcy5wdXNoKHYucmVzb2x1dGlvbik7XFxcXG4gICAgICAgICAgICAgICAgICAgIHBsYXlMaXN0LnVybHMucHVzaCh2LnZpZGVvX2luZm8udXJsICsgXFxcXFxcXCIjaXNWaWRlbz10cnVlI1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcGxheUxpc3QuaGVhZGVycy5wdXNoKHBsYXlIZWFkZXJzKTtcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICBpc1NoYXJlICYmIGNyZWF0ZURlbGV0ZVRhc2soYXNmaWQpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwbGF5TGlzdCk7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuXFxcXG4gICAgICAgICAgICAgICAgbGV0IHBsYXlVcmwgPSBnZXREb3dubG9hZFVybChhc2ZpZCkuZGF0YVswXS5kb3dubG9hZF91cmw7XFxcXG4gICAgICAgICAgICAgICAgcGxheUhlYWRlcnMuY29va2llID0gY29va2llTWFuYWdlLmdldCgpO1xcXFxuICAgICAgICAgICAgICAgIGxldCBwbGF5TGlzdCA9IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbmFtZXM6IFtwbGF5TW9kZV0sXFxcXG4gICAgICAgICAgICAgICAgICAgIHVybHM6IFtwbGF5VXJsICsgXFxcXFxcXCIjaXNWaWRlbz10cnVlI1xcXFxcXFwiICsgKHBsYXlNb2RlID09PSBcXFxcXFxcIuWOn+eUu1xcXFxcXFwiID8gXFxcXFxcXCIjZmFzdFBsYXlNb2RlIyN0aHJlYWRzPVxcXFxcXFwiICsgZ2V0SXRlbShcXFxcXFxcInNwZWVkVGhyZWFkXFxcXFxcXCIsIFxcXFxcXFwiMTBcXFxcXFxcIikgKyBcXFxcXFxcIiNcXFxcXFxcIiA6IFxcXFxcXFwiXFxcXFxcXCIpXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogW3BsYXlIZWFkZXJzXVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBpc1NoYXJlICYmY3JlYXRlRGVsZXRlVGFzayhhc2ZpZCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlMaXN0KTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGxldCBwbGF5VXJsID0gZ2V0RG93bmxvYWRVcmwoYXNmaWQpLmRhdGFbMF0uZG93bmxvYWRfdXJsO1xcXFxuXFxcXG4gICAgICAgICAgICBpc1NoYXJlICYmIGNyZWF0ZURlbGV0ZVRhc2soYXNmaWQpO1xcXFxuICAgICAgICAgICAgaWYgKGNhdGVnb3J5ID09PSAnYXVkaW8nKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHBsYXlMaXN0ID0ge1xcXFxuICAgICAgICAgICAgICAgICAgICBuYW1lczogW1xcXFxcXFwi6Z+z6aKRXFxcXFxcXCJdLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmxzOiBbcGxheVVybCArIFxcXFxcXFwiI2lzTXVzaWM9dHJ1ZSNcXFxcXFxcIl0sXFxcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IFtwbGF5SGVhZGVyXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgbHlyaWM6IFxcXFxcXFwiXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlMaXN0KTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2F0ZWdvcnkgPT09ICdpbWFnZScpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJChwbGF5VXJsLCBwbGF5SGVhZGVyKS5pbWFnZSgpO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICBwbGF5SGVhZGVyID0gT2JqZWN0LmtleXMocGxheUhlYWRlcikubWFwKGtleSA9PiBrZXkgKyBcXFxcXFxcIkBcXFxcXFxcIiArIFN0cmluZyhwbGF5SGVhZGVyW2tleV0pLnJlcGxhY2UoLzsvZywgXFxcXFxcXCLvvJvvvJtcXFxcXFxcIikpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImRvd25sb2FkOi8vXFxcXFxcXCIgKyBwbGF5VXJsICsgXFxcXFxcXCI7e1xcXFxcXFwiICsgcGxheUhlYWRlci5qb2luKFxcXFxcXFwiJiZcXFxcXFxcIikgKyBcXFxcXFxcIn1cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgaWYgKGUubWVzc2FnZS5pbmNsdWRlcyhcXFxcXFxcInJlcXVpcmUgbG9naW5cXFxcXFxcIil8fGUubWVzc2FnZS5pbmNsdWRlcyhcXFxcXFxcInRva2VuXFxcXFxcXCIpfHxlLm1lc3NhZ2UuaW5jbHVkZXMoXFxcXFxcXCJpbnZhbGlkXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICB0b2FzdChcXFxcXFxcIuacqueZu+W9leaIlueZu+W9lei/h+acn++8jOivt+mHjeaWsOeZu+W9lVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/ZnJvbT1cXFxcXFxcIiArIGZyb21Ecml2ZTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgZS50b1N0cmluZygpO1xcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxuJC5leHBvcnRzID0ge1xcXFxuICAgIGdldFBsYXlVcmxcXFxcbn07XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi55m75b2V6LSm5Y+3XFxcIixcXFwicGF0aFxcXCI6XFxcImxvZ2luXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IGQgPSBbXTtcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIueZu+W9lei0puWPt1xcXFxcXFwiKTtcXFxcbmFkZExpc3RlbmVyKFxcXFxcXFwib25DbG9zZVxcXFxcXFwiLCAoKSA9PiBjbGVhck15VmFyKFxcXFxcXFwiY29va2llXFxcXFxcXCIpKTtcXFxcbmxldCBmcm9tPWdldFBhcmFtKFxcXFxcXFwiZnJvbVxcXFxcXFwiLFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuXFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOehruiupOeZu+W9leKAneKAnVxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChmcm9tKSA9PiB7XFxcXG4gICAgICAgIC8vbGV0IGNtID0gYW5kcm9pZC53ZWJraXQuQ29va2llTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xcXFxuICAgICAgICAvL2xldCBjbSA9IGNvbS50ZW5jZW50LnNtdHQuc2RrLkNvb2tpZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcXFxcbiAgICAgICAgLy9sZXQgY29va2llID0gU3RyaW5nKGNtLmdldENvb2tpZShcXFxcXFxcImh0dHBzOi8vcGFuLnF1YXJrLmNuXFxcXFxcXCIpIHx8IFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgY29va2llID0gZ2V0TXlWYXIoXFxcXFxcXCJjb29raWVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgIGlmICgkLnJlcXVpcmUoXFxcXFxcXCJ0b29sXFxcXFxcXCIpLmlzTG9naW5Db29raWUoY29va2llKSkge1xcXFxuICAgICAgICAgICAgaWYoZnJvbT09PVxcXFxcXFwidWNcXFxcXFxcIil7XFxcXG4gICAgICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcInVjQ29va2llXFxcXFxcXCIsIGNvb2tpZSk7XFxcXG4gICAgICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwicXVhcmtDb29raWVcXFxcXFxcIiwgY29va2llKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v55m75b2V5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mnKrnmbvlvZVcXFxcXFxcIjtcXFxcbiAgICB9LCBmcm9tKSxcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuKAnOKAnOKAneKAnTxzbWFsbD7ngrnlh7vlpLTlg4/lj6/ku6XpgIDlh7rotKblj7fph43mlrDnmbvlvZU8L3NtYWxsPlxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIlxcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5sZXQgZHVybD1mcm9tPT09XFxcXFxcXCJ1Y1xcXFxcXFwiP1xcXFxcXFwiaHR0cHM6Ly9kcml2ZS51Yy5jblxcXFxcXFwiOlxcXFxcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY25cXFxcXFxcIjtcXFxcbmQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwieDVfd2Vidmlld19zaW5nbGVcXFxcXFxcIixcXFxcbiAgICB1cmw6IGR1cmwsXFxcXG4gICAgZGVzYzogXFxcXFxcXCJsaXN0JiZzY3JlZW4tMTUwXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdWE6IFBDX1VBLFxcXFxuICAgICAgICBqczogJC50b1N0cmluZygodGl0bGUsIGR1cmwpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBjb29raWUgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGNvb2tpZSA9IGZiYS5nZXRDb29raWUoZHVybCk7XFxcXG4gICAgICAgICAgICAgICAgZmJhLnB1dFZhcih0aXRsZSArIFxcXFxcXFwiQGNvb2tpZVxcXFxcXFwiLCBjb29raWUpO1xcXFxuICAgICAgICAgICAgfSwgMjAwKTtcXFxcbiAgICAgICAgfSwgTVlfUlVMRS50aXRsZSwgZHVybClcXFxcbiAgICB9XFxcXG59KTtcXFxcbnNldFJlc3VsdChkKVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuW3peWFt1xcXCIsXFxcInBhdGhcXFwiOlxcXCJ0b29sXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuXFxcXG4kLmV4cG9ydHM9e1xcXFxuICAgIGlzTG9naW5Db29raWUoY29va2llKXtcXFxcbiAgICAgICAgLy9yZXR1cm4gdHJ1ZTtcXFxcbiAgICAgICAgcmV0dXJuICEhKGNvb2tpZSAgJiYgY29va2llLmluY2x1ZGVzKFxcXFxcXFwiX191aWQ9XFxcXFxcXCIpICYmIGNvb2tpZS5pbmNsdWRlcyhcXFxcXFxcIl9fcHVzPVxcXFxcXFwiKSk7XFxcXG4gICAgfVxcXFxufTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLkuKrkurrotKblj7forr7nva5cXFwiLFxcXCJwYXRoXFxcIjpcXFwiYWNjb3VudFxcXCIsXFxcInJ1bGVcXFwiOlxcXCIkLmV4cG9ydHMgPSAkKFtcXFxcXFxcIuWkuOWFi+S6jOe7tOeggeeZu+W9lVxcXFxcXFwiLCBcXFxcXFxcIkNvb2tpZeeZu+W9lVxcXFxcXFwiLCBcXFxcXFxcIue9kemhteeZu+W9lVxcXFxcXFwiLCBcXFxcXFxcIuWkjeWItkNvb2tpZVxcXFxcXFwiLCBcXFxcXFxcIua4hemZpENvb2tpZVxcXFxcXFwiLCBcXFxcXFxcIuiOt+WPlue9kee7nOWFseS6q0tLQ29va2llXFxcXFxcXCIsIFxcXFxcXFwiVUPnvZHpobXnmbvlvZVcXFxcXFxcIiwgXFxcXFxcXCJVQ0Nvb2tpZeeZu+W9lVxcXFxcXFwiLCBcXFxcXFxcIuWkjeWItlVDQ29va2llXFxcXFxcXCIsIFxcXFxcXFwi5riF6ZmkVUNDb29raWVcXFxcXFxcIl0pLnNlbGVjdCgoaXNyKSA9PiB7XFxcXG4gICAgaWYgKGlucHV0ID09PSBcXFxcXFxcIue9kemhteeZu+W9lVxcXFxcXFwiKSB7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFxcXFxcIjtcXFxcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIkNvb2tpZeeZu+W9lVxcXFxcXFwiKSB7XFxcXG4gICAgICAgIHJldHVybiAkKFxcXFxcXFwiXFxcXFxcXCIsIFxcXFxcXFwi6K+36L6T5YWlQ29va2llXFxcXFxcXCIpLmlucHV0KChpc3IpID0+IHtcXFxcbiAgICAgICAgICAgIGlmICgkLnJlcXVpcmUoXFxcXFxcXCJ0b29sXFxcXFxcXCIpLmlzTG9naW5Db29raWUoaW5wdXQpKSB7XFxcXG4gICAgICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcInF1YXJrQ29va2llXFxcXFxcXCIsIGlucHV0LnJlcGxhY2UoL1xcXFxcXFxccy9nLCBcXFxcXFxcIlxcXFxcXFwiKSk7XFxcXG4gICAgICAgICAgICAgICAgaXNyICYmIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9Db29raWXmoLzlvI/plJnor69cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSwgaXNyKTtcXFxcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIuS7jlRWQk9Y6I635Y+WQ29va2llXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgbGV0IHBhdGggPSBcXFxcXFxcIi9zdG9yYWdlL2VtdWxhdGVkLzAvVFYvLnF1YXJrX3VzZXJcXFxcXFxcIjtcXFxcbiAgICAgICAgaWYgKGZpbGVFeGlzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGgpKSB7XFxcXG4gICAgICAgICAgICBpZiAoIW5ldyBqYXZhLmlvLkZpbGUocGF0aCkuY2FuUmVhZCgpKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcXFxcXCLmsqHmnInmnYPpmZDor7vlj5ZDb29raWXmlofku7bvvIzor7fmiZPlvIDmiYDmnInmlofku7bmnYPpmZBcXFxcXFxcXG7mtbfpmJTorr7nva4tPuabtOWkmuWKn+iDvS0+5YaF6YOo5paH5Lu2566h55CGLT7lj7PkuIrop5JcXFxcXFxcIikuY29uZmlybSgoKSA9PiB7fSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShmZXRjaChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGgpKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgY29va2llID0ganNvbi5jb29raWU7XFxcXG4gICAgICAgICAgICAgICAgaWYgKCQucmVxdWlyZShcXFxcXFxcInRvb2xcXFxcXFxcIikuaXNMb2dpbkNvb2tpZShjb29raWUpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJxdWFya0Nvb2tpZVxcXFxcXFwiLCBjb29raWUpO1xcXFxuICAgICAgICAgICAgICAgICAgICBpc3IgJiYgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL0Nvb2tpZeagvOW8j+mUmeivr1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+iOt+WPluWksei0peWFseS6q+aWh+S7tuaNn+Wdj1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcmV0dXJuICQoXFxcXFxcXCLmnKrmo4DmtYvliLBUVkJPWOeahENvb2tpZeaWh+S7tlxcXFxcXFxcbuivt+S9v+eUqOi/h+WQjuWGjeWwneivlVxcXFxcXFwiKS5jb25maXJtKCgpID0+IHt9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwi5aSN5Yi2Q29va2llXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgbGV0IGNvb2tpZSA9IGdldEl0ZW0oXFxcXFxcXCJxdWFya0Nvb2tpZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgaWYgKGNvb2tpZSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiY29weTovL1xcXFxcXFwiICsgY29va2llO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mnKrnmbvlvZVcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwi5riF6ZmkQ29va2llXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgY2xlYXJJdGVtKFxcXFxcXFwicXVhcmtDb29raWVcXFxcXFxcIik7XFxcXG4gICAgICAgIGlzciAmJiByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+mAgOWHuueZu+W9lVxcXFxcXFwiO1xcXFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwiVUPnvZHpobXnmbvlvZVcXFxcXFxcIikge1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL3BhZ2UvbG9naW4jbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP2Zyb209dWNcXFxcXFxcIjtcXFxcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIlVDQ29va2ll55m75b2VXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgcmV0dXJuICQoXFxcXFxcXCJcXFxcXFxcIiwgXFxcXFxcXCLor7fovpPlhaVDb29raWVcXFxcXFxcIikuaW5wdXQoKGlzcikgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKCQucmVxdWlyZShcXFxcXFxcInRvb2xcXFxcXFxcIikuaXNMb2dpbkNvb2tpZShpbnB1dCkpIHtcXFxcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwidWNDb29raWVcXFxcXFxcIiwgaW5wdXQucmVwbGFjZSgvXFxcXFxcXFxzL2csIFxcXFxcXFwiXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgICAgICAgICBpc3IgJiYgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL0Nvb2tpZeagvOW8j+mUmeivr1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9LCBpc3IpO1xcXFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwi5aSN5Yi2VUNDb29raWVcXFxcXFxcIikge1xcXFxuICAgICAgICBsZXQgY29va2llID0gZ2V0SXRlbShcXFxcXFxcInVjQ29va2llXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoY29va2llKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJjb3B5Oi8vXFxcXFxcXCIgKyBjb29raWU7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+acqueZu+W9lVxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcXFxcXCLmuIXpmaRVQ0Nvb2tpZVxcXFxcXFwiKSB7XFxcXG4gICAgICAgIGNsZWFySXRlbShcXFxcXFxcInVjQ29va2llXFxcXFxcXCIpO1xcXFxuICAgICAgICBpc3IgJiYgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/pgIDlh7rnmbvlvZVcXFxcXFxcIjtcXFxcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIuiOt+WPlue9kee7nOWFseS6q0tLQ29va2llXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgbGV0IGhoZCA9IHtcXFxcbiAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ0FwYWNoZS1IdHRwQ2xpZW50L1VOQVZBSUxBQkxFIChqYXZhIDEuNCknXFxcXG4gICAgICAgIH3CoFxcXFxuICAgICAgICBsZXQgZHhjdXJsID0gJ2h0dHA6Ly9hcGkudjZ4LndodC5kZ3dodC50b3AvdGV4dC8zZGU4OGQxMGQwMTkyOWJlLydcXFxcbiAgICAgICAgbGV0IHhjZGF0YSA9IFsnYzk5ZDc0MTFjY2MyOWJjMSddXFxcXG4gICAgICAgIGxldCBkeGMgPSBbXVxcXFxuICAgICAgICBsZXQgeXNjb29raWUgPSAnJ1xcXFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhjZGF0YS5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgICAgICAgbGV0IGRhdGEgPSBmZXRjaChkeGN1cmwgKyB4Y2RhdGFbaV0sIHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoaGRcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgaWYgKCQucmVxdWlyZShcXFxcXFxcInRvb2xcXFxcXFxcIikuaXNMb2dpbkNvb2tpZShkYXRhKSkge1xcXFxuICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHlzY29va2llID0gZGF0YS5zcGxpdChcXFxcXFxcIuKRoFxcXFxcXFwiKVsxXTtcXFxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcXFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmICh5c2Nvb2tpZSkge1xcXFxuICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcInF1YXJrQ29va2llXFxcXFxcXCIsIHlzY29va2llKTtcXFxcbiAgICAgICAgICAgIGlzciAmJiByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6I635Y+W5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIuWkuOWFi+S6jOe7tOeggeeZu+W9lVxcXFxcXFwiKSB7XFxcXG4gICAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlUmFuZG9tVVVJRCgpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uKGMpIHtcXFxcbiAgICAgICAgICAgICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsXFxcXG4gICAgICAgICAgICAgICAgICAgIHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBsZXQgcmVxdWVzdF9pZCA9IGdlbmVyYXRlUmFuZG9tVVVJRCgpO1xcXFxuICAgICAgICAgICAgbGV0IHFjVG9rZW4gPSBKU09OLnBhcnNlKGZldGNoKGJ1aWxkVXJsKFxcXFxcXFwiaHR0cHM6Ly91b3AucXVhcmsuY24vY2FzL2FqYXgvZ2V0VG9rZW5Gb3JRcmNvZGVMb2dpblxcXFxcXFwiLCB7XFxcXG4gICAgICAgICAgICAgICAgcmVxdWVzdF9pZCxcXFxcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IFxcXFxcXFwiNTMyXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdjogXFxcXFxcXCIxLjJcXFxcXFxcIlxcXFxuICAgICAgICAgICAgfSkpKS5kYXRhLm1lbWJlcnMudG9rZW47XFxcXG4gICAgICAgICAgICBjcmVhdGVRUkNvZGUoYGh0dHBzOi8vc3UucXVhcmsuY24vNF9lTUhCSj90b2tlbj0ke3FjVG9rZW59JmNsaWVudF9pZD01MzImc3NiPXdlYmxvZ2luJnVjX3BhcmFtX3N0cj0mdWNfYml6X3N0cj1TJTNBY3VzdG9tJTdDT1BUJTNBU0FSRUElNDAwJTdDT1BUJTNBSU1NRVJTSVZFJTQwMSU3Q09QVCUzQUJBQ0tfQlROX1NUWUxFJTQwMGAsIGZhbHNlKTtcXFxcbiAgICAgICAgICAgIGxldCBzZXJ2aWNlX3RpY2tldD1cXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGVjID0gMDsgaSA8IDMwOyBpKyspIHtcXFxcbiAgICAgICAgICAgICAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKDIwMDApO1xcXFxuICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0aWNrZXQgPSBKU09OLnBhcnNlKGZldGNoKGJ1aWxkVXJsKFxcXFxcXFwiaHR0cHM6Ly91b3AucXVhcmsuY24vY2FzL2FqYXgvZ2V0U2VydmljZVRpY2tldEJ5UXJjb2RlVG9rZW5cXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9pZDpnZW5lcmF0ZVJhbmRvbVVVSUQoKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZDogXFxcXFxcXCI1MzJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHY6IFxcXFxcXFwiMS4yXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogcWNUb2tlblxcXFxuICAgICAgICAgICAgICAgICAgICB9KSkpO1xcXFxuICAgICAgICAgICAgICAgICAgICAvL2xvZyh0aWNrZXQpXFxcXG4gICAgICAgICAgICAgICAgICAgIGlmKHRpY2tldC5zdGF0dXMgPT0gMjAwMDAwMCl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX3RpY2tldD10aWNrZXQuZGF0YS5tZW1iZXJzLnNlcnZpY2VfdGlja2V0O1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpY2tldC5zdGF0dXMgPT0gNTAwMDQwMDEpIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAodGlja2V0LnN0YXR1cyA9PSA1MDAwNDAwMiB8fCBpID09PSAyOSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kuoznu7TnoIHov4fmnJ9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgZWMrKztcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVjID49IDUpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5p+l6K+i5LqM57u056CB5Ye66ZSZXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlmKCFzZXJ2aWNlX3RpY2tldCkgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly90aWNrZXTojrflj5blpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGxldCByZXM9SlNPTi5wYXJzZShmZXRjaChcXFxcXFxcImh0dHBzOi8vcGFuLnF1YXJrLmNuL2FjY291bnQvaW5mbz9zdD1cXFxcXFxcIitzZXJ2aWNlX3RpY2tldCtcXFxcXFxcIiZsdz1zY2FuXFxcXFxcXCIsIHtcXFxcbiAgICAgICAgICAgICAgICB3aXRoSGVhZGVyczp0cnVlXFxcXG4gICAgICAgICAgICB9KSk7XFxcXG4gICAgICAgICAgICAvL2xvZyhyZXMpXFxcXG4gICAgICAgICAgICBpZighSlNPTi5wYXJzZShyZXMuYm9keSkuc3VjY2VzcykgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly90aWNrZXTpqozor4HlpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGxldCBjb29raWU9XFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGxldCBoZWFkZXJzPXJlcy5oZWFkZXJzO1xcXFxuICAgICAgICAgICAgZm9yIChsZXQgYyBvZiBoZWFkZXJzW1xcXFxcXFwic2V0LWNvb2tpZVxcXFxcXFwiXSl7XFxcXG4gICAgICAgICAgICAgICAgY29va2llKz1jLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKVswXStcXFxcXFxcIjtcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcblxcXFxuICAgICAgICAgICAgbG9nKGNvb2tpZSk7XFxcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwicXVhcmtDb29raWVcXFxcXFxcIiwgY29va2llKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v55m75b2V5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiAoXFxcXFxcXCJ0b2FzdDovL+eZu+W9leWksei0pe+8mlxcXFxcXFwiICsgZS50b1N0cmluZygpKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICAvL2h0dHBzOi8vc3UucXVhcmsuY24vNF9lTUhCSj90b2tlbj1zdDk2YTYzMzM5MG55OXl6bGswaXZ1b3VjN2I5Z2ZtaiZjbGllbnRfaWQ9NTMyJnNzYj13ZWJsb2dpbiZ1Y19wYXJhbV9zdHI9JnVjX2Jpel9zdHI9UyUzQWN1c3RvbSU3Q09QVCUzQVNBUkVBJTQwMCU3Q09QVCUzQUlNTUVSU0lWRSU0MDElN0NPUFQlM0FCQUNLX0JUTl9TVFlMRSU0MDBcXFxcbiAgICB9XFxcXG59LCAkLmltcG9ydFBhcmFtKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJDb29raWVNYW5hZ2VcXFwiLFxcXCJwYXRoXFxcIjpcXFwiQ29va2llTWFuYWdlXFxcIixcXFwicnVsZVxcXCI6XFxcImZ1bmN0aW9uIENvb2tpZU1hbmFnZShjb29raWUpIHtcXFxcbiAgICB0aGlzLmNvb2tpZSA9IHt9O1xcXFxuICAgIHRoaXMuYWRkKGNvb2tpZSk7XFxcXG59XFxcXG5PYmplY3QuYXNzaWduKENvb2tpZU1hbmFnZS5wcm90b3R5cGUsIHtcXFxcbiAgICBhZGQoY29va2llKSB7XFxcXG4gICAgICAgIGxldCBjb29raWVzID0gW107XFxcXG4gICAgICAgIGlmICh0eXBlb2YgY29va2llID09PSBcXFxcXFxcInN0cmluZ1xcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBjb29raWVzID0gY29va2llLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKTtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvb2tpZSkpIHtcXFxcbiAgICAgICAgICAgIGNvb2tpZXMgPSBjb29raWU7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgY29va2llcy5mb3JFYWNoKHYgPT4ge1xcXFxuICAgICAgICAgICAgdiA9IHYuc3BsaXQoXFxcXFxcXCI9XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgaWYgKHYubGVuZ3RoIDwgMikgcmV0dXJuO1xcXFxuICAgICAgICAgICAgbGV0IGtleSA9IHYuc2hpZnQoKS50cmltKCk7XFxcXG4gICAgICAgICAgICB0aGlzLmNvb2tpZVtrZXldID0gdi5qb2luKFxcXFxcXFwiPVxcXFxcXFwiKS50cmltKCk7XFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH0sXFxcXG4gICAgZ2V0KCkge1xcXFxuICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5jb29raWUpLm1hcCh2ID0+IHZbMF0gKyBcXFxcXFxcIj1cXFxcXFxcIiArIHZbMV0pLmpvaW4oXFxcXFxcXCI7XFxcXFxcXCIpO1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuLy9jb25zdCBjb29raWVNYW5hZ2UgPSBuZXcgQ29va2llTWFuYWdlKGNvb2tpZSk7XFxcXG4kLmV4cG9ydHM9Q29va2llTWFuYWdlO1xcXCJ9XVwiLFwicHJveHlcIjpcIlwifSIsInBpY1VybCI6Imh0dHBzOi8vd3Nydi5ubC8/dXJsPWh0dHBzOi8vaW1nMi5kb3ViYW5pby5jb20vdmlldy9waG90by9zX3JhdGlvX3Bvc3Rlci9wdWJsaWMvcDI4OTc2MzAyNzEuanBnIiwidGl0bGUiOiJnc2ZoIDRL6auY56CB546HIn0=
Add Comment
Please, Sign In to add comment