Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@DrpyHiker@eyJmaXJzdEhlYWRlciI6ImNsYXNzIiwibGFzdF9jaGFwdGVyX3J1bGUiOiIiLCJ0aXRsZSI6IkRycHlIaWtlciIsImF1dGhvciI6IkBMb3lEZ0lrJnpldGFscGhhIiwidXJsIjoiaGlrZXI6Ly9lbXB0eSMjZnlwYWdlIiwidmVyc2lvbiI6MzQsImNvbF90eXBlIjoibW92aWVfMyIsImNsYXNzX25hbWUiOiIiLCJ0eXBlIjoidmlkZW8iLCJjbGFzc191cmwiOiIiLCJhcmVhX25hbWUiOiIiLCJhcmVhX3VybCI6IiIsInNvcnRfbmFtZSI6IiIsInllYXJfbmFtZSI6IiIsInNvcnRfdXJsIjoiIiwieWVhcl91cmwiOiIiLCJmaW5kX3J1bGUiOiJqczokLnJlcXVpcmUoXCJNaWFuTG9hZFwiKTsiLCJzZWFyY2hfdXJsIjoiaGlrZXI6Ly9lbXB0eT9zPSoqJnBhZ2U9ZnlwYWdlIiwiZ3JvdXAiOiLlvIDlj5HkuK3lv4MiLCJzZWFyY2hGaW5kIjoianM6XG4oZnVuY3Rpb24gKCkge1xuICBsZXQgc21vZGUgPSBOdW1iZXIoZ2V0SXRlbShcInNtb2RlXCIsIFwiMFwiKSk7XG4gIGxldCB0ZW1zbW9kZSA9IGdldE15VmFyKFwidGVtc21vZGVcIiwgXCJcIik7XG4gIGlmICh0ZW1zbW9kZSkge1xuICAgIHNtb2RlID0gTnVtYmVyKHRlbXNtb2RlKTtcbiAgICBjbGVhck15VmFyKFwidGVtc21vZGVcIik7XG4gIH1cbiAgaWYgKCFmaWxlRXhpc3QoXCJoaWtlcjovL2ZpbGVzL2RhdGEvXCIgKyBNWV9SVUxFLnRpdGxlICsgXCIvbGlic19oaWtlci9kcnB5Mi5qc1wiKSkgcmV0dXJuIHNldFJlc3VsdChbe1xuICAgIHRpdGxlOiBcIuivt+WJjeW+gOWwj+eoi+W6j+S4u+mhteiuvue9rmRycHlQYXRoXCIsXG4gICAgdXJsOiBcImhpa2VyOi8vaG9tZUBcIiArIE1ZX1JVTEUudGl0bGVcbiAgfV0pO1xuICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcInJ1bnRpbWVDb25maWdcIik7XG4gIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFwiRHJweU1hbmFnZVwiKTtcbiAgaWYgKCFydW50aW1lQ29uZmlnLmlzUHJlcGFyZWQoKSkgcmV0dXJuIHNldFJlc3VsdChbe1xuICAgIHRpdGxlOiBcIuivt+WJjeW+gOWwj+eoi+W6j+S4u+mhteiuvue9rua6kFwiLFxuICAgIHVybDogXCJoaWtlcjovL2hvbWVAXCIgKyBNWV9SVUxFLnRpdGxlXG4gIH1dKTtcblxuICBpZiAoc21vZGUgPT09IDApIHtcbiAgICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCk7XG4gICAgaWYgKCFzb3VyY2Uuc2VhcmNoYWJsZSkgcmV0dXJuIHNldFJlc3VsdChbe1xuICAgICAgdGl0bGU6IFwi5b2T5YmN5rqQ5LiN5pSv5oyB5pCc57SiXCIsXG4gICAgICB1cmw6IFwiaGlrZXI6Ly9lbXB0eVwiXG4gICAgfV0pO1xuICAgIGxldCBkcnB5ID0gRHJweU1hbmFnZS5nZXQoc291cmNlLmtleSk7XG5cbiAgICBsZXQgaG9tZUxpc3QgPSBbXVxuICAgIHRyeSB7XG4gICAgICBob21lTGlzdCA9IEpTT04ucGFyc2UoZHJweS5zZWFyY2goTVlfS0VZV09SRCwgZmFsc2UsIE1ZX1BBR0UpKS5saXN0IHx8IFtdO1xuICAgIH0gY2F0Y2ggeyB9XG4gICAgbGV0IGQgPSBbXTtcbiAgICBmb3IgKGxldCBpdCBvZiBob21lTGlzdCkge1xuICAgICAgZC5wdXNoKHtcbiAgICAgICAgdGl0bGU6IGl0LnZvZF9uYW1lLFxuICAgICAgICBkZXNjOiBpdC52b2RfcmVtYXJrcyArIFwiwrdcIiArIHNvdXJjZS5uYW1lLFxuICAgICAgICBjb250ZW50OiBpdC52b2RfY29udGVudCxcbiAgICAgICAgdXJsOiBcImhpa2VyOi8vcGFnZS9kZXRhaWxlZCNpbW1lcnNpdmVUaGVtZSNcIixcbiAgICAgICAgcGljX3VybDogaXQudm9kX3BpYyxcbiAgICAgICAgY29sX3R5cGU6IFwibW92aWVfM1wiLFxuICAgICAgICBleHRyYToge1xuICAgICAgICAgIHZvZElkOiBTdHJpbmcoaXQudm9kX2lkKSxcbiAgICAgICAgICBpbWc6IGl0LnZvZF9waWMsXG4gICAgICAgICAgc25hbWU6IHNvdXJjZS5uYW1lLFxuICAgICAgICAgIHNrZXk6IHNvdXJjZS5rZXksXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBzZXRSZXN1bHQoZCk7XG4gIH0gZWxzZSB7XG4gICAgc2V0UmVzdWx0KFt7XG4gICAgICB0aXRsZTogXCLngrnmiJHlvIDlp4vogZrlkIjmkJzntKJcIiArIE1ZX0tFWVdPUkQsXG4gICAgICB1cmw6IFwiaGlrZXI6Ly9zZWFyY2g/cz1cIiArIE1ZX0tFWVdPUkQsXG4gICAgICBleHRyYToge1xuICAgICAgICBkZWxlZ2F0ZU9ubHlTZWFyY2g6IHRydWUsXG4gICAgICAgIHJ1bGVzOiAkLnRvU3RyaW5nKCgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXCJydW50aW1lQ29uZmlnXCIsIFwicnVudGltZUNvbmZpZ1wiKTtcbiAgICAgICAgICAgIGxldCBzbW9kZSA9IE51bWJlcihnZXRJdGVtKFwic21vZGVcIiwgXCIwXCIpKTtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gcnVudGltZUNvbmZpZy5nZXRBbGxvd1NlYXJjaFNvdXJjZShzbW9kZT09PTIpO1xuXG4gICAgICAgICAgICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCk7XG5cbiAgICAgICAgICAgIGxldCBsaXN0aSA9IGxpc3QuZmluZEluZGV4KHggPT4geC5rZXkgPT0gc291cmNlLmtleSk7XG5cbiAgICAgICAgICAgIGlmIChzb3VyY2Uuc2VhcmNoYWJsZSAmJiBsaXN0aSAhPSAtMSkge1xuICAgICAgICAgICAgICBsaXN0LnNwbGljZShsaXN0LmluZGV4T2Yoc291cmNlKSwgMSk7XG4gICAgICAgICAgICAgIGxpc3QudW5zaGlmdChzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHNlYXJjaHNvcnQgPSBOdW1iZXIoZ2V0SXRlbShcInNlYXJjaHNvcnRcIiwgXCIwXCIpKTtcbiAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgIG5hdHVyYWxTb3J0LFxuICAgICAgICAgICAgICB1c2luZ1NvcnRcbiAgICAgICAgICAgIH0gPSAkLnJlcXVpcmUoXCJtZXRob2RzXCIpO1xuXG4gICAgICAgICAgICBpZiAoc2VhcmNoc29ydCA+IDApIHtcbiAgICAgICAgICAgICAgaWYgKHNlYXJjaHNvcnQgPT0gMSkge1xuICAgICAgICAgICAgICAgIG5hdHVyYWxTb3J0KGxpc3QsIFwibmFtZVwiKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWFyY2hzb3J0ID09IDIpIHtcbiAgICAgICAgICAgICAgICB1c2luZ1NvcnQuc2V0a2V5KFwibmFtZVwiKTtcbiAgICAgICAgICAgICAgICB1c2luZ1NvcnQuZ2V0KGxpc3QpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJ1bGVzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XG4gICAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRpdGxlOiBpdC5uYW1lLFxuICAgICAgICAgICAgICAgIHNlYXJjaF91cmw6IFwiaGlrZXI6Ly9lbXB0eT9wYWdlPWZ5cGFnZSZzZWFyY2hUZXJtcz0qKlwiLFxuICAgICAgICAgICAgICAgIHNlYXJjaEZpbmQ6IFwianM6XCIgKyAkLnRvU3RyaW5nKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICBsZXQgZHJweSA9IEdNLmRlZmluZU1vZHVsZShcIkRycHlNYW5hZ2VcIikuZ2V0KGl0ZW0ua2V5KTtcblxuICAgICAgICAgICAgICAgICAgbGV0IGhvbWVMaXN0ID0gSlNPTi5wYXJzZShkcnB5LnNlYXJjaChNWV9LRVlXT1JELCBmYWxzZSwgTVlfUEFHRSkpLmxpc3QgfHwgW107XG4gICAgICAgICAgICAgICAgICBsZXQgZCA9IFtdO1xuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaXQgb2YgaG9tZUxpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXQudm9kX25hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgZGVzYzogaXQudm9kX3JlbWFya3MsXG4gICAgICAgICAgICAgICAgICAgICAgY29udGVudDogaXQudm9kX2NvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgdXJsOiBcImhpa2VyOi8vcGFnZS9kZXRhaWxlZCNpbW1lcnNpdmVUaGVtZSNcIixcbiAgICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiBpdC52b2RfcGljLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcIm1vdmllXzNcIixcbiAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xuICAgICAgICAgICAgICAgICAgICAgICAgdm9kSWQ6IFN0cmluZyhpdC52b2RfaWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNQb2x5bWVyaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nOiBpdC52b2RfcGljLFxuICAgICAgICAgICAgICAgICAgICAgICAgc25hbWU6IGl0ZW0ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNrZXk6IGl0ZW0ua2V5LFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBzZXRSZXN1bHQoZCk7XG4gICAgICAgICAgICAgICAgfSwgaXQpXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJ1bGVzKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfV0pO1xuICB9XG59KSgpIiwiZGV0YWlsX2NvbF90eXBlIjoibW92aWVfMSIsImRldGFpbF9maW5kX3J1bGUiOiIiLCJzZGV0YWlsX2NvbF90eXBlIjoibW92aWVfMSIsInNkZXRhaWxfZmluZF9ydWxlIjoiIiwidWEiOiJtb2JpbGUiLCJwcmVSdWxlIjoiLyo8JD5cbkBpbmNsdWRlIHN0YXJ0XG5odHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD02OTE2JmF1dGg9MWQzNWU4ZjAtMjJlOC01MjcwLWE5ZDEtODI2ZjUzZjE3N2FkXG5AaW5jbHVkZSBlbmRcbjwkPiovXG4iLCJwYWdlcyI6Ilt7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiZHJweVwiLFwicGF0aFwiOlwiZHJweVwiLFwicnVsZVwiOlwiY29uc3Qgc2tleSA9IG1vZHVsZS5pbXBvcnRQYXJhbTtcXG5cXG5mdW5jdGlvbiBpbml0SGlrZXIoKSB7XFxuICAgIGNvbnN0IGlzQ2xvc2VMb2cgPSAhZ2V0SXRlbShcXFwidXNlTG9nXFxcIiwgXFxcIlxcXCIpO1xcbiAgICBjb25zdCBsb2NhbEtleSA9IFxcXCJkcnB5XFxcIjtcXG4gICAgY29uc3QgQ3J5cHRvVXRpbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9hc3NldHMvY3J5cHRvLWphdmEuanNcXFwiKTtcXG4gICAgZ2xvYmFsVGhpcy5sb2NhbCA9IHtcXG4gICAgICAgIHNldChydWxla2V5LCBrLCB2KSB7XFxuICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShsb2NhbEtleSArIFxcXCJAXFxcIiArIHJ1bGVrZXkgKyBcXFwiQFxcXCIgKyBrLCB2KTtcXG4gICAgICAgIH0sXFxuICAgICAgICBnZXQocnVsZWtleSwgaywgdikge1xcbiAgICAgICAgICAgIHJldHVybiBzdG9yYWdlMC5nZXRJdGVtKGxvY2FsS2V5ICsgXFxcIkBcXFwiICsgcnVsZWtleSArIFxcXCJAXFxcIiArIGssIFxcXCJcXFwiKSB8fCB2O1xcbiAgICAgICAgfSxcXG4gICAgICAgIGRlbGV0ZShydWxla2V5LCBrKSB7XFxuICAgICAgICAgICAgc3RvcmFnZTAuY2xlYXJJdGVtKGxvY2FsS2V5ICsgXFxcIkBcXFwiICsgcnVsZWtleSArIFxcXCJAXFxcIiArIGspO1xcbiAgICAgICAgfVxcbiAgICB9O1xcbiAgICBnbG9iYWxUaGlzLmdldFByb3h5ID0gZnVuY3Rpb24gKCkge1xcbiAgICAgICAgcmV0dXJuIGdldE15VmFyKFxcXCJQcm94eV9VcmxcXFwiLCBcXFwiaHR0cDovLzEyNy4wLjAuMTo1MjAyMC9wcm94eVxcXCIpICsgXFxcIj9oaWtlclNrZXk9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChza2V5KSArIFxcXCImZG89anNcXFwiO1xcbiAgICB9XFxuICAgIGV2YWwoZ2V0Q3J5cHRvSlMoKSk7XFxuICAgIGdsb2JhbFRoaXMuQ3J5cHRvSlMgPSBDcnlwdG9KUztcXG5cXG4gICAgbGV0ICRyZXF1ZXN0ID0gcmVxdWVzdDtcXG4gICAgbGV0ICRwb3N0ID0gcG9zdDtcXG4gICAgZ2xvYmFsVGhpcy5yZXEgPSBmdW5jdGlvbiAodXJsLCBjb2JqKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCByZXMgPSB7fTtcXG4gICAgICAgICAgICBsZXQgb2JqID0gT2JqZWN0LmFzc2lnbih7fSwgY29iaik7XFxuICAgICAgICAgICAgaWYgKG9iai5kYXRhKSB7XFxuICAgICAgICAgICAgICAgIG9iai5ib2R5ID0gb2JqLmRhdGE7XFxuICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmouZGF0YTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShcXFwicmVkaXJlY3RcXFwiKSkgb2JqLnJlZGlyZWN0ID0gISFvYmoucmVkaXJlY3Q7XFxuICAgICAgICAgICAgaWYgKG9iai5idWZmZXIgPT09IDIpIHtcXG4gICAgICAgICAgICAgICAgb2JqLnRvSGV4ID0gdHJ1ZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgb2JqLmhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHtcXG4gICAgICAgICAgICAgICAgQ29va2llOiBcXFwiI25vQ29va2llI1xcXCJcXG4gICAgICAgICAgICB9LCBvYmouaGVhZGVycyk7XFxuICAgICAgICAgICAgaWYgKHVybCA9PT0gXFxcImh0dHBzOi8vYXBpLm5uLmNpL29jci9iNjQvdGV4dFxcXCIgJiYgb2JqLmhlYWRlcnMpIHtcXG4gICAgICAgICAgICAgICAgb2JqLmhlYWRlcnNbXFxcIkNvbnRlbnQtVHlwZVxcXCJdID0gXFxcInRleHQvcGxhaW5cXFwiO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoXFxcImZpbGU6Ly9cXFwiKSAmJiAodXJsLmluY2x1ZGVzKFxcXCI/dHlwZT1cXFwiKSB8fCB1cmwuaW5jbHVkZXMoXFxcIj9wYXJhbXM9XFxcIikpKSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IHVybC5zbGljZSgwLCB1cmwubGFzdEluZGV4T2YoXFxcIj9cXFwiKSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBvYmouaGVhZGVycykge1xcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9iai5oZWFkZXJzW2tleV0gIT09IFxcXCJzdHJpbmdcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICBvYmouaGVhZGVyc1trZXldID0gU3RyaW5nKG9iai5oZWFkZXJzW2tleV0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCByID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgLyogaWYgKFN0cmluZyhvYmoubWV0aG9kKS50b0xvd2VyQ2FzZSgpID09PSBcXFwicG9zdFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgIHIgPSAkcG9zdCh1cmwsIG9iaik7XFxuICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICByID0gJHJlcXVlc3QodXJsLCBvYmopO1xcbiAgICAgICAgICAgICB9Ki9cXG4gICAgICAgICAgICByID0gJHJlcXVlc3QodXJsLCBvYmopO1xcbiAgICAgICAgICAgIGlmIChvYmoud2l0aEhlYWRlcnMpIHtcXG4gICAgICAgICAgICAgICAgciA9IEpTT04ucGFyc2Uocik7XFxuICAgICAgICAgICAgICAgIHJlcy5jb250ZW50ID0gci5ib2R5O1xcbiAgICAgICAgICAgICAgICByZXMuaGVhZGVycyA9IHt9O1xcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoci5oZWFkZXJzIHx8IHt9KSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmVzLmhlYWRlcnNba10gPSB2WzBdO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmVzLmNvbnRlbnQgPSByO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAob2JqLmJ1ZmZlciA9PT0gMikge1xcbiAgICAgICAgICAgICAgICByZXMuY29udGVudCA9IENyeXB0b1V0aWwuRGF0YS5wYXJzZUhleChyZXMuY29udGVudCkudG9CYXNlNjQoX2Jhc2U2NC5OT19XUkFQKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIHJlcztcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coXFxcIkVycm9yXFxcIiArIGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgLypcXG4gICAgY29uc3QgSmluSmEgPSAkLnJlcXVpcmUoXFxcImh0dHBzOi8vY2RuLmJvb3RjZG4ubmV0L2FqYXgvbGlicy9tdXN0YWNoZS5qcy80LjEuMC9tdXN0YWNoZS5qc1xcXCIpO1xcbiAgXFxuICAgIGNvbnN0IEpQID0gJC5yZXF1aXJlKFxcXCJodHRwczovL2pzb25wYXRoLXBsdXMuZ2l0aHViLmlvL0pTT05QYXRoL2Rpc3QvaW5kZXgtYnJvd3Nlci11bWQuY2pzXFxcIik7XFxuICAgIGdsb2JhbFRoaXMuY2hlZXJpbyA9IHtcXG4gICAgICAgIGppbmphMih0ZW1wbGF0ZSwgb2JqKSB7XFxuICAgICAgICAgICAgXFxuICAgICAgICAgICAgcmV0dXJuICQubG9nKEppbkphLnJlbmRlcih0ZW1wbGF0ZSwgb2JqKSk7XFxuICAgICAgICB9LFxcbiAgICAgICAganAocGF0aCwganNvbikge1xcbiAgICAgICAgICAgIHJldHVybiBKUC5KU09OUGF0aCh7XFxuICAgICAgICAgICAgICAgIHBhdGgsXFxuICAgICAgICAgICAgICAgIGpzb25cXG4gICAgICAgICAgICB9KVswXTtcXG4gICAgICAgIH1cXG4gICAgfSovXFxuICAgIGdsb2JhbFRoaXMucGRmYSA9IF9wZGZhO1xcbiAgICBnbG9iYWxUaGlzLnBkID0gX3BkO1xcbiAgICBnbG9iYWxUaGlzLnBkZmggPSBfcGRmaDtcXG4gICAgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsID0gZnVuY3Rpb24gKHNlYXJjaCwgcmVwbGFjZW1lbnQpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLnNwbGl0KHNlYXJjaCkuam9pbihyZXBsYWNlbWVudCk7XFxuICAgIH07XFxuICAgIGxldCAkdG9TdHJpbmcgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XFxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcXG4gICAgICAgIHJldHVybiAkdG9TdHJpbmcuYXBwbHkodGhpcykudHJpbSgpO1xcbiAgICB9O1xcbiAgICBpZiAoaXNDbG9zZUxvZykge1xcbiAgICAgICAgLy8g6YeN5YaZY29uc29sZS5sb2flh73mlbBcXG4gICAgICAgIGNvbnNvbGUubG9nID0gZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgIC8vIOajgOafpeS8oOWFpeWPguaVsOeahOaVsOmHj1xcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xcbiAgICAgICAgICAgICAgICAvLyDlpoLmnpzlj4LmlbDmlbDph4/lpKfkuo4x77yM6LCD55So5Y6f5aeL55qEY29uc29sZS5sb2flh73mlbBcXG4gICAgICAgICAgICAgICAgLy9vcmlnaW5hbExvZy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgLy8g5aaC5p6c5Y+C5pWw5Y+q5pyJ5LiA5Liq77yM5YiZ5LiN5YGa5Lu75L2V5pON5L2cXFxuICAgICAgICB9O1xcbiAgICB9XFxufVxcbmluaXRIaWtlcigpO1xcbmNvbnN0IGRycHlQYXRoID0gZ2V0UGF0aChcXFwiaGlrZXI6Ly9maWxlcy9kYXRhL1xcXCIgKyBNWV9SVUxFLnRpdGxlICsgXFxcIi9saWJzX2hpa2VyL2RycHkyLmpzXFxcIik7XFxuXFxuaWYgKCFmaWxlRXhpc3QoZHJweVBhdGgpKSB7XFxuICAgIHRocm93IG5ldyBFcnJvcihcXFwi57y65bCRZHJweS5qc+i/kOihjOW6k1xcXCIpO1xcbn1cXG5sZXQgZHJweSA9ICQucmVxdWlyZShkcnB5UGF0aCk7XFxuLypcXG5sZXQgY3VycmVudFBhdGggPSBcXFwiXFxcIjtcXG5sZXQgJGluaXQgPSBkcnB5LmluaXQ7XFxuZHJweS5pbml0ID0gZnVuY3Rpb24oZXh0KSB7XFxuICAgIGlmIChleHQgPT09IGN1cnJlbnRQYXRoKSByZXR1cm47XFxuICAgICRpbml0LmNhbGwodGhpcywgZXh0KTtcXG4gICAgY3VycmVudFBhdGggPSBleHQ7XFxufSovXFxuZnVuY3Rpb24gc3luYyhmdW5jLCBzcCkge1xcbiAgICByZXR1cm4gbmV3IG9yZy5tb3ppbGxhLmphdmFzY3JpcHQuU3luY2hyb25pemVyKGZ1bmMsIHNwIHx8IHt9KTtcXG59XFxuLy9kcnB5LnByb3h5ID0gc3luYyhkcnB5LnByb3h5LCBkcnB5KTtcXG4kLmV4cG9ydHMgPSBkcnB5O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfMV92ZXJ0aWNhbF9waWNfYmx1clwiLFwibmFtZVwiOlwi6K+m57uG6aG16Z2iXCIsXCJwYXRoXCI6XCJkZXRhaWxlZFwiLFwicnVsZVwiOlwianM6XFxuKGZ1bmN0aW9uICgpIHtcXG4gIGxldCBpZCA9IE1ZX1BBUkFNUy52b2RJZDtcXG4gIGFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgKCkgPT4ge1xcbiAgICBHTS5jbGVhcihcXFwicmVub3ZhdGVMaXN0XFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInNvcnRpXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBhZ2VudW1cXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicGxheWxpc3RfcmVhZHlcXFwiKTtcXG4gIH0pO1xcbiAgYWRkTGlzdGVuZXIoJ29uUmVmcmVzaCcsICQudG9TdHJpbmcoKGlkKSA9PiB7XFxuICAgIC8vY2xlYXJNeVZhcihpZCArIFxcXCJlcmluZm9cXFwiKVxcbiAgICBjbGVhck15VmFyKFxcXCJwbGF5bGlzdF9yZWFkeVxcXCIpO1xcbiAgfSwgaWQpKVxcblxcbiAgbGV0IGVyID0gJC5yZXF1aXJlKFxcXCJVSU1hbmFnZVxcXCIpLnVpX2NvbmZpZy5lcjtcXG5cXG4gIGZ1bmN0aW9uIGhpc3Rvcnlsb2cobW9kZSwgc2tleSwgaWQsIHZhbHVlKSB7XFxuICAgIHZhciBuYW1lID0gXFxcImhpc3RvcnkuanNvblxcXCI7XFxuICAgIGxldCBqc29uID0gW107XFxuICAgIGlmIChmaWxlRXhpc3QobmFtZSkpIHtcXG4gICAgICBqc29uID0gSlNPTi5wYXJzZShyZWFkRmlsZShuYW1lLCAwKSkgfHwgW107XFxuICAgIH1cXG4gICAgaWYgKG1vZGUgPT0gXFxcImdldFxcXCIpIHtcXG4gICAgICBsZXQgaW5kZXggPSBqc29uLmZpbmRJbmRleChvYmogPT4gb2JqLnNrZXkgPT09IHNrZXkgJiYgb2JqLmlkID09PSBpZCk7XFxuICAgICAgaWYgKGluZGV4ICE9IC0xKSB7XFxuICAgICAgICByZXR1cm4ganNvbltpbmRleF0ucGFnZTtcXG4gICAgICB9XFxuICAgIH1cXG4gICAgbGV0IG1heGNvdW50ID0gZXIu5Y6G5Y+y6K6w5b2VO1xcbiAgICBpZiAobW9kZSA9PSBcXFwic2V0XFxcIikge1xcbiAgICAgIGlmIChqc29uLmxlbmd0aCA+PSBtYXhjb3VudCkge1xcbiAgICAgICAganNvbiA9IGpzb24uc2xpY2UoMCwgbWF4Y291bnQgLSAxKTtcXG4gICAgICB9XFxuICAgICAgbGV0IGluZGV4ID0ganNvbi5maW5kSW5kZXgob2JqID0+IG9iai5za2V5ID09PSBza2V5ICYmIG9iai5pZCA9PT0gaWQpO1xcbiAgICAgIGlmIChpbmRleCAhPSAtMSkge1xcbiAgICAgICAgaWYgKGpzb25baW5kZXhdLnBhZ2UgIT0gdmFsdWUucGFnZSkge1xcbiAgICAgICAgICBqc29uW2luZGV4XS5wYWdlID0gdmFsdWUucGFnZTtcXG4gICAgICAgICAgc2F2ZUZpbGUobmFtZSwgSlNPTi5zdHJpbmdpZnkoanNvbiksIDApO1xcbiAgICAgICAgfTtcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAganNvbi5wdXNoKHtcXG4gICAgICAgICAgc2tleTogc2tleSxcXG4gICAgICAgICAgaWQ6IGlkLFxcbiAgICAgICAgICB0aXRsZTogdmFsdWUudGl0bGUsXFxuICAgICAgICAgIHBhZ2U6IHZhbHVlLnBhZ2UsXFxuICAgICAgICB9KVxcbiAgICAgICAgc2F2ZUZpbGUobmFtZSwgSlNPTi5zdHJpbmdpZnkoanNvbiksIDApO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgfVxcblxcbiAgLy/mlrnms5VcXG4gIGZ1bmN0aW9uIGZvbnRzdHlsZSh0ZXh0LCBwYXJhbXMpIHtcXG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHVuZGVmaW5lZDtcXG4gICAgdmFyIGggPSBwYXJhbXMuaCAhPT0gZmFsc2UgPyAn4oCc4oCc4oCd4oCdJyA6ICcnO1xcbiAgICB2YXIgdGFncyA9IHBhcmFtcy50YWdzIHx8IFxcXCJcXFwiO1xcbiAgICBpZiAocGFyYW1zLmMgIT0gdW5kZWZpbmVkKSB7XFxuICAgICAgdGV4dCA9IHRleHQuZm9udGNvbG9yKHBhcmFtcy5jKTtcXG4gICAgfVxcbiAgICBpZiAodGFncykge1xcbiAgICAgIHZhciB0YWdBcnJheSA9IHRhZ3Muc3BsaXQoJ3wnKS5maWx0ZXIoZSA9PiBlKTtcXG4gICAgICB2YXIgb3BlblRhZ3MgPSAnJztcXG4gICAgICB2YXIgY2xvc2VUYWdzID0gJyc7XFxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWdBcnJheS5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgb3BlblRhZ3MgKz0gJzwnICsgdGFnQXJyYXlbaV0gKyAnPic7XFxuICAgICAgICBjbG9zZVRhZ3MgPSAnPC8nICsgdGFnQXJyYXlbaV0gKyAnPicgKyBjbG9zZVRhZ3M7XFxuICAgICAgfVxcbiAgICAgIHRleHQgPSBvcGVuVGFncyArIHRleHQgKyBjbG9zZVRhZ3M7XFxuICAgIH1cXG4gICAgcmV0dXJuIGggKyB0ZXh0O1xcbiAgfVxcblxcbiAgZnVuY3Rpb24gZmluZExvbmdlc3RFbGVtZW50KGFycikge1xcbiAgICByZXR1cm4gYXJyLnJlZHVjZSgoYSwgYikgPT4gYS5sZW5ndGggPiBiLmxlbmd0aCA/IGEgOiBiKTtcXG4gIH1cXG5cXG4gIGZ1bmN0aW9uIGNvdW50VG90YWxCeXRlcyh0ZXh0KSB7XFxuICAgIHZhciBjb3VudCA9IDA7XFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xcbiAgICAgIHZhciBjb2RlID0gdGV4dC5jaGFyQ29kZUF0KGkpO1xcbiAgICAgIGlmIChjb2RlID49IDB4MDEwMCkgeyAvLyDlj4zlrZfoioLlrZfnrKbnmoQgVW5pY29kZSDnvJbnoIHlpKfkuo4gMjU1XFxuICAgICAgICBjb3VudCArPSAyOyAvLyDlj4zlrZfoioLlrZfnrKborqHmlbDkuLoyXFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIGNvdW50ICs9IDE7IC8vIOWNleWtl+iKguWtl+espuiuoeaVsOS4ujFcXG4gICAgICB9XFxuICAgIH1cXG4gICAgcmV0dXJuIGNvdW50O1xcbiAgfVxcblxcbiAgZnVuY3Rpb24gY2FjaGVTaG93VGlwcygpIHtcXG4gICAgLyppZiAoc3RvcmFnZTAuZ2V0TXlWYXIoaWQgKyBcXFwiZXJpbmZvXFxcIikpIHtcXG4gIGQucHVzaCh7XFxuICAgIHRpdGxlOiBmb250c3R5bGUoXFxcIuW9k+WJjeS4uue8k+WtmCzngrnmiJHliLfmlrBcXFwiLCB7XFxuICAgICAgYzogXFxcImdyZXlcXFwiLFxcbiAgICAgIHRhZ3M6IFxcXCJzbWFsbFxcXCJcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaWQpID0+IHtcXG4gICAgICBjbGVhck15VmFyKGlkICsgXFxcImVyaW5mb1xcXCIpXFxuICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sIGlkKSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgfVxcbiAgfSlcXG4gICAgfSovXFxuICB9XFxuXFxuICBmdW5jdGlvbiBzdWJzdHIoc3RyLCBtYXhMZW5ndGgpIHtcXG4gICAgbGV0IGxlbiA9IDA7XFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgaWYgKHN0ci5jaGFyQ29kZUF0KGkpID4gMjU1KSB7XFxuICAgICAgICBsZW4gKz0gMjtcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgbGVuKys7XFxuICAgICAgfVxcbiAgICAgIGlmIChsZW4gPiBtYXhMZW5ndGgpIHtcXG4gICAgICAgIHJldHVybiBzdHIuc2xpY2UoMCwgaSkgKyAnLi4uJztcXG4gICAgICB9XFxuICAgIH1cXG4gICAgcmV0dXJuIHN0cjtcXG4gIH1cXG5cXG4gIGZ1bmN0aW9uIHNldERlc2MoZGVzYywgbnVtKSB7XFxuICAgIGlmIChkZXNjID09IHVuZGVmaW5lZCkge1xcbiAgICAgIHJldHVybjtcXG4gICAgfVxcbiAgICBkZXNjID0gZGVzYy5jb25zdHJ1Y3RvciA9PSBBcnJheSA/IGRlc2Muam9pbignPGJyPicpIDogZGVzYztcXG4gICAgaWYgKGRlc2MucmVwbGFjZSgvKDxicj58XFxcXHMrKS9nLCAnJykubGVuZ3RoID09IDApIHtcXG4gICAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6ICdiaWdfYmxhbmtfYmxvY2snXFxuICAgICAgfSlcXG4gICAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6ICdiaWdfYmxhbmtfYmxvY2snXFxuICAgICAgfSlcXG4gICAgICByZXR1cm47XFxuICAgIH1cXG5cXG4gICAgY29uc3QgbWFyayA9ICdkZXNjJztcXG4gICAgbnVtID0gdHlwZW9mIChudW0pID09ICd1bmRlZmluZWQnID8gMTAwIDogbnVtXFxuICAgIGRlc2MgPSBkZXNjLnN0YXJ0c1dpdGgoJ+OAgOOAgCcpID8gZGVzYyA6ICfjgIDjgIAnICsgZGVzYztcXG4gICAgZGVzYyA9IGRlc2MucmVwbGFjZSgvJy9nLCBcXFwiJiMzOTtcXFwiKTtcXG4gICAgZGVzYyA9IGRlc2MucmVwbGFjZSgvXFxcXHJcXFxcbi9nLCBcXFwiPGJyPlxcXCIpO1xcbiAgICBkZXNjID0gZGVzYy5yZXBsYWNlKC9cXFxcbi9nLCBcXFwiPGJyPlxcXCIpO1xcbiAgICBsZXQgc2Rlc2MgPSBzdWJzdHIoZGVzYywgbnVtKTtcXG5cXG4gICAgdmFyIGNvbG9ycyA9IHtcXG4gICAgICBzaG93OiBcXFwiYmxhY2tcXFwiLFxcbiAgICAgIGhpZGU6IFxcXCJncmV5XFxcIlxcbiAgICB9XFxuXFxuICAgIHZhciBsYXp5ID0gJChgI25vTG9hZGluZyNgKS5sYXp5UnVsZSgoZGMsIHNkYywgbSwgY3MpID0+IHtcXG4gICAgICB2YXIgc2hvdyA9IHN0b3JhZ2UwLmdldEl0ZW0obSwgJzAnKTtcXG4gICAgICB2YXIgdGl0bGUgPSBmaW5kSXRlbSgnZGVzYycpLnRpdGxlO1xcbiAgICAgIHZhciByZSA9IC8oPFxcXFwvc21hbGw+PGJyPi4qPz4pLisvZztcXG4gICAgICB2YXIgZXhwID0gJ+WxleW8gDonO1xcbiAgICAgIHZhciByZXQgPSAn5pS26LW3Oic7XFxuICAgICAgaWYgKHNob3cgPT0gJzEnKSB7XFxuICAgICAgICB1cGRhdGVJdGVtKCdkZXNjJywge1xcbiAgICAgICAgICB0aXRsZTogdGl0bGVcXG4gICAgICAgICAgICAucmVwbGFjZShyZXQsIGV4cClcXG4gICAgICAgICAgICAucmVwbGFjZShyZSwgJyQxJyArIHNkYyArICc8L3NtYWxsPicpXFxuICAgICAgICAgICAgLnJlcGxhY2UoLyg8XFxcXC9zbWFsbD48YnI+XFxcXDxmb250IGNvbG9yPVxcXCIpLio/KFxcXCI+KS8sICckMScgKyBjcy5oaWRlICsgJyQyJylcXG5cXG4gICAgICAgIH0pXFxuICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKG0sICcwJyk7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oJ2Rlc2MnLCB7XFxuICAgICAgICAgIHRpdGxlOiB0aXRsZVxcbiAgICAgICAgICAgIC5yZXBsYWNlKGV4cCwgcmV0KVxcbiAgICAgICAgICAgIC5yZXBsYWNlKHJlLCAnJDEnICsgZGMgKyAnPC9zbWFsbD4nKVxcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oPFxcXFwvc21hbGw+PGJyPlxcXFw8Zm9udCBjb2xvcj1cXFwiKS4qPyhcXFwiPikvLCAnJDEnICsgY3Muc2hvdyArICckMicpXFxuICAgICAgICB9KVxcbiAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShtLCAnMScpO1xcbiAgICAgIH1cXG4gICAgICByZXR1cm4gYGhpa2VyOi8vZW1wdHlgXFxuICAgIH0sIGRlc2MsIHNkZXNjLCBtYXJrLCBjb2xvcnMpXFxuICAgIHZhciBzYyA9IHN0b3JhZ2UwLmdldEl0ZW0obWFyaywgJzAnKSA9PSAnMCcgPyAn5bGV5byAOicgOiAn5pS26LW3Oic7XFxuICAgIHZhciBkYyA9IHN0b3JhZ2UwLmdldEl0ZW0obWFyaywgJzAnKSA9PSAnMCcgPyBzZGVzYyA6IGRlc2M7XFxuICAgIHZhciBjcyA9IHN0b3JhZ2UwLmdldEl0ZW0obWFyaywgJzAnKSA9PSAnMCcgPyBjb2xvcnMuaGlkZSA6IGNvbG9ycy5zaG93O1xcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiAnJyArICc8Yj48Zm9udCBjb2xvcj1cXFwiIzA5OEFDMVxcXCI+4oi35Ymn5oOF566A5LuLXFx0PC9mb250PjwvYj4nICsgXFxcIjxzbWFsbD48YSBzdHlsZT0ndGV4dC1kZWNvcmF0aW9uOiBub25lOycgaHJlZj0nXFxcIiArIGxhenkgKyBcXFwiJz5cXFwiICsgc2MgKyAnPC9hPjwvc21hbGw+PGJyPjxmb250IGNvbG9yPVxcXCInICsgY3MgKyAnXFxcIj4nICsgYCR7ZGN9YCArICc8L3NtYWxsPicsXFxuICAgICAgY29sX3R5cGU6ICdyaWNoX3RleHQnLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogJ2Rlc2MnLFxcbiAgICAgICAgbGluZVNwYWNpbmc6IDYsXFxuICAgICAgICB0ZXh0U2l6ZTogMTUsXFxuICAgICAgICBsaW5lVmlzaWJsZTogdHJ1ZSxcXG4gICAgICB9XFxuICAgIH0pXFxuICB9XFxuXFxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RyaW5nLnByb3RvdHlwZSwgJ1NwbGl0Jywge1xcbiAgICB2YWx1ZTogZnVuY3Rpb24gKHMsIGUpIHtcXG4gICAgICBpZiAoZSkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXQocykuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gJycpO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5zcGxpdChzKTtcXG4gICAgICB9XFxuICAgIH0sXFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxcbiAgfSk7XFxuXFxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhBcnJheS5wcm90b3R5cGUsIHtcXG4gICAgZXhjbHVkZUtleXM6IHtcXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gKGtleXMsIGV4Y2x1ZGUsIHJlbmFtZUNhbGxiYWNrKSB7XFxuICAgICAgICAvLyDnoa7lrprmmK/mjpLpmaTov5jmmK/lj6rkv53nlZnplK5cXG4gICAgICAgIGNvbnN0IHNob3VsZEV4Y2x1ZGUgPSB0eXBlb2YgZXhjbHVkZSA9PT0gJ2Jvb2xlYW4nID8gZXhjbHVkZSA6IHRydWU7XFxuICAgICAgICBjb25zdCBrZXlzVG9IYW5kbGUgPSBBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtdO1xcblxcbiAgICAgICAgLy8g5L2/55SoQXJyYXkucHJvdG90eXBlLm1hcOmBjeWOhuaVsOe7hOS4reeahOavj+S4quWFg+e0oFxcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwKGl0ZW0gPT4ge1xcbiAgICAgICAgICAvLyDlpoLmnpzlhYPntKDmmK/kuIDkuKrmlbDnu4TvvIzpgJLlvZLosIPnlKhleGNsdWRlS2V5c1xcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xcbiAgICAgICAgICAgIHJldHVybiBpdGVtLmV4Y2x1ZGVLZXlzKGV4Y2x1ZGUsIGtleXMsIHJlbmFtZUNhbGxiYWNrKTtcXG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAhPT0gbnVsbCkge1xcbiAgICAgICAgICAgIC8vIOWmguaenOWFg+e0oOaYr+S4gOS4quWvueixoe+8jOS9v+eUqE9iamVjdC5mcm9tRW50cmllc+WSjE9iamVjdC5lbnRyaWVz5p2l5aSE55CG6ZSuXFxuICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGl0ZW0pO1xcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZEVudHJpZXMgPSBlbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XFxuICAgICAgICAgICAgICAvLyDlpoLmnpzmnInph43lkb3lkI3lm57osIPlh73mlbDvvIzliJnosIPnlKjlroNcXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVuYW1lQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtyZW5hbWVDYWxsYmFjayhrZXksIHZhbHVlKSwgdmFsdWVdO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIHZhbHVlXTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZEVudHJpZXMgPSBzaG91bGRFeGNsdWRlID9cXG4gICAgICAgICAgICAgIHByb2Nlc3NlZEVudHJpZXMuZmlsdGVyKChba2V5XSkgPT4gIWtleXNUb0hhbmRsZS5pbmNsdWRlcyhrZXkpKSA6XFxuICAgICAgICAgICAgICBwcm9jZXNzZWRFbnRyaWVzLmZpbHRlcigoW2tleV0pID0+IGtleXNUb0hhbmRsZS5pbmNsdWRlcyhrZXkpKTtcXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGZpbHRlcmVkRW50cmllcyk7XFxuICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgLy8g5aaC5p6c5YWD57Sg5LiN5piv5a+56LGh5oiW5pWw57uE77yM55u05o6l6L+U5ZueXFxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XFxuICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgIH0sXFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsIC8vIOiuvue9ruS4uuS4jeWPr+aemuS4vlxcbiAgICB9LFxcbiAgICB0cmFuc2Zvcm1LZXlzOiB7XFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIChrZXlNYXBwaW5nKSB7XFxuICAgICAgICAvLyDkvb/nlKhBcnJheS5wcm90b3R5cGUubWFw6YGN5Y6G5pWw57uE5Lit55qE5q+P5Liq5YWD57SgXFxuICAgICAgICByZXR1cm4gdGhpcy5tYXAoaXRlbSA9PiB7XFxuICAgICAgICAgIC8vIOWmguaenOWFg+e0oOaYr+S4gOS4quaVsOe7hO+8jOmAkuW9kuiwg+eUqHRyYW5zZm9ybUtleXNcXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcXG4gICAgICAgICAgICByZXR1cm4gaXRlbS50cmFuc2Zvcm1LZXlzKGtleU1hcHBpbmcpO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiBpdGVtICE9PSBudWxsKSB7XFxuICAgICAgICAgICAgLy8g5aaC5p6c5YWD57Sg5piv5LiA5Liq5a+56LGh77yM5L2/55SoT2JqZWN0LmZyb21FbnRyaWVz5ZKMT2JqZWN0LmVudHJpZXPmnaXlpITnkIbplK5cXG4gICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoaXRlbSk7XFxuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRFbnRyaWVzID0gZW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xcbiAgICAgICAgICAgICAgY29uc3QgbmV3S2V5ID0ga2V5TWFwcGluZ1trZXldIHx8IGtleTsgLy8g5aaC5p6c6ZSu5Zyo5pig5bCE5Lit77yM5L2/55So5paw6ZSu77yb5ZCm5YiZ5L2/55So5Y6f5aeL6ZSuXFxuICAgICAgICAgICAgICByZXR1cm4gW25ld0tleSwgdmFsdWVdO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModHJhbnNmb3JtZWRFbnRyaWVzKTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAvLyDlpoLmnpzlhYPntKDkuI3mmK/lr7nosaHmiJbmlbDnu4TvvIznm7TmjqXov5Tlm55cXG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgfSxcXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSwgLy8g6K6+572u5Li65LiN5Y+v5p6a5Li+XFxuICAgIH1cXG4gIH0pO1xcblxcbiAgbGV0IHNvcnRvYmogPSBbXFxuICAgIGZvbnRzdHlsZShcXFwi5q2j5bqPXFxcIiwge1xcbiAgICAgIGM6IFxcXCIjMUFBRDE5XFxcIixcXG4gICAgICB0YWdzOiBcXFwiYlxcXCJcXG4gICAgfSksXFxuICAgIGZvbnRzdHlsZShcXFwi6YCG5bqPXFxcIiwge1xcbiAgICAgIGM6IFxcXCIjRkYwMDAwXFxcIixcXG4gICAgICB0YWdzOiBcXFwiYlxcXCJcXG4gICAgfSlcXG4gIF1cXG4gIC8v5pa55rOVXFxuXFxuICB2YXIgc29ydGkgPSBnZXRNeVZhcihcXFwic29ydGlcXFwiLCBcXFwiMFxcXCIpO1xcblxcbiAgLy9sb2coc29ydG9iailcXG4gICQuZXh0ZW5kKHtcXG4gICAgc3BsaXRQYWdlKHRvdGFsSXRlbXMsIHBhZ2VTaXplKSB7XFxuICAgICAgcGFnZVNpemUgPSBOdW1iZXIocGFnZVNpemUpIHx8IDUwO1xcbiAgICAgIGxldCByZXN1bHQgPSBbXTtcXG4gICAgICBpZiAocGFnZVNpemUgPT0gMCkge1xcbiAgICAgICAgcmV0dXJuIFtgMS0ke3RvdGFsSXRlbXN9YF1cXG4gICAgICB9XFxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdG90YWxJdGVtczsgaSArPSBwYWdlU2l6ZSkge1xcbiAgICAgICAgbGV0IGVuZCA9IGkgKyBwYWdlU2l6ZSAtIDE7XFxuICAgICAgICBpZiAoZW5kID4gdG90YWxJdGVtcykge1xcbiAgICAgICAgICBlbmQgPSB0b3RhbEl0ZW1zO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmVzdWx0LnB1c2goYCR7aX0tJHtlbmR9YCk7XFxuICAgICAgfVxcbiAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICAgIHNwbGl0QXJyYXlCeVJhbmdlcyhhcnJheSwgcmFuZ2VzKSB7XFxuICAgICAgLy8g5qC55o2u6IyD5Zu05ouG5YiG5pWw57uEXFxuICAgICAgdmFyIHJlc3VsdCA9IHJhbmdlcy5tYXAoZnVuY3Rpb24gKHJhbmdlKSB7XFxuICAgICAgICB2YXIgcGFydHMgPSByYW5nZS5zcGxpdCgnLScpLm1hcChOdW1iZXIpO1xcbiAgICAgICAgdmFyIHN0YXJ0ID0gcGFydHNbMF0gLSAxOyAvLyDlh48x5piv5Zug5Li65pWw57uE57Si5byV5LuOMOW8gOWni1xcbiAgICAgICAgdmFyIGVuZCA9IHBhcnRzWzFdIC0gMTtcXG4gICAgICAgIC8vIOS9v+eUqEFycmF5LnByb3RvdHlwZS5zbGljZeadpeiOt+WPluWtkOaVsOe7hFxcbiAgICAgICAgcmV0dXJuIGFycmF5LnNsaWNlKHN0YXJ0LCBlbmQgKyAxKTsgLy8g5YyF5ous57uT5p2f57Si5byV77yM5omA5Lul5YqgMVxcbiAgICAgIH0pO1xcbiAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICB9KVxcblxcbiAgbGV0IHNvdXJjZSA9IHt9O1xcbiAgaWYgKE1ZX1BBUkFNUy5zb3VyY2UpIHtcXG4gICAgc291cmNlID0gTVlfUEFSQU1TLnNvdXJjZTtcXG4gIH0gZWxzZSB7XFxuICAgIGNvbnN0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgc291cmNlID0gcnVudGltZUNvbmZpZy5maW5kU291cmNlKE1ZX1BBUkFNUy5za2V5KTtcXG4gICAgTVlfUEFSQU1TLnNvdXJjZSA9IHNvdXJjZTtcXG4gICAgc2V0UGFnZVBhcmFtcyhNWV9QQVJBTVMpO1xcbiAgfVxcblxcbiAgY29uc3QgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpO1xcblxcbiAgRHJweU1hbmFnZS5pbml0UGFnZShcXFwiZXJcXFwiKTtcXG5cXG4gIGxldCBkcnB5ID0gRHJweU1hbmFnZS5nZXRCeVNvdXJjZShzb3VyY2UpO1xcbiAgbGV0IHN0eXBlID0gZHJweS5nZXRSdWxlKFxcXCLnsbvlnotcXFwiKTtcXG4gIC8qXFxubGV0IGluZm8gPSBzdG9yYWdlMC5nZXRNeVZhcihpZCArIFxcXCJlcmluZm9cXFwiLCBcXFwiXFxcIik7XFxuXFxuaWYgKGluZm8gPT0gXFxcIlxcXCIpIHtcXG4gIGluZm8gPSBKU09OLnBhcnNlKGRycHkuZGV0YWlsKFN0cmluZyhpZCkpKS5saXN0WzBdO1xcbiAgICBzdG9yYWdlMC5wdXRNeVZhcihpZCArIFxcXCJlcmluZm9cXFwiLCBpbmZvKVxcbiAgfVxcbiAgKi9cXG4gIGxldCBpbmZvID0gSlNPTi5wYXJzZShkcnB5LmRldGFpbChTdHJpbmcoaWQpKSkubGlzdFswXTtcXG4gIGxldCBb5a+85ryULCDkuLvmvJRdID0gW2luZm8udm9kX2RpcmVjdG9yLCBpbmZvLnZvZF9hY3Rvcl1cXG4gIGlmIChNWV9QQVJBTVMuaW1nID09IHVuZGVmaW5lZCB8fCBNWV9QQVJBTVMuaW1nID09IFxcXCJcXFwiKSB7XFxuICAgIGlmIChpbmZvLnZvZF9waWMgIT0gXFxcIlxcXCIpIHtcXG4gICAgICBzZXRQYWdlUGljVXJsKGluZm8udm9kX3BpYylcXG4gICAgfVxcbiAgfVxcblxcbiAgaWYgKOWvvOa8lCAhPSB1bmRlZmluZWQgJiYg5a+85ryUICE9IFxcXCJcXFwiKSB7XFxuICAgIOWvvOa8lCA9IOWvvOa8lC5TcGxpdCgvXFxcXC8vZywgdHJ1ZSkuam9pbihcXFwiIFxcXCIpO1xcbiAgICDlr7zmvJQgPSAvWzrvvJpdLy50ZXN0KOWvvOa8lCkgPyDlr7zmvJQgOiBcXFwi5a+85ryUOlxcXCIgKyDlr7zmvJRcXG4gIH1cXG4gIGlmICjkuLvmvJQgIT0gdW5kZWZpbmVkICYmIOS4u+a8lCAhPSBcXFwiXFxcIikge1xcbiAgICDkuLvmvJQgPSDkuLvmvJQuU3BsaXQoL1xcXFwvL2csIHRydWUpLmpvaW4oXFxcIiBcXFwiKTtcXG4gICAg5Li75ryUID0gL1s677yaXS8udGVzdCjkuLvmvJQpID8g5Li75ryUIDogXFxcIuS4u+a8lDpcXFwiICsg5Li75ryUXFxuICB9XFxuICBsZXQgW+WQjeensCwg5aSH5rOoXSA9IFtpbmZvLnZvZF9uYW1lLCBpbmZvLnZvZF9yZW1hcmtzXVxcbiAgaWYgKOWkh+azqCAhPSB1bmRlZmluZWQgJiYg5aSH5rOoICE9IFxcXCJcXFwiKSB7XFxuICAgIOWkh+azqCA9IOWkh+azqC5TcGxpdCgvXFxcXC8vZywgdHJ1ZSkuam9pbihcXFwiIFxcXCIpO1xcbiAgICDlpIfms6ggPSAvWzrvvJpdLy50ZXN0KOWkh+azqCkgPyDlpIfms6ggOiBcXFwi5aSH5rOoOlxcXCIgKyDlpIfms6g7XFxuICB9XFxuICBsZXQgdGl0bGVzID0gW+WQjeensCwg5aSH5rOoXTtcXG4gIGxldCBkZXNjcyA9IFvlr7zmvJQsIOS4u+a8lCwgaW5mby52b2RfYXJlYSwgaW5mby52b2RfeWVhcl1cXG5cXG4gIGxldCBkID0gW107XFxuICBkLnB1c2goe1xcbiAgICB0aXRsZTogdGl0bGVzLmZpbHRlcihlID0+IGUpLm1hcCgoeCwgaSkgPT4gaSA9PSAxID8gZm9udHN0eWxlKHgsIHtcXG4gICAgICB0YWdzOiBcXFwic21hbGxcXFwiXFxuICAgIH0pIDogeCkuam9pbihcXFwiXFxcXG5cXFwiKSxcXG4gICAgZGVzYzogZGVzY3MuZmlsdGVyKGUgPT4gZSkuam9pbihcXFwiXFxcXG5cXFwiKSxcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgIHBpY191cmw6IGluZm8udm9kX3BpYyB8fCBNWV9QQVJBTVMuaW1nLFxcbiAgICBleHRyYToge1xcbiAgICAgIGdyYWRpZW50OiBmYWxzZSxcXG4gICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICB0aXRsZTogXFxcIuS6jOe6p+iuvue9rlxcXCIsXFxuICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL1VJTWFuYWdlP21vZGU95LqM57qnI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCI7XFxuICAgICAgICB9KVxcbiAgICAgIH1dXFxuICAgIH1cXG4gIH0pO1xcbiAgZC5wdXNoKHtcXG4gICAgdGl0bGU6ICfmlbDmja7mnaXmupA6JyArIE1ZX1BBUkFNUy5zbmFtZSxcXG4gICAgLy9kZXNjOlxcXCJcXFwiK01ZX1BBUkFNUy5za2V5K1xcXCJcXFxcdFxcXCIsXFxuICAgIGltZzogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vbWVzc3kvNzguc3ZnXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIlxcbiAgfSlcXG4gIHNldERlc2MoaW5mby52b2RfY29udGVudClcXG5cXG4gIGxldCBmcm9tID0gW107XFxuICBpZiAoaW5mby52b2RfcGxheV9mcm9tICE9IHVuZGVmaW5lZCkge1xcbiAgICBmcm9tID0gaW5mby52b2RfcGxheV9mcm9tLnNwbGl0KFxcXCIkJCRcXFwiKTtcXG4gIH1cXG5cXG4gIGxldCBwbGF5TGF6eSA9ICQoXFxcIlxcXCIpLmxhenlSdWxlKChpZCwgc291cmNlKSA9PiB7XFxuICAgIHJldHVybiAkLnJlcXVpcmUoXFxcInZpZGVvVXJsXFxcIikucGFyc2UoaW5wdXQsIGlkLCBzb3VyY2UpO1xcbiAgfSwgXFxcImlkXFxcIiwgc291cmNlKTtcXG5cXG4gIGxldCBwYWdlc3ppZSA9IGVyLuWIhumhtTtcXG5cXG4gIGxldCBwbGF5VXJsTGlzdCA9IFtdO1xcbiAgLy9jb25zb2xlLmxvZyhpbmZvLnZvZF9wbGF5X3VybCk7XFxuICBsZXQgaXNOb3ZlbCA9IHN0eXBlID09PSBcXFwi5bCP6K+0XFxcIjtcXG4gIGxldCBwbGF5cGFnZXMgPSBbXTtcXG4gIGlmIChpbmZvLnZvZF9wbGF5X3VybCAmJiBpbmZvLnZvZF9wbGF5X3VybCAhPSBcXFwiXFxcIikge1xcbiAgICBsZXQgY29sID0gXFxcInRleHRfNFxcXCI7XFxuICAgIGxldCB0ZXh0YWxpZ24gPSBcXFwiXFxcIjtcXG4gICAgcGxheVVybExpc3QgPSBpbmZvLnZvZF9wbGF5X3VybC5zcGxpdChcXFwiJCQkXFxcIikubWFwKCh0LCBpKSA9PiB7XFxuICAgICAgbGV0IGltZyA9IFxcXCJcXFwiO1xcbiAgICAgIGxldCB0cyA9IHQuc3BsaXQoXFxcIiNcXFwiKS5tYXAoKGspID0+IGsuc3BsaXQoXFxcIiRcXFwiKVswXSk7XFxuICAgICAgbGV0IHBhZ2VzID0gJC5zcGxpdFBhZ2UodHMubGVuZ3RoLCBwYWdlc3ppZSk7XFxuICAgICAgbGV0IHRjID0gY291bnRUb3RhbEJ5dGVzKGZpbmRMb25nZXN0RWxlbWVudCh0cykpO1xcbiAgICAgIGlmICh0cy5maWx0ZXIoZSA9PiBlICE9IFxcXCJcXFwiKS5sZW5ndGgpIHtcXG4gICAgICAgIHBsYXlwYWdlc1tpXSA9IHBhZ2VzO1xcbiAgICAgIH1cXG4gICAgICBpZiAodGMgPiAyNCkge1xcbiAgICAgICAgY29sID0gXFxcInRleHRfMVxcXCI7XFxuICAgICAgICBpbWcgPSBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9tb3ZpZS8xNDYuc3ZnXFxcIjtcXG4gICAgICB9IGVsc2UgaWYgKHRjID49IDEyICYmIHRjIDwgMTUpIHtcXG4gICAgICAgIGNvbCA9IFxcXCJ0ZXh0XzNcXFwiO1xcbiAgICAgIH0gZWxzZSBpZiAodGMgPj0gMTUpIHtcXG4gICAgICAgIGNvbCA9IFxcXCJ0ZXh0XzJcXFwiO1xcbiAgICAgICAgdGV4dGFsaWduID0gXFxcImxlZnRcXFwiO1xcbiAgICAgIH1cXG4gICAgICBsZXQgcGxheW9iaiA9IHQuc3BsaXQoXFxcIiNcXFwiKS5tYXAoKGopID0+IHtcXG4gICAgICAgIGxldCBrID0gai5zcGxpdChcXFwiJFxcXCIpO1xcbiAgICAgICAgbGV0IHQgPSBrWzBdO1xcbiAgICAgICAgbGV0IHVpZCA9IChrWzFdIHx8IGtbMF0pO1xcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgc3RpdGxlOiB0LFxcbiAgICAgICAgICB0aXRsZTogZm9udHN0eWxlKHQsIHtcXG4gICAgICAgICAgICB0YWdzOiBcXFwic21hbGxcXFwiXFxuICAgICAgICAgIH0pLFxcbiAgICAgICAgICBzdXJsOiB1aWQgKyBcXFwiI1xcXCIgKyBmcm9tW2ldLFxcbiAgICAgICAgICB1cmw6IGlzTm92ZWwgPyBcXFwiaGlrZXI6Ly9wYWdlL25vdmVsI2F1dG9QYWdlIyNyZWFkVGhlbWUjXFxcIiA6ICh1aWQgKyBcXFwiI1xcXCIgKyBmcm9tW2ldICsgcGxheUxhenkucmVwbGFjZSgnXFxcImlkXFxcIicsICdcXFwiJyArIHVpZCArICdcXFwiJykpLFxcbiAgICAgICAgICBjb2xfdHlwZTogY29sLFxcbiAgICAgICAgICBpbWc6IGltZyxcXG4gICAgICAgICAgLypleHRyYTogT2JqZWN0LmFzc2lnbih7fSwgZXh0cmEsIHtcXG4gICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IGRlY29kZVVSSUNvbXBvbmVudChrWzFdKSxcXG4gICAgICAgICAgICBpZDoga1sxXSxcXG4gICAgICAgICAgICAvL2xpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICB0ZXh0QWxpZ246IHRleHRhbGlnbixcXG4gICAgICAgICAgICBjbHM6IFxcXCJwbGF5bGlzdFxcXCIsXFxuICAgICAgICAgIH0pKi9cXG4gICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBmcm9tOiBmcm9tW2ldLFxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxcbiAgICAgICAgICAgIGlkOiB1aWQsXFxuICAgICAgICAgICAgYmxvY2tSdWxlczogWydiYi4qLnBuZycsICcuanBnJywgXFxcImhtXFxcXC5iYWlkdVxcXFwuY29tXFxcXC9obS5qc1xcXCJdLFxcbiAgICAgICAgICAgIHZpZGVvRXhjbHVkZVJ1bGVzOiBbJz91cmw9J10sXFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgIHRleHRBbGlnbjogdGV4dGFsaWduLFxcbiAgICAgICAgICAgIGNsczogXFxcInBsYXlsaXN0XFxcIixcXG4gICAgICAgICAgfVxcbiAgICAgICAgfTtcXG4gICAgICB9KTtcXG5cXG4gICAgICBpZiAoc3R5cGUgPT0gXFxcIua8q+eUu1xcXCIgfHwgc3R5cGUgPT0gXFxcIuWwj+ivtFxcXCIpIHtcXG5cXG4gICAgICAgIHZhciBkb3dubG9hZGxhenkgPSAkLnRvU3RyaW5nKChrZXksIHNrZXksIHRpdGxlKSA9PiB7XFxuICAgICAgICAgIGxldCB7XFxuICAgICAgICAgICAgR01cXG4gICAgICAgICAgfSA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NjkxNiZhdXRoPTFkMzVlOGYwLTIyZTgtNTI3MC1hOWQxLTgyNmY1M2YxNzdhZFxcXCIpO1xcbiAgICAgICAgICBHTS5zZXRTZWxmS2V5KGtleSk7XFxuICAgICAgICAgIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIiwgXFxcIkRycHlNYW5hZ2U/cnVsZT1cXFwiICsgdGl0bGUpO1xcbiAgICAgICAgICBsZXQgZHJweSA9IERycHlNYW5hZ2UuZ2V0KHNrZXkpO1xcbiAgICAgICAgICBpbnB1dCA9IGlucHV0LnNwbGl0KFxcXCIjXFxcIik7XFxuICAgICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKGRycHkucGxheShpbnB1dFsxXSwgaW5wdXRbMF0pKTtcXG4gICAgICAgICAgaWYgKHJlc3VsdC51cmwuc3RhcnRzV2l0aChcXFwicGljczovL1xcXCIpKSByZXR1cm4gcmVzdWx0LnVybDtcXG4gICAgICAgICAgZWxzZSBpZiAocmVzdWx0LnVybC5zdGFydHNXaXRoKFxcXCJub3ZlbDovL1xcXCIpKSByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQudXJsLnJlcGxhY2UoXFxcIm5vdmVsOi8vXFxcIiwgXFxcIlxcXCIpKS5jb250ZW50O1xcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIua8q+eUu+aIluato+aWh+iOt+WPluWksei0pVxcXCIpO1xcbiAgICAgICAgfSwgR00uZ2V0U2VsZktleSgpLCBNWV9QQVJBTVMuc2tleSwgTVlfUlVMRS50aXRsZSk7XFxuXFxuICAgICAgICBsZXQgY2hhcHRlckxpc3QgPSBwbGF5b2JqLmV4Y2x1ZGVLZXlzKFtcXFwic3VybFxcXCIsIFxcXCJzdGl0bGVcXFwiXSwgZmFsc2UpLnRyYW5zZm9ybUtleXMoe1xcbiAgICAgICAgICBcXFwic3VybFxcXCI6IFxcXCJ1cmxcXFwiLFxcbiAgICAgICAgICBcXFwic3RpdGxlXFxcIjogXFxcInRpdGxlXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL2RyX2Rvd19saXN0Lmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShjaGFwdGVyTGlzdCkpO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgdGl0bGU6IFxcXCLkuIvovb1cXFwiICsgc3R5cGUsXFxuICAgICAgICAgIHVybDogJ2hpa2VyOi8vcGFnZS9kb3dubG9hZC52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9SZWZyZXNoIz9ydWxlPeacrOWcsOi1hOa6kOeuoeeQhicsXFxuICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgY2hhcHRlckxpc3Q6IFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS9kcl9kb3dfbGlzdC5qc29uXFxcIixcXG4gICAgICAgICAgICBpbmZvOiB7XFxuICAgICAgICAgICAgICBib29rTmFtZTogaW5mby52b2RfbmFtZSwgLy/mvKvnlLvlkI3np7AsXFxuICAgICAgICAgICAgICBydWxlTmFtZTogTVlfUlVMRS50aXRsZSxcXG4gICAgICAgICAgICAgIGJvb2tUb3BQaWM6IGluZm8udm9kX3BpYyxcXG4gICAgICAgICAgICAgIHBhcnNlQ29kZTogZG93bmxvYWRsYXp5LFxcbiAgICAgICAgICAgICAgYm9va0lkOiBNWV9QQVJBTVMuc25hbWUsXFxuICAgICAgICAgICAgICB0eXBlOiBzdHlwZSA9PT0gXFxcIua8q+eUu1xcXCIgPyBcXFwiY29taWNcXFwiIDogXFxcIm5vdmVsXFxcIixcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGRlZmF1bHRWaWV3OiBcXFwiMVxcXCJcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICB0aXRsZTogXFxcIuacrOWcsOS5puaetlxcXCIsXFxuICAgICAgICAgIHVybDogJ2hpa2VyOi8vcGFnZS9Cb29rcmFjay52aWV3I25vUmVjb3JkSGlzdG9yeSM/cnVsZT3mnKzlnLDotYTmupDnrqHnkIYmcnVsZU5hbWU9JyArIE1ZX1JVTEUudGl0bGUsXFxuICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgdHlwZTogc3R5cGUgPT09IFxcXCLmvKvnlLtcXFwiID8gXFxcImNvbWljXFxcIiA6IFxcXCJub3ZlbFxcXCIsXFxuICAgICAgICAgIH1cXG4gICAgICAgIH0sIHtcXG4gICAgICAgICAgY29sX3R5cGU6ICdibGFua19ibG9jaydcXG4gICAgICAgIH0pO1xcbiAgICAgIH1cXG5cXG4gICAgICBwbGF5b2JqID0gJC5zcGxpdEFycmF5QnlSYW5nZXMocGxheW9iaiwgcGFnZXMpO1xcbiAgICAgIHJldHVybiBwbGF5b2JqO1xcbiAgICB9KTtcXG4gIH0gZWxzZSB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbiAgICB9LCB7XFxuICAgICAgdGl0bGU6IFxcXCLmmoLml6Dmkq3mlL7mupDmiJbmkq3mlL7liJfooajlrprkvY3plJnor69cXFwiLFxcbiAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgdXJsOiBNWV9QQVJBTVMudm9kSWQsXFxuICAgIH0pO1xcbiAgICBjYWNoZVNob3dUaXBzKCk7XFxuICAgIHNldFJlc3VsdChkKTtcXG4gIH1cXG5cXG5cXG4gIGxldCBjdXJyZW50TG9jYXRpb24gPSAwO1xcblxcbiAgZnVuY3Rpb24gcmVub3ZhdGVMaXN0KGxvY2F0aW9uKSB7XFxuICAgIC8vZGVsZXRlSXRlbUJ5Q2xzKFxcXCJwbGF5cGFnZVxcXCIpO1xcbiAgICAvL2RlbGV0ZUl0ZW1CeUNscyhcXFwicGxheWxpc3RcXFwiKTtcXG4gICAgaWYgKHBsYXlVcmxMaXN0Lmxlbmd0aCA9PSAwKSB7XFxuICAgICAgcmV0dXJuO1xcbiAgICB9XFxuICAgIGxldCBoaXMgPSBoaXN0b3J5bG9nKFxcXCJnZXRcXFwiLCBNWV9QQVJBTVMuc2tleSwgbWQ1KE1ZX1BBUkFNUy52b2RJZCkpO1xcbiAgICBsZXQgcGFnZW51bSA9IGdldE15VmFyKFxcXCJwYWdlbnVtXFxcIiwgKGhpcyB8fCBcXFwiMFxcXCIpKTtcXG5cXG4gICAgbGV0IHBjb3VudCA9IHBsYXlVcmxMaXN0W2xvY2F0aW9uXS5sZW5ndGg7XFxuICAgIGxldCBsaXN0ID0gcGxheVVybExpc3RbbG9jYXRpb25dW3BhZ2VudW1dO1xcbiAgICBpZiAoIWxpc3QpIHtcXG4gICAgICBmb3IgKGxldCBpID0gcGFnZW51bTsgaSA+PSAwOyBpLS0pIHtcXG4gICAgICAgIGxpc3QgPSBwbGF5VXJsTGlzdFtsb2NhdGlvbl1baV07XFxuICAgICAgICBpZiAobGlzdCkge1xcbiAgICAgICAgICBwYWdlbnVtID0gaTtcXG4gICAgICAgICAgYnJlYWs7XFxuICAgICAgICB9XFxuICAgICAgfVxcbiAgICB9XFxuICAgIGlmIChnZXRNeVZhcihcXFwic29ydGlcXFwiLCBcXFwiMFxcXCIpID09IDEpIHtcXG4gICAgICBsaXN0LnJldmVyc2UoKTtcXG4gICAgfVxcbiAgICAkLmV4dGVuZCh7XFxuICAgICAgdGVtcF9saXN0OiBwbGF5VXJsTGlzdFtsb2NhdGlvbl0sXFxuICAgIH0pXFxuICAgIGxldCBwbGF5cCA9IHBsYXlwYWdlc1tsb2NhdGlvbl07XFxuICAgIGRlbGV0ZUl0ZW1CeUNscyhcXFwicGxheXBhZ2VcXFwiKVxcbiAgICBpZiAocGxheXAgJiYgcGxheXAubGVuZ3RoID4gMSkge1xcbiAgICAgIGhpc3Rvcnlsb2coXFxcInNldFxcXCIsIE1ZX1BBUkFNUy5za2V5LCBtZDUoTVlfUEFSQU1TLnZvZElkKSwgeyB0aXRsZTogaW5mby52b2RfbmFtZSwgcGFnZTogcGFnZW51bSwgZGF0ZTogbmV3IERhdGUoKS5nZXRUaW1lKCkgfSk7XFxuICAgICAgbGV0IHRlbXAgPSB7XFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfMScsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBjbHM6IFxcXCJwbGF5cGFnZVxcXCJcXG4gICAgICAgIH1cXG4gICAgICB9XFxuICAgICAgbGV0IHBhZ2VhcnIgPSBwbGF5cC5tYXAoKHgsIGkpID0+IGkgPT0gcGFnZW51bSA/ICfigJzigJzigJ3igJ0nICsgeC5mb250Y29sb3IoXFxcInJlZFxcXCIpIDogeCk7XFxuICAgICAgYWRkSXRlbUFmdGVyKFxcXCJwbGF5cGFnZWxpbmVcXFwiLCBbe1xcbiAgICAgICAgdGl0bGU6ICfkuIrkuIDpobUnLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzRcXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChsb2NhdGlvbiwgcGNvdW50KSA9PiB7XFxuICAgICAgICAgIGxldCBwYWdlbnVtID0gZ2V0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgICBpZiAocGFnZW51bSA9PSAwKSB7XFxuICAgICAgICAgICAgcGFnZW51bSA9IHBjb3VudCAtIDE7XFxuICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcGFnZW51bS0tO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIHB1dE15VmFyKFxcXCJwYWdlbnVtXFxcIiwgU3RyaW5nKHBhZ2VudW0pKTtcXG4gICAgICAgICAgR00uZ2V0KFxcXCJyZW5vdmF0ZUxpc3RcXFwiLCAoKSA9PiB7IH0pKGxvY2F0aW9uKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIGxvY2F0aW9uLCBwY291bnQpLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgY2xzOiBcXFwicGxheXBhZ2VcXFwiXFxuICAgICAgICB9XFxuICAgICAgfSwge1xcbiAgICAgICAgdGl0bGU6IHBsYXlwW3BhZ2VudW1dLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICAgICAgdXJsOiAkKHBhZ2VhcnIsIDMpLnNlbGVjdCgobG9jYXRpb24pID0+IHtcXG4gICAgICAgICAgcHV0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBTdHJpbmcoTVlfSU5ERVgpKTtcXG4gICAgICAgICAgR00uZ2V0KFxcXCJyZW5vdmF0ZUxpc3RcXFwiLCAoKSA9PiB7IH0pKGxvY2F0aW9uKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgfSwgbG9jYXRpb24pLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgY2xzOiBcXFwicGxheXBhZ2VcXFwiXFxuICAgICAgICB9XFxuICAgICAgfSwge1xcbiAgICAgICAgdGl0bGU6ICfkuIvkuIDpobUnLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzRcXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChsb2NhdGlvbiwgcGNvdW50KSA9PiB7XFxuICAgICAgICAgIGxldCBwYWdlbnVtID0gZ2V0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgICBpZiAocGFnZW51bSA+PSBwY291bnQgLSAxKSB7XFxuICAgICAgICAgICAgcGFnZW51bSA9IDA7XFxuICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcGFnZW51bSsrO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIHB1dE15VmFyKFxcXCJwYWdlbnVtXFxcIiwgU3RyaW5nKHBhZ2VudW0pKTtcXG4gICAgICAgICAgR00uZ2V0KFxcXCJyZW5vdmF0ZUxpc3RcXFwiLCAoKSA9PiB7IH0pKGxvY2F0aW9uKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIGxvY2F0aW9uLCBwY291bnQpLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgY2xzOiBcXFwicGxheXBhZ2VcXFwiXFxuICAgICAgICB9XFxuICAgICAgfV0pXFxuICAgICAgLypwbGF5cCA9IHBsYXlwLm1hcCgoeCwgaSkgPT4ge1xcbiAgICAgICAgIGxldCBvYmogPSBPYmplY3QuYXNzaWduKHt9LCB0ZW1wLCB7XFxuICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyAocGFnZW51bSA9PSBpID8geC5mb250Y29sb3IoXFxcInJlZFxcXCIpIDogeCksXFxuICAgICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGkpID0+IHtcXG4gICAgICAgICAgICAgaWYgKGdldE15VmFyKFxcXCJwYWdlbnVtXFxcIikgPT0gaSkge1xcbiAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICBwdXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFN0cmluZyhpKSk7XFxuICAgICAgICAgICAgIGRlbGV0ZUl0ZW1CeUNscyhcXFwicGxheWxpc3RcXFwiKTtcXG4gICAgICAgICAgICAgYWRkSXRlbUFmdGVyKFxcXCJwbGF5bGlzdHNcXFwiLCAkLnRlbXBfbGlzdFtpXSk7XFxuICAgICAgICAgICAgIGZpbmRJdGVtc0J5Q2xzKFxcXCJwbGF5cGFnZVxcXCIpLmZvckVhY2goKHgsIGlpKSA9PiB7XFxuICAgICAgICAgICAgICAgbGV0IHRpdGxlID0geC50aXRsZS5yZXBsYWNlKC/igJh84oCZfOKAnHzigJ18PFtePl0rPi9nLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgaWYgKGlpID09IGkpIHtcXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gJ+KAnOKAnOKAneKAnScgKyB0aXRsZS5mb250Y29sb3IoXFxcInJlZFxcXCIpO1xcbiAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICB1cGRhdGVJdGVtKHguZXh0cmEuaWQsIHtcXG4gICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgfSwgaSksXFxuICAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih7fSwgdGVtcC5leHRyYSwge1xcbiAgICAgICAgICAgICBpZDogXFxcInBhZ2VudW1cXFwiICsgaSxcXG4gICAgICAgICAgIH0pXFxuICAgICAgICAgfSlcXG4gICAgICAgICByZXR1cm4gb2JqO1xcbiAgICAgICB9KVxcbiAgICAgICBhZGRJdGVtQWZ0ZXIoXFxcInBsYXlwYWdlbGluZVxcXCIsIHBsYXlwKSovXFxuICAgICAgIFxcbiAgICB9XFxuICAgIGlmKGdldE15VmFyKFxcXCJwbGF5bGlzdF9yZWFkeVxcXCIsXFxcIjBcXFwiKT09XFxcIjFcXFwiKXtcXG4gICAgICBsZXQgb2xkSWRzID0gKGZpbmRJdGVtc0J5Q2xzKCdwbGF5bGlzdCcpIHx8IFtdKS5tYXAoaXQgPT4gaXQuZXh0cmEuaWQpO1xcbiAgICAgIGxldCB0b0RlbGV0ZUlkcyA9IFtdOyAvL+W+heWIoOmZpOeahOaXp2lkXFxuICAgICAgbGV0IHRvQWRkRGF0YXMgPSBbXTsgLy/lvoXmlrDlop7nmoTmlrDmlbDmja5cXG4gICAgICBpZiAob2xkSWRzLmxlbmd0aCA+IGxpc3QubGVuZ3RoKSB7XFxuICAgICAgICB0b0RlbGV0ZUlkcyA9IG9sZElkcy5zbGljZShsaXN0Lmxlbmd0aCk7XFxuICAgICAgfSBlbHNlIGlmIChvbGRJZHMubGVuZ3RoIDwgbGlzdC5sZW5ndGgpIHtcXG4gICAgICAgIHRvQWRkRGF0YXMgPSBsaXN0LnNsaWNlKG9sZElkcy5sZW5ndGgpXFxuICAgICAgfVxcbiAgICAgIGxldCBjbnQgPSBNYXRoLm1pbihvbGRJZHMubGVuZ3RoLCBsaXN0Lmxlbmd0aCk7XFxuICAgICAgaWYgKHRvRGVsZXRlSWRzLmxlbmd0aCA+IDApIHtcXG4gICAgICAgIC8v5pyJ5Yig6Zmk55qE5YWI5Yig6ZmkXFxuICAgICAgICBkZWxldGVJdGVtKHRvRGVsZXRlSWRzKTtcXG4gICAgICB9XFxuICAgICAgaWYgKHRvQWRkRGF0YXMubGVuZ3RoID4gMCkge1xcbiAgICAgICAgLy/mnInmlrDlop7nmoTlhYjmlrDlop5cXG4gICAgICAgIGFkZEl0ZW1BZnRlcihvbGRJZHNbY250IC0gMV0sIHRvQWRkRGF0YXMpO1xcbiAgICAgIH1cXG4gICAgICAvL3Nob3dMb2FkaW5nKCfliqDovb3kuK0nKVxcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY250OyBpKyspIHtcXG4gICAgICAgIC8v5pyA5ZCO6aG65bqP5pu05pawXFxuICAgICAgICB1cGRhdGVJdGVtKG9sZElkc1tpXSwgbGlzdFtpXSk7XFxuICAgICAgfVxcbiAgICB9IGVsc2Uge1xcbiAgICAgIC8vbG9nKGxpc3QubGVuZ3RoKVxcbiAgICAgIGlmIChsaXN0KSB7XFxuICAgICAgICBhZGRJdGVtQWZ0ZXIoXFxcInBsYXlsaXN0c1xcXCIsIGxpc3QpO1xcbiAgICAgICAgcHV0TXlWYXIoXFxcInBsYXlsaXN0X3JlYWR5XFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgICB9XFxuICAgIH1cXG4gICAgdXBkYXRlSXRlbShcXFwibG9jYXRpb25AXFxcIiArIGN1cnJlbnRMb2NhdGlvbiwge1xcbiAgICAgIHRpdGxlOiBmcm9tW2N1cnJlbnRMb2NhdGlvbl0sXFxuICAgIH0pO1xcbiAgICB1cGRhdGVJdGVtKFxcXCJsb2NhdGlvbkBcXFwiICsgbG9jYXRpb24sIHtcXG4gICAgICB0aXRsZTogXFxcIuKAnOKAnFxcXCIgKyBmcm9tW2xvY2F0aW9uXSArIFxcXCLigJ3igJ1cXFwiLFxcbiAgICB9KTtcXG4gICAgY3VycmVudExvY2F0aW9uID0gbG9jYXRpb247XFxuICB9XFxuXFxuICBHTS5wdXQoXFxcInJlbm92YXRlTGlzdFxcXCIsIHJlbm92YXRlTGlzdCk7XFxuICBkLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImJpZ19ibGFua19ibG9ja1xcXCJcXG4gIH0pO1xcbiAgaWYgKGZyb20ubGVuZ3RoKSB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgY29sX3R5cGU6IFxcXCJiaWdfYmxhbmtfYmxvY2tcXFwiLFxcbiAgICB9KVxcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiBzb3J0b2JqW3NvcnRpXSxcXG4gICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHNvKSA9PiB7XFxuICAgICAgICBsZXQgc2kgPSBnZXRNeVZhcihcXFwic29ydGlcXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgbGV0IGlpID0gKHNpID09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIik7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJAc29ydFxcXCIsIHtcXG4gICAgICAgICAgdGl0bGU6IHNvW2lpXVxcbiAgICAgICAgfSlcXG4gICAgICAgIHZhciBwbGF5cyA9IGZpbmRJdGVtc0J5Q2xzKFxcXCJwbGF5bGlzdFxcXCIpLnJldmVyc2UoKS5tYXAoeCA9PiB7XFxuICAgICAgICAgIHguY29sX3R5cGUgPSB4LnR5cGU7XFxuICAgICAgICAgIHJldHVybiB4O1xcbiAgICAgICAgfSk7XFxuICAgICAgICBkZWxldGVJdGVtQnlDbHMoXFxcInBsYXlsaXN0XFxcIik7XFxuICAgICAgICBhZGRJdGVtQWZ0ZXIoXFxcInBsYXlsaXN0c1xcXCIsIHBsYXlzKTtcXG5cXG4gICAgICAgIHB1dE15VmFyKFxcXCJzb3J0aVxcXCIsIGlpKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSwgc29ydG9iaiksXFxuICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IFxcXCJAc29ydFxcXCIsXFxuICAgICAgfVxcbiAgICB9KVxcbiAgICBmb3IgKGxldCBpIGluIGZyb20pIHtcXG4gICAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGZyb21baV0sXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGksIGlkKSA9PiB7XFxuICAgICAgICAgIGlmIChnZXRNeVZhcihpZCArIFxcXCJzb3VyY2VpXFxcIiwgXFxcIjBcXFwiKSA9PSBpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBwdXRNeVZhcihpZCArIFxcXCJzb3VyY2VpXFxcIiwgU3RyaW5nKGkpKTtcXG4gICAgICAgICAgR00uZ2V0KFxcXCJyZW5vdmF0ZUxpc3RcXFwiLCAoKSA9PiB7IH0pKGkpO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgaSwgaWQpLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgaWQ6IFxcXCJsb2NhdGlvbkBcXFwiICsgaVxcbiAgICAgICAgfSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG4gICAgICB9KTtcXG4gICAgfVxcbiAgfVxcbiAgLy9jb25zb2xlLmxvZyhwbGF5VXJsTGlzdCk7XFxuICAvKmlmIChwbGF5VXJsTGlzdC5sZW5ndGgpIHtcXG4gICAgdmFyIGVqb2JqID0ge1xcbiAgICAgIFxcXCJsaXN0XFxcIjogcGxheVVybExpc3QsXFxuICAgICAgXFxcInRhYlxcXCI6IGZyb20ubWFwKCh4LCBpKSA9PiBmcm9tW2ldKVxcbiAgICB9O1xcbiAgICDliJ3lp4vljJYoZCwgZWpvYmopXFxuICB9IGVsc2Uge1xcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiBcXFwi5pqC5peg5pKt5pS+5rqQXFxcIixcXG4gICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxuICAgICAgdXJsOiBNWV9QQVJBTVMudm9kSWQsXFxuICAgIH0pO1xcbiAgfSovXFxuXFxuICBkLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICBpZDogXFxcInBsYXlwYWdlbGluZVxcXCJcXG4gICAgfVxcbiAgfSlcXG5cXG5cXG4gIGQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgaWQ6IFxcXCJwbGF5bGlzdHNcXFwiXFxuICAgIH1cXG4gIH0pO1xcblxcbiAgZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgaWQ6IFxcXCJwbGF5bGlzdHNFTkRcXFwiXFxuICAgIH1cXG4gIH0pO1xcbiAgY2FjaGVTaG93VGlwcygpO1xcbiAgc2V0UmVzdWx0KGQpO1xcbiAgcmVub3ZhdGVMaXN0KGdldE15VmFyKGlkICsgXFxcInNvdXJjZWlcXFwiLCBcXFwiMFxcXCIpKTtcXG59KSgpXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop6PmnpDmlofku7ZcIixcInBhdGhcIjpcImNvbmZpZ3NcIixcInJ1bGVcIjpcImNvbnN0IHBhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9EcnB5SGlrZXIvcGFyc2VzLmpzb25cXFwiO1xcbmNvbnN0IG9sZHBhdGg9IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0xveURnSWsvcGFyc2VzLmpzb25cXFwiO1xcbmxldCBkYXRhO1xcblxcbmZ1bmN0aW9uIGdldEpzb24oKSB7XFxuICAgIGlmKCFmaWxlRXhpc3QocGF0aCkmJmZpbGVFeGlzdChvbGRwYXRoKSl7XFxuICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShyZWFkRmlsZShvbGRwYXRoKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgIHNhdmVGaWxlKHBhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcXG4gICAgICAgIC8vZGVsZXRlRmlsZShvbGRwYXRoKTtcXG4gICAgfVxcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xcbiAgICAgICAgcmV0dXJuIGRhdGE7XFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHJlYWRGaWxlKHBhdGgpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBkZWxldGVGaWxlKHBhdGgpO1xcbiAgICAgICAgZGF0YSA9IFtdO1xcbiAgICB9XFxuICAgIHJldHVybiBkYXRhO1xcbn1cXG5cXG5mdW5jdGlvbiBzYXZlSnNvbihqc29uKSB7XFxuICAgIHNhdmVGaWxlKHBhdGgsIEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0VXNlZnVsSnNvbigpIHtcXG4gICAgcmV0dXJuIGdldEpzb24oKS5maWx0ZXIodiA9PiAhdi5mb3JiaWRkZW4pO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRGb3JiaWRkZW5Kc29uKCkge1xcbiAgICByZXR1cm4gZ2V0SnNvbigpLmZpbHRlcih2ID0+IHYuZm9yYmlkZGVuKTtcXG59XFxuXFxuJC5leHBvcnRzID0ge1xcbiAgICBnZXRKc29uLFxcbiAgICBzYXZlSnNvbixcXG4gICAgZ2V0VXNlZnVsSnNvbixcXG4gICAgZ2V0Rm9yYmlkZGVuSnNvbixcXG4gICAgcGF0aCxcXG59O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Kej5p6Q566h55CGXCIsXCJwYXRoXCI6XCJydWxlTWFuYWdlXCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcbnNldFBhZ2VUaXRsZShcXFwi6Kej5p6Q566h55CGXFxcIik7XFxubGV0IGNvbmZpZ3MgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKTtcXG5sZXQgYXJyID0gY29uZmlncy5nZXRKc29uKCk7XFxubGV0IGxlbmd0aCA9IGFyci5sZW5ndGg7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICB0aXRsZTogXFxcIuaPkOekulxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL3N5c3RlbS8yNy5wbmdcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgY29uc3QgaGlrZXJQb3AgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTY5NjZcXFwiKTtcXG4gICAgICAgIGxldCBwb3AgPSBoaWtlclBvcC5pbmZvQm90dG9tKHtcXG4gICAgICAgICAgICBvcHRpb25zOiBbXFxuICAgICAgICAgICAgICAgIFxcXCJb5bu66K6uXe+8muino+aekOWPqumcgOimgeS/neWtmOWwkemHj+WlveeUqOeahOWNs+WPr++8jOS4jemcgOimgeWkquWkmuOAglxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJb5o+Q56S6Xe+8muino+aekOacieaXtuaViOaIlumHjeWumuWQkeeahCfpq5jnuqcn6Kej5p6Q77yM5pys56iL5bqP5LiN5pSv5oyB77yM5bu66K6u5Yig6Zmk44CCXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcIltRJkFd77ya5Li65ZWl5Zyo57yW6L6R6aG16Z2i5rWL6K+V6Kej5p6Q5pe26IO955So77yM5L+d5a2Y5ZCO5YaN6KeG6aKR5rqQ5Lit5Y206Kej5p6Q5LiN5Ye65p2l77yfXFxcXG7kuI3nn6XpgZPvvIzmiJHnmoTop6PlhrPlip7ms5XmmK/lu7rorq7liKDpmaTjgIJcXFwiXFxuICAgICAgICAgICAgXSxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSksXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmlrDlop5cXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcnVsZUVkaXQjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCNcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2RvbWFpbl9jb25maWdcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgcGFnZVRpdGxlOiBcXFwi5paw5aKe6Kej5p6QXFxcIlxcbiAgICB9XFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLliIbkuqtcXFwiLFxcbiAgICB1cmw6ICQoXFxcIi0xXFxcIiwgXFxcIui+k+WFpeS9oOimgeWIhuS6q+ino+aekOeahOW6j+WPt1xcXFxuLTHlhajpg6jvvIwtMuW3suWQr+eUqOeahO+8jC0z5bey56aB55So55qEXFxcIikuaW5wdXQoKGxlbmd0aCkgPT4ge1xcbiAgICAgICAgbGV0IGluZGV4YyA9IGlucHV0LnNwbGl0KC8sfO+8jC8pO1xcbiAgICAgICAgbGV0IGluZGV4cyA9IFtdO1xcbiAgICAgICAgbGV0IG1vID0gcGFyc2VJbnQoaW5kZXhjWzBdKTtcXG4gICAgICAgIGlmICghKGluZGV4Yy5sZW5ndGggIT09IDAgJiYgbW8gPCAwICYmIG1vID4gLTUpKSB7XFxuICAgICAgICAgICAgZm9yIChsZXQgaXQgb2YgaW5kZXhjKSB7XFxuICAgICAgICAgICAgICAgIGxldCBudW0gPSBwYXJzZUludChpdCk7XFxuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4obnVtKSB8fCBudW0gPj0gbGVuZ3RoIHx8IG51bSA8IDApIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mlbDlrZfkuI3lkIjms5VcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGluZGV4cy5wdXNoKG51bSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcblxcbiAgICAgICAgcmV0dXJuICQoW1xcXCJISUtFUlxcXCIsIFxcXCJUWFRcXFwiXS5jb25jYXQoZ2V0UGFzdGVzKCkpLCAyLCBcXFwi5YiG5Lqr5pa55byPXFxcIikuc2VsZWN0KChtbywgaW5kZXhzLCBleHQpID0+IHtcXG4gICAgICAgICAgICBmdW5jdGlvbiB1cChydWxlcykge1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZWI2NCA9IGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShydWxlcykpO1xcbiAgICAgICAgICAgICAgICBsZXQgZ2V0UGFzcyA9IChsZW5ndGgsIHJ1bGUsIHR5cGUpID0+IFxcXCLmtbfpmJTop4bnlYzvvIxEUlBZ6Kej5p6Q77yM5YWx44CMXFxcIiArIGxlbmd0aCArIFxcXCLjgI3mnaHvvIzlpI3liLbmlbTmnaHlj6Pku6TmiZPlvIDova/ku7blsLHkvJroh6rliqjlr7zlhaUkXFxcIiArIHJ1bGUgKyBcXFwiJFxcXCIgKyB0eXBlICsgXFxcIkBpbXBvcnQ9anM6JC5yZXF1aXJlKCdpbXBvcnQ/cnVsZT0nK1xcXCIgKyBKU09OLnN0cmluZ2lmeShNWV9SVUxFLnRpdGxlKSArIFxcXCIpKGlucHV0KVxcXCI7XFxuICAgICAgICAgICAgICAgIGlmIChnZXRQYXN0ZXMoKS5pbmNsdWRlcyhpbnB1dCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gc2hhcmVQYXN0ZShydWxlYjY0LCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgZ2V0UGFzcyhydWxlcy5sZW5ndGgsIHUsIFxcXCJiXFxcIik7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0xveURnSWsvc2hhcmUvZHJweeino+aekOOAjFxcXCIgKyBydWxlcy5sZW5ndGggKyBcXFwi44CN5p2hLlxcXCIgKyAoaW5wdXQgPT09IFxcXCJISUtFUlxcXCIgPyBcXFwiaGlrZXJcXFwiIDogXFxcInR4dFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGgsIGdldFBhc3MocnVsZXMubGVuZ3RoLCBydWxlYjY0LCBcXFwiYVxcXCIpKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwic2hhcmU6Ly9cXFwiICsgcGF0aDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgcnVsZXM7XFxuICAgICAgICAgICAgaWYgKG1vID09PSAtMSkge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vID09PSAtMikge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldFVzZWZ1bEpzb24oKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vID09PSAtMykge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEZvcmJpZGRlbkpzb24oKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKS5maWx0ZXIoKHYsIGkpID0+IGluZGV4cy5pbmNsdWRlcyhpKSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJ1bGVzID0gcnVsZXMubWFwKCh2KSA9PiB7XFxuICAgICAgICAgICAgICAgIHYuZm9yYmlkZGVuID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdjtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdXAocnVsZXMpO1xcbiAgICAgICAgfSwgbW8sIGluZGV4cywgaW5kZXhjWzFdKTtcXG5cXG4gICAgfSwgbGVuZ3RoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9zaGFyZV9ncmVlblxcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumHjee9rlxcXCIsXFxuICAgIHVybDogJChcXFwi5L2g56Gu5a6a6YeN572u77yfXFxcXG7or6Xmk43kvZzkvJrliKDpmaTnjrDmnInop6PmnpDvvIzmgaLlpI3oh6rluKbop6PmnpDjgIJcXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICBkZWxldGVGaWxlKHBhdGgpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikucGF0aCksXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fcmVmcmVzaFxcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIua4heepulxcXCIsXFxuICAgIHVybDogJChcXFwi5L2g56Gu5a6a5YWo6YOo5Yig6Zmk77yfXFxcXG7or6Xmk43kvZzkvJrliKDpmaTnjrDmnInop6PmnpDjgIJcXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICB3cml0ZUZpbGUocGF0aCwgXFxcIltdXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5wYXRoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9jb2RlX3ZpZXdcXFwiXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgLy90aXRsZTogJzxmb250IGNvbG9yPVxcXCIjMTNCNjFCXFxcIj7ilpAgPC9mb250PjxiPuino+aekOWIl+ihqDxiPiAoJyArIFN0cmluZyhsZW5ndGgpLmZvbnRjb2xvcihcXFwiI2ZmNjYwMVxcXCIpICsgXFxcIilcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxufSk7XFxubGV0IGNvdW50VGl0bGUgPSBkLmF0KC0xKTtcXG5cXG5mdW5jdGlvbiB1bmlxdWVOZXN0ZWQoYXJyKSB7XFxuICAgIHJldHVybiBhcnIubWFwKGl0ZW0gPT4ge1xcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcXG4gICAgICAgICAgICByZXR1cm4gdW5pcXVlTmVzdGVkKGl0ZW0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGl0ZW07XFxuICAgIH0pLmZsYXQoSW5maW5pdHkpLmZpbHRlcigodmFsdWUsIGluZGV4LCBzZWxmKSA9PiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleCk7XFxufVxcbnZhciBpdHMgPSBbXVxcbmxldCBmbGFnaSA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJmbGFnaVxcXCIsIFtcXFwi5YWo6YOoXFxcIl0pO1xcbmxldCBjb3VudCA9IGl0cy5sZW5ndGg7XFxubGV0IGZsYWdzID0gdW5pcXVlTmVzdGVkKGFyci5tYXAoeCA9PiB4LmZsYWcuc3BsaXQoXFxcInxcXFwiKSkpO1xcbmZsYWdzLnVuc2hpZnQoXFxcIuW3suemgeeUqFxcXCIpO1xcbmZsYWdzLnVuc2hpZnQoXFxcIuWFqOmDqFxcXCIpO1xcblxcbmxldCBzaG93ID0gZ2V0TXlWYXIoXFxcImZsYWdzaG93XFxcIiwgXFxcIlxcXCIpO1xcbmxldCBjb2wgPSBzaG93ID09IFxcXCLlsZXlvIBcXFwiID8gXFxcImZsZXhfYnV0dG9uXFxcIiA6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIjtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogc2hvdyA9PSBcXFwi5bGV5byAXFxcIiA/IFxcXCLigJzigJzigJ3igJ08Yj5cXFwiICsgXFxcIuKIp1xcXCIuZm9udGNvbG9yKFxcXCIjMWFhZDE5XFxcIikgKyBcXFwiPC9iPlxcXCIgOiBcXFwi4oCc4oCc4oCd4oCdPGI+XFxcIiArIFxcXCLiiKhcXFwiLmZvbnRjb2xvcihcXFwiI0ZGMDAwMFxcXCIpICsgXFxcIjwvYj5cXFwiLFxcbiAgICBjb2xfdHlwZTogY29sLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgbGV0IHNob3cgPSBnZXRNeVZhcihcXFwiZmxhZ3Nob3dcXFwiLCBcXFwi5bGV5byAXFxcIik7XFxuICAgICAgICBwdXRNeVZhcihcXFwiZmxhZ3Nob3dcXFwiLCBzaG93ID09IFxcXCLlsZXlvIBcXFwiID8gXFxcIuaUtui1t1xcXCIgOiBcXFwi5bGV5byAXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSlcXG59KVxcblxcblxcbmZsYWdzLmZvckVhY2goZiA9PiB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyAoZmxhZ2kuaW5jbHVkZXMoZikgPyBmLmZvbnRjb2xvcihcXFwiIzEzQjYxQlxcXCIpIDogZiksXFxuICAgICAgICBjb2xfdHlwZTogY29sLFxcbiAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChmKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGZsYWdpID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImZsYWdpXFxcIiwgW1xcXCLlhajpg6hcXFwiXSk7XFxuICAgICAgICAgICAgaWYgKC8o5YWo6YOofOW3suemgeeUqCkvLnRlc3QoZikpIHtcXG4gICAgICAgICAgICAgICAgZmxhZ2kgPSBbZl1cXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBmbGFnaSA9IGZsYWdpLmZpbHRlcih4ID0+ICEvKOWFqOmDqHzlt7LnpoHnlKgpLy50ZXN0KHgpKTtcXG4gICAgICAgICAgICAgICAgaWYgKGZsYWdpLmluY2x1ZGVzKGYpKSB7XFxuICAgICAgICAgICAgICAgICAgICBmbGFnaSA9IGZsYWdpLmZpbHRlcih4ID0+IHggIT0gZik7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ2kubGVuZ3RoID09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnaSA9IFtcXFwi5YWo6YOoXFxcIl1cXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGZsYWdpLnB1c2goZilcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwiZmxhZ2lcXFwiLCBmbGFnaSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgZilcXG4gICAgfSlcXG59KVxcbmZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcXG4gICAgbGV0IGl0ID0gYXJyW2ldO1xcblxcbiAgICBsZXQgZmxhZyA9IGl0LmZsYWcuc3BsaXQoXFxcInxcXFwiKTtcXG4gICAgaWYgKGZsYWdpLmxlbmd0aCA+IDAgJiYgIVtcXFwi5YWo6YOoXFxcIiwgXFxcIuW3suemgeeUqFxcXCJdLmluY2x1ZGVzKGZsYWdpWzBdKSkge1xcbiAgICAgICAgaWYgKCFmbGFnaS5ldmVyeShmID0+IGZsYWcuaW5jbHVkZXMoZikpKSB7XFxuICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaWYgKFtcXFwi5bey56aB55SoXFxcIl0uaW5jbHVkZXMoZmxhZ2lbMF0pKSB7XFxuICAgICAgICBpZiAoIWl0Lmhhc093blByb3BlcnR5KFxcXCJmb3JiaWRkZW5cXFwiKSB8fCAhaXQuZm9yYmlkZGVuKSB7XFxuICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaXRzLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ1bJyArIGkgKyAnXTxiPiAgJyArIGl0Lm5hbWUgKyAoaXQuZm9yYmlkZGVuID8gXFxcIiAj4oCc4oCc56aB55So4oCd4oCdXFxcIi5zbWFsbCgpIDogXFxcIlxcXCIpLFxcbiAgICAgICAgZGVzYzogaXQudXJsLFxcbiAgICAgICAgZm9yYmlkZGVuOiBpdC5mb3JiaWRkZW4sXFxuICAgICAgICB1cmw6ICQoW1xcXCLnvJbovpFcXFwiLCBcXFwi5YiG5LqrXFxcIiwgXFxcIuemgeeUqC/lkK/nlKhcXFwiLCBcXFwi56e75YqoXFxcIiwgXFxcIue9rumhtlxcXCIsIFxcXCLliKDpmaRcXFwiXSwgMSwgXFxcIuaTjeS9nO+8mlxcXCIgKyBpdC5uYW1lKS5zZWxlY3QoKGluZGV4LCBsZW5ndGgpID0+IHtcXG4gICAgICAgICAgICBpZiAoaW5wdXQgPT09IFxcXCLnvJbovpFcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVFZGl0I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5YiG5LqrXFxcIikge1xcbiAgICAgICAgICAgICAgICBsZXQgb3BzID0gZ2V0UGFzdGVzKCk7XFxuICAgICAgICAgICAgICAgIG9wcy51bnNoaWZ0KFxcXCLlrozmlbTlj6Pku6RcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQob3BzLCAyLCBcXFwi5YiG5Lqr5pa55byPXFxcIikuc2VsZWN0KChpbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKClbaW5kZXhdO1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZS51c2VyID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZS5mb3JiaWRkZW4gPSB1bmRlZmluZWQ7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZWI2NCA9IGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShydWxlKSk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgZ2V0UGFzcyA9IChuYW1lLCBydWxlLCB0eXBlKSA9PiBcXFwi5rW36ZiU6KeG55WM77yM44CMXFxcIiArIG5hbWUgKyBcXFwi44CNRFJQWeino+aekO+8jOWkjeWItuaVtOadoeWPo+S7pOaJk+W8gOi9r+S7tuWwseS8muiHquWKqOWvvOWFpSRcXFwiICsgcnVsZSArIFxcXCIkXFxcIiArIHR5cGUgKyBcXFwiQGltcG9ydD1qczokLnJlcXVpcmUoJ2ltcG9ydD9ydWxlPScrXFxcIiArIEpTT04uc3RyaW5naWZ5KE1ZX1JVTEUudGl0bGUpICsgXFxcIikoaW5wdXQpXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PSBcXFwi5a6M5pW05Y+j5LukXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBnZXRQYXNzKHJ1bGUubmFtZSwgcnVsZWI2NCwgXFxcImFcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBzaGFyZVBhc3RlKHJ1bGViNjQsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgZ2V0UGFzcyhydWxlLm5hbWUsIHUsIFxcXCJiXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0sIGluZGV4KTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi56e75YqoXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChpbmRleCArIFxcXCJcXFwiLCBcXFwi6L6T5YWl5L2N572uXFxcIikuaW5wdXQoKGluZGV4LCBsZW5ndGgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdJbmRleCA9IE51bWJlcihpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKG5ld0luZGV4KSB8fCBuZXdJbmRleCA+PSBsZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LiN5ZKM6KeE55qE5L2N572uXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gcnVsZXMuc3BsaWNlKGluZGV4LCAxKVswXTtcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVzLnNwbGljZShuZXdJbmRleCwgMCwgcnVsZSk7XFxuICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihydWxlcyk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIH0sIGluZGV4LCBsZW5ndGgpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLnva7pobZcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGxldCBuZXdJbmRleCA9IDA7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBydWxlcy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xcbiAgICAgICAgICAgICAgICBydWxlcy5zcGxpY2UobmV3SW5kZXgsIDAsIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihydWxlcyk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5Yig6ZmkXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChcXFwi56Gu6K6k5Yig6Zmk77yfXFxcIikuY29uZmlybSgoaW5kZXgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gcnVsZXMuc3BsaWNlKGluZGV4LCAxKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKHJ1bGVzKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LliKDpmaRcXFwiICsgcnVsZS5uYW1lO1xcbiAgICAgICAgICAgICAgICB9LCBpbmRleCk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBhcnJbaW5kZXhdO1xcbiAgICAgICAgICAgICAgICBydWxlLmZvcmJpZGRlbiA9ICFydWxlLmZvcmJpZGRlbjtcXG4gICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24oYXJyKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAvL3JldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgKHJ1bGUuZm9yYmlkZGVuID8gXFxcIuemgeeUqFxcXCIgOiBcXFwi5ZCv55SoXFxcIikgKyBydWxlLm5hbWU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgaSwgbGVuZ3RoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaTogaSxcXG4gICAgICAgICAgICBwYWdlVGl0bGU6IGl0Lm5hbWVcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufVxcblxcbmNvdW50VGl0bGUudGl0bGUgPSAnPGZvbnQgY29sb3I9XFxcIiMxM0I2MUJcXFwiPuKWkCA8L2ZvbnQ+PGI+6Kej5p6Q5YiX6KGoPGI+ICgnICsgKChpdHMubGVuZ3RoIC0gY291bnQpICsgXFxcIi9cXFwiICsgbGVuZ3RoKS5mb250Y29sb3IoXFxcIiNmZjY2MDFcXFwiKSArIFxcXCIpXFxcIjtcXG5cXG5kID0gZC5jb25jYXQoaXRzKTtcXG5cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop6PmnpDnvJbovpFcIixcInBhdGhcIjpcInJ1bGVFZGl0XCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcblxcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX25hbWVcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfdXJsXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX2ZsYWdcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfaGVhZGVyc1xcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19tZXRob2RcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfcnVuVHlwZVxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19qc29uUGF0aFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19qc1xcXCIpO1xcbn0pKTtcXG5sZXQgdXJsSW5kZXggPSBwYXJzZUludChnZXRQYXJhbShcXFwiaW5kZXhcXFwiLCBcXFwiXFxcIikpO1xcbnVybEluZGV4ID0gTnVtYmVyLmlzTmFOKHVybEluZGV4KSA/IHZvaWQoMCkgOiB1cmxJbmRleDtcXG5sZXQgaW5kZXggPSB2b2lkKDApID09PSB1cmxJbmRleCA/IE1ZX1BBUkFNUy5pIDogdXJsSW5kZXg7XFxubGV0IGlzSW1wb3J0ID0gISFnZXRQYXJhbShcXFwiaXNJbXBvcnRcXFwiLCBcXFwiXFxcIik7XFxubGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG5sZXQgb2JqO1xcbmlmIChpc0ltcG9ydCkge1xcbiAgICB0cnkge1xcbiAgICAgICAgb2JqID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS9qaWV4aVNpbXBsZUltcG9ydC5qc29uXFxcIik7XFxuICAgICAgICBsZXQgdGlwID0gaW5kZXggIT09IHZvaWQoMCkgPyBcXFwi5pu05paw6Kej5p6QXFxcIiA6IFxcXCLlr7zlhaXop6PmnpBcXFwiO1xcbiAgICAgICAgc2V0UGFnZVRpdGxlKHRpcCArIFxcXCI6XFxcIiArIG9iai5uYW1lKTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJjigJhcXFwiICsgdGlwICsgXFxcIuKAmeKAmVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG5cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgb2JqID0ge307XFxuICAgICAgICBiYWNrKCk7XFxuICAgICAgICB0b2FzdChcXFwi5a+85YWl6ZSZ6K+vXFxcIik7XFxuICAgIH1cXG59IGVsc2UgaWYgKGluZGV4ICE9PSB2b2lkKDApKSB7XFxuICAgIG9iaiA9IGFycltpbmRleF07XFxuICAgIHNldFBhZ2VUaXRsZShcXFwi57yW6L6R6Kej5p6QOlxcXCIgKyBvYmoubmFtZSk7XFxufSBlbHNlIHtcXG4gICAgb2JqID0ge1xcbiAgICAgICAgcnVuVHlwZTogXFxcIldFQlxcXCIsXFxuICAgICAgICBtZXRob2Q6IFxcXCJHRVRcXFwiXFxuICAgIH07XFxuICAgIHNldFBhZ2VUaXRsZShcXFwi5paw5bu66Kej5p6QXFxcIik7XFxufVxcblxcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5ZCN5a2XKOW/heWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19uYW1lXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5uYW1lLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuXFxuXFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLop6PmnpB1cmwo5b+F5aGrKVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX3VybFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBvYmoudXJsLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwiZmxhZyjlv4XloaspXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6IDIsXFxuICAgICAgICBoaWdobGlnaHQ6IHRydWUsXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX2ZsYWdcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcInBzX2ZsYWdcXFwiLG9iai5mbGFnfHxcXFwicWl5aXxpbWdvfOeIseWlh+iJunzlpYfoibp8cXF8cXEg6aKE5ZGK5Y+K6Iqx57WufOiFvuiur3x5b3VrdXzkvJjphbd8cHB0dnxQUFRWfGxldHZ85LmQ6KeGfGxlc2hpfG1ndHZ86IqS5p6cfHNvaHV8eGlndWF8ZnVufOmjjuihjFxcXCIpLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwiaGVhZGVycyjpgInloaspXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6IDIsXFxuICAgICAgICBoaWdobGlnaHQ6IHRydWUsXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX2hlYWRlcnNcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLmhlYWRlcnMsXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICB9XFxufSk7XFxuXFxucHV0TXlWYXIoXFxcInBzX3J1blR5cGVcXFwiLCBvYmoucnVuVHlwZSB8fCBcXFwiXFxcIik7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLop6PmnpDmqKHlvI/vvJpcXFwiICsgKG9iai5ydW5UeXBlIHx8IFxcXCJXRUJcXFwiKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiAkKFtcXFwiV0VCXFxcIiwgXFxcIkpTT05cXFwiLCBcXFwiSlNcXFwiXSkuc2VsZWN0KCgpID0+IHtcXG5cXG4gICAgICAgIHB1dE15VmFyKFxcXCJwc19ydW5UeXBlXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgdXBkYXRlSXRlbShcXFwicHNfcnVuVHlwZVxcXCIsIHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuino+aekOaooeW8j++8mlxcXCIgKyBpbnB1dFxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9KSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBcXFwicHNfcnVuVHlwZVxcXCIsXFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgfVxcbn0pO1xcblxcblxcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcImpzb25QYXRoKEpTT07op6PmnpDmqKHlvI/lv4XloaspXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfanNvblBhdGhcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLmpzb25QYXRoLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgfVxcbn0pO1xcbnB1dE15VmFyKFxcXCJwc19tZXRob2RcXFwiLCBvYmoubWV0aG9kIHx8IFxcXCJcXFwiKTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIkpTT07or7fmsYLmqKHlvI/vvJpcXFwiICsgKG9iai5tZXRob2QgfHwgXFxcIkdFVFxcXCIpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogJChbXFxcIkdFVFxcXCIsIFxcXCJQT1NUXFxcIl0pLnNlbGVjdCgoKSA9PiB7XFxuXFxuICAgICAgICBwdXRNeVZhcihcXFwicHNfbWV0aG9kXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgdXBkYXRlSXRlbShcXFwicHNfbWV0aG9kXFxcIiwge1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwiSlNPTuivt+axguaooeW8j++8mlxcXCIgKyBpbnB1dFxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9KSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBcXFwicHNfbWV0aG9kXFxcIixcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwianMoSlPmqKHlvI/lv4XloaspXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6IDMsXFxuICAgICAgICBoaWdobGlnaHQ6IHRydWUsXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX2pzXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5qcyxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLliKDpmaRcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGluZGV4LCB1cmxJbmRleCkgPT4ge1xcbiAgICAgICAgaWYgKGluZGV4ID09PSB2b2lkKDApKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+atpOmhueaXoOazleWIoOmZpFxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAodXJsSW5kZXggIT09IHZvaWQoMCkpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5q2j5Zyo5pu05paw6Kej5p6Q77yM5Yig6Zmk6K+35LuO6Kej5p6Q566h55CG6L+b5YWlXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGNvbmZpcm0oe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5rip6aao5o+Q56S6XFxcIixcXG4gICAgICAgICAgICBjb250ZW50OiBcXFwi56Gu5a6a6KaB5Yig6Zmk5q2k6Kej5p6Q5ZCX77yf5rOo5oSP5Yig6Zmk5ZCO5peg5rOV5oGi5aSNXFxcIixcXG4gICAgICAgICAgICBjb25maXJtOiAkLnRvU3RyaW5nKChpbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgYXJyID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxKTtcXG4gICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24oYXJyKTtcXG4gICAgICAgICAgICAgICAgYmFjayh0cnVlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSwgaW5kZXgpXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfSwgaW5kZXgsIHVybEluZGV4KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5rWL6K+VXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIGxldCB0ZXN0S2V5d29yZCA9IGdldEl0ZW0oXFxcInRlc3RVcmxcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICByZXR1cm4gJCh0ZXN0S2V5d29yZCwgXFxcIuivt+i+k+WFpeW9seinhue9keermeWcsOWdgFxcXCIpLmlucHV0KCgpID0+IHtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJ0ZXN0VXJsXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBnZXRNeVZhcihcXFwicHNfdXJsXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGxldCBuYW1lID0gZ2V0TXlWYXIoXFxcInBzX25hbWVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgbGV0IGZsYWcgPSBnZXRNeVZhcihcXFwicHNfZmxhZ1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBsZXQgaGVhZGVycyA9IGdldE15VmFyKFxcXCJwc19oZWFkZXJzXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGxldCBydW5UeXBlID0gZ2V0TXlWYXIoXFxcInBzX3J1blR5cGVcXFwiLCBcXFwiV0VCXFxcIik7XFxuICAgICAgICAgICAgbGV0IG1ldGhvZCA9IGdldE15VmFyKFxcXCJwc19tZXRob2RcXFwiLCBcXFwiR0VUXFxcIik7XFxuICAgICAgICAgICAgbGV0IGpzb25QYXRoID0gZ2V0TXlWYXIoXFxcInBzX2pzb25QYXRoXFxcIiwgXFxcIlxcXCIpLnRyaW0oKSB8fCB2b2lkIDA7XFxuICAgICAgICAgICAgbGV0IGpzID0gZ2V0TXlWYXIoXFxcInBzX2pzXFxcIiwgXFxcIlxcXCIpIHx8IHZvaWQgMDtcXG4gICAgICAgICAgICBpZiAoaGVhZGVycykge1xcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyA9IEpTT04ucGFyc2UoaGVhZGVycyk7XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGVhZGVyc+agvOW8j+mUmeivrzpcXFwiICsgZS50b1N0cmluZygpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcInZpZGVvVXJsXFxcIikucHJlcGFyZVBhcnNlcyhbe1xcbiAgICAgICAgICAgICAgICBuYW1lLFxcbiAgICAgICAgICAgICAgICB1cmwsXFxuICAgICAgICAgICAgICAgIGZsYWcsXFxuICAgICAgICAgICAgICAgIGhlYWRlcnMsXFxuICAgICAgICAgICAgICAgIHJ1blR5cGUsXFxuICAgICAgICAgICAgICAgIG1ldGhvZCxcXG4gICAgICAgICAgICAgICAganNvblBhdGgsXFxuICAgICAgICAgICAgICAgIGpzXFxuICAgICAgICAgICAgfV0sIGlucHV0LG51bGwsIHRydWUpO1xcbiAgICAgICAgfSk7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLkv53lrZhcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGluZGV4LCBpc0ltcG9ydCkgPT4ge1xcbiAgICAgICAgbGV0IG5hbWUgPSBnZXRNeVZhcihcXFwicHNfbmFtZVxcXCIsIFxcXCJcXFwiKS50cmltKCk7XFxuICAgICAgICBpZiAoIW5hbWUpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5ZCN5a2X5b6X5pyJ5LiA5Liq5ZCnXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCB1cmwgPSBnZXRNeVZhcihcXFwicHNfdXJsXFxcIiwgXFxcIlxcXCIpLnRyaW0oKTtcXG4gICAgICAgIGlmICghdXJsKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ino+aekOWcsOWdgOS4jeiDveS4uuepulxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgZmxhZyA9IGdldE15VmFyKFxcXCJwc19mbGFnXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgaWYgKCFmbGFnKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ino+aekOWcsOWdgOagh+ivhuS4jeiDveS4uuepulxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgaGVhZGVycyA9IGdldE15VmFyKFxcXCJwc19oZWFkZXJzXFxcIiwgXFxcIlxcXCIpLnRyaW0oKTtcXG4gICAgICAgIGlmIChoZWFkZXJzKSB7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgaGVhZGVycyA9IEpTT04ucGFyc2UoaGVhZGVycyk7XFxuICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBoZWFkZXJzIT09XFxcIm9iamVjdFxcXCIpIHRocm93IG5ldyBFcnJvcihcXFwi6ZSZ6K+v57G75Z6L77yM5b+F6aG75Li6T2JqZWN0XFxcIik7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhlYWRlcnPmoLzlvI/plJnor686XFxcIiArIGUudG9TdHJpbmcoKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcnVuVHlwZSA9IGdldE15VmFyKFxcXCJwc19ydW5UeXBlXFxcIiwgXFxcIldFQlxcXCIpO1xcbiAgICAgICAgbGV0IG1ldGhvZCA9IGdldE15VmFyKFxcXCJwc19tZXRob2RcXFwiLCBcXFwiR0VUXFxcIik7XFxuICAgICAgICBsZXQganNvblBhdGggPSBnZXRNeVZhcihcXFwicHNfanNvblBhdGhcXFwiLCBcXFwiXFxcIikudHJpbSgpIHx8IHZvaWQgMDtcXG4gICAgICAgIGxldCBqcyA9IGdldE15VmFyKFxcXCJwc19qc1xcXCIsIFxcXCJcXFwiKSB8fCB2b2lkIDA7XFxuICAgICAgICBpZiAocnVuVHlwZSA9PT0gXFxcIkpTT05cXFwiICYmICFqc29uUGF0aCkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9KU09O5qih5byP5LiL5b+F6aG75aGranNvblBhdGhcXFwiO1xcbiAgICAgICAgfSBlbHNlIGlmIChydW5UeXBlID09PSBcXFwiSlNcXFwiICYmICFqcykge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9KU+aooeW8j+S4i+W/hemhu+Whq2pzXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICBsZXQgb2JqMSA9IHtcXG4gICAgICAgICAgICBuYW1lLFxcbiAgICAgICAgICAgIHVybCxcXG4gICAgICAgICAgICBmbGFnLFxcbiAgICAgICAgICAgIGhlYWRlcnMsXFxuICAgICAgICAgICAgcnVuVHlwZSxcXG4gICAgICAgICAgICBtZXRob2QsXFxuICAgICAgICAgICAganNvblBhdGgsXFxuICAgICAgICAgICAganNcXG4gICAgICAgIH07XFxuICAgICAgICBpZiAoaW5kZXggPT09IHZvaWQoMCkpIHtcXG4gICAgICAgICAgICBpZiAoYXJyLnNvbWUodiA9PiB2Lm5hbWUgPT09IG5hbWUpKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lnu4/lrZjlnKjor6Xop6PmnpBcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAob2JqMS5ncm91cCkge1xcbiAgICAgICAgICAgICAgICBsZXQgZ3JvdXAgPSBvYmoxLmdyb3VwO1xcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBhcnIuZmluZEluZGV4KHYgPT4gdi5ncm91cCA9PT0gZ3JvdXApO1xcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XFxuICAgICAgICAgICAgICAgICAgICBhcnIudW5zaGlmdChvYmoxKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDAsIG9iajEpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgaWYgKGlzSW1wb3J0KSB7XFxuICAgICAgICAgICAgICAgICAgICBhcnIucHVzaChvYmoxKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGFyci51bnNoaWZ0KG9iajEpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsZXQgbmFtZXkgPSBhcnJbaW5kZXhdLm5hbWU7XFxuICAgICAgICAgICAgaWYgKG5hbWUgIT09IG5hbWV5KSB7XFxuICAgICAgICAgICAgICAgIGlmIChhcnIuc29tZSh2ID0+IHYubmFtZSA9PT0gbmFtZSkpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lnu4/lrZjlnKjor6Xop6PmnpBcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIG9iajEgPSBPYmplY3QuYXNzaWduKGFycltpbmRleF0sIG9iajEpO1xcbiAgICAgICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDEsIG9iajEpO1xcbiAgICAgICAgfVxcbiAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24oYXJyKTtcXG4gICAgICAgIGJhY2sodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+d5a2Y5oiQ5YqfXFxcIjtcXG4gICAgfSwgaW5kZXgsIGlzSW1wb3J0KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbn0pO1xcblxcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuino+aekOWvvOWFpVwiLFwicGF0aFwiOlwiaW1wb3J0XCIsXCJydWxlXCI6XCJqczpcXG5mdW5jdGlvbiBzYXZlQ2FjaGUoanNvbikge1xcbiAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL2ppZXhpU2ltcGxlSW1wb3J0Lmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShqc29uKSk7XFxufVxcblxcbmZ1bmN0aW9uIGltcG9ydFBhcnNlKHBhc3MpIHtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBbXywgcnVsZSwgdHlwZV0gPSBwYXNzLnNwbGl0KFxcXCIkXFxcIik7XFxuICAgICAgICBpZiAodHlwZSA9PT0gXFxcImJcXFwiKSB7XFxuICAgICAgICAgICAgcnVsZSA9IHBhcnNlUGFzdGUocnVsZSk7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcnVsZXMgPSBKU09OLnBhcnNlKGJhc2U2NERlY29kZShydWxlKSk7XFxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocnVsZXMpKSB7XFxuICAgICAgICAgICAgcnVsZXMgPSBbcnVsZXNdO1xcbiAgICAgICAgfVxcbiAgICAgICAgLy9ydWxlcy5yZXZlcnNlKCk7XFxuICAgICAgICBNWV9VUkwgPSBtb2R1bGUuaWQ7XFxuICAgICAgICBsZXQgcnVsZVRpdGxlID0gZ2V0UGFyYW0oXFxcInJ1bGVcXFwiKTtcXG4gICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3M/cnVsZT1cXFwiICsgcnVsZVRpdGxlKS5nZXRKc29uKCk7XFxuICAgICAgICBsZXQgbmV3SSA9IDA7XFxuICAgICAgICBmb3IgKGxldCBydWxlIG9mIHJ1bGVzKSB7XFxuICAgICAgICAgICAgbGV0IGluZGV4ID0gYXJyLmZpbmRJbmRleCh2ID0+IHYubmFtZSA9PT0gcnVsZS5uYW1lKTtcXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xcbiAgICAgICAgICAgICAgICBydWxlID0gT2JqZWN0LmFzc2lnbihhcnJbaW5kZXhdLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgYXJyLnNwbGljZShpbmRleCwgMSwgcnVsZSk7XFxuICAgICAgICAgICAgICAgIGlmIChydWxlcy5sZW5ndGggPT09IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHNhdmVDYWNoZShydWxlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVFZGl0I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5Iz9pc0ltcG9ydD10cnVlJmluZGV4PVxcXCIgKyBpbmRleCArIFxcXCImcnVsZT1cXFwiICsgcnVsZVRpdGxlO1xcbiAgICAgICAgICAgICAgICAgICAgLy90b2FzdChcXFwi5bey5pu05paw6KeE5YiZ77yaXFxcIiArIHJ1bGUubmFtZSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBsb2coXFxcIuW3suabtOaWsOinhOWIme+8mlxcXCIgKyBydWxlLm5hbWUpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBuZXdJKys7XFxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHJ1bGUpO1xcbiAgICAgICAgICAgICAgICBpZiAocnVsZXMubGVuZ3RoID09PSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICBzYXZlQ2FjaGUocnVsZSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9ydWxlRWRpdCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSM/aXNJbXBvcnQ9dHJ1ZSZydWxlPVxcXCIgKyBydWxlVGl0bGU7XFxuICAgICAgICAgICAgICAgICAgICAvL3RvYXN0KFxcXCLlt7Llr7zlhaXop4TliJnvvJpcXFwiICsgcnVsZS5uYW1lKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhcXFwi5bey5a+85YWl6KeE5YiZ77yaXFxcIiArIHJ1bGUubmFtZSlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChydWxlcy5sZW5ndGggPiAxKSB7XFxuICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzP3J1bGU9XFxcIiArIHJ1bGVUaXRsZSkuc2F2ZUpzb24oYXJyKTtcXG4gICAgICAgICAgICB0b2FzdChcXFwi5paw5aKe77yaXFxcIiArIG5ld0kgKyBcXFwiIOimhuebluabtOaWsO+8mlxcXCIgKyAocnVsZXMubGVuZ3RoIC0gbmV3SSkpO1xcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgIHRvYXN0KFxcXCLlr7zlhaXlpLHotKVcXFwiKTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBpbXBvcnRSdWxlKHBhc3MpIHtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBbXywgcnVsZSwgcG5hbWVdID0gcGFzcy5zcGxpdChcXFwiJFxcXCIpO1xcbiAgICAgICAgbGV0IHBhdGggPSBnZXRQdWJsaWNJdGVtKFxcXCJEcnB5SGlrZXJAaW5wdXRfcGF0aFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGlmICghcGF0aCkge1xcbiAgICAgICAgICAgIE1ZX1VSTCA9IG1vZHVsZS5pZDtcXG4gICAgICAgICAgICBsZXQgcnVsZVRpdGxlID0gZ2V0UGFyYW0oXFxcInJ1bGVcXFwiKTtcXG4gICAgICAgICAgICB0b2FzdChcXFwi5pyq5oyH5a6a6buY6K6k5L+d5a2Y55uu5b2V77yM6K+35YWI6K6+572u5L+d5a2Y55uu5b2VXFxcIik7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2Uvc2hhcmVkZWZhdWx0cGF0aCNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/cnVsZT1cXFwiK3J1bGVUaXRsZTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBydWxlcyA9IGJhc2U2NERlY29kZShwYXJzZVBhc3RlKHJ1bGUpKTtcXG4gICAgICAgIGlmICghcnVsZXMpIHRvYXN0KFxcXCLlhoXlrrnkuLrnqbrvvIzlr7zlhaXlpLHotKVcXFwiKTtcXG4gICAgICAgIHBhdGggPSBwYXRoLmVuZHNXaXRoKFxcXCIvXFxcIikgPyBwYXRoIDogKHBhdGggKyBcXFwiL1xcXCIpO1xcbiAgICAgICAgd3JpdGVGaWxlKHBhdGggKyBwbmFtZSwgcnVsZXMpO1xcbiAgICAgICAgdG9hc3QoXFxcIuWvvOWFpeaIkOWKn+ivt+WIt+aWsOmFjee9rlxcXCIpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB0b2FzdChcXFwi5a+85YWl5aSx6LSlOlxcXCIgKyBlLnRvU3RyaW5nKCkpXFxuICAgIH1cXG59XFxuJC5leHBvcnRzID0gZnVuY3Rpb24ocGFzcywgbW9kZSkge1xcbiAgICBpZiAobW9kZSkge1xcbiAgICAgICAgcmV0dXJuIGltcG9ydFJ1bGUocGFzcyk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gaW1wb3J0UGFyc2UocGFzcyk7XFxuICAgIH1cXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop4bpopHop6PmnpBcIixcInBhdGhcIjpcInZpZGVvVXJsXCIsXCJydWxlXCI6XCJmdW5jdGlvbiBpc29mZmljaWFsKHVybCkge1xcbiAgbGV0IGZsYWcgPSBuZXcgUmVnRXhwKCdxcVxcXFwuY29tfGlxaXlpXFxcXC5jb218eW91a3VcXFxcLmNvbXxtZ3R2XFxcXC5jb218YmlsaWJpbGlcXFxcLmNvbXxzb2h1XFxcXC5jb218aXhpZ3VhXFxcXC5jb218cHB0dlxcXFwuY29tfG1pZ3V2aWRlb1xcXFwuY29tfGxlXFxcXC5jb218MTkwNVxcXFwuY29tfGZ1blxcXFwudHYnKTtcXG4gIHJldHVybiBmbGFnLnRlc3QodXJsKTtcXG59XFxuXFxuXFxuZnVuY3Rpb24gcHJlcGFyZVBhcnNlcyhwYXJzZXMsIHVybCwgcGxheWxpc3QsIGlzVGVzdCwgZmxhZykge1xcbiAgcGxheWxpc3QgPSBwbGF5bGlzdCB8fCB7XFxuICAgIHVybHM6IFtdLFxcbiAgICBuYW1lczogW10sXFxuICAgIGhlYWRlcnM6IFtdLFxcbiAgICBpczogXFxcIiNpc1ZpZGVvPXRydWUjXFxcIixcXG4gIH07XFxuICBsZXQgUHJveHkgPSAkLnJlcXVpcmUoXFxcIkxvY2FsUHJveHlcXFwiKTtcXG4gIGxldCBwcm94eVVybCA9IFByb3h5LnN0YXJ0UHJveHkoTVlfUlVMRS50aXRsZSwgR00uZ2V0U2VsZktleSgpKTtcXG4gIHBhcnNlcy5mb3JFYWNoKCh2LCBpKSA9PiB7XFxuICAgIGlmICghaXNUZXN0ICYmICh2LmZvcmJpZGRlbiB8fCAhU3RyaW5nKHYuZmxhZykuc3BsaXQoXFxcInxcXFwiKS5pbmNsdWRlcyhmbGFnKSkpIHJldHVybjtcXG4gICAgcGxheWxpc3QubmFtZXMucHVzaCh2Lm5hbWUpO1xcbiAgICBpZiAodi5oZWFkZXJzKSB7XFxuICAgICAgcGxheWxpc3QuaGVhZGVycy5wdXNoKHYuaGVhZGVycyk7XFxuICAgIH1cXG4gICAgaWYgKHYucnVuVHlwZSA9PT0gXFxcIkpTT05cXFwiKSB7XFxuICAgICAgbGV0IHBhcmFtID0ge1xcbiAgICAgICAgLy91cmw6IHYudXJsLFxcbiAgICAgICAgbWV0aG9kOiB2Lm1ldGhvZCxcXG4gICAgICAgIGhlYWRlcnM6IHYuaGVhZGVycyxcXG4gICAgICAgIGpzb25QYXRoOiB2Lmpzb25QYXRoXFxuICAgICAgfTtcXG4gICAgICBwbGF5bGlzdC51cmxzLnB1c2gocHJveHlVcmwgKyBcXFwiP3J1blR5cGU9SlNPTiZ1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChiYXNlNjRFbmNvZGUodi51cmwgKyB1cmwpKSArIFxcXCImcGFyYW09XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkocGFyYW0pKSkpO1xcbiAgICB9IGVsc2UgaWYgKHYucnVuVHlwZSA9PT0gXFxcIkpTXFxcIikge1xcbiAgICAgIHBsYXlsaXN0LnVybHMucHVzaChwcm94eVVybCArIFxcXCI/cnVuVHlwZT1KUyZ1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChiYXNlNjRFbmNvZGUodXJsKSkgKyAoaXNUZXN0ID8gXFxcIiZwYXJhbT1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeSh2KSkpIDogXFxcIiZpbmRleD1cXFwiICsgaSkpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgIHBsYXlsaXN0LnVybHMucHVzaChcXFwidmlkZW86Ly9cXFwiICsgdi51cmwgKyB1cmwpO1xcbiAgICB9XFxuICB9KTtcXG4gIGlmICghcGxheWxpc3QudXJscy5sZW5ndGgpIHJldHVybiBcXFwid2ViOi8vXFxcIiArIHVybDtcXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShwbGF5bGlzdCk7XFxufVxcblxcbmZ1bmN0aW9uIHVzZVBhcnNlcyh1cmwsIGZsYWcpIHtcXG4gIGxldCBwYXJzZXMgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuXFxuICBpZiAoIXBhcnNlcy5sZW5ndGgpIHJldHVybiBcXFwid2ViOi8vXFxcIiArIHVybDtcXG4gIGxldCBwbGF5bGlzdCA9IHtcXG4gICAgdXJsczogW10sXFxuICAgIG5hbWVzOiBbXSxcXG4gICAgaGVhZGVyczogW10sXFxuICAgIGlzOiBcXFwiI2lzVmlkZW89dHJ1ZSNcXFwiLFxcbiAgfTtcXG4gIHRyeSB7XFxuICAgIGxldCB1c2VEYW5tdSA9ICEhZ2V0SXRlbShcXFwidXNlRGFubXVcXFwiLCBcXFwiXFxcIik7XFxuICAgIGlmICh1c2VEYW5tdSkge1xcbiAgICAgIHBsYXlsaXN0LmRhbm11ID0gJC5yZXF1aXJlKCdkbUZ1bj9ydWxlPWRt55uS5a2QJykuZG1Sb3V0ZSh1cmwpO1xcbiAgICB9XFxuICB9IGNhdGNoIHsgfVxcbiAgZmxhZyA9IFN0cmluZyhmbGFnKS5yZXBsYWNlKC9cXFxccy9nLCBcXFwiXFxcIik7XFxuICByZXR1cm4gcHJlcGFyZVBhcnNlcyhwYXJzZXMsIHVybCwgcGxheWxpc3QsIGZhbHNlLCBmbGFnKTtcXG59XFxuXFxuZnVuY3Rpb24gY2FycnlKcyhwbGF5LCBpZCkge1xcbiAgdmFyIGV4dHJhID0ge1xcbiAgICBcXFwidWFcXFwiOiBNT0JJTEVfVUFcXG4gIH1cXG4gIGxldCBwYXJzZSA9IHBsYXk7XFxuICBsZXQgcGFyc2Vfb2JqID0ge1xcbiAgICBkZWZSdWxlczogW1xcXCIqLm1wNFxcXCIsIFxcXCIqLm0zdThcXFwiXSxcXG4gIH07XFxuICBpZiAocGFyc2UuaGFzT3duUHJvcGVydHkoXFxcInBhcnNlX2V4dHJhXFxcIikpIHtcXG4gICAgbGV0IHBhcnNlX2V4dHJhID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhcnNlLnBhcnNlX2V4dHJhKTtcXG4gICAgcGFyc2Vfb2JqID0gT2JqZWN0LmFzc2lnbihwYXJzZV9vYmosIHBhcnNlUXVlcnkocGFyc2VfZXh0cmEpKTtcXG4gICAgaWYgKHBhcnNlX29iai5oYXNPd25Qcm9wZXJ0eShcXFwiaW5pdF9zY3JpcHRcXFwiKSkge1xcbiAgICAgIHBhcnNlX29ialtcXFwiaW5pdF9zY3JpcHRcXFwiXSA9IGJhc2U2NERlY29kZShwYXJzZV9vYmpbXFxcImluaXRfc2NyaXB0XFxcIl0pO1xcbiAgICB9XFxuICB9XFxuICBpZiAocGFyc2Vfb2JqLmhhc093blByb3BlcnR5KFxcXCJpc19wY1xcXCIpICYmIHBhcnNlX29ialtcXFwiaXNfcGNcXFwiXSA9PSBcXFwiMVxcXCIpIHtcXG4gICAgZXh0cmFbXFxcInVhXFxcIl0gPSBQQ19VQTtcXG4gIH1cXG4gIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFwiaGVhZGVyXFxcIikpIHtcXG4gICAgZXh0cmFbXFxcInVhXFxcIl0gPSBwYXJzZVtcXFwiaGVhZGVyXFxcIl1bXFxcIlVzZXItQWdlbnRcXFwiXTtcXG4gICAgLy9leHRyYVtcXFwicmVkaXJlY3RcXFwiXT1mYWxzZTtcXG4gICAgLypleHRyYVtcXFwianNcXFwiXSA9ICQudG9TdHJpbmcoKGpzKSA9PiB7XFxuICAgICAgZXZhbChqcylcXG4gICAgICBmYmEubG9nKG5hdmlnYXRvci51c2VyQWdlbnQpXFxuICAgICAgZmJhLmxvZyhsb2NhdGlvbi5ocmVmKVxcbiAgICB9LCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmF2aWdhdG9yLCAndXNlckFnZW50Jywge1xcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XFxuICAgICAgICAgIHJldHVybiAnTXktQ3VzdG9tLVVBLVN0cmluZyc7XFxuICAgICAgICB9XFxuICAgICAgfSk7XFxuICAgIH0pKSovXFxuICB9XFxuICBpZiAocGFyc2Vfb2JqLmhhc093blByb3BlcnR5KFxcXCJjdXN0b21fcmVnZXhcXFwiKSkge1xcbiAgICBsZXQgY3VycmVudCA9IHBhcnNlX29ialtcXFwiZGVmUnVsZXNcXFwiXTtcXG4gICAgZXh0cmFbXFxcInZpZGVvUnVsZXNcXFwiXSA9IGN1cnJlbnQuY29uY2F0KHBhcnNlX29iai5jdXN0b21fcmVnZXguc3BsaXQoL1xcXFx8L2cpLmZpbHRlcihlID0+IGUpKVxcbiAgfVxcbiAgaWYgKHBhcnNlLmhhc093blByb3BlcnR5KFxcXCJqc1xcXCIpICYmIHBhcnNlLmpzICE9IFxcXCJcXFwiKSB7XFxuICAgIGV4dHJhW1xcXCJqc1xcXCJdID0gJC50b1N0cmluZygoanMsIHBhcnNlLCB0KSA9PiB7XFxuICAgICAgaWYgKHBhcnNlLmhhc093blByb3BlcnR5KFxcXCJpbml0X3NjcmlwdFxcXCIpKSB7XFxuICAgICAgICBmYmEubG9nKHQgKyBcXFwiOuaJp+ihjGluaXRfc2NyaXB0XFxcIik7XFxuICAgICAgICBldmFsKHBhcnNlLmluaXRfc2NyaXB0KTtcXG4gICAgICB9XFxuICAgICAgZmJhLmxvZyhuYXZpZ2F0b3IucGxhdGZvcm0pO1xcbiAgICAgIGZiYS5sb2codCArIFxcXCI65omn6KGManPngrnlh7tcXFwiKVxcbiAgICAgIGV2YWwoanMpXFxuICAgIH0sIHBhcnNlLmpzLCBwYXJzZV9vYmosIE1ZX1JVTEUudGl0bGUpXFxuICB9XFxuICB0cnkge1xcbiAgICBsZXQgaXRlbSA9IGZpbmRJdGVtKGlkKTtcXG4gICAgdXBkYXRlSXRlbShpZCwge1xcbiAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHt9LCBpdGVtLmV4dHJhLCBleHRyYSlcXG4gICAgfSk7XFxuICB9IGNhdGNoIChlKSB7IH1cXG59XFxuXFxuZnVuY3Rpb24gcGFyc2VRdWVyeShxdWVyeSkge1xcbiAgdmFyIG9iaiA9IHt9O1xcbiAgcXVlcnkuc3BsaXQoXFxcIiZcXFwiKS5maWx0ZXIoZSA9PiBlKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XFxuICAgIHZhciBwYXJ0cyA9IGl0ZW0uc3BsaXQoXFxcIj1cXFwiKTtcXG4gICAgb2JqW3BhcnRzWzBdXSA9IHBhcnRzWzFdO1xcbiAgfSk7XFxuICByZXR1cm4gb2JqO1xcbn1cXG5cXG4kLmV4cG9ydHMucGFyc2UgPSBmdW5jdGlvbiAoaW5wdXQsIGlkLCBzb3VyY2UpIHtcXG4gIGxldCBkcnB5ID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIikuZ2V0QnlTb3VyY2Uoc291cmNlKTtcXG4gIGlucHV0ID0gaW5wdXQuc3BsaXQoXFxcIiNcXFwiKTtcXG4gIGxldCBwbGF5ID0gSlNPTi5wYXJzZShkcnB5LnBsYXkoaW5wdXRbMV0sIGlucHV0WzBdLnJlcGxhY2UoXFxcInR2Ym94LXhnOlxcXCIsIFxcXCJcXFwiKSwgW10pKTtcXG4gIGxldCBtYXJrID0gZHJweS5nZXRSdWxlKFxcXCLnsbvlnotcXFwiKSA9PT0gXFxcIuWQrOS5plxcXCIgPyBcXFwiI2lzTXVzaWM9dHJ1ZSNcXFwiIDogXFxcIiNpc1ZpZGVvPXRydWUjXFxcIjtcXG4gIGlmKHR5cGVvZiBwbGF5ICE9PSBcXFwib2JqZWN0XFxcIiB8fCAhcGxheS51cmwpeyAgICAgIFxcbiAgICAgIHBsYXkgPSB7XFxuICAgICAgICAgIHVybDogaW5wdXRbMF0sXFxuICAgICAgICAgIHBhcnNlOiAxXFxuICAgICAgfTtcXG4gICAgICBpZighcGxheS51cmwuc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKXtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+i/nuaOpeS4uuepulxcXCI7XFxuICAgICAgfVxcbiAgfVxcbiAgcGxheS51cmwgPSBTdHJpbmcocGxheS51cmwpO1xcbiAgaWYgKHBsYXkudXJsLmluY2x1ZGVzKFxcXCJwcm94eT9kb1xcXCIpIHx8IHBsYXkudXJsLmluY2x1ZGVzKFxcXCJwcm94eT9oaWtlclNrZXlcXFwiKSkge1xcbiAgICBNWV9VUkwgPSBwbGF5LnVybDtcXG4gICAgcGxheS51cmwgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInVybFxcXCIsIFxcXCJcXFwiKSk7XFxuICB9XFxuICBpZiAocGxheS51cmwuc3RhcnRzV2l0aChcXFwicHVzaDovL1xcXCIpKSB7XFxuICAgIHBsYXkudXJsID0gcGxheS51cmwucmVwbGFjZShcXFwicHVzaDovL1xcXCIsIFxcXCJcXFwiKTtcXG4gIH1cXG4gIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJodHRwczovL3Bhbi5xdWFyay5jbi9cXFwiKSkge1xcbiAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9xdWFya0xpc3Q/cnVsZT1RdWFyay7nroAmcmVhbHVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBsYXkudXJsKSArIFxcXCImc2hhcmVQd2Q9XFxcIjtcXG4gIH1cXG4gIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKCdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy8nKSB8fCBwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJodHRwczovL3d3dy5hbGlwYW4uY29tL3MvXFxcIikpIHtcXG4gICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvYWxpeXVuP3J1bGU95LqR55uY5ZCbLueugCZwYWdlPWZ5cGFnZSZyZWFsdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQocGxheS51cmwpO1xcbiAgfVxcbiAgaWYgKHBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcInBpY3M6Ly9cXFwiKSkge1xcbiAgICByZXR1cm4gcGxheS51cmw7XFxuICB9XFxuICBpZiAocGxheS51cmwuc3RhcnRzV2l0aChcXFwibm92ZWw6Ly9cXFwiKSkge1xcbiAgICByZXR1cm4gJChcXFwiaGlrZXI6Ly9lbXB0eSNyZWFkVGhlbWUjXFxcIikucnVsZSgoZGF0YSkgPT4ge1xcbiAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcXG4gICAgICBsZXQgbGF5b3V0ID0gW107XFxuICAgICAgbGV0IGNvbnRlbnQgPSBcXFwi44CA44CAXFxcIiArIGRhdGEuY29udGVudC5zcGxpdCgvKFxcXFxufFxcXFxyKSsvKS5maWx0ZXIoaXQgPT4gaXQudHJpbSgpLmxlbmd0aCA+IDEpLm1hcChpdCA9PiBpdC50cmltKCkpLmpvaW4oXFxcIjxicj7jgIDjgIBcXFwiKTtcXG4gICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxuICAgICAgICB0aXRsZTogKFxcXCI8c3Ryb25nPlxcXCIgKyBkYXRhLnRpdGxlICsgXFxcIjwvc3Ryb25nPlxcXCIpLmJpZygpLFxcbiAgICAgIH0pO1xcblxcbiAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBjb250ZW50LFxcbiAgICAgICAgY29sX3R5cGU6ICdyaWNoX3RleHQnLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgdGV4dFNpemU6IDE4LFxcbiAgICAgICAgICBjbGljazogdHJ1ZVxcbiAgICAgICAgfVxcbiAgICAgIH0pO1xcbiAgICAgIHNldFJlc3VsdChsYXlvdXQpO1xcbiAgICB9LCBwbGF5LnVybC5yZXBsYWNlKFxcXCJub3ZlbDovL1xcXCIsIFxcXCJcXFwiKSk7XFxuICB9XFxuICAvL2xvZyhwbGF5KTtcXG4gIGlmIChwbGF5LnBhcnNlID09PSAxIHx8IHBsYXkuanggPT09IDEpIHtcXG4gICAgaWYgKHBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcIm1hZ25ldDpcXFwiKSkge1xcbiAgICAgIHJldHVybiBwbGF5LnVybDtcXG4gICAgfVxcbiAgICBpZCYmY2FycnlKcyhwbGF5LCBpZCk7XFxuICAgIGlmIChwbGF5Lmp4ID09PSAxIHx8IChpc29mZmljaWFsKHBsYXkudXJsKSAmJiAocGxheS5mbGFnIHx8IGlucHV0WzFdKSkpIHtcXG4gICAgICByZXR1cm4gdXNlUGFyc2VzKHBsYXkudXJsLCBwbGF5LmZsYWcgfHwgaW5wdXRbMV0pO1xcbiAgICB9XFxuICAgIHJldHVybiBcXFwidmlkZW86Ly9cXFwiICsgcGxheS51cmw7XFxuICB9IGVsc2UgaWYgKHBsYXkucGFyc2UgPT09IDApIHtcXG4gICAgaWYgKHBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcIm1hZ25ldDpcXFwiKSkge1xcbiAgICAgIHJldHVybiBwbGF5LnVybDtcXG4gICAgfVxcbiAgICAvL2xvZyhwbGF5KVxcbiAgICB2YXIgcGxheW9iaiA9IHt9O1xcbiAgICBwbGF5b2JqLnVybHMgPSBbcGxheS51cmwgKyBtYXJrXTtcXG4gICAgaWYgKHBsYXkuaGFzT3duUHJvcGVydHkoXFxcImhlYWRlclxcXCIpKSB7XFxuICAgICAgcGxheW9ialtcXFwiaGVhZGVyc1xcXCJdID0gcGxheS5oZWFkZXI7XFxuICAgIH1cXG4gICAgaWYgKHBsYXkuaGFzT3duUHJvcGVydHkoXFxcImRhbm1ha3VcXFwiKSkge1xcbiAgICAgIHBsYXlvYmpbXFxcImRhbm11XFxcIl0gPSBwbGF5LmRhbm1ha3U7XFxuICAgIH1cXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlvYmopO1xcbiAgfSBlbHNlIHtcXG4gICAgcmV0dXJuIHBsYXkudXJsO1xcbiAgfVxcbn1cXG4kLmV4cG9ydHMucHJlcGFyZVBhcnNlcyA9IHByZXBhcmVQYXJzZXM7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLliJvlu7rorqLpmIVcIixcInBhdGhcIjpcImNyZWF0ZVN1YnNjcmlwdGlvblwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLliJvlu7rorqLpmIVcXFwiKTtcXG5sZXQgbGF5b3V0ID0gW107XFxubGV0IGYgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFwiKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gICAgY2xlYXJNeVZhcihcXFwiZHJweUhpa2VyX3N1Yl9pbnB1dFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJkcnB5SGlrZXJfc3VidXJsX2lucHV0XFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcImRycHlIaWtlcl9zdWJuYW1lX2lucHV0XFxcIik7XFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuiuoumYheWQjeensFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX3N1Ym5hbWVfaW5wdXRcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGlkOiBcXFwiZHJweUhpa2VyX3N1Ym5hbWVfaW5wdXRcXFwiXFxuICAgIH1cXG59KTtcXG5sZXQgcGF0aCA9IGpvaW5VcmwoZ2V0UGF0aChcXFwiaGlrZXI6Ly9maWxlcy9cXFwiKSwgXFxcIi4uL1xcXCIucmVwZWF0KDUpKS5zbGljZSg3KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6YCJ5oupXFxcIixcXG4gICAgdXJsOiBKU09OLnN0cmluZ2lmeShmLmZpbGVTZWxlY3Rpb25Vcmkoe1xcbiAgICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBmaW5kSXRlbShcXFwiZHJweUhpa2VyX3N1Yl9pbnB1dFxcXCIpLmV4dHJhO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcImRycHlIaWtlcl9zdWJfaW5wdXRcXFwiLCB7XFxuICAgICAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHRhcmdldCwge1xcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBQQVRIXFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9KSxcXG4gICAgICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcbiAgICAgICAgaW5pdGlhbFBhdGg6IHBhdGgsXFxuICAgICAgICBwYXR0ZXJuOiAxXFxuICAgIH0pKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLlgqjlrZjot6/lvoRcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX3N1Yl9pbnB1dFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfc3ViX2lucHV0XFxcIlxcbiAgICB9XFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuiuoumYheWcsOWdgFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX3N1YnVybF9pbnB1dFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfc3VidXJsX2lucHV0XFxcIlxcbiAgICB9XFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuehruiupFxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaWQpID0+IHtcXG4gICAgICAgIGxldCBwYXRoID0gZ2V0TXlWYXIoXFxcImRycHlIaWtlcl9zdWJfaW5wdXRcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBsZXQgdXJsID0gZ2V0TXlWYXIoXFxcImRycHlIaWtlcl9zdWJ1cmxfaW5wdXRcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBsZXQgbmFtZSA9IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfc3VibmFtZV9pbnB1dFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGlmICghKHBhdGggJiYgdXJsICYmIG5hbWUpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S4jeWPr+S4uuepulxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcnVsZSA9IGJhc2U2NEVuY29kZShcXFwi5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77ya5ZCI6ZuG6KeE5YiZ6K6i6ZiF77+laG9tZV9zdWLvv6VcXFwiICsgbmFtZSArIFxcXCJAQFxcXCIgKyB1cmwrYEBqcz0kLnJlcXVpcmUoJ3N1YnNjcmliZT9ydWxlPSR7TVlfUlVMRS50aXRsZX0nKS5wYXJzZVVybChpbnB1dCwgJyR7YmFzZTY0RW5jb2RlKHBhdGgpfScpYCk7XFxuICAgICAgICByZXR1cm4gXFxcInJ1bGU6Ly9cXFwiICsgcnVsZTtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxufSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop6PmnpDorqLpmIVcIixcInBhdGhcIjpcInN1YnNjcmliZVwiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gZ2VuZXJhdGVDb25maWdCeUdpdGh1Yih1cmwsIHBhdGgpIHtcXG4gICAgbGV0IHJvcGUgPSB1cmwuc3BsaXQoXFxcIi9cXFwiKS5zbGljZSgzLCA1KS5qb2luKFxcXCIvXFxcIik7XFxuICAgIGxldCBodG1sID0gZmV0Y2godXJsKTtcXG4gICAgXFxuICAgIGxldCBqc29uVGV4dCA9IHBkZmgoaHRtbCwgXFxcIiNyZXBvLWNvbnRlbnQtcGpheC1jb250YWluZXImJnNjcmlwdCYmSHRtbFxcXCIpO1xcbiAgICBcXG4gICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGpzb25UZXh0KTtcXG4gICAgbGV0IGxpc3QgPSBqc29uLnBheWxvYWQudHJlZS5pdGVtcztcXG4gICAgbGV0IHJ1bGVzID0gW107XFxuICAgIGxldCBjb3VudCA9IDA7XFxuICAgIGxldCBuYW1lcyA9IFtdO1xcbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDApIHJldHVybiBcXFwidG9hc3Q6Ly/lj6/og73liKDlupPkuoZcXFwiO1xcbiAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBuYW1lID0gaXQubmFtZTtcXG4gICAgICAgICAgICBsZXQgc3BhdGggPSBpdC5wYXRoO1xcbiAgICAgICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcXFwiLmpzXFxcIikpIGNvbnRpbnVlO1xcbiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoXFxcIi5cXFwiKSk7XFxuICAgICAgICAgICAgbGV0IHJ1bGUgPSBmZXRjaChgaHR0cHM6Ly9yYXcuZ2l0bWlycm9yLmNvbS8ke3JvcGV9L21hc3Rlci8ke3NwYXRofWApO1xcbiAgICAgICAgICAgIGlmICghKCghcnVsZSB8fCAhcnVsZS5pbmNsdWRlcyhcXFwicnVsZVxcXCIpKSAmJiAhZmlsZUV4aXN0KHBhdGggKyBpdC5uYW1lKSkpIHtcXG4gICAgICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGggKyBpdC5uYW1lLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgcnVsZXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAna2V5JzogYGhpcHlfanNfJHtuYW1lfWAsXFxuICAgICAgICAgICAgICAgICAgICAnbmFtZSc6IGAke25hbWV9YCxcXG4gICAgICAgICAgICAgICAgICAgICd0eXBlJzogMyxcXG4gICAgICAgICAgICAgICAgICAgICdhcGknOiAnLi4vbGlicy9kcnB5Mi5qcycsXFxuICAgICAgICAgICAgICAgICAgICAnc2VhcmNoYWJsZSc6IDEsXFxuICAgICAgICAgICAgICAgICAgICAncXVpY2tTZWFyY2gnOiAxLFxcbiAgICAgICAgICAgICAgICAgICAgJ2ZpbHRlcmFibGUnOiAxLFxcbiAgICAgICAgICAgICAgICAgICAgJ2V4dCc6IFxcXCIuL1xcXCIgKyBpdC5uYW1lLFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgY291bnQrKztcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgICAgICBuYW1lcy5wdXNoKGl0Lm5hbWUpO1xcbiAgICB9XFxuICAgIGRlbGV0ZWxvc2UobmFtZXMsIHBhdGgpXFxuICAgIHdyaXRlRmlsZShwYXRoICsgXFxcImluZGV4Lmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICBzaXRlczogcnVsZXNcXG4gICAgfSkpO1xcblxcbiAgICByZXR1cm4gXFxcInRvYXN0Oi8v5oiQ5Yqf5pu05pawXFxcIiArIGNvdW50ICsgXFxcIuS4qlxcXCI7O1xcbn1cXG5cXG5mdW5jdGlvbiBkZWxldGVsb3NlKG5hbWVzLCBwYXRoKSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgcGF0aEZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHBhdGgpO1xcbiAgICAgICAgaWYgKCFwYXRoRmlsZS5pc0RpcmVjdG9yeSgpKSByZXR1cm47XFxuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIHBhdGhGaWxlLmxpc3RGaWxlcygpKSB7XFxuICAgICAgICAgICAgbGV0IG5hbWUgPSBTdHJpbmcoZmlsZS5nZXROYW1lKCkpO1xcbiAgICAgICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcXFwiLmpzXFxcIikgfHwgbmFtZXMuaW5jbHVkZXMobmFtZSkpIGNvbnRpbnVlO1xcbiAgICAgICAgICAgIGRlbGV0ZUZpbGUoZmlsZS5nZXRQYXRoKCkpO1xcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB0b2FzdChcXFwi5riF55CG5aSx5pWI5rqQ5aSx6LSlOlxcXCIgKyBlLnRvU3RyaW5nKCkpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGdlbmVyYXRlQ29uZmlnQnlJbmRleCh1cmwsIHBhdGgpIHtcXG4gICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKHRvQ29ycmVjdEpTT05TdHJpbmcocmVxdWVzdCh1cmwpKSk7XFxuICAgIGxldCBhcnIgPSBqc29uLnNpdGVzO1xcbiAgICBsZXQgY291bnQgPSAwO1xcbiAgICBsZXQgaSA9IDA7XFxuICAgIGxldCBuYW1lcyA9IFtdO1xcbiAgICBmb3IgKGxldCBpdCBvZiBhcnIpIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgaWYgKChTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIubWluLmpzXFxcIikgfHwgU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcImRycHkyLmpzXFxcIikpKSB7XFxuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gaXQuZXh0LmVuZHNXaXRoKFxcXCIuanNcXFwiKSA/IGRlY29kZVVSSUNvbXBvbmVudChpdC5leHQuc3BsaXQoXFxcIi9cXFwiKS5hdCgtMSkpIDogKGl0Lm5hbWUgKyBcXFwiLmpzXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlO1xcbiAgICAgICAgICAgICAgICBpZiAoU3RyaW5nKGl0LmV4dCkuc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICBydWxlID0gcmVxdWVzdChpdC5leHQpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZSA9IHJlcXVlc3Qoam9pblVybCh1cmwsIGl0LmV4dCkpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGl0LmV4dCA9IFxcXCIuL1xcXCIgKyBuYW1lO1xcbiAgICAgICAgICAgICAgICBpZiAoIXJ1bGUgfHwgIXJ1bGUuaW5jbHVkZXMoXFxcInJ1bGVcXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlRXhpc3QocGF0aCArIG5hbWUpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoaSwgMSk7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGggKyBuYW1lLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgbmFtZXMucHVzaChuYW1lKTtcXG4gICAgICAgICAgICAgICAgY291bnQrKztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgICAgICBpKys7XFxuICAgIH1cXG4gICAgZGVsZXRlbG9zZShuYW1lcywgcGF0aCk7XFxuICAgIHdyaXRlRmlsZShwYXRoICsgXFxcImluZGV4Lmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShqc29uKSk7XFxuICAgIHJldHVybiBcXFwidG9hc3Q6Ly/miJDlip/mm7TmlrBcXFwiICsgY291bnQgKyBcXFwi5LiqXFxcIjtcXG59XFxuJC5leHBvcnRzLnBhcnNlVXJsID0gZnVuY3Rpb24gKHVybCwgcGF0aCkge1xcbiAgICBwYXRoID0gYmFzZTY0RGVjb2RlKHBhdGgpO1xcbiAgICBwYXRoID0gcGF0aC5lbmRzV2l0aChcXFwiL1xcXCIpID8gcGF0aCA6IHBhdGggKyBcXFwiL1xcXCI7XFxuICAgIHRyeSB7XFxuICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoXFxcImh0dHBzOi8vZ2l0aHViLmNvbS9oamRobngvXFxcIikpIHtcXG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWdCeUdpdGh1Yih1cmwsIHBhdGgpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWdCeUluZGV4KHVybCwgcGF0aCk7XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJlcnJvcjpcXFwiICsgZS50b1N0cmluZygpO1xcbiAgICB9XFxufTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIui/kOihjOaXtumFjee9rueuoeeQhlwiLFwicGF0aFwiOlwicnVudGltZUNvbmZpZ1wiLFwicnVsZVwiOlwianM6XFxuY29uc3Qgc2VhcmNoQWxsb3dQYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvRHJweUhpa2VyL3NlYXJjaEFsbG93Lmpzb25cXFwiO1xcbmxldCBpc1ByZXBhcmUgPSBmYWxzZTtcXG5sZXQgY29uZmlncywgY3VycmVudENvbmZpZyA9IHt9LFxcbiAgICBzb3VyY2VMaXN0LCBjdXJyZW50U291cmNlLCBzZWFyY2hBbGxvdyA9IFtdO1xcbmxldCB0YWdDbGFzc2VzO1xcbmxldCBzVGFnID0gXFxcIlxcXCI7XFxuXFxuZnVuY3Rpb24gaW5pdChjb25maWcpIHtcXG4gICAgaWYgKCFjb25maWcpIHJldHVybiBudWxsO1xcbiAgICBpZiAoIWNvbmZpZy5wYXRoKSByZXR1cm4gbnVsbDtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBmaWxlO1xcbiAgICAgICAgbGV0IHNvdXJjZUxpc3QgPSBbXTtcXG4gICAgICAgIGlmIChjb25maWcucGF0aC5zdGFydHNXaXRoKFxcXCJmaWxlOi8vXFxcIikgJiYgKGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGNvbmZpZy5wYXRoLnJlcGxhY2UoXFxcImZpbGU6Ly9cXFwiLCBcXFwiXFxcIikpKS5pc0RpcmVjdG9yeSgpKSB7XFxuICAgICAgICAgICAgc291cmNlTGlzdCA9IGdlbmVyYXRlQ29uZmlnQnlMb2NhbChmaWxlKTtcXG4gICAgICAgICAgICBjb25maWcudHlwZSA9IFxcXCJsb2NhbERpclxcXCI7XFxuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5wYXRoLnN0YXJ0c1dpdGgoXFxcImh0dHBzOi8vZ2l0aHViLmNvbVxcXCIpKSB7XFxuICAgICAgICAgICAgc291cmNlTGlzdCA9IGdlbmVyYXRlQ29uZmlnQnlHaXRodWIoY29uZmlnLnBhdGgpO1xcbiAgICAgICAgICAgIGNvbmZpZy50eXBlID0gXFxcImdpdGh1YkRpclxcXCI7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZSh0b0NvcnJlY3RKU09OU3RyaW5nKGZldGNoKGNvbmZpZy5wYXRoKSB8fCBcXFwie31cXFwiKSk7XFxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGpzb24uc2l0ZXMpIHx8ICFqc29uLnNpdGVzLmxlbmd0aCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgc291cmNlTGlzdCA9IGZpbHRlck90aGVyKGpzb24uc2l0ZXMpO1xcbiAgICAgICAgICAgIGNvbmZpZy50eXBlID0gXFxcImluZGV4XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGZpbGUgPSB2b2lkIDA7XFxuICAgICAgICBsZXQgY3VycmVudFNvdXJjZSwgc2VhcmNoQWxsb3c7XFxuICAgICAgICBpZiAoY29uZmlnLmNLZXkpIHtcXG4gICAgICAgICAgICBjdXJyZW50U291cmNlID0gc291cmNlTGlzdC5maW5kKHYgPT4gdi5rZXkgPT09IGNvbmZpZy5jS2V5KTtcXG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRTb3VyY2UpIHtcXG4gICAgICAgICAgICAgICAgY3VycmVudFNvdXJjZSA9IHNvdXJjZUxpc3RbMF07XFxuICAgICAgICAgICAgICAgIC8vY3VycmVudENvbmZpZy5jS2V5ID0gc291cmNlTGlzdFswXS5rZXk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBjdXJyZW50U291cmNlID0gc291cmNlTGlzdFswXTtcXG4gICAgICAgICAgICAvL2NvbmZpZy5jS2V5ID0gc291cmNlTGlzdFswXS5rZXk7XFxuICAgICAgICB9XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIHNlYXJjaEFsbG93ID0gSlNPTi5wYXJzZShmZXRjaChzZWFyY2hBbGxvd1BhdGgpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGRlbGV0ZUZpbGUoc2VhcmNoQWxsb3dQYXRoKTtcXG4gICAgICAgICAgICBzZWFyY2hBbGxvdyA9IFtdO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICBjdXJyZW50U291cmNlLFxcbiAgICAgICAgICAgIHNlYXJjaEFsbG93LFxcbiAgICAgICAgICAgIHNvdXJjZUxpc3RcXG4gICAgICAgIH07XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICB9XFxuICAgIHJldHVybiBudWxsO1xcbn1cXG5cXG5mdW5jdGlvbiBnZW5lcmF0ZUNvbmZpZ0J5TG9jYWwoZGlyRmlsZSkge1xcbiAgICBsZXQgbGlzdCA9IGRpckZpbGUubGlzdEZpbGVzKCk7XFxuICAgIGxldCBydWxlcyA9IFtdO1xcbiAgICBcXG4gICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xcbiAgICAgICAgbGV0IG5hbWUgPSBTdHJpbmcoaXQuZ2V0TmFtZSgpKTtcXG4gICAgICAgIGxldCBwYXRoID0gaXQuZ2V0UGF0aCgpO1xcbiAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFxcXCIuanNcXFwiKSB8fCBpdC5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcXG4gICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoXFxcIi5cXFwiKSk7XFxuICAgICAgICBydWxlcy5wdXNoKHtcXG4gICAgICAgICAgICAna2V5JzogYGhpcHlfanNfJHtuYW1lfWAsXFxuICAgICAgICAgICAgJ25hbWUnOiBgJHtuYW1lfWAsXFxuICAgICAgICAgICAgJ3R5cGUnOiAzLFxcbiAgICAgICAgICAgICdzZWFyY2hhYmxlJzogMSxcXG4gICAgICAgICAgICAncXVpY2tTZWFyY2gnOiAxLFxcbiAgICAgICAgICAgICdmaWx0ZXJhYmxlJzogMSxcXG4gICAgICAgICAgICAnZXh0JzogYCR7cGF0aH1gLFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgbGV0IG1hcHBpbmcgPSBnZXRMb2FjbE1hcHBpbmcoU3RyaW5nKGRpckZpbGUuZ2V0UGF0aCgpKSk7XFxuICAgIFxcbiAgICBpZihtYXBwaW5nLmxlbmd0aCl7XFxuICAgICAgICBmb3IgKGxldCBpdCBvZiBtYXBwaW5nKXtcXG4gICAgICAgICAgICBsZXQgaW5kZXggPSBydWxlcy5maW5kSW5kZXgodj0+di5uYW1lPT09aXQua2V5KTtcXG4gICAgICAgICAgICBsZXQgaXRlbSA9IHJ1bGVzW2luZGV4XTsgICAgICAgICAgICBcXG4gICAgICAgICAgICBydWxlcy5zcGxpY2UoaW5kZXgsMCxPYmplY3QuYXNzaWduKHt9LCBpdGVtLCB7XFxuICAgICAgICAgICAgICAgICdrZXknOiBgaGlweV9qc18ke2l0LnRva2V5fWAsXFxuICAgICAgICAgICAgICAgICduYW1lJzogYCR7aXQudG9rZXl9YCxcXG4gICAgICAgICAgICAgICAgJ2V4dCc6IGl0ZW0uZXh0K1xcXCI/XFxcIitpdC5wYXJhbXMsXFxuICAgICAgICAgICAgICAgIGRlbDp2b2lkIDBcXG4gICAgICAgICAgICB9KSk7XFxuICAgICAgICAgICAgaXRlbS5kZWwgPSB0cnVlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcnVsZXMgPSBydWxlcy5maWx0ZXIodj0+IXYuZGVsKTtcXG4gICAgfVxcbiAgICByZXR1cm4gcnVsZXM7XFxufVxcblxcbmZ1bmN0aW9uIGdldExvYWNsTWFwcGluZyhkaXJGaWxlKSB7XFxuICAgIC8va2V5QHBhcmFtc0B0eXBlXFxuICAgIGxldCBtYXBwaW5nUGF0aCA9IFxcXCJmaWxlOi8vXFxcIiArIGpvaW5VcmwoZGlyRmlsZSwgXFxcIi4vXFxcIikgKyBcXFwiLy5tYXBwaW5nLnR4dFxcXCI7XFxuICAgIGxldCBtYXBwaW5nID0gW107XFxuICAgIGlmICghZmlsZUV4aXN0KG1hcHBpbmdQYXRoKSkgcmV0dXJuIG1hcHBpbmc7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgbWFwcGluZ1R4dCA9IGZldGNoKG1hcHBpbmdQYXRoKTtcXG4gICAgICAgIG1hcHBpbmdUeHQuc3BsaXQoXFxcIlxcXFxuXFxcIikuZm9yRWFjaCh2ID0+IHtcXG4gICAgICAgICAgICBsZXQgW2tleSwgcGFyYW1zLCB0b2tleSx0eXBlXSA9IHYuc3BsaXQoXFxcIkBcXFwiKTtcXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXFxcImJhc2U2NFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcGFyYW1zID0gYmFzZTY0RGVjb2RlKHBhcmFtcyk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcXFwidXJpXFxcIikge1xcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBkZWNvZGVVUklDb21wb25lbnQocGFyYW1zKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbWFwcGluZy5wdXNoKHtcXG4gICAgICAgICAgICAgICAga2V5LFxcbiAgICAgICAgICAgICAgICBwYXJhbXMsXFxuICAgICAgICAgICAgICAgIHRva2V5OnRva2V5fHxrZXlcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0pO1xcblxcbiAgICB9IGNhdGNoIChlKSB7fVxcbiAgICByZXR1cm4gbWFwcGluZztcXG59XFxuXFxuZnVuY3Rpb24gZ2VuZXJhdGVDb25maWdCeUdpdGh1Yih1cmwpIHtcXG4gICAgLy91cmw9dXJsLnJlcGxhY2UoLygjR0lUSFVCIykkLyxcXFwiXFxcIik7XFxuICAgIGxldCByb3BlID0gdXJsLnNwbGl0KFxcXCIvXFxcIikuc2xpY2UoMywgNSkuam9pbihcXFwiL1xcXCIpO1xcbiAgICBsZXQgaHRtbCA9IGZldGNoKHVybCk7XFxuICAgIGxldCBqc29uVGV4dCA9IHBkZmgoaHRtbCwgXFxcIiNyZXBvLWNvbnRlbnQtcGpheC1jb250YWluZXImJnNjcmlwdCYmSHRtbFxcXCIpO1xcbiAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoanNvblRleHQpO1xcbiAgICBsZXQgbGlzdCA9IGpzb24ucGF5bG9hZC50cmVlLml0ZW1zO1xcbiAgICBsZXQgcnVsZXMgPSBbXTtcXG4gICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xcbiAgICAgICAgbGV0IG5hbWUgPSBpdC5uYW1lO1xcbiAgICAgICAgbGV0IHBhdGggPSBpdC5wYXRoO1xcbiAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFxcXCIuanNcXFwiKSkgY29udGludWU7XFxuICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKFxcXCIuXFxcIikpO1xcbiAgICAgICAgcnVsZXMucHVzaCh7XFxuICAgICAgICAgICAgJ2tleSc6IGBoaXB5X2pzXyR7bmFtZX1gLFxcbiAgICAgICAgICAgICduYW1lJzogYCR7bmFtZX1gLFxcbiAgICAgICAgICAgICd0eXBlJzogMyxcXG4gICAgICAgICAgICAnc2VhcmNoYWJsZSc6IDEsXFxuICAgICAgICAgICAgJ3F1aWNrU2VhcmNoJzogMSxcXG4gICAgICAgICAgICAnZmlsdGVyYWJsZSc6IDEsXFxuICAgICAgICAgICAgJ2V4dCc6IGBodHRwczovL3Jhdy5naXRtaXJyb3IuY29tLyR7cm9wZX0vbWFzdGVyLyR7cGF0aH1gLFxcbiAgICAgICAgfSk7XFxuICAgICAgICAvKlxcbiAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2hqZGhueC9oaXB5LXNlcnZlci90cmVlL21hc3Rlci9hcHAvdDQvZmlsZXMvZHJweV9qc1xcbiAgICAgICAgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2hqZGhueC9oaXB5LXNlcnZlci9tYXN0ZXIvYXBwL3Q0L2ZpbGVzL2RycHlfanMvMzYwJUU1JUJEJUIxJUU4JUE3JTg2JTVCJUU1JUFFJTk4JTVELmpzKi9cXG4gICAgfVxcbiAgICByZXR1cm4gcnVsZXM7XFxufVxcblxcbmZ1bmN0aW9uIHByZXBhcmUoY29uZmlnKSB7XFxuICAgIGxldCBkYXRhID0gaW5pdChjb25maWcpO1xcbiAgICBpZiAoIWRhdGEpIHJldHVybiBmYWxzZTtcXG4gICAgY3VycmVudFNvdXJjZSA9IGRhdGEuY3VycmVudFNvdXJjZTtcXG4gICAgc2VhcmNoQWxsb3cgPSBkYXRhLnNlYXJjaEFsbG93O1xcbiAgICBzb3VyY2VMaXN0ID0gZGF0YS5zb3VyY2VMaXN0O1xcbiAgICBjdXJyZW50Q29uZmlnID0gY29uZmlnO1xcbiAgICBzVGFnID0gY29uZmlnLnNUYWcgfHwgXFxcIlxcXCI7XFxuICAgIHJldHVybiB0cnVlO1xcbn1cXG5cXG5mdW5jdGlvbiBmaWx0ZXJPdGhlcihsaXN0KSB7XFxuICAgIHJldHVybiBsaXN0LmZpbHRlcihpdCA9PiBTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIubWluLmpzXFxcIikgfHwgU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcImRycHkyLmpzXFxcIikpXFxufVxcblxcblxcbmZ1bmN0aW9uIGdldEN1cnJlbnRDb25maWcoKSB7XFxuICAgIHJldHVybiBjdXJyZW50Q29uZmlnIHx8IHt9O1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRDdXJyZW50Q29uZmlnKGNvbmZpZykge1xcbiAgICBsZXQgY3BhdGggPSAoY3VycmVudENvbmZpZyB8fCB7fSkucGF0aDtcXG4gICAgaWYgKHByZXBhcmUoY29uZmlnKSkge1xcbiAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwiY3VycmVudENvbmZpZ1xcXCIsIGNvbmZpZyk7XFxuICAgICAgICBpZiAoY3BhdGggIT0gY29uZmlnLnBhdGgpIHtcXG4gICAgICAgICAgICBkZWxldGVGaWxlKHNlYXJjaEFsbG93UGF0aCk7XFxuICAgICAgICAgICAgc2VhcmNoQWxsb3cgPSBbXTtcXG4gICAgICAgICAgICB0YWdDbGFzc2VzID0gdm9pZCAwO1xcbiAgICAgICAgfVxcbiAgICAgICAgaXNQcmVwYXJlID0gdHJ1ZTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGZpbmRTb3VyY2Uoa2V5KSB7XFxuICAgIGxldCBzID0gc291cmNlTGlzdC5maW5kKHYgPT4gdi5rZXkgPT09IGtleSk7XFxuICAgIGlmIChzKSB7XFxuICAgICAgICBzLmV4dCA9IGdldEFic29sdXRlUGF0aChTdHJpbmcocy5leHQpKTtcXG4gICAgfVxcbiAgICByZXR1cm4gcztcXG59XFxuXFxuZnVuY3Rpb24gZ2V0Q3VycmVudFNvdXJjZSgpIHtcXG4gICAgcmV0dXJuIGN1cnJlbnRTb3VyY2U7XFxufVxcblxcbmZ1bmN0aW9uIGdldEN1cnJlbnRTb3VyY2VQYXRoKCkge1xcbiAgICBsZXQgcGF0aCA9IFN0cmluZyhjdXJyZW50U291cmNlLmV4dCk7XFxuICAgIHJldHVybiBnZXRBYnNvbHV0ZVBhdGgocGF0aCk7XFxufVxcblxcbmZ1bmN0aW9uIGdldEFic29sdXRlUGF0aChwYXRoKSB7XFxuICAgIHBhdGggPSBTdHJpbmcocGF0aCk7XFxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSB8fCBwYXRoLnN0YXJ0c1dpdGgoXFxcImZpbGU6Ly9cXFwiKSkge1xcbiAgICAgICAgcmV0dXJuIHBhdGg7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gam9pblVybChjdXJyZW50Q29uZmlnLnBhdGgsIHBhdGgpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIHNldEN1cnJlbnRTb3VyY2Uoa2V5KSB7XFxuICAgIGxldCBzb3VyY2UgPSBzb3VyY2VMaXN0LmZpbmQodiA9PiB2LmtleSA9PT0ga2V5KTtcXG4gICAgaWYgKHNvdXJjZSkge1xcbiAgICAgICAgY3VycmVudENvbmZpZy5jS2V5ID0ga2V5O1xcbiAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwiY3VycmVudENvbmZpZ1xcXCIsIGN1cnJlbnRDb25maWcpO1xcbiAgICAgICAgY3VycmVudFNvdXJjZSA9IHNvdXJjZTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICB9XFxuICAgIHJldHVybiBmYWxzZTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0Q2FuU2VhcmNoU291cmNlKCkge1xcbiAgICByZXR1cm4gc291cmNlTGlzdC5maWx0ZXIodiA9PiB2LnNlYXJjaGFibGUgPT09IHVuZGVmaW5lZCB8fCB2LnNlYXJjaGFibGUpO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRBbGxTb3VyY2UoKSB7XFxuICAgIHJldHVybiBzb3VyY2VMaXN0LnNsaWNlKCk7XFxufVxcblxcbmZ1bmN0aW9uIGdldEFsbFNvdXJjZXMoKSB7XFxuICAgIHJldHVybiBzb3VyY2VMaXN0O1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRTZWFyY2hBbGxvdygpIHtcXG4gICAgcmV0dXJuIHNlYXJjaEFsbG93O1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRTZWFyY2hBbGxvdygpIHtcXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2VhcmNoQWxsb3cpKSB7XFxuICAgICAgICBzYXZlRmlsZShzZWFyY2hBbGxvd1BhdGgsIEpTT04uc3RyaW5naWZ5KHNlYXJjaEFsbG93KSk7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gZ2V0VGFnQ2xhc3NlcygpIHtcXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGFnQ2xhc3NlcykpIHJldHVybiB0YWdDbGFzc2VzLnNsaWNlKCk7XFxuICAgIHRhZ0NsYXNzZXMgPSBbXTtcXG4gICAgaWYgKGlzUHJlcGFyZSAmJiBzb3VyY2VMaXN0KSB7XFxuICAgICAgICBzb3VyY2VMaXN0LmZvckVhY2goKHYpID0+IHtcXG4gICAgICAgICAgICBsZXQgdGFnID0gU3RyaW5nKHYubmFtZSkuc3BsaXQoXFxcIl1cXFwiKVswXS5zcGxpdChcXFwiW1xcXCIpWzFdO1xcbiAgICAgICAgICAgIGlmICh0YWcgJiYgIXRhZ0NsYXNzZXMuaW5jbHVkZXModGFnKSkge1xcbiAgICAgICAgICAgICAgICB0YWdDbGFzc2VzLnB1c2godGFnKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICByZXR1cm4gdGFnQ2xhc3Nlcy5zbGljZSgpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRTZWFyY2hUYWcodGFnKSB7XFxuXFxuICAgIGlmICh0YWdDbGFzc2VzICYmIHRhZ0NsYXNzZXMuaW5jbHVkZXModGFnKSB8fCAodHlwZW9mIHRhZyA9PT0gXFxcInN0cmluZ1xcXCIgJiYgIXRhZykpIHtcXG4gICAgICAgIGN1cnJlbnRDb25maWcuc1RhZyA9IHRhZztcXG4gICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcImN1cnJlbnRDb25maWdcXFwiLCBjdXJyZW50Q29uZmlnKTtcXG4gICAgICAgIHNUYWcgPSB0YWc7XFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgfVxcbiAgICByZXR1cm4gZmFsc2U7XFxufVxcblxcbmZ1bmN0aW9uIGdldFNlYXJjaFRhZygpIHtcXG4gICAgcmV0dXJuIHNUYWc7XFxufVxcblxcbmZ1bmN0aW9uIGdldEFsbG93U2VhcmNoU291cmNlKHVzZVNUYWcpIHtcXG4gICAgbGV0IHNsaXN0O1xcbiAgICBpZiAoc2VhcmNoQWxsb3cubGVuZ3RoICYmICF1c2VTVGFnKSB7XFxuICAgICAgICBzbGlzdCA9IHNvdXJjZUxpc3QuZmlsdGVyKHYgPT4gc2VhcmNoQWxsb3cuaW5jbHVkZXModi5rZXkpKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHNsaXN0ID0gc291cmNlTGlzdC5maWx0ZXIodiA9PiB2LnNlYXJjaGFibGUpO1xcbiAgICB9XFxuICAgIGlmICh1c2VTVGFnKSB7XFxuICAgICAgICBpZiAoc1RhZykge1xcbiAgICAgICAgICAgIHNsaXN0ID0gc2xpc3QuZmlsdGVyKHYgPT4gU3RyaW5nKHYubmFtZSkuaW5jbHVkZXMoXFxcIltcXFwiICsgc1RhZyArIFxcXCJdXFxcIikpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBzbGlzdCA9IHNsaXN0LmZpbHRlcih2ID0+ICEvXFxcXFsuKj9cXFxcXS8udGVzdChTdHJpbmcodi5uYW1lKSkpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGlmIChzbGlzdC5sZW5ndGggPT0gMCkge1xcbiAgICAgICAgc2xpc3QgPSBzb3VyY2VMaXN0LnNsaWNlKCk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHNsaXN0O1xcbn1cXG5cXG5mdW5jdGlvbiBpc1ByZXBhcmVkKCkge1xcbiAgICByZXR1cm4gaXNQcmVwYXJlO1xcbn1cXG5cXG5pc1ByZXBhcmUgPSBwcmVwYXJlKHN0b3JhZ2UwLmdldEl0ZW0oXFxcImN1cnJlbnRDb25maWdcXFwiLCB7fSkpO1xcbiQuZXhwb3J0cyA9IHtcXG4gICAgcHJlcGFyZSxcXG4gICAgZ2V0Q3VycmVudENvbmZpZyxcXG4gICAgc2V0Q3VycmVudENvbmZpZyxcXG4gICAgZ2V0Q3VycmVudFNvdXJjZSxcXG4gICAgZ2V0Q3VycmVudFNvdXJjZVBhdGgsXFxuICAgIHNldEN1cnJlbnRTb3VyY2UsXFxuICAgIGdldENhblNlYXJjaFNvdXJjZSxcXG4gICAgZ2V0U2VhcmNoQWxsb3csXFxuICAgIHNldFNlYXJjaEFsbG93LFxcbiAgICBnZXRBbGxTb3VyY2UsXFxuICAgIGdldEFsbG93U2VhcmNoU291cmNlLFxcbiAgICBpc1ByZXBhcmVkLFxcbiAgICBnZXRBYnNvbHV0ZVBhdGgsXFxuICAgIGdldEFsbFNvdXJjZXMsXFxuICAgIGZpbmRTb3VyY2UsXFxuICAgIGdldFRhZ0NsYXNzZXMsXFxuICAgIHNldFNlYXJjaFRhZyxcXG4gICAgZ2V0U2VhcmNoVGFnLFxcbn07XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLnvJbovpHphY3nva5cIixcInBhdGhcIjpcImNyZWF0ZUNvbmZpZ1wiLFwicnVsZVwiOlwianM6XFxubGV0IGxheW91dCA9IFtdO1xcbnNldFBhZ2VUaXRsZShcXFwi5Yib5bu66YWN572uXFxcIik7XFxubGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG5sZXQgY3VycmVudGNvbmZpZyA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudENvbmZpZygpO1xcbmxldCBmID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcIik7XFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiB7XFxuICBjbGVhck15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX25hbWVcXFwiKTtcXG4gIGNsZWFyTXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCIpO1xcbn0pO1xcblxcbi8v5Y6G5Y+y6YWN572u6K6w5b2VXFxuZnVuY3Rpb24gdW5pcXVlQXJyYXlCeVByb3BlcnR5KGFycmF5LCBwcm9wZXJ0eSkge1xcbiAgbGV0IHVuaXF1ZSA9IFtdO1xcbiAgbGV0IG1hcCA9IG5ldyBNYXAoKTtcXG4gIGZvciAobGV0IGl0ZW0gb2YgYXJyYXkpIHtcXG4gICAgbGV0IGtleSA9IGl0ZW1bcHJvcGVydHldO1xcbiAgICBpZiAoIW1hcC5oYXMoa2V5KSkge1xcbiAgICAgIG1hcC5zZXQoa2V5LCB0cnVlKTtcXG4gICAgICB1bmlxdWUucHVzaChpdGVtKTtcXG4gICAgfVxcbiAgfVxcbiAgcmV0dXJuIHVuaXF1ZTtcXG59XFxubGV0IGNwYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvRHJweUhpa2VyL1xcXCIrXFxcImRycHljb25maWcuanNvblxcXCI7XFxubGV0IG9sZHBhdGg9XFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvXFxcIiArIFxcXCJkcnB5Y29uZmlnLmpzb25cXFwiXFxuaWYoIWZpbGVFeGlzdChjcGF0aCkmJmZpbGVFeGlzdChvbGRwYXRoKSl7XFxuICBsZXQgY29udGVudCA9IEpTT04ucGFyc2UocmVhZEZpbGUob2xkcGF0aCkpIHx8IFtdO1xcbiAgc2F2ZUZpbGUoY3BhdGgsSlNPTi5zdHJpbmdpZnkoY29udGVudCkpO1xcbn1cXG5sZXQgcGF0aGNvbmZpZ3MgPSBbXTtcXG50cnkge1xcbiAgcGF0aGNvbmZpZ3MgPSBKU09OLnBhcnNlKHJlYWRGaWxlKGNwYXRoKSkgfHwgW107XFxuICAvL3B1dE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnc1xcXCIscGF0aGNvbmZpZ3MpO1xcbn0gY2F0Y2ggKGUpIHtcXG4gIGNvbnNvbGUubG9nKGUubWVzc2FnZSk7XFxufVxcbnBhdGhjb25maWdzID0gdW5pcXVlQXJyYXlCeVByb3BlcnR5KHBhdGhjb25maWdzLCBcXFwicGF0aFxcXCIpO1xcbi8vbG9nKHBhdGhjb25maWdzKVxcblxcbmxldCBjb25maWdzX29iaiA9IHtcXG4gIHBhdGg6IGNwYXRoLFxcbiAgY29uZmlnczogcGF0aGNvbmZpZ3NcXG59XFxuLy/ljoblj7LphY3nva7orrDlvZVcXG5sYXlvdXQucHVzaCh7XFxuICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCIsXFxuICB0aXRsZTogXFxcIuaPkOekulxcXCIsXFxuICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9zeXN0ZW0vMjcucG5nXFxcIixcXG4gIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgIGNvbnN0IGhpa2VyUG9wID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD02OTY2XFxcIik7XFxuICAgIGxldCBwb3AgPSBoaWtlclBvcC5pbmZvQm90dG9tKHtcXG4gICAgICBjb250ZW50OiBcXFwi6K+m57uGXFxcIixcXG4gICAgICBvcHRpb25zOiBbXFxuICAgICAgICBcXFwi56ys5LiA56m6KOWQjeensCk65pa55L6/5LiL5qyh5om+5YiwXFxcIixcXG4gICAgICAgIFxcXCLnrKzkuoznqboo6Lev5b6EKVvloavmnKzlnLDntKLlvJXlnLDlnYBdOumAieaLqUpTT04vVVJM6YCJ6aG577yM54K55Ye75peB6L6555qE6YCJ5oup5Y+v5Lul5rWP6KeI5pys5Zyw5paH5Lu26YCJ5oup5pys5Zyw5YyF55qELmpzb27ntKLlvJXmlofku7bljbPlj6/jgIJcXFxcbijms6jmhI/vvJrkvb/nlKjmraTnp43mlrnlvI/vvIzlnKjmnKzlnLDmlofku7blpLnlhoXmlrDlop7miJbliKDpmaQuanPmupDml7bpnIDopoHoh6rooYzphY3nva4uanNvbuaWh+S7tilcXFwiLFxcbiAgICAgICAgXFxcIuesrOS6jOepuijot6/lvoQpW+Whq+acrOWhq+i/nOeoi+WcsOWdgF0655u05o6l5aGr5YaZ6L+c56iL6ZO+5o6l5Y2z5Y+v5LiA6Iis5piv5LulaHR0cOW8gOWktC5qc29u57uT5bC+77yM5Lmf5Y+v5Y+v5Lul6L6T5YWlZ2l0aHVi5LuT5bqT55qE5paH5Lu25aS55Zyw5Z2A44CC5q2k56eN5pa55byP5Y+v5Lul5L+d5oyB5LiO6L+c56iL6YWN572u6ICF5ZCM5q2l5pu05paw77yM5L2G5LiN5aaC5pys5Zyw5b+r44CCXFxcIixcXG4gICAgICAgIFxcXCLnrKzkuoznqboo6Lev5b6EKVvloavmnKzlnLDmlofku7blpLnlnLDlnYBdOumAieaLqeaWh+S7tuWkuemAiemhue+8jOWPr+S7peebtOaOpei+k+WFpWpz5rqQ5omA5ZyoI+aWh+S7tuWkuSEhISPnmoTot6/lvoTvvIzkuZ/lj6/ku6Xngrnlh7vml4HovrnpgInmi6nmtY/op4jmnKzlnLDot6/lvoTpgInmi6kj5paH5Lu25aS5ISEhI++8jOS9v+eUqOivpeenjeaWueazle+8jOWcqOaWh+S7tuWkueaWsOWinuaIluWIoOmZpOa6kOaXtu+8jOS4jeeUqOaJi+WKqOmFjee9ri5qc29u5paH5Lu277yM6Ieq5Yqo6K+75Y+W44CCKOazqOaEj++8mumcgOimgeWIt+aWsOmFjee9ruaIlumHjeWQr+i9r+S7tuaJjeiDveivu+WPlilcXFwiLFxcbiAgICAgICAgXFxcIltRJkFd5Li65LuA5LmI6K6i6ZiF6ZO+5o6l5pyJ5b6I5aSa5rqQ77yM5Y205Y+q6K+G5Yir5Yiw5LqG5Yeg5Liq5rqQ77yfXFxcXG7mnKzlsI/nqIvluo/lj6rmlK/mjIHpgZPplb/nmoRkcnB5W2pzXeinhumikea6kO+8jOWFtuS7luS4gOamguS4jeaUr+aMgeOAguWboOatpOS8muiHquWKqOi/h+a7pOWFtuS7lua6kFxcXCIsXFxuICAgICAgICBcXFwiW1EmQV3miZPnrpfmlK/mjIHlhbbku5Z0dmJveOeahOa6kOWQl++8n+S4jeaUr+aMgeS4jeiAg+iZkeOAguivt+eci+WQjeWtl0RycHlIaWtlcu+8jOWPquaUr+aMgWRycHnvvIzopoHnlKjlhbbku5bmupDvvIzlu7rorq7liKDpmaTmnKzlsI/nqIvluo/vvIzljrvnlKjlkITnp43lo7PlrZDjgIJcXFwiXFxuICAgICAgXVxcbiAgICB9KTtcXG4gICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gIH0pLFxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgZGVzYzogXFxcIuWQjeensCjlv4XloaspXFxcIixcXG4gIGV4dHJhOiB7XFxuICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfbmFtZVxcXCIsIFxcXCJcXFwiKSxcXG4gICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgIHB1dE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX25hbWVcXFwiLCBpbnB1dCk7XFxuICAgIH0pLFxcbiAgICBpZDogXFxcImRycHlIaWtlcl9jb25maWdfbmFtZVxcXCJcXG4gIH1cXG59KTtcXG5cXG5sZXQgc2VsZWN0X21vZGUgPSBnZXRJdGVtKFxcXCJzZWxlY3RfY29uZmlnX21vZGVcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCBuYXYgPSBbXFxcIkpTT04vVVJMXFxcIiwgXFxcIuaWh+S7tuWkuVxcXCJdO1xcblxcbm5hdi5mb3JFYWNoKCh4LCBpKSA9PiB7XFxuICBsYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIChpID09IHNlbGVjdF9tb2RlID8geC5mb250Y29sb3IoXFxcIiMxNUI3NkNcXFwiKSA6IHgpLFxcbiAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGkpID0+IHtcXG4gICAgICBzZXRJdGVtKFxcXCJzZWxlY3RfY29uZmlnX21vZGVcXFwiLCBpICsgXFxcIlxcXCIpO1xcbiAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgaSksXFxuICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICB9KVxcbn0pXFxuXFxuXFxubGV0IHBhdGggPSBqb2luVXJsKGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvXFxcIiksIFxcXCIuLi9cXFwiLnJlcGVhdCg1KSkuc2xpY2UoNyk7XFxuXFxuaWYgKHNlbGVjdF9tb2RlID09IFxcXCIwXFxcIikge1xcbiAgbGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqVxcXCIsXFxuICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCIpLmV4dHJhO1xcbiAgICAgICAgdXBkYXRlSXRlbShcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIiwge1xcbiAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXG4gICAgICAgICAgfSlcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgfSksXFxuICAgICAgcm9vdERpclBhdGg6IHBhdGgsXFxuICAgICAgaW5pdGlhbFBhdGg6IHBhdGgsXFxuICAgICAgcGF0dGVybjogMCxcXG4gICAgICBmaWxlVHlwZTogXFxcIi5qc29uXFxcIixcXG4gICAgfSkpLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIui3r+W+hChVUkwvSlNPTi9naXRodWIpXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICBkZWZhdWx0VmFsdWU6IFxcXCJcXFwiLFxcbiAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFwiLCBpbnB1dCk7XFxuICAgICAgfSksXFxuICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFwiXFxuICAgIH1cXG4gIH0pO1xcbn1cXG5pZiAoc2VsZWN0X21vZGUgPT0gXFxcIjFcXFwiKSB7XFxuICBsYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6YCJ5oupXFxcIixcXG4gICAgdXJsOiBKU09OLnN0cmluZ2lmeShmLmZpbGVTZWxlY3Rpb25Vcmkoe1xcbiAgICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIGxldCB0YXJnZXQgPSBmaW5kSXRlbShcXFwiZHJweUhpa2VyX2NvbmZpZ19mb2xkZXJcXFwiKS5leHRyYTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oXFxcImRycHlIaWtlcl9jb25maWdfZm9sZGVyXFxcIiwge1xcbiAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXG4gICAgICAgICAgfSlcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgfSksXFxuICAgICAgcm9vdERpclBhdGg6IHBhdGgsXFxuICAgICAgaW5pdGlhbFBhdGg6IHBhdGgsXFxuICAgICAgcGF0dGVybjogMSxcXG4gICAgICAvL2ZpbGVUeXBlOiBcXFwiLmpzb25cXFwiLFxcbiAgICB9KSksXFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi6Lev5b6EKOaWh+S7tuWkuSlcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgIGRlZmF1bHRWYWx1ZTogXFxcIlxcXCIsXFxuICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCIsIGlucHV0KTtcXG4gICAgICB9KSxcXG4gICAgICBpZDogXFxcImRycHlIaWtlcl9jb25maWdfZm9sZGVyXFxcIlxcbiAgICB9XFxuICB9KTtcXG59XFxubGF5b3V0LnB1c2goe1xcbiAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gIHRpdGxlOiBcXFwi56Gu6K6kXFxcIixcXG4gIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoY29iaikgPT4ge1xcbiAgICBsZXQgcGF0aCA9IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFwiLCBcXFwiXFxcIik7XFxuICAgIGxldCBuYW1lID0gZ2V0TXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfbmFtZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgaWYgKCEocGF0aCAmJiBuYW1lKSkge1xcbiAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kuI3lj6/kuLrnqbpcXFwiO1xcbiAgICB9XFxuICAgIHBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSA/IHBhdGggOiBwYXRoLnN0YXJ0c1dpdGgoXFxcIi9cXFwiKSA/IChcXFwiZmlsZTovL1xcXCIgKyBwYXRoKSA6IHBhdGg7XFxuICAgIC8vbG9nKHBhdGgpXFxuICAgIHRyeSB7XFxuICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgIHNob3dMb2FkaW5nKFxcXCLmraPlnKjliqDovb3phY3nva4uLi5cXFwiKTtcXG4gICAgICB9XFxuXFxuICAgICAgaWYgKHJ1bnRpbWVDb25maWcuc2V0Q3VycmVudENvbmZpZyh7XFxuICAgICAgICBwYXRoLFxcbiAgICAgICAgbmFtZSxcXG4gICAgICB9KSkge1xcbiAgICAgICAgY29iai5jb25maWdzLnB1c2goe1xcbiAgICAgICAgICBwYXRoLFxcbiAgICAgICAgICBuYW1lLFxcbiAgICAgICAgfSlcXG4gICAgICAgIGNsZWFySXRlbShcXFwibm9fbG9hZGluZ1xcXCIpO1xcbiAgICAgICAgc2F2ZUZpbGUoY29iai5wYXRoLCBKU09OLnN0cmluZ2lmeShjb2JqLmNvbmZpZ3MpKTtcXG5cXG4gICAgICAgIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIik7XFxuICAgICAgICBEcnB5TWFuYWdlLmNsZWFyKCk7XFxuICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgICQucmVxdWlyZShcXFwiQ2hhbmdlU291cmNlUG9wXFxcIikuc2hvdygxMDApO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgICAgfVxcbiAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/phY3nva7mlofku7bmnInor69cXFwiO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBlLnRvU3RyaW5nKCk7XFxuICAgIH0gZmluYWxseSB7XFxuICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgfVxcbiAgfSwgY29uZmlnc19vYmopLFxcbiAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG59KTtcXG5cXG5pZiAocGF0aGNvbmZpZ3MubGVuZ3RoKSB7XFxuICBsYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIFxcXCI8c21hbGw+5Y6G5Y+y6YWN572u6K6w5b2VIOeCueaIkei/m+ihjOmFjee9ruajgOmqjDwvc21hbGw+XFxcIixcXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChwKSA9PiB7XFxuICAgICAgLy9sb2cocClcXG4gICAgICBmdW5jdGlvbiB1bmlxdWUoYXJyKSB7XFxuICAgICAgICBjb25zdCByZXMgPSBuZXcgTWFwKCk7XFxuICAgICAgICByZXR1cm4gYXJyLmZpbHRlcigoYSkgPT4gIXJlcy5oYXMoYSkgJiYgcmVzLnNldChhLCAxKSlcXG4gICAgICB9XFxuICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcXG4gICAgICBpZiAocC5sZW5ndGggPT0gMCkge1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aXoOWcsOWdgFxcXCI7XFxuICAgICAgfVxcbiAgICAgIGxpc3QgPSBwLm1hcCh4ID0+IHgucGF0aCk7XFxuICAgICAgdmFyIHRhc2sgPSBmdW5jdGlvbiAob2JqKSB7XFxuICAgICAgICBsZXQgcyA9IERhdGUubm93KCk7XFxuICAgICAgICBsZXQganNGaWxlcyA9IFtdO1xcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcXG5cXG4gICAgICAgIGZ1bmN0aW9uIGZpbHRlck90aGVyKGxpc3QpIHtcXG4gICAgICAgICAgcmV0dXJuIGxpc3QuZmlsdGVyKGl0ID0+IFN0cmluZyhpdC5hcGkpLmluY2x1ZGVzKFxcXCJkcnB5Mi5taW4uanNcXFwiKSB8fCBTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIuanNcXFwiKSlcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChvYmoudXJsLnN0YXJ0c1dpdGgoXFxcImZpbGU6XFxcIikpIHtcXG4gICAgICAgICAgbGV0IGNvZGUgPSBcXFwibm9cXFwiO1xcbiAgICAgICAgICBsZXQgcGF0aCA9IG9iai51cmwucmVwbGFjZShcXFwiZmlsZTovL1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgbGV0IGRpciA9IG5ldyBqYXZhLmlvLkZpbGUocGF0aCk7XFxuICAgICAgICAgIGlmIChkaXIuaXNEaXJlY3RvcnkoKSkge1xcbiAgICAgICAgICAgIGxldCBmbGlzdCA9IGRpci5saXN0RmlsZXMoKTtcXG4gICAgICAgICAgICBmb3IgKHZhciBmIG9mIGZsaXN0KSB7XFxuICAgICAgICAgICAgICAvLyDmo4Dmn6Xmlofku7blkI3mmK/lkKbku6UuanPnu5PlsL5cXG4gICAgICAgICAgICAgIGlmIChmLmlzRmlsZSgpICYmIGYuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoXFxcIi5qc1xcXCIpKSB7XFxuICAgICAgICAgICAgICAgIGpzRmlsZXMucHVzaChmKTtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKGRpci5pc0ZpbGUoKSAmJiBmaWxlRXhpc3Qob2JqLnVybCkpIHtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UocmVhZEZpbGUob2JqLnVybCkpO1xcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbi5zaXRlcykgfHwganNvbi5zaXRlcy5sZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgY291bnQgPSBmaWx0ZXJPdGhlcihqc29uLnNpdGVzKS5sZW5ndGg7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyB9XFxuICAgICAgICAgICAgY29kZSA9IFxcXCJva1xcXCI7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKGpzRmlsZXMubGVuZ3RoID49IDUpIHtcXG4gICAgICAgICAgICBjb3VudCA9IGpzRmlsZXMubGVuZ3RoO1xcbiAgICAgICAgICAgIGNvZGUgPSBcXFwib2tcXFwiO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgdGltZTogKERhdGUubm93KCkgLSBzKSxcXG4gICAgICAgICAgICB1cmw6IG9iai51cmwsXFxuICAgICAgICAgICAgY291bnQ6IGNvdW50LFxcbiAgICAgICAgICAgIGNvZGU6IGNvZGUsXFxuICAgICAgICAgICAgaW5kZXg6IG9iai5pXFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHZhciBqID0gSlNPTi5wYXJzZShmZXRjaChvYmoudXJsLCB7XFxuICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlLFxcbiAgICAgICAgICB0aW1lb3V0OiA1MDAwLFxcbiAgICAgICAgfSkpO1xcbiAgICAgICAgbGV0IGUgPSBEYXRlLm5vdygpO1xcbiAgICAgICAgbGV0IGMgPSBlIC0gcztcXG4gICAgICAgIGlmIChvYmoudXJsLmluY2x1ZGVzKFxcXCJnaXRodWIuY29tXFxcIikgJiYgai5zdGF0dXNDb2RlID09IDIwMCkge1xcbiAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIHZhciBodG1sID0gai5ib2R5O1xcbiAgICAgICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShwZGZoKGh0bWwsIFxcXCIjcmVwby1jb250ZW50LXBqYXgtY29udGFpbmVyJiZzY3JpcHQmJkh0bWxcXFwiKSk7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBqc29uLnBheWxvYWQudHJlZS5pdGVtcztcXG4gICAgICAgICAgICBjb3VudCA9IGxpc3QuZmlsdGVyKHggPT4geC5uYW1lLmVuZHNXaXRoKFxcXCIuanNcXFwiKSkubGVuZ3RoO1xcbiAgICAgICAgICB9IGNhdGNoIHsgfVxcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKHRvQ29ycmVjdEpTT05TdHJpbmcoai5ib2R5KSB8fCBcXFwie31cXFwiKTtcXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbi5zaXRlcykgfHwganNvbi5zaXRlcy5sZW5ndGgpIHtcXG4gICAgICAgICAgICBjb3VudCA9IGZpbHRlck90aGVyKGpzb24uc2l0ZXMpLmxlbmd0aDtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkgeyB9XFxuXFxuICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICB0aW1lOiBjLFxcbiAgICAgICAgICB1cmw6IGoudXJsLFxcbiAgICAgICAgICBjb3VudDogY291bnQsXFxuICAgICAgICAgIGNvZGU6IGouc3RhdHVzQ29kZSxcXG4gICAgICAgICAgaW5kZXg6IG9iai5pLFxcbiAgICAgICAgfVxcbiAgICAgIH07XFxuICAgICAgbGV0IHRhc2tzID0gbGlzdC5tYXAoKHgsIGkpID0+IHtcXG4gICAgICAgIGkgPSBpICsgMTtcXG4gICAgICAgIHJldHVybiB7XFxuICAgICAgICAgIGZ1bmM6IHRhc2ssXFxuICAgICAgICAgIHBhcmFtOiB7XFxuICAgICAgICAgICAgdXJsOiB4LFxcbiAgICAgICAgICAgIGk6IGkgLSAxLFxcbiAgICAgICAgICB9LFxcbiAgICAgICAgICBpZDogJ3Rhc2tpZCcgKyBpXFxuICAgICAgICB9XFxuICAgICAgfSk7XFxuICAgICAgdmFyIGNvdW50ID0gc3VjY2VzcyA9IHRhc2tzLmxlbmd0aDtcXG4gICAgICBiZSh0YXNrcywge1xcbiAgICAgICAgZnVuYzogZnVuY3Rpb24gKG9iaiwgaWQsIGVycm9yLCB0YXNrUmVzdWx0KSB7XFxuICAgICAgICAgIG9iai5yZXN1bHRzLnB1c2godGFza1Jlc3VsdClcXG4gICAgICAgICAgY291bnQgPSBjb3VudCAtIDE7XFxuICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcXG4gICAgICAgICAgICBzaG93TG9hZGluZyhcXFwi5qOA5rWL5LitLi4u5Ymp5L2Z5Zyw5Z2A77yaXFxcIiArIGNvdW50KVxcbiAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuICAgICAgICBwYXJhbToge1xcbiAgICAgICAgICBoaTogJ2NjYycsXFxuICAgICAgICAgIHJlc3VsdHM6IHJlc3VsdHNcXG4gICAgICAgIH1cXG4gICAgICB9LCBzdWNjZXNzKTtcXG4gICAgICAvL2xvZyhyZXN1bHRzKVxcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcihmID0+IGYpO1xcbiAgICAgIHJlc3VsdHMuZm9yRWFjaCgoeCwgaSkgPT4ge1xcbiAgICAgICAgbGV0IGl0ZW0gPSBmaW5kSXRlbShcXFwicGF0aFxcXCIgKyB4LmluZGV4KTtcXG4gICAgICAgIGxldCByZWdleCA9IC8o5ZCN56ewOi4qPykoXFxcXHMrKT9cXFxcbi9nO1xcbiAgICAgICAgbGV0IHRpdGxlID0gXFxcIuWQjeensDpcXFwiICsgcFt4LmluZGV4XS5uYW1lICsgXFxcIiBcXFwiO1xcbiAgICAgICAgbGV0IHVybCA9IHBbeC5pbmRleF0ucGF0aDtcXG4gICAgICAgIGxldCBtc2cgPSBcXFwiXFxcIjtcXG4gICAgICAgIGxldCBjb3VudCA9IHguY291bnQgIT0gMCA/IFxcXCIg5rqQ5pWw6YePOlxcXCIgKyB4LmNvdW50IDogXFxcIlxcXCI7XFxuICAgICAgICBpZiAoL25vLy50ZXN0KHguY29kZSkpIHtcXG4gICAgICAgICAgbXNnID0gaXRlbS50aXRsZS5yZXBsYWNlKHJlZ2V4LCB0aXRsZSArIFxcXCLphY3nva7mnInor69cXFwiLmZvbnRjb2xvcihcXFwicmVkXFxcIikgKyBcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoL14oLTF8MHw0MDQpLy50ZXN0KHguY29kZSkpIHtcXG4gICAgICAgICAgbXNnID0gaXRlbS50aXRsZS5yZXBsYWNlKHJlZ2V4LCB0aXRsZSArIFxcXCLml6Dms5Xorr/pl65cXFwiLmZvbnRjb2xvcihcXFwicmVkXFxcIikgKyBcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoL14yMDAvLnRlc3QoeC5jb2RlKSkge1xcbiAgICAgICAgICBtc2cgPSBpdGVtLnRpdGxlLnJlcGxhY2UocmVnZXgsIHRpdGxlICsgXFxcIumAmuiur+ato+W4uFxcXCIuZm9udGNvbG9yKFxcXCIjM0NCMzcxXFxcIikgKyBcXFwiICDlu7bov586XFxcIiArIHgudGltZSArIGNvdW50ICsgXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICAgIC8vdXJsID0gaXRlbS51cmw7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICBtc2cgPSBpdGVtLnRpdGxlLnJlcGxhY2UocmVnZXgsIHRpdGxlICsgXFxcIumFjee9ruato+ehrlxcXCIuZm9udGNvbG9yKFxcXCIjM0NCMzcxXFxcIikgKyBjb3VudCArIFxcXCJcXFxcblxcXCIpO1xcbiAgICAgICAgICAvL3VybCA9IGl0ZW0udXJsO1xcbiAgICAgICAgfVxcbiAgICAgICAgdXBkYXRlSXRlbShpdGVtLmV4dHJhLmlkLCB7XFxuICAgICAgICAgIHRpdGxlOiBtc2csXFxuICAgICAgICAgIC8vdXJsOiB1cmwsXFxuICAgICAgICB9KVxcbiAgICAgIH0pO1xcbiAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfSwgcGF0aGNvbmZpZ3MpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxuICB9KVxcbiAgcGF0aGNvbmZpZ3MuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xcbiAgICBsZXQgbG9uZ0MgPSBbe1xcbiAgICAgIHRpdGxlOiBcXFwi5ZCN56ewXFxcIixcXG4gICAgICBqczogJC50b1N0cmluZygoaXRlbSwgcCwgYykgPT4ge1xcbiAgICAgICAgbGV0IGkgPSBjLmZpbmRJbmRleCh4ID0+IHgubmFtZSA9PSBpdGVtLm5hbWUpO1xcbiAgICAgICAgaWYgKGkgIT0gLTEpIHtcXG4gICAgICAgICAgcmV0dXJuICQoY1tpXS5uYW1lLCBcXFwi6L6T5YWl5paw5ZCN56ewXFxcIikuaW5wdXQoKGMsIHAsIGkpID0+IHtcXG4gICAgICAgICAgICBjW2ldLm5hbWUgPSBpbnB1dDtcXG4gICAgICAgICAgICBzYXZlRmlsZShwLCBKU09OLnN0cmluZ2lmeShjKSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgfSwgYywgcCwgaSlcXG4gICAgICAgIH1cXG4gICAgICB9LCBpdGVtLCBjcGF0aCwgcGF0aGNvbmZpZ3MpXFxuICAgIH0sIHtcXG4gICAgICB0aXRsZTogXFxcIui3r+W+hFxcXCIsXFxuICAgICAganM6ICQudG9TdHJpbmcoKGl0ZW0sIHAsIGMpID0+IHtcXG4gICAgICAgIGxldCBpID0gYy5maW5kSW5kZXgoeCA9PiB4Lm5hbWUgPT0gaXRlbS5uYW1lKTtcXG4gICAgICAgIGlmIChpICE9IC0xKSB7XFxuICAgICAgICAgIHJldHVybiAkKGNbaV0ucGF0aCwgXFxcIui+k+WFpeaWsOi3r+W+hFxcXCIpLmlucHV0KChjLCBwLCBpKSA9PiB7XFxuICAgICAgICAgICAgY1tpXS5wYXRoID0gaW5wdXQ7XFxuICAgICAgICAgICAgc2F2ZUZpbGUocCwgSlNPTi5zdHJpbmdpZnkoYykpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIH0sIGMsIHAsIGkpXFxuICAgICAgICB9XFxuICAgICAgfSwgaXRlbSwgY3BhdGgsIHBhdGhjb25maWdzKVxcbiAgICB9LCB7XFxuICAgICAgdGl0bGU6IFxcXCLliKDpmaRcXFwiLFxcbiAgICAgIGpzOiAkLnRvU3RyaW5nKChpdGVtLCBwLCBjKSA9PiB7XFxuICAgICAgICBsZXQgaSA9IGMuZmluZEluZGV4KHggPT4geC5uYW1lID09IGl0ZW0ubmFtZSk7XFxuICAgICAgICBpZiAoaSAhPSAtMSkge1xcbiAgICAgICAgICBjLnNwbGljZShpLCAxKTtcXG4gICAgICAgICAgc2F2ZUZpbGUocCwgSlNPTi5zdHJpbmdpZnkoYykpO1xcbiAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfVxcbiAgICAgIH0sIGl0ZW0sIGNwYXRoLCBwYXRoY29uZmlncylcXG4gICAgfV1cXG4gICAgaWYgKGl0ZW0ucGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICBsb25nQy5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6K6/6ZeuXFxcIixcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKChpdGVtKSA9PiB7XFxuICAgICAgICAgIGlmIChpdGVtLnBhdGguc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ3ZWI6Ly9cXFwiICsgaXRlbS5wYXRoO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9LCBpdGVtKVxcbiAgICAgIH0pXFxuICAgIH1cXG4gICAgbGV0IGN1cnJlbnQgPSBcXFwiXFxcIjtcXG4gICAgaWYgKGN1cnJlbnRjb25maWcgJiYgY3VycmVudGNvbmZpZy5oYXNPd25Qcm9wZXJ0eShcXFwicGF0aFxcXCIpKSB7XFxuICAgICAgaWYgKGl0ZW0ucGF0aCA9PSBjdXJyZW50Y29uZmlnLnBhdGgpIHtcXG4gICAgICAgIGN1cnJlbnQgPSBcXFwi4p6h77iPXFxcIjtcXG4gICAgICB9XFxuICAgIH1cXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIFxcXCI8c21hbGw+XFxcIiArIGN1cnJlbnQgKyBcXFwi5ZCN56ewOlxcXCIgKyBpdGVtLm5hbWUgKyBcXFwiXFxcXG7ot6/lvoQ6XFxcIiArIGl0ZW0ucGF0aCArIFxcXCI8L3NtYWxsPlxcXCIsXFxuICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKGl0ZW0gPT4ge1xcbiAgICAgICAgY2xlYXJJdGVtKFxcXCJub19sb2FkaW5nXFxcIik7XFxuICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgbGV0IHtcXG4gICAgICAgICAgcGF0aCxcXG4gICAgICAgICAgbmFtZVxcbiAgICAgICAgfSA9IGl0ZW07XFxuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuato+WcqOWKoOi9vemFjee9ri4uLlxcXCIpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHJ1bnRpbWVDb25maWcuc2V0Q3VycmVudENvbmZpZyh7XFxuICAgICAgICAgIHBhdGgsXFxuICAgICAgICAgIG5hbWUsXFxuICAgICAgICB9KSkge1xcblxcbiAgICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpO1xcbiAgICAgICAgICBEcnB5TWFuYWdlLmNsZWFyKCk7XFxuICAgICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgICAkLnJlcXVpcmUoXFxcIkNoYW5nZVNvdXJjZVBvcFxcXCIpLnNob3coMTAwKTtcXG4gICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liIfmjaLlpLHotKVcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgIH0sIGl0ZW0pLFxcbiAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgaWQ6ICdwYXRoJyArIGksXFxuICAgICAgICBsb25nQ2xpY2s6IGxvbmdDXFxuICAgICAgfVxcbiAgICB9KVxcbiAgfSlcXG59XFxuXFxuXFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmjaLmupDlvLnnqpdcIixcInBhdGhcIjpcIkNoYW5nZVNvdXJjZVBvcFwiLFwicnVsZVwiOlwiJC5leHBvcnRzLnNob3cgPSBmdW5jdGlvbih0aW1lKSB7XFxuICAgIGlmICh0aW1lKSB7XFxuICAgICAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKHRpbWUpO1xcbiAgICB9XFxuICAgIGNvbnN0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZSgpO1xcbiAgICBsZXQgbmFtZSA9IHNvdXJjZSA/IHNvdXJjZS5uYW1lIDogXFxcIlxcXCI7XFxuICAgIGNvbnN0IGhpa2VyUG9wID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD02OTY2XFxcIik7XFxuICAgIGxldCBzb3VyY2VOYW1lTGlzdCA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlKCkubWFwKHYgPT4ge1xcbiAgICAgICAgcmV0dXJuIHYubmFtZSA9PSBuYW1lID8gXFxcIuKAmOKAmFxcXCIgKyB2Lm5hbWUgKyBcXFwi4oCZ4oCZXFxcIiA6IHYubmFtZTtcXG4gICAgfSk7XFxuICAgIGhpa2VyUG9wLnNldFVzZVN0YXJ0QWN0aXZpdHkoZmFsc2UpO1xcblxcbiAgICAvL+aOkuW6j+aWueazlVxcbiAgICBsZXQge1xcbiAgICAgICAgbmF0dXJhbFNvcnQsXFxuICAgICAgICB1c2luZ1NvcnRcXG4gICAgfSA9ICQucmVxdWlyZShcXFwibWV0aG9kc1xcXCIpO1xcblxcbiAgICBsZXQgc3BlbiA9IDM7XFxuICAgIGxldCBpdGVtcyA9IHNvdXJjZU5hbWVMaXN0Lm1hcCgoeCwgaSkgPT4ge1xcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICB0aXRsZTogeCxcXG4gICAgICAgICAgICB1cmw6IGlcXG4gICAgICAgIH1cXG4gICAgfSlcXG5cXG4gICAgbGV0IG5hbWVzID0gaXRlbXMubWFwKHYgPT4gdi50aXRsZSk7XFxuICAgIGxldCBzbmFtZSA9IG5hbWVzLnNsaWNlKCk7XFxuICAgIGlmIChnZXRJdGVtKFxcXCJuYXR1cmFsXFxcIiwgXFxcIlxcXCIpKSB7XFxuICAgICAgICBuYW1lcyA9IG5hdHVyYWxTb3J0KG5hbWVzKTtcXG4gICAgfVxcbiAgICBpZiAoZ2V0SXRlbShcXFwidXNpbmdzdFxcXCIsIFxcXCJcXFwiKSkge1xcbiAgICAgICAgbmFtZXMgPSB1c2luZ1NvcnQuZ2V0KG5hbWVzKTtcXG4gICAgfVxcblxcbiAgICBsZXQgbWFuYWdlX2FsbCA9IG5hbWVzLnNsaWNlKCk7XFxuICAgIGxldCBzZWFyY2hLZXkgPSBcXFwiXFxcIjtcXG4gICAgbGV0IGlucHV0Qm94O1xcbiAgICBsZXQgcG9wID0gaGlrZXJQb3Auc2VsZWN0Qm90dG9tUmVzKHtcXG4gICAgICAgIG9wdGlvbnM6IG5hbWVzLFxcbiAgICAgICAgY29sdW1uczogc3BlbixcXG4gICAgICAgIHRpdGxlOiBcXFwi6YCJ5oup6KeG6aKR5rqQIOW9k+WJjeWFsTpcXFwiICsgaXRlbXMubGVuZ3RoICsgXFxcIuS4quinhumikea6kFxcXCIsXFxuICAgICAgICBub0F1dG9EaXNtaXNzOiB0cnVlLFxcbiAgICAgICAgcG9zaXRpb246IDEsXFxuICAgICAgICBleHRyYUlucHV0Qm94OiAoaW5wdXRCb3ggPSBuZXcgaGlrZXJQb3AuUmVzRXh0cmFJbnB1dEJveCh7XFxuICAgICAgICAgICAgaGludDogXFxcIua6kOWFs+mUruWtl1xcXCIsXFxuICAgICAgICAgICAgdGl0bGU6IFxcXCJUQUdcXFwiLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlKHRleHQsIG1hbmFnZSkge1xcbiAgICAgICAgICAgICAgICAvL2xvZyhcXFwib25DaGFuZ2U6XFxcIit0ZXh0KVxcbiAgICAgICAgICAgICAgICBsZXQgZmxpc3QgPSBuYW1lcy5maWx0ZXIoeCA9PiB4LmluY2x1ZGVzKHRleHQpKTtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICAgICAgZmxpc3QuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goeCk7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIGNsaWNrKHMsIG1hbmFnZSkge1xcbiAgICAgICAgICAgICAgICBsZXQgdGFnQ2xhc3NlcyA9IHJ1bnRpbWVDb25maWcuZ2V0VGFnQ2xhc3NlcygpO1xcbiAgICAgICAgICAgICAgICBpZiAoIXRhZ0NsYXNzZXMubGVuZ3RoKSByZXR1cm4gXFxcInRvYXN0Oi8v5b2T5YmN6YWN572u5rKh5pyJVEFH5ZOm44CCXFxcIjtcXG4gICAgICAgICAgICAgICAgaGlrZXJQb3Auc2VsZWN0Q2VudGVyKHtcXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRhZ0NsYXNzZXMsXFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiAzLFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCJUQUdbXFxcIiArIHRhZ0NsYXNzZXMubGVuZ3RoICsgXFxcIl1cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgY2xpY2soYSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Qm94LnNldERlZmF1bHRWYWx1ZShcXFwiW1xcXCIgKyBhICsgXFxcIl1cXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICB0aXRsZVZpc2libGU6IHRydWVcXG4gICAgICAgIH0pKSxcXG4gICAgICAgIGxvbmdDbGljayhzLCBpKSB7XFxuICAgICAgICAgICAgc2hvd1NlbGVjdE9wdGlvbnMoe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWIhuS6q+inhumikea6kFxcXCIsXFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IFtcXFwiSlPmlofku7bliIbkuqtcXFwiXS5jb25jYXQoZ2V0UGFzdGVzKCkpLFxcbiAgICAgICAgICAgICAgICBjb2w6IDIsXFxuICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKG5hbWUgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZXMgPSBydW50aW1lQ29uZmlnLmdldEFsbFNvdXJjZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZXMuZmluZCh2ID0+IHYubmFtZSA9PSBuYW1lKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gcnVudGltZUNvbmZpZy5nZXRBYnNvbHV0ZVBhdGgoc291cmNlLmV4dCk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcG5hbWUgPSBwYXRoLnNwbGl0KFxcXCIvXFxcIikuYXQoLTEpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBmZXRjaChwYXRoKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBlbmNvZGVNb2RlID0gZ2V0SXRlbShcXFwic2hhcmVfZW5jb2RlXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kZU1vZGUgJiYgL3ZhciBydWxlfFtcXFxcdTRFMDAtXFxcXHU5RkE1XSt8ZnVuY3Rpb258bGV0IHx2YXIgfGNvbnN0IHxcXFxcKHxcXFxcKXxcXFwifCcvLnRlc3QocnVsZSkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RlTW9kZSA9PT0gXFxcIkd6aXBcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBHWklQID0gJC5yZXF1aXJlKFxcXCJHWklQXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUgPSBHWklQLnppcChydWxlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVuY29kZU1vZGUgPT09IFxcXCJCYXNlNjRcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUgPSBiYXNlNjRFbmNvZGUocnVsZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbmNvZGVNb2RlID09PSBcXFwiQUVTXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDcnlwdG9VdGlsID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL2Fzc2V0cy9jcnlwdG8tamF2YS5qc1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlSGV4KFxcXCI2ODZBNjQ2ODZFNzgwQTBBMEEwQTBBMEEwQTBBMEEwQVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXYgPSBDcnlwdG9VdGlsLkRhdGEucGFyc2VIZXgoXFxcIjY0N0E3OTc5NjQ3MzBBMEEwQTBBMEEwQTBBMEEwQTBBXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0RGF0YSA9IENyeXB0b1V0aWwuRGF0YS5wYXJzZVVURjgocnVsZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmNyeXB0ZWQwID0gQ3J5cHRvVXRpbC5BRVMuZW5jcnlwdCh0ZXh0RGF0YSwga2V5LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiBcXFwiQUVTL0NCQy9QS0NTN1BhZGRpbmdcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXY6IGl2XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlID0gZW5jcnlwdGVkMC50b0Jhc2U2NChfYmFzZTY0Lk5PX1dSQVApO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGlmICghcnVsZSkgcmV0dXJuIFxcXCJ0b2FzdDovL+iOt+WPluWksei0pVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoTVlfSU5ERVggPT09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL1xcXCIgKyBwbmFtZSwgcnVsZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJzaGFyZTovL2hpa2VyOi8vZmlsZXMvX2NhY2hlL1xcXCIgKyBwbmFtZTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IHNoYXJlUGFzdGUoYmFzZTY0RW5jb2RlKHJ1bGUpLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8v5rW36ZiU6KeG55WM77yMRFJQWeinhumikea6kOOAjFxcXCIgKyBuYW1lICsgXFxcIuOAjeWkjeWItuaVtOadoeWPo+S7pOaJk+W8gOi9r+S7tuWwseS8muiHquWKqOWvvOWFpSRcXFwiICsgdXJsICsgXFxcIiRcXFwiICsgcG5hbWUgKyBcXFwiQGltcG9ydD1qczokLnJlcXVpcmUoJ2ltcG9ydD9ydWxlPScrXFxcIiArIEpTT04uc3RyaW5naWZ5KE1ZX1JVTEUudGl0bGUpICsgXFxcIikoaW5wdXQsIHRydWUpXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSwgcy5yZXBsYWNlKC9b4oCZ4oCYXS9nLCBcXFwiXFxcIikpXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9LFxcbiAgICAgICAgY2xpY2socywgaSwgbWFuYWdlKSB7XFxuICAgICAgICAgICAgcG9wLmRpc21pc3MoKTtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJub19sb2FkaW5nXFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgICAgICAgICAvLyBtYW5hZ2UubGlzdC5mb3JFYWNoKCh2LCBpaSkgPT4gKFxcbiAgICAgICAgICAgIC8vICAgbWFuYWdlLmxpc3RbaWldID0gaSA9PT0gaWkgPyBcXFwi4oCY4oCYXFxcIiArIG5hbWVzW2lpXSArIFxcXCLigJnigJlcXFwiIDogbmFtZXNbaWldLnJlcGxhY2UoL1vigJnigJhdL2csIFxcXCJcXFwiKVxcbiAgICAgICAgICAgIC8vICkpO1xcbiAgICAgICAgICAgIGxldCBuYW1lID0gbWFuYWdlLmxpc3RbaV0ucmVwbGFjZSgvW+KAmeKAmF0vZywgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGlmIChuYW1lID09IHNvdXJjZS5uYW1lKSB7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHNvdXJjZXMgPSBydW50aW1lQ29uZmlnLmdldEFsbFNvdXJjZSgpO1xcbiAgICAgICAgICAgIGxldCBrZXkgPSBzb3VyY2VzLmZpbmQodiA9PiB2Lm5hbWUgPT0gbmFtZSkua2V5O1xcblxcbiAgICAgICAgICAgIHVzaW5nU29ydC5zZXQobmFtZSk7XFxuXFxuICAgICAgICAgICAgLy9tYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgbGV0IHNvdXJjZU5hbWVMaXN0ID0gcnVudGltZUNvbmZpZy5zZXRDdXJyZW50U291cmNlKGtleSk7XFxuXFxuICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwiY2F0ZWlcXFwiKTtcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXCJjYXRlX29ialxcXCIpO1xcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcImlzaG9tZVxcXCIpO1xcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcImxpbmtzXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG5cXG4gICAgICAgIH0sXFxuICAgICAgICBtZW51Q2xpY2sobWFuYWdlKSB7XFxuICAgICAgICAgICAgaGlrZXJQb3Auc2VsZWN0Q2VudGVyKHtcXG4gICAgICAgICAgICAgICAgb3B0aW9uczogW1xcXCLmlLnlj5jmoLflvI9cXFwiLCBcXFwi5YCS5bqPXFxcIiwgXFxcIuiHqueEtuaOkuW6jzpcXFwiICsgKGdldEl0ZW0oXFxcIm5hdHVyYWxcXFwiLCBcXFwiXFxcIikgPT0gXFxcIlxcXCIgPyBcXFwi5YWz6ZetXFxcIiA6IFxcXCLlkK/nlKhcXFwiKSwgXFxcIuS9v+eUqOaOkuW6jzpcXFwiICsgKGdldEl0ZW0oXFxcInVzaW5nc3RcXFwiLCBcXFwiXFxcIikgPT0gXFxcIlxcXCIgPyBcXFwi5YWz6ZetXFxcIiA6IFxcXCLlkK/nlKhcXFwiKSwgXFxcIuWIt+aWsOmFjee9rlxcXCIsIFxcXCLliIbkuqvml7bnvJbnoIE6XFxcIiArIGdldEl0ZW0oXFxcInNoYXJlX2VuY29kZVxcXCIsIFxcXCLkuI3nvJbnoIFcXFwiKV0sXFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IDIsXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi6K+36YCJ5oupXFxcIixcXG4gICAgICAgICAgICAgICAgY2xpY2socywgaSkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHMgPT0gXFxcIuaUueWPmOagt+W8j1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVuID0gc3BlbiA9PSAzID8gMSA6IChzcGVuID09IDIgPyAzIDogMik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmNoYW5nZUNvbHVtbnMoc3Blbik7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMuaW5jbHVkZXMoXFxcIuWAkuW6j1xcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucmV2ZXJzZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLnJldmVyc2UoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMuaW5jbHVkZXMoXFxcIuiHqueEtuaOkuW6j1xcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3QgPSBPYmplY3QuYXNzaWduKFtdLCBtYW5hZ2UubGlzdCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hdHVyYWwgPSBnZXRJdGVtKFxcXCJuYXR1cmFsXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYXR1cmFsID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdHVyYWxTb3J0KGxpc3QpLmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwidXNpbmdzdFxcXCIsIFxcXCJcXFwiKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYW1lLmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwibmF0dXJhbFxcXCIsIG5hdHVyYWwgPyBcXFwiXFxcIiA6IFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMuaW5jbHVkZXMoXFxcIuS9v+eUqOaOkuW6j1xcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3QgPSBPYmplY3QuYXNzaWduKFtdLCBtYW5hZ2UubGlzdCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVzaW5nc3QgPSBnZXRJdGVtKFxcXCJ1c2luZ3N0XFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2luZ3N0ID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nU29ydC5nZXQobGlzdCkuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goeCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJuYXR1cmFsXFxcIiwgXFxcIlxcXCIpXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hbWUuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goeCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJ1c2luZ3N0XFxcIiwgdXNpbmdzdCA/IFxcXCJcXFwiIDogXFxcIjFcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocyA9PSBcXFwi5Yi35paw6YWN572uXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFycmF5RGlmZmVyZW5jZShhcnIxLCBhcnIyKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoYXJyMi5tYXAoaXRlbSA9PiBbaXRlbS5rZXksIGl0ZW1dKSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnIxLmZpbHRlcihpdGVtID0+ICFtYXAuaGFzKGl0ZW0ua2V5KSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIiwgXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdCA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IENrZXkgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2UoKS5rZXk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9sb2coQ2tleSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2ZnID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50Q29uZmlnKClcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSA9IGNmZztcXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQ29uZmlnLnNldEN1cnJlbnRDb25maWcoe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVDb25maWcuc2V0Q3VycmVudFNvdXJjZShDa2V5KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnNvdXJjZXMgPSBydW50aW1lQ29uZmlnLmdldEFsbFNvdXJjZSgpO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbGlzdCA9IGFycmF5RGlmZmVyZW5jZShuc291cmNlcywgbGlzdCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRsaXN0ID0gYXJyYXlEaWZmZXJlbmNlKGxpc3QsIG5zb3VyY2VzKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxpc3QubGVuZ3RoID4gMCB8fCBkbGlzdC5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtc2cgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsaXN0Lmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaXN0LmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4Lm5hbWUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhcXFwi5paw5aKeOlxcXCIgKyBhbGlzdC5tYXAoayA9PiBrLm5hbWUpLmpvaW4oXFxcIixcXFwiKSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSBcXFwi5paw5aKeXFxcIiArIGFsaXN0Lmxlbmd0aCArIFxcXCLkuKrmupBcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkbGlzdC5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGlzdC5mb3JFYWNoKHggPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnNwbGljZShtYW5hZ2UubGlzdC5pbmRleE9mKHgubmFtZSksIDEpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhcXFwi56e76ZmkOlxcXCIgKyBkbGlzdC5tYXAoayA9PiBrLm5hbWUpLmpvaW4oXFxcIixcXFwiKSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSBcXFwiIOenu+mZpFxcXCIgKyBkbGlzdC5sZW5ndGggKyBcXFwi5Liq5rqQXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5zZXRUaXRsZShcXFwi6YCJ5oup6KeG6aKR5rqQIOW9k+WJjeWFsTpcXFwiICsgbWFuYWdlLmxpc3QubGVuZ3RoICsgXFxcIuS4quinhumikea6kFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2FzdChtc2cgKyBcXFwiIOabtOWkmuivpuaDheeci2xvZ1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLlt7LliLfmlrBcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dTZWxlY3RPcHRpb25zKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLnvJbnoIHnsbvlnotcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBbXFxcIuS4jee8lueggVxcXCIsIFxcXCJHemlwXFxcIiwgXFxcIkJhc2U2NFxcXCIsIFxcXCJBRVNcXFwiXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sOiAxLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTVlfSU5ERVggPT09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckl0ZW0oXFxcInNoYXJlX2VuY29kZVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJzaGFyZV9lbmNvZGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIGlucHV0O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJkcnB5566h55CGXCIsXCJwYXRoXCI6XCJEcnB5TWFuYWdlXCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBKU0VuZ2luZSA9IGNvbS5leGFtcGxlLmhpa2Vydmlldy5zZXJ2aWNlLnBhcnNlci5KU0VuZ2luZTtcXG5jb25zdCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuY29uc3QgZHJweU1hcCA9IG5ldyBNYXAoKTtcXG5jb25zdCBHTWtleSA9IG1vZHVsZS5pbXBvcnRQYXJhbTtcXG4vL2xvZyhcXFwi5Yid5aeL5YyWRHJweU1hbmFnZVxcXCIpO1xcbmNvbnN0IHByb3h5U2VtYXBob3JlID0gbmV3IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZSgzKTtcXG5cXG5mdW5jdGlvbiBidWlsZEpzRW52KHRpY2tldCkge1xcbiAgICBsZXQgY29kZSA9IFN0cmluZy5yYXdgXFxuICAgIC8vIGNvbnN0IG15X3J1bGUgPSAnXFxuICAgIGNvbnN0IE1ZX1JVTEUgPSAke215X3J1bGV9O1xcbiAgICBjb25zdCBteV9ydWxlID0gSlNPTi5zdHJpbmdpZnkoTVlfUlVMRSk7XFxuICAgIGNvbnN0IE1ZX1RJQ0tFVCA9IFxcXCIke3RpY2tldCB8fCBcXFwiXFxcIn1cXFwiO1xcbiAgICBldmFsKGdldEpzUGx1Z2luKCkpO1xcbiAgICBldmFsKGdldEpzTGF6eVBsdWdpbigpKTtcXG4gICAgYDtcXG4gICAgcmV0dXJuIGNvZGU7XFxufVxcblxcbmZ1bmN0aW9uIHN5bmMoZnVuYywgc3ApIHtcXG4gICAgcmV0dXJuIG5ldyBvcmcubW96aWxsYS5qYXZhc2NyaXB0LlN5bmNocm9uaXplcihmdW5jLCBzcCB8fCB7fSk7XFxufVxcblxcbmZ1bmN0aW9uIGNyZWF0ZURycHkoa2V5KSB7XFxuICAgIEpTRW5naW5lLmdldEluc3RhbmNlKCkuZXZhbEpTKGJ1aWxkSnNFbnYoTVlfVElDS0VUKSArIFxcXCJcXFxcbiFcXFwiICsgJC50b1N0cmluZygoa2V5LCBHTWtleSwgTVlfVElDS0VUKSA9PiB7XFxuICAgICAgICBsZXQgZHJweSA9ICQucmVxdWlyZShcXFwiZHJweVxcXCIsIGtleSk7XFxuICAgICAgICBHTS5oYXMoR01rZXksIChEcnB5TWFuYWdlKSA9PiB7XFxuICAgICAgICAgICAgRHJweU1hbmFnZS5wdXQoa2V5LCBkcnB5KTtcXG4gICAgICAgIH0pO1xcbiAgICB9LCBrZXksIEdNa2V5LCBNWV9USUNLRVQpICsgXFxcIjtcXFxcblxcXCIsIFxcXCJcXFwiLCBmYWxzZSk7XFxufVxcblxcbmZ1bmN0aW9uIGdldChrZXkpIHtcXG4gICAgcmV0dXJuIHN5bmMoKCkgPT4ge1xcbiAgICAgICAgLy9sb2coZHJweU1hcC5zaXplKVxcbiAgICAgICAgaWYgKGRycHlNYXAuaGFzKGtleSkpIHtcXG4gICAgICAgICAgICByZXR1cm4gZHJweU1hcC5nZXQoa2V5KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChkcnB5TWFwLnNpemUgPj0gNSkge1xcbiAgICAgICAgICAgIC8vbG9nKFxcXCLor7fmsYI6XFxcIiArIGtleSlcXG4gICAgICAgICAgICBkZWwoQXJyYXkuZnJvbShkcnB5TWFwLmtleXMoKSkuYXQoMCkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlcygpLmZpbmQodiA9PiB2LmtleSA9PT0ga2V5KTtcXG4gICAgICAgIGNyZWF0ZURycHkoa2V5KTtcXG4gICAgICAgIGxldCBkcnB5ID0gZHJweU1hcC5nZXQoa2V5KTtcXG4gICAgICAgIGRycHkuaW5pdChydW50aW1lQ29uZmlnLmdldEFic29sdXRlUGF0aChzb3VyY2UuZXh0KSk7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGlmIChkcnB5LmdldFJ1bGUoXFxcInByb3h5X3J1bGVcXFwiKSkge1xcbiAgICAgICAgICAgICAgICBsZXQgUHJveHkgPSAkLnJlcXVpcmUoXFxcIkxvY2FsUHJveHlcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHByb3h5VXJsID0gUHJveHkuc3RhcnRQcm94eShNWV9SVUxFLnRpdGxlLCBHTS5nZXRTZWxmS2V5KCkpO1xcbiAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiUHJveHlfVXJsXFxcIiwgcHJveHlVcmwpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG5cXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBkcnB5O1xcbiAgICB9LCB0aGlzKS5jYWxsKCk7XFxufVxcbi8vc291cmNlLmV4dOW/hemhu+S4uue7neWvuei3r+W+hFxcbmZ1bmN0aW9uIGdldEJ5U291cmNlKHNvdXJjZSkge1xcbiAgICByZXR1cm4gc3luYygoKSA9PiB7XFxuICAgICAgICBsZXQga2V5ID0gc291cmNlLmtleTtcXG4gICAgICAgIC8vbG9nKGRycHlNYXAuc2l6ZSlcXG4gICAgICAgIGlmIChkcnB5TWFwLmhhcyhrZXkpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGRycHlNYXAuZ2V0KGtleSk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoZHJweU1hcC5zaXplID49IDUpIHtcXG4gICAgICAgICAgICAvL2xvZyhcXFwi6K+35rGCOlxcXCIgKyBrZXkpXFxuICAgICAgICAgICAgZGVsKEFycmF5LmZyb20oZHJweU1hcC5rZXlzKCkpLmF0KDApKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGNyZWF0ZURycHkoa2V5KTtcXG4gICAgICAgIGxldCBkcnB5ID0gZHJweU1hcC5nZXQoa2V5KTtcXG4gICAgICAgIGRycHkuaW5pdChzb3VyY2UuZXh0KTtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgaWYgKGRycHkuZ2V0UnVsZShcXFwicHJveHlfcnVsZVxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIGxldCBQcm94eSA9ICQucmVxdWlyZShcXFwiTG9jYWxQcm94eVxcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgcHJveHlVcmwgPSBQcm94eS5zdGFydFByb3h5KE1ZX1JVTEUudGl0bGUsIEdNLmdldFNlbGZLZXkoKSk7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJQcm94eV9VcmxcXFwiLCBwcm94eVVybCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcblxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGRycHk7XFxuICAgIH0sIHRoaXMpLmNhbGwoKTtcXG59XFxuXFxuZnVuY3Rpb24gcHV0KGtleSwgZHJweSkge1xcbiAgICBzeW5jKCgpID0+IGRycHlNYXAuc2V0KGtleSwgZHJweSksIHRoaXMpLmNhbGwoKTtcXG59XFxuXFxuZnVuY3Rpb24gcnVuUHJveHkoZHJweSwgYXJncykge1xcbiAgICBpZiAodHlwZW9mIGRycHkucHJveHkgPT09IFxcXCJmdW5jdGlvblxcXCIpIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgLy9sZXQgdGltZTEgPSBEYXRlLm5vdygpO1xcbiAgICAgICAgICAgIHByb3h5U2VtYXBob3JlLmFjcXVpcmUoKTtcXG4gICAgICAgICAgICAvL2xldCB0aW1lMiA9IERhdGUubm93KCk7XFxuICAgICAgICAgICAgLy9sb2coXFxcIjHnrYnlvoXml7bpl7Q6XFxcIiArICh0aW1lMiAtIHRpbWUxKSArIFxcXCJtc1xcXCIpO1xcbiAgICAgICAgICAgIGxldCByZXMgPSBkcnB5LnByb3h5LmFwcGx5KGRycHksIGFyZ3MpO1xcbiAgICAgICAgICAgIC8vbGV0IHRpbWUzID0gRGF0ZS5ub3coKTtcXG4gICAgICAgICAgICAvL2xvZyhcXFwiMuaJp+ihjOS7o+eQhuiAl+aXtjpcXFwiICsgKHRpbWUzIC0gdGltZTIpICsgXFxcIm1zXFxcIik7XFxuICAgICAgICAgICAgLy9sb2coXFxcIjPmgLvogJfml7bogJfml7Y6XFxcIiArICh0aW1lMyAtIHRpbWUxKSArIFxcXCJtc1xcXCIpO1xcblxcbiAgICAgICAgICAgIHJldHVybiByZXM7XFxuICAgICAgICB9IGZpbmFsbHkge1xcbiAgICAgICAgICAgIHByb3h5U2VtYXBob3JlLnJlbGVhc2UoKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBkZWwoa2V5KSB7XFxuICAgIHN5bmMoKCkgPT4ge1xcbiAgICAgICAgLy9sb2coXFxcIuWIoOmZpFxcXCIgKyBrZXkpO1xcbiAgICAgICAgZHJweU1hcC5kZWxldGUoa2V5KTtcXG4gICAgICAgIC8qaWYgKGRycHlNYXAuaGFzKGtleSkpIHtcXG4gICAgICAgICAgICBcXG4gICAgICAgIH0qL1xcbiAgICB9LCB0aGlzKS5jYWxsKCk7XFxufVxcbmxldCBpc0luaXRIb21lID0gZmFsc2U7XFxuLy9sZXQgaXNJbml0U2VhcmNoID0gZmFsc2U7XFxubGV0IGlzSW5pdEVyUGFnZSA9IGZhbHNlO1xcblxcbmZ1bmN0aW9uIGluaXRQYWdlKHR5cGUpIHtcXG4gICAgc3dpdGNoICh0eXBlKSB7XFxuICAgICAgICBjYXNlIFxcXCJob21lXFxcIjpcXG4gICAgICAgICAgICBpc0luaXRIb21lID0gdHJ1ZTtcXG4gICAgICAgIC8vY2FzZSBcXFwic2VhcmNoXFxcIjpcXG4gICAgICAgIC8vICAgIGlzSW5pdFNlYXJjaCA9IHRydWU7XFxuICAgICAgICBjYXNlIFxcXCJlclxcXCI6XFxuICAgICAgICAgICAgaXNJbml0ZXJQYWdlID0gdHJ1ZTtcXG4gICAgfVxcbiAgICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKEdNa2V5LCB0eXBlKSA9PiB7XFxuICAgICAgICAvL2xvZyhcXFwib25DbG9zZVxcXCIpO1xcbiAgICAgICAgR00uaGFzKEdNa2V5LCBEcnB5TWFuYWdlID0+IHtcXG4gICAgICAgICAgICAvL2xvZyhcXFwi5pyJR01rZXlcXFwiKTtcXG4gICAgICAgICAgICBEcnB5TWFuYWdlLmNsZWFyQnlUeXBlKHR5cGUpO1xcbiAgICAgICAgfSk7XFxuICAgIH0sIEdNa2V5LCB0eXBlKSk7XFxufVxcblxcbmZ1bmN0aW9uIGNsZWFyQnlUeXBlKHR5cGUpIHtcXG4gICAgc3dpdGNoICh0eXBlKSB7XFxuICAgICAgICBjYXNlIFxcXCJob21lXFxcIjpcXG4gICAgICAgICAgICBpc0luaXRIb21lID0gZmFsc2U7XFxuICAgICAgICAvL2Nhc2UgXFxcInNlYXJjaFxcXCI6XFxuICAgICAgICAvLyAgICBpc0luaXRTZWFyY2ggPSBmYWxzZTtcXG4gICAgICAgIGNhc2UgXFxcImVyXFxcIjpcXG4gICAgICAgICAgICBpc0luaXRlclBhZ2UgPSBmYWxzZTtcXG4gICAgfVxcblxcbiAgICBpZiAoIWlzSW5pdEhvbWUgJiYgIWlzSW5pdEVyUGFnZSkge1xcbiAgICAgICAgLy9sb2coXFxcIuW8gOWni+a4heeQhlxcXCIpO1xcbiAgICAgICAgZHJweU1hcC5jbGVhcigpO1xcbiAgICAgICAgR00uY2xlYXIoR01rZXkpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGNsZWFyKCkge1xcbiAgICBzeW5jKCgpID0+IHtcXG4gICAgICAgIGRycHlNYXAuY2xlYXIoKTtcXG4gICAgfSwgdGhpcykuY2FsbCgpO1xcbn1cXG4kLmV4cG9ydHMgPSB7XFxuICAgIGluaXRQYWdlLFxcbiAgICBnZXQsXFxuICAgIGdldEJ5U291cmNlLFxcbiAgICBkZWwsXFxuICAgIGNsZWFyLFxcbiAgICBwdXQsXFxuICAgIHJ1blByb3h5LFxcbiAgICBjbGVhckJ5VHlwZVxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuaMh+WumuaQnOe0ouW8ueeql1wiLFwicGF0aFwiOlwiU2VhcmNoQWxsb3dQb3BcIixcInJ1bGVcIjpcImpzOlxcbiQuZXhwb3J0cy5zaG93ID0gZnVuY3Rpb24oKSB7XFxuICAgIGNvbnN0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiLCBcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICBjb25zdCBoaWtlclBvcCA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9Njk2NlxcXCIpO1xcbiAgICBsZXQgc2VhcmNoQWxsb3cgPSBydW50aW1lQ29uZmlnLmdldFNlYXJjaEFsbG93KCk7XFxuXFxuICAgIGxldCBjYW5TZWFyY2hTb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldENhblNlYXJjaFNvdXJjZSgpO1xcbiAgICAvL2xldCBzb3VyY2VOYW1lTGlzdCA9IGNhblNlYXJjaFNvdXJjZS5tYXAodj0+di5uYW1lKTtcXG4gICAgbGV0IGdldE5hbWVzID0gKCkgPT4gZHluYW1pY1NvdXJjZS5tYXAodiA9PiBzZWFyY2hBbGxvdy5pbmNsdWRlcyh2LmtleSkgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArICh2Lm5hbWUgKyBcXFwiXFxcIikuZm9udGNvbG9yKFxcXCIjMDA5OTY2XFxcIikgOiB2Lm5hbWUpO1xcbiAgICBsZXQgc3BlbiA9IDM7XFxuXFxuICAgIC8vbGV0IGR5bmFtaWNOYW1lcyA9IHNvdXJjZU5hbWVMaXN0LnNsaWNlKCk7XFxuICAgIGxldCBkeW5hbWljU291cmNlID0gY2FuU2VhcmNoU291cmNlLnNsaWNlKCk7XFxuICAgIGxldCBzZWFyY2hvbmNvdW50ID0gZHluYW1pY1NvdXJjZS5maWx0ZXIodiA9PiBzZWFyY2hBbGxvdy5pbmNsdWRlcyh2LmtleSkpLmxlbmd0aDtcXG4gICAgaWYgKHNlYXJjaG9uY291bnQgPT0gMCkge1xcbiAgICAgICAgc2VhcmNob25jb3VudCA9IGNhblNlYXJjaFNvdXJjZS5sZW5ndGg7XFxuICAgIH1cXG5cXG4gICAgbGV0IHNlYXJjaEtleSA9IFxcXCJcXFwiO1xcbiAgICBoaWtlclBvcC5zZWxlY3RCb3R0b21SZXMoe1xcbiAgICAgICAgb3B0aW9uczogZ2V0TmFtZXMoKSxcXG4gICAgICAgIGNvbHVtbnM6IHNwZW4sXFxuICAgICAgICB0aXRsZTogXFxcIuWQr+eUqOaQnOe0oua6kDpcXFwiICsgc2VhcmNob25jb3VudCArIFxcXCLkuKog5YWxOlxcXCIgKyBjYW5TZWFyY2hTb3VyY2UubGVuZ3RoICsgXFxcIuS4quaQnOe0oua6kFxcXCIsXFxuICAgICAgICBub0F1dG9EaXNtaXNzOiB0cnVlLFxcbiAgICAgICAgcG9zaXRpb246IDEsXFxuICAgICAgICBoZWlnaHQ6IC45LFxcbiAgICAgICAgZXh0cmFJbnB1dEJveDogbmV3IGhpa2VyUG9wLlJlc0V4dHJhSW5wdXRCb3goe1xcbiAgICAgICAgICAgIGhpbnQ6IFxcXCLmupDlhbPplK7lrZcg5aSa5Liq55SofOmalOW8gFxcXCIsXFxuICAgICAgICAgICAgdGl0bGU6IFxcXCJva1xcXCIsXFxuICAgICAgICAgICAgb25DaGFuZ2UodGV4dCwgbWFuYWdlKSB7XFxuICAgICAgICAgICAgICAgIC8vbG9nKFxcXCJvbkNoYW5nZTpcXFwiK3RleHQpXFxuICAgICAgICAgICAgICAgIHNlYXJjaEtleSA9IHRleHQ7XFxuICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICAgICAgaWYgKHRleHQpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNhblNlYXJjaFNvdXJjZS5mb3JFYWNoKCh2LCBpKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQuc3BsaXQoL1xcXFx8LykuZmlsdGVyKGYgPT4gZikuc29tZSh4ID0+IHYubmFtZS5pbmNsdWRlcyh4KSkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY1NvdXJjZS5wdXNoKHYpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHNlYXJjaEFsbG93LmluY2x1ZGVzKHYua2V5KSA/IFxcXCLigJzigJzigJ3igJ1cXFwiICsgKHYubmFtZSArIFxcXCJcXFwiKS5mb250Y29sb3IoXFxcIiMwMDk5NjZcXFwiKSA6IHYubmFtZSlcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UgPSBjYW5TZWFyY2hTb3VyY2Uuc2xpY2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWFuYWdlLmxpc3QsIGdldE5hbWVzKCkpO1xcblxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogXFxcIlxcXCIsXFxuICAgICAgICAgICAgY2xpY2socywgbWFuYWdlKSB7XFxuICAgICAgICAgICAgICAgIC8vdG9hc3Qocyk7XFxuICAgICAgICAgICAgICAgIC8vbG9nKG1hbmFnZS5saXN0KTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2VcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY2xpY2socywgaSwgbWFuYWdlKSB7XFxuXFxuICAgICAgICAgICAgbGV0IGtleSA9IGR5bmFtaWNTb3VyY2VbaV0ua2V5O1xcbiAgICAgICAgICAgIGxldCBpbmRleCA9IC0xO1xcbiAgICAgICAgICAgIGlmICgoaW5kZXggPSBzZWFyY2hBbGxvdy5pbmRleE9mKGtleSkpICE9PSAtMSkge1xcbiAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdFtpXSA9IGR5bmFtaWNTb3VyY2VbaV0ubmFtZTtcXG4gICAgICAgICAgICAgICAgc2VhcmNoQWxsb3cuc3BsaWNlKGluZGV4LCAxKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdFtpXSA9IFxcXCLigJzigJzigJ3igJ1cXFwiICsgKGR5bmFtaWNTb3VyY2VbaV0ubmFtZSArIFxcXCJcXFwiKS5mb250Y29sb3IoXFxcIiMwMDk5NjZcXFwiKTtcXG4gICAgICAgICAgICAgICAgc2VhcmNoQWxsb3cucHVzaChrZXkpO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBydW50aW1lQ29uZmlnLnNldFNlYXJjaEFsbG93KCk7XFxuICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgfSxcXG4gICAgICAgIG1lbnVDbGljayhtYW5hZ2UpIHtcXG4gICAgICAgICAgICBoaWtlclBvcC5zZWxlY3RDZW50ZXIoe1xcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBbXFxcIuaUueWPmOagt+W8j1xcXCIsIFxcXCLnrZvpgInmupBcXFwiLCBcXFwi6Ieq54S25o6S5bqPXFxcIiwgXFxcIuWAkuW6j1xcXCIsIFxcXCLlhajpgIlcXFwiLCBcXFwi5Y+N6YCJXFxcIl0sXFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IDIsXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi6K+36YCJ5oupXFxcIixcXG4gICAgICAgICAgICAgICAgY2xpY2socywgaSkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVuID0gc3BlbiA9PSAzID8gMSA6IChzcGVuID09IDIgPyAzIDogMik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmNoYW5nZUNvbHVtbnMoc3Blbik7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBoaWtlclBvcC5pbnB1dENvbmZpcm0oe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBcXFwi6L6T5YWl5YWz6ZSu5a2XIOepuuaYvuekuuWFqOmDqFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi562b6YCJ5rqQXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludDogXFxcIua6kOWFs+mUruWtlyDlpJrkuKrnlKh86ZqU5byAXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBzZWFyY2hLZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRhcmVhOiBmYWxzZSwgLy/lpJrooYzmqKHlvI9cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGV4dGFyZWE6IHRydWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vQXV0b1NvZnQ6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hpZGVDYW5jZWw6IHRydWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm0odGV4dCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoS2V5ID0gdGV4dDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljU291cmNlLmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhblNlYXJjaFNvdXJjZS5mb3JFYWNoKCh2LCBpKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0LnNwbGl0KC9cXFxcfC8pLmZpbHRlcihmID0+IGYpLnNvbWUoeCA9PiB2Lm5hbWUuaW5jbHVkZXMoeCkpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljU291cmNlLnB1c2godik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHNlYXJjaEFsbG93LmluY2x1ZGVzKHYua2V5KSA/IFxcXCLigJzigJzigJ3igJ1cXFwiICsgKHYubmFtZSArIFxcXCJcXFwiKS5mb250Y29sb3IoXFxcIiMwMDk5NjZcXFwiKSA6IHYubmFtZSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljU291cmNlID0gY2FuU2VhcmNoU291cmNlLnNsaWNlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtYW5hZ2UubGlzdCwgZ2V0TmFtZXMoKSk7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBcXFwidG9hc3Q6Ly/ovpPlhaXkuoZcXFwiICsgdGV4dDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0ID0gT2JqZWN0LmFzc2lnbihbXSwgbWFuYWdlLmxpc3QpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuXFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY1NvdXJjZS5zb3J0KChhLCBiKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoYS5uYW1lKS5sb2NhbGVDb21wYXJlKFN0cmluZyhiLm5hbWUpLCB1bmRlZmluZWQsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWM6IHRydWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zaXRpdml0eTogJ2Jhc2UnXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWFuYWdlLmxpc3QsIGdldE5hbWVzKCkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAzKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucmV2ZXJzZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UucmV2ZXJzZSgpO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSA0KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY1NvdXJjZS5mb3JFYWNoKHYgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlYXJjaEFsbG93LmluY2x1ZGVzKHYpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hBbGxvdy5wdXNoKHYua2V5KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWFuYWdlLmxpc3QsIGdldE5hbWVzKCkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVDb25maWcuc2V0U2VhcmNoQWxsb3coKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gNSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1saXN0ID0gc2VhcmNoQWxsb3cuc2xpY2UoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hBbGxvdy5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UuZm9yRWFjaCh2ID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbWxpc3QuaW5jbHVkZXModi5rZXkpKSByZXR1cm47XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEFsbG93LnB1c2godi5rZXkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWFuYWdlLmxpc3QsIGdldE5hbWVzKCkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVDb25maWcuc2V0U2VhcmNoQWxsb3coKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWIhuexu1wiLFwicGF0aFwiOlwiY2F0ZWdvcnlzXCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZmwgPSB7fTtcXG5sZXQgcmVzdWx0cyA9IFtdO1xcbmxldCBob21lbGlzdCA9IFtdO1xcbmxldCBjYXRlID0gXFxcIlxcXCI7XFxuXFxuZnVuY3Rpb24gZ2V0Q2F0ZWdvcnlzKGxheW91dCwgZHJweSwgcGFnZSkge1xcbiAgbGV0IHJ1bGUgPSBkcnB5LnJ1bk1haW4oJ2Z1bmN0aW9uIG1haW4oKXtyZXR1cm4gcnVsZX0nKTtcXG4gIGxldCBsb2FkaSA9IGxheW91dC5maW5kSW5kZXgoeCA9PiB4LmV4dHJhICYmIHguZXh0cmEuaWQgPT0gTVlfUlVMRS50aXRsZSArIFxcXCJsb2EgZFxcXCIpO1xcblxcbiAgaWYgKGdldE15VmFyKFxcXCJsaW5rc1xcXCIsIFxcXCJcXFwiKSA9PSBcXFwiXFxcIiYmcnVsZS7mqKHmnb89PVxcXCLoh6rliqhcXFwiKSB7XFxuICAgIGxldCBodG1sID0gZHJweS5ydW5NYWluKCdmdW5jdGlvbiBtYWluKCl7cmV0dXJuIHJlcXVlc3QocnVsZS5ob21lVXJsKX0nKTtcXG4gICAgaWYgKGh0bWwgPT0gXFxcIlxcXCIpIHtcXG4gICAgICBpZiAobG9hZGkgIT0gLTEpIHtcXG4gICAgICAgIGxheW91dC5zcGxpY2UobG9hZGksIDEpXFxuICAgICAgfVxcbiAgICAgIGNsZWFyTXlWYXIoXFxcImxpbmtzXFxcIik7XFxuICAgICAgbGF5b3V0Lmxlbmd0aCA9IDA7XFxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLnvZHnq5norr/pl67lvILluLhcXFwiKTtcXG4gICAgfVxcbiAgfVxcbiAgaWYoT2JqZWN0LmtleXMocnVsZSkubGVuZ3RoPT09MCl7XFxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLop4TliJnliqDovb3lpLHotKVcXFwiKTtcXG4gIH1cXG4gIGlmICgocnVsZS7kuIDnuqcgPT0gXFxcIlxcXCIgfHwgcnVsZS7kuIDnuqcgPT0gdW5kZWZpbmVkKSYmIXJ1bGUu5o6o6I2QKSB7XFxuXFxuICAgIGlmIChsb2FkaSAhPSAtMSkge1xcbiAgICAgIGxheW91dC5zcGxpY2UobG9hZGksIDEpXFxuICAgIH1cXG4gICAgY2xlYXJNeVZhcihcXFwibGlua3NcXFwiKTtcXG4gICAgbGF5b3V0Lmxlbmd0aCA9IDA7XFxuICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+l5rqQ5Li65pCc57Si5rqQ77yM5LuF6IO96YCa6L+H5pCc57Si6K6/6Zeu5pWw5o2uXFxcIilcXG4gIH1cXG4gIHZhciBnZXRSYW5nZUNvbG9ycyA9IGZ1bmN0aW9uICgpIHtcXG4gICAgcmV0dXJuICcjJyArICgnMDAwMDAnICsgKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAgPDwgMCkudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTYpO1xcbiAgfVxcbiAgbGV0IGNhdGVnb3J5cyA9IEpTT04ucGFyc2UoZHJweS5ob21lKCkpO1xcbiAgbGV0IGZpbHRlcnMgPSBjYXRlZ29yeXMuZmlsdGVycztcXG4gIGxldCBjYXRlcyA9IGNhdGVnb3J5cy5jbGFzcyB8fCBbXTtcXG4gIGlmIChwYWdlID09IDEpIHtcXG4gICAgaG9tZWxpc3QgPSBKU09OLnBhcnNlKGRycHkuaG9tZVZvZCgpKS5saXN0O1xcbiAgICBpZiAoaG9tZWxpc3QgIT0gdW5kZWZpbmVkICYmIGhvbWVsaXN0Lmxlbmd0aCkge1xcbiAgICAgIHB1dE15VmFyKFxcXCJpc2hvbWVcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICB9XFxuICB9XFxuICBpZiAoY2F0ZXMubGVuZ3RoID09IDAgJiYgKGhvbWVsaXN0ID09IHVuZGVmaW5lZCB8fCBob21lbGlzdC5sZW5ndGggPT0gMCkpIHtcXG4gICAgaWYgKGxvYWRpICE9IC0xKSB7XFxuICAgICAgbGF5b3V0LnNwbGljZShsb2FkaSwgMSlcXG4gICAgfVxcbiAgICBjbGVhck15VmFyKFxcXCJsaW5rc1xcXCIpO1xcbiAgICBsYXlvdXQubGVuZ3RoID0gMDtcXG4gICAgdGhyb3cgbmV3IEVycm9yKFxcXCLliIbnsbvojrflj5blpLHotKXlj6/og73nvZHnu5zpl67pophcXFwiKTtcXG4gIH1cXG4gIGlmIChnZXRNeVZhcihcXFwiaXNob21lXFxcIiwgXFxcIjBcXFwiKSA9PSBcXFwiMVxcXCIpIHtcXG4gICAgY2F0ZXMudW5zaGlmdCh7XFxuICAgICAgdHlwZV9uYW1lOiAn5o6o6I2QJyxcXG4gICAgICB0eXBlX2lkOiAnaG9tZScsXFxuICAgIH0pXFxuICB9XFxuICBpZiAobG9hZGkgIT0gLTEpIHtcXG4gICAgbGF5b3V0LnNwbGljZShsb2FkaSwgMSlcXG4gIH1cXG4gIHB1dE15VmFyKFxcXCJsaW5rc1xcXCIsIFxcXCIxXFxcIik7XFxuICBsZXQgY2F0ZWkgPSBnZXRNeVZhcihcXFwiY2F0ZWlcXFwiLCBcXFwiMFxcXCIpO1xcbiAgY2F0ZSA9IGNhdGVzW2NhdGVpXS50eXBlX2lkO1xcblxcbiAgdmFyIGZvbGQgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJmb2xkXFxcIiwgXFxcIjBcXFwiKTtcXG4gIGxldCBjb2xvciA9IGdldFJhbmdlQ29sb3JzKCk7XFxuXFxuICBpZiAocGFnZSA9PSAxKSB7XFxuICAgIGNhdGVzLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXG4gICAgICBsZXQgdCA9IGNhdGVpID09IGkgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCI8Yj5cXFwiICsgaXRlbS50eXBlX25hbWUuZm9udGNvbG9yKGNvbG9yKSArIFxcXCI8L2I+XFxcIiA6IGl0ZW0udHlwZV9uYW1lO1xcbiAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiB0LFxcbiAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChpLCB0aWQpID0+IHtcXG4gICAgICAgICAgcHV0TXlWYXIoXFxcImNhdGVpXFxcIiwgaSk7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBpLCBpdGVtLnR5cGVfaWQpLFxcbiAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgIHRpZDogaXRlbS50eXBlX2lkLFxcbiAgICAgICAgICBhY3RpdmU6IGNhdGVpID09IGkgPyB0cnVlIDogZmFsc2UsXFxuICAgICAgICB9XFxuICAgICAgfSlcXG4gICAgfSlcXG4gIH1cXG5cXG4gIGlmIChjYXRlICE9ICdob21lJyAmJiBwYWdlID09IDEpIHtcXG4gICAgbGV0IGhvbWVpID0gbGF5b3V0LmZpbmRJbmRleCh4ID0+IHtcXG4gICAgICByZXR1cm4geC5leHRyYSAmJiB4LmV4dHJhLnRpZCA9PSBcXFwiaG9tZVxcXCJcXG4gICAgfSk7XFxuICAgIGlmIChob21laSA9PSAtMSkge1xcbiAgICAgIGhvbWVpID0gbGF5b3V0LmZpbmRJbmRleCh4ID0+IHtcXG4gICAgICAgIHJldHVybiB4LmV4dHJhICYmIHguZXh0cmEudGlkO1xcbiAgICAgIH0pIC0gMTtcXG4gICAgfVxcbiAgICBpZiAoZmlsdGVycyAmJiBmaWx0ZXJzLmhhc093blByb3BlcnR5KGNhdGUpKSB7XFxuICAgICAgaWYgKGhvbWVpICE9IC0xKSB7XFxuICAgICAgICBsYXlvdXQuc3BsaWNlKGhvbWVpICsgMSwgMCwge1xcbiAgICAgICAgICB0aXRsZTogZm9sZCA9PSBcXFwiMFxcXCIgPyBcXFwi4oCc4oCc4oCd4oCdPGI+XFxcIiArIFxcXCLiiKdcXFwiLmZvbnRjb2xvcihcXFwiIzFhYWQxOVxcXCIpICsgXFxcIjwvYj5cXFwiIDogXFxcIuKAnOKAnOKAneKAnTxiPlxcXCIgKyBcXFwi4oioXFxcIi5mb250Y29sb3IoXFxcIiNGRjAwMDBcXFwiKSArIFxcXCI8L2I+XFxcIixcXG4gICAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChmb2xkKSA9PiB7XFxuICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwiZm9sZFxcXCIsIGZvbGQgPT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgIH0sIGZvbGQpLFxcbiAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXFxuICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgICAgfVxcblxcbiAgICAgIGxldCBhY3RpdmVpID0gbGF5b3V0LmZpbmRJbmRleCh4ID0+IHguZXh0cmEgJiYgeC5leHRyYS5hY3RpdmUpO1xcbiAgICAgIGlmIChhY3RpdmVpICE9IC0xKSB7XFxuICAgICAgICBsYXlvdXQuc3BsaWNlKGFjdGl2ZWksIDAsIHtcXG4gICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgJ/CfjIAnLFxcbiAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGMpID0+IHtcXG4gICAgICAgICAgICBsZXQgY2F0ZV9vYmogPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiY2F0ZV9vYmpcXFwiLCB7fSk7XFxuICAgICAgICAgICAgZGVsZXRlIGNhdGVfb2JqW2NdO1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJjYXRlX29ialxcXCIsIGNhdGVfb2JqKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/muIXpmaTlrozmiJBcXFwiO1xcbiAgICAgICAgICB9LCBjYXRlKVxcbiAgICAgICAgfSlcXG4gICAgICB9XFxuXFxuICAgICAgbGV0IGNsYXNzaWZ5ID0gZmlsdGVyc1tjYXRlXTtcXG4gICAgICB2YXIgaW5pdF9jYXRlID0gbmV3IEFycmF5KGNsYXNzaWZ5Lmxlbmd0aCkuZmlsbChcXFwiLTFcXFwiKTtcXG4gICAgICBsZXQgY2F0ZV9vYmogPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiY2F0ZV9vYmpcXFwiLCB7fSk7XFxuICAgICAgY2F0ZV9vYmpbY2F0ZV0gPSBjYXRlX29ialtjYXRlXSA/IGNhdGVfb2JqW2NhdGVdIDogaW5pdF9jYXRlXFxuICAgICAgdmFyIGNhdGVfdGVtcCA9IGNhdGVfb2JqW2NhdGVdO1xcbiAgICAgIC8vdmFyIGZpbHRlcl9kZWY9c3RvcmFnZTAuZ2V0SXRlbShcXFwiZmlsdGVyX2RlZlxcXCIsIHt9KTtcXG4gICAgICBjbGFzc2lmeS5mb3JFYWNoKCh4LCBpbmRleCkgPT4ge1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICBjb2xfdHlwZTogJ2JsYW5rX2Jsb2NrJ1xcbiAgICAgICAgfSlcXG4gICAgICAgIHgudmFsdWUuZm9yRWFjaCgoaXQsIGkpID0+IHtcXG4gICAgICAgICAgbGV0IHQgPSBpdC5uO1xcbiAgICAgICAgICBpZiAoY2F0ZV90ZW1wW2luZGV4XSA9PSBpKSB7XFxuICAgICAgICAgICAgdCA9IFxcXCI8Yj48Zm9udCBjb2xvcj1cXFwiICsgY29sb3IgKyBcXFwiPlxcXCIgKyB0ICsgXFxcIjwvZm9udD48L2I+XFxcIjtcXG4gICAgICAgICAgICBmbFt4LmtleV0gPSBpdC52O1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGlmIChjYXRlX3RlbXBbaW5kZXhdID09IFxcXCItMVxcXCIpIHtcXG4gICAgICAgICAgICBmbFt4LmtleV0gPSBcXFwidW5kZWZpbmVkXFxcIjtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBpZiAoZm9sZCA9PSAxKSB7XFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgdCxcXG4gICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgobykgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgaSA9IG8uaTtcXG4gICAgICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcImlzX2RlZlxcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBjYXRlX29iaiA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJjYXRlX29ialxcXCIsIHt9KTtcXG5cXG4gICAgICAgICAgICAgICAgbGV0IGNhdGVfdGVtcCA9IG8uY2F0ZV90ZW1wO1xcbiAgICAgICAgICAgICAgICBpZiAoY2F0ZV90ZW1wLmNvbnN0cnVjdG9yICE9IEFycmF5KSB7XFxuICAgICAgICAgICAgICAgICAgY2F0ZV90ZW1wID0gW107XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gby5pbmRleDtcXG4gICAgICAgICAgICAgICAgbGV0IGMgPSBjYXRlX3RlbXBbaW5kZXhdIHx8IFxcXCItMVxcXCI7XFxuICAgICAgICAgICAgICAgIC8vbG9nKGMpXFxuICAgICAgICAgICAgICAgIGlmIChjID09IGkpIHtcXG4gICAgICAgICAgICAgICAgICBvLmNhdGVfdGVtcFtpbmRleF0gPSBcXFwiLTFcXFwiO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgIG8uY2F0ZV90ZW1wW2luZGV4XSA9IGkgKyBcXFwiXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBjYXRlX29ialtvLmNhdGVdID0gY2F0ZV90ZW1wO1xcbiAgICAgICAgICAgICAgICAvL2xvZyhjYXRlX3RlbXApXFxuICAgICAgICAgICAgICAgIC8vc3RvcmFnZTAucHV0TXlWYXIoXFxcImNhdGVfdGVtcFxcXCIsIGNhdGVfdGVtcCk7XFxuICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJjYXRlX29ialxcXCIsIGNhdGVfb2JqKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxcbiAgICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXG4gICAgICAgICAgICAgICAgaTogaSxcXG4gICAgICAgICAgICAgICAgY2F0ZTogY2F0ZVxcbiAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgICAgfSlcXG4gICAgfVxcbiAgfVxcbn1cXG5cXG5mdW5jdGlvbiBnZXRGbCgpIHtcXG4gIGZsID0gT2JqZWN0LmtleXMoZmwpLmZpbHRlcihrZXkgPT4gZmxba2V5XSAhPT0gXFxcInVuZGVmaW5lZFxcXCIpLnJlZHVjZSgocmVzLCBrZXkpID0+IHtcXG4gICAgcmVzW2tleV0gPSBmbFtrZXldO1xcbiAgICByZXR1cm4gcmVzO1xcbiAgfSwge30pO1xcbiAgcmV0dXJuIGZsXFxufVxcblxcbmZ1bmN0aW9uIGdldENhdGVMaXN0KCkge1xcbiAgcmV0dXJuIHtcXG4gICAgY2F0ZSxcXG4gICAgaG9tZWxpc3RcXG4gIH1cXG59XFxuXFxuXFxuJC5leHBvcnRzID0ge1xcbiAgZ2V0Y2F0ZWxpc3Q6IGdldENhdGVMaXN0LFxcbiAgZ2V0Y2F0ZWdvcnlzOiBnZXRDYXRlZ29yeXMsXFxuICBnZXRmbDogZ2V0RmxcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmnKzlnLDop4TliJnnrqHnkIZcIixcInBhdGhcIjpcIkxvY2FsRGlyXCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuaWh+S7tueuoeeQhlxcXCIpO1xcbmxldCBwYXRoID0gZ2V0UGF0aChTdHJpbmcoTVlfUEFSQU1TLmNwYXRoKSkucmVwbGFjZShcXFwiZmlsZTovL1xcXCIsIFxcXCJcXFwiKTtcXG5sZXQgZmlsZVNlbGVjdCA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXCIpO1xcbmZpbGVTZWxlY3QuZmlsZVNlbGVjdGlvbih7XFxuICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIHJldHVybiBcXFwiZWRpdEZpbGU6Ly9maWxlOi8vXFxcIiArIFBBVEg7XFxuICAgIH0pLFxcbiAgICBtZW1vcnk6IFxcXCJmaWxlcGF0aFxcXCIsXFxuICAgIGZpbGVUeXBlOiBcXFwiLmpzfC50eHR8Lmpzb25cXFwiLFxcbiAgICBleGl0U2VhcmNoUmVmcmVzaDogdHJ1ZSxcXG4gICAgcGF0dGVybjogMCxcXG4gICAgcm9vdERpclBhdGg6IHBhdGgsXFxuICAgIGluaXRpYWxQYXRoOiBwYXRoLFxcbn0sIE1ZX1BBUkFNUy5uZXdXaW5kb3cgPyBbXSA6IFt7XFxuICAgIHRpdGxlOiBcXFwi5paw56qX5Y+j5omT5byAXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL0xvY2FsRGlyI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBjcGF0aDogTVlfUEFSQU1TLmNwYXRoLFxcbiAgICAgICAgbmV3V2luZG93OiB0cnVlLFxcbiAgICAgICAgd2luZG93SWQ6IE1ZX1JVTEUudGl0bGUgKyBcXFwiQGVkaXRmaWxlXFxcIixcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIHBhZ2VUaXRsZTogXFxcIuaWh+S7tueuoeeQhlxcXCJcXG4gICAgfVxcbn1dKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIum7mOiupOS/neWtmOmAieaLqVwiLFwicGF0aFwiOlwic2hhcmVkZWZhdWx0cGF0aFwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLkv53lrZjot6/lvoRcXFwiKTtcXG5sZXQgbGF5b3V0ID0gW107XFxubGV0IGYgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFwiKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gICAgY2xlYXJNeVZhcihcXFwiZHJweUhpa2VyX3NoYXJlX2lucHV0XFxcIik7XFxufSk7XFxuXFxubGV0IHBhdGggPSBqb2luVXJsKGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvXFxcIiksIFxcXCIuLi9cXFwiLnJlcGVhdCg1KSkuc2xpY2UoNyk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqVxcXCIsXFxuICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXCIpLmV4dHJhO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgcm9vdERpclBhdGg6IHBhdGgsXFxuICAgICAgICBpbml0aWFsUGF0aDogcGF0aCxcXG4gICAgICAgIHBhdHRlcm46IDFcXG4gICAgfSkpLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuWCqOWtmOi3r+W+hFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfc2hhcmVfaW5wdXRcXFwiLCBnZXRQdWJsaWNJdGVtKFxcXCJEcnB5SGlrZXJAaW5wdXRfcGF0aFxcXCIsIFxcXCJcXFwiKSksXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfc2hhcmVfaW5wdXRcXFwiXFxuICAgIH1cXG59KTtcXG5cXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi56Gu6K6kXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpZCkgPT4ge1xcbiAgICAgICAgbGV0IHBhdGggPSBnZXRNeVZhcihcXFwiZHJweUhpa2VyX3NoYXJlX2lucHV0XFxcIiwgXFxcIlxcXCIpO1xcblxcbiAgICAgICAgaWYgKCFwYXRoKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S4jeWPr+S4uuepulxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBzZXRQdWJsaWNJdGVtKFxcXCJEcnB5SGlrZXJAaW5wdXRfcGF0aFxcXCIsIHBhdGgpO1xcbiAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxufSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlsI/or7RcIixcInBhdGhcIjpcIm5vdmVsXCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZHJweSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpLmdldEJ5U291cmNlKE1ZX1BBUkFNUy5zb3VyY2UpO1xcbmxldCBwbGF5ID0gSlNPTi5wYXJzZShkcnB5LnBsYXkoTVlfUEFSQU1TLmZyb20sIE1ZX1BBUkFNUy5pZCwgW10pKTtcXG5cXG5sZXQgZGF0YSA9IEpTT04ucGFyc2UocGxheS51cmwucmVwbGFjZShcXFwibm92ZWw6Ly9cXFwiLCBcXFwiXFxcIikpO1xcbmxldCBsYXlvdXQgPSBbXTtcXG5sZXQgY29udGVudCA9IFxcXCLjgIDjgIBcXFwiICsgZGF0YS5jb250ZW50LnNwbGl0KC8oXFxcXG58XFxcXHIpKy8pLmZpbHRlcihpdCA9PiBpdC50cmltKCkubGVuZ3RoID4gMSkubWFwKGl0ID0+IGl0LnRyaW0oKSkuam9pbihcXFwiPGJyPuOAgOOAgFxcXCIpO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICB0aXRsZTogKFxcXCI8c3Ryb25nPlxcXCIgKyAoZGF0YS50aXRsZSB8fCBnZXRQYWdlVGl0bGUoKSkgKyBcXFwiPC9zdHJvbmc+XFxcIikuYmlnKCksXFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogY29udGVudCxcXG4gICAgY29sX3R5cGU6ICdyaWNoX3RleHQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGV4dFNpemU6IDE4LFxcbiAgICAgICAgY2xpY2s6IHRydWVcXG4gICAgfVxcbn0pO1xcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Li76aG1XCIsXCJwYXRoXCI6XCJtaWFuXCIsXCJydWxlXCI6XCJqczpcXG5mdW5jdGlvbiBsb2FkKGQsIGRycHksIHNvdXJjZSwgaGFzSGFlZCkge1xcbiAgICBsZXQgcGFnZSA9IE1ZX1BBR0U7XFxuICAgIGxldCBjYXRlZ29yeXMgPSAkLnJlcXVpcmUoXFxcImNhdGVnb3J5c1xcXCIpO1xcbiAgICBjYXRlZ29yeXMuZ2V0Y2F0ZWdvcnlzKGQsIGRycHksIHBhZ2UsIGhhc0hhZWQpO1xcbiAgICBsZXQge1xcbiAgICAgICAgY2F0ZSxcXG4gICAgICAgIGhvbWVsaXN0XFxuICAgIH0gPSBjYXRlZ29yeXMuZ2V0Y2F0ZWxpc3QoKTtcXG4gICAgaWYgKGdldE15VmFyKFxcXCJsaW5rc1xcXCIsIFxcXCJcXFwiKSA9PSBcXFwiMVxcXCIgJiYgIWhhc0hhZWQpIHtcXG4gICAgICAgIHNldFByZVJlc3VsdChkKTtcXG4gICAgICAgIGQubGVuZ3RoID0gMDtcXG4gICAgfVxcbiAgICBsZXQgZmwgPSBjYXRlZ29yeXMuZ2V0ZmwoKTtcXG4gICAgbGV0IHNraXBFciA9IGRycHkuZ2V0UnVsZShcXFwi5LqM57qnXFxcIikgPT09IFxcXCIqXFxcIiAmJiBnZXRJdGVtKFxcXCJza2lwRXJcXFwiLCBcXFwiXFxcIik7XFxuICAgIGxldCBkZUNvbCA9IGRycHkuZ2V0UnVsZShjYXRlID09IFxcXCJob21lXFxcIiA/IFxcXCJoaWtlckxpc3RDb2xcXFwiIDogXFxcImhpa2VyQ2xhc3NMaXN0Q29sXFxcIik7XFxuICAgIGxldCBob21lTGlzdENvbCA9IGdldEl0ZW0oXFxcImhvbWVMaXN0Q29sXFxcIiwgXFxcIlxcXCIpIHx8IGRlQ29sIHx8IFxcXCJtb3ZpZV8zX21hcnF1ZWVcXFwiO1xcbiAgICBsZXQgc3R5cGUgPSBkcnB5LmdldFJ1bGUoXFxcIuexu+Wei1xcXCIpO1xcbiAgICBsZXQgaWNvbiA9IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL2tlLzE1MC5wbmdcXFwiO1xcbiAgICBzd2l0Y2ggKHN0eXBlKSB7XFxuICAgICAgICBjYXNlICfmvKvnlLsnOlxcbiAgICAgICAgICAgIGljb24gPSBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9rZS8xMy5wbmdcXFwiO1xcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgY2FzZSAn5bCP6K+0JzpcXG4gICAgICAgICAgICBpY29uID0gXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8va2UvMzgucG5nXFxcIjtcXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIGRlZmF1bHQ6XFxuICAgIH1cXG4gICAgdXBkYXRlSXRlbShNWV9SVUxFLnRpdGxlICsgXFxcInNvdXJjZW5hbWVcXFwiLCB7XFxuICAgICAgICBpbWc6IGljb24sXFxuICAgIH0pO1xcblxcbiAgICBsZXQgbGlzdCA9IFtdO1xcbiAgICBpZiAoY2F0ZSA9PSBcXFwiaG9tZVxcXCIpIHtcXG4gICAgICAgIGlmIChwYWdlID09IDEpIHtcXG4gICAgICAgICAgICBsaXN0ID0gaG9tZWxpc3Q7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAobGlzdCA9PT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgbGlzdCA9IFtdO1xcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcImlzaG9tZVxcXCIpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID4gMCAmJiAhbGlzdC5hdCgwKS52b2RfcGljICYmICFsaXN0LmF0KC0xKS52b2RfcGljICYmICFkZUNvbCkge1xcbiAgICAgICAgICAgIGhvbWVMaXN0Q29sID0gXFxcInRleHRfMVxcXCI7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBsaXN0ID0gSlNPTi5wYXJzZShkcnB5LmNhdGVnb3J5KFN0cmluZyhjYXRlKSwgcGFnZSwgdHJ1ZSwgZmwpKS5saXN0O1xcbiAgICB9XFxuICAgIGxldCB1cmwgPSBcXFwiaGlrZXI6Ly9wYWdlL2RldGFpbGVkI2ltbWVyc2l2ZVRoZW1lI1xcXCI7XFxuXFxuICAgIGlmIChsaXN0Lmxlbmd0aCkge1xcbiAgICAgICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xcbiAgICAgICAgICAgIGxldCBpZCA9IFN0cmluZyhpdC52b2RfaWQpO1xcblxcbiAgICAgICAgICAgIC8vbG9nKGl0KVxcbiAgICAgICAgICAgIGxldCBuYW1lID0gaXQudm9kX25hbWU7XFxuICAgICAgICAgICAgaWYgKGlkID09PSBcXFwibm9fZGF0YVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgdXJsID0gXFxcInRvYXN0Oi8v5rKh5pyJ5pWw5o2uXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpZCA9PT0gXFxcInN0cmluZ1xcXCIgJiYgaWQuaW5jbHVkZXMoXFxcIm1zZWFyY2g6XFxcIikgfHwgaWQgPT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgICAgIHVybCA9ICQoXFxcIlxcXCIpLmxhenlSdWxlKChuYW1lKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwidGVtc21vZGVcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3NlYXJjaD9ydWxlPVxcXCIgKyBNWV9SVUxFLnRpdGxlICsgXFxcIiZzPVxcXCIgKyBuYW1lO1xcbiAgICAgICAgICAgICAgICB9LCBuYW1lKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNraXBFcikge1xcbiAgICAgICAgICAgICAgICB1cmwgPSAkKCkubGF6eVJ1bGUoKHNvdXJjZSwgaWQpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHVybCA9IGlkLnNwbGl0KFxcXCJAQFxcXCIpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwidmlkZW9VcmxcXFwiKS5wYXJzZSh1cmwsIGlkLCBzb3VyY2UpO1xcbiAgICAgICAgICAgICAgICB9LCBzb3VyY2UsIGlkKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IG5hbWUsXFxuICAgICAgICAgICAgICAgIGRlc2M6IGl0LnZvZF9yZW1hcmtzLFxcbiAgICAgICAgICAgICAgICB1cmw6IHVybCxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogaXQudm9kX3BpYyxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IGhvbWVMaXN0Q29sLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaW1nOiBpdC52b2RfcGljLFxcbiAgICAgICAgICAgICAgICAgICAgdm9kSWQ6IGlkLFxcbiAgICAgICAgICAgICAgICAgICAgc25hbWU6IHNvdXJjZS5uYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgc2tleTogc291cmNlLmtleSxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBpZCxcXG4gICAgICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuiBmuWQiOaQnOe0olxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAganM6IFxcXCJwdXRNeVZhcigndGVtc21vZGUnLCAnMScpOydoaWtlcjovL3NlYXJjaD9ydWxlPScgKyBNWV9SVUxFLnRpdGxlICsgJyZzPVxcXCIgKyBuYW1lICsgXFxcIic7XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfV1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGRlbGV0ZUl0ZW0oTVlfUlVMRS50aXRsZSArIFxcXCJsb2FkXFxcIik7XFxufVxcblxcbmZ1bmN0aW9uIHNldERycHlQYXRoKGQpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi57y65bCR6L+Q6KGM5bqTXFxcXG7or6XlsI/nqIvluo/kuI3og73pgJrov4fkupHliarotLTmnb/liIbkuqvvvIzlj6rog73pgJrov4fmiZPljIXliIbkuqtcXFwiLFxcbiAgICAgICAgZGVzYzogXFxcIuWwhui/kOihjOW6k+aUvuWFpVxcXCIgKyBnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL2RhdGEvXFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiL2xpYnNfaGlrZXIvZHJweTIuanNcXFwiKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9KTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0SGllZChkLCBuYW1lLCBjb25maWcpIHtcXG4gICAgbGV0IHtcXG4gICAgICAgIHVpX2NvbmZpZyxcXG4gICAgICAgIHJlb3JkZXJBcnJheUJ5T3JkZXJcXG4gICAgfSA9ICQucmVxdWlyZShcXFwiVUlNYW5hZ2VcXFwiKTtcXG4gICAgdWlfY29uZmlnID0gdWlfY29uZmlnLnlpO1xcbiAgICBsZXQgdWlfaW5kZXhzID0gdWlfY29uZmlnLnVpO1xcblxcbiAgICBsZXQgc2VsZWN0cyA9IFt7XFxuICAgICAgICB0aXRsZTogXFxcIuaUtuiXj1xcXCIsXFxuICAgICAgICBpY29uOiAnaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9zeXN0ZW0vMTM5LnBuZydcXG4gICAgfSwge1xcbiAgICAgICAgdGl0bGU6IFxcXCLkuabmnrYt5bCP6K+0XFxcIixcXG4gICAgICAgIGljb246ICdodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL3EvMTMucG5nJ1xcbiAgICB9LCB7XFxuICAgICAgICB0aXRsZTogXFxcIuS5puaeti3mvKvnlLtcXFwiLFxcbiAgICAgICAgaWNvbjogJ2h0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vcS8zNC5wbmcnXFxuICAgIH1dXFxuXFxuICAgIGxldCBmYXZpY29ucyA9IHtcXG4gICAgICAgIGdldChzdCkge1xcbiAgICAgICAgICAgIHN0ID0gc3QgfHwgc2VsZWN0cztcXG4gICAgICAgICAgICByZXR1cm4gJChzdCwgMiwgXFxcIuaIkeeahFxcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5pbmNsdWRlcyhcXFwi5Y6G5Y+yXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9oaXN0b3J5P3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGU7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuaW5jbHVkZXMoXFxcIuS5puaeti3lsI/or7RcXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL3BhZ2UvQm9va3JhY2sudmlldyNub1JlY29yZEhpc3RvcnkjP3J1bGU95pys5Zyw6LWE5rqQ566h55CGJnR5cGU9bm92ZWwmcnVsZU5hbWU9JyArIE1ZX1JVTEUudGl0bGU7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuaW5jbHVkZXMoXFxcIuS5puaeti3mvKvnlLtcXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL3BhZ2UvQm9va3JhY2sudmlldyNub1JlY29yZEhpc3RvcnkjP3J1bGU95pys5Zyw6LWE5rqQ566h55CGJnR5cGU9Y29taWMmcnVsZU5hbWU9JyArIE1ZX1JVTEUudGl0bGU7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuaW5jbHVkZXMoXFxcIuaUtuiXj1xcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vY29sbGVjdGlvbj9ydWxlPVxcXCIgKyBNWV9SVUxFLnRpdGxlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH1cXG4gICAgfTtcXG5cXG5cXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZhdmljb25zLCAnc2VsZWN0Jywge1xcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RzO1xcbiAgICAgICAgfSxcXG4gICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcXG4gICAgICAgICAgICBzZWxlY3RzLnB1c2godmFsdWUpO1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgR00ucHV0KFxcXCJmYXZpY29uc1xcXCIsIGZhdmljb25zKTtcXG5cXG4gICAgbGV0IHNtb2RlID0gTnVtYmVyKGdldEl0ZW0oXFxcInNtb2RlXFxcIiwgXFxcIjBcXFwiKSk7XFxuICAgIGxldCBzZWFyY2hzb3J0ID0gTnVtYmVyKGdldEl0ZW0oXFxcInNlYXJjaHNvcnRcXFwiLCBcXFwiMFxcXCIpKTtcXG4gICAgbGV0IGZpbGVTZWxlY3QgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFwiKTtcXG4gICAgbGV0IHVpb2JqID0gW107XFxuXFxuXFxuICAgIHVpb2JqLnB1c2goe1xcbiAgICAgICAgaW5kZXg6IDAsXFxuICAgICAgICBrZXk6IFxcXCLmjaLmupBcXFwiLFxcbiAgICAgICAgdGl0bGU6IFxcXCLmjaLmupBcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IHVpX2NvbmZpZy5jb2wsXFxuICAgICAgICBpbWc6ICdodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL3N5c3RlbS8xMzAucG5nJyxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJDaGFuZ2VTb3VyY2VQb3BcXFwiKS5zaG93KCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBjcGF0aDogY29uZmlnLnBhdGgsXFxuICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuabtOaNoumFjee9rlxcXCIsXFxuICAgICAgICAgICAgICAgIGpzOiBKU09OLnN0cmluZ2lmeShcXFwiaGlrZXI6Ly9wYWdlL2NyZWF0ZUNvbmZpZyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiKVxcbiAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLorr/pl67nvZHnq5lcXFwiLFxcbiAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwid2ViOi8vXFxcIiArIERycHlNYW5hZ2UuZ2V0KHNvdXJjZS5rZXkpLmdldFJ1bGUoXFxcImhvc3RcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIC8vcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5Yi35paw5rqQXFxcIixcXG4gICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBEcnB5TWFuYWdlLmdldChzb3VyY2Uua2V5KS5pbml0KHJ1bnRpbWVDb25maWcuZ2V0QWJzb2x1dGVQYXRoKHNvdXJjZS5leHQpKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIumHjei9vea6kFxcXCIsXFxuICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgRHJweU1hbmFnZS5kZWwoc291cmNlLmtleSk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLmn6XnnIvmupDku6PnoIFcXFwiLFxcbiAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb2RlID0gRHJweU1hbmFnZS5nZXQoc291cmNlLmtleSkucnVuTWFpbihcXFwibGV0IG1haW49XFxcIiArICQudG9TdHJpbmcoKGV4dCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiBnZXRPcmlnaW5hbEpzKHJlcXVlc3QoZXh0LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXRob2QnOiAnR0VUJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgICAgIH0sIHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZVBhdGgoKSkpO1xcblxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9fY2FjaGUvdmlld1NvdXJjZUNvZGUuanNcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGgsIGNvZGUpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJlZGl0RmlsZTovL1xcXCIgKyBwYXRoO1xcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH1dLmNvbmNhdChjb25maWcudHlwZSA9PT0gXFxcImxvY2FsRGlyXFxcIiA/IFt7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi57yW6L6R5Y+C5pWw5pig5bCE6KGoXFxcIixcXG4gICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHBhdGgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHBhdGgrPVxcXCIvLm1hcHBpbmcudHh0XFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIGlmKGZpbGVFeGlzdChwYXRoKSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJlZGl0RmlsZTovL1xcXCIrcGF0aDtcXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLkuI3lrZjlnKjmmKDlsITmlofku7bmmK/lkKbliJvlu7rvvJ9cXFwiKS5jb25maXJtKHBhdGg9PntcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGgsXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImVkaXRGaWxlOi8vXFxcIitwYXRoO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHBhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9LCBjb25maWcucGF0aClcXG4gICAgICAgICAgICB9LHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLmnKzlnLDnrqHnkIZcXFwiLFxcbiAgICAgICAgICAgICAgICBqczogXFxcIidoaWtlcjovL3BhZ2UvTG9jYWxEaXIjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjJ1xcXCJcXG4gICAgICAgICAgICB9XSA6IFtdKVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG5cXG4gICAgdWlvYmoucHVzaCh7XFxuICAgICAgICBpbmRleDogMSxcXG4gICAgICAgIGtleTogXFxcIuaQnOe0ouaooeW8j1xcXCIsXFxuICAgICAgICB0aXRsZTogW1xcXCLpgInkuK1cXFwiLCBcXFwi6IGa5ZCIXFxcIiwgY29uZmlnLnNUYWcgfHwgXFxcIuaXoFRBR1xcXCJdW3Ntb2RlXSxcXG4gICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHNtb2RlID0gTnVtYmVyKGdldEl0ZW0oXFxcInNtb2RlXFxcIiwgXFxcIjBcXFwiKSk7XFxuICAgICAgICAgICAgcmV0dXJuICQoW1xcXCLpgInkuK1cXFwiLCBcXFwi6IGa5ZCIXFxcIiwgXFxcIuaMiVRBR1xcXCJdLCAxLCBcXFwi5pCc57Si5qih5byPXFxcIiwgc21vZGUpLnNlbGVjdCgodCkgPT4ge1xcbiAgICAgICAgICAgICAgICBpZiAoTVlfSU5ERVggPT09IDIpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdGFnQ2xhc3NlcyA9IHJ1bnRpbWVDb25maWcuZ2V0VGFnQ2xhc3NlcygpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YWcgPSBydW50aW1lQ29uZmlnLmdldFNlYXJjaFRhZygpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGFnQ2xhc3Nlcy5sZW5ndGgpIHJldHVybiBcXFwidG9hc3Q6Ly/lvZPliY3phY3nva7msqHmnIlUQUflk6bjgIJcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWcpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHRhZ0NsYXNzZXMuaW5kZXhPZihzdGFnKSArIDE7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB0YWdDbGFzc2VzLnVuc2hpZnQoXFxcIlvml6BUQUddXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCh0YWdDbGFzc2VzLCAzLCBcXFwi5pCc57SiVEFHW1xcXCIgKyB0YWdDbGFzc2VzLmxlbmd0aCArIFxcXCJdXFxcIiwgaW5kZXgpLnNlbGVjdCgodCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRhZyA9IE1ZX0lOREVYID09PSAwID8gXFxcIlxcXCIgOiBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVudGltZUNvbmZpZy5zZXRTZWFyY2hUYWcodGFnKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJzbW9kZVxcXCIsIFxcXCIyXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0odCArIFxcXCJAc2VhcmNoX21vZGVcXFwiLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGFnIHx8IFxcXCLml6BUQUdcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gXFxcIlxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruWksei0pVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfSwgdCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgc2V0SXRlbShcXFwic21vZGVcXFwiLCBcXFwiXFxcIiArIE1ZX0lOREVYKTtcXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbSh0ICsgXFxcIkBzZWFyY2hfbW9kZVxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBbXFxcIumAieS4rVxcXCIsIFxcXCLogZrlkIhcXFwiXVtNWV9JTkRFWF0sXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgIH0sIE1ZX1JVTEUudGl0bGUpXFxuICAgICAgICB9KSxcXG4gICAgICAgIGltZzogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vc3lzdGVtLzE0OS5wbmdcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IHVpX2NvbmZpZy5jb2wsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBNWV9SVUxFLnRpdGxlICsgXFxcIkBzZWFyY2hfbW9kZVxcXCIsXFxuICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuaMh+WumuaQnOe0oua6kFxcXCIsXFxuICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiU2VhcmNoQWxsb3dQb3BcXFwiKS5zaG93KCk7XFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuaQnOe0ouaOkuW6jzpcXFwiICsgW1xcXCLml6BcXFwiLCBcXFwi6Ieq54S2XFxcIiwgXFxcIuS9v+eUqFxcXCJdW3NlYXJjaHNvcnRdLFxcbiAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoc2VhcmNoc29ydCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoW1xcXCLkuI3kvb/nlKhcXFwiLCBcXFwi6Ieq54S25o6S5bqPXFxcIiwgXFxcIuS9v+eUqOaOkuW6j1xcXCJdLCAxLCBcXFwi5pCc57Si5o6S5bqPXFxcIiwgc2VhcmNoc29ydCkuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJzZWFyY2hzb3J0XFxcIiwgU3RyaW5nKE1ZX0lOREVYKSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgIH0sIHNlYXJjaHNvcnQpXFxuICAgICAgICAgICAgfV1cXG4gICAgICAgIH1cXG4gICAgfSk7XFxuXFxuICAgIGxldCBzZXR0aW5ncyA9IFtcXFwi6Kej5p6Q566h55CGXFxcIiwgXFxcIuWumOaWueW8ueW5lVxcXCIsIFxcXCLmlK/mjIHkvZzogIVcXFwiLCBcXFwiVUnnrqHnkIZcXFwiLCBcXFwi6LCD6K+V5pel5b+XOlxcXCIgKyAoIWdldEl0ZW0oXFxcInVzZUxvZ1xcXCIsIFxcXCJcXFwiKSA/IFxcXCLlhbPpl61cXFwiIDogXFxcIuW8gOWQr1xcXCIpLCBcXFwi6Lez6L+H5b2i5byP5LqM57qnOlxcXCIgKyAoIWdldEl0ZW0oXFxcInNraXBFclxcXCIsIFxcXCJcXFwiKSA/IFxcXCLlhbPpl61cXFwiIDogXFxcIuW8gOWQr1xcXCIpLCBcXFwi5YiG5Lqr5a+85YWl6Lev5b6EXFxcIiwgXFxcIuWIm+W7uuiuoumYheWcsOWdgFxcXCIsIFxcXCLliIfmjaLliJfooajmoLflvI9cXFwiLCBcXFwi5pu05o2i6YWN572uXFxcIl07XFxuICAgIGxldCBkaXNWaXNpYmxlcyA9IHVpX2luZGV4cy5maWx0ZXIoeCA9PiB4LmluZGV4ID09IC0xKTtcXG4gICAgaWYgKGRpc1Zpc2libGVzLnNvbWUoeCA9PiB4LmtleSA9PSBcXFwi5pCc57Si5qih5byPXFxcIikpIHtcXG4gICAgICAgIHNldHRpbmdzLnB1c2goXFxcIuaQnOe0ouaooeW8jzpcXFwiICsgW1xcXCLpgInkuK1cXFwiLCBcXFwi6IGa5ZCIXFxcIl1bc21vZGVdKTtcXG4gICAgICAgIHNldHRpbmdzLnB1c2goXFxcIuaQnOe0ouaMh+Wumua6kFxcXCIpO1xcbiAgICAgICAgc2V0dGluZ3MucHVzaChcXFwi5pCc57Si5o6S5bqPOlxcXCIgKyBbXFxcIuaXoFxcXCIsIFxcXCLoh6rnhLZcXFwiLCBcXFwi5L2/55SoXFxcIl1bc2VhcmNoc29ydF0pO1xcbiAgICB9XFxuICAgIGlmIChkaXNWaXNpYmxlcy5zb21lKHggPT4geC5rZXkgPT0gXFxcIuaUtuiXj1xcXCIpKSB7XFxuICAgICAgICBzZXR0aW5ncy5wdXNoKFxcXCLmiJHnmoRcXFwiKTtcXG4gICAgfVxcblxcbiAgICB1aW9iai5wdXNoKHtcXG4gICAgICAgIGtleTogXFxcIuiuvue9rlxcXCIsXFxuICAgICAgICBpbmRleDogMixcXG4gICAgICAgIHRpdGxlOiBcXFwi6K6+572uXFxcIixcXG4gICAgICAgIHVybDogJChzZXR0aW5ncywgMiwgXFxcIuiuvue9rlxcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgaWYgKFxcXCLop6PmnpDnrqHnkIZcXFwiID09IGlucHV0KSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVNYW5hZ2Ujbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxcXCLlrpjmlrnlvLnluZVcXFwiID09PSBpbnB1dCkge1xcbiAgICAgICAgICAgICAgICBsZXQgdXNlRGFubXUgPSAhIWdldEl0ZW0oXFxcInVzZURhbm11XFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChcXFwi5b2T5Li65a6Y5rqQ5pe25Yy56YWN5by55bmVKOmcgOimgWRhbm1155uS5a2Q5pSv5oyBKVxcXFxu5b2T5YmNOlxcXCIgKyB1c2VEYW5tdSArIFxcXCJcXFxcbueCueWHu+ehruWumuWNs+WPr1xcXCIgKyAodXNlRGFubXUgPyBcXFwi5YWz6ZetXFxcIiA6IFxcXCLlvIDlkK9cXFwiKSkuY29uZmlybSgodXNlRGFubXUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInVzZURhbm11XFxcIiwgdXNlRGFubXUgPyBcXFwiXFxcIiA6IFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArICh1c2VEYW5tdSA/IFxcXCLlt7LlhbPpl61cXFwiIDogXFxcIuW3suW8gOWQr1xcXCIpO1xcbiAgICAgICAgICAgICAgICB9LCB1c2VEYW5tdSk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5pbmNsdWRlcyhcXFwi6LCD6K+V5pel5b+XXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHVzZUxvZyA9ICEhZ2V0SXRlbShcXFwidXNlTG9nXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChcXFwi5byA5ZCv5pel5b+X6L6F5Yqp6LCD6K+V77yM5pmu6YCa5L2/55So5LiN6ZyA6KaB5byA5ZCvXFxcXG7lvZPliY06XFxcIiArIHVzZUxvZyArIFxcXCJcXFxcbueCueWHu+ehruWumuWNs+WPr1xcXCIgKyAodXNlTG9nID8gXFxcIuWFs+mXrVxcXCIgOiBcXFwi5byA5ZCvXFxcIikpLmNvbmZpcm0oKHVzZUxvZykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwidXNlTG9nXFxcIiwgdXNlTG9nID8gXFxcIlxcXCIgOiBcXFwiMVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIERycHlNYW5hZ2UuZGVsKHNvdXJjZS5rZXkpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgKHVzZUxvZyA/IFxcXCLlt7LlhbPpl61cXFwiIDogXFxcIuW3suW8gOWQr1xcXCIpO1xcbiAgICAgICAgICAgICAgICB9LCB1c2VMb2cpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLliJvlu7rorqLpmIXlnLDlnYBcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2NyZWF0ZVN1YnNjcmlwdGlvbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLliIfmjaLliJfooajmoLflvI9cXFwiKSB7XFxuICAgICAgICAgICAgICAgIGxldCBjb2xsaXN0ID0gW1xcXCLpu5jorqRcXFwiLCBcXFwibW92aWVfM19tYXJxdWVlXFxcIiwgXFxcIm1vdmllXzNcXFwiLCBcXFwibW92aWVfMlxcXCIsIFxcXCJtb3ZpZV8xXFxcIiwgXFxcInRleHRfMVxcXCIsIFxcXCJhdmF0YXJcXFwiLCBcXFwidGV4dF9pY29uXFxcIiwgXFxcImNhcmRfcGljXzNcXFwiLCBcXFwiY2FyZF9waWNfM19jZW50ZXJcXFwiLCBcXFwicGljXzFfY2FyZFxcXCIsIFxcXCJwaWNfMl9jYXJkXFxcIiwgXFxcIm1vdmllXzFfdmVydGljYWxfcGljXFxcIiwgXFxcIm1vdmllXzFfbGVmdF9waWNcXFwiXTtcXG4gICAgICAgICAgICAgICAgbGV0IGhvbWVMaXN0Q29sID0gZ2V0SXRlbShcXFwiaG9tZUxpc3RDb2xcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGhvbWVMaXN0Q29sID8gY29sbGlzdC5pbmRleE9mKGhvbWVMaXN0Q29sKSA6IDA7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKGNvbGxpc3QsIDIsIFxcXCLpgInmi6nmoLflvI9cXFwiLCBpbmRleCkuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChNWV9JTkRFWCA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcImhvbWVMaXN0Q29sXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJob21lTGlzdENvbFxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLmm7TmjaLphY3nva5cXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2NyZWF0ZUNvbmZpZyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXFxcIuaUr+aMgeS9nOiAhVxcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvRG9uYXRlLnYjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxcXCJVSeeuoeeQhlxcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvVUlNYW5hZ2U/bW9kZT3kuIDnuqcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxcXCLliIbkuqvlr7zlhaXot6/lvoRcXFwiID09IGlucHV0KSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3NoYXJlZGVmYXVsdHBhdGgjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0LmluY2x1ZGVzKFxcXCLmkJzntKLmqKHlvI9cXFwiKSkge1xcbiAgICAgICAgICAgICAgICBsZXQgc21vZGUgPSBOdW1iZXIoZ2V0SXRlbShcXFwic21vZGVcXFwiLCBcXFwiMFxcXCIpKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoW1xcXCLpgInkuK1cXFwiLCBcXFwi6IGa5ZCIXFxcIl0sIDEsIFxcXCLmkJzntKLmqKHlvI9cXFwiLCBzbW9kZSkuc2VsZWN0KCh0KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJzbW9kZVxcXCIsIFxcXCJcXFwiICsgTVlfSU5ERVgpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIE1ZX1JVTEUudGl0bGUpXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PSBcXFwi5pCc57Si5oyH5a6a5rqQXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJTZWFyY2hBbGxvd1BvcFxcXCIpLnNob3coKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09IFxcXCLmiJHnmoRcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGxldCBmYXZpY29ucyA9IEdNLmdldChcXFwiZmF2aWNvbnNcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhdmljb25zLmdldCgpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuaW5jbHVkZXMoXFxcIuaQnOe0ouaOkuW6j1xcXCIpKSB7XFxuICAgICAgICAgICAgICAgIGxldCBzZWFyY2hzb3J0ID0gTnVtYmVyKGdldEl0ZW0oXFxcInNlYXJjaHNvcnRcXFwiLCBcXFwiMFxcXCIpKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoW1xcXCLkuI3kvb/nlKhcXFwiLCBcXFwi6Ieq54S25o6S5bqPXFxcIiwgXFxcIuS9v+eUqOaOkuW6j1xcXCJdLCAxLCBcXFwi5pCc57Si5o6S5bqPXFxcIiwgc2VhcmNoc29ydCkuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInNlYXJjaHNvcnRcXFwiLCBTdHJpbmcoTVlfSU5ERVgpKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5pbmNsdWRlcyhcXFwi6Lez6L+H5b2i5byP5LqM57qnXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHNraXBFciA9ICEhZ2V0SXRlbShcXFwic2tpcEVyXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJza2lwRXJcXFwiLCBza2lwRXIgPyBcXFwiXFxcIiA6IFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7JcXFwiICsgKHNraXBFciA/IFxcXCLlhbPpl61cXFwiIDogXFxcIuW8gOWQr1xcXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pLFxcbiAgICAgICAgaW1nOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9zeXN0ZW0vMTUwLnBuZ1xcXCIsXFxuICAgICAgICBjb2xfdHlwZTogdWlfY29uZmlnLmNvbCxcXG4gICAgfSk7XFxuICAgIHVpb2JqLnB1c2goe1xcbiAgICAgICAgaW5kZXg6IDMsXFxuICAgICAgICBrZXk6IFxcXCLljoblj7JcXFwiLFxcbiAgICAgICAgdGl0bGU6IFxcXCLljoblj7JcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IHVpX2NvbmZpZy5jb2wsXFxuICAgICAgICBpbWc6ICdodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL3N5c3RlbS8xMzYucG5nJyxcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vaGlzdG9yeT9ydWxlPVxcXCIgKyBNWV9SVUxFLnRpdGxlLFxcbiAgICB9KTtcXG4gICAgdWlvYmoucHVzaCh7XFxuICAgICAgICBpbmRleDogNCxcXG4gICAgICAgIGtleTogXFxcIuaUtuiXj1xcXCIsXFxuICAgICAgICB0aXRsZTogXFxcIuaUtuiXj1xcXCIsXFxuICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBmYXZpY29ucyA9IEdNLmdldChcXFwiZmF2aWNvbnNcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gZmF2aWNvbnMuZ2V0KCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGltZzogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vc3lzdGVtLzEzOS5wbmdcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IHVpX2NvbmZpZy5jb2wsXFxuICAgIH0pO1xcbiAgICB1aW9iai5wdXNoKHtcXG4gICAgICAgIGluZGV4OiA1LFxcbiAgICAgICAga2V5OiBcXFwi5rqQ5ZCNXFxcIixcXG4gICAgICAgIHRpdGxlOiBcXFwi5b2T5YmN5rqQOlxcXCIgKyAobmFtZSB8fCBcXFwiXFxcIiksXFxuICAgICAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCIsXFxuICAgICAgICBpbWc6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL2tlLzE1MC5wbmdcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwidG9hc3Q6Ly/ngrnkuIrpnaLmjaLmupBcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogTVlfUlVMRS50aXRsZSArIFxcXCJzb3VyY2VuYW1lXFxcIixcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIHVpb2JqLnB1c2goe1xcbiAgICAgICAgaW5kZXg6IDYsXFxuICAgICAgICBrZXk6IFxcXCLmkJzntKJcXFwiLFxcbiAgICAgICAgdGl0bGU6ICfmkJzntKInLFxcbiAgICAgICAgLy9kZXNjOiAnJyxcXG4gICAgICAgIGRlc2M6ICfopoHmkJzngrnku4DkuYgnLFxcbiAgICAgICAgdXJsOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vc2VhcmNoP3J1bGU9JyArIE1ZX1JVTEUudGl0bGUgKyBcXFwiJnM9XFxcIiArIGlucHV0O1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFwia2V5d29yZFxcXCIsIFxcXCJcXFwiKSxcXG4gICAgICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJrZXl3b3JkXFxcIiwgaW5wdXQpXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJ1aW9ialxcXCIsIHVpb2JqKTtcXG5cXG4gICAgc3Vpb2JqID0gdWlvYmouc2xpY2UoKTtcXG4gICAgdWlvYmogPSByZW9yZGVyQXJyYXlCeU9yZGVyKHVpb2JqLCB1aV9pbmRleHMpO1xcbiAgICB1aV9pbmRleHMubWFwKGl0ZW0gPT4ge1xcbiAgICAgICAgaWYgKGl0ZW0ua2V5ID09IFxcXCLmjaLmupBcXFwiICYmIGl0ZW0uaW5kZXggPT0gLTEpIHtcXG4gICAgICAgICAgICBsZXQgb2JqaSA9IHN1aW9iai5maW5kSW5kZXgoeCA9PiB4LmtleSA9PSBcXFwi5o2i5rqQXFxcIik7XFxuICAgICAgICAgICAgbGV0IGNvYmppID0gdWlvYmouZmluZEluZGV4KHggPT4geC5rZXkgPT0gXFxcIua6kOWQjVxcXCIpO1xcbiAgICAgICAgICAgIGlmIChvYmppICE9IDEgJiYgY29iamkgIT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgdWlvYmpbY29iamldLnVybCA9IHN1aW9ialtvYmppXS51cmw7XFxuICAgICAgICAgICAgICAgIGlmIChzdWlvYmpbb2JqaV0uaGFzT3duUHJvcGVydHkoXFxcImV4dHJhXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIHVpb2JqW2NvYmppXS5leHRyYSA9IHN1aW9ialtvYmppXS5leHRyYTtcXG4gICAgICAgICAgICAgICAgICAgIHVpb2JqW2NvYmppXS5leHRyYS5pZCA9IE1ZX1JVTEUudGl0bGUgKyBcXFwic291cmNlbmFtZVxcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoaXRlbS5rZXkgPT0gXFxcIua6kOWQjVxcXCIgJiYgaXRlbS5pbmRleCA9PSAtMSkge1xcbiAgICAgICAgICAgIGxldCBvYmppID0gc3Vpb2JqLmZpbmRJbmRleCh4ID0+IHgua2V5ID09IFxcXCLmupDlkI1cXFwiKTtcXG4gICAgICAgICAgICBsZXQgY29iamkgPSB1aW9iai5maW5kSW5kZXgoeCA9PiB4LmtleSA9PSBcXFwi5o2i5rqQXFxcIik7XFxuICAgICAgICAgICAgaWYgKG9iamkgIT0gMSAmJiBjb2JqaSAhPSAtMSkge1xcbiAgICAgICAgICAgICAgICB1aW9ialtjb2JqaV0udGl0bGUgPSBuYW1lIHx8IFxcXCLmjaLmupBcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChpdGVtLmtleSA9PSBcXFwi5Y6G5Y+yXFxcIiAmJiBpdGVtLmluZGV4ID09IC0xKSB7XFxuICAgICAgICAgICAgc2VsZWN0cy51bnNoaWZ0KHtcXG4gICAgICAgICAgICAgICAgXFxcInRpdGxlXFxcIjogXFxcIuWOhuWPslxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJpY29uXFxcIjogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vc3lzdGVtLzEzNi5wbmdcXFwiXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuXFxuICAgIHVpb2JqLmZvckVhY2goaXRlbSA9PiB7XFxuICAgICAgICBkLnB1c2goaXRlbSlcXG4gICAgfSlcXG5cXG5cXG5cXG59XFxubGV0IGQgPSBbXTtcXG5cXG5sZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbmxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIik7XFxuRHJweU1hbmFnZS5pbml0UGFnZShcXFwiaG9tZVxcXCIpO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgKCkgPT4ge1xcbiAgICBjbGVhck15VmFyKFxcXCJsaW5rc1xcXCIpO1xcbiAgICBHTS5jbGVhcihcXFwiZmF2aWNvbnNcXFwiKVxcbn0pO1xcbnRyeSB7XFxuICAgIGlmIChhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAzMCAmJiAhYW5kcm9pZC5vcy5FbnZpcm9ubWVudC5pc0V4dGVybmFsU3RvcmFnZU1hbmFnZXIoKSkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAmOKAmOaPkOekuuKAmeKAmVxcXCIsXFxuICAgICAgICAgICAgZGVzYzogXFxcIuW9k+WJjeayoeacieaWh+S7tueuoeeQhuadg+mZkOaXoOazleato+W4uOS9v+eUqOivt+aJk+W8gOa1t+mYlOiuvue9rj0+5pu05aSa6K6+572uPT7lhoXpg6jmlofku7bnrqHnkIY9PuWPs+S4iuinklxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH0gZWxzZSBpZiAoIXJ1bnRpbWVDb25maWcuaXNQcmVwYXJlZCgpKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi6L+Y5rKh5pyJ6YWN572u6KeG6aKR5rqQXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvY3JlYXRlQ29uZmlnI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgIH0pO1xcbiAgICB9IGVsc2UgaWYgKGZpbGVFeGlzdChcXFwiaGlrZXI6Ly9maWxlcy9kYXRhL1xcXCIgKyBNWV9SVUxFLnRpdGxlICsgXFxcIi9saWJzX2hpa2VyL2RycHkyLmpzXFxcIikpIHtcXG4gICAgICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2UoKTtcXG4gICAgICAgIGlmIChNWV9QQUdFID09PSAxKSB7XFxuICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSB1bmRlZmluZWQpIHtcXG4gICAgICAgICAgICAgICAgc2V0SGllZChkKVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHNldEhpZWQoZCwgc291cmNlLm5hbWUsIHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudENvbmZpZygpIHx8IHt9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICAvL2xvZyhEcnB5TWFuYWdlLmdldChzb3VyY2Uua2V5KSlcXG4gICAgICAgIGxldCBoYXNIYWVkID0gZmFsc2U7XFxuICAgICAgICBpZiAoZ2V0TXlWYXIoXFxcImxpbmtzXFxcIiwgXFxcIlxcXCIpID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICfliqDovb3kuK0uLi4nLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9SVUxFLnRpdGxlICsgXFxcImxvYWRcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBzZXRQcmVSZXN1bHQoZCk7XFxuICAgICAgICAgICAgZC5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgIGhhc0hhZWQgPSB0cnVlO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHNvdXJjZSkge1xcbiAgICAgICAgICAgIGxvYWQoZCwgRHJweU1hbmFnZS5nZXQoc291cmNlLmtleSksIHNvdXJjZSwgaGFzSGFlZCk7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBzZXREcnB5UGF0aChkKTtcXG4gICAgfVxcblxcbn0gY2F0Y2ggKGUpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi4oCc4oCcXFxcIiArIGUudG9TdHJpbmcoKSArIFxcXCLigJ3igJ1cXFwiLFxcbiAgICAgICAgZGVzYzogZS5saW5lTnVtYmVyLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5riF6ZmkdWnorr7nva5cXFwiLFxcbiAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpX2NsZWFyLFxcbiAgICAgICAgICAgICAgICAgICAgfSA9ICQucmVxdWlyZShcXFwiVUlNYW5hZ2VcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHVpX2NsZWFyKFxcXCJ5aVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9XVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5pu05o2i6YWN572uXFxcIixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9jcmVhdGVDb25maWcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgZGVsZXRlSXRlbShNWV9SVUxFLnRpdGxlICsgXFxcImxvYWRcXFwiKTtcXG59XFxuXFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Li76aG15aSE55CGXCIsXCJwYXRoXCI6XCJNaWFuTG9hZFwiLFwicnVsZVwiOlwiaWYgKGdldEl0ZW0oXFxcImZpcnN0b3BlblxcXCIpID09IE1ZX1JVTEUudmVyc2lvbikge1xcbiAgICAkLnJlcXVpcmUoXFxcIm1pYW5cXFwiKTtcXG59IGVsc2UgaWYgKE1ZX1BBR0UgPT09IDEpIHtcXG4gICAgbGV0IGQgPSBbXVxcbiAgICBsZXQgdGltZSA9IGdldEl0ZW0oXFxcImZpcnN0b3BlblxcXCIsIFxcXCJcXFwiKSA/IDYgOiAyMDtcXG4gICAgbGV0IGlkID0gRGF0ZS5ub3coKTtcXG4gICAgbGV0IGNvbnRlbnQgPSBgXFxuICAgIDEuIOacrOWwj+eoi+W6j+aJgOacieS7o+eggeWFqOmDqOW8gOa6kO+8jOS4lOacrOinhOWImeS4uuWtpuS5oOebrueahO+8jOivt+S6juWvvOWFpTI05bCP5pe25YaF5Yig6Zmk77yB77yB77yBXFxuICAgIDIuIOacrOWwj+eoi+W6jzxiPuWujOWFqOWFjei0uTwvYj7vvIzlpoLmnpzkvaDmmK/ku5jotLnotK3kubDnmoTmga3llpzkvaDooqvpqpfkuobjgIJcXG4gICAg5b2T54S25aaC5p6c5pyJ6IO95Yqb5oOz6byT5Yqx5L2c6ICF55qE5Y+v5LulJHtcXFwi5pSv5oyB5LiA5LiLXFxcIi5saW5rKFxcXCJoaWtlcjovL3BhZ2UvRG9uYXRlLnYjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIil9PC9hPig8c21hbGw+54K55Ye75Y+v6L+b5YWl5o2Q6LWg77yM5Y+v5Zyo5Li76aG16I+c5Y2V6L+b5YWlPC9zbWFsbD4p44CCXFxuICAgIDMuIOacrOWwj+eoi+W6j+WPquaUr+aMgemBk+mVv+eahGRycHlbanNd6KeG6aKR5rqQ77yM5YW25LuW5LiA5qaC5LiN5pSv5oyB44CCXFxuICAgIFxcbiAgICA8Yj7lvIDlp4vkvb/nlKjmnKzop4TliJnljbPku6PooajpgbXlrojop4TliJnmnaHkvos8L2I+XFxuICAgIGA7XFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnTxzdHJvbmc+5L2/55So5YmN6aG755+lPC9zdHJvbmc+XFxcIi5iaWcoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGNvbnRlbnQudHJpbSgpLnJlcGxhY2UoL1xcXFxuXFxcXHMqPy9nLCBcXFwiPGJyPlxcXCIpLFxcbiAgICAgICAgXFxcImNvbF90eXBlXFxcIjogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSwge1xcbiAgICAgICAgdGl0bGU6IGDlvZPliY3niYjmnKzvvJoke01ZX1JVTEUudmVyc2lvbn0gJHtnZXRJdGVtKFxcXCJmaXJzdG9wZW5cXFwiLCBcXFwiXFxcIikgJiYgZ2V0SXRlbShcXFwiZmlyc3RvcGVuXFxcIiwgXFxcIlxcXCIpIDwgTVlfUlVMRS52ZXJzaW9uID8gXFxcIvCfhpVcXFwiIDogXFxcIlxcXCJ9YCxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgY29uc3QgaGlrZXJQb3AgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTY5NjZcXFwiKTtcXG4gICAgICAgICAgICBoaWtlclBvcC51cGRhdGVSZWNvcmRzQm90dG9tKCQucmVxdWlyZShcXFwidXBkYXRlUmVjb3Jkc1xcXCIpKTtcXG5cXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2VcXG4gICAgICAgIH1cXG4gICAgfSwge1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbiAgICB9LCB7XFxuICAgICAgICB0aXRsZTogdGltZSArIFxcXCLnp5LlkI7nu6fnu61cXFwiLFxcbiAgICAgICAgdXJsOiBcXFwidG9hc3Q6Ly/or7forqTnnJ/pmIXor7vku6XkuIrlhoXlrrlcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IGlkICsgXFxcInRpbWVyXFxcIlxcbiAgICAgICAgfVxcbiAgICB9KTtcXG5cXG4gICAgc2V0UmVzdWx0KGQpO1xcbiAgICB3aGlsZSAodGltZSAhPSAwKSB7XFxuICAgICAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKDEwMDApO1xcbiAgICAgICAgdGltZSAtPSAxO1xcbiAgICAgICAgdXBkYXRlSXRlbShpZCArIFxcXCJ0aW1lclxcXCIsIHtcXG4gICAgICAgICAgICB0aXRsZTogdGltZSArIFxcXCLnp5LlkI7nu6fnu61cXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICB1cGRhdGVJdGVtKGlkICsgXFxcInRpbWVyXFxcIiwge1xcbiAgICAgICAgdGl0bGU6IFxcXCLigJzigJzmiJHlkIzmhI/ku6XkuIropoHmsYLigJ3igJ1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCh2KSA9PiB7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwiZmlyc3RvcGVuXFxcIiwgU3RyaW5nKHYpKTtcXG4gICAgICAgICAgICBHTS5jbGVhcihcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aEn+iwouaCqOeahOeQhuino1xcXCI7XFxuICAgICAgICB9LCBNWV9SVUxFLnZlcnNpb24pLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbiAgICB9KTtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJVaeeuoeeQhlwiLFwicGF0aFwiOlwiVUlNYW5hZ2VcIixcInJ1bGVcIjpcImpzOlxcbmZ1bmN0aW9uIHJlb3JkZXJBcnJheUJ5T3JkZXIoYXJyYXksIG9yZGVyKSB7XFxuICAvLyDliJvlu7rkuIDkuKrmmKDlsITvvIzlsIZrZXnlgLzmmKDlsITliLDljp/lp4vmlbDnu4TkuK3nmoTlr7nosaFcXG4gIGxldCBtYXAgPSBuZXcgTWFwKGFycmF5Lm1hcChvYmogPT4gW29iai5rZXksIG9ial0pKTtcXG4gIGxldCByZW9yZGVyZWRBcnJheSA9IFtdOyAvLyDph43mlrDmjpLluo/lkI7nmoTmlbDnu4RcXG4gIGxldCByZW1vdmVkS2V5cyA9IG5ldyBTZXQoKTsgLy8g5a2Y5YKo6ZyA6KaB56e76Zmk55qEa2V55YC8XFxuICAvLyDmoLnmja5vcmRlcuaVsOe7hOadpemHjeaWsOaOkuWIl2FycmF55pWw57uEXFxuICBvcmRlci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XFxuICAgIGlmIChpdGVtLmluZGV4ID09PSAtMSkge1xcbiAgICAgIC8vIOWmguaenGluZGV45pivLTHvvIzlsIZrZXnmt7vliqDliLDnp7vpmaTliJfooajkuK1cXG4gICAgICByZW1vdmVkS2V5cy5hZGQoaXRlbS5rZXkpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgIC8vIOWmguaenGluZGV45LiN5pivLTHvvIzliJnlsIblr7nosaHmt7vliqDliLDnu5PmnpzmlbDnu4TkuK3nmoTmjIflrprkvY3nva5cXG4gICAgICBsZXQgb2JqID0gbWFwLmdldChpdGVtLmtleSk7XFxuXFxuICAgICAgaWYgKGl0ZW0uaGFzT3duUHJvcGVydHkoXFxcImltZ1xcXCIpICYmIGl0ZW0uaW1nKSB7XFxuICAgICAgICBvYmouaW1nID0gaXRlbS5pbWdcXG4gICAgICB9XFxuICAgICAgaWYgKGl0ZW0uaGFzT3duUHJvcGVydHkoXFxcInRpdGxlXFxcIikgJiYgaXRlbS50aXRsZSkge1xcbiAgICAgICAgb2JqLnRpdGxlID0gaXRlbS50aXRsZTtcXG4gICAgICB9XFxuICAgICAgaWYgKG9iaikge1xcbiAgICAgICAgcmVvcmRlcmVkQXJyYXlbaV0gPSBvYmo7XFxuICAgICAgfVxcbiAgICB9XFxuICB9KTtcXG4gIC8vIOa3u+WKoOmCo+S6m+S4jeWcqG9yZGVy5pWw57uE5Lit55qE5a+56LGh77yM5bm25o6S6Zmk56e76Zmk5YiX6KGo5Lit55qE6aG5XFxuICBhcnJheS5mb3JFYWNoKG9iaiA9PiB7XFxuICAgIGlmICghcmVtb3ZlZEtleXMuaGFzKG9iai5rZXkpICYmICFyZW9yZGVyZWRBcnJheS5pbmNsdWRlcyhvYmopKSB7XFxuICAgICAgcmVvcmRlcmVkQXJyYXkucHVzaChvYmopO1xcbiAgICB9XFxuICB9KTtcXG4gIC8vIOi/h+a7pOaOiee7k+aenOaVsOe7hOS4reeahHVuZGVmaW5lZOmhue+8jOW5tui/lOWbnlxcbiAgcmV0dXJuIHJlb3JkZXJlZEFycmF5LmZpbHRlcihvYmogPT4gb2JqICE9PSB1bmRlZmluZWQpO1xcbn1cXG5cXG5sZXQgZGVmID0ge1xcbiAgeWk6IHtcXFwidWlcXFwiOlt7XFxcImtleVxcXCI6XFxcIuaNoua6kFxcXCIsXFxcImluZGV4XFxcIjowfSx7XFxcImtleVxcXCI6XFxcIuaQnOe0ouaooeW8j1xcXCIsXFxcImluZGV4XFxcIjoxfSx7XFxcImtleVxcXCI6XFxcIuaUtuiXj1xcXCIsXFxcImluZGV4XFxcIjo0LFxcXCJ0aXRsZVxcXCI6XFxcIuaIkeeahFxcXCJ9LHtcXFwia2V5XFxcIjpcXFwi6K6+572uXFxcIixcXFwiaW5kZXhcXFwiOjJ9LHtcXFwia2V5XFxcIjpcXFwi5pCc57SiXFxcIixcXFwiaW5kZXhcXFwiOjZ9LHtcXFwia2V5XFxcIjpcXFwi5rqQ5ZCNXFxcIixcXFwiaW5kZXhcXFwiOi0xfSx7XFxcImtleVxcXCI6XFxcIuWOhuWPslxcXCIsXFxcImluZGV4XFxcIjotMX1dLFxcXCJjb2xcXFwiOlxcXCJpY29uX3NtYWxsXzRcXFwifSxcXG4gIGVyOiB7IOWIhumhtTogNTAsIOWOhuWPsuiusOW9lTogMjAwIH1cXG59XFxubGV0IHVpX2NvbmZpZyA9IHN0b3JhZ2UwLmdldEl0ZW0oXFxcInVpX2NvbmZpZ1xcXCIsIGRlZik7XFxudWlfY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmLCB1aV9jb25maWcpO1xcblxcbmZ1bmN0aW9uIHVpX2NsZWFyKGtleSkge1xcbiAgdWlfY29uZmlnW2tleV0gPSBkZWZba2V5XTtcXG4gIHN0b3JhZ2UwLnNldEl0ZW0oXFxcInVpX2NvbmZpZ1xcXCIsIHVpX2NvbmZpZyk7XFxufVxcbi8vY2xlYXJJdGVtKFxcXCJ1aV9jb25maWdcXFwiKVxcblxcbiQuZXhwb3J0cyA9IHtcXG4gIHVpX2NsZWFyLFxcbiAgdWlfY29uZmlnLFxcbiAgcmVvcmRlckFycmF5QnlPcmRlcixcXG59XFxuXFxuaWYgKGdldFBhcmFtKFxcXCJtb2RlXFxcIiwgXFxcIlxcXCIpICE9IFxcXCJcXFwiKSB7XFxuICBhZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhck15VmFyKFxcXCJ1aV9uYXZpXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInVpbW9kZVxcXCIpO1xcbiAgfSkpO1xcbiAgc2V0UGFnZVRpdGxlKFxcXCJVSeeuoeeQhlxcXCIpO1xcbiAgbGV0IGQgPSBbXTtcXG4gIGxldCB1aV9uYXYgPSBbXFxcIuS4gOe6p1xcXCIsIFxcXCLkuoznuqdcXFwiXTtcXG4gIGxldCB1aV9uYXZpID0gZ2V0TXlWYXIoXFxcInVpX25hdmlcXFwiLCBnZXRQYXJhbShcXFwibW9kZVxcXCIsIFxcXCLkuIDnuqdcXFwiKSk7XFxuICB1aV9uYXYuZm9yRWFjaCh4ID0+IHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyAoeCA9PSB1aV9uYXZpID8geC5mb250Y29sb3IoXFxcInJlZFxcXCIpIDogeCksXFxuICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChpdCkgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcInVpX25hdmlcXFwiLCBpdCk7XFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICB9LCB4KSxcXG4gICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG4gICAgfSlcXG4gIH0pXFxuXFxuICBpZiAodWlfbmF2aSA9PSBcXFwi5LiA57qnXFxcIikge1xcbiAgICB2YXIgdWlvYmogPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwidWlvYmpcXFwiLCBbXSk7XFxuICAgIHZhciBzdWlvYmogPSB1aW9iai5zbGljZSgpO1xcbiAgICBsZXQgaXRlbXMgPSB1aW9iai5tYXAoaXRlbSA9PiB7XFxuICAgICAgcmV0dXJuIHtcXG4gICAgICAgIGtleTogaXRlbS5rZXksXFxuICAgICAgICBpbmRleDogaXRlbS5pbmRleFxcbiAgICAgIH1cXG4gICAgfSk7XFxuICAgIGxldCB1aW1vZGUgPSBnZXRNeVZhcihcXFwidWltb2RlXFxcIiwgXFxcIjBcXFwiKSA9PSBcXFwiMFxcXCIgPyBmYWxzZSA6IHRydWU7XFxuXFxuICAgICQuZXh0ZW5kKHtcXG4gICAgICBzd2FwQXJyYXlFbGVtZW50cyhhcnJheSwgaW5kZXgxLCBpbmRleDIpIHtcXG4gICAgICAgIGxldCByZXN1bHQgPSBhcnJheS5zbGljZSgpO1xcbiAgICAgICAgaW5kZXgxID0gYXJyYXkuZmluZEluZGV4KHggPT4geC5pbmRleCA9PSBpbmRleDEpO1xcbiAgICAgICAgaW5kZXgyID0gYXJyYXkuZmluZEluZGV4KHggPT4geC5pbmRleCA9PSBpbmRleDIpO1xcbiAgICAgICAgLy8g5L2/55So5Li05pe25Y+Y6YeP5Lqk5o2i5Lik5Liq5YWD57SgXFxuICAgICAgICBjb25zdCB0ZW1wID0gcmVzdWx0W2luZGV4MV07XFxuICAgICAgICByZXN1bHRbaW5kZXgxXSA9IHJlc3VsdFtpbmRleDJdO1xcbiAgICAgICAgcmVzdWx0W2luZGV4Ml0gPSB0ZW1wO1xcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgICB9LFxcbiAgICAgIHVpQ29uZmlnOiB7XFxuICAgICAgICBpdGVtczogaXRlbXMsXFxuICAgICAgICB1YzogdWlfY29uZmlnLFxcbiAgICAgICAgZGVmOiBkZWYsXFxuICAgICAgICBkZWVwT2JqZWN0UHJvcGVydHkob2JqLCBwYXRoLCB2YWx1ZSkge1xcbiAgICAgICAgICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XFxuICAgICAgICAgIHZhciBjdXJyZW50ID0gb2JqO1xcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xcbiAgICAgICAgICAgIHZhciBwYXJ0ID0gcGFydHNbaV07XFxuICAgICAgICAgICAgaWYgKCFjdXJyZW50W3BhcnRdKSB7XFxuICAgICAgICAgICAgICBjdXJyZW50W3BhcnRdID0ge307XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRdO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGN1cnJlbnRbcGFydHNbcGFydHMubGVuZ3RoIC0gMV1dID0gdmFsdWU7XFxuICAgICAgICB9LFxcbiAgICAgICAgZ2V0KCkge1xcbiAgICAgICAgICBsZXQgdWMgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJ1aV9jb25maWdcXFwiLCB0aGlzLnVjKTtcXG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHVjKS5sZW5ndGggPT0gMCkge1xcbiAgICAgICAgICAgIHVjID0gdGhpcy5kZWY7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgcmV0dXJuIHVjO1xcbiAgICAgICAgfSxcXG4gICAgICAgIHNldCh2YWx1ZSwga2V5KSB7XFxuICAgICAgICAgIGxldCB1YyA9IHRoaXMuZ2V0KCk7XFxuICAgICAgICAgIGlmIChrZXkpIHtcXG4gICAgICAgICAgICB0aGlzLmRlZXBPYmplY3RQcm9wZXJ0eSh1Yywga2V5LCB2YWx1ZSk7XFxuICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdWMgPSB2YWx1ZTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJ1aV9jb25maWdcXFwiLCB1Yyk7XFxuICAgICAgICB9LFxcbiAgICAgICAgZ2V0SW5kZXhzKCkge1xcbiAgICAgICAgICBsZXQgdWMgPSB0aGlzLmdldCgpO1xcbiAgICAgICAgICBpZiAodWMueWkudWkubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgIHJldHVybiB1Yy55aS51aTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtcztcXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgfSlcXG5cXG4gICAgbGV0IGluZGV4cyA9ICQudWlDb25maWcuZ2V0SW5kZXhzKCk7XFxuXFxuICAgIHVpb2JqID0gdWlvYmoubWFwKGl0ZW0gPT4ge1xcbiAgICAgIGlmICghLyhpY29uXzFfc2VhcmNofGF2YXRhcnxpbnB1dCkvLnRlc3QoaXRlbS5jb2xfdHlwZSkpIHtcXG4gICAgICAgIGl0ZW0uY29sX3R5cGUgPSB1aV9jb25maWcueWkuY29sO1xcbiAgICAgIH1cXG4gICAgICByZXR1cm4gaXRlbTtcXG4gICAgfSlcXG5cXG4gICAgdWlvYmogPSByZW9yZGVyQXJyYXlCeU9yZGVyKHVpb2JqLCBpbmRleHMpO1xcblxcbiAgICBpZiAodWltb2RlKSB7XFxuICAgICAgdWlvYmogPSB1aW9iai5tYXAoKGl0ZW0sIGkpID0+IHtcXG4gICAgICAgIGxldCBsb25nY2xpY2tzID0gW107XFxuICAgICAgICBpdGVtLnRpdGxlID0gaXRlbS5rZXk7XFxuICAgICAgICBpZiAoaXRlbS5jb2xfdHlwZSA9PSBcXFwiaW5wdXRcXFwiKSB7XFxuICAgICAgICAgIGl0ZW0uY29sX3R5cGUgPSBcXFwiaWNvbl8xX3NlYXJjaFxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBpdGVtLnVybCA9ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGkpID0+IHtcXG4gICAgICAgICAgbGV0IGluZGV4cyA9ICQudWlDb25maWcuZ2V0SW5kZXhzKCk7XFxuXFxuICAgICAgICAgIGxldCBpdGVtID0gZmluZEl0ZW0oTVlfUlVMRS50aXRsZSArIFxcXCJfdWlcXFwiICsgaSk7XFxuICAgICAgICAgIGlmIChpdGVtLnRpdGxlLmluY2x1ZGVzKFxcXCJmb250XFxcIikgfHwgaXRlbS50aXRsZS5pbmNsdWRlcyhcXFwi4p6h77iPXFxcIikpIHtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKGl0ZW0uZXh0cmEuaWQsIHtcXG4gICAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlLnJlcGxhY2UoL+KAmHzigJl84oCcfOKAnXw8W14+XSs+L2csIFxcXCJcXFwiKS5yZXBsYWNlKFxcXCLinqHvuI9cXFwiLCBcXFwiXFxcIilcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXCJ1aV9jdXJyZW50XFxcIik7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBsZXQgY3VycmVudCA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJ1aV9jdXJyZW50XFxcIiwge30pO1xcblxcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoY3VycmVudCkubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oaXRlbS5leHRyYS5pZCwge1xcbiAgICAgICAgICAgICAgdGl0bGU6IGN1cnJlbnQudGl0bGUsXFxuICAgICAgICAgICAgICBwaWM6IGN1cnJlbnQucGljIHx8IFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgZGVzYzogY3VycmVudC5kZXNjIHx8IFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgY29sX3R5cGU6IGN1cnJlbnQudHlwZSxcXG4gICAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHt9LCBpdGVtLmV4dHJhLCB7XFxuICAgICAgICAgICAgICAgIGtleTogY3VycmVudC5leHRyYS5rZXksXFxuICAgICAgICAgICAgICAgIGluZGV4OiBjdXJyZW50LmV4dHJhLmluZGV4XFxuICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oY3VycmVudC5leHRyYS5pZCwge1xcbiAgICAgICAgICAgICAgdGl0bGU6IGl0ZW0udGl0bGUsXFxuICAgICAgICAgICAgICBwaWM6IGl0ZW0ucGljIHx8IFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgZGVzYzogaXRlbS5kZXNjIHx8IFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgY29sX3R5cGU6IGl0ZW0udHlwZSxcXG4gICAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHt9LCBjdXJyZW50LmV4dHJhLCB7XFxuICAgICAgICAgICAgICAgIGtleTogaXRlbS5leHRyYS5rZXksXFxuICAgICAgICAgICAgICAgIGluZGV4OiBpdGVtLmV4dHJhLmluZGV4XFxuICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgICAgIGxldCBuYXJyID0gJC5zd2FwQXJyYXlFbGVtZW50cyhpbmRleHMsIGN1cnJlbnQuZXh0cmEuaW5kZXgsIGl0ZW0uZXh0cmEuaW5kZXgpO1xcblxcbiAgICAgICAgICAgICQudWlDb25maWcuc2V0KG5hcnIsIFxcXCJ5aS51aVxcXCIpO1xcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcInVpX2N1cnJlbnRcXFwiKTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsZXQgaCA9ICfigJzigJzigJ3igJ0nO1xcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IGl0ZW0udGl0bGU7XFxuICAgICAgICAgICAgdG9hc3QoXFxcIumAieaLqeenu+WKqOeahOebruagh1xcXCIpO1xcbiAgICAgICAgICAgIGlmICgvdGV4dF9pY29ufGF2YXRhcnxpY29uX3NtYWxsXzMvLnRlc3QoaXRlbS50eXBlKSkge1xcbiAgICAgICAgICAgICAgaCA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5mb250Y29sb3IoXFxcIiNmZmZcXFwiKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9pY29uXzFfc2VhcmNoLy50ZXN0KGl0ZW0udHlwZSkpIHtcXG4gICAgICAgICAgICAgIGggPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICAgIHRpdGxlID0gXFxcIuKeoe+4j1xcXCIgKyB0aXRsZTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5mb250Y29sb3IoXFxcIiNmZmZcXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdXBkYXRlSXRlbShpdGVtLmV4dHJhLmlkLCB7XFxuICAgICAgICAgICAgICB0aXRsZTogaCArIHRpdGxlLFxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcInVpX2N1cnJlbnRcXFwiLCBpdGVtKTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgaSlcXG4gICAgICAgIGl0ZW1bXFxcImV4dHJhXFxcIl0gPSB7XFxuICAgICAgICAgIGtleTogaXRlbS5rZXksXFxuICAgICAgICAgIGNsczogTVlfUlVMRS50aXRsZSArIFxcXCJfdWlcXFwiLFxcbiAgICAgICAgICBpZDogTVlfUlVMRS50aXRsZSArIFxcXCJfdWlcXFwiICsgaSxcXG4gICAgICAgICAgaW5kZXg6IGl0ZW0uaW5kZXgsXFxuICAgICAgICB9XFxuICAgICAgICBpZiAoaXRlbS5rZXkgIT0gXFxcIuiuvue9rlxcXCIpIHtcXG4gICAgICAgICAgbG9uZ2NsaWNrcy5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuWIoOmZpFxcXCIsXFxuICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgbGV0IGl0ZW1zID0gJC51aUNvbmZpZy5nZXRJbmRleHMoKTtcXG4gICAgICAgICAgICAgIGxldCBpID0gaXRlbXMuZmluZEluZGV4KHggPT4geC5rZXkgPT0ga2V5KTtcXG4gICAgICAgICAgICAgIGlmIChpICE9IC0xKSB7XFxuICAgICAgICAgICAgICAgIGl0ZW1zW2ldW1xcXCJpbmRleFxcXCJdID0gLTE7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAkLnVpQ29uZmlnLnNldChpdGVtcywgXFxcInlpLnVpXFxcIik7XFxuICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIH0sIGl0ZW0ua2V5KVxcbiAgICAgICAgICB9KVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKCEvaWNvbl8xX3NlYXJjaHxhdmF0YXIvLnRlc3QoaXRlbS5jb2xfdHlwZSkpIHtcXG4gICAgICAgICAgbG9uZ2NsaWNrcy5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuabtOaNouWbvuagh1xcXCIsXFxuICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIlxcXCIpLmlucHV0KChrZXkpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW1zID0gJC51aUNvbmZpZy5nZXRJbmRleHMoKTtcXG4gICAgICAgICAgICAgICAgbGV0IGkgPSBpdGVtcy5maW5kSW5kZXgoeCA9PiB4LmtleSA9PSBrZXkpO1xcbiAgICAgICAgICAgICAgICBpZiAoaSAhPSAtMSkge1xcbiAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldW1xcXCJpbWdcXFwiXSA9IGlucHV0O1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICQudWlDb25maWcuc2V0KGl0ZW1zLCBcXFwieWkudWlcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IGlkID0gZmluZEl0ZW1zQnlDbHMoTVlfUlVMRS50aXRsZSArIFxcXCJfdWlcXFwiKS5maWx0ZXIoeCA9PiB4LmV4dHJhLmtleSA9PSBrZXkpWzBdLmV4dHJhLmlkO1xcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKGlkLCB7IHBpYzogaW5wdXQgfSlcXG4gICAgICAgICAgICAgIH0sIGtleSlcXG4gICAgICAgICAgICB9LCBpdGVtLmtleSlcXG4gICAgICAgICAgfSlcXG4gICAgICAgICAgaWYgKGl0ZW0ua2V5ICE9IFxcXCLmjaLmupBcXFwiICYmIGl0ZW0ua2V5ICE9IFxcXCLmkJzntKLmqKHlvI9cXFwiKSB7XFxuICAgICAgICAgICAgbG9uZ2NsaWNrcy5wdXNoKHtcXG4gICAgICAgICAgICAgIHRpdGxlOiBcXFwi5L+u5pS55ZCN56ewXFxcIixcXG4gICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChrZXkpID0+IHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIlxcXCIpLmlucHV0KChrZXkpID0+IHtcXG4gICAgICAgICAgICAgICAgICBsZXQgaXRlbXMgPSAkLnVpQ29uZmlnLmdldEluZGV4cygpO1xcbiAgICAgICAgICAgICAgICAgIGxldCBpID0gaXRlbXMuZmluZEluZGV4KHggPT4geC5rZXkgPT0ga2V5KTtcXG4gICAgICAgICAgICAgICAgICBpZiAoaSAhPSAtMSkge1xcbiAgICAgICAgICAgICAgICAgICAgaXRlbXNbaV1bXFxcInRpdGxlXFxcIl0gPSBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgJC51aUNvbmZpZy5zZXQoaXRlbXMsIFxcXCJ5aS51aVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgIGxldCBpZCA9IGZpbmRJdGVtc0J5Q2xzKE1ZX1JVTEUudGl0bGUgKyBcXFwiX3VpXFxcIikuZmlsdGVyKHggPT4geC5leHRyYS5rZXkgPT0ga2V5KVswXS5leHRyYS5pZDtcXG4gICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKGlkLCB7IHRpdGxlOiBpbnB1dCB9KVxcbiAgICAgICAgICAgICAgICB9LCBrZXkpXFxuICAgICAgICAgICAgICB9LCBpdGVtLmtleSlcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBpdGVtLmV4dHJhLkxvbmdDbGljayA9IGxvbmdjbGlja3M7XFxuICAgICAgICByZXR1cm4gaXRlbTtcXG4gICAgICB9KVxcbiAgICB9IGVsc2Uge1xcbiAgICAgIHVpb2JqID0gdWlvYmoubWFwKChpdGVtLCBpKSA9PiB7XFxuICAgICAgICBpdGVtLmV4dHJhID0ge1xcbiAgICAgICAgICBpZDogTVlfUlVMRS50aXRsZSArIFxcXCJfdWlcXFwiICsgaSxcXG4gICAgICAgICAgY2xzOiBNWV9SVUxFLnRpdGxlICsgXFxcIl91aVxcXCJcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBpdGVtO1xcbiAgICAgIH0pXFxuICAgIH1cXG4gICAgZCA9IGQuY29uY2F0KHVpb2JqKTtcXG5cXG4gICAgaWYgKGluZGV4cy5zb21lKHggPT4geC5pbmRleCA9PSAtMSkgJiYgdWltb2RlKSB7XFxuICAgICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5bey56e76ZmkXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgfVxcbiAgICAgIH0pXFxuICAgICAgaW5kZXhzLmZpbHRlcih4ID0+IHguaW5kZXggPT0gLTEpLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXG4gICAgICAgIGxldCBtYXAgPSBuZXcgTWFwKHN1aW9iai5tYXAob2JqID0+IFtvYmoua2V5LCBvYmpdKSk7XFxuICAgICAgICBsZXQgb2JqID0gbWFwLmdldChpdGVtLmtleSk7XFxuICAgICAgICBvYmoudXJsID0gJChcXFwiXFxcIikubGF6eVJ1bGUoKGtleSwgaW5kZXgpID0+IHtcXG4gICAgICAgICAgbGV0IGl0ZW1zID0gJC51aUNvbmZpZy5nZXRJbmRleHMoKTtcXG4gICAgICAgICAgbGV0IGkgPSBpdGVtcy5maW5kSW5kZXgoeCA9PiB4LmtleSA9PSBrZXkpO1xcbiAgICAgICAgICBpZiAoaSAhPSAtMSkge1xcbiAgICAgICAgICAgIGl0ZW1zW2ldW1xcXCJpbmRleFxcXCJdID0gaW5kZXg7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgJC51aUNvbmZpZy5zZXQoaXRlbXMsXFxcInlpLnVpXFxcIik7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBpdGVtLmtleSwgb2JqLmluZGV4KVxcbiAgICAgICAgb2JqLnRpdGxlID0gb2JqLmtleTtcXG4gICAgICAgIGlmIChvYmouZXh0cmEgPT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgIG9iai5leHRyYSA9IHt9O1xcbiAgICAgICAgfVxcbiAgICAgICAgb2JqLmV4dHJhLmlkID0gTVlfUlVMRS50aXRsZSArIFxcXCJfdWlcXFwiICsgb2JqLmtleTtcXG4gICAgICAgIG9iai5leHRyYS5jbHMgPSBNWV9SVUxFLnRpdGxlICsgXFxcIl91aVxcXCI7XFxuXFxuICAgICAgICBpZiAob2JqLmNvbF90eXBlID09IFxcXCJpbnB1dFxcXCIpIHtcXG4gICAgICAgICAgb2JqLmNvbF90eXBlID0gXFxcImljb25fMV9zZWFyY2hcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgZC5wdXNoKG9iailcXG4gICAgICB9KVxcbiAgICB9XFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbiAgICB9LCB7XFxuICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgKHVpbW9kZSA/IFxcXCLkv67mlLlcXFwiLmZvbnRjb2xvcihcXFwicmVkXFxcIikgOiBcXFwi5L+u5pS5XFxcIiksXFxuICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIGxldCB1aW1vZGUgPSBnZXRNeVZhcihcXFwidWltb2RlXFxcIiwgXFxcIjBcXFwiKTtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJ1aW1vZGVcXFwiLCB1aW1vZGUgPT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS5XFxcIiArICh1aW1vZGUgPT0gXFxcIjBcXFwiID8gXFxcIuW8gOWQrzrngrnlh7vmjInpkq7kuqTmjaLkvY3nva4s6ZW/5oyJ5oyJ6ZKu5L+u5pS55oiW6ICF5Yig6ZmkXFxcIiA6IFxcXCLlhbPpl61cXFwiKTtcXG4gICAgICB9KSxcXG4gICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxuICAgIH0sIHtcXG4gICAgICB0aXRsZTogXFxcIui/mOWOn1xcXCIsXFxuICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbiAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgodWlfY29uZmlnLCBkZWYpID0+IHtcXG4gICAgICAgIHJldHVybiAkKFxcXCLmmK/lkKbmgaLlpI3orr7nva5cXFwiKS5jb25maXJtKCh1aV9jb25maWcsIGRlZikgPT4ge1xcbiAgICAgICAgICB1aV9jb25maWcueWkgPSBkZWYueWk7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcInVpX2NvbmZpZ1xcXCIsIHVpX2NvbmZpZyk7XFxuICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/ov5jljp/lrozmiJBcXFwiO1xcbiAgICAgICAgfSwgdWlfY29uZmlnLCBkZWYpXFxuICAgICAgfSwgdWlfY29uZmlnLCBkZWYpLFxcbiAgICB9LCB7XFxuICAgICAgdGl0bGU6IFxcXCLnoa7orqRcXFwiLFxcbiAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIixcXG4gICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgYmFjayh0cnVlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICB9KSxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgTG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICB0aXRsZTogXFxcIuWkjeWItlxcXCIsXFxuICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCh1aV9jb25maWcpID0+IHtcXG4gICAgICAgICAgICBjb3B5KEpTT04uc3RyaW5naWZ5KHVpX2NvbmZpZy55aSkpO1xcbiAgICAgICAgICB9LCB1aV9jb25maWcpLFxcbiAgICAgICAgfSwge1xcbiAgICAgICAgICB0aXRsZTogXFxcIuWvvOWFpVxcXCIsXFxuICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCh1aV9jb25maWcpID0+IHtcXG4gICAgICAgICAgICB2YXIgdWMgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJ1aV9jb25maWdcXFwiLCB1aV9jb25maWcpO1xcbiAgICAgICAgICAgIHJldHVybiAkKFxcXCJ7e2NsaXBib2FyZH19XFxcIikuaW5wdXQoKHVjKSA9PiB7XFxuICAgICAgICAgICAgICB2YXIgeWkgPSB7fTtcXG4gICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIHlpID0gSlNPTi5wYXJzZShpbnB1dCk7XFxuICAgICAgICAgICAgICAgIGlmICh5aS5oYXNPd25Qcm9wZXJ0eShcXFwidWlcXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgIHVjLnlpID0geWk7XFxuICAgICAgICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwidWlfY29uZmlnXFxcIiwgdWMpO1xcbiAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgdG9hc3QoXFxcIuagvOW8j+mUmeivr1xcXCIpXFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSwgdWMpXFxuICAgICAgICAgIH0sIHVpX2NvbmZpZylcXG4gICAgICAgIH1dXFxuICAgICAgfVxcbiAgICB9KVxcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiBcXFwi5aS06YOo57uE5Lu25qC35byPOlxcXCIgKyB1aV9jb25maWcueWkuY29sLFxcbiAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHVpX2NvbmZpZykgPT4ge1xcbiAgICAgICAgdWlfY29uZmlnID0gc3RvcmFnZTAuZ2V0SXRlbShcXFwidWlfY29uZmlnXFxcIiwgdWlfY29uZmlnKTtcXG4gICAgICAgIGxldCBhbGxfY29scyA9IFsnJ10uY29uY2F0KGdldENvbFR5cGVzKCkpO1xcbiAgICAgICAgYWxsX2NvbHMgPSBhbGxfY29scy5maWx0ZXIoeCA9PlxcbiAgICAgICAgICAvKGljb24pLy50ZXN0KHgpICYmIHggIT0gJ3RleHRfaWNvbicgJiZcXG4gICAgICAgICAgeCAhPSBcXFwiaWNvbl8xX3NlYXJjaFxcXCIpO1xcbiAgICAgICAgLy9sb2coYWxsX2NvbHMpXFxuICAgICAgICBsZXQgY29sID0gdWlfY29uZmlnLnlpLmNvbDtcXG4gICAgICAgIGxldCDmjInpkq7moLflvI8gPSBhbGxfY29scy5tYXAoKGl0KSA9PiB7XFxuICAgICAgICAgIHJldHVybiBpdCA9PT0gY29sID8gJ+Keoe+4jycgKyBpdCA6IGl0O1xcbiAgICAgICAgfSk7XFxuICAgICAgICBsZXQgdGlwcyA9ICfor7fpgInmi6nlpLTpg6jmjInpkq7moLflvI8nO1xcbiAgICAgICAgcmV0dXJuICQo5oyJ6ZKu5qC35byPLCAyLCB0aXBzKS5zZWxlY3QoKHVpX2NvbmZpZykgPT4ge1xcbiAgICAgICAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoXFxcIuKeoe+4j1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgbGV0IG9ianMgPSAoZmluZEl0ZW1zQnlDbHMoTVlfUlVMRS50aXRsZSArIFxcXCJfdWlcXFwiKSB8fCBbXSkuZmlsdGVyKHggPT4gIS8oaWNvbl8xX3NlYXJjaHxhdmF0YXJ8aW5wdXQpLy50ZXN0KHgudHlwZSkpO1xcbiAgICAgICAgICBvYmpzLmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh4LmV4dHJhLmlkLCB7XFxuICAgICAgICAgICAgICBjb2xfdHlwZTogaW5wdXQsXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgIH0pO1xcbiAgICAgICAgICB1aV9jb25maWcueWkuY29sID0gaW5wdXQ7XFxuICAgICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcInVpX2NvbmZpZ1xcXCIsIHVpX2NvbmZpZyk7XFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oTVlfUlVMRS50aXRsZSArIFxcXCJfeWljb2xcXFwiLCB7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLlpLTpg6jnu4Tku7bmoLflvI86XFxcIiArIHVpX2NvbmZpZy55aS5jb2xcXG4gICAgICAgICAgfSlcXG4gICAgICAgIH0sIHVpX2NvbmZpZylcXG4gICAgICB9LCB1aV9jb25maWcpLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBpZDogTVlfUlVMRS50aXRsZSArIFxcXCJfeWljb2xcXFwiXFxuICAgICAgfVxcbiAgICB9KVxcbiAgfVxcblxcbiAgaWYgKHVpX25hdmkgPT0gXFxcIuS6jOe6p1xcXCIpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogXFxcIuavj+mhteaVsOmHj1xcXCIsXFxuICAgICAgZGVzYzogXFxcIjDliJnooajnpLrkuI3liIbpobVcXFwiLFxcbiAgICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICAgIHVybDogJC50b1N0cmluZygodWlfY29uZmlnKSA9PiB7XFxuICAgICAgICBpZiAoU3RyaW5nKGlucHV0KS5sZW5ndGggPiAzKSB7XFxuICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/or7fovpPlhaUz5L2N5pWw5a2X5Lul5YaFXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChTdHJpbmcoaW5wdXQpLmxlbmd0aCA8IDIgJiYgaW5wdXQgIT0gMCkge1xcbiAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K+36L6T5YWlMuS9jeaVsOWtl+S7peS4ilxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICB1aV9jb25maWcuZXIu5YiG6aG1ID0gaW5wdXQ7XFxuICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJ1aV9jb25maWdcXFwiLCB1aV9jb25maWcpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgKGlucHV0ID4gMCA/IFxcXCLmr4/pobXmlbDph4/orr7nva7kuLo6XFxcIiArIGlucHV0IDogXFxcIuS4jeWIhumhtVxcXCIpO1xcbiAgICAgIH0sIHVpX2NvbmZpZyksXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCh1aV9jb25maWcpID0+IHtcXG4gICAgICAgICAgaWYgKFN0cmluZyhpbnB1dCkubGVuZ3RoID4gMykge1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLor7fovpPlhaUz5L2N5pWw5a2X5Lul5YaFXFxcIik7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICB9XFxuICAgICAgICAgIGlmIChTdHJpbmcoaW5wdXQpLmxlbmd0aCA8IDIgJiYgaW5wdXQgIT0gMCkge1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLor7fovpPlhaUy5L2N5pWw5a2X5Lul5LiKXFxcIik7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICB9XFxuICAgICAgICAgIHVpX2NvbmZpZy5lci7liIbpobUgPSBpbnB1dDtcXG4gICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwidWlfY29uZmlnXFxcIiwgdWlfY29uZmlnKTtcXG4gICAgICAgIH0sIHVpX2NvbmZpZyksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IHVpX2NvbmZpZy5lci7liIbpobUsXFxuICAgICAgICB0eXBlOiBcXFwibnVtYmVyXFxcIixcXG4gICAgICB9XFxuICAgIH0pXFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6IFxcXCLljoblj7LorrDlvZVcXFwiLFxcbiAgICAgIGRlc2M6IFxcXCLpu5jorqQyMDBcXFwiLFxcbiAgICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICAgIHVybDogJC50b1N0cmluZygodWlfY29uZmlnKSA9PiB7XFxuICAgICAgICBpZiAoU3RyaW5nKGlucHV0KS5sZW5ndGggPiAzKSB7XFxuICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/or7fovpPlhaUz5L2N5pWw5a2X5Lul5YaFXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChTdHJpbmcoaW5wdXQpLmxlbmd0aCA8IDIpIHtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+i+k+WFpTLkvY3mlbDlrZfku6XkuIpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgdWlfY29uZmlnLmVyLuWOhuWPsuiusOW9lSA9IGlucHV0O1xcbiAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwidWlfY29uZmlnXFxcIiwgdWlfY29uZmlnKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Y6G5Y+y6K6w5b2V6K6+572u5Li6OlxcXCIgKyBpbnB1dDtcXG4gICAgICB9LCB1aV9jb25maWcpLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IHVpX2NvbmZpZy5lci7ljoblj7LorrDlvZUsXFxuICAgICAgICB0eXBlOiBcXFwibnVtYmVyXFxcIixcXG4gICAgICB9XFxuICAgIH0pXFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6IFxcXCLov5jljp9cXFwiLFxcbiAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG4gICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHVpX2NvbmZpZywgZGVmKSA9PiB7XFxuICAgICAgICByZXR1cm4gJChcXFwi5piv5ZCm5oGi5aSN6K6+572uXFxcIikuY29uZmlybSgodWlfY29uZmlnLCBkZWYpID0+IHtcXG4gICAgICAgICAgdWlfY29uZmlnLmVyID0gZGVmLmVyO1xcbiAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJ1aV9jb25maWdcXFwiLCB1aV9jb25maWcpO1xcbiAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6L+Y5Y6f5a6M5oiQXFxcIjtcXG4gICAgICAgIH0sIHVpX2NvbmZpZywgZGVmKVxcbiAgICAgIH0sIHVpX2NvbmZpZywgZGVmKSxcXG4gICAgfSwge1xcbiAgICAgIHRpdGxlOiBcXFwi56Gu6K6kXFxcIixcXG4gICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcInBsYXlsaXN0X3JlYWR5XFxcIik7XFxuICAgICAgICBiYWNrKHRydWUpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgIH0pXFxuICAgIH0pXFxuICB9XFxuICBzZXRSZXN1bHQoZCk7XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiTG9jYWxQcm94eVwiLFwicGF0aFwiOlwiTG9jYWxQcm94eVwiLFwicnVsZVwiOlwiZnVuY3Rpb24gcHJveHkoKSB7XFxuICAgIGZ1bmN0aW9uIHBhcnNlVmlkZW8oTVlfUEFSQU1TLCB0aXRsZSkge1xcbiAgICAgICAgZnVuY3Rpb24gdG9QYXRoKHZhbHVlKSB7XFxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgcGF0aCA9IFtdO1xcbiAgICAgICAgICAgIGxldCBjdXJyZW50ID0gJyc7XFxuICAgICAgICAgICAgbGV0IGluQnJhY2tldHMgPSBmYWxzZTtcXG4gICAgICAgICAgICBsZXQgZXNjYXBlID0gZmFsc2U7XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgY2hhciA9IHZhbHVlW2ldO1xcbiAgICAgICAgICAgICAgICBpZiAoZXNjYXBlKSB7XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50ICs9IGNoYXI7XFxuICAgICAgICAgICAgICAgICAgICBlc2NhcGUgPSBmYWxzZTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnXFxcXFxcXFwnKSB7XFxuICAgICAgICAgICAgICAgICAgICBlc2NhcGUgPSB0cnVlO1xcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICcuJyAmJiAhaW5CcmFja2V0cykge1xcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5wdXNoKGN1cnJlbnQpO1xcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9ICcnO1xcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICdbJykge1xcbiAgICAgICAgICAgICAgICAgICAgaW5CcmFja2V0cyA9IHRydWU7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ10nKSB7XFxuICAgICAgICAgICAgICAgICAgICBpbkJyYWNrZXRzID0gZmFsc2U7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50ICs9IGNoYXI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcXG4gICAgICAgICAgICAgICAgcGF0aC5wdXNoKGN1cnJlbnQpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGZ1bmN0aW9uIGdldEpzb24ob2JqLCBwYXRoKSB7XFxuICAgICAgICAgICAgaWYgKCFvYmogfHwgIUFycmF5LmlzQXJyYXkocGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBvYmo7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBjdXJyZW50ID0gb2JqO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gcGF0aFtpXTtcXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjdXJyZW50ICE9PSAnb2JqZWN0Jykge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IHJ1blR5cGUgPSBNWV9QQVJBTVMucnVuVHlwZVswXTtcXG4gICAgICAgICAgICBsZXQgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGJhc2U2NERlY29kZShNWV9QQVJBTVMudXJsWzBdKSk7XFxuICAgICAgICAgICAgaWYgKHJ1blR5cGUgPT0gXFxcIkpTT05cXFwiKSB7XFxuXFxuICAgICAgICAgICAgICAgIGxldCBwYXJhbSA9IEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KGJhc2U2NERlY29kZShNWV9QQVJBTVMucGFyYW1bMF0pKSk7XFxuICAgICAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShyZXF1ZXN0KHVybCwge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcGFyYW0uaGVhZGVycyB8fCB7fSxcXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogcGFyYW0ubWV0aG9kIHx8IHZvaWQgMFxcbiAgICAgICAgICAgICAgICB9KSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAzMDIsXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBPYmplY3QuYXNzaWduKHt9LCBwYXJhbS5oZWFkZXJzIHx8IHt9LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIkxvY2F0aW9uXFxcIjogZ2V0SnNvbihqc29uLCB0b1BhdGgocGFyYW0uanNvblBhdGgpKSxcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocnVuVHlwZSA9PSBcXFwiSlNcXFwiKSB7XFxuXFxuICAgICAgICAgICAgICAgIGxldCBwYXJzZTtcXG4gICAgICAgICAgICAgICAgaWYgKE1ZX1BBUkFNUy5pbmRleCkge1xcbiAgICAgICAgICAgICAgICAgICAgcGFyc2UgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3M/cnVsZT1cXFwiICsgdGl0bGUpLmdldEpzb24oKVtNWV9QQVJBTVMuaW5kZXhbMF1dO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgcGFyc2UgPSBKU09OLnBhcnNlKGJhc2U2NERlY29kZShkZWNvZGVVUklDb21wb25lbnQoTVlfUEFSQU1TLnBhcmFtWzBdKSkpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGxldCByZXMgPSBuZXcgRnVuY3Rpb24oXFxcInVybFxcXCIsIFxcXCJzZWxmXFxcIiwgcGFyc2UuanMpKHVybCwgcGFyc2UpO1xcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlcyA9PT0gXFxcInN0cmluZ1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogMzAyLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcIkxvY2F0aW9uXFxcIjogcmVzXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJC50eXBlKHJlcykgPT09IFxcXCJvYmplY3RcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDMwMixcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXNcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuXFxuICAgIGZ1bmN0aW9uIGRvSnMoTVlfUEFSQU1TLCB0aXRsZSwgZ2tleSkge1xcbiAgICAgICAgbGV0IHtcXG4gICAgICAgICAgICBHTVxcbiAgICAgICAgfSA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NjkxNiZhdXRoPTFkMzVlOGYwLTIyZTgtNTI3MC1hOWQxLTgyNmY1M2YxNzdhZFxcXCIpO1xcbiAgICAgICAgR00uc2V0U2VsZktleShna2V5KTtcXG4gICAgICAgIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIiwgXFxcIkRycHlNYW5hZ2U/cnVsZT1cXFwiICsgdGl0bGUpO1xcbiAgICAgICAgbGV0IGRycHkgPSBEcnB5TWFuYWdlLmdldChkZWNvZGVVUklDb21wb25lbnQoTVlfUEFSQU1TLmhpa2VyU2tleVswXSkpO1xcbiAgICAgICAgbGV0IHBhcmFtcyA9IHt9O1xcbiAgICAgICAgZm9yIChsZXQga2V5IGluIE1ZX1BBUkFNUykge1xcbiAgICAgICAgICAgIHBhcmFtc1trZXldID0gU3RyaW5nKE1ZX1BBUkFNU1trZXldWzBdKTtcXG4gICAgICAgIH1cXG4gICAgICAgIFxcbiAgICAgICAgXFxuICAgICAgICAvL2xldCByZXN1bHQgPSBkcnB5LnByb3h5KHBhcmFtcyk7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gRHJweU1hbmFnZS5ydW5Qcm94eShkcnB5LCBbcGFyYW1zXSk7XFxuICAgICAgIFxcbiAgICAgICAgbGV0IFtjb2RlLCBtZWRpYV90eXBlLCBkYXRhLCBoZWFkZXJzLCBpc1JldHVybkJ5dGVzXSA9IHJlc3VsdDtcXG4gICAgICAgIGhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCB7XFxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IG1lZGlhX3R5cGUsXFxuICAgICAgICB9LCBoZWFkZXJzKTtcXG4gICAgICAgIGlmKHR5cGVvZiBkYXRhPT09XFxcInN0cmluZ1xcXCImJmRhdGEuc3RhcnRzV2l0aChcXFwiZGF0YTpcXFwiKSYmZGF0YS5pbmNsdWRlcyhcXFwiYmFzZTY0LFxcXCIpKXtcXG4gICAgICAgICAgICBkYXRhID0gZGF0YS5zcGxpdChcXFwiYmFzZTY0LFxcXCIpWzFdO1xcbiAgICAgICAgICAgIGNvbnN0IENyeXB0b1V0aWwgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vYXNzZXRzL2NyeXB0by1qYXZhLmpzXFxcIik7XFxuICAgICAgICAgICAgZGF0YSA9IENyeXB0b1V0aWwuRGF0YS5wYXJzZUJhc2U2NChkYXRhKS50b0J5dGVzKCk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgIHN0YXR1c0NvZGU6IGNvZGUsXFxuICAgICAgICAgICAgYm9keTogZGF0YSxcXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxcbiAgICAgICAgfTtcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBlbnRyYW5jZShNWV9QQVJBTVMsIHRpdGxlLCBna2V5KSB7XFxuICAgICAgICBpZiAoTVlfUEFSQU1TLmRvICYmIE1ZX1BBUkFNUy5kb1swXSA9PT0gXFxcImpzXFxcIikge1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBkb0pzKE1ZX1BBUkFNUywgdGl0bGUsIGdrZXkpO1xcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVZpZGVvKE1ZX1BBUkFNUywgdGl0bGUpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHRoaXMuZW50cmFuY2UgPSBlbnRyYW5jZTtcXG59XFxuXFxuZnVuY3Rpb24gc3RhcnRQcm94eSh0aXRsZSwgZ2tleSkge1xcbiAgICByZXR1cm4gc3RhcnRQcm94eVNlcnZlcigkLnRvU3RyaW5nKChwcm94eSwgdGl0bGUsIGdrZXkpID0+IHtcXG4gICAgICAgIHJldHVybiBuZXcgcHJveHkoKS5lbnRyYW5jZShNWV9QQVJBTVMsIHRpdGxlLCBna2V5KTtcXG4gICAgfSwgcHJveHksIHRpdGxlLCBna2V5KSk7XFxufVxcbiQuZXhwb3J0cy5zdGFydFByb3h5ID0gc3RhcnRQcm94eTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIkphdmFHWklQXCIsXCJwYXRoXCI6XCJHWklQXCIsXCJydWxlXCI6XCJsZXQgRmlsZVV0aWwgPSBjb20uZXhhbXBsZS5oaWtlcnZpZXcudXRpbHMuRmlsZVV0aWw7XFxubGV0IGphdmFTdHJpbmcgPSBqYXZhLmxhbmcuU3RyaW5nO1xcbmxldCBCYXNlNjQgPSBqYXZhLnV0aWwuQmFzZTY0O1xcbmNvbnN0IEdaSVBPdXRwdXRTdHJlYW0gPSBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07XFxuY29uc3QgR1pJUElucHV0U3RyZWFtID0gamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW07XFxuY29uc3QgRGVmbGF0ZXJPdXRwdXRTdHJlYW0gPSBqYXZhLnV0aWwuemlwLkRlZmxhdGVyT3V0cHV0U3RyZWFtO1xcbmNvbnN0IEluZmxhdGVySW5wdXRTdHJlYW0gPSBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW07XFxuY29uc3QgRGVmbGF0ZXJJbnB1dFN0cmVhbSA9IGphdmEudXRpbC56aXAuRGVmbGF0ZXJJbnB1dFN0cmVhbTtcXG5jb25zdCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gPSBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTtcXG5jb25zdCBCeXRlQXJyYXlJbnB1dFN0cmVhbSA9IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07XFxuY29uc3QgRGVmbGF0ZXIgPSBqYXZhLnV0aWwuemlwLkRlZmxhdGVyO1xcblxcbmZ1bmN0aW9uIHppcCh0ZXh0LCBtb2RlKSB7XFxuICAgIG1vZGUgPSBtb2RlID8gbW9kZSA6IFxcXCJnemlwXFxcIjtcXG4gICAgbGV0IGJhc2VTdHIgPSBuZXcgamF2YVN0cmluZyh0ZXh0KTtcXG4gICAgLy8g5L2/55SoIEJ5dGVBcnJheU91dHB1dFN0cmVhbSDmnaXmjZXojrfljovnvKnlkI7nmoTmlbDmja5cXG4gICAgdmFyIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7XFxuICAgIGlmIChtb2RlID09IFxcXCJkZWZsYXRlXFxcIikge1xcbiAgICAgICAgdmFyIGRlZmxhdGVyID0gbmV3IGphdmEudXRpbC56aXAuRGVmbGF0ZXIoKTtcXG4gICAgICAgIGRlZmxhdGVyLnNldExldmVsKGphdmEudXRpbC56aXAuRGVmbGF0ZXIuQkVTVF9DT01QUkVTU0lPTik7XFxuICAgICAgICB2YXIgZG9zID0gbmV3IGphdmEudXRpbC56aXAuRGVmbGF0ZXJPdXRwdXRTdHJlYW0oYmFvcywgZGVmbGF0ZXIpO1xcbiAgICAgICAgZG9zLndyaXRlKGJhc2VTdHIuZ2V0Qnl0ZXMoXFxcIlVURi04XFxcIikpO1xcbiAgICAgICAgZG9zLmZpbmlzaCgpOyAvLyDlrozmiJDljovnvKlcXG4gICAgICAgIGRvcy5jbG9zZSgpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgdmFyIGd6b3MgPSBuZXcgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtKGJhb3MpO1xcbiAgICAgICAgZ3pvcy53cml0ZShiYXNlU3RyLmdldEJ5dGVzKFxcXCJVVEYtOFxcXCIpKTtcXG4gICAgICAgIGd6b3MuY2xvc2UoKTsgLy8g5YWz6Zet5Y6L57yp5rWBXFxuICAgIH1cXG4gICAgLy8g5bCG5Y6L57yp5ZCO55qE5pWw5o2u6L2s5o2i5Li6IEJhc2U2NCDnvJbnoIHnmoTlrZfnrKbkuLJcXG4gICAgdmFyIGNvbXByZXNzZWREYXRhID0gYmFvcy50b0J5dGVBcnJheSgpO1xcbiAgICB2YXIgYmFzZTY0U3RyaW5nID0gamF2YS51dGlsLkJhc2U2NC5nZXRFbmNvZGVyKCkuZW5jb2RlVG9TdHJpbmcoY29tcHJlc3NlZERhdGEpO1xcblxcbiAgICAvLyDlhbPpl60gQnl0ZUFycmF5T3V0cHV0U3RyZWFtXFxuICAgIGJhb3MuY2xvc2UoKTtcXG4gICAgcmV0dXJuIFN0cmluZyhiYXNlNjRTdHJpbmcpO1xcbn1cXG5cXG5mdW5jdGlvbiB1bnppcCh0ZXh0LCBtb2RlKSB7XFxuICAgIG1vZGUgPSBtb2RlID8gbW9kZSA6IFxcXCJnemlwXFxcIjtcXG4gICAgdmFyIGNvbXByZXNzZWREYXRhID0gQmFzZTY0LmdldERlY29kZXIoKS5kZWNvZGUodGV4dCk7XFxuICAgIHZhciBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbXByZXNzZWREYXRhKTtcXG4gICAgdmFyIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7XFxuICAgIHZhciBidWZmZXIgPSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5uZXdJbnN0YW5jZShqYXZhLmxhbmcuQnl0ZS5UWVBFLCAxMDI0KTtcXG4gICAgaWYgKG1vZGUgPT0gXFxcImd6aXBcXFwiKSB7XFxuICAgICAgICB2YXIgZ2lzID0gbmV3IEdaSVBJbnB1dFN0cmVhbShiYWlzKTtcXG4gICAgICAgIGxldCBsZW47XFxuICAgICAgICB3aGlsZSAoKGxlbiA9IGdpcy5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7XFxuICAgICAgICAgICAgYmFvcy53cml0ZShidWZmZXIsIDAsIGxlbik7XFxuICAgICAgICB9XFxuICAgICAgICBnaXMuY2xvc2UoKTtcXG4gICAgfSBlbHNlIGlmIChtb2RlID09IFxcXCJkZWZsYXRlXFxcIikge1xcbiAgICAgICAgdmFyIGlpcyA9IG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKGJhaXMpO1xcbiAgICAgICAgbGV0IGxlbjtcXG4gICAgICAgIHdoaWxlICgobGVuID0gaWlzLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHtcXG4gICAgICAgICAgICBiYW9zLndyaXRlKGJ1ZmZlciwgMCwgbGVuKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlpcy5jbG9zZSgpO1xcbiAgICB9XFxuICAgIGJhaXMuY2xvc2UoKTtcXG4gICAgYmFvcy5jbG9zZSgpO1xcbiAgICB2YXIgZGVjb21wcmVzc2VkU3RyaW5nID0gbmV3IGphdmFTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCBcXFwiVVRGLThcXFwiKTtcXG4gICAgLy8g5omT5Y2w6Kej5Y6L57yp5ZCO55qE5a2X56ym5LiyXFxuICAgIHJldHVybiBTdHJpbmcoZGVjb21wcmVzc2VkU3RyaW5nKTtcXG59XFxuJC5leHBvcnRzID0ge1xcbiAgICB6aXAsXFxuICAgIHVuemlwXFxufTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuaUr+aMgeS9nOiAhVwiLFwicGF0aFwiOlwiRG9uYXRlLnZcIixcInJ1bGVcIjpcImpzOlxcbmxldCBkID0gW107XFxuc2V0UGFnZVRpdGxlKFxcXCLmjZDotaAv5pSv5oyBXFxcIik7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmjZDotaAv5pSv5oyBXFxcIixcXG4gICAgZGVzYzogXFxcIui/meS4quaNkOi1oOS4jeiDveS4uuS9oOW4puadpeeJueadg++8jOS9huaCqOeahOaUr+aMgeS8muaPkOmrmOaIkeabtOaWsOWIm+S9nOeahOWKqOWKm+OAglxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogXFxcInRvYXN0Oi8v5oSf6LCi5oKo55qE5pSv5oyBXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5Y2B5YiG5oSf6LCizrHlpKfkvaznmoTlj4LkuI7lvIDlj5HvvIzku6Xlj4rpgZPplb/lpKfkvazlr7nmnKznqIvluo/lvIDlj5HkuIrnmoTmjIflr7zjgIJcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB1cmw6IFxcXCJ0b2FzdDovL+aEn+iwouaCqOeahOaUr+aMgVxcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcInBpY18xX2Z1bGxcXFwiLFxcbiAgICB1cmw6IFxcXCJodHRwczovL2dpdGVlLmNvbS9Mb3lEZ0lrL0xveURnSWtfUnVsZS9yYXcvbWFzdGVyLzY3ZDhmMDE4N2YwMTg2YzEucG5nXFxcIixcXG4gICAgcGljX3VybDogXFxcImh0dHBzOi8vZ2l0ZWUuY29tL0xveURnSWsvTG95RGdJa19SdWxlL3Jhdy9tYXN0ZXIvNjdkOGYwMTg3ZjAxODZjMS5wbmdcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIuWbvueJh+WKoOi9vee8k+aFouivt+eojeetiVxcXCIuc21hbGwoKS5mb250Y29sb3IoXFxcIkdyYXlcXFwiKSxcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgfVxcbn0pO1xcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIumAmueUqOaWueazlVwiLFwicGF0aFwiOlwibWV0aG9kc1wiLFwicnVsZVwiOlwianM6XFxuLy8g6Ieq54S25o6S5bqPXFxuZnVuY3Rpb24gbmF0dXJhbFNvcnQoYXJyLCBrZXkpIHtcXG4gIHJldHVybiBhcnIuc29ydCgoYSwgYikgPT4ge1xcbiAgICBsZXQgYXN0ciwgYnN0cjtcXG4gICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PT0gJ29iamVjdCcgJiYga2V5KSB7XFxuICAgICAgYXN0ciA9IGFba2V5XS5yZXBsYWNlKC9b4oCZ4oCYXS9nLCBcXFwiXFxcIik7XFxuICAgICAgYnN0ciA9IGJba2V5XS5yZXBsYWNlKC9b4oCZ4oCYXS9nLCBcXFwiXFxcIik7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgYXN0ciA9IGEudG9TdHJpbmcoKS5yZXBsYWNlKC9b4oCZ4oCYXS9nLCBcXFwiXFxcIik7XFxuICAgICAgYnN0ciA9IGIudG9TdHJpbmcoKS5yZXBsYWNlKC9b4oCZ4oCYXS9nLCBcXFwiXFxcIik7XFxuICAgIH1cXG4gICAgcmV0dXJuIGFzdHIubG9jYWxlQ29tcGFyZShic3RyLCB1bmRlZmluZWQsIHtcXG4gICAgICBudW1lcmljOiB0cnVlLFxcbiAgICAgIHNlbnNpdGl2aXR5OiAnYmFzZSdcXG4gICAgfSk7XFxuICB9KTtcXG59XFxuXFxuLy/kvb/nlKjmjpLluo9cXG5sZXQgdXNpbmdTb3J0ID0ge1xcbiAgbmFtZTogXFxcInVzaW5nU29ydC5qc29uXFxcIixcXG4gIHBhdGg6IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0RycHlIaWtlci9cXFwiLFxcbiAga2V5OiB1bmRlZmluZWQsXFxuICBzYXZlKGNvbnRlbnQpIHtcXG4gICAgc2F2ZUZpbGUodGhpcy5wYXRoICsgdGhpcy5uYW1lLCBjb250ZW50KTtcXG4gIH0sXFxuICBpbml0KCkge1xcbiAgICBsZXQganNvbiA9IHt9O1xcbiAgICBpZiAoIWZpbGVFeGlzdCh0aGlzLnBhdGggKyB0aGlzLm5hbWUpKSB7XFxuICAgICAgdGhpcy5zYXZlKFxcXCJ7fVxcXCIpO1xcbiAgICB9XFxuICAgIHRyeSB7XFxuICAgICAganNvbiA9IEpTT04ucGFyc2UocmVhZEZpbGUodGhpcy5wYXRoICsgdGhpcy5uYW1lKSk7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICBqc29uID0ge307XFxuICAgICAgdGhpcy5zYXZlKFxcXCJ7fVxcXCIpO1xcbiAgICB9XFxuICAgIHJldHVybiBqc29uO1xcbiAgfSxcXG4gIHNvcnQoKSB7XFxuICAgIGxldCBqc29uID0gdGhpcy5pbml0KCk7XFxuICAgIGxldCBzb3J0ZWRFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoanNvbikuc29ydCgoYSwgYikgPT4gYlsxXSAtIGFbMV0pO1xcbiAgICBsZXQgc29ydGVkQXJyYXkgPSBzb3J0ZWRFbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XFxuICAgICAgbGV0IG9iaiA9IHt9O1xcbiAgICAgIG9ialtrZXldID0gdmFsdWU7XFxuICAgICAgcmV0dXJuIG9iajtcXG4gICAgfSk7XFxuICAgIHJldHVybiBzb3J0ZWRBcnJheVxcbiAgfSxcXG4gIHNvcnRLZXlzQnlVc2FnZShqc29uLCBrZXlzLCBuZXN0ZWRLZXkpIHtcXG4gICAgcmV0dXJuIGtleXMuc29ydCgoYSwgYikgPT4ge1xcbiAgICAgIGxldCBrZXlBLCBrZXlCLCB2YWxBLCB2YWxCO1xcblxcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT09ICdvYmplY3QnKSB7XFxuICAgICAgICBrZXlBID0gYVtuZXN0ZWRLZXldO1xcbiAgICAgICAga2V5QiA9IGJbbmVzdGVkS2V5XTtcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAga2V5QSA9IGEudG9TdHJpbmcoKS5yZXBsYWNlKC9b4oCZ4oCYXS9nLCBcXFwiXFxcIik7XFxuICAgICAgICBrZXlCID0gYi50b1N0cmluZygpLnJlcGxhY2UoL1vigJnigJhdL2csIFxcXCJcXFwiKTtcXG4gICAgICB9XFxuXFxuICAgICAgdmFsQSA9IGpzb25ba2V5QV0gfHwgMDtcXG4gICAgICB2YWxCID0ganNvbltrZXlCXSB8fCAwO1xcbiAgICAgIGlmICh2YWxCIC0gdmFsQSAhPT0gMCkge1xcbiAgICAgICAgcmV0dXJuIHZhbEIgLSB2YWxBO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gbmF0dXJhbFNvcnQoW2tleUEsIGtleUJdKVswXSA9PT0ga2V5QSA/IC0xIDogMTtcXG4gICAgICB9XFxuICAgIH0pO1xcbiAgfSxcXG4gIGdldChrZXlzLCBrZXkpIHtcXG4gICAgbGV0IGpzb24gPSB0aGlzLmluaXQoKTtcXG4gICAgLy9sb2codGhpcy5zb3J0KCkpXFxuICAgIGlmIChrZXkgPT0gdW5kZWZpbmVkKSB7XFxuICAgICAga2V5ID0gdGhpcy5rZXk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHRoaXMuc29ydEtleXNCeVVzYWdlKGpzb24sIGtleXMsIGtleSk7XFxuICB9LFxcbiAgc2V0a2V5KGtleSkge1xcbiAgICB0aGlzLmtleSA9IGtleTtcXG4gIH0sXFxuICBzZXQoa2V5KSB7XFxuICAgIGxldCBqc29uID0gdGhpcy5pbml0KCk7XFxuICAgIGlmIChqc29uLmhhc093blByb3BlcnR5KGtleSkpIHtcXG4gICAgICBqc29uW2tleV0gKz0gMTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICBqc29uW2tleV0gPSAxO1xcbiAgICB9XFxuICAgIHRoaXMuc2F2ZShKU09OLnN0cmluZ2lmeShqc29uKSk7XFxuICB9XFxufVxcblxcbiQuZXhwb3J0cyA9IHtcXG4gIG5hdHVyYWxTb3J0LFxcbiAgdXNpbmdTb3J0XFxufVxcblwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5pu05paw5pel5b+XXCIsXCJwYXRoXCI6XCJ1cGRhdGVSZWNvcmRzXCIsXCJydWxlXCI6XCJqczpcXG4kLmV4cG9ydHMgPSBbe1xcbiAgICB0aXRsZTogXFxcIjIwMjQvMDYvMjEgTWF4VmVyc2lvbiAzNFxcXCIsXFxuICAgIHJlY29yZHM6IFtcXG4gICAgICAgIFxcXCLigJjigJhuZXfigJnigJnvvJrlop7liqDlj4LmlbDmmKDlsITooajjgIJcXFwiLFxcbiAgICBdXFxufSwge1xcbiAgICB0aXRsZTogXFxcIjIwMjQvMDYvMjAgTWF4VmVyc2lvbiAzM1xcXCIsXFxuICAgIHJlY29yZHM6IFtcXG4gICAgICAgIFxcXCLigJzigJxmaXjigJ3igJ3vvJrkv67lpI3pg6jliIZidWfjgIJcXFwiLFxcbiAgICBdXFxufSwge1xcbiAgICB0aXRsZTogXFxcIjIwMjQvMDYvMTcgTWF4VmVyc2lvbiAzMlxcXCIsXFxuICAgIHJlY29yZHM6IFtcXG4gICAgICAgIFxcXCLigJjigJhuZXfigJnigJnvvJrlop7liqDmjIl0YWfmkJzntKLjgIJcXFwiLFxcbiAgICAgICAgXFxcIuKAnOKAnGZpeOKAneKAne+8muS/ruWkjemDqOWIhua6kOS7juaQnOe0oui/m+WFpeivpue7humhteaKpemUmeOAglxcXCIsXFxuICAgICAgICBcXFwi4oCc4oCcZml44oCd4oCd77ya5L+u5aSN6YOo5YiG5rqQbGF6eei/lOWbnuepunVybOaXtuaKpemUmeOAglxcXCJcXG4gICAgXVxcbn0sIHtcXG4gICAgdGl0bGU6IFxcXCIyMDI0LzA2LzE2ICBNYXhWZXJzaW9uIDI5XFxcIixcXG4gICAgcmVjb3JkczogW1xcbiAgICAgICAgXFxcIuKAnOKAnGZpeOKAneKAne+8muWNh+e6p2RycHkuanPvvIzkv67lpI1nemlw5Ye95pWw44CCXFxcIlxcbiAgICBdXFxufSwge1xcbiAgICB0aXRsZTogXFxcIjIwMjQvMDYvMTUgIE1heFZlcnNpb24gMjhcXFwiLFxcbiAgICByZWNvcmRzOiBbXFxuICAgICAgICBcXFwi4oCY4oCYbmV34oCZ4oCZ77ya5aKe5YqgdWnnrqHnkIbjgIJcXFwiLFxcbiAgICAgICAgXFxcIuKAmOKAmG5ld+KAmeKAme+8muS4u+mhteWinuWKoOi3s+i/h+W9ouW8jygqKeS6jOe6p+mAiemhueOAglxcXCIsXFxuICAgICAgICBcXFwi4oCY4oCYbmV34oCZ4oCZ77ya6Kej5p6Q566h55CG5aKe5YqgZmxhZ+WIhuexu+OAglxcXCIsXFxuICAgICAgICBcXFwib3B0aW1pemXvvJrkvJjkvJjljJborqLpmIXmm7TmlrDnrZbnlaXjgIJcXFwiLFxcbiAgICBdXFxufSwge1xcbiAgICB0aXRsZTogXFxcIjIwMjQvMDYvMTIgIE1heFZlcnNpb24gMjZcXFwiLFxcbiAgICByZWNvcmRzOiBbXFxuICAgICAgICBcXFwi4oCY4oCYbmV34oCZ4oCZ77ya5Zyo5o2i5rqQ55WM6Z2i55qE6I+c5Y2V5Y+v5Lul5byA5ZCv5YiG5Lqr5pe25piv5ZCm5L2/55So57yW56CB44CCXFxcIixcXG4gICAgICAgIFxcXCJvcHRpbWl6Ze+8muWcqOmAiea6kOeVjOmdouWIt+aWsOmFjee9ruWQjuS8muWQjOatpeabtOaWsOaVsOmHj+aYvuekuuOAglxcXCIsXFxuICAgIF1cXG59LCB7XFxuICAgIHRpdGxlOiBcXFwiMjAyNC8wNi8xMCAgTWF4VmVyc2lvbiAyNVxcXCIsXFxuICAgIHJlY29yZHM6IFtcXG4gICAgICAgIFxcXCLigJjigJhuZXfigJnigJnvvJrlop7liqDmm7TmlrDml6Xlv5fjgIJcXFwiLFxcbiAgICAgICAgXFxcIuKAmOKAmG5ld+KAmeKAme+8mumAiea6kOmVv+aMieiPnOWNle+8jOWinuWKoOi3s+i9rOe9kemhte+8jOafpeeci+a6kOeggeOAglxcXCIsXFxuICAgICAgICBcXFwi4oCc4oCcZml44oCd4oCd77ya5L+u5aSN57yW6L6R6Kej5p6Q55WM6Z2i5rWL6K+VanPop6PmnpDkuIDnm7TlpLHotKXjgIJcXFwiLFxcbiAgICAgICAgXFxcIuKAnOKAnGZpeOKAneKAne+8muS/ruWkjWdpdGh1YuiuoumYhe+8jOS8muWIoOmZpOWFqOmDqOinhOWImeaWh+S7tuOAglxcXCIsXFxuICAgICAgICBcXFwi4oCc4oCcZml44oCd4oCd77ya5L+u5aSN6Kej5p6Q6LCD55So5aSx6LSl44CCXFxcIixcXG4gICAgICAgIFxcXCLigJzigJxmaXjigJ3igJ3vvJrkv67lpI3mm7TmjaLphY3nva7ml7bmsqHmnInlj4rml7bmuIXnqbpkcnB557yT5a2Y44CCXFxcIixcXG4gICAgICAgIFxcXCJvcHRpbWl6Ze+8muabtOaUueiuoumYheabtOaWsOetlueVpe+8jOS8muWIoOmZpOacrOWcsOWkseaViOa6kOOAglxcXCIsXFxuICAgICAgICBcXFwib3B0aW1pemXvvJrmm7TmlrBkcnB5Mi5qc+OAglxcXCIsXFxuICAgICAgICBcXFwib3B0aW1pemXvvJrkvJjljJbop6PmnpBmbGFn5Yy56YWN44CCXFxcIixcXG5cXG4gICAgXVxcbn0sIHtcXG4gICAgdGl0bGU6IFxcXCIyMDI0LzA2LzA5IE1heFZlcnNpb24gMjBcXFwiLFxcbiAgICByZWNvcmRzOiBbXFxuICAgICAgICBcXFwi4oCY4oCYbmV34oCZ4oCZ77ya5pSv5oyBcHJveHlfcnVsZeS7o+eQhuOAglxcXCIsXFxuICAgICAgICBcXFwi4oCc4oCcZml44oCd4oCd77ya5L+u5aSN5LqR55uY6ZO+5o6l5LiN6LCD5Y+W5LqR55uY566A44CCXFxcIixcXG4gICAgICAgIFxcXCLigJzigJxmaXjigJ3igJ3vvJrkv67lpI3lk5Tlk6nlvbHop4bkuI3og73kvb/nlKjop6PmnpDjgIJcXFwiLFxcbiAgICBdXFxufV07XCJ9XSIsImljb24iOiJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL3EvMjUucG5nIiwicHJveHkiOiIifQ==
Add Comment
Please, Sign In to add comment