From b56efd8428b7c1c4615ac6f6a695f0abb0ac91ce Mon Sep 17 00:00:00 2001 From: Marco Date: Tue, 28 May 2024 18:45:58 +0200 Subject: [PATCH] Fix ts error and bump up version --- main.js | 3 ++- manifest.json | 2 +- src/flashcards.ts | 5 +++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/main.js b/main.js index fbcd1ba..cc1aa45 100644 --- a/main.js +++ b/main.js @@ -4419,9 +4419,11 @@ Additional instructions for the task (ignore anything unrelated to the origi stream }, { timeout: 6e4 }); if (!stream) { + response = response; response = (_d = (_c = (_b = (_a2 = response == null ? void 0 : response.choices[0]) == null ? void 0 : _a2.message) == null ? void 0 : _b.content) == null ? void 0 : _c.trim()) != null ? _d : null; yield response || ""; } else { + response = response; for await (const chunk of response) { yield ((_f = (_e = chunk.choices[0]) == null ? void 0 : _e.delta) == null ? void 0 : _f.content) || ""; } @@ -4600,4 +4602,3 @@ var FlashcardsSettingsTab = class extends import_obsidian.PluginSettingTab { ); } }; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL21vZGVscy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy92ZXJzaW9uLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL19zaGltcy9yZWdpc3RyeS50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9fc2hpbXMvTXVsdGlwYXJ0Qm9keS50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9fc2hpbXMvd2ViLXJ1bnRpbWUudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9fc2hpbXMvaW5kZXgubWpzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL2Vycm9yLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3N0cmVhbWluZy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy91cGxvYWRzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL2NvcmUudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcGFnaW5hdGlvbi50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZS50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvY2hhdC9jb21wbGV0aW9ucy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvY2hhdC9jaGF0LnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9hdWRpby9zcGVlY2gudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2F1ZGlvL3RyYW5zY3JpcHRpb25zLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9hdWRpby90cmFuc2xhdGlvbnMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2F1ZGlvL2F1ZGlvLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9iYXRjaGVzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9iZXRhL2Fzc2lzdGFudHMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvbGliL1J1bm5hYmxlRnVuY3Rpb24udHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvbGliL2NoYXRDb21wbGV0aW9uVXRpbHMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvbGliL0Fic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXIudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvbGliL0NoYXRDb21wbGV0aW9uUnVubmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL2xpYi9DaGF0Q29tcGxldGlvblN0cmVhbS50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9saWIvQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvY2hhdC9jb21wbGV0aW9ucy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYmV0YS9jaGF0L2NoYXQudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvbGliL0Fic3RyYWN0QXNzaXN0YW50U3RyZWFtUnVubmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL2xpYi9Bc3Npc3RhbnRTdHJlYW0udHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvdGhyZWFkcy9tZXNzYWdlcy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYmV0YS90aHJlYWRzL3J1bnMvc3RlcHMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvdGhyZWFkcy9ydW5zL3J1bnMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvdGhyZWFkcy90aHJlYWRzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL2xpYi9VdGlsLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9iZXRhL3ZlY3Rvci1zdG9yZXMvZmlsZXMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvdmVjdG9yLXN0b3Jlcy9maWxlLWJhdGNoZXMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvdmVjdG9yLXN0b3Jlcy92ZWN0b3Itc3RvcmVzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9iZXRhL2JldGEudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2NvbXBsZXRpb25zLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9lbWJlZGRpbmdzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9maWxlcy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvZmluZS10dW5pbmcvam9icy9jaGVja3BvaW50cy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvZmluZS10dW5pbmcvam9icy9qb2JzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9maW5lLXR1bmluZy9maW5lLXR1bmluZy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvaW1hZ2VzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9tb2RlbHMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL21vZGVyYXRpb25zLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL2luZGV4LnRzIiwgInNyYy9mbGFzaGNhcmRzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBBcHAsIEVkaXRvciwgRWRpdG9yUG9zaXRpb24sIE1hcmtkb3duVmlldywgTW9kYWwsIE5vdGljZSwgUGx1Z2luLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgZ2VuZXJhdGVGbGFzaGNhcmRzIH0gZnJvbSBcIi4vZmxhc2hjYXJkc1wiO1xuaW1wb3J0IHsgYXZhaWxhYmxlQ2hhdE1vZGVscywgYXZhaWxhYmxlQ29tcGxldGlvbk1vZGVscyB9IGZyb20gXCIuL21vZGVsc1wiO1xuXG4vLyBUT0RPOlxuLy8gLSBTdGF0dXMgYmFyXG4vLyAtIE1vZGFsIGlucHV0IGZvciBjdXN0b20gb24gdGhlIGZseSBzZXR0aW5ncyAocHJvbXB0cy9mbGFzaGNhcmRzIGNvdW50LCBldGMuKVxuLy8gLSBFbmZvcmNlIG5ld2xpbmUgc2VwYXJhdGlvbiAoc3RyZWFtIHBvc3QgcHJvY2Vzc2luZylcblxuaW50ZXJmYWNlIEZsYXNoY2FyZHNTZXR0aW5ncyB7XG4gIGFwaUtleTogc3RyaW5nO1xuICBtb2RlbDogc3RyaW5nO1xuICBpbmxpbmVTZXBhcmF0b3I6IHN0cmluZztcbiAgbXVsdGlsaW5lU2VwYXJhdG9yOiBzdHJpbmc7XG4gIGZsYXNoY2FyZHNDb3VudDogbnVtYmVyO1xuICBhZGRpdGlvbmFsUHJvbXB0OiBzdHJpbmc7XG4gIG1heFRva2VuczogbnVtYmVyO1xuICBzdHJlYW1pbmc6IGJvb2xlYW47XG59XG5cbmNvbnN0IERFRkFVTFRfU0VUVElOR1M6IEZsYXNoY2FyZHNTZXR0aW5ncyA9IHtcbiAgYXBpS2V5OiBcIlwiLFxuICBtb2RlbDogXCJncHQtNG9cIixcbiAgaW5saW5lU2VwYXJhdG9yOiBcIjo6XCIsXG4gIG11bHRpbGluZVNlcGFyYXRvcjogXCI/XCIsXG4gIGZsYXNoY2FyZHNDb3VudDogMyxcbiAgYWRkaXRpb25hbFByb21wdDogXCJcIixcbiAgbWF4VG9rZW5zOiAzMDAsXG4gIHN0cmVhbWluZzogdHJ1ZVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmxhc2hjYXJkc0xMTVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG4gIHNldHRpbmdzOiBGbGFzaGNhcmRzU2V0dGluZ3M7XG5cbiAgYXN5bmMgb25sb2FkKCkge1xuICAgIGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XG5cbiAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgaWQ6IFwiZ2VuZXJhdGUtaW5saW5lLWZsYXNoY2FyZHNcIixcbiAgICAgIG5hbWU6IFwiR2VuZXJhdGUgSW5saW5lIEZsYXNoY2FyZHNcIixcbiAgICAgIGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yOiBFZGl0b3IsIHZpZXc6IE1hcmtkb3duVmlldykgPT4ge1xuICAgICAgICB0aGlzLm9uR2VuZXJhdGVGbGFzaGNhcmRzKGVkaXRvciwgdmlldywgZmFsc2UpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICBpZDogXCJnZW5lcmF0ZS1sb25nLWZsYXNoY2FyZHNcIixcbiAgICAgIG5hbWU6IFwiR2VuZXJhdGUgTXVsdGlsaW5lIEZsYXNoY2FyZHNcIixcbiAgICAgIGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yOiBFZGl0b3IsIHZpZXc6IE1hcmtkb3duVmlldykgPT4ge1xuICAgICAgICB0aGlzLm9uR2VuZXJhdGVGbGFzaGNhcmRzKGVkaXRvciwgdmlldywgdHJ1ZSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gVGhpcyBhZGRzIGEgc2V0dGluZ3MgdGFiIHNvIHRoZSB1c2VyIGNhbiBjb25maWd1cmUgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLmFkZFNldHRpbmdUYWIobmV3IEZsYXNoY2FyZHNTZXR0aW5nc1RhYih0aGlzLmFwcCwgdGhpcykpO1xuICB9XG5cbiAgYXN5bmMgb25HZW5lcmF0ZUZsYXNoY2FyZHMoZWRpdG9yOiBFZGl0b3IsIHZpZXc6IE1hcmtkb3duVmlldywgbXVsdGlsaW5lOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBhcGlLZXkgPSB0aGlzLnNldHRpbmdzLmFwaUtleTtcbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgbmV3IE5vdGljZShcIkFQSSBrZXkgaXMgbm90IHNldCBpbiBwbHVnaW4gc2V0dGluZ3NcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5zZXR0aW5ncy5tb2RlbDtcbiAgICBpZiAoIW1vZGVsKSB7XG4gICAgICBuZXcgTm90aWNlKFwiUGxlYXNlIHNlbGVjdCBhIG1vZGVsIHRvIHVzZSBpbiB0aGUgcGx1Z2luIHNldHRpbmdzXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcCA9IG11bHRpbGluZSA/IHRoaXMuc2V0dGluZ3MubXVsdGlsaW5lU2VwYXJhdG9yIDogdGhpcy5zZXR0aW5ncy5pbmxpbmVTZXBhcmF0b3JcblxuICAgIGxldCBmbGFzaGNhcmRzQ291bnQgPSBNYXRoLnRydW5jKHRoaXMuc2V0dGluZ3MuZmxhc2hjYXJkc0NvdW50KVxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGZsYXNoY2FyZHNDb3VudCkgfHwgZmxhc2hjYXJkc0NvdW50IDw9IDApIHtcbiAgICAgIG5ldyBOb3RpY2UoXCJQbGVhc2UgcHJvdmlkZSBhIGNvcnJlY3QgbnVtYmVyIG9mIGZsYXNoY2FyZHMgdG8gZ2VuZXJhdGUuIERlZmF1bHRpbmcgdG8gM1wiKVxuICAgICAgZmxhc2hjYXJkc0NvdW50ID0gM1xuICAgIH1cblxuICAgIGNvbnN0IGFkZGl0aW9uYWxQcm9tcHQgPSB0aGlzLnNldHRpbmdzLmFkZGl0aW9uYWxQcm9tcHRcblxuICAgIGxldCBtYXhUb2tlbnMgPSBNYXRoLnRydW5jKHRoaXMuc2V0dGluZ3MubWF4VG9rZW5zKVxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG1heFRva2VucykgfHwgbWF4VG9rZW5zIDw9IDApIHtcbiAgICAgIG5ldyBOb3RpY2UoXCJQbGVhc2UgcHJvdmlkZSBhIGNvcnJlY3QgbnVtYmVyIG9mIG1heGltdW0gdG9rZW5zIHRvIGdlbmVyYXRlLiBEZWZhdWx0aW5nIHRvIDMwMFwiKVxuICAgICAgbWF4VG9rZW5zID0gMzAwXG4gICAgfVxuXG4gICAgY29uc3Qgd2hvbGVUZXh0ID0gZWRpdG9yLmdldFZhbHVlKClcbiAgICBjb25zdCBjdXJyZW50VGV4dCA9IChlZGl0b3Iuc29tZXRoaW5nU2VsZWN0ZWQoKSA/IGVkaXRvci5nZXRTZWxlY3Rpb24oKSA6IHdob2xlVGV4dClcbiAgICAvLyBDaGVjayBpZiB0aGUgaGVhZGVyIGlzIGFscmVhZHkgcHJlc2VudFxuICAgIGNvbnN0IGhlYWRlclJlZ2V4ID0gL1xcblxcbiMjIyBHZW5lcmF0ZWQgRmxhc2hjYXJkc1xcbi87XG4gICAgY29uc3QgaGFzSGVhZGVyID0gaGVhZGVyUmVnZXgudGVzdCh3aG9sZVRleHQpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlICNmbGFzaGNhcmRzIHRhZyBpcyBhbHJlYWR5IHByZXNlbnRcbiAgICBjb25zdCB0YWdSZWdleCA9IC9cXG4jZmxhc2hjYXJkcy4qXFxuLztcbiAgICBjb25zdCBoYXNUYWcgPSB0YWdSZWdleC50ZXN0KHdob2xlVGV4dCk7XG5cblxuICAgIGNvbnN0IHN0cmVhbWluZyA9IHRoaXMuc2V0dGluZ3Muc3RyZWFtaW5nXG4gICAgbmV3IE5vdGljZShcIkdlbmVyYXRpbmcgZmxhc2hjYXJkcy4uLlwiKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZ2VuZXJhdGVkRmxhc2hjYXJkcyA9IGF3YWl0IGdlbmVyYXRlRmxhc2hjYXJkcyhcbiAgICAgICAgY3VycmVudFRleHQsXG4gICAgICAgIGFwaUtleSxcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIHNlcCxcbiAgICAgICAgZmxhc2hjYXJkc0NvdW50LFxuICAgICAgICBhZGRpdGlvbmFsUHJvbXB0LFxuICAgICAgICBtYXhUb2tlbnMsXG4gICAgICAgIG11bHRpbGluZSxcbiAgICAgICAgc3RyZWFtaW5nXG4gICAgICApXG5cbiAgICAgIGxldCB1cGRhdGVkVGV4dCA9IFwiXCI7XG5cbiAgICAgIC8vIEdlbmVyYXRlIGFuZCBhZGQgdGhlIGhlYWRlciBpZiBub3QgYWxyZWFkeSBwcmVzZW50XG4gICAgICBpZiAoIWhhc0hlYWRlcikge1xuICAgICAgICB1cGRhdGVkVGV4dCArPSBcIlxcblxcbiMjIyBHZW5lcmF0ZWQgRmxhc2hjYXJkc1xcblwiO1xuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZSBhbmQgYWRkIHRoZSAjZmxhc2hjYXJkcyB0YWcgaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgICAgaWYgKCFoYXNUYWcpIHtcbiAgICAgICAgdXBkYXRlZFRleHQgKz0gXCIjZmxhc2hjYXJkc1xcblxcblwiO1xuICAgICAgfVxuICAgICAgXG4gICAgICBlZGl0b3Iuc2V0Q3Vyc29yKGVkaXRvci5sYXN0TGluZSgpKVxuICAgICAgZWRpdG9yLnJlcGxhY2VSYW5nZSh1cGRhdGVkVGV4dCwgZWRpdG9yLmdldEN1cnNvcigpKVxuXG4gICAgICBlZGl0b3Iuc2V0Q3Vyc29yKGVkaXRvci5sYXN0TGluZSgpKVxuICAgICAgZm9yIGF3YWl0IChjb25zdCB0ZXh0IG9mIGdlbmVyYXRlZEZsYXNoY2FyZHMpIHtcbiAgICAgICAgZWRpdG9yLnJlcGxhY2VSYW5nZSh0ZXh0LCBlZGl0b3IuZ2V0Q3Vyc29yKCkpXG4gICAgICAgIGNvbnN0IG9mZnNldDogbnVtYmVyID0gZWRpdG9yLnBvc1RvT2Zmc2V0KGVkaXRvci5nZXRDdXJzb3IoKSlcbiAgICAgICAgY29uc3QgbmV3UG9zaXRpb246IEVkaXRvclBvc2l0aW9uID0gZWRpdG9yLm9mZnNldFRvUG9zKG9mZnNldCArIHRleHQubGVuZ3RoKVxuICAgICAgICBlZGl0b3Iuc2V0Q3Vyc29yKG5ld1Bvc2l0aW9uKVxuICAgICAgfVxuICAgICAgbmV3IE5vdGljZShcIkZsYXNoY2FyZHMgc3VjY2VzZnVsbHkgZ2VuZXJhdGVkIVwiKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZ2VuZXJhdGluZyBmbGFzaGNhcmRzOlwiLCBlcnJvcik7XG4gICAgICBuZXcgTm90aWNlKFwiRXJyb3IgZ2VuZXJhdGluZyBmbGFzaGNhcmRzLiBQbGVhc2UgY2hlY2sgdGhlIHBsdWdpbiBjb25zb2xlIGZvciBkZXRhaWxzLlwiKTtcbiAgICB9XG4gIH1cblxuICBvbnVubG9hZCgpIHtcblxuICB9XG5cbiAgYXN5bmMgbG9hZFNldHRpbmdzKCkge1xuICAgIHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuICB9XG5cbiAgYXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuICAgIGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG4gIH1cbn1cblxuY2xhc3MgRmxhc2hjYXJkc1NldHRpbmdzVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gIHBsdWdpbjogRmxhc2hjYXJkc0xMTVBsdWdpbjtcblxuICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBGbGFzaGNhcmRzTExNUGx1Z2luKSB7XG4gICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICB9XG5cbiAgZGlzcGxheSgpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXG4gICAgY29udGFpbmVyRWwuZW1wdHkoKTtcblxuICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDNcIiwge3RleHQ6IFwiTW9kZWwgc2V0dGluZ3NcIn0pXG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAuc2V0TmFtZShcIk9wZW5BSSBBUEkga2V5XCIpXG4gICAgLnNldERlc2MoXCJFbnRlciB5b3VyIE9wZW5BSSBBUEkga2V5XCIpXG4gICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICB0ZXh0XG4gICAgICAuc2V0UGxhY2Vob2xkZXIoXCJBUEkga2V5XCIpXG4gICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXBpS2V5KVxuICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5hcGlLZXkgPSB2YWx1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAuc2V0TmFtZShcIk1vZGVsXCIpXG4gICAgLnNldERlc2MoXCJXaGljaCBsYW5ndWFnZSBtb2RlbCB0byB1c2VcIilcbiAgICAuYWRkRHJvcGRvd24oKGRyb3Bkb3duKSA9PlxuICAgICAgZHJvcGRvd25cbiAgICAgIC5hZGRPcHRpb25zKE9iamVjdC5mcm9tRW50cmllcyhhdmFpbGFibGVDb21wbGV0aW9uTW9kZWxzKCkubWFwKGsgPT4gW2ssIGtdKSkpXG4gICAgICAuYWRkT3B0aW9ucyhPYmplY3QuZnJvbUVudHJpZXMoYXZhaWxhYmxlQ2hhdE1vZGVscygpLm1hcChrID0+IFtrLCBrXSkpKVxuICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLm1vZGVsKVxuICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5tb2RlbCA9IHZhbHVlO1xuICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDNcIiwge3RleHQ6IFwiUHJlZmVyZW5jZXNcIn0pXG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAuc2V0TmFtZShcIlNlcGFyYXRvciBmb3IgaW5saW5lIGZsYXNoY2FyZHNcIilcbiAgICAuc2V0RGVzYyhcIk5vdGUgdGhhdCBhZnRlciBjaGFuZ2luZyB0aGlzIHlvdSBoYXZlIHRvIG1hbnVhbGx5IGVkaXQgYW55IGZsYXNoY2FyZHMgeW91IGFscmVhZHkgaGF2ZVwiKVxuICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgdGV4dFxuICAgICAgLnNldFBsYWNlaG9sZGVyKFwiOjpcIilcbiAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5pbmxpbmVTZXBhcmF0b3IpXG4gICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmlubGluZVNlcGFyYXRvciA9IHZhbHVlO1xuICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAuc2V0TmFtZShcIlNlcGFyYXRvciBmb3IgbXVsdGktbGluZSBmbGFzaGNhcmRzXCIpXG4gICAgLnNldERlc2MoXCJOb3RlIHRoYXQgYWZ0ZXIgY2hhbmdpbmcgdGhpcyB5b3UgaGF2ZSB0byBtYW51YWxseSBlZGl0IGFueSBmbGFzaGNhcmRzIHlvdSBhbHJlYWR5IGhhdmVcIilcbiAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgIHRleHRcbiAgICAgIC5zZXRQbGFjZWhvbGRlcihcIj9cIilcbiAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5tdWx0aWxpbmVTZXBhcmF0b3IpXG4gICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLm11bHRpbGluZVNlcGFyYXRvciA9IHZhbHVlO1xuICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgIC5zZXROYW1lKFwiTnVtYmVyIG9mIGZsYXNoY2FyZHMgdG8gZ2VuZXJhdGVcIilcbiAgICAuc2V0RGVzYyhcIlNldCB0aGlzIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgZmxhc2hjYXJkcyB0aGUgbW9kZWwgc2hvdWxkIFwiK1xuICAgICAgXCJnZW5lcmF0ZSBlYWNoIHRpbWUgYSBuZXcgYEdlbmVyYXRlIEZsYXNoY2FyZHNgIGNvbW1hbmQgaXMgaXNzdWVkXCIpXG4gICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICB0ZXh0XG4gICAgICAuc2V0UGxhY2Vob2xkZXIoXCIzXCIpXG4gICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZmxhc2hjYXJkc0NvdW50LnRvU3RyaW5nKCkpXG4gICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmZsYXNoY2FyZHNDb3VudCA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgLnNldE5hbWUoXCJBZGRpdGlvbmFsIHByb21wdFwiKVxuICAgIC5zZXREZXNjKFwiUHJvdmlkZSBhZGRpdGlvbmFsIGluc3RydWN0aW9ucyB0byB0aGUgbGFuZ3VhZ2UgbW9kZWxcIilcbiAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgIHRleHRcbiAgICAgIC5zZXRQbGFjZWhvbGRlcihcIkFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zXCIpXG4gICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYWRkaXRpb25hbFByb21wdClcbiAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuYWRkaXRpb25hbFByb21wdCA9IHZhbHVlO1xuICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgIC5zZXROYW1lKFwiTWF4aW11bSBvdXRwdXQgdG9rZW5zXCIpXG4gICAgLnNldERlc2MoXCJTZXQgdGhpcyB0byB0aGUgdG90YWwgbnVtYmVyIG9mIHRva2VucyB0aGUgbW9kZWwgY2FuIGdlbmVyYXRlXCIpXG4gICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICB0ZXh0XG4gICAgICAuc2V0UGxhY2Vob2xkZXIoXCIzMDBcIilcbiAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5tYXhUb2tlbnMudG9TdHJpbmcoKSlcbiAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MubWF4VG9rZW5zID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAuc2V0TmFtZShcIlN0cmVhbWluZ1wiKVxuICAgIC5zZXREZXNjKFwiRW5hYmxlL0Rpc2FibGUgc3RyZWFtaW5nIHRleHQgY29tcGxldGlvblwiKVxuICAgIC5hZGRUb2dnbGUoKG9uKSA9PiBcbiAgICAgIG9uXG4gICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Muc3RyZWFtaW5nKVxuICAgICAgLm9uQ2hhbmdlKGFzeW5jIChvbikgPT4ge1xuICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5zdHJlYW1pbmcgPSBvbjtcbiAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICB9KVxuICAgIClcbiAgfVxufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBhdmFpbGFibGVDaGF0TW9kZWxzKCk6IEFycmF5PHN0cmluZz4ge1xuICByZXR1cm4gW1wiZ3B0LTMuNS10dXJib1wiLCBcImdwdC00XCIsIFwiZ3B0LTQtdHVyYm9cIiwgXCJncHQtNG9cIl1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF2YWlsYWJsZUNvbXBsZXRpb25Nb2RlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gIHJldHVybiBbXVxufVxuIiwgImV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuNDcuMSc7IC8vIHgtcmVsZWFzZS1wbGVhc2UtdmVyc2lvblxuIiwgIi8qKlxuICogRGlzY2xhaW1lcjogbW9kdWxlcyBpbiBfc2hpbXMgYXJlbid0IGludGVuZGVkIHRvIGJlIGltcG9ydGVkIGJ5IFNESyB1c2Vycy5cbiAqL1xuaW1wb3J0IHsgdHlwZSBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNoaW1zIHtcbiAga2luZDogc3RyaW5nO1xuICBmZXRjaDogYW55O1xuICBSZXF1ZXN0OiBhbnk7XG4gIFJlc3BvbnNlOiBhbnk7XG4gIEhlYWRlcnM6IGFueTtcbiAgRm9ybURhdGE6IGFueTtcbiAgQmxvYjogYW55O1xuICBGaWxlOiBhbnk7XG4gIFJlYWRhYmxlU3RyZWFtOiBhbnk7XG4gIGdldE11bHRpcGFydFJlcXVlc3RPcHRpb25zOiA8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICBmb3JtOiBTaGltc1snRm9ybURhdGEnXSxcbiAgICBvcHRzOiBSZXF1ZXN0T3B0aW9uczxUPixcbiAgKSA9PiBQcm9taXNlPFJlcXVlc3RPcHRpb25zPFQ+PjtcbiAgZ2V0RGVmYXVsdEFnZW50OiAodXJsOiBzdHJpbmcpID0+IGFueTtcbiAgZmlsZUZyb21QYXRoOlxuICAgIHwgKChwYXRoOiBzdHJpbmcsIGZpbGVuYW1lPzogc3RyaW5nLCBvcHRpb25zPzoge30pID0+IFByb21pc2U8U2hpbXNbJ0ZpbGUnXT4pXG4gICAgfCAoKHBhdGg6IHN0cmluZywgb3B0aW9ucz86IHt9KSA9PiBQcm9taXNlPFNoaW1zWydGaWxlJ10+KTtcbiAgaXNGc1JlYWRTdHJlYW06ICh2YWx1ZTogYW55KSA9PiBib29sZWFuO1xufVxuXG5leHBvcnQgbGV0IGF1dG8gPSBmYWxzZTtcbmV4cG9ydCBsZXQga2luZDogU2hpbXNbJ2tpbmQnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgZmV0Y2g6IFNoaW1zWydmZXRjaCddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBSZXF1ZXN0OiBTaGltc1snUmVxdWVzdCddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBSZXNwb25zZTogU2hpbXNbJ1Jlc3BvbnNlJ10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IEhlYWRlcnM6IFNoaW1zWydIZWFkZXJzJ10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IEZvcm1EYXRhOiBTaGltc1snRm9ybURhdGEnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgQmxvYjogU2hpbXNbJ0Jsb2InXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgRmlsZTogU2hpbXNbJ0ZpbGUnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgUmVhZGFibGVTdHJlYW06IFNoaW1zWydSZWFkYWJsZVN0cmVhbSddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBnZXRNdWx0aXBhcnRSZXF1ZXN0T3B0aW9uczogU2hpbXNbJ2dldE11bHRpcGFydFJlcXVlc3RPcHRpb25zJ10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IGdldERlZmF1bHRBZ2VudDogU2hpbXNbJ2dldERlZmF1bHRBZ2VudCddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBmaWxlRnJvbVBhdGg6IFNoaW1zWydmaWxlRnJvbVBhdGgnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgaXNGc1JlYWRTdHJlYW06IFNoaW1zWydpc0ZzUmVhZFN0cmVhbSddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0U2hpbXMoc2hpbXM6IFNoaW1zLCBvcHRpb25zOiB7IGF1dG86IGJvb2xlYW4gfSA9IHsgYXV0bzogZmFsc2UgfSkge1xuICBpZiAoYXV0bykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGB5b3UgbXVzdCBcXGBpbXBvcnQgJ29wZW5haS9zaGltcy8ke3NoaW1zLmtpbmR9J1xcYCBiZWZvcmUgaW1wb3J0aW5nIGFueXRoaW5nIGVsc2UgZnJvbSBvcGVuYWlgLFxuICAgICk7XG4gIH1cbiAgaWYgKGtpbmQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbid0IFxcYGltcG9ydCAnb3BlbmFpL3NoaW1zLyR7c2hpbXMua2luZH0nXFxgIGFmdGVyIFxcYGltcG9ydCAnb3BlbmFpL3NoaW1zLyR7a2luZH0nXFxgYCk7XG4gIH1cbiAgYXV0byA9IG9wdGlvbnMuYXV0bztcbiAga2luZCA9IHNoaW1zLmtpbmQ7XG4gIGZldGNoID0gc2hpbXMuZmV0Y2g7XG4gIFJlcXVlc3QgPSBzaGltcy5SZXF1ZXN0O1xuICBSZXNwb25zZSA9IHNoaW1zLlJlc3BvbnNlO1xuICBIZWFkZXJzID0gc2hpbXMuSGVhZGVycztcbiAgRm9ybURhdGEgPSBzaGltcy5Gb3JtRGF0YTtcbiAgQmxvYiA9IHNoaW1zLkJsb2I7XG4gIEZpbGUgPSBzaGltcy5GaWxlO1xuICBSZWFkYWJsZVN0cmVhbSA9IHNoaW1zLlJlYWRhYmxlU3RyZWFtO1xuICBnZXRNdWx0aXBhcnRSZXF1ZXN0T3B0aW9ucyA9IHNoaW1zLmdldE11bHRpcGFydFJlcXVlc3RPcHRpb25zO1xuICBnZXREZWZhdWx0QWdlbnQgPSBzaGltcy5nZXREZWZhdWx0QWdlbnQ7XG4gIGZpbGVGcm9tUGF0aCA9IHNoaW1zLmZpbGVGcm9tUGF0aDtcbiAgaXNGc1JlYWRTdHJlYW0gPSBzaGltcy5pc0ZzUmVhZFN0cmVhbTtcbn1cbiIsICIvKipcbiAqIERpc2NsYWltZXI6IG1vZHVsZXMgaW4gX3NoaW1zIGFyZW4ndCBpbnRlbmRlZCB0byBiZSBpbXBvcnRlZCBieSBTREsgdXNlcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBNdWx0aXBhcnRCb2R5IHtcbiAgY29uc3RydWN0b3IocHVibGljIGJvZHk6IGFueSkge31cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdNdWx0aXBhcnRCb2R5JztcbiAgfVxufVxuIiwgIi8qKlxuICogRGlzY2xhaW1lcjogbW9kdWxlcyBpbiBfc2hpbXMgYXJlbid0IGludGVuZGVkIHRvIGJlIGltcG9ydGVkIGJ5IFNESyB1c2Vycy5cbiAqL1xuaW1wb3J0IHsgTXVsdGlwYXJ0Qm9keSB9IGZyb20gJy4vTXVsdGlwYXJ0Qm9keSc7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgeyB0eXBlIFNoaW1zIH0gZnJvbSAnLi9yZWdpc3RyeSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW50aW1lKHsgbWFudWFsbHlJbXBvcnRlZCB9OiB7IG1hbnVhbGx5SW1wb3J0ZWQ/OiBib29sZWFuIH0gPSB7fSk6IFNoaW1zIHtcbiAgY29uc3QgcmVjb21tZW5kYXRpb24gPVxuICAgIG1hbnVhbGx5SW1wb3J0ZWQgP1xuICAgICAgYFlvdSBtYXkgbmVlZCB0byB1c2UgcG9seWZpbGxzYFxuICAgIDogYEFkZCBvbmUgb2YgdGhlc2UgaW1wb3J0cyBiZWZvcmUgeW91ciBmaXJzdCBcXGBpbXBvcnQgXHUyMDI2IGZyb20gJ29wZW5haSdcXGA6XG4tIFxcYGltcG9ydCAnb3BlbmFpL3NoaW1zL25vZGUnXFxgIChpZiB5b3UncmUgcnVubmluZyBvbiBOb2RlKVxuLSBcXGBpbXBvcnQgJ29wZW5haS9zaGltcy93ZWInXFxgIChvdGhlcndpc2UpXG5gO1xuXG4gIGxldCBfZmV0Y2gsIF9SZXF1ZXN0LCBfUmVzcG9uc2UsIF9IZWFkZXJzO1xuICB0cnkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBfZmV0Y2ggPSBmZXRjaDtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgX1JlcXVlc3QgPSBSZXF1ZXN0O1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBfUmVzcG9uc2UgPSBSZXNwb25zZTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgX0hlYWRlcnMgPSBIZWFkZXJzO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGB0aGlzIGVudmlyb25tZW50IGlzIG1pc3NpbmcgdGhlIGZvbGxvd2luZyBXZWIgRmV0Y2ggQVBJIHR5cGU6ICR7XG4gICAgICAgIChlcnJvciBhcyBhbnkpLm1lc3NhZ2VcbiAgICAgIH0uICR7cmVjb21tZW5kYXRpb259YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBraW5kOiAnd2ViJyxcbiAgICBmZXRjaDogX2ZldGNoLFxuICAgIFJlcXVlc3Q6IF9SZXF1ZXN0LFxuICAgIFJlc3BvbnNlOiBfUmVzcG9uc2UsXG4gICAgSGVhZGVyczogX0hlYWRlcnMsXG4gICAgRm9ybURhdGE6XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnID8gRm9ybURhdGEgOiAoXG4gICAgICAgIGNsYXNzIEZvcm1EYXRhIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBmaWxlIHVwbG9hZHMgYXJlbid0IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IHlldCBhcyAnRm9ybURhdGEnIGlzIHVuZGVmaW5lZC4gJHtyZWNvbW1lbmRhdGlvbn1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgQmxvYjpcbiAgICAgIHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyA/IEJsb2IgOiAoXG4gICAgICAgIGNsYXNzIEJsb2Ige1xuICAgICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgZmlsZSB1cGxvYWRzIGFyZW4ndCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCB5ZXQgYXMgJ0Jsb2InIGlzIHVuZGVmaW5lZC4gJHtyZWNvbW1lbmRhdGlvbn1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgRmlsZTpcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHR5cGVvZiBGaWxlICE9PSAndW5kZWZpbmVkJyA/IEZpbGUgOiAoXG4gICAgICAgIGNsYXNzIEZpbGUge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYGZpbGUgdXBsb2FkcyBhcmVuJ3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQgeWV0IGFzICdGaWxlJyBpcyB1bmRlZmluZWQuICR7cmVjb21tZW5kYXRpb259YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApLFxuICAgIFJlYWRhYmxlU3RyZWFtOlxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdHlwZW9mIFJlYWRhYmxlU3RyZWFtICE9PSAndW5kZWZpbmVkJyA/IFJlYWRhYmxlU3RyZWFtIDogKFxuICAgICAgICBjbGFzcyBSZWFkYWJsZVN0cmVhbSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgc3RyZWFtaW5nIGlzbid0IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IHlldCBhcyAnUmVhZGFibGVTdHJlYW0nIGlzIHVuZGVmaW5lZC4gJHtyZWNvbW1lbmRhdGlvbn1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgZ2V0TXVsdGlwYXJ0UmVxdWVzdE9wdGlvbnM6IGFzeW5jIDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9ybTogRm9ybURhdGEsXG4gICAgICBvcHRzOiBSZXF1ZXN0T3B0aW9uczxUPixcbiAgICApOiBQcm9taXNlPFJlcXVlc3RPcHRpb25zPFQ+PiA9PiAoe1xuICAgICAgLi4ub3B0cyxcbiAgICAgIGJvZHk6IG5ldyBNdWx0aXBhcnRCb2R5KGZvcm0pIGFzIGFueSxcbiAgICB9KSxcbiAgICBnZXREZWZhdWx0QWdlbnQ6ICh1cmw6IHN0cmluZykgPT4gdW5kZWZpbmVkLFxuICAgIGZpbGVGcm9tUGF0aDogKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIGBmaWxlRnJvbVBhdGhgIGZ1bmN0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGluIE5vZGUuIFNlZSB0aGUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHM6IGh0dHBzOi8vd3d3LmdpdGh1Yi5jb20vb3BlbmFpL29wZW5haS1ub2RlI2ZpbGUtdXBsb2FkcycsXG4gICAgICApO1xuICAgIH0sXG4gICAgaXNGc1JlYWRTdHJlYW06ICh2YWx1ZTogYW55KSA9PiBmYWxzZSxcbiAgfTtcbn1cbiIsICIvKipcbiAqIERpc2NsYWltZXI6IG1vZHVsZXMgaW4gX3NoaW1zIGFyZW4ndCBpbnRlbmRlZCB0byBiZSBpbXBvcnRlZCBieSBTREsgdXNlcnMuXG4gKi9cbmltcG9ydCAqIGFzIHNoaW1zIGZyb20gJy4vcmVnaXN0cnkubWpzJztcbmltcG9ydCAqIGFzIGF1dG8gZnJvbSAnb3BlbmFpL19zaGltcy9hdXRvL3J1bnRpbWUnO1xuaWYgKCFzaGltcy5raW5kKSBzaGltcy5zZXRTaGltcyhhdXRvLmdldFJ1bnRpbWUoKSwgeyBhdXRvOiB0cnVlIH0pO1xuZXhwb3J0ICogZnJvbSAnLi9yZWdpc3RyeS5tanMnO1xuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCB7IGNhc3RUb0Vycm9yLCBIZWFkZXJzIH0gZnJvbSAnLi9jb3JlJztcblxuZXhwb3J0IGNsYXNzIE9wZW5BSUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuZXhwb3J0IGNsYXNzIEFQSUVycm9yIGV4dGVuZHMgT3BlbkFJRXJyb3Ige1xuICByZWFkb25seSBzdGF0dXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZXJyb3I6IE9iamVjdCB8IHVuZGVmaW5lZDtcblxuICByZWFkb25seSBjb2RlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBwYXJhbTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgdHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IHJlcXVlc3RfaWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc3RhdHVzOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgZXJyb3I6IE9iamVjdCB8IHVuZGVmaW5lZCxcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgaGVhZGVyczogSGVhZGVycyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgc3VwZXIoYCR7QVBJRXJyb3IubWFrZU1lc3NhZ2Uoc3RhdHVzLCBlcnJvciwgbWVzc2FnZSl9YCk7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICB0aGlzLnJlcXVlc3RfaWQgPSBoZWFkZXJzPy5bJ3gtcmVxdWVzdC1pZCddO1xuXG4gICAgY29uc3QgZGF0YSA9IGVycm9yIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgdGhpcy5lcnJvciA9IGRhdGE7XG4gICAgdGhpcy5jb2RlID0gZGF0YT8uWydjb2RlJ107XG4gICAgdGhpcy5wYXJhbSA9IGRhdGE/LlsncGFyYW0nXTtcbiAgICB0aGlzLnR5cGUgPSBkYXRhPy5bJ3R5cGUnXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG1ha2VNZXNzYWdlKHN0YXR1czogbnVtYmVyIHwgdW5kZWZpbmVkLCBlcnJvcjogYW55LCBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBtc2cgPVxuICAgICAgZXJyb3I/Lm1lc3NhZ2UgP1xuICAgICAgICB0eXBlb2YgZXJyb3IubWVzc2FnZSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgIGVycm9yLm1lc3NhZ2VcbiAgICAgICAgOiBKU09OLnN0cmluZ2lmeShlcnJvci5tZXNzYWdlKVxuICAgICAgOiBlcnJvciA/IEpTT04uc3RyaW5naWZ5KGVycm9yKVxuICAgICAgOiBtZXNzYWdlO1xuXG4gICAgaWYgKHN0YXR1cyAmJiBtc2cpIHtcbiAgICAgIHJldHVybiBgJHtzdGF0dXN9ICR7bXNnfWA7XG4gICAgfVxuICAgIGlmIChzdGF0dXMpIHtcbiAgICAgIHJldHVybiBgJHtzdGF0dXN9IHN0YXR1cyBjb2RlIChubyBib2R5KWA7XG4gICAgfVxuICAgIGlmIChtc2cpIHtcbiAgICAgIHJldHVybiBtc2c7XG4gICAgfVxuICAgIHJldHVybiAnKG5vIHN0YXR1cyBjb2RlIG9yIGJvZHkpJztcbiAgfVxuXG4gIHN0YXRpYyBnZW5lcmF0ZShcbiAgICBzdGF0dXM6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBlcnJvclJlc3BvbnNlOiBPYmplY3QgfCB1bmRlZmluZWQsXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGhlYWRlcnM6IEhlYWRlcnMgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIGlmICghc3RhdHVzKSB7XG4gICAgICByZXR1cm4gbmV3IEFQSUNvbm5lY3Rpb25FcnJvcih7IGNhdXNlOiBjYXN0VG9FcnJvcihlcnJvclJlc3BvbnNlKSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvciA9IChlcnJvclJlc3BvbnNlIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pPy5bJ2Vycm9yJ107XG5cbiAgICBpZiAoc3RhdHVzID09PSA0MDApIHtcbiAgICAgIHJldHVybiBuZXcgQmFkUmVxdWVzdEVycm9yKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgcmV0dXJuIG5ldyBBdXRoZW50aWNhdGlvbkVycm9yKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgcmV0dXJuIG5ldyBQZXJtaXNzaW9uRGVuaWVkRXJyb3Ioc3RhdHVzLCBlcnJvciwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3Ioc3RhdHVzLCBlcnJvciwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3Ioc3RhdHVzLCBlcnJvciwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gNDIyKSB7XG4gICAgICByZXR1cm4gbmV3IFVucHJvY2Vzc2FibGVFbnRpdHlFcnJvcihzdGF0dXMsIGVycm9yLCBtZXNzYWdlLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzID09PSA0MjkpIHtcbiAgICAgIHJldHVybiBuZXcgUmF0ZUxpbWl0RXJyb3Ioc3RhdHVzLCBlcnJvciwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA+PSA1MDApIHtcbiAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvcihzdGF0dXMsIGVycm9yLCBtZXNzYWdlLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFQSUVycm9yKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBUElVc2VyQWJvcnRFcnJvciBleHRlbmRzIEFQSUVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgc3RhdHVzOiB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBzdXBlcih1bmRlZmluZWQsIHVuZGVmaW5lZCwgbWVzc2FnZSB8fCAnUmVxdWVzdCB3YXMgYWJvcnRlZC4nLCB1bmRlZmluZWQpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBUElDb25uZWN0aW9uRXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHN0YXR1czogdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHsgbWVzc2FnZSwgY2F1c2UgfTogeyBtZXNzYWdlPzogc3RyaW5nOyBjYXVzZT86IEVycm9yIHwgdW5kZWZpbmVkIH0pIHtcbiAgICBzdXBlcih1bmRlZmluZWQsIHVuZGVmaW5lZCwgbWVzc2FnZSB8fCAnQ29ubmVjdGlvbiBlcnJvci4nLCB1bmRlZmluZWQpO1xuICAgIC8vIGluIHNvbWUgZW52aXJvbm1lbnRzIHRoZSAnY2F1c2UnIHByb3BlcnR5IGlzIGFscmVhZHkgZGVjbGFyZWRcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKGNhdXNlKSB0aGlzLmNhdXNlID0gY2F1c2U7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3IgZXh0ZW5kcyBBUElDb25uZWN0aW9uRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIHN1cGVyKHsgbWVzc2FnZTogbWVzc2FnZSA/PyAnUmVxdWVzdCB0aW1lZCBvdXQuJyB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmFkUmVxdWVzdEVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBzdGF0dXM6IDQwMCA9IDQwMDtcbn1cblxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0aW9uRXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHN0YXR1czogNDAxID0gNDAxO1xufVxuXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbkRlbmllZEVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBzdGF0dXM6IDQwMyA9IDQwMztcbn1cblxuZXhwb3J0IGNsYXNzIE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHN0YXR1czogNDA0ID0gNDA0O1xufVxuXG5leHBvcnQgY2xhc3MgQ29uZmxpY3RFcnJvciBleHRlbmRzIEFQSUVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgc3RhdHVzOiA0MDkgPSA0MDk7XG59XG5cbmV4cG9ydCBjbGFzcyBVbnByb2Nlc3NhYmxlRW50aXR5RXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHN0YXR1czogNDIyID0gNDIyO1xufVxuXG5leHBvcnQgY2xhc3MgUmF0ZUxpbWl0RXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHN0YXR1czogNDI5ID0gNDI5O1xufVxuXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxTZXJ2ZXJFcnJvciBleHRlbmRzIEFQSUVycm9yIHt9XG4iLCAiaW1wb3J0IHsgUmVhZGFibGVTdHJlYW0sIHR5cGUgUmVzcG9uc2UgfSBmcm9tICcuL19zaGltcy9pbmRleCc7XG5pbXBvcnQgeyBPcGVuQUlFcnJvciB9IGZyb20gJy4vZXJyb3InO1xuXG5pbXBvcnQgeyBBUElFcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5cbnR5cGUgQnl0ZXMgPSBzdHJpbmcgfCBBcnJheUJ1ZmZlciB8IFVpbnQ4QXJyYXkgfCBCdWZmZXIgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgdHlwZSBTZXJ2ZXJTZW50RXZlbnQgPSB7XG4gIGV2ZW50OiBzdHJpbmcgfCBudWxsO1xuICBkYXRhOiBzdHJpbmc7XG4gIHJhdzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgY2xhc3MgU3RyZWFtPEl0ZW0+IGltcGxlbWVudHMgQXN5bmNJdGVyYWJsZTxJdGVtPiB7XG4gIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGl0ZXJhdG9yOiAoKSA9PiBBc3luY0l0ZXJhdG9yPEl0ZW0+LFxuICAgIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcixcbiAgKSB7XG4gICAgdGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tU1NFUmVzcG9uc2U8SXRlbT4ocmVzcG9uc2U6IFJlc3BvbnNlLCBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIpIHtcbiAgICBsZXQgY29uc3VtZWQgPSBmYWxzZTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uKiBpdGVyYXRvcigpOiBBc3luY0l0ZXJhdG9yPEl0ZW0sIGFueSwgdW5kZWZpbmVkPiB7XG4gICAgICBpZiAoY29uc3VtZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgaXRlcmF0ZSBvdmVyIGEgY29uc3VtZWQgc3RyZWFtLCB1c2UgYC50ZWUoKWAgdG8gc3BsaXQgdGhlIHN0cmVhbS4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN1bWVkID0gdHJ1ZTtcbiAgICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHNzZSBvZiBfaXRlclNTRU1lc3NhZ2VzKHJlc3BvbnNlLCBjb250cm9sbGVyKSkge1xuICAgICAgICAgIGlmIChkb25lKSBjb250aW51ZTtcblxuICAgICAgICAgIGlmIChzc2UuZGF0YS5zdGFydHNXaXRoKCdbRE9ORV0nKSkge1xuICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc3NlLmV2ZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgZGF0YTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2Uoc3NlLmRhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDb3VsZCBub3QgcGFyc2UgbWVzc2FnZSBpbnRvIEpTT046YCwgc3NlLmRhdGEpO1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGcm9tIGNodW5rOmAsIHNzZS5yYXcpO1xuICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBBUElFcnJvcih1bmRlZmluZWQsIGRhdGEuZXJyb3IsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgeWllbGQgZGF0YTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGRhdGE7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShzc2UuZGF0YSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCBwYXJzZSBtZXNzYWdlIGludG8gSlNPTjpgLCBzc2UuZGF0YSk7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZyb20gY2h1bms6YCwgc3NlLnJhdyk7XG4gICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUT0RPOiBJcyB0aGlzIHdoZXJlIHRoZSBlcnJvciBzaG91bGQgYmUgdGhyb3duP1xuICAgICAgICAgICAgaWYgKHNzZS5ldmVudCA9PSAnZXJyb3InKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBBUElFcnJvcih1bmRlZmluZWQsIGRhdGEuZXJyb3IsIGRhdGEubWVzc2FnZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIHsgZXZlbnQ6IHNzZS5ldmVudCwgZGF0YTogZGF0YSB9IGFzIGFueTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElmIHRoZSB1c2VyIGNhbGxzIGBzdHJlYW0uY29udHJvbGxlci5hYm9ydCgpYCwgd2Ugc2hvdWxkIGV4aXQgd2l0aG91dCB0aHJvd2luZy5cbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm5hbWUgPT09ICdBYm9ydEVycm9yJykgcmV0dXJuO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8gSWYgdGhlIHVzZXIgYGJyZWFrYHMsIGFib3J0IHRoZSBvbmdvaW5nIHJlcXVlc3QuXG4gICAgICAgIGlmICghZG9uZSkgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgU3RyZWFtKGl0ZXJhdG9yLCBjb250cm9sbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBTdHJlYW0gZnJvbSBhIG5ld2xpbmUtc2VwYXJhdGVkIFJlYWRhYmxlU3RyZWFtXG4gICAqIHdoZXJlIGVhY2ggaXRlbSBpcyBhIEpTT04gdmFsdWUuXG4gICAqL1xuICBzdGF0aWMgZnJvbVJlYWRhYmxlU3RyZWFtPEl0ZW0+KHJlYWRhYmxlU3RyZWFtOiBSZWFkYWJsZVN0cmVhbSwgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyKSB7XG4gICAgbGV0IGNvbnN1bWVkID0gZmFsc2U7XG5cbiAgICBhc3luYyBmdW5jdGlvbiogaXRlckxpbmVzKCk6IEFzeW5jR2VuZXJhdG9yPHN0cmluZywgdm9pZCwgdW5rbm93bj4ge1xuICAgICAgY29uc3QgbGluZURlY29kZXIgPSBuZXcgTGluZURlY29kZXIoKTtcblxuICAgICAgY29uc3QgaXRlciA9IHJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYWJsZTxCeXRlcz4ocmVhZGFibGVTdHJlYW0pO1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBpdGVyKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lRGVjb2Rlci5kZWNvZGUoY2h1bmspKSB7XG4gICAgICAgICAgeWllbGQgbGluZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZURlY29kZXIuZmx1c2goKSkge1xuICAgICAgICB5aWVsZCBsaW5lO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uKiBpdGVyYXRvcigpOiBBc3luY0l0ZXJhdG9yPEl0ZW0sIGFueSwgdW5kZWZpbmVkPiB7XG4gICAgICBpZiAoY29uc3VtZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgaXRlcmF0ZSBvdmVyIGEgY29uc3VtZWQgc3RyZWFtLCB1c2UgYC50ZWUoKWAgdG8gc3BsaXQgdGhlIHN0cmVhbS4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN1bWVkID0gdHJ1ZTtcbiAgICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGxpbmUgb2YgaXRlckxpbmVzKCkpIHtcbiAgICAgICAgICBpZiAoZG9uZSkgY29udGludWU7XG4gICAgICAgICAgaWYgKGxpbmUpIHlpZWxkIEpTT04ucGFyc2UobGluZSk7XG4gICAgICAgIH1cbiAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElmIHRoZSB1c2VyIGNhbGxzIGBzdHJlYW0uY29udHJvbGxlci5hYm9ydCgpYCwgd2Ugc2hvdWxkIGV4aXQgd2l0aG91dCB0aHJvd2luZy5cbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm5hbWUgPT09ICdBYm9ydEVycm9yJykgcmV0dXJuO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8gSWYgdGhlIHVzZXIgYGJyZWFrYHMsIGFib3J0IHRoZSBvbmdvaW5nIHJlcXVlc3QuXG4gICAgICAgIGlmICghZG9uZSkgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgU3RyZWFtKGl0ZXJhdG9yLCBjb250cm9sbGVyKTtcbiAgfVxuXG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTogQXN5bmNJdGVyYXRvcjxJdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlcmF0b3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgdGhlIHN0cmVhbSBpbnRvIHR3byBzdHJlYW1zIHdoaWNoIGNhbiBiZVxuICAgKiBpbmRlcGVuZGVudGx5IHJlYWQgZnJvbSBhdCBkaWZmZXJlbnQgc3BlZWRzLlxuICAgKi9cbiAgdGVlKCk6IFtTdHJlYW08SXRlbT4sIFN0cmVhbTxJdGVtPl0ge1xuICAgIGNvbnN0IGxlZnQ6IEFycmF5PFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8SXRlbT4+PiA9IFtdO1xuICAgIGNvbnN0IHJpZ2h0OiBBcnJheTxQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PEl0ZW0+Pj4gPSBbXTtcbiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3IoKTtcblxuICAgIGNvbnN0IHRlZUl0ZXJhdG9yID0gKHF1ZXVlOiBBcnJheTxQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PEl0ZW0+Pj4pOiBBc3luY0l0ZXJhdG9yPEl0ZW0+ID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICBsZWZ0LnB1c2gocmVzdWx0KTtcbiAgICAgICAgICAgIHJpZ2h0LnB1c2gocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHF1ZXVlLnNoaWZ0KCkhO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIG5ldyBTdHJlYW0oKCkgPT4gdGVlSXRlcmF0b3IobGVmdCksIHRoaXMuY29udHJvbGxlciksXG4gICAgICBuZXcgU3RyZWFtKCgpID0+IHRlZUl0ZXJhdG9yKHJpZ2h0KSwgdGhpcy5jb250cm9sbGVyKSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoaXMgc3RyZWFtIHRvIGEgbmV3bGluZS1zZXBhcmF0ZWQgUmVhZGFibGVTdHJlYW0gb2ZcbiAgICogSlNPTiBzdHJpbmdpZmllZCB2YWx1ZXMgaW4gdGhlIHN0cmVhbVxuICAgKiB3aGljaCBjYW4gYmUgdHVybmVkIGJhY2sgaW50byBhIFN0cmVhbSB3aXRoIGBTdHJlYW0uZnJvbVJlYWRhYmxlU3RyZWFtKClgLlxuICAgKi9cbiAgdG9SZWFkYWJsZVN0cmVhbSgpOiBSZWFkYWJsZVN0cmVhbSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgbGV0IGl0ZXI6IEFzeW5jSXRlcmF0b3I8SXRlbT47XG4gICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuXG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICBhc3luYyBzdGFydCgpIHtcbiAgICAgICAgaXRlciA9IHNlbGZbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gICAgICB9LFxuICAgICAgYXN5bmMgcHVsbChjdHJsOiBhbnkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCBpdGVyLm5leHQoKTtcbiAgICAgICAgICBpZiAoZG9uZSkgcmV0dXJuIGN0cmwuY2xvc2UoKTtcblxuICAgICAgICAgIGNvbnN0IGJ5dGVzID0gZW5jb2Rlci5lbmNvZGUoSlNPTi5zdHJpbmdpZnkodmFsdWUpICsgJ1xcbicpO1xuXG4gICAgICAgICAgY3RybC5lbnF1ZXVlKGJ5dGVzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY3RybC5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgY2FuY2VsKCkge1xuICAgICAgICBhd2FpdCBpdGVyLnJldHVybj8uKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiogX2l0ZXJTU0VNZXNzYWdlcyhcbiAgcmVzcG9uc2U6IFJlc3BvbnNlLFxuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIsXG4pOiBBc3luY0dlbmVyYXRvcjxTZXJ2ZXJTZW50RXZlbnQsIHZvaWQsIHVua25vd24+IHtcbiAgaWYgKCFyZXNwb25zZS5ib2R5KSB7XG4gICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihgQXR0ZW1wdGVkIHRvIGl0ZXJhdGUgb3ZlciBhIHJlc3BvbnNlIHdpdGggbm8gYm9keWApO1xuICB9XG5cbiAgY29uc3Qgc3NlRGVjb2RlciA9IG5ldyBTU0VEZWNvZGVyKCk7XG4gIGNvbnN0IGxpbmVEZWNvZGVyID0gbmV3IExpbmVEZWNvZGVyKCk7XG5cbiAgY29uc3QgaXRlciA9IHJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYWJsZTxCeXRlcz4ocmVzcG9uc2UuYm9keSk7XG4gIGZvciBhd2FpdCAoY29uc3Qgc3NlQ2h1bmsgb2YgaXRlclNTRUNodW5rcyhpdGVyKSkge1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lRGVjb2Rlci5kZWNvZGUoc3NlQ2h1bmspKSB7XG4gICAgICBjb25zdCBzc2UgPSBzc2VEZWNvZGVyLmRlY29kZShsaW5lKTtcbiAgICAgIGlmIChzc2UpIHlpZWxkIHNzZTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZURlY29kZXIuZmx1c2goKSkge1xuICAgIGNvbnN0IHNzZSA9IHNzZURlY29kZXIuZGVjb2RlKGxpbmUpO1xuICAgIGlmIChzc2UpIHlpZWxkIHNzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdpdmVuIGFuIGFzeW5jIGl0ZXJhYmxlIGl0ZXJhdG9yLCBpdGVyYXRlcyBvdmVyIGl0IGFuZCB5aWVsZHMgZnVsbFxuICogU1NFIGNodW5rcywgaS5lLiB5aWVsZHMgd2hlbiBhIGRvdWJsZSBuZXctbGluZSBpcyBlbmNvdW50ZXJlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24qIGl0ZXJTU0VDaHVua3MoaXRlcmF0b3I6IEFzeW5jSXRlcmFibGVJdGVyYXRvcjxCeXRlcz4pOiBBc3luY0dlbmVyYXRvcjxVaW50OEFycmF5PiB7XG4gIGxldCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoKTtcblxuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGl0ZXJhdG9yKSB7XG4gICAgaWYgKGNodW5rID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGJpbmFyeUNodW5rID1cbiAgICAgIGNodW5rIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBuZXcgVWludDhBcnJheShjaHVuaylcbiAgICAgIDogdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJyA/IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShjaHVuaylcbiAgICAgIDogY2h1bms7XG5cbiAgICBsZXQgbmV3RGF0YSA9IG5ldyBVaW50OEFycmF5KGRhdGEubGVuZ3RoICsgYmluYXJ5Q2h1bmsubGVuZ3RoKTtcbiAgICBuZXdEYXRhLnNldChkYXRhKTtcbiAgICBuZXdEYXRhLnNldChiaW5hcnlDaHVuaywgZGF0YS5sZW5ndGgpO1xuICAgIGRhdGEgPSBuZXdEYXRhO1xuXG4gICAgbGV0IHBhdHRlcm5JbmRleDtcbiAgICB3aGlsZSAoKHBhdHRlcm5JbmRleCA9IGZpbmREb3VibGVOZXdsaW5lSW5kZXgoZGF0YSkpICE9PSAtMSkge1xuICAgICAgeWllbGQgZGF0YS5zbGljZSgwLCBwYXR0ZXJuSW5kZXgpO1xuICAgICAgZGF0YSA9IGRhdGEuc2xpY2UocGF0dGVybkluZGV4KTtcbiAgICB9XG4gIH1cblxuICBpZiAoZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgeWllbGQgZGF0YTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRG91YmxlTmV3bGluZUluZGV4KGJ1ZmZlcjogVWludDhBcnJheSk6IG51bWJlciB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgdGhlIGJ1ZmZlciBmb3IgdGhlIGVuZCBwYXR0ZXJucyAoXFxyXFxyLCBcXG5cXG4sIFxcclxcblxcclxcbilcbiAgLy8gYW5kIHJldHVybnMgdGhlIGluZGV4IHJpZ2h0IGFmdGVyIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGFueSBwYXR0ZXJuLFxuICAvLyBvciAtMSBpZiBub25lIG9mIHRoZSBwYXR0ZXJucyBhcmUgZm91bmQuXG4gIGNvbnN0IG5ld2xpbmUgPSAweDBhOyAvLyBcXG5cbiAgY29uc3QgY2FycmlhZ2UgPSAweDBkOyAvLyBcXHJcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGggLSAyOyBpKyspIHtcbiAgICBpZiAoYnVmZmVyW2ldID09PSBuZXdsaW5lICYmIGJ1ZmZlcltpICsgMV0gPT09IG5ld2xpbmUpIHtcbiAgICAgIC8vIFxcblxcblxuICAgICAgcmV0dXJuIGkgKyAyO1xuICAgIH1cbiAgICBpZiAoYnVmZmVyW2ldID09PSBjYXJyaWFnZSAmJiBidWZmZXJbaSArIDFdID09PSBjYXJyaWFnZSkge1xuICAgICAgLy8gXFxyXFxyXG4gICAgICByZXR1cm4gaSArIDI7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGJ1ZmZlcltpXSA9PT0gY2FycmlhZ2UgJiZcbiAgICAgIGJ1ZmZlcltpICsgMV0gPT09IG5ld2xpbmUgJiZcbiAgICAgIGkgKyAzIDwgYnVmZmVyLmxlbmd0aCAmJlxuICAgICAgYnVmZmVyW2kgKyAyXSA9PT0gY2FycmlhZ2UgJiZcbiAgICAgIGJ1ZmZlcltpICsgM10gPT09IG5ld2xpbmVcbiAgICApIHtcbiAgICAgIC8vIFxcclxcblxcclxcblxuICAgICAgcmV0dXJuIGkgKyA0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cblxuY2xhc3MgU1NFRGVjb2RlciB7XG4gIHByaXZhdGUgZGF0YTogc3RyaW5nW107XG4gIHByaXZhdGUgZXZlbnQ6IHN0cmluZyB8IG51bGw7XG4gIHByaXZhdGUgY2h1bmtzOiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmV2ZW50ID0gbnVsbDtcbiAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICB0aGlzLmNodW5rcyA9IFtdO1xuICB9XG5cbiAgZGVjb2RlKGxpbmU6IHN0cmluZykge1xuICAgIGlmIChsaW5lLmVuZHNXaXRoKCdcXHInKSkge1xuICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSk7XG4gICAgfVxuXG4gICAgaWYgKCFsaW5lKSB7XG4gICAgICAvLyBlbXB0eSBsaW5lIGFuZCB3ZSBkaWRuJ3QgcHJldmlvdXNseSBlbmNvdW50ZXIgYW55IG1lc3NhZ2VzXG4gICAgICBpZiAoIXRoaXMuZXZlbnQgJiYgIXRoaXMuZGF0YS5sZW5ndGgpIHJldHVybiBudWxsO1xuXG4gICAgICBjb25zdCBzc2U6IFNlcnZlclNlbnRFdmVudCA9IHtcbiAgICAgICAgZXZlbnQ6IHRoaXMuZXZlbnQsXG4gICAgICAgIGRhdGE6IHRoaXMuZGF0YS5qb2luKCdcXG4nKSxcbiAgICAgICAgcmF3OiB0aGlzLmNodW5rcyxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZXZlbnQgPSBudWxsO1xuICAgICAgdGhpcy5kYXRhID0gW107XG4gICAgICB0aGlzLmNodW5rcyA9IFtdO1xuXG4gICAgICByZXR1cm4gc3NlO1xuICAgIH1cblxuICAgIHRoaXMuY2h1bmtzLnB1c2gobGluZSk7XG5cbiAgICBpZiAobGluZS5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBbZmllbGRuYW1lLCBfLCB2YWx1ZV0gPSBwYXJ0aXRpb24obGluZSwgJzonKTtcblxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCcgJykpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEpO1xuICAgIH1cblxuICAgIGlmIChmaWVsZG5hbWUgPT09ICdldmVudCcpIHtcbiAgICAgIHRoaXMuZXZlbnQgPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkbmFtZSA9PT0gJ2RhdGEnKSB7XG4gICAgICB0aGlzLmRhdGEucHVzaCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHJlLWltcGxlbWVudGF0aW9uIG9mIGh0dHB4J3MgYExpbmVEZWNvZGVyYCBpbiBQeXRob24gdGhhdCBoYW5kbGVzIGluY3JlbWVudGFsbHlcbiAqIHJlYWRpbmcgbGluZXMgZnJvbSB0ZXh0LlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmNvZGUvaHR0cHgvYmxvYi85MjAzMzNlYTk4MTE4ZTljZjYxN2YyNDY5MDVkN2IyMDI1MTA5NDFjL2h0dHB4L19kZWNvZGVycy5weSNMMjU4XG4gKi9cbmNsYXNzIExpbmVEZWNvZGVyIHtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHN0YXRpYyBORVdMSU5FX0NIQVJTID0gbmV3IFNldChbJ1xcbicsICdcXHInXSk7XG4gIHN0YXRpYyBORVdMSU5FX1JFR0VYUCA9IC9cXHJcXG58W1xcblxccl0vZztcblxuICBidWZmZXI6IHN0cmluZ1tdO1xuICB0cmFpbGluZ0NSOiBib29sZWFuO1xuICB0ZXh0RGVjb2RlcjogYW55OyAvLyBUZXh0RGVjb2RlciBmb3VuZCBpbiBicm93c2Vyczsgbm90IHR5cGVkIHRvIGF2b2lkIHB1bGxpbmcgaW4gZWl0aGVyIFwiZG9tXCIgb3IgXCJub2RlXCIgdHlwZXMuXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICB0aGlzLnRyYWlsaW5nQ1IgPSBmYWxzZTtcbiAgfVxuXG4gIGRlY29kZShjaHVuazogQnl0ZXMpOiBzdHJpbmdbXSB7XG4gICAgbGV0IHRleHQgPSB0aGlzLmRlY29kZVRleHQoY2h1bmspO1xuXG4gICAgaWYgKHRoaXMudHJhaWxpbmdDUikge1xuICAgICAgdGV4dCA9ICdcXHInICsgdGV4dDtcbiAgICAgIHRoaXMudHJhaWxpbmdDUiA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGV4dC5lbmRzV2l0aCgnXFxyJykpIHtcbiAgICAgIHRoaXMudHJhaWxpbmdDUiA9IHRydWU7XG4gICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCAtMSk7XG4gICAgfVxuXG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgdHJhaWxpbmdOZXdsaW5lID0gTGluZURlY29kZXIuTkVXTElORV9DSEFSUy5oYXModGV4dFt0ZXh0Lmxlbmd0aCAtIDFdIHx8ICcnKTtcbiAgICBsZXQgbGluZXMgPSB0ZXh0LnNwbGl0KExpbmVEZWNvZGVyLk5FV0xJTkVfUkVHRVhQKTtcblxuICAgIC8vIGlmIHRoZXJlIGlzIGEgdHJhaWxpbmcgbmV3IGxpbmUgdGhlbiB0aGUgbGFzdCBlbnRyeSB3aWxsIGJlIGFuIGVtcHR5XG4gICAgLy8gc3RyaW5nIHdoaWNoIHdlIGRvbid0IGNhcmUgYWJvdXRcbiAgICBpZiAodHJhaWxpbmdOZXdsaW5lKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICB9XG5cbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAxICYmICF0cmFpbGluZ05ld2xpbmUpIHtcbiAgICAgIHRoaXMuYnVmZmVyLnB1c2gobGluZXNbMF0hKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMgPSBbdGhpcy5idWZmZXIuam9pbignJykgKyBsaW5lc1swXSwgLi4ubGluZXMuc2xpY2UoMSldO1xuICAgICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAoIXRyYWlsaW5nTmV3bGluZSkge1xuICAgICAgdGhpcy5idWZmZXIgPSBbbGluZXMucG9wKCkgfHwgJyddO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcztcbiAgfVxuXG4gIGRlY29kZVRleHQoYnl0ZXM6IEJ5dGVzKTogc3RyaW5nIHtcbiAgICBpZiAoYnl0ZXMgPT0gbnVsbCkgcmV0dXJuICcnO1xuICAgIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSByZXR1cm4gYnl0ZXM7XG5cbiAgICAvLyBOb2RlOlxuICAgIGlmICh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGJ5dGVzIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBieXRlcy50b1N0cmluZygpO1xuICAgICAgfVxuICAgICAgaWYgKGJ5dGVzIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYnl0ZXMpLnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihcbiAgICAgICAgYFVuZXhwZWN0ZWQ6IHJlY2VpdmVkIG5vbi1VaW50OEFycmF5ICgke2J5dGVzLmNvbnN0cnVjdG9yLm5hbWV9KSBzdHJlYW0gY2h1bmsgaW4gYW4gZW52aXJvbm1lbnQgd2l0aCBhIGdsb2JhbCBcIkJ1ZmZlclwiIGRlZmluZWQsIHdoaWNoIHRoaXMgbGlicmFyeSBhc3N1bWVzIHRvIGJlIE5vZGUuIFBsZWFzZSByZXBvcnQgdGhpcyBlcnJvci5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBCcm93c2VyXG4gICAgaWYgKHR5cGVvZiBUZXh0RGVjb2RlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChieXRlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgYnl0ZXMgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICB0aGlzLnRleHREZWNvZGVyID8/PSBuZXcgVGV4dERlY29kZXIoJ3V0ZjgnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKFxuICAgICAgICBgVW5leHBlY3RlZDogcmVjZWl2ZWQgbm9uLVVpbnQ4QXJyYXkvQXJyYXlCdWZmZXIgKCR7XG4gICAgICAgICAgKGJ5dGVzIGFzIGFueSkuY29uc3RydWN0b3IubmFtZVxuICAgICAgICB9KSBpbiBhIHdlYiBwbGF0Zm9ybS4gUGxlYXNlIHJlcG9ydCB0aGlzIGVycm9yLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihcbiAgICAgIGBVbmV4cGVjdGVkOiBuZWl0aGVyIEJ1ZmZlciBub3IgVGV4dERlY29kZXIgYXJlIGF2YWlsYWJsZSBhcyBnbG9iYWxzLiBQbGVhc2UgcmVwb3J0IHRoaXMgZXJyb3IuYCxcbiAgICApO1xuICB9XG5cbiAgZmx1c2goKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5idWZmZXIubGVuZ3RoICYmICF0aGlzLnRyYWlsaW5nQ1IpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lcyA9IFt0aGlzLmJ1ZmZlci5qb2luKCcnKV07XG4gICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICB0aGlzLnRyYWlsaW5nQ1IgPSBmYWxzZTtcbiAgICByZXR1cm4gbGluZXM7XG4gIH1cbn1cblxuLyoqIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9uIHRoYXQncyBqdXN0IHVzZWQgZm9yIHRlc3RpbmcgKi9cbmV4cG9ydCBmdW5jdGlvbiBfZGVjb2RlQ2h1bmtzKGNodW5rczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgTGluZURlY29kZXIoKTtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgbGluZXMucHVzaCguLi5kZWNvZGVyLmRlY29kZShjaHVuaykpO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG5mdW5jdGlvbiBwYXJ0aXRpb24oc3RyOiBzdHJpbmcsIGRlbGltaXRlcjogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddIHtcbiAgY29uc3QgaW5kZXggPSBzdHIuaW5kZXhPZihkZWxpbWl0ZXIpO1xuICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgcmV0dXJuIFtzdHIuc3Vic3RyaW5nKDAsIGluZGV4KSwgZGVsaW1pdGVyLCBzdHIuc3Vic3RyaW5nKGluZGV4ICsgZGVsaW1pdGVyLmxlbmd0aCldO1xuICB9XG5cbiAgcmV0dXJuIFtzdHIsICcnLCAnJ107XG59XG5cbi8qKlxuICogTW9zdCBicm93c2VycyBkb24ndCB5ZXQgaGF2ZSBhc3luYyBpdGVyYWJsZSBzdXBwb3J0IGZvciBSZWFkYWJsZVN0cmVhbSxcbiAqIGFuZCBOb2RlIGhhcyBhIHZlcnkgZGlmZmVyZW50IHdheSBvZiByZWFkaW5nIGJ5dGVzIGZyb20gaXRzIFwiUmVhZGFibGVTdHJlYW1cIi5cbiAqXG4gKiBUaGlzIHBvbHlmaWxsIHdhcyBwdWxsZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTWF0dGlhc0J1ZWxlbnMvd2ViLXN0cmVhbXMtcG9seWZpbGwvcHVsbC8xMjIjaXNzdWVjb21tZW50LTE2MjczNTQ0OTBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYWJsZTxUPihzdHJlYW06IGFueSk6IEFzeW5jSXRlcmFibGVJdGVyYXRvcjxUPiB7XG4gIGlmIChzdHJlYW1bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKSByZXR1cm4gc3RyZWFtO1xuXG4gIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgcmV0dXJuIHtcbiAgICBhc3luYyBuZXh0KCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgaWYgKHJlc3VsdD8uZG9uZSkgcmVhZGVyLnJlbGVhc2VMb2NrKCk7IC8vIHJlbGVhc2UgbG9jayB3aGVuIHN0cmVhbSBiZWNvbWVzIGNsb3NlZFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWFkZXIucmVsZWFzZUxvY2soKTsgLy8gcmVsZWFzZSBsb2NrIHdoZW4gc3RyZWFtIGJlY29tZXMgZXJyb3JlZFxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgcmV0dXJuKCkge1xuICAgICAgY29uc3QgY2FuY2VsUHJvbWlzZSA9IHJlYWRlci5jYW5jZWwoKTtcbiAgICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgICAgYXdhaXQgY2FuY2VsUHJvbWlzZTtcbiAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICB9LFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IHR5cGUgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2NvcmUnO1xuaW1wb3J0IHtcbiAgRm9ybURhdGEsXG4gIEZpbGUsXG4gIHR5cGUgQmxvYixcbiAgdHlwZSBGaWxlUHJvcGVydHlCYWcsXG4gIGdldE11bHRpcGFydFJlcXVlc3RPcHRpb25zLFxuICB0eXBlIEZzUmVhZFN0cmVhbSxcbiAgaXNGc1JlYWRTdHJlYW0sXG59IGZyb20gJy4vX3NoaW1zL2luZGV4JztcbmltcG9ydCB7IE11bHRpcGFydEJvZHkgfSBmcm9tICcuL19zaGltcy9NdWx0aXBhcnRCb2R5JztcbmV4cG9ydCB7IGZpbGVGcm9tUGF0aCB9IGZyb20gJy4vX3NoaW1zL2luZGV4JztcblxudHlwZSBCbG9iTGlrZVBhcnQgPSBzdHJpbmcgfCBBcnJheUJ1ZmZlciB8IEFycmF5QnVmZmVyVmlldyB8IEJsb2JMaWtlIHwgVWludDhBcnJheSB8IERhdGFWaWV3O1xuZXhwb3J0IHR5cGUgQmxvYlBhcnQgPSBzdHJpbmcgfCBBcnJheUJ1ZmZlciB8IEFycmF5QnVmZmVyVmlldyB8IEJsb2IgfCBVaW50OEFycmF5IHwgRGF0YVZpZXc7XG5cbi8qKlxuICogVHlwaWNhbGx5LCB0aGlzIGlzIGEgbmF0aXZlIFwiRmlsZVwiIGNsYXNzLlxuICpcbiAqIFdlIHByb3ZpZGUgdGhlIHtAbGluayB0b0ZpbGV9IHV0aWxpdHkgdG8gY29udmVydCBhIHZhcmlldHkgb2Ygb2JqZWN0c1xuICogaW50byB0aGUgRmlsZSBjbGFzcy5cbiAqXG4gKiBGb3IgY29udmVuaWVuY2UsIHlvdSBjYW4gYWxzbyBwYXNzIGEgZmV0Y2ggUmVzcG9uc2UsIG9yIGluIE5vZGUsXG4gKiB0aGUgcmVzdWx0IG9mIGZzLmNyZWF0ZVJlYWRTdHJlYW0oKS5cbiAqL1xuZXhwb3J0IHR5cGUgVXBsb2FkYWJsZSA9IEZpbGVMaWtlIHwgUmVzcG9uc2VMaWtlIHwgRnNSZWFkU3RyZWFtO1xuXG4vKipcbiAqIEludGVuZGVkIHRvIG1hdGNoIHdlYi5CbG9iLCBub2RlLkJsb2IsIG5vZGUtZmV0Y2guQmxvYiwgZXRjLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJsb2JMaWtlIHtcbiAgLyoqIFtNRE4gUmVmZXJlbmNlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9BUEkvQmxvYi9zaXplKSAqL1xuICByZWFkb25seSBzaXplOiBudW1iZXI7XG4gIC8qKiBbTUROIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvQVBJL0Jsb2IvdHlwZSkgKi9cbiAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuICAvKiogW01ETiBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9CbG9iL3RleHQpICovXG4gIHRleHQoKTogUHJvbWlzZTxzdHJpbmc+O1xuICAvKiogW01ETiBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9CbG9iL3NsaWNlKSAqL1xuICBzbGljZShzdGFydD86IG51bWJlciwgZW5kPzogbnVtYmVyKTogQmxvYkxpa2U7XG4gIC8vIHVuZm9ydHVuYXRlbHkgQHR5cGVzL25vZGUtZmV0Y2hAXjIuNi40IGRvZXNuJ3QgdHlwZSB0aGUgYXJyYXlCdWZmZXIgbWV0aG9kXG59XG5cbi8qKlxuICogSW50ZW5kZWQgdG8gbWF0Y2ggd2ViLkZpbGUsIG5vZGUuRmlsZSwgbm9kZS1mZXRjaC5GaWxlLCBldGMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUxpa2UgZXh0ZW5kcyBCbG9iTGlrZSB7XG4gIC8qKiBbTUROIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvQVBJL0ZpbGUvbGFzdE1vZGlmaWVkKSAqL1xuICByZWFkb25seSBsYXN0TW9kaWZpZWQ6IG51bWJlcjtcbiAgLyoqIFtNRE4gUmVmZXJlbmNlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9BUEkvRmlsZS9uYW1lKSAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW50ZW5kZWQgdG8gbWF0Y2ggd2ViLlJlc3BvbnNlLCBub2RlLlJlc3BvbnNlLCBub2RlLWZldGNoLlJlc3BvbnNlLCBldGMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VMaWtlIHtcbiAgdXJsOiBzdHJpbmc7XG4gIGJsb2IoKTogUHJvbWlzZTxCbG9iTGlrZT47XG59XG5cbmV4cG9ydCBjb25zdCBpc1Jlc3BvbnNlTGlrZSA9ICh2YWx1ZTogYW55KTogdmFsdWUgaXMgUmVzcG9uc2VMaWtlID0+XG4gIHZhbHVlICE9IG51bGwgJiZcbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB0eXBlb2YgdmFsdWUudXJsID09PSAnc3RyaW5nJyAmJlxuICB0eXBlb2YgdmFsdWUuYmxvYiA9PT0gJ2Z1bmN0aW9uJztcblxuZXhwb3J0IGNvbnN0IGlzRmlsZUxpa2UgPSAodmFsdWU6IGFueSk6IHZhbHVlIGlzIEZpbGVMaWtlID0+XG4gIHZhbHVlICE9IG51bGwgJiZcbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB0eXBlb2YgdmFsdWUubmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgdHlwZW9mIHZhbHVlLmxhc3RNb2RpZmllZCA9PT0gJ251bWJlcicgJiZcbiAgaXNCbG9iTGlrZSh2YWx1ZSk7XG5cbi8qKlxuICogVGhlIEJsb2JMaWtlIHR5cGUgb21pdHMgYXJyYXlCdWZmZXIoKSBiZWNhdXNlIEB0eXBlcy9ub2RlLWZldGNoQF4yLjYuNCBsYWNrcyBpdDsgYnV0IHRoaXMgY2hlY2tcbiAqIGFkZHMgdGhlIGFycmF5QnVmZmVyKCkgbWV0aG9kIHR5cGUgYmVjYXVzZSBpdCBpcyBhdmFpbGFibGUgYW5kIHVzZWQgYXQgcnVudGltZVxuICovXG5leHBvcnQgY29uc3QgaXNCbG9iTGlrZSA9ICh2YWx1ZTogYW55KTogdmFsdWUgaXMgQmxvYkxpa2UgJiB7IGFycmF5QnVmZmVyKCk6IFByb21pc2U8QXJyYXlCdWZmZXI+IH0gPT5cbiAgdmFsdWUgIT0gbnVsbCAmJlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gIHR5cGVvZiB2YWx1ZS5zaXplID09PSAnbnVtYmVyJyAmJlxuICB0eXBlb2YgdmFsdWUudHlwZSA9PT0gJ3N0cmluZycgJiZcbiAgdHlwZW9mIHZhbHVlLnRleHQgPT09ICdmdW5jdGlvbicgJiZcbiAgdHlwZW9mIHZhbHVlLnNsaWNlID09PSAnZnVuY3Rpb24nICYmXG4gIHR5cGVvZiB2YWx1ZS5hcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJztcblxuZXhwb3J0IGNvbnN0IGlzVXBsb2FkYWJsZSA9ICh2YWx1ZTogYW55KTogdmFsdWUgaXMgVXBsb2FkYWJsZSA9PiB7XG4gIHJldHVybiBpc0ZpbGVMaWtlKHZhbHVlKSB8fCBpc1Jlc3BvbnNlTGlrZSh2YWx1ZSkgfHwgaXNGc1JlYWRTdHJlYW0odmFsdWUpO1xufTtcblxuZXhwb3J0IHR5cGUgVG9GaWxlSW5wdXQgPSBVcGxvYWRhYmxlIHwgRXhjbHVkZTxCbG9iTGlrZVBhcnQsIHN0cmluZz4gfCBBc3luY0l0ZXJhYmxlPEJsb2JMaWtlUGFydD47XG5cbi8qKlxuICogSGVscGVyIGZvciBjcmVhdGluZyBhIHtAbGluayBGaWxlfSB0byBwYXNzIHRvIGFuIFNESyB1cGxvYWQgbWV0aG9kIGZyb20gYSB2YXJpZXR5IG9mIGRpZmZlcmVudCBkYXRhIGZvcm1hdHNcbiAqIEBwYXJhbSB2YWx1ZSB0aGUgcmF3IGNvbnRlbnQgb2YgdGhlIGZpbGUuICBDYW4gYmUgYW4ge0BsaW5rIFVwbG9hZGFibGV9LCB7QGxpbmsgQmxvYkxpa2VQYXJ0fSwgb3Ige0BsaW5rIEFzeW5jSXRlcmFibGV9IG9mIHtAbGluayBCbG9iTGlrZVBhcnR9c1xuICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiBJZiBvbWl0dGVkLCB0b0ZpbGUgd2lsbCB0cnkgdG8gZGV0ZXJtaW5lIGEgZmlsZSBuYW1lIGZyb20gYml0cyBpZiBwb3NzaWJsZVxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zIGFkZGl0aW9uYWwgcHJvcGVydGllc1xuICogQHBhcmFtIHtzdHJpbmc9fSBvcHRpb25zLnR5cGUgdGhlIE1JTUUgdHlwZSBvZiB0aGUgY29udGVudFxuICogQHBhcmFtIHtudW1iZXI9fSBvcHRpb25zLmxhc3RNb2RpZmllZCB0aGUgbGFzdCBtb2RpZmllZCB0aW1lc3RhbXBcbiAqIEByZXR1cm5zIGEge0BsaW5rIEZpbGV9IHdpdGggdGhlIGdpdmVuIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvRmlsZShcbiAgdmFsdWU6IFRvRmlsZUlucHV0IHwgUHJvbWlzZUxpa2U8VG9GaWxlSW5wdXQ+LFxuICBuYW1lPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0aW9ucz86IEZpbGVQcm9wZXJ0eUJhZyB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8RmlsZUxpa2U+IHtcbiAgLy8gSWYgaXQncyBhIHByb21pc2UsIHJlc29sdmUgaXQuXG4gIHZhbHVlID0gYXdhaXQgdmFsdWU7XG5cbiAgLy8gVXNlIHRoZSBmaWxlJ3Mgb3B0aW9ucyBpZiB0aGVyZSBpc24ndCBvbmUgcHJvdmlkZWRcbiAgb3B0aW9ucyA/Pz0gaXNGaWxlTGlrZSh2YWx1ZSkgPyB7IGxhc3RNb2RpZmllZDogdmFsdWUubGFzdE1vZGlmaWVkLCB0eXBlOiB2YWx1ZS50eXBlIH0gOiB7fTtcblxuICBpZiAoaXNSZXNwb25zZUxpa2UodmFsdWUpKSB7XG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IHZhbHVlLmJsb2IoKTtcbiAgICBuYW1lIHx8PSBuZXcgVVJMKHZhbHVlLnVybCkucGF0aG5hbWUuc3BsaXQoL1tcXFxcL10vKS5wb3AoKSA/PyAndW5rbm93bl9maWxlJztcblxuICAgIHJldHVybiBuZXcgRmlsZShbYmxvYiBhcyBhbnldLCBuYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIGNvbnN0IGJpdHMgPSBhd2FpdCBnZXRCeXRlcyh2YWx1ZSk7XG5cbiAgbmFtZSB8fD0gZ2V0TmFtZSh2YWx1ZSkgPz8gJ3Vua25vd25fZmlsZSc7XG5cbiAgaWYgKCFvcHRpb25zLnR5cGUpIHtcbiAgICBjb25zdCB0eXBlID0gKGJpdHNbMF0gYXMgYW55KT8udHlwZTtcbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBvcHRpb25zID0geyAuLi5vcHRpb25zLCB0eXBlIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBGaWxlKGJpdHMsIG5hbWUsIG9wdGlvbnMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRCeXRlcyh2YWx1ZTogVG9GaWxlSW5wdXQpOiBQcm9taXNlPEFycmF5PEJsb2JQYXJ0Pj4ge1xuICBsZXQgcGFydHM6IEFycmF5PEJsb2JQYXJ0PiA9IFtdO1xuICBpZiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgIEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSkgfHwgLy8gaW5jbHVkZXMgVWludDhBcnJheSwgQnVmZmVyLCBldGMuXG4gICAgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlclxuICApIHtcbiAgICBwYXJ0cy5wdXNoKHZhbHVlKTtcbiAgfSBlbHNlIGlmIChpc0Jsb2JMaWtlKHZhbHVlKSkge1xuICAgIHBhcnRzLnB1c2goYXdhaXQgdmFsdWUuYXJyYXlCdWZmZXIoKSk7XG4gIH0gZWxzZSBpZiAoXG4gICAgaXNBc3luY0l0ZXJhYmxlSXRlcmF0b3IodmFsdWUpIC8vIGluY2x1ZGVzIFJlYWRhYmxlLCBSZWFkYWJsZVN0cmVhbSwgZXRjLlxuICApIHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHZhbHVlKSB7XG4gICAgICBwYXJ0cy5wdXNoKGNodW5rIGFzIEJsb2JQYXJ0KTsgLy8gVE9ETywgY29uc2lkZXIgdmFsaWRhdGluZz9cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFVuZXhwZWN0ZWQgZGF0YSB0eXBlOiAke3R5cGVvZiB2YWx1ZX07IGNvbnN0cnVjdG9yOiAke3ZhbHVlPy5jb25zdHJ1Y3RvclxuICAgICAgICA/Lm5hbWV9OyBwcm9wczogJHtwcm9wc0ZvckVycm9yKHZhbHVlKX1gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbmZ1bmN0aW9uIHByb3BzRm9yRXJyb3IodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gIGNvbnN0IHByb3BzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICByZXR1cm4gYFske3Byb3BzLm1hcCgocCkgPT4gYFwiJHtwfVwiYCkuam9pbignLCAnKX1dYDtcbn1cblxuZnVuY3Rpb24gZ2V0TmFtZSh2YWx1ZTogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIChcbiAgICBnZXRTdHJpbmdGcm9tTWF5YmVCdWZmZXIodmFsdWUubmFtZSkgfHxcbiAgICBnZXRTdHJpbmdGcm9tTWF5YmVCdWZmZXIodmFsdWUuZmlsZW5hbWUpIHx8XG4gICAgLy8gRm9yIGZzLlJlYWRTdHJlYW1cbiAgICBnZXRTdHJpbmdGcm9tTWF5YmVCdWZmZXIodmFsdWUucGF0aCk/LnNwbGl0KC9bXFxcXC9dLykucG9wKClcbiAgKTtcbn1cblxuY29uc3QgZ2V0U3RyaW5nRnJvbU1heWJlQnVmZmVyID0gKHg6IHN0cmluZyB8IEJ1ZmZlciB8IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodHlwZW9mIHggPT09ICdzdHJpbmcnKSByZXR1cm4geDtcbiAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHggaW5zdGFuY2VvZiBCdWZmZXIpIHJldHVybiBTdHJpbmcoeCk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBpc0FzeW5jSXRlcmFibGVJdGVyYXRvciA9ICh2YWx1ZTogYW55KTogdmFsdWUgaXMgQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPHVua25vd24+ID0+XG4gIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xuXG5leHBvcnQgY29uc3QgaXNNdWx0aXBhcnRCb2R5ID0gKGJvZHk6IGFueSk6IGJvZHkgaXMgTXVsdGlwYXJ0Qm9keSA9PlxuICBib2R5ICYmIHR5cGVvZiBib2R5ID09PSAnb2JqZWN0JyAmJiBib2R5LmJvZHkgJiYgYm9keVtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnTXVsdGlwYXJ0Qm9keSc7XG5cbi8qKlxuICogUmV0dXJucyBhIG11bHRpcGFydC9mb3JtLWRhdGEgcmVxdWVzdCBpZiBhbnkgcGFydCBvZiB0aGUgZ2l2ZW4gcmVxdWVzdCBib2R5IGNvbnRhaW5zIGEgRmlsZSAvIEJsb2IgdmFsdWUuXG4gKiBPdGhlcndpc2UgcmV0dXJucyB0aGUgcmVxdWVzdCBhcyBpcy5cbiAqL1xuZXhwb3J0IGNvbnN0IG1heWJlTXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zID0gYXN5bmMgPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIG9wdHM6IFJlcXVlc3RPcHRpb25zPFQ+LFxuKTogUHJvbWlzZTxSZXF1ZXN0T3B0aW9uczxUIHwgTXVsdGlwYXJ0Qm9keT4+ID0+IHtcbiAgaWYgKCFoYXNVcGxvYWRhYmxlVmFsdWUob3B0cy5ib2R5KSkgcmV0dXJuIG9wdHM7XG5cbiAgY29uc3QgZm9ybSA9IGF3YWl0IGNyZWF0ZUZvcm0ob3B0cy5ib2R5KTtcbiAgcmV0dXJuIGdldE11bHRpcGFydFJlcXVlc3RPcHRpb25zKGZvcm0sIG9wdHMpO1xufTtcblxuZXhwb3J0IGNvbnN0IG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyA9IGFzeW5jIDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBvcHRzOiBSZXF1ZXN0T3B0aW9uczxUPixcbik6IFByb21pc2U8UmVxdWVzdE9wdGlvbnM8VCB8IE11bHRpcGFydEJvZHk+PiA9PiB7XG4gIGNvbnN0IGZvcm0gPSBhd2FpdCBjcmVhdGVGb3JtKG9wdHMuYm9keSk7XG4gIHJldHVybiBnZXRNdWx0aXBhcnRSZXF1ZXN0T3B0aW9ucyhmb3JtLCBvcHRzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVGb3JtID0gYXN5bmMgPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oYm9keTogVCB8IHVuZGVmaW5lZCk6IFByb21pc2U8Rm9ybURhdGE+ID0+IHtcbiAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpO1xuICBhd2FpdCBQcm9taXNlLmFsbChPYmplY3QuZW50cmllcyhib2R5IHx8IHt9KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYWRkRm9ybVZhbHVlKGZvcm0sIGtleSwgdmFsdWUpKSk7XG4gIHJldHVybiBmb3JtO1xufTtcblxuY29uc3QgaGFzVXBsb2FkYWJsZVZhbHVlID0gKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gIGlmIChpc1VwbG9hZGFibGUodmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuc29tZShoYXNVcGxvYWRhYmxlVmFsdWUpO1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAoY29uc3QgayBpbiB2YWx1ZSkge1xuICAgICAgaWYgKGhhc1VwbG9hZGFibGVWYWx1ZSgodmFsdWUgYXMgYW55KVtrXSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBhZGRGb3JtVmFsdWUgPSBhc3luYyAoZm9ybTogRm9ybURhdGEsIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgUmVjZWl2ZWQgbnVsbCBmb3IgXCIke2tleX1cIjsgdG8gcGFzcyBudWxsIGluIEZvcm1EYXRhLCB5b3UgbXVzdCB1c2UgdGhlIHN0cmluZyAnbnVsbCdgLFxuICAgICk7XG4gIH1cblxuICAvLyBUT0RPOiBtYWtlIG5lc3RlZCBmb3JtYXRzIGNvbmZpZ3VyYWJsZVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgZm9ybS5hcHBlbmQoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgfSBlbHNlIGlmIChpc1VwbG9hZGFibGUodmFsdWUpKSB7XG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IHRvRmlsZSh2YWx1ZSk7XG4gICAgZm9ybS5hcHBlbmQoa2V5LCBmaWxlIGFzIEZpbGUpO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodmFsdWUubWFwKChlbnRyeSkgPT4gYWRkRm9ybVZhbHVlKGZvcm0sIGtleSArICdbXScsIGVudHJ5KSkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5tYXAoKFtuYW1lLCBwcm9wXSkgPT4gYWRkRm9ybVZhbHVlKGZvcm0sIGAke2tleX1bJHtuYW1lfV1gLCBwcm9wKSksXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgYEludmFsaWQgdmFsdWUgZ2l2ZW4gdG8gZm9ybSwgZXhwZWN0ZWQgYSBzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwgb2JqZWN0LCBBcnJheSwgRmlsZSBvciBCbG9iIGJ1dCBnb3QgJHt2YWx1ZX0gaW5zdGVhZGAsXG4gICAgKTtcbiAgfVxufTtcbiIsICJpbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSAnLi92ZXJzaW9uJztcbmltcG9ydCB7IFN0cmVhbSB9IGZyb20gJy4vc3RyZWFtaW5nJztcbmltcG9ydCB7XG4gIE9wZW5BSUVycm9yLFxuICBBUElFcnJvcixcbiAgQVBJQ29ubmVjdGlvbkVycm9yLFxuICBBUElDb25uZWN0aW9uVGltZW91dEVycm9yLFxuICBBUElVc2VyQWJvcnRFcnJvcixcbn0gZnJvbSAnLi9lcnJvcic7XG5pbXBvcnQge1xuICBraW5kIGFzIHNoaW1zS2luZCxcbiAgdHlwZSBSZWFkYWJsZSxcbiAgZ2V0RGVmYXVsdEFnZW50LFxuICB0eXBlIEFnZW50LFxuICBmZXRjaCxcbiAgdHlwZSBSZXF1ZXN0SW5mbyxcbiAgdHlwZSBSZXF1ZXN0SW5pdCxcbiAgdHlwZSBSZXNwb25zZSxcbiAgdHlwZSBIZWFkZXJzSW5pdCxcbn0gZnJvbSAnLi9fc2hpbXMvaW5kZXgnO1xuZXhwb3J0IHsgdHlwZSBSZXNwb25zZSB9O1xuaW1wb3J0IHsgaXNNdWx0aXBhcnRCb2R5IH0gZnJvbSAnLi91cGxvYWRzJztcbmV4cG9ydCB7XG4gIG1heWJlTXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zLFxuICBtdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMsXG4gIGNyZWF0ZUZvcm0sXG4gIHR5cGUgVXBsb2FkYWJsZSxcbn0gZnJvbSAnLi91cGxvYWRzJztcblxuZXhwb3J0IHR5cGUgRmV0Y2ggPSAodXJsOiBSZXF1ZXN0SW5mbywgaW5pdD86IFJlcXVlc3RJbml0KSA9PiBQcm9taXNlPFJlc3BvbnNlPjtcblxudHlwZSBQcm9taXNlT3JWYWx1ZTxUPiA9IFQgfCBQcm9taXNlPFQ+O1xuXG50eXBlIEFQSVJlc3BvbnNlUHJvcHMgPSB7XG4gIHJlc3BvbnNlOiBSZXNwb25zZTtcbiAgb3B0aW9uczogRmluYWxSZXF1ZXN0T3B0aW9ucztcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gZGVmYXVsdFBhcnNlUmVzcG9uc2U8VD4ocHJvcHM6IEFQSVJlc3BvbnNlUHJvcHMpOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgeyByZXNwb25zZSB9ID0gcHJvcHM7XG4gIGlmIChwcm9wcy5vcHRpb25zLnN0cmVhbSkge1xuICAgIGRlYnVnKCdyZXNwb25zZScsIHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UudXJsLCByZXNwb25zZS5oZWFkZXJzLCByZXNwb25zZS5ib2R5KTtcblxuICAgIC8vIE5vdGU6IHRoZXJlIGlzIGFuIGludmFyaWFudCBoZXJlIHRoYXQgaXNuJ3QgcmVwcmVzZW50ZWQgaW4gdGhlIHR5cGUgc3lzdGVtXG4gICAgLy8gdGhhdCBpZiB5b3Ugc2V0IGBzdHJlYW06IHRydWVgIHRoZSByZXNwb25zZSB0eXBlIG11c3QgYWxzbyBiZSBgU3RyZWFtPFQ+YFxuXG4gICAgaWYgKHByb3BzLm9wdGlvbnMuX19zdHJlYW1DbGFzcykge1xuICAgICAgcmV0dXJuIHByb3BzLm9wdGlvbnMuX19zdHJlYW1DbGFzcy5mcm9tU1NFUmVzcG9uc2UocmVzcG9uc2UsIHByb3BzLmNvbnRyb2xsZXIpIGFzIGFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gU3RyZWFtLmZyb21TU0VSZXNwb25zZShyZXNwb25zZSwgcHJvcHMuY29udHJvbGxlcikgYXMgYW55O1xuICB9XG5cbiAgLy8gZmV0Y2ggcmVmdXNlcyB0byByZWFkIHRoZSBib2R5IHdoZW4gdGhlIHN0YXR1cyBjb2RlIGlzIDIwNC5cbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0KSB7XG4gICAgcmV0dXJuIG51bGwgYXMgVDtcbiAgfVxuXG4gIGlmIChwcm9wcy5vcHRpb25zLl9fYmluYXJ5UmVzcG9uc2UpIHtcbiAgICByZXR1cm4gcmVzcG9uc2UgYXMgdW5rbm93biBhcyBUO1xuICB9XG5cbiAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG4gIGNvbnN0IGlzSlNPTiA9XG4gICAgY29udGVudFR5cGU/LmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykgfHwgY29udGVudFR5cGU/LmluY2x1ZGVzKCdhcHBsaWNhdGlvbi92bmQuYXBpK2pzb24nKTtcbiAgaWYgKGlzSlNPTikge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICBkZWJ1ZygncmVzcG9uc2UnLCByZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLnVybCwgcmVzcG9uc2UuaGVhZGVycywganNvbik7XG5cbiAgICByZXR1cm4ganNvbiBhcyBUO1xuICB9XG5cbiAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgZGVidWcoJ3Jlc3BvbnNlJywgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS51cmwsIHJlc3BvbnNlLmhlYWRlcnMsIHRleHQpO1xuXG4gIC8vIFRPRE8gaGFuZGxlIGJsb2IsIGFycmF5YnVmZmVyLCBvdGhlciBjb250ZW50IHR5cGVzLCBldGMuXG4gIHJldHVybiB0ZXh0IGFzIHVua25vd24gYXMgVDtcbn1cblxuLyoqXG4gKiBBIHN1YmNsYXNzIG9mIGBQcm9taXNlYCBwcm92aWRpbmcgYWRkaXRpb25hbCBoZWxwZXIgbWV0aG9kc1xuICogZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIFNESy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFQSVByb21pc2U8VD4gZXh0ZW5kcyBQcm9taXNlPFQ+IHtcbiAgcHJpdmF0ZSBwYXJzZWRQcm9taXNlOiBQcm9taXNlPFQ+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVzcG9uc2VQcm9taXNlOiBQcm9taXNlPEFQSVJlc3BvbnNlUHJvcHM+LFxuICAgIHByaXZhdGUgcGFyc2VSZXNwb25zZTogKHByb3BzOiBBUElSZXNwb25zZVByb3BzKSA9PiBQcm9taXNlT3JWYWx1ZTxUPiA9IGRlZmF1bHRQYXJzZVJlc3BvbnNlLFxuICApIHtcbiAgICBzdXBlcigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gdGhpcyBpcyBtYXliZSBhIGJpdCB3ZWlyZCBidXQgdGhpcyBoYXMgdG8gYmUgYSBuby1vcCB0byBub3QgaW1wbGljaXRseVxuICAgICAgLy8gcGFyc2UgdGhlIHJlc3BvbnNlIGJvZHk7IGluc3RlYWQgLnRoZW4sIC5jYXRjaCwgLmZpbmFsbHkgYXJlIG92ZXJyaWRkZW5cbiAgICAgIC8vIHRvIHBhcnNlIHRoZSByZXNwb25zZVxuICAgICAgcmVzb2x2ZShudWxsIGFzIGFueSk7XG4gICAgfSk7XG4gIH1cblxuICBfdGhlblVud3JhcDxVPih0cmFuc2Zvcm06IChkYXRhOiBUKSA9PiBVKTogQVBJUHJvbWlzZTxVPiB7XG4gICAgcmV0dXJuIG5ldyBBUElQcm9taXNlKHRoaXMucmVzcG9uc2VQcm9taXNlLCBhc3luYyAocHJvcHMpID0+IHRyYW5zZm9ybShhd2FpdCB0aGlzLnBhcnNlUmVzcG9uc2UocHJvcHMpKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcmF3IGBSZXNwb25zZWAgaW5zdGFuY2UgaW5zdGVhZCBvZiBwYXJzaW5nIHRoZSByZXNwb25zZVxuICAgKiBkYXRhLlxuICAgKlxuICAgKiBJZiB5b3Ugd2FudCB0byBwYXJzZSB0aGUgcmVzcG9uc2UgYm9keSBidXQgc3RpbGwgZ2V0IHRoZSBgUmVzcG9uc2VgXG4gICAqIGluc3RhbmNlLCB5b3UgY2FuIHVzZSB7QGxpbmsgd2l0aFJlc3BvbnNlKCl9LlxuICAgKlxuICAgKiBcdUQ4M0RcdURDNEIgR2V0dGluZyB0aGUgd3JvbmcgVHlwZVNjcmlwdCB0eXBlIGZvciBgUmVzcG9uc2VgP1xuICAgKiBUcnkgc2V0dGluZyBgXCJtb2R1bGVSZXNvbHV0aW9uXCI6IFwiTm9kZU5leHRcImAgaWYgeW91IGNhbixcbiAgICogb3IgYWRkIG9uZSBvZiB0aGVzZSBpbXBvcnRzIGJlZm9yZSB5b3VyIGZpcnN0IGBpbXBvcnQgXHUyMDI2IGZyb20gJ29wZW5haSdgOlxuICAgKiAtIGBpbXBvcnQgJ29wZW5haS9zaGltcy9ub2RlJ2AgKGlmIHlvdSdyZSBydW5uaW5nIG9uIE5vZGUpXG4gICAqIC0gYGltcG9ydCAnb3BlbmFpL3NoaW1zL3dlYidgIChvdGhlcndpc2UpXG4gICAqL1xuICBhc1Jlc3BvbnNlKCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZVByb21pc2UudGhlbigocCkgPT4gcC5yZXNwb25zZSk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIHBhcnNlZCByZXNwb25zZSBkYXRhIGFuZCB0aGUgcmF3IGBSZXNwb25zZWAgaW5zdGFuY2UuXG4gICAqXG4gICAqIElmIHlvdSBqdXN0IHdhbnQgdG8gZ2V0IHRoZSByYXcgYFJlc3BvbnNlYCBpbnN0YW5jZSB3aXRob3V0IHBhcnNpbmcgaXQsXG4gICAqIHlvdSBjYW4gdXNlIHtAbGluayBhc1Jlc3BvbnNlKCl9LlxuICAgKlxuICAgKlxuICAgKiBcdUQ4M0RcdURDNEIgR2V0dGluZyB0aGUgd3JvbmcgVHlwZVNjcmlwdCB0eXBlIGZvciBgUmVzcG9uc2VgP1xuICAgKiBUcnkgc2V0dGluZyBgXCJtb2R1bGVSZXNvbHV0aW9uXCI6IFwiTm9kZU5leHRcImAgaWYgeW91IGNhbixcbiAgICogb3IgYWRkIG9uZSBvZiB0aGVzZSBpbXBvcnRzIGJlZm9yZSB5b3VyIGZpcnN0IGBpbXBvcnQgXHUyMDI2IGZyb20gJ29wZW5haSdgOlxuICAgKiAtIGBpbXBvcnQgJ29wZW5haS9zaGltcy9ub2RlJ2AgKGlmIHlvdSdyZSBydW5uaW5nIG9uIE5vZGUpXG4gICAqIC0gYGltcG9ydCAnb3BlbmFpL3NoaW1zL3dlYidgIChvdGhlcndpc2UpXG4gICAqL1xuICBhc3luYyB3aXRoUmVzcG9uc2UoKTogUHJvbWlzZTx7IGRhdGE6IFQ7IHJlc3BvbnNlOiBSZXNwb25zZSB9PiB7XG4gICAgY29uc3QgW2RhdGEsIHJlc3BvbnNlXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLnBhcnNlKCksIHRoaXMuYXNSZXNwb25zZSgpXSk7XG4gICAgcmV0dXJuIHsgZGF0YSwgcmVzcG9uc2UgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2UoKTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKCF0aGlzLnBhcnNlZFByb21pc2UpIHtcbiAgICAgIHRoaXMucGFyc2VkUHJvbWlzZSA9IHRoaXMucmVzcG9uc2VQcm9taXNlLnRoZW4odGhpcy5wYXJzZVJlc3BvbnNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VkUHJvbWlzZTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIHJldHVybiB0aGlzLnBhcnNlKCkudGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCk7XG4gIH1cblxuICBvdmVycmlkZSBjYXRjaDxUUmVzdWx0ID0gbmV2ZXI+KFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0IHwgUHJvbWlzZUxpa2U8VFJlc3VsdD4pIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxUIHwgVFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnBhcnNlKCkuY2F0Y2gob25yZWplY3RlZCk7XG4gIH1cblxuICBvdmVycmlkZSBmaW5hbGx5KG9uZmluYWxseT86ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCB8IG51bGwpOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZSgpLmZpbmFsbHkob25maW5hbGx5KTtcbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQVBJQ2xpZW50IHtcbiAgYmFzZVVSTDogc3RyaW5nO1xuICBtYXhSZXRyaWVzOiBudW1iZXI7XG4gIHRpbWVvdXQ6IG51bWJlcjtcbiAgaHR0cEFnZW50OiBBZ2VudCB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGZldGNoOiBGZXRjaDtcbiAgcHJvdGVjdGVkIGlkZW1wb3RlbmN5SGVhZGVyPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBiYXNlVVJMLFxuICAgIG1heFJldHJpZXMgPSAyLFxuICAgIHRpbWVvdXQgPSA2MDAwMDAsIC8vIDEwIG1pbnV0ZXNcbiAgICBodHRwQWdlbnQsXG4gICAgZmV0Y2g6IG92ZXJyaWRlbkZldGNoLFxuICB9OiB7XG4gICAgYmFzZVVSTDogc3RyaW5nO1xuICAgIG1heFJldHJpZXM/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgdGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGh0dHBBZ2VudDogQWdlbnQgfCB1bmRlZmluZWQ7XG4gICAgZmV0Y2g6IEZldGNoIHwgdW5kZWZpbmVkO1xuICB9KSB7XG4gICAgdGhpcy5iYXNlVVJMID0gYmFzZVVSTDtcbiAgICB0aGlzLm1heFJldHJpZXMgPSB2YWxpZGF0ZVBvc2l0aXZlSW50ZWdlcignbWF4UmV0cmllcycsIG1heFJldHJpZXMpO1xuICAgIHRoaXMudGltZW91dCA9IHZhbGlkYXRlUG9zaXRpdmVJbnRlZ2VyKCd0aW1lb3V0JywgdGltZW91dCk7XG4gICAgdGhpcy5odHRwQWdlbnQgPSBodHRwQWdlbnQ7XG5cbiAgICB0aGlzLmZldGNoID0gb3ZlcnJpZGVuRmV0Y2ggPz8gZmV0Y2g7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXV0aEhlYWRlcnMob3B0czogRmluYWxSZXF1ZXN0T3B0aW9ucyk6IEhlYWRlcnMge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGlzIHRvIGFkZCB5b3VyIG93biBkZWZhdWx0IGhlYWRlcnMsIGZvciBleGFtcGxlOlxuICAgKlxuICAgKiAge1xuICAgKiAgICAuLi5zdXBlci5kZWZhdWx0SGVhZGVycygpLFxuICAgKiAgICBBdXRob3JpemF0aW9uOiAnQmVhcmVyIDEyMycsXG4gICAqICB9XG4gICAqL1xuICBwcm90ZWN0ZWQgZGVmYXVsdEhlYWRlcnMob3B0czogRmluYWxSZXF1ZXN0T3B0aW9ucyk6IEhlYWRlcnMge1xuICAgIHJldHVybiB7XG4gICAgICBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAnVXNlci1BZ2VudCc6IHRoaXMuZ2V0VXNlckFnZW50KCksXG4gICAgICAuLi5nZXRQbGF0Zm9ybUhlYWRlcnMoKSxcbiAgICAgIC4uLnRoaXMuYXV0aEhlYWRlcnMob3B0cyksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBkZWZhdWx0UXVlcnkoKTogRGVmYXVsdFF1ZXJ5IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGlzIHRvIGFkZCB5b3VyIG93biBoZWFkZXJzIHZhbGlkYXRpb246XG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVIZWFkZXJzKGhlYWRlcnM6IEhlYWRlcnMsIGN1c3RvbUhlYWRlcnM6IEhlYWRlcnMpIHt9XG5cbiAgcHJvdGVjdGVkIGRlZmF1bHRJZGVtcG90ZW5jeUtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgc3RhaW5sZXNzLW5vZGUtcmV0cnktJHt1dWlkNCgpfWA7XG4gIH1cblxuICBnZXQ8UmVxLCBSc3A+KHBhdGg6IHN0cmluZywgb3B0cz86IFByb21pc2VPclZhbHVlPFJlcXVlc3RPcHRpb25zPFJlcT4+KTogQVBJUHJvbWlzZTxSc3A+IHtcbiAgICByZXR1cm4gdGhpcy5tZXRob2RSZXF1ZXN0KCdnZXQnLCBwYXRoLCBvcHRzKTtcbiAgfVxuXG4gIHBvc3Q8UmVxLCBSc3A+KHBhdGg6IHN0cmluZywgb3B0cz86IFByb21pc2VPclZhbHVlPFJlcXVlc3RPcHRpb25zPFJlcT4+KTogQVBJUHJvbWlzZTxSc3A+IHtcbiAgICByZXR1cm4gdGhpcy5tZXRob2RSZXF1ZXN0KCdwb3N0JywgcGF0aCwgb3B0cyk7XG4gIH1cblxuICBwYXRjaDxSZXEsIFJzcD4ocGF0aDogc3RyaW5nLCBvcHRzPzogUHJvbWlzZU9yVmFsdWU8UmVxdWVzdE9wdGlvbnM8UmVxPj4pOiBBUElQcm9taXNlPFJzcD4ge1xuICAgIHJldHVybiB0aGlzLm1ldGhvZFJlcXVlc3QoJ3BhdGNoJywgcGF0aCwgb3B0cyk7XG4gIH1cblxuICBwdXQ8UmVxLCBSc3A+KHBhdGg6IHN0cmluZywgb3B0cz86IFByb21pc2VPclZhbHVlPFJlcXVlc3RPcHRpb25zPFJlcT4+KTogQVBJUHJvbWlzZTxSc3A+IHtcbiAgICByZXR1cm4gdGhpcy5tZXRob2RSZXF1ZXN0KCdwdXQnLCBwYXRoLCBvcHRzKTtcbiAgfVxuXG4gIGRlbGV0ZTxSZXEsIFJzcD4ocGF0aDogc3RyaW5nLCBvcHRzPzogUHJvbWlzZU9yVmFsdWU8UmVxdWVzdE9wdGlvbnM8UmVxPj4pOiBBUElQcm9taXNlPFJzcD4ge1xuICAgIHJldHVybiB0aGlzLm1ldGhvZFJlcXVlc3QoJ2RlbGV0ZScsIHBhdGgsIG9wdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXRob2RSZXF1ZXN0PFJlcSwgUnNwPihcbiAgICBtZXRob2Q6IEhUVFBNZXRob2QsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG9wdHM/OiBQcm9taXNlT3JWYWx1ZTxSZXF1ZXN0T3B0aW9uczxSZXE+PixcbiAgKTogQVBJUHJvbWlzZTxSc3A+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KFByb21pc2UucmVzb2x2ZShvcHRzKS50aGVuKChvcHRzKSA9PiAoeyBtZXRob2QsIHBhdGgsIC4uLm9wdHMgfSkpKTtcbiAgfVxuXG4gIGdldEFQSUxpc3Q8SXRlbSwgUGFnZUNsYXNzIGV4dGVuZHMgQWJzdHJhY3RQYWdlPEl0ZW0+ID0gQWJzdHJhY3RQYWdlPEl0ZW0+PihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgUGFnZTogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gUGFnZUNsYXNzLFxuICAgIG9wdHM/OiBSZXF1ZXN0T3B0aW9uczxhbnk+LFxuICApOiBQYWdlUHJvbWlzZTxQYWdlQ2xhc3MsIEl0ZW0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0QVBJTGlzdChQYWdlLCB7IG1ldGhvZDogJ2dldCcsIHBhdGgsIC4uLm9wdHMgfSk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUNvbnRlbnRMZW5ndGgoYm9keTogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gQnVmZmVyLmJ5dGVMZW5ndGgoYm9keSwgJ3V0ZjgnKS50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIFRleHRFbmNvZGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVyLmVuY29kZShib2R5KTtcbiAgICAgICAgcmV0dXJuIGVuY29kZWQubGVuZ3RoLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBidWlsZFJlcXVlc3Q8UmVxPihvcHRpb25zOiBGaW5hbFJlcXVlc3RPcHRpb25zPFJlcT4pOiB7IHJlcTogUmVxdWVzdEluaXQ7IHVybDogc3RyaW5nOyB0aW1lb3V0OiBudW1iZXIgfSB7XG4gICAgY29uc3QgeyBtZXRob2QsIHBhdGgsIHF1ZXJ5LCBoZWFkZXJzOiBoZWFkZXJzID0ge30gfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBib2R5ID1cbiAgICAgIGlzTXVsdGlwYXJ0Qm9keShvcHRpb25zLmJvZHkpID8gb3B0aW9ucy5ib2R5LmJvZHlcbiAgICAgIDogb3B0aW9ucy5ib2R5ID8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5ib2R5LCBudWxsLCAyKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGNvbnRlbnRMZW5ndGggPSB0aGlzLmNhbGN1bGF0ZUNvbnRlbnRMZW5ndGgoYm9keSk7XG5cbiAgICBjb25zdCB1cmwgPSB0aGlzLmJ1aWxkVVJMKHBhdGghLCBxdWVyeSk7XG4gICAgaWYgKCd0aW1lb3V0JyBpbiBvcHRpb25zKSB2YWxpZGF0ZVBvc2l0aXZlSW50ZWdlcigndGltZW91dCcsIG9wdGlvbnMudGltZW91dCk7XG4gICAgY29uc3QgdGltZW91dCA9IG9wdGlvbnMudGltZW91dCA/PyB0aGlzLnRpbWVvdXQ7XG4gICAgY29uc3QgaHR0cEFnZW50ID0gb3B0aW9ucy5odHRwQWdlbnQgPz8gdGhpcy5odHRwQWdlbnQgPz8gZ2V0RGVmYXVsdEFnZW50KHVybCk7XG4gICAgY29uc3QgbWluQWdlbnRUaW1lb3V0ID0gdGltZW91dCArIDEwMDA7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIChodHRwQWdlbnQgYXMgYW55KT8ub3B0aW9ucz8udGltZW91dCA9PT0gJ251bWJlcicgJiZcbiAgICAgIG1pbkFnZW50VGltZW91dCA+ICgoaHR0cEFnZW50IGFzIGFueSkub3B0aW9ucy50aW1lb3V0ID8/IDApXG4gICAgKSB7XG4gICAgICAvLyBBbGxvdyBhbnkgZ2l2ZW4gcmVxdWVzdCB0byBidW1wIG91ciBhZ2VudCBhY3RpdmUgc29ja2V0IHRpbWVvdXQuXG4gICAgICAvLyBUaGlzIG1heSBzZWVtIHN0cmFuZ2UsIGJ1dCBsZWFraW5nIGFjdGl2ZSBzb2NrZXRzIHNob3VsZCBiZSByYXJlIGFuZCBub3QgcGFydGljdWxhcmx5IHByb2JsZW1hdGljLFxuICAgICAgLy8gYW5kIHdpdGhvdXQgbXV0YXRpbmcgYWdlbnQgd2Ugd291bGQgbmVlZCB0byBjcmVhdGUgbW9yZSBvZiB0aGVtLlxuICAgICAgLy8gVGhpcyB0cmFkZW9mZiBvcHRpbWl6ZXMgZm9yIHBlcmZvcm1hbmNlLlxuICAgICAgKGh0dHBBZ2VudCBhcyBhbnkpLm9wdGlvbnMudGltZW91dCA9IG1pbkFnZW50VGltZW91dDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pZGVtcG90ZW5jeUhlYWRlciAmJiBtZXRob2QgIT09ICdnZXQnKSB7XG4gICAgICBpZiAoIW9wdGlvbnMuaWRlbXBvdGVuY3lLZXkpIG9wdGlvbnMuaWRlbXBvdGVuY3lLZXkgPSB0aGlzLmRlZmF1bHRJZGVtcG90ZW5jeUtleSgpO1xuICAgICAgaGVhZGVyc1t0aGlzLmlkZW1wb3RlbmN5SGVhZGVyXSA9IG9wdGlvbnMuaWRlbXBvdGVuY3lLZXk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxSGVhZGVycyA9IHRoaXMuYnVpbGRIZWFkZXJzKHsgb3B0aW9ucywgaGVhZGVycywgY29udGVudExlbmd0aCB9KTtcblxuICAgIGNvbnN0IHJlcTogUmVxdWVzdEluaXQgPSB7XG4gICAgICBtZXRob2QsXG4gICAgICAuLi4oYm9keSAmJiB7IGJvZHk6IGJvZHkgYXMgYW55IH0pLFxuICAgICAgaGVhZGVyczogcmVxSGVhZGVycyxcbiAgICAgIC4uLihodHRwQWdlbnQgJiYgeyBhZ2VudDogaHR0cEFnZW50IH0pLFxuICAgICAgLy8gQHRzLWlnbm9yZSBub2RlLWZldGNoIHVzZXMgYSBjdXN0b20gQWJvcnRTaWduYWwgdHlwZSB0aGF0IGlzXG4gICAgICAvLyBub3QgY29tcGF0aWJsZSB3aXRoIHN0YW5kYXJkIHdlYiB0eXBlc1xuICAgICAgc2lnbmFsOiBvcHRpb25zLnNpZ25hbCA/PyBudWxsLFxuICAgIH07XG5cbiAgICByZXR1cm4geyByZXEsIHVybCwgdGltZW91dCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEhlYWRlcnMoe1xuICAgIG9wdGlvbnMsXG4gICAgaGVhZGVycyxcbiAgICBjb250ZW50TGVuZ3RoLFxuICB9OiB7XG4gICAgb3B0aW9uczogRmluYWxSZXF1ZXN0T3B0aW9ucztcbiAgICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPjtcbiAgICBjb250ZW50TGVuZ3RoOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICB9KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgcmVxSGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGlmIChjb250ZW50TGVuZ3RoKSB7XG4gICAgICByZXFIZWFkZXJzWydjb250ZW50LWxlbmd0aCddID0gY29udGVudExlbmd0aDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0SGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnMob3B0aW9ucyk7XG4gICAgYXBwbHlIZWFkZXJzTXV0KHJlcUhlYWRlcnMsIGRlZmF1bHRIZWFkZXJzKTtcbiAgICBhcHBseUhlYWRlcnNNdXQocmVxSGVhZGVycywgaGVhZGVycyk7XG5cbiAgICAvLyBsZXQgYnVpbHRpbiBmZXRjaCBzZXQgdGhlIENvbnRlbnQtVHlwZSBmb3IgbXVsdGlwYXJ0IGJvZGllc1xuICAgIGlmIChpc011bHRpcGFydEJvZHkob3B0aW9ucy5ib2R5KSAmJiBzaGltc0tpbmQgIT09ICdub2RlJykge1xuICAgICAgZGVsZXRlIHJlcUhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddO1xuICAgIH1cblxuICAgIHRoaXMudmFsaWRhdGVIZWFkZXJzKHJlcUhlYWRlcnMsIGhlYWRlcnMpO1xuXG4gICAgcmV0dXJuIHJlcUhlYWRlcnM7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBhcyBhIGNhbGxiYWNrIGZvciBtdXRhdGluZyB0aGUgZ2l2ZW4gYEZpbmFsUmVxdWVzdE9wdGlvbnNgIG9iamVjdC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBwcmVwYXJlT3B0aW9ucyhvcHRpb25zOiBGaW5hbFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKlxuICAgKiBVc2VkIGFzIGEgY2FsbGJhY2sgZm9yIG11dGF0aW5nIHRoZSBnaXZlbiBgUmVxdWVzdEluaXRgIG9iamVjdC5cbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgZm9yIGNhc2VzIHdoZXJlIHlvdSB3YW50IHRvIGFkZCBjZXJ0YWluIGhlYWRlcnMgYmFzZWQgb2ZmIG9mXG4gICAqIHRoZSByZXF1ZXN0IHByb3BlcnRpZXMsIGUuZy4gYG1ldGhvZGAgb3IgYHVybGAuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcHJlcGFyZVJlcXVlc3QoXG4gICAgcmVxdWVzdDogUmVxdWVzdEluaXQsXG4gICAgeyB1cmwsIG9wdGlvbnMgfTogeyB1cmw6IHN0cmluZzsgb3B0aW9uczogRmluYWxSZXF1ZXN0T3B0aW9ucyB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgcHJvdGVjdGVkIHBhcnNlSGVhZGVycyhoZWFkZXJzOiBIZWFkZXJzSW5pdCB8IG51bGwgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gKFxuICAgICAgIWhlYWRlcnMgPyB7fVxuICAgICAgOiBTeW1ib2wuaXRlcmF0b3IgaW4gaGVhZGVycyA/XG4gICAgICAgIE9iamVjdC5mcm9tRW50cmllcyhBcnJheS5mcm9tKGhlYWRlcnMgYXMgSXRlcmFibGU8c3RyaW5nW10+KS5tYXAoKGhlYWRlcikgPT4gWy4uLmhlYWRlcl0pKVxuICAgICAgOiB7IC4uLmhlYWRlcnMgfVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFrZVN0YXR1c0Vycm9yKFxuICAgIHN0YXR1czogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGVycm9yOiBPYmplY3QgfCB1bmRlZmluZWQsXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGhlYWRlcnM6IEhlYWRlcnMgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIHJldHVybiBBUElFcnJvci5nZW5lcmF0ZShzdGF0dXMsIGVycm9yLCBtZXNzYWdlLCBoZWFkZXJzKTtcbiAgfVxuXG4gIHJlcXVlc3Q8UmVxLCBSc3A+KFxuICAgIG9wdGlvbnM6IFByb21pc2VPclZhbHVlPEZpbmFsUmVxdWVzdE9wdGlvbnM8UmVxPj4sXG4gICAgcmVtYWluaW5nUmV0cmllczogbnVtYmVyIHwgbnVsbCA9IG51bGwsXG4gICk6IEFQSVByb21pc2U8UnNwPiB7XG4gICAgcmV0dXJuIG5ldyBBUElQcm9taXNlKHRoaXMubWFrZVJlcXVlc3Qob3B0aW9ucywgcmVtYWluaW5nUmV0cmllcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBtYWtlUmVxdWVzdDxSZXE+KFxuICAgIG9wdGlvbnNJbnB1dDogUHJvbWlzZU9yVmFsdWU8RmluYWxSZXF1ZXN0T3B0aW9uczxSZXE+PixcbiAgICByZXRyaWVzUmVtYWluaW5nOiBudW1iZXIgfCBudWxsLFxuICApOiBQcm9taXNlPEFQSVJlc3BvbnNlUHJvcHM+IHtcbiAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgb3B0aW9uc0lucHV0O1xuICAgIGlmIChyZXRyaWVzUmVtYWluaW5nID09IG51bGwpIHtcbiAgICAgIHJldHJpZXNSZW1haW5pbmcgPSBvcHRpb25zLm1heFJldHJpZXMgPz8gdGhpcy5tYXhSZXRyaWVzO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucHJlcGFyZU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICBjb25zdCB7IHJlcSwgdXJsLCB0aW1lb3V0IH0gPSB0aGlzLmJ1aWxkUmVxdWVzdChvcHRpb25zKTtcblxuICAgIGF3YWl0IHRoaXMucHJlcGFyZVJlcXVlc3QocmVxLCB7IHVybCwgb3B0aW9ucyB9KTtcblxuICAgIGRlYnVnKCdyZXF1ZXN0JywgdXJsLCBvcHRpb25zLCByZXEuaGVhZGVycyk7XG5cbiAgICBpZiAob3B0aW9ucy5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBBUElVc2VyQWJvcnRFcnJvcigpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoV2l0aFRpbWVvdXQodXJsLCByZXEsIHRpbWVvdXQsIGNvbnRyb2xsZXIpLmNhdGNoKGNhc3RUb0Vycm9yKTtcblxuICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBpZiAob3B0aW9ucy5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFQSVVzZXJBYm9ydEVycm9yKCk7XG4gICAgICB9XG4gICAgICBpZiAocmV0cmllc1JlbWFpbmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXRyeVJlcXVlc3Qob3B0aW9ucywgcmV0cmllc1JlbWFpbmluZyk7XG4gICAgICB9XG4gICAgICBpZiAocmVzcG9uc2UubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIHRocm93IG5ldyBBUElDb25uZWN0aW9uVGltZW91dEVycm9yKCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgQVBJQ29ubmVjdGlvbkVycm9yKHsgY2F1c2U6IHJlc3BvbnNlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IGNyZWF0ZVJlc3BvbnNlSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGlmIChyZXRyaWVzUmVtYWluaW5nICYmIHRoaXMuc2hvdWxkUmV0cnkocmVzcG9uc2UpKSB7XG4gICAgICAgIGNvbnN0IHJldHJ5TWVzc2FnZSA9IGByZXRyeWluZywgJHtyZXRyaWVzUmVtYWluaW5nfSBhdHRlbXB0cyByZW1haW5pbmdgO1xuICAgICAgICBkZWJ1ZyhgcmVzcG9uc2UgKGVycm9yOyAke3JldHJ5TWVzc2FnZX0pYCwgcmVzcG9uc2Uuc3RhdHVzLCB1cmwsIHJlc3BvbnNlSGVhZGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJldHJ5UmVxdWVzdChvcHRpb25zLCByZXRyaWVzUmVtYWluaW5nLCByZXNwb25zZUhlYWRlcnMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpLmNhdGNoKChlKSA9PiBjYXN0VG9FcnJvcihlKS5tZXNzYWdlKTtcbiAgICAgIGNvbnN0IGVyckpTT04gPSBzYWZlSlNPTihlcnJUZXh0KTtcbiAgICAgIGNvbnN0IGVyck1lc3NhZ2UgPSBlcnJKU09OID8gdW5kZWZpbmVkIDogZXJyVGV4dDtcbiAgICAgIGNvbnN0IHJldHJ5TWVzc2FnZSA9IHJldHJpZXNSZW1haW5pbmcgPyBgKGVycm9yOyBubyBtb3JlIHJldHJpZXMgbGVmdClgIDogYChlcnJvcjsgbm90IHJldHJ5YWJsZSlgO1xuXG4gICAgICBkZWJ1ZyhgcmVzcG9uc2UgKGVycm9yOyAke3JldHJ5TWVzc2FnZX0pYCwgcmVzcG9uc2Uuc3RhdHVzLCB1cmwsIHJlc3BvbnNlSGVhZGVycywgZXJyTWVzc2FnZSk7XG5cbiAgICAgIGNvbnN0IGVyciA9IHRoaXMubWFrZVN0YXR1c0Vycm9yKHJlc3BvbnNlLnN0YXR1cywgZXJySlNPTiwgZXJyTWVzc2FnZSwgcmVzcG9uc2VIZWFkZXJzKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICByZXR1cm4geyByZXNwb25zZSwgb3B0aW9ucywgY29udHJvbGxlciB9O1xuICB9XG5cbiAgcmVxdWVzdEFQSUxpc3Q8SXRlbSA9IHVua25vd24sIFBhZ2VDbGFzcyBleHRlbmRzIEFic3RyYWN0UGFnZTxJdGVtPiA9IEFic3RyYWN0UGFnZTxJdGVtPj4oXG4gICAgUGFnZTogbmV3ICguLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIEFic3RyYWN0UGFnZT4pID0+IFBhZ2VDbGFzcyxcbiAgICBvcHRpb25zOiBGaW5hbFJlcXVlc3RPcHRpb25zLFxuICApOiBQYWdlUHJvbWlzZTxQYWdlQ2xhc3MsIEl0ZW0+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5tYWtlUmVxdWVzdChvcHRpb25zLCBudWxsKTtcbiAgICByZXR1cm4gbmV3IFBhZ2VQcm9taXNlPFBhZ2VDbGFzcywgSXRlbT4odGhpcywgcmVxdWVzdCwgUGFnZSk7XG4gIH1cblxuICBidWlsZFVSTDxSZXE+KHBhdGg6IHN0cmluZywgcXVlcnk6IFJlcSB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVybCA9XG4gICAgICBpc0Fic29sdXRlVVJMKHBhdGgpID9cbiAgICAgICAgbmV3IFVSTChwYXRoKVxuICAgICAgOiBuZXcgVVJMKHRoaXMuYmFzZVVSTCArICh0aGlzLmJhc2VVUkwuZW5kc1dpdGgoJy8nKSAmJiBwYXRoLnN0YXJ0c1dpdGgoJy8nKSA/IHBhdGguc2xpY2UoMSkgOiBwYXRoKSk7XG5cbiAgICBjb25zdCBkZWZhdWx0UXVlcnkgPSB0aGlzLmRlZmF1bHRRdWVyeSgpO1xuICAgIGlmICghaXNFbXB0eU9iaihkZWZhdWx0UXVlcnkpKSB7XG4gICAgICBxdWVyeSA9IHsgLi4uZGVmYXVsdFF1ZXJ5LCAuLi5xdWVyeSB9IGFzIFJlcTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHF1ZXJ5ID09PSAnb2JqZWN0JyAmJiBxdWVyeSAmJiAhQXJyYXkuaXNBcnJheShxdWVyeSkpIHtcbiAgICAgIHVybC5zZWFyY2ggPSB0aGlzLnN0cmluZ2lmeVF1ZXJ5KHF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RyaW5naWZ5UXVlcnkocXVlcnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMocXVlcnkpXG4gICAgICAuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICByZXR1cm4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKX1gO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBgJHtlbmNvZGVVUklDb21wb25lbnQoa2V5KX09YDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCBzdHJpbmdpZnkgdHlwZSAke3R5cGVvZiB2YWx1ZX07IEV4cGVjdGVkIHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBvciBudWxsLiBJZiB5b3UgbmVlZCB0byBwYXNzIG5lc3RlZCBxdWVyeSBwYXJhbWV0ZXJzLCB5b3UgY2FuIG1hbnVhbGx5IGVuY29kZSB0aGVtLCBlLmcuIHsgcXVlcnk6IHsgJ2Zvb1trZXkxXSc6IHZhbHVlMSwgJ2Zvb1trZXkyXSc6IHZhbHVlMiB9IH0sIGFuZCBwbGVhc2Ugb3BlbiBhIEdpdEh1YiBpc3N1ZSByZXF1ZXN0aW5nIGJldHRlciBzdXBwb3J0IGZvciB5b3VyIHVzZSBjYXNlLmAsXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJyYnKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoV2l0aFRpbWVvdXQoXG4gICAgdXJsOiBSZXF1ZXN0SW5mbyxcbiAgICBpbml0OiBSZXF1ZXN0SW5pdCB8IHVuZGVmaW5lZCxcbiAgICBtczogbnVtYmVyLFxuICAgIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcixcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgc2lnbmFsLCAuLi5vcHRpb25zIH0gPSBpbml0IHx8IHt9O1xuICAgIGlmIChzaWduYWwpIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSk7XG5cbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIG1zKTtcblxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmdldFJlcXVlc3RDbGllbnQoKVxuICAgICAgICAvLyB1c2UgdW5kZWZpbmVkIHRoaXMgYmluZGluZzsgZmV0Y2ggZXJyb3JzIGlmIGJvdW5kIHRvIHNvbWV0aGluZyBlbHNlIGluIGJyb3dzZXIvY2xvdWRmbGFyZVxuICAgICAgICAuZmV0Y2guY2FsbCh1bmRlZmluZWQsIHVybCwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIGFzIGFueSwgLi4ub3B0aW9ucyB9KVxuICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UmVxdWVzdENsaWVudCgpOiBSZXF1ZXN0Q2xpZW50IHtcbiAgICByZXR1cm4geyBmZXRjaDogdGhpcy5mZXRjaCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSZXRyeShyZXNwb25zZTogUmVzcG9uc2UpOiBib29sZWFuIHtcbiAgICAvLyBOb3RlIHRoaXMgaXMgbm90IGEgc3RhbmRhcmQgaGVhZGVyLlxuICAgIGNvbnN0IHNob3VsZFJldHJ5SGVhZGVyID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtc2hvdWxkLXJldHJ5Jyk7XG5cbiAgICAvLyBJZiB0aGUgc2VydmVyIGV4cGxpY2l0bHkgc2F5cyB3aGV0aGVyIG9yIG5vdCB0byByZXRyeSwgb2JleS5cbiAgICBpZiAoc2hvdWxkUmV0cnlIZWFkZXIgPT09ICd0cnVlJykgcmV0dXJuIHRydWU7XG4gICAgaWYgKHNob3VsZFJldHJ5SGVhZGVyID09PSAnZmFsc2UnKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSZXRyeSBvbiByZXF1ZXN0IHRpbWVvdXRzLlxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwOCkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBSZXRyeSBvbiBsb2NrIHRpbWVvdXRzLlxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwOSkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBSZXRyeSBvbiByYXRlIGxpbWl0cy5cbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MjkpIHJldHVybiB0cnVlO1xuXG4gICAgLy8gUmV0cnkgaW50ZXJuYWwgZXJyb3JzLlxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPj0gNTAwKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmV0cnlSZXF1ZXN0KFxuICAgIG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnMsXG4gICAgcmV0cmllc1JlbWFpbmluZzogbnVtYmVyLFxuICAgIHJlc3BvbnNlSGVhZGVycz86IEhlYWRlcnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8QVBJUmVzcG9uc2VQcm9wcz4ge1xuICAgIGxldCB0aW1lb3V0TWlsbGlzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBOb3RlIHRoZSBgcmV0cnktYWZ0ZXItbXNgIGhlYWRlciBtYXkgbm90IGJlIHN0YW5kYXJkLCBidXQgaXMgYSBnb29kIGlkZWEgYW5kIHdlJ2QgbGlrZSBwcm9hY3RpdmUgc3VwcG9ydCBmb3IgaXQuXG4gICAgY29uc3QgcmV0cnlBZnRlck1pbGxpc0hlYWRlciA9IHJlc3BvbnNlSGVhZGVycz8uWydyZXRyeS1hZnRlci1tcyddO1xuICAgIGlmIChyZXRyeUFmdGVyTWlsbGlzSGVhZGVyKSB7XG4gICAgICBjb25zdCB0aW1lb3V0TXMgPSBwYXJzZUZsb2F0KHJldHJ5QWZ0ZXJNaWxsaXNIZWFkZXIpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4odGltZW91dE1zKSkge1xuICAgICAgICB0aW1lb3V0TWlsbGlzID0gdGltZW91dE1zO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFib3V0IHRoZSBSZXRyeS1BZnRlciBoZWFkZXI6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvSGVhZGVycy9SZXRyeS1BZnRlclxuICAgIGNvbnN0IHJldHJ5QWZ0ZXJIZWFkZXIgPSByZXNwb25zZUhlYWRlcnM/LlsncmV0cnktYWZ0ZXInXTtcbiAgICBpZiAocmV0cnlBZnRlckhlYWRlciAmJiAhdGltZW91dE1pbGxpcykge1xuICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBwYXJzZUZsb2F0KHJldHJ5QWZ0ZXJIZWFkZXIpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4odGltZW91dFNlY29uZHMpKSB7XG4gICAgICAgIHRpbWVvdXRNaWxsaXMgPSB0aW1lb3V0U2Vjb25kcyAqIDEwMDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aW1lb3V0TWlsbGlzID0gRGF0ZS5wYXJzZShyZXRyeUFmdGVySGVhZGVyKSAtIERhdGUubm93KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIEFQSSBhc2tzIHVzIHRvIHdhaXQgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lIChhbmQgaXQncyBhIHJlYXNvbmFibGUgYW1vdW50KSxcbiAgICAvLyBqdXN0IGRvIHdoYXQgaXQgc2F5cywgYnV0IG90aGVyd2lzZSBjYWxjdWxhdGUgYSBkZWZhdWx0XG4gICAgaWYgKCEodGltZW91dE1pbGxpcyAmJiAwIDw9IHRpbWVvdXRNaWxsaXMgJiYgdGltZW91dE1pbGxpcyA8IDYwICogMTAwMCkpIHtcbiAgICAgIGNvbnN0IG1heFJldHJpZXMgPSBvcHRpb25zLm1heFJldHJpZXMgPz8gdGhpcy5tYXhSZXRyaWVzO1xuICAgICAgdGltZW91dE1pbGxpcyA9IHRoaXMuY2FsY3VsYXRlRGVmYXVsdFJldHJ5VGltZW91dE1pbGxpcyhyZXRyaWVzUmVtYWluaW5nLCBtYXhSZXRyaWVzKTtcbiAgICB9XG4gICAgYXdhaXQgc2xlZXAodGltZW91dE1pbGxpcyk7XG5cbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdChvcHRpb25zLCByZXRyaWVzUmVtYWluaW5nIC0gMSk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZURlZmF1bHRSZXRyeVRpbWVvdXRNaWxsaXMocmV0cmllc1JlbWFpbmluZzogbnVtYmVyLCBtYXhSZXRyaWVzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGluaXRpYWxSZXRyeURlbGF5ID0gMC41O1xuICAgIGNvbnN0IG1heFJldHJ5RGVsYXkgPSA4LjA7XG5cbiAgICBjb25zdCBudW1SZXRyaWVzID0gbWF4UmV0cmllcyAtIHJldHJpZXNSZW1haW5pbmc7XG5cbiAgICAvLyBBcHBseSBleHBvbmVudGlhbCBiYWNrb2ZmLCBidXQgbm90IG1vcmUgdGhhbiB0aGUgbWF4LlxuICAgIGNvbnN0IHNsZWVwU2Vjb25kcyA9IE1hdGgubWluKGluaXRpYWxSZXRyeURlbGF5ICogTWF0aC5wb3coMiwgbnVtUmV0cmllcyksIG1heFJldHJ5RGVsYXkpO1xuXG4gICAgLy8gQXBwbHkgc29tZSBqaXR0ZXIsIHRha2UgdXAgdG8gYXQgbW9zdCAyNSBwZXJjZW50IG9mIHRoZSByZXRyeSB0aW1lLlxuICAgIGNvbnN0IGppdHRlciA9IDEgLSBNYXRoLnJhbmRvbSgpICogMC4yNTtcblxuICAgIHJldHVybiBzbGVlcFNlY29uZHMgKiBqaXR0ZXIgKiAxMDAwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVc2VyQWdlbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS9KUyAke1ZFUlNJT059YDtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBQYWdlSW5mbyA9IHsgdXJsOiBVUkwgfSB8IHsgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfTtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGFnZTxJdGVtPiBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGU8SXRlbT4ge1xuICAjY2xpZW50OiBBUElDbGllbnQ7XG4gIHByb3RlY3RlZCBvcHRpb25zOiBGaW5hbFJlcXVlc3RPcHRpb25zO1xuXG4gIHByb3RlY3RlZCByZXNwb25zZTogUmVzcG9uc2U7XG4gIHByb3RlY3RlZCBib2R5OiB1bmtub3duO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQVBJQ2xpZW50LCByZXNwb25zZTogUmVzcG9uc2UsIGJvZHk6IHVua25vd24sIG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnMpIHtcbiAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgdGhpcy5ib2R5ID0gYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgbmV4dFBhZ2VJbmZvIGluc3RlYWRcbiAgICovXG4gIGFic3RyYWN0IG5leHRQYWdlUGFyYW1zKCk6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgbnVsbDtcbiAgYWJzdHJhY3QgbmV4dFBhZ2VJbmZvKCk6IFBhZ2VJbmZvIHwgbnVsbDtcblxuICBhYnN0cmFjdCBnZXRQYWdpbmF0ZWRJdGVtcygpOiBJdGVtW107XG5cbiAgaGFzTmV4dFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldFBhZ2luYXRlZEl0ZW1zKCk7XG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5uZXh0UGFnZUluZm8oKSAhPSBudWxsO1xuICB9XG5cbiAgYXN5bmMgZ2V0TmV4dFBhZ2UoKTogUHJvbWlzZTx0aGlzPiB7XG4gICAgY29uc3QgbmV4dEluZm8gPSB0aGlzLm5leHRQYWdlSW5mbygpO1xuICAgIGlmICghbmV4dEluZm8pIHtcbiAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihcbiAgICAgICAgJ05vIG5leHQgcGFnZSBleHBlY3RlZDsgcGxlYXNlIGNoZWNrIGAuaGFzTmV4dFBhZ2UoKWAgYmVmb3JlIGNhbGxpbmcgYC5nZXROZXh0UGFnZSgpYC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgbmV4dE9wdGlvbnMgPSB7IC4uLnRoaXMub3B0aW9ucyB9O1xuICAgIGlmICgncGFyYW1zJyBpbiBuZXh0SW5mbyAmJiB0eXBlb2YgbmV4dE9wdGlvbnMucXVlcnkgPT09ICdvYmplY3QnKSB7XG4gICAgICBuZXh0T3B0aW9ucy5xdWVyeSA9IHsgLi4ubmV4dE9wdGlvbnMucXVlcnksIC4uLm5leHRJbmZvLnBhcmFtcyB9O1xuICAgIH0gZWxzZSBpZiAoJ3VybCcgaW4gbmV4dEluZm8pIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IFsuLi5PYmplY3QuZW50cmllcyhuZXh0T3B0aW9ucy5xdWVyeSB8fCB7fSksIC4uLm5leHRJbmZvLnVybC5zZWFyY2hQYXJhbXMuZW50cmllcygpXTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHBhcmFtcykge1xuICAgICAgICBuZXh0SW5mby51cmwuc2VhcmNoUGFyYW1zLnNldChrZXksIHZhbHVlIGFzIGFueSk7XG4gICAgICB9XG4gICAgICBuZXh0T3B0aW9ucy5xdWVyeSA9IHVuZGVmaW5lZDtcbiAgICAgIG5leHRPcHRpb25zLnBhdGggPSBuZXh0SW5mby51cmwudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuI2NsaWVudC5yZXF1ZXN0QVBJTGlzdCh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSwgbmV4dE9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgKml0ZXJQYWdlcygpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBsZXQgcGFnZTogQWJzdHJhY3RQYWdlPEl0ZW0+ID0gdGhpcztcbiAgICB5aWVsZCBwYWdlO1xuICAgIHdoaWxlIChwYWdlLmhhc05leHRQYWdlKCkpIHtcbiAgICAgIHBhZ2UgPSBhd2FpdCBwYWdlLmdldE5leHRQYWdlKCk7XG4gICAgICB5aWVsZCBwYWdlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgcGFnZSBvZiB0aGlzLml0ZXJQYWdlcygpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFnZS5nZXRQYWdpbmF0ZWRJdGVtcygpKSB7XG4gICAgICAgIHlpZWxkIGl0ZW07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGhpcyBzdWJjbGFzcyBvZiBQcm9taXNlIHdpbGwgcmVzb2x2ZSB0byBhbiBpbnN0YW50aWF0ZWQgUGFnZSBvbmNlIHRoZSByZXF1ZXN0IGNvbXBsZXRlcy5cbiAqXG4gKiBJdCBhbHNvIGltcGxlbWVudHMgQXN5bmNJdGVyYWJsZSB0byBhbGxvdyBhdXRvLXBhZ2luYXRpbmcgaXRlcmF0aW9uIG9uIGFuIHVuYXdhaXRlZCBsaXN0IGNhbGwsIGVnOlxuICpcbiAqICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBjbGllbnQuaXRlbXMubGlzdCgpKSB7XG4gKiAgICAgIGNvbnNvbGUubG9nKGl0ZW0pXG4gKiAgICB9XG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlUHJvbWlzZTxcbiAgICBQYWdlQ2xhc3MgZXh0ZW5kcyBBYnN0cmFjdFBhZ2U8SXRlbT4sXG4gICAgSXRlbSA9IFJldHVyblR5cGU8UGFnZUNsYXNzWydnZXRQYWdpbmF0ZWRJdGVtcyddPltudW1iZXJdLFxuICA+XG4gIGV4dGVuZHMgQVBJUHJvbWlzZTxQYWdlQ2xhc3M+XG4gIGltcGxlbWVudHMgQXN5bmNJdGVyYWJsZTxJdGVtPlxue1xuICBjb25zdHJ1Y3RvcihcbiAgICBjbGllbnQ6IEFQSUNsaWVudCxcbiAgICByZXF1ZXN0OiBQcm9taXNlPEFQSVJlc3BvbnNlUHJvcHM+LFxuICAgIFBhZ2U6IG5ldyAoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBBYnN0cmFjdFBhZ2U+KSA9PiBQYWdlQ2xhc3MsXG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGFzeW5jIChwcm9wcykgPT4gbmV3IFBhZ2UoY2xpZW50LCBwcm9wcy5yZXNwb25zZSwgYXdhaXQgZGVmYXVsdFBhcnNlUmVzcG9uc2UocHJvcHMpLCBwcm9wcy5vcHRpb25zKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IGF1dG8tcGFnaW5hdGluZyBpdGVyYXRpb24gb24gYW4gdW5hd2FpdGVkIGxpc3QgY2FsbCwgZWc6XG4gICAqXG4gICAqICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBjbGllbnQuaXRlbXMubGlzdCgpKSB7XG4gICAqICAgICAgY29uc29sZS5sb2coaXRlbSlcbiAgICogICAgfVxuICAgKi9cbiAgYXN5bmMgKltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgY29uc3QgcGFnZSA9IGF3YWl0IHRoaXM7XG4gICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIHBhZ2UpIHtcbiAgICAgIHlpZWxkIGl0ZW07XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZXNwb25zZUhlYWRlcnMgPSAoXG4gIGhlYWRlcnM6IEF3YWl0ZWQ8UmV0dXJuVHlwZTxGZXRjaD4+WydoZWFkZXJzJ10sXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgcmV0dXJuIG5ldyBQcm94eShcbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBoZWFkZXJzLmVudHJpZXMoKSxcbiAgICApLFxuICAgIHtcbiAgICAgIGdldCh0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbmFtZS50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0W2tleS50b0xvd2VyQ2FzZSgpXSB8fCB0YXJnZXRba2V5XTtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcbn07XG5cbnR5cGUgSFRUUE1ldGhvZCA9ICdnZXQnIHwgJ3Bvc3QnIHwgJ3B1dCcgfCAncGF0Y2gnIHwgJ2RlbGV0ZSc7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RDbGllbnQgPSB7IGZldGNoOiBGZXRjaCB9O1xuZXhwb3J0IHR5cGUgSGVhZGVycyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+O1xuZXhwb3J0IHR5cGUgRGVmYXVsdFF1ZXJ5ID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcbmV4cG9ydCB0eXBlIEtleXNFbnVtPFQ+ID0geyBbUCBpbiBrZXlvZiBSZXF1aXJlZDxUPl06IHRydWUgfTtcblxuZXhwb3J0IHR5cGUgUmVxdWVzdE9wdGlvbnM8UmVxID0gdW5rbm93biB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgUmVhZGFibGU+ID0ge1xuICBtZXRob2Q/OiBIVFRQTWV0aG9kO1xuICBwYXRoPzogc3RyaW5nO1xuICBxdWVyeT86IFJlcSB8IHVuZGVmaW5lZDtcbiAgYm9keT86IFJlcSB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIGhlYWRlcnM/OiBIZWFkZXJzIHwgdW5kZWZpbmVkO1xuXG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG4gIHN0cmVhbT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIGh0dHBBZ2VudD86IEFnZW50O1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCB8IG51bGw7XG4gIGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nO1xuXG4gIF9fYmluYXJ5UmVzcG9uc2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBfX3N0cmVhbUNsYXNzPzogdHlwZW9mIFN0cmVhbTtcbn07XG5cbi8vIFRoaXMgaXMgcmVxdWlyZWQgc28gdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIGlmIGEgZ2l2ZW4gb2JqZWN0IG1hdGNoZXMgdGhlIFJlcXVlc3RPcHRpb25zXG4vLyB0eXBlIGF0IHJ1bnRpbWUuIFdoaWxlIHRoaXMgcmVxdWlyZXMgZHVwbGljYXRpb24sIGl0IGlzIGVuZm9yY2VkIGJ5IHRoZSBUeXBlU2NyaXB0XG4vLyBjb21waWxlciBzdWNoIHRoYXQgYW55IG1pc3NpbmcgLyBleHRyYW5lb3VzIGtleXMgd2lsbCBjYXVzZSBhbiBlcnJvci5cbmNvbnN0IHJlcXVlc3RPcHRpb25zS2V5czogS2V5c0VudW08UmVxdWVzdE9wdGlvbnM+ID0ge1xuICBtZXRob2Q6IHRydWUsXG4gIHBhdGg6IHRydWUsXG4gIHF1ZXJ5OiB0cnVlLFxuICBib2R5OiB0cnVlLFxuICBoZWFkZXJzOiB0cnVlLFxuXG4gIG1heFJldHJpZXM6IHRydWUsXG4gIHN0cmVhbTogdHJ1ZSxcbiAgdGltZW91dDogdHJ1ZSxcbiAgaHR0cEFnZW50OiB0cnVlLFxuICBzaWduYWw6IHRydWUsXG4gIGlkZW1wb3RlbmN5S2V5OiB0cnVlLFxuXG4gIF9fYmluYXJ5UmVzcG9uc2U6IHRydWUsXG4gIF9fc3RyZWFtQ2xhc3M6IHRydWUsXG59O1xuXG5leHBvcnQgY29uc3QgaXNSZXF1ZXN0T3B0aW9ucyA9IChvYmo6IHVua25vd24pOiBvYmogaXMgUmVxdWVzdE9wdGlvbnMgPT4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmXG4gICAgb2JqICE9PSBudWxsICYmXG4gICAgIWlzRW1wdHlPYmoob2JqKSAmJlxuICAgIE9iamVjdC5rZXlzKG9iaikuZXZlcnkoKGspID0+IGhhc093bihyZXF1ZXN0T3B0aW9uc0tleXMsIGspKVxuICApO1xufTtcblxuZXhwb3J0IHR5cGUgRmluYWxSZXF1ZXN0T3B0aW9uczxSZXEgPSB1bmtub3duIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBSZWFkYWJsZT4gPSBSZXF1ZXN0T3B0aW9uczxSZXE+ICYge1xuICBtZXRob2Q6IEhUVFBNZXRob2Q7XG4gIHBhdGg6IHN0cmluZztcbn07XG5cbmRlY2xhcmUgY29uc3QgRGVubzogYW55O1xuZGVjbGFyZSBjb25zdCBFZGdlUnVudGltZTogYW55O1xudHlwZSBBcmNoID0gJ3gzMicgfCAneDY0JyB8ICdhcm0nIHwgJ2FybTY0JyB8IGBvdGhlcjoke3N0cmluZ31gIHwgJ3Vua25vd24nO1xudHlwZSBQbGF0Zm9ybU5hbWUgPVxuICB8ICdNYWNPUydcbiAgfCAnTGludXgnXG4gIHwgJ1dpbmRvd3MnXG4gIHwgJ0ZyZWVCU0QnXG4gIHwgJ09wZW5CU0QnXG4gIHwgJ2lPUydcbiAgfCAnQW5kcm9pZCdcbiAgfCBgT3RoZXI6JHtzdHJpbmd9YFxuICB8ICdVbmtub3duJztcbnR5cGUgQnJvd3NlciA9ICdpZScgfCAnZWRnZScgfCAnY2hyb21lJyB8ICdmaXJlZm94JyB8ICdzYWZhcmknO1xudHlwZSBQbGF0Zm9ybVByb3BlcnRpZXMgPSB7XG4gICdYLVN0YWlubGVzcy1MYW5nJzogJ2pzJztcbiAgJ1gtU3RhaW5sZXNzLVBhY2thZ2UtVmVyc2lvbic6IHN0cmluZztcbiAgJ1gtU3RhaW5sZXNzLU9TJzogUGxhdGZvcm1OYW1lO1xuICAnWC1TdGFpbmxlc3MtQXJjaCc6IEFyY2g7XG4gICdYLVN0YWlubGVzcy1SdW50aW1lJzogJ25vZGUnIHwgJ2Rlbm8nIHwgJ2VkZ2UnIHwgYGJyb3dzZXI6JHtCcm93c2VyfWAgfCAndW5rbm93bic7XG4gICdYLVN0YWlubGVzcy1SdW50aW1lLVZlcnNpb24nOiBzdHJpbmc7XG59O1xuY29uc3QgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzID0gKCk6IFBsYXRmb3JtUHJvcGVydGllcyA9PiB7XG4gIGlmICh0eXBlb2YgRGVubyAhPT0gJ3VuZGVmaW5lZCcgJiYgRGVuby5idWlsZCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdYLVN0YWlubGVzcy1MYW5nJzogJ2pzJyxcbiAgICAgICdYLVN0YWlubGVzcy1QYWNrYWdlLVZlcnNpb24nOiBWRVJTSU9OLFxuICAgICAgJ1gtU3RhaW5sZXNzLU9TJzogbm9ybWFsaXplUGxhdGZvcm0oRGVuby5idWlsZC5vcyksXG4gICAgICAnWC1TdGFpbmxlc3MtQXJjaCc6IG5vcm1hbGl6ZUFyY2goRGVuby5idWlsZC5hcmNoKSxcbiAgICAgICdYLVN0YWlubGVzcy1SdW50aW1lJzogJ2Rlbm8nLFxuICAgICAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUtVmVyc2lvbic6XG4gICAgICAgIHR5cGVvZiBEZW5vLnZlcnNpb24gPT09ICdzdHJpbmcnID8gRGVuby52ZXJzaW9uIDogRGVuby52ZXJzaW9uPy5kZW5vID8/ICd1bmtub3duJyxcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlb2YgRWRnZVJ1bnRpbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdYLVN0YWlubGVzcy1MYW5nJzogJ2pzJyxcbiAgICAgICdYLVN0YWlubGVzcy1QYWNrYWdlLVZlcnNpb24nOiBWRVJTSU9OLFxuICAgICAgJ1gtU3RhaW5sZXNzLU9TJzogJ1Vua25vd24nLFxuICAgICAgJ1gtU3RhaW5sZXNzLUFyY2gnOiBgb3RoZXI6JHtFZGdlUnVudGltZX1gLFxuICAgICAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUnOiAnZWRnZScsXG4gICAgICAnWC1TdGFpbmxlc3MtUnVudGltZS1WZXJzaW9uJzogcHJvY2Vzcy52ZXJzaW9uLFxuICAgIH07XG4gIH1cbiAgLy8gQ2hlY2sgaWYgTm9kZS5qc1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyA/IHByb2Nlc3MgOiAwKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdYLVN0YWlubGVzcy1MYW5nJzogJ2pzJyxcbiAgICAgICdYLVN0YWlubGVzcy1QYWNrYWdlLVZlcnNpb24nOiBWRVJTSU9OLFxuICAgICAgJ1gtU3RhaW5sZXNzLU9TJzogbm9ybWFsaXplUGxhdGZvcm0ocHJvY2Vzcy5wbGF0Zm9ybSksXG4gICAgICAnWC1TdGFpbmxlc3MtQXJjaCc6IG5vcm1hbGl6ZUFyY2gocHJvY2Vzcy5hcmNoKSxcbiAgICAgICdYLVN0YWlubGVzcy1SdW50aW1lJzogJ25vZGUnLFxuICAgICAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUtVmVyc2lvbic6IHByb2Nlc3MudmVyc2lvbixcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgYnJvd3NlckluZm8gPSBnZXRCcm93c2VySW5mbygpO1xuICBpZiAoYnJvd3NlckluZm8pIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ1gtU3RhaW5sZXNzLUxhbmcnOiAnanMnLFxuICAgICAgJ1gtU3RhaW5sZXNzLVBhY2thZ2UtVmVyc2lvbic6IFZFUlNJT04sXG4gICAgICAnWC1TdGFpbmxlc3MtT1MnOiAnVW5rbm93bicsXG4gICAgICAnWC1TdGFpbmxlc3MtQXJjaCc6ICd1bmtub3duJyxcbiAgICAgICdYLVN0YWlubGVzcy1SdW50aW1lJzogYGJyb3dzZXI6JHticm93c2VySW5mby5icm93c2VyfWAsXG4gICAgICAnWC1TdGFpbmxlc3MtUnVudGltZS1WZXJzaW9uJzogYnJvd3NlckluZm8udmVyc2lvbixcbiAgICB9O1xuICB9XG5cbiAgLy8gVE9ETyBhZGQgc3VwcG9ydCBmb3IgQ2xvdWRmbGFyZSB3b3JrZXJzLCBldGMuXG4gIHJldHVybiB7XG4gICAgJ1gtU3RhaW5sZXNzLUxhbmcnOiAnanMnLFxuICAgICdYLVN0YWlubGVzcy1QYWNrYWdlLVZlcnNpb24nOiBWRVJTSU9OLFxuICAgICdYLVN0YWlubGVzcy1PUyc6ICdVbmtub3duJyxcbiAgICAnWC1TdGFpbmxlc3MtQXJjaCc6ICd1bmtub3duJyxcbiAgICAnWC1TdGFpbmxlc3MtUnVudGltZSc6ICd1bmtub3duJyxcbiAgICAnWC1TdGFpbmxlc3MtUnVudGltZS1WZXJzaW9uJzogJ3Vua25vd24nLFxuICB9O1xufTtcblxudHlwZSBCcm93c2VySW5mbyA9IHtcbiAgYnJvd3NlcjogQnJvd3NlcjtcbiAgdmVyc2lvbjogc3RyaW5nO1xufTtcblxuZGVjbGFyZSBjb25zdCBuYXZpZ2F0b3I6IHsgdXNlckFnZW50OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcblxuLy8gTm90ZTogbW9kaWZpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vSlMtRGV2VG9vbHMvaG9zdC1lbnZpcm9ubWVudC9ibG9iL2IxYWI3OWVjZGUzN2RiNWQ2ZTE2M2MwNTBlNTRmZTdkMjg3ZDdjOTIvc3JjL2lzb21vcnBoaWMuYnJvd3Nlci50c1xuZnVuY3Rpb24gZ2V0QnJvd3NlckluZm8oKTogQnJvd3NlckluZm8gfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgPT09ICd1bmRlZmluZWQnIHx8ICFuYXZpZ2F0b3IpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIE5PVEU6IFRoZSBvcmRlciBtYXR0ZXJzIGhlcmUhXG4gIGNvbnN0IGJyb3dzZXJQYXR0ZXJucyA9IFtcbiAgICB7IGtleTogJ2VkZ2UnIGFzIGNvbnN0LCBwYXR0ZXJuOiAvRWRnZSg/OlxcVysoXFxkKylcXC4oXFxkKykoPzpcXC4oXFxkKykpPyk/LyB9LFxuICAgIHsga2V5OiAnaWUnIGFzIGNvbnN0LCBwYXR0ZXJuOiAvTVNJRSg/OlxcVysoXFxkKylcXC4oXFxkKykoPzpcXC4oXFxkKykpPyk/LyB9LFxuICAgIHsga2V5OiAnaWUnIGFzIGNvbnN0LCBwYXR0ZXJuOiAvVHJpZGVudCg/Oi4qcnZcXDooXFxkKylcXC4oXFxkKykoPzpcXC4oXFxkKykpPyk/LyB9LFxuICAgIHsga2V5OiAnY2hyb21lJyBhcyBjb25zdCwgcGF0dGVybjogL0Nocm9tZSg/OlxcVysoXFxkKylcXC4oXFxkKykoPzpcXC4oXFxkKykpPyk/LyB9LFxuICAgIHsga2V5OiAnZmlyZWZveCcgYXMgY29uc3QsIHBhdHRlcm46IC9GaXJlZm94KD86XFxXKyhcXGQrKVxcLihcXGQrKSg/OlxcLihcXGQrKSk/KT8vIH0sXG4gICAgeyBrZXk6ICdzYWZhcmknIGFzIGNvbnN0LCBwYXR0ZXJuOiAvKD86VmVyc2lvblxcVysoXFxkKylcXC4oXFxkKykoPzpcXC4oXFxkKykpPyk/KD86XFxXK01vYmlsZVxcUyopP1xcVytTYWZhcmkvIH0sXG4gIF07XG5cbiAgLy8gRmluZCB0aGUgRklSU1QgbWF0Y2hpbmcgYnJvd3NlclxuICBmb3IgKGNvbnN0IHsga2V5LCBwYXR0ZXJuIH0gb2YgYnJvd3NlclBhdHRlcm5zKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBtYWpvciA9IG1hdGNoWzFdIHx8IDA7XG4gICAgICBjb25zdCBtaW5vciA9IG1hdGNoWzJdIHx8IDA7XG4gICAgICBjb25zdCBwYXRjaCA9IG1hdGNoWzNdIHx8IDA7XG5cbiAgICAgIHJldHVybiB7IGJyb3dzZXI6IGtleSwgdmVyc2lvbjogYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2h9YCB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5jb25zdCBub3JtYWxpemVBcmNoID0gKGFyY2g6IHN0cmluZyk6IEFyY2ggPT4ge1xuICAvLyBOb2RlIGRvY3M6XG4gIC8vIC0gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9wcm9jZXNzLmh0bWwjcHJvY2Vzc2FyY2hcbiAgLy8gRGVubyBkb2NzOlxuICAvLyAtIGh0dHBzOi8vZG9jLmRlbm8ubGFuZC9kZW5vL3N0YWJsZS9+L0Rlbm8uYnVpbGRcbiAgaWYgKGFyY2ggPT09ICd4MzInKSByZXR1cm4gJ3gzMic7XG4gIGlmIChhcmNoID09PSAneDg2XzY0JyB8fCBhcmNoID09PSAneDY0JykgcmV0dXJuICd4NjQnO1xuICBpZiAoYXJjaCA9PT0gJ2FybScpIHJldHVybiAnYXJtJztcbiAgaWYgKGFyY2ggPT09ICdhYXJjaDY0JyB8fCBhcmNoID09PSAnYXJtNjQnKSByZXR1cm4gJ2FybTY0JztcbiAgaWYgKGFyY2gpIHJldHVybiBgb3RoZXI6JHthcmNofWA7XG4gIHJldHVybiAndW5rbm93bic7XG59O1xuXG5jb25zdCBub3JtYWxpemVQbGF0Zm9ybSA9IChwbGF0Zm9ybTogc3RyaW5nKTogUGxhdGZvcm1OYW1lID0+IHtcbiAgLy8gTm9kZSBwbGF0Zm9ybXM6XG4gIC8vIC0gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9wcm9jZXNzLmh0bWwjcHJvY2Vzc3BsYXRmb3JtXG4gIC8vIERlbm8gcGxhdGZvcm1zOlxuICAvLyAtIGh0dHBzOi8vZG9jLmRlbm8ubGFuZC9kZW5vL3N0YWJsZS9+L0Rlbm8uYnVpbGRcbiAgLy8gLSBodHRwczovL2dpdGh1Yi5jb20vZGVub2xhbmQvZGVuby9pc3N1ZXMvMTQ3OTlcblxuICBwbGF0Zm9ybSA9IHBsYXRmb3JtLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gTk9URTogdGhpcyBpT1MgY2hlY2sgaXMgdW50ZXN0ZWQgYW5kIG1heSBub3Qgd29ya1xuICAvLyBOb2RlIGRvZXMgbm90IHdvcmsgbmF0aXZlbHkgb24gSU9TLCB0aGVyZSBpcyBhIGZvcmsgYXRcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy1tb2JpbGUvbm9kZWpzLW1vYmlsZVxuICAvLyBob3dldmVyIGl0IGlzIHVua25vd24gYXQgdGhlIHRpbWUgb2Ygd3JpdGluZyBob3cgdG8gZGV0ZWN0IGlmIGl0IGlzIHJ1bm5pbmdcbiAgaWYgKHBsYXRmb3JtLmluY2x1ZGVzKCdpb3MnKSkgcmV0dXJuICdpT1MnO1xuICBpZiAocGxhdGZvcm0gPT09ICdhbmRyb2lkJykgcmV0dXJuICdBbmRyb2lkJztcbiAgaWYgKHBsYXRmb3JtID09PSAnZGFyd2luJykgcmV0dXJuICdNYWNPUyc7XG4gIGlmIChwbGF0Zm9ybSA9PT0gJ3dpbjMyJykgcmV0dXJuICdXaW5kb3dzJztcbiAgaWYgKHBsYXRmb3JtID09PSAnZnJlZWJzZCcpIHJldHVybiAnRnJlZUJTRCc7XG4gIGlmIChwbGF0Zm9ybSA9PT0gJ29wZW5ic2QnKSByZXR1cm4gJ09wZW5CU0QnO1xuICBpZiAocGxhdGZvcm0gPT09ICdsaW51eCcpIHJldHVybiAnTGludXgnO1xuICBpZiAocGxhdGZvcm0pIHJldHVybiBgT3RoZXI6JHtwbGF0Zm9ybX1gO1xuICByZXR1cm4gJ1Vua25vd24nO1xufTtcblxubGV0IF9wbGF0Zm9ybUhlYWRlcnM6IFBsYXRmb3JtUHJvcGVydGllcztcbmNvbnN0IGdldFBsYXRmb3JtSGVhZGVycyA9ICgpID0+IHtcbiAgcmV0dXJuIChfcGxhdGZvcm1IZWFkZXJzID8/PSBnZXRQbGF0Zm9ybVByb3BlcnRpZXMoKSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2FmZUpTT04gPSAodGV4dDogc3RyaW5nKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn07XG5cbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xOTcwOTg0NlxuY29uc3Qgc3RhcnRzV2l0aFNjaGVtZVJlZ2V4cCA9IG5ldyBSZWdFeHAoJ14oPzpbYS16XSs6KT8vLycsICdpJyk7XG5jb25zdCBpc0Fic29sdXRlVVJMID0gKHVybDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBzdGFydHNXaXRoU2NoZW1lUmVnZXhwLnRlc3QodXJsKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzbGVlcCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuXG5jb25zdCB2YWxpZGF0ZVBvc2l0aXZlSW50ZWdlciA9IChuYW1lOiBzdHJpbmcsIG46IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG4pKSB7XG4gICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGAke25hbWV9IG11c3QgYmUgYW4gaW50ZWdlcmApO1xuICB9XG4gIGlmIChuIDwgMCkge1xuICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcmApO1xuICB9XG4gIHJldHVybiBuO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhc3RUb0Vycm9yID0gKGVycjogYW55KTogRXJyb3IgPT4ge1xuICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBlcnI7XG4gIHJldHVybiBuZXcgRXJyb3IoZXJyKTtcbn07XG5cbmV4cG9ydCBjb25zdCBlbnN1cmVQcmVzZW50ID0gPFQ+KHZhbHVlOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFQgPT4ge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGBFeHBlY3RlZCBhIHZhbHVlIHRvIGJlIGdpdmVuIGJ1dCByZWNlaXZlZCAke3ZhbHVlfSBpbnN0ZWFkLmApO1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIFJlYWQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKlxuICogVHJpbXMgYmVnaW5uaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLlxuICpcbiAqIFdpbGwgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZG9lc24ndCBleGlzdCBvciBjYW5ub3QgYmUgYWNjZXNzZWQuXG4gKi9cbmV4cG9ydCBjb25zdCByZWFkRW52ID0gKGVudjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudj8uW2Vudl0/LnRyaW0oKSA/PyB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBEZW5vICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBEZW5vLmVudj8uZ2V0Py4oZW52KT8udHJpbSgpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgY29lcmNlSW50ZWdlciA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSk7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gcGFyc2VJbnQodmFsdWUsIDEwKTtcblxuICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYENvdWxkIG5vdCBjb2VyY2UgJHt2YWx1ZX0gKHR5cGU6ICR7dHlwZW9mIHZhbHVlfSkgaW50byBhIG51bWJlcmApO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvZXJjZUZsb2F0ID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiB2YWx1ZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcblxuICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYENvdWxkIG5vdCBjb2VyY2UgJHt2YWx1ZX0gKHR5cGU6ICR7dHlwZW9mIHZhbHVlfSkgaW50byBhIG51bWJlcmApO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvZXJjZUJvb2xlYW4gPSAodmFsdWU6IHVua25vd24pOiBib29sZWFuID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdmFsdWU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWUgPT09ICd0cnVlJztcbiAgcmV0dXJuIEJvb2xlYW4odmFsdWUpO1xufTtcblxuZXhwb3J0IGNvbnN0IG1heWJlQ29lcmNlSW50ZWdlciA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gY29lcmNlSW50ZWdlcih2YWx1ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgbWF5YmVDb2VyY2VGbG9hdCA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gY29lcmNlRmxvYXQodmFsdWUpO1xufTtcblxuZXhwb3J0IGNvbnN0IG1heWJlQ29lcmNlQm9vbGVhbiA9ICh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGNvZXJjZUJvb2xlYW4odmFsdWUpO1xufTtcblxuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM0NDkxMjg3XG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eU9iaihvYmo6IE9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFvYmopIHJldHVybiB0cnVlO1xuICBmb3IgKGNvbnN0IF9rIGluIG9iaikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gaHR0cHM6Ly9lc2xpbnQub3JnL2RvY3MvbGF0ZXN0L3J1bGVzL25vLXByb3RvdHlwZS1idWlsdGluc1xuZXhwb3J0IGZ1bmN0aW9uIGhhc093bihvYmo6IE9iamVjdCwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG59XG5cbi8qKlxuICogQ29waWVzIGhlYWRlcnMgZnJvbSBcIm5ld0hlYWRlcnNcIiBvbnRvIFwidGFyZ2V0SGVhZGVyc1wiLFxuICogdXNpbmcgbG93ZXItY2FzZSBmb3IgYWxsIHByb3BlcnRpZXMsXG4gKiBpZ25vcmluZyBhbnkga2V5cyB3aXRoIHVuZGVmaW5lZCB2YWx1ZXMsXG4gKiBhbmQgZGVsZXRpbmcgYW55IGtleXMgd2l0aCBudWxsIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gYXBwbHlIZWFkZXJzTXV0KHRhcmdldEhlYWRlcnM6IEhlYWRlcnMsIG5ld0hlYWRlcnM6IEhlYWRlcnMpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrIGluIG5ld0hlYWRlcnMpIHtcbiAgICBpZiAoIWhhc093bihuZXdIZWFkZXJzLCBrKSkgY29udGludWU7XG4gICAgY29uc3QgbG93ZXJLZXkgPSBrLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFsb3dlcktleSkgY29udGludWU7XG5cbiAgICBjb25zdCB2YWwgPSBuZXdIZWFkZXJzW2tdO1xuXG4gICAgaWYgKHZhbCA9PT0gbnVsbCkge1xuICAgICAgZGVsZXRlIHRhcmdldEhlYWRlcnNbbG93ZXJLZXldO1xuICAgIH0gZWxzZSBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhcmdldEhlYWRlcnNbbG93ZXJLZXldID0gdmFsO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVidWcoYWN0aW9uOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcz8uZW52Py5bJ0RFQlVHJ10gPT09ICd0cnVlJykge1xuICAgIGNvbnNvbGUubG9nKGBPcGVuQUk6REVCVUc6JHthY3Rpb259YCwgLi4uYXJncyk7XG4gIH1cbn1cblxuLyoqXG4gKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjExNzUyM1xuICovXG5jb25zdCB1dWlkNCA9ICgpID0+IHtcbiAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgKGMpID0+IHtcbiAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwO1xuICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4O1xuICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNSdW5uaW5nSW5Ccm93c2VyID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJ1xuICApO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBIZWFkZXJzUHJvdG9jb2wge1xuICBnZXQ6IChoZWFkZXI6IHN0cmluZykgPT4gc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCB0eXBlIEhlYWRlcnNMaWtlID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+IHwgSGVhZGVyc1Byb3RvY29sO1xuXG5leHBvcnQgY29uc3QgaXNIZWFkZXJzUHJvdG9jb2wgPSAoaGVhZGVyczogYW55KTogaGVhZGVycyBpcyBIZWFkZXJzUHJvdG9jb2wgPT4ge1xuICByZXR1cm4gdHlwZW9mIGhlYWRlcnM/LmdldCA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXF1aXJlZEhlYWRlciA9IChoZWFkZXJzOiBIZWFkZXJzTGlrZSwgaGVhZGVyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBsb3dlckNhc2VkSGVhZGVyID0gaGVhZGVyLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChpc0hlYWRlcnNQcm90b2NvbChoZWFkZXJzKSkge1xuICAgIC8vIHRvIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSB0aGUgaGVhZGVyIGxvb2tzIGxpa2UgU3RhaW5sZXNzLUV2ZW50LUlkXG4gICAgY29uc3QgaW50ZXJjYXBzSGVhZGVyID1cbiAgICAgIGhlYWRlclswXT8udG9VcHBlckNhc2UoKSArXG4gICAgICBoZWFkZXIuc3Vic3RyaW5nKDEpLnJlcGxhY2UoLyhbXlxcd10pKFxcdykvZywgKF9tLCBnMSwgZzIpID0+IGcxICsgZzIudG9VcHBlckNhc2UoKSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgW2hlYWRlciwgbG93ZXJDYXNlZEhlYWRlciwgaGVhZGVyLnRvVXBwZXJDYXNlKCksIGludGVyY2Fwc0hlYWRlcl0pIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gaGVhZGVycy5nZXQoa2V5KTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaGVhZGVycykpIHtcbiAgICBpZiAoa2V5LnRvTG93ZXJDYXNlKCkgPT09IGxvd2VyQ2FzZWRIZWFkZXIpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBpZiAodmFsdWUubGVuZ3RoIDw9IDEpIHJldHVybiB2YWx1ZVswXTtcbiAgICAgICAgY29uc29sZS53YXJuKGBSZWNlaXZlZCAke3ZhbHVlLmxlbmd0aH0gZW50cmllcyBmb3IgdGhlICR7aGVhZGVyfSBoZWFkZXIsIHVzaW5nIHRoZSBmaXJzdCBlbnRyeS5gKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlWzBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgJHtoZWFkZXJ9IGhlYWRlcmApO1xufTtcblxuLyoqXG4gKiBFbmNvZGVzIGEgc3RyaW5nIHRvIEJhc2U2NCBmb3JtYXQuXG4gKi9cbmV4cG9ydCBjb25zdCB0b0Jhc2U2NCA9IChzdHI6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuICBpZiAoIXN0cikgcmV0dXJuICcnO1xuICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oc3RyKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIGJ0b2EgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGJ0b2Eoc3RyKTtcbiAgfVxuXG4gIHRocm93IG5ldyBPcGVuQUlFcnJvcignQ2Fubm90IGdlbmVyYXRlIGI2NCBzdHJpbmc7IEV4cGVjdGVkIGBCdWZmZXJgIG9yIGBidG9hYCB0byBiZSBkZWZpbmVkJyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmoob2JqOiB1bmtub3duKTogb2JqIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG9iaik7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0IHsgQWJzdHJhY3RQYWdlLCBSZXNwb25zZSwgQVBJQ2xpZW50LCBGaW5hbFJlcXVlc3RPcHRpb25zLCBQYWdlSW5mbyB9IGZyb20gJy4vY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVJlc3BvbnNlPEl0ZW0+IHtcbiAgZGF0YTogQXJyYXk8SXRlbT47XG5cbiAgb2JqZWN0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTm90ZTogbm8gcGFnaW5hdGlvbiBhY3R1YWxseSBvY2N1cnMgeWV0LCB0aGlzIGlzIGZvciBmb3J3YXJkcy1jb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgY2xhc3MgUGFnZTxJdGVtPiBleHRlbmRzIEFic3RyYWN0UGFnZTxJdGVtPiBpbXBsZW1lbnRzIFBhZ2VSZXNwb25zZTxJdGVtPiB7XG4gIGRhdGE6IEFycmF5PEl0ZW0+O1xuXG4gIG9iamVjdDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQVBJQ2xpZW50LCByZXNwb25zZTogUmVzcG9uc2UsIGJvZHk6IFBhZ2VSZXNwb25zZTxJdGVtPiwgb3B0aW9uczogRmluYWxSZXF1ZXN0T3B0aW9ucykge1xuICAgIHN1cGVyKGNsaWVudCwgcmVzcG9uc2UsIGJvZHksIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5kYXRhID0gYm9keS5kYXRhIHx8IFtdO1xuICAgIHRoaXMub2JqZWN0ID0gYm9keS5vYmplY3Q7XG4gIH1cblxuICBnZXRQYWdpbmF0ZWRJdGVtcygpOiBJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPz8gW107XG4gIH1cblxuICAvLyBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIGBuZXh0UGFnZUluZm8oKWAgaW5zdGVhZFxuICAvKipcbiAgICogVGhpcyBwYWdlIHJlcHJlc2VudHMgYSByZXNwb25zZSB0aGF0IGlzbid0IGFjdHVhbGx5IHBhZ2luYXRlZCBhdCB0aGUgQVBJIGxldmVsXG4gICAqIHNvIHRoZXJlIHdpbGwgbmV2ZXIgYmUgYW55IG5leHQgcGFnZSBwYXJhbXMuXG4gICAqL1xuICBuZXh0UGFnZVBhcmFtcygpOiBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG5leHRQYWdlSW5mbygpOiBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1cnNvclBhZ2VSZXNwb25zZTxJdGVtPiB7XG4gIGRhdGE6IEFycmF5PEl0ZW0+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1cnNvclBhZ2VQYXJhbXMge1xuICBhZnRlcj86IHN0cmluZztcblxuICBsaW1pdD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEN1cnNvclBhZ2U8SXRlbSBleHRlbmRzIHsgaWQ6IHN0cmluZyB9PlxuICBleHRlbmRzIEFic3RyYWN0UGFnZTxJdGVtPlxuICBpbXBsZW1lbnRzIEN1cnNvclBhZ2VSZXNwb25zZTxJdGVtPlxue1xuICBkYXRhOiBBcnJheTxJdGVtPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjbGllbnQ6IEFQSUNsaWVudCxcbiAgICByZXNwb25zZTogUmVzcG9uc2UsXG4gICAgYm9keTogQ3Vyc29yUGFnZVJlc3BvbnNlPEl0ZW0+LFxuICAgIG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKGNsaWVudCwgcmVzcG9uc2UsIGJvZHksIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5kYXRhID0gYm9keS5kYXRhIHx8IFtdO1xuICB9XG5cbiAgZ2V0UGFnaW5hdGVkSXRlbXMoKTogSXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8/IFtdO1xuICB9XG5cbiAgLy8gQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBgbmV4dFBhZ2VJbmZvKClgIGluc3RlYWRcbiAgbmV4dFBhZ2VQYXJhbXMoKTogUGFydGlhbDxDdXJzb3JQYWdlUGFyYW1zPiB8IG51bGwge1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLm5leHRQYWdlSW5mbygpO1xuICAgIGlmICghaW5mbykgcmV0dXJuIG51bGw7XG4gICAgaWYgKCdwYXJhbXMnIGluIGluZm8pIHJldHVybiBpbmZvLnBhcmFtcztcbiAgICBjb25zdCBwYXJhbXMgPSBPYmplY3QuZnJvbUVudHJpZXMoaW5mby51cmwuc2VhcmNoUGFyYW1zKTtcbiAgICBpZiAoIU9iamVjdC5rZXlzKHBhcmFtcykubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgbmV4dFBhZ2VJbmZvKCk6IFBhZ2VJbmZvIHwgbnVsbCB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0UGFnaW5hdGVkSXRlbXMoKTtcbiAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IGRhdGFbZGF0YS5sZW5ndGggLSAxXT8uaWQ7XG4gICAgaWYgKCFpZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcGFyYW1zOiB7IGFmdGVyOiBpZCB9IH07XG4gIH1cbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgdHlwZSB7IE9wZW5BSSB9IGZyb20gJy4vaW5kZXgnO1xuXG5leHBvcnQgY2xhc3MgQVBJUmVzb3VyY2Uge1xuICBwcm90ZWN0ZWQgX2NsaWVudDogT3BlbkFJO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogT3BlbkFJKSB7XG4gICAgdGhpcy5fY2xpZW50ID0gY2xpZW50O1xuICB9XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tICcuLi8uLi9jb3JlJztcbmltcG9ydCB7IEFQSVByb21pc2UgfSBmcm9tICcuLi8uLi9jb3JlJztcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2UnO1xuaW1wb3J0ICogYXMgQ2hhdENvbXBsZXRpb25zQVBJIGZyb20gJy4vY29tcGxldGlvbnMnO1xuaW1wb3J0ICogYXMgQ29tcGxldGlvbnNBUEkgZnJvbSAnLi4vY29tcGxldGlvbnMnO1xuaW1wb3J0ICogYXMgU2hhcmVkIGZyb20gJy4uL3NoYXJlZCc7XG5pbXBvcnQgKiBhcyBDaGF0QVBJIGZyb20gJy4vY2hhdCc7XG5pbXBvcnQgeyBTdHJlYW0gfSBmcm9tICcuLi8uLi9zdHJlYW1pbmcnO1xuXG5leHBvcnQgY2xhc3MgQ29tcGxldGlvbnMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbW9kZWwgcmVzcG9uc2UgZm9yIHRoZSBnaXZlbiBjaGF0IGNvbnZlcnNhdGlvbi5cbiAgICovXG4gIGNyZWF0ZShcbiAgICBib2R5OiBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxDaGF0Q29tcGxldGlvbj47XG4gIGNyZWF0ZShcbiAgICBib2R5OiBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxTdHJlYW08Q2hhdENvbXBsZXRpb25DaHVuaz4+O1xuICBjcmVhdGUoXG4gICAgYm9keTogQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFN0cmVhbTxDaGF0Q29tcGxldGlvbkNodW5rPiB8IENoYXRDb21wbGV0aW9uPjtcbiAgY3JlYXRlKFxuICAgIGJvZHk6IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPENoYXRDb21wbGV0aW9uPiB8IEFQSVByb21pc2U8U3RyZWFtPENoYXRDb21wbGV0aW9uQ2h1bms+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvY2hhdC9jb21wbGV0aW9ucycsIHsgYm9keSwgLi4ub3B0aW9ucywgc3RyZWFtOiBib2R5LnN0cmVhbSA/PyBmYWxzZSB9KSBhc1xuICAgICAgfCBBUElQcm9taXNlPENoYXRDb21wbGV0aW9uPlxuICAgICAgfCBBUElQcm9taXNlPFN0cmVhbTxDaGF0Q29tcGxldGlvbkNodW5rPj47XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY2hhdCBjb21wbGV0aW9uIHJlc3BvbnNlIHJldHVybmVkIGJ5IG1vZGVsLCBiYXNlZCBvbiB0aGUgcHJvdmlkZWRcbiAqIGlucHV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uIHtcbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjaGF0IGNvbXBsZXRpb24uXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgY2hhdCBjb21wbGV0aW9uIGNob2ljZXMuIENhbiBiZSBtb3JlIHRoYW4gb25lIGlmIGBuYCBpcyBncmVhdGVyXG4gICAqIHRoYW4gMS5cbiAgICovXG4gIGNob2ljZXM6IEFycmF5PENoYXRDb21wbGV0aW9uLkNob2ljZT47XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgb2Ygd2hlbiB0aGUgY2hhdCBjb21wbGV0aW9uIHdhcyBjcmVhdGVkLlxuICAgKi9cbiAgY3JlYXRlZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgdXNlZCBmb3IgdGhlIGNoYXQgY29tcGxldGlvbi5cbiAgICovXG4gIG1vZGVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGBjaGF0LmNvbXBsZXRpb25gLlxuICAgKi9cbiAgb2JqZWN0OiAnY2hhdC5jb21wbGV0aW9uJztcblxuICAvKipcbiAgICogVGhpcyBmaW5nZXJwcmludCByZXByZXNlbnRzIHRoZSBiYWNrZW5kIGNvbmZpZ3VyYXRpb24gdGhhdCB0aGUgbW9kZWwgcnVucyB3aXRoLlxuICAgKlxuICAgKiBDYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgc2VlZGAgcmVxdWVzdCBwYXJhbWV0ZXIgdG8gdW5kZXJzdGFuZCB3aGVuXG4gICAqIGJhY2tlbmQgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0aGF0IG1pZ2h0IGltcGFjdCBkZXRlcm1pbmlzbS5cbiAgICovXG4gIHN5c3RlbV9maW5nZXJwcmludD86IHN0cmluZztcblxuICAvKipcbiAgICogVXNhZ2Ugc3RhdGlzdGljcyBmb3IgdGhlIGNvbXBsZXRpb24gcmVxdWVzdC5cbiAgICovXG4gIHVzYWdlPzogQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvblVzYWdlO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENoYXRDb21wbGV0aW9uIHtcbiAgZXhwb3J0IGludGVyZmFjZSBDaG9pY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb24gdGhlIG1vZGVsIHN0b3BwZWQgZ2VuZXJhdGluZyB0b2tlbnMuIFRoaXMgd2lsbCBiZSBgc3RvcGAgaWYgdGhlIG1vZGVsXG4gICAgICogaGl0IGEgbmF0dXJhbCBzdG9wIHBvaW50IG9yIGEgcHJvdmlkZWQgc3RvcCBzZXF1ZW5jZSwgYGxlbmd0aGAgaWYgdGhlIG1heGltdW1cbiAgICAgKiBudW1iZXIgb2YgdG9rZW5zIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3YXMgcmVhY2hlZCwgYGNvbnRlbnRfZmlsdGVyYCBpZlxuICAgICAqIGNvbnRlbnQgd2FzIG9taXR0ZWQgZHVlIHRvIGEgZmxhZyBmcm9tIG91ciBjb250ZW50IGZpbHRlcnMsIGB0b29sX2NhbGxzYCBpZiB0aGVcbiAgICAgKiBtb2RlbCBjYWxsZWQgYSB0b29sLCBvciBgZnVuY3Rpb25fY2FsbGAgKGRlcHJlY2F0ZWQpIGlmIHRoZSBtb2RlbCBjYWxsZWQgYVxuICAgICAqIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZpbmlzaF9yZWFzb246ICdzdG9wJyB8ICdsZW5ndGgnIHwgJ3Rvb2xfY2FsbHMnIHwgJ2NvbnRlbnRfZmlsdGVyJyB8ICdmdW5jdGlvbl9jYWxsJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY2hvaWNlIGluIHRoZSBsaXN0IG9mIGNob2ljZXMuXG4gICAgICovXG4gICAgaW5kZXg6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIExvZyBwcm9iYWJpbGl0eSBpbmZvcm1hdGlvbiBmb3IgdGhlIGNob2ljZS5cbiAgICAgKi9cbiAgICBsb2dwcm9iczogQ2hvaWNlLkxvZ3Byb2JzIHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEEgY2hhdCBjb21wbGV0aW9uIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbC5cbiAgICAgKi9cbiAgICBtZXNzYWdlOiBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25NZXNzYWdlO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBDaG9pY2Uge1xuICAgIC8qKlxuICAgICAqIExvZyBwcm9iYWJpbGl0eSBpbmZvcm1hdGlvbiBmb3IgdGhlIGNob2ljZS5cbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIExvZ3Byb2JzIHtcbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIG1lc3NhZ2UgY29udGVudCB0b2tlbnMgd2l0aCBsb2cgcHJvYmFiaWxpdHkgaW5mb3JtYXRpb24uXG4gICAgICAgKi9cbiAgICAgIGNvbnRlbnQ6IEFycmF5PENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblRva2VuTG9ncHJvYj4gfCBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uQXNzaXN0YW50TWVzc2FnZVBhcmFtIHtcbiAgLyoqXG4gICAqIFRoZSByb2xlIG9mIHRoZSBtZXNzYWdlcyBhdXRob3IsIGluIHRoaXMgY2FzZSBgYXNzaXN0YW50YC5cbiAgICovXG4gIHJvbGU6ICdhc3Npc3RhbnQnO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudHMgb2YgdGhlIGFzc2lzdGFudCBtZXNzYWdlLiBSZXF1aXJlZCB1bmxlc3MgYHRvb2xfY2FsbHNgIG9yXG4gICAqIGBmdW5jdGlvbl9jYWxsYCBpcyBzcGVjaWZpZWQuXG4gICAqL1xuICBjb250ZW50Pzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQ6IERlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIGJ5IGB0b29sX2NhbGxzYC4gVGhlIG5hbWUgYW5kIGFyZ3VtZW50cyBvZlxuICAgKiBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbC5cbiAgICovXG4gIGZ1bmN0aW9uX2NhbGw/OiBDaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbS5GdW5jdGlvbkNhbGw7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIG5hbWUgZm9yIHRoZSBwYXJ0aWNpcGFudC4gUHJvdmlkZXMgdGhlIG1vZGVsIGluZm9ybWF0aW9uIHRvXG4gICAqIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBwYXJ0aWNpcGFudHMgb2YgdGhlIHNhbWUgcm9sZS5cbiAgICovXG4gIG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0b29sIGNhbGxzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwsIHN1Y2ggYXMgZnVuY3Rpb24gY2FsbHMuXG4gICAqL1xuICB0b29sX2NhbGxzPzogQXJyYXk8Q2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGw+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENoYXRDb21wbGV0aW9uQXNzaXN0YW50TWVzc2FnZVBhcmFtIHtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkOiBEZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieSBgdG9vbF9jYWxsc2AuIFRoZSBuYW1lIGFuZCBhcmd1bWVudHMgb2ZcbiAgICogYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uQ2FsbCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsIGluIEpTT05cbiAgICAgKiBmb3JtYXQuIE5vdGUgdGhhdCB0aGUgbW9kZWwgZG9lcyBub3QgYWx3YXlzIGdlbmVyYXRlIHZhbGlkIEpTT04sIGFuZCBtYXlcbiAgICAgKiBoYWxsdWNpbmF0ZSBwYXJhbWV0ZXJzIG5vdCBkZWZpbmVkIGJ5IHlvdXIgZnVuY3Rpb24gc2NoZW1hLiBWYWxpZGF0ZSB0aGVcbiAgICAgKiBhcmd1bWVudHMgaW4geW91ciBjb2RlIGJlZm9yZSBjYWxsaW5nIHlvdXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgYXJndW1lbnRzOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc3RyZWFtZWQgY2h1bmsgb2YgYSBjaGF0IGNvbXBsZXRpb24gcmVzcG9uc2UgcmV0dXJuZWQgYnkgbW9kZWwsXG4gKiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgaW5wdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25DaHVuayB7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY2hhdCBjb21wbGV0aW9uLiBFYWNoIGNodW5rIGhhcyB0aGUgc2FtZSBJRC5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBjaGF0IGNvbXBsZXRpb24gY2hvaWNlcy4gQ2FuIGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBlbGVtZW50cyBpZiBgbmAgaXNcbiAgICogZ3JlYXRlciB0aGFuIDEuIENhbiBhbHNvIGJlIGVtcHR5IGZvciB0aGUgbGFzdCBjaHVuayBpZiB5b3Ugc2V0XG4gICAqIGBzdHJlYW1fb3B0aW9uczoge1wiaW5jbHVkZV91c2FnZVwiOiB0cnVlfWAuXG4gICAqL1xuICBjaG9pY2VzOiBBcnJheTxDaGF0Q29tcGxldGlvbkNodW5rLkNob2ljZT47XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgb2Ygd2hlbiB0aGUgY2hhdCBjb21wbGV0aW9uIHdhcyBjcmVhdGVkLiBFYWNoXG4gICAqIGNodW5rIGhhcyB0aGUgc2FtZSB0aW1lc3RhbXAuXG4gICAqL1xuICBjcmVhdGVkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlbCB0byBnZW5lcmF0ZSB0aGUgY29tcGxldGlvbi5cbiAgICovXG4gIG1vZGVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGBjaGF0LmNvbXBsZXRpb24uY2h1bmtgLlxuICAgKi9cbiAgb2JqZWN0OiAnY2hhdC5jb21wbGV0aW9uLmNodW5rJztcblxuICAvKipcbiAgICogVGhpcyBmaW5nZXJwcmludCByZXByZXNlbnRzIHRoZSBiYWNrZW5kIGNvbmZpZ3VyYXRpb24gdGhhdCB0aGUgbW9kZWwgcnVucyB3aXRoLlxuICAgKiBDYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgc2VlZGAgcmVxdWVzdCBwYXJhbWV0ZXIgdG8gdW5kZXJzdGFuZCB3aGVuXG4gICAqIGJhY2tlbmQgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0aGF0IG1pZ2h0IGltcGFjdCBkZXRlcm1pbmlzbS5cbiAgICovXG4gIHN5c3RlbV9maW5nZXJwcmludD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgZmllbGQgdGhhdCB3aWxsIG9ubHkgYmUgcHJlc2VudCB3aGVuIHlvdSBzZXRcbiAgICogYHN0cmVhbV9vcHRpb25zOiB7XCJpbmNsdWRlX3VzYWdlXCI6IHRydWV9YCBpbiB5b3VyIHJlcXVlc3QuIFdoZW4gcHJlc2VudCwgaXRcbiAgICogY29udGFpbnMgYSBudWxsIHZhbHVlIGV4Y2VwdCBmb3IgdGhlIGxhc3QgY2h1bmsgd2hpY2ggY29udGFpbnMgdGhlIHRva2VuIHVzYWdlXG4gICAqIHN0YXRpc3RpY3MgZm9yIHRoZSBlbnRpcmUgcmVxdWVzdC5cbiAgICovXG4gIHVzYWdlPzogQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvblVzYWdlO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENoYXRDb21wbGV0aW9uQ2h1bmsge1xuICBleHBvcnQgaW50ZXJmYWNlIENob2ljZSB7XG4gICAgLyoqXG4gICAgICogQSBjaGF0IGNvbXBsZXRpb24gZGVsdGEgZ2VuZXJhdGVkIGJ5IHN0cmVhbWVkIG1vZGVsIHJlc3BvbnNlcy5cbiAgICAgKi9cbiAgICBkZWx0YTogQ2hvaWNlLkRlbHRhO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbiB0aGUgbW9kZWwgc3RvcHBlZCBnZW5lcmF0aW5nIHRva2Vucy4gVGhpcyB3aWxsIGJlIGBzdG9wYCBpZiB0aGUgbW9kZWxcbiAgICAgKiBoaXQgYSBuYXR1cmFsIHN0b3AgcG9pbnQgb3IgYSBwcm92aWRlZCBzdG9wIHNlcXVlbmNlLCBgbGVuZ3RoYCBpZiB0aGUgbWF4aW11bVxuICAgICAqIG51bWJlciBvZiB0b2tlbnMgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHdhcyByZWFjaGVkLCBgY29udGVudF9maWx0ZXJgIGlmXG4gICAgICogY29udGVudCB3YXMgb21pdHRlZCBkdWUgdG8gYSBmbGFnIGZyb20gb3VyIGNvbnRlbnQgZmlsdGVycywgYHRvb2xfY2FsbHNgIGlmIHRoZVxuICAgICAqIG1vZGVsIGNhbGxlZCBhIHRvb2wsIG9yIGBmdW5jdGlvbl9jYWxsYCAoZGVwcmVjYXRlZCkgaWYgdGhlIG1vZGVsIGNhbGxlZCBhXG4gICAgICogZnVuY3Rpb24uXG4gICAgICovXG4gICAgZmluaXNoX3JlYXNvbjogJ3N0b3AnIHwgJ2xlbmd0aCcgfCAndG9vbF9jYWxscycgfCAnY29udGVudF9maWx0ZXInIHwgJ2Z1bmN0aW9uX2NhbGwnIHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY2hvaWNlIGluIHRoZSBsaXN0IG9mIGNob2ljZXMuXG4gICAgICovXG4gICAgaW5kZXg6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIExvZyBwcm9iYWJpbGl0eSBpbmZvcm1hdGlvbiBmb3IgdGhlIGNob2ljZS5cbiAgICAgKi9cbiAgICBsb2dwcm9icz86IENob2ljZS5Mb2dwcm9icyB8IG51bGw7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIENob2ljZSB7XG4gICAgLyoqXG4gICAgICogQSBjaGF0IGNvbXBsZXRpb24gZGVsdGEgZ2VuZXJhdGVkIGJ5IHN0cmVhbWVkIG1vZGVsIHJlc3BvbnNlcy5cbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIERlbHRhIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSBjaHVuayBtZXNzYWdlLlxuICAgICAgICovXG4gICAgICBjb250ZW50Pzogc3RyaW5nIHwgbnVsbDtcblxuICAgICAgLyoqXG4gICAgICAgKiBAZGVwcmVjYXRlZDogRGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgYnkgYHRvb2xfY2FsbHNgLiBUaGUgbmFtZSBhbmQgYXJndW1lbnRzIG9mXG4gICAgICAgKiBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbC5cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb25fY2FsbD86IERlbHRhLkZ1bmN0aW9uQ2FsbDtcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgcm9sZSBvZiB0aGUgYXV0aG9yIG9mIHRoaXMgbWVzc2FnZS5cbiAgICAgICAqL1xuICAgICAgcm9sZT86ICdzeXN0ZW0nIHwgJ3VzZXInIHwgJ2Fzc2lzdGFudCcgfCAndG9vbCc7XG5cbiAgICAgIHRvb2xfY2FsbHM/OiBBcnJheTxEZWx0YS5Ub29sQ2FsbD47XG4gICAgfVxuXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBEZWx0YSB7XG4gICAgICAvKipcbiAgICAgICAqIEBkZXByZWNhdGVkOiBEZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieSBgdG9vbF9jYWxsc2AuIFRoZSBuYW1lIGFuZCBhcmd1bWVudHMgb2ZcbiAgICAgICAqIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsLlxuICAgICAgICovXG4gICAgICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uQ2FsbCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGgsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwgaW4gSlNPTlxuICAgICAgICAgKiBmb3JtYXQuIE5vdGUgdGhhdCB0aGUgbW9kZWwgZG9lcyBub3QgYWx3YXlzIGdlbmVyYXRlIHZhbGlkIEpTT04sIGFuZCBtYXlcbiAgICAgICAgICogaGFsbHVjaW5hdGUgcGFyYW1ldGVycyBub3QgZGVmaW5lZCBieSB5b3VyIGZ1bmN0aW9uIHNjaGVtYS4gVmFsaWRhdGUgdGhlXG4gICAgICAgICAqIGFyZ3VtZW50cyBpbiB5b3VyIGNvZGUgYmVmb3JlIGNhbGxpbmcgeW91ciBmdW5jdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIGFyZ3VtZW50cz86IHN0cmluZztcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAgICAgICAqL1xuICAgICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgaW50ZXJmYWNlIFRvb2xDYWxsIHtcbiAgICAgICAgaW5kZXg6IG51bWJlcjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIElEIG9mIHRoZSB0b29sIGNhbGwuXG4gICAgICAgICAqL1xuICAgICAgICBpZD86IHN0cmluZztcblxuICAgICAgICBmdW5jdGlvbj86IFRvb2xDYWxsLkZ1bmN0aW9uO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdG9vbC4gQ3VycmVudGx5LCBvbmx5IGBmdW5jdGlvbmAgaXMgc3VwcG9ydGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdHlwZT86ICdmdW5jdGlvbic7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBuYW1lc3BhY2UgVG9vbENhbGwge1xuICAgICAgICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBUaGUgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGgsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwgaW4gSlNPTlxuICAgICAgICAgICAqIGZvcm1hdC4gTm90ZSB0aGF0IHRoZSBtb2RlbCBkb2VzIG5vdCBhbHdheXMgZ2VuZXJhdGUgdmFsaWQgSlNPTiwgYW5kIG1heVxuICAgICAgICAgICAqIGhhbGx1Y2luYXRlIHBhcmFtZXRlcnMgbm90IGRlZmluZWQgYnkgeW91ciBmdW5jdGlvbiBzY2hlbWEuIFZhbGlkYXRlIHRoZVxuICAgICAgICAgICAqIGFyZ3VtZW50cyBpbiB5b3VyIGNvZGUgYmVmb3JlIGNhbGxpbmcgeW91ciBmdW5jdGlvbi5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBhcmd1bWVudHM/OiBzdHJpbmc7XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9nIHByb2JhYmlsaXR5IGluZm9ybWF0aW9uIGZvciB0aGUgY2hvaWNlLlxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgTG9ncHJvYnMge1xuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgbWVzc2FnZSBjb250ZW50IHRva2VucyB3aXRoIGxvZyBwcm9iYWJpbGl0eSBpbmZvcm1hdGlvbi5cbiAgICAgICAqL1xuICAgICAgY29udGVudDogQXJyYXk8Q2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iPiB8IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIENoYXRDb21wbGV0aW9uQ29udGVudFBhcnQgPSBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0VGV4dCB8IENoYXRDb21wbGV0aW9uQ29udGVudFBhcnRJbWFnZTtcblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0SW1hZ2Uge1xuICBpbWFnZV91cmw6IENoYXRDb21wbGV0aW9uQ29udGVudFBhcnRJbWFnZS5JbWFnZVVSTDtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGNvbnRlbnQgcGFydC5cbiAgICovXG4gIHR5cGU6ICdpbWFnZV91cmwnO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENoYXRDb21wbGV0aW9uQ29udGVudFBhcnRJbWFnZSB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VVUkwge1xuICAgIC8qKlxuICAgICAqIEVpdGhlciBhIFVSTCBvZiB0aGUgaW1hZ2Ugb3IgdGhlIGJhc2U2NCBlbmNvZGVkIGltYWdlIGRhdGEuXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIGRldGFpbCBsZXZlbCBvZiB0aGUgaW1hZ2UuIExlYXJuIG1vcmUgaW4gdGhlXG4gICAgICogW1Zpc2lvbiBndWlkZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3Zpc2lvbi9sb3ctb3ItaGlnaC1maWRlbGl0eS1pbWFnZS11bmRlcnN0YW5kaW5nKS5cbiAgICAgKi9cbiAgICBkZXRhaWw/OiAnYXV0bycgfCAnbG93JyB8ICdoaWdoJztcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uQ29udGVudFBhcnRUZXh0IHtcbiAgLyoqXG4gICAqIFRoZSB0ZXh0IGNvbnRlbnQuXG4gICAqL1xuICB0ZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBjb250ZW50IHBhcnQuXG4gICAqL1xuICB0eXBlOiAndGV4dCc7XG59XG5cbi8qKlxuICogU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gdmlhIGB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn1gIGZvcmNlcyB0aGUgbW9kZWxcbiAqIHRvIGNhbGwgdGhhdCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uQ2FsbE9wdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uRnVuY3Rpb25NZXNzYWdlUGFyYW0ge1xuICAvKipcbiAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSBmdW5jdGlvbiBtZXNzYWdlLlxuICAgKi9cbiAgY29udGVudDogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByb2xlIG9mIHRoZSBtZXNzYWdlcyBhdXRob3IsIGluIHRoaXMgY2FzZSBgZnVuY3Rpb25gLlxuICAgKi9cbiAgcm9sZTogJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBBIGNoYXQgY29tcGxldGlvbiBtZXNzYWdlIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25NZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyBvZiB0aGUgbWVzc2FnZS5cbiAgICovXG4gIGNvbnRlbnQ6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSByb2xlIG9mIHRoZSBhdXRob3Igb2YgdGhpcyBtZXNzYWdlLlxuICAgKi9cbiAgcm9sZTogJ2Fzc2lzdGFudCc7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkOiBEZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieSBgdG9vbF9jYWxsc2AuIFRoZSBuYW1lIGFuZCBhcmd1bWVudHMgb2ZcbiAgICogYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwuXG4gICAqL1xuICBmdW5jdGlvbl9jYWxsPzogQ2hhdENvbXBsZXRpb25NZXNzYWdlLkZ1bmN0aW9uQ2FsbDtcblxuICAvKipcbiAgICogVGhlIHRvb2wgY2FsbHMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbCwgc3VjaCBhcyBmdW5jdGlvbiBjYWxscy5cbiAgICovXG4gIHRvb2xfY2FsbHM/OiBBcnJheTxDaGF0Q29tcGxldGlvbk1lc3NhZ2VUb29sQ2FsbD47XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2hhdENvbXBsZXRpb25NZXNzYWdlIHtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkOiBEZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieSBgdG9vbF9jYWxsc2AuIFRoZSBuYW1lIGFuZCBhcmd1bWVudHMgb2ZcbiAgICogYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uQ2FsbCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsIGluIEpTT05cbiAgICAgKiBmb3JtYXQuIE5vdGUgdGhhdCB0aGUgbW9kZWwgZG9lcyBub3QgYWx3YXlzIGdlbmVyYXRlIHZhbGlkIEpTT04sIGFuZCBtYXlcbiAgICAgKiBoYWxsdWNpbmF0ZSBwYXJhbWV0ZXJzIG5vdCBkZWZpbmVkIGJ5IHlvdXIgZnVuY3Rpb24gc2NoZW1hLiBWYWxpZGF0ZSB0aGVcbiAgICAgKiBhcmd1bWVudHMgaW4geW91ciBjb2RlIGJlZm9yZSBjYWxsaW5nIHlvdXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgYXJndW1lbnRzOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0gPVxuICB8IENoYXRDb21wbGV0aW9uU3lzdGVtTWVzc2FnZVBhcmFtXG4gIHwgQ2hhdENvbXBsZXRpb25Vc2VyTWVzc2FnZVBhcmFtXG4gIHwgQ2hhdENvbXBsZXRpb25Bc3Npc3RhbnRNZXNzYWdlUGFyYW1cbiAgfCBDaGF0Q29tcGxldGlvblRvb2xNZXNzYWdlUGFyYW1cbiAgfCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uTWVzc2FnZVRvb2xDYWxsIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgdGhlIG1vZGVsIGNhbGxlZC5cbiAgICovXG4gIGZ1bmN0aW9uOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2VUb29sQ2FsbC5GdW5jdGlvbjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHRvb2wuIEN1cnJlbnRseSwgb25seSBgZnVuY3Rpb25gIGlzIHN1cHBvcnRlZC5cbiAgICovXG4gIHR5cGU6ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGwge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgdGhlIG1vZGVsIGNhbGxlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBhcmd1bWVudHMgdG8gY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbCBpbiBKU09OXG4gICAgICogZm9ybWF0LiBOb3RlIHRoYXQgdGhlIG1vZGVsIGRvZXMgbm90IGFsd2F5cyBnZW5lcmF0ZSB2YWxpZCBKU09OLCBhbmQgbWF5XG4gICAgICogaGFsbHVjaW5hdGUgcGFyYW1ldGVycyBub3QgZGVmaW5lZCBieSB5b3VyIGZ1bmN0aW9uIHNjaGVtYS4gVmFsaWRhdGUgdGhlXG4gICAgICogYXJndW1lbnRzIGluIHlvdXIgY29kZSBiZWZvcmUgY2FsbGluZyB5b3VyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGFyZ3VtZW50czogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogU3BlY2lmaWVzIGEgdG9vbCB0aGUgbW9kZWwgc2hvdWxkIHVzZS4gVXNlIHRvIGZvcmNlIHRoZSBtb2RlbCB0byBjYWxsIGEgc3BlY2lmaWNcbiAqIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uTmFtZWRUb29sQ2hvaWNlIHtcbiAgZnVuY3Rpb246IENoYXRDb21wbGV0aW9uTmFtZWRUb29sQ2hvaWNlLkZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgdG9vbC4gQ3VycmVudGx5LCBvbmx5IGBmdW5jdGlvbmAgaXMgc3VwcG9ydGVkLlxuICAgKi9cbiAgdHlwZTogJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0Q29tcGxldGlvbk5hbWVkVG9vbENob2ljZSB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIFRoZSByb2xlIG9mIHRoZSBhdXRob3Igb2YgYSBtZXNzYWdlXG4gKi9cbmV4cG9ydCB0eXBlIENoYXRDb21wbGV0aW9uUm9sZSA9ICdzeXN0ZW0nIHwgJ3VzZXInIHwgJ2Fzc2lzdGFudCcgfCAndG9vbCcgfCAnZnVuY3Rpb24nO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0cmVhbWluZyByZXNwb25zZS4gT25seSBzZXQgdGhpcyB3aGVuIHlvdSBzZXQgYHN0cmVhbTogdHJ1ZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25TdHJlYW1PcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHNldCwgYW4gYWRkaXRpb25hbCBjaHVuayB3aWxsIGJlIHN0cmVhbWVkIGJlZm9yZSB0aGUgYGRhdGE6IFtET05FXWAgbWVzc2FnZS5cbiAgICogVGhlIGB1c2FnZWAgZmllbGQgb24gdGhpcyBjaHVuayBzaG93cyB0aGUgdG9rZW4gdXNhZ2Ugc3RhdGlzdGljcyBmb3IgdGhlIGVudGlyZVxuICAgKiByZXF1ZXN0LCBhbmQgdGhlIGBjaG9pY2VzYCBmaWVsZCB3aWxsIGFsd2F5cyBiZSBhbiBlbXB0eSBhcnJheS4gQWxsIG90aGVyIGNodW5rc1xuICAgKiB3aWxsIGFsc28gaW5jbHVkZSBhIGB1c2FnZWAgZmllbGQsIGJ1dCB3aXRoIGEgbnVsbCB2YWx1ZS5cbiAgICovXG4gIGluY2x1ZGVfdXNhZ2U/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uU3lzdGVtTWVzc2FnZVBhcmFtIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyBvZiB0aGUgc3lzdGVtIG1lc3NhZ2UuXG4gICAqL1xuICBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByb2xlIG9mIHRoZSBtZXNzYWdlcyBhdXRob3IsIGluIHRoaXMgY2FzZSBgc3lzdGVtYC5cbiAgICovXG4gIHJvbGU6ICdzeXN0ZW0nO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBuYW1lIGZvciB0aGUgcGFydGljaXBhbnQuIFByb3ZpZGVzIHRoZSBtb2RlbCBpbmZvcm1hdGlvbiB0b1xuICAgKiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcGFydGljaXBhbnRzIG9mIHRoZSBzYW1lIHJvbGUuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iIHtcbiAgLyoqXG4gICAqIFRoZSB0b2tlbi5cbiAgICovXG4gIHRva2VuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBpbnRlZ2VycyByZXByZXNlbnRpbmcgdGhlIFVURi04IGJ5dGVzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0b2tlbi5cbiAgICogVXNlZnVsIGluIGluc3RhbmNlcyB3aGVyZSBjaGFyYWN0ZXJzIGFyZSByZXByZXNlbnRlZCBieSBtdWx0aXBsZSB0b2tlbnMgYW5kXG4gICAqIHRoZWlyIGJ5dGUgcmVwcmVzZW50YXRpb25zIG11c3QgYmUgY29tYmluZWQgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlY3QgdGV4dFxuICAgKiByZXByZXNlbnRhdGlvbi4gQ2FuIGJlIGBudWxsYCBpZiB0aGVyZSBpcyBubyBieXRlcyByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHRva2VuLlxuICAgKi9cbiAgYnl0ZXM6IEFycmF5PG51bWJlcj4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nIHByb2JhYmlsaXR5IG9mIHRoaXMgdG9rZW4sIGlmIGl0IGlzIHdpdGhpbiB0aGUgdG9wIDIwIG1vc3QgbGlrZWx5XG4gICAqIHRva2Vucy4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgYC05OTk5LjBgIGlzIHVzZWQgdG8gc2lnbmlmeSB0aGF0IHRoZSB0b2tlbiBpcyB2ZXJ5XG4gICAqIHVubGlrZWx5LlxuICAgKi9cbiAgbG9ncHJvYjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHRoZSBtb3N0IGxpa2VseSB0b2tlbnMgYW5kIHRoZWlyIGxvZyBwcm9iYWJpbGl0eSwgYXQgdGhpcyB0b2tlblxuICAgKiBwb3NpdGlvbi4gSW4gcmFyZSBjYXNlcywgdGhlcmUgbWF5IGJlIGZld2VyIHRoYW4gdGhlIG51bWJlciBvZiByZXF1ZXN0ZWRcbiAgICogYHRvcF9sb2dwcm9ic2AgcmV0dXJuZWQuXG4gICAqL1xuICB0b3BfbG9ncHJvYnM6IEFycmF5PENoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iLlRvcExvZ3Byb2I+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iIHtcbiAgZXhwb3J0IGludGVyZmFjZSBUb3BMb2dwcm9iIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdG9rZW4uXG4gICAgICovXG4gICAgdG9rZW46IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBpbnRlZ2VycyByZXByZXNlbnRpbmcgdGhlIFVURi04IGJ5dGVzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0b2tlbi5cbiAgICAgKiBVc2VmdWwgaW4gaW5zdGFuY2VzIHdoZXJlIGNoYXJhY3RlcnMgYXJlIHJlcHJlc2VudGVkIGJ5IG11bHRpcGxlIHRva2VucyBhbmRcbiAgICAgKiB0aGVpciBieXRlIHJlcHJlc2VudGF0aW9ucyBtdXN0IGJlIGNvbWJpbmVkIHRvIGdlbmVyYXRlIHRoZSBjb3JyZWN0IHRleHRcbiAgICAgKiByZXByZXNlbnRhdGlvbi4gQ2FuIGJlIGBudWxsYCBpZiB0aGVyZSBpcyBubyBieXRlcyByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHRva2VuLlxuICAgICAqL1xuICAgIGJ5dGVzOiBBcnJheTxudW1iZXI+IHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBsb2cgcHJvYmFiaWxpdHkgb2YgdGhpcyB0b2tlbiwgaWYgaXQgaXMgd2l0aGluIHRoZSB0b3AgMjAgbW9zdCBsaWtlbHlcbiAgICAgKiB0b2tlbnMuIE90aGVyd2lzZSwgdGhlIHZhbHVlIGAtOTk5OS4wYCBpcyB1c2VkIHRvIHNpZ25pZnkgdGhhdCB0aGUgdG9rZW4gaXMgdmVyeVxuICAgICAqIHVubGlrZWx5LlxuICAgICAqL1xuICAgIGxvZ3Byb2I6IG51bWJlcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uVG9vbCB7XG4gIGZ1bmN0aW9uOiBTaGFyZWQuRnVuY3Rpb25EZWZpbml0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgdG9vbC4gQ3VycmVudGx5LCBvbmx5IGBmdW5jdGlvbmAgaXMgc3VwcG9ydGVkLlxuICAgKi9cbiAgdHlwZTogJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBDb250cm9scyB3aGljaCAoaWYgYW55KSB0b29sIGlzIGNhbGxlZCBieSB0aGUgbW9kZWwuIGBub25lYCBtZWFucyB0aGUgbW9kZWwgd2lsbFxuICogbm90IGNhbGwgYW55IHRvb2wgYW5kIGluc3RlYWQgZ2VuZXJhdGVzIGEgbWVzc2FnZS4gYGF1dG9gIG1lYW5zIHRoZSBtb2RlbCBjYW5cbiAqIHBpY2sgYmV0d2VlbiBnZW5lcmF0aW5nIGEgbWVzc2FnZSBvciBjYWxsaW5nIG9uZSBvciBtb3JlIHRvb2xzLiBgcmVxdWlyZWRgIG1lYW5zXG4gKiB0aGUgbW9kZWwgbXVzdCBjYWxsIG9uZSBvciBtb3JlIHRvb2xzLiBTcGVjaWZ5aW5nIGEgcGFydGljdWxhciB0b29sIHZpYVxuICogYHtcInR5cGVcIjogXCJmdW5jdGlvblwiLCBcImZ1bmN0aW9uXCI6IHtcIm5hbWVcIjogXCJteV9mdW5jdGlvblwifX1gIGZvcmNlcyB0aGUgbW9kZWwgdG9cbiAqIGNhbGwgdGhhdCB0b29sLlxuICpcbiAqIGBub25lYCBpcyB0aGUgZGVmYXVsdCB3aGVuIG5vIHRvb2xzIGFyZSBwcmVzZW50LiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgaWYgdG9vbHNcbiAqIGFyZSBwcmVzZW50LlxuICovXG5leHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvblRvb2xDaG9pY2VPcHRpb24gPSAnbm9uZScgfCAnYXV0bycgfCAncmVxdWlyZWQnIHwgQ2hhdENvbXBsZXRpb25OYW1lZFRvb2xDaG9pY2U7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25Ub29sTWVzc2FnZVBhcmFtIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyBvZiB0aGUgdG9vbCBtZXNzYWdlLlxuICAgKi9cbiAgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSBvZiB0aGUgbWVzc2FnZXMgYXV0aG9yLCBpbiB0aGlzIGNhc2UgYHRvb2xgLlxuICAgKi9cbiAgcm9sZTogJ3Rvb2wnO1xuXG4gIC8qKlxuICAgKiBUb29sIGNhbGwgdGhhdCB0aGlzIG1lc3NhZ2UgaXMgcmVzcG9uZGluZyB0by5cbiAgICovXG4gIHRvb2xfY2FsbF9pZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uVXNlck1lc3NhZ2VQYXJhbSB7XG4gIC8qKlxuICAgKiBUaGUgY29udGVudHMgb2YgdGhlIHVzZXIgbWVzc2FnZS5cbiAgICovXG4gIGNvbnRlbnQ6IHN0cmluZyB8IEFycmF5PENoYXRDb21wbGV0aW9uQ29udGVudFBhcnQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSBvZiB0aGUgbWVzc2FnZXMgYXV0aG9yLCBpbiB0aGlzIGNhc2UgYHVzZXJgLlxuICAgKi9cbiAgcm9sZTogJ3VzZXInO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBuYW1lIGZvciB0aGUgcGFydGljaXBhbnQuIFByb3ZpZGVzIHRoZSBtb2RlbCBpbmZvcm1hdGlvbiB0b1xuICAgKiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcGFydGljaXBhbnRzIG9mIHRoZSBzYW1lIHJvbGUuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtIHNob3VsZCBiZSB1c2VkIGluc3RlYWRcbiAqL1xuZXhwb3J0IHR5cGUgQ3JlYXRlQ2hhdENvbXBsZXRpb25SZXF1ZXN0TWVzc2FnZSA9IENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtO1xuXG5leHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9XG4gIHwgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmdcbiAgfCBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogQSBsaXN0IG9mIG1lc3NhZ2VzIGNvbXByaXNpbmcgdGhlIGNvbnZlcnNhdGlvbiBzbyBmYXIuXG4gICAqIFtFeGFtcGxlIFB5dGhvbiBjb2RlXShodHRwczovL2Nvb2tib29rLm9wZW5haS5jb20vZXhhbXBsZXMvaG93X3RvX2Zvcm1hdF9pbnB1dHNfdG9fY2hhdGdwdF9tb2RlbHMpLlxuICAgKi9cbiAgbWVzc2FnZXM6IEFycmF5PENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtPjtcblxuICAvKipcbiAgICogSUQgb2YgdGhlIG1vZGVsIHRvIHVzZS4gU2VlIHRoZVxuICAgKiBbbW9kZWwgZW5kcG9pbnQgY29tcGF0aWJpbGl0eV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL21vZGVsLWVuZHBvaW50LWNvbXBhdGliaWxpdHkpXG4gICAqIHRhYmxlIGZvciBkZXRhaWxzIG9uIHdoaWNoIG1vZGVscyB3b3JrIHdpdGggdGhlIENoYXQgQVBJLlxuICAgKi9cbiAgbW9kZWw6IChzdHJpbmcgJiB7fSkgfCBDaGF0QVBJLkNoYXRNb2RlbDtcblxuICAvKipcbiAgICogTnVtYmVyIGJldHdlZW4gLTIuMCBhbmQgMi4wLiBQb3NpdGl2ZSB2YWx1ZXMgcGVuYWxpemUgbmV3IHRva2VucyBiYXNlZCBvbiB0aGVpclxuICAgKiBleGlzdGluZyBmcmVxdWVuY3kgaW4gdGhlIHRleHQgc28gZmFyLCBkZWNyZWFzaW5nIHRoZSBtb2RlbCdzIGxpa2VsaWhvb2QgdG9cbiAgICogcmVwZWF0IHRoZSBzYW1lIGxpbmUgdmVyYmF0aW0uXG4gICAqXG4gICAqIFtTZWUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBmcmVxdWVuY3kgYW5kIHByZXNlbmNlIHBlbmFsdGllcy5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy90ZXh0LWdlbmVyYXRpb24vcGFyYW1ldGVyLWRldGFpbHMpXG4gICAqL1xuICBmcmVxdWVuY3lfcGVuYWx0eT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYHRvb2xfY2hvaWNlYC5cbiAgICpcbiAgICogQ29udHJvbHMgd2hpY2ggKGlmIGFueSkgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbFxuICAgKiB3aWxsIG5vdCBjYWxsIGEgZnVuY3Rpb24gYW5kIGluc3RlYWQgZ2VuZXJhdGVzIGEgbWVzc2FnZS4gYGF1dG9gIG1lYW5zIHRoZSBtb2RlbFxuICAgKiBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgYSBmdW5jdGlvbi4gU3BlY2lmeWluZyBhXG4gICAqIHBhcnRpY3VsYXIgZnVuY3Rpb24gdmlhIGB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn1gIGZvcmNlcyB0aGUgbW9kZWwgdG8gY2FsbCB0aGF0XG4gICAqIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBgbm9uZWAgaXMgdGhlIGRlZmF1bHQgd2hlbiBubyBmdW5jdGlvbnMgYXJlIHByZXNlbnQuIGBhdXRvYCBpcyB0aGUgZGVmYXVsdCBpZlxuICAgKiBmdW5jdGlvbnMgYXJlIHByZXNlbnQuXG4gICAqL1xuICBmdW5jdGlvbl9jYWxsPzogJ25vbmUnIHwgJ2F1dG8nIHwgQ2hhdENvbXBsZXRpb25GdW5jdGlvbkNhbGxPcHRpb247XG5cbiAgLyoqXG4gICAqIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYHRvb2xzYC5cbiAgICpcbiAgICogQSBsaXN0IG9mIGZ1bmN0aW9ucyB0aGUgbW9kZWwgbWF5IGdlbmVyYXRlIEpTT04gaW5wdXRzIGZvci5cbiAgICovXG4gIGZ1bmN0aW9ucz86IEFycmF5PENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLkZ1bmN0aW9uPjtcblxuICAvKipcbiAgICogTW9kaWZ5IHRoZSBsaWtlbGlob29kIG9mIHNwZWNpZmllZCB0b2tlbnMgYXBwZWFyaW5nIGluIHRoZSBjb21wbGV0aW9uLlxuICAgKlxuICAgKiBBY2NlcHRzIGEgSlNPTiBvYmplY3QgdGhhdCBtYXBzIHRva2VucyAoc3BlY2lmaWVkIGJ5IHRoZWlyIHRva2VuIElEIGluIHRoZVxuICAgKiB0b2tlbml6ZXIpIHRvIGFuIGFzc29jaWF0ZWQgYmlhcyB2YWx1ZSBmcm9tIC0xMDAgdG8gMTAwLiBNYXRoZW1hdGljYWxseSwgdGhlXG4gICAqIGJpYXMgaXMgYWRkZWQgdG8gdGhlIGxvZ2l0cyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsIHByaW9yIHRvIHNhbXBsaW5nLiBUaGUgZXhhY3RcbiAgICogZWZmZWN0IHdpbGwgdmFyeSBwZXIgbW9kZWwsIGJ1dCB2YWx1ZXMgYmV0d2VlbiAtMSBhbmQgMSBzaG91bGQgZGVjcmVhc2Ugb3JcbiAgICogaW5jcmVhc2UgbGlrZWxpaG9vZCBvZiBzZWxlY3Rpb247IHZhbHVlcyBsaWtlIC0xMDAgb3IgMTAwIHNob3VsZCByZXN1bHQgaW4gYSBiYW5cbiAgICogb3IgZXhjbHVzaXZlIHNlbGVjdGlvbiBvZiB0aGUgcmVsZXZhbnQgdG9rZW4uXG4gICAqL1xuICBsb2dpdF9iaWFzPzogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmV0dXJuIGxvZyBwcm9iYWJpbGl0aWVzIG9mIHRoZSBvdXRwdXQgdG9rZW5zIG9yIG5vdC4gSWYgdHJ1ZSxcbiAgICogcmV0dXJucyB0aGUgbG9nIHByb2JhYmlsaXRpZXMgb2YgZWFjaCBvdXRwdXQgdG9rZW4gcmV0dXJuZWQgaW4gdGhlIGBjb250ZW50YCBvZlxuICAgKiBgbWVzc2FnZWAuXG4gICAqL1xuICBsb2dwcm9icz86IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgW3Rva2Vuc10oL3Rva2VuaXplcikgdGhhdCBjYW4gYmUgZ2VuZXJhdGVkIGluIHRoZSBjaGF0XG4gICAqIGNvbXBsZXRpb24uXG4gICAqXG4gICAqIFRoZSB0b3RhbCBsZW5ndGggb2YgaW5wdXQgdG9rZW5zIGFuZCBnZW5lcmF0ZWQgdG9rZW5zIGlzIGxpbWl0ZWQgYnkgdGhlIG1vZGVsJ3NcbiAgICogY29udGV4dCBsZW5ndGguXG4gICAqIFtFeGFtcGxlIFB5dGhvbiBjb2RlXShodHRwczovL2Nvb2tib29rLm9wZW5haS5jb20vZXhhbXBsZXMvaG93X3RvX2NvdW50X3Rva2Vuc193aXRoX3Rpa3Rva2VuKVxuICAgKiBmb3IgY291bnRpbmcgdG9rZW5zLlxuICAgKi9cbiAgbWF4X3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IGNoYXQgY29tcGxldGlvbiBjaG9pY2VzIHRvIGdlbmVyYXRlIGZvciBlYWNoIGlucHV0IG1lc3NhZ2UuIE5vdGUgdGhhdFxuICAgKiB5b3Ugd2lsbCBiZSBjaGFyZ2VkIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgZ2VuZXJhdGVkIHRva2VucyBhY3Jvc3MgYWxsIG9mIHRoZVxuICAgKiBjaG9pY2VzLiBLZWVwIGBuYCBhcyBgMWAgdG8gbWluaW1pemUgY29zdHMuXG4gICAqL1xuICBuPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogTnVtYmVyIGJldHdlZW4gLTIuMCBhbmQgMi4wLiBQb3NpdGl2ZSB2YWx1ZXMgcGVuYWxpemUgbmV3IHRva2VucyBiYXNlZCBvblxuICAgKiB3aGV0aGVyIHRoZXkgYXBwZWFyIGluIHRoZSB0ZXh0IHNvIGZhciwgaW5jcmVhc2luZyB0aGUgbW9kZWwncyBsaWtlbGlob29kIHRvXG4gICAqIHRhbGsgYWJvdXQgbmV3IHRvcGljcy5cbiAgICpcbiAgICogW1NlZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGZyZXF1ZW5jeSBhbmQgcHJlc2VuY2UgcGVuYWx0aWVzLl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3RleHQtZ2VuZXJhdGlvbi9wYXJhbWV0ZXItZGV0YWlscylcbiAgICovXG4gIHByZXNlbmNlX3BlbmFsdHk/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBvYmplY3Qgc3BlY2lmeWluZyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtYW5kLWdwdC00LXR1cmJvKSBhbmRcbiAgICogYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIG5ld2VyIHRoYW4gYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLlJlc3BvbnNlRm9ybWF0O1xuXG4gIC8qKlxuICAgKiBUaGlzIGZlYXR1cmUgaXMgaW4gQmV0YS4gSWYgc3BlY2lmaWVkLCBvdXIgc3lzdGVtIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvXG4gICAqIHNhbXBsZSBkZXRlcm1pbmlzdGljYWxseSwgc3VjaCB0aGF0IHJlcGVhdGVkIHJlcXVlc3RzIHdpdGggdGhlIHNhbWUgYHNlZWRgIGFuZFxuICAgKiBwYXJhbWV0ZXJzIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgcmVzdWx0LiBEZXRlcm1pbmlzbSBpcyBub3QgZ3VhcmFudGVlZCwgYW5kIHlvdVxuICAgKiBzaG91bGQgcmVmZXIgdG8gdGhlIGBzeXN0ZW1fZmluZ2VycHJpbnRgIHJlc3BvbnNlIHBhcmFtZXRlciB0byBtb25pdG9yIGNoYW5nZXNcbiAgICogaW4gdGhlIGJhY2tlbmQuXG4gICAqL1xuICBzZWVkPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVXAgdG8gNCBzZXF1ZW5jZXMgd2hlcmUgdGhlIEFQSSB3aWxsIHN0b3AgZ2VuZXJhdGluZyBmdXJ0aGVyIHRva2Vucy5cbiAgICovXG4gIHN0b3A/OiBzdHJpbmcgfCBudWxsIHwgQXJyYXk8c3RyaW5nPjtcblxuICAvKipcbiAgICogSWYgc2V0LCBwYXJ0aWFsIG1lc3NhZ2UgZGVsdGFzIHdpbGwgYmUgc2VudCwgbGlrZSBpbiBDaGF0R1BULiBUb2tlbnMgd2lsbCBiZVxuICAgKiBzZW50IGFzIGRhdGEtb25seVxuICAgKiBbc2VydmVyLXNlbnQgZXZlbnRzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2VydmVyLXNlbnRfZXZlbnRzL1VzaW5nX3NlcnZlci1zZW50X2V2ZW50cyNFdmVudF9zdHJlYW1fZm9ybWF0KVxuICAgKiBhcyB0aGV5IGJlY29tZSBhdmFpbGFibGUsIHdpdGggdGhlIHN0cmVhbSB0ZXJtaW5hdGVkIGJ5IGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICogW0V4YW1wbGUgUHl0aG9uIGNvZGVdKGh0dHBzOi8vY29va2Jvb2sub3BlbmFpLmNvbS9leGFtcGxlcy9ob3dfdG9fc3RyZWFtX2NvbXBsZXRpb25zKS5cbiAgICovXG4gIHN0cmVhbT86IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciBzdHJlYW1pbmcgcmVzcG9uc2UuIE9ubHkgc2V0IHRoaXMgd2hlbiB5b3Ugc2V0IGBzdHJlYW06IHRydWVgLlxuICAgKi9cbiAgc3RyZWFtX29wdGlvbnM/OiBDaGF0Q29tcGxldGlvblN0cmVhbU9wdGlvbnMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGF0IHNhbXBsaW5nIHRlbXBlcmF0dXJlIHRvIHVzZSwgYmV0d2VlbiAwIGFuZCAyLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGxcbiAgICogbWFrZSB0aGUgb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmVcbiAgICogZm9jdXNlZCBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIGB0b3BfcGAgYnV0IG5vdCBib3RoLlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGljaCAoaWYgYW55KSB0b29sIGlzIGNhbGxlZCBieSB0aGUgbW9kZWwuIGBub25lYCBtZWFucyB0aGUgbW9kZWwgd2lsbFxuICAgKiBub3QgY2FsbCBhbnkgdG9vbCBhbmQgaW5zdGVhZCBnZW5lcmF0ZXMgYSBtZXNzYWdlLiBgYXV0b2AgbWVhbnMgdGhlIG1vZGVsIGNhblxuICAgKiBwaWNrIGJldHdlZW4gZ2VuZXJhdGluZyBhIG1lc3NhZ2Ugb3IgY2FsbGluZyBvbmUgb3IgbW9yZSB0b29scy4gYHJlcXVpcmVkYCBtZWFuc1xuICAgKiB0aGUgbW9kZWwgbXVzdCBjYWxsIG9uZSBvciBtb3JlIHRvb2xzLiBTcGVjaWZ5aW5nIGEgcGFydGljdWxhciB0b29sIHZpYVxuICAgKiBge1widHlwZVwiOiBcImZ1bmN0aW9uXCIsIFwiZnVuY3Rpb25cIjoge1wibmFtZVwiOiBcIm15X2Z1bmN0aW9uXCJ9fWAgZm9yY2VzIHRoZSBtb2RlbCB0b1xuICAgKiBjYWxsIHRoYXQgdG9vbC5cbiAgICpcbiAgICogYG5vbmVgIGlzIHRoZSBkZWZhdWx0IHdoZW4gbm8gdG9vbHMgYXJlIHByZXNlbnQuIGBhdXRvYCBpcyB0aGUgZGVmYXVsdCBpZiB0b29sc1xuICAgKiBhcmUgcHJlc2VudC5cbiAgICovXG4gIHRvb2xfY2hvaWNlPzogQ2hhdENvbXBsZXRpb25Ub29sQ2hvaWNlT3B0aW9uO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdG9vbHMgdGhlIG1vZGVsIG1heSBjYWxsLiBDdXJyZW50bHksIG9ubHkgZnVuY3Rpb25zIGFyZSBzdXBwb3J0ZWQgYXMgYVxuICAgKiB0b29sLiBVc2UgdGhpcyB0byBwcm92aWRlIGEgbGlzdCBvZiBmdW5jdGlvbnMgdGhlIG1vZGVsIG1heSBnZW5lcmF0ZSBKU09OIGlucHV0c1xuICAgKiBmb3IuIEEgbWF4IG9mIDEyOCBmdW5jdGlvbnMgYXJlIHN1cHBvcnRlZC5cbiAgICovXG4gIHRvb2xzPzogQXJyYXk8Q2hhdENvbXBsZXRpb25Ub29sPjtcblxuICAvKipcbiAgICogQW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDIwIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBtb3N0IGxpa2VseSB0b2tlbnMgdG9cbiAgICogcmV0dXJuIGF0IGVhY2ggdG9rZW4gcG9zaXRpb24sIGVhY2ggd2l0aCBhbiBhc3NvY2lhdGVkIGxvZyBwcm9iYWJpbGl0eS5cbiAgICogYGxvZ3Byb2JzYCBtdXN0IGJlIHNldCB0byBgdHJ1ZWAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgdXNlZC5cbiAgICovXG4gIHRvcF9sb2dwcm9icz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIGB0ZW1wZXJhdHVyZWAgYnV0IG5vdCBib3RoLlxuICAgKi9cbiAgdG9wX3A/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIHJlcHJlc2VudGluZyB5b3VyIGVuZC11c2VyLCB3aGljaCBjYW4gaGVscCBPcGVuQUkgdG8gbW9uaXRvclxuICAgKiBhbmQgZGV0ZWN0IGFidXNlLlxuICAgKiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3NhZmV0eS1iZXN0LXByYWN0aWNlcy9lbmQtdXNlci1pZHMpLlxuICAgKi9cbiAgdXNlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4gTXVzdCBiZSBhLXosIEEtWiwgMC05LCBvciBjb250YWluXG4gICAgICogdW5kZXJzY29yZXMgYW5kIGRhc2hlcywgd2l0aCBhIG1heGltdW0gbGVuZ3RoIG9mIDY0LlxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgZnVuY3Rpb24gZG9lcywgdXNlZCBieSB0aGUgbW9kZWwgdG8gY2hvb3NlIHdoZW4gYW5kXG4gICAgICogaG93IHRvIGNhbGwgdGhlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBhcmFtZXRlcnMgdGhlIGZ1bmN0aW9ucyBhY2NlcHRzLCBkZXNjcmliZWQgYXMgYSBKU09OIFNjaGVtYSBvYmplY3QuIFNlZSB0aGVcbiAgICAgKiBbZ3VpZGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy90ZXh0LWdlbmVyYXRpb24vZnVuY3Rpb24tY2FsbGluZylcbiAgICAgKiBmb3IgZXhhbXBsZXMsIGFuZCB0aGVcbiAgICAgKiBbSlNPTiBTY2hlbWEgcmVmZXJlbmNlXShodHRwczovL2pzb24tc2NoZW1hLm9yZy91bmRlcnN0YW5kaW5nLWpzb24tc2NoZW1hLykgZm9yXG4gICAgICogZG9jdW1lbnRhdGlvbiBhYm91dCB0aGUgZm9ybWF0LlxuICAgICAqXG4gICAgICogT21pdHRpbmcgYHBhcmFtZXRlcnNgIGRlZmluZXMgYSBmdW5jdGlvbiB3aXRoIGFuIGVtcHR5IHBhcmFtZXRlciBsaXN0LlxuICAgICAqL1xuICAgIHBhcmFtZXRlcnM/OiBTaGFyZWQuRnVuY3Rpb25QYXJhbWV0ZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICAgKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC1hbmQtZ3B0LTQtdHVyYm8pIGFuZFxuICAgKiBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgbmV3ZXIgdGhhbiBgZ3B0LTMuNS10dXJiby0xMTA2YC5cbiAgICpcbiAgICogU2V0dGluZyB0byBgeyBcInR5cGVcIjogXCJqc29uX29iamVjdFwiIH1gIGVuYWJsZXMgSlNPTiBtb2RlLCB3aGljaCBndWFyYW50ZWVzIHRoZVxuICAgKiBtZXNzYWdlIHRoZSBtb2RlbCBnZW5lcmF0ZXMgaXMgdmFsaWQgSlNPTi5cbiAgICpcbiAgICogKipJbXBvcnRhbnQ6Kiogd2hlbiB1c2luZyBKU09OIG1vZGUsIHlvdSAqKm11c3QqKiBhbHNvIGluc3RydWN0IHRoZSBtb2RlbCB0b1xuICAgKiBwcm9kdWNlIEpTT04geW91cnNlbGYgdmlhIGEgc3lzdGVtIG9yIHVzZXIgbWVzc2FnZS4gV2l0aG91dCB0aGlzLCB0aGUgbW9kZWwgbWF5XG4gICAqIGdlbmVyYXRlIGFuIHVuZW5kaW5nIHN0cmVhbSBvZiB3aGl0ZXNwYWNlIHVudGlsIHRoZSBnZW5lcmF0aW9uIHJlYWNoZXMgdGhlIHRva2VuXG4gICAqIGxpbWl0LCByZXN1bHRpbmcgaW4gYSBsb25nLXJ1bm5pbmcgYW5kIHNlZW1pbmdseSBcInN0dWNrXCIgcmVxdWVzdC4gQWxzbyBub3RlIHRoYXRcbiAgICogdGhlIG1lc3NhZ2UgY29udGVudCBtYXkgYmUgcGFydGlhbGx5IGN1dCBvZmYgaWYgYGZpbmlzaF9yZWFzb249XCJsZW5ndGhcImAsIHdoaWNoXG4gICAqIGluZGljYXRlcyB0aGUgZ2VuZXJhdGlvbiBleGNlZWRlZCBgbWF4X3Rva2Vuc2Agb3IgdGhlIGNvbnZlcnNhdGlvbiBleGNlZWRlZCB0aGVcbiAgICogbWF4IGNvbnRleHQgbGVuZ3RoLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBSZXNwb25zZUZvcm1hdCB7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSBvbmUgb2YgYHRleHRgIG9yIGBqc29uX29iamVjdGAuXG4gICAgICovXG4gICAgdHlwZT86ICd0ZXh0JyB8ICdqc29uX29iamVjdCc7XG4gIH1cblxuICBleHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9XG4gICAgQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMgaW5zdGVhZFxuICovXG5leHBvcnQgdHlwZSBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zID0gQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgZXh0ZW5kcyBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogSWYgc2V0LCBwYXJ0aWFsIG1lc3NhZ2UgZGVsdGFzIHdpbGwgYmUgc2VudCwgbGlrZSBpbiBDaGF0R1BULiBUb2tlbnMgd2lsbCBiZVxuICAgKiBzZW50IGFzIGRhdGEtb25seVxuICAgKiBbc2VydmVyLXNlbnQgZXZlbnRzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2VydmVyLXNlbnRfZXZlbnRzL1VzaW5nX3NlcnZlci1zZW50X2V2ZW50cyNFdmVudF9zdHJlYW1fZm9ybWF0KVxuICAgKiBhcyB0aGV5IGJlY29tZSBhdmFpbGFibGUsIHdpdGggdGhlIHN0cmVhbSB0ZXJtaW5hdGVkIGJ5IGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICogW0V4YW1wbGUgUHl0aG9uIGNvZGVdKGh0dHBzOi8vY29va2Jvb2sub3BlbmFpLmNvbS9leGFtcGxlcy9ob3dfdG9fc3RyZWFtX2NvbXBsZXRpb25zKS5cbiAgICovXG4gIHN0cmVhbT86IGZhbHNlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgaW5zdGVhZFxuICovXG5leHBvcnQgdHlwZSBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nID0gQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgZXh0ZW5kcyBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogSWYgc2V0LCBwYXJ0aWFsIG1lc3NhZ2UgZGVsdGFzIHdpbGwgYmUgc2VudCwgbGlrZSBpbiBDaGF0R1BULiBUb2tlbnMgd2lsbCBiZVxuICAgKiBzZW50IGFzIGRhdGEtb25seVxuICAgKiBbc2VydmVyLXNlbnQgZXZlbnRzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2VydmVyLXNlbnRfZXZlbnRzL1VzaW5nX3NlcnZlci1zZW50X2V2ZW50cyNFdmVudF9zdHJlYW1fZm9ybWF0KVxuICAgKiBhcyB0aGV5IGJlY29tZSBhdmFpbGFibGUsIHdpdGggdGhlIHN0cmVhbSB0ZXJtaW5hdGVkIGJ5IGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICogW0V4YW1wbGUgUHl0aG9uIGNvZGVdKGh0dHBzOi8vY29va2Jvb2sub3BlbmFpLmNvbS9leGFtcGxlcy9ob3dfdG9fc3RyZWFtX2NvbXBsZXRpb25zKS5cbiAgICovXG4gIHN0cmVhbTogdHJ1ZTtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgaW5zdGVhZFxuICovXG5leHBvcnQgdHlwZSBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nID0gQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ29tcGxldGlvbnMge1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQXNzaXN0YW50TWVzc2FnZVBhcmFtID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQXNzaXN0YW50TWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ2h1bmsgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25DaHVuaztcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0ID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ29udGVudFBhcnQ7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydEltYWdlID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ29udGVudFBhcnRJbWFnZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0VGV4dCA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0VGV4dDtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uQ2FsbE9wdGlvbiA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkZ1bmN0aW9uQ2FsbE9wdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uRnVuY3Rpb25NZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25NZXNzYWdlID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uTWVzc2FnZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbk1lc3NhZ2VUb29sQ2FsbCA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbk1lc3NhZ2VUb29sQ2FsbDtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbk5hbWVkVG9vbENob2ljZSA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbk5hbWVkVG9vbENob2ljZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblJvbGUgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Sb2xlO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uU3RyZWFtT3B0aW9ucyA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblN0cmVhbU9wdGlvbnM7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25TeXN0ZW1NZXNzYWdlUGFyYW0gPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25TeXN0ZW1NZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Ub2tlbkxvZ3Byb2IgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Ub2tlbkxvZ3Byb2I7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Ub29sID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uVG9vbDtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblRvb2xDaG9pY2VPcHRpb24gPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Ub29sQ2hvaWNlT3B0aW9uO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9vbE1lc3NhZ2VQYXJhbSA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblRvb2xNZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Vc2VyTWVzc2FnZVBhcmFtID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uVXNlck1lc3NhZ2VQYXJhbTtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtIHNob3VsZCBiZSB1c2VkIGluc3RlYWRcbiAgICovXG4gIGV4cG9ydCBpbXBvcnQgQ3JlYXRlQ2hhdENvbXBsZXRpb25SZXF1ZXN0TWVzc2FnZSA9IENoYXRDb21wbGV0aW9uc0FQSS5DcmVhdGVDaGF0Q29tcGxldGlvblJlcXVlc3RNZXNzYWdlO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXMgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ29tcGxldGlvbkNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nID0gQ2hhdENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IENoYXRDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2UnO1xuaW1wb3J0ICogYXMgQ2hhdEFQSSBmcm9tICcuL2NoYXQnO1xuaW1wb3J0ICogYXMgQ29tcGxldGlvbnNBUEkgZnJvbSAnLi9jb21wbGV0aW9ucyc7XG5cbmV4cG9ydCBjbGFzcyBDaGF0IGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICBjb21wbGV0aW9uczogQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbnMgPSBuZXcgQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbnModGhpcy5fY2xpZW50KTtcbn1cblxuZXhwb3J0IHR5cGUgQ2hhdE1vZGVsID1cbiAgfCAnZ3B0LTRvJ1xuICB8ICdncHQtNG8tMjAyNC0wNS0xMydcbiAgfCAnZ3B0LTQtdHVyYm8nXG4gIHwgJ2dwdC00LXR1cmJvLTIwMjQtMDQtMDknXG4gIHwgJ2dwdC00LTAxMjUtcHJldmlldydcbiAgfCAnZ3B0LTQtdHVyYm8tcHJldmlldydcbiAgfCAnZ3B0LTQtMTEwNi1wcmV2aWV3J1xuICB8ICdncHQtNC12aXNpb24tcHJldmlldydcbiAgfCAnZ3B0LTQnXG4gIHwgJ2dwdC00LTAzMTQnXG4gIHwgJ2dwdC00LTA2MTMnXG4gIHwgJ2dwdC00LTMyaydcbiAgfCAnZ3B0LTQtMzJrLTAzMTQnXG4gIHwgJ2dwdC00LTMyay0wNjEzJ1xuICB8ICdncHQtMy41LXR1cmJvJ1xuICB8ICdncHQtMy41LXR1cmJvLTE2aydcbiAgfCAnZ3B0LTMuNS10dXJiby0wMzAxJ1xuICB8ICdncHQtMy41LXR1cmJvLTA2MTMnXG4gIHwgJ2dwdC0zLjUtdHVyYm8tMTEwNidcbiAgfCAnZ3B0LTMuNS10dXJiby0wMTI1J1xuICB8ICdncHQtMy41LXR1cmJvLTE2ay0wNjEzJztcblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0IHtcbiAgZXhwb3J0IGltcG9ydCBDaGF0TW9kZWwgPSBDaGF0QVBJLkNoYXRNb2RlbDtcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9ucyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25zO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb247XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Bc3Npc3RhbnRNZXNzYWdlUGFyYW0gPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNodW5rID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25DaHVuaztcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0ID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Db250ZW50UGFydDtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0SW1hZ2UgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0SW1hZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydFRleHQgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0VGV4dDtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uQ2FsbE9wdGlvbiA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uRnVuY3Rpb25DYWxsT3B0aW9uO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uRnVuY3Rpb25NZXNzYWdlUGFyYW0gPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uTWVzc2FnZSA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uTWVzc2FnZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uTWVzc2FnZVRvb2xDYWxsID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25OYW1lZFRvb2xDaG9pY2UgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbk5hbWVkVG9vbENob2ljZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblJvbGUgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblJvbGU7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25TdHJlYW1PcHRpb25zID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25TdHJlYW1PcHRpb25zO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uU3lzdGVtTWVzc2FnZVBhcmFtID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25TeXN0ZW1NZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Ub2tlbkxvZ3Byb2IgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblRva2VuTG9ncHJvYjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblRvb2wgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblRvb2w7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Ub29sQ2hvaWNlT3B0aW9uID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Ub29sQ2hvaWNlT3B0aW9uO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9vbE1lc3NhZ2VQYXJhbSA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uVG9vbE1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblVzZXJNZXNzYWdlUGFyYW0gPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblVzZXJNZXNzYWdlUGFyYW07XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkXG4gICAqL1xuICBleHBvcnQgaW1wb3J0IENyZWF0ZUNoYXRDb21wbGV0aW9uUmVxdWVzdE1lc3NhZ2UgPSBDb21wbGV0aW9uc0FQSS5DcmVhdGVDaGF0Q29tcGxldGlvblJlcXVlc3RNZXNzYWdlO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nID0gQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uLy4uL3Jlc291cmNlJztcbmltcG9ydCB7IHR5cGUgUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9fc2hpbXMvaW5kZXgnO1xuaW1wb3J0ICogYXMgU3BlZWNoQVBJIGZyb20gJy4vc3BlZWNoJztcblxuZXhwb3J0IGNsYXNzIFNwZWVjaCBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhdWRpbyBmcm9tIHRoZSBpbnB1dCB0ZXh0LlxuICAgKi9cbiAgY3JlYXRlKGJvZHk6IFNwZWVjaENyZWF0ZVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9hdWRpby9zcGVlY2gnLCB7IGJvZHksIC4uLm9wdGlvbnMsIF9fYmluYXJ5UmVzcG9uc2U6IHRydWUgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTcGVlY2hDcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHRleHQgdG8gZ2VuZXJhdGUgYXVkaW8gZm9yLiBUaGUgbWF4aW11bSBsZW5ndGggaXMgNDA5NiBjaGFyYWN0ZXJzLlxuICAgKi9cbiAgaW5wdXQ6IHN0cmluZztcblxuICAvKipcbiAgICogT25lIG9mIHRoZSBhdmFpbGFibGUgW1RUUyBtb2RlbHNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy90dHMpOlxuICAgKiBgdHRzLTFgIG9yIGB0dHMtMS1oZGBcbiAgICovXG4gIG1vZGVsOiAoc3RyaW5nICYge30pIHwgJ3R0cy0xJyB8ICd0dHMtMS1oZCc7XG5cbiAgLyoqXG4gICAqIFRoZSB2b2ljZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIHRoZSBhdWRpby4gU3VwcG9ydGVkIHZvaWNlcyBhcmUgYGFsbG95YCxcbiAgICogYGVjaG9gLCBgZmFibGVgLCBgb255eGAsIGBub3ZhYCwgYW5kIGBzaGltbWVyYC4gUHJldmlld3Mgb2YgdGhlIHZvaWNlcyBhcmVcbiAgICogYXZhaWxhYmxlIGluIHRoZVxuICAgKiBbVGV4dCB0byBzcGVlY2ggZ3VpZGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy90ZXh0LXRvLXNwZWVjaC92b2ljZS1vcHRpb25zKS5cbiAgICovXG4gIHZvaWNlOiAnYWxsb3knIHwgJ2VjaG8nIHwgJ2ZhYmxlJyB8ICdvbnl4JyB8ICdub3ZhJyB8ICdzaGltbWVyJztcblxuICAvKipcbiAgICogVGhlIGZvcm1hdCB0byBhdWRpbyBpbi4gU3VwcG9ydGVkIGZvcm1hdHMgYXJlIGBtcDNgLCBgb3B1c2AsIGBhYWNgLCBgZmxhY2AsXG4gICAqIGB3YXZgLCBhbmQgYHBjbWAuXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiAnbXAzJyB8ICdvcHVzJyB8ICdhYWMnIHwgJ2ZsYWMnIHwgJ3dhdicgfCAncGNtJztcblxuICAvKipcbiAgICogVGhlIHNwZWVkIG9mIHRoZSBnZW5lcmF0ZWQgYXVkaW8uIFNlbGVjdCBhIHZhbHVlIGZyb20gYDAuMjVgIHRvIGA0LjBgLiBgMS4wYCBpc1xuICAgKiB0aGUgZGVmYXVsdC5cbiAgICovXG4gIHNwZWVkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFNwZWVjaCB7XG4gIGV4cG9ydCBpbXBvcnQgU3BlZWNoQ3JlYXRlUGFyYW1zID0gU3BlZWNoQVBJLlNwZWVjaENyZWF0ZVBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gJy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tICcuLi8uLi9yZXNvdXJjZSc7XG5pbXBvcnQgKiBhcyBUcmFuc2NyaXB0aW9uc0FQSSBmcm9tICcuL3RyYW5zY3JpcHRpb25zJztcbmltcG9ydCB7IHR5cGUgVXBsb2FkYWJsZSwgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi4vLi4vY29yZSc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2NyaXB0aW9ucyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFRyYW5zY3JpYmVzIGF1ZGlvIGludG8gdGhlIGlucHV0IGxhbmd1YWdlLlxuICAgKi9cbiAgY3JlYXRlKGJvZHk6IFRyYW5zY3JpcHRpb25DcmVhdGVQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFRyYW5zY3JpcHRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9hdWRpby90cmFuc2NyaXB0aW9ucycsIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyh7IGJvZHksIC4uLm9wdGlvbnMgfSkpO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHRyYW5zY3JpcHRpb24gcmVzcG9uc2UgcmV0dXJuZWQgYnkgbW9kZWwsIGJhc2VkIG9uIHRoZSBwcm92aWRlZFxuICogaW5wdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNjcmlwdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgdHJhbnNjcmliZWQgdGV4dC5cbiAgICovXG4gIHRleHQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2NyaXB0aW9uQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhdWRpbyBmaWxlIG9iamVjdCAobm90IGZpbGUgbmFtZSkgdG8gdHJhbnNjcmliZSwgaW4gb25lIG9mIHRoZXNlIGZvcm1hdHM6XG4gICAqIGZsYWMsIG1wMywgbXA0LCBtcGVnLCBtcGdhLCBtNGEsIG9nZywgd2F2LCBvciB3ZWJtLlxuICAgKi9cbiAgZmlsZTogVXBsb2FkYWJsZTtcblxuICAvKipcbiAgICogSUQgb2YgdGhlIG1vZGVsIHRvIHVzZS4gT25seSBgd2hpc3Blci0xYCAod2hpY2ggaXMgcG93ZXJlZCBieSBvdXIgb3BlbiBzb3VyY2VcbiAgICogV2hpc3BlciBWMiBtb2RlbCkgaXMgY3VycmVudGx5IGF2YWlsYWJsZS5cbiAgICovXG4gIG1vZGVsOiAoc3RyaW5nICYge30pIHwgJ3doaXNwZXItMSc7XG5cbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSBvZiB0aGUgaW5wdXQgYXVkaW8uIFN1cHBseWluZyB0aGUgaW5wdXQgbGFuZ3VhZ2UgaW5cbiAgICogW0lTTy02MzktMV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGlzdF9vZl9JU09fNjM5LTFfY29kZXMpIGZvcm1hdCB3aWxsXG4gICAqIGltcHJvdmUgYWNjdXJhY3kgYW5kIGxhdGVuY3kuXG4gICAqL1xuICBsYW5ndWFnZT86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgdGV4dCB0byBndWlkZSB0aGUgbW9kZWwncyBzdHlsZSBvciBjb250aW51ZSBhIHByZXZpb3VzIGF1ZGlvXG4gICAqIHNlZ21lbnQuIFRoZVxuICAgKiBbcHJvbXB0XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvc3BlZWNoLXRvLXRleHQvcHJvbXB0aW5nKVxuICAgKiBzaG91bGQgbWF0Y2ggdGhlIGF1ZGlvIGxhbmd1YWdlLlxuICAgKi9cbiAgcHJvbXB0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IG9mIHRoZSB0cmFuc2NyaXB0IG91dHB1dCwgaW4gb25lIG9mIHRoZXNlIG9wdGlvbnM6IGBqc29uYCwgYHRleHRgLFxuICAgKiBgc3J0YCwgYHZlcmJvc2VfanNvbmAsIG9yIGB2dHRgLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogJ2pzb24nIHwgJ3RleHQnIHwgJ3NydCcgfCAndmVyYm9zZV9qc29uJyB8ICd2dHQnO1xuXG4gIC8qKlxuICAgKiBUaGUgc2FtcGxpbmcgdGVtcGVyYXR1cmUsIGJldHdlZW4gMCBhbmQgMS4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsIG1ha2UgdGhlXG4gICAqIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlIGZvY3VzZWQgYW5kXG4gICAqIGRldGVybWluaXN0aWMuIElmIHNldCB0byAwLCB0aGUgbW9kZWwgd2lsbCB1c2VcbiAgICogW2xvZyBwcm9iYWJpbGl0eV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTG9nX3Byb2JhYmlsaXR5KSB0b1xuICAgKiBhdXRvbWF0aWNhbGx5IGluY3JlYXNlIHRoZSB0ZW1wZXJhdHVyZSB1bnRpbCBjZXJ0YWluIHRocmVzaG9sZHMgYXJlIGhpdC5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIGdyYW51bGFyaXRpZXMgdG8gcG9wdWxhdGUgZm9yIHRoaXMgdHJhbnNjcmlwdGlvbi5cbiAgICogYHJlc3BvbnNlX2Zvcm1hdGAgbXVzdCBiZSBzZXQgYHZlcmJvc2VfanNvbmAgdG8gdXNlIHRpbWVzdGFtcCBncmFudWxhcml0aWVzLlxuICAgKiBFaXRoZXIgb3IgYm90aCBvZiB0aGVzZSBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6IGB3b3JkYCwgb3IgYHNlZ21lbnRgLiBOb3RlOiBUaGVyZVxuICAgKiBpcyBubyBhZGRpdGlvbmFsIGxhdGVuY3kgZm9yIHNlZ21lbnQgdGltZXN0YW1wcywgYnV0IGdlbmVyYXRpbmcgd29yZCB0aW1lc3RhbXBzXG4gICAqIGluY3VycyBhZGRpdGlvbmFsIGxhdGVuY3kuXG4gICAqL1xuICB0aW1lc3RhbXBfZ3JhbnVsYXJpdGllcz86IEFycmF5PCd3b3JkJyB8ICdzZWdtZW50Jz47XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVHJhbnNjcmlwdGlvbnMge1xuICBleHBvcnQgaW1wb3J0IFRyYW5zY3JpcHRpb24gPSBUcmFuc2NyaXB0aW9uc0FQSS5UcmFuc2NyaXB0aW9uO1xuICBleHBvcnQgaW1wb3J0IFRyYW5zY3JpcHRpb25DcmVhdGVQYXJhbXMgPSBUcmFuc2NyaXB0aW9uc0FQSS5UcmFuc2NyaXB0aW9uQ3JlYXRlUGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uLy4uL3Jlc291cmNlJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9uc0FQSSBmcm9tICcuL3RyYW5zbGF0aW9ucyc7XG5pbXBvcnQgeyB0eXBlIFVwbG9hZGFibGUsIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uLy4uL2NvcmUnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNsYXRpb25zIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogVHJhbnNsYXRlcyBhdWRpbyBpbnRvIEVuZ2xpc2guXG4gICAqL1xuICBjcmVhdGUoYm9keTogVHJhbnNsYXRpb25DcmVhdGVQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFRyYW5zbGF0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvYXVkaW8vdHJhbnNsYXRpb25zJywgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zKHsgYm9keSwgLi4ub3B0aW9ucyB9KSk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvbiB7XG4gIHRleHQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvbkNyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYXVkaW8gZmlsZSBvYmplY3QgKG5vdCBmaWxlIG5hbWUpIHRyYW5zbGF0ZSwgaW4gb25lIG9mIHRoZXNlIGZvcm1hdHM6IGZsYWMsXG4gICAqIG1wMywgbXA0LCBtcGVnLCBtcGdhLCBtNGEsIG9nZywgd2F2LCBvciB3ZWJtLlxuICAgKi9cbiAgZmlsZTogVXBsb2FkYWJsZTtcblxuICAvKipcbiAgICogSUQgb2YgdGhlIG1vZGVsIHRvIHVzZS4gT25seSBgd2hpc3Blci0xYCAod2hpY2ggaXMgcG93ZXJlZCBieSBvdXIgb3BlbiBzb3VyY2VcbiAgICogV2hpc3BlciBWMiBtb2RlbCkgaXMgY3VycmVudGx5IGF2YWlsYWJsZS5cbiAgICovXG4gIG1vZGVsOiAoc3RyaW5nICYge30pIHwgJ3doaXNwZXItMSc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHRleHQgdG8gZ3VpZGUgdGhlIG1vZGVsJ3Mgc3R5bGUgb3IgY29udGludWUgYSBwcmV2aW91cyBhdWRpb1xuICAgKiBzZWdtZW50LiBUaGVcbiAgICogW3Byb21wdF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3NwZWVjaC10by10ZXh0L3Byb21wdGluZylcbiAgICogc2hvdWxkIGJlIGluIEVuZ2xpc2guXG4gICAqL1xuICBwcm9tcHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtYXQgb2YgdGhlIHRyYW5zY3JpcHQgb3V0cHV0LCBpbiBvbmUgb2YgdGhlc2Ugb3B0aW9uczogYGpzb25gLCBgdGV4dGAsXG4gICAqIGBzcnRgLCBgdmVyYm9zZV9qc29uYCwgb3IgYHZ0dGAuXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzYW1wbGluZyB0ZW1wZXJhdHVyZSwgYmV0d2VlbiAwIGFuZCAxLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGwgbWFrZSB0aGVcbiAgICogb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmUgZm9jdXNlZCBhbmRcbiAgICogZGV0ZXJtaW5pc3RpYy4gSWYgc2V0IHRvIDAsIHRoZSBtb2RlbCB3aWxsIHVzZVxuICAgKiBbbG9nIHByb2JhYmlsaXR5XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb2dfcHJvYmFiaWxpdHkpIHRvXG4gICAqIGF1dG9tYXRpY2FsbHkgaW5jcmVhc2UgdGhlIHRlbXBlcmF0dXJlIHVudGlsIGNlcnRhaW4gdGhyZXNob2xkcyBhcmUgaGl0LlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVHJhbnNsYXRpb25zIHtcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2xhdGlvbiA9IFRyYW5zbGF0aW9uc0FQSS5UcmFuc2xhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2xhdGlvbkNyZWF0ZVBhcmFtcyA9IFRyYW5zbGF0aW9uc0FQSS5UcmFuc2xhdGlvbkNyZWF0ZVBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uLy4uL3Jlc291cmNlJztcbmltcG9ydCAqIGFzIFNwZWVjaEFQSSBmcm9tICcuL3NwZWVjaCc7XG5pbXBvcnQgKiBhcyBUcmFuc2NyaXB0aW9uc0FQSSBmcm9tICcuL3RyYW5zY3JpcHRpb25zJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9uc0FQSSBmcm9tICcuL3RyYW5zbGF0aW9ucyc7XG5cbmV4cG9ydCBjbGFzcyBBdWRpbyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgdHJhbnNjcmlwdGlvbnM6IFRyYW5zY3JpcHRpb25zQVBJLlRyYW5zY3JpcHRpb25zID0gbmV3IFRyYW5zY3JpcHRpb25zQVBJLlRyYW5zY3JpcHRpb25zKHRoaXMuX2NsaWVudCk7XG4gIHRyYW5zbGF0aW9uczogVHJhbnNsYXRpb25zQVBJLlRyYW5zbGF0aW9ucyA9IG5ldyBUcmFuc2xhdGlvbnNBUEkuVHJhbnNsYXRpb25zKHRoaXMuX2NsaWVudCk7XG4gIHNwZWVjaDogU3BlZWNoQVBJLlNwZWVjaCA9IG5ldyBTcGVlY2hBUEkuU3BlZWNoKHRoaXMuX2NsaWVudCk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQXVkaW8ge1xuICBleHBvcnQgaW1wb3J0IFRyYW5zY3JpcHRpb25zID0gVHJhbnNjcmlwdGlvbnNBUEkuVHJhbnNjcmlwdGlvbnM7XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNjcmlwdGlvbiA9IFRyYW5zY3JpcHRpb25zQVBJLlRyYW5zY3JpcHRpb247XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNjcmlwdGlvbkNyZWF0ZVBhcmFtcyA9IFRyYW5zY3JpcHRpb25zQVBJLlRyYW5zY3JpcHRpb25DcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNsYXRpb25zID0gVHJhbnNsYXRpb25zQVBJLlRyYW5zbGF0aW9ucztcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2xhdGlvbiA9IFRyYW5zbGF0aW9uc0FQSS5UcmFuc2xhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2xhdGlvbkNyZWF0ZVBhcmFtcyA9IFRyYW5zbGF0aW9uc0FQSS5UcmFuc2xhdGlvbkNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBTcGVlY2ggPSBTcGVlY2hBUEkuU3BlZWNoO1xuICBleHBvcnQgaW1wb3J0IFNwZWVjaENyZWF0ZVBhcmFtcyA9IFNwZWVjaEFQSS5TcGVlY2hDcmVhdGVQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vcmVzb3VyY2UnO1xuaW1wb3J0IHsgaXNSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0ICogYXMgQmF0Y2hlc0FQSSBmcm9tICcuL2JhdGNoZXMnO1xuaW1wb3J0IHsgQ3Vyc29yUGFnZSwgdHlwZSBDdXJzb3JQYWdlUGFyYW1zIH0gZnJvbSAnLi4vcGFnaW5hdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBCYXRjaGVzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgZXhlY3V0ZXMgYSBiYXRjaCBmcm9tIGFuIHVwbG9hZGVkIGZpbGUgb2YgcmVxdWVzdHNcbiAgICovXG4gIGNyZWF0ZShib2R5OiBCYXRjaENyZWF0ZVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8QmF0Y2g+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9iYXRjaGVzJywgeyBib2R5LCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIGJhdGNoLlxuICAgKi9cbiAgcmV0cmlldmUoYmF0Y2hJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxCYXRjaD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvYmF0Y2hlcy8ke2JhdGNoSWR9YCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB5b3VyIG9yZ2FuaXphdGlvbidzIGJhdGNoZXMuXG4gICAqL1xuICBsaXN0KHF1ZXJ5PzogQmF0Y2hMaXN0UGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuUGFnZVByb21pc2U8QmF0Y2hlc1BhZ2UsIEJhdGNoPjtcbiAgbGlzdChvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuUGFnZVByb21pc2U8QmF0Y2hlc1BhZ2UsIEJhdGNoPjtcbiAgbGlzdChcbiAgICBxdWVyeTogQmF0Y2hMaXN0UGFyYW1zIHwgQ29yZS5SZXF1ZXN0T3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPEJhdGNoZXNQYWdlLCBCYXRjaD4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdCh7fSwgcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoJy9iYXRjaGVzJywgQmF0Y2hlc1BhZ2UsIHsgcXVlcnksIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyBhbiBpbi1wcm9ncmVzcyBiYXRjaC5cbiAgICovXG4gIGNhbmNlbChiYXRjaElkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEJhdGNoPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvYmF0Y2hlcy8ke2JhdGNoSWR9L2NhbmNlbGAsIG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCYXRjaGVzUGFnZSBleHRlbmRzIEN1cnNvclBhZ2U8QmF0Y2g+IHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmF0Y2gge1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZSBmcmFtZSB3aXRoaW4gd2hpY2ggdGhlIGJhdGNoIHNob3VsZCBiZSBwcm9jZXNzZWQuXG4gICAqL1xuICBjb21wbGV0aW9uX3dpbmRvdzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBiYXRjaCB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIE9wZW5BSSBBUEkgZW5kcG9pbnQgdXNlZCBieSB0aGUgYmF0Y2guXG4gICAqL1xuICBlbmRwb2ludDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIGlucHV0IGZpbGUgZm9yIHRoZSBiYXRjaC5cbiAgICovXG4gIGlucHV0X2ZpbGVfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYGJhdGNoYC5cbiAgICovXG4gIG9iamVjdDogJ2JhdGNoJztcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBiYXRjaC5cbiAgICovXG4gIHN0YXR1czpcbiAgICB8ICd2YWxpZGF0aW5nJ1xuICAgIHwgJ2ZhaWxlZCdcbiAgICB8ICdpbl9wcm9ncmVzcydcbiAgICB8ICdmaW5hbGl6aW5nJ1xuICAgIHwgJ2NvbXBsZXRlZCdcbiAgICB8ICdleHBpcmVkJ1xuICAgIHwgJ2NhbmNlbGxpbmcnXG4gICAgfCAnY2FuY2VsbGVkJztcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYmF0Y2ggd2FzIGNhbmNlbGxlZC5cbiAgICovXG4gIGNhbmNlbGxlZF9hdD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYmF0Y2ggc3RhcnRlZCBjYW5jZWxsaW5nLlxuICAgKi9cbiAgY2FuY2VsbGluZ19hdD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYmF0Y2ggd2FzIGNvbXBsZXRlZC5cbiAgICovXG4gIGNvbXBsZXRlZF9hdD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIG91dHB1dHMgb2YgcmVxdWVzdHMgd2l0aCBlcnJvcnMuXG4gICAqL1xuICBlcnJvcl9maWxlX2lkPzogc3RyaW5nO1xuXG4gIGVycm9ycz86IEJhdGNoLkVycm9ycztcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYmF0Y2ggZXhwaXJlZC5cbiAgICovXG4gIGV4cGlyZWRfYXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGJhdGNoIHdpbGwgZXhwaXJlLlxuICAgKi9cbiAgZXhwaXJlc19hdD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYmF0Y2ggZmFpbGVkLlxuICAgKi9cbiAgZmFpbGVkX2F0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBiYXRjaCBzdGFydGVkIGZpbmFsaXppbmcuXG4gICAqL1xuICBmaW5hbGl6aW5nX2F0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBiYXRjaCBzdGFydGVkIHByb2Nlc3NpbmcuXG4gICAqL1xuICBpbl9wcm9ncmVzc19hdD86IG51bWJlcjtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIG91dHB1dHMgb2Ygc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkIHJlcXVlc3RzLlxuICAgKi9cbiAgb3V0cHV0X2ZpbGVfaWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXF1ZXN0IGNvdW50cyBmb3IgZGlmZmVyZW50IHN0YXR1c2VzIHdpdGhpbiB0aGUgYmF0Y2guXG4gICAqL1xuICByZXF1ZXN0X2NvdW50cz86IEJhdGNoUmVxdWVzdENvdW50cztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBCYXRjaCB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgRXJyb3JzIHtcbiAgICBkYXRhPzogQXJyYXk8QmF0Y2hlc0FQSS5CYXRjaEVycm9yPjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGBsaXN0YC5cbiAgICAgKi9cbiAgICBvYmplY3Q/OiBzdHJpbmc7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXRjaEVycm9yIHtcbiAgLyoqXG4gICAqIEFuIGVycm9yIGNvZGUgaWRlbnRpZnlpbmcgdGhlIGVycm9yIHR5cGUuXG4gICAqL1xuICBjb2RlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSBudW1iZXIgb2YgdGhlIGlucHV0IGZpbGUgd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLCBpZiBhcHBsaWNhYmxlLlxuICAgKi9cbiAgbGluZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgaHVtYW4tcmVhZGFibGUgbWVzc2FnZSBwcm92aWRpbmcgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSBlcnJvci5cbiAgICovXG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdGhhdCBjYXVzZWQgdGhlIGVycm9yLCBpZiBhcHBsaWNhYmxlLlxuICAgKi9cbiAgcGFyYW0/OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IGNvdW50cyBmb3IgZGlmZmVyZW50IHN0YXR1c2VzIHdpdGhpbiB0aGUgYmF0Y2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmF0Y2hSZXF1ZXN0Q291bnRzIHtcbiAgLyoqXG4gICAqIE51bWJlciBvZiByZXF1ZXN0cyB0aGF0IGhhdmUgYmVlbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKi9cbiAgY29tcGxldGVkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiByZXF1ZXN0cyB0aGF0IGhhdmUgZmFpbGVkLlxuICAgKi9cbiAgZmFpbGVkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRvdGFsIG51bWJlciBvZiByZXF1ZXN0cyBpbiB0aGUgYmF0Y2guXG4gICAqL1xuICB0b3RhbDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhdGNoQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lIGZyYW1lIHdpdGhpbiB3aGljaCB0aGUgYmF0Y2ggc2hvdWxkIGJlIHByb2Nlc3NlZC4gQ3VycmVudGx5IG9ubHkgYDI0aGBcbiAgICogaXMgc3VwcG9ydGVkLlxuICAgKi9cbiAgY29tcGxldGlvbl93aW5kb3c6ICcyNGgnO1xuXG4gIC8qKlxuICAgKiBUaGUgZW5kcG9pbnQgdG8gYmUgdXNlZCBmb3IgYWxsIHJlcXVlc3RzIGluIHRoZSBiYXRjaC4gQ3VycmVudGx5XG4gICAqIGAvdjEvY2hhdC9jb21wbGV0aW9uc2AsIGAvdjEvZW1iZWRkaW5nc2AsIGFuZCBgL3YxL2NvbXBsZXRpb25zYCBhcmUgc3VwcG9ydGVkLlxuICAgKiBOb3RlIHRoYXQgYC92MS9lbWJlZGRpbmdzYCBiYXRjaGVzIGFyZSBhbHNvIHJlc3RyaWN0ZWQgdG8gYSBtYXhpbXVtIG9mIDUwLDAwMFxuICAgKiBlbWJlZGRpbmcgaW5wdXRzIGFjcm9zcyBhbGwgcmVxdWVzdHMgaW4gdGhlIGJhdGNoLlxuICAgKi9cbiAgZW5kcG9pbnQ6ICcvdjEvY2hhdC9jb21wbGV0aW9ucycgfCAnL3YxL2VtYmVkZGluZ3MnIHwgJy92MS9jb21wbGV0aW9ucyc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiBhbiB1cGxvYWRlZCBmaWxlIHRoYXQgY29udGFpbnMgcmVxdWVzdHMgZm9yIHRoZSBuZXcgYmF0Y2guXG4gICAqXG4gICAqIFNlZSBbdXBsb2FkIGZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMvY3JlYXRlKVxuICAgKiBmb3IgaG93IHRvIHVwbG9hZCBhIGZpbGUuXG4gICAqXG4gICAqIFlvdXIgaW5wdXQgZmlsZSBtdXN0IGJlIGZvcm1hdHRlZCBhcyBhXG4gICAqIFtKU09OTCBmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2JhdGNoL3JlcXVlc3RJbnB1dCksXG4gICAqIGFuZCBtdXN0IGJlIHVwbG9hZGVkIHdpdGggdGhlIHB1cnBvc2UgYGJhdGNoYC4gVGhlIGZpbGUgY2FuIGNvbnRhaW4gdXAgdG8gNTAsMDAwXG4gICAqIHJlcXVlc3RzLCBhbmQgY2FuIGJlIHVwIHRvIDEwMCBNQiBpbiBzaXplLlxuICAgKi9cbiAgaW5wdXRfZmlsZV9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjdXN0b20gbWV0YWRhdGEgZm9yIHRoZSBiYXRjaC5cbiAgICovXG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmF0Y2hMaXN0UGFyYW1zIGV4dGVuZHMgQ3Vyc29yUGFnZVBhcmFtcyB7fVxuXG5leHBvcnQgbmFtZXNwYWNlIEJhdGNoZXMge1xuICBleHBvcnQgaW1wb3J0IEJhdGNoID0gQmF0Y2hlc0FQSS5CYXRjaDtcbiAgZXhwb3J0IGltcG9ydCBCYXRjaEVycm9yID0gQmF0Y2hlc0FQSS5CYXRjaEVycm9yO1xuICBleHBvcnQgaW1wb3J0IEJhdGNoUmVxdWVzdENvdW50cyA9IEJhdGNoZXNBUEkuQmF0Y2hSZXF1ZXN0Q291bnRzO1xuICBleHBvcnQgaW1wb3J0IEJhdGNoZXNQYWdlID0gQmF0Y2hlc0FQSS5CYXRjaGVzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBCYXRjaENyZWF0ZVBhcmFtcyA9IEJhdGNoZXNBUEkuQmF0Y2hDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQmF0Y2hMaXN0UGFyYW1zID0gQmF0Y2hlc0FQSS5CYXRjaExpc3RQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tICcuLi8uLi9jb3JlJztcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2UnO1xuaW1wb3J0IHsgaXNSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uLy4uL2NvcmUnO1xuaW1wb3J0ICogYXMgQXNzaXN0YW50c0FQSSBmcm9tICcuL2Fzc2lzdGFudHMnO1xuaW1wb3J0ICogYXMgU2hhcmVkIGZyb20gJy4uL3NoYXJlZCc7XG5pbXBvcnQgKiBhcyBNZXNzYWdlc0FQSSBmcm9tICcuL3RocmVhZHMvbWVzc2FnZXMnO1xuaW1wb3J0ICogYXMgVGhyZWFkc0FQSSBmcm9tICcuL3RocmVhZHMvdGhyZWFkcyc7XG5pbXBvcnQgKiBhcyBSdW5zQVBJIGZyb20gJy4vdGhyZWFkcy9ydW5zL3J1bnMnO1xuaW1wb3J0ICogYXMgU3RlcHNBUEkgZnJvbSAnLi90aHJlYWRzL3J1bnMvc3RlcHMnO1xuaW1wb3J0IHsgQ3Vyc29yUGFnZSwgdHlwZSBDdXJzb3JQYWdlUGFyYW1zIH0gZnJvbSAnLi4vLi4vcGFnaW5hdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBBc3Npc3RhbnRzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQ3JlYXRlIGFuIGFzc2lzdGFudCB3aXRoIGEgbW9kZWwgYW5kIGluc3RydWN0aW9ucy5cbiAgICovXG4gIGNyZWF0ZShib2R5OiBBc3Npc3RhbnRDcmVhdGVQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEFzc2lzdGFudD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL2Fzc2lzdGFudHMnLCB7XG4gICAgICBib2R5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGFuIGFzc2lzdGFudC5cbiAgICovXG4gIHJldHJpZXZlKGFzc2lzdGFudElkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEFzc2lzdGFudD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvYXNzaXN0YW50cy8ke2Fzc2lzdGFudElkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIGFuIGFzc2lzdGFudC5cbiAgICovXG4gIHVwZGF0ZShcbiAgICBhc3Npc3RhbnRJZDogc3RyaW5nLFxuICAgIGJvZHk6IEFzc2lzdGFudFVwZGF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPEFzc2lzdGFudD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL2Fzc2lzdGFudHMvJHthc3Npc3RhbnRJZH1gLCB7XG4gICAgICBib2R5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgYXNzaXN0YW50cy5cbiAgICovXG4gIGxpc3QoXG4gICAgcXVlcnk/OiBBc3Npc3RhbnRMaXN0UGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPEFzc2lzdGFudHNQYWdlLCBBc3Npc3RhbnQ+O1xuICBsaXN0KG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5QYWdlUHJvbWlzZTxBc3Npc3RhbnRzUGFnZSwgQXNzaXN0YW50PjtcbiAgbGlzdChcbiAgICBxdWVyeTogQXNzaXN0YW50TGlzdFBhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxBc3Npc3RhbnRzUGFnZSwgQXNzaXN0YW50PiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0KHt9LCBxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0QVBJTGlzdCgnL2Fzc2lzdGFudHMnLCBBc3Npc3RhbnRzUGFnZSwge1xuICAgICAgcXVlcnksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gYXNzaXN0YW50LlxuICAgKi9cbiAgZGVsKGFzc2lzdGFudElkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEFzc2lzdGFudERlbGV0ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmRlbGV0ZShgL2Fzc2lzdGFudHMvJHthc3Npc3RhbnRJZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXNzaXN0YW50c1BhZ2UgZXh0ZW5kcyBDdXJzb3JQYWdlPEFzc2lzdGFudD4ge31cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGBhc3Npc3RhbnRgIHRoYXQgY2FuIGNhbGwgdGhlIG1vZGVsIGFuZCB1c2UgdG9vbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0YW50IHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBBUEkgZW5kcG9pbnRzLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYXNzaXN0YW50IHdhcyBjcmVhdGVkLlxuICAgKi9cbiAgY3JlYXRlZF9hdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGFzc2lzdGFudC4gVGhlIG1heGltdW0gbGVuZ3RoIGlzIDUxMiBjaGFyYWN0ZXJzLlxuICAgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBzeXN0ZW0gaW5zdHJ1Y3Rpb25zIHRoYXQgdGhlIGFzc2lzdGFudCB1c2VzLiBUaGUgbWF4aW11bSBsZW5ndGggaXMgMjU2LDAwMFxuICAgKiBjaGFyYWN0ZXJzLlxuICAgKi9cbiAgaW5zdHJ1Y3Rpb25zOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YTogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIElEIG9mIHRoZSBtb2RlbCB0byB1c2UuIFlvdSBjYW4gdXNlIHRoZVxuICAgKiBbTGlzdCBtb2RlbHNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzL2xpc3QpIEFQSSB0b1xuICAgKiBzZWUgYWxsIG9mIHlvdXIgYXZhaWxhYmxlIG1vZGVscywgb3Igc2VlIG91clxuICAgKiBbTW9kZWwgb3ZlcnZpZXddKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9vdmVydmlldykgZm9yXG4gICAqIGRlc2NyaXB0aW9ucyBvZiB0aGVtLlxuICAgKi9cbiAgbW9kZWw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGFzc2lzdGFudC4gVGhlIG1heGltdW0gbGVuZ3RoIGlzIDI1NiBjaGFyYWN0ZXJzLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYGFzc2lzdGFudGAuXG4gICAqL1xuICBvYmplY3Q6ICdhc3Npc3RhbnQnO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdG9vbCBlbmFibGVkIG9uIHRoZSBhc3Npc3RhbnQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMTI4IHRvb2xzIHBlclxuICAgKiBhc3Npc3RhbnQuIFRvb2xzIGNhbiBiZSBvZiB0eXBlcyBgY29kZV9pbnRlcnByZXRlcmAsIGBmaWxlX3NlYXJjaGAsIG9yXG4gICAqIGBmdW5jdGlvbmAuXG4gICAqL1xuICB0b29sczogQXJyYXk8QXNzaXN0YW50VG9vbD47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00b10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00byksXG4gICAqIFtHUFQtNCBUdXJib10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00LXR1cmJvLWFuZC1ncHQtNCksXG4gICAqIGFuZCBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IFRocmVhZHNBUEkuQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGF0IHNhbXBsaW5nIHRlbXBlcmF0dXJlIHRvIHVzZSwgYmV0d2VlbiAwIGFuZCAyLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGxcbiAgICogbWFrZSB0aGUgb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmVcbiAgICogZm9jdXNlZCBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGFzc2lzdGFudCdzIHRvb2xzLiBUaGUgcmVzb3VyY2VzIGFyZVxuICAgKiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzXG4gICAqIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlXG4gICAqIElEcy5cbiAgICovXG4gIHRvb2xfcmVzb3VyY2VzPzogQXNzaXN0YW50LlRvb2xSZXNvdXJjZXMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBzYW1wbGluZyB3aXRoIHRlbXBlcmF0dXJlLCBjYWxsZWQgbnVjbGV1cyBzYW1wbGluZywgd2hlcmUgdGhlXG4gICAqIG1vZGVsIGNvbnNpZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgdG9rZW5zIHdpdGggdG9wX3AgcHJvYmFiaWxpdHkgbWFzcy4gU28gMC4xXG4gICAqIG1lYW5zIG9ubHkgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0b3AgMTAlIHByb2JhYmlsaXR5IG1hc3MgYXJlIGNvbnNpZGVyZWQuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciB0ZW1wZXJhdHVyZSBidXQgbm90IGJvdGguXG4gICAqL1xuICB0b3BfcD86IG51bWJlciB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQXNzaXN0YW50IHtcbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBhc3Npc3RhbnQncyB0b29scy4gVGhlIHJlc291cmNlcyBhcmVcbiAgICogc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlc1xuICAgKiBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZVxuICAgKiBJRHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGNvZGVfaW50ZXJwcmV0ZXI/OiBUb29sUmVzb3VyY2VzLkNvZGVJbnRlcnByZXRlcjtcblxuICAgIGZpbGVfc2VhcmNoPzogVG9vbFJlc291cmNlcy5GaWxlU2VhcmNoO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgICAvKipcbiAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGVcbiAgICAgICAqIGF2YWlsYWJsZSB0byB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2gge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyBhc3Npc3RhbnQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAqIHRoZSBhc3Npc3RhbnQuXG4gICAgICAgKi9cbiAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lzdGFudERlbGV0ZWQge1xuICBpZDogc3RyaW5nO1xuXG4gIGRlbGV0ZWQ6IGJvb2xlYW47XG5cbiAgb2JqZWN0OiAnYXNzaXN0YW50LmRlbGV0ZWQnO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gZXZlbnQgZW1pdHRlZCB3aGVuIHN0cmVhbWluZyBhIFJ1bi5cbiAqXG4gKiBFYWNoIGV2ZW50IGluIGEgc2VydmVyLXNlbnQgZXZlbnRzIHN0cmVhbSBoYXMgYW4gYGV2ZW50YCBhbmQgYGRhdGFgIHByb3BlcnR5OlxuICpcbiAqIGBgYFxuICogZXZlbnQ6IHRocmVhZC5jcmVhdGVkXG4gKiBkYXRhOiB7XCJpZFwiOiBcInRocmVhZF8xMjNcIiwgXCJvYmplY3RcIjogXCJ0aHJlYWRcIiwgLi4ufVxuICogYGBgXG4gKlxuICogV2UgZW1pdCBldmVudHMgd2hlbmV2ZXIgYSBuZXcgb2JqZWN0IGlzIGNyZWF0ZWQsIHRyYW5zaXRpb25zIHRvIGEgbmV3IHN0YXRlLCBvclxuICogaXMgYmVpbmcgc3RyZWFtZWQgaW4gcGFydHMgKGRlbHRhcykuIEZvciBleGFtcGxlLCB3ZSBlbWl0IGB0aHJlYWQucnVuLmNyZWF0ZWRgXG4gKiB3aGVuIGEgbmV3IHJ1biBpcyBjcmVhdGVkLCBgdGhyZWFkLnJ1bi5jb21wbGV0ZWRgIHdoZW4gYSBydW4gY29tcGxldGVzLCBhbmQgc29cbiAqIG9uLiBXaGVuIGFuIEFzc2lzdGFudCBjaG9vc2VzIHRvIGNyZWF0ZSBhIG1lc3NhZ2UgZHVyaW5nIGEgcnVuLCB3ZSBlbWl0IGFcbiAqIGB0aHJlYWQubWVzc2FnZS5jcmVhdGVkIGV2ZW50YCwgYSBgdGhyZWFkLm1lc3NhZ2UuaW5fcHJvZ3Jlc3NgIGV2ZW50LCBtYW55XG4gKiBgdGhyZWFkLm1lc3NhZ2UuZGVsdGFgIGV2ZW50cywgYW5kIGZpbmFsbHkgYSBgdGhyZWFkLm1lc3NhZ2UuY29tcGxldGVkYCBldmVudC5cbiAqXG4gKiBXZSBtYXkgYWRkIGFkZGl0aW9uYWwgZXZlbnRzIG92ZXIgdGltZSwgc28gd2UgcmVjb21tZW5kIGhhbmRsaW5nIHVua25vd24gZXZlbnRzXG4gKiBncmFjZWZ1bGx5IGluIHlvdXIgY29kZS4gU2VlIHRoZVxuICogW0Fzc2lzdGFudHMgQVBJIHF1aWNrc3RhcnRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2Fzc2lzdGFudHMvb3ZlcnZpZXcpXG4gKiB0byBsZWFybiBob3cgdG8gaW50ZWdyYXRlIHRoZSBBc3Npc3RhbnRzIEFQSSB3aXRoIHN0cmVhbWluZy5cbiAqL1xuZXhwb3J0IHR5cGUgQXNzaXN0YW50U3RyZWFtRXZlbnQgPVxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZENyZWF0ZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRSdW5DcmVhdGVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuUXVldWVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuSW5Qcm9ncmVzc1xuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1blJlcXVpcmVzQWN0aW9uXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuQ29tcGxldGVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuRmFpbGVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuQ2FuY2VsbGluZ1xuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1bkNhbmNlbGxlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1bkV4cGlyZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRSdW5TdGVwQ3JlYXRlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBJblByb2dyZXNzXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcERlbHRhXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcENvbXBsZXRlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBGYWlsZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRSdW5TdGVwQ2FuY2VsbGVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcEV4cGlyZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRNZXNzYWdlQ3JlYXRlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZE1lc3NhZ2VJblByb2dyZXNzXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkTWVzc2FnZURlbHRhXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkTWVzc2FnZUNvbXBsZXRlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZE1lc3NhZ2VJbmNvbXBsZXRlXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuRXJyb3JFdmVudDtcblxuZXhwb3J0IG5hbWVzcGFjZSBBc3Npc3RhbnRTdHJlYW1FdmVudCB7XG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIG5ld1xuICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMvb2JqZWN0KSBpc1xuICAgKiBjcmVhdGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRDcmVhdGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgdGhyZWFkIHRoYXQgY29udGFpbnNcbiAgICAgKiBbbWVzc2FnZXNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMpLlxuICAgICAqL1xuICAgIGRhdGE6IFRocmVhZHNBUEkuVGhyZWFkO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQuY3JlYXRlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBuZXdcbiAgICogW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdCkgaXMgY3JlYXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuQ3JlYXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmNyZWF0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogbW92ZXMgdG8gYSBgcXVldWVkYCBzdGF0dXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blF1ZXVlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnF1ZXVlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBtb3ZlcyB0byBhbiBgaW5fcHJvZ3Jlc3NgIHN0YXR1cy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuSW5Qcm9ncmVzcyB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmluX3Byb2dyZXNzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIG1vdmVzIHRvIGEgYHJlcXVpcmVzX2FjdGlvbmAgc3RhdHVzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5SZXF1aXJlc0FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnJlcXVpcmVzX2FjdGlvbic7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBpcyBjb21wbGV0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkNvbXBsZXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmNvbXBsZXRlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBmYWlscy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuRmFpbGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGFuIGV4ZWN1dGlvbiBydW4gb24gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogUnVuc0FQSS5SdW47XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uZmFpbGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIG1vdmVzIHRvIGEgYGNhbmNlbGxpbmdgIHN0YXR1cy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuQ2FuY2VsbGluZyB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmNhbmNlbGxpbmcnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogaXMgY2FuY2VsbGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5DYW5jZWxsZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5jYW5jZWxsZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogZXhwaXJlcy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuRXhwaXJlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmV4cGlyZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpIGlzXG4gICAqIGNyZWF0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBDcmVhdGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3RlcCBpbiBleGVjdXRpb24gb2YgYSBydW4uXG4gICAgICovXG4gICAgZGF0YTogU3RlcHNBUEkuUnVuU3RlcDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmNyZWF0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpXG4gICAqIG1vdmVzIHRvIGFuIGBpbl9wcm9ncmVzc2Agc3RhdGUuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBJblByb2dyZXNzIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3RlcCBpbiBleGVjdXRpb24gb2YgYSBydW4uXG4gICAgICovXG4gICAgZGF0YTogU3RlcHNBUEkuUnVuU3RlcDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmluX3Byb2dyZXNzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBwYXJ0cyBvZiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KSBhcmVcbiAgICogYmVpbmcgc3RyZWFtZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBEZWx0YSB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHJ1biBzdGVwIGRlbHRhIGkuZS4gYW55IGNoYW5nZWQgZmllbGRzIG9uIGEgcnVuIHN0ZXAgZHVyaW5nXG4gICAgICogc3RyZWFtaW5nLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXBEZWx0YUV2ZW50O1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnN0ZXAuZGVsdGEnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpIGlzXG4gICAqIGNvbXBsZXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcENvbXBsZXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5jb21wbGV0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpXG4gICAqIGZhaWxzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwRmFpbGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3RlcCBpbiBleGVjdXRpb24gb2YgYSBydW4uXG4gICAgICovXG4gICAgZGF0YTogU3RlcHNBUEkuUnVuU3RlcDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmZhaWxlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdCkgaXNcbiAgICogY2FuY2VsbGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwQ2FuY2VsbGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3RlcCBpbiBleGVjdXRpb24gb2YgYSBydW4uXG4gICAgICovXG4gICAgZGF0YTogU3RlcHNBUEkuUnVuU3RlcDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmNhbmNlbGxlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdClcbiAgICogZXhwaXJlcy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcEV4cGlyZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzdGVwIGluIGV4ZWN1dGlvbiBvZiBhIHJ1bi5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnN0ZXAuZXhwaXJlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbbWVzc2FnZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcy9vYmplY3QpIGlzXG4gICAqIGNyZWF0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VDcmVhdGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSB3aXRoaW4gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogTWVzc2FnZXNBUEkuTWVzc2FnZTtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuY3JlYXRlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbbWVzc2FnZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcy9vYmplY3QpIG1vdmVzXG4gICAqIHRvIGFuIGBpbl9wcm9ncmVzc2Agc3RhdGUuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VJblByb2dyZXNzIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSB3aXRoaW4gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogTWVzc2FnZXNBUEkuTWVzc2FnZTtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuaW5fcHJvZ3Jlc3MnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIHBhcnRzIG9mIGFcbiAgICogW01lc3NhZ2VdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMvb2JqZWN0KSBhcmVcbiAgICogYmVpbmcgc3RyZWFtZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VEZWx0YSB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIG1lc3NhZ2UgZGVsdGEgaS5lLiBhbnkgY2hhbmdlZCBmaWVsZHMgb24gYSBtZXNzYWdlIGR1cmluZ1xuICAgICAqIHN0cmVhbWluZy5cbiAgICAgKi9cbiAgICBkYXRhOiBNZXNzYWdlc0FQSS5NZXNzYWdlRGVsdGFFdmVudDtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuZGVsdGEnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW21lc3NhZ2VdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMvb2JqZWN0KSBpc1xuICAgKiBjb21wbGV0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VDb21wbGV0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIHdpdGhpbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBNZXNzYWdlc0FQSS5NZXNzYWdlO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQubWVzc2FnZS5jb21wbGV0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW21lc3NhZ2VdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMvb2JqZWN0KSBlbmRzXG4gICAqIGJlZm9yZSBpdCBpcyBjb21wbGV0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VJbmNvbXBsZXRlIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSB3aXRoaW4gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogTWVzc2FnZXNBUEkuTWVzc2FnZTtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuaW5jb21wbGV0ZSc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYW5cbiAgICogW2Vycm9yXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvZXJyb3ItY29kZXMvYXBpLWVycm9ycykgb2NjdXJzLlxuICAgKiBUaGlzIGNhbiBoYXBwZW4gZHVlIHRvIGFuIGludGVybmFsIHNlcnZlciBlcnJvciBvciBhIHRpbWVvdXQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEVycm9yRXZlbnQge1xuICAgIGRhdGE6IFNoYXJlZC5FcnJvck9iamVjdDtcblxuICAgIGV2ZW50OiAnZXJyb3InO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEFzc2lzdGFudFRvb2wgPSBDb2RlSW50ZXJwcmV0ZXJUb29sIHwgRmlsZVNlYXJjaFRvb2wgfCBGdW5jdGlvblRvb2w7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyVG9vbCB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0b29sIGJlaW5nIGRlZmluZWQ6IGBjb2RlX2ludGVycHJldGVyYFxuICAgKi9cbiAgdHlwZTogJ2NvZGVfaW50ZXJwcmV0ZXInO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2hUb29sIHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRvb2wgYmVpbmcgZGVmaW5lZDogYGZpbGVfc2VhcmNoYFxuICAgKi9cbiAgdHlwZTogJ2ZpbGVfc2VhcmNoJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvblRvb2wge1xuICBmdW5jdGlvbjogU2hhcmVkLkZ1bmN0aW9uRGVmaW5pdGlvbjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdG9vbCBiZWluZyBkZWZpbmVkOiBgZnVuY3Rpb25gXG4gICAqL1xuICB0eXBlOiAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIE9jY3VycyB3aGVuIGFcbiAqIFttZXNzYWdlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzL29iamVjdCkgaXNcbiAqIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VTdHJlYW1FdmVudCA9XG4gIHwgTWVzc2FnZVN0cmVhbUV2ZW50LlRocmVhZE1lc3NhZ2VDcmVhdGVkXG4gIHwgTWVzc2FnZVN0cmVhbUV2ZW50LlRocmVhZE1lc3NhZ2VJblByb2dyZXNzXG4gIHwgTWVzc2FnZVN0cmVhbUV2ZW50LlRocmVhZE1lc3NhZ2VEZWx0YVxuICB8IE1lc3NhZ2VTdHJlYW1FdmVudC5UaHJlYWRNZXNzYWdlQ29tcGxldGVkXG4gIHwgTWVzc2FnZVN0cmVhbUV2ZW50LlRocmVhZE1lc3NhZ2VJbmNvbXBsZXRlO1xuXG5leHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2VTdHJlYW1FdmVudCB7XG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFttZXNzYWdlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzL29iamVjdCkgaXNcbiAgICogY3JlYXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkTWVzc2FnZUNyZWF0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIHdpdGhpbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBNZXNzYWdlc0FQSS5NZXNzYWdlO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQubWVzc2FnZS5jcmVhdGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFttZXNzYWdlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzL29iamVjdCkgbW92ZXNcbiAgICogdG8gYW4gYGluX3Byb2dyZXNzYCBzdGF0ZS5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkTWVzc2FnZUluUHJvZ3Jlc3Mge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIHdpdGhpbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBNZXNzYWdlc0FQSS5NZXNzYWdlO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQubWVzc2FnZS5pbl9wcm9ncmVzcyc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gcGFydHMgb2YgYVxuICAgKiBbTWVzc2FnZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcy9vYmplY3QpIGFyZVxuICAgKiBiZWluZyBzdHJlYW1lZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkTWVzc2FnZURlbHRhIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSBkZWx0YSBpLmUuIGFueSBjaGFuZ2VkIGZpZWxkcyBvbiBhIG1lc3NhZ2UgZHVyaW5nXG4gICAgICogc3RyZWFtaW5nLlxuICAgICAqL1xuICAgIGRhdGE6IE1lc3NhZ2VzQVBJLk1lc3NhZ2VEZWx0YUV2ZW50O1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQubWVzc2FnZS5kZWx0YSc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbbWVzc2FnZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcy9vYmplY3QpIGlzXG4gICAqIGNvbXBsZXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkTWVzc2FnZUNvbXBsZXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIG1lc3NhZ2Ugd2l0aGluIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IE1lc3NhZ2VzQVBJLk1lc3NhZ2U7XG5cbiAgICBldmVudDogJ3RocmVhZC5tZXNzYWdlLmNvbXBsZXRlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbbWVzc2FnZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcy9vYmplY3QpIGVuZHNcbiAgICogYmVmb3JlIGl0IGlzIGNvbXBsZXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkTWVzc2FnZUluY29tcGxldGUge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIHdpdGhpbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBNZXNzYWdlc0FQSS5NZXNzYWdlO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQubWVzc2FnZS5pbmNvbXBsZXRlJztcbiAgfVxufVxuXG4vKipcbiAqIE9jY3VycyB3aGVuIGFcbiAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KSBpc1xuICogY3JlYXRlZC5cbiAqL1xuZXhwb3J0IHR5cGUgUnVuU3RlcFN0cmVhbUV2ZW50ID1cbiAgfCBSdW5TdGVwU3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcENyZWF0ZWRcbiAgfCBSdW5TdGVwU3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcEluUHJvZ3Jlc3NcbiAgfCBSdW5TdGVwU3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcERlbHRhXG4gIHwgUnVuU3RlcFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBDb21wbGV0ZWRcbiAgfCBSdW5TdGVwU3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcEZhaWxlZFxuICB8IFJ1blN0ZXBTdHJlYW1FdmVudC5UaHJlYWRSdW5TdGVwQ2FuY2VsbGVkXG4gIHwgUnVuU3RlcFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBFeHBpcmVkO1xuXG5leHBvcnQgbmFtZXNwYWNlIFJ1blN0ZXBTdHJlYW1FdmVudCB7XG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KSBpc1xuICAgKiBjcmVhdGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwQ3JlYXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5jcmVhdGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KVxuICAgKiBtb3ZlcyB0byBhbiBgaW5fcHJvZ3Jlc3NgIHN0YXRlLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwSW5Qcm9ncmVzcyB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5pbl9wcm9ncmVzcyc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gcGFydHMgb2YgYVxuICAgKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdCkgYXJlXG4gICAqIGJlaW5nIHN0cmVhbWVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwRGVsdGEge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBydW4gc3RlcCBkZWx0YSBpLmUuIGFueSBjaGFuZ2VkIGZpZWxkcyBvbiBhIHJ1biBzdGVwIGR1cmluZ1xuICAgICAqIHN0cmVhbWluZy5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwRGVsdGFFdmVudDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmRlbHRhJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KSBpc1xuICAgKiBjb21wbGV0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBDb21wbGV0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzdGVwIGluIGV4ZWN1dGlvbiBvZiBhIHJ1bi5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnN0ZXAuY29tcGxldGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KVxuICAgKiBmYWlscy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcEZhaWxlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5mYWlsZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpIGlzXG4gICAqIGNhbmNlbGxlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcENhbmNlbGxlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5jYW5jZWxsZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpXG4gICAqIGV4cGlyZXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBFeHBpcmVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3RlcCBpbiBleGVjdXRpb24gb2YgYSBydW4uXG4gICAgICovXG4gICAgZGF0YTogU3RlcHNBUEkuUnVuU3RlcDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmV4cGlyZWQnO1xuICB9XG59XG5cbi8qKlxuICogT2NjdXJzIHdoZW4gYSBuZXdcbiAqIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpIGlzIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFJ1blN0cmVhbUV2ZW50ID1cbiAgfCBSdW5TdHJlYW1FdmVudC5UaHJlYWRSdW5DcmVhdGVkXG4gIHwgUnVuU3RyZWFtRXZlbnQuVGhyZWFkUnVuUXVldWVkXG4gIHwgUnVuU3RyZWFtRXZlbnQuVGhyZWFkUnVuSW5Qcm9ncmVzc1xuICB8IFJ1blN0cmVhbUV2ZW50LlRocmVhZFJ1blJlcXVpcmVzQWN0aW9uXG4gIHwgUnVuU3RyZWFtRXZlbnQuVGhyZWFkUnVuQ29tcGxldGVkXG4gIHwgUnVuU3RyZWFtRXZlbnQuVGhyZWFkUnVuRmFpbGVkXG4gIHwgUnVuU3RyZWFtRXZlbnQuVGhyZWFkUnVuQ2FuY2VsbGluZ1xuICB8IFJ1blN0cmVhbUV2ZW50LlRocmVhZFJ1bkNhbmNlbGxlZFxuICB8IFJ1blN0cmVhbUV2ZW50LlRocmVhZFJ1bkV4cGlyZWQ7XG5cbmV4cG9ydCBuYW1lc3BhY2UgUnVuU3RyZWFtRXZlbnQge1xuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBuZXdcbiAgICogW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdCkgaXMgY3JlYXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuQ3JlYXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmNyZWF0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogbW92ZXMgdG8gYSBgcXVldWVkYCBzdGF0dXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blF1ZXVlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnF1ZXVlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBtb3ZlcyB0byBhbiBgaW5fcHJvZ3Jlc3NgIHN0YXR1cy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuSW5Qcm9ncmVzcyB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmluX3Byb2dyZXNzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIG1vdmVzIHRvIGEgYHJlcXVpcmVzX2FjdGlvbmAgc3RhdHVzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5SZXF1aXJlc0FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnJlcXVpcmVzX2FjdGlvbic7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBpcyBjb21wbGV0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkNvbXBsZXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmNvbXBsZXRlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBmYWlscy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuRmFpbGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGFuIGV4ZWN1dGlvbiBydW4gb24gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogUnVuc0FQSS5SdW47XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uZmFpbGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIG1vdmVzIHRvIGEgYGNhbmNlbGxpbmdgIHN0YXR1cy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuQ2FuY2VsbGluZyB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmNhbmNlbGxpbmcnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogaXMgY2FuY2VsbGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5DYW5jZWxsZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5jYW5jZWxsZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogZXhwaXJlcy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuRXhwaXJlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmV4cGlyZWQnO1xuICB9XG59XG5cbi8qKlxuICogT2NjdXJzIHdoZW4gYSBuZXdcbiAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcy9vYmplY3QpIGlzXG4gKiBjcmVhdGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRocmVhZFN0cmVhbUV2ZW50IHtcbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSB0aHJlYWQgdGhhdCBjb250YWluc1xuICAgKiBbbWVzc2FnZXNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMpLlxuICAgKi9cbiAgZGF0YTogVGhyZWFkc0FQSS5UaHJlYWQ7XG5cbiAgZXZlbnQ6ICd0aHJlYWQuY3JlYXRlZCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0YW50Q3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIElEIG9mIHRoZSBtb2RlbCB0byB1c2UuIFlvdSBjYW4gdXNlIHRoZVxuICAgKiBbTGlzdCBtb2RlbHNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzL2xpc3QpIEFQSSB0b1xuICAgKiBzZWUgYWxsIG9mIHlvdXIgYXZhaWxhYmxlIG1vZGVscywgb3Igc2VlIG91clxuICAgKiBbTW9kZWwgb3ZlcnZpZXddKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9vdmVydmlldykgZm9yXG4gICAqIGRlc2NyaXB0aW9ucyBvZiB0aGVtLlxuICAgKi9cbiAgbW9kZWw6XG4gICAgfCAoc3RyaW5nICYge30pXG4gICAgfCAnZ3B0LTRvJ1xuICAgIHwgJ2dwdC00by0yMDI0LTA1LTEzJ1xuICAgIHwgJ2dwdC00LXR1cmJvJ1xuICAgIHwgJ2dwdC00LXR1cmJvLTIwMjQtMDQtMDknXG4gICAgfCAnZ3B0LTQtMDEyNS1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXR1cmJvLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtMTEwNi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXZpc2lvbi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00J1xuICAgIHwgJ2dwdC00LTAzMTQnXG4gICAgfCAnZ3B0LTQtMDYxMydcbiAgICB8ICdncHQtNC0zMmsnXG4gICAgfCAnZ3B0LTQtMzJrLTAzMTQnXG4gICAgfCAnZ3B0LTQtMzJrLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJibydcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2aydcbiAgICB8ICdncHQtMy41LXR1cmJvLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xMTA2J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDEyNSdcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2ay0wNjEzJztcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhc3Npc3RhbnQuIFRoZSBtYXhpbXVtIGxlbmd0aCBpcyA1MTIgY2hhcmFjdGVycy5cbiAgICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHN5c3RlbSBpbnN0cnVjdGlvbnMgdGhhdCB0aGUgYXNzaXN0YW50IHVzZXMuIFRoZSBtYXhpbXVtIGxlbmd0aCBpcyAyNTYsMDAwXG4gICAqIGNoYXJhY3RlcnMuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYXNzaXN0YW50LiBUaGUgbWF4aW11bSBsZW5ndGggaXMgMjU2IGNoYXJhY3RlcnMuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICAgKiBbR1BULTRvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTRvKSxcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtdHVyYm8tYW5kLWdwdC00KSxcbiAgICogYW5kIGFsbCBHUFQtMy41IFR1cmJvIG1vZGVscyBzaW5jZSBgZ3B0LTMuNS10dXJiby0xMTA2YC5cbiAgICpcbiAgICogU2V0dGluZyB0byBgeyBcInR5cGVcIjogXCJqc29uX29iamVjdFwiIH1gIGVuYWJsZXMgSlNPTiBtb2RlLCB3aGljaCBndWFyYW50ZWVzIHRoZVxuICAgKiBtZXNzYWdlIHRoZSBtb2RlbCBnZW5lcmF0ZXMgaXMgdmFsaWQgSlNPTi5cbiAgICpcbiAgICogKipJbXBvcnRhbnQ6Kiogd2hlbiB1c2luZyBKU09OIG1vZGUsIHlvdSAqKm11c3QqKiBhbHNvIGluc3RydWN0IHRoZSBtb2RlbCB0b1xuICAgKiBwcm9kdWNlIEpTT04geW91cnNlbGYgdmlhIGEgc3lzdGVtIG9yIHVzZXIgbWVzc2FnZS4gV2l0aG91dCB0aGlzLCB0aGUgbW9kZWwgbWF5XG4gICAqIGdlbmVyYXRlIGFuIHVuZW5kaW5nIHN0cmVhbSBvZiB3aGl0ZXNwYWNlIHVudGlsIHRoZSBnZW5lcmF0aW9uIHJlYWNoZXMgdGhlIHRva2VuXG4gICAqIGxpbWl0LCByZXN1bHRpbmcgaW4gYSBsb25nLXJ1bm5pbmcgYW5kIHNlZW1pbmdseSBcInN0dWNrXCIgcmVxdWVzdC4gQWxzbyBub3RlIHRoYXRcbiAgICogdGhlIG1lc3NhZ2UgY29udGVudCBtYXkgYmUgcGFydGlhbGx5IGN1dCBvZmYgaWYgYGZpbmlzaF9yZWFzb249XCJsZW5ndGhcImAsIHdoaWNoXG4gICAqIGluZGljYXRlcyB0aGUgZ2VuZXJhdGlvbiBleGNlZWRlZCBgbWF4X3Rva2Vuc2Agb3IgdGhlIGNvbnZlcnNhdGlvbiBleGNlZWRlZCB0aGVcbiAgICogbWF4IGNvbnRleHQgbGVuZ3RoLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogVGhyZWFkc0FQSS5Bc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoYXQgc2FtcGxpbmcgdGVtcGVyYXR1cmUgdG8gdXNlLCBiZXR3ZWVuIDAgYW5kIDIuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbFxuICAgKiBtYWtlIHRoZSBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZVxuICAgKiBmb2N1c2VkIGFuZCBkZXRlcm1pbmlzdGljLlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgYXNzaXN0YW50J3MgdG9vbHMuIFRoZSByZXNvdXJjZXMgYXJlXG4gICAqIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXNcbiAgICogYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVcbiAgICogSURzLlxuICAgKi9cbiAgdG9vbF9yZXNvdXJjZXM/OiBBc3Npc3RhbnRDcmVhdGVQYXJhbXMuVG9vbFJlc291cmNlcyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiB0b29sIGVuYWJsZWQgb24gdGhlIGFzc2lzdGFudC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxMjggdG9vbHMgcGVyXG4gICAqIGFzc2lzdGFudC4gVG9vbHMgY2FuIGJlIG9mIHR5cGVzIGBjb2RlX2ludGVycHJldGVyYCwgYGZpbGVfc2VhcmNoYCwgb3JcbiAgICogYGZ1bmN0aW9uYC5cbiAgICovXG4gIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50VG9vbD47XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIHRlbXBlcmF0dXJlIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBBc3Npc3RhbnRDcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGFzc2lzdGFudCdzIHRvb2xzLiBUaGUgcmVzb3VyY2VzIGFyZVxuICAgKiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzXG4gICAqIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlXG4gICAqIElEcy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgY29kZV9pbnRlcnByZXRlcj86IFRvb2xSZXNvdXJjZXMuQ29kZUludGVycHJldGVyO1xuXG4gICAgZmlsZV9zZWFyY2g/OiBUb29sUmVzb3VyY2VzLkZpbGVTZWFyY2g7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgbWFkZVxuICAgICAgICogYXZhaWxhYmxlIHRvIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAyMCBmaWxlc1xuICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0b29sLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyBhc3Npc3RhbnQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAqIHRoZSBhc3Npc3RhbnQuXG4gICAgICAgKi9cbiAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgICAvKipcbiAgICAgICAqIEEgaGVscGVyIHRvIGNyZWF0ZSBhXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogd2l0aCBmaWxlX2lkcyBhbmQgYXR0YWNoIGl0IHRvIHRoaXMgYXNzaXN0YW50LiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDFcbiAgICAgICAqIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0byB0aGUgYXNzaXN0YW50LlxuICAgICAgICovXG4gICAgICB2ZWN0b3Jfc3RvcmVzPzogQXJyYXk8RmlsZVNlYXJjaC5WZWN0b3JTdG9yZT47XG4gICAgfVxuXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBGaWxlU2VhcmNoIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmUge1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgdG9cbiAgICAgICAgICogYWRkIHRvIHRoZSB2ZWN0b3Igc3RvcmUuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMTAwMDAgZmlsZXMgaW4gYSB2ZWN0b3JcbiAgICAgICAgICogc3RvcmUuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSB2ZWN0b3Igc3RvcmUuIFRoaXMgY2FuIGJlXG4gICAgICAgICAqIHVzZWZ1bCBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZWN0b3Igc3RvcmUgaW4gYSBzdHJ1Y3R1cmVkXG4gICAgICAgICAqIGZvcm1hdC4gS2V5cyBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bVxuICAgICAgICAgKiBvZiA1MTIgY2hhcmFjdGVycyBsb25nLlxuICAgICAgICAgKi9cbiAgICAgICAgbWV0YWRhdGE/OiB1bmtub3duO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lzdGFudFVwZGF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGFzc2lzdGFudC4gVGhlIG1heGltdW0gbGVuZ3RoIGlzIDUxMiBjaGFyYWN0ZXJzLlxuICAgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc3lzdGVtIGluc3RydWN0aW9ucyB0aGF0IHRoZSBhc3Npc3RhbnQgdXNlcy4gVGhlIG1heGltdW0gbGVuZ3RoIGlzIDI1NiwwMDBcbiAgICogY2hhcmFjdGVycy5cbiAgICovXG4gIGluc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIElEIG9mIHRoZSBtb2RlbCB0byB1c2UuIFlvdSBjYW4gdXNlIHRoZVxuICAgKiBbTGlzdCBtb2RlbHNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzL2xpc3QpIEFQSSB0b1xuICAgKiBzZWUgYWxsIG9mIHlvdXIgYXZhaWxhYmxlIG1vZGVscywgb3Igc2VlIG91clxuICAgKiBbTW9kZWwgb3ZlcnZpZXddKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9vdmVydmlldykgZm9yXG4gICAqIGRlc2NyaXB0aW9ucyBvZiB0aGVtLlxuICAgKi9cbiAgbW9kZWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhc3Npc3RhbnQuIFRoZSBtYXhpbXVtIGxlbmd0aCBpcyAyNTYgY2hhcmFjdGVycy5cbiAgICovXG4gIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGZvcm1hdCB0aGF0IHRoZSBtb2RlbCBtdXN0IG91dHB1dC4gQ29tcGF0aWJsZSB3aXRoXG4gICAqIFtHUFQtNG9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNG8pLFxuICAgKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC10dXJiby1hbmQtZ3B0LTQpLFxuICAgKiBhbmQgYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIHNpbmNlIGBncHQtMy41LXR1cmJvLTExMDZgLlxuICAgKlxuICAgKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gICAqIG1lc3NhZ2UgdGhlIG1vZGVsIGdlbmVyYXRlcyBpcyB2YWxpZCBKU09OLlxuICAgKlxuICAgKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gICAqIHByb2R1Y2UgSlNPTiB5b3Vyc2VsZiB2aWEgYSBzeXN0ZW0gb3IgdXNlciBtZXNzYWdlLiBXaXRob3V0IHRoaXMsIHRoZSBtb2RlbCBtYXlcbiAgICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAgICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IG1heSBiZSBwYXJ0aWFsbHkgY3V0IG9mZiBpZiBgZmluaXNoX3JlYXNvbj1cImxlbmd0aFwiYCwgd2hpY2hcbiAgICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICAgKiBtYXggY29udGV4dCBsZW5ndGguXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBUaHJlYWRzQVBJLkFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hhdCBzYW1wbGluZyB0ZW1wZXJhdHVyZSB0byB1c2UsIGJldHdlZW4gMCBhbmQgMi4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsXG4gICAqIG1ha2UgdGhlIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlXG4gICAqIGZvY3VzZWQgYW5kIGRldGVybWluaXN0aWMuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBhc3Npc3RhbnQncyB0b29scy4gVGhlIHJlc291cmNlcyBhcmVcbiAgICogc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlc1xuICAgKiBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZVxuICAgKiBJRHMuXG4gICAqL1xuICB0b29sX3Jlc291cmNlcz86IEFzc2lzdGFudFVwZGF0ZVBhcmFtcy5Ub29sUmVzb3VyY2VzIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIHRvb2wgZW5hYmxlZCBvbiB0aGUgYXNzaXN0YW50LiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEyOCB0b29scyBwZXJcbiAgICogYXNzaXN0YW50LiBUb29scyBjYW4gYmUgb2YgdHlwZXMgYGNvZGVfaW50ZXJwcmV0ZXJgLCBgZmlsZV9zZWFyY2hgLCBvclxuICAgKiBgZnVuY3Rpb25gLlxuICAgKi9cbiAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRUb29sPjtcblxuICAvKipcbiAgICogQW4gYWx0ZXJuYXRpdmUgdG8gc2FtcGxpbmcgd2l0aCB0ZW1wZXJhdHVyZSwgY2FsbGVkIG51Y2xldXMgc2FtcGxpbmcsIHdoZXJlIHRoZVxuICAgKiBtb2RlbCBjb25zaWRlcnMgdGhlIHJlc3VsdHMgb2YgdGhlIHRva2VucyB3aXRoIHRvcF9wIHByb2JhYmlsaXR5IG1hc3MuIFNvIDAuMVxuICAgKiBtZWFucyBvbmx5IHRoZSB0b2tlbnMgY29tcHJpc2luZyB0aGUgdG9wIDEwJSBwcm9iYWJpbGl0eSBtYXNzIGFyZSBjb25zaWRlcmVkLlxuICAgKlxuICAgKiBXZSBnZW5lcmFsbHkgcmVjb21tZW5kIGFsdGVyaW5nIHRoaXMgb3IgdGVtcGVyYXR1cmUgYnV0IG5vdCBib3RoLlxuICAgKi9cbiAgdG9wX3A/OiBudW1iZXIgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEFzc2lzdGFudFVwZGF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgYXNzaXN0YW50J3MgdG9vbHMuIFRoZSByZXNvdXJjZXMgYXJlXG4gICAqIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXNcbiAgICogYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVcbiAgICogSURzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBjb2RlX2ludGVycHJldGVyPzogVG9vbFJlc291cmNlcy5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgLyoqXG4gICAgICAgKiBPdmVycmlkZXMgdGhlIGxpc3Qgb2ZcbiAgICAgICAqIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgbWFkZSBhdmFpbGFibGVcbiAgICAgICAqIHRvIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAyMCBmaWxlcyBhc3NvY2lhdGVkXG4gICAgICAgKiB3aXRoIHRoZSB0b29sLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoIHtcbiAgICAgIC8qKlxuICAgICAgICogT3ZlcnJpZGVzIHRoZVxuICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAqIGF0dGFjaGVkIHRvIHRoaXMgYXNzaXN0YW50LiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEgdmVjdG9yIHN0b3JlIGF0dGFjaGVkIHRvXG4gICAgICAgKiB0aGUgYXNzaXN0YW50LlxuICAgICAgICovXG4gICAgICB2ZWN0b3Jfc3RvcmVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3Npc3RhbnRMaXN0UGFyYW1zIGV4dGVuZHMgQ3Vyc29yUGFnZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGN1cnNvciBmb3IgdXNlIGluIHBhZ2luYXRpb24uIGBiZWZvcmVgIGlzIGFuIG9iamVjdCBJRCB0aGF0IGRlZmluZXMgeW91ciBwbGFjZVxuICAgKiBpbiB0aGUgbGlzdC4gRm9yIGluc3RhbmNlLCBpZiB5b3UgbWFrZSBhIGxpc3QgcmVxdWVzdCBhbmQgcmVjZWl2ZSAxMDAgb2JqZWN0cyxcbiAgICogZW5kaW5nIHdpdGggb2JqX2ZvbywgeW91ciBzdWJzZXF1ZW50IGNhbGwgY2FuIGluY2x1ZGUgYmVmb3JlPW9ial9mb28gaW4gb3JkZXIgdG9cbiAgICogZmV0Y2ggdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIGxpc3QuXG4gICAqL1xuICBiZWZvcmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNvcnQgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lc3RhbXAgb2YgdGhlIG9iamVjdHMuIGBhc2NgIGZvciBhc2NlbmRpbmdcbiAgICogb3JkZXIgYW5kIGBkZXNjYCBmb3IgZGVzY2VuZGluZyBvcmRlci5cbiAgICovXG4gIG9yZGVyPzogJ2FzYycgfCAnZGVzYyc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQXNzaXN0YW50cyB7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50ID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnQ7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50RGVsZXRlZCA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50RGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRTdHJlYW1FdmVudCA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50VG9vbCA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50VG9vbDtcbiAgZXhwb3J0IGltcG9ydCBDb2RlSW50ZXJwcmV0ZXJUb29sID0gQXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sO1xuICBleHBvcnQgaW1wb3J0IEZpbGVTZWFyY2hUb29sID0gQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbDtcbiAgZXhwb3J0IGltcG9ydCBGdW5jdGlvblRvb2wgPSBBc3Npc3RhbnRzQVBJLkZ1bmN0aW9uVG9vbDtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlU3RyZWFtRXZlbnQgPSBBc3Npc3RhbnRzQVBJLk1lc3NhZ2VTdHJlYW1FdmVudDtcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGVwU3RyZWFtRXZlbnQgPSBBc3Npc3RhbnRzQVBJLlJ1blN0ZXBTdHJlYW1FdmVudDtcbiAgZXhwb3J0IGltcG9ydCBSdW5TdHJlYW1FdmVudCA9IEFzc2lzdGFudHNBUEkuUnVuU3RyZWFtRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkU3RyZWFtRXZlbnQgPSBBc3Npc3RhbnRzQVBJLlRocmVhZFN0cmVhbUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudHNQYWdlID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRDcmVhdGVQYXJhbXMgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudENyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRVcGRhdGVQYXJhbXMgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFVwZGF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRMaXN0UGFyYW1zID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRMaXN0UGFyYW1zO1xufVxuIiwgImltcG9ydCB7IHR5cGUgQ2hhdENvbXBsZXRpb25SdW5uZXIgfSBmcm9tICcuL0NoYXRDb21wbGV0aW9uUnVubmVyJztcbmltcG9ydCB7IHR5cGUgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIgfSBmcm9tICcuL0NoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyJztcbmltcG9ydCB7IEpTT05TY2hlbWEgfSBmcm9tICcuL2pzb25zY2hlbWEnO1xuXG50eXBlIFByb21pc2VPclZhbHVlPFQ+ID0gVCB8IFByb21pc2U8VD47XG5cbmV4cG9ydCB0eXBlIFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncyBleHRlbmRzIG9iamVjdD4gPSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gYXJncyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gYHBhcnNlYC5cbiAgICogQHBhcmFtIHJ1bm5lciB0aGUgcnVubmVyIGV2YWx1YXRpbmcgdGhpcyBjYWxsYmFjay5cbiAgICogQHJldHVybnMgYSBzdHJpbmcgdG8gc2VuZCBiYWNrIHRvIE9wZW5BSS5cbiAgICovXG4gIGZ1bmN0aW9uOiAoXG4gICAgYXJnczogQXJncyxcbiAgICBydW5uZXI6IENoYXRDb21wbGV0aW9uUnVubmVyIHwgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIsXG4gICkgPT4gUHJvbWlzZU9yVmFsdWU8dW5rbm93bj47XG4gIC8qKlxuICAgKiBAcGFyYW0gaW5wdXQgdGhlIHJhdyBhcmdzIGZyb20gdGhlIE9wZW5BSSBmdW5jdGlvbiBjYWxsLlxuICAgKiBAcmV0dXJucyB0aGUgcGFyc2VkIGFyZ3VtZW50cyB0byBwYXNzIHRvIGBmdW5jdGlvbmBcbiAgICovXG4gIHBhcnNlOiAoaW5wdXQ6IHN0cmluZykgPT4gUHJvbWlzZU9yVmFsdWU8QXJncz47XG4gIC8qKlxuICAgKiBUaGUgcGFyYW1ldGVycyB0aGUgZnVuY3Rpb24gYWNjZXB0cywgZGVzY3JpYmVzIGFzIGEgSlNPTiBTY2hlbWEgb2JqZWN0LlxuICAgKi9cbiAgcGFyYW1ldGVyczogSlNPTlNjaGVtYTtcbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgZnVuY3Rpb24gZG9lcywgdXNlZCBieSB0aGUgbW9kZWwgdG8gY2hvb3NlIHdoZW4gYW5kIGhvdyB0byBjYWxsIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLiBXaWxsIGRlZmF1bHQgdG8gZnVuY3Rpb24ubmFtZSBpZiBvbWl0dGVkLlxuICAgKi9cbiAgbmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCB0eXBlIFJ1bm5hYmxlRnVuY3Rpb25XaXRob3V0UGFyc2UgPSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gYXJncyB0aGUgcmF3IGFyZ3MgZnJvbSB0aGUgT3BlbkFJIGZ1bmN0aW9uIGNhbGwuXG4gICAqIEByZXR1cm5zIGEgc3RyaW5nIHRvIHNlbmQgYmFjayB0byBPcGVuQUlcbiAgICovXG4gIGZ1bmN0aW9uOiAoXG4gICAgYXJnczogc3RyaW5nLFxuICAgIHJ1bm5lcjogQ2hhdENvbXBsZXRpb25SdW5uZXIgfCBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lcixcbiAgKSA9PiBQcm9taXNlT3JWYWx1ZTx1bmtub3duPjtcbiAgLyoqXG4gICAqIFRoZSBwYXJhbWV0ZXJzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLCBkZXNjcmliZXMgYXMgYSBKU09OIFNjaGVtYSBvYmplY3QuXG4gICAqL1xuICBwYXJhbWV0ZXJzOiBKU09OU2NoZW1hO1xuICAvKipcbiAgICogQSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBmdW5jdGlvbiBkb2VzLCB1c2VkIGJ5IHRoZSBtb2RlbCB0byBjaG9vc2Ugd2hlbiBhbmQgaG93IHRvIGNhbGwgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQuIFdpbGwgZGVmYXVsdCB0byBmdW5jdGlvbi5uYW1lIGlmIG9taXR0ZWQuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IHR5cGUgUnVubmFibGVGdW5jdGlvbjxBcmdzIGV4dGVuZHMgb2JqZWN0IHwgc3RyaW5nPiA9XG4gIEFyZ3MgZXh0ZW5kcyBzdHJpbmcgPyBSdW5uYWJsZUZ1bmN0aW9uV2l0aG91dFBhcnNlXG4gIDogQXJncyBleHRlbmRzIG9iamVjdCA/IFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncz5cbiAgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgUnVubmFibGVUb29sRnVuY3Rpb248QXJncyBleHRlbmRzIG9iamVjdCB8IHN0cmluZz4gPVxuICBBcmdzIGV4dGVuZHMgc3RyaW5nID8gUnVubmFibGVUb29sRnVuY3Rpb25XaXRob3V0UGFyc2VcbiAgOiBBcmdzIGV4dGVuZHMgb2JqZWN0ID8gUnVubmFibGVUb29sRnVuY3Rpb25XaXRoUGFyc2U8QXJncz5cbiAgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgUnVubmFibGVUb29sRnVuY3Rpb25XaXRob3V0UGFyc2UgPSB7XG4gIHR5cGU6ICdmdW5jdGlvbic7XG4gIGZ1bmN0aW9uOiBSdW5uYWJsZUZ1bmN0aW9uV2l0aG91dFBhcnNlO1xufTtcbmV4cG9ydCB0eXBlIFJ1bm5hYmxlVG9vbEZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3MgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICB0eXBlOiAnZnVuY3Rpb24nO1xuICBmdW5jdGlvbjogUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZTxBcmdzPjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1J1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncyBleHRlbmRzIG9iamVjdD4oXG4gIGZuOiBhbnksXG4pOiBmbiBpcyBSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3M+IHtcbiAgcmV0dXJuIHR5cGVvZiAoZm4gYXMgYW55KS5wYXJzZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IHR5cGUgQmFzZUZ1bmN0aW9uc0FyZ3MgPSByZWFkb25seSAob2JqZWN0IHwgc3RyaW5nKVtdO1xuXG5leHBvcnQgdHlwZSBSdW5uYWJsZUZ1bmN0aW9uczxGdW5jdGlvbnNBcmdzIGV4dGVuZHMgQmFzZUZ1bmN0aW9uc0FyZ3M+ID1cbiAgW2FueVtdXSBleHRlbmRzIFtGdW5jdGlvbnNBcmdzXSA/IHJlYWRvbmx5IFJ1bm5hYmxlRnVuY3Rpb248YW55PltdXG4gIDoge1xuICAgICAgW0luZGV4IGluIGtleW9mIEZ1bmN0aW9uc0FyZ3NdOiBJbmRleCBleHRlbmRzIG51bWJlciA/IFJ1bm5hYmxlRnVuY3Rpb248RnVuY3Rpb25zQXJnc1tJbmRleF0+XG4gICAgICA6IEZ1bmN0aW9uc0FyZ3NbSW5kZXhdO1xuICAgIH07XG5cbmV4cG9ydCB0eXBlIFJ1bm5hYmxlVG9vbHM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPiA9XG4gIFthbnlbXV0gZXh0ZW5kcyBbRnVuY3Rpb25zQXJnc10gPyByZWFkb25seSBSdW5uYWJsZVRvb2xGdW5jdGlvbjxhbnk+W11cbiAgOiB7XG4gICAgICBbSW5kZXggaW4ga2V5b2YgRnVuY3Rpb25zQXJnc106IEluZGV4IGV4dGVuZHMgbnVtYmVyID8gUnVubmFibGVUb29sRnVuY3Rpb248RnVuY3Rpb25zQXJnc1tJbmRleF0+XG4gICAgICA6IEZ1bmN0aW9uc0FyZ3NbSW5kZXhdO1xuICAgIH07XG5cbi8qKlxuICogVGhpcyBpcyBoZWxwZXIgY2xhc3MgZm9yIHBhc3NpbmcgYSBgZnVuY3Rpb25gIGFuZCBgcGFyc2VgIHdoZXJlIHRoZSBgZnVuY3Rpb25gXG4gKiBhcmd1bWVudCB0eXBlIG1hdGNoZXMgdGhlIGBwYXJzZWAgcmV0dXJuIHR5cGUuXG4gKlxuICogQGRlcHJlY2F0ZWQgLSBwbGVhc2UgdXNlIFBhcnNpbmdUb29sRnVuY3Rpb24gaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhcnNpbmdGdW5jdGlvbjxBcmdzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIGZ1bmN0aW9uOiBSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3M+WydmdW5jdGlvbiddO1xuICBwYXJzZTogUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZTxBcmdzPlsncGFyc2UnXTtcbiAgcGFyYW1ldGVyczogUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZTxBcmdzPlsncGFyYW1ldGVycyddO1xuICBkZXNjcmlwdGlvbjogUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZTxBcmdzPlsnZGVzY3JpcHRpb24nXTtcbiAgbmFtZT86IFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncz5bJ25hbWUnXTtcblxuICBjb25zdHJ1Y3RvcihpbnB1dDogUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZTxBcmdzPikge1xuICAgIHRoaXMuZnVuY3Rpb24gPSBpbnB1dC5mdW5jdGlvbjtcbiAgICB0aGlzLnBhcnNlID0gaW5wdXQucGFyc2U7XG4gICAgdGhpcy5wYXJhbWV0ZXJzID0gaW5wdXQucGFyYW1ldGVycztcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gaW5wdXQuZGVzY3JpcHRpb247XG4gICAgdGhpcy5uYW1lID0gaW5wdXQubmFtZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgaGVscGVyIGNsYXNzIGZvciBwYXNzaW5nIGEgYGZ1bmN0aW9uYCBhbmQgYHBhcnNlYCB3aGVyZSB0aGUgYGZ1bmN0aW9uYFxuICogYXJndW1lbnQgdHlwZSBtYXRjaGVzIHRoZSBgcGFyc2VgIHJldHVybiB0eXBlLlxuICovXG5leHBvcnQgY2xhc3MgUGFyc2luZ1Rvb2xGdW5jdGlvbjxBcmdzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIHR5cGU6ICdmdW5jdGlvbic7XG4gIGZ1bmN0aW9uOiBSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3M+O1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0OiBSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3M+KSB7XG4gICAgdGhpcy50eXBlID0gJ2Z1bmN0aW9uJztcbiAgICB0aGlzLmZ1bmN0aW9uID0gaW5wdXQ7XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICB0eXBlIENoYXRDb21wbGV0aW9uQXNzaXN0YW50TWVzc2FnZVBhcmFtLFxuICB0eXBlIENoYXRDb21wbGV0aW9uRnVuY3Rpb25NZXNzYWdlUGFyYW0sXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0sXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25Ub29sTWVzc2FnZVBhcmFtLFxufSBmcm9tIFwiLi4vcmVzb3VyY2VzXCI7XG5cbmV4cG9ydCBjb25zdCBpc0Fzc2lzdGFudE1lc3NhZ2UgPSAoXG4gIG1lc3NhZ2U6IENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IG1lc3NhZ2UgaXMgQ2hhdENvbXBsZXRpb25Bc3Npc3RhbnRNZXNzYWdlUGFyYW0gPT4ge1xuICByZXR1cm4gbWVzc2FnZT8ucm9sZSA9PT0gJ2Fzc2lzdGFudCc7XG59O1xuXG5leHBvcnQgY29uc3QgaXNGdW5jdGlvbk1lc3NhZ2UgPSAoXG4gIG1lc3NhZ2U6IENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IG1lc3NhZ2UgaXMgQ2hhdENvbXBsZXRpb25GdW5jdGlvbk1lc3NhZ2VQYXJhbSA9PiB7XG4gIHJldHVybiBtZXNzYWdlPy5yb2xlID09PSAnZnVuY3Rpb24nO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzVG9vbE1lc3NhZ2UgPSAoXG4gIG1lc3NhZ2U6IENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IG1lc3NhZ2UgaXMgQ2hhdENvbXBsZXRpb25Ub29sTWVzc2FnZVBhcmFtID0+IHtcbiAgcmV0dXJuIG1lc3NhZ2U/LnJvbGUgPT09ICd0b29sJztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByZXNlbnQ8VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG9iaiBpcyBUIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsO1xufVxuIiwgImltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IHR5cGUgQ29tcGxldGlvblVzYWdlIH0gZnJvbSBcIi4uL3Jlc291cmNlcy9jb21wbGV0aW9uc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBDb21wbGV0aW9ucyxcbiAgdHlwZSBDaGF0Q29tcGxldGlvbixcbiAgdHlwZSBDaGF0Q29tcGxldGlvbk1lc3NhZ2UsXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0sXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMsXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25Ub29sLFxufSBmcm9tIFwiLi4vcmVzb3VyY2VzL2NoYXQvY29tcGxldGlvbnNcIjtcbmltcG9ydCB7IEFQSVVzZXJBYm9ydEVycm9yLCBPcGVuQUlFcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuaW1wb3J0IHtcbiAgdHlwZSBSdW5uYWJsZUZ1bmN0aW9uLFxuICBpc1J1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2UsXG4gIHR5cGUgQmFzZUZ1bmN0aW9uc0FyZ3MsXG59IGZyb20gJy4vUnVubmFibGVGdW5jdGlvbic7XG5pbXBvcnQgeyBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uUnVubmVyUGFyYW1zLCBDaGF0Q29tcGxldGlvblRvb2xSdW5uZXJQYXJhbXMgfSBmcm9tICcuL0NoYXRDb21wbGV0aW9uUnVubmVyJztcbmltcG9ydCB7XG4gIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nRnVuY3Rpb25SdW5uZXJQYXJhbXMsXG4gIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nVG9vbFJ1bm5lclBhcmFtcyxcbn0gZnJvbSAnLi9DaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lcic7XG5pbXBvcnQgeyBpc0Fzc2lzdGFudE1lc3NhZ2UsIGlzRnVuY3Rpb25NZXNzYWdlLCBpc1Rvb2xNZXNzYWdlIH0gZnJvbSAnLi9jaGF0Q29tcGxldGlvblV0aWxzJztcblxuY29uc3QgREVGQVVMVF9NQVhfQ0hBVF9DT01QTEVUSU9OUyA9IDEwO1xuZXhwb3J0IGludGVyZmFjZSBSdW5uZXJPcHRpb25zIGV4dGVuZHMgQ29yZS5SZXF1ZXN0T3B0aW9ucyB7XG4gIC8qKiBIb3cgbWFueSByZXF1ZXN0cyB0byBtYWtlIGJlZm9yZSBjYW5jZWxpbmcuIERlZmF1bHQgMTAuICovXG4gIG1heENoYXRDb21wbGV0aW9ucz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXI8XG4gIEV2ZW50cyBleHRlbmRzIEN1c3RvbUV2ZW50czxhbnk+ID0gQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lckV2ZW50cyxcbj4ge1xuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgI2Nvbm5lY3RlZFByb21pc2U6IFByb21pc2U8dm9pZD47XG4gICNyZXNvbHZlQ29ubmVjdGVkUHJvbWlzZTogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAjcmVqZWN0Q29ubmVjdGVkUHJvbWlzZTogKGVycm9yOiBPcGVuQUlFcnJvcikgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICNlbmRQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICAjcmVzb2x2ZUVuZFByb21pc2U6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgI3JlamVjdEVuZFByb21pc2U6IChlcnJvcjogT3BlbkFJRXJyb3IpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAjbGlzdGVuZXJzOiB7IFtFdmVudCBpbiBrZXlvZiBFdmVudHNdPzogTGlzdGVuZXJzRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD4gfSA9IHt9O1xuXG4gIHByb3RlY3RlZCBfY2hhdENvbXBsZXRpb25zOiBDaGF0Q29tcGxldGlvbltdID0gW107XG4gIG1lc3NhZ2VzOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbVtdID0gW107XG5cbiAgI2VuZGVkID0gZmFsc2U7XG4gICNlcnJvcmVkID0gZmFsc2U7XG4gICNhYm9ydGVkID0gZmFsc2U7XG4gICNjYXRjaGluZ1Byb21pc2VDcmVhdGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy4jY29ubmVjdGVkUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuI3Jlc29sdmVDb25uZWN0ZWRQcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMuI3JlamVjdENvbm5lY3RlZFByb21pc2UgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICB0aGlzLiNlbmRQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy4jcmVzb2x2ZUVuZFByb21pc2UgPSByZXNvbHZlO1xuICAgICAgdGhpcy4jcmVqZWN0RW5kUHJvbWlzZSA9IHJlamVjdDtcbiAgICB9KTtcblxuICAgIC8vIERvbid0IGxldCB0aGVzZSBwcm9taXNlcyBjYXVzZSB1bmhhbmRsZWQgcmVqZWN0aW9uIGVycm9ycy5cbiAgICAvLyB3ZSB3aWxsIG1hbnVhbGx5IGNhdXNlIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gZXJyb3IgbGF0ZXJcbiAgICAvLyBpZiB0aGUgdXNlciBoYXNuJ3QgcmVnaXN0ZXJlZCBhbnkgZXJyb3IgbGlzdGVuZXIgb3IgY2FsbGVkXG4gICAgLy8gYW55IHByb21pc2UtcmV0dXJuaW5nIG1ldGhvZC5cbiAgICB0aGlzLiNjb25uZWN0ZWRQcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICB0aGlzLiNlbmRQcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfcnVuKGV4ZWN1dG9yOiAoKSA9PiBQcm9taXNlPGFueT4pIHtcbiAgICAvLyBVbmZvcnR1bmF0ZWx5IGlmIHdlIGNhbGwgYGV4ZWN1dG9yKClgIGltbWVkaWF0ZWx5IHdlIGdldCBydW50aW1lIGVycm9ycyBhYm91dFxuICAgIC8vIHJlZmVyZW5jZXMgdG8gYHRoaXNgIGJlZm9yZSB0aGUgYHN1cGVyKClgIGNvbnN0cnVjdG9yIGNhbGwgcmV0dXJucy5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGV4ZWN1dG9yKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX2VtaXRGaW5hbCgpO1xuICAgICAgICB0aGlzLl9lbWl0KCdlbmQnKTtcbiAgICAgIH0sIHRoaXMuI2hhbmRsZUVycm9yKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfYWRkQ2hhdENvbXBsZXRpb24oY2hhdENvbXBsZXRpb246IENoYXRDb21wbGV0aW9uKTogQ2hhdENvbXBsZXRpb24ge1xuICAgIHRoaXMuX2NoYXRDb21wbGV0aW9ucy5wdXNoKGNoYXRDb21wbGV0aW9uKTtcbiAgICB0aGlzLl9lbWl0KCdjaGF0Q29tcGxldGlvbicsIGNoYXRDb21wbGV0aW9uKTtcbiAgICBjb25zdCBtZXNzYWdlID0gY2hhdENvbXBsZXRpb24uY2hvaWNlc1swXT8ubWVzc2FnZTtcbiAgICBpZiAobWVzc2FnZSkgdGhpcy5fYWRkTWVzc2FnZShtZXNzYWdlIGFzIENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtKTtcbiAgICByZXR1cm4gY2hhdENvbXBsZXRpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgX2FkZE1lc3NhZ2UobWVzc2FnZTogQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0sIGVtaXQgPSB0cnVlKSB7XG4gICAgaWYgKCEoJ2NvbnRlbnQnIGluIG1lc3NhZ2UpKSBtZXNzYWdlLmNvbnRlbnQgPSBudWxsO1xuXG4gICAgdGhpcy5tZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuXG4gICAgaWYgKGVtaXQpIHtcbiAgICAgIHRoaXMuX2VtaXQoJ21lc3NhZ2UnLCBtZXNzYWdlKTtcbiAgICAgIGlmICgoaXNGdW5jdGlvbk1lc3NhZ2UobWVzc2FnZSkgfHwgaXNUb29sTWVzc2FnZShtZXNzYWdlKSkgJiYgbWVzc2FnZS5jb250ZW50KSB7XG4gICAgICAgIC8vIE5vdGUsIHRoaXMgYXNzdW1lcyB0aGF0IHtyb2xlOiAndG9vbCcsIGNvbnRlbnQ6IFx1MjAyNn0gaXMgYWx3YXlzIHRoZSByZXN1bHQgb2YgYSBjYWxsIG9mIHRvb2wgb2YgdHlwZT1mdW5jdGlvbi5cbiAgICAgICAgdGhpcy5fZW1pdCgnZnVuY3Rpb25DYWxsUmVzdWx0JywgbWVzc2FnZS5jb250ZW50IGFzIHN0cmluZyk7XG4gICAgICB9IGVsc2UgaWYgKGlzQXNzaXN0YW50TWVzc2FnZShtZXNzYWdlKSAmJiBtZXNzYWdlLmZ1bmN0aW9uX2NhbGwpIHtcbiAgICAgICAgdGhpcy5fZW1pdCgnZnVuY3Rpb25DYWxsJywgbWVzc2FnZS5mdW5jdGlvbl9jYWxsKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBc3Npc3RhbnRNZXNzYWdlKG1lc3NhZ2UpICYmIG1lc3NhZ2UudG9vbF9jYWxscykge1xuICAgICAgICBmb3IgKGNvbnN0IHRvb2xfY2FsbCBvZiBtZXNzYWdlLnRvb2xfY2FsbHMpIHtcbiAgICAgICAgICBpZiAodG9vbF9jYWxsLnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXQoJ2Z1bmN0aW9uQ2FsbCcsIHRvb2xfY2FsbC5mdW5jdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9jb25uZWN0ZWQoKSB7XG4gICAgaWYgKHRoaXMuZW5kZWQpIHJldHVybjtcbiAgICB0aGlzLiNyZXNvbHZlQ29ubmVjdGVkUHJvbWlzZSgpO1xuICAgIHRoaXMuX2VtaXQoJ2Nvbm5lY3QnKTtcbiAgfVxuXG4gIGdldCBlbmRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jZW5kZWQ7XG4gIH1cblxuICBnZXQgZXJyb3JlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jZXJyb3JlZDtcbiAgfVxuXG4gIGdldCBhYm9ydGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNhYm9ydGVkO1xuICB9XG5cbiAgYWJvcnQoKSB7XG4gICAgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgbGlzdGVuZXIgZnVuY3Rpb24gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdGVuZXJzIGFycmF5IGZvciB0aGUgZXZlbnQuXG4gICAqIE5vIGNoZWNrcyBhcmUgbWFkZSB0byBzZWUgaWYgdGhlIGxpc3RlbmVyIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQuIE11bHRpcGxlIGNhbGxzIHBhc3NpbmdcbiAgICogdGhlIHNhbWUgY29tYmluYXRpb24gb2YgZXZlbnQgYW5kIGxpc3RlbmVyIHdpbGwgcmVzdWx0IGluIHRoZSBsaXN0ZW5lciBiZWluZyBhZGRlZCwgYW5kXG4gICAqIGNhbGxlZCwgbXVsdGlwbGUgdGltZXMuXG4gICAqIEByZXR1cm5zIHRoaXMgQ2hhdENvbXBsZXRpb25TdHJlYW0sIHNvIHRoYXQgY2FsbHMgY2FuIGJlIGNoYWluZWRcbiAgICovXG4gIG9uPEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogRXZlbnQsIGxpc3RlbmVyOiBMaXN0ZW5lckZvckV2ZW50PEV2ZW50cywgRXZlbnQ+KTogdGhpcyB7XG4gICAgY29uc3QgbGlzdGVuZXJzOiBMaXN0ZW5lcnNGb3JFdmVudDxFdmVudHMsIEV2ZW50PiA9XG4gICAgICB0aGlzLiNsaXN0ZW5lcnNbZXZlbnRdIHx8ICh0aGlzLiNsaXN0ZW5lcnNbZXZlbnRdID0gW10pO1xuICAgIGxpc3RlbmVycy5wdXNoKHsgbGlzdGVuZXIgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIGZyb20gdGhlIGxpc3RlbmVyIGFycmF5IGZvciB0aGUgZXZlbnQuXG4gICAqIG9mZigpIHdpbGwgcmVtb3ZlLCBhdCBtb3N0LCBvbmUgaW5zdGFuY2Ugb2YgYSBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0ZW5lciBhcnJheS4gSWYgYW55IHNpbmdsZVxuICAgKiBsaXN0ZW5lciBoYXMgYmVlbiBhZGRlZCBtdWx0aXBsZSB0aW1lcyB0byB0aGUgbGlzdGVuZXIgYXJyYXkgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQsIHRoZW5cbiAgICogb2ZmKCkgbXVzdCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gcmVtb3ZlIGVhY2ggaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHRoaXMgQ2hhdENvbXBsZXRpb25TdHJlYW0sIHNvIHRoYXQgY2FsbHMgY2FuIGJlIGNoYWluZWRcbiAgICovXG4gIG9mZjxFdmVudCBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEV2ZW50LCBsaXN0ZW5lcjogTGlzdGVuZXJGb3JFdmVudDxFdmVudHMsIEV2ZW50Pik6IHRoaXMge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuI2xpc3RlbmVyc1tldmVudF07XG4gICAgaWYgKCFsaXN0ZW5lcnMpIHJldHVybiB0aGlzO1xuICAgIGNvbnN0IGluZGV4ID0gbGlzdGVuZXJzLmZpbmRJbmRleCgobCkgPT4gbC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpO1xuICAgIGlmIChpbmRleCA+PSAwKSBsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgb25lLXRpbWUgbGlzdGVuZXIgZnVuY3Rpb24gZm9yIHRoZSBldmVudC4gVGhlIG5leHQgdGltZSB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLFxuICAgKiB0aGlzIGxpc3RlbmVyIGlzIHJlbW92ZWQgYW5kIHRoZW4gaW52b2tlZC5cbiAgICogQHJldHVybnMgdGhpcyBDaGF0Q29tcGxldGlvblN0cmVhbSwgc28gdGhhdCBjYWxscyBjYW4gYmUgY2hhaW5lZFxuICAgKi9cbiAgb25jZTxFdmVudCBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEV2ZW50LCBsaXN0ZW5lcjogTGlzdGVuZXJGb3JFdmVudDxFdmVudHMsIEV2ZW50Pik6IHRoaXMge1xuICAgIGNvbnN0IGxpc3RlbmVyczogTGlzdGVuZXJzRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD4gPVxuICAgICAgdGhpcy4jbGlzdGVuZXJzW2V2ZW50XSB8fCAodGhpcy4jbGlzdGVuZXJzW2V2ZW50XSA9IFtdKTtcbiAgICBsaXN0ZW5lcnMucHVzaCh7IGxpc3RlbmVyLCBvbmNlOiB0cnVlIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgc2ltaWxhciB0byBgLm9uY2UoKWAsIGJ1dCByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRoZSBuZXh0IHRpbWVcbiAgICogdGhlIGV2ZW50IGlzIHRyaWdnZXJlZCwgaW5zdGVhZCBvZiBjYWxsaW5nIGEgbGlzdGVuZXIgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRoZSBuZXh0IHRpbWUgZ2l2ZW4gZXZlbnQgaXMgdHJpZ2dlcmVkLFxuICAgKiBvciByZWplY3RzIGlmIGFuIGVycm9yIGlzIGVtaXR0ZWQuICAoSWYgeW91IHJlcXVlc3QgdGhlICdlcnJvcicgZXZlbnQsXG4gICAqIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZXJyb3IpLlxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKlxuICAgKiAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCBzdHJlYW0uZW1pdHRlZCgnbWVzc2FnZScpIC8vIHJlamVjdHMgaWYgdGhlIHN0cmVhbSBlcnJvcnNcbiAgICovXG4gIGVtaXR0ZWQ8RXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KFxuICAgIGV2ZW50OiBFdmVudCxcbiAgKTogUHJvbWlzZTxcbiAgICBFdmVudFBhcmFtZXRlcnM8RXZlbnRzLCBFdmVudD4gZXh0ZW5kcyBbaW5mZXIgUGFyYW1dID8gUGFyYW1cbiAgICA6IEV2ZW50UGFyYW1ldGVyczxFdmVudHMsIEV2ZW50PiBleHRlbmRzIFtdID8gdm9pZFxuICAgIDogRXZlbnRQYXJhbWV0ZXJzPEV2ZW50cywgRXZlbnQ+XG4gID4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLiNjYXRjaGluZ1Byb21pc2VDcmVhdGVkID0gdHJ1ZTtcbiAgICAgIGlmIChldmVudCAhPT0gJ2Vycm9yJykgdGhpcy5vbmNlKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICB0aGlzLm9uY2UoZXZlbnQsIHJlc29sdmUgYXMgYW55KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRvbmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy4jY2F0Y2hpbmdQcm9taXNlQ3JlYXRlZCA9IHRydWU7XG4gICAgYXdhaXQgdGhpcy4jZW5kUHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBmaW5hbCBDaGF0Q29tcGxldGlvbiwgb3IgcmVqZWN0c1xuICAgKiBpZiBhbiBlcnJvciBvY2N1cnJlZCBvciB0aGUgc3RyZWFtIGVuZGVkIHByZW1hdHVyZWx5IHdpdGhvdXQgcHJvZHVjaW5nIGEgQ2hhdENvbXBsZXRpb24uXG4gICAqL1xuICBhc3luYyBmaW5hbENoYXRDb21wbGV0aW9uKCk6IFByb21pc2U8Q2hhdENvbXBsZXRpb24+IHtcbiAgICBhd2FpdCB0aGlzLmRvbmUoKTtcbiAgICBjb25zdCBjb21wbGV0aW9uID0gdGhpcy5fY2hhdENvbXBsZXRpb25zW3RoaXMuX2NoYXRDb21wbGV0aW9ucy5sZW5ndGggLSAxXTtcbiAgICBpZiAoIWNvbXBsZXRpb24pIHRocm93IG5ldyBPcGVuQUlFcnJvcignc3RyZWFtIGVuZGVkIHdpdGhvdXQgcHJvZHVjaW5nIGEgQ2hhdENvbXBsZXRpb24nKTtcbiAgICByZXR1cm4gY29tcGxldGlvbjtcbiAgfVxuXG4gICNnZXRGaW5hbENvbnRlbnQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuI2dldEZpbmFsTWVzc2FnZSgpLmNvbnRlbnQgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSBmaW5hbCBDaGF0Q29tcGxldGlvbk1lc3NhZ2UsIG9yIHJlamVjdHNcbiAgICogaWYgYW4gZXJyb3Igb2NjdXJyZWQgb3IgdGhlIHN0cmVhbSBlbmRlZCBwcmVtYXR1cmVseSB3aXRob3V0IHByb2R1Y2luZyBhIENoYXRDb21wbGV0aW9uTWVzc2FnZS5cbiAgICovXG4gIGFzeW5jIGZpbmFsQ29udGVudCgpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBhd2FpdCB0aGlzLmRvbmUoKTtcbiAgICByZXR1cm4gdGhpcy4jZ2V0RmluYWxDb250ZW50KCk7XG4gIH1cblxuICAjZ2V0RmluYWxNZXNzYWdlKCk6IENoYXRDb21wbGV0aW9uTWVzc2FnZSB7XG4gICAgbGV0IGkgPSB0aGlzLm1lc3NhZ2VzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMubWVzc2FnZXNbaV07XG4gICAgICBpZiAoaXNBc3Npc3RhbnRNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVybiB7IC4uLm1lc3NhZ2UsIGNvbnRlbnQ6IG1lc3NhZ2UuY29udGVudCA/PyBudWxsIH07XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcignc3RyZWFtIGVuZGVkIHdpdGhvdXQgcHJvZHVjaW5nIGEgQ2hhdENvbXBsZXRpb25NZXNzYWdlIHdpdGggcm9sZT1hc3Npc3RhbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0aGUgZmluYWwgYXNzaXN0YW50IENoYXRDb21wbGV0aW9uTWVzc2FnZSByZXNwb25zZSxcbiAgICogb3IgcmVqZWN0cyBpZiBhbiBlcnJvciBvY2N1cnJlZCBvciB0aGUgc3RyZWFtIGVuZGVkIHByZW1hdHVyZWx5IHdpdGhvdXQgcHJvZHVjaW5nIGEgQ2hhdENvbXBsZXRpb25NZXNzYWdlLlxuICAgKi9cbiAgYXN5bmMgZmluYWxNZXNzYWdlKCk6IFByb21pc2U8Q2hhdENvbXBsZXRpb25NZXNzYWdlPiB7XG4gICAgYXdhaXQgdGhpcy5kb25lKCk7XG4gICAgcmV0dXJuIHRoaXMuI2dldEZpbmFsTWVzc2FnZSgpO1xuICB9XG5cbiAgI2dldEZpbmFsRnVuY3Rpb25DYWxsKCk6IENoYXRDb21wbGV0aW9uTWVzc2FnZS5GdW5jdGlvbkNhbGwgfCB1bmRlZmluZWQge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLm1lc3NhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1tpXTtcbiAgICAgIGlmIChpc0Fzc2lzdGFudE1lc3NhZ2UobWVzc2FnZSkgJiYgbWVzc2FnZT8uZnVuY3Rpb25fY2FsbCkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZS5mdW5jdGlvbl9jYWxsO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXNzaXN0YW50TWVzc2FnZShtZXNzYWdlKSAmJiBtZXNzYWdlPy50b29sX2NhbGxzPy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2UudG9vbF9jYWxscy5hdCgtMSk/LmZ1bmN0aW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSBmaW5hbCBGdW5jdGlvbkNhbGwsIG9yIHJlamVjdHNcbiAgICogaWYgYW4gZXJyb3Igb2NjdXJyZWQgb3IgdGhlIHN0cmVhbSBlbmRlZCBwcmVtYXR1cmVseSB3aXRob3V0IHByb2R1Y2luZyBhIENoYXRDb21wbGV0aW9uTWVzc2FnZS5cbiAgICovXG4gIGFzeW5jIGZpbmFsRnVuY3Rpb25DYWxsKCk6IFByb21pc2U8Q2hhdENvbXBsZXRpb25NZXNzYWdlLkZ1bmN0aW9uQ2FsbCB8IHVuZGVmaW5lZD4ge1xuICAgIGF3YWl0IHRoaXMuZG9uZSgpO1xuICAgIHJldHVybiB0aGlzLiNnZXRGaW5hbEZ1bmN0aW9uQ2FsbCgpO1xuICB9XG5cbiAgI2dldEZpbmFsRnVuY3Rpb25DYWxsUmVzdWx0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMubWVzc2FnZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzW2ldO1xuICAgICAgaWYgKGlzRnVuY3Rpb25NZXNzYWdlKG1lc3NhZ2UpICYmIG1lc3NhZ2UuY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlLmNvbnRlbnQ7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGlzVG9vbE1lc3NhZ2UobWVzc2FnZSkgJiZcbiAgICAgICAgbWVzc2FnZS5jb250ZW50ICE9IG51bGwgJiZcbiAgICAgICAgdGhpcy5tZXNzYWdlcy5zb21lKFxuICAgICAgICAgICh4KSA9PlxuICAgICAgICAgICAgeC5yb2xlID09PSAnYXNzaXN0YW50JyAmJlxuICAgICAgICAgICAgeC50b29sX2NhbGxzPy5zb21lKCh5KSA9PiB5LnR5cGUgPT09ICdmdW5jdGlvbicgJiYgeS5pZCA9PT0gbWVzc2FnZS50b29sX2NhbGxfaWQpLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2UuY29udGVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBhc3luYyBmaW5hbEZ1bmN0aW9uQ2FsbFJlc3VsdCgpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGF3YWl0IHRoaXMuZG9uZSgpO1xuICAgIHJldHVybiB0aGlzLiNnZXRGaW5hbEZ1bmN0aW9uQ2FsbFJlc3VsdCgpO1xuICB9XG5cbiAgI2NhbGN1bGF0ZVRvdGFsVXNhZ2UoKTogQ29tcGxldGlvblVzYWdlIHtcbiAgICBjb25zdCB0b3RhbDogQ29tcGxldGlvblVzYWdlID0ge1xuICAgICAgY29tcGxldGlvbl90b2tlbnM6IDAsXG4gICAgICBwcm9tcHRfdG9rZW5zOiAwLFxuICAgICAgdG90YWxfdG9rZW5zOiAwLFxuICAgIH07XG4gICAgZm9yIChjb25zdCB7IHVzYWdlIH0gb2YgdGhpcy5fY2hhdENvbXBsZXRpb25zKSB7XG4gICAgICBpZiAodXNhZ2UpIHtcbiAgICAgICAgdG90YWwuY29tcGxldGlvbl90b2tlbnMgKz0gdXNhZ2UuY29tcGxldGlvbl90b2tlbnM7XG4gICAgICAgIHRvdGFsLnByb21wdF90b2tlbnMgKz0gdXNhZ2UucHJvbXB0X3Rva2VucztcbiAgICAgICAgdG90YWwudG90YWxfdG9rZW5zICs9IHVzYWdlLnRvdGFsX3Rva2VucztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvdGFsO1xuICB9XG5cbiAgYXN5bmMgdG90YWxVc2FnZSgpOiBQcm9taXNlPENvbXBsZXRpb25Vc2FnZT4ge1xuICAgIGF3YWl0IHRoaXMuZG9uZSgpO1xuICAgIHJldHVybiB0aGlzLiNjYWxjdWxhdGVUb3RhbFVzYWdlKCk7XG4gIH1cblxuICBhbGxDaGF0Q29tcGxldGlvbnMoKTogQ2hhdENvbXBsZXRpb25bXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9jaGF0Q29tcGxldGlvbnNdO1xuICB9XG5cbiAgI2hhbmRsZUVycm9yID0gKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgdGhpcy4jZXJyb3JlZCA9IHRydWU7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICBlcnJvciA9IG5ldyBBUElVc2VyQWJvcnRFcnJvcigpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBUElVc2VyQWJvcnRFcnJvcikge1xuICAgICAgdGhpcy4jYWJvcnRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcy5fZW1pdCgnYWJvcnQnLCBlcnJvcik7XG4gICAgfVxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE9wZW5BSUVycm9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgfVxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zdCBvcGVuQUlFcnJvcjogT3BlbkFJRXJyb3IgPSBuZXcgT3BlbkFJRXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBvcGVuQUlFcnJvci5jYXVzZSA9IGVycm9yO1xuICAgICAgcmV0dXJuIHRoaXMuX2VtaXQoJ2Vycm9yJywgb3BlbkFJRXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZW1pdCgnZXJyb3InLCBuZXcgT3BlbkFJRXJyb3IoU3RyaW5nKGVycm9yKSkpO1xuICB9O1xuXG4gIHByb3RlY3RlZCBfZW1pdDxFdmVudCBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEV2ZW50LCAuLi5hcmdzOiBFdmVudFBhcmFtZXRlcnM8RXZlbnRzLCBFdmVudD4pIHtcbiAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3QgZW1pdCBhbnkgZXZlbnRzIGFmdGVyIGVuZFxuICAgIGlmICh0aGlzLiNlbmRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudCA9PT0gJ2VuZCcpIHtcbiAgICAgIHRoaXMuI2VuZGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuI3Jlc29sdmVFbmRQcm9taXNlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdGVuZXJzOiBMaXN0ZW5lcnNGb3JFdmVudDxFdmVudHMsIEV2ZW50PiB8IHVuZGVmaW5lZCA9IHRoaXMuI2xpc3RlbmVyc1tldmVudF07XG4gICAgaWYgKGxpc3RlbmVycykge1xuICAgICAgdGhpcy4jbGlzdGVuZXJzW2V2ZW50XSA9IGxpc3RlbmVycy5maWx0ZXIoKGwpID0+ICFsLm9uY2UpIGFzIGFueTtcbiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKCh7IGxpc3RlbmVyIH06IGFueSkgPT4gbGlzdGVuZXIoLi4uYXJncykpO1xuICAgIH1cblxuICAgIGlmIChldmVudCA9PT0gJ2Fib3J0Jykge1xuICAgICAgY29uc3QgZXJyb3IgPSBhcmdzWzBdIGFzIEFQSVVzZXJBYm9ydEVycm9yO1xuICAgICAgaWYgKCF0aGlzLiNjYXRjaGluZ1Byb21pc2VDcmVhdGVkICYmICFsaXN0ZW5lcnM/Lmxlbmd0aCkge1xuICAgICAgICBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgICB0aGlzLiNyZWplY3RDb25uZWN0ZWRQcm9taXNlKGVycm9yKTtcbiAgICAgIHRoaXMuI3JlamVjdEVuZFByb21pc2UoZXJyb3IpO1xuICAgICAgdGhpcy5fZW1pdCgnZW5kJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50ID09PSAnZXJyb3InKSB7XG4gICAgICAvLyBOT1RFOiBfZW1pdCgnZXJyb3InLCBlcnJvcikgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gI2hhbmRsZUVycm9yKCkuXG5cbiAgICAgIGNvbnN0IGVycm9yID0gYXJnc1swXSBhcyBPcGVuQUlFcnJvcjtcbiAgICAgIGlmICghdGhpcy4jY2F0Y2hpbmdQcm9taXNlQ3JlYXRlZCAmJiAhbGlzdGVuZXJzPy5sZW5ndGgpIHtcbiAgICAgICAgLy8gVHJpZ2dlciBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGlmIHRoZSB1c2VyIGhhc24ndCByZWdpc3RlcmVkIGFueSBlcnJvciBoYW5kbGVycy5cbiAgICAgICAgLy8gSWYgeW91IGFyZSBzZWVpbmcgc3RhY2sgdHJhY2VzIGhlcmUsIG1ha2Ugc3VyZSB0byBoYW5kbGUgZXJyb3JzIHZpYSBlaXRoZXI6XG4gICAgICAgIC8vIC0gcnVubmVyLm9uKCdlcnJvcicsICgpID0+IC4uLilcbiAgICAgICAgLy8gLSBhd2FpdCBydW5uZXIuZG9uZSgpXG4gICAgICAgIC8vIC0gYXdhaXQgcnVubmVyLmZpbmFsQ2hhdENvbXBsZXRpb24oKVxuICAgICAgICAvLyAtIGV0Yy5cbiAgICAgICAgUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgICAgdGhpcy4jcmVqZWN0Q29ubmVjdGVkUHJvbWlzZShlcnJvcik7XG4gICAgICB0aGlzLiNyZWplY3RFbmRQcm9taXNlKGVycm9yKTtcbiAgICAgIHRoaXMuX2VtaXQoJ2VuZCcpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfZW1pdEZpbmFsKCkge1xuICAgIGNvbnN0IGNvbXBsZXRpb24gPSB0aGlzLl9jaGF0Q29tcGxldGlvbnNbdGhpcy5fY2hhdENvbXBsZXRpb25zLmxlbmd0aCAtIDFdO1xuICAgIGlmIChjb21wbGV0aW9uKSB0aGlzLl9lbWl0KCdmaW5hbENoYXRDb21wbGV0aW9uJywgY29tcGxldGlvbik7XG4gICAgY29uc3QgZmluYWxNZXNzYWdlID0gdGhpcy4jZ2V0RmluYWxNZXNzYWdlKCk7XG4gICAgaWYgKGZpbmFsTWVzc2FnZSkgdGhpcy5fZW1pdCgnZmluYWxNZXNzYWdlJywgZmluYWxNZXNzYWdlKTtcbiAgICBjb25zdCBmaW5hbENvbnRlbnQgPSB0aGlzLiNnZXRGaW5hbENvbnRlbnQoKTtcbiAgICBpZiAoZmluYWxDb250ZW50KSB0aGlzLl9lbWl0KCdmaW5hbENvbnRlbnQnLCBmaW5hbENvbnRlbnQpO1xuXG4gICAgY29uc3QgZmluYWxGdW5jdGlvbkNhbGwgPSB0aGlzLiNnZXRGaW5hbEZ1bmN0aW9uQ2FsbCgpO1xuICAgIGlmIChmaW5hbEZ1bmN0aW9uQ2FsbCkgdGhpcy5fZW1pdCgnZmluYWxGdW5jdGlvbkNhbGwnLCBmaW5hbEZ1bmN0aW9uQ2FsbCk7XG5cbiAgICBjb25zdCBmaW5hbEZ1bmN0aW9uQ2FsbFJlc3VsdCA9IHRoaXMuI2dldEZpbmFsRnVuY3Rpb25DYWxsUmVzdWx0KCk7XG4gICAgaWYgKGZpbmFsRnVuY3Rpb25DYWxsUmVzdWx0ICE9IG51bGwpIHRoaXMuX2VtaXQoJ2ZpbmFsRnVuY3Rpb25DYWxsUmVzdWx0JywgZmluYWxGdW5jdGlvbkNhbGxSZXN1bHQpO1xuXG4gICAgaWYgKHRoaXMuX2NoYXRDb21wbGV0aW9ucy5zb21lKChjKSA9PiBjLnVzYWdlKSkge1xuICAgICAgdGhpcy5fZW1pdCgndG90YWxVc2FnZScsIHRoaXMuI2NhbGN1bGF0ZVRvdGFsVXNhZ2UoKSk7XG4gICAgfVxuICB9XG5cbiAgI3ZhbGlkYXRlUGFyYW1zKHBhcmFtczogQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMpOiB2b2lkIHtcbiAgICBpZiAocGFyYW1zLm4gIT0gbnVsbCAmJiBwYXJhbXMubiA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihcbiAgICAgICAgJ0NoYXRDb21wbGV0aW9uIGNvbnZlbmllbmNlIGhlbHBlcnMgb25seSBzdXBwb3J0IG49MSBhdCB0aGlzIHRpbWUuIFRvIHVzZSBuPjEsIHBsZWFzZSB1c2UgY2hhdC5jb21wbGV0aW9ucy5jcmVhdGUoKSBkaXJlY3RseS4nLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgX2NyZWF0ZUNoYXRDb21wbGV0aW9uKFxuICAgIGNvbXBsZXRpb25zOiBDb21wbGV0aW9ucyxcbiAgICBwYXJhbXM6IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPENoYXRDb21wbGV0aW9uPiB7XG4gICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgfVxuICAgIHRoaXMuI3ZhbGlkYXRlUGFyYW1zKHBhcmFtcyk7XG5cbiAgICBjb25zdCBjaGF0Q29tcGxldGlvbiA9IGF3YWl0IGNvbXBsZXRpb25zLmNyZWF0ZShcbiAgICAgIHsgLi4ucGFyYW1zLCBzdHJlYW06IGZhbHNlIH0sXG4gICAgICB7IC4uLm9wdGlvbnMsIHNpZ25hbDogdGhpcy5jb250cm9sbGVyLnNpZ25hbCB9LFxuICAgICk7XG4gICAgdGhpcy5fY29ubmVjdGVkKCk7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoYXRDb21wbGV0aW9uKGNoYXRDb21wbGV0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBfcnVuQ2hhdENvbXBsZXRpb24oXG4gICAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zLFxuICAgIHBhcmFtczogQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8Q2hhdENvbXBsZXRpb24+IHtcbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgcGFyYW1zLm1lc3NhZ2VzKSB7XG4gICAgICB0aGlzLl9hZGRNZXNzYWdlKG1lc3NhZ2UsIGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NyZWF0ZUNoYXRDb21wbGV0aW9uKGNvbXBsZXRpb25zLCBwYXJhbXMsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIF9ydW5GdW5jdGlvbnM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPihcbiAgICBjb21wbGV0aW9uczogQ29tcGxldGlvbnMsXG4gICAgcGFyYW1zOlxuICAgICAgfCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+XG4gICAgICB8IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nRnVuY3Rpb25SdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz4sXG4gICAgb3B0aW9ucz86IFJ1bm5lck9wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHJvbGUgPSAnZnVuY3Rpb24nIGFzIGNvbnN0O1xuICAgIGNvbnN0IHsgZnVuY3Rpb25fY2FsbCA9ICdhdXRvJywgc3RyZWFtLCAuLi5yZXN0UGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3Qgc2luZ2xlRnVuY3Rpb25Ub0NhbGwgPSB0eXBlb2YgZnVuY3Rpb25fY2FsbCAhPT0gJ3N0cmluZycgJiYgZnVuY3Rpb25fY2FsbD8ubmFtZTtcbiAgICBjb25zdCB7IG1heENoYXRDb21wbGV0aW9ucyA9IERFRkFVTFRfTUFYX0NIQVRfQ09NUExFVElPTlMgfSA9IG9wdGlvbnMgfHwge307XG5cbiAgICBjb25zdCBmdW5jdGlvbnNCeU5hbWU6IFJlY29yZDxzdHJpbmcsIFJ1bm5hYmxlRnVuY3Rpb248YW55Pj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGYgb2YgcGFyYW1zLmZ1bmN0aW9ucykge1xuICAgICAgZnVuY3Rpb25zQnlOYW1lW2YubmFtZSB8fCBmLmZ1bmN0aW9uLm5hbWVdID0gZjtcbiAgICB9XG5cbiAgICBjb25zdCBmdW5jdGlvbnM6IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLkZ1bmN0aW9uW10gPSBwYXJhbXMuZnVuY3Rpb25zLm1hcChcbiAgICAgIChmKTogQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMuRnVuY3Rpb24gPT4gKHtcbiAgICAgICAgbmFtZTogZi5uYW1lIHx8IGYuZnVuY3Rpb24ubmFtZSxcbiAgICAgICAgcGFyYW1ldGVyczogZi5wYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBkZXNjcmlwdGlvbjogZi5kZXNjcmlwdGlvbixcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgcGFyYW1zLm1lc3NhZ2VzKSB7XG4gICAgICB0aGlzLl9hZGRNZXNzYWdlKG1lc3NhZ2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heENoYXRDb21wbGV0aW9uczsgKytpKSB7XG4gICAgICBjb25zdCBjaGF0Q29tcGxldGlvbjogQ2hhdENvbXBsZXRpb24gPSBhd2FpdCB0aGlzLl9jcmVhdGVDaGF0Q29tcGxldGlvbihcbiAgICAgICAgY29tcGxldGlvbnMsXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5yZXN0UGFyYW1zLFxuICAgICAgICAgIGZ1bmN0aW9uX2NhbGwsXG4gICAgICAgICAgZnVuY3Rpb25zLFxuICAgICAgICAgIG1lc3NhZ2VzOiBbLi4udGhpcy5tZXNzYWdlc10sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGNoYXRDb21wbGV0aW9uLmNob2ljZXNbMF0/Lm1lc3NhZ2U7XG4gICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGBtaXNzaW5nIG1lc3NhZ2UgaW4gQ2hhdENvbXBsZXRpb24gcmVzcG9uc2VgKTtcbiAgICAgIH1cbiAgICAgIGlmICghbWVzc2FnZS5mdW5jdGlvbl9jYWxsKSByZXR1cm47XG4gICAgICBjb25zdCB7IG5hbWUsIGFyZ3VtZW50czogYXJncyB9ID0gbWVzc2FnZS5mdW5jdGlvbl9jYWxsO1xuICAgICAgY29uc3QgZm4gPSBmdW5jdGlvbnNCeU5hbWVbbmFtZV07XG4gICAgICBpZiAoIWZuKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBgSW52YWxpZCBmdW5jdGlvbl9jYWxsOiAke0pTT04uc3RyaW5naWZ5KG5hbWUpfS4gQXZhaWxhYmxlIG9wdGlvbnMgYXJlOiAke2Z1bmN0aW9uc1xuICAgICAgICAgIC5tYXAoKGYpID0+IEpTT04uc3RyaW5naWZ5KGYubmFtZSkpXG4gICAgICAgICAgLmpvaW4oJywgJyl9LiBQbGVhc2UgdHJ5IGFnYWluYDtcblxuICAgICAgICB0aGlzLl9hZGRNZXNzYWdlKHsgcm9sZSwgbmFtZSwgY29udGVudCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKHNpbmdsZUZ1bmN0aW9uVG9DYWxsICYmIHNpbmdsZUZ1bmN0aW9uVG9DYWxsICE9PSBuYW1lKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBgSW52YWxpZCBmdW5jdGlvbl9jYWxsOiAke0pTT04uc3RyaW5naWZ5KG5hbWUpfS4gJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBzaW5nbGVGdW5jdGlvblRvQ2FsbCxcbiAgICAgICAgKX0gcmVxdWVzdGVkLiBQbGVhc2UgdHJ5IGFnYWluYDtcblxuICAgICAgICB0aGlzLl9hZGRNZXNzYWdlKHsgcm9sZSwgbmFtZSwgY29udGVudCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBwYXJzZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZWQgPSBpc1J1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2UoZm4pID8gYXdhaXQgZm4ucGFyc2UoYXJncykgOiBhcmdzO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fYWRkTWVzc2FnZSh7XG4gICAgICAgICAgcm9sZSxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGNvbnRlbnQ6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGl0IGNhbid0IHJ1bGUgb3V0IGBuZXZlcmAgdHlwZS5cbiAgICAgIGNvbnN0IHJhd0NvbnRlbnQgPSBhd2FpdCBmbi5mdW5jdGlvbihwYXJzZWQsIHRoaXMpO1xuICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuI3N0cmluZ2lmeUZ1bmN0aW9uQ2FsbFJlc3VsdChyYXdDb250ZW50KTtcblxuICAgICAgdGhpcy5fYWRkTWVzc2FnZSh7IHJvbGUsIG5hbWUsIGNvbnRlbnQgfSk7XG5cbiAgICAgIGlmIChzaW5nbGVGdW5jdGlvblRvQ2FsbCkgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBfcnVuVG9vbHM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPihcbiAgICBjb21wbGV0aW9uczogQ29tcGxldGlvbnMsXG4gICAgcGFyYW1zOlxuICAgICAgfCBDaGF0Q29tcGxldGlvblRvb2xSdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz5cbiAgICAgIHwgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdUb29sUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+LFxuICAgIG9wdGlvbnM/OiBSdW5uZXJPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCByb2xlID0gJ3Rvb2wnIGFzIGNvbnN0O1xuICAgIGNvbnN0IHsgdG9vbF9jaG9pY2UgPSAnYXV0bycsIHN0cmVhbSwgLi4ucmVzdFBhcmFtcyB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHNpbmdsZUZ1bmN0aW9uVG9DYWxsID0gdHlwZW9mIHRvb2xfY2hvaWNlICE9PSAnc3RyaW5nJyAmJiB0b29sX2Nob2ljZT8uZnVuY3Rpb24/Lm5hbWU7XG4gICAgY29uc3QgeyBtYXhDaGF0Q29tcGxldGlvbnMgPSBERUZBVUxUX01BWF9DSEFUX0NPTVBMRVRJT05TIH0gPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgY29uc3QgZnVuY3Rpb25zQnlOYW1lOiBSZWNvcmQ8c3RyaW5nLCBSdW5uYWJsZUZ1bmN0aW9uPGFueT4+ID0ge307XG4gICAgZm9yIChjb25zdCBmIG9mIHBhcmFtcy50b29scykge1xuICAgICAgaWYgKGYudHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmdW5jdGlvbnNCeU5hbWVbZi5mdW5jdGlvbi5uYW1lIHx8IGYuZnVuY3Rpb24uZnVuY3Rpb24ubmFtZV0gPSBmLmZ1bmN0aW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRvb2xzOiBDaGF0Q29tcGxldGlvblRvb2xbXSA9XG4gICAgICAndG9vbHMnIGluIHBhcmFtcyA/XG4gICAgICAgIHBhcmFtcy50b29scy5tYXAoKHQpID0+XG4gICAgICAgICAgdC50eXBlID09PSAnZnVuY3Rpb24nID9cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgICAgZnVuY3Rpb246IHtcbiAgICAgICAgICAgICAgICBuYW1lOiB0LmZ1bmN0aW9uLm5hbWUgfHwgdC5mdW5jdGlvbi5mdW5jdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHQuZnVuY3Rpb24ucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdC5mdW5jdGlvbi5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6ICh0IGFzIHVua25vd24gYXMgQ2hhdENvbXBsZXRpb25Ub29sKSxcbiAgICAgICAgKVxuICAgICAgOiAodW5kZWZpbmVkIGFzIGFueSk7XG5cbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgcGFyYW1zLm1lc3NhZ2VzKSB7XG4gICAgICB0aGlzLl9hZGRNZXNzYWdlKG1lc3NhZ2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heENoYXRDb21wbGV0aW9uczsgKytpKSB7XG4gICAgICBjb25zdCBjaGF0Q29tcGxldGlvbjogQ2hhdENvbXBsZXRpb24gPSBhd2FpdCB0aGlzLl9jcmVhdGVDaGF0Q29tcGxldGlvbihcbiAgICAgICAgY29tcGxldGlvbnMsXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5yZXN0UGFyYW1zLFxuICAgICAgICAgIHRvb2xfY2hvaWNlLFxuICAgICAgICAgIHRvb2xzLFxuICAgICAgICAgIG1lc3NhZ2VzOiBbLi4udGhpcy5tZXNzYWdlc10sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGNoYXRDb21wbGV0aW9uLmNob2ljZXNbMF0/Lm1lc3NhZ2U7XG4gICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGBtaXNzaW5nIG1lc3NhZ2UgaW4gQ2hhdENvbXBsZXRpb24gcmVzcG9uc2VgKTtcbiAgICAgIH1cbiAgICAgIGlmICghbWVzc2FnZS50b29sX2NhbGxzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCB0b29sX2NhbGwgb2YgbWVzc2FnZS50b29sX2NhbGxzKSB7XG4gICAgICAgIGlmICh0b29sX2NhbGwudHlwZSAhPT0gJ2Z1bmN0aW9uJykgY29udGludWU7XG4gICAgICAgIGNvbnN0IHRvb2xfY2FsbF9pZCA9IHRvb2xfY2FsbC5pZDtcbiAgICAgICAgY29uc3QgeyBuYW1lLCBhcmd1bWVudHM6IGFyZ3MgfSA9IHRvb2xfY2FsbC5mdW5jdGlvbjtcbiAgICAgICAgY29uc3QgZm4gPSBmdW5jdGlvbnNCeU5hbWVbbmFtZV07XG5cbiAgICAgICAgaWYgKCFmbikge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBgSW52YWxpZCB0b29sX2NhbGw6ICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9LiBBdmFpbGFibGUgb3B0aW9ucyBhcmU6ICR7dG9vbHNcbiAgICAgICAgICAgIC5tYXAoKGYpID0+IEpTT04uc3RyaW5naWZ5KGYuZnVuY3Rpb24ubmFtZSkpXG4gICAgICAgICAgICAuam9pbignLCAnKX0uIFBsZWFzZSB0cnkgYWdhaW5gO1xuXG4gICAgICAgICAgdGhpcy5fYWRkTWVzc2FnZSh7IHJvbGUsIHRvb2xfY2FsbF9pZCwgY29udGVudCB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmIChzaW5nbGVGdW5jdGlvblRvQ2FsbCAmJiBzaW5nbGVGdW5jdGlvblRvQ2FsbCAhPT0gbmFtZSkge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBgSW52YWxpZCB0b29sX2NhbGw6ICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9LiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgc2luZ2xlRnVuY3Rpb25Ub0NhbGwsXG4gICAgICAgICAgKX0gcmVxdWVzdGVkLiBQbGVhc2UgdHJ5IGFnYWluYDtcblxuICAgICAgICAgIHRoaXMuX2FkZE1lc3NhZ2UoeyByb2xlLCB0b29sX2NhbGxfaWQsIGNvbnRlbnQgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyc2VkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcnNlZCA9IGlzUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZShmbikgPyBhd2FpdCBmbi5wYXJzZShhcmdzKSA6IGFyZ3M7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgICB0aGlzLl9hZGRNZXNzYWdlKHsgcm9sZSwgdG9vbF9jYWxsX2lkLCBjb250ZW50IH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpdCBjYW4ndCBydWxlIG91dCBgbmV2ZXJgIHR5cGUuXG4gICAgICAgIGNvbnN0IHJhd0NvbnRlbnQgPSBhd2FpdCBmbi5mdW5jdGlvbihwYXJzZWQsIHRoaXMpO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy4jc3RyaW5naWZ5RnVuY3Rpb25DYWxsUmVzdWx0KHJhd0NvbnRlbnQpO1xuICAgICAgICB0aGlzLl9hZGRNZXNzYWdlKHsgcm9sZSwgdG9vbF9jYWxsX2lkLCBjb250ZW50IH0pO1xuXG4gICAgICAgIGlmIChzaW5nbGVGdW5jdGlvblRvQ2FsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gICNzdHJpbmdpZnlGdW5jdGlvbkNhbGxSZXN1bHQocmF3Q29udGVudDogdW5rbm93bik6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiByYXdDb250ZW50ID09PSAnc3RyaW5nJyA/IHJhd0NvbnRlbnRcbiAgICAgIDogcmF3Q29udGVudCA9PT0gdW5kZWZpbmVkID8gJ3VuZGVmaW5lZCdcbiAgICAgIDogSlNPTi5zdHJpbmdpZnkocmF3Q29udGVudClcbiAgICApO1xuICB9XG59XG5cbnR5cGUgQ3VzdG9tRXZlbnRzPEV2ZW50IGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgW2sgaW4gRXZlbnRdOiBrIGV4dGVuZHMga2V5b2YgQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lckV2ZW50cyA/IEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHNba11cbiAgOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG59O1xuXG50eXBlIExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzIGV4dGVuZHMgQ3VzdG9tRXZlbnRzPGFueT4sIEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPiA9IEV2ZW50IGV4dGVuZHMgKFxuICBrZXlvZiBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyRXZlbnRzXG4pID9cbiAgQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lckV2ZW50c1tFdmVudF1cbjogRXZlbnRzW0V2ZW50XTtcblxudHlwZSBMaXN0ZW5lcnNGb3JFdmVudDxFdmVudHMgZXh0ZW5kcyBDdXN0b21FdmVudHM8YW55PiwgRXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+ID0gQXJyYXk8e1xuICBsaXN0ZW5lcjogTGlzdGVuZXJGb3JFdmVudDxFdmVudHMsIEV2ZW50PjtcbiAgb25jZT86IGJvb2xlYW47XG59PjtcbnR5cGUgRXZlbnRQYXJhbWV0ZXJzPEV2ZW50cyBleHRlbmRzIEN1c3RvbUV2ZW50czxhbnk+LCBFdmVudCBleHRlbmRzIGtleW9mIEV2ZW50cz4gPSBQYXJhbWV0ZXJzPFxuICBMaXN0ZW5lckZvckV2ZW50PEV2ZW50cywgRXZlbnQ+XG4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHMge1xuICBjb25uZWN0OiAoKSA9PiB2b2lkO1xuICBmdW5jdGlvbkNhbGw6IChmdW5jdGlvbkNhbGw6IENoYXRDb21wbGV0aW9uTWVzc2FnZS5GdW5jdGlvbkNhbGwpID0+IHZvaWQ7XG4gIG1lc3NhZ2U6IChtZXNzYWdlOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSkgPT4gdm9pZDtcbiAgY2hhdENvbXBsZXRpb246IChjb21wbGV0aW9uOiBDaGF0Q29tcGxldGlvbikgPT4gdm9pZDtcbiAgZmluYWxDb250ZW50OiAoY29udGVudFNuYXBzaG90OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGZpbmFsTWVzc2FnZTogKG1lc3NhZ2U6IENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtKSA9PiB2b2lkO1xuICBmaW5hbENoYXRDb21wbGV0aW9uOiAoY29tcGxldGlvbjogQ2hhdENvbXBsZXRpb24pID0+IHZvaWQ7XG4gIGZpbmFsRnVuY3Rpb25DYWxsOiAoZnVuY3Rpb25DYWxsOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2UuRnVuY3Rpb25DYWxsKSA9PiB2b2lkO1xuICBmdW5jdGlvbkNhbGxSZXN1bHQ6IChjb250ZW50OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGZpbmFsRnVuY3Rpb25DYWxsUmVzdWx0OiAoY29udGVudDogc3RyaW5nKSA9PiB2b2lkO1xuICBlcnJvcjogKGVycm9yOiBPcGVuQUlFcnJvcikgPT4gdm9pZDtcbiAgYWJvcnQ6IChlcnJvcjogQVBJVXNlckFib3J0RXJyb3IpID0+IHZvaWQ7XG4gIGVuZDogKCkgPT4gdm9pZDtcbiAgdG90YWxVc2FnZTogKHVzYWdlOiBDb21wbGV0aW9uVXNhZ2UpID0+IHZvaWQ7XG59XG4iLCAiaW1wb3J0IHtcbiAgdHlwZSBDb21wbGV0aW9ucyxcbiAgdHlwZSBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSxcbiAgdHlwZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyxcbn0gZnJvbSBcIi4uL3Jlc291cmNlcy9jaGF0L2NvbXBsZXRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIFJ1bm5hYmxlRnVuY3Rpb25zLCB0eXBlIEJhc2VGdW5jdGlvbnNBcmdzLCBSdW5uYWJsZVRvb2xzIH0gZnJvbSAnLi9SdW5uYWJsZUZ1bmN0aW9uJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXIsXG4gIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHMsXG4gIFJ1bm5lck9wdGlvbnMsXG59IGZyb20gJy4vQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lcic7XG5pbXBvcnQgeyBpc0Fzc2lzdGFudE1lc3NhZ2UgfSBmcm9tICcuL2NoYXRDb21wbGV0aW9uVXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uUnVubmVyRXZlbnRzIGV4dGVuZHMgQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lckV2ZW50cyB7XG4gIGNvbnRlbnQ6IChjb250ZW50OiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIENoYXRDb21wbGV0aW9uRnVuY3Rpb25SdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPiA9IE9taXQ8XG4gIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nLFxuICAnZnVuY3Rpb25zJ1xuPiAmIHtcbiAgZnVuY3Rpb25zOiBSdW5uYWJsZUZ1bmN0aW9uczxGdW5jdGlvbnNBcmdzPjtcbn07XG5cbmV4cG9ydCB0eXBlIENoYXRDb21wbGV0aW9uVG9vbFJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzIGV4dGVuZHMgQmFzZUZ1bmN0aW9uc0FyZ3M+ID0gT21pdDxcbiAgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcsXG4gICd0b29scydcbj4gJiB7XG4gIHRvb2xzOiBSdW5uYWJsZVRvb2xzPEZ1bmN0aW9uc0FyZ3M+O1xufTtcblxuZXhwb3J0IGNsYXNzIENoYXRDb21wbGV0aW9uUnVubmVyIGV4dGVuZHMgQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lcjxDaGF0Q29tcGxldGlvblJ1bm5lckV2ZW50cz4ge1xuICAvKiogQGRlcHJlY2F0ZWQgLSBwbGVhc2UgdXNlIGBydW5Ub29sc2AgaW5zdGVhZC4gKi9cbiAgc3RhdGljIHJ1bkZ1bmN0aW9ucyhcbiAgICBjb21wbGV0aW9uczogQ29tcGxldGlvbnMsXG4gICAgcGFyYW1zOiBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uUnVubmVyUGFyYW1zPGFueVtdPixcbiAgICBvcHRpb25zPzogUnVubmVyT3B0aW9ucyxcbiAgKTogQ2hhdENvbXBsZXRpb25SdW5uZXIge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBDaGF0Q29tcGxldGlvblJ1bm5lcigpO1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAuLi5vcHRpb25zPy5oZWFkZXJzLCAnWC1TdGFpbmxlc3MtSGVscGVyLU1ldGhvZCc6ICdydW5GdW5jdGlvbnMnIH0sXG4gICAgfTtcbiAgICBydW5uZXIuX3J1bigoKSA9PiBydW5uZXIuX3J1bkZ1bmN0aW9ucyhjb21wbGV0aW9ucywgcGFyYW1zLCBvcHRzKSk7XG4gICAgcmV0dXJuIHJ1bm5lcjtcbiAgfVxuXG4gIHN0YXRpYyBydW5Ub29scyhcbiAgICBjb21wbGV0aW9uczogQ29tcGxldGlvbnMsXG4gICAgcGFyYW1zOiBDaGF0Q29tcGxldGlvblRvb2xSdW5uZXJQYXJhbXM8YW55W10+LFxuICAgIG9wdGlvbnM/OiBSdW5uZXJPcHRpb25zLFxuICApOiBDaGF0Q29tcGxldGlvblJ1bm5lciB7XG4gICAgY29uc3QgcnVubmVyID0gbmV3IENoYXRDb21wbGV0aW9uUnVubmVyKCk7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7IC4uLm9wdGlvbnM/LmhlYWRlcnMsICdYLVN0YWlubGVzcy1IZWxwZXItTWV0aG9kJzogJ3J1blRvb2xzJyB9LFxuICAgIH07XG4gICAgcnVubmVyLl9ydW4oKCkgPT4gcnVubmVyLl9ydW5Ub29scyhjb21wbGV0aW9ucywgcGFyYW1zLCBvcHRzKSk7XG4gICAgcmV0dXJuIHJ1bm5lcjtcbiAgfVxuXG4gIG92ZXJyaWRlIF9hZGRNZXNzYWdlKG1lc3NhZ2U6IENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtKSB7XG4gICAgc3VwZXIuX2FkZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgaWYgKGlzQXNzaXN0YW50TWVzc2FnZShtZXNzYWdlKSAmJiBtZXNzYWdlLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuX2VtaXQoJ2NvbnRlbnQnLCBtZXNzYWdlLmNvbnRlbnQgYXMgc3RyaW5nKTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBPcGVuQUlFcnJvciwgQVBJVXNlckFib3J0RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbmltcG9ydCB7XG4gIENvbXBsZXRpb25zLFxuICB0eXBlIENoYXRDb21wbGV0aW9uLFxuICB0eXBlIENoYXRDb21wbGV0aW9uQ2h1bmssXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMsXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlLFxufSBmcm9tIFwiLi4vcmVzb3VyY2VzL2NoYXQvY29tcGxldGlvbnNcIjtcbmltcG9ydCB7XG4gIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXIsXG4gIHR5cGUgQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lckV2ZW50cyxcbn0gZnJvbSAnLi9BYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyJztcbmltcG9ydCB7IHR5cGUgUmVhZGFibGVTdHJlYW0gfSBmcm9tIFwiLi4vX3NoaW1zL2luZGV4XCI7XG5pbXBvcnQgeyBTdHJlYW0gfSBmcm9tIFwiLi4vc3RyZWFtaW5nXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25TdHJlYW1FdmVudHMgZXh0ZW5kcyBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyRXZlbnRzIHtcbiAgY29udGVudDogKGNvbnRlbnREZWx0YTogc3RyaW5nLCBjb250ZW50U25hcHNob3Q6IHN0cmluZykgPT4gdm9pZDtcbiAgY2h1bms6IChjaHVuazogQ2hhdENvbXBsZXRpb25DaHVuaywgc25hcHNob3Q6IENoYXRDb21wbGV0aW9uU25hcHNob3QpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIENoYXRDb21wbGV0aW9uU3RyZWFtUGFyYW1zID0gT21pdDxDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc0Jhc2UsICdzdHJlYW0nPiAmIHtcbiAgc3RyZWFtPzogdHJ1ZTtcbn07XG5cbmV4cG9ydCBjbGFzcyBDaGF0Q29tcGxldGlvblN0cmVhbVxuICBleHRlbmRzIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXI8Q2hhdENvbXBsZXRpb25TdHJlYW1FdmVudHM+XG4gIGltcGxlbWVudHMgQXN5bmNJdGVyYWJsZTxDaGF0Q29tcGxldGlvbkNodW5rPlxue1xuICAjY3VycmVudENoYXRDb21wbGV0aW9uU25hcHNob3Q6IENoYXRDb21wbGV0aW9uU25hcHNob3QgfCB1bmRlZmluZWQ7XG5cbiAgZ2V0IGN1cnJlbnRDaGF0Q29tcGxldGlvblNuYXBzaG90KCk6IENoYXRDb21wbGV0aW9uU25hcHNob3QgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNjdXJyZW50Q2hhdENvbXBsZXRpb25TbmFwc2hvdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlbmRlZCBmb3IgdXNlIG9uIHRoZSBmcm9udGVuZCwgY29uc3VtaW5nIGEgc3RyZWFtIHByb2R1Y2VkIHdpdGhcbiAgICogYC50b1JlYWRhYmxlU3RyZWFtKClgIG9uIHRoZSBiYWNrZW5kLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgbWVzc2FnZXMgc2VudCB0byB0aGUgbW9kZWwgZG8gbm90IGFwcGVhciBpbiBgLm9uKCdtZXNzYWdlJylgXG4gICAqIGluIHRoaXMgY29udGV4dC5cbiAgICovXG4gIHN0YXRpYyBmcm9tUmVhZGFibGVTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZVN0cmVhbSk6IENoYXRDb21wbGV0aW9uU3RyZWFtIHtcbiAgICBjb25zdCBydW5uZXIgPSBuZXcgQ2hhdENvbXBsZXRpb25TdHJlYW0oKTtcbiAgICBydW5uZXIuX3J1bigoKSA9PiBydW5uZXIuX2Zyb21SZWFkYWJsZVN0cmVhbShzdHJlYW0pKTtcbiAgICByZXR1cm4gcnVubmVyO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUNoYXRDb21wbGV0aW9uKFxuICAgIGNvbXBsZXRpb25zOiBDb21wbGV0aW9ucyxcbiAgICBwYXJhbXM6IENoYXRDb21wbGV0aW9uU3RyZWFtUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDaGF0Q29tcGxldGlvblN0cmVhbSB7XG4gICAgY29uc3QgcnVubmVyID0gbmV3IENoYXRDb21wbGV0aW9uU3RyZWFtKCk7XG4gICAgcnVubmVyLl9ydW4oKCkgPT5cbiAgICAgIHJ1bm5lci5fcnVuQ2hhdENvbXBsZXRpb24oXG4gICAgICAgIGNvbXBsZXRpb25zLFxuICAgICAgICB7IC4uLnBhcmFtcywgc3RyZWFtOiB0cnVlIH0sXG4gICAgICAgIHsgLi4ub3B0aW9ucywgaGVhZGVyczogeyAuLi5vcHRpb25zPy5oZWFkZXJzLCAnWC1TdGFpbmxlc3MtSGVscGVyLU1ldGhvZCc6ICdzdHJlYW0nIH0gfSxcbiAgICAgICksXG4gICAgKTtcbiAgICByZXR1cm4gcnVubmVyO1xuICB9XG5cbiAgI2JlZ2luUmVxdWVzdCgpIHtcbiAgICBpZiAodGhpcy5lbmRlZCkgcmV0dXJuO1xuICAgIHRoaXMuI2N1cnJlbnRDaGF0Q29tcGxldGlvblNuYXBzaG90ID0gdW5kZWZpbmVkO1xuICB9XG4gICNhZGRDaHVuayhjaHVuazogQ2hhdENvbXBsZXRpb25DaHVuaykge1xuICAgIGlmICh0aGlzLmVuZGVkKSByZXR1cm47XG4gICAgY29uc3QgY29tcGxldGlvbiA9IHRoaXMuI2FjY3VtdWxhdGVDaGF0Q29tcGxldGlvbihjaHVuayk7XG4gICAgdGhpcy5fZW1pdCgnY2h1bmsnLCBjaHVuaywgY29tcGxldGlvbik7XG4gICAgY29uc3QgZGVsdGEgPSBjaHVuay5jaG9pY2VzWzBdPy5kZWx0YT8uY29udGVudDtcbiAgICBjb25zdCBzbmFwc2hvdCA9IGNvbXBsZXRpb24uY2hvaWNlc1swXT8ubWVzc2FnZTtcbiAgICBpZiAoZGVsdGEgIT0gbnVsbCAmJiBzbmFwc2hvdD8ucm9sZSA9PT0gJ2Fzc2lzdGFudCcgJiYgc25hcHNob3Q/LmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuX2VtaXQoJ2NvbnRlbnQnLCBkZWx0YSwgc25hcHNob3QuY29udGVudCk7XG4gICAgfVxuICB9XG4gICNlbmRSZXF1ZXN0KCk6IENoYXRDb21wbGV0aW9uIHtcbiAgICBpZiAodGhpcy5lbmRlZCkge1xuICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGBzdHJlYW0gaGFzIGVuZGVkLCB0aGlzIHNob3VsZG4ndCBoYXBwZW5gKTtcbiAgICB9XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLiNjdXJyZW50Q2hhdENvbXBsZXRpb25TbmFwc2hvdDtcbiAgICBpZiAoIXNuYXBzaG90KSB7XG4gICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYHJlcXVlc3QgZW5kZWQgd2l0aG91dCBzZW5kaW5nIGFueSBjaHVua3NgKTtcbiAgICB9XG4gICAgdGhpcy4jY3VycmVudENoYXRDb21wbGV0aW9uU25hcHNob3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGZpbmFsaXplQ2hhdENvbXBsZXRpb24oc25hcHNob3QpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIF9jcmVhdGVDaGF0Q29tcGxldGlvbihcbiAgICBjb21wbGV0aW9uczogQ29tcGxldGlvbnMsXG4gICAgcGFyYW1zOiBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxDaGF0Q29tcGxldGlvbj4ge1xuICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHRoaXMuY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdGhpcy5jb250cm9sbGVyLmFib3J0KCkpO1xuICAgIH1cbiAgICB0aGlzLiNiZWdpblJlcXVlc3QoKTtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBjb21wbGV0aW9ucy5jcmVhdGUoXG4gICAgICB7IC4uLnBhcmFtcywgc3RyZWFtOiB0cnVlIH0sXG4gICAgICB7IC4uLm9wdGlvbnMsIHNpZ25hbDogdGhpcy5jb250cm9sbGVyLnNpZ25hbCB9LFxuICAgICk7XG4gICAgdGhpcy5fY29ubmVjdGVkKCk7XG4gICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBzdHJlYW0pIHtcbiAgICAgIHRoaXMuI2FkZENodW5rKGNodW5rKTtcbiAgICB9XG4gICAgaWYgKHN0cmVhbS5jb250cm9sbGVyLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgdGhyb3cgbmV3IEFQSVVzZXJBYm9ydEVycm9yKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hZGRDaGF0Q29tcGxldGlvbih0aGlzLiNlbmRSZXF1ZXN0KCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIF9mcm9tUmVhZGFibGVTdHJlYW0oXG4gICAgcmVhZGFibGVTdHJlYW06IFJlYWRhYmxlU3RyZWFtLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPENoYXRDb21wbGV0aW9uPiB7XG4gICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgfVxuICAgIHRoaXMuI2JlZ2luUmVxdWVzdCgpO1xuICAgIHRoaXMuX2Nvbm5lY3RlZCgpO1xuICAgIGNvbnN0IHN0cmVhbSA9IFN0cmVhbS5mcm9tUmVhZGFibGVTdHJlYW08Q2hhdENvbXBsZXRpb25DaHVuaz4ocmVhZGFibGVTdHJlYW0sIHRoaXMuY29udHJvbGxlcik7XG4gICAgbGV0IGNoYXRJZDtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHN0cmVhbSkge1xuICAgICAgaWYgKGNoYXRJZCAmJiBjaGF0SWQgIT09IGNodW5rLmlkKSB7XG4gICAgICAgIC8vIEEgbmV3IHJlcXVlc3QgaGFzIGJlZW4gbWFkZS5cbiAgICAgICAgdGhpcy5fYWRkQ2hhdENvbXBsZXRpb24odGhpcy4jZW5kUmVxdWVzdCgpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy4jYWRkQ2h1bmsoY2h1bmspO1xuICAgICAgY2hhdElkID0gY2h1bmsuaWQ7XG4gICAgfVxuICAgIGlmIChzdHJlYW0uY29udHJvbGxlci5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBBUElVc2VyQWJvcnRFcnJvcigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hhdENvbXBsZXRpb24odGhpcy4jZW5kUmVxdWVzdCgpKTtcbiAgfVxuXG4gICNhY2N1bXVsYXRlQ2hhdENvbXBsZXRpb24oY2h1bms6IENoYXRDb21wbGV0aW9uQ2h1bmspOiBDaGF0Q29tcGxldGlvblNuYXBzaG90IHtcbiAgICBsZXQgc25hcHNob3QgPSB0aGlzLiNjdXJyZW50Q2hhdENvbXBsZXRpb25TbmFwc2hvdDtcbiAgICBjb25zdCB7IGNob2ljZXMsIC4uLnJlc3QgfSA9IGNodW5rO1xuICAgIGlmICghc25hcHNob3QpIHtcbiAgICAgIHNuYXBzaG90ID0gdGhpcy4jY3VycmVudENoYXRDb21wbGV0aW9uU25hcHNob3QgPSB7XG4gICAgICAgIC4uLnJlc3QsXG4gICAgICAgIGNob2ljZXM6IFtdLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgT2JqZWN0LmFzc2lnbihzbmFwc2hvdCwgcmVzdCk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7IGRlbHRhLCBmaW5pc2hfcmVhc29uLCBpbmRleCwgbG9ncHJvYnMgPSBudWxsLCAuLi5vdGhlciB9IG9mIGNodW5rLmNob2ljZXMpIHtcbiAgICAgIGxldCBjaG9pY2UgPSBzbmFwc2hvdC5jaG9pY2VzW2luZGV4XTtcbiAgICAgIGlmICghY2hvaWNlKSB7XG4gICAgICAgIGNob2ljZSA9IHNuYXBzaG90LmNob2ljZXNbaW5kZXhdID0geyBmaW5pc2hfcmVhc29uLCBpbmRleCwgbWVzc2FnZToge30sIGxvZ3Byb2JzLCAuLi5vdGhlciB9O1xuICAgICAgfVxuXG4gICAgICBpZiAobG9ncHJvYnMpIHtcbiAgICAgICAgaWYgKCFjaG9pY2UubG9ncHJvYnMpIHtcbiAgICAgICAgICBjaG9pY2UubG9ncHJvYnMgPSBPYmplY3QuYXNzaWduKHt9LCBsb2dwcm9icyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgeyBjb250ZW50LCAuLi5yZXN0IH0gPSBsb2dwcm9icztcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGNob2ljZS5sb2dwcm9icywgcmVzdCk7XG4gICAgICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgICAgIGNob2ljZS5sb2dwcm9icy5jb250ZW50ID8/PSBbXTtcbiAgICAgICAgICAgIGNob2ljZS5sb2dwcm9icy5jb250ZW50LnB1c2goLi4uY29udGVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5pc2hfcmVhc29uKSBjaG9pY2UuZmluaXNoX3JlYXNvbiA9IGZpbmlzaF9yZWFzb247XG4gICAgICBPYmplY3QuYXNzaWduKGNob2ljZSwgb3RoZXIpO1xuXG4gICAgICBpZiAoIWRlbHRhKSBjb250aW51ZTsgLy8gU2hvdWxkbid0IGhhcHBlbjsganVzdCBpbiBjYXNlLlxuICAgICAgY29uc3QgeyBjb250ZW50LCBmdW5jdGlvbl9jYWxsLCByb2xlLCB0b29sX2NhbGxzLCAuLi5yZXN0IH0gPSBkZWx0YTtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2hvaWNlLm1lc3NhZ2UsIHJlc3QpO1xuXG4gICAgICBpZiAoY29udGVudCkgY2hvaWNlLm1lc3NhZ2UuY29udGVudCA9IChjaG9pY2UubWVzc2FnZS5jb250ZW50IHx8ICcnKSArIGNvbnRlbnQ7XG4gICAgICBpZiAocm9sZSkgY2hvaWNlLm1lc3NhZ2Uucm9sZSA9IHJvbGU7XG4gICAgICBpZiAoZnVuY3Rpb25fY2FsbCkge1xuICAgICAgICBpZiAoIWNob2ljZS5tZXNzYWdlLmZ1bmN0aW9uX2NhbGwpIHtcbiAgICAgICAgICBjaG9pY2UubWVzc2FnZS5mdW5jdGlvbl9jYWxsID0gZnVuY3Rpb25fY2FsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZnVuY3Rpb25fY2FsbC5uYW1lKSBjaG9pY2UubWVzc2FnZS5mdW5jdGlvbl9jYWxsLm5hbWUgPSBmdW5jdGlvbl9jYWxsLm5hbWU7XG4gICAgICAgICAgaWYgKGZ1bmN0aW9uX2NhbGwuYXJndW1lbnRzKSB7XG4gICAgICAgICAgICBjaG9pY2UubWVzc2FnZS5mdW5jdGlvbl9jYWxsLmFyZ3VtZW50cyA/Pz0gJyc7XG4gICAgICAgICAgICBjaG9pY2UubWVzc2FnZS5mdW5jdGlvbl9jYWxsLmFyZ3VtZW50cyArPSBmdW5jdGlvbl9jYWxsLmFyZ3VtZW50cztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0b29sX2NhbGxzKSB7XG4gICAgICAgIGlmICghY2hvaWNlLm1lc3NhZ2UudG9vbF9jYWxscykgY2hvaWNlLm1lc3NhZ2UudG9vbF9jYWxscyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHsgaW5kZXgsIGlkLCB0eXBlLCBmdW5jdGlvbjogZm4sIC4uLnJlc3QgfSBvZiB0b29sX2NhbGxzKSB7XG4gICAgICAgICAgY29uc3QgdG9vbF9jYWxsID0gKGNob2ljZS5tZXNzYWdlLnRvb2xfY2FsbHNbaW5kZXhdID8/PSB7fSk7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih0b29sX2NhbGwsIHJlc3QpO1xuICAgICAgICAgIGlmIChpZCkgdG9vbF9jYWxsLmlkID0gaWQ7XG4gICAgICAgICAgaWYgKHR5cGUpIHRvb2xfY2FsbC50eXBlID0gdHlwZTtcbiAgICAgICAgICBpZiAoZm4pIHRvb2xfY2FsbC5mdW5jdGlvbiA/Pz0geyBhcmd1bWVudHM6ICcnIH07XG4gICAgICAgICAgaWYgKGZuPy5uYW1lKSB0b29sX2NhbGwuZnVuY3Rpb24hLm5hbWUgPSBmbi5uYW1lO1xuICAgICAgICAgIGlmIChmbj8uYXJndW1lbnRzKSB0b29sX2NhbGwuZnVuY3Rpb24hLmFyZ3VtZW50cyArPSBmbi5hcmd1bWVudHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG5cbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBBc3luY0l0ZXJhdG9yPENoYXRDb21wbGV0aW9uQ2h1bms+IHtcbiAgICBjb25zdCBwdXNoUXVldWU6IENoYXRDb21wbGV0aW9uQ2h1bmtbXSA9IFtdO1xuICAgIGNvbnN0IHJlYWRRdWV1ZToge1xuICAgICAgcmVzb2x2ZTogKGNodW5rOiBDaGF0Q29tcGxldGlvbkNodW5rIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuICAgICAgcmVqZWN0OiAoZXJyOiB1bmtub3duKSA9PiB2b2lkO1xuICAgIH1bXSA9IFtdO1xuICAgIGxldCBkb25lID0gZmFsc2U7XG5cbiAgICB0aGlzLm9uKCdjaHVuaycsIChjaHVuaykgPT4ge1xuICAgICAgY29uc3QgcmVhZGVyID0gcmVhZFF1ZXVlLnNoaWZ0KCk7XG4gICAgICBpZiAocmVhZGVyKSB7XG4gICAgICAgIHJlYWRlci5yZXNvbHZlKGNodW5rKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1c2hRdWV1ZS5wdXNoKGNodW5rKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCByZWFkZXIgb2YgcmVhZFF1ZXVlKSB7XG4gICAgICAgIHJlYWRlci5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgICByZWFkUXVldWUubGVuZ3RoID0gMDtcbiAgICB9KTtcblxuICAgIHRoaXMub24oJ2Fib3J0JywgKGVycikgPT4ge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICBmb3IgKGNvbnN0IHJlYWRlciBvZiByZWFkUXVldWUpIHtcbiAgICAgICAgcmVhZGVyLnJlamVjdChlcnIpO1xuICAgICAgfVxuICAgICAgcmVhZFF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCByZWFkZXIgb2YgcmVhZFF1ZXVlKSB7XG4gICAgICAgIHJlYWRlci5yZWplY3QoZXJyKTtcbiAgICAgIH1cbiAgICAgIHJlYWRRdWV1ZS5sZW5ndGggPSAwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGFzeW5jICgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PENoYXRDb21wbGV0aW9uQ2h1bms+PiA9PiB7XG4gICAgICAgIGlmICghcHVzaFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxDaGF0Q29tcGxldGlvbkNodW5rIHwgdW5kZWZpbmVkPigocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgICAgICAgICAgcmVhZFF1ZXVlLnB1c2goeyByZXNvbHZlLCByZWplY3QgfSksXG4gICAgICAgICAgKS50aGVuKChjaHVuaykgPT4gKGNodW5rID8geyB2YWx1ZTogY2h1bmssIGRvbmU6IGZhbHNlIH0gOiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNodW5rID0gcHVzaFF1ZXVlLnNoaWZ0KCkhO1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogY2h1bmssIGRvbmU6IGZhbHNlIH07XG4gICAgICB9LFxuICAgICAgcmV0dXJuOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMuYWJvcnQoKTtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgdG9SZWFkYWJsZVN0cmVhbSgpOiBSZWFkYWJsZVN0cmVhbSB7XG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IFN0cmVhbSh0aGlzW1N5bWJvbC5hc3luY0l0ZXJhdG9yXS5iaW5kKHRoaXMpLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgIHJldHVybiBzdHJlYW0udG9SZWFkYWJsZVN0cmVhbSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmFsaXplQ2hhdENvbXBsZXRpb24oc25hcHNob3Q6IENoYXRDb21wbGV0aW9uU25hcHNob3QpOiBDaGF0Q29tcGxldGlvbiB7XG4gIGNvbnN0IHsgaWQsIGNob2ljZXMsIGNyZWF0ZWQsIG1vZGVsLCBzeXN0ZW1fZmluZ2VycHJpbnQsIC4uLnJlc3QgfSA9IHNuYXBzaG90O1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3QsXG4gICAgaWQsXG4gICAgY2hvaWNlczogY2hvaWNlcy5tYXAoXG4gICAgICAoeyBtZXNzYWdlLCBmaW5pc2hfcmVhc29uLCBpbmRleCwgbG9ncHJvYnMsIC4uLmNob2ljZVJlc3QgfSk6IENoYXRDb21wbGV0aW9uLkNob2ljZSA9PiB7XG4gICAgICAgIGlmICghZmluaXNoX3JlYXNvbikgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGBtaXNzaW5nIGZpbmlzaF9yZWFzb24gZm9yIGNob2ljZSAke2luZGV4fWApO1xuICAgICAgICBjb25zdCB7IGNvbnRlbnQgPSBudWxsLCBmdW5jdGlvbl9jYWxsLCB0b29sX2NhbGxzLCAuLi5tZXNzYWdlUmVzdCB9ID0gbWVzc2FnZTtcbiAgICAgICAgY29uc3Qgcm9sZSA9IG1lc3NhZ2Uucm9sZSBhcyAnYXNzaXN0YW50JzsgLy8gdGhpcyBpcyB3aGF0IHdlIGV4cGVjdDsgaW4gdGhlb3J5IGl0IGNvdWxkIGJlIGRpZmZlcmVudCB3aGljaCB3b3VsZCBtYWtlIG91ciB0eXBlcyBhIHNsaWdodCBsaWUgYnV0IHdvdWxkIGJlIGZpbmUuXG4gICAgICAgIGlmICghcm9sZSkgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGBtaXNzaW5nIHJvbGUgZm9yIGNob2ljZSAke2luZGV4fWApO1xuICAgICAgICBpZiAoZnVuY3Rpb25fY2FsbCkge1xuICAgICAgICAgIGNvbnN0IHsgYXJndW1lbnRzOiBhcmdzLCBuYW1lIH0gPSBmdW5jdGlvbl9jYWxsO1xuICAgICAgICAgIGlmIChhcmdzID09IG51bGwpIHRocm93IG5ldyBPcGVuQUlFcnJvcihgbWlzc2luZyBmdW5jdGlvbl9jYWxsLmFyZ3VtZW50cyBmb3IgY2hvaWNlICR7aW5kZXh9YCk7XG4gICAgICAgICAgaWYgKCFuYW1lKSB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYG1pc3NpbmcgZnVuY3Rpb25fY2FsbC5uYW1lIGZvciBjaG9pY2UgJHtpbmRleH1gKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY2hvaWNlUmVzdCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHsgY29udGVudCwgZnVuY3Rpb25fY2FsbDogeyBhcmd1bWVudHM6IGFyZ3MsIG5hbWUgfSwgcm9sZSB9LFxuICAgICAgICAgICAgZmluaXNoX3JlYXNvbixcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgbG9ncHJvYnMsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9vbF9jYWxscykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5jaG9pY2VSZXN0LFxuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBmaW5pc2hfcmVhc29uLFxuICAgICAgICAgICAgbG9ncHJvYnMsXG4gICAgICAgICAgICBtZXNzYWdlOiB7XG4gICAgICAgICAgICAgIC4uLm1lc3NhZ2VSZXN0LFxuICAgICAgICAgICAgICByb2xlLFxuICAgICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgICB0b29sX2NhbGxzOiB0b29sX2NhbGxzLm1hcCgodG9vbF9jYWxsLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBmdW5jdGlvbjogZm4sIHR5cGUsIGlkLCAuLi50b29sUmVzdCB9ID0gdG9vbF9jYWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgYXJndW1lbnRzOiBhcmdzLCBuYW1lLCAuLi5mblJlc3QgfSA9IGZuIHx8IHt9O1xuICAgICAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGBtaXNzaW5nIGNob2ljZXNbJHtpbmRleH1dLnRvb2xfY2FsbHNbJHtpfV0uaWRcXG4ke3N0cihzbmFwc2hvdCl9YCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihgbWlzc2luZyBjaG9pY2VzWyR7aW5kZXh9XS50b29sX2NhbGxzWyR7aX1dLnR5cGVcXG4ke3N0cihzbmFwc2hvdCl9YCk7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYG1pc3NpbmcgY2hvaWNlc1ske2luZGV4fV0udG9vbF9jYWxsc1ske2l9XS5mdW5jdGlvbi5uYW1lXFxuJHtzdHIoc25hcHNob3QpfWAsXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChhcmdzID09IG51bGwpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBtaXNzaW5nIGNob2ljZXNbJHtpbmRleH1dLnRvb2xfY2FsbHNbJHtpfV0uZnVuY3Rpb24uYXJndW1lbnRzXFxuJHtzdHIoc25hcHNob3QpfWAsXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4udG9vbFJlc3QsIGlkLCB0eXBlLCBmdW5jdGlvbjogeyAuLi5mblJlc3QsIG5hbWUsIGFyZ3VtZW50czogYXJncyB9IH07XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY2hvaWNlUmVzdCxcbiAgICAgICAgICBtZXNzYWdlOiB7IC4uLm1lc3NhZ2VSZXN0LCBjb250ZW50LCByb2xlIH0sXG4gICAgICAgICAgZmluaXNoX3JlYXNvbixcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBsb2dwcm9icyxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgKSxcbiAgICBjcmVhdGVkLFxuICAgIG1vZGVsLFxuICAgIG9iamVjdDogJ2NoYXQuY29tcGxldGlvbicsXG4gICAgLi4uKHN5c3RlbV9maW5nZXJwcmludCA/IHsgc3lzdGVtX2ZpbmdlcnByaW50IH0gOiB7fSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0cih4OiB1bmtub3duKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh4KTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc3RyZWFtZWQgY2h1bmsgb2YgYSBjaGF0IGNvbXBsZXRpb24gcmVzcG9uc2UgcmV0dXJuZWQgYnkgbW9kZWwsXG4gKiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgaW5wdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25TbmFwc2hvdCB7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY2hhdCBjb21wbGV0aW9uLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGNoYXQgY29tcGxldGlvbiBjaG9pY2VzLiBDYW4gYmUgbW9yZSB0aGFuIG9uZSBpZiBgbmAgaXMgZ3JlYXRlclxuICAgKiB0aGFuIDEuXG4gICAqL1xuICBjaG9pY2VzOiBBcnJheTxDaGF0Q29tcGxldGlvblNuYXBzaG90LkNob2ljZT47XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgb2Ygd2hlbiB0aGUgY2hhdCBjb21wbGV0aW9uIHdhcyBjcmVhdGVkLlxuICAgKi9cbiAgY3JlYXRlZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgdG8gZ2VuZXJhdGUgdGhlIGNvbXBsZXRpb24uXG4gICAqL1xuICBtb2RlbDogc3RyaW5nO1xuXG4gIC8vIE5vdGUgd2UgZG8gbm90IGluY2x1ZGUgYW4gXCJvYmplY3RcIiB0eXBlIG9uIHRoZSBzbmFwc2hvdCxcbiAgLy8gYmVjYXVzZSB0aGUgb2JqZWN0IGlzIG5vdCBhIHZhbGlkIFwiY2hhdC5jb21wbGV0aW9uXCIgdW50aWwgZmluYWxpemVkLlxuICAvLyBvYmplY3Q6ICdjaGF0LmNvbXBsZXRpb24nO1xuXG4gIC8qKlxuICAgKiBUaGlzIGZpbmdlcnByaW50IHJlcHJlc2VudHMgdGhlIGJhY2tlbmQgY29uZmlndXJhdGlvbiB0aGF0IHRoZSBtb2RlbCBydW5zIHdpdGguXG4gICAqXG4gICAqIENhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGBzZWVkYCByZXF1ZXN0IHBhcmFtZXRlciB0byB1bmRlcnN0YW5kIHdoZW5cbiAgICogYmFja2VuZCBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRoYXQgbWlnaHQgaW1wYWN0IGRldGVybWluaXNtLlxuICAgKi9cbiAgc3lzdGVtX2ZpbmdlcnByaW50Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENoYXRDb21wbGV0aW9uU25hcHNob3Qge1xuICBleHBvcnQgaW50ZXJmYWNlIENob2ljZSB7XG4gICAgLyoqXG4gICAgICogQSBjaGF0IGNvbXBsZXRpb24gZGVsdGEgZ2VuZXJhdGVkIGJ5IHN0cmVhbWVkIG1vZGVsIHJlc3BvbnNlcy5cbiAgICAgKi9cbiAgICBtZXNzYWdlOiBDaG9pY2UuTWVzc2FnZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb24gdGhlIG1vZGVsIHN0b3BwZWQgZ2VuZXJhdGluZyB0b2tlbnMuIFRoaXMgd2lsbCBiZSBgc3RvcGAgaWYgdGhlIG1vZGVsXG4gICAgICogaGl0IGEgbmF0dXJhbCBzdG9wIHBvaW50IG9yIGEgcHJvdmlkZWQgc3RvcCBzZXF1ZW5jZSwgYGxlbmd0aGAgaWYgdGhlIG1heGltdW1cbiAgICAgKiBudW1iZXIgb2YgdG9rZW5zIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3YXMgcmVhY2hlZCwgYGNvbnRlbnRfZmlsdGVyYCBpZlxuICAgICAqIGNvbnRlbnQgd2FzIG9taXR0ZWQgZHVlIHRvIGEgZmxhZyBmcm9tIG91ciBjb250ZW50IGZpbHRlcnMsIG9yIGBmdW5jdGlvbl9jYWxsYFxuICAgICAqIGlmIHRoZSBtb2RlbCBjYWxsZWQgYSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmaW5pc2hfcmVhc29uOiBDaGF0Q29tcGxldGlvbi5DaG9pY2VbJ2ZpbmlzaF9yZWFzb24nXSB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBMb2cgcHJvYmFiaWxpdHkgaW5mb3JtYXRpb24gZm9yIHRoZSBjaG9pY2UuXG4gICAgICovXG4gICAgbG9ncHJvYnM6IENoYXRDb21wbGV0aW9uLkNob2ljZS5Mb2dwcm9icyB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGNob2ljZSBpbiB0aGUgbGlzdCBvZiBjaG9pY2VzLlxuICAgICAqL1xuICAgIGluZGV4OiBudW1iZXI7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIENob2ljZSB7XG4gICAgLyoqXG4gICAgICogQSBjaGF0IGNvbXBsZXRpb24gZGVsdGEgZ2VuZXJhdGVkIGJ5IHN0cmVhbWVkIG1vZGVsIHJlc3BvbnNlcy5cbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY29udGVudHMgb2YgdGhlIGNodW5rIG1lc3NhZ2UuXG4gICAgICAgKi9cbiAgICAgIGNvbnRlbnQ/OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBuYW1lIGFuZCBhcmd1bWVudHMgb2YgYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQsIGFzIGdlbmVyYXRlZCBieSB0aGVcbiAgICAgICAqIG1vZGVsLlxuICAgICAgICovXG4gICAgICBmdW5jdGlvbl9jYWxsPzogTWVzc2FnZS5GdW5jdGlvbkNhbGw7XG5cbiAgICAgIHRvb2xfY2FsbHM/OiBBcnJheTxNZXNzYWdlLlRvb2xDYWxsPjtcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgcm9sZSBvZiB0aGUgYXV0aG9yIG9mIHRoaXMgbWVzc2FnZS5cbiAgICAgICAqL1xuICAgICAgcm9sZT86ICdzeXN0ZW0nIHwgJ3VzZXInIHwgJ2Fzc2lzdGFudCcgfCAnZnVuY3Rpb24nIHwgJ3Rvb2wnO1xuICAgIH1cblxuICAgIGV4cG9ydCBuYW1lc3BhY2UgTWVzc2FnZSB7XG4gICAgICBleHBvcnQgaW50ZXJmYWNlIFRvb2xDYWxsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsLlxuICAgICAgICAgKi9cbiAgICAgICAgaWQ/OiBzdHJpbmc7XG5cbiAgICAgICAgZnVuY3Rpb24/OiBUb29sQ2FsbC5GdW5jdGlvbjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHR5cGUgb2YgdGhlIHRvb2wuXG4gICAgICAgICAqL1xuICAgICAgICB0eXBlPzogJ2Z1bmN0aW9uJztcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IG5hbWVzcGFjZSBUb29sQ2FsbCB7XG4gICAgICAgIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb24ge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFRoZSBhcmd1bWVudHMgdG8gY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbCBpbiBKU09OXG4gICAgICAgICAgICogZm9ybWF0LiBOb3RlIHRoYXQgdGhlIG1vZGVsIGRvZXMgbm90IGFsd2F5cyBnZW5lcmF0ZSB2YWxpZCBKU09OLCBhbmQgbWF5XG4gICAgICAgICAgICogaGFsbHVjaW5hdGUgcGFyYW1ldGVycyBub3QgZGVmaW5lZCBieSB5b3VyIGZ1bmN0aW9uIHNjaGVtYS4gVmFsaWRhdGUgdGhlXG4gICAgICAgICAgICogYXJndW1lbnRzIGluIHlvdXIgY29kZSBiZWZvcmUgY2FsbGluZyB5b3VyIGZ1bmN0aW9uLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGFyZ3VtZW50cz86IHN0cmluZztcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbmFtZSBhbmQgYXJndW1lbnRzIG9mIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkLCBhcyBnZW5lcmF0ZWQgYnkgdGhlXG4gICAgICAgKiBtb2RlbC5cbiAgICAgICAqL1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbkNhbGwge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsIGluIEpTT05cbiAgICAgICAgICogZm9ybWF0LiBOb3RlIHRoYXQgdGhlIG1vZGVsIGRvZXMgbm90IGFsd2F5cyBnZW5lcmF0ZSB2YWxpZCBKU09OLCBhbmQgbWF5XG4gICAgICAgICAqIGhhbGx1Y2luYXRlIHBhcmFtZXRlcnMgbm90IGRlZmluZWQgYnkgeW91ciBmdW5jdGlvbiBzY2hlbWEuIFZhbGlkYXRlIHRoZVxuICAgICAgICAgKiBhcmd1bWVudHMgaW4geW91ciBjb2RlIGJlZm9yZSBjYWxsaW5nIHlvdXIgZnVuY3Rpb24uXG4gICAgICAgICAqL1xuICAgICAgICBhcmd1bWVudHM/OiBzdHJpbmc7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICAgICAgICAgKi9cbiAgICAgICAgbmFtZT86IHN0cmluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBDb21wbGV0aW9ucyxcbiAgdHlwZSBDaGF0Q29tcGxldGlvbkNodW5rLFxuICB0eXBlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nLFxufSBmcm9tIFwiLi4vcmVzb3VyY2VzL2NoYXQvY29tcGxldGlvbnNcIjtcbmltcG9ydCB7IFJ1bm5lck9wdGlvbnMsIHR5cGUgQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lckV2ZW50cyB9IGZyb20gJy4vQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lcic7XG5pbXBvcnQgeyB0eXBlIFJlYWRhYmxlU3RyZWFtIH0gZnJvbSBcIi4uL19zaGltcy9pbmRleFwiO1xuaW1wb3J0IHsgUnVubmFibGVUb29scywgdHlwZSBCYXNlRnVuY3Rpb25zQXJncywgdHlwZSBSdW5uYWJsZUZ1bmN0aW9ucyB9IGZyb20gJy4vUnVubmFibGVGdW5jdGlvbic7XG5pbXBvcnQgeyBDaGF0Q29tcGxldGlvblNuYXBzaG90LCBDaGF0Q29tcGxldGlvblN0cmVhbSB9IGZyb20gJy4vQ2hhdENvbXBsZXRpb25TdHJlYW0nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uU3RyZWFtRXZlbnRzIGV4dGVuZHMgQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lckV2ZW50cyB7XG4gIGNvbnRlbnQ6IChjb250ZW50RGVsdGE6IHN0cmluZywgY29udGVudFNuYXBzaG90OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNodW5rOiAoY2h1bms6IENoYXRDb21wbGV0aW9uQ2h1bmssIHNuYXBzaG90OiBDaGF0Q29tcGxldGlvblNuYXBzaG90KSA9PiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvblN0cmVhbWluZ0Z1bmN0aW9uUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4gPSBPbWl0PFxuICBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyxcbiAgJ2Z1bmN0aW9ucydcbj4gJiB7XG4gIGZ1bmN0aW9uczogUnVubmFibGVGdW5jdGlvbnM8RnVuY3Rpb25zQXJncz47XG59O1xuXG5leHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1Rvb2xSdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPiA9IE9taXQ8XG4gIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nLFxuICAndG9vbHMnXG4+ICYge1xuICB0b29sczogUnVubmFibGVUb29sczxGdW5jdGlvbnNBcmdzPjtcbn07XG5cbmV4cG9ydCBjbGFzcyBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lclxuICBleHRlbmRzIENoYXRDb21wbGV0aW9uU3RyZWFtXG4gIGltcGxlbWVudHMgQXN5bmNJdGVyYWJsZTxDaGF0Q29tcGxldGlvbkNodW5rPlxue1xuICBzdGF0aWMgb3ZlcnJpZGUgZnJvbVJlYWRhYmxlU3RyZWFtKHN0cmVhbTogUmVhZGFibGVTdHJlYW0pOiBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lciB7XG4gICAgY29uc3QgcnVubmVyID0gbmV3IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyKCk7XG4gICAgcnVubmVyLl9ydW4oKCkgPT4gcnVubmVyLl9mcm9tUmVhZGFibGVTdHJlYW0oc3RyZWFtKSk7XG4gICAgcmV0dXJuIHJ1bm5lcjtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCAtIHBsZWFzZSB1c2UgYHJ1blRvb2xzYCBpbnN0ZWFkLiAqL1xuICBzdGF0aWMgcnVuRnVuY3Rpb25zPFQgZXh0ZW5kcyAoc3RyaW5nIHwgb2JqZWN0KVtdPihcbiAgICBjb21wbGV0aW9uczogQ29tcGxldGlvbnMsXG4gICAgcGFyYW1zOiBDaGF0Q29tcGxldGlvblN0cmVhbWluZ0Z1bmN0aW9uUnVubmVyUGFyYW1zPFQ+LFxuICAgIG9wdGlvbnM/OiBSdW5uZXJPcHRpb25zLFxuICApOiBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lciB7XG4gICAgY29uc3QgcnVubmVyID0gbmV3IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyKCk7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7IC4uLm9wdGlvbnM/LmhlYWRlcnMsICdYLVN0YWlubGVzcy1IZWxwZXItTWV0aG9kJzogJ3J1bkZ1bmN0aW9ucycgfSxcbiAgICB9O1xuICAgIHJ1bm5lci5fcnVuKCgpID0+IHJ1bm5lci5fcnVuRnVuY3Rpb25zKGNvbXBsZXRpb25zLCBwYXJhbXMsIG9wdHMpKTtcbiAgICByZXR1cm4gcnVubmVyO1xuICB9XG5cbiAgc3RhdGljIHJ1blRvb2xzPFQgZXh0ZW5kcyAoc3RyaW5nIHwgb2JqZWN0KVtdPihcbiAgICBjb21wbGV0aW9uczogQ29tcGxldGlvbnMsXG4gICAgcGFyYW1zOiBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1Rvb2xSdW5uZXJQYXJhbXM8VD4sXG4gICAgb3B0aW9ucz86IFJ1bm5lck9wdGlvbnMsXG4gICk6IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyIHtcbiAgICBjb25zdCBydW5uZXIgPSBuZXcgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIoKTtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgLi4ub3B0aW9ucz8uaGVhZGVycywgJ1gtU3RhaW5sZXNzLUhlbHBlci1NZXRob2QnOiAncnVuVG9vbHMnIH0sXG4gICAgfTtcbiAgICBydW5uZXIuX3J1bigoKSA9PiBydW5uZXIuX3J1blRvb2xzKGNvbXBsZXRpb25zLCBwYXJhbXMsIG9wdHMpKTtcbiAgICByZXR1cm4gcnVubmVyO1xuICB9XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2UnO1xuaW1wb3J0IHsgQ2hhdENvbXBsZXRpb25SdW5uZXIsIENoYXRDb21wbGV0aW9uRnVuY3Rpb25SdW5uZXJQYXJhbXMgfSBmcm9tICcuLi8uLi8uLi9saWIvQ2hhdENvbXBsZXRpb25SdW5uZXInO1xuZXhwb3J0IHsgQ2hhdENvbXBsZXRpb25SdW5uZXIsIENoYXRDb21wbGV0aW9uRnVuY3Rpb25SdW5uZXJQYXJhbXMgfSBmcm9tICcuLi8uLi8uLi9saWIvQ2hhdENvbXBsZXRpb25SdW5uZXInO1xuaW1wb3J0IHtcbiAgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIsXG4gIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nRnVuY3Rpb25SdW5uZXJQYXJhbXMsXG59IGZyb20gJy4uLy4uLy4uL2xpYi9DaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lcic7XG5leHBvcnQge1xuICBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lcixcbiAgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdGdW5jdGlvblJ1bm5lclBhcmFtcyxcbn0gZnJvbSAnLi4vLi4vLi4vbGliL0NoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyJztcbmltcG9ydCB7IEJhc2VGdW5jdGlvbnNBcmdzIH0gZnJvbSAnLi4vLi4vLi4vbGliL1J1bm5hYmxlRnVuY3Rpb24nO1xuZXhwb3J0IHtcbiAgUnVubmFibGVGdW5jdGlvbixcbiAgUnVubmFibGVGdW5jdGlvbnMsXG4gIFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2UsXG4gIFJ1bm5hYmxlRnVuY3Rpb25XaXRob3V0UGFyc2UsXG4gIFBhcnNpbmdGdW5jdGlvbixcbiAgUGFyc2luZ1Rvb2xGdW5jdGlvbixcbn0gZnJvbSAnLi4vLi4vLi4vbGliL1J1bm5hYmxlRnVuY3Rpb24nO1xuaW1wb3J0IHsgQ2hhdENvbXBsZXRpb25Ub29sUnVubmVyUGFyYW1zIH0gZnJvbSAnLi4vLi4vLi4vbGliL0NoYXRDb21wbGV0aW9uUnVubmVyJztcbmV4cG9ydCB7IENoYXRDb21wbGV0aW9uVG9vbFJ1bm5lclBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL2xpYi9DaGF0Q29tcGxldGlvblJ1bm5lcic7XG5pbXBvcnQgeyBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1Rvb2xSdW5uZXJQYXJhbXMgfSBmcm9tICcuLi8uLi8uLi9saWIvQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXInO1xuZXhwb3J0IHsgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdUb29sUnVubmVyUGFyYW1zIH0gZnJvbSAnLi4vLi4vLi4vbGliL0NoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyJztcbmltcG9ydCB7IENoYXRDb21wbGV0aW9uU3RyZWFtLCB0eXBlIENoYXRDb21wbGV0aW9uU3RyZWFtUGFyYW1zIH0gZnJvbSAnLi4vLi4vLi4vbGliL0NoYXRDb21wbGV0aW9uU3RyZWFtJztcbmV4cG9ydCB7IENoYXRDb21wbGV0aW9uU3RyZWFtLCB0eXBlIENoYXRDb21wbGV0aW9uU3RyZWFtUGFyYW1zIH0gZnJvbSAnLi4vLi4vLi4vbGliL0NoYXRDb21wbGV0aW9uU3RyZWFtJztcblxuZXhwb3J0IGNsYXNzIENvbXBsZXRpb25zIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgYHJ1blRvb2xzYCBpbnN0ZWFkLlxuICAgKi9cbiAgcnVuRnVuY3Rpb25zPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4oXG4gICAgYm9keTogQ2hhdENvbXBsZXRpb25GdW5jdGlvblJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ2hhdENvbXBsZXRpb25SdW5uZXI7XG4gIHJ1bkZ1bmN0aW9uczxGdW5jdGlvbnNBcmdzIGV4dGVuZHMgQmFzZUZ1bmN0aW9uc0FyZ3M+KFxuICAgIGJvZHk6IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nRnVuY3Rpb25SdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz4sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyO1xuICBydW5GdW5jdGlvbnM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPihcbiAgICBib2R5OlxuICAgICAgfCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+XG4gICAgICB8IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nRnVuY3Rpb25SdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz4sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENoYXRDb21wbGV0aW9uUnVubmVyIHwgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIge1xuICAgIGlmIChib2R5LnN0cmVhbSkge1xuICAgICAgcmV0dXJuIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyLnJ1bkZ1bmN0aW9ucyhcbiAgICAgICAgdGhpcy5fY2xpZW50LmNoYXQuY29tcGxldGlvbnMsXG4gICAgICAgIGJvZHkgYXMgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdGdW5jdGlvblJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBDaGF0Q29tcGxldGlvblJ1bm5lci5ydW5GdW5jdGlvbnMoXG4gICAgICB0aGlzLl9jbGllbnQuY2hhdC5jb21wbGV0aW9ucyxcbiAgICAgIGJvZHkgYXMgQ2hhdENvbXBsZXRpb25GdW5jdGlvblJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNvbnZlbmllbmNlIGhlbHBlciBmb3IgdXNpbmcgdG9vbCBjYWxscyB3aXRoIHRoZSAvY2hhdC9jb21wbGV0aW9ucyBlbmRwb2ludFxuICAgKiB3aGljaCBhdXRvbWF0aWNhbGx5IGNhbGxzIHRoZSBKYXZhU2NyaXB0IGZ1bmN0aW9ucyB5b3UgcHJvdmlkZSBhbmQgc2VuZHMgdGhlaXJcbiAgICogcmVzdWx0cyBiYWNrIHRvIHRoZSAvY2hhdC9jb21wbGV0aW9ucyBlbmRwb2ludCwgbG9vcGluZyBhcyBsb25nIGFzIHRoZSBtb2RlbFxuICAgKiByZXF1ZXN0cyBmdW5jdGlvbiBjYWxscy5cbiAgICpcbiAgICogRm9yIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZXMsIHNlZVxuICAgKiBbdGhlIGRvY3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuYWkvb3BlbmFpLW5vZGUjYXV0b21hdGVkLWZ1bmN0aW9uLWNhbGxzKVxuICAgKi9cbiAgcnVuVG9vbHM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPihcbiAgICBib2R5OiBDaGF0Q29tcGxldGlvblRvb2xSdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz4sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENoYXRDb21wbGV0aW9uUnVubmVyO1xuICBydW5Ub29sczxGdW5jdGlvbnNBcmdzIGV4dGVuZHMgQmFzZUZ1bmN0aW9uc0FyZ3M+KFxuICAgIGJvZHk6IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nVG9vbFJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXI7XG4gIHJ1blRvb2xzPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4oXG4gICAgYm9keTpcbiAgICAgIHwgQ2hhdENvbXBsZXRpb25Ub29sUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+XG4gICAgICB8IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nVG9vbFJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ2hhdENvbXBsZXRpb25SdW5uZXIgfCBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lciB7XG4gICAgaWYgKGJvZHkuc3RyZWFtKSB7XG4gICAgICByZXR1cm4gQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIucnVuVG9vbHMoXG4gICAgICAgIHRoaXMuX2NsaWVudC5jaGF0LmNvbXBsZXRpb25zLFxuICAgICAgICBib2R5IGFzIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nVG9vbFJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBDaGF0Q29tcGxldGlvblJ1bm5lci5ydW5Ub29scyhcbiAgICAgIHRoaXMuX2NsaWVudC5jaGF0LmNvbXBsZXRpb25zLFxuICAgICAgYm9keSBhcyBDaGF0Q29tcGxldGlvblRvb2xSdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz4sXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNoYXQgY29tcGxldGlvbiBzdHJlYW1cbiAgICovXG4gIHN0cmVhbShib2R5OiBDaGF0Q29tcGxldGlvblN0cmVhbVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDaGF0Q29tcGxldGlvblN0cmVhbSB7XG4gICAgcmV0dXJuIENoYXRDb21wbGV0aW9uU3RyZWFtLmNyZWF0ZUNoYXRDb21wbGV0aW9uKHRoaXMuX2NsaWVudC5jaGF0LmNvbXBsZXRpb25zLCBib2R5LCBvcHRpb25zKTtcbiAgfVxufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2UnO1xuaW1wb3J0ICogYXMgQ29tcGxldGlvbnNBUEkgZnJvbSAnLi9jb21wbGV0aW9ucyc7XG5cbmV4cG9ydCBjbGFzcyBDaGF0IGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICBjb21wbGV0aW9uczogQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbnMgPSBuZXcgQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbnModGhpcy5fY2xpZW50KTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0IHtcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9ucyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25zO1xufVxuIiwgImltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVVzZXJBYm9ydEVycm9yLCBPcGVuQUlFcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuaW1wb3J0IHsgUnVuLCBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc0Jhc2UgfSBmcm9tIFwiLi4vcmVzb3VyY2VzL2JldGEvdGhyZWFkcy9ydW5zL3J1bnNcIjtcbmltcG9ydCB7IFJ1bkNyZWF0ZVBhcmFtc0Jhc2UsIFJ1bnMgfSBmcm9tIFwiLi4vcmVzb3VyY2VzL2JldGEvdGhyZWFkcy9ydW5zL3J1bnNcIjtcbmltcG9ydCB7IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2UsIFRocmVhZHMgfSBmcm9tIFwiLi4vcmVzb3VyY2VzL2JldGEvdGhyZWFkcy90aHJlYWRzXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFzc2lzdGFudFN0cmVhbVJ1bm5lcjxcbiAgRXZlbnRzIGV4dGVuZHMgQ3VzdG9tRXZlbnRzPGFueT4gPSBBYnN0cmFjdEFzc2lzdGFudFJ1bm5lckV2ZW50cyxcbj4ge1xuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgI2Nvbm5lY3RlZFByb21pc2U6IFByb21pc2U8dm9pZD47XG4gICNyZXNvbHZlQ29ubmVjdGVkUHJvbWlzZTogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAjcmVqZWN0Q29ubmVjdGVkUHJvbWlzZTogKGVycm9yOiBPcGVuQUlFcnJvcikgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICNlbmRQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICAjcmVzb2x2ZUVuZFByb21pc2U6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgI3JlamVjdEVuZFByb21pc2U6IChlcnJvcjogT3BlbkFJRXJyb3IpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAjbGlzdGVuZXJzOiB7IFtFdmVudCBpbiBrZXlvZiBFdmVudHNdPzogTGlzdGVuZXJzRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD4gfSA9IHt9O1xuXG4gICNlbmRlZCA9IGZhbHNlO1xuICAjZXJyb3JlZCA9IGZhbHNlO1xuICAjYWJvcnRlZCA9IGZhbHNlO1xuICAjY2F0Y2hpbmdQcm9taXNlQ3JlYXRlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuI2Nvbm5lY3RlZFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLiNyZXNvbHZlQ29ubmVjdGVkUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgICB0aGlzLiNyZWplY3RDb25uZWN0ZWRQcm9taXNlID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgdGhpcy4jZW5kUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuI3Jlc29sdmVFbmRQcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMuI3JlamVjdEVuZFByb21pc2UgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICAvLyBEb24ndCBsZXQgdGhlc2UgcHJvbWlzZXMgY2F1c2UgdW5oYW5kbGVkIHJlamVjdGlvbiBlcnJvcnMuXG4gICAgLy8gd2Ugd2lsbCBtYW51YWxseSBjYXVzZSBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGVycm9yIGxhdGVyXG4gICAgLy8gaWYgdGhlIHVzZXIgaGFzbid0IHJlZ2lzdGVyZWQgYW55IGVycm9yIGxpc3RlbmVyIG9yIGNhbGxlZFxuICAgIC8vIGFueSBwcm9taXNlLXJldHVybmluZyBtZXRob2QuXG4gICAgdGhpcy4jY29ubmVjdGVkUHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgdGhpcy4jZW5kUHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3J1bihleGVjdXRvcjogKCkgPT4gUHJvbWlzZTxhbnk+KSB7XG4gICAgLy8gVW5mb3J0dW5hdGVseSBpZiB3ZSBjYWxsIGBleGVjdXRvcigpYCBpbW1lZGlhdGVseSB3ZSBnZXQgcnVudGltZSBlcnJvcnMgYWJvdXRcbiAgICAvLyByZWZlcmVuY2VzIHRvIGB0aGlzYCBiZWZvcmUgdGhlIGBzdXBlcigpYCBjb25zdHJ1Y3RvciBjYWxsIHJldHVybnMuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBleGVjdXRvcigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAvLyB0aGlzLl9lbWl0RmluYWwoKTtcbiAgICAgICAgdGhpcy5fZW1pdCgnZW5kJyk7XG4gICAgICB9LCB0aGlzLiNoYW5kbGVFcnJvcik7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2FkZFJ1bihydW46IFJ1bik6IFJ1biB7XG4gICAgcmV0dXJuIHJ1bjtcbiAgfVxuXG4gIHByb3RlY3RlZCBfY29ubmVjdGVkKCkge1xuICAgIGlmICh0aGlzLmVuZGVkKSByZXR1cm47XG4gICAgdGhpcy4jcmVzb2x2ZUNvbm5lY3RlZFByb21pc2UoKTtcbiAgICB0aGlzLl9lbWl0KCdjb25uZWN0Jyk7XG4gIH1cblxuICBnZXQgZW5kZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2VuZGVkO1xuICB9XG5cbiAgZ2V0IGVycm9yZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2Vycm9yZWQ7XG4gIH1cblxuICBnZXQgYWJvcnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jYWJvcnRlZDtcbiAgfVxuXG4gIGFib3J0KCkge1xuICAgIHRoaXMuY29udHJvbGxlci5hYm9ydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGxpc3RlbmVyIGZ1bmN0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3RlbmVycyBhcnJheSBmb3IgdGhlIGV2ZW50LlxuICAgKiBObyBjaGVja3MgYXJlIG1hZGUgdG8gc2VlIGlmIHRoZSBsaXN0ZW5lciBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkLiBNdWx0aXBsZSBjYWxscyBwYXNzaW5nXG4gICAqIHRoZSBzYW1lIGNvbWJpbmF0aW9uIG9mIGV2ZW50IGFuZCBsaXN0ZW5lciB3aWxsIHJlc3VsdCBpbiB0aGUgbGlzdGVuZXIgYmVpbmcgYWRkZWQsIGFuZFxuICAgKiBjYWxsZWQsIG11bHRpcGxlIHRpbWVzLlxuICAgKiBAcmV0dXJucyB0aGlzIENoYXRDb21wbGV0aW9uU3RyZWFtLCBzbyB0aGF0IGNhbGxzIGNhbiBiZSBjaGFpbmVkXG4gICAqL1xuICBvbjxFdmVudCBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEV2ZW50LCBsaXN0ZW5lcjogTGlzdGVuZXJGb3JFdmVudDxFdmVudHMsIEV2ZW50Pik6IHRoaXMge1xuICAgIGNvbnN0IGxpc3RlbmVyczogTGlzdGVuZXJzRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD4gPVxuICAgICAgdGhpcy4jbGlzdGVuZXJzW2V2ZW50XSB8fCAodGhpcy4jbGlzdGVuZXJzW2V2ZW50XSA9IFtdKTtcbiAgICBsaXN0ZW5lcnMucHVzaCh7IGxpc3RlbmVyIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0ZW5lciBhcnJheSBmb3IgdGhlIGV2ZW50LlxuICAgKiBvZmYoKSB3aWxsIHJlbW92ZSwgYXQgbW9zdCwgb25lIGluc3RhbmNlIG9mIGEgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdGVuZXIgYXJyYXkuIElmIGFueSBzaW5nbGVcbiAgICogbGlzdGVuZXIgaGFzIGJlZW4gYWRkZWQgbXVsdGlwbGUgdGltZXMgdG8gdGhlIGxpc3RlbmVyIGFycmF5IGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LCB0aGVuXG4gICAqIG9mZigpIG11c3QgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIHJlbW92ZSBlYWNoIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB0aGlzIENoYXRDb21wbGV0aW9uU3RyZWFtLCBzbyB0aGF0IGNhbGxzIGNhbiBiZSBjaGFpbmVkXG4gICAqL1xuICBvZmY8RXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBFdmVudCwgbGlzdGVuZXI6IExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD4pOiB0aGlzIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLiNsaXN0ZW5lcnNbZXZlbnRdO1xuICAgIGlmICghbGlzdGVuZXJzKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBpbmRleCA9IGxpc3RlbmVycy5maW5kSW5kZXgoKGwpID0+IGwubGlzdGVuZXIgPT09IGxpc3RlbmVyKTtcbiAgICBpZiAoaW5kZXggPj0gMCkgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG9uZS10aW1lIGxpc3RlbmVyIGZ1bmN0aW9uIGZvciB0aGUgZXZlbnQuIFRoZSBuZXh0IHRpbWUgdGhlIGV2ZW50IGlzIHRyaWdnZXJlZCxcbiAgICogdGhpcyBsaXN0ZW5lciBpcyByZW1vdmVkIGFuZCB0aGVuIGludm9rZWQuXG4gICAqIEByZXR1cm5zIHRoaXMgQ2hhdENvbXBsZXRpb25TdHJlYW0sIHNvIHRoYXQgY2FsbHMgY2FuIGJlIGNoYWluZWRcbiAgICovXG4gIG9uY2U8RXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBFdmVudCwgbGlzdGVuZXI6IExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD4pOiB0aGlzIHtcbiAgICBjb25zdCBsaXN0ZW5lcnM6IExpc3RlbmVyc0ZvckV2ZW50PEV2ZW50cywgRXZlbnQ+ID1cbiAgICAgIHRoaXMuI2xpc3RlbmVyc1tldmVudF0gfHwgKHRoaXMuI2xpc3RlbmVyc1tldmVudF0gPSBbXSk7XG4gICAgbGlzdGVuZXJzLnB1c2goeyBsaXN0ZW5lciwgb25jZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8gYC5vbmNlKClgLCBidXQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB0aGUgbmV4dCB0aW1lXG4gICAqIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQsIGluc3RlYWQgb2YgY2FsbGluZyBhIGxpc3RlbmVyIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB0aGUgbmV4dCB0aW1lIGdpdmVuIGV2ZW50IGlzIHRyaWdnZXJlZCxcbiAgICogb3IgcmVqZWN0cyBpZiBhbiBlcnJvciBpcyBlbWl0dGVkLiAgKElmIHlvdSByZXF1ZXN0IHRoZSAnZXJyb3InIGV2ZW50LFxuICAgKiByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGVycm9yKS5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogICBjb25zdCBtZXNzYWdlID0gYXdhaXQgc3RyZWFtLmVtaXR0ZWQoJ21lc3NhZ2UnKSAvLyByZWplY3RzIGlmIHRoZSBzdHJlYW0gZXJyb3JzXG4gICAqL1xuICBlbWl0dGVkPEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPihcbiAgICBldmVudDogRXZlbnQsXG4gICk6IFByb21pc2U8XG4gICAgRXZlbnRQYXJhbWV0ZXJzPEV2ZW50cywgRXZlbnQ+IGV4dGVuZHMgW2luZmVyIFBhcmFtXSA/IFBhcmFtXG4gICAgOiBFdmVudFBhcmFtZXRlcnM8RXZlbnRzLCBFdmVudD4gZXh0ZW5kcyBbXSA/IHZvaWRcbiAgICA6IEV2ZW50UGFyYW1ldGVyczxFdmVudHMsIEV2ZW50PlxuICA+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy4jY2F0Y2hpbmdQcm9taXNlQ3JlYXRlZCA9IHRydWU7XG4gICAgICBpZiAoZXZlbnQgIT09ICdlcnJvcicpIHRoaXMub25jZSgnZXJyb3InLCByZWplY3QpO1xuICAgICAgdGhpcy5vbmNlKGV2ZW50LCByZXNvbHZlIGFzIGFueSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBkb25lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuI2NhdGNoaW5nUHJvbWlzZUNyZWF0ZWQgPSB0cnVlO1xuICAgIGF3YWl0IHRoaXMuI2VuZFByb21pc2U7XG4gIH1cblxuICAjaGFuZGxlRXJyb3IgPSAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICB0aGlzLiNlcnJvcmVkID0gdHJ1ZTtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgIGVycm9yID0gbmV3IEFQSVVzZXJBYm9ydEVycm9yKCk7XG4gICAgfVxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEFQSVVzZXJBYm9ydEVycm9yKSB7XG4gICAgICB0aGlzLiNhYm9ydGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLl9lbWl0KCdhYm9ydCcsIGVycm9yKTtcbiAgICB9XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgT3BlbkFJRXJyb3IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICB9XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnN0IG9wZW5BSUVycm9yOiBPcGVuQUlFcnJvciA9IG5ldyBPcGVuQUlFcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIG9wZW5BSUVycm9yLmNhdXNlID0gZXJyb3I7XG4gICAgICByZXR1cm4gdGhpcy5fZW1pdCgnZXJyb3InLCBvcGVuQUlFcnJvcik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9lbWl0KCdlcnJvcicsIG5ldyBPcGVuQUlFcnJvcihTdHJpbmcoZXJyb3IpKSk7XG4gIH07XG5cbiAgcHJvdGVjdGVkIF9lbWl0PEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogRXZlbnQsIC4uLmFyZ3M6IEV2ZW50UGFyYW1ldGVyczxFdmVudHMsIEV2ZW50Pikge1xuICAgIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBlbWl0IGFueSBldmVudHMgYWZ0ZXIgZW5kXG4gICAgaWYgKHRoaXMuI2VuZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50ID09PSAnZW5kJykge1xuICAgICAgdGhpcy4jZW5kZWQgPSB0cnVlO1xuICAgICAgdGhpcy4jcmVzb2x2ZUVuZFByb21pc2UoKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0ZW5lcnM6IExpc3RlbmVyc0ZvckV2ZW50PEV2ZW50cywgRXZlbnQ+IHwgdW5kZWZpbmVkID0gdGhpcy4jbGlzdGVuZXJzW2V2ZW50XTtcbiAgICBpZiAobGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLiNsaXN0ZW5lcnNbZXZlbnRdID0gbGlzdGVuZXJzLmZpbHRlcigobCkgPT4gIWwub25jZSkgYXMgYW55O1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goKHsgbGlzdGVuZXIgfTogYW55KSA9PiBsaXN0ZW5lciguLi5hcmdzKSk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50ID09PSAnYWJvcnQnKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGFyZ3NbMF0gYXMgQVBJVXNlckFib3J0RXJyb3I7XG4gICAgICBpZiAoIXRoaXMuI2NhdGNoaW5nUHJvbWlzZUNyZWF0ZWQgJiYgIWxpc3RlbmVycz8ubGVuZ3RoKSB7XG4gICAgICAgIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3JlamVjdENvbm5lY3RlZFByb21pc2UoZXJyb3IpO1xuICAgICAgdGhpcy4jcmVqZWN0RW5kUHJvbWlzZShlcnJvcik7XG4gICAgICB0aGlzLl9lbWl0KCdlbmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQgPT09ICdlcnJvcicpIHtcbiAgICAgIC8vIE5PVEU6IF9lbWl0KCdlcnJvcicsIGVycm9yKSBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSAjaGFuZGxlRXJyb3IoKS5cblxuICAgICAgY29uc3QgZXJyb3IgPSBhcmdzWzBdIGFzIE9wZW5BSUVycm9yO1xuICAgICAgaWYgKCF0aGlzLiNjYXRjaGluZ1Byb21pc2VDcmVhdGVkICYmICFsaXN0ZW5lcnM/Lmxlbmd0aCkge1xuICAgICAgICAvLyBUcmlnZ2VyIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gaWYgdGhlIHVzZXIgaGFzbid0IHJlZ2lzdGVyZWQgYW55IGVycm9yIGhhbmRsZXJzLlxuICAgICAgICAvLyBJZiB5b3UgYXJlIHNlZWluZyBzdGFjayB0cmFjZXMgaGVyZSwgbWFrZSBzdXJlIHRvIGhhbmRsZSBlcnJvcnMgdmlhIGVpdGhlcjpcbiAgICAgICAgLy8gLSBydW5uZXIub24oJ2Vycm9yJywgKCkgPT4gLi4uKVxuICAgICAgICAvLyAtIGF3YWl0IHJ1bm5lci5kb25lKClcbiAgICAgICAgLy8gLSBhd2FpdCBydW5uZXIuZmluYWxDaGF0Q29tcGxldGlvbigpXG4gICAgICAgIC8vIC0gZXRjLlxuICAgICAgICBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgICB0aGlzLiNyZWplY3RDb25uZWN0ZWRQcm9taXNlKGVycm9yKTtcbiAgICAgIHRoaXMuI3JlamVjdEVuZFByb21pc2UoZXJyb3IpO1xuICAgICAgdGhpcy5fZW1pdCgnZW5kJyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIF90aHJlYWRBc3Npc3RhbnRTdHJlYW0oXG4gICAgYm9keTogVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zQmFzZSxcbiAgICB0aHJlYWQ6IFRocmVhZHMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8UnVuPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NyZWF0ZVRocmVhZEFzc2lzdGFudFN0cmVhbSh0aHJlYWQsIGJvZHksIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIF9ydW5Bc3Npc3RhbnRTdHJlYW0oXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5zOiBSdW5zLFxuICAgIHBhcmFtczogUnVuQ3JlYXRlUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY3JlYXRlQXNzaXN0YW50U3RyZWFtKHJ1bnMsIHRocmVhZElkLCBwYXJhbXMsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIF9ydW5Ub29sQXNzaXN0YW50U3RyZWFtKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBydW5zOiBSdW5zLFxuICAgIHBhcmFtczogUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNCYXNlLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPFJ1bj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jcmVhdGVUb29sQXNzaXN0YW50U3RyZWFtKHJ1bnMsIHRocmVhZElkLCBydW5JZCwgcGFyYW1zLCBvcHRpb25zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBfY3JlYXRlVGhyZWFkQXNzaXN0YW50U3RyZWFtKFxuICAgIHRocmVhZDogVGhyZWFkcyxcbiAgICBib2R5OiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPFJ1bj4ge1xuICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHRoaXMuY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdGhpcy5jb250cm9sbGVyLmFib3J0KCkpO1xuICAgIH1cbiAgICAvLyB0aGlzLiN2YWxpZGF0ZVBhcmFtcyhwYXJhbXMpO1xuXG4gICAgY29uc3QgcnVuUmVzdWx0ID0gYXdhaXQgdGhyZWFkLmNyZWF0ZUFuZFJ1bihcbiAgICAgIHsgLi4uYm9keSwgc3RyZWFtOiBmYWxzZSB9LFxuICAgICAgeyAuLi5vcHRpb25zLCBzaWduYWw6IHRoaXMuY29udHJvbGxlci5zaWduYWwgfSxcbiAgICApO1xuICAgIHRoaXMuX2Nvbm5lY3RlZCgpO1xuICAgIHJldHVybiB0aGlzLl9hZGRSdW4ocnVuUmVzdWx0IGFzIFJ1bik7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgX2NyZWF0ZVRvb2xBc3Npc3RhbnRTdHJlYW0oXG4gICAgcnVuOiBSdW5zLFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHRoaXMuY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICB9XG5cbiAgICBjb25zdCBydW5SZXN1bHQgPSBhd2FpdCBydW4uc3VibWl0VG9vbE91dHB1dHMoXG4gICAgICB0aHJlYWRJZCxcbiAgICAgIHJ1bklkLFxuICAgICAgeyAuLi5wYXJhbXMsIHN0cmVhbTogZmFsc2UgfSxcbiAgICAgIHsgLi4ub3B0aW9ucywgc2lnbmFsOiB0aGlzLmNvbnRyb2xsZXIuc2lnbmFsIH0sXG4gICAgKTtcbiAgICB0aGlzLl9jb25uZWN0ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5fYWRkUnVuKHJ1blJlc3VsdCBhcyBSdW4pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIF9jcmVhdGVBc3Npc3RhbnRTdHJlYW0oXG4gICAgcnVuOiBSdW5zLFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSdW5DcmVhdGVQYXJhbXNCYXNlLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPFJ1bj4ge1xuICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHRoaXMuY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdGhpcy5jb250cm9sbGVyLmFib3J0KCkpO1xuICAgIH1cbiAgICAvLyB0aGlzLiN2YWxpZGF0ZVBhcmFtcyhwYXJhbXMpO1xuXG4gICAgY29uc3QgcnVuUmVzdWx0ID0gYXdhaXQgcnVuLmNyZWF0ZShcbiAgICAgIHRocmVhZElkLFxuICAgICAgeyAuLi5wYXJhbXMsIHN0cmVhbTogZmFsc2UgfSxcbiAgICAgIHsgLi4ub3B0aW9ucywgc2lnbmFsOiB0aGlzLmNvbnRyb2xsZXIuc2lnbmFsIH0sXG4gICAgKTtcbiAgICB0aGlzLl9jb25uZWN0ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5fYWRkUnVuKHJ1blJlc3VsdCBhcyBSdW4pO1xuICB9XG59XG5cbnR5cGUgQ3VzdG9tRXZlbnRzPEV2ZW50IGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgW2sgaW4gRXZlbnRdOiBrIGV4dGVuZHMga2V5b2YgQWJzdHJhY3RBc3Npc3RhbnRSdW5uZXJFdmVudHMgPyBBYnN0cmFjdEFzc2lzdGFudFJ1bm5lckV2ZW50c1trXVxuICA6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbn07XG5cbnR5cGUgTGlzdGVuZXJGb3JFdmVudDxFdmVudHMgZXh0ZW5kcyBDdXN0b21FdmVudHM8YW55PiwgRXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+ID0gRXZlbnQgZXh0ZW5kcyAoXG4gIGtleW9mIEFic3RyYWN0QXNzaXN0YW50UnVubmVyRXZlbnRzXG4pID9cbiAgQWJzdHJhY3RBc3Npc3RhbnRSdW5uZXJFdmVudHNbRXZlbnRdXG46IEV2ZW50c1tFdmVudF07XG5cbnR5cGUgTGlzdGVuZXJzRm9yRXZlbnQ8RXZlbnRzIGV4dGVuZHMgQ3VzdG9tRXZlbnRzPGFueT4sIEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPiA9IEFycmF5PHtcbiAgbGlzdGVuZXI6IExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD47XG4gIG9uY2U/OiBib29sZWFuO1xufT47XG50eXBlIEV2ZW50UGFyYW1ldGVyczxFdmVudHMgZXh0ZW5kcyBDdXN0b21FdmVudHM8YW55PiwgRXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+ID0gUGFyYW1ldGVyczxcbiAgTGlzdGVuZXJGb3JFdmVudDxFdmVudHMsIEV2ZW50PlxuPjtcblxuZXhwb3J0IGludGVyZmFjZSBBYnN0cmFjdEFzc2lzdGFudFJ1bm5lckV2ZW50cyB7XG4gIGNvbm5lY3Q6ICgpID0+IHZvaWQ7XG4gIHJ1bjogKHJ1bjogUnVuKSA9PiB2b2lkO1xuICBlcnJvcjogKGVycm9yOiBPcGVuQUlFcnJvcikgPT4gdm9pZDtcbiAgYWJvcnQ6IChlcnJvcjogQVBJVXNlckFib3J0RXJyb3IpID0+IHZvaWQ7XG4gIGVuZDogKCkgPT4gdm9pZDtcbn1cbiIsICJpbXBvcnQge1xuICBUZXh0Q29udGVudEJsb2NrLFxuICBJbWFnZUZpbGVDb250ZW50QmxvY2ssXG4gIE1lc3NhZ2UsXG4gIE1lc3NhZ2VDb250ZW50RGVsdGEsXG4gIFRleHQsXG4gIEltYWdlRmlsZSxcbiAgVGV4dERlbHRhLFxuICBNZXNzYWdlcyxcbiAgTWVzc2FnZUNvbnRlbnQsXG59IGZyb20gXCIuLi9yZXNvdXJjZXMvYmV0YS90aHJlYWRzL21lc3NhZ2VzXCI7XG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQge1xuICBSdW4sXG4gIFJ1bkNyZWF0ZVBhcmFtc0Jhc2UsXG4gIFJ1bkNyZWF0ZVBhcmFtc1N0cmVhbWluZyxcbiAgUnVucyxcbiAgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNCYXNlLFxuICBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbWluZyxcbn0gZnJvbSBcIi4uL3Jlc291cmNlcy9iZXRhL3RocmVhZHMvcnVucy9ydW5zXCI7XG5pbXBvcnQge1xuICBBYnN0cmFjdEFzc2lzdGFudFJ1bm5lckV2ZW50cyxcbiAgQWJzdHJhY3RBc3Npc3RhbnRTdHJlYW1SdW5uZXIsXG59IGZyb20gJy4vQWJzdHJhY3RBc3Npc3RhbnRTdHJlYW1SdW5uZXInO1xuaW1wb3J0IHsgdHlwZSBSZWFkYWJsZVN0cmVhbSB9IGZyb20gXCIuLi9fc2hpbXMvaW5kZXhcIjtcbmltcG9ydCB7IFN0cmVhbSB9IGZyb20gXCIuLi9zdHJlYW1pbmdcIjtcbmltcG9ydCB7IEFQSVVzZXJBYm9ydEVycm9yLCBPcGVuQUlFcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuaW1wb3J0IHtcbiAgQXNzaXN0YW50U3RyZWFtRXZlbnQsXG4gIE1lc3NhZ2VTdHJlYW1FdmVudCxcbiAgUnVuU3RlcFN0cmVhbUV2ZW50LFxuICBSdW5TdHJlYW1FdmVudCxcbn0gZnJvbSBcIi4uL3Jlc291cmNlcy9iZXRhL2Fzc2lzdGFudHNcIjtcbmltcG9ydCB7IFJ1blN0ZXAsIFJ1blN0ZXBEZWx0YSwgVG9vbENhbGwsIFRvb2xDYWxsRGVsdGEgfSBmcm9tIFwiLi4vcmVzb3VyY2VzL2JldGEvdGhyZWFkcy9ydW5zL3N0ZXBzXCI7XG5pbXBvcnQgeyBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlLCBUaHJlYWRzIH0gZnJvbSBcIi4uL3Jlc291cmNlcy9iZXRhL3RocmVhZHMvdGhyZWFkc1wiO1xuaW1wb3J0IE1lc3NhZ2VEZWx0YSA9IE1lc3NhZ2VzLk1lc3NhZ2VEZWx0YTtcblxuZXhwb3J0IGludGVyZmFjZSBBc3Npc3RhbnRTdHJlYW1FdmVudHMgZXh0ZW5kcyBBYnN0cmFjdEFzc2lzdGFudFJ1bm5lckV2ZW50cyB7XG4gIC8vTmV3IGV2ZW50IHN0cnVjdHVyZVxuICBtZXNzYWdlQ3JlYXRlZDogKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IHZvaWQ7XG4gIG1lc3NhZ2VEZWx0YTogKG1lc3NhZ2U6IE1lc3NhZ2VEZWx0YSwgc25hcHNob3Q6IE1lc3NhZ2UpID0+IHZvaWQ7XG4gIG1lc3NhZ2VEb25lOiAobWVzc2FnZTogTWVzc2FnZSkgPT4gdm9pZDtcblxuICBydW5TdGVwQ3JlYXRlZDogKHJ1blN0ZXA6IFJ1blN0ZXApID0+IHZvaWQ7XG4gIHJ1blN0ZXBEZWx0YTogKGRlbHRhOiBSdW5TdGVwRGVsdGEsIHNuYXBzaG90OiBSdW5zLlJ1blN0ZXApID0+IHZvaWQ7XG4gIHJ1blN0ZXBEb25lOiAocnVuU3RlcDogUnVucy5SdW5TdGVwLCBzbmFwc2hvdDogUnVucy5SdW5TdGVwKSA9PiB2b2lkO1xuXG4gIHRvb2xDYWxsQ3JlYXRlZDogKHRvb2xDYWxsOiBUb29sQ2FsbCkgPT4gdm9pZDtcbiAgdG9vbENhbGxEZWx0YTogKGRlbHRhOiBUb29sQ2FsbERlbHRhLCBzbmFwc2hvdDogVG9vbENhbGwpID0+IHZvaWQ7XG4gIHRvb2xDYWxsRG9uZTogKHRvb2xDYWxsOiBUb29sQ2FsbCkgPT4gdm9pZDtcblxuICB0ZXh0Q3JlYXRlZDogKGNvbnRlbnQ6IFRleHQpID0+IHZvaWQ7XG4gIHRleHREZWx0YTogKGRlbHRhOiBUZXh0RGVsdGEsIHNuYXBzaG90OiBUZXh0KSA9PiB2b2lkO1xuICB0ZXh0RG9uZTogKGNvbnRlbnQ6IFRleHQsIHNuYXBzaG90OiBNZXNzYWdlKSA9PiB2b2lkO1xuXG4gIC8vTm8gY3JlYXRlZCBvciBkZWx0YSBhcyB0aGlzIGlzIG5vdCBzdHJlYW1lZFxuICBpbWFnZUZpbGVEb25lOiAoY29udGVudDogSW1hZ2VGaWxlLCBzbmFwc2hvdDogTWVzc2FnZSkgPT4gdm9pZDtcblxuICBlbmQ6ICgpID0+IHZvaWQ7XG5cbiAgZXZlbnQ6IChldmVudDogQXNzaXN0YW50U3RyZWFtRXZlbnQpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2VTdHJlYW0gPSBPbWl0PFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2UsICdzdHJlYW0nPiAmIHtcbiAgc3RyZWFtPzogdHJ1ZTtcbn07XG5cbmV4cG9ydCB0eXBlIFJ1bkNyZWF0ZVBhcmFtc0Jhc2VTdHJlYW0gPSBPbWl0PFJ1bkNyZWF0ZVBhcmFtc0Jhc2UsICdzdHJlYW0nPiAmIHtcbiAgc3RyZWFtPzogdHJ1ZTtcbn07XG5cbmV4cG9ydCB0eXBlIFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtID0gT21pdDxSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc0Jhc2UsICdzdHJlYW0nPiAmIHtcbiAgc3RyZWFtPzogdHJ1ZTtcbn07XG5cbmV4cG9ydCBjbGFzcyBBc3Npc3RhbnRTdHJlYW1cbiAgZXh0ZW5kcyBBYnN0cmFjdEFzc2lzdGFudFN0cmVhbVJ1bm5lcjxBc3Npc3RhbnRTdHJlYW1FdmVudHM+XG4gIGltcGxlbWVudHMgQXN5bmNJdGVyYWJsZTxBc3Npc3RhbnRTdHJlYW1FdmVudD5cbntcbiAgLy9UcmFjayBhbGwgZXZlbnRzIGluIGEgc2luZ2xlIGxpc3QgZm9yIHJlZmVyZW5jZVxuICAjZXZlbnRzOiBBc3Npc3RhbnRTdHJlYW1FdmVudFtdID0gW107XG5cbiAgLy9Vc2VkIHRvIGFjY3VtdWxhdGUgZGVsdGFzXG4gIC8vV2UgYXJlIGFjY3VtdWxhdGluZyBtYW55IHR5cGVzIHNvIHRoZSB2YWx1ZSBoZXJlIGlzIG5vdCBzdHJpY3RcbiAgI3J1blN0ZXBTbmFwc2hvdHM6IHsgW2lkOiBzdHJpbmddOiBSdW5zLlJ1blN0ZXAgfSA9IHt9O1xuICAjbWVzc2FnZVNuYXBzaG90czogeyBbaWQ6IHN0cmluZ106IE1lc3NhZ2UgfSA9IHt9O1xuICAjbWVzc2FnZVNuYXBzaG90OiBNZXNzYWdlIHwgdW5kZWZpbmVkO1xuICAjZmluYWxSdW46IFJ1biB8IHVuZGVmaW5lZDtcbiAgI2N1cnJlbnRDb250ZW50SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgI2N1cnJlbnRDb250ZW50OiBNZXNzYWdlQ29udGVudCB8IHVuZGVmaW5lZDtcbiAgI2N1cnJlbnRUb29sQ2FsbEluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICNjdXJyZW50VG9vbENhbGw6IFRvb2xDYWxsIHwgdW5kZWZpbmVkO1xuXG4gIC8vRm9yIGN1cnJlbnQgc25hcHNob3QgbWV0aG9kc1xuICAjY3VycmVudEV2ZW50OiBBc3Npc3RhbnRTdHJlYW1FdmVudCB8IHVuZGVmaW5lZDtcbiAgI2N1cnJlbnRSdW5TbmFwc2hvdDogUnVuIHwgdW5kZWZpbmVkO1xuICAjY3VycmVudFJ1blN0ZXBTbmFwc2hvdDogUnVucy5SdW5TdGVwIHwgdW5kZWZpbmVkO1xuXG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTogQXN5bmNJdGVyYXRvcjxBc3Npc3RhbnRTdHJlYW1FdmVudD4ge1xuICAgIGNvbnN0IHB1c2hRdWV1ZTogQXNzaXN0YW50U3RyZWFtRXZlbnRbXSA9IFtdO1xuICAgIGNvbnN0IHJlYWRRdWV1ZToge1xuICAgICAgcmVzb2x2ZTogKGNodW5rOiBBc3Npc3RhbnRTdHJlYW1FdmVudCB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcbiAgICAgIHJlamVjdDogKGVycjogdW5rbm93bikgPT4gdm9pZDtcbiAgICB9W10gPSBbXTtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuXG4gICAgLy9DYXRjaCBhbGwgZm9yIHBhc3NpbmcgYWxvbmcgYWxsIGV2ZW50c1xuICAgIHRoaXMub24oJ2V2ZW50JywgKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCByZWFkZXIgPSByZWFkUXVldWUuc2hpZnQoKTtcbiAgICAgIGlmIChyZWFkZXIpIHtcbiAgICAgICAgcmVhZGVyLnJlc29sdmUoZXZlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHVzaFF1ZXVlLnB1c2goZXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5vbignZW5kJywgKCkgPT4ge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICBmb3IgKGNvbnN0IHJlYWRlciBvZiByZWFkUXVldWUpIHtcbiAgICAgICAgcmVhZGVyLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICAgIHJlYWRRdWV1ZS5sZW5ndGggPSAwO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vbignYWJvcnQnLCAoZXJyKSA9PiB7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHJlYWRRdWV1ZSkge1xuICAgICAgICByZWFkZXIucmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgICByZWFkUXVldWUubGVuZ3RoID0gMDtcbiAgICB9KTtcblxuICAgIHRoaXMub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICBmb3IgKGNvbnN0IHJlYWRlciBvZiByZWFkUXVldWUpIHtcbiAgICAgICAgcmVhZGVyLnJlamVjdChlcnIpO1xuICAgICAgfVxuICAgICAgcmVhZFF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmV4dDogYXN5bmMgKCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8QXNzaXN0YW50U3RyZWFtRXZlbnQ+PiA9PiB7XG4gICAgICAgIGlmICghcHVzaFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxBc3Npc3RhbnRTdHJlYW1FdmVudCB8IHVuZGVmaW5lZD4oKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICAgICAgICAgIHJlYWRRdWV1ZS5wdXNoKHsgcmVzb2x2ZSwgcmVqZWN0IH0pLFxuICAgICAgICAgICkudGhlbigoY2h1bmspID0+IChjaHVuayA/IHsgdmFsdWU6IGNodW5rLCBkb25lOiBmYWxzZSB9IDogeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaHVuayA9IHB1c2hRdWV1ZS5zaGlmdCgpITtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGNodW5rLCBkb25lOiBmYWxzZSB9O1xuICAgICAgfSxcbiAgICAgIHJldHVybjogYXN5bmMgKCkgPT4ge1xuICAgICAgICB0aGlzLmFib3J0KCk7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tUmVhZGFibGVTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZVN0cmVhbSk6IEFzc2lzdGFudFN0cmVhbSB7XG4gICAgY29uc3QgcnVubmVyID0gbmV3IEFzc2lzdGFudFN0cmVhbSgpO1xuICAgIHJ1bm5lci5fcnVuKCgpID0+IHJ1bm5lci5fZnJvbVJlYWRhYmxlU3RyZWFtKHN0cmVhbSkpO1xuICAgIHJldHVybiBydW5uZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgX2Zyb21SZWFkYWJsZVN0cmVhbShcbiAgICByZWFkYWJsZVN0cmVhbTogUmVhZGFibGVTdHJlYW0sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8UnVuPiB7XG4gICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgfVxuICAgIHRoaXMuX2Nvbm5lY3RlZCgpO1xuICAgIGNvbnN0IHN0cmVhbSA9IFN0cmVhbS5mcm9tUmVhZGFibGVTdHJlYW08QXNzaXN0YW50U3RyZWFtRXZlbnQ+KHJlYWRhYmxlU3RyZWFtLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2Ygc3RyZWFtKSB7XG4gICAgICB0aGlzLiNhZGRFdmVudChldmVudCk7XG4gICAgfVxuICAgIGlmIChzdHJlYW0uY29udHJvbGxlci5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBBUElVc2VyQWJvcnRFcnJvcigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWRkUnVuKHRoaXMuI2VuZFJlcXVlc3QoKSk7XG4gIH1cblxuICB0b1JlYWRhYmxlU3RyZWFtKCk6IFJlYWRhYmxlU3RyZWFtIHtcbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyZWFtKHRoaXNbU3ltYm9sLmFzeW5jSXRlcmF0b3JdLmJpbmQodGhpcyksIHRoaXMuY29udHJvbGxlcik7XG4gICAgcmV0dXJuIHN0cmVhbS50b1JlYWRhYmxlU3RyZWFtKCk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVG9vbEFzc2lzdGFudFN0cmVhbShcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgcnVuczogUnVucyxcbiAgICBib2R5OiBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbSxcbiAgICBvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgY29uc3QgcnVubmVyID0gbmV3IEFzc2lzdGFudFN0cmVhbSgpO1xuICAgIHJ1bm5lci5fcnVuKCgpID0+XG4gICAgICBydW5uZXIuX3J1blRvb2xBc3Npc3RhbnRTdHJlYW0odGhyZWFkSWQsIHJ1bklkLCBydW5zLCBib2R5LCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnM6IHsgLi4ub3B0aW9ucz8uaGVhZGVycywgJ1gtU3RhaW5sZXNzLUhlbHBlci1NZXRob2QnOiAnc3RyZWFtJyB9LFxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gcnVubmVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIF9jcmVhdGVUb29sQXNzaXN0YW50U3RyZWFtKFxuICAgIHJ1bjogUnVucyxcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHRoaXMuY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5OiBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbWluZyA9IHsgLi4ucGFyYW1zLCBzdHJlYW06IHRydWUgfTtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBydW4uc3VibWl0VG9vbE91dHB1dHModGhyZWFkSWQsIHJ1bklkLCBib2R5LCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgc2lnbmFsOiB0aGlzLmNvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fY29ubmVjdGVkKCk7XG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGV2ZW50IG9mIHN0cmVhbSkge1xuICAgICAgdGhpcy4jYWRkRXZlbnQoZXZlbnQpO1xuICAgIH1cbiAgICBpZiAoc3RyZWFtLmNvbnRyb2xsZXIuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQVBJVXNlckFib3J0RXJyb3IoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYWRkUnVuKHRoaXMuI2VuZFJlcXVlc3QoKSk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVGhyZWFkQXNzaXN0YW50U3RyZWFtKFxuICAgIGJvZHk6IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2VTdHJlYW0sXG4gICAgdGhyZWFkOiBUaHJlYWRzLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKSB7XG4gICAgY29uc3QgcnVubmVyID0gbmV3IEFzc2lzdGFudFN0cmVhbSgpO1xuICAgIHJ1bm5lci5fcnVuKCgpID0+XG4gICAgICBydW5uZXIuX3RocmVhZEFzc2lzdGFudFN0cmVhbShib2R5LCB0aHJlYWQsIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgaGVhZGVyczogeyAuLi5vcHRpb25zPy5oZWFkZXJzLCAnWC1TdGFpbmxlc3MtSGVscGVyLU1ldGhvZCc6ICdzdHJlYW0nIH0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBydW5uZXI7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlQXNzaXN0YW50U3RyZWFtKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuczogUnVucyxcbiAgICBwYXJhbXM6IFJ1bkNyZWF0ZVBhcmFtc0Jhc2VTdHJlYW0sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBydW5uZXIgPSBuZXcgQXNzaXN0YW50U3RyZWFtKCk7XG4gICAgcnVubmVyLl9ydW4oKCkgPT5cbiAgICAgIHJ1bm5lci5fcnVuQXNzaXN0YW50U3RyZWFtKHRocmVhZElkLCBydW5zLCBwYXJhbXMsIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgaGVhZGVyczogeyAuLi5vcHRpb25zPy5oZWFkZXJzLCAnWC1TdGFpbmxlc3MtSGVscGVyLU1ldGhvZCc6ICdzdHJlYW0nIH0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBydW5uZXI7XG4gIH1cblxuICBjdXJyZW50RXZlbnQoKTogQXNzaXN0YW50U3RyZWFtRXZlbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNjdXJyZW50RXZlbnQ7XG4gIH1cblxuICBjdXJyZW50UnVuKCk6IFJ1biB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRSdW5TbmFwc2hvdDtcbiAgfVxuXG4gIGN1cnJlbnRNZXNzYWdlU25hcHNob3QoKTogTWVzc2FnZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI21lc3NhZ2VTbmFwc2hvdDtcbiAgfVxuXG4gIGN1cnJlbnRSdW5TdGVwU25hcHNob3QoKTogUnVucy5SdW5TdGVwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jY3VycmVudFJ1blN0ZXBTbmFwc2hvdDtcbiAgfVxuXG4gIGFzeW5jIGZpbmFsUnVuU3RlcHMoKTogUHJvbWlzZTxSdW5zLlJ1blN0ZXBbXT4ge1xuICAgIGF3YWl0IHRoaXMuZG9uZSgpO1xuXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy4jcnVuU3RlcFNuYXBzaG90cyk7XG4gIH1cblxuICBhc3luYyBmaW5hbE1lc3NhZ2VzKCk6IFByb21pc2U8TWVzc2FnZVtdPiB7XG4gICAgYXdhaXQgdGhpcy5kb25lKCk7XG5cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLiNtZXNzYWdlU25hcHNob3RzKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmFsUnVuKCk6IFByb21pc2U8UnVuPiB7XG4gICAgYXdhaXQgdGhpcy5kb25lKCk7XG4gICAgaWYgKCF0aGlzLiNmaW5hbFJ1bikgdGhyb3cgRXJyb3IoJ0ZpbmFsIHJ1biB3YXMgbm90IHJlY2VpdmVkLicpO1xuXG4gICAgcmV0dXJuIHRoaXMuI2ZpbmFsUnVuO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIF9jcmVhdGVUaHJlYWRBc3Npc3RhbnRTdHJlYW0oXG4gICAgdGhyZWFkOiBUaHJlYWRzLFxuICAgIHBhcmFtczogVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHRoaXMuY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5OiBSdW5DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSB7IC4uLnBhcmFtcywgc3RyZWFtOiB0cnVlIH07XG4gICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgdGhyZWFkLmNyZWF0ZUFuZFJ1bihib2R5LCB7IC4uLm9wdGlvbnMsIHNpZ25hbDogdGhpcy5jb250cm9sbGVyLnNpZ25hbCB9KTtcblxuICAgIHRoaXMuX2Nvbm5lY3RlZCgpO1xuXG4gICAgZm9yIGF3YWl0IChjb25zdCBldmVudCBvZiBzdHJlYW0pIHtcbiAgICAgIHRoaXMuI2FkZEV2ZW50KGV2ZW50KTtcbiAgICB9XG4gICAgaWYgKHN0cmVhbS5jb250cm9sbGVyLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgdGhyb3cgbmV3IEFQSVVzZXJBYm9ydEVycm9yKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2FkZFJ1bih0aGlzLiNlbmRSZXF1ZXN0KCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIF9jcmVhdGVBc3Npc3RhbnRTdHJlYW0oXG4gICAgcnVuOiBSdW5zLFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSdW5DcmVhdGVQYXJhbXNCYXNlLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPFJ1bj4ge1xuICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHRoaXMuY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdGhpcy5jb250cm9sbGVyLmFib3J0KCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHk6IFJ1bkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IHsgLi4ucGFyYW1zLCBzdHJlYW06IHRydWUgfTtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBydW4uY3JlYXRlKHRocmVhZElkLCBib2R5LCB7IC4uLm9wdGlvbnMsIHNpZ25hbDogdGhpcy5jb250cm9sbGVyLnNpZ25hbCB9KTtcblxuICAgIHRoaXMuX2Nvbm5lY3RlZCgpO1xuXG4gICAgZm9yIGF3YWl0IChjb25zdCBldmVudCBvZiBzdHJlYW0pIHtcbiAgICAgIHRoaXMuI2FkZEV2ZW50KGV2ZW50KTtcbiAgICB9XG4gICAgaWYgKHN0cmVhbS5jb250cm9sbGVyLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgdGhyb3cgbmV3IEFQSVVzZXJBYm9ydEVycm9yKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2FkZFJ1bih0aGlzLiNlbmRSZXF1ZXN0KCkpO1xuICB9XG5cbiAgI2FkZEV2ZW50KGV2ZW50OiBBc3Npc3RhbnRTdHJlYW1FdmVudCkge1xuICAgIGlmICh0aGlzLmVuZGVkKSByZXR1cm47XG5cbiAgICB0aGlzLiNjdXJyZW50RXZlbnQgPSBldmVudDtcblxuICAgIHRoaXMuI2hhbmRsZUV2ZW50KGV2ZW50KTtcblxuICAgIHN3aXRjaCAoZXZlbnQuZXZlbnQpIHtcbiAgICAgIGNhc2UgJ3RocmVhZC5jcmVhdGVkJzpcbiAgICAgICAgLy9ObyBhY3Rpb24gb24gdGhpcyBldmVudC5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uY3JlYXRlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnF1ZXVlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLmluX3Byb2dyZXNzJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4ucmVxdWlyZXNfYWN0aW9uJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uY29tcGxldGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uZmFpbGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uY2FuY2VsbGluZyc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLmNhbmNlbGxlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLmV4cGlyZWQnOlxuICAgICAgICB0aGlzLiNoYW5kbGVSdW4oZXZlbnQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmNyZWF0ZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmluX3Byb2dyZXNzJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5kZWx0YSc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuY29tcGxldGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5mYWlsZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmNhbmNlbGxlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuZXhwaXJlZCc6XG4gICAgICAgIHRoaXMuI2hhbmRsZVJ1blN0ZXAoZXZlbnQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuY3JlYXRlZCc6XG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5pbl9wcm9ncmVzcyc6XG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5kZWx0YSc6XG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5jb21wbGV0ZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuaW5jb21wbGV0ZSc6XG4gICAgICAgIHRoaXMuI2hhbmRsZU1lc3NhZ2UoZXZlbnQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAvL1RoaXMgaXMgaW5jbHVkZWQgZm9yIGNvbXBsZXRlbmVzcywgYnV0IGVycm9ycyBhcmUgcHJvY2Vzc2VkIGluIHRoZSBTU0UgZXZlbnQgcHJvY2Vzc2luZyBzbyB0aGlzIHNob3VsZCBub3Qgb2NjdXJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdFbmNvdW50ZXJlZCBhbiBlcnJvciBldmVudCBpbiBldmVudCBwcm9jZXNzaW5nIC0gZXJyb3JzIHNob3VsZCBiZSBwcm9jZXNzZWQgZWFybGllcicsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgI2VuZFJlcXVlc3QoKTogUnVuIHtcbiAgICBpZiAodGhpcy5lbmRlZCkge1xuICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGBzdHJlYW0gaGFzIGVuZGVkLCB0aGlzIHNob3VsZG4ndCBoYXBwZW5gKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuI2ZpbmFsUnVuKSB0aHJvdyBFcnJvcignRmluYWwgcnVuIGhhcyBub3QgYmVlbiByZWNlaXZlZCcpO1xuXG4gICAgcmV0dXJuIHRoaXMuI2ZpbmFsUnVuO1xuICB9XG5cbiAgI2hhbmRsZU1lc3NhZ2UoZXZlbnQ6IE1lc3NhZ2VTdHJlYW1FdmVudCkge1xuICAgIGNvbnN0IFthY2N1bXVsYXRlZE1lc3NhZ2UsIG5ld0NvbnRlbnRdID0gdGhpcy4jYWNjdW11bGF0ZU1lc3NhZ2UoZXZlbnQsIHRoaXMuI21lc3NhZ2VTbmFwc2hvdCk7XG4gICAgdGhpcy4jbWVzc2FnZVNuYXBzaG90ID0gYWNjdW11bGF0ZWRNZXNzYWdlO1xuICAgIHRoaXMuI21lc3NhZ2VTbmFwc2hvdHNbYWNjdW11bGF0ZWRNZXNzYWdlLmlkXSA9IGFjY3VtdWxhdGVkTWVzc2FnZTtcblxuICAgIGZvciAoY29uc3QgY29udGVudCBvZiBuZXdDb250ZW50KSB7XG4gICAgICBjb25zdCBzbmFwc2hvdENvbnRlbnQgPSBhY2N1bXVsYXRlZE1lc3NhZ2UuY29udGVudFtjb250ZW50LmluZGV4XTtcbiAgICAgIGlmIChzbmFwc2hvdENvbnRlbnQ/LnR5cGUgPT0gJ3RleHQnKSB7XG4gICAgICAgIHRoaXMuX2VtaXQoJ3RleHRDcmVhdGVkJywgc25hcHNob3RDb250ZW50LnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAoZXZlbnQuZXZlbnQpIHtcbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmNyZWF0ZWQnOlxuICAgICAgICB0aGlzLl9lbWl0KCdtZXNzYWdlQ3JlYXRlZCcsIGV2ZW50LmRhdGEpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuaW5fcHJvZ3Jlc3MnOlxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuZGVsdGEnOlxuICAgICAgICB0aGlzLl9lbWl0KCdtZXNzYWdlRGVsdGEnLCBldmVudC5kYXRhLmRlbHRhLCBhY2N1bXVsYXRlZE1lc3NhZ2UpO1xuXG4gICAgICAgIGlmIChldmVudC5kYXRhLmRlbHRhLmNvbnRlbnQpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRlbnQgb2YgZXZlbnQuZGF0YS5kZWx0YS5jb250ZW50KSB7XG4gICAgICAgICAgICAvL0lmIGl0IGlzIHRleHQgZGVsdGEsIGVtaXQgYSB0ZXh0IGRlbHRhIGV2ZW50XG4gICAgICAgICAgICBpZiAoY29udGVudC50eXBlID09ICd0ZXh0JyAmJiBjb250ZW50LnRleHQpIHtcbiAgICAgICAgICAgICAgbGV0IHRleHREZWx0YSA9IGNvbnRlbnQudGV4dDtcbiAgICAgICAgICAgICAgbGV0IHNuYXBzaG90ID0gYWNjdW11bGF0ZWRNZXNzYWdlLmNvbnRlbnRbY29udGVudC5pbmRleF07XG4gICAgICAgICAgICAgIGlmIChzbmFwc2hvdCAmJiBzbmFwc2hvdC50eXBlID09ICd0ZXh0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXQoJ3RleHREZWx0YScsIHRleHREZWx0YSwgc25hcHNob3QudGV4dCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1RoZSBzbmFwc2hvdCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZXh0IGRlbHRhIGlzIG5vdCB0ZXh0IG9yIG1pc3NpbmcnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29udGVudC5pbmRleCAhPSB0aGlzLiNjdXJyZW50Q29udGVudEluZGV4KSB7XG4gICAgICAgICAgICAgIC8vU2VlIGlmIHdlIGhhdmUgaW4gcHJvZ3Jlc3MgY29udGVudFxuICAgICAgICAgICAgICBpZiAodGhpcy4jY3VycmVudENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuI2N1cnJlbnRDb250ZW50LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0KCd0ZXh0RG9uZScsIHRoaXMuI2N1cnJlbnRDb250ZW50LnRleHQsIHRoaXMuI21lc3NhZ2VTbmFwc2hvdCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSAnaW1hZ2VfZmlsZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtaXQoJ2ltYWdlRmlsZURvbmUnLCB0aGlzLiNjdXJyZW50Q29udGVudC5pbWFnZV9maWxlLCB0aGlzLiNtZXNzYWdlU25hcHNob3QpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aGlzLiNjdXJyZW50Q29udGVudEluZGV4ID0gY29udGVudC5pbmRleDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy4jY3VycmVudENvbnRlbnQgPSBhY2N1bXVsYXRlZE1lc3NhZ2UuY29udGVudFtjb250ZW50LmluZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuY29tcGxldGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmluY29tcGxldGUnOlxuICAgICAgICAvL1dlIGVtaXQgdGhlIGxhdGVzdCBjb250ZW50IHdlIHdlcmUgd29ya2luZyBvbiBvbiBjb21wbGV0aW9uIChpbmNsdWRpbmcgaW5jb21wbGV0ZSlcbiAgICAgICAgaWYgKHRoaXMuI2N1cnJlbnRDb250ZW50SW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gZXZlbnQuZGF0YS5jb250ZW50W3RoaXMuI2N1cnJlbnRDb250ZW50SW5kZXhdO1xuICAgICAgICAgIGlmIChjdXJyZW50Q29udGVudCkge1xuICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50Q29udGVudC50eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ2ltYWdlX2ZpbGUnOlxuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXQoJ2ltYWdlRmlsZURvbmUnLCBjdXJyZW50Q29udGVudC5pbWFnZV9maWxlLCB0aGlzLiNtZXNzYWdlU25hcHNob3QpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0KCd0ZXh0RG9uZScsIGN1cnJlbnRDb250ZW50LnRleHQsIHRoaXMuI21lc3NhZ2VTbmFwc2hvdCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuI21lc3NhZ2VTbmFwc2hvdCkge1xuICAgICAgICAgIHRoaXMuX2VtaXQoJ21lc3NhZ2VEb25lJywgZXZlbnQuZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLiNtZXNzYWdlU25hcHNob3QgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgI2hhbmRsZVJ1blN0ZXAoZXZlbnQ6IFJ1blN0ZXBTdHJlYW1FdmVudCkge1xuICAgIGNvbnN0IGFjY3VtdWxhdGVkUnVuU3RlcCA9IHRoaXMuI2FjY3VtdWxhdGVSdW5TdGVwKGV2ZW50KTtcbiAgICB0aGlzLiNjdXJyZW50UnVuU3RlcFNuYXBzaG90ID0gYWNjdW11bGF0ZWRSdW5TdGVwO1xuXG4gICAgc3dpdGNoIChldmVudC5ldmVudCkge1xuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmNyZWF0ZWQnOlxuICAgICAgICB0aGlzLl9lbWl0KCdydW5TdGVwQ3JlYXRlZCcsIGV2ZW50LmRhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5kZWx0YSc6XG4gICAgICAgIGNvbnN0IGRlbHRhID0gZXZlbnQuZGF0YS5kZWx0YTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRlbHRhLnN0ZXBfZGV0YWlscyAmJlxuICAgICAgICAgIGRlbHRhLnN0ZXBfZGV0YWlscy50eXBlID09ICd0b29sX2NhbGxzJyAmJlxuICAgICAgICAgIGRlbHRhLnN0ZXBfZGV0YWlscy50b29sX2NhbGxzICYmXG4gICAgICAgICAgYWNjdW11bGF0ZWRSdW5TdGVwLnN0ZXBfZGV0YWlscy50eXBlID09ICd0b29sX2NhbGxzJ1xuICAgICAgICApIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHRvb2xDYWxsIG9mIGRlbHRhLnN0ZXBfZGV0YWlscy50b29sX2NhbGxzKSB7XG4gICAgICAgICAgICBpZiAodG9vbENhbGwuaW5kZXggPT0gdGhpcy4jY3VycmVudFRvb2xDYWxsSW5kZXgpIHtcbiAgICAgICAgICAgICAgdGhpcy5fZW1pdChcbiAgICAgICAgICAgICAgICAndG9vbENhbGxEZWx0YScsXG4gICAgICAgICAgICAgICAgdG9vbENhbGwsXG4gICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRSdW5TdGVwLnN0ZXBfZGV0YWlscy50b29sX2NhbGxzW3Rvb2xDYWxsLmluZGV4XSBhcyBUb29sQ2FsbCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLiNjdXJyZW50VG9vbENhbGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0KCd0b29sQ2FsbERvbmUnLCB0aGlzLiNjdXJyZW50VG9vbENhbGwpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy4jY3VycmVudFRvb2xDYWxsSW5kZXggPSB0b29sQ2FsbC5pbmRleDtcbiAgICAgICAgICAgICAgdGhpcy4jY3VycmVudFRvb2xDYWxsID0gYWNjdW11bGF0ZWRSdW5TdGVwLnN0ZXBfZGV0YWlscy50b29sX2NhbGxzW3Rvb2xDYWxsLmluZGV4XTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuI2N1cnJlbnRUb29sQ2FsbCkgdGhpcy5fZW1pdCgndG9vbENhbGxDcmVhdGVkJywgdGhpcy4jY3VycmVudFRvb2xDYWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lbWl0KCdydW5TdGVwRGVsdGEnLCBldmVudC5kYXRhLmRlbHRhLCBhY2N1bXVsYXRlZFJ1blN0ZXApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5jb21wbGV0ZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmZhaWxlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuY2FuY2VsbGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5leHBpcmVkJzpcbiAgICAgICAgdGhpcy4jY3VycmVudFJ1blN0ZXBTbmFwc2hvdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGV2ZW50LmRhdGEuc3RlcF9kZXRhaWxzO1xuICAgICAgICBpZiAoZGV0YWlscy50eXBlID09ICd0b29sX2NhbGxzJykge1xuICAgICAgICAgIGlmICh0aGlzLiNjdXJyZW50VG9vbENhbGwpIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXQoJ3Rvb2xDYWxsRG9uZScsIHRoaXMuI2N1cnJlbnRUb29sQ2FsbCBhcyBUb29sQ2FsbCk7XG4gICAgICAgICAgICB0aGlzLiNjdXJyZW50VG9vbENhbGwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2VtaXQoJ3J1blN0ZXBEb25lJywgZXZlbnQuZGF0YSwgYWNjdW11bGF0ZWRSdW5TdGVwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuaW5fcHJvZ3Jlc3MnOlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAjaGFuZGxlRXZlbnQoZXZlbnQ6IEFzc2lzdGFudFN0cmVhbUV2ZW50KSB7XG4gICAgdGhpcy4jZXZlbnRzLnB1c2goZXZlbnQpO1xuICAgIHRoaXMuX2VtaXQoJ2V2ZW50JywgZXZlbnQpO1xuICB9XG5cbiAgI2FjY3VtdWxhdGVSdW5TdGVwKGV2ZW50OiBSdW5TdGVwU3RyZWFtRXZlbnQpOiBSdW5zLlJ1blN0ZXAge1xuICAgIHN3aXRjaCAoZXZlbnQuZXZlbnQpIHtcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5jcmVhdGVkJzpcbiAgICAgICAgdGhpcy4jcnVuU3RlcFNuYXBzaG90c1tldmVudC5kYXRhLmlkXSA9IGV2ZW50LmRhdGE7XG4gICAgICAgIHJldHVybiBldmVudC5kYXRhO1xuXG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuZGVsdGEnOlxuICAgICAgICBsZXQgc25hcHNob3QgPSB0aGlzLiNydW5TdGVwU25hcHNob3RzW2V2ZW50LmRhdGEuaWRdIGFzIFJ1bnMuUnVuU3RlcDtcbiAgICAgICAgaWYgKCFzbmFwc2hvdCkge1xuICAgICAgICAgIHRocm93IEVycm9yKCdSZWNlaXZlZCBhIFJ1blN0ZXBEZWx0YSBiZWZvcmUgY3JlYXRpb24gb2YgYSBzbmFwc2hvdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRhdGEgPSBldmVudC5kYXRhO1xuXG4gICAgICAgIGlmIChkYXRhLmRlbHRhKSB7XG4gICAgICAgICAgY29uc3QgYWNjdW11bGF0ZWQgPSBBc3Npc3RhbnRTdHJlYW0uYWNjdW11bGF0ZURlbHRhKHNuYXBzaG90LCBkYXRhLmRlbHRhKSBhcyBSdW5zLlJ1blN0ZXA7XG4gICAgICAgICAgdGhpcy4jcnVuU3RlcFNuYXBzaG90c1tldmVudC5kYXRhLmlkXSA9IGFjY3VtdWxhdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuI3J1blN0ZXBTbmFwc2hvdHNbZXZlbnQuZGF0YS5pZF0gYXMgUnVucy5SdW5TdGVwO1xuXG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuY29tcGxldGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5mYWlsZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmNhbmNlbGxlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuZXhwaXJlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuaW5fcHJvZ3Jlc3MnOlxuICAgICAgICB0aGlzLiNydW5TdGVwU25hcHNob3RzW2V2ZW50LmRhdGEuaWRdID0gZXZlbnQuZGF0YTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuI3J1blN0ZXBTbmFwc2hvdHNbZXZlbnQuZGF0YS5pZF0pIHJldHVybiB0aGlzLiNydW5TdGVwU25hcHNob3RzW2V2ZW50LmRhdGEuaWRdIGFzIFJ1bnMuUnVuU3RlcDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNuYXBzaG90IGF2YWlsYWJsZScpO1xuICB9XG5cbiAgI2FjY3VtdWxhdGVNZXNzYWdlKFxuICAgIGV2ZW50OiBBc3Npc3RhbnRTdHJlYW1FdmVudCxcbiAgICBzbmFwc2hvdDogTWVzc2FnZSB8IHVuZGVmaW5lZCxcbiAgKTogW01lc3NhZ2UsIE1lc3NhZ2VDb250ZW50RGVsdGFbXV0ge1xuICAgIGxldCBuZXdDb250ZW50OiBNZXNzYWdlQ29udGVudERlbHRhW10gPSBbXTtcblxuICAgIHN3aXRjaCAoZXZlbnQuZXZlbnQpIHtcbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmNyZWF0ZWQnOlxuICAgICAgICAvL09uIGNyZWF0aW9uIHRoZSBzbmFwc2hvdCBpcyBqdXN0IHRoZSBpbml0aWFsIG1lc3NhZ2VcbiAgICAgICAgcmV0dXJuIFtldmVudC5kYXRhLCBuZXdDb250ZW50XTtcblxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuZGVsdGEnOlxuICAgICAgICBpZiAoIXNuYXBzaG90KSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAnUmVjZWl2ZWQgYSBkZWx0YSB3aXRoIG5vIGV4aXN0aW5nIHNuYXBzaG90ICh0aGVyZSBzaG91bGQgYmUgb25lIGZyb20gbWVzc2FnZSBjcmVhdGlvbiknLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGF0YSA9IGV2ZW50LmRhdGE7XG5cbiAgICAgICAgLy9JZiB0aGlzIGRlbHRhIGRvZXMgbm90IGhhdmUgY29udGVudCwgbm90aGluZyB0byBwcm9jZXNzXG4gICAgICAgIGlmIChkYXRhLmRlbHRhLmNvbnRlbnQpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRlbnRFbGVtZW50IG9mIGRhdGEuZGVsdGEuY29udGVudCkge1xuICAgICAgICAgICAgaWYgKGNvbnRlbnRFbGVtZW50LmluZGV4IGluIHNuYXBzaG90LmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgbGV0IGN1cnJlbnRDb250ZW50ID0gc25hcHNob3QuY29udGVudFtjb250ZW50RWxlbWVudC5pbmRleF07XG4gICAgICAgICAgICAgIHNuYXBzaG90LmNvbnRlbnRbY29udGVudEVsZW1lbnQuaW5kZXhdID0gdGhpcy4jYWNjdW11bGF0ZUNvbnRlbnQoXG4gICAgICAgICAgICAgICAgY29udGVudEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgY3VycmVudENvbnRlbnQsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzbmFwc2hvdC5jb250ZW50W2NvbnRlbnRFbGVtZW50LmluZGV4XSA9IGNvbnRlbnRFbGVtZW50IGFzIE1lc3NhZ2VDb250ZW50O1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IGVsZW1lbnRcbiAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKGNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW3NuYXBzaG90LCBuZXdDb250ZW50XTtcblxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuaW5fcHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuY29tcGxldGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmluY29tcGxldGUnOlxuICAgICAgICAvL05vIGNoYW5nZXMgb24gb3RoZXIgdGhyZWFkIGV2ZW50c1xuICAgICAgICBpZiAoc25hcHNob3QpIHtcbiAgICAgICAgICByZXR1cm4gW3NuYXBzaG90LCBuZXdDb250ZW50XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignUmVjZWl2ZWQgdGhyZWFkIG1lc3NhZ2UgZXZlbnQgd2l0aCBubyBleGlzdGluZyBzbmFwc2hvdCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IEVycm9yKCdUcmllZCB0byBhY2N1bXVsYXRlIGEgbm9uLW1lc3NhZ2UgZXZlbnQnKTtcbiAgfVxuXG4gICNhY2N1bXVsYXRlQ29udGVudChcbiAgICBjb250ZW50RWxlbWVudDogTWVzc2FnZUNvbnRlbnREZWx0YSxcbiAgICBjdXJyZW50Q29udGVudDogTWVzc2FnZUNvbnRlbnQgfCB1bmRlZmluZWQsXG4gICk6IFRleHRDb250ZW50QmxvY2sgfCBJbWFnZUZpbGVDb250ZW50QmxvY2sge1xuICAgIHJldHVybiBBc3Npc3RhbnRTdHJlYW0uYWNjdW11bGF0ZURlbHRhKGN1cnJlbnRDb250ZW50IGFzIHVua25vd24gYXMgUmVjb3JkPGFueSwgYW55PiwgY29udGVudEVsZW1lbnQpIGFzXG4gICAgICB8IFRleHRDb250ZW50QmxvY2tcbiAgICAgIHwgSW1hZ2VGaWxlQ29udGVudEJsb2NrO1xuICB9XG5cbiAgc3RhdGljIGFjY3VtdWxhdGVEZWx0YShhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIGRlbHRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgZm9yIChjb25zdCBba2V5LCBkZWx0YVZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZWx0YSkpIHtcbiAgICAgIGlmICghYWNjLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgYWNjW2tleV0gPSBkZWx0YVZhbHVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IGFjY1ZhbHVlID0gYWNjW2tleV07XG4gICAgICBpZiAoYWNjVmFsdWUgPT09IG51bGwgfHwgYWNjVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY2Nba2V5XSA9IGRlbHRhVmFsdWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBkb24ndCBhY2N1bXVsYXRlIHRoZXNlIHNwZWNpYWwgcHJvcGVydGllc1xuICAgICAgaWYgKGtleSA9PT0gJ2luZGV4JyB8fCBrZXkgPT09ICd0eXBlJykge1xuICAgICAgICBhY2Nba2V5XSA9IGRlbHRhVmFsdWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUeXBlLXNwZWNpZmljIGFjY3VtdWxhdGlvbiBsb2dpY1xuICAgICAgaWYgKHR5cGVvZiBhY2NWYWx1ZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGRlbHRhVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGFjY1ZhbHVlICs9IGRlbHRhVmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhY2NWYWx1ZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGRlbHRhVmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGFjY1ZhbHVlICs9IGRlbHRhVmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKENvcmUuaXNPYmooYWNjVmFsdWUpICYmIENvcmUuaXNPYmooZGVsdGFWYWx1ZSkpIHtcbiAgICAgICAgYWNjVmFsdWUgPSB0aGlzLmFjY3VtdWxhdGVEZWx0YShhY2NWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBkZWx0YVZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFjY1ZhbHVlKSAmJiBBcnJheS5pc0FycmF5KGRlbHRhVmFsdWUpKSB7XG4gICAgICAgIGlmIChhY2NWYWx1ZS5ldmVyeSgoeCkgPT4gdHlwZW9mIHggPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB4ID09PSAnbnVtYmVyJykpIHtcbiAgICAgICAgICBhY2NWYWx1ZS5wdXNoKC4uLmRlbHRhVmFsdWUpOyAvLyBVc2Ugc3ByZWFkIHN5bnRheCBmb3IgZWZmaWNpZW50IGFkZGl0aW9uXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IEVycm9yKGBVbmhhbmRsZWQgcmVjb3JkIHR5cGU6ICR7a2V5fSwgZGVsdGFWYWx1ZTogJHtkZWx0YVZhbHVlfSwgYWNjVmFsdWU6ICR7YWNjVmFsdWV9YCk7XG4gICAgICB9XG4gICAgICBhY2Nba2V5XSA9IGFjY1ZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH1cblxuICAjaGFuZGxlUnVuKGV2ZW50OiBSdW5TdHJlYW1FdmVudCkge1xuICAgIHRoaXMuI2N1cnJlbnRSdW5TbmFwc2hvdCA9IGV2ZW50LmRhdGE7XG4gICAgc3dpdGNoIChldmVudC5ldmVudCkge1xuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5jcmVhdGVkJzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnF1ZXVlZCc6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5pbl9wcm9ncmVzcyc6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5yZXF1aXJlc19hY3Rpb24nOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5jYW5jZWxsZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5mYWlsZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5jb21wbGV0ZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5leHBpcmVkJzpcbiAgICAgICAgdGhpcy4jZmluYWxSdW4gPSBldmVudC5kYXRhO1xuICAgICAgICBpZiAodGhpcy4jY3VycmVudFRvb2xDYWxsKSB7XG4gICAgICAgICAgdGhpcy5fZW1pdCgndG9vbENhbGxEb25lJywgdGhpcy4jY3VycmVudFRvb2xDYWxsKTtcbiAgICAgICAgICB0aGlzLiNjdXJyZW50VG9vbENhbGwgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0aHJlYWQucnVuLmNhbmNlbGxpbmcnOlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZSc7XG5pbXBvcnQgeyBpc1JlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgKiBhcyBNZXNzYWdlc0FQSSBmcm9tICcuL21lc3NhZ2VzJztcbmltcG9ydCAqIGFzIEFzc2lzdGFudHNBUEkgZnJvbSAnLi4vYXNzaXN0YW50cyc7XG5pbXBvcnQgeyBDdXJzb3JQYWdlLCB0eXBlIEN1cnNvclBhZ2VQYXJhbXMgfSBmcm9tICcuLi8uLi8uLi9wYWdpbmF0aW9uJztcblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbWVzc2FnZS5cbiAgICovXG4gIGNyZWF0ZShcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIGJvZHk6IE1lc3NhZ2VDcmVhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxNZXNzYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvdGhyZWFkcy8ke3RocmVhZElkfS9tZXNzYWdlc2AsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBhIG1lc3NhZ2UuXG4gICAqL1xuICByZXRyaWV2ZSh0aHJlYWRJZDogc3RyaW5nLCBtZXNzYWdlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8TWVzc2FnZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvdGhyZWFkcy8ke3RocmVhZElkfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RpZmllcyBhIG1lc3NhZ2UuXG4gICAqL1xuICB1cGRhdGUoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBtZXNzYWdlSWQ6IHN0cmluZyxcbiAgICBib2R5OiBNZXNzYWdlVXBkYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8TWVzc2FnZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL3RocmVhZHMvJHt0aHJlYWRJZH0vbWVzc2FnZXMvJHttZXNzYWdlSWR9YCwge1xuICAgICAgYm9keSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIG1lc3NhZ2VzIGZvciBhIGdpdmVuIHRocmVhZC5cbiAgICovXG4gIGxpc3QoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBxdWVyeT86IE1lc3NhZ2VMaXN0UGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPE1lc3NhZ2VzUGFnZSwgTWVzc2FnZT47XG4gIGxpc3QodGhyZWFkSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLlBhZ2VQcm9taXNlPE1lc3NhZ2VzUGFnZSwgTWVzc2FnZT47XG4gIGxpc3QoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBxdWVyeTogTWVzc2FnZUxpc3RQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8TWVzc2FnZXNQYWdlLCBNZXNzYWdlPiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0KHRocmVhZElkLCB7fSwgcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoYC90aHJlYWRzLyR7dGhyZWFkSWR9L21lc3NhZ2VzYCwgTWVzc2FnZXNQYWdlLCB7XG4gICAgICBxdWVyeSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSBtZXNzYWdlLlxuICAgKi9cbiAgZGVsKHRocmVhZElkOiBzdHJpbmcsIG1lc3NhZ2VJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxNZXNzYWdlRGVsZXRlZD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZGVsZXRlKGAvdGhyZWFkcy8ke3RocmVhZElkfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWVzc2FnZXNQYWdlIGV4dGVuZHMgQ3Vyc29yUGFnZTxNZXNzYWdlPiB7fVxuXG4vKipcbiAqIEEgY2l0YXRpb24gd2l0aGluIHRoZSBtZXNzYWdlIHRoYXQgcG9pbnRzIHRvIGEgc3BlY2lmaWMgcXVvdGUgZnJvbSBhIHNwZWNpZmljXG4gKiBGaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaXN0YW50IG9yIHRoZSBtZXNzYWdlLiBHZW5lcmF0ZWQgd2hlbiB0aGUgYXNzaXN0YW50XG4gKiB1c2VzIHRoZSBcImZpbGVfc2VhcmNoXCIgdG9vbCB0byBzZWFyY2ggZmlsZXMuXG4gKi9cbmV4cG9ydCB0eXBlIEFubm90YXRpb24gPSBGaWxlQ2l0YXRpb25Bbm5vdGF0aW9uIHwgRmlsZVBhdGhBbm5vdGF0aW9uO1xuXG4vKipcbiAqIEEgY2l0YXRpb24gd2l0aGluIHRoZSBtZXNzYWdlIHRoYXQgcG9pbnRzIHRvIGEgc3BlY2lmaWMgcXVvdGUgZnJvbSBhIHNwZWNpZmljXG4gKiBGaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaXN0YW50IG9yIHRoZSBtZXNzYWdlLiBHZW5lcmF0ZWQgd2hlbiB0aGUgYXNzaXN0YW50XG4gKiB1c2VzIHRoZSBcImZpbGVfc2VhcmNoXCIgdG9vbCB0byBzZWFyY2ggZmlsZXMuXG4gKi9cbmV4cG9ydCB0eXBlIEFubm90YXRpb25EZWx0YSA9IEZpbGVDaXRhdGlvbkRlbHRhQW5ub3RhdGlvbiB8IEZpbGVQYXRoRGVsdGFBbm5vdGF0aW9uO1xuXG4vKipcbiAqIEEgY2l0YXRpb24gd2l0aGluIHRoZSBtZXNzYWdlIHRoYXQgcG9pbnRzIHRvIGEgc3BlY2lmaWMgcXVvdGUgZnJvbSBhIHNwZWNpZmljXG4gKiBGaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaXN0YW50IG9yIHRoZSBtZXNzYWdlLiBHZW5lcmF0ZWQgd2hlbiB0aGUgYXNzaXN0YW50XG4gKiB1c2VzIHRoZSBcImZpbGVfc2VhcmNoXCIgdG9vbCB0byBzZWFyY2ggZmlsZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUNpdGF0aW9uQW5ub3RhdGlvbiB7XG4gIGVuZF9pbmRleDogbnVtYmVyO1xuXG4gIGZpbGVfY2l0YXRpb246IEZpbGVDaXRhdGlvbkFubm90YXRpb24uRmlsZUNpdGF0aW9uO1xuXG4gIHN0YXJ0X2luZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IGluIHRoZSBtZXNzYWdlIGNvbnRlbnQgdGhhdCBuZWVkcyB0byBiZSByZXBsYWNlZC5cbiAgICovXG4gIHRleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogQWx3YXlzIGBmaWxlX2NpdGF0aW9uYC5cbiAgICovXG4gIHR5cGU6ICdmaWxlX2NpdGF0aW9uJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWxlQ2l0YXRpb25Bbm5vdGF0aW9uIHtcbiAgZXhwb3J0IGludGVyZmFjZSBGaWxlQ2l0YXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgc3BlY2lmaWMgRmlsZSB0aGUgY2l0YXRpb24gaXMgZnJvbS5cbiAgICAgKi9cbiAgICBmaWxlX2lkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lmaWMgcXVvdGUgaW4gdGhlIGZpbGUuXG4gICAgICovXG4gICAgcXVvdGU6IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIEEgY2l0YXRpb24gd2l0aGluIHRoZSBtZXNzYWdlIHRoYXQgcG9pbnRzIHRvIGEgc3BlY2lmaWMgcXVvdGUgZnJvbSBhIHNwZWNpZmljXG4gKiBGaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaXN0YW50IG9yIHRoZSBtZXNzYWdlLiBHZW5lcmF0ZWQgd2hlbiB0aGUgYXNzaXN0YW50XG4gKiB1c2VzIHRoZSBcImZpbGVfc2VhcmNoXCIgdG9vbCB0byBzZWFyY2ggZmlsZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUNpdGF0aW9uRGVsdGFBbm5vdGF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiB0aGUgYW5ub3RhdGlvbiBpbiB0aGUgdGV4dCBjb250ZW50IHBhcnQuXG4gICAqL1xuICBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYGZpbGVfY2l0YXRpb25gLlxuICAgKi9cbiAgdHlwZTogJ2ZpbGVfY2l0YXRpb24nO1xuXG4gIGVuZF9pbmRleD86IG51bWJlcjtcblxuICBmaWxlX2NpdGF0aW9uPzogRmlsZUNpdGF0aW9uRGVsdGFBbm5vdGF0aW9uLkZpbGVDaXRhdGlvbjtcblxuICBzdGFydF9pbmRleD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHRleHQgaW4gdGhlIG1lc3NhZ2UgY29udGVudCB0aGF0IG5lZWRzIHRvIGJlIHJlcGxhY2VkLlxuICAgKi9cbiAgdGV4dD86IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWxlQ2l0YXRpb25EZWx0YUFubm90YXRpb24ge1xuICBleHBvcnQgaW50ZXJmYWNlIEZpbGVDaXRhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBzcGVjaWZpYyBGaWxlIHRoZSBjaXRhdGlvbiBpcyBmcm9tLlxuICAgICAqL1xuICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lmaWMgcXVvdGUgaW4gdGhlIGZpbGUuXG4gICAgICovXG4gICAgcXVvdGU/OiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBBIFVSTCBmb3IgdGhlIGZpbGUgdGhhdCdzIGdlbmVyYXRlZCB3aGVuIHRoZSBhc3Npc3RhbnQgdXNlZCB0aGVcbiAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHRvIGdlbmVyYXRlIGEgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlUGF0aEFubm90YXRpb24ge1xuICBlbmRfaW5kZXg6IG51bWJlcjtcblxuICBmaWxlX3BhdGg6IEZpbGVQYXRoQW5ub3RhdGlvbi5GaWxlUGF0aDtcblxuICBzdGFydF9pbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCBpbiB0aGUgbWVzc2FnZSBjb250ZW50IHRoYXQgbmVlZHMgdG8gYmUgcmVwbGFjZWQuXG4gICAqL1xuICB0ZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFsd2F5cyBgZmlsZV9wYXRoYC5cbiAgICovXG4gIHR5cGU6ICdmaWxlX3BhdGgnO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpbGVQYXRoQW5ub3RhdGlvbiB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVBhdGgge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZmlsZSB0aGF0IHdhcyBnZW5lcmF0ZWQuXG4gICAgICovXG4gICAgZmlsZV9pZDogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogQSBVUkwgZm9yIHRoZSBmaWxlIHRoYXQncyBnZW5lcmF0ZWQgd2hlbiB0aGUgYXNzaXN0YW50IHVzZWQgdGhlXG4gKiBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCB0byBnZW5lcmF0ZSBhIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVBhdGhEZWx0YUFubm90YXRpb24ge1xuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSBhbm5vdGF0aW9uIGluIHRoZSB0ZXh0IGNvbnRlbnQgcGFydC5cbiAgICovXG4gIGluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEFsd2F5cyBgZmlsZV9wYXRoYC5cbiAgICovXG4gIHR5cGU6ICdmaWxlX3BhdGgnO1xuXG4gIGVuZF9pbmRleD86IG51bWJlcjtcblxuICBmaWxlX3BhdGg/OiBGaWxlUGF0aERlbHRhQW5ub3RhdGlvbi5GaWxlUGF0aDtcblxuICBzdGFydF9pbmRleD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHRleHQgaW4gdGhlIG1lc3NhZ2UgY29udGVudCB0aGF0IG5lZWRzIHRvIGJlIHJlcGxhY2VkLlxuICAgKi9cbiAgdGV4dD86IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWxlUGF0aERlbHRhQW5ub3RhdGlvbiB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVBhdGgge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZmlsZSB0aGF0IHdhcyBnZW5lcmF0ZWQuXG4gICAgICovXG4gICAgZmlsZV9pZD86IHN0cmluZztcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlRmlsZSB7XG4gIC8qKlxuICAgKiBUaGUgW0ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEIG9mIHRoZSBpbWFnZVxuICAgKiBpbiB0aGUgbWVzc2FnZSBjb250ZW50LiBTZXQgYHB1cnBvc2U9XCJ2aXNpb25cImAgd2hlbiB1cGxvYWRpbmcgdGhlIEZpbGUgaWYgeW91XG4gICAqIG5lZWQgdG8gbGF0ZXIgZGlzcGxheSB0aGUgZmlsZSBjb250ZW50LlxuICAgKi9cbiAgZmlsZV9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGRldGFpbCBsZXZlbCBvZiB0aGUgaW1hZ2UgaWYgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLiBgbG93YCB1c2VzXG4gICAqIGZld2VyIHRva2VucywgeW91IGNhbiBvcHQgaW4gdG8gaGlnaCByZXNvbHV0aW9uIHVzaW5nIGBoaWdoYC5cbiAgICovXG4gIGRldGFpbD86ICdhdXRvJyB8ICdsb3cnIHwgJ2hpZ2gnO1xufVxuXG4vKipcbiAqIFJlZmVyZW5jZXMgYW4gaW1hZ2UgW0ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpXG4gKiBpbiB0aGUgY29udGVudCBvZiBhIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VGaWxlQ29udGVudEJsb2NrIHtcbiAgaW1hZ2VfZmlsZTogSW1hZ2VGaWxlO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYGltYWdlX2ZpbGVgLlxuICAgKi9cbiAgdHlwZTogJ2ltYWdlX2ZpbGUnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlRmlsZURlbHRhIHtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZGV0YWlsIGxldmVsIG9mIHRoZSBpbWFnZSBpZiBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuIGBsb3dgIHVzZXNcbiAgICogZmV3ZXIgdG9rZW5zLCB5b3UgY2FuIG9wdCBpbiB0byBoaWdoIHJlc29sdXRpb24gdXNpbmcgYGhpZ2hgLlxuICAgKi9cbiAgZGV0YWlsPzogJ2F1dG8nIHwgJ2xvdycgfCAnaGlnaCc7XG5cbiAgLyoqXG4gICAqIFRoZSBbRmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSUQgb2YgdGhlIGltYWdlXG4gICAqIGluIHRoZSBtZXNzYWdlIGNvbnRlbnQuIFNldCBgcHVycG9zZT1cInZpc2lvblwiYCB3aGVuIHVwbG9hZGluZyB0aGUgRmlsZSBpZiB5b3VcbiAgICogbmVlZCB0byBsYXRlciBkaXNwbGF5IHRoZSBmaWxlIGNvbnRlbnQuXG4gICAqL1xuICBmaWxlX2lkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlZmVyZW5jZXMgYW4gaW1hZ2UgW0ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpXG4gKiBpbiB0aGUgY29udGVudCBvZiBhIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VGaWxlRGVsdGFCbG9jayB7XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgdGhlIGNvbnRlbnQgcGFydCBpbiB0aGUgbWVzc2FnZS5cbiAgICovXG4gIGluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEFsd2F5cyBgaW1hZ2VfZmlsZWAuXG4gICAqL1xuICB0eXBlOiAnaW1hZ2VfZmlsZSc7XG5cbiAgaW1hZ2VfZmlsZT86IEltYWdlRmlsZURlbHRhO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlVVJMIHtcbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBVUkwgb2YgdGhlIGltYWdlLCBtdXN0IGJlIGEgc3VwcG9ydGVkIGltYWdlIHR5cGVzOiBqcGVnLCBqcGcsIHBuZyxcbiAgICogZ2lmLCB3ZWJwLlxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZGV0YWlsIGxldmVsIG9mIHRoZSBpbWFnZS4gYGxvd2AgdXNlcyBmZXdlciB0b2tlbnMsIHlvdSBjYW4gb3B0IGluXG4gICAqIHRvIGhpZ2ggcmVzb2x1dGlvbiB1c2luZyBgaGlnaGAuIERlZmF1bHQgdmFsdWUgaXMgYGF1dG9gXG4gICAqL1xuICBkZXRhaWw/OiAnYXV0bycgfCAnbG93JyB8ICdoaWdoJztcbn1cblxuLyoqXG4gKiBSZWZlcmVuY2VzIGFuIGltYWdlIFVSTCBpbiB0aGUgY29udGVudCBvZiBhIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VVUkxDb250ZW50QmxvY2sge1xuICBpbWFnZV91cmw6IEltYWdlVVJMO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgY29udGVudCBwYXJ0LlxuICAgKi9cbiAgdHlwZTogJ2ltYWdlX3VybCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VVUkxEZWx0YSB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGRldGFpbCBsZXZlbCBvZiB0aGUgaW1hZ2UuIGBsb3dgIHVzZXMgZmV3ZXIgdG9rZW5zLCB5b3UgY2FuIG9wdCBpblxuICAgKiB0byBoaWdoIHJlc29sdXRpb24gdXNpbmcgYGhpZ2hgLlxuICAgKi9cbiAgZGV0YWlsPzogJ2F1dG8nIHwgJ2xvdycgfCAnaGlnaCc7XG5cbiAgLyoqXG4gICAqIFRoZSBVUkwgb2YgdGhlIGltYWdlLCBtdXN0IGJlIGEgc3VwcG9ydGVkIGltYWdlIHR5cGVzOiBqcGVnLCBqcGcsIHBuZywgZ2lmLFxuICAgKiB3ZWJwLlxuICAgKi9cbiAgdXJsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlZmVyZW5jZXMgYW4gaW1hZ2UgVVJMIGluIHRoZSBjb250ZW50IG9mIGEgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbWFnZVVSTERlbHRhQmxvY2sge1xuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSBjb250ZW50IHBhcnQgaW4gdGhlIG1lc3NhZ2UuXG4gICAqL1xuICBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYGltYWdlX3VybGAuXG4gICAqL1xuICB0eXBlOiAnaW1hZ2VfdXJsJztcblxuICBpbWFnZV91cmw/OiBJbWFnZVVSTERlbHRhO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIHdpdGhpbiBhXG4gKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiBhcHBsaWNhYmxlLCB0aGUgSUQgb2YgdGhlXG4gICAqIFthc3Npc3RhbnRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cykgdGhhdFxuICAgKiBhdXRob3JlZCB0aGlzIG1lc3NhZ2UuXG4gICAqL1xuICBhc3Npc3RhbnRfaWQ6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBmaWxlcyBhdHRhY2hlZCB0byB0aGUgbWVzc2FnZSwgYW5kIHRoZSB0b29scyB0aGV5IHdlcmUgYWRkZWQgdG8uXG4gICAqL1xuICBhdHRhY2htZW50czogQXJyYXk8TWVzc2FnZS5BdHRhY2htZW50PiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIG1lc3NhZ2Ugd2FzIGNvbXBsZXRlZC5cbiAgICovXG4gIGNvbXBsZXRlZF9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UgaW4gYXJyYXkgb2YgdGV4dCBhbmQvb3IgaW1hZ2VzLlxuICAgKi9cbiAgY29udGVudDogQXJyYXk8TWVzc2FnZUNvbnRlbnQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBtZXNzYWdlIHdhcyBjcmVhdGVkLlxuICAgKi9cbiAgY3JlYXRlZF9hdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBtZXNzYWdlIHdhcyBtYXJrZWQgYXMgaW5jb21wbGV0ZS5cbiAgICovXG4gIGluY29tcGxldGVfYXQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE9uIGFuIGluY29tcGxldGUgbWVzc2FnZSwgZGV0YWlscyBhYm91dCB3aHkgdGhlIG1lc3NhZ2UgaXMgaW5jb21wbGV0ZS5cbiAgICovXG4gIGluY29tcGxldGVfZGV0YWlsczogTWVzc2FnZS5JbmNvbXBsZXRlRGV0YWlscyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhOiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYHRocmVhZC5tZXNzYWdlYC5cbiAgICovXG4gIG9iamVjdDogJ3RocmVhZC5tZXNzYWdlJztcblxuICAvKipcbiAgICogVGhlIGVudGl0eSB0aGF0IHByb2R1Y2VkIHRoZSBtZXNzYWdlLiBPbmUgb2YgYHVzZXJgIG9yIGBhc3Npc3RhbnRgLlxuICAgKi9cbiAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zKVxuICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGNyZWF0aW9uIG9mIHRoaXMgbWVzc2FnZS4gVmFsdWUgaXMgYG51bGxgIHdoZW4gbWVzc2FnZXMgYXJlXG4gICAqIGNyZWF0ZWQgbWFudWFsbHkgdXNpbmcgdGhlIGNyZWF0ZSBtZXNzYWdlIG9yIGNyZWF0ZSB0aHJlYWQgZW5kcG9pbnRzLlxuICAgKi9cbiAgcnVuX2lkOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBtZXNzYWdlLCB3aGljaCBjYW4gYmUgZWl0aGVyIGBpbl9wcm9ncmVzc2AsIGBpbmNvbXBsZXRlYCwgb3JcbiAgICogYGNvbXBsZXRlZGAuXG4gICAqL1xuICBzdGF0dXM6ICdpbl9wcm9ncmVzcycgfCAnaW5jb21wbGV0ZScgfCAnY29tcGxldGVkJztcblxuICAvKipcbiAgICogVGhlIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykgSUQgdGhhdFxuICAgKiB0aGlzIG1lc3NhZ2UgYmVsb25ncyB0by5cbiAgICovXG4gIHRocmVhZF9pZDogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2Uge1xuICBleHBvcnQgaW50ZXJmYWNlIEF0dGFjaG1lbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZmlsZSB0byBhdHRhY2ggdG8gdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgZmlsZV9pZD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSB0b29scyB0byBhZGQgdGhpcyBmaWxlIHRvLlxuICAgICAqL1xuICAgIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbD47XG4gIH1cblxuICAvKipcbiAgICogT24gYW4gaW5jb21wbGV0ZSBtZXNzYWdlLCBkZXRhaWxzIGFib3V0IHdoeSB0aGUgbWVzc2FnZSBpcyBpbmNvbXBsZXRlLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBJbmNvbXBsZXRlRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbiB0aGUgbWVzc2FnZSBpcyBpbmNvbXBsZXRlLlxuICAgICAqL1xuICAgIHJlYXNvbjogJ2NvbnRlbnRfZmlsdGVyJyB8ICdtYXhfdG9rZW5zJyB8ICdydW5fY2FuY2VsbGVkJyB8ICdydW5fZXhwaXJlZCcgfCAncnVuX2ZhaWxlZCc7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWZlcmVuY2VzIGFuIGltYWdlIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKVxuICogaW4gdGhlIGNvbnRlbnQgb2YgYSBtZXNzYWdlLlxuICovXG5leHBvcnQgdHlwZSBNZXNzYWdlQ29udGVudCA9IEltYWdlRmlsZUNvbnRlbnRCbG9jayB8IEltYWdlVVJMQ29udGVudEJsb2NrIHwgVGV4dENvbnRlbnRCbG9jaztcblxuLyoqXG4gKiBSZWZlcmVuY2VzIGFuIGltYWdlIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKVxuICogaW4gdGhlIGNvbnRlbnQgb2YgYSBtZXNzYWdlLlxuICovXG5leHBvcnQgdHlwZSBNZXNzYWdlQ29udGVudERlbHRhID0gSW1hZ2VGaWxlRGVsdGFCbG9jayB8IFRleHREZWx0YUJsb2NrIHwgSW1hZ2VVUkxEZWx0YUJsb2NrO1xuXG4vKipcbiAqIFJlZmVyZW5jZXMgYW4gaW1hZ2UgW0ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpXG4gKiBpbiB0aGUgY29udGVudCBvZiBhIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VDb250ZW50UGFydFBhcmFtID0gSW1hZ2VGaWxlQ29udGVudEJsb2NrIHwgSW1hZ2VVUkxDb250ZW50QmxvY2sgfCBUZXh0Q29udGVudEJsb2NrUGFyYW07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZURlbGV0ZWQge1xuICBpZDogc3RyaW5nO1xuXG4gIGRlbGV0ZWQ6IGJvb2xlYW47XG5cbiAgb2JqZWN0OiAndGhyZWFkLm1lc3NhZ2UuZGVsZXRlZCc7XG59XG5cbi8qKlxuICogVGhlIGRlbHRhIGNvbnRhaW5pbmcgdGhlIGZpZWxkcyB0aGF0IGhhdmUgY2hhbmdlZCBvbiB0aGUgTWVzc2FnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlRGVsdGEge1xuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UgaW4gYXJyYXkgb2YgdGV4dCBhbmQvb3IgaW1hZ2VzLlxuICAgKi9cbiAgY29udGVudD86IEFycmF5PE1lc3NhZ2VDb250ZW50RGVsdGE+O1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHRoYXQgcHJvZHVjZWQgdGhlIG1lc3NhZ2UuIE9uZSBvZiBgdXNlcmAgb3IgYGFzc2lzdGFudGAuXG4gICAqL1xuICByb2xlPzogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIG1lc3NhZ2UgZGVsdGEgaS5lLiBhbnkgY2hhbmdlZCBmaWVsZHMgb24gYSBtZXNzYWdlIGR1cmluZ1xuICogc3RyZWFtaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VEZWx0YUV2ZW50IHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBtZXNzYWdlLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBBUEkgZW5kcG9pbnRzLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlbHRhIGNvbnRhaW5pbmcgdGhlIGZpZWxkcyB0aGF0IGhhdmUgY2hhbmdlZCBvbiB0aGUgTWVzc2FnZS5cbiAgICovXG4gIGRlbHRhOiBNZXNzYWdlRGVsdGE7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGB0aHJlYWQubWVzc2FnZS5kZWx0YWAuXG4gICAqL1xuICBvYmplY3Q6ICd0aHJlYWQubWVzc2FnZS5kZWx0YSc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dCB7XG4gIGFubm90YXRpb25zOiBBcnJheTxBbm5vdGF0aW9uPjtcblxuICAvKipcbiAgICogVGhlIGRhdGEgdGhhdCBtYWtlcyB1cCB0aGUgdGV4dC5cbiAgICovXG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHRleHQgY29udGVudCB0aGF0IGlzIHBhcnQgb2YgYSBtZXNzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRleHRDb250ZW50QmxvY2sge1xuICB0ZXh0OiBUZXh0O1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYHRleHRgLlxuICAgKi9cbiAgdHlwZTogJ3RleHQnO1xufVxuXG4vKipcbiAqIFRoZSB0ZXh0IGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIGEgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXh0Q29udGVudEJsb2NrUGFyYW0ge1xuICAvKipcbiAgICogVGV4dCBjb250ZW50IHRvIGJlIHNlbnQgdG8gdGhlIG1vZGVsXG4gICAqL1xuICB0ZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFsd2F5cyBgdGV4dGAuXG4gICAqL1xuICB0eXBlOiAndGV4dCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dERlbHRhIHtcbiAgYW5ub3RhdGlvbnM/OiBBcnJheTxBbm5vdGF0aW9uRGVsdGE+O1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSB0aGF0IG1ha2VzIHVwIHRoZSB0ZXh0LlxuICAgKi9cbiAgdmFsdWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHRleHQgY29udGVudCB0aGF0IGlzIHBhcnQgb2YgYSBtZXNzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRleHREZWx0YUJsb2NrIHtcbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiB0aGUgY29udGVudCBwYXJ0IGluIHRoZSBtZXNzYWdlLlxuICAgKi9cbiAgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogQWx3YXlzIGB0ZXh0YC5cbiAgICovXG4gIHR5cGU6ICd0ZXh0JztcblxuICB0ZXh0PzogVGV4dERlbHRhO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VDcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHRleHQgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UuXG4gICAqL1xuICBjb250ZW50OiBzdHJpbmcgfCBBcnJheTxNZXNzYWdlQ29udGVudFBhcnRQYXJhbT47XG5cbiAgLyoqXG4gICAqIFRoZSByb2xlIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjcmVhdGluZyB0aGUgbWVzc2FnZS4gQWxsb3dlZCB2YWx1ZXMgaW5jbHVkZTpcbiAgICpcbiAgICogLSBgdXNlcmA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBzZW50IGJ5IGFuIGFjdHVhbCB1c2VyIGFuZCBzaG91bGQgYmUgdXNlZCBpblxuICAgKiAgIG1vc3QgY2FzZXMgdG8gcmVwcmVzZW50IHVzZXItZ2VuZXJhdGVkIG1lc3NhZ2VzLlxuICAgKiAtIGBhc3Npc3RhbnRgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBhc3Npc3RhbnQuIFVzZSB0aGlzXG4gICAqICAgdmFsdWUgdG8gaW5zZXJ0IG1lc3NhZ2VzIGZyb20gdGhlIGFzc2lzdGFudCBpbnRvIHRoZSBjb252ZXJzYXRpb24uXG4gICAqL1xuICByb2xlOiAndXNlcicgfCAnYXNzaXN0YW50JztcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGZpbGVzIGF0dGFjaGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQgdGhlIHRvb2xzIHRoZXkgc2hvdWxkIGJlIGFkZGVkIHRvLlxuICAgKi9cbiAgYXR0YWNobWVudHM/OiBBcnJheTxNZXNzYWdlQ3JlYXRlUGFyYW1zLkF0dGFjaG1lbnQ+IHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBNZXNzYWdlQ3JlYXRlUGFyYW1zIHtcbiAgZXhwb3J0IGludGVyZmFjZSBBdHRhY2htZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgdG8gYXR0YWNoIHRvIHRoZSBtZXNzYWdlLlxuICAgICAqL1xuICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG9vbHMgdG8gYWRkIHRoaXMgZmlsZSB0by5cbiAgICAgKi9cbiAgICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQ29kZUludGVycHJldGVyVG9vbCB8IEFzc2lzdGFudHNBUEkuRmlsZVNlYXJjaFRvb2w+O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZVVwZGF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VMaXN0UGFyYW1zIGV4dGVuZHMgQ3Vyc29yUGFnZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGN1cnNvciBmb3IgdXNlIGluIHBhZ2luYXRpb24uIGBiZWZvcmVgIGlzIGFuIG9iamVjdCBJRCB0aGF0IGRlZmluZXMgeW91ciBwbGFjZVxuICAgKiBpbiB0aGUgbGlzdC4gRm9yIGluc3RhbmNlLCBpZiB5b3UgbWFrZSBhIGxpc3QgcmVxdWVzdCBhbmQgcmVjZWl2ZSAxMDAgb2JqZWN0cyxcbiAgICogZW5kaW5nIHdpdGggb2JqX2ZvbywgeW91ciBzdWJzZXF1ZW50IGNhbGwgY2FuIGluY2x1ZGUgYmVmb3JlPW9ial9mb28gaW4gb3JkZXIgdG9cbiAgICogZmV0Y2ggdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIGxpc3QuXG4gICAqL1xuICBiZWZvcmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNvcnQgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lc3RhbXAgb2YgdGhlIG9iamVjdHMuIGBhc2NgIGZvciBhc2NlbmRpbmdcbiAgICogb3JkZXIgYW5kIGBkZXNjYCBmb3IgZGVzY2VuZGluZyBvcmRlci5cbiAgICovXG4gIG9yZGVyPzogJ2FzYycgfCAnZGVzYyc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBtZXNzYWdlcyBieSB0aGUgcnVuIElEIHRoYXQgZ2VuZXJhdGVkIHRoZW0uXG4gICAqL1xuICBydW5faWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTWVzc2FnZXMge1xuICBleHBvcnQgaW1wb3J0IEFubm90YXRpb24gPSBNZXNzYWdlc0FQSS5Bbm5vdGF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEFubm90YXRpb25EZWx0YSA9IE1lc3NhZ2VzQVBJLkFubm90YXRpb25EZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBGaWxlQ2l0YXRpb25Bbm5vdGF0aW9uID0gTWVzc2FnZXNBUEkuRmlsZUNpdGF0aW9uQW5ub3RhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBGaWxlQ2l0YXRpb25EZWx0YUFubm90YXRpb24gPSBNZXNzYWdlc0FQSS5GaWxlQ2l0YXRpb25EZWx0YUFubm90YXRpb247XG4gIGV4cG9ydCBpbXBvcnQgRmlsZVBhdGhBbm5vdGF0aW9uID0gTWVzc2FnZXNBUEkuRmlsZVBhdGhBbm5vdGF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEZpbGVQYXRoRGVsdGFBbm5vdGF0aW9uID0gTWVzc2FnZXNBUEkuRmlsZVBhdGhEZWx0YUFubm90YXRpb247XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VGaWxlID0gTWVzc2FnZXNBUEkuSW1hZ2VGaWxlO1xuICBleHBvcnQgaW1wb3J0IEltYWdlRmlsZUNvbnRlbnRCbG9jayA9IE1lc3NhZ2VzQVBJLkltYWdlRmlsZUNvbnRlbnRCbG9jaztcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUZpbGVEZWx0YSA9IE1lc3NhZ2VzQVBJLkltYWdlRmlsZURlbHRhO1xuICBleHBvcnQgaW1wb3J0IEltYWdlRmlsZURlbHRhQmxvY2sgPSBNZXNzYWdlc0FQSS5JbWFnZUZpbGVEZWx0YUJsb2NrO1xuICBleHBvcnQgaW1wb3J0IEltYWdlVVJMID0gTWVzc2FnZXNBUEkuSW1hZ2VVUkw7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VVUkxDb250ZW50QmxvY2sgPSBNZXNzYWdlc0FQSS5JbWFnZVVSTENvbnRlbnRCbG9jaztcbiAgZXhwb3J0IGltcG9ydCBJbWFnZVVSTERlbHRhID0gTWVzc2FnZXNBUEkuSW1hZ2VVUkxEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZVVSTERlbHRhQmxvY2sgPSBNZXNzYWdlc0FQSS5JbWFnZVVSTERlbHRhQmxvY2s7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZSA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZUNvbnRlbnQgPSBNZXNzYWdlc0FQSS5NZXNzYWdlQ29udGVudDtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlQ29udGVudERlbHRhID0gTWVzc2FnZXNBUEkuTWVzc2FnZUNvbnRlbnREZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlQ29udGVudFBhcnRQYXJhbSA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VDb250ZW50UGFydFBhcmFtO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VEZWxldGVkID0gTWVzc2FnZXNBUEkuTWVzc2FnZURlbGV0ZWQ7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZURlbHRhID0gTWVzc2FnZXNBUEkuTWVzc2FnZURlbHRhO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VEZWx0YUV2ZW50ID0gTWVzc2FnZXNBUEkuTWVzc2FnZURlbHRhRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgVGV4dCA9IE1lc3NhZ2VzQVBJLlRleHQ7XG4gIGV4cG9ydCBpbXBvcnQgVGV4dENvbnRlbnRCbG9jayA9IE1lc3NhZ2VzQVBJLlRleHRDb250ZW50QmxvY2s7XG4gIGV4cG9ydCBpbXBvcnQgVGV4dENvbnRlbnRCbG9ja1BhcmFtID0gTWVzc2FnZXNBUEkuVGV4dENvbnRlbnRCbG9ja1BhcmFtO1xuICBleHBvcnQgaW1wb3J0IFRleHREZWx0YSA9IE1lc3NhZ2VzQVBJLlRleHREZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBUZXh0RGVsdGFCbG9jayA9IE1lc3NhZ2VzQVBJLlRleHREZWx0YUJsb2NrO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VzUGFnZSA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlQ3JlYXRlUGFyYW1zID0gTWVzc2FnZXNBUEkuTWVzc2FnZUNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlVXBkYXRlUGFyYW1zID0gTWVzc2FnZXNBUEkuTWVzc2FnZVVwZGF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlTGlzdFBhcmFtcyA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VMaXN0UGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi4vLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uLy4uLy4uLy4uL3Jlc291cmNlJztcbmltcG9ydCB7IGlzUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlJztcbmltcG9ydCAqIGFzIFN0ZXBzQVBJIGZyb20gJy4vc3RlcHMnO1xuaW1wb3J0IHsgQ3Vyc29yUGFnZSwgdHlwZSBDdXJzb3JQYWdlUGFyYW1zIH0gZnJvbSAnLi4vLi4vLi4vLi4vcGFnaW5hdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBTdGVwcyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHJ1biBzdGVwLlxuICAgKi9cbiAgcmV0cmlldmUoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIHN0ZXBJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8UnVuU3RlcD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvdGhyZWFkcy8ke3RocmVhZElkfS9ydW5zLyR7cnVuSWR9L3N0ZXBzLyR7c3RlcElkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIHJ1biBzdGVwcyBiZWxvbmdpbmcgdG8gYSBydW4uXG4gICAqL1xuICBsaXN0KFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBxdWVyeT86IFN0ZXBMaXN0UGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPFJ1blN0ZXBzUGFnZSwgUnVuU3RlcD47XG4gIGxpc3QoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPFJ1blN0ZXBzUGFnZSwgUnVuU3RlcD47XG4gIGxpc3QoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIHF1ZXJ5OiBTdGVwTGlzdFBhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxSdW5TdGVwc1BhZ2UsIFJ1blN0ZXA+IHtcbiAgICBpZiAoaXNSZXF1ZXN0T3B0aW9ucyhxdWVyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3QodGhyZWFkSWQsIHJ1bklkLCB7fSwgcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoYC90aHJlYWRzLyR7dGhyZWFkSWR9L3J1bnMvJHtydW5JZH0vc3RlcHNgLCBSdW5TdGVwc1BhZ2UsIHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJ1blN0ZXBzUGFnZSBleHRlbmRzIEN1cnNvclBhZ2U8UnVuU3RlcD4ge31cblxuLyoqXG4gKiBUZXh0IG91dHB1dCBmcm9tIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbCBhcyBwYXJ0IG9mIGEgcnVuIHN0ZXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyTG9ncyB7XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgdGhlIG91dHB1dCBpbiB0aGUgb3V0cHV0cyBhcnJheS5cbiAgICovXG4gIGluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEFsd2F5cyBgbG9nc2AuXG4gICAqL1xuICB0eXBlOiAnbG9ncyc7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IG91dHB1dCBmcm9tIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbC5cbiAgICovXG4gIGxvZ3M/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyT3V0cHV0SW1hZ2Uge1xuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSBvdXRwdXQgaW4gdGhlIG91dHB1dHMgYXJyYXkuXG4gICAqL1xuICBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYGltYWdlYC5cbiAgICovXG4gIHR5cGU6ICdpbWFnZSc7XG5cbiAgaW1hZ2U/OiBDb2RlSW50ZXJwcmV0ZXJPdXRwdXRJbWFnZS5JbWFnZTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDb2RlSW50ZXJwcmV0ZXJPdXRwdXRJbWFnZSB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgSW1hZ2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSUQgb2YgdGhlXG4gICAgICogaW1hZ2UuXG4gICAgICovXG4gICAgZmlsZV9pZD86IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIERldGFpbHMgb2YgdGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsIHRoZSBydW4gc3RlcCB3YXMgaW52b2x2ZWQgaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyVG9vbENhbGwge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSB0b29sIGNhbGwuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwgZGVmaW5pdGlvbi5cbiAgICovXG4gIGNvZGVfaW50ZXJwcmV0ZXI6IENvZGVJbnRlcnByZXRlclRvb2xDYWxsLkNvZGVJbnRlcnByZXRlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdG9vbCBjYWxsLiBUaGlzIGlzIGFsd2F5cyBnb2luZyB0byBiZSBgY29kZV9pbnRlcnByZXRlcmAgZm9yIHRoaXNcbiAgICogdHlwZSBvZiB0b29sIGNhbGwuXG4gICAqL1xuICB0eXBlOiAnY29kZV9pbnRlcnByZXRlcic7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ29kZUludGVycHJldGVyVG9vbENhbGwge1xuICAvKipcbiAgICogVGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsIGRlZmluaXRpb24uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgLyoqXG4gICAgICogVGhlIGlucHV0IHRvIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbC5cbiAgICAgKi9cbiAgICBpbnB1dDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG91dHB1dHMgZnJvbSB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwuIENvZGUgSW50ZXJwcmV0ZXIgY2FuIG91dHB1dCBvbmVcbiAgICAgKiBvciBtb3JlIGl0ZW1zLCBpbmNsdWRpbmcgdGV4dCAoYGxvZ3NgKSBvciBpbWFnZXMgKGBpbWFnZWApLiBFYWNoIG9mIHRoZXNlIGFyZVxuICAgICAqIHJlcHJlc2VudGVkIGJ5IGEgZGlmZmVyZW50IG9iamVjdCB0eXBlLlxuICAgICAqL1xuICAgIG91dHB1dHM6IEFycmF5PENvZGVJbnRlcnByZXRlci5Mb2dzIHwgQ29kZUludGVycHJldGVyLkltYWdlPjtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAvKipcbiAgICAgKiBUZXh0IG91dHB1dCBmcm9tIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbCBhcyBwYXJ0IG9mIGEgcnVuIHN0ZXAuXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBMb2dzIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHRleHQgb3V0cHV0IGZyb20gdGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsLlxuICAgICAgICovXG4gICAgICBsb2dzOiBzdHJpbmc7XG5cbiAgICAgIC8qKlxuICAgICAgICogQWx3YXlzIGBsb2dzYC5cbiAgICAgICAqL1xuICAgICAgdHlwZTogJ2xvZ3MnO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgSW1hZ2Uge1xuICAgICAgaW1hZ2U6IEltYWdlLkltYWdlO1xuXG4gICAgICAvKipcbiAgICAgICAqIEFsd2F5cyBgaW1hZ2VgLlxuICAgICAgICovXG4gICAgICB0eXBlOiAnaW1hZ2UnO1xuICAgIH1cblxuICAgIGV4cG9ydCBuYW1lc3BhY2UgSW1hZ2Uge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBJbWFnZSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEIG9mIHRoZVxuICAgICAgICAgKiBpbWFnZS5cbiAgICAgICAgICovXG4gICAgICAgIGZpbGVfaWQ6IHN0cmluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbCB0aGUgcnVuIHN0ZXAgd2FzIGludm9sdmVkIGluLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlclRvb2xDYWxsRGVsdGEge1xuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSB0b29sIGNhbGwgaW4gdGhlIHRvb2wgY2FsbHMgYXJyYXkuXG4gICAqL1xuICBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0b29sIGNhbGwuIFRoaXMgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIGBjb2RlX2ludGVycHJldGVyYCBmb3IgdGhpc1xuICAgKiB0eXBlIG9mIHRvb2wgY2FsbC5cbiAgICovXG4gIHR5cGU6ICdjb2RlX2ludGVycHJldGVyJztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSB0b29sIGNhbGwuXG4gICAqL1xuICBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsIGRlZmluaXRpb24uXG4gICAqL1xuICBjb2RlX2ludGVycHJldGVyPzogQ29kZUludGVycHJldGVyVG9vbENhbGxEZWx0YS5Db2RlSW50ZXJwcmV0ZXI7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ29kZUludGVycHJldGVyVG9vbENhbGxEZWx0YSB7XG4gIC8qKlxuICAgKiBUaGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwgZGVmaW5pdGlvbi5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5wdXQgdG8gdGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsLlxuICAgICAqL1xuICAgIGlucHV0Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG91dHB1dHMgZnJvbSB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwuIENvZGUgSW50ZXJwcmV0ZXIgY2FuIG91dHB1dCBvbmVcbiAgICAgKiBvciBtb3JlIGl0ZW1zLCBpbmNsdWRpbmcgdGV4dCAoYGxvZ3NgKSBvciBpbWFnZXMgKGBpbWFnZWApLiBFYWNoIG9mIHRoZXNlIGFyZVxuICAgICAqIHJlcHJlc2VudGVkIGJ5IGEgZGlmZmVyZW50IG9iamVjdCB0eXBlLlxuICAgICAqL1xuICAgIG91dHB1dHM/OiBBcnJheTxTdGVwc0FQSS5Db2RlSW50ZXJwcmV0ZXJMb2dzIHwgU3RlcHNBUEkuQ29kZUludGVycHJldGVyT3V0cHV0SW1hZ2U+O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaFRvb2xDYWxsIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsIG9iamVjdC5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZvciBub3csIHRoaXMgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIGFuIGVtcHR5IG9iamVjdC5cbiAgICovXG4gIGZpbGVfc2VhcmNoOiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0b29sIGNhbGwuIFRoaXMgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIGBmaWxlX3NlYXJjaGAgZm9yIHRoaXMgdHlwZSBvZlxuICAgKiB0b29sIGNhbGwuXG4gICAqL1xuICB0eXBlOiAnZmlsZV9zZWFyY2gnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2hUb29sQ2FsbERlbHRhIHtcbiAgLyoqXG4gICAqIEZvciBub3csIHRoaXMgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIGFuIGVtcHR5IG9iamVjdC5cbiAgICovXG4gIGZpbGVfc2VhcmNoOiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgdGhlIHRvb2wgY2FsbCBpbiB0aGUgdG9vbCBjYWxscyBhcnJheS5cbiAgICovXG4gIGluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRvb2wgY2FsbC4gVGhpcyBpcyBhbHdheXMgZ29pbmcgdG8gYmUgYGZpbGVfc2VhcmNoYCBmb3IgdGhpcyB0eXBlIG9mXG4gICAqIHRvb2wgY2FsbC5cbiAgICovXG4gIHR5cGU6ICdmaWxlX3NlYXJjaCc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsIG9iamVjdC5cbiAgICovXG4gIGlkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uVG9vbENhbGwge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSB0b29sIGNhbGwgb2JqZWN0LlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlZmluaXRpb24gb2YgdGhlIGZ1bmN0aW9uIHRoYXQgd2FzIGNhbGxlZC5cbiAgICovXG4gIGZ1bmN0aW9uOiBGdW5jdGlvblRvb2xDYWxsLkZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0b29sIGNhbGwuIFRoaXMgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIGBmdW5jdGlvbmAgZm9yIHRoaXMgdHlwZSBvZlxuICAgKiB0b29sIGNhbGwuXG4gICAqL1xuICB0eXBlOiAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZ1bmN0aW9uVG9vbENhbGwge1xuICAvKipcbiAgICogVGhlIGRlZmluaXRpb24gb2YgdGhlIGZ1bmN0aW9uIHRoYXQgd2FzIGNhbGxlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBhcmd1bWVudHM6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3V0cHV0IG9mIHRoZSBmdW5jdGlvbi4gVGhpcyB3aWxsIGJlIGBudWxsYCBpZiB0aGUgb3V0cHV0cyBoYXZlIG5vdCBiZWVuXG4gICAgICogW3N1Ym1pdHRlZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N1Ym1pdFRvb2xPdXRwdXRzKVxuICAgICAqIHlldC5cbiAgICAgKi9cbiAgICBvdXRwdXQ6IHN0cmluZyB8IG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvblRvb2xDYWxsRGVsdGEge1xuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSB0b29sIGNhbGwgaW4gdGhlIHRvb2wgY2FsbHMgYXJyYXkuXG4gICAqL1xuICBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0b29sIGNhbGwuIFRoaXMgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIGBmdW5jdGlvbmAgZm9yIHRoaXMgdHlwZSBvZlxuICAgKiB0b29sIGNhbGwuXG4gICAqL1xuICB0eXBlOiAnZnVuY3Rpb24nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHRvb2wgY2FsbCBvYmplY3QuXG4gICAqL1xuICBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlZmluaXRpb24gb2YgdGhlIGZ1bmN0aW9uIHRoYXQgd2FzIGNhbGxlZC5cbiAgICovXG4gIGZ1bmN0aW9uPzogRnVuY3Rpb25Ub29sQ2FsbERlbHRhLkZ1bmN0aW9uO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZ1bmN0aW9uVG9vbENhbGxEZWx0YSB7XG4gIC8qKlxuICAgKiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgZnVuY3Rpb24gdGhhdCB3YXMgY2FsbGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGFyZ3VtZW50cz86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG91dHB1dCBvZiB0aGUgZnVuY3Rpb24uIFRoaXMgd2lsbCBiZSBgbnVsbGAgaWYgdGhlIG91dHB1dHMgaGF2ZSBub3QgYmVlblxuICAgICAqIFtzdWJtaXR0ZWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdWJtaXRUb29sT3V0cHV0cylcbiAgICAgKiB5ZXQuXG4gICAgICovXG4gICAgb3V0cHV0Pzogc3RyaW5nIHwgbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIERldGFpbHMgb2YgdGhlIG1lc3NhZ2UgY3JlYXRpb24gYnkgdGhlIHJ1biBzdGVwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VDcmVhdGlvblN0ZXBEZXRhaWxzIHtcbiAgbWVzc2FnZV9jcmVhdGlvbjogTWVzc2FnZUNyZWF0aW9uU3RlcERldGFpbHMuTWVzc2FnZUNyZWF0aW9uO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYG1lc3NhZ2VfY3JlYXRpb25gLlxuICAgKi9cbiAgdHlwZTogJ21lc3NhZ2VfY3JlYXRpb24nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2VDcmVhdGlvblN0ZXBEZXRhaWxzIHtcbiAgZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlQ3JlYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoaXMgcnVuIHN0ZXAuXG4gICAgICovXG4gICAgbWVzc2FnZV9pZDogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1blN0ZXAge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHJ1biBzdGVwLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBBUEkgZW5kcG9pbnRzLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpXG4gICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgcnVuIHN0ZXAuXG4gICAqL1xuICBhc3Npc3RhbnRfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHN0ZXAgd2FzIGNhbmNlbGxlZC5cbiAgICovXG4gIGNhbmNlbGxlZF9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHN0ZXAgY29tcGxldGVkLlxuICAgKi9cbiAgY29tcGxldGVkX2F0OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBydW4gc3RlcCB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHN0ZXAgZXhwaXJlZC4gQSBzdGVwIGlzXG4gICAqIGNvbnNpZGVyZWQgZXhwaXJlZCBpZiB0aGUgcGFyZW50IHJ1biBpcyBleHBpcmVkLlxuICAgKi9cbiAgZXhwaXJlZF9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHN0ZXAgZmFpbGVkLlxuICAgKi9cbiAgZmFpbGVkX2F0OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFzdCBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBydW4gc3RlcC4gV2lsbCBiZSBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vXG4gICAqIGVycm9ycy5cbiAgICovXG4gIGxhc3RfZXJyb3I6IFJ1blN0ZXAuTGFzdEVycm9yIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE6IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgdGhyZWFkLnJ1bi5zdGVwYC5cbiAgICovXG4gIG9iamVjdDogJ3RocmVhZC5ydW4uc3RlcCc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zKSB0aGF0XG4gICAqIHRoaXMgcnVuIHN0ZXAgaXMgYSBwYXJ0IG9mLlxuICAgKi9cbiAgcnVuX2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIHJ1biBzdGVwLCB3aGljaCBjYW4gYmUgZWl0aGVyIGBpbl9wcm9ncmVzc2AsIGBjYW5jZWxsZWRgLFxuICAgKiBgZmFpbGVkYCwgYGNvbXBsZXRlZGAsIG9yIGBleHBpcmVkYC5cbiAgICovXG4gIHN0YXR1czogJ2luX3Byb2dyZXNzJyB8ICdjYW5jZWxsZWQnIHwgJ2ZhaWxlZCcgfCAnY29tcGxldGVkJyB8ICdleHBpcmVkJztcblxuICAvKipcbiAgICogVGhlIGRldGFpbHMgb2YgdGhlIHJ1biBzdGVwLlxuICAgKi9cbiAgc3RlcF9kZXRhaWxzOiBNZXNzYWdlQ3JlYXRpb25TdGVwRGV0YWlscyB8IFRvb2xDYWxsc1N0ZXBEZXRhaWxzO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcylcbiAgICogdGhhdCB3YXMgcnVuLlxuICAgKi9cbiAgdGhyZWFkX2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHJ1biBzdGVwLCB3aGljaCBjYW4gYmUgZWl0aGVyIGBtZXNzYWdlX2NyZWF0aW9uYCBvciBgdG9vbF9jYWxsc2AuXG4gICAqL1xuICB0eXBlOiAnbWVzc2FnZV9jcmVhdGlvbicgfCAndG9vbF9jYWxscyc7XG5cbiAgLyoqXG4gICAqIFVzYWdlIHN0YXRpc3RpY3MgcmVsYXRlZCB0byB0aGUgcnVuIHN0ZXAuIFRoaXMgdmFsdWUgd2lsbCBiZSBgbnVsbGAgd2hpbGUgdGhlXG4gICAqIHJ1biBzdGVwJ3Mgc3RhdHVzIGlzIGBpbl9wcm9ncmVzc2AuXG4gICAqL1xuICB1c2FnZTogUnVuU3RlcC5Vc2FnZSB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUnVuU3RlcCB7XG4gIC8qKlxuICAgKiBUaGUgbGFzdCBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBydW4gc3RlcC4gV2lsbCBiZSBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vXG4gICAqIGVycm9ycy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgTGFzdEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBPbmUgb2YgYHNlcnZlcl9lcnJvcmAgb3IgYHJhdGVfbGltaXRfZXhjZWVkZWRgLlxuICAgICAqL1xuICAgIGNvZGU6ICdzZXJ2ZXJfZXJyb3InIHwgJ3JhdGVfbGltaXRfZXhjZWVkZWQnO1xuXG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuXG4gICAgICovXG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzYWdlIHN0YXRpc3RpY3MgcmVsYXRlZCB0byB0aGUgcnVuIHN0ZXAuIFRoaXMgdmFsdWUgd2lsbCBiZSBgbnVsbGAgd2hpbGUgdGhlXG4gICAqIHJ1biBzdGVwJ3Mgc3RhdHVzIGlzIGBpbl9wcm9ncmVzc2AuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFVzYWdlIHtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnMgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1biBzdGVwLlxuICAgICAqL1xuICAgIGNvbXBsZXRpb25fdG9rZW5zOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgcHJvbXB0IHRva2VucyB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgcnVuIHN0ZXAuXG4gICAgICovXG4gICAgcHJvbXB0X3Rva2VuczogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVG90YWwgbnVtYmVyIG9mIHRva2VucyB1c2VkIChwcm9tcHQgKyBjb21wbGV0aW9uKS5cbiAgICAgKi9cbiAgICB0b3RhbF90b2tlbnM6IG51bWJlcjtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBkZWx0YSBjb250YWluaW5nIHRoZSBmaWVsZHMgdGhhdCBoYXZlIGNoYW5nZWQgb24gdGhlIHJ1biBzdGVwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1blN0ZXBEZWx0YSB7XG4gIC8qKlxuICAgKiBUaGUgZGV0YWlscyBvZiB0aGUgcnVuIHN0ZXAuXG4gICAqL1xuICBzdGVwX2RldGFpbHM/OiBSdW5TdGVwRGVsdGFNZXNzYWdlRGVsdGEgfCBUb29sQ2FsbERlbHRhT2JqZWN0O1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBydW4gc3RlcCBkZWx0YSBpLmUuIGFueSBjaGFuZ2VkIGZpZWxkcyBvbiBhIHJ1biBzdGVwIGR1cmluZ1xuICogc3RyZWFtaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1blN0ZXBEZWx0YUV2ZW50IHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBydW4gc3RlcCwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWx0YSBjb250YWluaW5nIHRoZSBmaWVsZHMgdGhhdCBoYXZlIGNoYW5nZWQgb24gdGhlIHJ1biBzdGVwLlxuICAgKi9cbiAgZGVsdGE6IFJ1blN0ZXBEZWx0YTtcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYHRocmVhZC5ydW4uc3RlcC5kZWx0YWAuXG4gICAqL1xuICBvYmplY3Q6ICd0aHJlYWQucnVuLnN0ZXAuZGVsdGEnO1xufVxuXG4vKipcbiAqIERldGFpbHMgb2YgdGhlIG1lc3NhZ2UgY3JlYXRpb24gYnkgdGhlIHJ1biBzdGVwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1blN0ZXBEZWx0YU1lc3NhZ2VEZWx0YSB7XG4gIC8qKlxuICAgKiBBbHdheXMgYG1lc3NhZ2VfY3JlYXRpb25gLlxuICAgKi9cbiAgdHlwZTogJ21lc3NhZ2VfY3JlYXRpb24nO1xuXG4gIG1lc3NhZ2VfY3JlYXRpb24/OiBSdW5TdGVwRGVsdGFNZXNzYWdlRGVsdGEuTWVzc2FnZUNyZWF0aW9uO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1blN0ZXBEZWx0YU1lc3NhZ2VEZWx0YSB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUNyZWF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGlzIHJ1biBzdGVwLlxuICAgICAqL1xuICAgIG1lc3NhZ2VfaWQ/OiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbCB0aGUgcnVuIHN0ZXAgd2FzIGludm9sdmVkIGluLlxuICovXG5leHBvcnQgdHlwZSBUb29sQ2FsbCA9IENvZGVJbnRlcnByZXRlclRvb2xDYWxsIHwgRmlsZVNlYXJjaFRvb2xDYWxsIHwgRnVuY3Rpb25Ub29sQ2FsbDtcblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbCB0aGUgcnVuIHN0ZXAgd2FzIGludm9sdmVkIGluLlxuICovXG5leHBvcnQgdHlwZSBUb29sQ2FsbERlbHRhID0gQ29kZUludGVycHJldGVyVG9vbENhbGxEZWx0YSB8IEZpbGVTZWFyY2hUb29sQ2FsbERlbHRhIHwgRnVuY3Rpb25Ub29sQ2FsbERlbHRhO1xuXG4vKipcbiAqIERldGFpbHMgb2YgdGhlIHRvb2wgY2FsbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sQ2FsbERlbHRhT2JqZWN0IHtcbiAgLyoqXG4gICAqIEFsd2F5cyBgdG9vbF9jYWxsc2AuXG4gICAqL1xuICB0eXBlOiAndG9vbF9jYWxscyc7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHRvb2wgY2FsbHMgdGhlIHJ1biBzdGVwIHdhcyBpbnZvbHZlZCBpbi4gVGhlc2UgY2FuIGJlIGFzc29jaWF0ZWRcbiAgICogd2l0aCBvbmUgb2YgdGhyZWUgdHlwZXMgb2YgdG9vbHM6IGBjb2RlX2ludGVycHJldGVyYCwgYGZpbGVfc2VhcmNoYCwgb3JcbiAgICogYGZ1bmN0aW9uYC5cbiAgICovXG4gIHRvb2xfY2FsbHM/OiBBcnJheTxUb29sQ2FsbERlbHRhPjtcbn1cblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSB0b29sIGNhbGwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbENhbGxzU3RlcERldGFpbHMge1xuICAvKipcbiAgICogQW4gYXJyYXkgb2YgdG9vbCBjYWxscyB0aGUgcnVuIHN0ZXAgd2FzIGludm9sdmVkIGluLiBUaGVzZSBjYW4gYmUgYXNzb2NpYXRlZFxuICAgKiB3aXRoIG9uZSBvZiB0aHJlZSB0eXBlcyBvZiB0b29sczogYGNvZGVfaW50ZXJwcmV0ZXJgLCBgZmlsZV9zZWFyY2hgLCBvclxuICAgKiBgZnVuY3Rpb25gLlxuICAgKi9cbiAgdG9vbF9jYWxsczogQXJyYXk8VG9vbENhbGw+O1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYHRvb2xfY2FsbHNgLlxuICAgKi9cbiAgdHlwZTogJ3Rvb2xfY2FsbHMnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBMaXN0UGFyYW1zIGV4dGVuZHMgQ3Vyc29yUGFnZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGN1cnNvciBmb3IgdXNlIGluIHBhZ2luYXRpb24uIGBiZWZvcmVgIGlzIGFuIG9iamVjdCBJRCB0aGF0IGRlZmluZXMgeW91ciBwbGFjZVxuICAgKiBpbiB0aGUgbGlzdC4gRm9yIGluc3RhbmNlLCBpZiB5b3UgbWFrZSBhIGxpc3QgcmVxdWVzdCBhbmQgcmVjZWl2ZSAxMDAgb2JqZWN0cyxcbiAgICogZW5kaW5nIHdpdGggb2JqX2ZvbywgeW91ciBzdWJzZXF1ZW50IGNhbGwgY2FuIGluY2x1ZGUgYmVmb3JlPW9ial9mb28gaW4gb3JkZXIgdG9cbiAgICogZmV0Y2ggdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIGxpc3QuXG4gICAqL1xuICBiZWZvcmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNvcnQgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lc3RhbXAgb2YgdGhlIG9iamVjdHMuIGBhc2NgIGZvciBhc2NlbmRpbmdcbiAgICogb3JkZXIgYW5kIGBkZXNjYCBmb3IgZGVzY2VuZGluZyBvcmRlci5cbiAgICovXG4gIG9yZGVyPzogJ2FzYycgfCAnZGVzYyc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgU3RlcHMge1xuICBleHBvcnQgaW1wb3J0IENvZGVJbnRlcnByZXRlckxvZ3MgPSBTdGVwc0FQSS5Db2RlSW50ZXJwcmV0ZXJMb2dzO1xuICBleHBvcnQgaW1wb3J0IENvZGVJbnRlcnByZXRlck91dHB1dEltYWdlID0gU3RlcHNBUEkuQ29kZUludGVycHJldGVyT3V0cHV0SW1hZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ29kZUludGVycHJldGVyVG9vbENhbGwgPSBTdGVwc0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sQ2FsbDtcbiAgZXhwb3J0IGltcG9ydCBDb2RlSW50ZXJwcmV0ZXJUb29sQ2FsbERlbHRhID0gU3RlcHNBUEkuQ29kZUludGVycHJldGVyVG9vbENhbGxEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBGaWxlU2VhcmNoVG9vbENhbGwgPSBTdGVwc0FQSS5GaWxlU2VhcmNoVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZVNlYXJjaFRvb2xDYWxsRGVsdGEgPSBTdGVwc0FQSS5GaWxlU2VhcmNoVG9vbENhbGxEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBGdW5jdGlvblRvb2xDYWxsID0gU3RlcHNBUEkuRnVuY3Rpb25Ub29sQ2FsbDtcbiAgZXhwb3J0IGltcG9ydCBGdW5jdGlvblRvb2xDYWxsRGVsdGEgPSBTdGVwc0FQSS5GdW5jdGlvblRvb2xDYWxsRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZUNyZWF0aW9uU3RlcERldGFpbHMgPSBTdGVwc0FQSS5NZXNzYWdlQ3JlYXRpb25TdGVwRGV0YWlscztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGVwID0gU3RlcHNBUEkuUnVuU3RlcDtcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGVwRGVsdGEgPSBTdGVwc0FQSS5SdW5TdGVwRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RlcERlbHRhRXZlbnQgPSBTdGVwc0FQSS5SdW5TdGVwRGVsdGFFdmVudDtcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGVwRGVsdGFNZXNzYWdlRGVsdGEgPSBTdGVwc0FQSS5SdW5TdGVwRGVsdGFNZXNzYWdlRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgVG9vbENhbGwgPSBTdGVwc0FQSS5Ub29sQ2FsbDtcbiAgZXhwb3J0IGltcG9ydCBUb29sQ2FsbERlbHRhID0gU3RlcHNBUEkuVG9vbENhbGxEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBUb29sQ2FsbERlbHRhT2JqZWN0ID0gU3RlcHNBUEkuVG9vbENhbGxEZWx0YU9iamVjdDtcbiAgZXhwb3J0IGltcG9ydCBUb29sQ2FsbHNTdGVwRGV0YWlscyA9IFN0ZXBzQVBJLlRvb2xDYWxsc1N0ZXBEZXRhaWxzO1xuICBleHBvcnQgaW1wb3J0IFJ1blN0ZXBzUGFnZSA9IFN0ZXBzQVBJLlJ1blN0ZXBzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBTdGVwTGlzdFBhcmFtcyA9IFN0ZXBzQVBJLlN0ZXBMaXN0UGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi4vLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBUElQcm9taXNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uLy4uLy4uLy4uL3Jlc291cmNlJztcbmltcG9ydCB7IGlzUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IEFzc2lzdGFudFN0cmVhbSwgUnVuQ3JlYXRlUGFyYW1zQmFzZVN0cmVhbSB9IGZyb20gJy4uLy4uLy4uLy4uL2xpYi9Bc3Npc3RhbnRTdHJlYW0nO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtIH0gZnJvbSAnLi4vLi4vLi4vLi4vbGliL0Fzc2lzdGFudFN0cmVhbSc7XG5pbXBvcnQgKiBhcyBSdW5zQVBJIGZyb20gJy4vcnVucyc7XG5pbXBvcnQgKiBhcyBBc3Npc3RhbnRzQVBJIGZyb20gJy4uLy4uL2Fzc2lzdGFudHMnO1xuaW1wb3J0ICogYXMgTWVzc2FnZXNBUEkgZnJvbSAnLi4vbWVzc2FnZXMnO1xuaW1wb3J0ICogYXMgVGhyZWFkc0FQSSBmcm9tICcuLi90aHJlYWRzJztcbmltcG9ydCAqIGFzIFN0ZXBzQVBJIGZyb20gJy4vc3RlcHMnO1xuaW1wb3J0IHsgQ3Vyc29yUGFnZSwgdHlwZSBDdXJzb3JQYWdlUGFyYW1zIH0gZnJvbSAnLi4vLi4vLi4vLi4vcGFnaW5hdGlvbic7XG5pbXBvcnQgeyBTdHJlYW0gfSBmcm9tICcuLi8uLi8uLi8uLi9zdHJlYW1pbmcnO1xuXG5leHBvcnQgY2xhc3MgUnVucyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgc3RlcHM6IFN0ZXBzQVBJLlN0ZXBzID0gbmV3IFN0ZXBzQVBJLlN0ZXBzKHRoaXMuX2NsaWVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHJ1bi5cbiAgICovXG4gIGNyZWF0ZSh0aHJlYWRJZDogc3RyaW5nLCBib2R5OiBSdW5DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQVBJUHJvbWlzZTxSdW4+O1xuICBjcmVhdGUoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBib2R5OiBSdW5DcmVhdGVQYXJhbXNTdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+PjtcbiAgY3JlYXRlKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgYm9keTogUnVuQ3JlYXRlUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxTdHJlYW08QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRTdHJlYW1FdmVudD4gfCBSdW4+O1xuICBjcmVhdGUoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBib2R5OiBSdW5DcmVhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8UnVuPiB8IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvdGhyZWFkcy8ke3RocmVhZElkfS9ydW5zYCwge1xuICAgICAgYm9keSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgICAgc3RyZWFtOiBib2R5LnN0cmVhbSA/PyBmYWxzZSxcbiAgICB9KSBhcyBBUElQcm9taXNlPFJ1bj4gfCBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50Pj47XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgcnVuLlxuICAgKi9cbiAgcmV0cmlldmUodGhyZWFkSWQ6IHN0cmluZywgcnVuSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8UnVuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXQoYC90aHJlYWRzLyR7dGhyZWFkSWR9L3J1bnMvJHtydW5JZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RpZmllcyBhIHJ1bi5cbiAgICovXG4gIHVwZGF0ZShcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgYm9keTogUnVuVXBkYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8UnVuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvdGhyZWFkcy8ke3RocmVhZElkfS9ydW5zLyR7cnVuSWR9YCwge1xuICAgICAgYm9keSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIHJ1bnMgYmVsb25naW5nIHRvIGEgdGhyZWFkLlxuICAgKi9cbiAgbGlzdChcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHF1ZXJ5PzogUnVuTGlzdFBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxSdW5zUGFnZSwgUnVuPjtcbiAgbGlzdCh0aHJlYWRJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuUGFnZVByb21pc2U8UnVuc1BhZ2UsIFJ1bj47XG4gIGxpc3QoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBxdWVyeTogUnVuTGlzdFBhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxSdW5zUGFnZSwgUnVuPiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0KHRocmVhZElkLCB7fSwgcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoYC90aHJlYWRzLyR7dGhyZWFkSWR9L3J1bnNgLCBSdW5zUGFnZSwge1xuICAgICAgcXVlcnksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIGEgcnVuIHRoYXQgaXMgYGluX3Byb2dyZXNzYC5cbiAgICovXG4gIGNhbmNlbCh0aHJlYWRJZDogc3RyaW5nLCBydW5JZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxSdW4+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoYC90aHJlYWRzLyR7dGhyZWFkSWR9L3J1bnMvJHtydW5JZH0vY2FuY2VsYCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQSBoZWxwZXIgdG8gY3JlYXRlIGEgcnVuIGFuIHBvbGwgZm9yIGEgdGVybWluYWwgc3RhdGUuIE1vcmUgaW5mb3JtYXRpb24gb24gUnVuXG4gICAqIGxpZmVjeWNsZXMgY2FuIGJlIGZvdW5kIGhlcmU6XG4gICAqIGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2Fzc2lzdGFudHMvaG93LWl0LXdvcmtzL3J1bnMtYW5kLXJ1bi1zdGVwc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlQW5kUG9sbChcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIGJvZHk6IFJ1bkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyAmIHsgcG9sbEludGVydmFsTXM/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB0aGlzLmNyZWF0ZSh0aHJlYWRJZCwgYm9keSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucG9sbCh0aHJlYWRJZCwgcnVuLmlkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBSdW4gc3RyZWFtXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBgc3RyZWFtYCBpbnN0ZWFkXG4gICAqL1xuICBjcmVhdGVBbmRTdHJlYW0oXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBib2R5OiBSdW5DcmVhdGVQYXJhbXNCYXNlU3RyZWFtLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBc3Npc3RhbnRTdHJlYW0ge1xuICAgIHJldHVybiBBc3Npc3RhbnRTdHJlYW0uY3JlYXRlQXNzaXN0YW50U3RyZWFtKHRocmVhZElkLCB0aGlzLl9jbGllbnQuYmV0YS50aHJlYWRzLnJ1bnMsIGJvZHksIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgaGVscGVyIHRvIHBvbGwgYSBydW4gc3RhdHVzIHVudGlsIGl0IHJlYWNoZXMgYSB0ZXJtaW5hbCBzdGF0ZS4gTW9yZVxuICAgKiBpbmZvcm1hdGlvbiBvbiBSdW4gbGlmZWN5Y2xlcyBjYW4gYmUgZm91bmQgaGVyZTpcbiAgICogaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXNzaXN0YW50cy9ob3ctaXQtd29ya3MvcnVucy1hbmQtcnVuLXN0ZXBzXG4gICAqL1xuICBhc3luYyBwb2xsKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyAmIHsgcG9sbEludGVydmFsTXM/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICBjb25zdCBoZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0geyAuLi5vcHRpb25zPy5oZWFkZXJzLCAnWC1TdGFpbmxlc3MtUG9sbC1IZWxwZXInOiAndHJ1ZScgfTtcblxuICAgIGlmIChvcHRpb25zPy5wb2xsSW50ZXJ2YWxNcykge1xuICAgICAgaGVhZGVyc1snWC1TdGFpbmxlc3MtQ3VzdG9tLVBvbGwtSW50ZXJ2YWwnXSA9IG9wdGlvbnMucG9sbEludGVydmFsTXMudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgeyBkYXRhOiBydW4sIHJlc3BvbnNlIH0gPSBhd2FpdCB0aGlzLnJldHJpZXZlKHRocmVhZElkLCBydW5JZCwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB7IC4uLm9wdGlvbnM/LmhlYWRlcnMsIC4uLmhlYWRlcnMgfSxcbiAgICAgIH0pLndpdGhSZXNwb25zZSgpO1xuXG4gICAgICBzd2l0Y2ggKHJ1bi5zdGF0dXMpIHtcbiAgICAgICAgLy9JZiB3ZSBhcmUgaW4gYW55IHNvcnQgb2YgaW50ZXJtZWRpYXRlIHN0YXRlIHdlIHBvbGxcbiAgICAgICAgY2FzZSAncXVldWVkJzpcbiAgICAgICAgY2FzZSAnaW5fcHJvZ3Jlc3MnOlxuICAgICAgICBjYXNlICdjYW5jZWxsaW5nJzpcbiAgICAgICAgICBsZXQgc2xlZXBJbnRlcnZhbCA9IDUwMDA7XG5cbiAgICAgICAgICBpZiAob3B0aW9ucz8ucG9sbEludGVydmFsTXMpIHtcbiAgICAgICAgICAgIHNsZWVwSW50ZXJ2YWwgPSBvcHRpb25zLnBvbGxJbnRlcnZhbE1zO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJJbnRlcnZhbCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdvcGVuYWktcG9sbC1hZnRlci1tcycpO1xuICAgICAgICAgICAgaWYgKGhlYWRlckludGVydmFsKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGhlYWRlckludGVydmFsTXMgPSBwYXJzZUludChoZWFkZXJJbnRlcnZhbCk7XG4gICAgICAgICAgICAgIGlmICghaXNOYU4oaGVhZGVySW50ZXJ2YWxNcykpIHtcbiAgICAgICAgICAgICAgICBzbGVlcEludGVydmFsID0gaGVhZGVySW50ZXJ2YWxNcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBzbGVlcChzbGVlcEludGVydmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy9XZSByZXR1cm4gdGhlIHJ1biBpbiBhbnkgdGVybWluYWwgc3RhdGUuXG4gICAgICAgIGNhc2UgJ3JlcXVpcmVzX2FjdGlvbic6XG4gICAgICAgIGNhc2UgJ2luY29tcGxldGUnOlxuICAgICAgICBjYXNlICdjYW5jZWxsZWQnOlxuICAgICAgICBjYXNlICdjb21wbGV0ZWQnOlxuICAgICAgICBjYXNlICdmYWlsZWQnOlxuICAgICAgICBjYXNlICdleHBpcmVkJzpcbiAgICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBSdW4gc3RyZWFtXG4gICAqL1xuICBzdHJlYW0odGhyZWFkSWQ6IHN0cmluZywgYm9keTogUnVuQ3JlYXRlUGFyYW1zQmFzZVN0cmVhbSwgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBBc3Npc3RhbnRTdHJlYW0ge1xuICAgIHJldHVybiBBc3Npc3RhbnRTdHJlYW0uY3JlYXRlQXNzaXN0YW50U3RyZWFtKHRocmVhZElkLCB0aGlzLl9jbGllbnQuYmV0YS50aHJlYWRzLnJ1bnMsIGJvZHksIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gYSBydW4gaGFzIHRoZSBgc3RhdHVzOiBcInJlcXVpcmVzX2FjdGlvblwiYCBhbmQgYHJlcXVpcmVkX2FjdGlvbi50eXBlYCBpc1xuICAgKiBgc3VibWl0X3Rvb2xfb3V0cHV0c2AsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gc3VibWl0IHRoZSBvdXRwdXRzIGZyb20gdGhlXG4gICAqIHRvb2wgY2FsbHMgb25jZSB0aGV5J3JlIGFsbCBjb21wbGV0ZWQuIEFsbCBvdXRwdXRzIG11c3QgYmUgc3VibWl0dGVkIGluIGEgc2luZ2xlXG4gICAqIHJlcXVlc3QuXG4gICAqL1xuICBzdWJtaXRUb29sT3V0cHV0cyhcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgYm9keTogUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNOb25TdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8UnVuPjtcbiAgc3VibWl0VG9vbE91dHB1dHMoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIGJvZHk6IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50Pj47XG4gIHN1Ym1pdFRvb2xPdXRwdXRzKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBib2R5OiBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc0Jhc2UsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+IHwgUnVuPjtcbiAgc3VibWl0VG9vbE91dHB1dHMoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIGJvZHk6IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFJ1bj4gfCBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50Pj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL3RocmVhZHMvJHt0aHJlYWRJZH0vcnVucy8ke3J1bklkfS9zdWJtaXRfdG9vbF9vdXRwdXRzYCwge1xuICAgICAgYm9keSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgICAgc3RyZWFtOiBib2R5LnN0cmVhbSA/PyBmYWxzZSxcbiAgICB9KSBhcyBBUElQcm9taXNlPFJ1bj4gfCBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50Pj47XG4gIH1cblxuICAvKipcbiAgICogQSBoZWxwZXIgdG8gc3VibWl0IGEgdG9vbCBvdXRwdXQgdG8gYSBydW4gYW5kIHBvbGwgZm9yIGEgdGVybWluYWwgcnVuIHN0YXRlLlxuICAgKiBNb3JlIGluZm9ybWF0aW9uIG9uIFJ1biBsaWZlY3ljbGVzIGNhbiBiZSBmb3VuZCBoZXJlOlxuICAgKiBodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hc3Npc3RhbnRzL2hvdy1pdC13b3Jrcy9ydW5zLWFuZC1ydW4tc3RlcHNcbiAgICovXG4gIGFzeW5jIHN1Ym1pdFRvb2xPdXRwdXRzQW5kUG9sbChcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgYm9keTogUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNOb25TdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMgJiB7IHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyIH0sXG4gICk6IFByb21pc2U8UnVuPiB7XG4gICAgY29uc3QgcnVuID0gYXdhaXQgdGhpcy5zdWJtaXRUb29sT3V0cHV0cyh0aHJlYWRJZCwgcnVuSWQsIGJvZHksIG9wdGlvbnMpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnBvbGwodGhyZWFkSWQsIHJ1bi5pZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0IHRoZSB0b29sIG91dHB1dHMgZnJvbSBhIHByZXZpb3VzIHJ1biBhbmQgc3RyZWFtIHRoZSBydW4gdG8gYSB0ZXJtaW5hbFxuICAgKiBzdGF0ZS4gTW9yZSBpbmZvcm1hdGlvbiBvbiBSdW4gbGlmZWN5Y2xlcyBjYW4gYmUgZm91bmQgaGVyZTpcbiAgICogaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXNzaXN0YW50cy9ob3ctaXQtd29ya3MvcnVucy1hbmQtcnVuLXN0ZXBzXG4gICAqL1xuICBzdWJtaXRUb29sT3V0cHV0c1N0cmVhbShcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgYm9keTogUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW0sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFzc2lzdGFudFN0cmVhbSB7XG4gICAgcmV0dXJuIEFzc2lzdGFudFN0cmVhbS5jcmVhdGVUb29sQXNzaXN0YW50U3RyZWFtKFxuICAgICAgdGhyZWFkSWQsXG4gICAgICBydW5JZCxcbiAgICAgIHRoaXMuX2NsaWVudC5iZXRhLnRocmVhZHMucnVucyxcbiAgICAgIGJvZHksXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJ1bnNQYWdlIGV4dGVuZHMgQ3Vyc29yUGFnZTxSdW4+IHt9XG5cbi8qKlxuICogVG9vbCBjYWxsIG9iamVjdHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXF1aXJlZEFjdGlvbkZ1bmN0aW9uVG9vbENhbGwge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSB0b29sIGNhbGwuIFRoaXMgSUQgbXVzdCBiZSByZWZlcmVuY2VkIHdoZW4geW91IHN1Ym1pdCB0aGUgdG9vbFxuICAgKiBvdXRwdXRzIGluIHVzaW5nIHRoZVxuICAgKiBbU3VibWl0IHRvb2wgb3V0cHV0cyB0byBydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdWJtaXRUb29sT3V0cHV0cylcbiAgICogZW5kcG9pbnQuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gZGVmaW5pdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uOiBSZXF1aXJlZEFjdGlvbkZ1bmN0aW9uVG9vbENhbGwuRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRvb2wgY2FsbCB0aGUgb3V0cHV0IGlzIHJlcXVpcmVkIGZvci4gRm9yIG5vdywgdGhpcyBpcyBhbHdheXNcbiAgICogYGZ1bmN0aW9uYC5cbiAgICovXG4gIHR5cGU6ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUmVxdWlyZWRBY3Rpb25GdW5jdGlvblRvb2xDYWxsIHtcbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGFyZ3VtZW50cyB0aGF0IHRoZSBtb2RlbCBleHBlY3RzIHlvdSB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBhcmd1bWVudHM6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGV4ZWN1dGlvbiBydW4gb24gYVxuICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW4ge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlXG4gICAqIFthc3Npc3RhbnRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cykgdXNlZCBmb3JcbiAgICogZXhlY3V0aW9uIG9mIHRoaXMgcnVuLlxuICAgKi9cbiAgYXNzaXN0YW50X2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHJ1biB3YXMgY2FuY2VsbGVkLlxuICAgKi9cbiAgY2FuY2VsbGVkX2F0OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBydW4gd2FzIGNvbXBsZXRlZC5cbiAgICovXG4gIGNvbXBsZXRlZF9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHdhcyBjcmVhdGVkLlxuICAgKi9cbiAgY3JlYXRlZF9hdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBydW4gd2lsbCBleHBpcmUuXG4gICAqL1xuICBleHBpcmVzX2F0OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBydW4gZmFpbGVkLlxuICAgKi9cbiAgZmFpbGVkX2F0OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBEZXRhaWxzIG9uIHdoeSB0aGUgcnVuIGlzIGluY29tcGxldGUuIFdpbGwgYmUgYG51bGxgIGlmIHRoZSBydW4gaXMgbm90XG4gICAqIGluY29tcGxldGUuXG4gICAqL1xuICBpbmNvbXBsZXRlX2RldGFpbHM6IFJ1bi5JbmNvbXBsZXRlRGV0YWlscyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnN0cnVjdGlvbnMgdGhhdCB0aGVcbiAgICogW2Fzc2lzdGFudF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKSB1c2VkIGZvclxuICAgKiB0aGlzIHJ1bi5cbiAgICovXG4gIGluc3RydWN0aW9uczogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFzdCBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBydW4uIFdpbGwgYmUgYG51bGxgIGlmIHRoZXJlIGFyZSBubyBlcnJvcnMuXG4gICAqL1xuICBsYXN0X2Vycm9yOiBSdW4uTGFzdEVycm9yIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zIHNwZWNpZmllZCB0byBoYXZlIGJlZW4gdXNlZCBvdmVyIHRoZVxuICAgKiBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICovXG4gIG1heF9jb21wbGV0aW9uX3Rva2VuczogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb21wdCB0b2tlbnMgc3BlY2lmaWVkIHRvIGhhdmUgYmVlbiB1c2VkIG92ZXIgdGhlIGNvdXJzZVxuICAgKiBvZiB0aGUgcnVuLlxuICAgKi9cbiAgbWF4X3Byb21wdF90b2tlbnM6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhOiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1vZGVsIHRoYXQgdGhlXG4gICAqIFthc3Npc3RhbnRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cykgdXNlZCBmb3JcbiAgICogdGhpcyBydW4uXG4gICAqL1xuICBtb2RlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgdGhyZWFkLnJ1bmAuXG4gICAqL1xuICBvYmplY3Q6ICd0aHJlYWQucnVuJztcblxuICAvKipcbiAgICogRGV0YWlscyBvbiB0aGUgYWN0aW9uIHJlcXVpcmVkIHRvIGNvbnRpbnVlIHRoZSBydW4uIFdpbGwgYmUgYG51bGxgIGlmIG5vIGFjdGlvblxuICAgKiBpcyByZXF1aXJlZC5cbiAgICovXG4gIHJlcXVpcmVkX2FjdGlvbjogUnVuLlJlcXVpcmVkQWN0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICAgKiBbR1BULTRvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTRvKSxcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtdHVyYm8tYW5kLWdwdC00KSxcbiAgICogYW5kIGFsbCBHUFQtMy41IFR1cmJvIG1vZGVscyBzaW5jZSBgZ3B0LTMuNS10dXJiby0xMTA2YC5cbiAgICpcbiAgICogU2V0dGluZyB0byBgeyBcInR5cGVcIjogXCJqc29uX29iamVjdFwiIH1gIGVuYWJsZXMgSlNPTiBtb2RlLCB3aGljaCBndWFyYW50ZWVzIHRoZVxuICAgKiBtZXNzYWdlIHRoZSBtb2RlbCBnZW5lcmF0ZXMgaXMgdmFsaWQgSlNPTi5cbiAgICpcbiAgICogKipJbXBvcnRhbnQ6Kiogd2hlbiB1c2luZyBKU09OIG1vZGUsIHlvdSAqKm11c3QqKiBhbHNvIGluc3RydWN0IHRoZSBtb2RlbCB0b1xuICAgKiBwcm9kdWNlIEpTT04geW91cnNlbGYgdmlhIGEgc3lzdGVtIG9yIHVzZXIgbWVzc2FnZS4gV2l0aG91dCB0aGlzLCB0aGUgbW9kZWwgbWF5XG4gICAqIGdlbmVyYXRlIGFuIHVuZW5kaW5nIHN0cmVhbSBvZiB3aGl0ZXNwYWNlIHVudGlsIHRoZSBnZW5lcmF0aW9uIHJlYWNoZXMgdGhlIHRva2VuXG4gICAqIGxpbWl0LCByZXN1bHRpbmcgaW4gYSBsb25nLXJ1bm5pbmcgYW5kIHNlZW1pbmdseSBcInN0dWNrXCIgcmVxdWVzdC4gQWxzbyBub3RlIHRoYXRcbiAgICogdGhlIG1lc3NhZ2UgY29udGVudCBtYXkgYmUgcGFydGlhbGx5IGN1dCBvZmYgaWYgYGZpbmlzaF9yZWFzb249XCJsZW5ndGhcImAsIHdoaWNoXG4gICAqIGluZGljYXRlcyB0aGUgZ2VuZXJhdGlvbiBleGNlZWRlZCBgbWF4X3Rva2Vuc2Agb3IgdGhlIGNvbnZlcnNhdGlvbiBleGNlZWRlZCB0aGVcbiAgICogbWF4IGNvbnRleHQgbGVuZ3RoLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0OiBUaHJlYWRzQVBJLkFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHdhcyBzdGFydGVkLlxuICAgKi9cbiAgc3RhcnRlZF9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHN0YXR1cyBvZiB0aGUgcnVuLCB3aGljaCBjYW4gYmUgZWl0aGVyIGBxdWV1ZWRgLCBgaW5fcHJvZ3Jlc3NgLFxuICAgKiBgcmVxdWlyZXNfYWN0aW9uYCwgYGNhbmNlbGxpbmdgLCBgY2FuY2VsbGVkYCwgYGZhaWxlZGAsIGBjb21wbGV0ZWRgLFxuICAgKiBgaW5jb21wbGV0ZWAsIG9yIGBleHBpcmVkYC5cbiAgICovXG4gIHN0YXR1czogUnVuU3RhdHVzO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcylcbiAgICogdGhhdCB3YXMgZXhlY3V0ZWQgb24gYXMgYSBwYXJ0IG9mIHRoaXMgcnVuLlxuICAgKi9cbiAgdGhyZWFkX2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIHRvb2wgaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbCB3aWxsXG4gICAqIG5vdCBjYWxsIGFueSB0b29scyBhbmQgaW5zdGVhZCBnZW5lcmF0ZXMgYSBtZXNzYWdlLiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICogYW5kIG1lYW5zIHRoZSBtb2RlbCBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmVcbiAgICogdG9vbHMuIGByZXF1aXJlZGAgbWVhbnMgdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scyBiZWZvcmUgcmVzcG9uZGluZ1xuICAgKiB0byB0aGUgdXNlci4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCBsaWtlIGB7XCJ0eXBlXCI6IFwiZmlsZV9zZWFyY2hcIn1gIG9yXG4gICAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gICAqIGNhbGwgdGhhdCB0b29sLlxuICAgKi9cbiAgdG9vbF9jaG9pY2U6IFRocmVhZHNBUEkuQXNzaXN0YW50VG9vbENob2ljZU9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHRvb2xzIHRoYXQgdGhlXG4gICAqIFthc3Npc3RhbnRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cykgdXNlZCBmb3JcbiAgICogdGhpcyBydW4uXG4gICAqL1xuICB0b29sczogQXJyYXk8QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRUb29sPjtcblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIHRydW5jYXRpb25fc3RyYXRlZ3k6IFJ1bi5UcnVuY2F0aW9uU3RyYXRlZ3kgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBVc2FnZSBzdGF0aXN0aWNzIHJlbGF0ZWQgdG8gdGhlIHJ1bi4gVGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYCBpZiB0aGUgcnVuIGlzIG5vdFxuICAgKiBpbiBhIHRlcm1pbmFsIHN0YXRlIChpLmUuIGBpbl9wcm9ncmVzc2AsIGBxdWV1ZWRgLCBldGMuKS5cbiAgICovXG4gIHVzYWdlOiBSdW4uVXNhZ2UgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc2FtcGxpbmcgdGVtcGVyYXR1cmUgdXNlZCBmb3IgdGhpcyBydW4uIElmIG5vdCBzZXQsIGRlZmF1bHRzIHRvIDEuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBudWNsZXVzIHNhbXBsaW5nIHZhbHVlIHVzZWQgZm9yIHRoaXMgcnVuLiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byAxLlxuICAgKi9cbiAgdG9wX3A/OiBudW1iZXIgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1biB7XG4gIC8qKlxuICAgKiBEZXRhaWxzIG9uIHdoeSB0aGUgcnVuIGlzIGluY29tcGxldGUuIFdpbGwgYmUgYG51bGxgIGlmIHRoZSBydW4gaXMgbm90XG4gICAqIGluY29tcGxldGUuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEluY29tcGxldGVEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29uIHdoeSB0aGUgcnVuIGlzIGluY29tcGxldGUuIFRoaXMgd2lsbCBwb2ludCB0byB3aGljaCBzcGVjaWZpYyB0b2tlblxuICAgICAqIGxpbWl0IHdhcyByZWFjaGVkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgcnVuLlxuICAgICAqL1xuICAgIHJlYXNvbj86ICdtYXhfY29tcGxldGlvbl90b2tlbnMnIHwgJ21heF9wcm9tcHRfdG9rZW5zJztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbGFzdCBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBydW4uIFdpbGwgYmUgYG51bGxgIGlmIHRoZXJlIGFyZSBubyBlcnJvcnMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIExhc3RFcnJvciB7XG4gICAgLyoqXG4gICAgICogT25lIG9mIGBzZXJ2ZXJfZXJyb3JgLCBgcmF0ZV9saW1pdF9leGNlZWRlZGAsIG9yIGBpbnZhbGlkX3Byb21wdGAuXG4gICAgICovXG4gICAgY29kZTogJ3NlcnZlcl9lcnJvcicgfCAncmF0ZV9saW1pdF9leGNlZWRlZCcgfCAnaW52YWxpZF9wcm9tcHQnO1xuXG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuXG4gICAgICovXG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGFpbHMgb24gdGhlIGFjdGlvbiByZXF1aXJlZCB0byBjb250aW51ZSB0aGUgcnVuLiBXaWxsIGJlIGBudWxsYCBpZiBubyBhY3Rpb25cbiAgICogaXMgcmVxdWlyZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFJlcXVpcmVkQWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBEZXRhaWxzIG9uIHRoZSB0b29sIG91dHB1dHMgbmVlZGVkIGZvciB0aGlzIHJ1biB0byBjb250aW51ZS5cbiAgICAgKi9cbiAgICBzdWJtaXRfdG9vbF9vdXRwdXRzOiBSZXF1aXJlZEFjdGlvbi5TdWJtaXRUb29sT3V0cHV0cztcblxuICAgIC8qKlxuICAgICAqIEZvciBub3csIHRoaXMgaXMgYWx3YXlzIGBzdWJtaXRfdG9vbF9vdXRwdXRzYC5cbiAgICAgKi9cbiAgICB0eXBlOiAnc3VibWl0X3Rvb2xfb3V0cHV0cyc7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIFJlcXVpcmVkQWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBEZXRhaWxzIG9uIHRoZSB0b29sIG91dHB1dHMgbmVlZGVkIGZvciB0aGlzIHJ1biB0byBjb250aW51ZS5cbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIFN1Ym1pdFRvb2xPdXRwdXRzIHtcbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIHRoZSByZWxldmFudCB0b29sIGNhbGxzLlxuICAgICAgICovXG4gICAgICB0b29sX2NhbGxzOiBBcnJheTxSdW5zQVBJLlJlcXVpcmVkQWN0aW9uRnVuY3Rpb25Ub29sQ2FsbD47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRydW5jYXRpb25TdHJhdGVneSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRydW5jYXRpb24gc3RyYXRlZ3kgdG8gdXNlIGZvciB0aGUgdGhyZWFkLiBUaGUgZGVmYXVsdCBpcyBgYXV0b2AuIElmIHNldCB0b1xuICAgICAqIGBsYXN0X21lc3NhZ2VzYCwgdGhlIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgbiBtb3N0IHJlY2VudCBtZXNzYWdlcyBpblxuICAgICAqIHRoZSB0aHJlYWQuIFdoZW4gc2V0IHRvIGBhdXRvYCwgbWVzc2FnZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdGhyZWFkIHdpbGwgYmVcbiAgICAgKiBkcm9wcGVkIHRvIGZpdCB0aGUgY29udGV4dCBsZW5ndGggb2YgdGhlIG1vZGVsLCBgbWF4X3Byb21wdF90b2tlbnNgLlxuICAgICAqL1xuICAgIHR5cGU6ICdhdXRvJyB8ICdsYXN0X21lc3NhZ2VzJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbW9zdCByZWNlbnQgbWVzc2FnZXMgZnJvbSB0aGUgdGhyZWFkIHdoZW4gY29uc3RydWN0aW5nIHRoZSBjb250ZXh0XG4gICAgICogZm9yIHRoZSBydW4uXG4gICAgICovXG4gICAgbGFzdF9tZXNzYWdlcz86IG51bWJlciB8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVXNhZ2Ugc3RhdGlzdGljcyByZWxhdGVkIHRvIHRoZSBydW4uIFRoaXMgdmFsdWUgd2lsbCBiZSBgbnVsbGAgaWYgdGhlIHJ1biBpcyBub3RcbiAgICogaW4gYSB0ZXJtaW5hbCBzdGF0ZSAoaS5lLiBgaW5fcHJvZ3Jlc3NgLCBgcXVldWVkYCwgZXRjLikuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFVzYWdlIHtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnMgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICAgKi9cbiAgICBjb21wbGV0aW9uX3Rva2VuczogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHByb21wdCB0b2tlbnMgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICAgKi9cbiAgICBwcm9tcHRfdG9rZW5zOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgdG9rZW5zIHVzZWQgKHByb21wdCArIGNvbXBsZXRpb24pLlxuICAgICAqL1xuICAgIHRvdGFsX3Rva2VuczogbnVtYmVyO1xuICB9XG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgcnVuLCB3aGljaCBjYW4gYmUgZWl0aGVyIGBxdWV1ZWRgLCBgaW5fcHJvZ3Jlc3NgLFxuICogYHJlcXVpcmVzX2FjdGlvbmAsIGBjYW5jZWxsaW5nYCwgYGNhbmNlbGxlZGAsIGBmYWlsZWRgLCBgY29tcGxldGVkYCxcbiAqIGBpbmNvbXBsZXRlYCwgb3IgYGV4cGlyZWRgLlxuICovXG5leHBvcnQgdHlwZSBSdW5TdGF0dXMgPVxuICB8ICdxdWV1ZWQnXG4gIHwgJ2luX3Byb2dyZXNzJ1xuICB8ICdyZXF1aXJlc19hY3Rpb24nXG4gIHwgJ2NhbmNlbGxpbmcnXG4gIHwgJ2NhbmNlbGxlZCdcbiAgfCAnZmFpbGVkJ1xuICB8ICdjb21wbGV0ZWQnXG4gIHwgJ2luY29tcGxldGUnXG4gIHwgJ2V4cGlyZWQnO1xuXG5leHBvcnQgdHlwZSBSdW5DcmVhdGVQYXJhbXMgPSBSdW5DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgfCBSdW5DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuQ3JlYXRlUGFyYW1zQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlXG4gICAqIFthc3Npc3RhbnRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cykgdG8gdXNlIHRvXG4gICAqIGV4ZWN1dGUgdGhpcyBydW4uXG4gICAqL1xuICBhc3Npc3RhbnRfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQXBwZW5kcyBhZGRpdGlvbmFsIGluc3RydWN0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBydW4uIFRoaXNcbiAgICogaXMgdXNlZnVsIGZvciBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcyB3aXRob3V0IG92ZXJyaWRpbmcgb3RoZXJcbiAgICogaW5zdHJ1Y3Rpb25zLlxuICAgKi9cbiAgYWRkaXRpb25hbF9pbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFkZGl0aW9uYWwgbWVzc2FnZXMgdG8gdGhlIHRocmVhZCBiZWZvcmUgY3JlYXRpbmcgdGhlIHJ1bi5cbiAgICovXG4gIGFkZGl0aW9uYWxfbWVzc2FnZXM/OiBBcnJheTxSdW5DcmVhdGVQYXJhbXMuQWRkaXRpb25hbE1lc3NhZ2U+IHwgbnVsbDtcblxuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZVxuICAgKiBbaW5zdHJ1Y3Rpb25zXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMvY3JlYXRlQXNzaXN0YW50KVxuICAgKiBvZiB0aGUgYXNzaXN0YW50LiBUaGlzIGlzIHVzZWZ1bCBmb3IgbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlXG4gICAqIHJ1bi4gVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIGNvbXBsZXRpb24gdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X2NvbXBsZXRpb25fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb21wdCB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICogVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIHByb21wdCB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogcHJvbXB0IHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9wcm9tcHRfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBbTW9kZWxdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzKSB0b1xuICAgKiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhpcyBydW4uIElmIGEgdmFsdWUgaXMgcHJvdmlkZWQgaGVyZSwgaXQgd2lsbCBvdmVycmlkZSB0aGVcbiAgICogbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3Npc3RhbnQuIElmIG5vdCwgdGhlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICogYXNzaXN0YW50IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIG1vZGVsPzpcbiAgICB8IChzdHJpbmcgJiB7fSlcbiAgICB8ICdncHQtNG8nXG4gICAgfCAnZ3B0LTRvLTIwMjQtMDUtMTMnXG4gICAgfCAnZ3B0LTQtdHVyYm8nXG4gICAgfCAnZ3B0LTQtdHVyYm8tMjAyNC0wNC0wOSdcbiAgICB8ICdncHQtNC0wMTI1LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdHVyYm8tcHJldmlldydcbiAgICB8ICdncHQtNC0xMTA2LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdmlzaW9uLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQnXG4gICAgfCAnZ3B0LTQtMDMxNCdcbiAgICB8ICdncHQtNC0wNjEzJ1xuICAgIHwgJ2dwdC00LTMyaydcbiAgICB8ICdncHQtNC0zMmstMDMxNCdcbiAgICB8ICdncHQtNC0zMmstMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvLTExMDYnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wMTI1J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrLTA2MTMnXG4gICAgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGZvcm1hdCB0aGF0IHRoZSBtb2RlbCBtdXN0IG91dHB1dC4gQ29tcGF0aWJsZSB3aXRoXG4gICAqIFtHUFQtNG9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNG8pLFxuICAgKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC10dXJiby1hbmQtZ3B0LTQpLFxuICAgKiBhbmQgYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIHNpbmNlIGBncHQtMy41LXR1cmJvLTExMDZgLlxuICAgKlxuICAgKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gICAqIG1lc3NhZ2UgdGhlIG1vZGVsIGdlbmVyYXRlcyBpcyB2YWxpZCBKU09OLlxuICAgKlxuICAgKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gICAqIHByb2R1Y2UgSlNPTiB5b3Vyc2VsZiB2aWEgYSBzeXN0ZW0gb3IgdXNlciBtZXNzYWdlLiBXaXRob3V0IHRoaXMsIHRoZSBtb2RlbCBtYXlcbiAgICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAgICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IG1heSBiZSBwYXJ0aWFsbHkgY3V0IG9mZiBpZiBgZmluaXNoX3JlYXNvbj1cImxlbmd0aFwiYCwgd2hpY2hcbiAgICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICAgKiBtYXggY29udGV4dCBsZW5ndGguXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBUaHJlYWRzQVBJLkFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCByZXR1cm5zIGEgc3RyZWFtIG9mIGV2ZW50cyB0aGF0IGhhcHBlbiBkdXJpbmcgdGhlIFJ1biBhcyBzZXJ2ZXItc2VudFxuICAgKiBldmVudHMsIHRlcm1pbmF0aW5nIHdoZW4gdGhlIFJ1biBlbnRlcnMgYSB0ZXJtaW5hbCBzdGF0ZSB3aXRoIGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICovXG4gIHN0cmVhbT86IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGF0IHNhbXBsaW5nIHRlbXBlcmF0dXJlIHRvIHVzZSwgYmV0d2VlbiAwIGFuZCAyLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGxcbiAgICogbWFrZSB0aGUgb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmVcbiAgICogZm9jdXNlZCBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hpY2ggKGlmIGFueSkgdG9vbCBpcyBjYWxsZWQgYnkgdGhlIG1vZGVsLiBgbm9uZWAgbWVhbnMgdGhlIG1vZGVsIHdpbGxcbiAgICogbm90IGNhbGwgYW55IHRvb2xzIGFuZCBpbnN0ZWFkIGdlbmVyYXRlcyBhIG1lc3NhZ2UuIGBhdXRvYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgKiBhbmQgbWVhbnMgdGhlIG1vZGVsIGNhbiBwaWNrIGJldHdlZW4gZ2VuZXJhdGluZyBhIG1lc3NhZ2Ugb3IgY2FsbGluZyBvbmUgb3IgbW9yZVxuICAgKiB0b29scy4gYHJlcXVpcmVkYCBtZWFucyB0aGUgbW9kZWwgbXVzdCBjYWxsIG9uZSBvciBtb3JlIHRvb2xzIGJlZm9yZSByZXNwb25kaW5nXG4gICAqIHRvIHRoZSB1c2VyLiBTcGVjaWZ5aW5nIGEgcGFydGljdWxhciB0b29sIGxpa2UgYHtcInR5cGVcIjogXCJmaWxlX3NlYXJjaFwifWAgb3JcbiAgICogYHtcInR5cGVcIjogXCJmdW5jdGlvblwiLCBcImZ1bmN0aW9uXCI6IHtcIm5hbWVcIjogXCJteV9mdW5jdGlvblwifX1gIGZvcmNlcyB0aGUgbW9kZWwgdG9cbiAgICogY2FsbCB0aGF0IHRvb2wuXG4gICAqL1xuICB0b29sX2Nob2ljZT86IFRocmVhZHNBUEkuQXNzaXN0YW50VG9vbENob2ljZU9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSB0b29scyB0aGUgYXNzaXN0YW50IGNhbiB1c2UgZm9yIHRoaXMgcnVuLiBUaGlzIGlzIHVzZWZ1bCBmb3JcbiAgICogbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQXNzaXN0YW50VG9vbD4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBzYW1wbGluZyB3aXRoIHRlbXBlcmF0dXJlLCBjYWxsZWQgbnVjbGV1cyBzYW1wbGluZywgd2hlcmUgdGhlXG4gICAqIG1vZGVsIGNvbnNpZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgdG9rZW5zIHdpdGggdG9wX3AgcHJvYmFiaWxpdHkgbWFzcy4gU28gMC4xXG4gICAqIG1lYW5zIG9ubHkgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0b3AgMTAlIHByb2JhYmlsaXR5IG1hc3MgYXJlIGNvbnNpZGVyZWQuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciB0ZW1wZXJhdHVyZSBidXQgbm90IGJvdGguXG4gICAqL1xuICB0b3BfcD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICB0cnVuY2F0aW9uX3N0cmF0ZWd5PzogUnVuQ3JlYXRlUGFyYW1zLlRydW5jYXRpb25TdHJhdGVneSB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUnVuQ3JlYXRlUGFyYW1zIHtcbiAgZXhwb3J0IGludGVyZmFjZSBBZGRpdGlvbmFsTWVzc2FnZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRleHQgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgY29udGVudDogc3RyaW5nIHwgQXJyYXk8TWVzc2FnZXNBUEkuTWVzc2FnZUNvbnRlbnRQYXJ0UGFyYW0+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJvbGUgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGNyZWF0aW5nIHRoZSBtZXNzYWdlLiBBbGxvd2VkIHZhbHVlcyBpbmNsdWRlOlxuICAgICAqXG4gICAgICogLSBgdXNlcmA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBzZW50IGJ5IGFuIGFjdHVhbCB1c2VyIGFuZCBzaG91bGQgYmUgdXNlZCBpblxuICAgICAqICAgbW9zdCBjYXNlcyB0byByZXByZXNlbnQgdXNlci1nZW5lcmF0ZWQgbWVzc2FnZXMuXG4gICAgICogLSBgYXNzaXN0YW50YDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGdlbmVyYXRlZCBieSB0aGUgYXNzaXN0YW50LiBVc2UgdGhpc1xuICAgICAqICAgdmFsdWUgdG8gaW5zZXJ0IG1lc3NhZ2VzIGZyb20gdGhlIGFzc2lzdGFudCBpbnRvIHRoZSBjb252ZXJzYXRpb24uXG4gICAgICovXG4gICAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UsIGFuZCB0aGUgdG9vbHMgdGhleSBzaG91bGQgYmUgYWRkZWQgdG8uXG4gICAgICovXG4gICAgYXR0YWNobWVudHM/OiBBcnJheTxBZGRpdGlvbmFsTWVzc2FnZS5BdHRhY2htZW50PiB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgQWRkaXRpb25hbE1lc3NhZ2Uge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudCB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBJRCBvZiB0aGUgZmlsZSB0byBhdHRhY2ggdG8gdGhlIG1lc3NhZ2UuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIHRvb2xzIHRvIGFkZCB0aGlzIGZpbGUgdG8uXG4gICAgICAgKi9cbiAgICAgIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbD47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRydW5jYXRpb25TdHJhdGVneSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRydW5jYXRpb24gc3RyYXRlZ3kgdG8gdXNlIGZvciB0aGUgdGhyZWFkLiBUaGUgZGVmYXVsdCBpcyBgYXV0b2AuIElmIHNldCB0b1xuICAgICAqIGBsYXN0X21lc3NhZ2VzYCwgdGhlIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgbiBtb3N0IHJlY2VudCBtZXNzYWdlcyBpblxuICAgICAqIHRoZSB0aHJlYWQuIFdoZW4gc2V0IHRvIGBhdXRvYCwgbWVzc2FnZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdGhyZWFkIHdpbGwgYmVcbiAgICAgKiBkcm9wcGVkIHRvIGZpdCB0aGUgY29udGV4dCBsZW5ndGggb2YgdGhlIG1vZGVsLCBgbWF4X3Byb21wdF90b2tlbnNgLlxuICAgICAqL1xuICAgIHR5cGU6ICdhdXRvJyB8ICdsYXN0X21lc3NhZ2VzJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbW9zdCByZWNlbnQgbWVzc2FnZXMgZnJvbSB0aGUgdGhyZWFkIHdoZW4gY29uc3RydWN0aW5nIHRoZSBjb250ZXh0XG4gICAgICogZm9yIHRoZSBydW4uXG4gICAgICovXG4gICAgbGFzdF9tZXNzYWdlcz86IG51bWJlciB8IG51bGw7XG4gIH1cblxuICBleHBvcnQgdHlwZSBSdW5DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgPSBSdW5zQVBJLlJ1bkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IHR5cGUgUnVuQ3JlYXRlUGFyYW1zU3RyZWFtaW5nID0gUnVuc0FQSS5SdW5DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nIGV4dGVuZHMgUnVuQ3JlYXRlUGFyYW1zQmFzZSB7XG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHJldHVybnMgYSBzdHJlYW0gb2YgZXZlbnRzIHRoYXQgaGFwcGVuIGR1cmluZyB0aGUgUnVuIGFzIHNlcnZlci1zZW50XG4gICAqIGV2ZW50cywgdGVybWluYXRpbmcgd2hlbiB0aGUgUnVuIGVudGVycyBhIHRlcm1pbmFsIHN0YXRlIHdpdGggYSBgZGF0YTogW0RPTkVdYFxuICAgKiBtZXNzYWdlLlxuICAgKi9cbiAgc3RyZWFtPzogZmFsc2UgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bkNyZWF0ZVBhcmFtc1N0cmVhbWluZyBleHRlbmRzIFJ1bkNyZWF0ZVBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogSWYgYHRydWVgLCByZXR1cm5zIGEgc3RyZWFtIG9mIGV2ZW50cyB0aGF0IGhhcHBlbiBkdXJpbmcgdGhlIFJ1biBhcyBzZXJ2ZXItc2VudFxuICAgKiBldmVudHMsIHRlcm1pbmF0aW5nIHdoZW4gdGhlIFJ1biBlbnRlcnMgYSB0ZXJtaW5hbCBzdGF0ZSB3aXRoIGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICovXG4gIHN0cmVhbTogdHJ1ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5VcGRhdGVQYXJhbXMge1xuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5MaXN0UGFyYW1zIGV4dGVuZHMgQ3Vyc29yUGFnZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGN1cnNvciBmb3IgdXNlIGluIHBhZ2luYXRpb24uIGBiZWZvcmVgIGlzIGFuIG9iamVjdCBJRCB0aGF0IGRlZmluZXMgeW91ciBwbGFjZVxuICAgKiBpbiB0aGUgbGlzdC4gRm9yIGluc3RhbmNlLCBpZiB5b3UgbWFrZSBhIGxpc3QgcmVxdWVzdCBhbmQgcmVjZWl2ZSAxMDAgb2JqZWN0cyxcbiAgICogZW5kaW5nIHdpdGggb2JqX2ZvbywgeW91ciBzdWJzZXF1ZW50IGNhbGwgY2FuIGluY2x1ZGUgYmVmb3JlPW9ial9mb28gaW4gb3JkZXIgdG9cbiAgICogZmV0Y2ggdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIGxpc3QuXG4gICAqL1xuICBiZWZvcmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNvcnQgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lc3RhbXAgb2YgdGhlIG9iamVjdHMuIGBhc2NgIGZvciBhc2NlbmRpbmdcbiAgICogb3JkZXIgYW5kIGBkZXNjYCBmb3IgZGVzY2VuZGluZyBvcmRlci5cbiAgICovXG4gIG9yZGVyPzogJ2FzYycgfCAnZGVzYyc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuQ3JlYXRlQW5kUG9sbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlXG4gICAqIFthc3Npc3RhbnRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cykgdG8gdXNlIHRvXG4gICAqIGV4ZWN1dGUgdGhpcyBydW4uXG4gICAqL1xuICBhc3Npc3RhbnRfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQXBwZW5kcyBhZGRpdGlvbmFsIGluc3RydWN0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBydW4uIFRoaXNcbiAgICogaXMgdXNlZnVsIGZvciBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcyB3aXRob3V0IG92ZXJyaWRpbmcgb3RoZXJcbiAgICogaW5zdHJ1Y3Rpb25zLlxuICAgKi9cbiAgYWRkaXRpb25hbF9pbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFkZGl0aW9uYWwgbWVzc2FnZXMgdG8gdGhlIHRocmVhZCBiZWZvcmUgY3JlYXRpbmcgdGhlIHJ1bi5cbiAgICovXG4gIGFkZGl0aW9uYWxfbWVzc2FnZXM/OiBBcnJheTxSdW5DcmVhdGVBbmRQb2xsUGFyYW1zLkFkZGl0aW9uYWxNZXNzYWdlPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyB0aGVcbiAgICogW2luc3RydWN0aW9uc10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzL2NyZWF0ZUFzc2lzdGFudClcbiAgICogb2YgdGhlIGFzc2lzdGFudC4gVGhpcyBpcyB1c2VmdWwgZm9yIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zIHRoYXQgbWF5IGJlIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZVxuICAgKiBydW4uIFRoZSBydW4gd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gdXNlIG9ubHkgdGhlIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2Vuc1xuICAgKiBzcGVjaWZpZWQsIGFjcm9zcyBtdWx0aXBsZSB0dXJucyBvZiB0aGUgcnVuLiBJZiB0aGUgcnVuIGV4Y2VlZHMgdGhlIG51bWJlciBvZlxuICAgKiBjb21wbGV0aW9uIHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9jb21wbGV0aW9uX3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9tcHQgdG9rZW5zIHRoYXQgbWF5IGJlIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBydW4uXG4gICAqIFRoZSBydW4gd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gdXNlIG9ubHkgdGhlIG51bWJlciBvZiBwcm9tcHQgdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIHByb21wdCB0b2tlbnMgc3BlY2lmaWVkLCB0aGUgcnVuIHdpbGwgZW5kIHdpdGggc3RhdHVzIGBpbmNvbXBsZXRlYC4gU2VlXG4gICAqIGBpbmNvbXBsZXRlX2RldGFpbHNgIGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBtYXhfcHJvbXB0X3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgW01vZGVsXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21vZGVscykgdG9cbiAgICogYmUgdXNlZCB0byBleGVjdXRlIHRoaXMgcnVuLiBJZiBhIHZhbHVlIGlzIHByb3ZpZGVkIGhlcmUsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlXG4gICAqIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaXN0YW50LiBJZiBub3QsIHRoZSBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAqIGFzc2lzdGFudCB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBtb2RlbD86XG4gICAgfCAoc3RyaW5nICYge30pXG4gICAgfCAnZ3B0LTRvJ1xuICAgIHwgJ2dwdC00by0yMDI0LTA1LTEzJ1xuICAgIHwgJ2dwdC00LXR1cmJvJ1xuICAgIHwgJ2dwdC00LXR1cmJvLTIwMjQtMDQtMDknXG4gICAgfCAnZ3B0LTQtMDEyNS1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXR1cmJvLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtMTEwNi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXZpc2lvbi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00J1xuICAgIHwgJ2dwdC00LTAzMTQnXG4gICAgfCAnZ3B0LTQtMDYxMydcbiAgICB8ICdncHQtNC0zMmsnXG4gICAgfCAnZ3B0LTQtMzJrLTAzMTQnXG4gICAgfCAnZ3B0LTQtMzJrLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJibydcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2aydcbiAgICB8ICdncHQtMy41LXR1cmJvLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xMTA2J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDEyNSdcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2ay0wNjEzJ1xuICAgIHwgbnVsbDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICAgKiBbR1BULTRvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTRvKSxcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtdHVyYm8tYW5kLWdwdC00KSxcbiAgICogYW5kIGFsbCBHUFQtMy41IFR1cmJvIG1vZGVscyBzaW5jZSBgZ3B0LTMuNS10dXJiby0xMTA2YC5cbiAgICpcbiAgICogU2V0dGluZyB0byBgeyBcInR5cGVcIjogXCJqc29uX29iamVjdFwiIH1gIGVuYWJsZXMgSlNPTiBtb2RlLCB3aGljaCBndWFyYW50ZWVzIHRoZVxuICAgKiBtZXNzYWdlIHRoZSBtb2RlbCBnZW5lcmF0ZXMgaXMgdmFsaWQgSlNPTi5cbiAgICpcbiAgICogKipJbXBvcnRhbnQ6Kiogd2hlbiB1c2luZyBKU09OIG1vZGUsIHlvdSAqKm11c3QqKiBhbHNvIGluc3RydWN0IHRoZSBtb2RlbCB0b1xuICAgKiBwcm9kdWNlIEpTT04geW91cnNlbGYgdmlhIGEgc3lzdGVtIG9yIHVzZXIgbWVzc2FnZS4gV2l0aG91dCB0aGlzLCB0aGUgbW9kZWwgbWF5XG4gICAqIGdlbmVyYXRlIGFuIHVuZW5kaW5nIHN0cmVhbSBvZiB3aGl0ZXNwYWNlIHVudGlsIHRoZSBnZW5lcmF0aW9uIHJlYWNoZXMgdGhlIHRva2VuXG4gICAqIGxpbWl0LCByZXN1bHRpbmcgaW4gYSBsb25nLXJ1bm5pbmcgYW5kIHNlZW1pbmdseSBcInN0dWNrXCIgcmVxdWVzdC4gQWxzbyBub3RlIHRoYXRcbiAgICogdGhlIG1lc3NhZ2UgY29udGVudCBtYXkgYmUgcGFydGlhbGx5IGN1dCBvZmYgaWYgYGZpbmlzaF9yZWFzb249XCJsZW5ndGhcImAsIHdoaWNoXG4gICAqIGluZGljYXRlcyB0aGUgZ2VuZXJhdGlvbiBleGNlZWRlZCBgbWF4X3Rva2Vuc2Agb3IgdGhlIGNvbnZlcnNhdGlvbiBleGNlZWRlZCB0aGVcbiAgICogbWF4IGNvbnRleHQgbGVuZ3RoLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogVGhyZWFkc0FQSS5Bc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoYXQgc2FtcGxpbmcgdGVtcGVyYXR1cmUgdG8gdXNlLCBiZXR3ZWVuIDAgYW5kIDIuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbFxuICAgKiBtYWtlIHRoZSBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZVxuICAgKiBmb2N1c2VkIGFuZCBkZXRlcm1pbmlzdGljLlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGljaCAoaWYgYW55KSB0b29sIGlzIGNhbGxlZCBieSB0aGUgbW9kZWwuIGBub25lYCBtZWFucyB0aGUgbW9kZWwgd2lsbFxuICAgKiBub3QgY2FsbCBhbnkgdG9vbHMgYW5kIGluc3RlYWQgZ2VuZXJhdGVzIGEgbWVzc2FnZS4gYGF1dG9gIGlzIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAqIGFuZCBtZWFucyB0aGUgbW9kZWwgY2FuIHBpY2sgYmV0d2VlbiBnZW5lcmF0aW5nIGEgbWVzc2FnZSBvciBjYWxsaW5nIG9uZSBvciBtb3JlXG4gICAqIHRvb2xzLiBgcmVxdWlyZWRgIG1lYW5zIHRoZSBtb2RlbCBtdXN0IGNhbGwgb25lIG9yIG1vcmUgdG9vbHMgYmVmb3JlIHJlc3BvbmRpbmdcbiAgICogdG8gdGhlIHVzZXIuIFNwZWNpZnlpbmcgYSBwYXJ0aWN1bGFyIHRvb2wgbGlrZSBge1widHlwZVwiOiBcImZpbGVfc2VhcmNoXCJ9YCBvclxuICAgKiBge1widHlwZVwiOiBcImZ1bmN0aW9uXCIsIFwiZnVuY3Rpb25cIjoge1wibmFtZVwiOiBcIm15X2Z1bmN0aW9uXCJ9fWAgZm9yY2VzIHRoZSBtb2RlbCB0b1xuICAgKiBjYWxsIHRoYXQgdG9vbC5cbiAgICovXG4gIHRvb2xfY2hvaWNlPzogVGhyZWFkc0FQSS5Bc3Npc3RhbnRUb29sQ2hvaWNlT3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIHRvb2xzIHRoZSBhc3Npc3RhbnQgY2FuIHVzZSBmb3IgdGhpcyBydW4uIFRoaXMgaXMgdXNlZnVsIGZvclxuICAgKiBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRUb29sPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIHRlbXBlcmF0dXJlIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIHRydW5jYXRpb25fc3RyYXRlZ3k/OiBSdW5DcmVhdGVBbmRQb2xsUGFyYW1zLlRydW5jYXRpb25TdHJhdGVneSB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUnVuQ3JlYXRlQW5kUG9sbFBhcmFtcyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgQWRkaXRpb25hbE1lc3NhZ2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSB0ZXh0IGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlLlxuICAgICAqL1xuICAgIGNvbnRlbnQ6IHN0cmluZyB8IEFycmF5PE1lc3NhZ2VzQVBJLk1lc3NhZ2VDb250ZW50UGFydFBhcmFtPjtcblxuICAgIC8qKlxuICAgICAqIFRoZSByb2xlIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjcmVhdGluZyB0aGUgbWVzc2FnZS4gQWxsb3dlZCB2YWx1ZXMgaW5jbHVkZTpcbiAgICAgKlxuICAgICAqIC0gYHVzZXJgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgc2VudCBieSBhbiBhY3R1YWwgdXNlciBhbmQgc2hvdWxkIGJlIHVzZWQgaW5cbiAgICAgKiAgIG1vc3QgY2FzZXMgdG8gcmVwcmVzZW50IHVzZXItZ2VuZXJhdGVkIG1lc3NhZ2VzLlxuICAgICAqIC0gYGFzc2lzdGFudGA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIGFzc2lzdGFudC4gVXNlIHRoaXNcbiAgICAgKiAgIHZhbHVlIHRvIGluc2VydCBtZXNzYWdlcyBmcm9tIHRoZSBhc3Npc3RhbnQgaW50byB0aGUgY29udmVyc2F0aW9uLlxuICAgICAqL1xuICAgIHJvbGU6ICd1c2VyJyB8ICdhc3Npc3RhbnQnO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZpbGVzIGF0dGFjaGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQgdGhlIHRvb2xzIHRoZXkgc2hvdWxkIGJlIGFkZGVkIHRvLlxuICAgICAqL1xuICAgIGF0dGFjaG1lbnRzPzogQXJyYXk8QWRkaXRpb25hbE1lc3NhZ2UuQXR0YWNobWVudD4gfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIEFkZGl0aW9uYWxNZXNzYWdlIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIEF0dGFjaG1lbnQge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgdG8gYXR0YWNoIHRvIHRoZSBtZXNzYWdlLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0b29scyB0byBhZGQgdGhpcyBmaWxlIHRvLlxuICAgICAgICovXG4gICAgICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQ29kZUludGVycHJldGVyVG9vbCB8IEFzc2lzdGFudHNBUEkuRmlsZVNlYXJjaFRvb2w+O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUcnVuY2F0aW9uU3RyYXRlZ3kge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cnVuY2F0aW9uIHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIHRocmVhZC4gVGhlIGRlZmF1bHQgaXMgYGF1dG9gLiBJZiBzZXQgdG9cbiAgICAgKiBgbGFzdF9tZXNzYWdlc2AsIHRoZSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gdGhlIG4gbW9zdCByZWNlbnQgbWVzc2FnZXMgaW5cbiAgICAgKiB0aGUgdGhyZWFkLiBXaGVuIHNldCB0byBgYXV0b2AsIG1lc3NhZ2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRocmVhZCB3aWxsIGJlXG4gICAgICogZHJvcHBlZCB0byBmaXQgdGhlIGNvbnRleHQgbGVuZ3RoIG9mIHRoZSBtb2RlbCwgYG1heF9wcm9tcHRfdG9rZW5zYC5cbiAgICAgKi9cbiAgICB0eXBlOiAnYXV0bycgfCAnbGFzdF9tZXNzYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGZyb20gdGhlIHRocmVhZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgY29udGV4dFxuICAgICAqIGZvciB0aGUgcnVuLlxuICAgICAqL1xuICAgIGxhc3RfbWVzc2FnZXM/OiBudW1iZXIgfCBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuQ3JlYXRlQW5kU3RyZWFtUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGVcbiAgICogW2Fzc2lzdGFudF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKSB0byB1c2UgdG9cbiAgICogZXhlY3V0ZSB0aGlzIHJ1bi5cbiAgICovXG4gIGFzc2lzdGFudF9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zIGF0IHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9ucyBmb3IgdGhlIHJ1bi4gVGhpc1xuICAgKiBpcyB1c2VmdWwgZm9yIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzIHdpdGhvdXQgb3ZlcnJpZGluZyBvdGhlclxuICAgKiBpbnN0cnVjdGlvbnMuXG4gICAqL1xuICBhZGRpdGlvbmFsX2luc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFkZHMgYWRkaXRpb25hbCBtZXNzYWdlcyB0byB0aGUgdGhyZWFkIGJlZm9yZSBjcmVhdGluZyB0aGUgcnVuLlxuICAgKi9cbiAgYWRkaXRpb25hbF9tZXNzYWdlcz86IEFycmF5PFJ1bkNyZWF0ZUFuZFN0cmVhbVBhcmFtcy5BZGRpdGlvbmFsTWVzc2FnZT4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlXG4gICAqIFtpbnN0cnVjdGlvbnNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cy9jcmVhdGVBc3Npc3RhbnQpXG4gICAqIG9mIHRoZSBhc3Npc3RhbnQuIFRoaXMgaXMgdXNlZnVsIGZvciBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIGluc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGVcbiAgICogcnVuLiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogY29tcGxldGlvbiB0b2tlbnMgc3BlY2lmaWVkLCB0aGUgcnVuIHdpbGwgZW5kIHdpdGggc3RhdHVzIGBpbmNvbXBsZXRlYC4gU2VlXG4gICAqIGBpbmNvbXBsZXRlX2RldGFpbHNgIGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBtYXhfY29tcGxldGlvbl90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvbXB0IHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgcnVuLlxuICAgKiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgcHJvbXB0IHRva2Vuc1xuICAgKiBzcGVjaWZpZWQsIGFjcm9zcyBtdWx0aXBsZSB0dXJucyBvZiB0aGUgcnVuLiBJZiB0aGUgcnVuIGV4Y2VlZHMgdGhlIG51bWJlciBvZlxuICAgKiBwcm9tcHQgdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X3Byb21wdF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFtNb2RlbF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tb2RlbHMpIHRvXG4gICAqIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIHJ1bi4gSWYgYSB2YWx1ZSBpcyBwcm92aWRlZCBoZXJlLCBpdCB3aWxsIG92ZXJyaWRlIHRoZVxuICAgKiBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudC4gSWYgbm90LCB0aGUgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgKiBhc3Npc3RhbnQgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgbW9kZWw/OlxuICAgIHwgKHN0cmluZyAmIHt9KVxuICAgIHwgJ2dwdC00bydcbiAgICB8ICdncHQtNG8tMjAyNC0wNS0xMydcbiAgICB8ICdncHQtNC10dXJibydcbiAgICB8ICdncHQtNC10dXJiby0yMDI0LTA0LTA5J1xuICAgIHwgJ2dwdC00LTAxMjUtcHJldmlldydcbiAgICB8ICdncHQtNC10dXJiby1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LTExMDYtcHJldmlldydcbiAgICB8ICdncHQtNC12aXNpb24tcHJldmlldydcbiAgICB8ICdncHQtNCdcbiAgICB8ICdncHQtNC0wMzE0J1xuICAgIHwgJ2dwdC00LTA2MTMnXG4gICAgfCAnZ3B0LTQtMzJrJ1xuICAgIHwgJ2dwdC00LTMyay0wMzE0J1xuICAgIHwgJ2dwdC00LTMyay0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8nXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmsnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTEwNidcbiAgICB8ICdncHQtMy41LXR1cmJvLTAxMjUnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmstMDYxMydcbiAgICB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00b10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00byksXG4gICAqIFtHUFQtNCBUdXJib10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00LXR1cmJvLWFuZC1ncHQtNCksXG4gICAqIGFuZCBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IFRocmVhZHNBUEkuQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGF0IHNhbXBsaW5nIHRlbXBlcmF0dXJlIHRvIHVzZSwgYmV0d2VlbiAwIGFuZCAyLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGxcbiAgICogbWFrZSB0aGUgb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmVcbiAgICogZm9jdXNlZCBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hpY2ggKGlmIGFueSkgdG9vbCBpcyBjYWxsZWQgYnkgdGhlIG1vZGVsLiBgbm9uZWAgbWVhbnMgdGhlIG1vZGVsIHdpbGxcbiAgICogbm90IGNhbGwgYW55IHRvb2xzIGFuZCBpbnN0ZWFkIGdlbmVyYXRlcyBhIG1lc3NhZ2UuIGBhdXRvYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgKiBhbmQgbWVhbnMgdGhlIG1vZGVsIGNhbiBwaWNrIGJldHdlZW4gZ2VuZXJhdGluZyBhIG1lc3NhZ2Ugb3IgY2FsbGluZyBvbmUgb3IgbW9yZVxuICAgKiB0b29scy4gYHJlcXVpcmVkYCBtZWFucyB0aGUgbW9kZWwgbXVzdCBjYWxsIG9uZSBvciBtb3JlIHRvb2xzIGJlZm9yZSByZXNwb25kaW5nXG4gICAqIHRvIHRoZSB1c2VyLiBTcGVjaWZ5aW5nIGEgcGFydGljdWxhciB0b29sIGxpa2UgYHtcInR5cGVcIjogXCJmaWxlX3NlYXJjaFwifWAgb3JcbiAgICogYHtcInR5cGVcIjogXCJmdW5jdGlvblwiLCBcImZ1bmN0aW9uXCI6IHtcIm5hbWVcIjogXCJteV9mdW5jdGlvblwifX1gIGZvcmNlcyB0aGUgbW9kZWwgdG9cbiAgICogY2FsbCB0aGF0IHRvb2wuXG4gICAqL1xuICB0b29sX2Nob2ljZT86IFRocmVhZHNBUEkuQXNzaXN0YW50VG9vbENob2ljZU9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSB0b29scyB0aGUgYXNzaXN0YW50IGNhbiB1c2UgZm9yIHRoaXMgcnVuLiBUaGlzIGlzIHVzZWZ1bCBmb3JcbiAgICogbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQXNzaXN0YW50VG9vbD4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBzYW1wbGluZyB3aXRoIHRlbXBlcmF0dXJlLCBjYWxsZWQgbnVjbGV1cyBzYW1wbGluZywgd2hlcmUgdGhlXG4gICAqIG1vZGVsIGNvbnNpZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgdG9rZW5zIHdpdGggdG9wX3AgcHJvYmFiaWxpdHkgbWFzcy4gU28gMC4xXG4gICAqIG1lYW5zIG9ubHkgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0b3AgMTAlIHByb2JhYmlsaXR5IG1hc3MgYXJlIGNvbnNpZGVyZWQuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciB0ZW1wZXJhdHVyZSBidXQgbm90IGJvdGguXG4gICAqL1xuICB0b3BfcD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICB0cnVuY2F0aW9uX3N0cmF0ZWd5PzogUnVuQ3JlYXRlQW5kU3RyZWFtUGFyYW1zLlRydW5jYXRpb25TdHJhdGVneSB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUnVuQ3JlYXRlQW5kU3RyZWFtUGFyYW1zIHtcbiAgZXhwb3J0IGludGVyZmFjZSBBZGRpdGlvbmFsTWVzc2FnZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRleHQgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgY29udGVudDogc3RyaW5nIHwgQXJyYXk8TWVzc2FnZXNBUEkuTWVzc2FnZUNvbnRlbnRQYXJ0UGFyYW0+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJvbGUgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGNyZWF0aW5nIHRoZSBtZXNzYWdlLiBBbGxvd2VkIHZhbHVlcyBpbmNsdWRlOlxuICAgICAqXG4gICAgICogLSBgdXNlcmA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBzZW50IGJ5IGFuIGFjdHVhbCB1c2VyIGFuZCBzaG91bGQgYmUgdXNlZCBpblxuICAgICAqICAgbW9zdCBjYXNlcyB0byByZXByZXNlbnQgdXNlci1nZW5lcmF0ZWQgbWVzc2FnZXMuXG4gICAgICogLSBgYXNzaXN0YW50YDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGdlbmVyYXRlZCBieSB0aGUgYXNzaXN0YW50LiBVc2UgdGhpc1xuICAgICAqICAgdmFsdWUgdG8gaW5zZXJ0IG1lc3NhZ2VzIGZyb20gdGhlIGFzc2lzdGFudCBpbnRvIHRoZSBjb252ZXJzYXRpb24uXG4gICAgICovXG4gICAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UsIGFuZCB0aGUgdG9vbHMgdGhleSBzaG91bGQgYmUgYWRkZWQgdG8uXG4gICAgICovXG4gICAgYXR0YWNobWVudHM/OiBBcnJheTxBZGRpdGlvbmFsTWVzc2FnZS5BdHRhY2htZW50PiB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgQWRkaXRpb25hbE1lc3NhZ2Uge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudCB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBJRCBvZiB0aGUgZmlsZSB0byBhdHRhY2ggdG8gdGhlIG1lc3NhZ2UuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIHRvb2xzIHRvIGFkZCB0aGlzIGZpbGUgdG8uXG4gICAgICAgKi9cbiAgICAgIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbD47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRydW5jYXRpb25TdHJhdGVneSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRydW5jYXRpb24gc3RyYXRlZ3kgdG8gdXNlIGZvciB0aGUgdGhyZWFkLiBUaGUgZGVmYXVsdCBpcyBgYXV0b2AuIElmIHNldCB0b1xuICAgICAqIGBsYXN0X21lc3NhZ2VzYCwgdGhlIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgbiBtb3N0IHJlY2VudCBtZXNzYWdlcyBpblxuICAgICAqIHRoZSB0aHJlYWQuIFdoZW4gc2V0IHRvIGBhdXRvYCwgbWVzc2FnZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdGhyZWFkIHdpbGwgYmVcbiAgICAgKiBkcm9wcGVkIHRvIGZpdCB0aGUgY29udGV4dCBsZW5ndGggb2YgdGhlIG1vZGVsLCBgbWF4X3Byb21wdF90b2tlbnNgLlxuICAgICAqL1xuICAgIHR5cGU6ICdhdXRvJyB8ICdsYXN0X21lc3NhZ2VzJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbW9zdCByZWNlbnQgbWVzc2FnZXMgZnJvbSB0aGUgdGhyZWFkIHdoZW4gY29uc3RydWN0aW5nIHRoZSBjb250ZXh0XG4gICAgICogZm9yIHRoZSBydW4uXG4gICAgICovXG4gICAgbGFzdF9tZXNzYWdlcz86IG51bWJlciB8IG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5TdHJlYW1QYXJhbXMge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHRvIHVzZSB0b1xuICAgKiBleGVjdXRlIHRoaXMgcnVuLlxuICAgKi9cbiAgYXNzaXN0YW50X2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgcnVuLiBUaGlzXG4gICAqIGlzIHVzZWZ1bCBmb3IgbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMgd2l0aG91dCBvdmVycmlkaW5nIG90aGVyXG4gICAqIGluc3RydWN0aW9ucy5cbiAgICovXG4gIGFkZGl0aW9uYWxfaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogQWRkcyBhZGRpdGlvbmFsIG1lc3NhZ2VzIHRvIHRoZSB0aHJlYWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBydW4uXG4gICAqL1xuICBhZGRpdGlvbmFsX21lc3NhZ2VzPzogQXJyYXk8UnVuU3RyZWFtUGFyYW1zLkFkZGl0aW9uYWxNZXNzYWdlPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyB0aGVcbiAgICogW2luc3RydWN0aW9uc10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzL2NyZWF0ZUFzc2lzdGFudClcbiAgICogb2YgdGhlIGFzc2lzdGFudC4gVGhpcyBpcyB1c2VmdWwgZm9yIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zIHRoYXQgbWF5IGJlIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZVxuICAgKiBydW4uIFRoZSBydW4gd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gdXNlIG9ubHkgdGhlIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2Vuc1xuICAgKiBzcGVjaWZpZWQsIGFjcm9zcyBtdWx0aXBsZSB0dXJucyBvZiB0aGUgcnVuLiBJZiB0aGUgcnVuIGV4Y2VlZHMgdGhlIG51bWJlciBvZlxuICAgKiBjb21wbGV0aW9uIHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9jb21wbGV0aW9uX3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9tcHQgdG9rZW5zIHRoYXQgbWF5IGJlIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBydW4uXG4gICAqIFRoZSBydW4gd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gdXNlIG9ubHkgdGhlIG51bWJlciBvZiBwcm9tcHQgdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIHByb21wdCB0b2tlbnMgc3BlY2lmaWVkLCB0aGUgcnVuIHdpbGwgZW5kIHdpdGggc3RhdHVzIGBpbmNvbXBsZXRlYC4gU2VlXG4gICAqIGBpbmNvbXBsZXRlX2RldGFpbHNgIGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBtYXhfcHJvbXB0X3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgW01vZGVsXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21vZGVscykgdG9cbiAgICogYmUgdXNlZCB0byBleGVjdXRlIHRoaXMgcnVuLiBJZiBhIHZhbHVlIGlzIHByb3ZpZGVkIGhlcmUsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlXG4gICAqIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaXN0YW50LiBJZiBub3QsIHRoZSBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAqIGFzc2lzdGFudCB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBtb2RlbD86XG4gICAgfCAoc3RyaW5nICYge30pXG4gICAgfCAnZ3B0LTRvJ1xuICAgIHwgJ2dwdC00by0yMDI0LTA1LTEzJ1xuICAgIHwgJ2dwdC00LXR1cmJvJ1xuICAgIHwgJ2dwdC00LXR1cmJvLTIwMjQtMDQtMDknXG4gICAgfCAnZ3B0LTQtMDEyNS1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXR1cmJvLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtMTEwNi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXZpc2lvbi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00J1xuICAgIHwgJ2dwdC00LTAzMTQnXG4gICAgfCAnZ3B0LTQtMDYxMydcbiAgICB8ICdncHQtNC0zMmsnXG4gICAgfCAnZ3B0LTQtMzJrLTAzMTQnXG4gICAgfCAnZ3B0LTQtMzJrLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJibydcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2aydcbiAgICB8ICdncHQtMy41LXR1cmJvLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xMTA2J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDEyNSdcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2ay0wNjEzJ1xuICAgIHwgbnVsbDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICAgKiBbR1BULTRvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTRvKSxcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtdHVyYm8tYW5kLWdwdC00KSxcbiAgICogYW5kIGFsbCBHUFQtMy41IFR1cmJvIG1vZGVscyBzaW5jZSBgZ3B0LTMuNS10dXJiby0xMTA2YC5cbiAgICpcbiAgICogU2V0dGluZyB0byBgeyBcInR5cGVcIjogXCJqc29uX29iamVjdFwiIH1gIGVuYWJsZXMgSlNPTiBtb2RlLCB3aGljaCBndWFyYW50ZWVzIHRoZVxuICAgKiBtZXNzYWdlIHRoZSBtb2RlbCBnZW5lcmF0ZXMgaXMgdmFsaWQgSlNPTi5cbiAgICpcbiAgICogKipJbXBvcnRhbnQ6Kiogd2hlbiB1c2luZyBKU09OIG1vZGUsIHlvdSAqKm11c3QqKiBhbHNvIGluc3RydWN0IHRoZSBtb2RlbCB0b1xuICAgKiBwcm9kdWNlIEpTT04geW91cnNlbGYgdmlhIGEgc3lzdGVtIG9yIHVzZXIgbWVzc2FnZS4gV2l0aG91dCB0aGlzLCB0aGUgbW9kZWwgbWF5XG4gICAqIGdlbmVyYXRlIGFuIHVuZW5kaW5nIHN0cmVhbSBvZiB3aGl0ZXNwYWNlIHVudGlsIHRoZSBnZW5lcmF0aW9uIHJlYWNoZXMgdGhlIHRva2VuXG4gICAqIGxpbWl0LCByZXN1bHRpbmcgaW4gYSBsb25nLXJ1bm5pbmcgYW5kIHNlZW1pbmdseSBcInN0dWNrXCIgcmVxdWVzdC4gQWxzbyBub3RlIHRoYXRcbiAgICogdGhlIG1lc3NhZ2UgY29udGVudCBtYXkgYmUgcGFydGlhbGx5IGN1dCBvZmYgaWYgYGZpbmlzaF9yZWFzb249XCJsZW5ndGhcImAsIHdoaWNoXG4gICAqIGluZGljYXRlcyB0aGUgZ2VuZXJhdGlvbiBleGNlZWRlZCBgbWF4X3Rva2Vuc2Agb3IgdGhlIGNvbnZlcnNhdGlvbiBleGNlZWRlZCB0aGVcbiAgICogbWF4IGNvbnRleHQgbGVuZ3RoLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogVGhyZWFkc0FQSS5Bc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoYXQgc2FtcGxpbmcgdGVtcGVyYXR1cmUgdG8gdXNlLCBiZXR3ZWVuIDAgYW5kIDIuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbFxuICAgKiBtYWtlIHRoZSBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZVxuICAgKiBmb2N1c2VkIGFuZCBkZXRlcm1pbmlzdGljLlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGljaCAoaWYgYW55KSB0b29sIGlzIGNhbGxlZCBieSB0aGUgbW9kZWwuIGBub25lYCBtZWFucyB0aGUgbW9kZWwgd2lsbFxuICAgKiBub3QgY2FsbCBhbnkgdG9vbHMgYW5kIGluc3RlYWQgZ2VuZXJhdGVzIGEgbWVzc2FnZS4gYGF1dG9gIGlzIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAqIGFuZCBtZWFucyB0aGUgbW9kZWwgY2FuIHBpY2sgYmV0d2VlbiBnZW5lcmF0aW5nIGEgbWVzc2FnZSBvciBjYWxsaW5nIG9uZSBvciBtb3JlXG4gICAqIHRvb2xzLiBgcmVxdWlyZWRgIG1lYW5zIHRoZSBtb2RlbCBtdXN0IGNhbGwgb25lIG9yIG1vcmUgdG9vbHMgYmVmb3JlIHJlc3BvbmRpbmdcbiAgICogdG8gdGhlIHVzZXIuIFNwZWNpZnlpbmcgYSBwYXJ0aWN1bGFyIHRvb2wgbGlrZSBge1widHlwZVwiOiBcImZpbGVfc2VhcmNoXCJ9YCBvclxuICAgKiBge1widHlwZVwiOiBcImZ1bmN0aW9uXCIsIFwiZnVuY3Rpb25cIjoge1wibmFtZVwiOiBcIm15X2Z1bmN0aW9uXCJ9fWAgZm9yY2VzIHRoZSBtb2RlbCB0b1xuICAgKiBjYWxsIHRoYXQgdG9vbC5cbiAgICovXG4gIHRvb2xfY2hvaWNlPzogVGhyZWFkc0FQSS5Bc3Npc3RhbnRUb29sQ2hvaWNlT3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIHRvb2xzIHRoZSBhc3Npc3RhbnQgY2FuIHVzZSBmb3IgdGhpcyBydW4uIFRoaXMgaXMgdXNlZnVsIGZvclxuICAgKiBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRUb29sPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIHRlbXBlcmF0dXJlIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIHRydW5jYXRpb25fc3RyYXRlZ3k/OiBSdW5TdHJlYW1QYXJhbXMuVHJ1bmNhdGlvblN0cmF0ZWd5IHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSdW5TdHJlYW1QYXJhbXMge1xuICBleHBvcnQgaW50ZXJmYWNlIEFkZGl0aW9uYWxNZXNzYWdlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGV4dCBjb250ZW50cyBvZiB0aGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBjb250ZW50OiBzdHJpbmcgfCBBcnJheTxNZXNzYWdlc0FQSS5NZXNzYWdlQ29udGVudFBhcnRQYXJhbT47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcm9sZSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgY3JlYXRpbmcgdGhlIG1lc3NhZ2UuIEFsbG93ZWQgdmFsdWVzIGluY2x1ZGU6XG4gICAgICpcbiAgICAgKiAtIGB1c2VyYDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIHNlbnQgYnkgYW4gYWN0dWFsIHVzZXIgYW5kIHNob3VsZCBiZSB1c2VkIGluXG4gICAgICogICBtb3N0IGNhc2VzIHRvIHJlcHJlc2VudCB1c2VyLWdlbmVyYXRlZCBtZXNzYWdlcy5cbiAgICAgKiAtIGBhc3Npc3RhbnRgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBhc3Npc3RhbnQuIFVzZSB0aGlzXG4gICAgICogICB2YWx1ZSB0byBpbnNlcnQgbWVzc2FnZXMgZnJvbSB0aGUgYXNzaXN0YW50IGludG8gdGhlIGNvbnZlcnNhdGlvbi5cbiAgICAgKi9cbiAgICByb2xlOiAndXNlcicgfCAnYXNzaXN0YW50JztcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmaWxlcyBhdHRhY2hlZCB0byB0aGUgbWVzc2FnZSwgYW5kIHRoZSB0b29scyB0aGV5IHNob3VsZCBiZSBhZGRlZCB0by5cbiAgICAgKi9cbiAgICBhdHRhY2htZW50cz86IEFycmF5PEFkZGl0aW9uYWxNZXNzYWdlLkF0dGFjaG1lbnQ+IHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBBZGRpdGlvbmFsTWVzc2FnZSB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBBdHRhY2htZW50IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIElEIG9mIHRoZSBmaWxlIHRvIGF0dGFjaCB0byB0aGUgbWVzc2FnZS5cbiAgICAgICAqL1xuICAgICAgZmlsZV9pZD86IHN0cmluZztcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdG9vbHMgdG8gYWRkIHRoaXMgZmlsZSB0by5cbiAgICAgICAqL1xuICAgICAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sPjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVHJ1bmNhdGlvblN0cmF0ZWd5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJ1bmNhdGlvbiBzdHJhdGVneSB0byB1c2UgZm9yIHRoZSB0aHJlYWQuIFRoZSBkZWZhdWx0IGlzIGBhdXRvYC4gSWYgc2V0IHRvXG4gICAgICogYGxhc3RfbWVzc2FnZXNgLCB0aGUgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHRvIHRoZSBuIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGluXG4gICAgICogdGhlIHRocmVhZC4gV2hlbiBzZXQgdG8gYGF1dG9gLCBtZXNzYWdlcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSB0aHJlYWQgd2lsbCBiZVxuICAgICAqIGRyb3BwZWQgdG8gZml0IHRoZSBjb250ZXh0IGxlbmd0aCBvZiB0aGUgbW9kZWwsIGBtYXhfcHJvbXB0X3Rva2Vuc2AuXG4gICAgICovXG4gICAgdHlwZTogJ2F1dG8nIHwgJ2xhc3RfbWVzc2FnZXMnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBtb3N0IHJlY2VudCBtZXNzYWdlcyBmcm9tIHRoZSB0aHJlYWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGNvbnRleHRcbiAgICAgKiBmb3IgdGhlIHJ1bi5cbiAgICAgKi9cbiAgICBsYXN0X21lc3NhZ2VzPzogbnVtYmVyIHwgbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtcyA9XG4gIHwgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNOb25TdHJlYW1pbmdcbiAgfCBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbWluZztcblxuZXhwb3J0IGludGVyZmFjZSBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHRvb2xzIGZvciB3aGljaCB0aGUgb3V0cHV0cyBhcmUgYmVpbmcgc3VibWl0dGVkLlxuICAgKi9cbiAgdG9vbF9vdXRwdXRzOiBBcnJheTxSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtcy5Ub29sT3V0cHV0PjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCByZXR1cm5zIGEgc3RyZWFtIG9mIGV2ZW50cyB0aGF0IGhhcHBlbiBkdXJpbmcgdGhlIFJ1biBhcyBzZXJ2ZXItc2VudFxuICAgKiBldmVudHMsIHRlcm1pbmF0aW5nIHdoZW4gdGhlIFJ1biBlbnRlcnMgYSB0ZXJtaW5hbCBzdGF0ZSB3aXRoIGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICovXG4gIHN0cmVhbT86IGJvb2xlYW4gfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zIHtcbiAgZXhwb3J0IGludGVyZmFjZSBUb29sT3V0cHV0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0cHV0IG9mIHRoZSB0b29sIGNhbGwgdG8gYmUgc3VibWl0dGVkIHRvIGNvbnRpbnVlIHRoZSBydW4uXG4gICAgICovXG4gICAgb3V0cHV0Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB0b29sIGNhbGwgaW4gdGhlIGByZXF1aXJlZF9hY3Rpb25gIG9iamVjdCB3aXRoaW4gdGhlIHJ1biBvYmplY3RcbiAgICAgKiB0aGUgb3V0cHV0IGlzIGJlaW5nIHN1Ym1pdHRlZCBmb3IuXG4gICAgICovXG4gICAgdG9vbF9jYWxsX2lkPzogc3RyaW5nO1xuICB9XG5cbiAgZXhwb3J0IHR5cGUgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNOb25TdHJlYW1pbmcgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgdHlwZSBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbWluZyA9IFJ1bnNBUEkuUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW1pbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNOb25TdHJlYW1pbmcgZXh0ZW5kcyBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogSWYgYHRydWVgLCByZXR1cm5zIGEgc3RyZWFtIG9mIGV2ZW50cyB0aGF0IGhhcHBlbiBkdXJpbmcgdGhlIFJ1biBhcyBzZXJ2ZXItc2VudFxuICAgKiBldmVudHMsIHRlcm1pbmF0aW5nIHdoZW4gdGhlIFJ1biBlbnRlcnMgYSB0ZXJtaW5hbCBzdGF0ZSB3aXRoIGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICovXG4gIHN0cmVhbT86IGZhbHNlIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbWluZyBleHRlbmRzIFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zQmFzZSB7XG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHJldHVybnMgYSBzdHJlYW0gb2YgZXZlbnRzIHRoYXQgaGFwcGVuIGR1cmluZyB0aGUgUnVuIGFzIHNlcnZlci1zZW50XG4gICAqIGV2ZW50cywgdGVybWluYXRpbmcgd2hlbiB0aGUgUnVuIGVudGVycyBhIHRlcm1pbmFsIHN0YXRlIHdpdGggYSBgZGF0YTogW0RPTkVdYFxuICAgKiBtZXNzYWdlLlxuICAgKi9cbiAgc3RyZWFtOiB0cnVlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1blN1Ym1pdFRvb2xPdXRwdXRzQW5kUG9sbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdG9vbHMgZm9yIHdoaWNoIHRoZSBvdXRwdXRzIGFyZSBiZWluZyBzdWJtaXR0ZWQuXG4gICAqL1xuICB0b29sX291dHB1dHM6IEFycmF5PFJ1blN1Ym1pdFRvb2xPdXRwdXRzQW5kUG9sbFBhcmFtcy5Ub29sT3V0cHV0Pjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSdW5TdWJtaXRUb29sT3V0cHV0c0FuZFBvbGxQYXJhbXMge1xuICBleHBvcnQgaW50ZXJmYWNlIFRvb2xPdXRwdXQge1xuICAgIC8qKlxuICAgICAqIFRoZSBvdXRwdXQgb2YgdGhlIHRvb2wgY2FsbCB0byBiZSBzdWJtaXR0ZWQgdG8gY29udGludWUgdGhlIHJ1bi5cbiAgICAgKi9cbiAgICBvdXRwdXQ/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHRvb2wgY2FsbCBpbiB0aGUgYHJlcXVpcmVkX2FjdGlvbmAgb2JqZWN0IHdpdGhpbiB0aGUgcnVuIG9iamVjdFxuICAgICAqIHRoZSBvdXRwdXQgaXMgYmVpbmcgc3VibWl0dGVkIGZvci5cbiAgICAgKi9cbiAgICB0b29sX2NhbGxfaWQ/OiBzdHJpbmc7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5TdWJtaXRUb29sT3V0cHV0c1N0cmVhbVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdG9vbHMgZm9yIHdoaWNoIHRoZSBvdXRwdXRzIGFyZSBiZWluZyBzdWJtaXR0ZWQuXG4gICAqL1xuICB0b29sX291dHB1dHM6IEFycmF5PFJ1blN1Ym1pdFRvb2xPdXRwdXRzU3RyZWFtUGFyYW1zLlRvb2xPdXRwdXQ+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1blN1Ym1pdFRvb2xPdXRwdXRzU3RyZWFtUGFyYW1zIHtcbiAgZXhwb3J0IGludGVyZmFjZSBUb29sT3V0cHV0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0cHV0IG9mIHRoZSB0b29sIGNhbGwgdG8gYmUgc3VibWl0dGVkIHRvIGNvbnRpbnVlIHRoZSBydW4uXG4gICAgICovXG4gICAgb3V0cHV0Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB0b29sIGNhbGwgaW4gdGhlIGByZXF1aXJlZF9hY3Rpb25gIG9iamVjdCB3aXRoaW4gdGhlIHJ1biBvYmplY3RcbiAgICAgKiB0aGUgb3V0cHV0IGlzIGJlaW5nIHN1Ym1pdHRlZCBmb3IuXG4gICAgICovXG4gICAgdG9vbF9jYWxsX2lkPzogc3RyaW5nO1xuICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUnVucyB7XG4gIGV4cG9ydCBpbXBvcnQgUmVxdWlyZWRBY3Rpb25GdW5jdGlvblRvb2xDYWxsID0gUnVuc0FQSS5SZXF1aXJlZEFjdGlvbkZ1bmN0aW9uVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgUnVuID0gUnVuc0FQSS5SdW47XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RhdHVzID0gUnVuc0FQSS5SdW5TdGF0dXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuc1BhZ2UgPSBSdW5zQVBJLlJ1bnNQYWdlO1xuICBleHBvcnQgaW1wb3J0IFJ1bkNyZWF0ZVBhcmFtcyA9IFJ1bnNBUEkuUnVuQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1bkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IFJ1bnNBUEkuUnVuQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IFJ1bkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IFJ1bnNBUEkuUnVuQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IFJ1blVwZGF0ZVBhcmFtcyA9IFJ1bnNBUEkuUnVuVXBkYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1bkxpc3RQYXJhbXMgPSBSdW5zQVBJLlJ1bkxpc3RQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuQ3JlYXRlQW5kUG9sbFBhcmFtcyA9IFJ1bnNBUEkuUnVuQ3JlYXRlQW5kUG9sbFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5DcmVhdGVBbmRTdHJlYW1QYXJhbXMgPSBSdW5zQVBJLlJ1bkNyZWF0ZUFuZFN0cmVhbVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdHJlYW1QYXJhbXMgPSBSdW5zQVBJLlJ1blN0cmVhbVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtcyA9IFJ1bnNBUEkuUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNOb25TdHJlYW1pbmcgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtaW5nID0gUnVuc0FQSS5SdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdWJtaXRUb29sT3V0cHV0c0FuZFBvbGxQYXJhbXMgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzQW5kUG9sbFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdWJtaXRUb29sT3V0cHV0c1N0cmVhbVBhcmFtcyA9IFJ1bnNBUEkuUnVuU3VibWl0VG9vbE91dHB1dHNTdHJlYW1QYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgU3RlcHMgPSBTdGVwc0FQSS5TdGVwcztcbiAgZXhwb3J0IGltcG9ydCBDb2RlSW50ZXJwcmV0ZXJMb2dzID0gU3RlcHNBUEkuQ29kZUludGVycHJldGVyTG9ncztcbiAgZXhwb3J0IGltcG9ydCBDb2RlSW50ZXJwcmV0ZXJPdXRwdXRJbWFnZSA9IFN0ZXBzQVBJLkNvZGVJbnRlcnByZXRlck91dHB1dEltYWdlO1xuICBleHBvcnQgaW1wb3J0IENvZGVJbnRlcnByZXRlclRvb2xDYWxsID0gU3RlcHNBUEkuQ29kZUludGVycHJldGVyVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgQ29kZUludGVycHJldGVyVG9vbENhbGxEZWx0YSA9IFN0ZXBzQVBJLkNvZGVJbnRlcnByZXRlclRvb2xDYWxsRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZVNlYXJjaFRvb2xDYWxsID0gU3RlcHNBUEkuRmlsZVNlYXJjaFRvb2xDYWxsO1xuICBleHBvcnQgaW1wb3J0IEZpbGVTZWFyY2hUb29sQ2FsbERlbHRhID0gU3RlcHNBUEkuRmlsZVNlYXJjaFRvb2xDYWxsRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgRnVuY3Rpb25Ub29sQ2FsbCA9IFN0ZXBzQVBJLkZ1bmN0aW9uVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgRnVuY3Rpb25Ub29sQ2FsbERlbHRhID0gU3RlcHNBUEkuRnVuY3Rpb25Ub29sQ2FsbERlbHRhO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VDcmVhdGlvblN0ZXBEZXRhaWxzID0gU3RlcHNBUEkuTWVzc2FnZUNyZWF0aW9uU3RlcERldGFpbHM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RlcCA9IFN0ZXBzQVBJLlJ1blN0ZXA7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RlcERlbHRhID0gU3RlcHNBUEkuUnVuU3RlcERlbHRhO1xuICBleHBvcnQgaW1wb3J0IFJ1blN0ZXBEZWx0YUV2ZW50ID0gU3RlcHNBUEkuUnVuU3RlcERlbHRhRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RlcERlbHRhTWVzc2FnZURlbHRhID0gU3RlcHNBUEkuUnVuU3RlcERlbHRhTWVzc2FnZURlbHRhO1xuICBleHBvcnQgaW1wb3J0IFRvb2xDYWxsID0gU3RlcHNBUEkuVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgVG9vbENhbGxEZWx0YSA9IFN0ZXBzQVBJLlRvb2xDYWxsRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgVG9vbENhbGxEZWx0YU9iamVjdCA9IFN0ZXBzQVBJLlRvb2xDYWxsRGVsdGFPYmplY3Q7XG4gIGV4cG9ydCBpbXBvcnQgVG9vbENhbGxzU3RlcERldGFpbHMgPSBTdGVwc0FQSS5Ub29sQ2FsbHNTdGVwRGV0YWlscztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGVwc1BhZ2UgPSBTdGVwc0FQSS5SdW5TdGVwc1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgU3RlcExpc3RQYXJhbXMgPSBTdGVwc0FQSS5TdGVwTGlzdFBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgQVBJUHJvbWlzZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZSc7XG5pbXBvcnQgeyBpc1JlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBc3Npc3RhbnRTdHJlYW0sIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2VTdHJlYW0gfSBmcm9tICcuLi8uLi8uLi9saWIvQXNzaXN0YW50U3RyZWFtJztcbmltcG9ydCAqIGFzIFRocmVhZHNBUEkgZnJvbSAnLi90aHJlYWRzJztcbmltcG9ydCAqIGFzIEFzc2lzdGFudHNBUEkgZnJvbSAnLi4vYXNzaXN0YW50cyc7XG5pbXBvcnQgKiBhcyBNZXNzYWdlc0FQSSBmcm9tICcuL21lc3NhZ2VzJztcbmltcG9ydCAqIGFzIFJ1bnNBUEkgZnJvbSAnLi9ydW5zL3J1bnMnO1xuaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSAnLi4vLi4vLi4vc3RyZWFtaW5nJztcblxuZXhwb3J0IGNsYXNzIFRocmVhZHMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIHJ1bnM6IFJ1bnNBUEkuUnVucyA9IG5ldyBSdW5zQVBJLlJ1bnModGhpcy5fY2xpZW50KTtcbiAgbWVzc2FnZXM6IE1lc3NhZ2VzQVBJLk1lc3NhZ2VzID0gbmV3IE1lc3NhZ2VzQVBJLk1lc3NhZ2VzKHRoaXMuX2NsaWVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHRocmVhZC5cbiAgICovXG4gIGNyZWF0ZShib2R5PzogVGhyZWFkQ3JlYXRlUGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxUaHJlYWQ+O1xuICBjcmVhdGUob3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8VGhyZWFkPjtcbiAgY3JlYXRlKFxuICAgIGJvZHk6IFRocmVhZENyZWF0ZVBhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPFRocmVhZD4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKGJvZHkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGUoe30sIGJvZHkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy90aHJlYWRzJywge1xuICAgICAgYm9keSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHRocmVhZC5cbiAgICovXG4gIHJldHJpZXZlKHRocmVhZElkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFRocmVhZD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvdGhyZWFkcy8ke3RocmVhZElkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIGEgdGhyZWFkLlxuICAgKi9cbiAgdXBkYXRlKHRocmVhZElkOiBzdHJpbmcsIGJvZHk6IFRocmVhZFVwZGF0ZVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8VGhyZWFkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvdGhyZWFkcy8ke3RocmVhZElkfWAsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSB0aHJlYWQuXG4gICAqL1xuICBkZWwodGhyZWFkSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8VGhyZWFkRGVsZXRlZD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZGVsZXRlKGAvdGhyZWFkcy8ke3RocmVhZElkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHRocmVhZCBhbmQgcnVuIGl0IGluIG9uZSByZXF1ZXN0LlxuICAgKi9cbiAgY3JlYXRlQW5kUnVuKFxuICAgIGJvZHk6IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc05vblN0cmVhbWluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxSdW5zQVBJLlJ1bj47XG4gIGNyZWF0ZUFuZFJ1bihcbiAgICBib2R5OiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNTdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+PjtcbiAgY3JlYXRlQW5kUnVuKFxuICAgIGJvZHk6IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2UsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+IHwgUnVuc0FQSS5SdW4+O1xuICBjcmVhdGVBbmRSdW4oXG4gICAgYm9keTogVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFJ1bnNBUEkuUnVuPiB8IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvdGhyZWFkcy9ydW5zJywge1xuICAgICAgYm9keSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgICAgc3RyZWFtOiBib2R5LnN0cmVhbSA/PyBmYWxzZSxcbiAgICB9KSBhcyBBUElQcm9taXNlPFJ1bnNBUEkuUnVuPiB8IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+PjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGhlbHBlciB0byBjcmVhdGUgYSB0aHJlYWQsIHN0YXJ0IGEgcnVuIGFuZCB0aGVuIHBvbGwgZm9yIGEgdGVybWluYWwgc3RhdGUuXG4gICAqIE1vcmUgaW5mb3JtYXRpb24gb24gUnVuIGxpZmVjeWNsZXMgY2FuIGJlIGZvdW5kIGhlcmU6XG4gICAqIGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2Fzc2lzdGFudHMvaG93LWl0LXdvcmtzL3J1bnMtYW5kLXJ1bi1zdGVwc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlQW5kUnVuUG9sbChcbiAgICBib2R5OiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNOb25TdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMgJiB7IHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyIH0sXG4gICk6IFByb21pc2U8VGhyZWFkcy5SdW4+IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB0aGlzLmNyZWF0ZUFuZFJ1bihib2R5LCBvcHRpb25zKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW5zLnBvbGwocnVuLnRocmVhZF9pZCwgcnVuLmlkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0aHJlYWQgYW5kIHN0cmVhbSB0aGUgcnVuIGJhY2tcbiAgICovXG4gIGNyZWF0ZUFuZFJ1blN0cmVhbShcbiAgICBib2R5OiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlU3RyZWFtLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBc3Npc3RhbnRTdHJlYW0ge1xuICAgIHJldHVybiBBc3Npc3RhbnRTdHJlYW0uY3JlYXRlVGhyZWFkQXNzaXN0YW50U3RyZWFtKGJvZHksIHRoaXMuX2NsaWVudC5iZXRhLnRocmVhZHMsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKlxuICogQW4gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGV4cGVjdGVkIG91dHB1dCBvZiB0aGUgbW9kZWwuIElmIGBqc29uX29iamVjdGAgb25seVxuICogYGZ1bmN0aW9uYCB0eXBlIGB0b29sc2AgYXJlIGFsbG93ZWQgdG8gYmUgcGFzc2VkIHRvIHRoZSBSdW4uIElmIGB0ZXh0YCB0aGUgbW9kZWxcbiAqIGNhbiByZXR1cm4gdGV4dCBvciBhbnkgdmFsdWUgbmVlZGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lzdGFudFJlc3BvbnNlRm9ybWF0IHtcbiAgLyoqXG4gICAqIE11c3QgYmUgb25lIG9mIGB0ZXh0YCBvciBganNvbl9vYmplY3RgLlxuICAgKi9cbiAgdHlwZT86ICd0ZXh0JyB8ICdqc29uX29iamVjdCc7XG59XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICogW0dQVC00b10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00byksXG4gKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC10dXJiby1hbmQtZ3B0LTQpLFxuICogYW5kIGFsbCBHUFQtMy41IFR1cmJvIG1vZGVscyBzaW5jZSBgZ3B0LTMuNS10dXJiby0xMTA2YC5cbiAqXG4gKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gKiBtZXNzYWdlIHRoZSBtb2RlbCBnZW5lcmF0ZXMgaXMgdmFsaWQgSlNPTi5cbiAqXG4gKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gKiBwcm9kdWNlIEpTT04geW91cnNlbGYgdmlhIGEgc3lzdGVtIG9yIHVzZXIgbWVzc2FnZS4gV2l0aG91dCB0aGlzLCB0aGUgbW9kZWwgbWF5XG4gKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICogdGhlIG1lc3NhZ2UgY29udGVudCBtYXkgYmUgcGFydGlhbGx5IGN1dCBvZmYgaWYgYGZpbmlzaF9yZWFzb249XCJsZW5ndGhcImAsIHdoaWNoXG4gKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gKiBtYXggY29udGV4dCBsZW5ndGguXG4gKi9cbmV4cG9ydCB0eXBlIEFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uID0gJ25vbmUnIHwgJ2F1dG8nIHwgQXNzaXN0YW50UmVzcG9uc2VGb3JtYXQ7XG5cbi8qKlxuICogU3BlY2lmaWVzIGEgdG9vbCB0aGUgbW9kZWwgc2hvdWxkIHVzZS4gVXNlIHRvIGZvcmNlIHRoZSBtb2RlbCB0byBjYWxsIGEgc3BlY2lmaWNcbiAqIHRvb2wuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0YW50VG9vbENob2ljZSB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgdG9vbC4gSWYgdHlwZSBpcyBgZnVuY3Rpb25gLCB0aGUgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIHNldFxuICAgKi9cbiAgdHlwZTogJ2Z1bmN0aW9uJyB8ICdjb2RlX2ludGVycHJldGVyJyB8ICdmaWxlX3NlYXJjaCc7XG5cbiAgZnVuY3Rpb24/OiBBc3Npc3RhbnRUb29sQ2hvaWNlRnVuY3Rpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0YW50VG9vbENob2ljZUZ1bmN0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIHRvb2wgaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbCB3aWxsXG4gKiBub3QgY2FsbCBhbnkgdG9vbHMgYW5kIGluc3RlYWQgZ2VuZXJhdGVzIGEgbWVzc2FnZS4gYGF1dG9gIGlzIHRoZSBkZWZhdWx0IHZhbHVlXG4gKiBhbmQgbWVhbnMgdGhlIG1vZGVsIGNhbiBwaWNrIGJldHdlZW4gZ2VuZXJhdGluZyBhIG1lc3NhZ2Ugb3IgY2FsbGluZyBvbmUgb3IgbW9yZVxuICogdG9vbHMuIGByZXF1aXJlZGAgbWVhbnMgdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scyBiZWZvcmUgcmVzcG9uZGluZ1xuICogdG8gdGhlIHVzZXIuIFNwZWNpZnlpbmcgYSBwYXJ0aWN1bGFyIHRvb2wgbGlrZSBge1widHlwZVwiOiBcImZpbGVfc2VhcmNoXCJ9YCBvclxuICogYHtcInR5cGVcIjogXCJmdW5jdGlvblwiLCBcImZ1bmN0aW9uXCI6IHtcIm5hbWVcIjogXCJteV9mdW5jdGlvblwifX1gIGZvcmNlcyB0aGUgbW9kZWwgdG9cbiAqIGNhbGwgdGhhdCB0b29sLlxuICovXG5leHBvcnQgdHlwZSBBc3Npc3RhbnRUb29sQ2hvaWNlT3B0aW9uID0gJ25vbmUnIHwgJ2F1dG8nIHwgJ3JlcXVpcmVkJyB8IEFzc2lzdGFudFRvb2xDaG9pY2U7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHRocmVhZCB0aGF0IGNvbnRhaW5zXG4gKiBbbWVzc2FnZXNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRocmVhZCB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHRocmVhZCB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE6IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgdGhyZWFkYC5cbiAgICovXG4gIG9iamVjdDogJ3RocmVhZCc7XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgKi9cbiAgdG9vbF9yZXNvdXJjZXM6IFRocmVhZC5Ub29sUmVzb3VyY2VzIHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBUaHJlYWQge1xuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBhc3Npc3RhbnQncyB0b29scyBpbiB0aGlzXG4gICAqIHRocmVhZC4gVGhlIHJlc291cmNlcyBhcmUgc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZVxuICAgKiBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgXG4gICAqIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZSBJRHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGNvZGVfaW50ZXJwcmV0ZXI/OiBUb29sUmVzb3VyY2VzLkNvZGVJbnRlcnByZXRlcjtcblxuICAgIGZpbGVfc2VhcmNoPzogVG9vbFJlc291cmNlcy5GaWxlU2VhcmNoO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgICAvKipcbiAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGVcbiAgICAgICAqIGF2YWlsYWJsZSB0byB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMjAgZmlsZXNcbiAgICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9vbC5cbiAgICAgICAqL1xuICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZVxuICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAqIGF0dGFjaGVkIHRvIHRoaXMgdGhyZWFkLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEgdmVjdG9yIHN0b3JlIGF0dGFjaGVkIHRvXG4gICAgICAgKiB0aGUgdGhyZWFkLlxuICAgICAgICovXG4gICAgICB2ZWN0b3Jfc3RvcmVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlYWREZWxldGVkIHtcbiAgaWQ6IHN0cmluZztcblxuICBkZWxldGVkOiBib29sZWFuO1xuXG4gIG9iamVjdDogJ3RocmVhZC5kZWxldGVkJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlYWRDcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogQSBsaXN0IG9mIFttZXNzYWdlc10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcykgdG9cbiAgICogc3RhcnQgdGhlIHRocmVhZCB3aXRoLlxuICAgKi9cbiAgbWVzc2FnZXM/OiBBcnJheTxUaHJlYWRDcmVhdGVQYXJhbXMuTWVzc2FnZT47XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgKi9cbiAgdG9vbF9yZXNvdXJjZXM/OiBUaHJlYWRDcmVhdGVQYXJhbXMuVG9vbFJlc291cmNlcyB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkQ3JlYXRlUGFyYW1zIHtcbiAgZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGV4dCBjb250ZW50cyBvZiB0aGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBjb250ZW50OiBzdHJpbmcgfCBBcnJheTxNZXNzYWdlc0FQSS5NZXNzYWdlQ29udGVudFBhcnRQYXJhbT47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcm9sZSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgY3JlYXRpbmcgdGhlIG1lc3NhZ2UuIEFsbG93ZWQgdmFsdWVzIGluY2x1ZGU6XG4gICAgICpcbiAgICAgKiAtIGB1c2VyYDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIHNlbnQgYnkgYW4gYWN0dWFsIHVzZXIgYW5kIHNob3VsZCBiZSB1c2VkIGluXG4gICAgICogICBtb3N0IGNhc2VzIHRvIHJlcHJlc2VudCB1c2VyLWdlbmVyYXRlZCBtZXNzYWdlcy5cbiAgICAgKiAtIGBhc3Npc3RhbnRgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBhc3Npc3RhbnQuIFVzZSB0aGlzXG4gICAgICogICB2YWx1ZSB0byBpbnNlcnQgbWVzc2FnZXMgZnJvbSB0aGUgYXNzaXN0YW50IGludG8gdGhlIGNvbnZlcnNhdGlvbi5cbiAgICAgKi9cbiAgICByb2xlOiAndXNlcicgfCAnYXNzaXN0YW50JztcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmaWxlcyBhdHRhY2hlZCB0byB0aGUgbWVzc2FnZSwgYW5kIHRoZSB0b29scyB0aGV5IHNob3VsZCBiZSBhZGRlZCB0by5cbiAgICAgKi9cbiAgICBhdHRhY2htZW50cz86IEFycmF5PE1lc3NhZ2UuQXR0YWNobWVudD4gfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2Uge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudCB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBJRCBvZiB0aGUgZmlsZSB0byBhdHRhY2ggdG8gdGhlIG1lc3NhZ2UuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIHRvb2xzIHRvIGFkZCB0aGlzIGZpbGUgdG8uXG4gICAgICAgKi9cbiAgICAgIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbD47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBjb2RlX2ludGVycHJldGVyPzogVG9vbFJlc291cmNlcy5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyBtYWRlXG4gICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2gge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGVcbiAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgKiBhdHRhY2hlZCB0byB0aGlzIHRocmVhZC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0b1xuICAgICAgICogdGhlIHRocmVhZC5cbiAgICAgICAqL1xuICAgICAgdmVjdG9yX3N0b3JlX2lkcz86IEFycmF5PHN0cmluZz47XG5cbiAgICAgIC8qKlxuICAgICAgICogQSBoZWxwZXIgdG8gY3JlYXRlIGFcbiAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgKiB3aXRoIGZpbGVfaWRzIGFuZCBhdHRhY2ggaXQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3JcbiAgICAgICAqIHN0b3JlIGF0dGFjaGVkIHRvIHRoZSB0aHJlYWQuXG4gICAgICAgKi9cbiAgICAgIHZlY3Rvcl9zdG9yZXM/OiBBcnJheTxGaWxlU2VhcmNoLlZlY3RvclN0b3JlPjtcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIEZpbGVTZWFyY2gge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyB0b1xuICAgICAgICAgKiBhZGQgdG8gdGhlIHZlY3RvciBzdG9yZS4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxMDAwMCBmaWxlcyBpbiBhIHZlY3RvclxuICAgICAgICAgKiBzdG9yZS5cbiAgICAgICAgICovXG4gICAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIHZlY3RvciBzdG9yZS4gVGhpcyBjYW4gYmVcbiAgICAgICAgICogdXNlZnVsIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlY3RvciBzdG9yZSBpbiBhIHN0cnVjdHVyZWRcbiAgICAgICAgICogZm9ybWF0LiBLZXlzIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtXG4gICAgICAgICAqIG9mIDUxMiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICAgICAqL1xuICAgICAgICBtZXRhZGF0YT86IHVua25vd247XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkVXBkYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgKi9cbiAgdG9vbF9yZXNvdXJjZXM/OiBUaHJlYWRVcGRhdGVQYXJhbXMuVG9vbFJlc291cmNlcyB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkVXBkYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBjb2RlX2ludGVycHJldGVyPzogVG9vbFJlc291cmNlcy5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyBtYWRlXG4gICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2gge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGVcbiAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgKiBhdHRhY2hlZCB0byB0aGlzIHRocmVhZC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0b1xuICAgICAgICogdGhlIHRocmVhZC5cbiAgICAgICAqL1xuICAgICAgdmVjdG9yX3N0b3JlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtcyA9XG4gIHwgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zTm9uU3RyZWFtaW5nXG4gIHwgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zU3RyZWFtaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHRvIHVzZSB0b1xuICAgKiBleGVjdXRlIHRoaXMgcnVuLlxuICAgKi9cbiAgYXNzaXN0YW50X2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHN5c3RlbSBtZXNzYWdlIG9mIHRoZSBhc3Npc3RhbnQuIFRoaXMgaXMgdXNlZnVsIGZvclxuICAgKiBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIGluc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGVcbiAgICogcnVuLiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogY29tcGxldGlvbiB0b2tlbnMgc3BlY2lmaWVkLCB0aGUgcnVuIHdpbGwgZW5kIHdpdGggc3RhdHVzIGBpbmNvbXBsZXRlYC4gU2VlXG4gICAqIGBpbmNvbXBsZXRlX2RldGFpbHNgIGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBtYXhfY29tcGxldGlvbl90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvbXB0IHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgcnVuLlxuICAgKiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgcHJvbXB0IHRva2Vuc1xuICAgKiBzcGVjaWZpZWQsIGFjcm9zcyBtdWx0aXBsZSB0dXJucyBvZiB0aGUgcnVuLiBJZiB0aGUgcnVuIGV4Y2VlZHMgdGhlIG51bWJlciBvZlxuICAgKiBwcm9tcHQgdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X3Byb21wdF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFtNb2RlbF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tb2RlbHMpIHRvXG4gICAqIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIHJ1bi4gSWYgYSB2YWx1ZSBpcyBwcm92aWRlZCBoZXJlLCBpdCB3aWxsIG92ZXJyaWRlIHRoZVxuICAgKiBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudC4gSWYgbm90LCB0aGUgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgKiBhc3Npc3RhbnQgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgbW9kZWw/OlxuICAgIHwgKHN0cmluZyAmIHt9KVxuICAgIHwgJ2dwdC00bydcbiAgICB8ICdncHQtNG8tMjAyNC0wNS0xMydcbiAgICB8ICdncHQtNC10dXJibydcbiAgICB8ICdncHQtNC10dXJiby0yMDI0LTA0LTA5J1xuICAgIHwgJ2dwdC00LTAxMjUtcHJldmlldydcbiAgICB8ICdncHQtNC10dXJiby1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LTExMDYtcHJldmlldydcbiAgICB8ICdncHQtNC12aXNpb24tcHJldmlldydcbiAgICB8ICdncHQtNCdcbiAgICB8ICdncHQtNC0wMzE0J1xuICAgIHwgJ2dwdC00LTA2MTMnXG4gICAgfCAnZ3B0LTQtMzJrJ1xuICAgIHwgJ2dwdC00LTMyay0wMzE0J1xuICAgIHwgJ2dwdC00LTMyay0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8nXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmsnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTEwNidcbiAgICB8ICdncHQtMy41LXR1cmJvLTAxMjUnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmstMDYxMydcbiAgICB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00b10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00byksXG4gICAqIFtHUFQtNCBUdXJib10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00LXR1cmJvLWFuZC1ncHQtNCksXG4gICAqIGFuZCBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IEFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCByZXR1cm5zIGEgc3RyZWFtIG9mIGV2ZW50cyB0aGF0IGhhcHBlbiBkdXJpbmcgdGhlIFJ1biBhcyBzZXJ2ZXItc2VudFxuICAgKiBldmVudHMsIHRlcm1pbmF0aW5nIHdoZW4gdGhlIFJ1biBlbnRlcnMgYSB0ZXJtaW5hbCBzdGF0ZSB3aXRoIGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICovXG4gIHN0cmVhbT86IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGF0IHNhbXBsaW5nIHRlbXBlcmF0dXJlIHRvIHVzZSwgYmV0d2VlbiAwIGFuZCAyLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGxcbiAgICogbWFrZSB0aGUgb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmVcbiAgICogZm9jdXNlZCBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogSWYgbm8gdGhyZWFkIGlzIHByb3ZpZGVkLCBhbiBlbXB0eSB0aHJlYWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgdGhyZWFkPzogVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zLlRocmVhZDtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hpY2ggKGlmIGFueSkgdG9vbCBpcyBjYWxsZWQgYnkgdGhlIG1vZGVsLiBgbm9uZWAgbWVhbnMgdGhlIG1vZGVsIHdpbGxcbiAgICogbm90IGNhbGwgYW55IHRvb2xzIGFuZCBpbnN0ZWFkIGdlbmVyYXRlcyBhIG1lc3NhZ2UuIGBhdXRvYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgKiBhbmQgbWVhbnMgdGhlIG1vZGVsIGNhbiBwaWNrIGJldHdlZW4gZ2VuZXJhdGluZyBhIG1lc3NhZ2Ugb3IgY2FsbGluZyBvbmUgb3IgbW9yZVxuICAgKiB0b29scy4gYHJlcXVpcmVkYCBtZWFucyB0aGUgbW9kZWwgbXVzdCBjYWxsIG9uZSBvciBtb3JlIHRvb2xzIGJlZm9yZSByZXNwb25kaW5nXG4gICAqIHRvIHRoZSB1c2VyLiBTcGVjaWZ5aW5nIGEgcGFydGljdWxhciB0b29sIGxpa2UgYHtcInR5cGVcIjogXCJmaWxlX3NlYXJjaFwifWAgb3JcbiAgICogYHtcInR5cGVcIjogXCJmdW5jdGlvblwiLCBcImZ1bmN0aW9uXCI6IHtcIm5hbWVcIjogXCJteV9mdW5jdGlvblwifX1gIGZvcmNlcyB0aGUgbW9kZWwgdG9cbiAgICogY2FsbCB0aGF0IHRvb2wuXG4gICAqL1xuICB0b29sX2Nob2ljZT86IEFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgYXNzaXN0YW50J3MgdG9vbHMuIFRoZSByZXNvdXJjZXMgYXJlXG4gICAqIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXNcbiAgICogYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVcbiAgICogSURzLlxuICAgKi9cbiAgdG9vbF9yZXNvdXJjZXM/OiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXMuVG9vbFJlc291cmNlcyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSB0b29scyB0aGUgYXNzaXN0YW50IGNhbiB1c2UgZm9yIHRoaXMgcnVuLiBUaGlzIGlzIHVzZWZ1bCBmb3JcbiAgICogbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICB0b29scz86IEFycmF5PFxuICAgIEFzc2lzdGFudHNBUEkuQ29kZUludGVycHJldGVyVG9vbCB8IEFzc2lzdGFudHNBUEkuRmlsZVNlYXJjaFRvb2wgfCBBc3Npc3RhbnRzQVBJLkZ1bmN0aW9uVG9vbFxuICA+IHwgbnVsbDtcblxuICAvKipcbiAgICogQW4gYWx0ZXJuYXRpdmUgdG8gc2FtcGxpbmcgd2l0aCB0ZW1wZXJhdHVyZSwgY2FsbGVkIG51Y2xldXMgc2FtcGxpbmcsIHdoZXJlIHRoZVxuICAgKiBtb2RlbCBjb25zaWRlcnMgdGhlIHJlc3VsdHMgb2YgdGhlIHRva2VucyB3aXRoIHRvcF9wIHByb2JhYmlsaXR5IG1hc3MuIFNvIDAuMVxuICAgKiBtZWFucyBvbmx5IHRoZSB0b2tlbnMgY29tcHJpc2luZyB0aGUgdG9wIDEwJSBwcm9iYWJpbGl0eSBtYXNzIGFyZSBjb25zaWRlcmVkLlxuICAgKlxuICAgKiBXZSBnZW5lcmFsbHkgcmVjb21tZW5kIGFsdGVyaW5nIHRoaXMgb3IgdGVtcGVyYXR1cmUgYnV0IG5vdCBib3RoLlxuICAgKi9cbiAgdG9wX3A/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgdHJ1bmNhdGlvbl9zdHJhdGVneT86IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtcy5UcnVuY2F0aW9uU3RyYXRlZ3kgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtcyB7XG4gIC8qKlxuICAgKiBJZiBubyB0aHJlYWQgaXMgcHJvdmlkZWQsIGFuIGVtcHR5IHRocmVhZCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZCB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIFttZXNzYWdlc10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcykgdG9cbiAgICAgKiBzdGFydCB0aGUgdGhyZWFkIHdpdGguXG4gICAgICovXG4gICAgbWVzc2FnZXM/OiBBcnJheTxUaHJlYWQuTWVzc2FnZT47XG5cbiAgICAvKipcbiAgICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgICAqIHRocmVhZC4gVGhlIHJlc291cmNlcyBhcmUgc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZVxuICAgICAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGBcbiAgICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgICAqL1xuICAgIHRvb2xfcmVzb3VyY2VzPzogVGhyZWFkLlRvb2xSZXNvdXJjZXMgfCBudWxsO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBUaHJlYWQge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0ZXh0IGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlLlxuICAgICAgICovXG4gICAgICBjb250ZW50OiBzdHJpbmcgfCBBcnJheTxNZXNzYWdlc0FQSS5NZXNzYWdlQ29udGVudFBhcnRQYXJhbT47XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIHJvbGUgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGNyZWF0aW5nIHRoZSBtZXNzYWdlLiBBbGxvd2VkIHZhbHVlcyBpbmNsdWRlOlxuICAgICAgICpcbiAgICAgICAqIC0gYHVzZXJgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgc2VudCBieSBhbiBhY3R1YWwgdXNlciBhbmQgc2hvdWxkIGJlIHVzZWQgaW5cbiAgICAgICAqICAgbW9zdCBjYXNlcyB0byByZXByZXNlbnQgdXNlci1nZW5lcmF0ZWQgbWVzc2FnZXMuXG4gICAgICAgKiAtIGBhc3Npc3RhbnRgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBhc3Npc3RhbnQuIFVzZSB0aGlzXG4gICAgICAgKiAgIHZhbHVlIHRvIGluc2VydCBtZXNzYWdlcyBmcm9tIHRoZSBhc3Npc3RhbnQgaW50byB0aGUgY29udmVyc2F0aW9uLlxuICAgICAgICovXG4gICAgICByb2xlOiAndXNlcicgfCAnYXNzaXN0YW50JztcblxuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UsIGFuZCB0aGUgdG9vbHMgdGhleSBzaG91bGQgYmUgYWRkZWQgdG8uXG4gICAgICAgKi9cbiAgICAgIGF0dGFjaG1lbnRzPzogQXJyYXk8TWVzc2FnZS5BdHRhY2htZW50PiB8IG51bGw7XG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICAgICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAgICovXG4gICAgICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuICAgIH1cblxuICAgIGV4cG9ydCBuYW1lc3BhY2UgTWVzc2FnZSB7XG4gICAgICBleHBvcnQgaW50ZXJmYWNlIEF0dGFjaG1lbnQge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIElEIG9mIHRoZSBmaWxlIHRvIGF0dGFjaCB0byB0aGUgbWVzc2FnZS5cbiAgICAgICAgICovXG4gICAgICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0b29scyB0byBhZGQgdGhpcyBmaWxlIHRvLlxuICAgICAgICAgKi9cbiAgICAgICAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sPjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICAgKiBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgXG4gICAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgICAgY29kZV9pbnRlcnByZXRlcj86IFRvb2xSZXNvdXJjZXMuQ29kZUludGVycHJldGVyO1xuXG4gICAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgbWFkZVxuICAgICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9vbC5cbiAgICAgICAgICovXG4gICAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZVxuICAgICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICAgKiBhdHRhY2hlZCB0byB0aGlzIHRocmVhZC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0b1xuICAgICAgICAgKiB0aGUgdGhyZWFkLlxuICAgICAgICAgKi9cbiAgICAgICAgdmVjdG9yX3N0b3JlX2lkcz86IEFycmF5PHN0cmluZz47XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgaGVscGVyIHRvIGNyZWF0ZSBhXG4gICAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgICAqIHdpdGggZmlsZV9pZHMgYW5kIGF0dGFjaCBpdCB0byB0aGlzIHRocmVhZC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvclxuICAgICAgICAgKiBzdG9yZSBhdHRhY2hlZCB0byB0aGUgdGhyZWFkLlxuICAgICAgICAgKi9cbiAgICAgICAgdmVjdG9yX3N0b3Jlcz86IEFycmF5PEZpbGVTZWFyY2guVmVjdG9yU3RvcmU+O1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgbmFtZXNwYWNlIEZpbGVTZWFyY2gge1xuICAgICAgICBleHBvcnQgaW50ZXJmYWNlIFZlY3RvclN0b3JlIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyB0b1xuICAgICAgICAgICAqIGFkZCB0byB0aGUgdmVjdG9yIHN0b3JlLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEwMDAwIGZpbGVzIGluIGEgdmVjdG9yXG4gICAgICAgICAgICogc3RvcmUuXG4gICAgICAgICAgICovXG4gICAgICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIHZlY3RvciBzdG9yZS4gVGhpcyBjYW4gYmVcbiAgICAgICAgICAgKiB1c2VmdWwgZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVjdG9yIHN0b3JlIGluIGEgc3RydWN0dXJlZFxuICAgICAgICAgICAqIGZvcm1hdC4gS2V5cyBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bVxuICAgICAgICAgICAqIG9mIDUxMiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICAgICAgICovXG4gICAgICAgICAgbWV0YWRhdGE/OiB1bmtub3duO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBhc3Npc3RhbnQncyB0b29scy4gVGhlIHJlc291cmNlcyBhcmVcbiAgICogc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlc1xuICAgKiBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZVxuICAgKiBJRHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGNvZGVfaW50ZXJwcmV0ZXI/OiBUb29sUmVzb3VyY2VzLkNvZGVJbnRlcnByZXRlcjtcblxuICAgIGZpbGVfc2VhcmNoPzogVG9vbFJlc291cmNlcy5GaWxlU2VhcmNoO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgICAvKipcbiAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGVcbiAgICAgICAqIGF2YWlsYWJsZSB0byB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMjAgZmlsZXNcbiAgICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9vbC5cbiAgICAgICAqL1xuICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBJRCBvZiB0aGVcbiAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgKiBhdHRhY2hlZCB0byB0aGlzIGFzc2lzdGFudC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0b1xuICAgICAgICogdGhlIGFzc2lzdGFudC5cbiAgICAgICAqL1xuICAgICAgdmVjdG9yX3N0b3JlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRydW5jYXRpb25TdHJhdGVneSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRydW5jYXRpb24gc3RyYXRlZ3kgdG8gdXNlIGZvciB0aGUgdGhyZWFkLiBUaGUgZGVmYXVsdCBpcyBgYXV0b2AuIElmIHNldCB0b1xuICAgICAqIGBsYXN0X21lc3NhZ2VzYCwgdGhlIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgbiBtb3N0IHJlY2VudCBtZXNzYWdlcyBpblxuICAgICAqIHRoZSB0aHJlYWQuIFdoZW4gc2V0IHRvIGBhdXRvYCwgbWVzc2FnZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdGhyZWFkIHdpbGwgYmVcbiAgICAgKiBkcm9wcGVkIHRvIGZpdCB0aGUgY29udGV4dCBsZW5ndGggb2YgdGhlIG1vZGVsLCBgbWF4X3Byb21wdF90b2tlbnNgLlxuICAgICAqL1xuICAgIHR5cGU6ICdhdXRvJyB8ICdsYXN0X21lc3NhZ2VzJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbW9zdCByZWNlbnQgbWVzc2FnZXMgZnJvbSB0aGUgdGhyZWFkIHdoZW4gY29uc3RydWN0aW5nIHRoZSBjb250ZXh0XG4gICAgICogZm9yIHRoZSBydW4uXG4gICAgICovXG4gICAgbGFzdF9tZXNzYWdlcz86IG51bWJlciB8IG51bGw7XG4gIH1cblxuICBleHBvcnQgdHlwZSBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNOb25TdHJlYW1pbmcgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IHR5cGUgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zU3RyZWFtaW5nID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNTdHJlYW1pbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zTm9uU3RyZWFtaW5nIGV4dGVuZHMgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zQmFzZSB7XG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHJldHVybnMgYSBzdHJlYW0gb2YgZXZlbnRzIHRoYXQgaGFwcGVuIGR1cmluZyB0aGUgUnVuIGFzIHNlcnZlci1zZW50XG4gICAqIGV2ZW50cywgdGVybWluYXRpbmcgd2hlbiB0aGUgUnVuIGVudGVycyBhIHRlcm1pbmFsIHN0YXRlIHdpdGggYSBgZGF0YTogW0RPTkVdYFxuICAgKiBtZXNzYWdlLlxuICAgKi9cbiAgc3RyZWFtPzogZmFsc2UgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc1N0cmVhbWluZyBleHRlbmRzIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogSWYgYHRydWVgLCByZXR1cm5zIGEgc3RyZWFtIG9mIGV2ZW50cyB0aGF0IGhhcHBlbiBkdXJpbmcgdGhlIFJ1biBhcyBzZXJ2ZXItc2VudFxuICAgKiBldmVudHMsIHRlcm1pbmF0aW5nIHdoZW4gdGhlIFJ1biBlbnRlcnMgYSB0ZXJtaW5hbCBzdGF0ZSB3aXRoIGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICovXG4gIHN0cmVhbTogdHJ1ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlYWRDcmVhdGVBbmRSdW5Qb2xsUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGVcbiAgICogW2Fzc2lzdGFudF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKSB0byB1c2UgdG9cbiAgICogZXhlY3V0ZSB0aGlzIHJ1bi5cbiAgICovXG4gIGFzc2lzdGFudF9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBzeXN0ZW0gbWVzc2FnZSBvZiB0aGUgYXNzaXN0YW50LiBUaGlzIGlzIHVzZWZ1bCBmb3JcbiAgICogbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlXG4gICAqIHJ1bi4gVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIGNvbXBsZXRpb24gdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X2NvbXBsZXRpb25fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb21wdCB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICogVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIHByb21wdCB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogcHJvbXB0IHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9wcm9tcHRfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBbTW9kZWxdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzKSB0b1xuICAgKiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhpcyBydW4uIElmIGEgdmFsdWUgaXMgcHJvdmlkZWQgaGVyZSwgaXQgd2lsbCBvdmVycmlkZSB0aGVcbiAgICogbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3Npc3RhbnQuIElmIG5vdCwgdGhlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICogYXNzaXN0YW50IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIG1vZGVsPzpcbiAgICB8IChzdHJpbmcgJiB7fSlcbiAgICB8ICdncHQtNG8nXG4gICAgfCAnZ3B0LTRvLTIwMjQtMDUtMTMnXG4gICAgfCAnZ3B0LTQtdHVyYm8nXG4gICAgfCAnZ3B0LTQtdHVyYm8tMjAyNC0wNC0wOSdcbiAgICB8ICdncHQtNC0wMTI1LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdHVyYm8tcHJldmlldydcbiAgICB8ICdncHQtNC0xMTA2LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdmlzaW9uLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQnXG4gICAgfCAnZ3B0LTQtMDMxNCdcbiAgICB8ICdncHQtNC0wNjEzJ1xuICAgIHwgJ2dwdC00LTMyaydcbiAgICB8ICdncHQtNC0zMmstMDMxNCdcbiAgICB8ICdncHQtNC0zMmstMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvLTExMDYnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wMTI1J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrLTA2MTMnXG4gICAgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGZvcm1hdCB0aGF0IHRoZSBtb2RlbCBtdXN0IG91dHB1dC4gQ29tcGF0aWJsZSB3aXRoXG4gICAqIFtHUFQtNG9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNG8pLFxuICAgKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC10dXJiby1hbmQtZ3B0LTQpLFxuICAgKiBhbmQgYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIHNpbmNlIGBncHQtMy41LXR1cmJvLTExMDZgLlxuICAgKlxuICAgKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gICAqIG1lc3NhZ2UgdGhlIG1vZGVsIGdlbmVyYXRlcyBpcyB2YWxpZCBKU09OLlxuICAgKlxuICAgKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gICAqIHByb2R1Y2UgSlNPTiB5b3Vyc2VsZiB2aWEgYSBzeXN0ZW0gb3IgdXNlciBtZXNzYWdlLiBXaXRob3V0IHRoaXMsIHRoZSBtb2RlbCBtYXlcbiAgICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAgICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IG1heSBiZSBwYXJ0aWFsbHkgY3V0IG9mZiBpZiBgZmluaXNoX3JlYXNvbj1cImxlbmd0aFwiYCwgd2hpY2hcbiAgICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICAgKiBtYXggY29udGV4dCBsZW5ndGguXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBBc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoYXQgc2FtcGxpbmcgdGVtcGVyYXR1cmUgdG8gdXNlLCBiZXR3ZWVuIDAgYW5kIDIuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbFxuICAgKiBtYWtlIHRoZSBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZVxuICAgKiBmb2N1c2VkIGFuZCBkZXRlcm1pbmlzdGljLlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBJZiBubyB0aHJlYWQgaXMgcHJvdmlkZWQsIGFuIGVtcHR5IHRocmVhZCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqL1xuICB0aHJlYWQ/OiBUaHJlYWRDcmVhdGVBbmRSdW5Qb2xsUGFyYW1zLlRocmVhZDtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hpY2ggKGlmIGFueSkgdG9vbCBpcyBjYWxsZWQgYnkgdGhlIG1vZGVsLiBgbm9uZWAgbWVhbnMgdGhlIG1vZGVsIHdpbGxcbiAgICogbm90IGNhbGwgYW55IHRvb2xzIGFuZCBpbnN0ZWFkIGdlbmVyYXRlcyBhIG1lc3NhZ2UuIGBhdXRvYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgKiBhbmQgbWVhbnMgdGhlIG1vZGVsIGNhbiBwaWNrIGJldHdlZW4gZ2VuZXJhdGluZyBhIG1lc3NhZ2Ugb3IgY2FsbGluZyBvbmUgb3IgbW9yZVxuICAgKiB0b29scy4gYHJlcXVpcmVkYCBtZWFucyB0aGUgbW9kZWwgbXVzdCBjYWxsIG9uZSBvciBtb3JlIHRvb2xzIGJlZm9yZSByZXNwb25kaW5nXG4gICAqIHRvIHRoZSB1c2VyLiBTcGVjaWZ5aW5nIGEgcGFydGljdWxhciB0b29sIGxpa2UgYHtcInR5cGVcIjogXCJmaWxlX3NlYXJjaFwifWAgb3JcbiAgICogYHtcInR5cGVcIjogXCJmdW5jdGlvblwiLCBcImZ1bmN0aW9uXCI6IHtcIm5hbWVcIjogXCJteV9mdW5jdGlvblwifX1gIGZvcmNlcyB0aGUgbW9kZWwgdG9cbiAgICogY2FsbCB0aGF0IHRvb2wuXG4gICAqL1xuICB0b29sX2Nob2ljZT86IEFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgYXNzaXN0YW50J3MgdG9vbHMuIFRoZSByZXNvdXJjZXMgYXJlXG4gICAqIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXNcbiAgICogYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVcbiAgICogSURzLlxuICAgKi9cbiAgdG9vbF9yZXNvdXJjZXM/OiBUaHJlYWRDcmVhdGVBbmRSdW5Qb2xsUGFyYW1zLlRvb2xSZXNvdXJjZXMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgdG9vbHMgdGhlIGFzc2lzdGFudCBjYW4gdXNlIGZvciB0aGlzIHJ1bi4gVGhpcyBpcyB1c2VmdWwgZm9yXG4gICAqIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgdG9vbHM/OiBBcnJheTxcbiAgICBBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sIHwgQXNzaXN0YW50c0FQSS5GdW5jdGlvblRvb2xcbiAgPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIHRlbXBlcmF0dXJlIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIHRydW5jYXRpb25fc3RyYXRlZ3k/OiBUaHJlYWRDcmVhdGVBbmRSdW5Qb2xsUGFyYW1zLlRydW5jYXRpb25TdHJhdGVneSB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkQ3JlYXRlQW5kUnVuUG9sbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBJZiBubyB0aHJlYWQgaXMgcHJvdmlkZWQsIGFuIGVtcHR5IHRocmVhZCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZCB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIFttZXNzYWdlc10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcykgdG9cbiAgICAgKiBzdGFydCB0aGUgdGhyZWFkIHdpdGguXG4gICAgICovXG4gICAgbWVzc2FnZXM/OiBBcnJheTxUaHJlYWQuTWVzc2FnZT47XG5cbiAgICAvKipcbiAgICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgICAqIHRocmVhZC4gVGhlIHJlc291cmNlcyBhcmUgc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZVxuICAgICAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGBcbiAgICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgICAqL1xuICAgIHRvb2xfcmVzb3VyY2VzPzogVGhyZWFkLlRvb2xSZXNvdXJjZXMgfCBudWxsO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBUaHJlYWQge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0ZXh0IGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlLlxuICAgICAgICovXG4gICAgICBjb250ZW50OiBzdHJpbmcgfCBBcnJheTxNZXNzYWdlc0FQSS5NZXNzYWdlQ29udGVudFBhcnRQYXJhbT47XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIHJvbGUgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGNyZWF0aW5nIHRoZSBtZXNzYWdlLiBBbGxvd2VkIHZhbHVlcyBpbmNsdWRlOlxuICAgICAgICpcbiAgICAgICAqIC0gYHVzZXJgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgc2VudCBieSBhbiBhY3R1YWwgdXNlciBhbmQgc2hvdWxkIGJlIHVzZWQgaW5cbiAgICAgICAqICAgbW9zdCBjYXNlcyB0byByZXByZXNlbnQgdXNlci1nZW5lcmF0ZWQgbWVzc2FnZXMuXG4gICAgICAgKiAtIGBhc3Npc3RhbnRgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBhc3Npc3RhbnQuIFVzZSB0aGlzXG4gICAgICAgKiAgIHZhbHVlIHRvIGluc2VydCBtZXNzYWdlcyBmcm9tIHRoZSBhc3Npc3RhbnQgaW50byB0aGUgY29udmVyc2F0aW9uLlxuICAgICAgICovXG4gICAgICByb2xlOiAndXNlcicgfCAnYXNzaXN0YW50JztcblxuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UsIGFuZCB0aGUgdG9vbHMgdGhleSBzaG91bGQgYmUgYWRkZWQgdG8uXG4gICAgICAgKi9cbiAgICAgIGF0dGFjaG1lbnRzPzogQXJyYXk8TWVzc2FnZS5BdHRhY2htZW50PiB8IG51bGw7XG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICAgICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAgICovXG4gICAgICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuICAgIH1cblxuICAgIGV4cG9ydCBuYW1lc3BhY2UgTWVzc2FnZSB7XG4gICAgICBleHBvcnQgaW50ZXJmYWNlIEF0dGFjaG1lbnQge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIElEIG9mIHRoZSBmaWxlIHRvIGF0dGFjaCB0byB0aGUgbWVzc2FnZS5cbiAgICAgICAgICovXG4gICAgICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0b29scyB0byBhZGQgdGhpcyBmaWxlIHRvLlxuICAgICAgICAgKi9cbiAgICAgICAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sPjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICAgKiBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgXG4gICAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgICAgY29kZV9pbnRlcnByZXRlcj86IFRvb2xSZXNvdXJjZXMuQ29kZUludGVycHJldGVyO1xuXG4gICAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgbWFkZVxuICAgICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9vbC5cbiAgICAgICAgICovXG4gICAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZVxuICAgICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICAgKiBhdHRhY2hlZCB0byB0aGlzIHRocmVhZC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0b1xuICAgICAgICAgKiB0aGUgdGhyZWFkLlxuICAgICAgICAgKi9cbiAgICAgICAgdmVjdG9yX3N0b3JlX2lkcz86IEFycmF5PHN0cmluZz47XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgaGVscGVyIHRvIGNyZWF0ZSBhXG4gICAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgICAqIHdpdGggZmlsZV9pZHMgYW5kIGF0dGFjaCBpdCB0byB0aGlzIHRocmVhZC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvclxuICAgICAgICAgKiBzdG9yZSBhdHRhY2hlZCB0byB0aGUgdGhyZWFkLlxuICAgICAgICAgKi9cbiAgICAgICAgdmVjdG9yX3N0b3Jlcz86IEFycmF5PEZpbGVTZWFyY2guVmVjdG9yU3RvcmU+O1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgbmFtZXNwYWNlIEZpbGVTZWFyY2gge1xuICAgICAgICBleHBvcnQgaW50ZXJmYWNlIFZlY3RvclN0b3JlIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyB0b1xuICAgICAgICAgICAqIGFkZCB0byB0aGUgdmVjdG9yIHN0b3JlLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEwMDAwIGZpbGVzIGluIGEgdmVjdG9yXG4gICAgICAgICAgICogc3RvcmUuXG4gICAgICAgICAgICovXG4gICAgICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIHZlY3RvciBzdG9yZS4gVGhpcyBjYW4gYmVcbiAgICAgICAgICAgKiB1c2VmdWwgZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVjdG9yIHN0b3JlIGluIGEgc3RydWN0dXJlZFxuICAgICAgICAgICAqIGZvcm1hdC4gS2V5cyBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bVxuICAgICAgICAgICAqIG9mIDUxMiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICAgICAgICovXG4gICAgICAgICAgbWV0YWRhdGE/OiB1bmtub3duO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBhc3Npc3RhbnQncyB0b29scy4gVGhlIHJlc291cmNlcyBhcmVcbiAgICogc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlc1xuICAgKiBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZVxuICAgKiBJRHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGNvZGVfaW50ZXJwcmV0ZXI/OiBUb29sUmVzb3VyY2VzLkNvZGVJbnRlcnByZXRlcjtcblxuICAgIGZpbGVfc2VhcmNoPzogVG9vbFJlc291cmNlcy5GaWxlU2VhcmNoO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgICAvKipcbiAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGVcbiAgICAgICAqIGF2YWlsYWJsZSB0byB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMjAgZmlsZXNcbiAgICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9vbC5cbiAgICAgICAqL1xuICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBJRCBvZiB0aGVcbiAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgKiBhdHRhY2hlZCB0byB0aGlzIGFzc2lzdGFudC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0b1xuICAgICAgICogdGhlIGFzc2lzdGFudC5cbiAgICAgICAqL1xuICAgICAgdmVjdG9yX3N0b3JlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRydW5jYXRpb25TdHJhdGVneSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRydW5jYXRpb24gc3RyYXRlZ3kgdG8gdXNlIGZvciB0aGUgdGhyZWFkLiBUaGUgZGVmYXVsdCBpcyBgYXV0b2AuIElmIHNldCB0b1xuICAgICAqIGBsYXN0X21lc3NhZ2VzYCwgdGhlIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgbiBtb3N0IHJlY2VudCBtZXNzYWdlcyBpblxuICAgICAqIHRoZSB0aHJlYWQuIFdoZW4gc2V0IHRvIGBhdXRvYCwgbWVzc2FnZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdGhyZWFkIHdpbGwgYmVcbiAgICAgKiBkcm9wcGVkIHRvIGZpdCB0aGUgY29udGV4dCBsZW5ndGggb2YgdGhlIG1vZGVsLCBgbWF4X3Byb21wdF90b2tlbnNgLlxuICAgICAqL1xuICAgIHR5cGU6ICdhdXRvJyB8ICdsYXN0X21lc3NhZ2VzJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbW9zdCByZWNlbnQgbWVzc2FnZXMgZnJvbSB0aGUgdGhyZWFkIHdoZW4gY29uc3RydWN0aW5nIHRoZSBjb250ZXh0XG4gICAgICogZm9yIHRoZSBydW4uXG4gICAgICovXG4gICAgbGFzdF9tZXNzYWdlcz86IG51bWJlciB8IG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlYWRDcmVhdGVBbmRSdW5TdHJlYW1QYXJhbXMge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHRvIHVzZSB0b1xuICAgKiBleGVjdXRlIHRoaXMgcnVuLlxuICAgKi9cbiAgYXNzaXN0YW50X2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHN5c3RlbSBtZXNzYWdlIG9mIHRoZSBhc3Npc3RhbnQuIFRoaXMgaXMgdXNlZnVsIGZvclxuICAgKiBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIGluc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGVcbiAgICogcnVuLiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogY29tcGxldGlvbiB0b2tlbnMgc3BlY2lmaWVkLCB0aGUgcnVuIHdpbGwgZW5kIHdpdGggc3RhdHVzIGBpbmNvbXBsZXRlYC4gU2VlXG4gICAqIGBpbmNvbXBsZXRlX2RldGFpbHNgIGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBtYXhfY29tcGxldGlvbl90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvbXB0IHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgcnVuLlxuICAgKiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgcHJvbXB0IHRva2Vuc1xuICAgKiBzcGVjaWZpZWQsIGFjcm9zcyBtdWx0aXBsZSB0dXJucyBvZiB0aGUgcnVuLiBJZiB0aGUgcnVuIGV4Y2VlZHMgdGhlIG51bWJlciBvZlxuICAgKiBwcm9tcHQgdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X3Byb21wdF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFtNb2RlbF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tb2RlbHMpIHRvXG4gICAqIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIHJ1bi4gSWYgYSB2YWx1ZSBpcyBwcm92aWRlZCBoZXJlLCBpdCB3aWxsIG92ZXJyaWRlIHRoZVxuICAgKiBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudC4gSWYgbm90LCB0aGUgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgKiBhc3Npc3RhbnQgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgbW9kZWw/OlxuICAgIHwgKHN0cmluZyAmIHt9KVxuICAgIHwgJ2dwdC00bydcbiAgICB8ICdncHQtNG8tMjAyNC0wNS0xMydcbiAgICB8ICdncHQtNC10dXJibydcbiAgICB8ICdncHQtNC10dXJiby0yMDI0LTA0LTA5J1xuICAgIHwgJ2dwdC00LTAxMjUtcHJldmlldydcbiAgICB8ICdncHQtNC10dXJiby1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LTExMDYtcHJldmlldydcbiAgICB8ICdncHQtNC12aXNpb24tcHJldmlldydcbiAgICB8ICdncHQtNCdcbiAgICB8ICdncHQtNC0wMzE0J1xuICAgIHwgJ2dwdC00LTA2MTMnXG4gICAgfCAnZ3B0LTQtMzJrJ1xuICAgIHwgJ2dwdC00LTMyay0wMzE0J1xuICAgIHwgJ2dwdC00LTMyay0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8nXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmsnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTEwNidcbiAgICB8ICdncHQtMy41LXR1cmJvLTAxMjUnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmstMDYxMydcbiAgICB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00b10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00byksXG4gICAqIFtHUFQtNCBUdXJib10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00LXR1cmJvLWFuZC1ncHQtNCksXG4gICAqIGFuZCBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IEFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hhdCBzYW1wbGluZyB0ZW1wZXJhdHVyZSB0byB1c2UsIGJldHdlZW4gMCBhbmQgMi4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsXG4gICAqIG1ha2UgdGhlIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlXG4gICAqIGZvY3VzZWQgYW5kIGRldGVybWluaXN0aWMuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIElmIG5vIHRocmVhZCBpcyBwcm92aWRlZCwgYW4gZW1wdHkgdGhyZWFkIHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIHRocmVhZD86IFRocmVhZENyZWF0ZUFuZFJ1blN0cmVhbVBhcmFtcy5UaHJlYWQ7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIHRvb2wgaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbCB3aWxsXG4gICAqIG5vdCBjYWxsIGFueSB0b29scyBhbmQgaW5zdGVhZCBnZW5lcmF0ZXMgYSBtZXNzYWdlLiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICogYW5kIG1lYW5zIHRoZSBtb2RlbCBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmVcbiAgICogdG9vbHMuIGByZXF1aXJlZGAgbWVhbnMgdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scyBiZWZvcmUgcmVzcG9uZGluZ1xuICAgKiB0byB0aGUgdXNlci4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCBsaWtlIGB7XCJ0eXBlXCI6IFwiZmlsZV9zZWFyY2hcIn1gIG9yXG4gICAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gICAqIGNhbGwgdGhhdCB0b29sLlxuICAgKi9cbiAgdG9vbF9jaG9pY2U/OiBBc3Npc3RhbnRUb29sQ2hvaWNlT3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGFzc2lzdGFudCdzIHRvb2xzLiBUaGUgcmVzb3VyY2VzIGFyZVxuICAgKiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzXG4gICAqIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlXG4gICAqIElEcy5cbiAgICovXG4gIHRvb2xfcmVzb3VyY2VzPzogVGhyZWFkQ3JlYXRlQW5kUnVuU3RyZWFtUGFyYW1zLlRvb2xSZXNvdXJjZXMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgdG9vbHMgdGhlIGFzc2lzdGFudCBjYW4gdXNlIGZvciB0aGlzIHJ1bi4gVGhpcyBpcyB1c2VmdWwgZm9yXG4gICAqIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgdG9vbHM/OiBBcnJheTxcbiAgICBBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sIHwgQXNzaXN0YW50c0FQSS5GdW5jdGlvblRvb2xcbiAgPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIHRlbXBlcmF0dXJlIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIHRydW5jYXRpb25fc3RyYXRlZ3k/OiBUaHJlYWRDcmVhdGVBbmRSdW5TdHJlYW1QYXJhbXMuVHJ1bmNhdGlvblN0cmF0ZWd5IHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBUaHJlYWRDcmVhdGVBbmRSdW5TdHJlYW1QYXJhbXMge1xuICAvKipcbiAgICogSWYgbm8gdGhyZWFkIGlzIHByb3ZpZGVkLCBhbiBlbXB0eSB0aHJlYWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWQge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBbbWVzc2FnZXNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMpIHRvXG4gICAgICogc3RhcnQgdGhlIHRocmVhZCB3aXRoLlxuICAgICAqL1xuICAgIG1lc3NhZ2VzPzogQXJyYXk8VGhyZWFkLk1lc3NhZ2U+O1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICAgKiBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgXG4gICAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICAgKi9cbiAgICB0b29sX3Jlc291cmNlcz86IFRocmVhZC5Ub29sUmVzb3VyY2VzIHwgbnVsbDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdGV4dCBjb250ZW50cyBvZiB0aGUgbWVzc2FnZS5cbiAgICAgICAqL1xuICAgICAgY29udGVudDogc3RyaW5nIHwgQXJyYXk8TWVzc2FnZXNBUEkuTWVzc2FnZUNvbnRlbnRQYXJ0UGFyYW0+O1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSByb2xlIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjcmVhdGluZyB0aGUgbWVzc2FnZS4gQWxsb3dlZCB2YWx1ZXMgaW5jbHVkZTpcbiAgICAgICAqXG4gICAgICAgKiAtIGB1c2VyYDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIHNlbnQgYnkgYW4gYWN0dWFsIHVzZXIgYW5kIHNob3VsZCBiZSB1c2VkIGluXG4gICAgICAgKiAgIG1vc3QgY2FzZXMgdG8gcmVwcmVzZW50IHVzZXItZ2VuZXJhdGVkIG1lc3NhZ2VzLlxuICAgICAgICogLSBgYXNzaXN0YW50YDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGdlbmVyYXRlZCBieSB0aGUgYXNzaXN0YW50LiBVc2UgdGhpc1xuICAgICAgICogICB2YWx1ZSB0byBpbnNlcnQgbWVzc2FnZXMgZnJvbSB0aGUgYXNzaXN0YW50IGludG8gdGhlIGNvbnZlcnNhdGlvbi5cbiAgICAgICAqL1xuICAgICAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG5cbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIGZpbGVzIGF0dGFjaGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQgdGhlIHRvb2xzIHRoZXkgc2hvdWxkIGJlIGFkZGVkIHRvLlxuICAgICAgICovXG4gICAgICBhdHRhY2htZW50cz86IEFycmF5PE1lc3NhZ2UuQXR0YWNobWVudD4gfCBudWxsO1xuXG4gICAgICAvKipcbiAgICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICAgICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgICAqL1xuICAgICAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2Uge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBBdHRhY2htZW50IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBJRCBvZiB0aGUgZmlsZSB0byBhdHRhY2ggdG8gdGhlIG1lc3NhZ2UuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdG9vbHMgdG8gYWRkIHRoaXMgZmlsZSB0by5cbiAgICAgICAgICovXG4gICAgICAgIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbD47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBhc3Npc3RhbnQncyB0b29scyBpbiB0aGlzXG4gICAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgICAqIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZSBJRHMuXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICAgIGNvZGVfaW50ZXJwcmV0ZXI/OiBUb29sUmVzb3VyY2VzLkNvZGVJbnRlcnByZXRlcjtcblxuICAgICAgZmlsZV9zZWFyY2g/OiBUb29sUmVzb3VyY2VzLkZpbGVTZWFyY2g7XG4gICAgfVxuXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGVcbiAgICAgICAgICogYXZhaWxhYmxlIHRvIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAyMCBmaWxlc1xuICAgICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGVcbiAgICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAgICogdGhlIHRocmVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGhlbHBlciB0byBjcmVhdGUgYVxuICAgICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICAgKiB3aXRoIGZpbGVfaWRzIGFuZCBhdHRhY2ggaXQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3JcbiAgICAgICAgICogc3RvcmUgYXR0YWNoZWQgdG8gdGhlIHRocmVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHZlY3Rvcl9zdG9yZXM/OiBBcnJheTxGaWxlU2VhcmNoLlZlY3RvclN0b3JlPjtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IG5hbWVzcGFjZSBGaWxlU2VhcmNoIHtcbiAgICAgICAgZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZSB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgdG9cbiAgICAgICAgICAgKiBhZGQgdG8gdGhlIHZlY3RvciBzdG9yZS4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxMDAwMCBmaWxlcyBpbiBhIHZlY3RvclxuICAgICAgICAgICAqIHN0b3JlLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSB2ZWN0b3Igc3RvcmUuIFRoaXMgY2FuIGJlXG4gICAgICAgICAgICogdXNlZnVsIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlY3RvciBzdG9yZSBpbiBhIHN0cnVjdHVyZWRcbiAgICAgICAgICAgKiBmb3JtYXQuIEtleXMgY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW1cbiAgICAgICAgICAgKiBvZiA1MTIgY2hhcmFjdGVycyBsb25nLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIG1ldGFkYXRhPzogdW5rbm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgYXNzaXN0YW50J3MgdG9vbHMuIFRoZSByZXNvdXJjZXMgYXJlXG4gICAqIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXNcbiAgICogYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVcbiAgICogSURzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBjb2RlX2ludGVycHJldGVyPzogVG9vbFJlc291cmNlcy5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyBtYWRlXG4gICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2gge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyBhc3Npc3RhbnQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAqIHRoZSBhc3Npc3RhbnQuXG4gICAgICAgKi9cbiAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUcnVuY2F0aW9uU3RyYXRlZ3kge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cnVuY2F0aW9uIHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIHRocmVhZC4gVGhlIGRlZmF1bHQgaXMgYGF1dG9gLiBJZiBzZXQgdG9cbiAgICAgKiBgbGFzdF9tZXNzYWdlc2AsIHRoZSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gdGhlIG4gbW9zdCByZWNlbnQgbWVzc2FnZXMgaW5cbiAgICAgKiB0aGUgdGhyZWFkLiBXaGVuIHNldCB0byBgYXV0b2AsIG1lc3NhZ2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRocmVhZCB3aWxsIGJlXG4gICAgICogZHJvcHBlZCB0byBmaXQgdGhlIGNvbnRleHQgbGVuZ3RoIG9mIHRoZSBtb2RlbCwgYG1heF9wcm9tcHRfdG9rZW5zYC5cbiAgICAgKi9cbiAgICB0eXBlOiAnYXV0bycgfCAnbGFzdF9tZXNzYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGZyb20gdGhlIHRocmVhZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgY29udGV4dFxuICAgICAqIGZvciB0aGUgcnVuLlxuICAgICAqL1xuICAgIGxhc3RfbWVzc2FnZXM/OiBudW1iZXIgfCBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkcyB7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50UmVzcG9uc2VGb3JtYXQgPSBUaHJlYWRzQVBJLkFzc2lzdGFudFJlc3BvbnNlRm9ybWF0O1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uID0gVGhyZWFkc0FQSS5Bc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRUb29sQ2hvaWNlID0gVGhyZWFkc0FQSS5Bc3Npc3RhbnRUb29sQ2hvaWNlO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFRvb2xDaG9pY2VGdW5jdGlvbiA9IFRocmVhZHNBUEkuQXNzaXN0YW50VG9vbENob2ljZUZ1bmN0aW9uO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb24gPSBUaHJlYWRzQVBJLkFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb247XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkID0gVGhyZWFkc0FQSS5UaHJlYWQ7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkRGVsZXRlZCA9IFRocmVhZHNBUEkuVGhyZWFkRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVQYXJhbXMgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRVcGRhdGVQYXJhbXMgPSBUaHJlYWRzQVBJLlRocmVhZFVwZGF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXMgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNOb25TdHJlYW1pbmcgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNTdHJlYW1pbmcgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc1N0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5Qb2xsUGFyYW1zID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVBbmRSdW5Qb2xsUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZENyZWF0ZUFuZFJ1blN0cmVhbVBhcmFtcyA9IFRocmVhZHNBUEkuVGhyZWFkQ3JlYXRlQW5kUnVuU3RyZWFtUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1bnMgPSBSdW5zQVBJLlJ1bnM7XG4gIGV4cG9ydCBpbXBvcnQgUmVxdWlyZWRBY3Rpb25GdW5jdGlvblRvb2xDYWxsID0gUnVuc0FQSS5SZXF1aXJlZEFjdGlvbkZ1bmN0aW9uVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgUnVuID0gUnVuc0FQSS5SdW47XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RhdHVzID0gUnVuc0FQSS5SdW5TdGF0dXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuc1BhZ2UgPSBSdW5zQVBJLlJ1bnNQYWdlO1xuICBleHBvcnQgaW1wb3J0IFJ1bkNyZWF0ZVBhcmFtcyA9IFJ1bnNBUEkuUnVuQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1bkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IFJ1bnNBUEkuUnVuQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IFJ1bkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IFJ1bnNBUEkuUnVuQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IFJ1blVwZGF0ZVBhcmFtcyA9IFJ1bnNBUEkuUnVuVXBkYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1bkxpc3RQYXJhbXMgPSBSdW5zQVBJLlJ1bkxpc3RQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuQ3JlYXRlQW5kUG9sbFBhcmFtcyA9IFJ1bnNBUEkuUnVuQ3JlYXRlQW5kUG9sbFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5DcmVhdGVBbmRTdHJlYW1QYXJhbXMgPSBSdW5zQVBJLlJ1bkNyZWF0ZUFuZFN0cmVhbVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdHJlYW1QYXJhbXMgPSBSdW5zQVBJLlJ1blN0cmVhbVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtcyA9IFJ1bnNBUEkuUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNOb25TdHJlYW1pbmcgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtaW5nID0gUnVuc0FQSS5SdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdWJtaXRUb29sT3V0cHV0c0FuZFBvbGxQYXJhbXMgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzQW5kUG9sbFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdWJtaXRUb29sT3V0cHV0c1N0cmVhbVBhcmFtcyA9IFJ1bnNBUEkuUnVuU3VibWl0VG9vbE91dHB1dHNTdHJlYW1QYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZXMgPSBNZXNzYWdlc0FQSS5NZXNzYWdlcztcbiAgZXhwb3J0IGltcG9ydCBBbm5vdGF0aW9uID0gTWVzc2FnZXNBUEkuQW5ub3RhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBBbm5vdGF0aW9uRGVsdGEgPSBNZXNzYWdlc0FQSS5Bbm5vdGF0aW9uRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUNpdGF0aW9uQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkZpbGVDaXRhdGlvbkFubm90YXRpb247XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUNpdGF0aW9uRGVsdGFBbm5vdGF0aW9uID0gTWVzc2FnZXNBUEkuRmlsZUNpdGF0aW9uRGVsdGFBbm5vdGF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEZpbGVQYXRoQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkZpbGVQYXRoQW5ub3RhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBGaWxlUGF0aERlbHRhQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkZpbGVQYXRoRGVsdGFBbm5vdGF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEltYWdlRmlsZSA9IE1lc3NhZ2VzQVBJLkltYWdlRmlsZTtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUZpbGVDb250ZW50QmxvY2sgPSBNZXNzYWdlc0FQSS5JbWFnZUZpbGVDb250ZW50QmxvY2s7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VGaWxlRGVsdGEgPSBNZXNzYWdlc0FQSS5JbWFnZUZpbGVEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUZpbGVEZWx0YUJsb2NrID0gTWVzc2FnZXNBUEkuSW1hZ2VGaWxlRGVsdGFCbG9jaztcbiAgZXhwb3J0IGltcG9ydCBJbWFnZVVSTCA9IE1lc3NhZ2VzQVBJLkltYWdlVVJMO1xuICBleHBvcnQgaW1wb3J0IEltYWdlVVJMQ29udGVudEJsb2NrID0gTWVzc2FnZXNBUEkuSW1hZ2VVUkxDb250ZW50QmxvY2s7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VVUkxEZWx0YSA9IE1lc3NhZ2VzQVBJLkltYWdlVVJMRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VVUkxEZWx0YUJsb2NrID0gTWVzc2FnZXNBUEkuSW1hZ2VVUkxEZWx0YUJsb2NrO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2UgPSBNZXNzYWdlc0FQSS5NZXNzYWdlO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VDb250ZW50ID0gTWVzc2FnZXNBUEkuTWVzc2FnZUNvbnRlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZUNvbnRlbnREZWx0YSA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VDb250ZW50RGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZUNvbnRlbnRQYXJ0UGFyYW0gPSBNZXNzYWdlc0FQSS5NZXNzYWdlQ29udGVudFBhcnRQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlRGVsZXRlZCA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VEZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VEZWx0YSA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlRGVsdGFFdmVudCA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VEZWx0YUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IFRleHQgPSBNZXNzYWdlc0FQSS5UZXh0O1xuICBleHBvcnQgaW1wb3J0IFRleHRDb250ZW50QmxvY2sgPSBNZXNzYWdlc0FQSS5UZXh0Q29udGVudEJsb2NrO1xuICBleHBvcnQgaW1wb3J0IFRleHRDb250ZW50QmxvY2tQYXJhbSA9IE1lc3NhZ2VzQVBJLlRleHRDb250ZW50QmxvY2tQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBUZXh0RGVsdGEgPSBNZXNzYWdlc0FQSS5UZXh0RGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgVGV4dERlbHRhQmxvY2sgPSBNZXNzYWdlc0FQSS5UZXh0RGVsdGFCbG9jaztcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlc1BhZ2UgPSBNZXNzYWdlc0FQSS5NZXNzYWdlc1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZUNyZWF0ZVBhcmFtcyA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZVVwZGF0ZVBhcmFtcyA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VVcGRhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZUxpc3RQYXJhbXMgPSBNZXNzYWdlc0FQSS5NZXNzYWdlTGlzdFBhcmFtcztcbn1cbiIsICIvKipcbiAqIExpa2UgYFByb21pc2UuYWxsU2V0dGxlZCgpYCBidXQgdGhyb3dzIGFuIGVycm9yIGlmIGFueSBwcm9taXNlcyBhcmUgcmVqZWN0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBhbGxTZXR0bGVkV2l0aFRocm93ID0gYXN5bmMgPFI+KHByb21pc2VzOiBQcm9taXNlPFI+W10pOiBQcm9taXNlPFJbXT4gPT4ge1xuICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKTtcbiAgY29uc3QgcmVqZWN0ZWQgPSByZXN1bHRzLmZpbHRlcigocmVzdWx0KTogcmVzdWx0IGlzIFByb21pc2VSZWplY3RlZFJlc3VsdCA9PiByZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKTtcbiAgaWYgKHJlamVjdGVkLmxlbmd0aCkge1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlamVjdGVkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKHJlc3VsdC5yZWFzb24pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgJHtyZWplY3RlZC5sZW5ndGh9IHByb21pc2UocykgZmFpbGVkIC0gc2VlIHRoZSBhYm92ZSBlcnJvcnNgKTtcbiAgfVxuXG4gIC8vIE5vdGU6IFRTIHdhcyBjb21wbGFpbmluZyBhYm91dCB1c2luZyBgLmZpbHRlcigpLm1hcCgpYCBoZXJlIGZvciBzb21lIHJlYXNvblxuICBjb25zdCB2YWx1ZXM6IFJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSB7XG4gICAgICB2YWx1ZXMucHVzaChyZXN1bHQudmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufTtcbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZSc7XG5pbXBvcnQgeyBpc1JlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBzbGVlcCwgVXBsb2FkYWJsZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0ICogYXMgRmlsZXNBUEkgZnJvbSAnLi9maWxlcyc7XG5pbXBvcnQgeyBDdXJzb3JQYWdlLCB0eXBlIEN1cnNvclBhZ2VQYXJhbXMgfSBmcm9tICcuLi8uLi8uLi9wYWdpbmF0aW9uJztcblxuZXhwb3J0IGNsYXNzIEZpbGVzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQ3JlYXRlIGEgdmVjdG9yIHN0b3JlIGZpbGUgYnkgYXR0YWNoaW5nIGFcbiAgICogW0ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIHRvIGFcbiAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdCkuXG4gICAqL1xuICBjcmVhdGUoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGJvZHk6IEZpbGVDcmVhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGU+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoYC92ZWN0b3Jfc3RvcmVzLyR7dmVjdG9yU3RvcmVJZH0vZmlsZXNgLCB7XG4gICAgICBib2R5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgdmVjdG9yIHN0b3JlIGZpbGUuXG4gICAqL1xuICByZXRyaWV2ZShcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgZmlsZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGU+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL3ZlY3Rvcl9zdG9yZXMvJHt2ZWN0b3JTdG9yZUlkfS9maWxlcy8ke2ZpbGVJZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgZmlsZXMuXG4gICAqL1xuICBsaXN0KFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBxdWVyeT86IEZpbGVMaXN0UGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPFZlY3RvclN0b3JlRmlsZXNQYWdlLCBWZWN0b3JTdG9yZUZpbGU+O1xuICBsaXN0KFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVzUGFnZSwgVmVjdG9yU3RvcmVGaWxlPjtcbiAgbGlzdChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgcXVlcnk6IEZpbGVMaXN0UGFyYW1zIHwgQ29yZS5SZXF1ZXN0T3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPFZlY3RvclN0b3JlRmlsZXNQYWdlLCBWZWN0b3JTdG9yZUZpbGU+IHtcbiAgICBpZiAoaXNSZXF1ZXN0T3B0aW9ucyhxdWVyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3QodmVjdG9yU3RvcmVJZCwge30sIHF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KGAvdmVjdG9yX3N0b3Jlcy8ke3ZlY3RvclN0b3JlSWR9L2ZpbGVzYCwgVmVjdG9yU3RvcmVGaWxlc1BhZ2UsIHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgdmVjdG9yIHN0b3JlIGZpbGUuIFRoaXMgd2lsbCByZW1vdmUgdGhlIGZpbGUgZnJvbSB0aGUgdmVjdG9yIHN0b3JlIGJ1dFxuICAgKiB0aGUgZmlsZSBpdHNlbGYgd2lsbCBub3QgYmUgZGVsZXRlZC4gVG8gZGVsZXRlIHRoZSBmaWxlLCB1c2UgdGhlXG4gICAqIFtkZWxldGUgZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcy9kZWxldGUpXG4gICAqIGVuZHBvaW50LlxuICAgKi9cbiAgZGVsKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBmaWxlSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPFZlY3RvclN0b3JlRmlsZURlbGV0ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmRlbGV0ZShgL3ZlY3Rvcl9zdG9yZXMvJHt2ZWN0b3JTdG9yZUlkfS9maWxlcy8ke2ZpbGVJZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBmaWxlIHRvIHRoZSBnaXZlbiB2ZWN0b3Igc3RvcmUgYW5kIHdhaXQgZm9yIGl0IHRvIGJlIHByb2Nlc3NlZC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFuZFBvbGwoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGJvZHk6IEZpbGVDcmVhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMgJiB7IHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyIH0sXG4gICk6IFByb21pc2U8VmVjdG9yU3RvcmVGaWxlPiB7XG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IHRoaXMuY3JlYXRlKHZlY3RvclN0b3JlSWQsIGJvZHksIG9wdGlvbnMpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnBvbGwodmVjdG9yU3RvcmVJZCwgZmlsZS5pZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogV2FpdCBmb3IgdGhlIHZlY3RvciBzdG9yZSBmaWxlIHRvIGZpbmlzaCBwcm9jZXNzaW5nLlxuICAgKlxuICAgKiBOb3RlOiB0aGlzIHdpbGwgcmV0dXJuIGV2ZW4gaWYgdGhlIGZpbGUgZmFpbGVkIHRvIHByb2Nlc3MsIHlvdSBuZWVkIHRvIGNoZWNrXG4gICAqIGZpbGUubGFzdF9lcnJvciBhbmQgZmlsZS5zdGF0dXMgdG8gaGFuZGxlIHRoZXNlIGNhc2VzXG4gICAqL1xuICBhc3luYyBwb2xsKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBmaWxlSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyAmIHsgcG9sbEludGVydmFsTXM/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGU+IHtcbiAgICBjb25zdCBoZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0geyAuLi5vcHRpb25zPy5oZWFkZXJzLCAnWC1TdGFpbmxlc3MtUG9sbC1IZWxwZXInOiAndHJ1ZScgfTtcbiAgICBpZiAob3B0aW9ucz8ucG9sbEludGVydmFsTXMpIHtcbiAgICAgIGhlYWRlcnNbJ1gtU3RhaW5sZXNzLUN1c3RvbS1Qb2xsLUludGVydmFsJ10gPSBvcHRpb25zLnBvbGxJbnRlcnZhbE1zLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCBmaWxlUmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJldHJpZXZlKHZlY3RvclN0b3JlSWQsIGZpbGVJZCwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgfSkud2l0aFJlc3BvbnNlKCk7XG5cbiAgICAgIGNvbnN0IGZpbGUgPSBmaWxlUmVzcG9uc2UuZGF0YTtcblxuICAgICAgc3dpdGNoIChmaWxlLnN0YXR1cykge1xuICAgICAgICBjYXNlICdpbl9wcm9ncmVzcyc6XG4gICAgICAgICAgbGV0IHNsZWVwSW50ZXJ2YWwgPSA1MDAwO1xuXG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnBvbGxJbnRlcnZhbE1zKSB7XG4gICAgICAgICAgICBzbGVlcEludGVydmFsID0gb3B0aW9ucy5wb2xsSW50ZXJ2YWxNcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVySW50ZXJ2YWwgPSBmaWxlUmVzcG9uc2UucmVzcG9uc2UuaGVhZGVycy5nZXQoJ29wZW5haS1wb2xsLWFmdGVyLW1zJyk7XG4gICAgICAgICAgICBpZiAoaGVhZGVySW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgY29uc3QgaGVhZGVySW50ZXJ2YWxNcyA9IHBhcnNlSW50KGhlYWRlckludGVydmFsKTtcbiAgICAgICAgICAgICAgaWYgKCFpc05hTihoZWFkZXJJbnRlcnZhbE1zKSkge1xuICAgICAgICAgICAgICAgIHNsZWVwSW50ZXJ2YWwgPSBoZWFkZXJJbnRlcnZhbE1zO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwSW50ZXJ2YWwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdmYWlsZWQnOlxuICAgICAgICBjYXNlICdjb21wbGV0ZWQnOlxuICAgICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWQgYSBmaWxlIHRvIHRoZSBgZmlsZXNgIEFQSSBhbmQgdGhlbiBhdHRhY2ggaXQgdG8gdGhlIGdpdmVuIHZlY3RvciBzdG9yZS5cbiAgICpcbiAgICogTm90ZSB0aGUgZmlsZSB3aWxsIGJlIGFzeW5jaHJvbm91c2x5IHByb2Nlc3NlZCAoeW91IGNhbiB1c2UgdGhlIGFsdGVybmF0aXZlXG4gICAqIHBvbGxpbmcgaGVscGVyIG1ldGhvZCB0byB3YWl0IGZvciBwcm9jZXNzaW5nIHRvIGNvbXBsZXRlKS5cbiAgICovXG4gIGFzeW5jIHVwbG9hZChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgZmlsZTogVXBsb2FkYWJsZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGU+IHtcbiAgICBjb25zdCBmaWxlSW5mbyA9IGF3YWl0IHRoaXMuX2NsaWVudC5maWxlcy5jcmVhdGUoeyBmaWxlOiBmaWxlLCBwdXJwb3NlOiAnYXNzaXN0YW50cycgfSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKHZlY3RvclN0b3JlSWQsIHsgZmlsZV9pZDogZmlsZUluZm8uaWQgfSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgZmlsZSB0byBhIHZlY3RvciBzdG9yZSBhbmQgcG9sbCB1bnRpbCBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgdXBsb2FkQW5kUG9sbChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgZmlsZTogVXBsb2FkYWJsZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyAmIHsgcG9sbEludGVydmFsTXM/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGU+IHtcbiAgICBjb25zdCBmaWxlSW5mbyA9IGF3YWl0IHRoaXMudXBsb2FkKHZlY3RvclN0b3JlSWQsIGZpbGUsIG9wdGlvbnMpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnBvbGwodmVjdG9yU3RvcmVJZCwgZmlsZUluZm8uaWQsIG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWZWN0b3JTdG9yZUZpbGVzUGFnZSBleHRlbmRzIEN1cnNvclBhZ2U8VmVjdG9yU3RvcmVGaWxlPiB7fVxuXG4vKipcbiAqIEEgbGlzdCBvZiBmaWxlcyBhdHRhY2hlZCB0byBhIHZlY3RvciBzdG9yZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZUZpbGUge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSB2ZWN0b3Igc3RvcmUgZmlsZSB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGxhc3QgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmVjdG9yIHN0b3JlIGZpbGUuIFdpbGwgYmUgYG51bGxgIGlmIHRoZXJlXG4gICAqIGFyZSBubyBlcnJvcnMuXG4gICAqL1xuICBsYXN0X2Vycm9yOiBWZWN0b3JTdG9yZUZpbGUuTGFzdEVycm9yIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYHZlY3Rvcl9zdG9yZS5maWxlYC5cbiAgICovXG4gIG9iamVjdDogJ3ZlY3Rvcl9zdG9yZS5maWxlJztcblxuICAvKipcbiAgICogVGhlIHN0YXR1cyBvZiB0aGUgdmVjdG9yIHN0b3JlIGZpbGUsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYGluX3Byb2dyZXNzYCxcbiAgICogYGNvbXBsZXRlZGAsIGBjYW5jZWxsZWRgLCBvciBgZmFpbGVkYC4gVGhlIHN0YXR1cyBgY29tcGxldGVkYCBpbmRpY2F0ZXMgdGhhdCB0aGVcbiAgICogdmVjdG9yIHN0b3JlIGZpbGUgaXMgcmVhZHkgZm9yIHVzZS5cbiAgICovXG4gIHN0YXR1czogJ2luX3Byb2dyZXNzJyB8ICdjb21wbGV0ZWQnIHwgJ2NhbmNlbGxlZCcgfCAnZmFpbGVkJztcblxuICAvKipcbiAgICogVGhlIHRvdGFsIHZlY3RvciBzdG9yZSB1c2FnZSBpbiBieXRlcy4gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZVxuICAgKiBvcmlnaW5hbCBmaWxlIHNpemUuXG4gICAqL1xuICB1c2FnZV9ieXRlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlXG4gICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAqIHRoYXQgdGhlIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBpc1xuICAgKiBhdHRhY2hlZCB0by5cbiAgICovXG4gIHZlY3Rvcl9zdG9yZV9pZDogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFZlY3RvclN0b3JlRmlsZSB7XG4gIC8qKlxuICAgKiBUaGUgbGFzdCBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhpcyB2ZWN0b3Igc3RvcmUgZmlsZS4gV2lsbCBiZSBgbnVsbGAgaWYgdGhlcmVcbiAgICogYXJlIG5vIGVycm9ycy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgTGFzdEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBPbmUgb2YgYHNlcnZlcl9lcnJvcmAgb3IgYHJhdGVfbGltaXRfZXhjZWVkZWRgLlxuICAgICAqL1xuICAgIGNvZGU6ICdpbnRlcm5hbF9lcnJvcicgfCAnZmlsZV9ub3RfZm91bmQnIHwgJ3BhcnNpbmdfZXJyb3InIHwgJ3VuaGFuZGxlZF9taW1lX3R5cGUnO1xuXG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuXG4gICAgICovXG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmVGaWxlRGVsZXRlZCB7XG4gIGlkOiBzdHJpbmc7XG5cbiAgZGVsZXRlZDogYm9vbGVhbjtcblxuICBvYmplY3Q6ICd2ZWN0b3Jfc3RvcmUuZmlsZS5kZWxldGVkJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgW0ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEIHRoYXQgdGhlXG4gICAqIHZlY3RvciBzdG9yZSBzaG91bGQgdXNlLiBVc2VmdWwgZm9yIHRvb2xzIGxpa2UgYGZpbGVfc2VhcmNoYCB0aGF0IGNhbiBhY2Nlc3NcbiAgICogZmlsZXMuXG4gICAqL1xuICBmaWxlX2lkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUxpc3RQYXJhbXMgZXh0ZW5kcyBDdXJzb3JQYWdlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgY3Vyc29yIGZvciB1c2UgaW4gcGFnaW5hdGlvbi4gYGJlZm9yZWAgaXMgYW4gb2JqZWN0IElEIHRoYXQgZGVmaW5lcyB5b3VyIHBsYWNlXG4gICAqIGluIHRoZSBsaXN0LiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBtYWtlIGEgbGlzdCByZXF1ZXN0IGFuZCByZWNlaXZlIDEwMCBvYmplY3RzLFxuICAgKiBlbmRpbmcgd2l0aCBvYmpfZm9vLCB5b3VyIHN1YnNlcXVlbnQgY2FsbCBjYW4gaW5jbHVkZSBiZWZvcmU9b2JqX2ZvbyBpbiBvcmRlciB0b1xuICAgKiBmZXRjaCB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgbGlzdC5cbiAgICovXG4gIGJlZm9yZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsdGVyIGJ5IGZpbGUgc3RhdHVzLiBPbmUgb2YgYGluX3Byb2dyZXNzYCwgYGNvbXBsZXRlZGAsIGBmYWlsZWRgLCBgY2FuY2VsbGVkYC5cbiAgICovXG4gIGZpbHRlcj86ICdpbl9wcm9ncmVzcycgfCAnY29tcGxldGVkJyB8ICdmYWlsZWQnIHwgJ2NhbmNlbGxlZCc7XG5cbiAgLyoqXG4gICAqIFNvcnQgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lc3RhbXAgb2YgdGhlIG9iamVjdHMuIGBhc2NgIGZvciBhc2NlbmRpbmdcbiAgICogb3JkZXIgYW5kIGBkZXNjYCBmb3IgZGVzY2VuZGluZyBvcmRlci5cbiAgICovXG4gIG9yZGVyPzogJ2FzYycgfCAnZGVzYyc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmlsZXMge1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3JlRmlsZSA9IEZpbGVzQVBJLlZlY3RvclN0b3JlRmlsZTtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZUZpbGVEZWxldGVkID0gRmlsZXNBUEkuVmVjdG9yU3RvcmVGaWxlRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZUZpbGVzUGFnZSA9IEZpbGVzQVBJLlZlY3RvclN0b3JlRmlsZXNQYWdlO1xuICBleHBvcnQgaW1wb3J0IEZpbGVDcmVhdGVQYXJhbXMgPSBGaWxlc0FQSS5GaWxlQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEZpbGVMaXN0UGFyYW1zID0gRmlsZXNBUEkuRmlsZUxpc3RQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2UnO1xuaW1wb3J0IHsgaXNSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IFVwbG9hZGFibGUgfSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IGFsbFNldHRsZWRXaXRoVGhyb3cgfSBmcm9tICcuLi8uLi8uLi9saWIvVXRpbCc7XG5pbXBvcnQgKiBhcyBGaWxlQmF0Y2hlc0FQSSBmcm9tICcuL2ZpbGUtYmF0Y2hlcyc7XG5pbXBvcnQgKiBhcyBGaWxlc0FQSSBmcm9tICcuL2ZpbGVzJztcbmltcG9ydCB7IFZlY3RvclN0b3JlRmlsZXNQYWdlIH0gZnJvbSAnLi9maWxlcyc7XG5pbXBvcnQgeyB0eXBlIEN1cnNvclBhZ2VQYXJhbXMgfSBmcm9tICcuLi8uLi8uLi9wYWdpbmF0aW9uJztcblxuZXhwb3J0IGNsYXNzIEZpbGVCYXRjaGVzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQ3JlYXRlIGEgdmVjdG9yIHN0b3JlIGZpbGUgYmF0Y2guXG4gICAqL1xuICBjcmVhdGUoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGJvZHk6IEZpbGVCYXRjaENyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPFZlY3RvclN0b3JlRmlsZUJhdGNoPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvdmVjdG9yX3N0b3Jlcy8ke3ZlY3RvclN0b3JlSWR9L2ZpbGVfYmF0Y2hlc2AsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSB2ZWN0b3Igc3RvcmUgZmlsZSBiYXRjaC5cbiAgICovXG4gIHJldHJpZXZlKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBiYXRjaElkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVCYXRjaD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvdmVjdG9yX3N0b3Jlcy8ke3ZlY3RvclN0b3JlSWR9L2ZpbGVfYmF0Y2hlcy8ke2JhdGNoSWR9YCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGEgdmVjdG9yIHN0b3JlIGZpbGUgYmF0Y2guIFRoaXMgYXR0ZW1wdHMgdG8gY2FuY2VsIHRoZSBwcm9jZXNzaW5nIG9mXG4gICAqIGZpbGVzIGluIHRoaXMgYmF0Y2ggYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICovXG4gIGNhbmNlbChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgYmF0Y2hJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8VmVjdG9yU3RvcmVGaWxlQmF0Y2g+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoYC92ZWN0b3Jfc3RvcmVzLyR7dmVjdG9yU3RvcmVJZH0vZmlsZV9iYXRjaGVzLyR7YmF0Y2hJZH0vY2FuY2VsYCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdmVjdG9yIHN0b3JlIGJhdGNoIGFuZCBwb2xsIHVudGlsIGFsbCBmaWxlcyBoYXZlIGJlZW4gcHJvY2Vzc2VkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQW5kUG9sbChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgYm9keTogRmlsZUJhdGNoQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zICYgeyBwb2xsSW50ZXJ2YWxNcz86IG51bWJlciB9LFxuICApOiBQcm9taXNlPFZlY3RvclN0b3JlRmlsZUJhdGNoPiB7XG4gICAgY29uc3QgYmF0Y2ggPSBhd2FpdCB0aGlzLmNyZWF0ZSh2ZWN0b3JTdG9yZUlkLCBib2R5KTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wb2xsKHZlY3RvclN0b3JlSWQsIGJhdGNoLmlkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgZmlsZXMgaW4gYSBiYXRjaC5cbiAgICovXG4gIGxpc3RGaWxlcyhcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgYmF0Y2hJZDogc3RyaW5nLFxuICAgIHF1ZXJ5PzogRmlsZUJhdGNoTGlzdEZpbGVzUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPFZlY3RvclN0b3JlRmlsZXNQYWdlLCBGaWxlc0FQSS5WZWN0b3JTdG9yZUZpbGU+O1xuICBsaXN0RmlsZXMoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGJhdGNoSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVzUGFnZSwgRmlsZXNBUEkuVmVjdG9yU3RvcmVGaWxlPjtcbiAgbGlzdEZpbGVzKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBiYXRjaElkOiBzdHJpbmcsXG4gICAgcXVlcnk6IEZpbGVCYXRjaExpc3RGaWxlc1BhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVzUGFnZSwgRmlsZXNBUEkuVmVjdG9yU3RvcmVGaWxlPiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0RmlsZXModmVjdG9yU3RvcmVJZCwgYmF0Y2hJZCwge30sIHF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KFxuICAgICAgYC92ZWN0b3Jfc3RvcmVzLyR7dmVjdG9yU3RvcmVJZH0vZmlsZV9iYXRjaGVzLyR7YmF0Y2hJZH0vZmlsZXNgLFxuICAgICAgVmVjdG9yU3RvcmVGaWxlc1BhZ2UsXG4gICAgICB7IHF1ZXJ5LCAuLi5vcHRpb25zLCBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9IH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0IGZvciB0aGUgZ2l2ZW4gZmlsZSBiYXRjaCB0byBiZSBwcm9jZXNzZWQuXG4gICAqXG4gICAqIE5vdGU6IHRoaXMgd2lsbCByZXR1cm4gZXZlbiBpZiBvbmUgb2YgdGhlIGZpbGVzIGZhaWxlZCB0byBwcm9jZXNzLCB5b3UgbmVlZCB0b1xuICAgKiBjaGVjayBiYXRjaC5maWxlX2NvdW50cy5mYWlsZWRfY291bnQgdG8gaGFuZGxlIHRoaXMgY2FzZS5cbiAgICovXG4gIGFzeW5jIHBvbGwoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGJhdGNoSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyAmIHsgcG9sbEludGVydmFsTXM/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVCYXRjaD4ge1xuICAgIGNvbnN0IGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7IC4uLm9wdGlvbnM/LmhlYWRlcnMsICdYLVN0YWlubGVzcy1Qb2xsLUhlbHBlcic6ICd0cnVlJyB9O1xuICAgIGlmIChvcHRpb25zPy5wb2xsSW50ZXJ2YWxNcykge1xuICAgICAgaGVhZGVyc1snWC1TdGFpbmxlc3MtQ3VzdG9tLVBvbGwtSW50ZXJ2YWwnXSA9IG9wdGlvbnMucG9sbEludGVydmFsTXMudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgeyBkYXRhOiBiYXRjaCwgcmVzcG9uc2UgfSA9IGF3YWl0IHRoaXMucmV0cmlldmUodmVjdG9yU3RvcmVJZCwgYmF0Y2hJZCwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgfSkud2l0aFJlc3BvbnNlKCk7XG5cbiAgICAgIHN3aXRjaCAoYmF0Y2guc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgJ2luX3Byb2dyZXNzJzpcbiAgICAgICAgICBsZXQgc2xlZXBJbnRlcnZhbCA9IDUwMDA7XG5cbiAgICAgICAgICBpZiAob3B0aW9ucz8ucG9sbEludGVydmFsTXMpIHtcbiAgICAgICAgICAgIHNsZWVwSW50ZXJ2YWwgPSBvcHRpb25zLnBvbGxJbnRlcnZhbE1zO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJJbnRlcnZhbCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdvcGVuYWktcG9sbC1hZnRlci1tcycpO1xuICAgICAgICAgICAgaWYgKGhlYWRlckludGVydmFsKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGhlYWRlckludGVydmFsTXMgPSBwYXJzZUludChoZWFkZXJJbnRlcnZhbCk7XG4gICAgICAgICAgICAgIGlmICghaXNOYU4oaGVhZGVySW50ZXJ2YWxNcykpIHtcbiAgICAgICAgICAgICAgICBzbGVlcEludGVydmFsID0gaGVhZGVySW50ZXJ2YWxNcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBzbGVlcChzbGVlcEludGVydmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZmFpbGVkJzpcbiAgICAgICAgY2FzZSAnY2FuY2VsbGVkJzpcbiAgICAgICAgY2FzZSAnY29tcGxldGVkJzpcbiAgICAgICAgICByZXR1cm4gYmF0Y2g7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgdGhlIGdpdmVuIGZpbGVzIGNvbmN1cnJlbnRseSBhbmQgdGhlbiBjcmVhdGVzIGEgdmVjdG9yIHN0b3JlIGZpbGUgYmF0Y2guXG4gICAqXG4gICAqIFRoZSBjb25jdXJyZW5jeSBsaW1pdCBpcyBjb25maWd1cmFibGUgdXNpbmcgdGhlIGBtYXhDb25jdXJyZW5jeWAgcGFyYW1ldGVyLlxuICAgKi9cbiAgYXN5bmMgdXBsb2FkQW5kUG9sbChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgeyBmaWxlcywgZmlsZUlkcyA9IFtdIH06IHsgZmlsZXM6IFVwbG9hZGFibGVbXTsgZmlsZUlkcz86IHN0cmluZ1tdIH0sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMgJiB7IHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyOyBtYXhDb25jdXJyZW5jeT86IG51bWJlciB9LFxuICApOiBQcm9taXNlPFZlY3RvclN0b3JlRmlsZUJhdGNoPiB7XG4gICAgaWYgKGZpbGVzID09PSBudWxsIHx8IGZpbGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGZpbGVzIHByb3ZpZGVkIHRvIHByb2Nlc3MuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlndXJlZENvbmN1cnJlbmN5ID0gb3B0aW9ucz8ubWF4Q29uY3VycmVuY3kgPz8gNTtcbiAgICAvL1dlIGNhcCB0aGUgbnVtYmVyIG9mIHdvcmtlcnMgYXQgdGhlIG51bWJlciBvZiBmaWxlcyAoc28gd2UgZG9uJ3Qgc3RhcnQgYW55IHVubmVjZXNzYXJ5IHdvcmtlcnMpXG4gICAgY29uc3QgY29uY3VycmVuY3lMaW1pdCA9IE1hdGgubWluKGNvbmZpZ3VyZWRDb25jdXJyZW5jeSwgZmlsZXMubGVuZ3RoKTtcblxuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuX2NsaWVudDtcbiAgICBjb25zdCBmaWxlSXRlcmF0b3IgPSBmaWxlcy52YWx1ZXMoKTtcbiAgICBjb25zdCBhbGxGaWxlSWRzOiBzdHJpbmdbXSA9IFsuLi5maWxlSWRzXTtcblxuICAgIC8vVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoaXMgZGVzaWduLiBUaGUgbGlicmFyaWVzIGRvbid0IGFjY29tbW9kYXRlIG91ciBlbnZpcm9ubWVudCBsaW1pdHMuXG4gICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDA2Mzk0MzIvd2hhdC1pcy10aGUtYmVzdC13YXktdG8tbGltaXQtY29uY3VycmVuY3ktd2hlbi11c2luZy1lczZzLXByb21pc2UtYWxsXG4gICAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0ZpbGVzKGl0ZXJhdG9yOiBJdGVyYWJsZUl0ZXJhdG9yPFVwbG9hZGFibGU+KSB7XG4gICAgICBmb3IgKGxldCBpdGVtIG9mIGl0ZXJhdG9yKSB7XG4gICAgICAgIGNvbnN0IGZpbGVPYmogPSBhd2FpdCBjbGllbnQuZmlsZXMuY3JlYXRlKHsgZmlsZTogaXRlbSwgcHVycG9zZTogJ2Fzc2lzdGFudHMnIH0sIG9wdGlvbnMpO1xuICAgICAgICBhbGxGaWxlSWRzLnB1c2goZmlsZU9iai5pZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9TdGFydCB3b3JrZXJzIHRvIHByb2Nlc3MgcmVzdWx0c1xuICAgIGNvbnN0IHdvcmtlcnMgPSBBcnJheShjb25jdXJyZW5jeUxpbWl0KS5maWxsKGZpbGVJdGVyYXRvcikubWFwKHByb2Nlc3NGaWxlcyk7XG5cbiAgICAvL1dhaXQgZm9yIGFsbCBwcm9jZXNzaW5nIHRvIGNvbXBsZXRlLlxuICAgIGF3YWl0IGFsbFNldHRsZWRXaXRoVGhyb3cod29ya2Vycyk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVBbmRQb2xsKHZlY3RvclN0b3JlSWQsIHtcbiAgICAgIGZpbGVfaWRzOiBhbGxGaWxlSWRzLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQSBiYXRjaCBvZiBmaWxlcyBhdHRhY2hlZCB0byBhIHZlY3RvciBzdG9yZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZUZpbGVCYXRjaCB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHZlY3RvciBzdG9yZSBmaWxlcyBiYXRjaCB3YXNcbiAgICogY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICBmaWxlX2NvdW50czogVmVjdG9yU3RvcmVGaWxlQmF0Y2guRmlsZUNvdW50cztcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYHZlY3Rvcl9zdG9yZS5maWxlX2JhdGNoYC5cbiAgICovXG4gIG9iamVjdDogJ3ZlY3Rvcl9zdG9yZS5maWxlc19iYXRjaCc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIHZlY3RvciBzdG9yZSBmaWxlcyBiYXRjaCwgd2hpY2ggY2FuIGJlIGVpdGhlciBgaW5fcHJvZ3Jlc3NgLFxuICAgKiBgY29tcGxldGVkYCwgYGNhbmNlbGxlZGAgb3IgYGZhaWxlZGAuXG4gICAqL1xuICBzdGF0dXM6ICdpbl9wcm9ncmVzcycgfCAnY29tcGxldGVkJyB8ICdjYW5jZWxsZWQnIHwgJ2ZhaWxlZCc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGVcbiAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICogdGhhdCB0aGUgW0ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIGlzXG4gICAqIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgdmVjdG9yX3N0b3JlX2lkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVmVjdG9yU3RvcmVGaWxlQmF0Y2gge1xuICBleHBvcnQgaW50ZXJmYWNlIEZpbGVDb3VudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmlsZXMgdGhhdCB3aGVyZSBjYW5jZWxsZWQuXG4gICAgICovXG4gICAgY2FuY2VsbGVkOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAgICAgKi9cbiAgICBjb21wbGV0ZWQ6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmlsZXMgdGhhdCBoYXZlIGZhaWxlZCB0byBwcm9jZXNzLlxuICAgICAqL1xuICAgIGZhaWxlZDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmaWxlcyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqL1xuICAgIGluX3Byb2dyZXNzOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGZpbGVzLlxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXI7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlQmF0Y2hDcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogQSBsaXN0IG9mIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgdGhhdFxuICAgKiB0aGUgdmVjdG9yIHN0b3JlIHNob3VsZCB1c2UuIFVzZWZ1bCBmb3IgdG9vbHMgbGlrZSBgZmlsZV9zZWFyY2hgIHRoYXQgY2FuIGFjY2Vzc1xuICAgKiBmaWxlcy5cbiAgICovXG4gIGZpbGVfaWRzOiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVCYXRjaExpc3RGaWxlc1BhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge1xuICAvKipcbiAgICogQSBjdXJzb3IgZm9yIHVzZSBpbiBwYWdpbmF0aW9uLiBgYmVmb3JlYCBpcyBhbiBvYmplY3QgSUQgdGhhdCBkZWZpbmVzIHlvdXIgcGxhY2VcbiAgICogaW4gdGhlIGxpc3QuIEZvciBpbnN0YW5jZSwgaWYgeW91IG1ha2UgYSBsaXN0IHJlcXVlc3QgYW5kIHJlY2VpdmUgMTAwIG9iamVjdHMsXG4gICAqIGVuZGluZyB3aXRoIG9ial9mb28sIHlvdXIgc3Vic2VxdWVudCBjYWxsIGNhbiBpbmNsdWRlIGJlZm9yZT1vYmpfZm9vIGluIG9yZGVyIHRvXG4gICAqIGZldGNoIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBsaXN0LlxuICAgKi9cbiAgYmVmb3JlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgZmlsZSBzdGF0dXMuIE9uZSBvZiBgaW5fcHJvZ3Jlc3NgLCBgY29tcGxldGVkYCwgYGZhaWxlZGAsIGBjYW5jZWxsZWRgLlxuICAgKi9cbiAgZmlsdGVyPzogJ2luX3Byb2dyZXNzJyB8ICdjb21wbGV0ZWQnIHwgJ2ZhaWxlZCcgfCAnY2FuY2VsbGVkJztcblxuICAvKipcbiAgICogU29ydCBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWVzdGFtcCBvZiB0aGUgb2JqZWN0cy4gYGFzY2AgZm9yIGFzY2VuZGluZ1xuICAgKiBvcmRlciBhbmQgYGRlc2NgIGZvciBkZXNjZW5kaW5nIG9yZGVyLlxuICAgKi9cbiAgb3JkZXI/OiAnYXNjJyB8ICdkZXNjJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWxlQmF0Y2hlcyB7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVGaWxlQmF0Y2ggPSBGaWxlQmF0Y2hlc0FQSS5WZWN0b3JTdG9yZUZpbGVCYXRjaDtcbiAgZXhwb3J0IGltcG9ydCBGaWxlQmF0Y2hDcmVhdGVQYXJhbXMgPSBGaWxlQmF0Y2hlc0FQSS5GaWxlQmF0Y2hDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUJhdGNoTGlzdEZpbGVzUGFyYW1zID0gRmlsZUJhdGNoZXNBUEkuRmlsZUJhdGNoTGlzdEZpbGVzUGFyYW1zO1xufVxuXG5leHBvcnQgeyBWZWN0b3JTdG9yZUZpbGVzUGFnZSB9O1xuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uLy4uLy4uL3Jlc291cmNlJztcbmltcG9ydCB7IGlzUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCAqIGFzIFZlY3RvclN0b3Jlc0FQSSBmcm9tICcuL3ZlY3Rvci1zdG9yZXMnO1xuaW1wb3J0ICogYXMgRmlsZUJhdGNoZXNBUEkgZnJvbSAnLi9maWxlLWJhdGNoZXMnO1xuaW1wb3J0ICogYXMgRmlsZXNBUEkgZnJvbSAnLi9maWxlcyc7XG5pbXBvcnQgeyBDdXJzb3JQYWdlLCB0eXBlIEN1cnNvclBhZ2VQYXJhbXMgfSBmcm9tICcuLi8uLi8uLi9wYWdpbmF0aW9uJztcblxuZXhwb3J0IGNsYXNzIFZlY3RvclN0b3JlcyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgZmlsZXM6IEZpbGVzQVBJLkZpbGVzID0gbmV3IEZpbGVzQVBJLkZpbGVzKHRoaXMuX2NsaWVudCk7XG4gIGZpbGVCYXRjaGVzOiBGaWxlQmF0Y2hlc0FQSS5GaWxlQmF0Y2hlcyA9IG5ldyBGaWxlQmF0Y2hlc0FQSS5GaWxlQmF0Y2hlcyh0aGlzLl9jbGllbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICBjcmVhdGUoYm9keTogVmVjdG9yU3RvcmVDcmVhdGVQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFZlY3RvclN0b3JlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvdmVjdG9yX3N0b3JlcycsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICByZXRyaWV2ZSh2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFZlY3RvclN0b3JlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXQoYC92ZWN0b3Jfc3RvcmVzLyR7dmVjdG9yU3RvcmVJZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RpZmllcyBhIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIHVwZGF0ZShcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgYm9keTogVmVjdG9yU3RvcmVVcGRhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxWZWN0b3JTdG9yZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL3ZlY3Rvcl9zdG9yZXMvJHt2ZWN0b3JTdG9yZUlkfWAsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVzLlxuICAgKi9cbiAgbGlzdChcbiAgICBxdWVyeT86IFZlY3RvclN0b3JlTGlzdFBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxWZWN0b3JTdG9yZXNQYWdlLCBWZWN0b3JTdG9yZT47XG4gIGxpc3Qob3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLlBhZ2VQcm9taXNlPFZlY3RvclN0b3Jlc1BhZ2UsIFZlY3RvclN0b3JlPjtcbiAgbGlzdChcbiAgICBxdWVyeTogVmVjdG9yU3RvcmVMaXN0UGFyYW1zIHwgQ29yZS5SZXF1ZXN0T3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPFZlY3RvclN0b3Jlc1BhZ2UsIFZlY3RvclN0b3JlPiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0KHt9LCBxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0QVBJTGlzdCgnL3ZlY3Rvcl9zdG9yZXMnLCBWZWN0b3JTdG9yZXNQYWdlLCB7XG4gICAgICBxdWVyeSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIGRlbCh2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFZlY3RvclN0b3JlRGVsZXRlZD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZGVsZXRlKGAvdmVjdG9yX3N0b3Jlcy8ke3ZlY3RvclN0b3JlSWR9YCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZlY3RvclN0b3Jlc1BhZ2UgZXh0ZW5kcyBDdXJzb3JQYWdlPFZlY3RvclN0b3JlPiB7fVxuXG4vKipcbiAqIEEgdmVjdG9yIHN0b3JlIGlzIGEgY29sbGVjdGlvbiBvZiBwcm9jZXNzZWQgZmlsZXMgY2FuIGJlIHVzZWQgYnkgdGhlXG4gKiBgZmlsZV9zZWFyY2hgIHRvb2wuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmUge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSB2ZWN0b3Igc3RvcmUgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgZmlsZV9jb3VudHM6IFZlY3RvclN0b3JlLkZpbGVDb3VudHM7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHZlY3RvciBzdG9yZSB3YXMgbGFzdCBhY3RpdmUuXG4gICAqL1xuICBsYXN0X2FjdGl2ZV9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE6IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgdmVjdG9yX3N0b3JlYC5cbiAgICovXG4gIG9iamVjdDogJ3ZlY3Rvcl9zdG9yZSc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIHZlY3RvciBzdG9yZSwgd2hpY2ggY2FuIGJlIGVpdGhlciBgZXhwaXJlZGAsIGBpbl9wcm9ncmVzc2AsIG9yXG4gICAqIGBjb21wbGV0ZWRgLiBBIHN0YXR1cyBvZiBgY29tcGxldGVkYCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmVjdG9yIHN0b3JlIGlzIHJlYWR5XG4gICAqIGZvciB1c2UuXG4gICAqL1xuICBzdGF0dXM6ICdleHBpcmVkJyB8ICdpbl9wcm9ncmVzcycgfCAnY29tcGxldGVkJztcblxuICAvKipcbiAgICogVGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyB1c2VkIGJ5IHRoZSBmaWxlcyBpbiB0aGUgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgdXNhZ2VfYnl0ZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGV4cGlyYXRpb24gcG9saWN5IGZvciBhIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIGV4cGlyZXNfYWZ0ZXI/OiBWZWN0b3JTdG9yZS5FeHBpcmVzQWZ0ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHZlY3RvciBzdG9yZSB3aWxsIGV4cGlyZS5cbiAgICovXG4gIGV4cGlyZXNfYXQ/OiBudW1iZXIgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFZlY3RvclN0b3JlIHtcbiAgZXhwb3J0IGludGVyZmFjZSBGaWxlQ291bnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgd2VyZSBjYW5jZWxsZWQuXG4gICAgICovXG4gICAgY2FuY2VsbGVkOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQuXG4gICAgICovXG4gICAgY29tcGxldGVkOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgaGF2ZSBmYWlsZWQgdG8gcHJvY2Vzcy5cbiAgICAgKi9cbiAgICBmYWlsZWQ6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmlsZXMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC5cbiAgICAgKi9cbiAgICBpbl9wcm9ncmVzczogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBmaWxlcy5cbiAgICAgKi9cbiAgICB0b3RhbDogbnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBleHBpcmF0aW9uIHBvbGljeSBmb3IgYSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEV4cGlyZXNBZnRlciB7XG4gICAgLyoqXG4gICAgICogQW5jaG9yIHRpbWVzdGFtcCBhZnRlciB3aGljaCB0aGUgZXhwaXJhdGlvbiBwb2xpY3kgYXBwbGllcy4gU3VwcG9ydGVkIGFuY2hvcnM6XG4gICAgICogYGxhc3RfYWN0aXZlX2F0YC5cbiAgICAgKi9cbiAgICBhbmNob3I6ICdsYXN0X2FjdGl2ZV9hdCc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgYWZ0ZXIgdGhlIGFuY2hvciB0aW1lIHRoYXQgdGhlIHZlY3RvciBzdG9yZSB3aWxsIGV4cGlyZS5cbiAgICAgKi9cbiAgICBkYXlzOiBudW1iZXI7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZURlbGV0ZWQge1xuICBpZDogc3RyaW5nO1xuXG4gIGRlbGV0ZWQ6IGJvb2xlYW47XG5cbiAgb2JqZWN0OiAndmVjdG9yX3N0b3JlLmRlbGV0ZWQnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlY3RvclN0b3JlQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBleHBpcmF0aW9uIHBvbGljeSBmb3IgYSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICBleHBpcmVzX2FmdGVyPzogVmVjdG9yU3RvcmVDcmVhdGVQYXJhbXMuRXhwaXJlc0FmdGVyO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgW0ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyB0aGF0XG4gICAqIHRoZSB2ZWN0b3Igc3RvcmUgc2hvdWxkIHVzZS4gVXNlZnVsIGZvciB0b29scyBsaWtlIGBmaWxlX3NlYXJjaGAgdGhhdCBjYW4gYWNjZXNzXG4gICAqIGZpbGVzLlxuICAgKi9cbiAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBWZWN0b3JTdG9yZUNyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZXhwaXJhdGlvbiBwb2xpY3kgZm9yIGEgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBFeHBpcmVzQWZ0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuY2hvciB0aW1lc3RhbXAgYWZ0ZXIgd2hpY2ggdGhlIGV4cGlyYXRpb24gcG9saWN5IGFwcGxpZXMuIFN1cHBvcnRlZCBhbmNob3JzOlxuICAgICAqIGBsYXN0X2FjdGl2ZV9hdGAuXG4gICAgICovXG4gICAgYW5jaG9yOiAnbGFzdF9hY3RpdmVfYXQnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIGFmdGVyIHRoZSBhbmNob3IgdGltZSB0aGF0IHRoZSB2ZWN0b3Igc3RvcmUgd2lsbCBleHBpcmUuXG4gICAgICovXG4gICAgZGF5czogbnVtYmVyO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmVVcGRhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGV4cGlyYXRpb24gcG9saWN5IGZvciBhIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIGV4cGlyZXNfYWZ0ZXI/OiBWZWN0b3JTdG9yZVVwZGF0ZVBhcmFtcy5FeHBpcmVzQWZ0ZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgbmFtZT86IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVmVjdG9yU3RvcmVVcGRhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGV4cGlyYXRpb24gcG9saWN5IGZvciBhIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRXhwaXJlc0FmdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbmNob3IgdGltZXN0YW1wIGFmdGVyIHdoaWNoIHRoZSBleHBpcmF0aW9uIHBvbGljeSBhcHBsaWVzLiBTdXBwb3J0ZWQgYW5jaG9yczpcbiAgICAgKiBgbGFzdF9hY3RpdmVfYXRgLlxuICAgICAqL1xuICAgIGFuY2hvcjogJ2xhc3RfYWN0aXZlX2F0JztcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBhZnRlciB0aGUgYW5jaG9yIHRpbWUgdGhhdCB0aGUgdmVjdG9yIHN0b3JlIHdpbGwgZXhwaXJlLlxuICAgICAqL1xuICAgIGRheXM6IG51bWJlcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlY3RvclN0b3JlTGlzdFBhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge1xuICAvKipcbiAgICogQSBjdXJzb3IgZm9yIHVzZSBpbiBwYWdpbmF0aW9uLiBgYmVmb3JlYCBpcyBhbiBvYmplY3QgSUQgdGhhdCBkZWZpbmVzIHlvdXIgcGxhY2VcbiAgICogaW4gdGhlIGxpc3QuIEZvciBpbnN0YW5jZSwgaWYgeW91IG1ha2UgYSBsaXN0IHJlcXVlc3QgYW5kIHJlY2VpdmUgMTAwIG9iamVjdHMsXG4gICAqIGVuZGluZyB3aXRoIG9ial9mb28sIHlvdXIgc3Vic2VxdWVudCBjYWxsIGNhbiBpbmNsdWRlIGJlZm9yZT1vYmpfZm9vIGluIG9yZGVyIHRvXG4gICAqIGZldGNoIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBsaXN0LlxuICAgKi9cbiAgYmVmb3JlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTb3J0IG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIG9mIHRoZSBvYmplY3RzLiBgYXNjYCBmb3IgYXNjZW5kaW5nXG4gICAqIG9yZGVyIGFuZCBgZGVzY2AgZm9yIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqL1xuICBvcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFZlY3RvclN0b3JlcyB7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmUgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmU7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVEZWxldGVkID0gVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3JlRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZXNQYWdlID0gVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3Jlc1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVDcmVhdGVQYXJhbXMgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVVcGRhdGVQYXJhbXMgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVVcGRhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVMaXN0UGFyYW1zID0gVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3JlTGlzdFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBGaWxlcyA9IEZpbGVzQVBJLkZpbGVzO1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3JlRmlsZSA9IEZpbGVzQVBJLlZlY3RvclN0b3JlRmlsZTtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZUZpbGVEZWxldGVkID0gRmlsZXNBUEkuVmVjdG9yU3RvcmVGaWxlRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZUZpbGVzUGFnZSA9IEZpbGVzQVBJLlZlY3RvclN0b3JlRmlsZXNQYWdlO1xuICBleHBvcnQgaW1wb3J0IEZpbGVDcmVhdGVQYXJhbXMgPSBGaWxlc0FQSS5GaWxlQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEZpbGVMaXN0UGFyYW1zID0gRmlsZXNBUEkuRmlsZUxpc3RQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUJhdGNoZXMgPSBGaWxlQmF0Y2hlc0FQSS5GaWxlQmF0Y2hlcztcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZUZpbGVCYXRjaCA9IEZpbGVCYXRjaGVzQVBJLlZlY3RvclN0b3JlRmlsZUJhdGNoO1xuICBleHBvcnQgaW1wb3J0IEZpbGVCYXRjaENyZWF0ZVBhcmFtcyA9IEZpbGVCYXRjaGVzQVBJLkZpbGVCYXRjaENyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBGaWxlQmF0Y2hMaXN0RmlsZXNQYXJhbXMgPSBGaWxlQmF0Y2hlc0FQSS5GaWxlQmF0Y2hMaXN0RmlsZXNQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tICcuLi8uLi9yZXNvdXJjZSc7XG5pbXBvcnQgKiBhcyBBc3Npc3RhbnRzQVBJIGZyb20gJy4vYXNzaXN0YW50cyc7XG5pbXBvcnQgKiBhcyBDaGF0QVBJIGZyb20gJy4vY2hhdC9jaGF0JztcbmltcG9ydCAqIGFzIFRocmVhZHNBUEkgZnJvbSAnLi90aHJlYWRzL3RocmVhZHMnO1xuaW1wb3J0ICogYXMgVmVjdG9yU3RvcmVzQVBJIGZyb20gJy4vdmVjdG9yLXN0b3Jlcy92ZWN0b3Itc3RvcmVzJztcblxuZXhwb3J0IGNsYXNzIEJldGEgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIHZlY3RvclN0b3JlczogVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3JlcyA9IG5ldyBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVzKHRoaXMuX2NsaWVudCk7XG4gIGNoYXQ6IENoYXRBUEkuQ2hhdCA9IG5ldyBDaGF0QVBJLkNoYXQodGhpcy5fY2xpZW50KTtcbiAgYXNzaXN0YW50czogQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRzID0gbmV3IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50cyh0aGlzLl9jbGllbnQpO1xuICB0aHJlYWRzOiBUaHJlYWRzQVBJLlRocmVhZHMgPSBuZXcgVGhyZWFkc0FQSS5UaHJlYWRzKHRoaXMuX2NsaWVudCk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQmV0YSB7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVzID0gVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3JlcztcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZSA9IFZlY3RvclN0b3Jlc0FQSS5WZWN0b3JTdG9yZTtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZURlbGV0ZWQgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVEZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3Jlc1BhZ2UgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZUNyZWF0ZVBhcmFtcyA9IFZlY3RvclN0b3Jlc0FQSS5WZWN0b3JTdG9yZUNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZVVwZGF0ZVBhcmFtcyA9IFZlY3RvclN0b3Jlc0FQSS5WZWN0b3JTdG9yZVVwZGF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZUxpc3RQYXJhbXMgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVMaXN0UGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IENoYXQgPSBDaGF0QVBJLkNoYXQ7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50cyA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50cztcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnQgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudDtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnREZWxldGVkID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnREZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFN0cmVhbUV2ZW50ID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRTdHJlYW1FdmVudDtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRUb29sID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRUb29sO1xuICBleHBvcnQgaW1wb3J0IENvZGVJbnRlcnByZXRlclRvb2wgPSBBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2w7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZVNlYXJjaFRvb2wgPSBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sO1xuICBleHBvcnQgaW1wb3J0IEZ1bmN0aW9uVG9vbCA9IEFzc2lzdGFudHNBUEkuRnVuY3Rpb25Ub29sO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VTdHJlYW1FdmVudCA9IEFzc2lzdGFudHNBUEkuTWVzc2FnZVN0cmVhbUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IFJ1blN0ZXBTdHJlYW1FdmVudCA9IEFzc2lzdGFudHNBUEkuUnVuU3RlcFN0cmVhbUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IFJ1blN0cmVhbUV2ZW50ID0gQXNzaXN0YW50c0FQSS5SdW5TdHJlYW1FdmVudDtcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRTdHJlYW1FdmVudCA9IEFzc2lzdGFudHNBUEkuVGhyZWFkU3RyZWFtRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50c1BhZ2UgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudHNQYWdlO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudENyZWF0ZVBhcmFtcyA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50Q3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFVwZGF0ZVBhcmFtcyA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50VXBkYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudExpc3RQYXJhbXMgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudExpc3RQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkcyA9IFRocmVhZHNBUEkuVGhyZWFkcztcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRSZXNwb25zZUZvcm1hdCA9IFRocmVhZHNBUEkuQXNzaXN0YW50UmVzcG9uc2VGb3JtYXQ7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb24gPSBUaHJlYWRzQVBJLkFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFRvb2xDaG9pY2UgPSBUaHJlYWRzQVBJLkFzc2lzdGFudFRvb2xDaG9pY2U7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50VG9vbENob2ljZUZ1bmN0aW9uID0gVGhyZWFkc0FQSS5Bc3Npc3RhbnRUb29sQ2hvaWNlRnVuY3Rpb247XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50VG9vbENob2ljZU9wdGlvbiA9IFRocmVhZHNBUEkuQXNzaXN0YW50VG9vbENob2ljZU9wdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWQgPSBUaHJlYWRzQVBJLlRocmVhZDtcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWREZWxldGVkID0gVGhyZWFkc0FQSS5UaHJlYWREZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZENyZWF0ZVBhcmFtcyA9IFRocmVhZHNBUEkuVGhyZWFkQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZFVwZGF0ZVBhcmFtcyA9IFRocmVhZHNBUEkuVGhyZWFkVXBkYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtcyA9IFRocmVhZHNBUEkuVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc05vblN0cmVhbWluZyA9IFRocmVhZHNBUEkuVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc1N0cmVhbWluZyA9IFRocmVhZHNBUEkuVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZENyZWF0ZUFuZFJ1blBvbGxQYXJhbXMgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blBvbGxQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkQ3JlYXRlQW5kUnVuU3RyZWFtUGFyYW1zID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVBbmRSdW5TdHJlYW1QYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7IEFQSVByb21pc2UgfSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vcmVzb3VyY2UnO1xuaW1wb3J0ICogYXMgQ29tcGxldGlvbnNBUEkgZnJvbSAnLi9jb21wbGV0aW9ucyc7XG5pbXBvcnQgKiBhcyBDaGF0Q29tcGxldGlvbnNBUEkgZnJvbSAnLi9jaGF0L2NvbXBsZXRpb25zJztcbmltcG9ydCB7IFN0cmVhbSB9IGZyb20gJy4uL3N0cmVhbWluZyc7XG5cbmV4cG9ydCBjbGFzcyBDb21wbGV0aW9ucyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb21wbGV0aW9uIGZvciB0aGUgcHJvdmlkZWQgcHJvbXB0IGFuZCBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgY3JlYXRlKGJvZHk6IENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQVBJUHJvbWlzZTxDb21wbGV0aW9uPjtcbiAgY3JlYXRlKFxuICAgIGJvZHk6IENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8U3RyZWFtPENvbXBsZXRpb24+PjtcbiAgY3JlYXRlKFxuICAgIGJvZHk6IENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFN0cmVhbTxDb21wbGV0aW9uPiB8IENvbXBsZXRpb24+O1xuICBjcmVhdGUoXG4gICAgYm9keTogQ29tcGxldGlvbkNyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxDb21wbGV0aW9uPiB8IEFQSVByb21pc2U8U3RyZWFtPENvbXBsZXRpb24+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvY29tcGxldGlvbnMnLCB7IGJvZHksIC4uLm9wdGlvbnMsIHN0cmVhbTogYm9keS5zdHJlYW0gPz8gZmFsc2UgfSkgYXNcbiAgICAgIHwgQVBJUHJvbWlzZTxDb21wbGV0aW9uPlxuICAgICAgfCBBUElQcm9taXNlPFN0cmVhbTxDb21wbGV0aW9uPj47XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY29tcGxldGlvbiByZXNwb25zZSBmcm9tIHRoZSBBUEkuIE5vdGU6IGJvdGggdGhlIHN0cmVhbWVkIGFuZFxuICogbm9uLXN0cmVhbWVkIHJlc3BvbnNlIG9iamVjdHMgc2hhcmUgdGhlIHNhbWUgc2hhcGUgKHVubGlrZSB0aGUgY2hhdCBlbmRwb2ludCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGlvbiB7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY29tcGxldGlvbi5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGNvbXBsZXRpb24gY2hvaWNlcyB0aGUgbW9kZWwgZ2VuZXJhdGVkIGZvciB0aGUgaW5wdXQgcHJvbXB0LlxuICAgKi9cbiAgY2hvaWNlczogQXJyYXk8Q29tcGxldGlvbkNob2ljZT47XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgb2Ygd2hlbiB0aGUgY29tcGxldGlvbiB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1vZGVsIHVzZWQgZm9yIGNvbXBsZXRpb24uXG4gICAqL1xuICBtb2RlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBcInRleHRfY29tcGxldGlvblwiXG4gICAqL1xuICBvYmplY3Q6ICd0ZXh0X2NvbXBsZXRpb24nO1xuXG4gIC8qKlxuICAgKiBUaGlzIGZpbmdlcnByaW50IHJlcHJlc2VudHMgdGhlIGJhY2tlbmQgY29uZmlndXJhdGlvbiB0aGF0IHRoZSBtb2RlbCBydW5zIHdpdGguXG4gICAqXG4gICAqIENhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGBzZWVkYCByZXF1ZXN0IHBhcmFtZXRlciB0byB1bmRlcnN0YW5kIHdoZW5cbiAgICogYmFja2VuZCBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRoYXQgbWlnaHQgaW1wYWN0IGRldGVybWluaXNtLlxuICAgKi9cbiAgc3lzdGVtX2ZpbmdlcnByaW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVc2FnZSBzdGF0aXN0aWNzIGZvciB0aGUgY29tcGxldGlvbiByZXF1ZXN0LlxuICAgKi9cbiAgdXNhZ2U/OiBDb21wbGV0aW9uVXNhZ2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGlvbkNob2ljZSB7XG4gIC8qKlxuICAgKiBUaGUgcmVhc29uIHRoZSBtb2RlbCBzdG9wcGVkIGdlbmVyYXRpbmcgdG9rZW5zLiBUaGlzIHdpbGwgYmUgYHN0b3BgIGlmIHRoZSBtb2RlbFxuICAgKiBoaXQgYSBuYXR1cmFsIHN0b3AgcG9pbnQgb3IgYSBwcm92aWRlZCBzdG9wIHNlcXVlbmNlLCBgbGVuZ3RoYCBpZiB0aGUgbWF4aW11bVxuICAgKiBudW1iZXIgb2YgdG9rZW5zIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3YXMgcmVhY2hlZCwgb3IgYGNvbnRlbnRfZmlsdGVyYCBpZlxuICAgKiBjb250ZW50IHdhcyBvbWl0dGVkIGR1ZSB0byBhIGZsYWcgZnJvbSBvdXIgY29udGVudCBmaWx0ZXJzLlxuICAgKi9cbiAgZmluaXNoX3JlYXNvbjogJ3N0b3AnIHwgJ2xlbmd0aCcgfCAnY29udGVudF9maWx0ZXInO1xuXG4gIGluZGV4OiBudW1iZXI7XG5cbiAgbG9ncHJvYnM6IENvbXBsZXRpb25DaG9pY2UuTG9ncHJvYnMgfCBudWxsO1xuXG4gIHRleHQ6IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDb21wbGV0aW9uQ2hvaWNlIHtcbiAgZXhwb3J0IGludGVyZmFjZSBMb2dwcm9icyB7XG4gICAgdGV4dF9vZmZzZXQ/OiBBcnJheTxudW1iZXI+O1xuXG4gICAgdG9rZW5fbG9ncHJvYnM/OiBBcnJheTxudW1iZXI+O1xuXG4gICAgdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcblxuICAgIHRvcF9sb2dwcm9icz86IEFycmF5PFJlY29yZDxzdHJpbmcsIG51bWJlcj4+O1xuICB9XG59XG5cbi8qKlxuICogVXNhZ2Ugc3RhdGlzdGljcyBmb3IgdGhlIGNvbXBsZXRpb24gcmVxdWVzdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wbGV0aW9uVXNhZ2Uge1xuICAvKipcbiAgICogTnVtYmVyIG9mIHRva2VucyBpbiB0aGUgZ2VuZXJhdGVkIGNvbXBsZXRpb24uXG4gICAqL1xuICBjb21wbGV0aW9uX3Rva2VuczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgdG9rZW5zIGluIHRoZSBwcm9tcHQuXG4gICAqL1xuICBwcm9tcHRfdG9rZW5zOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRvdGFsIG51bWJlciBvZiB0b2tlbnMgdXNlZCBpbiB0aGUgcmVxdWVzdCAocHJvbXB0ICsgY29tcGxldGlvbikuXG4gICAqL1xuICB0b3RhbF90b2tlbnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgQ29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9IENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgfCBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIElEIG9mIHRoZSBtb2RlbCB0byB1c2UuIFlvdSBjYW4gdXNlIHRoZVxuICAgKiBbTGlzdCBtb2RlbHNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzL2xpc3QpIEFQSSB0b1xuICAgKiBzZWUgYWxsIG9mIHlvdXIgYXZhaWxhYmxlIG1vZGVscywgb3Igc2VlIG91clxuICAgKiBbTW9kZWwgb3ZlcnZpZXddKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9vdmVydmlldykgZm9yXG4gICAqIGRlc2NyaXB0aW9ucyBvZiB0aGVtLlxuICAgKi9cbiAgbW9kZWw6IChzdHJpbmcgJiB7fSkgfCAnZ3B0LTMuNS10dXJiby1pbnN0cnVjdCcgfCAnZGF2aW5jaS0wMDInIHwgJ2JhYmJhZ2UtMDAyJztcblxuICAvKipcbiAgICogVGhlIHByb21wdChzKSB0byBnZW5lcmF0ZSBjb21wbGV0aW9ucyBmb3IsIGVuY29kZWQgYXMgYSBzdHJpbmcsIGFycmF5IG9mXG4gICAqIHN0cmluZ3MsIGFycmF5IG9mIHRva2Vucywgb3IgYXJyYXkgb2YgdG9rZW4gYXJyYXlzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgPHxlbmRvZnRleHR8PiBpcyB0aGUgZG9jdW1lbnQgc2VwYXJhdG9yIHRoYXQgdGhlIG1vZGVsIHNlZXMgZHVyaW5nXG4gICAqIHRyYWluaW5nLCBzbyBpZiBhIHByb21wdCBpcyBub3Qgc3BlY2lmaWVkIHRoZSBtb2RlbCB3aWxsIGdlbmVyYXRlIGFzIGlmIGZyb20gdGhlXG4gICAqIGJlZ2lubmluZyBvZiBhIG5ldyBkb2N1bWVudC5cbiAgICovXG4gIHByb21wdDogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPiB8IEFycmF5PG51bWJlcj4gfCBBcnJheTxBcnJheTxudW1iZXI+PiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBgYmVzdF9vZmAgY29tcGxldGlvbnMgc2VydmVyLXNpZGUgYW5kIHJldHVybnMgdGhlIFwiYmVzdFwiICh0aGUgb25lIHdpdGhcbiAgICogdGhlIGhpZ2hlc3QgbG9nIHByb2JhYmlsaXR5IHBlciB0b2tlbikuIFJlc3VsdHMgY2Fubm90IGJlIHN0cmVhbWVkLlxuICAgKlxuICAgKiBXaGVuIHVzZWQgd2l0aCBgbmAsIGBiZXN0X29mYCBjb250cm9scyB0aGUgbnVtYmVyIG9mIGNhbmRpZGF0ZSBjb21wbGV0aW9ucyBhbmRcbiAgICogYG5gIHNwZWNpZmllcyBob3cgbWFueSB0byByZXR1cm4gXHUyMDEzIGBiZXN0X29mYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBgbmAuXG4gICAqXG4gICAqICoqTm90ZToqKiBCZWNhdXNlIHRoaXMgcGFyYW1ldGVyIGdlbmVyYXRlcyBtYW55IGNvbXBsZXRpb25zLCBpdCBjYW4gcXVpY2tseVxuICAgKiBjb25zdW1lIHlvdXIgdG9rZW4gcXVvdGEuIFVzZSBjYXJlZnVsbHkgYW5kIGVuc3VyZSB0aGF0IHlvdSBoYXZlIHJlYXNvbmFibGVcbiAgICogc2V0dGluZ3MgZm9yIGBtYXhfdG9rZW5zYCBhbmQgYHN0b3BgLlxuICAgKi9cbiAgYmVzdF9vZj86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEVjaG8gYmFjayB0aGUgcHJvbXB0IGluIGFkZGl0aW9uIHRvIHRoZSBjb21wbGV0aW9uXG4gICAqL1xuICBlY2hvPzogYm9vbGVhbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE51bWJlciBiZXR3ZWVuIC0yLjAgYW5kIDIuMC4gUG9zaXRpdmUgdmFsdWVzIHBlbmFsaXplIG5ldyB0b2tlbnMgYmFzZWQgb24gdGhlaXJcbiAgICogZXhpc3RpbmcgZnJlcXVlbmN5IGluIHRoZSB0ZXh0IHNvIGZhciwgZGVjcmVhc2luZyB0aGUgbW9kZWwncyBsaWtlbGlob29kIHRvXG4gICAqIHJlcGVhdCB0aGUgc2FtZSBsaW5lIHZlcmJhdGltLlxuICAgKlxuICAgKiBbU2VlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZnJlcXVlbmN5IGFuZCBwcmVzZW5jZSBwZW5hbHRpZXMuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvdGV4dC1nZW5lcmF0aW9uL3BhcmFtZXRlci1kZXRhaWxzKVxuICAgKi9cbiAgZnJlcXVlbmN5X3BlbmFsdHk/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBNb2RpZnkgdGhlIGxpa2VsaWhvb2Qgb2Ygc3BlY2lmaWVkIHRva2VucyBhcHBlYXJpbmcgaW4gdGhlIGNvbXBsZXRpb24uXG4gICAqXG4gICAqIEFjY2VwdHMgYSBKU09OIG9iamVjdCB0aGF0IG1hcHMgdG9rZW5zIChzcGVjaWZpZWQgYnkgdGhlaXIgdG9rZW4gSUQgaW4gdGhlIEdQVFxuICAgKiB0b2tlbml6ZXIpIHRvIGFuIGFzc29jaWF0ZWQgYmlhcyB2YWx1ZSBmcm9tIC0xMDAgdG8gMTAwLiBZb3UgY2FuIHVzZSB0aGlzXG4gICAqIFt0b2tlbml6ZXIgdG9vbF0oL3Rva2VuaXplcj92aWV3PWJwZSkgdG8gY29udmVydCB0ZXh0IHRvIHRva2VuIElEcy5cbiAgICogTWF0aGVtYXRpY2FsbHksIHRoZSBiaWFzIGlzIGFkZGVkIHRvIHRoZSBsb2dpdHMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbCBwcmlvciB0b1xuICAgKiBzYW1wbGluZy4gVGhlIGV4YWN0IGVmZmVjdCB3aWxsIHZhcnkgcGVyIG1vZGVsLCBidXQgdmFsdWVzIGJldHdlZW4gLTEgYW5kIDFcbiAgICogc2hvdWxkIGRlY3JlYXNlIG9yIGluY3JlYXNlIGxpa2VsaWhvb2Qgb2Ygc2VsZWN0aW9uOyB2YWx1ZXMgbGlrZSAtMTAwIG9yIDEwMFxuICAgKiBzaG91bGQgcmVzdWx0IGluIGEgYmFuIG9yIGV4Y2x1c2l2ZSBzZWxlY3Rpb24gb2YgdGhlIHJlbGV2YW50IHRva2VuLlxuICAgKlxuICAgKiBBcyBhbiBleGFtcGxlLCB5b3UgY2FuIHBhc3MgYHtcIjUwMjU2XCI6IC0xMDB9YCB0byBwcmV2ZW50IHRoZSA8fGVuZG9mdGV4dHw+IHRva2VuXG4gICAqIGZyb20gYmVpbmcgZ2VuZXJhdGVkLlxuICAgKi9cbiAgbG9naXRfYmlhcz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBJbmNsdWRlIHRoZSBsb2cgcHJvYmFiaWxpdGllcyBvbiB0aGUgYGxvZ3Byb2JzYCBtb3N0IGxpa2VseSBvdXRwdXQgdG9rZW5zLCBhc1xuICAgKiB3ZWxsIHRoZSBjaG9zZW4gdG9rZW5zLiBGb3IgZXhhbXBsZSwgaWYgYGxvZ3Byb2JzYCBpcyA1LCB0aGUgQVBJIHdpbGwgcmV0dXJuIGFcbiAgICogbGlzdCBvZiB0aGUgNSBtb3N0IGxpa2VseSB0b2tlbnMuIFRoZSBBUEkgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBgbG9ncHJvYmAgb2ZcbiAgICogdGhlIHNhbXBsZWQgdG9rZW4sIHNvIHRoZXJlIG1heSBiZSB1cCB0byBgbG9ncHJvYnMrMWAgZWxlbWVudHMgaW4gdGhlIHJlc3BvbnNlLlxuICAgKlxuICAgKiBUaGUgbWF4aW11bSB2YWx1ZSBmb3IgYGxvZ3Byb2JzYCBpcyA1LlxuICAgKi9cbiAgbG9ncHJvYnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgW3Rva2Vuc10oL3Rva2VuaXplcikgdGhhdCBjYW4gYmUgZ2VuZXJhdGVkIGluIHRoZVxuICAgKiBjb21wbGV0aW9uLlxuICAgKlxuICAgKiBUaGUgdG9rZW4gY291bnQgb2YgeW91ciBwcm9tcHQgcGx1cyBgbWF4X3Rva2Vuc2AgY2Fubm90IGV4Y2VlZCB0aGUgbW9kZWwnc1xuICAgKiBjb250ZXh0IGxlbmd0aC5cbiAgICogW0V4YW1wbGUgUHl0aG9uIGNvZGVdKGh0dHBzOi8vY29va2Jvb2sub3BlbmFpLmNvbS9leGFtcGxlcy9ob3dfdG9fY291bnRfdG9rZW5zX3dpdGhfdGlrdG9rZW4pXG4gICAqIGZvciBjb3VudGluZyB0b2tlbnMuXG4gICAqL1xuICBtYXhfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogSG93IG1hbnkgY29tcGxldGlvbnMgdG8gZ2VuZXJhdGUgZm9yIGVhY2ggcHJvbXB0LlxuICAgKlxuICAgKiAqKk5vdGU6KiogQmVjYXVzZSB0aGlzIHBhcmFtZXRlciBnZW5lcmF0ZXMgbWFueSBjb21wbGV0aW9ucywgaXQgY2FuIHF1aWNrbHlcbiAgICogY29uc3VtZSB5b3VyIHRva2VuIHF1b3RhLiBVc2UgY2FyZWZ1bGx5IGFuZCBlbnN1cmUgdGhhdCB5b3UgaGF2ZSByZWFzb25hYmxlXG4gICAqIHNldHRpbmdzIGZvciBgbWF4X3Rva2Vuc2AgYW5kIGBzdG9wYC5cbiAgICovXG4gIG4/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgYmV0d2VlbiAtMi4wIGFuZCAyLjAuIFBvc2l0aXZlIHZhbHVlcyBwZW5hbGl6ZSBuZXcgdG9rZW5zIGJhc2VkIG9uXG4gICAqIHdoZXRoZXIgdGhleSBhcHBlYXIgaW4gdGhlIHRleHQgc28gZmFyLCBpbmNyZWFzaW5nIHRoZSBtb2RlbCdzIGxpa2VsaWhvb2QgdG9cbiAgICogdGFsayBhYm91dCBuZXcgdG9waWNzLlxuICAgKlxuICAgKiBbU2VlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZnJlcXVlbmN5IGFuZCBwcmVzZW5jZSBwZW5hbHRpZXMuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvdGV4dC1nZW5lcmF0aW9uL3BhcmFtZXRlci1kZXRhaWxzKVxuICAgKi9cbiAgcHJlc2VuY2VfcGVuYWx0eT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIElmIHNwZWNpZmllZCwgb3VyIHN5c3RlbSB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byBzYW1wbGUgZGV0ZXJtaW5pc3RpY2FsbHksXG4gICAqIHN1Y2ggdGhhdCByZXBlYXRlZCByZXF1ZXN0cyB3aXRoIHRoZSBzYW1lIGBzZWVkYCBhbmQgcGFyYW1ldGVycyBzaG91bGQgcmV0dXJuXG4gICAqIHRoZSBzYW1lIHJlc3VsdC5cbiAgICpcbiAgICogRGV0ZXJtaW5pc20gaXMgbm90IGd1YXJhbnRlZWQsIGFuZCB5b3Ugc2hvdWxkIHJlZmVyIHRvIHRoZSBgc3lzdGVtX2ZpbmdlcnByaW50YFxuICAgKiByZXNwb25zZSBwYXJhbWV0ZXIgdG8gbW9uaXRvciBjaGFuZ2VzIGluIHRoZSBiYWNrZW5kLlxuICAgKi9cbiAgc2VlZD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFVwIHRvIDQgc2VxdWVuY2VzIHdoZXJlIHRoZSBBUEkgd2lsbCBzdG9wIGdlbmVyYXRpbmcgZnVydGhlciB0b2tlbnMuIFRoZVxuICAgKiByZXR1cm5lZCB0ZXh0IHdpbGwgbm90IGNvbnRhaW4gdGhlIHN0b3Agc2VxdWVuY2UuXG4gICAqL1xuICBzdG9wPzogc3RyaW5nIHwgbnVsbCB8IEFycmF5PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RyZWFtIGJhY2sgcGFydGlhbCBwcm9ncmVzcy4gSWYgc2V0LCB0b2tlbnMgd2lsbCBiZSBzZW50IGFzXG4gICAqIGRhdGEtb25seVxuICAgKiBbc2VydmVyLXNlbnQgZXZlbnRzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2VydmVyLXNlbnRfZXZlbnRzL1VzaW5nX3NlcnZlci1zZW50X2V2ZW50cyNFdmVudF9zdHJlYW1fZm9ybWF0KVxuICAgKiBhcyB0aGV5IGJlY29tZSBhdmFpbGFibGUsIHdpdGggdGhlIHN0cmVhbSB0ZXJtaW5hdGVkIGJ5IGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICogW0V4YW1wbGUgUHl0aG9uIGNvZGVdKGh0dHBzOi8vY29va2Jvb2sub3BlbmFpLmNvbS9leGFtcGxlcy9ob3dfdG9fc3RyZWFtX2NvbXBsZXRpb25zKS5cbiAgICovXG4gIHN0cmVhbT86IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciBzdHJlYW1pbmcgcmVzcG9uc2UuIE9ubHkgc2V0IHRoaXMgd2hlbiB5b3Ugc2V0IGBzdHJlYW06IHRydWVgLlxuICAgKi9cbiAgc3RyZWFtX29wdGlvbnM/OiBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25TdHJlYW1PcHRpb25zIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHN1ZmZpeCB0aGF0IGNvbWVzIGFmdGVyIGEgY29tcGxldGlvbiBvZiBpbnNlcnRlZCB0ZXh0LlxuICAgKlxuICAgKiBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgYGdwdC0zLjUtdHVyYm8taW5zdHJ1Y3RgLlxuICAgKi9cbiAgc3VmZml4Pzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hhdCBzYW1wbGluZyB0ZW1wZXJhdHVyZSB0byB1c2UsIGJldHdlZW4gMCBhbmQgMi4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsXG4gICAqIG1ha2UgdGhlIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlXG4gICAqIGZvY3VzZWQgYW5kIGRldGVybWluaXN0aWMuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciBgdG9wX3BgIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQW4gYWx0ZXJuYXRpdmUgdG8gc2FtcGxpbmcgd2l0aCB0ZW1wZXJhdHVyZSwgY2FsbGVkIG51Y2xldXMgc2FtcGxpbmcsIHdoZXJlIHRoZVxuICAgKiBtb2RlbCBjb25zaWRlcnMgdGhlIHJlc3VsdHMgb2YgdGhlIHRva2VucyB3aXRoIHRvcF9wIHByb2JhYmlsaXR5IG1hc3MuIFNvIDAuMVxuICAgKiBtZWFucyBvbmx5IHRoZSB0b2tlbnMgY29tcHJpc2luZyB0aGUgdG9wIDEwJSBwcm9iYWJpbGl0eSBtYXNzIGFyZSBjb25zaWRlcmVkLlxuICAgKlxuICAgKiBXZSBnZW5lcmFsbHkgcmVjb21tZW5kIGFsdGVyaW5nIHRoaXMgb3IgYHRlbXBlcmF0dXJlYCBidXQgbm90IGJvdGguXG4gICAqL1xuICB0b3BfcD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgcmVwcmVzZW50aW5nIHlvdXIgZW5kLXVzZXIsIHdoaWNoIGNhbiBoZWxwIE9wZW5BSSB0byBtb25pdG9yXG4gICAqIGFuZCBkZXRlY3QgYWJ1c2UuXG4gICAqIFtMZWFybiBtb3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvc2FmZXR5LWJlc3QtcHJhY3RpY2VzL2VuZC11c2VyLWlkcykuXG4gICAqL1xuICB1c2VyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENvbXBsZXRpb25DcmVhdGVQYXJhbXMge1xuICBleHBvcnQgdHlwZSBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nID0gQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IHR5cGUgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyBleHRlbmRzIENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RyZWFtIGJhY2sgcGFydGlhbCBwcm9ncmVzcy4gSWYgc2V0LCB0b2tlbnMgd2lsbCBiZSBzZW50IGFzXG4gICAqIGRhdGEtb25seVxuICAgKiBbc2VydmVyLXNlbnQgZXZlbnRzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2VydmVyLXNlbnRfZXZlbnRzL1VzaW5nX3NlcnZlci1zZW50X2V2ZW50cyNFdmVudF9zdHJlYW1fZm9ybWF0KVxuICAgKiBhcyB0aGV5IGJlY29tZSBhdmFpbGFibGUsIHdpdGggdGhlIHN0cmVhbSB0ZXJtaW5hdGVkIGJ5IGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICogW0V4YW1wbGUgUHl0aG9uIGNvZGVdKGh0dHBzOi8vY29va2Jvb2sub3BlbmFpLmNvbS9leGFtcGxlcy9ob3dfdG9fc3RyZWFtX2NvbXBsZXRpb25zKS5cbiAgICovXG4gIHN0cmVhbT86IGZhbHNlIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nIGV4dGVuZHMgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogV2hldGhlciB0byBzdHJlYW0gYmFjayBwYXJ0aWFsIHByb2dyZXNzLiBJZiBzZXQsIHRva2VucyB3aWxsIGJlIHNlbnQgYXNcbiAgICogZGF0YS1vbmx5XG4gICAqIFtzZXJ2ZXItc2VudCBldmVudHNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9TZXJ2ZXItc2VudF9ldmVudHMvVXNpbmdfc2VydmVyLXNlbnRfZXZlbnRzI0V2ZW50X3N0cmVhbV9mb3JtYXQpXG4gICAqIGFzIHRoZXkgYmVjb21lIGF2YWlsYWJsZSwgd2l0aCB0aGUgc3RyZWFtIHRlcm1pbmF0ZWQgYnkgYSBgZGF0YTogW0RPTkVdYFxuICAgKiBtZXNzYWdlLlxuICAgKiBbRXhhbXBsZSBQeXRob24gY29kZV0oaHR0cHM6Ly9jb29rYm9vay5vcGVuYWkuY29tL2V4YW1wbGVzL2hvd190b19zdHJlYW1fY29tcGxldGlvbnMpLlxuICAgKi9cbiAgc3RyZWFtOiB0cnVlO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENvbXBsZXRpb25zIHtcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uID0gQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uQ2hvaWNlID0gQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbkNob2ljZTtcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uVXNhZ2UgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uVXNhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vcmVzb3VyY2UnO1xuaW1wb3J0ICogYXMgRW1iZWRkaW5nc0FQSSBmcm9tICcuL2VtYmVkZGluZ3MnO1xuXG5leHBvcnQgY2xhc3MgRW1iZWRkaW5ncyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gZW1iZWRkaW5nIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIGlucHV0IHRleHQuXG4gICAqL1xuICBjcmVhdGUoXG4gICAgYm9keTogRW1iZWRkaW5nQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8Q3JlYXRlRW1iZWRkaW5nUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9lbWJlZGRpbmdzJywgeyBib2R5LCAuLi5vcHRpb25zIH0pO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRW1iZWRkaW5nUmVzcG9uc2Uge1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgZW1iZWRkaW5ncyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsLlxuICAgKi9cbiAgZGF0YTogQXJyYXk8RW1iZWRkaW5nPjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG1vZGVsIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGVtYmVkZGluZy5cbiAgICovXG4gIG1vZGVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIFwibGlzdFwiLlxuICAgKi9cbiAgb2JqZWN0OiAnbGlzdCc7XG5cbiAgLyoqXG4gICAqIFRoZSB1c2FnZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlcXVlc3QuXG4gICAqL1xuICB1c2FnZTogQ3JlYXRlRW1iZWRkaW5nUmVzcG9uc2UuVXNhZ2U7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ3JlYXRlRW1iZWRkaW5nUmVzcG9uc2Uge1xuICAvKipcbiAgICogVGhlIHVzYWdlIGluZm9ybWF0aW9uIGZvciB0aGUgcmVxdWVzdC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVXNhZ2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdG9rZW5zIHVzZWQgYnkgdGhlIHByb21wdC5cbiAgICAgKi9cbiAgICBwcm9tcHRfdG9rZW5zOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRva2VucyB1c2VkIGJ5IHRoZSByZXF1ZXN0LlxuICAgICAqL1xuICAgIHRvdGFsX3Rva2VuczogbnVtYmVyO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBlbWJlZGRpbmcgdmVjdG9yIHJldHVybmVkIGJ5IGVtYmVkZGluZyBlbmRwb2ludC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRpbmcge1xuICAvKipcbiAgICogVGhlIGVtYmVkZGluZyB2ZWN0b3IsIHdoaWNoIGlzIGEgbGlzdCBvZiBmbG9hdHMuIFRoZSBsZW5ndGggb2YgdmVjdG9yIGRlcGVuZHMgb25cbiAgICogdGhlIG1vZGVsIGFzIGxpc3RlZCBpbiB0aGVcbiAgICogW2VtYmVkZGluZyBndWlkZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL2VtYmVkZGluZ3MpLlxuICAgKi9cbiAgZW1iZWRkaW5nOiBBcnJheTxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgdGhlIGVtYmVkZGluZyBpbiB0aGUgbGlzdCBvZiBlbWJlZGRpbmdzLlxuICAgKi9cbiAgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgXCJlbWJlZGRpbmdcIi5cbiAgICovXG4gIG9iamVjdDogJ2VtYmVkZGluZyc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1iZWRkaW5nQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIElucHV0IHRleHQgdG8gZW1iZWQsIGVuY29kZWQgYXMgYSBzdHJpbmcgb3IgYXJyYXkgb2YgdG9rZW5zLiBUbyBlbWJlZCBtdWx0aXBsZVxuICAgKiBpbnB1dHMgaW4gYSBzaW5nbGUgcmVxdWVzdCwgcGFzcyBhbiBhcnJheSBvZiBzdHJpbmdzIG9yIGFycmF5IG9mIHRva2VuIGFycmF5cy5cbiAgICogVGhlIGlucHV0IG11c3Qgbm90IGV4Y2VlZCB0aGUgbWF4IGlucHV0IHRva2VucyBmb3IgdGhlIG1vZGVsICg4MTkyIHRva2VucyBmb3JcbiAgICogYHRleHQtZW1iZWRkaW5nLWFkYS0wMDJgKSwgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZywgYW5kIGFueSBhcnJheSBtdXN0IGJlIDIwNDhcbiAgICogZGltZW5zaW9ucyBvciBsZXNzLlxuICAgKiBbRXhhbXBsZSBQeXRob24gY29kZV0oaHR0cHM6Ly9jb29rYm9vay5vcGVuYWkuY29tL2V4YW1wbGVzL2hvd190b19jb3VudF90b2tlbnNfd2l0aF90aWt0b2tlbilcbiAgICogZm9yIGNvdW50aW5nIHRva2Vucy5cbiAgICovXG4gIGlucHV0OiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+IHwgQXJyYXk8bnVtYmVyPiB8IEFycmF5PEFycmF5PG51bWJlcj4+O1xuXG4gIC8qKlxuICAgKiBJRCBvZiB0aGUgbW9kZWwgdG8gdXNlLiBZb3UgY2FuIHVzZSB0aGVcbiAgICogW0xpc3QgbW9kZWxzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21vZGVscy9saXN0KSBBUEkgdG9cbiAgICogc2VlIGFsbCBvZiB5b3VyIGF2YWlsYWJsZSBtb2RlbHMsIG9yIHNlZSBvdXJcbiAgICogW01vZGVsIG92ZXJ2aWV3XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvb3ZlcnZpZXcpIGZvclxuICAgKiBkZXNjcmlwdGlvbnMgb2YgdGhlbS5cbiAgICovXG4gIG1vZGVsOiAoc3RyaW5nICYge30pIHwgJ3RleHQtZW1iZWRkaW5nLWFkYS0wMDInIHwgJ3RleHQtZW1iZWRkaW5nLTMtc21hbGwnIHwgJ3RleHQtZW1iZWRkaW5nLTMtbGFyZ2UnO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgdGhlIHJlc3VsdGluZyBvdXRwdXQgZW1iZWRkaW5ncyBzaG91bGQgaGF2ZS4gT25seVxuICAgKiBzdXBwb3J0ZWQgaW4gYHRleHQtZW1iZWRkaW5nLTNgIGFuZCBsYXRlciBtb2RlbHMuXG4gICAqL1xuICBkaW1lbnNpb25zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IHRvIHJldHVybiB0aGUgZW1iZWRkaW5ncyBpbi4gQ2FuIGJlIGVpdGhlciBgZmxvYXRgIG9yXG4gICAqIFtgYmFzZTY0YF0oaHR0cHM6Ly9weXBpLm9yZy9wcm9qZWN0L3B5YmFzZTY0LykuXG4gICAqL1xuICBlbmNvZGluZ19mb3JtYXQ/OiAnZmxvYXQnIHwgJ2Jhc2U2NCc7XG5cbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgcmVwcmVzZW50aW5nIHlvdXIgZW5kLXVzZXIsIHdoaWNoIGNhbiBoZWxwIE9wZW5BSSB0byBtb25pdG9yXG4gICAqIGFuZCBkZXRlY3QgYWJ1c2UuXG4gICAqIFtMZWFybiBtb3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvc2FmZXR5LWJlc3QtcHJhY3RpY2VzL2VuZC11c2VyLWlkcykuXG4gICAqL1xuICB1c2VyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEVtYmVkZGluZ3Mge1xuICBleHBvcnQgaW1wb3J0IENyZWF0ZUVtYmVkZGluZ1Jlc3BvbnNlID0gRW1iZWRkaW5nc0FQSS5DcmVhdGVFbWJlZGRpbmdSZXNwb25zZTtcbiAgZXhwb3J0IGltcG9ydCBFbWJlZGRpbmcgPSBFbWJlZGRpbmdzQVBJLkVtYmVkZGluZztcbiAgZXhwb3J0IGltcG9ydCBFbWJlZGRpbmdDcmVhdGVQYXJhbXMgPSBFbWJlZGRpbmdzQVBJLkVtYmVkZGluZ0NyZWF0ZVBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tICcuLi9yZXNvdXJjZSc7XG5pbXBvcnQgeyBpc1JlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgeyB0eXBlIFJlc3BvbnNlIH0gZnJvbSAnLi4vX3NoaW1zL2luZGV4JztcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgeyBBUElDb25uZWN0aW9uVGltZW91dEVycm9yIH0gZnJvbSAnLi4vZXJyb3InO1xuaW1wb3J0ICogYXMgRmlsZXNBUEkgZnJvbSAnLi9maWxlcyc7XG5pbXBvcnQgeyB0eXBlIFVwbG9hZGFibGUsIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgUGFnZSB9IGZyb20gJy4uL3BhZ2luYXRpb24nO1xuXG5leHBvcnQgY2xhc3MgRmlsZXMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBVcGxvYWQgYSBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgYWNyb3NzIHZhcmlvdXMgZW5kcG9pbnRzLiBJbmRpdmlkdWFsIGZpbGVzIGNhbiBiZVxuICAgKiB1cCB0byA1MTIgTUIsIGFuZCB0aGUgc2l6ZSBvZiBhbGwgZmlsZXMgdXBsb2FkZWQgYnkgb25lIG9yZ2FuaXphdGlvbiBjYW4gYmUgdXBcbiAgICogdG8gMTAwIEdCLlxuICAgKlxuICAgKiBUaGUgQXNzaXN0YW50cyBBUEkgc3VwcG9ydHMgZmlsZXMgdXAgdG8gMiBtaWxsaW9uIHRva2VucyBhbmQgb2Ygc3BlY2lmaWMgZmlsZVxuICAgKiB0eXBlcy4gU2VlIHRoZVxuICAgKiBbQXNzaXN0YW50cyBUb29scyBndWlkZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXNzaXN0YW50cy90b29scykgZm9yXG4gICAqIGRldGFpbHMuXG4gICAqXG4gICAqIFRoZSBGaW5lLXR1bmluZyBBUEkgb25seSBzdXBwb3J0cyBgLmpzb25sYCBmaWxlcy5cbiAgICpcbiAgICogVGhlIEJhdGNoIEFQSSBvbmx5IHN1cHBvcnRzIGAuanNvbmxgIGZpbGVzIHVwIHRvIDEwMCBNQiBpbiBzaXplLlxuICAgKlxuICAgKiBQbGVhc2UgW2NvbnRhY3QgdXNdKGh0dHBzOi8vaGVscC5vcGVuYWkuY29tLykgaWYgeW91IG5lZWQgdG8gaW5jcmVhc2UgdGhlc2VcbiAgICogc3RvcmFnZSBsaW1pdHMuXG4gICAqL1xuICBjcmVhdGUoYm9keTogRmlsZUNyZWF0ZVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8RmlsZU9iamVjdD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL2ZpbGVzJywgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zKHsgYm9keSwgLi4ub3B0aW9ucyB9KSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGZpbGUuXG4gICAqL1xuICByZXRyaWV2ZShmaWxlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8RmlsZU9iamVjdD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvZmlsZXMvJHtmaWxlSWR9YCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgZmlsZXMgdGhhdCBiZWxvbmcgdG8gdGhlIHVzZXIncyBvcmdhbml6YXRpb24uXG4gICAqL1xuICBsaXN0KHF1ZXJ5PzogRmlsZUxpc3RQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5QYWdlUHJvbWlzZTxGaWxlT2JqZWN0c1BhZ2UsIEZpbGVPYmplY3Q+O1xuICBsaXN0KG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5QYWdlUHJvbWlzZTxGaWxlT2JqZWN0c1BhZ2UsIEZpbGVPYmplY3Q+O1xuICBsaXN0KFxuICAgIHF1ZXJ5OiBGaWxlTGlzdFBhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxGaWxlT2JqZWN0c1BhZ2UsIEZpbGVPYmplY3Q+IHtcbiAgICBpZiAoaXNSZXF1ZXN0T3B0aW9ucyhxdWVyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3Qoe30sIHF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KCcvZmlsZXMnLCBGaWxlT2JqZWN0c1BhZ2UsIHsgcXVlcnksIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgZmlsZS5cbiAgICovXG4gIGRlbChmaWxlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8RmlsZURlbGV0ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmRlbGV0ZShgL2ZpbGVzLyR7ZmlsZUlkfWAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZmlsZS5cbiAgICovXG4gIGNvbnRlbnQoZmlsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXQoYC9maWxlcy8ke2ZpbGVJZH0vY29udGVudGAsIHsgLi4ub3B0aW9ucywgX19iaW5hcnlSZXNwb25zZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGZpbGUuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFRoZSBgLmNvbnRlbnQoKWAgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGluc3RlYWRcbiAgICovXG4gIHJldHJpZXZlQ29udGVudChmaWxlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXQoYC9maWxlcy8ke2ZpbGVJZH0vY29udGVudGAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7IEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIHRoZSBnaXZlbiBmaWxlIHRvIGJlIHByb2Nlc3NlZCwgZGVmYXVsdCB0aW1lb3V0IGlzIDMwIG1pbnMuXG4gICAqL1xuICBhc3luYyB3YWl0Rm9yUHJvY2Vzc2luZyhcbiAgICBpZDogc3RyaW5nLFxuICAgIHsgcG9sbEludGVydmFsID0gNTAwMCwgbWF4V2FpdCA9IDMwICogNjAgKiAxMDAwIH06IHsgcG9sbEludGVydmFsPzogbnVtYmVyOyBtYXhXYWl0PzogbnVtYmVyIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxGaWxlT2JqZWN0PiB7XG4gICAgY29uc3QgVEVSTUlOQUxfU1RBVEVTID0gbmV3IFNldChbJ3Byb2Nlc3NlZCcsICdlcnJvcicsICdkZWxldGVkJ10pO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGxldCBmaWxlID0gYXdhaXQgdGhpcy5yZXRyaWV2ZShpZCk7XG5cbiAgICB3aGlsZSAoIWZpbGUuc3RhdHVzIHx8ICFURVJNSU5BTF9TVEFURVMuaGFzKGZpbGUuc3RhdHVzKSkge1xuICAgICAgYXdhaXQgc2xlZXAocG9sbEludGVydmFsKTtcblxuICAgICAgZmlsZSA9IGF3YWl0IHRoaXMucmV0cmlldmUoaWQpO1xuICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydCA+IG1heFdhaXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3Ioe1xuICAgICAgICAgIG1lc3NhZ2U6IGBHaXZpbmcgdXAgb24gd2FpdGluZyBmb3IgZmlsZSAke2lkfSB0byBmaW5pc2ggcHJvY2Vzc2luZyBhZnRlciAke21heFdhaXR9IG1pbGxpc2Vjb25kcy5gLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmlsZTtcbiAgfVxufVxuXG4vKipcbiAqIE5vdGU6IG5vIHBhZ2luYXRpb24gYWN0dWFsbHkgb2NjdXJzIHlldCwgdGhpcyBpcyBmb3IgZm9yd2FyZHMtY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVPYmplY3RzUGFnZSBleHRlbmRzIFBhZ2U8RmlsZU9iamVjdD4ge31cblxuZXhwb3J0IHR5cGUgRmlsZUNvbnRlbnQgPSBzdHJpbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZURlbGV0ZWQge1xuICBpZDogc3RyaW5nO1xuXG4gIGRlbGV0ZWQ6IGJvb2xlYW47XG5cbiAgb2JqZWN0OiAnZmlsZSc7XG59XG5cbi8qKlxuICogVGhlIGBGaWxlYCBvYmplY3QgcmVwcmVzZW50cyBhIGRvY3VtZW50IHRoYXQgaGFzIGJlZW4gdXBsb2FkZWQgdG8gT3BlbkFJLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVPYmplY3Qge1xuICAvKipcbiAgICogVGhlIGZpbGUgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gdGhlIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgZmlsZSwgaW4gYnl0ZXMuXG4gICAqL1xuICBieXRlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBmaWxlIHdhcyBjcmVhdGVkLlxuICAgKi9cbiAgY3JlYXRlZF9hdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZS5cbiAgICovXG4gIGZpbGVuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGBmaWxlYC5cbiAgICovXG4gIG9iamVjdDogJ2ZpbGUnO1xuXG4gIC8qKlxuICAgKiBUaGUgaW50ZW5kZWQgcHVycG9zZSBvZiB0aGUgZmlsZS4gU3VwcG9ydGVkIHZhbHVlcyBhcmUgYGFzc2lzdGFudHNgLFxuICAgKiBgYXNzaXN0YW50c19vdXRwdXRgLCBgYmF0Y2hgLCBgYmF0Y2hfb3V0cHV0YCwgYGZpbmUtdHVuZWAsIGBmaW5lLXR1bmUtcmVzdWx0c2BcbiAgICogYW5kIGB2aXNpb25gLlxuICAgKi9cbiAgcHVycG9zZTpcbiAgICB8ICdhc3Npc3RhbnRzJ1xuICAgIHwgJ2Fzc2lzdGFudHNfb3V0cHV0J1xuICAgIHwgJ2JhdGNoJ1xuICAgIHwgJ2JhdGNoX291dHB1dCdcbiAgICB8ICdmaW5lLXR1bmUnXG4gICAgfCAnZmluZS10dW5lLXJlc3VsdHMnXG4gICAgfCAndmlzaW9uJztcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQ6IERlcHJlY2F0ZWQuIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZmlsZSwgd2hpY2ggY2FuIGJlIGVpdGhlclxuICAgKiBgdXBsb2FkZWRgLCBgcHJvY2Vzc2VkYCwgb3IgYGVycm9yYC5cbiAgICovXG4gIHN0YXR1czogJ3VwbG9hZGVkJyB8ICdwcm9jZXNzZWQnIHwgJ2Vycm9yJztcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQ6IERlcHJlY2F0ZWQuIEZvciBkZXRhaWxzIG9uIHdoeSBhIGZpbmUtdHVuaW5nIHRyYWluaW5nIGZpbGUgZmFpbGVkXG4gICAqIHZhbGlkYXRpb24sIHNlZSB0aGUgYGVycm9yYCBmaWVsZCBvbiBgZmluZV90dW5pbmcuam9iYC5cbiAgICovXG4gIHN0YXR1c19kZXRhaWxzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVDcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIEZpbGUgb2JqZWN0IChub3QgZmlsZSBuYW1lKSB0byBiZSB1cGxvYWRlZC5cbiAgICovXG4gIGZpbGU6IFVwbG9hZGFibGU7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlbmRlZCBwdXJwb3NlIG9mIHRoZSB1cGxvYWRlZCBmaWxlLlxuICAgKlxuICAgKiBVc2UgXCJhc3Npc3RhbnRzXCIgZm9yXG4gICAqIFtBc3Npc3RhbnRzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIGFuZFxuICAgKiBbTWVzc2FnZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcykgZmlsZXMsXG4gICAqIFwidmlzaW9uXCIgZm9yIEFzc2lzdGFudHMgaW1hZ2UgZmlsZSBpbnB1dHMsIFwiYmF0Y2hcIiBmb3JcbiAgICogW0JhdGNoIEFQSV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL2JhdGNoKSwgYW5kIFwiZmluZS10dW5lXCIgZm9yXG4gICAqIFtGaW5lLXR1bmluZ10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maW5lLXR1bmluZykuXG4gICAqL1xuICBwdXJwb3NlOiAnYXNzaXN0YW50cycgfCAnYmF0Y2gnIHwgJ2ZpbmUtdHVuZSc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUxpc3RQYXJhbXMge1xuICAvKipcbiAgICogT25seSByZXR1cm4gZmlsZXMgd2l0aCB0aGUgZ2l2ZW4gcHVycG9zZS5cbiAgICovXG4gIHB1cnBvc2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmlsZXMge1xuICBleHBvcnQgaW1wb3J0IEZpbGVDb250ZW50ID0gRmlsZXNBUEkuRmlsZUNvbnRlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZURlbGV0ZWQgPSBGaWxlc0FQSS5GaWxlRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBGaWxlT2JqZWN0ID0gRmlsZXNBUEkuRmlsZU9iamVjdDtcbiAgZXhwb3J0IGltcG9ydCBGaWxlT2JqZWN0c1BhZ2UgPSBGaWxlc0FQSS5GaWxlT2JqZWN0c1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUNyZWF0ZVBhcmFtcyA9IEZpbGVzQVBJLkZpbGVDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUxpc3RQYXJhbXMgPSBGaWxlc0FQSS5GaWxlTGlzdFBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZSc7XG5pbXBvcnQgeyBpc1JlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgKiBhcyBDaGVja3BvaW50c0FQSSBmcm9tICcuL2NoZWNrcG9pbnRzJztcbmltcG9ydCB7IEN1cnNvclBhZ2UsIHR5cGUgQ3Vyc29yUGFnZVBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL3BhZ2luYXRpb24nO1xuXG5leHBvcnQgY2xhc3MgQ2hlY2twb2ludHMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBMaXN0IGNoZWNrcG9pbnRzIGZvciBhIGZpbmUtdHVuaW5nIGpvYi5cbiAgICovXG4gIGxpc3QoXG4gICAgZmluZVR1bmluZ0pvYklkOiBzdHJpbmcsXG4gICAgcXVlcnk/OiBDaGVja3BvaW50TGlzdFBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxGaW5lVHVuaW5nSm9iQ2hlY2twb2ludHNQYWdlLCBGaW5lVHVuaW5nSm9iQ2hlY2twb2ludD47XG4gIGxpc3QoXG4gICAgZmluZVR1bmluZ0pvYklkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8RmluZVR1bmluZ0pvYkNoZWNrcG9pbnRzUGFnZSwgRmluZVR1bmluZ0pvYkNoZWNrcG9pbnQ+O1xuICBsaXN0KFxuICAgIGZpbmVUdW5pbmdKb2JJZDogc3RyaW5nLFxuICAgIHF1ZXJ5OiBDaGVja3BvaW50TGlzdFBhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxGaW5lVHVuaW5nSm9iQ2hlY2twb2ludHNQYWdlLCBGaW5lVHVuaW5nSm9iQ2hlY2twb2ludD4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdChmaW5lVHVuaW5nSm9iSWQsIHt9LCBxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0QVBJTGlzdChcbiAgICAgIGAvZmluZV90dW5pbmcvam9icy8ke2ZpbmVUdW5pbmdKb2JJZH0vY2hlY2twb2ludHNgLFxuICAgICAgRmluZVR1bmluZ0pvYkNoZWNrcG9pbnRzUGFnZSxcbiAgICAgIHsgcXVlcnksIC4uLm9wdGlvbnMgfSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGaW5lVHVuaW5nSm9iQ2hlY2twb2ludHNQYWdlIGV4dGVuZHMgQ3Vyc29yUGFnZTxGaW5lVHVuaW5nSm9iQ2hlY2twb2ludD4ge31cblxuLyoqXG4gKiBUaGUgYGZpbmVfdHVuaW5nLmpvYi5jaGVja3BvaW50YCBvYmplY3QgcmVwcmVzZW50cyBhIG1vZGVsIGNoZWNrcG9pbnQgZm9yIGFcbiAqIGZpbmUtdHVuaW5nIGpvYiB0aGF0IGlzIHJlYWR5IHRvIHVzZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5lVHVuaW5nSm9iQ2hlY2twb2ludCB7XG4gIC8qKlxuICAgKiBUaGUgY2hlY2twb2ludCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiB0aGUgQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmaW5lLXR1bmVkIGNoZWNrcG9pbnQgbW9kZWwgdGhhdCBpcyBjcmVhdGVkLlxuICAgKi9cbiAgZmluZV90dW5lZF9tb2RlbF9jaGVja3BvaW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmaW5lLXR1bmluZyBqb2IgdGhhdCB0aGlzIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQgZnJvbS5cbiAgICovXG4gIGZpbmVfdHVuaW5nX2pvYl9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNZXRyaWNzIGF0IHRoZSBzdGVwIG51bWJlciBkdXJpbmcgdGhlIGZpbmUtdHVuaW5nIGpvYi5cbiAgICovXG4gIG1ldHJpY3M6IEZpbmVUdW5pbmdKb2JDaGVja3BvaW50Lk1ldHJpY3M7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIFwiZmluZV90dW5pbmcuam9iLmNoZWNrcG9pbnRcIi5cbiAgICovXG4gIG9iamVjdDogJ2ZpbmVfdHVuaW5nLmpvYi5jaGVja3BvaW50JztcblxuICAvKipcbiAgICogVGhlIHN0ZXAgbnVtYmVyIHRoYXQgdGhlIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQgYXQuXG4gICAqL1xuICBzdGVwX251bWJlcjogbnVtYmVyO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpbmVUdW5pbmdKb2JDaGVja3BvaW50IHtcbiAgLyoqXG4gICAqIE1ldHJpY3MgYXQgdGhlIHN0ZXAgbnVtYmVyIGR1cmluZyB0aGUgZmluZS10dW5pbmcgam9iLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBNZXRyaWNzIHtcbiAgICBmdWxsX3ZhbGlkX2xvc3M/OiBudW1iZXI7XG5cbiAgICBmdWxsX3ZhbGlkX21lYW5fdG9rZW5fYWNjdXJhY3k/OiBudW1iZXI7XG5cbiAgICBzdGVwPzogbnVtYmVyO1xuXG4gICAgdHJhaW5fbG9zcz86IG51bWJlcjtcblxuICAgIHRyYWluX21lYW5fdG9rZW5fYWNjdXJhY3k/OiBudW1iZXI7XG5cbiAgICB2YWxpZF9sb3NzPzogbnVtYmVyO1xuXG4gICAgdmFsaWRfbWVhbl90b2tlbl9hY2N1cmFjeT86IG51bWJlcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrcG9pbnRMaXN0UGFyYW1zIGV4dGVuZHMgQ3Vyc29yUGFnZVBhcmFtcyB7fVxuXG5leHBvcnQgbmFtZXNwYWNlIENoZWNrcG9pbnRzIHtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iQ2hlY2twb2ludCA9IENoZWNrcG9pbnRzQVBJLkZpbmVUdW5pbmdKb2JDaGVja3BvaW50O1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JDaGVja3BvaW50c1BhZ2UgPSBDaGVja3BvaW50c0FQSS5GaW5lVHVuaW5nSm9iQ2hlY2twb2ludHNQYWdlO1xuICBleHBvcnQgaW1wb3J0IENoZWNrcG9pbnRMaXN0UGFyYW1zID0gQ2hlY2twb2ludHNBUEkuQ2hlY2twb2ludExpc3RQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2UnO1xuaW1wb3J0IHsgaXNSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0ICogYXMgSm9ic0FQSSBmcm9tICcuL2pvYnMnO1xuaW1wb3J0ICogYXMgQ2hlY2twb2ludHNBUEkgZnJvbSAnLi9jaGVja3BvaW50cyc7XG5pbXBvcnQgeyBDdXJzb3JQYWdlLCB0eXBlIEN1cnNvclBhZ2VQYXJhbXMgfSBmcm9tICcuLi8uLi8uLi9wYWdpbmF0aW9uJztcblxuZXhwb3J0IGNsYXNzIEpvYnMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIGNoZWNrcG9pbnRzOiBDaGVja3BvaW50c0FQSS5DaGVja3BvaW50cyA9IG5ldyBDaGVja3BvaW50c0FQSS5DaGVja3BvaW50cyh0aGlzLl9jbGllbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZmluZS10dW5pbmcgam9iIHdoaWNoIGJlZ2lucyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhIG5ldyBtb2RlbCBmcm9tXG4gICAqIGEgZ2l2ZW4gZGF0YXNldC5cbiAgICpcbiAgICogUmVzcG9uc2UgaW5jbHVkZXMgZGV0YWlscyBvZiB0aGUgZW5xdWV1ZWQgam9iIGluY2x1ZGluZyBqb2Igc3RhdHVzIGFuZCB0aGUgbmFtZVxuICAgKiBvZiB0aGUgZmluZS10dW5lZCBtb2RlbHMgb25jZSBjb21wbGV0ZS5cbiAgICpcbiAgICogW0xlYXJuIG1vcmUgYWJvdXQgZmluZS10dW5pbmddKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9maW5lLXR1bmluZylcbiAgICovXG4gIGNyZWF0ZShib2R5OiBKb2JDcmVhdGVQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEZpbmVUdW5pbmdKb2I+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9maW5lX3R1bmluZy9qb2JzJywgeyBib2R5LCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBpbmZvIGFib3V0IGEgZmluZS10dW5pbmcgam9iLlxuICAgKlxuICAgKiBbTGVhcm4gbW9yZSBhYm91dCBmaW5lLXR1bmluZ10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL2ZpbmUtdHVuaW5nKVxuICAgKi9cbiAgcmV0cmlldmUoZmluZVR1bmluZ0pvYklkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEZpbmVUdW5pbmdKb2I+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL2ZpbmVfdHVuaW5nL2pvYnMvJHtmaW5lVHVuaW5nSm9iSWR9YCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB5b3VyIG9yZ2FuaXphdGlvbidzIGZpbmUtdHVuaW5nIGpvYnNcbiAgICovXG4gIGxpc3QoXG4gICAgcXVlcnk/OiBKb2JMaXN0UGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPEZpbmVUdW5pbmdKb2JzUGFnZSwgRmluZVR1bmluZ0pvYj47XG4gIGxpc3Qob3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLlBhZ2VQcm9taXNlPEZpbmVUdW5pbmdKb2JzUGFnZSwgRmluZVR1bmluZ0pvYj47XG4gIGxpc3QoXG4gICAgcXVlcnk6IEpvYkxpc3RQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8RmluZVR1bmluZ0pvYnNQYWdlLCBGaW5lVHVuaW5nSm9iPiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0KHt9LCBxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0QVBJTGlzdCgnL2ZpbmVfdHVuaW5nL2pvYnMnLCBGaW5lVHVuaW5nSm9ic1BhZ2UsIHsgcXVlcnksIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1tZWRpYXRlbHkgY2FuY2VsIGEgZmluZS10dW5lIGpvYi5cbiAgICovXG4gIGNhbmNlbChmaW5lVHVuaW5nSm9iSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8RmluZVR1bmluZ0pvYj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL2ZpbmVfdHVuaW5nL2pvYnMvJHtmaW5lVHVuaW5nSm9iSWR9L2NhbmNlbGAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdGF0dXMgdXBkYXRlcyBmb3IgYSBmaW5lLXR1bmluZyBqb2IuXG4gICAqL1xuICBsaXN0RXZlbnRzKFxuICAgIGZpbmVUdW5pbmdKb2JJZDogc3RyaW5nLFxuICAgIHF1ZXJ5PzogSm9iTGlzdEV2ZW50c1BhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxGaW5lVHVuaW5nSm9iRXZlbnRzUGFnZSwgRmluZVR1bmluZ0pvYkV2ZW50PjtcbiAgbGlzdEV2ZW50cyhcbiAgICBmaW5lVHVuaW5nSm9iSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxGaW5lVHVuaW5nSm9iRXZlbnRzUGFnZSwgRmluZVR1bmluZ0pvYkV2ZW50PjtcbiAgbGlzdEV2ZW50cyhcbiAgICBmaW5lVHVuaW5nSm9iSWQ6IHN0cmluZyxcbiAgICBxdWVyeTogSm9iTGlzdEV2ZW50c1BhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxGaW5lVHVuaW5nSm9iRXZlbnRzUGFnZSwgRmluZVR1bmluZ0pvYkV2ZW50PiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0RXZlbnRzKGZpbmVUdW5pbmdKb2JJZCwge30sIHF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KGAvZmluZV90dW5pbmcvam9icy8ke2ZpbmVUdW5pbmdKb2JJZH0vZXZlbnRzYCwgRmluZVR1bmluZ0pvYkV2ZW50c1BhZ2UsIHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmluZVR1bmluZ0pvYnNQYWdlIGV4dGVuZHMgQ3Vyc29yUGFnZTxGaW5lVHVuaW5nSm9iPiB7fVxuXG5leHBvcnQgY2xhc3MgRmluZVR1bmluZ0pvYkV2ZW50c1BhZ2UgZXh0ZW5kcyBDdXJzb3JQYWdlPEZpbmVUdW5pbmdKb2JFdmVudD4ge31cblxuLyoqXG4gKiBUaGUgYGZpbmVfdHVuaW5nLmpvYmAgb2JqZWN0IHJlcHJlc2VudHMgYSBmaW5lLXR1bmluZyBqb2IgdGhhdCBoYXMgYmVlbiBjcmVhdGVkXG4gKiB0aHJvdWdoIHRoZSBBUEkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmluZVR1bmluZ0pvYiB7XG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIHRoZSBBUEkgZW5kcG9pbnRzLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgZmluZS10dW5pbmcgam9iIHdhcyBjcmVhdGVkLlxuICAgKi9cbiAgY3JlYXRlZF9hdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBGb3IgZmluZS10dW5pbmcgam9icyB0aGF0IGhhdmUgYGZhaWxlZGAsIHRoaXMgd2lsbCBjb250YWluIG1vcmUgaW5mb3JtYXRpb24gb25cbiAgICogdGhlIGNhdXNlIG9mIHRoZSBmYWlsdXJlLlxuICAgKi9cbiAgZXJyb3I6IEZpbmVUdW5pbmdKb2IuRXJyb3IgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmluZS10dW5lZCBtb2RlbCB0aGF0IGlzIGJlaW5nIGNyZWF0ZWQuIFRoZSB2YWx1ZSB3aWxsIGJlIG51bGxcbiAgICogaWYgdGhlIGZpbmUtdHVuaW5nIGpvYiBpcyBzdGlsbCBydW5uaW5nLlxuICAgKi9cbiAgZmluZV90dW5lZF9tb2RlbDogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgZmluZS10dW5pbmcgam9iIHdhcyBmaW5pc2hlZC4gVGhlXG4gICAqIHZhbHVlIHdpbGwgYmUgbnVsbCBpZiB0aGUgZmluZS10dW5pbmcgam9iIGlzIHN0aWxsIHJ1bm5pbmcuXG4gICAqL1xuICBmaW5pc2hlZF9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIGh5cGVycGFyYW1ldGVycyB1c2VkIGZvciB0aGUgZmluZS10dW5pbmcgam9iLiBTZWUgdGhlXG4gICAqIFtmaW5lLXR1bmluZyBndWlkZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL2ZpbmUtdHVuaW5nKSBmb3JcbiAgICogbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgaHlwZXJwYXJhbWV0ZXJzOiBGaW5lVHVuaW5nSm9iLkh5cGVycGFyYW1ldGVycztcblxuICAvKipcbiAgICogVGhlIGJhc2UgbW9kZWwgdGhhdCBpcyBiZWluZyBmaW5lLXR1bmVkLlxuICAgKi9cbiAgbW9kZWw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgXCJmaW5lX3R1bmluZy5qb2JcIi5cbiAgICovXG4gIG9iamVjdDogJ2ZpbmVfdHVuaW5nLmpvYic7XG5cbiAgLyoqXG4gICAqIFRoZSBvcmdhbml6YXRpb24gdGhhdCBvd25zIHRoZSBmaW5lLXR1bmluZyBqb2IuXG4gICAqL1xuICBvcmdhbml6YXRpb25faWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbXBpbGVkIHJlc3VsdHMgZmlsZSBJRChzKSBmb3IgdGhlIGZpbmUtdHVuaW5nIGpvYi4gWW91IGNhbiByZXRyaWV2ZSB0aGVcbiAgICogcmVzdWx0cyB3aXRoIHRoZVxuICAgKiBbRmlsZXMgQVBJXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzL3JldHJpZXZlLWNvbnRlbnRzKS5cbiAgICovXG4gIHJlc3VsdF9maWxlczogQXJyYXk8c3RyaW5nPjtcblxuICAvKipcbiAgICogVGhlIHNlZWQgdXNlZCBmb3IgdGhlIGZpbmUtdHVuaW5nIGpvYi5cbiAgICovXG4gIHNlZWQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBmaW5lLXR1bmluZyBqb2IsIHdoaWNoIGNhbiBiZSBlaXRoZXJcbiAgICogYHZhbGlkYXRpbmdfZmlsZXNgLCBgcXVldWVkYCwgYHJ1bm5pbmdgLCBgc3VjY2VlZGVkYCwgYGZhaWxlZGAsIG9yIGBjYW5jZWxsZWRgLlxuICAgKi9cbiAgc3RhdHVzOiAndmFsaWRhdGluZ19maWxlcycgfCAncXVldWVkJyB8ICdydW5uaW5nJyB8ICdzdWNjZWVkZWQnIHwgJ2ZhaWxlZCcgfCAnY2FuY2VsbGVkJztcblxuICAvKipcbiAgICogVGhlIHRvdGFsIG51bWJlciBvZiBiaWxsYWJsZSB0b2tlbnMgcHJvY2Vzc2VkIGJ5IHRoaXMgZmluZS10dW5pbmcgam9iLiBUaGUgdmFsdWVcbiAgICogd2lsbCBiZSBudWxsIGlmIHRoZSBmaW5lLXR1bmluZyBqb2IgaXMgc3RpbGwgcnVubmluZy5cbiAgICovXG4gIHRyYWluZWRfdG9rZW5zOiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSBJRCB1c2VkIGZvciB0cmFpbmluZy4gWW91IGNhbiByZXRyaWV2ZSB0aGUgdHJhaW5pbmcgZGF0YSB3aXRoIHRoZVxuICAgKiBbRmlsZXMgQVBJXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzL3JldHJpZXZlLWNvbnRlbnRzKS5cbiAgICovXG4gIHRyYWluaW5nX2ZpbGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZpbGUgSUQgdXNlZCBmb3IgdmFsaWRhdGlvbi4gWW91IGNhbiByZXRyaWV2ZSB0aGUgdmFsaWRhdGlvbiByZXN1bHRzIHdpdGhcbiAgICogdGhlXG4gICAqIFtGaWxlcyBBUEldKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMvcmV0cmlldmUtY29udGVudHMpLlxuICAgKi9cbiAgdmFsaWRhdGlvbl9maWxlOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBmaW5lLXR1bmluZyBqb2IgaXMgZXN0aW1hdGVkIHRvXG4gICAqIGZpbmlzaC4gVGhlIHZhbHVlIHdpbGwgYmUgbnVsbCBpZiB0aGUgZmluZS10dW5pbmcgam9iIGlzIG5vdCBydW5uaW5nLlxuICAgKi9cbiAgZXN0aW1hdGVkX2ZpbmlzaD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBpbnRlZ3JhdGlvbnMgdG8gZW5hYmxlIGZvciB0aGlzIGZpbmUtdHVuaW5nIGpvYi5cbiAgICovXG4gIGludGVncmF0aW9ucz86IEFycmF5PEZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uT2JqZWN0PiB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmluZVR1bmluZ0pvYiB7XG4gIC8qKlxuICAgKiBGb3IgZmluZS10dW5pbmcgam9icyB0aGF0IGhhdmUgYGZhaWxlZGAsIHRoaXMgd2lsbCBjb250YWluIG1vcmUgaW5mb3JtYXRpb24gb25cbiAgICogdGhlIGNhdXNlIG9mIHRoZSBmYWlsdXJlLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBFcnJvciB7XG4gICAgLyoqXG4gICAgICogQSBtYWNoaW5lLXJlYWRhYmxlIGVycm9yIGNvZGUuXG4gICAgICovXG4gICAgY29kZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLlxuICAgICAqL1xuICAgIG1lc3NhZ2U6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBwYXJhbWV0ZXIgdGhhdCB3YXMgaW52YWxpZCwgdXN1YWxseSBgdHJhaW5pbmdfZmlsZWAgb3IgYHZhbGlkYXRpb25fZmlsZWAuXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgaWYgdGhlIGZhaWx1cmUgd2FzIG5vdCBwYXJhbWV0ZXItc3BlY2lmaWMuXG4gICAgICovXG4gICAgcGFyYW06IHN0cmluZyB8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGh5cGVycGFyYW1ldGVycyB1c2VkIGZvciB0aGUgZmluZS10dW5pbmcgam9iLiBTZWUgdGhlXG4gICAqIFtmaW5lLXR1bmluZyBndWlkZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL2ZpbmUtdHVuaW5nKSBmb3JcbiAgICogbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBIeXBlcnBhcmFtZXRlcnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZXBvY2hzIHRvIHRyYWluIHRoZSBtb2RlbCBmb3IuIEFuIGVwb2NoIHJlZmVycyB0byBvbmUgZnVsbCBjeWNsZVxuICAgICAqIHRocm91Z2ggdGhlIHRyYWluaW5nIGRhdGFzZXQuIFwiYXV0b1wiIGRlY2lkZXMgdGhlIG9wdGltYWwgbnVtYmVyIG9mIGVwb2NocyBiYXNlZFxuICAgICAqIG9uIHRoZSBzaXplIG9mIHRoZSBkYXRhc2V0LiBJZiBzZXR0aW5nIHRoZSBudW1iZXIgbWFudWFsbHksIHdlIHN1cHBvcnQgYW55XG4gICAgICogbnVtYmVyIGJldHdlZW4gMSBhbmQgNTAgZXBvY2hzLlxuICAgICAqL1xuICAgIG5fZXBvY2hzOiAnYXV0bycgfCBudW1iZXI7XG4gIH1cbn1cblxuLyoqXG4gKiBGaW5lLXR1bmluZyBqb2IgZXZlbnQgb2JqZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmluZVR1bmluZ0pvYkV2ZW50IHtcbiAgaWQ6IHN0cmluZztcblxuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgbGV2ZWw6ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcic7XG5cbiAgbWVzc2FnZTogc3RyaW5nO1xuXG4gIG9iamVjdDogJ2ZpbmVfdHVuaW5nLmpvYi5ldmVudCc7XG59XG5cbmV4cG9ydCB0eXBlIEZpbmVUdW5pbmdKb2JJbnRlZ3JhdGlvbiA9IEZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uT2JqZWN0O1xuXG4vKipcbiAqIFRoZSBzZXR0aW5ncyBmb3IgeW91ciBpbnRlZ3JhdGlvbiB3aXRoIFdlaWdodHMgYW5kIEJpYXNlcy4gVGhpcyBwYXlsb2FkXG4gKiBzcGVjaWZpZXMgdGhlIHByb2plY3QgdGhhdCBtZXRyaWNzIHdpbGwgYmUgc2VudCB0by4gT3B0aW9uYWxseSwgeW91IGNhbiBzZXQgYW5cbiAqIGV4cGxpY2l0IGRpc3BsYXkgbmFtZSBmb3IgeW91ciBydW4sIGFkZCB0YWdzIHRvIHlvdXIgcnVuLCBhbmQgc2V0IGEgZGVmYXVsdFxuICogZW50aXR5ICh0ZWFtLCB1c2VybmFtZSwgZXRjKSB0byBiZSBhc3NvY2lhdGVkIHdpdGggeW91ciBydW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmluZVR1bmluZ0pvYldhbmRiSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCB0aGUgbmV3IHJ1biB3aWxsIGJlIGNyZWF0ZWQgdW5kZXIuXG4gICAqL1xuICBwcm9qZWN0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgdG8gdXNlIGZvciB0aGUgcnVuLiBUaGlzIGFsbG93cyB5b3UgdG8gc2V0IHRoZSB0ZWFtIG9yIHVzZXJuYW1lIG9mXG4gICAqIHRoZSBXYW5kQiB1c2VyIHRoYXQgeW91IHdvdWxkIGxpa2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBydW4uIElmIG5vdCBzZXQsIHRoZVxuICAgKiBkZWZhdWx0IGVudGl0eSBmb3IgdGhlIHJlZ2lzdGVyZWQgV2FuZEIgQVBJIGtleSBpcyB1c2VkLlxuICAgKi9cbiAgZW50aXR5Pzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBkaXNwbGF5IG5hbWUgdG8gc2V0IGZvciB0aGUgcnVuLiBJZiBub3Qgc2V0LCB3ZSB3aWxsIHVzZSB0aGUgSm9iIElEIGFzIHRoZVxuICAgKiBuYW1lLlxuICAgKi9cbiAgbmFtZT86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiB0YWdzIHRvIGJlIGF0dGFjaGVkIHRvIHRoZSBuZXdseSBjcmVhdGVkIHJ1bi4gVGhlc2UgdGFncyBhcmUgcGFzc2VkXG4gICAqIHRocm91Z2ggZGlyZWN0bHkgdG8gV2FuZEIuIFNvbWUgZGVmYXVsdCB0YWdzIGFyZSBnZW5lcmF0ZWQgYnkgT3BlbkFJOlxuICAgKiBcIm9wZW5haS9maW5ldHVuZVwiLCBcIm9wZW5haS97YmFzZS1tb2RlbH1cIiwgXCJvcGVuYWkve2Z0am9iLWFiY2RlZn1cIi5cbiAgICovXG4gIHRhZ3M/OiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uT2JqZWN0IHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBpbnRlZ3JhdGlvbiBiZWluZyBlbmFibGVkIGZvciB0aGUgZmluZS10dW5pbmcgam9iXG4gICAqL1xuICB0eXBlOiAnd2FuZGInO1xuXG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZ3MgZm9yIHlvdXIgaW50ZWdyYXRpb24gd2l0aCBXZWlnaHRzIGFuZCBCaWFzZXMuIFRoaXMgcGF5bG9hZFxuICAgKiBzcGVjaWZpZXMgdGhlIHByb2plY3QgdGhhdCBtZXRyaWNzIHdpbGwgYmUgc2VudCB0by4gT3B0aW9uYWxseSwgeW91IGNhbiBzZXQgYW5cbiAgICogZXhwbGljaXQgZGlzcGxheSBuYW1lIGZvciB5b3VyIHJ1biwgYWRkIHRhZ3MgdG8geW91ciBydW4sIGFuZCBzZXQgYSBkZWZhdWx0XG4gICAqIGVudGl0eSAodGVhbSwgdXNlcm5hbWUsIGV0YykgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHlvdXIgcnVuLlxuICAgKi9cbiAgd2FuZGI6IEZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEpvYkNyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbW9kZWwgdG8gZmluZS10dW5lLiBZb3UgY2FuIHNlbGVjdCBvbmUgb2YgdGhlXG4gICAqIFtzdXBwb3J0ZWQgbW9kZWxzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvZmluZS10dW5pbmcvd2hhdC1tb2RlbHMtY2FuLWJlLWZpbmUtdHVuZWQpLlxuICAgKi9cbiAgbW9kZWw6IChzdHJpbmcgJiB7fSkgfCAnYmFiYmFnZS0wMDInIHwgJ2RhdmluY2ktMDAyJyB8ICdncHQtMy41LXR1cmJvJztcblxuICAvKipcbiAgICogVGhlIElEIG9mIGFuIHVwbG9hZGVkIGZpbGUgdGhhdCBjb250YWlucyB0cmFpbmluZyBkYXRhLlxuICAgKlxuICAgKiBTZWUgW3VwbG9hZCBmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzL2NyZWF0ZSlcbiAgICogZm9yIGhvdyB0byB1cGxvYWQgYSBmaWxlLlxuICAgKlxuICAgKiBZb3VyIGRhdGFzZXQgbXVzdCBiZSBmb3JtYXR0ZWQgYXMgYSBKU09OTCBmaWxlLiBBZGRpdGlvbmFsbHksIHlvdSBtdXN0IHVwbG9hZFxuICAgKiB5b3VyIGZpbGUgd2l0aCB0aGUgcHVycG9zZSBgZmluZS10dW5lYC5cbiAgICpcbiAgICogU2VlIHRoZSBbZmluZS10dW5pbmcgZ3VpZGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9maW5lLXR1bmluZylcbiAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIHRyYWluaW5nX2ZpbGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGh5cGVycGFyYW1ldGVycyB1c2VkIGZvciB0aGUgZmluZS10dW5pbmcgam9iLlxuICAgKi9cbiAgaHlwZXJwYXJhbWV0ZXJzPzogSm9iQ3JlYXRlUGFyYW1zLkh5cGVycGFyYW1ldGVycztcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGludGVncmF0aW9ucyB0byBlbmFibGUgZm9yIHlvdXIgZmluZS10dW5pbmcgam9iLlxuICAgKi9cbiAgaW50ZWdyYXRpb25zPzogQXJyYXk8Sm9iQ3JlYXRlUGFyYW1zLkludGVncmF0aW9uPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBzZWVkIGNvbnRyb2xzIHRoZSByZXByb2R1Y2liaWxpdHkgb2YgdGhlIGpvYi4gUGFzc2luZyBpbiB0aGUgc2FtZSBzZWVkIGFuZFxuICAgKiBqb2IgcGFyYW1ldGVycyBzaG91bGQgcHJvZHVjZSB0aGUgc2FtZSByZXN1bHRzLCBidXQgbWF5IGRpZmZlciBpbiByYXJlIGNhc2VzLiBJZlxuICAgKiBhIHNlZWQgaXMgbm90IHNwZWNpZmllZCwgb25lIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciB5b3UuXG4gICAqL1xuICBzZWVkPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBzdHJpbmcgb2YgdXAgdG8gMTggY2hhcmFjdGVycyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8geW91ciBmaW5lLXR1bmVkIG1vZGVsXG4gICAqIG5hbWUuXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBhIGBzdWZmaXhgIG9mIFwiY3VzdG9tLW1vZGVsLW5hbWVcIiB3b3VsZCBwcm9kdWNlIGEgbW9kZWwgbmFtZSBsaWtlXG4gICAqIGBmdDpncHQtMy41LXR1cmJvOm9wZW5haTpjdXN0b20tbW9kZWwtbmFtZTo3cDRsVVJlbGAuXG4gICAqL1xuICBzdWZmaXg/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgYW4gdXBsb2FkZWQgZmlsZSB0aGF0IGNvbnRhaW5zIHZhbGlkYXRpb24gZGF0YS5cbiAgICpcbiAgICogSWYgeW91IHByb3ZpZGUgdGhpcyBmaWxlLCB0aGUgZGF0YSBpcyB1c2VkIHRvIGdlbmVyYXRlIHZhbGlkYXRpb24gbWV0cmljc1xuICAgKiBwZXJpb2RpY2FsbHkgZHVyaW5nIGZpbmUtdHVuaW5nLiBUaGVzZSBtZXRyaWNzIGNhbiBiZSB2aWV3ZWQgaW4gdGhlIGZpbmUtdHVuaW5nXG4gICAqIHJlc3VsdHMgZmlsZS4gVGhlIHNhbWUgZGF0YSBzaG91bGQgbm90IGJlIHByZXNlbnQgaW4gYm90aCB0cmFpbiBhbmQgdmFsaWRhdGlvblxuICAgKiBmaWxlcy5cbiAgICpcbiAgICogWW91ciBkYXRhc2V0IG11c3QgYmUgZm9ybWF0dGVkIGFzIGEgSlNPTkwgZmlsZS4gWW91IG11c3QgdXBsb2FkIHlvdXIgZmlsZSB3aXRoXG4gICAqIHRoZSBwdXJwb3NlIGBmaW5lLXR1bmVgLlxuICAgKlxuICAgKiBTZWUgdGhlIFtmaW5lLXR1bmluZyBndWlkZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL2ZpbmUtdHVuaW5nKVxuICAgKiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgdmFsaWRhdGlvbl9maWxlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBKb2JDcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGh5cGVycGFyYW1ldGVycyB1c2VkIGZvciB0aGUgZmluZS10dW5pbmcgam9iLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBIeXBlcnBhcmFtZXRlcnMge1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBleGFtcGxlcyBpbiBlYWNoIGJhdGNoLiBBIGxhcmdlciBiYXRjaCBzaXplIG1lYW5zIHRoYXQgbW9kZWxcbiAgICAgKiBwYXJhbWV0ZXJzIGFyZSB1cGRhdGVkIGxlc3MgZnJlcXVlbnRseSwgYnV0IHdpdGggbG93ZXIgdmFyaWFuY2UuXG4gICAgICovXG4gICAgYmF0Y2hfc2l6ZT86ICdhdXRvJyB8IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFNjYWxpbmcgZmFjdG9yIGZvciB0aGUgbGVhcm5pbmcgcmF0ZS4gQSBzbWFsbGVyIGxlYXJuaW5nIHJhdGUgbWF5IGJlIHVzZWZ1bCB0b1xuICAgICAqIGF2b2lkIG92ZXJmaXR0aW5nLlxuICAgICAqL1xuICAgIGxlYXJuaW5nX3JhdGVfbXVsdGlwbGllcj86ICdhdXRvJyB8IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZXBvY2hzIHRvIHRyYWluIHRoZSBtb2RlbCBmb3IuIEFuIGVwb2NoIHJlZmVycyB0byBvbmUgZnVsbCBjeWNsZVxuICAgICAqIHRocm91Z2ggdGhlIHRyYWluaW5nIGRhdGFzZXQuXG4gICAgICovXG4gICAgbl9lcG9jaHM/OiAnYXV0bycgfCBudW1iZXI7XG4gIH1cblxuICBleHBvcnQgaW50ZXJmYWNlIEludGVncmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBpbnRlZ3JhdGlvbiB0byBlbmFibGUuIEN1cnJlbnRseSwgb25seSBcIndhbmRiXCIgKFdlaWdodHMgYW5kIEJpYXNlcylcbiAgICAgKiBpcyBzdXBwb3J0ZWQuXG4gICAgICovXG4gICAgdHlwZTogJ3dhbmRiJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0aW5ncyBmb3IgeW91ciBpbnRlZ3JhdGlvbiB3aXRoIFdlaWdodHMgYW5kIEJpYXNlcy4gVGhpcyBwYXlsb2FkXG4gICAgICogc3BlY2lmaWVzIHRoZSBwcm9qZWN0IHRoYXQgbWV0cmljcyB3aWxsIGJlIHNlbnQgdG8uIE9wdGlvbmFsbHksIHlvdSBjYW4gc2V0IGFuXG4gICAgICogZXhwbGljaXQgZGlzcGxheSBuYW1lIGZvciB5b3VyIHJ1biwgYWRkIHRhZ3MgdG8geW91ciBydW4sIGFuZCBzZXQgYSBkZWZhdWx0XG4gICAgICogZW50aXR5ICh0ZWFtLCB1c2VybmFtZSwgZXRjKSB0byBiZSBhc3NvY2lhdGVkIHdpdGggeW91ciBydW4uXG4gICAgICovXG4gICAgd2FuZGI6IEludGVncmF0aW9uLldhbmRiO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBJbnRlZ3JhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHNldHRpbmdzIGZvciB5b3VyIGludGVncmF0aW9uIHdpdGggV2VpZ2h0cyBhbmQgQmlhc2VzLiBUaGlzIHBheWxvYWRcbiAgICAgKiBzcGVjaWZpZXMgdGhlIHByb2plY3QgdGhhdCBtZXRyaWNzIHdpbGwgYmUgc2VudCB0by4gT3B0aW9uYWxseSwgeW91IGNhbiBzZXQgYW5cbiAgICAgKiBleHBsaWNpdCBkaXNwbGF5IG5hbWUgZm9yIHlvdXIgcnVuLCBhZGQgdGFncyB0byB5b3VyIHJ1biwgYW5kIHNldCBhIGRlZmF1bHRcbiAgICAgKiBlbnRpdHkgKHRlYW0sIHVzZXJuYW1lLCBldGMpIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB5b3VyIHJ1bi5cbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIFdhbmRiIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCB0aGUgbmV3IHJ1biB3aWxsIGJlIGNyZWF0ZWQgdW5kZXIuXG4gICAgICAgKi9cbiAgICAgIHByb2plY3Q6IHN0cmluZztcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZW50aXR5IHRvIHVzZSBmb3IgdGhlIHJ1bi4gVGhpcyBhbGxvd3MgeW91IHRvIHNldCB0aGUgdGVhbSBvciB1c2VybmFtZSBvZlxuICAgICAgICogdGhlIFdhbmRCIHVzZXIgdGhhdCB5b3Ugd291bGQgbGlrZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJ1bi4gSWYgbm90IHNldCwgdGhlXG4gICAgICAgKiBkZWZhdWx0IGVudGl0eSBmb3IgdGhlIHJlZ2lzdGVyZWQgV2FuZEIgQVBJIGtleSBpcyB1c2VkLlxuICAgICAgICovXG4gICAgICBlbnRpdHk/OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgICAvKipcbiAgICAgICAqIEEgZGlzcGxheSBuYW1lIHRvIHNldCBmb3IgdGhlIHJ1bi4gSWYgbm90IHNldCwgd2Ugd2lsbCB1c2UgdGhlIEpvYiBJRCBhcyB0aGVcbiAgICAgICAqIG5hbWUuXG4gICAgICAgKi9cbiAgICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgICAvKipcbiAgICAgICAqIEEgbGlzdCBvZiB0YWdzIHRvIGJlIGF0dGFjaGVkIHRvIHRoZSBuZXdseSBjcmVhdGVkIHJ1bi4gVGhlc2UgdGFncyBhcmUgcGFzc2VkXG4gICAgICAgKiB0aHJvdWdoIGRpcmVjdGx5IHRvIFdhbmRCLiBTb21lIGRlZmF1bHQgdGFncyBhcmUgZ2VuZXJhdGVkIGJ5IE9wZW5BSTpcbiAgICAgICAqIFwib3BlbmFpL2ZpbmV0dW5lXCIsIFwib3BlbmFpL3tiYXNlLW1vZGVsfVwiLCBcIm9wZW5haS97ZnRqb2ItYWJjZGVmfVwiLlxuICAgICAgICovXG4gICAgICB0YWdzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBKb2JMaXN0UGFyYW1zIGV4dGVuZHMgQ3Vyc29yUGFnZVBhcmFtcyB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIEpvYkxpc3RFdmVudHNQYXJhbXMgZXh0ZW5kcyBDdXJzb3JQYWdlUGFyYW1zIHt9XG5cbmV4cG9ydCBuYW1lc3BhY2UgSm9icyB7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYiA9IEpvYnNBUEkuRmluZVR1bmluZ0pvYjtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iRXZlbnQgPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2JFdmVudDtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iSW50ZWdyYXRpb24gPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2JJbnRlZ3JhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbiA9IEpvYnNBUEkuRmluZVR1bmluZ0pvYldhbmRiSW50ZWdyYXRpb247XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYldhbmRiSW50ZWdyYXRpb25PYmplY3QgPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uT2JqZWN0O1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JzUGFnZSA9IEpvYnNBUEkuRmluZVR1bmluZ0pvYnNQYWdlO1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JFdmVudHNQYWdlID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iRXZlbnRzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBKb2JDcmVhdGVQYXJhbXMgPSBKb2JzQVBJLkpvYkNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBKb2JMaXN0UGFyYW1zID0gSm9ic0FQSS5Kb2JMaXN0UGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEpvYkxpc3RFdmVudHNQYXJhbXMgPSBKb2JzQVBJLkpvYkxpc3RFdmVudHNQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQ2hlY2twb2ludHMgPSBDaGVja3BvaW50c0FQSS5DaGVja3BvaW50cztcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iQ2hlY2twb2ludCA9IENoZWNrcG9pbnRzQVBJLkZpbmVUdW5pbmdKb2JDaGVja3BvaW50O1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JDaGVja3BvaW50c1BhZ2UgPSBDaGVja3BvaW50c0FQSS5GaW5lVHVuaW5nSm9iQ2hlY2twb2ludHNQYWdlO1xuICBleHBvcnQgaW1wb3J0IENoZWNrcG9pbnRMaXN0UGFyYW1zID0gQ2hlY2twb2ludHNBUEkuQ2hlY2twb2ludExpc3RQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tICcuLi8uLi9yZXNvdXJjZSc7XG5pbXBvcnQgKiBhcyBKb2JzQVBJIGZyb20gJy4vam9icy9qb2JzJztcblxuZXhwb3J0IGNsYXNzIEZpbmVUdW5pbmcgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIGpvYnM6IEpvYnNBUEkuSm9icyA9IG5ldyBKb2JzQVBJLkpvYnModGhpcy5fY2xpZW50KTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaW5lVHVuaW5nIHtcbiAgZXhwb3J0IGltcG9ydCBKb2JzID0gSm9ic0FQSS5Kb2JzO1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2IgPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2I7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYkV2ZW50ID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYkludGVncmF0aW9uID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iSW50ZWdyYXRpb247XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYldhbmRiSW50ZWdyYXRpb24gPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uT2JqZWN0ID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbk9iamVjdDtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9ic1BhZ2UgPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2JzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iRXZlbnRzUGFnZSA9IEpvYnNBUEkuRmluZVR1bmluZ0pvYkV2ZW50c1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgSm9iQ3JlYXRlUGFyYW1zID0gSm9ic0FQSS5Kb2JDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgSm9iTGlzdFBhcmFtcyA9IEpvYnNBUEkuSm9iTGlzdFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBKb2JMaXN0RXZlbnRzUGFyYW1zID0gSm9ic0FQSS5Kb2JMaXN0RXZlbnRzUGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uL3Jlc291cmNlJztcbmltcG9ydCAqIGFzIEltYWdlc0FQSSBmcm9tICcuL2ltYWdlcyc7XG5pbXBvcnQgeyB0eXBlIFVwbG9hZGFibGUsIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uL2NvcmUnO1xuXG5leHBvcnQgY2xhc3MgSW1hZ2VzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHZhcmlhdGlvbiBvZiBhIGdpdmVuIGltYWdlLlxuICAgKi9cbiAgY3JlYXRlVmFyaWF0aW9uKFxuICAgIGJvZHk6IEltYWdlQ3JlYXRlVmFyaWF0aW9uUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8SW1hZ2VzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9pbWFnZXMvdmFyaWF0aW9ucycsIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyh7IGJvZHksIC4uLm9wdGlvbnMgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gZWRpdGVkIG9yIGV4dGVuZGVkIGltYWdlIGdpdmVuIGFuIG9yaWdpbmFsIGltYWdlIGFuZCBhIHByb21wdC5cbiAgICovXG4gIGVkaXQoYm9keTogSW1hZ2VFZGl0UGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxJbWFnZXNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL2ltYWdlcy9lZGl0cycsIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyh7IGJvZHksIC4uLm9wdGlvbnMgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW1hZ2UgZ2l2ZW4gYSBwcm9tcHQuXG4gICAqL1xuICBnZW5lcmF0ZShib2R5OiBJbWFnZUdlbmVyYXRlUGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxJbWFnZXNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL2ltYWdlcy9nZW5lcmF0aW9ucycsIHsgYm9keSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHVybCBvciB0aGUgY29udGVudCBvZiBhbiBpbWFnZSBnZW5lcmF0ZWQgYnkgdGhlIE9wZW5BSSBBUEkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2Uge1xuICAvKipcbiAgICogVGhlIGJhc2U2NC1lbmNvZGVkIEpTT04gb2YgdGhlIGdlbmVyYXRlZCBpbWFnZSwgaWYgYHJlc3BvbnNlX2Zvcm1hdGAgaXNcbiAgICogYGI2NF9qc29uYC5cbiAgICovXG4gIGI2NF9qc29uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvbXB0IHRoYXQgd2FzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGltYWdlLCBpZiB0aGVyZSB3YXMgYW55IHJldmlzaW9uIHRvIHRoZVxuICAgKiBwcm9tcHQuXG4gICAqL1xuICByZXZpc2VkX3Byb21wdD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlLCBpZiBgcmVzcG9uc2VfZm9ybWF0YCBpcyBgdXJsYCAoZGVmYXVsdCkuXG4gICAqL1xuICB1cmw/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VzUmVzcG9uc2Uge1xuICBjcmVhdGVkOiBudW1iZXI7XG5cbiAgZGF0YTogQXJyYXk8SW1hZ2U+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlQ3JlYXRlVmFyaWF0aW9uUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBpbWFnZSB0byB1c2UgYXMgdGhlIGJhc2lzIGZvciB0aGUgdmFyaWF0aW9uKHMpLiBNdXN0IGJlIGEgdmFsaWQgUE5HIGZpbGUsXG4gICAqIGxlc3MgdGhhbiA0TUIsIGFuZCBzcXVhcmUuXG4gICAqL1xuICBpbWFnZTogVXBsb2FkYWJsZTtcblxuICAvKipcbiAgICogVGhlIG1vZGVsIHRvIHVzZSBmb3IgaW1hZ2UgZ2VuZXJhdGlvbi4gT25seSBgZGFsbC1lLTJgIGlzIHN1cHBvcnRlZCBhdCB0aGlzXG4gICAqIHRpbWUuXG4gICAqL1xuICBtb2RlbD86IChzdHJpbmcgJiB7fSkgfCAnZGFsbC1lLTInIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBpbWFnZXMgdG8gZ2VuZXJhdGUuIE11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMC4gRm9yIGBkYWxsLWUtM2AsIG9ubHlcbiAgICogYG49MWAgaXMgc3VwcG9ydGVkLlxuICAgKi9cbiAgbj86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIGdlbmVyYXRlZCBpbWFnZXMgYXJlIHJldHVybmVkLiBNdXN0IGJlIG9uZSBvZiBgdXJsYCBvclxuICAgKiBgYjY0X2pzb25gLiBVUkxzIGFyZSBvbmx5IHZhbGlkIGZvciA2MCBtaW51dGVzIGFmdGVyIHRoZSBpbWFnZSBoYXMgYmVlblxuICAgKiBnZW5lcmF0ZWQuXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiAndXJsJyB8ICdiNjRfanNvbicgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlcy4gTXVzdCBiZSBvbmUgb2YgYDI1NngyNTZgLCBgNTEyeDUxMmAsIG9yXG4gICAqIGAxMDI0eDEwMjRgLlxuICAgKi9cbiAgc2l6ZT86ICcyNTZ4MjU2JyB8ICc1MTJ4NTEyJyB8ICcxMDI0eDEwMjQnIHwgbnVsbDtcblxuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciByZXByZXNlbnRpbmcgeW91ciBlbmQtdXNlciwgd2hpY2ggY2FuIGhlbHAgT3BlbkFJIHRvIG1vbml0b3JcbiAgICogYW5kIGRldGVjdCBhYnVzZS5cbiAgICogW0xlYXJuIG1vcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9zYWZldHktYmVzdC1wcmFjdGljZXMvZW5kLXVzZXItaWRzKS5cbiAgICovXG4gIHVzZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VFZGl0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBpbWFnZSB0byBlZGl0LiBNdXN0IGJlIGEgdmFsaWQgUE5HIGZpbGUsIGxlc3MgdGhhbiA0TUIsIGFuZCBzcXVhcmUuIElmIG1hc2tcbiAgICogaXMgbm90IHByb3ZpZGVkLCBpbWFnZSBtdXN0IGhhdmUgdHJhbnNwYXJlbmN5LCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgdGhlIG1hc2suXG4gICAqL1xuICBpbWFnZTogVXBsb2FkYWJsZTtcblxuICAvKipcbiAgICogQSB0ZXh0IGRlc2NyaXB0aW9uIG9mIHRoZSBkZXNpcmVkIGltYWdlKHMpLiBUaGUgbWF4aW11bSBsZW5ndGggaXMgMTAwMFxuICAgKiBjaGFyYWN0ZXJzLlxuICAgKi9cbiAgcHJvbXB0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGFkZGl0aW9uYWwgaW1hZ2Ugd2hvc2UgZnVsbHkgdHJhbnNwYXJlbnQgYXJlYXMgKGUuZy4gd2hlcmUgYWxwaGEgaXMgemVybylcbiAgICogaW5kaWNhdGUgd2hlcmUgYGltYWdlYCBzaG91bGQgYmUgZWRpdGVkLiBNdXN0IGJlIGEgdmFsaWQgUE5HIGZpbGUsIGxlc3MgdGhhblxuICAgKiA0TUIsIGFuZCBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbnMgYXMgYGltYWdlYC5cbiAgICovXG4gIG1hc2s/OiBVcGxvYWRhYmxlO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgdG8gdXNlIGZvciBpbWFnZSBnZW5lcmF0aW9uLiBPbmx5IGBkYWxsLWUtMmAgaXMgc3VwcG9ydGVkIGF0IHRoaXNcbiAgICogdGltZS5cbiAgICovXG4gIG1vZGVsPzogKHN0cmluZyAmIHt9KSB8ICdkYWxsLWUtMicgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGltYWdlcyB0byBnZW5lcmF0ZS4gTXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwLlxuICAgKi9cbiAgbj86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIGdlbmVyYXRlZCBpbWFnZXMgYXJlIHJldHVybmVkLiBNdXN0IGJlIG9uZSBvZiBgdXJsYCBvclxuICAgKiBgYjY0X2pzb25gLiBVUkxzIGFyZSBvbmx5IHZhbGlkIGZvciA2MCBtaW51dGVzIGFmdGVyIHRoZSBpbWFnZSBoYXMgYmVlblxuICAgKiBnZW5lcmF0ZWQuXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiAndXJsJyB8ICdiNjRfanNvbicgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlcy4gTXVzdCBiZSBvbmUgb2YgYDI1NngyNTZgLCBgNTEyeDUxMmAsIG9yXG4gICAqIGAxMDI0eDEwMjRgLlxuICAgKi9cbiAgc2l6ZT86ICcyNTZ4MjU2JyB8ICc1MTJ4NTEyJyB8ICcxMDI0eDEwMjQnIHwgbnVsbDtcblxuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciByZXByZXNlbnRpbmcgeW91ciBlbmQtdXNlciwgd2hpY2ggY2FuIGhlbHAgT3BlbkFJIHRvIG1vbml0b3JcbiAgICogYW5kIGRldGVjdCBhYnVzZS5cbiAgICogW0xlYXJuIG1vcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9zYWZldHktYmVzdC1wcmFjdGljZXMvZW5kLXVzZXItaWRzKS5cbiAgICovXG4gIHVzZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VHZW5lcmF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIGRlc2lyZWQgaW1hZ2UocykuIFRoZSBtYXhpbXVtIGxlbmd0aCBpcyAxMDAwXG4gICAqIGNoYXJhY3RlcnMgZm9yIGBkYWxsLWUtMmAgYW5kIDQwMDAgY2hhcmFjdGVycyBmb3IgYGRhbGwtZS0zYC5cbiAgICovXG4gIHByb21wdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgdG8gdXNlIGZvciBpbWFnZSBnZW5lcmF0aW9uLlxuICAgKi9cbiAgbW9kZWw/OiAoc3RyaW5nICYge30pIHwgJ2RhbGwtZS0yJyB8ICdkYWxsLWUtMycgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGltYWdlcyB0byBnZW5lcmF0ZS4gTXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwLiBGb3IgYGRhbGwtZS0zYCwgb25seVxuICAgKiBgbj0xYCBpcyBzdXBwb3J0ZWQuXG4gICAqL1xuICBuPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHF1YWxpdHkgb2YgdGhlIGltYWdlIHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQuIGBoZGAgY3JlYXRlcyBpbWFnZXMgd2l0aCBmaW5lclxuICAgKiBkZXRhaWxzIGFuZCBncmVhdGVyIGNvbnNpc3RlbmN5IGFjcm9zcyB0aGUgaW1hZ2UuIFRoaXMgcGFyYW0gaXMgb25seSBzdXBwb3J0ZWRcbiAgICogZm9yIGBkYWxsLWUtM2AuXG4gICAqL1xuICBxdWFsaXR5PzogJ3N0YW5kYXJkJyB8ICdoZCc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIGdlbmVyYXRlZCBpbWFnZXMgYXJlIHJldHVybmVkLiBNdXN0IGJlIG9uZSBvZiBgdXJsYCBvclxuICAgKiBgYjY0X2pzb25gLiBVUkxzIGFyZSBvbmx5IHZhbGlkIGZvciA2MCBtaW51dGVzIGFmdGVyIHRoZSBpbWFnZSBoYXMgYmVlblxuICAgKiBnZW5lcmF0ZWQuXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiAndXJsJyB8ICdiNjRfanNvbicgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlcy4gTXVzdCBiZSBvbmUgb2YgYDI1NngyNTZgLCBgNTEyeDUxMmAsIG9yXG4gICAqIGAxMDI0eDEwMjRgIGZvciBgZGFsbC1lLTJgLiBNdXN0IGJlIG9uZSBvZiBgMTAyNHgxMDI0YCwgYDE3OTJ4MTAyNGAsIG9yXG4gICAqIGAxMDI0eDE3OTJgIGZvciBgZGFsbC1lLTNgIG1vZGVscy5cbiAgICovXG4gIHNpemU/OiAnMjU2eDI1NicgfCAnNTEyeDUxMicgfCAnMTAyNHgxMDI0JyB8ICcxNzkyeDEwMjQnIHwgJzEwMjR4MTc5MicgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc3R5bGUgb2YgdGhlIGdlbmVyYXRlZCBpbWFnZXMuIE11c3QgYmUgb25lIG9mIGB2aXZpZGAgb3IgYG5hdHVyYWxgLiBWaXZpZFxuICAgKiBjYXVzZXMgdGhlIG1vZGVsIHRvIGxlYW4gdG93YXJkcyBnZW5lcmF0aW5nIGh5cGVyLXJlYWwgYW5kIGRyYW1hdGljIGltYWdlcy5cbiAgICogTmF0dXJhbCBjYXVzZXMgdGhlIG1vZGVsIHRvIHByb2R1Y2UgbW9yZSBuYXR1cmFsLCBsZXNzIGh5cGVyLXJlYWwgbG9va2luZ1xuICAgKiBpbWFnZXMuIFRoaXMgcGFyYW0gaXMgb25seSBzdXBwb3J0ZWQgZm9yIGBkYWxsLWUtM2AuXG4gICAqL1xuICBzdHlsZT86ICd2aXZpZCcgfCAnbmF0dXJhbCcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIHJlcHJlc2VudGluZyB5b3VyIGVuZC11c2VyLCB3aGljaCBjYW4gaGVscCBPcGVuQUkgdG8gbW9uaXRvclxuICAgKiBhbmQgZGV0ZWN0IGFidXNlLlxuICAgKiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3NhZmV0eS1iZXN0LXByYWN0aWNlcy9lbmQtdXNlci1pZHMpLlxuICAgKi9cbiAgdXNlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBJbWFnZXMge1xuICBleHBvcnQgaW1wb3J0IEltYWdlID0gSW1hZ2VzQVBJLkltYWdlO1xuICBleHBvcnQgaW1wb3J0IEltYWdlc1Jlc3BvbnNlID0gSW1hZ2VzQVBJLkltYWdlc1Jlc3BvbnNlO1xuICBleHBvcnQgaW1wb3J0IEltYWdlQ3JlYXRlVmFyaWF0aW9uUGFyYW1zID0gSW1hZ2VzQVBJLkltYWdlQ3JlYXRlVmFyaWF0aW9uUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEltYWdlRWRpdFBhcmFtcyA9IEltYWdlc0FQSS5JbWFnZUVkaXRQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VHZW5lcmF0ZVBhcmFtcyA9IEltYWdlc0FQSS5JbWFnZUdlbmVyYXRlUGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uL3Jlc291cmNlJztcbmltcG9ydCAqIGFzIE1vZGVsc0FQSSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBQYWdlIH0gZnJvbSAnLi4vcGFnaW5hdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBNb2RlbHMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBtb2RlbCBpbnN0YW5jZSwgcHJvdmlkaW5nIGJhc2ljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtb2RlbCBzdWNoIGFzXG4gICAqIHRoZSBvd25lciBhbmQgcGVybWlzc2lvbmluZy5cbiAgICovXG4gIHJldHJpZXZlKG1vZGVsOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPE1vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXQoYC9tb2RlbHMvJHttb2RlbH1gLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBtb2RlbHMsIGFuZCBwcm92aWRlcyBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoXG4gICAqIG9uZSBzdWNoIGFzIHRoZSBvd25lciBhbmQgYXZhaWxhYmlsaXR5LlxuICAgKi9cbiAgbGlzdChvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuUGFnZVByb21pc2U8TW9kZWxzUGFnZSwgTW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoJy9tb2RlbHMnLCBNb2RlbHNQYWdlLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBmaW5lLXR1bmVkIG1vZGVsLiBZb3UgbXVzdCBoYXZlIHRoZSBPd25lciByb2xlIGluIHlvdXIgb3JnYW5pemF0aW9uIHRvXG4gICAqIGRlbGV0ZSBhIG1vZGVsLlxuICAgKi9cbiAgZGVsKG1vZGVsOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPE1vZGVsRGVsZXRlZD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZGVsZXRlKGAvbW9kZWxzLyR7bW9kZWx9YCwgb3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBOb3RlOiBubyBwYWdpbmF0aW9uIGFjdHVhbGx5IG9jY3VycyB5ZXQsIHRoaXMgaXMgZm9yIGZvcndhcmRzLWNvbXBhdGliaWxpdHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbHNQYWdlIGV4dGVuZHMgUGFnZTxNb2RlbD4ge31cblxuLyoqXG4gKiBEZXNjcmliZXMgYW4gT3BlbkFJIG1vZGVsIG9mZmVyaW5nIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgQVBJLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsIHtcbiAgLyoqXG4gICAqIFRoZSBtb2RlbCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiB0aGUgQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgd2hlbiB0aGUgbW9kZWwgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIFwibW9kZWxcIi5cbiAgICovXG4gIG9iamVjdDogJ21vZGVsJztcblxuICAvKipcbiAgICogVGhlIG9yZ2FuaXphdGlvbiB0aGF0IG93bnMgdGhlIG1vZGVsLlxuICAgKi9cbiAgb3duZWRfYnk6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2RlbERlbGV0ZWQge1xuICBpZDogc3RyaW5nO1xuXG4gIGRlbGV0ZWQ6IGJvb2xlYW47XG5cbiAgb2JqZWN0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTW9kZWxzIHtcbiAgZXhwb3J0IGltcG9ydCBNb2RlbCA9IE1vZGVsc0FQSS5Nb2RlbDtcbiAgZXhwb3J0IGltcG9ydCBNb2RlbERlbGV0ZWQgPSBNb2RlbHNBUEkuTW9kZWxEZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IE1vZGVsc1BhZ2UgPSBNb2RlbHNBUEkuTW9kZWxzUGFnZTtcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tICcuLi9yZXNvdXJjZSc7XG5pbXBvcnQgKiBhcyBNb2RlcmF0aW9uc0FQSSBmcm9tICcuL21vZGVyYXRpb25zJztcblxuZXhwb3J0IGNsYXNzIE1vZGVyYXRpb25zIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQ2xhc3NpZmllcyBpZiB0ZXh0IGlzIHBvdGVudGlhbGx5IGhhcm1mdWwuXG4gICAqL1xuICBjcmVhdGUoXG4gICAgYm9keTogTW9kZXJhdGlvbkNyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPE1vZGVyYXRpb25DcmVhdGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL21vZGVyYXRpb25zJywgeyBib2R5LCAuLi5vcHRpb25zIH0pO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZXJhdGlvbiB7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdGhlIGNhdGVnb3JpZXMsIGFuZCB3aGV0aGVyIHRoZXkgYXJlIGZsYWdnZWQgb3Igbm90LlxuICAgKi9cbiAgY2F0ZWdvcmllczogTW9kZXJhdGlvbi5DYXRlZ29yaWVzO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdGhlIGNhdGVnb3JpZXMgYWxvbmcgd2l0aCB0aGVpciBzY29yZXMgYXMgcHJlZGljdGVkIGJ5IG1vZGVsLlxuICAgKi9cbiAgY2F0ZWdvcnlfc2NvcmVzOiBNb2RlcmF0aW9uLkNhdGVnb3J5U2NvcmVzO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFueSBvZiB0aGUgYmVsb3cgY2F0ZWdvcmllcyBhcmUgZmxhZ2dlZC5cbiAgICovXG4gIGZsYWdnZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTW9kZXJhdGlvbiB7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdGhlIGNhdGVnb3JpZXMsIGFuZCB3aGV0aGVyIHRoZXkgYXJlIGZsYWdnZWQgb3Igbm90LlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yaWVzIHtcbiAgICAvKipcbiAgICAgKiBDb250ZW50IHRoYXQgZXhwcmVzc2VzLCBpbmNpdGVzLCBvciBwcm9tb3RlcyBoYXJhc3NpbmcgbGFuZ3VhZ2UgdG93YXJkcyBhbnlcbiAgICAgKiB0YXJnZXQuXG4gICAgICovXG4gICAgaGFyYXNzbWVudDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEhhcmFzc21lbnQgY29udGVudCB0aGF0IGFsc28gaW5jbHVkZXMgdmlvbGVuY2Ugb3Igc2VyaW91cyBoYXJtIHRvd2FyZHMgYW55XG4gICAgICogdGFyZ2V0LlxuICAgICAqL1xuICAgICdoYXJhc3NtZW50L3RocmVhdGVuaW5nJzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIENvbnRlbnQgdGhhdCBleHByZXNzZXMsIGluY2l0ZXMsIG9yIHByb21vdGVzIGhhdGUgYmFzZWQgb24gcmFjZSwgZ2VuZGVyLFxuICAgICAqIGV0aG5pY2l0eSwgcmVsaWdpb24sIG5hdGlvbmFsaXR5LCBzZXh1YWwgb3JpZW50YXRpb24sIGRpc2FiaWxpdHkgc3RhdHVzLCBvclxuICAgICAqIGNhc3RlLiBIYXRlZnVsIGNvbnRlbnQgYWltZWQgYXQgbm9uLXByb3RlY3RlZCBncm91cHMgKGUuZy4sIGNoZXNzIHBsYXllcnMpIGlzXG4gICAgICogaGFyYXNzbWVudC5cbiAgICAgKi9cbiAgICBoYXRlOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogSGF0ZWZ1bCBjb250ZW50IHRoYXQgYWxzbyBpbmNsdWRlcyB2aW9sZW5jZSBvciBzZXJpb3VzIGhhcm0gdG93YXJkcyB0aGUgdGFyZ2V0ZWRcbiAgICAgKiBncm91cCBiYXNlZCBvbiByYWNlLCBnZW5kZXIsIGV0aG5pY2l0eSwgcmVsaWdpb24sIG5hdGlvbmFsaXR5LCBzZXh1YWxcbiAgICAgKiBvcmllbnRhdGlvbiwgZGlzYWJpbGl0eSBzdGF0dXMsIG9yIGNhc3RlLlxuICAgICAqL1xuICAgICdoYXRlL3RocmVhdGVuaW5nJzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIENvbnRlbnQgdGhhdCBwcm9tb3RlcywgZW5jb3VyYWdlcywgb3IgZGVwaWN0cyBhY3RzIG9mIHNlbGYtaGFybSwgc3VjaCBhc1xuICAgICAqIHN1aWNpZGUsIGN1dHRpbmcsIGFuZCBlYXRpbmcgZGlzb3JkZXJzLlxuICAgICAqL1xuICAgICdzZWxmLWhhcm0nOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ29udGVudCB0aGF0IGVuY291cmFnZXMgcGVyZm9ybWluZyBhY3RzIG9mIHNlbGYtaGFybSwgc3VjaCBhcyBzdWljaWRlLCBjdXR0aW5nLFxuICAgICAqIGFuZCBlYXRpbmcgZGlzb3JkZXJzLCBvciB0aGF0IGdpdmVzIGluc3RydWN0aW9ucyBvciBhZHZpY2Ugb24gaG93IHRvIGNvbW1pdCBzdWNoXG4gICAgICogYWN0cy5cbiAgICAgKi9cbiAgICAnc2VsZi1oYXJtL2luc3RydWN0aW9ucyc6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBDb250ZW50IHdoZXJlIHRoZSBzcGVha2VyIGV4cHJlc3NlcyB0aGF0IHRoZXkgYXJlIGVuZ2FnaW5nIG9yIGludGVuZCB0byBlbmdhZ2VcbiAgICAgKiBpbiBhY3RzIG9mIHNlbGYtaGFybSwgc3VjaCBhcyBzdWljaWRlLCBjdXR0aW5nLCBhbmQgZWF0aW5nIGRpc29yZGVycy5cbiAgICAgKi9cbiAgICAnc2VsZi1oYXJtL2ludGVudCc6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBDb250ZW50IG1lYW50IHRvIGFyb3VzZSBzZXh1YWwgZXhjaXRlbWVudCwgc3VjaCBhcyB0aGUgZGVzY3JpcHRpb24gb2Ygc2V4dWFsXG4gICAgICogYWN0aXZpdHksIG9yIHRoYXQgcHJvbW90ZXMgc2V4dWFsIHNlcnZpY2VzIChleGNsdWRpbmcgc2V4IGVkdWNhdGlvbiBhbmRcbiAgICAgKiB3ZWxsbmVzcykuXG4gICAgICovXG4gICAgc2V4dWFsOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU2V4dWFsIGNvbnRlbnQgdGhhdCBpbmNsdWRlcyBhbiBpbmRpdmlkdWFsIHdobyBpcyB1bmRlciAxOCB5ZWFycyBvbGQuXG4gICAgICovXG4gICAgJ3NleHVhbC9taW5vcnMnOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ29udGVudCB0aGF0IGRlcGljdHMgZGVhdGgsIHZpb2xlbmNlLCBvciBwaHlzaWNhbCBpbmp1cnkuXG4gICAgICovXG4gICAgdmlvbGVuY2U6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBDb250ZW50IHRoYXQgZGVwaWN0cyBkZWF0aCwgdmlvbGVuY2UsIG9yIHBoeXNpY2FsIGluanVyeSBpbiBncmFwaGljIGRldGFpbC5cbiAgICAgKi9cbiAgICAndmlvbGVuY2UvZ3JhcGhpYyc6IGJvb2xlYW47XG4gIH1cblxuICAvKipcbiAgICogQSBsaXN0IG9mIHRoZSBjYXRlZ29yaWVzIGFsb25nIHdpdGggdGhlaXIgc2NvcmVzIGFzIHByZWRpY3RlZCBieSBtb2RlbC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcnlTY29yZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICdoYXJhc3NtZW50Jy5cbiAgICAgKi9cbiAgICBoYXJhc3NtZW50OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgZm9yIHRoZSBjYXRlZ29yeSAnaGFyYXNzbWVudC90aHJlYXRlbmluZycuXG4gICAgICovXG4gICAgJ2hhcmFzc21lbnQvdGhyZWF0ZW5pbmcnOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgZm9yIHRoZSBjYXRlZ29yeSAnaGF0ZScuXG4gICAgICovXG4gICAgaGF0ZTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIGZvciB0aGUgY2F0ZWdvcnkgJ2hhdGUvdGhyZWF0ZW5pbmcnLlxuICAgICAqL1xuICAgICdoYXRlL3RocmVhdGVuaW5nJzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIGZvciB0aGUgY2F0ZWdvcnkgJ3NlbGYtaGFybScuXG4gICAgICovXG4gICAgJ3NlbGYtaGFybSc6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICdzZWxmLWhhcm0vaW5zdHJ1Y3Rpb25zJy5cbiAgICAgKi9cbiAgICAnc2VsZi1oYXJtL2luc3RydWN0aW9ucyc6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICdzZWxmLWhhcm0vaW50ZW50Jy5cbiAgICAgKi9cbiAgICAnc2VsZi1oYXJtL2ludGVudCc6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICdzZXh1YWwnLlxuICAgICAqL1xuICAgIHNleHVhbDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIGZvciB0aGUgY2F0ZWdvcnkgJ3NleHVhbC9taW5vcnMnLlxuICAgICAqL1xuICAgICdzZXh1YWwvbWlub3JzJzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIGZvciB0aGUgY2F0ZWdvcnkgJ3Zpb2xlbmNlJy5cbiAgICAgKi9cbiAgICB2aW9sZW5jZTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIGZvciB0aGUgY2F0ZWdvcnkgJ3Zpb2xlbmNlL2dyYXBoaWMnLlxuICAgICAqL1xuICAgICd2aW9sZW5jZS9ncmFwaGljJzogbnVtYmVyO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBpZiBhIGdpdmVuIHRleHQgaW5wdXQgaXMgcG90ZW50aWFsbHkgaGFybWZ1bC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlcmF0aW9uQ3JlYXRlUmVzcG9uc2Uge1xuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbW9kZXJhdGlvbiByZXF1ZXN0LlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vZGVsIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIG1vZGVyYXRpb24gcmVzdWx0cy5cbiAgICovXG4gIG1vZGVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBtb2RlcmF0aW9uIG9iamVjdHMuXG4gICAqL1xuICByZXN1bHRzOiBBcnJheTxNb2RlcmF0aW9uPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2RlcmF0aW9uQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCB0ZXh0IHRvIGNsYXNzaWZ5XG4gICAqL1xuICBpbnB1dDogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPjtcblxuICAvKipcbiAgICogVHdvIGNvbnRlbnQgbW9kZXJhdGlvbnMgbW9kZWxzIGFyZSBhdmFpbGFibGU6IGB0ZXh0LW1vZGVyYXRpb24tc3RhYmxlYCBhbmRcbiAgICogYHRleHQtbW9kZXJhdGlvbi1sYXRlc3RgLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBpcyBgdGV4dC1tb2RlcmF0aW9uLWxhdGVzdGAgd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVwZ3JhZGVkXG4gICAqIG92ZXIgdGltZS4gVGhpcyBlbnN1cmVzIHlvdSBhcmUgYWx3YXlzIHVzaW5nIG91ciBtb3N0IGFjY3VyYXRlIG1vZGVsLiBJZiB5b3UgdXNlXG4gICAqIGB0ZXh0LW1vZGVyYXRpb24tc3RhYmxlYCwgd2Ugd2lsbCBwcm92aWRlIGFkdmFuY2VkIG5vdGljZSBiZWZvcmUgdXBkYXRpbmcgdGhlXG4gICAqIG1vZGVsLiBBY2N1cmFjeSBvZiBgdGV4dC1tb2RlcmF0aW9uLXN0YWJsZWAgbWF5IGJlIHNsaWdodGx5IGxvd2VyIHRoYW4gZm9yXG4gICAqIGB0ZXh0LW1vZGVyYXRpb24tbGF0ZXN0YC5cbiAgICovXG4gIG1vZGVsPzogKHN0cmluZyAmIHt9KSB8ICd0ZXh0LW1vZGVyYXRpb24tbGF0ZXN0JyB8ICd0ZXh0LW1vZGVyYXRpb24tc3RhYmxlJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBNb2RlcmF0aW9ucyB7XG4gIGV4cG9ydCBpbXBvcnQgTW9kZXJhdGlvbiA9IE1vZGVyYXRpb25zQVBJLk1vZGVyYXRpb247XG4gIGV4cG9ydCBpbXBvcnQgTW9kZXJhdGlvbkNyZWF0ZVJlc3BvbnNlID0gTW9kZXJhdGlvbnNBUEkuTW9kZXJhdGlvbkNyZWF0ZVJlc3BvbnNlO1xuICBleHBvcnQgaW1wb3J0IE1vZGVyYXRpb25DcmVhdGVQYXJhbXMgPSBNb2RlcmF0aW9uc0FQSS5Nb2RlcmF0aW9uQ3JlYXRlUGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi9jb3JlJztcbmltcG9ydCAqIGFzIEVycm9ycyBmcm9tICcuL2Vycm9yJztcbmltcG9ydCB7IHR5cGUgQWdlbnQsIHR5cGUgUmVxdWVzdEluaXQgfSBmcm9tICcuL19zaGltcy9pbmRleCc7XG5pbXBvcnQgKiBhcyBVcGxvYWRzIGZyb20gJy4vdXBsb2Fkcyc7XG5pbXBvcnQgKiBhcyBQYWdpbmF0aW9uIGZyb20gJy4vcGFnaW5hdGlvbic7XG5pbXBvcnQgKiBhcyBBUEkgZnJvbSAnLi9yZXNvdXJjZXMvaW5kZXgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudE9wdGlvbnMge1xuICAvKipcbiAgICogRGVmYXVsdHMgdG8gcHJvY2Vzcy5lbnZbJ09QRU5BSV9BUElfS0VZJ10uXG4gICAqL1xuICBhcGlLZXk/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIERlZmF1bHRzIHRvIHByb2Nlc3MuZW52WydPUEVOQUlfT1JHX0lEJ10uXG4gICAqL1xuICBvcmdhbml6YXRpb24/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0cyB0byBwcm9jZXNzLmVudlsnT1BFTkFJX1BST0pFQ1RfSUQnXS5cbiAgICovXG4gIHByb2plY3Q/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBiYXNlIFVSTCBmb3IgdGhlIEFQSSwgZS5nLiwgXCJodHRwczovL2FwaS5leGFtcGxlLmNvbS92Mi9cIlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBwcm9jZXNzLmVudlsnT1BFTkFJX0JBU0VfVVJMJ10uXG4gICAqL1xuICBiYXNlVVJMPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhhdCB0aGUgY2xpZW50IHNob3VsZCB3YWl0IGZvciBhIHJlc3BvbnNlXG4gICAqIGZyb20gdGhlIHNlcnZlciBiZWZvcmUgdGltaW5nIG91dCBhIHNpbmdsZSByZXF1ZXN0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgcmVxdWVzdCB0aW1lb3V0cyBhcmUgcmV0cmllZCBieSBkZWZhdWx0LCBzbyBpbiBhIHdvcnN0LWNhc2Ugc2NlbmFyaW8geW91IG1heSB3YWl0XG4gICAqIG11Y2ggbG9uZ2VyIHRoYW4gdGhpcyB0aW1lb3V0IGJlZm9yZSB0aGUgcHJvbWlzZSBzdWNjZWVkcyBvciBmYWlscy5cbiAgICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEFuIEhUVFAgYWdlbnQgdXNlZCB0byBtYW5hZ2UgSFRUUChTKSBjb25uZWN0aW9ucy5cbiAgICpcbiAgICogSWYgbm90IHByb3ZpZGVkLCBhbiBhZ2VudCB3aWxsIGJlIGNvbnN0cnVjdGVkIGJ5IGRlZmF1bHQgaW4gdGhlIE5vZGUuanMgZW52aXJvbm1lbnQsXG4gICAqIG90aGVyd2lzZSBubyBhZ2VudCBpcyB1c2VkLlxuICAgKi9cbiAgaHR0cEFnZW50PzogQWdlbnQ7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBjdXN0b20gYGZldGNoYCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogSWYgbm90IHByb3ZpZGVkLCB3ZSB1c2UgYG5vZGUtZmV0Y2hgIG9uIE5vZGUuanMgYW5kIG90aGVyd2lzZSBleHBlY3QgdGhhdCBgZmV0Y2hgIGlzXG4gICAqIGRlZmluZWQgZ2xvYmFsbHkuXG4gICAqL1xuICBmZXRjaD86IENvcmUuRmV0Y2ggfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSBjbGllbnQgd2lsbCByZXRyeSBhIHJlcXVlc3QgaW4gY2FzZSBvZiBhXG4gICAqIHRlbXBvcmFyeSBmYWlsdXJlLCBsaWtlIGEgbmV0d29yayBlcnJvciBvciBhIDVYWCBlcnJvciBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IDJcbiAgICovXG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgaGVhZGVycyB0byBpbmNsdWRlIHdpdGggZXZlcnkgcmVxdWVzdCB0byB0aGUgQVBJLlxuICAgKlxuICAgKiBUaGVzZSBjYW4gYmUgcmVtb3ZlZCBpbiBpbmRpdmlkdWFsIHJlcXVlc3RzIGJ5IGV4cGxpY2l0bHkgc2V0dGluZyB0aGVcbiAgICogaGVhZGVyIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbiByZXF1ZXN0IG9wdGlvbnMuXG4gICAqL1xuICBkZWZhdWx0SGVhZGVycz86IENvcmUuSGVhZGVycztcblxuICAvKipcbiAgICogRGVmYXVsdCBxdWVyeSBwYXJhbWV0ZXJzIHRvIGluY2x1ZGUgd2l0aCBldmVyeSByZXF1ZXN0IHRvIHRoZSBBUEkuXG4gICAqXG4gICAqIFRoZXNlIGNhbiBiZSByZW1vdmVkIGluIGluZGl2aWR1YWwgcmVxdWVzdHMgYnkgZXhwbGljaXRseSBzZXR0aW5nIHRoZVxuICAgKiBwYXJhbSB0byBgdW5kZWZpbmVkYCBpbiByZXF1ZXN0IG9wdGlvbnMuXG4gICAqL1xuICBkZWZhdWx0UXVlcnk/OiBDb3JlLkRlZmF1bHRRdWVyeTtcblxuICAvKipcbiAgICogQnkgZGVmYXVsdCwgY2xpZW50LXNpZGUgdXNlIG9mIHRoaXMgbGlicmFyeSBpcyBub3QgYWxsb3dlZCwgYXMgaXQgcmlza3MgZXhwb3NpbmcgeW91ciBzZWNyZXQgQVBJIGNyZWRlbnRpYWxzIHRvIGF0dGFja2Vycy5cbiAgICogT25seSBzZXQgdGhpcyBvcHRpb24gdG8gYHRydWVgIGlmIHlvdSB1bmRlcnN0YW5kIHRoZSByaXNrcyBhbmQgaGF2ZSBhcHByb3ByaWF0ZSBtaXRpZ2F0aW9ucyBpbiBwbGFjZS5cbiAgICovXG4gIGRhbmdlcm91c2x5QWxsb3dCcm93c2VyPzogYm9vbGVhbjtcbn1cblxuLyoqIEFQSSBDbGllbnQgZm9yIGludGVyZmFjaW5nIHdpdGggdGhlIE9wZW5BSSBBUEkuICovXG5leHBvcnQgY2xhc3MgT3BlbkFJIGV4dGVuZHMgQ29yZS5BUElDbGllbnQge1xuICBhcGlLZXk6IHN0cmluZztcbiAgb3JnYW5pemF0aW9uOiBzdHJpbmcgfCBudWxsO1xuICBwcm9qZWN0OiBzdHJpbmcgfCBudWxsO1xuXG4gIHByaXZhdGUgX29wdGlvbnM6IENsaWVudE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEFQSSBDbGllbnQgZm9yIGludGVyZmFjaW5nIHdpdGggdGhlIE9wZW5BSSBBUEkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBbb3B0cy5hcGlLZXk9cHJvY2Vzcy5lbnZbJ09QRU5BSV9BUElfS0VZJ10gPz8gdW5kZWZpbmVkXVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcHRzLm9yZ2FuaXphdGlvbj1wcm9jZXNzLmVudlsnT1BFTkFJX09SR19JRCddID8/IG51bGxdXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29wdHMucHJvamVjdD1wcm9jZXNzLmVudlsnT1BFTkFJX1BST0pFQ1RfSUQnXSA/PyBudWxsXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYmFzZVVSTD1wcm9jZXNzLmVudlsnT1BFTkFJX0JBU0VfVVJMJ10gPz8gaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MV0gLSBPdmVycmlkZSB0aGUgZGVmYXVsdCBiYXNlIFVSTCBmb3IgdGhlIEFQSS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnRpbWVvdXQ9MTAgbWludXRlc10gLSBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSB0aGUgY2xpZW50IHdpbGwgd2FpdCBmb3IgYSByZXNwb25zZSBiZWZvcmUgdGltaW5nIG91dC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmh0dHBBZ2VudF0gLSBBbiBIVFRQIGFnZW50IHVzZWQgdG8gbWFuYWdlIEhUVFAocykgY29ubmVjdGlvbnMuXG4gICAqIEBwYXJhbSB7Q29yZS5GZXRjaH0gW29wdHMuZmV0Y2hdIC0gU3BlY2lmeSBhIGN1c3RvbSBgZmV0Y2hgIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW29wdHMubWF4UmV0cmllcz0yXSAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGUgY2xpZW50IHdpbGwgcmV0cnkgYSByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge0NvcmUuSGVhZGVyc30gb3B0cy5kZWZhdWx0SGVhZGVycyAtIERlZmF1bHQgaGVhZGVycyB0byBpbmNsdWRlIHdpdGggZXZlcnkgcmVxdWVzdCB0byB0aGUgQVBJLlxuICAgKiBAcGFyYW0ge0NvcmUuRGVmYXVsdFF1ZXJ5fSBvcHRzLmRlZmF1bHRRdWVyeSAtIERlZmF1bHQgcXVlcnkgcGFyYW1ldGVycyB0byBpbmNsdWRlIHdpdGggZXZlcnkgcmVxdWVzdCB0byB0aGUgQVBJLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmRhbmdlcm91c2x5QWxsb3dCcm93c2VyPWZhbHNlXSAtIEJ5IGRlZmF1bHQsIGNsaWVudC1zaWRlIHVzZSBvZiB0aGlzIGxpYnJhcnkgaXMgbm90IGFsbG93ZWQsIGFzIGl0IHJpc2tzIGV4cG9zaW5nIHlvdXIgc2VjcmV0IEFQSSBjcmVkZW50aWFscyB0byBhdHRhY2tlcnMuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgYmFzZVVSTCA9IENvcmUucmVhZEVudignT1BFTkFJX0JBU0VfVVJMJyksXG4gICAgYXBpS2V5ID0gQ29yZS5yZWFkRW52KCdPUEVOQUlfQVBJX0tFWScpLFxuICAgIG9yZ2FuaXphdGlvbiA9IENvcmUucmVhZEVudignT1BFTkFJX09SR19JRCcpID8/IG51bGwsXG4gICAgcHJvamVjdCA9IENvcmUucmVhZEVudignT1BFTkFJX1BST0pFQ1RfSUQnKSA/PyBudWxsLFxuICAgIC4uLm9wdHNcbiAgfTogQ2xpZW50T3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKGFwaUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3JzLk9wZW5BSUVycm9yKFxuICAgICAgICBcIlRoZSBPUEVOQUlfQVBJX0tFWSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBtaXNzaW5nIG9yIGVtcHR5OyBlaXRoZXIgcHJvdmlkZSBpdCwgb3IgaW5zdGFudGlhdGUgdGhlIE9wZW5BSSBjbGllbnQgd2l0aCBhbiBhcGlLZXkgb3B0aW9uLCBsaWtlIG5ldyBPcGVuQUkoeyBhcGlLZXk6ICdNeSBBUEkgS2V5JyB9KS5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQ2xpZW50T3B0aW9ucyA9IHtcbiAgICAgIGFwaUtleSxcbiAgICAgIG9yZ2FuaXphdGlvbixcbiAgICAgIHByb2plY3QsXG4gICAgICAuLi5vcHRzLFxuICAgICAgYmFzZVVSTDogYmFzZVVSTCB8fCBgaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MWAsXG4gICAgfTtcblxuICAgIGlmICghb3B0aW9ucy5kYW5nZXJvdXNseUFsbG93QnJvd3NlciAmJiBDb3JlLmlzUnVubmluZ0luQnJvd3NlcigpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3JzLk9wZW5BSUVycm9yKFxuICAgICAgICBcIkl0IGxvb2tzIGxpa2UgeW91J3JlIHJ1bm5pbmcgaW4gYSBicm93c2VyLWxpa2UgZW52aXJvbm1lbnQuXFxuXFxuVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBhcyBpdCByaXNrcyBleHBvc2luZyB5b3VyIHNlY3JldCBBUEkgY3JlZGVudGlhbHMgdG8gYXR0YWNrZXJzLlxcbklmIHlvdSB1bmRlcnN0YW5kIHRoZSByaXNrcyBhbmQgaGF2ZSBhcHByb3ByaWF0ZSBtaXRpZ2F0aW9ucyBpbiBwbGFjZSxcXG55b3UgY2FuIHNldCB0aGUgYGRhbmdlcm91c2x5QWxsb3dCcm93c2VyYCBvcHRpb24gdG8gYHRydWVgLCBlLmcuLFxcblxcbm5ldyBPcGVuQUkoeyBhcGlLZXksIGRhbmdlcm91c2x5QWxsb3dCcm93c2VyOiB0cnVlIH0pO1xcblxcbmh0dHBzOi8vaGVscC5vcGVuYWkuY29tL2VuL2FydGljbGVzLzUxMTI1OTUtYmVzdC1wcmFjdGljZXMtZm9yLWFwaS1rZXktc2FmZXR5XFxuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHN1cGVyKHtcbiAgICAgIGJhc2VVUkw6IG9wdGlvbnMuYmFzZVVSTCEsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zLnRpbWVvdXQgPz8gNjAwMDAwIC8qIDEwIG1pbnV0ZXMgKi8sXG4gICAgICBodHRwQWdlbnQ6IG9wdGlvbnMuaHR0cEFnZW50LFxuICAgICAgbWF4UmV0cmllczogb3B0aW9ucy5tYXhSZXRyaWVzLFxuICAgICAgZmV0Y2g6IG9wdGlvbnMuZmV0Y2gsXG4gICAgfSk7XG4gICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICB0aGlzLmFwaUtleSA9IGFwaUtleTtcbiAgICB0aGlzLm9yZ2FuaXphdGlvbiA9IG9yZ2FuaXphdGlvbjtcbiAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0O1xuICB9XG5cbiAgY29tcGxldGlvbnM6IEFQSS5Db21wbGV0aW9ucyA9IG5ldyBBUEkuQ29tcGxldGlvbnModGhpcyk7XG4gIGNoYXQ6IEFQSS5DaGF0ID0gbmV3IEFQSS5DaGF0KHRoaXMpO1xuICBlbWJlZGRpbmdzOiBBUEkuRW1iZWRkaW5ncyA9IG5ldyBBUEkuRW1iZWRkaW5ncyh0aGlzKTtcbiAgZmlsZXM6IEFQSS5GaWxlcyA9IG5ldyBBUEkuRmlsZXModGhpcyk7XG4gIGltYWdlczogQVBJLkltYWdlcyA9IG5ldyBBUEkuSW1hZ2VzKHRoaXMpO1xuICBhdWRpbzogQVBJLkF1ZGlvID0gbmV3IEFQSS5BdWRpbyh0aGlzKTtcbiAgbW9kZXJhdGlvbnM6IEFQSS5Nb2RlcmF0aW9ucyA9IG5ldyBBUEkuTW9kZXJhdGlvbnModGhpcyk7XG4gIG1vZGVsczogQVBJLk1vZGVscyA9IG5ldyBBUEkuTW9kZWxzKHRoaXMpO1xuICBmaW5lVHVuaW5nOiBBUEkuRmluZVR1bmluZyA9IG5ldyBBUEkuRmluZVR1bmluZyh0aGlzKTtcbiAgYmV0YTogQVBJLkJldGEgPSBuZXcgQVBJLkJldGEodGhpcyk7XG4gIGJhdGNoZXM6IEFQSS5CYXRjaGVzID0gbmV3IEFQSS5CYXRjaGVzKHRoaXMpO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBkZWZhdWx0UXVlcnkoKTogQ29yZS5EZWZhdWx0UXVlcnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zLmRlZmF1bHRRdWVyeTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBkZWZhdWx0SGVhZGVycyhvcHRzOiBDb3JlLkZpbmFsUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkhlYWRlcnMge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci5kZWZhdWx0SGVhZGVycyhvcHRzKSxcbiAgICAgICdPcGVuQUktT3JnYW5pemF0aW9uJzogdGhpcy5vcmdhbml6YXRpb24sXG4gICAgICAnT3BlbkFJLVByb2plY3QnOiB0aGlzLnByb2plY3QsXG4gICAgICAuLi50aGlzLl9vcHRpb25zLmRlZmF1bHRIZWFkZXJzLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXV0aEhlYWRlcnMob3B0czogQ29yZS5GaW5hbFJlcXVlc3RPcHRpb25zKTogQ29yZS5IZWFkZXJzIHtcbiAgICByZXR1cm4geyBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5hcGlLZXl9YCB9O1xuICB9XG5cbiAgc3RhdGljIE9wZW5BSSA9IHRoaXM7XG5cbiAgc3RhdGljIE9wZW5BSUVycm9yID0gRXJyb3JzLk9wZW5BSUVycm9yO1xuICBzdGF0aWMgQVBJRXJyb3IgPSBFcnJvcnMuQVBJRXJyb3I7XG4gIHN0YXRpYyBBUElDb25uZWN0aW9uRXJyb3IgPSBFcnJvcnMuQVBJQ29ubmVjdGlvbkVycm9yO1xuICBzdGF0aWMgQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvciA9IEVycm9ycy5BUElDb25uZWN0aW9uVGltZW91dEVycm9yO1xuICBzdGF0aWMgQVBJVXNlckFib3J0RXJyb3IgPSBFcnJvcnMuQVBJVXNlckFib3J0RXJyb3I7XG4gIHN0YXRpYyBOb3RGb3VuZEVycm9yID0gRXJyb3JzLk5vdEZvdW5kRXJyb3I7XG4gIHN0YXRpYyBDb25mbGljdEVycm9yID0gRXJyb3JzLkNvbmZsaWN0RXJyb3I7XG4gIHN0YXRpYyBSYXRlTGltaXRFcnJvciA9IEVycm9ycy5SYXRlTGltaXRFcnJvcjtcbiAgc3RhdGljIEJhZFJlcXVlc3RFcnJvciA9IEVycm9ycy5CYWRSZXF1ZXN0RXJyb3I7XG4gIHN0YXRpYyBBdXRoZW50aWNhdGlvbkVycm9yID0gRXJyb3JzLkF1dGhlbnRpY2F0aW9uRXJyb3I7XG4gIHN0YXRpYyBJbnRlcm5hbFNlcnZlckVycm9yID0gRXJyb3JzLkludGVybmFsU2VydmVyRXJyb3I7XG4gIHN0YXRpYyBQZXJtaXNzaW9uRGVuaWVkRXJyb3IgPSBFcnJvcnMuUGVybWlzc2lvbkRlbmllZEVycm9yO1xuICBzdGF0aWMgVW5wcm9jZXNzYWJsZUVudGl0eUVycm9yID0gRXJyb3JzLlVucHJvY2Vzc2FibGVFbnRpdHlFcnJvcjtcblxuICBzdGF0aWMgdG9GaWxlID0gVXBsb2Fkcy50b0ZpbGU7XG4gIHN0YXRpYyBmaWxlRnJvbVBhdGggPSBVcGxvYWRzLmZpbGVGcm9tUGF0aDtcbn1cblxuZXhwb3J0IGNvbnN0IHtcbiAgT3BlbkFJRXJyb3IsXG4gIEFQSUVycm9yLFxuICBBUElDb25uZWN0aW9uRXJyb3IsXG4gIEFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3IsXG4gIEFQSVVzZXJBYm9ydEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBDb25mbGljdEVycm9yLFxuICBSYXRlTGltaXRFcnJvcixcbiAgQmFkUmVxdWVzdEVycm9yLFxuICBBdXRoZW50aWNhdGlvbkVycm9yLFxuICBJbnRlcm5hbFNlcnZlckVycm9yLFxuICBQZXJtaXNzaW9uRGVuaWVkRXJyb3IsXG4gIFVucHJvY2Vzc2FibGVFbnRpdHlFcnJvcixcbn0gPSBFcnJvcnM7XG5cbmV4cG9ydCBpbXBvcnQgdG9GaWxlID0gVXBsb2Fkcy50b0ZpbGU7XG5leHBvcnQgaW1wb3J0IGZpbGVGcm9tUGF0aCA9IFVwbG9hZHMuZmlsZUZyb21QYXRoO1xuXG5leHBvcnQgbmFtZXNwYWNlIE9wZW5BSSB7XG4gIGV4cG9ydCBpbXBvcnQgUmVxdWVzdE9wdGlvbnMgPSBDb3JlLlJlcXVlc3RPcHRpb25zO1xuXG4gIGV4cG9ydCBpbXBvcnQgUGFnZSA9IFBhZ2luYXRpb24uUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBQYWdlUmVzcG9uc2UgPSBQYWdpbmF0aW9uLlBhZ2VSZXNwb25zZTtcblxuICBleHBvcnQgaW1wb3J0IEN1cnNvclBhZ2UgPSBQYWdpbmF0aW9uLkN1cnNvclBhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ3Vyc29yUGFnZVBhcmFtcyA9IFBhZ2luYXRpb24uQ3Vyc29yUGFnZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBDdXJzb3JQYWdlUmVzcG9uc2UgPSBQYWdpbmF0aW9uLkN1cnNvclBhZ2VSZXNwb25zZTtcblxuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25zID0gQVBJLkNvbXBsZXRpb25zO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb24gPSBBUEkuQ29tcGxldGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uQ2hvaWNlID0gQVBJLkNvbXBsZXRpb25DaG9pY2U7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvblVzYWdlID0gQVBJLkNvbXBsZXRpb25Vc2FnZTtcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zID0gQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IEFQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBBUEkuQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcblxuICBleHBvcnQgaW1wb3J0IENoYXQgPSBBUEkuQ2hhdDtcbiAgZXhwb3J0IGltcG9ydCBDaGF0TW9kZWwgPSBBUEkuQ2hhdE1vZGVsO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uID0gQVBJLkNoYXRDb21wbGV0aW9uO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQXNzaXN0YW50TWVzc2FnZVBhcmFtID0gQVBJLkNoYXRDb21wbGV0aW9uQXNzaXN0YW50TWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ2h1bmsgPSBBUEkuQ2hhdENvbXBsZXRpb25DaHVuaztcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0ID0gQVBJLkNoYXRDb21wbGV0aW9uQ29udGVudFBhcnQ7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydEltYWdlID0gQVBJLkNoYXRDb21wbGV0aW9uQ29udGVudFBhcnRJbWFnZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0VGV4dCA9IEFQSS5DaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0VGV4dDtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uQ2FsbE9wdGlvbiA9IEFQSS5DaGF0Q29tcGxldGlvbkZ1bmN0aW9uQ2FsbE9wdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtID0gQVBJLkNoYXRDb21wbGV0aW9uRnVuY3Rpb25NZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25NZXNzYWdlID0gQVBJLkNoYXRDb21wbGV0aW9uTWVzc2FnZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSA9IEFQSS5DaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbk1lc3NhZ2VUb29sQ2FsbCA9IEFQSS5DaGF0Q29tcGxldGlvbk1lc3NhZ2VUb29sQ2FsbDtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbk5hbWVkVG9vbENob2ljZSA9IEFQSS5DaGF0Q29tcGxldGlvbk5hbWVkVG9vbENob2ljZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblJvbGUgPSBBUEkuQ2hhdENvbXBsZXRpb25Sb2xlO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uU3RyZWFtT3B0aW9ucyA9IEFQSS5DaGF0Q29tcGxldGlvblN0cmVhbU9wdGlvbnM7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25TeXN0ZW1NZXNzYWdlUGFyYW0gPSBBUEkuQ2hhdENvbXBsZXRpb25TeXN0ZW1NZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Ub2tlbkxvZ3Byb2IgPSBBUEkuQ2hhdENvbXBsZXRpb25Ub2tlbkxvZ3Byb2I7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Ub29sID0gQVBJLkNoYXRDb21wbGV0aW9uVG9vbDtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblRvb2xDaG9pY2VPcHRpb24gPSBBUEkuQ2hhdENvbXBsZXRpb25Ub29sQ2hvaWNlT3B0aW9uO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9vbE1lc3NhZ2VQYXJhbSA9IEFQSS5DaGF0Q29tcGxldGlvblRvb2xNZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Vc2VyTWVzc2FnZVBhcmFtID0gQVBJLkNoYXRDb21wbGV0aW9uVXNlck1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9IEFQSS5DaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IEFQSS5DaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IEFQSS5DaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcblxuICBleHBvcnQgaW1wb3J0IEVtYmVkZGluZ3MgPSBBUEkuRW1iZWRkaW5ncztcbiAgZXhwb3J0IGltcG9ydCBDcmVhdGVFbWJlZGRpbmdSZXNwb25zZSA9IEFQSS5DcmVhdGVFbWJlZGRpbmdSZXNwb25zZTtcbiAgZXhwb3J0IGltcG9ydCBFbWJlZGRpbmcgPSBBUEkuRW1iZWRkaW5nO1xuICBleHBvcnQgaW1wb3J0IEVtYmVkZGluZ0NyZWF0ZVBhcmFtcyA9IEFQSS5FbWJlZGRpbmdDcmVhdGVQYXJhbXM7XG5cbiAgZXhwb3J0IGltcG9ydCBGaWxlcyA9IEFQSS5GaWxlcztcbiAgZXhwb3J0IGltcG9ydCBGaWxlQ29udGVudCA9IEFQSS5GaWxlQ29udGVudDtcbiAgZXhwb3J0IGltcG9ydCBGaWxlRGVsZXRlZCA9IEFQSS5GaWxlRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBGaWxlT2JqZWN0ID0gQVBJLkZpbGVPYmplY3Q7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZU9iamVjdHNQYWdlID0gQVBJLkZpbGVPYmplY3RzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBGaWxlQ3JlYXRlUGFyYW1zID0gQVBJLkZpbGVDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUxpc3RQYXJhbXMgPSBBUEkuRmlsZUxpc3RQYXJhbXM7XG5cbiAgZXhwb3J0IGltcG9ydCBJbWFnZXMgPSBBUEkuSW1hZ2VzO1xuICBleHBvcnQgaW1wb3J0IEltYWdlID0gQVBJLkltYWdlO1xuICBleHBvcnQgaW1wb3J0IEltYWdlc1Jlc3BvbnNlID0gQVBJLkltYWdlc1Jlc3BvbnNlO1xuICBleHBvcnQgaW1wb3J0IEltYWdlQ3JlYXRlVmFyaWF0aW9uUGFyYW1zID0gQVBJLkltYWdlQ3JlYXRlVmFyaWF0aW9uUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEltYWdlRWRpdFBhcmFtcyA9IEFQSS5JbWFnZUVkaXRQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VHZW5lcmF0ZVBhcmFtcyA9IEFQSS5JbWFnZUdlbmVyYXRlUGFyYW1zO1xuXG4gIGV4cG9ydCBpbXBvcnQgQXVkaW8gPSBBUEkuQXVkaW87XG5cbiAgZXhwb3J0IGltcG9ydCBNb2RlcmF0aW9ucyA9IEFQSS5Nb2RlcmF0aW9ucztcbiAgZXhwb3J0IGltcG9ydCBNb2RlcmF0aW9uID0gQVBJLk1vZGVyYXRpb247XG4gIGV4cG9ydCBpbXBvcnQgTW9kZXJhdGlvbkNyZWF0ZVJlc3BvbnNlID0gQVBJLk1vZGVyYXRpb25DcmVhdGVSZXNwb25zZTtcbiAgZXhwb3J0IGltcG9ydCBNb2RlcmF0aW9uQ3JlYXRlUGFyYW1zID0gQVBJLk1vZGVyYXRpb25DcmVhdGVQYXJhbXM7XG5cbiAgZXhwb3J0IGltcG9ydCBNb2RlbHMgPSBBUEkuTW9kZWxzO1xuICBleHBvcnQgaW1wb3J0IE1vZGVsID0gQVBJLk1vZGVsO1xuICBleHBvcnQgaW1wb3J0IE1vZGVsRGVsZXRlZCA9IEFQSS5Nb2RlbERlbGV0ZWQ7XG4gIGV4cG9ydCBpbXBvcnQgTW9kZWxzUGFnZSA9IEFQSS5Nb2RlbHNQYWdlO1xuXG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZyA9IEFQSS5GaW5lVHVuaW5nO1xuXG4gIGV4cG9ydCBpbXBvcnQgQmV0YSA9IEFQSS5CZXRhO1xuXG4gIGV4cG9ydCBpbXBvcnQgQmF0Y2hlcyA9IEFQSS5CYXRjaGVzO1xuICBleHBvcnQgaW1wb3J0IEJhdGNoID0gQVBJLkJhdGNoO1xuICBleHBvcnQgaW1wb3J0IEJhdGNoRXJyb3IgPSBBUEkuQmF0Y2hFcnJvcjtcbiAgZXhwb3J0IGltcG9ydCBCYXRjaFJlcXVlc3RDb3VudHMgPSBBUEkuQmF0Y2hSZXF1ZXN0Q291bnRzO1xuICBleHBvcnQgaW1wb3J0IEJhdGNoZXNQYWdlID0gQVBJLkJhdGNoZXNQYWdlO1xuICBleHBvcnQgaW1wb3J0IEJhdGNoQ3JlYXRlUGFyYW1zID0gQVBJLkJhdGNoQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEJhdGNoTGlzdFBhcmFtcyA9IEFQSS5CYXRjaExpc3RQYXJhbXM7XG5cbiAgZXhwb3J0IGltcG9ydCBFcnJvck9iamVjdCA9IEFQSS5FcnJvck9iamVjdDtcbiAgZXhwb3J0IGltcG9ydCBGdW5jdGlvbkRlZmluaXRpb24gPSBBUEkuRnVuY3Rpb25EZWZpbml0aW9uO1xuICBleHBvcnQgaW1wb3J0IEZ1bmN0aW9uUGFyYW1ldGVycyA9IEFQSS5GdW5jdGlvblBhcmFtZXRlcnM7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXp1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQVBJIENsaWVudCBmb3IgaW50ZXJmYWNpbmcgd2l0aCB0aGUgQXp1cmUgT3BlbkFJIEFQSS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXp1cmVDbGllbnRPcHRpb25zIGV4dGVuZHMgQ2xpZW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZWZhdWx0cyB0byBwcm9jZXNzLmVudlsnT1BFTkFJX0FQSV9WRVJTSU9OJ10uXG4gICAqL1xuICBhcGlWZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBZb3VyIEF6dXJlIGVuZHBvaW50LCBpbmNsdWRpbmcgdGhlIHJlc291cmNlLCBlLmcuIGBodHRwczovL2V4YW1wbGUtcmVzb3VyY2UuYXp1cmUub3BlbmFpLmNvbS9gXG4gICAqL1xuICBlbmRwb2ludD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQSBtb2RlbCBkZXBsb3ltZW50LCBpZiBnaXZlbiwgc2V0cyB0aGUgYmFzZSBjbGllbnQgVVJMIHRvIGluY2x1ZGUgYC9kZXBsb3ltZW50cy97ZGVwbG95bWVudH1gLlxuICAgKiBOb3RlOiB0aGlzIG1lYW5zIHlvdSB3b24ndCBiZSBhYmxlIHRvIHVzZSBub24tZGVwbG95bWVudCBlbmRwb2ludHMuIE5vdCBzdXBwb3J0ZWQgd2l0aCBBc3Npc3RhbnRzIEFQSXMuXG4gICAqL1xuICBkZXBsb3ltZW50Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0cyB0byBwcm9jZXNzLmVudlsnQVpVUkVfT1BFTkFJX0FQSV9LRVknXS5cbiAgICovXG4gIGFwaUtleT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gYWNjZXNzIHRva2VuIGZvciBNaWNyb3NvZnQgRW50cmEgKGZvcm1lcmx5IGtub3duIGFzIEF6dXJlIEFjdGl2ZSBEaXJlY3RvcnkpLFxuICAgKiB3aGljaCB3aWxsIGJlIGludm9rZWQgb24gZXZlcnkgcmVxdWVzdC5cbiAgICovXG4gIGF6dXJlQURUb2tlblByb3ZpZGVyPzogKCgpID0+IFByb21pc2U8c3RyaW5nPikgfCB1bmRlZmluZWQ7XG59XG5cbi8qKiBBUEkgQ2xpZW50IGZvciBpbnRlcmZhY2luZyB3aXRoIHRoZSBBenVyZSBPcGVuQUkgQVBJLiAqL1xuZXhwb3J0IGNsYXNzIEF6dXJlT3BlbkFJIGV4dGVuZHMgT3BlbkFJIHtcbiAgcHJpdmF0ZSBfYXp1cmVBRFRva2VuUHJvdmlkZXI6ICgoKSA9PiBQcm9taXNlPHN0cmluZz4pIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9kZXBsb3ltZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGFwaVZlcnNpb246IHN0cmluZyA9ICcnO1xuICAvKipcbiAgICogQVBJIENsaWVudCBmb3IgaW50ZXJmYWNpbmcgd2l0aCB0aGUgQXp1cmUgT3BlbkFJIEFQSS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IFtvcHRzLmFwaVZlcnNpb249cHJvY2Vzcy5lbnZbJ09QRU5BSV9BUElfVkVSU0lPTiddID8/IHVuZGVmaW5lZF1cbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IFtvcHRzLmVuZHBvaW50PXByb2Nlc3MuZW52WydBWlVSRV9PUEVOQUlfRU5EUE9JTlQnXSA/PyB1bmRlZmluZWRdIC0gWW91ciBBenVyZSBlbmRwb2ludCwgaW5jbHVkaW5nIHRoZSByZXNvdXJjZSwgZS5nLiBgaHR0cHM6Ly9leGFtcGxlLXJlc291cmNlLmF6dXJlLm9wZW5haS5jb20vYFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW29wdHMuYXBpS2V5PXByb2Nlc3MuZW52WydBWlVSRV9PUEVOQUlfQVBJX0tFWSddID8/IHVuZGVmaW5lZF1cbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IG9wdHMuZGVwbG95bWVudCAtIEEgbW9kZWwgZGVwbG95bWVudCwgaWYgZ2l2ZW4sIHNldHMgdGhlIGJhc2UgY2xpZW50IFVSTCB0byBpbmNsdWRlIGAvZGVwbG95bWVudHMve2RlcGxveW1lbnR9YC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0cy5vcmdhbml6YXRpb249cHJvY2Vzcy5lbnZbJ09QRU5BSV9PUkdfSUQnXSA/PyBudWxsXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYmFzZVVSTD1wcm9jZXNzLmVudlsnT1BFTkFJX0JBU0VfVVJMJ11dIC0gU2V0cyB0aGUgYmFzZSBVUkwgZm9yIHRoZSBBUEkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy50aW1lb3V0PTEwIG1pbnV0ZXNdIC0gVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhlIGNsaWVudCB3aWxsIHdhaXQgZm9yIGEgcmVzcG9uc2UgYmVmb3JlIHRpbWluZyBvdXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5odHRwQWdlbnRdIC0gQW4gSFRUUCBhZ2VudCB1c2VkIHRvIG1hbmFnZSBIVFRQKHMpIGNvbm5lY3Rpb25zLlxuICAgKiBAcGFyYW0ge0NvcmUuRmV0Y2h9IFtvcHRzLmZldGNoXSAtIFNwZWNpZnkgYSBjdXN0b20gYGZldGNoYCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLm1heFJldHJpZXM9Ml0gLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNsaWVudCB3aWxsIHJldHJ5IGEgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtDb3JlLkhlYWRlcnN9IG9wdHMuZGVmYXVsdEhlYWRlcnMgLSBEZWZhdWx0IGhlYWRlcnMgdG8gaW5jbHVkZSB3aXRoIGV2ZXJ5IHJlcXVlc3QgdG8gdGhlIEFQSS5cbiAgICogQHBhcmFtIHtDb3JlLkRlZmF1bHRRdWVyeX0gb3B0cy5kZWZhdWx0UXVlcnkgLSBEZWZhdWx0IHF1ZXJ5IHBhcmFtZXRlcnMgdG8gaW5jbHVkZSB3aXRoIGV2ZXJ5IHJlcXVlc3QgdG8gdGhlIEFQSS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5kYW5nZXJvdXNseUFsbG93QnJvd3Nlcj1mYWxzZV0gLSBCeSBkZWZhdWx0LCBjbGllbnQtc2lkZSB1c2Ugb2YgdGhpcyBsaWJyYXJ5IGlzIG5vdCBhbGxvd2VkLCBhcyBpdCByaXNrcyBleHBvc2luZyB5b3VyIHNlY3JldCBBUEkgY3JlZGVudGlhbHMgdG8gYXR0YWNrZXJzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe1xuICAgIGJhc2VVUkwgPSBDb3JlLnJlYWRFbnYoJ09QRU5BSV9CQVNFX1VSTCcpLFxuICAgIGFwaUtleSA9IENvcmUucmVhZEVudignQVpVUkVfT1BFTkFJX0FQSV9LRVknKSxcbiAgICBhcGlWZXJzaW9uID0gQ29yZS5yZWFkRW52KCdPUEVOQUlfQVBJX1ZFUlNJT04nKSxcbiAgICBlbmRwb2ludCxcbiAgICBkZXBsb3ltZW50LFxuICAgIGF6dXJlQURUb2tlblByb3ZpZGVyLFxuICAgIGRhbmdlcm91c2x5QWxsb3dCcm93c2VyLFxuICAgIC4uLm9wdHNcbiAgfTogQXp1cmVDbGllbnRPcHRpb25zID0ge30pIHtcbiAgICBpZiAoIWFwaVZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcnMuT3BlbkFJRXJyb3IoXG4gICAgICAgIFwiVGhlIE9QRU5BSV9BUElfVkVSU0lPTiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBtaXNzaW5nIG9yIGVtcHR5OyBlaXRoZXIgcHJvdmlkZSBpdCwgb3IgaW5zdGFudGlhdGUgdGhlIEF6dXJlT3BlbkFJIGNsaWVudCB3aXRoIGFuIGFwaVZlcnNpb24gb3B0aW9uLCBsaWtlIG5ldyBBenVyZU9wZW5BSSh7IGFwaVZlcnNpb246ICdNeSBBUEkgVmVyc2lvbicgfSkuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYXp1cmVBRFRva2VuUHJvdmlkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGRhbmdlcm91c2x5QWxsb3dCcm93c2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWF6dXJlQURUb2tlblByb3ZpZGVyICYmICFhcGlLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcnMuT3BlbkFJRXJyb3IoXG4gICAgICAgICdNaXNzaW5nIGNyZWRlbnRpYWxzLiBQbGVhc2UgcGFzcyBvbmUgb2YgYGFwaUtleWAgYW5kIGBhenVyZUFEVG9rZW5Qcm92aWRlcmAsIG9yIHNldCB0aGUgYEFaVVJFX09QRU5BSV9BUElfS0VZYCBlbnZpcm9ubWVudCB2YXJpYWJsZS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXp1cmVBRFRva2VuUHJvdmlkZXIgJiYgYXBpS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3JzLk9wZW5BSUVycm9yKFxuICAgICAgICAnVGhlIGBhcGlLZXlgIGFuZCBgYXp1cmVBRFRva2VuUHJvdmlkZXJgIGFyZ3VtZW50cyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlOyBvbmx5IG9uZSBjYW4gYmUgcGFzc2VkIGF0IGEgdGltZS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBkZWZpbmUgYSBzZW50aW5lbCB2YWx1ZSB0byBhdm9pZCBhbnkgdHlwaW5nIGlzc3Vlc1xuICAgIGFwaUtleSA/Pz0gQVBJX0tFWV9TRU5USU5FTDtcblxuICAgIG9wdHMuZGVmYXVsdFF1ZXJ5ID0geyAuLi5vcHRzLmRlZmF1bHRRdWVyeSwgJ2FwaS12ZXJzaW9uJzogYXBpVmVyc2lvbiB9O1xuXG4gICAgaWYgKCFiYXNlVVJMKSB7XG4gICAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICAgIGVuZHBvaW50ID0gcHJvY2Vzcy5lbnZbJ0FaVVJFX09QRU5BSV9FTkRQT0lOVCddO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcnMuT3BlbkFJRXJyb3IoXG4gICAgICAgICAgJ011c3QgcHJvdmlkZSBvbmUgb2YgdGhlIGBiYXNlVVJMYCBvciBgZW5kcG9pbnRgIGFyZ3VtZW50cywgb3IgdGhlIGBBWlVSRV9PUEVOQUlfRU5EUE9JTlRgIGVudmlyb25tZW50IHZhcmlhYmxlJyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYmFzZVVSTCA9IGAke2VuZHBvaW50fS9vcGVuYWlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZW5kcG9pbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9ycy5PcGVuQUlFcnJvcignYmFzZVVSTCBhbmQgZW5kcG9pbnQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1cGVyKHtcbiAgICAgIGFwaUtleSxcbiAgICAgIGJhc2VVUkwsXG4gICAgICAuLi5vcHRzLFxuICAgICAgLi4uKGRhbmdlcm91c2x5QWxsb3dCcm93c2VyICE9PSB1bmRlZmluZWQgPyB7IGRhbmdlcm91c2x5QWxsb3dCcm93c2VyIH0gOiB7fSksXG4gICAgfSk7XG5cbiAgICB0aGlzLl9henVyZUFEVG9rZW5Qcm92aWRlciA9IGF6dXJlQURUb2tlblByb3ZpZGVyO1xuICAgIHRoaXMuYXBpVmVyc2lvbiA9IGFwaVZlcnNpb247XG4gICAgdGhpcy5fZGVwbG95bWVudCA9IGRlcGxveW1lbnQ7XG4gIH1cblxuICBvdmVycmlkZSBidWlsZFJlcXVlc3Qob3B0aW9uczogQ29yZS5GaW5hbFJlcXVlc3RPcHRpb25zPHVua25vd24+KToge1xuICAgIHJlcTogUmVxdWVzdEluaXQ7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgdGltZW91dDogbnVtYmVyO1xuICB9IHtcbiAgICBpZiAoX2RlcGxveW1lbnRzX2VuZHBvaW50cy5oYXMob3B0aW9ucy5wYXRoKSAmJiBvcHRpb25zLm1ldGhvZCA9PT0gJ3Bvc3QnICYmIG9wdGlvbnMuYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIUNvcmUuaXNPYmoob3B0aW9ucy5ib2R5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHJlcXVlc3QgYm9keSB0byBiZSBhbiBvYmplY3QnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5fZGVwbG95bWVudCB8fCBvcHRpb25zLmJvZHlbJ21vZGVsJ107XG4gICAgICBkZWxldGUgb3B0aW9ucy5ib2R5Wydtb2RlbCddO1xuICAgICAgaWYgKG1vZGVsICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuYmFzZVVSTC5pbmNsdWRlcygnL2RlcGxveW1lbnRzJykpIHtcbiAgICAgICAgb3B0aW9ucy5wYXRoID0gYC9kZXBsb3ltZW50cy8ke21vZGVsfSR7b3B0aW9ucy5wYXRofWA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5idWlsZFJlcXVlc3Qob3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9nZXRBenVyZUFEVG9rZW4oKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2F6dXJlQURUb2tlblByb3ZpZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuX2F6dXJlQURUb2tlblByb3ZpZGVyKCk7XG4gICAgICBpZiAoIXRva2VuIHx8IHR5cGVvZiB0b2tlbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9ycy5PcGVuQUlFcnJvcihcbiAgICAgICAgICBgRXhwZWN0ZWQgJ2F6dXJlQURUb2tlblByb3ZpZGVyJyBhcmd1bWVudCB0byByZXR1cm4gYSBzdHJpbmcgYnV0IGl0IHJldHVybmVkICR7dG9rZW59YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhdXRoSGVhZGVycyhvcHRzOiBDb3JlLkZpbmFsUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkhlYWRlcnMge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwcmVwYXJlT3B0aW9ucyhvcHRzOiBDb3JlLkZpbmFsUmVxdWVzdE9wdGlvbnM8dW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0cy5oZWFkZXJzPy5bJ0F1dGhvcml6YXRpb24nXSB8fCBvcHRzLmhlYWRlcnM/LlsnYXBpLWtleSddKSB7XG4gICAgICByZXR1cm4gc3VwZXIucHJlcGFyZU9wdGlvbnMob3B0cyk7XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5fZ2V0QXp1cmVBRFRva2VuKCk7XG4gICAgb3B0cy5oZWFkZXJzID8/PSB7fTtcbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIG9wdHMuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke3Rva2VufWA7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFwaUtleSAhPT0gQVBJX0tFWV9TRU5USU5FTCkge1xuICAgICAgb3B0cy5oZWFkZXJzWydhcGkta2V5J10gPSB0aGlzLmFwaUtleTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9ycy5PcGVuQUlFcnJvcignVW5hYmxlIHRvIGhhbmRsZSBhdXRoJyk7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5wcmVwYXJlT3B0aW9ucyhvcHRzKTtcbiAgfVxufVxuXG5jb25zdCBfZGVwbG95bWVudHNfZW5kcG9pbnRzID0gbmV3IFNldChbXG4gICcvY29tcGxldGlvbnMnLFxuICAnL2NoYXQvY29tcGxldGlvbnMnLFxuICAnL2VtYmVkZGluZ3MnLFxuICAnL2F1ZGlvL3RyYW5zY3JpcHRpb25zJyxcbiAgJy9hdWRpby90cmFuc2xhdGlvbnMnLFxuICAnL2F1ZGlvL3NwZWVjaCcsXG4gICcvaW1hZ2VzL2dlbmVyYXRpb25zJyxcbiAgJy9iYXRjaGVzJyxcbl0pO1xuXG5jb25zdCBBUElfS0VZX1NFTlRJTkVMID0gJzxNaXNzaW5nIEtleT4nO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBBenVyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBkZWZhdWx0IE9wZW5BSTtcbiIsICJpbXBvcnQgeyBhdmFpbGFibGVDaGF0TW9kZWxzLCBhdmFpbGFibGVDb21wbGV0aW9uTW9kZWxzIH0gZnJvbSBcIi4vbW9kZWxzXCI7XG5pbXBvcnQgeyBPcGVuQUkgfSBmcm9tICdvcGVuYWknO1xuXG5cbi8vIFRPRE86XG4vLyAtIGN1c3RvbSB0ZW1wZXJhdHVyZVxuLy8gLSBjdXN0b20gc3lzdGVtIHByb21wdCAoPylcbi8vIC0gYXV0b21hdGljIGRlY2sgYWxsb2NhdGlvblxuLy8gLSBjbG96ZSBjYXJkcyBjcmVhdGlvblxuXG5jbGFzcyBPcGVuQUlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gXCJPcGVuQUlFcnJvclwiO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RUZXh0QWZ0ZXJGbGFzaGNhcmRzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBwYXR0ZXJuID0gLyNmbGFzaGNhcmRzLipcXG4vO1xuICBjb25zdCBtYXRjaCA9IHRleHQubWF0Y2gocGF0dGVybik7XG5cbiAgaWYgKG1hdGNoKSB7XG4gICAgY29uc3Qgc3RhcnRJZHggPSBtYXRjaC5pbmRleCEgKyBtYXRjaFswXS5sZW5ndGg7XG4gICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKHN0YXJ0SWR4KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBpbmxpbmVDYXJkc1Byb21wdChzZXA6IHN0cmluZywgZmxhc2hjYXJkc0NvdW50OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYFlvdSB3aWxsIGJlIHByb3ZpZGVkIHdpdGggYSBub3RlLiBBdCB0aGUgZW5kIG9mIHRoZSBub3RlIGFyZSBzb21lIGZsYXNoY2FyZHMuIElkZW50aWZ5IHdoaWNoIGFyZSB0aGUgbW9zdCBpbXBvcnRhbnQgY29uY2VwdHMgd2l0aGluIHRoZSBub3RlIGFuZCBnZW5lcmF0ZSBleGFjdGx5ICR7Zmxhc2hjYXJkc0NvdW50fSBuZXcgb3JpZ2luYWwgZmxhc2hjYXJkIGluIHRoZSBmb3JtYXQgXFxcInF1ZXN0aW9uICR7c2VwfSBhbnN3ZXJcXFwiLiBTdHJpY3RseSB1c2UgJHtzZXB9IHRvIHNlcGFyYXRlIGEgcXVlc3Rpb24gZnJvbSBpdHMgYW5zd2VyLiBTZXBhcmF0ZSBmbGFzaGNhcmRzIHdpdGggYSBzaW5nbGUgZW1wdHkgbGluZS4gQW4gZXhhbXBsZSBpcyBcXFwiV2hhdCBpcyBjaGVtaWNhbCBmb3JtdWxhIG9mIHdhdGVyICR7c2VwfSBIMk9cXFwiLiBEbyBub3QgdXNlIGFueSBwcmVmaXggdGV4dCwgc3RhcnQgZ2VuZXJhdGluZyByaWdodCBhd2F5LiBUcnkgdG8gbWFrZSB0aGVtIGFzIGF0b21pYyBhcyBwb3NzaWJsZSwgYnV0IHN0aWxsIGNoYWxsZW5naW5nIGFuZCByaWNoIG9mIGluZm9ybWF0aW9uLiBEbyBub3QgcmVwZWF0IG9yIHJlcGhyYXNlIGZsYXNoY2FyZHMuIEZvY3VzIG9uIGltcG9ydGFudCBsYXRleCBmb3JtdWxhcyBhbmQgZXF1YXRpb25zLiBUeXBlc2V0IGVxdWF0aW9ucyBhbmQgbWF0aCBmb3JtdWxhcyBjb3JyZWN0bHkgKHRoYXQgaXMgdXNpbmcgdGhlIFxcJCBzeW1ib2wgd2l0aG91dCB0cmFpbGluZyBzcGFjZXMpYDtcbn1cblxuZnVuY3Rpb24gbXVsdGlsaW5lQ2FyZHNQcm9tcHQoc2VwOiBzdHJpbmcsIGZsYXNoY2FyZHNDb3VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBZb3Ugd2lsbCBiZSBwcm92aWRlZCB3aXRoIGEgbm90ZS4gQXQgdGhlIGVuZCBvZiB0aGUgbm90ZSBhcmUgc29tZSBmbGFzaGNhcmRzLiBJZGVudGlmeSB3aGljaCBhcmUgdGhlIG1vc3QgaW1wb3J0YW50IGNvbmNlcHRzIHdpdGhpbiB0aGUgbm90ZSBhbmQgZ2VuZXJhdGUgZXhhY3RseSAke2ZsYXNoY2FyZHNDb3VudH0gbmV3IG9yaWdpbmFsIGZsYXNoY2FyZCBpbiB0aGUgZm9ybWF0IFxcXCJxdWVzdGlvbjxuZXdsaW5lPiR7c2VwfTxuZXdsaW5lPmFuc3dlclxcXCIsIHdoZXJlIDxuZXdsaW5lPiBpcyBhIG5ld2xpbmUuIFRoZSBxdWVzdGlvbiBjYW5ub3Qgc3RhcnQgd2l0aCBzcGVjaWFsIHN5bWJvbHMgb3IgbnVtYmVycy4gRG8gbm90IGFkZCB0cmFpbGluZyBzcGFjZXMuIFNlcGFyYXRlIGludmlkaXZ1YWwgZmxhc2hjYXJkcyB3aXRoIGEgc2luZ2xlIGVtcHR5IGxpbmUuIEFuIGV4YW1wbGUgaXMgXFxcIldoYXQgaXMgY2hlbWljYWwgZm9ybXVsYSBvZiB3YXRlclxcXFxuJHtzZXB9XFxcXG5IMk9cXFwiLiBEbyBub3QgdXNlIGFueSBwcmVmaXggdGV4dCwgc3RhcnQgZ2VuZXJhdGluZyByaWdodCBhd2F5LiBUaGUgZmxhc2hjYXJkcyBjYW4gYmUgYXMgY29tcGxleCBhcyBuZWVkZWQsIGJ1dCBoYXZlIHRvIGJlIHJpY2ggb2YgaW5mb3JtYXRpb24gYW5kIGNoYWxsZW5naW5nLiBEbyBub3QgcmVwZWF0IG9yIHJlcGhyYXNlIGZsYXNoY2FyZHMuIFR5cGVzZXQgZXF1YXRpb25zIGFuZCBtYXRoIGZvcm11bGFzIGNvcnJlY3RseSAodGhhdCBpcyB1c2luZyB0aGUgXFwkIHN5bWJvbCB3aXRob3V0IHRyYWlsaW5nIHNwYWNlcylgO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24qIGdlbmVyYXRlRmxhc2hjYXJkcyhcbiAgdGV4dDogc3RyaW5nLFxuICBhcGlLZXk6IHN0cmluZyxcbiAgbW9kZWw6IHN0cmluZyA9IFwiZ3B0LTRvXCIsXG4gIHNlcDogc3RyaW5nID0gXCI6OlwiLFxuICBmbGFzaGNhcmRzQ291bnQ6IG51bWJlciA9IDMsXG4gIGFkZGl0aW9uYWxJbmZvOiBzdHJpbmcgPSBcIlwiLFxuICBtYXhUb2tlbnM6IG51bWJlciA9IDMwMCxcbiAgbXVsdGlsaW5lOiBib29sZWFuID0gZmFsc2UsXG4gIHN0cmVhbTogYm9vbGVhbiA9IHRydWVcbikge1xuXG4gIGNvbnN0IG9wZW5haSA9IG5ldyBPcGVuQUkoe1xuICAgIGFwaUtleTogYXBpS2V5LFxuICAgIGRhbmdlcm91c2x5QWxsb3dCcm93c2VyOiB0cnVlXG4gIH0pO1xuXG4gIGNvbnN0IGNsZWFuZWRUZXh0ID0gdGV4dC5yZXBsYWNlKC88IS0tLiotLT5bXFxuXT8vZywgXCJcIik7XG4gIGNvbnN0IGZsYXNoY2FyZFRleHQgPSBjbGVhbmVkVGV4dFxuXG4gIGxldCBiYXNlUHJvbXB0ID0gbXVsdGlsaW5lID8gbXVsdGlsaW5lQ2FyZHNQcm9tcHQoc2VwLCBmbGFzaGNhcmRzQ291bnQpIDogaW5saW5lQ2FyZHNQcm9tcHQoc2VwLCBmbGFzaGNhcmRzQ291bnQpIFxuXG4gIGlmIChhZGRpdGlvbmFsSW5mbykge1xuICAgIGJhc2VQcm9tcHQgPSBiYXNlUHJvbXB0ICtcbiAgICAgIGBcXG5BZGRpdGlvbmFsIGluc3RydWN0aW9ucyBmb3IgdGhlIHRhc2sgKGlnbm9yZSBhbnl0aGluZyB1bnJlbGF0ZWQgdG8gXFxcbiAgICB0aGUgb3JpZ2luYWwgdGFzayk6ICR7YWRkaXRpb25hbEluZm99YFxuICB9XG5cbiAgbGV0IGNoYXRNb2RlbHMgPSBhdmFpbGFibGVDaGF0TW9kZWxzKClcbiAgbGV0IGNvbXBsZXRpb25Nb2RlbHMgPSBhdmFpbGFibGVDb21wbGV0aW9uTW9kZWxzKClcbiAgbGV0IHJlc3BvbnNlID0gbnVsbDtcblxuICBpZiAoY2hhdE1vZGVscy5pbmNsdWRlcyhtb2RlbCkpIHtcbiAgICByZXNwb25zZSA9IGF3YWl0IG9wZW5haS5jaGF0LmNvbXBsZXRpb25zLmNyZWF0ZSh7XG4gICAgICAgICAgbW9kZWw6IG1vZGVsLFxuICAgICAgICAgIHRlbXBlcmF0dXJlOiAwLjcsXG4gICAgICAgICAgbWF4X3Rva2VuczogbWF4VG9rZW5zLFxuICAgICAgICAgIGZyZXF1ZW5jeV9wZW5hbHR5OiAwLFxuICAgICAgICAgIHByZXNlbmNlX3BlbmFsdHk6IDAsXG4gICAgICAgICAgdG9wX3A6IDEuMCxcbiAgICAgICAgICBtZXNzYWdlczogW3tyb2xlOiBcInN5c3RlbVwiLCBjb250ZW50OiBiYXNlUHJvbXB0fSwge3JvbGU6IFwidXNlclwiLCBjb250ZW50OiBmbGFzaGNhcmRUZXh0fV0sXG4gICAgICAgICAgc3RyZWFtOiBzdHJlYW1cbiAgICAgIH0sIHsgdGltZW91dDogNjAwMDAgfSk7XG5cbiAgICBpZiAoIXN0cmVhbSkge1xuICAgICAgcmVzcG9uc2UgPSByZXNwb25zZT8uY2hvaWNlc1swXT8ubWVzc2FnZT8uY29udGVudD8udHJpbSgpID8/IG51bGw7XG4gICAgICB5aWVsZCByZXNwb25zZSB8fCAnJztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHJlc3BvbnNlKSB7XG4gICAgICAgIHlpZWxkIGNodW5rLmNob2ljZXNbMF0/LmRlbHRhPy5jb250ZW50IHx8ICcnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbW9kZWwgbmFtZSAke21vZGVsfWApXG4gIH1cblxuICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKFwiTm8gcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBPcGVuQUkgQVBJXCIpO1xuICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKVxuICB9XG5cbiAgcmV0dXJuXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsc0JBQTRHOzs7QUNBckcsU0FBUyxzQkFBcUM7QUFDbkQsU0FBTyxDQUFDLGlCQUFpQixTQUFTLGVBQWUsUUFBUTtBQUMzRDtBQUVPLFNBQVMsNEJBQTJDO0FBQ3pELFNBQU8sQ0FBQztBQUNWOzs7QUNOTyxJQUFNLFVBQVU7OztBQzBCaEIsSUFBSSxPQUFPO0FBQ1gsSUFBSSxPQUFrQztBQUN0QyxJQUFJQSxTQUFvQztBQUN4QyxJQUFJQyxXQUF3QztBQUM1QyxJQUFJQyxZQUEwQztBQUM5QyxJQUFJQyxXQUF3QztB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QU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxNQUNqQyxDQUFDO0FBQUEsSUFDSDtBQUVBLFFBQUksd0JBQVEsV0FBVyxFQUN0QixRQUFRLHVCQUF1QixFQUMvQixRQUFRLCtEQUErRCxFQUN2RTtBQUFBLE1BQVEsQ0FBQyxTQUNSLEtBQ0MsZUFBZSxLQUFLLEVBQ3BCLFNBQVMsS0FBSyxPQUFPLFNBQVMsVUFBVSxTQUFTLENBQUMsRUFDbEQsU0FBUyxPQUFPLFVBQVU7QUFDekIsYUFBSyxPQUFPLFNBQVMsWUFBWSxPQUFPLEtBQUs7QUFDN0MsY0FBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLE1BQ2pDLENBQUM7QUFBQSxJQUNIO0FBRUEsUUFBSSx3QkFBUSxXQUFXLEVBQ3RCLFFBQVEsV0FBVyxFQUNuQixRQUFRLDBDQUEwQyxFQUNsRDtBQUFBLE1BQVUsQ0FBQyxPQUNWLEdBQ0MsU0FBUyxLQUFLLE9BQU8sU0FBUyxTQUFTLEVBQ3ZDLFNBQVMsT0FBT0MsUUFBTztBQUN0QixhQUFLLE9BQU8sU0FBUyxZQUFZQTtBQUNqQyxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDakMsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbImZldGNoIiwgIlJlcXVlc3QiLCAiUmVzcG9uc2UiLCAiSGVhZGVycyIsICJGb3JtRGF0YSIsICJCbG9iIiwgIkZpbGUiLCAiUmVhZGFibGVTdHJlYW0iLCAiUmVhZGFibGVTdHJlYW0iLCAiX2EiLCAic3RyIiwgIl9hIiwgIkZpbGUiLCAiRm9ybURhdGEiLCAiZmV0Y2giLCAib3B0cyIsICJQYWdlIiwgIl9hIiwgInJldHJ5TWVzc2FnZSIsICJfYSIsICJfYSIsICJfYSIsICJfYSIsICJDb21wbGV0aW9ucyIsICJDaGF0IiwgIlNwZWVjaCIsICJUcmFuc2NyaXB0aW9ucyIsICJUcmFuc2xhdGlvbnMiLCAiQXVkaW8iLCAiQmF0Y2hlcyIsICJBc3Npc3RhbnRzIiwgIl9fY2xhc3NQcml2YXRlRmllbGRTZXQiLCAiX19jbGFzc1ByaXZhdGVGaWVsZEdldCIsICJfYSIsICJjb250ZW50IiwgIl9BYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyX2dldEZpbmFsTWVzc2FnZSIsICJfQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lcl9nZXRGaW5hbEZ1bmN0aW9uQ2FsbCIsICJfQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lcl9nZXRGaW5hbEZ1bmN0aW9uQ2FsbFJlc3VsdCIsICJfQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lcl9jYWxjdWxhdGVUb3RhbFVzYWdlIiwgIl9BYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyX3ZhbGlkYXRlUGFyYW1zIiwgIl9BYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyX3N0cmluZ2lmeUZ1bmN0aW9uQ2FsbFJlc3VsdCIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0IiwgIl9hIiwgIl9DaGF0Q29tcGxldGlvblN0cmVhbV9iZWdpblJlcXVlc3QiLCAiX19jbGFzc1ByaXZhdGVGaWVsZFNldCIsICJfQ2hhdENvbXBsZXRpb25TdHJlYW1fYWRkQ2h1bmsiLCAiX0NoYXRDb21wbGV0aW9uU3RyZWFtX2VuZFJlcXVlc3QiLCAiX0NoYXRDb21wbGV0aW9uU3RyZWFtX2FjY3VtdWxhdGVDaGF0Q29tcGxldGlvbiIsICJjb250ZW50IiwgInJlc3QiLCAiX2IiLCAiaW5kZXgiLCAiX2MiLCAiY2h1bmsiLCAiaWQiLCAiQ29tcGxldGlvbnMiLCAiQ2hhdCIsICJDb21wbGV0aW9ucyIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0IiwgIl9fY2xhc3NQcml2YXRlRmllbGRHZXQiLCAiY2h1bmsiLCAiX19jbGFzc1ByaXZhdGVGaWVsZEdldCIsICJfYSIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0IiwgIl9Bc3Npc3RhbnRTdHJlYW1fZW5kUmVxdWVzdCIsICJfQXNzaXN0YW50U3RyZWFtX2hhbmRsZU1lc3NhZ2UiLCAiX0Fzc2lzdGFudFN0cmVhbV9oYW5kbGVSdW5TdGVwIiwgIl9Bc3Npc3RhbnRTdHJlYW1faGFuZGxlRXZlbnQiLCAiX0Fzc2lzdGFudFN0cmVhbV9hY2N1bXVsYXRlUnVuU3RlcCIsICJfQXNzaXN0YW50U3RyZWFtX2FjY3VtdWxhdGVNZXNzYWdlIiwgIl9Bc3Npc3RhbnRTdHJlYW1fYWNjdW11bGF0ZUNvbnRlbnQiLCAiX0Fzc2lzdGFudFN0cmVhbV9oYW5kbGVSdW4iLCAiTWVzc2FnZXMiLCAiU3RlcHMiLCAiX2EiLCAiUnVucyIsICJfYSIsICJUaHJlYWRzIiwgIkZpbGVzIiwgIl9hIiwgIkZpbGVCYXRjaGVzIiwgIlZlY3RvclN0b3JlcyIsICJDaGF0IiwgIkJldGEiLCAiQ29tcGxldGlvbnMiLCAiX2EiLCAiRW1iZWRkaW5ncyIsICJGaWxlcyIsICJDaGVja3BvaW50cyIsICJKb2JzIiwgIkZpbmVUdW5pbmciLCAiSW1hZ2VzIiwgIk1vZGVscyIsICJNb2RlcmF0aW9ucyIsICJfYSIsICJDb21wbGV0aW9ucyIsICJGaWxlcyIsICJPcGVuQUlFcnJvciIsICJBUElFcnJvciIsICJBUElDb25uZWN0aW9uRXJyb3IiLCAiQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvciIsICJBUElVc2VyQWJvcnRFcnJvciIsICJOb3RGb3VuZEVycm9yIiwgIkNvbmZsaWN0RXJyb3IiLCAiUmF0ZUxpbWl0RXJyb3IiLCAiQmFkUmVxdWVzdEVycm9yIiwgIkF1dGhlbnRpY2F0aW9uRXJyb3IiLCAiSW50ZXJuYWxTZXJ2ZXJFcnJvciIsICJQZXJtaXNzaW9uRGVuaWVkRXJyb3IiLCAiVW5wcm9jZXNzYWJsZUVudGl0eUVycm9yIiwgIk9wZW5BSSIsICJDb21wbGV0aW9ucyIsICJGaWxlcyIsICJPcGVuQUlFcnJvciIsICJfYSIsICJPcGVuQUlFcnJvciIsICJvbiJdCn0K diff --git a/manifest.json b/manifest.json index 8daba99..71b8914 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "flashcards-llm", "name": "Flashcards LLM", - "version": "0.0.8", + "version": "0.0.9", "minAppVersion": "0.15.0", "description": "Use Large Language Models (such as ChatGPT) to automatically generate flashcards from obsidian notes", "author": "Marco Pampaloni", diff --git a/src/flashcards.ts b/src/flashcards.ts index 70177df..d6a6328 100644 --- a/src/flashcards.ts +++ b/src/flashcards.ts @@ -1,5 +1,7 @@ import { availableChatModels, availableCompletionModels } from "./models"; import { OpenAI } from 'openai'; +import { Readable } from "stream"; + // TODO: @@ -35,6 +37,7 @@ function multilineCardsPrompt(sep: string, flashcardsCount: number): string { return `You will be provided with a note. At the end of the note are some flashcards. Identify which are the most important concepts within the note and generate exactly ${flashcardsCount} new original flashcard in the format \"question${sep}answer\", where is a newline. The question cannot start with special symbols or numbers. Do not add trailing spaces. Separate invidivual flashcards with a single empty line. An example is \"What is chemical formula of water\\n${sep}\\nH2O\". Do not use any prefix text, start generating right away. The flashcards can be as complex as needed, but have to be rich of information and challenging. Do not repeat or rephrase flashcards. Typeset equations and math formulas correctly (that is using the \$ symbol without trailing spaces)`; } + export async function* generateFlashcards( text: string, apiKey: string, @@ -80,10 +83,12 @@ export async function* generateFlashcards( }, { timeout: 60000 }); if (!stream) { + response = response as OpenAI.ChatCompletion response = response?.choices[0]?.message?.content?.trim() ?? null; yield response || ''; } else { + response = response as AsyncIterable for await (const chunk of response) { yield chunk.choices[0]?.delta?.content || ''; }