Advertisement
xiaomianao666

邀您一起看:「云盘君.简」

Dec 28th, 2024
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥「云盘君.简」@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImdtdE1vZGlmaWVkXCI6MCxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJcIixcImxpc3RUb0NsZWFyQXNzb2NpYXRlZEZLXCI6W10sXCJsaXN0VG9DbGVhclNlbGZGS1wiOltdLFwicGFnZUxpc3RcIjpbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW3peWFt1wiLFwicGF0aFwiOlwidXRpbGl5XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgaG9zdCA9IFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3NcXFwiO1xcbi8vbGV0IGhvc3QgPSBcXFwiaHR0cDovLzE5Mi4xNjguMzEuNDk6ODA3OVxcXCI7XFxubGV0IGhvbWUgPSBiYXNlNjREZWNvZGUoXFxcImFHbHJaWEk2THk5b2IyMWxcXFwiKTtcXG52YXIgYXBpID0ge1xcbiAgICBob3N0OiBob3N0K1xcXCIvaGlrZXJ1bGVcXFwiLFxcbiAgICBub3RpY2VVcmw6XFxcIi9ub3RpY2UvZ2V0XFxcIiwvL+iOt+WPluS7k+W6k+WFrOWRilxcbiAgICB1c2Vyc1VybDogXFxcIi9kZXYvdXNlcnM/b3JkZXI9XFxcIiwgLy/nlKjmiLfliJfooahcXG4gICAgcnVsZUNvdW50VXJsOiBcXFwiL2Rldi9ydWxlY291bnRcXFwiLCAvL+iOt+WPluinhOWImeaVsOmHj1xcbiAgICBydWxlc1VybDogXFxcIi9kZXYvZ2V0XFxcIiwgLy/nlKjmiLflr7nlupTnmoTop4TliJnliJfooajku4Xku4Xojrflj5blhazlvIBcXG4gICAgcnVsZXNBbGxVcmw6IFxcXCIvZGV2L2dldGFsbFxcXCIsIC8v5byA5Y+R6ICF5a+55bqU55qE6KeE5YiZ5YiX6KGo5Y+v6I635Y+W56eB5pyJXFxuICAgIGRldlNlbGY6Jy9kZXYvZ2V0c2VsZicsLy/ojrflj5blvIDlj5HogIXkv6Hmga9cXG4gICAgbWFuQ2FuVXBsb2FkOicvc2V0X2Nhbl91cGxvYWQvJywvL+i2heeuoeiuvue9ruW8gOWPkeiAheaYr+WQpuWPr+S4iuS8oFxcbiAgICBtYW5SdWxlU2FmZTonL3NldF9ydWxlX3NhZmUvJywvL+i2heeuoeiuvue9ruinhOWImeWuieWFqOaAp1xcbiAgICBtYW5SdWxlR29vZDonL3NldF9ydWxlX2dvb2QvJywvL+i2heeuoeiuvue9ruinhOWImeS8mOi0qOaAp1xcbiAgICBpbXBvcnRVcmw6IFxcXCIvcnVsZWxpc3QuanNvbj9pZD1cXFwiLCAvL+inhOWImeivpuaDheWPr+WvvOWFpVxcbiAgICBpbmZvU2V0VXJsOiBcXFwiL2Rldi9zZXRfaW5mb1xcXCIsXFxuICAgIG5vd0NvblVybDogXFxcIi9zcWxfaW5mby9nZXRfbm93X2NvblxcXCIsXFxuICAgIGluZm9HZXRVcmw6IFxcXCIvZGV2L2dldF9pbmZvP25hbWU9XFxcIixcXG4gICAgc2V0dGluZ3NHZXRVcmw6IFxcXCIvZGV2L2dldF9zZXR0aW5ncz9uYW1lPVxcXCIsXFxuICAgIGd1cGxvYWQ6IFxcXCIvZGV2L2d1cGxvYWRcXFwiLFxcbiAgICBndGltZW92ZXI6IFxcXCIvZGV2L2d0aW1lb3ZlclxcXCIsXFxuICAgIGdldGJ5aWQ6IFxcXCIvZGV2L2dldGJ5aWRcXFwiLFxcbiAgICBydWxlTGlzdEpzb246IFxcXCIvcnVsZWxpc3QuanNvblxcXCIsXFxuICAgIGF1dGg6IFxcXCIvZGV2L2dldF9hdXRoXFxcIixcXG4gICAgdGltZW92ZXI6IFxcXCIvZGV2L3RpbWVvdmVyXFxcIixcXG4gICAgc2hhcmU6IFxcXCIvZGV2L3NoYXJlXFxcIixcXG4gICAgZ2VuQXV0aDogXFxcIi9kZXYvZ2VuX2F1dGhcXFwiLFxcbiAgICBkZWxldGVVcmw6IFxcXCIvZGV2L2RlbGV0ZVxcXCIsXFxuICAgIGpzb25MaXN0OiBcXFwiL2Rldi9qc29uX2xpc3RcXFwiLFxcbiAgICBzZWFyY2g6IFxcXCIvZGV2L3NlYXJjaFxcXCIsXFxuICAgIG5ld19kZXY6IFxcXCIvZGV2X3JlZ2lzdC9uZXdcXFwiLFxcbiAgICBuZXdfZ2V0SWQ6IFxcXCIvZGV2X3JlZ2lzdC9nZXRfaWRcXFwiLFxcbiAgICBuZXdfY29uZmlybTogXFxcIi9kZXZfcmVnaXN0L2NvbmZpcm1cXFwiLFxcbiAgICBtb2RpZnlfcHdkOiBcXFwiL21vZGlmeS9wYXNzd29yZFxcXCIsXFxuICAgIG1vZGlmeV9uYW1lOiBcXFwiL21vZGlmeS9uYW1lXFxcIixcXG4gICAgbW9kaWZ5X2F2YTogXFxcIi9tb2RpZnkvYXZhdGFyXFxcIixcXG4gICAgdXNlcjogXFxcIi9kZXYvdXNlci9cXFwiLFxcbiAgICBnZXRfcnVsZV9ub3RlOiBcXFwiL21vZGlmeS9nZXRfcnVsZV9ub3RlL1xcXCIsXFxuICAgIHNldF9ydWxlX3BpYzogXFxcIi9tb2RpZnkvcnVsZV9waWMvXFxcIixcXG4gICAgc2V0X3J1bGVfbm90ZTogXFxcIi9tb2RpZnkvcnVsZV9ub3RlL1xcXCJcXG59XFxuJC5leHBvcnRzLnJhbmdlID0gZnVuY3Rpb24obSwgbikge1xcbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG0gLSBuICsgMSkgKyBuKTtcXG59XFxuJC5leHBvcnRzLm1hcENvbFR5cGUgPSBmdW5jdGlvbih0YXJnZXQsIHR5cGUsIG4pIHtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcXG4gICAgICAgIHRhcmdldC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogdHlwZVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxudmFyIGdldEFwaSA9IGZ1bmN0aW9uKGspIHtcXG4gICAgcmV0dXJuIGFwaS5ob3N0ICsgYXBpW2tdO1xcbn07XFxuJC5leHBvcnRzLmdldEFwaT1nZXRBcGk7XFxuJC5leHBvcnRzLm1kPWdldEFwaSgnaW1wb3J0VXJsJykrXFxcIjMxODdcXFwiO1xcbiQuZXhwb3J0cy5sb2NhbFJ1bGVWZXIgPSBmdW5jdGlvbihsb2NhbFJ1bGVMaXN0LCBydWxlKSB7XFxuICAgIGxldCBsb2NhbFJ1bGU7XFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxSdWxlTGlzdC5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgbGV0IGl0ZW0gPSBsb2NhbFJ1bGVMaXN0W2ldO1xcbiAgICAgICAgbGV0IGF1ID0gaXRlbS5hdXRob3IgfHwgXFxcIlxcXCI7XFxuICAgICAgICBsZXQgc2FtZUF1PWF1Lmxlbmd0aCA+IDAgJiYgcnVsZS5hdXRob3IuaW5jbHVkZXMoYXUpO1xcbiAgICAgICAgc2FtZUF1PXRydWU7Ly/kuI3liKTmlq3kvZzogIXpu5jorqTkuLp0cnVlXFxuICAgICAgICBpZiAoaXRlbS50aXRsZSA9PT0gcnVsZS5uYW1lICYmIHNhbWVBdSkge1xcbiAgICAgICAgICAgIGxvY2FsUnVsZSA9IGl0ZW07XFxuICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaWYgKGxvY2FsUnVsZSA9PT0gdm9pZCAwKSB7XFxuICAgICAgICByZXR1cm4gLTE7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gbG9jYWxSdWxlLnZlcnNpb247XFxuICAgIH1cXG59XFxuJC5leHBvcnRzLmNvbG9yID0gZnVuY3Rpb24odGV4dCwgY29sb3IpIHtcXG4gICAgdGV4dCArPSBcXFwiXFxcIjtcXG4gICAgaWYgKHRleHQuaW5kZXhPZihcXFwi4oCc4oCc4oCd4oCdXFxcIikgPT09IDApIHtcXG4gICAgICAgIHRleHQucmVwbGFjZShcXFwi4oCc4oCc4oCd4oCdXFxcIiwgXFxcIlxcXCIpO1xcbiAgICB9XFxuICAgIHJldHVybiBcXFwi4oCc4oCc4oCd4oCdPGZvbnQgY29sb3I9J1xcXCIgKyBjb2xvciArIFxcXCInPlxcXCIgKyB0ZXh0ICsgXFxcIjwvZm9udD5cXFwiO1xcbn1cXG5cXG4kLmV4cG9ydHMuc2xlZXAgPSBmdW5jdGlvbih0aW1lb3V0KXtcXG4gICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCh0aW1lb3V0KTtcXG59XFxuZnVuY3Rpb24gaHRtbFRhZyh0YWcsIHRleHQpIHtcXG4gICAgdGV4dCArPSBcXFwiXFxcIjtcXG4gICAgaWYgKHRleHQuaW5kZXhPZihcXFwi4oCc4oCc4oCd4oCdXFxcIikgPT09IDApIHtcXG4gICAgICAgIHRleHQucmVwbGFjZShcXFwi4oCc4oCc4oCd4oCdXFxcIiwgXFxcIlxcXCIpO1xcbiAgICB9XFxuICAgIHJldHVybiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCI8XFxcIiArIHRhZyArIFxcXCI+XFxcIiArIHRleHQgKyBcXFwiPC9cXFwiICsgdGFnICsgXFxcIj5cXFwiO1xcblxcbn1cXG5cXG5mdW5jdGlvbiBnZXROb3dGb3JtYXREYXRlKCkge1xcbiAgICAgICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoKTtcXG4gICAgICAgICAgICBsZXQgc2VwZXJhdG9yMSA9IFxcXCItXFxcIjtcXG4gICAgICAgICAgICBsZXQgc2VwZXJhdG9yMiA9IFxcXCI6XFxcIjtcXG4gICAgICAgICAgICBsZXQgbW9udGggPSBkYXRlLmdldE1vbnRoKCkgKyAxO1xcbiAgICAgICAgICAgIGxldCBzdHJEYXRlID0gZGF0ZS5nZXREYXRlKCk7XFxuICAgICAgICAgICAgbGV0IHN0ckhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xcbiAgICAgICAgICAgIGxldCBzdHJNaW51dGVzID0gZGF0ZS5nZXRNaW51dGVzKCk7XFxuICAgICAgICAgICAgbGV0IHN0clNlY29uZHMgPSBkYXRlLmdldFNlY29uZHMoKSsxO1xcbiAgICAgICAgICAgIGlmIChtb250aCA+PSAxICYmIG1vbnRoIDw9IDkpIHtcXG4gICAgICAgICAgICAgICAgbW9udGggPSBcXFwiMFxcXCIgKyBtb250aFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoc3RyRGF0ZSA+PSAwICYmIHN0ckRhdGUgPD0gOSkge1xcbiAgICAgICAgICAgICAgICBzdHJEYXRlID0gXFxcIjBcXFwiICsgc3RyRGF0ZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoc3RySG91cnMgPj0gMCAmJiBzdHJIb3VycyA8PSA5KSB7XFxuICAgICAgICAgICAgICAgIHN0ckhvdXJzID0gXFxcIjBcXFwiICsgc3RySG91cnNcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHN0ck1pbnV0ZXMgPj0gMCAmJiBzdHJNaW51dGVzIDw9IDkpIHtcXG4gICAgICAgICAgICAgICAgc3RyTWludXRlcyA9IFxcXCIwXFxcIiArIHN0ck1pbnV0ZXNcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHN0clNlY29uZHMgPj0gMCAmJiBzdHJTZWNvbmRzIDw9IDkpIHtcXG4gICAgICAgICAgICAgICAgc3RyU2Vjb25kcyA9IFxcXCIwXFxcIiArIHN0clNlY29uZHNcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgLy9sZXQgY3VycmVudGRhdGUgPSBkYXRlLmdldEZ1bGxZZWFyKCkgKyBzZXBlcmF0b3IxICsgbW9udGggKyBzZXBlcmF0b3IxICsgc3RyRGF0ZSArIFxcXCIgXFxcIiArIHN0ckhvdXJzICsgc2VwZXJhdG9yMiArIHN0ck1pbnV0ZXMgKyBzZXBlcmF0b3IyICsgc3RyU2Vjb25kcztcXG4gICAgICAgICAgICBsZXQgY3VycmVudGRhdGUgPSAoZGF0ZS5nZXRGdWxsWWVhcigpLTIwMjApKycnKyBtb250aCArJycrIHN0ckRhdGUgKycnKyBzdHJIb3VycysnJyArIHN0ck1pbnV0ZXMgKycnKyBNYXRoLmNlaWwoc3RyU2Vjb25kcy83KTtcXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoY3VycmVudGRhdGUpXFxuICAgICAgICB9XFxuJC5leHBvcnRzLmdldE5vd0Zvcm1hdERhdGUgPSBnZXROb3dGb3JtYXREYXRlO1xcbiQuZXhwb3J0cy5odG1sVGFnID0gaHRtbFRhZztcXG4kLmV4cG9ydHMuc21hbGwgPSBmdW5jdGlvbih0ZXh0KSB7XFxuICAgIHJldHVybiBodG1sVGFnKFxcXCJzbWFsbFxcXCIsIHRleHQpO1xcbn1cXG4kLmV4cG9ydHMuZ2V0RmlsZSA9IGZ1bmN0aW9uKCkge1xcbiAgICB2YXIgRmlsZSA9IHJlcXVlc3QoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcIikgfHwgXFxcInt9XFxcIjtcXG4gICAgdHJ5IHtcXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEZpbGUpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcIiwgXFxcInt9XFxcIik7XFxuICAgICAgICByZXR1cm4ge307XFxuICAgIH1cXG59XFxuJC5leHBvcnRzLmdldFVzZXJEYXRlID1mdW5jdGlvbigpe1xcbiAgICB2YXIgRmlsZSA9IHJlcXVlc3QoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUkEuanNvblxcXCIpIHx8IFxcXCJbXVxcXCI7XFxuICAgIHRyeSB7XFxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShGaWxlKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVJBLmpzb25cXFwiLCBcXFwiW11cXFwiKTtcXG4gICAgICAgIHJldHVybiBbXTtcXG4gICAgfVxcbn1cXG4kLmV4cG9ydHMuZXhpc3RGaWxlID0gZnVuY3Rpb24oc3BhdGgsIGlwYXRoLCBoZWFkZXJzKSB7XFxuICAgIGxldCBzY29kZSA9IHJlcXVlc3Qoc3BhdGgpO1xcbiAgICBpZiAoIXNjb2RlKSB7XFxuICAgICAgICB3cml0ZUZpbGUoc3BhdGgsIHJlcXVlc3QoaXBhdGgsIGhlYWRlcnMpKTtcXG4gICAgfVxcbn1cXG5cXG5sZXQgbmV3QXBpID0ge1xcbiAgICBcXFwiZGlzX25ld1xcXCI6IFxcXCIvaGlrZXJ1bGUvbmV3X3J1bGVfZGlzY3Vzcy9cXFwiLFxcbiAgICBcXFwiZGlzX3ZlcmlmeVxcXCI6IFxcXCIvaGlrZXJ1bGUvcnVsZV9kaXNjdXNzL2dldF95em1cXFwiLFxcbiAgICBcXFwiZGlzX2dldFxcXCI6IFxcXCIvaGlrZXJ1bGUvcnVsZV9kaXNjdXNzL1xcXCIsXFxuICAgIFxcXCJkaXNfc2V0XFxcIjogXFxcIi9oaWtlcnVsZS9tb2RpZnkvY2FuX2Rpc2N1c3MvXFxcIixcXG4gICAgXFxcImRpc19uZXdfdXNlclxcXCI6IFxcXCIvaGlrZXJ1bGUvcnVsZV9kaXNjdXNzL25ld191c2VyXFxcIixcXG4gICAgXFxcImRpc19sb2dpblxcXCI6XFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvdXNlcl9sb2dpblxcXCIsXFxuICAgIFxcXCJkaXNfZGV2X2Rpc2N1c3NcXFwiOlxcXCIvaGlrZXJ1bGUvbW9kaWZ5L2Rldl9jYW5fZGlzY3Vzc1xcXCIsXFxuICAgIFxcXCJkaXNfZGV2X2NvbnRyb2xcXFwiOlxcXCIvaGlrZXJ1bGUvcnVsZV9kaXNjdXNzL3JlbW92ZS9cXFwiLFxcbiAgICBcXFwiYWxsX3J1bGVcXFwiOlxcXCIvaGlrZXJ1bGUvZ2V0X3J1bGVzXFxcIixcXG4gICAgXFxcImRpc19nZXRfcmVwbHlcXFwiOlxcXCIvaGlrZXJ1bGUvZ2V0X3JlcGx5X3J1bGVfZGlzY3Vzc1xcXCIsXFxuICAgIFxcXCJkaXNfcmVwbHlcXFwiOlxcXCIvaGlrZXJ1bGUvZGV2X25ld19ydWxlX2Rpc2N1c3MvXFxcIixcXG59XFxuXFxuZnVuY3Rpb24gc2V0QXBpKG9iamVjdCkge1xcbiAgICBsZXQgdGFyZ2V0ID0ge307XFxuICAgIGZvciAobGV0IGtleSBpbiBvYmplY3QpIHtcXG4gICAgICAgIHRhcmdldFtrZXldPWhvc3Qrb2JqZWN0W2tleV1cXG4gICAgfVxcbiAgICByZXR1cm4gdGFyZ2V0O1xcbn1cXG5cXG4kLmV4cG9ydHMuYXBpID0gc2V0QXBpKG5ld0FwaSk7XFxuJC5leHBvcnRzLmFwaS5ob3N0PWhvc3Q7XFxuJC5leHBvcnRzLmFwaS5ob21lPWhvbWU7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlvIDlj5HogIXnmbvlvZVcIixcInBhdGhcIjpcImRldkxvZ2luXCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuW8gOWPkeiAheeZu+W9lVxcXCIpO1xcbmNvbnN0IHtcXG4gICAgZ2V0QXBpLFxcbiAgICBodG1sVGFnLFxcbiAgICBtYXBDb2xUeXBlLFxcbiAgICBzbWFsbCxcXG5nZXRGaWxlXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbnZhciBkYXRhID0gW107XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpPT57XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2VVc2VybmFtZVxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlUGFzc3dvcmRcXFwiKTtcXG59KSlcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogJ+i0puWPtycsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZVVzZXJuYW1lJywnJyksXFxuICAgICAgICB0eXBlOlxcXCJudW1iZXJcXFwiLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZVVzZXJuYW1lXFxcIixpbnB1dCknXFxuICAgIH1cXG59LCB7XFxuICAgIHRpdGxlOiAn5a+G56CBJyxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlUGFzc3dvcmQnLCAnJyksXFxuICAgICAgICB0eXBlOiBcXFwicGFzc3dvcmRcXFwiLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZVBhc3N3b3JkXFxcIixpbnB1dCknXFxuICAgIH1cXG59KTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwiJm5ic3A7Jm5ic3A7PGEgaHJlZj0naGlrZXI6Ly9wYWdlL1JlZ2lzdGVyJz7ms6jlhow8L2E+XFxcIixcXG4gICAgY29sX3R5cGU6XFxcInJpY2hfdGV4dFxcXCJcXG59KTtcXG5tYXBDb2xUeXBlKGRhdGEsIFxcXCJsaW5lX2JsYW5rXFxcIiwgMSk7XFxubGV0IHVzZXIgPSBnZXRGaWxlKCk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJcXFwiLCBcXFwi55m75b2VXFxcIiksXFxuICAgIHVybDogJCgpLmxhenlSdWxlKCh1cmwsIGYpPT4ge1xcbiAgICAgICAgbGV0IHVzZXJuYW1lID0gZ2V0VmFyKCdXYXJlaG91c2VVc2VybmFtZScsICcnKSxcXG4gICAgICAgICAgICBwYXNzd29yZCA9IGdldFZhcignV2FyZWhvdXNlUGFzc3dvcmQnLCAnJyk7XFxuICAgICAgICBpZih1c2VybmFtZSA9PT0gXFxcIlxcXCIgJiYgcGFzc3dvcmQgPT09XFxcIlxcXCIpe1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/otKblj7flkozlr4bnoIHkuI3og73kuLrnqbpcXFwiXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgbXlVcmwgPSB1cmwgKyAnP3FxPScgKyB1c2VybmFtZSArICcmcGFzc3dvcmQ9JyArIHBhc3N3b3JkO1xcbiAgICAgICAgbGV0IGNvZGVfc3RyID0gcmVxdWVzdChteVVybCk7XFxuICAgICAgICBsZXQgY29kZSA9IEpTT04ucGFyc2UoY29kZV9zdHIpO1xcbiAgICAgICAgaWYgKGNvZGUuc3RhdHVzID09IDApIHtcXG4gICAgICAgICAgICBmLnVzZXJuYW1lPXVzZXJuYW1lO1xcbiAgICAgICAgICAgIGYucGFzc3dvcmQ9cGFzc3dvcmRcXG4gICAgICAgICAgICB3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uJywgSlNPTi5zdHJpbmdpZnkoZikpO1xcbiAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v55m75b2V5oiQ5YqfXFxcIjtcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/otKblj7fmiJblr4bnoIHplJnor69cXFwiO1xcbiAgICAgICAgfVxcbiAgICB9LCBnZXRBcGkoXFxcInJ1bGVzQWxsVXJsXFxcIiksdXNlciksXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG59KTtcXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJpY29uXzJfcm91bmRcIixcIm5hbWVcIjpcIuW8gOWPkeiAheeuoeeQhlwiLFwicGF0aFwiOlwiZGV2TWFuYWdlXCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuinhOWImeeuoeeQhlxcXCIpO1xcblxcbmNvbnN0IHtcXG4gICAgZ2V0QXBpLFxcbiAgICBjb2xvcixcXG4gICAgc21hbGwsXFxuICAgIGdldEZpbGUsXFxuICAgIGV4aXN0RmlsZSxcXG4gICAgbWFwQ29sVHlwZSxcXG4gICAgYXBpXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGRldlxcbn0gPSBNWV9QQVJBTVM7XFxubGV0IHtcXG4gICAgdXNlcm5hbWUsXFxuICAgIHBhc3N3b3JkLFxcbn0gPSBnZXRGaWxlKCk7XFxuLy9leGlzdEZpbGUoXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9odG1sL+W8gOWPkeiAheWIhuS6qy5odG1sXFxcIiwgXFxcImh0dHBzOi8vZXJwLnNjd2luYmFvLmNvbS9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUzOVxcXCIpO1xcbmxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcInJ1bGVzQWxsVXJsXFxcIikgKyAnP3FxPScgKyB1c2VybmFtZSArICcmcGFzc3dvcmQ9JyArIHBhc3N3b3JkKSkucmVzdWx0O1xcbmxldCBNT0JJTEVfVUEgPSAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDUuMDsgU00tRzkwMFAgQnVpbGQvTFJYMjFUKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODguMC40MzI0LjE0NiBNb2JpbGUgU2FmYXJpLzUzNy4zNic7XFxubGV0IGluZm9TZXRVcmwgPSBnZXRBcGkoXFxcImluZm9TZXRVcmxcXFwiKTtcXG5sZXQgaW5mb0dldFVybCA9IGdldEFwaShcXFwiaW5mb0dldFVybFxcXCIpICsgdXNlcm5hbWU7XFxubGV0IHNldHRpbmdzR2V0VXJsID0gZ2V0QXBpKFxcXCJzZXR0aW5nc0dldFVybFxcXCIpICsgdXNlcm5hbWU7XFxucHV0TXlWYXIoXFxcImRldl9zZXRfaW5mb1xcXCIsIFt1c2VybmFtZSwgcGFzc3dvcmQsIGluZm9TZXRVcmwsIE1PQklMRV9VQSwgaW5mb0dldFVybF0uam9pbihcXFwiJCRcXFwiKSk7XFxubGV0IGRhdGEgPSBbXTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxiaWc+5LuT5bqT6K6+572uPC9iaWc+Jm5ic3A7Jm5ic3A7Jm5ic3A7PHNtYWxsPjx1Pu+8iCDkuKrkurrotYTmlpkgPu+8iTwvdT48L3NtYWxsPicsXFxuICAgIGRlc2M6ICfigJzigJzigJ3igJ3mgqjlhbHmnIkgPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY3MDAwXFxcIj4nICsgcnVsZUxpc3QubGVuZ3RoICsgJzwvc3Bhbj4nICsgXFxcIiDmnaHop4TliJnjgIJcXFxcbueCueWHu+inhOWImeWPr+i/m+ihjOWIhuS6q+OAgeWIoOmZpOOAgeWvvOWFpeaTjeS9nOWPiuafpeeci+ivpuaDhVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9QZXJzb25hbERhdGEjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6e2lkOmRldi5pZH0sXFxuICAgIGNvbF90eXBlOiAndGV4dF8xJ1xcbn0pO1xcbm1hcENvbFR5cGUoZGF0YSwgXFxcImxpbmVcXFwiLCAyKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogc21hbGwoY29sb3IoXFxcIuabtOaUueWFrOWRiuKcjVxcXCIsIFxcXCIjMzRiMWZmXFxcIikpLFxcbiAgICAvLyB1cmw6IFxcXCJ4NTovL2ZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL3J1bGVzL2R6SG91c2UvaHRtbC9kZXZfaW5mb19lZGl0Lmh0bWxcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvZGV2SW5mb0VkaXRcXFwiLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMydcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogc21hbGwoY29sb3IoXFxcIuabtOWkmuWIhuS6q/Cfk7JcXFwiLCBcXFwiIzM0YjFmZlxcXCIpKSxcXG4gICAgLy91cmw6IFxcXCJ4NTovL2ZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL3J1bGVzL2R6SG91c2UvaHRtbC/lvIDlj5HogIXliIbkuqsuaHRtbFxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9tb3JlU2hhcmVcXFwiLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMydcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogc21hbGwoY29sb3IoXFxcIuWNh+e6p+S+nei1lvCfk6VcXFwiLCBcXFwiIzM0YjFmZlxcXCIpKSxcXG4gICAgdXJsOiAkKFxcXCLljYfnuqfkvJrph43mlrDku47ku5PlupPmi4nlj5bnm7jlhbPnmoTpnZnmgIHpobXpnaLliLDmnKzlnLBcXFxcbuehruiupOWNh+e6p+WQlz9cXFwiKS5jb25maXJtKChob3N0KSA9PiB7XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9odG1sL+W8gOWPkeiAheWIhuS6qy5odG1sXFxcIiwgcmVxdWVzdChob3N0KycvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MzknKSk7XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9odG1sL2Rldl9pbmZvX2VkaXQuaHRtbFxcXCIsIHJlcXVlc3QoaG9zdCsnL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NDAyJykpO1xcbiAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvaHRtbC9kZXZfaW5mb19nZXQuaHRtbFxcXCIsIHJlcXVlc3QoaG9zdCsnL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NDA0JykpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3sumHjee9ruW8gOWPkeiAheWIhuS6qyznroDku4vmn6XnnIss566A5LuL57yW6L6R562J6Z2Z5oCB5paH5Lu2XFxcIjtcXG4gICAgfSxhcGkuaG9zdCksXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcbn0pO1xcbmxldCBkZXZTZXRCYWNrO1xcbnRyeSB7XFxuICAgIGRldlNldEJhY2sgPSBKU09OLnBhcnNlKHJlcXVlc3Qoc2V0dGluZ3NHZXRVcmwpKTtcXG59IGNhdGNoIChlKSB7XFxuICAgIGRldlNldEJhY2sgPSB7fTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0U2V0dGluZ0l0ZW0oYmFzaWMpIHtcXG4gICAgbGV0IHRlbXAgPSB7XFxuICAgICAgICB0aXRsZTogYmFzaWMudGl0bGUsXFxuICAgICAgICBjb2xfdHlwZTogYmFzaWMuY29sX3R5cGUsXFxuICAgICAgICB1cmw6ICQoYmFzaWMuY29uZmlybSkuY29uZmlybSgodXJsLCBtc2cpID0+IHtcXG4gICAgICAgICAgICBsZXQgYmFjayA9IHJlcXVlc3QodXJsKTtcXG4gICAgICAgICAgICBsZXQgcmV0ID0gSlNPTi5wYXJzZShiYWNrKTtcXG4gICAgICAgICAgICBpZiAocmV0LnN0YXR1cyA9PSAwKSB7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIG1zZ1swXTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgbXNnWzFdICsgXFxcIlxcXFxuXFxcIiArIHJldC5kZXRhaWw7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgYmFzaWMudXJsLCBiYXNpYy5tc2cpXFxuICAgIH07XFxuICAgIHJldHVybiB0ZW1wO1xcbn1cXG5pZiAoZGV2U2V0QmFjay5zdGF0dXMgPT0gMCkge1xcbiAgICBsZXQgZGV2U2V0dGluZ3MgPSBkZXZTZXRCYWNrLnJlc3VsdDtcXG4gICAgbGV0IHNoYXJlID0ge1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiXFxuICAgIH07XFxuICAgIGlmIChkZXZTZXR0aW5ncy5zaGFyZV9wdWJsaWMpIHtcXG4gICAgICAgIHNoYXJlLnRpdGxlID0gc21hbGwoY29sb3IoXFxcIuWFrOW8gOS4iuS8oFxcXCIsIFxcXCJncmVlblxcXCIpICsgY29sb3IoXFxcIijnp4Hol48pXFxcIiwgXFxcIiMwMGJmZmZcXFwiKSk7XFxuICAgICAgICBzaGFyZS51cmwgPSBnZXRBcGkoXFxcImd1cGxvYWRcXFwiKSArIFxcXCI/cXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQgKyBcXFwiJmZsYWc9MVxcXCI7XFxuICAgICAgICBzaGFyZS5jb25maXJtID0gXFxcIuaYr+WQpuehruiupOengeiXj+S7peWQjuaPkOS6pOeahOinhOWImT9cXFwiO1xcbiAgICAgICAgc2hhcmUubXNnID0gW1xcXCLlt7Lnp4Hol49cXFwiLCBcXFwi56eB6JeP5aSx6LSlXFxcIl07XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBzaGFyZS50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXCLnp4Hlr4bkuIrkvKBcXFwiLCBcXFwicmVkXFxcIikgKyBjb2xvcihcXFwiKOWFrOW8gClcXFwiLCBcXFwiI2FkZmYyZlxcXCIpKTtcXG4gICAgICAgIHNoYXJlLnVybCA9IGdldEFwaShcXFwiZ3VwbG9hZFxcXCIpICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZDtcXG4gICAgICAgIHNoYXJlLmNvbmZpcm0gPSBcXFwi5piv5ZCm56Gu6K6k5YWs5byA5Lul5ZCO5o+Q5Lqk55qE6KeE5YiZP1xcXCI7XFxuICAgICAgICBzaGFyZS5tc2cgPSBbXFxcIuW3suWFrOW8gFxcXCIsIFxcXCLlhazlvIDlpLHotKVcXFwiXTtcXG4gICAgfVxcbiAgICBkYXRhLnB1c2goc2V0U2V0dGluZ0l0ZW0oc2hhcmUpKTtcXG4gICAgbGV0IHRpbWVPdmVyID0ge1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiXFxuICAgIH07XFxuICAgIGlmIChkZXZTZXR0aW5ncy50aW1lX292ZXIpIHtcXG4gICAgICAgIHRpbWVPdmVyLnRpdGxlID0gc21hbGwoY29sb3IoXFxcIuefreaXtuenmOmSpVxcXCIsIFxcXCJncmVlblxcXCIpICsgY29sb3IoXFxcIijmsLjkuYUpXFxcIiwgXFxcIiMwMGJmZmZcXFwiKSk7XFxuICAgICAgICB0aW1lT3Zlci51cmwgPSBnZXRBcGkoXFxcImd0aW1lb3ZlclxcXCIpICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZCArIFxcXCImZmxhZz0xXFxcIjtcXG4gICAgICAgIHRpbWVPdmVyLmNvbmZpcm0gPSBcXFwi5piv5ZCm56Gu6K6k5Lul5ZCO55qE56eB6JeP6KeE5YiZ5YiG5Lqr5LiN6L+H5pyfP1xcXCI7XFxuICAgICAgICB0aW1lT3Zlci5tc2cgPSBbXFxcIuW3suiuvuS4uuawuOS5hVxcXCIsIFxcXCLorr7kuLrmsLjkuYXlpLHotKVcXFwiXTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHRpbWVPdmVyLnRpdGxlID0gc21hbGwoY29sb3IoXFxcIuawuOS5heenmOmSpVxcXCIsIFxcXCJyZWRcXFwiKSArIGNvbG9yKFxcXCIo6L+H5pyfKVxcXCIsIFxcXCIjYWRmZjJmXFxcIikpO1xcbiAgICAgICAgdGltZU92ZXIudXJsID0gZ2V0QXBpKFxcXCJndGltZW92ZXJcXFwiKSArIFxcXCI/cXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQ7XFxuICAgICAgICB0aW1lT3Zlci5jb25maXJtID0gXFxcIuehruiupOimgeS7peWQjuWIhuS6q+eahOengeiXj+inhOWImeiHquWKqOWIsOacnz9cXFwiO1xcbiAgICAgICAgdGltZU92ZXIubXNnID0gW1xcXCLlt7Lorr7kuLrov4fmnJ9cXFwiLCBcXFwi6K6+5Li66L+H5pyf5aSx6LSlXFxcIl07XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHNldFNldHRpbmdJdGVtKHRpbWVPdmVyKSk7XFxuICAgIGxldCBkaXNjdXNzID0ge1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiXFxuICAgIH07XFxuICAgIGlmIChkZXZTZXR0aW5ncy5jYW5fZGlzY3Vzcykge1xcbiAgICAgICAgZGlzY3Vzcy50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXCLlhYHorrjor4TorrpcXFwiLCBcXFwicmVkXFxcIikgKyBjb2xvcihcXFwiKOS4jeiuuClcXFwiLCBcXFwiI2FkZmYyZlxcXCIpKTtcXG4gICAgICAgIGRpc2N1c3MudXJsID0gYXBpLmRpc19kZXZfZGlzY3VzcyArIFxcXCI/cXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQrIFxcXCImZmxhZz0xXFxcIjtcXG4gICAgICAgIGRpc2N1c3MuY29uZmlybSA9IFxcXCLmmK/lkKbnoa7orqTku6XlkI7kuIrkvKDnmoTop4TliJnlhYHorrjor4Torro/XFxcIjtcXG4gICAgICAgIGRpc2N1c3MubXNnID0gW1xcXCLlt7Lorr7kuLrkuI3orrhcXFwiLCBcXFwi6K6+572u5aSx6LSlXFxcIl07XFxuXFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBkaXNjdXNzLnRpdGxlID0gc21hbGwoY29sb3IoXFxcIuS4jeiuuOivhOiuulxcXCIsIFxcXCJncmVlblxcXCIpICsgY29sb3IoXFxcIijlhYHorrgpXFxcIiwgXFxcIiMwMGJmZmZcXFwiKSk7XFxuICAgICAgICBkaXNjdXNzLnVybCA9IGFwaS5kaXNfZGV2X2Rpc2N1c3MgKyBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkO1xcbiAgICAgICAgZGlzY3Vzcy5jb25maXJtID0gXFxcIuaYr+WQpuehruiupOS7peWQjuS4iuS8oOeahOinhOWImeWFgeiuuOivhOiuuj9cXFwiO1xcbiAgICAgICAgZGlzY3Vzcy5tc2cgPSBbXFxcIuW3suiuvuS4uuWFgeiuuFxcXCIsIFxcXCLorr7nva7lpLHotKVcXFwiXTtcXG4gICAgfVxcbiAgICBkYXRhLnB1c2goc2V0U2V0dGluZ0l0ZW0oZGlzY3VzcykpO1xcbn1cXG5tYXBDb2xUeXBlKGRhdGEsIFxcXCJsaW5lXFxcIiwgMik7XFxuZm9yIChsZXQgaXRlbSBvZiBydWxlTGlzdCkge1xcbiAgICBsZXQgbXlfdF9leGNvZGUxID0gJyc7XFxuICAgIGxldCBteV90X2V4Y29kZTIgPSAnJztcXG4gICAgaWYgKGl0ZW0uc3RhdGUgIT0gJ3B1YmxpYycpIHtcXG4gICAgICAgIG15X3RfZXhjb2RlMSArPSAn44qZ77iPJztcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIG15X3RfZXhjb2RlMSArPSAnJztcXG4gICAgfVxcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IG15X3RfZXhjb2RlMSArIGl0ZW0ubmFtZSArIG15X3RfZXhjb2RlMixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9tYW5hZ2VSdWxlI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkLFxcbiAgICAgICAgICAgIC8vdXNlcm5hbWU6IHVzZXJuYW1lLFxcbiAgICAgICAgICAgIC8vcGFzc3dvcmQ6IHBhc3N3b3JkXFxuICAgICAgICB9LFxcbiAgICAgICAgcGljX3VybDogaXRlbS5waWMsXFxuICAgIH0pXFxufVxcbmlmIChydWxlTGlzdC5sZW5ndGggPT09IDApIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5b+r5p2l5LiK5Lyg5L2g55qE56ys5LiA5p2h6KeE5YiZ5ZCn77yBPC9oNT5cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0pO1xcbn1cXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop4TliJnor6bnu4YtZGV2XCIsXCJwYXRoXCI6XCJtYW5hZ2VSdWxlXCIsXCJydWxlXCI6XCJqczpcXG4gICAgY29uc3Qge1xcbiAgICAgICAgZ2V0QXBpLFxcbiAgICAgICAgY29sb3IsXFxuICAgICAgICBzbWFsbCxcXG4gICAgICAgIGdldEZpbGUsXFxuICAgICAgICBleGlzdEZpbGUsXFxuICAgICAgICBtYXBDb2xUeXBlLFxcbiAgICAgICAgaHRtbFRhZyxcXG4gICAgICAgIGFwaSxcXG4gICAgICAgIG1kLFxcbiAgICB9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgaWRcXG59ID0gTVlfUEFSQU1TO1xcbmxldCB7XFxuICAgIHVzZXJuYW1lLFxcbiAgICBwYXNzd29yZCxcXG59ID0gZ2V0RmlsZSgpO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG59KSk7XFxubGV0IGRhdGFJdGVtID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwiZ2V0YnlpZFxcXCIpICsgXFxcIj9pZD1cXFwiICsgaWQpKS5yZXN1bHQ7XFxuc2V0UGFnZVRpdGxlKFxcXCLnvJbovpHjgIxcXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCLjgI1cXFwiKTtcXG5sZXQgcmVxQnlHZXQgPSBcXFwiP2lkPVxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXCImcXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQ7XFxubGV0IHJ1bGVMaXN0SnNvbiA9IGdldEFwaShcXFwicnVsZUxpc3RKc29uXFxcIikgKyBcXFwiP2lkPVxcXCI7XFxubGV0IGRhdGEgPSBbXTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIueJiOacrFxcXCIpLFxcbiAgICBkZXNjOiBcXFwi4oCc4oCc4oCd4oCd5LqR56uv54mI5pysOlxcXCIgKyBjb2xvcihkYXRhSXRlbS52ZXIsIFxcXCIjNWNmZjJjXFxcIikgKyBcXFwiXFxcXG7kuIrmrKHmj5DkuqTkuo46IFtcXFwiICsgY29sb3IoZGF0YUl0ZW0ubGFzdF91cGRhdGUsIFxcXCIjZmY3MDAwXFxcIikgKyBcXFwiXVxcXCIsXFxuICAgIHVybDogJChcXFwiPOW8gOWPkeiAhT5cXFxcblxcXCIgKyBkYXRhSXRlbS5hdXRob3IgKyBcXFwiXFxcXG485ZCN56ewPlxcXFxuXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwiXFxcXG485LqR56uv54mI5pysPlxcXFxuXFxcIiArIGRhdGFJdGVtLnZlciArIFxcXCJcXFxcbjzmm7TmlrDml7bpl7Q+XFxcXG5bXFxcIiArIGRhdGFJdGVtLmxhc3RfdXBkYXRlICsgXFxcIl1cXFwiKS5jb25maXJtKCgpID0+IHt9KSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnXFxufSk7XFxubGV0IGRhdGFUeXBlID0ge1xcbiAgICBob21lX3J1bGVfdXJsOiAn6aaW6aG15LqR6KeE5YiZJyxcXG4gICAgcHVibGlzaDogJ+aPkOS6pOS6keS7k+W6k+inhOWImScsXFxuICAgIGpzX3VybDogJ+e9kemhteaPkuS7tuinhOWImScsXFxuICAgIGh0bWw6ICfpnZnmgIHpobXpnaInLFxcbiAgICBjb25maWc6ICfkuLvpobXphY3nva4nXFxufTtcXG5cXG5sZXQgYmFzaWMgPSB7XFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG59O1xcbmxldCBkYXRhVHlwZVRpcHMgPSBkYXRhVHlwZVtkYXRhSXRlbS5kYXRhX3R5cGVdIHx8ICfmnKrnn6Xop4TliJk6JyArIGRhdGFJdGVtLmRhdGFfdHlwZTtcXG5cXG5iYXNpYy50aXRsZSA9IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLnsbvlnotcXFwiKSArIFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoXFxcIihpZDpcXFwiICsgZGF0YUl0ZW0uaWQgKyBcXFwiKVxcXCIpO1xcbmJhc2ljLmRlc2MgPSBcXFwi5pWw5o2u57G75Z6L77yaXFxcIiArIGNvbG9yKGRhdGFUeXBlVGlwcywgXFxcIiNjYjU0ZmZcXFwiKSArIFxcXCJcXFxcbuWIhuS6q+eKtuaAgeS4uu+8mlxcXCIgKyBkYXRhSXRlbS5zdGF0ZTtcXG5pZiAoW1xcXCJodG1sXFxcIiwgXFxcImNvbmZpZ1xcXCIsIFxcXCJqc191cmxcXFwiXS5pbmNsdWRlcyhkYXRhSXRlbS5kYXRhX3R5cGUpKSB7XFxuICAgIGJhc2ljLmRlc2MgKz0gXFxcIlxcXFxu4oCc4oCc4oCd4oCdID0+XFxcIiArIHNtYWxsKFxcXCLngrnmraTpooTop4hcXFwiKTtcXG4gICAgYmFzaWMudXJsID0gcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxufVxcbmxldCBhdXRoID0gXFxcIlxcXCI7XFxuaWYgKGRhdGFJdGVtLnN0YXRlID09IFxcXCJwcml2YXRlXFxcIikge1xcbiAgICBsZXQgYXV0aF9iYWNrID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwiYXV0aFxcXCIpICsgcmVxQnlHZXQpKTtcXG4gICAgYmFzaWMudGl0bGUgPSBiYXNpYy50aXRsZSArIFxcXCJcXFxcblxcXCIgKyBzbWFsbChjb2xvcihhdXRoX2JhY2sucmVzdWx0LCBcXFwiZ3JleVxcXCIpKTtcXG4gICAgYXV0aCA9ICcmYXV0aD0nICsgYXV0aF9iYWNrLnJlc3VsdDtcXG4gICAgYmFzaWMudXJsID0gYmFzaWMudXJsID09PSBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIgPyBiYXNpYy51cmwgOiBiYXNpYy51cmwgKyBhdXRoO1xcbn1cXG5kYXRhLnB1c2goYmFzaWMpO1xcbmxldCBub3RlcyA9IHJlcXVlc3QoZ2V0QXBpKFxcXCJnZXRfcnVsZV9ub3RlXFxcIikgKyBpZCk7XFxubm90ZXMgPSBKU09OLnBhcnNlKG5vdGVzKS5yZXN1bHQ7XFxucmVxdWlyZShtZCk7XFxubGV0IG5vdGVzSHRtbD1cXFwiXFxcIlxcbnRyeXtcXG4gICAgbm90ZXNIdG1sPW1hcmtlZC5wYXJzZShub3Rlcyk7XFxufWNhdGNoKGUpe31cXG5pZiAobm90ZXMgIT09IGZhbHNlKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuWkh+azqFxcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChodG1sVGFnKFxcXCJ1XFxcIiwgXFxcIuafpeeci+WujOaVtOWFrOWRiiA+XFxcIikpLFxcbiAgICAgICAgZGVzYzogbm90ZXMsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHRleHQ6IG5vdGVzSHRtbCxcXG4gICAgICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lLFxcbiAgICAgICAgICAgIC8vIHR5cGU6IFxcXCJsb25nX3RleHRcXFwiXFxuICAgICAgICAgICAgdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufVxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi5pON5L2cXFxcIiksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwidG9hc3Q6Ly/kvaDmiY3mmK/mnIDluIXnmoTpgqPkuKrkurrvvIFcXFwiXFxufSk7XFxubGV0IGltcG9ydFVybCwgcnVsZUNvZGUsIHNoYXJlVXJsLCBiYWNrQ29kZSA9IFxcXCJcXFwiO1xcbmxldCBzdWJVcmwgPSBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArIGF1dGg7XFxuaWYgKCFkYXRhSXRlbS5pc19qc29uKSB7XFxuICAgIGJhY2tDb2RlID0gcmVxdWVzdChzdWJVcmwpO1xcbn1cXG5zd2l0Y2ggKGRhdGFJdGVtLmRhdGFfdHlwZSkge1xcbiAgICBjYXNlIFxcXCJob21lX3J1bGVfdXJsXFxcIjpcXG4gICAgICAgIHJ1bGVDb2RlID0gXFxcIua1t+mYlOinhueVjOmmlumhtemikemBk+inhOWImeOAkFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcIuOAke+/pWhvbWVfcnVsZV91cmzvv6VcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyBhdXRoO1xcbiAgICAgICAgaW1wb3J0VXJsID0gXFxcInJ1bGU6Ly9cXFwiICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKVxcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgJ3B1Ymxpc2gnOlxcbiAgICAgICAgcnVsZUNvZGUgPSAn5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77yaJyArIGRhdGFJdGVtLm5hbWUgKyAn77+lcHVibGlzaO+/pScgKyBiYXNlNjRFbmNvZGUoYmFja0NvZGUpO1xcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlICdqc191cmwnOlxcbiAgICAgICAgcnVsZUNvZGUgPSAn5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77ya572R6aG15o+S5Lu277+lanNfdXJs77+lJyArIGRhdGFJdGVtLm5hbWUgKyAnQGJhc2U2NDovLycgKyBiYXNlNjRFbmNvZGUoYmFja0NvZGUpO1xcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlICdodG1sJzpcXG4gICAgICAgIGxldCBmaWxlX3RtcCA9IGRhdGFJdGVtLm5hbWUuc3BsaXQoJy4nKTtcXG4gICAgICAgIGxldCBmaWxlX3BhdGggPSBmaWxlX3RtcC5sZW5ndGggPiAxID8gZmlsZV90bXBbZmlsZV90bXAubGVuZ3RoIC0gMV0gKyBcXFwiL1xcXCIgKyBkYXRhSXRlbS5uYW1lIDogZGF0YUl0ZW0ubmFtZTtcXG4gICAgICAgIHJ1bGVDb2RlID0gXFxcIua1t+mYlOinhueVjOacrOWcsOaWh+S7tuWIhuS6q++/pWZpbGVfdXJs77+laGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL1xcXCIgKyBmaWxlX3BhdGggKyBcXFwiQFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArIGF1dGg7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWtcXG4gICAgY2FzZSBcXFwiY29uZmlnXFxcIjpcXG4gICAgICAgIGltcG9ydFVybCA9ICQoKS5ydWxlKHBhc3N3b3JkID0+IHtcXG4gICAgICAgICAgICBldmFsKGZldGNoKFxcXCJoaWtlcjovL2Fzc2V0cy9ob21lLmpzXFxcIikpO1xcbiAgICAgICAgICAgIEhpa2VySG9tZS5sb2FkKFxcXCJpbXBvcnRcXFwiLCBwYXNzd29yZCk7XFxuICAgICAgICB9LCBiYWNrQ29kZSk7XFxuICAgICAgICBicmVhaztcXG59XFxubGV0IG15X2NvbF90eXBlID0gXFxcInRleHRfMlxcXCI7XFxuaWYgKGltcG9ydFVybCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlr7zlhaXop4TliJlcXFwiLFxcbiAgICAgICAgdXJsOiBpbXBvcnRVcmwsXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSk7XFxuICAgIGlmKGRhdGFJdGVtLmlzX2pzb25fbGlzdCYmL2hvbWVfcnVsZV91cmx8aHRtbC8udGVzdChkYXRhSXRlbS5kYXRhX3R5cGUpKXtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPuWvvOWFpemBk+W+t+e7jzwvc3Bhbj4nLFxcbiAgICAgICAgICAgIHVybDogJCgpLmxhenlSdWxlKChkYXRhSXRlbSxzdWJVcmwpPT57XFxuICAgICAgICAgICAgICAgIC8vIGxldCB0aXRsZSA9IFxcXCJILVxcXCIrZGF0YUl0ZW0ubmFtZStcXFwiLlxcXCIrZGF0YUl0ZW0uYXV0aG9yO1xcbiAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBcXFwiSi1cXFwiK2RhdGFJdGVtLm5hbWUuc3BsaXQoJy4nKVswXTtcXG4gICAgICAgICAgICAgICAgbGV0IHN1Yk9iaiA9IHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogc3ViVXJsLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9ydWxlQ2FjaGUvXFxcIit0aXRsZStcXFwiLmpzb25cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogXFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IGZhbHNlLC8v56aB55So5bm25Y+R5pu05pawXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbGV0IHNoYXJlVGV4dCA9IGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShzdWJPYmopKTtcXG4gICAgICAgICAgICAgICAgdmFyIHBhc3RlcyA9IGdldFBhc3RlcygpO1xcbiAgICAgICAgICAgICAgICB2YXIgdXJsID0gc2hhcmVQYXN0ZShzaGFyZVRleHQscGFzdGVzLnNsaWNlKC0xKVswXSk7XFxuICAgICAgICAgICAgICAgIGxldCBpbXBvcnRfcnVsZT0gXFxcIui9u+WQiOmbhuiuoumYhe+8mlxcXCIrdGl0bGUrJ1xcXFxuJyt1cmw7XFxuICAgICAgICAgICAgICAgIGNvcHkoaW1wb3J0X3J1bGUpO1xcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gJ2hpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9ydWxlQ2FjaGUvc3ViLmpzb24nO1xcbiAgICAgICAgICAgICAgICAkLnJjKGNvbmZpZy5saWIuc3ViKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIOiuoumYheWvvOWFpShwYXRoKVxcbiAgICAgICAgICAgIH0sZGF0YUl0ZW0sc3ViVXJsKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbmlmIChydWxlQ29kZSkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLliIbkuqvop4TliJlcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiY29weTovL1xcXCIgKyBydWxlQ29kZSxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0U2V0dGluZ0l0ZW0oYmFzaWMsIHBhdHRlcm4pIHtcXG4gICAgbGV0IHRlbXAgPSB7XFxuICAgICAgICB0aXRsZTogYmFzaWMudGl0bGUsXFxuICAgICAgICBjb2xfdHlwZTogYmFzaWMuY29sX3R5cGUsXFxuICAgICAgICB1cmw6ICQoYmFzaWMuY29uZmlybSkuY29uZmlybSgodXJsLCBtc2csIHBhdHRlcm4pID0+IHtcXG4gICAgICAgICAgICBsZXQgYmFja0EgPSByZXF1ZXN0KHVybCk7XFxuICAgICAgICAgICAgbGV0IHJldCA9IEpTT04ucGFyc2UoYmFja0EpO1xcbiAgICAgICAgICAgIGlmIChyZXQuc3RhdHVzID09IDApIHtcXG4gICAgICAgICAgICAgICAgcGF0dGVybiA/IGJhY2soKSA6IHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBtc2dbMF07XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcGF0dGVybiA/IGJhY2soKSA6IHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBtc2dbMV0gKyBcXFwiXFxcXG5cXFwiICsgcmV0LmRldGFpbDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBiYXNpYy51cmwsIGJhc2ljLm1zZywgcGF0dGVybilcXG4gICAgfTtcXG4gICAgcmV0dXJuIHRlbXA7XFxufVxcbmlmIChkYXRhSXRlbS5zdGF0ZSA9PSAncHJpdmF0ZScpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6K6+5Li65YWs5byAXFxcIixcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcInNoYXJlXFxcIikgKyByZXFCeUdldCArIFxcXCImZmxhZ1xcXCIgKyBcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgcmVxdWVzdChpbnB1dCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lorr7kuLrlhazlvIBcXFwiO1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSwge1xcbiAgICAgICAgdGl0bGU6IFxcXCLpmo/mnLrlr4bpkqVcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlLFxcbiAgICAgICAgdXJsOiAkKGdldEFwaShcXFwiZ2VuQXV0aFxcXCIpICsgcmVxQnlHZXQgKyBcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGJhY2sgPSByZXF1ZXN0KGlucHV0KTtcXG4gICAgICAgICAgICBsZXQgcmV0ID0gSlNPTi5wYXJzZShiYWNrKTtcXG4gICAgICAgICAgICBpZiAocmV0LnN0YXR1cyA9PSAwKSB7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3sueUn+aIkOmaj+acuuWvhueggVxcXFxuXFxcIiArIHJldC5yZXN1bHRcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+maj+acuuWvhueggeeUn+aIkOWksei0pVxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KVxcbiAgICB9KTtcXG4gICAgbGV0IHRpbWVPdmVyID0ge1xcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH07XFxuICAgIGlmIChkYXRhSXRlbS50aW1lX292ZXIpIHtcXG4gICAgICAgIHRpbWVPdmVyLnRpdGxlID0gc21hbGwoY29sb3IoXFxcIuefreaXtuWvhumSpVxcXCIsIFxcXCJncmVlblxcXCIpICsgY29sb3IoXFxcIijihpLmsLjkuYUpXFxcIiwgXFxcInJlZFxcXCIpKTtcXG4gICAgICAgIHRpbWVPdmVyLnVybCA9IGdldEFwaShcXFwidGltZW92ZXJcXFwiKSArIHJlcUJ5R2V0ICsgXFxcIiZmbGFnPTFcXFwiO1xcbiAgICAgICAgdGltZU92ZXIuY29uZmlybSA9IFxcXCLmmK/lkKbnoa7orqTku6XlkI7nmoTnp4Hol4/op4TliJnliIbkuqvkuI3ov4fmnJ8/XFxcIjtcXG4gICAgICAgIHRpbWVPdmVyLm1zZyA9IFtcXFwi5bey6K6+5Li65rC45LmFXFxcIiwgXFxcIuiuvuS4uuawuOS5heWksei0pVxcXCJdO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgdGltZU92ZXIudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi5rC45LmF5a+G6ZKlXFxcIiwgXFxcInJlZFxcXCIpICsgY29sb3IoXFxcIijihpLnn63ml7YpXFxcIiwgXFxcImdyZWVuXFxcIikpO1xcbiAgICAgICAgdGltZU92ZXIudXJsID0gZ2V0QXBpKFxcXCJ0aW1lb3ZlclxcXCIpICsgcmVxQnlHZXQ7XFxuICAgICAgICB0aW1lT3Zlci5jb25maXJtID0gXFxcIuehruiupOimgeS7peWQjuWIhuS6q+eahOengeiXj+inhOWImeiHquWKqOWIsOacnz9cXFwiO1xcbiAgICAgICAgdGltZU92ZXIubXNnID0gW1xcXCLlt7Lorr7kuLrov4fmnJ9cXFwiLCBcXFwi6K6+5Li66L+H5pyf5aSx6LSlXFxcIl07XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHNldFNldHRpbmdJdGVtKHRpbWVPdmVyKSk7XFxufSBlbHNlIGlmIChkYXRhSXRlbS5zdGF0ZSA9PSAncHVibGljJykge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLorr7kuLrnp4HmnIlcXFwiLFxcbiAgICAgICAgdXJsOiAkKGdldEFwaShcXFwic2hhcmVcXFwiKSArIHJlcUJ5R2V0ICsgXFxcIiZmbGFnPTEjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICByZXF1ZXN0KGlucHV0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suiuvuS4uuengeaciVxcXCI7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KTtcXG59XFxuZGF0YS5wdXNoKHNldFNldHRpbmdJdGVtKHtcXG4gICAgdGl0bGU6IFxcXCLliKDpmaTmlbDmja5cXFwiLFxcbiAgICBjb25maXJtOiBcXFwi5piv5ZCm56Gu6K6k5Yig6ZmkXFxcIixcXG4gICAgbXNnOiBbXFxcIuW3suWIoOmZpFxcXCIsIFxcXCLliKDpmaTlpLHotKVcXFwiXSxcXG4gICAgdXJsOiBnZXRBcGkoXFxcImRlbGV0ZVVybFxcXCIpICsgcmVxQnlHZXQsXFxuICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbn0sIHRydWUpKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuiuvue9ruWbvuagh1xcXCIsXFxuICAgIHVybDogJChkYXRhSXRlbS5waWNfdXJsLCBcXFwi6L6T5YWl5Zu+5qCH5Zyw5Z2AXFxcIikuaW5wdXQoYXBpID0+IHtcXG4gICAgICAgIGlmIChpbnB1dCA9PT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L2g5Zyo6YCX5oiR6ZO+5o6l5ZOqP1xcXCJcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGFwaSArIFxcXCImcnVsZV9waWM9XFxcIiArIGlucHV0KTtcXG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXCI7XFxuICAgIH0sIGdldEFwaShcXFwic2V0X3J1bGVfcGljXFxcIikgKyBkYXRhSXRlbS5pZCArIHJlcUJ5R2V0KSxcXG4gICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxufSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmNhbl9kaXNjdXNzID8gXFxcIuemgeatouivhOiuulxcXCIgOiBcXFwi5byA5ZCv6K+E6K66XFxcIixcXG4gICAgdXJsOiAkKGFwaS5kaXNfc2V0ICsgZGF0YUl0ZW0uaWQgKyByZXFCeUdldCArIFxcXCImc3RhdGU9XFxcIiArIChkYXRhSXRlbS5jYW5fZGlzY3VzcyA/IFxcXCJcXFwiIDogMSkpLmxhenlSdWxlKChjYW5fZGlzY3VzcykgPT4ge1xcbiAgICAgICAgcmVxdWVzdChpbnB1dCk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gY2FuX2Rpc2N1c3MgPyBcXFwidG9hc3Q6Ly/lt7LnpoHmraLor4TorrpcXFwiIDogXFxcInRvYXN0Oi8v5bey5byA5ZCv6K+E6K66XFxcIjtcXG4gICAgfSwgZGF0YUl0ZW0uY2FuX2Rpc2N1c3MpLFxcbiAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG59KTtcXG5NWV9QQVJBTVMubmFtZSA9IGRhdGFJdGVtLm5hbWU7XFxuTVlfUEFSQU1TLnVzZXJuYW1lPXVzZXJuYW1lO1xcbk1ZX1BBUkFNUy5wYXNzd29yZD1wYXNzd29yZDtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuiuvue9ruWkh+azqFxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9zZXRfcnVsZV9ub3Rlc1xcXCIsXFxuICAgIGV4dHJhOiBNWV9QQVJBTVMsXFxuICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbn0pO1xcbmlmIChkYXRhSXRlbS5pc19qc29uICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PT0gXFxcImhvbWVfcnVsZV91cmxcXFwiICYmICFkYXRhSXRlbS5pc19qc29uX2xpc3QpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn6L+b5YWl6aKR6YGTJyxcXG4gICAgICAgIHVybDogJCggXFxcIiNub0xvYWRpbmcjXFxcIiApLmxhenlSdWxlKChuYW1lLGhvbWUpID0+IHtcXG4gICAgICAgICAgICBsZXQgaGFzUnVsZSA9IHJlcXVlc3QoJ2hpa2VyOi8vaG9tZUAnK25hbWUpICE9ICdudWxsJztcXG4gICAgICAgICAgICBpZiAoaGFzUnVsZSkge1xcbiAgICAgICAgICAgICAgICBiYWNrVG9Ib21lKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBob21lK1xcXCJzQFxcXCIgKyBuYW1lO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mnKrlronoo4VcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGRhdGFJdGVtLm5hbWUsYXBpLmhvbWUpLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmdvb2RfbnVtLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+i1ni5zdmdcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfM1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmJhZF9udW0sXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6LipLnN2Z1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF8zXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuivhOiuulxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6K+E6K66LnN2Z1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF8zXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1JlcGx5I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBydWxlSWQ6IGRhdGFJdGVtLmlkLFxcbiAgICAgICAgbmFtZTogZGF0YUl0ZW0uYXV0aG9yLFxcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxcbiAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lXFxuICAgIH1cXG59KTtcXG5sZXQgdG90YWxTdW0gPSBkYXRhSXRlbS5nb29kX251bSArIGRhdGFJdGVtLmJhZF9udW07XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLor4TorrooXFxcIiArIHRvdGFsU3VtICsgXFxcIilcXFwiKSArIFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoaHRtbFRhZyhcXFwidVxcXCIsIFxcXCLmn6XnnIvlhajpg6jor4Torroo5o6n6K+EKSA+XFxcIikpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9Db21tZW50XFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHkjZnlwYWdlI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICB0b3RhbFN1bTogdG90YWxTdW0sXFxuICAgICAgICBub19hY3RpdmU6IHRydWUsXFxuICAgICAgICB1c2VybmFtZTogdXNlcm5hbWUsXFxuICAgICAgICBwYXNzd29yZDogcGFzc3dvcmRcXG4gICAgfVxcbn0pO1xcbi8vY29uc3QgbG9uZ2VzdFN1bT0xMjA7XFxubGV0IGljb24gPSB7XFxuICAgIFxcXCJnb29kXFxcIjogXFxcIvCfkY1cXFwiLFxcbiAgICBcXFwiYmFkXFxcIjogXFxcIvCfkY5cXFwiLFxcbiAgICBcXFwicmVwbHlcXFwiOiBcXFwi5byA5Y+R6ICF8J+Xo1xcXCJcXG59XFxuaWYgKHRvdGFsU3VtID09PSAwKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuS4gOadoeivhOiuuuS5n+ayoeacie+8jOW/q+adpeaKouaymeWPkeWQp++8gTwvaDU+XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICB9KTtcXG59IGVsc2Uge1xcbiAgICBsZXQgY29tbWVudExpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmRpc19nZXQgKyBkYXRhSXRlbS5pZCArIFxcXCI/bGltaXQ9NVxcXCIpKS5yZXN1bHQ7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXG4gICAgICAgIGxldCBSZXBseSA9IGl0ZW0uZGlzY3Vzc190eXBlPT09XFxcInJlcGx5XFxcIiYmaXRlbS5yZXBseV90b19uYW1lIT09ZmFsc2UmJml0ZW0ucmVwbHlfdG9faWQhPT1mYWxzZT9cXFwi4oCY4oCY5Zue5aSNQFxcXCIraXRlbS5yZXBseV90b19uYW1lK1xcXCIgI1xcXCIraXRlbS5kaXNjdXNzX2lkK1xcXCLigJnigJlcXFxcblxcXCI6XFxcIlxcXCI7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUgKyBcXFwiJm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9J2dyYXknPjxzbWFsbD4jXFxcIiArIGl0ZW0uaWQgKyBcXFwiPC9zbWFsbD48Zm9udD5cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvUmVwbHlcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgICAgICAgcnVsZUlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXFxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcXG4gICAgICAgICAgICAgICAgcmVwbHlJZDppdGVtLmlkXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5kaXNjdXNzX3RleHQsXFxuICAgICAgICAgICAgZGVzYzogUmVwbHkraXRlbS5jcmVhdGVfZGF0ZSArIFxcXCLCt1xcXCIgKyBpY29uW2l0ZW0uZGlzY3Vzc190eXBlXSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcXG4gICAgICAgICAgICAgICAgdHlwZTogXFxcImxvbmdfdGV4dFxcXCIsXFxuICAgICAgICAgICAgICAgIHRleHQ6IGl0ZW0uZGlzY3Vzc190ZXh0XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJpY29uXzJfcm91bmRcIixcIm5hbWVcIjpcIuinhOWImeWIl+ihqFwiLFwicGF0aFwiOlwicnVsZXNcIixcInJ1bGVcIjpcImpzOlxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuZmlsdGVyXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UudHlwZVxcXCIpO1xcbiAgICBpZiAoZ2V0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcsICcnKSkge1xcbiAgICAgICAgbG9nKCfmk43kvZzov4fnpoHmraLkuIrkvKA6JyArIGdldFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnKSk7XFxuICAgICAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLmNhbl91cGxvYWRcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICB9XFxufSkpO1xcblxcblxcbmNvbnN0IHtcXG4gICAgZ2V0QXBpLFxcbiAgICBhcGksXFxuICAgIGNvbG9yLFxcbiAgICBzbWFsbCxcXG4gICAgbG9jYWxSdWxlVmVyLFxcbiAgICBodG1sVGFnLFxcbiAgICBtZFxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5jb25zdCB7XFxuICAgIG5vcm1hbFNvcnRcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2Uvc29ydFxcXCIpO1xcbmxldCB7XFxuICAgIGF2YXRhclVybCxcXG4gICAgcXEsXFxuICAgIGlkLFxcbiAgICBjYW5fdXBsb2FkXFxufSA9IE1ZX1BBUkFNUztcXG5sZXQgZGF0YVR5cGUgPSBnZXRWYXIoXFxcIldhcmVob3VzZS50eXBlXFxcIiwgXFxcIlxcXCIpO1xcbmxldCBiYWNrQ29kZSA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcInJ1bGVzVXJsXFxcIikgKyBcXFwiP25hbWU9XFxcIiArIHFxICsgXFxcIiZkYXRhX3R5cGU9XFxcIiArIGRhdGFUeXBlKSk7XFxubGV0IGRldk5hbWUgPSBiYWNrQ29kZS5kZXZfbmFtZTtcXG5wdXRWYXIoXFxcIldhcmVob3VzZS5maWx0ZXJcXFwiLCBkZXZOYW1lKTtcXG5sZXQgcnVsZUxpc3QgPSBiYWNrQ29kZS5yZXN1bHQ7XFxubGV0IHN1YlVybCA9IGdldEFwaShcXFwianNvbkxpc3RcXFwiKSArIFxcXCI/bmFtZT1cXFwiICsgcXE7XFxubGV0IGhhc1N1YiA9IGhhc0hvbWVTdWIoc3ViVXJsKTtcXG5sZXQgZGV2SW5mbyA9IFxcXCLov5nkuKrkurrlvojmh5Is5LuA5LmI6YO95rKh5YaZ5ZOmflxcXCI7XFxubGV0IHRtcEpzb24gPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXCJpbmZvR2V0VXJsXFxcIikgKyBxcSkpO1xcbmlmICh0bXBKc29uLnN0YXR1cyA9PSAwKSB7XFxuICAgIGRldkluZm8gPSB0bXBKc29uLnJlc3VsdCB8fCBkZXZJbmZvO1xcbn1cXG5sZXQgc3ViRmxhZyA9IGhhc1N1YiA/ICfwn4aXJyA6ICfwn5OhJztcXG5sZXQgZGF0YSA9IFtdO1xcbnJlcXVpcmUobWQpO1xcbmRldkluZm8gPSBtYXJrZWQucGFyc2UoZGV2SW5mbyk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgZGV2TmFtZSArIFxcXCJcXFxcblxcXFxuXFxcIiArIHNtYWxsKGh0bWxUYWcoXFxcInVcXFwiLCBcXFwi54K55Ye75p+l55yL5a6M5pW05YWs5ZGKXFxcIikpLFxcbiAgICBkZXNjOiBzbWFsbChkZXZJbmZvKSxcXG4gICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2luZm8nLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGV4dDogZGV2SW5mbyxcXG4gICAgICAgIG5hbWU6IGRldk5hbWUsXFxuICAgICAgICB0eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICB9LFxcbiAgICBwaWNfdXJsOiBhdmF0YXJVcmwsXFxuICAgIGNvbF90eXBlOiAnbW92aWVfMV92ZXJ0aWNhbF9waWMnXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCI8YmlnPuiuoumYheeuoeeQhjwvYmlnPiZuYnNwOyZuYnNwOzxzbWFsbD4o5b2T5YmNXFxcIiArIChoYXNTdWIgPyBcXFwi5bey6K6i6ZiFXFxcIiA6IFxcXCLmnKrorqLpmIVcXFwiKSArIFxcXCIpPC9zbWFsbD5cXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG59KTtcXG5cXG5sZXQgc3ViX2NvZGUgPSAn5rW36ZiU6KeG55WM5ZCI6ZuG6KeE5YiZ6K6i6ZiF77+laG9tZV9zdWLvv6UnICsgZGV2TmFtZSArIFxcXCLlkIjpm4ZAQFxcXCIgKyBzdWJVcmw7XFxubGV0IHJ1bGVzQ29kZSA9ICfmtbfpmJTop4bnlYzlkIjpm4bop4TliJnvv6Vob21lX3J1bGVfdXJs77+lJyArIHN1YlVybDtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI2ZmNzAwMFxcXCI+5LiA6ZSu6K6i6ZiFPC9zcGFuPicsXFxuICAgIGRlc2M6ICforqLpmIXigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6ICM1Y2ZmMmNcXFwiPicgKyBkZXZOYW1lICsgJzwvc3Bhbj7nmoTmiYDmnInljZXop4TliJnvvIzlkIjpm4bpnIDljZXni6zorqLpmIUnLFxcbiAgICB1cmw6IHN1Yl9jb2RlLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMidcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI2ZmNzAwMFxcXCI+5a+85YWl5YWo6YOoPC9zcGFuPicsXFxuICAgIHVybDogcnVsZXNDb2RlLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMidcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI2ZmNzAwMFxcXCI+5a+85YWl6L275ZCI6ZuGPC9zcGFuPicsXFxuICAgIHVybDogJCgpLmxhenlSdWxlKChkZXZOYW1lLCBzdWJVcmwsIGF2YXRhclVybCkgPT4ge1xcbiAgICAgICAgY29uc3Qge1xcbiAgICAgICAgICAgIGdlblJ1bGVcXG4gICAgICAgIH0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9nZW5BcGlcXFwiKTtcXG4gICAgICAgIGxvZyhcXFwi6L275ZCI6ZuG5Zu+5qCH6ZO+5o6lOlxcXCIgKyBhdmF0YXJVcmwpO1xcbiAgICAgICAgbGV0IGltcG9ydF9ydWxlID0gZ2VuUnVsZShcXFwi6L275ZCI6ZuGLlxcXCIgKyBkZXZOYW1lLCBzdWJVcmwsIGF2YXRhclVybCk7XFxuICAgICAgICAvL2NvcHkoaW1wb3J0X3J1bGUpO1xcbiAgICAgICAgbGV0IHJ1bGVDb2RlID0gcGFyc2VQYXN0ZShpbXBvcnRfcnVsZS5zcGxpdChcXFwiXFxcXG5cXFwiKVswXSk7XFxuICAgICAgICAvL3JldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICByZXR1cm4gaW1wb3J0VXJsXFxuICAgIH0sIGRldk5hbWUsIHN1YlVybCwgYXZhdGFyVXJsKSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPuWvvOWFpemBk+W+t+e7jzwvc3Bhbj4nLFxcbiAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZGV2TmFtZSwgc3ViVXJsLCBhdmF0YXJVcmwpID0+IHtcXG4gICAgICAgIGxldCB0aXRsZSA9IFxcXCJILVxcXCIgKyBkZXZOYW1lO1xcbiAgICAgICAgbGV0IHN1Yk9iaiA9IHtcXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgdXJsOiBzdWJVcmwsXFxuICAgICAgICAgICAgZGVzYzogXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9ydWxlQ2FjaGUvXFxcIiArIHRpdGxlICsgXFxcIi5qc29uXFxcIixcXG4gICAgICAgICAgICBjb2RlOiBcXFwiXFxcIixcXG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLCAvL+emgeeUqOW5tuWPkeabtOaWsFxcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHNoYXJlVGV4dCA9IGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShzdWJPYmopKTtcXG4gICAgICAgIHZhciBwYXN0ZXMgPSBnZXRQYXN0ZXMoKTtcXG4gICAgICAgIHZhciB1cmwgPSBzaGFyZVBhc3RlKHNoYXJlVGV4dCwgcGFzdGVzLnNsaWNlKC0xKVswXSk7XFxuICAgICAgICBsZXQgaW1wb3J0X3J1bGUgPSBcXFwi6L275ZCI6ZuG6K6i6ZiF77yaXFxcIiArIHRpdGxlICsgJ1xcXFxuJyArIHVybDtcXG4gICAgICAgIGNvcHkoaW1wb3J0X3J1bGUpO1xcbiAgICAgICAgY29uc3QgcGF0aCA9ICdoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvcnVsZUNhY2hlL3N1Yi5qc29uJztcXG4gICAgICAgICQucmMoY29uZmlnLmxpYi5zdWIpO1xcbiAgICAgICAgcmV0dXJuIOiuoumYheWvvOWFpShwYXRoKVxcbiAgICB9LCBkZXZOYW1lLCBzdWJVcmwsIGF2YXRhclVybCksXFxuICAgIGNvbF90eXBlOiAndGV4dF8yJ1xcbn0pO1xcbmxldCBjYW5fdXBsb2FkX2FwaSA9IGdldEFwaShcXFwibWFuQ2FuVXBsb2FkXFxcIikgKyBpZDtcXG5pZiAoZ2V0VmFyKCdob3VzZS5pc19tYW5hZ2VyJykpIHtcXG4gICAgbGV0IHRpcHMgPSBjYW5fdXBsb2FkID8gJ+iDvScgOiAn5ZCmJztcXG4gICAgLy8gbG9nKCd0aXBzOicrdGlwcyk7XFxuICAgIC8vIGxvZygnY2FuX3VwbG9hZDonK2Nhbl91cGxvYWQpO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfimqDog73lkKbkuIrkvKA6JyArIChnZXRWYXIoJ1dhcmVob3VzZS5jYW5fdXBsb2FkJykgfHwgdGlwcyksXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgfSk7XFxuXFxuICAgIGZ1bmN0aW9uIHNldFVwbG9hZChmbGFnLCBjYW5fdXBsb2FkX2FwaSkge1xcbiAgICAgICAgZmxhZyA9IGZsYWcgfHwgJyc7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBjb2RlID0gZmV0Y2goY2FuX3VwbG9hZF9hcGksIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBNT0JJTEVfVUFcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwidXNlcm5hbWVcXFwiOiBnZXRWYXIoJ2hvdXNlLnVzZXJuYW1lJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogZ2V0VmFyKCdob3VzZS5wYXNzd29yZCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJjYW5fdXBsb2FkXFxcIjogISFmbGFnXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBjb2RlID0gSlNPTi5wYXJzZShjb2RlKS5yZXN1bHQ7XFxuICAgICAgICAgICAgaWYgKGNvZGUuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgZS5tZXNzYWdlXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn8J+aq+emgeatouS4iuS8oCcsXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiAkKCfnpoHmraLor6XlvIDlj5HogIXkuIrkvKDop4TliJk/5L2g55qE5pON5L2c5bCG6KKr57O757uf6K6w5b2VJykuY29uZmlybSgoaWQsIGNhbl91cGxvYWRfYXBpLCBzZXRVcGxvYWQpID0+IHtcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0VXBsb2FkKGZhbHNlLCBjYW5fdXBsb2FkX2FwaSk7XFxuICAgICAgICAgICAgaWYgKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpIHtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcsICflkKYnKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJyArIHJldFxcbiAgICAgICAgfSwgaWQsIGNhbl91cGxvYWRfYXBpLCBzZXRVcGxvYWQpXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfinIXlhYHorrjkuIrkvKAnLFxcbiAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDogJCgn5YWB6K646K+l5byA5Y+R6ICF5LiK5Lyg6KeE5YiZP+S9oOeahOaTjeS9nOWwhuiiq+ezu+e7n+iusOW9lScpLmNvbmZpcm0oKGlkLCBjYW5fdXBsb2FkX2FwaSwgc2V0VXBsb2FkKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldFVwbG9hZCh0cnVlLCBjYW5fdXBsb2FkX2FwaSk7XFxuICAgICAgICAgICAgaWYgKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpIHtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcsICfmmK8nKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJyArIHJldFxcbiAgICAgICAgfSwgaWQsIGNhbl91cGxvYWRfYXBpLCBzZXRVcGxvYWQpXFxuICAgIH0pO1xcbn1cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIjxzbWFsbD7mj5DnpLrvvJrlvIDlj5HogIXljZXni6zliIbkuqvnmoTlkIjpm4bmlofku7blj6rog73ljZXni6zlr7zlhaXjgII8L3NtYWxsPlxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiPGJpZz7op4TliJnliJfooag8L2JpZz4mbmJzcDsmbmJzcDs8c21hbGw+KOWFsVxcXCIgKyBydWxlTGlzdC5sZW5ndGggKyBcXFwi5p2hKTwvc21hbGw+XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxufSk7XFxubGV0IGRhdGFUeXBlTGlzdCA9IHtcXG4gICAgXFxcIlxcXCI6IFxcXCLlhajpg6hcXFwiLFxcbiAgICBcXFwiaG9tZV9ydWxlX3VybFxcXCI6ICflsI/nqIvluo8nLFxcbiAgICAvL1xcXCJwdWJsaXNoXFxcIjogJ+aPkOS6pOS6keS7k+W6k+inhOWImScsXFxuICAgIFxcXCJqc191cmxcXFwiOiAn572R6aG15o+S5Lu2JyxcXG4gICAgXFxcImh0bWxcXFwiOiAn6Z2Z5oCB6aG16Z2iJyxcXG4gICAgXFxcImNvbmZpZ1xcXCI6ICfkuLvpopgnXFxufTtcXG5mb3IgKGxldCBrZXkgaW4gZGF0YVR5cGVMaXN0KSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogZGF0YVR5cGUgPT09IGtleSA/IFxcXCLigJzigJxcXFwiICsgZGF0YVR5cGVMaXN0W2tleV0gKyBcXFwi4oCd4oCdXFxcIiA6IGRhdGFUeXBlTGlzdFtrZXldLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChrZXkpID0+IHtcXG4gICAgICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS50eXBlXFxcIiwga2V5KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIGtleSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxuICAgIH0pO1xcbn1cXG5pZiAocnVsZUxpc3QubGVuZ3RoID4gMjApIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5pCc57SiXFxcIixcXG4gICAgICAgIHVybDogJC50b1N0cmluZyhuYW1lID0+IFxcXCJoaWtlcjovL3NlYXJjaD9zPVxcXCIgKyBpbnB1dCArIFxcXCImcnVsZT1cXFwiICsgbmFtZSwgTVlfUlVMRS50aXRsZSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICAgIGRlc2M6IFxcXCLmkJzntKLlvZPliY3lvIDlj5HogIXnmoTop4TliJlcXFwiXFxuICAgIH0pO1xcbn1cXG5sZXQgaG9tZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmhvbWUpKTtcXG5sZXQgbVJ1bGVMaXN0ID0gW107XFxuZm9yICh2YXIgaXRlbSBvZiBydWxlTGlzdCkge1xcbiAgICB2YXIgbmFtZSA9IGl0ZW0ubmFtZTtcXG4gICAgaWYgKGl0ZW0uaXNfdGFwKSB7XFxuICAgICAgICBsZXQgbG9jYXRpb24gPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXCJydWxlTGlzdEpzb25cXFwiKSArIFxcXCI/aWQ9XFxcIiArIGl0ZW0uaWQpKTtcXG4gICAgICAgIGl0ZW0uaWQgPSBsb2NhdGlvbi5pZDtcXG4gICAgICAgIGl0ZW0ubmFtZSA9IGxvY2F0aW9uLm5hbWU7XFxuICAgICAgICBpdGVtLmF1dGhvciA9IGxvY2F0aW9uLmF1dGhvcjtcXG4gICAgICAgIGl0ZW0uZGF0YV90eXBlID0gbG9jYXRpb24uZGF0YV90eXBlO1xcbiAgICAgICAgaXRlbS52ZXIgPSBsb2NhdGlvbi52ZXJcXG4gICAgfVxcbiAgICBpdGVtLnZlcnNpb24gPSBpdGVtLnZlcjtcXG4gICAgbGV0IGxhYmVsID0gXFxcIlxcXCIsXFxuICAgICAgICBsdmVyID0gLTI7XFxuICAgIGlmIChpdGVtLmlzX2pzb24gJiYgaXRlbS5kYXRhX3R5cGUgPT09IFxcXCJob21lX3J1bGVfdXJsXFxcIikge1xcbiAgICAgICAgbHZlciA9IGxvY2FsUnVsZVZlcihob21lTGlzdCwgaXRlbSk7XFxuICAgICAgICBpZiAobHZlciA9PT0gLTEpIHtcXG4gICAgICAgICAgICBsYWJlbCA9IFxcXCLwn4aVXFxcIjtcXG4gICAgICAgIH0gZWxzZSBpZiAobHZlciA8IGl0ZW0udmVyKSB7XFxuICAgICAgICAgICAgbGFiZWwgPSBcXFwi8J+GmVxcXCI7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgbVJ1bGVMaXN0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGxhYmVsICsgbmFtZSxcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGx2ZXI6IGx2ZXIsXFxuICAgICAgICAgICAgaWQ6IGl0ZW0uaWRcXG4gICAgICAgIH0sXFxuICAgICAgICBwaWNfdXJsOiBpdGVtLnBpYyxcXG4gICAgfSk7XFxufVxcbi8qIOW9kuW5tuaOkuW6jyBTdGFydCAqL1xcbmlmIChnZXRJdGVtKFxcXCLmjpLluo9cXFwiLCBcXFwi5pe26Ze05LyY5YWIXFxcIikgPT09ICfmlrDniYjkvJjlhYgnKSB7XFxuICAgIG1SdWxlTGlzdCA9IG5vcm1hbFNvcnQobVJ1bGVMaXN0KTtcXG59XFxuLyog5b2S5bm25o6S5bqPIEVuZCAqL1xcbmRhdGEucHVzaC5hcHBseShkYXRhLCBtUnVsZUxpc3QpXFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6KeE5YiZ6K+m57uGLXVzZXJcIixcInBhdGhcIjpcInJ1bGVEZXRhaWxcIixcInJ1bGVcIjpcImpzOlxcbiAgICBjb25zdCB7XFxuICAgICAgICBnZXRBcGksXFxuICAgICAgICBjb2xvcixcXG4gICAgICAgIHNtYWxsLFxcbiAgICAgICAgaHRtbFRhZyxcXG4gICAgICAgIGFwaSxcXG4gICAgICAgIG1kXFxuICAgIH0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5sZXQge1xcbiAgICBpZCxcXG4gICAgbHZlcixcXG4gICAgaXNBbGxcXG59ID0gTVlfUEFSQU1TO1xcbmlmKGdldFBhcmFtKFxcXCJpZFxcXCIpKXtcXG4gICAgaXNBbGwgPSB0cnVlO1xcbiAgICBpZCA9IGdldFBhcmFtKFxcXCJpZFxcXCIpO1xcbiAgICBsdmVyID0gbHZlciB8fCBcXFwi5pyq6I635Y+W54mI5pys5Y+3XFxcIjtcXG59XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKChpc0FsbCkgPT4ge1xcbiAgICBpZighaXNBbGwpe1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICB9XFxufSxpc0FsbCkpO1xcbmxldCBkYXRhSXRlbSA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcImdldGJ5aWRcXFwiKSArIFxcXCI/aWQ9XFxcIiArIGlkKSkucmVzdWx0O1xcbnNldFBhZ2VUaXRsZShcXFwi44CMXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwi44CNXFxcIilcXG5sZXQgcnVsZUxpc3RKc29uID0gZ2V0QXBpKFxcXCJydWxlTGlzdEpzb25cXFwiKSArIFxcXCI/aWQ9XFxcIjtcXG5sZXQgZGF0YSA9IFtdO1xcbnZhciBoYXNTdWIgPSBmYWxzZTtcXG5cXG5pZiAoZGF0YUl0ZW0uaXNfanNvbl9saXN0KSB7XFxuICAgIGhhc1N1YiA9IGhhc0hvbWVTdWIocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpO1xcbn0gZWxzZSBpZiAoIWRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT0gJ2hvbWVfcnVsZV91cmwnKSB7XFxuICAgIGhhc1N1YiA9IGhhc0hvbWVTdWIocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyAnJmRlYnVnPXRydWUnKTtcXG59XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLniYjmnKxcXFwiKSxcXG4gICAgZGVzYzogXFxcIuKAnOKAnOKAneKAneW8gOWPkeiAhe+8mlxcXCIgKyBjb2xvcihkYXRhSXRlbS5hdXRob3IsIFxcXCIjMjI4QkU2XFxcIikgKyBcXFwiXFxcXG7kupHnq6/niYjmnKzvvJpcXFwiICsgY29sb3IoZGF0YUl0ZW0udmVyLCBcXFwiIzVjZmYyY1xcXCIpICsgXFxcIlxcXFx0XFxcXHTmnKzlnLDniYjmnKzvvJpcXFwiICsgY29sb3IobHZlciwgXFxcIiM1Y2ZmMmNcXFwiKSArIFxcXCJcXFxcbuabtOaWsOS6jjogW1xcXCIgKyBjb2xvcihkYXRhSXRlbS5sYXN0X3VwZGF0ZSwgXFxcIiNmZjcwMDBcXFwiKSArIFxcXCJdXFxcIixcXG4gICAgdXJsOiAkKFxcXCI85byA5Y+R6ICFPlxcXFxuXFxcIiArIGRhdGFJdGVtLmF1dGhvciArIFxcXCJcXFxcbjzlkI3np7A+XFxcXG5cXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCJcXFxcbjzkupHnq6/niYjmnKw+XFxcXG5cXFwiICsgZGF0YUl0ZW0udmVyICsgXFxcIlxcXFxuPOacrOWcsOeJiOacrD5cXFxcblxcXCIgKyBsdmVyICsgXFxcIlxcXFxuPOabtOaWsOaXtumXtD5cXFxcbltcXFwiICsgZGF0YUl0ZW0ubGFzdF91cGRhdGUgKyBcXFwiXVxcXCIpLmNvbmZpcm0oKCkgPT4ge30pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMSdcXG59KTtcXG5sZXQgZGF0YVR5cGUgPSB7XFxuICAgIGhvbWVfcnVsZV91cmw6ICfpppbpobXkupHop4TliJknLFxcbiAgICBwdWJsaXNoOiAn5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZJyxcXG4gICAganNfdXJsOiAn572R6aG15o+S5Lu26KeE5YiZJyxcXG4gICAgaHRtbDogJ+mdmeaAgemhtemdoicsXFxuICAgIGNvbmZpZzogJ+S4u+mhtemFjee9ridcXG59O1xcblxcbmxldCBiYXNpYyA9IHtcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn07XFxubGV0IGRhdGFUeXBlVGlwcyA9IGRhdGFUeXBlW2RhdGFJdGVtLmRhdGFfdHlwZV0gfHwgJ+acquefpeinhOWIme+8micgKyBkYXRhSXRlbS5kYXRhX3R5cGU7XFxuXFxubGV0IHNhZmVfdGlwPWRhdGFJdGVtLmlzX3NhZmU/XFxcIuWuieWFqFxcXCI6XFxcIuWNsemZqVxcXCI7XFxubGV0IGdvb2RfdGlwID0gZGF0YUl0ZW0uaXNfZ29vZD9zbWFsbChjb2xvcihcXFwi44CQ5LyY6LSo6KeE5YiZ44CRXFxcIiwnI2ZmNzAwMCcpKTpcXFwiXFxcIjtcXG5sZXQgbm90X3NhZmVfbm90ZT1kYXRhSXRlbS5ub3Rfc2FmZV9ub3RlO1xcbmJhc2ljLnRpdGxlID0gaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuexu+Wei1xcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChcXFwiKGlkOlxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXCIpXFxcIikrXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChcXFwiKOmjjumZqeajgOa1izpcXFwiICtzYWZlX3RpcCtcXFwiKVxcXCIpK2dvb2RfdGlwO1xcbmJhc2ljLmRlc2MgPSBcXFwi5pWw5o2u57G75Z6L77yaXFxcIiArIGNvbG9yKGRhdGFUeXBlVGlwcywgXFxcIiNjYjU0ZmZcXFwiKSArIFxcXCJcXFxcbuWIhuS6q+eKtuaAgeS4uu+8mlxcXCIgKyBkYXRhSXRlbS5zdGF0ZTtcXG5pZiAoW1xcXCJodG1sXFxcIiwgXFxcImNvbmZpZ1xcXCIsIFxcXCJqc191cmxcXFwiXS5pbmNsdWRlcyhkYXRhSXRlbS5kYXRhX3R5cGUpKSB7XFxuICAgIGJhc2ljLmRlc2MgKz0gXFxcIlxcXFxu4oCc4oCc4oCd4oCdID0+XFxcIiArIHNtYWxsKFxcXCLngrnmraTpooTop4hcXFwiKTtcXG4gICAgYmFzaWMudXJsID0gcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxufVxcblxcbmRhdGEucHVzaChiYXNpYyk7XFxubGV0IGhhc1N1YnMgPSBcXFwiXFxcIjtcXG5pZiAoaGFzU3ViKSB7XFxuICAgIGhhc1N1YnMgPSBcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIHNtYWxsKFxcXCLlt7LorqLpmIVcXFwiKVxcbn1cXG5cXG5sZXQgbm90ZXMgPSByZXF1ZXN0KGdldEFwaShcXFwiZ2V0X3J1bGVfbm90ZVxcXCIpICsgaWQpO1xcbm5vdGVzID0gSlNPTi5wYXJzZShub3RlcykucmVzdWx0O1xcbnJlcXVpcmUobWQpO1xcbmxldCBub3Rlc0h0bWw9XFxcIlxcXCJcXG50cnl7XFxuICAgIG5vdGVzSHRtbD1tYXJrZWQucGFyc2Uobm90ZXMpO1xcbn1jYXRjaChlKXt9XFxuXFxuaWYgKG5vdGVzICE9PSBmYWxzZSkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLlpIfms6hcXFwiKSArIFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoaHRtbFRhZyhcXFwidVxcXCIsIFxcXCLmn6XnnIvlrozmlbTlhazlkYogPlxcXCIpKSxcXG4gICAgICAgIGRlc2M6IG5vdGVzLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0ZXh0OiBub3Rlc0h0bWwsXFxuICAgICAgICAgICAgbmFtZTogZGF0YUl0ZW0ubmFtZSxcXG4gICAgICAgICAgICAvLyB0eXBlOiBcXFwibG9uZ190ZXh0XFxcIlxcbiAgICAgICAgICAgIHR5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuaTjeS9nCjliIbkuqvor6bnu4bpobUpXFxcIikgKyBoYXNTdWJzLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcImNvcHk6Ly/pgZPplb/ku5PlupPjgIxcXFwiK2RhdGFJdGVtLm5hbWUrXFxcIuOAjVxcXFxuXFxcIitpZCsnQGltcG9ydD1qczokLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsSW1wb3J0P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIiwgaW5wdXQpJ1xcbn0pO1xcbmxldCBpbXBvcnRVcmwsIHJ1bGVDb2RlLCBzaGFyZVVybCwgYmFja0NvZGUgPSBcXFwiXFxcIjtcXG5pZiAoIWRhdGFJdGVtLmlzX2pzb24pIHtcXG4gICAgYmFja0NvZGUgPSByZXF1ZXN0KHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkKTtcXG59XFxuc3dpdGNoIChkYXRhSXRlbS5kYXRhX3R5cGUpIHtcXG4gICAgY2FzZSBcXFwiaG9tZV9ydWxlX3VybFxcXCI6XFxuICAgICAgICBydWxlQ29kZSA9IFxcXCLmtbfpmJTop4bnlYzpppbpobXpopHpgZPop4TliJnjgJBcXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCLjgJHvv6Vob21lX3J1bGVfdXJs77+lXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcbiAgICAgICAgaW1wb3J0VXJsID0gXFxcInJ1bGU6Ly9cXFwiICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKVxcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgJ3B1Ymxpc2gnOlxcbiAgICAgICAgcnVsZUNvZGUgPSAn5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77yaJyArIGRhdGFJdGVtLm5hbWUgKyAn77+lcHVibGlzaO+/pScgKyBiYXNlNjRFbmNvZGUoYmFja0NvZGUpO1xcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlICdqc191cmwnOlxcbiAgICAgICAgcnVsZUNvZGUgPSAn5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77ya572R6aG15o+S5Lu277+lanNfdXJs77+lJyArIGRhdGFJdGVtLm5hbWUgKyAnQGJhc2U2NDovLycgKyBiYXNlNjRFbmNvZGUoYmFja0NvZGUpO1xcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlICdodG1sJzpcXG4gICAgICAgIGxldCBmaWxlX3RtcCA9IGRhdGFJdGVtLm5hbWUuc3BsaXQoJy4nKTtcXG4gICAgICAgIGxldCBmaWxlX3BhdGggPSBmaWxlX3RtcC5sZW5ndGggPiAxID8gZmlsZV90bXBbZmlsZV90bXAubGVuZ3RoIC0gMV0gKyBcXFwiL1xcXCIgKyBkYXRhSXRlbS5uYW1lIDogZGF0YUl0ZW0ubmFtZTtcXG4gICAgICAgIHJ1bGVDb2RlID0gXFxcIua1t+mYlOinhueVjOacrOWcsOaWh+S7tuWIhuS6q++/pWZpbGVfdXJs77+laGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL1xcXCIgKyBmaWxlX3BhdGggKyBcXFwiQFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVha1xcbiAgICBjYXNlIFxcXCJjb25maWdcXFwiOlxcbiAgICAgICAgaW1wb3J0VXJsID0gJCgpLnJ1bGUocGFzc3dvcmQgPT4ge1xcbiAgICAgICAgICAgIGV2YWwoZmV0Y2goXFxcImhpa2VyOi8vYXNzZXRzL2hvbWUuanNcXFwiKSk7XFxuICAgICAgICAgICAgSGlrZXJIb21lLmxvYWQoXFxcImltcG9ydFxcXCIsIHBhc3N3b3JkKTtcXG4gICAgICAgIH0sIGJhY2tDb2RlKTtcXG4gICAgICAgIGJyZWFrO1xcbn1cXG5sZXQgbXlfY29sX3R5cGUgPSBcXFwidGV4dF8yXFxcIjtcXG5sZXQgbXlfY29sX3R5cGUyID0gXFxcInRleHRfM1xcXCI7XFxuaWYgKGltcG9ydFVybCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlr7zlhaXop4TliJlcXFwiLFxcbiAgICAgICAgdXJsOiBkYXRhSXRlbS5pc19zYWZlP2ltcG9ydFVybDondG9hc3Q6Ly/po47pmanop4TliJnnpoHmraLlr7zlhaUhISEnLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5pZiAocnVsZUNvZGUpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5YiG5Lqr5Y+j5LukXFxcIixcXG4gICAgICAgIHVybDogXFxcImNvcHk6Ly9cXFwiICsgcnVsZUNvZGUsXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSk7XFxufVxcblxcbmlmIChpbXBvcnRVcmwpIHtcXG4gICAgaWYgKGRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiAhaGFzU3ViKSB7XFxuICAgICAgICBsZXQgc3ViX3J1bGVfY29kZSA9ICfmtbfpmJTop4bnlYzlkIjpm4bop4TliJnorqLpmIXvv6Vob21lX3N1Yu+/pScgKyBkYXRhSXRlbS5uYW1lICsgXFxcIkBAXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcbiAgICAgICAgbGV0IHN1Yl91cmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUoc3ViX3J1bGVfY29kZSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn6K6i6ZiF5ZCI6ZuGJyxcXG4gICAgICAgICAgICB1cmw6IHN1Yl91cmwsXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlMlxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY3MDAwXFxcIj7lr7zlhaXovbvlkIjpm4Y8L3NwYW4+JyxcXG4gICAgICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZGF0YUl0ZW0sc3ViVXJsKT0+e1xcbiAgICAgICAgICAgICAgICBjb25zdCB7Z2VuUnVsZX09JC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvZ2VuQXBpXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBpbXBvcnRfcnVsZT1nZW5SdWxlKGRhdGFJdGVtLm5hbWUrXFxcIi5cXFwiK2RhdGFJdGVtLmF1dGhvcixzdWJVcmwpO1xcbiAgICAgICAgICAgICAgICAvL2NvcHkoaW1wb3J0X3J1bGUpO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZUNvZGU9cGFyc2VQYXN0ZShpbXBvcnRfcnVsZS5zcGxpdChcXFwiXFxcXG5cXFwiKVswXSk7XFxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gaW1wb3J0VXJsXFxuICAgICAgICAgICAgfSxkYXRhSXRlbSxydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCksXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlMlxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY3MDAwXFxcIj7lr7zlhaXpgZPlvrfnu488L3NwYW4+JyxcXG4gICAgICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZGF0YUl0ZW0sc3ViVXJsKT0+e1xcbiAgICAgICAgICAgICAgICAvLyBsZXQgdGl0bGUgPSBcXFwiSC1cXFwiK2RhdGFJdGVtLm5hbWUrXFxcIi5cXFwiK2RhdGFJdGVtLmF1dGhvcjtcXG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gXFxcIkotXFxcIitkYXRhSXRlbS5uYW1lLnNwbGl0KCcuJylbMF07XFxuICAgICAgICAgICAgICAgIGxldCBzdWJPYmogPSB7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHN1YlVybCxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvcnVsZUNhY2hlL1xcXCIrdGl0bGUrXFxcIi5qc29uXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSwvL+emgeeUqOW5tuWPkeabtOaWsFxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGxldCBzaGFyZVRleHQgPSBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoc3ViT2JqKSk7XFxuICAgICAgICAgICAgICAgIHZhciBwYXN0ZXMgPSBnZXRQYXN0ZXMoKTtcXG4gICAgICAgICAgICAgICAgdmFyIHVybCA9IHNoYXJlUGFzdGUoc2hhcmVUZXh0LHBhc3Rlcy5zbGljZSgtMSlbMF0pO1xcbiAgICAgICAgICAgICAgICBsZXQgaW1wb3J0X3J1bGU9IFxcXCLovbvlkIjpm4borqLpmIXvvJpcXFwiK3RpdGxlKydcXFxcbicrdXJsO1xcbiAgICAgICAgICAgICAgICBjb3B5KGltcG9ydF9ydWxlKTtcXG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9ICdoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvcnVsZUNhY2hlL3N1Yi5qc29uJztcXG4gICAgICAgICAgICAgICAgJC5yYyhjb25maWcubGliLnN1Yik7XFxuICAgICAgICAgICAgICAgIHJldHVybiDorqLpmIXlr7zlhaUocGF0aClcXG4gICAgICAgICAgICB9LGRhdGFJdGVtLHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGUyXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCI8c21hbGw+5o+Q56S677ya5byA5Y+R6ICF5Y2V54us5YiG5Lqr55qE5ZCI6ZuG5paH5Lu25Y+q6IO95Y2V54us5a+85YWl44CCPC9zbWFsbD5cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH0gZWxzZSBpZiAoIWRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiAhaGFzU3ViICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PSAnaG9tZV9ydWxlX3VybCcpIHtcXG4gICAgICAgIGxldCBzdWJfcnVsZV9jb2RlID0gJ+a1t+mYlOinhueVjOWNleinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lJyArIGRhdGFJdGVtLm5hbWUgKyBcXFwiQEBcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyAnJmRlYnVnPXRydWUnO1xcbiAgICAgICAgbGV0IHN1Yl91cmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUoc3ViX3J1bGVfY29kZSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn6K6i6ZiF6KeE5YiZJyxcXG4gICAgICAgICAgICB1cmw6IHN1Yl91cmwsXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgICAgICB9KVxcbiAgICB9XFxufVxcbmlmIChkYXRhSXRlbS5pc19qc29uICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PT0gXFxcImhvbWVfcnVsZV91cmxcXFwiICYmICFkYXRhSXRlbS5pc19qc29uX2xpc3QpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn6L+b5YWl6aKR6YGTJyxcXG4gICAgICAgIHVybDogJCggXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKG5hbWUsaG9tZSkgPT4ge1xcbiAgICAgICAgICAgIGxldCBoYXNSdWxlID0gcmVxdWVzdCgnaGlrZXI6Ly9ob21lQCcrbmFtZSkgIT0gJ251bGwnO1xcbiAgICAgICAgICAgIGlmIChoYXNSdWxlKSB7XFxuICAgICAgICAgICAgICAgIGJhY2tUb0hvbWUoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvbWUrXFxcInNAXFxcIiArIG5hbWU7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acquWuieijhVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgZGF0YUl0ZW0ubmFtZSxhcGkuaG9tZSksXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSlcXG59XFxubGV0IG1hbl9ydWxlX3NhZmUgPSBnZXRBcGkoXFxcIm1hblJ1bGVTYWZlXFxcIikrZGF0YUl0ZW0uaWQ7XFxubGV0IG1hbl9ydWxlX2dvb2QgPSBnZXRBcGkoXFxcIm1hblJ1bGVHb29kXFxcIikrZGF0YUl0ZW0uaWQ7XFxuLy8gZGF0YUl0ZW0uaXNfc2FmZTtcXG5pZihnZXRWYXIoJ2hvdXNlLmlzX21hbmFnZXInKSl7XFxuICAgIGZ1bmN0aW9uIHNldElzU2FmZShmbGFnLG1hbl9ydWxlX3NhZmUpIHtcXG4gICAgICAgIGZsYWcgPSBmbGFnIHx8ICcnO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgY29kZSA9IGZldGNoKG1hbl9ydWxlX3NhZmUsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXCJVc2VyLUFnZW50XFxcIjogTU9CSUxFX1VBfSxcXG4gICAgICAgICAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwidXNlcm5hbWVcXFwiOiBnZXRWYXIoJ2hvdXNlLnVzZXJuYW1lJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IGdldFZhcignaG91c2UucGFzc3dvcmQnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImlzX3NhZmVcXFwiOiAhIWZsYWdcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBjb2RlID0gSlNPTi5wYXJzZShjb2RlKS5yZXN1bHQ7XFxuICAgICAgICAgICAgaWYgKGNvZGUuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgZS5tZXNzYWdlXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgZnVuY3Rpb24gc2V0SXNHb29kKGZsYWcsbWFuX3J1bGVfZ29vZCkge1xcbiAgICAgICAgZmxhZyA9IGZsYWcgfHwgJyc7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBjb2RlID0gZmV0Y2gobWFuX3J1bGVfZ29vZCwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcIlVzZXItQWdlbnRcXFwiOiBNT0JJTEVfVUF9LFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1c2VybmFtZVxcXCI6IGdldFZhcignaG91c2UudXNlcm5hbWUnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogZ2V0VmFyKCdob3VzZS5wYXNzd29yZCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiaXNfZ29vZFxcXCI6ICEhZmxhZ1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGNvZGUgPSBKU09OLnBhcnNlKGNvZGUpLnJlc3VsdDtcXG4gICAgICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBlLm1lc3NhZ2VcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6J/Cfmqvpo47pmaknLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uumjjumZqT/po47pmanop4TliJnml6Dms5Xooqvlr7zlhaUnKS5jb25maXJtKChpZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSk9PntcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNTYWZlKGZhbHNlLG1hbl9ydWxlX3NhZmUpO1xcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSlcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon4pyF5q2j5bi4JyxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDokKCfmoIforrDor6Xop4TliJnkuLrmraPluLg/JykuY29uZmlybSgoaWQsbWFuX3J1bGVfc2FmZSxzZXRJc1NhZmUpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldElzU2FmZSh0cnVlLG1hbl9ydWxlX3NhZmUpO1xcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSlcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon4pml6Z2e5LyY6LSoJyxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDokKCfmoIforrDor6Xop4TliJnkuLrpnZ7kvJjotKg/JykuY29uZmlybSgoaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldElzR29vZChmYWxzZSxtYW5fcnVsZV9nb29kKTtcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0sZGF0YUl0ZW0uaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6J/CfkpbkvJjotKgnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uuS8mOi0qD8nKS5jb25maXJtKChpZCxtYW5fcnVsZV9nb29kLHNldElzR29vZCk9PntcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNHb29kKHRydWUsbWFuX3J1bGVfZ29vZCk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX2dvb2Qsc2V0SXNHb29kKVxcbiAgICB9KTtcXG59XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBkYXRhSXRlbS5nb29kX251bSxcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/otZ4uc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvTWFrZUFjb21tZW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lXFxuICAgIH1cXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogZGF0YUl0ZW0uYmFkX251bSxcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/ouKkuc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvTWFrZUFjb21tZW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lLFxcbiAgICAgICAgZGVmYXVsdFR5cGU6XFxcImJhZFxcXCJcXG4gICAgfVxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6K+E6K66XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/or4Torrouc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvTWFrZUFjb21tZW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lXFxuICAgIH1cXG59KTtcXG5sZXQgdG90YWxTdW0gPSBkYXRhSXRlbS5nb29kX251bSArIGRhdGFJdGVtLmJhZF9udW07XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLor4TorrooXFxcIiArIHRvdGFsU3VtICsgXFxcIilcXFwiKSArIFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoaHRtbFRhZyhcXFwidVxcXCIsIFxcXCLmn6XnnIvlhajpg6jor4TorrogPlxcXCIpKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvQ29tbWVudFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5I2Z5cGFnZSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgaWQ6IGRhdGFJdGVtLmlkLFxcbiAgICAgICAgdG90YWxTdW06IHRvdGFsU3VtLFxcbiAgICAgICAgbm9fYWN0aXZlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuLy9jb25zdCBsb25nZXN0U3VtPTEyMDtcXG5sZXQgaWNvbiA9IHtcXG4gICAgXFxcImdvb2RcXFwiOiBcXFwi8J+RjVxcXCIsXFxuICAgIFxcXCJiYWRcXFwiOiBcXFwi8J+RjlxcXCIsXFxuICAgIFxcXCJyZXBseVxcXCI6XFxcIuW8gOWPkeiAhfCfl6NcXFwiXFxufVxcbmlmICh0b3RhbFN1bSA9PT0gMCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCI8aDUgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz7kuIDmnaHor4TorrrkuZ/msqHmnInvvIzlv6vmnaXmiqLmspnlj5HlkKfvvIE8L2g1PlxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSk7XFxufSBlbHNlIHtcXG4gICAgbGV0IGNvbW1lbnRMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5kaXNfZ2V0ICsgZGF0YUl0ZW0uaWQgKyBcXFwiP2xpbWl0PTVcXFwiKSkucmVzdWx0O1xcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNvbW1lbnRMaXN0KSB7XFxuICAgICAgICBsZXQgUmVwbHkgPSBpdGVtLmRpc2N1c3NfdHlwZT09PVxcXCJyZXBseVxcXCImJml0ZW0ucmVwbHlfdG9fbmFtZSE9PWZhbHNlJiZpdGVtLnJlcGx5X3RvX2lkIT09ZmFsc2U/XFxcIuKAmOKAmOWbnuWkjUBcXFwiK2l0ZW0ucmVwbHlfdG9fbmFtZStcXFwiICNcXFwiK2l0ZW0uZGlzY3Vzc19pZCtcXFwi4oCZ4oCZXFxcXG5cXFwiOlxcXCJcXFwiO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lICsgXFxcIiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSdncmF5Jz48c21hbGw+I1xcXCIgKyBpdGVtLmlkICsgXFxcIjwvc21hbGw+PGZvbnQ+XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCIsXFxuICAgICAgICAgICAgLy91cmw6IFxcXCJ0b2FzdDovL1xcXCIgKyBpdGVtLnFxLFxcbiAgICAgICAgICAgIHVybDpcXFwibXFxd3BhOi8vaW0vY2hhdD9jaGF0X3R5cGU9d3BhJnVpbj1cXFwiK2l0ZW0ucXEsXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0uZGlzY3Vzc190ZXh0LFxcbiAgICAgICAgICAgIGRlc2M6IFJlcGx5K2l0ZW0uY3JlYXRlX2RhdGUgKyBcXFwiwrdcXFwiICsgaWNvbltpdGVtLmRpc2N1c3NfdHlwZV0sXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcIixcXG4gICAgICAgICAgICBleHRyYTp7XFxuICAgICAgICAgICAgICAgIG5hbWU6aXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICB0eXBlOlxcXCJsb25nX3RleHRcXFwiLFxcbiAgICAgICAgICAgICAgICB0ZXh0Oml0ZW0uZGlzY3Vzc190ZXh0XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbn1cXG5cXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJyaWNoX3RleHRcIixcIm5hbWVcIjpcIuafpeeci1wiLFwicGF0aFwiOlwiaW5mb1wiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLmn6XnnIvjgIxcXFwiK01ZX1BBUkFNUy5uYW1lK1xcXCLjgI1cXFwiKVxcbnNldFJlc3VsdChbe1xcbiAgICB0aXRsZTogTVlfUEFSQU1TLnRleHQsXFxuICAgIGNvbF90eXBlOk1ZX1BBUkFNUy50eXBlXFxufV0pO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5byA5Y+R6ICF5rOo5YaMXCIsXCJwYXRoXCI6XCJSZWdpc3RlclwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLlvIDlj5HogIXms6jlhoxcXFwiKTtcXG5jb25zdCB7XFxuICAgIGdldEFwaSxcXG4gICAgaHRtbFRhZyxcXG4gICAgbWFwQ29sVHlwZSxcXG4gICAgc21hbGxcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxudmFyIGRhdGEgPSBbXTtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLlBhc3N3b3JkXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuVXNlcm5hbWVcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5EZXNjcmlwdGlvblxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLlVzZXJBZGRyZXNzXFxcIik7XFxufSkpO1xcbmFkZExpc3RlbmVyKCdvblJlZnJlc2gnLCAkLnRvU3RyaW5nKCgpPT57XFxuICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLldhaXRcXFwiLCBcXFwiXFxcIik7XFxufSkpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn6LSm5Y+3JyxcXG4gICAgZGVzYzogXFxcIuivt+i+k+WFpei0puWPtyjlv4XloaspXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLlVzZXJuYW1lJywgJycpLFxcbiAgICAgICAgdHlwZTogXFxcIm51bWJlclxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLlVzZXJuYW1lXFxcIixpbnB1dCknXFxuICAgIH1cXG59LCB7XFxuICAgIHRpdGxlOiAn5a+G56CBJyxcXG4gICAgZGVzYzogXFxcIuivt+i+k+WFpeWvhueggSjlv4XloaspXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLlBhc3N3b3JkJywgJycpLFxcbiAgICAgICAgdHlwZTogXFxcInBhc3N3b3JkXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UuUGFzc3dvcmRcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0pO1xcbm1hcENvbFR5cGUoZGF0YSwgXFxcImxpbmVfYmxhbmtcXFwiLCAxKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogJ+aYteensCcsXFxuICAgIGRlc2M6IFxcXCLor7fovpPlhaXmmLXnp7Ao5b+F5aGrKVxcXCIsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5Vc2VyQWRkcmVzcycsICcnKSxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UuVXNlckFkZHJlc3NcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0sIHtcXG4gICAgdGl0bGU6ICfmj4/ov7AnLFxcbiAgICBkZXNjOiBcXFwi6K+06K+05Li65LuA5LmI6KaB5rOo5YaM5ZCnXFxcXG4o5Y+v5Lul5aKe5Yqg6YCa6L+H5qaC546HLOmAieWhqylcXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UuRGVzY3JpcHRpb24nLCAnJyksXFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5EZXNjcmlwdGlvblxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSlcXG5cXG5tYXBDb2xUeXBlKGRhdGEsIFxcXCJsaW5lX2JsYW5rXFxcIiwgMSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJcXFwiLCBcXFwi5rOo5YaMXFxcIiksXFxuICAgIHVybDogJChnZXRBcGkoXFxcIm5ld19kZXZcXFwiKStcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoZ2V0SWQsIGNvbmZpcm0pID0+IHtcXG4gICAgICAgIGxldCB1c2VybmFtZSA9IGdldFZhcignV2FyZWhvdXNlLlVzZXJuYW1lJywgXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIHBhc3N3b3JkID0gZ2V0VmFyKCdXYXJlaG91c2UuUGFzc3dvcmQnLCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBnZXRWYXIoJ1dhcmVob3VzZS5EZXNjcmlwdGlvbicsIFxcXCJcXFwiKSxcXG4gICAgICAgICAgICBuYW1lID0gZ2V0VmFyKFxcXCJXYXJlaG91c2UuVXNlckFkZHJlc3NcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoW3VzZXJuYW1lLCBwYXNzd29yZCwgbmFtZV0uaW5jbHVkZXMoXFxcIlxcXCIpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+i0puWPtyzlr4bnoIHlkozmmLXnp7DkuI3og73kuLrnqbpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuato+WcqOaPkOS6pOeUs+ivt+ihqFxcXCIpO1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQsIHtcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJyZWFzb25cXFwiOiBkZXNjcmlwdGlvbixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogbmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IHBhc3N3b3JkLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInFxXFxcIjogdXNlcm5hbWVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxuICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgaWRyZXN1bHQgPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0SWQgKyBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSkpO1xcbiAgICAgICAgaWYgKGlkcmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgaWRyZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgfVxcbiAgICAgICAgXFxuICAgICAgICByZXR1cm4gJChcXFwiXFxcIiwgXFxcIui+k+WFpemCrueusemqjOivgeeggVxcXFxuXFxcIiArIHJlc3VsdC5kZXRhaWwpLmlucHV0KChjb25maXJtLCBpZCwgYWNjb3VudCkgPT4ge1xcbiAgICAgICAgICAgIHNob3dMb2FkaW5nKFxcXCLor7fogJDlv4PnrYnlvoVcXFwiKTtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChjb25maXJtLCB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwicmVnaXN0X2lkXFxcIjogaWQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ5em1cXFwiOiBpbnB1dFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XFxuICAgICAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2VVc2VybmFtZVxcXCIsIGFjY291bnRbMF0pO1xcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2VQYXNzd29yZFxcXCIsIGFjY291bnRbMV0pO1xcbiAgICAgICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/miJDlip/mj5DkuqTms6jlhozms6jlhoxcXFxcblxcXCIrcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WHuumUmeS6huWRkFxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgY29uZmlybSwgaWRyZXN1bHQucmVzdWx0LCBbdXNlcm5hbWUsIHBhc3N3b3JkXSk7XFxuICAgIH0sIGdldEFwaShcXFwibmV3X2dldElkXFxcIiksIGdldEFwaShcXFwibmV3X2NvbmZpcm1cXFwiKSksXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG59KTtcXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJ0ZXh0XzFcIixcIm5hbWVcIjpcIuS4quS6uui1hOaWmVwiLFwicGF0aFwiOlwiUGVyc29uYWxEYXRhXCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuS4quS6uui1hOaWmVxcXCIpO1xcbnZhciBkYXRhPVtdO1xcbmNvbnN0IHtcXG4gICAgZ2V0QXBpLFxcbiAgICBnZXRGaWxlLFxcbiAgICBhcGlcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6XFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuXFxubGV0IHt1c2VybmFtZSxwYXNzd29yZH0gPSBnZXRGaWxlKCk7XFxubGV0IGRldiA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcInVzZXJcXFwiKStNWV9QQVJBTVMuaWQpKS5yZXN1bHQ7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIuWktOWDj1xcXCIsXFxuICAgIGRlc2M6ZGV2LmF2YXRhcixcXG4gICAgdXJsOlxcXCJoaWtlcjovL3BhZ2UvbW9kaWZ5X1BlcnNvbmFsRGF0YSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYTp7XFxuICAgICAgICBkZXY6ZGV2LFxcbiAgICAgICAgdXNlcm5hbWU6dXNlcm5hbWUsXFxuICAgICAgICBwYXNzd29yZDpwYXNzd29yZCxcXG4gICAgICAgIFBhdHRlcm46MFxcbiAgICB9LFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIlxcbn0pO1xcblxcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLmmLXnp7BcXFwiLFxcbiAgICBkZXNjOmRldi5uYW1lLFxcbiAgICB1cmw6XFxcImhpa2VyOi8vcGFnZS9tb2RpZnlfUGVyc29uYWxEYXRhI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOntcXG4gICAgICAgIGRldjpkZXYsXFxuICAgICAgICB1c2VybmFtZTp1c2VybmFtZSxcXG4gICAgICAgIHBhc3N3b3JkOnBhc3N3b3JkLFxcbiAgICAgICAgUGF0dGVybjoxXFxuICAgIH0sXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIuWvhueggVxcXCIsXFxuICAgIHVybDpcXFwiaGlrZXI6Ly9wYWdlL21vZGlmeV9QZXJzb25hbERhdGEjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6e1xcbiAgICAgICAgZGV2OmRldixcXG4gICAgICAgIHVzZXJuYW1lOnVzZXJuYW1lLFxcbiAgICAgICAgcGFzc3dvcmQ6cGFzc3dvcmQsXFxuICAgICAgICBQYXR0ZXJuOjJcXG4gICAgfSxcXG4gICAgY29sX3R5cGU6XFxcInRleHRfMVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTpcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi6LSm5Y+377yaXFxcIit1c2VybmFtZSxcXG4gICAgdXJsOlxcXCJjb3B5Oi8vXFxcIit1c2VybmFtZSxcXG4gICAgY29sX3R5cGU6XFxcInRleHRfMVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwiVUlE77yaXFxcIitkZXYuaWQsXFxuICAgIHVybDpcXFwiY29weTovL1xcXCIrZGV2LmlkLFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOlxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLmj5DkuqTkupHku5PlupPop4TliJlcXFwiLFxcbiAgICB1cmw6JChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaG9zdCk9PntcXG4gICAgICAgIGxldCBjb2RlPXJlcXVlc3QoaG9zdCtcXFwiL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9MTQ1XFxcIik7XFxuICAgICAgICBsZXQgd29yZD1cXFwi77+lcHVibGlzaO+/pVxcXCIrYmFzZTY0RW5jb2RlKGNvZGUpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJydWxlOi8vXFxcIitiYXNlNjRFbmNvZGUod29yZCk7XFxuICAgIH0sYXBpLmhvc3QpLFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLlkIzmraXmj5DkuqTkupHku5PlupPotKblj7flr4bnoIFcXFwiLFxcbiAgICB1cmw6XFxcInJ1bGU6Ly9cXFwiK2Jhc2U2NEVuY29kZShcXFwi77+lcHVibGlzaF9hY2NvdW5077+lXFxcIit1c2VybmFtZStcXFwiQFxcXCIrcGFzc3dvcmQpLFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOlxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLkvaDkuIDlhbHlj5HluIPkuobjgIxcXFwiK2Rldi5ydWxlX251bStcXFwi44CN5p2h6KeE5YiZXFxcIixcXG4gICAgdXJsOlxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgY29sX3R5cGU6XFxcInRleHRfMVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTpcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5sZXQgdXNlciA9IGdldEZpbGUoKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi5rOo6ZSA55m75b2VXFxcIixcXG4gICAgdXJsOiQoXFxcIuehruiupOazqOmUgOeZu+W9lT9cXFwiKS5jb25maXJtKGYgPT4ge1xcbiAgICAgICAgZi51c2VybmFtZT1cXFwiXFxcIjtcXG4gICAgICAgIGYucGFzc3dvcmQ9XFxcIlxcXCI7XFxuICAgICAgICB3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uJywgSlNPTi5zdHJpbmdpZnkoZikpO1xcbiAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIsXFxcIjFcXFwiKTtcXG4gICAgICAgIGJhY2soKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lms6jplIBcXFwiO1xcbiAgICB9LHVzZXIpLFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG59KTtcXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmm7TmlLnkuKrkurrotYTmlplcIixcInBhdGhcIjpcIm1vZGlmeV9QZXJzb25hbERhdGFcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IHtcXG4gICAgZ2V0QXBpLFxcbiAgICBjb2xvcixcXG4gICAgc21hbGwsXFxuICAgIGdldEZpbGUsXFxuICAgIGh0bWxUYWdcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgZGV2LFxcbiAgICB1c2VybmFtZSxcXG4gICAgcGFzc3dvcmQsXFxuICAgIFBhdHRlcm5cXG59ID0gTVlfUEFSQU1TO1xcbnZhciBkYXRhID0gW107XFxubGV0IHBhdGggPSBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UubS5wZXROYW1lXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UubS5hdmF0YXJcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLmNcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLnhcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLnlcXFwiKTtcXG59KSk7XFxuZnVuY3Rpb24gbV9wZXROYW1lKCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICAgICAgZGVzYzogXFxcIuivt+i+k+WFpeaWsOaYteensFxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLnBldE5hbWUnLCAnJyl8fGRldi5uYW1lLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UubS5wZXROYW1lXFxcIixpbnB1dCknXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5L+d5a2YXFxcIixcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcIm1vZGlmeV9uYW1lXFxcIikgKyBwYXRoKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IG5ld1BldE5hbWUgPSBnZXRWYXIoJ1dhcmVob3VzZS5tLnBldE5hbWUnLCAnJyk7XFxuICAgICAgICAgICAgaWYgKG5ld1BldE5hbWUgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S9oOi/mOS7gOS5iOmDveayoeWhq+WViiFcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCArIFxcXCImbmFtZT1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG5ld1BldE5hbWUpKTtcXG4gICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XFxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxuICAgIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBtX2F2YXRhcigpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgICAgIGRlc2M6IFxcXCLor7fovpPlhaXmlrDnmoTlpLTlg4/pk77mjqVcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5hdmF0YXInLCAnJykgfHwgZGV2LmF2YXRhcixcXG4gICAgICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLm0uYXZhdGFyXFxcIixpbnB1dCknXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5L+d5a2YXFxcIixcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcIm1vZGlmeV9hdmFcXFwiKSArIHBhdGgpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICBsZXQgbmV3QXZhdGFyID0gZ2V0VmFyKCdXYXJlaG91c2UubS5hdmF0YXInLCAnJyk7XFxuICAgICAgICAgICAgXFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQgKyBcXFwiJmF2YXRhcl91cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChuZXdBdmF0YXIpKTtcXG4gICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XFxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxuICAgIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBtX3B3ZCgpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTpcXFwi5Y6f5a+G56CBXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICAgICAgZGVzYzogXFxcIuivt+i+k+WFpeWOn+WvhueggVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHR5cGU6XFxcInBhc3N3b3JkXFxcIixcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQueScsICcnKSxcXG4gICAgICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQueVxcXCIsaW5wdXQpJ1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTpcXFwi5paw5a+G56CBXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICAgICAgZGVzYzogXFxcIuivt+i+k+WFpeaWsOWvhueggVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHR5cGU6XFxcInBhc3N3b3JkXFxcIixcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQueCcsICcnKSxcXG4gICAgICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQueFxcXCIsaW5wdXQpJ1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOlxcXCLph43lpI3mlrDlr4bnoIFcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgICAgICBkZXNjOiBcXFwi6K+36YeN5aSN5paw5a+G56CBXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgdHlwZTpcXFwicGFzc3dvcmRcXFwiLFxcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLmMnLCAnJyksXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLmNcXFwiLGlucHV0KSdcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLkv53lrZhcXFwiLFxcbiAgICAgICAgdXJsOiAkKGdldEFwaShcXFwibW9kaWZ5X3B3ZFxcXCIpK3BhdGgpLmxhenlSdWxlKChwYXNzd29yZCx1c2VybmFtZSkgPT4ge1xcbiAgICAgICAgICAgIGxldCBvbGRfcGFzc3dvcmQgPSBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLnknLCAnJyk7XFxuICAgICAgICAgICAgbGV0IG5ld19wYXNzd29yZCA9IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQueCcsICcnKTtcXG4gICAgICAgICAgICBsZXQgbmV3X3Bhc3N3b3JkX2FnYWluID0gZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC5jJywgJycpO1xcbiAgICAgICAgICAgIGlmIChvbGRfcGFzc3dvcmQhPT1wYXNzd29yZCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Y6f5a+G56CB6ZSZ6K+vXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYobmV3X3Bhc3N3b3JkPT09XFxcIlxcXCIpe1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K+36L6T5YWl5paw5a+G56CBXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYobmV3X3Bhc3N3b3JkIT09bmV3X3Bhc3N3b3JkX2FnYWluKXtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S4pOasoeWvhueggeS4jeWQjFxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQgKyBcXFwiJm5ld19wYXNzd29yZD1cXFwiICsgbmV3X3Bhc3N3b3JkK1xcXCImbmV3X3Bhc3N3b3JkX3JlPVxcXCIrbmV3X3Bhc3N3b3JkX2FnYWluKTtcXG4gICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XFxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXCIsSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU6dXNlcm5hbWUsXFxuICAgICAgICAgICAgICAgICAgICBwYXNzd29yZDpuZXdfcGFzc3dvcmRcXG4gICAgICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LHBhc3N3b3JkLHVzZXJuYW1lKSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG4gICAgfSk7XFxufVxcblxcbnN3aXRjaCAoUGF0dGVybikge1xcbiAgICBjYXNlIDA6XFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcIuS/ruaUueWktOWDj1xcXCIpO1xcbiAgICAgICAgbV9hdmF0YXIoKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlIDE6XFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcIuS/ruaUueaYteensFxcXCIpO1xcbiAgICAgICAgbV9wZXROYW1lKCk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAyOlxcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXCLkv67mlLnlr4bnoIFcXFwiKTtcXG4gICAgICAgIG1fcHdkKCk7XFxuICAgICAgICBicmVhaztcXG59XFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi57yW6L6R6KeE5YiZ5aSH5rOoXCIsXCJwYXRoXCI6XCJzZXRfcnVsZV9ub3Rlc1wiLFwicnVsZVwiOlwianM6XFxubGV0IGRhdGEgPSBbXTtcXG5jb25zdCB7XFxuICAgIGdldEFwaVxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5sZXQge1xcbiAgICBpZCxcXG4gICAgdXNlcm5hbWUsXFxuICAgIHBhc3N3b3JkLFxcbiAgICBuYW1lXFxufSA9IE1ZX1BBUkFNUztcXG5zZXRQYWdlVGl0bGUoXFxcIuWkh+azqOOAjFxcXCIrbmFtZStcXFwi44CNXFxcIik7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLFxcXCJjbGVhclZhcignV2FyZWhvdXNlLnJ1bGUubm90ZXMnLCAnJylcXFwiKTtcXG5sZXQgbm90ZXM9cmVxdWVzdChnZXRBcGkoXFxcImdldF9ydWxlX25vdGVcXFwiKStpZCk7XFxubm90ZXM9SlNPTi5wYXJzZShub3RlcykucmVzdWx0O1xcbmRhdGEucHVzaCh7XFxuICAgIGRlc2M6IFxcXCLop4TliJnlpIfms6guLi4uLi5cXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLnJ1bGUubm90ZXMnLCAnJyl8fG5vdGVzfHxcXFwiXFxcIixcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6LTEsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLnJ1bGUubm90ZXNcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0pO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5L+d5a2YXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiAkKGdldEFwaShcXFwic2V0X3J1bGVfbm90ZVxcXCIpICsgaWQpLmxhenlSdWxlKCh1c2VybmFtZSwgcGFzc3dvcmQpID0+IHtcXG4gICAgICAgIGxldCBub3RlcyA9IGdldFZhcignV2FyZWhvdXNlLnJ1bGUubm90ZXMnLCAnJyk7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCwge1xcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInFxXFxcIjogdXNlcm5hbWUsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBwYXNzd29yZCxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJub3RlXFxcIjpub3Rlc1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgfVxcbiAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcIjtcXG4gICAgfSwgdXNlcm5hbWUsIHBhc3N3b3JkKVxcbn0pO1xcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcImxpbmVcIixcIm5hbWVcIjpcIuivhOiuuuWIl+ihqFwiLFwicGF0aFwiOlwiQ29tbWVudFwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLor4TorrrliJfooahcXFwiKTtcXG5jb25zdCB7XFxuICAgIGFwaVxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5sZXQgZGF0YSA9IFtdO1xcbmxldCB7XFxuICAgIHRvdGFsU3VtLFxcbiAgICBpZCxcXG4gICAgbm9fYWN0aXZlLFxcbiAgICB1c2VybmFtZSxcXG4gICAgcGFzc3dvcmRcXG59ID0gTVlfUEFSQU1TO1xcbmxldCBwYWdlID0gcGFyc2VJbnQoTVlfVVJMLnNwbGl0KFxcXCIjXFxcIilbMV0pO1xcbmxldCBkaXNjdXNzX3R5cGUgPSBnZXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXCIsIFxcXCJcXFwiKTtcXG5pZiAocGFnZSA9PT0gMSkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcIiwgXFxcIlxcXCIpO1xcbiAgICB9KSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWFqOmDqFxcXCIgKyAoZGlzY3Vzc190eXBlID09PSBcXFwiXFxcIiA/IFxcXCLil4lcXFwiIDogXFxcIuKXi1xcXCIpLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF80J1xcblxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi8J+Rjei1nlxcXCIgKyAoZGlzY3Vzc190eXBlID09PSBcXFwiZ29vZFxcXCIgPyBcXFwi4peJXFxcIiA6IFxcXCLil4tcXFwiKSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFwiLCBcXFwiZ29vZFxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzQnXFxuXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLwn5GO6LipXFxcIiArIChkaXNjdXNzX3R5cGUgPT09IFxcXCJiYWRcXFwiID8gXFxcIuKXiVxcXCIgOiBcXFwi4peLXFxcIiksXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcIiwgXFxcImJhZFxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzQnXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlm57lpI1cXFwiICsgKGRpc2N1c3NfdHlwZSA9PT0gXFxcInJlcGx5XFxcIiA/IFxcXCLil4lcXFwiIDogXFxcIuKXi1xcXCIpLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXCIsIFxcXCJyZXBseVxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzQnXFxuICAgIH0pO1xcbn1cXG5cXG5cXG5sZXQgaWNvbiA9IHtcXG4gICAgXFxcImdvb2RcXFwiOiBcXFwi8J+RjVxcXCIsXFxuICAgIFxcXCJiYWRcXFwiOiBcXFwi8J+RjlxcXCIsXFxuICAgIFxcXCJyZXBseVxcXCI6XFxcIuW8gOWPkeiAhfCfl6NcXFwiXFxufVxcbmxldCBjb250cm9sPShwaWQsYWN0aXZlKT0+dm9pZCAwO1xcbmlmKG5vX2FjdGl2ZSl7XFxuICAgIGNvbnRyb2w9ZnVuY3Rpb24ocGlkLGFjdGl2ZSl7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOmFjdGl2ZT9cXFwi6ZqQ6JeP6K+E6K66XFxcIjpcXFwi5bGV56S66K+E6K66XFxcIixcXG4gICAgICAgICAgICB1cmw6JChhcGkuZGlzX2Rldl9jb250cm9sK3BpZCtcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkK1xcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpPT57XFxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQ9SlNPTi5wYXJzZShyZXF1ZXN0KGlucHV0KSk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIityZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzJcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6XFxcIuWIoOmZpOivhOiuulxcXCIsXFxuICAgICAgICAgICAgdXJsOiQoXFxcIuehruiupOWIoOmZpOivpeivhOiuuj9cXFwiKS5jb25maXJtKChpbnB1dCk9PntcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdD1KU09OLnBhcnNlKHJlcXVlc3QoaW5wdXQpKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiK3Jlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgfSxhcGkuZGlzX2Rldl9jb250cm9sK3BpZCtcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkK1xcXCImZGVsZXRlPTFcXFwiKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTpcXFwidGV4dF8yXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOlxcXCJsaW5lXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOlxcXCJsaW5lXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxuaWYgKHRvdGFsU3VtID09PSAwKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuS4gOadoeivhOiuuuS5n+ayoeacie+8jOW/q+adpeaKouaymeWPkeWQp++8gTwvaDU+XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICB9KTtcXG59IGVsc2Uge1xcbiAgICBsZXQgY29tbWVudExpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmRpc19nZXQgKyBpZCArIFxcXCI/bGltaXQ9NSZwYWdlPVxcXCIgKyBwYWdlICsgXFxcIiZub19hY3RpdmU9XFxcIiArIG5vX2FjdGl2ZSArIFxcXCImZGlzY3Vzc190eXBlPVxcXCIgKyBkaXNjdXNzX3R5cGUpKS5yZXN1bHQ7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXG4gICAgICAgIGxldCBSZXBseSA9IGl0ZW0uZGlzY3Vzc190eXBlPT09XFxcInJlcGx5XFxcIiYmaXRlbS5yZXBseV90b19uYW1lIT09ZmFsc2UmJml0ZW0ucmVwbHlfdG9faWQhPT1mYWxzZT9cXFwi4oCY4oCY5Zue5aSNQFxcXCIraXRlbS5yZXBseV90b19uYW1lK1xcXCIgI1xcXCIraXRlbS5kaXNjdXNzX2lkK1xcXCLigJnigJlcXFxcblxcXCI6XFxcIlxcXCI7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUgKyBcXFwiJm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9J2dyYXknPjxzbWFsbD4jXFxcIiArIGl0ZW0uaWQgKyBcXFwiPC9zbWFsbD48Zm9udD5cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgICAgICAvL3VybDogbm9fYWN0aXZlP1xcXCJoaWtlcjovL3BhZ2UvUmVwbHlcXFwiOlxcXCJ0b2FzdDovL1xcXCIgKyBpdGVtLnFxLFxcblxcdFxcdCAgICAgICB1cmw6bm9fYWN0aXZlP1xcXCJoaWtlcjovL3BhZ2UvUmVwbHlcXFwiOlxcXCJtcXF3cGE6Ly9pbS9jaGF0P2NoYXRfdHlwZT13cGEmdWluPVxcXCIraXRlbS5xcSxcXG4gICAgICAgICAgICBleHRyYTp7XFxuICAgICAgICAgICAgICAgIHJ1bGVJZDogaWQsXFxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxcbiAgICAgICAgICAgICAgICB1c2VybmFtZTogdXNlcm5hbWUsXFxuICAgICAgICAgICAgICAgIHJlcGx5SWQ6aXRlbS5pZFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0uZGlzY3Vzc190ZXh0LFxcbiAgICAgICAgICAgIGRlc2M6IFJlcGx5K2l0ZW0uY3JlYXRlX2RhdGUgKyBcXFwiwrdcXFwiICsgaWNvbltpdGVtLmRpc2N1c3NfdHlwZV0sXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcIixcXG4gICAgICAgICAgICBleHRyYTp7XFxuICAgICAgICAgICAgICAgIG5hbWU6aXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICB0eXBlOlxcXCJsb25nX3RleHRcXFwiLFxcbiAgICAgICAgICAgICAgICB0ZXh0Oml0ZW0uZGlzY3Vzc190ZXh0XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgY29udHJvbChpdGVtLmlkLGl0ZW0uYWN0aXZlKTtcXG4gICAgfVxcbiAgICBpZiAoY29tbWVudExpc3QubGVuZ3RoID09PSAwKSB7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcblxcbnNldFJlc3VsdChkYXRhKVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Y+R6KGo6K+E6K66XCIsXCJwYXRoXCI6XCJNYWtlQWNvbW1lbnRcIixcInJ1bGVcIjpcImpzOlxcbmxldCBkYXRhID0gW107XFxuY29uc3Qge1xcbiAgICBhcGksXFxuICAgIGdldEZpbGVcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgaWQsXFxuICAgIG5hbWUsXFxuICAgIGRlZmF1bHRUeXBlXFxufSA9IE1ZX1BBUkFNUztcXG5sZXQgdXNlcj1nZXRGaWxlKCkudXNlcnx8W1xcXCJcXFwiLFxcXCJcXFwiXTtcXG5cXG5zZXRQYWdlVGl0bGUoXFxcIuivhOiuuihcXFwiICsgbmFtZSArIFxcXCIpXFxcIik7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnR5cGVcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnRleHRcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnFxXFxcIik7XFxuICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG59KSk7XFxubGV0IHR5cGUgPSBnZXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnR5cGVcXFwiKSB8fCBkZWZhdWx0VHlwZXx8XFxcImdvb2RcXFwiO1xcbmRhdGEucHVzaCh7XFxuICAgIGRlc2M6IFxcXCLor4TorrouLi4uLi5cXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudGV4dCcsICcnKSxcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6NyxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC50ZXh0XFxcIixpbnB1dCknXFxuICAgIH1cXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi6LSm5Y+377yaXFxcIisodXNlclswXXx8XFxcIlxcXCIpLFxcbiAgICBkZXNjOlxcXCLpqozor4HnoIHvvJpcXFwiKyh1c2VyWzFdfHxcXFwiXFxcIiksXFxuICAgIHVybDpcXFwiaGlrZXI6Ly9wYWdlL1VzZXJyZWdpc3RyYXRpb25cXFwiLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMScsXFxuICAgIFxcbn0pO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAgKHR5cGUgPT09IFxcXCJnb29kXFxcIiA/IFxcXCLil4lcXFwiIDogXFxcIuKXi1xcXCIpK1xcXCIg8J+RjVxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnR5cGVcXFwiLCBcXFwiZ29vZFxcXCIpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMidcXG5cXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogICh0eXBlID09PSBcXFwiYmFkXFxcIiA/IFxcXCLil4lcXFwiIDogXFxcIuKXi1xcXCIpK1xcXCIg8J+RjlxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnR5cGVcXFwiLCBcXFwiYmFkXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiAndGV4dF8yJ1xcbn0pO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5o+Q5LqkXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiAkKGFwaS5kaXNfbmV3ICsgaWQpLmxhenlSdWxlKChBY2NvdW50KSA9PiB7XFxuICAgICAgICBsZXQgdGV4dCA9IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudGV4dCcsICcnKTtcXG4gICAgICAgIGxldCBbcXEsYXV0aF9jb2RlXSA9IEFjY291bnQ7XFxuICAgICAgICBsZXQgdHlwZSA9IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudHlwZScpIHx8ICdnb29kJztcXG4gICAgICAgIHFxPXFxfHxcXFwiXFxcIjtcXG4gICAgICAgIGF1dGhfY29kZT1hdXRoX2NvZGV8fFxcXCJcXFwiO1xcbiAgICAgICAgaWYocXE9PVxcXCJcXFwifHxhdXRoX2NvZGU9PVxcXCJcXFwiKXtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pyq55m75b2V6LSm5Y+3XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmKHRleHQ9PVxcXCJcXFwiKXtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L2g6L+Y5LuA5LmI6YO95rKh5YaZ5ZWKXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGZ1bmN0aW9uIHIocCkge1xcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0LCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocCksXFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcCA9IHtcXG4gICAgICAgICAgICBcXFwicGFyYW1zXFxcIjoge1xcbiAgICAgICAgICAgICAgICBcXFwiZGlzY3Vzc190ZXh0XFxcIjogdGV4dCxcXG4gICAgICAgICAgICAgICAgXFxcInFxXFxcIjogcXEsXFxuICAgICAgICAgICAgICAgIFxcXCJkaXNjdXNzX3R5cGVcXFwiOiB0eXBlLFxcbiAgICAgICAgICAgICAgICBcXFwiYXV0aF9jb2RlXFxcIjogYXV0aF9jb2RlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHIocCk7XFxuICAgICAgICBpZihyZXN1bHQuc3RhdHVzPT09MCl7XFxuICAgICAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIityZXN1bHQuZGV0YWlsO1xcblxcbiAgICB9LHVzZXIpXFxufSk7XFxuXFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Lyq55So5oi35rOo5YaMXCIsXCJwYXRoXCI6XCJVc2VycmVnaXN0cmF0aW9uXCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCB7XFxuICAgIGFwaSxcXG4gICAgZ2V0RmlsZSxcXG4gICAgZ2V0VXNlckRhdGVcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IGRhdGEgPSBbXTtcXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuc2V0UGFnZVRpdGxlKFxcXCLnlKjmiLfliJfooajnrqHnkIZcXFwiKTtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLm0ucXFcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5tLnl6bVxcXCIpO1xcbn0pKTtcXG5sZXQgdXNlciA9IGdldEZpbGUoKTtcXG5sZXQgdXNlck5hbWUgPSB1c2VyLnVzZXIgfHwgW1xcXCJcXFwiXTtcXG51c2VyTmFtZSA9IHVzZXJOYW1lWzBdO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdPGJpZz4o5re75YqgL+mqjOivgSnotKblj7c8L2JpZz5cXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxufSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLojrflj5ZcXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZGVzYzogXFxcIuivt+i+k+WFpXFxXFxcIixcXG4gICAgdXJsOiAkLnRvU3RyaW5nKChhLCBiKSA9PiB7XFxuICAgICAgICBsZXQgcXEgPSBpbnB1dDtcXG4gICAgICAgIGlmIChxcSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHloavllYohXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIHNob3dMb2FkaW5nKFxcXCLojrflj5bkuK0uLi5cXFwiKVxcbiAgICAgICAgcmV0dXJuICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHFxLCBhLCBiKSA9PiB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGEsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJxcVxcXCI6IHFxXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQyID0gSlNPTi5wYXJzZShyZXF1ZXN0KGIgKyBcXFwiP3FxPVxcXCIgKyBxcSkpO1xcbiAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdDIuZGV0YWlsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgIHRocm93IGU7XFxuICAgICAgICB9XFxuICAgICAgICB9LCBxcSwgYSwgYik7XFxuXFxuICAgIH0sIGFwaS5kaXNfbmV3X3VzZXIsIGFwaS5kaXNfdmVyaWZ5KSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHR5cGU6IFxcXCJudW1iZXJcXFwiLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLnFxJywgJycpIHx8IHVzZXJOYW1lLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5tLnFxXFxcIixpbnB1dCknXFxuICAgIH1cXG59KTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZGVzYzogXFxcIuivt+i+k+WFpemqjOivgeeggVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLnl6bScsICcnKSxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UubS55em1cXFwiLGlucHV0KSdcXG4gICAgfVxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcXG4gICAgdGl0bGU6IFxcXCI8c21hbGw+5o+Q56S677yaMS7mr4/lpKnlj6rog73ojrflj5Y15qyh6aqM6K+B56CBLjxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsyLjxzPumqjOivgeeggeacieaViOacn+aMgee7reS4gOWRqOW3puWPszwvcz4o5pqC5pe25LiN5Lya77yM5b+Y6K6w6aqM6K+B56CB5Y+v6YCa6L+HUVHlj7fojrflj5YpPC9zbWFsbD5cXFwiXFxufSk7XFxuXFxubGV0IHVzZXJMaXN0ID0gZ2V0VXNlckRhdGUoKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumqjOivgS/nmbvlvZVcXFwiLFxcbiAgICB1cmw6ICQoXFxcIuehruWumuS/neWtmO+8jOmqjOivgeeggeWhq+mUme+8jOaXoOazleivhOiuuuWTplxcXCIpLmNvbmZpcm0oKGYsIGwsIGxvZ2luKSA9PiB7XFxuICAgICAgICBsZXQgcXEgPSBnZXRWYXIoJ1dhcmVob3VzZS5tLnFxJywgJycpO1xcbiAgICAgICAgbGV0IHl6bSA9IGdldFZhcignV2FyZWhvdXNlLm0ueXptJywgJycpO1xcbiAgICAgICAgaWYgKHFxID09IFxcXCJcXFwiIHx8IHl6bSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9xceaIlumqjOivgeeggeS4uuepulxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChsb2dpbiwge1xcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInFxXFxcIjogcXEsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiYXV0aF9jb2RlXFxcIjogeXptXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgfSk7XFxuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICBmLnVzZXIgPSBbcXEsIHl6bV07XFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGYpKTtcXG4gICAgICAgICAgICBsZXQgaW5kZXggPSBsLmZpbmRJbmRleChpdGVtID0+IGl0ZW1bMF0gPT09IHFxKTtcXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xcbiAgICAgICAgICAgICAgICBsLnNwbGljZShpbmRleCwgMSwgW3FxLCB5em1dKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGwubGVuZ3RoIDwgNikge1xcbiAgICAgICAgICAgICAgICBsLnB1c2goW3FxLCB5em1dKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBsLnNwbGljZSgwLCAxKTtcXG4gICAgICAgICAgICAgICAgbC5wdXNoKFtxcSwgeXptXSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSQS5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkobCkpO1xcbiAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6aqM6K+B5oiQ5YqfXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgfSwgdXNlciwgdXNlckxpc3QsIGFwaS5kaXNfbG9naW4pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdPGJpZz7otKblj7fliJfooag8L2JpZz5cXFxcdFxcXFx0XFxcXHQ8c21hbGw+KOS/neeVmTXmnaHorrDlvZUpPC9zbWFsbD5cXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxufSk7XFxudXNlckxpc3QucmV2ZXJzZSgpO1xcblxcbmZvciAobGV0IGl0ZW0gb2YgdXNlckxpc3QpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6LSm5Y+377yaXFxcIiArIGl0ZW1bMF0gKyAodXNlck5hbWUgPT09IGl0ZW1bMF0gPyBcXFwiXFxcXHRcXFxcdFxcXFx04oCc4oCcW+W9k+WJjei0puWPt13igJ3igJ1cXFwiIDogXFxcIlxcXCIpLFxcbiAgICAgICAgZGVzYzogXFxcIumqjOivgeegge+8mlxcXCIgKyBpdGVtWzFdLFxcbiAgICAgICAgdXJsOiAkKFxcXCLmmK/lkKbliIfmjaLkuLror6VbXFxcIiArIGl0ZW1bMF0gKyBcXFwiXei0puWPt1xcXCIpLmNvbmZpcm0oKGYsIGl0ZW0pID0+IHtcXG4gICAgICAgICAgICBmLnVzZXIgPSBpdGVtO1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShmKSk7XFxuICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liIfmjaLmiJDlip9cXFwiO1xcbiAgICAgICAgfSwgdXNlciwgaXRlbSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG4gICAgfSk7XFxufVxcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAgOWHuui0puWPt1xcXCIsXFxuICAgIHVybDogJChcXFwi56Gu6K6k6YCA5Ye655m75b2V54q25oCBXFxcIikuY29uZmlybSgoZikgPT4ge1xcbiAgICAgICAgZi51c2VyID0gW107XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoZikpO1xcbiAgICAgICAgYmFjaygpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+mAgOWHuuaIkOWKn1xcXCI7XFxuICAgIH0sIHVzZXIpLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxufSk7XFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5YiX6KGo5o6S5bqP566X5rOVXCIsXCJwYXRoXCI6XCJzb3J0XCIsXCJydWxlXCI6XCJqczpcXG4vKiDop4TliJnliJfooajmjpLluo8gWyBVUOOAgU5FV+OAgeaXoOabtOaWsCBdIOmhuuW6jyAqL1xcbi8qIOW9kuW5tuaOkuW6jyBTdGFydCAqL1xcbi8qXFxuZnVuY3Rpb24gbWVyZ2VTb3J0KGFycikge1xcbiAgICB2YXIgbGVuID0gYXJyLmxlbmd0aDtcXG4gICAgaWYgKGxlbiA8IDIpIHtcXG4gICAgICAgIHJldHVybiBhcnI7XFxuICAgIH1cXG4gICAgdmFyIG1pZGRsZSA9IE1hdGguZmxvb3IobGVuIC8gMiksXFxuICAgICAgICBsZWZ0ID0gYXJyLnNsaWNlKDAsIG1pZGRsZSksXFxuICAgICAgICByaWdodCA9IGFyci5zbGljZShtaWRkbGUpO1xcbiAgICByZXR1cm4gbWVyZ2UobWVyZ2VTb3J0KGxlZnQpLCBtZXJnZVNvcnQocmlnaHQpKTtcXG59XFxuZnVuY3Rpb24gbWVyZ2UobGVmdCwgcmlnaHQpIHtcXG4gICAgdmFyIHJlc3VsdCA9IFtdO1xcbiAgICB2YXIgaXNUaGlzVmVyc2lvbkxpc3QgPSBbXTtcXG5cXG4gICAgd2hpbGUgKGxlZnQubGVuZ3RoID4gMCAmJiByaWdodC5sZW5ndGggPiAwKSB7XFxuICAgICAgICBpZiAobGVmdFswXS50aXRsZS5pbmNsdWRlcyhcXFwi8J+GmVxcXCIpKSB7XFxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobGVmdC5zaGlmdCgpKTtcXG4gICAgICAgIH0gZWxzZSBpZiAocmlnaHRbMF0udGl0bGUuaW5jbHVkZXMoXFxcIvCfhplcXFwiKSkge1xcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJpZ2h0LnNoaWZ0KCkpO1xcbiAgICAgICAgfSBlbHNlIGlmIChsZWZ0WzBdLnRpdGxlLmluY2x1ZGVzKFxcXCLwn4aVXFxcIikpIHtcXG4gICAgICAgICAgICByZXN1bHQucHVzaChsZWZ0LnNoaWZ0KCkpO1xcbiAgICAgICAgfSBlbHNlIGlmIChyaWdodFswXS50aXRsZS5pbmNsdWRlcyhcXFwi8J+GlVxcXCIpKSB7XFxuICAgICAgICAgICAgcmVzdWx0LnB1c2gocmlnaHQuc2hpZnQoKSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGlzVGhpc1ZlcnNpb25MaXN0LnB1c2gobGVmdC5zaGlmdCgpKTtcXG4gICAgICAgICAgICBpc1RoaXNWZXJzaW9uTGlzdC5wdXNoKHJpZ2h0LnNoaWZ0KCkpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuXFxuICAgIHdoaWxlIChpc1RoaXNWZXJzaW9uTGlzdC5sZW5ndGgpIHJlc3VsdC5wdXNoKGlzVGhpc1ZlcnNpb25MaXN0LnNoaWZ0KCkpO1xcblxcbiAgICB3aGlsZSAobGVmdC5sZW5ndGgpXFxuICAgICAgICByZXN1bHQucHVzaChsZWZ0LnNoaWZ0KCkpO1xcblxcbiAgICB3aGlsZSAocmlnaHQubGVuZ3RoKVxcbiAgICAgICAgcmVzdWx0LnB1c2gocmlnaHQuc2hpZnQoKSk7XFxuXFxuICAgIHJldHVybiByZXN1bHQ7XFxufVxcbiQuZXhwb3J0cy5tZXJnZVNvcnQgPSBtZXJnZVNvcnQ7XFxuKi9cXG4vKiDlvZLlubbmjpLluo8gRW5kICovXFxuLyog5pmu6YCa5YiG57G75o6S5bqPIFN0YXJ0ICovXFxuZnVuY3Rpb24gbm9ybWFsU29ydChhcnIpIHtcXG4gICAgdmFyIGxlbiA9IGFyci5sZW5ndGg7XFxuICAgIGlmIChsZW4gPCAyKSB7XFxuICAgICAgICByZXR1cm4gYXJyO1xcbiAgICB9XFxuICAgIGxldCB1cFJlc3VsdCA9IFtdO1xcbiAgICBsZXQgb3RoZXJSZXN1bHQgPSBbXTtcXG4gICAgd2hpbGUoYXJyLmxlbmd0aCkge1xcbiAgICAgICAgbGV0IGl0ZW0gPSBhcnIuc2hpZnQoKTtcXG4gICAgICAgIGlmKGl0ZW0udGl0bGUuaW5jbHVkZXMoXFxcIvCfhplcXFwiKSkge1xcbiAgICAgICAgICAgIHVwUmVzdWx0LnB1c2goaXRlbSlcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgb3RoZXJSZXN1bHQucHVzaChpdGVtKVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHJldHVybiB1cFJlc3VsdC5jb25jYXQob3RoZXJSZXN1bHQpO1xcbn1cXG4kLmV4cG9ydHMubm9ybWFsU29ydCA9IG5vcm1hbFNvcnQ7XFxuLyog5pmu6YCa5YiG57G75o6S5bqPIEVuZCAqL1wifSx7XCJjb2xfdHlwZVwiOlwiaWNvbl8yX3JvdW5kXCIsXCJuYW1lXCI6XCLlhajpg6jlhazlvIDop4TliJlcIixcInBhdGhcIjpcIkFsbFB1YmxpY1J1bGVcIixcInJ1bGVcIjpcImpzOlxcbiAgICBjb25zdCB7XFxuICAgICAgICBhcGksXFxuICAgICAgICBsb2NhbFJ1bGVWZXIsXFxuICAgICAgICBnZXRBcGlcXG4gICAgfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmNvbnN0IHtcXG4gICAgbWVyZ2VTb3J0XFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3NvcnRcXFwiKTtcXG5sZXQgZGF0YVR5cGUgPSBnZXRWYXIoXFxcIldhcmVob3VzZS50eXBlXFxcIiwgXFxcIlxcXCIpO1xcbmxldCBvcmRlciA9IGdldFZhcihcXFwiV2FyZWhvdXNlLm9yZGVyXFxcIiwgXFxcIjBcXFwiKTtcXG5sZXQgc29ydCA9IGdldFZhcihcXFwiV2FyZWhvdXNlLnNvcnRcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCBnb29kID0gZ2V0VmFyKFxcXCJXYXJlaG91c2UuZ29vZFxcXCIsIFxcXCJcXFwiKTtcXG5sZXQgcGFnZSA9IE1ZX1VSTC5zcGxpdChcXFwiI1xcXCIpWzFdIHx8IDE7XFxubGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5hbGxfcnVsZSArIFxcXCI/ZGF0YV90eXBlPVxcXCIgKyBkYXRhVHlwZSArIFxcXCImcGFnZT1cXFwiICsgcGFnZSArIFxcXCImbGltaXQ9MjAmb3JkZXI9XFxcIiArIG9yZGVyICsgXFxcIiZzb3J0PVxcXCIgKyBzb3J0KyBcXFwiJmlzX2dvb2Q9XFxcIiArIGdvb2QpKS5yZXN1bHQ7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS50eXBlXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2Uub3JkZXJcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5zb3J0XFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuZ29vZFxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiKTtcXG59KSk7XFxubGV0IGRhdGEgPSBbXTtcXG5pZiAoZ2V0VmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIpID09PSBcXFwiMVxcXCIpIHtcXG4gICAgYmFjaygpO1xcbn1cXG5mdW5jdGlvbiB0YWIoYXJyLCB0eXBlLCBjb250cmFzdCkge1xcbiAgICBmb3IgKGxldCBpdGVtIG9mIGFycikge1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbVsxXSA9PT0gY29udHJhc3QgPyBcXFwi4oCc4oCcXFxcIiArIGl0ZW1bMF0gKyBcXFwi4oCd4oCdXFxcIiA6IGl0ZW1bMF0sXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChrZXksIHR5cGUpID0+IHtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKHR5cGUsIGtleSk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICB9LCBpdGVtWzFdLCB0eXBlKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCJcXG4gICAgfSk7XFxufVxcbmlmIChwYWdlID09PSBcXFwiMVxcXCIpIHtcXG4gICAgdGFiKFtcXG4gICAgICAgIFtcXFwi5YWo6YOoXFxcIiwgXFxcIlxcXCJdLFxcbiAgICAgICAgW1xcXCLlsI/nqIvluo9cXFwiLCBcXFwiaG9tZV9ydWxlX3VybFxcXCJdLFxcbiAgICAgICAgW1xcXCLmj5DkuqTkupHku5PlupPop4TliJlcXFwiLCBcXFwicHVibGlzaFxcXCJdLFxcbiAgICAgICAgW1xcXCLnvZHpobXmj5Lku7ZcXFwiLCBcXFwianNfdXJsXFxcIl0sXFxuICAgICAgICBbXFxcIumdmeaAgemhtemdolxcXCIsIFxcXCJodG1sXFxcIl0sXFxuICAgICAgICBbXFxcIuS4u+mimFxcXCIsIFxcXCJjb25maWdcXFwiXVxcbiAgICBdLCBcXFwiV2FyZWhvdXNlLnR5cGVcXFwiLCBkYXRhVHlwZSk7XFxuICAgIHRhYihbXFxuICAgICAgICBbXFxcIuaXtumXtFxcXCIsIFxcXCIwXFxcIl0sXFxuICAgICAgICBbXFxcIklEXFxcIiwgXFxcIjFcXFwiXSxcXG4gICAgICAgIFtcXFwi5aW96K+E5bqmXFxcIiwgXFxcIjJcXFwiXSxcXG4gICAgICAgIFtcXFwi5beu6K+E5bqmXFxcIiwgXFxcIjNcXFwiXSxcXG4gICAgICAgIFtcXFwi5Zue5aSN5pWwXFxcIiwgXFxcIjRcXFwiXVxcbiAgICBdLCBcXFwiV2FyZWhvdXNlLm9yZGVyXFxcIiwgb3JkZXIpO1xcbiAgICB0YWIoW1xcbiAgICAgICAgW1xcXCLlgJLluo9cXFwiLCBcXFwiMFxcXCJdLFxcbiAgICAgICAgW1xcXCLmraPluo9cXFwiLCBcXFwiMVxcXCJdXFxuICAgIF0sIFxcXCJXYXJlaG91c2Uuc29ydFxcXCIsIHNvcnQpO1xcbiAgICB0YWIoW1xcbiAgICAgICAgW1xcXCLkuI3orrpcXFwiLCBcXFwiXFxcIl0sXFxuICAgICAgICBbXFxcIuS8mOi0qFxcXCIsIFxcXCIxXFxcIl1cXG4gICAgXSwgXFxcIldhcmVob3VzZS5nb29kXFxcIiwgZ29vZCk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuaQnOe0olxcXCIsXFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcobmFtZSA9PiBcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFwiICsgaW5wdXQgKyBcXFwiJnJ1bGU9XFxcIiArIG5hbWUsIE1ZX1JVTEUudGl0bGUpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICBkZXNjOiBcXFwi5pCc57Si5YWo6YOo6KeE5YiZXFxcIlxcbiAgICB9KTtcXG59XFxuXFxubGV0IGhvbWVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5ob21lKSk7XFxubGV0IG1SdWxlTGlzdCA9IFtdO1xcbmZvciAodmFyIGl0ZW0gb2YgcnVsZUxpc3QpIHtcXG4gICAgdmFyIG5hbWUgPSBpdGVtLm5hbWU7XFxuICAgIGlmIChpdGVtLmlzX3RhcCkge1xcbiAgICAgICAgbGV0IGxvY2F0aW9uID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwicnVsZUxpc3RKc29uXFxcIikgKyBcXFwiP2lkPVxcXCIgKyBpdGVtLmlkKSk7XFxuICAgICAgICBpdGVtLmlkID0gbG9jYXRpb24uaWQ7XFxuICAgICAgICBpdGVtLm5hbWUgPSBsb2NhdGlvbi5uYW1lO1xcbiAgICAgICAgaXRlbS5hdXRob3IgPSBsb2NhdGlvbi5hdXRob3I7XFxuICAgICAgICBpdGVtLmRhdGFfdHlwZSA9IGxvY2F0aW9uLmRhdGFfdHlwZTtcXG4gICAgICAgIGl0ZW0udmVyID0gbG9jYXRpb24udmVyXFxuICAgIH1cXG4gICAgaXRlbS52ZXJzaW9uID0gaXRlbS52ZXI7XFxuICAgIGxldCBsYWJlbCA9IFxcXCJcXFwiLFxcbiAgICAgICAgbHZlciA9IC0yO1xcbiAgICBpZiAoaXRlbS5pc19qc29uICYmIGl0ZW0uZGF0YV90eXBlID09PSBcXFwiaG9tZV9ydWxlX3VybFxcXCIpIHtcXG4gICAgICAgIGx2ZXIgPSBsb2NhbFJ1bGVWZXIoaG9tZUxpc3QsIGl0ZW0pO1xcbiAgICAgICAgaWYgKGx2ZXIgPT09IC0xKSB7XFxuICAgICAgICAgICAgbGFiZWwgPSBcXFwi8J+GlVxcXCI7XFxuICAgICAgICB9IGVsc2UgaWYgKGx2ZXIgPCBpdGVtLnZlcikge1xcbiAgICAgICAgICAgIGxhYmVsID0gXFxcIvCfhplcXFwiO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIG1SdWxlTGlzdC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBsYWJlbCArIG5hbWUsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBsdmVyOiBsdmVyLFxcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkLFxcbiAgICAgICAgICAgIGlzQWxsOnRydWVcXG4gICAgICAgIH0sXFxuICAgICAgICBwaWNfdXJsOiBpdGVtLnBpYyxcXG4gICAgfSlcXG59XFxuLyog5b2S5bm25o6S5bqPIFN0YXJ0ICovXFxuLy9tUnVsZUxpc3QgPSBtZXJnZVNvcnQobVJ1bGVMaXN0KTtcXG4vKiDlvZLlubbmjpLluo8gRW5kICovXFxuZGF0YS5wdXNoLmFwcGx5KGRhdGEsIG1SdWxlTGlzdClcXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlm57lpI1cIixcInBhdGhcIjpcIlJlcGx5XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZGF0YSA9IFtdO1xcbmNvbnN0IHtcXG4gICAgYXBpXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIHJlcGx5SWQsXFxuICAgIHJ1bGVJZCxcXG4gICAgbmFtZSxcXG4gICAgcGFzc3dvcmQsXFxuICAgIHVzZXJuYW1lXFxufSA9IE1ZX1BBUkFNUztcXG5cXG5cXG5zZXRQYWdlVGl0bGUoXFxcIuWbnuWkjShcXFwiICsgbmFtZSArIFxcXCIpXFxcIik7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnRleHRcXFwiKTtcXG4gICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbn0pKTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICBkZXNjOiBcXFwi5Zue5aSNLi4uLi4uXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnRleHQnLCAnJyksXFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0OjcsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudGV4dFxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSk7XFxuXFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmj5DkuqRcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB1cmw6ICQoYXBpLmRpc19yZXBseSArIHJ1bGVJZCkubGF6eVJ1bGUoKHBhc3N3b3JkLCB1c2VybmFtZSwgcnVsZUlkKSA9PiB7XFxuICAgICAgICBsZXQgdGV4dCA9IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudGV4dCcsICcnKTtcXG4gICAgICAgIGlmIChwYXNzd29yZCA9PSBcXFwiXFxcIiB8fCB1c2VybmFtZSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mnKrnmbvlvZXotKblj7dcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHRleHQgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L2g6L+Y5LuA5LmI6YO95rKh5YaZ5ZWKXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0LCB7XFxuICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiZGlzY3Vzc190ZXh0XFxcIjogdGV4dCxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJxcVxcXCI6IHVzZXJuYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogcGFzc3dvcmQsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiZGlzY3Vzc19pZFxcXCI6IHJ1bGVJZFxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuXFxuICAgIH0sIHBhc3N3b3JkLCB1c2VybmFtZSwgcmVwbHlJZClcXG59KTtcXG5cXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmiJHnmoTlm57lpI1cIixcInBhdGhcIjpcIk15UmVwbHlcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IHtcXG4gICAgYXBpXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGF1dGhfY29kZSxcXG4gICAgcXFcXG59ID0gTVlfUEFSQU1TO1xcbmxldCBwYWdlID0gcGFyc2VJbnQoTVlfVVJMLnNwbGl0KFxcXCIjXFxcIilbMV0pO1xcbmxldCBkYXRhPVtdO1xcbmxldCBjb21tZW50TGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuZGlzX2dldF9yZXBseSArIFxcXCI/bGltaXQ9NSZwYWdlPVxcXCIgKyBwYWdlICsgXFxcIiZxcT1cXFwiICsgcXEgKyBcXFwiJmF1dGhfY29kZT1cXFwiICsgYXV0aF9jb2RlKSkucmVzdWx0O1xcbmlmIChjb21tZW50TGlzdC5sZW5ndGggPT09IDApIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5Yir5ouJ5LqG5LiA5p2h5Lmf5LiN5Ymp5LqGPC9oNT5cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0pO1xcbn0gZWxzZSB7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSArIFxcXCImbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0nZ3JheSc+PHNtYWxsPiNcXFwiICsgaXRlbS5pZCArIFxcXCI8L3NtYWxsPjxmb250PlxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbHZlcjogXFxcIuWbnuWkjei/m+WFpeS4jeaUr+aMgeafpeeci1xcXCIsXFxuICAgICAgICAgICAgICAgIGlkOiBpdGVtLnJ1bGVfaWRbMF1cXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXG4gICAgICAgICAgICBkZXNjOiBpdGVtLmNyZWF0ZV9kYXRlICsgXFxcIsK3XFxcIitpdGVtLnJ1bGVfaWRbMV0rXFxcIsK3XFxcIitcXFwi5byA5Y+R6ICF8J+Xo1xcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcIixcXG4gICAgICAgICAgICBleHRyYTp7XFxuICAgICAgICAgICAgICAgIG5hbWU6aXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICB0eXBlOlxcXCJsb25nX3RleHRcXFwiLFxcbiAgICAgICAgICAgICAgICB0ZXh0Oml0ZW0uZGlzY3Vzc190ZXh0XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIFxcbn1cXG5zZXRSZXN1bHQoZGF0YSk7XFxuXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmm7TlpJrliIbkuqtcIixcInBhdGhcIjpcIm1vcmVTaGFyZVwiLFwicnVsZVwiOlwianM6XFxuICAgIGFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKT0+e1xcbiAgICAgICAgY2xlYXJWYXIoXFxcImhvdXNlLnVwbG9hZF9jb2RlXFxcIik7XFxuICAgIH0pKTtcXG5jb25zdCB7Y29sb3Isc21hbGwsYXBpLCBnZXRGaWxlfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXG5sZXQgcHV0X3VybCA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvZGV2L3B1dCc7XFxuaWYoIWhvdXNlRmlsZSl7XFxuICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcbn1cXG5sZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcbi8vIGxvZyhob3VzZV9kYXRhLnVzZXJuYW1lKyctJytob3VzZV9kYXRhLnBhc3N3b3JkKTtcXG52YXIgY2FudXAgPSBob3VzZV9kYXRhLnVzZXJuYW1lLmxlbmd0aCA+PSA2ICYmIGhvdXNlX2RhdGEucGFzc3dvcmQubGVuZ3RoID4gMjtcXG5sb2coJ+WPr+S7peS4iuS8oD8nK2NhbnVwKTtcXG5sZXQgZCA9IFtdO1xcbmxldCBmaWxlX3R5cGUgPSBbe25hbWU6J+mdmeaAgeaWh+S7ticsdmFsdWU6J2h0bWwnfSx7bmFtZTon572R6aG15o+S5Lu2Jyx2YWx1ZTonanNfdXJsJ30se25hbWU6J+S4u+mhtemFjee9ricsdmFsdWU6J2NvbmZpZyd9XTsgLy/kuIrkvKDnsbvlnotcXG5sZXQgZmlsZV9yZWRpcmVjdCA9IFt7bmFtZTon5pys5ZywJyx2YWx1ZTonZmFsc2UnfSx7bmFtZTon55u06ZO+MzAyJyx2YWx1ZTondHJ1ZSd9XTsgLy/mmK/lkKbph43lrprlkJFcXG5sZXQgZmlsZV91YSA9IFt7bmFtZTon55S16ISRJyx2YWx1ZToncGMnfSx7bmFtZTon5omL5py6Jyx2YWx1ZTonbW9iaWxlJ31dO1xcbmxldCBmaWxlX3R5cGVfdGl0bGUgPSBmaWxlX3R5cGUubWFwKChpdGVtKSA9PiB7XFxuICAgIGxldCBuYW1lID0gZ2V0SXRlbSgnaG91c2UuZmlsZV90eXBlJywn6Z2Z5oCB5paH5Lu2Jyk7XFxuICAgIGlmKGl0ZW0ubmFtZT09PW5hbWUpe1xcbiAgICAgICAgcmV0dXJuICfwn5GJJytpdGVtLm5hbWU7XFxuICAgIH1lbHNle1xcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZTtcXG4gICAgfVxcbn0pO1xcbmxldCBmaWxlX3JlZGlyZWN0X3RpdGxlID0gZmlsZV9yZWRpcmVjdC5tYXAoKGl0ZW0pID0+IHtcXG4gICAgbGV0IG5hbWUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3JlZGlyZWN0Jywn5pys5ZywJyk7XFxuICAgIGlmKGl0ZW0ubmFtZT09PW5hbWUpe1xcbiAgICAgICAgcmV0dXJuICfwn5GJJytpdGVtLm5hbWU7XFxuICAgIH1lbHNle1xcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZTtcXG4gICAgfVxcbn0pO1xcbmxldCBmaWxlX3VhX3RpdGxlID0gZmlsZV91YS5tYXAoKGl0ZW0pID0+IHtcXG4gICAgbGV0IG5hbWUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJywn55S16ISRJyk7XFxuICAgIGlmKGl0ZW0ubmFtZT09PW5hbWUpe1xcbiAgICAgICAgcmV0dXJuICfwn5GJJytpdGVtLm5hbWU7XFxuICAgIH1lbHNle1xcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZTtcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7Y29sX3R5cGU6ICd4NV93ZWJ2aWV3X3NpbmdsZScsIGV4dHJhOiB7anM6ICdjb25zb2xlLmxvZyhcXFwi5oiR5Yqg6L295LqGXFxcIiknfX0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAn6I635Y+WJyxcXG4gICAgZGVzYzogXFxcIuaWh+S7tui3r+W+hCzmlK/mjIFoaWtlcixmaWxlLGh0dHAs5Li76aKYXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIG9uQ2hhbmdlOiBcXFwicHV0VmFyKCdob3VzZS53ZWJfdXJsJyxpbnB1dClcXFwiLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiB0cnVlLFxcbiAgICAgICAgaWQ6J2ZpbGVQYXRoJyxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTpnZXRWYXIoJ2hvdXNlLndlYl91cmwnKVxcbiAgICB9LFxcbiAgICB1cmw6JC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBsZXQgaW5wdXQgPSBnZXRWYXIoJ2hvdXNlLndlYl91cmwnLCcnKTtcXG4gICAgICAgIGlmKGlucHV0Lmxlbmd0aDwyKXtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZO+5o6l5LiN5Y+v5Lul5Li656m6J1xcbiAgICAgICAgfSBlbHNlIGlmKC9eaGlrZXI6fF5maWxlOnxeaHR0cDp8Xmh0dHBzOnxeXFxcXC9zdG9yYWdlXFxcXC98XlxcXFwvc2RjYXJkXFxcXC8vLnRlc3QoaW5wdXQpKXtcXG4gICAgICAgICAgICBpZigvXlxcXFwvc3RvcmFnZVxcXFwvfF5cXFxcL3NkY2FyZFxcXFwvLy50ZXN0KGlucHV0KSl7XFxuICAgICAgICAgICAgICAgIGlucHV0ID0gJ2ZpbGU6Ly8nK2lucHV0O1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsb2coJ+ato+W4uOmTvuaOpTonK2lucHV0KTtcXG4gICAgICAgICAgICBsZXQgdWEgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJyk9PT0n55S16ISRJz8nTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg4LjAuNDMyNC4xNDYgU2FmYXJpLzUzNy4zNic6J01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA5OyBNSSA2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODkuMC40Mzg5LjkwIE1vYmlsZSBTYWZhcmkvNTM3LjM2JztcXG4gICAgICAgICAgICBsZXQgd2ViX3VybF9hcnIgPSBpbnB1dC5zcGxpdCgnOycpO1xcbiAgICAgICAgICAgIGxldCB3ZWJfdXJsID0gd2ViX3VybF9hcnJbMF07XFxuICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSB7XFxuICAgICAgICAgICAgICAgICdSZWZlcmVyJzonaHR0cHM6Ly9ibG9nLmNzZG4ubmV0JyxcXG4gICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOnVhLFxcbiAgICAgICAgICAgICAgICAnQWNjZXB0JzonYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0LCAqLyo7IHE9MC4wMScsXFxuICAgICAgICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOid6aC1DTicsXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBpZih3ZWJfdXJsX2Fyci5sZW5ndGg+PTMmJndlYl91cmxfYXJyWzJdLmxlbmd0aD4yKXsgLy/orr7nva7nvJbnoIFcXG4gICAgICAgICAgICAgICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSAnY2hhcnNldD0nK3dlYl91cmxfYXJyWzJdLnRvVXBwZXJDYXNlKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7aGVhZGVyczpoZWFkZXJzLHdpdGhIZWFkZXJzOmZhbHNlLHJlZGlyZWN0OmZhbHNlfTtcXG4gICAgICAgICAgICBpZih3ZWJfdXJsX2Fyci5sZW5ndGg+PTImJndlYl91cmxfYXJyWzFdLmxlbmd0aD4yKXsgLy8g6K6+572u6K+35rGC5pa55rOVXFxuICAgICAgICAgICAgICAgIHBhcmFtc1snbWV0aG9kJ10gPSB3ZWJfdXJsX2FyclsxXS50b1VwcGVyQ2FzZSgpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsb2coJ+W8gOWni+iOt+WPlua6kOeggScpO1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIC8qXFxuICAgICAgICAgICAgICAgIHJlcXVlc3RBc3luYyh3ZWJfdXJsLHBhcmFtcyxmdW5jdGlvbiAoa2V5LGNvZGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBiYWNrX2NvZGUgPSBjb2RlO1xcbiAgICAgICAgICAgICAgICAgICAgaWYoYmFja19jb2RlLmxlbmd0aD4yMCl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0VmFyKCdob3VzZS51cGxvYWRfY29kZScsYmFja19jb2RlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5bey6I635Y+WLOW5tumDqOWIhuaPkuWFpeWIsOaWh+acrOWMuuWfnydcXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/plJnor6/vvIzmnKzmrKHojrflj5bliLDnqbrmlofmnKzvvIznlpHkvLzkvaDmsqHmnInmraTmlofku7YhJztcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgICAgIGxldCBiYWNrX2NvZGUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJyk9PT0n55S16ISRJz9mZXRjaCh3ZWJfdXJsLHBhcmFtcyk6cmVxdWVzdCh3ZWJfdXJsLHBhcmFtcyk7XFxuICAgICAgICAgICAgICAgIGlmKGJhY2tfY29kZS5sZW5ndGg+MjApe1xcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKCdob3VzZS51cGxvYWRfY29kZScsYmFja19jb2RlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+a6kOeggeW3suiOt+WPlizlubbpg6jliIbmj5LlhaXliLDmlofmnKzljLrln58nXFxuICAgICAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOacrOasoeiOt+WPluWIsOepuuaWh+acrO+8jOeWkeS8vOS9oOayoeacieatpOaWh+S7tiEnO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5Y+R55Sf5LqG6ZSZ6K+vOlxcXFxuJytlLm1lc3NhZ2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfWVsc2UgaWYoL+S4u+mimO+/pXzlhYPntKDvv6UvLnRlc3QoaW5wdXQpKXtcXG4gICAgICAgICAgICBsb2coJ+S4u+mimOmTvuaOpScpO1xcbiAgICAgICAgICAgIGxldCB3ZWJfdXJsX2FyciA9IGlucHV0LnNwbGl0KCfvv6UnKTtcXG4gICAgICAgICAgICBsZXQgd2ViX3VybCA9IHdlYl91cmxfYXJyW3dlYl91cmxfYXJyLmxlbmd0aC0xXTtcXG4gICAgICAgICAgICBsZXQgYmFja19jb2RlID0gcGFyc2VQYXN0ZSh3ZWJfdXJsKTtcXG4gICAgICAgICAgICBpZihiYWNrX2NvZGUubGVuZ3RoPjIwKSB7XFxuICAgICAgICAgICAgICAgIHB1dFZhcignaG91c2UudXBsb2FkX2NvZGUnLGJhY2tfY29kZSk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5bey6I635Y+WLOW5tumDqOWIhuaPkuWFpeWIsOaWh+acrOWMuuWfnydcXG4gICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOacrOasoeiOt+WPlui/lOWbnuS4ujpcXFxcbicrYmFja19jb2RlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/pnZ7ms5Xpk77mjqU6XFxcXG4nK2dldFZhcignaG91c2Uud2ViX3VybCcpO1xcbiAgICAgICAgfVxcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqeaWh+S7tui3r+W+hFxcXCIsXFxuICAgIHVybDokKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCgpPT57XFxuICAgICAgICAvKlxcbiAgICAgICAgbGV0IGZwID0gJ2h0dHBzOi8vZ2l0Y29kZS5uZXQvcXFfMzIzOTQzNTEvZHIvLS9yYXcvbWFzdGVyL2pzL2ZpbGVTZWxlY3QuanMnO1xcbiAgICAgICAgbGV0IGYgPSByZXF1aXJlKGZwKTtcXG4gICAgICAgICovXFxuICAgICAgICBsZXQgZnA9Y29uZmlnLmxpYi5maWxlU2VsZWN0O1xcbiAgICAgICAgbGV0IGY9JC5yYyhmcCk7XFxuICAgICAgICByZXR1cm4gZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBmaW5kSXRlbShcXFwiZmlsZVBhdGhcXFwiKS5leHRyYTtcXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbShcXFwiZmlsZVBhdGhcXFwiLCB7XFxuICAgICAgICAgICAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLndlYl91cmwnLFBBVEgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBvbkNsaWNrVHlwZTonY29uZmlybScsXFxuICAgICAgICAgICAgZmlsZVR5cGU6IFxcXCIuanN8LnR4dHwuaGlrZXJ8Lmpzb258Lmh0bWxcXFwiLFxcbiAgICAgICAgICAgIHBhdHRlcm46IDAsXFxuICAgICAgICAgICAgcmVxdWlyZVVybDpmcCxcXG4gICAgICAgICAgICBpbml0aWFsUGF0aDpnZXRQYXRoKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvJykuc2xpY2UoNyksXFxuICAgICAgICAgICAgbWVtb3J5Oid0cnVlJyxcXG4gICAgICAgIH0pO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTon5LiK5Lyg57G75Z6LJyxcXG4gICAgZGVzYzon5LiK5Lyg5paH5Lu255qE57G75Z6LLOW9k+WJjeS4ujonK2NvbG9yKGdldEl0ZW0oJ2hvdXNlLmZpbGVfdHlwZScsJ+mdmeaAgeaWh+S7ticpLCcjZmY3MDAwJyksXFxuICAgIGNvbF90eXBlOid0ZXh0XzEnLFxcbiAgICB1cmw6JChmaWxlX3R5cGVfdGl0bGUsMikuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgIHNldEl0ZW0oJ2hvdXNlLmZpbGVfdHlwZScsaW5wdXQucmVwbGFjZSgn8J+RiScsJycpKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+S9oOmAieaLqeS6hjonK2lucHV0O1xcbiAgICB9KVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOifmlofku7blrprkvY0nLFxcbiAgICBkZXNjOifmlofku7bmmK/lkKblsZ7kuo7ph43lrprlkJEs5b2T5YmN5Li6OicrY29sb3IoZ2V0SXRlbSgnaG91c2UuZmlsZV9yZWRpcmVjdCcsJ+acrOWcsCcpLCcjZmY3MDAwJyksXFxuICAgIGNvbF90eXBlOid0ZXh0XzEnLFxcbiAgICB1cmw6JChmaWxlX3JlZGlyZWN0X3RpdGxlLDIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICBzZXRJdGVtKCdob3VzZS5maWxlX3JlZGlyZWN0JyxpbnB1dC5yZXBsYWNlKCfwn5GJJywnJykpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L2g6YCJ5oup5LqGOicraW5wdXQ7XFxuICAgIH0pXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J+iuvuWkh1VBJyxcXG4gICAgZGVzYzon5Y+R6LW3572R6aG16K+35rGC5aS05qCH6K+GLOW9k+WJjeS4ujonK2NvbG9yKGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnLCfnlLXohJEnKSwnI2ZmNzAwMCcpLFxcbiAgICBjb2xfdHlwZTondGV4dF8xJyxcXG4gICAgdXJsOiQoZmlsZV91YV90aXRsZSwyKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgc2V0SXRlbSgnaG91c2UuZmlsZV91YScsaW5wdXQucmVwbGFjZSgn8J+RiScsJycpKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+S9oOmAieaLqeS6hjonK2lucHV0O1xcbiAgICB9KVxcbn0pO1xcbmZ1bmN0aW9uIGNvbXBhcmUobmFtZSkge1xcbiAgICByZXR1cm4gZnVuY3Rpb24oaXRlbSkge1xcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZSA9PT0gbmFtZTtcXG4gICAgfVxcbn1cXG5kLnB1c2goe1xcbiAgICB0aXRsZTon8J+XhO+4j+eOr+WigycsXFxuICAgIGNvbF90eXBlOidmbGV4X2J1dHRvbicsXFxuICAgIHVybDokKCkubGF6eVJ1bGUoKGZpbGVfdHlwZSxjb21wYXJlKT0+e1xcbiAgICAgICAgbG9nKCfmn6XnnIvnjq/looPlj5jph48nKTtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IHVwX2NvZGUgPSBnZXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJywnJyk7XFxuICAgICAgICAgICAgbGV0IGZ0eXBlID0gIGZpbGVfdHlwZS5maWx0ZXIoY29tcGFyZShnZXRJdGVtKCdob3VzZS5maWxlX3R5cGUnLCfpnZnmgIHmlofku7YnKSkpWzBdLnZhbHVlO1xcbiAgICAgICAgICAgIGxldCByZWRpcmVjdCA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfcmVkaXJlY3QnLCfmnKzlnLAnKSE9PSfmnKzlnLAnO1xcbiAgICAgICAgICAgIGxldCBjb2RlID0gIXJlZGlyZWN0P3VwX2NvZGU6aW5wdXQ7XFxuICAgICAgICAgICAgbGV0IGVudiA9IHtcXG4gICAgICAgICAgICAgICAgd2ViX3VybDpnZXRWYXIoJ2hvdXNlLndlYl91cmwnLCcnKSxcXG4gICAgICAgICAgICAgICAgZGV2aWNlOmdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnLCfnlLXohJEnKSxcXG4gICAgICAgICAgICAgICAgZnR5cGU6ZnR5cGV8fFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICByZWRpcmVjdDpyZWRpcmVjdCxcXG4gICAgICAgICAgICAgICAgY29kZTpjb2RlLnN1YnN0cmluZygwLDQwKXx8XFxcIlxcXCIsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxvZyhlbnYpO1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK0pTT04uc3RyaW5naWZ5KGVudik7XFxuICAgICAgICAgICAgLy8gYWxlcnQoSlNPTi5zdHJpbmdpZnkoZW52KSk7XFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytlLm1lc3NhZ2U7XFxuICAgICAgICAgICAgLy8gYWxlcnQoZS5tZXNzYWdlKTtcXG4gICAgICAgIH1cXG4gICAgfSxmaWxlX3R5cGUsY29tcGFyZSlcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTon8J+Tg+aVmeeoiycsXFxuICAgIGNvbF90eXBlOidmbGV4X2J1dHRvbicsXFxuICAgIHVybDokKCkueDVSdWxlKCgpPT57XFxuICAgICAgICBsZXQgbXNnID0gJ+asoui/juS9v+eUqOW8gOWPkeiAheabtOWkmuWIhuS6q+W3peWFt1xcXFxuMS7ovpPlhaXnvZHlnYDkuLrmnKzlnLDmlofku7bot6/lvoQsaGlrZXI6Ly/miJbogIVmaWxlOi8v5byA5aS0XFxcXG4yLueCueWHu+e9keWdgOi+k+WFpeagj+WQjumdoueahOaMiemSrlxcXFxuMy7nnIvmlofmnKzpooTop4jljLrmmK/lkKbmraPnoa5cXFxcbjQu54K55Ye75LiK5Lyg5oyJ6ZKu5o+Q5Lqk5Yiw5LuT5bqTJztcXG4gICAgICAgIGFsZXJ0KG1zZyk7XFxuICAgIH0pXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J/Cfl5HvuI/muIXnqbonLFxcbiAgICBjb2xfdHlwZTonZmxleF9idXR0b24nLFxcbiAgICB1cmw6JCgpLmxhenlSdWxlKCgpPT57XFxuICAgICAgICBjbGVhclZhcignaG91c2UudXBsb2FkX2NvZGUnKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+W3sua4hemZpOmihOiniOWMuuWfn+WGheWuuSdcXG4gICAgfSlcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTon8J+TsuekuuS+iycsXFxuICAgIGNvbF90eXBlOidmbGV4X2J1dHRvbicsXFxuICAgIHVybDokKCkubGF6eVJ1bGUoKCk9PntcXG4gICAgICAgIGxldCBkZW1vX2NvZGUgPSBnZXRJdGVtKCdob3VzZS5kZW1vJywnMCcpO1xcbiAgICAgICAgaWYoZGVtb19jb2RlPT0nMCcpe1xcbiAgICAgICAgICAgIHB1dFZhcignaG91c2Uud2ViX3VybCcsJ2hpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9odG1sL+i1hOa6kOe9keS5puetvi5odG1sJyk7XFxuICAgICAgICAgICAgZGVtb19jb2RlID0gcGFyc2VJbnQoZGVtb19jb2RlKSsxO1xcbiAgICAgICAgICAgIHNldEl0ZW0oJ2hvdXNlLmRlbW8nLGRlbW9fY29kZSsnJyk7XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLndlYl91cmwnLCdmaWxlOi8vL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9ydWxlcy9kekhvdXNlL2h0bWwv6LWE5rqQ572R5Lmm562+Lmh0bWwnKTtcXG4gICAgICAgICAgICBzZXRJdGVtKCdob3VzZS5kZW1vJywnMCcpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5bey6K6+572u56S65L6L5Zyw5Z2AJ1xcbiAgICB9KVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOifwn5Ok5LiK5LygJyxcXG4gICAgY29sX3R5cGU6J2ZsZXhfYnV0dG9uJyxcXG4gICAgdXJsOiQoKS5sYXp5UnVsZSgoY2FudXAsaG91c2VfZGF0YSxwdXRfdXJsLGZpbGVfdHlwZSkgPT57XFxuICAgICAgICBmdW5jdGlvbiBjb21wYXJlKG5hbWUpIHtcXG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oaXRlbSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5uYW1lID09PSBuYW1lO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGNvbnN0IHtnZXROb3dGb3JtYXREYXRlfT0kLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG4gICAgICAgIGxldCB1cF9jb2RlID0gZ2V0VmFyKCdob3VzZS51cGxvYWRfY29kZScsJycpO1xcbiAgICAgICAgaWYodXBfY29kZS5sZW5ndGggPCAyKXtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5Yy65peg5YaF5a6577yM6K+35YWI6K6/6Zeu5LiA5Liq6Z2Z5oCB6aG16Z2iJ1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYoIWNhbnVwKXtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L2g5LiN5piv5byA5Y+R6ICF77yM5rKh5pyJ5o+Q5Lqk5Yiw5LuT5bqT55qE5p2D5YipISdcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBpbnB1dCA9IGdldFZhcignaG91c2Uud2ViX3VybCcsJycpO1xcbiAgICAgICAgbGV0IHdlYl91cmwgPSBpbnB1dC5zcGxpdCgnOycpWzBdO1xcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gJyc7XFxuICAgICAgICBpZigvXmhpa2VyOnxeZmlsZTp8Xmh0dHA6fF5odHRwczp8XlxcXFwvc3RvcmFnZVxcXFwvfF5cXFxcL3NkY2FyZFxcXFwvLy50ZXN0KHdlYl91cmwpKXtcXG4gICAgICAgICAgICBmaWxlTmFtZSA9IHdlYl91cmwuc3BsaXQoJy8nKVt3ZWJfdXJsLnNwbGl0KCcvJykubGVuZ3RoLTFdO1xcbiAgICAgICAgfWVsc2UgaWYoL+S4u+mimO+/pXzlhYPntKDvv6UvLnRlc3QoaW5wdXQpKXtcXG4gICAgICAgICAgICBsZXQgYmthcnIgPSB1cF9jb2RlLnNwbGl0KCfvv6UnKTtcXG4gICAgICAgICAgICBpZihia2Fyci5sZW5ndGg8Myl7XFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/kupHliarotLTmnb/lhoXlrrnmnInor68nXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHN3aXRjaCAoYmthcnJbMV0pIHtcXG4gICAgICAgICAgICAgICAgY2FzZSAnbXlfaG9tZV90aGVtZSc6XFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHVwX2NvZGUuc3BsaXQoJ+OAjCcpWzFdLnNwbGl0KCfjgI0nKVswXTtcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICBjYXNlICdteV9ob21lX3NpbmdsZSc6XFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHVwX2NvZGUuc3BsaXQoJ+OAjCcpWzFdLnNwbGl0KCfjgI0nKVswXTtcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICBjYXNlICdqc191cmwnOlxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSB1cF9jb2RlLnNwbGl0KCfvv6UnKVsyXS5zcGxpdCgnQCcpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOe9kemhtemTvuaOpeaXoOWGheWuuSEnO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHVhID0gZ2V0SXRlbSgnaG91c2UuZmlsZV91YScpPT09J+eUteiEkSc/J01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OC4wLjQzMjQuMTQ2IFNhZmFyaS81MzcuMzYnOidNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOTsgTUkgNikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg5LjAuNDM4OS45MCBNb2JpbGUgU2FmYXJpLzUzNy4zNic7XFxuICAgICAgICBsZXQgaGVhZGVycyA9IHtcXG4gICAgICAgICAgICAnUmVmZXJlcic6J2h0dHBzOi8vYmxvZy5jc2RuLm5ldCcsXFxuICAgICAgICAgICAgXFxcImNvbnRlbnQtdHlwZVxcXCI6IFxcXCJhcHBsaWNhdGlvbi9qc29uXFxcIixcXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6dWEsXFxuICAgICAgICAgICAgJ0FjY2VwdCc6J2FwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCwgKi8qOyBxPTAuMDEnLFxcbiAgICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOid6aC1DTicsXFxuICAgICAgICB9O1xcbiAgICAgICAgbGV0IHRvQ29tcGFyZSA9ICcnO1xcbiAgICAgICAgaWYoZmlsZU5hbWUuZW5kc1dpdGgoJy5odG1sJykpe1xcbiAgICAgICAgICAgIHRvQ29tcGFyZSA9ICfpnZnmgIHmlofku7YnO1xcbiAgICAgICAgfWVsc2UgaWYoL+S4u+mimC8udGVzdChmaWxlTmFtZSkpe1xcbiAgICAgICAgICAgIHRvQ29tcGFyZSA9ICfkuLvpobXphY3nva4nXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgZnR5cGUgPSAgZmlsZV90eXBlLmZpbHRlcihjb21wYXJlKHRvQ29tcGFyZXx8Z2V0SXRlbSgnaG91c2UuZmlsZV90eXBlJywn6Z2Z5oCB5paH5Lu2JykpKVswXS52YWx1ZTtcXG4gICAgICAgIGxldCByZWRpcmVjdCA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfcmVkaXJlY3QnLCfmnKzlnLAnKSE9PSfmnKzlnLAnO1xcbiAgICAgICAgaWYocmVkaXJlY3QmJiF3ZWJfdXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSl7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+ebtOmTvjMwMumHjeWumuWQkee9keWdgOmTvuaOpeW/hemhu2h0dHDlvIDlpLQnO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGNvZGUgPSAhcmVkaXJlY3Q/dXBfY29kZTp3ZWJfdXJsO1xcbiAgICAgICAgbGV0IGRhdGEgPSB7XFxcInBhcmFtc1xcXCI6XFxuICAgICAgICAgICAgICAgIHtcXFwiZGF0YVxcXCI6IHtydWxlX25hbWU6IGZpbGVOYW1lLCBcXFwicnVsZV90eXBlXFxcIjogJ+abtOWkmuWIhuS6qycsIFxcXCJ2ZXJzaW9uXFxcIjpnZXROb3dGb3JtYXREYXRlKCksXFxcInJ1bGVfdmFsdWVcXFwiOiBjb2RlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfdHlwZTpmdHlwZSwgaXNfcmVkaXJlY3Q6cmVkaXJlY3QsZGV2aWNlVWE6Z2V0SXRlbSgnaG91c2UuZmlsZV91YScpLFxcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogaG91c2VfZGF0YS51c2VybmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IGhvdXNlX2RhdGEucGFzc3dvcmR9XFxuICAgICAgICB9O1xcbiAgICAgICAgbGV0IHVwcGFyYW1zID0ge2hlYWRlcnM6aGVhZGVycyxib2R5OkpTT04uc3RyaW5naWZ5KGRhdGEpLHdpdGhIZWFkZXJzOmZhbHNlLHJlZGlyZWN0OmZhbHNlLG1ldGhvZDonUE9TVCd9O1xcbiAgICAgICAgbGV0IGJhY2ttc2cgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJyk9PT0n55S16ISRJz9mZXRjaChwdXRfdXJsLHVwcGFyYW1zKTpyZXF1ZXN0KHB1dF91cmwsdXBwYXJhbXMpO1xcbiAgICAgICAgdHJ5e1xcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKGJhY2ttc2cpLnJlc3VsdDtcXG4gICAgICAgICAgICBsZXQgZGV0YWlsID0gcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytkZXRhaWw7XFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coZS5tZXNzYWdlKTtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5Y+R55Sf5LqG6ZSZ6K+vXFxcXG4nK2UubWVzc2FnZTtcXG4gICAgICAgIH1cXG4gICAgfSxjYW51cCxob3VzZV9kYXRhLHB1dF91cmwsZmlsZV90eXBlKVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOifplb/mlofmnKzpooTop4jljLrln58nLFxcbiAgICBjb2xfdHlwZTondGV4dF8xJyxcXG4gICAgdXJsOidoaWtlcjovL2VtcHR5JyxcXG4gICAgZXh0cmE6IHt0ZXh0U2l6ZTogMTEsbGluZVZpc2libGU6ZmFsc2V9XFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6Z2V0VmFyKCdob3VzZS51cGxvYWRfY29kZScsJycpLnN1YnN0cmluZygwLDEwMjQwKSxcXG4gICAgY29sX3R5cGU6J2xvbmdfdGV4dCcsXFxuICAgIGV4dHJhOiB7dGV4dFNpemU6IDExfVxcbn0pO1xcbnNldFBhZ2VUaXRsZShcXFwi5pu05aSa5YiG5LqrXFxcIik7XFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6L275ZCI6ZuG55Sf5oiQ5o6l5Y+jXCIsXCJwYXRoXCI6XCJnZW5BcGlcIixcInJ1bGVcIjpcImpzOlxcbmZ1bmN0aW9uIGdlblJ1bGUobmFtZSx1cmwsaWNvbil7XFxuICAgIGljb249aWNvbnx8J2h0dHBzOi8vejMuYXgxeC5jb20vMjAyMS8xMS8xNi9JV0poeGYucG5nJztcXG4gICAgY29uc3Qge2dldE5vd0Zvcm1hdERhdGUsYXBpLGdldEFwaX09JC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbCA9IGZ1bmN0aW9uKG9sZCxuZXdfc3RyKXtcXG4gICAgICAgIHJldHVybiB0aGlzLnNwbGl0KG9sZCkuam9pbihuZXdfc3RyKTtcXG4gICAgfTtcXG4gICAgbGV0IG11YmFuID0gZ2V0QXBpKCdpbXBvcnRVcmwnKStcXFwiMTY5MFxcXCI7XFxuICAgIGxldCBtdWJhbl93b3JkPXtuYW1lOlxcXCJA6L275ZCI6ZuGXFxcIix1cmw6XFxcIkDlnLDlnYBcXFwiLHZlcjpcXFwiQOeJiOacrFxcXCIsaWNvbjpcXFwiQOWbvuagh1xcXCJ9O1xcbiAgICBsZXQgbXViYW5fY29kZSA9IGZldGNoKG11YmFuKTtcXG4gICAgbXViYW5fY29kZT1tdWJhbl9jb2RlLnJlcGxhY2VBbGwobXViYW5fd29yZC5uYW1lLG5hbWUpLnJlcGxhY2VBbGwobXViYW5fd29yZC52ZXIsZ2V0Tm93Rm9ybWF0RGF0ZSgpKS5yZXBsYWNlQWxsKG11YmFuX3dvcmQudXJsLHVybCkucmVwbGFjZUFsbChtdWJhbl93b3JkLmljb24saWNvbik7XFxuICAgIGxldCBpbXBvcnRfY29kZT1cXFwi5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77ya5bCP56iL5bqP77yM5peg5qC55qCR77yM6Iqx5q2j5riF77yM5LiN5pat6I2k6IWl5LiN5oiS5rer77+laG9tZV9ydWxlX3Yy77+lYmFzZTY0Oi8vQFxcXCIrbmFtZStcXFwiQFxcXCIrYmFzZTY0RW5jb2RlKG11YmFuX2NvZGUpO1xcbiAgICB2YXIgcGFzdGVzID0gZ2V0UGFzdGVzKCk7XFxuICAgIHZhciB1cmwgPSBzaGFyZVBhc3RlKGltcG9ydF9jb2RlLHBhc3Rlcy5zbGljZSgtMSlbMF0pO1xcbiAgICBsZXQgaW1wb3J0X3J1bGU9IHVybCtcXFwiXFxcXG5cXFxcbuWwj+eoi+W6j++8mlxcXCIrbmFtZTtcXG4gICAgcmV0dXJuIGltcG9ydF9ydWxlO1xcbn1cXG4kLmV4cG9ydHMuZ2VuUnVsZT1nZW5SdWxlO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5YWo5bGA6Kej5p6Q5YWN5ZeFXCIsXCJwYXRoXCI6XCJnbG9iYWxQYXJzZVwiLFwicnVsZVwiOlwianM6XFxuICAgIGZ1bmN0aW9uIGdldEhlYWRlcnMocGxheVVybCl7XFxuICAgICAgICBsZXQgaGVhZGVycyA9IHt9O1xcbiAgICAgICAgbGV0IHJlZmVyPXBsYXlVcmwuc3BsaXQoXFxcIi8vXFxcIilbMF0rXFxcIi8vXFxcIitwbGF5VXJsLnNwbGl0KFxcXCIvL1xcXCIpWzFdLnNwbGl0KFxcXCIvXFxcIilbMF07XFxuICAgICAgICBpZigvbGVjbG91ZFxcXFwuY29tfGJpbGl2aWRlb1xcXFwuY29tLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICBoZWFkZXJzID0ge1xcXCJSZWZlcmVyXFxcIjogJ2h0dHBzOi8vd3d3LmJpbGliaWxpLmNvbS8nLFxcXCJVc2VyLUFnZW50XFxcIjpcXFwiTW96aWxsYS81LjBcXFwifVxcbiAgICAgICAgfWVsc2UgaWYoL21ndHZcXFxcLmNvbS8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgaGVhZGVycyA9IHtcXFwiUmVmZXJlclxcXCI6IHJlZmVyLFxcXCJVc2VyLUFnZW50XFxcIjpcXFwiTW96aWxsYS81LjBcXFwifVxcbiAgICAgICAgfWVsc2UgaWYoL2l4aWd1YVxcXFwuY29tLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICBoZWFkZXJzID0ge1xcXCJSZWZlcmVyXFxcIjogJ2h0dHBzOi8vd3d3Lml4aWd1YS5jb20vJyxcXFwiVXNlci1BZ2VudFxcXCI6XFxcIk1vemlsbGEvNS4wXFxcIn1cXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIC8vIGhlYWRlcnMgPSB7XFxcIlJlZmVyZXJcXFwiOiByZWZlciwnVXNlci1BZ2VudCc6J0RhcnQvMi4xMyAoZGFydDppbyknfVxcbiAgICAgICAgICAgIC8vIGhlYWRlcnMgPSB7XFxcIlJlZmVyZXJcXFwiOiByZWZlciwnVXNlci1BZ2VudCc6TU9CSUxFX1VBfTtcXG4gICAgICAgICAgICBoZWFkZXJzID0geydVc2VyLUFnZW50JzpNT0JJTEVfVUF9O1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGhlYWRlcnNcXG4gICAgfVxcbmZ1bmN0aW9uIGlzUGljKHN0cil7XFxuICAgIHJldHVybiAvXFxcXC4oZ2lmfGpwZ3xqcGVnfHBuZ3xHSUZ8SlBHfFBORykkLy50ZXN0KHN0cik7XFxufVxcbmZ1bmN0aW9uIGlzVmlkZW8ocGxheVVybCxyZWNoYW5nZSl7XFxuICAgIC8v5rOo5oSPLnBocOS4jeWPr+S7peiiq+aOkumZpOWQpuWImeiejeWFtOino+aekOS4jeS6hiB8LnBocCRcXG4gICAgLy/lpoLmnpzmmK/mkq3mlL7lnLDlnYDlsLHnm7TmjqXov5Tlm57lnLDlnYDliqDkuIpVQe+8jOS4jeaYr+eahOivneWwsei/lOWbnmZhbHNlXFxuICAgIC8vIGxldCB0MSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbiAgICBsZXQgY2FjaGVSZWd4ID0gbmV3IFJlZ0V4cCgnZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLyguKj8pXFxcXFxcXFwubTN1OHxoaWtlcjovL2ZpbGVzLyguKj8pXFxcXFxcXFwubTN1OCcpO1xcbiAgICBpZihjYWNoZVJlZ3gudGVzdChwbGF5VXJsKSl7XFxuICAgICAgICByZXR1cm4gcGxheVVybFxcbiAgICB9XFxuICAgIGZ1bmN0aW9uIGdldEhvc3QodXJsKXtcXG4gICAgICAgIC8vIGZiYeeahHBhcnNlTGF6eeWkquaFouS6huWNg+S4h+WIq+eUqFxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICByZXR1cm4gdXJsLm1hdGNoKC9eaHR0cChzKT86XFxcXC9cXFxcLyguKj8pXFxcXC8vKVswXS5zbGljZSgwLC0xKTtcXG4gICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICAgICAgLypcXG4gICAgICAgIGlmKHR5cGVvZihsb2cpPT09J3VuZGVmaW5lZCcpe1xcbiAgICAgICAgICAgIHJldHVybiAgZmJhLnBhcnNlTGF6eVJ1bGUoJCQkKCkubGF6eVJ1bGUoKHVybCk9PntcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEhvbWUodXJsKVxcbiAgICAgICAgICAgIH0sdXJsKSlcXG4gICAgICAgIH1lbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gZ2V0SG9tZSh1cmwpXFxuICAgICAgICB9XFxuICAgICAgICAqL1xcbiAgICB9XFxuICAgIGxldCBwVXJsPXBsYXlVcmwuc3BsaXQoXFxcIjtcXFwiKVswXTsvL+iOt+WPluaKoOaOiea1t+mYlHVh562J5Y+C5pWw55qE572R6aG15pKt5pS+6ZO+5o6lXFxuICAgIGxldCBob3N0ID0gZ2V0SG9zdChwVXJsKTsgLy8g6I635Y+W5Z+f5ZCNXFxuICAgIGlmKCFob3N0KXsvL+WIpOaWreaXoOWfn+WQjeebtOaOpeS4jeaYr+inhumikVxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxuICAgIH1cXG4gICAgZnVuY3Rpb24gcHJpbnQoZGF0YSl7XFxuICAgICAgICBpZih0eXBlb2YobG9nKT09PSd1bmRlZmluZWQnKXtcXG4gICAgICAgICAgICByZXR1cm4gIGZiYS5sb2coZGF0YSlcXG4gICAgICAgIH1lbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gbG9nKGRhdGEpXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgcmVjaGFuZ2U9dHlwZW9mKHJlY2hhbmdlKT09PVxcXCJmdW5jdGlvblxcXCI/cmVjaGFuZ2U6ZnVuY3Rpb24ocGxheVVybCl7cmV0dXJuIHBsYXlVcmx9O1xcbiAgICBsZXQgZXhjZXB0V29yZHMgPSAnLmpzJHwuY3NzJHwudHMkfC5odG1sJHwuaHRtJHwuZ2lmJHwuanBnJHwuanBlZyR8LnBuZyR8LmljbyR8LnN2ZyR8LnR4dCQnLnNwbGl0KCd8JykubWFwKGl0PT4nXFxcXFxcXFwnK2l0KS5qb2luKCd8Jyk7XFxuICAgIHZhciBleGNlcHRLZXlzID0gbmV3IFJlZ0V4cChleGNlcHRXb3Jkcyk7XFxuICAgIGxldCBleGNlcHRXb3JkczEgPSAncmVmZXJlcj18dXJsPScuc3BsaXQoJ3wnKS5tYXAoaXQ9Pml0KS5qb2luKCd8Jyk7XFxuICAgIHZhciBleGNlcHRLZXlzMSA9IG5ldyBSZWdFeHAoZXhjZXB0V29yZHMxKTtcXG4gICAgbGV0IHJlcGxhY2VXb3JkcyA9ICdwbGF5bTN1OHxtM3U4XFxcXC50dicuc3BsaXQoJ3wnKS5tYXAoaXQ9Pml0KS5qb2luKCd8Jyk7XFxuICAgIGxldCByZXBsYWNlS2V5cyA9IG5ldyBSZWdFeHAocmVwbGFjZVdvcmRzLCdnJyk7XFxuICAgIGxldCB2aWRlb1dvcmRzID0gXFxcIi92aWRlby90b3N8Lm1wNCR8Lm0zdTgkfC5mbHYkfC5hdmkkfC4zZ3AkfC5tcGVnJHwud212JHwubW92JHxybXZifC5kYXQkfC5tcDMkfC5tNGEkfHFxQkZkb3dubG9hZHxtaW1lPXZpZGVvJTJGfG1pbWVfdHlwZT12aWRlb198dHlwZT1tM3U4fHB0PW0zdThcXFwiLnNwbGl0KCd8JykubWFwKChpdCk9PntcXG4gICAgICAgIC8vdHlwZT1tcDRcXG4gICAgICAgIGlmKGl0LnN0YXJ0c1dpdGgoXFxcIi5cXFwiKSl7XFxuICAgICAgICAgICAgcmV0dXJuICdcXFxcXFxcXCcraXRcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiBpdFxcbiAgICAgICAgfVxcbiAgICB9KS5qb2luKFxcXCJ8XFxcIik7XFxuICAgIGxldCB2aWRlb0tleXMgPSBuZXcgUmVnRXhwKHZpZGVvV29yZHMpO1xcbiAgICBsZXQgclVybCA9IHBVcmwucmVwbGFjZShob3N0LCcnKTsvL+iOt+WPlumZpOW8gOWfn+WQjeeahOWJqeS9memTvuaOpVxcbiAgICBsZXQgcFVybDI9cFVybC5zcGxpdChcXFwiJlxcXCIpWzBdLnNwbGl0KFxcXCI/XFxcIilbMF07Ly/ojrflj5bkuI3luKblj4LmlbDnmoTnvZHpobXpk77mjqVcXG4gICAgbGV0IHJ1cmwyID0gcFVybDIucmVwbGFjZShob3N0LCcnKTsvL+iOt+WPlumZpOW8gOWfn+WQjeeahOWJqeS9meS4jeW4puWPguaVsOmTvuaOpVxcbiAgICBsZXQgaGFzS2V5ID0gdmlkZW9LZXlzLnRlc3QoclVybCl8fHZpZGVvS2V5cy50ZXN0KHJ1cmwyKTtcXG4gICAgbGV0IHBhclVybCA9IHBVcmwucmVwbGFjZShwVXJsLnNwbGl0KFxcXCI/XFxcIilbMF0sJycpOyAvLyDliIblibLpl67lj7flkI7liankvZnlj4LmlbDnmoTlrozmlbTpk77mjqVcXG4gICAgbGV0IGV4Y0tleSA9IGV4Y2VwdEtleXMxLnRlc3QocGFyVXJsKTtcXG4gICAgaWYoclVybC5zcGxpdCgnPycpLmxlbmd0aD4yKXtcXG4gICAgICAgIGxldCByVXJsMz1yVXJsLnNwbGl0KFxcXCI/XFxcIilbMV07Ly/ojrflj5Y/5YiG5Ymy5ZCO55qE56ys5LiA5q61XFxuICAgICAgICBoYXNLZXkgPSBoYXNLZXl8fHZpZGVvS2V5cy50ZXN0KHJVcmwzKTtcXG4gICAgfVxcbiAgICBpZihoYXNLZXkmJiFleGNLZXkpe1xcbiAgICAgICAgbGV0IHRpcHMgPSAn5qOA5rWL5Yiw55aR5Ly85aSa5aqS5L2T55qE5Zyw5Z2AOic7XFxuICAgICAgICBwcmludChcXFwianPkuK1cXFwiK3RpcHMrcFVybCk7XFxuICAgICAgICBwcmludChcXFwi5YiG5Ymy6Zeu5Y+35ZCOOlxcXCIrcGFyVXJsKTtcXG4gICAgfVxcbiAgICAvLyBsb2coJzE6JysodmlkZW9LZXlzLnRlc3QocFVybCl8fHZpZGVvS2V5cy50ZXN0KHBVcmwyKXx8dmlkZW9LZXlzLnRlc3QocFVybC5yZXBsYWNlKHJlcGxhY2VLZXlzLFxcXCJcXFwiKS5zcGxpdChcXFwiJlxcXCIpWzBdLnNwbGl0KFxcXCI/XFxcIilbMF0pKSk7XFxuICAgIC8vIGxvZygnMjonKyFleGNlcHRLZXlzLnRlc3QocFVybC5zcGxpdChcXFwiP1xcXCIpWzBdLnNwbGl0KCcmJylbMF0pKTtcXG4gICAgLy8gbG9nKCczOicrIWV4Y2VwdEtleXMxLnRlc3QocFVybC5yZXBsYWNlKHBVcmwuc3BsaXQoXFxcIj9cXFwiKVswXSwnJykpKTtcXG4gICAgaWYgKChoYXNLZXl8fHZpZGVvS2V5cy50ZXN0KHJVcmwucmVwbGFjZShyZXBsYWNlS2V5cyxcXFwiXFxcIikuc3BsaXQoXFxcIiZcXFwiKVswXS5zcGxpdChcXFwiP1xcXCIpWzBdKSApJiYgIWV4Y2VwdEtleXMudGVzdChwVXJsMikmJiFleGNlcHRLZXlzMS50ZXN0KHBVcmwyKSkge1xcbiAgICAgICAgaWYoISgvVXNlci1BZ2VudHxSZWZlcmVyQC8udGVzdChwbGF5VXJsKSkpe1xcbiAgICAgICAgICAgIGlmKC9sZWNsb3VkXFxcXC5jb218YmlsaXZpZGVvLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICAgICAgcGxheVVybCs9XFxcIjt7UmVmZXJlckBodHRwczovL3d3dy5iaWxpYmlsaS5jb20vJiZVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXCI7XFxuICAgICAgICAgICAgfWVsc2UgaWYoL2l4aWd1YVxcXFwuY29tLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICAgICAgcGxheVVybCs9XFxcIiNpc3ZpZGVvPXRydWUjO3tSZWZlcmVyQGh0dHBzOi8vd3d3Lml4aWd1YS5jb20vJiZVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGVsc2UgaWYoL21ndHZcXFxcLmNvbXxieXRlYW1vbmUvLnRlc3QocGxheVVybCkpe1xcbiAgICAgICAgICAgICAgICBwbGF5VXJsKz1cXFwiO3tVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXCI7XFxuICAgICAgICAgICAgfWVsc2UgaWYoL3B0d29cXFxcLndrZmlsZVxcXFwuY29tLy50ZXN0KHBsYXlVcmwpJiYvdXJsPS8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgICAgIHBsYXlVcmw9cGxheVVybC5zcGxpdChcXFwidXJsPVxcXCIpWzFdK1xcXCI7e1JlZmVyZXJAaHR0cHM6Ly9mYW50dWFuLnR2fVxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgLy8g5aSE55CG5aSn5biI5YWE5LmL57G755qEYXBwXFxuICAgICAgICAgICAgLy8gZWxzZXtcXG4gICAgICAgICAgICAvLyAgICAgcGxheVVybCs9XFxcIjt7VXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFwiO1xcbiAgICAgICAgICAgIC8vIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHBsYXlVcmw9cmVjaGFuZ2UocGxheVVybCk7XFxuICAgICAgICBpZighLyNpc1ZpZGVvPXRydWUjLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICBwbGF5VXJsKz1cXFwiI2lzVmlkZW89dHJ1ZSNcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgLy8gbGV0IHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxuICAgICAgICAvLyBwcmludCgn5Yik5pataXNWaWRlb+iAl+aXtjonKyh0Mi10MSkpO1xcbiAgICAgICAgcmV0dXJuIHBsYXlVcmw7XFxuICAgIH1lbHNle1xcbiAgICAgICAgLy8gbGV0IHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxuICAgICAgICAvLyBwcmludCgn5Yik5pataXNWaWRlb+iAl+aXtjonKyh0Mi10MSkpO1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxufVxcbmZ1bmN0aW9uIGNvbVBhcnNlKHBhclN0cixlaixvbmx5YmFjayxodG1sKXtcXG4gICAgLy/liJfooajvvIzmoIfpopjvvIzlm77niYfvvIzmj4/ov7DvvIzpk77mjqXvvIzlhoXlrrlcXG4gICAgZWogPSBlanx8ZmFsc2U7Ly/mnInkuoznuqdcXG4gICAgb25seWJhY2s9b25seWJhY2t8fGZhbHNlOy8v5Y+q6L+U5Zue5pWw5o2uXFxuICAgIGh0bWwgPSBodG1sfHxnZXRSZXNDb2RlKCk7XFxuICAgIGh0bWwgPSB0eXBlb2YoaHRtbCk9PT0nc3RyaW5nJz9odG1sOmh0bWwuaHRtbDtcXG4gICAgcmV0dXJuICQudG9TdHJpbmcoKHBhclN0cixlaixvbmx5YmFjayxodG1sLGlzUGljKT0+e1xcbiAgICAgICAgbGV0IHQ9cGFyU3RyLnNwbGl0KFxcXCI7XFxcIik7XFxuICAgICAgICBsZXQgZD1bXTtcXG4gICAgICAgIC8vIGxldCBsaXN0PXBkZmEoZ2V0UmVzQ29kZSgpLHRbMF0pO1xcbiAgICAgICAgbGV0IGxpc3Q9cGRmYShodG1sLHRbMF0pO1xcbiAgICAgICAgbGV0IGxhenkgPSAkKCcnKS5sYXp5UnVsZSgoKT0+e1xcbiAgICAgICAgICAgIGNvbnN0IHtsYXp5UGFyc2V9ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZ2xvYmFsUGFyc2U/cnVsZT3pgZPplb/ku5PlupNQcm8nKTtcXG4gICAgICAgICAgICByZXR1cm4gbGF6eVBhcnNlKGlucHV0KVxcbiAgICAgICAgfSk7XFxuICAgICAgICBmb3IobGV0IGkgaW4gbGlzdCl7XFxuICAgICAgICAgICAgbGV0IF9waWMgPSB0WzJdP3BkKGxpc3RbaV0sdFsyXSk6Jyc7XFxuICAgICAgICAgICAgaWYoaXNQaWMoX3BpYykmJiEvQFJlZmVyZXI9Ly50ZXN0KF9waWMpKXtcXG4gICAgICAgICAgICAgICAgX3BpYys9J0BSZWZlcmVyPSdcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGl0PXtcXG4gICAgICAgICAgICAgICAgdGl0bGU6cGRmaChsaXN0W2ldLHRbMV0pLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOl9waWMsXFxuICAgICAgICAgICAgICAgIGRlc2M6cGRmaChsaXN0W2ldLHRbM10pLFxcbiAgICAgICAgICAgICAgICB1cmw6ZWo/cGQobGlzdFtpXSx0WzRdKTpwZChsaXN0W2ldLHRbNF0pK2xhenlcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIGlmKHQubGVuZ3RoPjUpey8v5YaF5a6577yM55So5LqO5pCc57SiXFxuICAgICAgICAgICAgICAgIGl0LmNvbnRlbnQ9cGRmaChsaXN0W2ldLHRbNV0pXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGQucHVzaChpdCk7XFxuICAgICAgICB9XFxuICAgICAgICBpZihvbmx5YmFjayl7XFxuICAgICAgICAgICAgcmV0dXJuIGRcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHNldFJlc3VsdChkKVxcbiAgICAgICAgfVxcbiAgICB9LHBhclN0cixlaixvbmx5YmFjayxodG1sLGlzUGljKVxcbn1cXG5cXG5mdW5jdGlvbiBpc0JhZFZpZGVvKHZpZGVvVXJsKSB7Ly/mmK/lnY/nmoTop4bpopFcXG4gICAgbGV0IGRtUGF0aCA9ICdoaWtlcjovL2ZpbGVzL2NhY2hlL2RpYW9tYW8udHh0JzsvL+WQiuavm+aooeW8j+i/h+a7pOaWh+S7tui3r+W+hFxcbiAgICBsZXQgZG1VcmxzO1xcbiAgICB0cnkge1xcbiAgICAgICAgZG1VcmxzID0gcmVxdWVzdChkbVBhdGgpLnRyaW0oKS5zcGxpdCgnXFxcXG4nKS5maWx0ZXIoaXQgPT4gaXQgJiYgIWl0LnN0YXJ0c1dpdGgoJy8vJykpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBkbVVybHMgPSBbXTtcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBoYXNEbSh2aWRlb1VybCwgZG1VcmxzKSB7Ly/mkq3mlL7lnLDlnYDmmK/lkKbkuLrlkIrmr5vop4bpopFcXG4gICAgICAgIGlmIChkbVVybHMubGVuZ3RoIDwgMSkge1xcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICAgICAgZnVuY3Rpb24gcHJpbnQoc3RyKXtcXG4gICAgICAgICAgICBpZih0eXBlb2YobG9nKSE9PSd1bmRlZmluZWQnKXtcXG4gICAgICAgICAgICAgICAgbG9nKHN0cik7XFxuICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgIGZiYS5sb2coc3RyKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBmb3IgKGxldCBkbVVybCBvZiBkbVVybHMpIHtcXG4gICAgICAgICAgICBpZiAoKG5ldyBSZWdFeHAoZG1VcmwpKS50ZXN0KHZpZGVvVXJsKSkgey8v5pKt5pS+5Zyw5Z2A5YyF5ZCr5ZCK5q+b5qCH5b+X55qE5Zyw5Z2AXFxuICAgICAgICAgICAgICAgIHByaW50KCflkIrmr5vop4bpopEs6Ieq5Yqo6L+H5rukOicrdmlkZW9VcmwpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHByaW50KCfpnZ7lkIrmr5vop4bpopEs5Y+v5pKt5pS+OicrdmlkZW9VcmwpO1xcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxuICAgIH1cXG5cXG4gICAgZnVuY3Rpb24gaXNEbShyZXQpIHtcXG4gICAgICAgIGlmICghcmV0KSB7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWVcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBoYXNEbShyZXQuc3BsaXQoJyMnKVswXS5zcGxpdCgnOycpWzBdLCBkbVVybHMpXFxuICAgIH1cXG4gICAgcmV0dXJuIGlzRG0odmlkZW9VcmwpXFxufVxcblxcbmZ1bmN0aW9uIGxhenlQYXJzZShwbGF5VXJsLG1zLHRtLHJlY2hhbmdlKXtcXG4gICAgLy8gbG9nKCfosIPnlKjku5PlupPlhY3ll4XmjqLkvKDlj4LotoXml7bkuLo6Jyttcyk7XFxuICAgIHRtID0gcGFyc2VJbnQodG0pfHw1MDAwO1xcbiAgICBjb25zdCB7aXNWaWRlbyxnZXRIZWFkZXJzLGlzQmFkVmlkZW99ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZ2xvYmFsUGFyc2U/cnVsZT3pgZPplb/ku5PlupNQcm8nKTtcXG4gICAgbGV0IHJlYWxVcmwgPSBpc1ZpZGVvKHBsYXlVcmwscmVjaGFuZ2UpO1xcbiAgICAvL2xvZyhyZWFsVXJsKTtcXG4gICAgaWYodHlwZW9mKHJlYWxVcmwpPT0nc3RyaW5nJyl7Ly9ib29s5YC85bCx5piv5aSx6LSlXFxuICAgICAgICB0cnl7XFxuICAgICAgICAgICAgbGV0IHJ1cmw9cmVhbFVybC5zcGxpdChcXFwiO1xcXCIpWzBdLnNwbGl0KFxcXCIjXFxcIilbMF07XFxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVxdWVzdChydXJsLHt0aW1lb3V0OnRtfSkpLnVybFxcbiAgICAgICAgfWNhdGNoKGUpe1xcbiAgICAgICAgICAgIHJldHVybiByZWFsVXJsXFxuICAgICAgICB9XFxuICAgICAgICAvL3JldHVybiByZWFsVXJsXFxuICAgIH1cXG5cXG4gICAgLy9sb2coXFxcIuiuv+mXrui2heaXtjpcXFwiK3RtKTtcXG4gICAgbG9nKFxcXCLlsJ3or5XpgZPplb/ku5PlupN4NeWFjeWXhTpcXFwiK3BsYXlVcmwpO1xcbiAgICBjbGVhclZhcihcXFwiX3g1anhVcmxcXFwiKTtcXG4gICAgbGV0IGJhZD0kKFxcXCLnvZHnu5zkuI3kvbPmiJbogIXnlpHkvLzlr7nmlrnnvZHnq5nmjILkuobvvIzkvaDopoHmn6XnnIvlhbbnvZHpobXlkJfvvJ9cXFwiKS5jb25maXJtKChwbGF5VXJsKT0+e1xcbiAgICAgICAgbG9nKFxcXCLnvZHnq5nnnIvotbfmnaXmjILkuoY6XFxcIitwbGF5VXJsKTtcXG4gICAgICAgIHJldHVybiBwbGF5VXJsXFxuICAgIH0scGxheVVybCk7XFxuICAgIHRyeXtcXG4gICAgICAgIHZhciBiYWNrPXJlcXVlc3QocGxheVVybCx7aGVhZGVyczogZ2V0SGVhZGVycyhwbGF5VXJsKSx0aW1lb3V0OnRtfSk7XFxuICAgICAgICAvL3ZhciBiYWNrPWZldGNoKHBsYXlVcmwse2hlYWRlcnM6IHsnVXNlci1BZ2VudCc6IFBDX1VBfX0pO1xcbiAgICAgICAgaWYoIWJhY2spe1xcbiAgICAgICAgICAgIGxvZyhcXFwi572R56uZXFxcIitwbGF5VXJsK1xcXCLnoa7lrp7llaXkuZ/msqHov5Tlm55cXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gYmFkXFxuICAgICAgICB9ZWxzZSBpZigvI0VYVElORi8udGVzdChiYWNrKSl7XFxuICAgICAgICAgICAgLy9sZXQgbGNhY2hlPVxcXCIvc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL2NhY2hlL3ZpZGVvLm0zdThcXFwiO1xcbiAgICAgICAgICAgIC8vd3JpdGVGaWxlKGxjYWNoZSxiYWNrKTtcXG4gICAgICAgICAgICAvL3JldHVybiBsY2FjaGUrXFxcIiMjXFxcIitwbGF5VXJsK1xcXCIjaXNWaWRlbz10cnVlI1xcXCJcXG4gICAgICAgICAgICBwbGF5VXJsPWNhY2hlTTN1OChwbGF5VXJsKTtcXG4gICAgICAgICAgICByZXR1cm4gcGxheVVybFxcbiAgICAgICAgfWVsc2UgaWYoKCEv6Kem5Y+R5LqG6Ziy55uX6ZO+fOacquaOiOadg3zmjqXlj6PpmLLnm5cvLnRlc3QoYmFjaykpJiYoIS9odHRwfHVybC8udGVzdChiYWNrKSkmJighL21zZ3xjb2RlfGh0bWwvLnRlc3QoYmFjaykpKXtcXG4gICAgICAgICAgICBsb2coYmFjayk7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+eWkeS8vOWvueaWueaVsOaNruWKoOWvhuS6hu+8jOWFt+S9k+aVsOaNrueci+aXpeW/lydcXG4gICAgICAgIH1cXG4gICAgfWNhdGNoKGUpe1xcbiAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxuICAgICAgICByZXR1cm4gYmFkXFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIGJhY2s9SlNPTi5wYXJzZShiYWNrKTtcXG4gICAgICAgIGxldCByZWFsVXJsPWJhY2sudXJsO1xcbiAgICAgICAgaWYodHlwZW9mKHJlYWxVcmwpPT1cXFwidW5kZWZpbmVkXFxcInx8IXJlYWxVcmwpe1xcbiAgICAgICAgICAgIGxvZyhiYWNrKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6YGT6ZW/5LuT5bqT6Kej5p6Q5aSx6LSl77yB6L+U5Zue5pKt5pS+5Zyw5Z2A5Li656m6XFxcIlxcbiAgICAgICAgfSBlbHNlIGlmKHR5cGVvZihpc1ZpZGVvKHJlYWxVcmwscmVjaGFuZ2UpKT09J3N0cmluZycpe1xcbiAgICAgICAgICAgIHJldHVybiBpc1ZpZGVvKHJlYWxVcmwscmVjaGFuZ2UpO1xcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuIHJlYWxVcmwrXFxcIiNpc1ZpZGVvPXRydWUjXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIC8vZWxzZXtcXG4gICAgICAgIC8vcmVhbFVybCs9XFxcIjt7VXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFwiO1xcbiAgICAgICAgLy8gfVxcbiAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhcXFwi5qOA5rWL5Yiw6Kej5p6Q5Y+j6Z2eanNvbumUmeivrzpcXFwiK2UubWVzc2FnZSsnLOW8gOWni3g15YWN5ZeF5o6iJyk7XFxuICAgICAgICAvLyByZXF1aXJlKCdodHRwczovL2hqZGhueC5jb2RpbmcubmV0L3AvaGlrZXIvZC9kci9naXQvcmF3L21hc3Rlci9qcy9sc2cuanMnKTsvL+W8leeUqOacrOWcsOWCqOWtmOaPkuS7tlxcbiAgICAgICAgY29uc3QgbHNnPSQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xvY2FsU3RvcmFnZT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpOy8v5byV55So5a2Q6aG16Z2i5pys5Zyw5YKo5a2Y5o+S5Lu2XFxuICAgICAgICBsZXQgbG9jYWxfbXMgPSBsc2cuZ2V0SXRlbSgndGltZW91dCcpO1xcbiAgICAgICAgbGV0IG1zID0gcGFyc2VJbnQobXMpfHxwYXJzZUludChsb2NhbF9tcyl8fDUwMDA7XFxuICAgICAgICBsZXQgbWF4X2NvdW50PU1hdGguY2VpbChtcy8yNTApO1xcbiAgICAgICAgbG9nKFxcXCLmnKzmrKHll4XmjqLotoXml7Y6XFxcIittcytcXFwi5YWx6K6h5b6F5oqT5YyFOlxcXCIrbWF4X2NvdW50K1xcXCLmrKFcXFwiKTtcXG4gICAgICAgIHNob3dMb2FkaW5nKCfll4XmjqLkuK3vvIzoi6XlpLHotKXlsLHliIfmjaJ3ZWLll4XmjqIuLi4nKTtcXG4gICAgICAgIGxldCBfeDUgPSAkLnRvU3RyaW5nKChpc1ZpZGVvLHJlY2hhbmdlLHBsYXlVcmwsbWF4X2NvdW50LFBDX1VBLGlzQmFkVmlkZW8pPT57XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgaWYodHlwZW9mKGZiYSk9PSd1bmRlZmluZWQnfHwhZmJhKXtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBmYmEgPSBmeV9icmlkZ2VfYXBwO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YocmVxdWVzdCk9PSd1bmRlZmluZWQnfHwhcmVxdWVzdCl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZhbChmYmEuZ2V0SW50ZXJuYWxKcygpKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgZmJhLnB1dFZhcihcXFwiX3g1anhVcmxcXFwiLHBsYXlVcmwpO1xcbiAgICAgICAgICAgICAgICBpZih3aW5kb3cuY291bnQgPT0gbnVsbCl7XFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuY291bnQ9MTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgdGV4dD0nJztcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIHRleHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXFwiYm9keVxcXCIpLmlubmVyVGV4dDtcXG4gICAgICAgICAgICAgICAgfWNhdGNoIChlKSB7ZmJhLmxvZyhlLm1lc3NhZ2UpfVxcbiAgICAgICAgICAgICAgICBpZigv6Kem5Y+R5LqG6Ziy55uX6ZO+fOacquaOiOadg3zmjqXlj6PpmLLnm5cvLnRlc3QodGV4dCkmJndpbmRvdy5jb3VudD09PTEpe1xcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwi5qOA5rWL5Yiw5pyJ5o6I5p2D77yM5byA5aeL6L+H5o6I5p2DXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAvL2xvY2F0aW9uLnJlbG9hZCgpO1xcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1mYmEuZ2V0VmFyKFxcXCJfeDVqeFVybFxcXCIpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHdpbmRvdy5jb3VudCsrO1xcbiAgICAgICAgICAgICAgICAvLyBmYmEubG9nKCdjb3VudDonK3dpbmRvdy5jb3VudCsnLG1heF9jb3VudDonK21heF9jb3VudCk7XFxuICAgICAgICAgICAgICAgIGlmKCB3aW5kb3cuY291bnQgPj0gbWF4X2NvdW50KXtcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcIui2hei/h1xcXCIrbWF4X2NvdW50KjI1MCtcXFwi5q+r56eS5pyq6I635Y+W5Yiw6LWE5rqQ5Zyw5Z2A77yM6Lez5Yiw5rqQ572R6aG1LOS7peS4i+aYr+WKoOi9vei/h+eahOWcsOWdgFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxcXCJib2R5XFxcIikuaW5uZXJUZXh0O1xcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2codGV4dCk7XFxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2ggKGUpIHtmYmEubG9nKGUubWVzc2FnZSl9XFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKEpTT04uc3RyaW5naWZ5KF9nZXRVcmxzKCkpKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYmEuZ2V0VmFyKFxcXCJfeDVqeFVybFxcXCIpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG11dGVNZShlbGVtKSB7XFxuICAgICAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0ucGF1c2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgdmFyIHZpZGVvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcInZpZGVvXFxcIiksIGF1ZGlvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcImF1ZGlvXFxcIiksIHYyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwiZW1iZWRcXFwiKSwgdjMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCIjcGxheWVyXFxcIik7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodmlkZW9zLCBmdW5jdGlvbiAodmlkZW8pIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRlTWUodmlkZW8pO1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwoYXVkaW9zLCBmdW5jdGlvbiAoYXVkaW8pIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRlTWUoYXVkaW8pO1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodjIsIGZ1bmN0aW9uICh2KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKHYpO1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodjMsIGZ1bmN0aW9uICh2KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKHYpO1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgICAgIHZhciB1cmxzID0gX2dldFVybHMoKTtcXG4gICAgICAgICAgICAgICAgLy8gZmJhLmxvZyhKU09OLnN0cmluZ2lmeSh1cmxzKSk7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gdXJscykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1PXVybHNbaV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5e3U9ZGVjb2RlVVJJQ29tcG9uZW50KHUpO31jYXRjaChlKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdT11bmVzY2FwZSh1KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cXG4gICAgICAgICAgICAgICAgICAgICAgICBpZigvdXJsPWh0dHAvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gdS5zcGxpdChcXFwidXJsPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmJhLmxvZyhcXFwidXJs5YiG5YmyOlxcXCIrdSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoL3VybD1cXFxcLy8udGVzdCh1KSYmL1xcXFwubTN1OC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3N0ID0gdS5tYXRjaCgvKC4qKVxcXFwvXFxcXC8oLio/KVxcXFwvLylbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBob3N0K3Uuc3BsaXQoXFxcInVybD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coXFxcInVybOWIhuWJsjpcXFwiK3UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC92aWQ9aHR0cC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSB1LnNwbGl0KFxcXCJ2aWQ9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCJ2aWTliIblibI6XFxcIit1KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZigvdmlkPVxcXFwvLy50ZXN0KHUpJiYvXFxcXC5tM3U4Ly50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvc3QgPSB1Lm1hdGNoKC8oLiopXFxcXC9cXFxcLyguKj8pXFxcXC8vKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IGhvc3QrdS5zcGxpdChcXFwidmlkPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwidmlk5YiG5YmyOlxcXCIrdSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoL1xcXFw/KC4qKT1odHRwLy50ZXN0KHUpJiYvXFxcXC5tM3U4Ly50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFxcXCJodHRwXFxcIit1LnNwbGl0KC9cXFxcPyguKik9aHR0cC8pLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwi5YW25LuW5YiG5YmyOlxcXCIrdSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vfGluZGV4XFxcXC5tM3U4JFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoL1xcXFwvMVxcXFwubTN1OC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICB1PXUucmVwbGFjZSgvJmZyb209Lip8Jm5leHQ9Lip8Jmp1bXA9LiovLCcnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhbFVybCA9IGlzVmlkZW8odSxyZWNoYW5nZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mKHJlYWxVcmwpPT0nc3RyaW5nJyYmIWlzQmFkVmlkZW8odSkpey8v6L+H5ruk5ZCK5q+b6KeG6aKRXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZnlfYnJpZGdlX2FwcC5zZXRXZWJVYShQQ19VQSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZihmYmEuZ2V0SGVhZGVyVXJsKSE9PSd1bmRlZmluZWQnJiZ0eXBlb2YocmVjaGFuZ2UpIT09J2Z1bmN0aW9uJyl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYmFja1VybCA9IGZiYS5nZXRIZWFkZXJVcmwodS5yZXBsYWNlKFxcXCI7e1xcXCIsXFxcIiNpc1ZpZGVvPXRydWUjO3tcXFwiKSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmFja1VybCA9IGZiYS5nZXRIZWFkZXJVcmwodXJsc1tpXSkucmVwbGFjZSgnO3snLCcjaWdub3JlSW1nPXRydWUjI2lzVmlkZW89dHJ1ZSM7eycpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHUxID0gYmFja1VybC5zcGxpdCgnI2lnbm9yZUltZycpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHUyID0gJyNpZ25vcmVJbWcnK2JhY2tVcmwuc3BsaXQoJyNpZ25vcmVJbWcnKVsxXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxID0gdTEucmVwbGFjZSgvJmZyb209Lip8Jm5leHQ9Lip8Jmp1bXA9LiovLCcnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKC91cmw9aHR0cC8udGVzdCh1MSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxID0gdTEuc3BsaXQoXFxcInVybD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZigvdXJsPVxcXFwvLy50ZXN0KHUxKSYmL1xcXFwubTN1OC8udGVzdCh1MSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3N0MSA9IHUxLm1hdGNoKC8oLiopXFxcXC9cXFxcLyguKj8pXFxcXC8vKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IGhvc3QxK3UxLnNwbGl0KFxcXCJ1cmw9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coXFxcInVybOWIhuWJsjpcXFwiK3UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigvdmlkPWh0dHAvLnRlc3QodTEpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IHUxLnNwbGl0KFxcXCJ2aWQ9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoL3ZpZD1cXFxcLy8udGVzdCh1MSkmJi9cXFxcLm0zdTgvLnRlc3QodTEpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdDEgPSB1MS5tYXRjaCgvKC4qKVxcXFwvXFxcXC8oLio/KVxcXFwvLylbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEgPSBob3N0MSt1MS5zcGxpdChcXFwidmlkPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoL1xcXFw/KC4qKT1odHRwLy50ZXN0KHUxKSYmL1xcXFwubTN1OC8udGVzdCh1MSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxID0gXFxcImh0dHBcXFwiK3UxLnNwbGl0KC9cXFxcPyguKik9aHR0cC8pLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tVcmwgPSB1MSArIHUyO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmJhLmxvZygn6L+U5Zue6Ieq5Yqo5YqgY29va2ll6ZO+5o6lOicrYmFja1VybCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKCfov5Tlm57pk77mjqU6Jyt1Kyflubboh6rliqjliqDkuoZjb29raWUs5YW35L2TY29va2ll5Zyo6KeG6aKR5pKt5pS+5aSE5p+l55yLJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFja1VybDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNle1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwi6L+U5Zue5LuT5bqTeDXlhY3ll4Xnu5Pmnpw6XFxcIityZWFsVXJsKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsVXJsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgLy8gZnlfYnJpZGdlX2FwcC5sb2coJ3g15aSn6IyD5Zu06ZSZ6K+vOicrZS5tZXNzYWdlKTtcXG4gICAgICAgICAgICAgICAgYWxlcnQoJ3g15aSn6IyD5Zu06ZSZ6K+vOicrZS5tZXNzYWdlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+aKpemUmee7k+adn3g1J1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0saXNWaWRlbyxyZWNoYW5nZSxwbGF5VXJsLG1heF9jb3VudCxQQ19VQSxpc0JhZFZpZGVvKTtcXG4gICAgICAgIGxldCB1c2VXZWI9bHNnLmdldEl0ZW0oXFxcIumAmuWFjVxcXCIsXFxcIlg1XFxcIik9PT1cXFwiV0VCXFxcIjtcXG4gICAgICAgIC8vbG9nKFxcXCLku5PlupPkvb/nlKh3ZWLpgJrlhY3mm7/ku6N4NTpcXFwiK3VzZVdlYik7XFxuICAgICAgICBsZXQgcnVsZUhlYWQ9dXNlV2ViJiZwYXJzZUludChnZXRBcHBWZXJzaW9uKCkpPj0yMzM5P1xcXCJ3ZWJSdWxlOi8vXFxcIjpcXFwieDVSdWxlOi8vXFxcIjtcXG4gICAgICAgIGxldCB4NVVybCA9IHJ1bGVIZWFkK3BsYXlVcmwrICdAJyArX3g1O1xcbiAgICAgICAgcmV0dXJuIHg1VXJsXFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24geDVQYXJzZVBybyh4NWxpc3QseDVUaW1lb3V0LGlzVmlkZW8pe1xcbiAgICBsZXQgYnBhdGggPSAnZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvcnVsZXMvZHpIb3VzZS9odG1sL+a1t+mYlOWXheaOouWZqC5odG1sJztcXG4gICAgbGV0IGJjb2RlID0gZmV0Y2goYnBhdGgpO1xcbiAgICBpZighYmNvZGV8fCEvZnlfYnJpZGdlX2FwcC8udGVzdChiY29kZSkpe1xcbiAgICAgICAgbG9nKCfmnKzlnLDmnKrlronoo4Xll4XmjqLlmajvvIzlvIDlp4vlronoo4UnKTtcXG4gICAgICAgIGNvbnN0IHthcGl9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgICAgICBsZXQgaHRtbCA9IGZldGNoKGFwaS5ob3N0KycvcnVsZWxpc3QuanNvbj9pZD0yMDU1Jyk7XFxuICAgICAgICBpZigv5rW36ZiU6KeG55WMLy50ZXN0KGh0bWwpKXtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoYnBhdGgsaHRtbCk7XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoYnBhdGgsZmV0Y2goJ2h0dHBzOi8vaGpkaG54LmNvZGluZy5uZXQvcC9oaWtlci9kL2RyL2dpdC9yYXcvbWFzdGVyL2h0bWwvZ2V0VmlkZW8uaHRtbCcpKVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHg1VGltZW91dCA9IHBhcnNlSW50KHg1VGltZW91dCl8fDUwMDA7XFxuICAgIGxldCBtYXhfY291bnQ9KHg1VGltZW91dC8yNTApOyAvL+agueaNrui2heaXtuiHquWKqOiuoeeul+S6huWPr+aJp+ihjOeahOasoeaVsFxcbiAgICBwdXRWYXIoJ3g1TGlzdCcsSlNPTi5zdHJpbmdpZnkoeDVsaXN0KSk7XFxuICAgIGxldCBfeDUgPSAkLnRvU3RyaW5nKChpc1ZpZGVvLCBtYXhfY291bnQseDVUaW1lb3V0LGlzQmFkVmlkZW8pID0+IHtcXG4gICAgICAgIC8v5Yid5aeL5YyWZmJh5ZKMcmVxdXN0XFxuICAgICAgICBpZiAodHlwZW9mIChmYmEpID09ICd1bmRlZmluZWQnIHx8ICFmYmEpIHtcXG4gICAgICAgICAgICB2YXIgZmJhID0gZnlfYnJpZGdlX2FwcDtcXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgaWYgKHR5cGVvZiAocmVxdWVzdCkgPT0gJ3VuZGVmaW5lZCcgfHwgIXJlcXVlc3QpIHtcXG4gICAgICAgICAgICAgICAgZXZhbChmYmEuZ2V0SW50ZXJuYWxKcygpKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgfVxcbiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgaWYgKHdpbmRvdy5jb3VudCA9PSBudWxsKSB7XFxuICAgICAgICAgICAgICAgIHdpbmRvdy5jb3VudCA9IDE7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCB0ZXh0PScnO1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIHRleHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXFwiYm9keVxcXCIpLmlubmVyVGV4dDtcXG4gICAgICAgICAgICB9Y2F0Y2ggKGUpIHtmYmEubG9nKGUubWVzc2FnZSl9XFxuICAgICAgICAgICAgaWYoL+inpuWPkeS6humYsuebl+mTvnzmnKrmjojmnYN85o6l5Y+j6Ziy55uXLy50ZXN0KHRleHQpJiZ3aW5kb3cuY291bnQ9PTEpe1xcbiAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcXG4gICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwi5qOA5rWL5Yiw5pyJ5o6I5p2D77yM5byA5aeL6L+H5o6I5p2DXFxcIik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHdpbmRvdy5jb3VudCsrO1xcbiAgICAgICAgICAgIC8vIGZiYS5sb2coJ2NvdW50OicgKyB3aW5kb3cuY291bnQgKyAnLG1heF9jb3VudDonICsgbWF4X2NvdW50KTtcXG4gICAgICAgICAgICBpZiAod2luZG93LmNvdW50ID49IG1heF9jb3VudCkge1xcbiAgICAgICAgICAgICAgICBmYmEuY2xlYXJWYXIoJ3g1TGlzdCcpO1xcbiAgICAgICAgICAgICAgICBmYmEuaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICAgICAgbGV0IGZtc2cgPSAn6YGT6ZW/5LuT5bqT6YCa5YWN6Kej5p6Q5aSx6LSlLOWOn+WboDrotoXml7YnK3g1VGltZW91dCsn5q+r56eSJztcXG4gICAgICAgICAgICAgICAgZmJhLmxvZyhmbXNnKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrZm1zZztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSk7XFxuICAgICAgICB9XFxuXFxuICAgICAgICBmdW5jdGlvbiBtdXRlTWUoZWxlbSkge1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGVsZW0ucGF1c2UoKTtcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcblxcbiAgICAgICAgdmFyIHZpZGVvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcInZpZGVvXFxcIiksIGF1ZGlvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcImF1ZGlvXFxcIiksXFxuICAgICAgICAgICAgdjIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCJlbWJlZFxcXCIpLCB2MyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcIiNwbGF5ZXJcXFwiKTtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHZpZGVvcywgZnVuY3Rpb24gKHZpZGVvKSB7XFxuICAgICAgICAgICAgICAgIG11dGVNZSh2aWRlbyk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB9XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbChhdWRpb3MsIGZ1bmN0aW9uIChhdWRpbykge1xcbiAgICAgICAgICAgICAgICBtdXRlTWUoYXVkaW8pO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodjIsIGZ1bmN0aW9uICh2KSB7XFxuICAgICAgICAgICAgICAgIG11dGVNZSh2KTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHYzLCBmdW5jdGlvbiAodikge1xcbiAgICAgICAgICAgICAgICBtdXRlTWUodik7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB9XFxuICAgICAgICB2YXIgdXJscyA9IF9nZXRVcmxzKCk7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgaW4gdXJscykge1xcbiAgICAgICAgICAgICAgICBsZXQgdT11cmxzW2ldO1xcbiAgICAgICAgICAgICAgICAvL3U9ZGVjb2RlVVJJQ29tcG9uZW50KHUpO1xcbiAgICAgICAgICAgICAgICB0cnl7dT1kZWNvZGVVUklDb21wb25lbnQodSk7fWNhdGNoKGUpe1xcbiAgICAgICAgICAgICAgICAgICAgdT11bmVzY2FwZSh1KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZigvdXJsPWh0dHAvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgdSA9IHUuc3BsaXQoXFxcInVybD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKC92aWQ9aHR0cC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICB1ID0gdS5zcGxpdChcXFwidmlkPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoL1xcXFw/KC4qKT1odHRwLy50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgIHUgPSBcXFwiaHR0cFxcXCIrdS5zcGxpdCgvXFxcXD8oLiopPWh0dHAvKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAvL2ZiYS5sb2coXFxcIuWFtuS7luWIhuWJsjpcXFwiK3UpO1xcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZigvXFxcXC8xXFxcXC5tM3U4JC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB1PXUucmVwbGFjZSgvJmZyb209Lip8Jm5leHQ9Lip8Jmp1bXA9LiovLCcnKTtcXG4gICAgICAgICAgICAgICAgbGV0IHJlYWxVcmwgPSBpc1ZpZGVvKHUpO1xcbiAgICAgICAgICAgICAgICBpZiAocmVhbFVybCYmIWlzQmFkVmlkZW8odSkpIHsvL+i/h+a7pOWQiuavm1xcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwi5LuT5bqTeDXlhY3ll4Xnu5Pmnpw6XFxcIiArIHJlYWxVcmwpO1xcbiAgICAgICAgICAgICAgICAgICAgZmJhLmNsZWFyVmFyKCd4NUxpc3QnKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsVXJsXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpXFxuICAgICAgICB9XFxuICAgIH0sIGlzVmlkZW8sIG1heF9jb3VudCx4NVRpbWVvdXQsaXNCYWRWaWRlbyk7XFxuICAgIGNvbnN0IGxzZz0kLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9sb2NhbFN0b3JhZ2U/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgbGV0IHVzZVdlYj1sc2cuZ2V0SXRlbShcXFwi6YCa5YWNXFxcIixcXFwiWDVcXFwiKT09PVxcXCJXRUJcXFwiO1xcbiAgICAvL2xvZyhcXFwi5LuT5bqT5L2/55Sod2Vi6YCa5YWN5pu/5LujeDU6XFxcIit1c2VXZWIpO1xcbiAgICBsZXQgcnVsZUhlYWQ9dXNlV2ViJiZwYXJzZUludChnZXRBcHBWZXJzaW9uKCkpPj0yMzM5P1xcXCJ3ZWJSdWxlOi8vXFxcIjpcXFwieDVSdWxlOi8vXFxcIjtcXG4gICAgcmV0dXJuIHJ1bGVIZWFkK2JwYXRoKydAJyArIF94NTtcXG59XFxuXFxuZnVuY3Rpb24gTGF6eVBhcnNlRmFzdChwbGF5VXJsTGlzdCxnZXRUaW1lb3V0LHg1VGltZW91dCl7XFxuICAgIGNvbnN0IHtpc1ZpZGVvLGdldEhlYWRlcnMseDVQYXJzZVByb30gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9nbG9iYWxQYXJzZT9ydWxlPemBk+mVv+S7k+W6k1BybycpO1xcbiAgICAvLyBsb2coJ+W8gOWni+aJp+ihjCcrcGxheVVybExpc3QubGVuZ3RoKyfkuKrlnLDlnYDnmoTmibnph4/ll4XmjqI6JytwbGF5VXJsTGlzdCk7XFxuICAgIGxvZygn5byA5aeL5omn6KGMJytwbGF5VXJsTGlzdC5sZW5ndGgrJ+S4quWcsOWdgOeahOaJuemHj+WXheaOoicpO1xcbiAgICBsZXQgcGxheVVybHMgPSBwbGF5VXJsTGlzdC5tYXAoKGl0KT0+e1xcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICB1cmw6aXQuc3BsaXQoXFxcIjtcXFwiKVswXSxcXG4gICAgICAgICAgICBvcHRpb25zOiB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIC8vXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwiRGFydC8yLjEzIChkYXJ0OmlvKVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6XFxcIk1vemlsbGEvNS4wXFxcIlxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiBnZXRUaW1lb3V0XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgbGV0IGJodG1sID0gYmF0Y2hGZXRjaChwbGF5VXJscyk7XFxuICAgIGxldCB2aWRlb3MgPSBbXTtcXG4gICAgbGV0IHg1bGlzdCA9IFtdO1xcbiAgICBmb3IobGV0IGkgaW4gYmh0bWwpe1xcbiAgICAgICAgbGV0IG9yZGVyID0gcGFyc2VJbnQoaSkrMTtcXG4gICAgICAgIGxldCB0bmFtZT1vcmRlcisn5Y+36Kej5p6Q572R5Z2AOic7XFxuICAgICAgICAvL2xvZyh0bmFtZSk7XFxuICAgICAgICBsZXQgdHVybD1wbGF5VXJsTGlzdFtpXS5zcGxpdChcXFwiO1xcXCIpWzBdO1xcbiAgICAgICAgbGV0IGpuYW1lPXBsYXlVcmxMaXN0W2ldLnNwbGl0KFxcXCI7XFxcIikubGVuZ3RoPjE/cGxheVVybExpc3RbaV0uc3BsaXQoXFxcIjtcXFwiKVsxXTpcXFwiXFxcIjtcXG4gICAgICAgIHRuYW1lKz1qbmFtZTtcXG4gICAgICAgIGxldCBiYWNrY29kZSA9IGJodG1sW2ldO1xcbiAgICAgICAgaWYoKCEvdXJsfGh0dHAvLnRlc3QoYmFja2NvZGUpKSYmKCEvI0VYVElORi8udGVzdChiYWNrY29kZSkpKXtcXG4gICAgICAgICAgICBsb2codG5hbWUrdHVybCsn5pyJ6Zeu6aKYLOWPr+iDveWKoOWvhuaIluiAheaMguS6hicpO1xcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgfWVsc2UgaWYoLyNFWFRJTkYvLnRlc3QoYmFja2NvZGUpKXtcXG4gICAgICAgICAgICAvL2xldCBsY2FjaGU9XFxcIi9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvY2FjaGUvdmlkZW9fXFxcIit0bmFtZStcXFwiLm0zdThcXFwiO1xcbiAgICAgICAgICAgIC8vd3JpdGVGaWxlKGxjYWNoZSxiYWNrY29kZSk7XFxuICAgICAgICAgICAgLy92aWRlb3MucHVzaChsY2FjaGUpO1xcbiAgICAgICAgICAgIGxldCBwVXJsPWNhY2hlTTN1OCh0dXJsKTtcXG4gICAgICAgICAgICB2aWRlb3MucHVzaChwVXJsKTtcXG4gICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IEpTT04ucGFyc2UoYmFja2NvZGUpLnVybDtcXG4gICAgICAgICAgICBpZigvXmh0dHAvLnRlc3QodXJsKSl7XFxuICAgICAgICAgICAgICAgIGxldCByZWFsVmlkZW8gPSBpc1ZpZGVvKHVybCk7XFxuICAgICAgICAgICAgICAgIGlmKHR5cGVvZihyZWFsVmlkZW8pPT0nc3RyaW5nJyl7XFxuICAgICAgICAgICAgICAgICAgICBsb2codG5hbWUrJ+W3suino+aekOWHuuinhumikTonK3JlYWxWaWRlbyk7XFxuICAgICAgICAgICAgICAgICAgICBpZihqbmFtZSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFZpZGVvKz1cXFwi4piFXFxcIitqbmFtZVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgdmlkZW9zLnB1c2gocmVhbFZpZGVvKTtcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICBsb2codG5hbWUrJ+ino+aekOWHuuS4jeefpemBk+S7gOS5iOS4nOilvzonK3VybCk7XFxuICAgICAgICAgICAgICAgICAgICB1cmwrPVxcXCIjaXNWaWRlbz10cnVlI1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICBpZihqbmFtZSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsKz1cXFwi4piFXFxcIitqbmFtZVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgdmlkZW9zLnB1c2godXJsKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICBsb2codG5hbWUrJ+S4umpzb27mjqXlj6PkuJTml6Dov5Tlm57op4bpopHlnLDlnYDmlbDmja46JytwbGF5VXJsTGlzdFtpXSsnXFxcXG4nK2JhY2tjb2RlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2codG5hbWUrJ+S4ung15o6l5Y+jLOWKoOWFpXg15ZeF5o6i5YiX6KGoJyk7XFxuICAgICAgICAgICAgeDVsaXN0LnB1c2gocGxheVVybExpc3RbaV0pO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIC8vIGxvZyh2aWRlb3MpO1xcbiAgICBpZih2aWRlb3MubGVuZ3RoPjApe1xcbiAgICAgICAgaWYoZ2V0VmFyKCdkcC5jYWNoZVZpZGVvJywndHJ1ZScpPT09J3RydWUnJiZwYXJzZUludChnZXRBcHBWZXJzaW9uKCkpPj0yMjU1KVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIGxvZyhcXFwi5bCK5pWs55qE6a2U5pat55So5oi377yM6KeG6aKR57yT5a2Y5bey5ZCv55So77yM6K+35bC95oOF5Lqr5Y+X55yL5Ymn5pe25YWJXFxcIik7XFxuICAgICAgICAgICAgbGV0IHZpZGVvc0NhY2hlPXZpZGVvcy5tYXAoKGl0KT0+e1xcbiAgICAgICAgICAgICAgICBsZXQgaGVhZGVycz17fTtcXG4gICAgICAgICAgICAgICAgaWYoaXQuc3BsaXQoXFxcIjtcXFwiKS5sZW5ndGg+MSl7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgaGVhZCA9IGl0LnNwbGl0KCc7JylbMV07XFxuICAgICAgICAgICAgICAgICAgICBpZigvQC8udGVzdChoZWFkKSYmL3t8fS8udGVzdChoZWFkKSl7XFxuLy9oZWFkID0gaGVhZC5yZXBsYWNlKC97fH0vZywnJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCA9IGhlYWQuc3BsaXQoXFxcIntcXFwiKVsxXS5zcGxpdChcXFwifVxcXCIpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQgPSBoZWFkLnNwbGl0KCcmJicpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiBoZWFkKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IGhlYWRbaV0uc3BsaXQoJ0AnKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID1oZWFkW2ldLnNwbGl0KCdAJylbMV0ucmVwbGFjZSgvOy8sJzsnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1trZXldID0gdmFsdWU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgICAgICB1cmw6aXQuc3BsaXQoXFxcIjtcXFwiKVswXS5zcGxpdChcXFwi4piFXFxcIilbMF0sXFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOntcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOmhlYWRlcnNcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHZhciBkYXRhPWJhdGNoQ2FjaGVNM3U4KHZpZGVvc0NhY2hlKTtcXG4gICAgICAgICAgICBkYXRhPWRhdGEubWFwKChpdCxpZCk9PntcXG4gICAgICAgICAgICAgICAgbGV0IGV4dHJhPVxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICBpZih2aWRlb3NbaWRdLnNwbGl0KFxcXCI7XFxcIikubGVuZ3RoPjEpe1xcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE9XFxcIjtcXFwiK3ZpZGVvc1tpZF0uc3BsaXQoXFxcIjtcXFwiKVsxXTtcXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYodmlkZW9zW2lkXS5zcGxpdChcXFwi4piFXFxcIikubGVuZ3RoPjEpe1xcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE9XFxcIuKYhVxcXCIrdmlkZW9zW2lkXS5zcGxpdChcXFwi4piFXFxcIilbMV07XFxuICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgICAgaWYoaXQrXFxcIlxcXCIhPVxcXCJudWxsXFxcIil7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQrZXh0cmFcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlkZW9zW2lkXVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgLy9sb2coZGF0YSk7XFxuICAgICAgICAgICAgcmV0dXJuIGRhdGFcXG4gICAgICAgICAgICAvL3JldHVybiB2aWRlb3NcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiB2aWRlb3NcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBsb2coJ+WFseaciScreDVsaXN0Lmxlbmd0aCsn5LiqeDXlnLDlnYDov5vooYzova7mtYHll4XmjqInKTtcXG4gICAgLy/msqHmnInnmoTor53lsLHlvIDlp4vkvp3mrKF4NeWXheaOolxcbiAgICBzaG93TG9hZGluZygn5ZeF5o6i5Lit77yM6Iul5aSx6LSl5bCx5YiH5o2id2Vi5ZeF5o6iLi4uJyk7XFxuICAgIHJldHVybiB4NVBhcnNlUHJvKHg1bGlzdCx4NVRpbWVvdXQsaXNWaWRlbyk7XFxufVxcbnZhciBsYXp5PSQoJycpLmxhenlSdWxlKCgpPT57XFxuICAgIHRyeXtcXG4gICAgICAgIHJlYWxVcmw9aW5wdXQ7XFxuICAgICAgICBldmFsKFxcXCJ2YXIgY29uZmlnX2RwID1cXFwiICsgZmV0Y2goXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvTXlQYXJzZVNldC5qc29uXFxcIikpO1xcbiAgICAgICAgZXZhbChmZXRjaChjb25maWdfZHAuY2opKTtcXG4gICAgICAgIGxvZyhpbnB1dCsnLT7mraPlnKjmlq3mj5LprZTmlLnniYjop6PmnpAuLi4nKTtcXG4gICAgICAgIC8vIOWKoOWFpei2heaXtuiuvue9ru+8jOW7uuiuruWcqOmmlumhteiuvue9rlxcbiAgICAgICAgcmV0dXJuIGF5dG1QYXJzZShyZWFsVXJsKVxcbiAgICB9Y2F0Y2goZSl7XFxuICAgICAgICByZXR1cm4gaW5wdXRcXG4gICAgfVxcbn0pO1xcbiQuZXhwb3J0cy5pc1BpYz1pc1BpYztcXG4kLmV4cG9ydHMuaXNWaWRlbz1pc1ZpZGVvO1xcbiQuZXhwb3J0cy5pc0JhZFZpZGVvPWlzQmFkVmlkZW87XFxuJC5leHBvcnRzLmNvbVBhcnNlPWNvbVBhcnNlO1xcbiQuZXhwb3J0cy5nZXRIZWFkZXJzPWdldEhlYWRlcnM7XFxuJC5leHBvcnRzLmxhenlQYXJzZT1sYXp5UGFyc2U7XFxuJC5leHBvcnRzLng1UGFyc2VQcm89eDVQYXJzZVBybztcXG4kLmV4cG9ydHMuTGF6eVBhcnNlRmFzdD1MYXp5UGFyc2VGYXN0O1xcbiQuZXhwb3J0cy5sYXp5PWxhenk7XCJ9LHtcIm5hbWVcIjpcIuS7u+WKoeS7k+W6k+aOpeWPo1wiLFwicGF0aFwiOlwidGFza0NhbGxcIixcInJ1bGVcIjpcImpzOlxcblN0cmluZy5wcm90b3R5cGUuc3RyaXAgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnJlcGxhY2UoLyheXFxcXHMqKXwoXFxcXHMqJCkvZywgXFxcIlxcXCIpOyB9O1xcbmZ1bmN0aW9uIHRhc2tfcmVxKHRhc2tfYXBpLHRhc2spIHsgLy8g6YCa55So5Y+R6YCB5LuT5bqTcG9zdOiwg+eUqOS7u+WKoeivt+axglxcbiAgICBjb25zdCB7Z2V0RmlsZX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgbGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcbiAgICBpZighaG91c2VGaWxlKXtcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcbiAgICB9XFxuICAgIGxldCBob3VzZV9kYXRhID0gaG91c2VGaWxlKCk7XFxuICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KHRhc2tfYXBpLCB7XFxuICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcbiAgICAgICAgfSxcXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICBcXFwicGFyYW1zXFxcIjoge1xcbiAgICAgICAgICAgICAgICBcXFwiZGF0YVxcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJ0eXBlXFxcIjogdGFzay5tb2RlfHwncnVuJyxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJmdW5jXFxcIjogdGFzay5mdW5jfHwnJyxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB0YXNrLnBhcmFtc3x8W11cXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgXFxcImF1dGhcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwibmFtZVxcXCI6IGhvdXNlX2RhdGEudXNlcm5hbWV8fFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogaG91c2VfZGF0YS5wYXNzd29yZHx8XFxcIlxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pLFxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgfSk7XFxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbn1cXG5cXG5mdW5jdGlvbiB0YXNrX3VwbG9hZCh0YXNrKXsgLy8g6YCa55So5Lu75Yqh5Y+R5biD5paw5aKe5Y+K5L+u5pS55Yqf6IO9XFxuICAgIGNvbnN0IHthcGksZ2V0RmlsZX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgbGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcbiAgICBpZighaG91c2VGaWxlKXtcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcbiAgICB9XFxuICAgIGxldCBhcGlfdXJsID0gYXBpLmhvc3QrJy9oaWtlcnVsZS90YXNrL2FkZCc7XFxuICAgIGxldCBob3VzZV9kYXRhID0gaG91c2VGaWxlKCk7XFxuICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGFwaV91cmwsIHtcXG4gICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICB9LFxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgIFxcXCJkYXRhXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIm5hbWVcXFwiOiB0YXNrLm5hbWUsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicHljb2RlXFxcIjogdGFzay5weWNvZGUsXFxuICAgICAgICAgICAgICAgICAgICBcXFwibm90ZVxcXCI6IHRhc2subm90ZSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJ0ZXN0X2NvZGVcXFwiOiB0YXNrLnRlc3RfY29kZSxcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgXFxcImF1dGhcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwibmFtZVxcXCI6IGhvdXNlX2RhdGEudXNlcm5hbWV8fFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogaG91c2VfZGF0YS5wYXNzd29yZHx8XFxcIlxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pLFxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgfSk7XFxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbn1cXG5cXG5mdW5jdGlvbiB0YXNrX2NhbGwoaWQsZnVuYyxwYXJhbXMpe1xcbiAgICBjb25zdCB7YXBpfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICBsZXQgdGFza19hcGkgPSBhcGkuaG9zdCsnL2hpa2VydWxlL3Rhc2svcnVuLycraWQ7XFxuICAgIGxldCB0YXNrID0ge1xcbiAgICAgICAgbW9kZTonY2FsbCcsXFxuICAgICAgICBmdW5jOmZ1bmMsXFxuICAgICAgICBwYXJhbXM6cGFyYW1zfHxbXVxcbiAgICB9O1xcbiAgICByZXR1cm4gdGFza19yZXEodGFza19hcGksdGFzayk7XFxufVxcblxcbmZ1bmN0aW9uIHRhc2tfcmVuYW1lKGlkLG5ld190YXNrX25hbWUpe1xcbiAgICBjb25zdCB7YXBpLGdldEZpbGV9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIGxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXG4gICAgaWYoIWhvdXNlRmlsZSl7XFxuICAgICAgICBzZXRJdGVtKCdpc19ob3VzZV92aXAnLCAnZmFsc2UnKTtcXG4gICAgfVxcbiAgICBsZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcbiAgICBsZXQgdGFza19hcGkgPSBhcGkuaG9zdCsnL2hpa2VydWxlL3Rhc2svcmVuYW1lLycraWQ7XFxuICAgIHRhc2tfYXBpID0gdGFza19hcGkrJz9uYW1lPScraG91c2VfZGF0YS51c2VybmFtZSsnJnBhc3N3b3JkPScraG91c2VfZGF0YS5wYXNzd29yZCsnJnRhc2tfbmFtZT0nK25ld190YXNrX25hbWU7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gSlNPTi5wYXJzZShmZXRjaCh0YXNrX2FwaSx7fSkpO1xcbiAgICAgICAgaWYocmVzdWx0LnN0YXR1cz09MCl7XFxuICAgICAgICAgICAgcmV0dXJuICByZXN1bHQuZGV0YWlsXFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCsnJytyZXN1bHQuZGV0YWlsXFxuICAgICAgICB9XFxuICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxuICAgICAgICByZXR1cm4gJycrZS5tZXNzYWdlXFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gdGFza19jaGFuZ2Vfc3RhdGUoaWQpe1xcbiAgICBjb25zdCB7YXBpLGdldEZpbGV9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIGxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXG4gICAgaWYoIWhvdXNlRmlsZSl7XFxuICAgICAgICBzZXRJdGVtKCdpc19ob3VzZV92aXAnLCAnZmFsc2UnKTtcXG4gICAgfVxcbiAgICBsZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcbiAgICBsZXQgdGFza19hcGkgPSBhcGkuaG9zdCsnL2hpa2VydWxlL3Rhc2svY2hhbmdlX3N0YXRlLycraWQ7XFxuICAgIHRhc2tfYXBpID0gdGFza19hcGkrJz9uYW1lPScraG91c2VfZGF0YS51c2VybmFtZSsnJnBhc3N3b3JkPScraG91c2VfZGF0YS5wYXNzd29yZDtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKGZldGNoKHRhc2tfYXBpLHt9KSk7XFxuICAgICAgICBpZihyZXN1bHQuc3RhdHVzPT0wKXtcXG4gICAgICAgICAgICByZXR1cm4gIHJlc3VsdC5kZXRhaWxcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0KycnK3Jlc3VsdC5kZXRhaWxcXG4gICAgICAgIH1cXG4gICAgfWNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS5tZXNzYWdlKTtcXG4gICAgICAgIHJldHVybiAnJytlLm1lc3NhZ2VcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiB0YXNrX3J1bihpZCl7XFxuICAgIGNvbnN0IHthcGl9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIGxldCB0YXNrX2FwaSA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9ydW4vJytpZDtcXG4gICAgbGV0IHRhc2sgPSB7fTtcXG4gICAgcmV0dXJuIHRhc2tfcmVxKHRhc2tfYXBpLHRhc2spO1xcbn1cXG5cXG4kLmV4cG9ydHMudGFza0NhbGwgPSB0YXNrX2NhbGw7XFxuJC5leHBvcnRzLnRhc2tSdW4gPSB0YXNrX3J1bjtcXG4kLmV4cG9ydHMudGFza1JlcSA9IHRhc2tfcmVxO1xcbiQuZXhwb3J0cy50YXNrVXBsb2FkID0gdGFza191cGxvYWQ7XFxuJC5leHBvcnRzLnRhc2tSZW5hbWUgPSB0YXNrX3JlbmFtZTtcXG4kLmV4cG9ydHMudGFza0NoYW5nZVN0YXRlID0gdGFza19jaGFuZ2Vfc3RhdGU7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlhajlsYDlgqjlrZhcIixcInBhdGhcIjpcImxvY2FsU3RvcmFnZVwiLFwicnVsZVwiOlwibGV0IGxvY2FsU3RvcmFnZSA9IChmdW5jdGlvbigpIHtcXG4gICAgZXZhbFByaXZhdGVKUyhcXFwiandVS3dOVGlQR2NXU0xDWEI1WHRBWHdiNkxRYlZ5SEQrMFhKN2wwN2NlMD1cXFwiKTtcXG4gICAgLy9wYXRodG89dW5kZWZpbmVkO1xcbiAgICBldmFsUHJpdmF0ZUpTKFxcXCI0QzBZeFJZbkdDWWtnRlJYdHBsL0N6NXpMNWhoNGpDQ3p0YituZytXb2t5bVE4b1VyelM5bEE4eXhDNWFGYWRuU0VteUhLTWJyYWZsUnFYQ25OUkhEbGs2dWU4eUhUTzE2bEJQcnB3Z3M1amYwUGhyQXRvVEpJRTBaSG45bUthUTRKZDJlcnFiNEk1NWJlV0lldWdLc0RzMjExU3pJTlE1eUpnU2gxZFZ1Tnp6eFJHSmc0MEZtVHVWbVhWZk4xeGcyV0lHSEJFbWtWbkd4bU9SaFBPTkErUTVWd1BtZHA0MS9oemUzZUlzVXZobzdWQ0JnSzRyYUptUGFsSVJCQlZsQ1ZnbjhGa1dtZktxWm8rVlcrb0JjSDdocmNyc1NsQ1NqQmFuZ1QvN3N5V0h4S1loZWhVMGthTVlqbldGZzFFbTBjbU5SdG9tQ3NIejFCOHEzMk9lUUhvYXdkV3h6S09hTUhPWERCalJvakE4RS9haDBXUk95emlxUlN4bC9tOGRoQmQwZjlwaFl6LzVTVS96SkQ1MlgvOUVDMTZXVlZkcFNXMzNha1JIUnNsUHBSbFRXRjkrQXlSbVJ3MGVaT0VzMW85UU1QQVFVZkF4Yll5RkhnenR3L08yZEpScEh5VG1pQmlhYXFUY2l2eDZ2OXp5dkJ6MDR3STFBYVNDdWkrZFR1VTNsdTV4ZEV0M0FqdDZaM2lEWE9WY0VQMEVERjc0NzRQUVU2SkVadXdlOTdTY2g0Ymkxd0IxWEhaU2ZJdGRsWVlvR2VkM0xMcGJtREFJUmNpdjByQW9wOFZtUWNUdDJLM0xmaDFSRFlZMFl0dlJjSDQ5T3ZwRFJIL3hhNUZjOE1ZM0RyRm9BN3Fjb0Y0ZUNnaVZCZkJnSlI2OCtMcFFLN3RPa2c4azllYyszTlN4SlRoY2w4ZDZ5Tnd4VDlUazE3emVKZ2Q2TW95WVpJcFdRTGxGNll2Yk9kRVdoam1uQTc4d0MwaFd6K1htNmhRTVNxdEZ3K2JoRmY3Y0JHVTNhYXRQRm1kQ1kyRWRYZmgwSVlXODV3ZE95TWZpd1c3L3ZWVHA5aUUwMEkzRjA5d0dIa0dLaFZiTHVlQWtZZTd6ekpYUjd0aGFGb3I2SDdxTG1KamJSUWs5ZXZOdEJRWE5SN0RpZmlYdVFmMmx0N25PSDgwU1dtMWZESEh6am1Qc05JcHMyVFhHVCtpd1ZWNjlnL3RXaXBWUTZEOEJUeCtjQ1FwNDdubVRJclkrcU40a2gyRlloNUxsd1hkZ0l5eTFWSXVDM3gwNTNld0FJSVVtbFk5bmlFcHFZdCsxZkZQWE9DdENHdFliU2QzN3ZWUjFFT2oyazVHdS8rOUpXZzJxdndsMXR3ZWxnMUowdHhhcklpNGtUYlRydnJuRkxOOTJwb2ZwWlFVZm9XbzRjZTdIV05kYnU0SktFcmFMUVVmZGZHRVBkMVRJdWZ1dVJWYTM5ZXE5R1p5U0R1Qkw2ME1QZGxkeEt3MXpvK2ZCNVpZK1lNajNMTDJnR3REYnM5OCtBc1JWOUxKV21VbXN4OTFobUp0RlVNV0QzeG5qOEhNWldzME5QbENGVXI5NDg1S3FUcG81a1J6R2ZGK2svTmwySnpydjVjdmtxdFVuTGdLcFhFT2ovc2Uvb0R6T0FyUUtJNVROVWJ2WXdjd2NkampNU2ZqSzY4S3J3aHMrbjZTbVdaNFpkZ1JIZ0FLNU1vRmkzWG1MVjQ3UDN2U1JXdTV6eUVzTWs0eTN1dUNGaXVSUFJsdTRRNXBKdnVPZW03SDdVTGlJaENlbXY1RGdrR3RETDFjR0w0RVFoWVJCNklTelZ2c2IyRWFQOXdRRTZEVlJuTTdPK3BuU3pldDZsenAzcEZkR25ib3gxTFJmQzYwdXRYWitDakltNGlFTW10YkIyTjV6RFNoR2JlTTNYVWJKUWRDQmlzOFhJcmhoMmJpQjVoQkNWd24zWTNldHQ3R0RQVnRvaTFHUmp6K0piZ00rWVI5MjhLYmRXUzV0RmFNTTNLajNYdjZvdEl4ek1CbkRDOXVXM2QrSVh4NnZMUEowSlJ1aDN5UDdwVGxhNmMzaVI0cDluV1lEcUorWlNtcHJIRm5ET3pzTFdtRmphcGplL01xd01KZDZUazNuQVd3aWNNT1B1WXBNeXFJRjA0Zmw0bXFndHNITFNNV1JSTkhQWmpFVFE5Z1JtZURZZTZhUnRsVzAycUwyb2xERU5xTFFNdEFkb2lyTldSY1A5VkwzVGQ4SGFVTzZmU2xHTmFiTWFrSkQvMDBYQ2hPU1VPSVArN2ZNN1YwL2wxYkxXUHRFejFpN0x5Z1RWN3BkR29EbnRxU0NFbkpyQnloQkF6TFJnNVFJYzk0MzhJaEtteWZuMC8zYXdvRDFJcjc4MGV5cC9YY0k2eE5jdzZUdi9FVGZIZzBlN2lZQzBVWWNKSUU1UVVYdjBzK1lvR0lFcTVHSXpLdWI4SE5qU1RVcHN2bmtWeCtkYmUyalJuM1liOVc3SkNaNVlTNkY1TXlVVnNwak1EN05ZYytEV2pVTDJiMnNWeUFmZVlwQzhVaGFoOXR1bWF2YkJ2N2EzYTlrZ0ZicTU4bHJIeHpZN2lKUVZpZ3pxM2UxYTJCU2IwUGNXMWFKOEJEN05rTnBoS1lheVR4eWtnd2lsRVJMOGpxcUJFbmlIVmRCeERKWUxiK1h3M2FsTG1sdHVURVY2S0d0Qm50QlgreXozNlJQRE15R0lLZSszZnpjeGZuQ0RuMjBNb2RWVmtWTm96UHFNWFowRzVMNGFMVEFRYWtZS1Vqc1ZNUWpBaFFrVGxIQmVPL2FMUHg5c3hsKytqMVo1ckxnRzEyVE40WEoxZWljdnc0QVZFNThMb3JhcTBRaUUwY1M3UEgxcGJyWldyZnQ3TFlHaXlCU2hvcjcrMGppb1VoMXBkV3EycU1ZTHFlTUVldUNST1F0NTdtRnJPanlQSDQ5cXA5N2NXT3JnZWcyV3lmV1NER1FQamU1K1AweVFvQ3BEL0QzUkFNdVdtYjl3bEJ0Y3EyajhXSlB0OTFFM2tLYXd1UUl5dmQycjJVang0K0hUTnRWS2I5a01MT084NUk2NWJOR0JIKzRpclN5NWdRWWxFMjZBMmNTR0ljTEtRUmx2Sm9NbmE3TC85d3lyeTRIek9yemtyQXZMZGdzU05sWWpwSFFFUmlPSTgwc0o1ak5DQ25mdzAxM0YrQStzQWZMbXlTL0JETE5RMXFhUTNwNmg4L0pxQWZoWDVPR0hnU2lSVk9DRWp1YURCL013Wk5DdTNRTDllaGhvQWo3dU9mOFBrcjNtSWpiaGg5SGlqc2p4MTkxKzBlMkpRckZhMDFBVkpLRVZ0dVB0SWMyaC8xcFBLTXZ5ZW54alRPMk94UG5qanQrODRuSUtLaHhESi9naFB0N2l2OFBtVEowbEtLeVBSc3NsOGYvUWRIZHh1cGI2alRzSTZVS216OVk0NlBNQnVENlAzd2g4cXAzNk82b2liTkRpUWQxc0UxMHZKaDl6MUZ5c0tJZThFcU1wbk5kRW1HMlRmRUJ4UnBtUXJoS0VxZWUwcDYrYTZzUW84Y1ZsUkprS1FBWUthd2NhTkVTNVhjNmRRWTVucWVpcThzVWl6ZjFzcGZIZUhlbER1MU02QlJYdUNqRmFmWGh6OGkzbFBXZ1lxVnBmeDEzaWdWQ1JmNDdVSDY1MnlMbnNtZXBDQldneUJUV0FjT3lGMVF4OFlHdFpub2IxVE4rNnhFd3pwY1dWeTdRTzlQOTJzS0E5U0srL05Ic3FmMTNDT3QwSkhDdFRWMU9sVFFXK0pBS3l4ZTFIbDcrczk1ejNLQ2dGS1FTKzNBczFKVjdOYStnK0xDUjJJZXZ1OGQ1RDBMN0d3b0RyZVV2NDM3NExSYUZrTnNIT3FXYlU5bmhRamRNVnI3YS9pOE8vNGhicHRhU3pxcWtnWUZpTkZVL29tVzVxd0l6N3NwNG5zY0lUUkUzZ3VhNmJ6a2xNWjhFQ24xaXFBV3QwYTZnZWtpNURhTDhxWWFwVENDaGpsV3NFeHFGdXhpV1AzNVRVQ2RkRWQ4QUNiTUdzK2dRRnlET296ZkJERzE3ZFpPMG1Dd1crUHpDTDJqYklDRE5haTUvam0xUXI2TUw1Nmp6VWFJRHowR0xQVFNhZXgxVUREd2tROW83bVhXQzBSN2pXbnpia0hSV2NvbVZiV21HcUwxcmpkb2Fjcy9SOXVqcVV1QkE2QTVWTC9xa1ExeEhMNDJFWG9vcHJDOHdycmZSNjh6TU1GeE93VTdDWUhKN2JoRy9RNHJOc1hEQmNNbzFBZGlxOUxYYlhtL1FKajB1L2pnWkdzc3owbm5LS1VGSmN4enVBTks5NnpXd2YxRFhhc1VjT29FdUVhdG0xcm1QNXdyQkptVy9ad1Q2YUJCaVIyT1NKMHhyOHRRNk9ibWRLanliKzFlRVhiMTQzN1IySWRoRFVkazVQUnp0SDJZRnQycG11TDQvTG1JTEZBdlBkaXlNdERITmorS2g0c1Y0TWxYYldQcnJJOTdZQk9GcEZsWCtnbmV3S0tmRlprSEU3ZGl0eTM0ZFVRMkduZTZzQUd4MXp4eWpadjVLQk0yNmxSSEY0NVhxRk5KMVJRM2hNeW1KSHN5WU5zTU80MUJXckd2MTlQQTQ2OGVjdzlIY1JOMHdoalVUZ25zOFpWYUM0aGlKc2dZMDdhQUVCSG05MC91aGhqTy9XbWI3d3VWYWRobDlSbkhlUWpweDRnd0NyTHo1aTVzNUl0MXNCd2ZEYjBGZStQQ3BMa2Mrd0lJTksyWTg2a1B0aFI2Z0p3Vzc1enVvTjVDMENBaUR3ZlU3M3ZhQVphaHpmNFZMTmxNMFUwNE90SFlCaTEzWWdQb05tR0hSZWxaVkV5Mkt1S1ZaZ2hEMTR2U2xZK0pyTUJEZG0yeTJ0aEZWK0JyaWhMNytmUTV3Y1lueEdlbGF3RHVvU1I1K2JERGtyNlJMNDBMNHh5ZkFoeGxyT24wdUEyOGdoR2VXZ3VhV0tFdjVuQnJydmV1MXVlVnkxTXZHVVlCWStJbEVyOE5kRE5SZG1Felh0MzlrR2xkODZ4T2ZBSC94TDFWbXVnYVhPR2FQQjJxYzdXRFJrVzZrNUY2bjNQa0l6ZFBYeU9OS3AxRGtPZzNvY1NNWk1UczZHS2o5QzN2T0RaNlpRcHdORFlMTVQrQ21FTDE4R1JqWE5jWmxQL0xuaGlBSXNjWVRMMStpSFdEWXZSbXZQTXd0T0hoQ25FWElVM0ZUYlArNlFSR0E2cXlkYm5uZXFWaFhvd2NMbWJNSXoxNklDMWt3aFpqNzUvTTUzc0tZWDJ6UmdPU1RBZk5TRC81bFpZU05VeEpmS1REZ2lhRkVnZ3JDcmQrM0NjK2NoenNsSTN6RFhFS1RydmxjWDJJbkM5dUgrZnN5cHlIdytBdlkyT21CR1FNSUljOGZFM3ROTzBnQlRWcVhzZHNFNzZZd0hyMjlkelFja3VzdXlKc0JmU1ZjbHJ2c05DWjFQUURMOEgzY1JzM0hFOW5Va3g1YmJKWVdzUHhiODI1Z25FcFdVOVo5S3R6dnNsaTcvaGVPbERLcEh4SmIxdUNyV3FmOGdSbldtcTN6ZlNTclVYQkhTTHU2Mk1ya1hUaldnYXBVVnhNR2tybnpSMEU0UE15MWJGY3lEcEVRZTE1VGF5V0JNMUI2anJJRyswRFJSOU9hQ1VQd0Q3ZXhObWpaYjlNODF1cytBSVJmeXpKUFpHbWZIdVQ5U056RmZOdVFkRlp5aVpWdGFZYW92V3VOMmlySTN6UWF0S0NEblFJWHByMFZoRzBHb3A4Yy96cm9XQm9OL2FWS21uOHNrU0Z2QURPam9aQWl4ZzZLMXk5d0ZpOHBlQ21pbUZaM1p6Q1ZzRzZFVTlTdmxicTUrd243RDZ5K2RBWWRhUG1zNGd3Q3JMejVpNXM1SXQxc0J3ZkRiejRYNFZ4cUlwY1RDOU5hWUtxQTdHS0srYVRyWldVd3dOMjFRT3RyOGVxeFNnSjFVOWVDT2NXWFFkK3AzNkd5NGZZK3Q5YzJDc1ZOYk5sMWdoeGE5Ykk4VTZlNkZUZC92dkJhcTlqcktkaXRxNG1OQ2Fpb2dtZlBLNk00OFVZSThqWk1DZGQvOUM4QnF2VWo0YllVNWJ5V0FTRUc2QkJHZEs4S2xmaS9hNExXdDNpdkM0dTlRQlRmYi92Q21OSmkvUUFmYWJjUEcrVXNXbXNZTlJLK2c4aE1jc3VCbWhoNDhOcGhSdmViVlFxcTZuY0t4YzFuRkhXTVc1TTZvZit6OGMxSGRkbmllRFA5R2FCc3EreXNsaktzbFlydDk4OVBZOXhzYm1rcjNYL29DZmlGVTROZmNPaGVlKytuZ1cwWHBaQVZ0MUkyUW5jMWFsd2Jub05xTU1oWElCOTVpa0x4U0ZxSDIyNlpxOXNHL3RyZHIyU0FWdXJueVdzZkhOanVJbEJXS0RPcmQ3VnJZRkp2UTl4YlZvbUtxUWp1aDlkemYybnZWckJ6YkVGMENaWTZpemtZL1JRWTVyOWs5My95Mk5HN28wN25NWWpPdFpZWWVOVW9pazdHYksvSHpRbDFTN3MvRkNobnQ5TTZmRTBVeXVQbXR0Tzk4aHF6eFFidGVNYWxNdFNjZTJXTGNqeVhWR2ZwcWRCa1l5bTRnWkJ5Y2NTNmFudHQ0b0xkbHVXU1NKc0hYMUljWGhReTZvSitBaGp3OWhGWXdYTEhQTG9DbzNqRWxpVUFLNDE3OXd0WXRIc08wYWJMeDQraG10TTVGejd3VVZhaEJBOXN1cE9UZi9GRDRzaVpNTW9mNVczdm01RGVkaHFHQU5saHQzbUk2Um1JaHY0OFFWdG5lTXNVellDNE5EaFpENE01UjZwN0dYQnFjcHUzRmFFRi8wSTBlM0xjZVgxSE4raURxS1JQdUd6dnBhYy8xdHNHUEl0ZUFEeHU5T1lvYXAyejNGMUN6U2cvVXVhOGwvS0V6dEFLRGN2YmhOVS9ZVWMybGhneGdmZGI0ZStQOVRaN1JhWDgyczYyN3UwQ2JGc2ZHRS8xaExwYjVNYzJ2azF1REdyZEljYldBNnhocFlBSFloRVlVbDljNzVZL1IvMGdsNnI5K202Y0kwQnZCWTVBYTVOQlJjNlVNdnNPL1BPdzVDY3I3OXNKemljZWFWM1l3cllFa2pwNktpK09Zckd1OTU0QUErZEo5V3N2TkdCRkdNcktBZlE5VlVDL0FUa0pmVGxvTWx0RGVWNUFvOXprYWF5M2RLQWE1L1B4QUdSREFVY1FMREY3dVZYYkQxdkZnRS8rUlhpd3pTNU43Y3IzYUZCZFJZN1hBbUZ6L2ZiMC9LU3BSOENRL2xva3BtTTJtbHRKOXZHUGdpcWI1blpsOUt1N2QyR2xnQWRpRVJoU1gxenZsajlIL1NCdWpCUG9PMWZwb091NUYzNWNkSGE1a1NGdkFET2pvWkFpeGc2SzF5OXdGbGowRXo1a3NVVzNXVTYzRTdlNHF0RFVDS1d3ampVNWYwRmQ1N1Z5VnpwQzZDZENTY0JqWVN6VDlyWkxWc2txNjFhT1dyRERVTktxQVEzK25YL0JCVzNjUVRFY09WZGMxNW5nVlhjU1MvYUsyUUZNZGlLUWxxbTE1ZkVySmR3cXllemE3aGZsS1RpQ3pVZHU1VkdsRlc5cUN0OHN5SG9vc0EyTnpmb3NKZFRkTjhiV0hub0RyNU4yNWV0K3AvbnZqak96WlJhTFlvWS9mci9rNWhxcHRPaz1cXFwiKTtcXG4gICAgcmV0dXJuICQuZXhwb3J0cztcXG59KSgpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi57yW6L6R5YWs5ZGKXCIsXCJwYXRoXCI6XCJkZXZJbmZvRWRpdFwiLFwicnVsZVwiOlwianM6XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpPT57XFxuICAgIHB1dE15VmFyKFxcXCJkZXZJbmZvXFxcIiwnJyk7IC8v5riF6Zmk5Y6G5Y+y5YWs5ZGKXFxufSkpO1xcbnNldFBhZ2VUaXRsZSgn57yW6L6R5YWs5ZGKJyk7XFxuLy8gbGV0IHtub3dKeCxNeUppZXhpLGp4c1JvdXRlfSA9IE1ZX1BBUkFNUztcXG5jb25zdCB7Y29sb3Isc21hbGwsYXBpLCBnZXRGaWxlLGdldEFwaX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG4vLyBsZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxudmFyIGRldl9pbmZvX3VybCA9IGdldEFwaSgnaW5mb0dldFVybCcpO1xcbi8vIGxvZyhkZXZfaW5mb191cmwpO1xcbnZhciBnZXRfaW5mbyA9IGZ1bmN0aW9uKHFxKXtcXG4gICAgcXEgPSBxcXx8JzQzNDg1NzAwNSc7XFxuICAgIGxldCBkZXZfaW5mb191cmwgPSBkZXZfaW5mb191cmwrcXE7XFxuICAgIGxldCBiYWNrX2NvZGUgPSBKU09OLnBhcnNlKHJlcXVlc3QoZGV2X2luZm9fdXJsKSk7XFxuICAgIGxldCBkZXZfaW5mbz1iYWNrX2NvZGUucmVzdWx0fHxiYWNrX2NvZGUuZGV0YWlsO1xcbiAgICByZXR1cm4gZGV2X2luZm87XFxufTtcXG52YXIgYmVmb3JlX3JlZnJlc2ggPSBmdW5jdGlvbigpe1xcbiAgICBsZXQgZGV2X3NldF9pbmZvID0gZ2V0TXlWYXIoXFxcImRldl9zZXRfaW5mb1xcXCIpLnNwbGl0KCckJCcpO1xcbiAgICBsZXQgZGV2X2luZm9fdXJsID0gZGV2X3NldF9pbmZvLnNsaWNlKC0xKVswXTtcXG4gICAgbGV0IGJhY2tfY29kZSA9IEpTT04ucGFyc2UocmVxdWVzdChkZXZfaW5mb191cmwpKTtcXG4gICAgbGV0IGRldl9pbmZvPWJhY2tfY29kZS5yZXN1bHR8fGJhY2tfY29kZS5kZXRhaWw7XFxuICAgIHB1dE15VmFyKFxcXCJkZXZJbmZvXFxcIixkZXZfaW5mbyk7XFxuICAgIHJldHVybiBkZXZfaW5mb1xcbn07XFxubGV0IGQgPSBbXTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTon57yW6L6R5YWs5ZGKJyxcXG4gICAgZGVzYzon5pSv5oyBbWTor63ms5Us54K55Ye76L+b5YWl5a2m5LmgTWTor63ms5VcXFxcbuS/neWtmOWFrOWRiuaMiemSruWcqOaWh+acrOahhuacgOS4i+mdoicsXFxuICAgIGNvbF90eXBlOid0ZXh0XzEnLFxcbiAgICB1cmw6J2h0dHBzOi8vd3d3LnJ1bm9vYi5jb20vbWFya2Rvd24vbWQtdHV0b3JpYWwuaHRtbCdcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTon6L+U5ZueJyxcXG4gICAgY29sX3R5cGU6J3RleHRfMicsXFxuICAgIHVybDokKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCgpPT57XFxuICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgfSlcXG59KTtcXG5pZighZ2V0TXlWYXIoJ2RldkluZm8nKSl7XFxuICAgIGJlZm9yZV9yZWZyZXNoKCk7XFxufVxcbmxldCBlbXB0eSA9ICdoaWtlcjovL2VtcHR5JztcXG5kLnB1c2goe1xcbiAgICB0aXRsZTon6ZiF6KeI5p+l6ZiFJyxcXG4gICAgY29sX3R5cGU6J3RleHRfMicsXFxuICAgIC8vIHVybDokKGdldE15VmFyKCdkZXZJbmZvJykpLmNvbmZpcm0oKVxcbiAgICB1cmw6JChlbXB0eSkucnVsZSgoKT0+e1xcbiAgICAgICAgcmVxdWlyZShcXFwiaHR0cHM6Ly9naXRsYWIuY29tL2hqZGhueC9oaWtlci8tL3Jhdy9tYWluL2pzL21hcmtlZC5taW4uanNcXFwiKTtcXG4gICAgICAgbGV0IGRldkluZm89XFxcIlxcXCI7XFxuICAgICAgIHRyeXtcXG4gICAgICAgICAgZGV2SW5mbz1tYXJrZWQucGFyc2UoZ2V0TXlWYXIoJ2RldkluZm8nKSk7XFxuICAgICAgIH1jYXRjaChlKXt9XFxuICAgICAgICBzZXRSZXN1bHQoW1xcbiAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6ZGV2SW5mbyxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6J3JpY2hfdGV4dCcsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgXSk7XFxuICAgIH0pXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgZGVzYzogXFxcIuW/q+adpee8lui+keS9oOeahOWFrOWRiuWQp35cXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKCdkZXZJbmZvJywgJycpfHxcXFwiXFxcIixcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6LTEsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dE15VmFyKFxcXCJkZXZJbmZvXFxcIixpbnB1dCknXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi5L+d5a2Y5YWs5ZGKXFxcIixcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXG4gICAgdXJsOiQoJ+ehruiupOS/neWtmOWFrOWRiuWQl++8n+WwhuS8muS4jumBk+mVv+S7k+W6k+acjeWKoeWZqOmAmuiurycpLmNvbmZpcm0oKCk9PntcXG4gICAgICAgIGxldCBkZXZfc2V0X2luZm8gPSBnZXRNeVZhcihcXFwiZGV2X3NldF9pbmZvXFxcIikuc3BsaXQoJyQkJyk7XFxuICAgICAgICBsZXQgaW5wdXRfdGV4dCA9IGdldE15VmFyKCdkZXZJbmZvJywgJycpO1xcbiAgICAgICAgaWYoaW5wdXRfdGV4dC5sZW5ndGggPj0gNCl7XFxuICAgICAgICAgICAgbGV0IGluZm9fc2V0X3VybD0gZGV2X3NldF9pbmZvWzJdO1xcbiAgICAgICAgICAgIGxldCBzZW5kX2RhdGEgPSB7XFxcInBhcmFtc1xcXCI6XFxuICAgICAgICAgICAgICAgICAgICB7XFxcImRhdGFcXFwiOiB7XFxcImluZm9cXFwiOiBpbnB1dF90ZXh0fSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwibmFtZVxcXCI6IGRldl9zZXRfaW5mb1swXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBkZXZfc2V0X2luZm9bMV19XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAvLyBsb2coc2VuZF9kYXRhKTtcXG4gICAgICAgICAgICBsZXQgcGFyMiA9IHtoZWFkZXJzOnsnY29udGVudC10eXBlJzonYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywnVXNlci1BZ2VudCc6ZGV2X3NldF9pbmZvWzNdfSxib2R5OkpTT04uc3RyaW5naWZ5KHNlbmRfZGF0YSksbWV0aG9kOidQT1NUJ307XFxuICAgICAgICAgICAgLy8gcGFyMiA9IEpTT04uc3RyaW5naWZ5KHBhcjIpOyAvL3g16YeM6Z2i6K+35rGC5omN6ZyA6KaB57yW56CBXFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgbGV0IGJhY2tfcmV0ID0gcmVxdWVzdChpbmZvX3NldF91cmwsIHBhcjIpO1xcbiAgICAgICAgICAgICAgICBiYWNrX3JldCA9IEpTT04ucGFyc2UoYmFja19yZXQpLnJlc3VsdDtcXG4gICAgICAgICAgICAgICAgaWYoYmFja19yZXQuc3RhdHVzPT09MCl7XFxuICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+S/neWtmOaIkOWKn1xcXFxuJytiYWNrX3JldC5kZXRhaWw7XFxuICAgICAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+S/neWtmOWksei0pVxcXFxuJytiYWNrX3JldC5kZXRhaWw7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr1xcXFxuJytlLm1lc3NhZ2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgY29uZmlybSh7dGl0bGU6J+mBk+mVv+aPkOekuicsY29udGVudDon6Jm954S25L2g5b6I5oeS77yM5L2G5piv5YWs5ZGK6Iez5bCR5YaZNOS4quWtl+WQp++8gSd9KTtcXG4gICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgICAgICB9XFxuICAgIH0pXFxufSk7XFxuXFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6aKE5aSE55CG5L6d6LWW5paH5Lu2XCIsXCJwYXRoXCI6XCJsaWJzXCIsXCJydWxlXCI6XCJpZihnZXRBcHBWZXJzaW9uKCk+PTMyMDApe1xcbiAgICB0cnl7XFxuICAgICAgICByYyhcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9qcy8kaGlrZXIuanNcXFwiLCAtMSk7XFxuICAgICAgICAvLyQuc2V0Um9vdCgnaHR0cHM6Ly9oamRobnguY29kaW5nLm5ldC9wdWJsaWMvaGlrZXIvaGlrZXIvZ2l0L2ZpbGVzL21hc3Rlci9qcy8nKTtcXG4gICAgICAgICQuc2V0Um9vdCgpO1xcbiAgICAgICAgJC5zZXRMaWIoe1xcbiAgICAgICAgICAgIGxzZzogXFxcImxzZy5qc1xcXCIsIC8v5pys5Zyw5YKo5a2YXFxuICAgICAgICAgICAgZmlsZTogXFxcImZpbGUuanNcXFwiLCAvL+aWh+S7tm9zXFxuICAgICAgICAgICAgZmlsZVNlbGVjdDogXFxcImZpbGVTZWxlY3QuanNcXFwiLCAvL+aWh+S7tumAieaLqeWZqFxcbiAgICAgICAgICAgIGR0OiBcXFwiZHQuanNcXFwiLCAvL+WKqOaAgeWIhuexu1xcbiAgICAgICAgICAgIGRyOiBcXFwiZHIuanNcXFwiLCAvL2Ry5qih5p2/5L6d6LWWXFxuICAgICAgICAgICAgZHJwcmU6IFxcXCJkcnByZS5qc1xcXCIsIC8vZHLmqKHmnb/pooTlpITnkIZcXG4gICAgICAgICAgICBkcnVwOiBcXFwiZHJ1cC5qc1xcXCIsIC8vZHLmqKHmnb/oh6rliqjmm7TmlrBcXG4gICAgICAgICAgICBkcm1hdGNoOiBcXFwiZHJtYXRjaC5qc1xcXCIsIC8vZHLmqKHmnb/oh6rliqjmqKHmnb/ljLnphY1cXG4gICAgICAgICAgICBkcm06IFxcXCJkcm0uanNcXFwiLCAvL2Ry5qih5p2/5bCP56iL5bqPXFxuICAgICAgICAgICAgY21zOiBcXFwiY21zLmpzXFxcIiwgLy9jbXPmqKHmnb/kvp3otZZcXG4gICAgICAgICAgICBjbXNwcmU6IFxcXCJjbXNwcmUuanNcXFwiLCAvL2Ntc+mihOWkhOeQhlxcbiAgICAgICAgICAgIGNtc206IFxcXCJjbXNtLmpzXFxcIiwgLy9jbXPmqKHmnb/lsI/nqIvluo9cXG4gICAgICAgICAgICBsaWJjaGVjazogXFxcImxpYmNoZWNrLmpzXFxcIiwgLy9kcuajgOa1i+S+nei1llxcbiAgICAgICAgICAgIHJ1bGVFZGl0b3I6IFxcXCJydWxlRWRpdG9yLmpzXFxcIiwgLy/lhpnpobXmupDnpZ7lmajlsI/nqIvluo9cXG4gICAgICAgICAgICBob3VzZUxhenk6IFxcXCJob3VzZUxhenkuanNcXFwiLCAvL+S7k+W6k+mAmuWFjVxcbiAgICAgICAgICAgIGxhenk6IFxcXCJsYXp5LmpzXFxcIiwgLy/pppnlhY1cXG4gICAgICAgICAgICBzdWI6IFxcXCJzdWIuanNcXFwiLCAvL+mBk+W+t+e7j+iuoumYhVxcbiAgICAgICAgICAgIGhpa2VyVWk6IFxcXCJoaWtlclVpLmpzXFxcIiwgLy/mtbfpmJTnu4Tku7bkvp3otZZcXG4gICAgICAgICAgICBoaWtlckxpYnM6IFxcXCJoaWtlckxpYnMuanNcXFwiLCAvL+a1t+mYlOWFqOiDveS+nei1llxcbiAgICAgICAgfSk7XFxuICAgIH1jYXRjaChlKXtcXG4gICAgICAgIC8vdG9hc3QoJ+ivt+WwneivleeCueWHu+S7k+W6k+S4u+mhteeahOWNh+e6p+S7k+W6k+aXgei+ueeahOaMiemSruWNh+e6pyTmianlsZXvvIzlkKbliJnmn5Dkupvlip/og73kuI3og73mraPluLjkvb/nlKgnKTtcXG4gICAgICAgIGNvbmZpcm0oe1xcbiAgICAgICAgICAgIHRpdGxlOiAn5o+Q56S6LeeCueWHu+ehruWumuWPr+S7peWvvOWFpScsXFxuICAgICAgICAgICAgY29udGVudDogJ+ivt+WwneivleeCueWHu+S7k+W6k+S4u+mhteeahOWNh+e6p+S7k+W6k+aXgei+ueeahOaMiemSruWNh+e6pyTmianlsZXvvIzlkKbliJnmn5Dkupvlip/og73kuI3og73mraPluLjkvb/nlKgnLFxcbiAgICAgICAgICAgIGNvbmZpcm06ICQudG9TdHJpbmcoKCk9PntcXG4gICAgICAgICAgICAgICAgY29uc3Qge2dldEFwaX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVIZWFkID0gJ+a1t+mYlOinhueVjO+8jOe9kemhteaPkuS7tu+/pWpzX3VybO+/pSRoaWtlckAnO1xcbiAgICAgICAgICAgICAgICBsZXQgdXJsID0gZ2V0QXBpKCdpbXBvcnRVcmwnKStcXFwiNTExMVxcXCI7XFxuICAgICAgICAgICAgICAgIGxldCBpbXBvcnRVcmwgPSAncnVsZTovLycrYmFzZTY0RW5jb2RlKHJ1bGVIZWFkK3VybCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBpbXBvcnRVcmxcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBjYW5jZWw6ICQudG9TdHJpbmcoKCk9PntcXG5cXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgIH0pXFxuICAgIH1cXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJJbXBvcnTor6bnu4ZcIixcInBhdGhcIjpcInJ1bGVEZXRhaWxJbXBvcnRcIixcInJ1bGVcIjpcImpzOlxcbiQuZXhwb3J0cyA9IFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbD9ydWxlPemBk+mVv+S7k+W6k1BybyZpZD1cXFwiICsgJC5pbXBvcnRQYXJhbTtcXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIui3kemprOeBr+WFrOWRilwiLFwicGF0aFwiOlwibm90aWNlXCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZ2V0SHRtbCA9ICh0ZXh0LCBjb2xvcikgPT4gYFxcbjwhRE9DVFlQRSBodG1sPlxcbjxodG1sPlxcbjxoZWFkPlxcbjxtZXRhIG5hbWU9XFxcInZpZXdwb3J0XFxcIiBjb250ZW50PVxcXCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSwgbWF4aW11bS1zY2FsZT0xLCB1c2VyLXNjYWxhYmxlPTBcXFwiPlxcbjxzdHlsZT5cXG4ubWFycXVlZSB7XFxuICB3aWR0aDogMTAwJTtcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIGNvbG9yOiAke2NvbG9yfTtcXG4gIGZvbnQtc2l6ZTogMTZweDtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxufVxcblxcbi5tYXJxdWVlIHNwYW4ge1xcbiAgdXNlci1zZWxlY3Q6bm9uZTtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jazsgIFxcbiAgcGFkZGluZy1sZWZ0OiAxMDAlO1xcbiAgYW5pbWF0aW9uOiBtYXJxdWVlIDI1cyBsaW5lYXIgaW5maW5pdGU7XFxufVxcblxcbkBrZXlmcmFtZXMgbWFycXVlZSB7XFxuICAwJSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwJSk7IH1cXG4gIDEwMCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpOyB9XFxufVxcblxcbkBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHtcXG4gICAgYm9keSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMxQjFCMUI7XFxuICAgICB9XFxuICAgICAudGV4dCwuc2Nyb2xse1xcbiAgICAgICBjb2xvcjojRmZmO1xcbiAgICAgICB9XFxuICAgIH1cXG5cXG5AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodCkge1xcbiAgICBib2R5IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgICAgfVxcbiAgICB9XFxuXFxuPC9zdHlsZT5cXG48L2hlYWQ+XFxuPGJvZHk+XFxuPGRpdiBjbGFzcz1cXFwibWFycXVlZVxcXCI+XFxuICA8c3BhbiBpZD1cXFwidGV4dENvbnRhaW5lclxcXCI+JHt0ZXh0fTwvc3Bhbj5cXG48L2Rpdj5cXG48L2JvZHk+XFxuPC9odG1sPmA7XFxuXFxuJC5leHBvcnRzLnNob3cgPSBmdW5jdGlvbihhcnIsIHRleHQsIGNvbG9yLCB1cmwsIGNvbnRlbnQpIHtcXG4gICAgdmFyIGh0bWwgPSBnZXRIdG1sKHRleHQgfHwgJ+i/meaYr+i3kemprOeBr+m7mOiupOeahOaWh+Wtl++8jOWPr+S7peiHquihjOabv+aNouOAgicsIGNvbG9yIHx8ICdyZWQnKTtcXG4gICAgYXJyLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ4NV93ZWJ2aWV3X3NpbmdsZVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJhYm91dDpibGFua1xcXCIsXFxuICAgICAgICBkZXNjOiBcXFwiNTAmJmxpc3RcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBqczogJC50b1N0cmluZygoaCwgdXJsKSA9PiB7XFxuICAgICAgICAgICAgICAgIHZhciBodG1sID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xcbiAgICAgICAgICAgICAgICBodG1sLmlubmVySFRNTCA9IGg7XFxuXFxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHRDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGV4dENvbnRhaW5lcicpO1xcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGV4dENvbnRhaW5lci5pbm5lckhUTUw7XFxuICAgICAgICAgICAgICAgIHRleHRDb250YWluZXIub25jbGljaz1mdW5jdGlvbigpe1xcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmx8fFxcXCJhYm91dDpibGFuay9ub3RpY2VcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIC8vIOiuvue9ruaWh+acrOWuueWZqOWuveW6puS4uuaWh+acrOWGheWuueeahOWuveW6plxcbiAgICAgICAgICAgICAgICB0ZXh0Q29udGFpbmVyLnN0eWxlLndpZHRoID0gYCR7dGV4dENvbnRhaW5lci5vZmZzZXRXaWR0aH1weGA7XFxuXFxuICAgICAgICAgICAgICAgIC8vIOWkjeWItuaWh+acrOWGheWuueW5tui/veWKoOWIsOaWh+acrOWuueWZqOWQjumdolxcbiAgICAgICAgICAgICAgICB0ZXh0Q29udGFpbmVyLmlubmVySFRNTCArPSAnICcgKyB0ZXh0O1xcblxcbiAgICAgICAgICAgICAgICAvLyDliqjmgIHorqHnrpfliqjnlLvmjIHnu63ml7bpl7RcXG4gICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSAodGV4dENvbnRhaW5lci5vZmZzZXRXaWR0aCAvIHRleHRDb250YWluZXIucGFyZW50RWxlbWVudC5vZmZzZXRXaWR0aCkgKiAxMDtcXG5cXG4gICAgICAgICAgICAgICAgdmFyIHN0eWxlRWxlbWVudHMgPSBkb2N1bWVudC5oZWFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzdHlsZScpO1xcblxcblxcbiAgICAgICAgICAgICAgICBzdHlsZUVsZW1lbnRzWzJdLmlubmVySFRNTCA9IGAubWFycXVlZSBzcGFuIHtcXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDogMTAwJTtcXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogbWFycXVlZSAke2R1cmF0aW9ufXMgbGluZWFyIGluZmluaXRlXFxuICAgICAgICAgICAgICAgIH1gO1xcblxcbiAgICAgICAgICAgIH0sIGh0bWwsIHVybCksXFxuICAgICAgICAgICAgdXJsSW50ZXJjZXB0b3I6ICQudG9TdHJpbmcoKGNvbnRlbnQpID0+IHtcXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0PT09XFxcImFib3V0OmJsYW5rL25vdGljZVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnRvU3RyaW5nKChjb250ZW50KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZmJhLm9wZW4oSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWFrOWRilxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJ2hpa2VyOi8vZW1wdHkjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZFJ1bGU6IFxcXCJqczpcXFwiICsgJCQkLnRvU3RyaW5nKChjb250ZW50KSA9PiBzZXRSZXN1bHQoW3tcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBjb250ZW50LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSksY29udGVudClcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XFxuICAgICAgICAgICAgICAgICAgICB9LCBjb250ZW50KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0sIGNvbnRlbnQgfHwgdGV4dCksXFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cIn1dLFwicGFyYW1zXCI6XCJ7XFxcImlkXFxcIjo2NTkxLFxcXCJsdmVyXFxcIjoxODN9XCIsXCJzYXZlZFwiOmZhbHNlLFwidGl0bGVcIjpcIumBk+mVv+S7k+W6k1Byb1wiLFwidmVyc2lvblwiOjAsXCJ1cmxcIjpcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1wiLFwiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcImZpbmRfcnVsZVwiOlwianM6XFxuICAgIGNvbnN0IHtcXG4gICAgICAgIGdldEFwaSxcXG4gICAgICAgIGNvbG9yLFxcbiAgICAgICAgc21hbGwsXFxuICAgICAgICBodG1sVGFnLFxcbiAgICAgICAgYXBpLFxcbiAgICAgICAgbWRcXG4gICAgfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGlkLFxcbiAgICBsdmVyLFxcbiAgICBpc0FsbFxcbn0gPSBNWV9QQVJBTVM7XFxuaWYoZ2V0UGFyYW0oXFxcImlkXFxcIikpe1xcbiAgICBpc0FsbCA9IHRydWU7XFxuICAgIGlkID0gZ2V0UGFyYW0oXFxcImlkXFxcIik7XFxuICAgIGx2ZXIgPSBsdmVyIHx8IFxcXCLmnKrojrflj5bniYjmnKzlj7dcXFwiO1xcbn1cXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKGlzQWxsKSA9PiB7XFxuICAgIGlmKCFpc0FsbCl7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgIH1cXG59LGlzQWxsKSk7XFxubGV0IGRhdGFJdGVtID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwiZ2V0YnlpZFxcXCIpICsgXFxcIj9pZD1cXFwiICsgaWQpKS5yZXN1bHQ7XFxuc2V0UGFnZVRpdGxlKFxcXCLjgIxcXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCLjgI1cXFwiKVxcbmxldCBydWxlTGlzdEpzb24gPSBnZXRBcGkoXFxcInJ1bGVMaXN0SnNvblxcXCIpICsgXFxcIj9pZD1cXFwiO1xcbmxldCBkYXRhID0gW107XFxudmFyIGhhc1N1YiA9IGZhbHNlO1xcblxcbmlmIChkYXRhSXRlbS5pc19qc29uX2xpc3QpIHtcXG4gICAgaGFzU3ViID0gaGFzSG9tZVN1YihydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCk7XFxufSBlbHNlIGlmICghZGF0YUl0ZW0uaXNfanNvbl9saXN0ICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PSAnaG9tZV9ydWxlX3VybCcpIHtcXG4gICAgaGFzU3ViID0gaGFzSG9tZVN1YihydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArICcmZGVidWc9dHJ1ZScpO1xcbn1cXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIueJiOacrFxcXCIpLFxcbiAgICBkZXNjOiBcXFwi4oCc4oCc4oCd4oCd5byA5Y+R6ICF77yaXFxcIiArIGNvbG9yKGRhdGFJdGVtLmF1dGhvciwgXFxcIiMyMjhCRTZcXFwiKSArIFxcXCJcXFxcbuS6keerr+eJiOacrO+8mlxcXCIgKyBjb2xvcihkYXRhSXRlbS52ZXIsIFxcXCIjNWNmZjJjXFxcIikgKyBcXFwiXFxcXHRcXFxcdOacrOWcsOeJiOacrO+8mlxcXCIgKyBjb2xvcihsdmVyLCBcXFwiIzVjZmYyY1xcXCIpICsgXFxcIlxcXFxu5pu05paw5LqOOiBbXFxcIiArIGNvbG9yKGRhdGFJdGVtLmxhc3RfdXBkYXRlLCBcXFwiI2ZmNzAwMFxcXCIpICsgXFxcIl1cXFwiLFxcbiAgICB1cmw6ICQoXFxcIjzlvIDlj5HogIU+XFxcXG5cXFwiICsgZGF0YUl0ZW0uYXV0aG9yICsgXFxcIlxcXFxuPOWQjeensD5cXFxcblxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcIlxcXFxuPOS6keerr+eJiOacrD5cXFxcblxcXCIgKyBkYXRhSXRlbS52ZXIgKyBcXFwiXFxcXG485pys5Zyw54mI5pysPlxcXFxuXFxcIiArIGx2ZXIgKyBcXFwiXFxcXG485pu05paw5pe26Ze0PlxcXFxuW1xcXCIgKyBkYXRhSXRlbS5sYXN0X3VwZGF0ZSArIFxcXCJdXFxcIikuY29uZmlybSgoKSA9PiB7fSksXFxuICAgIGNvbF90eXBlOiAndGV4dF8xJ1xcbn0pO1xcbmxldCBkYXRhVHlwZSA9IHtcXG4gICAgaG9tZV9ydWxlX3VybDogJ+mmlumhteS6keinhOWImScsXFxuICAgIHB1Ymxpc2g6ICfmj5DkuqTkupHku5PlupPop4TliJknLFxcbiAgICBqc191cmw6ICfnvZHpobXmj5Lku7bop4TliJknLFxcbiAgICBodG1sOiAn6Z2Z5oCB6aG16Z2iJyxcXG4gICAgY29uZmlnOiAn5Li76aG16YWN572uJ1xcbn07XFxuXFxubGV0IGJhc2ljID0ge1xcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxufTtcXG5sZXQgZGF0YVR5cGVUaXBzID0gZGF0YVR5cGVbZGF0YUl0ZW0uZGF0YV90eXBlXSB8fCAn5pyq55+l6KeE5YiZ77yaJyArIGRhdGFJdGVtLmRhdGFfdHlwZTtcXG5cXG5sZXQgc2FmZV90aXA9ZGF0YUl0ZW0uaXNfc2FmZT9cXFwi5a6J5YWoXFxcIjpcXFwi5Y2x6ZmpXFxcIjtcXG5sZXQgZ29vZF90aXAgPSBkYXRhSXRlbS5pc19nb29kP3NtYWxsKGNvbG9yKFxcXCLjgJDkvJjotKjop4TliJnjgJFcXFwiLCcjZmY3MDAwJykpOlxcXCJcXFwiO1xcbmxldCBub3Rfc2FmZV9ub3RlPWRhdGFJdGVtLm5vdF9zYWZlX25vdGU7XFxuYmFzaWMudGl0bGUgPSBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi57G75Z6LXFxcIikgKyBcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIHNtYWxsKFxcXCIoaWQ6XFxcIiArIGRhdGFJdGVtLmlkICsgXFxcIilcXFwiKStcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIHNtYWxsKFxcXCIo6aOO6Zmp5qOA5rWLOlxcXCIgK3NhZmVfdGlwK1xcXCIpXFxcIikrZ29vZF90aXA7XFxuYmFzaWMuZGVzYyA9IFxcXCLmlbDmja7nsbvlnovvvJpcXFwiICsgY29sb3IoZGF0YVR5cGVUaXBzLCBcXFwiI2NiNTRmZlxcXCIpICsgXFxcIlxcXFxu5YiG5Lqr54q25oCB5Li677yaXFxcIiArIGRhdGFJdGVtLnN0YXRlO1xcbmlmIChbXFxcImh0bWxcXFwiLCBcXFwiY29uZmlnXFxcIiwgXFxcImpzX3VybFxcXCJdLmluY2x1ZGVzKGRhdGFJdGVtLmRhdGFfdHlwZSkpIHtcXG4gICAgYmFzaWMuZGVzYyArPSBcXFwiXFxcXG7igJzigJzigJ3igJ0gPT5cXFwiICsgc21hbGwoXFxcIueCueatpOmihOiniFxcXCIpO1xcbiAgICBiYXNpYy51cmwgPSBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG59XFxuXFxuZGF0YS5wdXNoKGJhc2ljKTtcXG5sZXQgaGFzU3VicyA9IFxcXCJcXFwiO1xcbmlmIChoYXNTdWIpIHtcXG4gICAgaGFzU3VicyA9IFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoXFxcIuW3suiuoumYhVxcXCIpXFxufVxcblxcbmxldCBub3RlcyA9IHJlcXVlc3QoZ2V0QXBpKFxcXCJnZXRfcnVsZV9ub3RlXFxcIikgKyBpZCk7XFxubm90ZXMgPSBKU09OLnBhcnNlKG5vdGVzKS5yZXN1bHQ7XFxucmVxdWlyZShtZCk7XFxubGV0IG5vdGVzSHRtbD1cXFwiXFxcIlxcbnRyeXtcXG4gICAgbm90ZXNIdG1sPW1hcmtlZC5wYXJzZShub3Rlcyk7XFxufWNhdGNoKGUpe31cXG5cXG5pZiAobm90ZXMgIT09IGZhbHNlKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuWkh+azqFxcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChodG1sVGFnKFxcXCJ1XFxcIiwgXFxcIuafpeeci+WujOaVtOWFrOWRiiA+XFxcIikpLFxcbiAgICAgICAgZGVzYzogbm90ZXMsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHRleHQ6IG5vdGVzSHRtbCxcXG4gICAgICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lLFxcbiAgICAgICAgICAgIC8vIHR5cGU6IFxcXCJsb25nX3RleHRcXFwiXFxuICAgICAgICAgICAgdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufVxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi5pON5L2cKOWIhuS6q+ivpue7humhtSlcXFwiKSArIGhhc1N1YnMsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwiY29weTovL+mBk+mVv+S7k+W6k+OAjFxcXCIrZGF0YUl0ZW0ubmFtZStcXFwi44CNXFxcXG5cXFwiK2lkKydAaW1wb3J0PWpzOiQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3J1bGVEZXRhaWxJbXBvcnQ/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiLCBpbnB1dCknXFxufSk7XFxubGV0IGltcG9ydFVybCwgcnVsZUNvZGUsIHNoYXJlVXJsLCBiYWNrQ29kZSA9IFxcXCJcXFwiO1xcbmlmICghZGF0YUl0ZW0uaXNfanNvbikge1xcbiAgICBiYWNrQ29kZSA9IHJlcXVlc3QocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpO1xcbn1cXG5zd2l0Y2ggKGRhdGFJdGVtLmRhdGFfdHlwZSkge1xcbiAgICBjYXNlIFxcXCJob21lX3J1bGVfdXJsXFxcIjpcXG4gICAgICAgIHJ1bGVDb2RlID0gXFxcIua1t+mYlOinhueVjOmmlumhtemikemBk+inhOWImeOAkFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcIuOAke+/pWhvbWVfcnVsZV91cmzvv6VcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxuICAgICAgICBpbXBvcnRVcmwgPSBcXFwicnVsZTovL1xcXCIgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpXFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAncHVibGlzaCc6XFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJonICsgZGF0YUl0ZW0ubmFtZSArICfvv6VwdWJsaXNo77+lJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgJ2pzX3VybCc6XFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJrnvZHpobXmj5Lku7bvv6Vqc191cmzvv6UnICsgZGF0YUl0ZW0ubmFtZSArICdAYmFzZTY0Oi8vJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgJ2h0bWwnOlxcbiAgICAgICAgbGV0IGZpbGVfdG1wID0gZGF0YUl0ZW0ubmFtZS5zcGxpdCgnLicpO1xcbiAgICAgICAgbGV0IGZpbGVfcGF0aCA9IGZpbGVfdG1wLmxlbmd0aCA+IDEgPyBmaWxlX3RtcFtmaWxlX3RtcC5sZW5ndGggLSAxXSArIFxcXCIvXFxcIiArIGRhdGFJdGVtLm5hbWUgOiBkYXRhSXRlbS5uYW1lO1xcbiAgICAgICAgcnVsZUNvZGUgPSBcXFwi5rW36ZiU6KeG55WM5pys5Zyw5paH5Lu25YiG5Lqr77+lZmlsZV91cmzvv6VoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvXFxcIiArIGZpbGVfcGF0aCArIFxcXCJAXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIGJyZWFrXFxuICAgIGNhc2UgXFxcImNvbmZpZ1xcXCI6XFxuICAgICAgICBpbXBvcnRVcmwgPSAkKCkucnVsZShwYXNzd29yZCA9PiB7XFxuICAgICAgICAgICAgZXZhbChmZXRjaChcXFwiaGlrZXI6Ly9hc3NldHMvaG9tZS5qc1xcXCIpKTtcXG4gICAgICAgICAgICBIaWtlckhvbWUubG9hZChcXFwiaW1wb3J0XFxcIiwgcGFzc3dvcmQpO1xcbiAgICAgICAgfSwgYmFja0NvZGUpO1xcbiAgICAgICAgYnJlYWs7XFxufVxcbmxldCBteV9jb2xfdHlwZSA9IFxcXCJ0ZXh0XzJcXFwiO1xcbmxldCBteV9jb2xfdHlwZTIgPSBcXFwidGV4dF8zXFxcIjtcXG5pZiAoaW1wb3J0VXJsKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWvvOWFpeinhOWImVxcXCIsXFxuICAgICAgICB1cmw6IGRhdGFJdGVtLmlzX3NhZmU/aW1wb3J0VXJsOid0b2FzdDovL+mjjumZqeinhOWImeemgeatouWvvOWFpSEhIScsXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSk7XFxufVxcbmlmIChydWxlQ29kZSkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLliIbkuqvlj6Pku6RcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiY29weTovL1xcXCIgKyBydWxlQ29kZSxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KTtcXG59XFxuXFxuaWYgKGltcG9ydFVybCkge1xcbiAgICBpZiAoZGF0YUl0ZW0uaXNfanNvbl9saXN0ICYmICFoYXNTdWIpIHtcXG4gICAgICAgIGxldCBzdWJfcnVsZV9jb2RlID0gJ+a1t+mYlOinhueVjOWQiOmbhuinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lJyArIGRhdGFJdGVtLm5hbWUgKyBcXFwiQEBcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxuICAgICAgICBsZXQgc3ViX3VybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShzdWJfcnVsZV9jb2RlKTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICforqLpmIXlkIjpm4YnLFxcbiAgICAgICAgICAgIHVybDogc3ViX3VybCxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGUyXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPuWvvOWFpei9u+WQiOmbhjwvc3Bhbj4nLFxcbiAgICAgICAgICAgIHVybDogJCgpLmxhenlSdWxlKChkYXRhSXRlbSxzdWJVcmwpPT57XFxuICAgICAgICAgICAgICAgIGNvbnN0IHtnZW5SdWxlfT0kLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9nZW5BcGlcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IGltcG9ydF9ydWxlPWdlblJ1bGUoZGF0YUl0ZW0ubmFtZStcXFwiLlxcXCIrZGF0YUl0ZW0uYXV0aG9yLHN1YlVybCk7XFxuICAgICAgICAgICAgICAgIC8vY29weShpbXBvcnRfcnVsZSk7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlQ29kZT1wYXJzZVBhc3RlKGltcG9ydF9ydWxlLnNwbGl0KFxcXCJcXFxcblxcXCIpWzBdKTtcXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICAgICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBpbXBvcnRVcmxcXG4gICAgICAgICAgICB9LGRhdGFJdGVtLHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGUyXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPuWvvOWFpemBk+W+t+e7jzwvc3Bhbj4nLFxcbiAgICAgICAgICAgIHVybDogJCgpLmxhenlSdWxlKChkYXRhSXRlbSxzdWJVcmwpPT57XFxuICAgICAgICAgICAgICAgIC8vIGxldCB0aXRsZSA9IFxcXCJILVxcXCIrZGF0YUl0ZW0ubmFtZStcXFwiLlxcXCIrZGF0YUl0ZW0uYXV0aG9yO1xcbiAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBcXFwiSi1cXFwiK2RhdGFJdGVtLm5hbWUuc3BsaXQoJy4nKVswXTtcXG4gICAgICAgICAgICAgICAgbGV0IHN1Yk9iaiA9IHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogc3ViVXJsLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9ydWxlQ2FjaGUvXFxcIit0aXRsZStcXFwiLmpzb25cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogXFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IGZhbHNlLC8v56aB55So5bm25Y+R5pu05pawXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbGV0IHNoYXJlVGV4dCA9IGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShzdWJPYmopKTtcXG4gICAgICAgICAgICAgICAgdmFyIHBhc3RlcyA9IGdldFBhc3RlcygpO1xcbiAgICAgICAgICAgICAgICB2YXIgdXJsID0gc2hhcmVQYXN0ZShzaGFyZVRleHQscGFzdGVzLnNsaWNlKC0xKVswXSk7XFxuICAgICAgICAgICAgICAgIGxldCBpbXBvcnRfcnVsZT0gXFxcIui9u+WQiOmbhuiuoumYhe+8mlxcXCIrdGl0bGUrJ1xcXFxuJyt1cmw7XFxuICAgICAgICAgICAgICAgIGNvcHkoaW1wb3J0X3J1bGUpO1xcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gJ2hpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9ydWxlQ2FjaGUvc3ViLmpzb24nO1xcbiAgICAgICAgICAgICAgICAkLnJjKGNvbmZpZy5saWIuc3ViKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIOiuoumYheWvvOWFpShwYXRoKVxcbiAgICAgICAgICAgIH0sZGF0YUl0ZW0scnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZTJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIjxzbWFsbD7mj5DnpLrvvJrlvIDlj5HogIXljZXni6zliIbkuqvnmoTlkIjpm4bmlofku7blj6rog73ljZXni6zlr7zlhaXjgII8L3NtYWxsPlxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfSBlbHNlIGlmICghZGF0YUl0ZW0uaXNfanNvbl9saXN0ICYmICFoYXNTdWIgJiYgZGF0YUl0ZW0uZGF0YV90eXBlID09ICdob21lX3J1bGVfdXJsJykge1xcbiAgICAgICAgbGV0IHN1Yl9ydWxlX2NvZGUgPSAn5rW36ZiU6KeG55WM5Y2V6KeE5YiZ6K6i6ZiF77+laG9tZV9zdWLvv6UnICsgZGF0YUl0ZW0ubmFtZSArIFxcXCJAQFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArICcmZGVidWc9dHJ1ZSc7XFxuICAgICAgICBsZXQgc3ViX3VybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShzdWJfcnVsZV9jb2RlKTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICforqLpmIXop4TliJknLFxcbiAgICAgICAgICAgIHVybDogc3ViX3VybCxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgICAgIH0pXFxuICAgIH1cXG59XFxuaWYgKGRhdGFJdGVtLmlzX2pzb24gJiYgZGF0YUl0ZW0uZGF0YV90eXBlID09PSBcXFwiaG9tZV9ydWxlX3VybFxcXCIgJiYgIWRhdGFJdGVtLmlzX2pzb25fbGlzdCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfov5vlhaXpopHpgZMnLFxcbiAgICAgICAgdXJsOiAkKCBcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgobmFtZSxob21lKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGhhc1J1bGUgPSByZXF1ZXN0KCdoaWtlcjovL2hvbWVAJytuYW1lKSAhPSAnbnVsbCc7XFxuICAgICAgICAgICAgaWYgKGhhc1J1bGUpIHtcXG4gICAgICAgICAgICAgICAgYmFja1RvSG9tZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gaG9tZStcXFwic0BcXFwiICsgbmFtZTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pyq5a6J6KOFXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBkYXRhSXRlbS5uYW1lLGFwaS5ob21lKSxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KVxcbn1cXG5sZXQgbWFuX3J1bGVfc2FmZSA9IGdldEFwaShcXFwibWFuUnVsZVNhZmVcXFwiKStkYXRhSXRlbS5pZDtcXG5sZXQgbWFuX3J1bGVfZ29vZCA9IGdldEFwaShcXFwibWFuUnVsZUdvb2RcXFwiKStkYXRhSXRlbS5pZDtcXG4vLyBkYXRhSXRlbS5pc19zYWZlO1xcbmlmKGdldFZhcignaG91c2UuaXNfbWFuYWdlcicpKXtcXG4gICAgZnVuY3Rpb24gc2V0SXNTYWZlKGZsYWcsbWFuX3J1bGVfc2FmZSkge1xcbiAgICAgICAgZmxhZyA9IGZsYWcgfHwgJyc7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBjb2RlID0gZmV0Y2gobWFuX3J1bGVfc2FmZSwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcIlVzZXItQWdlbnRcXFwiOiBNT0JJTEVfVUF9LFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1c2VybmFtZVxcXCI6IGdldFZhcignaG91c2UudXNlcm5hbWUnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogZ2V0VmFyKCdob3VzZS5wYXNzd29yZCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiaXNfc2FmZVxcXCI6ICEhZmxhZ1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGNvZGUgPSBKU09OLnBhcnNlKGNvZGUpLnJlc3VsdDtcXG4gICAgICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBlLm1lc3NhZ2VcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBmdW5jdGlvbiBzZXRJc0dvb2QoZmxhZyxtYW5fcnVsZV9nb29kKSB7XFxuICAgICAgICBmbGFnID0gZmxhZyB8fCAnJztcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IGNvZGUgPSBmZXRjaChtYW5fcnVsZV9nb29kLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFwiVXNlci1BZ2VudFxcXCI6IE1PQklMRV9VQX0sXFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInVzZXJuYW1lXFxcIjogZ2V0VmFyKCdob3VzZS51c2VybmFtZScpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBnZXRWYXIoJ2hvdXNlLnBhc3N3b3JkJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJpc19nb29kXFxcIjogISFmbGFnXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgY29kZSA9IEpTT04ucGFyc2UoY29kZSkucmVzdWx0O1xcbiAgICAgICAgICAgIGlmIChjb2RlLnN0YXR1cyA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZS5kZXRhaWxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgY29kZS5kZXRhaWxcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGUubWVzc2FnZVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon8J+aq+mjjumZqScsXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICB1cmw6JCgn5qCH6K6w6K+l6KeE5YiZ5Li66aOO6ZmpP+mjjumZqeinhOWImeaXoOazleiiq+WvvOWFpScpLmNvbmZpcm0oKGlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKT0+e1xcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc1NhZmUoZmFsc2UsbWFuX3J1bGVfc2FmZSk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifinIXmraPluLgnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uuato+W4uD8nKS5jb25maXJtKChpZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSk9PntcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNTYWZlKHRydWUsbWFuX3J1bGVfc2FmZSk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifimaXpnZ7kvJjotKgnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uumdnuS8mOi0qD8nKS5jb25maXJtKChpZCxtYW5fcnVsZV9nb29kLHNldElzR29vZCk9PntcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNHb29kKGZhbHNlLG1hbl9ydWxlX2dvb2QpO1xcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9nb29kLHNldElzR29vZClcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon8J+SluS8mOi0qCcsXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICB1cmw6JCgn5qCH6K6w6K+l6KeE5YiZ5Li65LyY6LSoPycpLmNvbmZpcm0oKGlkLG1hbl9ydWxlX2dvb2Qsc2V0SXNHb29kKT0+e1xcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc0dvb2QodHJ1ZSxtYW5fcnVsZV9nb29kKTtcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0sZGF0YUl0ZW0uaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpXFxuICAgIH0pO1xcbn1cXG5cXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmdvb2RfbnVtLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+i1ni5zdmdcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfM1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9NYWtlQWNvbW1lbnQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWVcXG4gICAgfVxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBkYXRhSXRlbS5iYWRfbnVtLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+i4qS5zdmdcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfM1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9NYWtlQWNvbW1lbnQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWUsXFxuICAgICAgICBkZWZhdWx0VHlwZTpcXFwiYmFkXFxcIlxcbiAgICB9XFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLor4TorrpcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+ivhOiuui5zdmdcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfM1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9NYWtlQWNvbW1lbnQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWVcXG4gICAgfVxcbn0pO1xcbmxldCB0b3RhbFN1bSA9IGRhdGFJdGVtLmdvb2RfbnVtICsgZGF0YUl0ZW0uYmFkX251bTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuivhOiuuihcXFwiICsgdG90YWxTdW0gKyBcXFwiKVxcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChodG1sVGFnKFxcXCJ1XFxcIiwgXFxcIuafpeeci+WFqOmDqOivhOiuuiA+XFxcIikpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9Db21tZW50XFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHkjZnlwYWdlI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICB0b3RhbFN1bTogdG90YWxTdW0sXFxuICAgICAgICBub19hY3RpdmU6IGZhbHNlXFxuICAgIH1cXG59KTtcXG4vL2NvbnN0IGxvbmdlc3RTdW09MTIwO1xcbmxldCBpY29uID0ge1xcbiAgICBcXFwiZ29vZFxcXCI6IFxcXCLwn5GNXFxcIixcXG4gICAgXFxcImJhZFxcXCI6IFxcXCLwn5GOXFxcIixcXG4gICAgXFxcInJlcGx5XFxcIjpcXFwi5byA5Y+R6ICF8J+Xo1xcXCJcXG59XFxuaWYgKHRvdGFsU3VtID09PSAwKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuS4gOadoeivhOiuuuS5n+ayoeacie+8jOW/q+adpeaKouaymeWPkeWQp++8gTwvaDU+XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICB9KTtcXG59IGVsc2Uge1xcbiAgICBsZXQgY29tbWVudExpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmRpc19nZXQgKyBkYXRhSXRlbS5pZCArIFxcXCI/bGltaXQ9NVxcXCIpKS5yZXN1bHQ7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXG4gICAgICAgIGxldCBSZXBseSA9IGl0ZW0uZGlzY3Vzc190eXBlPT09XFxcInJlcGx5XFxcIiYmaXRlbS5yZXBseV90b19uYW1lIT09ZmFsc2UmJml0ZW0ucmVwbHlfdG9faWQhPT1mYWxzZT9cXFwi4oCY4oCY5Zue5aSNQFxcXCIraXRlbS5yZXBseV90b19uYW1lK1xcXCIgI1xcXCIraXRlbS5kaXNjdXNzX2lkK1xcXCLigJnigJlcXFxcblxcXCI6XFxcIlxcXCI7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUgKyBcXFwiJm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9J2dyYXknPjxzbWFsbD4jXFxcIiArIGl0ZW0uaWQgKyBcXFwiPC9zbWFsbD48Zm9udD5cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgICAgICAvL3VybDogXFxcInRvYXN0Oi8vXFxcIiArIGl0ZW0ucXEsXFxuICAgICAgICAgICAgdXJsOlxcXCJtcXF3cGE6Ly9pbS9jaGF0P2NoYXRfdHlwZT13cGEmdWluPVxcXCIraXRlbS5xcSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5kaXNjdXNzX3RleHQsXFxuICAgICAgICAgICAgZGVzYzogUmVwbHkraXRlbS5jcmVhdGVfZGF0ZSArIFxcXCLCt1xcXCIgKyBpY29uW2l0ZW0uZGlzY3Vzc190eXBlXSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgICAgICAgbmFtZTppdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgIHR5cGU6XFxcImxvbmdfdGV4dFxcXCIsXFxuICAgICAgICAgICAgICAgIHRleHQ6aXRlbS5kaXNjdXNzX3RleHRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxufVxcblxcbnNldFJlc3VsdChkYXRhKTtcIixcImdyb3VwXCI6XCIj77iP4oOj6YGT6ZW/6LWE5rqQXCIsXCJ1YVwiOlwibW9iaWxlXCIsXCJwcmVSdWxlXCI6XCIkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9saWJzP3J1bGU96YGT6ZW/5LuT5bqTUHJvJyk7XCIsXCJwYWdlc1wiOlwiW3tcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuW3peWFt1xcXCIsXFxcInBhdGhcXFwiOlxcXCJ1dGlsaXlcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5sZXQgaG9zdCA9IFxcXFxcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzXFxcXFxcXCI7XFxcXG4vL2xldCBob3N0ID0gXFxcXFxcXCJodHRwOi8vMTkyLjE2OC4zMS40OTo4MDc5XFxcXFxcXCI7XFxcXG5sZXQgaG9tZSA9IGJhc2U2NERlY29kZShcXFxcXFxcImFHbHJaWEk2THk5b2IyMWxcXFxcXFxcIik7XFxcXG52YXIgYXBpID0ge1xcXFxuICAgIGhvc3Q6IGhvc3QrXFxcXFxcXCIvaGlrZXJ1bGVcXFxcXFxcIixcXFxcbiAgICBub3RpY2VVcmw6XFxcXFxcXCIvbm90aWNlL2dldFxcXFxcXFwiLC8v6I635Y+W5LuT5bqT5YWs5ZGKXFxcXG4gICAgdXNlcnNVcmw6IFxcXFxcXFwiL2Rldi91c2Vycz9vcmRlcj1cXFxcXFxcIiwgLy/nlKjmiLfliJfooahcXFxcbiAgICBydWxlQ291bnRVcmw6IFxcXFxcXFwiL2Rldi9ydWxlY291bnRcXFxcXFxcIiwgLy/ojrflj5bop4TliJnmlbDph49cXFxcbiAgICBydWxlc1VybDogXFxcXFxcXCIvZGV2L2dldFxcXFxcXFwiLCAvL+eUqOaIt+WvueW6lOeahOinhOWImeWIl+ihqOS7heS7heiOt+WPluWFrOW8gFxcXFxuICAgIHJ1bGVzQWxsVXJsOiBcXFxcXFxcIi9kZXYvZ2V0YWxsXFxcXFxcXCIsIC8v5byA5Y+R6ICF5a+55bqU55qE6KeE5YiZ5YiX6KGo5Y+v6I635Y+W56eB5pyJXFxcXG4gICAgZGV2U2VsZjonL2Rldi9nZXRzZWxmJywvL+iOt+WPluW8gOWPkeiAheS/oeaBr1xcXFxuICAgIG1hbkNhblVwbG9hZDonL3NldF9jYW5fdXBsb2FkLycsLy/otoXnrqHorr7nva7lvIDlj5HogIXmmK/lkKblj6/kuIrkvKBcXFxcbiAgICBtYW5SdWxlU2FmZTonL3NldF9ydWxlX3NhZmUvJywvL+i2heeuoeiuvue9ruinhOWImeWuieWFqOaAp1xcXFxuICAgIG1hblJ1bGVHb29kOicvc2V0X3J1bGVfZ29vZC8nLC8v6LaF566h6K6+572u6KeE5YiZ5LyY6LSo5oCnXFxcXG4gICAgaW1wb3J0VXJsOiBcXFxcXFxcIi9ydWxlbGlzdC5qc29uP2lkPVxcXFxcXFwiLCAvL+inhOWImeivpuaDheWPr+WvvOWFpVxcXFxuICAgIGluZm9TZXRVcmw6IFxcXFxcXFwiL2Rldi9zZXRfaW5mb1xcXFxcXFwiLFxcXFxuICAgIG5vd0NvblVybDogXFxcXFxcXCIvc3FsX2luZm8vZ2V0X25vd19jb25cXFxcXFxcIixcXFxcbiAgICBpbmZvR2V0VXJsOiBcXFxcXFxcIi9kZXYvZ2V0X2luZm8/bmFtZT1cXFxcXFxcIixcXFxcbiAgICBzZXR0aW5nc0dldFVybDogXFxcXFxcXCIvZGV2L2dldF9zZXR0aW5ncz9uYW1lPVxcXFxcXFwiLFxcXFxuICAgIGd1cGxvYWQ6IFxcXFxcXFwiL2Rldi9ndXBsb2FkXFxcXFxcXCIsXFxcXG4gICAgZ3RpbWVvdmVyOiBcXFxcXFxcIi9kZXYvZ3RpbWVvdmVyXFxcXFxcXCIsXFxcXG4gICAgZ2V0YnlpZDogXFxcXFxcXCIvZGV2L2dldGJ5aWRcXFxcXFxcIixcXFxcbiAgICBydWxlTGlzdEpzb246IFxcXFxcXFwiL3J1bGVsaXN0Lmpzb25cXFxcXFxcIixcXFxcbiAgICBhdXRoOiBcXFxcXFxcIi9kZXYvZ2V0X2F1dGhcXFxcXFxcIixcXFxcbiAgICB0aW1lb3ZlcjogXFxcXFxcXCIvZGV2L3RpbWVvdmVyXFxcXFxcXCIsXFxcXG4gICAgc2hhcmU6IFxcXFxcXFwiL2Rldi9zaGFyZVxcXFxcXFwiLFxcXFxuICAgIGdlbkF1dGg6IFxcXFxcXFwiL2Rldi9nZW5fYXV0aFxcXFxcXFwiLFxcXFxuICAgIGRlbGV0ZVVybDogXFxcXFxcXCIvZGV2L2RlbGV0ZVxcXFxcXFwiLFxcXFxuICAgIGpzb25MaXN0OiBcXFxcXFxcIi9kZXYvanNvbl9saXN0XFxcXFxcXCIsXFxcXG4gICAgc2VhcmNoOiBcXFxcXFxcIi9kZXYvc2VhcmNoXFxcXFxcXCIsXFxcXG4gICAgbmV3X2RldjogXFxcXFxcXCIvZGV2X3JlZ2lzdC9uZXdcXFxcXFxcIixcXFxcbiAgICBuZXdfZ2V0SWQ6IFxcXFxcXFwiL2Rldl9yZWdpc3QvZ2V0X2lkXFxcXFxcXCIsXFxcXG4gICAgbmV3X2NvbmZpcm06IFxcXFxcXFwiL2Rldl9yZWdpc3QvY29uZmlybVxcXFxcXFwiLFxcXFxuICAgIG1vZGlmeV9wd2Q6IFxcXFxcXFwiL21vZGlmeS9wYXNzd29yZFxcXFxcXFwiLFxcXFxuICAgIG1vZGlmeV9uYW1lOiBcXFxcXFxcIi9tb2RpZnkvbmFtZVxcXFxcXFwiLFxcXFxuICAgIG1vZGlmeV9hdmE6IFxcXFxcXFwiL21vZGlmeS9hdmF0YXJcXFxcXFxcIixcXFxcbiAgICB1c2VyOiBcXFxcXFxcIi9kZXYvdXNlci9cXFxcXFxcIixcXFxcbiAgICBnZXRfcnVsZV9ub3RlOiBcXFxcXFxcIi9tb2RpZnkvZ2V0X3J1bGVfbm90ZS9cXFxcXFxcIixcXFxcbiAgICBzZXRfcnVsZV9waWM6IFxcXFxcXFwiL21vZGlmeS9ydWxlX3BpYy9cXFxcXFxcIixcXFxcbiAgICBzZXRfcnVsZV9ub3RlOiBcXFxcXFxcIi9tb2RpZnkvcnVsZV9ub3RlL1xcXFxcXFwiXFxcXG59XFxcXG4kLmV4cG9ydHMucmFuZ2UgPSBmdW5jdGlvbihtLCBuKSB7XFxcXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtIC0gbiArIDEpICsgbik7XFxcXG59XFxcXG4kLmV4cG9ydHMubWFwQ29sVHlwZSA9IGZ1bmN0aW9uKHRhcmdldCwgdHlwZSwgbikge1xcXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XFxcXG4gICAgICAgIHRhcmdldC5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiB0eXBlXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbn1cXFxcbnZhciBnZXRBcGkgPSBmdW5jdGlvbihrKSB7XFxcXG4gICAgcmV0dXJuIGFwaS5ob3N0ICsgYXBpW2tdO1xcXFxufTtcXFxcbiQuZXhwb3J0cy5nZXRBcGk9Z2V0QXBpO1xcXFxuJC5leHBvcnRzLm1kPWdldEFwaSgnaW1wb3J0VXJsJykrXFxcXFxcXCIzMTg3XFxcXFxcXCI7XFxcXG4kLmV4cG9ydHMubG9jYWxSdWxlVmVyID0gZnVuY3Rpb24obG9jYWxSdWxlTGlzdCwgcnVsZSkge1xcXFxuICAgIGxldCBsb2NhbFJ1bGU7XFxcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbFJ1bGVMaXN0Lmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgIGxldCBpdGVtID0gbG9jYWxSdWxlTGlzdFtpXTtcXFxcbiAgICAgICAgbGV0IGF1ID0gaXRlbS5hdXRob3IgfHwgXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgbGV0IHNhbWVBdT1hdS5sZW5ndGggPiAwICYmIHJ1bGUuYXV0aG9yLmluY2x1ZGVzKGF1KTtcXFxcbiAgICAgICAgc2FtZUF1PXRydWU7Ly/kuI3liKTmlq3kvZzogIXpu5jorqTkuLp0cnVlXFxcXG4gICAgICAgIGlmIChpdGVtLnRpdGxlID09PSBydWxlLm5hbWUgJiYgc2FtZUF1KSB7XFxcXG4gICAgICAgICAgICBsb2NhbFJ1bGUgPSBpdGVtO1xcXFxuICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgaWYgKGxvY2FsUnVsZSA9PT0gdm9pZCAwKSB7XFxcXG4gICAgICAgIHJldHVybiAtMTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICByZXR1cm4gbG9jYWxSdWxlLnZlcnNpb247XFxcXG4gICAgfVxcXFxufVxcXFxuJC5leHBvcnRzLmNvbG9yID0gZnVuY3Rpb24odGV4dCwgY29sb3IpIHtcXFxcbiAgICB0ZXh0ICs9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgaWYgKHRleHQuaW5kZXhPZihcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiKSA9PT0gMCkge1xcXFxuICAgICAgICB0ZXh0LnJlcGxhY2UoXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBcXFxcXFxcIuKAnOKAnOKAneKAnTxmb250IGNvbG9yPSdcXFxcXFxcIiArIGNvbG9yICsgXFxcXFxcXCInPlxcXFxcXFwiICsgdGV4dCArIFxcXFxcXFwiPC9mb250PlxcXFxcXFwiO1xcXFxufVxcXFxuXFxcXG4kLmV4cG9ydHMuc2xlZXAgPSBmdW5jdGlvbih0aW1lb3V0KXtcXFxcbiAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKHRpbWVvdXQpO1xcXFxufVxcXFxuZnVuY3Rpb24gaHRtbFRhZyh0YWcsIHRleHQpIHtcXFxcbiAgICB0ZXh0ICs9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgaWYgKHRleHQuaW5kZXhPZihcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiKSA9PT0gMCkge1xcXFxuICAgICAgICB0ZXh0LnJlcGxhY2UoXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgXFxcXFxcXCI8XFxcXFxcXCIgKyB0YWcgKyBcXFxcXFxcIj5cXFxcXFxcIiArIHRleHQgKyBcXFxcXFxcIjwvXFxcXFxcXCIgKyB0YWcgKyBcXFxcXFxcIj5cXFxcXFxcIjtcXFxcblxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXROb3dGb3JtYXREYXRlKCkge1xcXFxuICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpO1xcXFxuICAgICAgICAgICAgbGV0IHNlcGVyYXRvcjEgPSBcXFxcXFxcIi1cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGxldCBzZXBlcmF0b3IyID0gXFxcXFxcXCI6XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBsZXQgbW9udGggPSBkYXRlLmdldE1vbnRoKCkgKyAxO1xcXFxuICAgICAgICAgICAgbGV0IHN0ckRhdGUgPSBkYXRlLmdldERhdGUoKTtcXFxcbiAgICAgICAgICAgIGxldCBzdHJIb3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcXFxcbiAgICAgICAgICAgIGxldCBzdHJNaW51dGVzID0gZGF0ZS5nZXRNaW51dGVzKCk7XFxcXG4gICAgICAgICAgICBsZXQgc3RyU2Vjb25kcyA9IGRhdGUuZ2V0U2Vjb25kcygpKzE7XFxcXG4gICAgICAgICAgICBpZiAobW9udGggPj0gMSAmJiBtb250aCA8PSA5KSB7XFxcXG4gICAgICAgICAgICAgICAgbW9udGggPSBcXFxcXFxcIjBcXFxcXFxcIiArIG1vbnRoXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZiAoc3RyRGF0ZSA+PSAwICYmIHN0ckRhdGUgPD0gOSkge1xcXFxuICAgICAgICAgICAgICAgIHN0ckRhdGUgPSBcXFxcXFxcIjBcXFxcXFxcIiArIHN0ckRhdGVcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlmIChzdHJIb3VycyA+PSAwICYmIHN0ckhvdXJzIDw9IDkpIHtcXFxcbiAgICAgICAgICAgICAgICBzdHJIb3VycyA9IFxcXFxcXFwiMFxcXFxcXFwiICsgc3RySG91cnNcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlmIChzdHJNaW51dGVzID49IDAgJiYgc3RyTWludXRlcyA8PSA5KSB7XFxcXG4gICAgICAgICAgICAgICAgc3RyTWludXRlcyA9IFxcXFxcXFwiMFxcXFxcXFwiICsgc3RyTWludXRlc1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYgKHN0clNlY29uZHMgPj0gMCAmJiBzdHJTZWNvbmRzIDw9IDkpIHtcXFxcbiAgICAgICAgICAgICAgICBzdHJTZWNvbmRzID0gXFxcXFxcXCIwXFxcXFxcXCIgKyBzdHJTZWNvbmRzXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAvL2xldCBjdXJyZW50ZGF0ZSA9IGRhdGUuZ2V0RnVsbFllYXIoKSArIHNlcGVyYXRvcjEgKyBtb250aCArIHNlcGVyYXRvcjEgKyBzdHJEYXRlICsgXFxcXFxcXCIgXFxcXFxcXCIgKyBzdHJIb3VycyArIHNlcGVyYXRvcjIgKyBzdHJNaW51dGVzICsgc2VwZXJhdG9yMiArIHN0clNlY29uZHM7XFxcXG4gICAgICAgICAgICBsZXQgY3VycmVudGRhdGUgPSAoZGF0ZS5nZXRGdWxsWWVhcigpLTIwMjApKycnKyBtb250aCArJycrIHN0ckRhdGUgKycnKyBzdHJIb3VycysnJyArIHN0ck1pbnV0ZXMgKycnKyBNYXRoLmNlaWwoc3RyU2Vjb25kcy83KTtcXFxcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChjdXJyZW50ZGF0ZSlcXFxcbiAgICAgICAgfVxcXFxuJC5leHBvcnRzLmdldE5vd0Zvcm1hdERhdGUgPSBnZXROb3dGb3JtYXREYXRlO1xcXFxuJC5leHBvcnRzLmh0bWxUYWcgPSBodG1sVGFnO1xcXFxuJC5leHBvcnRzLnNtYWxsID0gZnVuY3Rpb24odGV4dCkge1xcXFxuICAgIHJldHVybiBodG1sVGFnKFxcXFxcXFwic21hbGxcXFxcXFxcIiwgdGV4dCk7XFxcXG59XFxcXG4kLmV4cG9ydHMuZ2V0RmlsZSA9IGZ1bmN0aW9uKCkge1xcXFxuICAgIHZhciBGaWxlID0gcmVxdWVzdChcXFxcXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwie31cXFxcXFxcIjtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShGaWxlKTtcXFxcbiAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcXFxcXCIsIFxcXFxcXFwie31cXFxcXFxcIik7XFxcXG4gICAgICAgIHJldHVybiB7fTtcXFxcbiAgICB9XFxcXG59XFxcXG4kLmV4cG9ydHMuZ2V0VXNlckRhdGUgPWZ1bmN0aW9uKCl7XFxcXG4gICAgdmFyIEZpbGUgPSByZXF1ZXN0KFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSQS5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIjtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShGaWxlKTtcXFxcbiAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUkEuanNvblxcXFxcXFwiLCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICByZXR1cm4gW107XFxcXG4gICAgfVxcXFxufVxcXFxuJC5leHBvcnRzLmV4aXN0RmlsZSA9IGZ1bmN0aW9uKHNwYXRoLCBpcGF0aCwgaGVhZGVycykge1xcXFxuICAgIGxldCBzY29kZSA9IHJlcXVlc3Qoc3BhdGgpO1xcXFxuICAgIGlmICghc2NvZGUpIHtcXFxcbiAgICAgICAgd3JpdGVGaWxlKHNwYXRoLCByZXF1ZXN0KGlwYXRoLCBoZWFkZXJzKSk7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5sZXQgbmV3QXBpID0ge1xcXFxuICAgIFxcXFxcXFwiZGlzX25ld1xcXFxcXFwiOiBcXFxcXFxcIi9oaWtlcnVsZS9uZXdfcnVsZV9kaXNjdXNzL1xcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiZGlzX3ZlcmlmeVxcXFxcXFwiOiBcXFxcXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvZ2V0X3l6bVxcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiZGlzX2dldFxcXFxcXFwiOiBcXFxcXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJkaXNfc2V0XFxcXFxcXCI6IFxcXFxcXFwiL2hpa2VydWxlL21vZGlmeS9jYW5fZGlzY3Vzcy9cXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImRpc19uZXdfdXNlclxcXFxcXFwiOiBcXFxcXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvbmV3X3VzZXJcXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImRpc19sb2dpblxcXFxcXFwiOlxcXFxcXFwiL2hpa2VydWxlL3J1bGVfZGlzY3Vzcy91c2VyX2xvZ2luXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJkaXNfZGV2X2Rpc2N1c3NcXFxcXFxcIjpcXFxcXFxcIi9oaWtlcnVsZS9tb2RpZnkvZGV2X2Nhbl9kaXNjdXNzXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJkaXNfZGV2X2NvbnRyb2xcXFxcXFxcIjpcXFxcXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvcmVtb3ZlL1xcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiYWxsX3J1bGVcXFxcXFxcIjpcXFxcXFxcIi9oaWtlcnVsZS9nZXRfcnVsZXNcXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImRpc19nZXRfcmVwbHlcXFxcXFxcIjpcXFxcXFxcIi9oaWtlcnVsZS9nZXRfcmVwbHlfcnVsZV9kaXNjdXNzXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJkaXNfcmVwbHlcXFxcXFxcIjpcXFxcXFxcIi9oaWtlcnVsZS9kZXZfbmV3X3J1bGVfZGlzY3Vzcy9cXFxcXFxcIixcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gc2V0QXBpKG9iamVjdCkge1xcXFxuICAgIGxldCB0YXJnZXQgPSB7fTtcXFxcbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqZWN0KSB7XFxcXG4gICAgICAgIHRhcmdldFtrZXldPWhvc3Qrb2JqZWN0W2tleV1cXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIHRhcmdldDtcXFxcbn1cXFxcblxcXFxuJC5leHBvcnRzLmFwaSA9IHNldEFwaShuZXdBcGkpO1xcXFxuJC5leHBvcnRzLmFwaS5ob3N0PWhvc3Q7XFxcXG4kLmV4cG9ydHMuYXBpLmhvbWU9aG9tZTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlvIDlj5HogIXnmbvlvZVcXFwiLFxcXCJwYXRoXFxcIjpcXFwiZGV2TG9naW5cXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLlvIDlj5HogIXnmbvlvZVcXFxcXFxcIik7XFxcXG5jb25zdCB7XFxcXG4gICAgZ2V0QXBpLFxcXFxuICAgIGh0bWxUYWcsXFxcXG4gICAgbWFwQ29sVHlwZSxcXFxcbiAgICBzbWFsbCxcXFxcbmdldEZpbGVcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxudmFyIGRhdGEgPSBbXTtcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKT0+e1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlVXNlcm5hbWVcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2VQYXNzd29yZFxcXFxcXFwiKTtcXFxcbn0pKVxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+i0puWPtycsXFxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZVVzZXJuYW1lJywnJyksXFxcXG4gICAgICAgIHR5cGU6XFxcXFxcXCJudW1iZXJcXFxcXFxcIixcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2VVc2VybmFtZVxcXFxcXFwiLGlucHV0KSdcXFxcbiAgICB9XFxcXG59LCB7XFxcXG4gICAgdGl0bGU6ICflr4bnoIEnLFxcXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2VQYXNzd29yZCcsICcnKSxcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiLFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZVBhc3N3b3JkXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwiJm5ic3A7Jm5ic3A7PGEgaHJlZj0naGlrZXI6Ly9wYWdlL1JlZ2lzdGVyJz7ms6jlhow8L2E+XFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxufSk7XFxcXG5tYXBDb2xUeXBlKGRhdGEsIFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiLCAxKTtcXFxcbmxldCB1c2VyID0gZ2V0RmlsZSgpO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogaHRtbFRhZyhcXFxcXFxcImJcXFxcXFxcIiwgXFxcXFxcXCLnmbvlvZVcXFxcXFxcIiksXFxcXG4gICAgdXJsOiAkKCkubGF6eVJ1bGUoKHVybCwgZik9PiB7XFxcXG4gICAgICAgIGxldCB1c2VybmFtZSA9IGdldFZhcignV2FyZWhvdXNlVXNlcm5hbWUnLCAnJyksXFxcXG4gICAgICAgICAgICBwYXNzd29yZCA9IGdldFZhcignV2FyZWhvdXNlUGFzc3dvcmQnLCAnJyk7XFxcXG4gICAgICAgIGlmKHVzZXJuYW1lID09PSBcXFxcXFxcIlxcXFxcXFwiICYmIHBhc3N3b3JkID09PVxcXFxcXFwiXFxcXFxcXCIpe1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/otKblj7flkozlr4bnoIHkuI3og73kuLrnqbpcXFxcXFxcIlxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBteVVybCA9IHVybCArICc/cXE9JyArIHVzZXJuYW1lICsgJyZwYXNzd29yZD0nICsgcGFzc3dvcmQ7XFxcXG4gICAgICAgIGxldCBjb2RlX3N0ciA9IHJlcXVlc3QobXlVcmwpO1xcXFxuICAgICAgICBsZXQgY29kZSA9IEpTT04ucGFyc2UoY29kZV9zdHIpO1xcXFxuICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT0gMCkge1xcXFxuICAgICAgICAgICAgZi51c2VybmFtZT11c2VybmFtZTtcXFxcbiAgICAgICAgICAgIGYucGFzc3dvcmQ9cGFzc3dvcmRcXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb24nLCBKU09OLnN0cmluZ2lmeShmKSk7XFxcXG4gICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+eZu+W9leaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6LSm5Y+35oiW5a+G56CB6ZSZ6K+vXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LCBnZXRBcGkoXFxcXFxcXCJydWxlc0FsbFVybFxcXFxcXFwiKSx1c2VyKSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxcXG59KTtcXFxcbnNldFJlc3VsdChkYXRhKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwiaWNvbl8yX3JvdW5kXFxcIixcXFwibmFtZVxcXCI6XFxcIuW8gOWPkeiAheeuoeeQhlxcXCIsXFxcInBhdGhcXFwiOlxcXCJkZXZNYW5hZ2VcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLop4TliJnnrqHnkIZcXFxcXFxcIik7XFxcXG5cXFxcbmNvbnN0IHtcXFxcbiAgICBnZXRBcGksXFxcXG4gICAgY29sb3IsXFxcXG4gICAgc21hbGwsXFxcXG4gICAgZ2V0RmlsZSxcXFxcbiAgICBleGlzdEZpbGUsXFxcXG4gICAgbWFwQ29sVHlwZSxcXFxcbiAgICBhcGlcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxubGV0IHtcXFxcbiAgICBkZXZcXFxcbn0gPSBNWV9QQVJBTVM7XFxcXG5sZXQge1xcXFxuICAgIHVzZXJuYW1lLFxcXFxuICAgIHBhc3N3b3JkLFxcXFxufSA9IGdldEZpbGUoKTtcXFxcbi8vZXhpc3RGaWxlKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwv5byA5Y+R6ICF5YiG5LqrLmh0bWxcXFxcXFxcIiwgXFxcXFxcXCJodHRwczovL2VycC5zY3dpbmJhby5jb20vaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MzlcXFxcXFxcIik7XFxcXG5sZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXFxcXFwicnVsZXNBbGxVcmxcXFxcXFxcIikgKyAnP3FxPScgKyB1c2VybmFtZSArICcmcGFzc3dvcmQ9JyArIHBhc3N3b3JkKSkucmVzdWx0O1xcXFxubGV0IE1PQklMRV9VQSA9ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNS4wOyBTTS1HOTAwUCBCdWlsZC9MUlgyMVQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OC4wLjQzMjQuMTQ2IE1vYmlsZSBTYWZhcmkvNTM3LjM2JztcXFxcbmxldCBpbmZvU2V0VXJsID0gZ2V0QXBpKFxcXFxcXFwiaW5mb1NldFVybFxcXFxcXFwiKTtcXFxcbmxldCBpbmZvR2V0VXJsID0gZ2V0QXBpKFxcXFxcXFwiaW5mb0dldFVybFxcXFxcXFwiKSArIHVzZXJuYW1lO1xcXFxubGV0IHNldHRpbmdzR2V0VXJsID0gZ2V0QXBpKFxcXFxcXFwic2V0dGluZ3NHZXRVcmxcXFxcXFxcIikgKyB1c2VybmFtZTtcXFxcbnB1dE15VmFyKFxcXFxcXFwiZGV2X3NldF9pbmZvXFxcXFxcXCIsIFt1c2VybmFtZSwgcGFzc3dvcmQsIGluZm9TZXRVcmwsIE1PQklMRV9VQSwgaW5mb0dldFVybF0uam9pbihcXFxcXFxcIiQkXFxcXFxcXCIpKTtcXFxcbmxldCBkYXRhID0gW107XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGJpZz7ku5PlupPorr7nva48L2JpZz4mbmJzcDsmbmJzcDsmbmJzcDs8c21hbGw+PHU+77yIIOS4quS6uui1hOaWmSA+77yJPC91Pjwvc21hbGw+JyxcXFxcbiAgICBkZXNjOiAn4oCc4oCc4oCd4oCd5oKo5YWx5pyJIDxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICNmZjcwMDBcXFxcXFxcIj4nICsgcnVsZUxpc3QubGVuZ3RoICsgJzwvc3Bhbj4nICsgXFxcXFxcXCIg5p2h6KeE5YiZ44CCXFxcXFxcXFxu54K55Ye76KeE5YiZ5Y+v6L+b6KGM5YiG5Lqr44CB5Yig6Zmk44CB5a+85YWl5pON5L2c5Y+K5p+l55yL6K+m5oOFXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9QZXJzb25hbERhdGEjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6e2lkOmRldi5pZH0sXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnXFxcXG59KTtcXFxcbm1hcENvbFR5cGUoZGF0YSwgXFxcXFxcXCJsaW5lXFxcXFxcXCIsIDIpO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogc21hbGwoY29sb3IoXFxcXFxcXCLmm7TmlLnlhazlkYrinI1cXFxcXFxcIiwgXFxcXFxcXCIjMzRiMWZmXFxcXFxcXCIpKSxcXFxcbiAgICAvLyB1cmw6IFxcXFxcXFwieDU6Ly9maWxlOi8vL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9ydWxlcy9kekhvdXNlL2h0bWwvZGV2X2luZm9fZWRpdC5odG1sXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9kZXZJbmZvRWRpdFxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBzbWFsbChjb2xvcihcXFxcXFxcIuabtOWkmuWIhuS6q/Cfk7JcXFxcXFxcIiwgXFxcXFxcXCIjMzRiMWZmXFxcXFxcXCIpKSxcXFxcbiAgICAvL3VybDogXFxcXFxcXCJ4NTovL2ZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL3J1bGVzL2R6SG91c2UvaHRtbC/lvIDlj5HogIXliIbkuqsuaHRtbFxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvbW9yZVNoYXJlXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzMnXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IHNtYWxsKGNvbG9yKFxcXFxcXFwi5Y2H57qn5L6d6LWW8J+TpVxcXFxcXFwiLCBcXFxcXFxcIiMzNGIxZmZcXFxcXFxcIikpLFxcXFxuICAgIHVybDogJChcXFxcXFxcIuWNh+e6p+S8mumHjeaWsOS7juS7k+W6k+aLieWPluebuOWFs+eahOmdmeaAgemhtemdouWIsOacrOWcsFxcXFxcXFxcbuehruiupOWNh+e6p+WQlz9cXFxcXFxcIikuY29uZmlybSgoaG9zdCkgPT4ge1xcXFxuICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvaHRtbC/lvIDlj5HogIXliIbkuqsuaHRtbFxcXFxcXFwiLCByZXF1ZXN0KGhvc3QrJy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUzOScpKTtcXFxcbiAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwvZGV2X2luZm9fZWRpdC5odG1sXFxcXFxcXCIsIHJlcXVlc3QoaG9zdCsnL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NDAyJykpO1xcXFxuICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvaHRtbC9kZXZfaW5mb19nZXQuaHRtbFxcXFxcXFwiLCByZXF1ZXN0KGhvc3QrJy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTQwNCcpKTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+W3sumHjee9ruW8gOWPkeiAheWIhuS6qyznroDku4vmn6XnnIss566A5LuL57yW6L6R562J6Z2Z5oCB5paH5Lu2XFxcXFxcXCI7XFxcXG4gICAgfSxhcGkuaG9zdCksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzMnXFxcXG59KTtcXFxcbmxldCBkZXZTZXRCYWNrO1xcXFxudHJ5IHtcXFxcbiAgICBkZXZTZXRCYWNrID0gSlNPTi5wYXJzZShyZXF1ZXN0KHNldHRpbmdzR2V0VXJsKSk7XFxcXG59IGNhdGNoIChlKSB7XFxcXG4gICAgZGV2U2V0QmFjayA9IHt9O1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBzZXRTZXR0aW5nSXRlbShiYXNpYykge1xcXFxuICAgIGxldCB0ZW1wID0ge1xcXFxuICAgICAgICB0aXRsZTogYmFzaWMudGl0bGUsXFxcXG4gICAgICAgIGNvbF90eXBlOiBiYXNpYy5jb2xfdHlwZSxcXFxcbiAgICAgICAgdXJsOiAkKGJhc2ljLmNvbmZpcm0pLmNvbmZpcm0oKHVybCwgbXNnKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgYmFjayA9IHJlcXVlc3QodXJsKTtcXFxcbiAgICAgICAgICAgIGxldCByZXQgPSBKU09OLnBhcnNlKGJhY2spO1xcXFxuICAgICAgICAgICAgaWYgKHJldC5zdGF0dXMgPT0gMCkge1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyBtc2dbMF07XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgbXNnWzFdICsgXFxcXFxcXCJcXFxcXFxcXG5cXFxcXFxcIiArIHJldC5kZXRhaWw7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0sIGJhc2ljLnVybCwgYmFzaWMubXNnKVxcXFxuICAgIH07XFxcXG4gICAgcmV0dXJuIHRlbXA7XFxcXG59XFxcXG5pZiAoZGV2U2V0QmFjay5zdGF0dXMgPT0gMCkge1xcXFxuICAgIGxldCBkZXZTZXR0aW5ncyA9IGRldlNldEJhY2sucmVzdWx0O1xcXFxuICAgIGxldCBzaGFyZSA9IHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8zXFxcXFxcXCJcXFxcbiAgICB9O1xcXFxuICAgIGlmIChkZXZTZXR0aW5ncy5zaGFyZV9wdWJsaWMpIHtcXFxcbiAgICAgICAgc2hhcmUudGl0bGUgPSBzbWFsbChjb2xvcihcXFxcXFxcIuWFrOW8gOS4iuS8oFxcXFxcXFwiLCBcXFxcXFxcImdyZWVuXFxcXFxcXCIpICsgY29sb3IoXFxcXFxcXCIo56eB6JePKVxcXFxcXFwiLCBcXFxcXFxcIiMwMGJmZmZcXFxcXFxcIikpO1xcXFxuICAgICAgICBzaGFyZS51cmwgPSBnZXRBcGkoXFxcXFxcXCJndXBsb2FkXFxcXFxcXCIpICsgXFxcXFxcXCI/cXE9XFxcXFxcXCIgKyB1c2VybmFtZSArIFxcXFxcXFwiJnBhc3N3b3JkPVxcXFxcXFwiICsgcGFzc3dvcmQgKyBcXFxcXFxcIiZmbGFnPTFcXFxcXFxcIjtcXFxcbiAgICAgICAgc2hhcmUuY29uZmlybSA9IFxcXFxcXFwi5piv5ZCm56Gu6K6k56eB6JeP5Lul5ZCO5o+Q5Lqk55qE6KeE5YiZP1xcXFxcXFwiO1xcXFxuICAgICAgICBzaGFyZS5tc2cgPSBbXFxcXFxcXCLlt7Lnp4Hol49cXFxcXFxcIiwgXFxcXFxcXCLnp4Hol4/lpLHotKVcXFxcXFxcIl07XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgc2hhcmUudGl0bGUgPSBzbWFsbChjb2xvcihcXFxcXFxcIuengeWvhuS4iuS8oFxcXFxcXFwiLCBcXFxcXFxcInJlZFxcXFxcXFwiKSArIGNvbG9yKFxcXFxcXFwiKOWFrOW8gClcXFxcXFxcIiwgXFxcXFxcXCIjYWRmZjJmXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgc2hhcmUudXJsID0gZ2V0QXBpKFxcXFxcXFwiZ3VwbG9hZFxcXFxcXFwiKSArIFxcXFxcXFwiP3FxPVxcXFxcXFwiICsgdXNlcm5hbWUgKyBcXFxcXFxcIiZwYXNzd29yZD1cXFxcXFxcIiArIHBhc3N3b3JkO1xcXFxuICAgICAgICBzaGFyZS5jb25maXJtID0gXFxcXFxcXCLmmK/lkKbnoa7orqTlhazlvIDku6XlkI7mj5DkuqTnmoTop4TliJk/XFxcXFxcXCI7XFxcXG4gICAgICAgIHNoYXJlLm1zZyA9IFtcXFxcXFxcIuW3suWFrOW8gFxcXFxcXFwiLCBcXFxcXFxcIuWFrOW8gOWksei0pVxcXFxcXFwiXTtcXFxcbiAgICB9XFxcXG4gICAgZGF0YS5wdXNoKHNldFNldHRpbmdJdGVtKHNoYXJlKSk7XFxcXG4gICAgbGV0IHRpbWVPdmVyID0ge1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIlxcXFxuICAgIH07XFxcXG4gICAgaWYgKGRldlNldHRpbmdzLnRpbWVfb3Zlcikge1xcXFxuICAgICAgICB0aW1lT3Zlci50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXFxcXFwi55+t5pe256eY6ZKlXFxcXFxcXCIsIFxcXFxcXFwiZ3JlZW5cXFxcXFxcIikgKyBjb2xvcihcXFxcXFxcIijmsLjkuYUpXFxcXFxcXCIsIFxcXFxcXFwiIzAwYmZmZlxcXFxcXFwiKSk7XFxcXG4gICAgICAgIHRpbWVPdmVyLnVybCA9IGdldEFwaShcXFxcXFxcImd0aW1lb3ZlclxcXFxcXFwiKSArIFxcXFxcXFwiP3FxPVxcXFxcXFwiICsgdXNlcm5hbWUgKyBcXFxcXFxcIiZwYXNzd29yZD1cXFxcXFxcIiArIHBhc3N3b3JkICsgXFxcXFxcXCImZmxhZz0xXFxcXFxcXCI7XFxcXG4gICAgICAgIHRpbWVPdmVyLmNvbmZpcm0gPSBcXFxcXFxcIuaYr+WQpuehruiupOS7peWQjueahOengeiXj+inhOWImeWIhuS6q+S4jei/h+acnz9cXFxcXFxcIjtcXFxcbiAgICAgICAgdGltZU92ZXIubXNnID0gW1xcXFxcXFwi5bey6K6+5Li65rC45LmFXFxcXFxcXCIsIFxcXFxcXFwi6K6+5Li65rC45LmF5aSx6LSlXFxcXFxcXCJdO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIHRpbWVPdmVyLnRpdGxlID0gc21hbGwoY29sb3IoXFxcXFxcXCLmsLjkuYXnp5jpkqVcXFxcXFxcIiwgXFxcXFxcXCJyZWRcXFxcXFxcIikgKyBjb2xvcihcXFxcXFxcIijov4fmnJ8pXFxcXFxcXCIsIFxcXFxcXFwiI2FkZmYyZlxcXFxcXFwiKSk7XFxcXG4gICAgICAgIHRpbWVPdmVyLnVybCA9IGdldEFwaShcXFxcXFxcImd0aW1lb3ZlclxcXFxcXFwiKSArIFxcXFxcXFwiP3FxPVxcXFxcXFwiICsgdXNlcm5hbWUgKyBcXFxcXFxcIiZwYXNzd29yZD1cXFxcXFxcIiArIHBhc3N3b3JkO1xcXFxuICAgICAgICB0aW1lT3Zlci5jb25maXJtID0gXFxcXFxcXCLnoa7orqTopoHku6XlkI7liIbkuqvnmoTnp4Hol4/op4TliJnoh6rliqjliLDmnJ8/XFxcXFxcXCI7XFxcXG4gICAgICAgIHRpbWVPdmVyLm1zZyA9IFtcXFxcXFxcIuW3suiuvuS4uui/h+acn1xcXFxcXFwiLCBcXFxcXFxcIuiuvuS4uui/h+acn+Wksei0pVxcXFxcXFwiXTtcXFxcbiAgICB9XFxcXG4gICAgZGF0YS5wdXNoKHNldFNldHRpbmdJdGVtKHRpbWVPdmVyKSk7XFxcXG4gICAgbGV0IGRpc2N1c3MgPSB7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfM1xcXFxcXFwiXFxcXG4gICAgfTtcXFxcbiAgICBpZiAoZGV2U2V0dGluZ3MuY2FuX2Rpc2N1c3MpIHtcXFxcbiAgICAgICAgZGlzY3Vzcy50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXFxcXFwi5YWB6K646K+E6K66XFxcXFxcXCIsIFxcXFxcXFwicmVkXFxcXFxcXCIpICsgY29sb3IoXFxcXFxcXCIo5LiN6K64KVxcXFxcXFwiLCBcXFxcXFxcIiNhZGZmMmZcXFxcXFxcIikpO1xcXFxuICAgICAgICBkaXNjdXNzLnVybCA9IGFwaS5kaXNfZGV2X2Rpc2N1c3MgKyBcXFxcXFxcIj9xcT1cXFxcXFxcIiArIHVzZXJuYW1lICsgXFxcXFxcXCImcGFzc3dvcmQ9XFxcXFxcXCIgKyBwYXNzd29yZCsgXFxcXFxcXCImZmxhZz0xXFxcXFxcXCI7XFxcXG4gICAgICAgIGRpc2N1c3MuY29uZmlybSA9IFxcXFxcXFwi5piv5ZCm56Gu6K6k5Lul5ZCO5LiK5Lyg55qE6KeE5YiZ5YWB6K646K+E6K66P1xcXFxcXFwiO1xcXFxuICAgICAgICBkaXNjdXNzLm1zZyA9IFtcXFxcXFxcIuW3suiuvuS4uuS4jeiuuFxcXFxcXFwiLCBcXFxcXFxcIuiuvue9ruWksei0pVxcXFxcXFwiXTtcXFxcblxcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIGRpc2N1c3MudGl0bGUgPSBzbWFsbChjb2xvcihcXFxcXFxcIuS4jeiuuOivhOiuulxcXFxcXFwiLCBcXFxcXFxcImdyZWVuXFxcXFxcXCIpICsgY29sb3IoXFxcXFxcXCIo5YWB6K64KVxcXFxcXFwiLCBcXFxcXFxcIiMwMGJmZmZcXFxcXFxcIikpO1xcXFxuICAgICAgICBkaXNjdXNzLnVybCA9IGFwaS5kaXNfZGV2X2Rpc2N1c3MgKyBcXFxcXFxcIj9xcT1cXFxcXFxcIiArIHVzZXJuYW1lICsgXFxcXFxcXCImcGFzc3dvcmQ9XFxcXFxcXCIgKyBwYXNzd29yZDtcXFxcbiAgICAgICAgZGlzY3Vzcy5jb25maXJtID0gXFxcXFxcXCLmmK/lkKbnoa7orqTku6XlkI7kuIrkvKDnmoTop4TliJnlhYHorrjor4Torro/XFxcXFxcXCI7XFxcXG4gICAgICAgIGRpc2N1c3MubXNnID0gW1xcXFxcXFwi5bey6K6+5Li65YWB6K64XFxcXFxcXCIsIFxcXFxcXFwi6K6+572u5aSx6LSlXFxcXFxcXCJdO1xcXFxuICAgIH1cXFxcbiAgICBkYXRhLnB1c2goc2V0U2V0dGluZ0l0ZW0oZGlzY3VzcykpO1xcXFxufVxcXFxubWFwQ29sVHlwZShkYXRhLCBcXFxcXFxcImxpbmVcXFxcXFxcIiwgMik7XFxcXG5mb3IgKGxldCBpdGVtIG9mIHJ1bGVMaXN0KSB7XFxcXG4gICAgbGV0IG15X3RfZXhjb2RlMSA9ICcnO1xcXFxuICAgIGxldCBteV90X2V4Y29kZTIgPSAnJztcXFxcbiAgICBpZiAoaXRlbS5zdGF0ZSAhPSAncHVibGljJykge1xcXFxuICAgICAgICBteV90X2V4Y29kZTEgKz0gJ+OKme+4jyc7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgbXlfdF9leGNvZGUxICs9ICcnO1xcXFxuICAgIH1cXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogbXlfdF9leGNvZGUxICsgaXRlbS5uYW1lICsgbXlfdF9leGNvZGUyLFxcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL21hbmFnZVJ1bGUjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpZDogaXRlbS5pZCxcXFxcbiAgICAgICAgICAgIC8vdXNlcm5hbWU6IHVzZXJuYW1lLFxcXFxuICAgICAgICAgICAgLy9wYXNzd29yZDogcGFzc3dvcmRcXFxcbiAgICAgICAgfSxcXFxcbiAgICAgICAgcGljX3VybDogaXRlbS5waWMsXFxcXG4gICAgfSlcXFxcbn1cXFxcbmlmIChydWxlTGlzdC5sZW5ndGggPT09IDApIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCI8aDUgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz7lv6vmnaXkuIrkvKDkvaDnmoTnrKzkuIDmnaHop4TliJnlkKfvvIE8L2g1PlxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufVxcXFxuc2V0UmVzdWx0KGRhdGEpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuinhOWImeivpue7hi1kZXZcXFwiLFxcXCJwYXRoXFxcIjpcXFwibWFuYWdlUnVsZVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbiAgICBjb25zdCB7XFxcXG4gICAgICAgIGdldEFwaSxcXFxcbiAgICAgICAgY29sb3IsXFxcXG4gICAgICAgIHNtYWxsLFxcXFxuICAgICAgICBnZXRGaWxlLFxcXFxuICAgICAgICBleGlzdEZpbGUsXFxcXG4gICAgICAgIG1hcENvbFR5cGUsXFxcXG4gICAgICAgIGh0bWxUYWcsXFxcXG4gICAgICAgIGFwaSxcXFxcbiAgICAgICAgbWQsXFxcXG4gICAgfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5sZXQge1xcXFxuICAgIGlkXFxcXG59ID0gTVlfUEFSQU1TO1xcXFxubGV0IHtcXFxcbiAgICB1c2VybmFtZSxcXFxcbiAgICBwYXNzd29yZCxcXFxcbn0gPSBnZXRGaWxlKCk7XFxcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbn0pKTtcXFxcbmxldCBkYXRhSXRlbSA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcXFxcXCJnZXRieWlkXFxcXFxcXCIpICsgXFxcXFxcXCI/aWQ9XFxcXFxcXCIgKyBpZCkpLnJlc3VsdDtcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIue8lui+keOAjFxcXFxcXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXFxcXFwi44CNXFxcXFxcXCIpO1xcXFxubGV0IHJlcUJ5R2V0ID0gXFxcXFxcXCI/aWQ9XFxcXFxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXFxcXFwiJnFxPVxcXFxcXFwiICsgdXNlcm5hbWUgKyBcXFxcXFxcIiZwYXNzd29yZD1cXFxcXFxcIiArIHBhc3N3b3JkO1xcXFxubGV0IHJ1bGVMaXN0SnNvbiA9IGdldEFwaShcXFxcXFxcInJ1bGVMaXN0SnNvblxcXFxcXFwiKSArIFxcXFxcXFwiP2lkPVxcXFxcXFwiO1xcXFxubGV0IGRhdGEgPSBbXTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLniYjmnKxcXFxcXFxcIiksXFxcXG4gICAgZGVzYzogXFxcXFxcXCLigJzigJzigJ3igJ3kupHnq6/niYjmnKw6XFxcXFxcXCIgKyBjb2xvcihkYXRhSXRlbS52ZXIsIFxcXFxcXFwiIzVjZmYyY1xcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFxu5LiK5qyh5o+Q5Lqk5LqOOiBbXFxcXFxcXCIgKyBjb2xvcihkYXRhSXRlbS5sYXN0X3VwZGF0ZSwgXFxcXFxcXCIjZmY3MDAwXFxcXFxcXCIpICsgXFxcXFxcXCJdXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiPOW8gOWPkeiAhT5cXFxcXFxcXG5cXFxcXFxcIiArIGRhdGFJdGVtLmF1dGhvciArIFxcXFxcXFwiXFxcXFxcXFxuPOWQjeensD5cXFxcXFxcXG5cXFxcXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFxcXFxcIlxcXFxcXFxcbjzkupHnq6/niYjmnKw+XFxcXFxcXFxuXFxcXFxcXCIgKyBkYXRhSXRlbS52ZXIgKyBcXFxcXFxcIlxcXFxcXFxcbjzmm7TmlrDml7bpl7Q+XFxcXFxcXFxuW1xcXFxcXFwiICsgZGF0YUl0ZW0ubGFzdF91cGRhdGUgKyBcXFxcXFxcIl1cXFxcXFxcIikuY29uZmlybSgoKSA9PiB7fSksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnXFxcXG59KTtcXFxcbmxldCBkYXRhVHlwZSA9IHtcXFxcbiAgICBob21lX3J1bGVfdXJsOiAn6aaW6aG15LqR6KeE5YiZJyxcXFxcbiAgICBwdWJsaXNoOiAn5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZJyxcXFxcbiAgICBqc191cmw6ICfnvZHpobXmj5Lku7bop4TliJknLFxcXFxuICAgIGh0bWw6ICfpnZnmgIHpobXpnaInLFxcXFxuICAgIGNvbmZpZzogJ+S4u+mhtemFjee9ridcXFxcbn07XFxcXG5cXFxcbmxldCBiYXNpYyA9IHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG59O1xcXFxubGV0IGRhdGFUeXBlVGlwcyA9IGRhdGFUeXBlW2RhdGFJdGVtLmRhdGFfdHlwZV0gfHwgJ+acquefpeinhOWImTonICsgZGF0YUl0ZW0uZGF0YV90eXBlO1xcXFxuXFxcXG5iYXNpYy50aXRsZSA9IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLnsbvlnotcXFxcXFxcIikgKyBcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFwiICsgc21hbGwoXFxcXFxcXCIoaWQ6XFxcXFxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXFxcXFwiKVxcXFxcXFwiKTtcXFxcbmJhc2ljLmRlc2MgPSBcXFxcXFxcIuaVsOaNruexu+Wei++8mlxcXFxcXFwiICsgY29sb3IoZGF0YVR5cGVUaXBzLCBcXFxcXFxcIiNjYjU0ZmZcXFxcXFxcIikgKyBcXFxcXFxcIlxcXFxcXFxcbuWIhuS6q+eKtuaAgeS4uu+8mlxcXFxcXFwiICsgZGF0YUl0ZW0uc3RhdGU7XFxcXG5pZiAoW1xcXFxcXFwiaHRtbFxcXFxcXFwiLCBcXFxcXFxcImNvbmZpZ1xcXFxcXFwiLCBcXFxcXFxcImpzX3VybFxcXFxcXFwiXS5pbmNsdWRlcyhkYXRhSXRlbS5kYXRhX3R5cGUpKSB7XFxcXG4gICAgYmFzaWMuZGVzYyArPSBcXFxcXFxcIlxcXFxcXFxcbuKAnOKAnOKAneKAnSA9PlxcXFxcXFwiICsgc21hbGwoXFxcXFxcXCLngrnmraTpooTop4hcXFxcXFxcIik7XFxcXG4gICAgYmFzaWMudXJsID0gcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxcXG59XFxcXG5sZXQgYXV0aCA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG5pZiAoZGF0YUl0ZW0uc3RhdGUgPT0gXFxcXFxcXCJwcml2YXRlXFxcXFxcXCIpIHtcXFxcbiAgICBsZXQgYXV0aF9iYWNrID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFxcXFxcImF1dGhcXFxcXFxcIikgKyByZXFCeUdldCkpO1xcXFxuICAgIGJhc2ljLnRpdGxlID0gYmFzaWMudGl0bGUgKyBcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiICsgc21hbGwoY29sb3IoYXV0aF9iYWNrLnJlc3VsdCwgXFxcXFxcXCJncmV5XFxcXFxcXCIpKTtcXFxcbiAgICBhdXRoID0gJyZhdXRoPScgKyBhdXRoX2JhY2sucmVzdWx0O1xcXFxuICAgIGJhc2ljLnVybCA9IGJhc2ljLnVybCA9PT0gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIgPyBiYXNpYy51cmwgOiBiYXNpYy51cmwgKyBhdXRoO1xcXFxufVxcXFxuZGF0YS5wdXNoKGJhc2ljKTtcXFxcbmxldCBub3RlcyA9IHJlcXVlc3QoZ2V0QXBpKFxcXFxcXFwiZ2V0X3J1bGVfbm90ZVxcXFxcXFwiKSArIGlkKTtcXFxcbm5vdGVzID0gSlNPTi5wYXJzZShub3RlcykucmVzdWx0O1xcXFxucmVxdWlyZShtZCk7XFxcXG5sZXQgbm90ZXNIdG1sPVxcXFxcXFwiXFxcXFxcXCJcXFxcbnRyeXtcXFxcbiAgICBub3Rlc0h0bWw9bWFya2VkLnBhcnNlKG5vdGVzKTtcXFxcbn1jYXRjaChlKXt9XFxcXG5pZiAobm90ZXMgIT09IGZhbHNlKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLlpIfms6hcXFxcXFxcIikgKyBcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFwiICsgc21hbGwoaHRtbFRhZyhcXFxcXFxcInVcXFxcXFxcIiwgXFxcXFxcXCLmn6XnnIvlrozmlbTlhazlkYogPlxcXFxcXFwiKSksXFxcXG4gICAgICAgIGRlc2M6IG5vdGVzLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICB0ZXh0OiBub3Rlc0h0bWwsXFxcXG4gICAgICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lLFxcXFxuICAgICAgICAgICAgLy8gdHlwZTogXFxcXFxcXCJsb25nX3RleHRcXFxcXFxcIlxcXFxuICAgICAgICAgICAgdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG59XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXFxcXFwiYmlnXFxcXFxcXCIsIFxcXFxcXFwi5pON5L2cXFxcXFxcXCIpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJ0b2FzdDovL+S9oOaJjeaYr+acgOW4heeahOmCo+S4quS6uu+8gVxcXFxcXFwiXFxcXG59KTtcXFxcbmxldCBpbXBvcnRVcmwsIHJ1bGVDb2RlLCBzaGFyZVVybCwgYmFja0NvZGUgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxubGV0IHN1YlVybCA9IHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgYXV0aDtcXFxcbmlmICghZGF0YUl0ZW0uaXNfanNvbikge1xcXFxuICAgIGJhY2tDb2RlID0gcmVxdWVzdChzdWJVcmwpO1xcXFxufVxcXFxuc3dpdGNoIChkYXRhSXRlbS5kYXRhX3R5cGUpIHtcXFxcbiAgICBjYXNlIFxcXFxcXFwiaG9tZV9ydWxlX3VybFxcXFxcXFwiOlxcXFxuICAgICAgICBydWxlQ29kZSA9IFxcXFxcXFwi5rW36ZiU6KeG55WM6aaW6aG16aKR6YGT6KeE5YiZ44CQXFxcXFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcXFxcXCLjgJHvv6Vob21lX3J1bGVfdXJs77+lXFxcXFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArIGF1dGg7XFxcXG4gICAgICAgIGltcG9ydFVybCA9IFxcXFxcXFwicnVsZTovL1xcXFxcXFwiICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKVxcXFxuICAgICAgICBicmVhaztcXFxcbiAgICBjYXNlICdwdWJsaXNoJzpcXFxcbiAgICAgICAgcnVsZUNvZGUgPSAn5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77yaJyArIGRhdGFJdGVtLm5hbWUgKyAn77+lcHVibGlzaO+/pScgKyBiYXNlNjRFbmNvZGUoYmFja0NvZGUpO1xcXFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcXFxuICAgICAgICBicmVhaztcXFxcbiAgICBjYXNlICdqc191cmwnOlxcXFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJrnvZHpobXmj5Lku7bvv6Vqc191cmzvv6UnICsgZGF0YUl0ZW0ubmFtZSArICdAYmFzZTY0Oi8vJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgJ2h0bWwnOlxcXFxuICAgICAgICBsZXQgZmlsZV90bXAgPSBkYXRhSXRlbS5uYW1lLnNwbGl0KCcuJyk7XFxcXG4gICAgICAgIGxldCBmaWxlX3BhdGggPSBmaWxlX3RtcC5sZW5ndGggPiAxID8gZmlsZV90bXBbZmlsZV90bXAubGVuZ3RoIC0gMV0gKyBcXFxcXFxcIi9cXFxcXFxcIiArIGRhdGFJdGVtLm5hbWUgOiBkYXRhSXRlbS5uYW1lO1xcXFxuICAgICAgICBydWxlQ29kZSA9IFxcXFxcXFwi5rW36ZiU6KeG55WM5pys5Zyw5paH5Lu25YiG5Lqr77+lZmlsZV91cmzvv6VoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvXFxcXFxcXCIgKyBmaWxlX3BhdGggKyBcXFxcXFxcIkBcXFxcXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgYXV0aDtcXFxcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXFxcbiAgICAgICAgYnJlYWtcXFxcbiAgICBjYXNlIFxcXFxcXFwiY29uZmlnXFxcXFxcXCI6XFxcXG4gICAgICAgIGltcG9ydFVybCA9ICQoKS5ydWxlKHBhc3N3b3JkID0+IHtcXFxcbiAgICAgICAgICAgIGV2YWwoZmV0Y2goXFxcXFxcXCJoaWtlcjovL2Fzc2V0cy9ob21lLmpzXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgICAgIEhpa2VySG9tZS5sb2FkKFxcXFxcXFwiaW1wb3J0XFxcXFxcXCIsIHBhc3N3b3JkKTtcXFxcbiAgICAgICAgfSwgYmFja0NvZGUpO1xcXFxuICAgICAgICBicmVhaztcXFxcbn1cXFxcbmxldCBteV9jb2xfdHlwZSA9IFxcXFxcXFwidGV4dF8yXFxcXFxcXCI7XFxcXG5pZiAoaW1wb3J0VXJsKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5a+85YWl6KeE5YiZXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogaW1wb3J0VXJsLFxcXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbiAgICB9KTtcXFxcbiAgICBpZihkYXRhSXRlbS5pc19qc29uX2xpc3QmJi9ob21lX3J1bGVfdXJsfGh0bWwvLnRlc3QoZGF0YUl0ZW0uZGF0YV90eXBlKSl7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICNmZjcwMDBcXFxcXFxcIj7lr7zlhaXpgZPlvrfnu488L3NwYW4+JyxcXFxcbiAgICAgICAgICAgIHVybDogJCgpLmxhenlSdWxlKChkYXRhSXRlbSxzdWJVcmwpPT57XFxcXG4gICAgICAgICAgICAgICAgLy8gbGV0IHRpdGxlID0gXFxcXFxcXCJILVxcXFxcXFwiK2RhdGFJdGVtLm5hbWUrXFxcXFxcXCIuXFxcXFxcXCIrZGF0YUl0ZW0uYXV0aG9yO1xcXFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IFxcXFxcXFwiSi1cXFxcXFxcIitkYXRhSXRlbS5uYW1lLnNwbGl0KCcuJylbMF07XFxcXG4gICAgICAgICAgICAgICAgbGV0IHN1Yk9iaiA9IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHN1YlVybCxcXFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcXFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvcnVsZUNhY2hlL1xcXFxcXFwiK3RpdGxlK1xcXFxcXFwiLmpzb25cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSwvL+emgeeUqOW5tuWPkeabtOaWsFxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBsZXQgc2hhcmVUZXh0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHN1Yk9iaikpO1xcXFxuICAgICAgICAgICAgICAgIHZhciBwYXN0ZXMgPSBnZXRQYXN0ZXMoKTtcXFxcbiAgICAgICAgICAgICAgICB2YXIgdXJsID0gc2hhcmVQYXN0ZShzaGFyZVRleHQscGFzdGVzLnNsaWNlKC0xKVswXSk7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGltcG9ydF9ydWxlPSBcXFxcXFxcIui9u+WQiOmbhuiuoumYhe+8mlxcXFxcXFwiK3RpdGxlKydcXFxcXFxcXG4nK3VybDtcXFxcbiAgICAgICAgICAgICAgICBjb3B5KGltcG9ydF9ydWxlKTtcXFxcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gJ2hpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9ydWxlQ2FjaGUvc3ViLmpzb24nO1xcXFxuICAgICAgICAgICAgICAgICQucmMoY29uZmlnLmxpYi5zdWIpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiDorqLpmIXlr7zlhaUocGF0aClcXFxcbiAgICAgICAgICAgIH0sZGF0YUl0ZW0sc3ViVXJsKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG59XFxcXG5pZiAocnVsZUNvZGUpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLliIbkuqvop4TliJlcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImNvcHk6Ly9cXFxcXFxcIiArIHJ1bGVDb2RlLFxcXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gc2V0U2V0dGluZ0l0ZW0oYmFzaWMsIHBhdHRlcm4pIHtcXFxcbiAgICBsZXQgdGVtcCA9IHtcXFxcbiAgICAgICAgdGl0bGU6IGJhc2ljLnRpdGxlLFxcXFxuICAgICAgICBjb2xfdHlwZTogYmFzaWMuY29sX3R5cGUsXFxcXG4gICAgICAgIHVybDogJChiYXNpYy5jb25maXJtKS5jb25maXJtKCh1cmwsIG1zZywgcGF0dGVybikgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IGJhY2tBID0gcmVxdWVzdCh1cmwpO1xcXFxuICAgICAgICAgICAgbGV0IHJldCA9IEpTT04ucGFyc2UoYmFja0EpO1xcXFxuICAgICAgICAgICAgaWYgKHJldC5zdGF0dXMgPT0gMCkge1xcXFxuICAgICAgICAgICAgICAgIHBhdHRlcm4gPyBiYWNrKCkgOiByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIG1zZ1swXTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcGF0dGVybiA/IGJhY2soKSA6IHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgbXNnWzFdICsgXFxcXFxcXCJcXFxcXFxcXG5cXFxcXFxcIiArIHJldC5kZXRhaWw7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0sIGJhc2ljLnVybCwgYmFzaWMubXNnLCBwYXR0ZXJuKVxcXFxuICAgIH07XFxcXG4gICAgcmV0dXJuIHRlbXA7XFxcXG59XFxcXG5pZiAoZGF0YUl0ZW0uc3RhdGUgPT0gJ3ByaXZhdGUnKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi6K6+5Li65YWs5byAXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcXFxcXCJzaGFyZVxcXFxcXFwiKSArIHJlcUJ5R2V0ICsgXFxcXFxcXCImZmxhZ1xcXFxcXFwiICsgXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgICAgICByZXF1ZXN0KGlucHV0KTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey6K6+5Li65YWs5byAXFxcXFxcXCI7XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbiAgICB9LCB7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIumaj+acuuWvhumSpVxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGUsXFxcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcXFxcXCJnZW5BdXRoXFxcXFxcXCIpICsgcmVxQnlHZXQgKyBcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBiYWNrID0gcmVxdWVzdChpbnB1dCk7XFxcXG4gICAgICAgICAgICBsZXQgcmV0ID0gSlNPTi5wYXJzZShiYWNrKTtcXFxcbiAgICAgICAgICAgIGlmIChyZXQuc3RhdHVzID09IDApIHtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7LnlJ/miJDpmo/mnLrlr4bnoIFcXFxcXFxcXG5cXFxcXFxcIiArIHJldC5yZXN1bHRcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/pmo/mnLrlr4bnoIHnlJ/miJDlpLHotKVcXFxcXFxcIlxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KVxcXFxuICAgIH0pO1xcXFxuICAgIGxldCB0aW1lT3ZlciA9IHtcXFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG4gICAgfTtcXFxcbiAgICBpZiAoZGF0YUl0ZW0udGltZV9vdmVyKSB7XFxcXG4gICAgICAgIHRpbWVPdmVyLnRpdGxlID0gc21hbGwoY29sb3IoXFxcXFxcXCLnn63ml7blr4bpkqVcXFxcXFxcIiwgXFxcXFxcXCJncmVlblxcXFxcXFwiKSArIGNvbG9yKFxcXFxcXFwiKOKGkuawuOS5hSlcXFxcXFxcIiwgXFxcXFxcXCJyZWRcXFxcXFxcIikpO1xcXFxuICAgICAgICB0aW1lT3Zlci51cmwgPSBnZXRBcGkoXFxcXFxcXCJ0aW1lb3ZlclxcXFxcXFwiKSArIHJlcUJ5R2V0ICsgXFxcXFxcXCImZmxhZz0xXFxcXFxcXCI7XFxcXG4gICAgICAgIHRpbWVPdmVyLmNvbmZpcm0gPSBcXFxcXFxcIuaYr+WQpuehruiupOS7peWQjueahOengeiXj+inhOWImeWIhuS6q+S4jei/h+acnz9cXFxcXFxcIjtcXFxcbiAgICAgICAgdGltZU92ZXIubXNnID0gW1xcXFxcXFwi5bey6K6+5Li65rC45LmFXFxcXFxcXCIsIFxcXFxcXFwi6K6+5Li65rC45LmF5aSx6LSlXFxcXFxcXCJdO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIHRpbWVPdmVyLnRpdGxlID0gc21hbGwoY29sb3IoXFxcXFxcXCLmsLjkuYXlr4bpkqVcXFxcXFxcIiwgXFxcXFxcXCJyZWRcXFxcXFxcIikgKyBjb2xvcihcXFxcXFxcIijihpLnn63ml7YpXFxcXFxcXCIsIFxcXFxcXFwiZ3JlZW5cXFxcXFxcIikpO1xcXFxuICAgICAgICB0aW1lT3Zlci51cmwgPSBnZXRBcGkoXFxcXFxcXCJ0aW1lb3ZlclxcXFxcXFwiKSArIHJlcUJ5R2V0O1xcXFxuICAgICAgICB0aW1lT3Zlci5jb25maXJtID0gXFxcXFxcXCLnoa7orqTopoHku6XlkI7liIbkuqvnmoTnp4Hol4/op4TliJnoh6rliqjliLDmnJ8/XFxcXFxcXCI7XFxcXG4gICAgICAgIHRpbWVPdmVyLm1zZyA9IFtcXFxcXFxcIuW3suiuvuS4uui/h+acn1xcXFxcXFwiLCBcXFxcXFxcIuiuvuS4uui/h+acn+Wksei0pVxcXFxcXFwiXTtcXFxcbiAgICB9XFxcXG4gICAgZGF0YS5wdXNoKHNldFNldHRpbmdJdGVtKHRpbWVPdmVyKSk7XFxcXG59IGVsc2UgaWYgKGRhdGFJdGVtLnN0YXRlID09ICdwdWJsaWMnKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi6K6+5Li656eB5pyJXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcXFxcXCJzaGFyZVxcXFxcXFwiKSArIHJlcUJ5R2V0ICsgXFxcXFxcXCImZmxhZz0xI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICAgICAgcmVxdWVzdChpbnB1dCk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+W3suiuvuS4uuengeaciVxcXFxcXFwiO1xcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG4gICAgfSk7XFxcXG59XFxcXG5kYXRhLnB1c2goc2V0U2V0dGluZ0l0ZW0oe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuWIoOmZpOaVsOaNrlxcXFxcXFwiLFxcXFxuICAgIGNvbmZpcm06IFxcXFxcXFwi5piv5ZCm56Gu6K6k5Yig6ZmkXFxcXFxcXCIsXFxcXG4gICAgbXNnOiBbXFxcXFxcXCLlt7LliKDpmaRcXFxcXFxcIiwgXFxcXFxcXCLliKDpmaTlpLHotKVcXFxcXFxcIl0sXFxcXG4gICAgdXJsOiBnZXRBcGkoXFxcXFxcXCJkZWxldGVVcmxcXFxcXFxcIikgKyByZXFCeUdldCxcXFxcbiAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbn0sIHRydWUpKTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi6K6+572u5Zu+5qCHXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKGRhdGFJdGVtLnBpY191cmwsIFxcXFxcXFwi6L6T5YWl5Zu+5qCH5Zyw5Z2AXFxcXFxcXCIpLmlucHV0KGFwaSA9PiB7XFxcXG4gICAgICAgIGlmIChpbnB1dCA9PT0gXFxcXFxcXCJcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kvaDlnKjpgJfmiJHpk77mjqXlk6o/XFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChhcGkgKyBcXFxcXFxcIiZydWxlX3BpYz1cXFxcXFxcIiArIGlucHV0KTtcXFxcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xcXFxuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFxcXFxcIjtcXFxcbiAgICB9LCBnZXRBcGkoXFxcXFxcXCJzZXRfcnVsZV9waWNcXFxcXFxcIikgKyBkYXRhSXRlbS5pZCArIHJlcUJ5R2V0KSxcXFxcbiAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbn0pO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBkYXRhSXRlbS5jYW5fZGlzY3VzcyA/IFxcXFxcXFwi56aB5q2i6K+E6K66XFxcXFxcXCIgOiBcXFxcXFxcIuW8gOWQr+ivhOiuulxcXFxcXFwiLFxcXFxuICAgIHVybDogJChhcGkuZGlzX3NldCArIGRhdGFJdGVtLmlkICsgcmVxQnlHZXQgKyBcXFxcXFxcIiZzdGF0ZT1cXFxcXFxcIiArIChkYXRhSXRlbS5jYW5fZGlzY3VzcyA/IFxcXFxcXFwiXFxcXFxcXCIgOiAxKSkubGF6eVJ1bGUoKGNhbl9kaXNjdXNzKSA9PiB7XFxcXG4gICAgICAgIHJlcXVlc3QoaW5wdXQpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgIHJldHVybiBjYW5fZGlzY3VzcyA/IFxcXFxcXFwidG9hc3Q6Ly/lt7LnpoHmraLor4TorrpcXFxcXFxcIiA6IFxcXFxcXFwidG9hc3Q6Ly/lt7LlvIDlkK/or4TorrpcXFxcXFxcIjtcXFxcbiAgICB9LCBkYXRhSXRlbS5jYW5fZGlzY3VzcyksXFxcXG4gICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG59KTtcXFxcbk1ZX1BBUkFNUy5uYW1lID0gZGF0YUl0ZW0ubmFtZTtcXFxcbk1ZX1BBUkFNUy51c2VybmFtZT11c2VybmFtZTtcXFxcbk1ZX1BBUkFNUy5wYXNzd29yZD1wYXNzd29yZDtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi6K6+572u5aSH5rOoXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9zZXRfcnVsZV9ub3Rlc1xcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiBNWV9QQVJBTVMsXFxcXG4gICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG59KTtcXFxcbmlmIChkYXRhSXRlbS5pc19qc29uICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PT0gXFxcXFxcXCJob21lX3J1bGVfdXJsXFxcXFxcXCIgJiYgIWRhdGFJdGVtLmlzX2pzb25fbGlzdCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiAn6L+b5YWl6aKR6YGTJyxcXFxcbiAgICAgICAgdXJsOiAkKCBcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIgKS5sYXp5UnVsZSgobmFtZSxob21lKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgaGFzUnVsZSA9IHJlcXVlc3QoJ2hpa2VyOi8vaG9tZUAnK25hbWUpICE9ICdudWxsJztcXFxcbiAgICAgICAgICAgIGlmIChoYXNSdWxlKSB7XFxcXG4gICAgICAgICAgICAgICAgYmFja1RvSG9tZSgpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBob21lK1xcXFxcXFwic0BcXFxcXFxcIiArIG5hbWU7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5pyq5a6J6KOFXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0sIGRhdGFJdGVtLm5hbWUsYXBpLmhvbWUpLFxcXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbiAgICB9KTtcXFxcbn1cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmdvb2RfbnVtLFxcXFxuICAgIHBpY191cmw6IFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+i1ni5zdmdcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uX3NtYWxsXzNcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmJhZF9udW0sXFxcXG4gICAgcGljX3VybDogXFxcXFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6LipLnN2Z1xcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fc21hbGxfM1xcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLor4TorrpcXFxcXFxcIixcXFxcbiAgICBwaWNfdXJsOiBcXFxcXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/or4Torrouc3ZnXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl9zbWFsbF8zXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9SZXBseSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBydWxlSWQ6IGRhdGFJdGVtLmlkLFxcXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5hdXRob3IsXFxcXG4gICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcXFxcbiAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lXFxcXG4gICAgfVxcXFxufSk7XFxcXG5sZXQgdG90YWxTdW0gPSBkYXRhSXRlbS5nb29kX251bSArIGRhdGFJdGVtLmJhZF9udW07XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLor4TorrooXFxcXFxcXCIgKyB0b3RhbFN1bSArIFxcXFxcXFwiKVxcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXCIgKyBzbWFsbChodG1sVGFnKFxcXFxcXFwidVxcXFxcXFwiLCBcXFxcXFxcIuafpeeci+WFqOmDqOivhOiuuijmjqfor4QpID5cXFxcXFxcIikpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29tbWVudFxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5I2Z5cGFnZSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICAgICAgaWQ6IGRhdGFJdGVtLmlkLFxcXFxuICAgICAgICB0b3RhbFN1bTogdG90YWxTdW0sXFxcXG4gICAgICAgIG5vX2FjdGl2ZTogdHJ1ZSxcXFxcbiAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxcXFxuICAgICAgICBwYXNzd29yZDogcGFzc3dvcmRcXFxcbiAgICB9XFxcXG59KTtcXFxcbi8vY29uc3QgbG9uZ2VzdFN1bT0xMjA7XFxcXG5sZXQgaWNvbiA9IHtcXFxcbiAgICBcXFxcXFxcImdvb2RcXFxcXFxcIjogXFxcXFxcXCLwn5GNXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJiYWRcXFxcXFxcIjogXFxcXFxcXCLwn5GOXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJyZXBseVxcXFxcXFwiOiBcXFxcXFxcIuW8gOWPkeiAhfCfl6NcXFxcXFxcIlxcXFxufVxcXFxuaWYgKHRvdGFsU3VtID09PSAwKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5LiA5p2h6K+E6K665Lmf5rKh5pyJ77yM5b+r5p2l5oqi5rKZ5Y+R5ZCn77yBPC9oNT5cXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn0gZWxzZSB7XFxcXG4gICAgbGV0IGNvbW1lbnRMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5kaXNfZ2V0ICsgZGF0YUl0ZW0uaWQgKyBcXFxcXFxcIj9saW1pdD01XFxcXFxcXCIpKS5yZXN1bHQ7XFxcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjb21tZW50TGlzdCkge1xcXFxuICAgICAgICBsZXQgUmVwbHkgPSBpdGVtLmRpc2N1c3NfdHlwZT09PVxcXFxcXFwicmVwbHlcXFxcXFxcIiYmaXRlbS5yZXBseV90b19uYW1lIT09ZmFsc2UmJml0ZW0ucmVwbHlfdG9faWQhPT1mYWxzZT9cXFxcXFxcIuKAmOKAmOWbnuWkjUBcXFxcXFxcIitpdGVtLnJlcGx5X3RvX25hbWUrXFxcXFxcXCIgI1xcXFxcXFwiK2l0ZW0uZGlzY3Vzc19pZCtcXFxcXFxcIuKAmeKAmVxcXFxcXFxcblxcXFxcXFwiOlxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lICsgXFxcXFxcXCImbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0nZ3JheSc+PHNtYWxsPiNcXFxcXFxcIiArIGl0ZW0uaWQgKyBcXFxcXFxcIjwvc21hbGw+PGZvbnQ+XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJhdmF0YXJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvUmVwbHlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOntcXFxcbiAgICAgICAgICAgICAgICBydWxlSWQ6IGRhdGFJdGVtLmlkLFxcXFxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcXFxcbiAgICAgICAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXFxcXG4gICAgICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxcXFxuICAgICAgICAgICAgICAgIHJlcGx5SWQ6aXRlbS5pZFxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXFxcbiAgICAgICAgICAgIGRlc2M6IFJlcGx5K2l0ZW0uY3JlYXRlX2RhdGUgKyBcXFxcXFxcIsK3XFxcXFxcXCIgKyBpY29uW2l0ZW0uZGlzY3Vzc190eXBlXSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcXFxcbiAgICAgICAgICAgICAgICB0eXBlOiBcXFxcXFxcImxvbmdfdGV4dFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHRleHQ6IGl0ZW0uZGlzY3Vzc190ZXh0XFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbn1cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbnNldFJlc3VsdChkYXRhKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwiaWNvbl8yX3JvdW5kXFxcIixcXFwibmFtZVxcXCI6XFxcIuinhOWImeWIl+ihqFxcXCIsXFxcInBhdGhcXFwiOlxcXCJydWxlc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuZmlsdGVyXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLnR5cGVcXFxcXFxcIik7XFxcXG4gICAgaWYgKGdldFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnLCAnJykpIHtcXFxcbiAgICAgICAgbG9nKCfmk43kvZzov4fnpoHmraLkuIrkvKA6JyArIGdldFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnKSk7XFxcXG4gICAgICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNhbl91cGxvYWRcXFxcXFxcIik7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgIH1cXFxcbn0pKTtcXFxcblxcXFxuXFxcXG5jb25zdCB7XFxcXG4gICAgZ2V0QXBpLFxcXFxuICAgIGFwaSxcXFxcbiAgICBjb2xvcixcXFxcbiAgICBzbWFsbCxcXFxcbiAgICBsb2NhbFJ1bGVWZXIsXFxcXG4gICAgaHRtbFRhZyxcXFxcbiAgICBtZFxcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5jb25zdCB7XFxcXG4gICAgbm9ybWFsU29ydFxcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9zb3J0XFxcXFxcXCIpO1xcXFxubGV0IHtcXFxcbiAgICBhdmF0YXJVcmwsXFxcXG4gICAgcXEsXFxcXG4gICAgaWQsXFxcXG4gICAgY2FuX3VwbG9hZFxcXFxufSA9IE1ZX1BBUkFNUztcXFxcbmxldCBkYXRhVHlwZSA9IGdldFZhcihcXFxcXFxcIldhcmVob3VzZS50eXBlXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxubGV0IGJhY2tDb2RlID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFxcXFxcInJ1bGVzVXJsXFxcXFxcXCIpICsgXFxcXFxcXCI/bmFtZT1cXFxcXFxcIiArIHFxICsgXFxcXFxcXCImZGF0YV90eXBlPVxcXFxcXFwiICsgZGF0YVR5cGUpKTtcXFxcbmxldCBkZXZOYW1lID0gYmFja0NvZGUuZGV2X25hbWU7XFxcXG5wdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuZmlsdGVyXFxcXFxcXCIsIGRldk5hbWUpO1xcXFxubGV0IHJ1bGVMaXN0ID0gYmFja0NvZGUucmVzdWx0O1xcXFxubGV0IHN1YlVybCA9IGdldEFwaShcXFxcXFxcImpzb25MaXN0XFxcXFxcXCIpICsgXFxcXFxcXCI/bmFtZT1cXFxcXFxcIiArIHFxO1xcXFxubGV0IGhhc1N1YiA9IGhhc0hvbWVTdWIoc3ViVXJsKTtcXFxcbmxldCBkZXZJbmZvID0gXFxcXFxcXCLov5nkuKrkurrlvojmh5Is5LuA5LmI6YO95rKh5YaZ5ZOmflxcXFxcXFwiO1xcXFxubGV0IHRtcEpzb24gPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXFxcXFwiaW5mb0dldFVybFxcXFxcXFwiKSArIHFxKSk7XFxcXG5pZiAodG1wSnNvbi5zdGF0dXMgPT0gMCkge1xcXFxuICAgIGRldkluZm8gPSB0bXBKc29uLnJlc3VsdCB8fCBkZXZJbmZvO1xcXFxufVxcXFxubGV0IHN1YkZsYWcgPSBoYXNTdWIgPyAn8J+GlycgOiAn8J+ToSc7XFxcXG5sZXQgZGF0YSA9IFtdO1xcXFxucmVxdWlyZShtZCk7XFxcXG5kZXZJbmZvID0gbWFya2VkLnBhcnNlKGRldkluZm8pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIGRldk5hbWUgKyBcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFxcblxcXFxcXFwiICsgc21hbGwoaHRtbFRhZyhcXFxcXFxcInVcXFxcXFxcIiwgXFxcXFxcXCLngrnlh7vmn6XnnIvlrozmlbTlhazlkYpcXFxcXFxcIikpLFxcXFxuICAgIGRlc2M6IHNtYWxsKGRldkluZm8pLFxcXFxuICAgIHVybDogJ2hpa2VyOi8vcGFnZS9pbmZvJyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0ZXh0OiBkZXZJbmZvLFxcXFxuICAgICAgICBuYW1lOiBkZXZOYW1lLFxcXFxuICAgICAgICB0eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG4gICAgfSxcXFxcbiAgICBwaWNfdXJsOiBhdmF0YXJVcmwsXFxcXG4gICAgY29sX3R5cGU6ICdtb3ZpZV8xX3ZlcnRpY2FsX3BpYydcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCI8YmlnPuiuoumYheeuoeeQhjwvYmlnPiZuYnNwOyZuYnNwOzxzbWFsbD4o5b2T5YmNXFxcXFxcXCIgKyAoaGFzU3ViID8gXFxcXFxcXCLlt7LorqLpmIVcXFxcXFxcIiA6IFxcXFxcXFwi5pyq6K6i6ZiFXFxcXFxcXCIpICsgXFxcXFxcXCIpPC9zbWFsbD5cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmxldCBzdWJfY29kZSA9ICfmtbfpmJTop4bnlYzlkIjpm4bop4TliJnorqLpmIXvv6Vob21lX3N1Yu+/pScgKyBkZXZOYW1lICsgXFxcXFxcXCLlkIjpm4ZAQFxcXFxcXFwiICsgc3ViVXJsO1xcXFxubGV0IHJ1bGVzQ29kZSA9ICfmtbfpmJTop4bnlYzlkIjpm4bop4TliJnvv6Vob21lX3J1bGVfdXJs77+lJyArIHN1YlVybDtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAjZmY3MDAwXFxcXFxcXCI+5LiA6ZSu6K6i6ZiFPC9zcGFuPicsXFxcXG4gICAgZGVzYzogJ+iuoumYheKAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICM1Y2ZmMmNcXFxcXFxcIj4nICsgZGV2TmFtZSArICc8L3NwYW4+55qE5omA5pyJ5Y2V6KeE5YiZ77yM5ZCI6ZuG6ZyA5Y2V54us6K6i6ZiFJyxcXFxcbiAgICB1cmw6IHN1Yl9jb2RlLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF8yJ1xcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogI2ZmNzAwMFxcXFxcXFwiPuWvvOWFpeWFqOmDqDwvc3Bhbj4nLFxcXFxuICAgIHVybDogcnVsZXNDb2RlLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF8yJ1xcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogI2ZmNzAwMFxcXFxcXFwiPuWvvOWFpei9u+WQiOmbhjwvc3Bhbj4nLFxcXFxuICAgIHVybDogJCgpLmxhenlSdWxlKChkZXZOYW1lLCBzdWJVcmwsIGF2YXRhclVybCkgPT4ge1xcXFxuICAgICAgICBjb25zdCB7XFxcXG4gICAgICAgICAgICBnZW5SdWxlXFxcXG4gICAgICAgIH0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvZ2VuQXBpXFxcXFxcXCIpO1xcXFxuICAgICAgICBsb2coXFxcXFxcXCLovbvlkIjpm4blm77moIfpk77mjqU6XFxcXFxcXCIgKyBhdmF0YXJVcmwpO1xcXFxuICAgICAgICBsZXQgaW1wb3J0X3J1bGUgPSBnZW5SdWxlKFxcXFxcXFwi6L275ZCI6ZuGLlxcXFxcXFwiICsgZGV2TmFtZSwgc3ViVXJsLCBhdmF0YXJVcmwpO1xcXFxuICAgICAgICAvL2NvcHkoaW1wb3J0X3J1bGUpO1xcXFxuICAgICAgICBsZXQgcnVsZUNvZGUgPSBwYXJzZVBhc3RlKGltcG9ydF9ydWxlLnNwbGl0KFxcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXCIpWzBdKTtcXFxcbiAgICAgICAgLy9yZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXFxcbiAgICAgICAgcmV0dXJuIGltcG9ydFVybFxcXFxuICAgIH0sIGRldk5hbWUsIHN1YlVybCwgYXZhdGFyVXJsKSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMidcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICNmZjcwMDBcXFxcXFxcIj7lr7zlhaXpgZPlvrfnu488L3NwYW4+JyxcXFxcbiAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZGV2TmFtZSwgc3ViVXJsLCBhdmF0YXJVcmwpID0+IHtcXFxcbiAgICAgICAgbGV0IHRpdGxlID0gXFxcXFxcXCJILVxcXFxcXFwiICsgZGV2TmFtZTtcXFxcbiAgICAgICAgbGV0IHN1Yk9iaiA9IHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXFxcbiAgICAgICAgICAgIHVybDogc3ViVXJsLFxcXFxuICAgICAgICAgICAgZGVzYzogXFxcXFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvcnVsZUNhY2hlL1xcXFxcXFwiICsgdGl0bGUgKyBcXFxcXFxcIi5qc29uXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2RlOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSwgLy/npoHnlKjlubblj5Hmm7TmlrBcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgc2hhcmVUZXh0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHN1Yk9iaikpO1xcXFxuICAgICAgICB2YXIgcGFzdGVzID0gZ2V0UGFzdGVzKCk7XFxcXG4gICAgICAgIHZhciB1cmwgPSBzaGFyZVBhc3RlKHNoYXJlVGV4dCwgcGFzdGVzLnNsaWNlKC0xKVswXSk7XFxcXG4gICAgICAgIGxldCBpbXBvcnRfcnVsZSA9IFxcXFxcXFwi6L275ZCI6ZuG6K6i6ZiF77yaXFxcXFxcXCIgKyB0aXRsZSArICdcXFxcXFxcXG4nICsgdXJsO1xcXFxuICAgICAgICBjb3B5KGltcG9ydF9ydWxlKTtcXFxcbiAgICAgICAgY29uc3QgcGF0aCA9ICdoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvcnVsZUNhY2hlL3N1Yi5qc29uJztcXFxcbiAgICAgICAgJC5yYyhjb25maWcubGliLnN1Yik7XFxcXG4gICAgICAgIHJldHVybiDorqLpmIXlr7zlhaUocGF0aClcXFxcbiAgICB9LCBkZXZOYW1lLCBzdWJVcmwsIGF2YXRhclVybCksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxcXG59KTtcXFxcbmxldCBjYW5fdXBsb2FkX2FwaSA9IGdldEFwaShcXFxcXFxcIm1hbkNhblVwbG9hZFxcXFxcXFwiKSArIGlkO1xcXFxuaWYgKGdldFZhcignaG91c2UuaXNfbWFuYWdlcicpKSB7XFxcXG4gICAgbGV0IHRpcHMgPSBjYW5fdXBsb2FkID8gJ+iDvScgOiAn5ZCmJztcXFxcbiAgICAvLyBsb2coJ3RpcHM6Jyt0aXBzKTtcXFxcbiAgICAvLyBsb2coJ2Nhbl91cGxvYWQ6JytjYW5fdXBsb2FkKTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogJ+KaoOiDveWQpuS4iuS8oDonICsgKGdldFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnKSB8fCB0aXBzKSxcXFxcbiAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICAgICAgdXJsOiAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICB9KTtcXFxcblxcXFxuICAgIGZ1bmN0aW9uIHNldFVwbG9hZChmbGFnLCBjYW5fdXBsb2FkX2FwaSkge1xcXFxuICAgICAgICBmbGFnID0gZmxhZyB8fCAnJztcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCBjb2RlID0gZmV0Y2goY2FuX3VwbG9hZF9hcGksIHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOiBNT0JJTEVfVUFcXFxcbiAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJ1c2VybmFtZVxcXFxcXFwiOiBnZXRWYXIoJ2hvdXNlLnVzZXJuYW1lJyksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCI6IGdldFZhcignaG91c2UucGFzc3dvcmQnKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiY2FuX3VwbG9hZFxcXFxcXFwiOiAhIWZsYWdcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgY29kZSA9IEpTT04ucGFyc2UoY29kZSkucmVzdWx0O1xcXFxuICAgICAgICAgICAgaWYgKGNvZGUuc3RhdHVzID09PSAwKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuZGV0YWlsXFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBjb2RlLmRldGFpbFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgZS5tZXNzYWdlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6ICfwn5qr56aB5q2i5LiK5LygJyxcXFxcbiAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICAgICAgdXJsOiAkKCfnpoHmraLor6XlvIDlj5HogIXkuIrkvKDop4TliJk/5L2g55qE5pON5L2c5bCG6KKr57O757uf6K6w5b2VJykuY29uZmlybSgoaWQsIGNhbl91cGxvYWRfYXBpLCBzZXRVcGxvYWQpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRVcGxvYWQoZmFsc2UsIGNhbl91cGxvYWRfYXBpKTtcXFxcbiAgICAgICAgICAgIGlmICghL+aTjeS9nOWksei0pS8udGVzdChyZXQpKSB7XFxcXG4gICAgICAgICAgICAgICAgcHV0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcsICflkKYnKTtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJyArIHJldFxcXFxuICAgICAgICB9LCBpZCwgY2FuX3VwbG9hZF9hcGksIHNldFVwbG9hZClcXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogJ+KcheWFgeiuuOS4iuS8oCcsXFxcXG4gICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgICAgIHVybDogJCgn5YWB6K646K+l5byA5Y+R6ICF5LiK5Lyg6KeE5YiZP+S9oOeahOaTjeS9nOWwhuiiq+ezu+e7n+iusOW9lScpLmNvbmZpcm0oKGlkLCBjYW5fdXBsb2FkX2FwaSwgc2V0VXBsb2FkKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0VXBsb2FkKHRydWUsIGNhbl91cGxvYWRfYXBpKTtcXFxcbiAgICAgICAgICAgIGlmICghL+aTjeS9nOWksei0pS8udGVzdChyZXQpKSB7XFxcXG4gICAgICAgICAgICAgICAgcHV0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcsICfmmK8nKTtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJyArIHJldFxcXFxuICAgICAgICB9LCBpZCwgY2FuX3VwbG9hZF9hcGksIHNldFVwbG9hZClcXFxcbiAgICB9KTtcXFxcbn1cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwiPHNtYWxsPuaPkOekuu+8muW8gOWPkeiAheWNleeLrOWIhuS6q+eahOWQiOmbhuaWh+S7tuWPquiDveWNleeLrOWvvOWFpeOAgjwvc21hbGw+XFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCI8YmlnPuinhOWImeWIl+ihqDwvYmlnPiZuYnNwOyZuYnNwOzxzbWFsbD4o5YWxXFxcXFxcXCIgKyBydWxlTGlzdC5sZW5ndGggKyBcXFxcXFxcIuadoSk8L3NtYWxsPlxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG59KTtcXFxcbmxldCBkYXRhVHlwZUxpc3QgPSB7XFxcXG4gICAgXFxcXFxcXCJcXFxcXFxcIjogXFxcXFxcXCLlhajpg6hcXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImhvbWVfcnVsZV91cmxcXFxcXFxcIjogJ+Wwj+eoi+W6jycsXFxcXG4gICAgLy9cXFxcXFxcInB1Ymxpc2hcXFxcXFxcIjogJ+aPkOS6pOS6keS7k+W6k+inhOWImScsXFxcXG4gICAgXFxcXFxcXCJqc191cmxcXFxcXFxcIjogJ+e9kemhteaPkuS7ticsXFxcXG4gICAgXFxcXFxcXCJodG1sXFxcXFxcXCI6ICfpnZnmgIHpobXpnaInLFxcXFxuICAgIFxcXFxcXFwiY29uZmlnXFxcXFxcXCI6ICfkuLvpopgnXFxcXG59O1xcXFxuZm9yIChsZXQga2V5IGluIGRhdGFUeXBlTGlzdCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBkYXRhVHlwZSA9PT0ga2V5ID8gXFxcXFxcXCLigJzigJxcXFxcXFxcIiArIGRhdGFUeXBlTGlzdFtrZXldICsgXFxcXFxcXCLigJ3igJ1cXFxcXFxcIiA6IGRhdGFUeXBlTGlzdFtrZXldLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoa2V5KSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UudHlwZVxcXFxcXFwiLCBrZXkpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9LCBrZXkpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn1cXFxcbmlmIChydWxlTGlzdC5sZW5ndGggPiAyMCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuaQnOe0olxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcobmFtZSA9PiBcXFxcXFxcImhpa2VyOi8vc2VhcmNoP3M9XFxcXFxcXCIgKyBpbnB1dCArIFxcXFxcXFwiJnJ1bGU9XFxcXFxcXCIgKyBuYW1lLCBNWV9SVUxFLnRpdGxlKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaW5wdXRcXFxcXFxcIixcXFxcbiAgICAgICAgZGVzYzogXFxcXFxcXCLmkJzntKLlvZPliY3lvIDlj5HogIXnmoTop4TliJlcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufVxcXFxubGV0IGhvbWVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5ob21lKSk7XFxcXG5sZXQgbVJ1bGVMaXN0ID0gW107XFxcXG5mb3IgKHZhciBpdGVtIG9mIHJ1bGVMaXN0KSB7XFxcXG4gICAgdmFyIG5hbWUgPSBpdGVtLm5hbWU7XFxcXG4gICAgaWYgKGl0ZW0uaXNfdGFwKSB7XFxcXG4gICAgICAgIGxldCBsb2NhdGlvbiA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcXFxcXCJydWxlTGlzdEpzb25cXFxcXFxcIikgKyBcXFxcXFxcIj9pZD1cXFxcXFxcIiArIGl0ZW0uaWQpKTtcXFxcbiAgICAgICAgaXRlbS5pZCA9IGxvY2F0aW9uLmlkO1xcXFxuICAgICAgICBpdGVtLm5hbWUgPSBsb2NhdGlvbi5uYW1lO1xcXFxuICAgICAgICBpdGVtLmF1dGhvciA9IGxvY2F0aW9uLmF1dGhvcjtcXFxcbiAgICAgICAgaXRlbS5kYXRhX3R5cGUgPSBsb2NhdGlvbi5kYXRhX3R5cGU7XFxcXG4gICAgICAgIGl0ZW0udmVyID0gbG9jYXRpb24udmVyXFxcXG4gICAgfVxcXFxuICAgIGl0ZW0udmVyc2lvbiA9IGl0ZW0udmVyO1xcXFxuICAgIGxldCBsYWJlbCA9IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgIGx2ZXIgPSAtMjtcXFxcbiAgICBpZiAoaXRlbS5pc19qc29uICYmIGl0ZW0uZGF0YV90eXBlID09PSBcXFxcXFxcImhvbWVfcnVsZV91cmxcXFxcXFxcIikge1xcXFxuICAgICAgICBsdmVyID0gbG9jYWxSdWxlVmVyKGhvbWVMaXN0LCBpdGVtKTtcXFxcbiAgICAgICAgaWYgKGx2ZXIgPT09IC0xKSB7XFxcXG4gICAgICAgICAgICBsYWJlbCA9IFxcXFxcXFwi8J+GlVxcXFxcXFwiO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKGx2ZXIgPCBpdGVtLnZlcikge1xcXFxuICAgICAgICAgICAgbGFiZWwgPSBcXFxcXFxcIvCfhplcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBtUnVsZUxpc3QucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBsYWJlbCArIG5hbWUsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGx2ZXI6IGx2ZXIsXFxcXG4gICAgICAgICAgICBpZDogaXRlbS5pZFxcXFxuICAgICAgICB9LFxcXFxuICAgICAgICBwaWNfdXJsOiBpdGVtLnBpYyxcXFxcbiAgICB9KTtcXFxcbn1cXFxcbi8qIOW9kuW5tuaOkuW6jyBTdGFydCAqL1xcXFxuaWYgKGdldEl0ZW0oXFxcXFxcXCLmjpLluo9cXFxcXFxcIiwgXFxcXFxcXCLml7bpl7TkvJjlhYhcXFxcXFxcIikgPT09ICfmlrDniYjkvJjlhYgnKSB7XFxcXG4gICAgbVJ1bGVMaXN0ID0gbm9ybWFsU29ydChtUnVsZUxpc3QpO1xcXFxufVxcXFxuLyog5b2S5bm25o6S5bqPIEVuZCAqL1xcXFxuZGF0YS5wdXNoLmFwcGx5KGRhdGEsIG1SdWxlTGlzdClcXFxcbnNldFJlc3VsdChkYXRhKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLop4TliJnor6bnu4YtdXNlclxcXCIsXFxcInBhdGhcXFwiOlxcXCJydWxlRGV0YWlsXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuICAgIGNvbnN0IHtcXFxcbiAgICAgICAgZ2V0QXBpLFxcXFxuICAgICAgICBjb2xvcixcXFxcbiAgICAgICAgc21hbGwsXFxcXG4gICAgICAgIGh0bWxUYWcsXFxcXG4gICAgICAgIGFwaSxcXFxcbiAgICAgICAgbWRcXFxcbiAgICB9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbmxldCB7XFxcXG4gICAgaWQsXFxcXG4gICAgbHZlcixcXFxcbiAgICBpc0FsbFxcXFxufSA9IE1ZX1BBUkFNUztcXFxcbmlmKGdldFBhcmFtKFxcXFxcXFwiaWRcXFxcXFxcIikpe1xcXFxuICAgIGlzQWxsID0gdHJ1ZTtcXFxcbiAgICBpZCA9IGdldFBhcmFtKFxcXFxcXFwiaWRcXFxcXFxcIik7XFxcXG4gICAgbHZlciA9IGx2ZXIgfHwgXFxcXFxcXCLmnKrojrflj5bniYjmnKzlj7dcXFxcXFxcIjtcXFxcbn1cXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoaXNBbGwpID0+IHtcXFxcbiAgICBpZighaXNBbGwpe1xcXFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgfVxcXFxufSxpc0FsbCkpO1xcXFxubGV0IGRhdGFJdGVtID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFxcXFxcImdldGJ5aWRcXFxcXFxcIikgKyBcXFxcXFxcIj9pZD1cXFxcXFxcIiArIGlkKSkucmVzdWx0O1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi44CMXFxcXFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcXFxcXCLjgI1cXFxcXFxcIilcXFxcbmxldCBydWxlTGlzdEpzb24gPSBnZXRBcGkoXFxcXFxcXCJydWxlTGlzdEpzb25cXFxcXFxcIikgKyBcXFxcXFxcIj9pZD1cXFxcXFxcIjtcXFxcbmxldCBkYXRhID0gW107XFxcXG52YXIgaGFzU3ViID0gZmFsc2U7XFxcXG5cXFxcbmlmIChkYXRhSXRlbS5pc19qc29uX2xpc3QpIHtcXFxcbiAgICBoYXNTdWIgPSBoYXNIb21lU3ViKHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkKTtcXFxcbn0gZWxzZSBpZiAoIWRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT0gJ2hvbWVfcnVsZV91cmwnKSB7XFxcXG4gICAgaGFzU3ViID0gaGFzSG9tZVN1YihydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArICcmZGVidWc9dHJ1ZScpO1xcXFxufVxcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXFxcXFwiYmlnXFxcXFxcXCIsIFxcXFxcXFwi54mI5pysXFxcXFxcXCIpLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi4oCc4oCc4oCd4oCd5byA5Y+R6ICF77yaXFxcXFxcXCIgKyBjb2xvcihkYXRhSXRlbS5hdXRob3IsIFxcXFxcXFwiIzIyOEJFNlxcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFxu5LqR56uv54mI5pys77yaXFxcXFxcXCIgKyBjb2xvcihkYXRhSXRlbS52ZXIsIFxcXFxcXFwiIzVjZmYyY1xcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFx0XFxcXFxcXFx05pys5Zyw54mI5pys77yaXFxcXFxcXCIgKyBjb2xvcihsdmVyLCBcXFxcXFxcIiM1Y2ZmMmNcXFxcXFxcIikgKyBcXFxcXFxcIlxcXFxcXFxcbuabtOaWsOS6jjogW1xcXFxcXFwiICsgY29sb3IoZGF0YUl0ZW0ubGFzdF91cGRhdGUsIFxcXFxcXFwiI2ZmNzAwMFxcXFxcXFwiKSArIFxcXFxcXFwiXVxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIjzlvIDlj5HogIU+XFxcXFxcXFxuXFxcXFxcXCIgKyBkYXRhSXRlbS5hdXRob3IgKyBcXFxcXFxcIlxcXFxcXFxcbjzlkI3np7A+XFxcXFxcXFxuXFxcXFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcXFxcXCJcXFxcXFxcXG485LqR56uv54mI5pysPlxcXFxcXFxcblxcXFxcXFwiICsgZGF0YUl0ZW0udmVyICsgXFxcXFxcXCJcXFxcXFxcXG485pys5Zyw54mI5pysPlxcXFxcXFxcblxcXFxcXFwiICsgbHZlciArIFxcXFxcXFwiXFxcXFxcXFxuPOabtOaWsOaXtumXtD5cXFxcXFxcXG5bXFxcXFxcXCIgKyBkYXRhSXRlbS5sYXN0X3VwZGF0ZSArIFxcXFxcXFwiXVxcXFxcXFwiKS5jb25maXJtKCgpID0+IHt9KSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMSdcXFxcbn0pO1xcXFxubGV0IGRhdGFUeXBlID0ge1xcXFxuICAgIGhvbWVfcnVsZV91cmw6ICfpppbpobXkupHop4TliJknLFxcXFxuICAgIHB1Ymxpc2g6ICfmj5DkuqTkupHku5PlupPop4TliJknLFxcXFxuICAgIGpzX3VybDogJ+e9kemhteaPkuS7tuinhOWImScsXFxcXG4gICAgaHRtbDogJ+mdmeaAgemhtemdoicsXFxcXG4gICAgY29uZmlnOiAn5Li76aG16YWN572uJ1xcXFxufTtcXFxcblxcXFxubGV0IGJhc2ljID0ge1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbn07XFxcXG5sZXQgZGF0YVR5cGVUaXBzID0gZGF0YVR5cGVbZGF0YUl0ZW0uZGF0YV90eXBlXSB8fCAn5pyq55+l6KeE5YiZ77yaJyArIGRhdGFJdGVtLmRhdGFfdHlwZTtcXFxcblxcXFxubGV0IHNhZmVfdGlwPWRhdGFJdGVtLmlzX3NhZmU/XFxcXFxcXCLlronlhahcXFxcXFxcIjpcXFxcXFxcIuWNsemZqVxcXFxcXFwiO1xcXFxubGV0IGdvb2RfdGlwID0gZGF0YUl0ZW0uaXNfZ29vZD9zbWFsbChjb2xvcihcXFxcXFxcIuOAkOS8mOi0qOinhOWImeOAkVxcXFxcXFwiLCcjZmY3MDAwJykpOlxcXFxcXFwiXFxcXFxcXCI7XFxcXG5sZXQgbm90X3NhZmVfbm90ZT1kYXRhSXRlbS5ub3Rfc2FmZV9ub3RlO1xcXFxuYmFzaWMudGl0bGUgPSBodG1sVGFnKFxcXFxcXFwiYmlnXFxcXFxcXCIsIFxcXFxcXFwi57G75Z6LXFxcXFxcXCIpICsgXFxcXFxcXCJcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcIiArIHNtYWxsKFxcXFxcXFwiKGlkOlxcXFxcXFwiICsgZGF0YUl0ZW0uaWQgKyBcXFxcXFxcIilcXFxcXFxcIikrXFxcXFxcXCJcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcIiArIHNtYWxsKFxcXFxcXFwiKOmjjumZqeajgOa1izpcXFxcXFxcIiArc2FmZV90aXArXFxcXFxcXCIpXFxcXFxcXCIpK2dvb2RfdGlwO1xcXFxuYmFzaWMuZGVzYyA9IFxcXFxcXFwi5pWw5o2u57G75Z6L77yaXFxcXFxcXCIgKyBjb2xvcihkYXRhVHlwZVRpcHMsIFxcXFxcXFwiI2NiNTRmZlxcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFxu5YiG5Lqr54q25oCB5Li677yaXFxcXFxcXCIgKyBkYXRhSXRlbS5zdGF0ZTtcXFxcbmlmIChbXFxcXFxcXCJodG1sXFxcXFxcXCIsIFxcXFxcXFwiY29uZmlnXFxcXFxcXCIsIFxcXFxcXFwianNfdXJsXFxcXFxcXCJdLmluY2x1ZGVzKGRhdGFJdGVtLmRhdGFfdHlwZSkpIHtcXFxcbiAgICBiYXNpYy5kZXNjICs9IFxcXFxcXFwiXFxcXFxcXFxu4oCc4oCc4oCd4oCdID0+XFxcXFxcXCIgKyBzbWFsbChcXFxcXFxcIueCueatpOmihOiniFxcXFxcXFwiKTtcXFxcbiAgICBiYXNpYy51cmwgPSBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXFxcbn1cXFxcblxcXFxuZGF0YS5wdXNoKGJhc2ljKTtcXFxcbmxldCBoYXNTdWJzID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbmlmIChoYXNTdWIpIHtcXFxcbiAgICBoYXNTdWJzID0gXFxcXFxcXCJcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcIiArIHNtYWxsKFxcXFxcXFwi5bey6K6i6ZiFXFxcXFxcXCIpXFxcXG59XFxcXG5cXFxcbmxldCBub3RlcyA9IHJlcXVlc3QoZ2V0QXBpKFxcXFxcXFwiZ2V0X3J1bGVfbm90ZVxcXFxcXFwiKSArIGlkKTtcXFxcbm5vdGVzID0gSlNPTi5wYXJzZShub3RlcykucmVzdWx0O1xcXFxucmVxdWlyZShtZCk7XFxcXG5sZXQgbm90ZXNIdG1sPVxcXFxcXFwiXFxcXFxcXCJcXFxcbnRyeXtcXFxcbiAgICBub3Rlc0h0bWw9bWFya2VkLnBhcnNlKG5vdGVzKTtcXFxcbn1jYXRjaChlKXt9XFxcXG5cXFxcbmlmIChub3RlcyAhPT0gZmFsc2UpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogaHRtbFRhZyhcXFxcXFxcImJpZ1xcXFxcXFwiLCBcXFxcXFxcIuWkh+azqFxcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXCIgKyBzbWFsbChodG1sVGFnKFxcXFxcXFwidVxcXFxcXFwiLCBcXFxcXFxcIuafpeeci+WujOaVtOWFrOWRiiA+XFxcXFxcXCIpKSxcXFxcbiAgICAgICAgZGVzYzogbm90ZXMsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIHRleHQ6IG5vdGVzSHRtbCxcXFxcbiAgICAgICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWUsXFxcXG4gICAgICAgICAgICAvLyB0eXBlOiBcXFxcXFxcImxvbmdfdGV4dFxcXFxcXFwiXFxcXG4gICAgICAgICAgICB0eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbn1cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLmk43kvZwo5YiG5Lqr6K+m57uG6aG1KVxcXFxcXFwiKSArIGhhc1N1YnMsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImNvcHk6Ly/pgZPplb/ku5PlupPjgIxcXFxcXFxcIitkYXRhSXRlbS5uYW1lK1xcXFxcXFwi44CNXFxcXFxcXFxuXFxcXFxcXCIraWQrJ0BpbXBvcnQ9anM6JC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3J1bGVEZXRhaWxJbXBvcnQ/cnVsZT3pgZPplb/ku5PlupNQcm9cXFxcXFxcIiwgaW5wdXQpJ1xcXFxufSk7XFxcXG5sZXQgaW1wb3J0VXJsLCBydWxlQ29kZSwgc2hhcmVVcmwsIGJhY2tDb2RlID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbmlmICghZGF0YUl0ZW0uaXNfanNvbikge1xcXFxuICAgIGJhY2tDb2RlID0gcmVxdWVzdChydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCk7XFxcXG59XFxcXG5zd2l0Y2ggKGRhdGFJdGVtLmRhdGFfdHlwZSkge1xcXFxuICAgIGNhc2UgXFxcXFxcXCJob21lX3J1bGVfdXJsXFxcXFxcXCI6XFxcXG4gICAgICAgIHJ1bGVDb2RlID0gXFxcXFxcXCLmtbfpmJTop4bnlYzpppbpobXpopHpgZPop4TliJnjgJBcXFxcXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFxcXFxcIuOAke+/pWhvbWVfcnVsZV91cmzvv6VcXFxcXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcXFxuICAgICAgICBpbXBvcnRVcmwgPSBcXFxcXFxcInJ1bGU6Ly9cXFxcXFxcIiArIGJhc2U2NEVuY29kZShydWxlQ29kZSlcXFxcbiAgICAgICAgYnJlYWs7XFxcXG4gICAgY2FzZSAncHVibGlzaCc6XFxcXG4gICAgICAgIHJ1bGVDb2RlID0gJ+a1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8micgKyBkYXRhSXRlbS5uYW1lICsgJ++/pXB1Ymxpc2jvv6UnICsgYmFzZTY0RW5jb2RlKGJhY2tDb2RlKTtcXFxcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXFxcbiAgICAgICAgYnJlYWs7XFxcXG4gICAgY2FzZSAnanNfdXJsJzpcXFxcbiAgICAgICAgcnVsZUNvZGUgPSAn5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77ya572R6aG15o+S5Lu277+lanNfdXJs77+lJyArIGRhdGFJdGVtLm5hbWUgKyAnQGJhc2U2NDovLycgKyBiYXNlNjRFbmNvZGUoYmFja0NvZGUpO1xcXFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcXFxuICAgICAgICBicmVhaztcXFxcbiAgICBjYXNlICdodG1sJzpcXFxcbiAgICAgICAgbGV0IGZpbGVfdG1wID0gZGF0YUl0ZW0ubmFtZS5zcGxpdCgnLicpO1xcXFxuICAgICAgICBsZXQgZmlsZV9wYXRoID0gZmlsZV90bXAubGVuZ3RoID4gMSA/IGZpbGVfdG1wW2ZpbGVfdG1wLmxlbmd0aCAtIDFdICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBkYXRhSXRlbS5uYW1lIDogZGF0YUl0ZW0ubmFtZTtcXFxcbiAgICAgICAgcnVsZUNvZGUgPSBcXFxcXFxcIua1t+mYlOinhueVjOacrOWcsOaWh+S7tuWIhuS6q++/pWZpbGVfdXJs77+laGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL1xcXFxcXFwiICsgZmlsZV9wYXRoICsgXFxcXFxcXCJAXFxcXFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXFxcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXFxcbiAgICAgICAgYnJlYWtcXFxcbiAgICBjYXNlIFxcXFxcXFwiY29uZmlnXFxcXFxcXCI6XFxcXG4gICAgICAgIGltcG9ydFVybCA9ICQoKS5ydWxlKHBhc3N3b3JkID0+IHtcXFxcbiAgICAgICAgICAgIGV2YWwoZmV0Y2goXFxcXFxcXCJoaWtlcjovL2Fzc2V0cy9ob21lLmpzXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgICAgIEhpa2VySG9tZS5sb2FkKFxcXFxcXFwiaW1wb3J0XFxcXFxcXCIsIHBhc3N3b3JkKTtcXFxcbiAgICAgICAgfSwgYmFja0NvZGUpO1xcXFxuICAgICAgICBicmVhaztcXFxcbn1cXFxcbmxldCBteV9jb2xfdHlwZSA9IFxcXFxcXFwidGV4dF8yXFxcXFxcXCI7XFxcXG5sZXQgbXlfY29sX3R5cGUyID0gXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIjtcXFxcbmlmIChpbXBvcnRVcmwpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLlr7zlhaXop4TliJlcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiBkYXRhSXRlbS5pc19zYWZlP2ltcG9ydFVybDondG9hc3Q6Ly/po47pmanop4TliJnnpoHmraLlr7zlhaUhISEnLFxcXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbiAgICB9KTtcXFxcbn1cXFxcbmlmIChydWxlQ29kZSkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuWIhuS6q+WPo+S7pFxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiY29weTovL1xcXFxcXFwiICsgcnVsZUNvZGUsXFxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcXFxuICAgIH0pO1xcXFxufVxcXFxuXFxcXG5pZiAoaW1wb3J0VXJsKSB7XFxcXG4gICAgaWYgKGRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiAhaGFzU3ViKSB7XFxcXG4gICAgICAgIGxldCBzdWJfcnVsZV9jb2RlID0gJ+a1t+mYlOinhueVjOWQiOmbhuinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lJyArIGRhdGFJdGVtLm5hbWUgKyBcXFxcXFxcIkBAXFxcXFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXFxcbiAgICAgICAgbGV0IHN1Yl91cmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUoc3ViX3J1bGVfY29kZSk7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJ+iuoumYheWQiOmbhicsXFxcXG4gICAgICAgICAgICB1cmw6IHN1Yl91cmwsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGUyXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAjZmY3MDAwXFxcXFxcXCI+5a+85YWl6L275ZCI6ZuGPC9zcGFuPicsXFxcXG4gICAgICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZGF0YUl0ZW0sc3ViVXJsKT0+e1xcXFxuICAgICAgICAgICAgICAgIGNvbnN0IHtnZW5SdWxlfT0kLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvZ2VuQXBpXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGxldCBpbXBvcnRfcnVsZT1nZW5SdWxlKGRhdGFJdGVtLm5hbWUrXFxcXFxcXCIuXFxcXFxcXCIrZGF0YUl0ZW0uYXV0aG9yLHN1YlVybCk7XFxcXG4gICAgICAgICAgICAgICAgLy9jb3B5KGltcG9ydF9ydWxlKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcnVsZUNvZGU9cGFyc2VQYXN0ZShpbXBvcnRfcnVsZS5zcGxpdChcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiKVswXSk7XFxcXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBpbXBvcnRVcmxcXFxcbiAgICAgICAgICAgIH0sZGF0YUl0ZW0scnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlMlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogI2ZmNzAwMFxcXFxcXFwiPuWvvOWFpemBk+W+t+e7jzwvc3Bhbj4nLFxcXFxuICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRhdGFJdGVtLHN1YlVybCk9PntcXFxcbiAgICAgICAgICAgICAgICAvLyBsZXQgdGl0bGUgPSBcXFxcXFxcIkgtXFxcXFxcXCIrZGF0YUl0ZW0ubmFtZStcXFxcXFxcIi5cXFxcXFxcIitkYXRhSXRlbS5hdXRob3I7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gXFxcXFxcXCJKLVxcXFxcXFwiK2RhdGFJdGVtLm5hbWUuc3BsaXQoJy4nKVswXTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgc3ViT2JqID0ge1xcXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogc3ViVXJsLFxcXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBcXFxcXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9ydWxlQ2FjaGUvXFxcXFxcXCIrdGl0bGUrXFxcXFxcXCIuanNvblxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IGZhbHNlLC8v56aB55So5bm25Y+R5pu05pawXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGxldCBzaGFyZVRleHQgPSBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoc3ViT2JqKSk7XFxcXG4gICAgICAgICAgICAgICAgdmFyIHBhc3RlcyA9IGdldFBhc3RlcygpO1xcXFxuICAgICAgICAgICAgICAgIHZhciB1cmwgPSBzaGFyZVBhc3RlKHNoYXJlVGV4dCxwYXN0ZXMuc2xpY2UoLTEpWzBdKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgaW1wb3J0X3J1bGU9IFxcXFxcXFwi6L275ZCI6ZuG6K6i6ZiF77yaXFxcXFxcXCIrdGl0bGUrJ1xcXFxcXFxcbicrdXJsO1xcXFxuICAgICAgICAgICAgICAgIGNvcHkoaW1wb3J0X3J1bGUpO1xcXFxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSAnaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL3J1bGVDYWNoZS9zdWIuanNvbic7XFxcXG4gICAgICAgICAgICAgICAgJC5yYyhjb25maWcubGliLnN1Yik7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIOiuoumYheWvvOWFpShwYXRoKVxcXFxuICAgICAgICAgICAgfSxkYXRhSXRlbSxydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGUyXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwiPHNtYWxsPuaPkOekuu+8muW8gOWPkeiAheWNleeLrOWIhuS6q+eahOWQiOmbhuaWh+S7tuWPquiDveWNleeLrOWvvOWFpeOAgjwvc21hbGw+XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9IGVsc2UgaWYgKCFkYXRhSXRlbS5pc19qc29uX2xpc3QgJiYgIWhhc1N1YiAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT0gJ2hvbWVfcnVsZV91cmwnKSB7XFxcXG4gICAgICAgIGxldCBzdWJfcnVsZV9jb2RlID0gJ+a1t+mYlOinhueVjOWNleinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lJyArIGRhdGFJdGVtLm5hbWUgKyBcXFxcXFxcIkBAXFxcXFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArICcmZGVidWc9dHJ1ZSc7XFxcXG4gICAgICAgIGxldCBzdWJfdXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHN1Yl9ydWxlX2NvZGUpO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6ICforqLpmIXop4TliJknLFxcXFxuICAgICAgICAgICAgdXJsOiBzdWJfdXJsLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG4gICAgICAgIH0pXFxcXG4gICAgfVxcXFxufVxcXFxuaWYgKGRhdGFJdGVtLmlzX2pzb24gJiYgZGF0YUl0ZW0uZGF0YV90eXBlID09PSBcXFxcXFxcImhvbWVfcnVsZV91cmxcXFxcXFxcIiAmJiAhZGF0YUl0ZW0uaXNfanNvbl9saXN0KSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6ICfov5vlhaXpopHpgZMnLFxcXFxuICAgICAgICB1cmw6ICQoIFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKG5hbWUsaG9tZSkgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IGhhc1J1bGUgPSByZXF1ZXN0KCdoaWtlcjovL2hvbWVAJytuYW1lKSAhPSAnbnVsbCc7XFxcXG4gICAgICAgICAgICBpZiAoaGFzUnVsZSkge1xcXFxuICAgICAgICAgICAgICAgIGJhY2tUb0hvbWUoKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gaG9tZStcXFxcXFxcInNAXFxcXFxcXCIgKyBuYW1lO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+acquWuieijhVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9LCBkYXRhSXRlbS5uYW1lLGFwaS5ob21lKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG4gICAgfSlcXFxcbn1cXFxcbmxldCBtYW5fcnVsZV9zYWZlID0gZ2V0QXBpKFxcXFxcXFwibWFuUnVsZVNhZmVcXFxcXFxcIikrZGF0YUl0ZW0uaWQ7XFxcXG5sZXQgbWFuX3J1bGVfZ29vZCA9IGdldEFwaShcXFxcXFxcIm1hblJ1bGVHb29kXFxcXFxcXCIpK2RhdGFJdGVtLmlkO1xcXFxuLy8gZGF0YUl0ZW0uaXNfc2FmZTtcXFxcbmlmKGdldFZhcignaG91c2UuaXNfbWFuYWdlcicpKXtcXFxcbiAgICBmdW5jdGlvbiBzZXRJc1NhZmUoZmxhZyxtYW5fcnVsZV9zYWZlKSB7XFxcXG4gICAgICAgIGZsYWcgPSBmbGFnIHx8ICcnO1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IGNvZGUgPSBmZXRjaChtYW5fcnVsZV9zYWZlLCB7XFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOiBNT0JJTEVfVUF9LFxcXFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInVzZXJuYW1lXFxcXFxcXCI6IGdldFZhcignaG91c2UudXNlcm5hbWUnKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCI6IGdldFZhcignaG91c2UucGFzc3dvcmQnKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcImlzX3NhZmVcXFxcXFxcIjogISFmbGFnXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICBjb2RlID0gSlNPTi5wYXJzZShjb2RlKS5yZXN1bHQ7XFxcXG4gICAgICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT09IDApIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZS5kZXRhaWxcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGNvZGUuZGV0YWlsXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBlLm1lc3NhZ2VcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBmdW5jdGlvbiBzZXRJc0dvb2QoZmxhZyxtYW5fcnVsZV9nb29kKSB7XFxcXG4gICAgICAgIGZsYWcgPSBmbGFnIHx8ICcnO1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IGNvZGUgPSBmZXRjaChtYW5fcnVsZV9nb29kLCB7XFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOiBNT0JJTEVfVUF9LFxcXFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInVzZXJuYW1lXFxcXFxcXCI6IGdldFZhcignaG91c2UudXNlcm5hbWUnKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCI6IGdldFZhcignaG91c2UucGFzc3dvcmQnKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcImlzX2dvb2RcXFxcXFxcIjogISFmbGFnXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICBjb2RlID0gSlNPTi5wYXJzZShjb2RlKS5yZXN1bHQ7XFxcXG4gICAgICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT09IDApIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZS5kZXRhaWxcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGNvZGUuZGV0YWlsXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBlLm1lc3NhZ2VcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTon8J+aq+mjjumZqScsXFxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uumjjumZqT/po47pmanop4TliJnml6Dms5Xooqvlr7zlhaUnKS5jb25maXJtKChpZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSk9PntcXFxcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc1NhZmUoZmFsc2UsbWFuX3J1bGVfc2FmZSk7XFxcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSlcXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTon4pyF5q2j5bi4JyxcXFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcXFxuICAgICAgICB1cmw6JCgn5qCH6K6w6K+l6KeE5YiZ5Li65q2j5bi4PycpLmNvbmZpcm0oKGlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKT0+e1xcXFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldElzU2FmZSh0cnVlLG1hbl9ydWxlX3NhZmUpO1xcXFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxcXG4gICAgICAgIH0sZGF0YUl0ZW0uaWQsbWFuX3J1bGVfc2FmZSxzZXRJc1NhZmUpXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6J+KZpemdnuS8mOi0qCcsXFxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uumdnuS8mOi0qD8nKS5jb25maXJtKChpZCxtYW5fcnVsZV9nb29kLHNldElzR29vZCk9PntcXFxcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc0dvb2QoZmFsc2UsbWFuX3J1bGVfZ29vZCk7XFxcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9nb29kLHNldElzR29vZClcXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTon8J+SluS8mOi0qCcsXFxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uuS8mOi0qD8nKS5jb25maXJtKChpZCxtYW5fcnVsZV9nb29kLHNldElzR29vZCk9PntcXFxcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc0dvb2QodHJ1ZSxtYW5fcnVsZV9nb29kKTtcXFxcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcXFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX2dvb2Qsc2V0SXNHb29kKVxcXFxuICAgIH0pO1xcXFxufVxcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBkYXRhSXRlbS5nb29kX251bSxcXFxcbiAgICBwaWNfdXJsOiBcXFxcXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/otZ4uc3ZnXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl9zbWFsbF8zXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9NYWtlQWNvbW1lbnQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgaWQ6IGRhdGFJdGVtLmlkLFxcXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lXFxcXG4gICAgfVxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBkYXRhSXRlbS5iYWRfbnVtLFxcXFxuICAgIHBpY191cmw6IFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+i4qS5zdmdcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uX3NtYWxsXzNcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL01ha2VBY29tbWVudCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxcXG4gICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWUsXFxcXG4gICAgICAgIGRlZmF1bHRUeXBlOlxcXFxcXFwiYmFkXFxcXFxcXCJcXFxcbiAgICB9XFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi6K+E6K66XFxcXFxcXCIsXFxcXG4gICAgcGljX3VybDogXFxcXFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6K+E6K66LnN2Z1xcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fc21hbGxfM1xcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvTWFrZUFjb21tZW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXFxcbiAgICAgICAgbmFtZTogZGF0YUl0ZW0ubmFtZVxcXFxuICAgIH1cXFxcbn0pO1xcXFxubGV0IHRvdGFsU3VtID0gZGF0YUl0ZW0uZ29vZF9udW0gKyBkYXRhSXRlbS5iYWRfbnVtO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXFxcXFwiYmlnXFxcXFxcXCIsIFxcXFxcXFwi6K+E6K66KFxcXFxcXFwiICsgdG90YWxTdW0gKyBcXFxcXFxcIilcXFxcXFxcIikgKyBcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFwiICsgc21hbGwoaHRtbFRhZyhcXFxcXFxcInVcXFxcXFxcIiwgXFxcXFxcXCLmn6XnnIvlhajpg6jor4TorrogPlxcXFxcXFwiKSksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9Db21tZW50XFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHkjZnlwYWdlI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxcXG4gICAgICAgIHRvdGFsU3VtOiB0b3RhbFN1bSxcXFxcbiAgICAgICAgbm9fYWN0aXZlOiBmYWxzZVxcXFxuICAgIH1cXFxcbn0pO1xcXFxuLy9jb25zdCBsb25nZXN0U3VtPTEyMDtcXFxcbmxldCBpY29uID0ge1xcXFxuICAgIFxcXFxcXFwiZ29vZFxcXFxcXFwiOiBcXFxcXFxcIvCfkY1cXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImJhZFxcXFxcXFwiOiBcXFxcXFxcIvCfkY5cXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcInJlcGx5XFxcXFxcXCI6XFxcXFxcXCLlvIDlj5HogIXwn5ejXFxcXFxcXCJcXFxcbn1cXFxcbmlmICh0b3RhbFN1bSA9PT0gMCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuS4gOadoeivhOiuuuS5n+ayoeacie+8jOW/q+adpeaKouaymeWPkeWQp++8gTwvaDU+XFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59IGVsc2Uge1xcXFxuICAgIGxldCBjb21tZW50TGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuZGlzX2dldCArIGRhdGFJdGVtLmlkICsgXFxcXFxcXCI/bGltaXQ9NVxcXFxcXFwiKSkucmVzdWx0O1xcXFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXFxcbiAgICAgICAgbGV0IFJlcGx5ID0gaXRlbS5kaXNjdXNzX3R5cGU9PT1cXFxcXFxcInJlcGx5XFxcXFxcXCImJml0ZW0ucmVwbHlfdG9fbmFtZSE9PWZhbHNlJiZpdGVtLnJlcGx5X3RvX2lkIT09ZmFsc2U/XFxcXFxcXCLigJjigJjlm57lpI1AXFxcXFxcXCIraXRlbS5yZXBseV90b19uYW1lK1xcXFxcXFwiICNcXFxcXFxcIitpdGVtLmRpc2N1c3NfaWQrXFxcXFxcXCLigJnigJlcXFxcXFxcXG5cXFxcXFxcIjpcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSArIFxcXFxcXFwiJm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9J2dyYXknPjxzbWFsbD4jXFxcXFxcXCIgKyBpdGVtLmlkICsgXFxcXFxcXCI8L3NtYWxsPjxmb250PlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYXZhdGFyXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAvL3VybDogXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgaXRlbS5xcSxcXFxcbiAgICAgICAgICAgIHVybDpcXFxcXFxcIm1xcXdwYTovL2ltL2NoYXQ/Y2hhdF90eXBlPXdwYSZ1aW49XFxcXFxcXCIraXRlbS5xcSxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXFxcbiAgICAgICAgICAgIGRlc2M6IFJlcGx5K2l0ZW0uY3JlYXRlX2RhdGUgKyBcXFxcXFxcIsK3XFxcXFxcXCIgKyBpY29uW2l0ZW0uZGlzY3Vzc190eXBlXSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYTp7XFxcXG4gICAgICAgICAgICAgICAgbmFtZTppdGVtLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgdHlwZTpcXFxcXFxcImxvbmdfdGV4dFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHRleHQ6aXRlbS5kaXNjdXNzX3RleHRcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufVxcXFxuXFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcInJpY2hfdGV4dFxcXCIsXFxcIm5hbWVcXFwiOlxcXCLmn6XnnItcXFwiLFxcXCJwYXRoXFxcIjpcXFwiaW5mb1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuafpeeci+OAjFxcXFxcXFwiK01ZX1BBUkFNUy5uYW1lK1xcXFxcXFwi44CNXFxcXFxcXCIpXFxcXG5zZXRSZXN1bHQoW3tcXFxcbiAgICB0aXRsZTogTVlfUEFSQU1TLnRleHQsXFxcXG4gICAgY29sX3R5cGU6TVlfUEFSQU1TLnR5cGVcXFxcbn1dKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlvIDlj5HogIXms6jlhoxcXFwiLFxcXCJwYXRoXFxcIjpcXFwiUmVnaXN0ZXJcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLlvIDlj5HogIXms6jlhoxcXFxcXFxcIik7XFxcXG5jb25zdCB7XFxcXG4gICAgZ2V0QXBpLFxcXFxuICAgIGh0bWxUYWcsXFxcXG4gICAgbWFwQ29sVHlwZSxcXFxcbiAgICBzbWFsbFxcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG52YXIgZGF0YSA9IFtdO1xcXFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5QYXNzd29yZFxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5Vc2VybmFtZVxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5EZXNjcmlwdGlvblxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5Vc2VyQWRkcmVzc1xcXFxcXFwiKTtcXFxcbn0pKTtcXFxcbmFkZExpc3RlbmVyKCdvblJlZnJlc2gnLCAkLnRvU3RyaW5nKCgpPT57XFxcXG4gICAgcHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLldhaXRcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG59KSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiAn6LSm5Y+3JyxcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuivt+i+k+WFpei0puWPtyjlv4XloaspXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5Vc2VybmFtZScsICcnKSxcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJudW1iZXJcXFxcXFxcIixcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuVXNlcm5hbWVcXFxcXFxcIixpbnB1dCknXFxcXG4gICAgfVxcXFxufSwge1xcXFxuICAgIHRpdGxlOiAn5a+G56CBJyxcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuivt+i+k+WFpeWvhueggSjlv4XloaspXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5QYXNzd29yZCcsICcnKSxcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiLFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZS5QYXNzd29yZFxcXFxcXFwiLGlucHV0KSdcXFxcbiAgICB9XFxcXG59KTtcXFxcbm1hcENvbFR5cGUoZGF0YSwgXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCIsIDEpO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+aYteensCcsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLor7fovpPlhaXmmLXnp7Ao5b+F5aGrKVxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UuVXNlckFkZHJlc3MnLCAnJyksXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLlVzZXJBZGRyZXNzXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0sIHtcXFxcbiAgICB0aXRsZTogJ+aPj+i/sCcsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLor7Tor7TkuLrku4DkuYjopoHms6jlhozlkKdcXFxcXFxcXG4o5Y+v5Lul5aKe5Yqg6YCa6L+H5qaC546HLOmAieWhqylcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLkRlc2NyaXB0aW9uJywgJycpLFxcXFxuICAgICAgICB0eXBlOiBcXFxcXFxcInRleHRhcmVhXFxcXFxcXCIsXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLkRlc2NyaXB0aW9uXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0pXFxcXG5cXFxcbm1hcENvbFR5cGUoZGF0YSwgXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCIsIDEpO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXFxcXFwiYlxcXFxcXFwiLCBcXFxcXFxcIuazqOWGjFxcXFxcXFwiKSxcXFxcbiAgICB1cmw6ICQoZ2V0QXBpKFxcXFxcXFwibmV3X2RldlxcXFxcXFwiKStcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChnZXRJZCwgY29uZmlybSkgPT4ge1xcXFxuICAgICAgICBsZXQgdXNlcm5hbWUgPSBnZXRWYXIoJ1dhcmVob3VzZS5Vc2VybmFtZScsIFxcXFxcXFwiXFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgcGFzc3dvcmQgPSBnZXRWYXIoJ1dhcmVob3VzZS5QYXNzd29yZCcsIFxcXFxcXFwiXFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBnZXRWYXIoJ1dhcmVob3VzZS5EZXNjcmlwdGlvbicsIFxcXFxcXFwiXFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgbmFtZSA9IGdldFZhcihcXFxcXFxcIldhcmVob3VzZS5Vc2VyQWRkcmVzc1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgaWYgKFt1c2VybmFtZSwgcGFzc3dvcmQsIG5hbWVdLmluY2x1ZGVzKFxcXFxcXFwiXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+i0puWPtyzlr4bnoIHlkozmmLXnp7DkuI3og73kuLrnqbpcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBzaG93TG9hZGluZyhcXFxcXFxcIuato+WcqOaPkOS6pOeUs+ivt+ihqFxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQsIHtcXFxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJyZWFzb25cXFxcXFxcIjogZGVzY3JpcHRpb24sXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBuYW1lLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCI6IHBhc3N3b3JkLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInFxXFxcXFxcXCI6IHVzZXJuYW1lXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICBtZXRob2Q6ICdwb3N0J1xcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXFxcbiAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyByZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBpZHJlc3VsdCA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRJZCArIFxcXFxcXFwiP3FxPVxcXFxcXFwiICsgdXNlcm5hbWUpKTtcXFxcbiAgICAgICAgaWYgKGlkcmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIGlkcmVzdWx0LmRldGFpbDtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBcXFxcbiAgICAgICAgcmV0dXJuICQoXFxcXFxcXCJcXFxcXFxcIiwgXFxcXFxcXCLovpPlhaXpgq7nrrHpqozor4HnoIFcXFxcXFxcXG5cXFxcXFxcIiArIHJlc3VsdC5kZXRhaWwpLmlucHV0KChjb25maXJtLCBpZCwgYWNjb3VudCkgPT4ge1xcXFxuICAgICAgICAgICAgc2hvd0xvYWRpbmcoXFxcXFxcXCLor7fogJDlv4PnrYnlvoVcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGNvbmZpcm0sIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcXFxuICAgICAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhcmFtc1xcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJyZWdpc3RfaWRcXFxcXFxcIjogaWQsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJ5em1cXFxcXFxcIjogaW5wdXRcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXFxcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcXFxuICAgICAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgcmVzdWx0LmRldGFpbDtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2VVc2VybmFtZVxcXFxcXFwiLCBhY2NvdW50WzBdKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlUGFzc3dvcmRcXFxcXFxcIiwgYWNjb3VudFsxXSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/miJDlip/mj5DkuqTms6jlhozms6jlhoxcXFxcXFxcXG5cXFxcXFxcIityZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Ye66ZSZ5LqG5ZGQXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0sIGNvbmZpcm0sIGlkcmVzdWx0LnJlc3VsdCwgW3VzZXJuYW1lLCBwYXNzd29yZF0pO1xcXFxuICAgIH0sIGdldEFwaShcXFxcXFxcIm5ld19nZXRJZFxcXFxcXFwiKSwgZ2V0QXBpKFxcXFxcXFwibmV3X2NvbmZpcm1cXFxcXFxcIikpLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXFxcbn0pO1xcXFxuc2V0UmVzdWx0KGRhdGEpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJ0ZXh0XzFcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5Liq5Lq66LWE5paZXFxcIixcXFwicGF0aFxcXCI6XFxcIlBlcnNvbmFsRGF0YVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuS4quS6uui1hOaWmVxcXFxcXFwiKTtcXFxcbnZhciBkYXRhPVtdO1xcXFxuY29uc3Qge1xcXFxuICAgIGdldEFwaSxcXFxcbiAgICBnZXRGaWxlLFxcXFxuICAgIGFwaVxcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5sZXQge3VzZXJuYW1lLHBhc3N3b3JkfSA9IGdldEZpbGUoKTtcXFxcbmxldCBkZXYgPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXFxcXFwidXNlclxcXFxcXFwiKStNWV9QQVJBTVMuaWQpKS5yZXN1bHQ7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwi5aS05YOPXFxcXFxcXCIsXFxcXG4gICAgZGVzYzpkZXYuYXZhdGFyLFxcXFxuICAgIHVybDpcXFxcXFxcImhpa2VyOi8vcGFnZS9tb2RpZnlfUGVyc29uYWxEYXRhI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgIGV4dHJhOntcXFxcbiAgICAgICAgZGV2OmRldixcXFxcbiAgICAgICAgdXNlcm5hbWU6dXNlcm5hbWUsXFxcXG4gICAgICAgIHBhc3N3b3JkOnBhc3N3b3JkLFxcXFxuICAgICAgICBQYXR0ZXJuOjBcXFxcbiAgICB9LFxcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6XFxcXFxcXCLmmLXnp7BcXFxcXFxcIixcXFxcbiAgICBkZXNjOmRldi5uYW1lLFxcXFxuICAgIHVybDpcXFxcXFxcImhpa2VyOi8vcGFnZS9tb2RpZnlfUGVyc29uYWxEYXRhI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgIGV4dHJhOntcXFxcbiAgICAgICAgZGV2OmRldixcXFxcbiAgICAgICAgdXNlcm5hbWU6dXNlcm5hbWUsXFxcXG4gICAgICAgIHBhc3N3b3JkOnBhc3N3b3JkLFxcXFxuICAgICAgICBQYXR0ZXJuOjFcXFxcbiAgICB9LFxcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwi5a+G56CBXFxcXFxcXCIsXFxcXG4gICAgdXJsOlxcXFxcXFwiaGlrZXI6Ly9wYWdlL21vZGlmeV9QZXJzb25hbERhdGEjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6e1xcXFxuICAgICAgICBkZXY6ZGV2LFxcXFxuICAgICAgICB1c2VybmFtZTp1c2VybmFtZSxcXFxcbiAgICAgICAgcGFzc3dvcmQ6cGFzc3dvcmQsXFxcXG4gICAgICAgIFBhdHRlcm46MlxcXFxuICAgIH0sXFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6XFxcXFxcXCLotKblj7fvvJpcXFxcXFxcIit1c2VybmFtZSxcXFxcbiAgICB1cmw6XFxcXFxcXCJjb3B5Oi8vXFxcXFxcXCIrdXNlcm5hbWUsXFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwiVUlE77yaXFxcXFxcXCIrZGV2LmlkLFxcXFxuICAgIHVybDpcXFxcXFxcImNvcHk6Ly9cXFxcXFxcIitkZXYuaWQsXFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6XFxcXFxcXCLmj5DkuqTkupHku5PlupPop4TliJlcXFxcXFxcIixcXFxcbiAgICB1cmw6JChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChob3N0KT0+e1xcXFxuICAgICAgICBsZXQgY29kZT1yZXF1ZXN0KGhvc3QrXFxcXFxcXCIvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD0xNDVcXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCB3b3JkPVxcXFxcXFwi77+lcHVibGlzaO+/pVxcXFxcXFwiK2Jhc2U2NEVuY29kZShjb2RlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwicnVsZTovL1xcXFxcXFwiK2Jhc2U2NEVuY29kZSh3b3JkKTtcXFxcbiAgICB9LGFwaS5ob3N0KSxcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6XFxcXFxcXCLlkIzmraXmj5DkuqTkupHku5PlupPotKblj7flr4bnoIFcXFxcXFxcIixcXFxcbiAgICB1cmw6XFxcXFxcXCJydWxlOi8vXFxcXFxcXCIrYmFzZTY0RW5jb2RlKFxcXFxcXFwi77+lcHVibGlzaF9hY2NvdW5077+lXFxcXFxcXCIrdXNlcm5hbWUrXFxcXFxcXCJAXFxcXFxcXCIrcGFzc3dvcmQpLFxcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwi5L2g5LiA5YWx5Y+R5biD5LqG44CMXFxcXFxcXCIrZGV2LnJ1bGVfbnVtK1xcXFxcXFwi44CN5p2h6KeE5YiZXFxcXFxcXCIsXFxcXG4gICAgdXJsOlxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5sZXQgdXNlciA9IGdldEZpbGUoKTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6XFxcXFxcXCLms6jplIDnmbvlvZVcXFxcXFxcIixcXFxcbiAgICB1cmw6JChcXFxcXFxcIuehruiupOazqOmUgOeZu+W9lT9cXFxcXFxcIikuY29uZmlybShmID0+IHtcXFxcbiAgICAgICAgZi51c2VybmFtZT1cXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICBmLnBhc3N3b3JkPVxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb24nLCBKU09OLnN0cmluZ2lmeShmKSk7XFxcXG4gICAgICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZS5iYWNrXFxcXFxcXCIsXFxcXFxcXCIxXFxcXFxcXCIpO1xcXFxuICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey5rOo6ZSAXFxcXFxcXCI7XFxcXG4gICAgfSx1c2VyKSxcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIlxcXFxufSk7XFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5pu05pS55Liq5Lq66LWE5paZXFxcIixcXFwicGF0aFxcXCI6XFxcIm1vZGlmeV9QZXJzb25hbERhdGFcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCB7XFxcXG4gICAgZ2V0QXBpLFxcXFxuICAgIGNvbG9yLFxcXFxuICAgIHNtYWxsLFxcXFxuICAgIGdldEZpbGUsXFxcXG4gICAgaHRtbFRhZ1xcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5sZXQge1xcXFxuICAgIGRldixcXFxcbiAgICB1c2VybmFtZSxcXFxcbiAgICBwYXNzd29yZCxcXFxcbiAgICBQYXR0ZXJuXFxcXG59ID0gTVlfUEFSQU1TO1xcXFxudmFyIGRhdGEgPSBbXTtcXFxcbmxldCBwYXRoID0gXFxcXFxcXCI/cXE9XFxcXFxcXCIgKyB1c2VybmFtZSArIFxcXFxcXFwiJnBhc3N3b3JkPVxcXFxcXFwiICsgcGFzc3dvcmQ7XFxcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0ucGV0TmFtZVxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5tLmF2YXRhclxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLmNcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC54XFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQueVxcXFxcXFwiKTtcXFxcbn0pKTtcXFxcbmZ1bmN0aW9uIG1fcGV0TmFtZSgpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICAgICAgZGVzYzogXFxcXFxcXCLor7fovpPlhaXmlrDmmLXnp7BcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0ucGV0TmFtZScsICcnKXx8ZGV2Lm5hbWUsXFxcXG4gICAgICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZS5tLnBldE5hbWVcXFxcXFxcIixpbnB1dCknXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLkv53lrZhcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKGdldEFwaShcXFxcXFxcIm1vZGlmeV9uYW1lXFxcXFxcXCIpICsgcGF0aCkubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IG5ld1BldE5hbWUgPSBnZXRWYXIoJ1dhcmVob3VzZS5tLnBldE5hbWUnLCAnJyk7XFxcXG4gICAgICAgICAgICBpZiAobmV3UGV0TmFtZSA9PSBcXFxcXFxcIlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHloavllYohXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCArIFxcXFxcXFwiJm5hbWU9XFxcXFxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQobmV3UGV0TmFtZSkpO1xcXFxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xcXFxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXFxcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxcXG4gICAgfSk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIG1fYXZhdGFyKCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgICAgICBkZXNjOiBcXFxcXFxcIuivt+i+k+WFpeaWsOeahOWktOWDj+mTvuaOpVxcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5hdmF0YXInLCAnJykgfHwgZGV2LmF2YXRhcixcXFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0uYXZhdGFyXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5L+d5a2YXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcXFxcXCJtb2RpZnlfYXZhXFxcXFxcXCIpICsgcGF0aCkubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IG5ld0F2YXRhciA9IGdldFZhcignV2FyZWhvdXNlLm0uYXZhdGFyJywgJycpO1xcXFxuICAgICAgICAgICAgXFxcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCArIFxcXFxcXFwiJmF2YXRhcl91cmw9XFxcXFxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQobmV3QXZhdGFyKSk7XFxcXG4gICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XFxcXG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcXFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgcmVzdWx0LmRldGFpbDtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gbV9wd2QoKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6XFxcXFxcXCLljp/lr4bnoIFcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgICAgIGRlc2M6IFxcXFxcXFwi6K+36L6T5YWl5Y6f5a+G56CBXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICB0eXBlOlxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC55JywgJycpLFxcXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC55XFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6XFxcXFxcXCLmlrDlr4bnoIFcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgICAgIGRlc2M6IFxcXFxcXFwi6K+36L6T5YWl5paw5a+G56CBXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICB0eXBlOlxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC54JywgJycpLFxcXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC54XFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6XFxcXFxcXCLph43lpI3mlrDlr4bnoIFcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgICAgIGRlc2M6IFxcXFxcXFwi6K+36YeN5aSN5paw5a+G56CBXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICB0eXBlOlxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQuYycsICcnKSxcXFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQuY1xcXFxcXFwiLGlucHV0KSdcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuS/neWtmFxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXFxcXFwibW9kaWZ5X3B3ZFxcXFxcXFwiKStwYXRoKS5sYXp5UnVsZSgocGFzc3dvcmQsdXNlcm5hbWUpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBvbGRfcGFzc3dvcmQgPSBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLnknLCAnJyk7XFxcXG4gICAgICAgICAgICBsZXQgbmV3X3Bhc3N3b3JkID0gZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC54JywgJycpO1xcXFxuICAgICAgICAgICAgbGV0IG5ld19wYXNzd29yZF9hZ2FpbiA9IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQuYycsICcnKTtcXFxcbiAgICAgICAgICAgIGlmIChvbGRfcGFzc3dvcmQhPT1wYXNzd29yZCkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Y6f5a+G56CB6ZSZ6K+vXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZihuZXdfcGFzc3dvcmQ9PT1cXFxcXFxcIlxcXFxcXFwiKXtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ivt+i+k+WFpeaWsOWvhueggVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYobmV3X3Bhc3N3b3JkIT09bmV3X3Bhc3N3b3JkX2FnYWluKXtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S4pOasoeWvhueggeS4jeWQjFxcXFxcXFwiXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCArIFxcXFxcXFwiJm5ld19wYXNzd29yZD1cXFxcXFxcIiArIG5ld19wYXNzd29yZCtcXFxcXFxcIiZuZXdfcGFzc3dvcmRfcmU9XFxcXFxcXCIrbmV3X3Bhc3N3b3JkX2FnYWluKTtcXFxcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXFxcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxcXG4gICAgICAgICAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFxcXFxcIixKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lOnVzZXJuYW1lLFxcXFxuICAgICAgICAgICAgICAgICAgICBwYXNzd29yZDpuZXdfcGFzc3dvcmRcXFxcbiAgICAgICAgICAgICAgICB9KSk7XFxcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyByZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9LHBhc3N3b3JkLHVzZXJuYW1lKSxcXFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcXFxuICAgIH0pO1xcXFxufVxcXFxuXFxcXG5zd2l0Y2ggKFBhdHRlcm4pIHtcXFxcbiAgICBjYXNlIDA6XFxcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFxcXFxcIuS/ruaUueWktOWDj1xcXFxcXFwiKTtcXFxcbiAgICAgICAgbV9hdmF0YXIoKTtcXFxcbiAgICAgICAgYnJlYWs7XFxcXG4gICAgY2FzZSAxOlxcXFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcXFxcXCLkv67mlLnmmLXnp7BcXFxcXFxcIik7XFxcXG4gICAgICAgIG1fcGV0TmFtZSgpO1xcXFxuICAgICAgICBicmVhaztcXFxcbiAgICBjYXNlIDI6XFxcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFxcXFxcIuS/ruaUueWvhueggVxcXFxcXFwiKTtcXFxcbiAgICAgICAgbV9wd2QoKTtcXFxcbiAgICAgICAgYnJlYWs7XFxcXG59XFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi57yW6L6R6KeE5YiZ5aSH5rOoXFxcIixcXFwicGF0aFxcXCI6XFxcInNldF9ydWxlX25vdGVzXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IGRhdGEgPSBbXTtcXFxcbmNvbnN0IHtcXFxcbiAgICBnZXRBcGlcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxubGV0IHtcXFxcbiAgICBpZCxcXFxcbiAgICB1c2VybmFtZSxcXFxcbiAgICBwYXNzd29yZCxcXFxcbiAgICBuYW1lXFxcXG59ID0gTVlfUEFSQU1TO1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi5aSH5rOo44CMXFxcXFxcXCIrbmFtZStcXFxcXFxcIuOAjVxcXFxcXFwiKTtcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJyxcXFxcXFxcImNsZWFyVmFyKCdXYXJlaG91c2UucnVsZS5ub3RlcycsICcnKVxcXFxcXFwiKTtcXFxcbmxldCBub3Rlcz1yZXF1ZXN0KGdldEFwaShcXFxcXFxcImdldF9ydWxlX25vdGVcXFxcXFxcIikraWQpO1xcXFxubm90ZXM9SlNPTi5wYXJzZShub3RlcykucmVzdWx0O1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuinhOWImeWkh+azqC4uLi4uLlxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UucnVsZS5ub3RlcycsICcnKXx8bm90ZXN8fFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgIHR5cGU6IFxcXFxcXFwidGV4dGFyZWFcXFxcXFxcIixcXFxcbiAgICAgICAgaGVpZ2h0Oi0xLFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZS5ydWxlLm5vdGVzXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuS/neWtmFxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoZ2V0QXBpKFxcXFxcXFwic2V0X3J1bGVfbm90ZVxcXFxcXFwiKSArIGlkKS5sYXp5UnVsZSgodXNlcm5hbWUsIHBhc3N3b3JkKSA9PiB7XFxcXG4gICAgICAgIGxldCBub3RlcyA9IGdldFZhcignV2FyZWhvdXNlLnJ1bGUubm90ZXMnLCAnJyk7XFxcXG4gICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0LCB7XFxcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcInBhcmFtc1xcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicXFcXFxcXFxcIjogdXNlcm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIjogcGFzc3dvcmQsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwibm90ZVxcXFxcXFwiOm5vdGVzXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXFxcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyByZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGJhY2soZmFsc2UpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXFxcXFwiO1xcXFxuICAgIH0sIHVzZXJuYW1lLCBwYXNzd29yZClcXFxcbn0pO1xcXFxuc2V0UmVzdWx0KGRhdGEpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJsaW5lXFxcIixcXFwibmFtZVxcXCI6XFxcIuivhOiuuuWIl+ihqFxcXCIsXFxcInBhdGhcXFwiOlxcXCJDb21tZW50XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi6K+E6K665YiX6KGoXFxcXFxcXCIpO1xcXFxuY29uc3Qge1xcXFxuICAgIGFwaVxcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5sZXQgZGF0YSA9IFtdO1xcXFxubGV0IHtcXFxcbiAgICB0b3RhbFN1bSxcXFxcbiAgICBpZCxcXFxcbiAgICBub19hY3RpdmUsXFxcXG4gICAgdXNlcm5hbWUsXFxcXG4gICAgcGFzc3dvcmRcXFxcbn0gPSBNWV9QQVJBTVM7XFxcXG5sZXQgcGFnZSA9IHBhcnNlSW50KE1ZX1VSTC5zcGxpdChcXFxcXFxcIiNcXFxcXFxcIilbMV0pO1xcXFxubGV0IGRpc2N1c3NfdHlwZSA9IGdldFZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbmlmIChwYWdlID09PSAxKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgcHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgIH0pKTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLlhajpg6hcXFxcXFxcIiArIChkaXNjdXNzX3R5cGUgPT09IFxcXFxcXFwiXFxcXFxcXCIgPyBcXFxcXFxcIuKXiVxcXFxcXFwiIDogXFxcXFxcXCLil4tcXFxcXFxcIiksXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfNCdcXFxcblxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIvCfkY3otZ5cXFxcXFxcIiArIChkaXNjdXNzX3R5cGUgPT09IFxcXFxcXFwiZ29vZFxcXFxcXFwiID8gXFxcXFxcXCLil4lcXFxcXFxcIiA6IFxcXFxcXFwi4peLXFxcXFxcXCIpLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFxcXFxcIiwgXFxcXFxcXCJnb29kXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF80J1xcXFxuXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi8J+Rjui4qVxcXFxcXFwiICsgKGRpc2N1c3NfdHlwZSA9PT0gXFxcXFxcXCJiYWRcXFxcXFxcIiA/IFxcXFxcXFwi4peJXFxcXFxcXCIgOiBcXFxcXFxcIuKXi1xcXFxcXFwiKSxcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICAgICAgcHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcXFxcXCIsIFxcXFxcXFwiYmFkXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF80J1xcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuWbnuWkjVxcXFxcXFwiICsgKGRpc2N1c3NfdHlwZSA9PT0gXFxcXFxcXCJyZXBseVxcXFxcXFwiID8gXFxcXFxcXCLil4lcXFxcXFxcIiA6IFxcXFxcXFwi4peLXFxcXFxcXCIpLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFxcXFxcIiwgXFxcXFxcXCJyZXBseVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfNCdcXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuXFxcXG5sZXQgaWNvbiA9IHtcXFxcbiAgICBcXFxcXFxcImdvb2RcXFxcXFxcIjogXFxcXFxcXCLwn5GNXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJiYWRcXFxcXFxcIjogXFxcXFxcXCLwn5GOXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJyZXBseVxcXFxcXFwiOlxcXFxcXFwi5byA5Y+R6ICF8J+Xo1xcXFxcXFwiXFxcXG59XFxcXG5sZXQgY29udHJvbD0ocGlkLGFjdGl2ZSk9PnZvaWQgMDtcXFxcbmlmKG5vX2FjdGl2ZSl7XFxcXG4gICAgY29udHJvbD1mdW5jdGlvbihwaWQsYWN0aXZlKXtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOmFjdGl2ZT9cXFxcXFxcIumakOiXj+ivhOiuulxcXFxcXFwiOlxcXFxcXFwi5bGV56S66K+E6K66XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6JChhcGkuZGlzX2Rldl9jb250cm9sK3BpZCtcXFxcXFxcIj9xcT1cXFxcXFxcIiArIHVzZXJuYW1lICsgXFxcXFxcXCImcGFzc3dvcmQ9XFxcXFxcXCIgKyBwYXNzd29yZCtcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpPT57XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdD1KU09OLnBhcnNlKHJlcXVlc3QoaW5wdXQpKTtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiK3Jlc3VsdC5kZXRhaWw7XFxcXG4gICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOlxcXFxcXFwidGV4dF8yXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTpcXFxcXFxcIuWIoOmZpOivhOiuulxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiQoXFxcXFxcXCLnoa7orqTliKDpmaTor6Xor4Torro/XFxcXFxcXCIpLmNvbmZpcm0oKGlucHV0KT0+e1xcXFxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQ9SlNPTi5wYXJzZShyZXF1ZXN0KGlucHV0KSk7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIityZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICAgICAgfSxhcGkuZGlzX2Rldl9jb250cm9sK3BpZCtcXFxcXFxcIj9xcT1cXFxcXFxcIiArIHVzZXJuYW1lICsgXFxcXFxcXCImcGFzc3dvcmQ9XFxcXFxcXCIgKyBwYXNzd29yZCtcXFxcXFxcIiZkZWxldGU9MVxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOlxcXFxcXFwidGV4dF8yXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTpcXFxcXFxcImxpbmVcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOlxcXFxcXFwibGluZVxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbn1cXFxcbmlmICh0b3RhbFN1bSA9PT0gMCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuS4gOadoeivhOiuuuS5n+ayoeacie+8jOW/q+adpeaKouaymeWPkeWQp++8gTwvaDU+XFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59IGVsc2Uge1xcXFxuICAgIGxldCBjb21tZW50TGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuZGlzX2dldCArIGlkICsgXFxcXFxcXCI/bGltaXQ9NSZwYWdlPVxcXFxcXFwiICsgcGFnZSArIFxcXFxcXFwiJm5vX2FjdGl2ZT1cXFxcXFxcIiArIG5vX2FjdGl2ZSArIFxcXFxcXFwiJmRpc2N1c3NfdHlwZT1cXFxcXFxcIiArIGRpc2N1c3NfdHlwZSkpLnJlc3VsdDtcXFxcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNvbW1lbnRMaXN0KSB7XFxcXG4gICAgICAgIGxldCBSZXBseSA9IGl0ZW0uZGlzY3Vzc190eXBlPT09XFxcXFxcXCJyZXBseVxcXFxcXFwiJiZpdGVtLnJlcGx5X3RvX25hbWUhPT1mYWxzZSYmaXRlbS5yZXBseV90b19pZCE9PWZhbHNlP1xcXFxcXFwi4oCY4oCY5Zue5aSNQFxcXFxcXFwiK2l0ZW0ucmVwbHlfdG9fbmFtZStcXFxcXFxcIiAjXFxcXFxcXCIraXRlbS5kaXNjdXNzX2lkK1xcXFxcXFwi4oCZ4oCZXFxcXFxcXFxuXFxcXFxcXCI6XFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUgKyBcXFxcXFxcIiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSdncmF5Jz48c21hbGw+I1xcXFxcXFwiICsgaXRlbS5pZCArIFxcXFxcXFwiPC9zbWFsbD48Zm9udD5cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImF2YXRhclxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgLy91cmw6IG5vX2FjdGl2ZT9cXFxcXFxcImhpa2VyOi8vcGFnZS9SZXBseVxcXFxcXFwiOlxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIGl0ZW0ucXEsXFxcXG5cXFxcdFxcXFx0ICAgICAgIHVybDpub19hY3RpdmU/XFxcXFxcXCJoaWtlcjovL3BhZ2UvUmVwbHlcXFxcXFxcIjpcXFxcXFxcIm1xcXdwYTovL2ltL2NoYXQ/Y2hhdF90eXBlPXdwYSZ1aW49XFxcXFxcXCIraXRlbS5xcSxcXFxcbiAgICAgICAgICAgIGV4dHJhOntcXFxcbiAgICAgICAgICAgICAgICBydWxlSWQ6IGlkLFxcXFxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcXFxcbiAgICAgICAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXFxcXG4gICAgICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxcXFxuICAgICAgICAgICAgICAgIHJlcGx5SWQ6aXRlbS5pZFxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXFxcbiAgICAgICAgICAgIGRlc2M6IFJlcGx5K2l0ZW0uY3JlYXRlX2RhdGUgKyBcXFxcXFxcIsK3XFxcXFxcXCIgKyBpY29uW2l0ZW0uZGlzY3Vzc190eXBlXSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYTp7XFxcXG4gICAgICAgICAgICAgICAgbmFtZTppdGVtLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgdHlwZTpcXFxcXFxcImxvbmdfdGV4dFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHRleHQ6aXRlbS5kaXNjdXNzX3RleHRcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGNvbnRyb2woaXRlbS5pZCxpdGVtLmFjdGl2ZSk7XFxcXG4gICAgfVxcXFxuICAgIGlmIChjb21tZW50TGlzdC5sZW5ndGggPT09IDApIHtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbnNldFJlc3VsdChkYXRhKVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuWPkeihqOivhOiuulxcXCIsXFxcInBhdGhcXFwiOlxcXCJNYWtlQWNvbW1lbnRcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5sZXQgZGF0YSA9IFtdO1xcXFxuY29uc3Qge1xcXFxuICAgIGFwaSxcXFxcbiAgICBnZXRGaWxlXFxcXG59ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbmxldCB7XFxcXG4gICAgaWQsXFxcXG4gICAgbmFtZSxcXFxcbiAgICBkZWZhdWx0VHlwZVxcXFxufSA9IE1ZX1BBUkFNUztcXFxcbmxldCB1c2VyPWdldEZpbGUoKS51c2VyfHxbXFxcXFxcXCJcXFxcXFxcIixcXFxcXFxcIlxcXFxcXFwiXTtcXFxcblxcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi6K+E6K66KFxcXFxcXFwiICsgbmFtZSArIFxcXFxcXFwiKVxcXFxcXFwiKTtcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC50eXBlXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQudGV4dFxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LnFxXFxcXFxcXCIpO1xcXFxuICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbn0pKTtcXFxcbmxldCB0eXBlID0gZ2V0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQudHlwZVxcXFxcXFwiKSB8fCBkZWZhdWx0VHlwZXx8XFxcXFxcXCJnb29kXFxcXFxcXCI7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGRlc2M6IFxcXFxcXFwi6K+E6K66Li4uLi4uXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnRleHQnLCAnJyksXFxcXG4gICAgICAgIHR5cGU6IFxcXFxcXFwidGV4dGFyZWFcXFxcXFxcIixcXFxcbiAgICAgICAgaGVpZ2h0OjcsXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQudGV4dFxcXFxcXFwiLGlucHV0KSdcXFxcbiAgICB9XFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6XFxcXFxcXCLotKblj7fvvJpcXFxcXFxcIisodXNlclswXXx8XFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgZGVzYzpcXFxcXFxcIumqjOivgeegge+8mlxcXFxcXFwiKyh1c2VyWzFdfHxcXFxcXFxcIlxcXFxcXFwiKSxcXFxcbiAgICB1cmw6XFxcXFxcXCJoaWtlcjovL3BhZ2UvVXNlcnJlZ2lzdHJhdGlvblxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF8xJyxcXFxcbiAgICBcXFxcbn0pO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiAgKHR5cGUgPT09IFxcXFxcXFwiZ29vZFxcXFxcXFwiID8gXFxcXFxcXCLil4lcXFxcXFxcIiA6IFxcXFxcXFwi4peLXFxcXFxcXCIpK1xcXFxcXFwiIPCfkY1cXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LnR5cGVcXFxcXFxcIiwgXFxcXFxcXCJnb29kXFxcXFxcXCIpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgfSksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxcXG5cXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogICh0eXBlID09PSBcXFxcXFxcImJhZFxcXFxcXFwiID8gXFxcXFxcXCLil4lcXFxcXFxcIiA6IFxcXFxcXFwi4peLXFxcXFxcXCIpK1xcXFxcXFwiIPCfkY5cXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LnR5cGVcXFxcXFxcIiwgXFxcXFxcXCJiYWRcXFxcXFxcIik7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICB9KSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMidcXFxcbn0pO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuaPkOS6pFxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoYXBpLmRpc19uZXcgKyBpZCkubGF6eVJ1bGUoKEFjY291bnQpID0+IHtcXFxcbiAgICAgICAgbGV0IHRleHQgPSBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnRleHQnLCAnJyk7XFxcXG4gICAgICAgIGxldCBbcXEsYXV0aF9jb2RlXSA9IEFjY291bnQ7XFxcXG4gICAgICAgIGxldCB0eXBlID0gZ2V0VmFyKCdXYXJlaG91c2UuY29tbWVudC50eXBlJykgfHwgJ2dvb2QnO1xcXFxuICAgICAgICBxcT1xcXx8XFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgYXV0aF9jb2RlPWF1dGhfY29kZXx8XFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgaWYocXE9PVxcXFxcXFwiXFxcXFxcXCJ8fGF1dGhfY29kZT09XFxcXFxcXCJcXFxcXFxcIil7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+acqueZu+W9lei0puWPt1xcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmKHRleHQ9PVxcXFxcXFwiXFxcXFxcXCIpe1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHlhpnllYpcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBmdW5jdGlvbiByKHApIHtcXFxcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0LCB7XFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwKSxcXFxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgcCA9IHtcXFxcbiAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6IHtcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcImRpc2N1c3NfdGV4dFxcXFxcXFwiOiB0ZXh0LFxcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwicXFcXFxcXFxcIjogcXEsXFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJkaXNjdXNzX3R5cGVcXFxcXFxcIjogdHlwZSxcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcImF1dGhfY29kZVxcXFxcXFwiOiBhdXRoX2NvZGVcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gcihwKTtcXFxcbiAgICAgICAgaWYocmVzdWx0LnN0YXR1cz09PTApe1xcXFxuICAgICAgICAgICAgYmFjayhmYWxzZSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIityZXN1bHQuZGV0YWlsO1xcXFxuXFxcXG4gICAgfSx1c2VyKVxcXFxufSk7XFxcXG5cXFxcbnNldFJlc3VsdChkYXRhKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLkvKrnlKjmiLfms6jlhoxcXFwiLFxcXCJwYXRoXFxcIjpcXFwiVXNlcnJlZ2lzdHJhdGlvblxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmNvbnN0IHtcXFxcbiAgICBhcGksXFxcXG4gICAgZ2V0RmlsZSxcXFxcbiAgICBnZXRVc2VyRGF0ZVxcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5sZXQgZGF0YSA9IFtdO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi55So5oi35YiX6KGo566h55CGXFxcXFxcXCIpO1xcXFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5tLnFxXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0ueXptXFxcXFxcXCIpO1xcXFxufSkpO1xcXFxubGV0IHVzZXIgPSBnZXRGaWxlKCk7XFxcXG5sZXQgdXNlck5hbWUgPSB1c2VyLnVzZXIgfHwgW1xcXFxcXFwiXFxcXFxcXCJdO1xcXFxudXNlck5hbWUgPSB1c2VyTmFtZVswXTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc4oCd4oCdPGJpZz4o5re75YqgL+mqjOivgSnotKblj7c8L2JpZz5cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLojrflj5ZcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuivt+i+k+WFpXFxXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkLnRvU3RyaW5nKChhLCBiKSA9PiB7XFxcXG4gICAgICAgIGxldCBxcSA9IGlucHV0O1xcXFxuICAgICAgICBpZiAocXEgPT0gXFxcXFxcXCJcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHloavllYohXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgc2hvd0xvYWRpbmcoXFxcXFxcXCLojrflj5bkuK0uLi5cXFxcXFxcIilcXFxcbiAgICAgICAgcmV0dXJuICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgocXEsIGEsIGIpID0+IHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGEsIHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXFxcbiAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJxcVxcXFxcXFwiOiBxcVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXFxcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxcXG4gICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgcmVzdWx0LmRldGFpbDtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdDIgPSBKU09OLnBhcnNlKHJlcXVlc3QoYiArIFxcXFxcXFwiP3FxPVxcXFxcXFwiICsgcXEpKTtcXFxcbiAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyByZXN1bHQyLmRldGFpbDtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICAgIHRocm93IGU7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgfSwgcXEsIGEsIGIpO1xcXFxuXFxcXG4gICAgfSwgYXBpLmRpc19uZXdfdXNlciwgYXBpLmRpc192ZXJpZnkpLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIHR5cGU6IFxcXFxcXFwibnVtYmVyXFxcXFxcXCIsXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5xcScsICcnKSB8fCB1c2VyTmFtZSxcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UubS5xcVxcXFxcXFwiLGlucHV0KSdcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuivt+i+k+WFpemqjOivgeeggVxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS55em0nLCAnJyksXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0ueXptXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxcXG4gICAgdGl0bGU6IFxcXFxcXFwiPHNtYWxsPuaPkOekuu+8mjEu5q+P5aSp5Y+q6IO96I635Y+WNeasoemqjOivgeeggS48YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi48cz7pqozor4HnoIHmnInmlYjmnJ/mjIHnu63kuIDlkajlt6blj7M8L3M+KOaaguaXtuS4jeS8mu+8jOW/mOiusOmqjOivgeeggeWPr+mAmui/h1FR5Y+36I635Y+WKTwvc21hbGw+XFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5sZXQgdXNlckxpc3QgPSBnZXRVc2VyRGF0ZSgpO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLpqozor4Ev55m75b2VXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwi56Gu5a6a5L+d5a2Y77yM6aqM6K+B56CB5aGr6ZSZ77yM5peg5rOV6K+E6K665ZOmXFxcXFxcXCIpLmNvbmZpcm0oKGYsIGwsIGxvZ2luKSA9PiB7XFxcXG4gICAgICAgIGxldCBxcSA9IGdldFZhcignV2FyZWhvdXNlLm0ucXEnLCAnJyk7XFxcXG4gICAgICAgIGxldCB5em0gPSBnZXRWYXIoJ1dhcmVob3VzZS5tLnl6bScsICcnKTtcXFxcbiAgICAgICAgaWYgKHFxID09IFxcXFxcXFwiXFxcXFxcXCIgfHwgeXptID09IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vcXHmiJbpqozor4HnoIHkuLrnqbpcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChsb2dpbiwge1xcXFxuICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInFxXFxcXFxcXCI6IHFxLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcImF1dGhfY29kZVxcXFxcXFwiOiB5em1cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcXFxuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcXFxuICAgICAgICAgICAgZi51c2VyID0gW3FxLCB5em1dO1xcXFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoZikpO1xcXFxuICAgICAgICAgICAgbGV0IGluZGV4ID0gbC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtWzBdID09PSBxcSk7XFxcXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xcXFxuICAgICAgICAgICAgICAgIGwuc3BsaWNlKGluZGV4LCAxLCBbcXEsIHl6bV0pO1xcXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChsLmxlbmd0aCA8IDYpIHtcXFxcbiAgICAgICAgICAgICAgICBsLnB1c2goW3FxLCB5em1dKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgbC5zcGxpY2UoMCwgMSk7XFxcXG4gICAgICAgICAgICAgICAgbC5wdXNoKFtxcSwgeXptXSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVJBLmpzb25cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkobCkpO1xcXFxuICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/pqozor4HmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgcmVzdWx0LmRldGFpbDtcXFxcbiAgICB9LCB1c2VyLCB1c2VyTGlzdCwgYXBpLmRpc19sb2dpbiksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnTxiaWc+6LSm5Y+35YiX6KGoPC9iaWc+XFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXFx0PHNtYWxsPijkv53nlZk15p2h6K6w5b2VKTwvc21hbGw+XFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxufSk7XFxcXG51c2VyTGlzdC5yZXZlcnNlKCk7XFxcXG5cXFxcbmZvciAobGV0IGl0ZW0gb2YgdXNlckxpc3QpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLotKblj7fvvJpcXFxcXFxcIiArIGl0ZW1bMF0gKyAodXNlck5hbWUgPT09IGl0ZW1bMF0gPyBcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdOKAnOKAnFvlvZPliY3otKblj7dd4oCd4oCdXFxcXFxcXCIgOiBcXFxcXFxcIlxcXFxcXFwiKSxcXFxcbiAgICAgICAgZGVzYzogXFxcXFxcXCLpqozor4HnoIHvvJpcXFxcXFxcIiArIGl0ZW1bMV0sXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIuaYr+WQpuWIh+aNouS4uuivpVtcXFxcXFxcIiArIGl0ZW1bMF0gKyBcXFxcXFxcIl3otKblj7dcXFxcXFxcIikuY29uZmlybSgoZiwgaXRlbSkgPT4ge1xcXFxuICAgICAgICAgICAgZi51c2VyID0gaXRlbTtcXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGYpKTtcXFxcbiAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5YiH5o2i5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgIH0sIHVzZXIsIGl0ZW0pLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufVxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLpgIDlh7rotKblj7dcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCLnoa7orqTpgIDlh7rnmbvlvZXnirbmgIFcXFxcXFxcIikuY29uZmlybSgoZikgPT4ge1xcXFxuICAgICAgICBmLnVzZXIgPSBbXTtcXFxcbiAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoZikpO1xcXFxuICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6YCA5Ye65oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgfSwgdXNlciksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcXFxufSk7XFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5YiX6KGo5o6S5bqP566X5rOVXFxcIixcXFwicGF0aFxcXCI6XFxcInNvcnRcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG4vKiDop4TliJnliJfooajmjpLluo8gWyBVUOOAgU5FV+OAgeaXoOabtOaWsCBdIOmhuuW6jyAqL1xcXFxuLyog5b2S5bm25o6S5bqPIFN0YXJ0ICovXFxcXG4vKlxcXFxuZnVuY3Rpb24gbWVyZ2VTb3J0KGFycikge1xcXFxuICAgIHZhciBsZW4gPSBhcnIubGVuZ3RoO1xcXFxuICAgIGlmIChsZW4gPCAyKSB7XFxcXG4gICAgICAgIHJldHVybiBhcnI7XFxcXG4gICAgfVxcXFxuICAgIHZhciBtaWRkbGUgPSBNYXRoLmZsb29yKGxlbiAvIDIpLFxcXFxuICAgICAgICBsZWZ0ID0gYXJyLnNsaWNlKDAsIG1pZGRsZSksXFxcXG4gICAgICAgIHJpZ2h0ID0gYXJyLnNsaWNlKG1pZGRsZSk7XFxcXG4gICAgcmV0dXJuIG1lcmdlKG1lcmdlU29ydChsZWZ0KSwgbWVyZ2VTb3J0KHJpZ2h0KSk7XFxcXG59XFxcXG5mdW5jdGlvbiBtZXJnZShsZWZ0LCByaWdodCkge1xcXFxuICAgIHZhciByZXN1bHQgPSBbXTtcXFxcbiAgICB2YXIgaXNUaGlzVmVyc2lvbkxpc3QgPSBbXTtcXFxcblxcXFxuICAgIHdoaWxlIChsZWZ0Lmxlbmd0aCA+IDAgJiYgcmlnaHQubGVuZ3RoID4gMCkge1xcXFxuICAgICAgICBpZiAobGVmdFswXS50aXRsZS5pbmNsdWRlcyhcXFxcXFxcIvCfhplcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGxlZnQuc2hpZnQoKSk7XFxcXG4gICAgICAgIH0gZWxzZSBpZiAocmlnaHRbMF0udGl0bGUuaW5jbHVkZXMoXFxcXFxcXCLwn4aZXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICByZXN1bHQucHVzaChyaWdodC5zaGlmdCgpKTtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChsZWZ0WzBdLnRpdGxlLmluY2x1ZGVzKFxcXFxcXFwi8J+GlVxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobGVmdC5zaGlmdCgpKTtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChyaWdodFswXS50aXRsZS5pbmNsdWRlcyhcXFxcXFxcIvCfhpVcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJpZ2h0LnNoaWZ0KCkpO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgaXNUaGlzVmVyc2lvbkxpc3QucHVzaChsZWZ0LnNoaWZ0KCkpO1xcXFxuICAgICAgICAgICAgaXNUaGlzVmVyc2lvbkxpc3QucHVzaChyaWdodC5zaGlmdCgpKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcblxcXFxuICAgIHdoaWxlIChpc1RoaXNWZXJzaW9uTGlzdC5sZW5ndGgpIHJlc3VsdC5wdXNoKGlzVGhpc1ZlcnNpb25MaXN0LnNoaWZ0KCkpO1xcXFxuXFxcXG4gICAgd2hpbGUgKGxlZnQubGVuZ3RoKVxcXFxuICAgICAgICByZXN1bHQucHVzaChsZWZ0LnNoaWZ0KCkpO1xcXFxuXFxcXG4gICAgd2hpbGUgKHJpZ2h0Lmxlbmd0aClcXFxcbiAgICAgICAgcmVzdWx0LnB1c2gocmlnaHQuc2hpZnQoKSk7XFxcXG5cXFxcbiAgICByZXR1cm4gcmVzdWx0O1xcXFxufVxcXFxuJC5leHBvcnRzLm1lcmdlU29ydCA9IG1lcmdlU29ydDtcXFxcbiovXFxcXG4vKiDlvZLlubbmjpLluo8gRW5kICovXFxcXG4vKiDmma7pgJrliIbnsbvmjpLluo8gU3RhcnQgKi9cXFxcbmZ1bmN0aW9uIG5vcm1hbFNvcnQoYXJyKSB7XFxcXG4gICAgdmFyIGxlbiA9IGFyci5sZW5ndGg7XFxcXG4gICAgaWYgKGxlbiA8IDIpIHtcXFxcbiAgICAgICAgcmV0dXJuIGFycjtcXFxcbiAgICB9XFxcXG4gICAgbGV0IHVwUmVzdWx0ID0gW107XFxcXG4gICAgbGV0IG90aGVyUmVzdWx0ID0gW107XFxcXG4gICAgd2hpbGUoYXJyLmxlbmd0aCkge1xcXFxuICAgICAgICBsZXQgaXRlbSA9IGFyci5zaGlmdCgpO1xcXFxuICAgICAgICBpZihpdGVtLnRpdGxlLmluY2x1ZGVzKFxcXFxcXFwi8J+GmVxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgdXBSZXN1bHQucHVzaChpdGVtKVxcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgb3RoZXJSZXN1bHQucHVzaChpdGVtKVxcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiB1cFJlc3VsdC5jb25jYXQob3RoZXJSZXN1bHQpO1xcXFxufVxcXFxuJC5leHBvcnRzLm5vcm1hbFNvcnQgPSBub3JtYWxTb3J0O1xcXFxuLyog5pmu6YCa5YiG57G75o6S5bqPIEVuZCAqL1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJpY29uXzJfcm91bmRcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5YWo6YOo5YWs5byA6KeE5YiZXFxcIixcXFwicGF0aFxcXCI6XFxcIkFsbFB1YmxpY1J1bGVcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG4gICAgY29uc3Qge1xcXFxuICAgICAgICBhcGksXFxcXG4gICAgICAgIGxvY2FsUnVsZVZlcixcXFxcbiAgICAgICAgZ2V0QXBpXFxcXG4gICAgfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5jb25zdCB7XFxcXG4gICAgbWVyZ2VTb3J0XFxcXG59ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3NvcnRcXFxcXFxcIik7XFxcXG5sZXQgZGF0YVR5cGUgPSBnZXRWYXIoXFxcXFxcXCJXYXJlaG91c2UudHlwZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbmxldCBvcmRlciA9IGdldFZhcihcXFxcXFxcIldhcmVob3VzZS5vcmRlclxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG5sZXQgc29ydCA9IGdldFZhcihcXFxcXFxcIldhcmVob3VzZS5zb3J0XFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbmxldCBnb29kID0gZ2V0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmdvb2RcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG5sZXQgcGFnZSA9IE1ZX1VSTC5zcGxpdChcXFxcXFxcIiNcXFxcXFxcIilbMV0gfHwgMTtcXFxcbmxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuYWxsX3J1bGUgKyBcXFxcXFxcIj9kYXRhX3R5cGU9XFxcXFxcXCIgKyBkYXRhVHlwZSArIFxcXFxcXFwiJnBhZ2U9XFxcXFxcXCIgKyBwYWdlICsgXFxcXFxcXCImbGltaXQ9MjAmb3JkZXI9XFxcXFxcXCIgKyBvcmRlciArIFxcXFxcXFwiJnNvcnQ9XFxcXFxcXCIgKyBzb3J0KyBcXFxcXFxcIiZpc19nb29kPVxcXFxcXFwiICsgZ29vZCkpLnJlc3VsdDtcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UudHlwZVxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5vcmRlclxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5zb3J0XFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLmdvb2RcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuYmFja1xcXFxcXFwiKTtcXFxcbn0pKTtcXFxcbmxldCBkYXRhID0gW107XFxcXG5pZiAoZ2V0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmJhY2tcXFxcXFxcIikgPT09IFxcXFxcXFwiMVxcXFxcXFwiKSB7XFxcXG4gICAgYmFjaygpO1xcXFxufVxcXFxuZnVuY3Rpb24gdGFiKGFyciwgdHlwZSwgY29udHJhc3QpIHtcXFxcbiAgICBmb3IgKGxldCBpdGVtIG9mIGFycikge1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW1bMV0gPT09IGNvbnRyYXN0ID8gXFxcXFxcXCLigJzigJxcXFxcXFxcIiArIGl0ZW1bMF0gKyBcXFxcXFxcIuKAneKAnVxcXFxcXFwiIDogaXRlbVswXSxcXFxcbiAgICAgICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChrZXksIHR5cGUpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBwdXRWYXIodHlwZSwga2V5KTtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfSwgaXRlbVsxXSwgdHlwZSksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImJsYW5rX2Jsb2NrXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn1cXFxcbmlmIChwYWdlID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgIHRhYihbXFxcXG4gICAgICAgIFtcXFxcXFxcIuWFqOmDqFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiXSxcXFxcbiAgICAgICAgW1xcXFxcXFwi5bCP56iL5bqPXFxcXFxcXCIsIFxcXFxcXFwiaG9tZV9ydWxlX3VybFxcXFxcXFwiXSxcXFxcbiAgICAgICAgW1xcXFxcXFwi5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZXFxcXFxcXCIsIFxcXFxcXFwicHVibGlzaFxcXFxcXFwiXSxcXFxcbiAgICAgICAgW1xcXFxcXFwi572R6aG15o+S5Lu2XFxcXFxcXCIsIFxcXFxcXFwianNfdXJsXFxcXFxcXCJdLFxcXFxuICAgICAgICBbXFxcXFxcXCLpnZnmgIHpobXpnaJcXFxcXFxcIiwgXFxcXFxcXCJodG1sXFxcXFxcXCJdLFxcXFxuICAgICAgICBbXFxcXFxcXCLkuLvpophcXFxcXFxcIiwgXFxcXFxcXCJjb25maWdcXFxcXFxcIl1cXFxcbiAgICBdLCBcXFxcXFxcIldhcmVob3VzZS50eXBlXFxcXFxcXCIsIGRhdGFUeXBlKTtcXFxcbiAgICB0YWIoW1xcXFxuICAgICAgICBbXFxcXFxcXCLml7bpl7RcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCJdLFxcXFxuICAgICAgICBbXFxcXFxcXCJJRFxcXFxcXFwiLCBcXFxcXFxcIjFcXFxcXFxcIl0sXFxcXG4gICAgICAgIFtcXFxcXFxcIuWlveivhOW6plxcXFxcXFwiLCBcXFxcXFxcIjJcXFxcXFxcIl0sXFxcXG4gICAgICAgIFtcXFxcXFxcIuW3ruivhOW6plxcXFxcXFwiLCBcXFxcXFxcIjNcXFxcXFxcIl0sXFxcXG4gICAgICAgIFtcXFxcXFxcIuWbnuWkjeaVsFxcXFxcXFwiLCBcXFxcXFxcIjRcXFxcXFxcIl1cXFxcbiAgICBdLCBcXFxcXFxcIldhcmVob3VzZS5vcmRlclxcXFxcXFwiLCBvcmRlcik7XFxcXG4gICAgdGFiKFtcXFxcbiAgICAgICAgW1xcXFxcXFwi5YCS5bqPXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiXSxcXFxcbiAgICAgICAgW1xcXFxcXFwi5q2j5bqPXFxcXFxcXCIsIFxcXFxcXFwiMVxcXFxcXFwiXVxcXFxuICAgIF0sIFxcXFxcXFwiV2FyZWhvdXNlLnNvcnRcXFxcXFxcIiwgc29ydCk7XFxcXG4gICAgdGFiKFtcXFxcbiAgICAgICAgW1xcXFxcXFwi5LiN6K66XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCJdLFxcXFxuICAgICAgICBbXFxcXFxcXCLkvJjotKhcXFxcXFxcIiwgXFxcXFxcXCIxXFxcXFxcXCJdXFxcXG4gICAgXSwgXFxcXFxcXCJXYXJlaG91c2UuZ29vZFxcXFxcXFwiLCBnb29kKTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLmkJzntKJcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkLnRvU3RyaW5nKG5hbWUgPT4gXFxcXFxcXCJoaWtlcjovL3NlYXJjaD9zPVxcXFxcXFwiICsgaW5wdXQgKyBcXFxcXFxcIiZydWxlPVxcXFxcXFwiICsgbmFtZSwgTVlfUlVMRS50aXRsZSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgICAgIGRlc2M6IFxcXFxcXFwi5pCc57Si5YWo6YOo6KeE5YiZXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxubGV0IGhvbWVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5ob21lKSk7XFxcXG5sZXQgbVJ1bGVMaXN0ID0gW107XFxcXG5mb3IgKHZhciBpdGVtIG9mIHJ1bGVMaXN0KSB7XFxcXG4gICAgdmFyIG5hbWUgPSBpdGVtLm5hbWU7XFxcXG4gICAgaWYgKGl0ZW0uaXNfdGFwKSB7XFxcXG4gICAgICAgIGxldCBsb2NhdGlvbiA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcXFxcXCJydWxlTGlzdEpzb25cXFxcXFxcIikgKyBcXFxcXFxcIj9pZD1cXFxcXFxcIiArIGl0ZW0uaWQpKTtcXFxcbiAgICAgICAgaXRlbS5pZCA9IGxvY2F0aW9uLmlkO1xcXFxuICAgICAgICBpdGVtLm5hbWUgPSBsb2NhdGlvbi5uYW1lO1xcXFxuICAgICAgICBpdGVtLmF1dGhvciA9IGxvY2F0aW9uLmF1dGhvcjtcXFxcbiAgICAgICAgaXRlbS5kYXRhX3R5cGUgPSBsb2NhdGlvbi5kYXRhX3R5cGU7XFxcXG4gICAgICAgIGl0ZW0udmVyID0gbG9jYXRpb24udmVyXFxcXG4gICAgfVxcXFxuICAgIGl0ZW0udmVyc2lvbiA9IGl0ZW0udmVyO1xcXFxuICAgIGxldCBsYWJlbCA9IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgIGx2ZXIgPSAtMjtcXFxcbiAgICBpZiAoaXRlbS5pc19qc29uICYmIGl0ZW0uZGF0YV90eXBlID09PSBcXFxcXFxcImhvbWVfcnVsZV91cmxcXFxcXFxcIikge1xcXFxuICAgICAgICBsdmVyID0gbG9jYWxSdWxlVmVyKGhvbWVMaXN0LCBpdGVtKTtcXFxcbiAgICAgICAgaWYgKGx2ZXIgPT09IC0xKSB7XFxcXG4gICAgICAgICAgICBsYWJlbCA9IFxcXFxcXFwi8J+GlVxcXFxcXFwiO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKGx2ZXIgPCBpdGVtLnZlcikge1xcXFxuICAgICAgICAgICAgbGFiZWwgPSBcXFxcXFxcIvCfhplcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBtUnVsZUxpc3QucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBsYWJlbCArIG5hbWUsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGx2ZXI6IGx2ZXIsXFxcXG4gICAgICAgICAgICBpZDogaXRlbS5pZCxcXFxcbiAgICAgICAgICAgIGlzQWxsOnRydWVcXFxcbiAgICAgICAgfSxcXFxcbiAgICAgICAgcGljX3VybDogaXRlbS5waWMsXFxcXG4gICAgfSlcXFxcbn1cXFxcbi8qIOW9kuW5tuaOkuW6jyBTdGFydCAqL1xcXFxuLy9tUnVsZUxpc3QgPSBtZXJnZVNvcnQobVJ1bGVMaXN0KTtcXFxcbi8qIOW9kuW5tuaOkuW6jyBFbmQgKi9cXFxcbmRhdGEucHVzaC5hcHBseShkYXRhLCBtUnVsZUxpc3QpXFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5Zue5aSNXFxcIixcXFwicGF0aFxcXCI6XFxcIlJlcGx5XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IGRhdGEgPSBbXTtcXFxcbmNvbnN0IHtcXFxcbiAgICBhcGlcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxubGV0IHtcXFxcbiAgICByZXBseUlkLFxcXFxuICAgIHJ1bGVJZCxcXFxcbiAgICBuYW1lLFxcXFxuICAgIHBhc3N3b3JkLFxcXFxuICAgIHVzZXJuYW1lXFxcXG59ID0gTVlfUEFSQU1TO1xcXFxuXFxcXG5cXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuWbnuWkjShcXFxcXFxcIiArIG5hbWUgKyBcXFxcXFxcIilcXFxcXFxcIik7XFxcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQudGV4dFxcXFxcXFwiKTtcXFxcbiAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG59KSk7XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgZGVzYzogXFxcXFxcXCLlm57lpI0uLi4uLi5cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudGV4dCcsICcnKSxcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJ0ZXh0YXJlYVxcXFxcXFwiLFxcXFxuICAgICAgICBoZWlnaHQ6NyxcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC50ZXh0XFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuXFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5o+Q5LqkXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogJChhcGkuZGlzX3JlcGx5ICsgcnVsZUlkKS5sYXp5UnVsZSgocGFzc3dvcmQsIHVzZXJuYW1lLCBydWxlSWQpID0+IHtcXFxcbiAgICAgICAgbGV0IHRleHQgPSBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnRleHQnLCAnJyk7XFxcXG4gICAgICAgIGlmIChwYXNzd29yZCA9PSBcXFxcXFxcIlxcXFxcXFwiIHx8IHVzZXJuYW1lID09IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5pyq55m75b2V6LSm5Y+3XFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKHRleHQgPT0gXFxcXFxcXCJcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHlhpnllYpcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCwge1xcXFxuICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcImRpc2N1c3NfdGV4dFxcXFxcXFwiOiB0ZXh0LFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInFxXFxcXFxcXCI6IHVzZXJuYW1lLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCI6IHBhc3N3b3JkLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcImRpc2N1c3NfaWRcXFxcXFxcIjogcnVsZUlkXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXFxcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXFxcbiAgICAgICAgICAgIGJhY2soZmFsc2UpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyByZXN1bHQuZGV0YWlsO1xcXFxuXFxcXG4gICAgfSwgcGFzc3dvcmQsIHVzZXJuYW1lLCByZXBseUlkKVxcXFxufSk7XFxcXG5cXFxcbnNldFJlc3VsdChkYXRhKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLmiJHnmoTlm57lpI1cXFwiLFxcXCJwYXRoXFxcIjpcXFwiTXlSZXBseVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmNvbnN0IHtcXFxcbiAgICBhcGlcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxubGV0IHtcXFxcbiAgICBhdXRoX2NvZGUsXFxcXG4gICAgcXFcXFxcbn0gPSBNWV9QQVJBTVM7XFxcXG5sZXQgcGFnZSA9IHBhcnNlSW50KE1ZX1VSTC5zcGxpdChcXFxcXFxcIiNcXFxcXFxcIilbMV0pO1xcXFxubGV0IGRhdGE9W107XFxcXG5sZXQgY29tbWVudExpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmRpc19nZXRfcmVwbHkgKyBcXFxcXFxcIj9saW1pdD01JnBhZ2U9XFxcXFxcXCIgKyBwYWdlICsgXFxcXFxcXCImcXE9XFxcXFxcXCIgKyBxcSArIFxcXFxcXFwiJmF1dGhfY29kZT1cXFxcXFxcIiArIGF1dGhfY29kZSkpLnJlc3VsdDtcXFxcbmlmIChjb21tZW50TGlzdC5sZW5ndGggPT09IDApIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCI8aDUgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz7liKvmi4nkuobkuIDmnaHkuZ/kuI3liankuoY8L2g1PlxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufSBlbHNlIHtcXFxcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNvbW1lbnRMaXN0KSB7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lICsgXFxcXFxcXCImbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0nZ3JheSc+PHNtYWxsPiNcXFxcXFxcIiArIGl0ZW0uaWQgKyBcXFxcXFxcIjwvc21hbGw+PGZvbnQ+XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJhdmF0YXJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgbHZlcjogXFxcXFxcXCLlm57lpI3ov5vlhaXkuI3mlK/mjIHmn6XnnItcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBpZDogaXRlbS5ydWxlX2lkWzBdXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0uZGlzY3Vzc190ZXh0LFxcXFxuICAgICAgICAgICAgZGVzYzogaXRlbS5jcmVhdGVfZGF0ZSArIFxcXFxcXFwiwrdcXFxcXFxcIitpdGVtLnJ1bGVfaWRbMV0rXFxcXFxcXCLCt1xcXFxcXFwiK1xcXFxcXFwi5byA5Y+R6ICF8J+Xo1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOntcXFxcbiAgICAgICAgICAgICAgICBuYW1lOml0ZW0ubmFtZSxcXFxcbiAgICAgICAgICAgICAgICB0eXBlOlxcXFxcXFwibG9uZ190ZXh0XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdGV4dDppdGVtLmRpc2N1c3NfdGV4dFxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgXFxcXG59XFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcXG5cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLmm7TlpJrliIbkuqtcXFwiLFxcXCJwYXRoXFxcIjpcXFwibW9yZVNoYXJlXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuICAgIGFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKT0+e1xcXFxuICAgICAgICBjbGVhclZhcihcXFxcXFxcImhvdXNlLnVwbG9hZF9jb2RlXFxcXFxcXCIpO1xcXFxuICAgIH0pKTtcXFxcbmNvbnN0IHtjb2xvcixzbWFsbCxhcGksIGdldEZpbGV9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbmxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXFxcbmxldCBwdXRfdXJsID0gYXBpLmhvc3QrJy9oaWtlcnVsZS9kZXYvcHV0JztcXFxcbmlmKCFob3VzZUZpbGUpe1xcXFxuICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcXFxufVxcXFxubGV0IGhvdXNlX2RhdGEgPSBob3VzZUZpbGUoKTtcXFxcbi8vIGxvZyhob3VzZV9kYXRhLnVzZXJuYW1lKyctJytob3VzZV9kYXRhLnBhc3N3b3JkKTtcXFxcbnZhciBjYW51cCA9IGhvdXNlX2RhdGEudXNlcm5hbWUubGVuZ3RoID49IDYgJiYgaG91c2VfZGF0YS5wYXNzd29yZC5sZW5ndGggPiAyO1xcXFxubG9nKCflj6/ku6XkuIrkvKA/JytjYW51cCk7XFxcXG5sZXQgZCA9IFtdO1xcXFxubGV0IGZpbGVfdHlwZSA9IFt7bmFtZTon6Z2Z5oCB5paH5Lu2Jyx2YWx1ZTonaHRtbCd9LHtuYW1lOifnvZHpobXmj5Lku7YnLHZhbHVlOidqc191cmwnfSx7bmFtZTon5Li76aG16YWN572uJyx2YWx1ZTonY29uZmlnJ31dOyAvL+S4iuS8oOexu+Wei1xcXFxubGV0IGZpbGVfcmVkaXJlY3QgPSBbe25hbWU6J+acrOWcsCcsdmFsdWU6J2ZhbHNlJ30se25hbWU6J+ebtOmTvjMwMicsdmFsdWU6J3RydWUnfV07IC8v5piv5ZCm6YeN5a6a5ZCRXFxcXG5sZXQgZmlsZV91YSA9IFt7bmFtZTon55S16ISRJyx2YWx1ZToncGMnfSx7bmFtZTon5omL5py6Jyx2YWx1ZTonbW9iaWxlJ31dO1xcXFxubGV0IGZpbGVfdHlwZV90aXRsZSA9IGZpbGVfdHlwZS5tYXAoKGl0ZW0pID0+IHtcXFxcbiAgICBsZXQgbmFtZSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdHlwZScsJ+mdmeaAgeaWh+S7ticpO1xcXFxuICAgIGlmKGl0ZW0ubmFtZT09PW5hbWUpe1xcXFxuICAgICAgICByZXR1cm4gJ/CfkYknK2l0ZW0ubmFtZTtcXFxcbiAgICB9ZWxzZXtcXFxcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZTtcXFxcbiAgICB9XFxcXG59KTtcXFxcbmxldCBmaWxlX3JlZGlyZWN0X3RpdGxlID0gZmlsZV9yZWRpcmVjdC5tYXAoKGl0ZW0pID0+IHtcXFxcbiAgICBsZXQgbmFtZSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfcmVkaXJlY3QnLCfmnKzlnLAnKTtcXFxcbiAgICBpZihpdGVtLm5hbWU9PT1uYW1lKXtcXFxcbiAgICAgICAgcmV0dXJuICfwn5GJJytpdGVtLm5hbWU7XFxcXG4gICAgfWVsc2V7XFxcXG4gICAgICAgIHJldHVybiBpdGVtLm5hbWU7XFxcXG4gICAgfVxcXFxufSk7XFxcXG5sZXQgZmlsZV91YV90aXRsZSA9IGZpbGVfdWEubWFwKChpdGVtKSA9PiB7XFxcXG4gICAgbGV0IG5hbWUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJywn55S16ISRJyk7XFxcXG4gICAgaWYoaXRlbS5uYW1lPT09bmFtZSl7XFxcXG4gICAgICAgIHJldHVybiAn8J+RiScraXRlbS5uYW1lO1xcXFxuICAgIH1lbHNle1xcXFxuICAgICAgICByZXR1cm4gaXRlbS5uYW1lO1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuZC5wdXNoKHtjb2xfdHlwZTogJ3g1X3dlYnZpZXdfc2luZ2xlJywgZXh0cmE6IHtqczogJ2NvbnNvbGUubG9nKFxcXFxcXFwi5oiR5Yqg6L295LqGXFxcXFxcXCIpJ319KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfojrflj5YnLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi5paH5Lu26Lev5b6ELOaUr+aMgWhpa2VyLGZpbGUsaHR0cCzkuLvpophcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBvbkNoYW5nZTogXFxcXFxcXCJwdXRWYXIoJ2hvdXNlLndlYl91cmwnLGlucHV0KVxcXFxcXFwiLFxcXFxuICAgICAgICB0aXRsZVZpc2libGU6IHRydWUsXFxcXG4gICAgICAgIGlkOidmaWxlUGF0aCcsXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTpnZXRWYXIoJ2hvdXNlLndlYl91cmwnKVxcXFxuICAgIH0sXFxcXG4gICAgdXJsOiQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgICAgICBsZXQgaW5wdXQgPSBnZXRWYXIoJ2hvdXNlLndlYl91cmwnLCcnKTtcXFxcbiAgICAgICAgaWYoaW5wdXQubGVuZ3RoPDIpe1xcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mTvuaOpeS4jeWPr+S7peS4uuepuidcXFxcbiAgICAgICAgfSBlbHNlIGlmKC9eaGlrZXI6fF5maWxlOnxeaHR0cDp8Xmh0dHBzOnxeXFxcXFxcXFwvc3RvcmFnZVxcXFxcXFxcL3xeXFxcXFxcXFwvc2RjYXJkXFxcXFxcXFwvLy50ZXN0KGlucHV0KSl7XFxcXG4gICAgICAgICAgICBpZigvXlxcXFxcXFxcL3N0b3JhZ2VcXFxcXFxcXC98XlxcXFxcXFxcL3NkY2FyZFxcXFxcXFxcLy8udGVzdChpbnB1dCkpe1xcXFxuICAgICAgICAgICAgICAgIGlucHV0ID0gJ2ZpbGU6Ly8nK2lucHV0O1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbG9nKCfmraPluLjpk77mjqU6JytpbnB1dCk7XFxcXG4gICAgICAgICAgICBsZXQgdWEgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJyk9PT0n55S16ISRJz8nTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg4LjAuNDMyNC4xNDYgU2FmYXJpLzUzNy4zNic6J01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA5OyBNSSA2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODkuMC40Mzg5LjkwIE1vYmlsZSBTYWZhcmkvNTM3LjM2JztcXFxcbiAgICAgICAgICAgIGxldCB3ZWJfdXJsX2FyciA9IGlucHV0LnNwbGl0KCc7Jyk7XFxcXG4gICAgICAgICAgICBsZXQgd2ViX3VybCA9IHdlYl91cmxfYXJyWzBdO1xcXFxuICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSB7XFxcXG4gICAgICAgICAgICAgICAgJ1JlZmVyZXInOidodHRwczovL2Jsb2cuY3Nkbi5uZXQnLFxcXFxuICAgICAgICAgICAgICAgICdVc2VyLUFnZW50Jzp1YSxcXFxcbiAgICAgICAgICAgICAgICAnQWNjZXB0JzonYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0LCAqLyo7IHE9MC4wMScsXFxcXG4gICAgICAgICAgICAgICAgJ0FjY2VwdC1MYW5ndWFnZSc6J3poLUNOJyxcXFxcbiAgICAgICAgICAgIH07XFxcXG4gICAgICAgICAgICBpZih3ZWJfdXJsX2Fyci5sZW5ndGg+PTMmJndlYl91cmxfYXJyWzJdLmxlbmd0aD4yKXsgLy/orr7nva7nvJbnoIFcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICdjaGFyc2V0PScrd2ViX3VybF9hcnJbMl0udG9VcHBlckNhc2UoKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7aGVhZGVyczpoZWFkZXJzLHdpdGhIZWFkZXJzOmZhbHNlLHJlZGlyZWN0OmZhbHNlfTtcXFxcbiAgICAgICAgICAgIGlmKHdlYl91cmxfYXJyLmxlbmd0aD49MiYmd2ViX3VybF9hcnJbMV0ubGVuZ3RoPjIpeyAvLyDorr7nva7or7fmsYLmlrnms5VcXFxcbiAgICAgICAgICAgICAgICBwYXJhbXNbJ21ldGhvZCddID0gd2ViX3VybF9hcnJbMV0udG9VcHBlckNhc2UoKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGxvZygn5byA5aeL6I635Y+W5rqQ56CBJyk7XFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgIC8qXFxcXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFzeW5jKHdlYl91cmwscGFyYW1zLGZ1bmN0aW9uIChrZXksY29kZSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgYmFja19jb2RlID0gY29kZTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYoYmFja19jb2RlLmxlbmd0aD4yMCl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJyxiYWNrX2NvZGUpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5bey6I635Y+WLOW5tumDqOWIhuaPkuWFpeWIsOaWh+acrOWMuuWfnydcXFxcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZSZ6K+v77yM5pys5qyh6I635Y+W5Yiw56m65paH5pys77yM55aR5Ly85L2g5rKh5pyJ5q2k5paH5Lu2ISc7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICAqL1xcXFxuICAgICAgICAgICAgICAgIGxldCBiYWNrX2NvZGUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJyk9PT0n55S16ISRJz9mZXRjaCh3ZWJfdXJsLHBhcmFtcyk6cmVxdWVzdCh3ZWJfdXJsLHBhcmFtcyk7XFxcXG4gICAgICAgICAgICAgICAgaWYoYmFja19jb2RlLmxlbmd0aD4yMCl7XFxcXG4gICAgICAgICAgICAgICAgICAgIHB1dFZhcignaG91c2UudXBsb2FkX2NvZGUnLGJhY2tfY29kZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5bey6I635Y+WLOW5tumDqOWIhuaPkuWFpeWIsOaWh+acrOWMuuWfnydcXFxcbiAgICAgICAgICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOacrOasoeiOt+WPluWIsOepuuaWh+acrO+8jOeWkeS8vOS9oOayoeacieatpOaWh+S7tiEnO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH1jYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lj5HnlJ/kuobplJnor686XFxcXFxcXFxuJytlLm1lc3NhZ2U7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1lbHNlIGlmKC/kuLvpopjvv6V85YWD57Sg77+lLy50ZXN0KGlucHV0KSl7XFxcXG4gICAgICAgICAgICBsb2coJ+S4u+mimOmTvuaOpScpO1xcXFxuICAgICAgICAgICAgbGV0IHdlYl91cmxfYXJyID0gaW5wdXQuc3BsaXQoJ++/pScpO1xcXFxuICAgICAgICAgICAgbGV0IHdlYl91cmwgPSB3ZWJfdXJsX2Fyclt3ZWJfdXJsX2Fyci5sZW5ndGgtMV07XFxcXG4gICAgICAgICAgICBsZXQgYmFja19jb2RlID0gcGFyc2VQYXN0ZSh3ZWJfdXJsKTtcXFxcbiAgICAgICAgICAgIGlmKGJhY2tfY29kZS5sZW5ndGg+MjApIHtcXFxcbiAgICAgICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJyxiYWNrX2NvZGUpO1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/mupDnoIHlt7Lojrflj5Ys5bm26YOo5YiG5o+S5YWl5Yiw5paH5pys5Yy65Z+fJ1xcXFxuICAgICAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOacrOasoeiOt+WPlui/lOWbnuS4ujpcXFxcXFxcXG4nK2JhY2tfY29kZTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6Z2e5rOV6ZO+5o6lOlxcXFxcXFxcbicrZ2V0VmFyKCdob3VzZS53ZWJfdXJsJyk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9KSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiXFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi6YCJ5oup5paH5Lu26Lev5b6EXFxcXFxcXCIsXFxcXG4gICAgdXJsOiQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKCk9PntcXFxcbiAgICAgICAgLypcXFxcbiAgICAgICAgbGV0IGZwID0gJ2h0dHBzOi8vZ2l0Y29kZS5uZXQvcXFfMzIzOTQzNTEvZHIvLS9yYXcvbWFzdGVyL2pzL2ZpbGVTZWxlY3QuanMnO1xcXFxuICAgICAgICBsZXQgZiA9IHJlcXVpcmUoZnApO1xcXFxuICAgICAgICAqL1xcXFxuICAgICAgICBsZXQgZnA9Y29uZmlnLmxpYi5maWxlU2VsZWN0O1xcXFxuICAgICAgICBsZXQgZj0kLnJjKGZwKTtcXFxcbiAgICAgICAgcmV0dXJuIGYuZmlsZVNlbGVjdGlvblVyaSh7XFxcXG4gICAgICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGZpbmRJdGVtKFxcXFxcXFwiZmlsZVBhdGhcXFxcXFxcIikuZXh0cmE7XFxcXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbShcXFxcXFxcImZpbGVQYXRoXFxcXFxcXCIsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXFxcbiAgICAgICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLndlYl91cmwnLFBBVEgpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xcXFxuICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICBvbkNsaWNrVHlwZTonY29uZmlybScsXFxcXG4gICAgICAgICAgICBmaWxlVHlwZTogXFxcXFxcXCIuanN8LnR4dHwuaGlrZXJ8Lmpzb258Lmh0bWxcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHBhdHRlcm46IDAsXFxcXG4gICAgICAgICAgICByZXF1aXJlVXJsOmZwLFxcXFxuICAgICAgICAgICAgaW5pdGlhbFBhdGg6Z2V0UGF0aCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlLycpLnNsaWNlKDcpLFxcXFxuICAgICAgICAgICAgbWVtb3J5Oid0cnVlJyxcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfSksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOifkuIrkvKDnsbvlnosnLFxcXFxuICAgIGRlc2M6J+S4iuS8oOaWh+S7tueahOexu+WeiyzlvZPliY3kuLo6Jytjb2xvcihnZXRJdGVtKCdob3VzZS5maWxlX3R5cGUnLCfpnZnmgIHmlofku7YnKSwnI2ZmNzAwMCcpLFxcXFxuICAgIGNvbF90eXBlOid0ZXh0XzEnLFxcXFxuICAgIHVybDokKGZpbGVfdHlwZV90aXRsZSwyKS5zZWxlY3QoKCkgPT4ge1xcXFxuICAgICAgICBzZXRJdGVtKCdob3VzZS5maWxlX3R5cGUnLGlucHV0LnJlcGxhY2UoJ/CfkYknLCcnKSk7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L2g6YCJ5oup5LqGOicraW5wdXQ7XFxcXG4gICAgfSlcXFxcbn0pO1xcXFxuXFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOifmlofku7blrprkvY0nLFxcXFxuICAgIGRlc2M6J+aWh+S7tuaYr+WQpuWxnuS6jumHjeWumuWQkSzlvZPliY3kuLo6Jytjb2xvcihnZXRJdGVtKCdob3VzZS5maWxlX3JlZGlyZWN0Jywn5pys5ZywJyksJyNmZjcwMDAnKSxcXFxcbiAgICBjb2xfdHlwZTondGV4dF8xJyxcXFxcbiAgICB1cmw6JChmaWxlX3JlZGlyZWN0X3RpdGxlLDIpLnNlbGVjdCgoKSA9PiB7XFxcXG4gICAgICAgIHNldEl0ZW0oJ2hvdXNlLmZpbGVfcmVkaXJlY3QnLGlucHV0LnJlcGxhY2UoJ/CfkYknLCcnKSk7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L2g6YCJ5oup5LqGOicraW5wdXQ7XFxcXG4gICAgfSlcXFxcbn0pO1xcXFxuXFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiforr7lpIdVQScsXFxcXG4gICAgZGVzYzon5Y+R6LW3572R6aG16K+35rGC5aS05qCH6K+GLOW9k+WJjeS4ujonK2NvbG9yKGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnLCfnlLXohJEnKSwnI2ZmNzAwMCcpLFxcXFxuICAgIGNvbF90eXBlOid0ZXh0XzEnLFxcXFxuICAgIHVybDokKGZpbGVfdWFfdGl0bGUsMikuc2VsZWN0KCgpID0+IHtcXFxcbiAgICAgICAgc2V0SXRlbSgnaG91c2UuZmlsZV91YScsaW5wdXQucmVwbGFjZSgn8J+RiScsJycpKTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly/kvaDpgInmi6nkuoY6JytpbnB1dDtcXFxcbiAgICB9KVxcXFxufSk7XFxcXG5mdW5jdGlvbiBjb21wYXJlKG5hbWUpIHtcXFxcbiAgICByZXR1cm4gZnVuY3Rpb24oaXRlbSkge1xcXFxuICAgICAgICByZXR1cm4gaXRlbS5uYW1lID09PSBuYW1lO1xcXFxuICAgIH1cXFxcbn1cXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6J/Cfl4TvuI/njq/looMnLFxcXFxuICAgIGNvbF90eXBlOidmbGV4X2J1dHRvbicsXFxcXG4gICAgdXJsOiQoKS5sYXp5UnVsZSgoZmlsZV90eXBlLGNvbXBhcmUpPT57XFxcXG4gICAgICAgIGxvZygn5p+l55yL546v5aKD5Y+Y6YePJyk7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBsZXQgdXBfY29kZSA9IGdldFZhcignaG91c2UudXBsb2FkX2NvZGUnLCcnKTtcXFxcbiAgICAgICAgICAgIGxldCBmdHlwZSA9ICBmaWxlX3R5cGUuZmlsdGVyKGNvbXBhcmUoZ2V0SXRlbSgnaG91c2UuZmlsZV90eXBlJywn6Z2Z5oCB5paH5Lu2JykpKVswXS52YWx1ZTtcXFxcbiAgICAgICAgICAgIGxldCByZWRpcmVjdCA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfcmVkaXJlY3QnLCfmnKzlnLAnKSE9PSfmnKzlnLAnO1xcXFxuICAgICAgICAgICAgbGV0IGNvZGUgPSAhcmVkaXJlY3Q/dXBfY29kZTppbnB1dDtcXFxcbiAgICAgICAgICAgIGxldCBlbnYgPSB7XFxcXG4gICAgICAgICAgICAgICAgd2ViX3VybDpnZXRWYXIoJ2hvdXNlLndlYl91cmwnLCcnKSxcXFxcbiAgICAgICAgICAgICAgICBkZXZpY2U6Z2V0SXRlbSgnaG91c2UuZmlsZV91YScsJ+eUteiEkScpLFxcXFxuICAgICAgICAgICAgICAgIGZ0eXBlOmZ0eXBlfHxcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0OnJlZGlyZWN0LFxcXFxuICAgICAgICAgICAgICAgIGNvZGU6Y29kZS5zdWJzdHJpbmcoMCw0MCl8fFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsb2coZW52KTtcXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK0pTT04uc3RyaW5naWZ5KGVudik7XFxcXG4gICAgICAgICAgICAvLyBhbGVydChKU09OLnN0cmluZ2lmeShlbnYpKTtcXFxcbiAgICAgICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytlLm1lc3NhZ2U7XFxcXG4gICAgICAgICAgICAvLyBhbGVydChlLm1lc3NhZ2UpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSxmaWxlX3R5cGUsY29tcGFyZSlcXFxcbn0pO1xcXFxuXFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOifwn5OD5pWZ56iLJyxcXFxcbiAgICBjb2xfdHlwZTonZmxleF9idXR0b24nLFxcXFxuICAgIHVybDokKCkueDVSdWxlKCgpPT57XFxcXG4gICAgICAgIGxldCBtc2cgPSAn5qyi6L+O5L2/55So5byA5Y+R6ICF5pu05aSa5YiG5Lqr5bel5YW3XFxcXFxcXFxuMS7ovpPlhaXnvZHlnYDkuLrmnKzlnLDmlofku7bot6/lvoQsaGlrZXI6Ly/miJbogIVmaWxlOi8v5byA5aS0XFxcXFxcXFxuMi7ngrnlh7vnvZHlnYDovpPlhaXmoI/lkI7pnaLnmoTmjInpkq5cXFxcXFxcXG4zLueci+aWh+acrOmihOiniOWMuuaYr+WQpuato+ehrlxcXFxcXFxcbjQu54K55Ye75LiK5Lyg5oyJ6ZKu5o+Q5Lqk5Yiw5LuT5bqTJztcXFxcbiAgICAgICAgYWxlcnQobXNnKTtcXFxcbiAgICB9KVxcXFxufSk7XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6J/Cfl5HvuI/muIXnqbonLFxcXFxuICAgIGNvbF90eXBlOidmbGV4X2J1dHRvbicsXFxcXG4gICAgdXJsOiQoKS5sYXp5UnVsZSgoKT0+e1xcXFxuICAgICAgICBjbGVhclZhcignaG91c2UudXBsb2FkX2NvZGUnKTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly/lt7LmuIXpmaTpooTop4jljLrln5/lhoXlrrknXFxcXG4gICAgfSlcXFxcbn0pO1xcXFxuXFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOifwn5Oy56S65L6LJyxcXFxcbiAgICBjb2xfdHlwZTonZmxleF9idXR0b24nLFxcXFxuICAgIHVybDokKCkubGF6eVJ1bGUoKCk9PntcXFxcbiAgICAgICAgbGV0IGRlbW9fY29kZSA9IGdldEl0ZW0oJ2hvdXNlLmRlbW8nLCcwJyk7XFxcXG4gICAgICAgIGlmKGRlbW9fY29kZT09JzAnKXtcXFxcbiAgICAgICAgICAgIHB1dFZhcignaG91c2Uud2ViX3VybCcsJ2hpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9odG1sL+i1hOa6kOe9keS5puetvi5odG1sJyk7XFxcXG4gICAgICAgICAgICBkZW1vX2NvZGUgPSBwYXJzZUludChkZW1vX2NvZGUpKzE7XFxcXG4gICAgICAgICAgICBzZXRJdGVtKCdob3VzZS5kZW1vJyxkZW1vX2NvZGUrJycpO1xcXFxuICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgIHB1dFZhcignaG91c2Uud2ViX3VybCcsJ2ZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL3J1bGVzL2R6SG91c2UvaHRtbC/otYTmupDnvZHkuabnrb4uaHRtbCcpO1xcXFxuICAgICAgICAgICAgc2V0SXRlbSgnaG91c2UuZGVtbycsJzAnKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXFxcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+W3suiuvue9ruekuuS+i+WcsOWdgCdcXFxcbiAgICB9KVxcXFxufSk7XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6J/Cfk6TkuIrkvKAnLFxcXFxuICAgIGNvbF90eXBlOidmbGV4X2J1dHRvbicsXFxcXG4gICAgdXJsOiQoKS5sYXp5UnVsZSgoY2FudXAsaG91c2VfZGF0YSxwdXRfdXJsLGZpbGVfdHlwZSkgPT57XFxcXG4gICAgICAgIGZ1bmN0aW9uIGNvbXBhcmUobmFtZSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGl0ZW0pIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5uYW1lID09PSBuYW1lO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGNvbnN0IHtnZXROb3dGb3JtYXREYXRlfT0kLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgdXBfY29kZSA9IGdldFZhcignaG91c2UudXBsb2FkX2NvZGUnLCcnKTtcXFxcbiAgICAgICAgaWYodXBfY29kZS5sZW5ndGggPCAyKXtcXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/mupDnoIHljLrml6DlhoXlrrnvvIzor7flhYjorr/pl67kuIDkuKrpnZnmgIHpobXpnaInXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYoIWNhbnVwKXtcXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/kvaDkuI3mmK/lvIDlj5HogIXvvIzmsqHmnInmj5DkuqTliLDku5PlupPnmoTmnYPliKkhJ1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBpbnB1dCA9IGdldFZhcignaG91c2Uud2ViX3VybCcsJycpO1xcXFxuICAgICAgICBsZXQgd2ViX3VybCA9IGlucHV0LnNwbGl0KCc7JylbMF07XFxcXG4gICAgICAgIGxldCBmaWxlTmFtZSA9ICcnO1xcXFxuICAgICAgICBpZigvXmhpa2VyOnxeZmlsZTp8Xmh0dHA6fF5odHRwczp8XlxcXFxcXFxcL3N0b3JhZ2VcXFxcXFxcXC98XlxcXFxcXFxcL3NkY2FyZFxcXFxcXFxcLy8udGVzdCh3ZWJfdXJsKSl7XFxcXG4gICAgICAgICAgICBmaWxlTmFtZSA9IHdlYl91cmwuc3BsaXQoJy8nKVt3ZWJfdXJsLnNwbGl0KCcvJykubGVuZ3RoLTFdO1xcXFxuICAgICAgICB9ZWxzZSBpZigv5Li76aKY77+lfOWFg+e0oO+/pS8udGVzdChpbnB1dCkpe1xcXFxuICAgICAgICAgICAgbGV0IGJrYXJyID0gdXBfY29kZS5zcGxpdCgn77+lJyk7XFxcXG4gICAgICAgICAgICBpZihia2Fyci5sZW5ndGg8Myl7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+S6keWJqui0tOadv+WGheWuueacieivrydcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHN3aXRjaCAoYmthcnJbMV0pIHtcXFxcbiAgICAgICAgICAgICAgICBjYXNlICdteV9ob21lX3RoZW1lJzpcXFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSB1cF9jb2RlLnNwbGl0KCfjgIwnKVsxXS5zcGxpdCgn44CNJylbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgICAgIGNhc2UgJ215X2hvbWVfc2luZ2xlJzpcXFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSB1cF9jb2RlLnNwbGl0KCfjgIwnKVsxXS5zcGxpdCgn44CNJylbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgICAgIGNhc2UgJ2pzX3VybCc6XFxcXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gdXBfY29kZS5zcGxpdCgn77+lJylbMl0uc3BsaXQoJ0AnKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOe9kemhtemTvuaOpeaXoOWGheWuuSEnO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCB1YSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnKT09PSfnlLXohJEnPydNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODguMC40MzI0LjE0NiBTYWZhcmkvNTM3LjM2JzonTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDk7IE1JIDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OS4wLjQzODkuOTAgTW9iaWxlIFNhZmFyaS81MzcuMzYnO1xcXFxuICAgICAgICBsZXQgaGVhZGVycyA9IHtcXFxcbiAgICAgICAgICAgICdSZWZlcmVyJzonaHR0cHM6Ly9ibG9nLmNzZG4ubmV0JyxcXFxcbiAgICAgICAgICAgIFxcXFxcXFwiY29udGVudC10eXBlXFxcXFxcXCI6IFxcXFxcXFwiYXBwbGljYXRpb24vanNvblxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgJ1VzZXItQWdlbnQnOnVhLFxcXFxuICAgICAgICAgICAgJ0FjY2VwdCc6J2FwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCwgKi8qOyBxPTAuMDEnLFxcXFxuICAgICAgICAgICAgJ0FjY2VwdC1MYW5ndWFnZSc6J3poLUNOJyxcXFxcbiAgICAgICAgfTtcXFxcbiAgICAgICAgbGV0IHRvQ29tcGFyZSA9ICcnO1xcXFxuICAgICAgICBpZihmaWxlTmFtZS5lbmRzV2l0aCgnLmh0bWwnKSl7XFxcXG4gICAgICAgICAgICB0b0NvbXBhcmUgPSAn6Z2Z5oCB5paH5Lu2JztcXFxcbiAgICAgICAgfWVsc2UgaWYoL+S4u+mimC8udGVzdChmaWxlTmFtZSkpe1xcXFxuICAgICAgICAgICAgdG9Db21wYXJlID0gJ+S4u+mhtemFjee9ridcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgZnR5cGUgPSAgZmlsZV90eXBlLmZpbHRlcihjb21wYXJlKHRvQ29tcGFyZXx8Z2V0SXRlbSgnaG91c2UuZmlsZV90eXBlJywn6Z2Z5oCB5paH5Lu2JykpKVswXS52YWx1ZTtcXFxcbiAgICAgICAgbGV0IHJlZGlyZWN0ID0gZ2V0SXRlbSgnaG91c2UuZmlsZV9yZWRpcmVjdCcsJ+acrOWcsCcpIT09J+acrOWcsCc7XFxcXG4gICAgICAgIGlmKHJlZGlyZWN0JiYhd2ViX3VybC5zdGFydHNXaXRoKCdodHRwJykpe1xcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+ebtOmTvjMwMumHjeWumuWQkee9keWdgOmTvuaOpeW/hemhu2h0dHDlvIDlpLQnO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBjb2RlID0gIXJlZGlyZWN0P3VwX2NvZGU6d2ViX3VybDtcXFxcbiAgICAgICAgbGV0IGRhdGEgPSB7XFxcXFxcXCJwYXJhbXNcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICB7XFxcXFxcXCJkYXRhXFxcXFxcXCI6IHtydWxlX25hbWU6IGZpbGVOYW1lLCBcXFxcXFxcInJ1bGVfdHlwZVxcXFxcXFwiOiAn5pu05aSa5YiG5LqrJywgXFxcXFxcXCJ2ZXJzaW9uXFxcXFxcXCI6Z2V0Tm93Rm9ybWF0RGF0ZSgpLFxcXFxcXFwicnVsZV92YWx1ZVxcXFxcXFwiOiBjb2RlLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV90eXBlOmZ0eXBlLCBpc19yZWRpcmVjdDpyZWRpcmVjdCxkZXZpY2VVYTpnZXRJdGVtKCdob3VzZS5maWxlX3VhJyksXFxcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBob3VzZV9kYXRhLnVzZXJuYW1lLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCI6IGhvdXNlX2RhdGEucGFzc3dvcmR9XFxcXG4gICAgICAgIH07XFxcXG4gICAgICAgIGxldCB1cHBhcmFtcyA9IHtoZWFkZXJzOmhlYWRlcnMsYm9keTpKU09OLnN0cmluZ2lmeShkYXRhKSx3aXRoSGVhZGVyczpmYWxzZSxyZWRpcmVjdDpmYWxzZSxtZXRob2Q6J1BPU1QnfTtcXFxcbiAgICAgICAgbGV0IGJhY2ttc2cgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJyk9PT0n55S16ISRJz9mZXRjaChwdXRfdXJsLHVwcGFyYW1zKTpyZXF1ZXN0KHB1dF91cmwsdXBwYXJhbXMpO1xcXFxuICAgICAgICB0cnl7XFxcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gSlNPTi5wYXJzZShiYWNrbXNnKS5yZXN1bHQ7XFxcXG4gICAgICAgICAgICBsZXQgZGV0YWlsID0gcmVzdWx0LmRldGFpbDtcXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK2RldGFpbDtcXFxcbiAgICAgICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBsb2coZS5tZXNzYWdlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lj5HnlJ/kuobplJnor69cXFxcXFxcXG4nK2UubWVzc2FnZTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sY2FudXAsaG91c2VfZGF0YSxwdXRfdXJsLGZpbGVfdHlwZSlcXFxcbn0pO1xcXFxuXFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOifplb/mlofmnKzpooTop4jljLrln58nLFxcXFxuICAgIGNvbF90eXBlOid0ZXh0XzEnLFxcXFxuICAgIHVybDonaGlrZXI6Ly9lbXB0eScsXFxcXG4gICAgZXh0cmE6IHt0ZXh0U2l6ZTogMTEsbGluZVZpc2libGU6ZmFsc2V9XFxcXG59KTtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTpnZXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJywnJykuc3Vic3RyaW5nKDAsMTAyNDApLFxcXFxuICAgIGNvbF90eXBlOidsb25nX3RleHQnLFxcXFxuICAgIGV4dHJhOiB7dGV4dFNpemU6IDExfVxcXFxufSk7XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLmm7TlpJrliIbkuqtcXFxcXFxcIik7XFxcXG5zZXRSZXN1bHQoZCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi6L275ZCI6ZuG55Sf5oiQ5o6l5Y+jXFxcIixcXFwicGF0aFxcXCI6XFxcImdlbkFwaVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmZ1bmN0aW9uIGdlblJ1bGUobmFtZSx1cmwsaWNvbil7XFxcXG4gICAgaWNvbj1pY29ufHwnaHR0cHM6Ly96My5heDF4LmNvbS8yMDIxLzExLzE2L0lXSmh4Zi5wbmcnO1xcXFxuICAgIGNvbnN0IHtnZXROb3dGb3JtYXREYXRlLGFwaSxnZXRBcGl9PSQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFxcXFxcIik7XFxcXG4gICAgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsID0gZnVuY3Rpb24ob2xkLG5ld19zdHIpe1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5zcGxpdChvbGQpLmpvaW4obmV3X3N0cik7XFxcXG4gICAgfTtcXFxcbiAgICBsZXQgbXViYW4gPSBnZXRBcGkoJ2ltcG9ydFVybCcpK1xcXFxcXFwiMTY5MFxcXFxcXFwiO1xcXFxuICAgIGxldCBtdWJhbl93b3JkPXtuYW1lOlxcXFxcXFwiQOi9u+WQiOmbhlxcXFxcXFwiLHVybDpcXFxcXFxcIkDlnLDlnYBcXFxcXFxcIix2ZXI6XFxcXFxcXCJA54mI5pysXFxcXFxcXCIsaWNvbjpcXFxcXFxcIkDlm77moIdcXFxcXFxcIn07XFxcXG4gICAgbGV0IG11YmFuX2NvZGUgPSBmZXRjaChtdWJhbik7XFxcXG4gICAgbXViYW5fY29kZT1tdWJhbl9jb2RlLnJlcGxhY2VBbGwobXViYW5fd29yZC5uYW1lLG5hbWUpLnJlcGxhY2VBbGwobXViYW5fd29yZC52ZXIsZ2V0Tm93Rm9ybWF0RGF0ZSgpKS5yZXBsYWNlQWxsKG11YmFuX3dvcmQudXJsLHVybCkucmVwbGFjZUFsbChtdWJhbl93b3JkLmljb24saWNvbik7XFxcXG4gICAgbGV0IGltcG9ydF9jb2RlPVxcXFxcXFwi5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77ya5bCP56iL5bqP77yM5peg5qC55qCR77yM6Iqx5q2j5riF77yM5LiN5pat6I2k6IWl5LiN5oiS5rer77+laG9tZV9ydWxlX3Yy77+lYmFzZTY0Oi8vQFxcXFxcXFwiK25hbWUrXFxcXFxcXCJAXFxcXFxcXCIrYmFzZTY0RW5jb2RlKG11YmFuX2NvZGUpO1xcXFxuICAgIHZhciBwYXN0ZXMgPSBnZXRQYXN0ZXMoKTtcXFxcbiAgICB2YXIgdXJsID0gc2hhcmVQYXN0ZShpbXBvcnRfY29kZSxwYXN0ZXMuc2xpY2UoLTEpWzBdKTtcXFxcbiAgICBsZXQgaW1wb3J0X3J1bGU9IHVybCtcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFxcbuWwj+eoi+W6j++8mlxcXFxcXFwiK25hbWU7XFxcXG4gICAgcmV0dXJuIGltcG9ydF9ydWxlO1xcXFxufVxcXFxuJC5leHBvcnRzLmdlblJ1bGU9Z2VuUnVsZTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlhajlsYDop6PmnpDlhY3ll4VcXFwiLFxcXCJwYXRoXFxcIjpcXFwiZ2xvYmFsUGFyc2VcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG4gICAgZnVuY3Rpb24gZ2V0SGVhZGVycyhwbGF5VXJsKXtcXFxcbiAgICAgICAgbGV0IGhlYWRlcnMgPSB7fTtcXFxcbiAgICAgICAgbGV0IHJlZmVyPXBsYXlVcmwuc3BsaXQoXFxcXFxcXCIvL1xcXFxcXFwiKVswXStcXFxcXFxcIi8vXFxcXFxcXCIrcGxheVVybC5zcGxpdChcXFxcXFxcIi8vXFxcXFxcXCIpWzFdLnNwbGl0KFxcXFxcXFwiL1xcXFxcXFwiKVswXTtcXFxcbiAgICAgICAgaWYoL2xlY2xvdWRcXFxcXFxcXC5jb218YmlsaXZpZGVvXFxcXFxcXFwuY29tLy50ZXN0KHBsYXlVcmwpKXtcXFxcbiAgICAgICAgICAgIGhlYWRlcnMgPSB7XFxcXFxcXCJSZWZlcmVyXFxcXFxcXCI6ICdodHRwczovL3d3dy5iaWxpYmlsaS5jb20vJyxcXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjpcXFxcXFxcIk1vemlsbGEvNS4wXFxcXFxcXCJ9XFxcXG4gICAgICAgIH1lbHNlIGlmKC9tZ3R2XFxcXFxcXFwuY29tLy50ZXN0KHBsYXlVcmwpKXtcXFxcbiAgICAgICAgICAgIGhlYWRlcnMgPSB7XFxcXFxcXCJSZWZlcmVyXFxcXFxcXCI6IHJlZmVyLFxcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOlxcXFxcXFwiTW96aWxsYS81LjBcXFxcXFxcIn1cXFxcbiAgICAgICAgfWVsc2UgaWYoL2l4aWd1YVxcXFxcXFxcLmNvbS8udGVzdChwbGF5VXJsKSl7XFxcXG4gICAgICAgICAgICBoZWFkZXJzID0ge1xcXFxcXFwiUmVmZXJlclxcXFxcXFwiOiAnaHR0cHM6Ly93d3cuaXhpZ3VhLmNvbS8nLFxcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOlxcXFxcXFwiTW96aWxsYS81LjBcXFxcXFxcIn1cXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICAvLyBoZWFkZXJzID0ge1xcXFxcXFwiUmVmZXJlclxcXFxcXFwiOiByZWZlciwnVXNlci1BZ2VudCc6J0RhcnQvMi4xMyAoZGFydDppbyknfVxcXFxuICAgICAgICAgICAgLy8gaGVhZGVycyA9IHtcXFxcXFxcIlJlZmVyZXJcXFxcXFxcIjogcmVmZXIsJ1VzZXItQWdlbnQnOk1PQklMRV9VQX07XFxcXG4gICAgICAgICAgICBoZWFkZXJzID0geydVc2VyLUFnZW50JzpNT0JJTEVfVUF9O1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBoZWFkZXJzXFxcXG4gICAgfVxcXFxuZnVuY3Rpb24gaXNQaWMoc3RyKXtcXFxcbiAgICByZXR1cm4gL1xcXFxcXFxcLihnaWZ8anBnfGpwZWd8cG5nfEdJRnxKUEd8UE5HKSQvLnRlc3Qoc3RyKTtcXFxcbn1cXFxcbmZ1bmN0aW9uIGlzVmlkZW8ocGxheVVybCxyZWNoYW5nZSl7XFxcXG4gICAgLy/ms6jmhI8ucGhw5LiN5Y+v5Lul6KKr5o6S6Zmk5ZCm5YiZ6J6N5YW06Kej5p6Q5LiN5LqGIHwucGhwJFxcXFxuICAgIC8v5aaC5p6c5piv5pKt5pS+5Zyw5Z2A5bCx55u05o6l6L+U5Zue5Zyw5Z2A5Yqg5LiKVUHvvIzkuI3mmK/nmoTor53lsLHov5Tlm55mYWxzZVxcXFxuICAgIC8vIGxldCB0MSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcXFxuICAgIGxldCBjYWNoZVJlZ3ggPSBuZXcgUmVnRXhwKCdmaWxlOi8vL3N0b3JhZ2UvZW11bGF0ZWQvKC4qPylcXFxcXFxcXFxcXFxcXFxcLm0zdTh8aGlrZXI6Ly9maWxlcy8oLio/KVxcXFxcXFxcXFxcXFxcXFwubTN1OCcpO1xcXFxuICAgIGlmKGNhY2hlUmVneC50ZXN0KHBsYXlVcmwpKXtcXFxcbiAgICAgICAgcmV0dXJuIHBsYXlVcmxcXFxcbiAgICB9XFxcXG4gICAgZnVuY3Rpb24gZ2V0SG9zdCh1cmwpe1xcXFxuICAgICAgICAvLyBmYmHnmoRwYXJzZUxhennlpKrmhaLkuobljYPkuIfliKvnlKhcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIHJldHVybiB1cmwubWF0Y2goL15odHRwKHMpPzpcXFxcXFxcXC9cXFxcXFxcXC8oLio/KVxcXFxcXFxcLy8pWzBdLnNsaWNlKDAsLTEpO1xcXFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIC8qXFxcXG4gICAgICAgIGlmKHR5cGVvZihsb2cpPT09J3VuZGVmaW5lZCcpe1xcXFxuICAgICAgICAgICAgcmV0dXJuICBmYmEucGFyc2VMYXp5UnVsZSgkJCQoKS5sYXp5UnVsZSgodXJsKT0+e1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRIb21lKHVybClcXFxcbiAgICAgICAgICAgIH0sdXJsKSlcXFxcbiAgICAgICAgfWVsc2Uge1xcXFxuICAgICAgICAgICAgcmV0dXJuIGdldEhvbWUodXJsKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgICovXFxcXG4gICAgfVxcXFxuICAgIGxldCBwVXJsPXBsYXlVcmwuc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpWzBdOy8v6I635Y+W5oqg5o6J5rW36ZiUdWHnrYnlj4LmlbDnmoTnvZHpobXmkq3mlL7pk77mjqVcXFxcbiAgICBsZXQgaG9zdCA9IGdldEhvc3QocFVybCk7IC8vIOiOt+WPluWfn+WQjVxcXFxuICAgIGlmKCFob3N0KXsvL+WIpOaWreaXoOWfn+WQjeebtOaOpeS4jeaYr+inhumikVxcXFxuICAgICAgICByZXR1cm4gZmFsc2VcXFxcbiAgICB9XFxcXG4gICAgZnVuY3Rpb24gcHJpbnQoZGF0YSl7XFxcXG4gICAgICAgIGlmKHR5cGVvZihsb2cpPT09J3VuZGVmaW5lZCcpe1xcXFxuICAgICAgICAgICAgcmV0dXJuICBmYmEubG9nKGRhdGEpXFxcXG4gICAgICAgIH1lbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBsb2coZGF0YSlcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICByZWNoYW5nZT10eXBlb2YocmVjaGFuZ2UpPT09XFxcXFxcXCJmdW5jdGlvblxcXFxcXFwiP3JlY2hhbmdlOmZ1bmN0aW9uKHBsYXlVcmwpe3JldHVybiBwbGF5VXJsfTtcXFxcbiAgICBsZXQgZXhjZXB0V29yZHMgPSAnLmpzJHwuY3NzJHwudHMkfC5odG1sJHwuaHRtJHwuZ2lmJHwuanBnJHwuanBlZyR8LnBuZyR8LmljbyR8LnN2ZyR8LnR4dCQnLnNwbGl0KCd8JykubWFwKGl0PT4nXFxcXFxcXFxcXFxcXFxcXCcraXQpLmpvaW4oJ3wnKTtcXFxcbiAgICB2YXIgZXhjZXB0S2V5cyA9IG5ldyBSZWdFeHAoZXhjZXB0V29yZHMpO1xcXFxuICAgIGxldCBleGNlcHRXb3JkczEgPSAncmVmZXJlcj18dXJsPScuc3BsaXQoJ3wnKS5tYXAoaXQ9Pml0KS5qb2luKCd8Jyk7XFxcXG4gICAgdmFyIGV4Y2VwdEtleXMxID0gbmV3IFJlZ0V4cChleGNlcHRXb3JkczEpO1xcXFxuICAgIGxldCByZXBsYWNlV29yZHMgPSAncGxheW0zdTh8bTN1OFxcXFxcXFxcLnR2Jy5zcGxpdCgnfCcpLm1hcChpdD0+aXQpLmpvaW4oJ3wnKTtcXFxcbiAgICBsZXQgcmVwbGFjZUtleXMgPSBuZXcgUmVnRXhwKHJlcGxhY2VXb3JkcywnZycpO1xcXFxuICAgIGxldCB2aWRlb1dvcmRzID0gXFxcXFxcXCIvdmlkZW8vdG9zfC5tcDQkfC5tM3U4JHwuZmx2JHwuYXZpJHwuM2dwJHwubXBlZyR8LndtdiR8Lm1vdiR8cm12YnwuZGF0JHwubXAzJHwubTRhJHxxcUJGZG93bmxvYWR8bWltZT12aWRlbyUyRnxtaW1lX3R5cGU9dmlkZW9ffHR5cGU9bTN1OHxwdD1tM3U4XFxcXFxcXCIuc3BsaXQoJ3wnKS5tYXAoKGl0KT0+e1xcXFxuICAgICAgICAvL3R5cGU9bXA0XFxcXG4gICAgICAgIGlmKGl0LnN0YXJ0c1dpdGgoXFxcXFxcXCIuXFxcXFxcXCIpKXtcXFxcbiAgICAgICAgICAgIHJldHVybiAnXFxcXFxcXFxcXFxcXFxcXCcraXRcXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICByZXR1cm4gaXRcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pLmpvaW4oXFxcXFxcXCJ8XFxcXFxcXCIpO1xcXFxuICAgIGxldCB2aWRlb0tleXMgPSBuZXcgUmVnRXhwKHZpZGVvV29yZHMpO1xcXFxuICAgIGxldCByVXJsID0gcFVybC5yZXBsYWNlKGhvc3QsJycpOy8v6I635Y+W6Zmk5byA5Z+f5ZCN55qE5Ymp5L2Z6ZO+5o6lXFxcXG4gICAgbGV0IHBVcmwyPXBVcmwuc3BsaXQoXFxcXFxcXCImXFxcXFxcXCIpWzBdLnNwbGl0KFxcXFxcXFwiP1xcXFxcXFwiKVswXTsvL+iOt+WPluS4jeW4puWPguaVsOeahOe9kemhtemTvuaOpVxcXFxuICAgIGxldCBydXJsMiA9IHBVcmwyLnJlcGxhY2UoaG9zdCwnJyk7Ly/ojrflj5bpmaTlvIDln5/lkI3nmoTliankvZnkuI3luKblj4LmlbDpk77mjqVcXFxcbiAgICBsZXQgaGFzS2V5ID0gdmlkZW9LZXlzLnRlc3QoclVybCl8fHZpZGVvS2V5cy50ZXN0KHJ1cmwyKTtcXFxcbiAgICBsZXQgcGFyVXJsID0gcFVybC5yZXBsYWNlKHBVcmwuc3BsaXQoXFxcXFxcXCI/XFxcXFxcXCIpWzBdLCcnKTsgLy8g5YiG5Ymy6Zeu5Y+35ZCO5Ymp5L2Z5Y+C5pWw55qE5a6M5pW06ZO+5o6lXFxcXG4gICAgbGV0IGV4Y0tleSA9IGV4Y2VwdEtleXMxLnRlc3QocGFyVXJsKTtcXFxcbiAgICBpZihyVXJsLnNwbGl0KCc/JykubGVuZ3RoPjIpe1xcXFxuICAgICAgICBsZXQgclVybDM9clVybC5zcGxpdChcXFxcXFxcIj9cXFxcXFxcIilbMV07Ly/ojrflj5Y/5YiG5Ymy5ZCO55qE56ys5LiA5q61XFxcXG4gICAgICAgIGhhc0tleSA9IGhhc0tleXx8dmlkZW9LZXlzLnRlc3QoclVybDMpO1xcXFxuICAgIH1cXFxcbiAgICBpZihoYXNLZXkmJiFleGNLZXkpe1xcXFxuICAgICAgICBsZXQgdGlwcyA9ICfmo4DmtYvliLDnlpHkvLzlpJrlqpLkvZPnmoTlnLDlnYA6JztcXFxcbiAgICAgICAgcHJpbnQoXFxcXFxcXCJqc+S4rVxcXFxcXFwiK3RpcHMrcFVybCk7XFxcXG4gICAgICAgIHByaW50KFxcXFxcXFwi5YiG5Ymy6Zeu5Y+35ZCOOlxcXFxcXFwiK3BhclVybCk7XFxcXG4gICAgfVxcXFxuICAgIC8vIGxvZygnMTonKyh2aWRlb0tleXMudGVzdChwVXJsKXx8dmlkZW9LZXlzLnRlc3QocFVybDIpfHx2aWRlb0tleXMudGVzdChwVXJsLnJlcGxhY2UocmVwbGFjZUtleXMsXFxcXFxcXCJcXFxcXFxcIikuc3BsaXQoXFxcXFxcXCImXFxcXFxcXCIpWzBdLnNwbGl0KFxcXFxcXFwiP1xcXFxcXFwiKVswXSkpKTtcXFxcbiAgICAvLyBsb2coJzI6JyshZXhjZXB0S2V5cy50ZXN0KHBVcmwuc3BsaXQoXFxcXFxcXCI/XFxcXFxcXCIpWzBdLnNwbGl0KCcmJylbMF0pKTtcXFxcbiAgICAvLyBsb2coJzM6JyshZXhjZXB0S2V5czEudGVzdChwVXJsLnJlcGxhY2UocFVybC5zcGxpdChcXFxcXFxcIj9cXFxcXFxcIilbMF0sJycpKSk7XFxcXG4gICAgaWYgKChoYXNLZXl8fHZpZGVvS2V5cy50ZXN0KHJVcmwucmVwbGFjZShyZXBsYWNlS2V5cyxcXFxcXFxcIlxcXFxcXFwiKS5zcGxpdChcXFxcXFxcIiZcXFxcXFxcIilbMF0uc3BsaXQoXFxcXFxcXCI/XFxcXFxcXCIpWzBdKSApJiYgIWV4Y2VwdEtleXMudGVzdChwVXJsMikmJiFleGNlcHRLZXlzMS50ZXN0KHBVcmwyKSkge1xcXFxuICAgICAgICBpZighKC9Vc2VyLUFnZW50fFJlZmVyZXJALy50ZXN0KHBsYXlVcmwpKSl7XFxcXG4gICAgICAgICAgICBpZigvbGVjbG91ZFxcXFxcXFxcLmNvbXxiaWxpdmlkZW8vLnRlc3QocGxheVVybCkpe1xcXFxuICAgICAgICAgICAgICAgIHBsYXlVcmwrPVxcXFxcXFwiO3tSZWZlcmVyQGh0dHBzOi8vd3d3LmJpbGliaWxpLmNvbS8mJlVzZXItQWdlbnRATW96aWxsYS81LjB9XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9ZWxzZSBpZigvaXhpZ3VhXFxcXFxcXFwuY29tLy50ZXN0KHBsYXlVcmwpKXtcXFxcbiAgICAgICAgICAgICAgICBwbGF5VXJsKz1cXFxcXFxcIiNpc3ZpZGVvPXRydWUjO3tSZWZlcmVyQGh0dHBzOi8vd3d3Lml4aWd1YS5jb20vJiZVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgZWxzZSBpZigvbWd0dlxcXFxcXFxcLmNvbXxieXRlYW1vbmUvLnRlc3QocGxheVVybCkpe1xcXFxuICAgICAgICAgICAgICAgIHBsYXlVcmwrPVxcXFxcXFwiO3tVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfWVsc2UgaWYoL3B0d29cXFxcXFxcXC53a2ZpbGVcXFxcXFxcXC5jb20vLnRlc3QocGxheVVybCkmJi91cmw9Ly50ZXN0KHBsYXlVcmwpKXtcXFxcbiAgICAgICAgICAgICAgICBwbGF5VXJsPXBsYXlVcmwuc3BsaXQoXFxcXFxcXCJ1cmw9XFxcXFxcXCIpWzFdK1xcXFxcXFwiO3tSZWZlcmVyQGh0dHBzOi8vZmFudHVhbi50dn1cXFxcXFxcIlxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgLy8g5aSE55CG5aSn5biI5YWE5LmL57G755qEYXBwXFxcXG4gICAgICAgICAgICAvLyBlbHNle1xcXFxuICAgICAgICAgICAgLy8gICAgIHBsYXlVcmwrPVxcXFxcXFwiO3tVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgLy8gfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHBsYXlVcmw9cmVjaGFuZ2UocGxheVVybCk7XFxcXG4gICAgICAgIGlmKCEvI2lzVmlkZW89dHJ1ZSMvLnRlc3QocGxheVVybCkpe1xcXFxuICAgICAgICAgICAgcGxheVVybCs9XFxcXFxcXCIjaXNWaWRlbz10cnVlI1xcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIC8vIGxldCB0MiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcXFxuICAgICAgICAvLyBwcmludCgn5Yik5pataXNWaWRlb+iAl+aXtjonKyh0Mi10MSkpO1xcXFxuICAgICAgICByZXR1cm4gcGxheVVybDtcXFxcbiAgICB9ZWxzZXtcXFxcbiAgICAgICAgLy8gbGV0IHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxcXG4gICAgICAgIC8vIHByaW50KCfliKTmlq1pc1ZpZGVv6ICX5pe2OicrKHQyLXQxKSk7XFxcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXFxcbiAgICB9XFxcXG59XFxcXG5mdW5jdGlvbiBjb21QYXJzZShwYXJTdHIsZWosb25seWJhY2ssaHRtbCl7XFxcXG4gICAgLy/liJfooajvvIzmoIfpopjvvIzlm77niYfvvIzmj4/ov7DvvIzpk77mjqXvvIzlhoXlrrlcXFxcbiAgICBlaiA9IGVqfHxmYWxzZTsvL+acieS6jOe6p1xcXFxuICAgIG9ubHliYWNrPW9ubHliYWNrfHxmYWxzZTsvL+WPqui/lOWbnuaVsOaNrlxcXFxuICAgIGh0bWwgPSBodG1sfHxnZXRSZXNDb2RlKCk7XFxcXG4gICAgaHRtbCA9IHR5cGVvZihodG1sKT09PSdzdHJpbmcnP2h0bWw6aHRtbC5odG1sO1xcXFxuICAgIHJldHVybiAkLnRvU3RyaW5nKChwYXJTdHIsZWosb25seWJhY2ssaHRtbCxpc1BpYyk9PntcXFxcbiAgICAgICAgbGV0IHQ9cGFyU3RyLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IGQ9W107XFxcXG4gICAgICAgIC8vIGxldCBsaXN0PXBkZmEoZ2V0UmVzQ29kZSgpLHRbMF0pO1xcXFxuICAgICAgICBsZXQgbGlzdD1wZGZhKGh0bWwsdFswXSk7XFxcXG4gICAgICAgIGxldCBsYXp5ID0gJCgnJykubGF6eVJ1bGUoKCk9PntcXFxcbiAgICAgICAgICAgIGNvbnN0IHtsYXp5UGFyc2V9ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZ2xvYmFsUGFyc2U/cnVsZT3pgZPplb/ku5PlupNQcm8nKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBsYXp5UGFyc2UoaW5wdXQpXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBmb3IobGV0IGkgaW4gbGlzdCl7XFxcXG4gICAgICAgICAgICBsZXQgX3BpYyA9IHRbMl0/cGQobGlzdFtpXSx0WzJdKTonJztcXFxcbiAgICAgICAgICAgIGlmKGlzUGljKF9waWMpJiYhL0BSZWZlcmVyPS8udGVzdChfcGljKSl7XFxcXG4gICAgICAgICAgICAgICAgX3BpYys9J0BSZWZlcmVyPSdcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGxldCBpdD17XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6cGRmaChsaXN0W2ldLHRbMV0pLFxcXFxuICAgICAgICAgICAgICAgIHBpY191cmw6X3BpYyxcXFxcbiAgICAgICAgICAgICAgICBkZXNjOnBkZmgobGlzdFtpXSx0WzNdKSxcXFxcbiAgICAgICAgICAgICAgICB1cmw6ZWo/cGQobGlzdFtpXSx0WzRdKTpwZChsaXN0W2ldLHRbNF0pK2xhenlcXFxcbiAgICAgICAgICAgIH07XFxcXG4gICAgICAgICAgICBpZih0Lmxlbmd0aD41KXsvL+WGheWuue+8jOeUqOS6juaQnOe0olxcXFxuICAgICAgICAgICAgICAgIGl0LmNvbnRlbnQ9cGRmaChsaXN0W2ldLHRbNV0pXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBkLnB1c2goaXQpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmKG9ubHliYWNrKXtcXFxcbiAgICAgICAgICAgIHJldHVybiBkXFxcXG4gICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgc2V0UmVzdWx0KGQpXFxcXG4gICAgICAgIH1cXFxcbiAgICB9LHBhclN0cixlaixvbmx5YmFjayxodG1sLGlzUGljKVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBpc0JhZFZpZGVvKHZpZGVvVXJsKSB7Ly/mmK/lnY/nmoTop4bpopFcXFxcbiAgICBsZXQgZG1QYXRoID0gJ2hpa2VyOi8vZmlsZXMvY2FjaGUvZGlhb21hby50eHQnOy8v5ZCK5q+b5qih5byP6L+H5ruk5paH5Lu26Lev5b6EXFxcXG4gICAgbGV0IGRtVXJscztcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBkbVVybHMgPSByZXF1ZXN0KGRtUGF0aCkudHJpbSgpLnNwbGl0KCdcXFxcXFxcXG4nKS5maWx0ZXIoaXQgPT4gaXQgJiYgIWl0LnN0YXJ0c1dpdGgoJy8vJykpO1xcXFxuICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgZG1VcmxzID0gW107XFxcXG4gICAgfVxcXFxuXFxcXG4gICAgZnVuY3Rpb24gaGFzRG0odmlkZW9VcmwsIGRtVXJscykgey8v5pKt5pS+5Zyw5Z2A5piv5ZCm5Li65ZCK5q+b6KeG6aKRXFxcXG4gICAgICAgIGlmIChkbVVybHMubGVuZ3RoIDwgMSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgZnVuY3Rpb24gcHJpbnQoc3RyKXtcXFxcbiAgICAgICAgICAgIGlmKHR5cGVvZihsb2cpIT09J3VuZGVmaW5lZCcpe1xcXFxuICAgICAgICAgICAgICAgIGxvZyhzdHIpO1xcXFxuICAgICAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICAgICAgZmJhLmxvZyhzdHIpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGZvciAobGV0IGRtVXJsIG9mIGRtVXJscykge1xcXFxuICAgICAgICAgICAgaWYgKChuZXcgUmVnRXhwKGRtVXJsKSkudGVzdCh2aWRlb1VybCkpIHsvL+aSreaUvuWcsOWdgOWMheWQq+WQiuavm+agh+W/l+eahOWcsOWdgFxcXFxuICAgICAgICAgICAgICAgIHByaW50KCflkIrmr5vop4bpopEs6Ieq5Yqo6L+H5rukOicrdmlkZW9VcmwpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcHJpbnQoJ+mdnuWQiuavm+inhumikSzlj6/mkq3mlL46Jyt2aWRlb1VybCk7XFxcXG4gICAgICAgIHJldHVybiBmYWxzZVxcXFxuICAgIH1cXFxcblxcXFxuICAgIGZ1bmN0aW9uIGlzRG0ocmV0KSB7XFxcXG4gICAgICAgIGlmICghcmV0KSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBoYXNEbShyZXQuc3BsaXQoJyMnKVswXS5zcGxpdCgnOycpWzBdLCBkbVVybHMpXFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBpc0RtKHZpZGVvVXJsKVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBsYXp5UGFyc2UocGxheVVybCxtcyx0bSxyZWNoYW5nZSl7XFxcXG4gICAgLy8gbG9nKCfosIPnlKjku5PlupPlhY3ll4XmjqLkvKDlj4LotoXml7bkuLo6Jyttcyk7XFxcXG4gICAgdG0gPSBwYXJzZUludCh0bSl8fDUwMDA7XFxcXG4gICAgY29uc3Qge2lzVmlkZW8sZ2V0SGVhZGVycyxpc0JhZFZpZGVvfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2dsb2JhbFBhcnNlP3J1bGU96YGT6ZW/5LuT5bqTUHJvJyk7XFxcXG4gICAgbGV0IHJlYWxVcmwgPSBpc1ZpZGVvKHBsYXlVcmwscmVjaGFuZ2UpO1xcXFxuICAgIC8vbG9nKHJlYWxVcmwpO1xcXFxuICAgIGlmKHR5cGVvZihyZWFsVXJsKT09J3N0cmluZycpey8vYm9vbOWAvOWwseaYr+Wksei0pVxcXFxuICAgICAgICB0cnl7XFxcXG4gICAgICAgICAgICBsZXQgcnVybD1yZWFsVXJsLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKVswXS5zcGxpdChcXFxcXFxcIiNcXFxcXFxcIilbMF07XFxcXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXF1ZXN0KHJ1cmwse3RpbWVvdXQ6dG19KSkudXJsXFxcXG4gICAgICAgIH1jYXRjaChlKXtcXFxcbiAgICAgICAgICAgIHJldHVybiByZWFsVXJsXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgLy9yZXR1cm4gcmVhbFVybFxcXFxuICAgIH1cXFxcblxcXFxuICAgIC8vbG9nKFxcXFxcXFwi6K6/6Zeu6LaF5pe2OlxcXFxcXFwiK3RtKTtcXFxcbiAgICBsb2coXFxcXFxcXCLlsJ3or5XpgZPplb/ku5PlupN4NeWFjeWXhTpcXFxcXFxcIitwbGF5VXJsKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIl94NWp4VXJsXFxcXFxcXCIpO1xcXFxuICAgIGxldCBiYWQ9JChcXFxcXFxcIue9kee7nOS4jeS9s+aIluiAheeWkeS8vOWvueaWuee9keermeaMguS6hu+8jOS9oOimgeafpeeci+WFtue9kemhteWQl++8n1xcXFxcXFwiKS5jb25maXJtKChwbGF5VXJsKT0+e1xcXFxuICAgICAgICBsb2coXFxcXFxcXCLnvZHnq5nnnIvotbfmnaXmjILkuoY6XFxcXFxcXCIrcGxheVVybCk7XFxcXG4gICAgICAgIHJldHVybiBwbGF5VXJsXFxcXG4gICAgfSxwbGF5VXJsKTtcXFxcbiAgICB0cnl7XFxcXG4gICAgICAgIHZhciBiYWNrPXJlcXVlc3QocGxheVVybCx7aGVhZGVyczogZ2V0SGVhZGVycyhwbGF5VXJsKSx0aW1lb3V0OnRtfSk7XFxcXG4gICAgICAgIC8vdmFyIGJhY2s9ZmV0Y2gocGxheVVybCx7aGVhZGVyczogeydVc2VyLUFnZW50JzogUENfVUF9fSk7XFxcXG4gICAgICAgIGlmKCFiYWNrKXtcXFxcbiAgICAgICAgICAgIGxvZyhcXFxcXFxcIue9keermVxcXFxcXFwiK3BsYXlVcmwrXFxcXFxcXCLnoa7lrp7llaXkuZ/msqHov5Tlm55cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZXR1cm4gYmFkXFxcXG4gICAgICAgIH1lbHNlIGlmKC8jRVhUSU5GLy50ZXN0KGJhY2spKXtcXFxcbiAgICAgICAgICAgIC8vbGV0IGxjYWNoZT1cXFxcXFxcIi9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvY2FjaGUvdmlkZW8ubTN1OFxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgLy93cml0ZUZpbGUobGNhY2hlLGJhY2spO1xcXFxuICAgICAgICAgICAgLy9yZXR1cm4gbGNhY2hlK1xcXFxcXFwiIyNcXFxcXFxcIitwbGF5VXJsK1xcXFxcXFwiI2lzVmlkZW89dHJ1ZSNcXFxcXFxcIlxcXFxuICAgICAgICAgICAgcGxheVVybD1jYWNoZU0zdTgocGxheVVybCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gcGxheVVybFxcXFxuICAgICAgICB9ZWxzZSBpZigoIS/op6blj5HkuobpmLLnm5fpk7585pyq5o6I5p2DfOaOpeWPo+mYsuebly8udGVzdChiYWNrKSkmJighL2h0dHB8dXJsLy50ZXN0KGJhY2spKSYmKCEvbXNnfGNvZGV8aHRtbC8udGVzdChiYWNrKSkpe1xcXFxuICAgICAgICAgICAgbG9nKGJhY2spO1xcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+eWkeS8vOWvueaWueaVsOaNruWKoOWvhuS6hu+8jOWFt+S9k+aVsOaNrueci+aXpeW/lydcXFxcbiAgICAgICAgfVxcXFxuICAgIH1jYXRjaChlKXtcXFxcbiAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxcXG4gICAgICAgIHJldHVybiBiYWRcXFxcbiAgICB9XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgYmFjaz1KU09OLnBhcnNlKGJhY2spO1xcXFxuICAgICAgICBsZXQgcmVhbFVybD1iYWNrLnVybDtcXFxcbiAgICAgICAgaWYodHlwZW9mKHJlYWxVcmwpPT1cXFxcXFxcInVuZGVmaW5lZFxcXFxcXFwifHwhcmVhbFVybCl7XFxcXG4gICAgICAgICAgICBsb2coYmFjayk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+mBk+mVv+S7k+W6k+ino+aekOWksei0pe+8gei/lOWbnuaSreaUvuWcsOWdgOS4uuepulxcXFxcXFwiXFxcXG4gICAgICAgIH0gZWxzZSBpZih0eXBlb2YoaXNWaWRlbyhyZWFsVXJsLHJlY2hhbmdlKSk9PSdzdHJpbmcnKXtcXFxcbiAgICAgICAgICAgIHJldHVybiBpc1ZpZGVvKHJlYWxVcmwscmVjaGFuZ2UpO1xcXFxuICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgIHJldHVybiByZWFsVXJsK1xcXFxcXFwiI2lzVmlkZW89dHJ1ZSNcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICAvL2Vsc2V7XFxcXG4gICAgICAgIC8vcmVhbFVybCs9XFxcXFxcXCI7e1VzZXItQWdlbnRATW96aWxsYS81LjB9XFxcXFxcXCI7XFxcXG4gICAgICAgIC8vIH1cXFxcbiAgICB9Y2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgbG9nKFxcXFxcXFwi5qOA5rWL5Yiw6Kej5p6Q5Y+j6Z2eanNvbumUmeivrzpcXFxcXFxcIitlLm1lc3NhZ2UrJyzlvIDlp4t4NeWFjeWXheaOoicpO1xcXFxuICAgICAgICAvLyByZXF1aXJlKCdodHRwczovL2hqZGhueC5jb2RpbmcubmV0L3AvaGlrZXIvZC9kci9naXQvcmF3L21hc3Rlci9qcy9sc2cuanMnKTsvL+W8leeUqOacrOWcsOWCqOWtmOaPkuS7tlxcXFxuICAgICAgICBjb25zdCBsc2c9JC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2xvY2FsU3RvcmFnZT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXFxcXFwiKTsvL+W8leeUqOWtkOmhtemdouacrOWcsOWCqOWtmOaPkuS7tlxcXFxuICAgICAgICBsZXQgbG9jYWxfbXMgPSBsc2cuZ2V0SXRlbSgndGltZW91dCcpO1xcXFxuICAgICAgICBsZXQgbXMgPSBwYXJzZUludChtcyl8fHBhcnNlSW50KGxvY2FsX21zKXx8NTAwMDtcXFxcbiAgICAgICAgbGV0IG1heF9jb3VudD1NYXRoLmNlaWwobXMvMjUwKTtcXFxcbiAgICAgICAgbG9nKFxcXFxcXFwi5pys5qyh5ZeF5o6i6LaF5pe2OlxcXFxcXFwiK21zK1xcXFxcXFwi5YWx6K6h5b6F5oqT5YyFOlxcXFxcXFwiK21heF9jb3VudCtcXFxcXFxcIuasoVxcXFxcXFwiKTtcXFxcbiAgICAgICAgc2hvd0xvYWRpbmcoJ+WXheaOouS4re+8jOiLpeWksei0peWwseWIh+aNondlYuWXheaOoi4uLicpO1xcXFxuICAgICAgICBsZXQgX3g1ID0gJC50b1N0cmluZygoaXNWaWRlbyxyZWNoYW5nZSxwbGF5VXJsLG1heF9jb3VudCxQQ19VQSxpc0JhZFZpZGVvKT0+e1xcXFxuICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YoZmJhKT09J3VuZGVmaW5lZCd8fCFmYmEpe1xcXFxuICAgICAgICAgICAgICAgICAgICB2YXIgZmJhID0gZnlfYnJpZGdlX2FwcDtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mKHJlcXVlc3QpPT0ndW5kZWZpbmVkJ3x8IXJlcXVlc3Qpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZhbChmYmEuZ2V0SW50ZXJuYWxKcygpKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH1jYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGZiYS5wdXRWYXIoXFxcXFxcXCJfeDVqeFVybFxcXFxcXFwiLHBsYXlVcmwpO1xcXFxuICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5jb3VudCA9PSBudWxsKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmNvdW50PTE7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGxldCB0ZXh0PScnO1xcXFxuICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRleHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXFxcXFxcImJvZHlcXFxcXFxcIikuaW5uZXJUZXh0O1xcXFxuICAgICAgICAgICAgICAgIH1jYXRjaCAoZSkge2ZiYS5sb2coZS5tZXNzYWdlKX1cXFxcbiAgICAgICAgICAgICAgICBpZigv6Kem5Y+R5LqG6Ziy55uX6ZO+fOacquaOiOadg3zmjqXlj6PpmLLnm5cvLnRlc3QodGV4dCkmJndpbmRvdy5jb3VudD09PTEpe1xcXFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXFxcXFwi5qOA5rWL5Yiw5pyJ5o6I5p2D77yM5byA5aeL6L+H5o6I5p2DXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICAvL2xvY2F0aW9uLnJlbG9hZCgpO1xcXFxuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmPWZiYS5nZXRWYXIoXFxcXFxcXCJfeDVqeFVybFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgd2luZG93LmNvdW50Kys7XFxcXG4gICAgICAgICAgICAgICAgLy8gZmJhLmxvZygnY291bnQ6Jyt3aW5kb3cuY291bnQrJyxtYXhfY291bnQ6JyttYXhfY291bnQpO1xcXFxuICAgICAgICAgICAgICAgIGlmKCB3aW5kb3cuY291bnQgPj0gbWF4X2NvdW50KXtcXFxcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFxcXFxcIui2hei/h1xcXFxcXFwiK21heF9jb3VudCoyNTArXFxcXFxcXCLmr6vnp5LmnKrojrflj5bliLDotYTmupDlnLDlnYDvvIzot7PliLDmupDnvZHpobUs5Lul5LiL5piv5Yqg6L296L+H55qE5Zyw5Z2AXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXFxcXFxcImJvZHlcXFxcXFxcIikuaW5uZXJUZXh0O1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmJhLmxvZyh0ZXh0KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfWNhdGNoIChlKSB7ZmJhLmxvZyhlLm1lc3NhZ2UpfVxcXFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKEpTT04uc3RyaW5naWZ5KF9nZXRVcmxzKCkpKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZiYS5nZXRWYXIoXFxcXFxcXCJfeDVqeFVybFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gbXV0ZU1lKGVsZW0pIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0ucGF1c2UoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIHZhciB2aWRlb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXFxcXFwidmlkZW9cXFxcXFxcIiksIGF1ZGlvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcXFxcXCJhdWRpb1xcXFxcXFwiKSwgdjIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXFxcXFwiZW1iZWRcXFxcXFxcIiksIHYzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFxcXFxcIiNwbGF5ZXJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHZpZGVvcywgZnVuY3Rpb24gKHZpZGVvKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRlTWUodmlkZW8pO1xcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcXFxuICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbChhdWRpb3MsIGZ1bmN0aW9uIChhdWRpbykge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKGF1ZGlvKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cXFxcbiAgICAgICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodjIsIGZ1bmN0aW9uICh2KSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRlTWUodik7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHYzLCBmdW5jdGlvbiAodikge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKHYpO1xcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcXFxuICAgICAgICAgICAgICAgIHZhciB1cmxzID0gX2dldFVybHMoKTtcXFxcbiAgICAgICAgICAgICAgICAvLyBmYmEubG9nKEpTT04uc3RyaW5naWZ5KHVybHMpKTtcXFxcbiAgICAgICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gdXJscykge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHU9dXJsc1tpXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeXt1PWRlY29kZVVSSUNvbXBvbmVudCh1KTt9Y2F0Y2goZSl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdT11bmVzY2FwZSh1KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZigvdXJsPWh0dHAvLnRlc3QodSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSB1LnNwbGl0KFxcXFxcXFwidXJsPVxcXFxcXFwiKS5zbGljZSgtMSlbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmJhLmxvZyhcXFxcXFxcInVybOWIhuWJsjpcXFxcXFxcIit1KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKC91cmw9XFxcXFxcXFwvLy50ZXN0KHUpJiYvXFxcXFxcXFwubTN1OC8udGVzdCh1KSl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvc3QgPSB1Lm1hdGNoKC8oLiopXFxcXFxcXFwvXFxcXFxcXFwvKC4qPylcXFxcXFxcXC8vKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gaG9zdCt1LnNwbGl0KFxcXFxcXFwidXJsPVxcXFxcXFwiKS5zbGljZSgtMSlbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmJhLmxvZyhcXFxcXFxcInVybOWIhuWJsjpcXFxcXFxcIit1KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoL3ZpZD1odHRwLy50ZXN0KHUpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gdS5zcGxpdChcXFxcXFxcInZpZD1cXFxcXFxcIikuc2xpY2UoLTEpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcXFxcXCJ2aWTliIblibI6XFxcXFxcXCIrdSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZigvdmlkPVxcXFxcXFxcLy8udGVzdCh1KSYmL1xcXFxcXFxcLm0zdTgvLnRlc3QodSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3N0ID0gdS5tYXRjaCgvKC4qKVxcXFxcXFxcL1xcXFxcXFxcLyguKj8pXFxcXFxcXFwvLylbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IGhvc3QrdS5zcGxpdChcXFxcXFxcInZpZD1cXFxcXFxcIikuc2xpY2UoLTEpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcXFxcXCJ2aWTliIblibI6XFxcXFxcXCIrdSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC9cXFxcXFxcXD8oLiopPWh0dHAvLnRlc3QodSkmJi9cXFxcXFxcXC5tM3U4Ly50ZXN0KHUpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gXFxcXFxcXCJodHRwXFxcXFxcXCIrdS5zcGxpdCgvXFxcXFxcXFw/KC4qKT1odHRwLykuc2xpY2UoLTEpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcXFxcXCLlhbbku5bliIblibI6XFxcXFxcXCIrdSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3xpbmRleFxcXFxcXFxcLm0zdTgkXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC9cXFxcXFxcXC8xXFxcXFxcXFwubTN1OC8udGVzdCh1KSl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1PXUucmVwbGFjZSgvJmZyb209Lip8Jm5leHQ9Lip8Jmp1bXA9LiovLCcnKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFsVXJsID0gaXNWaWRlbyh1LHJlY2hhbmdlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZihyZWFsVXJsKT09J3N0cmluZycmJiFpc0JhZFZpZGVvKHUpKXsvL+i/h+a7pOWQiuavm+inhumikVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZnlfYnJpZGdlX2FwcC5zZXRXZWJVYShQQ19VQSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mKGZiYS5nZXRIZWFkZXJVcmwpIT09J3VuZGVmaW5lZCcmJnR5cGVvZihyZWNoYW5nZSkhPT0nZnVuY3Rpb24nKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGJhY2tVcmwgPSBmYmEuZ2V0SGVhZGVyVXJsKHUucmVwbGFjZShcXFxcXFxcIjt7XFxcXFxcXCIsXFxcXFxcXCIjaXNWaWRlbz10cnVlIzt7XFxcXFxcXCIpKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tVcmwgPSBmYmEuZ2V0SGVhZGVyVXJsKHVybHNbaV0pLnJlcGxhY2UoJzt7JywnI2lnbm9yZUltZz10cnVlIyNpc1ZpZGVvPXRydWUjO3snKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHUxID0gYmFja1VybC5zcGxpdCgnI2lnbm9yZUltZycpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdTIgPSAnI2lnbm9yZUltZycrYmFja1VybC5zcGxpdCgnI2lnbm9yZUltZycpWzFdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IHUxLnJlcGxhY2UoLyZmcm9tPS4qfCZuZXh0PS4qfCZqdW1wPS4qLywnJyk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKC91cmw9aHR0cC8udGVzdCh1MSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEgPSB1MS5zcGxpdChcXFxcXFxcInVybD1cXFxcXFxcIikuc2xpY2UoLTEpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZigvdXJsPVxcXFxcXFxcLy8udGVzdCh1MSkmJi9cXFxcXFxcXC5tM3U4Ly50ZXN0KHUxKSl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdDEgPSB1MS5tYXRjaCgvKC4qKVxcXFxcXFxcL1xcXFxcXFxcLyguKj8pXFxcXFxcXFwvLylbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IGhvc3QxK3UxLnNwbGl0KFxcXFxcXFwidXJsPVxcXFxcXFwiKS5zbGljZSgtMSlbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYmEubG9nKFxcXFxcXFwidXJs5YiG5YmyOlxcXFxcXFwiK3UpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoL3ZpZD1odHRwLy50ZXN0KHUxKSl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IHUxLnNwbGl0KFxcXFxcXFwidmlkPVxcXFxcXFwiKS5zbGljZSgtMSlbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKC92aWQ9XFxcXFxcXFwvLy50ZXN0KHUxKSYmL1xcXFxcXFxcLm0zdTgvLnRlc3QodTEpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3N0MSA9IHUxLm1hdGNoKC8oLiopXFxcXFxcXFwvXFxcXFxcXFwvKC4qPylcXFxcXFxcXC8vKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxID0gaG9zdDErdTEuc3BsaXQoXFxcXFxcXCJ2aWQ9XFxcXFxcXCIpLnNsaWNlKC0xKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC9cXFxcXFxcXD8oLiopPWh0dHAvLnRlc3QodTEpJiYvXFxcXFxcXFwubTN1OC8udGVzdCh1MSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEgPSBcXFxcXFxcImh0dHBcXFxcXFxcIit1MS5zcGxpdCgvXFxcXFxcXFw/KC4qKT1odHRwLykuc2xpY2UoLTEpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tVcmwgPSB1MSArIHUyO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYmEubG9nKCfov5Tlm57oh6rliqjliqBjb29raWXpk77mjqU6JytiYWNrVXJsKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZygn6L+U5Zue6ZO+5o6lOicrdSsn5bm26Ieq5Yqo5Yqg5LqGY29va2llLOWFt+S9k2Nvb2tpZeWcqOinhumikeaSreaUvuWkhOafpeeciycpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFja1VybDtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFxcXFxcIui/lOWbnuS7k+W6k3g15YWN5ZeF57uT5p6cOlxcXFxcXFwiK3JlYWxVcmwpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbFVybFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH1jYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSlcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICAvLyBmeV9icmlkZ2VfYXBwLmxvZygneDXlpKfojIPlm7TplJnor686JytlLm1lc3NhZ2UpO1xcXFxuICAgICAgICAgICAgICAgIGFsZXJ0KCd4NeWkp+iMg+WbtOmUmeivrzonK2UubWVzc2FnZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+aKpemUmee7k+adn3g1J1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9LGlzVmlkZW8scmVjaGFuZ2UscGxheVVybCxtYXhfY291bnQsUENfVUEsaXNCYWRWaWRlbyk7XFxcXG4gICAgICAgIGxldCB1c2VXZWI9bHNnLmdldEl0ZW0oXFxcXFxcXCLpgJrlhY1cXFxcXFxcIixcXFxcXFxcIlg1XFxcXFxcXCIpPT09XFxcXFxcXCJXRUJcXFxcXFxcIjtcXFxcbiAgICAgICAgLy9sb2coXFxcXFxcXCLku5PlupPkvb/nlKh3ZWLpgJrlhY3mm7/ku6N4NTpcXFxcXFxcIit1c2VXZWIpO1xcXFxuICAgICAgICBsZXQgcnVsZUhlYWQ9dXNlV2ViJiZwYXJzZUludChnZXRBcHBWZXJzaW9uKCkpPj0yMzM5P1xcXFxcXFwid2ViUnVsZTovL1xcXFxcXFwiOlxcXFxcXFwieDVSdWxlOi8vXFxcXFxcXCI7XFxcXG4gICAgICAgIGxldCB4NVVybCA9IHJ1bGVIZWFkK3BsYXlVcmwrICdAJyArX3g1O1xcXFxuICAgICAgICByZXR1cm4geDVVcmxcXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHg1UGFyc2VQcm8oeDVsaXN0LHg1VGltZW91dCxpc1ZpZGVvKXtcXFxcbiAgICBsZXQgYnBhdGggPSAnZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvcnVsZXMvZHpIb3VzZS9odG1sL+a1t+mYlOWXheaOouWZqC5odG1sJztcXFxcbiAgICBsZXQgYmNvZGUgPSBmZXRjaChicGF0aCk7XFxcXG4gICAgaWYoIWJjb2RlfHwhL2Z5X2JyaWRnZV9hcHAvLnRlc3QoYmNvZGUpKXtcXFxcbiAgICAgICAgbG9nKCfmnKzlnLDmnKrlronoo4Xll4XmjqLlmajvvIzlvIDlp4vlronoo4UnKTtcXFxcbiAgICAgICAgY29uc3Qge2FwaX0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgaHRtbCA9IGZldGNoKGFwaS5ob3N0KycvcnVsZWxpc3QuanNvbj9pZD0yMDU1Jyk7XFxcXG4gICAgICAgIGlmKC/mtbfpmJTop4bnlYwvLnRlc3QoaHRtbCkpe1xcXFxuICAgICAgICAgICAgd3JpdGVGaWxlKGJwYXRoLGh0bWwpO1xcXFxuICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZShicGF0aCxmZXRjaCgnaHR0cHM6Ly9oamRobnguY29kaW5nLm5ldC9wL2hpa2VyL2QvZHIvZ2l0L3Jhdy9tYXN0ZXIvaHRtbC9nZXRWaWRlby5odG1sJykpXFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgeDVUaW1lb3V0ID0gcGFyc2VJbnQoeDVUaW1lb3V0KXx8NTAwMDtcXFxcbiAgICBsZXQgbWF4X2NvdW50PSh4NVRpbWVvdXQvMjUwKTsgLy/moLnmja7otoXml7boh6rliqjorqHnrpfkuoblj6/miafooYznmoTmrKHmlbBcXFxcbiAgICBwdXRWYXIoJ3g1TGlzdCcsSlNPTi5zdHJpbmdpZnkoeDVsaXN0KSk7XFxcXG4gICAgbGV0IF94NSA9ICQudG9TdHJpbmcoKGlzVmlkZW8sIG1heF9jb3VudCx4NVRpbWVvdXQsaXNCYWRWaWRlbykgPT4ge1xcXFxuICAgICAgICAvL+WIneWni+WMlmZiYeWSjHJlcXVzdFxcXFxuICAgICAgICBpZiAodHlwZW9mIChmYmEpID09ICd1bmRlZmluZWQnIHx8ICFmYmEpIHtcXFxcbiAgICAgICAgICAgIHZhciBmYmEgPSBmeV9icmlkZ2VfYXBwO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBpZiAodHlwZW9mIChyZXF1ZXN0KSA9PSAndW5kZWZpbmVkJyB8fCAhcmVxdWVzdCkge1xcXFxuICAgICAgICAgICAgICAgIGV2YWwoZmJhLmdldEludGVybmFsSnMoKSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLVxcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgaWYgKHdpbmRvdy5jb3VudCA9PSBudWxsKSB7XFxcXG4gICAgICAgICAgICAgICAgd2luZG93LmNvdW50ID0gMTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGxldCB0ZXh0PScnO1xcXFxuICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICB0ZXh0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXFxcXFxcXCJib2R5XFxcXFxcXCIpLmlubmVyVGV4dDtcXFxcbiAgICAgICAgICAgIH1jYXRjaCAoZSkge2ZiYS5sb2coZS5tZXNzYWdlKX1cXFxcbiAgICAgICAgICAgIGlmKC/op6blj5HkuobpmLLnm5fpk7585pyq5o6I5p2DfOaOpeWPo+mYsuebly8udGVzdCh0ZXh0KSYmd2luZG93LmNvdW50PT0xKXtcXFxcbiAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcXFxcbiAgICAgICAgICAgICAgICBmYmEubG9nKFxcXFxcXFwi5qOA5rWL5Yiw5pyJ5o6I5p2D77yM5byA5aeL6L+H5o6I5p2DXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgd2luZG93LmNvdW50Kys7XFxcXG4gICAgICAgICAgICAvLyBmYmEubG9nKCdjb3VudDonICsgd2luZG93LmNvdW50ICsgJyxtYXhfY291bnQ6JyArIG1heF9jb3VudCk7XFxcXG4gICAgICAgICAgICBpZiAod2luZG93LmNvdW50ID49IG1heF9jb3VudCkge1xcXFxuICAgICAgICAgICAgICAgIGZiYS5jbGVhclZhcigneDVMaXN0Jyk7XFxcXG4gICAgICAgICAgICAgICAgZmJhLmhpZGVMb2FkaW5nKCk7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGZtc2cgPSAn6YGT6ZW/5LuT5bqT6YCa5YWN6Kej5p6Q5aSx6LSlLOWOn+WboDrotoXml7YnK3g1VGltZW91dCsn5q+r56eSJztcXFxcbiAgICAgICAgICAgICAgICBmYmEubG9nKGZtc2cpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK2Ztc2c7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1jYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpO1xcXFxuICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgZnVuY3Rpb24gbXV0ZU1lKGVsZW0pIHtcXFxcbiAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgZWxlbS5wYXVzZSgpO1xcXFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgdmFyIHZpZGVvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcXFxcXCJ2aWRlb1xcXFxcXFwiKSwgYXVkaW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFxcXFxcImF1ZGlvXFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgdjIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXFxcXFwiZW1iZWRcXFxcXFxcIiksIHYzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFxcXFxcIiNwbGF5ZXJcXFxcXFxcIik7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodmlkZW9zLCBmdW5jdGlvbiAodmlkZW8pIHtcXFxcbiAgICAgICAgICAgICAgICBtdXRlTWUodmlkZW8pO1xcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKGF1ZGlvcywgZnVuY3Rpb24gKGF1ZGlvKSB7XFxcXG4gICAgICAgICAgICAgICAgbXV0ZU1lKGF1ZGlvKTtcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2MiwgZnVuY3Rpb24gKHYpIHtcXFxcbiAgICAgICAgICAgICAgICBtdXRlTWUodik7XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodjMsIGZ1bmN0aW9uICh2KSB7XFxcXG4gICAgICAgICAgICAgICAgbXV0ZU1lKHYpO1xcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB2YXIgdXJscyA9IF9nZXRVcmxzKCk7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBmb3IgKGxldCBpIGluIHVybHMpIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdT11cmxzW2ldO1xcXFxuICAgICAgICAgICAgICAgIC8vdT1kZWNvZGVVUklDb21wb25lbnQodSk7XFxcXG4gICAgICAgICAgICAgICAgdHJ5e3U9ZGVjb2RlVVJJQ29tcG9uZW50KHUpO31jYXRjaChlKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgdT11bmVzY2FwZSh1KTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgaWYoL3VybD1odHRwLy50ZXN0KHUpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgdSA9IHUuc3BsaXQoXFxcXFxcXCJ1cmw9XFxcXFxcXCIpLnNsaWNlKC0xKVswXTtcXFxcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZigvdmlkPWh0dHAvLnRlc3QodSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICB1ID0gdS5zcGxpdChcXFxcXFxcInZpZD1cXFxcXFxcIikuc2xpY2UoLTEpWzBdO1xcXFxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKC9cXFxcXFxcXD8oLiopPWh0dHAvLnRlc3QodSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICB1ID0gXFxcXFxcXCJodHRwXFxcXFxcXCIrdS5zcGxpdCgvXFxcXFxcXFw/KC4qKT1odHRwLykuc2xpY2UoLTEpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAvL2ZiYS5sb2coXFxcXFxcXCLlhbbku5bliIblibI6XFxcXFxcXCIrdSk7XFxcXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoL1xcXFxcXFxcLzFcXFxcXFxcXC5tM3U4JC8udGVzdCh1KSl7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB1PXUucmVwbGFjZSgvJmZyb209Lip8Jm5leHQ9Lip8Jmp1bXA9LiovLCcnKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcmVhbFVybCA9IGlzVmlkZW8odSk7XFxcXG4gICAgICAgICAgICAgICAgaWYgKHJlYWxVcmwmJiFpc0JhZFZpZGVvKHUpKSB7Ly/ov4fmu6TlkIrmr5tcXFxcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFxcXFxcIuS7k+W6k3g15YWN5ZeF57uT5p6cOlxcXFxcXFwiICsgcmVhbFVybCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5jbGVhclZhcigneDVMaXN0Jyk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsVXJsXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSlcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sIGlzVmlkZW8sIG1heF9jb3VudCx4NVRpbWVvdXQsaXNCYWRWaWRlbyk7XFxcXG4gICAgY29uc3QgbHNnPSQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9sb2NhbFN0b3JhZ2U/cnVsZT3pgZPplb/ku5PlupNQcm9cXFxcXFxcIik7XFxcXG4gICAgbGV0IHVzZVdlYj1sc2cuZ2V0SXRlbShcXFxcXFxcIumAmuWFjVxcXFxcXFwiLFxcXFxcXFwiWDVcXFxcXFxcIik9PT1cXFxcXFxcIldFQlxcXFxcXFwiO1xcXFxuICAgIC8vbG9nKFxcXFxcXFwi5LuT5bqT5L2/55Sod2Vi6YCa5YWN5pu/5LujeDU6XFxcXFxcXCIrdXNlV2ViKTtcXFxcbiAgICBsZXQgcnVsZUhlYWQ9dXNlV2ViJiZwYXJzZUludChnZXRBcHBWZXJzaW9uKCkpPj0yMzM5P1xcXFxcXFwid2ViUnVsZTovL1xcXFxcXFwiOlxcXFxcXFwieDVSdWxlOi8vXFxcXFxcXCI7XFxcXG4gICAgcmV0dXJuIHJ1bGVIZWFkK2JwYXRoKydAJyArIF94NTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gTGF6eVBhcnNlRmFzdChwbGF5VXJsTGlzdCxnZXRUaW1lb3V0LHg1VGltZW91dCl7XFxcXG4gICAgY29uc3Qge2lzVmlkZW8sZ2V0SGVhZGVycyx4NVBhcnNlUHJvfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2dsb2JhbFBhcnNlP3J1bGU96YGT6ZW/5LuT5bqTUHJvJyk7XFxcXG4gICAgLy8gbG9nKCflvIDlp4vmiafooYwnK3BsYXlVcmxMaXN0Lmxlbmd0aCsn5Liq5Zyw5Z2A55qE5om56YeP5ZeF5o6iOicrcGxheVVybExpc3QpO1xcXFxuICAgIGxvZygn5byA5aeL5omn6KGMJytwbGF5VXJsTGlzdC5sZW5ndGgrJ+S4quWcsOWdgOeahOaJuemHj+WXheaOoicpO1xcXFxuICAgIGxldCBwbGF5VXJscyA9IHBsYXlVcmxMaXN0Lm1hcCgoaXQpPT57XFxcXG4gICAgICAgIHJldHVybiB7XFxcXG4gICAgICAgICAgICB1cmw6aXQuc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpWzBdLFxcXFxuICAgICAgICAgICAgb3B0aW9uczoge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgLy9cXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjogXFxcXFxcXCJEYXJ0LzIuMTMgKGRhcnQ6aW8pXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOlxcXFxcXFwiTW96aWxsYS81LjBcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgdGltZW91dDogZ2V0VGltZW91dFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgbGV0IGJodG1sID0gYmF0Y2hGZXRjaChwbGF5VXJscyk7XFxcXG4gICAgbGV0IHZpZGVvcyA9IFtdO1xcXFxuICAgIGxldCB4NWxpc3QgPSBbXTtcXFxcbiAgICBmb3IobGV0IGkgaW4gYmh0bWwpe1xcXFxuICAgICAgICBsZXQgb3JkZXIgPSBwYXJzZUludChpKSsxO1xcXFxuICAgICAgICBsZXQgdG5hbWU9b3JkZXIrJ+WPt+ino+aekOe9keWdgDonO1xcXFxuICAgICAgICAvL2xvZyh0bmFtZSk7XFxcXG4gICAgICAgIGxldCB0dXJsPXBsYXlVcmxMaXN0W2ldLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKVswXTtcXFxcbiAgICAgICAgbGV0IGpuYW1lPXBsYXlVcmxMaXN0W2ldLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKS5sZW5ndGg+MT9wbGF5VXJsTGlzdFtpXS5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIilbMV06XFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgdG5hbWUrPWpuYW1lO1xcXFxuICAgICAgICBsZXQgYmFja2NvZGUgPSBiaHRtbFtpXTtcXFxcbiAgICAgICAgaWYoKCEvdXJsfGh0dHAvLnRlc3QoYmFja2NvZGUpKSYmKCEvI0VYVElORi8udGVzdChiYWNrY29kZSkpKXtcXFxcbiAgICAgICAgICAgIGxvZyh0bmFtZSt0dXJsKyfmnInpl67popgs5Y+v6IO95Yqg5a+G5oiW6ICF5oyC5LqGJyk7XFxcXG4gICAgICAgICAgICBjb250aW51ZTtcXFxcbiAgICAgICAgfWVsc2UgaWYoLyNFWFRJTkYvLnRlc3QoYmFja2NvZGUpKXtcXFxcbiAgICAgICAgICAgIC8vbGV0IGxjYWNoZT1cXFxcXFxcIi9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvY2FjaGUvdmlkZW9fXFxcXFxcXCIrdG5hbWUrXFxcXFxcXCIubTN1OFxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgLy93cml0ZUZpbGUobGNhY2hlLGJhY2tjb2RlKTtcXFxcbiAgICAgICAgICAgIC8vdmlkZW9zLnB1c2gobGNhY2hlKTtcXFxcbiAgICAgICAgICAgIGxldCBwVXJsPWNhY2hlTTN1OCh0dXJsKTtcXFxcbiAgICAgICAgICAgIHZpZGVvcy5wdXNoKHBVcmwpO1xcXFxuICAgICAgICAgICAgY29udGludWU7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCB1cmwgPSBKU09OLnBhcnNlKGJhY2tjb2RlKS51cmw7XFxcXG4gICAgICAgICAgICBpZigvXmh0dHAvLnRlc3QodXJsKSl7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJlYWxWaWRlbyA9IGlzVmlkZW8odXJsKTtcXFxcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YocmVhbFZpZGVvKT09J3N0cmluZycpe1xcXFxuICAgICAgICAgICAgICAgICAgICBsb2codG5hbWUrJ+W3suino+aekOWHuuinhumikTonK3JlYWxWaWRlbyk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmKGpuYW1lKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxWaWRlbys9XFxcXFxcXCLimIVcXFxcXFxcIitqbmFtZVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvcy5wdXNoKHJlYWxWaWRlbyk7XFxcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxvZyh0bmFtZSsn6Kej5p6Q5Ye65LiN55+l6YGT5LuA5LmI5Lic6KW/OicrdXJsKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsKz1cXFxcXFxcIiNpc1ZpZGVvPXRydWUjXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmKGpuYW1lKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCs9XFxcXFxcXCLimIVcXFxcXFxcIitqbmFtZVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvcy5wdXNoKHVybCk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICAgICAgbG9nKHRuYW1lKyfkuLpqc29u5o6l5Y+j5LiU5peg6L+U5Zue6KeG6aKR5Zyw5Z2A5pWw5o2uOicrcGxheVVybExpc3RbaV0rJ1xcXFxcXFxcbicrYmFja2NvZGUpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIGxvZyh0bmFtZSsn5Li6eDXmjqXlj6Ms5Yqg5YWleDXll4XmjqLliJfooagnKTtcXFxcbiAgICAgICAgICAgIHg1bGlzdC5wdXNoKHBsYXlVcmxMaXN0W2ldKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICAvLyBsb2codmlkZW9zKTtcXFxcbiAgICBpZih2aWRlb3MubGVuZ3RoPjApe1xcXFxuICAgICAgICBpZihnZXRWYXIoJ2RwLmNhY2hlVmlkZW8nLCd0cnVlJyk9PT0ndHJ1ZScmJnBhcnNlSW50KGdldEFwcFZlcnNpb24oKSk+PTIyNTUpXFxcXG4gICAgICAgIHtcXFxcbiAgICAgICAgICAgIGxvZyhcXFxcXFxcIuWwiuaVrOeahOmtlOaWreeUqOaIt++8jOinhumikee8k+WtmOW3suWQr+eUqO+8jOivt+WwveaDheS6q+WPl+eci+WJp+aXtuWFiVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGxldCB2aWRlb3NDYWNoZT12aWRlb3MubWFwKChpdCk9PntcXFxcbiAgICAgICAgICAgICAgICBsZXQgaGVhZGVycz17fTtcXFxcbiAgICAgICAgICAgICAgICBpZihpdC5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIikubGVuZ3RoPjEpe1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgaGVhZCA9IGl0LnNwbGl0KCc7JylbMV07XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmKC9ALy50ZXN0KGhlYWQpJiYve3x9Ly50ZXN0KGhlYWQpKXtcXFxcbi8vaGVhZCA9IGhlYWQucmVwbGFjZSgve3x9L2csJycpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCA9IGhlYWQuc3BsaXQoXFxcXFxcXCJ7XFxcXFxcXCIpWzFdLnNwbGl0KFxcXFxcXFwifVxcXFxcXFwiKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQgPSBoZWFkLnNwbGl0KCcmJicpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIGhlYWQpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSBoZWFkW2ldLnNwbGl0KCdAJylbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID1oZWFkW2ldLnNwbGl0KCdAJylbMV0ucmVwbGFjZSgvOy8sJzsnKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzW2tleV0gPSB2YWx1ZTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6aXQuc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpWzBdLnNwbGl0KFxcXFxcXFwi4piFXFxcXFxcXCIpWzBdLFxcXFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOntcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6aGVhZGVyc1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICB2YXIgZGF0YT1iYXRjaENhY2hlTTN1OCh2aWRlb3NDYWNoZSk7XFxcXG4gICAgICAgICAgICBkYXRhPWRhdGEubWFwKChpdCxpZCk9PntcXFxcbiAgICAgICAgICAgICAgICBsZXQgZXh0cmE9XFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICBpZih2aWRlb3NbaWRdLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKS5sZW5ndGg+MSl7XFxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhPVxcXFxcXFwiO1xcXFxcXFwiK3ZpZGVvc1tpZF0uc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpWzFdO1xcXFxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKHZpZGVvc1tpZF0uc3BsaXQoXFxcXFxcXCLimIVcXFxcXFxcIikubGVuZ3RoPjEpe1xcXFxuICAgICAgICAgICAgICAgICAgICBleHRyYT1cXFxcXFxcIuKYhVxcXFxcXFwiK3ZpZGVvc1tpZF0uc3BsaXQoXFxcXFxcXCLimIVcXFxcXFxcIilbMV07XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgICAgICAgICAgaWYoaXQrXFxcXFxcXCJcXFxcXFxcIiE9XFxcXFxcXCJudWxsXFxcXFxcXCIpe1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQrZXh0cmFcXFxcbiAgICAgICAgICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpZGVvc1tpZF1cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIC8vbG9nKGRhdGEpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIGRhdGFcXFxcbiAgICAgICAgICAgIC8vcmV0dXJuIHZpZGVvc1xcXFxuICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgIHJldHVybiB2aWRlb3NcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBsb2coJ+WFseaciScreDVsaXN0Lmxlbmd0aCsn5LiqeDXlnLDlnYDov5vooYzova7mtYHll4XmjqInKTtcXFxcbiAgICAvL+ayoeacieeahOivneWwseW8gOWni+S+neasoXg15ZeF5o6iXFxcXG4gICAgc2hvd0xvYWRpbmcoJ+WXheaOouS4re+8jOiLpeWksei0peWwseWIh+aNondlYuWXheaOoi4uLicpO1xcXFxuICAgIHJldHVybiB4NVBhcnNlUHJvKHg1bGlzdCx4NVRpbWVvdXQsaXNWaWRlbyk7XFxcXG59XFxcXG52YXIgbGF6eT0kKCcnKS5sYXp5UnVsZSgoKT0+e1xcXFxuICAgIHRyeXtcXFxcbiAgICAgICAgcmVhbFVybD1pbnB1dDtcXFxcbiAgICAgICAgZXZhbChcXFxcXFxcInZhciBjb25maWdfZHAgPVxcXFxcXFwiICsgZmV0Y2goXFxcXFxcXCJoaWtlcjovL2ZpbGVzL2NhY2hlL015UGFyc2VTZXQuanNvblxcXFxcXFwiKSk7XFxcXG4gICAgICAgIGV2YWwoZmV0Y2goY29uZmlnX2RwLmNqKSk7XFxcXG4gICAgICAgIGxvZyhpbnB1dCsnLT7mraPlnKjmlq3mj5LprZTmlLnniYjop6PmnpAuLi4nKTtcXFxcbiAgICAgICAgLy8g5Yqg5YWl6LaF5pe26K6+572u77yM5bu66K6u5Zyo6aaW6aG16K6+572uXFxcXG4gICAgICAgIHJldHVybiBheXRtUGFyc2UocmVhbFVybClcXFxcbiAgICB9Y2F0Y2goZSl7XFxcXG4gICAgICAgIHJldHVybiBpbnB1dFxcXFxuICAgIH1cXFxcbn0pO1xcXFxuJC5leHBvcnRzLmlzUGljPWlzUGljO1xcXFxuJC5leHBvcnRzLmlzVmlkZW89aXNWaWRlbztcXFxcbiQuZXhwb3J0cy5pc0JhZFZpZGVvPWlzQmFkVmlkZW87XFxcXG4kLmV4cG9ydHMuY29tUGFyc2U9Y29tUGFyc2U7XFxcXG4kLmV4cG9ydHMuZ2V0SGVhZGVycz1nZXRIZWFkZXJzO1xcXFxuJC5leHBvcnRzLmxhenlQYXJzZT1sYXp5UGFyc2U7XFxcXG4kLmV4cG9ydHMueDVQYXJzZVBybz14NVBhcnNlUHJvO1xcXFxuJC5leHBvcnRzLkxhenlQYXJzZUZhc3Q9TGF6eVBhcnNlRmFzdDtcXFxcbiQuZXhwb3J0cy5sYXp5PWxhenk7XFxcIn0se1xcXCJuYW1lXFxcIjpcXFwi5Lu75Yqh5LuT5bqT5o6l5Y+jXFxcIixcXFwicGF0aFxcXCI6XFxcInRhc2tDYWxsXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuU3RyaW5nLnByb3RvdHlwZS5zdHJpcCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMucmVwbGFjZSgvKF5cXFxcXFxcXHMqKXwoXFxcXFxcXFxzKiQpL2csIFxcXFxcXFwiXFxcXFxcXCIpOyB9O1xcXFxuZnVuY3Rpb24gdGFza19yZXEodGFza19hcGksdGFzaykgeyAvLyDpgJrnlKjlj5HpgIHku5PlupNwb3N06LCD55So5Lu75Yqh6K+35rGCXFxcXG4gICAgY29uc3Qge2dldEZpbGV9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXFxcXFwiKTtcXFxcbiAgICBsZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxcXG4gICAgaWYoIWhvdXNlRmlsZSl7XFxcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcXFxuICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KHRhc2tfYXBpLCB7XFxcXG4gICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXFxcbiAgICAgICAgfSxcXFxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcXFxuICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwiZGF0YVxcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwidHlwZVxcXFxcXFwiOiB0YXNrLm1vZGV8fCdydW4nLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcImZ1bmNcXFxcXFxcIjogdGFzay5mdW5jfHwnJyxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjogdGFzay5wYXJhbXN8fFtdXFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcImF1dGhcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogaG91c2VfZGF0YS51c2VybmFtZXx8XFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiOiBob3VzZV9kYXRhLnBhc3N3b3JkfHxcXFxcXFxcIlxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCdcXFxcbiAgICB9KTtcXFxcbiAgICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gdGFza191cGxvYWQodGFzayl7IC8vIOmAmueUqOS7u+WKoeWPkeW4g+aWsOWinuWPiuS/ruaUueWKn+iDvVxcXFxuICAgIGNvbnN0IHthcGksZ2V0RmlsZX0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcXFxcXCIpO1xcXFxuICAgIGxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXFxcbiAgICBpZighaG91c2VGaWxlKXtcXFxcbiAgICAgICAgc2V0SXRlbSgnaXNfaG91c2VfdmlwJywgJ2ZhbHNlJyk7XFxcXG4gICAgfVxcXFxuICAgIGxldCBhcGlfdXJsID0gYXBpLmhvc3QrJy9oaWtlcnVsZS90YXNrL2FkZCc7XFxcXG4gICAgbGV0IGhvdXNlX2RhdGEgPSBob3VzZUZpbGUoKTtcXFxcbiAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChhcGlfdXJsLCB7XFxcXG4gICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXFxcbiAgICAgICAgfSxcXFxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcXFxuICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwiZGF0YVxcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiB0YXNrLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicHljb2RlXFxcXFxcXCI6IHRhc2sucHljb2RlLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIm5vdGVcXFxcXFxcIjogdGFzay5ub3RlLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInRlc3RfY29kZVxcXFxcXFwiOiB0YXNrLnRlc3RfY29kZSxcXFxcbiAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwiYXV0aFxcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBob3VzZV9kYXRhLnVzZXJuYW1lfHxcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCI6IGhvdXNlX2RhdGEucGFzc3dvcmR8fFxcXFxcXFwiXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcXFxuICAgIH0pO1xcXFxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiB0YXNrX2NhbGwoaWQsZnVuYyxwYXJhbXMpe1xcXFxuICAgIGNvbnN0IHthcGl9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXFxcXFwiKTtcXFxcbiAgICBsZXQgdGFza19hcGkgPSBhcGkuaG9zdCsnL2hpa2VydWxlL3Rhc2svcnVuLycraWQ7XFxcXG4gICAgbGV0IHRhc2sgPSB7XFxcXG4gICAgICAgIG1vZGU6J2NhbGwnLFxcXFxuICAgICAgICBmdW5jOmZ1bmMsXFxcXG4gICAgICAgIHBhcmFtczpwYXJhbXN8fFtdXFxcXG4gICAgfTtcXFxcbiAgICByZXR1cm4gdGFza19yZXEodGFza19hcGksdGFzayk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHRhc2tfcmVuYW1lKGlkLG5ld190YXNrX25hbWUpe1xcXFxuICAgIGNvbnN0IHthcGksZ2V0RmlsZX0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcXFxcXCIpO1xcXFxuICAgIGxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXFxcbiAgICBpZighaG91c2VGaWxlKXtcXFxcbiAgICAgICAgc2V0SXRlbSgnaXNfaG91c2VfdmlwJywgJ2ZhbHNlJyk7XFxcXG4gICAgfVxcXFxuICAgIGxldCBob3VzZV9kYXRhID0gaG91c2VGaWxlKCk7XFxcXG4gICAgbGV0IHRhc2tfYXBpID0gYXBpLmhvc3QrJy9oaWtlcnVsZS90YXNrL3JlbmFtZS8nK2lkO1xcXFxuICAgIHRhc2tfYXBpID0gdGFza19hcGkrJz9uYW1lPScraG91c2VfZGF0YS51c2VybmFtZSsnJnBhc3N3b3JkPScraG91c2VfZGF0YS5wYXNzd29yZCsnJnRhc2tfbmFtZT0nK25ld190YXNrX25hbWU7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UoZmV0Y2godGFza19hcGkse30pKTtcXFxcbiAgICAgICAgaWYocmVzdWx0LnN0YXR1cz09MCl7XFxcXG4gICAgICAgICAgICByZXR1cm4gIHJlc3VsdC5kZXRhaWxcXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCsnJytyZXN1bHQuZGV0YWlsXFxcXG4gICAgICAgIH1cXFxcbiAgICB9Y2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxcXG4gICAgICAgIHJldHVybiAnJytlLm1lc3NhZ2VcXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHRhc2tfY2hhbmdlX3N0YXRlKGlkKXtcXFxcbiAgICBjb25zdCB7YXBpLGdldEZpbGV9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXFxcXFwiKTtcXFxcbiAgICBsZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxcXG4gICAgaWYoIWhvdXNlRmlsZSl7XFxcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcXFxuICAgIGxldCB0YXNrX2FwaSA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9jaGFuZ2Vfc3RhdGUvJytpZDtcXFxcbiAgICB0YXNrX2FwaSA9IHRhc2tfYXBpKyc/bmFtZT0nK2hvdXNlX2RhdGEudXNlcm5hbWUrJyZwYXNzd29yZD0nK2hvdXNlX2RhdGEucGFzc3dvcmQ7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UoZmV0Y2godGFza19hcGkse30pKTtcXFxcbiAgICAgICAgaWYocmVzdWx0LnN0YXR1cz09MCl7XFxcXG4gICAgICAgICAgICByZXR1cm4gIHJlc3VsdC5kZXRhaWxcXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCsnJytyZXN1bHQuZGV0YWlsXFxcXG4gICAgICAgIH1cXFxcbiAgICB9Y2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxcXG4gICAgICAgIHJldHVybiAnJytlLm1lc3NhZ2VcXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHRhc2tfcnVuKGlkKXtcXFxcbiAgICBjb25zdCB7YXBpfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFxcXFxcIik7XFxcXG4gICAgbGV0IHRhc2tfYXBpID0gYXBpLmhvc3QrJy9oaWtlcnVsZS90YXNrL3J1bi8nK2lkO1xcXFxuICAgIGxldCB0YXNrID0ge307XFxcXG4gICAgcmV0dXJuIHRhc2tfcmVxKHRhc2tfYXBpLHRhc2spO1xcXFxufVxcXFxuXFxcXG4kLmV4cG9ydHMudGFza0NhbGwgPSB0YXNrX2NhbGw7XFxcXG4kLmV4cG9ydHMudGFza1J1biA9IHRhc2tfcnVuO1xcXFxuJC5leHBvcnRzLnRhc2tSZXEgPSB0YXNrX3JlcTtcXFxcbiQuZXhwb3J0cy50YXNrVXBsb2FkID0gdGFza191cGxvYWQ7XFxcXG4kLmV4cG9ydHMudGFza1JlbmFtZSA9IHRhc2tfcmVuYW1lO1xcXFxuJC5leHBvcnRzLnRhc2tDaGFuZ2VTdGF0ZSA9IHRhc2tfY2hhbmdlX3N0YXRlO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuWFqOWxgOWCqOWtmFxcXCIsXFxcInBhdGhcXFwiOlxcXCJsb2NhbFN0b3JhZ2VcXFwiLFxcXCJydWxlXFxcIjpcXFwibGV0IGxvY2FsU3RvcmFnZSA9IChmdW5jdGlvbigpIHtcXFxcbiAgICBldmFsUHJpdmF0ZUpTKFxcXFxcXFwiandVS3dOVGlQR2NXU0xDWEI1WHRBWHdiNkxRYlZ5SEQrMFhKN2wwN2NlMD1cXFxcXFxcIik7XFxcXG4gICAgLy9wYXRodG89dW5kZWZpbmVkO1xcXFxuICAgIGV2YWxQcml2YXRlSlMoXFxcXFxcXCI0QzBZeFJZbkdDWWtnRlJYdHBsL0N6NXpMNWhoNGpDQ3p0YituZytXb2t5bVE4b1VyelM5bEE4eXhDNWFGYWRuU0VteUhLTWJyYWZsUnFYQ25OUkhEbGs2dWU4eUhUTzE2bEJQcnB3Z3M1amYwUGhyQXRvVEpJRTBaSG45bUthUTRKZDJlcnFiNEk1NWJlV0lldWdLc0RzMjExU3pJTlE1eUpnU2gxZFZ1Tnp6eFJHSmc0MEZtVHVWbVhWZk4xeGcyV0lHSEJFbWtWbkd4bU9SaFBPTkErUTVWd1BtZHA0MS9oemUzZUlzVXZobzdWQ0JnSzRyYUptUGFsSVJCQlZsQ1ZnbjhGa1dtZktxWm8rVlcrb0JjSDdocmNyc1NsQ1NqQmFuZ1QvN3N5V0h4S1loZWhVMGthTVlqbldGZzFFbTBjbU5SdG9tQ3NIejFCOHEzMk9lUUhvYXdkV3h6S09hTUhPWERCalJvakE4RS9haDBXUk95emlxUlN4bC9tOGRoQmQwZjlwaFl6LzVTVS96SkQ1MlgvOUVDMTZXVlZkcFNXMzNha1JIUnNsUHBSbFRXRjkrQXlSbVJ3MGVaT0VzMW85UU1QQVFVZkF4Yll5RkhnenR3L08yZEpScEh5VG1pQmlhYXFUY2l2eDZ2OXp5dkJ6MDR3STFBYVNDdWkrZFR1VTNsdTV4ZEV0M0FqdDZaM2lEWE9WY0VQMEVERjc0NzRQUVU2SkVadXdlOTdTY2g0Ymkxd0IxWEhaU2ZJdGRsWVlvR2VkM0xMcGJtREFJUmNpdjByQW9wOFZtUWNUdDJLM0xmaDFSRFlZMFl0dlJjSDQ5T3ZwRFJIL3hhNUZjOE1ZM0RyRm9BN3Fjb0Y0ZUNnaVZCZkJnSlI2OCtMcFFLN3RPa2c4azllYyszTlN4SlRoY2w4ZDZ5Tnd4VDlUazE3emVKZ2Q2TW95WVpJcFdRTGxGNll2Yk9kRVdoam1uQTc4d0MwaFd6K1htNmhRTVNxdEZ3K2JoRmY3Y0JHVTNhYXRQRm1kQ1kyRWRYZmgwSVlXODV3ZE95TWZpd1c3L3ZWVHA5aUUwMEkzRjA5d0dIa0dLaFZiTHVlQWtZZTd6ekpYUjd0aGFGb3I2SDdxTG1KamJSUWs5ZXZOdEJRWE5SN0RpZmlYdVFmMmx0N25PSDgwU1dtMWZESEh6am1Qc05JcHMyVFhHVCtpd1ZWNjlnL3RXaXBWUTZEOEJUeCtjQ1FwNDdubVRJclkrcU40a2gyRlloNUxsd1hkZ0l5eTFWSXVDM3gwNTNld0FJSVVtbFk5bmlFcHFZdCsxZkZQWE9DdENHdFliU2QzN3ZWUjFFT2oyazVHdS8rOUpXZzJxdndsMXR3ZWxnMUowdHhhcklpNGtUYlRydnJuRkxOOTJwb2ZwWlFVZm9XbzRjZTdIV05kYnU0SktFcmFMUVVmZGZHRVBkMVRJdWZ1dVJWYTM5ZXE5R1p5U0R1Qkw2ME1QZGxkeEt3MXpvK2ZCNVpZK1lNajNMTDJnR3REYnM5OCtBc1JWOUxKV21VbXN4OTFobUp0RlVNV0QzeG5qOEhNWldzME5QbENGVXI5NDg1S3FUcG81a1J6R2ZGK2svTmwySnpydjVjdmtxdFVuTGdLcFhFT2ovc2Uvb0R6T0FyUUtJNVROVWJ2WXdjd2NkampNU2ZqSzY4S3J3aHMrbjZTbVdaNFpkZ1JIZ0FLNU1vRmkzWG1MVjQ3UDN2U1JXdTV6eUVzTWs0eTN1dUNGaXVSUFJsdTRRNXBKdnVPZW03SDdVTGlJaENlbXY1RGdrR3RETDFjR0w0RVFoWVJCNklTelZ2c2IyRWFQOXdRRTZEVlJuTTdPK3BuU3pldDZsenAzcEZkR25ib3gxTFJmQzYwdXRYWitDakltNGlFTW10YkIyTjV6RFNoR2JlTTNYVWJKUWRDQmlzOFhJcmhoMmJpQjVoQkNWd24zWTNldHQ3R0RQVnRvaTFHUmp6K0piZ00rWVI5MjhLYmRXUzV0RmFNTTNLajNYdjZvdEl4ek1CbkRDOXVXM2QrSVh4NnZMUEowSlJ1aDN5UDdwVGxhNmMzaVI0cDluV1lEcUorWlNtcHJIRm5ET3pzTFdtRmphcGplL01xd01KZDZUazNuQVd3aWNNT1B1WXBNeXFJRjA0Zmw0bXFndHNITFNNV1JSTkhQWmpFVFE5Z1JtZURZZTZhUnRsVzAycUwyb2xERU5xTFFNdEFkb2lyTldSY1A5VkwzVGQ4SGFVTzZmU2xHTmFiTWFrSkQvMDBYQ2hPU1VPSVArN2ZNN1YwL2wxYkxXUHRFejFpN0x5Z1RWN3BkR29EbnRxU0NFbkpyQnloQkF6TFJnNVFJYzk0MzhJaEtteWZuMC8zYXdvRDFJcjc4MGV5cC9YY0k2eE5jdzZUdi9FVGZIZzBlN2lZQzBVWWNKSUU1UVVYdjBzK1lvR0lFcTVHSXpLdWI4SE5qU1RVcHN2bmtWeCtkYmUyalJuM1liOVc3SkNaNVlTNkY1TXlVVnNwak1EN05ZYytEV2pVTDJiMnNWeUFmZVlwQzhVaGFoOXR1bWF2YkJ2N2EzYTlrZ0ZicTU4bHJIeHpZN2lKUVZpZ3pxM2UxYTJCU2IwUGNXMWFKOEJEN05rTnBoS1lheVR4eWtnd2lsRVJMOGpxcUJFbmlIVmRCeERKWUxiK1h3M2FsTG1sdHVURVY2S0d0Qm50QlgreXozNlJQRE15R0lLZSszZnpjeGZuQ0RuMjBNb2RWVmtWTm96UHFNWFowRzVMNGFMVEFRYWtZS1Vqc1ZNUWpBaFFrVGxIQmVPL2FMUHg5c3hsKytqMVo1ckxnRzEyVE40WEoxZWljdnc0QVZFNThMb3JhcTBRaUUwY1M3UEgxcGJyWldyZnQ3TFlHaXlCU2hvcjcrMGppb1VoMXBkV3EycU1ZTHFlTUVldUNST1F0NTdtRnJPanlQSDQ5cXA5N2NXT3JnZWcyV3lmV1NER1FQamU1K1AweVFvQ3BEL0QzUkFNdVdtYjl3bEJ0Y3EyajhXSlB0OTFFM2tLYXd1UUl5dmQycjJVang0K0hUTnRWS2I5a01MT084NUk2NWJOR0JIKzRpclN5NWdRWWxFMjZBMmNTR0ljTEtRUmx2Sm9NbmE3TC85d3lyeTRIek9yemtyQXZMZGdzU05sWWpwSFFFUmlPSTgwc0o1ak5DQ25mdzAxM0YrQStzQWZMbXlTL0JETE5RMXFhUTNwNmg4L0pxQWZoWDVPR0hnU2lSVk9DRWp1YURCL013Wk5DdTNRTDllaGhvQWo3dU9mOFBrcjNtSWpiaGg5SGlqc2p4MTkxKzBlMkpRckZhMDFBVkpLRVZ0dVB0SWMyaC8xcFBLTXZ5ZW54alRPMk94UG5qanQrODRuSUtLaHhESi9naFB0N2l2OFBtVEowbEtLeVBSc3NsOGYvUWRIZHh1cGI2alRzSTZVS216OVk0NlBNQnVENlAzd2g4cXAzNk82b2liTkRpUWQxc0UxMHZKaDl6MUZ5c0tJZThFcU1wbk5kRW1HMlRmRUJ4UnBtUXJoS0VxZWUwcDYrYTZzUW84Y1ZsUkprS1FBWUthd2NhTkVTNVhjNmRRWTVucWVpcThzVWl6ZjFzcGZIZUhlbER1MU02QlJYdUNqRmFmWGh6OGkzbFBXZ1lxVnBmeDEzaWdWQ1JmNDdVSDY1MnlMbnNtZXBDQldneUJUV0FjT3lGMVF4OFlHdFpub2IxVE4rNnhFd3pwY1dWeTdRTzlQOTJzS0E5U0srL05Ic3FmMTNDT3QwSkhDdFRWMU9sVFFXK0pBS3l4ZTFIbDcrczk1ejNLQ2dGS1FTKzNBczFKVjdOYStnK0xDUjJJZXZ1OGQ1RDBMN0d3b0RyZVV2NDM3NExSYUZrTnNIT3FXYlU5bmhRamRNVnI3YS9pOE8vNGhicHRhU3pxcWtnWUZpTkZVL29tVzVxd0l6N3NwNG5zY0lUUkUzZ3VhNmJ6a2xNWjhFQ24xaXFBV3QwYTZnZWtpNURhTDhxWWFwVENDaGpsV3NFeHFGdXhpV1AzNVRVQ2RkRWQ4QUNiTUdzK2dRRnlET296ZkJERzE3ZFpPMG1Dd1crUHpDTDJqYklDRE5haTUvam0xUXI2TUw1Nmp6VWFJRHowR0xQVFNhZXgxVUREd2tROW83bVhXQzBSN2pXbnpia0hSV2NvbVZiV21HcUwxcmpkb2Fjcy9SOXVqcVV1QkE2QTVWTC9xa1ExeEhMNDJFWG9vcHJDOHdycmZSNjh6TU1GeE93VTdDWUhKN2JoRy9RNHJOc1hEQmNNbzFBZGlxOUxYYlhtL1FKajB1L2pnWkdzc3owbm5LS1VGSmN4enVBTks5NnpXd2YxRFhhc1VjT29FdUVhdG0xcm1QNXdyQkptVy9ad1Q2YUJCaVIyT1NKMHhyOHRRNk9ibWRLanliKzFlRVhiMTQzN1IySWRoRFVkazVQUnp0SDJZRnQycG11TDQvTG1JTEZBdlBkaXlNdERITmorS2g0c1Y0TWxYYldQcnJJOTdZQk9GcEZsWCtnbmV3S0tmRlprSEU3ZGl0eTM0ZFVRMkduZTZzQUd4MXp4eWpadjVLQk0yNmxSSEY0NVhxRk5KMVJRM2hNeW1KSHN5WU5zTU80MUJXckd2MTlQQTQ2OGVjdzlIY1JOMHdoalVUZ25zOFpWYUM0aGlKc2dZMDdhQUVCSG05MC91aGhqTy9XbWI3d3VWYWRobDlSbkhlUWpweDRnd0NyTHo1aTVzNUl0MXNCd2ZEYjBGZStQQ3BMa2Mrd0lJTksyWTg2a1B0aFI2Z0p3Vzc1enVvTjVDMENBaUR3ZlU3M3ZhQVphaHpmNFZMTmxNMFUwNE90SFlCaTEzWWdQb05tR0hSZWxaVkV5Mkt1S1ZaZ2hEMTR2U2xZK0pyTUJEZG0yeTJ0aEZWK0JyaWhMNytmUTV3Y1lueEdlbGF3RHVvU1I1K2JERGtyNlJMNDBMNHh5ZkFoeGxyT24wdUEyOGdoR2VXZ3VhV0tFdjVuQnJydmV1MXVlVnkxTXZHVVlCWStJbEVyOE5kRE5SZG1Felh0MzlrR2xkODZ4T2ZBSC94TDFWbXVnYVhPR2FQQjJxYzdXRFJrVzZrNUY2bjNQa0l6ZFBYeU9OS3AxRGtPZzNvY1NNWk1UczZHS2o5QzN2T0RaNlpRcHdORFlMTVQrQ21FTDE4R1JqWE5jWmxQL0xuaGlBSXNjWVRMMStpSFdEWXZSbXZQTXd0T0hoQ25FWElVM0ZUYlArNlFSR0E2cXlkYm5uZXFWaFhvd2NMbWJNSXoxNklDMWt3aFpqNzUvTTUzc0tZWDJ6UmdPU1RBZk5TRC81bFpZU05VeEpmS1REZ2lhRkVnZ3JDcmQrM0NjK2NoenNsSTN6RFhFS1RydmxjWDJJbkM5dUgrZnN5cHlIdytBdlkyT21CR1FNSUljOGZFM3ROTzBnQlRWcVhzZHNFNzZZd0hyMjlkelFja3VzdXlKc0JmU1ZjbHJ2c05DWjFQUURMOEgzY1JzM0hFOW5Va3g1YmJKWVdzUHhiODI1Z25FcFdVOVo5S3R6dnNsaTcvaGVPbERLcEh4SmIxdUNyV3FmOGdSbldtcTN6ZlNTclVYQkhTTHU2Mk1ya1hUaldnYXBVVnhNR2tybnpSMEU0UE15MWJGY3lEcEVRZTE1VGF5V0JNMUI2anJJRyswRFJSOU9hQ1VQd0Q3ZXhObWpaYjlNODF1cytBSVJmeXpKUFpHbWZIdVQ5U056RmZOdVFkRlp5aVpWdGFZYW92V3VOMmlySTN6UWF0S0NEblFJWHByMFZoRzBHb3A4Yy96cm9XQm9OL2FWS21uOHNrU0Z2QURPam9aQWl4ZzZLMXk5d0ZpOHBlQ21pbUZaM1p6Q1ZzRzZFVTlTdmxicTUrd243RDZ5K2RBWWRhUG1zNGd3Q3JMejVpNXM1SXQxc0J3ZkRiejRYNFZ4cUlwY1RDOU5hWUtxQTdHS0srYVRyWldVd3dOMjFRT3RyOGVxeFNnSjFVOWVDT2NXWFFkK3AzNkd5NGZZK3Q5YzJDc1ZOYk5sMWdoeGE5Ykk4VTZlNkZUZC92dkJhcTlqcktkaXRxNG1OQ2Fpb2dtZlBLNk00OFVZSThqWk1DZGQvOUM4QnF2VWo0YllVNWJ5V0FTRUc2QkJHZEs4S2xmaS9hNExXdDNpdkM0dTlRQlRmYi92Q21OSmkvUUFmYWJjUEcrVXNXbXNZTlJLK2c4aE1jc3VCbWhoNDhOcGhSdmViVlFxcTZuY0t4YzFuRkhXTVc1TTZvZit6OGMxSGRkbmllRFA5R2FCc3EreXNsaktzbFlydDk4OVBZOXhzYm1rcjNYL29DZmlGVTROZmNPaGVlKytuZ1cwWHBaQVZ0MUkyUW5jMWFsd2Jub05xTU1oWElCOTVpa0x4U0ZxSDIyNlpxOXNHL3RyZHIyU0FWdXJueVdzZkhOanVJbEJXS0RPcmQ3VnJZRkp2UTl4YlZvbUtxUWp1aDlkemYybnZWckJ6YkVGMENaWTZpemtZL1JRWTVyOWs5My95Mk5HN28wN25NWWpPdFpZWWVOVW9pazdHYksvSHpRbDFTN3MvRkNobnQ5TTZmRTBVeXVQbXR0Tzk4aHF6eFFidGVNYWxNdFNjZTJXTGNqeVhWR2ZwcWRCa1l5bTRnWkJ5Y2NTNmFudHQ0b0xkbHVXU1NKc0hYMUljWGhReTZvSitBaGp3OWhGWXdYTEhQTG9DbzNqRWxpVUFLNDE3OXd0WXRIc08wYWJMeDQraG10TTVGejd3VVZhaEJBOXN1cE9UZi9GRDRzaVpNTW9mNVczdm01RGVkaHFHQU5saHQzbUk2Um1JaHY0OFFWdG5lTXNVellDNE5EaFpENE01UjZwN0dYQnFjcHUzRmFFRi8wSTBlM0xjZVgxSE4raURxS1JQdUd6dnBhYy8xdHNHUEl0ZUFEeHU5T1lvYXAyejNGMUN6U2cvVXVhOGwvS0V6dEFLRGN2YmhOVS9ZVWMybGhneGdmZGI0ZStQOVRaN1JhWDgyczYyN3UwQ2JGc2ZHRS8xaExwYjVNYzJ2azF1REdyZEljYldBNnhocFlBSFloRVlVbDljNzVZL1IvMGdsNnI5K202Y0kwQnZCWTVBYTVOQlJjNlVNdnNPL1BPdzVDY3I3OXNKemljZWFWM1l3cllFa2pwNktpK09Zckd1OTU0QUErZEo5V3N2TkdCRkdNcktBZlE5VlVDL0FUa0pmVGxvTWx0RGVWNUFvOXprYWF5M2RLQWE1L1B4QUdSREFVY1FMREY3dVZYYkQxdkZnRS8rUlhpd3pTNU43Y3IzYUZCZFJZN1hBbUZ6L2ZiMC9LU3BSOENRL2xva3BtTTJtbHRKOXZHUGdpcWI1blpsOUt1N2QyR2xnQWRpRVJoU1gxenZsajlIL1NCdWpCUG9PMWZwb091NUYzNWNkSGE1a1NGdkFET2pvWkFpeGc2SzF5OXdGbGowRXo1a3NVVzNXVTYzRTdlNHF0RFVDS1d3ampVNWYwRmQ1N1Z5VnpwQzZDZENTY0JqWVN6VDlyWkxWc2txNjFhT1dyRERVTktxQVEzK25YL0JCVzNjUVRFY09WZGMxNW5nVlhjU1MvYUsyUUZNZGlLUWxxbTE1ZkVySmR3cXllemE3aGZsS1RpQ3pVZHU1VkdsRlc5cUN0OHN5SG9vc0EyTnpmb3NKZFRkTjhiV0hub0RyNU4yNWV0K3AvbnZqak96WlJhTFlvWS9mci9rNWhxcHRPaz1cXFxcXFxcIik7XFxcXG4gICAgcmV0dXJuICQuZXhwb3J0cztcXFxcbn0pKCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi57yW6L6R5YWs5ZGKXFxcIixcXFwicGF0aFxcXCI6XFxcImRldkluZm9FZGl0XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpPT57XFxcXG4gICAgcHV0TXlWYXIoXFxcXFxcXCJkZXZJbmZvXFxcXFxcXCIsJycpOyAvL+a4hemZpOWOhuWPsuWFrOWRilxcXFxufSkpO1xcXFxuc2V0UGFnZVRpdGxlKCfnvJbovpHlhazlkYonKTtcXFxcbi8vIGxldCB7bm93SngsTXlKaWV4aSxqeHNSb3V0ZX0gPSBNWV9QQVJBTVM7XFxcXG5jb25zdCB7Y29sb3Isc21hbGwsYXBpLCBnZXRGaWxlLGdldEFwaX0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxuLy8gbGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcXFxudmFyIGRldl9pbmZvX3VybCA9IGdldEFwaSgnaW5mb0dldFVybCcpO1xcXFxuLy8gbG9nKGRldl9pbmZvX3VybCk7XFxcXG52YXIgZ2V0X2luZm8gPSBmdW5jdGlvbihxcSl7XFxcXG4gICAgcXEgPSBxcXx8JzQzNDg1NzAwNSc7XFxcXG4gICAgbGV0IGRldl9pbmZvX3VybCA9IGRldl9pbmZvX3VybCtxcTtcXFxcbiAgICBsZXQgYmFja19jb2RlID0gSlNPTi5wYXJzZShyZXF1ZXN0KGRldl9pbmZvX3VybCkpO1xcXFxuICAgIGxldCBkZXZfaW5mbz1iYWNrX2NvZGUucmVzdWx0fHxiYWNrX2NvZGUuZGV0YWlsO1xcXFxuICAgIHJldHVybiBkZXZfaW5mbztcXFxcbn07XFxcXG52YXIgYmVmb3JlX3JlZnJlc2ggPSBmdW5jdGlvbigpe1xcXFxuICAgIGxldCBkZXZfc2V0X2luZm8gPSBnZXRNeVZhcihcXFxcXFxcImRldl9zZXRfaW5mb1xcXFxcXFwiKS5zcGxpdCgnJCQnKTtcXFxcbiAgICBsZXQgZGV2X2luZm9fdXJsID0gZGV2X3NldF9pbmZvLnNsaWNlKC0xKVswXTtcXFxcbiAgICBsZXQgYmFja19jb2RlID0gSlNPTi5wYXJzZShyZXF1ZXN0KGRldl9pbmZvX3VybCkpO1xcXFxuICAgIGxldCBkZXZfaW5mbz1iYWNrX2NvZGUucmVzdWx0fHxiYWNrX2NvZGUuZGV0YWlsO1xcXFxuICAgIHB1dE15VmFyKFxcXFxcXFwiZGV2SW5mb1xcXFxcXFwiLGRldl9pbmZvKTtcXFxcbiAgICByZXR1cm4gZGV2X2luZm9cXFxcbn07XFxcXG5sZXQgZCA9IFtdO1xcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTon57yW6L6R5YWs5ZGKJyxcXFxcbiAgICBkZXNjOifmlK/mjIFtZOivreazlSzngrnlh7vov5vlhaXlrabkuaBNZOivreazlVxcXFxcXFxcbuS/neWtmOWFrOWRiuaMiemSruWcqOaWh+acrOahhuacgOS4i+mdoicsXFxcXG4gICAgY29sX3R5cGU6J3RleHRfMScsXFxcXG4gICAgdXJsOidodHRwczovL3d3dy5ydW5vb2IuY29tL21hcmtkb3duL21kLXR1dG9yaWFsLmh0bWwnXFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6J+i/lOWbnicsXFxcXG4gICAgY29sX3R5cGU6J3RleHRfMicsXFxcXG4gICAgdXJsOiQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKCk9PntcXFxcbiAgICAgICAgYmFjayhmYWxzZSk7XFxcXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICB9KVxcXFxufSk7XFxcXG5pZighZ2V0TXlWYXIoJ2RldkluZm8nKSl7XFxcXG4gICAgYmVmb3JlX3JlZnJlc2goKTtcXFxcbn1cXFxcbmxldCBlbXB0eSA9ICdoaWtlcjovL2VtcHR5JztcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6J+mYheiniOafpemYhScsXFxcXG4gICAgY29sX3R5cGU6J3RleHRfMicsXFxcXG4gICAgLy8gdXJsOiQoZ2V0TXlWYXIoJ2RldkluZm8nKSkuY29uZmlybSgpXFxcXG4gICAgdXJsOiQoZW1wdHkpLnJ1bGUoKCk9PntcXFxcbiAgICAgICAgcmVxdWlyZShcXFxcXFxcImh0dHBzOi8vZ2l0bGFiLmNvbS9oamRobngvaGlrZXIvLS9yYXcvbWFpbi9qcy9tYXJrZWQubWluLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgIGxldCBkZXZJbmZvPVxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgdHJ5e1xcXFxuICAgICAgICAgIGRldkluZm89bWFya2VkLnBhcnNlKGdldE15VmFyKCdkZXZJbmZvJykpO1xcXFxuICAgICAgIH1jYXRjaChlKXt9XFxcXG4gICAgICAgIHNldFJlc3VsdChbXFxcXG4gICAgICAgICAgICB7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6ZGV2SW5mbyxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZToncmljaF90ZXh0JyxcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgXSk7XFxcXG4gICAgfSlcXFxcbn0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuW/q+adpee8lui+keS9oOeahOWFrOWRiuWQp35cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKCdkZXZJbmZvJywgJycpfHxcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICB0eXBlOiBcXFxcXFxcInRleHRhcmVhXFxcXFxcXCIsXFxcXG4gICAgICAgIGhlaWdodDotMSxcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRNeVZhcihcXFxcXFxcImRldkluZm9cXFxcXFxcIixpbnB1dCknXFxcXG4gICAgfVxcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOlxcXFxcXFwi5L+d5a2Y5YWs5ZGKXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXFxcbiAgICB1cmw6JCgn56Gu6K6k5L+d5a2Y5YWs5ZGK5ZCX77yf5bCG5Lya5LiO6YGT6ZW/5LuT5bqT5pyN5Yqh5Zmo6YCa6K6vJykuY29uZmlybSgoKT0+e1xcXFxuICAgICAgICBsZXQgZGV2X3NldF9pbmZvID0gZ2V0TXlWYXIoXFxcXFxcXCJkZXZfc2V0X2luZm9cXFxcXFxcIikuc3BsaXQoJyQkJyk7XFxcXG4gICAgICAgIGxldCBpbnB1dF90ZXh0ID0gZ2V0TXlWYXIoJ2RldkluZm8nLCAnJyk7XFxcXG4gICAgICAgIGlmKGlucHV0X3RleHQubGVuZ3RoID49IDQpe1xcXFxuICAgICAgICAgICAgbGV0IGluZm9fc2V0X3VybD0gZGV2X3NldF9pbmZvWzJdO1xcXFxuICAgICAgICAgICAgbGV0IHNlbmRfZGF0YSA9IHtcXFxcXFxcInBhcmFtc1xcXFxcXFwiOlxcXFxuICAgICAgICAgICAgICAgICAgICB7XFxcXFxcXCJkYXRhXFxcXFxcXCI6IHtcXFxcXFxcImluZm9cXFxcXFxcIjogaW5wdXRfdGV4dH0sXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogZGV2X3NldF9pbmZvWzBdLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiOiBkZXZfc2V0X2luZm9bMV19XFxcXG4gICAgICAgICAgICB9O1xcXFxuICAgICAgICAgICAgLy8gbG9nKHNlbmRfZGF0YSk7XFxcXG4gICAgICAgICAgICBsZXQgcGFyMiA9IHtoZWFkZXJzOnsnY29udGVudC10eXBlJzonYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywnVXNlci1BZ2VudCc6ZGV2X3NldF9pbmZvWzNdfSxib2R5OkpTT04uc3RyaW5naWZ5KHNlbmRfZGF0YSksbWV0aG9kOidQT1NUJ307XFxcXG4gICAgICAgICAgICAvLyBwYXIyID0gSlNPTi5zdHJpbmdpZnkocGFyMik7IC8veDXph4zpnaLor7fmsYLmiY3pnIDopoHnvJbnoIFcXFxcbiAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGJhY2tfcmV0ID0gcmVxdWVzdChpbmZvX3NldF91cmwsIHBhcjIpO1xcXFxuICAgICAgICAgICAgICAgIGJhY2tfcmV0ID0gSlNPTi5wYXJzZShiYWNrX3JldCkucmVzdWx0O1xcXFxuICAgICAgICAgICAgICAgIGlmKGJhY2tfcmV0LnN0YXR1cz09PTApe1xcXFxuICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L+d5a2Y5oiQ5YqfXFxcXFxcXFxuJytiYWNrX3JldC5kZXRhaWw7XFxcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/kv53lrZjlpLHotKVcXFxcXFxcXG4nK2JhY2tfcmV0LmRldGFpbDtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZSZ6K+vXFxcXFxcXFxuJytlLm1lc3NhZ2U7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgY29uZmlybSh7dGl0bGU6J+mBk+mVv+aPkOekuicsY29udGVudDon6Jm954S25L2g5b6I5oeS77yM5L2G5piv5YWs5ZGK6Iez5bCR5YaZNOS4quWtl+WQp++8gSd9KTtcXFxcbiAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pXFxcXG59KTtcXFxcblxcXFxuc2V0UmVzdWx0KGQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIumihOWkhOeQhuS+nei1luaWh+S7tlxcXCIsXFxcInBhdGhcXFwiOlxcXCJsaWJzXFxcIixcXFwicnVsZVxcXCI6XFxcImlmKGdldEFwcFZlcnNpb24oKT49MzIwMCl7XFxcXG4gICAgdHJ5e1xcXFxuICAgICAgICByYyhcXFxcXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvanMvJGhpa2VyLmpzXFxcXFxcXCIsIC0xKTtcXFxcbiAgICAgICAgLy8kLnNldFJvb3QoJ2h0dHBzOi8vaGpkaG54LmNvZGluZy5uZXQvcHVibGljL2hpa2VyL2hpa2VyL2dpdC9maWxlcy9tYXN0ZXIvanMvJyk7XFxcXG4gICAgICAgICQuc2V0Um9vdCgpO1xcXFxuICAgICAgICAkLnNldExpYih7XFxcXG4gICAgICAgICAgICBsc2c6IFxcXFxcXFwibHNnLmpzXFxcXFxcXCIsIC8v5pys5Zyw5YKo5a2YXFxcXG4gICAgICAgICAgICBmaWxlOiBcXFxcXFxcImZpbGUuanNcXFxcXFxcIiwgLy/mlofku7Zvc1xcXFxuICAgICAgICAgICAgZmlsZVNlbGVjdDogXFxcXFxcXCJmaWxlU2VsZWN0LmpzXFxcXFxcXCIsIC8v5paH5Lu26YCJ5oup5ZmoXFxcXG4gICAgICAgICAgICBkdDogXFxcXFxcXCJkdC5qc1xcXFxcXFwiLCAvL+WKqOaAgeWIhuexu1xcXFxuICAgICAgICAgICAgZHI6IFxcXFxcXFwiZHIuanNcXFxcXFxcIiwgLy9kcuaooeadv+S+nei1llxcXFxuICAgICAgICAgICAgZHJwcmU6IFxcXFxcXFwiZHJwcmUuanNcXFxcXFxcIiwgLy9kcuaooeadv+mihOWkhOeQhlxcXFxuICAgICAgICAgICAgZHJ1cDogXFxcXFxcXCJkcnVwLmpzXFxcXFxcXCIsIC8vZHLmqKHmnb/oh6rliqjmm7TmlrBcXFxcbiAgICAgICAgICAgIGRybWF0Y2g6IFxcXFxcXFwiZHJtYXRjaC5qc1xcXFxcXFwiLCAvL2Ry5qih5p2/6Ieq5Yqo5qih5p2/5Yy56YWNXFxcXG4gICAgICAgICAgICBkcm06IFxcXFxcXFwiZHJtLmpzXFxcXFxcXCIsIC8vZHLmqKHmnb/lsI/nqIvluo9cXFxcbiAgICAgICAgICAgIGNtczogXFxcXFxcXCJjbXMuanNcXFxcXFxcIiwgLy9jbXPmqKHmnb/kvp3otZZcXFxcbiAgICAgICAgICAgIGNtc3ByZTogXFxcXFxcXCJjbXNwcmUuanNcXFxcXFxcIiwgLy9jbXPpooTlpITnkIZcXFxcbiAgICAgICAgICAgIGNtc206IFxcXFxcXFwiY21zbS5qc1xcXFxcXFwiLCAvL2Ntc+aooeadv+Wwj+eoi+W6j1xcXFxuICAgICAgICAgICAgbGliY2hlY2s6IFxcXFxcXFwibGliY2hlY2suanNcXFxcXFxcIiwgLy9kcuajgOa1i+S+nei1llxcXFxuICAgICAgICAgICAgcnVsZUVkaXRvcjogXFxcXFxcXCJydWxlRWRpdG9yLmpzXFxcXFxcXCIsIC8v5YaZ6aG15rqQ56We5Zmo5bCP56iL5bqPXFxcXG4gICAgICAgICAgICBob3VzZUxhenk6IFxcXFxcXFwiaG91c2VMYXp5LmpzXFxcXFxcXCIsIC8v5LuT5bqT6YCa5YWNXFxcXG4gICAgICAgICAgICBsYXp5OiBcXFxcXFxcImxhenkuanNcXFxcXFxcIiwgLy/pppnlhY1cXFxcbiAgICAgICAgICAgIHN1YjogXFxcXFxcXCJzdWIuanNcXFxcXFxcIiwgLy/pgZPlvrfnu4/orqLpmIVcXFxcbiAgICAgICAgICAgIGhpa2VyVWk6IFxcXFxcXFwiaGlrZXJVaS5qc1xcXFxcXFwiLCAvL+a1t+mYlOe7hOS7tuS+nei1llxcXFxuICAgICAgICAgICAgaGlrZXJMaWJzOiBcXFxcXFxcImhpa2VyTGlicy5qc1xcXFxcXFwiLCAvL+a1t+mYlOWFqOiDveS+nei1llxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9Y2F0Y2goZSl7XFxcXG4gICAgICAgIC8vdG9hc3QoJ+ivt+WwneivleeCueWHu+S7k+W6k+S4u+mhteeahOWNh+e6p+S7k+W6k+aXgei+ueeahOaMiemSruWNh+e6pyTmianlsZXvvIzlkKbliJnmn5Dkupvlip/og73kuI3og73mraPluLjkvb/nlKgnKTtcXFxcbiAgICAgICAgY29uZmlybSh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJ+aPkOekui3ngrnlh7vnoa7lrprlj6/ku6Xlr7zlhaUnLFxcXFxuICAgICAgICAgICAgY29udGVudDogJ+ivt+WwneivleeCueWHu+S7k+W6k+S4u+mhteeahOWNh+e6p+S7k+W6k+aXgei+ueeahOaMiemSruWNh+e6pyTmianlsZXvvIzlkKbliJnmn5Dkupvlip/og73kuI3og73mraPluLjkvb/nlKgnLFxcXFxuICAgICAgICAgICAgY29uZmlybTogJC50b1N0cmluZygoKT0+e1xcXFxuICAgICAgICAgICAgICAgIGNvbnN0IHtnZXRBcGl9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcnVsZUhlYWQgPSAn5rW36ZiU6KeG55WM77yM572R6aG15o+S5Lu277+lanNfdXJs77+lJGhpa2VyQCc7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGdldEFwaSgnaW1wb3J0VXJsJykrXFxcXFxcXCI1MTExXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGltcG9ydFVybCA9ICdydWxlOi8vJytiYXNlNjRFbmNvZGUocnVsZUhlYWQrdXJsKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gaW1wb3J0VXJsXFxcXG4gICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgIGNhbmNlbDogJC50b1N0cmluZygoKT0+e1xcXFxuXFxcXG4gICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgfSlcXFxcbiAgICB9XFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiSW1wb3J06K+m57uGXFxcIixcXFwicGF0aFxcXCI6XFxcInJ1bGVEZXRhaWxJbXBvcnRcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG4kLmV4cG9ydHMgPSBcXFxcXFxcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsP3J1bGU96YGT6ZW/5LuT5bqTUHJvJmlkPVxcXFxcXFwiICsgJC5pbXBvcnRQYXJhbTtcXFxcblxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIui3kemprOeBr+WFrOWRilxcXCIsXFxcInBhdGhcXFwiOlxcXCJub3RpY2VcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5sZXQgZ2V0SHRtbCA9ICh0ZXh0LCBjb2xvcikgPT4gYFxcXFxuPCFET0NUWVBFIGh0bWw+XFxcXG48aHRtbD5cXFxcbjxoZWFkPlxcXFxuPG1ldGEgbmFtZT1cXFxcXFxcInZpZXdwb3J0XFxcXFxcXCIgY29udGVudD1cXFxcXFxcIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLCBtYXhpbXVtLXNjYWxlPTEsIHVzZXItc2NhbGFibGU9MFxcXFxcXFwiPlxcXFxuPHN0eWxlPlxcXFxuLm1hcnF1ZWUge1xcXFxuICB3aWR0aDogMTAwJTtcXFxcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxcXG4gIGNvbG9yOiAke2NvbG9yfTtcXFxcbiAgZm9udC1zaXplOiAxNnB4O1xcXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcXFxufVxcXFxuXFxcXG4ubWFycXVlZSBzcGFuIHtcXFxcbiAgdXNlci1zZWxlY3Q6bm9uZTtcXFxcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrOyAgXFxcXG4gIHBhZGRpbmctbGVmdDogMTAwJTtcXFxcbiAgYW5pbWF0aW9uOiBtYXJxdWVlIDI1cyBsaW5lYXIgaW5maW5pdGU7XFxcXG59XFxcXG5cXFxcbkBrZXlmcmFtZXMgbWFycXVlZSB7XFxcXG4gIDAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDAlKTsgfVxcXFxuICAxMDAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsgfVxcXFxufVxcXFxuXFxcXG5AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7XFxcXG4gICAgYm9keSB7XFxcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzFCMUIxQjtcXFxcbiAgICAgfVxcXFxuICAgICAudGV4dCwuc2Nyb2xse1xcXFxuICAgICAgIGNvbG9yOiNGZmY7XFxcXG4gICAgICAgfVxcXFxuICAgIH1cXFxcblxcXFxuQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIHtcXFxcbiAgICBib2R5IHtcXFxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXFxcbiAgICAgIH1cXFxcbiAgICB9XFxcXG5cXFxcbjwvc3R5bGU+XFxcXG48L2hlYWQ+XFxcXG48Ym9keT5cXFxcbjxkaXYgY2xhc3M9XFxcXFxcXCJtYXJxdWVlXFxcXFxcXCI+XFxcXG4gIDxzcGFuIGlkPVxcXFxcXFwidGV4dENvbnRhaW5lclxcXFxcXFwiPiR7dGV4dH08L3NwYW4+XFxcXG48L2Rpdj5cXFxcbjwvYm9keT5cXFxcbjwvaHRtbD5gO1xcXFxuXFxcXG4kLmV4cG9ydHMuc2hvdyA9IGZ1bmN0aW9uKGFyciwgdGV4dCwgY29sb3IsIHVybCwgY29udGVudCkge1xcXFxuICAgIHZhciBodG1sID0gZ2V0SHRtbCh0ZXh0IHx8ICfov5nmmK/ot5Hpqaznga/pu5jorqTnmoTmloflrZfvvIzlj6/ku6Xoh6rooYzmm7/mjaLjgIInLCBjb2xvciB8fCAncmVkJyk7XFxcXG4gICAgYXJyLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ4NV93ZWJ2aWV3X3NpbmdsZVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiYWJvdXQ6YmxhbmtcXFxcXFxcIixcXFxcbiAgICAgICAgZGVzYzogXFxcXFxcXCI1MCYmbGlzdFxcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKGgsIHVybCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHZhciBodG1sID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xcXFxuICAgICAgICAgICAgICAgIGh0bWwuaW5uZXJIVE1MID0gaDtcXFxcblxcXFxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHRDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGV4dENvbnRhaW5lcicpO1xcXFxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSB0ZXh0Q29udGFpbmVyLmlubmVySFRNTDtcXFxcbiAgICAgICAgICAgICAgICB0ZXh0Q29udGFpbmVyLm9uY2xpY2s9ZnVuY3Rpb24oKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmx8fFxcXFxcXFwiYWJvdXQ6Ymxhbmsvbm90aWNlXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIC8vIOiuvue9ruaWh+acrOWuueWZqOWuveW6puS4uuaWh+acrOWGheWuueeahOWuveW6plxcXFxuICAgICAgICAgICAgICAgIHRleHRDb250YWluZXIuc3R5bGUud2lkdGggPSBgJHt0ZXh0Q29udGFpbmVyLm9mZnNldFdpZHRofXB4YDtcXFxcblxcXFxuICAgICAgICAgICAgICAgIC8vIOWkjeWItuaWh+acrOWGheWuueW5tui/veWKoOWIsOaWh+acrOWuueWZqOWQjumdolxcXFxuICAgICAgICAgICAgICAgIHRleHRDb250YWluZXIuaW5uZXJIVE1MICs9ICcgJyArIHRleHQ7XFxcXG5cXFxcbiAgICAgICAgICAgICAgICAvLyDliqjmgIHorqHnrpfliqjnlLvmjIHnu63ml7bpl7RcXFxcbiAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9ICh0ZXh0Q29udGFpbmVyLm9mZnNldFdpZHRoIC8gdGV4dENvbnRhaW5lci5wYXJlbnRFbGVtZW50Lm9mZnNldFdpZHRoKSAqIDEwO1xcXFxuXFxcXG4gICAgICAgICAgICAgICAgdmFyIHN0eWxlRWxlbWVudHMgPSBkb2N1bWVudC5oZWFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzdHlsZScpO1xcXFxuXFxcXG5cXFxcbiAgICAgICAgICAgICAgICBzdHlsZUVsZW1lbnRzWzJdLmlubmVySFRNTCA9IGAubWFycXVlZSBzcGFuIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcXFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwMCU7XFxcXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogbWFycXVlZSAke2R1cmF0aW9ufXMgbGluZWFyIGluZmluaXRlXFxcXG4gICAgICAgICAgICAgICAgfWA7XFxcXG5cXFxcbiAgICAgICAgICAgIH0sIGh0bWwsIHVybCksXFxcXG4gICAgICAgICAgICB1cmxJbnRlcmNlcHRvcjogJC50b1N0cmluZygoY29udGVudCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGlmIChpbnB1dD09PVxcXFxcXFwiYWJvdXQ6Ymxhbmsvbm90aWNlXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQudG9TdHJpbmcoKGNvbnRlbnQpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5vcGVuKEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLlhazlkYpcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IycsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZFJ1bGU6IFxcXFxcXFwianM6XFxcXFxcXCIgKyAkJCQudG9TdHJpbmcoKGNvbnRlbnQpID0+IHNldFJlc3VsdChbe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogY29udGVudCxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0pLGNvbnRlbnQpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0sIGNvbnRlbnQpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0sIGNvbnRlbnQgfHwgdGV4dCksXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbn1cXFwifV1cIixcInByb3h5XCI6XCJcIn0iLCJwaWNVcmwiOiJodHRwczovL2ltZy5hbGljZG4uY29tL2ltZ2V4dHJhL2kyL08xQ04wMURPWWNzNzF2M0I2Yk9lbVZNXyEhNjAwMDAwMDAwNjExNi0yLXRwcy01MTItNTEyLnBuZyIsInRpdGxlIjoi44CM5LqR55uY5ZCbLueugOOAjSJ9
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement