Advertisement
xiaomianao666

邀您一起看:创建配置

Jun 3rd, 2024
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥创建配置@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImdtdE1vZGlmaWVkXCI6MCxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJcIixcImxpc3RUb0NsZWFyQXNzb2NpYXRlZEZLXCI6W10sXCJsaXN0VG9DbGVhclNlbGZGS1wiOltdLFwicGFnZUxpc3RcIjpbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcImRycHlcIixcInBhdGhcIjpcImRycHlcIixcInJ1bGVcIjpcImZ1bmN0aW9uIGluaXRIaWtlcigpIHtcXG4gICAgY29uc3QgaXNDbG9zZUxvZyA9ICFnZXRJdGVtKFxcXCJ1c2VMb2dcXFwiLCBcXFwiXFxcIik7XFxuICAgIGNvbnN0IGxvY2FsS2V5ID0gXFxcImRycHlcXFwiO1xcbiAgICBjb25zdCBDcnlwdG9VdGlsID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL2Fzc2V0cy9jcnlwdG8tamF2YS5qc1xcXCIpO1xcbiAgICBnbG9iYWxUaGlzLmxvY2FsID0ge1xcbiAgICAgICAgc2V0KHJ1bGVrZXksIGssIHYpIHtcXG4gICAgICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKGxvY2FsS2V5ICsgXFxcIkBcXFwiICsgcnVsZWtleSArIFxcXCJAXFxcIiArIGssIHYpO1xcbiAgICAgICAgfSxcXG4gICAgICAgIGdldChydWxla2V5LCBrLCB2KSB7XFxuICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2UwLmdldEl0ZW0obG9jYWxLZXkgKyBcXFwiQFxcXCIgKyBydWxla2V5ICsgXFxcIkBcXFwiICsgaywgXFxcIlxcXCIpIHx8IHY7XFxuICAgICAgICB9LFxcbiAgICAgICAgZGVsZXRlKHJ1bGVrZXksIGspIHtcXG4gICAgICAgICAgICBzdG9yYWdlMC5jbGVhckl0ZW0obG9jYWxLZXkgKyBcXFwiQFxcXCIgKyBydWxla2V5ICsgXFxcIkBcXFwiICsgayk7XFxuICAgICAgICB9XFxuICAgIH07XFxuICAgIGV2YWwoZ2V0Q3J5cHRvSlMoKSk7XFxuICAgIGdsb2JhbFRoaXMuQ3J5cHRvSlMgPSBDcnlwdG9KUztcXG5cXG4gICAgbGV0ICRyZXF1ZXN0ID0gcmVxdWVzdDtcXG4gICAgbGV0ICRwb3N0ID0gcG9zdDtcXG4gICAgZ2xvYmFsVGhpcy5yZXEgPSBmdW5jdGlvbiAodXJsLCBjb2JqKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCByZXMgPSB7fTtcXG4gICAgICAgICAgICBsZXQgb2JqID0gT2JqZWN0LmFzc2lnbih7fSwgY29iaik7XFxuICAgICAgICAgICAgaWYgKG9iai5kYXRhKSB7XFxuICAgICAgICAgICAgICAgIG9iai5ib2R5ID0gb2JqLmRhdGE7XFxuICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmouZGF0YTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShcXFwicmVkaXJlY3RcXFwiKSkgb2JqLnJlZGlyZWN0ID0gISFvYmoucmVkaXJlY3Q7XFxuICAgICAgICAgICAgaWYgKG9iai5idWZmZXIgPT09IDIpIHtcXG4gICAgICAgICAgICAgICAgb2JqLnRvSGV4ID0gdHJ1ZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgb2JqLmhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHtcXG4gICAgICAgICAgICAgICAgQ29va2llOiBcXFwiI25vQ29va2llI1xcXCJcXG4gICAgICAgICAgICB9LCBvYmouaGVhZGVycyk7XFxuICAgICAgICAgICAgaWYgKHVybCA9PT0gXFxcImh0dHBzOi8vYXBpLm5uLmNpL29jci9iNjQvdGV4dFxcXCIgJiYgb2JqLmhlYWRlcnMpIHtcXG4gICAgICAgICAgICAgICAgb2JqLmhlYWRlcnNbXFxcIkNvbnRlbnQtVHlwZVxcXCJdID0gXFxcInRleHQvcGxhaW5cXFwiO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoXFxcImZpbGU6Ly9cXFwiKSAmJiAodXJsLmluY2x1ZGVzKFxcXCI/dHlwZT1cXFwiKSB8fCB1cmwuaW5jbHVkZXMoXFxcIj9wYXJhbXM9XFxcIikpKSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IHVybC5zbGljZSgwLCB1cmwubGFzdEluZGV4T2YoXFxcIj9cXFwiKSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBvYmouaGVhZGVycykge1xcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9iai5oZWFkZXJzW2tleV0gIT09IFxcXCJzdHJpbmdcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICBvYmouaGVhZGVyc1trZXldID0gU3RyaW5nKG9iai5oZWFkZXJzW2tleV0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCByID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgLyogaWYgKFN0cmluZyhvYmoubWV0aG9kKS50b0xvd2VyQ2FzZSgpID09PSBcXFwicG9zdFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgIHIgPSAkcG9zdCh1cmwsIG9iaik7XFxuICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICByID0gJHJlcXVlc3QodXJsLCBvYmopO1xcbiAgICAgICAgICAgICB9Ki9cXG4gICAgICAgICAgICByID0gJHJlcXVlc3QodXJsLCBvYmopO1xcbiAgICAgICAgICAgIGlmIChvYmoud2l0aEhlYWRlcnMpIHtcXG4gICAgICAgICAgICAgICAgciA9IEpTT04ucGFyc2Uocik7XFxuICAgICAgICAgICAgICAgIHJlcy5jb250ZW50ID0gci5ib2R5O1xcbiAgICAgICAgICAgICAgICByZXMuaGVhZGVycyA9IHt9O1xcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoci5oZWFkZXJzIHx8IHt9KSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmVzLmhlYWRlcnNba10gPSB2WzBdO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmVzLmNvbnRlbnQgPSByO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAob2JqLmJ1ZmZlciA9PT0gMikge1xcbiAgICAgICAgICAgICAgICByZXMuY29udGVudCA9IENyeXB0b1V0aWwuRGF0YS5wYXJzZUhleChyZXMuY29udGVudCkudG9CYXNlNjQoX2Jhc2U2NC5OT19XUkFQKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIHJlcztcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coXFxcIkVycm9yXFxcIiArIGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgLypcXG4gICAgY29uc3QgSmluSmEgPSAkLnJlcXVpcmUoXFxcImh0dHBzOi8vY2RuLmJvb3RjZG4ubmV0L2FqYXgvbGlicy9tdXN0YWNoZS5qcy80LjEuMC9tdXN0YWNoZS5qc1xcXCIpO1xcbiAgXFxuICAgIGNvbnN0IEpQID0gJC5yZXF1aXJlKFxcXCJodHRwczovL2pzb25wYXRoLXBsdXMuZ2l0aHViLmlvL0pTT05QYXRoL2Rpc3QvaW5kZXgtYnJvd3Nlci11bWQuY2pzXFxcIik7XFxuICAgIGdsb2JhbFRoaXMuY2hlZXJpbyA9IHtcXG4gICAgICAgIGppbmphMih0ZW1wbGF0ZSwgb2JqKSB7XFxuICAgICAgICAgICAgXFxuICAgICAgICAgICAgcmV0dXJuICQubG9nKEppbkphLnJlbmRlcih0ZW1wbGF0ZSwgb2JqKSk7XFxuICAgICAgICB9LFxcbiAgICAgICAganAocGF0aCwganNvbikge1xcbiAgICAgICAgICAgIHJldHVybiBKUC5KU09OUGF0aCh7XFxuICAgICAgICAgICAgICAgIHBhdGgsXFxuICAgICAgICAgICAgICAgIGpzb25cXG4gICAgICAgICAgICB9KVswXTtcXG4gICAgICAgIH1cXG4gICAgfSovXFxuICAgIGdsb2JhbFRoaXMucGRmYSA9IF9wZGZhO1xcbiAgICBnbG9iYWxUaGlzLnBkID0gX3BkO1xcbiAgICBnbG9iYWxUaGlzLnBkZmggPSBfcGRmaDtcXG4gICAgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsID0gZnVuY3Rpb24gKHNlYXJjaCwgcmVwbGFjZW1lbnQpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLnNwbGl0KHNlYXJjaCkuam9pbihyZXBsYWNlbWVudCk7XFxuICAgIH07XFxuICAgIGxldCAkdG9TdHJpbmcgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XFxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcXG4gICAgICAgIHJldHVybiAkdG9TdHJpbmcuYXBwbHkodGhpcykudHJpbSgpO1xcbiAgICB9O1xcbiAgICBpZiAoaXNDbG9zZUxvZykge1xcbiAgICAgICAgLy8g6YeN5YaZY29uc29sZS5sb2flh73mlbBcXG4gICAgICAgIGNvbnNvbGUubG9nID0gZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgIC8vIOajgOafpeS8oOWFpeWPguaVsOeahOaVsOmHj1xcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xcbiAgICAgICAgICAgICAgICAvLyDlpoLmnpzlj4LmlbDmlbDph4/lpKfkuo4x77yM6LCD55So5Y6f5aeL55qEY29uc29sZS5sb2flh73mlbBcXG4gICAgICAgICAgICAgICAgLy9vcmlnaW5hbExvZy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgLy8g5aaC5p6c5Y+C5pWw5Y+q5pyJ5LiA5Liq77yM5YiZ5LiN5YGa5Lu75L2V5pON5L2cXFxuICAgICAgICB9O1xcbiAgICB9XFxufVxcbmluaXRIaWtlcigpO1xcbmNvbnN0IGRycHlQYXRoID0gZ2V0UGF0aChcXFwiaGlrZXI6Ly9maWxlcy9kYXRhL1xcXCIgKyBNWV9SVUxFLnRpdGxlICsgXFxcIi9saWJzX2hpa2VyL2RycHkyLmpzXFxcIik7XFxuXFxuaWYgKCFmaWxlRXhpc3QoZHJweVBhdGgpKSB7XFxuICAgIHRocm93IG5ldyBFcnJvcihcXFwi57y65bCRZHJweS5qc+i/kOihjOW6k1xcXCIpO1xcbn1cXG5sZXQgZHJweSA9ICQucmVxdWlyZShkcnB5UGF0aCk7XFxuLypcXG5sZXQgY3VycmVudFBhdGggPSBcXFwiXFxcIjtcXG5sZXQgJGluaXQgPSBkcnB5LmluaXQ7XFxuZHJweS5pbml0ID0gZnVuY3Rpb24oZXh0KSB7XFxuICAgIGlmIChleHQgPT09IGN1cnJlbnRQYXRoKSByZXR1cm47XFxuICAgICRpbml0LmNhbGwodGhpcywgZXh0KTtcXG4gICAgY3VycmVudFBhdGggPSBleHQ7XFxufSovXFxuJC5leHBvcnRzID0gZHJweTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzFfdmVydGljYWxfcGljX2JsdXJcIixcIm5hbWVcIjpcIuivpue7humhtemdolwiLFwicGF0aFwiOlwiZGV0YWlsZWRcIixcInJ1bGVcIjpcImpzOlxcbihmdW5jdGlvbiAoKSB7XFxuICBsZXQgaWQgPSBNWV9QQVJBTVMudm9kSWQ7XFxuICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gICAgR00uY2xlYXIoXFxcInJlbm92YXRlTGlzdFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJzb3J0aVxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwYWdlbnVtXFxcIik7XFxuICB9KTtcXG4gIGFkZExpc3RlbmVyKCdvblJlZnJlc2gnLCAkLnRvU3RyaW5nKChpZCkgPT4ge1xcbiAgICAvL2NsZWFyTXlWYXIoaWQgKyBcXFwiZXJpbmZvXFxcIilcXG4gIH0sIGlkKSlcXG5cXG4gIC8v5pa55rOVXFxuICBmdW5jdGlvbiBmb250c3R5bGUodGV4dCwgcGFyYW1zKSB7XFxuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB1bmRlZmluZWQ7XFxuICAgIHZhciBoID0gcGFyYW1zLmggIT09IGZhbHNlID8gJ+KAnOKAnOKAneKAnScgOiAnJztcXG4gICAgdmFyIHRhZ3MgPSBwYXJhbXMudGFncyB8fCBcXFwiXFxcIjtcXG4gICAgaWYgKHBhcmFtcy5jICE9IHVuZGVmaW5lZCkge1xcbiAgICAgIHRleHQgPSB0ZXh0LmZvbnRjb2xvcihwYXJhbXMuYyk7XFxuICAgIH1cXG4gICAgaWYgKHRhZ3MpIHtcXG4gICAgICB2YXIgdGFnQXJyYXkgPSB0YWdzLnNwbGl0KCd8JykuZmlsdGVyKGUgPT4gZSk7XFxuICAgICAgdmFyIG9wZW5UYWdzID0gJyc7XFxuICAgICAgdmFyIGNsb3NlVGFncyA9ICcnO1xcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFnQXJyYXkubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgIG9wZW5UYWdzICs9ICc8JyArIHRhZ0FycmF5W2ldICsgJz4nO1xcbiAgICAgICAgY2xvc2VUYWdzID0gJzwvJyArIHRhZ0FycmF5W2ldICsgJz4nICsgY2xvc2VUYWdzO1xcbiAgICAgIH1cXG4gICAgICB0ZXh0ID0gb3BlblRhZ3MgKyB0ZXh0ICsgY2xvc2VUYWdzO1xcbiAgICB9XFxuICAgIHJldHVybiBoICsgdGV4dDtcXG4gIH1cXG5cXG4gIGZ1bmN0aW9uIGZpbmRMb25nZXN0RWxlbWVudChhcnIpIHtcXG4gICAgcmV0dXJuIGFyci5yZWR1Y2UoKGEsIGIpID0+IGEubGVuZ3RoID4gYi5sZW5ndGggPyBhIDogYik7XFxuICB9XFxuXFxuICBmdW5jdGlvbiBjb3VudFRvdGFsQnl0ZXModGV4dCkge1xcbiAgICB2YXIgY291bnQgPSAwO1xcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcXG4gICAgICB2YXIgY29kZSA9IHRleHQuY2hhckNvZGVBdChpKTtcXG4gICAgICBpZiAoY29kZSA+PSAweDAxMDApIHsgLy8g5Y+M5a2X6IqC5a2X56ym55qEIFVuaWNvZGUg57yW56CB5aSn5LqOIDI1NVxcbiAgICAgICAgY291bnQgKz0gMjsgLy8g5Y+M5a2X6IqC5a2X56ym6K6h5pWw5Li6MlxcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICBjb3VudCArPSAxOyAvLyDljZXlrZfoioLlrZfnrKborqHmlbDkuLoxXFxuICAgICAgfVxcbiAgICB9XFxuICAgIHJldHVybiBjb3VudDtcXG4gIH1cXG4gIFxcbiAgZnVuY3Rpb24gY2FjaGVTaG93VGlwcygpIHtcXG4gICAgaWYgKHN0b3JhZ2UwLmdldE15VmFyKGlkICsgXFxcImVyaW5mb1xcXCIpKSB7XFxuICAgICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBmb250c3R5bGUoXFxcIuW9k+WJjeS4uue8k+WtmCzngrnmiJHliLfmlrBcXFwiLCB7IGM6IFxcXCJncmV5XFxcIiwgdGFnczogXFxcInNtYWxsXFxcIiB9KSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGlkKSA9PiB7XFxuICAgICAgICAgIGNsZWFyTXlWYXIoaWQgKyBcXFwiZXJpbmZvXFxcIilcXG4gICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgaWQpLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgICAgfSlcXG4gICAgfVxcbiAgfVxcblxcbiAgZnVuY3Rpb24gc3Vic3RyKHN0ciwgbWF4TGVuZ3RoKSB7XFxuICAgIGxldCBsZW4gPSAwO1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xcbiAgICAgIGlmIChzdHIuY2hhckNvZGVBdChpKSA+IDI1NSkge1xcbiAgICAgICAgbGVuICs9IDI7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIGxlbisrO1xcbiAgICAgIH1cXG4gICAgICBpZiAobGVuID4gbWF4TGVuZ3RoKSB7XFxuICAgICAgICByZXR1cm4gc3RyLnNsaWNlKDAsIGkpICsgJy4uLic7XFxuICAgICAgfVxcbiAgICB9XFxuICAgIHJldHVybiBzdHI7XFxuICB9XFxuXFxuICBmdW5jdGlvbiBzZXREZXNjKGRlc2MsIG51bSkge1xcbiAgICBpZiAoZGVzYyA9PSB1bmRlZmluZWQpIHtcXG4gICAgICByZXR1cm47XFxuICAgIH1cXG4gICAgZGVzYyA9IGRlc2MuY29uc3RydWN0b3IgPT0gQXJyYXkgPyBkZXNjLmpvaW4oJzxicj4nKSA6IGRlc2M7XFxuICAgIGlmIChkZXNjLnJlcGxhY2UoLyg8YnI+fFxcXFxzKykvZywgJycpLmxlbmd0aCA9PSAwKSB7XFxuICAgICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiAnYmlnX2JsYW5rX2Jsb2NrJ1xcbiAgICAgIH0pXFxuICAgICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiAnYmlnX2JsYW5rX2Jsb2NrJ1xcbiAgICAgIH0pXFxuICAgICAgcmV0dXJuO1xcbiAgICB9XFxuXFxuICAgIGNvbnN0IG1hcmsgPSAnZGVzYyc7XFxuICAgIG51bSA9IHR5cGVvZiAobnVtKSA9PSAndW5kZWZpbmVkJyA/IDEwMCA6IG51bVxcbiAgICBkZXNjID0gZGVzYy5zdGFydHNXaXRoKCfjgIDjgIAnKSA/IGRlc2MgOiAn44CA44CAJyArIGRlc2M7XFxuICAgIGRlc2MgPSBkZXNjLnJlcGxhY2UoLycvZywgXFxcIiYjMzk7XFxcIik7XFxuICAgIGRlc2MgPSBkZXNjLnJlcGxhY2UoL1xcXFxyXFxcXG4vZywgXFxcIjxicj5cXFwiKTtcXG4gICAgZGVzYyA9IGRlc2MucmVwbGFjZSgvXFxcXG4vZywgXFxcIjxicj5cXFwiKTtcXG4gICAgbGV0IHNkZXNjID0gc3Vic3RyKGRlc2MsIG51bSk7XFxuXFxuICAgIHZhciBjb2xvcnMgPSB7XFxuICAgICAgc2hvdzogXFxcImJsYWNrXFxcIixcXG4gICAgICBoaWRlOiBcXFwiZ3JleVxcXCJcXG4gICAgfVxcblxcbiAgICB2YXIgbGF6eSA9ICQoYCNub0xvYWRpbmcjYCkubGF6eVJ1bGUoKGRjLCBzZGMsIG0sIGNzKSA9PiB7XFxuICAgICAgdmFyIHNob3cgPSBzdG9yYWdlMC5nZXRJdGVtKG0sICcwJyk7XFxuICAgICAgdmFyIHRpdGxlID0gZmluZEl0ZW0oJ2Rlc2MnKS50aXRsZTtcXG4gICAgICB2YXIgcmUgPSAvKDxcXFxcL3NtYWxsPjxicj4uKj8+KS4rL2c7XFxuICAgICAgdmFyIGV4cCA9ICflsZXlvIA6JztcXG4gICAgICB2YXIgcmV0ID0gJ+aUtui1tzonO1xcbiAgICAgIGlmIChzaG93ID09ICcxJykge1xcbiAgICAgICAgdXBkYXRlSXRlbSgnZGVzYycsIHtcXG4gICAgICAgICAgdGl0bGU6IHRpdGxlXFxuICAgICAgICAgICAgLnJlcGxhY2UocmV0LCBleHApXFxuICAgICAgICAgICAgLnJlcGxhY2UocmUsICckMScgKyBzZGMgKyAnPC9zbWFsbD4nKVxcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oPFxcXFwvc21hbGw+PGJyPlxcXFw8Zm9udCBjb2xvcj1cXFwiKS4qPyhcXFwiPikvLCAnJDEnICsgY3MuaGlkZSArICckMicpXFxuXFxuICAgICAgICB9KVxcbiAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShtLCAnMCcpO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICB1cGRhdGVJdGVtKCdkZXNjJywge1xcbiAgICAgICAgICB0aXRsZTogdGl0bGVcXG4gICAgICAgICAgICAucmVwbGFjZShleHAsIHJldClcXG4gICAgICAgICAgICAucmVwbGFjZShyZSwgJyQxJyArIGRjICsgJzwvc21hbGw+JylcXG4gICAgICAgICAgICAucmVwbGFjZSgvKDxcXFxcL3NtYWxsPjxicj5cXFxcPGZvbnQgY29sb3I9XFxcIikuKj8oXFxcIj4pLywgJyQxJyArIGNzLnNob3cgKyAnJDInKVxcbiAgICAgICAgfSlcXG4gICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0obSwgJzEnKTtcXG4gICAgICB9XFxuICAgICAgcmV0dXJuIGBoaWtlcjovL2VtcHR5YFxcbiAgICB9LCBkZXNjLCBzZGVzYywgbWFyaywgY29sb3JzKVxcbiAgICB2YXIgc2MgPSBzdG9yYWdlMC5nZXRJdGVtKG1hcmssICcwJykgPT0gJzAnID8gJ+WxleW8gDonIDogJ+aUtui1tzonO1xcbiAgICB2YXIgZGMgPSBzdG9yYWdlMC5nZXRJdGVtKG1hcmssICcwJykgPT0gJzAnID8gc2Rlc2MgOiBkZXNjO1xcbiAgICB2YXIgY3MgPSBzdG9yYWdlMC5nZXRJdGVtKG1hcmssICcwJykgPT0gJzAnID8gY29sb3JzLmhpZGUgOiBjb2xvcnMuc2hvdztcXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogJycgKyAnPGI+PGZvbnQgY29sb3I9XFxcIiMwOThBQzFcXFwiPuKIt+WJp+aDheeugOS7i1xcdDwvZm9udD48L2I+JyArIFxcXCI8c21hbGw+PGEgc3R5bGU9J3RleHQtZGVjb3JhdGlvbjogbm9uZTsnIGhyZWY9J1xcXCIgKyBsYXp5ICsgXFxcIic+XFxcIiArIHNjICsgJzwvYT48L3NtYWxsPjxicj48Zm9udCBjb2xvcj1cXFwiJyArIGNzICsgJ1xcXCI+JyArIGAke2RjfWAgKyAnPC9zbWFsbD4nLFxcbiAgICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgaWQ6ICdkZXNjJyxcXG4gICAgICAgIGxpbmVTcGFjaW5nOiA2LFxcbiAgICAgICAgdGV4dFNpemU6IDE1LFxcbiAgICAgICAgbGluZVZpc2libGU6IHRydWUsXFxuICAgICAgfVxcbiAgICB9KVxcbiAgfVxcblxcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0cmluZy5wcm90b3R5cGUsICdTcGxpdCcsIHtcXG4gICAgdmFsdWU6IGZ1bmN0aW9uIChzLCBlKSB7XFxuICAgICAgaWYgKGUpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLnNwbGl0KHMpLmZpbHRlcihpdGVtID0+IGl0ZW0gIT09ICcnKTtcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXQocyk7XFxuICAgICAgfVxcbiAgICB9LFxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcXG4gIH0pO1xcblxcblxcbiAgbGV0IHNvcnRvYmogPSBbXFxuICAgIGZvbnRzdHlsZShcXFwi5q2j5bqPXFxcIiwge1xcbiAgICAgIGM6IFxcXCIjMUFBRDE5XFxcIixcXG4gICAgICB0YWdzOiBcXFwiYlxcXCJcXG4gICAgfSksXFxuICAgIGZvbnRzdHlsZShcXFwi6YCG5bqPXFxcIiwge1xcbiAgICAgIGM6IFxcXCIjRkYwMDAwXFxcIixcXG4gICAgICB0YWdzOiBcXFwiYlxcXCJcXG4gICAgfSlcXG4gIF1cXG4gIC8v5pa55rOVXFxuXFxuICB2YXIgc29ydGkgPSBnZXRNeVZhcihcXFwic29ydGlcXFwiLCBcXFwiMFxcXCIpO1xcblxcbiAgLy9sb2coc29ydG9iailcXG4gICQuZXh0ZW5kKHtcXG4gICAgc3BsaXRQYWdlKHRvdGFsSXRlbXMsIHBhZ2VTaXplKSB7XFxuICAgICAgcGFnZVNpemUgPSBwYWdlU2l6ZSB8fCA1MDtcXG4gICAgICBsZXQgcmVzdWx0ID0gW107XFxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdG90YWxJdGVtczsgaSArPSBwYWdlU2l6ZSkge1xcbiAgICAgICAgbGV0IGVuZCA9IGkgKyBwYWdlU2l6ZSAtIDE7XFxuICAgICAgICBpZiAoZW5kID4gdG90YWxJdGVtcykge1xcbiAgICAgICAgICBlbmQgPSB0b3RhbEl0ZW1zO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmVzdWx0LnB1c2goYCR7aX0tJHtlbmR9YCk7XFxuICAgICAgfVxcbiAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICAgIHNwbGl0QXJyYXlCeVJhbmdlcyhhcnJheSwgcmFuZ2VzKSB7XFxuICAgICAgLy8g5qC55o2u6IyD5Zu05ouG5YiG5pWw57uEXFxuICAgICAgdmFyIHJlc3VsdCA9IHJhbmdlcy5tYXAoZnVuY3Rpb24gKHJhbmdlKSB7XFxuICAgICAgICB2YXIgcGFydHMgPSByYW5nZS5zcGxpdCgnLScpLm1hcChOdW1iZXIpO1xcbiAgICAgICAgdmFyIHN0YXJ0ID0gcGFydHNbMF0gLSAxOyAvLyDlh48x5piv5Zug5Li65pWw57uE57Si5byV5LuOMOW8gOWni1xcbiAgICAgICAgdmFyIGVuZCA9IHBhcnRzWzFdIC0gMTtcXG4gICAgICAgIC8vIOS9v+eUqEFycmF5LnByb3RvdHlwZS5zbGljZeadpeiOt+WPluWtkOaVsOe7hFxcbiAgICAgICAgcmV0dXJuIGFycmF5LnNsaWNlKHN0YXJ0LCBlbmQgKyAxKTsgLy8g5YyF5ous57uT5p2f57Si5byV77yM5omA5Lul5YqgMVxcbiAgICAgIH0pO1xcbiAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICB9KVxcblxcbiAgbGV0IHNvdXJjZSA9IHt9O1xcbiAgaWYoTVlfUEFSQU1TLnNvdXJjZSl7XFxuICAgICAgc291cmNlPU1ZX1BBUkFNUy5zb3VyY2U7XFxuICB9ZWxzZXtcXG4gICAgICBjb25zdCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgc291cmNlPXJ1bnRpbWVDb25maWcuZmluZFNvdXJjZShNWV9QQVJBTVMuc2tleSk7XFxuICAgICAgTVlfUEFSQU1TLnNvdXJjZT1zb3VyY2U7XFxuICAgICAgc2V0UGFnZVBhcmFtcyhNWV9QQVJBTVMpO1xcbiAgfVxcbiAgXFxuICBjb25zdCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIik7XFxuICBcXG4gIERycHlNYW5hZ2UuaW5pdFBhZ2UoXFxcImVyXFxcIik7XFxuICBcXG4gIGxldCBkcnB5ID0gRHJweU1hbmFnZS5nZXRCeVNvdXJjZShzb3VyY2UpO1xcblxcbiAgbGV0IGluZm8gPSBzdG9yYWdlMC5nZXRNeVZhcihpZCArIFxcXCJlcmluZm9cXFwiLCBcXFwiXFxcIik7XFxuICBcXG4gIFxcbiAgaWYgKGluZm8gPT0gXFxcIlxcXCIpIHtcXG4gICAgaW5mbyA9IEpTT04ucGFyc2UoZHJweS5kZXRhaWwoU3RyaW5nKGlkKSkpLmxpc3RbMF07XFxuICAgIHN0b3JhZ2UwLnB1dE15VmFyKGlkICsgXFxcImVyaW5mb1xcXCIsIGluZm8pXFxuICB9XFxuXFxuICBsZXQgW+WvvOa8lCwg5Li75ryUXSA9IFtpbmZvLnZvZF9kaXJlY3RvciwgaW5mby52b2RfYWN0b3JdXFxuICBcXG4gIGlmICjlr7zmvJQgIT0gdW5kZWZpbmVkJiblr7zmvJQhPVxcXCJcXFwiKSB7XFxuICAgIOWvvOa8lCA9IOWvvOa8lC5TcGxpdCgvXFxcXC8vZywgdHJ1ZSkuam9pbihcXFwiIFxcXCIpO1xcbiAgICDlr7zmvJQgPSAvWzrvvJpdLy50ZXN0KOWvvOa8lCkgPyDlr7zmvJQgOiBcXFwi5a+85ryUOlxcXCIgKyDlr7zmvJRcXG4gIH1cXG4gIGlmICjkuLvmvJQgIT0gdW5kZWZpbmVkJibkuLvmvJQhPVxcXCJcXFwiKSB7XFxuICAgIOS4u+a8lCA9IOS4u+a8lC5TcGxpdCgvXFxcXC8vZywgdHJ1ZSkuam9pbihcXFwiIFxcXCIpO1xcbiAgICDkuLvmvJQgPSAvWzrvvJpdLy50ZXN0KOS4u+a8lCkgPyDkuLvmvJQgOiBcXFwi5Li75ryUOlxcXCIgKyDkuLvmvJRcXG4gIH1cXG4gIGxldCBb5ZCN56ewLCDlpIfms6hdID0gW2luZm8udm9kX25hbWUsIGluZm8udm9kX3JlbWFya3NdXFxuICBpZiAo5aSH5rOoICE9IHVuZGVmaW5lZCYm5aSH5rOoIT1cXFwiXFxcIikge1xcbiAgICDlpIfms6ggPSDlpIfms6guU3BsaXQoL1xcXFwvL2csIHRydWUpLmpvaW4oXFxcIiBcXFwiKTtcXG4gICAg5aSH5rOoID0gL1s677yaXS8udGVzdCjlpIfms6gpID8g5aSH5rOoIDogXFxcIuWkh+azqDpcXFwiICsg5aSH5rOoO1xcbiAgfVxcbiAgbGV0IHRpdGxlcyA9IFvlkI3np7AsIOWkh+azqF07XFxuICBsZXQgZGVzY3MgPSBb5a+85ryULCDkuLvmvJQsaW5mby52b2RfYXJlYSxpbmZvLnZvZF95ZWFyXVxcblxcbiAgbGV0IGQgPSBbXTtcXG4gIGQucHVzaCh7XFxuICAgIHRpdGxlOiB0aXRsZXMuZmlsdGVyKGUgPT4gZSkubWFwKCh4LGkpPT5pPT0xP2ZvbnRzdHlsZSh4LCB7dGFnczpcXFwic21hbGxcXFwifSk6eCkuam9pbihcXFwiXFxcXG5cXFwiKSxcXG4gICAgZGVzYzogZGVzY3MuZmlsdGVyKGUgPT4gZSkuam9pbihcXFwiXFxcXG5cXFwiKSxcXG4gICAgcGljX3VybDogaW5mby52b2RfcGljIHx8IE1ZX1BBUkFNUy5pbWcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgZ3JhZGllbnQ6IGZhbHNlLFxcbiAgICB9XFxuICB9KTtcXG4gIGQucHVzaCh7XFxuICAgIHRpdGxlOiAn5pWw5o2u5p2l5rqQOicgKyBNWV9QQVJBTVMuc25hbWUsXFxuICAgIC8vZGVzYzpcXFwiXFxcIitNWV9QQVJBTVMuc2tleStcXFwiXFxcXHRcXFwiLFxcbiAgICBpbWc6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL21lc3N5Lzc4LnN2Z1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCJcXG4gIH0pXFxuICBzZXREZXNjKGluZm8udm9kX2NvbnRlbnQpXFxuXFxuICAvKlxcbiAgZnVuY3Rpb24gcGFyc2VRdWVyeShxdWVyeSkge1xcbiAgICB2YXIgb2JqID0ge307XFxuICAgIHF1ZXJ5LnNwbGl0KFxcXCImXFxcIikuZmlsdGVyKGUgPT4gZSkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xcbiAgICAgIHZhciBwYXJ0cyA9IGl0ZW0uc3BsaXQoXFxcIj1cXFwiKTtcXG4gICAgICBvYmpbcGFydHNbMF1dID0gcGFydHNbMV07XFxuICAgIH0pO1xcbiAgICByZXR1cm4gb2JqO1xcbiAgfVxcblxcbiAgLy9qc+aJp+ihjFxcbiAgbGV0IHBhcnNlX29iaiA9IHtcXG4gICAgZGVmUnVsZXM6IFtcXFwiKi5tcDRcXFwiLCBcXFwiKi5tM3U4XFxcIl0sXFxuICB9O1xcbiAgdmFyIGV4dHJhID0ge1xcbiAgICBcXFwidWFcXFwiOiBNT0JJTEVfVUFcXG4gIH1cXG4gIGxldCBwYXJzZSA9IEpTT04ucGFyc2UoZHJweS5wbGF5KCkpO1xcbiAgLy9jb25zb2xlLmxvZyhwYXJzZSk7XFxuICBpZiAocGFyc2UuaGFzT3duUHJvcGVydHkoXFxcInBhcnNlX2V4dHJhXFxcIikpIHtcXG4gICAgbGV0IHBhcnNlX2V4dHJhID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhcnNlLnBhcnNlX2V4dHJhKTtcXG4gICAgcGFyc2Vfb2JqID0gT2JqZWN0LmFzc2lnbihwYXJzZV9vYmosIHBhcnNlUXVlcnkocGFyc2VfZXh0cmEpKTtcXG4gICAgaWYgKHBhcnNlX29iai5oYXNPd25Qcm9wZXJ0eShcXFwiaW5pdF9zY3JpcHRcXFwiKSkge1xcbiAgICAgIHBhcnNlX29ialtcXFwiaW5pdF9zY3JpcHRcXFwiXSA9IGJhc2U2NERlY29kZShwYXJzZV9vYmpbXFxcImluaXRfc2NyaXB0XFxcIl0pO1xcbiAgICB9XFxuICB9XFxuICBpZiAocGFyc2Vfb2JqLmhhc093blByb3BlcnR5KFxcXCJpc19wY1xcXCIpICYmIHBhcnNlX29ialtcXFwiaXNfcGNcXFwiXSA9PSBcXFwiMVxcXCIpIHtcXG4gICAgZXh0cmFbXFxcInVhXFxcIl0gPSBQQ19VQTtcXG4gIH1cXG4gIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFwiaGVhZGVyXFxcIikpIHtcXG4gICAgZXh0cmFbXFxcInVhXFxcIl0gPSBwYXJzZVtcXFwiaGVhZGVyXFxcIl1bXFxcIlVzZXItQWdlbnRcXFwiXTtcXG4gICAgLy9leHRyYVtcXFwicmVkaXJlY3RcXFwiXT1mYWxzZTtcXG4gICAgZXh0cmFbXFxcImpzXFxcIl0gPSAkLnRvU3RyaW5nKChqcykgPT4ge1xcbiAgICAgIGV2YWwoanMpXFxuICAgICAgZmJhLmxvZyhuYXZpZ2F0b3IudXNlckFnZW50KVxcbiAgICAgIGZiYS5sb2cobG9jYXRpb24uaHJlZilcXG4gICAgfSwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5hdmlnYXRvciwgJ3VzZXJBZ2VudCcsIHtcXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICByZXR1cm4gJ015LUN1c3RvbS1VQS1TdHJpbmcnO1xcbiAgICAgICAgfVxcbiAgICAgIH0pO1xcbiAgICB9KSlcXG4gIH1cXG4gIGlmIChwYXJzZV9vYmouaGFzT3duUHJvcGVydHkoXFxcImN1c3RvbV9yZWdleFxcXCIpKSB7XFxuICAgIGxldCBjdXJyZW50ID0gcGFyc2Vfb2JqW1xcXCJkZWZSdWxlc1xcXCJdO1xcbiAgICBleHRyYVtcXFwidmlkZW9SdWxlc1xcXCJdID0gY3VycmVudC5jb25jYXQocGFyc2Vfb2JqLmN1c3RvbV9yZWdleC5zcGxpdCgvXFxcXHwvZykuZmlsdGVyKGUgPT4gZSkpXFxuICB9XFxuICBpZiAocGFyc2UuaGFzT3duUHJvcGVydHkoXFxcImpzXFxcIikpIHtcXG4gICAgZXh0cmFbXFxcImpzXFxcIl0gPSAkLnRvU3RyaW5nKChqcywgcGFyc2UsIHQpID0+IHtcXG4gICAgICBpZiAocGFyc2UuaGFzT3duUHJvcGVydHkoXFxcImluaXRfc2NyaXB0XFxcIikpIHtcXG4gICAgICAgIGZiYS5sb2codCArIFxcXCI65omn6KGMaW5pdF9zY3JpcHRcXFwiKTtcXG4gICAgICAgIGV2YWwocGFyc2UuaW5pdF9zY3JpcHQpO1xcbiAgICAgIH1cXG4gICAgICBmYmEubG9nKG5hdmlnYXRvci5wbGF0Zm9ybSk7XFxuICAgICAgZmJhLmxvZyh0ICsgXFxcIjrmiafooYxqc+eCueWHu1xcXCIpXFxuICAgICAgZXZhbChqcylcXG4gICAgfSwgcGFyc2UuanMsIHBhcnNlX29iaiwgTVlfUlVMRS50aXRsZSlcXG4gIH1cXG4gIC8vbG9nKGV4dHJhKVxcbiAgKi9cXG4gIGxldCBmcm9tID0gW107XFxuICBpZiAoaW5mby52b2RfcGxheV9mcm9tICE9IHVuZGVmaW5lZCkge1xcbiAgICBmcm9tID0gaW5mby52b2RfcGxheV9mcm9tLnNwbGl0KFxcXCIkJCRcXFwiKTtcXG4gICAgLypsZXQgcGxheUxhenkgPSAkKFxcXCJcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgZnVuY3Rpb24gaXNvZmZpY2lhbCh1cmwpIHtcXG4gICAgICAgIGxldCBmbGFnID0gbmV3IFJlZ0V4cCgncXFcXFxcLmNvbXxpcWl5aVxcXFwuY29tfHlvdWt1XFxcXC5jb218bWd0dlxcXFwuY29tfGJpbGliaWxpXFxcXC5jb218c29odVxcXFwuY29tfGl4aWd1YVxcXFwuY29tfHBwdHZcXFxcLmNvbXxtaWd1dmlkZW9cXFxcLmNvbXxsZVxcXFwuY29tfDE5MDVcXFxcLmNvbXxmdW5cXFxcLnR2Jyk7XFxuICAgICAgICByZXR1cm4gZmxhZy50ZXN0KHVybCk7XFxuICAgICAgfVxcblxcbiAgICAgIGxldCBkcnB5ID0gR00uZGVmaW5lTW9kdWxlKFxcXCJkcnB5XFxcIiwgXFxcImRycHlcXFwiKTtcXG4gICAgICBpbnB1dCA9IGlucHV0LnNwbGl0KFxcXCIjXFxcIik7XFxuICAgICAgbGV0IHBsYXkgPSBKU09OLnBhcnNlKGRycHkucGxheShpbnB1dFsxXSwgaW5wdXRbMF0ucmVwbGFjZShcXFwidHZib3gteGc6XFxcIiwgXFxcIlxcXCIpLCBbXSkpO1xcbiAgICAgIGxvZyhwbGF5KVxcbiAgICAgIGxvZyhcXFwicGxheS51cmxcXFwiKVxcbiAgICAgIGxldCBwYXJzZV9vYmogPSB7XFxuICAgICAgICBkZWZfcmVnZXg6IFN0cmluZy5yYXdgXFxcXC4obXA0fG0zdTgpfGNuL3Rvc2AsXFxuICAgICAgfTtcXG5cXG4gICAgICBpZiAocGxheS51cmwuaW5jbHVkZXMoXFxcInByb3h5P2RvXFxcIikpIHtcXG4gICAgICAgIE1ZX1VSTCA9IHBsYXkudXJsO1xcbiAgICAgICAgcGxheS51cmwgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInVybFxcXCIsIFxcXCJcXFwiKSk7XFxuICAgICAgfVxcbiAgICAgIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJodHRwczovL3Bhbi5xdWFyay5jbi9cXFwiKSkge1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3NlYXJjaD9zPVxcXCIgKyBwbGF5LnVybCArIFxcXCImcnVsZT11Y2tr5LqRXFxcIlxcbiAgICAgIH1cXG4gICAgICBpZiAocGxheS51cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvJykgfHwgcGxheS51cmwuc3RhcnRzV2l0aChcXFwiaHR0cHM6Ly93d3cuYWxpcGFuLmNvbS9zL1xcXCIpKSB7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9hbGl5dW4/cnVsZT3kupHnm5jlkJsu566AJnBhZ2U9ZnlwYWdlJnJlYWx1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChwbGF5LnVybCk7XFxuICAgICAgfVxcbiAgICAgIGlmIChwbGF5LnBhcnNlID09PSAxKSB7XFxuICAgICAgICBpZiAocGxheS51cmwuc3RhcnRzV2l0aChcXFwibWFnbmV0OlxcXCIpKSB7XFxuICAgICAgICAgIHJldHVybiBwbGF5LnVybDtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChpc29mZmljaWFsKHBsYXkudXJsKSkge1xcbiAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbXVsUGFyc2U/cnVsZT3phY3nva7liqnmiYtcXFwiKS5tdWxQYXJzZShwbGF5LnVybCk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcInZpZGVvOi8vXFxcIiArIHBsYXkudXJsO1xcbiAgICAgIH0gZWxzZSBpZiAocGxheS5wYXJzZSA9PT0gMCkge1xcbiAgICAgICAgcmV0dXJuIHBsYXkudXJsO1xcbiAgICAgIH1cXG4gICAgfSk7Ki9cXG4gIH1cXG5cXG4gIGxldCBwbGF5TGF6eSA9ICQoXFxcIlxcXCIpLmxhenlSdWxlKChpZCwgc291cmNlKSA9PiB7XFxuICAgIHJldHVybiAkLnJlcXVpcmUoXFxcInZpZGVvVXJsXFxcIikucGFyc2UoaW5wdXQsIGlkLCBzb3VyY2UpO1xcbiAgfSwgXFxcImlkXFxcIiwgc291cmNlKTtcXG5cXG4gIGxldCBwbGF5VXJsTGlzdCA9IFtdO1xcbiAgLy9jb25zb2xlLmxvZyhpbmZvLnZvZF9wbGF5X3VybCk7XFxuICBsZXQgcGxheXBhZ2VzID0gW107XFxuICBpZiAoaW5mby52b2RfcGxheV91cmwgJiYgaW5mby52b2RfcGxheV91cmwgIT0gXFxcIlxcXCIpIHtcXG4gICAgbGV0IGNvbCA9IFxcXCJ0ZXh0XzRcXFwiO1xcbiAgICBsZXQgdGV4dGFsaWduID0gXFxcIlxcXCI7XFxuICAgIHBsYXlVcmxMaXN0ID0gaW5mby52b2RfcGxheV91cmwuc3BsaXQoXFxcIiQkJFxcXCIpLm1hcCgodCwgaSkgPT4ge1xcbiAgICAgIGxldCBpbWcgPSBcXFwiXFxcIjtcXG4gICAgICBsZXQgdHMgPSB0LnNwbGl0KFxcXCIjXFxcIikubWFwKChrKSA9PiBrLnNwbGl0KFxcXCIkXFxcIilbMF0pO1xcbiAgICAgIGxldCBwYWdlcyA9ICQuc3BsaXRQYWdlKHRzLmxlbmd0aClcXG4gICAgICBsZXQgdGMgPSBjb3VudFRvdGFsQnl0ZXMoZmluZExvbmdlc3RFbGVtZW50KHRzKSk7XFxuICAgICAgaWYgKHRzLmZpbHRlcihlID0+IGUgIT0gXFxcIlxcXCIpLmxlbmd0aCkge1xcbiAgICAgICAgcGxheXBhZ2VzW2ldID0gcGFnZXM7XFxuICAgICAgfVxcbiAgICAgIGlmICh0YyA+IDI0KSB7XFxuICAgICAgICBjb2wgPSBcXFwidGV4dF8xXFxcIjtcXG4gICAgICAgIGltZyA9IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL21vdmllLzE0Ni5zdmdcXFwiO1xcbiAgICAgIH0gZWxzZSBpZiAodGMgPj0gMTIgJiYgdGMgPCAxNSkge1xcbiAgICAgICAgY29sID0gXFxcInRleHRfM1xcXCI7XFxuICAgICAgfSBlbHNlIGlmICh0YyA+PSAxNSkge1xcbiAgICAgICAgY29sID0gXFxcInRleHRfMlxcXCI7XFxuICAgICAgICB0ZXh0YWxpZ24gPSBcXFwibGVmdFxcXCI7XFxuICAgICAgfVxcbiAgICAgIGxldCBwbGF5b2JqID0gdC5zcGxpdChcXFwiI1xcXCIpLm1hcCgoaikgPT4ge1xcbiAgICAgICAgbGV0IGsgPSBqLnNwbGl0KFxcXCIkXFxcIik7XFxuICAgICAgICBsZXQgdCA9IGtbMF07XFxuICAgICAgICBsZXQgdWlkID0gKGtbMV18fGtbMF0pO1xcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgdGl0bGU6IGZvbnRzdHlsZSh0LCB7XFxuICAgICAgICAgICAgdGFnczogXFxcInNtYWxsXFxcIlxcbiAgICAgICAgICB9KSxcXG4gICAgICAgICAgdXJsOiAgdWlkKyBcXFwiI1xcXCIgKyBmcm9tW2ldICsgcGxheUxhenkucmVwbGFjZSgnXFxcImlkXFxcIicsICdcXFwiJyArdWlkICsgJ1xcXCInKSxcXG4gICAgICAgICAgY29sX3R5cGU6IGNvbCxcXG4gICAgICAgICAgaW1nOiBpbWcsXFxuICAgICAgICAgIC8qZXh0cmE6IE9iamVjdC5hc3NpZ24oe30sIGV4dHJhLCB7XFxuICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBkZWNvZGVVUklDb21wb25lbnQoa1sxXSksXFxuICAgICAgICAgICAgaWQ6IGtbMV0sXFxuICAgICAgICAgICAgLy9saW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgdGV4dEFsaWduOiB0ZXh0YWxpZ24sXFxuICAgICAgICAgICAgY2xzOiBcXFwicGxheWxpc3RcXFwiLFxcbiAgICAgICAgICB9KSovXFxuICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IHVpZCxcXG4gICAgICAgICAgICBibG9ja1J1bGVzOiBbJ2JiLioucG5nJywgJy5qcGcnLCBcXFwiaG1cXFxcLmJhaWR1XFxcXC5jb21cXFxcL2htLmpzXFxcIl0sXFxuICAgICAgICAgICAgdmlkZW9FeGNsdWRlUnVsZXM6IFsnP3VybD0nXSxcXG4gICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgdGV4dEFsaWduOiB0ZXh0YWxpZ24sXFxuICAgICAgICAgICAgY2xzOiBcXFwicGxheWxpc3RcXFwiLFxcbiAgICAgICAgICB9XFxuICAgICAgICB9O1xcbiAgICAgIH0pO1xcbiAgICAgIHBsYXlvYmogPSAkLnNwbGl0QXJyYXlCeVJhbmdlcyhwbGF5b2JqLCBwYWdlcyk7XFxuICAgICAgcmV0dXJuIHBsYXlvYmo7XFxuICAgIH0pO1xcbiAgfSBlbHNlIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxuICAgIH0sIHtcXG4gICAgICB0aXRsZTogXFxcIuaaguaXoOaSreaUvua6kOaIluaSreaUvuWIl+ihqOWumuS9jemUmeivr1xcXCIsXFxuICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICB1cmw6IE1ZX1BBUkFNUy52b2RJZCxcXG4gICAgfSk7XFxuICAgIGNhY2hlU2hvd1RpcHMoKTtcXG4gICAgc2V0UmVzdWx0KGQpO1xcbiAgfVxcblxcblxcbiAgbGV0IGN1cnJlbnRMb2NhdGlvbiA9IDA7XFxuXFxuICBmdW5jdGlvbiByZW5vdmF0ZUxpc3QobG9jYXRpb24pIHtcXG4gICAgLy9kZWxldGVJdGVtQnlDbHMoXFxcInBsYXlwYWdlXFxcIik7XFxuICAgIGRlbGV0ZUl0ZW1CeUNscyhcXFwicGxheWxpc3RcXFwiKTtcXG4gICAgaWYgKHBsYXlVcmxMaXN0Lmxlbmd0aCA9PSAwKSB7XFxuICAgICAgcmV0dXJuO1xcbiAgICB9XFxuICAgIGxldCBwYWdlbnVtID0gZ2V0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBcXFwiMFxcXCIpO1xcbiAgICBsZXQgcGNvdW50ID0gcGxheVVybExpc3RbbG9jYXRpb25dLmxlbmd0aDtcXG4gICAgbGV0IGxpc3QgPSBwbGF5VXJsTGlzdFtsb2NhdGlvbl1bcGFnZW51bV07XFxuICAgIGlmICghbGlzdCkge1xcbiAgICAgIGZvciAobGV0IGkgPSBwYWdlbnVtOyBpID49IDA7IGktLSkge1xcbiAgICAgICAgbGlzdCA9IHBsYXlVcmxMaXN0W2xvY2F0aW9uXVtpXTtcXG4gICAgICAgIGlmIChsaXN0KSB7XFxuICAgICAgICAgIHBhZ2VudW0gPSBpO1xcbiAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgICB9XFxuICAgIH1cXG4gICAgaWYgKGdldE15VmFyKFxcXCJzb3J0aVxcXCIsIFxcXCIwXFxcIikgPT0gMSkge1xcbiAgICAgIGxpc3QucmV2ZXJzZSgpO1xcbiAgICB9XFxuICAgICQuZXh0ZW5kKHtcXG4gICAgICB0ZW1wX2xpc3Q6IHBsYXlVcmxMaXN0W2xvY2F0aW9uXSxcXG4gICAgfSlcXG4gICAgbGV0IHBsYXlwID0gcGxheXBhZ2VzW2xvY2F0aW9uXTtcXG5cXG4gICAgaWYgKHBsYXlwICYmIHBsYXlwLmxlbmd0aCA+IDEpIHtcXG4gICAgICBsZXQgdGVtcCA9IHtcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF8xJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgIGNsczogXFxcInBsYXlwYWdlXFxcIlxcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgICBsZXQgcGFnZWFyciA9IHBsYXlwLm1hcCgoeCwgaSkgPT4gaSA9PSBwYWdlbnVtID8gJ+KAnOKAnOKAneKAnScgKyB4LmZvbnRjb2xvcihcXFwicmVkXFxcIikgOiB4KTtcXG4gICAgICBkZWxldGVJdGVtQnlDbHMoXFxcInBsYXlwYWdlXFxcIilcXG4gICAgICBhZGRJdGVtQWZ0ZXIoXFxcInBsYXlwYWdlbGluZVxcXCIsIFt7XFxuICAgICAgICB0aXRsZTogJ+S4iuS4gOmhtScsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfNFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGxvY2F0aW9uLCBwY291bnQpID0+IHtcXG4gICAgICAgICAgbGV0IHBhZ2VudW0gPSBnZXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgIGlmIChwYWdlbnVtID09IDApIHtcXG4gICAgICAgICAgICBwYWdlbnVtID0gcGNvdW50IC0gMTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBwYWdlbnVtLS07XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgcHV0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBTdHJpbmcocGFnZW51bSkpO1xcbiAgICAgICAgICBHTS5nZXQoXFxcInJlbm92YXRlTGlzdFxcXCIsICgpID0+IHsgfSkobG9jYXRpb24pO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgbG9jYXRpb24sIHBjb3VudCksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBjbHM6IFxcXCJwbGF5cGFnZVxcXCJcXG4gICAgICAgIH1cXG4gICAgICB9LCB7XFxuICAgICAgICB0aXRsZTogcGxheXBbcGFnZW51bV0sXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgICB1cmw6ICQocGFnZWFyciwgMykuc2VsZWN0KChsb2NhdGlvbikgPT4ge1xcbiAgICAgICAgICBwdXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFN0cmluZyhNWV9JTkRFWCkpO1xcbiAgICAgICAgICBHTS5nZXQoXFxcInJlbm92YXRlTGlzdFxcXCIsICgpID0+IHsgfSkobG9jYXRpb24pO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICB9LCBsb2NhdGlvbiksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBjbHM6IFxcXCJwbGF5cGFnZVxcXCJcXG4gICAgICAgIH1cXG4gICAgICB9LCB7XFxuICAgICAgICB0aXRsZTogJ+S4i+S4gOmhtScsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfNFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGxvY2F0aW9uLCBwY291bnQpID0+IHtcXG4gICAgICAgICAgbGV0IHBhZ2VudW0gPSBnZXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgIGlmIChwYWdlbnVtID49IHBjb3VudCAtIDEpIHtcXG4gICAgICAgICAgICBwYWdlbnVtID0gMDtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBwYWdlbnVtKys7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgcHV0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBTdHJpbmcocGFnZW51bSkpO1xcbiAgICAgICAgICBHTS5nZXQoXFxcInJlbm92YXRlTGlzdFxcXCIsICgpID0+IHsgfSkobG9jYXRpb24pO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgbG9jYXRpb24sIHBjb3VudCksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBjbHM6IFxcXCJwbGF5cGFnZVxcXCJcXG4gICAgICAgIH1cXG4gICAgICB9XSlcXG4gICAgICAvKnBsYXlwID0gcGxheXAubWFwKCh4LCBpKSA9PiB7XFxuICAgICAgICAgbGV0IG9iaiA9IE9iamVjdC5hc3NpZ24oe30sIHRlbXAsIHtcXG4gICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIChwYWdlbnVtID09IGkgPyB4LmZvbnRjb2xvcihcXFwicmVkXFxcIikgOiB4KSxcXG4gICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSkgPT4ge1xcbiAgICAgICAgICAgICBpZiAoZ2V0TXlWYXIoXFxcInBhZ2VudW1cXFwiKSA9PSBpKSB7XFxuICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwYWdlbnVtXFxcIiwgU3RyaW5nKGkpKTtcXG4gICAgICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKFxcXCJwbGF5bGlzdFxcXCIpO1xcbiAgICAgICAgICAgICBhZGRJdGVtQWZ0ZXIoXFxcInBsYXlsaXN0c1xcXCIsICQudGVtcF9saXN0W2ldKTtcXG4gICAgICAgICAgICAgZmluZEl0ZW1zQnlDbHMoXFxcInBsYXlwYWdlXFxcIikuZm9yRWFjaCgoeCwgaWkpID0+IHtcXG4gICAgICAgICAgICAgICBsZXQgdGl0bGUgPSB4LnRpdGxlLnJlcGxhY2UoL+KAmHzigJl84oCcfOKAnXw8W14+XSs+L2csIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICBpZiAoaWkgPT0gaSkge1xcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSAn4oCc4oCc4oCd4oCdJyArIHRpdGxlLmZvbnRjb2xvcihcXFwicmVkXFxcIik7XFxuICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oeC5leHRyYS5pZCwge1xcbiAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICB9LCBpKSxcXG4gICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHt9LCB0ZW1wLmV4dHJhLCB7XFxuICAgICAgICAgICAgIGlkOiBcXFwicGFnZW51bVxcXCIgKyBpLFxcbiAgICAgICAgICAgfSlcXG4gICAgICAgICB9KVxcbiAgICAgICAgIHJldHVybiBvYmo7XFxuICAgICAgIH0pXFxuICAgICAgIGFkZEl0ZW1BZnRlcihcXFwicGxheXBhZ2VsaW5lXFxcIiwgcGxheXApKi9cXG4gICAgfVxcbiAgICBpZiAobGlzdCkge1xcbiAgICAgIGFkZEl0ZW1BZnRlcihcXFwicGxheWxpc3RzXFxcIiwgbGlzdCk7XFxuICAgIH1cXG4gICAgdXBkYXRlSXRlbShcXFwibG9jYXRpb25AXFxcIiArIGN1cnJlbnRMb2NhdGlvbiwge1xcbiAgICAgIHRpdGxlOiBmcm9tW2N1cnJlbnRMb2NhdGlvbl0sXFxuICAgIH0pO1xcbiAgICB1cGRhdGVJdGVtKFxcXCJsb2NhdGlvbkBcXFwiICsgbG9jYXRpb24sIHtcXG4gICAgICB0aXRsZTogXFxcIuKAnOKAnFxcXCIgKyBmcm9tW2xvY2F0aW9uXSArIFxcXCLigJ3igJ1cXFwiLFxcbiAgICB9KTtcXG4gICAgY3VycmVudExvY2F0aW9uID0gbG9jYXRpb247XFxuICB9XFxuXFxuICBHTS5wdXQoXFxcInJlbm92YXRlTGlzdFxcXCIsIHJlbm92YXRlTGlzdCk7XFxuICBkLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImJpZ19ibGFua19ibG9ja1xcXCJcXG4gIH0pO1xcbiAgaWYgKGZyb20ubGVuZ3RoKSB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgY29sX3R5cGU6IFxcXCJiaWdfYmxhbmtfYmxvY2tcXFwiLFxcbiAgICB9KVxcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiBzb3J0b2JqW3NvcnRpXSxcXG4gICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHNvKSA9PiB7XFxuICAgICAgICBsZXQgc2kgPSBnZXRNeVZhcihcXFwic29ydGlcXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgbGV0IGlpID0gKHNpID09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIik7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJAc29ydFxcXCIsIHtcXG4gICAgICAgICAgdGl0bGU6IHNvW2lpXVxcbiAgICAgICAgfSlcXG4gICAgICAgIHZhciBwbGF5cyA9IGZpbmRJdGVtc0J5Q2xzKFxcXCJwbGF5bGlzdFxcXCIpLnJldmVyc2UoKS5tYXAoeCA9PiB7XFxuICAgICAgICAgIHguY29sX3R5cGUgPSB4LnR5cGU7XFxuICAgICAgICAgIHJldHVybiB4O1xcbiAgICAgICAgfSk7XFxuICAgICAgICBkZWxldGVJdGVtQnlDbHMoXFxcInBsYXlsaXN0XFxcIik7XFxuICAgICAgICBhZGRJdGVtQWZ0ZXIoXFxcInBsYXlsaXN0c1xcXCIsIHBsYXlzKTtcXG5cXG4gICAgICAgIHB1dE15VmFyKFxcXCJzb3J0aVxcXCIsIGlpKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSwgc29ydG9iaiksXFxuICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IFxcXCJAc29ydFxcXCIsXFxuICAgICAgfVxcbiAgICB9KVxcbiAgICBmb3IgKGxldCBpIGluIGZyb20pIHtcXG4gICAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGZyb21baV0sXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGksIGlkKSA9PiB7XFxuICAgICAgICAgIGlmIChnZXRNeVZhcihpZCArIFxcXCJzb3VyY2VpXFxcIiwgXFxcIjBcXFwiKSA9PSBpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBwdXRNeVZhcihpZCArIFxcXCJzb3VyY2VpXFxcIiwgU3RyaW5nKGkpKTtcXG4gICAgICAgICAgR00uZ2V0KFxcXCJyZW5vdmF0ZUxpc3RcXFwiLCAoKSA9PiB7IH0pKGkpO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgaSwgaWQpLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgaWQ6IFxcXCJsb2NhdGlvbkBcXFwiICsgaVxcbiAgICAgICAgfSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG4gICAgICB9KTtcXG4gICAgfVxcbiAgfVxcbiAgLy9jb25zb2xlLmxvZyhwbGF5VXJsTGlzdCk7XFxuICAvKmlmIChwbGF5VXJsTGlzdC5sZW5ndGgpIHtcXG4gICAgdmFyIGVqb2JqID0ge1xcbiAgICAgIFxcXCJsaXN0XFxcIjogcGxheVVybExpc3QsXFxuICAgICAgXFxcInRhYlxcXCI6IGZyb20ubWFwKCh4LCBpKSA9PiBmcm9tW2ldKVxcbiAgICB9O1xcbiAgICDliJ3lp4vljJYoZCwgZWpvYmopXFxuICB9IGVsc2Uge1xcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiBcXFwi5pqC5peg5pKt5pS+5rqQXFxcIixcXG4gICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxuICAgICAgdXJsOiBNWV9QQVJBTVMudm9kSWQsXFxuICAgIH0pO1xcbiAgfSovXFxuXFxuICBkLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICBpZDogXFxcInBsYXlwYWdlbGluZVxcXCJcXG4gICAgfVxcbiAgfSlcXG5cXG5cXG4gIGQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgaWQ6IFxcXCJwbGF5bGlzdHNcXFwiXFxuICAgIH1cXG4gIH0pO1xcblxcbiAgZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgaWQ6IFxcXCJwbGF5bGlzdHNFTkRcXFwiXFxuICAgIH1cXG4gIH0pO1xcbiAgY2FjaGVTaG93VGlwcygpO1xcbiAgc2V0UmVzdWx0KGQpO1xcbiAgcmVub3ZhdGVMaXN0KGdldE15VmFyKGlkICsgXFxcInNvdXJjZWlcXFwiLCBcXFwiMFxcXCIpKTtcXG59KSgpXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop6PmnpDmlofku7ZcIixcInBhdGhcIjpcImNvbmZpZ3NcIixcInJ1bGVcIjpcImNvbnN0IHBhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9Mb3lEZ0lrL3BhcnNlcy5qc29uXFxcIjtcXG5sZXQgZGF0YTtcXG5cXG5mdW5jdGlvbiBnZXRKc29uKCkge1xcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xcbiAgICAgICAgcmV0dXJuIGRhdGE7XFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHJlYWRGaWxlKHBhdGgpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBkZWxldGVGaWxlKHBhdGgpO1xcbiAgICAgICAgZGF0YSA9IFtdO1xcbiAgICB9XFxuICAgIHJldHVybiBkYXRhO1xcbn1cXG5cXG5mdW5jdGlvbiBzYXZlSnNvbihqc29uKSB7XFxuICAgIHNhdmVGaWxlKHBhdGgsIEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0VXNlZnVsSnNvbigpIHtcXG4gICAgcmV0dXJuIGdldEpzb24oKS5maWx0ZXIodiA9PiAhdi5mb3JiaWRkZW4pO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRGb3JiaWRkZW5Kc29uKCkge1xcbiAgICByZXR1cm4gZ2V0SnNvbigpLmZpbHRlcih2ID0+IHYuZm9yYmlkZGVuKTtcXG59XFxuXFxuJC5leHBvcnRzID0ge1xcbiAgICBnZXRKc29uLFxcbiAgICBzYXZlSnNvbixcXG4gICAgZ2V0VXNlZnVsSnNvbixcXG4gICAgZ2V0Rm9yYmlkZGVuSnNvbixcXG4gICAgcGF0aCxcXG59O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Kej5p6Q566h55CGXCIsXCJwYXRoXCI6XCJydWxlTWFuYWdlXCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcbnNldFBhZ2VUaXRsZShcXFwi6Kej5p6Q566h55CGXFxcIik7XFxubGV0IGNvbmZpZ3MgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKTtcXG5sZXQgYXJyID0gY29uZmlncy5nZXRKc29uKCk7XFxubGV0IGxlbmd0aCA9IGFyci5sZW5ndGg7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmlrDlop5cXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcnVsZUVkaXQjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCNcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2RvbWFpbl9jb25maWdcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgcGFnZVRpdGxlOiBcXFwi5paw5aKe6Kej5p6QXFxcIlxcbiAgICB9XFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLliIbkuqtcXFwiLFxcbiAgICB1cmw6ICQoXFxcIi0xXFxcIiwgXFxcIui+k+WFpeS9oOimgeWIhuS6q+ino+aekOeahOW6j+WPt1xcXFxuLTHlhajpg6jvvIwtMuW3suWQr+eUqOeahO+8jC0z5bey56aB55So55qEXFxcIikuaW5wdXQoKGxlbmd0aCkgPT4ge1xcbiAgICAgICAgbGV0IGluZGV4YyA9IGlucHV0LnNwbGl0KC8sfO+8jC8pO1xcbiAgICAgICAgbGV0IGluZGV4cyA9IFtdO1xcbiAgICAgICAgbGV0IG1vID0gcGFyc2VJbnQoaW5kZXhjWzBdKTtcXG4gICAgICAgIGlmICghKGluZGV4Yy5sZW5ndGggIT09IDAgJiYgbW8gPCAwICYmIG1vID4gLTUpKSB7XFxuICAgICAgICAgICAgZm9yIChsZXQgaXQgb2YgaW5kZXhjKSB7XFxuICAgICAgICAgICAgICAgIGxldCBudW0gPSBwYXJzZUludChpdCk7XFxuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4obnVtKSB8fCBudW0gPj0gbGVuZ3RoIHx8IG51bSA8IDApIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mlbDlrZfkuI3lkIjms5VcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGluZGV4cy5wdXNoKG51bSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuICQoW1xcXCJISUtFUlxcXCIsIFxcXCJUWFRcXFwiXS5jb25jYXQoZ2V0UGFzdGVzKCkpLCAyLCBcXFwi5YiG5Lqr5pa55byPXFxcIikuc2VsZWN0KChtbywgaW5kZXhzLCBleHQpID0+IHtcXG4gICAgICAgICAgICBmdW5jdGlvbiB1cChydWxlcykge1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZWI2NCA9IGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShydWxlcykpO1xcbiAgICAgICAgICAgICAgICBsZXQgZ2V0UGFzcyA9IChsZW5ndGgsIHJ1bGUsIHR5cGUpID0+IFxcXCLmtbfpmJTop4bnlYzvvIxEUlBZ6Kej5p6Q77yM5YWx44CMXFxcIiArIGxlbmd0aCArIFxcXCLjgI3mnaHvvIzlpI3liLbmlbTmnaHlj6Pku6TmiZPlvIDova/ku7blsLHkvJroh6rliqjlr7zlhaUkXFxcIiArIHJ1bGUgKyBcXFwiJFxcXCIgKyB0eXBlICsgXFxcIkBpbXBvcnQ9anM6JC5yZXF1aXJlKCdpbXBvcnQ/cnVsZT0nK1xcXCIgKyBKU09OLnN0cmluZ2lmeShNWV9SVUxFLnRpdGxlKSArIFxcXCIpKGlucHV0KVxcXCI7XFxuICAgICAgICAgICAgICAgIGlmIChnZXRQYXN0ZXMoKS5pbmNsdWRlcyhpbnB1dCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gc2hhcmVQYXN0ZShydWxlYjY0LCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgZ2V0UGFzcyhydWxlcy5sZW5ndGgsIHUsIFxcXCJiXFxcIik7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0xveURnSWsvc2hhcmUvZHJweeino+aekOOAjFxcXCIgKyBydWxlcy5sZW5ndGggKyBcXFwi44CN5p2hLlxcXCIgKyAoaW5wdXQgPT09IFxcXCJISUtFUlxcXCIgPyBcXFwiaGlrZXJcXFwiIDogXFxcInR4dFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGgsIGdldFBhc3MocnVsZXMubGVuZ3RoLCBydWxlYjY0LCBcXFwiYVxcXCIpKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwic2hhcmU6Ly9cXFwiICsgcGF0aDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgcnVsZXM7XFxuICAgICAgICAgICAgaWYgKG1vID09PSAtMSkge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vID09PSAtMikge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldFVzZWZ1bEpzb24oKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vID09PSAtMykge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEZvcmJpZGRlbkpzb24oKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKS5maWx0ZXIoKHYsIGkpID0+IGluZGV4cy5pbmNsdWRlcyhpKSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJ1bGVzID0gcnVsZXMubWFwKCh2KSA9PiB7XFxuICAgICAgICAgICAgICAgIHYuZm9yYmlkZGVuID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdjtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdXAocnVsZXMpO1xcbiAgICAgICAgfSwgbW8sIGluZGV4cywgaW5kZXhjWzFdKTtcXG5cXG4gICAgfSwgbGVuZ3RoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9zaGFyZV9ncmVlblxcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumHjee9rlxcXCIsXFxuICAgIHVybDogJChcXFwi5L2g56Gu5a6a6YeN572u77yfXFxcXG7or6Xmk43kvZzkvJrliKDpmaTnjrDmnInop6PmnpDvvIzmgaLlpI3oh6rluKbop6PmnpDjgIJcXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICBkZWxldGVGaWxlKHBhdGgpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikucGF0aCksXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fcmVmcmVzaFxcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIua4heepulxcXCIsXFxuICAgIHVybDogJChcXFwi5L2g56Gu5a6a5YWo6YOo5Yig6Zmk77yfXFxcXG7or6Xmk43kvZzkvJrliKDpmaTnjrDmnInop6PmnpDjgIJcXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICB3cml0ZUZpbGUocGF0aCwgXFxcIltdXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5wYXRoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9jb2RlX3ZpZXdcXFwiXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgLy90aXRsZTogJzxmb250IGNvbG9yPVxcXCIjMTNCNjFCXFxcIj7ilpAgPC9mb250PjxiPuino+aekOWIl+ihqDxiPiAoJyArIFN0cmluZyhsZW5ndGgpLmZvbnRjb2xvcihcXFwiI2ZmNjYwMVxcXCIpICsgXFxcIilcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxufSk7XFxubGV0IGNvdW50VGl0bGUgPSBkLmF0KC0xKTtcXG5cXG5cXG5sZXQgY291bnQgPSBkLmxlbmd0aDtcXG5cXG5mb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XFxuICAgIGxldCBpdCA9IGFycltpXTtcXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdWycgKyBpICsgJ108Yj4gICcgKyBpdC5uYW1lICsgKGl0LmZvcmJpZGRlbiA/IFxcXCIgI+KAnOKAnOemgeeUqOKAneKAnVxcXCIuc21hbGwoKSA6IFxcXCJcXFwiKSxcXG4gICAgICAgIGRlc2M6IGl0LnVybCxcXG4gICAgICAgIHVybDogJChbXFxcIue8lui+kVxcXCIsIFxcXCLliIbkuqtcXFwiLCBcXFwi56aB55SoL+WQr+eUqFxcXCIsIFxcXCLnp7vliqhcXFwiLCBcXFwi572u6aG2XFxcIiwgXFxcIuWIoOmZpFxcXCJdLCAxLCBcXFwi5pON5L2c77yaXFxcIiArIGl0Lm5hbWUpLnNlbGVjdCgoaW5kZXgsIGxlbmd0aCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gXFxcIue8lui+kVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcnVsZUVkaXQjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCNcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLliIbkuqtcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGxldCBvcHMgPSBnZXRQYXN0ZXMoKTtcXG4gICAgICAgICAgICAgICAgb3BzLnVuc2hpZnQoXFxcIuWujOaVtOWPo+S7pFxcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChvcHMsIDIsIFxcXCLliIbkuqvmlrnlvI9cXFwiKS5zZWxlY3QoKGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKVtpbmRleF07XFxuICAgICAgICAgICAgICAgICAgICBydWxlLnVzZXIgPSB1bmRlZmluZWQ7XFxuICAgICAgICAgICAgICAgICAgICBydWxlLmZvcmJpZGRlbiA9IHVuZGVmaW5lZDtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlYjY0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHJ1bGUpKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBnZXRQYXNzID0gKG5hbWUsIHJ1bGUsIHR5cGUpID0+IFxcXCLmtbfpmJTop4bnlYzvvIzjgIxcXFwiICsgbmFtZSArIFxcXCLjgI1EUlBZ6Kej5p6Q77yM5aSN5Yi25pW05p2h5Y+j5Luk5omT5byA6L2v5Lu25bCx5Lya6Ieq5Yqo5a+85YWlJFxcXCIgKyBydWxlICsgXFxcIiRcXFwiICsgdHlwZSArIFxcXCJAaW1wb3J0PWpzOiQucmVxdWlyZSgnaW1wb3J0P3J1bGU9JytcXFwiICsgSlNPTi5zdHJpbmdpZnkoTVlfUlVMRS50aXRsZSkgKyBcXFwiKShpbnB1dClcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0ID09IFxcXCLlrozmlbTlj6Pku6RcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIGdldFBhc3MocnVsZS5uYW1lLCBydWxlYjY0LCBcXFwiYVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IHNoYXJlUGFzdGUocnVsZWI2NCwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBnZXRQYXNzKHJ1bGUubmFtZSwgdSwgXFxcImJcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSwgaW5kZXgpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLnp7vliqhcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKGluZGV4ICsgXFxcIlxcXCIsIFxcXCLovpPlhaXkvY3nva5cXFwiKS5pbnB1dCgoaW5kZXgsIGxlbmd0aCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0luZGV4ID0gTnVtYmVyKGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4obmV3SW5kZXgpIHx8IG5ld0luZGV4ID49IGxlbmd0aCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kuI3lkozop4TnmoTkvY3nva5cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBydWxlcy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZXMuc3BsaWNlKG5ld0luZGV4LCAwLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKHJ1bGVzKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgfSwgaW5kZXgsIGxlbmd0aCk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIue9rumhtlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgbGV0IG5ld0luZGV4ID0gMDtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IHJ1bGVzLnNwbGljZShpbmRleCwgMSlbMF07XFxuICAgICAgICAgICAgICAgIHJ1bGVzLnNwbGljZShuZXdJbmRleCwgMCwgcnVsZSk7XFxuICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKHJ1bGVzKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLliKDpmaRcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLnoa7orqTliKDpmaTvvJ9cXFwiKS5jb25maXJtKChpbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBydWxlcy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24ocnVsZXMpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suWIoOmZpFxcXCIgKyBydWxlLm5hbWU7XFxuICAgICAgICAgICAgICAgIH0sIGluZGV4KTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBsZXQgYXJyID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IGFycltpbmRleF07XFxuICAgICAgICAgICAgICAgIHJ1bGUuZm9yYmlkZGVuID0gIXJ1bGUuZm9yYmlkZGVuO1xcbiAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyAocnVsZS5mb3JiaWRkZW4gPyBcXFwi56aB55SoXFxcIiA6IFxcXCLlkK/nlKhcXFwiKSArIHJ1bGUubmFtZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBpLCBsZW5ndGgpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpOiBpLFxcbiAgICAgICAgICAgIHBhZ2VUaXRsZTogaXQubmFtZVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG59XFxuY291bnRUaXRsZS50aXRsZSA9ICc8Zm9udCBjb2xvcj1cXFwiIzEzQjYxQlxcXCI+4paQIDwvZm9udD48Yj7op6PmnpDliJfooag8Yj4gKCcgKyAoKGQubGVuZ3RoIC0gY291bnQpICsgXFxcIi9cXFwiICsgbGVuZ3RoKS5mb250Y29sb3IoXFxcIiNmZjY2MDFcXFwiKSArIFxcXCIpXFxcIjtcXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop6PmnpDnvJbovpFcIixcInBhdGhcIjpcInJ1bGVFZGl0XCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcblxcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX25hbWVcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfdXJsXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX2ZsYWdcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfaGVhZGVyc1xcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19tZXRob2RcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfcnVuVHlwZVxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19qc29uUGF0aFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19qc1xcXCIpO1xcbn0pKTtcXG5sZXQgdXJsSW5kZXggPSBwYXJzZUludChnZXRQYXJhbShcXFwiaW5kZXhcXFwiLCBcXFwiXFxcIikpO1xcbnVybEluZGV4ID0gTnVtYmVyLmlzTmFOKHVybEluZGV4KSA/IHZvaWQoMCkgOiB1cmxJbmRleDtcXG5sZXQgaW5kZXggPSB2b2lkKDApID09PSB1cmxJbmRleCA/IE1ZX1BBUkFNUy5pIDogdXJsSW5kZXg7XFxubGV0IGlzSW1wb3J0ID0gISFnZXRQYXJhbShcXFwiaXNJbXBvcnRcXFwiLCBcXFwiXFxcIik7XFxubGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG5sZXQgb2JqO1xcbmlmIChpc0ltcG9ydCkge1xcbiAgICB0cnkge1xcbiAgICAgICAgb2JqID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS9qaWV4aVNpbXBsZUltcG9ydC5qc29uXFxcIik7XFxuICAgICAgICBsZXQgdGlwID0gaW5kZXggIT09IHZvaWQoMCkgPyBcXFwi5pu05paw6Kej5p6QXFxcIiA6IFxcXCLlr7zlhaXop6PmnpBcXFwiO1xcbiAgICAgICAgc2V0UGFnZVRpdGxlKHRpcCArIFxcXCI6XFxcIiArIG9iai5uYW1lKTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJjigJhcXFwiICsgdGlwICsgXFxcIuKAmeKAmVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG5cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgb2JqID0ge307XFxuICAgICAgICBiYWNrKCk7XFxuICAgICAgICB0b2FzdChcXFwi5a+85YWl6ZSZ6K+vXFxcIik7XFxuICAgIH1cXG59IGVsc2UgaWYgKGluZGV4ICE9PSB2b2lkKDApKSB7XFxuICAgIG9iaiA9IGFycltpbmRleF07XFxuICAgIHNldFBhZ2VUaXRsZShcXFwi57yW6L6R6Kej5p6QOlxcXCIgKyBvYmoubmFtZSk7XFxufSBlbHNlIHtcXG4gICAgb2JqID0ge1xcbiAgICAgICAgcnVuVHlwZTogXFxcIldFQlxcXCIsXFxuICAgICAgICBtZXRob2Q6IFxcXCJHRVRcXFwiXFxuICAgIH07XFxuICAgIHNldFBhZ2VUaXRsZShcXFwi5paw5bu66Kej5p6QXFxcIik7XFxufVxcblxcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5ZCN5a2XKOW/heWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19uYW1lXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5uYW1lLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuXFxuXFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLop6PmnpB1cmwo5b+F5aGrKVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX3VybFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBvYmoudXJsLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwiZmxhZyjlv4XloaspXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6IDIsXFxuICAgICAgICBoaWdobGlnaHQ6IHRydWUsXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX2ZsYWdcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLmZsYWcsXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCJoZWFkZXJzKOmAieWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDogMixcXG4gICAgICAgIGhpZ2hsaWdodDogdHJ1ZSxcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfaGVhZGVyc1xcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBvYmouaGVhZGVycyxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgIH1cXG59KTtcXG5cXG5wdXRNeVZhcihcXFwicHNfcnVuVHlwZVxcXCIsIG9iai5ydW5UeXBlIHx8IFxcXCJcXFwiKTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuino+aekOaooeW8j++8mlxcXCIgKyAob2JqLnJ1blR5cGUgfHwgXFxcIldFQlxcXCIpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB1cmw6ICQoW1xcXCJXRUJcXFwiLCBcXFwiSlNPTlxcXCIsIFxcXCJKU1xcXCJdKS5zZWxlY3QoKCkgPT4ge1xcblxcbiAgICAgICAgcHV0TXlWYXIoXFxcInBzX3J1blR5cGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJwc19ydW5UeXBlXFxcIiwge1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi6Kej5p6Q5qih5byP77yaXFxcIiArIGlucHV0XFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0pLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IFxcXCJwc19ydW5UeXBlXFxcIixcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuXFxuXFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwianNvblBhdGgoSlNPTuino+aekOaooeW8j+W/heWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19qc29uUGF0aFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBvYmouanNvblBhdGgsXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICB9XFxufSk7XFxucHV0TXlWYXIoXFxcInBzX21ldGhvZFxcXCIsIG9iai5tZXRob2QgfHwgXFxcIlxcXCIpO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiSlNPTuivt+axguaooeW8j++8mlxcXCIgKyAob2JqLm1ldGhvZCB8fCBcXFwiR0VUXFxcIiksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiAkKFtcXFwiR0VUXFxcIiwgXFxcIlBPU1RcXFwiXSkuc2VsZWN0KCgpID0+IHtcXG5cXG4gICAgICAgIHB1dE15VmFyKFxcXCJwc19tZXRob2RcXFwiLCBpbnB1dCk7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJwc19tZXRob2RcXFwiLCB7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCJKU09O6K+35rGC5qih5byP77yaXFxcIiArIGlucHV0XFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0pLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IFxcXCJwc19tZXRob2RcXFwiLFxcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCJqcyhKU+aooeW8j+W/heWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDogMyxcXG4gICAgICAgIGhpZ2hsaWdodDogdHJ1ZSxcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfanNcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLmpzLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWIoOmZpFxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaW5kZXgsIHVybEluZGV4KSA9PiB7XFxuICAgICAgICBpZiAoaW5kZXggPT09IHZvaWQoMCkpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5q2k6aG55peg5rOV5Yig6ZmkXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh1cmxJbmRleCAhPT0gdm9pZCgwKSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjmm7TmlrDop6PmnpDvvIzliKDpmaTor7fku47op6PmnpDnrqHnkIbov5vlhaVcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgY29uZmlybSh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLmuKnppqjmj5DnpLpcXFwiLFxcbiAgICAgICAgICAgIGNvbnRlbnQ6IFxcXCLnoa7lrpropoHliKDpmaTmraTop6PmnpDlkJfvvJ/ms6jmhI/liKDpmaTlkI7ml6Dms5XmgaLlpI1cXFwiLFxcbiAgICAgICAgICAgIGNvbmZpcm06ICQudG9TdHJpbmcoKGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDEpO1xcbiAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgICAgICAgICBiYWNrKHRydWUpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9LCBpbmRleClcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCBpbmRleCwgdXJsSW5kZXgpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmtYvor5VcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgbGV0IHRlc3RLZXl3b3JkID0gZ2V0SXRlbShcXFwidGVzdFVybFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIHJldHVybiAkKHRlc3RLZXl3b3JkLCBcXFwi6K+36L6T5YWl5b2x6KeG572R56uZ5Zyw5Z2AXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcInRlc3RVcmxcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgbGV0IHVybCA9IGdldE15VmFyKFxcXCJwc191cmxcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgbGV0IG5hbWUgPSBnZXRNeVZhcihcXFwicHNfbmFtZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBsZXQgZmxhZyA9IGdldE15VmFyKFxcXCJwc19mbGFnXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGxldCBoZWFkZXJzID0gZ2V0TXlWYXIoXFxcInBzX2hlYWRlcnNcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgbGV0IHJ1blR5cGUgPSBnZXRNeVZhcihcXFwicHNfcnVuVHlwZVxcXCIsIFxcXCJXRUJcXFwiKTtcXG4gICAgICAgICAgICBsZXQgbWV0aG9kID0gZ2V0TXlWYXIoXFxcInBzX21ldGhvZFxcXCIsIFxcXCJHRVRcXFwiKTtcXG4gICAgICAgICAgICBsZXQganNvblBhdGggPSBnZXRNeVZhcihcXFwicHNfanNvblBhdGhcXFwiLCBcXFwiXFxcIikudHJpbSgpIHx8IHZvaWQgMDtcXG4gICAgICAgICAgICBsZXQganMgPSBnZXRNeVZhcihcXFwicHNfanNcXFwiLCBcXFwiXFxcIikgfHwgdm9pZCAwO1xcbiAgICAgICAgICAgIGlmIChoZWFkZXJzKSB7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzID0gSlNPTi5wYXJzZShoZWFkZXJzKTtcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoZWFkZXJz5qC85byP6ZSZ6K+vOlxcXCIgKyBlLnRvU3RyaW5nKCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwidmlkZW9VcmxcXFwiKS5wcmVwYXJlUGFyc2VzKFt7XFxuICAgICAgICAgICAgICAgIG5hbWUsXFxuICAgICAgICAgICAgICAgIHVybCxcXG4gICAgICAgICAgICAgICAgZmxhZyxcXG4gICAgICAgICAgICAgICAgaGVhZGVycyxcXG4gICAgICAgICAgICAgICAgcnVuVHlwZSxcXG4gICAgICAgICAgICAgICAgbWV0aG9kLFxcbiAgICAgICAgICAgICAgICBqc29uUGF0aCxcXG4gICAgICAgICAgICAgICAganNcXG4gICAgICAgICAgICB9XSwgaW5wdXQsbnVsbCwgdHJ1ZSk7XFxuICAgICAgICB9KTtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIixcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuS/neWtmFxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaW5kZXgsIGlzSW1wb3J0KSA9PiB7XFxuICAgICAgICBsZXQgbmFtZSA9IGdldE15VmFyKFxcXCJwc19uYW1lXFxcIiwgXFxcIlxcXCIpLnRyaW0oKTtcXG4gICAgICAgIGlmICghbmFtZSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lkI3lrZflvpfmnInkuIDkuKrlkKdcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHVybCA9IGdldE15VmFyKFxcXCJwc191cmxcXFwiLCBcXFwiXFxcIikudHJpbSgpO1xcbiAgICAgICAgaWYgKCF1cmwpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6Kej5p6Q5Zyw5Z2A5LiN6IO95Li656m6XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBmbGFnID0gZ2V0TXlWYXIoXFxcInBzX2ZsYWdcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoIWZsYWcpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6Kej5p6Q5Zyw5Z2A5qCH6K+G5LiN6IO95Li656m6XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBoZWFkZXJzID0gZ2V0TXlWYXIoXFxcInBzX2hlYWRlcnNcXFwiLCBcXFwiXFxcIikudHJpbSgpO1xcbiAgICAgICAgaWYgKGhlYWRlcnMpIHtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzID0gSlNPTi5wYXJzZShoZWFkZXJzKTtcXG4gICAgICAgICAgICAgICAgaWYodHlwZW9mIGhlYWRlcnMhPT1cXFwib2JqZWN0XFxcIikgdGhyb3cgbmV3IEVycm9yKFxcXCLplJnor6/nsbvlnovvvIzlv4XpobvkuLpPYmplY3RcXFwiKTtcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGVhZGVyc+agvOW8j+mUmeivrzpcXFwiICsgZS50b1N0cmluZygpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBydW5UeXBlID0gZ2V0TXlWYXIoXFxcInBzX3J1blR5cGVcXFwiLCBcXFwiV0VCXFxcIik7XFxuICAgICAgICBsZXQgbWV0aG9kID0gZ2V0TXlWYXIoXFxcInBzX21ldGhvZFxcXCIsIFxcXCJHRVRcXFwiKTtcXG4gICAgICAgIGxldCBqc29uUGF0aCA9IGdldE15VmFyKFxcXCJwc19qc29uUGF0aFxcXCIsIFxcXCJcXFwiKS50cmltKCkgfHwgdm9pZCAwO1xcbiAgICAgICAgbGV0IGpzID0gZ2V0TXlWYXIoXFxcInBzX2pzXFxcIiwgXFxcIlxcXCIpIHx8IHZvaWQgMDtcXG4gICAgICAgIGlmIChydW5UeXBlID09PSBcXFwiSlNPTlxcXCIgJiYgIWpzb25QYXRoKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL0pTT07mqKHlvI/kuIvlv4Xpobvloatqc29uUGF0aFxcXCI7XFxuICAgICAgICB9IGVsc2UgaWYgKHJ1blR5cGUgPT09IFxcXCJKU1xcXCIgJiYgIWpzKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL0pT5qih5byP5LiL5b+F6aG75aGranNcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgIGxldCBvYmoxID0ge1xcbiAgICAgICAgICAgIG5hbWUsXFxuICAgICAgICAgICAgdXJsLFxcbiAgICAgICAgICAgIGZsYWcsXFxuICAgICAgICAgICAgaGVhZGVycyxcXG4gICAgICAgICAgICBydW5UeXBlLFxcbiAgICAgICAgICAgIG1ldGhvZCxcXG4gICAgICAgICAgICBqc29uUGF0aCxcXG4gICAgICAgICAgICBqc1xcbiAgICAgICAgfTtcXG4gICAgICAgIGlmIChpbmRleCA9PT0gdm9pZCgwKSkge1xcbiAgICAgICAgICAgIGlmIChhcnIuc29tZSh2ID0+IHYubmFtZSA9PT0gbmFtZSkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3sue7j+WtmOWcqOivpeino+aekFxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChvYmoxLmdyb3VwKSB7XFxuICAgICAgICAgICAgICAgIGxldCBncm91cCA9IG9iajEuZ3JvdXA7XFxuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGFyci5maW5kSW5kZXgodiA9PiB2Lmdyb3VwID09PSBncm91cCk7XFxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgICAgIGFyci51bnNoaWZ0KG9iajEpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgYXJyLnNwbGljZShpbmRleCwgMCwgb2JqMSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBpZiAoaXNJbXBvcnQpIHtcXG4gICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKG9iajEpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgYXJyLnVuc2hpZnQob2JqMSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGxldCBuYW1leSA9IGFycltpbmRleF0ubmFtZTtcXG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gbmFtZXkpIHtcXG4gICAgICAgICAgICAgICAgaWYgKGFyci5zb21lKHYgPT4gdi5uYW1lID09PSBuYW1lKSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3sue7j+WtmOWcqOivpeino+aekFxcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgb2JqMSA9IE9iamVjdC5hc3NpZ24oYXJyW2luZGV4XSwgb2JqMSk7XFxuICAgICAgICAgICAgYXJyLnNwbGljZShpbmRleCwgMSwgb2JqMSk7XFxuICAgICAgICB9XFxuICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgYmFjayh0cnVlKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv53lrZjmiJDlip9cXFwiO1xcbiAgICB9LCBpbmRleCwgaXNJbXBvcnQpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxufSk7XFxuXFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6KeE5YiZ5a+85YWlXCIsXCJwYXRoXCI6XCJpbXBvcnRcIixcInJ1bGVcIjpcImpzOlxcbmZ1bmN0aW9uIHNhdmVDYWNoZShqc29uKSB7XFxuICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9fY2FjaGUvamlleGlTaW1wbGVJbXBvcnQuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG59XFxuXFxuZnVuY3Rpb24gaW1wb3J0UGFyc2UocGFzcykge1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IFtfLCBydWxlLCB0eXBlXSA9IHBhc3Muc3BsaXQoXFxcIiRcXFwiKTtcXG4gICAgICAgIGlmICh0eXBlID09PSBcXFwiYlxcXCIpIHtcXG4gICAgICAgICAgICBydWxlID0gcGFyc2VQYXN0ZShydWxlKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBydWxlcyA9IEpTT04ucGFyc2UoYmFzZTY0RGVjb2RlKHJ1bGUpKTtcXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShydWxlcykpIHtcXG4gICAgICAgICAgICBydWxlcyA9IFtydWxlc107XFxuICAgICAgICB9XFxuICAgICAgICAvL3J1bGVzLnJldmVyc2UoKTtcXG4gICAgICAgIE1ZX1VSTCA9IG1vZHVsZS5pZDtcXG4gICAgICAgIGxldCBydWxlVGl0bGUgPSBnZXRQYXJhbShcXFwicnVsZVxcXCIpO1xcbiAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlncz9ydWxlPVxcXCIgKyBydWxlVGl0bGUpLmdldEpzb24oKTtcXG4gICAgICAgIGxldCBuZXdJID0gMDtcXG4gICAgICAgIGZvciAobGV0IHJ1bGUgb2YgcnVsZXMpIHtcXG4gICAgICAgICAgICBsZXQgaW5kZXggPSBhcnIuZmluZEluZGV4KHYgPT4gdi5uYW1lID09PSBydWxlLm5hbWUpO1xcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGUgPSBPYmplY3QuYXNzaWduKGFycltpbmRleF0sIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgaWYgKHJ1bGVzLmxlbmd0aCA9PT0gMSkge1xcbiAgICAgICAgICAgICAgICAgICAgc2F2ZUNhY2hlKHJ1bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcnVsZUVkaXQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjP2lzSW1wb3J0PXRydWUmaW5kZXg9XFxcIiArIGluZGV4ICsgXFxcIiZydWxlPVxcXCIgKyBydWxlVGl0bGU7XFxuICAgICAgICAgICAgICAgICAgICAvL3RvYXN0KFxcXCLlt7Lmm7TmlrDop4TliJnvvJpcXFwiICsgcnVsZS5uYW1lKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhcXFwi5bey5pu05paw6KeE5YiZ77yaXFxcIiArIHJ1bGUubmFtZSlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIG5ld0krKztcXG4gICAgICAgICAgICAgICAgYXJyLnB1c2gocnVsZSk7XFxuICAgICAgICAgICAgICAgIGlmIChydWxlcy5sZW5ndGggPT09IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHNhdmVDYWNoZShydWxlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVFZGl0I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5Iz9pc0ltcG9ydD10cnVlJnJ1bGU9XFxcIiArIHJ1bGVUaXRsZTtcXG4gICAgICAgICAgICAgICAgICAgIC8vdG9hc3QoXFxcIuW3suWvvOWFpeinhOWIme+8mlxcXCIgKyBydWxlLm5hbWUpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKFxcXCLlt7Llr7zlhaXop4TliJnvvJpcXFwiICsgcnVsZS5uYW1lKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHJ1bGVzLmxlbmd0aCA+IDEpIHtcXG4gICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3M/cnVsZT1cXFwiICsgcnVsZVRpdGxlKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLmlrDlop7vvJpcXFwiICsgbmV3SSArIFxcXCIg6KaG55uW5pu05paw77yaXFxcIiArIChydWxlcy5sZW5ndGggLSBuZXdJKSk7XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgdG9hc3QoXFxcIuWvvOWFpeWksei0pVxcXCIpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGltcG9ydFJ1bGUocGFzcykge1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IFtfLCBydWxlLCBwbmFtZV0gPSBwYXNzLnNwbGl0KFxcXCIkXFxcIik7XFxuICAgICAgICBsZXQgcGF0aCA9IGdldFB1YmxpY0l0ZW0oXFxcIkRycHlIaWtlckBpbnB1dF9wYXRoXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgaWYgKCFwYXRoKSB7XFxuICAgICAgICAgICAgTVlfVVJMID0gbW9kdWxlLmlkO1xcbiAgICAgICAgICAgIGxldCBydWxlVGl0bGUgPSBnZXRQYXJhbShcXFwicnVsZVxcXCIpO1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLmnKrmjIflrprpu5jorqTkv53lrZjnm67lvZXvvIzor7flhYjorr7nva7kv53lrZjnm67lvZVcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9zaGFyZWRlZmF1bHRwYXRoI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9ydWxlPVxcXCIrcnVsZVRpdGxlO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJ1bGVzID0gYmFzZTY0RGVjb2RlKHBhcnNlUGFzdGUocnVsZSkpO1xcbiAgICAgICAgaWYgKCFydWxlcykgdG9hc3QoXFxcIuWGheWuueS4uuepuu+8jOWvvOWFpeWksei0pVxcXCIpO1xcbiAgICAgICAgcGF0aCA9IHBhdGguZW5kc1dpdGgoXFxcIi9cXFwiKSA/IHBhdGggOiAocGF0aCArIFxcXCIvXFxcIik7XFxuICAgICAgICB3cml0ZUZpbGUocGF0aCArIHBuYW1lLCBydWxlcyk7XFxuICAgICAgICB0b2FzdChcXFwi5a+85YWl5oiQ5Yqf6K+35Yi35paw6YWN572uXFxcIik7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIHRvYXN0KFxcXCLlr7zlhaXlpLHotKU6XFxcIiArIGUudG9TdHJpbmcoKSlcXG4gICAgfVxcbn1cXG4kLmV4cG9ydHMgPSBmdW5jdGlvbihwYXNzLCBtb2RlKSB7XFxuICAgIGlmIChtb2RlKSB7XFxuICAgICAgICByZXR1cm4gaW1wb3J0UnVsZShwYXNzKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiBpbXBvcnRQYXJzZShwYXNzKTtcXG4gICAgfVxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuinhumikeino+aekFwiLFwicGF0aFwiOlwidmlkZW9VcmxcIixcInJ1bGVcIjpcImZ1bmN0aW9uIGlzb2ZmaWNpYWwodXJsKSB7XFxuICBsZXQgZmxhZyA9IG5ldyBSZWdFeHAoJ3FxXFxcXC5jb218aXFpeWlcXFxcLmNvbXx5b3VrdVxcXFwuY29tfG1ndHZcXFxcLmNvbXxiaWxpYmlsaVxcXFwuY29tfHNvaHVcXFxcLmNvbXxpeGlndWFcXFxcLmNvbXxwcHR2XFxcXC5jb218bWlndXZpZGVvXFxcXC5jb218bGVcXFxcLmNvbXwxOTA1XFxcXC5jb218ZnVuXFxcXC50dicpO1xcbiAgcmV0dXJuIGZsYWcudGVzdCh1cmwpO1xcbn1cXG5cXG5mdW5jdGlvbiBwcm94eSh0aXRsZSkge1xcbiAgZnVuY3Rpb24gdG9QYXRoKHZhbHVlKSB7XFxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XFxuICAgICAgcmV0dXJuIFtdO1xcbiAgICB9XFxuICAgIGxldCBwYXRoID0gW107XFxuICAgIGxldCBjdXJyZW50ID0gJyc7XFxuICAgIGxldCBpbkJyYWNrZXRzID0gZmFsc2U7XFxuICAgIGxldCBlc2NhcGUgPSBmYWxzZTtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xcbiAgICAgIGxldCBjaGFyID0gdmFsdWVbaV07XFxuICAgICAgaWYgKGVzY2FwZSkge1xcbiAgICAgICAgY3VycmVudCArPSBjaGFyO1xcbiAgICAgICAgZXNjYXBlID0gZmFsc2U7XFxuICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnXFxcXFxcXFwnKSB7XFxuICAgICAgICBlc2NhcGUgPSB0cnVlO1xcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJy4nICYmICFpbkJyYWNrZXRzKSB7XFxuICAgICAgICBwYXRoLnB1c2goY3VycmVudCk7XFxuICAgICAgICBjdXJyZW50ID0gJyc7XFxuICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnWycpIHtcXG4gICAgICAgIGluQnJhY2tldHMgPSB0cnVlO1xcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ10nKSB7XFxuICAgICAgICBpbkJyYWNrZXRzID0gZmFsc2U7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIGN1cnJlbnQgKz0gY2hhcjtcXG4gICAgICB9XFxuICAgIH1cXG4gICAgaWYgKGN1cnJlbnQpIHtcXG4gICAgICBwYXRoLnB1c2goY3VycmVudCk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHBhdGg7XFxuICB9XFxuXFxuICBmdW5jdGlvbiBnZXRKc29uKG9iaiwgcGF0aCkge1xcbiAgICBpZiAoIW9iaiB8fCAhQXJyYXkuaXNBcnJheShwYXRoKSkge1xcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XFxuICAgIH1cXG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XFxuICAgICAgcmV0dXJuIG9iajtcXG4gICAgfVxcbiAgICBsZXQgY3VycmVudCA9IG9iajtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgbGV0IGtleSA9IHBhdGhbaV07XFxuICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjdXJyZW50ICE9PSAnb2JqZWN0Jykge1xcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcXG4gICAgICB9XFxuICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcXG4gICAgfVxcbiAgICByZXR1cm4gY3VycmVudDtcXG4gIH1cXG4gIHRyeSB7XFxuICAgIGxldCBydW5UeXBlID0gTVlfUEFSQU1TLnJ1blR5cGVbMF07XFxuICAgIGxldCB1cmwgPSBkZWNvZGVVUklDb21wb25lbnQoYmFzZTY0RGVjb2RlKE1ZX1BBUkFNUy51cmxbMF0pKTtcXG4gICAgaWYgKHJ1blR5cGUgPT0gXFxcIkpTT05cXFwiKSB7XFxuXFxuICAgICAgbGV0IHBhcmFtID0gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQoYmFzZTY0RGVjb2RlKE1ZX1BBUkFNUy5wYXJhbVswXSkpKTtcXG4gICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UocmVxdWVzdCh1cmwsIHtcXG4gICAgICAgIGhlYWRlcnM6IHBhcmFtLmhlYWRlcnMgfHwge30sXFxuICAgICAgICBtZXRob2Q6IHBhcmFtLm1ldGhvZCB8fCB2b2lkIDBcXG4gICAgICB9KSk7XFxuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgIHN0YXR1c0NvZGU6IDMwMixcXG4gICAgICAgIGhlYWRlcnM6IE9iamVjdC5hc3NpZ24oe30sIHBhcmFtLmhlYWRlcnMgfHwge30sIHtcXG4gICAgICAgICAgXFxcIkxvY2F0aW9uXFxcIjogZ2V0SnNvbihqc29uLCB0b1BhdGgocGFyYW0uanNvblBhdGgpKSxcXG4gICAgICAgIH0pXFxuICAgICAgfSk7XFxuICAgIH0gZWxzZSBpZiAocnVuVHlwZSA9PSBcXFwiSlNcXFwiKSB7XFxuXFxuICAgICAgbGV0IHBhcnNlO1xcbiAgICAgIGlmIChNWV9QQVJBTVMuaW5kZXgpIHtcXG4gICAgICAgIHBhcnNlID0gJC5yZXF1aXJlKFxcXCJjb25maWdzP3J1bGU9XFxcIiArIHRpdGxlKS5nZXRKc29uKClbTVlfUEFSQU1TLmluZGV4WzBdXTtcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgcGFyc2UgPSBKU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudChiYXNlNjREZWNvZGUoTVlfUEFSQU1TLnBhcmFtWzBdKSkpO1xcbiAgICAgIH1cXG4gICAgICBsZXQgcmVzID0gbmV3IEZ1bmN0aW9uKFxcXCJ1cmxcXFwiLCBcXFwic2VsZlxcXCIsIHBhcnNlLmpzKSh1cmwsIHBhcnNlKTtcXG4gICAgICBpZiAodHlwZW9mIHJlcyA9PT0gXFxcInN0cmluZ1xcXCIpIHtcXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgIHN0YXR1c0NvZGU6IDMwMixcXG4gICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgIFxcXCJMb2NhdGlvblxcXCI6IHJlc1xcbiAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICB9IGVsc2UgaWYgKCQudHlwZShyZXMpID09PSBcXFwib2JqZWN0XFxcIikge1xcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgc3RhdHVzQ29kZTogMzAyLFxcbiAgICAgICAgICBoZWFkZXJzOiByZXNcXG4gICAgICAgIH0pO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgfSBjYXRjaCAoZSkge1xcbiAgICBsb2coZS50b1N0cmluZygpKTtcXG4gIH1cXG59XFxuXFxuZnVuY3Rpb24gcHJlcGFyZVBhcnNlcyhwYXJzZXMsIHVybCwgcGxheWxpc3QsIGlzVGVzdCkge1xcbiAgcGxheWxpc3QgPSBwbGF5bGlzdCB8fCB7XFxuICAgIHVybHM6IFtdLFxcbiAgICBuYW1lczogW10sXFxuICAgIGhlYWRlcnM6IFtdLFxcbiAgICBpczogXFxcIiNpc1ZpZGVvPXRydWUjXFxcIixcXG4gIH07XFxuICBsZXQgcHJveHlVcmwgPSBzdGFydFByb3h5U2VydmVyKCQudG9TdHJpbmcocHJveHksIE1ZX1JVTEUudGl0bGUpKTtcXG4gIHBhcnNlcy5mb3JFYWNoKCh2LCBpKSA9PiB7XFxuICAgIGlmICh2LmZvcmJpZGRlbikgcmV0dXJuO1xcbiAgICBwbGF5bGlzdC5uYW1lcy5wdXNoKHYubmFtZSk7XFxuICAgIGlmICh2LmhlYWRlcnMpIHtcXG4gICAgICBwbGF5bGlzdC5oZWFkZXJzLnB1c2godi5oZWFkZXJzKTtcXG4gICAgfVxcbiAgICBpZiAodi5ydW5UeXBlID09PSBcXFwiSlNPTlxcXCIpIHtcXG4gICAgICBsZXQgcGFyYW0gPSB7XFxuICAgICAgICAvL3VybDogdi51cmwsXFxuICAgICAgICBtZXRob2Q6IHYubWV0aG9kLFxcbiAgICAgICAgaGVhZGVyczogdi5oZWFkZXJzLFxcbiAgICAgICAganNvblBhdGg6IHYuanNvblBhdGhcXG4gICAgICB9O1xcbiAgICAgIHBsYXlsaXN0LnVybHMucHVzaChwcm94eVVybCArIFxcXCI/cnVuVHlwZT1KU09OJnVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZSh2LnVybCArIHVybCkpICsgXFxcIiZwYXJhbT1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShwYXJhbSkpKSk7XFxuICAgIH0gZWxzZSBpZiAodi5ydW5UeXBlID09PSBcXFwiSlNcXFwiKSB7XFxuICAgICAgcGxheWxpc3QudXJscy5wdXNoKHByb3h5VXJsICsgXFxcIj9ydW5UeXBlPUpTJnVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZSh1cmwpKSArIChpc1Rlc3QgPyBcXFwiJnBhcmFtPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHYpKSkgOiBcXFwiJmluZGV4PVxcXCIgKyBpKSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgcGxheWxpc3QudXJscy5wdXNoKFxcXCJ2aWRlbzovL1xcXCIgKyB2LnVybCArIHVybCk7XFxuICAgIH1cXG4gIH0pO1xcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlsaXN0KTtcXG59XFxuXFxuZnVuY3Rpb24gdXNlUGFyc2VzKHVybCkge1xcbiAgbGV0IHBhcnNlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gIGlmICghcGFyc2VzLmxlbmd0aCkgcmV0dXJuIFxcXCJ3ZWI6Ly9cXFwiICsgdXJsO1xcbiAgbGV0IHBsYXlsaXN0ID0ge1xcbiAgICB1cmxzOiBbXSxcXG4gICAgbmFtZXM6IFtdLFxcbiAgICBoZWFkZXJzOiBbXSxcXG4gICAgaXM6IFxcXCIjaXNWaWRlbz10cnVlI1xcXCIsXFxuICB9O1xcbiAgdHJ5IHtcXG4gICAgbGV0IHVzZURhbm11ID0gISFnZXRJdGVtKFxcXCJ1c2VEYW5tdVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgaWYgKHVzZURhbm11KSB7XFxuICAgICAgcGxheWxpc3QuZGFubXUgPSAkLnJlcXVpcmUoJ2RtRnVuP3J1bGU9ZG3nm5LlrZAnKS5kbVJvdXRlKHVybCk7XFxuICAgIH1cXG4gIH0gY2F0Y2ggeyB9XFxuICByZXR1cm4gcHJlcGFyZVBhcnNlcyhwYXJzZXMsIHVybCwgcGxheWxpc3QpO1xcbn1cXG4kLmV4cG9ydHMucGFyc2UgPSBmdW5jdGlvbiAoaW5wdXQsIGlkLCBzb3VyY2UpIHtcXG4gIGxldCBkcnB5ID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIikuZ2V0QnlTb3VyY2Uoc291cmNlKTtcXG4gIGlucHV0ID0gaW5wdXQuc3BsaXQoXFxcIiNcXFwiKTtcXG4gIGxldCBwbGF5ID0gSlNPTi5wYXJzZShkcnB5LnBsYXkoaW5wdXRbMV0sIGlucHV0WzBdLnJlcGxhY2UoXFxcInR2Ym94LXhnOlxcXCIsIFxcXCJcXFwiKSwgW10pKTtcXG4gIC8vIGxvZyhwbGF5KVxcbiAgLy8gbG9nKGlkKVxcbiAgLy9sb2cocGxheSlcXG4gIGZ1bmN0aW9uIHBhcnNlUXVlcnkocXVlcnkpIHtcXG4gICAgdmFyIG9iaiA9IHt9O1xcbiAgICBxdWVyeS5zcGxpdChcXFwiJlxcXCIpLmZpbHRlcihlID0+IGUpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcXG4gICAgICB2YXIgcGFydHMgPSBpdGVtLnNwbGl0KFxcXCI9XFxcIik7XFxuICAgICAgb2JqW3BhcnRzWzBdXSA9IHBhcnRzWzFdO1xcbiAgICB9KTtcXG4gICAgcmV0dXJuIG9iajtcXG4gIH1cXG4gIHZhciBleHRyYSA9IHtcXG4gICAgXFxcInVhXFxcIjogTU9CSUxFX1VBXFxuICB9XFxuICBsZXQgcGFyc2UgPSBwbGF5O1xcbiAgbGV0IHBhcnNlX29iaiA9IHtcXG4gICAgZGVmUnVsZXM6IFtcXFwiKi5tcDRcXFwiLCBcXFwiKi5tM3U4XFxcIl0sXFxuICB9O1xcbiAgaWYgKHBhcnNlLmhhc093blByb3BlcnR5KFxcXCJwYXJzZV9leHRyYVxcXCIpKSB7XFxuICAgIGxldCBwYXJzZV9leHRyYSA9IGRlY29kZVVSSUNvbXBvbmVudChwYXJzZS5wYXJzZV9leHRyYSk7XFxuICAgIHBhcnNlX29iaiA9IE9iamVjdC5hc3NpZ24ocGFyc2Vfb2JqLCBwYXJzZVF1ZXJ5KHBhcnNlX2V4dHJhKSk7XFxuICAgIGlmIChwYXJzZV9vYmouaGFzT3duUHJvcGVydHkoXFxcImluaXRfc2NyaXB0XFxcIikpIHtcXG4gICAgICBwYXJzZV9vYmpbXFxcImluaXRfc2NyaXB0XFxcIl0gPSBiYXNlNjREZWNvZGUocGFyc2Vfb2JqW1xcXCJpbml0X3NjcmlwdFxcXCJdKTtcXG4gICAgfVxcbiAgfVxcbiAgaWYgKHBhcnNlX29iai5oYXNPd25Qcm9wZXJ0eShcXFwiaXNfcGNcXFwiKSAmJiBwYXJzZV9vYmpbXFxcImlzX3BjXFxcIl0gPT0gXFxcIjFcXFwiKSB7XFxuICAgIGV4dHJhW1xcXCJ1YVxcXCJdID0gUENfVUE7XFxuICB9XFxuICBpZiAocGFyc2UuaGFzT3duUHJvcGVydHkoXFxcImhlYWRlclxcXCIpKSB7XFxuICAgIGV4dHJhW1xcXCJ1YVxcXCJdID0gcGFyc2VbXFxcImhlYWRlclxcXCJdW1xcXCJVc2VyLUFnZW50XFxcIl07XFxuICAgIC8vZXh0cmFbXFxcInJlZGlyZWN0XFxcIl09ZmFsc2U7XFxuICAgIC8qZXh0cmFbXFxcImpzXFxcIl0gPSAkLnRvU3RyaW5nKChqcykgPT4ge1xcbiAgICAgIGV2YWwoanMpXFxuICAgICAgZmJhLmxvZyhuYXZpZ2F0b3IudXNlckFnZW50KVxcbiAgICAgIGZiYS5sb2cobG9jYXRpb24uaHJlZilcXG4gICAgfSwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5hdmlnYXRvciwgJ3VzZXJBZ2VudCcsIHtcXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICByZXR1cm4gJ015LUN1c3RvbS1VQS1TdHJpbmcnO1xcbiAgICAgICAgfVxcbiAgICAgIH0pO1xcbiAgICB9KSkqL1xcbiAgfVxcbiAgaWYgKHBhcnNlX29iai5oYXNPd25Qcm9wZXJ0eShcXFwiY3VzdG9tX3JlZ2V4XFxcIikpIHtcXG4gICAgbGV0IGN1cnJlbnQgPSBwYXJzZV9vYmpbXFxcImRlZlJ1bGVzXFxcIl07XFxuICAgIGV4dHJhW1xcXCJ2aWRlb1J1bGVzXFxcIl0gPSBjdXJyZW50LmNvbmNhdChwYXJzZV9vYmouY3VzdG9tX3JlZ2V4LnNwbGl0KC9cXFxcfC9nKS5maWx0ZXIoZSA9PiBlKSlcXG4gIH1cXG4gIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFwianNcXFwiKSAmJiBwYXJzZS5qcyAhPSBcXFwiXFxcIikge1xcbiAgICBleHRyYVtcXFwianNcXFwiXSA9ICQudG9TdHJpbmcoKGpzLCBwYXJzZSwgdCkgPT4ge1xcbiAgICAgIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFwiaW5pdF9zY3JpcHRcXFwiKSkge1xcbiAgICAgICAgZmJhLmxvZyh0ICsgXFxcIjrmiafooYxpbml0X3NjcmlwdFxcXCIpO1xcbiAgICAgICAgZXZhbChwYXJzZS5pbml0X3NjcmlwdCk7XFxuICAgICAgfVxcbiAgICAgIGZiYS5sb2cobmF2aWdhdG9yLnBsYXRmb3JtKTtcXG4gICAgICBmYmEubG9nKHQgKyBcXFwiOuaJp+ihjGpz54K55Ye7XFxcIilcXG4gICAgICBldmFsKGpzKVxcbiAgICB9LCBwYXJzZS5qcywgcGFyc2Vfb2JqLCBNWV9SVUxFLnRpdGxlKVxcbiAgfVxcbiAgdHJ5IHtcXG4gICAgbGV0IGl0ZW0gPSBmaW5kSXRlbShpZCk7XFxuICAgIHVwZGF0ZUl0ZW0oaWQsIHtcXG4gICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih7fSwgaXRlbS5leHRyYSwgZXh0cmEpXFxuICAgIH0pXFxuICB9IGNhdGNoIChlKSB7IH1cXG4gIGlmIChwbGF5LnVybC5pbmNsdWRlcyhcXFwicHJveHk/ZG9cXFwiKSkge1xcbiAgICBNWV9VUkwgPSBwbGF5LnVybDtcXG4gICAgcGxheS51cmwgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInVybFxcXCIsIFxcXCJcXFwiKSk7XFxuICB9XFxuICBpZiAocGxheS51cmwuc3RhcnRzV2l0aChcXFwicHVzaDovL1xcXCIpKSB7XFxuICAgIHBsYXkudXJsID0gcGxheS51cmwucmVwbGFjZShcXFwicHVzaDovL1xcXCIsIFxcXCJcXFwiKTtcXG4gIH1cXG4gIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJodHRwczovL3Bhbi5xdWFyay5jbi9cXFwiKSkge1xcbiAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9xdWFya0xpc3Q/cnVsZT1RdWFyay7nroAmcmVhbHVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBsYXkudXJsKSArIFxcXCImc2hhcmVQd2Q9XFxcIjtcXG4gIH1cXG4gIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKCdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy8nKSB8fCBwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJodHRwczovL3d3dy5hbGlwYW4uY29tL3MvXFxcIikpIHtcXG4gICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvYWxpeXVuP3J1bGU95LqR55uY5ZCbLueugCZwYWdlPWZ5cGFnZSZyZWFsdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQocGxheS51cmwpO1xcbiAgfVxcbiAgaWYgKHBsYXkucGFyc2UgPT09IDEpIHtcXG4gICAgaWYgKHBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcIm1hZ25ldDpcXFwiKSkge1xcbiAgICAgIHJldHVybiBwbGF5LnVybDtcXG4gICAgfVxcbiAgICBpZiAoaXNvZmZpY2lhbChwbGF5LnVybCkgJiYgKHBsYXkuZmxhZyB8fCBpbnB1dFsxXSkpIHtcXG4gICAgICByZXR1cm4gdXNlUGFyc2VzKHBsYXkudXJsKTtcXG4gICAgfVxcbiAgICByZXR1cm4gXFxcInZpZGVvOi8vXFxcIiArIHBsYXkudXJsO1xcbiAgfSBlbHNlIGlmIChwbGF5LnBhcnNlID09PSAwKSB7XFxuICAgIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJtYWduZXQ6XFxcIikpIHtcXG4gICAgICByZXR1cm4gcGxheS51cmw7XFxuICAgIH1cXG4gICAgLy9sb2cocGxheSlcXG4gICAgdmFyIHBsYXlvYmogPSB7fTtcXG4gICAgcGxheW9iai51cmxzID0gW3BsYXkudXJsICsgXFxcIiNpc1ZpZGVvPXRydWUjXFxcIl07XFxuICAgIGlmIChwbGF5Lmhhc093blByb3BlcnR5KFxcXCJoZWFkZXJcXFwiKSkge1xcbiAgICAgIHBsYXlvYmpbXFxcImhlYWRlcnNcXFwiXSA9IHBsYXkuaGVhZGVyO1xcbiAgICB9XFxuICAgIGlmIChwbGF5Lmhhc093blByb3BlcnR5KFxcXCJkYW5tYWt1XFxcIikpIHtcXG4gICAgICBwbGF5b2JqW1xcXCJkYW5tdVxcXCJdID0gcGxheS5kYW5tYWt1O1xcbiAgICB9XFxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwbGF5b2JqKTtcXG4gIH0gZWxzZSB7XFxuICAgIHJldHVybiBwbGF5LnVybDtcXG4gIH1cXG59XFxuJC5leHBvcnRzLnByZXBhcmVQYXJzZXMgPSBwcmVwYXJlUGFyc2VzO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Yib5bu66K6i6ZiFXCIsXCJwYXRoXCI6XCJjcmVhdGVTdWJzY3JpcHRpb25cIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi5Yib5bu66K6i6ZiFXFxcIik7XFxubGV0IGxheW91dCA9IFtdO1xcbmxldCBmID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcIik7XFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcImRycHlIaWtlcl9zdWJfaW5wdXRcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiZHJweUhpa2VyX3N1YnVybF9pbnB1dFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJkcnB5SGlrZXJfc3VibmFtZV9pbnB1dFxcXCIpO1xcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLorqLpmIXlkI3np7BcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXFxcIlxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcImRycHlIaWtlcl9zdWJuYW1lX2lucHV0XFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBpZDogXFxcImRycHlIaWtlcl9zdWJuYW1lX2lucHV0XFxcIlxcbiAgICB9XFxufSk7XFxubGV0IHBhdGggPSBqb2luVXJsKGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvXFxcIiksIFxcXCIuLi9cXFwiLnJlcGVhdCg1KSkuc2xpY2UoNyk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqVxcXCIsXFxuICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oXFxcImRycHlIaWtlcl9zdWJfaW5wdXRcXFwiKS5leHRyYTtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKFxcXCJkcnB5SGlrZXJfc3ViX2lucHV0XFxcIiwge1xcbiAgICAgICAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogUEFUSFxcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfSksXFxuICAgICAgICByb290RGlyUGF0aDogcGF0aCxcXG4gICAgICAgIGluaXRpYWxQYXRoOiBwYXRoLFxcbiAgICAgICAgcGF0dGVybjogMVxcbiAgICB9KSksXFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5YKo5a2Y6Lev5b6EXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXFxcIlxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcImRycHlIaWtlcl9zdWJfaW5wdXRcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGlkOiBcXFwiZHJweUhpa2VyX3N1Yl9pbnB1dFxcXCJcXG4gICAgfVxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLorqLpmIXlnLDlnYBcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXFxcIlxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcImRycHlIaWtlcl9zdWJ1cmxfaW5wdXRcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGlkOiBcXFwiZHJweUhpa2VyX3N1YnVybF9pbnB1dFxcXCJcXG4gICAgfVxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLnoa7orqRcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlkKSA9PiB7XFxuICAgICAgICBsZXQgcGF0aCA9IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfc3ViX2lucHV0XFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgbGV0IHVybCA9IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfc3VidXJsX2lucHV0XFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgbGV0IG5hbWUgPSBnZXRNeVZhcihcXFwiZHJweUhpa2VyX3N1Ym5hbWVfaW5wdXRcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoIShwYXRoICYmIHVybCAmJiBuYW1lKSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kuI3lj6/kuLrnqbpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJ1bGUgPSBiYXNlNjRFbmNvZGUoXFxcIua1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8muWQiOmbhuinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lXFxcIiArIG5hbWUgKyBcXFwiQEBcXFwiICsgdXJsK2BAanM9JC5yZXF1aXJlKCdzdWJzY3JpYmU/cnVsZT0ke01ZX1JVTEUudGl0bGV9JykucGFyc2VVcmwoaW5wdXQsICcke2Jhc2U2NEVuY29kZShwYXRoKX0nKWApO1xcbiAgICAgICAgcmV0dXJuIFxcXCJydWxlOi8vXFxcIiArIHJ1bGU7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbn0pO1xcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Kej5p6Q6K6i6ZiFXCIsXCJwYXRoXCI6XCJzdWJzY3JpYmVcIixcInJ1bGVcIjpcImpzOlxcbmZ1bmN0aW9uIGdlbmVyYXRlQ29uZmlnQnlHaXRodWIodXJsLCBwYXRoKSB7XFxuICAgIGxldCByb3BlID0gdXJsLnNwbGl0KFxcXCIvXFxcIikuc2xpY2UoMywgNSkuam9pbihcXFwiL1xcXCIpO1xcbiAgICBsZXQgaHRtbCA9IGZldGNoKHVybCk7XFxuICAgIFxcbiAgICBsZXQganNvblRleHQgPSBwZGZoKGh0bWwsIFxcXCIjcmVwby1jb250ZW50LXBqYXgtY29udGFpbmVyJiZzY3JpcHQmJkh0bWxcXFwiKTtcXG4gICAgXFxuICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XFxuICAgIGxldCBsaXN0ID0ganNvbi5wYXlsb2FkLnRyZWUuaXRlbXM7XFxuICAgIGxldCBydWxlcyA9IFtdO1xcbiAgICBsZXQgY291bnQgPSAwO1xcbiAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBuYW1lID0gaXQubmFtZTtcXG4gICAgICAgICAgICBsZXQgc3BhdGggPSBpdC5wYXRoO1xcbiAgICAgICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcXFwiLmpzXFxcIikpIGNvbnRpbnVlO1xcbiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoXFxcIi5cXFwiKSk7XFxuICAgICAgICAgICAgbGV0IHJ1bGUgPSBmZXRjaChgaHR0cHM6Ly9yYXcuZ2l0bWlycm9yLmNvbS8ke3JvcGV9L21hc3Rlci8ke3NwYXRofWApO1xcbiAgICAgICAgICAgIGlmICghKCghcnVsZSB8fCAhcnVsZS5pbmNsdWRlcyhcXFwicnVsZVxcXCIpKSAmJiAhZmlsZUV4aXN0KHBhdGggKyBpdC5uYW1lKSkpIHtcXG4gICAgICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGggKyBpdC5uYW1lLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgcnVsZXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAna2V5JzogYGhpcHlfanNfJHtuYW1lfWAsXFxuICAgICAgICAgICAgICAgICAgICAnbmFtZSc6IGAke25hbWV9YCxcXG4gICAgICAgICAgICAgICAgICAgICd0eXBlJzogMyxcXG4gICAgICAgICAgICAgICAgICAgICdhcGknOicuLi9saWJzL2RycHkyLmpzJyxcXG4gICAgICAgICAgICAgICAgICAgICdzZWFyY2hhYmxlJzogMSxcXG4gICAgICAgICAgICAgICAgICAgICdxdWlja1NlYXJjaCc6IDEsXFxuICAgICAgICAgICAgICAgICAgICAnZmlsdGVyYWJsZSc6IDEsXFxuICAgICAgICAgICAgICAgICAgICAnZXh0JzogXFxcIi4vXFxcIiArIGl0Lm5hbWUsXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICB3cml0ZUZpbGUocGF0aCArIFxcXCJpbmRleC5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoe3NpdGVzOnJ1bGVzfSkpO1xcbiAgICByZXR1cm4gXFxcInRvYXN0Oi8v5oiQ5Yqf5pu05pawXFxcIiArIGNvdW50ICsgXFxcIuS4qlxcXCI7O1xcbn1cXG5cXG5mdW5jdGlvbiBnZW5lcmF0ZUNvbmZpZ0J5SW5kZXgodXJsLCBwYXRoKSB7XFxuICAgIGxldCBqc29uID0gSlNPTi5wYXJzZSh0b0NvcnJlY3RKU09OU3RyaW5nKHJlcXVlc3QodXJsKSkpO1xcbiAgICBsZXQgYXJyID0ganNvbi5zaXRlcztcXG4gICAgbGV0IGNvdW50ID0gMDtcXG4gICAgbGV0IGkgPSAwO1xcbiAgICBmb3IgKGxldCBpdCBvZiBhcnIpIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgaWYgKChTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIubWluLmpzXFxcIikgfHwgU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcImRycHkyLmpzXFxcIikpKSB7XFxuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gaXQuZXh0LmVuZHNXaXRoKFxcXCIuanNcXFwiKSA/IGRlY29kZVVSSUNvbXBvbmVudChpdC5leHQuc3BsaXQoXFxcIi9cXFwiKS5hdCgtMSkpIDogKGl0Lm5hbWUgKyBcXFwiLmpzXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlO1xcbiAgICAgICAgICAgICAgICBpZiAoU3RyaW5nKGl0LmV4dCkuc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICBydWxlID0gcmVxdWVzdChpdC5leHQpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZSA9IHJlcXVlc3Qoam9pblVybCh1cmwsIGl0LmV4dCkpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGl0LmV4dCA9IFxcXCIuL1xcXCIgKyBuYW1lO1xcbiAgICAgICAgICAgICAgICBpZiAoIXJ1bGUgfHwgIXJ1bGUuaW5jbHVkZXMoXFxcInJ1bGVcXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlRXhpc3QocGF0aCArIG5hbWUpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoaSwgMSk7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGggKyBuYW1lLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgY291bnQrKztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgICAgICBpKys7XFxuICAgIH1cXG4gICAgd3JpdGVGaWxlKHBhdGggKyBcXFwiaW5kZXguanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG4gICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aIkOWKn+abtOaWsFxcXCIgKyBjb3VudCArIFxcXCLkuKpcXFwiO1xcbn1cXG4kLmV4cG9ydHMucGFyc2VVcmwgPSBmdW5jdGlvbih1cmwsIHBhdGgpIHtcXG4gICAgcGF0aCA9IGJhc2U2NERlY29kZShwYXRoKTtcXG4gICAgcGF0aCA9IHBhdGguZW5kc1dpdGgoXFxcIi9cXFwiKSA/IHBhdGggOiBwYXRoICsgXFxcIi9cXFwiO1xcbiAgICB0cnkge1xcbiAgICAgICAgaWYgKHVybC5zdGFydHNXaXRoKFxcXCJodHRwczovL2dpdGh1Yi5jb20vaGpkaG54L1xcXCIpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnQnlHaXRodWIodXJsLCBwYXRoKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnQnlJbmRleCh1cmwsIHBhdGgpO1xcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgIHJldHVybiBcXFwiZXJyb3I6XFxcIiArIGUudG9TdHJpbmcoKTtcXG4gICAgfVxcbn07XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLov5DooYzml7bphY3nva7nrqHnkIZcIixcInBhdGhcIjpcInJ1bnRpbWVDb25maWdcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IHNlYXJjaEFsbG93UGF0aCA9IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0xveURnSWsvRHJweUhpa2VyL3NlYXJjaEFsbG93Lmpzb25cXFwiO1xcbmxldCBpc1ByZXBhcmUgPSBmYWxzZTtcXG5sZXQgY29uZmlncywgY3VycmVudENvbmZpZyA9IHt9LFxcbiAgICBzb3VyY2VMaXN0LCBjdXJyZW50U291cmNlLCBzZWFyY2hBbGxvdyA9IFtdO1xcblxcbmZ1bmN0aW9uIGluaXQoY29uZmlnKSB7XFxuICAgIGlmICghY29uZmlnKSByZXR1cm4gbnVsbDtcXG4gICAgaWYgKCFjb25maWcucGF0aCkgcmV0dXJuIG51bGw7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgZmlsZTtcXG4gICAgICAgIGxldCBzb3VyY2VMaXN0ID0gW107XFxuICAgICAgICBpZiAoY29uZmlnLnBhdGguc3RhcnRzV2l0aChcXFwiZmlsZTovL1xcXCIpICYmIChmaWxlID0gbmV3IGphdmEuaW8uRmlsZShjb25maWcucGF0aC5yZXBsYWNlKFxcXCJmaWxlOi8vXFxcIiwgXFxcIlxcXCIpKSkuaXNEaXJlY3RvcnkoKSkge1xcbiAgICAgICAgICAgIHNvdXJjZUxpc3QgPSBnZW5lcmF0ZUNvbmZpZ0J5TG9jYWwoZmlsZSk7XFxuICAgICAgICAgICAgY29uZmlnLnR5cGUgPSBcXFwibG9jYWxEaXJcXFwiO1xcbiAgICAgICAgfSBlbHNlIGlmIChjb25maWcucGF0aC5zdGFydHNXaXRoKFxcXCJodHRwczovL2dpdGh1Yi5jb21cXFwiKSkge1xcbiAgICAgICAgICAgIHNvdXJjZUxpc3QgPSBnZW5lcmF0ZUNvbmZpZ0J5R2l0aHViKGNvbmZpZy5wYXRoKTtcXG4gICAgICAgICAgICBjb25maWcudHlwZSA9IFxcXCJnaXRodWJEaXJcXFwiO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UodG9Db3JyZWN0SlNPTlN0cmluZyhmZXRjaChjb25maWcucGF0aCkgfHwgXFxcInt9XFxcIikpO1xcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShqc29uLnNpdGVzKSB8fCAhanNvbi5zaXRlcy5sZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHNvdXJjZUxpc3QgPSBmaWx0ZXJPdGhlcihqc29uLnNpdGVzKTtcXG4gICAgICAgICAgICBjb25maWcudHlwZSA9IFxcXCJpbmRleFxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBmaWxlID0gdm9pZCAwO1xcbiAgICAgICAgbGV0IGN1cnJlbnRTb3VyY2UsIHNlYXJjaEFsbG93O1xcbiAgICAgICAgaWYgKGNvbmZpZy5jS2V5KSB7XFxuICAgICAgICAgICAgY3VycmVudFNvdXJjZSA9IHNvdXJjZUxpc3QuZmluZCh2ID0+IHYua2V5ID09PSBjb25maWcuY0tleSk7XFxuICAgICAgICAgICAgaWYgKCFjdXJyZW50U291cmNlKSB7XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2VMaXN0WzBdO1xcbiAgICAgICAgICAgICAgICAvL2N1cnJlbnRDb25maWcuY0tleSA9IHNvdXJjZUxpc3RbMF0ua2V5O1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgY3VycmVudFNvdXJjZSA9IHNvdXJjZUxpc3RbMF07XFxuICAgICAgICAgICAgLy9jb25maWcuY0tleSA9IHNvdXJjZUxpc3RbMF0ua2V5O1xcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBzZWFyY2hBbGxvdyA9IEpTT04ucGFyc2UoZmV0Y2goc2VhcmNoQWxsb3dQYXRoKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBkZWxldGVGaWxlKHNlYXJjaEFsbG93UGF0aCk7XFxuICAgICAgICAgICAgc2VhcmNoQWxsb3cgPSBbXTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgY3VycmVudFNvdXJjZSxcXG4gICAgICAgICAgICBzZWFyY2hBbGxvdyxcXG4gICAgICAgICAgICBzb3VyY2VMaXN0XFxuICAgICAgICB9O1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgfVxcbiAgICByZXR1cm4gbnVsbDtcXG59XFxuXFxuZnVuY3Rpb24gZ2VuZXJhdGVDb25maWdCeUxvY2FsKGRpckZpbGUpIHtcXG4gICAgbGV0IGxpc3QgPSBkaXJGaWxlLmxpc3RGaWxlcygpO1xcbiAgICBsZXQgcnVsZXMgPSBbXTtcXG4gICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xcbiAgICAgICAgbGV0IG5hbWUgPSBTdHJpbmcoaXQuZ2V0TmFtZSgpKTtcXG4gICAgICAgIGxldCBwYXRoID0gaXQuZ2V0UGF0aCgpO1xcbiAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFxcXCIuanNcXFwiKSB8fCBpdC5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcXG4gICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoXFxcIi5cXFwiKSk7XFxuICAgICAgICBydWxlcy5wdXNoKHtcXG4gICAgICAgICAgICAna2V5JzogYGhpcHlfanNfJHtuYW1lfWAsXFxuICAgICAgICAgICAgJ25hbWUnOiBgJHtuYW1lfWAsXFxuICAgICAgICAgICAgJ3R5cGUnOiAzLFxcbiAgICAgICAgICAgICdzZWFyY2hhYmxlJzogMSxcXG4gICAgICAgICAgICAncXVpY2tTZWFyY2gnOiAxLFxcbiAgICAgICAgICAgICdmaWx0ZXJhYmxlJzogMSxcXG4gICAgICAgICAgICAnZXh0JzogYCR7cGF0aH1gLFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHJ1bGVzO1xcbn1cXG5cXG5mdW5jdGlvbiBnZW5lcmF0ZUNvbmZpZ0J5R2l0aHViKHVybCkge1xcbiAgICAvL3VybD11cmwucmVwbGFjZSgvKCNHSVRIVUIjKSQvLFxcXCJcXFwiKTtcXG4gICAgbGV0IHJvcGUgPSB1cmwuc3BsaXQoXFxcIi9cXFwiKS5zbGljZSgzLCA1KS5qb2luKFxcXCIvXFxcIik7XFxuICAgIGxldCBodG1sID0gZmV0Y2godXJsKTtcXG4gICAgbGV0IGpzb25UZXh0ID0gcGRmaChodG1sLCBcXFwiI3JlcG8tY29udGVudC1wamF4LWNvbnRhaW5lciYmc2NyaXB0JiZIdG1sXFxcIik7XFxuICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XFxuICAgIGxldCBsaXN0ID0ganNvbi5wYXlsb2FkLnRyZWUuaXRlbXM7XFxuICAgIGxldCBydWxlcyA9IFtdO1xcbiAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XFxuICAgICAgICBsZXQgbmFtZSA9IGl0Lm5hbWU7XFxuICAgICAgICBsZXQgcGF0aCA9IGl0LnBhdGg7XFxuICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXFxcIi5qc1xcXCIpKSBjb250aW51ZTtcXG4gICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoXFxcIi5cXFwiKSk7XFxuICAgICAgICBydWxlcy5wdXNoKHtcXG4gICAgICAgICAgICAna2V5JzogYGhpcHlfanNfJHtuYW1lfWAsXFxuICAgICAgICAgICAgJ25hbWUnOiBgJHtuYW1lfWAsXFxuICAgICAgICAgICAgJ3R5cGUnOiAzLFxcbiAgICAgICAgICAgICdzZWFyY2hhYmxlJzogMSxcXG4gICAgICAgICAgICAncXVpY2tTZWFyY2gnOiAxLFxcbiAgICAgICAgICAgICdmaWx0ZXJhYmxlJzogMSxcXG4gICAgICAgICAgICAnZXh0JzogYGh0dHBzOi8vcmF3LmdpdG1pcnJvci5jb20vJHtyb3BlfS9tYXN0ZXIvJHtwYXRofWAsXFxuICAgICAgICB9KTtcXG4gICAgICAgIC8qXFxuICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vaGpkaG54L2hpcHktc2VydmVyL3RyZWUvbWFzdGVyL2FwcC90NC9maWxlcy9kcnB5X2pzXFxuICAgICAgICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vaGpkaG54L2hpcHktc2VydmVyL21hc3Rlci9hcHAvdDQvZmlsZXMvZHJweV9qcy8zNjAlRTUlQkQlQjElRTglQTclODYlNUIlRTUlQUUlOTglNUQuanMqL1xcbiAgICB9XFxuICAgIHJldHVybiBydWxlcztcXG59XFxuXFxuZnVuY3Rpb24gcHJlcGFyZShjb25maWcpIHtcXG4gICAgbGV0IGRhdGEgPSBpbml0KGNvbmZpZyk7XFxuICAgIGlmICghZGF0YSkgcmV0dXJuIGZhbHNlO1xcbiAgICBjdXJyZW50U291cmNlID0gZGF0YS5jdXJyZW50U291cmNlO1xcbiAgICBzZWFyY2hBbGxvdyA9IGRhdGEuc2VhcmNoQWxsb3c7XFxuICAgIHNvdXJjZUxpc3QgPSBkYXRhLnNvdXJjZUxpc3Q7XFxuICAgIGN1cnJlbnRDb25maWcgPSBjb25maWc7XFxuICAgIHJldHVybiB0cnVlO1xcbn1cXG5cXG5mdW5jdGlvbiBmaWx0ZXJPdGhlcihsaXN0KSB7XFxuICAgIHJldHVybiBsaXN0LmZpbHRlcihpdCA9PiBTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIubWluLmpzXFxcIikgfHwgU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcImRycHkyLmpzXFxcIikpXFxufVxcblxcblxcbmZ1bmN0aW9uIGdldEN1cnJlbnRDb25maWcoKSB7XFxuICAgIHJldHVybiBjdXJyZW50Q29uZmlnIHx8IHt9O1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRDdXJyZW50Q29uZmlnKGNvbmZpZykge1xcbiAgICBsZXQgY3BhdGggPSAoY3VycmVudENvbmZpZyB8fCB7fSkucGF0aDtcXG4gICAgaWYgKHByZXBhcmUoY29uZmlnKSkge1xcbiAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwiY3VycmVudENvbmZpZ1xcXCIsIGNvbmZpZyk7XFxuICAgICAgICBpZiAoY3BhdGggIT0gY29uZmlnLnBhdGgpIHtcXG4gICAgICAgICAgICBkZWxldGVGaWxlKHNlYXJjaEFsbG93UGF0aCk7XFxuICAgICAgICAgICAgc2VhcmNoQWxsb3cgPSBbXTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlzUHJlcGFyZSA9IHRydWU7XFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBmaW5kU291cmNlKGtleSkge1xcbiAgICBsZXQgcyA9IHNvdXJjZUxpc3QuZmluZCh2ID0+IHYua2V5ID09PSBrZXkpO1xcbiAgICBpZiAocykge1xcbiAgICAgICAgcy5leHQgPSBnZXRBYnNvbHV0ZVBhdGgoU3RyaW5nKHMuZXh0KSk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHM7XFxufVxcblxcbmZ1bmN0aW9uIGdldEN1cnJlbnRTb3VyY2UoKSB7XFxuICAgIHJldHVybiBjdXJyZW50U291cmNlO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRDdXJyZW50U291cmNlUGF0aCgpIHtcXG4gICAgbGV0IHBhdGggPSBTdHJpbmcoY3VycmVudFNvdXJjZS5leHQpO1xcbiAgICByZXR1cm4gZ2V0QWJzb2x1dGVQYXRoKHBhdGgpO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRBYnNvbHV0ZVBhdGgocGF0aCkge1xcbiAgICBwYXRoID0gU3RyaW5nKHBhdGgpO1xcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikgfHwgcGF0aC5zdGFydHNXaXRoKFxcXCJmaWxlOi8vXFxcIikpIHtcXG4gICAgICAgIHJldHVybiBwYXRoO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmV0dXJuIGpvaW5VcmwoY3VycmVudENvbmZpZy5wYXRoLCBwYXRoKTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBzZXRDdXJyZW50U291cmNlKGtleSkge1xcbiAgICBsZXQgc291cmNlID0gc291cmNlTGlzdC5maW5kKHYgPT4gdi5rZXkgPT09IGtleSk7XFxuICAgIGlmIChzb3VyY2UpIHtcXG4gICAgICAgIGN1cnJlbnRDb25maWcuY0tleSA9IGtleTtcXG4gICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcImN1cnJlbnRDb25maWdcXFwiLCBjdXJyZW50Q29uZmlnKTtcXG4gICAgICAgIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2U7XFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgfVxcbiAgICByZXR1cm4gZmFsc2U7XFxufVxcblxcbmZ1bmN0aW9uIGdldENhblNlYXJjaFNvdXJjZSgpIHtcXG4gICAgcmV0dXJuIHNvdXJjZUxpc3QuZmlsdGVyKHYgPT4gdi5zZWFyY2hhYmxlID09PSB1bmRlZmluZWQgfHwgdi5zZWFyY2hhYmxlKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0QWxsU291cmNlKCkge1xcbiAgICByZXR1cm4gc291cmNlTGlzdC5zbGljZSgpO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRBbGxTb3VyY2VzKCkge1xcbiAgICByZXR1cm4gc291cmNlTGlzdDtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0U2VhcmNoQWxsb3coKSB7XFxuICAgIHJldHVybiBzZWFyY2hBbGxvdztcXG59XFxuXFxuZnVuY3Rpb24gc2V0U2VhcmNoQWxsb3coKSB7XFxuICAgIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaEFsbG93KSkge1xcbiAgICAgICAgc2F2ZUZpbGUoc2VhcmNoQWxsb3dQYXRoLCBKU09OLnN0cmluZ2lmeShzZWFyY2hBbGxvdykpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGdldEFsbG93U2VhcmNoU291cmNlKCkge1xcbiAgICBsZXQgc2xpc3Q7XFxuICAgIGlmIChzZWFyY2hBbGxvdy5sZW5ndGgpIHtcXG4gICAgICAgIHNsaXN0ID0gc291cmNlTGlzdC5maWx0ZXIodiA9PiBzZWFyY2hBbGxvdy5pbmNsdWRlcyh2LmtleSkpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgc2xpc3QgPSBzb3VyY2VMaXN0LmZpbHRlcih2ID0+IHYuc2VhcmNoYWJsZSk7XFxuICAgIH1cXG4gICAgaWYgKHNsaXN0Lmxlbmd0aCA9PSAwKSB7XFxuICAgICAgICBzbGlzdCA9IHNvdXJjZUxpc3Quc2xpY2UoKTtcXG4gICAgfVxcbiAgICByZXR1cm4gc2xpc3Q7XFxufVxcblxcbmZ1bmN0aW9uIGlzUHJlcGFyZWQoKSB7XFxuICAgIHJldHVybiBpc1ByZXBhcmU7XFxufVxcblxcbmlzUHJlcGFyZSA9IHByZXBhcmUoc3RvcmFnZTAuZ2V0SXRlbShcXFwiY3VycmVudENvbmZpZ1xcXCIsIHt9KSk7XFxuJC5leHBvcnRzID0ge1xcbiAgICBwcmVwYXJlLFxcbiAgICBnZXRDdXJyZW50Q29uZmlnLFxcbiAgICBzZXRDdXJyZW50Q29uZmlnLFxcbiAgICBnZXRDdXJyZW50U291cmNlLFxcbiAgICBnZXRDdXJyZW50U291cmNlUGF0aCxcXG4gICAgc2V0Q3VycmVudFNvdXJjZSxcXG4gICAgZ2V0Q2FuU2VhcmNoU291cmNlLFxcbiAgICBnZXRTZWFyY2hBbGxvdyxcXG4gICAgc2V0U2VhcmNoQWxsb3csXFxuICAgIGdldEFsbFNvdXJjZSxcXG4gICAgZ2V0QWxsb3dTZWFyY2hTb3VyY2UsXFxuICAgIGlzUHJlcGFyZWQsXFxuICAgIGdldEFic29sdXRlUGF0aCxcXG4gICAgZ2V0QWxsU291cmNlcyxcXG4gICAgZmluZFNvdXJjZVxcbn07XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLnvJbovpHphY3nva5cIixcInBhdGhcIjpcImNyZWF0ZUNvbmZpZ1wiLFwicnVsZVwiOlwianM6XFxubGV0IGxheW91dCA9IFtdO1xcbnNldFBhZ2VUaXRsZShcXFwi5Yib5bu66YWN572uXFxcIik7XFxubGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG5sZXQgY3VycmVudGNvbmZpZyA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudENvbmZpZygpO1xcbmxldCBmID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcIik7XFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiB7XFxuICBjbGVhck15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX25hbWVcXFwiKTtcXG4gIGNsZWFyTXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCIpO1xcbn0pO1xcblxcbi8v5Y6G5Y+y6YWN572u6K6w5b2VXFxuZnVuY3Rpb24gdW5pcXVlQXJyYXlCeVByb3BlcnR5KGFycmF5LCBwcm9wZXJ0eSkge1xcbiAgbGV0IHVuaXF1ZSA9IFtdO1xcbiAgbGV0IG1hcCA9IG5ldyBNYXAoKTtcXG4gIGZvciAobGV0IGl0ZW0gb2YgYXJyYXkpIHtcXG4gICAgbGV0IGtleSA9IGl0ZW1bcHJvcGVydHldO1xcbiAgICBpZiAoIW1hcC5oYXMoa2V5KSkge1xcbiAgICAgIG1hcC5zZXQoa2V5LCB0cnVlKTtcXG4gICAgICB1bmlxdWUucHVzaChpdGVtKTtcXG4gICAgfVxcbiAgfVxcbiAgcmV0dXJuIHVuaXF1ZTtcXG59XFxubGV0IGNwYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvXFxcIiArIFxcXCJkcnB5Y29uZmlnLmpzb25cXFwiO1xcbmxldCBwYXRoY29uZmlncyA9IFtdO1xcbnRyeSB7XFxuICBwYXRoY29uZmlncyA9IEpTT04ucGFyc2UocmVhZEZpbGUoY3BhdGgpKSB8fCBbXTtcXG4gIC8vcHV0TXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdzXFxcIixwYXRoY29uZmlncyk7XFxufSBjYXRjaCAoZSkge1xcbiAgY29uc29sZS5sb2coZS5tZXNzYWdlKTtcXG59XFxucGF0aGNvbmZpZ3MgPSB1bmlxdWVBcnJheUJ5UHJvcGVydHkocGF0aGNvbmZpZ3MsIFxcXCJwYXRoXFxcIik7XFxuLy9sb2cocGF0aGNvbmZpZ3MpXFxuXFxubGV0IGNvbmZpZ3Nfb2JqID0ge1xcbiAgcGF0aDogY3BhdGgsXFxuICBjb25maWdzOiBwYXRoY29uZmlnc1xcbn1cXG4vL+WOhuWPsumFjee9ruiusOW9lVxcblxcbmxheW91dC5wdXNoKHtcXG4gIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgZGVzYzogXFxcIumFjee9ruWQjeensCjlv4XloaspICDot6/lvoTlkozmlofku7blpLnpgInkuozpgInkuIBcXFwiLFxcbiAgZXh0cmE6IHtcXG4gICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19uYW1lXFxcIiwgXFxcIlxcXCIpLFxcbiAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgcHV0TXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfbmFtZVxcXCIsIGlucHV0KTtcXG4gICAgfSksXFxuICAgIGlkOiBcXFwiZHJweUhpa2VyX2NvbmZpZ19uYW1lXFxcIlxcbiAgfVxcbn0pO1xcblxcbmxldCBzZWxlY3RfbW9kZSA9IGdldEl0ZW0oXFxcInNlbGVjdF9jb25maWdfbW9kZVxcXCIsIFxcXCIwXFxcIik7XFxubGV0IG5hdiA9IFtcXFwi6Lev5b6EL1VSTFxcXCIsIFxcXCLmlofku7blpLlcXFwiXTtcXG5cXG5uYXYuZm9yRWFjaCgoeCwgaSkgPT4ge1xcbiAgbGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyAoaSA9PSBzZWxlY3RfbW9kZSA/IHguZm9udGNvbG9yKFxcXCIjMTVCNzZDXFxcIikgOiB4KSxcXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChpKSA9PiB7XFxuICAgICAgc2V0SXRlbShcXFwic2VsZWN0X2NvbmZpZ19tb2RlXFxcIiwgaSArIFxcXCJcXFwiKTtcXG4gICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sIGkpLFxcbiAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgfSlcXG59KVxcblxcblxcbmxldCBwYXRoID0gam9pblVybChnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL1xcXCIpLCBcXFwiLi4vXFxcIi5yZXBlYXQoNSkpLnNsaWNlKDcpO1xcblxcbmlmIChzZWxlY3RfbW9kZSA9PSBcXFwiMFxcXCIpIHtcXG4gIGxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLpgInmi6lcXFwiLFxcbiAgICB1cmw6IEpTT04uc3RyaW5naWZ5KGYuZmlsZVNlbGVjdGlvblVyaSh7XFxuICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgbGV0IHRhcmdldCA9IGZpbmRJdGVtKFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFwiKS5leHRyYTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCIsIHtcXG4gICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBQQVRIXFxuICAgICAgICAgIH0pXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgIH0pLFxcbiAgICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcbiAgICAgIGluaXRpYWxQYXRoOiBwYXRoLFxcbiAgICAgIHBhdHRlcm46IDAsXFxuICAgICAgZmlsZVR5cGU6IFxcXCIuanNvblxcXCIsXFxuICAgIH0pKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLphY3nva7ot6/lvoQvVVJMIOacrOWcsOmAieaLqWluZGV4Lmpzb25cXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgIGRlZmF1bHRWYWx1ZTogXFxcIlxcXCIsXFxuICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCIsIGlucHV0KTtcXG4gICAgICB9KSxcXG4gICAgICBpZDogXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCJcXG4gICAgfVxcbiAgfSk7XFxufVxcbmlmIChzZWxlY3RfbW9kZSA9PSBcXFwiMVxcXCIpIHtcXG4gIGxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLpgInmi6lcXFwiLFxcbiAgICB1cmw6IEpTT04uc3RyaW5naWZ5KGYuZmlsZVNlbGVjdGlvblVyaSh7XFxuICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgbGV0IHRhcmdldCA9IGZpbmRJdGVtKFxcXCJkcnB5SGlrZXJfY29uZmlnX2ZvbGRlclxcXCIpLmV4dHJhO1xcbiAgICAgICAgdXBkYXRlSXRlbShcXFwiZHJweUhpa2VyX2NvbmZpZ19mb2xkZXJcXFwiLCB7XFxuICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHRhcmdldCwge1xcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogUEFUSFxcbiAgICAgICAgICB9KVxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICB9KSxcXG4gICAgICByb290RGlyUGF0aDogcGF0aCxcXG4gICAgICBpbml0aWFsUGF0aDogcGF0aCxcXG4gICAgICBwYXR0ZXJuOiAxLFxcbiAgICAgIC8vZmlsZVR5cGU6IFxcXCIuanNvblxcXCIsXFxuICAgIH0pKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLphY3nva7mlofku7blpLnot6/lvoQg6YCJ5oupZHJweV9qc+ebruW9lVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIiwgaW5wdXQpO1xcbiAgICAgIH0pLFxcbiAgICAgIGlkOiBcXFwiZHJweUhpa2VyX2NvbmZpZ19mb2xkZXJcXFwiXFxuICAgIH1cXG4gIH0pO1xcbn1cXG5sYXlvdXQucHVzaCh7XFxuICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgdGl0bGU6IFxcXCLnoa7orqRcXFwiLFxcbiAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChjb2JqKSA9PiB7XFxuICAgIGxldCBwYXRoID0gZ2V0TXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgbGV0IG5hbWUgPSBnZXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19uYW1lXFxcIiwgXFxcIlxcXCIpO1xcbiAgICBpZiAoIShwYXRoICYmIG5hbWUpKSB7XFxuICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S4jeWPr+S4uuepulxcXCI7XFxuICAgIH1cXG4gICAgcGF0aCA9IHBhdGguc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpID8gcGF0aCA6IHBhdGguc3RhcnRzV2l0aChcXFwiL1xcXCIpID8gKFxcXCJmaWxlOi8vXFxcIiArIHBhdGgpIDogcGF0aDtcXG4gICAgLy9sb2cocGF0aClcXG4gICAgdHJ5IHtcXG4gICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuato+WcqOWKoOi9vemFjee9ri4uLlxcXCIpO1xcbiAgICAgIH1cXG5cXG4gICAgICBpZiAocnVudGltZUNvbmZpZy5zZXRDdXJyZW50Q29uZmlnKHtcXG4gICAgICAgIHBhdGgsXFxuICAgICAgICBuYW1lLFxcbiAgICAgIH0pKSB7XFxuICAgICAgICBjb2JqLmNvbmZpZ3MucHVzaCh7XFxuICAgICAgICAgIHBhdGgsXFxuICAgICAgICAgIG5hbWUsXFxuICAgICAgICB9KVxcbiAgICAgICAgY2xlYXJJdGVtKFxcXCJub19sb2FkaW5nXFxcIik7XFxuICAgICAgICBzYXZlRmlsZShjb2JqLnBhdGgsIEpTT04uc3RyaW5naWZ5KGNvYmouY29uZmlncykpO1xcbiAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpO1xcbiAgICAgICAgRHJweU1hbmFnZS5jbGVhcigpO1xcbiAgICAgICAgJC5yZXF1aXJlKFxcXCJDaGFuZ2VTb3VyY2VQb3BcXFwiKS5zaG93KDEwMCk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcIjtcXG4gICAgICB9XFxuICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+mFjee9ruaWh+S7tuacieivr1xcXCI7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIGUudG9TdHJpbmcoKTtcXG4gICAgfSBmaW5hbGx5IHtcXG4gICAgICBoaWRlTG9hZGluZygpO1xcbiAgICB9XFxuICB9LCBjb25maWdzX29iaiksXFxuICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbn0pO1xcblxcbmlmIChwYXRoY29uZmlncy5sZW5ndGgpIHtcXG4gIGxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgXFxcIjxzbWFsbD7ljoblj7LphY3nva7orrDlvZUg54K55oiR6L+b6KGM6YWN572u5qOA6aqMPC9zbWFsbD5cXFwiLFxcbiAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHApID0+IHtcXG4gICAgICAvL2xvZyhwKVxcbiAgICAgIGZ1bmN0aW9uIHVuaXF1ZShhcnIpIHtcXG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBNYXAoKTtcXG4gICAgICAgIHJldHVybiBhcnIuZmlsdGVyKChhKSA9PiAhcmVzLmhhcyhhKSAmJiByZXMuc2V0KGEsIDEpKVxcbiAgICAgIH1cXG4gICAgICB2YXIgcmVzdWx0cyA9IFtdO1xcbiAgICAgIGlmIChwLmxlbmd0aCA9PSAwKSB7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5peg5Zyw5Z2AXFxcIjtcXG4gICAgICB9XFxuICAgICAgbGlzdCA9IHAubWFwKHggPT4geC5wYXRoKTtcXG4gICAgICB2YXIgdGFzayA9IGZ1bmN0aW9uKG9iaikge1xcbiAgICAgICAgbGV0IHMgPSBEYXRlLm5vdygpO1xcbiAgICAgICAgbGV0IGpzRmlsZXMgPSBbXTtcXG4gICAgICAgIGxldCBjb3VudCA9IDA7XFxuXFxuICAgICAgICBmdW5jdGlvbiBmaWx0ZXJPdGhlcihsaXN0KSB7XFxuICAgICAgICAgIHJldHVybiBsaXN0LmZpbHRlcihpdCA9PiBTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIubWluLmpzXFxcIikgfHwgU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcImRycHkyLmpzXFxcIikpXFxuICAgICAgICB9XFxuICAgICAgICBpZiAob2JqLnVybC5zdGFydHNXaXRoKFxcXCJmaWxlOlxcXCIpKSB7XFxuICAgICAgICAgIGxldCBjb2RlID0gXFxcIm5vXFxcIjtcXG4gICAgICAgICAgbGV0IHBhdGggPSBvYmoudXJsLnJlcGxhY2UoXFxcImZpbGU6Ly9cXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgIGxldCBkaXIgPSBuZXcgamF2YS5pby5GaWxlKHBhdGgpO1xcbiAgICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHtcXG4gICAgICAgICAgICBsZXQgZmxpc3QgPSBkaXIubGlzdEZpbGVzKCk7XFxuICAgICAgICAgICAgZm9yICh2YXIgZiBvZiBmbGlzdCkge1xcbiAgICAgICAgICAgICAgLy8g5qOA5p+l5paH5Lu25ZCN5piv5ZCm5LulLmpz57uT5bC+XFxuICAgICAgICAgICAgICBpZiAoZi5pc0ZpbGUoKSAmJiBmLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKFxcXCIuanNcXFwiKSkge1xcbiAgICAgICAgICAgICAgICBqc0ZpbGVzLnB1c2goZik7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9XFxuICAgICAgICAgIGlmIChkaXIuaXNGaWxlKCkgJiYgZmlsZUV4aXN0KG9iai51cmwpKSB7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgIGpzb24gPSBKU09OLnBhcnNlKHJlYWRGaWxlKG9iai51cmwpKTtcXG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24uc2l0ZXMpIHx8IGpzb24uc2l0ZXMubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgIGNvdW50ID0gZmlsdGVyT3RoZXIoanNvbi5zaXRlcykubGVuZ3RoO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgY29kZSA9IFxcXCJva1xcXCI7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKGpzRmlsZXMubGVuZ3RoID49IDUpIHtcXG4gICAgICAgICAgICBjb3VudCA9IGpzRmlsZXMubGVuZ3RoO1xcbiAgICAgICAgICAgIGNvZGUgPSBcXFwib2tcXFwiO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgdGltZTogKERhdGUubm93KCkgLSBzKSxcXG4gICAgICAgICAgICB1cmw6IG9iai51cmwsXFxuICAgICAgICAgICAgY291bnQ6IGNvdW50LFxcbiAgICAgICAgICAgIGNvZGU6IGNvZGUsXFxuICAgICAgICAgICAgaW5kZXg6IG9iai5pXFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHZhciBqID0gSlNPTi5wYXJzZShmZXRjaChvYmoudXJsLCB7XFxuICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlLFxcbiAgICAgICAgICB0aW1lb3V0OiA1MDAwLFxcbiAgICAgICAgfSkpO1xcbiAgICAgICAgbGV0IGUgPSBEYXRlLm5vdygpO1xcbiAgICAgICAgbGV0IGMgPSBlIC0gcztcXG4gICAgICAgIGlmIChvYmoudXJsLmluY2x1ZGVzKFxcXCJnaXRodWIuY29tXFxcIikgJiYgai5zdGF0dXNDb2RlID09IDIwMCkge1xcbiAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIHZhciBodG1sID0gai5ib2R5O1xcbiAgICAgICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShwZGZoKGh0bWwsIFxcXCIjcmVwby1jb250ZW50LXBqYXgtY29udGFpbmVyJiZzY3JpcHQmJkh0bWxcXFwiKSk7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBqc29uLnBheWxvYWQudHJlZS5pdGVtcztcXG4gICAgICAgICAgICBjb3VudCA9IGxpc3QuZmlsdGVyKHggPT4geC5uYW1lLmVuZHNXaXRoKFxcXCIuanNcXFwiKSkubGVuZ3RoO1xcbiAgICAgICAgICB9IGNhdGNoIHt9XFxuICAgICAgICB9XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UodG9Db3JyZWN0SlNPTlN0cmluZyhqLmJvZHkpIHx8IFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uLnNpdGVzKSB8fCBqc29uLnNpdGVzLmxlbmd0aCkge1xcbiAgICAgICAgICAgIGNvdW50ID0gZmlsdGVyT3RoZXIoanNvbi5zaXRlcykubGVuZ3RoO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcblxcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgdGltZTogYyxcXG4gICAgICAgICAgdXJsOiBqLnVybCxcXG4gICAgICAgICAgY291bnQ6IGNvdW50LFxcbiAgICAgICAgICBjb2RlOiBqLnN0YXR1c0NvZGUsXFxuICAgICAgICAgIGluZGV4OiBvYmouaSxcXG4gICAgICAgIH1cXG4gICAgICB9O1xcbiAgICAgIGxldCB0YXNrcyA9IGxpc3QubWFwKCh4LCBpKSA9PiB7XFxuICAgICAgICBpID0gaSArIDE7XFxuICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICBmdW5jOiB0YXNrLFxcbiAgICAgICAgICBwYXJhbToge1xcbiAgICAgICAgICAgIHVybDogeCxcXG4gICAgICAgICAgICBpOiBpIC0gMSxcXG4gICAgICAgICAgfSxcXG4gICAgICAgICAgaWQ6ICd0YXNraWQnICsgaVxcbiAgICAgICAgfVxcbiAgICAgIH0pO1xcbiAgICAgIHZhciBjb3VudCA9IHN1Y2Nlc3MgPSB0YXNrcy5sZW5ndGg7XFxuICAgICAgYmUodGFza3MsIHtcXG4gICAgICAgIGZ1bmM6IGZ1bmN0aW9uKG9iaiwgaWQsIGVycm9yLCB0YXNrUmVzdWx0KSB7XFxuICAgICAgICAgIG9iai5yZXN1bHRzLnB1c2godGFza1Jlc3VsdClcXG4gICAgICAgICAgY291bnQgPSBjb3VudCAtIDE7XFxuICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcXG4gICAgICAgICAgICBzaG93TG9hZGluZyhcXFwi5qOA5rWL5LitLi4u5Ymp5L2Z5Zyw5Z2A77yaXFxcIiArIGNvdW50KVxcbiAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuICAgICAgICBwYXJhbToge1xcbiAgICAgICAgICBoaTogJ2NjYycsXFxuICAgICAgICAgIHJlc3VsdHM6IHJlc3VsdHNcXG4gICAgICAgIH1cXG4gICAgICB9LCBzdWNjZXNzKTtcXG4gICAgICAvL2xvZyhyZXN1bHRzKVxcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcihmID0+IGYpO1xcbiAgICAgIHJlc3VsdHMuZm9yRWFjaCgoeCwgaSkgPT4ge1xcbiAgICAgICAgbGV0IGl0ZW0gPSBmaW5kSXRlbShcXFwicGF0aFxcXCIgKyB4LmluZGV4KTtcXG4gICAgICAgIGxldCByZWdleCA9IC8o5ZCN56ewOi4qPykoXFxcXHMrKT9cXFxcbi9nO1xcbiAgICAgICAgbGV0IHRpdGxlID0gXFxcIuWQjeensDpcXFwiICsgcFt4LmluZGV4XS5uYW1lICsgXFxcIiBcXFwiO1xcbiAgICAgICAgbGV0IHVybCA9IHBbeC5pbmRleF0ucGF0aDtcXG4gICAgICAgIGxldCBtc2cgPSBcXFwiXFxcIjtcXG4gICAgICAgIGxldCBjb3VudCA9IHguY291bnQgIT0gMCA/IFxcXCIg5rqQ5pWw6YePOlxcXCIgKyB4LmNvdW50IDogXFxcIlxcXCI7XFxuICAgICAgICBpZiAoL25vLy50ZXN0KHguY29kZSkpIHtcXG4gICAgICAgICAgbXNnID0gaXRlbS50aXRsZS5yZXBsYWNlKHJlZ2V4LCB0aXRsZSArIFxcXCLphY3nva7mnInor69cXFwiLmZvbnRjb2xvcihcXFwicmVkXFxcIikgKyBcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoL14oLTF8MHw0MDQpLy50ZXN0KHguY29kZSkpIHtcXG4gICAgICAgICAgbXNnID0gaXRlbS50aXRsZS5yZXBsYWNlKHJlZ2V4LCB0aXRsZSArIFxcXCLml6Dms5Xorr/pl65cXFwiLmZvbnRjb2xvcihcXFwicmVkXFxcIikgKyBcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoL14yMDAvLnRlc3QoeC5jb2RlKSkge1xcbiAgICAgICAgICBtc2cgPSBpdGVtLnRpdGxlLnJlcGxhY2UocmVnZXgsIHRpdGxlICsgXFxcIumAmuiur+ato+W4uFxcXCIuZm9udGNvbG9yKFxcXCIjM0NCMzcxXFxcIikgKyBcXFwiICDlu7bov586XFxcIiArIHgudGltZSArIGNvdW50ICsgXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICAgIC8vdXJsID0gaXRlbS51cmw7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICBtc2cgPSBpdGVtLnRpdGxlLnJlcGxhY2UocmVnZXgsIHRpdGxlICsgXFxcIumFjee9ruato+ehrlxcXCIuZm9udGNvbG9yKFxcXCIjM0NCMzcxXFxcIikgKyBjb3VudCArIFxcXCJcXFxcblxcXCIpO1xcbiAgICAgICAgICAvL3VybCA9IGl0ZW0udXJsO1xcbiAgICAgICAgfVxcbiAgICAgICAgdXBkYXRlSXRlbShpdGVtLmV4dHJhLmlkLCB7XFxuICAgICAgICAgIHRpdGxlOiBtc2csXFxuICAgICAgICAgIC8vdXJsOiB1cmwsXFxuICAgICAgICB9KVxcbiAgICAgIH0pO1xcbiAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfSwgcGF0aGNvbmZpZ3MpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxuICB9KVxcbiAgcGF0aGNvbmZpZ3MuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xcbiAgICBsZXQgbG9uZ0MgPSBbe1xcbiAgICAgIHRpdGxlOiBcXFwi5ZCN56ewXFxcIixcXG4gICAgICBqczogJC50b1N0cmluZygoaXRlbSwgcCwgYykgPT4ge1xcbiAgICAgICAgbGV0IGkgPSBjLmZpbmRJbmRleCh4ID0+IHgubmFtZSA9PSBpdGVtLm5hbWUpO1xcbiAgICAgICAgaWYgKGkgIT0gLTEpIHtcXG4gICAgICAgICAgcmV0dXJuICQoY1tpXS5uYW1lLCBcXFwi6L6T5YWl5paw5ZCN56ewXFxcIikuaW5wdXQoKGMsIHAsIGkpID0+IHtcXG4gICAgICAgICAgICBjW2ldLm5hbWUgPSBpbnB1dDtcXG4gICAgICAgICAgICBzYXZlRmlsZShwLCBKU09OLnN0cmluZ2lmeShjKSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgfSwgYywgcCwgaSlcXG4gICAgICAgIH1cXG4gICAgICB9LCBpdGVtLCBjcGF0aCwgcGF0aGNvbmZpZ3MpXFxuICAgIH0sIHtcXG4gICAgICB0aXRsZTogXFxcIui3r+W+hFxcXCIsXFxuICAgICAganM6ICQudG9TdHJpbmcoKGl0ZW0sIHAsIGMpID0+IHtcXG4gICAgICAgIGxldCBpID0gYy5maW5kSW5kZXgoeCA9PiB4Lm5hbWUgPT0gaXRlbS5uYW1lKTtcXG4gICAgICAgIGlmIChpICE9IC0xKSB7XFxuICAgICAgICAgIHJldHVybiAkKGNbaV0ucGF0aCwgXFxcIui+k+WFpeaWsOi3r+W+hFxcXCIpLmlucHV0KChjLCBwLCBpKSA9PiB7XFxuICAgICAgICAgICAgY1tpXS5wYXRoID0gaW5wdXQ7XFxuICAgICAgICAgICAgc2F2ZUZpbGUocCwgSlNPTi5zdHJpbmdpZnkoYykpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIH0sIGMsIHAsIGkpXFxuICAgICAgICB9XFxuICAgICAgfSwgaXRlbSwgY3BhdGgsIHBhdGhjb25maWdzKVxcbiAgICB9LCB7XFxuICAgICAgdGl0bGU6IFxcXCLliKDpmaRcXFwiLFxcbiAgICAgIGpzOiAkLnRvU3RyaW5nKChpdGVtLCBwLCBjKSA9PiB7XFxuICAgICAgICBsZXQgaSA9IGMuZmluZEluZGV4KHggPT4geC5uYW1lID09IGl0ZW0ubmFtZSk7XFxuICAgICAgICBpZiAoaSAhPSAtMSkge1xcbiAgICAgICAgICBjLnNwbGljZShpLCAxKTtcXG4gICAgICAgICAgc2F2ZUZpbGUocCwgSlNPTi5zdHJpbmdpZnkoYykpO1xcbiAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfVxcbiAgICAgIH0sIGl0ZW0sIGNwYXRoLCBwYXRoY29uZmlncylcXG4gICAgfV1cXG4gICAgaWYgKGl0ZW0ucGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICBsb25nQy5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6K6/6ZeuXFxcIixcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKChpdGVtKSA9PiB7XFxuICAgICAgICAgIGlmIChpdGVtLnBhdGguc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ3ZWI6Ly9cXFwiICsgaXRlbS5wYXRoO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9LCBpdGVtKVxcbiAgICAgIH0pXFxuICAgIH1cXG4gICAgbGV0IGN1cnJlbnQgPSBcXFwiXFxcIjtcXG4gICAgaWYgKGN1cnJlbnRjb25maWcgJiYgY3VycmVudGNvbmZpZy5oYXNPd25Qcm9wZXJ0eShcXFwicGF0aFxcXCIpKSB7XFxuICAgICAgaWYgKGl0ZW0ucGF0aCA9PSBjdXJyZW50Y29uZmlnLnBhdGgpIHtcXG4gICAgICAgIGN1cnJlbnQgPSBcXFwi4p6h77iPXFxcIjtcXG4gICAgICB9XFxuICAgIH1cXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIFxcXCI8c21hbGw+XFxcIiArIGN1cnJlbnQgKyBcXFwi5ZCN56ewOlxcXCIgKyBpdGVtLm5hbWUgKyBcXFwiXFxcXG7ot6/lvoQ6XFxcIiArIGl0ZW0ucGF0aCArIFxcXCI8L3NtYWxsPlxcXCIsXFxuICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKGl0ZW0gPT4ge1xcbiAgICAgICAgY2xlYXJJdGVtKFxcXCJub19sb2FkaW5nXFxcIik7XFxuICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgbGV0IHtcXG4gICAgICAgICAgcGF0aCxcXG4gICAgICAgICAgbmFtZVxcbiAgICAgICAgfSA9IGl0ZW07XFxuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuato+WcqOWKoOi9vemFjee9ri4uLlxcXCIpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHJ1bnRpbWVDb25maWcuc2V0Q3VycmVudENvbmZpZyh7XFxuICAgICAgICAgIHBhdGgsXFxuICAgICAgICAgIG5hbWUsXFxuICAgICAgICB9KSkge1xcbiAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiKTtcXG4gICAgICAgICAgRHJweU1hbmFnZS5jbGVhcigpO1xcbiAgICAgICAgICAkLnJlcXVpcmUoXFxcIkNoYW5nZVNvdXJjZVBvcFxcXCIpLnNob3coMTAwKTtcXG4gICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liIfmjaLlpLHotKVcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgIH0sIGl0ZW0pLFxcbiAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgaWQ6ICdwYXRoJyArIGksXFxuICAgICAgICBsb25nQ2xpY2s6IGxvbmdDXFxuICAgICAgfVxcbiAgICB9KVxcbiAgfSlcXG59XFxuXFxuXFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmjaLmupDlvLnnqpdcIixcInBhdGhcIjpcIkNoYW5nZVNvdXJjZVBvcFwiLFwicnVsZVwiOlwiJC5leHBvcnRzLnNob3cgPSBmdW5jdGlvbih0aW1lKSB7XFxuICAgIGlmICh0aW1lKSB7XFxuICAgICAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKHRpbWUpO1xcbiAgICB9XFxuICAgIGNvbnN0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZSgpO1xcbiAgICBsZXQgbmFtZSA9IHNvdXJjZSA/IHNvdXJjZS5uYW1lIDogXFxcIlxcXCI7XFxuICAgIGNvbnN0IGhpa2VyUG9wID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD02OTY2XFxcIik7XFxuICAgIGxldCBzb3VyY2VOYW1lTGlzdCA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlKCkubWFwKHYgPT4ge1xcbiAgICAgICAgcmV0dXJuIHYubmFtZSA9PSBuYW1lID8gXFxcIuKAmOKAmFxcXCIgKyB2Lm5hbWUgKyBcXFwi4oCZ4oCZXFxcIiA6IHYubmFtZTtcXG4gICAgfSk7XFxuICAgIGhpa2VyUG9wLnNldFVzZVN0YXJ0QWN0aXZpdHkoZmFsc2UpO1xcblxcbiAgICBmdW5jdGlvbiBuYXR1cmFsU29ydChhLCBiKSB7XFxuICAgICAgICBhID0gYS5yZXBsYWNlKC9b4oCZ4oCYXS9nLCBcXFwiXFxcIik7XFxuICAgICAgICBiID0gYi5yZXBsYWNlKC9b4oCZ4oCYXS9nLCBcXFwiXFxcIik7XFxuICAgICAgICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIsIHVuZGVmaW5lZCwge1xcbiAgICAgICAgICAgIG51bWVyaWM6IHRydWUsXFxuICAgICAgICAgICAgc2Vuc2l0aXZpdHk6ICdiYXNlJ1xcbiAgICAgICAgfSk7XFxuICAgIH1cXG5cXG4gICAgbGV0IHNwZW4gPSAzO1xcbiAgICBsZXQgaXRlbXMgPSBzb3VyY2VOYW1lTGlzdC5tYXAoKHgsIGkpID0+IHtcXG4gICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgdGl0bGU6IHgsXFxuICAgICAgICAgICAgdXJsOiBpXFxuICAgICAgICB9XFxuICAgIH0pXFxuXFxuICAgIGxldCBuYW1lcyA9IGl0ZW1zLm1hcCh2ID0+IHYudGl0bGUpO1xcbiAgICBsZXQgc25hbWUgPSBuYW1lcy5zbGljZSgpO1xcbiAgICBpZiAoZ2V0SXRlbShcXFwibmF0dXJhbFxcXCIsIFxcXCJcXFwiKSkge1xcbiAgICAgICAgbmFtZXMgPSBuYW1lcy5zb3J0KG5hdHVyYWxTb3J0KTtcXG4gICAgfVxcbiAgICBsZXQgbWFuYWdlX2FsbCA9IG5hbWVzLnNsaWNlKCk7XFxuICAgIGxldCBzZWFyY2hLZXkgPSBcXFwiXFxcIjtcXG4gICAgbGV0IHBvcCA9IGhpa2VyUG9wLnNlbGVjdEJvdHRvbVJlcyh7XFxuICAgICAgICBvcHRpb25zOiBuYW1lcyxcXG4gICAgICAgIGNvbHVtbnM6IHNwZW4sXFxuICAgICAgICB0aXRsZTogXFxcIumAieaLqeinhumikea6kFxcXCIgKyBcXFwi5b2T5YmN5YWxOlxcXCIgKyBpdGVtcy5sZW5ndGggKyBcXFwi5Liq6KeG6aKR5rqQXFxcIixcXG4gICAgICAgIG5vQXV0b0Rpc21pc3M6IHRydWUsXFxuICAgICAgICBwb3NpdGlvbjogMSxcXG4gICAgICAgIGV4dHJhSW5wdXRCb3g6IG5ldyBoaWtlclBvcC5SZXNFeHRyYUlucHV0Qm94KHtcXG4gICAgICAgICAgICBoaW50OiBcXFwi5rqQ5YWz6ZSu5a2XXFxcIixcXG4gICAgICAgICAgICB0aXRsZTogXFxcIm9rXFxcIixcXG4gICAgICAgICAgICBvbkNoYW5nZSh0ZXh0LCBtYW5hZ2UpIHtcXG4gICAgICAgICAgICAgICAgLy9sb2coXFxcIm9uQ2hhbmdlOlxcXCIrdGV4dClcXG4gICAgICAgICAgICAgICAgbGV0IGZsaXN0ID0gbmFtZXMuZmlsdGVyKHggPT4geC5pbmNsdWRlcyh0ZXh0KSk7XFxuICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgICAgIGZsaXN0LmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHgpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICAgICAgICBjbGljayhzLCBtYW5hZ2UpIHtcXG4gICAgICAgICAgICAgICAgLy90b2FzdChzKTtcXG4gICAgICAgICAgICAgICAgLy9sb2cobWFuYWdlLmxpc3QpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgfSksXFxuICAgICAgICBsb25nQ2xpY2socywgaSkge1xcbiAgICAgICAgICAgIHNob3dTZWxlY3RPcHRpb25zKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLliIbkuqvop4bpopHmupBcXFwiLFxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBbXFxcIkpT5paH5Lu25YiG5LqrXFxcIl0uY29uY2F0KGdldFBhc3RlcygpKSxcXG4gICAgICAgICAgICAgICAgY29sOiAyLFxcbiAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZyhuYW1lID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBzb3VyY2VzID0gcnVudGltZUNvbmZpZy5nZXRBbGxTb3VyY2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBzb3VyY2UgPSBzb3VyY2VzLmZpbmQodiA9PiB2Lm5hbWUgPT0gbmFtZSk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IHJ1bnRpbWVDb25maWcuZ2V0QWJzb2x1dGVQYXRoKHNvdXJjZS5leHQpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBuYW1lID0gcGF0aC5zcGxpdChcXFwiL1xcXCIpLmF0KC0xKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlPWZldGNoKHBhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYoIXJ1bGUpIHJldHVybiBcXFwidG9hc3Q6Ly/ojrflj5blpLHotKVcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKE1ZX0lOREVYID09PSAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS9cXFwiICsgcG5hbWUsIGZldGNoKHBhdGgpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInNoYXJlOi8vaGlrZXI6Ly9maWxlcy9fY2FjaGUvXFxcIiArIHBuYW1lO1xcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybD1zaGFyZVBhc3RlKGJhc2U2NEVuY29kZShydWxlKSwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgXFxcImNvcHk6Ly/mtbfpmJTop4bnlYzvvIxEUlBZ6KeG6aKR5rqQ44CMXFxcIiArIG5hbWUgKyBcXFwi44CN5aSN5Yi25pW05p2h5Y+j5Luk5omT5byA6L2v5Lu25bCx5Lya6Ieq5Yqo5a+85YWlJFxcXCIgKyB1cmwgICsgXFxcIiRcXFwiK3BuYW1lK1xcXCJAaW1wb3J0PWpzOiQucmVxdWlyZSgnaW1wb3J0P3J1bGU9JytcXFwiICsgSlNPTi5zdHJpbmdpZnkoTVlfUlVMRS50aXRsZSkgKyBcXFwiKShpbnB1dCwgdHJ1ZSlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9LCBzLnJlcGxhY2UoL1vigJnigJhdL2csIFxcXCJcXFwiKSlcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0sXFxuICAgICAgICBjbGljayhzLCBpLCBtYW5hZ2UpIHtcXG4gICAgICAgICAgICBwb3AuZGlzbWlzcygpO1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcIm5vX2xvYWRpbmdcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICAgIC8vIG1hbmFnZS5saXN0LmZvckVhY2goKHYsIGlpKSA9PiAoXFxuICAgICAgICAgICAgLy8gICBtYW5hZ2UubGlzdFtpaV0gPSBpID09PSBpaSA/IFxcXCLigJjigJhcXFwiICsgbmFtZXNbaWldICsgXFxcIuKAmeKAmVxcXCIgOiBuYW1lc1tpaV0ucmVwbGFjZSgvW+KAmeKAmF0vZywgXFxcIlxcXCIpXFxuICAgICAgICAgICAgLy8gKSk7XFxuICAgICAgICAgICAgbGV0IG5hbWUgPSBtYW5hZ2UubGlzdFtpXS5yZXBsYWNlKC9b4oCZ4oCYXS9nLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgaWYgKG5hbWUgPT0gc291cmNlLm5hbWUpIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgc291cmNlcyA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlKCk7XFxuICAgICAgICAgICAgbGV0IGtleSA9IHNvdXJjZXMuZmluZCh2ID0+IHYubmFtZSA9PSBuYW1lKS5rZXk7XFxuXFxuICAgICAgICAgICAgLy9tYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgbGV0IHNvdXJjZU5hbWVMaXN0ID0gcnVudGltZUNvbmZpZy5zZXRDdXJyZW50U291cmNlKGtleSk7XFxuICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwiY2F0ZWlcXFwiKTtcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXCJjYXRlX29ialxcXCIpO1xcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcImlzaG9tZVxcXCIpO1xcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcImxpbmtzXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG5cXG4gICAgICAgIH0sXFxuICAgICAgICBtZW51Q2xpY2sobWFuYWdlKSB7XFxuICAgICAgICAgICAgaGlrZXJQb3Auc2VsZWN0Q2VudGVyKHtcXG4gICAgICAgICAgICAgICAgb3B0aW9uczogW1xcXCLmlLnlj5jmoLflvI9cXFwiLCBcXFwi562b6YCJ5rqQXFxcIiwgXFxcIuiHqueEtuaOkuW6jzpcXFwiICsgKGdldEl0ZW0oXFxcIm5hdHVyYWxcXFwiLCBcXFwiXFxcIikgPT0gXFxcIlxcXCIgPyBcXFwi5YWz6ZetXFxcIiA6IFxcXCLlkK/nlKhcXFwiKSwgXFxcIuWAkuW6j1xcXCIsIFxcXCLliLfmlrDphY3nva5cXFwiXSxcXG4gICAgICAgICAgICAgICAgY29sdW1uczogMixcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLor7fpgInmi6lcXFwiLFxcbiAgICAgICAgICAgICAgICBjbGljayhzLCBpKSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZW4gPSBzcGVuID09IDMgPyAxIDogMztcXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlQ29sdW1ucyhzcGVuKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpa2VyUG9wLmlucHV0Q29uZmlybSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFxcXCLovpPlhaXlhbPplK7lrZcg56m65pi+56S65YWo6YOoXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLnrZvpgInmupBcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50OiBcXFwi5rqQ5YWz6ZSu5a2XXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBzZWFyY2hLZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRhcmVhOiBmYWxzZSwgLy/lpJrooYzmqKHlvI9cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGV4dGFyZWE6IHRydWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vQXV0b1NvZnQ6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hpZGVDYW5jZWw6IHRydWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm0odGV4dCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiLCBcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoS2V5ID0gdGV4dDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0ID0gcnVudGltZUNvbmZpZy5nZXRBbGxTb3VyY2UoKS5tYXAoeCA9PiB4Lm5hbWUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZsaXN0ID0gbGlzdC5maWx0ZXIoeCA9PiB4LmluY2x1ZGVzKHRleHQpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlzdC5mb3JFYWNoKHggPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goeCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIFxcXCJ0b2FzdDovL+i+k+WFpeS6hlxcXCIgKyB0ZXh0O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID09PSAyKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3QgPSBPYmplY3QuYXNzaWduKFtdLCBtYW5hZ2UubGlzdCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hdHVyYWwgPSBnZXRJdGVtKFxcXCJuYXR1cmFsXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYXR1cmFsID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Quc29ydChuYXR1cmFsU29ydCkuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goeCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYW1lLmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwibmF0dXJhbFxcXCIsIG5hdHVyYWwgPyBcXFwiXFxcIiA6IFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnJldmVyc2UoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5yZXZlcnNlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhcnJheURpZmZlcmVuY2UoYXJyMSwgYXJyMikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGFycjIubWFwKGl0ZW0gPT4gW2l0ZW0ua2V5LCBpdGVtXSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyMS5maWx0ZXIoaXRlbSA9PiAhbWFwLmhhcyhpdGVtLmtleSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIsIFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3QgPSBydW50aW1lQ29uZmlnLmdldEFsbFNvdXJjZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBDa2V5ID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCkua2V5O1xcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbG9nKENrZXkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNmZyA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudENvbmZpZygpXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gPSBjZmc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUNvbmZpZy5zZXRDdXJyZW50Q29uZmlnKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQ29uZmlnLnNldEN1cnJlbnRTb3VyY2UoQ2tleSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5zb3VyY2VzID0gcnVudGltZUNvbmZpZy5nZXRBbGxTb3VyY2UoKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWxpc3QgPSBhcnJheURpZmZlcmVuY2UobnNvdXJjZXMsIGxpc3QpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkbGlzdCA9IGFycmF5RGlmZmVyZW5jZShsaXN0LCBuc291cmNlcyk7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsaXN0Lmxlbmd0aCA+IDAgfHwgZGxpc3QubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXNnID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGlzdC5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlzdC5mb3JFYWNoKHggPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goeC5uYW1lKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coXFxcIuaWsOWinjpcXFwiICsgYWxpc3QubWFwKGsgPT4gay5uYW1lKS5qb2luKFxcXCIsXFxcIikpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gXFxcIuaWsOWinlxcXCIgKyBhbGlzdC5sZW5ndGggKyBcXFwi5Liq5rqQXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGxpc3QubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGxpc3QuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5zcGxpY2UobWFuYWdlLmxpc3QuaW5kZXhPZih4Lm5hbWUpLCAxKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coXFxcIuenu+mZpDpcXFwiICsgZGxpc3QubWFwKGsgPT4gay5uYW1lKS5qb2luKFxcXCIsXFxcIikpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gXFxcIiDnp7vpmaRcXFwiICsgZGxpc3QubGVuZ3RoICsgXFxcIuS4qua6kFxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2FzdChtc2cgKyBcXFwiIOabtOWkmuivpuaDheeci2xvZ1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLlt7LliLfmlrBcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcImRycHnnrqHnkIZcIixcInBhdGhcIjpcIkRycHlNYW5hZ2VcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IEpTRW5naW5lID0gY29tLmV4YW1wbGUuaGlrZXJ2aWV3LnNlcnZpY2UucGFyc2VyLkpTRW5naW5lO1xcbmNvbnN0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG5jb25zdCBkcnB5TWFwID0gbmV3IE1hcCgpO1xcbmNvbnN0IEdNa2V5ID0gbW9kdWxlLmltcG9ydFBhcmFtO1xcbmxvZyhcXFwi5Yid5aeL5YyWRHJweU1hbmFnZVxcXCIpO1xcblxcbmZ1bmN0aW9uIGJ1aWxkSnNFbnYodGlja2V0KSB7XFxuICAgIGxldCBjb2RlID0gU3RyaW5nLnJhdyBgXFxuICAgIC8vIGNvbnN0IG15X3J1bGUgPSAnXFxuICAgIGNvbnN0IE1ZX1JVTEUgPSAke215X3J1bGV9O1xcbiAgICBjb25zdCBteV9ydWxlID0gSlNPTi5zdHJpbmdpZnkoTVlfUlVMRSk7XFxuICAgIGNvbnN0IE1ZX1RJQ0tFVCA9IFxcXCIke3RpY2tldHx8XFxcIlxcXCJ9XFxcIjtcXG4gICAgZXZhbChnZXRKc1BsdWdpbigpKTtcXG4gICAgZXZhbChnZXRKc0xhenlQbHVnaW4oKSk7XFxuICAgIGA7XFxuICAgIHJldHVybiBjb2RlO1xcbn1cXG5cXG5mdW5jdGlvbiBzeW5jKGZ1bmMsIHNwKSB7XFxuICAgIHJldHVybiBuZXcgb3JnLm1vemlsbGEuamF2YXNjcmlwdC5TeW5jaHJvbml6ZXIoZnVuYywgc3AgfHwge30pO1xcbn1cXG5cXG5mdW5jdGlvbiBjcmVhdGVEcnB5KGtleSkge1xcbiAgICBKU0VuZ2luZS5nZXRJbnN0YW5jZSgpLmV2YWxKUyhidWlsZEpzRW52KE1ZX1RJQ0tFVCkgKyBcXFwiXFxcXG4hXFxcIiArICQudG9TdHJpbmcoKGtleSwgR01rZXksIE1ZX1RJQ0tFVCkgPT4ge1xcbiAgICAgICAgbGV0IGRycHkgPSAkLnJlcXVpcmUoXFxcImRycHlcXFwiKTtcXG4gICAgICAgIEdNLmhhcyhHTWtleSwgKERycHlNYW5hZ2UpID0+IHtcXG4gICAgICAgICAgICBEcnB5TWFuYWdlLnB1dChrZXksIGRycHkpO1xcbiAgICAgICAgfSk7XFxuICAgIH0sIGtleSwgR01rZXksIE1ZX1RJQ0tFVCkgKyBcXFwiO1xcXFxuXFxcIiwgXFxcIlxcXCIsIGZhbHNlKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0KGtleSkge1xcbiAgcmV0dXJuIHN5bmMoKCkgPT4ge1xcbiAgICAvL2xvZyhkcnB5TWFwLnNpemUpXFxuICAgIGlmIChkcnB5TWFwLmhhcyhrZXkpKSB7XFxuICAgICAgcmV0dXJuIGRycHlNYXAuZ2V0KGtleSk7XFxuICAgIH1cXG4gICAgaWYgKGRycHlNYXAuc2l6ZSA+PSA1KSB7XFxuICAgICAgbG9nKFxcXCLor7fmsYI6XFxcIiArIGtleSlcXG4gICAgICBkZWwoQXJyYXkuZnJvbShkcnB5TWFwLmtleXMoKSkuYXQoMCkpO1xcbiAgICB9XFxuICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEFsbFNvdXJjZXMoKS5maW5kKHYgPT4gdi5rZXkgPT09IGtleSk7XFxuICAgIGNyZWF0ZURycHkoa2V5KTtcXG4gICAgbGV0IGRycHkgPSBkcnB5TWFwLmdldChrZXkpO1xcbiAgICBkcnB5LmluaXQocnVudGltZUNvbmZpZy5nZXRBYnNvbHV0ZVBhdGgoc291cmNlLmV4dCkpO1xcbiAgICByZXR1cm4gZHJweTtcXG4gIH0sIHRoaXMpLmNhbGwoKTtcXG59XFxuLy9zb3VyY2UuZXh05b+F6aG75Li657ud5a+56Lev5b6EXFxuZnVuY3Rpb24gZ2V0QnlTb3VyY2Uoc291cmNlKXtcXG4gICAgcmV0dXJuIHN5bmMoKCkgPT4ge1xcbiAgICAgICAgbGV0IGtleT1zb3VyY2Uua2V5O1xcbiAgICAgICAgLy9sb2coZHJweU1hcC5zaXplKVxcbiAgICAgICAgaWYgKGRycHlNYXAuaGFzKGtleSkpIHtcXG4gICAgICAgICAgICByZXR1cm4gZHJweU1hcC5nZXQoa2V5KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChkcnB5TWFwLnNpemUgPj0gNSkge1xcbiAgICAgICAgICAgIGxvZyhcXFwi6K+35rGCOlxcXCIgKyBrZXkpXFxuICAgICAgICAgICAgZGVsKEFycmF5LmZyb20oZHJweU1hcC5rZXlzKCkpLmF0KDApKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGNyZWF0ZURycHkoa2V5KTtcXG4gICAgICAgIGxldCBkcnB5ID0gZHJweU1hcC5nZXQoa2V5KTtcXG4gICAgICAgIGRycHkuaW5pdChzb3VyY2UuZXh0KTtcXG4gICAgICAgIHJldHVybiBkcnB5O1xcbiAgICB9LCB0aGlzKS5jYWxsKCk7XFxufVxcbmZ1bmN0aW9uIHB1dChrZXksIGRycHkpIHtcXG4gICAgc3luYygoKSA9PiBkcnB5TWFwLnNldChrZXksIGRycHkpLCB0aGlzKS5jYWxsKCk7XFxufVxcblxcbmZ1bmN0aW9uIGRlbChrZXkpIHtcXG4gICAgc3luYygoKSA9PiB7XFxuICAgICAgICBsb2coXFxcIuWIoOmZpFxcXCIgKyBrZXkpO1xcbiAgICAgICAgaWYgKGRycHlNYXAuaGFzKGtleSkpIHtcXG4gICAgICAgICAgICBkcnB5TWFwLmRlbGV0ZShrZXkpO1xcbiAgICAgICAgfVxcbiAgICB9LCB0aGlzKS5jYWxsKCk7XFxufVxcbmxldCBpc0luaXRIb21lID0gZmFsc2U7XFxuLy9sZXQgaXNJbml0U2VhcmNoID0gZmFsc2U7XFxubGV0IGlzSW5pdEVyUGFnZSA9IGZhbHNlO1xcblxcbmZ1bmN0aW9uIGluaXRQYWdlKHR5cGUpIHtcXG4gICAgc3dpdGNoICh0eXBlKSB7XFxuICAgICAgICBjYXNlIFxcXCJob21lXFxcIjpcXG4gICAgICAgICAgICBpc0luaXRIb21lID0gdHJ1ZTtcXG4gICAgICAgICAgICAvL2Nhc2UgXFxcInNlYXJjaFxcXCI6XFxuICAgICAgICAgICAgLy8gICAgaXNJbml0U2VhcmNoID0gdHJ1ZTtcXG4gICAgICAgIGNhc2UgXFxcImVyXFxcIjpcXG4gICAgICAgICAgICBpc0luaXRlclBhZ2UgPSB0cnVlO1xcbiAgICB9XFxuICAgIGFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoR01rZXksIHR5cGUpID0+IHtcXG4gICAgICAgIGxvZyhcXFwib25DbG9zZVxcXCIpO1xcbiAgICAgICAgR00uaGFzKEdNa2V5LCBEcnB5TWFuYWdlID0+IHtcXG4gICAgICAgICAgICBsb2coXFxcIuaciUdNa2V5XFxcIik7XFxuICAgICAgICAgICAgRHJweU1hbmFnZS5jbGVhcih0eXBlKTtcXG4gICAgICAgIH0pO1xcbiAgICB9LCBHTWtleSwgdHlwZSkpO1xcbn1cXG5cXG5mdW5jdGlvbiBjbGVhcih0eXBlKSB7XFxuICAgIHN3aXRjaCAodHlwZSkge1xcbiAgICAgICAgY2FzZSBcXFwiaG9tZVxcXCI6XFxuICAgICAgICAgICAgaXNJbml0SG9tZSA9IGZhbHNlO1xcbiAgICAgICAgLy9jYXNlIFxcXCJzZWFyY2hcXFwiOlxcbiAgICAgICAgLy8gICAgaXNJbml0U2VhcmNoID0gZmFsc2U7XFxuICAgICAgICBjYXNlIFxcXCJlclxcXCI6XFxuICAgICAgICAgICAgaXNJbml0ZXJQYWdlID0gZmFsc2U7XFxuICAgIH1cXG5cXG4gICAgaWYgKCFpc0luaXRIb21lICYmICFpc0luaXRFclBhZ2UpIHtcXG4gICAgICAgIGxvZyhcXFwi5byA5aeL5riF55CGXFxcIik7XFxuICAgICAgICBkcnB5TWFwLmNsZWFyKCk7XFxuICAgICAgICBHTS5jbGVhcihHTWtleSk7XFxuICAgIH1cXG59XFxuJC5leHBvcnRzID0ge1xcbiAgICBpbml0UGFnZSxcXG4gICAgZ2V0LFxcbiAgICBnZXRCeVNvdXJjZSxcXG4gICAgZGVsLFxcbiAgICBjbGVhcixcXG4gICAgcHV0XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5oyH5a6a5pCc57Si5by556qXXCIsXCJwYXRoXCI6XCJTZWFyY2hBbGxvd1BvcFwiLFwicnVsZVwiOlwianM6XFxuJC5leHBvcnRzLnNob3cgPSBmdW5jdGlvbiAoKSB7XFxuICBjb25zdCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIiwgXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gIGNvbnN0IGhpa2VyUG9wID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD02OTY2XFxcIik7XFxuICBsZXQgc2VhcmNoQWxsb3cgPSBydW50aW1lQ29uZmlnLmdldFNlYXJjaEFsbG93KCk7XFxuXFxuICBsZXQgY2FuU2VhcmNoU291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDYW5TZWFyY2hTb3VyY2UoKTtcXG4gIC8vbGV0IHNvdXJjZU5hbWVMaXN0ID0gY2FuU2VhcmNoU291cmNlLm1hcCh2PT52Lm5hbWUpO1xcbiAgbGV0IGdldE5hbWVzID0gKCkgPT4gZHluYW1pY1NvdXJjZS5tYXAodiA9PiBzZWFyY2hBbGxvdy5pbmNsdWRlcyh2LmtleSkgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArICh2Lm5hbWUgKyBcXFwiXFxcIikuZm9udGNvbG9yKFxcXCIjMDA5OTY2XFxcIikgOiB2Lm5hbWUpO1xcbiAgbGV0IHNwZW4gPSAzO1xcblxcbiAgLy9sZXQgZHluYW1pY05hbWVzID0gc291cmNlTmFtZUxpc3Quc2xpY2UoKTtcXG4gIGxldCBkeW5hbWljU291cmNlID0gY2FuU2VhcmNoU291cmNlLnNsaWNlKCk7XFxuICBsZXQgc2VhcmNob25jb3VudCA9IGR5bmFtaWNTb3VyY2UuZmlsdGVyKHYgPT4gc2VhcmNoQWxsb3cuaW5jbHVkZXModi5rZXkpKS5sZW5ndGg7XFxuICBpZiAoc2VhcmNob25jb3VudCA9PSAwKSB7XFxuICAgIHNlYXJjaG9uY291bnQgPSBjYW5TZWFyY2hTb3VyY2UubGVuZ3RoO1xcbiAgfVxcblxcbiAgbGV0IHNlYXJjaEtleSA9IFxcXCJcXFwiO1xcbiAgaGlrZXJQb3Auc2VsZWN0Qm90dG9tUmVzKHtcXG4gICAgb3B0aW9uczogZ2V0TmFtZXMoKSxcXG4gICAgY29sdW1uczogc3BlbixcXG4gICAgdGl0bGU6IFxcXCLlkK/nlKjmkJzntKLmupA6XFxcIiArIHNlYXJjaG9uY291bnQgKyBcXFwi5LiqIOWFsTpcXFwiICsgY2FuU2VhcmNoU291cmNlLmxlbmd0aCArIFxcXCLkuKrmkJzntKLmupBcXFwiLFxcbiAgICBub0F1dG9EaXNtaXNzOiB0cnVlLFxcbiAgICBwb3NpdGlvbjogMSxcXG4gICAgaGVpZ2h0OiAuOSxcXG4gICAgZXh0cmFJbnB1dEJveDogbmV3IGhpa2VyUG9wLlJlc0V4dHJhSW5wdXRCb3goe1xcbiAgICAgIGhpbnQ6IFxcXCLmupDlhbPplK7lrZcg5aSa5Liq55SofOmalOW8gFxcXCIsXFxuICAgICAgdGl0bGU6IFxcXCJva1xcXCIsXFxuICAgICAgb25DaGFuZ2UodGV4dCwgbWFuYWdlKSB7XFxuICAgICAgICAvL2xvZyhcXFwib25DaGFuZ2U6XFxcIit0ZXh0KVxcbiAgICAgICAgc2VhcmNoS2V5ID0gdGV4dDtcXG4gICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuICAgICAgICBkeW5hbWljU291cmNlLmxlbmd0aCA9IDA7XFxuICAgICAgICBpZiAodGV4dCkge1xcbiAgICAgICAgICBjYW5TZWFyY2hTb3VyY2UuZm9yRWFjaCgodiwgaSkgPT4ge1xcbiAgICAgICAgICAgIGlmICh0ZXh0LnNwbGl0KC9cXFxcfC8pLmZpbHRlcihmID0+IGYpLnNvbWUoeCA9PiB2Lm5hbWUuaW5jbHVkZXMoeCkpKSB7XFxuICAgICAgICAgICAgICBkeW5hbWljU291cmNlLnB1c2godik7XFxuICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHNlYXJjaEFsbG93LmluY2x1ZGVzKHYua2V5KSA/IFxcXCLigJzigJzigJ3igJ1cXFwiICsgKHYubmFtZSArIFxcXCJcXFwiKS5mb250Y29sb3IoXFxcIiMwMDk5NjZcXFwiKSA6IHYubmFtZSlcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgZHluYW1pY1NvdXJjZSA9IGNhblNlYXJjaFNvdXJjZS5zbGljZSgpO1xcbiAgICAgICAgICBPYmplY3QuYXNzaWduKG1hbmFnZS5saXN0LCBnZXROYW1lcygpKTtcXG5cXG4gICAgICAgIH1cXG4gICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICB9LFxcbiAgICAgIGRlZmF1bHRWYWx1ZTogXFxcIlxcXCIsXFxuICAgICAgY2xpY2socywgbWFuYWdlKSB7XFxuICAgICAgICAvL3RvYXN0KHMpO1xcbiAgICAgICAgLy9sb2cobWFuYWdlLmxpc3QpO1xcbiAgICAgIH0sXFxuICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZVxcbiAgICB9KSxcXG4gICAgY2xpY2socywgaSwgbWFuYWdlKSB7XFxuXFxuICAgICAgbGV0IGtleSA9IGR5bmFtaWNTb3VyY2VbaV0ua2V5O1xcbiAgICAgIGxldCBpbmRleCA9IC0xO1xcbiAgICAgIGlmICgoaW5kZXggPSBzZWFyY2hBbGxvdy5pbmRleE9mKGtleSkpICE9PSAtMSkge1xcbiAgICAgICAgbWFuYWdlLmxpc3RbaV0gPSBkeW5hbWljU291cmNlW2ldLm5hbWU7XFxuICAgICAgICBzZWFyY2hBbGxvdy5zcGxpY2UoaW5kZXgsIDEpO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICBtYW5hZ2UubGlzdFtpXSA9IFxcXCLigJzigJzigJ3igJ1cXFwiICsgKGR5bmFtaWNTb3VyY2VbaV0ubmFtZSArIFxcXCJcXFwiKS5mb250Y29sb3IoXFxcIiMwMDk5NjZcXFwiKTtcXG4gICAgICAgIHNlYXJjaEFsbG93LnB1c2goa2V5KTtcXG4gICAgICB9XFxuXFxuICAgICAgcnVudGltZUNvbmZpZy5zZXRTZWFyY2hBbGxvdygpO1xcbiAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgfSxcXG4gICAgbWVudUNsaWNrKG1hbmFnZSkge1xcbiAgICAgIGhpa2VyUG9wLnNlbGVjdENlbnRlcih7XFxuICAgICAgICBvcHRpb25zOiBbXFxcIuaUueWPmOagt+W8j1xcXCIsIFxcXCLnrZvpgInmupBcXFwiLCBcXFwi6Ieq54S25o6S5bqPXFxcIiwgXFxcIuWAkuW6j1xcXCIsIFxcXCLlhajpgIlcXFwiLCBcXFwi5Y+N6YCJXFxcIl0sXFxuICAgICAgICBjb2x1bW5zOiAyLFxcbiAgICAgICAgdGl0bGU6IFxcXCLor7fpgInmi6lcXFwiLFxcbiAgICAgICAgY2xpY2socywgaSkge1xcbiAgICAgICAgICBpZiAoaSA9PT0gMCkge1xcbiAgICAgICAgICAgIHNwZW4gPSBzcGVuID09IDMgPyAxIDogMztcXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlQ29sdW1ucyhzcGVuKTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09PSAxKSB7XFxuICAgICAgICAgICAgaGlrZXJQb3AuaW5wdXRDb25maXJtKHtcXG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFxcXCLovpPlhaXlhbPplK7lrZcg56m65pi+56S65YWo6YOoXFxcIixcXG4gICAgICAgICAgICAgIHRpdGxlOiBcXFwi562b6YCJ5rqQXFxcIixcXG4gICAgICAgICAgICAgIGhpbnQ6IFxcXCLmupDlhbPplK7lrZcg5aSa5Liq55SofOmalOW8gFxcXCIsXFxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHNlYXJjaEtleSxcXG4gICAgICAgICAgICAgIHRleHRhcmVhOiBmYWxzZSwgLy/lpJrooYzmqKHlvI9cXG4gICAgICAgICAgICAgIG1heFRleHRhcmVhOiB0cnVlLFxcbiAgICAgICAgICAgICAgbm9BdXRvU29mdDogZmFsc2UsXFxuICAgICAgICAgICAgICAvL2hpZGVDYW5jZWw6IHRydWUsXFxuICAgICAgICAgICAgICBjb25maXJtKHRleHQpIHtcXG4gICAgICAgICAgICAgICAgc2VhcmNoS2V5ID0gdGV4dDtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICAgICAgZHluYW1pY1NvdXJjZS5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgICAgICBpZiAodGV4dCkge1xcbiAgICAgICAgICAgICAgICAgIGNhblNlYXJjaFNvdXJjZS5mb3JFYWNoKCh2LCBpKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAodGV4dC5zcGxpdCgvXFxcXHwvKS5maWx0ZXIoZiA9PiBmKS5zb21lKHggPT4gdi5uYW1lLmluY2x1ZGVzKHgpKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljU291cmNlLnB1c2godik7XFxuICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goc2VhcmNoQWxsb3cuaW5jbHVkZXModi5rZXkpID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyAodi5uYW1lICsgXFxcIlxcXCIpLmZvbnRjb2xvcihcXFwiIzAwOTk2NlxcXCIpIDogdi5uYW1lKVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UgPSBjYW5TZWFyY2hTb3VyY2Uuc2xpY2UoKTtcXG4gICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKG1hbmFnZS5saXN0LCBnZXROYW1lcygpKTtcXG5cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFxcXCJ0b2FzdDovL+i+k+WFpeS6hlxcXCIgKyB0ZXh0O1xcbiAgICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09PSAyKSB7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBPYmplY3QuYXNzaWduKFtdLCBtYW5hZ2UubGlzdCk7XFxuICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG5cXG5cXG4gICAgICAgICAgICBkeW5hbWljU291cmNlLnNvcnQoKGEsIGIpID0+IHtcXG4gICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoYS5uYW1lKS5sb2NhbGVDb21wYXJlKFN0cmluZyhiLm5hbWUpLCB1bmRlZmluZWQsIHtcXG4gICAgICAgICAgICAgICAgbnVtZXJpYzogdHJ1ZSxcXG4gICAgICAgICAgICAgICAgc2Vuc2l0aXZpdHk6ICdiYXNlJ1xcbiAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtYW5hZ2UubGlzdCwgZ2V0TmFtZXMoKSk7XFxuICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMykge1xcbiAgICAgICAgICAgIG1hbmFnZS5saXN0LnJldmVyc2UoKTtcXG4gICAgICAgICAgICBkeW5hbWljU291cmNlLnJldmVyc2UoKTtcXG5cXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSA0KSB7XFxuICAgICAgICAgICAgZHluYW1pY1NvdXJjZS5mb3JFYWNoKHYgPT4ge1xcbiAgICAgICAgICAgICAgaWYgKCFzZWFyY2hBbGxvdy5pbmNsdWRlcyh2KSkge1xcbiAgICAgICAgICAgICAgICBzZWFyY2hBbGxvdy5wdXNoKHYua2V5KTtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1hbmFnZS5saXN0LCBnZXROYW1lcygpKTtcXG4gICAgICAgICAgICBydW50aW1lQ29uZmlnLnNldFNlYXJjaEFsbG93KCk7XFxuICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gNSkge1xcbiAgICAgICAgICAgIGxldCB0ZW1saXN0ID0gc2VhcmNoQWxsb3cuc2xpY2UoKTtcXG4gICAgICAgICAgICBzZWFyY2hBbGxvdy5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UuZm9yRWFjaCh2ID0+IHtcXG4gICAgICAgICAgICAgIGlmICh0ZW1saXN0LmluY2x1ZGVzKHYua2V5KSkgcmV0dXJuO1xcbiAgICAgICAgICAgICAgc2VhcmNoQWxsb3cucHVzaCh2LmtleSk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtYW5hZ2UubGlzdCwgZ2V0TmFtZXMoKSk7XFxuICAgICAgICAgICAgcnVudGltZUNvbmZpZy5zZXRTZWFyY2hBbGxvdygpO1xcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSxcXG4gICAgICB9KTtcXG4gICAgfVxcbiAgfSk7XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5YiG57G7XCIsXCJwYXRoXCI6XCJjYXRlZ29yeXNcIixcInJ1bGVcIjpcImpzOlxcbmxldCBmbCA9IHt9O1xcbmxldCByZXN1bHRzID0gW107XFxubGV0IGhvbWVsaXN0ID0gW107XFxubGV0IGNhdGUgPSBcXFwiXFxcIjtcXG5cXG5mdW5jdGlvbiBnZXRDYXRlZ29yeXMobGF5b3V0LGRycHksIHBhZ2UpIHtcXG4gIGxldCBydWxlPWRycHkucnVuTWFpbignZnVuY3Rpb24gbWFpbigpe3JldHVybiBydWxlfScpO1xcbiAgbGV0IGxvYWRpPWxheW91dC5maW5kSW5kZXgoeD0+eC5leHRyYSYmeC5leHRyYS5pZD09TVlfUlVMRS50aXRsZStcXFwibG9hZFxcXCIpO1xcbiAgaWYocnVsZS7kuIDnuqc9PVxcXCJcXFwifHxydWxlLuS4gOe6pz09dW5kZWZpbmVkKXtcXG4gICAgaWYgKGxvYWRpICE9IC0xKSB7XFxuICAgICAgbGF5b3V0LnNwbGljZShsb2FkaSwgMSlcXG4gICAgfVxcbiAgICBjbGVhck15VmFyKFxcXCJsaW5rc1xcXCIpO1xcbiAgICBsYXlvdXQubGVuZ3RoPTA7XFxuICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+l5rqQ5Li65pCc57Si5rqQ77yM5LuF6IO96YCa6L+H5pCc57Si6K6/6Zeu5pWw5o2uXFxcIilcXG4gIH1cXG4gIHZhciBnZXRSYW5nZUNvbG9ycyA9IGZ1bmN0aW9uICgpIHtcXG4gICAgcmV0dXJuICcjJyArICgnMDAwMDAnICsgKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAgPDwgMCkudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTYpO1xcbiAgfVxcbiAgbGV0IGNhdGVnb3J5cyA9IEpTT04ucGFyc2UoZHJweS5ob21lKCkpO1xcbiAgbGV0IGZpbHRlcnMgPSBjYXRlZ29yeXMuZmlsdGVycztcXG4gIGxldCBjYXRlcyA9IGNhdGVnb3J5cy5jbGFzcyB8fCBbXTtcXG4gIGlmIChwYWdlID09IDEpIHtcXG4gICAgaG9tZWxpc3QgPSBKU09OLnBhcnNlKGRycHkuaG9tZVZvZCgpKS5saXN0O1xcbiAgICBpZiAoaG9tZWxpc3QgIT0gdW5kZWZpbmVkICYmIGhvbWVsaXN0Lmxlbmd0aCkge1xcbiAgICAgIHB1dE15VmFyKFxcXCJpc2hvbWVcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICB9XFxuICB9XFxuICBpZiAoY2F0ZXMubGVuZ3RoID09IDAgJiYgKGhvbWVsaXN0ID09IHVuZGVmaW5lZCB8fCBob21lbGlzdC5sZW5ndGggPT0gMCkpIHtcXG4gICAgaWYgKGxvYWRpICE9IC0xKSB7XFxuICAgICAgbGF5b3V0LnNwbGljZShsb2FkaSwgMSlcXG4gICAgfVxcbiAgICBjbGVhck15VmFyKFxcXCJsaW5rc1xcXCIpO1xcbiAgICBsYXlvdXQubGVuZ3RoPTA7XFxuICAgIHRocm93IG5ldyBFcnJvcihcXFwi5YiG57G76I635Y+W5aSx6LSl5Y+v6IO9572R57uc6Zeu6aKYXFxcIik7XFxuICB9XFxuICBpZiAoZ2V0TXlWYXIoXFxcImlzaG9tZVxcXCIsIFxcXCIwXFxcIikgPT0gXFxcIjFcXFwiKSB7XFxuICAgIGNhdGVzLnVuc2hpZnQoe1xcbiAgICAgIHR5cGVfbmFtZTogJ+aOqOiNkCcsXFxuICAgICAgdHlwZV9pZDogJ2hvbWUnLFxcbiAgICB9KVxcbiAgfVxcbiAgaWYobG9hZGkhPS0xKXtcXG4gICAgICBsYXlvdXQuc3BsaWNlKGxvYWRpLDEpXFxuICB9XFxuICBwdXRNeVZhcihcXFwibGlua3NcXFwiLFxcXCIxXFxcIik7XFxuICBsZXQgY2F0ZWkgPSBnZXRNeVZhcihcXFwiY2F0ZWlcXFwiLCBcXFwiMFxcXCIpO1xcbiAgY2F0ZSA9IGNhdGVzW2NhdGVpXS50eXBlX2lkO1xcblxcbiAgdmFyIGZvbGQgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJmb2xkXFxcIiwgXFxcIjBcXFwiKTtcXG4gIGxldCBjb2xvciA9IGdldFJhbmdlQ29sb3JzKCk7XFxuXFxuICBpZiAocGFnZSA9PSAxKSB7XFxuICAgIGNhdGVzLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXG4gICAgICBsZXQgdCA9IGNhdGVpID09IGkgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCI8Yj5cXFwiK2l0ZW0udHlwZV9uYW1lLmZvbnRjb2xvcihjb2xvcikgK1xcXCI8L2I+XFxcIjogaXRlbS50eXBlX25hbWU7XFxuICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHQsXFxuICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGksIHRpZCkgPT4ge1xcbiAgICAgICAgICBwdXRNeVZhcihcXFwiY2F0ZWlcXFwiLCBpKTtcXG4gICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIGksIGl0ZW0udHlwZV9pZCksXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgdGlkOiBpdGVtLnR5cGVfaWQsXFxuICAgICAgICAgIGFjdGl2ZTogY2F0ZWkgPT0gaSA/IHRydWUgOiBmYWxzZSxcXG4gICAgICAgIH1cXG4gICAgICB9KVxcbiAgICB9KVxcbiAgfVxcblxcbiAgaWYgKGNhdGUgIT0gJ2hvbWUnICYmIHBhZ2UgPT0gMSkge1xcbiAgICBsZXQgaG9tZWkgPSBsYXlvdXQuZmluZEluZGV4KHggPT4ge1xcbiAgICAgIHJldHVybiB4LmV4dHJhICYmIHguZXh0cmEudGlkID09IFxcXCJob21lXFxcIlxcbiAgICB9KTtcXG4gICAgaWYgKGhvbWVpID09IC0xKSB7XFxuICAgICAgaG9tZWkgPSBsYXlvdXQuZmluZEluZGV4KHggPT4ge1xcbiAgICAgICAgcmV0dXJuIHguZXh0cmEgJiYgeC5leHRyYS50aWQ7XFxuICAgICAgfSkgLSAxO1xcbiAgICB9XFxuICAgIGlmIChmaWx0ZXJzICYmIGZpbHRlcnMuaGFzT3duUHJvcGVydHkoY2F0ZSkpIHtcXG4gICAgICBpZiAoaG9tZWkgIT0gLTEpIHtcXG4gICAgICAgIGxheW91dC5zcGxpY2UoaG9tZWkgKyAxLCAwLCB7XFxuICAgICAgICAgIHRpdGxlOiBmb2xkID09IFxcXCIwXFxcIiA/IFxcXCLigJzigJzigJ3igJ08Yj5cXFwiICsgXFxcIuKIp1xcXCIuZm9udGNvbG9yKFxcXCIjMWFhZDE5XFxcIikgKyBcXFwiPC9iPlxcXCIgOiBcXFwi4oCc4oCc4oCd4oCdPGI+XFxcIiArIFxcXCLiiKhcXFwiLmZvbnRjb2xvcihcXFwiI0ZGMDAwMFxcXCIpICsgXFxcIjwvYj5cXFwiLFxcbiAgICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiLFxcbiAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGZvbGQpID0+IHtcXG4gICAgICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJmb2xkXFxcIiwgZm9sZCA9PSBcXFwiMFxcXCIgPyBcXFwiMVxcXCIgOiBcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgfSwgZm9sZCksXFxuICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgICB9XFxuXFxuICAgICAgbGV0IGFjdGl2ZWkgPSBsYXlvdXQuZmluZEluZGV4KHggPT4geC5leHRyYSAmJiB4LmV4dHJhLmFjdGl2ZSk7XFxuICAgICAgaWYgKGFjdGl2ZWkgIT0gLTEpIHtcXG4gICAgICAgIGxheW91dC5zcGxpY2UoYWN0aXZlaSwgMCwge1xcbiAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyAn8J+MgCcsXFxuICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoYykgPT4ge1xcbiAgICAgICAgICAgIGxldCBjYXRlX29iaiA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJjYXRlX29ialxcXCIsIHt9KTtcXG4gICAgICAgICAgICBkZWxldGUgY2F0ZV9vYmpbY107XFxuICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcImNhdGVfb2JqXFxcIiwgY2F0ZV9vYmopO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+a4hemZpOWujOaIkFxcXCI7XFxuICAgICAgICAgIH0sIGNhdGUpXFxuICAgICAgICB9KVxcbiAgICAgIH1cXG5cXG4gICAgICBsZXQgY2xhc3NpZnkgPSBmaWx0ZXJzW2NhdGVdO1xcbiAgICAgIHZhciBpbml0X2NhdGUgPSBuZXcgQXJyYXkoY2xhc3NpZnkubGVuZ3RoKS5maWxsKFxcXCItMVxcXCIpO1xcbiAgICAgIGxldCBjYXRlX29iaiA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJjYXRlX29ialxcXCIsIHt9KTtcXG4gICAgICBjYXRlX29ialtjYXRlXSA9IGNhdGVfb2JqW2NhdGVdID8gY2F0ZV9vYmpbY2F0ZV0gOiBpbml0X2NhdGVcXG4gICAgICB2YXIgY2F0ZV90ZW1wID0gY2F0ZV9vYmpbY2F0ZV07XFxuICAgICAgLy92YXIgZmlsdGVyX2RlZj1zdG9yYWdlMC5nZXRJdGVtKFxcXCJmaWx0ZXJfZGVmXFxcIiwge30pO1xcbiAgICAgIGNsYXNzaWZ5LmZvckVhY2goKHgsIGluZGV4KSA9PiB7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgIGNvbF90eXBlOiAnYmxhbmtfYmxvY2snXFxuICAgICAgICB9KVxcbiAgICAgICAgeC52YWx1ZS5mb3JFYWNoKChpdCwgaSkgPT4ge1xcbiAgICAgICAgICBsZXQgdCA9IGl0Lm47XFxuICAgICAgICAgIGlmIChjYXRlX3RlbXBbaW5kZXhdID09IGkpIHtcXG4gICAgICAgICAgICB0ID0gXFxcIjxiPjxmb250IGNvbG9yPVxcXCIgKyBjb2xvciArIFxcXCI+XFxcIiArIHQgKyBcXFwiPC9mb250PjwvYj5cXFwiO1xcbiAgICAgICAgICAgIGZsW3gua2V5XSA9IGl0LnY7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKGNhdGVfdGVtcFtpbmRleF0gPT0gXFxcIi0xXFxcIikge1xcbiAgICAgICAgICAgIGZsW3gua2V5XSA9IFxcXCJ1bmRlZmluZWRcXFwiO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGlmIChmb2xkID09IDEpIHtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyB0LFxcbiAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChvKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBpID0gby5pO1xcbiAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwiaXNfZGVmXFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IGNhdGVfb2JqID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImNhdGVfb2JqXFxcIiwge30pO1xcblxcbiAgICAgICAgICAgICAgICBsZXQgY2F0ZV90ZW1wID0gby5jYXRlX3RlbXA7XFxuICAgICAgICAgICAgICAgIGlmIChjYXRlX3RlbXAuY29uc3RydWN0b3IgIT0gQXJyYXkpIHtcXG4gICAgICAgICAgICAgICAgICBjYXRlX3RlbXAgPSBbXTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBvLmluZGV4O1xcbiAgICAgICAgICAgICAgICBsZXQgYyA9IGNhdGVfdGVtcFtpbmRleF0gfHwgXFxcIi0xXFxcIjtcXG4gICAgICAgICAgICAgICAgLy9sb2coYylcXG4gICAgICAgICAgICAgICAgaWYgKGMgPT0gaSkge1xcbiAgICAgICAgICAgICAgICAgIG8uY2F0ZV90ZW1wW2luZGV4XSA9IFxcXCItMVxcXCI7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgby5jYXRlX3RlbXBbaW5kZXhdID0gaSArIFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGNhdGVfb2JqW28uY2F0ZV0gPSBjYXRlX3RlbXA7XFxuICAgICAgICAgICAgICAgIC8vbG9nKGNhdGVfdGVtcClcXG4gICAgICAgICAgICAgICAgLy9zdG9yYWdlMC5wdXRNeVZhcihcXFwiY2F0ZV90ZW1wXFxcIiwgY2F0ZV90ZW1wKTtcXG4gICAgICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcImNhdGVfb2JqXFxcIiwgY2F0ZV9vYmopO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXFxuICAgICAgICAgICAgICAgIGNhdGVfdGVtcDogY2F0ZV90ZW1wLFxcbiAgICAgICAgICAgICAgICBpOiBpLFxcbiAgICAgICAgICAgICAgICBjYXRlOiBjYXRlXFxuICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgICB9KVxcbiAgICB9XFxuICB9XFxufVxcblxcbmZ1bmN0aW9uIGdldEZsKCkge1xcbiAgZmwgPSBPYmplY3Qua2V5cyhmbCkuZmlsdGVyKGtleSA9PiBmbFtrZXldICE9PSBcXFwidW5kZWZpbmVkXFxcIikucmVkdWNlKChyZXMsIGtleSkgPT4ge1xcbiAgICByZXNba2V5XSA9IGZsW2tleV07XFxuICAgIHJldHVybiByZXM7XFxuICB9LCB7fSk7XFxuICByZXR1cm4gZmxcXG59XFxuXFxuZnVuY3Rpb24gZ2V0Q2F0ZUxpc3QoKSB7XFxuICByZXR1cm4ge1xcbiAgICBjYXRlLFxcbiAgICBob21lbGlzdFxcbiAgfVxcbn1cXG5cXG5cXG4kLmV4cG9ydHMgPSB7XFxuICBnZXRjYXRlbGlzdDogZ2V0Q2F0ZUxpc3QsXFxuICBnZXRjYXRlZ29yeXM6IGdldENhdGVnb3J5cyxcXG4gIGdldGZsOiBnZXRGbFxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuacrOWcsOinhOWImeeuoeeQhlwiLFwicGF0aFwiOlwiTG9jYWxEaXJcIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi5paH5Lu2566h55CGXFxcIik7XFxubGV0IHBhdGggPSBnZXRQYXRoKFN0cmluZyhNWV9QQVJBTVMuY3BhdGgpKS5yZXBsYWNlKFxcXCJmaWxlOi8vXFxcIiwgXFxcIlxcXCIpO1xcbmxldCBmaWxlU2VsZWN0ID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcIik7XFxuZmlsZVNlbGVjdC5maWxlU2VsZWN0aW9uKHtcXG4gICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgcmV0dXJuIFxcXCJlZGl0RmlsZTovL2ZpbGU6Ly9cXFwiICsgUEFUSDtcXG4gICAgfSksXFxuICAgIG1lbW9yeTogXFxcImZpbGVwYXRoXFxcIixcXG4gICAgZmlsZVR5cGU6IFxcXCIuanNcXFwiLFxcbiAgICBleGl0U2VhcmNoUmVmcmVzaDogdHJ1ZSxcXG4gICAgcGF0dGVybjogMCxcXG4gICAgcm9vdERpclBhdGg6IHBhdGgsXFxuICAgIGluaXRpYWxQYXRoOiBwYXRoLFxcbn0sIE1ZX1BBUkFNUy5uZXdXaW5kb3cgPyBbXSA6IFt7XFxuICAgIHRpdGxlOiBcXFwi5paw56qX5Y+j5omT5byAXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL0xvY2FsRGlyI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBjcGF0aDogTVlfUEFSQU1TLmNwYXRoLFxcbiAgICAgICAgbmV3V2luZG93OiB0cnVlLFxcbiAgICAgICAgd2luZG93SWQ6IE1ZX1JVTEUudGl0bGUgKyBcXFwiQGVkaXRmaWxlXFxcIixcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIHBhZ2VUaXRsZTogXFxcIuaWh+S7tueuoeeQhlxcXCJcXG4gICAgfVxcbn1dKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIum7mOiupOS/neWtmOmAieaLqVwiLFwicGF0aFwiOlwic2hhcmVkZWZhdWx0cGF0aFwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLkv53lrZjot6/lvoRcXFwiKTtcXG5sZXQgbGF5b3V0ID0gW107XFxubGV0IGYgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFwiKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gICAgY2xlYXJNeVZhcihcXFwiZHJweUhpa2VyX3NoYXJlX2lucHV0XFxcIik7XFxufSk7XFxuXFxubGV0IHBhdGggPSBqb2luVXJsKGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvXFxcIiksIFxcXCIuLi9cXFwiLnJlcGVhdCg1KSkuc2xpY2UoNyk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqVxcXCIsXFxuICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXCIpLmV4dHJhO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgcm9vdERpclBhdGg6IHBhdGgsXFxuICAgICAgICBpbml0aWFsUGF0aDogcGF0aCxcXG4gICAgICAgIHBhdHRlcm46IDFcXG4gICAgfSkpLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuWCqOWtmOi3r+W+hFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfc2hhcmVfaW5wdXRcXFwiLCBnZXRQdWJsaWNJdGVtKFxcXCJEcnB5SGlrZXJAaW5wdXRfcGF0aFxcXCIsIFxcXCJcXFwiKSksXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfc2hhcmVfaW5wdXRcXFwiXFxuICAgIH1cXG59KTtcXG5cXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi56Gu6K6kXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpZCkgPT4ge1xcbiAgICAgICAgbGV0IHBhdGggPSBnZXRNeVZhcihcXFwiZHJweUhpa2VyX3NoYXJlX2lucHV0XFxcIiwgXFxcIlxcXCIpO1xcblxcbiAgICAgICAgaWYgKCFwYXRoKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S4jeWPr+S4uuepulxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBzZXRQdWJsaWNJdGVtKFxcXCJEcnB5SGlrZXJAaW5wdXRfcGF0aFxcXCIsIHBhdGgpO1xcbiAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxufSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9XSxcInNhdmVkXCI6ZmFsc2UsXCJ0aXRsZVwiOlwiRHJweUhpa2VyXCIsXCJ2ZXJzaW9uXCI6MCxcInVybFwiOlwiaGlrZXI6Ly9wYWdlL2NyZWF0ZUNvbmZpZyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcIixcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJmaW5kX3J1bGVcIjpcImpzOlxcbmxldCBsYXlvdXQgPSBbXTtcXG5zZXRQYWdlVGl0bGUoXFxcIuWIm+W7uumFjee9rlxcXCIpO1xcbmxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxubGV0IGN1cnJlbnRjb25maWcgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRDb25maWcoKTtcXG5sZXQgZiA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXCIpO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgKCkgPT4ge1xcbiAgY2xlYXJNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19uYW1lXFxcIik7XFxuICBjbGVhck15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFwiKTtcXG59KTtcXG5cXG4vL+WOhuWPsumFjee9ruiusOW9lVxcbmZ1bmN0aW9uIHVuaXF1ZUFycmF5QnlQcm9wZXJ0eShhcnJheSwgcHJvcGVydHkpIHtcXG4gIGxldCB1bmlxdWUgPSBbXTtcXG4gIGxldCBtYXAgPSBuZXcgTWFwKCk7XFxuICBmb3IgKGxldCBpdGVtIG9mIGFycmF5KSB7XFxuICAgIGxldCBrZXkgPSBpdGVtW3Byb3BlcnR5XTtcXG4gICAgaWYgKCFtYXAuaGFzKGtleSkpIHtcXG4gICAgICBtYXAuc2V0KGtleSwgdHJ1ZSk7XFxuICAgICAgdW5pcXVlLnB1c2goaXRlbSk7XFxuICAgIH1cXG4gIH1cXG4gIHJldHVybiB1bmlxdWU7XFxufVxcbmxldCBjcGF0aCA9IFxcXCJoaWtlcjovL2ZpbGVzL2NhY2hlL1xcXCIgKyBcXFwiZHJweWNvbmZpZy5qc29uXFxcIjtcXG5sZXQgcGF0aGNvbmZpZ3MgPSBbXTtcXG50cnkge1xcbiAgcGF0aGNvbmZpZ3MgPSBKU09OLnBhcnNlKHJlYWRGaWxlKGNwYXRoKSkgfHwgW107XFxuICAvL3B1dE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnc1xcXCIscGF0aGNvbmZpZ3MpO1xcbn0gY2F0Y2ggKGUpIHtcXG4gIGNvbnNvbGUubG9nKGUubWVzc2FnZSk7XFxufVxcbnBhdGhjb25maWdzID0gdW5pcXVlQXJyYXlCeVByb3BlcnR5KHBhdGhjb25maWdzLCBcXFwicGF0aFxcXCIpO1xcbi8vbG9nKHBhdGhjb25maWdzKVxcblxcbmxldCBjb25maWdzX29iaiA9IHtcXG4gIHBhdGg6IGNwYXRoLFxcbiAgY29uZmlnczogcGF0aGNvbmZpZ3NcXG59XFxuLy/ljoblj7LphY3nva7orrDlvZVcXG5cXG5sYXlvdXQucHVzaCh7XFxuICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gIGRlc2M6IFxcXCLphY3nva7lkI3np7Ao5b+F5aGrKSAg6Lev5b6E5ZKM5paH5Lu25aS56YCJ5LqM6YCJ5LiAXFxcIixcXG4gIGV4dHJhOiB7XFxuICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfbmFtZVxcXCIsIFxcXCJcXFwiKSxcXG4gICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgIHB1dE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX25hbWVcXFwiLCBpbnB1dCk7XFxuICAgIH0pLFxcbiAgICBpZDogXFxcImRycHlIaWtlcl9jb25maWdfbmFtZVxcXCJcXG4gIH1cXG59KTtcXG5cXG5sZXQgc2VsZWN0X21vZGUgPSBnZXRJdGVtKFxcXCJzZWxlY3RfY29uZmlnX21vZGVcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCBuYXYgPSBbXFxcIui3r+W+hC9VUkxcXFwiLCBcXFwi5paH5Lu25aS5XFxcIl07XFxuXFxubmF2LmZvckVhY2goKHgsIGkpID0+IHtcXG4gIGxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgKGkgPT0gc2VsZWN0X21vZGUgPyB4LmZvbnRjb2xvcihcXFwiIzE1Qjc2Q1xcXCIpIDogeCksXFxuICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSkgPT4ge1xcbiAgICAgIHNldEl0ZW0oXFxcInNlbGVjdF9jb25maWdfbW9kZVxcXCIsIGkgKyBcXFwiXFxcIik7XFxuICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCBpKSxcXG4gICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gIH0pXFxufSlcXG5cXG5cXG5sZXQgcGF0aCA9IGpvaW5VcmwoZ2V0UGF0aChcXFwiaGlrZXI6Ly9maWxlcy9cXFwiKSwgXFxcIi4uL1xcXCIucmVwZWF0KDUpKS5zbGljZSg3KTtcXG5cXG5pZiAoc2VsZWN0X21vZGUgPT0gXFxcIjBcXFwiKSB7XFxuICBsYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6YCJ5oupXFxcIixcXG4gICAgdXJsOiBKU09OLnN0cmluZ2lmeShmLmZpbGVTZWxlY3Rpb25Vcmkoe1xcbiAgICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIGxldCB0YXJnZXQgPSBmaW5kSXRlbShcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIikuZXh0cmE7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFwiLCB7XFxuICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHRhcmdldCwge1xcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogUEFUSFxcbiAgICAgICAgICB9KVxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICB9KSxcXG4gICAgICByb290RGlyUGF0aDogcGF0aCxcXG4gICAgICBpbml0aWFsUGF0aDogcGF0aCxcXG4gICAgICBwYXR0ZXJuOiAwLFxcbiAgICAgIGZpbGVUeXBlOiBcXFwiLmpzb25cXFwiLFxcbiAgICB9KSksXFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi6YWN572u6Lev5b6EL1VSTCDmnKzlnLDpgInmi6lpbmRleC5qc29uXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICBkZWZhdWx0VmFsdWU6IFxcXCJcXFwiLFxcbiAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFwiLCBpbnB1dCk7XFxuICAgICAgfSksXFxuICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFwiXFxuICAgIH1cXG4gIH0pO1xcbn1cXG5pZiAoc2VsZWN0X21vZGUgPT0gXFxcIjFcXFwiKSB7XFxuICBsYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6YCJ5oupXFxcIixcXG4gICAgdXJsOiBKU09OLnN0cmluZ2lmeShmLmZpbGVTZWxlY3Rpb25Vcmkoe1xcbiAgICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIGxldCB0YXJnZXQgPSBmaW5kSXRlbShcXFwiZHJweUhpa2VyX2NvbmZpZ19mb2xkZXJcXFwiKS5leHRyYTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oXFxcImRycHlIaWtlcl9jb25maWdfZm9sZGVyXFxcIiwge1xcbiAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXG4gICAgICAgICAgfSlcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgfSksXFxuICAgICAgcm9vdERpclBhdGg6IHBhdGgsXFxuICAgICAgaW5pdGlhbFBhdGg6IHBhdGgsXFxuICAgICAgcGF0dGVybjogMSxcXG4gICAgICAvL2ZpbGVUeXBlOiBcXFwiLmpzb25cXFwiLFxcbiAgICB9KSksXFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi6YWN572u5paH5Lu25aS56Lev5b6EIOmAieaLqWRycHlfanPnm67lvZVcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgIGRlZmF1bHRWYWx1ZTogXFxcIlxcXCIsXFxuICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCIsIGlucHV0KTtcXG4gICAgICB9KSxcXG4gICAgICBpZDogXFxcImRycHlIaWtlcl9jb25maWdfZm9sZGVyXFxcIlxcbiAgICB9XFxuICB9KTtcXG59XFxubGF5b3V0LnB1c2goe1xcbiAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gIHRpdGxlOiBcXFwi56Gu6K6kXFxcIixcXG4gIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoY29iaikgPT4ge1xcbiAgICBsZXQgcGF0aCA9IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFwiLCBcXFwiXFxcIik7XFxuICAgIGxldCBuYW1lID0gZ2V0TXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfbmFtZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgaWYgKCEocGF0aCAmJiBuYW1lKSkge1xcbiAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kuI3lj6/kuLrnqbpcXFwiO1xcbiAgICB9XFxuICAgIHBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSA/IHBhdGggOiBwYXRoLnN0YXJ0c1dpdGgoXFxcIi9cXFwiKSA/IChcXFwiZmlsZTovL1xcXCIgKyBwYXRoKSA6IHBhdGg7XFxuICAgIC8vbG9nKHBhdGgpXFxuICAgIHRyeSB7XFxuICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgIHNob3dMb2FkaW5nKFxcXCLmraPlnKjliqDovb3phY3nva4uLi5cXFwiKTtcXG4gICAgICB9XFxuXFxuICAgICAgaWYgKHJ1bnRpbWVDb25maWcuc2V0Q3VycmVudENvbmZpZyh7XFxuICAgICAgICBwYXRoLFxcbiAgICAgICAgbmFtZSxcXG4gICAgICB9KSkge1xcbiAgICAgICAgY29iai5jb25maWdzLnB1c2goe1xcbiAgICAgICAgICBwYXRoLFxcbiAgICAgICAgICBuYW1lLFxcbiAgICAgICAgfSlcXG4gICAgICAgIGNsZWFySXRlbShcXFwibm9fbG9hZGluZ1xcXCIpO1xcbiAgICAgICAgc2F2ZUZpbGUoY29iai5wYXRoLCBKU09OLnN0cmluZ2lmeShjb2JqLmNvbmZpZ3MpKTtcXG4gICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiKTtcXG4gICAgICAgIERycHlNYW5hZ2UuY2xlYXIoKTtcXG4gICAgICAgICQucmVxdWlyZShcXFwiQ2hhbmdlU291cmNlUG9wXFxcIikuc2hvdygxMDApO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgICAgfVxcbiAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/phY3nva7mlofku7bmnInor69cXFwiO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBlLnRvU3RyaW5nKCk7XFxuICAgIH0gZmluYWxseSB7XFxuICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgfVxcbiAgfSwgY29uZmlnc19vYmopLFxcbiAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG59KTtcXG5cXG5pZiAocGF0aGNvbmZpZ3MubGVuZ3RoKSB7XFxuICBsYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIFxcXCI8c21hbGw+5Y6G5Y+y6YWN572u6K6w5b2VIOeCueaIkei/m+ihjOmFjee9ruajgOmqjDwvc21hbGw+XFxcIixcXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChwKSA9PiB7XFxuICAgICAgLy9sb2cocClcXG4gICAgICBmdW5jdGlvbiB1bmlxdWUoYXJyKSB7XFxuICAgICAgICBjb25zdCByZXMgPSBuZXcgTWFwKCk7XFxuICAgICAgICByZXR1cm4gYXJyLmZpbHRlcigoYSkgPT4gIXJlcy5oYXMoYSkgJiYgcmVzLnNldChhLCAxKSlcXG4gICAgICB9XFxuICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcXG4gICAgICBpZiAocC5sZW5ndGggPT0gMCkge1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aXoOWcsOWdgFxcXCI7XFxuICAgICAgfVxcbiAgICAgIGxpc3QgPSBwLm1hcCh4ID0+IHgucGF0aCk7XFxuICAgICAgdmFyIHRhc2sgPSBmdW5jdGlvbihvYmopIHtcXG4gICAgICAgIGxldCBzID0gRGF0ZS5ub3coKTtcXG4gICAgICAgIGxldCBqc0ZpbGVzID0gW107XFxuICAgICAgICBsZXQgY291bnQgPSAwO1xcblxcbiAgICAgICAgZnVuY3Rpb24gZmlsdGVyT3RoZXIobGlzdCkge1xcbiAgICAgICAgICByZXR1cm4gbGlzdC5maWx0ZXIoaXQgPT4gU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcImRycHkyLm1pbi5qc1xcXCIpIHx8IFN0cmluZyhpdC5hcGkpLmluY2x1ZGVzKFxcXCJkcnB5Mi5qc1xcXCIpKVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKG9iai51cmwuc3RhcnRzV2l0aChcXFwiZmlsZTpcXFwiKSkge1xcbiAgICAgICAgICBsZXQgY29kZSA9IFxcXCJub1xcXCI7XFxuICAgICAgICAgIGxldCBwYXRoID0gb2JqLnVybC5yZXBsYWNlKFxcXCJmaWxlOi8vXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICBsZXQgZGlyID0gbmV3IGphdmEuaW8uRmlsZShwYXRoKTtcXG4gICAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7XFxuICAgICAgICAgICAgbGV0IGZsaXN0ID0gZGlyLmxpc3RGaWxlcygpO1xcbiAgICAgICAgICAgIGZvciAodmFyIGYgb2YgZmxpc3QpIHtcXG4gICAgICAgICAgICAgIC8vIOajgOafpeaWh+S7tuWQjeaYr+WQpuS7pS5qc+e7k+WwvlxcbiAgICAgICAgICAgICAgaWYgKGYuaXNGaWxlKCkgJiYgZi5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChcXFwiLmpzXFxcIikpIHtcXG4gICAgICAgICAgICAgICAganNGaWxlcy5wdXNoKGYpO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfVxcbiAgICAgICAgICBpZiAoZGlyLmlzRmlsZSgpICYmIGZpbGVFeGlzdChvYmoudXJsKSkge1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICBqc29uID0gSlNPTi5wYXJzZShyZWFkRmlsZShvYmoudXJsKSk7XFxuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uLnNpdGVzKSB8fCBqc29uLnNpdGVzLmxlbmd0aCkge1xcbiAgICAgICAgICAgICAgICBjb3VudCA9IGZpbHRlck90aGVyKGpzb24uc2l0ZXMpLmxlbmd0aDtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgIGNvZGUgPSBcXFwib2tcXFwiO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGlmIChqc0ZpbGVzLmxlbmd0aCA+PSA1KSB7XFxuICAgICAgICAgICAgY291bnQgPSBqc0ZpbGVzLmxlbmd0aDtcXG4gICAgICAgICAgICBjb2RlID0gXFxcIm9rXFxcIjtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgIHRpbWU6IChEYXRlLm5vdygpIC0gcyksXFxuICAgICAgICAgICAgdXJsOiBvYmoudXJsLFxcbiAgICAgICAgICAgIGNvdW50OiBjb3VudCxcXG4gICAgICAgICAgICBjb2RlOiBjb2RlLFxcbiAgICAgICAgICAgIGluZGV4OiBvYmouaVxcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICB2YXIgaiA9IEpTT04ucGFyc2UoZmV0Y2gob2JqLnVybCwge1xcbiAgICAgICAgICB3aXRoSGVhZGVyczogdHJ1ZSxcXG4gICAgICAgICAgdGltZW91dDogNTAwMCxcXG4gICAgICAgIH0pKTtcXG4gICAgICAgIGxldCBlID0gRGF0ZS5ub3coKTtcXG4gICAgICAgIGxldCBjID0gZSAtIHM7XFxuICAgICAgICBpZiAob2JqLnVybC5pbmNsdWRlcyhcXFwiZ2l0aHViLmNvbVxcXCIpICYmIGouc3RhdHVzQ29kZSA9PSAyMDApIHtcXG4gICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICB2YXIgaHRtbCA9IGouYm9keTtcXG4gICAgICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2UocGRmaChodG1sLCBcXFwiI3JlcG8tY29udGVudC1wamF4LWNvbnRhaW5lciYmc2NyaXB0JiZIdG1sXFxcIikpO1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0ganNvbi5wYXlsb2FkLnRyZWUuaXRlbXM7XFxuICAgICAgICAgICAgY291bnQgPSBsaXN0LmZpbHRlcih4ID0+IHgubmFtZS5lbmRzV2l0aChcXFwiLmpzXFxcIikpLmxlbmd0aDtcXG4gICAgICAgICAgfSBjYXRjaCB7fVxcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKHRvQ29ycmVjdEpTT05TdHJpbmcoai5ib2R5KSB8fCBcXFwie31cXFwiKTtcXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbi5zaXRlcykgfHwganNvbi5zaXRlcy5sZW5ndGgpIHtcXG4gICAgICAgICAgICBjb3VudCA9IGZpbHRlck90aGVyKGpzb24uc2l0ZXMpLmxlbmd0aDtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge31cXG5cXG4gICAgICAgIHJldHVybiB7XFxuICAgICAgICAgIHRpbWU6IGMsXFxuICAgICAgICAgIHVybDogai51cmwsXFxuICAgICAgICAgIGNvdW50OiBjb3VudCxcXG4gICAgICAgICAgY29kZTogai5zdGF0dXNDb2RlLFxcbiAgICAgICAgICBpbmRleDogb2JqLmksXFxuICAgICAgICB9XFxuICAgICAgfTtcXG4gICAgICBsZXQgdGFza3MgPSBsaXN0Lm1hcCgoeCwgaSkgPT4ge1xcbiAgICAgICAgaSA9IGkgKyAxO1xcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgZnVuYzogdGFzayxcXG4gICAgICAgICAgcGFyYW06IHtcXG4gICAgICAgICAgICB1cmw6IHgsXFxuICAgICAgICAgICAgaTogaSAtIDEsXFxuICAgICAgICAgIH0sXFxuICAgICAgICAgIGlkOiAndGFza2lkJyArIGlcXG4gICAgICAgIH1cXG4gICAgICB9KTtcXG4gICAgICB2YXIgY291bnQgPSBzdWNjZXNzID0gdGFza3MubGVuZ3RoO1xcbiAgICAgIGJlKHRhc2tzLCB7XFxuICAgICAgICBmdW5jOiBmdW5jdGlvbihvYmosIGlkLCBlcnJvciwgdGFza1Jlc3VsdCkge1xcbiAgICAgICAgICBvYmoucmVzdWx0cy5wdXNoKHRhc2tSZXN1bHQpXFxuICAgICAgICAgIGNvdW50ID0gY291bnQgLSAxO1xcbiAgICAgICAgICBpZiAoY291bnQgPiAwKSB7XFxuICAgICAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuajgOa1i+S4rS4uLuWJqeS9meWcsOWdgO+8mlxcXCIgKyBjb3VudClcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9LFxcbiAgICAgICAgcGFyYW06IHtcXG4gICAgICAgICAgaGk6ICdjY2MnLFxcbiAgICAgICAgICByZXN1bHRzOiByZXN1bHRzXFxuICAgICAgICB9XFxuICAgICAgfSwgc3VjY2Vzcyk7XFxuICAgICAgLy9sb2cocmVzdWx0cylcXG4gICAgICByZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIoZiA9PiBmKTtcXG4gICAgICByZXN1bHRzLmZvckVhY2goKHgsIGkpID0+IHtcXG4gICAgICAgIGxldCBpdGVtID0gZmluZEl0ZW0oXFxcInBhdGhcXFwiICsgeC5pbmRleCk7XFxuICAgICAgICBsZXQgcmVnZXggPSAvKOWQjeensDouKj8pKFxcXFxzKyk/XFxcXG4vZztcXG4gICAgICAgIGxldCB0aXRsZSA9IFxcXCLlkI3np7A6XFxcIiArIHBbeC5pbmRleF0ubmFtZSArIFxcXCIgXFxcIjtcXG4gICAgICAgIGxldCB1cmwgPSBwW3guaW5kZXhdLnBhdGg7XFxuICAgICAgICBsZXQgbXNnID0gXFxcIlxcXCI7XFxuICAgICAgICBsZXQgY291bnQgPSB4LmNvdW50ICE9IDAgPyBcXFwiIOa6kOaVsOmHjzpcXFwiICsgeC5jb3VudCA6IFxcXCJcXFwiO1xcbiAgICAgICAgaWYgKC9uby8udGVzdCh4LmNvZGUpKSB7XFxuICAgICAgICAgIG1zZyA9IGl0ZW0udGl0bGUucmVwbGFjZShyZWdleCwgdGl0bGUgKyBcXFwi6YWN572u5pyJ6K+vXFxcIi5mb250Y29sb3IoXFxcInJlZFxcXCIpICsgXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICB9IGVsc2UgaWYgKC9eKC0xfDB8NDA0KS8udGVzdCh4LmNvZGUpKSB7XFxuICAgICAgICAgIG1zZyA9IGl0ZW0udGl0bGUucmVwbGFjZShyZWdleCwgdGl0bGUgKyBcXFwi5peg5rOV6K6/6ZeuXFxcIi5mb250Y29sb3IoXFxcInJlZFxcXCIpICsgXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICB9IGVsc2UgaWYgKC9eMjAwLy50ZXN0KHguY29kZSkpIHtcXG4gICAgICAgICAgbXNnID0gaXRlbS50aXRsZS5yZXBsYWNlKHJlZ2V4LCB0aXRsZSArIFxcXCLpgJrorq/mraPluLhcXFwiLmZvbnRjb2xvcihcXFwiIzNDQjM3MVxcXCIpICsgXFxcIiAg5bu26L+fOlxcXCIgKyB4LnRpbWUgKyBjb3VudCArIFxcXCJcXFxcblxcXCIpO1xcbiAgICAgICAgICAvL3VybCA9IGl0ZW0udXJsO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgbXNnID0gaXRlbS50aXRsZS5yZXBsYWNlKHJlZ2V4LCB0aXRsZSArIFxcXCLphY3nva7mraPnoa5cXFwiLmZvbnRjb2xvcihcXFwiIzNDQjM3MVxcXCIpICsgY291bnQgKyBcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgICAgLy91cmwgPSBpdGVtLnVybDtcXG4gICAgICAgIH1cXG4gICAgICAgIHVwZGF0ZUl0ZW0oaXRlbS5leHRyYS5pZCwge1xcbiAgICAgICAgICB0aXRsZTogbXNnLFxcbiAgICAgICAgICAvL3VybDogdXJsLFxcbiAgICAgICAgfSlcXG4gICAgICB9KTtcXG4gICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgIH0sIHBhdGhjb25maWdzKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbiAgfSlcXG4gIHBhdGhjb25maWdzLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXG4gICAgbGV0IGxvbmdDID0gW3tcXG4gICAgICB0aXRsZTogXFxcIuWQjeensFxcXCIsXFxuICAgICAganM6ICQudG9TdHJpbmcoKGl0ZW0sIHAsIGMpID0+IHtcXG4gICAgICAgIGxldCBpID0gYy5maW5kSW5kZXgoeCA9PiB4Lm5hbWUgPT0gaXRlbS5uYW1lKTtcXG4gICAgICAgIGlmIChpICE9IC0xKSB7XFxuICAgICAgICAgIHJldHVybiAkKGNbaV0ubmFtZSwgXFxcIui+k+WFpeaWsOWQjeensFxcXCIpLmlucHV0KChjLCBwLCBpKSA9PiB7XFxuICAgICAgICAgICAgY1tpXS5uYW1lID0gaW5wdXQ7XFxuICAgICAgICAgICAgc2F2ZUZpbGUocCwgSlNPTi5zdHJpbmdpZnkoYykpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIH0sIGMsIHAsIGkpXFxuICAgICAgICB9XFxuICAgICAgfSwgaXRlbSwgY3BhdGgsIHBhdGhjb25maWdzKVxcbiAgICB9LCB7XFxuICAgICAgdGl0bGU6IFxcXCLot6/lvoRcXFwiLFxcbiAgICAgIGpzOiAkLnRvU3RyaW5nKChpdGVtLCBwLCBjKSA9PiB7XFxuICAgICAgICBsZXQgaSA9IGMuZmluZEluZGV4KHggPT4geC5uYW1lID09IGl0ZW0ubmFtZSk7XFxuICAgICAgICBpZiAoaSAhPSAtMSkge1xcbiAgICAgICAgICByZXR1cm4gJChjW2ldLnBhdGgsIFxcXCLovpPlhaXmlrDot6/lvoRcXFwiKS5pbnB1dCgoYywgcCwgaSkgPT4ge1xcbiAgICAgICAgICAgIGNbaV0ucGF0aCA9IGlucHV0O1xcbiAgICAgICAgICAgIHNhdmVGaWxlKHAsIEpTT04uc3RyaW5naWZ5KGMpKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICB9LCBjLCBwLCBpKVxcbiAgICAgICAgfVxcbiAgICAgIH0sIGl0ZW0sIGNwYXRoLCBwYXRoY29uZmlncylcXG4gICAgfSwge1xcbiAgICAgIHRpdGxlOiBcXFwi5Yig6ZmkXFxcIixcXG4gICAgICBqczogJC50b1N0cmluZygoaXRlbSwgcCwgYykgPT4ge1xcbiAgICAgICAgbGV0IGkgPSBjLmZpbmRJbmRleCh4ID0+IHgubmFtZSA9PSBpdGVtLm5hbWUpO1xcbiAgICAgICAgaWYgKGkgIT0gLTEpIHtcXG4gICAgICAgICAgYy5zcGxpY2UoaSwgMSk7XFxuICAgICAgICAgIHNhdmVGaWxlKHAsIEpTT04uc3RyaW5naWZ5KGMpKTtcXG4gICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIH1cXG4gICAgICB9LCBpdGVtLCBjcGF0aCwgcGF0aGNvbmZpZ3MpXFxuICAgIH1dXFxuICAgIGlmIChpdGVtLnBhdGguc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgbG9uZ0MucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuiuv+mXrlxcXCIsXFxuICAgICAgICBqczogJC50b1N0cmluZygoaXRlbSkgPT4ge1xcbiAgICAgICAgICBpZiAoaXRlbS5wYXRoLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwid2ViOi8vXFxcIiArIGl0ZW0ucGF0aDtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSwgaXRlbSlcXG4gICAgICB9KVxcbiAgICB9XFxuICAgIGxldCBjdXJyZW50ID0gXFxcIlxcXCI7XFxuICAgIGlmIChjdXJyZW50Y29uZmlnICYmIGN1cnJlbnRjb25maWcuaGFzT3duUHJvcGVydHkoXFxcInBhdGhcXFwiKSkge1xcbiAgICAgIGlmIChpdGVtLnBhdGggPT0gY3VycmVudGNvbmZpZy5wYXRoKSB7XFxuICAgICAgICBjdXJyZW50ID0gXFxcIuKeoe+4j1xcXCI7XFxuICAgICAgfVxcbiAgICB9XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyBcXFwiPHNtYWxsPlxcXCIgKyBjdXJyZW50ICsgXFxcIuWQjeensDpcXFwiICsgaXRlbS5uYW1lICsgXFxcIlxcXFxu6Lev5b6EOlxcXCIgKyBpdGVtLnBhdGggKyBcXFwiPC9zbWFsbD5cXFwiLFxcbiAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShpdGVtID0+IHtcXG4gICAgICAgIGNsZWFySXRlbShcXFwibm9fbG9hZGluZ1xcXCIpO1xcbiAgICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgICAgIGxldCB7XFxuICAgICAgICAgIHBhdGgsXFxuICAgICAgICAgIG5hbWVcXG4gICAgICAgIH0gPSBpdGVtO1xcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICAgIHNob3dMb2FkaW5nKFxcXCLmraPlnKjliqDovb3phY3nva4uLi5cXFwiKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChydW50aW1lQ29uZmlnLnNldEN1cnJlbnRDb25maWcoe1xcbiAgICAgICAgICBwYXRoLFxcbiAgICAgICAgICBuYW1lLFxcbiAgICAgICAgfSkpIHtcXG4gICAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICAgIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIik7XFxuICAgICAgICAgIERycHlNYW5hZ2UuY2xlYXIoKTtcXG4gICAgICAgICAgJC5yZXF1aXJlKFxcXCJDaGFuZ2VTb3VyY2VQb3BcXFwiKS5zaG93KDEwMCk7XFxuICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5YiH5o2i5aSx6LSlXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICB9LCBpdGVtKSxcXG4gICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiAncGF0aCcgKyBpLFxcbiAgICAgICAgbG9uZ0NsaWNrOiBsb25nQ1xcbiAgICAgIH1cXG4gICAgfSlcXG4gIH0pXFxufVxcblxcblxcbnNldFJlc3VsdChsYXlvdXQpO1wiLFwiZ3JvdXBcIjpcIua1i+ivlVwiLFwidWFcIjpcIm1vYmlsZVwiLFwicHJlUnVsZVwiOlwiLyo8JD5cXG5AaW5jbHVkZSBzdGFydFxcbmh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTY5MTYmYXV0aD0xZDM1ZThmMC0yMmU4LTUyNzAtYTlkMS04MjZmNTNmMTc3YWRcXG5AaW5jbHVkZSBlbmRcXG48JD4qL1xcblwiLFwicGFnZXNcIjpcIlt7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJkcnB5XFxcIixcXFwicGF0aFxcXCI6XFxcImRycHlcXFwiLFxcXCJydWxlXFxcIjpcXFwiZnVuY3Rpb24gaW5pdEhpa2VyKCkge1xcXFxuICAgIGNvbnN0IGlzQ2xvc2VMb2cgPSAhZ2V0SXRlbShcXFxcXFxcInVzZUxvZ1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICBjb25zdCBsb2NhbEtleSA9IFxcXFxcXFwiZHJweVxcXFxcXFwiO1xcXFxuICAgIGNvbnN0IENyeXB0b1V0aWwgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL2Fzc2V0cy9jcnlwdG8tamF2YS5qc1xcXFxcXFwiKTtcXFxcbiAgICBnbG9iYWxUaGlzLmxvY2FsID0ge1xcXFxuICAgICAgICBzZXQocnVsZWtleSwgaywgdikge1xcXFxuICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShsb2NhbEtleSArIFxcXFxcXFwiQFxcXFxcXFwiICsgcnVsZWtleSArIFxcXFxcXFwiQFxcXFxcXFwiICsgaywgdik7XFxcXG4gICAgICAgIH0sXFxcXG4gICAgICAgIGdldChydWxla2V5LCBrLCB2KSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gc3RvcmFnZTAuZ2V0SXRlbShsb2NhbEtleSArIFxcXFxcXFwiQFxcXFxcXFwiICsgcnVsZWtleSArIFxcXFxcXFwiQFxcXFxcXFwiICsgaywgXFxcXFxcXCJcXFxcXFxcIikgfHwgdjtcXFxcbiAgICAgICAgfSxcXFxcbiAgICAgICAgZGVsZXRlKHJ1bGVrZXksIGspIHtcXFxcbiAgICAgICAgICAgIHN0b3JhZ2UwLmNsZWFySXRlbShsb2NhbEtleSArIFxcXFxcXFwiQFxcXFxcXFwiICsgcnVsZWtleSArIFxcXFxcXFwiQFxcXFxcXFwiICsgayk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9O1xcXFxuICAgIGV2YWwoZ2V0Q3J5cHRvSlMoKSk7XFxcXG4gICAgZ2xvYmFsVGhpcy5DcnlwdG9KUyA9IENyeXB0b0pTO1xcXFxuXFxcXG4gICAgbGV0ICRyZXF1ZXN0ID0gcmVxdWVzdDtcXFxcbiAgICBsZXQgJHBvc3QgPSBwb3N0O1xcXFxuICAgIGdsb2JhbFRoaXMucmVxID0gZnVuY3Rpb24gKHVybCwgY29iaikge1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IHJlcyA9IHt9O1xcXFxuICAgICAgICAgICAgbGV0IG9iaiA9IE9iamVjdC5hc3NpZ24oe30sIGNvYmopO1xcXFxuICAgICAgICAgICAgaWYgKG9iai5kYXRhKSB7XFxcXG4gICAgICAgICAgICAgICAgb2JqLmJvZHkgPSBvYmouZGF0YTtcXFxcbiAgICAgICAgICAgICAgICBkZWxldGUgb2JqLmRhdGE7XFxcXG4gICAgICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoXFxcXFxcXCJyZWRpcmVjdFxcXFxcXFwiKSkgb2JqLnJlZGlyZWN0ID0gISFvYmoucmVkaXJlY3Q7XFxcXG4gICAgICAgICAgICBpZiAob2JqLmJ1ZmZlciA9PT0gMikge1xcXFxuICAgICAgICAgICAgICAgIG9iai50b0hleCA9IHRydWU7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBvYmouaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe1xcXFxuICAgICAgICAgICAgICAgIENvb2tpZTogXFxcXFxcXCIjbm9Db29raWUjXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH0sIG9iai5oZWFkZXJzKTtcXFxcbiAgICAgICAgICAgIGlmICh1cmwgPT09IFxcXFxcXFwiaHR0cHM6Ly9hcGkubm4uY2kvb2NyL2I2NC90ZXh0XFxcXFxcXCIgJiYgb2JqLmhlYWRlcnMpIHtcXFxcbiAgICAgICAgICAgICAgICBvYmouaGVhZGVyc1tcXFxcXFxcIkNvbnRlbnQtVHlwZVxcXFxcXFwiXSA9IFxcXFxcXFwidGV4dC9wbGFpblxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIpICYmICh1cmwuaW5jbHVkZXMoXFxcXFxcXCI/dHlwZT1cXFxcXFxcIikgfHwgdXJsLmluY2x1ZGVzKFxcXFxcXFwiP3BhcmFtcz1cXFxcXFxcIikpKSB7XFxcXG4gICAgICAgICAgICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIHVybC5sYXN0SW5kZXhPZihcXFxcXFxcIj9cXFxcXFxcIikpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIG9iai5oZWFkZXJzKSB7XFxcXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmouaGVhZGVyc1trZXldICE9PSBcXFxcXFxcInN0cmluZ1xcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIG9iai5oZWFkZXJzW2tleV0gPSBTdHJpbmcob2JqLmhlYWRlcnNba2V5XSk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbGV0IHIgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgLyogaWYgKFN0cmluZyhvYmoubWV0aG9kKS50b0xvd2VyQ2FzZSgpID09PSBcXFxcXFxcInBvc3RcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgICByID0gJHBvc3QodXJsLCBvYmopO1xcXFxuICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgIHIgPSAkcmVxdWVzdCh1cmwsIG9iaik7XFxcXG4gICAgICAgICAgICAgfSovXFxcXG4gICAgICAgICAgICByID0gJHJlcXVlc3QodXJsLCBvYmopO1xcXFxuICAgICAgICAgICAgaWYgKG9iai53aXRoSGVhZGVycykge1xcXFxuICAgICAgICAgICAgICAgIHIgPSBKU09OLnBhcnNlKHIpO1xcXFxuICAgICAgICAgICAgICAgIHJlcy5jb250ZW50ID0gci5ib2R5O1xcXFxuICAgICAgICAgICAgICAgIHJlcy5oZWFkZXJzID0ge307XFxcXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHIuaGVhZGVycyB8fCB7fSkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmVzLmhlYWRlcnNba10gPSB2WzBdO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmVzLmNvbnRlbnQgPSByO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYgKG9iai5idWZmZXIgPT09IDIpIHtcXFxcbiAgICAgICAgICAgICAgICByZXMuY29udGVudCA9IENyeXB0b1V0aWwuRGF0YS5wYXJzZUhleChyZXMuY29udGVudCkudG9CYXNlNjQoX2Jhc2U2NC5OT19XUkFQKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJldHVybiByZXM7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIGxvZyhcXFxcXFxcIkVycm9yXFxcXFxcXCIgKyBlLnRvU3RyaW5nKCkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIC8qXFxcXG4gICAgY29uc3QgSmluSmEgPSAkLnJlcXVpcmUoXFxcXFxcXCJodHRwczovL2Nkbi5ib290Y2RuLm5ldC9hamF4L2xpYnMvbXVzdGFjaGUuanMvNC4xLjAvbXVzdGFjaGUuanNcXFxcXFxcIik7XFxcXG4gIFxcXFxuICAgIGNvbnN0IEpQID0gJC5yZXF1aXJlKFxcXFxcXFwiaHR0cHM6Ly9qc29ucGF0aC1wbHVzLmdpdGh1Yi5pby9KU09OUGF0aC9kaXN0L2luZGV4LWJyb3dzZXItdW1kLmNqc1xcXFxcXFwiKTtcXFxcbiAgICBnbG9iYWxUaGlzLmNoZWVyaW8gPSB7XFxcXG4gICAgICAgIGppbmphMih0ZW1wbGF0ZSwgb2JqKSB7XFxcXG4gICAgICAgICAgICBcXFxcbiAgICAgICAgICAgIHJldHVybiAkLmxvZyhKaW5KYS5yZW5kZXIodGVtcGxhdGUsIG9iaikpO1xcXFxuICAgICAgICB9LFxcXFxuICAgICAgICBqcChwYXRoLCBqc29uKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gSlAuSlNPTlBhdGgoe1xcXFxuICAgICAgICAgICAgICAgIHBhdGgsXFxcXG4gICAgICAgICAgICAgICAganNvblxcXFxuICAgICAgICAgICAgfSlbMF07XFxcXG4gICAgICAgIH1cXFxcbiAgICB9Ki9cXFxcbiAgICBnbG9iYWxUaGlzLnBkZmEgPSBfcGRmYTtcXFxcbiAgICBnbG9iYWxUaGlzLnBkID0gX3BkO1xcXFxuICAgIGdsb2JhbFRoaXMucGRmaCA9IF9wZGZoO1xcXFxuICAgIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbCA9IGZ1bmN0aW9uIChzZWFyY2gsIHJlcGxhY2VtZW50KSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLnNwbGl0KHNlYXJjaCkuam9pbihyZXBsYWNlbWVudCk7XFxcXG4gICAgfTtcXFxcbiAgICBsZXQgJHRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xcXFxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcXFxcbiAgICAgICAgcmV0dXJuICR0b1N0cmluZy5hcHBseSh0aGlzKS50cmltKCk7XFxcXG4gICAgfTtcXFxcbiAgICBpZiAoaXNDbG9zZUxvZykge1xcXFxuICAgICAgICAvLyDph43lhpljb25zb2xlLmxvZ+WHveaVsFxcXFxuICAgICAgICBjb25zb2xlLmxvZyA9IGZ1bmN0aW9uICgpIHtcXFxcbiAgICAgICAgICAgIC8vIOajgOafpeS8oOWFpeWPguaVsOeahOaVsOmHj1xcXFxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XFxcXG4gICAgICAgICAgICAgICAgLy8g5aaC5p6c5Y+C5pWw5pWw6YeP5aSn5LqOMe+8jOiwg+eUqOWOn+Wni+eahGNvbnNvbGUubG9n5Ye95pWwXFxcXG4gICAgICAgICAgICAgICAgLy9vcmlnaW5hbExvZy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm47XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAvLyDlpoLmnpzlj4LmlbDlj6rmnInkuIDkuKrvvIzliJnkuI3lgZrku7vkvZXmk43kvZxcXFxcbiAgICAgICAgfTtcXFxcbiAgICB9XFxcXG59XFxcXG5pbml0SGlrZXIoKTtcXFxcbmNvbnN0IGRycHlQYXRoID0gZ2V0UGF0aChcXFxcXFxcImhpa2VyOi8vZmlsZXMvZGF0YS9cXFxcXFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFxcXFxcIi9saWJzX2hpa2VyL2RycHkyLmpzXFxcXFxcXCIpO1xcXFxuXFxcXG5pZiAoIWZpbGVFeGlzdChkcnB5UGF0aCkpIHtcXFxcbiAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLnvLrlsJFkcnB5Lmpz6L+Q6KGM5bqTXFxcXFxcXCIpO1xcXFxufVxcXFxubGV0IGRycHkgPSAkLnJlcXVpcmUoZHJweVBhdGgpO1xcXFxuLypcXFxcbmxldCBjdXJyZW50UGF0aCA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG5sZXQgJGluaXQgPSBkcnB5LmluaXQ7XFxcXG5kcnB5LmluaXQgPSBmdW5jdGlvbihleHQpIHtcXFxcbiAgICBpZiAoZXh0ID09PSBjdXJyZW50UGF0aCkgcmV0dXJuO1xcXFxuICAgICRpbml0LmNhbGwodGhpcywgZXh0KTtcXFxcbiAgICBjdXJyZW50UGF0aCA9IGV4dDtcXFxcbn0qL1xcXFxuJC5leHBvcnRzID0gZHJweTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfMV92ZXJ0aWNhbF9waWNfYmx1clxcXCIsXFxcIm5hbWVcXFwiOlxcXCLor6bnu4bpobXpnaJcXFwiLFxcXCJwYXRoXFxcIjpcXFwiZGV0YWlsZWRcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG4oZnVuY3Rpb24gKCkge1xcXFxuICBsZXQgaWQgPSBNWV9QQVJBTVMudm9kSWQ7XFxcXG4gIGFkZExpc3RlbmVyKFxcXFxcXFwib25DbG9zZVxcXFxcXFwiLCAoKSA9PiB7XFxcXG4gICAgR00uY2xlYXIoXFxcXFxcXCJyZW5vdmF0ZUxpc3RcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJNeVZhcihcXFxcXFxcInNvcnRpXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJwYWdlbnVtXFxcXFxcXCIpO1xcXFxuICB9KTtcXFxcbiAgYWRkTGlzdGVuZXIoJ29uUmVmcmVzaCcsICQudG9TdHJpbmcoKGlkKSA9PiB7XFxcXG4gICAgLy9jbGVhck15VmFyKGlkICsgXFxcXFxcXCJlcmluZm9cXFxcXFxcIilcXFxcbiAgfSwgaWQpKVxcXFxuXFxcXG4gIC8v5pa55rOVXFxcXG4gIGZ1bmN0aW9uIGZvbnRzdHlsZSh0ZXh0LCBwYXJhbXMpIHtcXFxcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwgdW5kZWZpbmVkO1xcXFxuICAgIHZhciBoID0gcGFyYW1zLmggIT09IGZhbHNlID8gJ+KAnOKAnOKAneKAnScgOiAnJztcXFxcbiAgICB2YXIgdGFncyA9IHBhcmFtcy50YWdzIHx8IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgaWYgKHBhcmFtcy5jICE9IHVuZGVmaW5lZCkge1xcXFxuICAgICAgdGV4dCA9IHRleHQuZm9udGNvbG9yKHBhcmFtcy5jKTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKHRhZ3MpIHtcXFxcbiAgICAgIHZhciB0YWdBcnJheSA9IHRhZ3Muc3BsaXQoJ3wnKS5maWx0ZXIoZSA9PiBlKTtcXFxcbiAgICAgIHZhciBvcGVuVGFncyA9ICcnO1xcXFxuICAgICAgdmFyIGNsb3NlVGFncyA9ICcnO1xcXFxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWdBcnJheS5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgICBvcGVuVGFncyArPSAnPCcgKyB0YWdBcnJheVtpXSArICc+JztcXFxcbiAgICAgICAgY2xvc2VUYWdzID0gJzwvJyArIHRhZ0FycmF5W2ldICsgJz4nICsgY2xvc2VUYWdzO1xcXFxuICAgICAgfVxcXFxuICAgICAgdGV4dCA9IG9wZW5UYWdzICsgdGV4dCArIGNsb3NlVGFncztcXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIGggKyB0ZXh0O1xcXFxuICB9XFxcXG5cXFxcbiAgZnVuY3Rpb24gZmluZExvbmdlc3RFbGVtZW50KGFycikge1xcXFxuICAgIHJldHVybiBhcnIucmVkdWNlKChhLCBiKSA9PiBhLmxlbmd0aCA+IGIubGVuZ3RoID8gYSA6IGIpO1xcXFxuICB9XFxcXG5cXFxcbiAgZnVuY3Rpb24gY291bnRUb3RhbEJ5dGVzKHRleHQpIHtcXFxcbiAgICB2YXIgY291bnQgPSAwO1xcXFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgdmFyIGNvZGUgPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XFxcXG4gICAgICBpZiAoY29kZSA+PSAweDAxMDApIHsgLy8g5Y+M5a2X6IqC5a2X56ym55qEIFVuaWNvZGUg57yW56CB5aSn5LqOIDI1NVxcXFxuICAgICAgICBjb3VudCArPSAyOyAvLyDlj4zlrZfoioLlrZfnrKborqHmlbDkuLoyXFxcXG4gICAgICB9IGVsc2Uge1xcXFxuICAgICAgICBjb3VudCArPSAxOyAvLyDljZXlrZfoioLlrZfnrKborqHmlbDkuLoxXFxcXG4gICAgICB9XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBjb3VudDtcXFxcbiAgfVxcXFxuICBcXFxcbiAgZnVuY3Rpb24gY2FjaGVTaG93VGlwcygpIHtcXFxcbiAgICBpZiAoc3RvcmFnZTAuZ2V0TXlWYXIoaWQgKyBcXFxcXFxcImVyaW5mb1xcXFxcXFwiKSkge1xcXFxuICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGZvbnRzdHlsZShcXFxcXFxcIuW9k+WJjeS4uue8k+WtmCzngrnmiJHliLfmlrBcXFxcXFxcIiwgeyBjOiBcXFxcXFxcImdyZXlcXFxcXFxcIiwgdGFnczogXFxcXFxcXCJzbWFsbFxcXFxcXFwiIH0pLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaWQpID0+IHtcXFxcbiAgICAgICAgICBjbGVhck15VmFyKGlkICsgXFxcXFxcXCJlcmluZm9cXFxcXFxcIilcXFxcbiAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9LCBpZCksXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgIH1cXFxcbiAgICAgIH0pXFxcXG4gICAgfVxcXFxuICB9XFxcXG5cXFxcbiAgZnVuY3Rpb24gc3Vic3RyKHN0ciwgbWF4TGVuZ3RoKSB7XFxcXG4gICAgbGV0IGxlbiA9IDA7XFxcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcXFxcbiAgICAgIGlmIChzdHIuY2hhckNvZGVBdChpKSA+IDI1NSkge1xcXFxuICAgICAgICBsZW4gKz0gMjtcXFxcbiAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIGxlbisrO1xcXFxuICAgICAgfVxcXFxuICAgICAgaWYgKGxlbiA+IG1heExlbmd0aCkge1xcXFxuICAgICAgICByZXR1cm4gc3RyLnNsaWNlKDAsIGkpICsgJy4uLic7XFxcXG4gICAgICB9XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBzdHI7XFxcXG4gIH1cXFxcblxcXFxuICBmdW5jdGlvbiBzZXREZXNjKGRlc2MsIG51bSkge1xcXFxuICAgIGlmIChkZXNjID09IHVuZGVmaW5lZCkge1xcXFxuICAgICAgcmV0dXJuO1xcXFxuICAgIH1cXFxcbiAgICBkZXNjID0gZGVzYy5jb25zdHJ1Y3RvciA9PSBBcnJheSA/IGRlc2Muam9pbignPGJyPicpIDogZGVzYztcXFxcbiAgICBpZiAoZGVzYy5yZXBsYWNlKC8oPGJyPnxcXFxcXFxcXHMrKS9nLCAnJykubGVuZ3RoID09IDApIHtcXFxcbiAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiAnYmlnX2JsYW5rX2Jsb2NrJ1xcXFxuICAgICAgfSlcXFxcbiAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiAnYmlnX2JsYW5rX2Jsb2NrJ1xcXFxuICAgICAgfSlcXFxcbiAgICAgIHJldHVybjtcXFxcbiAgICB9XFxcXG5cXFxcbiAgICBjb25zdCBtYXJrID0gJ2Rlc2MnO1xcXFxuICAgIG51bSA9IHR5cGVvZiAobnVtKSA9PSAndW5kZWZpbmVkJyA/IDEwMCA6IG51bVxcXFxuICAgIGRlc2MgPSBkZXNjLnN0YXJ0c1dpdGgoJ+OAgOOAgCcpID8gZGVzYyA6ICfjgIDjgIAnICsgZGVzYztcXFxcbiAgICBkZXNjID0gZGVzYy5yZXBsYWNlKC8nL2csIFxcXFxcXFwiJiMzOTtcXFxcXFxcIik7XFxcXG4gICAgZGVzYyA9IGRlc2MucmVwbGFjZSgvXFxcXFxcXFxyXFxcXFxcXFxuL2csIFxcXFxcXFwiPGJyPlxcXFxcXFwiKTtcXFxcbiAgICBkZXNjID0gZGVzYy5yZXBsYWNlKC9cXFxcXFxcXG4vZywgXFxcXFxcXCI8YnI+XFxcXFxcXCIpO1xcXFxuICAgIGxldCBzZGVzYyA9IHN1YnN0cihkZXNjLCBudW0pO1xcXFxuXFxcXG4gICAgdmFyIGNvbG9ycyA9IHtcXFxcbiAgICAgIHNob3c6IFxcXFxcXFwiYmxhY2tcXFxcXFxcIixcXFxcbiAgICAgIGhpZGU6IFxcXFxcXFwiZ3JleVxcXFxcXFwiXFxcXG4gICAgfVxcXFxuXFxcXG4gICAgdmFyIGxhenkgPSAkKGAjbm9Mb2FkaW5nI2ApLmxhenlSdWxlKChkYywgc2RjLCBtLCBjcykgPT4ge1xcXFxuICAgICAgdmFyIHNob3cgPSBzdG9yYWdlMC5nZXRJdGVtKG0sICcwJyk7XFxcXG4gICAgICB2YXIgdGl0bGUgPSBmaW5kSXRlbSgnZGVzYycpLnRpdGxlO1xcXFxuICAgICAgdmFyIHJlID0gLyg8XFxcXFxcXFwvc21hbGw+PGJyPi4qPz4pLisvZztcXFxcbiAgICAgIHZhciBleHAgPSAn5bGV5byAOic7XFxcXG4gICAgICB2YXIgcmV0ID0gJ+aUtui1tzonO1xcXFxuICAgICAgaWYgKHNob3cgPT0gJzEnKSB7XFxcXG4gICAgICAgIHVwZGF0ZUl0ZW0oJ2Rlc2MnLCB7XFxcXG4gICAgICAgICAgdGl0bGU6IHRpdGxlXFxcXG4gICAgICAgICAgICAucmVwbGFjZShyZXQsIGV4cClcXFxcbiAgICAgICAgICAgIC5yZXBsYWNlKHJlLCAnJDEnICsgc2RjICsgJzwvc21hbGw+JylcXFxcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oPFxcXFxcXFxcL3NtYWxsPjxicj5cXFxcXFxcXDxmb250IGNvbG9yPVxcXFxcXFwiKS4qPyhcXFxcXFxcIj4pLywgJyQxJyArIGNzLmhpZGUgKyAnJDInKVxcXFxuXFxcXG4gICAgICAgIH0pXFxcXG4gICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0obSwgJzAnKTtcXFxcbiAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIHVwZGF0ZUl0ZW0oJ2Rlc2MnLCB7XFxcXG4gICAgICAgICAgdGl0bGU6IHRpdGxlXFxcXG4gICAgICAgICAgICAucmVwbGFjZShleHAsIHJldClcXFxcbiAgICAgICAgICAgIC5yZXBsYWNlKHJlLCAnJDEnICsgZGMgKyAnPC9zbWFsbD4nKVxcXFxuICAgICAgICAgICAgLnJlcGxhY2UoLyg8XFxcXFxcXFwvc21hbGw+PGJyPlxcXFxcXFxcPGZvbnQgY29sb3I9XFxcXFxcXCIpLio/KFxcXFxcXFwiPikvLCAnJDEnICsgY3Muc2hvdyArICckMicpXFxcXG4gICAgICAgIH0pXFxcXG4gICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0obSwgJzEnKTtcXFxcbiAgICAgIH1cXFxcbiAgICAgIHJldHVybiBgaGlrZXI6Ly9lbXB0eWBcXFxcbiAgICB9LCBkZXNjLCBzZGVzYywgbWFyaywgY29sb3JzKVxcXFxuICAgIHZhciBzYyA9IHN0b3JhZ2UwLmdldEl0ZW0obWFyaywgJzAnKSA9PSAnMCcgPyAn5bGV5byAOicgOiAn5pS26LW3Oic7XFxcXG4gICAgdmFyIGRjID0gc3RvcmFnZTAuZ2V0SXRlbShtYXJrLCAnMCcpID09ICcwJyA/IHNkZXNjIDogZGVzYztcXFxcbiAgICB2YXIgY3MgPSBzdG9yYWdlMC5nZXRJdGVtKG1hcmssICcwJykgPT0gJzAnID8gY29sb3JzLmhpZGUgOiBjb2xvcnMuc2hvdztcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgdGl0bGU6ICcnICsgJzxiPjxmb250IGNvbG9yPVxcXFxcXFwiIzA5OEFDMVxcXFxcXFwiPuKIt+WJp+aDheeugOS7i1xcXFx0PC9mb250PjwvYj4nICsgXFxcXFxcXCI8c21hbGw+PGEgc3R5bGU9J3RleHQtZGVjb3JhdGlvbjogbm9uZTsnIGhyZWY9J1xcXFxcXFwiICsgbGF6eSArIFxcXFxcXFwiJz5cXFxcXFxcIiArIHNjICsgJzwvYT48L3NtYWxsPjxicj48Zm9udCBjb2xvcj1cXFxcXFxcIicgKyBjcyArICdcXFxcXFxcIj4nICsgYCR7ZGN9YCArICc8L3NtYWxsPicsXFxcXG4gICAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxcXG4gICAgICBleHRyYToge1xcXFxuICAgICAgICBpZDogJ2Rlc2MnLFxcXFxuICAgICAgICBsaW5lU3BhY2luZzogNixcXFxcbiAgICAgICAgdGV4dFNpemU6IDE1LFxcXFxuICAgICAgICBsaW5lVmlzaWJsZTogdHJ1ZSxcXFxcbiAgICAgIH1cXFxcbiAgICB9KVxcXFxuICB9XFxcXG5cXFxcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0cmluZy5wcm90b3R5cGUsICdTcGxpdCcsIHtcXFxcbiAgICB2YWx1ZTogZnVuY3Rpb24gKHMsIGUpIHtcXFxcbiAgICAgIGlmIChlKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLnNwbGl0KHMpLmZpbHRlcihpdGVtID0+IGl0ZW0gIT09ICcnKTtcXFxcbiAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLnNwbGl0KHMpO1xcXFxuICAgICAgfVxcXFxuICAgIH0sXFxcXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXFxcXG4gIH0pO1xcXFxuXFxcXG5cXFxcbiAgbGV0IHNvcnRvYmogPSBbXFxcXG4gICAgZm9udHN0eWxlKFxcXFxcXFwi5q2j5bqPXFxcXFxcXCIsIHtcXFxcbiAgICAgIGM6IFxcXFxcXFwiIzFBQUQxOVxcXFxcXFwiLFxcXFxuICAgICAgdGFnczogXFxcXFxcXCJiXFxcXFxcXCJcXFxcbiAgICB9KSxcXFxcbiAgICBmb250c3R5bGUoXFxcXFxcXCLpgIbluo9cXFxcXFxcIiwge1xcXFxuICAgICAgYzogXFxcXFxcXCIjRkYwMDAwXFxcXFxcXCIsXFxcXG4gICAgICB0YWdzOiBcXFxcXFxcImJcXFxcXFxcIlxcXFxuICAgIH0pXFxcXG4gIF1cXFxcbiAgLy/mlrnms5VcXFxcblxcXFxuICB2YXIgc29ydGkgPSBnZXRNeVZhcihcXFxcXFxcInNvcnRpXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcblxcXFxuICAvL2xvZyhzb3J0b2JqKVxcXFxuICAkLmV4dGVuZCh7XFxcXG4gICAgc3BsaXRQYWdlKHRvdGFsSXRlbXMsIHBhZ2VTaXplKSB7XFxcXG4gICAgICBwYWdlU2l6ZSA9IHBhZ2VTaXplIHx8IDUwO1xcXFxuICAgICAgbGV0IHJlc3VsdCA9IFtdO1xcXFxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdG90YWxJdGVtczsgaSArPSBwYWdlU2l6ZSkge1xcXFxuICAgICAgICBsZXQgZW5kID0gaSArIHBhZ2VTaXplIC0gMTtcXFxcbiAgICAgICAgaWYgKGVuZCA+IHRvdGFsSXRlbXMpIHtcXFxcbiAgICAgICAgICBlbmQgPSB0b3RhbEl0ZW1zO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJlc3VsdC5wdXNoKGAke2l9LSR7ZW5kfWApO1xcXFxuICAgICAgfVxcXFxuICAgICAgcmV0dXJuIHJlc3VsdDtcXFxcbiAgICB9LFxcXFxuICAgIHNwbGl0QXJyYXlCeVJhbmdlcyhhcnJheSwgcmFuZ2VzKSB7XFxcXG4gICAgICAvLyDmoLnmja7ojIPlm7Tmi4bliIbmlbDnu4RcXFxcbiAgICAgIHZhciByZXN1bHQgPSByYW5nZXMubWFwKGZ1bmN0aW9uIChyYW5nZSkge1xcXFxuICAgICAgICB2YXIgcGFydHMgPSByYW5nZS5zcGxpdCgnLScpLm1hcChOdW1iZXIpO1xcXFxuICAgICAgICB2YXIgc3RhcnQgPSBwYXJ0c1swXSAtIDE7IC8vIOWHjzHmmK/lm6DkuLrmlbDnu4TntKLlvJXku44w5byA5aeLXFxcXG4gICAgICAgIHZhciBlbmQgPSBwYXJ0c1sxXSAtIDE7XFxcXG4gICAgICAgIC8vIOS9v+eUqEFycmF5LnByb3RvdHlwZS5zbGljZeadpeiOt+WPluWtkOaVsOe7hFxcXFxuICAgICAgICByZXR1cm4gYXJyYXkuc2xpY2Uoc3RhcnQsIGVuZCArIDEpOyAvLyDljIXmi6znu5PmnZ/ntKLlvJXvvIzmiYDku6XliqAxXFxcXG4gICAgICB9KTtcXFxcbiAgICAgIHJldHVybiByZXN1bHQ7XFxcXG4gICAgfSxcXFxcbiAgfSlcXFxcblxcXFxuICBsZXQgc291cmNlID0ge307XFxcXG4gIGlmKE1ZX1BBUkFNUy5zb3VyY2Upe1xcXFxuICAgICAgc291cmNlPU1ZX1BBUkFNUy5zb3VyY2U7XFxcXG4gIH1lbHNle1xcXFxuICAgICAgY29uc3QgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFxcXFxcInJ1bnRpbWVDb25maWdcXFxcXFxcIik7XFxcXG4gICAgICBzb3VyY2U9cnVudGltZUNvbmZpZy5maW5kU291cmNlKE1ZX1BBUkFNUy5za2V5KTtcXFxcbiAgICAgIE1ZX1BBUkFNUy5zb3VyY2U9c291cmNlO1xcXFxuICAgICAgc2V0UGFnZVBhcmFtcyhNWV9QQVJBTVMpO1xcXFxuICB9XFxcXG4gIFxcXFxuICBjb25zdCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXFxcXFwiRHJweU1hbmFnZVxcXFxcXFwiKTtcXFxcbiAgXFxcXG4gIERycHlNYW5hZ2UuaW5pdFBhZ2UoXFxcXFxcXCJlclxcXFxcXFwiKTtcXFxcbiAgXFxcXG4gIGxldCBkcnB5ID0gRHJweU1hbmFnZS5nZXRCeVNvdXJjZShzb3VyY2UpO1xcXFxuXFxcXG4gIGxldCBpbmZvID0gc3RvcmFnZTAuZ2V0TXlWYXIoaWQgKyBcXFxcXFxcImVyaW5mb1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgXFxcXG4gIFxcXFxuICBpZiAoaW5mbyA9PSBcXFxcXFxcIlxcXFxcXFwiKSB7XFxcXG4gICAgaW5mbyA9IEpTT04ucGFyc2UoZHJweS5kZXRhaWwoU3RyaW5nKGlkKSkpLmxpc3RbMF07XFxcXG4gICAgc3RvcmFnZTAucHV0TXlWYXIoaWQgKyBcXFxcXFxcImVyaW5mb1xcXFxcXFwiLCBpbmZvKVxcXFxuICB9XFxcXG5cXFxcbiAgbGV0IFvlr7zmvJQsIOS4u+a8lF0gPSBbaW5mby52b2RfZGlyZWN0b3IsIGluZm8udm9kX2FjdG9yXVxcXFxuICBcXFxcbiAgaWYgKOWvvOa8lCAhPSB1bmRlZmluZWQmJuWvvOa8lCE9XFxcXFxcXCJcXFxcXFxcIikge1xcXFxuICAgIOWvvOa8lCA9IOWvvOa8lC5TcGxpdCgvXFxcXFxcXFwvL2csIHRydWUpLmpvaW4oXFxcXFxcXCIgXFxcXFxcXCIpO1xcXFxuICAgIOWvvOa8lCA9IC9bOu+8ml0vLnRlc3Qo5a+85ryUKSA/IOWvvOa8lCA6IFxcXFxcXFwi5a+85ryUOlxcXFxcXFwiICsg5a+85ryUXFxcXG4gIH1cXFxcbiAgaWYgKOS4u+a8lCAhPSB1bmRlZmluZWQmJuS4u+a8lCE9XFxcXFxcXCJcXFxcXFxcIikge1xcXFxuICAgIOS4u+a8lCA9IOS4u+a8lC5TcGxpdCgvXFxcXFxcXFwvL2csIHRydWUpLmpvaW4oXFxcXFxcXCIgXFxcXFxcXCIpO1xcXFxuICAgIOS4u+a8lCA9IC9bOu+8ml0vLnRlc3Qo5Li75ryUKSA/IOS4u+a8lCA6IFxcXFxcXFwi5Li75ryUOlxcXFxcXFwiICsg5Li75ryUXFxcXG4gIH1cXFxcbiAgbGV0IFvlkI3np7AsIOWkh+azqF0gPSBbaW5mby52b2RfbmFtZSwgaW5mby52b2RfcmVtYXJrc11cXFxcbiAgaWYgKOWkh+azqCAhPSB1bmRlZmluZWQmJuWkh+azqCE9XFxcXFxcXCJcXFxcXFxcIikge1xcXFxuICAgIOWkh+azqCA9IOWkh+azqC5TcGxpdCgvXFxcXFxcXFwvL2csIHRydWUpLmpvaW4oXFxcXFxcXCIgXFxcXFxcXCIpO1xcXFxuICAgIOWkh+azqCA9IC9bOu+8ml0vLnRlc3Qo5aSH5rOoKSA/IOWkh+azqCA6IFxcXFxcXFwi5aSH5rOoOlxcXFxcXFwiICsg5aSH5rOoO1xcXFxuICB9XFxcXG4gIGxldCB0aXRsZXMgPSBb5ZCN56ewLCDlpIfms6hdO1xcXFxuICBsZXQgZGVzY3MgPSBb5a+85ryULCDkuLvmvJQsaW5mby52b2RfYXJlYSxpbmZvLnZvZF95ZWFyXVxcXFxuXFxcXG4gIGxldCBkID0gW107XFxcXG4gIGQucHVzaCh7XFxcXG4gICAgdGl0bGU6IHRpdGxlcy5maWx0ZXIoZSA9PiBlKS5tYXAoKHgsaSk9Pmk9PTE/Zm9udHN0eWxlKHgsIHt0YWdzOlxcXFxcXFwic21hbGxcXFxcXFxcIn0pOngpLmpvaW4oXFxcXFxcXCJcXFxcXFxcXG5cXFxcXFxcIiksXFxcXG4gICAgZGVzYzogZGVzY3MuZmlsdGVyKGUgPT4gZSkuam9pbihcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiKSxcXFxcbiAgICBwaWNfdXJsOiBpbmZvLnZvZF9waWMgfHwgTVlfUEFSQU1TLmltZyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgZ3JhZGllbnQ6IGZhbHNlLFxcXFxuICAgIH1cXFxcbiAgfSk7XFxcXG4gIGQucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfmlbDmja7mnaXmupA6JyArIE1ZX1BBUkFNUy5zbmFtZSxcXFxcbiAgICAvL2Rlc2M6XFxcXFxcXCJcXFxcXFxcIitNWV9QQVJBTVMuc2tleStcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFwiLFxcXFxuICAgIGltZzogXFxcXFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL21lc3N5Lzc4LnN2Z1xcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiYXZhdGFyXFxcXFxcXCJcXFxcbiAgfSlcXFxcbiAgc2V0RGVzYyhpbmZvLnZvZF9jb250ZW50KVxcXFxuXFxcXG4gIC8qXFxcXG4gIGZ1bmN0aW9uIHBhcnNlUXVlcnkocXVlcnkpIHtcXFxcbiAgICB2YXIgb2JqID0ge307XFxcXG4gICAgcXVlcnkuc3BsaXQoXFxcXFxcXCImXFxcXFxcXCIpLmZpbHRlcihlID0+IGUpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcXFxcbiAgICAgIHZhciBwYXJ0cyA9IGl0ZW0uc3BsaXQoXFxcXFxcXCI9XFxcXFxcXCIpO1xcXFxuICAgICAgb2JqW3BhcnRzWzBdXSA9IHBhcnRzWzFdO1xcXFxuICAgIH0pO1xcXFxuICAgIHJldHVybiBvYmo7XFxcXG4gIH1cXFxcblxcXFxuICAvL2pz5omn6KGMXFxcXG4gIGxldCBwYXJzZV9vYmogPSB7XFxcXG4gICAgZGVmUnVsZXM6IFtcXFxcXFxcIioubXA0XFxcXFxcXCIsIFxcXFxcXFwiKi5tM3U4XFxcXFxcXCJdLFxcXFxuICB9O1xcXFxuICB2YXIgZXh0cmEgPSB7XFxcXG4gICAgXFxcXFxcXCJ1YVxcXFxcXFwiOiBNT0JJTEVfVUFcXFxcbiAgfVxcXFxuICBsZXQgcGFyc2UgPSBKU09OLnBhcnNlKGRycHkucGxheSgpKTtcXFxcbiAgLy9jb25zb2xlLmxvZyhwYXJzZSk7XFxcXG4gIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFxcXFxcInBhcnNlX2V4dHJhXFxcXFxcXCIpKSB7XFxcXG4gICAgbGV0IHBhcnNlX2V4dHJhID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhcnNlLnBhcnNlX2V4dHJhKTtcXFxcbiAgICBwYXJzZV9vYmogPSBPYmplY3QuYXNzaWduKHBhcnNlX29iaiwgcGFyc2VRdWVyeShwYXJzZV9leHRyYSkpO1xcXFxuICAgIGlmIChwYXJzZV9vYmouaGFzT3duUHJvcGVydHkoXFxcXFxcXCJpbml0X3NjcmlwdFxcXFxcXFwiKSkge1xcXFxuICAgICAgcGFyc2Vfb2JqW1xcXFxcXFwiaW5pdF9zY3JpcHRcXFxcXFxcIl0gPSBiYXNlNjREZWNvZGUocGFyc2Vfb2JqW1xcXFxcXFwiaW5pdF9zY3JpcHRcXFxcXFxcIl0pO1xcXFxuICAgIH1cXFxcbiAgfVxcXFxuICBpZiAocGFyc2Vfb2JqLmhhc093blByb3BlcnR5KFxcXFxcXFwiaXNfcGNcXFxcXFxcIikgJiYgcGFyc2Vfb2JqW1xcXFxcXFwiaXNfcGNcXFxcXFxcIl0gPT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICBleHRyYVtcXFxcXFxcInVhXFxcXFxcXCJdID0gUENfVUE7XFxcXG4gIH1cXFxcbiAgaWYgKHBhcnNlLmhhc093blByb3BlcnR5KFxcXFxcXFwiaGVhZGVyXFxcXFxcXCIpKSB7XFxcXG4gICAgZXh0cmFbXFxcXFxcXCJ1YVxcXFxcXFwiXSA9IHBhcnNlW1xcXFxcXFwiaGVhZGVyXFxcXFxcXCJdW1xcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiXTtcXFxcbiAgICAvL2V4dHJhW1xcXFxcXFwicmVkaXJlY3RcXFxcXFxcIl09ZmFsc2U7XFxcXG4gICAgZXh0cmFbXFxcXFxcXCJqc1xcXFxcXFwiXSA9ICQudG9TdHJpbmcoKGpzKSA9PiB7XFxcXG4gICAgICBldmFsKGpzKVxcXFxuICAgICAgZmJhLmxvZyhuYXZpZ2F0b3IudXNlckFnZW50KVxcXFxuICAgICAgZmJhLmxvZyhsb2NhdGlvbi5ocmVmKVxcXFxuICAgIH0sICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5hdmlnYXRvciwgJ3VzZXJBZ2VudCcsIHtcXFxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XFxcXG4gICAgICAgICAgcmV0dXJuICdNeS1DdXN0b20tVUEtU3RyaW5nJztcXFxcbiAgICAgICAgfVxcXFxuICAgICAgfSk7XFxcXG4gICAgfSkpXFxcXG4gIH1cXFxcbiAgaWYgKHBhcnNlX29iai5oYXNPd25Qcm9wZXJ0eShcXFxcXFxcImN1c3RvbV9yZWdleFxcXFxcXFwiKSkge1xcXFxuICAgIGxldCBjdXJyZW50ID0gcGFyc2Vfb2JqW1xcXFxcXFwiZGVmUnVsZXNcXFxcXFxcIl07XFxcXG4gICAgZXh0cmFbXFxcXFxcXCJ2aWRlb1J1bGVzXFxcXFxcXCJdID0gY3VycmVudC5jb25jYXQocGFyc2Vfb2JqLmN1c3RvbV9yZWdleC5zcGxpdCgvXFxcXFxcXFx8L2cpLmZpbHRlcihlID0+IGUpKVxcXFxuICB9XFxcXG4gIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFxcXFxcImpzXFxcXFxcXCIpKSB7XFxcXG4gICAgZXh0cmFbXFxcXFxcXCJqc1xcXFxcXFwiXSA9ICQudG9TdHJpbmcoKGpzLCBwYXJzZSwgdCkgPT4ge1xcXFxuICAgICAgaWYgKHBhcnNlLmhhc093blByb3BlcnR5KFxcXFxcXFwiaW5pdF9zY3JpcHRcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgZmJhLmxvZyh0ICsgXFxcXFxcXCI65omn6KGMaW5pdF9zY3JpcHRcXFxcXFxcIik7XFxcXG4gICAgICAgIGV2YWwocGFyc2UuaW5pdF9zY3JpcHQpO1xcXFxuICAgICAgfVxcXFxuICAgICAgZmJhLmxvZyhuYXZpZ2F0b3IucGxhdGZvcm0pO1xcXFxuICAgICAgZmJhLmxvZyh0ICsgXFxcXFxcXCI65omn6KGManPngrnlh7tcXFxcXFxcIilcXFxcbiAgICAgIGV2YWwoanMpXFxcXG4gICAgfSwgcGFyc2UuanMsIHBhcnNlX29iaiwgTVlfUlVMRS50aXRsZSlcXFxcbiAgfVxcXFxuICAvL2xvZyhleHRyYSlcXFxcbiAgKi9cXFxcbiAgbGV0IGZyb20gPSBbXTtcXFxcbiAgaWYgKGluZm8udm9kX3BsYXlfZnJvbSAhPSB1bmRlZmluZWQpIHtcXFxcbiAgICBmcm9tID0gaW5mby52b2RfcGxheV9mcm9tLnNwbGl0KFxcXFxcXFwiJCQkXFxcXFxcXCIpO1xcXFxuICAgIC8qbGV0IHBsYXlMYXp5ID0gJChcXFxcXFxcIlxcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICBmdW5jdGlvbiBpc29mZmljaWFsKHVybCkge1xcXFxuICAgICAgICBsZXQgZmxhZyA9IG5ldyBSZWdFeHAoJ3FxXFxcXFxcXFwuY29tfGlxaXlpXFxcXFxcXFwuY29tfHlvdWt1XFxcXFxcXFwuY29tfG1ndHZcXFxcXFxcXC5jb218YmlsaWJpbGlcXFxcXFxcXC5jb218c29odVxcXFxcXFxcLmNvbXxpeGlndWFcXFxcXFxcXC5jb218cHB0dlxcXFxcXFxcLmNvbXxtaWd1dmlkZW9cXFxcXFxcXC5jb218bGVcXFxcXFxcXC5jb218MTkwNVxcXFxcXFxcLmNvbXxmdW5cXFxcXFxcXC50dicpO1xcXFxuICAgICAgICByZXR1cm4gZmxhZy50ZXN0KHVybCk7XFxcXG4gICAgICB9XFxcXG5cXFxcbiAgICAgIGxldCBkcnB5ID0gR00uZGVmaW5lTW9kdWxlKFxcXFxcXFwiZHJweVxcXFxcXFwiLCBcXFxcXFxcImRycHlcXFxcXFxcIik7XFxcXG4gICAgICBpbnB1dCA9IGlucHV0LnNwbGl0KFxcXFxcXFwiI1xcXFxcXFwiKTtcXFxcbiAgICAgIGxldCBwbGF5ID0gSlNPTi5wYXJzZShkcnB5LnBsYXkoaW5wdXRbMV0sIGlucHV0WzBdLnJlcGxhY2UoXFxcXFxcXCJ0dmJveC14ZzpcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiksIFtdKSk7XFxcXG4gICAgICBsb2cocGxheSlcXFxcbiAgICAgIGxvZyhcXFxcXFxcInBsYXkudXJsXFxcXFxcXCIpXFxcXG4gICAgICBsZXQgcGFyc2Vfb2JqID0ge1xcXFxuICAgICAgICBkZWZfcmVnZXg6IFN0cmluZy5yYXdgXFxcXFxcXFwuKG1wNHxtM3U4KXxjbi90b3NgLFxcXFxuICAgICAgfTtcXFxcblxcXFxuICAgICAgaWYgKHBsYXkudXJsLmluY2x1ZGVzKFxcXFxcXFwicHJveHk/ZG9cXFxcXFxcIikpIHtcXFxcbiAgICAgICAgTVlfVVJMID0gcGxheS51cmw7XFxcXG4gICAgICAgIHBsYXkudXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXFxcXFwidXJsXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpKTtcXFxcbiAgICAgIH1cXFxcbiAgICAgIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXFxcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY24vXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vc2VhcmNoP3M9XFxcXFxcXCIgKyBwbGF5LnVybCArIFxcXFxcXFwiJnJ1bGU9dWNra+S6kVxcXFxcXFwiXFxcXG4gICAgICB9XFxcXG4gICAgICBpZiAocGxheS51cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvJykgfHwgcGxheS51cmwuc3RhcnRzV2l0aChcXFxcXFxcImh0dHBzOi8vd3d3LmFsaXBhbi5jb20vcy9cXFxcXFxcIikpIHtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2FsaXl1bj9ydWxlPeS6keebmOWQmy7nroAmcGFnZT1meXBhZ2UmcmVhbHVybD1cXFxcXFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChwbGF5LnVybCk7XFxcXG4gICAgICB9XFxcXG4gICAgICBpZiAocGxheS5wYXJzZSA9PT0gMSkge1xcXFxuICAgICAgICBpZiAocGxheS51cmwuc3RhcnRzV2l0aChcXFxcXFxcIm1hZ25ldDpcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICByZXR1cm4gcGxheS51cmw7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKGlzb2ZmaWNpYWwocGxheS51cmwpKSB7XFxcXG4gICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9tdWxQYXJzZT9ydWxlPemFjee9ruWKqeaJi1xcXFxcXFwiKS5tdWxQYXJzZShwbGF5LnVybCk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidmlkZW86Ly9cXFxcXFxcIiArIHBsYXkudXJsO1xcXFxuICAgICAgfSBlbHNlIGlmIChwbGF5LnBhcnNlID09PSAwKSB7XFxcXG4gICAgICAgIHJldHVybiBwbGF5LnVybDtcXFxcbiAgICAgIH1cXFxcbiAgICB9KTsqL1xcXFxuICB9XFxcXG5cXFxcbiAgbGV0IHBsYXlMYXp5ID0gJChcXFxcXFxcIlxcXFxcXFwiKS5sYXp5UnVsZSgoaWQsIHNvdXJjZSkgPT4ge1xcXFxuICAgIHJldHVybiAkLnJlcXVpcmUoXFxcXFxcXCJ2aWRlb1VybFxcXFxcXFwiKS5wYXJzZShpbnB1dCwgaWQsIHNvdXJjZSk7XFxcXG4gIH0sIFxcXFxcXFwiaWRcXFxcXFxcIiwgc291cmNlKTtcXFxcblxcXFxuICBsZXQgcGxheVVybExpc3QgPSBbXTtcXFxcbiAgLy9jb25zb2xlLmxvZyhpbmZvLnZvZF9wbGF5X3VybCk7XFxcXG4gIGxldCBwbGF5cGFnZXMgPSBbXTtcXFxcbiAgaWYgKGluZm8udm9kX3BsYXlfdXJsICYmIGluZm8udm9kX3BsYXlfdXJsICE9IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICBsZXQgY29sID0gXFxcXFxcXCJ0ZXh0XzRcXFxcXFxcIjtcXFxcbiAgICBsZXQgdGV4dGFsaWduID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICBwbGF5VXJsTGlzdCA9IGluZm8udm9kX3BsYXlfdXJsLnNwbGl0KFxcXFxcXFwiJCQkXFxcXFxcXCIpLm1hcCgodCwgaSkgPT4ge1xcXFxuICAgICAgbGV0IGltZyA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICBsZXQgdHMgPSB0LnNwbGl0KFxcXFxcXFwiI1xcXFxcXFwiKS5tYXAoKGspID0+IGsuc3BsaXQoXFxcXFxcXCIkXFxcXFxcXCIpWzBdKTtcXFxcbiAgICAgIGxldCBwYWdlcyA9ICQuc3BsaXRQYWdlKHRzLmxlbmd0aClcXFxcbiAgICAgIGxldCB0YyA9IGNvdW50VG90YWxCeXRlcyhmaW5kTG9uZ2VzdEVsZW1lbnQodHMpKTtcXFxcbiAgICAgIGlmICh0cy5maWx0ZXIoZSA9PiBlICE9IFxcXFxcXFwiXFxcXFxcXCIpLmxlbmd0aCkge1xcXFxuICAgICAgICBwbGF5cGFnZXNbaV0gPSBwYWdlcztcXFxcbiAgICAgIH1cXFxcbiAgICAgIGlmICh0YyA+IDI0KSB7XFxcXG4gICAgICAgIGNvbCA9IFxcXFxcXFwidGV4dF8xXFxcXFxcXCI7XFxcXG4gICAgICAgIGltZyA9IFxcXFxcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9tb3ZpZS8xNDYuc3ZnXFxcXFxcXCI7XFxcXG4gICAgICB9IGVsc2UgaWYgKHRjID49IDEyICYmIHRjIDwgMTUpIHtcXFxcbiAgICAgICAgY29sID0gXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIjtcXFxcbiAgICAgIH0gZWxzZSBpZiAodGMgPj0gMTUpIHtcXFxcbiAgICAgICAgY29sID0gXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIjtcXFxcbiAgICAgICAgdGV4dGFsaWduID0gXFxcXFxcXCJsZWZ0XFxcXFxcXCI7XFxcXG4gICAgICB9XFxcXG4gICAgICBsZXQgcGxheW9iaiA9IHQuc3BsaXQoXFxcXFxcXCIjXFxcXFxcXCIpLm1hcCgoaikgPT4ge1xcXFxuICAgICAgICBsZXQgayA9IGouc3BsaXQoXFxcXFxcXCIkXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgdCA9IGtbMF07XFxcXG4gICAgICAgIGxldCB1aWQgPSAoa1sxXXx8a1swXSk7XFxcXG4gICAgICAgIHJldHVybiB7XFxcXG4gICAgICAgICAgdGl0bGU6IGZvbnRzdHlsZSh0LCB7XFxcXG4gICAgICAgICAgICB0YWdzOiBcXFxcXFxcInNtYWxsXFxcXFxcXCJcXFxcbiAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICB1cmw6ICB1aWQrIFxcXFxcXFwiI1xcXFxcXFwiICsgZnJvbVtpXSArIHBsYXlMYXp5LnJlcGxhY2UoJ1xcXFxcXFwiaWRcXFxcXFxcIicsICdcXFxcXFxcIicgK3VpZCArICdcXFxcXFxcIicpLFxcXFxuICAgICAgICAgIGNvbF90eXBlOiBjb2wsXFxcXG4gICAgICAgICAgaW1nOiBpbWcsXFxcXG4gICAgICAgICAgLypleHRyYTogT2JqZWN0LmFzc2lnbih7fSwgZXh0cmEsIHtcXFxcbiAgICAgICAgICAgIFxcXFxcXFwiUmVmZXJlclxcXFxcXFwiOiBkZWNvZGVVUklDb21wb25lbnQoa1sxXSksXFxcXG4gICAgICAgICAgICBpZDoga1sxXSxcXFxcbiAgICAgICAgICAgIC8vbGluZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICAgICAgdGV4dEFsaWduOiB0ZXh0YWxpZ24sXFxcXG4gICAgICAgICAgICBjbHM6IFxcXFxcXFwicGxheWxpc3RcXFxcXFxcIixcXFxcbiAgICAgICAgICB9KSovXFxcXG4gICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGlkOiB1aWQsXFxcXG4gICAgICAgICAgICBibG9ja1J1bGVzOiBbJ2JiLioucG5nJywgJy5qcGcnLCBcXFxcXFxcImhtXFxcXFxcXFwuYmFpZHVcXFxcXFxcXC5jb21cXFxcXFxcXC9obS5qc1xcXFxcXFwiXSxcXFxcbiAgICAgICAgICAgIHZpZGVvRXhjbHVkZVJ1bGVzOiBbJz91cmw9J10sXFxcXG4gICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgICAgICAgICB0ZXh0QWxpZ246IHRleHRhbGlnbixcXFxcbiAgICAgICAgICAgIGNsczogXFxcXFxcXCJwbGF5bGlzdFxcXFxcXFwiLFxcXFxuICAgICAgICAgIH1cXFxcbiAgICAgICAgfTtcXFxcbiAgICAgIH0pO1xcXFxuICAgICAgcGxheW9iaiA9ICQuc3BsaXRBcnJheUJ5UmFuZ2VzKHBsYXlvYmosIHBhZ2VzKTtcXFxcbiAgICAgIHJldHVybiBwbGF5b2JqO1xcXFxuICAgIH0pO1xcXFxuICB9IGVsc2Uge1xcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lXFxcXFxcXCJcXFxcbiAgICB9LCB7XFxcXG4gICAgICB0aXRsZTogXFxcXFxcXCLmmoLml6Dmkq3mlL7mupDmiJbmkq3mlL7liJfooajlrprkvY3plJnor69cXFxcXFxcIixcXFxcbiAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICAgIHVybDogTVlfUEFSQU1TLnZvZElkLFxcXFxuICAgIH0pO1xcXFxuICAgIGNhY2hlU2hvd1RpcHMoKTtcXFxcbiAgICBzZXRSZXN1bHQoZCk7XFxcXG4gIH1cXFxcblxcXFxuXFxcXG4gIGxldCBjdXJyZW50TG9jYXRpb24gPSAwO1xcXFxuXFxcXG4gIGZ1bmN0aW9uIHJlbm92YXRlTGlzdChsb2NhdGlvbikge1xcXFxuICAgIC8vZGVsZXRlSXRlbUJ5Q2xzKFxcXFxcXFwicGxheXBhZ2VcXFxcXFxcIik7XFxcXG4gICAgZGVsZXRlSXRlbUJ5Q2xzKFxcXFxcXFwicGxheWxpc3RcXFxcXFxcIik7XFxcXG4gICAgaWYgKHBsYXlVcmxMaXN0Lmxlbmd0aCA9PSAwKSB7XFxcXG4gICAgICByZXR1cm47XFxcXG4gICAgfVxcXFxuICAgIGxldCBwYWdlbnVtID0gZ2V0TXlWYXIoXFxcXFxcXCJwYWdlbnVtXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICBsZXQgcGNvdW50ID0gcGxheVVybExpc3RbbG9jYXRpb25dLmxlbmd0aDtcXFxcbiAgICBsZXQgbGlzdCA9IHBsYXlVcmxMaXN0W2xvY2F0aW9uXVtwYWdlbnVtXTtcXFxcbiAgICBpZiAoIWxpc3QpIHtcXFxcbiAgICAgIGZvciAobGV0IGkgPSBwYWdlbnVtOyBpID49IDA7IGktLSkge1xcXFxuICAgICAgICBsaXN0ID0gcGxheVVybExpc3RbbG9jYXRpb25dW2ldO1xcXFxuICAgICAgICBpZiAobGlzdCkge1xcXFxuICAgICAgICAgIHBhZ2VudW0gPSBpO1xcXFxuICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICB9XFxcXG4gICAgICB9XFxcXG4gICAgfVxcXFxuICAgIGlmIChnZXRNeVZhcihcXFxcXFxcInNvcnRpXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKSA9PSAxKSB7XFxcXG4gICAgICBsaXN0LnJldmVyc2UoKTtcXFxcbiAgICB9XFxcXG4gICAgJC5leHRlbmQoe1xcXFxuICAgICAgdGVtcF9saXN0OiBwbGF5VXJsTGlzdFtsb2NhdGlvbl0sXFxcXG4gICAgfSlcXFxcbiAgICBsZXQgcGxheXAgPSBwbGF5cGFnZXNbbG9jYXRpb25dO1xcXFxuXFxcXG4gICAgaWYgKHBsYXlwICYmIHBsYXlwLmxlbmd0aCA+IDEpIHtcXFxcbiAgICAgIGxldCB0ZW1wID0ge1xcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfMScsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgY2xzOiBcXFxcXFxcInBsYXlwYWdlXFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgICAgfVxcXFxuICAgICAgbGV0IHBhZ2VhcnIgPSBwbGF5cC5tYXAoKHgsIGkpID0+IGkgPT0gcGFnZW51bSA/ICfigJzigJzigJ3igJ0nICsgeC5mb250Y29sb3IoXFxcXFxcXCJyZWRcXFxcXFxcIikgOiB4KTtcXFxcbiAgICAgIGRlbGV0ZUl0ZW1CeUNscyhcXFxcXFxcInBsYXlwYWdlXFxcXFxcXCIpXFxcXG4gICAgICBhZGRJdGVtQWZ0ZXIoXFxcXFxcXCJwbGF5cGFnZWxpbmVcXFxcXFxcIiwgW3tcXFxcbiAgICAgICAgdGl0bGU6ICfkuIrkuIDpobUnLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzRcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGxvY2F0aW9uLCBwY291bnQpID0+IHtcXFxcbiAgICAgICAgICBsZXQgcGFnZW51bSA9IGdldE15VmFyKFxcXFxcXFwicGFnZW51bVxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG4gICAgICAgICAgaWYgKHBhZ2VudW0gPT0gMCkge1xcXFxuICAgICAgICAgICAgcGFnZW51bSA9IHBjb3VudCAtIDE7XFxcXG4gICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHBhZ2VudW0tLTtcXFxcbiAgICAgICAgICB9XFxcXG4gICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCJwYWdlbnVtXFxcXFxcXCIsIFN0cmluZyhwYWdlbnVtKSk7XFxcXG4gICAgICAgICAgR00uZ2V0KFxcXFxcXFwicmVub3ZhdGVMaXN0XFxcXFxcXCIsICgpID0+IHsgfSkobG9jYXRpb24pO1xcXFxuICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgbG9jYXRpb24sIHBjb3VudCksXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgY2xzOiBcXFxcXFxcInBsYXlwYWdlXFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgICAgfSwge1xcXFxuICAgICAgICB0aXRsZTogcGxheXBbcGFnZW51bV0sXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQocGFnZWFyciwgMykuc2VsZWN0KChsb2NhdGlvbikgPT4ge1xcXFxuICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwicGFnZW51bVxcXFxcXFwiLCBTdHJpbmcoTVlfSU5ERVgpKTtcXFxcbiAgICAgICAgICBHTS5nZXQoXFxcXFxcXCJyZW5vdmF0ZUxpc3RcXFxcXFxcIiwgKCkgPT4geyB9KShsb2NhdGlvbik7XFxcXG4gICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgIH0sIGxvY2F0aW9uKSxcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICBjbHM6IFxcXFxcXFwicGxheXBhZ2VcXFxcXFxcIlxcXFxuICAgICAgICB9XFxcXG4gICAgICB9LCB7XFxcXG4gICAgICAgIHRpdGxlOiAn5LiL5LiA6aG1JyxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF80XFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChsb2NhdGlvbiwgcGNvdW50KSA9PiB7XFxcXG4gICAgICAgICAgbGV0IHBhZ2VudW0gPSBnZXRNeVZhcihcXFxcXFxcInBhZ2VudW1cXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgICAgIGlmIChwYWdlbnVtID49IHBjb3VudCAtIDEpIHtcXFxcbiAgICAgICAgICAgIHBhZ2VudW0gPSAwO1xcXFxuICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBwYWdlbnVtKys7XFxcXG4gICAgICAgICAgfVxcXFxuICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwicGFnZW51bVxcXFxcXFwiLCBTdHJpbmcocGFnZW51bSkpO1xcXFxuICAgICAgICAgIEdNLmdldChcXFxcXFxcInJlbm92YXRlTGlzdFxcXFxcXFwiLCAoKSA9PiB7IH0pKGxvY2F0aW9uKTtcXFxcbiAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgIH0sIGxvY2F0aW9uLCBwY291bnQpLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgIGNsczogXFxcXFxcXCJwbGF5cGFnZVxcXFxcXFwiXFxcXG4gICAgICAgIH1cXFxcbiAgICAgIH1dKVxcXFxuICAgICAgLypwbGF5cCA9IHBsYXlwLm1hcCgoeCwgaSkgPT4ge1xcXFxuICAgICAgICAgbGV0IG9iaiA9IE9iamVjdC5hc3NpZ24oe30sIHRlbXAsIHtcXFxcbiAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgKHBhZ2VudW0gPT0gaSA/IHguZm9udGNvbG9yKFxcXFxcXFwicmVkXFxcXFxcXCIpIDogeCksXFxcXG4gICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSkgPT4ge1xcXFxuICAgICAgICAgICAgIGlmIChnZXRNeVZhcihcXFxcXFxcInBhZ2VudW1cXFxcXFxcIikgPT0gaSkge1xcXFxuICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwicGFnZW51bVxcXFxcXFwiLCBTdHJpbmcoaSkpO1xcXFxuICAgICAgICAgICAgIGRlbGV0ZUl0ZW1CeUNscyhcXFxcXFxcInBsYXlsaXN0XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgIGFkZEl0ZW1BZnRlcihcXFxcXFxcInBsYXlsaXN0c1xcXFxcXFwiLCAkLnRlbXBfbGlzdFtpXSk7XFxcXG4gICAgICAgICAgICAgZmluZEl0ZW1zQnlDbHMoXFxcXFxcXCJwbGF5cGFnZVxcXFxcXFwiKS5mb3JFYWNoKCh4LCBpaSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgbGV0IHRpdGxlID0geC50aXRsZS5yZXBsYWNlKC/igJh84oCZfOKAnHzigJ18PFtePl0rPi9nLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgIGlmIChpaSA9PSBpKSB7XFxcXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gJ+KAnOKAnOKAneKAnScgKyB0aXRsZS5mb250Y29sb3IoXFxcXFxcXCJyZWRcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICB1cGRhdGVJdGVtKHguZXh0cmEuaWQsIHtcXFxcbiAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcXFxuICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgfSwgaSksXFxcXG4gICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHt9LCB0ZW1wLmV4dHJhLCB7XFxcXG4gICAgICAgICAgICAgaWQ6IFxcXFxcXFwicGFnZW51bVxcXFxcXFwiICsgaSxcXFxcbiAgICAgICAgICAgfSlcXFxcbiAgICAgICAgIH0pXFxcXG4gICAgICAgICByZXR1cm4gb2JqO1xcXFxuICAgICAgIH0pXFxcXG4gICAgICAgYWRkSXRlbUFmdGVyKFxcXFxcXFwicGxheXBhZ2VsaW5lXFxcXFxcXCIsIHBsYXlwKSovXFxcXG4gICAgfVxcXFxuICAgIGlmIChsaXN0KSB7XFxcXG4gICAgICBhZGRJdGVtQWZ0ZXIoXFxcXFxcXCJwbGF5bGlzdHNcXFxcXFxcIiwgbGlzdCk7XFxcXG4gICAgfVxcXFxuICAgIHVwZGF0ZUl0ZW0oXFxcXFxcXCJsb2NhdGlvbkBcXFxcXFxcIiArIGN1cnJlbnRMb2NhdGlvbiwge1xcXFxuICAgICAgdGl0bGU6IGZyb21bY3VycmVudExvY2F0aW9uXSxcXFxcbiAgICB9KTtcXFxcbiAgICB1cGRhdGVJdGVtKFxcXFxcXFwibG9jYXRpb25AXFxcXFxcXCIgKyBsb2NhdGlvbiwge1xcXFxuICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCcXFxcXFxcXCIgKyBmcm9tW2xvY2F0aW9uXSArIFxcXFxcXFwi4oCd4oCdXFxcXFxcXCIsXFxcXG4gICAgfSk7XFxcXG4gICAgY3VycmVudExvY2F0aW9uID0gbG9jYXRpb247XFxcXG4gIH1cXFxcblxcXFxuICBHTS5wdXQoXFxcXFxcXCJyZW5vdmF0ZUxpc3RcXFxcXFxcIiwgcmVub3ZhdGVMaXN0KTtcXFxcbiAgZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJiaWdfYmxhbmtfYmxvY2tcXFxcXFxcIlxcXFxuICB9KTtcXFxcbiAgaWYgKGZyb20ubGVuZ3RoKSB7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgIGNvbF90eXBlOiBcXFxcXFxcImJpZ19ibGFua19ibG9ja1xcXFxcXFwiLFxcXFxuICAgIH0pXFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgIHRpdGxlOiBzb3J0b2JqW3NvcnRpXSxcXFxcbiAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoc28pID0+IHtcXFxcbiAgICAgICAgbGV0IHNpID0gZ2V0TXlWYXIoXFxcXFxcXCJzb3J0aVxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCBpaSA9IChzaSA9PSBcXFxcXFxcIjBcXFxcXFxcIiA/IFxcXFxcXFwiMVxcXFxcXFwiIDogXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgICB1cGRhdGVJdGVtKFxcXFxcXFwiQHNvcnRcXFxcXFxcIiwge1xcXFxuICAgICAgICAgIHRpdGxlOiBzb1tpaV1cXFxcbiAgICAgICAgfSlcXFxcbiAgICAgICAgdmFyIHBsYXlzID0gZmluZEl0ZW1zQnlDbHMoXFxcXFxcXCJwbGF5bGlzdFxcXFxcXFwiKS5yZXZlcnNlKCkubWFwKHggPT4ge1xcXFxuICAgICAgICAgIHguY29sX3R5cGUgPSB4LnR5cGU7XFxcXG4gICAgICAgICAgcmV0dXJuIHg7XFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBkZWxldGVJdGVtQnlDbHMoXFxcXFxcXCJwbGF5bGlzdFxcXFxcXFwiKTtcXFxcbiAgICAgICAgYWRkSXRlbUFmdGVyKFxcXFxcXFwicGxheWxpc3RzXFxcXFxcXCIsIHBsYXlzKTtcXFxcblxcXFxuICAgICAgICBwdXRNeVZhcihcXFxcXFxcInNvcnRpXFxcXFxcXCIsIGlpKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgfSwgc29ydG9iaiksXFxcXG4gICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcXFxuICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgaWQ6IFxcXFxcXFwiQHNvcnRcXFxcXFxcIixcXFxcbiAgICAgIH1cXFxcbiAgICB9KVxcXFxuICAgIGZvciAobGV0IGkgaW4gZnJvbSkge1xcXFxuICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGZyb21baV0sXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChpLCBpZCkgPT4ge1xcXFxuICAgICAgICAgIGlmIChnZXRNeVZhcihpZCArIFxcXFxcXFwic291cmNlaVxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIikgPT0gaSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICAgIH1cXFxcbiAgICAgICAgICBwdXRNeVZhcihpZCArIFxcXFxcXFwic291cmNlaVxcXFxcXFwiLCBTdHJpbmcoaSkpO1xcXFxuICAgICAgICAgIEdNLmdldChcXFxcXFxcInJlbm92YXRlTGlzdFxcXFxcXFwiLCAoKSA9PiB7IH0pKGkpO1xcXFxuICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgaSwgaWQpLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgIGlkOiBcXFxcXFxcImxvY2F0aW9uQFxcXFxcXFwiICsgaVxcXFxuICAgICAgICB9LFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCJcXFxcbiAgICAgIH0pO1xcXFxuICAgIH1cXFxcbiAgfVxcXFxuICAvL2NvbnNvbGUubG9nKHBsYXlVcmxMaXN0KTtcXFxcbiAgLyppZiAocGxheVVybExpc3QubGVuZ3RoKSB7XFxcXG4gICAgdmFyIGVqb2JqID0ge1xcXFxuICAgICAgXFxcXFxcXCJsaXN0XFxcXFxcXCI6IHBsYXlVcmxMaXN0LFxcXFxuICAgICAgXFxcXFxcXCJ0YWJcXFxcXFxcIjogZnJvbS5tYXAoKHgsIGkpID0+IGZyb21baV0pXFxcXG4gICAgfTtcXFxcbiAgICDliJ3lp4vljJYoZCwgZWpvYmopXFxcXG4gIH0gZWxzZSB7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgIHRpdGxlOiBcXFxcXFxcIuaaguaXoOaSreaUvua6kFxcXFxcXFwiLFxcXFxuICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8zXFxcXFxcXCIsXFxcXG4gICAgICB1cmw6IE1ZX1BBUkFNUy52b2RJZCxcXFxcbiAgICB9KTtcXFxcbiAgfSovXFxcXG5cXFxcbiAgZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJibGFua19ibG9ja1xcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICBpZDogXFxcXFxcXCJwbGF5cGFnZWxpbmVcXFxcXFxcIlxcXFxuICAgIH1cXFxcbiAgfSlcXFxcblxcXFxuXFxcXG4gIGQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZVxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICBpZDogXFxcXFxcXCJwbGF5bGlzdHNcXFxcXFxcIlxcXFxuICAgIH1cXFxcbiAgfSk7XFxcXG5cXFxcbiAgZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJibGFua19ibG9ja1xcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICBpZDogXFxcXFxcXCJwbGF5bGlzdHNFTkRcXFxcXFxcIlxcXFxuICAgIH1cXFxcbiAgfSk7XFxcXG4gIGNhY2hlU2hvd1RpcHMoKTtcXFxcbiAgc2V0UmVzdWx0KGQpO1xcXFxuICByZW5vdmF0ZUxpc3QoZ2V0TXlWYXIoaWQgKyBcXFxcXFxcInNvdXJjZWlcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpKTtcXFxcbn0pKClcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLop6PmnpDmlofku7ZcXFwiLFxcXCJwYXRoXFxcIjpcXFwiY29uZmlnc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJjb25zdCBwYXRoID0gXFxcXFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0xveURnSWsvcGFyc2VzLmpzb25cXFxcXFxcIjtcXFxcbmxldCBkYXRhO1xcXFxuXFxcXG5mdW5jdGlvbiBnZXRKc29uKCkge1xcXFxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XFxcXG4gICAgICAgIHJldHVybiBkYXRhO1xcXFxuICAgIH1cXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShyZWFkRmlsZShwYXRoKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgZGVsZXRlRmlsZShwYXRoKTtcXFxcbiAgICAgICAgZGF0YSA9IFtdO1xcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gZGF0YTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gc2F2ZUpzb24oanNvbikge1xcXFxuICAgIHNhdmVGaWxlKHBhdGgsIEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0VXNlZnVsSnNvbigpIHtcXFxcbiAgICByZXR1cm4gZ2V0SnNvbigpLmZpbHRlcih2ID0+ICF2LmZvcmJpZGRlbik7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdldEZvcmJpZGRlbkpzb24oKSB7XFxcXG4gICAgcmV0dXJuIGdldEpzb24oKS5maWx0ZXIodiA9PiB2LmZvcmJpZGRlbik7XFxcXG59XFxcXG5cXFxcbiQuZXhwb3J0cyA9IHtcXFxcbiAgICBnZXRKc29uLFxcXFxuICAgIHNhdmVKc29uLFxcXFxuICAgIGdldFVzZWZ1bEpzb24sXFxcXG4gICAgZ2V0Rm9yYmlkZGVuSnNvbixcXFxcbiAgICBwYXRoLFxcXFxufTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLop6PmnpDnrqHnkIZcXFwiLFxcXCJwYXRoXFxcIjpcXFwicnVsZU1hbmFnZVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbnZhciBkID0gW107XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLop6PmnpDnrqHnkIZcXFxcXFxcIik7XFxcXG5sZXQgY29uZmlncyA9ICQucmVxdWlyZShcXFxcXFxcImNvbmZpZ3NcXFxcXFxcIik7XFxcXG5sZXQgYXJyID0gY29uZmlncy5nZXRKc29uKCk7XFxcXG5sZXQgbGVuZ3RoID0gYXJyLmxlbmd0aDtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmlrDlop5cXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3J1bGVFZGl0I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl9zbWFsbF80XFxcXFxcXCIsXFxcXG4gICAgcGljX3VybDogXFxcXFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2RvbWFpbl9jb25maWdcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBwYWdlVGl0bGU6IFxcXFxcXFwi5paw5aKe6Kej5p6QXFxcXFxcXCJcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLliIbkuqtcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCItMVxcXFxcXFwiLCBcXFxcXFxcIui+k+WFpeS9oOimgeWIhuS6q+ino+aekOeahOW6j+WPt1xcXFxcXFxcbi0x5YWo6YOo77yMLTLlt7LlkK/nlKjnmoTvvIwtM+W3suemgeeUqOeahFxcXFxcXFwiKS5pbnB1dCgobGVuZ3RoKSA9PiB7XFxcXG4gICAgICAgIGxldCBpbmRleGMgPSBpbnB1dC5zcGxpdCgvLHzvvIwvKTtcXFxcbiAgICAgICAgbGV0IGluZGV4cyA9IFtdO1xcXFxuICAgICAgICBsZXQgbW8gPSBwYXJzZUludChpbmRleGNbMF0pO1xcXFxuICAgICAgICBpZiAoIShpbmRleGMubGVuZ3RoICE9PSAwICYmIG1vIDwgMCAmJiBtbyA+IC01KSkge1xcXFxuICAgICAgICAgICAgZm9yIChsZXQgaXQgb2YgaW5kZXhjKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IG51bSA9IHBhcnNlSW50KGl0KTtcXFxcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKG51bSkgfHwgbnVtID49IGxlbmd0aCB8fCBudW0gPCAwKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5pWw5a2X5LiN5ZCI5rOVXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGluZGV4cy5wdXNoKG51bSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuICQoW1xcXFxcXFwiSElLRVJcXFxcXFxcIiwgXFxcXFxcXCJUWFRcXFxcXFxcIl0uY29uY2F0KGdldFBhc3RlcygpKSwgMiwgXFxcXFxcXCLliIbkuqvmlrnlvI9cXFxcXFxcIikuc2VsZWN0KChtbywgaW5kZXhzLCBleHQpID0+IHtcXFxcbiAgICAgICAgICAgIGZ1bmN0aW9uIHVwKHJ1bGVzKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGViNjQgPSBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkocnVsZXMpKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgZ2V0UGFzcyA9IChsZW5ndGgsIHJ1bGUsIHR5cGUpID0+IFxcXFxcXFwi5rW36ZiU6KeG55WM77yMRFJQWeino+aekO+8jOWFseOAjFxcXFxcXFwiICsgbGVuZ3RoICsgXFxcXFxcXCLjgI3mnaHvvIzlpI3liLbmlbTmnaHlj6Pku6TmiZPlvIDova/ku7blsLHkvJroh6rliqjlr7zlhaUkXFxcXFxcXCIgKyBydWxlICsgXFxcXFxcXCIkXFxcXFxcXCIgKyB0eXBlICsgXFxcXFxcXCJAaW1wb3J0PWpzOiQucmVxdWlyZSgnaW1wb3J0P3J1bGU9JytcXFxcXFxcIiArIEpTT04uc3RyaW5naWZ5KE1ZX1JVTEUudGl0bGUpICsgXFxcXFxcXCIpKGlucHV0KVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIGlmIChnZXRQYXN0ZXMoKS5pbmNsdWRlcyhpbnB1dCkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBzaGFyZVBhc3RlKHJ1bGViNjQsIGlucHV0KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiY29weTovL1xcXFxcXFwiICsgZ2V0UGFzcyhydWxlcy5sZW5ndGgsIHUsIFxcXFxcXFwiYlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9Mb3lEZ0lrL3NoYXJlL2RycHnop6PmnpDjgIxcXFxcXFxcIiArIHJ1bGVzLmxlbmd0aCArIFxcXFxcXFwi44CN5p2hLlxcXFxcXFwiICsgKGlucHV0ID09PSBcXFxcXFxcIkhJS0VSXFxcXFxcXCIgPyBcXFxcXFxcImhpa2VyXFxcXFxcXCIgOiBcXFxcXFxcInR4dFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGgsIGdldFBhc3MocnVsZXMubGVuZ3RoLCBydWxlYjY0LCBcXFxcXFxcImFcXFxcXFxcIikpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJzaGFyZTovL1xcXFxcXFwiICsgcGF0aDtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsZXQgcnVsZXM7XFxcXG4gICAgICAgICAgICBpZiAobW8gPT09IC0xKSB7XFxcXG4gICAgICAgICAgICAgICAgcnVsZXMgPSAkLnJlcXVpcmUoXFxcXFxcXCJjb25maWdzXFxcXFxcXCIpLmdldEpzb24oKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW8gPT09IC0yKSB7XFxcXG4gICAgICAgICAgICAgICAgcnVsZXMgPSAkLnJlcXVpcmUoXFxcXFxcXCJjb25maWdzXFxcXFxcXCIpLmdldFVzZWZ1bEpzb24oKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW8gPT09IC0zKSB7XFxcXG4gICAgICAgICAgICAgICAgcnVsZXMgPSAkLnJlcXVpcmUoXFxcXFxcXCJjb25maWdzXFxcXFxcXCIpLmdldEZvcmJpZGRlbkpzb24oKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcnVsZXMgPSAkLnJlcXVpcmUoXFxcXFxcXCJjb25maWdzXFxcXFxcXCIpLmdldEpzb24oKS5maWx0ZXIoKHYsIGkpID0+IGluZGV4cy5pbmNsdWRlcyhpKSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBydWxlcyA9IHJ1bGVzLm1hcCgodikgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHYuZm9yYmlkZGVuID0gdW5kZWZpbmVkO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiB2O1xcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gdXAocnVsZXMpO1xcXFxuICAgICAgICB9LCBtbywgaW5kZXhzLCBpbmRleGNbMV0pO1xcXFxuXFxcXG4gICAgfSwgbGVuZ3RoKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uX3NtYWxsXzRcXFxcXFxcIixcXFxcbiAgICBwaWNfdXJsOiBcXFxcXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fc2hhcmVfZ3JlZW5cXFxcXFxcIlxcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIumHjee9rlxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIuS9oOehruWumumHjee9ru+8n1xcXFxcXFxcbuivpeaTjeS9nOS8muWIoOmZpOeOsOacieino+aekO+8jOaBouWkjeiHquW4puino+aekOOAglxcXFxcXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxcXG4gICAgICAgIGRlbGV0ZUZpbGUocGF0aCk7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0sICQucmVxdWlyZShcXFxcXFxcImNvbmZpZ3NcXFxcXFxcIikucGF0aCksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl9zbWFsbF80XFxcXFxcXCIsXFxcXG4gICAgcGljX3VybDogXFxcXFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX3JlZnJlc2hcXFxcXFxcIlxcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIua4heepulxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIuS9oOehruWumuWFqOmDqOWIoOmZpO+8n1xcXFxcXFxcbuivpeaTjeS9nOS8muWIoOmZpOeOsOacieino+aekOOAglxcXFxcXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxcXG4gICAgICAgIHdyaXRlRmlsZShwYXRoLCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICB9LCAkLnJlcXVpcmUoXFxcXFxcXCJjb25maWdzXFxcXFxcXCIpLnBhdGgpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fc21hbGxfNFxcXFxcXFwiLFxcXFxuICAgIHBpY191cmw6IFxcXFxcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9jb2RlX3ZpZXdcXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgLy90aXRsZTogJzxmb250IGNvbG9yPVxcXFxcXFwiIzEzQjYxQlxcXFxcXFwiPuKWkCA8L2ZvbnQ+PGI+6Kej5p6Q5YiX6KGoPGI+ICgnICsgU3RyaW5nKGxlbmd0aCkuZm9udGNvbG9yKFxcXFxcXFwiI2ZmNjYwMVxcXFxcXFwiKSArIFxcXFxcXFwiKVxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiLFxcXFxufSk7XFxcXG5sZXQgY291bnRUaXRsZSA9IGQuYXQoLTEpO1xcXFxuXFxcXG5cXFxcbmxldCBjb3VudCA9IGQubGVuZ3RoO1xcXFxuXFxcXG5mb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XFxcXG4gICAgbGV0IGl0ID0gYXJyW2ldO1xcXFxuXFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ1bJyArIGkgKyAnXTxiPiAgJyArIGl0Lm5hbWUgKyAoaXQuZm9yYmlkZGVuID8gXFxcXFxcXCIgI+KAnOKAnOemgeeUqOKAneKAnVxcXFxcXFwiLnNtYWxsKCkgOiBcXFxcXFxcIlxcXFxcXFwiKSxcXFxcbiAgICAgICAgZGVzYzogaXQudXJsLFxcXFxuICAgICAgICB1cmw6ICQoW1xcXFxcXFwi57yW6L6RXFxcXFxcXCIsIFxcXFxcXFwi5YiG5LqrXFxcXFxcXCIsIFxcXFxcXFwi56aB55SoL+WQr+eUqFxcXFxcXFwiLCBcXFxcXFxcIuenu+WKqFxcXFxcXFwiLCBcXFxcXFxcIue9rumhtlxcXFxcXFwiLCBcXFxcXFxcIuWIoOmZpFxcXFxcXFwiXSwgMSwgXFxcXFxcXCLmk43kvZzvvJpcXFxcXFxcIiArIGl0Lm5hbWUpLnNlbGVjdCgoaW5kZXgsIGxlbmd0aCkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFxcXFxcIue8lui+kVxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3J1bGVFZGl0I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIuWIhuS6q1xcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IG9wcyA9IGdldFBhc3RlcygpO1xcXFxuICAgICAgICAgICAgICAgIG9wcy51bnNoaWZ0KFxcXFxcXFwi5a6M5pW05Y+j5LukXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAkKG9wcywgMiwgXFxcXFxcXCLliIbkuqvmlrnlvI9cXFxcXFxcIikuc2VsZWN0KChpbmRleCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9ICQucmVxdWlyZShcXFxcXFxcImNvbmZpZ3NcXFxcXFxcIikuZ2V0SnNvbigpW2luZGV4XTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcnVsZS51c2VyID0gdW5kZWZpbmVkO1xcXFxuICAgICAgICAgICAgICAgICAgICBydWxlLmZvcmJpZGRlbiA9IHVuZGVmaW5lZDtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGViNjQgPSBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkocnVsZSkpO1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgZ2V0UGFzcyA9IChuYW1lLCBydWxlLCB0eXBlKSA9PiBcXFxcXFxcIua1t+mYlOinhueVjO+8jOOAjFxcXFxcXFwiICsgbmFtZSArIFxcXFxcXFwi44CNRFJQWeino+aekO+8jOWkjeWItuaVtOadoeWPo+S7pOaJk+W8gOi9r+S7tuWwseS8muiHquWKqOWvvOWFpSRcXFxcXFxcIiArIHJ1bGUgKyBcXFxcXFxcIiRcXFxcXFxcIiArIHR5cGUgKyBcXFxcXFxcIkBpbXBvcnQ9anM6JC5yZXF1aXJlKCdpbXBvcnQ/cnVsZT0nK1xcXFxcXFwiICsgSlNPTi5zdHJpbmdpZnkoTVlfUlVMRS50aXRsZSkgKyBcXFxcXFxcIikoaW5wdXQpXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PSBcXFxcXFxcIuWujOaVtOWPo+S7pFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJjb3B5Oi8vXFxcXFxcXCIgKyBnZXRQYXNzKHJ1bGUubmFtZSwgcnVsZWI2NCwgXFxcXFxcXCJhXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBzaGFyZVBhc3RlKHJ1bGViNjQsIGlucHV0KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImNvcHk6Ly9cXFxcXFxcIiArIGdldFBhc3MocnVsZS5uYW1lLCB1LCBcXFxcXFxcImJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9LCBpbmRleCk7XFxcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIuenu+WKqFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoaW5kZXggKyBcXFxcXFxcIlxcXFxcXFwiLCBcXFxcXFxcIui+k+WFpeS9jee9rlxcXFxcXFwiKS5pbnB1dCgoaW5kZXgsIGxlbmd0aCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SW5kZXggPSBOdW1iZXIoaW5wdXQpO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKG5ld0luZGV4KSB8fCBuZXdJbmRleCA+PSBsZW5ndGgpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5LiN5ZKM6KeE55qE5L2N572uXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXFxcXFwiY29uZmlnc1xcXFxcXFwiKS5nZXRKc29uKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gcnVsZXMuc3BsaWNlKGluZGV4LCAxKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcnVsZXMuc3BsaWNlKG5ld0luZGV4LCAwLCBydWxlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXFxcXFwiY29uZmlnc1xcXFxcXFwiKS5zYXZlSnNvbihydWxlcyk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgICAgICB9LCBpbmRleCwgbGVuZ3RoKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwi572u6aG2XFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgbmV3SW5kZXggPSAwO1xcXFxuICAgICAgICAgICAgICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFxcXFxcImNvbmZpZ3NcXFxcXFxcIikuZ2V0SnNvbigpO1xcXFxuICAgICAgICAgICAgICAgIGxldCBydWxlID0gcnVsZXMuc3BsaWNlKGluZGV4LCAxKVswXTtcXFxcbiAgICAgICAgICAgICAgICBydWxlcy5zcGxpY2UobmV3SW5kZXgsIDAsIHJ1bGUpO1xcXFxuICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFxcXFxcImNvbmZpZ3NcXFxcXFxcIikuc2F2ZUpzb24ocnVsZXMpO1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwi5Yig6ZmkXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJChcXFxcXFxcIuehruiupOWIoOmZpO+8n1xcXFxcXFwiKS5jb25maXJtKChpbmRleCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSAkLnJlcXVpcmUoXFxcXFxcXCJjb25maWdzXFxcXFxcXCIpLmdldEpzb24oKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBydWxlcy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcXFxcXCJjb25maWdzXFxcXFxcXCIpLnNhdmVKc29uKHJ1bGVzKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+W3suWIoOmZpFxcXFxcXFwiICsgcnVsZS5uYW1lO1xcXFxuICAgICAgICAgICAgICAgIH0sIGluZGV4KTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFxcXFxcImNvbmZpZ3NcXFxcXFxcIikuZ2V0SnNvbigpO1xcXFxuICAgICAgICAgICAgICAgIGxldCBydWxlID0gYXJyW2luZGV4XTtcXFxcbiAgICAgICAgICAgICAgICBydWxlLmZvcmJpZGRlbiA9ICFydWxlLmZvcmJpZGRlbjtcXFxcbiAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcXFxcXCJjb25maWdzXFxcXFxcXCIpLnNhdmVKc29uKGFycik7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIChydWxlLmZvcmJpZGRlbiA/IFxcXFxcXFwi56aB55SoXFxcXFxcXCIgOiBcXFxcXFxcIuWQr+eUqFxcXFxcXFwiKSArIHJ1bGUubmFtZTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSwgaSwgbGVuZ3RoKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpOiBpLFxcXFxuICAgICAgICAgICAgcGFnZVRpdGxlOiBpdC5uYW1lXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbn1cXFxcbmNvdW50VGl0bGUudGl0bGUgPSAnPGZvbnQgY29sb3I9XFxcXFxcXCIjMTNCNjFCXFxcXFxcXCI+4paQIDwvZm9udD48Yj7op6PmnpDliJfooag8Yj4gKCcgKyAoKGQubGVuZ3RoIC0gY291bnQpICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBsZW5ndGgpLmZvbnRjb2xvcihcXFxcXFxcIiNmZjY2MDFcXFxcXFxcIikgKyBcXFxcXFxcIilcXFxcXFxcIjtcXFxcbnNldFJlc3VsdChkKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLop6PmnpDnvJbovpFcXFwiLFxcXCJwYXRoXFxcIjpcXFwicnVsZUVkaXRcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG52YXIgZCA9IFtdO1xcXFxuXFxcXG5hZGRMaXN0ZW5lcihcXFxcXFxcIm9uQ2xvc2VcXFxcXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgY2xlYXJNeVZhcihcXFxcXFxcInBzX25hbWVcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJNeVZhcihcXFxcXFxcInBzX3VybFxcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKFxcXFxcXFwicHNfZmxhZ1xcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKFxcXFxcXFwicHNfaGVhZGVyc1xcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKFxcXFxcXFwicHNfbWV0aG9kXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJwc19ydW5UeXBlXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJwc19qc29uUGF0aFxcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKFxcXFxcXFwicHNfanNcXFxcXFxcIik7XFxcXG59KSk7XFxcXG5sZXQgdXJsSW5kZXggPSBwYXJzZUludChnZXRQYXJhbShcXFxcXFxcImluZGV4XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpKTtcXFxcbnVybEluZGV4ID0gTnVtYmVyLmlzTmFOKHVybEluZGV4KSA/IHZvaWQoMCkgOiB1cmxJbmRleDtcXFxcbmxldCBpbmRleCA9IHZvaWQoMCkgPT09IHVybEluZGV4ID8gTVlfUEFSQU1TLmkgOiB1cmxJbmRleDtcXFxcbmxldCBpc0ltcG9ydCA9ICEhZ2V0UGFyYW0oXFxcXFxcXCJpc0ltcG9ydFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbmxldCBhcnIgPSAkLnJlcXVpcmUoXFxcXFxcXCJjb25maWdzXFxcXFxcXCIpLmdldEpzb24oKTtcXFxcbmxldCBvYmo7XFxcXG5pZiAoaXNJbXBvcnQpIHtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBvYmogPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS9qaWV4aVNpbXBsZUltcG9ydC5qc29uXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgdGlwID0gaW5kZXggIT09IHZvaWQoMCkgPyBcXFxcXFxcIuabtOaWsOino+aekFxcXFxcXFwiIDogXFxcXFxcXCLlr7zlhaXop6PmnpBcXFxcXFxcIjtcXFxcbiAgICAgICAgc2V0UGFnZVRpdGxlKHRpcCArIFxcXFxcXFwiOlxcXFxcXFwiICsgb2JqLm5hbWUpO1xcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCY4oCYXFxcXFxcXCIgKyB0aXAgKyBcXFxcXFxcIuKAmeKAmVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuXFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICBvYmogPSB7fTtcXFxcbiAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICB0b2FzdChcXFxcXFxcIuWvvOWFpemUmeivr1xcXFxcXFwiKTtcXFxcbiAgICB9XFxcXG59IGVsc2UgaWYgKGluZGV4ICE9PSB2b2lkKDApKSB7XFxcXG4gICAgb2JqID0gYXJyW2luZGV4XTtcXFxcbiAgICBzZXRQYWdlVGl0bGUoXFxcXFxcXCLnvJbovpHop6PmnpA6XFxcXFxcXCIgKyBvYmoubmFtZSk7XFxcXG59IGVsc2Uge1xcXFxuICAgIG9iaiA9IHtcXFxcbiAgICAgICAgcnVuVHlwZTogXFxcXFxcXCJXRUJcXFxcXFxcIixcXFxcbiAgICAgICAgbWV0aG9kOiBcXFxcXFxcIkdFVFxcXFxcXFwiXFxcXG4gICAgfTtcXFxcbiAgICBzZXRQYWdlVGl0bGUoXFxcXFxcXCLmlrDlu7rop6PmnpBcXFxcXFxcIik7XFxcXG59XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiaW5wdXRcXFxcXFxcIixcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuWQjeWtlyjlv4XloaspXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCJwc19uYW1lXFxcXFxcXCIsIGlucHV0KTtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLm5hbWUsXFxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2VcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxuXFxcXG5kLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLop6PmnpB1cmwo5b+F5aGrKVxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwicHNfdXJsXFxcXFxcXCIsIGlucHV0KTtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLnVybCxcXFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICB9XFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiaW5wdXRcXFxcXFxcIixcXFxcbiAgICBkZXNjOiBcXFxcXFxcImZsYWco5b+F5aGrKVxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIHR5cGU6IFxcXFxcXFwidGV4dGFyZWFcXFxcXFxcIixcXFxcbiAgICAgICAgaGVpZ2h0OiAyLFxcXFxuICAgICAgICBoaWdobGlnaHQ6IHRydWUsXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwicHNfZmxhZ1xcXFxcXFwiLCBpbnB1dCk7XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5mbGFnLFxcXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgIH1cXFxcbn0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwiaGVhZGVycyjpgInloaspXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJ0ZXh0YXJlYVxcXFxcXFwiLFxcXFxuICAgICAgICBoZWlnaHQ6IDIsXFxcXG4gICAgICAgIGhpZ2hsaWdodDogdHJ1ZSxcXFxcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCJwc19oZWFkZXJzXFxcXFxcXCIsIGlucHV0KTtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLmhlYWRlcnMsXFxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcbnB1dE15VmFyKFxcXFxcXFwicHNfcnVuVHlwZVxcXFxcXFwiLCBvYmoucnVuVHlwZSB8fCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi6Kej5p6Q5qih5byP77yaXFxcXFxcXCIgKyAob2JqLnJ1blR5cGUgfHwgXFxcXFxcXCJXRUJcXFxcXFxcIiksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogJChbXFxcXFxcXCJXRUJcXFxcXFxcIiwgXFxcXFxcXCJKU09OXFxcXFxcXCIsIFxcXFxcXFwiSlNcXFxcXFxcIl0pLnNlbGVjdCgoKSA9PiB7XFxcXG5cXFxcbiAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCJwc19ydW5UeXBlXFxcXFxcXCIsIGlucHV0KTtcXFxcbiAgICAgICAgdXBkYXRlSXRlbShcXFxcXFxcInBzX3J1blR5cGVcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi6Kej5p6Q5qih5byP77yaXFxcXFxcXCIgKyBpbnB1dFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0pLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGlkOiBcXFxcXFxcInBzX3J1blR5cGVcXFxcXFxcIixcXFxcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwianNvblBhdGgoSlNPTuino+aekOaooeW8j+W/heWhqylcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcInBzX2pzb25QYXRoXFxcXFxcXCIsIGlucHV0KTtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLmpzb25QYXRoLFxcXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgIH1cXFxcbn0pO1xcXFxucHV0TXlWYXIoXFxcXFxcXCJwc19tZXRob2RcXFxcXFxcIiwgb2JqLm1ldGhvZCB8fCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwiSlNPTuivt+axguaooeW8j++8mlxcXFxcXFwiICsgKG9iai5tZXRob2QgfHwgXFxcXFxcXCJHRVRcXFxcXFxcIiksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFtcXFxcXFxcIkdFVFxcXFxcXFwiLCBcXFxcXFxcIlBPU1RcXFxcXFxcIl0pLnNlbGVjdCgoKSA9PiB7XFxcXG5cXFxcbiAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCJwc19tZXRob2RcXFxcXFxcIiwgaW5wdXQpO1xcXFxuICAgICAgICB1cGRhdGVJdGVtKFxcXFxcXFwicHNfbWV0aG9kXFxcXFxcXCIsIHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIkpTT07or7fmsYLmqKHlvI/vvJpcXFxcXFxcIiArIGlucHV0XFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgfSksXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgaWQ6IFxcXFxcXFwicHNfbWV0aG9kXFxcXFxcXCIsXFxcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcXFxuICAgIH1cXFxcbn0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwianMoSlPmqKHlvI/lv4XloaspXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJ0ZXh0YXJlYVxcXFxcXFwiLFxcXFxuICAgICAgICBoZWlnaHQ6IDMsXFxcXG4gICAgICAgIGhpZ2hsaWdodDogdHJ1ZSxcXFxcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCJwc19qc1xcXFxcXFwiLCBpbnB1dCk7XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5qcyxcXFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICB9XFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5Yig6ZmkXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGluZGV4LCB1cmxJbmRleCkgPT4ge1xcXFxuICAgICAgICBpZiAoaW5kZXggPT09IHZvaWQoMCkpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5q2k6aG55peg5rOV5Yig6ZmkXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKHVybEluZGV4ICE9PSB2b2lkKDApKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ato+WcqOabtOaWsOino+aekO+8jOWIoOmZpOivt+S7juino+aekOeuoeeQhui/m+WFpVxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGNvbmZpcm0oe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5rip6aao5o+Q56S6XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb250ZW50OiBcXFxcXFxcIuehruWumuimgeWIoOmZpOatpOino+aekOWQl++8n+azqOaEj+WIoOmZpOWQjuaXoOazleaBouWkjVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29uZmlybTogJC50b1N0cmluZygoaW5kZXgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgYXJyID0gJC5yZXF1aXJlKFxcXFxcXFwiY29uZmlnc1xcXFxcXFwiKS5nZXRKc29uKCk7XFxcXG4gICAgICAgICAgICAgICAgYXJyLnNwbGljZShpbmRleCwgMSk7XFxcXG4gICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXFxcXFwiY29uZmlnc1xcXFxcXFwiKS5zYXZlSnNvbihhcnIpO1xcXFxuICAgICAgICAgICAgICAgIGJhY2sodHJ1ZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0sIGluZGV4KVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgfSwgaW5kZXgsIHVybEluZGV4KSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIixcXFxcbn0pO1xcXFxuXFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIua1i+ivlVxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgbGV0IHRlc3RLZXl3b3JkID0gZ2V0SXRlbShcXFxcXFxcInRlc3RVcmxcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgIHJldHVybiAkKHRlc3RLZXl3b3JkLCBcXFxcXFxcIuivt+i+k+WFpeW9seinhue9keermeWcsOWdgFxcXFxcXFwiKS5pbnB1dCgoKSA9PiB7XFxcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwidGVzdFVybFxcXFxcXFwiLCBpbnB1dCk7XFxcXG4gICAgICAgICAgICBsZXQgdXJsID0gZ2V0TXlWYXIoXFxcXFxcXCJwc191cmxcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBsZXQgbmFtZSA9IGdldE15VmFyKFxcXFxcXFwicHNfbmFtZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGxldCBmbGFnID0gZ2V0TXlWYXIoXFxcXFxcXCJwc19mbGFnXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSBnZXRNeVZhcihcXFxcXFxcInBzX2hlYWRlcnNcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBsZXQgcnVuVHlwZSA9IGdldE15VmFyKFxcXFxcXFwicHNfcnVuVHlwZVxcXFxcXFwiLCBcXFxcXFxcIldFQlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBnZXRNeVZhcihcXFxcXFxcInBzX21ldGhvZFxcXFxcXFwiLCBcXFxcXFxcIkdFVFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGxldCBqc29uUGF0aCA9IGdldE15VmFyKFxcXFxcXFwicHNfanNvblBhdGhcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikudHJpbSgpIHx8IHZvaWQgMDtcXFxcbiAgICAgICAgICAgIGxldCBqcyA9IGdldE15VmFyKFxcXFxcXFwicHNfanNcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikgfHwgdm9pZCAwO1xcXFxuICAgICAgICAgICAgaWYgKGhlYWRlcnMpIHtcXFxcbiAgICAgICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzID0gSlNPTi5wYXJzZShoZWFkZXJzKTtcXFxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhlYWRlcnPmoLzlvI/plJnor686XFxcXFxcXCIgKyBlLnRvU3RyaW5nKCk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFxcXFxcInZpZGVvVXJsXFxcXFxcXCIpLnByZXBhcmVQYXJzZXMoW3tcXFxcbiAgICAgICAgICAgICAgICBuYW1lLFxcXFxuICAgICAgICAgICAgICAgIHVybCxcXFxcbiAgICAgICAgICAgICAgICBmbGFnLFxcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnMsXFxcXG4gICAgICAgICAgICAgICAgcnVuVHlwZSxcXFxcbiAgICAgICAgICAgICAgICBtZXRob2QsXFxcXG4gICAgICAgICAgICAgICAganNvblBhdGgsXFxcXG4gICAgICAgICAgICAgICAganNcXFxcbiAgICAgICAgICAgIH1dLCBpbnB1dCxudWxsLCB0cnVlKTtcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfSksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8zXFxcXFxcXCIsXFxcXG59KTtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLkv53lrZhcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoaW5kZXgsIGlzSW1wb3J0KSA9PiB7XFxcXG4gICAgICAgIGxldCBuYW1lID0gZ2V0TXlWYXIoXFxcXFxcXCJwc19uYW1lXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpLnRyaW0oKTtcXFxcbiAgICAgICAgaWYgKCFuYW1lKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WQjeWtl+W+l+acieS4gOS4quWQp1xcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCB1cmwgPSBnZXRNeVZhcihcXFxcXFxcInBzX3VybFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKS50cmltKCk7XFxcXG4gICAgICAgIGlmICghdXJsKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ino+aekOWcsOWdgOS4jeiDveS4uuepulxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBmbGFnID0gZ2V0TXlWYXIoXFxcXFxcXCJwc19mbGFnXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoIWZsYWcpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6Kej5p6Q5Zyw5Z2A5qCH6K+G5LiN6IO95Li656m6XFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IGhlYWRlcnMgPSBnZXRNeVZhcihcXFxcXFxcInBzX2hlYWRlcnNcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikudHJpbSgpO1xcXFxuICAgICAgICBpZiAoaGVhZGVycykge1xcXFxuICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzID0gSlNPTi5wYXJzZShoZWFkZXJzKTtcXFxcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YgaGVhZGVycyE9PVxcXFxcXFwib2JqZWN0XFxcXFxcXCIpIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIumUmeivr+exu+Wei++8jOW/hemhu+S4uk9iamVjdFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoZWFkZXJz5qC85byP6ZSZ6K+vOlxcXFxcXFwiICsgZS50b1N0cmluZygpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBydW5UeXBlID0gZ2V0TXlWYXIoXFxcXFxcXCJwc19ydW5UeXBlXFxcXFxcXCIsIFxcXFxcXFwiV0VCXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgbWV0aG9kID0gZ2V0TXlWYXIoXFxcXFxcXCJwc19tZXRob2RcXFxcXFxcIiwgXFxcXFxcXCJHRVRcXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCBqc29uUGF0aCA9IGdldE15VmFyKFxcXFxcXFwicHNfanNvblBhdGhcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikudHJpbSgpIHx8IHZvaWQgMDtcXFxcbiAgICAgICAgbGV0IGpzID0gZ2V0TXlWYXIoXFxcXFxcXCJwc19qc1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSB8fCB2b2lkIDA7XFxcXG4gICAgICAgIGlmIChydW5UeXBlID09PSBcXFxcXFxcIkpTT05cXFxcXFxcIiAmJiAhanNvblBhdGgpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vSlNPTuaooeW8j+S4i+W/hemhu+Whq2pzb25QYXRoXFxcXFxcXCI7XFxcXG4gICAgICAgIH0gZWxzZSBpZiAocnVuVHlwZSA9PT0gXFxcXFxcXCJKU1xcXFxcXFwiICYmICFqcykge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9KU+aooeW8j+S4i+W/hemhu+Whq2pzXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFxcXFxcImNvbmZpZ3NcXFxcXFxcIikuZ2V0SnNvbigpO1xcXFxuICAgICAgICBsZXQgb2JqMSA9IHtcXFxcbiAgICAgICAgICAgIG5hbWUsXFxcXG4gICAgICAgICAgICB1cmwsXFxcXG4gICAgICAgICAgICBmbGFnLFxcXFxuICAgICAgICAgICAgaGVhZGVycyxcXFxcbiAgICAgICAgICAgIHJ1blR5cGUsXFxcXG4gICAgICAgICAgICBtZXRob2QsXFxcXG4gICAgICAgICAgICBqc29uUGF0aCxcXFxcbiAgICAgICAgICAgIGpzXFxcXG4gICAgICAgIH07XFxcXG4gICAgICAgIGlmIChpbmRleCA9PT0gdm9pZCgwKSkge1xcXFxuICAgICAgICAgICAgaWYgKGFyci5zb21lKHYgPT4gdi5uYW1lID09PSBuYW1lKSkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey57uP5a2Y5Zyo6K+l6Kej5p6QXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZiAob2JqMS5ncm91cCkge1xcXFxuICAgICAgICAgICAgICAgIGxldCBncm91cCA9IG9iajEuZ3JvdXA7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gYXJyLmZpbmRJbmRleCh2ID0+IHYuZ3JvdXAgPT09IGdyb3VwKTtcXFxcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGFyci51bnNoaWZ0KG9iajEpO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDAsIG9iajEpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgaWYgKGlzSW1wb3J0KSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKG9iajEpO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGFyci51bnNoaWZ0KG9iajEpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGxldCBuYW1leSA9IGFycltpbmRleF0ubmFtZTtcXFxcbiAgICAgICAgICAgIGlmIChuYW1lICE9PSBuYW1leSkge1xcXFxuICAgICAgICAgICAgICAgIGlmIChhcnIuc29tZSh2ID0+IHYubmFtZSA9PT0gbmFtZSkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7Lnu4/lrZjlnKjor6Xop6PmnpBcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBvYmoxID0gT2JqZWN0LmFzc2lnbihhcnJbaW5kZXhdLCBvYmoxKTtcXFxcbiAgICAgICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDEsIG9iajEpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgICQucmVxdWlyZShcXFxcXFxcImNvbmZpZ3NcXFxcXFxcIikuc2F2ZUpzb24oYXJyKTtcXFxcbiAgICAgICAgYmFjayh0cnVlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kv53lrZjmiJDlip9cXFxcXFxcIjtcXFxcbiAgICB9LCBpbmRleCwgaXNJbXBvcnQpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfM1xcXFxcXFwiLFxcXFxufSk7XFxcXG5cXFxcbnNldFJlc3VsdChkKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLop4TliJnlr7zlhaVcXFwiLFxcXCJwYXRoXFxcIjpcXFwiaW1wb3J0XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuZnVuY3Rpb24gc2F2ZUNhY2hlKGpzb24pIHtcXFxcbiAgICB3cml0ZUZpbGUoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS9qaWV4aVNpbXBsZUltcG9ydC5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gaW1wb3J0UGFyc2UocGFzcykge1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIGxldCBbXywgcnVsZSwgdHlwZV0gPSBwYXNzLnNwbGl0KFxcXFxcXFwiJFxcXFxcXFwiKTtcXFxcbiAgICAgICAgaWYgKHR5cGUgPT09IFxcXFxcXFwiYlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBydWxlID0gcGFyc2VQYXN0ZShydWxlKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgcnVsZXMgPSBKU09OLnBhcnNlKGJhc2U2NERlY29kZShydWxlKSk7XFxcXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShydWxlcykpIHtcXFxcbiAgICAgICAgICAgIHJ1bGVzID0gW3J1bGVzXTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICAvL3J1bGVzLnJldmVyc2UoKTtcXFxcbiAgICAgICAgTVlfVVJMID0gbW9kdWxlLmlkO1xcXFxuICAgICAgICBsZXQgcnVsZVRpdGxlID0gZ2V0UGFyYW0oXFxcXFxcXCJydWxlXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgYXJyID0gJC5yZXF1aXJlKFxcXFxcXFwiY29uZmlncz9ydWxlPVxcXFxcXFwiICsgcnVsZVRpdGxlKS5nZXRKc29uKCk7XFxcXG4gICAgICAgIGxldCBuZXdJID0gMDtcXFxcbiAgICAgICAgZm9yIChsZXQgcnVsZSBvZiBydWxlcykge1xcXFxuICAgICAgICAgICAgbGV0IGluZGV4ID0gYXJyLmZpbmRJbmRleCh2ID0+IHYubmFtZSA9PT0gcnVsZS5uYW1lKTtcXFxcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XFxcXG4gICAgICAgICAgICAgICAgcnVsZSA9IE9iamVjdC5hc3NpZ24oYXJyW2luZGV4XSwgcnVsZSk7XFxcXG4gICAgICAgICAgICAgICAgYXJyLnNwbGljZShpbmRleCwgMSwgcnVsZSk7XFxcXG4gICAgICAgICAgICAgICAgaWYgKHJ1bGVzLmxlbmd0aCA9PT0gMSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBzYXZlQ2FjaGUocnVsZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vcGFnZS9ydWxlRWRpdCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSM/aXNJbXBvcnQ9dHJ1ZSZpbmRleD1cXFxcXFxcIiArIGluZGV4ICsgXFxcXFxcXCImcnVsZT1cXFxcXFxcIiArIHJ1bGVUaXRsZTtcXFxcbiAgICAgICAgICAgICAgICAgICAgLy90b2FzdChcXFxcXFxcIuW3suabtOaWsOinhOWIme+8mlxcXFxcXFwiICsgcnVsZS5uYW1lKTtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICBsb2coXFxcXFxcXCLlt7Lmm7TmlrDop4TliJnvvJpcXFxcXFxcIiArIHJ1bGUubmFtZSlcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIG5ld0krKztcXFxcbiAgICAgICAgICAgICAgICBhcnIucHVzaChydWxlKTtcXFxcbiAgICAgICAgICAgICAgICBpZiAocnVsZXMubGVuZ3RoID09PSAxKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHNhdmVDYWNoZShydWxlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3J1bGVFZGl0I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5Iz9pc0ltcG9ydD10cnVlJnJ1bGU9XFxcXFxcXCIgKyBydWxlVGl0bGU7XFxcXG4gICAgICAgICAgICAgICAgICAgIC8vdG9hc3QoXFxcXFxcXCLlt7Llr7zlhaXop4TliJnvvJpcXFxcXFxcIiArIHJ1bGUubmFtZSk7XFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbG9nKFxcXFxcXFwi5bey5a+85YWl6KeE5YiZ77yaXFxcXFxcXCIgKyBydWxlLm5hbWUpXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmIChydWxlcy5sZW5ndGggPiAxKSB7XFxcXG4gICAgICAgICAgICAkLnJlcXVpcmUoXFxcXFxcXCJjb25maWdzP3J1bGU9XFxcXFxcXCIgKyBydWxlVGl0bGUpLnNhdmVKc29uKGFycik7XFxcXG4gICAgICAgICAgICB0b2FzdChcXFxcXFxcIuaWsOWinu+8mlxcXFxcXFwiICsgbmV3SSArIFxcXFxcXFwiIOimhuebluabtOaWsO+8mlxcXFxcXFwiICsgKHJ1bGVzLmxlbmd0aCAtIG5ld0kpKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxcXG4gICAgICAgIHRvYXN0KFxcXFxcXFwi5a+85YWl5aSx6LSlXFxcXFxcXCIpO1xcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gaW1wb3J0UnVsZShwYXNzKSB7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgbGV0IFtfLCBydWxlLCBwbmFtZV0gPSBwYXNzLnNwbGl0KFxcXFxcXFwiJFxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IHBhdGggPSBnZXRQdWJsaWNJdGVtKFxcXFxcXFwiRHJweUhpa2VyQGlucHV0X3BhdGhcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgIGlmICghcGF0aCkge1xcXFxuICAgICAgICAgICAgTVlfVVJMID0gbW9kdWxlLmlkO1xcXFxuICAgICAgICAgICAgbGV0IHJ1bGVUaXRsZSA9IGdldFBhcmFtKFxcXFxcXFwicnVsZVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHRvYXN0KFxcXFxcXFwi5pyq5oyH5a6a6buY6K6k5L+d5a2Y55uu5b2V77yM6K+35YWI6K6+572u5L+d5a2Y55uu5b2VXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3NoYXJlZGVmYXVsdHBhdGgjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP3J1bGU9XFxcXFxcXCIrcnVsZVRpdGxlO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBydWxlcyA9IGJhc2U2NERlY29kZShwYXJzZVBhc3RlKHJ1bGUpKTtcXFxcbiAgICAgICAgaWYgKCFydWxlcykgdG9hc3QoXFxcXFxcXCLlhoXlrrnkuLrnqbrvvIzlr7zlhaXlpLHotKVcXFxcXFxcIik7XFxcXG4gICAgICAgIHBhdGggPSBwYXRoLmVuZHNXaXRoKFxcXFxcXFwiL1xcXFxcXFwiKSA/IHBhdGggOiAocGF0aCArIFxcXFxcXFwiL1xcXFxcXFwiKTtcXFxcbiAgICAgICAgd3JpdGVGaWxlKHBhdGggKyBwbmFtZSwgcnVsZXMpO1xcXFxuICAgICAgICB0b2FzdChcXFxcXFxcIuWvvOWFpeaIkOWKn+ivt+WIt+aWsOmFjee9rlxcXFxcXFwiKTtcXFxcbiAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIHRvYXN0KFxcXFxcXFwi5a+85YWl5aSx6LSlOlxcXFxcXFwiICsgZS50b1N0cmluZygpKVxcXFxuICAgIH1cXFxcbn1cXFxcbiQuZXhwb3J0cyA9IGZ1bmN0aW9uKHBhc3MsIG1vZGUpIHtcXFxcbiAgICBpZiAobW9kZSkge1xcXFxuICAgICAgICByZXR1cm4gaW1wb3J0UnVsZShwYXNzKTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICByZXR1cm4gaW1wb3J0UGFyc2UocGFzcyk7XFxcXG4gICAgfVxcXFxufVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuinhumikeino+aekFxcXCIsXFxcInBhdGhcXFwiOlxcXCJ2aWRlb1VybFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJmdW5jdGlvbiBpc29mZmljaWFsKHVybCkge1xcXFxuICBsZXQgZmxhZyA9IG5ldyBSZWdFeHAoJ3FxXFxcXFxcXFwuY29tfGlxaXlpXFxcXFxcXFwuY29tfHlvdWt1XFxcXFxcXFwuY29tfG1ndHZcXFxcXFxcXC5jb218YmlsaWJpbGlcXFxcXFxcXC5jb218c29odVxcXFxcXFxcLmNvbXxpeGlndWFcXFxcXFxcXC5jb218cHB0dlxcXFxcXFxcLmNvbXxtaWd1dmlkZW9cXFxcXFxcXC5jb218bGVcXFxcXFxcXC5jb218MTkwNVxcXFxcXFxcLmNvbXxmdW5cXFxcXFxcXC50dicpO1xcXFxuICByZXR1cm4gZmxhZy50ZXN0KHVybCk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHByb3h5KHRpdGxlKSB7XFxcXG4gIGZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSkge1xcXFxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XFxcXG4gICAgICByZXR1cm4gW107XFxcXG4gICAgfVxcXFxuICAgIGxldCBwYXRoID0gW107XFxcXG4gICAgbGV0IGN1cnJlbnQgPSAnJztcXFxcbiAgICBsZXQgaW5CcmFja2V0cyA9IGZhbHNlO1xcXFxuICAgIGxldCBlc2NhcGUgPSBmYWxzZTtcXFxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICBsZXQgY2hhciA9IHZhbHVlW2ldO1xcXFxuICAgICAgaWYgKGVzY2FwZSkge1xcXFxuICAgICAgICBjdXJyZW50ICs9IGNoYXI7XFxcXG4gICAgICAgIGVzY2FwZSA9IGZhbHNlO1xcXFxuICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnXFxcXFxcXFxcXFxcXFxcXCcpIHtcXFxcbiAgICAgICAgZXNjYXBlID0gdHJ1ZTtcXFxcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJy4nICYmICFpbkJyYWNrZXRzKSB7XFxcXG4gICAgICAgIHBhdGgucHVzaChjdXJyZW50KTtcXFxcbiAgICAgICAgY3VycmVudCA9ICcnO1xcXFxuICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnWycpIHtcXFxcbiAgICAgICAgaW5CcmFja2V0cyA9IHRydWU7XFxcXG4gICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICddJykge1xcXFxuICAgICAgICBpbkJyYWNrZXRzID0gZmFsc2U7XFxcXG4gICAgICB9IGVsc2Uge1xcXFxuICAgICAgICBjdXJyZW50ICs9IGNoYXI7XFxcXG4gICAgICB9XFxcXG4gICAgfVxcXFxuICAgIGlmIChjdXJyZW50KSB7XFxcXG4gICAgICBwYXRoLnB1c2goY3VycmVudCk7XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBwYXRoO1xcXFxuICB9XFxcXG5cXFxcbiAgZnVuY3Rpb24gZ2V0SnNvbihvYmosIHBhdGgpIHtcXFxcbiAgICBpZiAoIW9iaiB8fCAhQXJyYXkuaXNBcnJheShwYXRoKSkge1xcXFxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcXFxcbiAgICB9XFxcXG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XFxcXG4gICAgICByZXR1cm4gb2JqO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgY3VycmVudCA9IG9iajtcXFxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcXFxcbiAgICAgIGxldCBrZXkgPSBwYXRoW2ldO1xcXFxuICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjdXJyZW50ICE9PSAnb2JqZWN0Jykge1xcXFxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xcXFxuICAgICAgfVxcXFxuICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIGN1cnJlbnQ7XFxcXG4gIH1cXFxcbiAgdHJ5IHtcXFxcbiAgICBsZXQgcnVuVHlwZSA9IE1ZX1BBUkFNUy5ydW5UeXBlWzBdO1xcXFxuICAgIGxldCB1cmwgPSBkZWNvZGVVUklDb21wb25lbnQoYmFzZTY0RGVjb2RlKE1ZX1BBUkFNUy51cmxbMF0pKTtcXFxcbiAgICBpZiAocnVuVHlwZSA9PSBcXFxcXFxcIkpTT05cXFxcXFxcIikge1xcXFxuXFxcXG4gICAgICBsZXQgcGFyYW0gPSBKU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudChiYXNlNjREZWNvZGUoTVlfUEFSQU1TLnBhcmFtWzBdKSkpO1xcXFxuICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKHJlcXVlc3QodXJsLCB7XFxcXG4gICAgICAgIGhlYWRlcnM6IHBhcmFtLmhlYWRlcnMgfHwge30sXFxcXG4gICAgICAgIG1ldGhvZDogcGFyYW0ubWV0aG9kIHx8IHZvaWQgMFxcXFxuICAgICAgfSkpO1xcXFxuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgc3RhdHVzQ29kZTogMzAyLFxcXFxuICAgICAgICBoZWFkZXJzOiBPYmplY3QuYXNzaWduKHt9LCBwYXJhbS5oZWFkZXJzIHx8IHt9LCB7XFxcXG4gICAgICAgICAgXFxcXFxcXCJMb2NhdGlvblxcXFxcXFwiOiBnZXRKc29uKGpzb24sIHRvUGF0aChwYXJhbS5qc29uUGF0aCkpLFxcXFxuICAgICAgICB9KVxcXFxuICAgICAgfSk7XFxcXG4gICAgfSBlbHNlIGlmIChydW5UeXBlID09IFxcXFxcXFwiSlNcXFxcXFxcIikge1xcXFxuXFxcXG4gICAgICBsZXQgcGFyc2U7XFxcXG4gICAgICBpZiAoTVlfUEFSQU1TLmluZGV4KSB7XFxcXG4gICAgICAgIHBhcnNlID0gJC5yZXF1aXJlKFxcXFxcXFwiY29uZmlncz9ydWxlPVxcXFxcXFwiICsgdGl0bGUpLmdldEpzb24oKVtNWV9QQVJBTVMuaW5kZXhbMF1dO1xcXFxuICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgcGFyc2UgPSBKU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudChiYXNlNjREZWNvZGUoTVlfUEFSQU1TLnBhcmFtWzBdKSkpO1xcXFxuICAgICAgfVxcXFxuICAgICAgbGV0IHJlcyA9IG5ldyBGdW5jdGlvbihcXFxcXFxcInVybFxcXFxcXFwiLCBcXFxcXFxcInNlbGZcXFxcXFxcIiwgcGFyc2UuanMpKHVybCwgcGFyc2UpO1xcXFxuICAgICAgaWYgKHR5cGVvZiByZXMgPT09IFxcXFxcXFwic3RyaW5nXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgICBzdGF0dXNDb2RlOiAzMDIsXFxcXG4gICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgXFxcXFxcXCJMb2NhdGlvblxcXFxcXFwiOiByZXNcXFxcbiAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgfSBlbHNlIGlmICgkLnR5cGUocmVzKSA9PT0gXFxcXFxcXCJvYmplY3RcXFxcXFxcIikge1xcXFxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xcXFxuICAgICAgICAgIHN0YXR1c0NvZGU6IDMwMixcXFxcbiAgICAgICAgICBoZWFkZXJzOiByZXNcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICB9XFxcXG4gICAgfVxcXFxuICB9IGNhdGNoIChlKSB7XFxcXG4gICAgbG9nKGUudG9TdHJpbmcoKSk7XFxcXG4gIH1cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gcHJlcGFyZVBhcnNlcyhwYXJzZXMsIHVybCwgcGxheWxpc3QsIGlzVGVzdCkge1xcXFxuICBwbGF5bGlzdCA9IHBsYXlsaXN0IHx8IHtcXFxcbiAgICB1cmxzOiBbXSxcXFxcbiAgICBuYW1lczogW10sXFxcXG4gICAgaGVhZGVyczogW10sXFxcXG4gICAgaXM6IFxcXFxcXFwiI2lzVmlkZW89dHJ1ZSNcXFxcXFxcIixcXFxcbiAgfTtcXFxcbiAgbGV0IHByb3h5VXJsID0gc3RhcnRQcm94eVNlcnZlcigkLnRvU3RyaW5nKHByb3h5LCBNWV9SVUxFLnRpdGxlKSk7XFxcXG4gIHBhcnNlcy5mb3JFYWNoKCh2LCBpKSA9PiB7XFxcXG4gICAgaWYgKHYuZm9yYmlkZGVuKSByZXR1cm47XFxcXG4gICAgcGxheWxpc3QubmFtZXMucHVzaCh2Lm5hbWUpO1xcXFxuICAgIGlmICh2LmhlYWRlcnMpIHtcXFxcbiAgICAgIHBsYXlsaXN0LmhlYWRlcnMucHVzaCh2LmhlYWRlcnMpO1xcXFxuICAgIH1cXFxcbiAgICBpZiAodi5ydW5UeXBlID09PSBcXFxcXFxcIkpTT05cXFxcXFxcIikge1xcXFxuICAgICAgbGV0IHBhcmFtID0ge1xcXFxuICAgICAgICAvL3VybDogdi51cmwsXFxcXG4gICAgICAgIG1ldGhvZDogdi5tZXRob2QsXFxcXG4gICAgICAgIGhlYWRlcnM6IHYuaGVhZGVycyxcXFxcbiAgICAgICAganNvblBhdGg6IHYuanNvblBhdGhcXFxcbiAgICAgIH07XFxcXG4gICAgICBwbGF5bGlzdC51cmxzLnB1c2gocHJveHlVcmwgKyBcXFxcXFxcIj9ydW5UeXBlPUpTT04mdXJsPVxcXFxcXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZSh2LnVybCArIHVybCkpICsgXFxcXFxcXCImcGFyYW09XFxcXFxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHBhcmFtKSkpKTtcXFxcbiAgICB9IGVsc2UgaWYgKHYucnVuVHlwZSA9PT0gXFxcXFxcXCJKU1xcXFxcXFwiKSB7XFxcXG4gICAgICBwbGF5bGlzdC51cmxzLnB1c2gocHJveHlVcmwgKyBcXFxcXFxcIj9ydW5UeXBlPUpTJnVybD1cXFxcXFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChiYXNlNjRFbmNvZGUodXJsKSkgKyAoaXNUZXN0ID8gXFxcXFxcXCImcGFyYW09XFxcXFxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHYpKSkgOiBcXFxcXFxcIiZpbmRleD1cXFxcXFxcIiArIGkpKTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgcGxheWxpc3QudXJscy5wdXNoKFxcXFxcXFwidmlkZW86Ly9cXFxcXFxcIiArIHYudXJsICsgdXJsKTtcXFxcbiAgICB9XFxcXG4gIH0pO1xcXFxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGxheWxpc3QpO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiB1c2VQYXJzZXModXJsKSB7XFxcXG4gIGxldCBwYXJzZXMgPSAkLnJlcXVpcmUoXFxcXFxcXCJjb25maWdzXFxcXFxcXCIpLmdldEpzb24oKTtcXFxcbiAgaWYgKCFwYXJzZXMubGVuZ3RoKSByZXR1cm4gXFxcXFxcXCJ3ZWI6Ly9cXFxcXFxcIiArIHVybDtcXFxcbiAgbGV0IHBsYXlsaXN0ID0ge1xcXFxuICAgIHVybHM6IFtdLFxcXFxuICAgIG5hbWVzOiBbXSxcXFxcbiAgICBoZWFkZXJzOiBbXSxcXFxcbiAgICBpczogXFxcXFxcXCIjaXNWaWRlbz10cnVlI1xcXFxcXFwiLFxcXFxuICB9O1xcXFxuICB0cnkge1xcXFxuICAgIGxldCB1c2VEYW5tdSA9ICEhZ2V0SXRlbShcXFxcXFxcInVzZURhbm11XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgIGlmICh1c2VEYW5tdSkge1xcXFxuICAgICAgcGxheWxpc3QuZGFubXUgPSAkLnJlcXVpcmUoJ2RtRnVuP3J1bGU9ZG3nm5LlrZAnKS5kbVJvdXRlKHVybCk7XFxcXG4gICAgfVxcXFxuICB9IGNhdGNoIHsgfVxcXFxuICByZXR1cm4gcHJlcGFyZVBhcnNlcyhwYXJzZXMsIHVybCwgcGxheWxpc3QpO1xcXFxufVxcXFxuJC5leHBvcnRzLnBhcnNlID0gZnVuY3Rpb24gKGlucHV0LCBpZCwgc291cmNlKSB7XFxcXG4gIGxldCBkcnB5ID0gR00uZGVmaW5lTW9kdWxlKFxcXFxcXFwiRHJweU1hbmFnZVxcXFxcXFwiKS5nZXRCeVNvdXJjZShzb3VyY2UpO1xcXFxuICBpbnB1dCA9IGlucHV0LnNwbGl0KFxcXFxcXFwiI1xcXFxcXFwiKTtcXFxcbiAgbGV0IHBsYXkgPSBKU09OLnBhcnNlKGRycHkucGxheShpbnB1dFsxXSwgaW5wdXRbMF0ucmVwbGFjZShcXFxcXFxcInR2Ym94LXhnOlxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSwgW10pKTtcXFxcbiAgLy8gbG9nKHBsYXkpXFxcXG4gIC8vIGxvZyhpZClcXFxcbiAgLy9sb2cocGxheSlcXFxcbiAgZnVuY3Rpb24gcGFyc2VRdWVyeShxdWVyeSkge1xcXFxuICAgIHZhciBvYmogPSB7fTtcXFxcbiAgICBxdWVyeS5zcGxpdChcXFxcXFxcIiZcXFxcXFxcIikuZmlsdGVyKGUgPT4gZSkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xcXFxuICAgICAgdmFyIHBhcnRzID0gaXRlbS5zcGxpdChcXFxcXFxcIj1cXFxcXFxcIik7XFxcXG4gICAgICBvYmpbcGFydHNbMF1dID0gcGFydHNbMV07XFxcXG4gICAgfSk7XFxcXG4gICAgcmV0dXJuIG9iajtcXFxcbiAgfVxcXFxuICB2YXIgZXh0cmEgPSB7XFxcXG4gICAgXFxcXFxcXCJ1YVxcXFxcXFwiOiBNT0JJTEVfVUFcXFxcbiAgfVxcXFxuICBsZXQgcGFyc2UgPSBwbGF5O1xcXFxuICBsZXQgcGFyc2Vfb2JqID0ge1xcXFxuICAgIGRlZlJ1bGVzOiBbXFxcXFxcXCIqLm1wNFxcXFxcXFwiLCBcXFxcXFxcIioubTN1OFxcXFxcXFwiXSxcXFxcbiAgfTtcXFxcbiAgaWYgKHBhcnNlLmhhc093blByb3BlcnR5KFxcXFxcXFwicGFyc2VfZXh0cmFcXFxcXFxcIikpIHtcXFxcbiAgICBsZXQgcGFyc2VfZXh0cmEgPSBkZWNvZGVVUklDb21wb25lbnQocGFyc2UucGFyc2VfZXh0cmEpO1xcXFxuICAgIHBhcnNlX29iaiA9IE9iamVjdC5hc3NpZ24ocGFyc2Vfb2JqLCBwYXJzZVF1ZXJ5KHBhcnNlX2V4dHJhKSk7XFxcXG4gICAgaWYgKHBhcnNlX29iai5oYXNPd25Qcm9wZXJ0eShcXFxcXFxcImluaXRfc2NyaXB0XFxcXFxcXCIpKSB7XFxcXG4gICAgICBwYXJzZV9vYmpbXFxcXFxcXCJpbml0X3NjcmlwdFxcXFxcXFwiXSA9IGJhc2U2NERlY29kZShwYXJzZV9vYmpbXFxcXFxcXCJpbml0X3NjcmlwdFxcXFxcXFwiXSk7XFxcXG4gICAgfVxcXFxuICB9XFxcXG4gIGlmIChwYXJzZV9vYmouaGFzT3duUHJvcGVydHkoXFxcXFxcXCJpc19wY1xcXFxcXFwiKSAmJiBwYXJzZV9vYmpbXFxcXFxcXCJpc19wY1xcXFxcXFwiXSA9PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgIGV4dHJhW1xcXFxcXFwidWFcXFxcXFxcIl0gPSBQQ19VQTtcXFxcbiAgfVxcXFxuICBpZiAocGFyc2UuaGFzT3duUHJvcGVydHkoXFxcXFxcXCJoZWFkZXJcXFxcXFxcIikpIHtcXFxcbiAgICBleHRyYVtcXFxcXFxcInVhXFxcXFxcXCJdID0gcGFyc2VbXFxcXFxcXCJoZWFkZXJcXFxcXFxcIl1bXFxcXFxcXCJVc2VyLUFnZW50XFxcXFxcXCJdO1xcXFxuICAgIC8vZXh0cmFbXFxcXFxcXCJyZWRpcmVjdFxcXFxcXFwiXT1mYWxzZTtcXFxcbiAgICAvKmV4dHJhW1xcXFxcXFwianNcXFxcXFxcIl0gPSAkLnRvU3RyaW5nKChqcykgPT4ge1xcXFxuICAgICAgZXZhbChqcylcXFxcbiAgICAgIGZiYS5sb2cobmF2aWdhdG9yLnVzZXJBZ2VudClcXFxcbiAgICAgIGZiYS5sb2cobG9jYXRpb24uaHJlZilcXFxcbiAgICB9LCAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuYXZpZ2F0b3IsICd1c2VyQWdlbnQnLCB7XFxcXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xcXFxuICAgICAgICAgIHJldHVybiAnTXktQ3VzdG9tLVVBLVN0cmluZyc7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgIH0pO1xcXFxuICAgIH0pKSovXFxcXG4gIH1cXFxcbiAgaWYgKHBhcnNlX29iai5oYXNPd25Qcm9wZXJ0eShcXFxcXFxcImN1c3RvbV9yZWdleFxcXFxcXFwiKSkge1xcXFxuICAgIGxldCBjdXJyZW50ID0gcGFyc2Vfb2JqW1xcXFxcXFwiZGVmUnVsZXNcXFxcXFxcIl07XFxcXG4gICAgZXh0cmFbXFxcXFxcXCJ2aWRlb1J1bGVzXFxcXFxcXCJdID0gY3VycmVudC5jb25jYXQocGFyc2Vfb2JqLmN1c3RvbV9yZWdleC5zcGxpdCgvXFxcXFxcXFx8L2cpLmZpbHRlcihlID0+IGUpKVxcXFxuICB9XFxcXG4gIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFxcXFxcImpzXFxcXFxcXCIpICYmIHBhcnNlLmpzICE9IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICBleHRyYVtcXFxcXFxcImpzXFxcXFxcXCJdID0gJC50b1N0cmluZygoanMsIHBhcnNlLCB0KSA9PiB7XFxcXG4gICAgICBpZiAocGFyc2UuaGFzT3duUHJvcGVydHkoXFxcXFxcXCJpbml0X3NjcmlwdFxcXFxcXFwiKSkge1xcXFxuICAgICAgICBmYmEubG9nKHQgKyBcXFxcXFxcIjrmiafooYxpbml0X3NjcmlwdFxcXFxcXFwiKTtcXFxcbiAgICAgICAgZXZhbChwYXJzZS5pbml0X3NjcmlwdCk7XFxcXG4gICAgICB9XFxcXG4gICAgICBmYmEubG9nKG5hdmlnYXRvci5wbGF0Zm9ybSk7XFxcXG4gICAgICBmYmEubG9nKHQgKyBcXFxcXFxcIjrmiafooYxqc+eCueWHu1xcXFxcXFwiKVxcXFxuICAgICAgZXZhbChqcylcXFxcbiAgICB9LCBwYXJzZS5qcywgcGFyc2Vfb2JqLCBNWV9SVUxFLnRpdGxlKVxcXFxuICB9XFxcXG4gIHRyeSB7XFxcXG4gICAgbGV0IGl0ZW0gPSBmaW5kSXRlbShpZCk7XFxcXG4gICAgdXBkYXRlSXRlbShpZCwge1xcXFxuICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0uZXh0cmEsIGV4dHJhKVxcXFxuICAgIH0pXFxcXG4gIH0gY2F0Y2ggKGUpIHsgfVxcXFxuICBpZiAocGxheS51cmwuaW5jbHVkZXMoXFxcXFxcXCJwcm94eT9kb1xcXFxcXFwiKSkge1xcXFxuICAgIE1ZX1VSTCA9IHBsYXkudXJsO1xcXFxuICAgIHBsYXkudXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXFxcXFwidXJsXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpKTtcXFxcbiAgfVxcXFxuICBpZiAocGxheS51cmwuc3RhcnRzV2l0aChcXFxcXFxcInB1c2g6Ly9cXFxcXFxcIikpIHtcXFxcbiAgICBwbGF5LnVybCA9IHBsYXkudXJsLnJlcGxhY2UoXFxcXFxcXCJwdXNoOi8vXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICB9XFxcXG4gIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXFxcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY24vXFxcXFxcXCIpKSB7XFxcXG4gICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3F1YXJrTGlzdD9ydWxlPVF1YXJrLueugCZyZWFsdXJsPVxcXFxcXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBsYXkudXJsKSArIFxcXFxcXFwiJnNoYXJlUHdkPVxcXFxcXFwiO1xcXFxuICB9XFxcXG4gIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKCdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy8nKSB8fCBwbGF5LnVybC5zdGFydHNXaXRoKFxcXFxcXFwiaHR0cHM6Ly93d3cuYWxpcGFuLmNvbS9zL1xcXFxcXFwiKSkge1xcXFxuICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vcGFnZS9hbGl5dW4/cnVsZT3kupHnm5jlkJsu566AJnBhZ2U9ZnlwYWdlJnJlYWx1cmw9XFxcXFxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQocGxheS51cmwpO1xcXFxuICB9XFxcXG4gIGlmIChwbGF5LnBhcnNlID09PSAxKSB7XFxcXG4gICAgaWYgKHBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcXFxcXCJtYWduZXQ6XFxcXFxcXCIpKSB7XFxcXG4gICAgICByZXR1cm4gcGxheS51cmw7XFxcXG4gICAgfVxcXFxuICAgIGlmIChpc29mZmljaWFsKHBsYXkudXJsKSAmJiAocGxheS5mbGFnIHx8IGlucHV0WzFdKSkge1xcXFxuICAgICAgcmV0dXJuIHVzZVBhcnNlcyhwbGF5LnVybCk7XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBcXFxcXFxcInZpZGVvOi8vXFxcXFxcXCIgKyBwbGF5LnVybDtcXFxcbiAgfSBlbHNlIGlmIChwbGF5LnBhcnNlID09PSAwKSB7XFxcXG4gICAgaWYgKHBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcXFxcXCJtYWduZXQ6XFxcXFxcXCIpKSB7XFxcXG4gICAgICByZXR1cm4gcGxheS51cmw7XFxcXG4gICAgfVxcXFxuICAgIC8vbG9nKHBsYXkpXFxcXG4gICAgdmFyIHBsYXlvYmogPSB7fTtcXFxcbiAgICBwbGF5b2JqLnVybHMgPSBbcGxheS51cmwgKyBcXFxcXFxcIiNpc1ZpZGVvPXRydWUjXFxcXFxcXCJdO1xcXFxuICAgIGlmIChwbGF5Lmhhc093blByb3BlcnR5KFxcXFxcXFwiaGVhZGVyXFxcXFxcXCIpKSB7XFxcXG4gICAgICBwbGF5b2JqW1xcXFxcXFwiaGVhZGVyc1xcXFxcXFwiXSA9IHBsYXkuaGVhZGVyO1xcXFxuICAgIH1cXFxcbiAgICBpZiAocGxheS5oYXNPd25Qcm9wZXJ0eShcXFxcXFxcImRhbm1ha3VcXFxcXFxcIikpIHtcXFxcbiAgICAgIHBsYXlvYmpbXFxcXFxcXCJkYW5tdVxcXFxcXFwiXSA9IHBsYXkuZGFubWFrdTtcXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlvYmopO1xcXFxuICB9IGVsc2Uge1xcXFxuICAgIHJldHVybiBwbGF5LnVybDtcXFxcbiAgfVxcXFxufVxcXFxuJC5leHBvcnRzLnByZXBhcmVQYXJzZXMgPSBwcmVwYXJlUGFyc2VzO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuWIm+W7uuiuoumYhVxcXCIsXFxcInBhdGhcXFwiOlxcXCJjcmVhdGVTdWJzY3JpcHRpb25cXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLliJvlu7rorqLpmIVcXFxcXFxcIik7XFxcXG5sZXQgbGF5b3V0ID0gW107XFxcXG5sZXQgZiA9ICQucmVxdWlyZShcXFxcXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFxcXFxcIik7XFxcXG5hZGRMaXN0ZW5lcihcXFxcXFxcIm9uQ2xvc2VcXFxcXFxcIiwgKCkgPT4ge1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJkcnB5SGlrZXJfc3ViX2lucHV0XFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJkcnB5SGlrZXJfc3VidXJsX2lucHV0XFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJkcnB5SGlrZXJfc3VibmFtZV9pbnB1dFxcXFxcXFwiKTtcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLorqLpmIXlkI3np7BcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiZHJweUhpa2VyX3N1Ym5hbWVfaW5wdXRcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBpZDogXFxcXFxcXCJkcnB5SGlrZXJfc3VibmFtZV9pbnB1dFxcXFxcXFwiXFxcXG4gICAgfVxcXFxufSk7XFxcXG5sZXQgcGF0aCA9IGpvaW5VcmwoZ2V0UGF0aChcXFxcXFxcImhpa2VyOi8vZmlsZXMvXFxcXFxcXCIpLCBcXFxcXFxcIi4uL1xcXFxcXFwiLnJlcGVhdCg1KSkuc2xpY2UoNyk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi6YCJ5oupXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBKU09OLnN0cmluZ2lmeShmLmZpbGVTZWxlY3Rpb25Vcmkoe1xcXFxuICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oXFxcXFxcXCJkcnB5SGlrZXJfc3ViX2lucHV0XFxcXFxcXCIpLmV4dHJhO1xcXFxuICAgICAgICAgICAgdXBkYXRlSXRlbShcXFxcXFxcImRycHlIaWtlcl9zdWJfaW5wdXRcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHRhcmdldCwge1xcXFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXFxcbiAgICAgICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcXFxuICAgICAgICBpbml0aWFsUGF0aDogcGF0aCxcXFxcbiAgICAgICAgcGF0dGVybjogMVxcXFxuICAgIH0pKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi5YKo5a2Y6Lev5b6EXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcImRycHlIaWtlcl9zdWJfaW5wdXRcXFxcXFxcIiwgaW5wdXQpO1xcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgaWQ6IFxcXFxcXFwiZHJweUhpa2VyX3N1Yl9pbnB1dFxcXFxcXFwiXFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi6K6i6ZiF5Zyw5Z2AXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcImRycHlIaWtlcl9zdWJ1cmxfaW5wdXRcXFxcXFxcIiwgaW5wdXQpO1xcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgaWQ6IFxcXFxcXFwiZHJweUhpa2VyX3N1YnVybF9pbnB1dFxcXFxcXFwiXFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuehruiupFxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChpZCkgPT4ge1xcXFxuICAgICAgICBsZXQgcGF0aCA9IGdldE15VmFyKFxcXFxcXFwiZHJweUhpa2VyX3N1Yl9pbnB1dFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IHVybCA9IGdldE15VmFyKFxcXFxcXFwiZHJweUhpa2VyX3N1YnVybF9pbnB1dFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IG5hbWUgPSBnZXRNeVZhcihcXFxcXFxcImRycHlIaWtlcl9zdWJuYW1lX2lucHV0XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoIShwYXRoICYmIHVybCAmJiBuYW1lKSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kuI3lj6/kuLrnqbpcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgcnVsZSA9IGJhc2U2NEVuY29kZShcXFxcXFxcIua1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8muWQiOmbhuinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lXFxcXFxcXCIgKyBuYW1lICsgXFxcXFxcXCJAQFxcXFxcXFwiICsgdXJsK2BAanM9JC5yZXF1aXJlKCdzdWJzY3JpYmU/cnVsZT0ke01ZX1JVTEUudGl0bGV9JykucGFyc2VVcmwoaW5wdXQsICcke2Jhc2U2NEVuY29kZShwYXRoKX0nKWApO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJydWxlOi8vXFxcXFxcXCIgKyBydWxlO1xcXFxuICAgIH0pLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbn0pO1xcXFxuc2V0UmVzdWx0KGxheW91dCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi6Kej5p6Q6K6i6ZiFXFxcIixcXFwicGF0aFxcXCI6XFxcInN1YnNjcmliZVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmZ1bmN0aW9uIGdlbmVyYXRlQ29uZmlnQnlHaXRodWIodXJsLCBwYXRoKSB7XFxcXG4gICAgbGV0IHJvcGUgPSB1cmwuc3BsaXQoXFxcXFxcXCIvXFxcXFxcXCIpLnNsaWNlKDMsIDUpLmpvaW4oXFxcXFxcXCIvXFxcXFxcXCIpO1xcXFxuICAgIGxldCBodG1sID0gZmV0Y2godXJsKTtcXFxcbiAgICBcXFxcbiAgICBsZXQganNvblRleHQgPSBwZGZoKGh0bWwsIFxcXFxcXFwiI3JlcG8tY29udGVudC1wamF4LWNvbnRhaW5lciYmc2NyaXB0JiZIdG1sXFxcXFxcXCIpO1xcXFxuICAgIFxcXFxuICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XFxcXG4gICAgbGV0IGxpc3QgPSBqc29uLnBheWxvYWQudHJlZS5pdGVtcztcXFxcbiAgICBsZXQgcnVsZXMgPSBbXTtcXFxcbiAgICBsZXQgY291bnQgPSAwO1xcXFxuICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCBuYW1lID0gaXQubmFtZTtcXFxcbiAgICAgICAgICAgIGxldCBzcGF0aCA9IGl0LnBhdGg7XFxcXG4gICAgICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXFxcXFxcXCIuanNcXFxcXFxcIikpIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sYXN0SW5kZXhPZihcXFxcXFxcIi5cXFxcXFxcIikpO1xcXFxuICAgICAgICAgICAgbGV0IHJ1bGUgPSBmZXRjaChgaHR0cHM6Ly9yYXcuZ2l0bWlycm9yLmNvbS8ke3JvcGV9L21hc3Rlci8ke3NwYXRofWApO1xcXFxuICAgICAgICAgICAgaWYgKCEoKCFydWxlIHx8ICFydWxlLmluY2x1ZGVzKFxcXFxcXFwicnVsZVxcXFxcXFwiKSkgJiYgIWZpbGVFeGlzdChwYXRoICsgaXQubmFtZSkpKSB7XFxcXG4gICAgICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGggKyBpdC5uYW1lLCBydWxlKTtcXFxcbiAgICAgICAgICAgICAgICBydWxlcy5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgJ2tleSc6IGBoaXB5X2pzXyR7bmFtZX1gLFxcXFxuICAgICAgICAgICAgICAgICAgICAnbmFtZSc6IGAke25hbWV9YCxcXFxcbiAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAzLFxcXFxuICAgICAgICAgICAgICAgICAgICAnYXBpJzonLi4vbGlicy9kcnB5Mi5qcycsXFxcXG4gICAgICAgICAgICAgICAgICAgICdzZWFyY2hhYmxlJzogMSxcXFxcbiAgICAgICAgICAgICAgICAgICAgJ3F1aWNrU2VhcmNoJzogMSxcXFxcbiAgICAgICAgICAgICAgICAgICAgJ2ZpbHRlcmFibGUnOiAxLFxcXFxuICAgICAgICAgICAgICAgICAgICAnZXh0JzogXFxcXFxcXCIuL1xcXFxcXFwiICsgaXQubmFtZSxcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICB3cml0ZUZpbGUocGF0aCArIFxcXFxcXFwiaW5kZXguanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeSh7c2l0ZXM6cnVsZXN9KSk7XFxcXG4gICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/miJDlip/mm7TmlrBcXFxcXFxcIiArIGNvdW50ICsgXFxcXFxcXCLkuKpcXFxcXFxcIjs7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdlbmVyYXRlQ29uZmlnQnlJbmRleCh1cmwsIHBhdGgpIHtcXFxcbiAgICBsZXQganNvbiA9IEpTT04ucGFyc2UodG9Db3JyZWN0SlNPTlN0cmluZyhyZXF1ZXN0KHVybCkpKTtcXFxcbiAgICBsZXQgYXJyID0ganNvbi5zaXRlcztcXFxcbiAgICBsZXQgY291bnQgPSAwO1xcXFxuICAgIGxldCBpID0gMDtcXFxcbiAgICBmb3IgKGxldCBpdCBvZiBhcnIpIHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGlmICgoU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcXFxcXCJkcnB5Mi5taW4uanNcXFxcXFxcIikgfHwgU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcXFxcXCJkcnB5Mi5qc1xcXFxcXFwiKSkpIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGl0LmV4dC5lbmRzV2l0aChcXFxcXFxcIi5qc1xcXFxcXFwiKSA/IGRlY29kZVVSSUNvbXBvbmVudChpdC5leHQuc3BsaXQoXFxcXFxcXCIvXFxcXFxcXCIpLmF0KC0xKSkgOiAoaXQubmFtZSArIFxcXFxcXFwiLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGxldCBydWxlO1xcXFxuICAgICAgICAgICAgICAgIGlmIChTdHJpbmcoaXQuZXh0KS5zdGFydHNXaXRoKFxcXFxcXFwiaHR0cFxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBydWxlID0gcmVxdWVzdChpdC5leHQpO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGUgPSByZXF1ZXN0KGpvaW5VcmwodXJsLCBpdC5leHQpKTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgaXQuZXh0ID0gXFxcXFxcXCIuL1xcXFxcXFwiICsgbmFtZTtcXFxcbiAgICAgICAgICAgICAgICBpZiAoIXJ1bGUgfHwgIXJ1bGUuaW5jbHVkZXMoXFxcXFxcXCJydWxlXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmICghZmlsZUV4aXN0KHBhdGggKyBuYW1lKSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoaSwgMSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgICAgIH07XFxcXG4gICAgICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGggKyBuYW1lLCBydWxlKTtcXFxcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpKys7XFxcXG4gICAgfVxcXFxuICAgIHdyaXRlRmlsZShwYXRoICsgXFxcXFxcXCJpbmRleC5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXFxcbiAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+aIkOWKn+abtOaWsFxcXFxcXFwiICsgY291bnQgKyBcXFxcXFxcIuS4qlxcXFxcXFwiO1xcXFxufVxcXFxuJC5leHBvcnRzLnBhcnNlVXJsID0gZnVuY3Rpb24odXJsLCBwYXRoKSB7XFxcXG4gICAgcGF0aCA9IGJhc2U2NERlY29kZShwYXRoKTtcXFxcbiAgICBwYXRoID0gcGF0aC5lbmRzV2l0aChcXFxcXFxcIi9cXFxcXFxcIikgPyBwYXRoIDogcGF0aCArIFxcXFxcXFwiL1xcXFxcXFwiO1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aChcXFxcXFxcImh0dHBzOi8vZ2l0aHViLmNvbS9oamRobngvXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWdCeUdpdGh1Yih1cmwsIHBhdGgpO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnQnlJbmRleCh1cmwsIHBhdGgpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiZXJyb3I6XFxcXFxcXCIgKyBlLnRvU3RyaW5nKCk7XFxcXG4gICAgfVxcXFxufTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLov5DooYzml7bphY3nva7nrqHnkIZcXFwiLFxcXCJwYXRoXFxcIjpcXFwicnVudGltZUNvbmZpZ1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmNvbnN0IHNlYXJjaEFsbG93UGF0aCA9IFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9Mb3lEZ0lrL0RycHlIaWtlci9zZWFyY2hBbGxvdy5qc29uXFxcXFxcXCI7XFxcXG5sZXQgaXNQcmVwYXJlID0gZmFsc2U7XFxcXG5sZXQgY29uZmlncywgY3VycmVudENvbmZpZyA9IHt9LFxcXFxuICAgIHNvdXJjZUxpc3QsIGN1cnJlbnRTb3VyY2UsIHNlYXJjaEFsbG93ID0gW107XFxcXG5cXFxcbmZ1bmN0aW9uIGluaXQoY29uZmlnKSB7XFxcXG4gICAgaWYgKCFjb25maWcpIHJldHVybiBudWxsO1xcXFxuICAgIGlmICghY29uZmlnLnBhdGgpIHJldHVybiBudWxsO1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIGxldCBmaWxlO1xcXFxuICAgICAgICBsZXQgc291cmNlTGlzdCA9IFtdO1xcXFxuICAgICAgICBpZiAoY29uZmlnLnBhdGguc3RhcnRzV2l0aChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIikgJiYgKGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGNvbmZpZy5wYXRoLnJlcGxhY2UoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpKSkuaXNEaXJlY3RvcnkoKSkge1xcXFxuICAgICAgICAgICAgc291cmNlTGlzdCA9IGdlbmVyYXRlQ29uZmlnQnlMb2NhbChmaWxlKTtcXFxcbiAgICAgICAgICAgIGNvbmZpZy50eXBlID0gXFxcXFxcXCJsb2NhbERpclxcXFxcXFwiO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5wYXRoLnN0YXJ0c1dpdGgoXFxcXFxcXCJodHRwczovL2dpdGh1Yi5jb21cXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgIHNvdXJjZUxpc3QgPSBnZW5lcmF0ZUNvbmZpZ0J5R2l0aHViKGNvbmZpZy5wYXRoKTtcXFxcbiAgICAgICAgICAgIGNvbmZpZy50eXBlID0gXFxcXFxcXCJnaXRodWJEaXJcXFxcXFxcIjtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZSh0b0NvcnJlY3RKU09OU3RyaW5nKGZldGNoKGNvbmZpZy5wYXRoKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpKTtcXFxcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShqc29uLnNpdGVzKSB8fCAhanNvbi5zaXRlcy5sZW5ndGgpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHNvdXJjZUxpc3QgPSBmaWx0ZXJPdGhlcihqc29uLnNpdGVzKTtcXFxcbiAgICAgICAgICAgIGNvbmZpZy50eXBlID0gXFxcXFxcXCJpbmRleFxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGZpbGUgPSB2b2lkIDA7XFxcXG4gICAgICAgIGxldCBjdXJyZW50U291cmNlLCBzZWFyY2hBbGxvdztcXFxcbiAgICAgICAgaWYgKGNvbmZpZy5jS2V5KSB7XFxcXG4gICAgICAgICAgICBjdXJyZW50U291cmNlID0gc291cmNlTGlzdC5maW5kKHYgPT4gdi5rZXkgPT09IGNvbmZpZy5jS2V5KTtcXFxcbiAgICAgICAgICAgIGlmICghY3VycmVudFNvdXJjZSkge1xcXFxuICAgICAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2VMaXN0WzBdO1xcXFxuICAgICAgICAgICAgICAgIC8vY3VycmVudENvbmZpZy5jS2V5ID0gc291cmNlTGlzdFswXS5rZXk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBjdXJyZW50U291cmNlID0gc291cmNlTGlzdFswXTtcXFxcbiAgICAgICAgICAgIC8vY29uZmlnLmNLZXkgPSBzb3VyY2VMaXN0WzBdLmtleTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgc2VhcmNoQWxsb3cgPSBKU09OLnBhcnNlKGZldGNoKHNlYXJjaEFsbG93UGF0aCkgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgZGVsZXRlRmlsZShzZWFyY2hBbGxvd1BhdGgpO1xcXFxuICAgICAgICAgICAgc2VhcmNoQWxsb3cgPSBbXTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4ge1xcXFxuICAgICAgICAgICAgY3VycmVudFNvdXJjZSxcXFxcbiAgICAgICAgICAgIHNlYXJjaEFsbG93LFxcXFxuICAgICAgICAgICAgc291cmNlTGlzdFxcXFxuICAgICAgICB9O1xcXFxuICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBudWxsO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZW5lcmF0ZUNvbmZpZ0J5TG9jYWwoZGlyRmlsZSkge1xcXFxuICAgIGxldCBsaXN0ID0gZGlyRmlsZS5saXN0RmlsZXMoKTtcXFxcbiAgICBsZXQgcnVsZXMgPSBbXTtcXFxcbiAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XFxcXG4gICAgICAgIGxldCBuYW1lID0gU3RyaW5nKGl0LmdldE5hbWUoKSk7XFxcXG4gICAgICAgIGxldCBwYXRoID0gaXQuZ2V0UGF0aCgpO1xcXFxuICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXFxcXFxcXCIuanNcXFxcXFxcIikgfHwgaXQuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XFxcXG4gICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoXFxcXFxcXCIuXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgcnVsZXMucHVzaCh7XFxcXG4gICAgICAgICAgICAna2V5JzogYGhpcHlfanNfJHtuYW1lfWAsXFxcXG4gICAgICAgICAgICAnbmFtZSc6IGAke25hbWV9YCxcXFxcbiAgICAgICAgICAgICd0eXBlJzogMyxcXFxcbiAgICAgICAgICAgICdzZWFyY2hhYmxlJzogMSxcXFxcbiAgICAgICAgICAgICdxdWlja1NlYXJjaCc6IDEsXFxcXG4gICAgICAgICAgICAnZmlsdGVyYWJsZSc6IDEsXFxcXG4gICAgICAgICAgICAnZXh0JzogYCR7cGF0aH1gLFxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIHJ1bGVzO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZW5lcmF0ZUNvbmZpZ0J5R2l0aHViKHVybCkge1xcXFxuICAgIC8vdXJsPXVybC5yZXBsYWNlKC8oI0dJVEhVQiMpJC8sXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgbGV0IHJvcGUgPSB1cmwuc3BsaXQoXFxcXFxcXCIvXFxcXFxcXCIpLnNsaWNlKDMsIDUpLmpvaW4oXFxcXFxcXCIvXFxcXFxcXCIpO1xcXFxuICAgIGxldCBodG1sID0gZmV0Y2godXJsKTtcXFxcbiAgICBsZXQganNvblRleHQgPSBwZGZoKGh0bWwsIFxcXFxcXFwiI3JlcG8tY29udGVudC1wamF4LWNvbnRhaW5lciYmc2NyaXB0JiZIdG1sXFxcXFxcXCIpO1xcXFxuICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XFxcXG4gICAgbGV0IGxpc3QgPSBqc29uLnBheWxvYWQudHJlZS5pdGVtcztcXFxcbiAgICBsZXQgcnVsZXMgPSBbXTtcXFxcbiAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XFxcXG4gICAgICAgIGxldCBuYW1lID0gaXQubmFtZTtcXFxcbiAgICAgICAgbGV0IHBhdGggPSBpdC5wYXRoO1xcXFxuICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXFxcXFxcXCIuanNcXFxcXFxcIikpIGNvbnRpbnVlO1xcXFxuICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKFxcXFxcXFwiLlxcXFxcXFwiKSk7XFxcXG4gICAgICAgIHJ1bGVzLnB1c2goe1xcXFxuICAgICAgICAgICAgJ2tleSc6IGBoaXB5X2pzXyR7bmFtZX1gLFxcXFxuICAgICAgICAgICAgJ25hbWUnOiBgJHtuYW1lfWAsXFxcXG4gICAgICAgICAgICAndHlwZSc6IDMsXFxcXG4gICAgICAgICAgICAnc2VhcmNoYWJsZSc6IDEsXFxcXG4gICAgICAgICAgICAncXVpY2tTZWFyY2gnOiAxLFxcXFxuICAgICAgICAgICAgJ2ZpbHRlcmFibGUnOiAxLFxcXFxuICAgICAgICAgICAgJ2V4dCc6IGBodHRwczovL3Jhdy5naXRtaXJyb3IuY29tLyR7cm9wZX0vbWFzdGVyLyR7cGF0aH1gLFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgLypcXFxcbiAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2hqZGhueC9oaXB5LXNlcnZlci90cmVlL21hc3Rlci9hcHAvdDQvZmlsZXMvZHJweV9qc1xcXFxuICAgICAgICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vaGpkaG54L2hpcHktc2VydmVyL21hc3Rlci9hcHAvdDQvZmlsZXMvZHJweV9qcy8zNjAlRTUlQkQlQjElRTglQTclODYlNUIlRTUlQUUlOTglNUQuanMqL1xcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gcnVsZXM7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHByZXBhcmUoY29uZmlnKSB7XFxcXG4gICAgbGV0IGRhdGEgPSBpbml0KGNvbmZpZyk7XFxcXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gZmFsc2U7XFxcXG4gICAgY3VycmVudFNvdXJjZSA9IGRhdGEuY3VycmVudFNvdXJjZTtcXFxcbiAgICBzZWFyY2hBbGxvdyA9IGRhdGEuc2VhcmNoQWxsb3c7XFxcXG4gICAgc291cmNlTGlzdCA9IGRhdGEuc291cmNlTGlzdDtcXFxcbiAgICBjdXJyZW50Q29uZmlnID0gY29uZmlnO1xcXFxuICAgIHJldHVybiB0cnVlO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBmaWx0ZXJPdGhlcihsaXN0KSB7XFxcXG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKGl0ID0+IFN0cmluZyhpdC5hcGkpLmluY2x1ZGVzKFxcXFxcXFwiZHJweTIubWluLmpzXFxcXFxcXCIpIHx8IFN0cmluZyhpdC5hcGkpLmluY2x1ZGVzKFxcXFxcXFwiZHJweTIuanNcXFxcXFxcIikpXFxcXG59XFxcXG5cXFxcblxcXFxuZnVuY3Rpb24gZ2V0Q3VycmVudENvbmZpZygpIHtcXFxcbiAgICByZXR1cm4gY3VycmVudENvbmZpZyB8fCB7fTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gc2V0Q3VycmVudENvbmZpZyhjb25maWcpIHtcXFxcbiAgICBsZXQgY3BhdGggPSAoY3VycmVudENvbmZpZyB8fCB7fSkucGF0aDtcXFxcbiAgICBpZiAocHJlcGFyZShjb25maWcpKSB7XFxcXG4gICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcXFxcXCJjdXJyZW50Q29uZmlnXFxcXFxcXCIsIGNvbmZpZyk7XFxcXG4gICAgICAgIGlmIChjcGF0aCAhPSBjb25maWcucGF0aCkge1xcXFxuICAgICAgICAgICAgZGVsZXRlRmlsZShzZWFyY2hBbGxvd1BhdGgpO1xcXFxuICAgICAgICAgICAgc2VhcmNoQWxsb3cgPSBbXTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpc1ByZXBhcmUgPSB0cnVlO1xcXFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBmaW5kU291cmNlKGtleSkge1xcXFxuICAgIGxldCBzID0gc291cmNlTGlzdC5maW5kKHYgPT4gdi5rZXkgPT09IGtleSk7XFxcXG4gICAgaWYgKHMpIHtcXFxcbiAgICAgICAgcy5leHQgPSBnZXRBYnNvbHV0ZVBhdGgoU3RyaW5nKHMuZXh0KSk7XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBzO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXRDdXJyZW50U291cmNlKCkge1xcXFxuICAgIHJldHVybiBjdXJyZW50U291cmNlO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXRDdXJyZW50U291cmNlUGF0aCgpIHtcXFxcbiAgICBsZXQgcGF0aCA9IFN0cmluZyhjdXJyZW50U291cmNlLmV4dCk7XFxcXG4gICAgcmV0dXJuIGdldEFic29sdXRlUGF0aChwYXRoKTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0QWJzb2x1dGVQYXRoKHBhdGgpIHtcXFxcbiAgICBwYXRoID0gU3RyaW5nKHBhdGgpO1xcXFxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXFxcXFxcXCJodHRwXFxcXFxcXCIpIHx8IHBhdGguc3RhcnRzV2l0aChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIikpIHtcXFxcbiAgICAgICAgcmV0dXJuIHBhdGg7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgcmV0dXJuIGpvaW5VcmwoY3VycmVudENvbmZpZy5wYXRoLCBwYXRoKTtcXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHNldEN1cnJlbnRTb3VyY2Uoa2V5KSB7XFxcXG4gICAgbGV0IHNvdXJjZSA9IHNvdXJjZUxpc3QuZmluZCh2ID0+IHYua2V5ID09PSBrZXkpO1xcXFxuICAgIGlmIChzb3VyY2UpIHtcXFxcbiAgICAgICAgY3VycmVudENvbmZpZy5jS2V5ID0ga2V5O1xcXFxuICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXFxcXFwiY3VycmVudENvbmZpZ1xcXFxcXFwiLCBjdXJyZW50Q29uZmlnKTtcXFxcbiAgICAgICAgY3VycmVudFNvdXJjZSA9IHNvdXJjZTtcXFxcbiAgICAgICAgcmV0dXJuIHRydWU7XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBmYWxzZTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0Q2FuU2VhcmNoU291cmNlKCkge1xcXFxuICAgIHJldHVybiBzb3VyY2VMaXN0LmZpbHRlcih2ID0+IHYuc2VhcmNoYWJsZSA9PT0gdW5kZWZpbmVkIHx8IHYuc2VhcmNoYWJsZSk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdldEFsbFNvdXJjZSgpIHtcXFxcbiAgICByZXR1cm4gc291cmNlTGlzdC5zbGljZSgpO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXRBbGxTb3VyY2VzKCkge1xcXFxuICAgIHJldHVybiBzb3VyY2VMaXN0O1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXRTZWFyY2hBbGxvdygpIHtcXFxcbiAgICByZXR1cm4gc2VhcmNoQWxsb3c7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHNldFNlYXJjaEFsbG93KCkge1xcXFxuICAgIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaEFsbG93KSkge1xcXFxuICAgICAgICBzYXZlRmlsZShzZWFyY2hBbGxvd1BhdGgsIEpTT04uc3RyaW5naWZ5KHNlYXJjaEFsbG93KSk7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXRBbGxvd1NlYXJjaFNvdXJjZSgpIHtcXFxcbiAgICBsZXQgc2xpc3Q7XFxcXG4gICAgaWYgKHNlYXJjaEFsbG93Lmxlbmd0aCkge1xcXFxuICAgICAgICBzbGlzdCA9IHNvdXJjZUxpc3QuZmlsdGVyKHYgPT4gc2VhcmNoQWxsb3cuaW5jbHVkZXModi5rZXkpKTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICBzbGlzdCA9IHNvdXJjZUxpc3QuZmlsdGVyKHYgPT4gdi5zZWFyY2hhYmxlKTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKHNsaXN0Lmxlbmd0aCA9PSAwKSB7XFxcXG4gICAgICAgIHNsaXN0ID0gc291cmNlTGlzdC5zbGljZSgpO1xcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gc2xpc3Q7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGlzUHJlcGFyZWQoKSB7XFxcXG4gICAgcmV0dXJuIGlzUHJlcGFyZTtcXFxcbn1cXFxcblxcXFxuaXNQcmVwYXJlID0gcHJlcGFyZShzdG9yYWdlMC5nZXRJdGVtKFxcXFxcXFwiY3VycmVudENvbmZpZ1xcXFxcXFwiLCB7fSkpO1xcXFxuJC5leHBvcnRzID0ge1xcXFxuICAgIHByZXBhcmUsXFxcXG4gICAgZ2V0Q3VycmVudENvbmZpZyxcXFxcbiAgICBzZXRDdXJyZW50Q29uZmlnLFxcXFxuICAgIGdldEN1cnJlbnRTb3VyY2UsXFxcXG4gICAgZ2V0Q3VycmVudFNvdXJjZVBhdGgsXFxcXG4gICAgc2V0Q3VycmVudFNvdXJjZSxcXFxcbiAgICBnZXRDYW5TZWFyY2hTb3VyY2UsXFxcXG4gICAgZ2V0U2VhcmNoQWxsb3csXFxcXG4gICAgc2V0U2VhcmNoQWxsb3csXFxcXG4gICAgZ2V0QWxsU291cmNlLFxcXFxuICAgIGdldEFsbG93U2VhcmNoU291cmNlLFxcXFxuICAgIGlzUHJlcGFyZWQsXFxcXG4gICAgZ2V0QWJzb2x1dGVQYXRoLFxcXFxuICAgIGdldEFsbFNvdXJjZXMsXFxcXG4gICAgZmluZFNvdXJjZVxcXFxufTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLnvJbovpHphY3nva5cXFwiLFxcXCJwYXRoXFxcIjpcXFwiY3JlYXRlQ29uZmlnXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IGxheW91dCA9IFtdO1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi5Yib5bu66YWN572uXFxcXFxcXCIpO1xcXFxubGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcXFxcXCJydW50aW1lQ29uZmlnXFxcXFxcXCIpO1xcXFxubGV0IGN1cnJlbnRjb25maWcgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRDb25maWcoKTtcXFxcbmxldCBmID0gJC5yZXF1aXJlKFxcXFxcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXFxcXFwiKTtcXFxcbmFkZExpc3RlbmVyKFxcXFxcXFwib25DbG9zZVxcXFxcXFwiLCAoKSA9PiB7XFxcXG4gIGNsZWFyTXlWYXIoXFxcXFxcXCJkcnB5SGlrZXJfY29uZmlnX25hbWVcXFxcXFxcIik7XFxcXG4gIGNsZWFyTXlWYXIoXFxcXFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFxcXFxcIik7XFxcXG59KTtcXFxcblxcXFxuLy/ljoblj7LphY3nva7orrDlvZVcXFxcbmZ1bmN0aW9uIHVuaXF1ZUFycmF5QnlQcm9wZXJ0eShhcnJheSwgcHJvcGVydHkpIHtcXFxcbiAgbGV0IHVuaXF1ZSA9IFtdO1xcXFxuICBsZXQgbWFwID0gbmV3IE1hcCgpO1xcXFxuICBmb3IgKGxldCBpdGVtIG9mIGFycmF5KSB7XFxcXG4gICAgbGV0IGtleSA9IGl0ZW1bcHJvcGVydHldO1xcXFxuICAgIGlmICghbWFwLmhhcyhrZXkpKSB7XFxcXG4gICAgICBtYXAuc2V0KGtleSwgdHJ1ZSk7XFxcXG4gICAgICB1bmlxdWUucHVzaChpdGVtKTtcXFxcbiAgICB9XFxcXG4gIH1cXFxcbiAgcmV0dXJuIHVuaXF1ZTtcXFxcbn1cXFxcbmxldCBjcGF0aCA9IFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9jYWNoZS9cXFxcXFxcIiArIFxcXFxcXFwiZHJweWNvbmZpZy5qc29uXFxcXFxcXCI7XFxcXG5sZXQgcGF0aGNvbmZpZ3MgPSBbXTtcXFxcbnRyeSB7XFxcXG4gIHBhdGhjb25maWdzID0gSlNPTi5wYXJzZShyZWFkRmlsZShjcGF0aCkpIHx8IFtdO1xcXFxuICAvL3B1dE15VmFyKFxcXFxcXFwiZHJweUhpa2VyX2NvbmZpZ3NcXFxcXFxcIixwYXRoY29uZmlncyk7XFxcXG59IGNhdGNoIChlKSB7XFxcXG4gIGNvbnNvbGUubG9nKGUubWVzc2FnZSk7XFxcXG59XFxcXG5wYXRoY29uZmlncyA9IHVuaXF1ZUFycmF5QnlQcm9wZXJ0eShwYXRoY29uZmlncywgXFxcXFxcXCJwYXRoXFxcXFxcXCIpO1xcXFxuLy9sb2cocGF0aGNvbmZpZ3MpXFxcXG5cXFxcbmxldCBjb25maWdzX29iaiA9IHtcXFxcbiAgcGF0aDogY3BhdGgsXFxcXG4gIGNvbmZpZ3M6IHBhdGhjb25maWdzXFxcXG59XFxcXG4vL+WOhuWPsumFjee9ruiusOW9lVxcXFxuXFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gIGRlc2M6IFxcXFxcXFwi6YWN572u5ZCN56ewKOW/heWhqykgIOi3r+W+hOWSjOaWh+S7tuWkuemAieS6jOmAieS4gFxcXFxcXFwiLFxcXFxuICBleHRyYToge1xcXFxuICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFxcXFxcImRycHlIaWtlcl9jb25maWdfbmFtZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSxcXFxcbiAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICBwdXRNeVZhcihcXFxcXFxcImRycHlIaWtlcl9jb25maWdfbmFtZVxcXFxcXFwiLCBpbnB1dCk7XFxcXG4gICAgfSksXFxcXG4gICAgaWQ6IFxcXFxcXFwiZHJweUhpa2VyX2NvbmZpZ19uYW1lXFxcXFxcXCJcXFxcbiAgfVxcXFxufSk7XFxcXG5cXFxcbmxldCBzZWxlY3RfbW9kZSA9IGdldEl0ZW0oXFxcXFxcXCJzZWxlY3RfY29uZmlnX21vZGVcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxubGV0IG5hdiA9IFtcXFxcXFxcIui3r+W+hC9VUkxcXFxcXFxcIiwgXFxcXFxcXCLmlofku7blpLlcXFxcXFxcIl07XFxcXG5cXFxcbm5hdi5mb3JFYWNoKCh4LCBpKSA9PiB7XFxcXG4gIGxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyAoaSA9PSBzZWxlY3RfbW9kZSA/IHguZm9udGNvbG9yKFxcXFxcXFwiIzE1Qjc2Q1xcXFxcXFwiKSA6IHgpLFxcXFxuICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSkgPT4ge1xcXFxuICAgICAgc2V0SXRlbShcXFxcXFxcInNlbGVjdF9jb25maWdfbW9kZVxcXFxcXFwiLCBpICsgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0sIGkpLFxcXFxuICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxcXG4gIH0pXFxcXG59KVxcXFxuXFxcXG5cXFxcbmxldCBwYXRoID0gam9pblVybChnZXRQYXRoKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9cXFxcXFxcIiksIFxcXFxcXFwiLi4vXFxcXFxcXCIucmVwZWF0KDUpKS5zbGljZSg3KTtcXFxcblxcXFxuaWYgKHNlbGVjdF9tb2RlID09IFxcXFxcXFwiMFxcXFxcXFwiKSB7XFxcXG4gIGxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLpgInmi6lcXFxcXFxcIixcXFxcbiAgICB1cmw6IEpTT04uc3RyaW5naWZ5KGYuZmlsZVNlbGVjdGlvblVyaSh7XFxcXG4gICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgIGxldCB0YXJnZXQgPSBmaW5kSXRlbShcXFxcXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXFxcXFwiKS5leHRyYTtcXFxcbiAgICAgICAgdXBkYXRlSXRlbShcXFxcXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXFxcXFwiLCB7XFxcXG4gICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXFxcbiAgICAgICAgICB9KVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmV0dXJuIHRydWU7XFxcXG4gICAgICB9KSxcXFxcbiAgICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcXFxuICAgICAgaW5pdGlhbFBhdGg6IHBhdGgsXFxcXG4gICAgICBwYXR0ZXJuOiAwLFxcXFxuICAgICAgZmlsZVR5cGU6IFxcXFxcXFwiLmpzb25cXFxcXFxcIixcXFxcbiAgICB9KSksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiaW5wdXRcXFxcXFxcIixcXFxcbiAgICBkZXNjOiBcXFxcXFxcIumFjee9rui3r+W+hC9VUkwg5pys5Zyw6YCJ5oupaW5kZXguanNvblxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICBkZWZhdWx0VmFsdWU6IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgIHB1dE15VmFyKFxcXFxcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcXFxcXCIsIGlucHV0KTtcXFxcbiAgICAgIH0pLFxcXFxuICAgICAgaWQ6IFxcXFxcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcXFxcXCJcXFxcbiAgICB9XFxcXG4gIH0pO1xcXFxufVxcXFxuaWYgKHNlbGVjdF9tb2RlID09IFxcXFxcXFwiMVxcXFxcXFwiKSB7XFxcXG4gIGxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLpgInmi6lcXFxcXFxcIixcXFxcbiAgICB1cmw6IEpTT04uc3RyaW5naWZ5KGYuZmlsZVNlbGVjdGlvblVyaSh7XFxcXG4gICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgIGxldCB0YXJnZXQgPSBmaW5kSXRlbShcXFxcXFxcImRycHlIaWtlcl9jb25maWdfZm9sZGVyXFxcXFxcXCIpLmV4dHJhO1xcXFxuICAgICAgICB1cGRhdGVJdGVtKFxcXFxcXFwiZHJweUhpa2VyX2NvbmZpZ19mb2xkZXJcXFxcXFxcIiwge1xcXFxuICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHRhcmdldCwge1xcXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBQQVRIXFxcXG4gICAgICAgICAgfSlcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIHJldHVybiB0cnVlO1xcXFxuICAgICAgfSksXFxcXG4gICAgICByb290RGlyUGF0aDogcGF0aCxcXFxcbiAgICAgIGluaXRpYWxQYXRoOiBwYXRoLFxcXFxuICAgICAgcGF0dGVybjogMSxcXFxcbiAgICAgIC8vZmlsZVR5cGU6IFxcXFxcXFwiLmpzb25cXFxcXFxcIixcXFxcbiAgICB9KSksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiaW5wdXRcXFxcXFxcIixcXFxcbiAgICBkZXNjOiBcXFxcXFxcIumFjee9ruaWh+S7tuWkuei3r+W+hCDpgInmi6lkcnB5X2pz55uu5b2VXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgIGRlZmF1bHRWYWx1ZTogXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFxcXFxcIiwgaW5wdXQpO1xcXFxuICAgICAgfSksXFxcXG4gICAgICBpZDogXFxcXFxcXCJkcnB5SGlrZXJfY29uZmlnX2ZvbGRlclxcXFxcXFwiXFxcXG4gICAgfVxcXFxuICB9KTtcXFxcbn1cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgdGl0bGU6IFxcXFxcXFwi56Gu6K6kXFxcXFxcXCIsXFxcXG4gIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChjb2JqKSA9PiB7XFxcXG4gICAgbGV0IHBhdGggPSBnZXRNeVZhcihcXFxcXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICBsZXQgbmFtZSA9IGdldE15VmFyKFxcXFxcXFwiZHJweUhpa2VyX2NvbmZpZ19uYW1lXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgIGlmICghKHBhdGggJiYgbmFtZSkpIHtcXFxcbiAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5LiN5Y+v5Li656m6XFxcXFxcXCI7XFxcXG4gICAgfVxcXFxuICAgIHBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoXFxcXFxcXCJodHRwXFxcXFxcXCIpID8gcGF0aCA6IHBhdGguc3RhcnRzV2l0aChcXFxcXFxcIi9cXFxcXFxcIikgPyAoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoKSA6IHBhdGg7XFxcXG4gICAgLy9sb2cocGF0aClcXFxcbiAgICB0cnkge1xcXFxuICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcXFxcXCJydW50aW1lQ29uZmlnXFxcXFxcXCIpO1xcXFxuICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcXFxcXFxcImh0dHBcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgc2hvd0xvYWRpbmcoXFxcXFxcXCLmraPlnKjliqDovb3phY3nva4uLi5cXFxcXFxcIik7XFxcXG4gICAgICB9XFxcXG5cXFxcbiAgICAgIGlmIChydW50aW1lQ29uZmlnLnNldEN1cnJlbnRDb25maWcoe1xcXFxuICAgICAgICBwYXRoLFxcXFxuICAgICAgICBuYW1lLFxcXFxuICAgICAgfSkpIHtcXFxcbiAgICAgICAgY29iai5jb25maWdzLnB1c2goe1xcXFxuICAgICAgICAgIHBhdGgsXFxcXG4gICAgICAgICAgbmFtZSxcXFxcbiAgICAgICAgfSlcXFxcbiAgICAgICAgY2xlYXJJdGVtKFxcXFxcXFwibm9fbG9hZGluZ1xcXFxcXFwiKTtcXFxcbiAgICAgICAgc2F2ZUZpbGUoY29iai5wYXRoLCBKU09OLnN0cmluZ2lmeShjb2JqLmNvbmZpZ3MpKTtcXFxcbiAgICAgICAgYmFjayhmYWxzZSk7XFxcXG4gICAgICAgIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXFxcXFwiRHJweU1hbmFnZVxcXFxcXFwiKTtcXFxcbiAgICAgICAgRHJweU1hbmFnZS5jbGVhcigpO1xcXFxuICAgICAgICAkLnJlcXVpcmUoXFxcXFxcXCJDaGFuZ2VTb3VyY2VQb3BcXFxcXFxcIikuc2hvdygxMDApO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgfVxcXFxuICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/phY3nva7mlofku7bmnInor69cXFxcXFxcIjtcXFxcbiAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgZS50b1N0cmluZygpO1xcXFxuICAgIH0gZmluYWxseSB7XFxcXG4gICAgICBoaWRlTG9hZGluZygpO1xcXFxuICAgIH1cXFxcbiAgfSwgY29uZmlnc19vYmopLFxcXFxuICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG59KTtcXFxcblxcXFxuaWYgKHBhdGhjb25maWdzLmxlbmd0aCkge1xcXFxuICBsYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgXFxcXFxcXCI8c21hbGw+5Y6G5Y+y6YWN572u6K6w5b2VIOeCueaIkei/m+ihjOmFjee9ruajgOmqjDwvc21hbGw+XFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChwKSA9PiB7XFxcXG4gICAgICAvL2xvZyhwKVxcXFxuICAgICAgZnVuY3Rpb24gdW5pcXVlKGFycikge1xcXFxuICAgICAgICBjb25zdCByZXMgPSBuZXcgTWFwKCk7XFxcXG4gICAgICAgIHJldHVybiBhcnIuZmlsdGVyKChhKSA9PiAhcmVzLmhhcyhhKSAmJiByZXMuc2V0KGEsIDEpKVxcXFxuICAgICAgfVxcXFxuICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcXFxcbiAgICAgIGlmIChwLmxlbmd0aCA9PSAwKSB7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5peg5Zyw5Z2AXFxcXFxcXCI7XFxcXG4gICAgICB9XFxcXG4gICAgICBsaXN0ID0gcC5tYXAoeCA9PiB4LnBhdGgpO1xcXFxuICAgICAgdmFyIHRhc2sgPSBmdW5jdGlvbihvYmopIHtcXFxcbiAgICAgICAgbGV0IHMgPSBEYXRlLm5vdygpO1xcXFxuICAgICAgICBsZXQganNGaWxlcyA9IFtdO1xcXFxuICAgICAgICBsZXQgY291bnQgPSAwO1xcXFxuXFxcXG4gICAgICAgIGZ1bmN0aW9uIGZpbHRlck90aGVyKGxpc3QpIHtcXFxcbiAgICAgICAgICByZXR1cm4gbGlzdC5maWx0ZXIoaXQgPT4gU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcXFxcXCJkcnB5Mi5taW4uanNcXFxcXFxcIikgfHwgU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcXFxcXCJkcnB5Mi5qc1xcXFxcXFwiKSlcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAob2JqLnVybC5zdGFydHNXaXRoKFxcXFxcXFwiZmlsZTpcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICBsZXQgY29kZSA9IFxcXFxcXFwibm9cXFxcXFxcIjtcXFxcbiAgICAgICAgICBsZXQgcGF0aCA9IG9iai51cmwucmVwbGFjZShcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgbGV0IGRpciA9IG5ldyBqYXZhLmlvLkZpbGUocGF0aCk7XFxcXG4gICAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7XFxcXG4gICAgICAgICAgICBsZXQgZmxpc3QgPSBkaXIubGlzdEZpbGVzKCk7XFxcXG4gICAgICAgICAgICBmb3IgKHZhciBmIG9mIGZsaXN0KSB7XFxcXG4gICAgICAgICAgICAgIC8vIOajgOafpeaWh+S7tuWQjeaYr+WQpuS7pS5qc+e7k+WwvlxcXFxuICAgICAgICAgICAgICBpZiAoZi5pc0ZpbGUoKSAmJiBmLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKFxcXFxcXFwiLmpzXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICAgICAganNGaWxlcy5wdXNoKGYpO1xcXFxuICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgfVxcXFxuICAgICAgICAgIGlmIChkaXIuaXNGaWxlKCkgJiYgZmlsZUV4aXN0KG9iai51cmwpKSB7XFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICBqc29uID0gSlNPTi5wYXJzZShyZWFkRmlsZShvYmoudXJsKSk7XFxcXG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24uc2l0ZXMpIHx8IGpzb24uc2l0ZXMubGVuZ3RoKSB7XFxcXG4gICAgICAgICAgICAgICAgY291bnQgPSBmaWx0ZXJPdGhlcihqc29uLnNpdGVzKS5sZW5ndGg7XFxcXG4gICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxcXG4gICAgICAgICAgICBjb2RlID0gXFxcXFxcXCJva1xcXFxcXFwiO1xcXFxuICAgICAgICAgIH1cXFxcbiAgICAgICAgICBpZiAoanNGaWxlcy5sZW5ndGggPj0gNSkge1xcXFxuICAgICAgICAgICAgY291bnQgPSBqc0ZpbGVzLmxlbmd0aDtcXFxcbiAgICAgICAgICAgIGNvZGUgPSBcXFxcXFxcIm9rXFxcXFxcXCI7XFxcXG4gICAgICAgICAgfVxcXFxuICAgICAgICAgIHJldHVybiB7XFxcXG4gICAgICAgICAgICB0aW1lOiAoRGF0ZS5ub3coKSAtIHMpLFxcXFxuICAgICAgICAgICAgdXJsOiBvYmoudXJsLFxcXFxuICAgICAgICAgICAgY291bnQ6IGNvdW50LFxcXFxuICAgICAgICAgICAgY29kZTogY29kZSxcXFxcbiAgICAgICAgICAgIGluZGV4OiBvYmouaVxcXFxuICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB2YXIgaiA9IEpTT04ucGFyc2UoZmV0Y2gob2JqLnVybCwge1xcXFxuICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlLFxcXFxuICAgICAgICAgIHRpbWVvdXQ6IDUwMDAsXFxcXG4gICAgICAgIH0pKTtcXFxcbiAgICAgICAgbGV0IGUgPSBEYXRlLm5vdygpO1xcXFxuICAgICAgICBsZXQgYyA9IGUgLSBzO1xcXFxuICAgICAgICBpZiAob2JqLnVybC5pbmNsdWRlcyhcXFxcXFxcImdpdGh1Yi5jb21cXFxcXFxcIikgJiYgai5zdGF0dXNDb2RlID09IDIwMCkge1xcXFxuICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICB2YXIgaHRtbCA9IGouYm9keTtcXFxcbiAgICAgICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShwZGZoKGh0bWwsIFxcXFxcXFwiI3JlcG8tY29udGVudC1wamF4LWNvbnRhaW5lciYmc2NyaXB0JiZIdG1sXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgICAgIGxldCBsaXN0ID0ganNvbi5wYXlsb2FkLnRyZWUuaXRlbXM7XFxcXG4gICAgICAgICAgICBjb3VudCA9IGxpc3QuZmlsdGVyKHggPT4geC5uYW1lLmVuZHNXaXRoKFxcXFxcXFwiLmpzXFxcXFxcXCIpKS5sZW5ndGg7XFxcXG4gICAgICAgICAgfSBjYXRjaCB7fVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKHRvQ29ycmVjdEpTT05TdHJpbmcoai5ib2R5KSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpO1xcXFxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24uc2l0ZXMpIHx8IGpzb24uc2l0ZXMubGVuZ3RoKSB7XFxcXG4gICAgICAgICAgICBjb3VudCA9IGZpbHRlck90aGVyKGpzb24uc2l0ZXMpLmxlbmd0aDtcXFxcbiAgICAgICAgICB9XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxcXG5cXFxcbiAgICAgICAgcmV0dXJuIHtcXFxcbiAgICAgICAgICB0aW1lOiBjLFxcXFxuICAgICAgICAgIHVybDogai51cmwsXFxcXG4gICAgICAgICAgY291bnQ6IGNvdW50LFxcXFxuICAgICAgICAgIGNvZGU6IGouc3RhdHVzQ29kZSxcXFxcbiAgICAgICAgICBpbmRleDogb2JqLmksXFxcXG4gICAgICAgIH1cXFxcbiAgICAgIH07XFxcXG4gICAgICBsZXQgdGFza3MgPSBsaXN0Lm1hcCgoeCwgaSkgPT4ge1xcXFxuICAgICAgICBpID0gaSArIDE7XFxcXG4gICAgICAgIHJldHVybiB7XFxcXG4gICAgICAgICAgZnVuYzogdGFzayxcXFxcbiAgICAgICAgICBwYXJhbToge1xcXFxuICAgICAgICAgICAgdXJsOiB4LFxcXFxuICAgICAgICAgICAgaTogaSAtIDEsXFxcXG4gICAgICAgICAgfSxcXFxcbiAgICAgICAgICBpZDogJ3Rhc2tpZCcgKyBpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgIH0pO1xcXFxuICAgICAgdmFyIGNvdW50ID0gc3VjY2VzcyA9IHRhc2tzLmxlbmd0aDtcXFxcbiAgICAgIGJlKHRhc2tzLCB7XFxcXG4gICAgICAgIGZ1bmM6IGZ1bmN0aW9uKG9iaiwgaWQsIGVycm9yLCB0YXNrUmVzdWx0KSB7XFxcXG4gICAgICAgICAgb2JqLnJlc3VsdHMucHVzaCh0YXNrUmVzdWx0KVxcXFxuICAgICAgICAgIGNvdW50ID0gY291bnQgLSAxO1xcXFxuICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcXFxcbiAgICAgICAgICAgIHNob3dMb2FkaW5nKFxcXFxcXFwi5qOA5rWL5LitLi4u5Ymp5L2Z5Zyw5Z2A77yaXFxcXFxcXCIgKyBjb3VudClcXFxcbiAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICB9XFxcXG4gICAgICAgIH0sXFxcXG4gICAgICAgIHBhcmFtOiB7XFxcXG4gICAgICAgICAgaGk6ICdjY2MnLFxcXFxuICAgICAgICAgIHJlc3VsdHM6IHJlc3VsdHNcXFxcbiAgICAgICAgfVxcXFxuICAgICAgfSwgc3VjY2Vzcyk7XFxcXG4gICAgICAvL2xvZyhyZXN1bHRzKVxcXFxuICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKGYgPT4gZik7XFxcXG4gICAgICByZXN1bHRzLmZvckVhY2goKHgsIGkpID0+IHtcXFxcbiAgICAgICAgbGV0IGl0ZW0gPSBmaW5kSXRlbShcXFxcXFxcInBhdGhcXFxcXFxcIiArIHguaW5kZXgpO1xcXFxuICAgICAgICBsZXQgcmVnZXggPSAvKOWQjeensDouKj8pKFxcXFxcXFxccyspP1xcXFxcXFxcbi9nO1xcXFxuICAgICAgICBsZXQgdGl0bGUgPSBcXFxcXFxcIuWQjeensDpcXFxcXFxcIiArIHBbeC5pbmRleF0ubmFtZSArIFxcXFxcXFwiIFxcXFxcXFwiO1xcXFxuICAgICAgICBsZXQgdXJsID0gcFt4LmluZGV4XS5wYXRoO1xcXFxuICAgICAgICBsZXQgbXNnID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgbGV0IGNvdW50ID0geC5jb3VudCAhPSAwID8gXFxcXFxcXCIg5rqQ5pWw6YePOlxcXFxcXFwiICsgeC5jb3VudCA6IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgIGlmICgvbm8vLnRlc3QoeC5jb2RlKSkge1xcXFxuICAgICAgICAgIG1zZyA9IGl0ZW0udGl0bGUucmVwbGFjZShyZWdleCwgdGl0bGUgKyBcXFxcXFxcIumFjee9ruacieivr1xcXFxcXFwiLmZvbnRjb2xvcihcXFxcXFxcInJlZFxcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXCIpO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKC9eKC0xfDB8NDA0KS8udGVzdCh4LmNvZGUpKSB7XFxcXG4gICAgICAgICAgbXNnID0gaXRlbS50aXRsZS5yZXBsYWNlKHJlZ2V4LCB0aXRsZSArIFxcXFxcXFwi5peg5rOV6K6/6ZeuXFxcXFxcXCIuZm9udGNvbG9yKFxcXFxcXFwicmVkXFxcXFxcXCIpICsgXFxcXFxcXCJcXFxcXFxcXG5cXFxcXFxcIik7XFxcXG4gICAgICAgIH0gZWxzZSBpZiAoL14yMDAvLnRlc3QoeC5jb2RlKSkge1xcXFxuICAgICAgICAgIG1zZyA9IGl0ZW0udGl0bGUucmVwbGFjZShyZWdleCwgdGl0bGUgKyBcXFxcXFxcIumAmuiur+ato+W4uFxcXFxcXFwiLmZvbnRjb2xvcihcXFxcXFxcIiMzQ0IzNzFcXFxcXFxcIikgKyBcXFxcXFxcIiAg5bu26L+fOlxcXFxcXFwiICsgeC50aW1lICsgY291bnQgKyBcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAvL3VybCA9IGl0ZW0udXJsO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgIG1zZyA9IGl0ZW0udGl0bGUucmVwbGFjZShyZWdleCwgdGl0bGUgKyBcXFxcXFxcIumFjee9ruato+ehrlxcXFxcXFwiLmZvbnRjb2xvcihcXFxcXFxcIiMzQ0IzNzFcXFxcXFxcIikgKyBjb3VudCArIFxcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXCIpO1xcXFxuICAgICAgICAgIC8vdXJsID0gaXRlbS51cmw7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdXBkYXRlSXRlbShpdGVtLmV4dHJhLmlkLCB7XFxcXG4gICAgICAgICAgdGl0bGU6IG1zZyxcXFxcbiAgICAgICAgICAvL3VybDogdXJsLFxcXFxuICAgICAgICB9KVxcXFxuICAgICAgfSk7XFxcXG4gICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICB9LCBwYXRoY29uZmlncyksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiXFxcXG4gIH0pXFxcXG4gIHBhdGhjb25maWdzLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXFxcbiAgICBsZXQgbG9uZ0MgPSBbe1xcXFxuICAgICAgdGl0bGU6IFxcXFxcXFwi5ZCN56ewXFxcXFxcXCIsXFxcXG4gICAgICBqczogJC50b1N0cmluZygoaXRlbSwgcCwgYykgPT4ge1xcXFxuICAgICAgICBsZXQgaSA9IGMuZmluZEluZGV4KHggPT4geC5uYW1lID09IGl0ZW0ubmFtZSk7XFxcXG4gICAgICAgIGlmIChpICE9IC0xKSB7XFxcXG4gICAgICAgICAgcmV0dXJuICQoY1tpXS5uYW1lLCBcXFxcXFxcIui+k+WFpeaWsOWQjeensFxcXFxcXFwiKS5pbnB1dCgoYywgcCwgaSkgPT4ge1xcXFxuICAgICAgICAgICAgY1tpXS5uYW1lID0gaW5wdXQ7XFxcXG4gICAgICAgICAgICBzYXZlRmlsZShwLCBKU09OLnN0cmluZ2lmeShjKSk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgIH0sIGMsIHAsIGkpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgIH0sIGl0ZW0sIGNwYXRoLCBwYXRoY29uZmlncylcXFxcbiAgICB9LCB7XFxcXG4gICAgICB0aXRsZTogXFxcXFxcXCLot6/lvoRcXFxcXFxcIixcXFxcbiAgICAgIGpzOiAkLnRvU3RyaW5nKChpdGVtLCBwLCBjKSA9PiB7XFxcXG4gICAgICAgIGxldCBpID0gYy5maW5kSW5kZXgoeCA9PiB4Lm5hbWUgPT0gaXRlbS5uYW1lKTtcXFxcbiAgICAgICAgaWYgKGkgIT0gLTEpIHtcXFxcbiAgICAgICAgICByZXR1cm4gJChjW2ldLnBhdGgsIFxcXFxcXFwi6L6T5YWl5paw6Lev5b6EXFxcXFxcXCIpLmlucHV0KChjLCBwLCBpKSA9PiB7XFxcXG4gICAgICAgICAgICBjW2ldLnBhdGggPSBpbnB1dDtcXFxcbiAgICAgICAgICAgIHNhdmVGaWxlKHAsIEpTT04uc3RyaW5naWZ5KGMpKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgfSwgYywgcCwgaSlcXFxcbiAgICAgICAgfVxcXFxuICAgICAgfSwgaXRlbSwgY3BhdGgsIHBhdGhjb25maWdzKVxcXFxuICAgIH0sIHtcXFxcbiAgICAgIHRpdGxlOiBcXFxcXFxcIuWIoOmZpFxcXFxcXFwiLFxcXFxuICAgICAganM6ICQudG9TdHJpbmcoKGl0ZW0sIHAsIGMpID0+IHtcXFxcbiAgICAgICAgbGV0IGkgPSBjLmZpbmRJbmRleCh4ID0+IHgubmFtZSA9PSBpdGVtLm5hbWUpO1xcXFxuICAgICAgICBpZiAoaSAhPSAtMSkge1xcXFxuICAgICAgICAgIGMuc3BsaWNlKGksIDEpO1xcXFxuICAgICAgICAgIHNhdmVGaWxlKHAsIEpTT04uc3RyaW5naWZ5KGMpKTtcXFxcbiAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICB9LCBpdGVtLCBjcGF0aCwgcGF0aGNvbmZpZ3MpXFxcXG4gICAgfV1cXFxcbiAgICBpZiAoaXRlbS5wYXRoLnN0YXJ0c1dpdGgoXFxcXFxcXCJodHRwXFxcXFxcXCIpKSB7XFxcXG4gICAgICBsb25nQy5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi6K6/6ZeuXFxcXFxcXCIsXFxcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKChpdGVtKSA9PiB7XFxcXG4gICAgICAgICAgaWYgKGl0ZW0ucGF0aC5zdGFydHNXaXRoKFxcXFxcXFwiaHR0cFxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwid2ViOi8vXFxcXFxcXCIgKyBpdGVtLnBhdGg7XFxcXG4gICAgICAgICAgfVxcXFxuICAgICAgICB9LCBpdGVtKVxcXFxuICAgICAgfSlcXFxcbiAgICB9XFxcXG4gICAgbGV0IGN1cnJlbnQgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIGlmIChjdXJyZW50Y29uZmlnICYmIGN1cnJlbnRjb25maWcuaGFzT3duUHJvcGVydHkoXFxcXFxcXCJwYXRoXFxcXFxcXCIpKSB7XFxcXG4gICAgICBpZiAoaXRlbS5wYXRoID09IGN1cnJlbnRjb25maWcucGF0aCkge1xcXFxuICAgICAgICBjdXJyZW50ID0gXFxcXFxcXCLinqHvuI9cXFxcXFxcIjtcXFxcbiAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgXFxcXFxcXCI8c21hbGw+XFxcXFxcXCIgKyBjdXJyZW50ICsgXFxcXFxcXCLlkI3np7A6XFxcXFxcXCIgKyBpdGVtLm5hbWUgKyBcXFxcXFxcIlxcXFxcXFxcbui3r+W+hDpcXFxcXFxcIiArIGl0ZW0ucGF0aCArIFxcXFxcXFwiPC9zbWFsbD5cXFxcXFxcIixcXFxcbiAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKGl0ZW0gPT4ge1xcXFxuICAgICAgICBjbGVhckl0ZW0oXFxcXFxcXCJub19sb2FkaW5nXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFxcXFxcInJ1bnRpbWVDb25maWdcXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCB7XFxcXG4gICAgICAgICAgcGF0aCxcXFxcbiAgICAgICAgICBuYW1lXFxcXG4gICAgICAgIH0gPSBpdGVtO1xcXFxuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFxcXFxcXFwiaHR0cFxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgIHNob3dMb2FkaW5nKFxcXFxcXFwi5q2j5Zyo5Yqg6L296YWN572uLi4uXFxcXFxcXCIpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmIChydW50aW1lQ29uZmlnLnNldEN1cnJlbnRDb25maWcoe1xcXFxuICAgICAgICAgIHBhdGgsXFxcXG4gICAgICAgICAgbmFtZSxcXFxcbiAgICAgICAgfSkpIHtcXFxcbiAgICAgICAgICBiYWNrKGZhbHNlKTtcXFxcbiAgICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFxcXFxcIkRycHlNYW5hZ2VcXFxcXFxcIik7XFxcXG4gICAgICAgICAgRHJweU1hbmFnZS5jbGVhcigpO1xcXFxuICAgICAgICAgICQucmVxdWlyZShcXFxcXFxcIkNoYW5nZVNvdXJjZVBvcFxcXFxcXFwiKS5zaG93KDEwMCk7XFxcXG4gICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIh+aNouWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICB9LCBpdGVtKSxcXFxcbiAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgaWQ6ICdwYXRoJyArIGksXFxcXG4gICAgICAgIGxvbmdDbGljazogbG9uZ0NcXFxcbiAgICAgIH1cXFxcbiAgICB9KVxcXFxuICB9KVxcXFxufVxcXFxuXFxcXG5cXFxcbnNldFJlc3VsdChsYXlvdXQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuaNoua6kOW8ueeql1xcXCIsXFxcInBhdGhcXFwiOlxcXCJDaGFuZ2VTb3VyY2VQb3BcXFwiLFxcXCJydWxlXFxcIjpcXFwiJC5leHBvcnRzLnNob3cgPSBmdW5jdGlvbih0aW1lKSB7XFxcXG4gICAgaWYgKHRpbWUpIHtcXFxcbiAgICAgICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCh0aW1lKTtcXFxcbiAgICB9XFxcXG4gICAgY29uc3QgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFxcXFxcInJ1bnRpbWVDb25maWdcXFxcXFxcIik7XFxcXG4gICAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZSgpO1xcXFxuICAgIGxldCBuYW1lID0gc291cmNlID8gc291cmNlLm5hbWUgOiBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIGNvbnN0IGhpa2VyUG9wID0gJC5yZXF1aXJlKFxcXFxcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9Njk2NlxcXFxcXFwiKTtcXFxcbiAgICBsZXQgc291cmNlTmFtZUxpc3QgPSBydW50aW1lQ29uZmlnLmdldEFsbFNvdXJjZSgpLm1hcCh2ID0+IHtcXFxcbiAgICAgICAgcmV0dXJuIHYubmFtZSA9PSBuYW1lID8gXFxcXFxcXCLigJjigJhcXFxcXFxcIiArIHYubmFtZSArIFxcXFxcXFwi4oCZ4oCZXFxcXFxcXCIgOiB2Lm5hbWU7XFxcXG4gICAgfSk7XFxcXG4gICAgaGlrZXJQb3Auc2V0VXNlU3RhcnRBY3Rpdml0eShmYWxzZSk7XFxcXG5cXFxcbiAgICBmdW5jdGlvbiBuYXR1cmFsU29ydChhLCBiKSB7XFxcXG4gICAgICAgIGEgPSBhLnJlcGxhY2UoL1vigJnigJhdL2csIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICBiID0gYi5yZXBsYWNlKC9b4oCZ4oCYXS9nLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiLCB1bmRlZmluZWQsIHtcXFxcbiAgICAgICAgICAgIG51bWVyaWM6IHRydWUsXFxcXG4gICAgICAgICAgICBzZW5zaXRpdml0eTogJ2Jhc2UnXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcblxcXFxuICAgIGxldCBzcGVuID0gMztcXFxcbiAgICBsZXQgaXRlbXMgPSBzb3VyY2VOYW1lTGlzdC5tYXAoKHgsIGkpID0+IHtcXFxcbiAgICAgICAgcmV0dXJuIHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiB4LFxcXFxuICAgICAgICAgICAgdXJsOiBpXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KVxcXFxuXFxcXG4gICAgbGV0IG5hbWVzID0gaXRlbXMubWFwKHYgPT4gdi50aXRsZSk7XFxcXG4gICAgbGV0IHNuYW1lID0gbmFtZXMuc2xpY2UoKTtcXFxcbiAgICBpZiAoZ2V0SXRlbShcXFxcXFxcIm5hdHVyYWxcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgbmFtZXMgPSBuYW1lcy5zb3J0KG5hdHVyYWxTb3J0KTtcXFxcbiAgICB9XFxcXG4gICAgbGV0IG1hbmFnZV9hbGwgPSBuYW1lcy5zbGljZSgpO1xcXFxuICAgIGxldCBzZWFyY2hLZXkgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIGxldCBwb3AgPSBoaWtlclBvcC5zZWxlY3RCb3R0b21SZXMoe1xcXFxuICAgICAgICBvcHRpb25zOiBuYW1lcyxcXFxcbiAgICAgICAgY29sdW1uczogc3BlbixcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi6YCJ5oup6KeG6aKR5rqQXFxcXFxcXCIgKyBcXFxcXFxcIuW9k+WJjeWFsTpcXFxcXFxcIiArIGl0ZW1zLmxlbmd0aCArIFxcXFxcXFwi5Liq6KeG6aKR5rqQXFxcXFxcXCIsXFxcXG4gICAgICAgIG5vQXV0b0Rpc21pc3M6IHRydWUsXFxcXG4gICAgICAgIHBvc2l0aW9uOiAxLFxcXFxuICAgICAgICBleHRyYUlucHV0Qm94OiBuZXcgaGlrZXJQb3AuUmVzRXh0cmFJbnB1dEJveCh7XFxcXG4gICAgICAgICAgICBoaW50OiBcXFxcXFxcIua6kOWFs+mUruWtl1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwib2tcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIG9uQ2hhbmdlKHRleHQsIG1hbmFnZSkge1xcXFxuICAgICAgICAgICAgICAgIC8vbG9nKFxcXFxcXFwib25DaGFuZ2U6XFxcXFxcXCIrdGV4dClcXFxcbiAgICAgICAgICAgICAgICBsZXQgZmxpc3QgPSBuYW1lcy5maWx0ZXIoeCA9PiB4LmluY2x1ZGVzKHRleHQpKTtcXFxcbiAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcXFxuICAgICAgICAgICAgICAgIGZsaXN0LmZvckVhY2goeCA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goeCk7XFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGNsaWNrKHMsIG1hbmFnZSkge1xcXFxuICAgICAgICAgICAgICAgIC8vdG9hc3Qocyk7XFxcXG4gICAgICAgICAgICAgICAgLy9sb2cobWFuYWdlLmxpc3QpO1xcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2VcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGxvbmdDbGljayhzLCBpKSB7XFxcXG4gICAgICAgICAgICBzaG93U2VsZWN0T3B0aW9ucyh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5YiG5Lqr6KeG6aKR5rqQXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgb3B0aW9uczogW1xcXFxcXFwiSlPmlofku7bliIbkuqtcXFxcXFxcIl0uY29uY2F0KGdldFBhc3RlcygpKSxcXFxcbiAgICAgICAgICAgICAgICBjb2w6IDIsXFxcXG4gICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcobmFtZSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcXFxcXCJydW50aW1lQ29uZmlnXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlcyA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBzb3VyY2UgPSBzb3VyY2VzLmZpbmQodiA9PiB2Lm5hbWUgPT0gbmFtZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gcnVudGltZUNvbmZpZy5nZXRBYnNvbHV0ZVBhdGgoc291cmNlLmV4dCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBwbmFtZSA9IHBhdGguc3BsaXQoXFxcXFxcXCIvXFxcXFxcXCIpLmF0KC0xKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGU9ZmV0Y2gocGF0aCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmKCFydWxlKSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+iOt+WPluWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAoTVlfSU5ERVggPT09IDApIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL1xcXFxcXFwiICsgcG5hbWUsIGZldGNoKHBhdGgpKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInNoYXJlOi8vaGlrZXI6Ly9maWxlcy9fY2FjaGUvXFxcXFxcXCIgKyBwbmFtZTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsPXNoYXJlUGFzdGUoYmFzZTY0RW5jb2RlKHJ1bGUpLCBpbnB1dCk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIFxcXFxcXFwiY29weTovL+a1t+mYlOinhueVjO+8jERSUFnop4bpopHmupDjgIxcXFxcXFxcIiArIG5hbWUgKyBcXFxcXFxcIuOAjeWkjeWItuaVtOadoeWPo+S7pOaJk+W8gOi9r+S7tuWwseS8muiHquWKqOWvvOWFpSRcXFxcXFxcIiArIHVybCAgKyBcXFxcXFxcIiRcXFxcXFxcIitwbmFtZStcXFxcXFxcIkBpbXBvcnQ9anM6JC5yZXF1aXJlKCdpbXBvcnQ/cnVsZT0nK1xcXFxcXFwiICsgSlNPTi5zdHJpbmdpZnkoTVlfUlVMRS50aXRsZSkgKyBcXFxcXFxcIikoaW5wdXQsIHRydWUpXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9LCBzLnJlcGxhY2UoL1vigJnigJhdL2csIFxcXFxcXFwiXFxcXFxcXCIpKVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH0sXFxcXG4gICAgICAgIGNsaWNrKHMsIGksIG1hbmFnZSkge1xcXFxuICAgICAgICAgICAgcG9wLmRpc21pc3MoKTtcXFxcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJub19sb2FkaW5nXFxcXFxcXCIsIFxcXFxcXFwiMVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIC8vIG1hbmFnZS5saXN0LmZvckVhY2goKHYsIGlpKSA9PiAoXFxcXG4gICAgICAgICAgICAvLyAgIG1hbmFnZS5saXN0W2lpXSA9IGkgPT09IGlpID8gXFxcXFxcXCLigJjigJhcXFxcXFxcIiArIG5hbWVzW2lpXSArIFxcXFxcXFwi4oCZ4oCZXFxcXFxcXCIgOiBuYW1lc1tpaV0ucmVwbGFjZSgvW+KAmeKAmF0vZywgXFxcXFxcXCJcXFxcXFxcIilcXFxcbiAgICAgICAgICAgIC8vICkpO1xcXFxuICAgICAgICAgICAgbGV0IG5hbWUgPSBtYW5hZ2UubGlzdFtpXS5yZXBsYWNlKC9b4oCZ4oCYXS9nLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGlmIChuYW1lID09IHNvdXJjZS5uYW1lKSB7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm47XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsZXQgc291cmNlcyA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlKCk7XFxcXG4gICAgICAgICAgICBsZXQga2V5ID0gc291cmNlcy5maW5kKHYgPT4gdi5uYW1lID09IG5hbWUpLmtleTtcXFxcblxcXFxuICAgICAgICAgICAgLy9tYW5hZ2UuY2hhbmdlKCk7XFxcXG4gICAgICAgICAgICBsZXQgc291cmNlTmFtZUxpc3QgPSBydW50aW1lQ29uZmlnLnNldEN1cnJlbnRTb3VyY2Uoa2V5KTtcXFxcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJjYXRlaVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJjYXRlX29ialxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJpc2hvbWVcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXFxcXFwibGlua3NcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuXFxcXG4gICAgICAgIH0sXFxcXG4gICAgICAgIG1lbnVDbGljayhtYW5hZ2UpIHtcXFxcbiAgICAgICAgICAgIGhpa2VyUG9wLnNlbGVjdENlbnRlcih7XFxcXG4gICAgICAgICAgICAgICAgb3B0aW9uczogW1xcXFxcXFwi5pS55Y+Y5qC35byPXFxcXFxcXCIsIFxcXFxcXFwi562b6YCJ5rqQXFxcXFxcXCIsIFxcXFxcXFwi6Ieq54S25o6S5bqPOlxcXFxcXFwiICsgKGdldEl0ZW0oXFxcXFxcXCJuYXR1cmFsXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpID09IFxcXFxcXFwiXFxcXFxcXCIgPyBcXFxcXFxcIuWFs+mXrVxcXFxcXFwiIDogXFxcXFxcXCLlkK/nlKhcXFxcXFxcIiksIFxcXFxcXFwi5YCS5bqPXFxcXFxcXCIsIFxcXFxcXFwi5Yi35paw6YWN572uXFxcXFxcXCJdLFxcXFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IDIsXFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi6K+36YCJ5oupXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgY2xpY2socywgaSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlbiA9IHNwZW4gPT0gMyA/IDEgOiAzO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmNoYW5nZUNvbHVtbnMoc3Blbik7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgaGlrZXJQb3AuaW5wdXRDb25maXJtKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBcXFxcXFxcIui+k+WFpeWFs+mUruWtlyDnqbrmmL7npLrlhajpg6hcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLnrZvpgInmupBcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50OiBcXFxcXFxcIua6kOWFs+mUruWtl1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogc2VhcmNoS2V5LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRhcmVhOiBmYWxzZSwgLy/lpJrooYzmqKHlvI9cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhUZXh0YXJlYTogdHJ1ZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub0F1dG9Tb2Z0OiBmYWxzZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hpZGVDYW5jZWw6IHRydWUsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybSh0ZXh0KSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXFxcXFwicnVudGltZUNvbmZpZ1xcXFxcXFwiLCBcXFxcXFxcInJ1bnRpbWVDb25maWdcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEtleSA9IHRleHQ7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0ID0gcnVudGltZUNvbmZpZy5nZXRBbGxTb3VyY2UoKS5tYXAoeCA9PiB4Lm5hbWUpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmxpc3QgPSBsaXN0LmZpbHRlcih4ID0+IHguaW5jbHVkZXModGV4dCkpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlzdC5mb3JFYWNoKHggPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+i+k+WFpeS6hlxcXFxcXFwiICsgdGV4dDtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxcXFxuXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID09PSAyKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdCA9IE9iamVjdC5hc3NpZ24oW10sIG1hbmFnZS5saXN0KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuYXR1cmFsID0gZ2V0SXRlbShcXFxcXFxcIm5hdHVyYWxcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF0dXJhbCA9PSBcXFxcXFxcIlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LnNvcnQobmF0dXJhbFNvcnQpLmZvckVhY2goeCA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goeCk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hbWUuZm9yRWFjaCh4ID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcIm5hdHVyYWxcXFxcXFxcIiwgbmF0dXJhbCA/IFxcXFxcXFwiXFxcXFxcXCIgOiBcXFxcXFxcIjFcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAzKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5yZXZlcnNlKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5yZXZlcnNlKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhcnJheURpZmZlcmVuY2UoYXJyMSwgYXJyMikge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoYXJyMi5tYXAoaXRlbSA9PiBbaXRlbS5rZXksIGl0ZW1dKSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycjEuZmlsdGVyKGl0ZW0gPT4gIW1hcC5oYXMoaXRlbS5rZXkpKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcblxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcXFxcXCJydW50aW1lQ29uZmlnXFxcXFxcXCIsIFxcXFxcXFwicnVudGltZUNvbmZpZ1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0ID0gcnVudGltZUNvbmZpZy5nZXRBbGxTb3VyY2UoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBDa2V5ID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCkua2V5O1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9sb2coQ2tleSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjZmcgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRDb25maWcoKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gPSBjZmc7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQ29uZmlnLnNldEN1cnJlbnRDb25maWcoe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUNvbmZpZy5zZXRDdXJyZW50U291cmNlKENrZXkpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5zb3VyY2VzID0gcnVudGltZUNvbmZpZy5nZXRBbGxTb3VyY2UoKTtcXFxcblxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFsaXN0ID0gYXJyYXlEaWZmZXJlbmNlKG5zb3VyY2VzLCBsaXN0KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkbGlzdCA9IGFycmF5RGlmZmVyZW5jZShsaXN0LCBuc291cmNlcyk7XFxcXG5cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGlzdC5sZW5ndGggPiAwIHx8IGRsaXN0Lmxlbmd0aCA+IDApIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXNnID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxpc3QubGVuZ3RoID4gMCkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlzdC5mb3JFYWNoKHggPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4Lm5hbWUpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coXFxcXFxcXCLmlrDlop46XFxcXFxcXCIgKyBhbGlzdC5tYXAoayA9PiBrLm5hbWUpLmpvaW4oXFxcXFxcXCIsXFxcXFxcXCIpKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gXFxcXFxcXCLmlrDlop5cXFxcXFxcIiArIGFsaXN0Lmxlbmd0aCArIFxcXFxcXFwi5Liq5rqQXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkbGlzdC5sZW5ndGggPiAwKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsaXN0LmZvckVhY2goeCA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5zcGxpY2UobWFuYWdlLmxpc3QuaW5kZXhPZih4Lm5hbWUpLCAxKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKFxcXFxcXFwi56e76ZmkOlxcXFxcXFwiICsgZGxpc3QubWFwKGsgPT4gay5uYW1lKS5qb2luKFxcXFxcXFwiLFxcXFxcXFwiKSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnICs9IFxcXFxcXFwiIOenu+mZpFxcXFxcXFwiICsgZGxpc3QubGVuZ3RoICsgXFxcXFxcXCLkuKrmupBcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0KG1zZyArIFxcXFxcXFwiIOabtOWkmuivpuaDheeci2xvZ1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QoXFxcXFxcXCLlt7LliLfmlrBcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbn1cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJkcnB5566h55CGXFxcIixcXFwicGF0aFxcXCI6XFxcIkRycHlNYW5hZ2VcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCBKU0VuZ2luZSA9IGNvbS5leGFtcGxlLmhpa2Vydmlldy5zZXJ2aWNlLnBhcnNlci5KU0VuZ2luZTtcXFxcbmNvbnN0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcXFxcXCJydW50aW1lQ29uZmlnXFxcXFxcXCIpO1xcXFxuY29uc3QgZHJweU1hcCA9IG5ldyBNYXAoKTtcXFxcbmNvbnN0IEdNa2V5ID0gbW9kdWxlLmltcG9ydFBhcmFtO1xcXFxubG9nKFxcXFxcXFwi5Yid5aeL5YyWRHJweU1hbmFnZVxcXFxcXFwiKTtcXFxcblxcXFxuZnVuY3Rpb24gYnVpbGRKc0Vudih0aWNrZXQpIHtcXFxcbiAgICBsZXQgY29kZSA9IFN0cmluZy5yYXcgYFxcXFxuICAgIC8vIGNvbnN0IG15X3J1bGUgPSAnXFxcXG4gICAgY29uc3QgTVlfUlVMRSA9ICR7bXlfcnVsZX07XFxcXG4gICAgY29uc3QgbXlfcnVsZSA9IEpTT04uc3RyaW5naWZ5KE1ZX1JVTEUpO1xcXFxuICAgIGNvbnN0IE1ZX1RJQ0tFVCA9IFxcXFxcXFwiJHt0aWNrZXR8fFxcXFxcXFwiXFxcXFxcXCJ9XFxcXFxcXCI7XFxcXG4gICAgZXZhbChnZXRKc1BsdWdpbigpKTtcXFxcbiAgICBldmFsKGdldEpzTGF6eVBsdWdpbigpKTtcXFxcbiAgICBgO1xcXFxuICAgIHJldHVybiBjb2RlO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBzeW5jKGZ1bmMsIHNwKSB7XFxcXG4gICAgcmV0dXJuIG5ldyBvcmcubW96aWxsYS5qYXZhc2NyaXB0LlN5bmNocm9uaXplcihmdW5jLCBzcCB8fCB7fSk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGNyZWF0ZURycHkoa2V5KSB7XFxcXG4gICAgSlNFbmdpbmUuZ2V0SW5zdGFuY2UoKS5ldmFsSlMoYnVpbGRKc0VudihNWV9USUNLRVQpICsgXFxcXFxcXCJcXFxcXFxcXG4hXFxcXFxcXCIgKyAkLnRvU3RyaW5nKChrZXksIEdNa2V5LCBNWV9USUNLRVQpID0+IHtcXFxcbiAgICAgICAgbGV0IGRycHkgPSAkLnJlcXVpcmUoXFxcXFxcXCJkcnB5XFxcXFxcXCIpO1xcXFxuICAgICAgICBHTS5oYXMoR01rZXksIChEcnB5TWFuYWdlKSA9PiB7XFxcXG4gICAgICAgICAgICBEcnB5TWFuYWdlLnB1dChrZXksIGRycHkpO1xcXFxuICAgICAgICB9KTtcXFxcbiAgICB9LCBrZXksIEdNa2V5LCBNWV9USUNLRVQpICsgXFxcXFxcXCI7XFxcXFxcXFxuXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIsIGZhbHNlKTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0KGtleSkge1xcXFxuICByZXR1cm4gc3luYygoKSA9PiB7XFxcXG4gICAgLy9sb2coZHJweU1hcC5zaXplKVxcXFxuICAgIGlmIChkcnB5TWFwLmhhcyhrZXkpKSB7XFxcXG4gICAgICByZXR1cm4gZHJweU1hcC5nZXQoa2V5KTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKGRycHlNYXAuc2l6ZSA+PSA1KSB7XFxcXG4gICAgICBsb2coXFxcXFxcXCLor7fmsYI6XFxcXFxcXCIgKyBrZXkpXFxcXG4gICAgICBkZWwoQXJyYXkuZnJvbShkcnB5TWFwLmtleXMoKSkuYXQoMCkpO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRBbGxTb3VyY2VzKCkuZmluZCh2ID0+IHYua2V5ID09PSBrZXkpO1xcXFxuICAgIGNyZWF0ZURycHkoa2V5KTtcXFxcbiAgICBsZXQgZHJweSA9IGRycHlNYXAuZ2V0KGtleSk7XFxcXG4gICAgZHJweS5pbml0KHJ1bnRpbWVDb25maWcuZ2V0QWJzb2x1dGVQYXRoKHNvdXJjZS5leHQpKTtcXFxcbiAgICByZXR1cm4gZHJweTtcXFxcbiAgfSwgdGhpcykuY2FsbCgpO1xcXFxufVxcXFxuLy9zb3VyY2UuZXh05b+F6aG75Li657ud5a+56Lev5b6EXFxcXG5mdW5jdGlvbiBnZXRCeVNvdXJjZShzb3VyY2Upe1xcXFxuICAgIHJldHVybiBzeW5jKCgpID0+IHtcXFxcbiAgICAgICAgbGV0IGtleT1zb3VyY2Uua2V5O1xcXFxuICAgICAgICAvL2xvZyhkcnB5TWFwLnNpemUpXFxcXG4gICAgICAgIGlmIChkcnB5TWFwLmhhcyhrZXkpKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gZHJweU1hcC5nZXQoa2V5KTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoZHJweU1hcC5zaXplID49IDUpIHtcXFxcbiAgICAgICAgICAgIGxvZyhcXFxcXFxcIuivt+axgjpcXFxcXFxcIiArIGtleSlcXFxcbiAgICAgICAgICAgIGRlbChBcnJheS5mcm9tKGRycHlNYXAua2V5cygpKS5hdCgwKSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgY3JlYXRlRHJweShrZXkpO1xcXFxuICAgICAgICBsZXQgZHJweSA9IGRycHlNYXAuZ2V0KGtleSk7XFxcXG4gICAgICAgIGRycHkuaW5pdChzb3VyY2UuZXh0KTtcXFxcbiAgICAgICAgcmV0dXJuIGRycHk7XFxcXG4gICAgfSwgdGhpcykuY2FsbCgpO1xcXFxufVxcXFxuZnVuY3Rpb24gcHV0KGtleSwgZHJweSkge1xcXFxuICAgIHN5bmMoKCkgPT4gZHJweU1hcC5zZXQoa2V5LCBkcnB5KSwgdGhpcykuY2FsbCgpO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBkZWwoa2V5KSB7XFxcXG4gICAgc3luYygoKSA9PiB7XFxcXG4gICAgICAgIGxvZyhcXFxcXFxcIuWIoOmZpFxcXFxcXFwiICsga2V5KTtcXFxcbiAgICAgICAgaWYgKGRycHlNYXAuaGFzKGtleSkpIHtcXFxcbiAgICAgICAgICAgIGRycHlNYXAuZGVsZXRlKGtleSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LCB0aGlzKS5jYWxsKCk7XFxcXG59XFxcXG5sZXQgaXNJbml0SG9tZSA9IGZhbHNlO1xcXFxuLy9sZXQgaXNJbml0U2VhcmNoID0gZmFsc2U7XFxcXG5sZXQgaXNJbml0RXJQYWdlID0gZmFsc2U7XFxcXG5cXFxcbmZ1bmN0aW9uIGluaXRQYWdlKHR5cGUpIHtcXFxcbiAgICBzd2l0Y2ggKHR5cGUpIHtcXFxcbiAgICAgICAgY2FzZSBcXFxcXFxcImhvbWVcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgIGlzSW5pdEhvbWUgPSB0cnVlO1xcXFxuICAgICAgICAgICAgLy9jYXNlIFxcXFxcXFwic2VhcmNoXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAvLyAgICBpc0luaXRTZWFyY2ggPSB0cnVlO1xcXFxuICAgICAgICBjYXNlIFxcXFxcXFwiZXJcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgIGlzSW5pdGVyUGFnZSA9IHRydWU7XFxcXG4gICAgfVxcXFxuICAgIGFkZExpc3RlbmVyKFxcXFxcXFwib25DbG9zZVxcXFxcXFwiLCAkLnRvU3RyaW5nKChHTWtleSwgdHlwZSkgPT4ge1xcXFxuICAgICAgICBsb2coXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIpO1xcXFxuICAgICAgICBHTS5oYXMoR01rZXksIERycHlNYW5hZ2UgPT4ge1xcXFxuICAgICAgICAgICAgbG9nKFxcXFxcXFwi5pyJR01rZXlcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBEcnB5TWFuYWdlLmNsZWFyKHR5cGUpO1xcXFxuICAgICAgICB9KTtcXFxcbiAgICB9LCBHTWtleSwgdHlwZSkpO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBjbGVhcih0eXBlKSB7XFxcXG4gICAgc3dpdGNoICh0eXBlKSB7XFxcXG4gICAgICAgIGNhc2UgXFxcXFxcXCJob21lXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICBpc0luaXRIb21lID0gZmFsc2U7XFxcXG4gICAgICAgIC8vY2FzZSBcXFxcXFxcInNlYXJjaFxcXFxcXFwiOlxcXFxuICAgICAgICAvLyAgICBpc0luaXRTZWFyY2ggPSBmYWxzZTtcXFxcbiAgICAgICAgY2FzZSBcXFxcXFxcImVyXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICBpc0luaXRlclBhZ2UgPSBmYWxzZTtcXFxcbiAgICB9XFxcXG5cXFxcbiAgICBpZiAoIWlzSW5pdEhvbWUgJiYgIWlzSW5pdEVyUGFnZSkge1xcXFxuICAgICAgICBsb2coXFxcXFxcXCLlvIDlp4vmuIXnkIZcXFxcXFxcIik7XFxcXG4gICAgICAgIGRycHlNYXAuY2xlYXIoKTtcXFxcbiAgICAgICAgR00uY2xlYXIoR01rZXkpO1xcXFxuICAgIH1cXFxcbn1cXFxcbiQuZXhwb3J0cyA9IHtcXFxcbiAgICBpbml0UGFnZSxcXFxcbiAgICBnZXQsXFxcXG4gICAgZ2V0QnlTb3VyY2UsXFxcXG4gICAgZGVsLFxcXFxuICAgIGNsZWFyLFxcXFxuICAgIHB1dFxcXFxufVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuaMh+WumuaQnOe0ouW8ueeql1xcXCIsXFxcInBhdGhcXFwiOlxcXCJTZWFyY2hBbGxvd1BvcFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbiQuZXhwb3J0cy5zaG93ID0gZnVuY3Rpb24gKCkge1xcXFxuICBjb25zdCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXFxcXFwicnVudGltZUNvbmZpZ1xcXFxcXFwiLCBcXFxcXFxcInJ1bnRpbWVDb25maWdcXFxcXFxcIik7XFxcXG4gIGNvbnN0IGhpa2VyUG9wID0gJC5yZXF1aXJlKFxcXFxcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9Njk2NlxcXFxcXFwiKTtcXFxcbiAgbGV0IHNlYXJjaEFsbG93ID0gcnVudGltZUNvbmZpZy5nZXRTZWFyY2hBbGxvdygpO1xcXFxuXFxcXG4gIGxldCBjYW5TZWFyY2hTb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldENhblNlYXJjaFNvdXJjZSgpO1xcXFxuICAvL2xldCBzb3VyY2VOYW1lTGlzdCA9IGNhblNlYXJjaFNvdXJjZS5tYXAodj0+di5uYW1lKTtcXFxcbiAgbGV0IGdldE5hbWVzID0gKCkgPT4gZHluYW1pY1NvdXJjZS5tYXAodiA9PiBzZWFyY2hBbGxvdy5pbmNsdWRlcyh2LmtleSkgPyBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgKHYubmFtZSArIFxcXFxcXFwiXFxcXFxcXCIpLmZvbnRjb2xvcihcXFxcXFxcIiMwMDk5NjZcXFxcXFxcIikgOiB2Lm5hbWUpO1xcXFxuICBsZXQgc3BlbiA9IDM7XFxcXG5cXFxcbiAgLy9sZXQgZHluYW1pY05hbWVzID0gc291cmNlTmFtZUxpc3Quc2xpY2UoKTtcXFxcbiAgbGV0IGR5bmFtaWNTb3VyY2UgPSBjYW5TZWFyY2hTb3VyY2Uuc2xpY2UoKTtcXFxcbiAgbGV0IHNlYXJjaG9uY291bnQgPSBkeW5hbWljU291cmNlLmZpbHRlcih2ID0+IHNlYXJjaEFsbG93LmluY2x1ZGVzKHYua2V5KSkubGVuZ3RoO1xcXFxuICBpZiAoc2VhcmNob25jb3VudCA9PSAwKSB7XFxcXG4gICAgc2VhcmNob25jb3VudCA9IGNhblNlYXJjaFNvdXJjZS5sZW5ndGg7XFxcXG4gIH1cXFxcblxcXFxuICBsZXQgc2VhcmNoS2V5ID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgaGlrZXJQb3Auc2VsZWN0Qm90dG9tUmVzKHtcXFxcbiAgICBvcHRpb25zOiBnZXROYW1lcygpLFxcXFxuICAgIGNvbHVtbnM6IHNwZW4sXFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5ZCv55So5pCc57Si5rqQOlxcXFxcXFwiICsgc2VhcmNob25jb3VudCArIFxcXFxcXFwi5LiqIOWFsTpcXFxcXFxcIiArIGNhblNlYXJjaFNvdXJjZS5sZW5ndGggKyBcXFxcXFxcIuS4quaQnOe0oua6kFxcXFxcXFwiLFxcXFxuICAgIG5vQXV0b0Rpc21pc3M6IHRydWUsXFxcXG4gICAgcG9zaXRpb246IDEsXFxcXG4gICAgaGVpZ2h0OiAuOSxcXFxcbiAgICBleHRyYUlucHV0Qm94OiBuZXcgaGlrZXJQb3AuUmVzRXh0cmFJbnB1dEJveCh7XFxcXG4gICAgICBoaW50OiBcXFxcXFxcIua6kOWFs+mUruWtlyDlpJrkuKrnlKh86ZqU5byAXFxcXFxcXCIsXFxcXG4gICAgICB0aXRsZTogXFxcXFxcXCJva1xcXFxcXFwiLFxcXFxuICAgICAgb25DaGFuZ2UodGV4dCwgbWFuYWdlKSB7XFxcXG4gICAgICAgIC8vbG9nKFxcXFxcXFwib25DaGFuZ2U6XFxcXFxcXCIrdGV4dClcXFxcbiAgICAgICAgc2VhcmNoS2V5ID0gdGV4dDtcXFxcbiAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXFxcbiAgICAgICAgZHluYW1pY1NvdXJjZS5sZW5ndGggPSAwO1xcXFxuICAgICAgICBpZiAodGV4dCkge1xcXFxuICAgICAgICAgIGNhblNlYXJjaFNvdXJjZS5mb3JFYWNoKCh2LCBpKSA9PiB7XFxcXG4gICAgICAgICAgICBpZiAodGV4dC5zcGxpdCgvXFxcXFxcXFx8LykuZmlsdGVyKGYgPT4gZikuc29tZSh4ID0+IHYubmFtZS5pbmNsdWRlcyh4KSkpIHtcXFxcbiAgICAgICAgICAgICAgZHluYW1pY1NvdXJjZS5wdXNoKHYpO1xcXFxuICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHNlYXJjaEFsbG93LmluY2x1ZGVzKHYua2V5KSA/IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyAodi5uYW1lICsgXFxcXFxcXCJcXFxcXFxcIikuZm9udGNvbG9yKFxcXFxcXFwiIzAwOTk2NlxcXFxcXFwiKSA6IHYubmFtZSlcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICBkeW5hbWljU291cmNlID0gY2FuU2VhcmNoU291cmNlLnNsaWNlKCk7XFxcXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihtYW5hZ2UubGlzdCwgZ2V0TmFtZXMoKSk7XFxcXG5cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxcXG4gICAgICB9LFxcXFxuICAgICAgZGVmYXVsdFZhbHVlOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgY2xpY2socywgbWFuYWdlKSB7XFxcXG4gICAgICAgIC8vdG9hc3Qocyk7XFxcXG4gICAgICAgIC8vbG9nKG1hbmFnZS5saXN0KTtcXFxcbiAgICAgIH0sXFxcXG4gICAgICB0aXRsZVZpc2libGU6IGZhbHNlXFxcXG4gICAgfSksXFxcXG4gICAgY2xpY2socywgaSwgbWFuYWdlKSB7XFxcXG5cXFxcbiAgICAgIGxldCBrZXkgPSBkeW5hbWljU291cmNlW2ldLmtleTtcXFxcbiAgICAgIGxldCBpbmRleCA9IC0xO1xcXFxuICAgICAgaWYgKChpbmRleCA9IHNlYXJjaEFsbG93LmluZGV4T2Yoa2V5KSkgIT09IC0xKSB7XFxcXG4gICAgICAgIG1hbmFnZS5saXN0W2ldID0gZHluYW1pY1NvdXJjZVtpXS5uYW1lO1xcXFxuICAgICAgICBzZWFyY2hBbGxvdy5zcGxpY2UoaW5kZXgsIDEpO1xcXFxuICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgbWFuYWdlLmxpc3RbaV0gPSBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgKGR5bmFtaWNTb3VyY2VbaV0ubmFtZSArIFxcXFxcXFwiXFxcXFxcXCIpLmZvbnRjb2xvcihcXFxcXFxcIiMwMDk5NjZcXFxcXFxcIik7XFxcXG4gICAgICAgIHNlYXJjaEFsbG93LnB1c2goa2V5KTtcXFxcbiAgICAgIH1cXFxcblxcXFxuICAgICAgcnVudGltZUNvbmZpZy5zZXRTZWFyY2hBbGxvdygpO1xcXFxuICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcXFxuICAgIH0sXFxcXG4gICAgbWVudUNsaWNrKG1hbmFnZSkge1xcXFxuICAgICAgaGlrZXJQb3Auc2VsZWN0Q2VudGVyKHtcXFxcbiAgICAgICAgb3B0aW9uczogW1xcXFxcXFwi5pS55Y+Y5qC35byPXFxcXFxcXCIsIFxcXFxcXFwi562b6YCJ5rqQXFxcXFxcXCIsIFxcXFxcXFwi6Ieq54S25o6S5bqPXFxcXFxcXCIsIFxcXFxcXFwi5YCS5bqPXFxcXFxcXCIsIFxcXFxcXFwi5YWo6YCJXFxcXFxcXCIsIFxcXFxcXFwi5Y+N6YCJXFxcXFxcXCJdLFxcXFxuICAgICAgICBjb2x1bW5zOiAyLFxcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLor7fpgInmi6lcXFxcXFxcIixcXFxcbiAgICAgICAgY2xpY2socywgaSkge1xcXFxuICAgICAgICAgIGlmIChpID09PSAwKSB7XFxcXG4gICAgICAgICAgICBzcGVuID0gc3BlbiA9PSAzID8gMSA6IDM7XFxcXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlQ29sdW1ucyhzcGVuKTtcXFxcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDEpIHtcXFxcbiAgICAgICAgICAgIGhpa2VyUG9wLmlucHV0Q29uZmlybSh7XFxcXG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFxcXFxcXFwi6L6T5YWl5YWz6ZSu5a2XIOepuuaYvuekuuWFqOmDqFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLnrZvpgInmupBcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgaGludDogXFxcXFxcXCLmupDlhbPplK7lrZcg5aSa5Liq55SofOmalOW8gFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHNlYXJjaEtleSxcXFxcbiAgICAgICAgICAgICAgdGV4dGFyZWE6IGZhbHNlLCAvL+WkmuihjOaooeW8j1xcXFxuICAgICAgICAgICAgICBtYXhUZXh0YXJlYTogdHJ1ZSxcXFxcbiAgICAgICAgICAgICAgbm9BdXRvU29mdDogZmFsc2UsXFxcXG4gICAgICAgICAgICAgIC8vaGlkZUNhbmNlbDogdHJ1ZSxcXFxcbiAgICAgICAgICAgICAgY29uZmlybSh0ZXh0KSB7XFxcXG4gICAgICAgICAgICAgICAgc2VhcmNoS2V5ID0gdGV4dDtcXFxcbiAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcXFxuICAgICAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UubGVuZ3RoID0gMDtcXFxcbiAgICAgICAgICAgICAgICBpZiAodGV4dCkge1xcXFxuICAgICAgICAgICAgICAgICAgY2FuU2VhcmNoU291cmNlLmZvckVhY2goKHYsIGkpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQuc3BsaXQoL1xcXFxcXFxcfC8pLmZpbHRlcihmID0+IGYpLnNvbWUoeCA9PiB2Lm5hbWUuaW5jbHVkZXMoeCkpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgZHluYW1pY1NvdXJjZS5wdXNoKHYpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goc2VhcmNoQWxsb3cuaW5jbHVkZXModi5rZXkpID8gXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArICh2Lm5hbWUgKyBcXFxcXFxcIlxcXFxcXFwiKS5mb250Y29sb3IoXFxcXFxcXCIjMDA5OTY2XFxcXFxcXCIpIDogdi5uYW1lKVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgZHluYW1pY1NvdXJjZSA9IGNhblNlYXJjaFNvdXJjZS5zbGljZSgpO1xcXFxuICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtYW5hZ2UubGlzdCwgZ2V0TmFtZXMoKSk7XFxcXG5cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcXFxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/ovpPlhaXkuoZcXFxcXFxcIiArIHRleHQ7XFxcXG4gICAgICAgICAgICAgIH0sXFxcXG5cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMikge1xcXFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBPYmplY3QuYXNzaWduKFtdLCBtYW5hZ2UubGlzdCk7XFxcXG4gICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcXFxuXFxcXG5cXFxcbiAgICAgICAgICAgIGR5bmFtaWNTb3VyY2Uuc29ydCgoYSwgYikgPT4ge1xcXFxuICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGEubmFtZSkubG9jYWxlQ29tcGFyZShTdHJpbmcoYi5uYW1lKSwgdW5kZWZpbmVkLCB7XFxcXG4gICAgICAgICAgICAgICAgbnVtZXJpYzogdHJ1ZSxcXFxcbiAgICAgICAgICAgICAgICBzZW5zaXRpdml0eTogJ2Jhc2UnXFxcXG4gICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1hbmFnZS5saXN0LCBnZXROYW1lcygpKTtcXFxcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXFxcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMykge1xcXFxuICAgICAgICAgICAgbWFuYWdlLmxpc3QucmV2ZXJzZSgpO1xcXFxuICAgICAgICAgICAgZHluYW1pY1NvdXJjZS5yZXZlcnNlKCk7XFxcXG5cXFxcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXFxcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gNCkge1xcXFxuICAgICAgICAgICAgZHluYW1pY1NvdXJjZS5mb3JFYWNoKHYgPT4ge1xcXFxuICAgICAgICAgICAgICBpZiAoIXNlYXJjaEFsbG93LmluY2x1ZGVzKHYpKSB7XFxcXG4gICAgICAgICAgICAgICAgc2VhcmNoQWxsb3cucHVzaCh2LmtleSk7XFxcXG4gICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtYW5hZ2UubGlzdCwgZ2V0TmFtZXMoKSk7XFxcXG4gICAgICAgICAgICBydW50aW1lQ29uZmlnLnNldFNlYXJjaEFsbG93KCk7XFxcXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxcXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDUpIHtcXFxcbiAgICAgICAgICAgIGxldCB0ZW1saXN0ID0gc2VhcmNoQWxsb3cuc2xpY2UoKTtcXFxcbiAgICAgICAgICAgIHNlYXJjaEFsbG93Lmxlbmd0aCA9IDA7XFxcXG4gICAgICAgICAgICBkeW5hbWljU291cmNlLmZvckVhY2godiA9PiB7XFxcXG4gICAgICAgICAgICAgIGlmICh0ZW1saXN0LmluY2x1ZGVzKHYua2V5KSkgcmV0dXJuO1xcXFxuICAgICAgICAgICAgICBzZWFyY2hBbGxvdy5wdXNoKHYua2V5KTtcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtYW5hZ2UubGlzdCwgZ2V0TmFtZXMoKSk7XFxcXG4gICAgICAgICAgICBydW50aW1lQ29uZmlnLnNldFNlYXJjaEFsbG93KCk7XFxcXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxcXG4gICAgICAgICAgfVxcXFxuICAgICAgICB9LFxcXFxuICAgICAgfSk7XFxcXG4gICAgfVxcXFxuICB9KTtcXFxcbn1cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLliIbnsbtcXFwiLFxcXCJwYXRoXFxcIjpcXFwiY2F0ZWdvcnlzXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IGZsID0ge307XFxcXG5sZXQgcmVzdWx0cyA9IFtdO1xcXFxubGV0IGhvbWVsaXN0ID0gW107XFxcXG5sZXQgY2F0ZSA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG5cXFxcbmZ1bmN0aW9uIGdldENhdGVnb3J5cyhsYXlvdXQsZHJweSwgcGFnZSkge1xcXFxuICBsZXQgcnVsZT1kcnB5LnJ1bk1haW4oJ2Z1bmN0aW9uIG1haW4oKXtyZXR1cm4gcnVsZX0nKTtcXFxcbiAgbGV0IGxvYWRpPWxheW91dC5maW5kSW5kZXgoeD0+eC5leHRyYSYmeC5leHRyYS5pZD09TVlfUlVMRS50aXRsZStcXFxcXFxcImxvYWRcXFxcXFxcIik7XFxcXG4gIGlmKHJ1bGUu5LiA57qnPT1cXFxcXFxcIlxcXFxcXFwifHxydWxlLuS4gOe6pz09dW5kZWZpbmVkKXtcXFxcbiAgICBpZiAobG9hZGkgIT0gLTEpIHtcXFxcbiAgICAgIGxheW91dC5zcGxpY2UobG9hZGksIDEpXFxcXG4gICAgfVxcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJsaW5rc1xcXFxcXFwiKTtcXFxcbiAgICBsYXlvdXQubGVuZ3RoPTA7XFxcXG4gICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwi6K+l5rqQ5Li65pCc57Si5rqQ77yM5LuF6IO96YCa6L+H5pCc57Si6K6/6Zeu5pWw5o2uXFxcXFxcXCIpXFxcXG4gIH1cXFxcbiAgdmFyIGdldFJhbmdlQ29sb3JzID0gZnVuY3Rpb24gKCkge1xcXFxuICAgIHJldHVybiAnIycgKyAoJzAwMDAwJyArIChNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwIDw8IDApLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC02KTtcXFxcbiAgfVxcXFxuICBsZXQgY2F0ZWdvcnlzID0gSlNPTi5wYXJzZShkcnB5LmhvbWUoKSk7XFxcXG4gIGxldCBmaWx0ZXJzID0gY2F0ZWdvcnlzLmZpbHRlcnM7XFxcXG4gIGxldCBjYXRlcyA9IGNhdGVnb3J5cy5jbGFzcyB8fCBbXTtcXFxcbiAgaWYgKHBhZ2UgPT0gMSkge1xcXFxuICAgIGhvbWVsaXN0ID0gSlNPTi5wYXJzZShkcnB5LmhvbWVWb2QoKSkubGlzdDtcXFxcbiAgICBpZiAoaG9tZWxpc3QgIT0gdW5kZWZpbmVkICYmIGhvbWVsaXN0Lmxlbmd0aCkge1xcXFxuICAgICAgcHV0TXlWYXIoXFxcXFxcXCJpc2hvbWVcXFxcXFxcIiwgXFxcXFxcXCIxXFxcXFxcXCIpO1xcXFxuICAgIH1cXFxcbiAgfVxcXFxuICBpZiAoY2F0ZXMubGVuZ3RoID09IDAgJiYgKGhvbWVsaXN0ID09IHVuZGVmaW5lZCB8fCBob21lbGlzdC5sZW5ndGggPT0gMCkpIHtcXFxcbiAgICBpZiAobG9hZGkgIT0gLTEpIHtcXFxcbiAgICAgIGxheW91dC5zcGxpY2UobG9hZGksIDEpXFxcXG4gICAgfVxcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJsaW5rc1xcXFxcXFwiKTtcXFxcbiAgICBsYXlvdXQubGVuZ3RoPTA7XFxcXG4gICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwi5YiG57G76I635Y+W5aSx6LSl5Y+v6IO9572R57uc6Zeu6aKYXFxcXFxcXCIpO1xcXFxuICB9XFxcXG4gIGlmIChnZXRNeVZhcihcXFxcXFxcImlzaG9tZVxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIikgPT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICBjYXRlcy51bnNoaWZ0KHtcXFxcbiAgICAgIHR5cGVfbmFtZTogJ+aOqOiNkCcsXFxcXG4gICAgICB0eXBlX2lkOiAnaG9tZScsXFxcXG4gICAgfSlcXFxcbiAgfVxcXFxuICBpZihsb2FkaSE9LTEpe1xcXFxuICAgICAgbGF5b3V0LnNwbGljZShsb2FkaSwxKVxcXFxuICB9XFxcXG4gIHB1dE15VmFyKFxcXFxcXFwibGlua3NcXFxcXFxcIixcXFxcXFxcIjFcXFxcXFxcIik7XFxcXG4gIGxldCBjYXRlaSA9IGdldE15VmFyKFxcXFxcXFwiY2F0ZWlcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICBjYXRlID0gY2F0ZXNbY2F0ZWldLnR5cGVfaWQ7XFxcXG5cXFxcbiAgdmFyIGZvbGQgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXFxcXFwiZm9sZFxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG4gIGxldCBjb2xvciA9IGdldFJhbmdlQ29sb3JzKCk7XFxcXG5cXFxcbiAgaWYgKHBhZ2UgPT0gMSkge1xcXFxuICAgIGNhdGVzLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXFxcbiAgICAgIGxldCB0ID0gY2F0ZWkgPT0gaSA/IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBcXFxcXFxcIjxiPlxcXFxcXFwiK2l0ZW0udHlwZV9uYW1lLmZvbnRjb2xvcihjb2xvcikgK1xcXFxcXFwiPC9iPlxcXFxcXFwiOiBpdGVtLnR5cGVfbmFtZTtcXFxcbiAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IHQsXFxcXG4gICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSwgdGlkKSA9PiB7XFxcXG4gICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCJjYXRlaVxcXFxcXFwiLCBpKTtcXFxcbiAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgaSwgaXRlbS50eXBlX2lkKSxcXFxcbiAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICB0aWQ6IGl0ZW0udHlwZV9pZCxcXFxcbiAgICAgICAgICBhY3RpdmU6IGNhdGVpID09IGkgPyB0cnVlIDogZmFsc2UsXFxcXG4gICAgICAgIH1cXFxcbiAgICAgIH0pXFxcXG4gICAgfSlcXFxcbiAgfVxcXFxuXFxcXG4gIGlmIChjYXRlICE9ICdob21lJyAmJiBwYWdlID09IDEpIHtcXFxcbiAgICBsZXQgaG9tZWkgPSBsYXlvdXQuZmluZEluZGV4KHggPT4ge1xcXFxuICAgICAgcmV0dXJuIHguZXh0cmEgJiYgeC5leHRyYS50aWQgPT0gXFxcXFxcXCJob21lXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBpZiAoaG9tZWkgPT0gLTEpIHtcXFxcbiAgICAgIGhvbWVpID0gbGF5b3V0LmZpbmRJbmRleCh4ID0+IHtcXFxcbiAgICAgICAgcmV0dXJuIHguZXh0cmEgJiYgeC5leHRyYS50aWQ7XFxcXG4gICAgICB9KSAtIDE7XFxcXG4gICAgfVxcXFxuICAgIGlmIChmaWx0ZXJzICYmIGZpbHRlcnMuaGFzT3duUHJvcGVydHkoY2F0ZSkpIHtcXFxcbiAgICAgIGlmIChob21laSAhPSAtMSkge1xcXFxuICAgICAgICBsYXlvdXQuc3BsaWNlKGhvbWVpICsgMSwgMCwge1xcXFxuICAgICAgICAgIHRpdGxlOiBmb2xkID09IFxcXFxcXFwiMFxcXFxcXFwiID8gXFxcXFxcXCLigJzigJzigJ3igJ08Yj5cXFxcXFxcIiArIFxcXFxcXFwi4oinXFxcXFxcXCIuZm9udGNvbG9yKFxcXFxcXFwiIzFhYWQxOVxcXFxcXFwiKSArIFxcXFxcXFwiPC9iPlxcXFxcXFwiIDogXFxcXFxcXCLigJzigJzigJ3igJ08Yj5cXFxcXFxcIiArIFxcXFxcXFwi4oioXFxcXFxcXCIuZm9udGNvbG9yKFxcXFxcXFwiI0ZGMDAwMFxcXFxcXFwiKSArIFxcXFxcXFwiPC9iPlxcXFxcXFwiLFxcXFxuICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIixcXFxcbiAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoZm9sZCkgPT4ge1xcXFxuICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFxcXFxcImZvbGRcXFxcXFxcIiwgZm9sZCA9PSBcXFxcXFxcIjBcXFxcXFxcIiA/IFxcXFxcXFwiMVxcXFxcXFwiIDogXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgICB9LCBmb2xkKSxcXFxcbiAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcXFxcbiAgICAgICAgICB9XFxcXG4gICAgICAgIH0pXFxcXG4gICAgICB9XFxcXG5cXFxcbiAgICAgIGxldCBhY3RpdmVpID0gbGF5b3V0LmZpbmRJbmRleCh4ID0+IHguZXh0cmEgJiYgeC5leHRyYS5hY3RpdmUpO1xcXFxuICAgICAgaWYgKGFjdGl2ZWkgIT0gLTEpIHtcXFxcbiAgICAgICAgbGF5b3V0LnNwbGljZShhY3RpdmVpLCAwLCB7XFxcXG4gICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyAn8J+MgCcsXFxcXG4gICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGMpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBjYXRlX29iaiA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXFxcXFwiY2F0ZV9vYmpcXFxcXFxcIiwge30pO1xcXFxuICAgICAgICAgICAgZGVsZXRlIGNhdGVfb2JqW2NdO1xcXFxuICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcXFxcXCJjYXRlX29ialxcXFxcXFwiLCBjYXRlX29iaik7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/muIXpmaTlrozmiJBcXFxcXFxcIjtcXFxcbiAgICAgICAgICB9LCBjYXRlKVxcXFxuICAgICAgICB9KVxcXFxuICAgICAgfVxcXFxuXFxcXG4gICAgICBsZXQgY2xhc3NpZnkgPSBmaWx0ZXJzW2NhdGVdO1xcXFxuICAgICAgdmFyIGluaXRfY2F0ZSA9IG5ldyBBcnJheShjbGFzc2lmeS5sZW5ndGgpLmZpbGwoXFxcXFxcXCItMVxcXFxcXFwiKTtcXFxcbiAgICAgIGxldCBjYXRlX29iaiA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXFxcXFwiY2F0ZV9vYmpcXFxcXFxcIiwge30pO1xcXFxuICAgICAgY2F0ZV9vYmpbY2F0ZV0gPSBjYXRlX29ialtjYXRlXSA/IGNhdGVfb2JqW2NhdGVdIDogaW5pdF9jYXRlXFxcXG4gICAgICB2YXIgY2F0ZV90ZW1wID0gY2F0ZV9vYmpbY2F0ZV07XFxcXG4gICAgICAvL3ZhciBmaWx0ZXJfZGVmPXN0b3JhZ2UwLmdldEl0ZW0oXFxcXFxcXCJmaWx0ZXJfZGVmXFxcXFxcXCIsIHt9KTtcXFxcbiAgICAgIGNsYXNzaWZ5LmZvckVhY2goKHgsIGluZGV4KSA9PiB7XFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICBjb2xfdHlwZTogJ2JsYW5rX2Jsb2NrJ1xcXFxuICAgICAgICB9KVxcXFxuICAgICAgICB4LnZhbHVlLmZvckVhY2goKGl0LCBpKSA9PiB7XFxcXG4gICAgICAgICAgbGV0IHQgPSBpdC5uO1xcXFxuICAgICAgICAgIGlmIChjYXRlX3RlbXBbaW5kZXhdID09IGkpIHtcXFxcbiAgICAgICAgICAgIHQgPSBcXFxcXFxcIjxiPjxmb250IGNvbG9yPVxcXFxcXFwiICsgY29sb3IgKyBcXFxcXFxcIj5cXFxcXFxcIiArIHQgKyBcXFxcXFxcIjwvZm9udD48L2I+XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBmbFt4LmtleV0gPSBpdC52O1xcXFxuICAgICAgICAgIH1cXFxcbiAgICAgICAgICBpZiAoY2F0ZV90ZW1wW2luZGV4XSA9PSBcXFxcXFxcIi0xXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIGZsW3gua2V5XSA9IFxcXFxcXFwidW5kZWZpbmVkXFxcXFxcXCI7XFxcXG4gICAgICAgICAgfVxcXFxuICAgICAgICAgIGlmIChmb2xkID09IDEpIHtcXFxcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgdCxcXFxcbiAgICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKG8pID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgaSA9IG8uaTtcXFxcbiAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFxcXFxcImlzX2RlZlxcXFxcXFwiLCBcXFxcXFxcIjFcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGNhdGVfb2JqID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcXFxcXCJjYXRlX29ialxcXFxcXFwiLCB7fSk7XFxcXG5cXFxcbiAgICAgICAgICAgICAgICBsZXQgY2F0ZV90ZW1wID0gby5jYXRlX3RlbXA7XFxcXG4gICAgICAgICAgICAgICAgaWYgKGNhdGVfdGVtcC5jb25zdHJ1Y3RvciAhPSBBcnJheSkge1xcXFxuICAgICAgICAgICAgICAgICAgY2F0ZV90ZW1wID0gW107XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IG8uaW5kZXg7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGMgPSBjYXRlX3RlbXBbaW5kZXhdIHx8IFxcXFxcXFwiLTFcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAvL2xvZyhjKVxcXFxuICAgICAgICAgICAgICAgIGlmIChjID09IGkpIHtcXFxcbiAgICAgICAgICAgICAgICAgIG8uY2F0ZV90ZW1wW2luZGV4XSA9IFxcXFxcXFwiLTFcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgby5jYXRlX3RlbXBbaW5kZXhdID0gaSArIFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGNhdGVfb2JqW28uY2F0ZV0gPSBjYXRlX3RlbXA7XFxcXG4gICAgICAgICAgICAgICAgLy9sb2coY2F0ZV90ZW1wKVxcXFxuICAgICAgICAgICAgICAgIC8vc3RvcmFnZTAucHV0TXlWYXIoXFxcXFxcXCJjYXRlX3RlbXBcXFxcXFxcIiwgY2F0ZV90ZW1wKTtcXFxcbiAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFxcXFxcImNhdGVfb2JqXFxcXFxcXCIsIGNhdGVfb2JqKTtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgfSwge1xcXFxuICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcXFxcbiAgICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXFxcbiAgICAgICAgICAgICAgICBpOiBpLFxcXFxuICAgICAgICAgICAgICAgIGNhdGU6IGNhdGVcXFxcbiAgICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgICAgICAgICB9KVxcXFxuICAgICAgICAgIH1cXFxcbiAgICAgICAgfSlcXFxcbiAgICAgIH0pXFxcXG4gICAgfVxcXFxuICB9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdldEZsKCkge1xcXFxuICBmbCA9IE9iamVjdC5rZXlzKGZsKS5maWx0ZXIoa2V5ID0+IGZsW2tleV0gIT09IFxcXFxcXFwidW5kZWZpbmVkXFxcXFxcXCIpLnJlZHVjZSgocmVzLCBrZXkpID0+IHtcXFxcbiAgICByZXNba2V5XSA9IGZsW2tleV07XFxcXG4gICAgcmV0dXJuIHJlcztcXFxcbiAgfSwge30pO1xcXFxuICByZXR1cm4gZmxcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0Q2F0ZUxpc3QoKSB7XFxcXG4gIHJldHVybiB7XFxcXG4gICAgY2F0ZSxcXFxcbiAgICBob21lbGlzdFxcXFxuICB9XFxcXG59XFxcXG5cXFxcblxcXFxuJC5leHBvcnRzID0ge1xcXFxuICBnZXRjYXRlbGlzdDogZ2V0Q2F0ZUxpc3QsXFxcXG4gIGdldGNhdGVnb3J5czogZ2V0Q2F0ZWdvcnlzLFxcXFxuICBnZXRmbDogZ2V0RmxcXFxcbn1cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLmnKzlnLDop4TliJnnrqHnkIZcXFwiLFxcXCJwYXRoXFxcIjpcXFwiTG9jYWxEaXJcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLmlofku7bnrqHnkIZcXFxcXFxcIik7XFxcXG5sZXQgcGF0aCA9IGdldFBhdGgoU3RyaW5nKE1ZX1BBUkFNUy5jcGF0aCkpLnJlcGxhY2UoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxubGV0IGZpbGVTZWxlY3QgPSAkLnJlcXVpcmUoXFxcXFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcXFxcXCIpO1xcXFxuZmlsZVNlbGVjdC5maWxlU2VsZWN0aW9uKHtcXFxcbiAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImVkaXRGaWxlOi8vZmlsZTovL1xcXFxcXFwiICsgUEFUSDtcXFxcbiAgICB9KSxcXFxcbiAgICBtZW1vcnk6IFxcXFxcXFwiZmlsZXBhdGhcXFxcXFxcIixcXFxcbiAgICBmaWxlVHlwZTogXFxcXFxcXCIuanNcXFxcXFxcIixcXFxcbiAgICBleGl0U2VhcmNoUmVmcmVzaDogdHJ1ZSxcXFxcbiAgICBwYXR0ZXJuOiAwLFxcXFxuICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcXFxuICAgIGluaXRpYWxQYXRoOiBwYXRoLFxcXFxufSwgTVlfUEFSQU1TLm5ld1dpbmRvdyA/IFtdIDogW3tcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmlrDnqpflj6PmiZPlvIBcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9Mb2NhbERpciNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBjcGF0aDogTVlfUEFSQU1TLmNwYXRoLFxcXFxuICAgICAgICBuZXdXaW5kb3c6IHRydWUsXFxcXG4gICAgICAgIHdpbmRvd0lkOiBNWV9SVUxFLnRpdGxlICsgXFxcXFxcXCJAZWRpdGZpbGVcXFxcXFxcIixcXFxcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICBwYWdlVGl0bGU6IFxcXFxcXFwi5paH5Lu2566h55CGXFxcXFxcXCJcXFxcbiAgICB9XFxcXG59XSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi6buY6K6k5L+d5a2Y6YCJ5oupXFxcIixcXFwicGF0aFxcXCI6XFxcInNoYXJlZGVmYXVsdHBhdGhcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLkv53lrZjot6/lvoRcXFxcXFxcIik7XFxcXG5sZXQgbGF5b3V0ID0gW107XFxcXG5sZXQgZiA9ICQucmVxdWlyZShcXFxcXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFxcXFxcIik7XFxcXG5hZGRMaXN0ZW5lcihcXFxcXFxcIm9uQ2xvc2VcXFxcXFxcIiwgKCkgPT4ge1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJkcnB5SGlrZXJfc2hhcmVfaW5wdXRcXFxcXFxcIik7XFxcXG59KTtcXFxcblxcXFxubGV0IHBhdGggPSBqb2luVXJsKGdldFBhdGgoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL1xcXFxcXFwiKSwgXFxcXFxcXCIuLi9cXFxcXFxcIi5yZXBlYXQoNSkpLnNsaWNlKDcpO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIumAieaLqVxcXFxcXFwiLFxcXFxuICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXFxcbiAgICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IHRhcmdldCA9IGZpbmRJdGVtKFxcXFxcXFwiZHJweUhpa2VyX3NoYXJlX2lucHV0XFxcXFxcXCIpLmV4dHJhO1xcXFxuICAgICAgICAgICAgdXBkYXRlSXRlbShcXFxcXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXFxcXFwiLCB7XFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogUEFUSFxcXFxuICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgcm9vdERpclBhdGg6IHBhdGgsXFxcXG4gICAgICAgIGluaXRpYWxQYXRoOiBwYXRoLFxcXFxuICAgICAgICBwYXR0ZXJuOiAxXFxcXG4gICAgfSkpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLlgqjlrZjot6/lvoRcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXFxcXFwiZHJweUhpa2VyX3NoYXJlX2lucHV0XFxcXFxcXCIsIGdldFB1YmxpY0l0ZW0oXFxcXFxcXCJEcnB5SGlrZXJAaW5wdXRfcGF0aFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSksXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiZHJweUhpa2VyX3NoYXJlX2lucHV0XFxcXFxcXCIsIGlucHV0KTtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGlkOiBcXFxcXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXFxcXFwiXFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi56Gu6K6kXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGlkKSA9PiB7XFxcXG4gICAgICAgIGxldCBwYXRoID0gZ2V0TXlWYXIoXFxcXFxcXCJkcnB5SGlrZXJfc2hhcmVfaW5wdXRcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG5cXFxcbiAgICAgICAgaWYgKCFwYXRoKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S4jeWPr+S4uuepulxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHNldFB1YmxpY0l0ZW0oXFxcXFxcXCJEcnB5SGlrZXJAaW5wdXRfcGF0aFxcXFxcXFwiLCBwYXRoKTtcXFxcbiAgICAgICAgYmFjayhmYWxzZSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgfSksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxufSk7XFxcXG5zZXRSZXN1bHQobGF5b3V0KTtcXFwifV1cIixcInByb3h5XCI6XCJcIn0iLCJ0aXRsZSI6IuWIm+W7uumFjee9riJ9
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement